aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobody <nobody@localhost>2000-08-22 20:05:30 +0800
committernobody <nobody@localhost>2000-08-22 20:05:30 +0800
commitce9d5b5e12c8e0ac180f3c006ff1c12b0d14b040 (patch)
tree3b4824784cd30983db4a6ae1f38db287d5815941
parent44ae37c371e25fe05e8aee145f1d9af7130a201d (diff)
downloadgsoc2013-evolution-ce9d5b5e12c8e0ac180f3c006ff1c12b0d14b040.tar
gsoc2013-evolution-ce9d5b5e12c8e0ac180f3c006ff1c12b0d14b040.tar.gz
gsoc2013-evolution-ce9d5b5e12c8e0ac180f3c006ff1c12b0d14b040.tar.bz2
gsoc2013-evolution-ce9d5b5e12c8e0ac180f3c006ff1c12b0d14b040.tar.lz
gsoc2013-evolution-ce9d5b5e12c8e0ac180f3c006ff1c12b0d14b040.tar.xz
gsoc2013-evolution-ce9d5b5e12c8e0ac180f3c006ff1c12b0d14b040.tar.zst
gsoc2013-evolution-ce9d5b5e12c8e0ac180f3c006ff1c12b0d14b040.zip
This commit was manufactured by cvs2svn to create tagGNOMEDB_0_1_0
'GNOMEDB_0_1_0'. svn path=/tags/GNOMEDB_0_1_0/; revision=4935
-rw-r--r--.cvsignore25
-rw-r--r--AUTHORS66
-rw-r--r--COPYING340
-rw-r--r--ChangeLog5251
-rw-r--r--HACKING0
-rw-r--r--INSTALL182
-rw-r--r--MAINTAINERS1
-rw-r--r--Makefile.am49
-rw-r--r--NEWS367
-rw-r--r--README171
-rw-r--r--acconfig.h31
-rw-r--r--addressbook/.cvsignore6
-rw-r--r--addressbook/ChangeLog2135
-rw-r--r--addressbook/Makefile.am7
-rw-r--r--addressbook/backend/.cvsignore6
-rw-r--r--addressbook/backend/Makefile.am1
-rw-r--r--addressbook/backend/ebook/.cvsignore16
-rw-r--r--addressbook/backend/ebook/Makefile.am116
-rw-r--r--addressbook/backend/ebook/TODO2
-rw-r--r--addressbook/backend/ebook/e-book-listener.c587
-rw-r--r--addressbook/backend/ebook/e-book-listener.h95
-rw-r--r--addressbook/backend/ebook/e-book-types.h31
-rw-r--r--addressbook/backend/ebook/e-book-view-listener.c374
-rw-r--r--addressbook/backend/ebook/e-book-view-listener.h73
-rw-r--r--addressbook/backend/ebook/e-book-view.c300
-rw-r--r--addressbook/backend/ebook/e-book-view.h56
-rw-r--r--addressbook/backend/ebook/e-book.c1010
-rw-r--r--addressbook/backend/ebook/e-book.h123
-rw-r--r--addressbook/backend/ebook/e-card-cursor.c235
-rw-r--r--addressbook/backend/ebook/e-card-cursor.h52
-rw-r--r--addressbook/backend/ebook/e-card-pairs.h118
-rw-r--r--addressbook/backend/ebook/e-card-simple.c1208
-rw-r--r--addressbook/backend/ebook/e-card-simple.h198
-rw-r--r--addressbook/backend/ebook/e-card-types.h97
-rw-r--r--addressbook/backend/ebook/e-card.c3295
-rw-r--r--addressbook/backend/ebook/e-card.h141
-rw-r--r--addressbook/backend/ebook/load-gnomecard-addressbook.c110
-rw-r--r--addressbook/backend/ebook/load-pine-addressbook.c160
-rw-r--r--addressbook/backend/ebook/test-card.c194
-rw-r--r--addressbook/backend/ebook/test-client-list.c82
-rw-r--r--addressbook/backend/ebook/test-client.c190
-rw-r--r--addressbook/backend/idl/.cvsignore6
-rw-r--r--addressbook/backend/idl/Makefile.am6
-rw-r--r--addressbook/backend/idl/addressbook.idl133
-rw-r--r--addressbook/backend/pas/.cvsignore11
-rw-r--r--addressbook/backend/pas/Makefile.am52
-rw-r--r--addressbook/backend/pas/TODO2
-rw-r--r--addressbook/backend/pas/pas-backend-file.c1233
-rw-r--r--addressbook/backend/pas/pas-backend-file.h32
-rw-r--r--addressbook/backend/pas/pas-backend-ldap.c1151
-rw-r--r--addressbook/backend/pas/pas-backend-ldap.h32
-rw-r--r--addressbook/backend/pas/pas-backend.c162
-rw-r--r--addressbook/backend/pas/pas-backend.h73
-rw-r--r--addressbook/backend/pas/pas-book-factory.c639
-rw-r--r--addressbook/backend/pas/pas-book-factory.h50
-rw-r--r--addressbook/backend/pas/pas-book-view.c316
-rw-r--r--addressbook/backend/pas/pas-book-view.h54
-rw-r--r--addressbook/backend/pas/pas-book.c677
-rw-r--r--addressbook/backend/pas/pas-book.h98
-rw-r--r--addressbook/backend/pas/pas-card-cursor.c227
-rw-r--r--addressbook/backend/pas/pas-card-cursor.h58
-rw-r--r--addressbook/conduit/.cvsignore8
-rw-r--r--addressbook/conduit/Makefile.am73
-rw-r--r--addressbook/conduit/address-conduit-control-applet.c386
-rw-r--r--addressbook/conduit/address-conduit-control-applet.desktop12
-rw-r--r--addressbook/conduit/address-conduit.c1274
-rw-r--r--addressbook/conduit/address-conduit.h91
-rw-r--r--addressbook/conduit/address.conduit.in8
-rw-r--r--addressbook/contact-editor/.cvsignore8
-rw-r--r--addressbook/contact-editor/Makefile.am65
-rw-r--r--addressbook/contact-editor/arrow.pngbin174 -> 0 bytes
-rw-r--r--addressbook/contact-editor/briefcase.pngbin390 -> 0 bytes
-rw-r--r--addressbook/contact-editor/categories-strings.h9
-rw-r--r--addressbook/contact-editor/categories.glade190
-rw-r--r--addressbook/contact-editor/contact-editor.glade2332
-rw-r--r--addressbook/contact-editor/e-contact-editor-categories.c470
-rw-r--r--addressbook/contact-editor/e-contact-editor-categories.h83
-rw-r--r--addressbook/contact-editor/e-contact-editor-confirm-delete.glade85
-rw-r--r--addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h9
-rw-r--r--addressbook/contact-editor/e-contact-editor-fullname.c214
-rw-r--r--addressbook/contact-editor/e-contact-editor-fullname.h75
-rw-r--r--addressbook/contact-editor/e-contact-editor-strings.h41
-rw-r--r--addressbook/contact-editor/e-contact-editor.c1809
-rw-r--r--addressbook/contact-editor/e-contact-editor.h114
-rw-r--r--addressbook/contact-editor/e-contact-save-as.c77
-rw-r--r--addressbook/contact-editor/e-contact-save-as.h42
-rw-r--r--addressbook/contact-editor/email.pngbin331 -> 0 bytes
-rw-r--r--addressbook/contact-editor/fullname-strings.h25
-rw-r--r--addressbook/contact-editor/fullname.glade391
-rw-r--r--addressbook/contact-editor/head.pngbin493 -> 0 bytes
-rw-r--r--addressbook/contact-editor/netfreebusy.pngbin755 -> 0 bytes
-rw-r--r--addressbook/contact-editor/netmeeting.pngbin803 -> 0 bytes
-rw-r--r--addressbook/contact-editor/phone.pngbin506 -> 0 bytes
-rw-r--r--addressbook/contact-editor/snailmail.pngbin516 -> 0 bytes
-rw-r--r--addressbook/contact-editor/test-editor.c142
-rw-r--r--addressbook/contact-editor/web.pngbin573 -> 0 bytes
-rw-r--r--addressbook/demo/.cvsignore8
-rw-r--r--addressbook/demo/Makefile.am63
-rw-r--r--addressbook/demo/addressbook-factory.c47
-rw-r--r--addressbook/demo/addressbook-widget.c533
-rw-r--r--addressbook/demo/addressbook-widget.h52
-rw-r--r--addressbook/demo/addressbook.c200
-rw-r--r--addressbook/demo/addressbook.gnorba11
-rw-r--r--addressbook/demo/addressbook.h8
-rw-r--r--addressbook/demo/demo.c462
-rw-r--r--addressbook/demo/e-test-model.c385
-rw-r--r--addressbook/demo/e-test-model.h64
-rw-r--r--addressbook/demo/spec12
-rw-r--r--addressbook/ename/.cvsignore8
-rw-r--r--addressbook/ename/Makefile.am50
-rw-r--r--addressbook/ename/TODO2
-rw-r--r--addressbook/ename/e-name-western-tables.h54
-rw-r--r--addressbook/ename/e-name-western.c868
-rw-r--r--addressbook/ename/e-name-western.h21
-rw-r--r--addressbook/ename/test-ename-western-gtk.c148
-rw-r--r--addressbook/ename/test-ename-western.c70
-rw-r--r--addressbook/gui/.cvsignore6
-rw-r--r--addressbook/gui/Makefile.am1
-rw-r--r--addressbook/gui/component/.cvsignore10
-rw-r--r--addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in88
-rw-r--r--addressbook/gui/component/GNOME_Evolution_Addressbook.oafinfo88
-rw-r--r--addressbook/gui/component/Makefile.am91
-rw-r--r--addressbook/gui/component/addressbook-component.c129
-rw-r--r--addressbook/gui/component/addressbook-component.h29
-rw-r--r--addressbook/gui/component/addressbook-factory.c88
-rw-r--r--addressbook/gui/component/addressbook.c1144
-rw-r--r--addressbook/gui/component/addressbook.gnorba23
-rw-r--r--addressbook/gui/component/addressbook.h9
-rw-r--r--addressbook/gui/component/addressbook.oafinfo88
-rw-r--r--addressbook/gui/component/alphabet.glade357
-rw-r--r--addressbook/gui/component/alphabet.glade.h34
-rw-r--r--addressbook/gui/component/e-addressbook-model.c421
-rw-r--r--addressbook/gui/component/e-addressbook-model.h54
-rw-r--r--addressbook/gui/component/e-cardlist-model.c226
-rw-r--r--addressbook/gui/component/e-cardlist-model.h42
-rw-r--r--addressbook/gui/component/e-ldap-server-dialog.c142
-rw-r--r--addressbook/gui/component/e-ldap-server-dialog.h9
-rw-r--r--addressbook/gui/component/e-ldap-storage.c314
-rw-r--r--addressbook/gui/component/e-ldap-storage.h44
-rw-r--r--addressbook/gui/component/ldap-server-dialog.glade400
-rw-r--r--addressbook/gui/component/ldap-server-dialog.glade.h11
-rw-r--r--addressbook/gui/component/select-names/.cvsignore11
-rw-r--r--addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl37
-rw-r--r--addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oaf.in29
-rw-r--r--addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oafinfo29
-rw-r--r--addressbook/gui/component/select-names/Makefile.am73
-rw-r--r--addressbook/gui/component/select-names/e-select-names-bonobo.c294
-rw-r--r--addressbook/gui/component/select-names/e-select-names-bonobo.h71
-rw-r--r--addressbook/gui/component/select-names/e-select-names-factory.c60
-rw-r--r--addressbook/gui/component/select-names/e-select-names-factory.h31
-rw-r--r--addressbook/gui/component/select-names/e-select-names-manager.c349
-rw-r--r--addressbook/gui/component/select-names/e-select-names-manager.h53
-rw-r--r--addressbook/gui/component/select-names/e-select-names-model.c441
-rw-r--r--addressbook/gui/component/select-names/e-select-names-model.h93
-rw-r--r--addressbook/gui/component/select-names/e-select-names-table-model.c353
-rw-r--r--addressbook/gui/component/select-names/e-select-names-table-model.h51
-rw-r--r--addressbook/gui/component/select-names/e-select-names-text-model.c357
-rw-r--r--addressbook/gui/component/select-names/e-select-names-text-model.h44
-rw-r--r--addressbook/gui/component/select-names/e-select-names.c424
-rw-r--r--addressbook/gui/component/select-names/e-select-names.h91
-rw-r--r--addressbook/gui/component/select-names/evolution-addressbook-select-names.oafinfo29
-rw-r--r--addressbook/gui/component/select-names/recipient.glade61
-rw-r--r--addressbook/gui/component/select-names/select-names.glade247
-rw-r--r--addressbook/gui/component/select-names/select-names.glade.h10
-rw-r--r--addressbook/gui/contact-editor/.cvsignore8
-rw-r--r--addressbook/gui/contact-editor/Makefile.am65
-rw-r--r--addressbook/gui/contact-editor/arrow.pngbin174 -> 0 bytes
-rw-r--r--addressbook/gui/contact-editor/briefcase.pngbin390 -> 0 bytes
-rw-r--r--addressbook/gui/contact-editor/categories-strings.h9
-rw-r--r--addressbook/gui/contact-editor/categories.glade190
-rw-r--r--addressbook/gui/contact-editor/contact-editor.glade2332
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-categories.c470
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-categories.h83
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-confirm-delete.glade85
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-confirm-delete.glade.h9
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-fullname.c214
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-fullname.h75
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-strings.h41
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor.c1809
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor.h114
-rw-r--r--addressbook/gui/contact-editor/e-contact-save-as.c77
-rw-r--r--addressbook/gui/contact-editor/e-contact-save-as.h42
-rw-r--r--addressbook/gui/contact-editor/email.pngbin331 -> 0 bytes
-rw-r--r--addressbook/gui/contact-editor/fullname-strings.h25
-rw-r--r--addressbook/gui/contact-editor/fullname.glade391
-rw-r--r--addressbook/gui/contact-editor/head.pngbin493 -> 0 bytes
-rw-r--r--addressbook/gui/contact-editor/netfreebusy.pngbin755 -> 0 bytes
-rw-r--r--addressbook/gui/contact-editor/netmeeting.pngbin803 -> 0 bytes
-rw-r--r--addressbook/gui/contact-editor/phone.pngbin506 -> 0 bytes
-rw-r--r--addressbook/gui/contact-editor/snailmail.pngbin516 -> 0 bytes
-rw-r--r--addressbook/gui/contact-editor/test-editor.c142
-rw-r--r--addressbook/gui/contact-editor/web.pngbin573 -> 0 bytes
-rw-r--r--addressbook/gui/minicard/.cvsignore12
-rw-r--r--addressbook/gui/minicard/Makefile.am124
-rw-r--r--addressbook/gui/minicard/e-minicard-control.c336
-rw-r--r--addressbook/gui/minicard/e-minicard-control.gnorba24
-rw-r--r--addressbook/gui/minicard/e-minicard-control.h8
-rw-r--r--addressbook/gui/minicard/e-minicard-label.c446
-rw-r--r--addressbook/gui/minicard/e-minicard-label.h83
-rw-r--r--addressbook/gui/minicard/e-minicard-view-widget.c267
-rw-r--r--addressbook/gui/minicard/e-minicard-view-widget.h73
-rw-r--r--addressbook/gui/minicard/e-minicard-view.c432
-rw-r--r--addressbook/gui/minicard/e-minicard-view.h95
-rw-r--r--addressbook/gui/minicard/e-minicard-widget-test.c113
-rw-r--r--addressbook/gui/minicard/e-minicard-widget.c236
-rw-r--r--addressbook/gui/minicard/e-minicard-widget.h76
-rw-r--r--addressbook/gui/minicard/e-minicard.c797
-rw-r--r--addressbook/gui/minicard/e-minicard.h98
-rw-r--r--addressbook/gui/minicard/e-reflow-sorted.c272
-rw-r--r--addressbook/gui/minicard/e-reflow-sorted.h90
-rw-r--r--addressbook/gui/minicard/e-reflow.c859
-rw-r--r--addressbook/gui/minicard/e-reflow.h112
-rw-r--r--addressbook/gui/minicard/test-minicard-label.c126
-rw-r--r--addressbook/gui/minicard/test-minicard-view.c206
-rw-r--r--addressbook/gui/minicard/test-minicard.c115
-rw-r--r--addressbook/gui/minicard/test-reflow.c194
-rw-r--r--addressbook/gui/search/.cvsignore7
-rw-r--r--addressbook/gui/search/Makefile.am16
-rw-r--r--addressbook/gui/search/addresstypes.xml37
-rw-r--r--addressbook/gui/search/e-addressbook-search-dialog.c192
-rw-r--r--addressbook/gui/search/e-addressbook-search-dialog.h64
-rw-r--r--addressbook/gui/widgets/Makefile.am124
-rw-r--r--addressbook/gui/widgets/alphabet.glade357
-rw-r--r--addressbook/gui/widgets/alphabet.glade.h34
-rw-r--r--addressbook/gui/widgets/e-addressbook-model.c421
-rw-r--r--addressbook/gui/widgets/e-addressbook-model.h54
-rw-r--r--addressbook/gui/widgets/e-minicard-control.c336
-rw-r--r--addressbook/gui/widgets/e-minicard-control.h8
-rw-r--r--addressbook/gui/widgets/e-minicard-label.c446
-rw-r--r--addressbook/gui/widgets/e-minicard-label.h83
-rw-r--r--addressbook/gui/widgets/e-minicard-view-widget.c267
-rw-r--r--addressbook/gui/widgets/e-minicard-view-widget.h73
-rw-r--r--addressbook/gui/widgets/e-minicard-view.c432
-rw-r--r--addressbook/gui/widgets/e-minicard-view.h95
-rw-r--r--addressbook/gui/widgets/e-minicard-widget-test.c113
-rw-r--r--addressbook/gui/widgets/e-minicard-widget.c236
-rw-r--r--addressbook/gui/widgets/e-minicard-widget.h76
-rw-r--r--addressbook/gui/widgets/e-minicard.c797
-rw-r--r--addressbook/gui/widgets/e-minicard.h98
-rw-r--r--addressbook/gui/widgets/test-minicard-label.c126
-rw-r--r--addressbook/gui/widgets/test-minicard-view.c206
-rw-r--r--addressbook/gui/widgets/test-minicard.c115
-rw-r--r--addressbook/gui/widgets/test-reflow.c194
-rw-r--r--addressbook/printing/.cvsignore9
-rw-r--r--addressbook/printing/Makefile.am67
-rw-r--r--addressbook/printing/e-contact-print-style-editor.c150
-rw-r--r--addressbook/printing/e-contact-print-style-editor.h74
-rw-r--r--addressbook/printing/e-contact-print-types.h74
-rw-r--r--addressbook/printing/e-contact-print.c1112
-rw-r--r--addressbook/printing/e-contact-print.glade2009
-rw-r--r--addressbook/printing/e-contact-print.glade.h56
-rw-r--r--addressbook/printing/e-contact-print.h33
-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.c87
-rw-r--r--addressbook/printing/test-print.c82
-rw-r--r--announcement-0.4.1.txt167
-rw-r--r--art/.cvsignore2
-rw-r--r--art/Makefile.am34
-rw-r--r--art/attachment.xpm21
-rw-r--r--art/briefcase.pngbin2358 -> 0 bytes
-rw-r--r--art/cellphone.pngbin3440 -> 0 bytes
-rw-r--r--art/empty.xpm21
-rw-r--r--art/envelope.pngbin3168 -> 0 bytes
-rw-r--r--art/evolution-calendar-mini.pngbin491 -> 0 bytes
-rw-r--r--art/evolution-calendar.pngbin2733 -> 0 bytes
-rw-r--r--art/evolution-contacts-mini.pngbin417 -> 0 bytes
-rw-r--r--art/evolution-contacts.pngbin2288 -> 0 bytes
-rw-r--r--art/evolution-inbox-mini.pngbin478 -> 0 bytes
-rw-r--r--art/evolution-inbox.pngbin4281 -> 0 bytes
-rw-r--r--art/evolution-notes-mini.pngbin516 -> 0 bytes
-rw-r--r--art/evolution-notes.pngbin3400 -> 0 bytes
-rw-r--r--art/evolution-tasks-mini.pngbin708 -> 0 bytes
-rw-r--r--art/evolution-tasks.pngbin3515 -> 0 bytes
-rw-r--r--art/evolution-today.pngbin3713 -> 0 bytes
-rw-r--r--art/globe.pngbin3328 -> 0 bytes
-rw-r--r--art/house.pngbin4135 -> 0 bytes
-rw-r--r--art/mail-new.xpm67
-rw-r--r--art/mail-read.xpm70
-rw-r--r--art/mail-replied.xpm52
-rw-r--r--art/malehead.pngbin4220 -> 0 bytes
-rw-r--r--art/mark.xpm21
-rw-r--r--art/meeting.xpm64
-rw-r--r--art/priority-high.xpm21
-rw-r--r--art/priority-low.xpm21
-rw-r--r--art/tree-expanded.xpm22
-rw-r--r--art/tree-unexpanded.xpm22
-rwxr-xr-xautogen.sh10
-rw-r--r--calendar/.cvsignore10
-rw-r--r--calendar/AUTHORS4
-rw-r--r--calendar/ChangeLog5513
-rw-r--r--calendar/Makefile.am2
-rw-r--r--calendar/TODO88
-rw-r--r--calendar/cal-client/.cvsignore17
-rw-r--r--calendar/cal-client/Makefile.am71
-rw-r--r--calendar/cal-client/cal-client.c1396
-rw-r--r--calendar/cal-client/cal-client.h122
-rw-r--r--calendar/cal-client/cal-listener.c403
-rw-r--r--calendar/cal-client/cal-listener.h79
-rw-r--r--calendar/cal-client/client-test.c243
-rw-r--r--calendar/cal-client/test.ics318
-rw-r--r--calendar/cal-util/.cvsignore8
-rw-r--r--calendar/cal-util/Makefile.am73
-rw-r--r--calendar/cal-util/cal-component.c3480
-rw-r--r--calendar/cal-util/cal-component.h306
-rw-r--r--calendar/cal-util/cal-recur.c3054
-rw-r--r--calendar/cal-util/cal-recur.h117
-rw-r--r--calendar/cal-util/cal-util.c100
-rw-r--r--calendar/cal-util/cal-util.h68
-rw-r--r--calendar/cal-util/calobj.c2008
-rw-r--r--calendar/cal-util/calobj.h312
-rw-r--r--calendar/cal-util/icalendar-save.c516
-rw-r--r--calendar/cal-util/icalendar-save.h13
-rw-r--r--calendar/cal-util/icalendar-test.c146
-rw-r--r--calendar/cal-util/icalendar.c673
-rw-r--r--calendar/cal-util/icalendar.h13
-rw-r--r--calendar/cal-util/test-recur.c337
-rw-r--r--calendar/cal-util/timeutil.c590
-rw-r--r--calendar/cal-util/timeutil.h82
-rw-r--r--calendar/conduits/.cvsignore2
-rw-r--r--calendar/conduits/Makefile.am1
-rw-r--r--calendar/conduits/calendar/.cvsignore8
-rw-r--r--calendar/conduits/calendar/Makefile.am81
-rw-r--r--calendar/conduits/calendar/calendar-conduit-control-applet.c387
-rw-r--r--calendar/conduits/calendar/calendar-conduit-control-applet.desktop13
-rw-r--r--calendar/conduits/calendar/calendar-conduit.c1727
-rw-r--r--calendar/conduits/calendar/calendar-conduit.h88
-rw-r--r--calendar/conduits/calendar/calendar.conduit.in8
-rw-r--r--calendar/conduits/todo/.cvsignore8
-rw-r--r--calendar/conduits/todo/Makefile.am81
-rw-r--r--calendar/conduits/todo/todo-conduit-control-applet.c386
-rw-r--r--calendar/conduits/todo/todo-conduit-control-applet.desktop12
-rw-r--r--calendar/conduits/todo/todo-conduit.c1355
-rw-r--r--calendar/conduits/todo/todo-conduit.h93
-rw-r--r--calendar/conduits/todo/todo.conduit.in8
-rw-r--r--calendar/gui/.cvsignore21
-rw-r--r--calendar/gui/GNOME_Evolution_Calendar.oaf.in29
-rw-r--r--calendar/gui/GNOME_Evolution_Calendar.oafinfo29
-rw-r--r--calendar/gui/GNOME_Evolution_Calendar_Control.oaf.in28
-rw-r--r--calendar/gui/GNOME_Evolution_Calendar_Control.oafinfo28
-rw-r--r--calendar/gui/GNOME_Evolution_Calendar_gnomecal.oaf.in29
-rw-r--r--calendar/gui/GNOME_Evolution_Calendar_gnomecal.oafinfo29
-rw-r--r--calendar/gui/Makefile.am143
-rw-r--r--calendar/gui/alarm-notify/alarm-notify-dialog.c225
-rw-r--r--calendar/gui/alarm-notify/alarm-notify-dialog.h44
-rw-r--r--calendar/gui/alarm-notify/alarm-notify.glade230
-rw-r--r--calendar/gui/alarm-notify/alarm.c304
-rw-r--r--calendar/gui/alarm-notify/alarm.h40
-rw-r--r--calendar/gui/alarm.c304
-rw-r--r--calendar/gui/alarm.h40
-rw-r--r--calendar/gui/bell.xpm83
-rw-r--r--calendar/gui/calendar-commands.c855
-rw-r--r--calendar/gui/calendar-commands.h125
-rw-r--r--calendar/gui/calendar-component.c119
-rw-r--r--calendar/gui/calendar-component.h29
-rw-r--r--calendar/gui/calendar-control.gnorba11
-rw-r--r--calendar/gui/calendar-control.oafinfo28
-rw-r--r--calendar/gui/calendar-model.c1782
-rw-r--r--calendar/gui/calendar-model.h75
-rw-r--r--calendar/gui/component-factory.c119
-rw-r--r--calendar/gui/component-factory.h29
-rw-r--r--calendar/gui/control-factory.c188
-rw-r--r--calendar/gui/control-factory.h30
-rw-r--r--calendar/gui/dayview.xpm42
-rw-r--r--calendar/gui/dialogs/.cvsignore3
-rw-r--r--calendar/gui/dialogs/Makefile.am31
-rw-r--r--calendar/gui/dialogs/alarm-notify-dialog.c225
-rw-r--r--calendar/gui/dialogs/alarm-notify-dialog.h44
-rw-r--r--calendar/gui/dialogs/alarm-notify.glade230
-rw-r--r--calendar/gui/dialogs/alarm-notify.glade.h10
-rw-r--r--calendar/gui/dialogs/task-editor-dialog.glade822
-rw-r--r--calendar/gui/dialogs/task-editor-dialog.glade.h33
-rw-r--r--calendar/gui/dialogs/task-editor.c481
-rw-r--r--calendar/gui/dialogs/task-editor.h63
-rw-r--r--calendar/gui/dialogs/task-page.glade822
-rw-r--r--calendar/gui/e-calendar-table.c482
-rw-r--r--calendar/gui/e-calendar-table.h84
-rw-r--r--calendar/gui/e-day-view-main-item.c651
-rw-r--r--calendar/gui/e-day-view-main-item.h65
-rw-r--r--calendar/gui/e-day-view-time-item.c531
-rw-r--r--calendar/gui/e-day-view-time-item.h74
-rw-r--r--calendar/gui/e-day-view-top-item.c586
-rw-r--r--calendar/gui/e-day-view-top-item.h65
-rw-r--r--calendar/gui/e-day-view.c5716
-rw-r--r--calendar/gui/e-day-view.h504
-rw-r--r--calendar/gui/e-week-view-event-item.c753
-rw-r--r--calendar/gui/e-week-view-event-item.h70
-rw-r--r--calendar/gui/e-week-view-main-item.c367
-rw-r--r--calendar/gui/e-week-view-main-item.h66
-rw-r--r--calendar/gui/e-week-view-titles-item.c300
-rw-r--r--calendar/gui/e-week-view-titles-item.h66
-rw-r--r--calendar/gui/e-week-view.c2925
-rw-r--r--calendar/gui/e-week-view.h380
-rw-r--r--calendar/gui/event-editor-dialog.glade2024
-rw-r--r--calendar/gui/event-editor-dialog.glade.h94
-rw-r--r--calendar/gui/event-editor.c1985
-rw-r--r--calendar/gui/event-editor.h85
-rw-r--r--calendar/gui/evolution-calendar-control.c201
-rw-r--r--calendar/gui/evolution-calendar.gnorba11
-rw-r--r--calendar/gui/evolution-calendar.oafinfo29
-rw-r--r--calendar/gui/getdate.y1001
-rw-r--r--calendar/gui/gncal-todo.c960
-rw-r--r--calendar/gui/gncal-todo.h54
-rw-r--r--calendar/gui/gnome-cal.c1530
-rw-r--r--calendar/gui/gnome-cal.h134
-rw-r--r--calendar/gui/gnome-cal.html44
-rw-r--r--calendar/gui/gnome-calendar-conduit.pngbin3000 -> 0 bytes
-rw-r--r--calendar/gui/gnome-month-item.c1246
-rw-r--r--calendar/gui/gnome-month-item.h165
-rw-r--r--calendar/gui/gnomecal.gnorba11
-rw-r--r--calendar/gui/gnomecal.oafinfo27
-rw-r--r--calendar/gui/goto.c326
-rw-r--r--calendar/gui/jump.xpm14
-rw-r--r--calendar/gui/main.c96
-rw-r--r--calendar/gui/mark.c297
-rw-r--r--calendar/gui/mark.h75
-rw-r--r--calendar/gui/monthview.xpm46
-rw-r--r--calendar/gui/popup-menu.c41
-rw-r--r--calendar/gui/popup-menu.h25
-rw-r--r--calendar/gui/print.c1313
-rw-r--r--calendar/gui/print.h41
-rw-r--r--calendar/gui/prop.c938
-rw-r--r--calendar/gui/recur.xpm83
-rw-r--r--calendar/gui/task-assigned-to.xpm120
-rw-r--r--calendar/gui/task-assigned.xpm120
-rw-r--r--calendar/gui/task-recurring.xpm120
-rw-r--r--calendar/gui/task.xpm120
-rw-r--r--calendar/gui/test.vcf133
-rw-r--r--calendar/gui/test2.vcf133
-rw-r--r--calendar/gui/topic.dat2
-rw-r--r--calendar/gui/weekview.xpm41
-rw-r--r--calendar/gui/workweekview.xpm43
-rw-r--r--calendar/gui/yearview.xpm45
-rw-r--r--calendar/idl/.cvsignore2
-rw-r--r--calendar/idl/Makefile.am7
-rw-r--r--calendar/idl/evolution-calendar.idl181
-rw-r--r--calendar/pcs/.cvsignore12
-rw-r--r--calendar/pcs/Makefile.am42
-rw-r--r--calendar/pcs/cal-backend-file.c1056
-rw-r--r--calendar/pcs/cal-backend-file.h62
-rw-r--r--calendar/pcs/cal-backend-imc.c1421
-rw-r--r--calendar/pcs/cal-backend-imc.h61
-rw-r--r--calendar/pcs/cal-backend.c403
-rw-r--r--calendar/pcs/cal-backend.h127
-rw-r--r--calendar/pcs/cal-common.h41
-rw-r--r--calendar/pcs/cal-factory.c858
-rw-r--r--calendar/pcs/cal-factory.h75
-rw-r--r--calendar/pcs/cal.c761
-rw-r--r--calendar/pcs/cal.h70
-rw-r--r--calendar/pcs/job.c98
-rw-r--r--calendar/pcs/job.h35
-rw-r--r--camel/.cvsignore8
-rw-r--r--camel/CODING.STYLE19
-rw-r--r--camel/ChangeLog5332
-rw-r--r--camel/Makefile.am131
-rw-r--r--camel/README57
-rw-r--r--camel/README.COPYRIGHT47
-rw-r--r--camel/README.HACKING14
-rw-r--r--camel/broken-date-parser.c315
-rw-r--r--camel/broken-date-parser.h41
-rw-r--r--camel/camel-address.c133
-rw-r--r--camel/camel-address.h57
-rw-r--r--camel/camel-data-wrapper.c270
-rw-r--r--camel/camel-data-wrapper.h96
-rw-r--r--camel/camel-exception-list.def36
-rw-r--r--camel/camel-exception.c279
-rw-r--r--camel/camel-exception.h89
-rw-r--r--camel/camel-folder-search.c598
-rw-r--r--camel/camel-folder-search.h99
-rw-r--r--camel/camel-folder-summary.c1641
-rw-r--r--camel/camel-folder-summary.h238
-rw-r--r--camel/camel-folder.c1268
-rw-r--r--camel/camel-folder.h315
-rw-r--r--camel/camel-internet-address.c277
-rw-r--r--camel/camel-internet-address.h51
-rw-r--r--camel/camel-medium.c266
-rw-r--r--camel/camel-medium.h92
-rw-r--r--camel/camel-mime-filter-basic.c214
-rw-r--r--camel/camel-mime-filter-basic.h58
-rw-r--r--camel/camel-mime-filter-charset.c229
-rw-r--r--camel/camel-mime-filter-charset.h52
-rw-r--r--camel/camel-mime-filter-crlf.c150
-rw-r--r--camel/camel-mime-filter-crlf.h62
-rw-r--r--camel/camel-mime-filter-from.c221
-rw-r--r--camel/camel-mime-filter-from.h49
-rw-r--r--camel/camel-mime-filter-index.c156
-rw-r--r--camel/camel-mime-filter-index.h55
-rw-r--r--camel/camel-mime-filter-save.c144
-rw-r--r--camel/camel-mime-filter-save.h50
-rw-r--r--camel/camel-mime-filter.c211
-rw-r--r--camel/camel-mime-filter.h84
-rw-r--r--camel/camel-mime-message.c532
-rw-r--r--camel/camel-mime-message.h118
-rw-r--r--camel/camel-mime-parser.c1791
-rw-r--r--camel/camel-mime-parser.h119
-rw-r--r--camel/camel-mime-part-utils.c237
-rw-r--r--camel/camel-mime-part-utils.h45
-rw-r--r--camel/camel-mime-part.c706
-rw-r--r--camel/camel-mime-part.h131
-rw-r--r--camel/camel-mime-utils.c2640
-rw-r--r--camel/camel-mime-utils.h171
-rw-r--r--camel/camel-movemail.c590
-rw-r--r--camel/camel-movemail.h45
-rw-r--r--camel/camel-multipart.c476
-rw-r--r--camel/camel-multipart.h103
-rw-r--r--camel/camel-news-address.c65
-rw-r--r--camel/camel-news-address.h45
-rw-r--r--camel/camel-object.c971
-rw-r--r--camel/camel-object.h145
-rw-r--r--camel/camel-op-queue.c166
-rw-r--r--camel/camel-op-queue.h64
-rw-r--r--camel/camel-provider.c153
-rw-r--r--camel/camel-provider.h97
-rw-r--r--camel/camel-seekable-stream.c201
-rw-r--r--camel/camel-seekable-stream.h88
-rw-r--r--camel/camel-seekable-substream.c271
-rw-r--r--camel/camel-seekable-substream.h70
-rw-r--r--camel/camel-service.c386
-rw-r--r--camel/camel-service.h142
-rw-r--r--camel/camel-session.c346
-rw-r--r--camel/camel-session.h124
-rw-r--r--camel/camel-store.c376
-rw-r--r--camel/camel-store.h115
-rw-r--r--camel/camel-stream-buffer.c453
-rw-r--r--camel/camel-stream-buffer.h109
-rw-r--r--camel/camel-stream-filter.c342
-rw-r--r--camel/camel-stream-filter.h52
-rw-r--r--camel/camel-stream-fs.c298
-rw-r--r--camel/camel-stream-fs.h75
-rw-r--r--camel/camel-stream-mem.c249
-rw-r--r--camel/camel-stream-mem.h75
-rw-r--r--camel/camel-stream.c289
-rw-r--r--camel/camel-stream.h91
-rw-r--r--camel/camel-thread-proxy.c514
-rw-r--r--camel/camel-thread-proxy.h90
-rw-r--r--camel/camel-transport.c104
-rw-r--r--camel/camel-transport.h85
-rw-r--r--camel/camel-types.h70
-rw-r--r--camel/camel-uid-cache.c186
-rw-r--r--camel/camel-uid-cache.h56
-rw-r--r--camel/camel-url.c368
-rw-r--r--camel/camel-url.h74
-rw-r--r--camel/camel.c46
-rw-r--r--camel/camel.h79
-rw-r--r--camel/devel-docs/camel_data_wrapper.diabin3062 -> 0 bytes
-rw-r--r--camel/devel-docs/camel_parser_states.diabin2505 -> 0 bytes
-rw-r--r--camel/devel-docs/camel_stream.diabin2669 -> 0 bytes
-rw-r--r--camel/gmime-content-field.c237
-rw-r--r--camel/gmime-content-field.h71
-rw-r--r--camel/gstring-util.c216
-rw-r--r--camel/gstring-util.h66
-rw-r--r--camel/hash-table-utils.c80
-rw-r--r--camel/hash-table-utils.h46
-rw-r--r--camel/md5-utils.c391
-rw-r--r--camel/md5-utils.h54
-rw-r--r--camel/providers/.cvsignore2
-rw-r--r--camel/providers/Makefile.am7
-rw-r--r--camel/providers/imap/.cvsignore7
-rw-r--r--camel/providers/imap/Makefile.am42
-rw-r--r--camel/providers/imap/camel-imap-folder.c1578
-rw-r--r--camel/providers/imap/camel-imap-folder.h77
-rw-r--r--camel/providers/imap/camel-imap-provider.c109
-rw-r--r--camel/providers/imap/camel-imap-store.c1262
-rw-r--r--camel/providers/imap/camel-imap-store.h103
-rw-r--r--camel/providers/imap/camel-imap-stream.c197
-rw-r--r--camel/providers/imap/camel-imap-stream.h71
-rw-r--r--camel/providers/imap/camel-imap-utils.c486
-rw-r--r--camel/providers/imap/camel-imap-utils.h43
-rw-r--r--camel/providers/imap/libcamelimap.urls1
-rw-r--r--camel/providers/maildir/.cvsignore6
-rw-r--r--camel/providers/maildir/Makefile.am22
-rw-r--r--camel/providers/maildir/camel-maildir-folder.c802
-rw-r--r--camel/providers/maildir/camel-maildir-folder.h66
-rw-r--r--camel/providers/maildir/camel-maildir-provider.c46
-rw-r--r--camel/providers/maildir/camel-maildir-store.c124
-rw-r--r--camel/providers/maildir/camel-maildir-store.h69
-rw-r--r--camel/providers/mbox/.cvsignore7
-rw-r--r--camel/providers/mbox/Makefile.am39
-rw-r--r--camel/providers/mbox/camel-mbox-folder.c625
-rw-r--r--camel/providers/mbox/camel-mbox-folder.h80
-rw-r--r--camel/providers/mbox/camel-mbox-provider.c57
-rw-r--r--camel/providers/mbox/camel-mbox-store.c285
-rw-r--r--camel/providers/mbox/camel-mbox-store.h68
-rw-r--r--camel/providers/mbox/camel-mbox-summary.c872
-rw-r--r--camel/providers/mbox/camel-mbox-summary.h80
-rw-r--r--camel/providers/mbox/libcamelmbox.urls1
-rw-r--r--camel/providers/mh/.cvsignore7
-rw-r--r--camel/providers/mh/Makefile.am39
-rw-r--r--camel/providers/mh/camel-mh-folder.c528
-rw-r--r--camel/providers/mh/camel-mh-folder.h72
-rw-r--r--camel/providers/mh/camel-mh-provider.c54
-rw-r--r--camel/providers/mh/camel-mh-store.c210
-rw-r--r--camel/providers/mh/camel-mh-store.h59
-rw-r--r--camel/providers/mh/camel-mh-summary.c267
-rw-r--r--camel/providers/mh/camel-mh-summary.h61
-rw-r--r--camel/providers/mh/libcamelmh.urls1
-rw-r--r--camel/providers/nntp/.cvsignore8
-rw-r--r--camel/providers/nntp/Makefile.am47
-rw-r--r--camel/providers/nntp/camel-nntp-folder.c399
-rw-r--r--camel/providers/nntp/camel-nntp-folder.h73
-rw-r--r--camel/providers/nntp/camel-nntp-newsrc.c469
-rw-r--r--camel/providers/nntp/camel-nntp-newsrc.h27
-rw-r--r--camel/providers/nntp/camel-nntp-provider.c80
-rw-r--r--camel/providers/nntp/camel-nntp-store.c513
-rw-r--r--camel/providers/nntp/camel-nntp-store.h87
-rw-r--r--camel/providers/nntp/camel-nntp-utils.c218
-rw-r--r--camel/providers/nntp/camel-nntp-utils.h42
-rw-r--r--camel/providers/nntp/libcamelnntp.urls2
-rw-r--r--camel/providers/nntp/test-newsrc.c10
-rw-r--r--camel/providers/pop3/.cvsignore6
-rw-r--r--camel/providers/pop3/Makefile.am33
-rw-r--r--camel/providers/pop3/camel-pop3-folder.c331
-rw-r--r--camel/providers/pop3/camel-pop3-folder.h72
-rw-r--r--camel/providers/pop3/camel-pop3-provider.c58
-rw-r--r--camel/providers/pop3/camel-pop3-store.c750
-rw-r--r--camel/providers/pop3/camel-pop3-store.h81
-rw-r--r--camel/providers/pop3/libcamelpop3.urls1
-rw-r--r--camel/providers/sendmail/.cvsignore7
-rw-r--r--camel/providers/sendmail/Makefile.am29
-rw-r--r--camel/providers/sendmail/camel-sendmail-provider.c60
-rw-r--r--camel/providers/sendmail/camel-sendmail-transport.c221
-rw-r--r--camel/providers/sendmail/camel-sendmail-transport.h64
-rw-r--r--camel/providers/sendmail/libcamelsendmail.urls1
-rw-r--r--camel/providers/smtp/.cvsignore6
-rw-r--r--camel/providers/smtp/Makefile.am30
-rw-r--r--camel/providers/smtp/camel-smtp-provider.c59
-rw-r--r--camel/providers/smtp/camel-smtp-transport.c803
-rw-r--r--camel/providers/smtp/camel-smtp-transport.h81
-rw-r--r--camel/providers/smtp/libcamelsmtp.urls1
-rw-r--r--camel/providers/vee/.cvsignore7
-rw-r--r--camel/providers/vee/Makefile.am37
-rw-r--r--camel/providers/vee/camel-vee-folder.c529
-rw-r--r--camel/providers/vee/camel-vee-folder.h57
-rw-r--r--camel/providers/vee/camel-vee-provider.c52
-rw-r--r--camel/providers/vee/camel-vee-store.c107
-rw-r--r--camel/providers/vee/camel-vee-store.h47
-rw-r--r--camel/providers/vee/libcamelvee.urls1
-rw-r--r--camel/string-utils.c206
-rw-r--r--camel/string-utils.h68
-rw-r--r--composer/.cvsignore12
-rw-r--r--composer/ChangeLog580
-rw-r--r--composer/Makefile.am69
-rw-r--r--composer/e-msg-composer-address-dialog.c656
-rw-r--r--composer/e-msg-composer-address-dialog.glade576
-rw-r--r--composer/e-msg-composer-address-dialog.glade.h19
-rw-r--r--composer/e-msg-composer-address-dialog.h75
-rw-r--r--composer/e-msg-composer-address-entry.c175
-rw-r--r--composer/e-msg-composer-address-entry.h63
-rw-r--r--composer/e-msg-composer-attachment-bar.c653
-rw-r--r--composer/e-msg-composer-attachment-bar.h75
-rw-r--r--composer/e-msg-composer-attachment.c399
-rw-r--r--composer/e-msg-composer-attachment.glade258
-rw-r--r--composer/e-msg-composer-attachment.glade.h10
-rw-r--r--composer/e-msg-composer-attachment.h72
-rw-r--r--composer/e-msg-composer-hdrs.c709
-rw-r--r--composer/e-msg-composer-hdrs.h92
-rw-r--r--composer/e-msg-composer-select-file.c171
-rw-r--r--composer/e-msg-composer-select-file.h32
-rw-r--r--composer/e-msg-composer.c1756
-rw-r--r--composer/e-msg-composer.h118
-rw-r--r--composer/main.c76
-rw-r--r--configure.in612
-rw-r--r--data/.cvsignore2
-rw-r--r--data/Makefile.am6
-rw-r--r--data/evolution.desktop20
-rw-r--r--data/evolution.keys7
-rw-r--r--default_user/.cvsignore2
-rw-r--r--default_user/ChangeLog69
-rw-r--r--default_user/Makefile.am9
-rw-r--r--default_user/ldapservers.xml19
-rw-r--r--default_user/local/.cvsignore2
-rw-r--r--default_user/local/Calendar/.cvsignore2
-rw-r--r--default_user/local/Calendar/Makefile.am3
-rw-r--r--default_user/local/Calendar/folder-metadata.xml5
-rw-r--r--default_user/local/Contacts/.cvsignore2
-rw-r--r--default_user/local/Contacts/Makefile.am4
-rw-r--r--default_user/local/Contacts/folder-metadata.xml5
-rw-r--r--default_user/local/Drafts/.cvsignore2
-rw-r--r--default_user/local/Drafts/Makefile.am4
-rw-r--r--default_user/local/Drafts/folder-metadata.xml5
-rw-r--r--default_user/local/Inbox/.cvsignore2
-rw-r--r--default_user/local/Inbox/Makefile.am7
-rw-r--r--default_user/local/Inbox/folder-metadata.xml5
-rw-r--r--default_user/local/Inbox/mbox2225
-rw-r--r--default_user/local/Makefile.am7
-rw-r--r--default_user/local/Outbox/.cvsignore2
-rw-r--r--default_user/local/Outbox/Makefile.am4
-rw-r--r--default_user/local/Outbox/folder-metadata.xml5
-rw-r--r--default_user/local/Trash/.cvsignore2
-rw-r--r--default_user/local/Trash/Makefile.am4
-rw-r--r--default_user/local/Trash/folder-metadata.xml5
-rw-r--r--default_user/shortcuts.xml17
-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/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/C/.cvsignore4
-rw-r--r--doc/C/Makefile.am51
-rw-r--r--doc/C/apx-authors.sgml74
-rw-r--r--doc/C/apx-bugs.sgml19
-rw-r--r--doc/C/apx-fdl.sgml678
-rw-r--r--doc/C/apx-gloss.sgml284
-rw-r--r--doc/C/apx-gpl.sgml414
-rw-r--r--doc/C/config-prefs.sgml570
-rw-r--r--doc/C/config-setupassist.sgml159
-rw-r--r--doc/C/config-sync.sgml67
-rw-r--r--doc/C/evolution-guide.sgml132
-rw-r--r--doc/C/fig/calendar.pngbin33576 -> 0 bytes
-rw-r--r--doc/C/fig/config-cal.pngbin13077 -> 0 bytes
-rw-r--r--doc/C/fig/config-mail.pngbin9729 -> 0 bytes
-rw-r--r--doc/C/fig/contact.pngbin28369 -> 0 bytes
-rw-r--r--doc/C/fig/filter-new-fig.pngbin11861 -> 0 bytes
-rw-r--r--doc/C/fig/mail-druid-pic.pngbin35959 -> 0 bytes
-rw-r--r--doc/C/fig/mainwindow-pic.pngbin108277 -> 0 bytes
-rw-r--r--doc/C/fig/vfolder-createrule-fig.pngbin12084 -> 0 bytes
-rw-r--r--doc/C/preface.sgml174
-rw-r--r--doc/C/usage-calendar.sgml356
-rw-r--r--doc/C/usage-contact.sgml504
-rw-r--r--doc/C/usage-mail.sgml1132
-rw-r--r--doc/C/usage-mainwindow.sgml420
-rw-r--r--doc/C/usage-notes.sgml41
-rw-r--r--doc/C/usage-sync.sgml22
-rw-r--r--doc/Camel-Classes35
-rw-r--r--doc/ChangeLog329
-rw-r--r--doc/Design201
-rw-r--r--doc/Makefile.am1
-rw-r--r--doc/devel/.cvsignore4
-rw-r--r--doc/devel/ChangeLog35
-rw-r--r--doc/devel/Makefile.am64
-rw-r--r--doc/devel/calendar/.cvsignore2
-rw-r--r--doc/devel/calendar/Makefile.am6
-rw-r--r--doc/devel/calendar/architecture.sgml94
-rw-r--r--doc/devel/calendar/cal-client/.cvsignore3
-rw-r--r--doc/devel/calendar/cal-client/Makefile.am76
-rw-r--r--doc/devel/calendar/cal-client/evolution-cal-client-decl.txt132
-rw-r--r--doc/devel/calendar/cal-client/evolution-cal-client-sections.txt37
-rw-r--r--doc/devel/calendar/cal-client/evolution-cal-client.args0
-rw-r--r--doc/devel/calendar/cal-client/evolution-cal-client.hierarchy2
-rw-r--r--doc/devel/calendar/cal-client/evolution-cal-client.signals21
-rw-r--r--doc/devel/calendar/cal-client/evolution-cal-client.types4
-rw-r--r--doc/devel/calendar/cal-client/tmpl/cal-client.sgml291
-rw-r--r--doc/devel/calendar/cal-client/tmpl/evolution-cal-client-unused.sgml10
-rw-r--r--doc/devel/calendar/cal-util/.cvsignore3
-rw-r--r--doc/devel/calendar/cal-util/Makefile.am75
-rw-r--r--doc/devel/calendar/cal-util/evolution-cal-util-decl.txt852
-rw-r--r--doc/devel/calendar/cal-util/evolution-cal-util-sections.txt166
-rw-r--r--doc/devel/calendar/cal-util/evolution-cal-util.args0
-rw-r--r--doc/devel/calendar/cal-util/evolution-cal-util.hierarchy2
-rw-r--r--doc/devel/calendar/cal-util/evolution-cal-util.signals0
-rw-r--r--doc/devel/calendar/cal-util/evolution-cal-util.types4
-rw-r--r--doc/devel/calendar/cal-util/tmpl/cal-component.sgml934
-rw-r--r--doc/devel/calendar/cal-util/tmpl/cal-recur.sgml88
-rw-r--r--doc/devel/calendar/cal-util/tmpl/cal-util.sgml62
-rw-r--r--doc/devel/calendar/cal-util/tmpl/evolution-cal-util-unused.sgml0
-rw-r--r--doc/devel/calendar/cal-util/tmpl/timeutil.sgml260
-rw-r--r--doc/devel/calendar/evolution-calendar.sgml51
-rw-r--r--doc/devel/calendar/public-reference.sgml24
-rw-r--r--doc/devel/calendar/reference.sgml24
-rw-r--r--doc/devel/evolution-devel-guide.sgml50
-rw-r--r--doc/white-papers/calendar/calendar.sgml209
-rw-r--r--doc/white-papers/mail/camel.sgml339
-rw-r--r--doc/white-papers/mail/ibex.sgml158
-rw-r--r--doc/white-papers/widgets/e-table.sgml279
-rw-r--r--e-util/.cvsignore6
-rw-r--r--e-util/ChangeLog495
-rw-r--r--e-util/Makefile.am48
-rw-r--r--e-util/e-canvas-utils.c67
-rw-r--r--e-util/e-canvas-utils.h30
-rw-r--r--e-util/e-canvas-vbox.c321
-rw-r--r--e-util/e-canvas-vbox.h86
-rw-r--r--e-util/e-canvas.c696
-rw-r--r--e-util/e-canvas.h121
-rw-r--r--e-util/e-cursors.c134
-rw-r--r--e-util/e-cursors.h33
-rw-r--r--e-util/e-dialog-widgets.c824
-rw-r--r--e-util/e-dialog-widgets.h60
-rw-r--r--e-util/e-font.c128
-rw-r--r--e-util/e-font.h64
-rw-r--r--e-util/e-gui-utils.c219
-rw-r--r--e-util/e-gui-utils.h19
-rw-r--r--e-util/e-html-utils.c274
-rw-r--r--e-util/e-html-utils.h33
-rw-r--r--e-util/e-iterator.c186
-rw-r--r--e-util/e-iterator.h69
-rw-r--r--e-util/e-list-iterator.c247
-rw-r--r--e-util/e-list-iterator.h44
-rw-r--r--e-util/e-list.c158
-rw-r--r--e-util/e-list.h61
-rw-r--r--e-util/e-popup-menu.c114
-rw-r--r--e-util/e-popup-menu.h25
-rw-r--r--e-util/e-printable.c207
-rw-r--r--e-util/e-printable.h72
-rw-r--r--e-util/e-sexp.c1163
-rw-r--r--e-util/e-sexp.h119
-rw-r--r--e-util/e-text-event-processor-emacs-like.c372
-rw-r--r--e-util/e-text-event-processor-emacs-like.h68
-rw-r--r--e-util/e-text-event-processor-types.h140
-rw-r--r--e-util/e-text-event-processor.c103
-rw-r--r--e-util/e-text-event-processor.h74
-rw-r--r--e-util/e-util.c475
-rw-r--r--e-util/e-util.c-8611475
-rw-r--r--e-util/e-util.h94
-rw-r--r--e-util/e-util.h-2900294
-rw-r--r--e-util/e-xml-utils.c104
-rw-r--r--e-util/e-xml-utils.c-56826104
-rw-r--r--e-util/e-xml-utils.h35
-rw-r--r--e-util/e-xml-utils.h-8254835
-rw-r--r--e-util/ename/.cvsignore8
-rw-r--r--e-util/ename/Makefile.am50
-rw-r--r--e-util/ename/TODO2
-rw-r--r--e-util/ename/e-name-western-tables.h54
-rw-r--r--e-util/ename/e-name-western.c868
-rw-r--r--e-util/ename/e-name-western.h21
-rw-r--r--e-util/ename/test-ename-western-gtk.c148
-rw-r--r--e-util/ename/test-ename-western.c70
-rw-r--r--evolution.desktop11
-rw-r--r--evolution.pngbin4281 -> 0 bytes
-rw-r--r--evolution.spec.in124
-rw-r--r--filter/.cvsignore9
-rw-r--r--filter/ChangeLog647
-rw-r--r--filter/Makefile.am72
-rw-r--r--filter/filter-code.c121
-rw-r--r--filter/filter-code.h53
-rw-r--r--filter/filter-colour.c220
-rw-r--r--filter/filter-colour.h55
-rw-r--r--filter/filter-context.c148
-rw-r--r--filter/filter-context.h59
-rw-r--r--filter/filter-datespec.c703
-rw-r--r--filter/filter-datespec.h64
-rw-r--r--filter/filter-driver.c636
-rw-r--r--filter/filter-driver.h71
-rw-r--r--filter/filter-editor.c389
-rw-r--r--filter/filter-editor.h61
-rw-r--r--filter/filter-element.c267
-rw-r--r--filter/filter-element.h77
-rw-r--r--filter/filter-filter.c411
-rw-r--r--filter/filter-filter.h60
-rw-r--r--filter/filter-folder.c267
-rw-r--r--filter/filter-folder.h56
-rw-r--r--filter/filter-input.c260
-rw-r--r--filter/filter-input.h59
-rw-r--r--filter/filter-option.c311
-rw-r--r--filter/filter-option.h64
-rw-r--r--filter/filter-part.c432
-rw-r--r--filter/filter-part.h75
-rw-r--r--filter/filter-rule.c574
-rw-r--r--filter/filter-rule.h99
-rw-r--r--filter/filter.glade702
-rw-r--r--filter/filtertypes.xml177
-rw-r--r--filter/rule-context.c427
-rw-r--r--filter/rule-context.h118
-rw-r--r--filter/score-context.c100
-rw-r--r--filter/score-context.h53
-rw-r--r--filter/score-editor.c313
-rw-r--r--filter/score-editor.h59
-rw-r--r--filter/score-rule.c190
-rw-r--r--filter/score-rule.h56
-rw-r--r--filter/vfolder-context.c116
-rw-r--r--filter/vfolder-context.h55
-rw-r--r--filter/vfolder-editor.c339
-rw-r--r--filter/vfolder-editor.h61
-rw-r--r--filter/vfolder-rule.c354
-rw-r--r--filter/vfolder-rule.h59
-rw-r--r--filter/vfoldertypes.xml144
-rw-r--r--help/.cvsignore2
-rw-r--r--help/C/.cvsignore4
-rw-r--r--help/C/Makefile.am51
-rw-r--r--help/C/apx-authors.sgml74
-rw-r--r--help/C/apx-bugs.sgml19
-rw-r--r--help/C/apx-fdl.sgml678
-rw-r--r--help/C/apx-gloss.sgml284
-rw-r--r--help/C/apx-gpl.sgml414
-rw-r--r--help/C/config-prefs.sgml570
-rw-r--r--help/C/config-setupassist.sgml159
-rw-r--r--help/C/config-sync.sgml67
-rw-r--r--help/C/evolution-guide.sgml132
-rw-r--r--help/C/fig/calendar.pngbin33576 -> 0 bytes
-rw-r--r--help/C/fig/config-cal.pngbin13077 -> 0 bytes
-rw-r--r--help/C/fig/config-mail.pngbin9729 -> 0 bytes
-rw-r--r--help/C/fig/contact.pngbin28369 -> 0 bytes
-rw-r--r--help/C/fig/filter-new-fig.pngbin11861 -> 0 bytes
-rw-r--r--help/C/fig/mail-druid-pic.pngbin35959 -> 0 bytes
-rw-r--r--help/C/fig/mainwindow-pic.pngbin108277 -> 0 bytes
-rw-r--r--help/C/fig/vfolder-createrule-fig.pngbin12084 -> 0 bytes
-rw-r--r--help/C/preface.sgml174
-rw-r--r--help/C/usage-calendar.sgml356
-rw-r--r--help/C/usage-contact.sgml504
-rw-r--r--help/C/usage-mail.sgml1132
-rw-r--r--help/C/usage-mainwindow.sgml420
-rw-r--r--help/C/usage-notes.sgml41
-rw-r--r--help/C/usage-sync.sgml22
-rw-r--r--help/Camel-Classes35
-rw-r--r--help/ChangeLog329
-rw-r--r--help/Design201
-rw-r--r--help/Makefile.am1
-rw-r--r--help/devel/.cvsignore4
-rw-r--r--help/devel/ChangeLog35
-rw-r--r--help/devel/Makefile.am64
-rw-r--r--help/devel/calendar/.cvsignore2
-rw-r--r--help/devel/calendar/Makefile.am6
-rw-r--r--help/devel/calendar/architecture.sgml94
-rw-r--r--help/devel/calendar/cal-client/.cvsignore3
-rw-r--r--help/devel/calendar/cal-client/Makefile.am76
-rw-r--r--help/devel/calendar/cal-client/evolution-cal-client-decl.txt132
-rw-r--r--help/devel/calendar/cal-client/evolution-cal-client-sections.txt37
-rw-r--r--help/devel/calendar/cal-client/evolution-cal-client.args0
-rw-r--r--help/devel/calendar/cal-client/evolution-cal-client.hierarchy2
-rw-r--r--help/devel/calendar/cal-client/evolution-cal-client.signals21
-rw-r--r--help/devel/calendar/cal-client/evolution-cal-client.types4
-rw-r--r--help/devel/calendar/cal-client/tmpl/cal-client.sgml291
-rw-r--r--help/devel/calendar/cal-client/tmpl/evolution-cal-client-unused.sgml10
-rw-r--r--help/devel/calendar/cal-util/.cvsignore3
-rw-r--r--help/devel/calendar/cal-util/Makefile.am75
-rw-r--r--help/devel/calendar/cal-util/evolution-cal-util-decl.txt852
-rw-r--r--help/devel/calendar/cal-util/evolution-cal-util-sections.txt166
-rw-r--r--help/devel/calendar/cal-util/evolution-cal-util.args0
-rw-r--r--help/devel/calendar/cal-util/evolution-cal-util.hierarchy2
-rw-r--r--help/devel/calendar/cal-util/evolution-cal-util.signals0
-rw-r--r--help/devel/calendar/cal-util/evolution-cal-util.types4
-rw-r--r--help/devel/calendar/cal-util/tmpl/cal-component.sgml934
-rw-r--r--help/devel/calendar/cal-util/tmpl/cal-recur.sgml88
-rw-r--r--help/devel/calendar/cal-util/tmpl/cal-util.sgml62
-rw-r--r--help/devel/calendar/cal-util/tmpl/evolution-cal-util-unused.sgml0
-rw-r--r--help/devel/calendar/cal-util/tmpl/timeutil.sgml260
-rw-r--r--help/devel/calendar/evolution-calendar.sgml51
-rw-r--r--help/devel/calendar/public-reference.sgml24
-rw-r--r--help/devel/calendar/reference.sgml24
-rw-r--r--help/devel/evolution-devel-guide.sgml50
-rw-r--r--help/white-papers/calendar/calendar.sgml209
-rw-r--r--help/white-papers/mail/camel.sgml339
-rw-r--r--help/white-papers/mail/ibex.sgml158
-rw-r--r--help/white-papers/widgets/e-table.sgml279
-rw-r--r--libibex/.cvsignore9
-rw-r--r--libibex/COPYING.LIB481
-rw-r--r--libibex/ChangeLog99
-rw-r--r--libibex/Makefile.am21
-rw-r--r--libibex/TODO61
-rw-r--r--libibex/file.c481
-rw-r--r--libibex/find.c198
-rw-r--r--libibex/ibex.h106
-rw-r--r--libibex/ibex_internal.h39
-rw-r--r--libibex/index.c154
-rw-r--r--libibex/lookup.c83
-rw-r--r--libibex/mkindex.c84
-rw-r--r--libibex/words.c269
-rw-r--r--libical/.cvsignore19
-rw-r--r--libical/AUTHORS0
-rw-r--r--libical/CHANGES222
-rw-r--r--libical/COPYING0
-rw-r--r--libical/ChangeLog27
-rw-r--r--libical/INSTALL24
-rw-r--r--libical/MacOS/errno.h185
-rw-r--r--libical/MacOS/libical.mcpbin139917 -> 0 bytes
-rw-r--r--libical/MacOS/libical.mcp.exp1
-rw-r--r--libical/MacOS/libical_prefix.h5
-rw-r--r--libical/MacOS/restrictions.make1
-rw-r--r--libical/MacOS/restrictions.script1
-rw-r--r--libical/MacOS/strdup.c17
-rw-r--r--libical/MacOS/strdup.h3
-rw-r--r--libical/Makefile.am11
-rw-r--r--libical/NEWS269
-rw-r--r--libical/README96
-rw-r--r--libical/TEST4
-rw-r--r--libical/THANKS10
-rw-r--r--libical/TODO32
-rw-r--r--libical/acconfig.h7
-rwxr-xr-xlibical/autogen.sh80
-rw-r--r--libical/configure.in52
-rw-r--r--libical/configure.scan30
-rw-r--r--libical/design-data/.cvsignore2
-rw-r--r--libical/design-data/Makefile.am10
-rw-r--r--libical/design-data/components.txt21
-rw-r--r--libical/design-data/param-c-types.txt23
-rw-r--r--libical/design-data/params-in-prop.txt55
-rw-r--r--libical/design-data/prop-to-value.txt50
-rw-r--r--libical/design-data/property-tokens.txt65
-rw-r--r--libical/design-data/restrictions.csv1348
-rw-r--r--libical/design-data/status-new.txt56
-rw-r--r--libical/design-data/status.foo104
-rw-r--r--libical/design-data/status.txt56
-rw-r--r--libical/design-data/value-c-types.txt22
-rw-r--r--libical/design-data/value-mem-semantics.txt19
-rw-r--r--libical/doc/.cvsignore2
-rw-r--r--libical/doc/Makefile.am1
-rw-r--r--libical/doc/UsingLibical.lyx2256
-rw-r--r--libical/doc/UsingLibical.ps1308
-rw-r--r--libical/doc/UsingLibical.sgml318
-rw-r--r--libical/doc/UsingLibical.txt302
-rwxr-xr-xlibical/install-sh119
-rwxr-xr-xlibical/missing190
-rw-r--r--libical/mkinstalldirs40
-rw-r--r--libical/scripts/.cvsignore2
-rw-r--r--libical/scripts/Makefile.am8
-rwxr-xr-xlibical/scripts/mkderivedcomponents.pl170
-rwxr-xr-xlibical/scripts/mkderivedparameters.pl277
-rwxr-xr-xlibical/scripts/mkderivedproperties.pl290
-rwxr-xr-xlibical/scripts/mkderivedvalues.pl307
-rwxr-xr-xlibical/scripts/mkparameterrestrictions.pl85
-rwxr-xr-xlibical/scripts/mkrestrictionrecords.pl109
-rwxr-xr-xlibical/scripts/mkrestrictiontable.pl94
-rw-r--r--libical/src/.cvsignore2
-rw-r--r--libical/src/Makefile.am1
-rw-r--r--libical/src/libical/.cvsignore14
-rw-r--r--libical/src/libical/.gdb_history457
-rw-r--r--libical/src/libical/.gdbinit3
-rw-r--r--libical/src/libical/Makefile.am96
-rw-r--r--libical/src/libical/base64.c323
-rw-r--r--libical/src/libical/filelock.c143
-rw-r--r--libical/src/libical/filelock.h57
-rw-r--r--libical/src/libical/ical.h43
-rw-r--r--libical/src/libical/icalcomponent.c782
-rw-r--r--libical/src/libical/icalcomponent.h119
-rw-r--r--libical/src/libical/icalenums.c615
-rw-r--r--libical/src/libical/icalenums.h466
-rw-r--r--libical/src/libical/icalerror.c99
-rw-r--r--libical/src/libical/icalerror.h141
-rw-r--r--libical/src/libical/icalirip.h108
-rw-r--r--libical/src/libical/icalitip.output1698
-rw-r--r--libical/src/libical/icalitip.tab.c1663
-rw-r--r--libical/src/libical/icalitip.tab.h137
-rw-r--r--libical/src/libical/icalitipl.l283
-rw-r--r--libical/src/libical/icalitipy.y434
-rw-r--r--libical/src/libical/icallexer.l286
-rw-r--r--libical/src/libical/icalmemory.c244
-rw-r--r--libical/src/libical/icalmemory.h76
-rw-r--r--libical/src/libical/icalparameter.c1913
-rw-r--r--libical/src/libical/icalparameter.h174
-rw-r--r--libical/src/libical/icalparser.c990
-rw-r--r--libical/src/libical/icalparser.h94
-rw-r--r--libical/src/libical/icalproperty.c3095
-rw-r--r--libical/src/libical/icalproperty.h368
-rw-r--r--libical/src/libical/icalrestriction.c1600
-rw-r--r--libical/src/libical/icalrestriction.h72
-rw-r--r--libical/src/libical/icaltypes.c304
-rw-r--r--libical/src/libical/icaltypes.h182
-rw-r--r--libical/src/libical/icalvalue.c2104
-rw-r--r--libical/src/libical/icalvalue.h169
-rw-r--r--libical/src/libical/icalvcal.h39
-rw-r--r--libical/src/libical/icalversion.h.in3
-rw-r--r--libical/src/libical/icalyacc.c1706
-rw-r--r--libical/src/libical/icalyacc.y480
-rw-r--r--libical/src/libical/locking.c143
-rw-r--r--libical/src/libical/pvl.c768
-rw-r--r--libical/src/libical/pvl.h104
-rw-r--r--libical/src/libical/testlocks.c70
-rw-r--r--libical/src/libicalss/.cvsignore6
-rw-r--r--libical/src/libicalss/Makefile.am25
-rw-r--r--libical/src/libicalss/icalcalendar.c268
-rw-r--r--libical/src/libicalss/icalcalendar.h68
-rw-r--r--libical/src/libicalss/icalcluster.c423
-rw-r--r--libical/src/libicalss/icalcluster.h73
-rw-r--r--libical/src/libicalss/icalcomponent.h115
-rw-r--r--libical/src/libicalss/icalstore.c858
-rw-r--r--libical/src/libicalss/icalstore.h78
-rw-r--r--libical/src/pvl/Makefile0
-rw-r--r--libical/src/test/.cvsignore12
-rw-r--r--libical/src/test/Makefile.am19
-rw-r--r--libical/src/test/Makefile.in385
-rw-r--r--libical/src/test/alice/booked/199706317
-rw-r--r--libical/src/test/alice/booked/199707701
-rw-r--r--libical/src/test/alice/booked/19970845
-rw-r--r--libical/src/test/alice/booked/19970958
-rw-r--r--libical/src/test/alice/booked/199803241
-rw-r--r--libical/src/test/alice/incoming.ics2164
-rw-r--r--libical/src/test/copycluster.c113
-rw-r--r--libical/src/test/findobj.c71
-rw-r--r--libical/src/test/icaltestparser.c124
-rw-r--r--libical/src/test/regression.c1334
-rw-r--r--libical/src/test/storage.c460
-rw-r--r--libical/src/test/stow.c533
-rw-r--r--libical/src/test/test-component.icd23
-rw-r--r--libical/src/test/usecases.c553
-rw-r--r--libical/test-data/.cvsignore2
-rw-r--r--libical/test-data/09
-rw-r--r--libical/test-data/139
-rw-r--r--libical/test-data/1.113
-rw-r--r--libical/test-data/222
-rw-r--r--libical/test-data/2445.ics321
-rw-r--r--libical/test-data/2445.vcd329
-rw-r--r--libical/test-data/2446.ics998
-rw-r--r--libical/test-data/2446.vcd1007
-rw-r--r--libical/test-data/321
-rw-r--r--libical/test-data/423
-rw-r--r--libical/test-data/516
-rw-r--r--libical/test-data/612
-rw-r--r--libical/test-data/714
-rw-r--r--libical/test-data/Makefile.am13
-rw-r--r--libical/test-data/smallcluster.ics13
-rw-r--r--libical/test-data/smallcluster.vcd18
-rw-r--r--libversit/.cvsignore9
-rw-r--r--libversit/Makefile.am15
-rw-r--r--libversit/README.TXT951
-rw-r--r--libversit/port.h88
-rw-r--r--libversit/vcaltest.c118
-rw-r--r--libversit/vcaltmp.c337
-rw-r--r--libversit/vcaltmp.h128
-rw-r--r--libversit/vcc.h80
-rw-r--r--libversit/vcc.y1257
-rw-r--r--libversit/vctest.c95
-rw-r--r--libversit/vobject.c1452
-rw-r--r--libversit/vobject.h366
-rw-r--r--mail/.cvsignore14
-rw-r--r--mail/ChangeLog3693
-rw-r--r--mail/GNOME_Evolution_Mail.oaf.in54
-rw-r--r--mail/GNOME_Evolution_Mail.oafinfo54
-rw-r--r--mail/Mail.idl30
-rw-r--r--mail/Makefile.am145
-rw-r--r--mail/README.async360
-rw-r--r--mail/component-factory.c276
-rw-r--r--mail/component-factory.h29
-rw-r--r--mail/e-attchmt.pngbin169 -> 0 bytes
-rw-r--r--mail/evolution-mail.gnorba23
-rw-r--r--mail/evolution-mail.oafinfo54
-rw-r--r--mail/folder-browser-factory.c349
-rw-r--r--mail/folder-browser-factory.h19
-rw-r--r--mail/folder-browser.c451
-rw-r--r--mail/folder-browser.h73
-rw-r--r--mail/local-config.glade220
-rw-r--r--mail/mail-autofilter.c265
-rw-r--r--mail/mail-autofilter.h21
-rw-r--r--mail/mail-callbacks.c654
-rw-r--r--mail/mail-config-druid.glade143
-rw-r--r--mail/mail-config-druid.glade.h18
-rw-r--r--mail/mail-config-gui.c2268
-rw-r--r--mail/mail-config-gui.h29
-rw-r--r--mail/mail-config.c549
-rw-r--r--mail/mail-config.glade496
-rw-r--r--mail/mail-config.glade.h28
-rw-r--r--mail/mail-config.h88
-rw-r--r--mail/mail-crypto.c529
-rw-r--r--mail/mail-display.c564
-rw-r--r--mail/mail-display.h57
-rw-r--r--mail/mail-format.c1764
-rw-r--r--mail/mail-identify.c101
-rw-r--r--mail/mail-local.c504
-rw-r--r--mail/mail-local.h37
-rw-r--r--mail/mail-ops.c1975
-rw-r--r--mail/mail-ops.h68
-rw-r--r--mail/mail-threads.c1096
-rw-r--r--mail/mail-threads.h75
-rw-r--r--mail/mail-tools.c676
-rw-r--r--mail/mail-tools.h115
-rw-r--r--mail/mail-types.h39
-rw-r--r--mail/mail-vfolder.c317
-rw-r--r--mail/mail-vfolder.h24
-rw-r--r--mail/mail-view.c243
-rw-r--r--mail/mail.h94
-rw-r--r--mail/main.c75
-rw-r--r--mail/message-list.c1267
-rw-r--r--mail/message-list.h118
-rw-r--r--mail/message-thread.c942
-rw-r--r--mail/message-thread.h23
-rw-r--r--mail/session.c215
-rw-r--r--mail/test-mail.c71
-rw-r--r--mail/test-thread.c230
-rw-r--r--notes/.cvsignore2
-rw-r--r--notes/GNOME_Evolution_Notes.oaf.in54
-rw-r--r--notes/GNOME_Evolution_Notes.oafinfo54
-rw-r--r--notes/Makefile.am46
-rw-r--r--notes/component-factory.c151
-rw-r--r--notes/component-factory.h7
-rw-r--r--notes/e-bevel-button-util.c189
-rw-r--r--notes/e-bevel-button-util.h12
-rw-r--r--notes/e-bevel-button.c175
-rw-r--r--notes/e-bevel-button.h37
-rw-r--r--notes/e-note.c381
-rw-r--r--notes/e-note.h37
-rw-r--r--notes/evolution-notes.oafinfo54
-rw-r--r--notes/main.c52
-rw-r--r--notes/test-notes.c34
-rw-r--r--po/.cvsignore12
-rw-r--r--po/ChangeLog539
-rw-r--r--po/POTFILES.ignore1
-rw-r--r--po/POTFILES.in109
-rw-r--r--po/README.tools58
-rw-r--r--po/da.po4813
-rw-r--r--po/de.po4837
-rwxr-xr-xpo/desk.pl118
-rw-r--r--po/el.po3771
-rw-r--r--po/es.po3540
-rw-r--r--po/flu-danish114
-rw-r--r--po/fr.po3501
-rwxr-xr-xpo/ga.po455
-rw-r--r--po/gl.po3334
-rw-r--r--po/hu.po3904
-rw-r--r--po/it.po3721
-rw-r--r--po/ja.po3915
-rw-r--r--po/ko.po3699
-rw-r--r--po/nl.po3770
-rw-r--r--po/no.po4627
-rw-r--r--po/pl.po3785
-rw-r--r--po/pt.po2556
-rw-r--r--po/pt_BR.po3904
-rw-r--r--po/ru.po4822
-rw-r--r--po/sl.po4025
-rw-r--r--po/sv.po3543
-rw-r--r--po/tr.po3376
-rw-r--r--po/uk.po4373
-rwxr-xr-xpo/update.pl166
-rwxr-xr-xpo/update.sh42
-rw-r--r--shell/.cvsignore11
-rw-r--r--shell/ChangeLog2040
-rw-r--r--shell/Evolution-Session.idl39
-rw-r--r--shell/Evolution-Shell.idl60
-rw-r--r--shell/Evolution-ShellComponent.idl77
-rw-r--r--shell/Evolution-ShellView.idl18
-rw-r--r--shell/Evolution-Storage.idl51
-rw-r--r--shell/Evolution.idl17
-rw-r--r--shell/Makefile.am133
-rw-r--r--shell/e-component-registry.c374
-rw-r--r--shell/e-component-registry.h79
-rw-r--r--shell/e-corba-storage-registry.c246
-rw-r--r--shell/e-corba-storage-registry.h73
-rw-r--r--shell/e-corba-storage.c354
-rw-r--r--shell/e-corba-storage.h76
-rw-r--r--shell/e-folder-type-registry.c367
-rw-r--r--shell/e-folder-type-registry.h88
-rw-r--r--shell/e-folder.c289
-rw-r--r--shell/e-folder.h93
-rw-r--r--shell/e-local-folder.c261
-rw-r--r--shell/e-local-folder.h73
-rw-r--r--shell/e-local-storage.c589
-rw-r--r--shell/e-local-storage.h69
-rw-r--r--shell/e-setup.c144
-rw-r--r--shell/e-setup.h31
-rw-r--r--shell/e-shell-constants.h36
-rw-r--r--shell/e-shell-folder-creation-dialog.c398
-rw-r--r--shell/e-shell-folder-creation-dialog.h35
-rw-r--r--shell/e-shell-folder-selection-dialog.c359
-rw-r--r--shell/e-shell-folder-selection-dialog.h79
-rw-r--r--shell/e-shell-folder-title-bar.c548
-rw-r--r--shell/e-shell-folder-title-bar.h81
-rw-r--r--shell/e-shell-utils.c107
-rw-r--r--shell/e-shell-utils.h30
-rw-r--r--shell/e-shell-view-menu.c623
-rw-r--r--shell/e-shell-view-menu.h35
-rw-r--r--shell/e-shell-view.c1379
-rw-r--r--shell/e-shell-view.h103
-rw-r--r--shell/e-shell.c846
-rw-r--r--shell/e-shell.h88
-rw-r--r--shell/e-shortcuts-view.c584
-rw-r--r--shell/e-shortcuts-view.h76
-rw-r--r--shell/e-shortcuts.c760
-rw-r--r--shell/e-shortcuts.h110
-rw-r--r--shell/e-storage-set-view.c1003
-rw-r--r--shell/e-storage-set-view.h79
-rw-r--r--shell/e-storage-set.c576
-rw-r--r--shell/e-storage-set.h112
-rw-r--r--shell/e-storage.c593
-rw-r--r--shell/e-storage.h135
-rw-r--r--shell/evolution-session.c213
-rw-r--r--shell/evolution-session.h72
-rw-r--r--shell/evolution-shell-client.c333
-rw-r--r--shell/evolution-shell-client.h78
-rw-r--r--shell/evolution-shell-component-client.c526
-rw-r--r--shell/evolution-shell-component-client.h101
-rw-r--r--shell/evolution-shell-component.c498
-rw-r--r--shell/evolution-shell-component.h141
-rw-r--r--shell/evolution-shell-view.c226
-rw-r--r--shell/evolution-shell-view.h76
-rw-r--r--shell/evolution-storage.c387
-rw-r--r--shell/evolution-storage.h98
-rw-r--r--shell/glade/.cvsignore4
-rw-r--r--shell/glade/Makefile.am5
-rw-r--r--shell/glade/e-shell-folder-creation-dialog.glade168
-rw-r--r--shell/idl/folder.idl87
-rw-r--r--shell/main.c174
-rw-r--r--stamp.h.in1
-rw-r--r--tests/.cvsignore24
-rw-r--r--tests/Makefile.am73
-rw-r--r--tests/test-movemail.c164
-rw-r--r--tests/test-url.c37
-rw-r--r--tests/test1.c136
-rw-r--r--tests/test10.c127
-rw-r--r--tests/test11.c136
-rw-r--r--tests/test12.c56
-rw-r--r--tests/test13.c123
-rw-r--r--tests/test14.c177
-rw-r--r--tests/test2.c48
-rw-r--r--tests/test3.c29
-rw-r--r--tests/test4.c65
-rw-r--r--tests/test5.c59
-rw-r--r--tests/test6.c49
-rw-r--r--tests/test8.c75
-rw-r--r--tests/test9.c80
-rw-r--r--tests/ui-tests/.cvsignore8
-rw-r--r--tests/ui-tests/Makefile.am39
-rw-r--r--tests/ui-tests/filter.c30
-rw-r--r--tests/ui-tests/filterdescription.xml99
-rw-r--r--tests/ui-tests/mail-atchmt-image.msg67
-rw-r--r--tests/ui-tests/mail-atchmt-postscript.msg8069
-rw-r--r--tests/ui-tests/mail-atchmt-svg.msg418
-rw-r--r--tests/ui-tests/message-browser.c819
-rw-r--r--tests/ui-tests/saveoptions.xml37
-rw-r--r--tests/ui-tests/store_listing.c424
-rw-r--r--tests/ui-tests/store_listing.glade489
-rw-r--r--tests/ui-tests/test-multipart-alt.msg17738
-rw-r--r--tests/ui-tests/test-multipart-mixed.msg377
-rw-r--r--tools/.cvsignore3
-rw-r--r--tools/Makefile.am3
-rwxr-xr-xtools/killev16
-rwxr-xr-xtools/verify-evolution-install.sh640
-rw-r--r--widgets/.cvsignore9
-rw-r--r--widgets/LICENSE1
-rw-r--r--widgets/Makefile.am8
-rw-r--r--widgets/e-paned/.cvsignore8
-rw-r--r--widgets/e-paned/Makefile.am15
-rw-r--r--widgets/e-paned/e-hpaned.c439
-rw-r--r--widgets/e-paned/e-hpaned.h72
-rw-r--r--widgets/e-paned/e-paned.c635
-rw-r--r--widgets/e-paned/e-paned.h135
-rw-r--r--widgets/e-paned/e-vpaned.c438
-rw-r--r--widgets/e-paned/e-vpaned.h72
-rw-r--r--widgets/e-reflow/e-reflow-sorted.c272
-rw-r--r--widgets/e-reflow/e-reflow-sorted.h90
-rw-r--r--widgets/e-reflow/e-reflow.c859
-rw-r--r--widgets/e-reflow/e-reflow.h112
-rw-r--r--widgets/e-table/.cvsignore12
-rw-r--r--widgets/e-table/ChangeLog2508
-rw-r--r--widgets/e-table/LICENSE1
-rw-r--r--widgets/e-table/Makefile.am180
-rw-r--r--widgets/e-table/ROADMAP.e-table113
-rw-r--r--widgets/e-table/TODO99
-rw-r--r--widgets/e-table/add-col.xpm22
-rw-r--r--widgets/e-table/arrow-down.xpm21
-rw-r--r--widgets/e-table/arrow-up.xpm21
-rw-r--r--widgets/e-table/check-empty.xpm21
-rw-r--r--widgets/e-table/check-filled.xpm21
-rw-r--r--widgets/e-table/clip.pngbin192 -> 0 bytes
-rw-r--r--widgets/e-table/e-cell-checkbox.c44
-rw-r--r--widgets/e-table/e-cell-checkbox.h24
-rw-r--r--widgets/e-table/e-cell-string.c9
-rw-r--r--widgets/e-table/e-cell-text.c2314
-rw-r--r--widgets/e-table/e-cell-text.h77
-rw-r--r--widgets/e-table/e-cell-toggle.c289
-rw-r--r--widgets/e-table/e-cell-toggle.h35
-rw-r--r--widgets/e-table/e-cell-tree.c542
-rw-r--r--widgets/e-table/e-cell-tree.h48
-rw-r--r--widgets/e-table/e-cell.c200
-rw-r--r--widgets/e-table/e-cell.h85
-rw-r--r--widgets/e-table/e-table-click-to-add.c504
-rw-r--r--widgets/e-table/e-table-click-to-add.h51
-rw-r--r--widgets/e-table/e-table-col-dnd.h10
-rw-r--r--widgets/e-table/e-table-col.c168
-rw-r--r--widgets/e-table/e-table-col.h67
-rw-r--r--widgets/e-table/e-table-column-model.h5
-rw-r--r--widgets/e-table/e-table-column.c293
-rw-r--r--widgets/e-table/e-table-config.c233
-rw-r--r--widgets/e-table/e-table-config.glade302
-rw-r--r--widgets/e-table/e-table-config.glade.h10
-rw-r--r--widgets/e-table/e-table-config.h11
-rw-r--r--widgets/e-table/e-table-defines.h16
-rw-r--r--widgets/e-table/e-table-example-1.c287
-rw-r--r--widgets/e-table/e-table-example-2.c330
-rw-r--r--widgets/e-table/e-table-field-chooser-dialog.c190
-rw-r--r--widgets/e-table/e-table-field-chooser-dialog.h76
-rw-r--r--widgets/e-table/e-table-field-chooser-item.c566
-rw-r--r--widgets/e-table/e-table-field-chooser-item.h47
-rw-r--r--widgets/e-table/e-table-field-chooser.c246
-rw-r--r--widgets/e-table/e-table-field-chooser.glade131
-rw-r--r--widgets/e-table/e-table-field-chooser.glade.h9
-rw-r--r--widgets/e-table/e-table-field-chooser.h81
-rw-r--r--widgets/e-table/e-table-group-container.c1169
-rw-r--r--widgets/e-table/e-table-group-container.h69
-rw-r--r--widgets/e-table/e-table-group-leaf.c425
-rw-r--r--widgets/e-table/e-table-group-leaf.h52
-rw-r--r--widgets/e-table/e-table-group.c420
-rw-r--r--widgets/e-table/e-table-group.glade208
-rw-r--r--widgets/e-table/e-table-group.glade.h13
-rw-r--r--widgets/e-table/e-table-group.h135
-rw-r--r--widgets/e-table/e-table-header-item.c1449
-rw-r--r--widgets/e-table/e-table-header-item.h76
-rw-r--r--widgets/e-table/e-table-header.c665
-rw-r--r--widgets/e-table/e-table-header.h79
-rw-r--r--widgets/e-table/e-table-item.c2228
-rw-r--r--widgets/e-table/e-table-item.h143
-rw-r--r--widgets/e-table/e-table-model.c354
-rw-r--r--widgets/e-table/e-table-model.h88
-rw-r--r--widgets/e-table/e-table-one.c236
-rw-r--r--widgets/e-table/e-table-one.h30
-rw-r--r--widgets/e-table/e-table-scrolled.c341
-rw-r--r--widgets/e-table/e-table-scrolled.h64
-rw-r--r--widgets/e-table/e-table-selection-model.c500
-rw-r--r--widgets/e-table/e-table-selection-model.h70
-rw-r--r--widgets/e-table/e-table-simple.c242
-rw-r--r--widgets/e-table/e-table-simple.h61
-rw-r--r--widgets/e-table/e-table-size-test.c288
-rw-r--r--widgets/e-table/e-table-sort-info.c238
-rw-r--r--widgets/e-table/e-table-sort-info.h60
-rw-r--r--widgets/e-table/e-table-sorted-variable.c337
-rw-r--r--widgets/e-table/e-table-sorted-variable.h38
-rw-r--r--widgets/e-table/e-table-sorted.c89
-rw-r--r--widgets/e-table/e-table-sorted.h29
-rw-r--r--widgets/e-table/e-table-sorter.c295
-rw-r--r--widgets/e-table/e-table-sorter.h47
-rw-r--r--widgets/e-table/e-table-subset-variable.c193
-rw-r--r--widgets/e-table/e-table-subset-variable.h48
-rw-r--r--widgets/e-table/e-table-subset.c253
-rw-r--r--widgets/e-table/e-table-subset.h38
-rw-r--r--widgets/e-table/e-table-text-model.c220
-rw-r--r--widgets/e-table/e-table-text-model.h61
-rw-r--r--widgets/e-table/e-table-tree.h19
-rw-r--r--widgets/e-table/e-table.c1669
-rw-r--r--widgets/e-table/e-table.h252
-rw-r--r--widgets/e-table/e-tree-example-1.c403
-rw-r--r--widgets/e-table/e-tree-model.c760
-rw-r--r--widgets/e-table/e-tree-model.h107
-rw-r--r--widgets/e-table/e-tree-simple.c84
-rw-r--r--widgets/e-table/e-tree-simple.h43
-rw-r--r--widgets/e-table/image1.pngbin1858 -> 0 bytes
-rw-r--r--widgets/e-table/image2.pngbin1987 -> 0 bytes
-rw-r--r--widgets/e-table/image3.pngbin2051 -> 0 bytes
-rw-r--r--widgets/e-table/remove-col.xpm22
-rw-r--r--widgets/e-table/sample.table11
-rw-r--r--widgets/e-table/table-test.c45
-rw-r--r--widgets/e-table/table-test.h4
-rw-r--r--widgets/e-table/test-check.c206
-rw-r--r--widgets/e-table/test-cols.c250
-rw-r--r--widgets/e-table/test-table.c394
-rw-r--r--widgets/e-table/tree-expanded.xpm22
-rw-r--r--widgets/e-table/tree-unexpanded.xpm22
-rw-r--r--widgets/e-text/.cvsignore9
-rw-r--r--widgets/e-text/Makefile.am43
-rw-r--r--widgets/e-text/e-entry-test.c79
-rw-r--r--widgets/e-text/e-entry.c408
-rw-r--r--widgets/e-text/e-entry.h39
-rw-r--r--widgets/e-text/e-text-event-processor-emacs-like.c372
-rw-r--r--widgets/e-text/e-text-event-processor-emacs-like.h68
-rw-r--r--widgets/e-text/e-text-event-processor-types.h140
-rw-r--r--widgets/e-text/e-text-event-processor.c103
-rw-r--r--widgets/e-text/e-text-event-processor.h74
-rw-r--r--widgets/e-text/e-text-model.c244
-rw-r--r--widgets/e-text/e-text-model.h72
-rw-r--r--widgets/e-text/e-text-test.c153
-rw-r--r--widgets/e-text/e-text.c3365
-rw-r--r--widgets/e-text/e-text.h227
-rw-r--r--widgets/meeting-time-sel/.cvsignore8
-rw-r--r--widgets/meeting-time-sel/ChangeLog9
-rw-r--r--widgets/meeting-time-sel/LICENSE1
-rw-r--r--widgets/meeting-time-sel/Makefile.am36
-rw-r--r--widgets/meeting-time-sel/e-meeting-time-sel-item.c978
-rw-r--r--widgets/meeting-time-sel/e-meeting-time-sel-item.h79
-rw-r--r--widgets/meeting-time-sel/e-meeting-time-sel-list-item.c393
-rw-r--r--widgets/meeting-time-sel/e-meeting-time-sel-list-item.h73
-rw-r--r--widgets/meeting-time-sel/e-meeting-time-sel-mail.xpm135
-rw-r--r--widgets/meeting-time-sel/e-meeting-time-sel-no-mail.xpm123
-rw-r--r--widgets/meeting-time-sel/e-meeting-time-sel.c3271
-rw-r--r--widgets/meeting-time-sel/e-meeting-time-sel.h518
-rw-r--r--widgets/meeting-time-sel/test-meeting-time-sel.c242
-rw-r--r--widgets/misc/.cvsignore9
-rw-r--r--widgets/misc/ChangeLog50
-rw-r--r--widgets/misc/Makefile.am42
-rw-r--r--widgets/misc/e-calendar-item.c1615
-rw-r--r--widgets/misc/e-calendar-item.h151
-rw-r--r--widgets/misc/e-calendar.c486
-rw-r--r--widgets/misc/e-calendar.h87
-rw-r--r--widgets/misc/e-canvas-utils.c67
-rw-r--r--widgets/misc/e-canvas-utils.h30
-rw-r--r--widgets/misc/e-canvas-vbox.c321
-rw-r--r--widgets/misc/e-canvas-vbox.h86
-rw-r--r--widgets/misc/e-canvas.c696
-rw-r--r--widgets/misc/e-canvas.h121
-rw-r--r--widgets/misc/e-clipped-label.c378
-rw-r--r--widgets/misc/e-clipped-label.h90
-rw-r--r--widgets/misc/e-colors.c74
-rw-r--r--widgets/misc/e-colors.h14
-rw-r--r--widgets/misc/e-cursors.c38
-rw-r--r--widgets/misc/e-cursors.h38
-rw-r--r--widgets/misc/e-gui-utils.c219
-rw-r--r--widgets/misc/e-gui-utils.h19
-rw-r--r--widgets/misc/e-popup-menu.c114
-rw-r--r--widgets/misc/e-popup-menu.h25
-rw-r--r--widgets/misc/e-printable.c207
-rw-r--r--widgets/misc/e-printable.h72
-rw-r--r--widgets/misc/e-reflow.c859
-rw-r--r--widgets/misc/e-reflow.h112
-rw-r--r--widgets/misc/e-scroll-frame.c1250
-rw-r--r--widgets/misc/e-scroll-frame.h95
-rw-r--r--widgets/misc/e-title-bar.c271
-rw-r--r--widgets/misc/e-title-bar.h79
-rw-r--r--widgets/misc/pixmaps/cursor_cross.xpm38
-rw-r--r--widgets/misc/pixmaps/cursor_hand_closed.xpm38
-rw-r--r--widgets/misc/pixmaps/cursor_hand_open.xpm38
-rw-r--r--widgets/misc/pixmaps/cursor_zoom_in.xpm37
-rw-r--r--widgets/misc/pixmaps/cursor_zoom_out.xpm37
-rw-r--r--widgets/misc/test-calendar.c74
-rw-r--r--widgets/misc/test-title-bar.c73
-rw-r--r--widgets/shortcut-bar/.cvsignore8
-rw-r--r--widgets/shortcut-bar/ChangeLog276
-rw-r--r--widgets/shortcut-bar/LICENSE1
-rw-r--r--widgets/shortcut-bar/Makefile.am38
-rw-r--r--widgets/shortcut-bar/e-group-bar.c1546
-rw-r--r--widgets/shortcut-bar/e-group-bar.h172
-rw-r--r--widgets/shortcut-bar/e-icon-bar-bg-item.c366
-rw-r--r--widgets/shortcut-bar/e-icon-bar-bg-item.h72
-rw-r--r--widgets/shortcut-bar/e-icon-bar.c1643
-rw-r--r--widgets/shortcut-bar/e-icon-bar.h246
-rw-r--r--widgets/shortcut-bar/e-shortcut-bar.c757
-rw-r--r--widgets/shortcut-bar/e-shortcut-bar.h128
-rw-r--r--widgets/shortcut-bar/e-shortcut-model.c556
-rw-r--r--widgets/shortcut-bar/e-shortcut-model.h139
-rw-r--r--widgets/shortcut-bar/e-vscrolled-bar.c708
-rw-r--r--widgets/shortcut-bar/e-vscrolled-bar.h97
-rw-r--r--widgets/shortcut-bar/test-shortcut-bar.c606
-rw-r--r--widgets/table/.cvsignore12
-rw-r--r--widgets/table/add-col.xpm22
-rw-r--r--widgets/table/arrow-down.xpm21
-rw-r--r--widgets/table/arrow-up.xpm21
-rw-r--r--widgets/table/check-empty.xpm21
-rw-r--r--widgets/table/check-filled.xpm21
-rw-r--r--widgets/table/clip.pngbin192 -> 0 bytes
-rw-r--r--widgets/table/e-cell-checkbox.c44
-rw-r--r--widgets/table/e-cell-checkbox.h24
-rw-r--r--widgets/table/e-cell-string.c9
-rw-r--r--widgets/table/e-cell-text.c2314
-rw-r--r--widgets/table/e-cell-text.h77
-rw-r--r--widgets/table/e-cell-toggle.c289
-rw-r--r--widgets/table/e-cell-toggle.h35
-rw-r--r--widgets/table/e-cell-tree.c542
-rw-r--r--widgets/table/e-cell-tree.h48
-rw-r--r--widgets/table/e-cell.c200
-rw-r--r--widgets/table/e-cell.h85
-rw-r--r--widgets/table/e-table-click-to-add.c504
-rw-r--r--widgets/table/e-table-click-to-add.h51
-rw-r--r--widgets/table/e-table-col-dnd.h10
-rw-r--r--widgets/table/e-table-col.c168
-rw-r--r--widgets/table/e-table-col.h67
-rw-r--r--widgets/table/e-table-column-model.h5
-rw-r--r--widgets/table/e-table-column.c293
-rw-r--r--widgets/table/e-table-config.c233
-rw-r--r--widgets/table/e-table-config.glade302
-rw-r--r--widgets/table/e-table-config.glade.h10
-rw-r--r--widgets/table/e-table-config.h11
-rw-r--r--widgets/table/e-table-defines.h16
-rw-r--r--widgets/table/e-table-example-1.c287
-rw-r--r--widgets/table/e-table-example-2.c330
-rw-r--r--widgets/table/e-table-field-chooser-dialog.c190
-rw-r--r--widgets/table/e-table-field-chooser-dialog.h76
-rw-r--r--widgets/table/e-table-field-chooser-item.c566
-rw-r--r--widgets/table/e-table-field-chooser-item.h47
-rw-r--r--widgets/table/e-table-field-chooser.c246
-rw-r--r--widgets/table/e-table-field-chooser.glade131
-rw-r--r--widgets/table/e-table-field-chooser.glade.h9
-rw-r--r--widgets/table/e-table-field-chooser.h81
-rw-r--r--widgets/table/e-table-group-container.c1169
-rw-r--r--widgets/table/e-table-group-container.h69
-rw-r--r--widgets/table/e-table-group-leaf.c425
-rw-r--r--widgets/table/e-table-group-leaf.h52
-rw-r--r--widgets/table/e-table-group.c420
-rw-r--r--widgets/table/e-table-group.glade208
-rw-r--r--widgets/table/e-table-group.glade.h13
-rw-r--r--widgets/table/e-table-group.h135
-rw-r--r--widgets/table/e-table-header-item.c1449
-rw-r--r--widgets/table/e-table-header-item.h76
-rw-r--r--widgets/table/e-table-header.c665
-rw-r--r--widgets/table/e-table-header.h79
-rw-r--r--widgets/table/e-table-item.c2228
-rw-r--r--widgets/table/e-table-item.h143
-rw-r--r--widgets/table/e-table-model.c354
-rw-r--r--widgets/table/e-table-model.h88
-rw-r--r--widgets/table/e-table-one.c236
-rw-r--r--widgets/table/e-table-one.h30
-rw-r--r--widgets/table/e-table-scrolled.c341
-rw-r--r--widgets/table/e-table-scrolled.h64
-rw-r--r--widgets/table/e-table-selection-model.c500
-rw-r--r--widgets/table/e-table-selection-model.h70
-rw-r--r--widgets/table/e-table-simple.c242
-rw-r--r--widgets/table/e-table-simple.h61
-rw-r--r--widgets/table/e-table-size-test.c288
-rw-r--r--widgets/table/e-table-sort-info.c238
-rw-r--r--widgets/table/e-table-sort-info.h60
-rw-r--r--widgets/table/e-table-sorted-variable.c337
-rw-r--r--widgets/table/e-table-sorted-variable.h38
-rw-r--r--widgets/table/e-table-sorted.c89
-rw-r--r--widgets/table/e-table-sorted.h29
-rw-r--r--widgets/table/e-table-sorter.c295
-rw-r--r--widgets/table/e-table-sorter.h47
-rw-r--r--widgets/table/e-table-subset-variable.c193
-rw-r--r--widgets/table/e-table-subset-variable.h48
-rw-r--r--widgets/table/e-table-subset.c253
-rw-r--r--widgets/table/e-table-subset.h38
-rw-r--r--widgets/table/e-table-text-model.c220
-rw-r--r--widgets/table/e-table-text-model.h61
-rw-r--r--widgets/table/e-table-tree.h19
-rw-r--r--widgets/table/e-table.c1669
-rw-r--r--widgets/table/e-table.h252
-rw-r--r--widgets/table/e-tree-example-1.c403
-rw-r--r--widgets/table/e-tree-model.c760
-rw-r--r--widgets/table/e-tree-model.h107
-rw-r--r--widgets/table/e-tree-simple.c84
-rw-r--r--widgets/table/e-tree-simple.h43
-rw-r--r--widgets/table/image1.pngbin1858 -> 0 bytes
-rw-r--r--widgets/table/image2.pngbin1987 -> 0 bytes
-rw-r--r--widgets/table/image3.pngbin2051 -> 0 bytes
-rw-r--r--widgets/table/remove-col.xpm22
-rw-r--r--widgets/table/sample.table11
-rw-r--r--widgets/table/table-test.c45
-rw-r--r--widgets/table/table-test.h4
-rw-r--r--widgets/table/test-check.c206
-rw-r--r--widgets/table/test-cols.c250
-rw-r--r--widgets/table/test-table.c394
-rw-r--r--widgets/table/tree-expanded.xpm22
-rw-r--r--widgets/table/tree-unexpanded.xpm22
-rw-r--r--widgets/text/.cvsignore9
-rw-r--r--widgets/text/e-entry-test.c79
-rw-r--r--widgets/text/e-entry.c408
-rw-r--r--widgets/text/e-entry.h39
-rw-r--r--widgets/text/e-table-text-model.c220
-rw-r--r--widgets/text/e-table-text-model.h61
-rw-r--r--widgets/text/e-text-event-processor-emacs-like.c372
-rw-r--r--widgets/text/e-text-event-processor-emacs-like.h68
-rw-r--r--widgets/text/e-text-event-processor-types.h140
-rw-r--r--widgets/text/e-text-event-processor.c103
-rw-r--r--widgets/text/e-text-event-processor.h74
-rw-r--r--widgets/text/e-text-model.c244
-rw-r--r--widgets/text/e-text-model.h72
-rw-r--r--widgets/text/e-text-test.c153
-rw-r--r--widgets/text/e-text.c3365
-rw-r--r--widgets/text/e-text.h227
-rw-r--r--wombat/.cvsignore13
-rw-r--r--wombat/ChangeLog106
-rw-r--r--wombat/GNOME_Evolution_Wombat.oaf.in30
-rw-r--r--wombat/GNOME_Evolution_Wombat.oafinfo30
-rw-r--r--wombat/Makefile.am57
-rw-r--r--wombat/wombat.c293
-rw-r--r--wombat/wombat.gnorba11
-rw-r--r--wombat/wombat.idl12
-rw-r--r--wombat/wombat.oafinfo30
1646 files changed, 0 insertions, 508058 deletions
diff --git a/.cvsignore b/.cvsignore
deleted file mode 100644
index 00c805b196..0000000000
--- a/.cvsignore
+++ /dev/null
@@ -1,25 +0,0 @@
-ABOUT-NLS
-Makefile
-Makefile.in
-aclocal.m4
-config.cache
-config.guess
-config.h
-config.h.in
-config.log
-config.status
-config.sub
-configure
-install-sh
-intl
-libtool
-ltconfig
-ltmain.sh
-missing
-mkinstalldirs
-stamp-h
-stamp-h.in
-stamp.h
-xlibtool
-xltmain.sh
-evolution.spec
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
index 5156573f32..0000000000
--- a/AUTHORS
+++ /dev/null
@@ -1,66 +0,0 @@
-Evolution was written by:
-
-Addressbook
- Arturo Esponosa <arturo@nuclecu.unam.mx> (Original Gnomecard author)
- Nat Friedman <nat@helixcode.com>
- Chris Lahey <clahey@helixcode.com>
- Chris Toshok <toshok@helixcode.com>
-
-Artwork
- Tuomas Kuosmanen <tigert@helixcode.com>
-
-Calendar
- Seth Alves <seth@helixcode.com>
- Eric Busboom <eric@softwarestudio.org> (libical author)
- Arturo Esponosa <arturo@nuclecu.unam.mx> (Gnomecal contributor)
- Damon Chaplin <damon@helixcode.com>
- Federico Mena-Quintero <federico@helixcode.com>
- Russell Steinthal <rms39@columbia.edu> (Gnomecal maintainer)
-
-Documentation
- Kevin Breit <battery841@mypad.com>
- Aaron Weber <aaron@helixcode.com>
-
-Mailer
- Bertrand Guiheneuf <bertrand@helixcode.com>
- Matt Loper <matt@helixcode.com>
- Ettore Perazzoli <ettore@helixcode.com>
- Jeff Stedfast <fejj@helixcode.com>
- Peter Williams <peterw@helixcode.com>
- Dan Winship <danw@helixcode.com>
- Michael Zucchi <notzed@helixcode.com>
-
-Notes
- Anders Carlsson <andersca@gnu.org>
-
-Shell
- Miguel de Icaza <miguel@helixcode.com>
- Ettore Perazzoli <ettore@helixcode.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>
- GNOME PL Team <gnomepl@pandora.info.bielsko.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>
- 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>
- Valek Filippov <frob@df.ru>
- Vincent Renardias <vincent@redhat.com>
- Yuri Syrota <rasta@renome.rovno.ua>
-
-Widgets
- Damon Chaplin <damon@helixcode.com>
- Miguel de Icaza <miguel@helixcode.com>
- Chris Lahey <clahey@helixcode.com>
- Federico Mena-Quintero <federico@helixcode.com>
- Chris Toshok <toshok@helixcode.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/ChangeLog b/ChangeLog
deleted file mode 100644
index a608c7aa5c..0000000000
--- a/ChangeLog
+++ /dev/null
@@ -1,5251 +0,0 @@
-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 e69de29bb2..0000000000
--- a/HACKING
+++ /dev/null
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
index b42a17ac46..0000000000
--- a/INSTALL
+++ /dev/null
@@ -1,182 +0,0 @@
-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, a file
-`config.cache' that saves the results of its tests to speed up
-reconfiguring, and a file `config.log' containing compiler output
-(useful mainly for debugging `configure').
-
- 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 at some point `config.cache'
-contains results you don't want to keep, you may remove or edit it.
-
- The file `configure.in' is used to create `configure' by a program
-called `autoconf'. You only need `configure.in' 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. You can give `configure'
-initial values for variables by setting them in the environment. Using
-a Bourne-compatible shell, you can do that on the command line like
-this:
- CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
-
-Or on systems that have the `env' program, you can do it like this:
- env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
-
-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 supports 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' can not figure out
-automatically, but needs to determine by the type of host the package
-will run on. Usually `configure' can figure that out, but if it prints
-a message saying it can not guess the host type, give it the
-`--host=TYPE' option. TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name with three fields:
- CPU-COMPANY-SYSTEM
-
-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 host type.
-
- If you are building compiler tools for cross-compiling, you can also
-use the `--target=TYPE' option to select the type of system they will
-produce code for and the `--build=TYPE' option to select the type of
-system on which you are compiling the package.
-
-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.
-
-Operation Controls
-==================
-
- `configure' recognizes the following options to control how it
-operates.
-
-`--cache-file=FILE'
- Use and save the results of the tests in FILE instead of
- `./config.cache'. Set FILE to `/dev/null' to disable caching, for
- debugging `configure'.
-
-`--help'
- Print a summary of the options to `configure', and exit.
-
-`--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.
-
-`--version'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
-
-`configure' also accepts some other, not widely useful, options.
diff --git a/MAINTAINERS b/MAINTAINERS
deleted file mode 100644
index 7a42d1eee8..0000000000
--- a/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-Email: miguel@kernel.org
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index 0aa8f77438..0000000000
--- a/Makefile.am
+++ /dev/null
@@ -1,49 +0,0 @@
-changelogs = \
- ChangeLog
-
-appicondir = $(datadir)/pixmaps
-appicon_DATA = evolution.png
-
-applicationdir = $(datadir)/gnome/apps/Applications
-application_DATA = evolution.desktop
-
-EXTRA_DIST = \
- AUTHORS \
- $(changelogs) \
- README \
- HACKING \
- MAINTAINERS \
- NEWS \
- evolution.spec.in \
- $(appicon_DATA) \
- $(application_DATA)
-
-
-SUBDIRS = \
- intl \
- macros \
- data \
- e-util \
- widgets \
- shell \
- libibex \
- camel \
- filter \
- composer \
- mail \
- libical \
- libversit \
- addressbook \
- calendar \
- wombat \
- art \
- default_user \
- tools \
- po \
- doc
-
-
-dist-hook: evolution.spec
- cp evolution.spec $(distdir)
-
-
diff --git a/NEWS b/NEWS
deleted file mode 100644
index 48883adf2b..0000000000
--- a/NEWS
+++ /dev/null
@@ -1,367 +0,0 @@
-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 6457c9bc80..0000000000
--- a/README
+++ /dev/null
@@ -1,171 +0,0 @@
-Evolution is the integrated mail, calendar and address book
-distributed suite from Helix Code, Inc.
-
-See http://www.helixcode.com/apps/evolution.php3 for more information.
-
-Note that Evolution is still beta. This means it may delete all of
-your mail if you give it the chance.
-
-If you are interested in hacking on Evolution, you should subscribe to
-the Evolution mailing list. Send mail to
-"evolution-request@helixcode.com" with the word "subscribe" in the
-body of the message. 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 a mailing list archive available at
-http://lists.helixcode.com/archives/public/evolution/
-
-There is also an #evolution IRC channel on irc.gnome.org.
-
-
-HOW TO BUILD EVOLUTION
-----------------------
-
- *** READ THIS BEFORE YOU START BUILDING ANYTHING! ***
-
-Evolution depends on a large number of unreleased and rapidly-changing
-libraries. Some of these libraries in turn depend on other unreleased
-and rapidly-changing libraries.
-
-Building Evolution is HARD, and it's going to stay hard until all of
-the libraries it depends on stabilize, and there's nothing we can do
-to make it any easier until then.
-
-
-General Principles
-------------------
-
-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, but may make it harder to uninstall later.
-
-If you want to install into the same prefix as the rest of GNOME,
-type:
-
- gnome-config --prefix
- gnome-config --sysconfdir
-
-and remember the answers, and pass them to "configure" and "autogen"
-when building the other packages you need. Eg:
-
- ./configure --prefix=/usr --sysconfdir=/etc
-
-
-If you do not do this, you will need to set the GNOME_PATH environment
-variable (and ACLOCAL_FLAGS as well if building from CVS) to include
-the prefix you install into. Eg:
-
- export GNOME_PATH=/usr/local
- export ACLOCAL_FLAGS="-I /usr/local/share/aclocal"
-
-(Assuming your shell is bash, and you installed into /usr/local.) You
-need to set GNOME_PATH both during compiling AND when you run
-evolution. Remember also that if you're installing into an odd prefix
-such as /evolution, that you also need to make sure to put
-${prefix}/bin in your PATH.
-
-If you install Evolution into a different prefix from OAF, you will
-also need to set OAF_INFO_PATH to include the directory where the
-oafinfo files are installed (${prefix}/share/oaf). (OAF will
-eventually obey the GNOME_PATH variable, but it does not do so
-currently.) Eg:
-
- export OAF_INFO_PATH=/usr/local/share/oaf
-
-If you are already running an oafd, you will need to kill it after
-setting that variable so it gets restarted later with that in its
-environment.
-
-
-Dependencies
-------------
-
-All of these libraries are available in GNOME CVS, under the given
-names. Most (but not all) of them are also available as tarballs on
-ftp.gnome.org. The (*)ed packages are available in Helix GNOME.
-(http://www.helixcode.com/desktop/)
-
- - gnome-xml - 1.8.7 or later in the 1.0 series, but not from the 2.0
- series (If you get this from GNOME CVS, use the tag "LIB_XML_1_X".)
- (*)
-
- - gnome-print - 0.20 (*). The gnome-print CVS HEAD will NOT work, nor
- will 0.21.
-
- - gdk-pixbuf - 0.7.0 or later (*)
-
- - ORBit - 0.5.3 or later (*)
-
- - oaf - 0.5 or later
-
- *** If you are using oaf from CVS, you should use the flag
- *** "--disable-more-warnings" when configure, or it may fail to
- *** build.
-
- - gnome-vfs - 0.3 or later
-
- *** If you are using gnome-vfs from CVS, you should use the flag
- *** "--disable-more-warnings" when configuring, or it may fail to
- *** build.
-
- - bonobo - 0.17 or later
-
- *** Note that bonobo must be installed with the same --prefix as
- *** either gnome-libs or evolution for the Makefiles to work
- *** properly.
-
- - libunicode - 0.4 or later, available from
- http://www.pango.org/download.shtml
-
- - gconf - 0.6 or later
-
- - gtkhtml - 0.5 or later
-
- - libglade (*)
-
-If you want support for PalmPilot syncing (currently only supported by
-the calendar and not yet very stable/functional), you will also need
-the following packages:
-
- - pilot-link (*)
-
- - gnome-pilot - from CVS, with --enable-oaf
-
-
-
-
-The layout of the source tree is:
-
-addressbook: the Address Book UI
-art: graphics used by evolution
-calendar: the Calendar UI
-camel: libcamel, a messaging library used by the mailer.
- Camel is inspired by Sun's JavaMail
- (http://java.sun.com/products/javamail/) and the
- IMAPv4 spec (RFC 2060).
-composer: the message composer UI
-data: the .desktop file for Evolution
-default_user: initial Evolution config files for new users
-devel-docs: entirely inadequate documentation
-doc: more adequate documentation
-e-util: utility code used by various parts of Evolution
-filter: libfilter, a mail filtering library
-libibex: an indexing library used by the mailer
-libical: a library for the iCalendar format (RFC 2445-2446)
-libversit: a library for the vCard (RFC 2425-2426) and vCalendar
- (http://www.imc.org/pdi/vcal-10.txt) formats
-mail: the mail display UI
-shell: the Evolution shell (the main program that launches
- the other components)
-tests: some test programs
-tools: utilities, notably "killev", a script to kill of all
- of the Evolution components
-widgets: widgets used by Evolution, including the shortcut bar,
- ETable, and EText
-wombat: Has source code that will load in the addressbook
- and calendar backend, and will form the server
- process we'll be using
diff --git a/acconfig.h b/acconfig.h
deleted file mode 100644
index 70c43a6dfb..0000000000
--- a/acconfig.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#undef ENABLE_NLS
-#undef HAVE_CATGETS
-#undef HAVE_GETTEXT
-#undef HAVE_LC_MESSAGES
-#undef HAVE_STPCPY
-#undef HAVE_LIBSM
-#undef PACKAGE
-#undef VERSION
-#undef HAVE_BONOBO
-#undef ENABLE_THREADS
-#undef SENDMAIL_PATH
-#undef SYSTEM_MAIL_DIR
-#undef HAVE_LDAP
-#undef HAVE_TIMEZONE
-#undef HAVE_TM_GMTOFF
-#undef USING_OAF
-#undef HAVE_KRB4
-#undef HAVE_KRB5
-#undef USE_BROKEN_THREADS
-#undef BONOBO_POST_0_15
-#undef MOVEMAIL_PATH
-#undef PGP_PROGRAM
-#undef GPG_PATH
-#undef PGP5_PATH
-#undef PGP_PATH
-
-/* Define this if you want to build against the development gtk */
-#undef HAVE_DEVGTK
-
-/* Define if ctime_r takes three arguments */
-#undef CTIME_R_THREE_ARGS
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 5f86fa875b..0000000000
--- a/addressbook/ChangeLog
+++ /dev/null
@@ -1,2135 +0,0 @@
-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 66581af8ed..0000000000
--- a/addressbook/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-if ENABLE_PILOT_CONDUITS
-CONDUIT_SUBDIR=conduit
-endif
-
-SUBDIRS = \
- ename backend printing contact-editor gui $(CONDUIT_SUBDIR)
-
diff --git a/addressbook/backend/.cvsignore b/addressbook/backend/.cvsignore
deleted file mode 100644
index 09980ae6ba..0000000000
--- a/addressbook/backend/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
diff --git a/addressbook/backend/Makefile.am b/addressbook/backend/Makefile.am
deleted file mode 100644
index b2807b2480..0000000000
--- a/addressbook/backend/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = idl ebook pas
diff --git a/addressbook/backend/ebook/.cvsignore b/addressbook/backend/ebook/.cvsignore
deleted file mode 100644
index 1abc66db18..0000000000
--- a/addressbook/backend/ebook/.cvsignore
+++ /dev/null
@@ -1,16 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-addressbook-stubs.c
-addressbook-skels.c
-addressbook-common.c
-addressbook.h
-test-card
-test-client
-test-client-list
-load-pine-addressbook
-load-gnomecard-addressbook
diff --git a/addressbook/backend/ebook/Makefile.am b/addressbook/backend/ebook/Makefile.am
deleted file mode 100644
index 12f35d0b94..0000000000
--- a/addressbook/backend/ebook/Makefile.am
+++ /dev/null
@@ -1,116 +0,0 @@
-noinst_PROGRAMS = test-card test-client test-client-list load-pine-addressbook load-gnomecard-addressbook
-
-CORBA_SOURCE = \
- addressbook.h \
- addressbook-common.c \
- addressbook-stubs.c \
- addressbook-skels.c
-
-idls = \
- $(srcdir)/../idl/addressbook.idl
-
-idl_flags = `$(GNOME_CONFIG) --cflags idl` -I $(datadir)/idl
-
-$(CORBA_SOURCE): $(idls)
- $(ORBIT_IDL) $(srcdir)/../idl/addressbook.idl $(idl_flags)
-
-INCLUDES = \
- -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
- -DG_LOG_DOMAIN=\"EBook\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_srcdir)/addressbook/ename \
- -I$(top_builddir)/addressbook/backend \
- -I$(top_builddir)/addressbook/ename \
- $(BONOBO_GNOME_CFLAGS)
-
-lib_LTLIBRARIES = libebook.la
-
-libebook_la_SOURCES = \
- $(CORBA_SOURCE) \
- e-book-listener.c \
- e-book-view-listener.c \
- e-book-view.c \
- e-book.c \
- e-card-cursor.c \
- e-card-simple.c \
- e-card.c
-
-libebookincludedir = $(includedir)/evolution/ebook
-
-libebookinclude_HEADERS = \
- e-book-listener.h \
- e-book-types.h \
- e-book-view-listener.h \
- e-book-view.h \
- e-book.h \
- e-card-cursor.h \
- e-card-pairs.h \
- e-card-simple.h \
- e-card-types.h \
- e-card.h
-
-
-#
-# make a static library for use by addressbook's conduit's shared library
-#
-noinst_LTLIBRARIES = libebook-static.la
-libebook_static_la_SOURCES = $(libebook_la_SOURCES)
-libebook_static_la_LDFLAGS = --all-static
-
-
-test_client_SOURCES = \
- test-client.c
-
-test_client_LDADD = \
- libebook.la \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/e-util/libeutil.la
-
-test_client_list_SOURCES = \
- test-client-list.c
-
-test_client_list_LDADD = \
- libebook.la \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/e-util/libeutil.la
-
-test_card_SOURCES = \
- test-card.c
-
-test_card_LDADD = \
- libebook.la \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/e-util/libeutil.la
-
-
-load_pine_addressbook_SOURCES = \
- load-pine-addressbook.c
-
-load_pine_addressbook_LDADD = \
- libebook.la \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/e-util/libeutil.la
-
-
-load_gnomecard_addressbook_SOURCES = \
- load-gnomecard-addressbook.c
-
-load_gnomecard_addressbook_LDADD = \
- libebook.la \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/e-util/libeutil.la
-
-
-BUILT_SOURCES = $(CORBA_SOURCE)
-CLEANFILES += $(BUILT_SOURCES)
diff --git a/addressbook/backend/ebook/TODO b/addressbook/backend/ebook/TODO
deleted file mode 100644
index a69703cd92..0000000000
--- a/addressbook/backend/ebook/TODO
+++ /dev/null
@@ -1,2 +0,0 @@
-* Make sure open_book_progress does not use the EBook op queue; make
- sure it works.
diff --git a/addressbook/backend/ebook/e-book-listener.c b/addressbook/backend/ebook/e-book-listener.c
deleted file mode 100644
index 5efdaa37df..0000000000
--- a/addressbook/backend/ebook/e-book-listener.c
+++ /dev/null
@@ -1,587 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Exports the BookListener interface. Maintains a queue of messages
- * which come in on the interface.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-book-listener.h"
-
-static EBookStatus e_book_listener_convert_status (Evolution_BookListener_CallStatus status);
-
-enum {
- RESPONSES_QUEUED,
- LAST_SIGNAL
-};
-
-static guint e_book_listener_signals [LAST_SIGNAL];
-
-static BonoboObjectClass *e_book_listener_parent_class;
-POA_Evolution_BookListener__vepv e_book_listener_vepv;
-
-struct _EBookListenerPrivate {
- GList *response_queue;
- gint idle_id;
-};
-
-static gboolean
-e_book_listener_check_queue (EBookListener *listener)
-{
- if (listener->priv->response_queue != NULL) {
- gtk_signal_emit (GTK_OBJECT (listener),
- e_book_listener_signals [RESPONSES_QUEUED]);
- }
-
- if (listener->priv->response_queue == NULL) {
- listener->priv->idle_id = 0;
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-e_book_listener_queue_response (EBookListener *listener,
- EBookListenerResponse *response)
-{
- listener->priv->response_queue =
- g_list_append (listener->priv->response_queue,
- response);
-
- if (listener->priv->idle_id == 0) {
- listener->priv->idle_id = g_idle_add (
- (GSourceFunc) e_book_listener_check_queue, listener);
- }
-}
-
-/* Add, Remove, Modify */
-static void
-e_book_listener_queue_generic_response (EBookListener *listener,
- EBookListenerOperation op,
- EBookStatus status)
-{
- EBookListenerResponse *resp;
-
- resp = g_new0 (EBookListenerResponse, 1);
-
- resp->op = op;
- resp->status = status;
-
- e_book_listener_queue_response (listener, resp);
-}
-
-static void
-e_book_listener_queue_open_response (EBookListener *listener,
- EBookStatus status,
- Evolution_Book book)
-{
- EBookListenerResponse *resp;
-
- resp = g_new0 (EBookListenerResponse, 1);
-
- resp->op = OpenBookResponse;
- resp->status = status;
- resp->book = book;
-
- e_book_listener_queue_response (listener, resp);
-}
-
-static void
-e_book_listener_queue_open_progress (EBookListener *listener,
- const char *msg,
- short percent)
-{
- EBookListenerResponse *resp;
-
- resp = g_new0 (EBookListenerResponse, 1);
-
- resp->op = OpenProgressEvent;
- resp->msg = g_strdup (msg);
- resp->percent = percent;
-
- e_book_listener_queue_response (listener, resp);
-}
-
-
-static void
-e_book_listener_queue_create_card_response (EBookListener *listener,
- EBookStatus status,
- const char *id)
-{
- EBookListenerResponse *resp;
-
- resp = g_new0 (EBookListenerResponse, 1);
-
- resp->op = CreateCardResponse;
- resp->status = status;
- resp->id = g_strdup (id);
-
- e_book_listener_queue_response (listener, resp);
-}
-
-static void
-e_book_listener_queue_get_cursor_response (EBookListener *listener,
- EBookStatus status,
- Evolution_CardCursor cursor)
-{
- EBookListenerResponse *resp;
-
- resp = g_new0 (EBookListenerResponse, 1);
-
- resp->op = GetCursorResponse;
- resp->status = status;
- resp->cursor = cursor;
-
- e_book_listener_queue_response (listener, resp);
-}
-
-static void
-e_book_listener_queue_get_view_response (EBookListener *listener,
- EBookStatus status,
- Evolution_BookView book_view)
-{
- EBookListenerResponse *resp;
-
- resp = g_new0 (EBookListenerResponse, 1);
-
- resp->op = GetBookViewResponse;
- resp->status = status;
- resp->book_view = book_view;
-
- e_book_listener_queue_response (listener, resp);
-}
-
-static void
-e_book_listener_queue_link_status (EBookListener *listener,
- gboolean connected)
-{
- EBookListenerResponse *resp;
-
- resp = g_new0 (EBookListenerResponse, 1);
-
- resp->op = LinkStatusEvent;
- resp->connected = connected;
-
- e_book_listener_queue_response (listener, resp);
-}
-
-static void
-impl_BookListener_respond_create_card (PortableServer_Servant servant,
- const Evolution_BookListener_CallStatus status,
- const Evolution_CardId id,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant));
-
- e_book_listener_queue_create_card_response (
- listener,
- e_book_listener_convert_status (status),
- id);
-}
-
-static void
-impl_BookListener_respond_remove_card (PortableServer_Servant servant,
- const Evolution_BookListener_CallStatus status,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant));
-
- e_book_listener_queue_generic_response (
- listener, RemoveCardResponse,
- e_book_listener_convert_status (status));
-}
-
-static void
-impl_BookListener_respond_modify_card (PortableServer_Servant servant,
- const Evolution_BookListener_CallStatus status,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant));
-
- e_book_listener_queue_generic_response (
- listener, ModifyCardResponse,
- e_book_listener_convert_status (status));
-}
-
-static void
-impl_BookListener_respond_get_cursor (PortableServer_Servant servant,
- const Evolution_BookListener_CallStatus status,
- const Evolution_CardCursor cursor,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant));
- Evolution_CardCursor cursor_copy;
-
- cursor_copy = CORBA_Object_duplicate (cursor, ev);
-
- if (ev->_major != CORBA_NO_EXCEPTION) {
- g_warning ("EBookListener: Exception while duplicating CardCursor!\n");
- return;
- }
-
- e_book_listener_queue_get_cursor_response (
- listener,
- e_book_listener_convert_status (status),
- cursor_copy);
-}
-
-static void
-impl_BookListener_respond_get_view (PortableServer_Servant servant,
- const Evolution_BookListener_CallStatus status,
- const Evolution_BookView book_view,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant));
- Evolution_BookView book_view_copy;
-
- book_view_copy = CORBA_Object_duplicate (book_view, ev);
-
- if (ev->_major != CORBA_NO_EXCEPTION) {
- g_warning ("EBookListener: Exception while duplicating BookView.\n");
- return;
- }
-
- e_book_listener_queue_get_view_response (
- listener,
- e_book_listener_convert_status (status),
- book_view_copy);
-}
-
-static void
-impl_BookListener_respond_open_book (PortableServer_Servant servant,
- const Evolution_BookListener_CallStatus status,
- const Evolution_Book book,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant));
- Evolution_Book book_copy;
-
- book_copy = CORBA_Object_duplicate (book, ev);
-
- if (ev->_major != CORBA_NO_EXCEPTION) {
- g_warning ("EBookListener: Exception while duplicating Book!\n");
- return;
- }
-
- e_book_listener_queue_open_response (
- listener,
- e_book_listener_convert_status (status),
- book_copy);
-}
-
-static void
-impl_BookListener_report_open_book_progress (PortableServer_Servant servant,
- const CORBA_char *status_message,
- const CORBA_short percent,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant));
-
- e_book_listener_queue_open_progress (
- listener, status_message, percent);
-}
-
-static void
-impl_BookListener_report_connection_status (PortableServer_Servant servant,
- const CORBA_boolean connected,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant));
-
- e_book_listener_queue_link_status (
- listener, connected);
-}
-
-/**
- * e_book_listener_check_pending:
- * @listener: the #EBookListener
- *
- * Returns: the number of items on the response queue,
- * or -1 if the @listener is isn't an #EBookListener.
- */
-int
-e_book_listener_check_pending (EBookListener *listener)
-{
- g_return_val_if_fail (listener != NULL, -1);
- g_return_val_if_fail (E_IS_BOOK_LISTENER (listener), -1);
-
- return g_list_length (listener->priv->response_queue);
-}
-
-/**
- * e_book_listener_pop_response:
- * @listener: the #EBookListener for which a request is to be popped
- *
- * Returns: an #EBookListenerResponse if there are responses on the
- * queue to be returned; %NULL if there aren't, or if the @listener
- * isn't an EBookListener.
- */
-EBookListenerResponse *
-e_book_listener_pop_response (EBookListener *listener)
-{
- EBookListenerResponse *resp;
- GList *popped;
-
- g_return_val_if_fail (listener != NULL, NULL);
- g_return_val_if_fail (E_IS_BOOK_LISTENER (listener), NULL);
-
- if (listener->priv->response_queue == NULL)
- return NULL;
-
- resp = listener->priv->response_queue->data;
-
- popped = listener->priv->response_queue;
- listener->priv->response_queue =
- g_list_remove_link (listener->priv->response_queue,
- listener->priv->response_queue);
- g_list_free_1 (popped);
-
- return resp;
-}
-
-static EBookStatus
-e_book_listener_convert_status (const Evolution_BookListener_CallStatus status)
-{
- switch (status) {
- case Evolution_BookListener_Success:
- return E_BOOK_STATUS_SUCCESS;
- case Evolution_BookListener_RepositoryOffline:
- return E_BOOK_STATUS_REPOSITORY_OFFLINE;
- case Evolution_BookListener_PermissionDenied:
- return E_BOOK_STATUS_PERMISSION_DENIED;
- case Evolution_BookListener_CardNotFound:
- return E_BOOK_STATUS_CARD_NOT_FOUND;
- case Evolution_BookListener_ProtocolNotSupported:
- return E_BOOK_STATUS_PROTOCOL_NOT_SUPPORTED;
- case Evolution_BookListener_OtherError:
- return E_BOOK_STATUS_OTHER_ERROR;
- default:
- g_warning ("e_book_listener_convert_status: Unknown status "
- "from card server: %d\n", (int) status);
- return E_BOOK_STATUS_UNKNOWN;
-
- }
-}
-
-static EBookListener *
-e_book_listener_construct (EBookListener *listener)
-{
- POA_Evolution_BookListener *servant;
- CORBA_Environment ev;
- CORBA_Object obj;
-
- g_assert (listener != NULL);
- g_assert (E_IS_BOOK_LISTENER (listener));
-
- servant = (POA_Evolution_BookListener *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &e_book_listener_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_BookListener__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
-
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- obj = bonobo_object_activate_servant (BONOBO_OBJECT (listener), servant);
- if (obj == CORBA_OBJECT_NIL) {
- g_free (servant);
-
- return NULL;
- }
-
- bonobo_object_construct (BONOBO_OBJECT (listener), obj);
-
- return listener;
-}
-
-/**
- * e_book_listener_new:
- * @book: the #EBook for which the listener is to be bound
- *
- * Creates and returns a new #EBookListener for the book.
- *
- * Returns: a new #EBookListener
- */
-EBookListener *
-e_book_listener_new ()
-{
- EBookListener *listener;
- EBookListener *retval;
-
- listener = gtk_type_new (E_BOOK_LISTENER_TYPE);
-
- retval = e_book_listener_construct (listener);
-
- if (retval == NULL) {
- g_warning ("e_book_listener_new: Error constructing "
- "EBookListener!\n");
- gtk_object_unref (GTK_OBJECT (listener));
- return NULL;
- }
-
- return retval;
-}
-
-static void
-e_book_listener_init (EBookListener *listener)
-{
- listener->priv = g_new0 (EBookListenerPrivate, 1);
-}
-
-static void
-e_book_listener_destroy (GtkObject *object)
-{
- EBookListener *listener = E_BOOK_LISTENER (object);
- GList *l;
-
- for (l = listener->priv->response_queue; l != NULL; l = l->next) {
- EBookListenerResponse *resp = l->data;
-
- g_free (resp->msg);
- g_free (resp->id);
-
- if (resp->book != CORBA_OBJECT_NIL) {
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- CORBA_Object_release (resp->book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_listener_destroy: "
- "Exception destroying book "
- "in response queue!\n");
- }
-
- CORBA_exception_free (&ev);
- }
-
- if (resp->cursor != CORBA_OBJECT_NIL) {
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- CORBA_Object_release (resp->cursor, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_listener_destroy: "
- "Exception destroying cursor "
- "in response queue!\n");
- }
-
- CORBA_exception_free (&ev);
- }
-
- if (resp->book_view != CORBA_OBJECT_NIL) {
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- CORBA_Object_release (resp->book_view, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_listener_destroy: "
- "Exception destroying book_view "
- "in response queue!\n");
- }
-
- CORBA_exception_free (&ev);
- }
-
- g_free (resp);
- }
- g_list_free (listener->priv->response_queue);
-
- g_free (listener->priv);
-
- GTK_OBJECT_CLASS (e_book_listener_parent_class)->destroy (object);
-}
-
-POA_Evolution_BookListener__epv *
-e_book_listener_get_epv (void)
-{
- POA_Evolution_BookListener__epv *epv;
-
- epv = g_new0 (POA_Evolution_BookListener__epv, 1);
-
- epv->report_open_book_progress = impl_BookListener_report_open_book_progress;
- epv->respond_open_book = impl_BookListener_respond_open_book;
-
- epv->respond_create_card = impl_BookListener_respond_create_card;
- epv->respond_remove_card = impl_BookListener_respond_remove_card;
- epv->respond_modify_card = impl_BookListener_respond_modify_card;
-
- epv->respond_get_cursor = impl_BookListener_respond_get_cursor;
- epv->respond_get_view = impl_BookListener_respond_get_view;
-
- epv->report_connection_status = impl_BookListener_report_connection_status;
-
- return epv;
-}
-
-static void
-e_book_listener_corba_class_init (void)
-{
- e_book_listener_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
- e_book_listener_vepv.Evolution_BookListener_epv = e_book_listener_get_epv ();
-}
-
-static void
-e_book_listener_class_init (EBookListenerClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- e_book_listener_parent_class = gtk_type_class (bonobo_object_get_type ());
-
- e_book_listener_signals [RESPONSES_QUEUED] =
- gtk_signal_new ("responses_queued",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EBookListenerClass, responses_queued),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_book_listener_signals, LAST_SIGNAL);
-
- object_class->destroy = e_book_listener_destroy;
-
- e_book_listener_corba_class_init ();
-}
-
-/**
- * e_book_listener_get_type:
- */
-GtkType
-e_book_listener_get_type (void)
-{
- static GtkType type = 0;
-
- if (! type) {
- GtkTypeInfo info = {
- "EBookListener",
- sizeof (EBookListener),
- sizeof (EBookListenerClass),
- (GtkClassInitFunc) e_book_listener_class_init,
- (GtkObjectInitFunc) e_book_listener_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (bonobo_object_get_type (), &info);
- }
-
- return type;
-}
diff --git a/addressbook/backend/ebook/e-book-listener.h b/addressbook/backend/ebook/e-book-listener.h
deleted file mode 100644
index eb0432e360..0000000000
--- a/addressbook/backend/ebook/e-book-listener.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * A client-side GtkObject which exposes the
- * Evolution:BookListener interface.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#ifndef __E_BOOK_LISTENER_H__
-#define __E_BOOK_LISTENER_H__
-
-#include <libgnome/gnome-defs.h>
-#include <bonobo/bonobo-object.h>
-#include <ebook/addressbook.h>
-#include <ebook/e-book-types.h>
-
-BEGIN_GNOME_DECLS
-
-typedef struct _EBookListener EBookListener;
-typedef struct _EBookListenerClass EBookListenerClass;
-typedef struct _EBookListenerPrivate EBookListenerPrivate;
-
-struct _EBookListener {
- BonoboObject parent;
- EBookListenerPrivate *priv;
-};
-
-struct _EBookListenerClass {
- BonoboObjectClass parent;
-
- /*
- * Signals
- */
- void (*responses_queued) (void);
-};
-
-typedef enum {
- /* Async responses */
- OpenBookResponse,
- CreateCardResponse,
- RemoveCardResponse,
- ModifyCardResponse,
- GetCursorResponse,
- GetBookViewResponse,
-
- /* Async events */
- LinkStatusEvent,
- OpenProgressEvent,
-} EBookListenerOperation;
-
-typedef struct {
- EBookListenerOperation op;
-
- /* For most Response notifications */
- EBookStatus status;
-
- /* For OpenBookResponse */
- Evolution_Book book;
-
- /* For GetCursorResponse */
- Evolution_CardCursor cursor;
-
- /* For GetBookViewReponse */
- Evolution_BookView book_view;
-
- /* For OpenProgressEvent */
- char *msg;
- short percent;
-
- /* For LinkStatusEvent */
- gboolean connected;
-
- /* For Card[Added|Removed|Modified]Event */
- char *id;
-} EBookListenerResponse;
-
-EBookListener *e_book_listener_new (void);
-int e_book_listener_check_pending (EBookListener *listener);
-EBookListenerResponse *e_book_listener_pop_response (EBookListener *listener);
-GtkType e_book_listener_get_type (void);
-
-POA_Evolution_BookListener__epv *e_book_listener_get_epv (void);
-
-#define E_BOOK_LISTENER_TYPE (e_book_listener_get_type ())
-#define E_BOOK_LISTENER(o) (GTK_CHECK_CAST ((o), E_BOOK_LISTENER_TYPE, EBookListener))
-#define E_BOOK_LISTENER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_BOOK_LISTENER_TYPE, EBookListenerClass))
-#define E_IS_BOOK_LISTENER(o) (GTK_CHECK_TYPE ((o), E_BOOK_LISTENER_TYPE))
-#define E_IS_BOOK_LISTENER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_BOOK_LISTENER_TYPE))
-
-END_GNOME_DECLS
-
-#endif /* ! __E_BOOK_LISTENER_H__ */
diff --git a/addressbook/backend/ebook/e-book-types.h b/addressbook/backend/ebook/e-book-types.h
deleted file mode 100644
index a3e8bbc032..0000000000
--- a/addressbook/backend/ebook/e-book-types.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * A client-side GtkObject which exposes the
- * Evolution:BookListener interface.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#ifndef __E_BOOK_TYPES_H__
-#define __E_BOOK_TYPES_H__
-
-#include <libgnome/gnome-defs.h>
-
-BEGIN_GNOME_DECLS
-
-typedef enum {
- E_BOOK_STATUS_SUCCESS,
- E_BOOK_STATUS_UNKNOWN,
- E_BOOK_STATUS_REPOSITORY_OFFLINE,
- E_BOOK_STATUS_PERMISSION_DENIED,
- E_BOOK_STATUS_CARD_NOT_FOUND,
- E_BOOK_STATUS_PROTOCOL_NOT_SUPPORTED,
- E_BOOK_STATUS_OTHER_ERROR
-} EBookStatus;
-
-END_GNOME_DECLS
-
-#endif /* ! __E_BOOK_TYPES_H__ */
diff --git a/addressbook/backend/ebook/e-book-view-listener.c b/addressbook/backend/ebook/e-book-view-listener.c
deleted file mode 100644
index be871d65d7..0000000000
--- a/addressbook/backend/ebook/e-book-view-listener.c
+++ /dev/null
@@ -1,374 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Exports the BookViewListener interface. Maintains a queue of messages
- * which come in on the interface.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-book-view-listener.h"
-#include "e-book-view.h"
-#include "e-card.h"
-
-enum {
- RESPONSES_QUEUED,
- LAST_SIGNAL
-};
-
-static guint e_book_view_listener_signals [LAST_SIGNAL];
-
-static BonoboObjectClass *e_book_view_listener_parent_class;
-POA_Evolution_BookViewListener__vepv e_book_view_listener_vepv;
-
-struct _EBookViewListenerPrivate {
- GList *response_queue;
- gint idle_id;
-};
-
-static gboolean
-e_book_view_listener_check_queue (EBookViewListener *listener)
-{
- if (listener->priv->response_queue != NULL) {
- gtk_signal_emit (GTK_OBJECT (listener),
- e_book_view_listener_signals [RESPONSES_QUEUED]);
- }
-
- if (listener->priv->response_queue == NULL) {
- listener->priv->idle_id = 0;
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-e_book_view_listener_queue_response (EBookViewListener *listener,
- EBookViewListenerResponse *response)
-{
- listener->priv->response_queue =
- g_list_append (listener->priv->response_queue,
- response);
-
- if (listener->priv->idle_id == 0) {
- listener->priv->idle_id = g_idle_add (
- (GSourceFunc) e_book_view_listener_check_queue, listener);
- }
-}
-
-/* Add, Remove, Modify */
-static void
-e_book_view_listener_queue_empty_event (EBookViewListener *listener,
- EBookViewListenerOperation op)
-{
- EBookViewListenerResponse *resp;
-
- resp = g_new0 (EBookViewListenerResponse, 1);
-
- resp->op = op;
- resp->id = NULL;
- resp->cards = NULL;
-
- e_book_view_listener_queue_response (listener, resp);
-}
-
-/* Add, Remove, Modify */
-static void
-e_book_view_listener_queue_id_event (EBookViewListener *listener,
- EBookViewListenerOperation op,
- const char *id)
-{
- EBookViewListenerResponse *resp;
-
- resp = g_new0 (EBookViewListenerResponse, 1);
-
- resp->op = op;
- resp->id = g_strdup (id);
- resp->cards = NULL;
-
- e_book_view_listener_queue_response (listener, resp);
-}
-
-/* Add, Remove, Modify */
-static void
-e_book_view_listener_queue_sequence_event (EBookViewListener *listener,
- EBookViewListenerOperation op,
- const Evolution_VCardList *cards)
-{
- EBookViewListenerResponse *resp;
- int i;
-
- resp = g_new0 (EBookViewListenerResponse, 1);
-
- resp->op = op;
- resp->id = NULL;
- resp->cards = NULL;
-
- for ( i = 0; i < cards->_length; i++ ) {
- resp->cards = g_list_append(resp->cards, e_card_new(cards->_buffer[i]));
- }
-
- e_book_view_listener_queue_response (listener, resp);
-}
-
-static void
-impl_BookViewListener_signal_card_added (PortableServer_Servant servant,
- const Evolution_VCardList *cards,
- CORBA_Environment *ev)
-{
- EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object_from_servant (servant));
-
- e_book_view_listener_queue_sequence_event (
- listener, CardAddedEvent, cards);
-}
-
-static void
-impl_BookViewListener_signal_card_removed (PortableServer_Servant servant,
- const Evolution_CardId id,
- CORBA_Environment *ev)
-{
- EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object_from_servant (servant));
-
- e_book_view_listener_queue_id_event (
- listener, CardRemovedEvent, (const char *) id);
-}
-
-static void
-impl_BookViewListener_signal_card_changed (PortableServer_Servant servant,
- const Evolution_VCardList *cards,
- CORBA_Environment *ev)
-{
- EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object_from_servant (servant));
-
- e_book_view_listener_queue_sequence_event (
- listener, CardModifiedEvent, cards);
-}
-
-static void
-impl_BookViewListener_signal_sequence_complete (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object_from_servant (servant));
-
- e_book_view_listener_queue_empty_event (listener, SequenceCompleteEvent);
-}
-
-/**
- * e_book_view_listener_check_pending:
- * @listener: the #EBookViewListener
- *
- * Returns: the number of items on the response queue,
- * or -1 if the @listener is isn't an #EBookViewListener.
- */
-int
-e_book_view_listener_check_pending (EBookViewListener *listener)
-{
- g_return_val_if_fail (listener != NULL, -1);
- g_return_val_if_fail (E_IS_BOOK_VIEW_LISTENER (listener), -1);
-
- return g_list_length (listener->priv->response_queue);
-}
-
-/**
- * e_book_view_listener_pop_response:
- * @listener: the #EBookViewListener for which a request is to be popped
- *
- * Returns: an #EBookViewListenerResponse if there are responses on the
- * queue to be returned; %NULL if there aren't, or if the @listener
- * isn't an EBookViewListener.
- */
-EBookViewListenerResponse *
-e_book_view_listener_pop_response (EBookViewListener *listener)
-{
- EBookViewListenerResponse *resp;
- GList *popped;
-
- g_return_val_if_fail (listener != NULL, NULL);
- g_return_val_if_fail (E_IS_BOOK_VIEW_LISTENER (listener), NULL);
-
- if (listener->priv->response_queue == NULL)
- return NULL;
-
- resp = listener->priv->response_queue->data;
-
- popped = listener->priv->response_queue;
- listener->priv->response_queue =
- g_list_remove_link (listener->priv->response_queue,
- listener->priv->response_queue);
- g_list_free_1 (popped);
-
- return resp;
-}
-
-static EBookViewListener *
-e_book_view_listener_construct (EBookViewListener *listener)
-{
- POA_Evolution_BookViewListener *servant;
- CORBA_Environment ev;
- CORBA_Object obj;
-
- g_assert (listener != NULL);
- g_assert (E_IS_BOOK_VIEW_LISTENER (listener));
-
- servant = (POA_Evolution_BookViewListener *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &e_book_view_listener_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_BookViewListener__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
-
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- obj = bonobo_object_activate_servant (BONOBO_OBJECT (listener), servant);
- if (obj == CORBA_OBJECT_NIL) {
- g_free (servant);
-
- return NULL;
- }
-
- bonobo_object_construct (BONOBO_OBJECT (listener), obj);
-
- return listener;
-}
-
-/**
- * e_book_view_listener_new:
- * @book: the #EBookView for which the listener is to be bound
- *
- * Creates and returns a new #EBookViewListener for the book.
- *
- * Returns: a new #EBookViewListener
- */
-EBookViewListener *
-e_book_view_listener_new ()
-{
- EBookViewListener *listener;
- EBookViewListener *retval;
-
- listener = gtk_type_new (E_BOOK_VIEW_LISTENER_TYPE);
-
- retval = e_book_view_listener_construct (listener);
-
- if (retval == NULL) {
- g_warning ("e_book_view_listener_new: Error constructing "
- "EBookViewListener!\n");
- gtk_object_unref (GTK_OBJECT (listener));
- return NULL;
- }
-
- return retval;
-}
-
-static void
-e_book_view_listener_init (EBookViewListener *listener)
-{
- listener->priv = g_new0 (EBookViewListenerPrivate, 1);
- listener->priv->response_queue = NULL;
- listener->priv->idle_id = 0;
-}
-
-static void
-e_book_view_listener_destroy (GtkObject *object)
-{
- EBookViewListener *listener = E_BOOK_VIEW_LISTENER (object);
- GList *l;
-
- if (listener->priv->idle_id)
- g_source_remove(listener->priv->idle_id);
-
- for (l = listener->priv->response_queue; l != NULL; l = l->next) {
- EBookViewListenerResponse *resp = l->data;
- if (resp->id)
- g_free(resp->id);
- if (resp->cards) {
- g_list_foreach(resp->cards, (GFunc) gtk_object_unref, NULL);
- g_list_free(resp->cards);
- }
- g_free (resp);
- }
- g_list_free (listener->priv->response_queue);
-
- g_free (listener->priv);
-
- GTK_OBJECT_CLASS (e_book_view_listener_parent_class)->destroy (object);
-}
-
-POA_Evolution_BookViewListener__epv *
-e_book_view_listener_get_epv (void)
-{
- POA_Evolution_BookViewListener__epv *epv;
-
- epv = g_new0 (POA_Evolution_BookViewListener__epv, 1);
-
- epv->signal_card_changed = impl_BookViewListener_signal_card_changed;
- epv->signal_card_removed = impl_BookViewListener_signal_card_removed;
- epv->signal_card_added = impl_BookViewListener_signal_card_added;
- epv->signal_sequence_complete = impl_BookViewListener_signal_sequence_complete;
-
- return epv;
-}
-
-static void
-e_book_view_listener_corba_class_init (void)
-{
- e_book_view_listener_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
- e_book_view_listener_vepv.Evolution_BookViewListener_epv = e_book_view_listener_get_epv ();
-}
-
-static void
-e_book_view_listener_class_init (EBookViewListenerClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- e_book_view_listener_parent_class = gtk_type_class (bonobo_object_get_type ());
-
- e_book_view_listener_signals [RESPONSES_QUEUED] =
- gtk_signal_new ("responses_queued",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EBookViewListenerClass, responses_queued),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_book_view_listener_signals, LAST_SIGNAL);
-
- object_class->destroy = e_book_view_listener_destroy;
-
- e_book_view_listener_corba_class_init ();
-}
-
-/**
- * e_book_view_listener_get_type:
- */
-GtkType
-e_book_view_listener_get_type (void)
-{
- static GtkType type = 0;
-
- if (! type) {
- GtkTypeInfo info = {
- "EBookViewListener",
- sizeof (EBookViewListener),
- sizeof (EBookViewListenerClass),
- (GtkClassInitFunc) e_book_view_listener_class_init,
- (GtkObjectInitFunc) e_book_view_listener_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (bonobo_object_get_type (), &info);
- }
-
- return type;
-}
diff --git a/addressbook/backend/ebook/e-book-view-listener.h b/addressbook/backend/ebook/e-book-view-listener.h
deleted file mode 100644
index 65e5f8eb5b..0000000000
--- a/addressbook/backend/ebook/e-book-view-listener.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * A client-side GtkObject which exposes the
- * Evolution:BookViewListener interface.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#ifndef __E_BOOK_VIEW_LISTENER_H__
-#define __E_BOOK_VIEW_LISTENER_H__
-
-#include <libgnome/gnome-defs.h>
-#include <bonobo/bonobo-object.h>
-#include <addressbook/backend/ebook/addressbook.h>
-
-BEGIN_GNOME_DECLS
-
-typedef struct _EBookViewListener EBookViewListener;
-typedef struct _EBookViewListenerClass EBookViewListenerClass;
-typedef struct _EBookViewListenerPrivate EBookViewListenerPrivate;
-
-struct _EBookViewListener {
- BonoboObject parent;
- EBookViewListenerPrivate *priv;
-};
-
-struct _EBookViewListenerClass {
- BonoboObjectClass parent;
-
- /*
- * Signals
- */
- void (*responses_queued) (void);
-};
-
-typedef enum {
- /* Async events */
- CardAddedEvent,
- CardRemovedEvent,
- CardModifiedEvent,
- SequenceCompleteEvent,
-} EBookViewListenerOperation;
-
-typedef struct {
- EBookViewListenerOperation op;
-
- /* For CardRemovedEvent */
- char *id;
-
- /* For Card[Added|Modified]Event */
- GList *cards; /* Of type ECard. */
-
-} EBookViewListenerResponse;
-
-EBookViewListener *e_book_view_listener_new (void);
-int e_book_view_listener_check_pending (EBookViewListener *listener);
-EBookViewListenerResponse *e_book_view_listener_pop_response (EBookViewListener *listener);
-GtkType e_book_view_listener_get_type (void);
-
-POA_Evolution_BookViewListener__epv *e_book_view_listener_get_epv (void);
-
-#define E_BOOK_VIEW_LISTENER_TYPE (e_book_view_listener_get_type ())
-#define E_BOOK_VIEW_LISTENER(o) (GTK_CHECK_CAST ((o), E_BOOK_VIEW_LISTENER_TYPE, EBookViewListener))
-#define E_BOOK_VIEW_LISTENER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_BOOK_VIEW_LISTENER_TYPE, EBookViewListenerClass))
-#define E_IS_BOOK_VIEW_LISTENER(o) (GTK_CHECK_TYPE ((o), E_BOOK_VIEW_LISTENER_TYPE))
-#define E_IS_BOOK_VIEW_LISTENER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_BOOK_VIEW_LISTENER_TYPE))
-
-END_GNOME_DECLS
-
-#endif /* ! __E_BOOK_VIEW_LISTENER_H__ */
diff --git a/addressbook/backend/ebook/e-book-view.c b/addressbook/backend/ebook/e-book-view.c
deleted file mode 100644
index f00a2efb08..0000000000
--- a/addressbook/backend/ebook/e-book-view.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * The Evolution addressbook client object.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 1999, 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkmarshal.h>
-
-#include "addressbook.h"
-#include "e-card-cursor.h"
-#include "e-book-view-listener.h"
-#include "e-book-view.h"
-
-GtkObjectClass *e_book_view_parent_class;
-
-struct _EBookViewPrivate {
- Evolution_BookView corba_book_view;
-
- EBookViewListener *listener;
-
- int responses_queued_id;
-};
-
-enum {
- CARD_CHANGED,
- CARD_REMOVED,
- CARD_ADDED,
- SEQUENCE_COMPLETE,
- LAST_SIGNAL
-};
-
-static guint e_book_view_signals [LAST_SIGNAL];
-
-static void
-e_book_view_do_added_event (EBookView *book_view,
- EBookViewListenerResponse *resp)
-{
- gtk_signal_emit (GTK_OBJECT (book_view), e_book_view_signals [CARD_ADDED],
- resp->cards);
-
- g_list_foreach (resp->cards, (GFunc) gtk_object_unref, NULL);
- g_list_free (resp->cards);
-}
-
-static void
-e_book_view_do_modified_event (EBookView *book_view,
- EBookViewListenerResponse *resp)
-{
- gtk_signal_emit (GTK_OBJECT (book_view), e_book_view_signals [CARD_CHANGED],
- resp->cards);
-
- g_list_foreach (resp->cards, (GFunc) gtk_object_unref, NULL);
- g_list_free (resp->cards);
-}
-
-static void
-e_book_view_do_removed_event (EBookView *book_view,
- EBookViewListenerResponse *resp)
-{
- gtk_signal_emit (GTK_OBJECT (book_view), e_book_view_signals [CARD_REMOVED],
- resp->id);
-
- g_free(resp->id);
-}
-
-static void
-e_book_view_do_complete_event (EBookView *book_view,
- EBookViewListenerResponse *resp)
-{
- gtk_signal_emit (GTK_OBJECT (book_view), e_book_view_signals [SEQUENCE_COMPLETE]);
-}
-
-
-/*
- * Reading notices out of the EBookViewListener's queue.
- */
-static void
-e_book_view_check_listener_queue (EBookViewListener *listener, EBookView *book_view)
-{
- EBookViewListenerResponse *resp;
-
- resp = e_book_view_listener_pop_response (listener);
-
- if (resp == NULL)
- return;
-
- switch (resp->op) {
- case CardAddedEvent:
- e_book_view_do_added_event (book_view, resp);
- break;
- case CardModifiedEvent:
- e_book_view_do_modified_event (book_view, resp);
- break;
- case CardRemovedEvent:
- e_book_view_do_removed_event (book_view, resp);
- break;
- case SequenceCompleteEvent:
- e_book_view_do_complete_event (book_view, resp);
- break;
- default:
- g_error ("EBookView: Unknown operation %d in listener queue!\n",
- resp->op);
- }
-
- g_free (resp);
-}
-
-static gboolean
-e_book_view_construct (EBookView *book_view, Evolution_BookView corba_book_view, EBookViewListener *listener)
-{
- CORBA_Environment ev;
- g_return_val_if_fail (book_view != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK_VIEW (book_view), FALSE);
-
- /*
- * Copy in the corba_book_view.
- */
- CORBA_exception_init (&ev);
-
- book_view->priv->corba_book_view = CORBA_Object_duplicate(corba_book_view, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_view_construct: Exception duplicating corba_book_view.\n");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- Evolution_BookView_ref(book_view->priv->corba_book_view, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_view_construct: Exception reffing corba_book_view.\n");
- CORBA_exception_free (&ev);
- CORBA_exception_init (&ev);
- CORBA_Object_release (book_view->priv->corba_book_view, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_view_construct: Exception releasing corba_book_view.\n");
- }
- CORBA_exception_free (&ev);
- book_view->priv->corba_book_view = NULL;
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- /*
- * Create our local BookListener interface.
- */
- book_view->priv->listener = listener;
-
- bonobo_object_ref(BONOBO_OBJECT(book_view->priv->listener));
- book_view->priv->responses_queued_id = gtk_signal_connect (GTK_OBJECT (book_view->priv->listener), "responses_queued",
- e_book_view_check_listener_queue, book_view);
-
- return TRUE;
-}
-
-/**
- * e_book_view_new:
- */
-EBookView *
-e_book_view_new (Evolution_BookView corba_book_view, EBookViewListener *listener)
-{
- EBookView *book_view;
-
- book_view = gtk_type_new (E_BOOK_VIEW_TYPE);
-
- if (! e_book_view_construct (book_view, corba_book_view, listener)) {
- gtk_object_unref (GTK_OBJECT (book_view));
- return NULL;
- }
-
- return book_view;
-}
-
-static void
-e_book_view_init (EBookView *book_view)
-{
- book_view->priv = g_new0 (EBookViewPrivate, 1);
- book_view->priv->corba_book_view = CORBA_OBJECT_NIL;
- book_view->priv->listener = NULL;
- book_view->priv->responses_queued_id = 0;
-}
-
-static void
-e_book_view_destroy (GtkObject *object)
-{
- EBookView *book_view = E_BOOK_VIEW (object);
- CORBA_Environment ev;
-
- if (book_view->priv->corba_book_view) {
- CORBA_exception_init (&ev);
-
- Evolution_BookView_unref(book_view->priv->corba_book_view, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("EBookView: Exception while unreffing BookView\n");
-
- CORBA_exception_free (&ev);
- CORBA_exception_init (&ev);
- }
-
- CORBA_Object_release (book_view->priv->corba_book_view, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("EBookView: Exception while releasing BookView\n");
- }
-
- CORBA_exception_free (&ev);
- }
-
- if (book_view->priv->listener) {
- if (book_view->priv->responses_queued_id)
- gtk_signal_disconnect(GTK_OBJECT(book_view->priv->listener),
- book_view->priv->responses_queued_id);
- bonobo_object_unref (BONOBO_OBJECT(book_view->priv->listener));
- }
-
- g_free (book_view->priv);
-
- if (GTK_OBJECT_CLASS (e_book_view_parent_class)->destroy)
- GTK_OBJECT_CLASS (e_book_view_parent_class)->destroy (object);
-}
-
-static void
-e_book_view_class_init (EBookViewClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- e_book_view_parent_class = gtk_type_class (gtk_object_get_type ());
-
- e_book_view_signals [CARD_CHANGED] =
- gtk_signal_new ("card_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EBookViewClass, card_changed),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
-
- e_book_view_signals [CARD_ADDED] =
- gtk_signal_new ("card_added",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EBookViewClass, card_added),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
-
- e_book_view_signals [CARD_REMOVED] =
- gtk_signal_new ("card_removed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EBookViewClass, card_removed),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
-
- e_book_view_signals [SEQUENCE_COMPLETE] =
- gtk_signal_new ("sequence_complete",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EBookViewClass, sequence_complete),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_book_view_signals,
- LAST_SIGNAL);
-
- object_class->destroy = e_book_view_destroy;
-}
-
-/**
- * e_book_view_get_type:
- */
-GtkType
-e_book_view_get_type (void)
-{
- static GtkType type = 0;
-
- if (! type) {
- GtkTypeInfo info = {
- "EBookView",
- sizeof (EBookView),
- sizeof (EBookViewClass),
- (GtkClassInitFunc) e_book_view_class_init,
- (GtkObjectInitFunc) e_book_view_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
diff --git a/addressbook/backend/ebook/e-book-view.h b/addressbook/backend/ebook/e-book-view.h
deleted file mode 100644
index b8edc68018..0000000000
--- a/addressbook/backend/ebook/e-book-view.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * The Evolution addressbook client object.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 1999, 2000, Helix Code, Inc.
- */
-
-#ifndef __E_BOOK_VIEW_H__
-#define __E_BOOK_VIEW_H__
-
-#include <libgnome/gnome-defs.h>
-
-#include <addressbook/backend/ebook/e-card.h>
-#include <addressbook/backend/ebook/e-book-view-listener.h>
-
-BEGIN_GNOME_DECLS
-
-typedef struct _EBookView EBookView;
-typedef struct _EBookViewClass EBookViewClass;
-typedef struct _EBookViewPrivate EBookViewPrivate;
-
-struct _EBookView {
- GtkObject parent;
- EBookViewPrivate *priv;
-};
-
-struct _EBookViewClass {
- GtkObjectClass parent;
-
- /*
- * Signals.
- */
- void (* card_changed) (EBookView *book_view, const GList *cards);
- void (* card_removed) (EBookView *book_view, const char *id);
- void (* card_added) (EBookView *book_view, const GList *cards);
- void (* sequence_complete) (EBookView *book_view);
-};
-
-/* Creating a new addressbook. */
-EBookView *e_book_view_new (Evolution_BookView corba_book_view, EBookViewListener *listener);
-
-GtkType e_book_view_get_type (void);
-void e_book_view_get_book_view_listener (EBookView *book_view);
-
-#define E_BOOK_VIEW_TYPE (e_book_view_get_type ())
-#define E_BOOK_VIEW(o) (GTK_CHECK_CAST ((o), E_BOOK_VIEW_TYPE, EBookView))
-#define E_BOOK_VIEW_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_BOOK_VIEW_TYPE, EBookViewClass))
-#define E_IS_BOOK_VIEW(o) (GTK_CHECK_TYPE ((o), E_BOOK_VIEW_TYPE))
-#define E_IS_BOOK_VIEW_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_BOOK_VIEW_TYPE))
-
-END_GNOME_DECLS
-
-#endif /* ! __E_BOOK_VIEW_H__ */
diff --git a/addressbook/backend/ebook/e-book.c b/addressbook/backend/ebook/e-book.c
deleted file mode 100644
index 38179559ba..0000000000
--- a/addressbook/backend/ebook/e-book.c
+++ /dev/null
@@ -1,1010 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * The Evolution addressbook client object.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 1999, 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkmarshal.h>
-
-#include "addressbook.h"
-#include "e-card-cursor.h"
-#include "e-book-listener.h"
-#include "e-book.h"
-
-GtkObjectClass *e_book_parent_class;
-
-#ifdef USING_OAF
-#include <liboaf/liboaf.h>
-#define CARDSERVER_OAF_ID "OAFIID:evolution:addressbook-server:0fbc844d-c721-4615-98d0-d67eacf42d80"
-#else
-#include <libgnorba/gnorba.h>
-#define CARDSERVER_GOAD_ID "evolution:addressbook-server"
-#endif
-
-typedef enum {
- URINotLoaded,
- URILoading,
- URILoaded
-} EBookLoadState;
-
-struct _EBookPrivate {
- Evolution_BookFactory book_factory;
- EBookListener *listener;
-
- Evolution_Book corba_book;
-
- EBookLoadState load_state;
-
- /*
- * The operation queue. New operations are appended to the
- * end of the queue. When responses come back from the PAS,
- * the op structures are popped off the front of the queue.
- */
- GList *pending_ops;
-};
-
-enum {
- OPEN_PROGRESS,
- LINK_STATUS,
- LAST_SIGNAL
-};
-
-static guint e_book_signals [LAST_SIGNAL];
-
-typedef struct {
- gpointer cb;
- gpointer closure;
- EBookViewListener *listener;
-} EBookOp;
-
-/*
- * Local response queue management.
- */
-static void
-e_book_queue_op (EBook *book,
- gpointer cb,
- gpointer closure,
- EBookViewListener *listener)
-{
- EBookOp *op;
-
- op = g_new0 (EBookOp, 1);
- op->cb = cb;
- op->closure = closure;
- op->listener = listener;
-
- book->priv->pending_ops =
- g_list_append (book->priv->pending_ops, op);
-}
-
-static EBookOp *
-e_book_pop_op (EBook *book)
-{
- GList *popped;
- EBookOp *op;
-
- if (book->priv->pending_ops == NULL)
- return NULL;
-
- op = book->priv->pending_ops->data;
-
- popped = book->priv->pending_ops;
- book->priv->pending_ops =
- g_list_remove_link (book->priv->pending_ops,
- book->priv->pending_ops);
-
- g_list_free_1 (popped);
-
- return op;
-}
-
-static void
-e_book_do_response_create_card (EBook *book,
- EBookListenerResponse *resp)
-{
- EBookOp *op;
-
- op = e_book_pop_op (book);
-
- if (op == NULL) {
- g_warning ("e_book_do_response_create_card: Cannot find operation "
- "in local op queue!\n");
- return;
- }
-
- if (op->cb)
- ((EBookIdCallback) op->cb) (book, resp->status, resp->id, op->closure);
- g_free (resp->id);
- g_free (op);
-}
-
-static void
-e_book_do_response_generic (EBook *book,
- EBookListenerResponse *resp)
-{
- EBookOp *op;
-
- op = e_book_pop_op (book);
-
- if (op == NULL) {
- g_warning ("e_book_do_response_generic: Cannot find operation "
- "in local op queue!\n");
- }
-
- if (op->cb)
- ((EBookCallback) op->cb) (book, resp->status, op->closure);
-
- g_free (op);
-}
-
-static void
-e_book_do_response_get_cursor (EBook *book,
- EBookListenerResponse *resp)
-{
- CORBA_Environment ev;
- EBookOp *op;
- ECardCursor *cursor;
-
- op = e_book_pop_op (book);
-
- if (op == NULL) {
- g_warning ("e_book_do_response_get_cursor: Cannot find operation "
- "in local op queue!\n");
- return;
- }
-
- cursor = e_card_cursor_new(resp->cursor);
-
- if (op->cb)
- ((EBookCursorCallback) op->cb) (book, resp->status, cursor, op->closure);
-
- /*
- * Release the remote Evolution_Book in the PAS.
- */
- CORBA_exception_init (&ev);
-
- Bonobo_Unknown_unref (resp->cursor, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_do_response_get_cursor: Exception unref'ing "
- "remote Evolution_CardCursor interface!\n");
- CORBA_exception_free (&ev);
- CORBA_exception_init (&ev);
- }
-
- CORBA_Object_release (resp->cursor, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_do_response_get_cursor: Exception releasing "
- "remote Evolution_CardCursor interface!\n");
- }
-
- CORBA_exception_free (&ev);
-
- gtk_object_unref(GTK_OBJECT(cursor));
-
- g_free (op);
-}
-
-static void
-e_book_do_response_get_view (EBook *book,
- EBookListenerResponse *resp)
-{
- CORBA_Environment ev;
- EBookOp *op;
- EBookView *book_view;
-
- op = e_book_pop_op (book);
-
- if (op == NULL) {
- g_warning ("e_book_do_response_get_view: Cannot find operation "
- "in local op queue!\n");
- return;
- }
-
- book_view = e_book_view_new(resp->book_view, op->listener);
-
- if (op->cb)
- ((EBookBookViewCallback) op->cb) (book, resp->status, book_view, op->closure);
-
- /*
- * Release the remote Evolution_Book in the PAS.
- */
- CORBA_exception_init (&ev);
-
- Bonobo_Unknown_unref (resp->book_view, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_do_response_get_view: Exception unref'ing "
- "remote Evolution_BookView interface!\n");
- CORBA_exception_free (&ev);
- CORBA_exception_init (&ev);
- }
-
- CORBA_Object_release (resp->book_view, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_do_response_get_view: Exception releasing "
- "remote Evolution_BookView interface!\n");
- }
-
- CORBA_exception_free (&ev);
-
- gtk_object_unref(GTK_OBJECT(book_view));
- bonobo_object_unref(BONOBO_OBJECT(op->listener));
-
- g_free (op);
-}
-
-static void
-e_book_do_response_open (EBook *book,
- EBookListenerResponse *resp)
-{
- EBookOp *op;
-
- if (resp->status == E_BOOK_STATUS_SUCCESS) {
- book->priv->corba_book = resp->book;
- book->priv->load_state = URILoaded;
- }
-
- op = e_book_pop_op (book);
-
- if (op == NULL) {
- g_warning ("e_book_do_response_open: Cannot find operation "
- "in local op queue!\n");
- return;
- }
-
- if (op->cb)
- ((EBookCallback) op->cb) (book, resp->status, op->closure);
- g_free (op);
-}
-
-static void
-e_book_do_progress_event (EBook *book,
- EBookListenerResponse *resp)
-{
- gtk_signal_emit (GTK_OBJECT (book), e_book_signals [OPEN_PROGRESS],
- resp->msg, resp->percent);
-
- g_free (resp->msg);
-}
-
-static void
-e_book_do_link_event (EBook *book,
- EBookListenerResponse *resp)
-{
- gtk_signal_emit (GTK_OBJECT (book), e_book_signals [LINK_STATUS],
- resp->connected);
-}
-
-
-/*
- * Reading notices out of the EBookListener's queue.
- */
-static void
-e_book_check_listener_queue (EBookListener *listener, EBook *book)
-{
- EBookListenerResponse *resp;
-
- resp = e_book_listener_pop_response (listener);
-
- if (resp == NULL)
- return;
-
- switch (resp->op) {
- case CreateCardResponse:
- e_book_do_response_create_card (book, resp);
- break;
- case RemoveCardResponse:
- case ModifyCardResponse:
- e_book_do_response_generic (book, resp);
- break;
- case GetCursorResponse:
- e_book_do_response_get_cursor (book, resp);
- break;
- case GetBookViewResponse:
- e_book_do_response_get_view(book, resp);
- break;
- case OpenBookResponse:
- e_book_do_response_open (book, resp);
- break;
-
- case OpenProgressEvent:
- e_book_do_progress_event (book, resp);
- break;
- case LinkStatusEvent:
- e_book_do_link_event (book, resp);
- break;
- default:
- g_error ("EBook: Unknown operation %d in listener queue!\n",
- resp->op);
- }
-
- g_free (resp);
-}
-
-/**
- * e_book_load_uri:
- */
-gboolean
-e_book_load_uri (EBook *book,
- const char *uri,
- EBookCallback open_response,
- gpointer closure)
-{
- CORBA_Environment ev;
-
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
- g_return_val_if_fail (uri != NULL, FALSE);
- g_return_val_if_fail (open_response != NULL, FALSE);
-
- if (book->priv->load_state != URINotLoaded) {
- g_warning ("e_book_load_uri: Attempted to load a URI "
- "on a book which already has a URI loaded!\n");
- return FALSE;
- }
-
- /*
- * Create our local BookListener interface.
- */
- book->priv->listener = e_book_listener_new ();
- if (book->priv->listener == NULL) {
- g_warning ("e_book_load_uri: Could not create EBookListener!\n");
- return FALSE;
- }
-
- gtk_signal_connect (GTK_OBJECT (book->priv->listener), "responses_queued",
- e_book_check_listener_queue, book);
-
- /*
- * Load the addressbook into the PAS.
- */
- CORBA_exception_init (&ev);
-
- Evolution_BookFactory_open_book (
- book->priv->book_factory, uri,
- bonobo_object_corba_objref (BONOBO_OBJECT (book->priv->listener)),
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_load_uri: CORBA exception while opening addressbook!\n");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- book->priv->load_state = URILoading;
-
- e_book_queue_op (book, open_response, closure, NULL);
-
- /* Now we play the waiting game. */
-
- return TRUE;
-}
-
-/**
- * e_book_unload_uri:
- */
-void
-e_book_unload_uri (EBook *book)
-{
- CORBA_Environment ev;
-
- g_return_if_fail (book != NULL);
- g_return_if_fail (E_IS_BOOK (book));
-
- /*
- * FIXME: Make sure this works if the URI is still being
- * loaded.
- */
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_unload_uri: No URI is loaded!\n");
- return;
- }
-
- /*
- * Release the remote Evolution_Book in the PAS.
- */
- CORBA_exception_init (&ev);
-
- Bonobo_Unknown_unref (book->priv->corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_unload_uri: Exception unref'ing "
- "remote Evolution_Book interface!\n");
- CORBA_exception_free (&ev);
- CORBA_exception_init (&ev);
- }
-
- CORBA_Object_release (book->priv->corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_unload_uri: Exception releasing "
- "remote book interface!\n");
- }
-
- CORBA_exception_free (&ev);
-
- bonobo_object_unref (BONOBO_OBJECT (book->priv->listener));
-
- book->priv->listener = NULL;
- book->priv->load_state = URINotLoaded;
-}
-
-static gboolean
-e_book_construct (EBook *book)
-{
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
-
- /*
- * Connect to the Personal Addressbook Server.
- */
-
-#ifdef USING_OAF
- book->priv->book_factory = (Evolution_BookFactory)
- oaf_activate_from_id (CARDSERVER_OAF_ID, 0, NULL, NULL);
-#else
- book->priv->book_factory = (Evolution_BookFactory)
- goad_server_activate_with_id (NULL, CARDSERVER_GOAD_ID, 0, NULL);
-#endif
-
- if (book->priv->book_factory == CORBA_OBJECT_NIL) {
- g_warning ("e_book_construct: Could not obtain a handle "
- "to the Personal Addressbook Server!\n");
- return FALSE;
- }
-
- return TRUE;
-}
-
-/**
- * e_book_new:
- */
-EBook *
-e_book_new (void)
-{
- EBook *book;
-
- book = gtk_type_new (E_BOOK_TYPE);
-
- if (! e_book_construct (book)) {
- gtk_object_unref (GTK_OBJECT (book));
- return NULL;
- }
-
- return book;
-}
-
-/* Fetching cards */
-
-/**
- * e_book_get_card:
- */
-ECard *
-e_book_get_card (EBook *book,
- const char *id)
-{
- char *vcard;
- ECard *card;
-
- g_return_val_if_fail (book != NULL, NULL);
- g_return_val_if_fail (E_IS_BOOK (book), NULL);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_get_card: No URI loaded!\n");
- return NULL;
- }
-
- vcard = e_book_get_vcard (book, id);
-
- if (vcard == NULL) {
- g_warning ("e_book_get_card: Got bogus VCard from PAS!\n");
- return NULL;
- }
-
- card = e_card_new (vcard);
- g_free(vcard);
-
- e_card_set_id(card, id);
-
- return card;
-}
-
-/**
- * e_book_get_vcard:
- */
-char *
-e_book_get_vcard (EBook *book,
- const char *id)
-{
- CORBA_Environment ev;
- char *retval;
- char *vcard;
-
- g_return_val_if_fail (book != NULL, NULL);
- g_return_val_if_fail (E_IS_BOOK (book), NULL);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_get_vcard: No URI loaded!\n");
- return NULL;
- }
-
- CORBA_exception_init (&ev);
-
- vcard = Evolution_Book_get_vcard (book->priv->corba_book,
- (Evolution_CardId) id,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_get_vcard: Exception getting VCard from PAS!\n");
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- if (vcard == NULL || strlen (vcard) == 0) {
- g_warning ("e_book_get_vcard: Got NULL VCard from PAS!\n");
- return NULL;
- }
-
- retval = g_strdup (vcard);
- CORBA_free (vcard);
-
- return retval;
-}
-
-/* Deleting cards. */
-
-/**
- * e_book_remove_card:
- */
-gboolean
-e_book_remove_card (EBook *book,
- ECard *card,
- EBookCallback cb,
- gpointer closure)
-{
- const char *id;
-
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
- g_return_val_if_fail (card != NULL, FALSE);
- g_return_val_if_fail (E_IS_CARD (card), FALSE);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_remove_card: No URI loaded!\n");
- return FALSE;
- }
-
- id = e_card_get_id (card);
- g_assert (id != NULL);
-
- return e_book_remove_card_by_id (book, id, cb, closure);
-}
-
-/**
- * e_book_remove_card_by_id:
- */
-gboolean
-e_book_remove_card_by_id (EBook *book,
- const char *id,
- EBookCallback cb,
- gpointer closure)
-
-{
- CORBA_Environment ev;
-
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
- g_return_val_if_fail (id != NULL, FALSE);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_remove_card_by_id: No URI loaded!\n");
- return FALSE;
- }
-
- CORBA_exception_init (&ev);
-
- Evolution_Book_remove_card (
- book->priv->corba_book, (const Evolution_CardId) id, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_remove_card_by_id: CORBA exception "
- "talking to PAS!\n");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- e_book_queue_op (book, cb, closure, NULL);
-
- return TRUE;
-}
-
-/* Adding cards. */
-
-/**
- * e_book_add_card:
- */
-gboolean
-e_book_add_card (EBook *book,
- ECard *card,
- EBookIdCallback cb,
- gpointer closure)
-
-{
- char *vcard;
- gboolean retval;
-
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
- g_return_val_if_fail (card != NULL, FALSE);
- g_return_val_if_fail (E_IS_CARD (card), FALSE);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_add_card: No URI loaded!\n");
- return FALSE;
- }
-
- vcard = e_card_get_vcard (card);
-
- if (vcard == NULL) {
- g_warning ("e_book_add_card: Cannot convert card to VCard string!\n");
- return FALSE;
- }
-
- retval = e_book_add_vcard (book, vcard, cb, closure);
-
- g_free (vcard);
-
- return retval;
-}
-
-/**
- * e_book_add_vcard:
- */
-gboolean
-e_book_add_vcard (EBook *book,
- const char *vcard,
- EBookIdCallback cb,
- gpointer closure)
-{
- CORBA_Environment ev;
-
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
- g_return_val_if_fail (vcard != NULL, FALSE);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_add_vcard: No URI loaded!\n");
- return FALSE;
- }
-
- CORBA_exception_init (&ev);
-
- Evolution_Book_create_card (
- book->priv->corba_book, (const Evolution_VCard) vcard, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_add_vcard: Exception adding card to PAS!\n");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- e_book_queue_op (book, (EBookCallback) cb, closure, NULL);
-
- return TRUE;
-}
-
-/* Modifying cards. */
-
-/**
- * e_book_commit_card:
- */
-gboolean
-e_book_commit_card (EBook *book,
- ECard *card,
- EBookCallback cb,
- gpointer closure)
-{
- char *vcard;
- gboolean retval;
-
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
- g_return_val_if_fail (card != NULL, FALSE);
- g_return_val_if_fail (E_IS_CARD (card), FALSE);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_commit_card: No URI loaded!\n");
- return FALSE;
- }
-
- vcard = e_card_get_vcard (card);
-
- if (vcard == NULL) {
- g_warning ("e_book_commit_card: Error "
- "getting VCard for card!\n");
- return FALSE;
- }
-
- retval = e_book_commit_vcard (book, vcard, cb, closure);
-
- g_free (vcard);
-
- return retval;
-}
-
-/**
- * e_book_commit_vcard:
- */
-gboolean
-e_book_commit_vcard (EBook *book,
- const char *vcard,
- EBookCallback cb,
- gpointer closure)
-{
- CORBA_Environment ev;
-
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
- g_return_val_if_fail (vcard != NULL, FALSE);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_commit_vcard: No URI loaded!\n");
- return FALSE;
- }
-
- CORBA_exception_init (&ev);
-
- Evolution_Book_modify_card (
- book->priv->corba_book, (const Evolution_VCard) vcard, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_commit_vcard: Exception "
- "modifying card in PAS!\n");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- e_book_queue_op (book, cb, closure, NULL);
-
- return TRUE;
-}
-
-/**
- * e_book_check_connection:
- */
-gboolean
-e_book_check_connection (EBook *book)
-{
- CORBA_Environment ev;
-
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_check_connection: No URI loaded!\n");
- return FALSE;
- }
-
- CORBA_exception_init (&ev);
-
- Evolution_Book_check_connection (book->priv->corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_check_connection: Exception "
- "querying the PAS!\n");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- return TRUE;
-}
-
-gboolean e_book_get_cursor (EBook *book,
- gchar *query,
- EBookCursorCallback cb,
- gpointer closure)
-{
- CORBA_Environment ev;
-
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_check_connection: No URI loaded!\n");
- return FALSE;
- }
-
- CORBA_exception_init (&ev);
-
- Evolution_Book_get_cursor (book->priv->corba_book, query, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_get_all_cards: Exception "
- "querying list of cards!\n");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- e_book_queue_op (book, cb, closure, NULL);
-
- return TRUE;
-}
-
-gboolean e_book_get_book_view (EBook *book,
- gchar *query,
- EBookBookViewCallback cb,
- gpointer closure)
-{
- CORBA_Environment ev;
- EBookViewListener *listener;
-
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_get_book_view: No URI loaded!\n");
- return FALSE;
- }
-
- listener = e_book_view_listener_new();
-
- CORBA_exception_init (&ev);
-
- Evolution_Book_get_book_view (book->priv->corba_book, bonobo_object_corba_objref(BONOBO_OBJECT(listener)), query, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_get_book_view: Exception "
- "getting book_view!\n");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- e_book_queue_op (book, cb, closure, listener);
-
- return TRUE;
-}
-
-/**
- * e_book_get_name:
- */
-char *
-e_book_get_name (EBook *book)
-{
- CORBA_Environment ev;
- char *retval;
- char *name;
-
- g_return_val_if_fail (book != NULL, NULL);
- g_return_val_if_fail (E_IS_BOOK (book), NULL);
-
- if (book->priv->load_state != URILoaded) {
- g_warning ("e_book_get_name: No URI loaded!\n");
- return NULL;
- }
-
- CORBA_exception_init (&ev);
-
- name = Evolution_Book_get_name (book->priv->corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_book_get_name: Exception getting name from PAS!\n");
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- if (name == NULL) {
- g_warning ("e_book_get_name: Got NULL name from PAS!\n");
- return NULL;
- }
-
- retval = g_strdup (name);
- CORBA_free (name);
-
- return retval;
-}
-
-static void
-e_book_init (EBook *book)
-{
- book->priv = g_new0 (EBookPrivate, 1);
- book->priv->load_state = URINotLoaded;
-}
-
-static void
-e_book_destroy (GtkObject *object)
-{
- EBook *book = E_BOOK (object);
- CORBA_Environment ev;
-
- if (book->priv->load_state == URILoaded)
- e_book_unload_uri (book);
-
- CORBA_exception_init (&ev);
-
- CORBA_Object_release (book->priv->book_factory, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("EBook: Exception while releasing BookFactory\n");
-
- CORBA_exception_free (&ev);
- CORBA_exception_init (&ev);
- }
-
- g_free (book->priv);
-
- GTK_OBJECT_CLASS (e_book_parent_class)->destroy (object);
-}
-
-static void
-e_book_class_init (EBookClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- e_book_parent_class = gtk_type_class (gtk_object_get_type ());
-
- e_book_signals [LINK_STATUS] =
- gtk_signal_new ("link_status",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EBookClass, link_status),
- gtk_marshal_NONE__BOOL,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_BOOL);
-
- gtk_object_class_add_signals (object_class, e_book_signals,
- LAST_SIGNAL);
-
- object_class->destroy = e_book_destroy;
-}
-
-/**
- * e_book_get_type:
- */
-GtkType
-e_book_get_type (void)
-{
- static GtkType type = 0;
-
- if (! type) {
- GtkTypeInfo info = {
- "EBook",
- sizeof (EBook),
- sizeof (EBookClass),
- (GtkClassInitFunc) e_book_class_init,
- (GtkObjectInitFunc) e_book_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
diff --git a/addressbook/backend/ebook/e-book.h b/addressbook/backend/ebook/e-book.h
deleted file mode 100644
index a57c7263b3..0000000000
--- a/addressbook/backend/ebook/e-book.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * The Evolution addressbook client object.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 1999, 2000, Helix Code, Inc.
- */
-
-#ifndef __E_BOOK_H__
-#define __E_BOOK_H__
-
-#include <libgnome/gnome-defs.h>
-
-#include <addressbook/backend/ebook/e-card.h>
-#include <addressbook/backend/ebook/e-card-cursor.h>
-#include <addressbook/backend/ebook/e-book-view.h>
-#include <addressbook/backend/ebook/e-book-types.h>
-
-BEGIN_GNOME_DECLS
-
-typedef struct _EBook EBook;
-typedef struct _EBookClass EBookClass;
-typedef struct _EBookPrivate EBookPrivate;
-
-struct _EBook {
- GtkObject parent;
- EBookPrivate *priv;
-};
-
-struct _EBookClass {
- GtkObjectClass parent;
-
- /*
- * Signals.
- */
- void (* open_progress) (EBook *book, const char *msg, short percent);
- void (* link_status) (EBook *book, gboolean connected);
-};
-
-/* Callbacks for asynchronous functions. */
-typedef void (*EBookCallback) (EBook *book, EBookStatus status, gpointer closure);
-typedef void (*EBookOpenProgressCallback) (EBook *book,
- const char *status_message,
- short percent,
- gpointer closure);
-typedef void (*EBookIdCallback) (EBook *book, EBookStatus status, const char *id, gpointer closure);
-typedef void (*EBookCursorCallback) (EBook *book, EBookStatus status, ECardCursor *cursor, gpointer closure);
-typedef void (*EBookBookViewCallback) (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure);
-
-
-/* Creating a new addressbook. */
-EBook *e_book_new (void);
-gboolean e_book_load_uri (EBook *book,
- const char *uri,
- EBookCallback open_response,
- gpointer closure);
-void e_book_unload_uri (EBook *book);
-
-/* Fetching cards. */
-ECard *e_book_get_card (EBook *book,
- const char *id);
-char *e_book_get_vcard (EBook *book,
- const char *id);
-
-/* Deleting cards. */
-gboolean e_book_remove_card (EBook *book,
- ECard *card,
- EBookCallback cb,
- gpointer closure);
-gboolean e_book_remove_card_by_id (EBook *book,
- const char *id,
- EBookCallback cb,
- gpointer closure);
-
-/* Adding cards. */
-gboolean e_book_add_card (EBook *book,
- ECard *card,
- EBookIdCallback cb,
- gpointer closure);
-gboolean e_book_add_vcard (EBook *book,
- const char *vcard,
- EBookIdCallback cb,
- gpointer closure);
-
-/* Modifying cards. */
-gboolean e_book_commit_card (EBook *book,
- ECard *card,
- EBookCallback cb,
- gpointer closure);
-gboolean e_book_commit_vcard (EBook *book,
- const char *vcard,
- EBookCallback cb,
- gpointer closure);
-
-/* Checking to see if we're connected to the card repository. */
-gboolean e_book_check_connection (EBook *book);
-
-gboolean e_book_get_cursor (EBook *book,
- char *query,
- EBookCursorCallback cb,
- gpointer closure);
-
-gboolean e_book_get_book_view (EBook *book,
- char *query,
- EBookBookViewCallback cb,
- gpointer closure);
-
-/* Getting the name of the repository. */
-char *e_book_get_name (EBook *book);
-
-GtkType e_book_get_type (void);
-
-#define E_BOOK_TYPE (e_book_get_type ())
-#define E_BOOK(o) (GTK_CHECK_CAST ((o), E_BOOK_TYPE, EBook))
-#define E_BOOK_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_BOOK_TYPE, EBookClass))
-#define E_IS_BOOK(o) (GTK_CHECK_TYPE ((o), E_BOOK_TYPE))
-#define E_IS_BOOK_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_BOOK_TYPE))
-
-END_GNOME_DECLS
-
-#endif /* ! __E_BOOK_H__ */
diff --git a/addressbook/backend/ebook/e-card-cursor.c b/addressbook/backend/ebook/e-card-cursor.c
deleted file mode 100644
index 1618a6ddee..0000000000
--- a/addressbook/backend/ebook/e-card-cursor.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-card-cursor.c: Implements card cursors.
- *
- * Author:
- * Christopher James Lahey <clahey@helixcode.com.
- */
-
-#include <config.h>
-#include <gtk/gtk.h>
-#include "addressbook.h"
-#include "e-card-cursor.h"
-
-struct _ECardCursorPrivate {
- Evolution_CardCursor corba_cursor;
-};
-
-/*
- * A pointer to our parent object class
- */
-static GtkObjectClass *parent_class;
-
-/*
- * Implemented GtkObject::destroy
- */
-static void
-e_card_cursor_destroy (GtkObject *object)
-{
- ECardCursor *cursor = E_CARD_CURSOR (object);
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- Evolution_CardCursor_unref( cursor->priv->corba_cursor, &ev );
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("e_card_cursor_destroy: Exception unreffing "
- "corba cursor.\n");
- CORBA_exception_free (&ev);
- CORBA_exception_init (&ev);
- }
-
- CORBA_Object_release (cursor->priv->corba_cursor, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("e_card_cursor_destroy: Exception releasing "
- "corba cursor.\n");
- }
-
- CORBA_exception_free (&ev);
-
- if ( cursor->priv )
- g_free ( cursor->priv );
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-/**
- * e_card_cursor_get_length:
- * @cursor: the #ECardCursor whose length is being queried
- *
- * Returns: the number of items the cursor references, or -1 there's
- * an error.
- */
-long
-e_card_cursor_get_length (ECardCursor *cursor)
-{
- if ( cursor->priv->corba_cursor != CORBA_OBJECT_NIL ) {
- CORBA_Environment ev;
- long ret_val;
-
- CORBA_exception_init (&ev);
-
- ret_val = Evolution_CardCursor_get_length(cursor->priv->corba_cursor, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("e_card_cursor_get_length: Exception during "
- "get_length corba call.\n");
- ret_val = -1;
- }
-
- CORBA_exception_free (&ev);
-
- return ret_val;
- }
- else
- return -1;
-}
-
-/**
- * e_card_cursor_get_nth:
- * @cursor: an #ECardCursor object
- * @n: the index of the item requested
- *
- * Gets an #ECard based on an index.
- *
- * Returns: a new #ECard on success, or %NULL on failure.
- */
-ECard *
-e_card_cursor_get_nth (ECardCursor *cursor,
- const long n)
-{
- if ( cursor->priv->corba_cursor != CORBA_OBJECT_NIL ) {
- CORBA_Environment en;
- CORBA_char *vcard;
- ECard *card;
-
- CORBA_exception_init (&en);
-
- vcard = Evolution_CardCursor_get_nth(cursor->priv->corba_cursor, n, &en);
-
- if (en._major != CORBA_NO_EXCEPTION) {
- g_warning("e_card_cursor_get_nth: Exception during "
- "get_nth corba call.\n");
- }
-
- CORBA_exception_free (&en);
-
- card = e_card_new (vcard);
-
- CORBA_free(vcard);
-
- return card;
- }
- else
- return e_card_new("");
-}
-
-static void
-e_card_cursor_class_init (ECardCursorClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-
- object_class->destroy = e_card_cursor_destroy;
-}
-
-static void
-e_card_cursor_init (ECardCursor *cursor)
-{
- cursor->priv = g_new(ECardCursorPrivate, 1);
- cursor->priv->corba_cursor = CORBA_OBJECT_NIL;
-}
-
-GtkType
-e_card_cursor_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ECardCursor",
- sizeof (ECardCursor),
- sizeof (ECardCursorClass),
- (GtkClassInitFunc) e_card_cursor_class_init,
- (GtkObjectInitFunc) e_card_cursor_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
-
-/**
- * e_card_cursor_construct:
- * @cursor: an #ECardCursor object
- * @corba_cursor: an #Evolution_CardCursor
- *
- * Wraps an #Evolution_CardCursor object inside the #ECardCursor
- * @cursor object.
- *
- * Returns: a new #ECardCursor on success, or %NULL on failure.
- */
-ECardCursor *
-e_card_cursor_construct (ECardCursor *cursor,
- Evolution_CardCursor corba_cursor)
-{
- CORBA_Environment ev;
- g_return_val_if_fail (cursor != NULL, NULL);
- g_return_val_if_fail (E_IS_CARD_CURSOR (cursor), NULL);
- g_return_val_if_fail (corba_cursor != CORBA_OBJECT_NIL, NULL);
-
- CORBA_exception_init (&ev);
-
- /*
- * Initialize cursor
- */
- cursor->priv->corba_cursor = CORBA_Object_duplicate(corba_cursor, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("e_card_cursor_construct: Exception duplicating "
- "corba cursor.\n");
- CORBA_exception_free (&ev);
- CORBA_exception_init (&ev);
- }
-
- Evolution_CardCursor_ref(cursor->priv->corba_cursor, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("e_card_cursor_construct: Exception reffing "
- "corba cursor.\n");
- }
-
- CORBA_exception_free (&ev);
-
- /*
- * Success: return the GtkType we were given
- */
- return cursor;
-}
-
-/**
- * e_card_cursor_new:
- * @cursor: the #Evolution_CardCursor to be wrapped
- *
- * Creates a new #ECardCursor, which wraps an #Evolution_CardCursor
- * object.
- *
- * Returns: a new #ECardCursor on success, or %NULL on failure.
- */
-ECardCursor *
-e_card_cursor_new (Evolution_CardCursor corba_cursor)
-{
- ECardCursor *cursor;
-
- cursor = gtk_type_new (e_card_cursor_get_type ());
-
- return e_card_cursor_construct (cursor,
- corba_cursor);
-}
diff --git a/addressbook/backend/ebook/e-card-cursor.h b/addressbook/backend/ebook/e-card-cursor.h
deleted file mode 100644
index b318e646c4..0000000000
--- a/addressbook/backend/ebook/e-card-cursor.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#ifndef __E_CARD_CURSOR_H__
-#define __E_CARD_CURSOR_H__
-
-#include <libgnome/gnome-defs.h>
-#include <gtk/gtk.h>
-#include <addressbook/backend/ebook/addressbook.h>
-#include <addressbook/backend/ebook/e-card.h>
-
-BEGIN_GNOME_DECLS
-
-typedef struct _ECardCursor ECardCursor;
-typedef struct _ECardCursorPrivate ECardCursorPrivate;
-typedef struct _ECardCursorClass ECardCursorClass;
-
-struct _ECardCursor {
- GtkObject parent;
- ECardCursorPrivate *priv;
-};
-
-struct _ECardCursorClass {
- GtkObjectClass parent;
-};
-
-/* Creating a new addressbook. */
-ECardCursor *e_card_cursor_new (Evolution_CardCursor corba_cursor);
-ECardCursor *e_card_cursor_construct (ECardCursor *cursor,
- Evolution_CardCursor corba_cursor);
-
-GtkType e_card_cursor_get_type (void);
-
-/* Fetching cards. */
-long e_card_cursor_get_length (ECardCursor *cursor);
-ECard *e_card_cursor_get_nth (ECardCursor *cursor,
- const long nth);
-#define E_CARD_CURSOR_TYPE (e_card_cursor_get_type ())
-#define E_CARD_CURSOR(o) (GTK_CHECK_CAST ((o), E_CARD_CURSOR_TYPE, ECardCursor))
-#define E_CARD_CURSOR_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CARD_CURSOR_TYPE, ECardCursorClass))
-#define E_IS_CARD_CURSOR(o) (GTK_CHECK_TYPE ((o), E_CARD_CURSOR_TYPE))
-#define E_IS_CARD_CURSOR_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CARD_CURSOR_TYPE))
-
-END_GNOME_DECLS
-
-#endif /* ! __E_CARD_CURSOR_H__ */
diff --git a/addressbook/backend/ebook/e-card-pairs.h b/addressbook/backend/ebook/e-card-pairs.h
deleted file mode 100644
index 0f379d3477..0000000000
--- a/addressbook/backend/ebook/e-card-pairs.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* GnomeCard - a graphical contact manager.
- *
- * pairs.h: This file is part of GnomeCard.
- *
- * Copyright (C) 1999 The Free Software Foundation
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __E_CARD_PAIRS_H__
-#define __E_CARD_PAIRS_H__
-
-#include <libversit/vcc.h>
-#include <ebook/e-card.h>
-
-
-#if 0
-struct pair
-{
- char *str;
- ECardPropertyType i ;
-};
-
-struct pair prop_lookup[] = {
- { VCFullNameProp, PROP_FNAME },
- { VCNameProp, PROP_NAME },
- { VCPhotoProp, PROP_PHOTO },
- { VCBirthDateProp, PROP_BDAY },
- { VCAdrProp, PROP_DELADDR },
- { VCDeliveryLabelProp, PROP_DELLABEL },
- { VCTelephoneProp, PROP_PHONE },
- { VCEmailAddressProp, PROP_EMAIL },
- { VCMailerProp, PROP_MAILER },
- { VCTimeZoneProp, PROP_TIMEZN },
- { VCGeoProp, PROP_GEOPOS },
- { VCTitleProp, PROP_TITLE },
- { VCBusinessRoleProp, PROP_ROLE },
- { VCLogoProp, PROP_LOGO },
- { VCAgentProp, PROP_AGENT },
- { VCOrgProp, PROP_ORG },
- { VCCategoriesProp, PROP_CATEGORIES },
- { VCCommentProp, PROP_COMMENT },
- { VCLastRevisedProp, PROP_REV },
- { VCPronunciationProp, PROP_SOUND },
- { VCURLProp, PROP_URL },
- { VCUniqueStringProp, PROP_UID },
- { VCVersionProp, PROP_VERSION },
- { VCPublicKeyProp, PROP_KEY },
- { VCValueProp, PROP_VALUE },
- { VCEncodingProp, PROP_ENCODING },
- { VCQuotedPrintableProp, PROP_QUOTED_PRINTABLE },
- { VC8bitProp, PROP_8BIT },
- { VCBase64Prop, PROP_BASE64 },
- { VCLanguageProp, PROP_LANG },
- { VCCharSetProp, PROP_CHARSET },
- { NULL, PROP_NONE} };
-
-struct pair photo_pairs[] = {
- { VCGIFProp, PHOTO_GIF },
- { VCCGMProp, PHOTO_CGM },
- { VCWMFProp, PHOTO_WMF },
- { VCBMPProp, PHOTO_BMP },
- { VCMETProp, PHOTO_MET },
- { VCPMBProp, PHOTO_PMB },
- { VCDIBProp, PHOTO_DIB },
- { VCPICTProp, PHOTO_PICT },
- { VCTIFFProp, PHOTO_TIFF },
- { VCPDFProp, PHOTO_PDF },
- { VCPSProp, PHOTO_PS },
- { VCJPEGProp, PHOTO_JPEG },
- { VCMPEGProp, PHOTO_MPEG },
- { VCMPEG2Prop, PHOTO_MPEG2 },
- { VCAVIProp, PHOTO_AVI },
- { VCQuickTimeProp, PHOTO_QTIME },
- { NULL, 0 } };
-
-struct pair email_pairs[] = {
- { VCAOLProp, EMAIL_AOL },
- { VCAppleLinkProp, EMAIL_APPLE_LINK },
- { VCATTMailProp, EMAIL_ATT },
- { VCCISProp, EMAIL_CIS },
- { VCEWorldProp, EMAIL_EWORLD },
- { VCInternetProp, EMAIL_INET },
- { VCIBMMailProp, EMAIL_IBM },
- { VCMCIMailProp, EMAIL_MCI },
- { VCPowerShareProp, EMAIL_POWERSHARE },
- { VCProdigyProp, EMAIL_PRODIGY },
- { VCTLXProp, EMAIL_TLX },
- { VCX400Prop, EMAIL_X400 },
- { NULL, 0 } };
-
-struct pair sound_pairs[] = {
- { VCAIFFProp, SOUND_AIFF },
- { VCPCMProp, SOUND_PCM },
- { VCWAVEProp, SOUND_WAVE },
- { NULL, 0 } };
-
-struct pair key_pairs[] = {
- { VCX509Prop, KEY_X509 },
- { VCPGPProp, KEY_PGP },
- { NULL, 0 } };
-
-
-#endif
-#endif /* ! __E_CARD_PAIRS_H__ */
diff --git a/addressbook/backend/ebook/e-card-simple.c b/addressbook/backend/ebook/e-card-simple.c
deleted file mode 100644
index 0efda1a8d7..0000000000
--- a/addressbook/backend/ebook/e-card-simple.c
+++ /dev/null
@@ -1,1208 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- * Arturo Espinosa (arturo@nuclecu.unam.mx)
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-
-#include <libversit/vcc.h>
-#include "e-card-simple.h"
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_CARD,
-#if 0
- ARG_FILE_AS,
- ARG_FULL_NAME,
- ARG_NAME,
- ARG_ADDRESS,
- ARG_ADDRESS_LABEL,
- ARG_PHONE,
- ARG_EMAIL,
- ARG_BIRTH_DATE,
- ARG_URL,
- ARG_ORG,
- ARG_ORG_UNIT,
- ARG_OFFICE,
- ARG_TITLE,
- ARG_ROLE,
- ARG_MANAGER,
- ARG_ASSISTANT,
- ARG_NICKNAME,
- ARG_SPOUSE,
- ARG_ANNIVERSARY,
- ARG_FBURL,
- ARG_NOTE,
- ARG_ID
-#endif
-};
-
-
-typedef enum _ECardSimpleInternalType ECardSimpleInternalType;
-typedef struct _ECardSimpleFieldData ECardSimpleFieldData;
-
-enum _ECardSimpleInternalType {
- E_CARD_SIMPLE_INTERNAL_TYPE_STRING,
- E_CARD_SIMPLE_INTERNAL_TYPE_DATE,
- E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS,
- E_CARD_SIMPLE_INTERNAL_TYPE_PHONE,
- E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL,
- E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL,
-};
-
-struct _ECardSimpleFieldData {
- ECardSimpleField field;
- char *ecard_field;
- char *name;
- char *short_name;
- int list_type_index;
- ECardSimpleInternalType type;
-};
-
-/* This order must match the order in the .h. */
-
-static ECardSimpleFieldData field_data[] =
-{
- { E_CARD_SIMPLE_FIELD_FILE_AS, "file_as", "File As", "", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_FULL_NAME, "full_name", "Name", "Name", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_EMAIL, "", "Email", "Email", E_CARD_SIMPLE_EMAIL_ID_EMAIL, E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL },
- { E_CARD_SIMPLE_FIELD_PHONE_PRIMARY, "", "Primary", "Prim", E_CARD_SIMPLE_PHONE_ID_PRIMARY, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_PHONE_BUSINESS, "", "Business", "Bus", E_CARD_SIMPLE_PHONE_ID_BUSINESS, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_PHONE_HOME, "", "Home", "Home", E_CARD_SIMPLE_PHONE_ID_HOME, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_ORG, "org", "Organization", "Org", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_ADDRESS_BUSINESS, "", "Business", "Bus", E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS },
- { E_CARD_SIMPLE_FIELD_ADDRESS_HOME, "", "Home", "Home", E_CARD_SIMPLE_ADDRESS_ID_HOME, E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS },
- { E_CARD_SIMPLE_FIELD_PHONE_MOBILE, "", "Mobile", "Mobile", E_CARD_SIMPLE_PHONE_ID_MOBILE, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_PHONE_CAR, "", "Car", "Car", E_CARD_SIMPLE_PHONE_ID_CAR, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX, "", "Business Fax", "Bus Fax", E_CARD_SIMPLE_PHONE_ID_BUSINESS_FAX, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_PHONE_HOME_FAX, "", "Home Fax", "Home Fax", E_CARD_SIMPLE_PHONE_ID_HOME_FAX, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2, "", "Business 2", "Bus 2", E_CARD_SIMPLE_PHONE_ID_BUSINESS_2, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_PHONE_HOME_2, "", "Home 2", "Home 2", E_CARD_SIMPLE_PHONE_ID_HOME_2, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_PHONE_ISDN, "", "ISDN", "ISDN", E_CARD_SIMPLE_PHONE_ID_ISDN, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_PHONE_OTHER, "", "Other", "Other", E_CARD_SIMPLE_PHONE_ID_OTHER, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_PHONE_PAGER, "", "Pager", "Pager", E_CARD_SIMPLE_PHONE_ID_PAGER, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE },
- { E_CARD_SIMPLE_FIELD_ADDRESS_OTHER, "", "Other", "Other", E_CARD_SIMPLE_ADDRESS_ID_OTHER, E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS },
- { E_CARD_SIMPLE_FIELD_EMAIL_2, "", "Email 2", "Email 2", E_CARD_SIMPLE_EMAIL_ID_EMAIL_2, E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL },
- { E_CARD_SIMPLE_FIELD_EMAIL_3, "", "Email 3", "Email 3", E_CARD_SIMPLE_EMAIL_ID_EMAIL_3, E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL },
- { E_CARD_SIMPLE_FIELD_URL, "url", "Web Site", "Url", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_ORG_UNIT, "org_unit", "Department", "Dep", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_OFFICE, "office", "Office", "Off", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_TITLE, "title", "Title", "Title", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_ROLE, "role", "Profession", "Prof", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_MANAGER, "manager", "Manager", "Man", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_ASSISTANT, "assistant", "Assistant", "Ass", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_NICKNAME, "nickname", "Nickname", "Nick", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_SPOUSE, "spouse", "Spouse", "Spouse", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_NOTE, "note", "Note", "Note", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_FBURL, "fburl", "Free-busy URL", "FBUrl", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_ANNIVERSARY, "anniversary", "Anniversary", "Anniv", 0, E_CARD_SIMPLE_INTERNAL_TYPE_DATE },
- { E_CARD_SIMPLE_FIELD_BIRTH_DATE, "birth_date", "Birth Date", "", 0, E_CARD_SIMPLE_INTERNAL_TYPE_DATE },
- { E_CARD_SIMPLE_FIELD_MAILER, "mailer", "", "", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING },
- { E_CARD_SIMPLE_FIELD_NAME_OR_ORG, "nameororg", "", "", 0, E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL },
-};
-
-static void e_card_simple_init (ECardSimple *simple);
-static void e_card_simple_class_init (ECardSimpleClass *klass);
-
-static void e_card_simple_destroy (GtkObject *object);
-static void e_card_simple_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_card_simple_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-static void fill_in_info(ECardSimple *simple);
-
-ECardPhoneFlags phone_correspondences[] = {
- 0xFF, /* E_CARD_SIMPLE_PHONE_ID_ASSISTANT, */
- E_CARD_PHONE_WORK | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_BUSINESS, */
- E_CARD_PHONE_WORK | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_BUSINESS_2, */
- E_CARD_PHONE_WORK | E_CARD_PHONE_FAX, /* E_CARD_SIMPLE_PHONE_ID_BUSINESS_FAX, */
- 0xFF, /* E_CARD_SIMPLE_PHONE_ID_CALLBACK, */
- E_CARD_PHONE_CAR | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_CAR, */
- 0xFF, /* E_CARD_SIMPLE_PHONE_ID_COMPANY, */
- E_CARD_PHONE_HOME | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_HOME, */
- E_CARD_PHONE_HOME | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_HOME_2, */
- E_CARD_PHONE_HOME | E_CARD_PHONE_FAX, /* E_CARD_SIMPLE_PHONE_ID_HOME_FAX, */
- E_CARD_PHONE_ISDN, /* E_CARD_SIMPLE_PHONE_ID_ISDN, */
- E_CARD_PHONE_CELL | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_MOBILE, */
- E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_OTHER, */
- 0xFF, /* E_CARD_SIMPLE_PHONE_ID_OTHER_FAX, */
- E_CARD_PHONE_PAGER | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_PAGER, */
- E_CARD_PHONE_PREF, /* E_CARD_SIMPLE_PHONE_ID_PRIMARY, */
- 0xFF, /* E_CARD_SIMPLE_PHONE_ID_RADIO, */
- 0xFF, /* E_CARD_SIMPLE_PHONE_ID_TELEX, */
- 0xFF, /* E_CARD_SIMPLE_PHONE_ID_TTYTTD, */
-};
-
-char *phone_names[] = {
- NULL, /* E_CARD_SIMPLE_PHONE_ID_ASSISTANT, */
- "Business",
- "Business 2",
- "Business Fax",
- NULL, /* E_CARD_SIMPLE_PHONE_ID_CALLBACK, */
- "Car",
- NULL, /* E_CARD_SIMPLE_PHONE_ID_COMPANY, */
- "Home",
- "Home 2",
- "Home Fax",
- "ISDN",
- "Mobile",
- "Other",
- NULL, /* E_CARD_SIMPLE_PHONE_ID_OTHER_FAX, */
- "Pager",
- "Primary",
- NULL, /* E_CARD_SIMPLE_PHONE_ID_RADIO, */
- NULL, /* E_CARD_SIMPLE_PHONE_ID_TELEX, */
- NULL, /* E_CARD_SIMPLE_PHONE_ID_TTYTTD, */
-};
-
-char *phone_short_names[] = {
- NULL, /* E_CARD_SIMPLE_PHONE_ID_ASSISTANT, */
- "Bus",
- "Bus 2",
- "Bus Fax",
- NULL, /* E_CARD_SIMPLE_PHONE_ID_CALLBACK, */
- "Car",
- NULL, /* E_CARD_SIMPLE_PHONE_ID_COMPANY, */
- "Home",
- "Home 2",
- "Home Fax",
- "ISDN",
- "Mob",
- "Other",
- NULL, /* E_CARD_SIMPLE_PHONE_ID_OTHER_FAX, */
- "Pag",
- "Prim",
- NULL, /* E_CARD_SIMPLE_PHONE_ID_RADIO, */
- NULL, /* E_CARD_SIMPLE_PHONE_ID_TELEX, */
- NULL, /* E_CARD_SIMPLE_PHONE_ID_TTYTTD, */
-};
-
-ECardAddressFlags addr_correspondences[] = {
- E_CARD_ADDR_WORK, /* E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, */
- E_CARD_ADDR_HOME, /* E_CARD_SIMPLE_ADDRESS_ID_HOME, */
- E_CARD_ADDR_POSTAL, /* E_CARD_SIMPLE_ADDRESS_ID_OTHER, */
-};
-
-char *address_names[] = {
- "Business",
- "Home",
- "Other",
-};
-
-/**
- * e_card_simple_get_type:
- * @void:
- *
- * Registers the &ECardSimple class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ECardSimple class.
- **/
-GtkType
-e_card_simple_get_type (void)
-{
- static GtkType simple_type = 0;
-
- if (!simple_type) {
- GtkTypeInfo simple_info = {
- "ECardSimple",
- sizeof (ECardSimple),
- sizeof (ECardSimpleClass),
- (GtkClassInitFunc) e_card_simple_class_init,
- (GtkObjectInitFunc) e_card_simple_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- simple_type = gtk_type_unique (gtk_object_get_type (), &simple_info);
- }
-
- return simple_type;
-}
-
-/**
- * e_card_simple_new:
- * @VCard: a string in vCard format
- *
- * Returns: a new #ECardSimple that wraps the @VCard.
- */
-ECardSimple *
-e_card_simple_new (ECard *card)
-{
- ECardSimple *simple = E_CARD_SIMPLE(gtk_type_new(e_card_simple_get_type()));
- gtk_object_set(GTK_OBJECT(simple),
- "card", card,
- NULL);
- return simple;
-}
-
-ECardSimple *e_card_simple_duplicate(ECardSimple *simple)
-{
- char *vcard = e_card_simple_get_vcard(simple);
- ECard *card = e_card_new(vcard);
- ECardSimple *new_simple = e_card_simple_new(card);
- g_free (vcard);
- return new_simple;
-}
-
-/**
- * e_card_simple_get_id:
- * @simple: an #ECardSimple
- *
- * Returns: a string representing the id of the simple, which is unique
- * within its book.
- */
-char *
-e_card_simple_get_id (ECardSimple *simple)
-{
- if (simple->card)
- return e_card_get_id(simple->card);
- else
- return "";
-}
-
-/**
- * e_card_simple_get_id:
- * @simple: an #ECardSimple
- * @id: a id in string format
- *
- * Sets the identifier of a simple, which should be unique within its
- * book.
- */
-void
-e_card_simple_set_id (ECardSimple *simple, const char *id)
-{
- if ( simple->card )
- e_card_set_id(simple->card, id);
-}
-
-/**
- * e_card_simple_get_vcard:
- * @simple: an #ECardSimple
- *
- * Returns: a string in vcard format, which is wrapped by the @simple.
- */
-char
-*e_card_simple_get_vcard (ECardSimple *simple)
-{
- if (simple->card)
- return e_card_get_vcard(simple->card);
- else
- return g_strdup("");
-}
-
-static void
-e_card_simple_class_init (ECardSimpleClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
-
- gtk_object_add_arg_type ("ECardSimple::card",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CARD);
-#if 0
- gtk_object_add_arg_type ("ECardSimple::file_as",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FILE_AS);
- gtk_object_add_arg_type ("ECardSimple::full_name",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FULL_NAME);
- gtk_object_add_arg_type ("ECardSimple::name",
- GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_NAME);
- gtk_object_add_arg_type ("ECardSimple::address",
- GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_ADDRESS);
- gtk_object_add_arg_type ("ECardSimple::address_label",
- GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_ADDRESS_LABEL);
- gtk_object_add_arg_type ("ECardSimple::phone",
- GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_PHONE);
- gtk_object_add_arg_type ("ECardSimple::email",
- GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_EMAIL);
- gtk_object_add_arg_type ("ECardSimple::birth_date",
- GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_BIRTH_DATE);
- gtk_object_add_arg_type ("ECardSimple::url",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_URL);
- gtk_object_add_arg_type ("ECardSimple::org",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ORG);
- gtk_object_add_arg_type ("ECardSimple::org_unit",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ORG_UNIT);
- gtk_object_add_arg_type ("ECardSimple::office",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_OFFICE);
- gtk_object_add_arg_type ("ECardSimple::title",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_TITLE);
- gtk_object_add_arg_type ("ECardSimple::role",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ROLE);
- gtk_object_add_arg_type ("ECardSimple::manager",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_MANAGER);
- gtk_object_add_arg_type ("ECardSimple::assistant",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ASSISTANT);
- gtk_object_add_arg_type ("ECardSimple::nickname",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NICKNAME);
- gtk_object_add_arg_type ("ECardSimple::spouse",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_SPOUSE);
- gtk_object_add_arg_type ("ECardSimple::anniversary",
- GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_ANNIVERSARY);
- gtk_object_add_arg_type ("ECardSimple::fburl",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FBURL);
- gtk_object_add_arg_type ("ECardSimple::note",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NOTE);
- gtk_object_add_arg_type ("ECardSimple::id",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ID);
-#endif
-
- object_class->destroy = e_card_simple_destroy;
- object_class->get_arg = e_card_simple_get_arg;
- object_class->set_arg = e_card_simple_set_arg;
-}
-
-/*
- * ECardSimple lifecycle management and vcard loading/saving.
- */
-
-static void
-e_card_simple_destroy (GtkObject *object)
-{
- ECardSimple *simple;
- int i;
-
- simple = E_CARD_SIMPLE (object);
-
- if (simple->card)
- gtk_object_unref(GTK_OBJECT(simple->card));
- g_list_foreach(simple->temp_fields, (GFunc) g_free, NULL);
- g_list_free(simple->temp_fields);
- simple->temp_fields = NULL;
-
- for(i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++)
- g_free(simple->phone[i]);
- for(i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++)
- g_free(simple->email[i]);
- for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++)
- g_free(simple->address[i]);
-}
-
-
-/* Set_arg handler for the simple */
-static void
-e_card_simple_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ECardSimple *simple;
-
- simple = E_CARD_SIMPLE (object);
-
- switch (arg_id) {
- case ARG_CARD:
- if (simple->card)
- gtk_object_unref(GTK_OBJECT(simple->card));
- g_list_foreach(simple->temp_fields, (GFunc) g_free, NULL);
- g_list_free(simple->temp_fields);
- simple->temp_fields = NULL;
- if (GTK_VALUE_OBJECT(*arg))
- simple->card = E_CARD(GTK_VALUE_OBJECT(*arg));
- else
- simple->card = NULL;
- if(simple->card)
- gtk_object_ref(GTK_OBJECT(simple->card));
- fill_in_info(simple);
- break;
-#if 0
- case ARG_FILE_AS:
- if (simple->file_as)
- g_free(simple->file_as);
- simple->file_as = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_FULL_NAME:
- if ( simple->fname )
- g_free(simple->fname);
- simple->fname = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_NAME:
- if ( simple->name )
- e_card_simple_name_free(simple->name);
- simple->name = GTK_VALUE_POINTER(*arg);
- break;
- case ARG_BIRTH_DATE:
- if ( simple->bday )
- g_free(simple->bday);
- simple->bday = GTK_VALUE_POINTER(*arg);
- break;
- case ARG_URL:
- if ( simple->url )
- g_free(simple->url);
- simple->url = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ORG:
- if (simple->org)
- g_free(simple->org);
- simple->org = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ORG_UNIT:
- if (simple->org_unit)
- g_free(simple->org_unit);
- simple->org_unit = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_OFFICE:
- if (simple->office)
- g_free(simple->office);
- simple->office = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_TITLE:
- if ( simple->title )
- g_free(simple->title);
- simple->title = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ROLE:
- if (simple->role)
- g_free(simple->role);
- simple->role = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_MANAGER:
- if (simple->manager)
- g_free(simple->manager);
- simple->manager = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ASSISTANT:
- if (simple->assistant)
- g_free(simple->assistant);
- simple->assistant = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_NICKNAME:
- if (simple->nickname)
- g_free(simple->nickname);
- simple->nickname = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_SPOUSE:
- if (simple->spouse)
- g_free(simple->spouse);
- simple->spouse = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ANNIVERSARY:
- if ( simple->anniversary )
- g_free(simple->anniversary);
- simple->anniversary = GTK_VALUE_POINTER(*arg);
- break;
- case ARG_FBURL:
- if (simple->fburl)
- g_free(simple->fburl);
- simple->fburl = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_NOTE:
- if (simple->note)
- g_free (simple->note);
- simple->note = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ID:
- if (simple->id)
- g_free(simple->id);
- simple->id = g_strdup(GTK_VALUE_STRING(*arg));
- break;
-#endif
- default:
- return;
- }
-}
-
-/* Get_arg handler for the simple */
-static void
-e_card_simple_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ECardSimple *simple;
-
- simple = E_CARD_SIMPLE (object);
-
- switch (arg_id) {
- case ARG_CARD:
- e_card_simple_sync_card(simple);
- if (simple->card)
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(simple->card);
- else
- GTK_VALUE_OBJECT (*arg) = NULL;
- break;
-#if 0
- case ARG_FILE_AS:
- GTK_VALUE_STRING (*arg);
- break;
- case ARG_FULL_NAME:
- GTK_VALUE_STRING (*arg) = simple->fname;
- break;
- case ARG_NAME:
- GTK_VALUE_POINTER(*arg) = simple->name;
- break;
- case ARG_ADDRESS:
- if (!simple->address)
- simple->address = e_card_simple_list_new((ECardSimpleListCopyFunc) e_card_simple_delivery_address_copy,
- (ECardSimpleListFreeFunc) e_card_simple_delivery_address_free,
- NULL);
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(simple->address);
- break;
- case ARG_ADDRESS_LABEL:
- if (!simple->address_label)
- simple->address_label = e_card_simple_list_new((ECardSimpleListCopyFunc) e_card_simple_address_label_copy,
- (ECardSimpleListFreeFunc) e_card_simple_address_label_free,
- NULL);
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(simple->address_label);
- break;
- case ARG_PHONE:
- if (!simple->phone)
- simple->phone = e_card_simple_list_new((ECardSimpleListCopyFunc) e_card_simple_phone_copy,
- (ECardSimpleListFreeFunc) e_card_simple_phone_free,
- NULL);
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(simple->phone);
- break;
- case ARG_EMAIL:
- if (!simple->email)
- simple->email = e_card_simple_list_new((ECardSimpleListCopyFunc) g_strdup,
- (ECardSimpleListFreeFunc) g_free,
- NULL);
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(simple->email);
- break;
- case ARG_BIRTH_DATE:
- GTK_VALUE_POINTER(*arg) = simple->bday;
- break;
- case ARG_URL:
- GTK_VALUE_STRING(*arg) = simple->url;
- break;
- case ARG_ORG:
- GTK_VALUE_STRING(*arg) = simple->org;
- break;
- case ARG_ORG_UNIT:
- GTK_VALUE_STRING(*arg) = simple->org_unit;
- break;
- case ARG_OFFICE:
- GTK_VALUE_STRING(*arg) = simple->office;
- break;
- case ARG_TITLE:
- GTK_VALUE_STRING(*arg) = simple->title;
- break;
- case ARG_ROLE:
- GTK_VALUE_STRING(*arg) = simple->role;
- break;
- case ARG_MANAGER:
- GTK_VALUE_STRING(*arg) = simple->manager;
- break;
- case ARG_ASSISTANT:
- GTK_VALUE_STRING(*arg) = simple->assistant;
- break;
- case ARG_NICKNAME:
- GTK_VALUE_STRING(*arg) = simple->nickname;
- break;
- case ARG_SPOUSE:
- GTK_VALUE_STRING(*arg) = simple->spouse;
- break;
- case ARG_ANNIVERSARY:
- GTK_VALUE_POINTER(*arg) = simple->anniversary;
- break;
- case ARG_FBURL:
- GTK_VALUE_STRING(*arg) = simple->fburl;
- break;
- case ARG_NOTE:
- GTK_VALUE_STRING(*arg) = simple->note;
- break;
- case ARG_ID:
- GTK_VALUE_STRING(*arg) = simple->id;
- break;
-#endif
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-
-/**
- * e_card_simple_init:
- */
-static void
-e_card_simple_init (ECardSimple *simple)
-{
- int i;
- simple->card = NULL;
- for(i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++)
- simple->phone[i] = NULL;
- for(i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++)
- simple->email[i] = NULL;
- for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++)
- simple->address[i] = NULL;
- simple->temp_fields = NULL;
-}
-
-static void
-fill_in_info(ECardSimple *simple)
-{
- ECard *card = simple->card;
- if (card) {
- EList *address_list;
- EList *phone_list;
- EList *email_list;
- const ECardPhone *phone;
- const char *email;
- const ECardAddrLabel *address;
- int i;
-
- EIterator *iterator;
-
- gtk_object_get(GTK_OBJECT(card),
- "address_label", &address_list,
- "phone", &phone_list,
- "email", &email_list,
- NULL);
- for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) {
- e_card_phone_free(simple->phone[i]);
- simple->phone[i] = NULL;
- }
- for (iterator = e_list_get_iterator(phone_list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- phone = e_iterator_get(iterator);
- for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) {
- if (((phone->flags & phone_correspondences[i]) == phone_correspondences[i]) && (simple->phone[i] == NULL)) {
- simple->phone[i] = e_card_phone_copy(phone);
- break;
- }
- }
- }
- gtk_object_unref(GTK_OBJECT(iterator));
-
- for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) {
- g_free(simple->email[i]);
- simple->email[i] = NULL;
- }
- for (iterator = e_list_get_iterator(email_list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- email = e_iterator_get(iterator);
- for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) {
- if ((simple->email[i] == NULL)) {
- simple->email[i] = g_strdup(email);
- break;
- }
- }
- }
- gtk_object_unref(GTK_OBJECT(iterator));
-
- for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) {
- e_card_address_label_free(simple->address[i]);
- simple->address[i] = NULL;
- }
- for (iterator = e_list_get_iterator(address_list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- address = e_iterator_get(iterator);
- for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) {
- if (((address->flags & addr_correspondences[i]) == addr_correspondences[i]) && (simple->address[i] == NULL)) {
- simple->address[i] = e_card_address_label_copy(address);
- break;
- }
- }
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- }
-}
-
-void
-e_card_simple_sync_card(ECardSimple *simple)
-{
- ECard *card = simple->card;
- if (card) {
- EList *address_list;
- EList *phone_list;
- EList *email_list;
- const ECardPhone *phone;
- const ECardAddrLabel *address;
- const char *email;
- int i;
- int iterator_next = 1;
-
- EIterator *iterator;
-
- gtk_object_get(GTK_OBJECT(card),
- "address_label", &address_list,
- "phone", &phone_list,
- "email", &email_list,
- NULL);
-
- for (iterator = e_list_get_iterator(phone_list); e_iterator_is_valid(iterator); iterator_next ? e_iterator_next(iterator) : FALSE ) {
- int i;
- phone = e_iterator_get(iterator);
- iterator_next = 1;
- for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) {
- if ((phone->flags & phone_correspondences[i]) == phone_correspondences[i]) {
- if (simple->phone[i]) {
- simple->phone[i]->flags = phone_correspondences[i];
- if (simple->phone[i]->number && *simple->phone[i]->number) {
- e_iterator_set(iterator, simple->phone[i]);
- } else {
- e_iterator_delete(iterator);
- iterator_next = 0;
- }
- e_card_phone_free(simple->phone[i]);
- simple->phone[i] = NULL;
- break;
- }
- }
- }
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) {
- if (simple->phone[i]) {
- simple->phone[i]->flags = phone_correspondences[i];
- e_list_append(phone_list, simple->phone[i]);
- e_card_phone_free(simple->phone[i]);
- simple->phone[i] = NULL;
- }
- }
-
- for (iterator = e_list_get_iterator(email_list); e_iterator_is_valid(iterator); iterator_next ? e_iterator_next(iterator) : FALSE ) {
- int i;
- email = e_iterator_get(iterator);
- iterator_next = 1;
- for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) {
- if (simple->email[i]) {
- if (*simple->email[i]) {
- e_iterator_set(iterator, simple->email[i]);
- } else {
- e_iterator_delete(iterator);
- iterator_next = 0;
- }
- g_free(simple->email[i]);
- simple->email[i] = NULL;
- break;
- }
- }
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) {
- if (simple->email[i]) {
- e_list_append(email_list, simple->email[i]);
- g_free(simple->email[i]);
- simple->email[i] = NULL;
- }
- }
-
- for (iterator = e_list_get_iterator(address_list); e_iterator_is_valid(iterator); iterator_next ? e_iterator_next(iterator) : FALSE ) {
- int i;
- address = e_iterator_get(iterator);
- iterator_next = 1;
- for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) {
- if ((address->flags & addr_correspondences[i]) == addr_correspondences[i]) {
- if (simple->address[i]) {
- simple->address[i]->flags = addr_correspondences[i];
- if (simple->address[i]->data && *simple->address[i]->data) {
- e_iterator_set(iterator, simple->address[i]);
- } else {
- e_iterator_delete(iterator);
- iterator_next = 0;
- }
- e_card_address_label_free(simple->address[i]);
- simple->address[i] = NULL;
- break;
- }
- }
- }
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) {
- if (simple->address[i]) {
- simple->address[i]->flags = addr_correspondences[i];
- e_list_append(address_list, simple->address[i]);
- e_card_address_label_free(simple->address[i]);
- simple->address[i] = NULL;
- }
- }
- fill_in_info(simple);
- }
-}
-
-const ECardPhone *e_card_simple_get_phone (ECardSimple *simple,
- ECardSimplePhoneId id)
-{
- return simple->phone[id];
-}
-
-const char *e_card_simple_get_email (ECardSimple *simple,
- ECardSimpleEmailId id)
-{
- return simple->email[id];
-}
-
-const ECardAddrLabel *e_card_simple_get_address (ECardSimple *simple,
- ECardSimpleAddressId id)
-{
- return simple->address[id];
-}
-
-void e_card_simple_set_phone (ECardSimple *simple,
- ECardSimplePhoneId id,
- const ECardPhone *phone)
-{
- if (simple->phone[id])
- e_card_phone_free(simple->phone[id]);
- simple->phone[id] = e_card_phone_copy(phone);
-}
-
-void e_card_simple_set_email (ECardSimple *simple,
- ECardSimpleEmailId id,
- const char *email)
-{
- if (simple->email[id])
- g_free(simple->email[id]);
- simple->email[id] = g_strdup(email);
-}
-
-void e_card_simple_set_address (ECardSimple *simple,
- ECardSimpleAddressId id,
- const ECardAddrLabel *address)
-{
- if (simple->address[id])
- e_card_address_label_free(simple->address[id]);
- simple->address[id] = e_card_address_label_copy(address);
-}
-
-const char *e_card_simple_get_const (ECardSimple *simple,
- ECardSimpleField field)
-{
- char *ret_val = e_card_simple_get(simple, field);
- if (ret_val)
- simple->temp_fields = g_list_prepend(simple->temp_fields, ret_val);
- return ret_val;
-}
-
-char *e_card_simple_get (ECardSimple *simple,
- ECardSimpleField field)
-{
- ECardSimpleInternalType type = field_data[field].type;
- const ECardAddrLabel *addr;
- const ECardPhone *phone;
- const char *string;
- ECardDate *date;
- switch(type) {
- case E_CARD_SIMPLE_INTERNAL_TYPE_STRING:
- gtk_object_get(GTK_OBJECT(simple->card),
- field_data[field].ecard_field, &string,
- NULL);
- return g_strdup(string);
- case E_CARD_SIMPLE_INTERNAL_TYPE_DATE:
- gtk_object_get(GTK_OBJECT(simple->card),
- field_data[field].ecard_field, &date,
- NULL);
- return NULL; /* FIXME!!!! */
- case E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS:
- addr = e_card_simple_get_address(simple,
- field_data[field].list_type_index);
- if (addr)
- return g_strdup(addr->data);
- else
- return NULL;
- case E_CARD_SIMPLE_INTERNAL_TYPE_PHONE:
- phone = e_card_simple_get_phone(simple,
- field_data[field].list_type_index);
- if (phone)
- return g_strdup(phone->number);
- else
- return NULL;
- case E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL:
- string = e_card_simple_get_email(simple,
- field_data[field].list_type_index);
- return g_strdup(string);
- case E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL:
- switch (field) {
- case E_CARD_SIMPLE_FIELD_NAME_OR_ORG:
- gtk_object_get(GTK_OBJECT(simple->card),
- "full_name", &string,
- NULL);
- if (string && *string)
- return g_strdup(string);
- gtk_object_get(GTK_OBJECT(simple->card),
- "org", &string,
- NULL);
- return g_strdup(string);
- default:
- return NULL;
- }
- default:
- return NULL;
- }
-}
-
-static char *
-name_to_style(const ECardName *name, char *company, int style)
-{
- char *string;
- char *strings[4], **stringptr;
- char *substring;
- switch (style) {
- case 0:
- stringptr = strings;
- 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->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->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 (ECardSimple *simple)
-{
- char *filestring = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FILE_AS);
- char *trystring;
- char *full_name = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FULL_NAME);
- char *company = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_ORG);
- ECardName *name = NULL;
- int i;
- int style;
- style = 0;
- if (!full_name)
- full_name = g_strdup("");
- if (!company)
- company = g_strdup("");
- if (filestring) {
-
- name = e_card_name_from_string(full_name);
-
- if (!name) {
- goto end;
- }
-
- style = -1;
-
- for (i = 0; i < 5; i++) {
- trystring = name_to_style(name, company, i);
- if (!strcmp(trystring, filestring)) {
- g_free(trystring);
- style = i;
- goto end;
- }
- g_free(trystring);
- }
- }
- end:
-
- g_free(filestring);
- g_free(full_name);
- g_free(company);
- if (name)
- e_card_name_free(name);
-
- return style;
-}
-
-static void
-file_as_set_style(ECardSimple *simple, int style)
-{
- if (style != -1) {
- char *string;
- char *full_name = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FULL_NAME);
- char *company = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_ORG);
- ECardName *name;
-
- if (!full_name)
- full_name = g_strdup("");
- if (!company)
- company = g_strdup("");
- name = e_card_name_from_string(full_name);
- if (name) {
- string = name_to_style(name, company, style);
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_FILE_AS, string);
- g_free(string);
- }
- g_free(full_name);
- g_free(company);
- e_card_name_free(name);
- }
-}
-
-void e_card_simple_set (ECardSimple *simple,
- ECardSimpleField field,
- const char *data)
-{
- ECardSimpleInternalType type = field_data[field].type;
- ECardAddrLabel *address;
- ECardPhone *phone;
- int style;
- switch (field) {
- case E_CARD_SIMPLE_FIELD_FULL_NAME:
- case E_CARD_SIMPLE_FIELD_ORG:
- style = file_as_get_style(simple);
- gtk_object_set(GTK_OBJECT(simple->card),
- field_data[field].ecard_field, data,
- NULL);
- file_as_set_style(simple, style);
- break;
- default:
- switch(type) {
- case E_CARD_SIMPLE_INTERNAL_TYPE_STRING:
- gtk_object_set(GTK_OBJECT(simple->card),
- field_data[field].ecard_field, data,
- NULL);
- break;
- case E_CARD_SIMPLE_INTERNAL_TYPE_DATE:
- break; /* FIXME!!!! */
- case E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS:
- address = e_card_address_label_new();
- address->data = (char *) data;
- e_card_simple_set_address(simple,
- field_data[field].list_type_index,
- address);
- address->data = NULL;
- e_card_address_label_free(address);
- break;
- case E_CARD_SIMPLE_INTERNAL_TYPE_PHONE:
- phone = e_card_phone_new();
- phone->number = (char *) data;
- e_card_simple_set_phone(simple,
- field_data[field].list_type_index,
- phone);
- phone->number = NULL;
- e_card_phone_free(phone);
- break;
- case E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL:
- e_card_simple_set_email(simple,
- field_data[field].list_type_index,
- data);
- break;
- case E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL:
- break;
- }
- break;
- }
-}
-
-ECardSimpleType e_card_simple_type (ECardSimple *simple,
- ECardSimpleField field)
-{
- ECardSimpleInternalType type = field_data[field].type;
- switch(type) {
- case E_CARD_SIMPLE_INTERNAL_TYPE_STRING:
- case E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS:
- case E_CARD_SIMPLE_INTERNAL_TYPE_PHONE:
- case E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL:
- default:
- return E_CARD_SIMPLE_TYPE_STRING;
-
- case E_CARD_SIMPLE_INTERNAL_TYPE_DATE:
- return E_CARD_SIMPLE_TYPE_DATE;
-
- case E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL:
- return E_CARD_SIMPLE_TYPE_STRING;
- }
-}
-
-const char *e_card_simple_get_name (ECardSimple *simple,
- ECardSimpleField field)
-{
- return field_data[field].name;
-}
-
-const char *e_card_simple_get_short_name (ECardSimple *simple,
- ECardSimpleField field)
-{
- return field_data[field].short_name;
-}
-
-void e_card_simple_arbitrary_foreach (ECardSimple *simple,
- ECardSimpleArbitraryCallback *callback,
- gpointer closure)
-{
- if (simple->card) {
- EList *list;
- EIterator *iterator;
- gtk_object_get(GTK_OBJECT(simple->card),
- "arbitrary", &list,
- NULL);
- for (iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ECardArbitrary *arbitrary = e_iterator_get(iterator);
- if (callback)
- (*callback) (arbitrary, closure);
- }
- }
-}
-
-const ECardArbitrary *e_card_simple_get_arbitrary (ECardSimple *simple,
- const char *key)
-{
- if (simple->card) {
- EList *list;
- EIterator *iterator;
- gtk_object_get(GTK_OBJECT(simple->card),
- "arbitrary", &list,
- NULL);
- for (iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ECardArbitrary *arbitrary = e_iterator_get(iterator);
- if (!strcasecmp(arbitrary->key, key))
- return arbitrary;
- }
- }
- return NULL;
-}
-
-/* Any of these except key can be NULL */
-void e_card_simple_set_arbitrary (ECardSimple *simple,
- const char *key,
- const char *type,
- const char *value)
-{
- if (simple->card) {
- ECardArbitrary *new_arb;
- EList *list;
- EIterator *iterator;
- gtk_object_get(GTK_OBJECT(simple->card),
- "arbitrary", &list,
- NULL);
- for (iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ECardArbitrary *arbitrary = e_iterator_get(iterator);
- if (!strcasecmp(arbitrary->key, key)) {
- new_arb = e_card_arbitrary_new();
- new_arb->key = g_strdup(key);
- new_arb->type = g_strdup(type);
- new_arb->value = g_strdup(value);
- e_iterator_set(iterator, new_arb);
- e_card_arbitrary_free(new_arb);
- return;
- }
- }
- new_arb = e_card_arbitrary_new();
- new_arb->key = g_strdup(key);
- new_arb->type = g_strdup(type);
- new_arb->value = g_strdup(value);
- e_list_append(list, new_arb);
- e_card_arbitrary_free(new_arb);
- }
-}
-
diff --git a/addressbook/backend/ebook/e-card-simple.h b/addressbook/backend/ebook/e-card-simple.h
deleted file mode 100644
index 2d3b1cb4f4..0000000000
--- a/addressbook/backend/ebook/e-card-simple.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- * Arturo Espinosa
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#ifndef __E_CARD_SIMPLE_H__
-#define __E_CARD_SIMPLE_H__
-
-#include <time.h>
-#include <gtk/gtk.h>
-#include <stdio.h>
-#include <addressbook/backend/ebook/e-card.h>
-#include <addressbook/backend/ebook/e-card-types.h>
-#include <e-util/e-list.h>
-
-#define E_TYPE_CARD_SIMPLE (e_card_simple_get_type ())
-#define E_CARD_SIMPLE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CARD_SIMPLE, ECardSimple))
-#define E_CARD_SIMPLE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CARD_SIMPLE, ECardSimpleClass))
-#define E_IS_CARD_SIMPLE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CARD_SIMPLE))
-#define E_IS_CARD_SIMPLE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_CARD_SIMPLE))
-
-typedef enum _ECardSimplePhoneId ECardSimplePhoneId;
-typedef enum _ECardSimpleEmailId ECardSimpleEmailId;
-typedef enum _ECardSimpleAddressId ECardSimpleAddressId;
-typedef enum _ECardSimpleType ECardSimpleType;
-typedef enum _ECardSimpleField ECardSimpleField;
-
-enum _ECardSimplePhoneId {
- E_CARD_SIMPLE_PHONE_ID_ASSISTANT,
- E_CARD_SIMPLE_PHONE_ID_BUSINESS,
- E_CARD_SIMPLE_PHONE_ID_BUSINESS_2,
- E_CARD_SIMPLE_PHONE_ID_BUSINESS_FAX,
- E_CARD_SIMPLE_PHONE_ID_CALLBACK,
- E_CARD_SIMPLE_PHONE_ID_CAR,
- E_CARD_SIMPLE_PHONE_ID_COMPANY,
- E_CARD_SIMPLE_PHONE_ID_HOME,
- E_CARD_SIMPLE_PHONE_ID_HOME_2,
- E_CARD_SIMPLE_PHONE_ID_HOME_FAX,
- E_CARD_SIMPLE_PHONE_ID_ISDN,
- E_CARD_SIMPLE_PHONE_ID_MOBILE,
- E_CARD_SIMPLE_PHONE_ID_OTHER,
- E_CARD_SIMPLE_PHONE_ID_OTHER_FAX,
- E_CARD_SIMPLE_PHONE_ID_PAGER,
- E_CARD_SIMPLE_PHONE_ID_PRIMARY,
- E_CARD_SIMPLE_PHONE_ID_RADIO,
- E_CARD_SIMPLE_PHONE_ID_TELEX,
- E_CARD_SIMPLE_PHONE_ID_TTYTTD,
- E_CARD_SIMPLE_PHONE_ID_LAST
-};
-
-/* We need HOME and WORK email addresses here. */
-enum _ECardSimpleEmailId {
- E_CARD_SIMPLE_EMAIL_ID_EMAIL,
- E_CARD_SIMPLE_EMAIL_ID_EMAIL_2,
- E_CARD_SIMPLE_EMAIL_ID_EMAIL_3,
- E_CARD_SIMPLE_EMAIL_ID_LAST
-};
-
-/* Should this include (BILLING/SHIPPING)? */
-enum _ECardSimpleAddressId {
- E_CARD_SIMPLE_ADDRESS_ID_BUSINESS,
- E_CARD_SIMPLE_ADDRESS_ID_HOME,
- E_CARD_SIMPLE_ADDRESS_ID_OTHER,
- E_CARD_SIMPLE_ADDRESS_ID_LAST
-};
-
-enum _ECardSimpleType {
- E_CARD_SIMPLE_TYPE_STRING,
- E_CARD_SIMPLE_TYPE_DATE,
-};
-
-enum _ECardSimpleField {
- E_CARD_SIMPLE_FIELD_FILE_AS,
- E_CARD_SIMPLE_FIELD_FULL_NAME,
- E_CARD_SIMPLE_FIELD_EMAIL,
- E_CARD_SIMPLE_FIELD_PHONE_PRIMARY,
- E_CARD_SIMPLE_FIELD_PHONE_BUSINESS,
- E_CARD_SIMPLE_FIELD_PHONE_HOME,
- E_CARD_SIMPLE_FIELD_ORG,
- E_CARD_SIMPLE_FIELD_ADDRESS_BUSINESS,
- E_CARD_SIMPLE_FIELD_ADDRESS_HOME,
- E_CARD_SIMPLE_FIELD_PHONE_MOBILE,
- E_CARD_SIMPLE_FIELD_PHONE_CAR,
- E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX,
- E_CARD_SIMPLE_FIELD_PHONE_HOME_FAX,
- E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2,
- E_CARD_SIMPLE_FIELD_PHONE_HOME_2,
- E_CARD_SIMPLE_FIELD_PHONE_ISDN,
- E_CARD_SIMPLE_FIELD_PHONE_OTHER,
- E_CARD_SIMPLE_FIELD_PHONE_PAGER,
- E_CARD_SIMPLE_FIELD_ADDRESS_OTHER,
- E_CARD_SIMPLE_FIELD_EMAIL_2,
- E_CARD_SIMPLE_FIELD_EMAIL_3,
- E_CARD_SIMPLE_FIELD_URL,
- E_CARD_SIMPLE_FIELD_ORG_UNIT,
- E_CARD_SIMPLE_FIELD_OFFICE,
- E_CARD_SIMPLE_FIELD_TITLE,
- E_CARD_SIMPLE_FIELD_ROLE,
- E_CARD_SIMPLE_FIELD_MANAGER,
- E_CARD_SIMPLE_FIELD_ASSISTANT,
- E_CARD_SIMPLE_FIELD_NICKNAME,
- E_CARD_SIMPLE_FIELD_SPOUSE,
- E_CARD_SIMPLE_FIELD_NOTE,
- E_CARD_SIMPLE_FIELD_FBURL,
- E_CARD_SIMPLE_FIELD_ANNIVERSARY,
- E_CARD_SIMPLE_FIELD_BIRTH_DATE,
- E_CARD_SIMPLE_FIELD_MAILER,
- E_CARD_SIMPLE_FIELD_NAME_OR_ORG,
- E_CARD_SIMPLE_FIELD_LAST
-};
-
-typedef struct _ECardSimple ECardSimple;
-typedef struct _ECardSimpleClass ECardSimpleClass;
-
-struct _ECardSimple {
- GtkObject object;
- ECard *card;
-
- GList *temp_fields;
-
- ECardPhone *phone[E_CARD_SIMPLE_PHONE_ID_LAST];
- char *email[E_CARD_SIMPLE_EMAIL_ID_LAST];
- ECardAddrLabel *address[E_CARD_SIMPLE_ADDRESS_ID_LAST];
-};
-
-struct _ECardSimpleClass {
- GtkObjectClass parent_class;
-};
-
-typedef void (*ECardSimpleArbitraryCallback) (const ECardArbitrary *arbitrary, gpointer closure);
-
-ECardSimple *e_card_simple_new (ECard *card);
-char *e_card_simple_get_id (ECardSimple *simple);
-void e_card_simple_set_id (ECardSimple *simple,
- const gchar *character);
-char *e_card_simple_get_vcard (ECardSimple *simple);
-
-ECardSimple *e_card_simple_duplicate (ECardSimple *simple);
-
-char *e_card_simple_get (ECardSimple *simple,
- ECardSimpleField field);
-const char *e_card_simple_get_const (ECardSimple *simple,
- ECardSimpleField field);
-void e_card_simple_set (ECardSimple *simple,
- ECardSimpleField field,
- const char *data);
-
-ECardSimpleType e_card_simple_type (ECardSimple *simple,
- ECardSimpleField field);
-const char *e_card_simple_get_name (ECardSimple *simple,
- ECardSimpleField field);
-const char *e_card_simple_get_short_name (ECardSimple *simple,
- ECardSimpleField field);
-
-
-/* Use these only if building lists of specific types. It should be
- * easier to use the above if you consider a phone field to be the
- * same as any other field.
- */
-const ECardPhone *e_card_simple_get_phone (ECardSimple *simple,
- ECardSimplePhoneId id);
-const char *e_card_simple_get_email (ECardSimple *simple,
- ECardSimpleEmailId id);
-const ECardAddrLabel *e_card_simple_get_address (ECardSimple *simple,
- ECardSimpleAddressId id);
-void e_card_simple_set_phone (ECardSimple *simple,
- ECardSimplePhoneId id,
- const ECardPhone *phone);
-void e_card_simple_set_email (ECardSimple *simple,
- ECardSimpleEmailId id,
- const char *email);
-void e_card_simple_set_address (ECardSimple *simple,
- ECardSimpleAddressId id,
- const ECardAddrLabel *address);
-
-void e_card_simple_arbitrary_foreach (ECardSimple *simple,
- ECardSimpleArbitraryCallback *callback,
- gpointer closure);
-const ECardArbitrary *e_card_simple_get_arbitrary (ECardSimple *simple,
- const char *key);
-/* Any of these except key can be NULL */
-void e_card_simple_set_arbitrary (ECardSimple *simple,
- const char *key,
- const char *type,
- const char *value);
-
-void e_card_simple_sync_card (ECardSimple *simple);
-
-/* Standard Gtk function */
-GtkType e_card_simple_get_type (void);
-
-#endif /* ! __E_CARD_SIMPLE_H__ */
diff --git a/addressbook/backend/ebook/e-card-types.h b/addressbook/backend/ebook/e-card-types.h
deleted file mode 100644
index a2563d4bf6..0000000000
--- a/addressbook/backend/ebook/e-card-types.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Arturo Espinosa
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#ifndef __E_CARD_TYPES_H__
-#define __E_CARD_TYPES_H__
-
-/* IDENTIFICATION PROPERTIES */
-
-typedef struct {
- char *prefix; /* Mr. */
- char *given; /* John */
- char *additional; /* Quinlan */
- char *family; /* Public */
- char *suffix; /* Esq. */
-} ECardName;
-
-typedef struct {
- int year;
- int month;
- int day;
-} ECardDate;
-
-/* TELECOMMUNICATIONS ADDRESSING PROPERTIES */
-
-typedef enum {
- E_CARD_PHONE_PREF = 1 << 0,
- E_CARD_PHONE_WORK = 1 << 1,
- E_CARD_PHONE_HOME = 1 << 2,
- E_CARD_PHONE_VOICE = 1 << 3,
- E_CARD_PHONE_FAX = 1 << 4,
- E_CARD_PHONE_MSG = 1 << 5,
- E_CARD_PHONE_CELL = 1 << 6,
- E_CARD_PHONE_PAGER = 1 << 7,
- E_CARD_PHONE_BBS = 1 << 8,
- E_CARD_PHONE_MODEM = 1 << 9,
- E_CARD_PHONE_CAR = 1 << 10,
- E_CARD_PHONE_ISDN = 1 << 11,
- E_CARD_PHONE_VIDEO = 1 << 12
-} ECardPhoneFlags;
-
-typedef struct {
- ECardPhoneFlags flags;
- char *number;
-} ECardPhone;
-
-/* DELIVERY ADDRESSING PROPERTIES */
-
-typedef enum {
- E_CARD_ADDR_HOME = 1 << 0,
- E_CARD_ADDR_WORK = 1 << 1,
- E_CARD_ADDR_POSTAL = 1 << 2,
- E_CARD_ADDR_PARCEL = 1 << 3,
- E_CARD_ADDR_DOM = 1 << 4,
- E_CARD_ADDR_INTL = 1 << 5
-} ECardAddressFlags;
-
-typedef struct {
- ECardAddressFlags flags;
-
- char *po;
- char *ext;
- char *street;
- char *city;
- char *region;
- char *code;
- char *country;
-} ECardDeliveryAddress;
-
-typedef struct {
- ECardAddressFlags flags;
- char *data;
-} ECardAddrLabel;
-
-/* ARBITRARY PROPERTIES */
-
-typedef struct {
- char *key;
- char *type;
- char *value;
-} ECardArbitrary;
-
-/* PILOT SYNC STATUS */
-
-enum {
- E_CARD_PILOT_STATUS_NONE,
- E_CARD_PILOT_STATUS_MOD,
- E_CARD_PILOT_STATUS_DEL
-};
-
-#endif /* __E_CARD_TYPES_H__ */
diff --git a/addressbook/backend/ebook/e-card.c b/addressbook/backend/ebook/e-card.c
deleted file mode 100644
index a81544dcd3..0000000000
--- a/addressbook/backend/ebook/e-card.c
+++ /dev/null
@@ -1,3295 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Arturo Espinosa (arturo@nuclecu.unam.mx)
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-
-#include <libversit/vcc.h>
-#include "e-card.h"
-#include "e-card-pairs.h"
-#include "e-name-western.h"
-
-#include <e-util/e-util.h>
-
-#define is_a_prop_of(obj,prop) (isAPropertyOf ((obj),(prop)))
-#define str_val(obj) (the_str = (vObjectValueType (obj))? fakeCString (vObjectUStringZValue (obj)) : calloc (1, 1))
-#define has(obj,prop) (vo = isAPropertyOf ((obj), (prop)))
-
-#define XEV_PILOT_ID "X-EVOLUTION-PILOTID"
-#define XEV_PILOT_STATUS "X-EVOLUTION-PILOTSTATUS"
-#define XEV_ARBITRARY "X-EVOLUTION-ARBITRARY"
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_FILE_AS,
- ARG_FULL_NAME,
- ARG_NAME,
- ARG_ADDRESS,
- ARG_ADDRESS_LABEL,
- ARG_PHONE,
- ARG_EMAIL,
- ARG_BIRTH_DATE,
- ARG_URL,
- ARG_ORG,
- ARG_ORG_UNIT,
- ARG_OFFICE,
- ARG_TITLE,
- ARG_ROLE,
- ARG_MANAGER,
- ARG_ASSISTANT,
- ARG_NICKNAME,
- ARG_SPOUSE,
- ARG_ANNIVERSARY,
- ARG_MAILER,
- ARG_FBURL,
- ARG_NOTE,
- ARG_CATEGORIES,
- ARG_CATEGORY_LIST,
- ARG_PILOTID,
- ARG_PILOTSTATUS,
- ARG_ARBITRARY,
- ARG_ID,
-};
-
-#if 0
-static VObject *card_convert_to_vobject (ECard *crd);
-#endif
-static void parse(ECard *card, VObject *vobj);
-static void e_card_init (ECard *card);
-static void e_card_class_init (ECardClass *klass);
-
-static void e_card_destroy (GtkObject *object);
-static void e_card_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_card_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-static void assign_string(VObject *vobj, char **string);
-
-char *e_v_object_get_child_value(VObject *vobj, char *name);
-static ECardDate e_card_date_from_string (char *str);
-
-static void parse_bday(ECard *card, VObject *object);
-static void parse_full_name(ECard *card, VObject *object);
-static void parse_file_as(ECard *card, VObject *object);
-static void parse_name(ECard *card, VObject *object);
-static void parse_email(ECard *card, VObject *object);
-static void parse_phone(ECard *card, VObject *object);
-static void parse_address(ECard *card, VObject *object);
-static void parse_address_label(ECard *card, VObject *object);
-static void parse_url(ECard *card, VObject *object);
-static void parse_org(ECard *card, VObject *object);
-static void parse_office(ECard *card, VObject *object);
-static void parse_title(ECard *card, VObject *object);
-static void parse_role(ECard *card, VObject *object);
-static void parse_manager(ECard *card, VObject *object);
-static void parse_assistant(ECard *card, VObject *object);
-static void parse_nickname(ECard *card, VObject *object);
-static void parse_spouse(ECard *card, VObject *object);
-static void parse_anniversary(ECard *card, VObject *object);
-static void parse_mailer(ECard *card, VObject *object);
-static void parse_fburl(ECard *card, VObject *object);
-static void parse_note(ECard *card, VObject *object);
-static void parse_categories(ECard *card, VObject *object);
-static void parse_pilot_id(ECard *card, VObject *object);
-static void parse_pilot_status(ECard *card, VObject *object);
-static void parse_arbitrary(ECard *card, VObject *object);
-static void parse_id(ECard *card, VObject *object);
-
-static ECardPhoneFlags get_phone_flags (VObject *vobj);
-static void set_phone_flags (VObject *vobj, ECardPhoneFlags flags);
-static ECardAddressFlags get_address_flags (VObject *vobj);
-static void set_address_flags (VObject *vobj, ECardAddressFlags flags);
-
-typedef void (* ParsePropertyFunc) (ECard *card, VObject *object);
-
-struct {
- char *key;
- ParsePropertyFunc function;
-} attribute_jump_array[] =
-{
- { VCFullNameProp, parse_full_name },
- { "X-EVOLUTION-FILE-AS", parse_file_as },
- { VCNameProp, parse_name },
- { VCBirthDateProp, parse_bday },
- { VCEmailAddressProp, parse_email },
- { VCTelephoneProp, parse_phone },
- { VCAdrProp, parse_address },
- { VCDeliveryLabelProp, parse_address_label },
- { VCURLProp, parse_url },
- { VCOrgProp, parse_org },
- { "X-EVOLUTION-OFFICE", parse_office },
- { VCTitleProp, parse_title },
- { VCBusinessRoleProp, parse_role },
- { "X-EVOLUTION-MANAGER", parse_manager },
- { "X-EVOLUTION-ASSISTANT", parse_assistant },
- { "NICKNAME", parse_nickname },
- { "X-EVOLUTION-SPOUSE", parse_spouse },
- { "X-EVOLUTION-ANNIVERSARY", parse_anniversary },
- { VCMailerProp, parse_mailer },
- { "FBURL", parse_fburl },
- { VCNoteProp, parse_note },
- { "CATEGORIES", parse_categories },
- { XEV_PILOT_ID, parse_pilot_id },
- { XEV_PILOT_STATUS, parse_pilot_status },
- { XEV_ARBITRARY, parse_arbitrary },
- { VCUniqueStringProp, parse_id }
-};
-
-/**
- * e_card_get_type:
- * @void:
- *
- * Registers the &ECard class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ECard class.
- **/
-GtkType
-e_card_get_type (void)
-{
- static GtkType card_type = 0;
-
- if (!card_type) {
- GtkTypeInfo card_info = {
- "ECard",
- sizeof (ECard),
- sizeof (ECardClass),
- (GtkClassInitFunc) e_card_class_init,
- (GtkObjectInitFunc) e_card_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- card_type = gtk_type_unique (gtk_object_get_type (), &card_info);
- }
-
- return card_type;
-}
-
-/**
- * e_card_new:
- * @vcard: a string in vCard format
- *
- * Returns: a new #ECard that wraps the @vcard.
- */
-ECard *
-e_card_new (char *vcard)
-{
- ECard *card = E_CARD(gtk_type_new(e_card_get_type()));
- VObject *vobj = Parse_MIME(vcard, strlen(vcard));
- while(vobj) {
- VObject *next;
- parse(card, vobj);
- next = nextVObjectInList(vobj);
- cleanVObject(vobj);
- vobj = next;
- }
- return card;
-}
-
-ECard *e_card_duplicate(ECard *card)
-{
- char *vcard = e_card_get_vcard(card);
- ECard *new_card = e_card_new(vcard);
- g_free (vcard);
- return new_card;
-}
-
-/**
- * e_card_get_id:
- * @card: an #ECard
- *
- * Returns: a string representing the id of the card, which is unique
- * within its book.
- */
-char *
-e_card_get_id (ECard *card)
-{
- return card->id;
-}
-
-/**
- * e_card_get_id:
- * @card: an #ECard
- * @id: a id in string format
- *
- * Sets the identifier of a card, which should be unique within its
- * book.
- */
-void
-e_card_set_id (ECard *card, const char *id)
-{
- if ( card->id )
- g_free(card->id);
- card->id = g_strdup(id);
-}
-
-/**
- * e_card_get_vcard:
- * @card: an #ECard
- *
- * Returns: a string in vCard format, which is wrapped by the @card.
- */
-char
-*e_card_get_vcard (ECard *card)
-{
- VObject *vobj; /*, *vprop; */
- char *temp, *ret_val;
-
- vobj = newVObject (VCCardProp);
-
- if ( card->file_as && *card->file_as )
- addPropValue(vobj, "X-EVOLUTION-FILE-AS", card->file_as);
- else if (card->file_as)
- addProp(vobj, "X-EVOLUTION-FILE_AS");
-
- if ( card->fname )
- addPropValue(vobj, VCFullNameProp, card->fname);
-
- if ( card->name && (card->name->prefix || card->name->given || card->name->additional || card->name->family || card->name->suffix) ) {
- VObject *nameprop;
- nameprop = addProp(vobj, VCNameProp);
- if ( card->name->prefix )
- addPropValue(nameprop, VCNamePrefixesProp, card->name->prefix);
- if ( card->name->given )
- addPropValue(nameprop, VCGivenNameProp, card->name->given);
- if ( card->name->additional )
- addPropValue(nameprop, VCAdditionalNamesProp, card->name->additional);
- if ( card->name->family )
- addPropValue(nameprop, VCFamilyNameProp, card->name->family);
- if ( card->name->suffix )
- addPropValue(nameprop, VCNameSuffixesProp, card->name->suffix);
- }
-
-
- if ( card->address ) {
- EIterator *iterator = e_list_get_iterator(card->address);
- for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) {
- VObject *addressprop;
- ECardDeliveryAddress *address = (ECardDeliveryAddress *) e_iterator_get(iterator);
- addressprop = addProp(vobj, VCAdrProp);
-
- set_address_flags (addressprop, address->flags);
- if ( address->po )
- addPropValue(addressprop, VCPostalBoxProp, address->po);
- if ( address->ext )
- addPropValue(addressprop, VCExtAddressProp, address->ext);
- if ( address->street )
- addPropValue(addressprop, VCStreetAddressProp, address->street);
- if ( address->city )
- addPropValue(addressprop, VCCityProp, address->city);
- if ( address->region )
- addPropValue(addressprop, VCRegionProp, address->region);
- if ( address->code )
- addPropValue(addressprop, VCPostalCodeProp, address->code);
- if ( address->country )
- addPropValue(addressprop, VCCountryNameProp, address->country);
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- }
-
- if ( card->address_label ) {
- EIterator *iterator = e_list_get_iterator(card->address_label);
- for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) {
- VObject *labelprop;
- ECardAddrLabel *address_label = (ECardAddrLabel *) e_iterator_get(iterator);
- if (address_label->data)
- labelprop = addPropValue(vobj, VCDeliveryLabelProp, address_label->data);
- else
- labelprop = addProp(vobj, VCDeliveryLabelProp);
-
- set_address_flags (labelprop, address_label->flags);
- addProp(labelprop, VCQuotedPrintableProp);
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- }
-
- if ( card->phone ) {
- EIterator *iterator = e_list_get_iterator(card->phone);
- for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) {
- VObject *phoneprop;
- ECardPhone *phone = (ECardPhone *) e_iterator_get(iterator);
- phoneprop = addPropValue(vobj, VCTelephoneProp, phone->number);
-
- set_phone_flags (phoneprop, phone->flags);
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- }
-
- if ( card->email ) {
- EIterator *iterator = e_list_get_iterator(card->email);
- for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) {
- VObject *emailprop;
- emailprop = addPropValue(vobj, VCEmailAddressProp, (char *) e_iterator_get(iterator));
- addProp (emailprop, VCInternetProp);
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- }
-
- if ( card->bday ) {
- ECardDate date;
- char *value;
- date = *card->bday;
- date.year = MIN(date.year, 9999);
- date.month = MIN(date.month, 12);
- date.day = MIN(date.day, 31);
- value = g_strdup_printf("%04d-%02d-%02d", date.year, date.month, date.day);
- addPropValue(vobj, VCBirthDateProp, value);
- g_free(value);
- }
-
- if (card->url)
- addPropValue(vobj, VCURLProp, card->url);
-
- if (card->org || card->org_unit) {
- VObject *orgprop;
- orgprop = addProp(vobj, VCOrgProp);
-
- if (card->org)
- addPropValue(orgprop, VCOrgNameProp, card->org);
- if (card->org_unit)
- addPropValue(orgprop, VCOrgUnitProp, card->org_unit);
- }
-
- if (card->office)
- addPropValue(vobj, "X-EVOLUTION-OFFICE", card->office);
-
- if (card->title)
- addPropValue(vobj, VCTitleProp, card->title);
-
- if (card->role)
- addPropValue(vobj, VCBusinessRoleProp, card->role);
-
- if (card->manager)
- addPropValue(vobj, "X-EVOLUTION-MANAGER", card->manager);
-
- if (card->assistant)
- addPropValue(vobj, "X-EVOLUTION-ASSISTANT", card->assistant);
-
- if (card->nickname)
- addPropValue(vobj, "NICKNAME", card->nickname);
-
- if (card->spouse)
- addPropValue(vobj, "X-EVOLUTION-SPOUSE", card->spouse);
-
- if ( card->anniversary ) {
- ECardDate date;
- char *value;
- date = *card->anniversary;
- date.year = MIN(date.year, 9999);
- date.month = MIN(date.month, 12);
- date.day = MIN(date.day, 31);
- value = g_strdup_printf("%04d-%02d-%02d", date.year, date.month, date.day);
- addPropValue(vobj, "X-EVOLUTION-ANNIVERSARY", value);
- g_free(value);
- }
-
- if (card->mailer) {
- addPropValue(vobj, VCMailerProp, card->mailer);
- }
-
- if (card->fburl)
- addPropValue(vobj, "FBURL", card->fburl);
-
- if (card->note)
- addPropValue(vobj, VCNoteProp, card->note);
-
- if (card->categories) {
- EIterator *iterator;
- int length = 0;
- char *string;
- char *stringptr;
- for (iterator = e_list_get_iterator(card->categories); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- length += strlen(e_iterator_get(iterator)) + 1;
- }
- string = g_new(char, length + 1);
- stringptr = string;
- *stringptr = 0;
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- strcpy(stringptr, e_iterator_get(iterator));
- stringptr += strlen(stringptr);
- *stringptr = ',';
- stringptr++;
- *stringptr = 0;
- }
- if (stringptr > string) {
- stringptr --;
- *stringptr = 0;
- }
- addPropValue (vobj, "CATEGORIES", string);
- g_free(string);
- }
-
- if (card->pilot_id) {
- gchar *pilotid_str;
- pilotid_str = g_strdup_printf ("%d", card->pilot_id);
- addPropValue (vobj, XEV_PILOT_ID, pilotid_str);
- g_free (pilotid_str);
- }
-
- if (card->pilot_status) {
- gchar *pilotstatus_str;
- pilotstatus_str = g_strdup_printf ("%d", card->pilot_status);
- addPropValue (vobj, XEV_PILOT_STATUS, pilotstatus_str);
- g_free (pilotstatus_str);
- }
-
- if (card->arbitrary) {
- EIterator *iterator;
- for (iterator = e_list_get_iterator(card->arbitrary); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ECardArbitrary *arbitrary = e_iterator_get(iterator);
- VObject *arb_object;
- if (arbitrary->value) {
- arb_object = addPropValue (vobj, XEV_ARBITRARY, arbitrary->value);
- } else {
- arb_object = addProp (vobj, XEV_ARBITRARY);
- }
- if (arbitrary->type) {
- addPropValue (arb_object, "TYPE", arbitrary->type);
- }
- if (arbitrary->key) {
- addProp (arb_object, arbitrary->key);
- }
- }
- }
-
- if (card->id)
- addPropValue (vobj, VCUniqueStringProp, card->id);
-#if 0
-
-
- if (crd->photo.prop.used) {
- vprop = addPropSizedValue (vobj, VCPhotoProp,
- crd->photo.data, crd->photo.size);
- add_PhotoType (vprop, crd->photo.type);
- add_CardProperty (vprop, &crd->photo.prop);
- }
-
- if (crd->xtension.l) {
- GList *node;
-
- for (node = crd->xtension.l; node; node = node->next) {
- CardXProperty *xp = (CardXProperty *) node->data;
- addPropValue (vobj, xp->name, xp->data);
- add_CardProperty (vobj, &xp->prop);
- }
- }
-
- if (crd->timezn.prop.used) {
- char *str;
-
- str = card_timezn_str (crd->timezn);
- vprop = addPropValue (vobj, VCTimeZoneProp, str);
- free (str);
- add_CardProperty (vprop, &crd->timezn.prop);
- }
-
- if (crd->geopos.prop.used) {
- char *str;
-
- str = card_geopos_str (crd->geopos);
- vprop = addPropValue (vobj, VCGeoLocationProp, str);
- free (str);
- add_CardProperty (vprop, &crd->geopos.prop);
- }
-
- if (crd->logo.prop.used) {
- vprop = addPropSizedValue (vobj, VCLogoProp,
- crd->logo.data, crd->logo.size);
- add_PhotoType (vprop, crd->logo.type);
- add_CardProperty (vprop, &crd->logo.prop);
- }
-
- if (crd->agent)
- addVObjectProp (vobj, card_convert_to_vobject (crd->agent));
-
- if (crd->sound.prop.used) {
- if (crd->sound.type != SOUND_PHONETIC)
- vprop = addPropSizedValue (vobj, VCPronunciationProp,
- crd->sound.data, crd->sound.size);
- else
- vprop = addPropValue (vobj, VCPronunciationProp,
- crd->sound.data);
-
- add_SoundType (vprop, crd->sound.type);
- add_CardProperty (vprop, &crd->sound.prop);
- }
-
- if (crd->key.prop.used) {
- vprop = addPropValue (vobj, VCPublicKeyProp, crd->key.data);
- add_KeyType (vprop, crd->key.type);
- add_CardProperty (vprop, &crd->key.prop);
- }
-#endif
- temp = writeMemVObject(NULL, NULL, vobj);
- ret_val = g_strdup(temp);
- free(temp);
- cleanVObject(vobj);
- return ret_val;
-}
-
-static void
-parse_file_as(ECard *card, VObject *vobj)
-{
- if ( card->file_as )
- g_free(card->file_as);
- assign_string(vobj, &(card->file_as));
-}
-
-static void
-parse_name(ECard *card, VObject *vobj)
-{
- if ( card->name ) {
- e_card_name_free(card->name);
- }
- card->name = g_new(ECardName, 1);
-
- card->name->family = e_v_object_get_child_value (vobj, VCFamilyNameProp);
- card->name->given = e_v_object_get_child_value (vobj, VCGivenNameProp);
- card->name->additional = e_v_object_get_child_value (vobj, VCAdditionalNamesProp);
- card->name->prefix = e_v_object_get_child_value (vobj, VCNamePrefixesProp);
- card->name->suffix = e_v_object_get_child_value (vobj, VCNameSuffixesProp);
-}
-
-static void
-parse_full_name(ECard *card, VObject *vobj)
-{
- if ( card->fname )
- g_free(card->fname);
- assign_string(vobj, &(card->fname));
-}
-
-static void
-parse_email(ECard *card, VObject *vobj)
-{
- char *next_email;
- EList *list;
-
- assign_string(vobj, &next_email);
- gtk_object_get(GTK_OBJECT(card),
- "email", &list,
- NULL);
- e_list_append(list, next_email);
- g_free (next_email);
-}
-
-static void
-parse_bday(ECard *card, VObject *vobj)
-{
- if ( vObjectValueType (vobj) ) {
- char *str = fakeCString (vObjectUStringZValue (vobj));
- if ( card->bday )
- g_free(card->bday);
- card->bday = g_new(ECardDate, 1);
- *(card->bday) = e_card_date_from_string(str);
- free(str);
- }
-}
-
-static void
-parse_phone(ECard *card, VObject *vobj)
-{
- ECardPhone *next_phone = g_new(ECardPhone, 1);
- EList *list;
-
- assign_string(vobj, &(next_phone->number));
- next_phone->flags = get_phone_flags(vobj);
-
- gtk_object_get(GTK_OBJECT(card),
- "phone", &list,
- NULL);
- e_list_append(list, next_phone);
- e_card_phone_free (next_phone);
-}
-
-static void
-parse_address(ECard *card, VObject *vobj)
-{
- ECardDeliveryAddress *next_addr = g_new(ECardDeliveryAddress, 1);
- EList *list;
-
- next_addr->flags = get_address_flags (vobj);
- next_addr->po = e_v_object_get_child_value (vobj, VCPostalBoxProp);
- next_addr->ext = e_v_object_get_child_value (vobj, VCExtAddressProp);
- next_addr->street = e_v_object_get_child_value (vobj, VCStreetAddressProp);
- next_addr->city = e_v_object_get_child_value (vobj, VCCityProp);
- next_addr->region = e_v_object_get_child_value (vobj, VCRegionProp);
- next_addr->code = e_v_object_get_child_value (vobj, VCPostalCodeProp);
- next_addr->country = e_v_object_get_child_value (vobj, VCCountryNameProp);
-
- gtk_object_get(GTK_OBJECT(card),
- "address", &list,
- NULL);
- e_list_append(list, next_addr);
- e_card_delivery_address_free (next_addr);
-}
-
-static void
-parse_address_label(ECard *card, VObject *vobj)
-{
- ECardAddrLabel *next_addr = g_new(ECardAddrLabel, 1);
- EList *list;
-
- next_addr->flags = get_address_flags (vobj);
- assign_string(vobj, &next_addr->data);
-
- gtk_object_get(GTK_OBJECT(card),
- "address_label", &list,
- NULL);
- e_list_append(list, next_addr);
- e_card_address_label_free (next_addr);
-}
-
-static void
-parse_url(ECard *card, VObject *vobj)
-{
- if (card->url)
- g_free(card->url);
- assign_string(vobj, &(card->url));
-}
-
-static void
-parse_org(ECard *card, VObject *vobj)
-{
- char *temp;
-
- temp = e_v_object_get_child_value(vobj, VCOrgNameProp);
- if (temp) {
- if (card->org)
- g_free(card->org);
- card->org = temp;
- }
- temp = e_v_object_get_child_value(vobj, VCOrgUnitProp);
- if (temp) {
- if (card->org_unit)
- g_free(card->org_unit);
- card->org_unit = temp;
- }
-}
-
-static void
-parse_office(ECard *card, VObject *vobj)
-{
- if ( card->office )
- g_free(card->office);
- assign_string(vobj, &(card->office));
-}
-
-static void
-parse_title(ECard *card, VObject *vobj)
-{
- if ( card->title )
- g_free(card->title);
- assign_string(vobj, &(card->title));
-}
-
-static void
-parse_role(ECard *card, VObject *vobj)
-{
- if (card->role)
- g_free(card->role);
- assign_string(vobj, &(card->role));
-}
-
-static void
-parse_manager(ECard *card, VObject *vobj)
-{
- if ( card->manager )
- g_free(card->manager);
- assign_string(vobj, &(card->manager));
-}
-
-static void
-parse_assistant(ECard *card, VObject *vobj)
-{
- if ( card->assistant )
- g_free(card->assistant);
- assign_string(vobj, &(card->assistant));
-}
-
-static void
-parse_nickname(ECard *card, VObject *vobj)
-{
- if (card->nickname)
- g_free(card->nickname);
- assign_string(vobj, &(card->nickname));
-}
-
-static void
-parse_spouse(ECard *card, VObject *vobj)
-{
- if ( card->spouse )
- g_free(card->spouse);
- assign_string(vobj, &(card->spouse));
-}
-
-static void
-parse_anniversary(ECard *card, VObject *vobj)
-{
- if ( vObjectValueType (vobj) ) {
- char *str = fakeCString (vObjectUStringZValue (vobj));
- if (card->anniversary)
- g_free(card->anniversary);
- card->anniversary = g_new(ECardDate, 1);
- *(card->anniversary) = e_card_date_from_string(str);
- free(str);
- }
-}
-
-static void
-parse_mailer(ECard *card, VObject *vobj)
-{
- if ( card->mailer )
- g_free(card->mailer);
- assign_string(vobj, &(card->mailer));
-}
-
-static void
-parse_fburl(ECard *card, VObject *vobj)
-{
- g_free(card->fburl);
- assign_string(vobj, &(card->fburl));
-}
-
-static void
-parse_note(ECard *card, VObject *vobj)
-{
- g_free(card->note);
- assign_string(vobj, &(card->note));
-}
-
-static void
-add_list_unique(ECard *card, EList *list, char *string)
-{
- char *temp = e_strdup_strip(string);
- EIterator *iterator;
-
- if (!*temp) {
- g_free(temp);
- return;
- }
- for ( iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- if (!strcmp(e_iterator_get(iterator), temp)) {
- break;
- }
- }
- if (!e_iterator_is_valid(iterator)) {
- e_list_append(list, temp);
- }
- g_free(temp);
- gtk_object_unref(GTK_OBJECT(iterator));
-}
-
-static void
-do_parse_categories(ECard *card, char *str)
-{
- int length = strlen(str);
- char *copy = g_new(char, length + 1);
- int i, j;
- EList *list;
- gtk_object_get(GTK_OBJECT(card),
- "category_list", &list,
- NULL);
- for (i = 0, j = 0; str[i]; i++, j++) {
- switch (str[i]) {
- case '\\':
- i++;
- if (str[i]) {
- copy[j] = str[i];
- } else
- i--;
- break;
- case ',':
- copy[j] = 0;
- add_list_unique(card, list, copy);
- j = -1;
- break;
- default:
- copy[j] = str[i];
- break;
- }
- }
- copy[j] = 0;
- add_list_unique(card, list, copy);
- g_free(copy);
-}
-
-static void
-parse_categories(ECard *card, VObject *vobj)
-{
- if ( vObjectValueType (vobj) ) {
- char *str = fakeCString (vObjectUStringZValue (vobj));
- do_parse_categories(card, str);
- free(str);
- }
-}
-
-static void
-parse_pilot_id(ECard *card, VObject *vobj)
-{
- if ( vObjectValueType (vobj) ) {
- char *str = fakeCString (vObjectUStringZValue (vobj));
- card->pilot_id = atoi(str);
- free(str);
- }
-}
-
-static void
-parse_pilot_status(ECard *card, VObject *vobj)
-{
- if ( vObjectValueType (vobj) ) {
- char *str = fakeCString (vObjectUStringZValue (vobj));
- card->pilot_status = atoi(str);
- free(str);
- }
-}
-
-typedef union ValueItem {
- const char *strs;
- const wchar_t *ustrs;
- unsigned int i;
- unsigned long l;
- void *any;
- VObject *vobj;
-} ValueItem;
-
-struct VObject {
- VObject *next;
- const char *id;
- VObject *prop;
- unsigned short valType;
- ValueItem val;
-};
-
-static void
-parse_arbitrary(ECard *card, VObject *vobj)
-{
- ECardArbitrary *arbitrary = e_card_arbitrary_new();
- VObjectIterator iterator;
- EList *list;
- for ( initPropIterator (&iterator, vobj); moreIteration(&iterator); ) {
- VObject *temp = nextVObject(&iterator);
- const char *name = vObjectName(temp);
- if (name && !strcmp(name, "TYPE")) {
- g_free(arbitrary->type);
- assign_string(temp, &(arbitrary->type));
- } else {
- g_free(arbitrary->key);
- arbitrary->key = g_strdup(name);
- }
- }
-
- assign_string(vobj, &(arbitrary->value));
-
- gtk_object_get(GTK_OBJECT(card),
- "arbitrary", &list,
- NULL);
- e_list_append(list, arbitrary);
- e_card_arbitrary_free(arbitrary);
-}
-
-static void
-parse_id(ECard *card, VObject *vobj)
-{
- if ( card->id )
- g_free(card->id);
- assign_string(vobj, &(card->id));
-}
-
-static void
-parse_attribute(ECard *card, VObject *vobj)
-{
- ParsePropertyFunc function = g_hash_table_lookup(E_CARD_CLASS(GTK_OBJECT(card)->klass)->attribute_jump_table, vObjectName(vobj));
- if ( function )
- function(card, vobj);
-}
-
-static void
-parse(ECard *card, VObject *vobj)
-{
- VObjectIterator iterator;
- initPropIterator(&iterator, vobj);
- while(moreIteration (&iterator)) {
- parse_attribute(card, nextVObject(&iterator));
- }
- if (!card->name) {
- if (card->fname) {
- card->name = e_card_name_from_string(card->fname);
- }
- }
- if (!card->file_as) {
- if (card->name) {
- ECardName *name = card->name;
- char *strings[3], **stringptr;
- char *string;
- stringptr = strings;
- if (name->family && *name->family)
- *(stringptr++) = name->family;
- if (name->given && *name->given)
- *(stringptr++) = name->given;
- *stringptr = NULL;
- string = g_strjoinv(", ", strings);
- card->file_as = string;
- } else
- card->file_as = g_strdup("");
- }
-}
-
-static void
-e_card_class_init (ECardClass *klass)
-{
- int i;
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
-
- klass->attribute_jump_table = g_hash_table_new(g_str_hash, g_str_equal);
-
- for ( i = 0; i < sizeof(attribute_jump_array) / sizeof(attribute_jump_array[0]); i++ ) {
- g_hash_table_insert(klass->attribute_jump_table, attribute_jump_array[i].key, attribute_jump_array[i].function);
- }
-
- gtk_object_add_arg_type ("ECard::file_as",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FILE_AS);
- gtk_object_add_arg_type ("ECard::full_name",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FULL_NAME);
- gtk_object_add_arg_type ("ECard::name",
- GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_NAME);
- gtk_object_add_arg_type ("ECard::address",
- GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_ADDRESS);
- gtk_object_add_arg_type ("ECard::address_label",
- GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_ADDRESS_LABEL);
- gtk_object_add_arg_type ("ECard::phone",
- GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_PHONE);
- gtk_object_add_arg_type ("ECard::email",
- GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_EMAIL);
- gtk_object_add_arg_type ("ECard::birth_date",
- GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_BIRTH_DATE);
- gtk_object_add_arg_type ("ECard::url",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_URL);
- gtk_object_add_arg_type ("ECard::org",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ORG);
- gtk_object_add_arg_type ("ECard::org_unit",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ORG_UNIT);
- gtk_object_add_arg_type ("ECard::office",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_OFFICE);
- gtk_object_add_arg_type ("ECard::title",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_TITLE);
- gtk_object_add_arg_type ("ECard::role",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ROLE);
- gtk_object_add_arg_type ("ECard::manager",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_MANAGER);
- gtk_object_add_arg_type ("ECard::assistant",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ASSISTANT);
- gtk_object_add_arg_type ("ECard::nickname",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NICKNAME);
- gtk_object_add_arg_type ("ECard::spouse",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_SPOUSE);
- gtk_object_add_arg_type ("ECard::anniversary",
- GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_ANNIVERSARY);
- gtk_object_add_arg_type ("ECard::mailer",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_MAILER);
- gtk_object_add_arg_type ("ECard::fburl",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FBURL);
- gtk_object_add_arg_type ("ECard::note",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NOTE);
- gtk_object_add_arg_type ("ECard::categories",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_CATEGORIES);
- gtk_object_add_arg_type ("ECard::category_list",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CATEGORY_LIST);
- gtk_object_add_arg_type ("ECard::pilot_id",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_PILOTID);
- gtk_object_add_arg_type ("ECard::pilot_status",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_PILOTSTATUS);
- gtk_object_add_arg_type ("ECard::arbitrary",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_ARBITRARY);
- gtk_object_add_arg_type ("ECard::id",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ID);
-
-
- object_class->destroy = e_card_destroy;
- object_class->get_arg = e_card_get_arg;
- object_class->set_arg = e_card_set_arg;
-}
-
-ECardPhone *
-e_card_phone_new (void)
-{
- ECardPhone *newphone = g_new(ECardPhone, 1);
-
- newphone->number = NULL;
- newphone->flags = 0;
-
- return newphone;
-}
-
-void
-e_card_phone_free (ECardPhone *phone)
-{
- if ( phone ) {
- g_free(phone->number);
-
- g_free(phone);
- }
-}
-
-ECardPhone *
-e_card_phone_copy (const ECardPhone *phone)
-{
- if ( phone ) {
- ECardPhone *phone_copy = g_new(ECardPhone, 1);
- phone_copy->number = g_strdup(phone->number);
- phone_copy->flags = phone->flags;
- return phone_copy;
- } else
- return NULL;
-}
-
-ECardDeliveryAddress *
-e_card_delivery_address_new (void)
-{
- ECardDeliveryAddress *newaddr = g_new(ECardDeliveryAddress, 1);
-
- newaddr->po = NULL;
- newaddr->ext = NULL;
- newaddr->street = NULL;
- newaddr->city = NULL;
- newaddr->region = NULL;
- newaddr->code = NULL;
- newaddr->country = NULL;
- newaddr->flags = 0;
-
- return newaddr;
-}
-
-void
-e_card_delivery_address_free (ECardDeliveryAddress *addr)
-{
- if ( addr ) {
- g_free(addr->po);
- g_free(addr->ext);
- g_free(addr->street);
- g_free(addr->city);
- g_free(addr->region);
- g_free(addr->code);
- g_free(addr->country);
-
- g_free(addr);
- }
-}
-
-ECardDeliveryAddress *
-e_card_delivery_address_copy (const ECardDeliveryAddress *addr)
-{
- if ( addr ) {
- ECardDeliveryAddress *addr_copy = g_new(ECardDeliveryAddress, 1);
- addr_copy->po = g_strdup(addr->po );
- addr_copy->ext = g_strdup(addr->ext );
- addr_copy->street = g_strdup(addr->street );
- addr_copy->city = g_strdup(addr->city );
- addr_copy->region = g_strdup(addr->region );
- addr_copy->code = g_strdup(addr->code );
- addr_copy->country = g_strdup(addr->country);
- addr_copy->flags = addr->flags;
- return addr_copy;
- } else
- return NULL;
-}
-
-char *
-e_card_delivery_address_to_string(const ECardDeliveryAddress *addr)
-{
- char *strings[4], **stringptr = strings;
- char *line1, *line22, *line2;
- char *final;
- if (addr->po && *addr->po)
- *(stringptr++) = addr->po;
- if (addr->street && *addr->street)
- *(stringptr++) = addr->street;
- if (addr->ext && *addr->ext)
- *(stringptr++) = addr->ext;
- *stringptr = NULL;
- line1 = g_strjoinv(" ", strings);
- stringptr = strings;
- if (addr->region && *addr->region)
- *(stringptr++) = addr->region;
- if (addr->code && *addr->code)
- *(stringptr++) = addr->code;
- *stringptr = NULL;
- line22 = g_strjoinv(" ", strings);
- stringptr = strings;
- if (addr->city && *addr->city)
- *(stringptr++) = addr->city;
- if (line22 && *line22)
- *(stringptr++) = line22;
- *stringptr = NULL;
- line2 = g_strjoinv(", ", strings);
- stringptr = strings;
- if (line1 && *line1)
- *(stringptr++) = line1;
- if (line2 && *line2)
- *(stringptr++) = line2;
- if (addr->country && *addr->country)
- *(stringptr++) = addr->country;
- *stringptr = NULL;
- final = g_strjoinv("\n", strings);
- g_free(line1);
- g_free(line22);
- g_free(line2);
- return final;
-}
-
-ECardAddrLabel *
-e_card_address_label_new (void)
-{
- ECardAddrLabel *newaddr = g_new(ECardAddrLabel, 1);
-
- newaddr->data = NULL;
- newaddr->flags = 0;
-
- return newaddr;
-}
-
-void
-e_card_address_label_free (ECardAddrLabel *addr)
-{
- if ( addr ) {
- g_free(addr->data);
-
- g_free(addr);
- }
-}
-
-ECardAddrLabel *
-e_card_address_label_copy (const ECardAddrLabel *addr)
-{
- if ( addr ) {
- ECardAddrLabel *addr_copy = g_new(ECardAddrLabel, 1);
- addr_copy->data = g_strdup(addr->data);
- addr_copy->flags = addr->flags;
- return addr_copy;
- } else
- return NULL;
-}
-
-ECardName *e_card_name_new(void)
-{
- ECardName *newname = g_new(ECardName, 1);
-
- newname->prefix = NULL;
- newname->given = NULL;
- newname->additional = NULL;
- newname->family = NULL;
- newname->suffix = NULL;
-
- return newname;
-}
-
-void
-e_card_name_free(ECardName *name)
-{
- if (name) {
- if ( name->prefix )
- g_free(name->prefix);
- if ( name->given )
- g_free(name->given);
- if ( name->additional )
- g_free(name->additional);
- if ( name->family )
- g_free(name->family);
- if ( name->suffix )
- g_free(name->suffix);
- g_free ( name );
- }
-}
-
-ECardName *
-e_card_name_copy(const ECardName *name)
-{
- if (name) {
- ECardName *newname = g_new(ECardName, 1);
-
- newname->prefix = g_strdup(name->prefix);
- newname->given = g_strdup(name->given);
- newname->additional = g_strdup(name->additional);
- newname->family = g_strdup(name->family);
- newname->suffix = g_strdup(name->suffix);
-
- return newname;
- } else
- return NULL;
-}
-
-char *
-e_card_name_to_string(const ECardName *name)
-{
- char *strings[6], **stringptr = strings;
- if (name->prefix && *name->prefix)
- *(stringptr++) = name->prefix;
- if (name->given && *name->given)
- *(stringptr++) = name->given;
- if (name->additional && *name->additional)
- *(stringptr++) = name->additional;
- if (name->family && *name->family)
- *(stringptr++) = name->family;
- if (name->suffix && *name->suffix)
- *(stringptr++) = name->suffix;
- *stringptr = NULL;
- return g_strjoinv(" ", strings);
-}
-
-ECardName *
-e_card_name_from_string(const char *full_name)
-{
- ECardName *name = g_new(ECardName, 1);
- ENameWestern *western = e_name_western_parse (full_name);
-
- name->prefix = g_strdup (western->prefix);
- name->given = g_strdup (western->first );
- name->additional = g_strdup (western->middle);
- name->family = g_strdup (western->last );
- name->suffix = g_strdup (western->suffix);
-
- e_name_western_free(western);
-
- return name;
-}
-
-ECardArbitrary *
-e_card_arbitrary_new(void)
-{
- ECardArbitrary *arbitrary = g_new(ECardArbitrary, 1);
- arbitrary->key = NULL;
- arbitrary->type = NULL;
- arbitrary->value = NULL;
- return arbitrary;
-}
-
-ECardArbitrary *
-e_card_arbitrary_copy(const ECardArbitrary *arbitrary)
-{
- if (arbitrary) {
- ECardArbitrary *arb_copy = g_new(ECardArbitrary, 1);
- arb_copy->key = g_strdup(arbitrary->key);
- arb_copy->type = g_strdup(arbitrary->type);
- arb_copy->value = g_strdup(arbitrary->value);
- return arb_copy;
- } else
- return NULL;
-}
-
-void
-e_card_arbitrary_free(ECardArbitrary *arbitrary)
-{
- if (arbitrary) {
- g_free(arbitrary->key);
- g_free(arbitrary->type);
- g_free(arbitrary->value);
- }
- g_free(arbitrary);
-}
-
-/*
- * ECard lifecycle management and vCard loading/saving.
- */
-
-static void
-e_card_destroy (GtkObject *object)
-{
- ECard *card = E_CARD(object);
- g_free(card->id);
- g_free(card->file_as);
- g_free(card->fname);
- if ( card->name )
- e_card_name_free(card->name);
- g_free(card->bday);
-
- g_free(card->url);
- g_free(card->org);
- g_free(card->org_unit);
- g_free(card->office);
- g_free(card->title);
- g_free(card->role);
- g_free(card->manager);
- g_free(card->assistant);
- g_free(card->nickname);
- g_free(card->spouse);
- g_free(card->anniversary);
- g_free(card->fburl);
- g_free(card->note);
-
- if (card->categories)
- gtk_object_unref(GTK_OBJECT(card->categories));
- if (card->email)
- gtk_object_unref(GTK_OBJECT(card->email));
- if (card->phone)
- gtk_object_unref(GTK_OBJECT(card->phone));
- if (card->address)
- gtk_object_unref(GTK_OBJECT(card->address));
- if (card->address_label)
- gtk_object_unref(GTK_OBJECT(card->address_label));
-}
-
-
-/* Set_arg handler for the card */
-static void
-e_card_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ECard *card;
-
- card = E_CARD (object);
-
- switch (arg_id) {
- case ARG_FILE_AS:
- g_free(card->file_as);
- card->file_as = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_FULL_NAME:
- g_free(card->fname);
- card->fname = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_NAME:
- if ( card->name )
- e_card_name_free(card->name);
- card->name = GTK_VALUE_POINTER(*arg);
- break;
- case ARG_CATEGORIES:
- if (card->categories)
- gtk_object_unref(GTK_OBJECT(card->categories));
- card->categories = NULL;
- if (GTK_VALUE_STRING(*arg))
- do_parse_categories(card, GTK_VALUE_STRING(*arg));
- break;
- case ARG_CATEGORY_LIST:
- if (card->categories)
- gtk_object_unref(GTK_OBJECT(card->categories));
- card->categories = E_LIST(GTK_VALUE_OBJECT(*arg));
- if (card->categories)
- gtk_object_ref(GTK_OBJECT(card->categories));
- break;
- case ARG_BIRTH_DATE:
- g_free(card->bday);
- card->bday = GTK_VALUE_POINTER(*arg);
- break;
- case ARG_URL:
- g_free(card->url);
- card->url = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ORG:
- g_free(card->org);
- card->org = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ORG_UNIT:
- g_free(card->org_unit);
- card->org_unit = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_OFFICE:
- g_free(card->office);
- card->office = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_TITLE:
- g_free(card->title);
- card->title = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ROLE:
- g_free(card->role);
- card->role = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_MANAGER:
- g_free(card->manager);
- card->manager = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ASSISTANT:
- g_free(card->assistant);
- card->assistant = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_NICKNAME:
- g_free(card->nickname);
- card->nickname = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_SPOUSE:
- g_free(card->spouse);
- card->spouse = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_ANNIVERSARY:
- g_free(card->anniversary);
- card->anniversary = GTK_VALUE_POINTER(*arg);
- break;
- case ARG_MAILER:
- g_free(card->mailer);
- card->mailer = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_FBURL:
- g_free(card->fburl);
- card->fburl = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_NOTE:
- g_free (card->note);
- card->note = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- case ARG_PILOTID:
- card->pilot_id = GTK_VALUE_INT(*arg);
- break;
- case ARG_PILOTSTATUS:
- card->pilot_status = GTK_VALUE_INT(*arg);
- break;
- case ARG_ARBITRARY:
- if (card->arbitrary)
- gtk_object_unref(GTK_OBJECT(card->arbitrary));
- card->arbitrary = E_LIST(GTK_VALUE_OBJECT(*arg));
- if (card->arbitrary)
- gtk_object_ref(GTK_OBJECT(card->arbitrary));
- break;
- case ARG_ID:
- g_free(card->id);
- card->id = g_strdup(GTK_VALUE_STRING(*arg));
- break;
- default:
- return;
- }
-}
-
-/* Get_arg handler for the card */
-static void
-e_card_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ECard *card;
-
- card = E_CARD (object);
-
- switch (arg_id) {
- case ARG_FILE_AS:
- GTK_VALUE_STRING (*arg) = card->file_as;
- break;
- case ARG_FULL_NAME:
- GTK_VALUE_STRING (*arg) = card->fname;
- break;
- case ARG_NAME:
- GTK_VALUE_POINTER(*arg) = card->name;
- break;
- case ARG_ADDRESS:
- if (!card->address)
- card->address = e_list_new((EListCopyFunc) e_card_delivery_address_copy,
- (EListFreeFunc) e_card_delivery_address_free,
- NULL);
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->address);
- break;
- case ARG_ADDRESS_LABEL:
- if (!card->address_label)
- card->address_label = e_list_new((EListCopyFunc) e_card_address_label_copy,
- (EListFreeFunc) e_card_address_label_free,
- NULL);
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->address_label);
- break;
- case ARG_PHONE:
- if (!card->phone)
- card->phone = e_list_new((EListCopyFunc) e_card_phone_copy,
- (EListFreeFunc) e_card_phone_free,
- NULL);
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->phone);
- break;
- case ARG_EMAIL:
- if (!card->email)
- card->email = e_list_new((EListCopyFunc) g_strdup,
- (EListFreeFunc) g_free,
- NULL);
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->email);
- break;
- case ARG_CATEGORIES:
- {
- int i;
- char ** strs;
- int length;
- EIterator *iterator;
- if (!card->categories)
- card->categories = e_list_new((EListCopyFunc) g_strdup,
- (EListFreeFunc) g_free,
- NULL);
- length = e_list_length(card->categories);
- strs = g_new(char *, length + 1);
- for (iterator = e_list_get_iterator(card->categories), i = 0; e_iterator_is_valid(iterator); e_iterator_next(iterator), i++) {
- strs[i] = (char *)e_iterator_get(iterator);
- }
- strs[i] = 0;
- GTK_VALUE_STRING(*arg) = g_strjoinv(", ", strs);
- g_free(strs);
- }
- break;
- case ARG_CATEGORY_LIST:
- if (!card->categories)
- card->categories = e_list_new((EListCopyFunc) g_strdup,
- (EListFreeFunc) g_free,
- NULL);
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->categories);
- break;
- case ARG_BIRTH_DATE:
- GTK_VALUE_POINTER(*arg) = card->bday;
- break;
- case ARG_URL:
- GTK_VALUE_STRING(*arg) = card->url;
- break;
- case ARG_ORG:
- GTK_VALUE_STRING(*arg) = card->org;
- break;
- case ARG_ORG_UNIT:
- GTK_VALUE_STRING(*arg) = card->org_unit;
- break;
- case ARG_OFFICE:
- GTK_VALUE_STRING(*arg) = card->office;
- break;
- case ARG_TITLE:
- GTK_VALUE_STRING(*arg) = card->title;
- break;
- case ARG_ROLE:
- GTK_VALUE_STRING(*arg) = card->role;
- break;
- case ARG_MANAGER:
- GTK_VALUE_STRING(*arg) = card->manager;
- break;
- case ARG_ASSISTANT:
- GTK_VALUE_STRING(*arg) = card->assistant;
- break;
- case ARG_NICKNAME:
- GTK_VALUE_STRING(*arg) = card->nickname;
- break;
- case ARG_SPOUSE:
- GTK_VALUE_STRING(*arg) = card->spouse;
- break;
- case ARG_ANNIVERSARY:
- GTK_VALUE_POINTER(*arg) = card->anniversary;
- break;
- case ARG_MAILER:
- GTK_VALUE_STRING(*arg) = card->mailer;
- break;
- case ARG_FBURL:
- GTK_VALUE_STRING(*arg) = card->fburl;
- break;
- case ARG_NOTE:
- GTK_VALUE_STRING(*arg) = card->note;
- break;
- case ARG_PILOTID:
- GTK_VALUE_INT(*arg) = card->pilot_id;
- break;
- case ARG_PILOTSTATUS:
- GTK_VALUE_INT(*arg) = card->pilot_status;
- break;
- case ARG_ARBITRARY:
- if (!card->arbitrary)
- card->arbitrary = e_list_new((EListCopyFunc) e_card_arbitrary_copy,
- (EListFreeFunc) e_card_arbitrary_free,
- NULL);
-
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->arbitrary);
- break;
- case ARG_ID:
- GTK_VALUE_STRING(*arg) = card->id;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-
-/**
- * e_card_init:
- */
-static void
-e_card_init (ECard *card)
-{
- card->id = g_strdup("");
-
- card->file_as = NULL;
- card->fname = NULL;
- card->name = NULL;
- card->bday = NULL;
- card->email = NULL;
- card->phone = NULL;
- card->address = NULL;
- card->address_label = NULL;
- card->url = NULL;
- card->org = NULL;
- card->org_unit = NULL;
- card->office = NULL;
- card->title = NULL;
- card->role = NULL;
- card->manager = NULL;
- card->assistant = NULL;
- card->nickname = NULL;
- card->spouse = NULL;
- card->anniversary = NULL;
- card->mailer = NULL;
- card->fburl = NULL;
- card->note = NULL;
- card->categories = NULL;
- card->pilot_id = 0;
- card->pilot_status = 0;
- card->arbitrary = NULL;
-#if 0
-
- c = g_new0 (ECard, 1);
-
- c->fname =
- c->mailer =
- c->role =
- c->comment =
- c->categories =
- c->uid = e_card_prop_str_empty ();
-
- c->photo.type = PHOTO_JPEG;
- c->logo.type = PHOTO_JPEG;
- c->rev.utc = -1;
- c->sound.type = SOUND_PHONETIC;
- c->key.type = KEY_PGP;
-
- c->categories.prop.encod = ENC_QUOTED_PRINTABLE;
- c->comment.prop.encod = ENC_QUOTED_PRINTABLE;
-
- c->name.prop = c->photo.prop = c->bday.prop = c->timezn.prop =
- c->geopos.prop = c->logo.prop = c->org.prop = c->rev.prop =
- c->sound.prop = c->key.prop = c->deladdr.prop = c->dellabel.prop =
- c->phone.prop = c->email.prop = c->xtension.prop = c->prop = e_card_prop_empty ();
-
- c->prop.type = PROP_CARD;
- c->fname.prop.type = PROP_FNAME;
- c->name.prop.type = PROP_NAME;
- c->photo.prop.type = PROP_PHOTO;
- c->bday.prop.type = PROP_BDAY;
-
- c->deladdr.prop.type = PROP_DELADDR_LIST;
- c->dellabel.prop.type = PROP_DELLABEL_LIST;
- c->phone.prop.type = PROP_PHONE_LIST;
- c->email.prop.type = PROP_EMAIL_LIST;
- c->xtension.prop.type = PROP_XTENSION_LIST;
- c->mailer.prop.type = PROP_MAILER;
- c->timezn.prop.type = PROP_TIMEZN;
- c->geopos.prop.type = PROP_GEOPOS;
- c->role.prop.type = PROP_ROLE;
- c->logo.prop.type = PROP_LOGO;
- c->org.prop.type = PROP_ORG;
- c->categories.prop.type = PROP_CATEGORIES;
- c->comment.prop.type = PROP_COMMENT;
- c->rev.prop.type = PROP_REV;
- c->sound.prop.type = PROP_SOUND;
- c->uid.prop.type = PROP_UID;
- c->key.prop.type = PROP_KEY;
-
- return c;
-#endif
-}
-
-GList *
-e_card_load_cards_from_file(const char *filename)
-{
- VObject *vobj = Parse_MIME_FromFileName((char *) filename);
- GList *list = NULL;
- while(vobj) {
- VObject *next;
- ECard *card = E_CARD(gtk_type_new(e_card_get_type()));
- parse(card, vobj);
- next = nextVObjectInList(vobj);
- cleanVObject(vobj);
- vobj = next;
- list = g_list_prepend(list, card);
- }
- list = g_list_reverse(list);
- return list;
-}
-
-static void
-assign_string(VObject *vobj, char **string)
-{
- int type = vObjectValueType(vobj);
- char *str;
-
- switch(type) {
- case VCVT_STRINGZ:
- *string = g_strdup (vObjectStringZValue(vobj));
- break;
- case VCVT_USTRINGZ:
- str = (vObjectValueType (vobj) ? fakeCString (vObjectUStringZValue (vobj)) : calloc(1, 1));
- *string = g_strdup(str);
- free(str);
- break;
- default:
- *string = g_strdup("");
- break;
- }
-}
-
-#if 0
-static void
-e_card_str_free (CardStrProperty *sp)
-{
- g_free (sp->str);
-
- e_card_prop_free (sp->prop);
-}
-
-static void
-e_card_photo_free (CardPhoto *photo)
-{
- g_free (photo->data);
-
- e_card_prop_free (photo->prop);
-}
-
-/**
- * e_card_free:
- */
-void
-e_card_free (ECard *card)
-{
- GList *l;
-
- g_return_if_fail (card != NULL);
-
- e_card_name_free (& card->name);
- e_card_str_free (& card->fname);
-
- e_card_photo_free (card->photo);
-
- e_card_logo_free (card->logo);
- e_card_org_free (card->org);
- e_card_key_free (card->key);
- e_card_sound_free (card->sound);
-
- e_card_prop_str_free (& card->mailer);
- e_card_prop_str_free (& card->role);
- e_card_prop_str_free (& card->categories);
- e_card_prop_str_free (& card->comment);
- e_card_prop_str_free (& card->uid);
-
- /* address is a little more complicated */
- card_prop_free (card->deladdr.prop);
- while ((l = card->deladdr.l)) {
-
- e_card_deladdr_free ((CardDelAddr *) l->data);
-
- card->deladdr.l = g_list_remove_link (card->deladdr.l, l);
- g_list_free (l);
- }
-
- g_free (card);
-}
-
-typedef struct
-{
- char c;
- int id;
-
- GList *sons;
-} tree;
-
-extern CardProperty
-e_card_prop_empty (void)
-{
- CardProperty prop;
-
- prop.used = FALSE;
-
- prop.type = PROP_NONE;
- prop.encod = ENC_7BIT;
- prop.value = VAL_INLINE;
- prop.charset = NULL;
- prop.lang = NULL;
- prop.grp = NULL;
- prop.xtension = NULL;
-
- prop.user_data = NULL;
-
- return prop;
-}
-
-static CardStrProperty
-e_card_prop_str_empty (void)
-{
- CardStrProperty strprop;
-
- strprop.prop = card_prop_empty ();
- strprop.str = NULL;
-
- return strprop;
-}
-
-/* Intended to check asserts. */
-extern int card_check_prop (ECardProperty prop)
-{
- if (((prop.used == FALSE) || (prop.used == TRUE)) &&
- ((prop.type >= PROP_NONE) && (prop.type <= PROP_LAST)) &&
- ((prop.encod >= ENC_NONE) && (prop.encod <= ENC_LAST)) &&
- ((prop.value >= VAL_NONE) && (prop.value <= VAL_LAST)))
- return TRUE;
-
- return FALSE;
-}
-
-extern void
-card_prop_free (CardProperty prop)
-{
- GList *l;
-
- g_free (prop.charset);
- g_free (prop.lang);
-
- for (l = prop.xtension; l; l = l->next) {
- CardXAttribute *xa = (CardXAttribute *) l->data;
- g_free (xa->name);
- g_free (xa->data);
- }
-
- g_list_free (l);
-
- prop.used = FALSE;
-}
-
-e_card_deladdr_free (ECardDelAddr *c)
-{
- card_prop_free (c->prop);
-
- g_free (p->pobox);
- g_free (p->ext);
- g_free (p->street);
- g_free (p->city);
- g_free (p->region);
- g_free (p->code);
- g_free (p->country);
-}
-
-void
-card_free (Card *crd)
-{
-}
-
-static tree *
-new_tree (char c, int id)
-{
- tree *t;
-
- t = malloc (sizeof (tree));
- t->c = c;
- t->id = id;
- t->sons = NULL;
-
- return t;
-}
-
-static void
-add_branch (tree *t, char *str, int id)
-{
- tree *tmp;
- char *end;
-
- end = str + strlen (str) + 1;
-
- while (str != end) {
- tmp = new_tree (*str, id);
- t->sons = g_list_append (t->sons, (gpointer) tmp);
- t = tmp;
-
- str ++;
- }
-}
-
-static tree *
-add_to_tree (tree *t, struct pair p)
-{
- GList *node;
- char *c, *end;
- tree *tmp;
-
- c = p.str;
- end = c + strlen (c) + 1;
- tmp = t;
-
- while (c != end) {
- for (node = tmp->sons; node; node = node->next)
- if (((tree *) node->data)->c == *c) {
- break;
- }
-
- if (node) {
- tmp = (tree *) node->data;
- tmp->id = 0;
- c++;
- }
- else {
- add_branch (tmp, c, p.id);
- break;
- }
- }
-
- return t;
-}
-
-static tree *
-create_search_tree (void)
-{
- tree *t;
- int i;
-
- t = new_tree (0, 0);
- for (i = 0; prop_lookup[i].str; i++)
- t = add_to_tree (t, prop_lookup[i]);
-
- return t;
-}
-
-static int
-card_lookup_name (const char *c)
-{
- static tree *search_tree = NULL;
- GList *node;
- tree *tmp;
- const char *end;
-
- if (!search_tree)
- search_tree = create_search_tree ();
-
- tmp = search_tree;
- end = c + strlen (c) + 1;
-
- while (tmp->id == 0 && c != end) {
- for (node = tmp->sons; node; node = node->next)
- if (((tree *) node->data)->c == *c) {
- break;
- }
-
- if (node) {
- tmp = (tree *) node->data;
- c++;
- }
- else
- return 0;
- }
-
- return tmp->id;
-}
-
-static enum PhotoType
-get_photo_type (VObject *o)
-{
- VObject *vo;
- int i;
-
- for (i = 0; photo_pairs[i].str; i++)
- if (has (o, photo_pairs[i].str))
- return photo_pairs[i].id;
-
- g_warning ("? < No PhotoType for Photo property. Falling back to JPEG.");
- return PHOTO_JPEG;
-}
-
-static CardProperty
-get_CardProperty (VObject *o)
-{
- VObjectIterator i;
- CardProperty prop;
-
- prop = card_prop_empty ();
- prop.used = TRUE;
-
- initPropIterator (&i, o);
- while (moreIteration (&i)) {
- VObject *vo = nextVObject (&i);
- const char *n = vObjectName (vo);
- int propid;
-
- propid = card_lookup_name (n);
-
- switch (propid) {
-
- case PROP_VALUE:
-
- if (has (vo, VCContentIDProp))
- prop.value = VAL_CID;
- break;
-
- case PROP_ENCODING:
- if (has (vo, VCQuotedPrintableProp))
- prop.encod = ENC_QUOTED_PRINTABLE;
- else if (has (vo, VC8bitProp))
- prop.encod = ENC_8BIT;
- else if (has (vo, VCBase64Prop))
- prop.encod = ENC_BASE64;
- break;
-
- case PROP_QUOTED_PRINTABLE:
- prop.encod = ENC_QUOTED_PRINTABLE;
- break;
-
- case PROP_8BIT:
- prop.encod = ENC_8BIT;
- break;
-
- case PROP_BASE64:
- prop.encod = ENC_BASE64;
- break;
-
- case PROP_LANG:
- if (vObjectValueType (vo)) {
- prop.lang =
- g_strdup (vObjectStringZValue (vo));
- } else
- g_warning ("? < No value for LANG attribute.");
- break;
-
- case PROP_CHARSET:
- if (vObjectValueType (vo)) {
- prop.charset =
- g_strdup (vObjectStringZValue (vo));
- g_warning (prop.charset);
- } else
- g_warning ("? < No value for CHARSET attribute.");
- break;
- default:
- {
- CardXAttribute *c;
-
- c = malloc (sizeof (CardXAttribute));
- c->name = g_strdup (n);
-
- if (vObjectValueType (vo))
- c->data =
- g_strdup (vObjectStringZValue (vo));
- else
- c->data = NULL;
-
- prop.xtension =
- g_list_append (prop.xtension, c);
- }
- }
- }
-
- return prop;
-}
-
-static gboolean
-e_card_prop_has (VObject *o,
- const char *id)
-{
- g_assert (o != NULL);
- g_assert (id != NULL);
-
- if (isAPropertyOf (o, id) == NULL)
- return FALSE;
-
- return TRUE;
-}
-
-static const char *
-e_card_prop_get_str (VObject *o,
- const char *id)
-{
- VObject *strobj;
-
- g_assert (o != NULL);
- g_assert (id != NULL);
-
- strobj = isAPropertyOf (o, id);
-
- if (strobj == NULL)
- return g_strdup ("");
-
- if (vObjectValueType (strobj) != NULL) {
- char *str;
- char *g_str;
-
- str = fakeCString (vObjectStringZValue (strobj));
- g_str = g_strdup (str);
- free (str);
-
- return g_str;
- }
-
- return g_strdup ("");
-}
-
-static ECardName *
-e_card_get_name (VObject *o)
-{
- CardName *name;
- VObject *vo;
- char *the_str;
-
- name = g_new0 (ECardName, 1);
-
- name->family = e_card_prop_get_substr (o, VCFamilyNameProp);
- name->given = e_card_prop_get_substr (o, VCGivenNameProp);
- name->additional = e_card_prop_get_substr (o, VCAdditionalNamesProp);
- name->prefix = e_card_prop_get_substr (o, VCNamePrefixesProp);
- name->suffix = e_card_prop_get_substr (o, VCNameSuffixesProp);
-
- return name;
-}
-
-static CardDelLabel *
-get_CardDelLabel (VObject *o)
-{
- CardDelLabel *dellabel;
- char *the_str;
-
- dellabel = malloc (sizeof (CardDelLabel));
-
- dellabel->type = get_addr_type (o);
- dellabel->data = g_strdup (str_val (o));
-
- free (the_str);
- return dellabel;
-}
-
-static CardPhone *
-get_CardPhone (VObject *o)
-{
- CardPhone *ret;
- char *the_str;
-
- ret = malloc (sizeof (CardPhone));
- ret->type = get_phone_type (o);
- ret->data = g_strdup (str_val (o));
-
- free (the_str);
-
- return ret;
-}
-
-static CardEMail *
-get_CardEMail (VObject *o)
-{
- CardEMail *ret;
- char *the_str;
-
- ret = malloc (sizeof (CardEMail));
- ret->type = get_email_type (o);
- ret->data = g_strdup (str_val (o));
-
- free (the_str);
-
- return ret;
-}
-
-static CardTimeZone
-strtoCardTimeZone (char *str)
-{
- char s[3];
- CardTimeZone tz;
-
- if (*str == '-') {
- tz.sign = -1;
- str++;
- } else
- tz.sign = 1;
-
- tz.hours = 0;
- tz.mins = 0;
-
- s[2] = 0;
- if (strlen (str) > 2) {
- s[0] = str[0];
- s[1] = str[1];
- tz.hours = atoi (s);
- } else {
- g_warning ("? < TimeZone value is too short.");
- return tz;
- }
-
- str += 2;
- if (*str == ':')
- str++;
-
- if (strlen (str) >= 2) {
- s[0] = str[0];
- s[1] = str[1];
- tz.mins = atoi (s);
- } else {
- g_warning ("? < TimeZone value is too short.");
- return tz;
- }
-
- if (strlen (str) > 3)
- g_warning ("? < TimeZone value is too long.");
-
- return tz;
-}
-
-static CardGeoPos
-strtoCardGeoPos (char *str)
-{
- CardGeoPos gp;
- char *s;
-
- gp.lon = 0;
- gp.lat = 0;
-
- s = strchr (str, ',');
-
- if (! s) {
- g_warning ("? < Bad format for GeoPos property.");
- return gp;
- }
-
- *s = 0;
- s++;
-
- gp.lon = atof (str);
- gp.lat = atof (s);
-
- return gp;
-}
-
-static CardOrg *
-e_card_vobject_to_org (VObject *o)
-{
- VObject *vo;
- char *the_str;
- CardOrg *org;
-
- org = g_new0 (CardOrg, 1);
-
- if (has (o, VCOrgNameProp)) {
- org.name = g_strdup (str_val (vo));
- free (the_str);
- }
- if (has (o, VCOrgUnitProp)) {
- org.unit1 = g_strdup (str_val (vo));
- free (the_str);
- }
- if (has (o, VCOrgUnit2Prop)) {
- org.unit2 = g_strdup (str_val (vo));
- free (the_str);
- }
- if (has (o, VCOrgUnit3Prop)) {
- org.unit3 = g_strdup (str_val (vo));
- free (the_str);
- }
- if (has (o, VCOrgUnit4Prop)) {
- org.unit4 = g_strdup (str_val (vo));
- free (the_str);
- }
-
- return org;
-}
-
-static CardXProperty *
-get_XProp (VObject *o)
-{
- char *the_str;
- CardXProperty *ret;
-
- ret = malloc (sizeof (CardXProperty));
- ret->name = g_strdup (vObjectName (o));
- ret->data = g_strdup (str_val (o));
- free (the_str);
-
- return ret;
-}
-
-static CardRev
-strtoCardRev (char *str)
-{
- char s[3], *t, *ss;
- int len, i;
- CardRev rev;
-
- rev.utc = 0;
- len = strlen (str);
-
- if (str[len] == 'Z') { /* Is it UTC? */
- rev.utc = 1;
- str[len] = 0;
- }
-
- s[2] = 0;
- t = strchr (str, 'T');
- if (t) { /* Take the Time */
- *t = 0;
- t++;
- if (strlen (t) > 2) {
- s[0] = t[0];
- s[1] = t[1];
- rev.tm.tm_hour = atoi (s);
- } else {
- g_warning ("? < Rev value is too short.");
- return rev;
- }
-
- t += 2;
- if (*t == ':') /* Ignore ':' separator */
- t++;
-
- if (strlen (t) > 2) {
- s[0] = t[0];
- s[1] = t[1];
- rev.tm.tm_min = atoi (s);
- } else {
- g_warning ("? < Rev value is too short.");
- return rev;
- }
-
- t += 2;
- if (*t == ':')
- t++;
-
- if (strlen (t) > 2) {
- s[0] = t[0];
- s[1] = t[1];
- rev.tm.tm_sec = atoi (s);
- } else {
- g_warning ("? < Rev value is too short.");
- return rev;
- }
-
- if (strlen (str) > 3)
- g_warning ("? < Rev value is too long.");
-
- } else {
- g_warning ("? < No time value for Rev property.");
- }
-
- /* Now the date (the part before the T) */
-
- if (strchr (str, '-')) { /* extended iso 8601 */
- for (ss = strtok (str, "-"), i = 0; ss;
- ss = strtok (NULL, "-"), i++)
- switch (i) {
- case 0:
- rev.tm.tm_year = atoi (ss);
- break;
- case 1:
- rev.tm.tm_mon = atoi (ss);
- break;
- case 2:
- rev.tm.tm_mday = atoi (ss);
- break;
- default:
- g_warning ("? < Too many values for Rev property.");
- }
-
- if (i < 2)
- g_warning ("? < Too few values for Rev property.");
- } else {
- if (strlen (str) >= 8) { /* short representation */
- rev.tm.tm_mday = atoi (str + 6);
- str[6] = 0;
- rev.tm.tm_mon = atoi (str + 4);
- str[4] = 0;
- rev.tm.tm_year = atoi (str);
- } else
- g_warning ("? < Bad format for Rev property.");
- }
-
- return rev;
-}
-
-static enum KeyType
-get_key_type (VObject *o)
-{
- VObject *vo;
- int i;
-
- for (i = 0; key_pairs[i].str; i++)
- if (has (o, key_pairs[i].str))
- return key_pairs[i].id;
-
- g_warning ("? < No KeyType for Key property. Falling back to PGP.");
- return KEY_PGP;
-}
-
-static CardPhoto
-get_CardPhoto (VObject *o)
-{
- VObject *vo;
- char *the_str;
- CardPhoto photo;
-
- photo.type = get_photo_type (o);
-
- if (has (o, VCDataSizeProp)) {
- photo.size = vObjectIntegerValue (vo);
- photo.data = malloc (photo.size);
- memcpy (photo.data, vObjectAnyValue (o), photo.size);
- } else {
- photo.size = strlen (str_val (o)) + 1;
- photo.data = g_strdup (the_str);
- free (the_str);
- }
-
- return photo;
-}
-
-static enum SoundType
-get_sound_type (VObject *o)
-{
- VObject *vo;
- int i;
-
- for (i = 0; sound_pairs[i].str; i++)
- if (has (o, sound_pairs[i].str))
- return sound_pairs[i].id;
-
- return SOUND_PHONETIC;
-}
-
-static CardSound
-get_CardSound (VObject *o)
-{
- VObject *vo;
- char *the_str;
- CardSound sound;
-
- sound.type = get_sound_type (o);
-
- if (has (o, VCDataSizeProp)) {
- sound.size = vObjectIntegerValue (vo);
- sound.data = malloc (sound.size);
- memcpy (sound.data, vObjectAnyValue (o), sound.size);
- } else {
- sound.size = strlen (str_val (o));
- sound.data = g_strdup (the_str);
- free (the_str);
- }
-
- return sound;
-}
-
-/* Loads our card contents from a VObject */
-static ECard *
-e_card_construct_from_vobject (ECard *card,
- VObject *vcrd)
-{
- VObjectIterator i;
- Card *crd;
- char *the_str;
-
- initPropIterator (&i, vcrd);
- crd = card_new ();
-
- while (moreIteration (&i)) {
- VObject *o = nextVObject (&i);
- const char *n = vObjectName (o);
- int propid;
- CardProperty *prop = NULL;
-
- propid = card_lookup_name (n);
-
- switch (propid) {
- case PROP_FNAME:
- prop = &crd->fname.prop;
- crd->fname.str = g_strdup (str_val (o));
- free (the_str);
- break;
- case PROP_NAME:
- prop = &crd->name.prop;
- crd->name = e_card_get_name (o);
- break;
- case PROP_PHOTO:
- prop = &crd->photo.prop;
- crd->photo = get_CardPhoto (o);
- break;
- case PROP_BDAY:
- prop = &crd->bday.prop;
- crd->bday = strtoCardBDay (str_val (o));
- free (the_str);
- break;
- case PROP_DELADDR:
- {
- CardDelAddr *c;
- c = get_CardDelAddr (o);
- prop = &c->prop;
- crd->deladdr.l = g_list_append (crd->deladdr.l, c);
- }
- break;
- case PROP_DELLABEL:
- {
- CardDelLabel *c;
- c = get_CardDelLabel (o);
- prop = &c->prop;
- crd->dellabel.l = g_list_append (crd->dellabel.l, c);
- }
- break;
- case PROP_PHONE:
- {
- CardPhone *c;
-
- c = get_CardPhone (o);
- prop = &c->prop;
- crd->phone.l = g_list_append (crd->phone.l, c);
- }
- break;
- case PROP_EMAIL:
- {
- CardEMail *c;
-
- c = get_CardEMail (o);
- prop = &c->prop;
- crd->email.l = g_list_append (crd->email.l, c);
- }
- break;
- case PROP_MAILER:
- prop = &crd->mailer.prop;
- crd->mailer.str = g_strdup (str_val (o));
- free (the_str);
- break;
- case PROP_TIMEZN:
- prop = &crd->timezn.prop;
- crd->timezn = strtoCardTimeZone (str_val (o));
- free (the_str);
- break;
- case PROP_GEOPOS:
- prop = &crd->geopos.prop;
- crd->geopos = strtoCardGeoPos (str_val (o));
- break;
- case PROP_ROLE:
- prop = &crd->role.prop;
- crd->role.str = g_strdup (str_val (o));
- free (the_str);
- break;
- case PROP_LOGO:
- prop = &crd->logo.prop;
- crd->logo = get_CardPhoto (o);
- break;
- case PROP_AGENT:
- crd->agent = card_create_from_vobject (o);
- break;
- case PROP_ORG:
- prop = &crd->org.prop;
- crd->org = get_CardOrg (o);
- break;
- case PROP_CATEGORIES:
- prop = &crd->categories.prop;
- crd->categories.str = g_strdup (str_val (o));
- crd->categories.prop.encod = ENC_QUOTED_PRINTABLE;
- free (the_str);
- break;
- case PROP_COMMENT:
- prop = &crd->comment.prop;
- crd->comment.str = g_strdup (str_val (o));
- crd->comment.prop.encod = ENC_QUOTED_PRINTABLE;
- free (the_str);
- break;
- case PROP_REV:
- prop = &crd->rev.prop;
- crd->rev = strtoCardRev (str_val (o));
- free (the_str);
- break;
- case PROP_SOUND:
- prop = &crd->sound.prop;
- crd->sound = get_CardSound (o);
- break;
- case PROP_VERSION:
- {
- char *str;
- str = str_val (o);
- if (strcmp (str, "2.1"))
- g_warning ("? < Version doesn't match.");
- free (the_str);
- }
- break;
- case PROP_KEY:
- prop = &crd->key.prop;
- crd->key.type = get_key_type (o);
- crd->key.data = g_strdup (str_val (o));
- free (the_str);
- break;
- default:
- {
- CardXProperty *c;
-
- c = get_XProp (o);
- prop = &c->prop;
- crd->xtension.l = g_list_append (crd->xtension.l, c);
- }
- break;
- }
-
- if (prop) {
- *prop = get_CardProperty (o);
- prop->type = propid;
- }
- }
-
- return crd;
-}
-
-/* Loads a card from a file */
-GList *
-card_load (GList *crdlist, char *fname)
-{
- VObject *vobj, *tmp;
-
- vobj = Parse_MIME_FromFileName (fname);
- if (!vobj) {
- g_warning ("Could not load the cardfile");
- return NULL;
- }
-
- while (vobj) {
- const char *n = vObjectName (vobj);
-
- if (strcmp (n, VCCardProp) == 0) {
- crdlist = g_list_append (crdlist, (gpointer)
- card_create_from_vobject (vobj));
- }
- tmp = vobj;
- vobj = nextVObjectInList (vobj);
- cleanVObject (tmp);
- }
-
- cleanVObject (vobj);
- cleanStrTbl ();
- return crdlist;
-}
-
-static VObject *
-add_strProp (VObject *o, const char *id, char *val)
-{
- VObject *vo = NULL;
-
- if (val)
- vo = addPropValue (o, id, val);
-
- return vo;
-}
-
-static VObject *
-add_CardProperty (VObject *o, CardProperty *prop)
-{
- GList *node;
-
- switch (prop->encod) {
- case ENC_BASE64:
- addProp (o, VCBase64Prop);
- break;
- case ENC_QUOTED_PRINTABLE:
- addProp (o, VCQuotedPrintableProp);
- break;
- case ENC_8BIT:
- addProp (o, VC8bitProp);
- break;
- case ENC_7BIT:
- /* Do nothing: 7BIT is the default. Avoids file clutter. */
- break;
- default:
- g_warning ("? < Card had invalid encoding type.");
- }
-
- switch (prop->value) {
- case VAL_CID:
- addProp (o, VCContentIDProp);
- break;
- case VAL_INLINE:
- /* Do nothing: INLINE is the default. Avoids file clutter. */
- break;
- default:
- g_warning ("? < Card had invalid value type.");
- }
-
- for (node = prop->xtension; node; node = node->next) {
- CardXAttribute *xa = (CardXAttribute *) node->data;
- if (xa->data)
- addPropValue (o, xa->name, xa->data);
- else
- addProp (o, xa->name);
- }
-
- add_strProp (o, VCCharSetProp, prop->charset);
- add_strProp (o, VCLanguageProp, prop->lang);
-
- return o;
-}
-
-static VObject *
-add_CardStrProperty (VObject *vobj, const char *id, CardStrProperty *strprop)
-{
- VObject *vprop;
-
- if (strprop->prop.used) {
- vprop = add_strProp (vobj, id, strprop->str);
- add_CardProperty (vprop, &strprop->prop);
- }
-
- return vobj;
-}
-
-static VObject *
-add_PhotoType (VObject *o, enum PhotoType photo_type)
-{
- int i;
-
- for (i = 0; photo_pairs[i].str; i++)
- if (photo_type == photo_pairs[i].id) {
- addProp (o, photo_pairs[i].str);
- return o;
- }
-
- g_warning ("? > No PhotoType for Photo property. Falling back to JPEG.");
- addProp (o, VCJPEGProp);
-
- return o;
-}
-
-static VObject *
-add_AddrType (VObject *o, int addr_type)
-{
- int i;
-
- for (i = 0; addr_pairs[i].str; i++)
- if (addr_type & addr_pairs[i].id)
- addProp (o, addr_pairs[i].str);
-
- return o;
-}
-
-static void
-add_strAddrType (GString *string, int addr_type)
-{
- int i, first = 1;
- char *str;
-
- if (addr_type) {
- g_string_append (string, " (");
-
- for (i = 0; addr_pairs[i].str; i++)
- if (addr_type & addr_pairs[i].id) {
- if (!first)
- g_string_append (string, ", ");
- first = 0;
- str = my_cap (addr_pairs[i].str);
- g_string_append (string, str);
- g_free (str);
- }
-
- g_string_append_c (string, ')');
- }
-}
-
-static VObject *
-add_PhoneType (VObject *o, int phone_type)
-{
- int i;
-
- for (i = 0; phone_pairs[i].str; i++)
- if (phone_type & phone_pairs[i].id)
- addProp (o, phone_pairs[i].str);
-
- return o;
-}
-
-static void
-add_strPhoneType (GString *string, int phone_type)
-{
- int i, first = 1;
- char *str;
-
- if (phone_type) {
- g_string_append (string, " (");
-
- for (i = 0; phone_pairs[i].str; i++)
- if (phone_type & phone_pairs[i].id) {
- if (!first)
- g_string_append (string, ", ");
- first = 0;
- str = my_cap (phone_pairs[i].str);
- g_string_append (string, str);
- g_free (str);
- }
-
- g_string_append_c (string, ')');
- }
-}
-
-static VObject *
-add_EMailType (VObject *o, enum EMailType email_type)
-{
- int i;
-
- for (i = 0; email_pairs[i].str; i++)
- if (email_type == email_pairs[i].id) {
- addProp (o, email_pairs[i].str);
- return o;
- }
-
- g_warning ("? > No EMailType for EMail property. Falling back to INET.");
- addProp (o, VCInternetProp);
-
- return o;
-}
-
-static void
-add_strEMailType (GString *string, int email_type)
-{
- int i;
- char *str;
-
- if (email_type) {
- g_string_append (string, " (");
-
- for (i = 0; email_pairs[i].str; i++)
- if (email_type == email_pairs[i].id) {
- str = my_cap (email_pairs[i].str);
- g_string_append (string, str);
- g_free (str);
- break;
- }
-
- g_string_append_c (string, ')');
- }
-}
-
-static VObject *
-add_KeyType (VObject *o, enum KeyType key_type)
-{
- int i;
-
- for (i = 0; key_pairs[i].str; i++)
- if (key_type == key_pairs[i].id) {
- addProp (o, key_pairs[i].str);
- return o;
- }
-
- g_warning ("? > No KeyType for Key property. Falling back to PGP.");
- addProp (o, VCPGPProp);
-
- return o;
-}
-
-static void
-add_strKeyType (GString *string, int key_type)
-{
- int i;
- char *str;
-
- if (key_type) {
- g_string_append (string, " (");
-
- for (i = 0; key_pairs[i].str; i++)
- if (key_type == key_pairs[i].id) {
- str = my_cap (key_pairs[i].str);
- g_string_append (string, str);
- g_free (str);
- break;
- }
-
- g_string_append_c (string, ')');
- }
-}
-
-static VObject *
-add_SoundType (VObject *o, enum SoundType sound_type)
-{
- int i;
-
- for (i = 0; sound_pairs[i].str; i++)
- if (sound_type == sound_pairs[i].id) {
- addProp (o, sound_pairs[i].str);
- return o;
- }
-
- return o;
-}
-
-char *card_timezn_str (CardTimeZone timezn)
-{
- char *str;
-
- str = malloc (7);
- snprintf (str, 7, (timezn.sign == -1)? "-%02d:%02d" : "%02d:%02d",
- timezn.hours, timezn.mins);
- return str;
-}
-
-char *card_geopos_str (CardGeoPos geopos)
-{
- char *str;
-
- str = malloc (15);
- snprintf (str, 15, "%03.02f,%03.02f", geopos.lon, geopos.lat);
- return str;
-}
-
-static void add_CardStrProperty_to_string (GString *string, char *prop_name,
- CardStrProperty *strprop)
-{
- if (strprop->prop.used) {
- if (prop_name)
- g_string_append (string, prop_name);
-
- g_string_append (string, strprop->str);
- }
-}
-
-static void add_strProp_to_string (GString *string, char *prop_name, char *val)
-{
- if (val) {
- if (prop_name)
- g_string_append (string, prop_name);
-
- g_string_append (string, val);
- }
-}
-
-static void addProp_to_string (GString *string, char *prop_name)
-{
- if (prop_name)
- g_string_append (string, prop_name);
-}
-
-char *
-card_to_string (Card *crd)
-{
- GString *string;
- char *ret;
-
- string = g_string_new ("");
-
- add_CardStrProperty_to_string (string, _ ("Card: "), &crd->fname);
- if (crd->name.prop.used) {
- addProp_to_string (string, _ ("\nName: "));
- add_strProp_to_string (string, _ ("\n Prefix: "), crd->name.prefix);
- add_strProp_to_string (string, _ ("\n Given: "), crd->name.given);
- add_strProp_to_string (string, _ ("\n Additional: "), crd->name.additional);
- add_strProp_to_string (string, _ ("\n Family: "), crd->name.family);
- add_strProp_to_string (string, _ ("\n Suffix: "), crd->name.suffix);
- g_string_append_c (string, '\n');
- }
-
-/* if (crd->photo.prop.used) {
- addPropSizedValue (string, _ ("\nPhoto: "),
- crd->photo.data, crd->photo.size);
- add_PhotoType (string, crd->photo.type);
- }*/
-
- if (crd->bday.prop.used) {
- char *date_str;
-
- date_str = card_bday_str (crd->bday);
- add_strProp_to_string (string, _ ("\nBirth Date: "), date_str);
- free (date_str);
- }
-
- if (crd->deladdr.l) {
- GList *node;
-
- for (node = crd->deladdr.l; node; node = node->next) {
- CardDelAddr *deladdr = (CardDelAddr *) node->data;
-
- if (deladdr->prop.used) {
- addProp_to_string (string, _ ("\nAddress:"));
- add_strAddrType (string, deladdr->type);
- add_strProp_to_string (string, _ ("\n Postal Box: "), deladdr->po);
- add_strProp_to_string (string, _ ("\n Ext: "),deladdr->ext);
- add_strProp_to_string (string, _ ("\n Street: "),deladdr->street);
- add_strProp_to_string (string, _ ("\n City: "), deladdr->city);
- add_strProp_to_string (string, _ ("\n Region: "), deladdr->region);
- add_strProp_to_string (string, _ ("\n Postal Code: "), deladdr->code);
- add_strProp_to_string (string, _ ("\n Country: "), deladdr->country);
- }
- }
-
- g_string_append_c (string, '\n');
- }
-
- if (crd->dellabel.l) {
- GList *node;
-
- for (node = crd->dellabel.l; node; node = node->next) {
- CardDelLabel *dellabel = (CardDelLabel *) node->data;
-
- add_strProp_to_string (string, _ ("\nDelivery Label: "),
- dellabel->data);
- add_strAddrType (string, dellabel->type);
- }
- }
-
- if (crd->phone.l) {
- GList *node;
- char *sep;
-
- if (crd->phone.l->next) {
- sep = " ";
- g_string_append (string, _ ("\nTelephones:\n"));
- } else {
- sep = " ";
- g_string_append (string, _ ("\nTelephone:"));
- }
-
- for (node = crd->phone.l; node; node = node->next) {
- CardPhone *phone = (CardPhone *) node->data;
-
- if (phone->prop.used) {
- g_string_append (string, sep);
- g_string_append (string, phone->data);
- add_strPhoneType (string, phone->type);
- g_string_append_c (string, '\n');
- }
- }
-
- if (crd->phone.l->next)
- g_string_append_c (string, '\n');
- }
-
- if (crd->email.l) {
- GList *node;
- char *sep;
-
- if (crd->email.l->next) {
- sep = " ";
- g_string_append (string, _ ("\nE-mail:\n"));
- } else {
- sep = " ";
- g_string_append (string, _ ("\nE-mail:"));
- }
-
-
- for (node = crd->email.l; node; node = node->next) {
- CardEMail *email = (CardEMail *) node->data;
-
- if (email->prop.used) {
- g_string_append (string, sep);
- g_string_append (string, email->data);
- add_strEMailType (string, email->type);
- g_string_append_c (string, '\n');
- }
- }
-
- if (crd->email.l->next)
- g_string_append_c (string, '\n');
- }
-
- add_CardStrProperty_to_string (string, _ ("\nMailer: "), &crd->mailer);
-
- if (crd->timezn.prop.used) {
- char *str;
-
- str = card_timezn_str (crd->timezn);
- add_strProp_to_string (string, _ ("\nTime Zone: "), str);
- free (str);
- }
-
- if (crd->geopos.prop.used) {
- char *str;
-
- str = card_geopos_str (crd->geopos);
- add_strProp_to_string (string, _ ("\nGeo Location: "), str);
- free (str);
- }
-
- add_CardStrProperty_to_string (string, _ ("\nBusiness Role: "), &crd->role);
-
-/* if (crd->logo.prop.used) {
- addPropSizedValue (string, _ ("\nLogo: "),
- crd->logo.data, crd->logo.size);
- add_PhotoType (string, crd->logo.type);
- }*/
-
-/* if (crd->agent)
- addstringectProp (string, card_convert_to_stringect (crd->agent));*/
-
- if (crd->org.prop.used) {
- addProp_to_string (string, _ ("\nOrg: "));
- add_strProp_to_string (string, _ ("\n Name: "), crd->org.name);
- add_strProp_to_string (string, _ ("\n Unit: "), crd->org.unit1);
- add_strProp_to_string (string, _ ("\n Unit2: "), crd->org.unit2);
- add_strProp_to_string (string, _ ("\n Unit3: "), crd->org.unit3);
- add_strProp_to_string (string, _ ("\n Unit4: "), crd->org.unit4);
- g_string_append_c (string, '\n');
- }
-
- add_CardStrProperty_to_string (string, _ ("\nCategories: "), &crd->categories);
- add_CardStrProperty_to_string (string, _ ("\nComment: "), &crd->comment);
-
-/* if (crd->sound.prop.used) {
- if (crd->sound.type != SOUND_PHONETIC)
- addPropSizedValue (string, _ ("\nPronunciation: "),
- crd->sound.data, crd->sound.size);
- else
- add_strProp_to_string (string, _ ("\nPronunciation: "),
- crd->sound.data);
-
- add_SoundType (string, crd->sound.type);
- }*/
-
- add_CardStrProperty_to_string (string, _ ("\nUnique String: "), &crd->uid);
-
- if (crd->key.prop.used) {
- add_strProp_to_string (string, _ ("\nPublic Key: "), crd->key.data);
- add_strKeyType (string, crd->key.type);
- }
-
- ret = g_strdup (string->str);
- g_string_free (string, TRUE);
-
- return ret;
-}
-#endif
-
-static ECardDate
-e_card_date_from_string (char *str)
-{
- ECardDate date;
- int length;
-
- date.year = 0;
- date.month = 0;
- date.day = 0;
-
- length = strlen(str);
-
- if (length == 10 ) {
- date.year = str[0] * 1000 + str[1] * 100 + str[2] * 10 + str[3] - '0' * 1111;
- date.month = str[5] * 10 + str[6] - '0' * 11;
- date.day = str[8] * 10 + str[9] - '0' * 11;
- } else if ( length == 8 ) {
- date.year = str[0] * 1000 + str[1] * 100 + str[2] * 10 + str[3] - '0' * 1111;
- date.month = str[4] * 10 + str[5] - '0' * 11;
- date.day = str[6] * 10 + str[7] - '0' * 11;
- }
-
- return date;
-}
-
-char *
-e_v_object_get_child_value(VObject *vobj, char *name)
-{
- char *ret_val;
- VObjectIterator iterator;
- initPropIterator(&iterator, vobj);
- while(moreIteration (&iterator)) {
- VObject *attribute = nextVObject(&iterator);
- const char *id = vObjectName(attribute);
- if ( ! strcmp(id, name) ) {
- assign_string(attribute, &ret_val);
- return ret_val;
- }
- }
- ret_val = g_new(char, 1);
- *ret_val = 0;
- return ret_val;
-}
-
-static ECardPhoneFlags
-get_phone_flags (VObject *vobj)
-{
- ECardPhoneFlags ret = 0;
- int i;
-
- struct {
- char *id;
- ECardPhoneFlags flag;
- } phone_pairs[] = {
- { VCPreferredProp, E_CARD_PHONE_PREF },
- { VCWorkProp, E_CARD_PHONE_WORK },
- { VCHomeProp, E_CARD_PHONE_HOME },
- { VCVoiceProp, E_CARD_PHONE_VOICE },
- { VCFaxProp, E_CARD_PHONE_FAX },
- { VCMessageProp, E_CARD_PHONE_MSG },
- { VCCellularProp, E_CARD_PHONE_CELL },
- { VCPagerProp, E_CARD_PHONE_PAGER },
- { VCBBSProp, E_CARD_PHONE_BBS },
- { VCModemProp, E_CARD_PHONE_MODEM },
- { VCCarProp, E_CARD_PHONE_CAR },
- { VCISDNProp, E_CARD_PHONE_ISDN },
- { VCVideoProp, E_CARD_PHONE_VIDEO },
- };
-
- for (i = 0; i < sizeof(phone_pairs) / sizeof(phone_pairs[0]); i++) {
- if (isAPropertyOf (vobj, phone_pairs[i].id)) {
- ret |= phone_pairs[i].flag;
- }
- }
-
- return ret;
-}
-
-static void
-set_phone_flags (VObject *vobj, ECardPhoneFlags flags)
-{
- int i;
-
- struct {
- char *id;
- ECardPhoneFlags flag;
- } phone_pairs[] = {
- { VCPreferredProp, E_CARD_PHONE_PREF },
- { VCWorkProp, E_CARD_PHONE_WORK },
- { VCHomeProp, E_CARD_PHONE_HOME },
- { VCVoiceProp, E_CARD_PHONE_VOICE },
- { VCFaxProp, E_CARD_PHONE_FAX },
- { VCMessageProp, E_CARD_PHONE_MSG },
- { VCCellularProp, E_CARD_PHONE_CELL },
- { VCPagerProp, E_CARD_PHONE_PAGER },
- { VCBBSProp, E_CARD_PHONE_BBS },
- { VCModemProp, E_CARD_PHONE_MODEM },
- { VCCarProp, E_CARD_PHONE_CAR },
- { VCISDNProp, E_CARD_PHONE_ISDN },
- { VCVideoProp, E_CARD_PHONE_VIDEO },
- };
-
- for (i = 0; i < sizeof(phone_pairs) / sizeof(phone_pairs[0]); i++) {
- if (flags & phone_pairs[i].flag) {
- addProp (vobj, phone_pairs[i].id);
- }
- }
-}
-
-static ECardAddressFlags
-get_address_flags (VObject *vobj)
-{
- ECardAddressFlags ret = 0;
- int i;
-
- struct {
- char *id;
- ECardAddressFlags flag;
- } addr_pairs[] = {
- { VCDomesticProp, E_CARD_ADDR_DOM },
- { VCInternationalProp, E_CARD_ADDR_INTL },
- { VCPostalProp, E_CARD_ADDR_POSTAL },
- { VCParcelProp, E_CARD_ADDR_PARCEL },
- { VCHomeProp, E_CARD_ADDR_HOME },
- { VCWorkProp, E_CARD_ADDR_WORK },
- };
-
- for (i = 0; i < sizeof(addr_pairs) / sizeof(addr_pairs[0]); i++) {
- if (isAPropertyOf (vobj, addr_pairs[i].id)) {
- ret |= addr_pairs[i].flag;
- }
- }
-
- return ret;
-}
-
-static void
-set_address_flags (VObject *vobj, ECardAddressFlags flags)
-{
- int i;
-
- struct {
- char *id;
- ECardAddressFlags flag;
- } addr_pairs[] = {
- { VCDomesticProp, E_CARD_ADDR_DOM },
- { VCInternationalProp, E_CARD_ADDR_INTL },
- { VCPostalProp, E_CARD_ADDR_POSTAL },
- { VCParcelProp, E_CARD_ADDR_PARCEL },
- { VCHomeProp, E_CARD_ADDR_HOME },
- { VCWorkProp, E_CARD_ADDR_WORK },
- };
-
- for (i = 0; i < sizeof(addr_pairs) / sizeof(addr_pairs[0]); i++) {
- if (flags & addr_pairs[i].flag) {
- addProp (vobj, addr_pairs[i].id);
- }
- }
-}
diff --git a/addressbook/backend/ebook/e-card.h b/addressbook/backend/ebook/e-card.h
deleted file mode 100644
index 3992067a55..0000000000
--- a/addressbook/backend/ebook/e-card.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- * Arturo Espinosa
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#ifndef __E_CARD_H__
-#define __E_CARD_H__
-
-#include <time.h>
-#include <gtk/gtk.h>
-#include <stdio.h>
-#include <addressbook/backend/ebook/e-card-types.h>
-#include <e-util/e-list.h>
-
-#define E_TYPE_CARD (e_card_get_type ())
-#define E_CARD(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CARD, ECard))
-#define E_CARD_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CARD, ECardClass))
-#define E_IS_CARD(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CARD))
-#define E_IS_CARD_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_CARD))
-
-typedef struct _ECard ECard;
-typedef struct _ECardClass ECardClass;
-
-struct _ECard {
- GtkObject object;
- char *id;
-
- char *file_as; /* The File As field. */
- char *fname; /* The full name. */
- ECardName *name; /* The structured name. */
- EList *address; /* Delivery addresses (ECardDeliveryAddress *) */
- EList *address_label; /* Delivery address labels
- * (ECardAddrLabel *) */
-
- EList *phone; /* Phone numbers (ECardPhone *) */
- EList *email; /* Email addresses (char *) */
- char *url; /* The person's web page. */
-
- ECardDate *bday; /* The person's birthday. */
-
- char *note;
-
-
- char *org; /* The person's organization. */
- char *org_unit; /* The person's organization unit. */
- char *office; /* The person's office. */
- char *role; /* The person's role w/in his org */
- char *title; /* The person's title w/in his org */
-
- char *manager;
- char *assistant;
-
- char *nickname; /* The person's nickname */
-
- char *spouse; /* The person's spouse. */
- ECardDate *anniversary; /* The person's anniversary. */
-
- char *mailer; /* Mailer */
-
- char *fburl; /* Free Busy URL */
-
- EList *categories; /* Categories. */
-
- EList *arbitrary; /* Arbitrary fields. */
-
- guint32 pilot_id; /* id of the corresponding pilot */
- guint32 pilot_status; /* status information */
-#if 0
- ECardPhoto *logo; /* This person's org's logo. */
-
- ECardPhoto *photo; /* A photo of the person. */
-
- ECard *agent; /* A person who sereves as this
- guy's agent/secretary/etc. */
-
-
- char *categories; /* A list of the categories to which
- this card belongs. */
-
- ECardSound *sound;
-
- ECardKey *key; /* The person's public key. */
- ECardTimeZone *timezn; /* The person's time zone. */
- ECardGeoPos *geopos; /* The person's long/lat. */
-
- ECardRev *rev; /* The time this card was last
- modified. */
-
- EList xtension;
-#endif
-};
-
-struct _ECardClass {
- GtkObjectClass parent_class;
- GHashTable *attribute_jump_table;
-};
-
-
-ECard *e_card_new ( char *vcard);
-char *e_card_get_id ( ECard *card);
-void e_card_set_id ( ECard *card,
- const char *character);
-char *e_card_get_vcard ( ECard *card);
-ECard *e_card_duplicate ( ECard *card);
-
-ECardPhone *e_card_phone_new (void);
-ECardPhone *e_card_phone_copy (const ECardPhone *phone);
-void e_card_phone_free ( ECardPhone *phone);
-
-ECardDeliveryAddress *e_card_delivery_address_new (void);
-ECardDeliveryAddress *e_card_delivery_address_copy (const ECardDeliveryAddress *addr);
-void e_card_delivery_address_free ( ECardDeliveryAddress *addr);
-char *e_card_delivery_address_to_string (const ECardDeliveryAddress *addr);
-ECardDeliveryAddress *e_card_delivery_address_from_string (const char *full_addr);
-
-ECardAddrLabel *e_card_address_label_new (void);
-ECardAddrLabel *e_card_address_label_copy (const ECardAddrLabel *addr);
-void e_card_address_label_free ( ECardAddrLabel *addr);
-
-ECardName *e_card_name_new (void);
-ECardName *e_card_name_copy (const ECardName *name);
-void e_card_name_free ( ECardName *name);
-char *e_card_name_to_string (const ECardName *name);
-ECardName *e_card_name_from_string (const char *full_name);
-
-ECardArbitrary *e_card_arbitrary_new (void);
-ECardArbitrary *e_card_arbitrary_copy (const ECardArbitrary *arbitrary);
-void e_card_arbitrary_free ( ECardArbitrary *arbitrary);
-
-GList *e_card_load_cards_from_file(const char *filename);
-
-/* Standard Gtk function */
-GtkType e_card_get_type (void);
-
-#endif /* ! __E_CARD_H__ */
diff --git a/addressbook/backend/ebook/load-gnomecard-addressbook.c b/addressbook/backend/ebook/load-gnomecard-addressbook.c
deleted file mode 100644
index f1f20bf50b..0000000000
--- a/addressbook/backend/ebook/load-gnomecard-addressbook.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#include <config.h>
-#include <bonobo.h>
-#include <gnome.h>
-#include <stdio.h>
-
-#include <e-book.h>
-
-static CORBA_Environment ev;
-
-#ifdef USING_OAF
-
-#include <liboaf/liboaf.h>
-
-static void
-init_corba (int *argc, char **argv)
-{
- gnome_init_with_popt_table("blah", "0.0", *argc, argv, NULL, 0, NULL);
-
- oaf_init (*argc, argv);
-}
-
-#else
-
-#include <libgnorba/gnorba.h>
-
-static void
-init_corba (int *argc, char **argv)
-{
- gnome_CORBA_init_with_popt_table (
- "blah", "0.0",
- argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
-}
-
-#endif
-
-static void
-init_bonobo (int argc, char **argv)
-{
- if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-}
-
-static void
-add_card_cb (EBook *book, EBookStatus status, const gchar *id, gpointer closure)
-{
- ECard *card = E_CARD(closure);
- char *vcard = e_card_get_vcard(card);
- g_print ("Saved card: %s\n", vcard);
- g_free(vcard);
- gtk_object_unref(GTK_OBJECT(card));
-}
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- GList *list = e_card_load_cards_from_file("gnomecard.vcf");
- GList *iterator;
- for (iterator = list; iterator; iterator = g_list_next(iterator)) {
- ECard *card = iterator->data;
- e_book_add_card(book, card, add_card_cb, card);
- }
- g_list_free(list);
-}
-
-static guint
-ebook_create (void)
-{
- EBook *book;
- gchar *path, *uri;
-
- book = e_book_new ();
-
- if (!book) {
- printf ("%s: %s(): Couldn't create EBook, bailing.\n",
- __FILE__,
- __FUNCTION__);
- return FALSE;
- }
-
-
- path = g_concat_dir_and_file (g_get_home_dir (),
- "evolution/local/Contacts/addressbook.db");
- uri = g_strdup_printf ("file://%s", path);
- g_free (path);
-
- if (! e_book_load_uri (book, uri, book_open_cb, NULL)) {
- printf ("error calling load_uri!\n");
- }
- g_free(uri);
-
-
- return FALSE;
-}
-
-int
-main (int argc, char **argv)
-{
-
- CORBA_exception_init (&ev);
-
- init_corba (&argc, argv);
- init_bonobo (argc, argv);
-
- gtk_idle_add ((GtkFunction) ebook_create, NULL);
-
- bonobo_main ();
-
- return 0;
-}
diff --git a/addressbook/backend/ebook/load-pine-addressbook.c b/addressbook/backend/ebook/load-pine-addressbook.c
deleted file mode 100644
index 0cc1be693c..0000000000
--- a/addressbook/backend/ebook/load-pine-addressbook.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#include <config.h>
-#include <bonobo.h>
-#include <gnome.h>
-#include <stdio.h>
-
-#include <e-book.h>
-
-static CORBA_Environment ev;
-
-#ifdef USING_OAF
-
-#include <liboaf/liboaf.h>
-
-static void
-init_corba (int *argc, char **argv)
-{
- gnome_init_with_popt_table("blah", "0.0", *argc, argv, NULL, 0, NULL);
-
- oaf_init (*argc, argv);
-}
-
-#else
-
-#include <libgnorba/gnorba.h>
-
-static void
-init_corba (int *argc, char **argv)
-{
- gnome_CORBA_init_with_popt_table (
- "blah", "0.0",
- argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
-}
-
-#endif
-
-static void
-init_bonobo (int argc, char **argv)
-{
- if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-}
-
-static void
-add_card_cb (EBook *book, EBookStatus status, const gchar *id, gpointer closure)
-{
- ECard *card = E_CARD(closure);
- char *vcard = e_card_get_vcard(card);
- g_print ("Saved card: %s\n", vcard);
- g_free(vcard);
- gtk_object_unref(GTK_OBJECT(card));
-}
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- FILE *fp = fopen (".addressbook", "r");
- char line[1024];
-
- if (!fp) {
- g_warning ("Can't find .addressbook");
- return;
- }
-
- while(fgets(line, 1024, fp)) {
- int length = strlen(line);
- char **strings;
- ECardName *name;
- ECard *card;
- EList *list;
- if (line[length - 1] == '\n')
- line[--length] = 0;
-
- card = e_card_new("");
- strings = g_strsplit(line, "\t", 3);
- name = e_card_name_from_string(strings[1]);
- gtk_object_set(GTK_OBJECT(card),
- "nickname", strings[0],
- "full_name", strings[1],
- "name", name,
- NULL);
- gtk_object_get(GTK_OBJECT(card),
- "email", &list,
- NULL);
- e_list_append(list, strings[2]);
- g_strfreev(strings);
- e_book_add_card(book, card, add_card_cb, card);
- }
-}
-
-static guint
-ebook_create (void)
-{
- EBook *book;
- gchar *path, *uri;
-
- book = e_book_new ();
-
- if (!book) {
- printf ("%s: %s(): Couldn't create EBook, bailing.\n",
- __FILE__,
- __FUNCTION__);
- return FALSE;
- }
-
-
- path = g_concat_dir_and_file (g_get_home_dir (),
- "evolution/local/Contacts/addressbook.db");
- uri = g_strdup_printf ("file://%s", path);
- g_free (path);
-
- if (! e_book_load_uri (book, uri, book_open_cb, NULL)) {
- printf ("error calling load_uri!\n");
- }
- g_free(uri);
-
-
- return FALSE;
-}
-
-#if 0
-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);
-}
-#endif
-
-int
-main (int argc, char **argv)
-{
-
- CORBA_exception_init (&ev);
-
- init_corba (&argc, argv);
- init_bonobo (argc, argv);
-
- gtk_idle_add ((GtkFunction) ebook_create, NULL);
-
- bonobo_main ();
-
- return 0;
-}
diff --git a/addressbook/backend/ebook/test-card.c b/addressbook/backend/ebook/test-card.c
deleted file mode 100644
index a727dae7a3..0000000000
--- a/addressbook/backend/ebook/test-card.c
+++ /dev/null
@@ -1,194 +0,0 @@
-#include <gnome.h>
-#include "e-card.h"
-
-#define TEST_VCARD \
-"BEGIN:VCARD
-" \
-"FN:Nat
-" \
-"N:Friedman;Nat;D;Mr.
-" \
-"ORG:Helix Code, Inc.
-" \
-"TITLE:Head Geek
-" \
-"ROLE:Programmer/Executive
-" \
-"BDAY:1977-08-06
-" \
-"TEL;WORK:617 679 1984
-" \
-"TEL;CELL:123 456 7890
-" \
-"EMAIL;INTERNET:nat@nat.org
-" \
-"EMAIL;INTERNET:nat@helixcode.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);
-}
-
-
-
-int
-main (int argc, char **argv)
-{
- char *cardstr;
- ECard *card;
-
- /* Fields */
- char *fname;
- char *org;
- char *org_unit;
- char *title;
- char *role;
- char *nickname;
- char *fburl;
- ECardName *name;
- EList *address;
- EList *phone;
- EList *email;
- EIterator *iterator;
- ECardDate *bday;
-
- gnome_init ("TestCard", "0.0", argc, argv);
-
- cardstr = NULL;
- if (argc == 2)
- cardstr = read_file (argv [1]);
-
- if (cardstr == NULL)
- cardstr = TEST_VCARD;
-#if 0
- {
- int i;
- for ( i = 0; i < 100000; i++ ) {
- card = e_card_new (cardstr);
-
- gtk_object_unref (GTK_OBJECT (card));
- }
- }
-#endif
- card = e_card_new (cardstr);
- gtk_object_get(GTK_OBJECT(card),
- "full_name", &fname,
- "name", &name,
- "address", &address,
- "phone", &phone,
- "email", &email,
- "org", &org,
- "org_unit", &org_unit,
- "title", &title,
- "role", &role,
- "nickname", &nickname,
- "fburl", &fburl,
- "birth_date", &bday,
- NULL);
- if ( fname ) {
- printf("Name : %s\n", fname);
- g_free(fname);
- }
- if ( name ) {
- printf("Full Name:\n");
- if ( name->prefix )
- printf(" prefix : %s\n", name->prefix);
- if ( name->given )
- printf(" given : %s\n", name->given);
- if ( name->additional )
- printf(" additional : %s\n", name->additional);
- if ( name->family )
- printf(" family : %s\n", name->family);
- if ( name->suffix )
- printf(" suffix : %s\n", name->suffix);
- }
- if ( org ) {
- printf("Company : %s\n", org);
- }
- if ( org_unit ) {
- printf("Department : %s\n", org_unit);
- }
- if ( title ) {
- printf("Title : %s\n", title);
- }
- if ( role ) {
- printf("Profession : %s\n", role);
- }
- if ( nickname ) {
- printf("Nickname : %s\n", nickname);
- }
- if ( fburl ) {
- printf("Free Busy URL : %s\n", fburl);
- }
- if ( bday ) {
- printf("BDay : %4d-%02d-%02d\n", bday->year, bday->month, bday->day);
- }
- if ( email ) {
- iterator = e_list_get_iterator(address);
- for (; e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- printf("Email : %s\n", (char *) e_iterator_get(iterator));
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- }
- if ( phone ) {
- iterator = e_list_get_iterator(address);
- for (; e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- ECardPhone *e_card_phone = (ECardPhone *) e_iterator_get(iterator);
- printf("Phone ; %d : %s\n", e_card_phone->flags, e_card_phone->number);
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- }
- if ( address ) {
- iterator = e_list_get_iterator(address);
- for (; e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- ECardDeliveryAddress *del_address = (ECardDeliveryAddress *) e_iterator_get(iterator);
- printf("Address ; %d:\n", del_address->flags);
- if ( del_address->po )
- printf(" Po : %s\n", del_address->po);
- if ( del_address->ext )
- printf(" Ext : %s\n", del_address->ext);
- if ( del_address->street )
- printf(" Street : %s\n", del_address->street);
- if ( del_address->city )
- printf(" City : %s\n", del_address->city);
- if ( del_address->region )
- printf(" Region : %s\n", del_address->region);
- if ( del_address->code )
- printf(" Code : %s\n", del_address->code);
- if ( del_address->country )
- printf(" Country : %s\n", del_address->country);
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- }
- printf("%s", e_card_get_vcard(card));
- gtk_object_unref (GTK_OBJECT (card));
-
- return 0;
-}
diff --git a/addressbook/backend/ebook/test-client-list.c b/addressbook/backend/ebook/test-client-list.c
deleted file mode 100644
index e492323310..0000000000
--- a/addressbook/backend/ebook/test-client-list.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#include <config.h>
-#include <bonobo.h>
-#include <gnome.h>
-
-#ifdef USING_OAF
-#include <liboaf/liboaf.h>
-#else
-#include <libgnorba/gnorba.h>
-#endif
-
-#include "e-book.h"
-
-CORBA_Environment ev;
-
-static void
-init_bonobo (int argc, char **argv)
-{
-#ifdef USING_OAF
- gnome_init ("blah", "0.0", argc, argv);
- oaf_init (argc, argv);
-#else
- gnome_CORBA_init_with_popt_table (
- "blah", "0.0",
- &argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
-#endif
-
- if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-}
-
-static void
-get_cursor_cb (EBook *book, EBookStatus status, ECardCursor *cursor, gpointer closure)
-{
- long length = e_card_cursor_get_length(cursor);
- long i;
-
- printf ("Length: %d\n", (int) length);
- for ( i = 0; i < length; i++ ) {
- ECard *card = e_card_cursor_get_nth(cursor, i);
- char *vcard = e_card_get_vcard(card);
- printf("[%s]\n", vcard);
- g_free(vcard);
- gtk_object_unref(GTK_OBJECT(card));
- }
-}
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- printf ("Book opened.\n");
- e_book_get_cursor(book, "", get_cursor_cb, NULL);
-}
-
-static guint
-ebook_create (void)
-{
- EBook *book;
-
- book = e_book_new ();
-
- if (! e_book_load_uri (book, "file:/tmp/test.db", book_open_cb, NULL)) {
- printf ("error calling load_uri!\n");
- }
-
-
- return FALSE;
-}
-
-int
-main (int argc, char **argv)
-{
-
- CORBA_exception_init (&ev);
- init_bonobo (argc, argv);
-
- gtk_idle_add ((GtkFunction) ebook_create, NULL);
-
- bonobo_main ();
-
- return 0;
-}
diff --git a/addressbook/backend/ebook/test-client.c b/addressbook/backend/ebook/test-client.c
deleted file mode 100644
index ef13c1ab96..0000000000
--- a/addressbook/backend/ebook/test-client.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#include <config.h>
-#include <bonobo.h>
-#include <gnome.h>
-
-#include <e-book.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@helixcode.com
-" \
-"ADR;WORK;POSTAL:P.O. Box 101;;;Any Town;CA;91921-1234;
-" \
-"END:VCARD
-" \
-"
-"
-
-static CORBA_Environment ev;
-static char *cardstr;
-
-#ifdef USING_OAF
-
-#include <liboaf/liboaf.h>
-
-static void
-init_corba (int *argc, char **argv)
-{
- gnome_init_with_popt_table("blah", "0.0", *argc, argv, NULL, 0, NULL);
-
- oaf_init (*argc, argv);
-}
-
-#else
-
-#include <libgnorba/gnorba.h>
-
-static void
-init_corba (int *argc, char **argv)
-{
- gnome_CORBA_init_with_popt_table (
- "blah", "0.0",
- argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
-}
-
-#endif
-
-static void
-init_bonobo (int argc, char **argv)
-{
- if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-}
-
-static void
-get_cursor_cb (EBook *book, EBookStatus status, ECardCursor *cursor, gpointer closure)
-{
- long length = e_card_cursor_get_length(cursor);
- long i;
-
- /* we just added a card, so the length should be >1 */
- printf ("\n%s: %s(): Number of cards is %ld\n",
- __FILE__, __FUNCTION__, length);
- if (length < 1)
- printf ("*** Why isn't this above zero?? ***\n\n");
-
- for ( i = 0; i < length; i++ ) {
- ECard *card = e_card_cursor_get_nth(cursor, i);
- char *vcard = e_card_get_vcard(card);
- printf("Get all cards callback: [%s]\n", vcard);
- g_free(vcard);
- gtk_object_unref(GTK_OBJECT(card));
- }
-}
-
-static void
-add_card_cb (EBook *book, EBookStatus status, const gchar *id, gpointer closure)
-{
- char *vcard;
- ECard *card;
- GTimer *timer;
-
- printf ("Status: %d\n", status);
-
- printf ("Id: %s\n", id);
-
- timer = g_timer_new ();
- g_timer_start (timer);
- card = e_book_get_card (book, id);
- g_timer_stop (timer);
-
- vcard = e_card_get_vcard(card);
- printf ("%g\n", g_timer_elapsed (timer, NULL));
- printf ("Card added: [%s]\n", vcard);
- g_free(vcard);
- gtk_object_unref(GTK_OBJECT(card));
-
- printf ("Getting cards..\n");
- e_book_get_cursor(book, "", get_cursor_cb, NULL);
- printf ("Done getting all cards.\n");
-}
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- e_book_add_vcard(book, cardstr, add_card_cb, NULL);
-}
-
-static guint
-ebook_create (void)
-{
- EBook *book;
-
- book = e_book_new ();
-
- if (!book) {
- printf ("%s: %s(): Couldn't create EBook, bailing.\n",
- __FILE__,
- __FUNCTION__);
- return FALSE;
- }
-
-
- if (! e_book_load_uri (book, "file:/tmp/test.db", book_open_cb, NULL)) {
- printf ("error calling load_uri!\n");
- }
-
-
- return FALSE;
-}
-
-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);
-}
-
-
-int
-main (int argc, char **argv)
-{
-
- CORBA_exception_init (&ev);
-
- init_corba (&argc, argv);
- init_bonobo (argc, argv);
-
- cardstr = NULL;
- if (argc == 2)
- cardstr = read_file (argv [1]);
-
- if (cardstr == NULL)
- cardstr = TEST_VCARD;
-
- gtk_idle_add ((GtkFunction) ebook_create, NULL);
-
- bonobo_main ();
-
- return 0;
-}
diff --git a/addressbook/backend/idl/.cvsignore b/addressbook/backend/idl/.cvsignore
deleted file mode 100644
index 09980ae6ba..0000000000
--- a/addressbook/backend/idl/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
diff --git a/addressbook/backend/idl/Makefile.am b/addressbook/backend/idl/Makefile.am
deleted file mode 100644
index db61d2c30c..0000000000
--- a/addressbook/backend/idl/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-idldir = $(datadir)/idl
-
-idl_DATA = \
- addressbook.idl
-
-EXTRA_DIST = $(idl_DATA)
diff --git a/addressbook/backend/idl/addressbook.idl b/addressbook/backend/idl/addressbook.idl
deleted file mode 100644
index b8cf15c4ff..0000000000
--- a/addressbook/backend/idl/addressbook.idl
+++ /dev/null
@@ -1,133 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include <Bonobo.idl>
-
-module Evolution {
-
- typedef string CardId;
- typedef string VCard;
- typedef sequence<VCard> VCardList;
-
- interface CardCursor : Bonobo::Unknown {
- long get_length ();
- string get_nth (in long n);
- };
-
- /*
- * A book view is a live view of a book. It's either a view
- * of all the cards in the book or a view of a query. When
- * created, it will get a series of signal_card_added calls
- * for all objects in the initial set. After that, it will
- * get added, removed, or changed signals whenever the book
- * changes (if it affects the set of viewed cards.)
- */
- interface BookViewListener : Bonobo::Unknown {
- void signal_card_added (in VCardList cards);
- void signal_card_removed (in CardId id);
- void signal_card_changed (in VCardList cards);
- void signal_sequence_complete ();
- };
-
- interface BookView : Bonobo::Unknown {
- };
-
- interface Book : Bonobo::Unknown {
- /*
- * Fetching cards in the addresbook.
- */
- VCard get_vcard (in CardId id);
-
- /*
- * Permissions. the first form is general write
- * permission (whether or not the user can add or
- * remove or modify any entry in the addressbook.)
- *
- * if can_write returns TRUE, can_write_card can still
- * return FALSE if the user doesn't have permission to
- * modify/remove that specific card.
- */
- boolean can_write ();
- boolean can_write_card (in CardId Id);
-
- /*
- * Adding and deleting cards in the book.
- */
- void create_card (in VCard vcard);
- void remove_card (in CardId Id);
-
- /*
- * Modifying cards in the addressbook.
- */
- void modify_card (in VCard vcard);
-
- /*
- * These two functions return a cursor to the book
- * listener. This is for people who want a snapshot
- * of the addressbook. The syntax for the query
- * string is not yet defined.
- */
- void get_cursor (in string query);
-
- /*
- * These two functions return a book view to the book
- * listener. This is for people who want a live view
- * of the addressbook.
- */
- void get_book_view(in BookViewListener listener, in string query);
-
- void check_connection ();
-
- string get_name ();
- };
-
- interface BookListener : Bonobo::Unknown {
-
- enum CallStatus {
- Success,
- RepositoryOffline,
- PermissionDenied,
- CardNotFound,
- ProtocolNotSupported,
- OtherError
- };
-
- void respond_create_card (in CallStatus status, in CardId Id);
-
- void respond_remove_card (in CallStatus status);
-
- void respond_modify_card (in CallStatus status);
-
- void report_open_book_progress (in string status_message, in short percent);
-
- void respond_open_book (in CallStatus status, in Book book);
-
- void respond_get_cursor (in CallStatus status, in CardCursor cursor);
-
- void respond_get_view (in CallStatus status, in BookView view);
-
- /**
- * report_connection_status:
- *
- * Used to report changes in the connection to the
- * contact repository. This is often a response to a
- * call to check_connection() on the Book, but wombat
- * is free to report the connection status without
- * being asked.
- */
- void report_connection_status (in boolean connected);
- };
-
- interface BookFactory : Bonobo::Unknown {
- exception ProtocolNotSupported {};
-
- void open_book (in string uri, in BookListener listener)
- raises (ProtocolNotSupported);
- };
-};
diff --git a/addressbook/backend/pas/.cvsignore b/addressbook/backend/pas/.cvsignore
deleted file mode 100644
index 071cef99ae..0000000000
--- a/addressbook/backend/pas/.cvsignore
+++ /dev/null
@@ -1,11 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-addressbook-stubs.c
-addressbook-skels.c
-addressbook-common.c
-addressbook.h
-*.lo
-*.la
diff --git a/addressbook/backend/pas/Makefile.am b/addressbook/backend/pas/Makefile.am
deleted file mode 100644
index 8f4f8a3731..0000000000
--- a/addressbook/backend/pas/Makefile.am
+++ /dev/null
@@ -1,52 +0,0 @@
-CORBA_SOURCE = \
- addressbook.h \
- addressbook-common.c \
- addressbook-stubs.c \
- addressbook-skels.c
-
-idls = \
- $(srcdir)/../idl/addressbook.idl
-
-idl_flags = `$(GNOME_CONFIG) --cflags idl` -I $(datadir)/idl
-
-$(CORBA_SOURCE): $(idls)
- $(ORBIT_IDL) $(srcdir)/../idl/addressbook.idl $(idl_flags)
-
-INCLUDES = \
- -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
- -DG_LOG_DOMAIN=\"wombat-pas\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- $(BONOBO_GNOME_CFLAGS)
-
-LDAP_BACKEND_SOURCES = pas-backend-ldap.c pas-backend-ldap.h
-
-if ENABLE_LDAP
-LDAP_BACKEND = $(LDAP_BACKEND_SOURCES)
-else
-LDAP_BACKEND =
-endif
-
-noinst_LIBRARIES = libpas.a
-
-libpas_a_SOURCES = \
- $(CORBA_SOURCE) \
- pas-book-factory.c \
- pas-book-factory.h \
- pas-book-view.c \
- pas-book-view.h \
- pas-book.c \
- pas-book.h \
- pas-backend-file.c \
- pas-backend-file.h \
- $(LDAP_BACKEND) \
- pas-backend.c \
- pas-backend.h \
- pas-card-cursor.c \
- pas-card-cursor.h
-
-BUILT_SOURCES = $(CORBA_SOURCE)
-CLEANFILES += $(BUILT_SOURCES)
-
-EXTRA_DIST = $(LDAP_BACKEND_SOURCES) \ No newline at end of file
diff --git a/addressbook/backend/pas/TODO b/addressbook/backend/pas/TODO
deleted file mode 100644
index 0c77c1b200..0000000000
--- a/addressbook/backend/pas/TODO
+++ /dev/null
@@ -1,2 +0,0 @@
-* Implement pas_book_factory_activate
-* Authentication \ No newline at end of file
diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c
deleted file mode 100644
index 3cf0586afe..0000000000
--- a/addressbook/backend/pas/pas-backend-file.c
+++ /dev/null
@@ -1,1233 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include "config.h"
-#include <gtk/gtksignal.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <time.h>
-#ifdef HAVE_DB_185_H
-#include <db_185.h>
-#else
-#ifdef HAVE_DB1_DB_H
-#include <db1/db.h>
-#else
-#include <db.h>
-#endif
-#endif
-
-#include "pas-backend-file.h"
-#include "pas-book.h"
-#include "pas-card-cursor.h"
-#include <ebook/e-card-simple.h>
-#include <e-util/e-sexp.h>
-#include <e-util/e-util.h>
-
-#define PAS_BACKEND_FILE_VERSION_NAME "PAS-DB-VERSION"
-#define PAS_BACKEND_FILE_VERSION "0.1"
-
-static PASBackendClass *pas_backend_file_parent_class;
-typedef struct _PASBackendFileCursorPrivate PASBackendFileCursorPrivate;
-typedef struct _PASBackendFileBookView PASBackendFileBookView;
-typedef struct _PASBackendFileSearchContext PASBackendFileSearchContext;
-
-struct _PASBackendFilePrivate {
- GList *clients;
- gboolean loaded;
- char *uri;
- DB *file_db;
- GList *book_views;
-};
-
-struct _PASBackendFileCursorPrivate {
- PASBackend *backend;
- PASBook *book;
-
- GList *elements;
- guint32 num_elements;
-};
-
-struct _PASBackendFileBookView {
- PASBookView *book_view;
- gchar *search;
- ESExp *search_sexp;
- PASBackendFileSearchContext *search_context;
-};
-
-struct _PASBackendFileSearchContext {
- ECardSimple *card;
-};
-
-static long
-get_length(PASCardCursor *cursor, gpointer data)
-{
- PASBackendFileCursorPrivate *cursor_data = (PASBackendFileCursorPrivate *) data;
-
- return cursor_data->num_elements;
-}
-
-static char *
-get_nth(PASCardCursor *cursor, long n, gpointer data)
-{
- PASBackendFileCursorPrivate *cursor_data = (PASBackendFileCursorPrivate *) data;
- GList *nth_item = g_list_nth(cursor_data->elements, n);
-
- return g_strdup((char*)nth_item->data);
-}
-
-static void
-cursor_destroy(GtkObject *object, gpointer data)
-{
- CORBA_Environment ev;
- Evolution_Book corba_book;
- PASBackendFileCursorPrivate *cursor_data = (PASBackendFileCursorPrivate *) data;
-
- corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(cursor_data->book));
-
- CORBA_exception_init(&ev);
-
- Evolution_Book_unref(corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("cursor_destroy: Exception unreffing "
- "corba book.\n");
- }
-
- CORBA_exception_free(&ev);
-
- g_list_foreach(cursor_data->elements, (GFunc)g_free, NULL);
- g_list_free (cursor_data->elements);
-
- g_free(cursor_data);
-}
-
-static void
-view_destroy(GtkObject *object, gpointer data)
-{
- CORBA_Environment ev;
- Evolution_Book corba_book;
- PASBook *book = (PASBook *)data;
- PASBackendFile *bf;
- GList *list;
-
- bf = PAS_BACKEND_FILE(pas_book_get_backend(book));
- for (list = bf->priv->book_views; list; list = g_list_next(list)) {
- PASBackendFileBookView *view = list->data;
- if (view->book_view == PAS_BOOK_VIEW(object)) {
- gtk_object_unref((GtkObject *)view->search_sexp);
- g_free (view->search_context);
- g_free (view->search);
- g_free (view);
- bf->priv->book_views = g_list_remove_link(bf->priv->book_views, list);
- g_list_free_1(list);
- break;
- }
- }
-
- corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(book));
-
- CORBA_exception_init(&ev);
-
- Evolution_Book_unref(corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("view_destroy: Exception unreffing "
- "corba book.\n");
- }
-
- CORBA_exception_free(&ev);
-}
-
-static void
-string_to_dbt(const char *str, DBT *dbt)
-{
- dbt->data = (void*)str;
- dbt->size = strlen (str) + 1;
-}
-
-static char *
-pas_backend_file_create_unique_id (char *vcard)
-{
- /* use a 32 counter and the 32 bit timestamp to make an id.
- it's doubtful 2^32 id's will be created in a second, so we
- should be okay. */
- static guint c = 0;
- return g_strdup_printf ("pas-id-%08lX%08X", time(NULL), c++);
-}
-
-static gboolean
-compare_email (ECardSimple *card, const char *str,
- char *(*compare)(const char*, const char*))
-{
- int i;
-
- for (i = E_CARD_SIMPLE_EMAIL_ID_EMAIL; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) {
- const char *email = e_card_simple_get_email (card, i);
-
- if (email && compare(email, str))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-compare_phone (ECardSimple *card, const char *str,
- char *(*compare)(const char*, const char*))
-{
- int i;
-
- for (i = E_CARD_SIMPLE_PHONE_ID_ASSISTANT; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) {
- const ECardPhone *phone = e_card_simple_get_phone (card, i);
-
- if (phone && compare(phone->number, str))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-compare_address (ECardSimple *card, const char *str,
- char *(*compare)(const char*, const char*))
-{
- g_warning("address searching not implemented\n");
- return FALSE;
-}
-
-static struct prop_info {
- ECardSimpleField field_id;
- const char *query_prop;
- const char *ecard_prop;
-#define PROP_TYPE_NORMAL 0x01
-#define PROP_TYPE_LIST 0x02
-#define PROP_TYPE_LISTITEM 0x03
- int prop_type;
- gboolean (*list_compare)(ECardSimple *ecard, const char *str,
- char *(*compare)(const char*, const char*));
-
-} prop_info_table[] = {
-#define NORMAL_PROP(f,q,e) {f, q, e, PROP_TYPE_NORMAL, NULL}
-#define LIST_PROP(q,e,c) {0, q, e, PROP_TYPE_LIST, c}
-
- /* query prop, ecard prop, type, list compare function */
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_FILE_AS, "file_as", "file_as" ),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_FULL_NAME, "full_name", "full_name" ),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_URL, "url", "url" ),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_MAILER, "mailer", "mailer"),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ORG, "org", "org"),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ORG_UNIT, "org_unit", "org_unit"),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_OFFICE, "office", "office"),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_TITLE, "title", "title"),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ROLE, "role", "role"),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_MANAGER, "manager", "manager"),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ASSISTANT, "assistant", "assistant"),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_NICKNAME, "nickname", "nickname"),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_SPOUSE, "spouse", "spouse" ),
- NORMAL_PROP ( E_CARD_SIMPLE_FIELD_NOTE, "note", "note"),
- LIST_PROP ( "email", "email", compare_email ),
- LIST_PROP ( "phone", "phone", compare_phone ),
- LIST_PROP ( "address", "address", compare_address ),
-};
-static int num_prop_infos = sizeof(prop_info_table) / sizeof(prop_info_table[0]);
-
-static ESExpResult *
-entry_compare(PASBackendFileSearchContext *ctx, struct _ESExp *f,
- int argc, struct _ESExpResult **argv,
- char *(*compare)(const char*, const char*))
-{
- ESExpResult *r;
- int truth = FALSE;
-
- if (argc == 2
- && argv[0]->type == ESEXP_RES_STRING
- && argv[1]->type == ESEXP_RES_STRING) {
- char *propname;
- struct prop_info *info = NULL;
- int i;
- gboolean any_field;
-
- propname = argv[0]->value.string;
-
- any_field = !strcmp(propname, "x-evolution-any-field");
- for (i = 0; i < num_prop_infos; i ++) {
- if (any_field
- || !strcmp (prop_info_table[i].query_prop, propname)) {
- info = &prop_info_table[i];
-
- if (info->prop_type == PROP_TYPE_NORMAL) {
- char *prop = NULL;
- /* searches where the query's property
- maps directly to an ecard property */
-
- prop = e_card_simple_get (ctx->card, info->field_id);
-
- if (prop && compare(prop, argv[1]->value.string)) {
- truth = TRUE;
- }
- if ((!prop) && compare("", argv[1]->value.string)) {
- truth = TRUE;
- }
- }
- else if (info->prop_type == PROP_TYPE_LIST) {
- /* the special searches that match any of the list elements */
- truth = info->list_compare (ctx->card, argv[1]->value.string, compare);
- }
-
- /* if we're looking at all fields and find a match,
- or if we're just looking at this one field,
- break. */
- if ((any_field && truth)
- || !any_field)
- break;
- }
- }
-
- }
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = truth;
-
- return r;
-}
-
-static ESExpResult *
-func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- PASBackendFileSearchContext *ctx = data;
-
- return entry_compare (ctx, f, argc, argv, (char *(*)(const char*, const char*)) e_strstrcase);
-}
-
-static char *
-is_helper (const char *s1, const char *s2)
-{
- if (!strcmp(s1, s2))
- return (char*)s1;
- else
- return NULL;
-}
-
-static ESExpResult *
-func_is(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- PASBackendFileSearchContext *ctx = data;
-
- return entry_compare (ctx, f, argc, argv, is_helper);
-}
-
-static char *
-endswith_helper (const char *s1, const char *s2)
-{
- char *p;
- if ((p = strstr(s1, s2))
- && (strlen(p) == strlen(s2)))
- return p;
- else
- return NULL;
-}
-
-static ESExpResult *
-func_endswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- PASBackendFileSearchContext *ctx = data;
-
- return entry_compare (ctx, f, argc, argv, endswith_helper);
-}
-
-static char *
-beginswith_helper (const char *s1, const char *s2)
-{
- char *p;
- if ((p = strstr(s1, s2))
- && (p == s1))
- return p;
- else
- return NULL;
-}
-
-static ESExpResult *
-func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- PASBackendFileSearchContext *ctx = data;
-
- return entry_compare (ctx, f, argc, argv, beginswith_helper);
-}
-
-/* 'builtin' functions */
-static struct {
- char *name;
- ESExpFunc *func;
- int type; /* set to 1 if a function can perform shortcut evaluation, or
- doesn't execute everything, 0 otherwise */
-} symbols[] = {
- { "contains", func_contains, 0 },
- { "is", func_is, 0 },
- { "beginswith", func_beginswith, 0 },
- { "endswith", func_endswith, 0 },
-};
-
-static gboolean
-vcard_matches_search (PASBackendFileBookView *view, char *vcard_string)
-{
- ESExpResult *r;
- gboolean retval;
-
- view->search_context->card = e_card_simple_new (e_card_new (vcard_string));
-
- /* if it's not a valid vcard why is it in our db? :) */
- if (!view->search_context->card)
- return FALSE;
-
- r = e_sexp_eval(view->search_sexp);
-
- retval = (r && r->type == ESEXP_RES_BOOL && r->value.bool);
-
- gtk_object_unref(GTK_OBJECT(view->search_context->card));
-
- e_sexp_result_free(r);
-
- return retval;
-}
-
-static void
-pas_backend_file_search (PASBackendFile *bf,
- PASBook *book,
- PASBackendFileBookView *view)
-{
- int db_error = 0;
- GList *cards = NULL;
- DB *db = bf->priv->file_db;
- DBT id_dbt, vcard_dbt;
- int i;
-
- if (!bf->priv->loaded)
- return;
-
- view->search_sexp = e_sexp_new();
- view->search_context = g_new0(PASBackendFileSearchContext, 1);
-
- for(i=0;i<sizeof(symbols)/sizeof(symbols[0]);i++) {
- if (symbols[i].type == 1) {
- e_sexp_add_ifunction(view->search_sexp, 0, symbols[i].name,
- (ESExpIFunc *)symbols[i].func, view->search_context);
- } else {
- e_sexp_add_function(view->search_sexp, 0, symbols[i].name,
- symbols[i].func, view->search_context);
- }
- }
-
- e_sexp_input_text(view->search_sexp, view->search, strlen(view->search));
- e_sexp_parse(view->search_sexp);
-
- db_error = db->seq(db, &id_dbt, &vcard_dbt, R_FIRST);
-
- while (db_error == 0) {
-
- /* don't include the version in the list of cards */
- if (id_dbt.size != strlen(PAS_BACKEND_FILE_VERSION_NAME) + 1
- || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) {
- char *vcard_string = vcard_dbt.data;
-
- /* check if the vcard matches the search sexp */
- if (vcard_matches_search (view, vcard_string)) {
- cards = g_list_append (cards, strdup(vcard_string));
- }
- }
-
- db_error = db->seq(db, &id_dbt, &vcard_dbt, R_NEXT);
- }
-
- if (db_error == -1) {
- g_warning ("pas_backend_file_search: error building list\n");
- }
- else {
- pas_book_view_notify_add (view->book_view, cards);
- pas_book_view_notify_complete (view->book_view);
- }
-
- /*
- ** It's fine to do this now since the data has been handed off.
- */
- g_list_foreach (cards, (GFunc)g_free, NULL);
- g_list_free (cards);
-}
-
-static char *
-do_create(PASBackend *backend,
- char *vcard_req,
- char **vcard_ptr)
-{
- PASBackendFile *bf = PAS_BACKEND_FILE (backend);
- DB *db = bf->priv->file_db;
- DBT id_dbt, vcard_dbt;
- int db_error;
- char *id;
- ECard *card;
- char *vcard;
- char *ret_val;
-
- id = pas_backend_file_create_unique_id (vcard_req);
-
- string_to_dbt (id, &id_dbt);
-
- card = e_card_new(vcard_req);
- e_card_set_id(card, id);
- vcard = e_card_get_vcard(card);
-
- string_to_dbt (vcard, &vcard_dbt);
-
- db_error = db->put (db, &id_dbt, &vcard_dbt, 0);
-
- if (0 == db_error) {
- db_error = db->sync (db, 0);
- if (db_error != 0)
- g_warning ("db->sync failed.\n");
- ret_val = id;
-
- }
- else {
- ret_val = NULL;
- }
-
- gtk_object_unref(GTK_OBJECT(card));
- card = NULL;
-
- if (vcard_ptr && ret_val)
- *vcard_ptr = vcard;
- else
- g_free (vcard);
-
- return ret_val;
-}
-
-static void
-pas_backend_file_process_create_card (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- char *id;
- char *vcard;
- GList *list;
- PASBackendFile *bf = PAS_BACKEND_FILE (backend);
-
- id = do_create(backend, req->vcard, &vcard);
- if (id) {
- for (list = bf->priv->book_views; list; list = g_list_next(list)) {
- PASBackendFileBookView *view = list->data;
- if (vcard_matches_search (view, vcard)) {
- pas_book_view_notify_add_1 (view->book_view, vcard);
- pas_book_view_notify_complete (view->book_view);
- }
- }
-
- pas_book_respond_create (
- book,
- Evolution_BookListener_Success,
- id);
- g_free(vcard);
- g_free(id);
- }
- else {
- /* XXX need a different call status for this case, i
- think */
- pas_book_respond_create (
- book,
- Evolution_BookListener_CardNotFound,
- "");
- }
-
- g_free(req->vcard);
-}
-
-static void
-pas_backend_file_process_remove_card (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- PASBackendFile *bf = PAS_BACKEND_FILE (backend);
- DB *db = bf->priv->file_db;
- DBT id_dbt, vcard_dbt;
- int db_error;
- GList *list;
- char *vcard_string;
-
- string_to_dbt (req->id, &id_dbt);
-
- db_error = db->get (db, &id_dbt, &vcard_dbt, 0);
- if (0 != db_error) {
- pas_book_respond_remove (
- book,
- Evolution_BookListener_CardNotFound);
- g_free (req->id);
- return;
- }
-
- db_error = db->del (db, &id_dbt, 0);
- if (0 != db_error) {
- pas_book_respond_remove (
- book,
- Evolution_BookListener_CardNotFound);
- g_free (req->id);
- return;
- }
-
- db_error = db->sync (db, 0);
- if (db_error != 0)
- g_warning ("db->sync failed.\n");
-
-
- vcard_string = vcard_dbt.data;
- for (list = bf->priv->book_views; list; list = g_list_next(list)) {
- PASBackendFileBookView *view = list->data;
- if (vcard_matches_search (view, vcard_string)) {
- pas_book_view_notify_remove (view->book_view, req->id);
- pas_book_view_notify_complete (view->book_view);
- }
- }
-
- pas_book_respond_remove (
- book,
- Evolution_BookListener_Success);
-
- g_free (req->id);
-}
-
-static void
-pas_backend_file_process_modify_card (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- PASBackendFile *bf = PAS_BACKEND_FILE (backend);
- DB *db = bf->priv->file_db;
- DBT id_dbt, vcard_dbt;
- int db_error;
- GList *list;
- ECard *card;
- char *id;
- char *old_vcard_string;
-
- /* create a new ecard from the request data */
- card = e_card_new(req->vcard);
- id = e_card_get_id(card);
-
- string_to_dbt (id, &id_dbt);
-
- /* get the old ecard - the one that's presently in the db */
- db_error = db->get (db, &id_dbt, &vcard_dbt, 0);
- if (0 != db_error) {
- pas_book_respond_modify (
- book,
- Evolution_BookListener_CardNotFound);
- g_free (req->id);
- return;
- }
- old_vcard_string = g_strdup(vcard_dbt.data);
-
- string_to_dbt (req->vcard, &vcard_dbt);
-
- db_error = db->put (db, &id_dbt, &vcard_dbt, 0);
-
- if (0 == db_error) {
- db_error = db->sync (db, 0);
- if (db_error != 0)
- g_warning ("db->sync failed.\n");
-
- for (list = bf->priv->book_views; list; list = g_list_next(list)) {
- PASBackendFileBookView *view = list->data;
- gboolean old_match, new_match;
-
- old_match = vcard_matches_search (view, old_vcard_string);
- new_match = vcard_matches_search (view, req->vcard);
- if (old_match && new_match)
- pas_book_view_notify_change_1 (view->book_view, req->vcard);
- else if (new_match)
- pas_book_view_notify_add_1 (view->book_view, req->vcard);
- else /* if (old_match) */
- pas_book_view_notify_remove (view->book_view, id);
- pas_book_view_notify_complete (view->book_view);
- }
-
- pas_book_respond_modify (
- book,
- Evolution_BookListener_Success);
- }
- else {
- pas_book_respond_modify (
- book,
- Evolution_BookListener_CardNotFound);
- }
-
- g_free(old_vcard_string);
-
- gtk_object_unref(GTK_OBJECT(card));
- g_free (req->vcard);
-}
-
-static void
-pas_backend_file_build_all_cards_list(PASBackend *backend,
- PASBackendFileCursorPrivate *cursor_data)
-{
- PASBackendFile *bf = PAS_BACKEND_FILE (backend);
- DB *db = bf->priv->file_db;
- int db_error;
- DBT id_dbt, vcard_dbt;
-
- cursor_data->elements = NULL;
-
- db_error = db->seq(db, &id_dbt, &vcard_dbt, R_FIRST);
-
- while (db_error == 0) {
-
- /* don't include the version in the list of cards */
- if (id_dbt.size != strlen(PAS_BACKEND_FILE_VERSION_NAME) + 1
- || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) {
-
- cursor_data->elements = g_list_append(cursor_data->elements,
- g_strdup(vcard_dbt.data));
-
- }
-
- db_error = db->seq(db, &id_dbt, &vcard_dbt, R_NEXT);
-
- }
-
- if (db_error == -1) {
- g_warning ("pas_backend_file_build_all_cards_list: error building list\n");
- }
- else {
- cursor_data->num_elements = g_list_length (cursor_data->elements);
- }
-}
-
-static void
-pas_backend_file_process_get_cursor (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- /*
- PASBackendFile *bf = PAS_BACKEND_FILE (backend);
- DB *db = bf->priv->file_db;
- DBT id_dbt, vcard_dbt;
- */
- CORBA_Environment ev;
- int db_error = 0;
- PASBackendFileCursorPrivate *cursor_data;
- PASCardCursor *cursor;
- Evolution_Book corba_book;
-
- cursor_data = g_new(PASBackendFileCursorPrivate, 1);
- cursor_data->backend = backend;
- cursor_data->book = book;
-
- pas_backend_file_build_all_cards_list(backend, cursor_data);
-
- corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(book));
-
- CORBA_exception_init(&ev);
-
- Evolution_Book_ref(corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("pas_backend_file_process_get_cursor: Exception reffing "
- "corba book.\n");
- }
-
- CORBA_exception_free(&ev);
-
- cursor = pas_card_cursor_new(get_length,
- get_nth,
- cursor_data);
-
- gtk_signal_connect(GTK_OBJECT(cursor), "destroy",
- GTK_SIGNAL_FUNC(cursor_destroy), cursor_data);
-
- pas_book_respond_get_cursor (
- book,
- (db_error == 0
- ? Evolution_BookListener_Success
- : Evolution_BookListener_CardNotFound),
- cursor);
-}
-
-static void
-pas_backend_file_process_get_book_view (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- PASBackendFile *bf = PAS_BACKEND_FILE (backend);
- CORBA_Environment ev;
- PASBookView *book_view;
- Evolution_Book corba_book;
- PASBackendFileBookView *view;
-
- g_return_if_fail (req->listener != NULL);
-
- corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(book));
-
- CORBA_exception_init(&ev);
-
- Evolution_Book_ref(corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("pas_backend_file_process_get_book_view: Exception reffing "
- "corba book.\n");
- }
-
- CORBA_exception_free(&ev);
-
- book_view = pas_book_view_new (req->listener);
-
- gtk_signal_connect(GTK_OBJECT(book_view), "destroy",
- GTK_SIGNAL_FUNC(view_destroy), book);
-
- pas_book_respond_get_book_view (book,
- (book_view != NULL
- ? Evolution_BookListener_Success
- : Evolution_BookListener_CardNotFound /* XXX */),
- book_view);
-
- view = g_new(PASBackendFileBookView, 1);
- view->book_view = book_view;
- view->search = g_strdup(req->search);
-
- bf->priv->book_views = g_list_prepend(bf->priv->book_views, view);
-
- pas_backend_file_search (bf, book, view);
-
- g_free(req->search);
-}
-
-static void
-pas_backend_file_process_check_connection (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- PASBackendFile *bf = PAS_BACKEND_FILE (backend);
-
- pas_book_report_connection (book, bf->priv->file_db != NULL);
-}
-
-static char *
-pas_backend_file_extract_path_from_uri (const char *uri)
-{
- g_assert (strncasecmp (uri, "file:", 5) == 0);
-
- return g_strdup (uri + 5);
-}
-
-static gboolean
-can_write (PASBackend *backend)
-{
- PASBackendFile *bf = PAS_BACKEND_FILE (backend);
- char *path = pas_backend_file_extract_path_from_uri (bf->priv->uri);
- gboolean retval;
-
- retval = (access (path, W_OK) != -1);
-
- g_free (path);
-
- return retval;
-}
-
-static gboolean
-pas_backend_file_can_write (PASBook *book)
-{
- PASBackend* backend = pas_book_get_backend (book);
-
- return can_write(backend);
-}
-
-static gboolean
-pas_backend_file_can_write_card (PASBook *book,
- const char *id)
-{
- PASBackend* backend = pas_book_get_backend (book);
-
- return can_write(backend);
-}
-
-static void
-pas_backend_file_process_client_requests (PASBook *book)
-{
- PASBackend *backend;
- PASRequest *req;
-
- backend = pas_book_get_backend (book);
-
- req = pas_book_pop_request (book);
- if (req == NULL)
- return;
-
- switch (req->op) {
- case CreateCard:
- pas_backend_file_process_create_card (backend, book, req);
- break;
-
- case RemoveCard:
- pas_backend_file_process_remove_card (backend, book, req);
- break;
-
- case ModifyCard:
- pas_backend_file_process_modify_card (backend, book, req);
- break;
-
- case CheckConnection:
- pas_backend_file_process_check_connection (backend, book, req);
- break;
-
- case GetCursor:
- pas_backend_file_process_get_cursor (backend, book, req);
- break;
-
- case GetBookView:
- pas_backend_file_process_get_book_view (backend, book, req);
- break;
- }
-
- g_free (req);
-}
-
-static void
-pas_backend_file_book_destroy_cb (PASBook *book, gpointer data)
-{
- PASBackendFile *backend;
-
- backend = PAS_BACKEND_FILE (data);
-
- pas_backend_remove_client (PAS_BACKEND (backend), book);
-}
-
-static char *
-pas_backend_file_get_vcard (PASBook *book, const char *id)
-{
- PASBackendFile *bf;
- DBT id_dbt, vcard_dbt;
- DB *db;
- int db_error;
-
- bf = PAS_BACKEND_FILE (pas_book_get_backend (book));
- db = bf->priv->file_db;
-
- string_to_dbt (id, &id_dbt);
-
- db_error = db->get (db, &id_dbt, &vcard_dbt, 0);
- if (db_error == 0) {
- /* success */
- return g_strdup (vcard_dbt.data);
- }
- else if (db_error == 1) {
- /* key was not in file */
- return g_strdup (""); /* XXX */
- }
- else /* if (db_error < 0)*/ {
- /* error */
- return g_strdup (""); /* XXX */
- }
-}
-
-static gboolean
-pas_backend_file_upgrade_db (PASBackendFile *bf, char *old_version)
-{
- if (!strcmp (old_version, "0.0")) {
- /* 0.0 is the same as 0.1, we just need to add the version */
- DB *db = bf->priv->file_db;
- DBT version_name_dbt, version_dbt;
- int db_error;
-
- string_to_dbt (PAS_BACKEND_FILE_VERSION_NAME, &version_name_dbt);
- string_to_dbt (PAS_BACKEND_FILE_VERSION, &version_dbt);
-
- db_error = db->put (db, &version_name_dbt, &version_dbt, 0);
- if (db_error == 0)
- return TRUE;
- else
- return FALSE;
- }
- else {
- g_warning ("unsupported version '%s' found in PAS backend file\n",
- old_version);
- return FALSE;
- }
-}
-
-static gboolean
-pas_backend_file_maybe_upgrade_db (PASBackendFile *bf)
-{
- DB *db = bf->priv->file_db;
- DBT version_name_dbt, version_dbt;
- int db_error;
- char *version;
- gboolean ret_val = TRUE;
-
- string_to_dbt (PAS_BACKEND_FILE_VERSION_NAME, &version_name_dbt);
-
- db_error = db->get (db, &version_name_dbt, &version_dbt, 0);
- if (db_error == 0) {
- /* success */
- version = g_strdup (version_dbt.data);
- }
- else {
- /* key was not in file */
- version = g_strdup ("0.0");
- }
-
- if (strcmp (version, PAS_BACKEND_FILE_VERSION))
- ret_val = pas_backend_file_upgrade_db (bf, version);
-
- g_free (version);
-
- return ret_val;
-}
-
-#define INITIAL_VCARD "BEGIN:VCARD\n\
-X-EVOLUTION-FILE-AS:Helix Code, Inc.\n\
-LABEL;WORK;QUOTED-PRINTABLE:101 Rogers St. Ste. 214=0ACambridge, MA 02142=0AUSA\n\
-TEL;WORK;VOICE:(617) 679-1984\n\
-TEL;WORK;FAX:(617) 679-1949\n\
-EMAIL;INTERNET:hello@helixcode.com\n\
-URL:http://www.helixcode.com/\n\
-ORG:Helix Code, Inc.;\n\
-NOTE:Welcome to the Helix Code Addressbook.\n\
-END:VCARD"
-
-static gboolean
-pas_backend_file_load_uri (PASBackend *backend,
- const char *uri)
-{
- PASBackendFile *bf = PAS_BACKEND_FILE (backend);
- char *filename;
-
- g_assert (bf->priv->loaded == FALSE);
-
- filename = pas_backend_file_extract_path_from_uri (uri);
-
- bf->priv->file_db = dbopen (filename, O_RDWR, 0666, DB_HASH, NULL);
- if (bf->priv->file_db == NULL) {
- bf->priv->file_db = dbopen (filename, O_RDWR | O_CREAT, 0666, DB_HASH, NULL);
-
- if (bf->priv->file_db) {
- char *id;
- id = do_create(backend, INITIAL_VCARD, NULL);
- g_free (id);
- }
- }
-
- g_free (filename);
-
- if (bf->priv->file_db != NULL) {
- if (pas_backend_file_maybe_upgrade_db (bf))
- bf->priv->loaded = TRUE;
- /* XXX what if we fail to upgrade it? */
-
- g_free(bf->priv->uri);
- bf->priv->uri = g_strdup (uri);
- } else
- return FALSE;
-
- return TRUE;
-}
-
-/* Get_uri handler for the addressbook file backend */
-static const char *
-pas_backend_file_get_uri (PASBackend *backend)
-{
- PASBackendFile *bf;
-
- bf = PAS_BACKEND_FILE (backend);
-
- g_return_val_if_fail (bf->priv->loaded, NULL);
- g_assert (bf->priv->uri != NULL);
-
- return bf->priv->uri;
-}
-
-static gboolean
-pas_backend_file_add_client (PASBackend *backend,
- Evolution_BookListener listener)
-{
- PASBackendFile *bf;
- PASBook *book;
-
- g_assert (backend != NULL);
- g_assert (PAS_IS_BACKEND_FILE (backend));
-
- bf = PAS_BACKEND_FILE (backend);
-
- book = pas_book_new (
- backend, listener,
- pas_backend_file_get_vcard,
- pas_backend_file_can_write,
- pas_backend_file_can_write_card);
-
- if (!book) {
- if (!bf->priv->clients)
- pas_backend_last_client_gone (backend);
-
- return FALSE;
- }
-
- gtk_signal_connect (GTK_OBJECT (book), "destroy",
- pas_backend_file_book_destroy_cb, backend);
-
- gtk_signal_connect (GTK_OBJECT (book), "requests_queued",
- pas_backend_file_process_client_requests, NULL);
-
- bf->priv->clients = g_list_prepend (
- bf->priv->clients, book);
-
- if (bf->priv->loaded) {
- pas_book_respond_open (
- book, Evolution_BookListener_Success);
- } else {
- /* Open the book. */
- pas_book_respond_open (
- book, Evolution_BookListener_Success);
- }
-
- return TRUE;
-}
-
-static void
-pas_backend_file_remove_client (PASBackend *backend,
- PASBook *book)
-{
- PASBackendFile *bf;
- GList *l;
- PASBook *lbook;
-
- g_return_if_fail (backend != NULL);
- g_return_if_fail (PAS_IS_BACKEND_FILE (backend));
- g_return_if_fail (book != NULL);
- g_return_if_fail (PAS_IS_BOOK (book));
-
- bf = PAS_BACKEND_FILE (backend);
-
- /* Find the book in the list of clients */
-
- for (l = bf->priv->clients; l; l = l->next) {
- lbook = PAS_BOOK (l->data);
-
- if (lbook == book)
- break;
- }
-
- g_assert (l != NULL);
-
- /* Disconnect */
-
- bf->priv->clients = g_list_remove_link (bf->priv->clients, l);
- g_list_free_1 (l);
-
- /* When all clients go away, notify the parent factory about it so that
- * it may decide whether to kill the backend or not.
- */
- if (!bf->priv->clients)
- pas_backend_last_client_gone (backend);
-}
-
-static gboolean
-pas_backend_file_construct (PASBackendFile *backend)
-{
- g_assert (backend != NULL);
- g_assert (PAS_IS_BACKEND_FILE (backend));
-
- if (! pas_backend_construct (PAS_BACKEND (backend)))
- return FALSE;
-
- return TRUE;
-}
-
-/**
- * pas_backend_file_new:
- */
-PASBackend *
-pas_backend_file_new (void)
-{
- PASBackendFile *backend;
-
- backend = gtk_type_new (pas_backend_file_get_type ());
-
- if (! pas_backend_file_construct (backend)) {
- gtk_object_unref (GTK_OBJECT (backend));
-
- return NULL;
- }
-
- return PAS_BACKEND (backend);
-}
-
-static void
-pas_backend_file_destroy (GtkObject *object)
-{
- PASBackendFile *bf;
-
- bf = PAS_BACKEND_FILE (object);
-
- g_free (bf->priv->uri);
-
- GTK_OBJECT_CLASS (pas_backend_file_parent_class)->destroy (object);
-}
-
-static void
-pas_backend_file_class_init (PASBackendFileClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
- PASBackendClass *parent_class;
-
- pas_backend_file_parent_class = gtk_type_class (pas_backend_get_type ());
-
- parent_class = PAS_BACKEND_CLASS (klass);
-
- /* Set the virtual methods. */
- parent_class->load_uri = pas_backend_file_load_uri;
- parent_class->get_uri = pas_backend_file_get_uri;
- parent_class->add_client = pas_backend_file_add_client;
- parent_class->remove_client = pas_backend_file_remove_client;
-
- object_class->destroy = pas_backend_file_destroy;
-}
-
-static void
-pas_backend_file_init (PASBackendFile *backend)
-{
- PASBackendFilePrivate *priv;
-
- priv = g_new0 (PASBackendFilePrivate, 1);
- priv->loaded = FALSE;
- priv->clients = NULL;
- priv->book_views = NULL;
- priv->uri = NULL;
-
- backend->priv = priv;
-}
-
-/**
- * pas_backend_file_get_type:
- */
-GtkType
-pas_backend_file_get_type (void)
-{
- static GtkType type = 0;
-
- if (! type) {
- GtkTypeInfo info = {
- "PASBackendFile",
- sizeof (PASBackendFile),
- sizeof (PASBackendFileClass),
- (GtkClassInitFunc) pas_backend_file_class_init,
- (GtkObjectInitFunc) pas_backend_file_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (pas_backend_get_type (), &info);
- }
-
- return type;
-}
diff --git a/addressbook/backend/pas/pas-backend-file.h b/addressbook/backend/pas/pas-backend-file.h
deleted file mode 100644
index 4da9a29cc5..0000000000
--- a/addressbook/backend/pas/pas-backend-file.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2000, Helix Code, Inc.
- */
-
-#ifndef __PAS_BACKEND_FILE_H__
-#define __PAS_BACKEND_FILE_H__
-
-#include <libgnome/gnome-defs.h>
-#include "pas-backend.h"
-
-typedef struct _PASBackendFilePrivate PASBackendFilePrivate;
-
-typedef struct {
- PASBackend parent_object;
- PASBackendFilePrivate *priv;
-} PASBackendFile;
-
-typedef struct {
- PASBackendClass parent_class;
-} PASBackendFileClass;
-
-PASBackend *pas_backend_file_new (void);
-GtkType pas_backend_file_get_type (void);
-
-#define PAS_BACKEND_FILE_TYPE (pas_backend_file_get_type ())
-#define PAS_BACKEND_FILE(o) (GTK_CHECK_CAST ((o), PAS_BACKEND_FILE_TYPE, PASBackendFile))
-#define PAS_BACKEND_FILE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BACKEND_TYPE, PASBackendFileClass))
-#define PAS_IS_BACKEND_FILE(o) (GTK_CHECK_TYPE ((o), PAS_BACKEND_FILE_TYPE))
-#define PAS_IS_BACKEND_FILE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BACKEND_FILE_TYPE))
-
-#endif /* ! __PAS_BACKEND_FILE_H__ */
-
diff --git a/addressbook/backend/pas/pas-backend-ldap.c b/addressbook/backend/pas/pas-backend-ldap.c
deleted file mode 100644
index 3968648972..0000000000
--- a/addressbook/backend/pas/pas-backend-ldap.c
+++ /dev/null
@@ -1,1151 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include "config.h"
-#include <gtk/gtksignal.h>
-#include <fcntl.h>
-#include <time.h>
-#include <lber.h>
-#include <ldap.h>
-
-#include "pas-backend-ldap.h"
-#include "pas-book.h"
-#include "pas-card-cursor.h"
-
-#include <e-util/e-sexp.h>
-#include <ebook/e-card-simple.h>
-
-#define LDAP_MAX_SEARCH_RESPONSES 500
-
-static gchar *query_prop_to_ldap(gchar *query_prop);
-
-static PASBackendClass *pas_backend_ldap_parent_class;
-typedef struct _PASBackendLDAPCursorPrivate PASBackendLDAPCursorPrivate;
-typedef struct _PASBackendLDAPBookView PASBackendLDAPBookView;
-
-struct _PASBackendLDAPPrivate {
- char *uri;
- gboolean connected;
- GList *clients;
- gchar *ldap_host;
- gchar *ldap_rootdn;
- int ldap_port;
- int ldap_scope;
- GList *book_views;
-};
-
-struct _PASBackendLDAPCursorPrivate {
- PASBackend *backend;
- PASBook *book;
-
- GList *elements;
- long num_elements;
-};
-
-struct _PASBackendLDAPBookView {
- PASBookView *book_view;
- PASBackendLDAPPrivate *blpriv;
- LDAP *ldap;
- gchar *search;
- int search_idle;
- int search_msgid;
-};
-
-static long
-get_length(PASCardCursor *cursor, gpointer data)
-{
- PASBackendLDAPCursorPrivate *cursor_data = (PASBackendLDAPCursorPrivate *) data;
-
- return cursor_data->num_elements;
-}
-
-static char *
-get_nth(PASCardCursor *cursor, long n, gpointer data)
-{
- return g_strdup("");
-}
-
-static void
-cursor_destroy(GtkObject *object, gpointer data)
-{
- CORBA_Environment ev;
- Evolution_Book corba_book;
- PASBackendLDAPCursorPrivate *cursor_data = (PASBackendLDAPCursorPrivate *) data;
-
- corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(cursor_data->book));
-
- CORBA_exception_init(&ev);
-
- Evolution_Book_unref(corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("cursor_destroy: Exception unreffing "
- "corba book.\n");
- }
-
- CORBA_exception_free(&ev);
-
- /* free the ldap specific cursor information */
-
-
- g_free(cursor_data);
-}
-
-static void
-view_destroy(GtkObject *object, gpointer data)
-{
- CORBA_Environment ev;
- Evolution_Book corba_book;
- PASBook *book = (PASBook *)data;
- PASBackendLDAP *bl;
- GList *list;
-
- bl = PAS_BACKEND_LDAP(pas_book_get_backend(book));
- for (list = bl->priv->book_views; list; list = g_list_next(list)) {
- PASBackendLDAPBookView *view = list->data;
- if (view->book_view == PAS_BOOK_VIEW(object)) {
- if (view->search_idle != 0)
- g_source_remove(view->search_idle);
- if (view->ldap)
- ldap_unbind (view->ldap);
- g_free (view->search);
- g_free (view);
- bl->priv->book_views = g_list_remove_link(bl->priv->book_views, list);
- g_list_free_1(list);
- break;
- }
- }
-
- corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(book));
-
- CORBA_exception_init(&ev);
-
- Evolution_Book_unref(corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("view_destroy: Exception unreffing "
- "corba book.\n");
- }
-
- CORBA_exception_free(&ev);
-}
-
-static void
-pas_backend_ldap_connect (PASBackendLDAPBookView *view)
-{
- LDAP *ldap = view->ldap;
- PASBackendLDAPPrivate *bl = view->blpriv;
-
- /* the connection has gone down, or wasn't ever opened */
- if (ldap == NULL ||
- (ldap_simple_bind_s(ldap, NULL /*binddn*/, NULL /*passwd*/) != LDAP_SUCCESS)) {
-
- /* close connection first if it's open first */
- if (ldap)
- ldap_unbind (ldap);
-
- view->ldap = ldap_open (bl->ldap_host, bl->ldap_port);
- if (NULL != view->ldap) {
- ldap_simple_bind_s(view->ldap,
- NULL /*binddn*/, NULL /*passwd*/);
- bl->connected = TRUE;
- }
- else {
- g_warning ("pas_backend_ldap_connect failed for "
- "'ldap://%s:%d/%s'\n",
- bl->ldap_host,
- bl->ldap_port,
- bl->ldap_rootdn ? bl->ldap_rootdn : "");
- bl->connected = FALSE;
- }
- }
-}
-
-static void
-pas_backend_ldap_process_create_card (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- g_warning ("pas_backend_ldap_process_create_card not implemented\n");
-
- pas_book_respond_create (
- book,
- Evolution_BookListener_CardNotFound,
- "");
-
- g_free (req->vcard);
-}
-
-static void
-pas_backend_ldap_process_remove_card (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- g_warning ("pas_backend_ldap_process_remove_card not implemented\n");
-
- pas_book_respond_remove (
- book,
- Evolution_BookListener_CardNotFound);
-
- g_free (req->id);
-}
-
-static void
-pas_backend_ldap_build_all_cards_list(PASBackend *backend,
- PASBackendLDAPCursorPrivate *cursor_data)
-{
- PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend);
- LDAP *ldap;
- int ldap_error;
- LDAPMessage *res, *e;
-
- ldap = ldap_open (bl->priv->ldap_host, bl->priv->ldap_port);
- if (NULL != ldap) {
- ldap_simple_bind_s(ldap, NULL /*binddn*/, NULL /*passwd*/);
- }
- else {
- g_warning ("pas_backend_ldap_build_all_cards_list: ldap_open failed for "
- "'ldap://%s:%d/%s'\n",
- bl->priv->ldap_host,
- bl->priv->ldap_port,
- bl->priv->ldap_rootdn ? bl->priv->ldap_rootdn : "");
- return;
- }
-
- ldap->ld_sizelimit = LDAP_MAX_SEARCH_RESPONSES;
- ldap->ld_deref = LDAP_DEREF_ALWAYS;
-
- if ((ldap_error = ldap_search_s (ldap,
- bl->priv->ldap_rootdn,
- bl->priv->ldap_scope,
- "(objectclass=*)",
- NULL, 0, &res)) == -1) {
- g_warning ("ldap error '%s' in "
- "pas_backend_ldap_build_all_cards_list\n",
- ldap_err2string(ldap_error));
- }
-
- cursor_data->elements = NULL;
-
- cursor_data->num_elements = ldap_count_entries (ldap, res);
-
- e = ldap_first_entry(ldap, res);
-
- while (NULL != e) {
-
- /* for now just make a list of the dn's */
-#if 0
- for ( a = ldap_first_attribute( ldap, e, &ber ); a != NULL;
- a = ldap_next_attribute( ldap, e, ber ) ) {
- }
-#else
- cursor_data->elements = g_list_prepend(cursor_data->elements,
- g_strdup(ldap_get_dn(ldap, e)));
-#endif
-
- e = ldap_next_entry(ldap, e);
- }
-
- ldap_msgfree(res);
-
- ldap_unbind (ldap);
-}
-
-static void
-pas_backend_ldap_process_modify_card (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- g_warning ("pas_backend_ldap_process_modify_card not implemented\n");
-
- pas_book_respond_modify (
- book,
- Evolution_BookListener_CardNotFound);
- g_free (req->vcard);
-}
-
-static void
-pas_backend_ldap_process_get_cursor (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- CORBA_Environment ev;
- PASBackendLDAPCursorPrivate *cursor_data;
- int ldap_error = 0;
- PASCardCursor *cursor;
- Evolution_Book corba_book;
-
- cursor_data = g_new(PASBackendLDAPCursorPrivate, 1);
- cursor_data->backend = backend;
- cursor_data->book = book;
-
- pas_backend_ldap_build_all_cards_list(backend, cursor_data);
-
- corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(book));
-
- CORBA_exception_init(&ev);
-
- Evolution_Book_ref(corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("pas_backend_file_process_get_cursor: Exception reffing "
- "corba book.\n");
- }
-
- CORBA_exception_free(&ev);
-
- cursor = pas_card_cursor_new(get_length,
- get_nth,
- cursor_data);
-
- gtk_signal_connect(GTK_OBJECT(cursor), "destroy",
- GTK_SIGNAL_FUNC(cursor_destroy), cursor_data);
-
- pas_book_respond_get_cursor (
- book,
- (ldap_error == 0
- ? Evolution_BookListener_Success
- : Evolution_BookListener_CardNotFound),
- cursor);
-}
-
-static void
-construct_email_list(ECardSimple *card, const char *prop, char **values)
-{
- int i;
-
- for (i = 0; values[i] && i < 3; i ++) {
- e_card_simple_set_email (card, i, values[i]);
- }
-}
-
-struct prop_info {
- ECardSimpleField field_id;
- char *query_prop;
- char *ldap_attr;
-#define PROP_TYPE_NORMAL 0x01
-#define PROP_TYPE_LIST 0x02
-#define PROP_TYPE_LISTITEM 0x03
- int prop_type;
- void (*construct_list_func)(ECardSimple *card, const char *prop, char **values);
-} prop_info_table[] = {
- /* field_id, query prop, ldap attr, type, list construct function */
- { E_CARD_SIMPLE_FIELD_FULL_NAME, "full_name", "cn", PROP_TYPE_NORMAL, NULL },
- { E_CARD_SIMPLE_FIELD_TITLE, "title", "title", PROP_TYPE_NORMAL, NULL },
- { E_CARD_SIMPLE_FIELD_ORG, "org", "o", PROP_TYPE_NORMAL, NULL },
- { E_CARD_SIMPLE_FIELD_PHONE_PRIMARY, "phone", "telephonenumber", PROP_TYPE_NORMAL, NULL },
- { 0 /* unused */, "email", "mail", PROP_TYPE_LIST, construct_email_list },
-};
-
-static int num_prop_infos = sizeof(prop_info_table) / sizeof(prop_info_table[0]);
-
-static ESExpResult *
-func_and(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- GList **list = data;
- ESExpResult *r;
- char ** strings;
-
- if (argc > 0) {
- int i;
-
- strings = g_new(char*, argc+3);
- strings[0] = g_strdup ("(&");
- strings[argc+3 - 2] = g_strdup (")");
- strings[argc+3 - 1] = NULL;
-
- for (i = 0; i < argc; i ++) {
- GList *list_head = *list;
- strings[argc - i] = (*list)->data;
- *list = g_list_remove_link(*list, *list);
- g_list_free_1(list_head);
- }
-
- *list = g_list_prepend(*list, g_strjoinv(" ", strings));
-
- for (i = 0 ; i < argc + 2; i ++)
- g_free (strings[i]);
-
- g_free (strings);
- }
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = FALSE;
-
- return r;
-}
-
-static ESExpResult *
-func_or(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- GList **list = data;
- ESExpResult *r;
- char ** strings;
-
- if (argc > 0) {
- int i;
-
- strings = g_new(char*, argc+3);
- strings[0] = g_strdup ("(|");
- strings[argc+3 - 2] = g_strdup (")");
- strings[argc+3 - 1] = NULL;
- for (i = 0; i < argc; i ++) {
- GList *list_head = *list;
- strings[argc - i] = (*list)->data;
- *list = g_list_remove_link(*list, *list);
- g_list_free_1(list_head);
- }
-
- *list = g_list_prepend(*list, g_strjoinv(" ", strings));
-
- for (i = 0 ; i < argc + 2; i ++)
- g_free (strings[i]);
-
- g_free (strings);
- }
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = FALSE;
-
- return r;
-}
-
-static ESExpResult *
-func_not(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- GList **list = data;
- ESExpResult *r;
-
- /* just replace the head of the list with the NOT of it. */
- if (argc > 0) {
- char *term = (*list)->data;
- (*list)->data = g_strdup_printf("(!%s)", term);
- g_free (term);
- }
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = FALSE;
-
- return r;
-}
-
-static ESExpResult *
-func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- GList **list = data;
- ESExpResult *r;
-
- if (argc == 2
- && argv[0]->type == ESEXP_RES_STRING
- && argv[1]->type == ESEXP_RES_STRING) {
- char *propname = argv[0]->value.string;
- char *str = argv[1]->value.string;
- gboolean one_star = FALSE;
-
- if (strlen(str) == 0)
- one_star = TRUE;
-
- if (!strcmp (propname, "x-evolution-any-field")) {
- int i;
- int query_length;
- char *big_query;
- char *header, *footer;
- char *match_str;
-
- header = g_malloc0((num_prop_infos - 1) * 2 + 1);
- footer = g_malloc0(num_prop_infos + 1);
- for (i = 0; i < num_prop_infos - 1; i ++) {
- strcat (header, "(|");
- strcat (footer, ")");
- }
-
- match_str = g_strdup_printf("=*%s%s)",
- str, one_star ? "" : "*");
-
- query_length = strlen (header);
-
- for (i = 0; i < num_prop_infos; i ++) {
- query_length += 1 + strlen(prop_info_table[i].ldap_attr) + strlen (match_str);
- }
-
- big_query = g_malloc0(query_length + 1);
- strcat (big_query, header);
- for (i = 0; i < num_prop_infos; i ++) {
- strcat (big_query, "(");
- strcat (big_query, prop_info_table[i].ldap_attr);
- strcat (big_query, match_str);
- }
- strcat (big_query, footer);
-
- *list = g_list_prepend(*list, big_query);
-
- g_free (match_str);
- g_free (header);
- g_free (footer);
- }
- else {
- char *ldap_attr = query_prop_to_ldap(propname);
-
- if (ldap_attr)
- *list = g_list_prepend(*list,
- g_strdup_printf("(%s=*%s%s)",
- ldap_attr,
- str,
- one_star ? "" : "*"));
- }
- }
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = FALSE;
-
- return r;
-}
-
-static ESExpResult *
-func_is(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- GList **list = data;
- ESExpResult *r;
-
- if (argc == 2
- && argv[0]->type == ESEXP_RES_STRING
- && argv[1]->type == ESEXP_RES_STRING) {
- char *propname = argv[0]->value.string;
- char *str = argv[1]->value.string;
- char *ldap_attr = query_prop_to_ldap(propname);
-
- if (ldap_attr)
- *list = g_list_prepend(*list,
- g_strdup_printf("(%s=%s)",
- ldap_attr, str));
- }
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = FALSE;
-
- return r;
-}
-
-static ESExpResult *
-func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- GList **list = data;
- ESExpResult *r;
-
- if (argc == 2
- && argv[0]->type == ESEXP_RES_STRING
- && argv[1]->type == ESEXP_RES_STRING) {
- char *propname = argv[0]->value.string;
- char *str = argv[1]->value.string;
- char *ldap_attr = query_prop_to_ldap(propname);
- gboolean one_star = FALSE;
-
- if (strlen(str) == 0)
- one_star = TRUE;
-
- if (ldap_attr)
- *list = g_list_prepend(*list,
- g_strdup_printf("(%s=%s*)",
- ldap_attr,
- str));
- }
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = FALSE;
-
- return r;
-}
-
-static ESExpResult *
-func_endswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- GList **list = data;
- ESExpResult *r;
-
- if (argc == 2
- && argv[0]->type == ESEXP_RES_STRING
- && argv[1]->type == ESEXP_RES_STRING) {
- char *propname = argv[0]->value.string;
- char *str = argv[1]->value.string;
- char *ldap_attr = query_prop_to_ldap(propname);
- gboolean one_star = FALSE;
-
- if (strlen(str) == 0)
- one_star = TRUE;
-
- if (ldap_attr)
- *list = g_list_prepend(*list,
- g_strdup_printf("(%s=*%s)",
- ldap_attr,
- str));
- }
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = FALSE;
-
- return r;
-}
-
-/* 'builtin' functions */
-static struct {
- char *name;
- ESExpFunc *func;
- int type; /* set to 1 if a function can perform shortcut evaluation, or
- doesn't execute everything, 0 otherwise */
-} symbols[] = {
- { "and", func_and, 0 },
- { "or", func_or, 0 },
- { "not", func_not, 0 },
- { "contains", func_contains, 0 },
- { "is", func_is, 0 },
- { "beginswith", func_beginswith, 0 },
- { "endswith", func_endswith, 0 },
-};
-
-static gchar *
-pas_backend_ldap_build_query (gchar *query)
-{
- ESExp *sexp;
- ESExpResult *r;
- gchar *retval;
- GList *list = NULL;
- int i;
-
- sexp = e_sexp_new();
-
- for(i=0;i<sizeof(symbols)/sizeof(symbols[0]);i++) {
- if (symbols[i].type == 1) {
- e_sexp_add_ifunction(sexp, 0, symbols[i].name,
- (ESExpIFunc *)symbols[i].func, &list);
- } else {
- e_sexp_add_function(sexp, 0, symbols[i].name,
- symbols[i].func, &list);
- }
- }
-
- e_sexp_input_text(sexp, query, strlen(query));
- e_sexp_parse(sexp);
-
- r = e_sexp_eval(sexp);
-
- gtk_object_unref(GTK_OBJECT(sexp));
- e_sexp_result_free(r);
-
- if (list->next) {
- g_warning ("conversion to ldap query string failed");
- retval = NULL;
- g_list_foreach (list, (GFunc)g_free, NULL);
- }
- else {
- retval = list->data;
- }
-
- g_list_free (list);
- return retval;
-}
-
-static gchar *
-query_prop_to_ldap(gchar *query_prop)
-{
- int i;
-
- for (i = 0; i < num_prop_infos; i ++)
- if (!strcmp (query_prop, prop_info_table[i].query_prop))
- return prop_info_table[i].ldap_attr;
-
- return NULL;
-}
-
-static gboolean
-poll_ldap (PASBackendLDAPBookView *view)
-{
- LDAP *ldap;
- int rc;
- LDAPMessage *res, *e;
- GList *cards = NULL;
-
- ldap = view->ldap;
-
- if ((rc = ldap_result (ldap, view->search_msgid, 0, NULL, &res))
- != LDAP_RES_SEARCH_ENTRY) {
- view->search_idle = 0;
- pas_book_view_notify_complete (view->book_view);
- ldap_unbind (ldap);
- view->ldap = NULL;
- return FALSE;
- }
-
- e = ldap_first_entry(ldap, res);
-
- while (NULL != e) {
- ECard *ecard = E_CARD(gtk_type_new(e_card_get_type()));
- ECardSimple *card = e_card_simple_new (ecard);
- char *dn = ldap_get_dn(ldap, e);
- char *attr;
- BerElement *ber = NULL;
-
- e_card_simple_set_id (card, dn);
-
- for (attr = ldap_first_attribute (ldap, e, &ber); attr;
- attr = ldap_next_attribute (ldap, e, ber)) {
- int i;
- struct prop_info *info = NULL;
-
- for (i = 0; i < num_prop_infos; i ++)
- if (!strcmp (attr, prop_info_table[i].ldap_attr))
- info = &prop_info_table[i];
-
- if (info) {
- char **values;
- values = ldap_get_values (ldap, e, attr);
-
- if (info->prop_type == PROP_TYPE_NORMAL) {
- /* if it's a normal property just set the string */
- e_card_simple_set (card, info->field_id, values[0]);
-
- }
- else if (info->prop_type == PROP_TYPE_LIST) {
- /* if it's a list call the construction function,
- which calls gtk_object_set to set the property */
- info->construct_list_func(card,
- info->query_prop,
- values);
- }
-
- ldap_value_free (values);
- }
- }
-
- /* if ldap->ld_errno == LDAP_DECODING_ERROR there was an
- error decoding an attribute, and we shouldn't free ber,
- since the ldap library already did it. */
- if (ldap->ld_errno != LDAP_DECODING_ERROR && ber)
- ber_free (ber, 0);
-
- e_card_simple_sync_card (card);
- cards = g_list_append (cards, e_card_simple_get_vcard (card));
-
- gtk_object_unref (GTK_OBJECT(card));
-
- e = ldap_next_entry(ldap, e);
- }
-
- if (cards) {
- pas_book_view_notify_add (view->book_view, cards);
-
- g_list_foreach (cards, (GFunc)g_free, NULL);
- g_list_free (cards);
- cards = NULL;
- }
-
- ldap_msgfree(res);
-
- return TRUE;
-}
-
-static void
-pas_backend_ldap_search (PASBackendLDAP *bl,
- PASBook *book,
- PASBackendLDAPBookView *view)
-{
- char *ldap_query;
-
- if (view->search_idle)
- g_warning ("pas_backend_ldap_search called again with pending search on this view.\n");
-
- ldap_query = pas_backend_ldap_build_query(view->search);
-
- if (ldap_query != NULL) {
- LDAP *ldap;
-
- pas_backend_ldap_connect(view);
-
- ldap = view->ldap;
-
- if (ldap) {
- ldap->ld_sizelimit = LDAP_MAX_SEARCH_RESPONSES;
- ldap->ld_deref = LDAP_DEREF_ALWAYS;
-
- if ((view->search_msgid = ldap_search (ldap,
- bl->priv->ldap_rootdn,
- bl->priv->ldap_scope,
- ldap_query,
- NULL, 0)) == -1) {
- g_warning ("ldap error '%s' in pas_backend_ldap_search\n", ldap_err2string(ldap->ld_errno));
- }
- else {
- view->search_idle = g_idle_add((GSourceFunc)poll_ldap, view);
- }
- }
- }
-}
-
-static void
-pas_backend_ldap_process_get_book_view (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend);
- CORBA_Environment ev;
- Evolution_Book corba_book;
- PASBookView *book_view;
- PASBackendLDAPBookView *view;
-
- g_return_if_fail (req->listener != NULL);
-
- corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(book));
-
- CORBA_exception_init(&ev);
-
- Evolution_Book_ref(corba_book, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("pas_backend_file_process_get_book_view: Exception reffing "
- "corba book.\n");
- }
-
- CORBA_exception_free(&ev);
-
- book_view = pas_book_view_new (req->listener);
-
- gtk_signal_connect(GTK_OBJECT(book_view), "destroy",
- GTK_SIGNAL_FUNC(view_destroy), book);
-
- pas_book_respond_get_book_view (book,
- (book_view != NULL
- ? Evolution_BookListener_Success
- : Evolution_BookListener_CardNotFound /* XXX */),
- book_view);
-
- view = g_new0(PASBackendLDAPBookView, 1);
- view->book_view = book_view;
- view->search = g_strdup(req->search);
- view->blpriv = bl->priv;
-
- bl->priv->book_views = g_list_prepend(bl->priv->book_views, view);
-
- pas_backend_ldap_search (bl, book, view);
-
-}
-
-static void
-pas_backend_ldap_process_check_connection (PASBackend *backend,
- PASBook *book,
- PASRequest *req)
-{
- PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend);
-
- pas_book_report_connection (book, bl->priv->connected);
-}
-
-static gboolean
-pas_backend_ldap_can_write (PASBook *book)
-{
- return FALSE; /* XXX */
-}
-
-static gboolean
-pas_backend_ldap_can_write_card (PASBook *book,
- const char *id)
-{
- return FALSE; /* XXX */
-}
-
-static void
-pas_backend_ldap_process_client_requests (PASBook *book)
-{
- PASBackend *backend;
- PASRequest *req;
-
- backend = pas_book_get_backend (book);
-
- req = pas_book_pop_request (book);
- if (req == NULL)
- return;
-
- switch (req->op) {
- case CreateCard:
- pas_backend_ldap_process_create_card (backend, book, req);
- break;
-
- case RemoveCard:
- pas_backend_ldap_process_remove_card (backend, book, req);
- break;
-
- case ModifyCard:
- pas_backend_ldap_process_modify_card (backend, book, req);
- break;
-
- case CheckConnection:
- pas_backend_ldap_process_check_connection (backend, book, req);
- break;
-
- case GetCursor:
- pas_backend_ldap_process_get_cursor (backend, book, req);
- break;
-
- case GetBookView:
- pas_backend_ldap_process_get_book_view (backend, book, req);
- break;
- }
-
- g_free (req);
-}
-
-static void
-pas_backend_ldap_book_destroy_cb (PASBook *book, gpointer data)
-{
- PASBackendLDAP *backend;
-
- backend = PAS_BACKEND_LDAP (data);
-
- pas_backend_remove_client (PAS_BACKEND (backend), book);
-}
-
-static char *
-pas_backend_ldap_get_vcard (PASBook *book, const char *id)
-{
- PASBackendLDAP *bl;
- int ldap_error = LDAP_SUCCESS; /* XXX */
-
- bl = PAS_BACKEND_LDAP (pas_book_get_backend (book));
-
- /* XXX use ldap_search */
-
- if (ldap_error == LDAP_SUCCESS) {
- /* success */
- return g_strdup ("");
- }
- else {
- return g_strdup ("");
- }
-}
-
-static gboolean
-pas_backend_ldap_load_uri (PASBackend *backend,
- const char *uri)
-{
- PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend);
- LDAPURLDesc *lud;
- int ldap_error;
-
- g_assert (bl->priv->connected == FALSE);
-
- ldap_error = ldap_url_parse ((char*)uri, &lud);
- if (ldap_error == LDAP_SUCCESS) {
- g_free(bl->priv->uri);
- bl->priv->uri = g_strdup (uri);
- bl->priv->ldap_host = g_strdup(lud->lud_host);
- bl->priv->ldap_port = lud->lud_port;
- /* if a port wasn't specified, default to 389 */
- if (bl->priv->ldap_port == 0)
- bl->priv->ldap_port = 389;
- bl->priv->ldap_rootdn = g_strdup(lud->lud_dn);
- bl->priv->ldap_scope = lud->lud_scope;
-
- ldap_free_urldesc(lud);
-
- return TRUE;
- } else
- return FALSE;
-}
-
-/* Get_uri handler for the addressbook LDAP backend */
-static const char *
-pas_backend_ldap_get_uri (PASBackend *backend)
-{
- PASBackendLDAP *bl;
-
- bl = PAS_BACKEND_LDAP (backend);
- return bl->priv->uri;
-}
-
-static gboolean
-pas_backend_ldap_add_client (PASBackend *backend,
- Evolution_BookListener listener)
-{
- PASBackendLDAP *bl;
- PASBook *book;
-
- g_assert (backend != NULL);
- g_assert (PAS_IS_BACKEND_LDAP (backend));
-
- bl = PAS_BACKEND_LDAP (backend);
-
- book = pas_book_new (
- backend, listener,
- pas_backend_ldap_get_vcard,
- pas_backend_ldap_can_write,
- pas_backend_ldap_can_write_card);
-
- if (!book) {
- if (!bl->priv->clients)
- pas_backend_last_client_gone (backend);
-
- return FALSE;
- }
-
- gtk_signal_connect (GTK_OBJECT (book), "destroy",
- pas_backend_ldap_book_destroy_cb, backend);
-
- gtk_signal_connect (GTK_OBJECT (book), "requests_queued",
- pas_backend_ldap_process_client_requests, NULL);
-
- bl->priv->clients = g_list_prepend (
- bl->priv->clients, book);
-
- if (bl->priv->connected) {
- pas_book_respond_open (
- book, Evolution_BookListener_Success);
- } else {
- /* Open the book. */
- pas_book_respond_open (
- book, Evolution_BookListener_Success);
- }
-
- return TRUE;
-}
-
-static void
-pas_backend_ldap_remove_client (PASBackend *backend,
- PASBook *book)
-{
- PASBackendLDAP *bl;
- GList *l;
- PASBook *lbook;
-
- g_return_if_fail (backend != NULL);
- g_return_if_fail (PAS_IS_BACKEND_LDAP (backend));
- g_return_if_fail (book != NULL);
- g_return_if_fail (PAS_IS_BOOK (book));
-
- bl = PAS_BACKEND_LDAP (backend);
-
- /* Find the book in the list of clients */
-
- for (l = bl->priv->clients; l; l = l->next) {
- lbook = PAS_BOOK (l->data);
-
- if (lbook == book)
- break;
- }
-
- g_assert (l != NULL);
-
- /* Disconnect */
-
- bl->priv->clients = g_list_remove_link (bl->priv->clients, l);
- g_list_free_1 (l);
-
- /* When all clients go away, notify the parent factory about it so that
- * it may decide whether to kill the backend or not.
- */
- if (!bl->priv->clients)
- pas_backend_last_client_gone (backend);
-}
-
-static gboolean
-pas_backend_ldap_construct (PASBackendLDAP *backend)
-{
- g_assert (backend != NULL);
- g_assert (PAS_IS_BACKEND_LDAP (backend));
-
- if (! pas_backend_construct (PAS_BACKEND (backend)))
- return FALSE;
-
- return TRUE;
-}
-
-/**
- * pas_backend_ldap_new:
- */
-PASBackend *
-pas_backend_ldap_new (void)
-{
- PASBackendLDAP *backend;
-
- backend = gtk_type_new (pas_backend_ldap_get_type ());
-
- if (! pas_backend_ldap_construct (backend)) {
- gtk_object_unref (GTK_OBJECT (backend));
-
- return NULL;
- }
-
- return PAS_BACKEND (backend);
-}
-
-static void
-pas_backend_ldap_destroy (GtkObject *object)
-{
- PASBackendLDAP *bl;
-
- bl = PAS_BACKEND_LDAP (object);
-
- g_free (bl->priv->uri);
-
- GTK_OBJECT_CLASS (pas_backend_ldap_parent_class)->destroy (object);
-}
-
-static void
-pas_backend_ldap_class_init (PASBackendLDAPClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
- PASBackendClass *parent_class;
-
- pas_backend_ldap_parent_class = gtk_type_class (pas_backend_get_type ());
-
- parent_class = PAS_BACKEND_CLASS (klass);
-
- /* Set the virtual methods. */
- parent_class->load_uri = pas_backend_ldap_load_uri;
- parent_class->get_uri = pas_backend_ldap_get_uri;
- parent_class->add_client = pas_backend_ldap_add_client;
- parent_class->remove_client = pas_backend_ldap_remove_client;
-
- object_class->destroy = pas_backend_ldap_destroy;
-}
-
-static void
-pas_backend_ldap_init (PASBackendLDAP *backend)
-{
- PASBackendLDAPPrivate *priv;
-
- priv = g_new0 (PASBackendLDAPPrivate, 1);
- priv->connected = FALSE;
- priv->clients = NULL;
- priv->uri = NULL;
-
- backend->priv = priv;
-}
-
-/**
- * pas_backend_ldap_get_type:
- */
-GtkType
-pas_backend_ldap_get_type (void)
-{
- static GtkType type = 0;
-
- if (! type) {
- GtkTypeInfo info = {
- "PASBackendLDAP",
- sizeof (PASBackendLDAP),
- sizeof (PASBackendLDAPClass),
- (GtkClassInitFunc) pas_backend_ldap_class_init,
- (GtkObjectInitFunc) pas_backend_ldap_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (pas_backend_get_type (), &info);
- }
-
- return type;
-}
diff --git a/addressbook/backend/pas/pas-backend-ldap.h b/addressbook/backend/pas/pas-backend-ldap.h
deleted file mode 100644
index a59cdf3857..0000000000
--- a/addressbook/backend/pas/pas-backend-ldap.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2000, Helix Code, Inc.
- */
-
-#ifndef __PAS_BACKEND_LDAP_H__
-#define __PAS_BACKEND_LDAP_H__
-
-#include <libgnome/gnome-defs.h>
-#include "pas-backend.h"
-
-typedef struct _PASBackendLDAPPrivate PASBackendLDAPPrivate;
-
-typedef struct {
- PASBackend parent_object;
- PASBackendLDAPPrivate *priv;
-} PASBackendLDAP;
-
-typedef struct {
- PASBackendClass parent_class;
-} PASBackendLDAPClass;
-
-PASBackend *pas_backend_ldap_new (void);
-GtkType pas_backend_ldap_get_type (void);
-
-#define PAS_BACKEND_LDAP_TYPE (pas_backend_ldap_get_type ())
-#define PAS_BACKEND_LDAP(o) (GTK_CHECK_CAST ((o), PAS_BACKEND_LDAP_TYPE, PASBackendLDAP))
-#define PAS_BACKEND_LDAP_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BACKEND_TYPE, PASBackendLDAPClass))
-#define PAS_IS_BACKEND_LDAP(o) (GTK_CHECK_TYPE ((o), PAS_BACKEND_LDAP_TYPE))
-#define PAS_IS_BACKEND_LDAP_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BACKEND_LDAP_TYPE))
-
-#endif /* ! __PAS_BACKEND_LDAP_H__ */
-
diff --git a/addressbook/backend/pas/pas-backend.c b/addressbook/backend/pas/pas-backend.c
deleted file mode 100644
index 3d315c2faf..0000000000
--- a/addressbook/backend/pas/pas-backend.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtkobject.h>
-#include <gtk/gtksignal.h>
-#include "pas-backend.h"
-
-#define CLASS(o) PAS_BACKEND_CLASS (GTK_OBJECT (o)->klass)
-
-/* Signal IDs */
-enum {
- LAST_CLIENT_GONE,
- LAST_SIGNAL
-};
-
-static guint pas_backend_signals[LAST_SIGNAL];
-
-
-gboolean
-pas_backend_construct (PASBackend *backend)
-{
- return TRUE;
-}
-
-gboolean
-pas_backend_load_uri (PASBackend *backend,
- const char *uri)
-{
- g_return_val_if_fail (backend != NULL, FALSE);
- g_return_val_if_fail (PAS_IS_BACKEND (backend), FALSE);
- g_return_val_if_fail (uri != NULL, FALSE);
-
- g_assert (CLASS (backend)->load_uri != NULL);
-
- return (* CLASS (backend)->load_uri) (backend, uri);
-}
-
-/**
- * pas_backend_get_uri:
- * @backend: An addressbook backend.
- *
- * Queries the URI that an addressbook backend is serving.
- *
- * Return value: URI for the backend.
- **/
-const char *
-pas_backend_get_uri (PASBackend *backend)
-{
- g_return_val_if_fail (backend != NULL, NULL);
- g_return_val_if_fail (PAS_IS_BACKEND (backend), NULL);
-
- g_assert (CLASS (backend)->get_uri != NULL);
-
- return (* CLASS (backend)->get_uri) (backend);
-}
-
-/**
- * pas_backend_add_client:
- * @backend: An addressbook backend.
- * @listener: Listener for notification to the client.
- *
- * Adds a client to an addressbook backend.
- *
- * Return value: TRUE on success, FALSE on failure to add the client.
- */
-gboolean
-pas_backend_add_client (PASBackend *backend,
- Evolution_BookListener listener)
-{
- g_return_val_if_fail (backend != NULL, FALSE);
- g_return_val_if_fail (PAS_IS_BACKEND (backend), FALSE);
- g_return_val_if_fail (listener != CORBA_OBJECT_NIL, FALSE);
-
- g_assert (CLASS (backend)->add_client != NULL);
-
- return CLASS (backend)->add_client (backend, listener);
-}
-
-void
-pas_backend_remove_client (PASBackend *backend,
- PASBook *book)
-{
- g_return_if_fail (backend != NULL);
- g_return_if_fail (PAS_IS_BACKEND (backend));
- g_return_if_fail (book != NULL);
- g_return_if_fail (PAS_IS_BOOK (book));
-
- g_assert (CLASS (backend)->remove_client != NULL);
-
- CLASS (backend)->remove_client (backend, book);
-}
-
-/**
- * pas_backend_last_client_gone:
- * @backend: An addressbook backend.
- *
- * Emits the "last_client_gone" signal for the specified backend. Should
- * only be called from backend implementations if the backend really does
- * not have any more clients.
- **/
-void
-pas_backend_last_client_gone (PASBackend *backend)
-{
- g_return_if_fail (backend != NULL);
- g_return_if_fail (PAS_IS_BACKEND (backend));
-
- gtk_signal_emit (GTK_OBJECT (backend), pas_backend_signals[LAST_CLIENT_GONE]);
-}
-
-static void
-pas_backend_init (PASBackend *backend)
-{
-}
-
-static void
-pas_backend_class_init (PASBackendClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) klass;
-
- pas_backend_signals[LAST_CLIENT_GONE] =
- gtk_signal_new ("last_client_gone",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (PASBackendClass, last_client_gone),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, pas_backend_signals, LAST_SIGNAL);
-}
-
-/**
- * pas_backend_get_type:
- */
-GtkType
-pas_backend_get_type (void)
-{
- static GtkType type = 0;
-
- if (! type) {
- GtkTypeInfo info = {
- "PASBackend",
- sizeof (PASBackend),
- sizeof (PASBackendClass),
- (GtkClassInitFunc) pas_backend_class_init,
- (GtkObjectInitFunc) pas_backend_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
diff --git a/addressbook/backend/pas/pas-backend.h b/addressbook/backend/pas/pas-backend.h
deleted file mode 100644
index a1d1a291fd..0000000000
--- a/addressbook/backend/pas/pas-backend.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * An abstract class which defines the API to a given backend.
- * There will be one PASBackend object for every URI which is loaded.
- *
- * Two people will call into the PASBackend API:
- *
- * 1. The PASBookFactory, when it has been asked to load a book.
- * It will create a new PASBackend if one is not already running
- * for the requested URI. It will call pas_backend_add_client to
- * add a new client to an existing PASBackend server.
- *
- * 2. A PASBook, when a client has requested an operation on the
- * Evolution_Book interface.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#ifndef __PAS_BACKEND_H__
-#define __PAS_BACKEND_H__
-
-#include <libgnome/gnome-defs.h>
-#include <gtk/gtkobject.h>
-#include <pas/addressbook.h>
-
-typedef struct _PASBackend PASBackend;
-typedef struct _PASBackendPrivate PASBackendPrivate;
-
-#include <pas/pas-book.h>
-
-struct _PASBackend {
- GtkObject parent_object;
- PASBackendPrivate *priv;
-};
-
-typedef struct {
- GtkObjectClass parent_class;
-
- /* Virtual methods */
- gboolean (*load_uri) (PASBackend *backend, const char *uri);
- const char *(* get_uri) (PASBackend *backend);
- gboolean (*add_client) (PASBackend *backend, Evolution_BookListener listener);
- void (*remove_client) (PASBackend *backend, PASBook *book);
-
- /* Notification signals */
- void (* last_client_gone) (PASBackend *backend);
-} PASBackendClass;
-
-typedef PASBackend * (*PASBackendFactoryFn) (void);
-
-gboolean pas_backend_construct (PASBackend *backend);
-gboolean pas_backend_load_uri (PASBackend *backend,
- const char *uri);
-const char *pas_backend_get_uri (PASBackend *backend);
-gboolean pas_backend_add_client (PASBackend *backend,
- Evolution_BookListener listener);
-void pas_backend_remove_client (PASBackend *backend,
- PASBook *book);
-
-void pas_backend_last_client_gone (PASBackend *backend);
-
-GtkType pas_backend_get_type (void);
-
-#define PAS_BACKEND_TYPE (pas_backend_get_type ())
-#define PAS_BACKEND(o) (GTK_CHECK_CAST ((o), PAS_BACKEND_TYPE, PASBackend))
-#define PAS_BACKEND_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BACKEND_TYPE, PASBackendClass))
-#define PAS_IS_BACKEND(o) (GTK_CHECK_TYPE ((o), PAS_BACKEND_TYPE))
-#define PAS_IS_BACKEND_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BACKEND_TYPE))
-
-#endif /* ! __PAS_BACKEND_H__ */
-
diff --git a/addressbook/backend/pas/pas-book-factory.c b/addressbook/backend/pas/pas-book-factory.c
deleted file mode 100644
index 626c7420e2..0000000000
--- a/addressbook/backend/pas/pas-book-factory.c
+++ /dev/null
@@ -1,639 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <ctype.h>
-#include <gnome.h>
-
-#include "addressbook.h"
-#include "pas-book-factory.h"
-
-#ifdef USING_OAF
-#include <liboaf/liboaf.h>
-#define PAS_BOOK_FACTORY_OAF_ID "OAFIID:evolution:addressbook-server:0fbc844d-c721-4615-98d0-d67eacf42d80"
-#else
-#include <libgnorba/gnorba.h>
-#define PAS_BOOK_FACTORY_GOAD_ID "evolution:addressbook-server"
-#endif
-
-static BonoboObjectClass *pas_book_factory_parent_class;
-POA_Evolution_BookFactory__vepv pas_book_factory_vepv;
-
-typedef struct {
- char *uri;
- Evolution_BookListener listener;
-} PASBookFactoryQueuedRequest;
-
-struct _PASBookFactoryPrivate {
- gint idle_id;
- GHashTable *backends;
- GHashTable *active_server_map;
- GList *queued_requests;
-};
-
-/* Signal IDs */
-enum {
- LAST_BOOK_GONE,
- LAST_SIGNAL
-};
-
-static guint factory_signals[LAST_SIGNAL];
-
-static char *
-pas_book_factory_canonicalize_uri (const char *uri)
-{
- /* FIXME: What do I do here? */
-
- return g_strdup (uri);
-}
-
-static char *
-pas_book_factory_extract_proto_from_uri (const char *uri)
-{
- char *proto;
- char *p;
-
- p = strchr (uri, ':');
-
- if (p == NULL)
- return NULL;
-
- proto = g_malloc0 (p - uri + 1);
-
- strncpy (proto, uri, p - uri);
-
- return proto;
-}
-
-/**
- * pas_book_factory_register_backend:
- * @factory:
- * @proto:
- * @backend:
- */
-void
-pas_book_factory_register_backend (PASBookFactory *factory,
- const char *proto,
- PASBackendFactoryFn backend)
-{
- g_return_if_fail (factory != NULL);
- g_return_if_fail (PAS_IS_BOOK_FACTORY (factory));
- g_return_if_fail (proto != NULL);
- g_return_if_fail (backend != NULL);
-
- if (g_hash_table_lookup (factory->priv->backends, proto) != NULL) {
- g_warning ("pas_book_factory_register_backend: "
- "Proto \"%s\" already registered!\n", proto);
- }
-
- g_hash_table_insert (factory->priv->backends,
- g_strdup (proto), backend);
-}
-
-/**
- * pas_book_factory_get_n_backends:
- * @factory: An addressbook factory.
- *
- * Queries the number of running addressbook backends in an addressbook factory.
- *
- * Return value: Number of running backends.
- **/
-int
-pas_book_factory_get_n_backends (PASBookFactory *factory)
-{
- g_return_val_if_fail (factory != NULL, -1);
- g_return_val_if_fail (PAS_IS_BOOK_FACTORY (factory), -1);
-
- return g_hash_table_size (factory->priv->active_server_map);
-}
-
-/* Callback used when a backend loses its last connected client */
-static void
-backend_last_client_gone_cb (PASBackend *backend, gpointer data)
-{
- PASBookFactory *factory;
- const char *uri;
- gpointer orig_key;
- gboolean result;
- char *orig_uri;
-
- factory = PAS_BOOK_FACTORY (data);
-
- /* Remove the backend from the active server map */
-
- uri = pas_backend_get_uri (backend);
- g_assert (uri != NULL);
-
- result = g_hash_table_lookup_extended (factory->priv->active_server_map, uri,
- &orig_key, NULL);
- g_assert (result != FALSE);
-
- orig_uri = orig_key;
-
- g_hash_table_remove (factory->priv->active_server_map, orig_uri);
- g_free (orig_uri);
-
- gtk_object_unref (GTK_OBJECT (backend));
-
- /* Notify upstream if there are no more backends */
-
- if (g_hash_table_size (factory->priv->active_server_map) == 0)
- gtk_signal_emit (GTK_OBJECT (factory), factory_signals[LAST_BOOK_GONE]);
-}
-
-static PASBackendFactoryFn
-pas_book_factory_lookup_backend_factory (PASBookFactory *factory,
- const char *uri)
-{
- PASBackendFactoryFn backend_fn;
- char *proto;
- char *canonical_uri;
-
- g_assert (factory != NULL);
- g_assert (PAS_IS_BOOK_FACTORY (factory));
- g_assert (uri != NULL);
-
- canonical_uri = pas_book_factory_canonicalize_uri (uri);
- if (canonical_uri == NULL)
- return NULL;
-
- proto = pas_book_factory_extract_proto_from_uri (canonical_uri);
- if (proto == NULL) {
- g_free (canonical_uri);
- return NULL;
- }
-
- backend_fn = g_hash_table_lookup (factory->priv->backends, proto);
-
- g_free (proto);
- g_free (canonical_uri);
-
- return backend_fn;
-}
-
-static PASBackend *
-pas_book_factory_launch_backend (PASBookFactory *factory,
- Evolution_BookListener listener,
- const char *uri)
-{
- PASBackendFactoryFn backend_factory;
- PASBackend *backend;
-
- backend_factory = pas_book_factory_lookup_backend_factory (
- factory, uri);
-
- if (!backend_factory) {
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- Evolution_BookListener_respond_open_book (
- listener,
- Evolution_BookListener_ProtocolNotSupported,
- CORBA_OBJECT_NIL,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("pas_book_factory_launch_backend(): could not notify "
- "the listener");
-
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- backend = (* backend_factory) ();
- if (!backend) {
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- Evolution_BookListener_respond_open_book (
- listener,
- Evolution_BookListener_OtherError,
- CORBA_OBJECT_NIL,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("pas_book_factory_launch_backend(): could not notify "
- "the listener");
-
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- g_hash_table_insert (factory->priv->active_server_map,
- g_strdup (uri),
- backend);
-
- gtk_signal_connect (GTK_OBJECT (backend), "last_client_gone",
- backend_last_client_gone_cb,
- factory);
-
- return backend;
-}
-
-static void
-pas_book_factory_process_request (PASBookFactory *factory,
- PASBookFactoryQueuedRequest *request)
-{
- PASBackend *backend;
- char *uri;
- Evolution_BookListener listener;
- CORBA_Environment ev;
-
- uri = request->uri;
- listener = request->listener;
- g_free (request);
-
- /* Look up the backend and create one if needed */
-
- backend = g_hash_table_lookup (factory->priv->active_server_map, uri);
-
- if (!backend) {
- backend = pas_book_factory_launch_backend (factory, listener, uri);
- if (!backend)
- goto out;
-
- if (!pas_backend_add_client (backend, listener))
- goto out;
-
- pas_backend_load_uri (backend, uri);
-
- goto out;
- }
-
- pas_backend_add_client (backend, listener);
-
- out:
- g_free (uri);
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("pas_book_factory_process_request(): could not release the listener");
-
- CORBA_exception_free (&ev);
-}
-
-static gboolean
-pas_book_factory_process_queue (PASBookFactory *factory)
-{
- /* Process pending Book-creation requests. */
- if (factory->priv->queued_requests != NULL) {
- PASBookFactoryQueuedRequest *request;
- GList *l;
-
- l = factory->priv->queued_requests;
- request = l->data;
-
- pas_book_factory_process_request (factory, request);
-
- factory->priv->queued_requests = g_list_remove_link (
- factory->priv->queued_requests, l);
- g_list_free_1 (l);
- }
-
- if (factory->priv->queued_requests == NULL) {
-
- factory->priv->idle_id = 0;
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-pas_book_factory_queue_request (PASBookFactory *factory,
- const char *uri,
- const Evolution_BookListener listener)
-{
- PASBookFactoryQueuedRequest *request;
- Evolution_BookListener listener_copy;
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- listener_copy = CORBA_Object_duplicate (listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("PASBookFactory: Could not duplicate BookListener!\n");
- CORBA_exception_free (&ev);
- return;
- }
-
- CORBA_exception_free (&ev);
-
- request = g_new0 (PASBookFactoryQueuedRequest, 1);
- request->listener = listener_copy;
- request->uri = g_strdup (uri);
-
- factory->priv->queued_requests =
- g_list_prepend (factory->priv->queued_requests, request);
-
- if (! factory->priv->idle_id) {
- factory->priv->idle_id =
- g_idle_add ((GSourceFunc) pas_book_factory_process_queue, factory);
- }
-}
-
-
-static void
-impl_Evolution_BookFactory_open_book (PortableServer_Servant servant,
- const CORBA_char *uri,
- const Evolution_BookListener listener,
- CORBA_Environment *ev)
-{
- PASBookFactory *factory =
- PAS_BOOK_FACTORY (bonobo_object_from_servant (servant));
- PASBackendFactoryFn backend_factory;
-
- backend_factory = pas_book_factory_lookup_backend_factory (factory, uri);
-
- if (backend_factory == NULL) {
- Evolution_BookListener_respond_open_book (
- listener,
- Evolution_BookListener_ProtocolNotSupported,
- CORBA_OBJECT_NIL,
- ev);
-
- return;
- }
-
- pas_book_factory_queue_request (factory, uri, listener);
-}
-
-static gboolean
-pas_book_factory_construct (PASBookFactory *factory)
-{
- POA_Evolution_BookFactory *servant;
- CORBA_Environment ev;
- CORBA_Object obj;
-
- g_assert (factory != NULL);
- g_assert (PAS_IS_BOOK_FACTORY (factory));
-
- servant = (POA_Evolution_BookFactory *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &pas_book_factory_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_BookFactory__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
-
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- obj = bonobo_object_activate_servant (BONOBO_OBJECT (factory), servant);
- if (obj == CORBA_OBJECT_NIL) {
- g_free (servant);
-
- return FALSE;
- }
-
- bonobo_object_construct (BONOBO_OBJECT (factory), obj);
-
- return TRUE;
-}
-
-/**
- * pas_book_factory_new:
- */
-PASBookFactory *
-pas_book_factory_new (void)
-{
- PASBookFactory *factory;
-
- factory = gtk_type_new (pas_book_factory_get_type ());
-
- if (! pas_book_factory_construct (factory)) {
- g_warning ("pas_book_factory_new: Could not construct PASBookFactory!\n");
- gtk_object_unref (GTK_OBJECT (factory));
-
- return NULL;
- }
-
- return factory;
-}
-
-#ifdef USING_OAF
-
-static gboolean
-register_factory (CORBA_Object obj)
-{
- OAF_RegistrationResult result;
-
- puts ("about to register addressbook");
-
- result = oaf_active_server_register (PAS_BOOK_FACTORY_OAF_ID, obj);
-
- switch (result) {
- case OAF_REG_SUCCESS:
- return TRUE;
- case OAF_REG_NOT_LISTED:
- g_message ("Error registering the PAS factory: not listed");
- return FALSE;
- case OAF_REG_ALREADY_ACTIVE:
- g_message ("Error registering the PAS factory: already active");
- return FALSE;
- case OAF_REG_ERROR:
- default:
- g_message ("Error registering the PAS factory: generic error");
- return FALSE;
- }
-}
-
-#else
-
-static gboolean
-register_factory (CORBA_Object obj)
-{
- CORBA_Environment ev;
- int ret;
-
- CORBA_exception_init (&ev);
- ret = goad_server_register (NULL, obj, PAS_BOOK_FACTORY_GOAD_ID, "server", &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("pas_book_factory_activate: Exception "
- "registering PASBookFactory!\n");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- switch (ret) {
- case 0:
- return TRUE;
- case -2:
- g_message ("pas_book_factory_activate: Another "
- "PASBookFactory is already running.\n");
- return FALSE;
- case -1:
- default:
- g_message ("pas_book_factory_activate: Error "
- "registering PASBookFactory!\n");
- return FALSE;
- }
-}
-
-#endif
-
-/**
- * pas_book_factory_activate:
- */
-void
-pas_book_factory_activate (PASBookFactory *factory)
-{
- g_return_if_fail (factory != NULL);
- g_return_if_fail (PAS_IS_BOOK_FACTORY (factory));
-
- register_factory (bonobo_object_corba_objref (BONOBO_OBJECT (factory)));
-}
-
-static void
-pas_book_factory_init (PASBookFactory *factory)
-{
- factory->priv = g_new0 (PASBookFactoryPrivate, 1);
-
- factory->priv->active_server_map = g_hash_table_new (g_str_hash, g_str_equal);
- factory->priv->backends = g_hash_table_new (g_str_hash, g_str_equal);
- factory->priv->queued_requests = NULL;
-}
-
-static void
-free_active_server_map_entry (gpointer key, gpointer value, gpointer data)
-{
- char *uri;
- PASBackend *backend;
-
- uri = key;
- g_free (uri);
-
- backend = PAS_BACKEND (value);
- gtk_object_unref (GTK_OBJECT (backend));
-}
-
-static void
-remove_backends_entry (gpointer key, gpointer value, gpointer data)
-{
- char *uri;
-
- uri = key;
- g_free (uri);
-}
-
-static void
-pas_book_factory_destroy (GtkObject *object)
-{
- PASBookFactory *factory = PAS_BOOK_FACTORY (object);
- GList *l;
-
- for (l = factory->priv->queued_requests; l != NULL; l = l->next) {
- PASBookFactoryQueuedRequest *request = l->data;
- CORBA_Environment ev;
-
- g_free (request->uri);
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (request->listener, &ev);
- CORBA_exception_free (&ev);
-
- g_free (request);
- }
- g_list_free (factory->priv->queued_requests);
- factory->priv->queued_requests = NULL;
-
- g_hash_table_foreach (factory->priv->active_server_map,
- free_active_server_map_entry,
- NULL);
- g_hash_table_destroy (factory->priv->active_server_map);
- factory->priv->active_server_map = NULL;
-
- g_hash_table_foreach (factory->priv->backends,
- remove_backends_entry,
- NULL);
- g_hash_table_destroy (factory->priv->backends);
- factory->priv->backends = NULL;
-
- g_free (factory->priv);
-
- GTK_OBJECT_CLASS (pas_book_factory_parent_class)->destroy (object);
-}
-
-static POA_Evolution_BookFactory__epv *
-pas_book_factory_get_epv (void)
-{
- POA_Evolution_BookFactory__epv *epv;
-
- epv = g_new0 (POA_Evolution_BookFactory__epv, 1);
-
- epv->open_book = impl_Evolution_BookFactory_open_book;
-
- return epv;
-
-}
-
-static void
-pas_book_factory_corba_class_init (void)
-{
- pas_book_factory_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
- pas_book_factory_vepv.Evolution_BookFactory_epv = pas_book_factory_get_epv ();
-}
-
-static void
-pas_book_factory_class_init (PASBookFactoryClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- pas_book_factory_parent_class = gtk_type_class (bonobo_object_get_type ());
-
- factory_signals[LAST_BOOK_GONE] =
- gtk_signal_new ("last_book_gone",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (PASBookFactoryClass, last_book_gone),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, factory_signals, LAST_SIGNAL);
-
- object_class->destroy = pas_book_factory_destroy;
-
- pas_book_factory_corba_class_init ();
-}
-
-/**
- * pas_book_factory_get_type:
- */
-GtkType
-pas_book_factory_get_type (void)
-{
- static GtkType type = 0;
-
- if (! type) {
- GtkTypeInfo info = {
- "PASBookFactory",
- sizeof (PASBookFactory),
- sizeof (PASBookFactoryClass),
- (GtkClassInitFunc) pas_book_factory_class_init,
- (GtkObjectInitFunc) pas_book_factory_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (bonobo_object_get_type (), &info);
- }
-
- return type;
-}
diff --git a/addressbook/backend/pas/pas-book-factory.h b/addressbook/backend/pas/pas-book-factory.h
deleted file mode 100644
index 7e4690adf1..0000000000
--- a/addressbook/backend/pas/pas-book-factory.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include <bonobo/bonobo-object.h>
-#include <libgnome/gnome-defs.h>
-
-#include <pas/pas-backend.h>
-
-#ifndef __PAS_BOOK_FACTORY_H__
-#define __PAS_BOOK_FACTORY_H__
-
-BEGIN_GNOME_DECLS
-
-typedef struct _PASBookFactoryPrivate PASBookFactoryPrivate;
-
-typedef struct {
- BonoboObject parent_object;
- PASBookFactoryPrivate *priv;
-} PASBookFactory;
-
-typedef struct {
- BonoboObjectClass parent_class;
-
- /* Notification signals */
-
- void (* last_book_gone) (PASBookFactory *factory);
-} PASBookFactoryClass;
-
-PASBookFactory *pas_book_factory_new (void);
-
-void pas_book_factory_register_backend (PASBookFactory *factory,
- const char *proto,
- PASBackendFactoryFn backend_factory);
-
-int pas_book_factory_get_n_backends (PASBookFactory *factory);
-
-void pas_book_factory_activate (PASBookFactory *factory);
-
-GtkType pas_book_factory_get_type (void);
-
-#define PAS_BOOK_FACTORY_TYPE (pas_book_factory_get_type ())
-#define PAS_BOOK_FACTORY(o) (GTK_CHECK_CAST ((o), PAS_BOOK_FACTORY_TYPE, PASBookFactory))
-#define PAS_BOOK_FACTORY_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BOOK_FACTORY_TYPE, PASBookFactoryClass))
-#define PAS_IS_BOOK_FACTORY(o) (GTK_CHECK_TYPE ((o), PAS_BOOK_FACTORY_TYPE))
-#define PAS_IS_BOOK_FACTORY_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BOOK_FACTORY_TYPE))
-
-END_GNOME_DECLS
-
-#endif /* ! __PAS_BOOK_FACTORY_H__ */
diff --git a/addressbook/backend/pas/pas-book-view.c b/addressbook/backend/pas/pas-book-view.c
deleted file mode 100644
index 3bf35f439f..0000000000
--- a/addressbook/backend/pas/pas-book-view.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * pas-book-view.c
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <glib.h>
-#include "pas-book-view.h"
-
-static BonoboObjectClass *pas_book_view_parent_class;
-POA_Evolution_BookView__vepv pas_book_view_vepv;
-
-struct _PASBookViewPrivate {
- Evolution_BookViewListener listener;
-};
-
-/**
- * pas_book_view_notify_change:
- */
-void
-pas_book_view_notify_change (PASBookView *book_view,
- const GList *cards)
-{
- CORBA_Environment ev;
- gint i, length;
- CORBA_sequence_Evolution_VCard card_sequence;
-
- length = g_list_length((GList *) cards);
-
- card_sequence._buffer = CORBA_sequence_Evolution_VCard_allocbuf(length);
- card_sequence._maximum = length;
- card_sequence._length = length;
-
- for ( i = 0; cards; cards = g_list_next(cards), i++ ) {
- card_sequence._buffer[i] = CORBA_string_dup((char *) cards->data);
- }
-
- CORBA_exception_init (&ev);
-
- Evolution_BookViewListener_signal_card_changed (
- book_view->priv->listener, &card_sequence, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_view_notify_change: Exception signaling BookViewListener!\n");
- }
-
- CORBA_exception_free (&ev);
-
- CORBA_free(card_sequence._buffer);
-}
-
-void
-pas_book_view_notify_change_1 (PASBookView *book_view,
- const char *card)
-{
- GList *list = g_list_append(NULL, (char *) card);
- pas_book_view_notify_change(book_view, list);
- g_list_free(list);
-}
-
-/**
- * pas_book_view_notify_remove:
- */
-void
-pas_book_view_notify_remove (PASBookView *book_view,
- const char *id)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- Evolution_BookViewListener_signal_card_removed (
- book_view->priv->listener, (Evolution_CardId) id, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_view_notify_remove: Exception signaling BookViewListener!\n");
- }
-
- CORBA_exception_free (&ev);
-}
-
-/**
- * pas_book_view_notify_add:
- */
-void
-pas_book_view_notify_add (PASBookView *book_view,
- const GList *cards)
-{
- CORBA_Environment ev;
- gint i, length;
- CORBA_sequence_Evolution_VCard card_sequence;
-
- length = g_list_length((GList *)cards);
-
- card_sequence._buffer = CORBA_sequence_Evolution_VCard_allocbuf(length);
- card_sequence._maximum = length;
- card_sequence._length = length;
-
- for ( i = 0; cards; cards = g_list_next(cards), i++ ) {
- card_sequence._buffer[i] = CORBA_string_dup((char *) cards->data);
- }
-
- CORBA_exception_init (&ev);
-
- Evolution_BookViewListener_signal_card_added (
- book_view->priv->listener, &card_sequence, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_view_notify_add: Exception signaling BookViewListener!\n");
- }
-
- CORBA_exception_free (&ev);
-
- CORBA_free(card_sequence._buffer);
-}
-
-void
-pas_book_view_notify_add_1 (PASBookView *book_view,
- const char *card)
-{
- GList *list = g_list_append(NULL, (char *) card);
- pas_book_view_notify_add(book_view, list);
- g_list_free(list);
-}
-
-void
-pas_book_view_notify_complete (PASBookView *book_view)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- Evolution_BookViewListener_signal_sequence_complete (
- book_view->priv->listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_view_notify_complete: Exception signaling BookViewListener!\n");
- }
-
- CORBA_exception_free (&ev);
-}
-
-static gboolean
-pas_book_view_construct (PASBookView *book_view,
- Evolution_BookViewListener listener)
-{
- POA_Evolution_BookView *servant;
- CORBA_Environment ev;
- CORBA_Object obj;
-
- g_assert (book_view != NULL);
- g_assert (PAS_IS_BOOK_VIEW (book_view));
- g_assert (listener != CORBA_OBJECT_NIL);
-
- servant = (POA_Evolution_BookView *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &pas_book_view_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_BookView__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
-
- return FALSE;
- }
-
- CORBA_Object_duplicate (listener, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("Unable to duplicate listener object in pas-book-view.c\n");
- CORBA_exception_free (&ev);
-
- return FALSE;
- }
-
- Evolution_BookViewListener_ref (listener, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("Unable to ref listener object in pas-book-view.c\n");
- CORBA_exception_free (&ev);
-
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- obj = bonobo_object_activate_servant (BONOBO_OBJECT (book_view), servant);
- if (obj == CORBA_OBJECT_NIL) {
- g_free (servant);
-
- return FALSE;
- }
-
- bonobo_object_construct (BONOBO_OBJECT (book_view), obj);
-
- book_view->priv->listener = listener;
-
- return TRUE;
-}
-
-/**
- * pas_book_view_new:
- */
-PASBookView *
-pas_book_view_new (Evolution_BookViewListener listener)
-{
- PASBookView *book_view;
-
- g_return_val_if_fail (listener != CORBA_OBJECT_NIL, NULL);
-
- book_view = gtk_type_new (pas_book_view_get_type ());
-
- if (! pas_book_view_construct (book_view, listener)) {
- gtk_object_unref (GTK_OBJECT (book_view));
-
- return NULL;
- }
-
- return book_view;
-}
-
-static void
-pas_book_view_destroy (GtkObject *object)
-{
- PASBookView *book_view = PAS_BOOK_VIEW (object);
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- Evolution_BookViewListener_unref (book_view->priv->listener, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("Unable to unref listener object in pas-book-view.c\n");
- CORBA_exception_free (&ev);
-
- return;
- }
-
- CORBA_Object_release (book_view->priv->listener, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning("Unable to release listener object in pas-book-view.c\n");
- CORBA_exception_free (&ev);
-
- return;
- }
-
- CORBA_exception_free (&ev);
-
- g_free (book_view->priv);
-
- GTK_OBJECT_CLASS (pas_book_view_parent_class)->destroy (object);
-}
-
-static POA_Evolution_BookView__epv *
-pas_book_view_get_epv (void)
-{
- POA_Evolution_BookView__epv *epv;
-
- epv = g_new0 (POA_Evolution_BookView__epv, 1);
-
- return epv;
-
-}
-
-static void
-pas_book_view_corba_class_init (void)
-{
- pas_book_view_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
- pas_book_view_vepv.Evolution_BookView_epv = pas_book_view_get_epv ();
-}
-
-static void
-pas_book_view_class_init (PASBookViewClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- pas_book_view_parent_class = gtk_type_class (bonobo_object_get_type ());
-
- object_class->destroy = pas_book_view_destroy;
-
- pas_book_view_corba_class_init ();
-}
-
-static void
-pas_book_view_init (PASBookView *book_view)
-{
- book_view->priv = g_new0 (PASBookViewPrivate, 1);
- book_view->priv->listener = CORBA_OBJECT_NIL;
-}
-
-/**
- * pas_book_view_get_type:
- */
-GtkType
-pas_book_view_get_type (void)
-{
- static GtkType type = 0;
-
- if (! type) {
- GtkTypeInfo info = {
- "PASBookView",
- sizeof (PASBookView),
- sizeof (PASBookViewClass),
- (GtkClassInitFunc) pas_book_view_class_init,
- (GtkObjectInitFunc) pas_book_view_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (bonobo_object_get_type (), &info);
- }
-
- return type;
-}
-
diff --git a/addressbook/backend/pas/pas-book-view.h b/addressbook/backend/pas/pas-book-view.h
deleted file mode 100644
index b9cdbee876..0000000000
--- a/addressbook/backend/pas/pas-book-view.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * A wrapper object which exports the Evolution_Book CORBA interface
- * and which maintains a request queue.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#ifndef __PAS_BOOK_VIEW_H__
-#define __PAS_BOOK_VIEW_H__
-
-#include <bonobo/bonobo-object.h>
-#include <libgnome/gnome-defs.h>
-#include <pas/addressbook.h>
-
-typedef struct _PASBookView PASBookView;
-typedef struct _PASBookViewClass PASBookViewClass;
-typedef struct _PASBookViewPrivate PASBookViewPrivate;
-
-struct _PASBookView {
- BonoboObject parent_object;
- PASBookViewPrivate *priv;
-};
-
-struct _PASBookViewClass {
- BonoboObjectClass parent_class;
-};
-
-PASBookView *pas_book_view_new (Evolution_BookViewListener listener);
-
-void pas_book_view_notify_change (PASBookView *book_view,
- const GList *cards);
-void pas_book_view_notify_change_1 (PASBookView *book_view,
- const char *card);
-void pas_book_view_notify_remove (PASBookView *book_view,
- const char *id);
-void pas_book_view_notify_add (PASBookView *book_view,
- const GList *cards);
-void pas_book_view_notify_add_1 (PASBookView *book_view,
- const char *card);
-void pas_book_view_notify_complete (PASBookView *book_view);
-
-GtkType pas_book_view_get_type (void);
-
-#define PAS_BOOK_VIEW_TYPE (pas_book_view_get_type ())
-#define PAS_BOOK_VIEW(o) (GTK_CHECK_CAST ((o), PAS_BOOK_VIEW_TYPE, PASBookView))
-#define PAS_BOOK_VIEW_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BOOK_VIEW_FACTORY_TYPE, PASBookViewClass))
-#define PAS_IS_BOOK_VIEW(o) (GTK_CHECK_TYPE ((o), PAS_BOOK_VIEW_TYPE))
-#define PAS_IS_BOOK_VIEW_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BOOK_VIEW_TYPE))
-
-#endif /* ! __PAS_BOOK_VIEW_H__ */
diff --git a/addressbook/backend/pas/pas-book.c b/addressbook/backend/pas/pas-book.c
deleted file mode 100644
index 55caf1dce7..0000000000
--- a/addressbook/backend/pas/pas-book.c
+++ /dev/null
@@ -1,677 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * pas-book.c
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "pas-book.h"
-
-static BonoboObjectClass *pas_book_parent_class;
-POA_Evolution_Book__vepv pas_book_vepv;
-
-enum {
- REQUESTS_QUEUED,
- LAST_SIGNAL
-};
-
-static guint pas_book_signals [LAST_SIGNAL];
-
-struct _PASBookPrivate {
- PASBackend *backend;
- Evolution_BookListener listener;
- PASBookGetVCardFn get_vcard;
- PASBookCanWriteFn can_write;
- PASBookCanWriteCardFn can_write_card;
-
- GList *request_queue;
- gint idle_id;
-};
-
-static gboolean
-pas_book_check_queue (PASBook *book)
-{
- if (book->priv->request_queue != NULL) {
- gtk_signal_emit (GTK_OBJECT (book),
- pas_book_signals [REQUESTS_QUEUED]);
- }
-
- if (book->priv->request_queue == NULL) {
- book->priv->idle_id = 0;
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-pas_book_queue_request (PASBook *book, PASRequest *req)
-{
- book->priv->request_queue =
- g_list_append (book->priv->request_queue, req);
-
- if (book->priv->idle_id == 0) {
- book->priv->idle_id = g_idle_add ((GSourceFunc) pas_book_check_queue, book);
- }
-}
-
-static void
-pas_book_queue_create_card (PASBook *book, const char *vcard)
-{
- PASRequest *req;
-
- req = g_new0 (PASRequest, 1);
- req->op = CreateCard;
- req->vcard = g_strdup (vcard);
-
- pas_book_queue_request (book, req);
-}
-
-static void
-pas_book_queue_remove_card (PASBook *book, const char *id)
-{
- PASRequest *req;
-
- req = g_new0 (PASRequest, 1);
- req->op = RemoveCard;
- req->id = g_strdup (id);
-
- pas_book_queue_request (book, req);
-}
-
-static void
-pas_book_queue_modify_card (PASBook *book, const char *vcard)
-{
- PASRequest *req;
-
- req = g_new0 (PASRequest, 1);
- req->op = ModifyCard;
- req->vcard = g_strdup (vcard);
-
- pas_book_queue_request (book, req);
-}
-
-static void
-pas_book_queue_get_cursor (PASBook *book, const char *search)
-{
- PASRequest *req;
-
- req = g_new0 (PASRequest, 1);
- req->op = GetCursor;
- req->search = g_strdup(search);
-
- pas_book_queue_request (book, req);
-}
-
-static void
-pas_book_queue_get_book_view (PASBook *book, const Evolution_BookViewListener listener, const char *search)
-{
- PASRequest *req;
- CORBA_Environment ev;
-
- req = g_new0 (PASRequest, 1);
- req->op = GetBookView;
- req->search = g_strdup(search);
-
- CORBA_exception_init (&ev);
-
- req->listener = CORBA_Object_duplicate(listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_queue_get_book_view: Exception "
- "duplicating BookViewListener!\n");
- }
-
- CORBA_exception_free (&ev);
-
- pas_book_queue_request (book, req);
-}
-
-static void
-pas_book_queue_check_connection (PASBook *book)
-{
- PASRequest *req;
-
- req = g_new0 (PASRequest, 1);
- req->op = CheckConnection;
-
- pas_book_queue_request (book, req);
-}
-
-static CORBA_char *
-impl_Evolution_Book_get_vcard (PortableServer_Servant servant,
- const Evolution_CardId id,
- CORBA_Environment *ev)
-{
- PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
- char *vcard;
- CORBA_char *retval;
-
- vcard = (book->priv->get_vcard) (book, (const char *) id);
- retval = CORBA_string_dup (vcard);
- g_free (vcard);
-
- return retval;
-}
-
-static CORBA_boolean
-impl_Evolution_Book_can_write (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
- CORBA_boolean retval;
-
- retval = (book->priv->can_write) (book);
-
- return retval;
-}
-
-static CORBA_boolean
-impl_Evolution_Book_can_write_card (PortableServer_Servant servant,
- const Evolution_CardId id,
- CORBA_Environment *ev)
-{
- PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
- CORBA_boolean retval;
-
- retval = (book->priv->can_write_card) (book, (const char *) id);
-
- return retval;
-}
-
-static void
-impl_Evolution_Book_create_card (PortableServer_Servant servant,
- const Evolution_VCard vcard,
- CORBA_Environment *ev)
-{
- PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
-
- pas_book_queue_create_card (book, (const char *) vcard);
-}
-
-static void
-impl_Evolution_Book_remove_card (PortableServer_Servant servant,
- const Evolution_CardId id,
- CORBA_Environment *ev)
-{
- PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
-
- pas_book_queue_remove_card (book, (const char *) id);
-}
-
-static void
-impl_Evolution_Book_modify_card (PortableServer_Servant servant,
- const Evolution_VCard vcard,
- CORBA_Environment *ev)
-{
- PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
-
- pas_book_queue_modify_card (book, (const char *) vcard);
-}
-
-static void
-impl_Evolution_Book_get_cursor (PortableServer_Servant servant,
- const CORBA_char *search,
- CORBA_Environment *ev)
-{
- PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
-
- pas_book_queue_get_cursor (book, search);
-}
-
-static void
-impl_Evolution_Book_get_book_view (PortableServer_Servant servant,
- const Evolution_BookViewListener listener,
- const CORBA_char *search,
- CORBA_Environment *ev)
-{
- PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
-
- pas_book_queue_get_book_view (book, listener, search);
-}
-
-static void
-impl_Evolution_Book_check_connection (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
-
- pas_book_queue_check_connection (book);
-}
-
-/**
- * pas_book_get_backend:
- */
-PASBackend *
-pas_book_get_backend (PASBook *book)
-{
- g_return_val_if_fail (book != NULL, NULL);
- g_return_val_if_fail (PAS_IS_BOOK (book), NULL);
-
- return book->priv->backend;
-}
-
-/**
- * pas_book_get_listener:
- */
-Evolution_BookListener
-pas_book_get_listener (PASBook *book)
-{
- g_return_val_if_fail (book != NULL, CORBA_OBJECT_NIL);
- g_return_val_if_fail (PAS_IS_BOOK (book), CORBA_OBJECT_NIL);
-
- return book->priv->listener;
-}
-
-/**
- * pas_book_check_pending
- */
-gint
-pas_book_check_pending (PASBook *book)
-{
- g_return_val_if_fail (book != NULL, -1);
- g_return_val_if_fail (PAS_IS_BOOK (book), -1);
-
- return g_list_length (book->priv->request_queue);
-}
-
-/**
- * pas_book_pop_request:
- */
-PASRequest *
-pas_book_pop_request (PASBook *book)
-{
- GList *popped;
- PASRequest *req;
-
- g_return_val_if_fail (book != NULL, NULL);
- g_return_val_if_fail (PAS_IS_BOOK (book), NULL);
-
- if (book->priv->request_queue == NULL)
- return NULL;
-
- req = book->priv->request_queue->data;
-
- popped = book->priv->request_queue;
- book->priv->request_queue =
- g_list_remove_link (book->priv->request_queue, popped);
-
- g_list_free_1 (popped);
-
- return req;
-}
-
-/**
- * pas_book_respond_open:
- */
-void
-pas_book_respond_open (PASBook *book,
- Evolution_BookListener_CallStatus status)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- if (status == Evolution_BookListener_Success) {
- Evolution_BookListener_respond_open_book (
- book->priv->listener, status,
- bonobo_object_corba_objref (BONOBO_OBJECT (book)),
- &ev);
- } else {
- Evolution_BookListener_respond_open_book (
- book->priv->listener, status,
- CORBA_OBJECT_NIL, &ev);
- }
-
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_respond_open: Exception "
- "responding to BookListener!\n");
- }
-
- CORBA_exception_free (&ev);
-}
-
-/**
- * pas_book_respond_create:
- */
-void
-pas_book_respond_create (PASBook *book,
- Evolution_BookListener_CallStatus status,
- const char *id)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- Evolution_BookListener_respond_create_card (
- book->priv->listener, status, (char *)id, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_respond_create: Exception "
- "responding to BookListener!\n");
- }
-
- CORBA_exception_free (&ev);
-}
-
-/**
- * pas_book_respond_remove:
- */
-void
-pas_book_respond_remove (PASBook *book,
- Evolution_BookListener_CallStatus status)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- Evolution_BookListener_respond_remove_card (
- book->priv->listener, status, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_respond_remove: Exception "
- "responding to BookListener!\n");
- }
-
- CORBA_exception_free (&ev);
-}
-
-/**
- * pas_book_respond_modify:
- */
-void
-pas_book_respond_modify (PASBook *book,
- Evolution_BookListener_CallStatus status)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- Evolution_BookListener_respond_modify_card (
- book->priv->listener, status, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_respond_modify: Exception "
- "responding to BookListener!\n");
- }
-
- CORBA_exception_free (&ev);
-}
-
-/**
- * pas_book_respond_get_cursor:
- */
-void
-pas_book_respond_get_cursor (PASBook *book,
- Evolution_BookListener_CallStatus status,
- PASCardCursor *cursor)
-{
- CORBA_Environment ev;
- CORBA_Object object;
-
- CORBA_exception_init (&ev);
-
- object = bonobo_object_corba_objref(BONOBO_OBJECT(cursor));
-
- Evolution_BookListener_respond_get_cursor (
- book->priv->listener, status, object, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_respond_get_cursor: Exception "
- "responding to BookListener!\n");
- }
-
- CORBA_exception_free (&ev);
-}
-
-/**
- * pas_book_respond_get_cursor:
- */
-void
-pas_book_respond_get_book_view (PASBook *book,
- Evolution_BookListener_CallStatus status,
- PASBookView *book_view)
-{
- CORBA_Environment ev;
- CORBA_Object object;
-
- CORBA_exception_init (&ev);
-
- object = bonobo_object_corba_objref(BONOBO_OBJECT(book_view));
-
- Evolution_BookListener_respond_get_view (
- book->priv->listener, status, object, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_respond_get_book_view: Exception "
- "responding to BookListener!\n");
- }
-
- CORBA_exception_free (&ev);
-}
-
-/**
- * pas_book_report_connection:
- */
-void
-pas_book_report_connection (PASBook *book,
- gboolean connected)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- Evolution_BookListener_report_connection_status (
- book->priv->listener, (CORBA_boolean) connected, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("pas_book_report_connection: Exception "
- "responding to BookListener!\n");
- }
-
- CORBA_exception_free (&ev);
-}
-
-static gboolean
-pas_book_construct (PASBook *book,
- PASBackend *backend,
- Evolution_BookListener listener,
- PASBookGetVCardFn get_vcard,
- PASBookCanWriteFn can_write,
- PASBookCanWriteCardFn can_write_card)
-{
- POA_Evolution_Book *servant;
- CORBA_Environment ev;
- CORBA_Object obj;
-
- g_assert (book != NULL);
- g_assert (PAS_IS_BOOK (book));
- g_assert (listener != CORBA_OBJECT_NIL);
- g_assert (get_vcard != NULL);
- g_assert (can_write != NULL);
- g_assert (can_write_card != NULL);
-
- servant = (POA_Evolution_Book *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &pas_book_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_Book__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
-
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- obj = bonobo_object_activate_servant (BONOBO_OBJECT (book), servant);
- if (obj == CORBA_OBJECT_NIL) {
- g_free (servant);
-
- return FALSE;
- }
-
- bonobo_object_construct (BONOBO_OBJECT (book), obj);
-
- CORBA_exception_init (&ev);
- book->priv->listener = CORBA_Object_duplicate (listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("pas_book_construct(): could not duplicate the listener");
-
- CORBA_exception_free (&ev);
-
- book->priv->listener = listener;
- book->priv->get_vcard = get_vcard;
- book->priv->can_write = can_write;
- book->priv->can_write_card = can_write_card;
- book->priv->backend = backend;
-
- return TRUE;
-}
-
-/**
- * pas_book_new:
- */
-PASBook *
-pas_book_new (PASBackend *backend,
- Evolution_BookListener listener,
- PASBookGetVCardFn get_vcard,
- PASBookCanWriteFn can_write,
- PASBookCanWriteCardFn can_write_card)
-{
- PASBook *book;
-
- g_return_val_if_fail (listener != CORBA_OBJECT_NIL, NULL);
- g_return_val_if_fail (get_vcard != NULL, NULL);
-
- book = gtk_type_new (pas_book_get_type ());
-
- if (! pas_book_construct (book, backend, listener,
- get_vcard, can_write, can_write_card)) {
- gtk_object_unref (GTK_OBJECT (book));
-
- return NULL;
- }
-
- return book;
-}
-
-static void
-pas_book_destroy (GtkObject *object)
-{
- PASBook *book = PAS_BOOK (object);
- GList *l;
- CORBA_Environment ev;
-
- for (l = book->priv->request_queue; l != NULL; l = l->next) {
- PASRequest *req = l->data;
-
- g_free (req->id);
- g_free (req->vcard);
- g_free (req);
- }
- g_list_free (book->priv->request_queue);
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (book->priv->listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("pas_book_construct(): could not release the listener");
-
- CORBA_exception_free (&ev);
-
- g_free (book->priv);
-
- GTK_OBJECT_CLASS (pas_book_parent_class)->destroy (object);
-}
-
-static POA_Evolution_Book__epv *
-pas_book_get_epv (void)
-{
- POA_Evolution_Book__epv *epv;
-
- epv = g_new0 (POA_Evolution_Book__epv, 1);
-
- epv->get_vcard = impl_Evolution_Book_get_vcard;
- epv->can_write = impl_Evolution_Book_can_write;
- epv->can_write_card = impl_Evolution_Book_can_write_card;
- epv->create_card = impl_Evolution_Book_create_card;
- epv->remove_card = impl_Evolution_Book_remove_card;
- epv->modify_card = impl_Evolution_Book_modify_card;
- epv->check_connection = impl_Evolution_Book_check_connection;
- epv->get_cursor = impl_Evolution_Book_get_cursor;
- epv->get_book_view = impl_Evolution_Book_get_book_view;
-
- return epv;
-
-}
-
-static void
-pas_book_corba_class_init (void)
-{
- pas_book_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
- pas_book_vepv.Evolution_Book_epv = pas_book_get_epv ();
-}
-
-static void
-pas_book_class_init (PASBookClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- pas_book_parent_class = gtk_type_class (bonobo_object_get_type ());
-
- pas_book_signals [REQUESTS_QUEUED] =
- gtk_signal_new ("requests_queued",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (PASBookClass, requests_queued),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, pas_book_signals, LAST_SIGNAL);
-
- object_class->destroy = pas_book_destroy;
-
- pas_book_corba_class_init ();
-}
-
-static void
-pas_book_init (PASBook *book)
-{
- book->priv = g_new0 (PASBookPrivate, 1);
- book->priv->idle_id = 0;
- book->priv->request_queue = NULL;
-}
-
-/**
- * pas_book_get_type:
- */
-GtkType
-pas_book_get_type (void)
-{
- static GtkType type = 0;
-
- if (! type) {
- GtkTypeInfo info = {
- "PASBook",
- sizeof (PASBook),
- sizeof (PASBookClass),
- (GtkClassInitFunc) pas_book_class_init,
- (GtkObjectInitFunc) pas_book_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (bonobo_object_get_type (), &info);
- }
-
- return type;
-}
-
diff --git a/addressbook/backend/pas/pas-book.h b/addressbook/backend/pas/pas-book.h
deleted file mode 100644
index 43a94b6600..0000000000
--- a/addressbook/backend/pas/pas-book.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * A wrapper object which exports the Evolution_Book CORBA interface
- * and which maintains a request queue.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#ifndef __PAS_BOOK_H__
-#define __PAS_BOOK_H__
-
-#include <bonobo/bonobo-object.h>
-#include <libgnome/gnome-defs.h>
-#include <pas/addressbook.h>
-#include <pas/pas-book-view.h>
-
-typedef struct _PASBook PASBook;
-typedef struct _PASBookPrivate PASBookPrivate;
-
-#include <pas/pas-backend.h>
-#include <pas/pas-card-cursor.h>
-
-typedef enum {
- CreateCard,
- RemoveCard,
- ModifyCard,
- GetCursor,
- GetBookView,
- CheckConnection
-} PASOperation;
-
-typedef struct {
- PASOperation op;
- char *id;
- char *vcard;
- char *search;
- Evolution_BookViewListener listener;
-} PASRequest;
-
-struct _PASBook {
- BonoboObject parent_object;
- PASBookPrivate *priv;
-};
-
-typedef struct {
- BonoboObjectClass parent_class;
-
- /* Signals */
- void (*requests_queued) (void);
-} PASBookClass;
-
-typedef char * (*PASBookGetVCardFn) (PASBook *book, const char *id);
-typedef gboolean (*PASBookCanWriteFn) (PASBook *book);
-typedef gboolean (*PASBookCanWriteCardFn) (PASBook *book, const char *id);
-
-PASBook *pas_book_new (PASBackend *backend,
- Evolution_BookListener listener,
- PASBookGetVCardFn get_vcard,
- PASBookCanWriteFn can_write,
- PASBookCanWriteCardFn can_write_card);
-PASBackend *pas_book_get_backend (PASBook *book);
-Evolution_BookListener pas_book_get_listener (PASBook *book);
-int pas_book_check_pending (PASBook *book);
-PASRequest *pas_book_pop_request (PASBook *book);
-
-void pas_book_respond_open (PASBook *book,
- Evolution_BookListener_CallStatus status);
-void pas_book_respond_create (PASBook *book,
- Evolution_BookListener_CallStatus status,
- const char *id);
-void pas_book_respond_remove (PASBook *book,
- Evolution_BookListener_CallStatus status);
-void pas_book_respond_modify (PASBook *book,
- Evolution_BookListener_CallStatus status);
-void pas_book_respond_get_cursor (PASBook *book,
- Evolution_BookListener_CallStatus status,
- PASCardCursor *cursor);
-void pas_book_respond_get_book_view (PASBook *book,
- Evolution_BookListener_CallStatus status,
- PASBookView *book_view);
-void pas_book_report_connection (PASBook *book,
- gboolean connected);
-
-gboolean pas_book_can_write (PASBook *book);
-gboolean pas_book_can_write_card (PASBook *book,
- const char *id);
-GtkType pas_book_get_type (void);
-
-#define PAS_BOOK_TYPE (pas_book_get_type ())
-#define PAS_BOOK(o) (GTK_CHECK_CAST ((o), PAS_BOOK_TYPE, PASBook))
-#define PAS_BOOK_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BOOK_FACTORY_TYPE, PASBookClass))
-#define PAS_IS_BOOK(o) (GTK_CHECK_TYPE ((o), PAS_BOOK_TYPE))
-#define PAS_IS_BOOK_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BOOK_TYPE))
-
-#endif /* ! __PAS_BOOK_H__ */
diff --git a/addressbook/backend/pas/pas-card-cursor.c b/addressbook/backend/pas/pas-card-cursor.c
deleted file mode 100644
index c2bbe1c9b0..0000000000
--- a/addressbook/backend/pas/pas-card-cursor.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * pas-card-cursor.c: Implements card cursors.
- *
- * Author:
- * Christopher James Lahey <clahey@helixcode.com.
- */
-
-#include <config.h>
-#include <bonobo.h>
-#include "addressbook.h"
-#include "pas-card-cursor.h"
-
-struct _PASCardCursorPrivate {
- long (*get_length) (PASCardCursor *cursor, gpointer data);
- char * (*get_nth) (PASCardCursor *cursor, long n, gpointer data);
- gpointer data;
-};
-
-/*
- * A pointer to our parent object class
- */
-static BonoboObjectClass *parent_class;
-
-/*
- * The VEPV for the CardCursor object
- */
-static POA_Evolution_CardCursor__vepv cursor_vepv;
-
-/*
- * Implemented GtkObject::destroy
- */
-static void
-pas_card_cursor_destroy (GtkObject *object)
-{
- PASCardCursor *cursor = PAS_CARD_CURSOR (object);
-
- if ( cursor->priv )
- g_free ( cursor->priv );
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-/*
- * CORBA Demo::Echo::echo method implementation
- */
-static CORBA_long
-impl_pas_card_cursor_get_length (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- PASCardCursor *cursor = PAS_CARD_CURSOR (bonobo_object_from_servant (servant));
- if ( cursor->priv->get_length )
- return cursor->priv->get_length( cursor, cursor->priv->data );
- else
- return 0;
-}
-
-/*
- * CORBA Demo::Echo::echo method implementation
- */
-static char *
-impl_pas_card_cursor_get_nth (PortableServer_Servant servant,
- const CORBA_long n,
- CORBA_Environment *ev)
-{
- PASCardCursor *cursor = PAS_CARD_CURSOR (bonobo_object_from_servant (servant));
- if ( cursor->priv->get_nth ) {
- char *vcard = cursor->priv->get_nth( cursor, n, cursor->priv->data );
- char *retval = CORBA_string_dup (vcard);
- g_free (vcard);
- return retval;
- } else
- return CORBA_string_dup ("");
-}
-
-/*
- * If you want users to derive classes from your implementation
- * you need to support this method.
- */
-POA_Evolution_CardCursor__epv *
-pas_card_cursor_get_epv (void)
-{
- POA_Evolution_CardCursor__epv *epv;
-
- epv = g_new0 (POA_Evolution_CardCursor__epv, 1);
-
- /*
- * This is the method invoked by CORBA
- */
- epv->get_length = impl_pas_card_cursor_get_length;
- epv->get_nth = impl_pas_card_cursor_get_nth;
-
- return epv;
-}
-
-static void
-init_pas_card_cursor_corba_class (void)
-{
- cursor_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
- cursor_vepv.Evolution_CardCursor_epv = pas_card_cursor_get_epv ();
-}
-
-static void
-pas_card_cursor_class_init (PASCardCursorClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- parent_class = gtk_type_class (bonobo_object_get_type ());
-
- object_class->destroy = pas_card_cursor_destroy;
-
- init_pas_card_cursor_corba_class ();
-}
-
-static void
-pas_card_cursor_init (PASCardCursor *cursor)
-{
- cursor->priv = g_new(PASCardCursorPrivate, 1);
- cursor->priv->get_length = NULL;
- cursor->priv->get_nth = NULL;
- cursor->priv->data = NULL;
-}
-
-GtkType
-pas_card_cursor_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "PASCardCursor",
- sizeof (PASCardCursor),
- sizeof (PASCardCursorClass),
- (GtkClassInitFunc) pas_card_cursor_class_init,
- (GtkObjectInitFunc) pas_card_cursor_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (bonobo_object_get_type (), &info);
- }
-
- return type;
-}
-
-PASCardCursor *
-pas_card_cursor_construct (PASCardCursor *cursor,
- Evolution_CardCursor corba_cursor,
- PASCardCursorLengthFunc get_length,
- PASCardCursorNthFunc get_nth,
- gpointer data)
-{
- g_return_val_if_fail (cursor != NULL, NULL);
- g_return_val_if_fail (PAS_IS_CARD_CURSOR (cursor), NULL);
- g_return_val_if_fail (corba_cursor != CORBA_OBJECT_NIL, NULL);
-
- /*
- * Call parent constructor
- */
- if (!bonobo_object_construct (BONOBO_OBJECT (cursor), (CORBA_Object) corba_cursor))
- return NULL;
-
- /*
- * Initialize cursor
- */
- cursor->priv->get_length = get_length;
- cursor->priv->get_nth = get_nth;
- cursor->priv->data = data;
-
- /*
- * Success: return the GtkType we were given
- */
- return cursor;
-}
-
-/*
- * This routine creates the ORBit CORBA server and initializes the
- * CORBA side of things
- */
-static Evolution_CardCursor
-create_cursor (BonoboObject *cursor)
-{
- POA_Evolution_CardCursor *servant;
- CORBA_Environment ev;
-
- servant = (POA_Evolution_CardCursor *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &cursor_vepv;
-
- CORBA_exception_init (&ev);
- POA_Evolution_CardCursor__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION){
- g_free (servant);
- CORBA_exception_free (&ev);
- return CORBA_OBJECT_NIL;
- }
-
- CORBA_exception_free (&ev);
-
- /*
- * Activates the CORBA object.
- */
- return (Evolution_CardCursor) bonobo_object_activate_servant (cursor, servant);
-}
-
-PASCardCursor *
-pas_card_cursor_new (PASCardCursorLengthFunc get_length,
- PASCardCursorNthFunc get_nth,
- gpointer data)
-{
- PASCardCursor *cursor;
- Evolution_CardCursor corba_cursor;
-
- cursor = gtk_type_new (pas_card_cursor_get_type ());
- corba_cursor = create_cursor (BONOBO_OBJECT (cursor));
-
- if (corba_cursor == CORBA_OBJECT_NIL){
- gtk_object_unref (GTK_OBJECT (cursor));
- return NULL;
- }
-
- return pas_card_cursor_construct (cursor,
- corba_cursor,
- get_length,
- get_nth,
- data);
-}
diff --git a/addressbook/backend/pas/pas-card-cursor.h b/addressbook/backend/pas/pas-card-cursor.h
deleted file mode 100644
index 300e3e3ce1..0000000000
--- a/addressbook/backend/pas/pas-card-cursor.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#ifndef __PAS_CARD_CURSOR_H__
-#define __PAS_CARD_CURSOR_H__
-
-#include <libgnome/gnome-defs.h>
-#include <bonobo/bonobo-object.h>
-#include <pas/addressbook.h>
-
-BEGIN_GNOME_DECLS
-
-typedef struct _PASCardCursor PASCardCursor;
-typedef struct _PASCardCursorPrivate PASCardCursorPrivate;
-typedef struct _PASCardCursorClass PASCardCursorClass;
-
-typedef long (*PASCardCursorLengthFunc) (PASCardCursor *cursor, gpointer data);
-typedef char * (*PASCardCursorNthFunc) (PASCardCursor *cursor, long n, gpointer data);
-
-struct _PASCardCursor {
- BonoboObject parent;
- PASCardCursorPrivate *priv;
-};
-
-struct _PASCardCursorClass {
- BonoboObjectClass parent;
-};
-
-/* Creating a new addressbook. */
-PASCardCursor *pas_card_cursor_new (PASCardCursorLengthFunc get_length,
- PASCardCursorNthFunc get_nth,
- gpointer data);
-PASCardCursor *pas_card_cursor_construct (PASCardCursor *cursor,
- Evolution_CardCursor corba_cursor,
- PASCardCursorLengthFunc get_length,
- PASCardCursorNthFunc get_nth,
- gpointer data);
-
-GtkType pas_card_cursor_get_type (void);
-POA_Evolution_CardCursor__epv *
- pas_card_cursor_get_epv (void);
-
-/* Fetching cards. */
-#define PAS_CARD_CURSOR_TYPE (pas_card_cursor_get_type ())
-#define PAS_CARD_CURSOR(o) (GTK_CHECK_CAST ((o), PAS_CARD_CURSOR_TYPE, PASCardCursor))
-#define PAS_CARD_CURSOR_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_CARD_CURSOR_TYPE, PASCardCursorClass))
-#define PAS_IS_CARD_CURSOR(o) (GTK_CHECK_TYPE ((o), PAS_CARD_CURSOR_TYPE))
-#define PAS_IS_CARD_CURSOR_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_CARD_CURSOR_TYPE))
-
-END_GNOME_DECLS
-
-#endif /* ! __PAS_CARD_CURSOR_H__ */
diff --git a/addressbook/conduit/.cvsignore b/addressbook/conduit/.cvsignore
deleted file mode 100644
index 6f302c2ac7..0000000000
--- a/addressbook/conduit/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-*.lo
-Makefile.in
-Makefile
-libaddress_conduit.la
-address-conduit-control-applet
-address.conduit \ No newline at end of file
diff --git a/addressbook/conduit/Makefile.am b/addressbook/conduit/Makefile.am
deleted file mode 100644
index c45e24714d..0000000000
--- a/addressbook/conduit/Makefile.am
+++ /dev/null
@@ -1,73 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir)/addressbook \
- -I$(top_srcdir)/addressbook/backend \
- $(GNOME_PILOT_CFLAGS)
-
-bin_PROGRAMS = address-conduit-control-applet
-
-address_conduit_control_applet_SOURCES = address-conduit-control-applet.c
-
-address_conduit_control_applet_LDADD = \
- $(CAPPLET_LIBS) \
- $(GNOME_LIBDIR) \
- -lgpilotdcm \
- -lgpilotd \
- -lgpilotdconduit \
- $(GNOME_CAPPLET_LIBS) \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(GNOME_XML_LIB) \
- $(GNOMEUI_LIBS) \
- $(PISOCK_LIBDIR) $(PISOCK_LIBS) \
- $(INTLLIBS)
-
-
-# address_conduit
-address_conduitsdir=$(libdir)/gnome-pilot/conduits
-address_conduits_LTLIBRARIES = libaddress_conduit.la
-
-libaddress_conduit_la_SOURCES = \
- address-conduit.c \
- address-conduit.h
-
-# address-conduit.c: my_gnomecal_idl
-
-address.conduit: address.conduit.in Makefile
- sed -e 's^\@prefix\@^$(prefix)^g' < $(srcdir)/address.conduit.in > address.conduit.tmp \
- && mv address.conduit.tmp address.conduit
-
-#
-# conduit
-#
-
-libaddress_conduit_la_LDFLAGS = \
- -rpath $(libdir)
-
-libaddress_conduit_la_LIBADD = \
- $(top_builddir)/addressbook/backend/ebook/libebook-static.la \
- $(top_builddir)/e-util/libeutil-static.la \
- $(top_builddir)/addressbook/ename/libename-static.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/libical/src/libical/libical-static.la \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(PISOCK_LIBDIR) $(PISOCK_LIBS) \
- $(GNOME_LIBDIR) \
- $(GNOME_LIBS)
-
-ccenterdir = $(datadir)/control-center
-ccenterPalmPilotdir = $(ccenterdir)/Peripherals
-ccenterConduitsdir = $(ccenterPalmPilotdir)/Conduits
-ccenterConduits_DATA = address-conduit-control-applet.desktop
-
-panelConduitsdir = $(datadir)/gnome/apps/Settings/Peripherals/Conduits
-panelConduits_DATA = $(ccenterConduits_DATA)
-
-Conduitdir = $(datadir)/gnome-pilot/conduits/
-Conduit_DATA = address.conduit
-
-EXTRA_DIST = \
- address.conduit.in \
- $(ccenterConduits_DATA)
-
-install-data-local:
- $(mkinstalldirs) $(ccenterConduitsdir)
- $(mkinstalldirs) $(Conduitdir)
diff --git a/addressbook/conduit/address-conduit-control-applet.c b/addressbook/conduit/address-conduit-control-applet.c
deleted file mode 100644
index 07a6e0042f..0000000000
--- a/addressbook/conduit/address-conduit-control-applet.c
+++ /dev/null
@@ -1,386 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Control applet ("capplet") for the gnome-pilot address conduit, */
-/* based on */
-/* gpilotd control applet ('capplet') for use with the GNOME control center */
-
-#include <pwd.h>
-#include <sys/types.h>
-#include <signal.h>
-#include <gnome.h>
-
-#include <config.h>
-#include <capplet-widget.h>
-
-#include <libgpilotdCM/gnome-pilot-conduit-management.h>
-#include <libgpilotdCM/gnome-pilot-conduit-config.h>
-#include <gpilotd/gnome-pilot-client.h>
-
-#include "address-conduit.h"
-
-
-/* tell changes callbacks to ignore changes or not */
-static gboolean ignore_changes=FALSE;
-
-/* capplet widget */
-static GtkWidget *capplet=NULL;
-
-/* host/device/pilot configuration windows */
-GtkWidget *cfgOptionsWindow=NULL;
-GtkWidget *cfgStateWindow=NULL;
-GtkWidget *dialogWindow=NULL;
-
-gboolean activated,org_activation_state;
-GnomePilotConduitManagement *conduit;
-GnomePilotConduitConfig *conduit_config;
-AddressbookConduitCfg *origState = NULL;
-AddressbookConduitCfg *curState = NULL;
-
-static void doTrySettings(GtkWidget *widget, AddressbookConduitCfg *cfg);
-static void doRevertSettings(GtkWidget *widget, AddressbookConduitCfg *cfg);
-static void doSaveSettings(GtkWidget *widget, AddressbookConduitCfg *cfg);
-
-//static void readStateCfg (GtkWidget *w, AddressbookConduitCfg *c);
-static void setStateCfg (GtkWidget *w, AddressbookConduitCfg *c);
-
-gint pilotId;
-CORBA_Environment ev;
-static GnomePilotClient *gpc;
-
-
-/* This array must be in the same order as enumerations
- in GnomePilotConduitSyncType as they are used as index.
- Custom type implies Disabled state.
-*/
-static gchar* sync_options[] ={ N_("Disabled"),
- N_("Synchronize"),
- N_("Copy From Pilot"),
- N_("Copy To Pilot"),
- N_("Merge From Pilot"),
- N_("Merge To Pilot")};
-#define SYNC_OPTIONS_COUNT 6
-
-
-
-
-/* Saves the configuration data. */
-static void
-addressbookconduit_save_configuration(AddressbookConduitCfg *c)
-{
- gchar prefix[256];
-
- g_snprintf(prefix,255,"/gnome-pilot.d/address-conduit/Pilot_%u/",c->pilotId);
-
- gnome_config_push_prefix(prefix);
- gnome_config_set_bool ("open_secret", c->open_secret);
- gnome_config_pop_prefix();
-
- gnome_config_sync();
- gnome_config_drop_all();
-}
-
-/* Creates a duplicate of the configuration data */
-static AddressbookConduitCfg*
-gcalconduit_dupe_configuration(AddressbookConduitCfg *c) {
- AddressbookConduitCfg *retval;
- g_return_val_if_fail(c!=NULL,NULL);
- retval = g_new0(AddressbookConduitCfg,1);
- retval->sync_type = c->sync_type;
- retval->open_secret = c->open_secret;
- retval->pilotId = c->pilotId;
- return retval;
-}
-
-
-static void
-doTrySettings(GtkWidget *widget, AddressbookConduitCfg *c)
-{
- /*
- readStateCfg (cfgStateWindow, curState);
- if (activated)
- gnome_pilot_conduit_config_enable (conduit_config, GnomePilotConduitSyncTypeCustom);
- else
- gnome_pilot_conduit_config_disable (conduit_config);
- */
-
- if (c->sync_type!=GnomePilotConduitSyncTypeCustom)
- gnome_pilot_conduit_config_enable_with_first_sync (conduit_config,
- c->sync_type,
- c->sync_type,
- TRUE);
- else
- gnome_pilot_conduit_config_disable (conduit_config);
-
- addressbookconduit_save_configuration (c);
-}
-
-
-static void
-doSaveSettings(GtkWidget *widget, AddressbookConduitCfg *cfg)
-{
- doTrySettings(widget, cfg);
- addressbookconduit_save_configuration(cfg);
-}
-
-
-static void
-doCancelSettings(GtkWidget *widget, AddressbookConduitCfg *c)
-{
- doSaveSettings (widget, c);
-}
-
-
-static void
-doRevertSettings(GtkWidget *widget, AddressbookConduitCfg *cfg)
-{
- activated = org_activation_state;
- setStateCfg (cfgStateWindow, curState);
-}
-
-static void
-about_cb (GtkWidget *widget, gpointer data)
-{
- GtkWidget *about;
- const gchar *authors[] = {_("Eskil Heyn Olsen <deity@eskil.dk>"),NULL};
-
- about = gnome_about_new (_("Gpilotd address conduit"), VERSION,
- _("(C) 1998 the Free Software Foundation"),
- authors,
- _("Configuration utility for the address conduit.\n"),
- _("gnome-unknown.xpm"));
- gtk_widget_show (about);
-
- return;
-}
-
-
-/* called by the sync_type GtkOptionMenu */
-static void
-sync_action_selection(GtkMenuShell *widget, gpointer unused)
-{
- if (!ignore_changes) {
- capplet_widget_state_changed(CAPPLET_WIDGET (capplet), TRUE);
- }
-}
-
-
-/* called by the sync_type GtkOptionMenu */
-static void
-activate_sync_type(GtkMenuItem *widget, gpointer data)
-{
- curState->sync_type = GPOINTER_TO_INT(data);
- if(!ignore_changes)
- capplet_widget_state_changed(CAPPLET_WIDGET(capplet), TRUE);
-}
-
-
-static GtkWidget
-*createStateCfgWindow(void)
-{
- GtkWidget *vbox, *table;
- GtkWidget *label;
- GtkWidget *optionMenu,*menuItem;
- GtkMenu *menu;
- gint i;
-
- vbox = gtk_vbox_new(FALSE, GNOME_PAD);
-
- table = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, GNOME_PAD);
-
- label = gtk_label_new(_("Synchronize Action"));
- gtk_box_pack_start(GTK_BOX(table), label, FALSE, FALSE, GNOME_PAD);
-
- optionMenu=gtk_option_menu_new();
- gtk_object_set_data(GTK_OBJECT(vbox), "conduit_state", optionMenu);
- menu = GTK_MENU(gtk_menu_new());
-
- for (i=0; i<SYNC_OPTIONS_COUNT;i++) {
- sync_options[i]=_(sync_options[i]);
- menuItem = gtk_menu_item_new_with_label(sync_options[i]);
- gtk_widget_show(menuItem);
- gtk_signal_connect(GTK_OBJECT(menuItem),"activate",
- GTK_SIGNAL_FUNC(activate_sync_type),
- GINT_TO_POINTER(i));
- gtk_menu_append(menu,menuItem);
- }
-
- gtk_option_menu_set_menu(GTK_OPTION_MENU(optionMenu),GTK_WIDGET(menu));
- gtk_signal_connect(GTK_OBJECT(menu), "selection-done",
- GTK_SIGNAL_FUNC(sync_action_selection),
- NULL);
-
- gtk_box_pack_start(GTK_BOX(table), optionMenu, FALSE, FALSE, 0);
-
- return vbox;
-}
-
-
-static void
-setStateCfg (GtkWidget *w, AddressbookConduitCfg *c)
-{
- GtkOptionMenu *optionMenu;
- GtkMenu *menu;
-
- optionMenu = gtk_object_get_data (GTK_OBJECT(w), "conduit_state");
- g_assert (optionMenu != NULL);
- menu = GTK_MENU (gtk_option_menu_get_menu (optionMenu));
-
- ignore_changes = TRUE;
- /* Here were are relying on the items in menu being the same
- order as in GnomePilotConduitSyncType. */
- gtk_option_menu_set_history (optionMenu, (int) c->sync_type);
- ignore_changes = FALSE;
-}
-
-
-#if 0
-static void
-readStateCfg (GtkWidget *w, AddressbookConduitCfg *c)
-{
- /*
- GtkWidget *button;
- button = gtk_object_get_data(GTK_OBJECT(cfg), "conduit_on_off");
- g_assert(button!=NULL);
- activated = GTK_TOGGLE_BUTTON(button)->active;
- */
-}
-#endif /* 0 */
-
-
-static void
-pilot_capplet_setup(void)
-{
- GtkWidget *frame, *table;
-
- capplet = capplet_widget_new();
-
- table = gtk_table_new(1, 2, FALSE);
- gtk_container_border_width(GTK_CONTAINER(table), GNOME_PAD);
- gtk_container_add(GTK_CONTAINER(capplet), table);
-
- frame = gtk_frame_new(_("Conduit state"));
- gtk_container_border_width(GTK_CONTAINER(frame), GNOME_PAD_SMALL);
- gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 1, 0, 1);
- cfgStateWindow = createStateCfgWindow();
- gtk_container_add(GTK_CONTAINER(frame), cfgStateWindow);
-
- gtk_signal_connect(GTK_OBJECT(capplet), "try",
- GTK_SIGNAL_FUNC(doTrySettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "revert",
- GTK_SIGNAL_FUNC(doRevertSettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "ok",
- GTK_SIGNAL_FUNC(doSaveSettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "cancel",
- GTK_SIGNAL_FUNC(doCancelSettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "help",
- GTK_SIGNAL_FUNC(about_cb), NULL);
-
-
- setStateCfg (cfgStateWindow, curState);
-
- gtk_widget_show_all (capplet);
-}
-
-
-static void
-run_error_dialog(gchar *mesg,...)
-{
- char tmp[80];
- va_list ap;
-
- va_start(ap,mesg);
- vsnprintf(tmp,79,mesg,ap);
- dialogWindow = gnome_message_box_new(mesg,GNOME_MESSAGE_BOX_ERROR,GNOME_STOCK_BUTTON_OK,NULL);
- gnome_dialog_run_and_close(GNOME_DIALOG(dialogWindow));
- va_end(ap);
-}
-
-
-static gint
-get_pilot_id_from_gpilotd()
-{
- GList *pilots=NULL;
- gint pilot;
- int i,err;
-
- i=0;
- /* we don't worry about leaking here, so pilots isn't freed */
- switch(err = gnome_pilot_client_get_pilots(gpc,&pilots)) {
- case GPILOTD_OK: {
- if(pilots) {
- for(i=0;i<g_list_length(pilots);i++) {
- g_message("pilot %d = \"%s\"",i,(gchar*)g_list_nth(pilots,i)->data);
- }
- if(i==0) {
- run_error_dialog(_("No pilot configured, please choose the\n'Pilot Link Properties' capplet first."));
- return -1;
- } else {
- gnome_pilot_client_get_pilot_id_by_name(gpc,
- pilots->data, /* this is the first pilot */
- &pilot);
- if(i>1) {
- g_message("too many pilots...");
- /* need a choose here */
- }
- return pilot;
- }
- } else {
- run_error_dialog(_("No pilot configured, please choose the\n'Pilot Link Properties' capplet first."));
- return -1;
- }
- break;
- }
- case GPILOTD_ERR_NOT_CONNECTED:
- run_error_dialog(_("Not connected to the gnome-pilot daemon"));
- return -1;
- break;
- default:
- g_warning("gnome_pilot_client_get_pilot_ids(...) = %d",err);
- run_error_dialog(_("An error occured when trying to fetch\npilot list from the gnome-pilot daemon"));
- return -1;
- break;
- }
-}
-
-
-int
-main (int argc, char *argv[])
-{
- g_log_set_always_fatal (G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL |
- G_LOG_LEVEL_WARNING);
-
- /* we're a capplet */
- gnome_capplet_init ("address conduit control applet", NULL, argc, argv,
- NULL, 0, NULL);
-
-
- gpc = gnome_pilot_client_new();
- gnome_pilot_client_connect_to_daemon(gpc);
- pilotId = get_pilot_id_from_gpilotd();
- if(!pilotId) return -1;
-
- /* put all code to set things up in here */
- conduit_load_configuration (&origState, pilotId);
-
- conduit = gnome_pilot_conduit_management_new ("address_conduit", GNOME_PILOT_CONDUIT_MGMT_ID);
- if (conduit == NULL) return -1;
- conduit_config = gnome_pilot_conduit_config_new (conduit, pilotId);
- org_activation_state = gnome_pilot_conduit_config_is_enabled (conduit_config,
- &origState->sync_type);
- activated = org_activation_state;
-
- //gpilotd_conduit_mgmt_get_sync_type (conduit, pilotId, &origState->sync_type);
-
- curState = gcalconduit_dupe_configuration(origState);
-
- pilot_capplet_setup ();
-
-
- /* done setting up, now run main loop */
- capplet_gtk_main();
-
- gnome_pilot_conduit_management_destroy(conduit);
-
- return 0;
-}
diff --git a/addressbook/conduit/address-conduit-control-applet.desktop b/addressbook/conduit/address-conduit-control-applet.desktop
deleted file mode 100644
index a11a782844..0000000000
--- a/addressbook/conduit/address-conduit-control-applet.desktop
+++ /dev/null
@@ -1,12 +0,0 @@
-[Desktop Entry]
-Name=Address conduit
-Name[da]=Udstående
-Name[no]=Oppgaver
-Name[tr]=Adres parçasý
-Comment=Configure the address conduit
-Comment[da]=Konfigurér Udstående
-Comment[no]=Konfigurér oppgavelisten
-Comment[tr]=Adres parçasýnýn ayarlarý
-Exec=address-conduit-control-applet --cap-id=1
-Terminal=0
-Type=Application
diff --git a/addressbook/conduit/address-conduit.c b/addressbook/conduit/address-conduit.c
deleted file mode 100644
index d863d22af4..0000000000
--- a/addressbook/conduit/address-conduit.c
+++ /dev/null
@@ -1,1274 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <config.h>
-#include <sys/stat.h>
-#include <utime.h>
-#include <unistd.h>
-#include <pwd.h>
-#include <signal.h>
-#include <errno.h>
-
-#include <pi-source.h>
-#include <pi-socket.h>
-#include <pi-file.h>
-#include <pi-dlp.h>
-#include <libgnorba/gnorba.h>
-#include <libgnorba/gnome-factory.h>
-#include <pi-version.h>
-#include <gpilotd/gnome-pilot-conduit.h>
-#include <gpilotd/gnome-pilot-conduit-standard-abs.h>
-#include <address-conduit.h>
-#include "ebook/e-book-types.h"
-
-#include <bonobo.h>
-
-GnomePilotConduit * conduit_get_gpilot_conduit (guint32);
-void conduit_destroy_gpilot_conduit (GnomePilotConduit*);
-void local_record_from_ecard (AddressbookLocalRecord *local, ECard *ecard);
-
-#define CONDUIT_VERSION "0.1"
-#ifdef G_LOG_DOMAIN
-#undef G_LOG_DOMAIN
-#endif
-#define G_LOG_DOMAIN "addressconduit"
-
-/* #define SUPPORT_ARCHIVING 1 */
-#define NEED_OAF_INIT_HACK 1
-#define DEBUG_ADDRESSBOOKCONDUIT 1
-
-#ifdef DEBUG_ADDRESSBOOKCONDUIT
-#define show_exception(e) g_warning ("Exception: %s\n", CORBA_exception_id (e))
-#define LOG(e...) g_log(G_LOG_DOMAIN,G_LOG_LEVEL_MESSAGE, e)
-#else
-#define show_exception(e)
-#define LOG(e...)
-#endif
-
-#define WARN(e...) g_log(G_LOG_DOMAIN,G_LOG_LEVEL_WARNING, e)
-#define INFO(e...) g_log(G_LOG_DOMAIN,G_LOG_LEVEL_MESSAGE, e)
-
-#define catch_ret_val(_env,ret) \
- if (_env._major != CORBA_NO_EXCEPTION) { \
- g_log(G_LOG_DOMAIN,G_LOG_LEVEL_MESSAGE,"%s:%d: Caught exception",__FILE__,__LINE__); \
- g_warning ("Exception: %s\n", CORBA_exception_id (&(_env))); \
- CORBA_exception_free(&(_env)); \
- return ret; \
- }
-
-
-static void
-status_cb (EBook *ebook, EBookStatus status, gpointer closure)
-{
- (*(EBookStatus*)closure) = status;
- gtk_main_quit();
-}
-
-
-/* Destroys any data allocated by gcalconduit_load_configuration
- and deallocates the given configuration. */
-static void
-conduit_destroy_configuration(AddressbookConduitCfg **c)
-{
- g_return_if_fail(c!=NULL);
- g_return_if_fail(*c!=NULL);
- //g_free(*c); FIX ME
- *c = NULL;
-}
-
-
-/* Given a AddressbookConduitContext**, allocates the structure */
-static void
-conduit_new_context(AddressbookConduitContext **ctxt,
- AddressbookConduitCfg *c)
-{
- *ctxt = g_new0(AddressbookConduitContext,1);
- g_assert(ctxt!=NULL);
- (*ctxt)->cfg = c;
- CORBA_exception_init (&((*ctxt)->ev));
-}
-
-
-/* Destroys any data allocated by conduit_new_context
- and deallocates its data. */
-static void
-conduit_destroy_context(AddressbookConduitContext **ctxt)
-{
- g_return_if_fail(ctxt!=NULL);
- g_return_if_fail(*ctxt!=NULL);
-
- if ((*ctxt)->cfg!=NULL)
- conduit_destroy_configuration(&((*ctxt)->cfg));
-
- g_free(*ctxt);
- *ctxt = NULL;
-}
-
-
-static void
-cursor_cb (EBook *book, EBookStatus status, ECardCursor *cursor, gpointer closure)
-{
- AddressbookConduitContext *ctxt = (AddressbookConduitContext*)closure;
-
- if (status == E_BOOK_STATUS_SUCCESS) {
- long length;
- int i;
-
- // ctxt->cursor = cursor;
- ctxt->address_load_success = TRUE;
-
- length = e_card_cursor_get_length (cursor);
- ctxt->cards = NULL;
- for (i = 0; i < length; i ++)
- ctxt->cards = g_list_append (ctxt->cards, e_card_cursor_get_nth (cursor, i));
-
- gtk_main_quit(); /* end the sub event loop */
- }
- else {
- WARN (_("BLARG\n"));
- gtk_main_quit(); /* end the sub event loop */
- }
-}
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- AddressbookConduitContext *ctxt = (AddressbookConduitContext*)closure;
-
- if (status == E_BOOK_STATUS_SUCCESS) {
- e_book_get_cursor (book, "(contains \"full_name\" \"\")", cursor_cb, ctxt);
- }
- else {
- WARN (_("BLARG\n"));
- gtk_main_quit(); /* end the sub event loop */
- }
-}
-
-static int
-start_address_server (GnomePilotConduitStandardAbs *conduit,
- AddressbookConduitContext *ctxt)
-{
- gchar *uri, *path;
-
- g_return_val_if_fail(conduit!=NULL,-2);
- g_return_val_if_fail(ctxt!=NULL,-2);
-
- ctxt->ebook = e_book_new ();
-
- path = g_concat_dir_and_file (g_get_home_dir (),
- "evolution/local/Contacts/addressbook.db");
- uri = g_strdup_printf ("file://%s", path);
- g_free (path);
-
- e_book_load_uri (ctxt->ebook, uri, book_open_cb, ctxt);
-
- /* run a sub event loop to turn ebook's async loading into a
- synchronous call */
- gtk_main ();
-
- g_free (uri);
-
- if (ctxt->address_load_success)
- return 0;
-
- return -1;
-}
-
-/*
- * converts a ECard to a AddressbookLocalRecord
- */
-void
-local_record_from_ecard(AddressbookLocalRecord *local,
- ECard *ecard)
-{
- guint32 current_status;
-
- g_return_if_fail(local!=NULL);
- g_return_if_fail(ecard!=NULL);
-
- local->ecard = ecard;
- local->local.ID = local->ecard->pilot_id;
-
- gtk_object_get (GTK_OBJECT(ecard),
- "pilot_status", &current_status, NULL);
-
- switch(current_status) {
- case E_CARD_PILOT_STATUS_NONE:
- local->local.attr = GnomePilotRecordNothing;
- break;
- case E_CARD_PILOT_STATUS_MOD:
- local->local.attr = GnomePilotRecordModified;
- break;
- case E_CARD_PILOT_STATUS_DEL:
- local->local.attr = GnomePilotRecordDeleted;
- break;
- }
-
- /* Records without a pilot_id are new */
- if(local->local.ID == 0)
- local->local.attr = GnomePilotRecordNew;
-
- local->local.secret = 0;
-#if 0
- if(obj->class!=NULL)
- if(strcmp(obj->class,"PRIVATE")==0)
- local->local.secret = 1;
-#endif
-
- local->local.archived = 0;
-}
-
-static ECard *
-get_ecard_by_pilot_id (GList *card_list, recordid_t id)
-{
- GList *l;
-
- for (l = card_list; l; l = l->next) {
- guint32 pilot_id;
- ECard *card = l->data;
-
- if (!card)
- continue;
-
- gtk_object_get (GTK_OBJECT(card),
- "pilot_id", &pilot_id, NULL);
-
- if (pilot_id == id)
- return card;
- }
-
- return NULL;
-}
-
-/*
- * Given a PilotRecord, find the matching record in
- * the addressbook. If no match, return NULL
- */
-static AddressbookLocalRecord *
-find_record_in_ebook(GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- AddressbookConduitContext *ctxt)
-{
- AddressbookLocalRecord *loc;
- ECard *ecard;
-
- g_return_val_if_fail(conduit!=NULL,NULL);
- g_return_val_if_fail(remote!=NULL,NULL);
-
- LOG ("requesting %ld", remote->ID);
-
- ecard = get_ecard_by_pilot_id (ctxt->cards, remote->ID);
-
- if (NULL != ecard) {
- LOG ("Found");
- loc = g_new0(AddressbookLocalRecord,1);
- /* memory allocated in new_from_string is freed in free_match */
- local_record_from_ecard (loc, ecard);
- return loc;
- }
-
- INFO ("Object did not exist");
- return NULL;
-}
-
-static ECard *
-ecard_from_remote_record(AddressbookConduitContext *ctxt,
- PilotRecord *remote)
-{
- struct Address address;
- ECard *ecard;
- ECardSimple *simple;
- int i;
- char *string;
- char *stringparts[4];
- char *commaparts[3];
- char *spaceparts[3];
- char *commastring, *spacestring;
-
- g_return_val_if_fail(remote!=NULL,NULL);
- memset (&address, 0, sizeof (struct Address));
- unpack_Address (&address, remote->record, remote->length);
-
-
- ecard = e_card_new("");
- simple = e_card_simple_new(ecard);
-
-#define get(pilotprop) \
- (address.entry [(pilotprop)])
-#define check(pilotprop) \
- (address.entry [(pilotprop)] && *address.entry [(pilotprop)])
-
- i = 0;
- if (check(entryFirstname))
- stringparts[i++] = get(entryFirstname);
- if (check(entryLastname))
- stringparts[i++] = get(entryLastname);
- stringparts[i] = NULL;
- string = g_strjoinv(" ", stringparts);
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_FULL_NAME, string);
- g_free(string);
-
- i = 0;
- if (check (entryAddress))
- spaceparts[i++] = get (entryAddress);
- if (check (entryZip))
- spaceparts[i++] = get (entryZip);
- spaceparts[i] = 0;
- spacestring = g_strjoinv(" ", spaceparts);
-
- i = 0;
- if (check (entryCity))
- commaparts[i++] = get (entryCity);
- if (spacestring && *spacestring)
- commaparts[i++] = spacestring;
- commaparts[i] = 0;
- commastring = g_strjoinv(", ", commaparts);
-
- i = 0;
- if (check (entryAddress))
- stringparts[i++] = get (entryAddress);
- if (commastring && *commastring)
- stringparts[i++] = commastring;
- if (check (entryCountry))
- stringparts[i++] = get (entryCountry);
- stringparts[i] = NULL;
- string = g_strjoinv("\n", stringparts);
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_ADDRESS_HOME, string);
-
- g_free(spacestring);
- g_free(commastring);
- g_free(string);
-
- if (check (entryTitle))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_TITLE, get (entryTitle));
-
- if (check (entryCompany))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_ORG, get (entryCompany));
-
- for (i = entryPhone1; i <= entryPhone5; i ++) {
- if (address.entry [i] && *(address.entry [i])) {
- char *phonelabel = ctxt->ai.phoneLabels[address.phoneLabel[i - entryPhone1]];
- if (!strcmp (phonelabel, "E-mail"))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_EMAIL, address.entry[i]);
- else if (!strcmp (phonelabel, "Home"))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_HOME, address.entry[i]);
- else if (!strcmp (phonelabel, "Work"))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS, address.entry[i]);
- else if (!strcmp (phonelabel, "Fax"))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX, address.entry[i]);
- else if (!strcmp (phonelabel, "Other"))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_OTHER, address.entry[i]);
- else if (!strcmp (phonelabel, "Main"))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_PRIMARY, address.entry[i]);
- else if (!strcmp (phonelabel, "Pager"))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_PAGER, address.entry[i]);
- else if (!strcmp (phonelabel, "Mobile"))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_MOBILE, address.entry[i]);
- }
- }
-#undef get
-#undef set
-
- free_Address(&address);
-
- gtk_object_set (GTK_OBJECT(ecard), "pilot_id", remote->ID, NULL);
-
- gtk_object_unref(GTK_OBJECT(simple));
-
- return ecard;
-}
-
-static ECard*
-merge_ecard_with_remote_record (AddressbookConduitContext *ctxt,
- ECard *ecard,
- PilotRecord *remote)
-{
- return ecard;
-}
-
-typedef struct {
- EBookStatus status;
- char *id;
-} add_card_cons;
-
-static void
-add_card_cb (EBook *ebook, EBookStatus status, const char *id, gpointer closure)
-{
- add_card_cons *cons = (add_card_cons*)closure;
-
- cons->status = status;
- cons->id = g_strdup (id);
-
- gtk_main_quit();
-}
-
-static gint
-update_record (GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- AddressbookConduitContext *ctxt)
-{
- struct Address address;
- ECard *ecard;
- add_card_cons cons;
-
- g_return_val_if_fail(remote!=NULL,-1);
-
- memset (&address, 0, sizeof (struct Address));
- unpack_Address (&address, remote->record, remote->length);
-
- LOG ("requesting %ld [%s %s]", remote->ID, address.entry[entryFirstname], address.entry[entryLastname]);
- printf ("requesting %ld [%s %s]\n", remote->ID, address.entry[entryFirstname], address.entry[entryLastname]);
-
- ecard = get_ecard_by_pilot_id (ctxt->cards, remote->ID);
-
- if (ecard == NULL) {
-
- LOG ("Object did not exist, creating a new one");
- printf ("Object did not exist, creating a new one\n");
-
- ecard = ecard_from_remote_record (ctxt, remote);
-
- /* add the ecard to the server */
- e_book_add_card (ctxt->ebook, ecard, add_card_cb, &cons);
-
- gtk_main(); /* enter sub mainloop */
-
- if (cons.status == E_BOOK_STATUS_SUCCESS) {
- ctxt->cards = g_list_append (ctxt->cards,
- e_book_get_card (ctxt->ebook, cons.id));
- g_free (cons.id);
- }
- else
- WARN ("update_record: failed to add card to ebook\n");
- } else {
- EBookStatus commit_status;
-
- ecard = merge_ecard_with_remote_record (ctxt, ecard, remote);
-
- e_book_commit_card (ctxt->ebook, ecard, status_cb, &commit_status);
-
- gtk_main (); /* enter sub mainloop */
-
- if (commit_status != E_BOOK_STATUS_SUCCESS)
- WARN ("update_record: failed to update card in ebook\n");
- }
-
- free_Address(&address);
-
- return 0;
-}
-
-#if 0
-static void
-check_for_slow_setting (GnomePilotConduit *c, AddressbookConduitContext *ctxt)
-{
- GList *uids;
- unsigned long int entry_number;
-
- uids = cal_client_get_uids (ctxt->client, CALOBJ_TYPE_ADDRESS);
-
- entry_number = g_list_length (uids);
-
- LOG (_("Address holds %ld address entries"), entry_number);
- /* If the local base is empty, do a slow sync */
- if (entry_number == 0) {
- GnomePilotConduitStandard *conduit;
- conduit = GNOME_PILOT_CONDUIT_STANDARD (c);
- gnome_pilot_conduit_standard_set_slow (conduit);
- }
-}
-#endif /* 0 */
-
-static gint
-pre_sync (GnomePilotConduit *c,
- GnomePilotDBInfo *dbi,
- AddressbookConduitContext *ctxt)
-{
- int l;
- unsigned char *buf;
- GnomePilotConduitStandardAbs *conduit;
-
- conduit = GNOME_PILOT_CONDUIT_STANDARD_ABS(c);
-
- g_message ("Evolution Addressbook Conduit v.%s",CONDUIT_VERSION);
-
- ctxt->ebook = NULL;
-
- if (start_address_server (GNOME_PILOT_CONDUIT_STANDARD_ABS(c), ctxt) != 0) {
- WARN(_("Could not start addressbook server"));
- gnome_pilot_conduit_error(GNOME_PILOT_CONDUIT(c),
- _("Could not start addressbook server"));
- return -1;
- }
-
-
- /* Set the counters for the progress bar crap */
-
- gtk_object_set_data (GTK_OBJECT(c),"dbinfo",dbi);
-
- /* load_records(c); */
-
- buf = (unsigned char*)g_malloc(0xffff);
- if((l=dlp_ReadAppBlock(dbi->pilot_socket,dbi->db_handle,0,(unsigned char *)buf,0xffff)) < 0) {
- WARN(_("Could not read pilot's Address application block"));
- WARN("dlp_ReadAppBlock(...) = %d",l);
- gnome_pilot_conduit_error(GNOME_PILOT_CONDUIT(c),
- _("Could not read pilot's Address application block"));
- return -1;
- }
- unpack_AddressAppInfo(&(ctxt->ai),buf,l);
- g_free(buf);
-
-#if 0
- check_for_slow_setting(c,ctxt);
-#else
- /* for now just always use the slow sync method */
- gnome_pilot_conduit_standard_set_slow (GNOME_PILOT_CONDUIT_STANDARD (c));
-#endif
-
- return 0;
-}
-
-/**
- * Find (if possible) the local record which matches
- * the given PilotRecord.
- * if successfull, return non-zero and set *local to
- * a non-null value (the located local record),
- * otherwise return 0 and set *local = NULL;
- */
-
-static gint
-match_record (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord **local,
- PilotRecord *remote,
- AddressbookConduitContext *ctxt)
-{
- LOG ("in match_record");
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(remote!=NULL,-1);
-
- *local = find_record_in_ebook(conduit,remote,ctxt);
-
- if (*local==NULL) return -1;
- return 0;
-}
-
-/**
- * Free the data allocated by a previous match_record call.
- * If successfull, return non-zero and ser *local=NULL, otherwise
- * return 0.
- */
-static gint
-free_match (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord **local,
- AddressbookConduitContext *ctxt)
-{
- LOG ("entering free_match");
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(*local!=NULL,-1);
-
- g_free(*local);
-
- *local = NULL;
- return 0;
-}
-
-#if SUPPORT_ARCHIVING
-/*
- Move to archive and set status to Nothing
- */
-static gint
-archive_local (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord *local,
- AddressbookConduitContext *ctxt)
-{
- LOG ("entering archive_local");
-
- g_return_val_if_fail(local!=NULL,-1);
-
- return -1;
-}
-
-/*
-** used when copying information from the pilot to the desktop. if
-** the archived flag is set to true in the PilotRecord, this method is
-** called.
-**
-** Store in archive and set status to Nothing
-*/
-static gint
-archive_remote (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord *local,
- PilotRecord *remote,
- AddressbookConduitContext *ctxt)
-{
- LOG ("entering archive_remote");
-
- //g_return_val_if_fail(remote!=NULL,-1);
- //g_return_val_if_fail(local!=NULL,-1);
-
- return -1;
-}
-
-/*
-** Called when copying records to the pilot.
-**
-** XXX more here.
-*/
-static gint
-clear_status_archive_local (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord *local,
- AddressbookConduitContext *ctxt)
-{
- LOG ("entering clear_status_archive_local");
-
- g_return_val_if_fail(local!=NULL,-1);
-
- return -1;
-}
-
-/*
-** presumably used to set the archived flag on a local record. not
-** actually used in the gnome-pilot source.
-*/
-static gint
-set_archived (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord *local,
- gint archived,
- AddressbookConduitContext *ctxt)
-{
- LOG ("entering set_archived");
-
- g_return_val_if_fail(local!=NULL,-1);
- g_assert(local->ecard!=NULL);
-
- local->local.archived = archived;
- update_address_entry_in_repository (conduit, local->ical, ctxt);
- return 0;
-}
-
-#endif
-
-/*
-** used when copying information from the pilot to the desktop. if
-** the archived flags and deleted flags are not set to true in the
-** PilotRecord, this method is called.
-**
-** Store and set status to Nothing
-*/
-static gint
-store_remote (GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- AddressbookConduitContext *ctxt)
-{
- LOG ("entering store_remote");
-
- g_return_val_if_fail(remote!=NULL,-1);
- remote->attr = GnomePilotRecordNothing;
-
- return update_record(conduit,remote,ctxt);
-}
-
-/*
-** Used when looping over records on the local side of things.
-** function should maintain state such that *local moves along the
-** list of records.
-**
-** return value is 0 if we're done, 1 to continue iterating, and -1 on
-** error.
-*/
-static gint
-iterate (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord **local,
- AddressbookConduitContext *ctxt)
-{
- static GList *iterator;
- static int num;
-
- g_return_val_if_fail(local!=NULL,-1);
-
- if (*local==NULL) {
- LOG ("beginning iteration");
-
- iterator = ctxt->cards;
- num = 0;
-
- LOG ("iterating over %d records", g_list_length (ctxt->cards));
- *local = g_new0(AddressbookLocalRecord, 1);
- local_record_from_ecard (*local, (ECard*)iterator->data);
- } else {
- /* printf ("continuing iteration\n"); */
- num++;
- if(g_list_next(iterator)==NULL) {
- LOG ("ending");
- /** free stuff allocated for iteration */
- g_free((*local));
-
- LOG ("iterated over %d records", num);
-
- /* ends iteration */
- (*local) = NULL;
- return 0;
- } else {
- iterator = g_list_next (iterator);
- local_record_from_ecard (*local,(ECard*)(iterator->data));
- }
- }
- return 1;
-}
-
-
-/*
-** similar to iterate, except the list of records we iterate over have
-** to have FLAG set and ARCHIVE should match the state of the local
-** record.
-**
-** return value is 0 if we're done, 1 to continue iterating, and -1 on
-** error.
-*/
-static gint
-iterate_specific (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord **local,
- gint flag,
- gint archived,
- AddressbookConduitContext *ctxt)
-{
-#ifdef DEBUG_ADDRESSBOOKCONDUIT
- {
- gchar *tmp;
- switch (flag) {
- case GnomePilotRecordNothing: tmp = g_strdup("RecordNothing"); break;
- case GnomePilotRecordModified: tmp = g_strdup("RecordModified"); break;
- case GnomePilotRecordDeleted: tmp = g_strdup("RecordDeleted"); break;
- case GnomePilotRecordNew: tmp = g_strdup("RecordNew"); break;
- default: tmp = g_strdup_printf("0x%x",flag); break;
- }
- printf ("entering iterate_specific(flag = %s)\n", tmp);
- g_free(tmp);
- }
-#endif
- g_return_val_if_fail(local!=NULL,-1);
-
- /* iterate until a record meets the criteria */
- while(gnome_pilot_conduit_standard_abs_iterate(conduit,(LocalRecord**)local)) {
- if((*local)==NULL) break;
-#if SUPPORT_ARCHIVING
- if(archived && ((*local)->local.archived==archived)) break;
-#endif
- if(((*local)->local.attr == flag)) break;
- }
-
- return (*local)==NULL?0:1;
-}
-
-/*
-** actually remove the records flagged as deleted from the local
-** store.
-**
-** XXX return value isn't checked by gnome-pilot source.
-*/
-static gint
-purge (GnomePilotConduitStandardAbs *conduit,
- AddressbookConduitContext *ctxt)
-{
- GList *it;
- gint retval = 0;
-
- for (it=ctxt->cards; it;) {
- guint32 current_status;
-
- gtk_object_get (GTK_OBJECT (it->data), "pilot_status",
- &current_status, NULL);
-
- if (current_status == E_CARD_PILOT_STATUS_DEL) {
- EBookStatus remove_status;
-
- e_book_remove_card (ctxt->ebook, it->data, status_cb, &remove_status);
- gtk_main(); /* enter sub loop */
-
- if (remove_status == E_BOOK_STATUS_SUCCESS) {
- GList *l = it;
- it = g_list_next (it);
- gtk_object_unref (GTK_OBJECT (it->data));
- ctxt->cards = g_list_remove_link(ctxt->cards, l);
- g_list_free_1 (l);
- }
- else {
- retval = -1;
- it = g_list_next (it);
- }
- }
- else
- it = g_list_next (it);
- }
-
- return retval;
-}
-
-
-/*
-** sets the value of the status flag on the local record (deleted,
-** nothing, modified, etc.)
-**
-** XXX return value not checked by gnome-pilot source.
-*/
-static gint
-set_status (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord *local,
- gint status,
- AddressbookConduitContext *ctxt)
-{
- EBookStatus commit_status;
- guint32 ecard_status;
-
- LOG ("entering set_status(status=%d)",status);
-
- g_return_val_if_fail(local!=NULL,-1);
- g_assert(local->ecard!=NULL);
-
- local->local.attr = status;
- switch(status) {
- case GnomePilotRecordDeleted:
- ecard_status = E_CARD_PILOT_STATUS_DEL;
- break;
- case GnomePilotRecordNew:
- case GnomePilotRecordModified:
- ecard_status = E_CARD_PILOT_STATUS_MOD;
- break;
- default:
- ecard_status = E_CARD_PILOT_STATUS_NONE;
- break;
- }
-
- gtk_object_set (GTK_OBJECT (local->ecard),
- "pilot_status", ecard_status, NULL);
-
- e_book_commit_card (ctxt->ebook, local->ecard, status_cb,
- &commit_status);
-
- gtk_main (); /* enter sub loop */
-
- if (commit_status != E_BOOK_STATUS_SUCCESS) {
- WARN (_("Error while communicating with address server"));
- }
-
- return 0;
-}
-
-/*
-** used when writing a record to the pilot. the id is the one
-** assigned to the remote record. storing it in the local record
-** makes it easier to match up local and remote records later on.
-**
-** this should not change the state of the local entry to modified.
-**
-** XXX return value not checked by gnome-pilot source.
-*/
-static gint
-set_pilot_id (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord *local,
- guint32 ID,
- AddressbookConduitContext *ctxt)
-{
- EBookStatus commit_status;
-
- LOG ("entering set_pilot_id(id=%d)",ID);
-
- g_return_val_if_fail(local!=NULL,-1);
- g_assert(local->ecard!=NULL);
-
- local->local.ID = ID;
-
- gtk_object_set (GTK_OBJECT(local->ecard),
- "pilot_id", local->local.ID, NULL);
- e_book_commit_card (ctxt->ebook, local->ecard, status_cb, &commit_status);
-
- gtk_main (); /* enter sub loop */
-
- if (commit_status == E_BOOK_STATUS_SUCCESS) {
- return 0;
- }
- else {
- WARN ("set_pilot_id failed.\n");
- return -1;
- }
-}
-
-static int
-get_phone_label_by_name (struct AddressAppInfo *ai,
- const char *name)
-{
- int i;
-
- for (i = 0; i < 8 /* the number of pilot address labels */; i ++) {
- if (!strcmp(name, ai->phoneLabels[i]))
- return i;
- }
-
- WARN ("couldn't find pilot label '%s'.\n", name);
- return 0;
-}
-
-static int
-get_phone_label_by_flag (struct AddressAppInfo *ai,
- int flags)
-{
- char *label_to_find;
-
- if (flags & E_CARD_PHONE_PREF) label_to_find = "Main";
- else if (flags & E_CARD_PHONE_WORK) label_to_find = "Work";
- else if (flags & E_CARD_PHONE_HOME) label_to_find = "Home";
- else if (flags & E_CARD_PHONE_FAX) label_to_find = "Fax";
- else if (flags & E_CARD_PHONE_PAGER) label_to_find = "Pager";
- else if (flags & E_CARD_PHONE_CELL) label_to_find = "Mobile";
- else label_to_find = "Other";
-
- return get_phone_label_by_name (ai, label_to_find);
-}
-
-/*
-** used to convert between a local record and a remote record. memory
-** allocated during this process should be freed in free_transmit
-** below.
-**
-** XXX return value not checked by gnome-pilot source, but setting
-** *remote to NULL triggers an error.
-*/
-static gint
-transmit (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord *local,
- PilotRecord **remote,
- AddressbookConduitContext *ctxt)
-{
- PilotRecord *p;
- ECardName *ecard_name;
- EList *ecard_phones;
- EList *ecard_emails;
- char *ecard_org, *ecard_note, *ecard_title;
- int phone_entry = entryPhone1;
-
- LOG ("entering transmit");
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(remote!=NULL,-1);
- g_assert(local->ecard!=NULL);
-
- p = g_new0(PilotRecord,1);
-
- p->ID = local->local.ID;
- p->attr = local->local.attr;
- p->archived = local->local.archived;
- p->secret = local->local.secret;
-
- local->address = g_new0(struct Address,1);
-
- gtk_object_get (GTK_OBJECT (local->ecard),
- "name", &ecard_name,
- "org", &ecard_org,
- "note", &ecard_note,
- "title", &ecard_title,
- "phone", &ecard_phones,
- "email", &ecard_emails,
- NULL);
-
- /* use strdup instead of g_strdup since free_transmit uses free, not g_free. */
- if (ecard_name) {
- if (ecard_name->given)
- local->address->entry [ entryFirstname ] = strdup (ecard_name->given);
- if (ecard_name->family)
- local->address->entry [ entryLastname ] = strdup (ecard_name->family);
- // e_card_name_free (ecard_name);
- }
-
- if (ecard_org) {
- local->address->entry [ entryCompany ] = strdup (ecard_org);
- }
- if (ecard_title) {
- local->address->entry [ entryTitle ] = strdup (ecard_title);
- }
- if (ecard_emails) {
- EIterator *iterator = e_list_get_iterator (ecard_emails);
- char *email;
-
- if ((email = (char *)e_iterator_get(iterator))) {
- local->address->phoneLabel[phone_entry - entryPhone1] =
- get_phone_label_by_name (&ctxt->ai, "E-mail");
- local->address->entry [ phone_entry ] = strdup (email);
-
- phone_entry++;
- }
- }
- if (ecard_phones) {
- int phone_entry = entryPhone1;
- EIterator *iterator = e_list_get_iterator (ecard_phones);
- ECardPhone *phone;
-
- while ((phone = (ECardPhone*)e_iterator_get(iterator))) {
-
- local->address->phoneLabel[phone_entry - entryPhone1] =
- get_phone_label_by_flag (&ctxt->ai, phone->flags);
- local->address->entry [ phone_entry ] = strdup (phone->number);
-
- /* only store a maximum of 5 numbers (4 if
- there was an email address) */
- if (phone_entry == entryPhone5)
- break;
-
- if (e_iterator_next (iterator) == FALSE)
- break;
-
- phone_entry++;
- }
- }
-
- if (ecard_note) {
- local->address->entry [ entryNote ] = strdup (ecard_note);
- }
-#if 0
- printf ("transmitting address to pilot [%s] complete=%d/%ld\n",
- local->ical->summary==NULL?"NULL":local->ical->summary,
- local->address->complete, local->ical->completed);
-#endif
-
- /* Generate pilot record structure */
- p->record = g_new0(char,0xffff);
- p->length = pack_Address(local->address,p->record,0xffff);
-
- *remote = p;
-
- return 0;
-}
-
-/*
-** free memory allocated in the transmit signal.
-**
-** XXX return value not checked.
-*/
-static gint
-free_transmit (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord *local,
- PilotRecord **remote,
- AddressbookConduitContext *ctxt)
-{
- LOG ("entering free_transmit");
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(remote!=NULL,-1);
-
- free_Address(local->address);
- g_free((*remote)->record);
- *remote = NULL;
- return 0;
-}
-
-/*
-** used when synching. compare the local and remove record data and
-** determine equality.
-**
-** retval is similar to strcmp: 0 for equality, anything else for
-** inequality (no ordering is imposed).
-*/
-static gint
-compare (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord *local,
- PilotRecord *remote,
- AddressbookConduitContext *ctxt)
-{
-#if 0
- /* used by the quick compare */
- PilotRecord *remoteOfLocal;
- int err;
- int retval;
-
- g_message ("entering compare");
- printf ("entering compare\n");
-
- g_return_val_if_fail (local!=NULL,-1);
- g_return_val_if_fail (remote!=NULL,-1);
-
- err = transmit(conduit,local,&remoteOfLocal,ctxt);
- if (err != 0) return err;
-
- retval = 0;
- if (remote->length == remoteOfLocal->length) {
- if (memcmp(remoteOfLocal->record,remote->record,remote->length)!=0) {
- g_message("compare failed on contents");
- printf ("compare failed on contents\n");
- retval = 1;
-
- /* debug spew */
- {
- struct Address foolocal;
- struct Address fooremote;
-
- unpack_Address (&foolocal,
- remoteOfLocal->record,
- remoteOfLocal->length);
- unpack_Address (&fooremote,
- remote->record,
- remote->length);
-
- printf (" local:[%d %ld %d %d '%s' '%s']\n",
- foolocal.indefinite,
- mktime (& foolocal.due),
- foolocal.priority,
- foolocal.complete,
- foolocal.description,
- foolocal.note);
-
- printf ("remote:[%d %ld %d %d '%s' '%s']\n",
- fooremote.indefinite,
- mktime (& fooremote.due),
- fooremote.priority,
- fooremote.complete,
- fooremote.description,
- fooremote.note);
- }
- }
- } else {
- g_message("compare failed on length");
- printf("compare failed on length\n");
- retval = 1;
- }
-
- free_transmit(conduit,local,&remoteOfLocal,ctxt);
- return retval;
-#endif /* 0 */
- return 0;
-}
-
-/*
-** XXX not actually called from the gnome-pilot source
-*/
-static gint
-compare_backup (GnomePilotConduitStandardAbs *conduit,
- AddressbookLocalRecord *local,
- PilotRecord *remote,
- AddressbookConduitContext *ctxt)
-{
- LOG ("entering compare_backup");
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(remote!=NULL,-1);
-
- return -1;
-}
-
-/*
-** used when copying from the pilot.
-**
-** delete all records in the local database. this doesn't actually
-** remove the records, merely sets their status to DELETED.
-**
-** return value is < 0 on error, >= 0 on success.
-*/
-static gint
-delete_all (GnomePilotConduitStandardAbs *conduit,
- AddressbookConduitContext *ctxt)
-{
- GList *it;
-
- for (it=ctxt->cards; it; it = g_list_next (it)) {
- gtk_object_set (GTK_OBJECT (it->data),
- "pilot_status", E_CARD_PILOT_STATUS_DEL, NULL);
- }
-
- return 0;
-}
-
-#ifdef NEED_OAF_INIT_HACK
-static ORBit_MessageValidationResult
-accept_all_cookies (CORBA_unsigned_long request_id,
- CORBA_Principal *principal,
- CORBA_char *operation)
-{
- /* allow ALL cookies */
- return ORBIT_MESSAGE_ALLOW_ALL;
-}
-#endif
-
-GnomePilotConduit *
-conduit_get_gpilot_conduit (guint32 pilotId)
-{
- GtkObject *retval;
- AddressbookConduitCfg *cfg;
- AddressbookConduitContext *ctxt;
-
- printf ("in address's conduit_get_gpilot_conduit\n");
-
-#ifdef NEED_OAF_INIT_HACK
-#ifndef NO_WARNINGS
-#warning "need a better way to do this"
-#endif
- /* we need to find wombat with oaf, so make sure oaf
- is initialized here. once the desktop is converted
- to oaf and gpilotd is built with oaf, this can go away */
- if (! oaf_is_initialized ())
- {
- char *argv[ 1 ] = {"hi"};
- oaf_init (1, argv);
-
- if (bonobo_init (CORBA_OBJECT_NIL,
- CORBA_OBJECT_NIL,
- CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-
- ORBit_set_request_validation_handler (accept_all_cookies);
- }
-#endif
-
- retval = gnome_pilot_conduit_standard_abs_new ("AddressDB",
- 0x61646472);
- g_assert (retval != NULL);
- gnome_pilot_conduit_construct(GNOME_PILOT_CONDUIT(retval),"AddressConduit");
-
- conduit_load_configuration(&cfg,pilotId);
- gtk_object_set_data (retval,"addressconduit_cfg",cfg);
-
- conduit_new_context(&ctxt,cfg);
- gtk_object_set_data(GTK_OBJECT(retval),"addressconduit_context",ctxt);
-
- gtk_signal_connect (retval, "match_record", (GtkSignalFunc) match_record, ctxt);
- gtk_signal_connect (retval, "free_match", (GtkSignalFunc) free_match, ctxt);
-#ifdef SUPPORT_ARCHIVING
- gtk_signal_connect (retval, "archive_local", (GtkSignalFunc) archive_local, ctxt);
- gtk_signal_connect (retval, "archive_remote", (GtkSignalFunc) archive_remote, ctxt);
- gtk_signal_connect (retval, "set_archived", (GtkSignalFunc) set_archived, ctxt);
- gtk_signal_connect (retval, "clear_status_archive_local", (GtkSignalFunc) clear_status_archive_local, ctxt);
-#endif
- gtk_signal_connect (retval, "store_remote", (GtkSignalFunc) store_remote, ctxt);
- gtk_signal_connect (retval, "iterate", (GtkSignalFunc) iterate, ctxt);
- gtk_signal_connect (retval, "iterate_specific", (GtkSignalFunc) iterate_specific, ctxt);
- gtk_signal_connect (retval, "purge", (GtkSignalFunc) purge, ctxt);
- gtk_signal_connect (retval, "set_status", (GtkSignalFunc) set_status, ctxt);
- gtk_signal_connect (retval, "set_pilot_id", (GtkSignalFunc) set_pilot_id, ctxt);
- gtk_signal_connect (retval, "compare", (GtkSignalFunc) compare, ctxt);
- gtk_signal_connect (retval, "compare_backup", (GtkSignalFunc) compare_backup, ctxt);
- gtk_signal_connect (retval, "free_transmit", (GtkSignalFunc) free_transmit, ctxt);
- gtk_signal_connect (retval, "delete_all", (GtkSignalFunc) delete_all, ctxt);
- gtk_signal_connect (retval, "transmit", (GtkSignalFunc) transmit, ctxt);
- gtk_signal_connect (retval, "pre_sync", (GtkSignalFunc) pre_sync, ctxt);
-
- return GNOME_PILOT_CONDUIT (retval);
-}
-
-void
-conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit)
-{
- AddressbookConduitCfg *cc;
- AddressbookConduitContext *ctxt;
-
- cc = GET_CONDUITCFG(conduit);
- ctxt = GET_CONDUITCONTEXT(conduit);
-
- if (ctxt->ebook != NULL) {
- gtk_object_unref (GTK_OBJECT (ctxt->ebook));
- }
-
- conduit_destroy_configuration (&cc);
-
- conduit_destroy_context (&ctxt);
-
- gtk_object_destroy (GTK_OBJECT (conduit));
-}
diff --git a/addressbook/conduit/address-conduit.h b/addressbook/conduit/address-conduit.h
deleted file mode 100644
index 9858504fd7..0000000000
--- a/addressbook/conduit/address-conduit.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#ifndef __ADDRESS_CONDUIT_H__
-#define __ADDRESS_CONDUIT_H__
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <gnome.h>
-#include <pi-address.h>
-#include <gpilotd/gnome-pilot-conduit.h>
-#include <gpilotd/gnome-pilot-conduit-standard-abs.h>
-#include "ebook/e-card.h"
-#include "ebook/e-card-simple.h"
-#include "ebook/e-book.h"
-#include "ebook/e-book-view.h"
-
-#ifdef USING_OAF
-#include <liboaf/liboaf.h>
-#else
-#include <libgnorba/gnorba.h>
-#endif
-
-
-/* This is the local record structure for the GnomeCal conduit. */
-typedef struct _AddressbookLocalRecord AddressbookLocalRecord;
-struct _AddressbookLocalRecord {
- /* 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.
- */
- LocalRecord local;
- /* The corresponding Evolution addressbook object. */
- ECard *ecard;
- /* pilot-link address structure, used for implementing Transmit. */
- struct Address *address;
-};
-#define ADDRESSBOOK_LOCALRECORD(s) ((AddressbookLocalRecord*)(s))
-
-/* This is the configuration of the GnomeCal conduit. */
-typedef struct _AddressbookConduitCfg AddressbookConduitCfg;
-struct _AddressbookConduitCfg {
- gboolean open_secret;
- guint32 pilotId;
- GnomePilotConduitSyncType sync_type; /* only used by capplet */
-};
-#define GET_CONDUITCFG(c) ((AddressbookConduitCfg*)gtk_object_get_data(GTK_OBJECT(c),"addressconduit_cfg"))
-
-/* This is the context for all the Addressbook conduit methods. */
-typedef struct _AddressbookConduitContext AddressbookConduitContext;
-struct _AddressbookConduitContext {
- struct AddressAppInfo ai;
- AddressbookConduitCfg *cfg;
- EBook *ebook;
- // ECardCursor *cursor;
- GList *cards;
- /* CalClient *client;*/
- CORBA_Environment ev;
- CORBA_ORB orb;
- gboolean address_load_tried;
- gboolean address_load_success;
-
- char *address_file;
-};
-#define GET_CONDUITCONTEXT(c) ((AddressbookConduitContext*)gtk_object_get_data(GTK_OBJECT(c),"addressconduit_context"))
-
-
-/* Given a GCalConduitCfg*, allocates the structure and
- loads the configuration data for the given pilot.
- this is defined in the header file because it is used by
- both address-conduit and address-conduit-control-applet,
- and we don't want to export any symbols we don't have to. */
-static void
-conduit_load_configuration(AddressbookConduitCfg **c,
- guint32 pilotId)
-{
- gchar prefix[256];
- g_snprintf(prefix,255,"/gnome-pilot.d/address-conduit/Pilot_%u/",pilotId);
-
- *c = g_new0(AddressbookConduitCfg,1);
- g_assert(*c != NULL);
- gnome_config_push_prefix(prefix);
- (*c)->open_secret = gnome_config_get_bool("open_secret=FALSE");
- (*c)->sync_type = GnomePilotConduitSyncTypeCustom; /* set in capplets main */
- gnome_config_pop_prefix();
-
- (*c)->pilotId = pilotId;
-}
-
-
-#endif __ADDRESS_CONDUIT_H__
diff --git a/addressbook/conduit/address.conduit.in b/addressbook/conduit/address.conduit.in
deleted file mode 100644
index 3a0416fac8..0000000000
--- a/addressbook/conduit/address.conduit.in
+++ /dev/null
@@ -1,8 +0,0 @@
-<gnome-pilot-conduit version="1.0">
-<conduit id="address_conduit" type="shlib" location="@prefix@/lib/gnome-pilot/conduits/libaddress_conduit.so"/>
-<name value="address"/>
-<conduit-attribute name="description" value="Synchronizes with Evolution"/>
-<conduit-attribute name="default-synctype" value="synchronize"/>
-<conduit-attribute name="icon" value="@prefix@/share/pixmaps/gnome-calendar-conduit.png"/>
-<conduit-attribute name="settings" value="TRUE"/>
-</gnome-pilot-conduit>
diff --git a/addressbook/contact-editor/.cvsignore b/addressbook/contact-editor/.cvsignore
deleted file mode 100644
index 6fd0b5075c..0000000000
--- a/addressbook/contact-editor/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-contact-editor-test
diff --git a/addressbook/contact-editor/Makefile.am b/addressbook/contact-editor/Makefile.am
deleted file mode 100644
index f51a0109ac..0000000000
--- a/addressbook/contact-editor/Makefile.am
+++ /dev/null
@@ -1,65 +0,0 @@
-CPPFLAGS = \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DDATADIR=\""$(datadir)"\" \
- -DEVOLUTIONDIR=\""$(evolutiondir)"\"
-
-INCLUDES = \
- $(BONOBO_GNOME_CFLAGS) \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook/ \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_srcdir)/widgets/e-table \
- -DG_LOG_DOMAIN=\"contact-editor\"
-
-noinst_LIBRARIES = \
- libecontacteditor.a
-
-libecontacteditor_a_SOURCES = \
- e-contact-editor-categories.c \
- e-contact-editor-categories.h \
- e-contact-editor-fullname.c \
- e-contact-editor-fullname.h \
- e-contact-editor.c \
- e-contact-editor.h \
- e-contact-save-as.c \
- e-contact-save-as.h
-
-noinst_PROGRAMS = \
- contact-editor-test
-
-contact_editor_test_SOURCES = \
- test-editor.c
-
-contact_editor_test_LDADD = \
- libecontacteditor.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/libversit/libversit.la \
- $(GNOMEGNORBA_LIBS) \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(EXTRA_GNOME_LIBS)
-
-evolutiondir = $(datadir)/evolution
-
-evolution_DATA = arrow.png
-
-gladedir = $(datadir)/evolution/glade
-
-glade_DATA = \
- contact-editor.glade \
- fullname.glade \
- categories.glade \
- e-contact-editor-confirm-delete.glade
-
-EXTRA_DIST = $(evolution_DATA) \
- $(glade_DATA) \
- e-contact-editor-strings.h \
- fullname-strings.h \
- categories-strings.h \
- e-contact-editor-confirm-delete.glade.h
diff --git a/addressbook/contact-editor/arrow.png b/addressbook/contact-editor/arrow.png
deleted file mode 100644
index b102356c78..0000000000
--- a/addressbook/contact-editor/arrow.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/contact-editor/briefcase.png b/addressbook/contact-editor/briefcase.png
deleted file mode 100644
index dd59b8fd39..0000000000
--- a/addressbook/contact-editor/briefcase.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/contact-editor/categories-strings.h b/addressbook/contact-editor/categories-strings.h
deleted file mode 100644
index 813018a00e..0000000000
--- a/addressbook/contact-editor/categories-strings.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("categories");
-gchar *s = N_("Item(s) belong to these categories:");
-gchar *s = N_("Available Categories:");
diff --git a/addressbook/contact-editor/categories.glade b/addressbook/contact-editor/categories.glade
deleted file mode 100644
index bf78008940..0000000000
--- a/addressbook/contact-editor/categories.glade
+++ /dev/null
@@ -1,190 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>categories</name>
- <program_name>categories</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>False</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>False</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>categories-strings.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>categories</name>
- <cxx_use_heap>True</cxx_use_heap>
- <visible>False</visible>
- <title>categories</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table-categories</name>
- <cxx_use_heap>True</cxx_use_heap>
- <rows>4</rows>
- <columns>1</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>0</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Item(s) belong to these categories:</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel2</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Available Categories:</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-categories</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/contact-editor/contact-editor.glade b/addressbook/contact-editor/contact-editor.glade
deleted file mode 100644
index 7c328a72ce..0000000000
--- a/addressbook/contact-editor/contact-editor.glade
+++ /dev/null
@@ -1,2332 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Contact-editor</name>
- <program_name>contact-editor</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>False</backup_source_files>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-contact-editor-strings.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog2</name>
- <border_width>2</border_width>
- <visible>False</visible>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area2</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button28</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button29</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button30</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table2</name>
- <rows>2</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>2</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry2</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>0</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>2</spacing>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button31</name>
- <border_width>2</border_width>
- <can_focus>True</can_focus>
- <label>_Add</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button32</name>
- <border_width>2</border_width>
- <can_focus>True</can_focus>
- <label>_Delete</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <height>200</height>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>clist1</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>True</show_titles>
- <shadow_type>GTK_SHADOW_NONE</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label20</name>
- <label>Phone Types</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog-add-phone</name>
- <visible>False</visible>
- <title>New phone type</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>vbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>hbuttonbox1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button43</name>
- <can_default>True</can_default>
- <has_default>True</has_default>
- <can_focus>True</can_focus>
- <label>Add</label>
- <stock_pixmap>GNOME_STOCK_PIXMAP_ADD</stock_pixmap>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button44</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame-add-phone</name>
- <border_width>4</border_width>
- <label>New phone type</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment9</name>
- <border_width>9</border_width>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>1</yscale>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-add-phone</name>
- <can_focus>True</can_focus>
- <has_focus>True</has_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-<widget>
- <class>GnomeApp</class>
- <name>contact editor</name>
- <title>Contact Editor</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <enable_layout_config>True</enable_layout_config>
-
- <widget>
- <class>GnomeDock</class>
- <child_name>GnomeApp:dock</child_name>
- <name>dock1</name>
- <allow_floating>True</allow_floating>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkNotebook</class>
- <child_name>GnomeDock:contents</child_name>
- <name>notebook-contact-editor</name>
- <can_focus>True</can_focus>
- <show_tabs>True</show_tabs>
- <show_border>True</show_border>
- <tab_pos>GTK_POS_TOP</tab_pos>
- <scrollable>False</scrollable>
- <tab_hborder>2</tab_hborder>
- <tab_vborder>2</tab_vborder>
- <popup_enable>False</popup_enable>
-
- <widget>
- <class>GtkTable</class>
- <name>table-contact-editor-general</name>
- <border_width>7</border_width>
- <rows>14</rows>
- <columns>8</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-phone1</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-phone2</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-phone3</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-phone4</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkText</class>
- <name>text-address</name>
- <width>1</width>
- <height>1</height>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text></text>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>9</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-fullname</name>
- <can_focus>True</can_focus>
- <label>_Full Name...</label>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel-fileas</name>
- <label>File As:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel-web</name>
- <label>Web page address:</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>8</top_attach>
- <bottom_attach>9</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment3</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>1</yscale>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-email1</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment5</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-phone4</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment7</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-phone2</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment8</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-phone1</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator4</name>
- <child>
- <left_attach>4</left_attach>
- <right_attach>8</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment6</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-phone3</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-fullname</name>
- <has_default>True</has_default>
- <can_focus>True</can_focus>
- <has_focus>True</has_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-jobtitle</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-company</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-email1</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-web</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>8</top_attach>
- <bottom_attach>9</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator5</name>
- <child>
- <left_attach>0</left_attach>
- <right_attach>4</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo-file-as</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>True</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items></items>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>entry-file-as</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator6</name>
- <child>
- <left_attach>0</left_attach>
- <right_attach>4</right_attach>
- <top_attach>7</top_attach>
- <bottom_attach>8</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment10</name>
- <xalign>0.5</xalign>
- <yalign>0</yalign>
- <xscale>1</xscale>
- <yscale>1</yscale>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>6</top_attach>
- <bottom_attach>7</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>True</xshrink>
- <yshrink>True</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton-htmlmail</name>
- <visible>False</visible>
- <label>Wants to receive _HTML mail</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment4</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-address</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>address-label</name>
- <label>Address:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>text-address</focus_target>
- <child>
- <left_attach>5</left_attach>
- <right_attach>7</right_attach>
- <top_attach>6</top_attach>
- <bottom_attach>7</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox1</name>
- <child>
- <left_attach>5</left_attach>
- <right_attach>6</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone1</name>
- <label>_Business</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox2</name>
- <child>
- <left_attach>5</left_attach>
- <right_attach>6</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone2</name>
- <label>_Home</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-phone2</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox3</name>
- <child>
- <left_attach>5</left_attach>
- <right_attach>6</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone3</name>
- <label>Business _Fax</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-phone3</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox4</name>
- <child>
- <left_attach>5</left_attach>
- <right_attach>6</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone4</name>
- <label>_Mobile</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-phone4</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox5</name>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-email1</name>
- <label>Primary Email</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-email1</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox-business</name>
- <child>
- <left_attach>5</left_attach>
- <right_attach>6</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-address</name>
- <label>B_usiness</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>text-address</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment2</name>
- <xalign>0</xalign>
- <yalign>0</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>9</top_attach>
- <bottom_attach>10</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton-mailingaddress</name>
- <visible>False</visible>
- <label>_This is the mailing address</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator9</name>
- <child>
- <left_attach>0</left_attach>
- <right_attach>4</right_attach>
- <top_attach>11</top_attach>
- <bottom_attach>12</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator10</name>
- <child>
- <left_attach>4</left_attach>
- <right_attach>8</right_attach>
- <top_attach>11</top_attach>
- <bottom_attach>12</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment-contacts</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>13</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-contacts</name>
- <can_focus>True</can_focus>
- <label>C_ontacts...</label>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment15</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>13</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-categories</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment14</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>13</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-contacts</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment16</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>5</left_attach>
- <right_attach>7</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>13</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-categories</name>
- <can_focus>True</can_focus>
- <label>Ca_tegories...</label>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox7</name>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label34</name>
- <label>_Job title:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-jobtitle</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom1</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>malehead.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:19:47 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom2</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>cellphone.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:02 GMT</last_modification_time>
- <child>
- <left_attach>4</left_attach>
- <right_attach>5</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom3</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>envelope.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:19:51 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>7</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom4</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>house.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:06 GMT</last_modification_time>
- <child>
- <left_attach>4</left_attach>
- <right_attach>5</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>10</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom5</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>evolution-contacts.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:19:59 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>14</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom6</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>briefcase.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:09 GMT</last_modification_time>
- <child>
- <left_attach>4</left_attach>
- <right_attach>5</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>14</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom10</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>globe.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:19:56 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>8</top_attach>
- <bottom_attach>10</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label35</name>
- <label>_Company:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-company</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label15</name>
- <label>General</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table-contact-editor-details</name>
- <border_width>7</border_width>
- <rows>9</rows>
- <columns>6</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
-
- <widget>
- <class>GtkLabel</class>
- <name>label21</name>
- <label>_Department:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-department</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label22</name>
- <label>_Office:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-office</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label23</name>
- <label>_Profession:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-profession</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label24</name>
- <label>_Nickname:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-nickname</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label25</name>
- <label>_Spouse:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-spouse</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label31</name>
- <label>_Birthday:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label30</name>
- <label>_Assistant's name:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-assistant</focus_target>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label29</name>
- <label>_Manager's Name:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-manager</focus_target>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label32</name>
- <label>Anni_versary:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-spouse</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-department</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-office</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-profession</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-nickname</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GnomeDateEdit</class>
- <name>dateedit-anniversary</name>
- <show_time>False</show_time>
- <use_24_format>False</use_24_format>
- <week_start_monday>False</week_start_monday>
- <lower_hour>7</lower_hour>
- <upper_hour>19</upper_hour>
- <child>
- <left_attach>4</left_attach>
- <right_attach>6</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GnomeDateEdit</class>
- <name>dateedit-birthday</name>
- <show_time>False</show_time>
- <use_24_format>False</use_24_format>
- <week_start_monday>False</week_start_monday>
- <lower_hour>7</lower_hour>
- <upper_hour>19</upper_hour>
- <child>
- <left_attach>4</left_attach>
- <right_attach>6</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-assistant</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>4</left_attach>
- <right_attach>6</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-manager</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>4</left_attach>
- <right_attach>6</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator7</name>
- <child>
- <left_attach>0</left_attach>
- <right_attach>6</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label33</name>
- <label>No_tes:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>7</top_attach>
- <bottom_attach>8</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator8</name>
- <child>
- <left_attach>0</left_attach>
- <right_attach>6</right_attach>
- <top_attach>6</top_attach>
- <bottom_attach>7</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom7</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>briefcase.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:13 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom8</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>malehead.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:16 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow2</name>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <left_attach>1</left_attach>
- <right_attach>6</right_attach>
- <top_attach>8</top_attach>
- <bottom_attach>9</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkText</class>
- <name>text-comments</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom9</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>globe.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:19 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>7</top_attach>
- <bottom_attach>9</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label16</name>
- <label>Details</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GnomeAppBar</class>
- <child_name>GnomeApp:appbar</child_name>
- <name>appbar1</name>
- <has_progress>True</has_progress>
- <has_status>True</has_status>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/contact-editor/e-contact-editor-categories.c b/addressbook/contact-editor/e-contact-editor-categories.c
deleted file mode 100644
index 9251a86948..0000000000
--- a/addressbook/contact-editor/e-contact-editor-categories.c
+++ /dev/null
@@ -1,470 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-editor-categories.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-contact-editor-categories.h>
-#include <e-table-scrolled.h>
-#include <e-table.h>
-#include <e-table-simple.h>
-#include <e-cell-text.h>
-#include <e-cell-checkbox.h>
-
-static void e_contact_editor_categories_init (EContactEditorCategories *card);
-static void e_contact_editor_categories_class_init (EContactEditorCategoriesClass *klass);
-static void e_contact_editor_categories_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_contact_editor_categories_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_contact_editor_categories_destroy (GtkObject *object);
-static int e_contact_editor_categories_col_count (ETableModel *etc, gpointer data);
-static int e_contact_editor_categories_row_count (ETableModel *etc, gpointer data);
-static void *e_contact_editor_categories_value_at (ETableModel *etc, int col, int row, gpointer data);
-static void e_contact_editor_categories_set_value_at (ETableModel *etc, int col, int row, const void *val, gpointer data);
-static gboolean e_contact_editor_categories_is_cell_editable (ETableModel *etc, int col, int row, gpointer data);
-static void *e_contact_editor_categories_duplicate_value (ETableModel *etc, int col, const void *value, gpointer data);
-static void e_contact_editor_categories_free_value (ETableModel *etc, int col, void *value, gpointer data);
-static void *e_contact_editor_categories_initialize_value (ETableModel *etc, int col, gpointer data);
-static gboolean e_contact_editor_categories_value_is_empty (ETableModel *etc, int col, const void *value, gpointer data);
-static char * e_contact_editor_categories_value_to_string (ETableModel *etc, int col, const void *value, gpointer data);
-
-static GnomeDialogClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_CATEGORIES
-};
-
-GtkType
-e_contact_editor_categories_get_type (void)
-{
- static GtkType contact_editor_categories_type = 0;
-
- if (!contact_editor_categories_type)
- {
- static const GtkTypeInfo contact_editor_categories_info =
- {
- "EContactEditorCategories",
- sizeof (EContactEditorCategories),
- sizeof (EContactEditorCategoriesClass),
- (GtkClassInitFunc) e_contact_editor_categories_class_init,
- (GtkObjectInitFunc) e_contact_editor_categories_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- contact_editor_categories_type = gtk_type_unique (gnome_dialog_get_type (), &contact_editor_categories_info);
- }
-
- return contact_editor_categories_type;
-}
-
-static void
-e_contact_editor_categories_class_init (EContactEditorCategoriesClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeDialogClass *dialog_class;
-
- object_class = (GtkObjectClass*) klass;
- dialog_class = (GnomeDialogClass *) klass;
-
- parent_class = gtk_type_class (gnome_dialog_get_type ());
-
- gtk_object_add_arg_type ("EContactEditorCategories::categories", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_CATEGORIES);
-
- object_class->set_arg = e_contact_editor_categories_set_arg;
- object_class->get_arg = e_contact_editor_categories_get_arg;
- object_class->destroy = e_contact_editor_categories_destroy;
-}
-
-gchar *builtin_categories[] = {
- "Business",
- "Competition",
- "Favorites",
- "Gifts",
- "Goals/Objectives",
- "Holiday",
- "Holiday Cards",
- "Hot Contacts",
- "Ideas",
- "International",
- "Key Customer",
- "Miscellaneous",
- "Personal",
- "Phone Calls",
- "Status",
- "Strategies",
- "Suppliers",
- "Time & Expenses",
- "VIP",
- "Waiting",
-};
-
-#define BUILTIN_CATEGORY_COUNT (sizeof(builtin_categories) / sizeof(builtin_categories[0]))
-
-static void
-add_list_unique(EContactEditorCategories *categories, char *string)
-{
- int k;
- char *temp = e_strdup_strip(string);
- char **list = categories->category_list;
-
- if (!*temp) {
- g_free(temp);
- return;
- }
- for (k = 0; k < categories->list_length; k++) {
- if (!strcmp(list[k], temp)) {
- categories->selected_list[k] = TRUE;
- break;
- }
- }
- if (k == categories->list_length) {
- categories->selected_list[categories->list_length] = TRUE;
- list[categories->list_length++] = temp;
- } else {
- g_free(temp);
- }
-}
-
-static void
-do_parse_categories(EContactEditorCategories *categories)
-{
- char *str = categories->categories;
- int length = strlen(str);
- char *copy = g_new(char, length + 1);
- int i, j;
- char **list;
- int count = 1;
-
- e_table_model_pre_change(categories->model);
-
- for (i = 0; i < categories->list_length; i++)
- g_free(categories->category_list[i]);
- g_free(categories->category_list);
- g_free(categories->selected_list);
-
- for (i = 0; str[i]; i++) {
- switch (str[i]) {
- case '\\':
- i++;
- if (!str[i])
- i--;
- break;
- case ',':
- count ++;
- break;
- }
- }
- list = g_new(char *, count + 1 + BUILTIN_CATEGORY_COUNT);
- categories->category_list = list;
-
- categories->selected_list = g_new(gboolean, count + 1 + BUILTIN_CATEGORY_COUNT);
-
- for (count = 0; count < BUILTIN_CATEGORY_COUNT; count++) {
- list[count] = g_strdup(builtin_categories[count]);
- categories->selected_list[count] = 0;
- }
-
- categories->list_length = count;
-
- for (i = 0, j = 0; str[i]; i++, j++) {
- switch (str[i]) {
- case '\\':
- i++;
- if (str[i]) {
- copy[j] = str[i];
- } else
- i--;
- break;
- case ',':
- copy[j] = 0;
- add_list_unique(categories, copy);
- j = -1;
- break;
- default:
- copy[j] = str[i];
- break;
- }
- }
- copy[j] = 0;
- add_list_unique(categories, copy);
- g_free(copy);
- e_table_model_changed(categories->model);
-}
-
-static void
-e_contact_editor_categories_entry_change (GtkWidget *entry,
- EContactEditorCategories *categories)
-{
- g_free(categories->categories);
- categories->categories = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
- do_parse_categories(categories);
-}
-
-
-#define INITIAL_SPEC "<ETableSpecification no-header=\"1\"> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 1 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-static void
-e_contact_editor_categories_init (EContactEditorCategories *categories)
-{
- GladeXML *gui;
- GtkWidget *table;
- ECell *cell_left_just;
- ECell *cell_checkbox;
- ETableHeader *header;
- ETableCol *col;
- GtkWidget *e_table;
-
- categories->list_length = 0;
- categories->category_list = NULL;
- categories->selected_list = NULL;
- categories->categories = NULL;
-
- gnome_dialog_append_button ( GNOME_DIALOG(categories),
- GNOME_STOCK_BUTTON_OK);
-
- gnome_dialog_append_button ( GNOME_DIALOG(categories),
- GNOME_STOCK_BUTTON_CANCEL);
-
- gtk_window_set_policy(GTK_WINDOW(categories), FALSE, TRUE, FALSE);
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/categories.glade", NULL);
- categories->gui = gui;
-
- table = glade_xml_get_widget(gui, "table-categories");
- gtk_widget_ref(table);
- gtk_container_remove(GTK_CONTAINER(table->parent), table);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (categories)->vbox), table, TRUE, TRUE, 0);
- gtk_widget_unref(table);
-
- categories->entry = glade_xml_get_widget(gui, "entry-categories");
-
- gtk_signal_connect(GTK_OBJECT(categories->entry), "changed",
- GTK_SIGNAL_FUNC(e_contact_editor_categories_entry_change), categories);
-
- categories->model = e_table_simple_new(e_contact_editor_categories_col_count,
- e_contact_editor_categories_row_count,
- e_contact_editor_categories_value_at,
- e_contact_editor_categories_set_value_at,
- e_contact_editor_categories_is_cell_editable,
- e_contact_editor_categories_duplicate_value,
- e_contact_editor_categories_free_value,
- e_contact_editor_categories_initialize_value,
- e_contact_editor_categories_value_is_empty,
- e_contact_editor_categories_value_to_string,
- categories);
-
- header = e_table_header_new();
-
- cell_checkbox = e_cell_checkbox_new();
- col = e_table_col_new (0, "",
- 0, 20, cell_checkbox,
- g_int_compare, TRUE);
- e_table_header_add_column (header, col, 0);
-
- cell_left_just = e_cell_text_new (categories->model, NULL, GTK_JUSTIFY_LEFT);
- col = e_table_col_new (1, "Category",
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
- e_table_header_add_column (header, col, 1);
-
- e_table = e_table_scrolled_new (header, categories->model, INITIAL_SPEC);
-
- gtk_object_sink(GTK_OBJECT(categories->model));
-
- gtk_widget_show(e_table);
-
- gtk_table_attach_defaults(GTK_TABLE(table),
- e_table,
- 0, 1,
- 3, 4);
-}
-
-void
-e_contact_editor_categories_destroy (GtkObject *object)
-{
- EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(object);
- int i;
-
- if (categories->gui)
- gtk_object_unref(GTK_OBJECT(categories->gui));
-
- g_free(categories->categories);
- for (i = 0; i < categories->list_length; i++)
- g_free(categories->category_list[i]);
- g_free(categories->category_list);
- g_free(categories->selected_list);
-}
-
-GtkWidget*
-e_contact_editor_categories_new (char *categories)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_editor_categories_get_type ()));
- gtk_object_set (GTK_OBJECT(widget),
- "categories", categories,
- NULL);
- return widget;
-}
-
-static void
-e_contact_editor_categories_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EContactEditorCategories *e_contact_editor_categories;
-
- e_contact_editor_categories = E_CONTACT_EDITOR_CATEGORIES (o);
-
- switch (arg_id){
- case ARG_CATEGORIES:
- gtk_entry_set_text(GTK_ENTRY(e_contact_editor_categories->entry), GTK_VALUE_STRING (*arg));
- break;
- }
-}
-
-static void
-e_contact_editor_categories_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EContactEditorCategories *e_contact_editor_categories;
-
- e_contact_editor_categories = E_CONTACT_EDITOR_CATEGORIES (object);
-
- switch (arg_id) {
- case ARG_CATEGORIES:
- GTK_VALUE_STRING (*arg) = g_strdup(e_contact_editor_categories->categories);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-e_contact_editor_categories_col_count (ETableModel *etc, gpointer data)
-{
- return 2;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-e_contact_editor_categories_row_count (ETableModel *etc, gpointer data)
-{
- EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
- return categories->list_length;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-e_contact_editor_categories_value_at (ETableModel *etc, int col, int row, gpointer data)
-{
- EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
- if (col == 0)
- return (void *) categories->selected_list[row];
- else
- return categories->category_list[row];
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-e_contact_editor_categories_set_value_at (ETableModel *etc, int col, int row, const void *val, gpointer data)
-{
- EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
- if ( col == 0 ) {
- char **strs;
- int i, j;
- char *string;
- categories->selected_list[row] = (gboolean) val;
- strs = g_new(char *, categories->list_length + 1);
- for (i = 0, j = 0; i < categories->list_length; i++) {
- if (categories->selected_list[i])
- strs[j++] = categories->category_list[i];
- }
- strs[j] = 0;
- string = g_strjoinv(", ", strs);
- gtk_entry_set_text(GTK_ENTRY(categories->entry), string);
- g_free(string);
- g_free(strs);
- }
- if ( col == 1 )
- return;
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-e_contact_editor_categories_is_cell_editable (ETableModel *etc, int col, int row, gpointer data)
-{
- return col == 0;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-e_contact_editor_categories_duplicate_value (ETableModel *etc, int col, const void *value, gpointer data)
-{
- if (col == 0)
- return (void *)value;
- else
- return g_strdup(value);
-}
-
-/* This function frees the value passed to it. */
-static void
-e_contact_editor_categories_free_value (ETableModel *etc, int col, void *value, gpointer data)
-{
- if (col == 0)
- return;
- else
- g_free(value);
-}
-
-static void *
-e_contact_editor_categories_initialize_value (ETableModel *etc, int col, gpointer data)
-{
- if (col == 0)
- return NULL;
- else
- return g_strdup("");
-}
-
-static gboolean
-e_contact_editor_categories_value_is_empty (ETableModel *etc, int col, const void *value, gpointer data)
-{
- if (col == 0)
- return value == NULL;
- else
- return !(value && *(char *)value);
-}
-
-static char *
-e_contact_editor_categories_value_to_string (ETableModel *etc, int col, const void *value, gpointer data)
-{
- if (col == 0)
- return g_strdup_printf("%d", (int) value);
- else
- return g_strdup(value);
-}
diff --git a/addressbook/contact-editor/e-contact-editor-categories.h b/addressbook/contact-editor/e-contact-editor-categories.h
deleted file mode 100644
index 529ef71b68..0000000000
--- a/addressbook/contact-editor/e-contact-editor-categories.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor-categories.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_CATEGORIES_H__
-#define __E_CONTACT_EDITOR_CATEGORIES_H__
-
-#include <gnome.h>
-#include <glade/glade.h>
-#include <ebook/e-card.h>
-#include <widgets/e-table/e-table-model.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EContactEditorCategories - 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_CONTACT_EDITOR_CATEGORIES_TYPE (e_contact_editor_categories_get_type ())
-#define E_CONTACT_EDITOR_CATEGORIES(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE, EContactEditorCategories))
-#define E_CONTACT_EDITOR_CATEGORIES_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_CATEGORIES_TYPE, EContactEditorCategoriesClass))
-#define E_IS_CONTACT_EDITOR_CATEGORIES(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE))
-#define E_IS_CONTACT_EDITOR_CATEGORIES_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE))
-
-
-typedef struct _EContactEditorCategories EContactEditorCategories;
-typedef struct _EContactEditorCategoriesClass EContactEditorCategoriesClass;
-
-struct _EContactEditorCategories
-{
- GnomeDialog parent;
-
- /* item specific fields */
- char *categories;
- GtkWidget *entry;
- ETableModel *model;
-
- int list_length;
- char **category_list;
- gboolean *selected_list;
-
- GladeXML *gui;
-};
-
-struct _EContactEditorCategoriesClass
-{
- GnomeDialogClass parent_class;
-};
-
-
-GtkWidget *e_contact_editor_categories_new(char *categories);
-GtkType e_contact_editor_categories_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CONTACT_EDITOR_CATEGORIES_H__ */
diff --git a/addressbook/contact-editor/e-contact-editor-confirm-delete.glade b/addressbook/contact-editor/e-contact-editor-confirm-delete.glade
deleted file mode 100644
index 7f52321021..0000000000
--- a/addressbook/contact-editor/e-contact-editor-confirm-delete.glade
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>e-contact-editor-confirm-delete</name>
- <program_name>e-contact-editor-confirm-delete</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <gnome_help_support>True</gnome_help_support>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-contact-editor-confirm-delete.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeMessageBox</class>
- <name>confirm-dialog</name>
- <message_box_type>GNOME_MESSAGE_BOX_QUESTION</message_box_type>
- <message>Are you sure you want
-to delete this contact?</message>
- <title>Delete Contact?</title>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>True</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button2</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h b/addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h
deleted file mode 100644
index 7168db0a5c..0000000000
--- a/addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Are you sure you want\n"
- "to delete this contact?");
-gchar *s = N_("Delete Contact?");
diff --git a/addressbook/contact-editor/e-contact-editor-fullname.c b/addressbook/contact-editor/e-contact-editor-fullname.c
deleted file mode 100644
index b2e598fdde..0000000000
--- a/addressbook/contact-editor/e-contact-editor-fullname.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-editor-fullname.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-contact-editor-fullname.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_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_contact_editor_fullname_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_contact_editor_fullname_destroy (GtkObject *object);
-
-static void fill_in_info(EContactEditorFullname *editor);
-static void extract_info(EContactEditorFullname *editor);
-
-static GnomeDialogClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_NAME
-};
-
-GtkType
-e_contact_editor_fullname_get_type (void)
-{
- static GtkType contact_editor_fullname_type = 0;
-
- if (!contact_editor_fullname_type)
- {
- static const GtkTypeInfo contact_editor_fullname_info =
- {
- "EContactEditorFullname",
- sizeof (EContactEditorFullname),
- sizeof (EContactEditorFullnameClass),
- (GtkClassInitFunc) e_contact_editor_fullname_class_init,
- (GtkObjectInitFunc) e_contact_editor_fullname_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- contact_editor_fullname_type = gtk_type_unique (gnome_dialog_get_type (), &contact_editor_fullname_info);
- }
-
- return contact_editor_fullname_type;
-}
-
-static void
-e_contact_editor_fullname_class_init (EContactEditorFullnameClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeDialogClass *dialog_class;
-
- object_class = (GtkObjectClass*) klass;
- dialog_class = (GnomeDialogClass *) klass;
-
- parent_class = gtk_type_class (gnome_dialog_get_type ());
-
- gtk_object_add_arg_type ("EContactEditorFullname::name", GTK_TYPE_POINTER,
- GTK_ARG_READWRITE, ARG_NAME);
-
- object_class->set_arg = e_contact_editor_fullname_set_arg;
- object_class->get_arg = e_contact_editor_fullname_get_arg;
- object_class->destroy = e_contact_editor_fullname_destroy;
-}
-
-static void
-e_contact_editor_fullname_init (EContactEditorFullname *e_contact_editor_fullname)
-{
- GladeXML *gui;
- GtkWidget *widget;
-
- gnome_dialog_append_button ( GNOME_DIALOG(e_contact_editor_fullname),
- GNOME_STOCK_BUTTON_OK);
-
- gnome_dialog_append_button ( GNOME_DIALOG(e_contact_editor_fullname),
- GNOME_STOCK_BUTTON_CANCEL);
-
- gtk_window_set_policy(GTK_WINDOW(e_contact_editor_fullname), TRUE, TRUE, FALSE);
-
- e_contact_editor_fullname->name = NULL;
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/fullname.glade", NULL);
- e_contact_editor_fullname->gui = gui;
-
- widget = glade_xml_get_widget(gui, "table-checkfullname");
- gtk_widget_ref(widget);
- gtk_container_remove(GTK_CONTAINER(widget->parent), widget);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (e_contact_editor_fullname)->vbox), widget, TRUE, TRUE, 0);
- gtk_widget_unref(widget);
-}
-
-void
-e_contact_editor_fullname_destroy (GtkObject *object)
-{
- EContactEditorFullname *e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME(object);
-
- if (e_contact_editor_fullname->gui)
- gtk_object_unref(GTK_OBJECT(e_contact_editor_fullname->gui));
- e_card_name_free(e_contact_editor_fullname->name);
-}
-
-GtkWidget*
-e_contact_editor_fullname_new (ECardName *name)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_editor_fullname_get_type ()));
- gtk_object_set (GTK_OBJECT(widget),
- "name", name,
- NULL);
- return widget;
-}
-
-static void
-e_contact_editor_fullname_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EContactEditorFullname *e_contact_editor_fullname;
-
- e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (o);
-
- switch (arg_id){
- case ARG_NAME:
- if (e_contact_editor_fullname->name)
- e_card_name_free(e_contact_editor_fullname->name);
- e_contact_editor_fullname->name = e_card_name_copy(GTK_VALUE_POINTER (*arg));
- fill_in_info(e_contact_editor_fullname);
- break;
- }
-}
-
-static void
-e_contact_editor_fullname_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EContactEditorFullname *e_contact_editor_fullname;
-
- e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object);
-
- switch (arg_id) {
- case ARG_NAME:
- extract_info(e_contact_editor_fullname);
- GTK_VALUE_POINTER (*arg) = e_card_name_copy(e_contact_editor_fullname->name);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- 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)
-{
- ECardName *name = editor->name;
- if (name) {
- fill_in_field(editor, "entry-title", name->prefix);
- 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->suffix);
- }
-}
-
-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)
-{
- ECardName *name = editor->name;
- if (!name)
- name = e_card_name_new();
- name->prefix = 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->suffix = extract_field(editor, "entry-suffix");
-}
diff --git a/addressbook/contact-editor/e-contact-editor-fullname.h b/addressbook/contact-editor/e-contact-editor-fullname.h
deleted file mode 100644
index 409ffc72d0..0000000000
--- a/addressbook/contact-editor/e-contact-editor-fullname.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor-fullname.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <glade/glade.h>
-#include <ebook/e-card.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* 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_CONTACT_EDITOR_FULLNAME_TYPE (e_contact_editor_fullname_get_type ())
-#define E_CONTACT_EDITOR_FULLNAME(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_FULLNAME_TYPE, EContactEditorFullname))
-#define E_CONTACT_EDITOR_FULLNAME_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_FULLNAME_TYPE, EContactEditorFullnameClass))
-#define E_IS_CONTACT_EDITOR_FULLNAME(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_FULLNAME_TYPE))
-#define E_IS_CONTACT_EDITOR_FULLNAME_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_FULLNAME_TYPE))
-
-
-typedef struct _EContactEditorFullname EContactEditorFullname;
-typedef struct _EContactEditorFullnameClass EContactEditorFullnameClass;
-
-struct _EContactEditorFullname
-{
- GnomeDialog parent;
-
- /* item specific fields */
- ECardName *name;
- GladeXML *gui;
-};
-
-struct _EContactEditorFullnameClass
-{
- GnomeDialogClass parent_class;
-};
-
-
-GtkWidget *e_contact_editor_fullname_new(ECardName *name);
-GtkType e_contact_editor_fullname_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CONTACT_EDITOR_FULLNAME_H__ */
diff --git a/addressbook/contact-editor/e-contact-editor-strings.h b/addressbook/contact-editor/e-contact-editor-strings.h
deleted file mode 100644
index d5ac9daf24..0000000000
--- a/addressbook/contact-editor/e-contact-editor-strings.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("_Add");
-gchar *s = N_("_Delete");
-gchar *s = N_("Phone Types");
-gchar *s = N_("New phone type");
-gchar *s = N_("Add");
-gchar *s = N_("New phone type");
-gchar *s = N_("Contact Editor");
-gchar *s = N_("_Full Name...");
-gchar *s = N_("File As:");
-gchar *s = N_("Web page address:");
-gchar *s = N_("Wants to receive _HTML mail");
-gchar *s = N_("Address:");
-gchar *s = N_("_Business");
-gchar *s = N_("_Home");
-gchar *s = N_("Business _Fax");
-gchar *s = N_("_Mobile");
-gchar *s = N_("Primary Email");
-gchar *s = N_("B_usiness");
-gchar *s = N_("_This is the mailing address");
-gchar *s = N_("C_ontacts...");
-gchar *s = N_("Ca_tegories...");
-gchar *s = N_("_Job title:");
-gchar *s = N_("_Company:");
-gchar *s = N_("General");
-gchar *s = N_("_Department:");
-gchar *s = N_("_Office:");
-gchar *s = N_("_Profession:");
-gchar *s = N_("_Nickname:");
-gchar *s = N_("_Spouse:");
-gchar *s = N_("_Birthday:");
-gchar *s = N_("_Assistant's name:");
-gchar *s = N_("_Manager's Name:");
-gchar *s = N_("Anni_versary:");
-gchar *s = N_("No_tes:");
-gchar *s = N_("Details");
diff --git a/addressbook/contact-editor/e-contact-editor.c b/addressbook/contact-editor/e-contact-editor.c
deleted file mode 100644
index e8062d83b9..0000000000
--- a/addressbook/contact-editor/e-contact-editor.c
+++ /dev/null
@@ -1,1809 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-editor.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-contact-editor.h"
-#include <e-contact-editor-fullname.h>
-#include <e-contact-editor-categories.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
-#include <e-util/e-gui-utils.h>
-#include <e-contact-save-as.h>
-#include "addressbook/printing/e-contact-print.h"
-
-/* Signal IDs */
-enum {
- ADD_CARD,
- COMMIT_CARD,
- DELETE_CARD,
- EDITOR_CLOSED,
- LAST_SIGNAL
-};
-
-static void e_contact_editor_init (EContactEditor *card);
-static void e_contact_editor_class_init (EContactEditorClass *klass);
-static void e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_contact_editor_destroy (GtkObject *object);
-
-#if 0
-static GtkWidget *e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info);
-#endif
-static void _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor);
-static void _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor);
-static void _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor);
-static void fill_in_info(EContactEditor *editor);
-static void extract_info(EContactEditor *editor);
-static void set_fields(EContactEditor *editor);
-static void set_address_field(EContactEditor *editor, int result);
-static void add_field_callback(GtkWidget *widget, EContactEditor *editor);
-
-static GtkObjectClass *parent_class = NULL;
-
-static guint contact_editor_signals[LAST_SIGNAL];
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_CARD,
- ARG_IS_NEW_CARD
-};
-
-enum {
- DYNAMIC_LIST_EMAIL,
- DYNAMIC_LIST_PHONE,
- DYNAMIC_LIST_ADDRESS
-};
-
-GtkType
-e_contact_editor_get_type (void)
-{
- static GtkType contact_editor_type = 0;
-
- if (!contact_editor_type)
- {
- static const GtkTypeInfo contact_editor_info =
- {
- "EContactEditor",
- sizeof (EContactEditor),
- sizeof (EContactEditorClass),
- (GtkClassInitFunc) e_contact_editor_class_init,
- (GtkObjectInitFunc) e_contact_editor_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- contact_editor_type = gtk_type_unique (GTK_TYPE_OBJECT, &contact_editor_info);
- }
-
- return contact_editor_type;
-}
-
-static void
-e_contact_editor_class_init (EContactEditorClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass*) klass;
-
- parent_class = gtk_type_class (GTK_TYPE_OBJECT);
-
- gtk_object_add_arg_type ("EContactEditor::card", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_CARD);
- gtk_object_add_arg_type ("EContactEditor::is_new_card", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_IS_NEW_CARD);
-
- contact_editor_signals[ADD_CARD] =
- gtk_signal_new ("add_card",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EContactEditorClass, add_card),
- gtk_marshal_NONE__OBJECT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_OBJECT);
-
- contact_editor_signals[COMMIT_CARD] =
- gtk_signal_new ("commit_card",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EContactEditorClass, commit_card),
- gtk_marshal_NONE__OBJECT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_OBJECT);
-
- contact_editor_signals[DELETE_CARD] =
- gtk_signal_new ("delete_card",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EContactEditorClass, delete_card),
- gtk_marshal_NONE__OBJECT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_OBJECT);
-
- contact_editor_signals[EDITOR_CLOSED] =
- gtk_signal_new ("editor_closed",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EContactEditorClass, editor_closed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, contact_editor_signals, LAST_SIGNAL);
-
- object_class->set_arg = e_contact_editor_set_arg;
- object_class->get_arg = e_contact_editor_get_arg;
- object_class->destroy = e_contact_editor_destroy;
-}
-
-static void
-_replace_button(EContactEditor *editor, gchar *button_xml, gchar *image, GtkSignalFunc func)
-{
- GladeXML *gui = editor->gui;
- GtkWidget *button = glade_xml_get_widget(gui, button_xml);
- GtkWidget *pixmap;
- gchar *image_temp;
- if (button && GTK_IS_BUTTON(button)) {
- image_temp = g_strdup_printf("%s/%s", EVOLUTIONDIR, image);
- pixmap = e_create_image_widget(NULL, image_temp, NULL, 0, 0);
- gtk_container_add(GTK_CONTAINER(button),
- pixmap);
- g_free(image_temp);
- gtk_widget_show(pixmap);
- gtk_signal_connect(GTK_OBJECT(button), "button_press_event", func, editor);
- }
-}
-
-static void
-_replace_buttons(EContactEditor *editor)
-{
- _replace_button(editor, "button-phone1", "arrow.png", _phone_arrow_pressed);
- _replace_button(editor, "button-phone2", "arrow.png", _phone_arrow_pressed);
- _replace_button(editor, "button-phone3", "arrow.png", _phone_arrow_pressed);
- _replace_button(editor, "button-phone4", "arrow.png", _phone_arrow_pressed);
- _replace_button(editor, "button-address", "arrow.png", _address_arrow_pressed);
- _replace_button(editor, "button-email1", "arrow.png", _email_arrow_pressed);
-}
-
-static void
-phone_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- int which;
- gchar *string;
- GtkEntry *entry = GTK_ENTRY(widget);
- ECardPhone *phone;
-
- if ( widget == glade_xml_get_widget(editor->gui, "entry-phone1") ) {
- which = 1;
- } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone2") ) {
- which = 2;
- } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone3") ) {
- which = 3;
- } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone4") ) {
- which = 4;
- } else
- return;
- string = gtk_entry_get_text(entry);
- phone = e_card_phone_new();
- phone->number = string;
- e_card_simple_set_phone(editor->simple, editor->phone_choice[which - 1], phone);
- phone->number = NULL;
- e_card_phone_free(phone);
- set_fields(editor);
-}
-
-static void
-email_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- gchar *string;
- GtkEntry *entry = GTK_ENTRY(widget);
-
- string = gtk_entry_get_text(entry);
-
- e_card_simple_set_email(editor->simple, editor->email_choice, string);
-}
-
-static void
-address_text_changed (GtkWidget *widget, EContactEditor *editor)
-{
- GtkEditable *editable = GTK_EDITABLE(widget);
- ECardAddrLabel *address;
-
- if (editor->address_choice == -1)
- return;
-
- address = e_card_address_label_new();
- address->data = gtk_editable_get_chars(editable, 0, -1);
- e_card_simple_set_address(editor->simple, editor->address_choice, address);
- e_card_address_label_free(address);
-}
-
-/* This function tells you whether name_to_style will make sense. */
-static gboolean
-style_makes_sense(const ECardName *name, char *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->given && *name->given) || (name->family && *name->family)))
- return TRUE;
- else
- return FALSE;
- default:
- return FALSE;
- }
-}
-
-static char *
-name_to_style(const ECardName *name, char *company, int style)
-{
- char *string;
- char *strings[4], **stringptr;
- char *substring;
- switch (style) {
- case 0:
- stringptr = strings;
- 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->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->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"));
- char *filestring = gtk_entry_get_text(file_as);
- char *trystring;
- ECardName *name = editor->name;
- int i;
- int style;
-
- if (!name) return 0;
-
- style = -1;
- for (i = 0; i < 5; i++) {
- trystring = name_to_style(name, editor->company, i);
- if (!strcmp(trystring, filestring)) {
- g_free(trystring);
- return i;
- }
- g_free(trystring);
- }
- 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"));
- GtkWidget *widget;
-
-
- if (style == -1) {
- string = g_strdup(gtk_entry_get_text(file_as));
- strings = g_list_append(strings, string);
- }
-
- for (i = 0; i < 5; i++) {
- if (style_makes_sense(editor->name, editor->company, i)) {
- string = name_to_style(editor->name, editor->company, i);
- strings = g_list_append(strings, string);
- }
- }
-
- widget = glade_xml_get_widget(editor->gui, "combo-file-as");
- 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, editor->company, style);
- gtk_entry_set_text(file_as, string);
- g_free(string);
- }
-}
-
-static void
-name_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- GtkWidget *file_as;
- int style = 0;
-
- file_as = glade_xml_get_widget(editor->gui, "entry-file-as");
-
- if (file_as && GTK_IS_ENTRY(file_as)) {
- style = file_as_get_style(editor);
- }
-
- e_card_name_free(editor->name);
- editor->name = e_card_name_from_string(gtk_entry_get_text(GTK_ENTRY(widget)));
-
- if (file_as && GTK_IS_ENTRY(file_as)) {
- file_as_set_style(editor, style);
- }
-}
-
-static void
-company_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- int style = 0;
- GtkWidget *file_as;
-
- file_as = glade_xml_get_widget(editor->gui, "entry-file-as");
-
- if (file_as && GTK_IS_ENTRY(file_as)) {
- style = file_as_get_style(editor);
- }
-
- g_free(editor->company);
-
- editor->company = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
-
- if (file_as && GTK_IS_ENTRY(file_as)) {
- file_as_set_style(editor, style);
- }
-}
-
-static void
-set_entry_changed_signal_phone(EContactEditor *editor, char *id)
-{
- GtkWidget *widget = glade_xml_get_widget(editor->gui, id);
- if (widget && GTK_IS_ENTRY(widget))
- gtk_signal_connect(GTK_OBJECT(widget), "changed",
- phone_entry_changed, editor);
-}
-
-static void
-set_entry_changed_signals(EContactEditor *editor)
-{
- GtkWidget *widget;
- set_entry_changed_signal_phone(editor, "entry-phone1");
- set_entry_changed_signal_phone(editor, "entry-phone2");
- set_entry_changed_signal_phone(editor, "entry-phone3");
- set_entry_changed_signal_phone(editor, "entry-phone4");
- widget = glade_xml_get_widget(editor->gui, "entry-email1");
- if (widget && GTK_IS_ENTRY(widget)) {
- gtk_signal_connect(GTK_OBJECT(widget), "changed",
- email_entry_changed, editor);
- }
- widget = glade_xml_get_widget(editor->gui, "text-address");
- if (widget && GTK_IS_TEXT(widget)) {
- gtk_signal_connect(GTK_OBJECT(widget), "changed",
- address_text_changed, editor);
- }
- widget = glade_xml_get_widget(editor->gui, "entry-fullname");
- if (widget && GTK_IS_ENTRY(widget)) {
- gtk_signal_connect(GTK_OBJECT(widget), "changed",
- name_entry_changed, editor);
- }
- widget = glade_xml_get_widget(editor->gui, "entry-company");
- if (widget && GTK_IS_ENTRY(widget)) {
- gtk_signal_connect(GTK_OBJECT(widget), "changed",
- company_entry_changed, editor);
- }
-}
-
-static void
-full_name_clicked(GtkWidget *button, EContactEditor *editor)
-{
- GnomeDialog *dialog = GNOME_DIALOG(e_contact_editor_fullname_new(editor->name));
- int result;
- gtk_widget_show(GTK_WIDGET(dialog));
- result = gnome_dialog_run_and_close (dialog);
- if (result == 0) {
- ECardName *name;
- GtkWidget *fname_widget;
-
- gtk_object_get(GTK_OBJECT(dialog),
- "name", &name,
- NULL);
- e_card_name_free(editor->name);
- editor->name = e_card_name_copy(name);
-
- fname_widget = glade_xml_get_widget(editor->gui, "entry-fullname");
- if (fname_widget && GTK_IS_ENTRY(fname_widget)) {
- char *full_name = e_card_name_to_string(name);
- gtk_entry_set_text(GTK_ENTRY(fname_widget), full_name);
- g_free(full_name);
- }
- }
- gtk_object_unref(GTK_OBJECT(dialog));
-}
-
-static void
-categories_clicked(GtkWidget *button, EContactEditor *editor)
-{
- char *categories;
- GnomeDialog *dialog;
- int result;
- GtkWidget *entry = glade_xml_get_widget(editor->gui, "entry-categories");
- if (entry && GTK_IS_ENTRY(entry))
- categories = gtk_entry_get_text(GTK_ENTRY(entry));
- else if (editor->card)
- gtk_object_get(GTK_OBJECT(editor->card),
- "categories", &categories,
- NULL);
- dialog = GNOME_DIALOG(e_contact_editor_categories_new(categories));
- gtk_widget_show(GTK_WIDGET(dialog));
- result = gnome_dialog_run (dialog);
- if (result == 0) {
- gtk_object_get(GTK_OBJECT(dialog),
- "categories", &categories,
- NULL);
- if (entry && GTK_IS_ENTRY(entry))
- gtk_entry_set_text(GTK_ENTRY(entry), categories);
- else
- gtk_object_set(GTK_OBJECT(editor->card),
- "categories", categories,
- NULL);
- g_free(categories);
- }
- gtk_object_destroy(GTK_OBJECT(dialog));
- if (!entry)
- g_free(categories);
-}
-
-/* Emits the signal to request saving a card */
-static void
-save_card (EContactEditor *ce)
-{
- extract_info (ce);
- e_card_simple_sync_card (ce->simple);
-
- if (ce->is_new_card)
- gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[ADD_CARD],
- ce->card);
- else
- gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[COMMIT_CARD],
- ce->card);
-
- /* FIXME: should we set the ce->is_new_card here or have the client code
- * set the "is_new_card" argument on the contact editor object?
- */
-
- ce->is_new_card = FALSE;
-}
-
-/* Closes the dialog box and emits the appropriate signals */
-static void
-close_dialog (EContactEditor *ce)
-{
- g_assert (ce->app != NULL);
-
- gtk_widget_destroy (ce->app);
- ce->app = NULL;
-
- gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[EDITOR_CLOSED]);
-}
-
-/* Menu callbacks */
-
-/* File/Save callback */
-static void
-file_save_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (data);
- save_card (ce);
-}
-
-/* File/Close callback */
-static void
-file_close_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (data);
- close_dialog (ce);
-}
-
-static void
-file_save_as_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
- ECard *card;
-
- ce = E_CONTACT_EDITOR (data);
-
- extract_info (ce);
- e_card_simple_sync_card (ce->simple);
-
- card = ce->card;
- e_contact_save_as("Save as VCard", card);
-}
-
-gboolean
-e_contact_editor_confirm_delete(void)
-{
- GnomeDialog *dialog;
- GladeXML *gui;
- int result;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/e-contact-editor-confirm-delete.glade", NULL);
-
- dialog = GNOME_DIALOG(glade_xml_get_widget(gui, "confirm-dialog"));
-
- result = gnome_dialog_run_and_close(dialog);
-
- gtk_object_unref(GTK_OBJECT(gui));
-
- return !result;
-}
-
-static void
-delete_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- if (e_contact_editor_confirm_delete()) {
-
- ce = E_CONTACT_EDITOR (data);
-
- extract_info (ce);
- e_card_simple_sync_card (ce->simple);
-
- if (!ce->is_new_card)
- gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[DELETE_CARD],
- ce->card);
-
- file_close_cb(widget, data);
- }
-}
-
-/* Emits the signal to request printing a card */
-static void
-print_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (data);
-
- extract_info (ce);
- e_card_simple_sync_card (ce->simple);
-
- gtk_widget_show(e_contact_print_card_dialog_new(ce->card));
-}
-
-
-/* Menu bar */
-
-static GnomeUIInfo file_new_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Appointment"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Meeting Re_quest"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Mail Message"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Task"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Task _Request"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Journal Entry"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Note"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Ch_oose Form..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo file_page_setup_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Memo Style"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Define Print _Styles..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo file_menu[] = {
- GNOMEUIINFO_MENU_NEW_SUBTREE (file_new_menu),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: S_end"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_SAVE_ITEM (file_save_cb, NULL),
- GNOMEUIINFO_MENU_SAVE_AS_ITEM (file_save_as_cb, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Save Attac_hments..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("_Delete"), NULL, delete_cb),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Move to Folder..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Cop_y to Folder..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("Page Set_up"), file_page_setup_menu),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Print Pre_view"), NULL, NULL),
- GNOMEUIINFO_MENU_PRINT_ITEM (print_cb, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_PROPERTIES_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CLOSE_ITEM (file_close_cb, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo edit_object_menu[] = {
- GNOMEUIINFO_ITEM_NONE ("FIXME: what goes here?", NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo edit_menu[] = {
- GNOMEUIINFO_MENU_UNDO_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_REDO_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CUT_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_COPY_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_PASTE_ITEM (NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Paste _Special..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CLEAR_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_SELECT_ALL_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Mark as U_nread"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_FIND_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_FIND_AGAIN_ITEM (NULL, NULL),
- GNOMEUIINFO_SUBTREE (N_("_Object"), edit_object_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_previous_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Unread Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Fi_rst Item in Folder"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_next_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Unread Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Last Item in Folder"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_toolbars_menu[] = {
- { GNOME_APP_UI_TOGGLEITEM, N_("FIXME: _Standard"), NULL, NULL, NULL, NULL,
- GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },
- { GNOME_APP_UI_TOGGLEITEM, N_("FIXME: __Formatting"), NULL, NULL, NULL, NULL,
- GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Customize..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_menu[] = {
- GNOMEUIINFO_SUBTREE (N_("Pre_vious"), view_previous_menu),
- GNOMEUIINFO_SUBTREE (N_("Ne_xt"), view_next_menu),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("_Toolbars"), view_toolbars_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo insert_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _File..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: It_em..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Object..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo format_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Font..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Paragraph..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo tools_forms_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Ch_oose Form..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Desi_gn This Form"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: D_esign a Form..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Publish _Form..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Pu_blish Form As..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Script _Debugger"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo tools_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Spelling..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("_Forms"), tools_forms_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo actions_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _New Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New _Contact from Same Company"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New _Letter to Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New _Message to Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New Meetin_g with Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Plan a Meeting..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New _Task for Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New _Journal Entry for Contact"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Flag for Follow Up..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Display Map of Address"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Open Web Page"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Forward as _vCard"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: For_ward"), NULL, NULL)
-};
-
-static GnomeUIInfo help_menu[] = {
- GNOMEUIINFO_ITEM_NONE ("FIXME: fix Bonobo so it supports help items!", NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo main_menu[] = {
- GNOMEUIINFO_MENU_FILE_TREE (file_menu),
- GNOMEUIINFO_MENU_EDIT_TREE (edit_menu),
- GNOMEUIINFO_MENU_VIEW_TREE (view_menu),
- GNOMEUIINFO_SUBTREE (N_("_Insert"), insert_menu),
- GNOMEUIINFO_SUBTREE (N_("F_ormat"), format_menu),
- GNOMEUIINFO_SUBTREE (N_("_Tools"), tools_menu),
- GNOMEUIINFO_SUBTREE (N_("Actio_ns"), actions_menu),
- GNOMEUIINFO_MENU_HELP_TREE (help_menu),
- GNOMEUIINFO_END
-};
-
-/* Creates the menu bar for the contact editor */
-static void
-create_menu (EContactEditor *ce)
-{
- BonoboUIHandlerMenuItem *list;
-
- bonobo_ui_handler_create_menubar (ce->uih);
-
- list = bonobo_ui_handler_menu_parse_uiinfo_list_with_data (main_menu, ce);
- bonobo_ui_handler_menu_add_list (ce->uih, "/", list);
-}
-
-/* Toolbar/Save and Close callback */
-static void
-tb_save_and_close_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (data);
- save_card (ce);
- close_dialog (ce);
-}
-
-/* Toolbar */
-
-static GnomeUIInfo toolbar[] = {
- GNOMEUIINFO_ITEM_STOCK (N_("Save and Close"),
- N_("Save the appointment and close the dialog box"),
- tb_save_and_close_cb,
- GNOME_STOCK_PIXMAP_SAVE),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_STOCK (N_("Print..."),
- N_("Print this item"), print_cb,
- GNOME_STOCK_PIXMAP_PRINT),
-#if 0
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Insert File..."),
- N_("Insert a file as an attachment"), NULL),
-#endif
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_STOCK (N_("Delete"),
- N_("Delete this item"), delete_cb,
- GNOME_STOCK_PIXMAP_TRASH),
- GNOMEUIINFO_SEPARATOR,
-#if 0
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Previous"),
- N_("Go to the previous item"), NULL,
- GNOME_STOCK_PIXMAP_BACK),
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Next"),
- N_("Go to the next item"), NULL,
- GNOME_STOCK_PIXMAP_FORWARD),
-#endif
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Help"),
- N_("See online help"), NULL, GNOME_STOCK_PIXMAP_HELP),
- GNOMEUIINFO_END
-};
-
-/* Creates the toolbar for the contact editor */
-static void
-create_toolbar (EContactEditor *ce)
-{
- BonoboUIHandlerToolbarItem *list;
- GnomeDockItem *dock_item;
- GtkWidget *toolbar_child;
-
- bonobo_ui_handler_create_toolbar (ce->uih, "Toolbar");
-
- /* Fetch the toolbar. What a pain in the ass. */
-
- dock_item = gnome_app_get_dock_item_by_name (GNOME_APP (ce->app), GNOME_APP_TOOLBAR_NAME);
- g_assert (dock_item != NULL);
-
- toolbar_child = gnome_dock_item_get_child (dock_item);
- g_assert (toolbar_child != NULL && GTK_IS_TOOLBAR (toolbar_child));
-
- /* Turn off labels as GtkToolbar sucks */
- gtk_toolbar_set_style (GTK_TOOLBAR (toolbar_child), GTK_TOOLBAR_ICONS);
-
- list = bonobo_ui_handler_toolbar_parse_uiinfo_list_with_data (toolbar, ce);
- bonobo_ui_handler_toolbar_add_list (ce->uih, "/Toolbar", list);
-}
-
-/* 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);
-
- close_dialog (ce);
- return TRUE;
-}
-
-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-phone1");
- list = add_to_tab_order(list, gui, "entry-phone2");
- list = add_to_tab_order(list, gui, "entry-phone3");
- list = add_to_tab_order(list, gui, "entry-phone4");
- list = g_list_reverse(list);
- e_container_change_tab_order(GTK_CONTAINER(container), list);
- g_list_free(list);
-
- list = NULL;
- list = add_to_tab_order(list, gui, "entry-email1");
- list = add_to_tab_order(list, gui, "entry-web");
- list = add_to_tab_order(list, gui, "text-address");
- list = add_to_tab_order(list, gui, "alignment-contacts");
- list = g_list_reverse(list);
- e_container_change_tab_order(GTK_CONTAINER(container), list);
- g_list_free(list);
- }
-}
-
-static void
-e_contact_editor_init (EContactEditor *e_contact_editor)
-{
- GladeXML *gui;
- GtkWidget *widget;
-
- e_contact_editor->email_info = NULL;
- e_contact_editor->phone_info = NULL;
- e_contact_editor->address_info = NULL;
- e_contact_editor->email_popup = NULL;
- e_contact_editor->phone_popup = NULL;
- e_contact_editor->address_popup = NULL;
- e_contact_editor->email_list = NULL;
- e_contact_editor->phone_list = NULL;
- e_contact_editor->address_list = NULL;
- e_contact_editor->name = NULL;
- e_contact_editor->company = g_strdup("");
-
- e_contact_editor->email_choice = 0;
- e_contact_editor->phone_choice[0] = E_CARD_SIMPLE_PHONE_ID_BUSINESS;
- e_contact_editor->phone_choice[1] = E_CARD_SIMPLE_PHONE_ID_HOME;
- e_contact_editor->phone_choice[2] = E_CARD_SIMPLE_PHONE_ID_BUSINESS_FAX;
- e_contact_editor->phone_choice[3] = E_CARD_SIMPLE_PHONE_ID_MOBILE;
- e_contact_editor->address_choice = 0;
-
- e_contact_editor->arbitrary_fields = NULL;
-
- e_contact_editor->simple = e_card_simple_new(NULL);
-
- e_contact_editor->card = NULL;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-editor.glade", NULL);
- e_contact_editor->gui = gui;
-
- setup_tab_order(gui);
-
- e_contact_editor->app = glade_xml_get_widget (gui, "contact editor");
-
- e_container_foreach_leaf (GTK_CONTAINER (e_contact_editor->app),
- (GtkCallback) add_field_callback,
- e_contact_editor);
-
- _replace_buttons(e_contact_editor);
- set_entry_changed_signals(e_contact_editor);
-
- widget = glade_xml_get_widget(e_contact_editor->gui, "button-fullname");
- if (widget && GTK_IS_BUTTON(widget))
- gtk_signal_connect(GTK_OBJECT(widget), "clicked",
- full_name_clicked, e_contact_editor);
-
- widget = glade_xml_get_widget(e_contact_editor->gui, "button-categories");
- if (widget && GTK_IS_BUTTON(widget))
- gtk_signal_connect(GTK_OBJECT(widget), "clicked",
- categories_clicked, e_contact_editor);
-
- /* Build the menu and toolbar */
-
- e_contact_editor->uih = bonobo_ui_handler_new ();
- if (!e_contact_editor->uih) {
- g_message ("e_contact_editor_init(): eeeeek, could not create the UI handler!");
- return;
- }
-
- bonobo_ui_handler_set_app (e_contact_editor->uih, GNOME_APP (e_contact_editor->app));
-
- create_menu (e_contact_editor);
- create_toolbar (e_contact_editor);
-
- /* Connect to the deletion of the dialog */
-
- gtk_signal_connect (GTK_OBJECT (e_contact_editor->app), "delete_event",
- GTK_SIGNAL_FUNC (app_delete_event_cb), e_contact_editor);
-}
-
-void
-e_contact_editor_destroy (GtkObject *object) {
- EContactEditor *e_contact_editor = E_CONTACT_EDITOR(object);
-
- if (e_contact_editor->email_list) {
- g_list_foreach(e_contact_editor->email_list, (GFunc) g_free, NULL);
- g_list_free(e_contact_editor->email_list);
- }
- if (e_contact_editor->email_info) {
- g_free(e_contact_editor->email_info);
- }
- if (e_contact_editor->email_popup) {
- gtk_widget_unref(e_contact_editor->email_popup);
- }
-
- if (e_contact_editor->phone_list) {
- g_list_foreach(e_contact_editor->phone_list, (GFunc) g_free, NULL);
- g_list_free(e_contact_editor->phone_list);
- }
- if (e_contact_editor->phone_info) {
- g_free(e_contact_editor->phone_info);
- }
- if (e_contact_editor->phone_popup) {
- gtk_widget_unref(e_contact_editor->phone_popup);
- }
-
- if (e_contact_editor->address_list) {
- g_list_foreach(e_contact_editor->address_list, (GFunc) g_free, NULL);
- g_list_free(e_contact_editor->address_list);
- }
- if (e_contact_editor->address_info) {
- g_free(e_contact_editor->address_info);
- }
- if (e_contact_editor->address_popup) {
- gtk_widget_unref(e_contact_editor->address_popup);
- }
-
- if (e_contact_editor->simple)
- gtk_object_unref(GTK_OBJECT(e_contact_editor->simple));
-
- g_free (e_contact_editor->company);
-
- gtk_object_unref(GTK_OBJECT(e_contact_editor->gui));
-}
-
-EContactEditor *
-e_contact_editor_new (ECard *card, gboolean is_new_card)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (gtk_type_new (E_CONTACT_EDITOR_TYPE));
-
- gtk_object_set (GTK_OBJECT (ce),
- "card", card,
- "is_new_card", is_new_card,
- NULL);
-
- gtk_widget_show (ce->app);
- return ce;
-}
-
-static void
-e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EContactEditor *editor;
-
- editor = E_CONTACT_EDITOR (o);
-
- switch (arg_id){
- case ARG_CARD:
- if (editor->card)
- gtk_object_unref(GTK_OBJECT(editor->card));
- editor->card = e_card_duplicate(E_CARD(GTK_VALUE_OBJECT (*arg)));
- gtk_object_set(GTK_OBJECT(editor->simple),
- "card", editor->card,
- NULL);
- fill_in_info(editor);
- break;
-
- case ARG_IS_NEW_CARD:
- editor->is_new_card = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE;
- break;
- }
-}
-
-static void
-e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EContactEditor *e_contact_editor;
-
- e_contact_editor = E_CONTACT_EDITOR (object);
-
- switch (arg_id) {
- case ARG_CARD:
- e_card_simple_sync_card(e_contact_editor->simple);
- extract_info(e_contact_editor);
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_contact_editor->card);
- break;
-
- case ARG_IS_NEW_CARD:
- GTK_VALUE_BOOL (*arg) = e_contact_editor->is_new_card ? TRUE : FALSE;
- break;
-
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-_popup_position(GtkMenu *menu,
- gint *x,
- gint *y,
- gpointer data)
-{
- GtkWidget *button = GTK_WIDGET(data);
- GtkRequisition request;
- int mh, mw;
- gdk_window_get_origin (button->window, x, y);
- *x += button->allocation.width;
- *y += button->allocation.height;
-
- gtk_widget_size_request(GTK_WIDGET(menu), &request);
-
- mh = request.height;
- mw = request.width;
-
- *x -= mw;
- if (*x < 0)
- *x = 0;
-
- if (*y < 0)
- *y = 0;
-
- if ((*x + mw) > gdk_screen_width ())
- *x = gdk_screen_width () - mw;
-
- if ((*y + mh) > gdk_screen_height ())
- *y = gdk_screen_height () - mh;
-}
-
-static gint
-_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor, GtkWidget *popup, GList **list, GnomeUIInfo **info, gchar *label, gchar *entry, gchar *dialog_title)
-{
- gint menu_item;
- gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "button_press_event");
- gtk_widget_realize(popup);
- menu_item = gnome_popup_menu_do_popup_modal(popup, _popup_position, widget, button, editor);
- if ( menu_item != -1 ) {
-#if 0
- if (menu_item == g_list_length (*list)) {
- e_contact_editor_build_dialog(editor, entry, label, dialog_title, list, info);
- } else {
-#endif
- GtkWidget *label_widget = glade_xml_get_widget(editor->gui, label);
- if (label_widget && GTK_IS_LABEL(label_widget)) {
- gtk_object_set(GTK_OBJECT(label_widget),
- "label", g_list_nth_data(*list, menu_item),
- NULL);
- }
-#if 0
- }
-#endif
- }
- return menu_item;
-}
-
-static void
-e_contact_editor_build_ui_info(GList *list, GnomeUIInfo **infop)
-{
- GnomeUIInfo *info;
- GnomeUIInfo singleton = { GNOME_APP_UI_TOGGLEITEM, NULL, NULL, NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, 0, 0, 0, NULL };
- GnomeUIInfo end = GNOMEUIINFO_END;
- int length;
- int i;
-
- info = *infop;
-
- if ( info )
- g_free(info);
- length = g_list_length( list );
- info = g_new(GnomeUIInfo, length + 2);
- for (i = 0; i < length; i++) {
- info[i] = singleton;
- info[i].label = _(list->data);
- list = list->next;
- }
- info[i] = end;
-
- *infop = info;
-}
-
-#if 0
-static void
-_dialog_clicked(GtkWidget *dialog, gint button, EContactEditor *editor)
-{
- GtkWidget *label = gtk_object_get_data(GTK_OBJECT(dialog),
- "e_contact_editor_label");
-
- GtkWidget *dialog_entry = gtk_object_get_data(GTK_OBJECT(dialog),
- "e_contact_editor_dialog_entry");
-
- GList **list = gtk_object_get_data(GTK_OBJECT(dialog),
- "e_contact_editor_list");
- GList **info = gtk_object_get_data(GTK_OBJECT(dialog),
- "e_contact_editor_info");
- switch (button) {
- case 0:
- if (label && GTK_IS_LABEL(label)) {
- gtk_object_set(GTK_OBJECT(label),
- "label", gtk_entry_get_text(GTK_ENTRY(dialog_entry)),
- NULL);
- *list = g_list_append(*list, g_strdup(gtk_entry_get_text(GTK_ENTRY(dialog_entry))));
- g_free(*info);
- *info = NULL;
- }
- break;
- }
- gnome_dialog_close(GNOME_DIALOG(dialog));
-}
-
-static void
-_dialog_destroy(EContactEditor *editor, GtkWidget *dialog)
-{
- gnome_dialog_close(GNOME_DIALOG(dialog));
-}
-
-static GtkWidget *
-e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info)
-{
- GtkWidget *dialog_entry = gtk_entry_new();
- GtkWidget *entry = glade_xml_get_widget(editor->gui, entry_id);
- GtkWidget *label = glade_xml_get_widget(editor->gui, label_id);
-
- GtkWidget *dialog = gnome_dialog_new(title,
- NULL);
-
- gtk_container_add(GTK_CONTAINER(GNOME_DIALOG(dialog)->vbox),
- gtk_widget_new (gtk_frame_get_type(),
- "border_width", 4,
- "label", title,
- "child", gtk_widget_new(gtk_alignment_get_type(),
- "child", dialog_entry,
- "xalign", .5,
- "yalign", .5,
- "xscale", 1.0,
- "yscale", 1.0,
- "border_width", 9,
- NULL),
- NULL));
-
- gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(dialog),
- "Add",
- GNOME_STOCK_PIXMAP_ADD);
- gnome_dialog_append_button(GNOME_DIALOG(dialog), GNOME_STOCK_BUTTON_CANCEL);
- gnome_dialog_set_default(GNOME_DIALOG(dialog), 0);
-
- gtk_signal_connect(GTK_OBJECT(dialog), "clicked",
- _dialog_clicked, editor);
- gtk_signal_connect_while_alive(GTK_OBJECT(editor), "destroy",
- _dialog_destroy, GTK_OBJECT(dialog), GTK_OBJECT(dialog));
-
- gtk_object_set_data(GTK_OBJECT(dialog),
- "e_contact_editor_entry", entry);
- gtk_object_set_data(GTK_OBJECT(dialog),
- "e_contact_editor_label", label);
- gtk_object_set_data(GTK_OBJECT(dialog),
- "e_contact_editor_dialog_entry", dialog_entry);
- gtk_object_set_data(GTK_OBJECT(dialog),
- "e_contact_editor_list", list);
- gtk_object_set_data(GTK_OBJECT(dialog),
- "e_contact_editor_info", info);
-
- gtk_widget_show_all(dialog);
- return dialog;
-}
-#endif
-
-static void
-_phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor)
-{
- int which;
- int i;
- gchar *label;
- gchar *entry;
- int result;
- if ( widget == glade_xml_get_widget(editor->gui, "button-phone1") ) {
- which = 1;
- } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone2") ) {
- which = 2;
- } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone3") ) {
- which = 3;
- } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone4") ) {
- which = 4;
- } else
- return;
-
- label = g_strdup_printf("label-phone%d", which);
- entry = g_strdup_printf("entry-phone%d", which);
-
- if (editor->phone_list == NULL) {
- static char *info[] = {
- N_("Assistant"),
- N_("Business"),
- N_("Business 2"),
- N_("Business Fax"),
- N_("Callback"),
- N_("Car"),
- N_("Company"),
- N_("Home"),
- N_("Home 2"),
- N_("Home Fax"),
- N_("ISDN"),
- N_("Mobile"),
- N_("Other"),
- N_("Other Fax"),
- N_("Pager"),
- N_("Primary"),
- N_("Radio"),
- N_("Telex"),
- N_("TTY/TDD")
- };
-
- for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) {
- editor->phone_list = g_list_append(editor->phone_list, g_strdup(info[i]));
- }
- }
- if (editor->phone_info == NULL) {
- e_contact_editor_build_ui_info(editor->phone_list, &editor->phone_info);
-
- if ( editor->phone_popup )
- gtk_widget_unref(editor->phone_popup);
-
- editor->phone_popup = gnome_popup_menu_new(editor->phone_info);
- }
-
- for(i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) {
- const ECardPhone *phone = e_card_simple_get_phone(editor->simple, i);
- gboolean checked;
- checked = phone && phone->number && *phone->number;
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->phone_info[i].widget),
- checked);
- gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(editor->phone_info[i].widget),
- TRUE);
- }
-
- result = _arrow_pressed (widget, button, editor, editor->phone_popup, &editor->phone_list, &editor->phone_info, label, entry, "Add new phone number type");
-
- if (result != -1) {
- editor->phone_choice[which - 1] = result;
- set_fields(editor);
- }
-
- g_free(label);
- g_free(entry);
-}
-
-static void
-_email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor)
-{
- int i;
- int result;
- if (editor->email_list == NULL) {
- static char *info[] = {
- N_("Primary Email"),
- N_("Email 2"),
- N_("Email 3")
- };
-
- for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) {
- editor->email_list = g_list_append(editor->email_list, g_strdup(info[i]));
- }
- }
- if (editor->email_info == NULL) {
- e_contact_editor_build_ui_info(editor->email_list, &editor->email_info);
-
- if ( editor->email_popup )
- gtk_widget_unref(editor->email_popup);
-
- editor->email_popup = gnome_popup_menu_new(editor->email_info);
- }
-
- for(i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) {
- const char *string = e_card_simple_get_email(editor->simple, i);
- gboolean checked;
- checked = string && *string;
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->email_info[i].widget),
- checked);
- gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(editor->email_info[i].widget),
- TRUE);
- }
-
- result = _arrow_pressed (widget, button, editor, editor->email_popup, &editor->email_list, &editor->email_info, "label-email1", "entry-email1", "Add new Email type");
-
- if (result != -1) {
- editor->email_choice = result;
- set_fields(editor);
- }
-}
-
-static void
-_address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor)
-{
- int i;
- int result;
- if (editor->address_list == NULL) {
- static char *info[] = {
- N_("Business"),
- N_("Home"),
- N_("Other")
- };
-
- for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) {
- editor->address_list = g_list_append(editor->address_list, g_strdup(info[i]));
- }
- }
- if (editor->address_info == NULL) {
- e_contact_editor_build_ui_info(editor->address_list, &editor->address_info);
-
- if ( editor->address_popup )
- gtk_widget_unref(editor->address_popup);
-
- editor->address_popup = gnome_popup_menu_new(editor->address_info);
- }
-
- for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) {
- const ECardAddrLabel *address = e_card_simple_get_address(editor->simple, i);
- gboolean checked;
- checked = address && address->data && *address->data;
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->address_info[i].widget),
- checked);
- gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(editor->address_info[i].widget),
- TRUE);
- }
-
- result = _arrow_pressed (widget, button, editor, editor->address_popup, &editor->address_list, &editor->address_info, "label-address", "text-address", "Add new Address type");
-
- if (result != -1) {
- set_address_field(editor, result);
- }
-}
-
-static void
-set_field(GtkEntry *entry, const char *string)
-{
- char *oldstring = gtk_entry_get_text(entry);
- if (!string)
- string = "";
- if (strcmp(string, oldstring))
- gtk_entry_set_text(entry, string);
-}
-
-static void
-set_phone_field(GtkWidget *entry, const ECardPhone *phone)
-{
- set_field(GTK_ENTRY(entry), phone ? phone->number : "");
-}
-
-static void
-set_fields(EContactEditor *editor)
-{
- GtkWidget *entry;
-
- entry = glade_xml_get_widget(editor->gui, "entry-phone1");
- if (entry && GTK_IS_ENTRY(entry))
- set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[0]));
-
- entry = glade_xml_get_widget(editor->gui, "entry-phone2");
- if (entry && GTK_IS_ENTRY(entry))
- set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[1]));
-
- entry = glade_xml_get_widget(editor->gui, "entry-phone3");
- if (entry && GTK_IS_ENTRY(entry))
- set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[2]));
-
- entry = glade_xml_get_widget(editor->gui, "entry-phone4");
- if (entry && GTK_IS_ENTRY(entry))
- set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[3]));
-
- entry = glade_xml_get_widget(editor->gui, "entry-email1");
- if (entry && GTK_IS_ENTRY(entry))
- set_field(GTK_ENTRY(entry), e_card_simple_get_email(editor->simple, editor->email_choice));
-
- set_address_field(editor, -1);
-}
-
-static void
-set_address_field(EContactEditor *editor, int result)
-{
- GtkWidget *widget;
-
- widget = glade_xml_get_widget(editor->gui, "text-address");
-
- if (widget && GTK_IS_TEXT(widget)) {
- int position;
- GtkEditable *editable;
- const ECardAddrLabel *address;
-
- if (result == -1)
- result = editor->address_choice;
- editor->address_choice = -1;
-
- position = 0;
- editable = GTK_EDITABLE(widget);
- gtk_editable_delete_text(editable, 0, -1);
- address = e_card_simple_get_address(editor->simple, result);
- if (address && address->data)
- gtk_editable_insert_text(editable, address->data, strlen(address->data), &position);
-
- editor->address_choice = result;
- }
-}
-
-static void
-add_field_callback(GtkWidget *widget, EContactEditor *editor)
-{
- const char *name;
- int i;
- static const char *builtins[] = {
- "entry-fullname",
- "entry-web",
- "entry-company",
- "entry-department",
- "entry-office",
- "entry-jobtitle",
- "entry-profession",
- "entry-manager",
- "entry-assistant",
- "entry-nickname",
- "entry-spouse",
- "text-comments",
- "entry-categories",
- "entry-contacts",
- "entry-file-as",
- "dateedit-anniversary",
- "dateedit-birthday",
- "entry-phone1",
- "entry-phone2",
- "entry-phone3",
- "entry-phone4",
- "entry-email1",
- "text-address",
- "checkbutton-mailingaddress",
- "checkbutton-htmlmail",
- NULL
- };
- name = glade_get_widget_name(widget);
- if (name) {
- for (i = 0; builtins[i]; i++) {
- if (!strcmp(name, builtins[i]))
- return;
- }
- if (GTK_IS_ENTRY(widget) || GTK_IS_TEXT(widget)) {
- editor->arbitrary_fields = g_list_prepend(editor->arbitrary_fields, g_strdup(name));
- }
- }
-}
-
-struct {
- char *id;
- char *key;
-} field_mapping [] = {
- { "entry-fullname", "full_name" },
- { "entry-web", "url" },
- { "entry-company", "org" },
- { "entry-department", "org_unit" },
- { "entry-office", "office" },
- { "entry-jobtitle", "title" },
- { "entry-profession", "role" },
- { "entry-manager", "manager" },
- { "entry-assistant", "assistant" },
- { "entry-nickname", "nickname" },
- { "entry-spouse", "spouse" },
- { "text-comments", "note" },
- { "entry-categories", "categories" },
-};
-
-static void
-fill_in_field(EContactEditor *editor, char *id, char *value)
-{
- GtkWidget *widget = glade_xml_get_widget(editor->gui, id);
- if (widget && GTK_IS_EDITABLE(widget)) {
- int position = 0;
- GtkEditable *editable = GTK_EDITABLE(widget);
- gtk_editable_delete_text(editable, 0, -1);
- if (value)
- gtk_editable_insert_text(editable, value, strlen(value), &position);
- }
-}
-
-static void
-fill_in_card_field(EContactEditor *editor, ECard *card, char *id, char *key)
-{
- char *string;
- gtk_object_get(GTK_OBJECT(card),
- key, &string,
- NULL);
- fill_in_field(editor, id, string);
-}
-
-static void
-fill_in_single_field(EContactEditor *editor, char *name)
-{
- ECardSimple *simple = editor->simple;
- GtkWidget *widget = glade_xml_get_widget(editor->gui, name);
- if (widget && GTK_IS_EDITABLE(widget)) {
- int position = 0;
- GtkEditable *editable = GTK_EDITABLE(widget);
- const ECardArbitrary *arbitrary;
-
- gtk_editable_delete_text(editable, 0, -1);
- arbitrary = e_card_simple_get_arbitrary(simple,
- name);
- if (arbitrary && arbitrary->value)
- gtk_editable_insert_text(editable, arbitrary->value, strlen(arbitrary->value), &position);
- }
-}
-
-static void
-fill_in_info(EContactEditor *editor)
-{
- ECard *card = editor->card;
- if (card) {
- char *file_as;
- ECardName *name;
- const ECardDate *anniversary;
- const ECardDate *bday;
- int i;
- GtkWidget *widget;
- GList *list;
-
- gtk_object_get(GTK_OBJECT(card),
- "file_as", &file_as,
- "name", &name,
- "anniversary", &anniversary,
- "birth_date", &bday,
- NULL);
-
- for (i = 0; i < sizeof(field_mapping) / sizeof(field_mapping[0]); i++) {
- fill_in_card_field(editor, card, field_mapping[i].id, field_mapping[i].key);
- }
-
- for (list = editor->arbitrary_fields; list; list = list->next) {
- fill_in_single_field(editor, list->data);
- }
-
- /* File as has to come after company and name or else it'll get messed up when setting them. */
- fill_in_field(editor, "entry-file-as", file_as);
-
- e_card_name_free(editor->name);
- editor->name = e_card_name_copy(name);
-
- widget = glade_xml_get_widget(editor->gui, "dateedit-anniversary");
- if (anniversary && widget && GNOME_IS_DATE_EDIT(widget)) {
- struct tm time_struct = {0,0,0,0,0,0,0,0,0};
- time_t time_val;
- GnomeDateEdit *dateedit;
-
- time_struct.tm_mday = anniversary->day;
- time_struct.tm_mon = anniversary->month - 1;
- time_struct.tm_year = anniversary->year - 1900;
- time_val = mktime(&time_struct);
- dateedit = GNOME_DATE_EDIT(widget);
- gnome_date_edit_set_time(dateedit, time_val);
- }
-
- widget = glade_xml_get_widget(editor->gui, "dateedit-birthday");
- if (bday && widget && GNOME_IS_DATE_EDIT(widget)) {
- struct tm time_struct = {0,0,0,0,0,0,0,0,0};
- time_t time_val;
- GnomeDateEdit *dateedit;
- time_struct.tm_mday = bday->day;
- time_struct.tm_mon = bday->month - 1;
- time_struct.tm_year = bday->year - 1900;
- time_val = mktime(&time_struct);
- dateedit = GNOME_DATE_EDIT(widget);
- gnome_date_edit_set_time(dateedit, time_val);
- }
-
- set_fields(editor);
- }
-}
-
-static void
-extract_field(EContactEditor *editor, ECard *card, char *editable_id, char *key)
-{
- GtkWidget *widget = glade_xml_get_widget(editor->gui, editable_id);
- if (widget && GTK_IS_EDITABLE(widget)) {
- GtkEditable *editable = GTK_EDITABLE(widget);
- char *string = gtk_editable_get_chars(editable, 0, -1);
- if (string && *string)
- gtk_object_set(GTK_OBJECT(card),
- key, string,
- NULL);
- else
- gtk_object_set(GTK_OBJECT(card),
- key, NULL,
- NULL);
- g_free(string);
- }
-}
-
-static void
-extract_single_field(EContactEditor *editor, char *name)
-{
- GtkWidget *widget = glade_xml_get_widget(editor->gui, name);
- ECardSimple *simple = editor->simple;
- if (widget && GTK_IS_EDITABLE(widget)) {
- GtkEditable *editable = GTK_EDITABLE(widget);
- char *string = gtk_editable_get_chars(editable, 0, -1);
-
- if (string && *string)
- e_card_simple_set_arbitrary(simple,
- name,
- NULL,
- string);
- else
- e_card_simple_set_arbitrary(simple,
- name,
- NULL,
- NULL);
- g_free(string);
- }
-}
-
-static void
-extract_info(EContactEditor *editor)
-{
- ECard *card = editor->card;
- if (card) {
- ECardDate *anniversary;
- ECardDate *bday;
- struct tm time_struct;
- time_t time_val;
- int i;
- GtkWidget *widget;
- GList *list;
-
- widget = glade_xml_get_widget(editor->gui, "entry-file-as");
- if (widget && GTK_IS_EDITABLE(widget)) {
- GtkEditable *editable = GTK_EDITABLE(widget);
- char *string = gtk_editable_get_chars(editable, 0, -1);
- if (string && *string)
- gtk_object_set(GTK_OBJECT(card),
- "file_as", string,
- NULL);
- g_free(string);
- }
-
- for (i = 0; i < sizeof(field_mapping) / sizeof(field_mapping[0]); i++) {
- extract_field(editor, card, field_mapping[i].id, field_mapping[i].key);
- }
-
- for (list = editor->arbitrary_fields; list; list = list->next) {
- extract_single_field(editor, list->data);
- }
-
- if (editor->name)
- gtk_object_set(GTK_OBJECT(card),
- "name", editor->name,
- NULL);
-
- widget = glade_xml_get_widget(editor->gui, "dateedit-anniversary");
- if (widget && GNOME_IS_DATE_EDIT(widget)) {
- time_val = gnome_date_edit_get_date(GNOME_DATE_EDIT(widget));
- gmtime_r(&time_val,
- &time_struct);
- anniversary = g_new(ECardDate, 1);
- anniversary->day = time_struct.tm_mday;
- anniversary->month = time_struct.tm_mon + 1;
- anniversary->year = time_struct.tm_year + 1900;
- gtk_object_set(GTK_OBJECT(card),
- "anniversary", anniversary,
- NULL);
- }
-
- widget = glade_xml_get_widget(editor->gui, "dateedit-birthday");
- if (widget && GNOME_IS_DATE_EDIT(widget)) {
- time_val = gnome_date_edit_get_date(GNOME_DATE_EDIT(widget));
- gmtime_r(&time_val,
- &time_struct);
- bday = g_new(ECardDate, 1);
- bday->day = time_struct.tm_mday;
- bday->month = time_struct.tm_mon + 1;
- bday->year = time_struct.tm_year + 1900;
- gtk_object_set(GTK_OBJECT(card),
- "birth_date", bday,
- NULL);
- }
- }
-}
diff --git a/addressbook/contact-editor/e-contact-editor.h b/addressbook/contact-editor/e-contact-editor.h
deleted file mode 100644
index de14b84ca3..0000000000
--- a/addressbook/contact-editor/e-contact-editor.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <glade/glade.h>
-#include <bonobo.h>
-#include <ebook/e-card.h>
-#include <ebook/e-card-simple.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* 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_CONTACT_EDITOR_TYPE (e_contact_editor_get_type ())
-#define E_CONTACT_EDITOR(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_TYPE, EContactEditor))
-#define E_CONTACT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_TYPE, EContactEditorClass))
-#define E_IS_CONTACT_EDITOR(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_TYPE))
-#define E_IS_CONTACT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_TYPE))
-
-
-typedef struct _EContactEditor EContactEditor;
-typedef struct _EContactEditorClass EContactEditorClass;
-
-struct _EContactEditor
-{
- GtkObject object;
-
- /* item specific fields */
- ECard *card;
- ECardSimple *simple;
-
- /* UI handler */
- BonoboUIHandler *uih;
-
- GladeXML *gui;
- GtkWidget *app;
- GnomeUIInfo *email_info;
- GnomeUIInfo *phone_info;
- GnomeUIInfo *address_info;
- GtkWidget *email_popup;
- GtkWidget *phone_popup;
- GtkWidget *address_popup;
- GList *email_list;
- GList *phone_list;
- GList *address_list;
-
- ECardName *name;
- char *company;
-
- ECardSimpleEmailId email_choice;
- ECardSimplePhoneId phone_choice[4];
- ECardSimpleAddressId address_choice;
-
- GList *arbitrary_fields;
-
- /* Whether we are editing a new card or an existing one */
- guint is_new_card : 1;
-};
-
-struct _EContactEditorClass
-{
- GtkObjectClass parent_class;
-
- /* Notification signals */
-
- void (* add_card) (EContactEditor *ce, ECard *card);
- void (* commit_card) (EContactEditor *ce, ECard *card);
- void (* delete_card) (EContactEditor *ce, ECard *card);
- void (* editor_closed) (EContactEditor *ce);
-};
-
-
-EContactEditor *e_contact_editor_new (ECard *card, gboolean is_new_card);
-GtkType e_contact_editor_get_type (void);
-
-
-gboolean e_contact_editor_confirm_delete(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CONTACT_EDITOR_H__ */
diff --git a/addressbook/contact-editor/e-contact-save-as.c b/addressbook/contact-editor/e-contact-save-as.c
deleted file mode 100644
index 51cb2619e7..0000000000
--- a/addressbook/contact-editor/e-contact-save-as.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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-save-as.h>
-#include <e-util/e-util.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-typedef struct {
- GtkFileSelection *filesel;
- ECard *card;
-} SaveAsInfo;
-
-static void
-save_it(GtkWidget *widget, SaveAsInfo *info)
-{
- char *vcard = e_card_get_vcard(info->card);
- const char *filename = gtk_file_selection_get_filename(info->filesel);
- e_write_file(filename, vcard, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC);
- g_free(vcard);
- gtk_object_unref(GTK_OBJECT(info->card));
- gtk_widget_destroy(GTK_WIDGET(info->filesel));
- g_free(info);
-}
-
-static void
-close_it(GtkWidget *widget, SaveAsInfo *info)
-{
- gtk_object_unref(GTK_OBJECT(info->card));
- gtk_widget_destroy(GTK_WIDGET(info->filesel));
- g_free(info);
-}
-
-static void
-delete_it(GtkWidget *widget, SaveAsInfo *info)
-{
- gtk_object_unref(GTK_OBJECT(info->card));
- g_free(info);
-}
-
-void
-e_contact_save_as(char *title, ECard *card)
-{
- GtkFileSelection *filesel;
- SaveAsInfo *info = g_new(SaveAsInfo, 1);
-
- filesel = GTK_FILE_SELECTION(gtk_file_selection_new(title));
-
- info->filesel = filesel;
- info->card = e_card_duplicate(card);
-
- gtk_signal_connect(GTK_OBJECT(filesel->ok_button), "clicked",
- save_it, info);
- gtk_signal_connect(GTK_OBJECT(filesel->cancel_button), "clicked",
- close_it, info);
- gtk_signal_connect(GTK_OBJECT(filesel), "delete_event",
- delete_it, info);
- gtk_widget_show(GTK_WIDGET(filesel));
-}
diff --git a/addressbook/contact-editor/e-contact-save-as.h b/addressbook/contact-editor/e-contact-save-as.h
deleted file mode 100644
index e6af13e8fd..0000000000
--- a/addressbook/contact-editor/e-contact-save-as.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-save-as.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_SAVE_AS_H__
-#define __E_CONTACT_SAVE_AS_H__
-
-#include <gnome.h>
-#include <glade/glade.h>
-#include <ebook/e-card.h>
-#include <ebook/e-card-simple.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-void
-e_contact_save_as(gchar *title, ECard *card);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CONTACT_EDITOR_H__ */
diff --git a/addressbook/contact-editor/email.png b/addressbook/contact-editor/email.png
deleted file mode 100644
index f3ff02e343..0000000000
--- a/addressbook/contact-editor/email.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/contact-editor/fullname-strings.h b/addressbook/contact-editor/fullname-strings.h
deleted file mode 100644
index 0c84dfdc8f..0000000000
--- a/addressbook/contact-editor/fullname-strings.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Check Full Name");
-gchar *s = N_("_Title:");
-gchar *s = N_("_First:");
-gchar *s = N_("_Middle:");
-gchar *s = N_("_Last:");
-gchar *s = N_("_Suffix:");
-gchar *s = N_("\n"
- "Mr.\n"
- "Mrs.\n"
- "Dr.\n"
- "");
-gchar *s = N_("\n"
- "Sr.\n"
- "Jr.\n"
- "I\n"
- "II\n"
- "III\n"
- "Esq.\n"
- "");
diff --git a/addressbook/contact-editor/fullname.glade b/addressbook/contact-editor/fullname.glade
deleted file mode 100644
index 8f811c5616..0000000000
--- a/addressbook/contact-editor/fullname.glade
+++ /dev/null
@@ -1,391 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>fullname</name>
- <program_name>fullname</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>True</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>fullname-strings.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog-checkfullname</name>
- <visible>False</visible>
- <title>Check Full Name</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>True</modal>
- <allow_shrink>True</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>vbox-container</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table-checkfullname</name>
- <border_width>8</border_width>
- <rows>5</rows>
- <columns>3</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>6</row_spacing>
- <column_spacing>21</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel1</name>
- <label>_Title:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel2</name>
- <label>_First:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel3</name>
- <label>_Middle:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel4</name>
- <label>_Last:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel5</name>
- <label>_Suffix:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo-title</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>False</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items>
-Mr.
-Mrs.
-Dr.
-</items>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>entry-title</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo-suffix</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>False</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items>
-Sr.
-Jr.
-I
-II
-III
-Esq.
-</items>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>entry-suffix</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-first</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-middle</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-last</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>hbuttonbox1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button2</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/contact-editor/head.png b/addressbook/contact-editor/head.png
deleted file mode 100644
index ca00b75f92..0000000000
--- a/addressbook/contact-editor/head.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/contact-editor/netfreebusy.png b/addressbook/contact-editor/netfreebusy.png
deleted file mode 100644
index 09ec8a2a5c..0000000000
--- a/addressbook/contact-editor/netfreebusy.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/contact-editor/netmeeting.png b/addressbook/contact-editor/netmeeting.png
deleted file mode 100644
index 4cb90c121e..0000000000
--- a/addressbook/contact-editor/netmeeting.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/contact-editor/phone.png b/addressbook/contact-editor/phone.png
deleted file mode 100644
index ebec84ba0b..0000000000
--- a/addressbook/contact-editor/phone.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/contact-editor/snailmail.png b/addressbook/contact-editor/snailmail.png
deleted file mode 100644
index 647ae8f68c..0000000000
--- a/addressbook/contact-editor/snailmail.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/contact-editor/test-editor.c b/addressbook/contact-editor/test-editor.c
deleted file mode 100644
index 80db2fe848..0000000000
--- a/addressbook/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 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <glade/glade.h>
-#include "e-contact-editor.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@helixcode.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--;
- gtk_object_unref (GTK_OBJECT (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, Helix Code, 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;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "Contact Editor Test", VERSION, argc, argv);
-
- glade_gnome_init ();
-
- cardstr = NULL;
- if (argc == 2)
- cardstr = read_file (argv [1]);
-
- if (cardstr == NULL)
- cardstr = TEST_VCARD;
-
- ce = e_contact_editor_new (e_card_new (cardstr), TRUE);
- gtk_signal_connect (GTK_OBJECT (ce), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), NULL);
-
- ce = e_contact_editor_new (e_card_new (cardstr), TRUE);
- gtk_signal_connect (GTK_OBJECT (ce), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), NULL);
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/contact-editor/web.png b/addressbook/contact-editor/web.png
deleted file mode 100644
index 3211a11b19..0000000000
--- a/addressbook/contact-editor/web.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/demo/.cvsignore b/addressbook/demo/.cvsignore
deleted file mode 100644
index a0427f184f..0000000000
--- a/addressbook/demo/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
-evolution-addressbook
-test-addressbook \ No newline at end of file
diff --git a/addressbook/demo/Makefile.am b/addressbook/demo/Makefile.am
deleted file mode 100644
index 1a7e4e6d01..0000000000
--- a/addressbook/demo/Makefile.am
+++ /dev/null
@@ -1,63 +0,0 @@
-INCLUDES = \
- $(EXTRA_GNOME_CFLAGS) \
- $(GNOME_INCLUDEDIR) \
- -I$(top_srcdir)/widgets/e-text \
- -I$(top_srcdir)/e-util \
- -I$(top_srcdir)/widgets/e-table \
- -I$(top_srcdir) \
- -I$(top_srcdir)/widgets/e-minicard \
- -I$(top_srcdir)/addressbook/backend/ebook \
- $(BONOBO_HTML_GNOME_CFLAGS) \
- -DEVOLUTION_VERSION=\""$(VERSION)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \
- -DEVOLUTION_LOCALEDIR=\""$(datadir)/locale"\" \
- -DCAMEL_PROVIDERDIR=\""$(providerdir)"\" \
- -DG_LOG_DOMAIN=\"addressbook-demo\"
-
-noinst_PROGRAMS = \
- test-addressbook
-
-test_addressbook_SOURCES = \
- demo.c \
- e-test-model.c \
- e-test-model.h
-
-test_addressbook_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(BONOBO_HTML_GNOME_LIBS) \
- $(top_builddir)/widgets/e-minicard/libeminicard.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/libversit/libversit.la
-
-test_addressbook_LDFLAGS = `gnome-config --libs gdk_pixbuf`
-
-bin_PROGRAMS = \
- evolution-addressbook
-
-evolution_addressbook_SOURCES = \
- addressbook-factory.c \
- addressbook-widget.c \
- addressbook-widget.h \
- addressbook.c \
- addressbook.h \
- e-test-model.c \
- e-test-model.h
-
-evolution_addressbook_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(BONOBO_HTML_GNOME_LIBS) \
- $(top_builddir)/widgets/e-minicard/libeminicard.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/libversit/libversit.la
-
-evolution_addressbook_LDFLAGS = `gnome-config --libs gdk_pixbuf`
-
-gnorbadir = $(sysconfdir)/CORBA/servers
-gnorba_DATA = addressbook.gnorba
diff --git a/addressbook/demo/addressbook-factory.c b/addressbook/demo/addressbook-factory.c
deleted file mode 100644
index cf59177f84..0000000000
--- a/addressbook/demo/addressbook-factory.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * sample-control-factory.c
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * Author:
- * Nat Friedman (nat@nat.org)
- *
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <libgnorba/gnorba.h>
-#include <bonobo.h>
-
-#include "addressbook.h"
-
-CORBA_Environment ev;
-CORBA_ORB orb;
-
-static void
-init_bonobo (int argc, char **argv)
-{
-
- gnome_CORBA_init_with_popt_table (
- "evolution-addressbook", "0.0",
- &argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
-
- orb = gnome_CORBA_ORB ();
-
- if (bonobo_init (orb, NULL, NULL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-}
-
-int
-main (int argc, char **argv)
-{
- CORBA_exception_init (&ev);
-
- init_bonobo (argc, argv);
-
- addressbook_factory_init ();
-
- bonobo_main ();
-
- return 0;
-}
diff --git a/addressbook/demo/addressbook-widget.c b/addressbook/demo/addressbook-widget.c
deleted file mode 100644
index a4e4fb95e7..0000000000
--- a/addressbook/demo/addressbook-widget.c
+++ /dev/null
@@ -1,533 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * demo.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include <gnome-xml/tree.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-#include "e-util/e-cursors.h"
-#include "e-canvas.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-#include "e-reflow.h"
-#include "e-minicard.h"
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "e-test-model.h"
-
-#include "addressbook-widget.h"
-
-#define COLS 4
-
-/* Here we define the initial layout of the table. This is an xml
- format that allows you to change the initial ordering of the
- columns or to do sorting or grouping initially. This specification
- shows all 5 columns, but moves the importance column nearer to the
- front. It also sorts by the "Full Name" column (ascending.)
- Sorting and grouping take the model column as their arguments
- (sorting is specified by the "column" argument to the leaf elemnt. */
-#define INITIAL_SPEC "<ETableSpecification> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 1 </column> \
- <column> 2 </column> \
- <column> 3 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-char *headers[COLS] = {
- "Email",
- "Full Name",
- "Address",
- "Phone"
-};
-
-static int window_count = 0;
-static GHashTable *models = NULL;
-
-static void
-remove_model(ETableModel *model, gchar *filename)
-{
- g_hash_table_remove(models, filename);
- g_free(filename);
-}
-
-static ETestModel *
-get_model(char *filename)
-{
- ETestModel *model;
- gboolean free_filename = FALSE;
-
- if ( filename == NULL ) {
- filename = gnome_util_prepend_user_home("addressbook.xml");
- free_filename = TRUE;
- }
-
- if ( models == NULL ) {
- models = g_hash_table_new(g_str_hash, g_str_equal);
- }
-
- model = g_hash_table_lookup(models, filename);
- if ( model ) {
- if (free_filename)
- g_free(filename);
- return model;
- }
-
- if ( !free_filename )
- filename = g_strdup(filename);
-
- model = E_TEST_MODEL(e_test_model_new(filename));
- g_hash_table_insert(models,
- filename, model);
- gtk_signal_connect(GTK_OBJECT(model), "destroy",
- GTK_SIGNAL_FUNC(remove_model), filename);
-
- return model;
-}
-
-static void
-add_address_cb(GtkWidget *button, gpointer data)
-{
- View *view = (View *) data;
- Address *newadd = g_new(Address, 1);
- newadd->email = g_strdup("");
- newadd->phone = g_strdup("");
- newadd->full_name = g_strdup("");
- newadd->street = g_strdup("");
- e_test_model_add_column (view->model, newadd);
-}
-
-static void
-rebuild_reflow(ETableModel *model, gpointer data)
-{
- int i;
- View *view = (View *) data;
- Reflow *reflow = view->reflow;
- if (!reflow)
- return;
- gtk_object_destroy(GTK_OBJECT(reflow->reflow));
- reflow->reflow = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( reflow->canvas ) ),
- e_reflow_get_type(),
- "height", (double) reflow->last_alloc.height,
- "minimum_width", (double) reflow->last_alloc.width,
- NULL );
-
- for ( i = 0; i < view->model->data_count; i++ )
- {
- GnomeCanvasItem *item;
- item = gnome_canvas_item_new( GNOME_CANVAS_GROUP(reflow->reflow),
- e_minicard_get_type(),
- "model", view->model,
- "row", i,
- NULL);
- e_reflow_add_item(E_REFLOW(reflow->reflow), item);
- }
- e_canvas_item_request_reflow(reflow->reflow);
-}
-
-static void
-destroy_reflow(View *view)
-{
- Reflow *reflow = view->reflow;
- if ( !reflow )
- return;
-
- gtk_signal_disconnect(GTK_OBJECT(view->model),
- reflow->model_changed_id);
- g_free(reflow);
- gtk_object_unref(GTK_OBJECT(view->model));
- view->reflow = NULL;
-}
-
-static void
-destroy_callback(GtkWidget *app, gpointer data)
-{
- View *view = (View *)data;
- if ( view->reflow ) {
- destroy_reflow(view);
- }
- gtk_object_unref(GTK_OBJECT(view->model));
- g_free(view);
- window_count --;
- if ( window_count <= 0 )
- gtk_main_quit();
-}
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data)
-{
- double width;
- View *view = (View *)data;
- Reflow *reflow = view->reflow;
- if ( !reflow )
- return;
- reflow->last_alloc = *allocation;
- gnome_canvas_item_set( reflow->reflow,
- "height", (double) allocation->height,
- NULL );
- gnome_canvas_item_set( reflow->reflow,
- "minimum_width", (double) allocation->width,
- NULL );
- gtk_object_get(GTK_OBJECT(reflow->reflow),
- "width", &width,
- NULL);
- width = MAX(width, allocation->width);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( reflow->canvas ), 0, 0, width, allocation->height );
- gnome_canvas_item_set( reflow->rect,
- "x2", (double) width,
- "y2", (double) allocation->height,
- NULL );
-}
-
-static void resize(ECanvas *canvas, gpointer data)
-{
- double width;
- View *view = (View *)data;
- Reflow *reflow = view->reflow;
- if ( !reflow )
- return;
- gtk_object_get(GTK_OBJECT(reflow->reflow),
- "width", &width,
- NULL);
- width = MAX(width, reflow->last_alloc.width);
- gnome_canvas_set_scroll_region(GNOME_CANVAS(reflow->canvas), 0, 0, width, reflow->last_alloc.height );
- gnome_canvas_item_set( reflow->rect,
- "x2", (double) width,
- "y2", (double) reflow->last_alloc.height,
- NULL );
-}
-
-static void
-canvas_realized(GtkLayout *layout, View *view)
-{
- gdk_window_set_back_pixmap( layout->bin_window, NULL, FALSE);
-}
-
-static GtkWidget *
-create_reflow(View *view)
-{
- GtkWidget *inner_vbox;
- GtkWidget *scrollbar;
- int i;
- Reflow *reflow = g_new(Reflow, 1);
- view->reflow = reflow;
-
- view->type = VIEW_TYPE_REFLOW;
-
- /* Next we create our model. This uses the functions we defined
- earlier. */
-
- inner_vbox = gtk_vbox_new(FALSE, 0);
- reflow->canvas = e_canvas_new();
- reflow->rect = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( reflow->canvas ) ),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) 100,
- "y2", (double) 100,
- "fill_color", "white",
- NULL );
- reflow->reflow = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( reflow->canvas ) ),
- e_reflow_get_type(),
- "height", (double) 100,
- "minimum_width", (double) 100,
- NULL );
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( reflow->canvas ), "reflow",
- GTK_SIGNAL_FUNC( resize ),
- ( gpointer ) view);
-
- for ( i = 0; i < view->model->data_count; i++ )
- {
- GnomeCanvasItem *item;
- item = gnome_canvas_item_new( GNOME_CANVAS_GROUP(reflow->reflow),
- e_minicard_get_type(),
- "model", view->model,
- "row", i,
- NULL);
- e_reflow_add_item(E_REFLOW(reflow->reflow), item);
- }
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( reflow->canvas ),
- 0, 0,
- 100, 100 );
-
- scrollbar = gtk_hscrollbar_new(gtk_layout_get_hadjustment(GTK_LAYOUT(reflow->canvas)));
-
- gtk_signal_connect( GTK_OBJECT( reflow->canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( allocate_callback ),
- ( gpointer ) view );
-
- gtk_signal_connect( GTK_OBJECT(reflow->canvas), "realize",
- GTK_SIGNAL_FUNC(canvas_realized), view);
-
- reflow->model_changed_id = gtk_signal_connect(GTK_OBJECT( view->model ), "model_changed",
- GTK_SIGNAL_FUNC(rebuild_reflow), view);
-
- gtk_object_ref(GTK_OBJECT(view->model));
-
- /* Build the gtk widget hierarchy. */
- gtk_box_pack_start(GTK_BOX(inner_vbox), reflow->canvas, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(inner_vbox), scrollbar, FALSE, FALSE, 0);
-
- return inner_vbox;
-}
-
-/* We create a window containing our new table. */
-static GtkWidget *
-create_table(View *view)
-{
- ECell *cell_left_just;
- ETableHeader *e_table_header;
- GtkWidget *e_table;
- int i;
-
- view->type = VIEW_TYPE_TABLE;
-
- /*
- Next we create a header. The ETableHeader is used in two
- different way. The first is the full_header. This is the
- list of possible columns in the view. The second use is
- completely internal. Many of the ETableHeader functions are
- for that purpose. The only functions we really need are
- e_table_header_new and e_table_header_add_col.
-
- First we create the header. */
- e_table_header = e_table_header_new ();
-
- /* Next we have to build renderers for all of the columns.
- Since all our columns are text columns, we can simply use
- the same renderer over and over again. If we had different
- types of columns, we could use a different renderer for
- each column. */
- cell_left_just = e_cell_text_new (E_TABLE_MODEL(view->model), NULL, GTK_JUSTIFY_LEFT);
-
- /* Next we create a column object for each view column and add
- them to the header. We don't create a column object for
- the importance column since it will not be shown. */
- for (i = 0; i < LAST_COL; i++){
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, headers [i],
- 80, 20, cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /* 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. */
- e_table = e_table_new_from_spec_file (e_table_header, E_TABLE_MODEL(view->model), "spec");
-
-#if 0
- gtk_signal_connect(GTK_OBJECT(E_TABLE(e_table)->sort_info), "sort_info_changed",
- GTK_SIGNAL_FUNC(queue_header_save), e_table->sort_info);
-
- gtk_signal_connect(GTK_OBJECT(E_TABLE(e_table)->header), "structure_change",
- GTK_SIGNAL_FUNC(queue_header_save), e_table->sort_info);
- gtk_signal_connect(GTK_OBJECT(E_TABLE(e_table)->header), "dimension_change",
- GTK_SIGNAL_FUNC(queue_header_save), e_table->sort_info);
-#endif
-
- return e_table;
-}
-
-void
-change_type(View *view, ViewType type)
-{
- gtk_object_ref(GTK_OBJECT(view->model));
- if (view->reflow)
- destroy_reflow(view);
- gtk_widget_destroy(view->child);
- switch(type) {
- case VIEW_TYPE_REFLOW:
- view->child = create_reflow(view);
- break;
- case VIEW_TYPE_TABLE:
- view->child = create_table(view);
- break;
- }
- gtk_container_add(GTK_CONTAINER(view->frame), view->child);
- gtk_widget_show_all(view->child);
- gtk_object_unref(GTK_OBJECT(view->model));
-}
-
-View *
-create_view(void)
-{
- View *view = g_new(View, 1);
- ViewType type = VIEW_TYPE_REFLOW;
- GtkWidget *button;
-
- view->reflow = NULL;
-
- view->model = get_model(NULL);
-
- /* This frame is simply to get a bevel around our table. */
- view->frame = gtk_frame_new (NULL);
-
- switch(type) {
- case VIEW_TYPE_REFLOW:
- view->child = create_reflow(view);
- break;
- case VIEW_TYPE_TABLE:
- view->child = create_table(view);
- break;
- }
-
-
- gtk_signal_connect( GTK_OBJECT( view->child ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- view );
-
- /*
- vbox = gtk_vbox_new(FALSE, 0);
- button = gtk_button_new_with_label("Add address");
- gtk_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(add_address_cb), view);
-
- change_button = gtk_button_new_with_label("Change View");
- gtk_signal_connect(GTK_OBJECT(change_button), "clicked",
- GTK_SIGNAL_FUNC(change_callback), view);
- */
- /* Build the gtk widget hierarchy. */
-
- view->widget = gtk_vbox_new(FALSE, 0);
-
- button = gtk_button_new_with_label("Add address");
- gtk_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(add_address_cb), view);
-
- gtk_container_add (GTK_CONTAINER (view->frame), view->child);
- gtk_box_pack_start (GTK_BOX (view->widget), view->frame, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (view->widget), button, FALSE, FALSE, 0);
- /*
- gtk_box_pack_start (GTK_BOX (vbox), change_button, FALSE, FALSE, 0);
- */
- /* Show it all. */
- gtk_widget_show_all (view->widget);
- gtk_object_ref(GTK_OBJECT(view->model));
- gtk_object_sink(GTK_OBJECT(view->model));
- window_count ++;
- return view;
-
-}
-
-#if 0
-static void
-change_callback(GtkWidget *button, View *view)
-{
- if (view->type == VIEW_TYPE_REFLOW)
- change_type(view, VIEW_TYPE_TABLE);
- else
- change_type(view, VIEW_TYPE_REFLOW);
-}
-
-static GtkWidget *
-create_window(char *filename, ViewType type)
-{
- GtkWidget *button;
- GtkWidget *change_button;
- GtkWidget *vbox;
- View *view = g_new(View, 1);
-
- view->reflow = NULL;
-
- view->model = get_model(filename);
-
- /* Here we create a window for our new table. This window
- will get shown and the person will be able to test their
- item. */
- view->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
- gtk_signal_connect( GTK_OBJECT( view->window ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- view );
-
- /* This frame is simply to get a bevel around our table. */
- view->frame = gtk_frame_new (NULL);
-
- switch(type) {
- case VIEW_TYPE_REFLOW:
- view->child = create_reflow(view);
- break;
- case VIEW_TYPE_TABLE:
- view->child = create_table(view);
- break;
- }
-
-
- vbox = gtk_vbox_new(FALSE, 0);
-
- button = gtk_button_new_with_label("Add address");
- gtk_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(add_address_cb), view);
-
- change_button = gtk_button_new_with_label("Change View");
- gtk_signal_connect(GTK_OBJECT(change_button), "clicked",
- GTK_SIGNAL_FUNC(change_callback), view);
-
- /* Build the gtk widget hierarchy. */
-
- gtk_container_add (GTK_CONTAINER (view->frame), view->child);
- gtk_box_pack_start (GTK_BOX (vbox), view->frame, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), change_button, FALSE, FALSE, 0);
- gtk_container_add (GTK_CONTAINER (view->window), vbox);
-
- /* Size the initial window. */
- gtk_widget_set_usize (view->window, 200, 200);
- /* Show it all. */
- gtk_widget_show_all (view->window);
- gtk_object_sink(GTK_OBJECT(view->model));
- window_count ++;
- return view->window;
-}
-
-/* This is the main function which just initializes gnome and call our create_table function */
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- create_window("addressbook.xml", VIEW_TYPE_TABLE);
- create_window("addressbook.xml", VIEW_TYPE_TABLE);
- create_window("addressbook.xml", VIEW_TYPE_TABLE);
- create_window("addressbook.xml", VIEW_TYPE_REFLOW);
- create_window("addressbook2.xml", VIEW_TYPE_TABLE);
- create_window("addressbook2.xml", VIEW_TYPE_REFLOW);
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
-#endif
diff --git a/addressbook/demo/addressbook-widget.h b/addressbook/demo/addressbook-widget.h
deleted file mode 100644
index 9111713da5..0000000000
--- a/addressbook/demo/addressbook-widget.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * demo.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-#ifndef __DEMO_H__
-#define __DEMO_H__
-
-#include "e-test-model.h"
-
-typedef struct _View View;
-
-typedef enum {
- VIEW_TYPE_REFLOW,
- VIEW_TYPE_TABLE
-} ViewType;
-
-typedef struct {
- GtkAllocation last_alloc;
- GnomeCanvasItem *reflow;
- GtkWidget *canvas;
- GnomeCanvasItem *rect;
- int model_changed_id;
-} Reflow;
-
-struct _View {
- ViewType type;
- ETestModel *model;
- GtkWidget *child;
- GtkWidget *frame;
- Reflow *reflow;
-
- GtkWidget *widget;
-};
-
-void change_type(View *view, ViewType type);
-View *create_view(void);
-
-#endif /* __DEMO_H__ */
diff --git a/addressbook/demo/addressbook.c b/addressbook/demo/addressbook.c
deleted file mode 100644
index b273788118..0000000000
--- a/addressbook/demo/addressbook.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * folder-browser-factory.c: A Bonobo Control factory for Folder Browsers
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- *
- * (C) 2000 Helix Code, Inc.
- */
-/*
- * bonobo-clock-control.c
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * Author:
- * Nat Friedman (nat@nat.org)
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <libgnorba/gnorba.h>
-#include <bonobo.h>
-
-#include <libgnomeui/gtk-clock.h>
-
-#include "addressbook-widget.h"
-#include "addressbook.h"
-
-
-
-#if 0
-static void
-bonobo_clock_control_prop_value_changed_cb (BonoboPropertyBag *pb, char *name, char *type,
- gpointer old_value, gpointer new_value,
- gpointer user_data)
-{
- GtkClock *clock = user_data;
-
- if (! strcmp (name, "running")) {
- gboolean *b = new_value;
-
- if (*b)
- gtk_clock_start (clock);
- else
- gtk_clock_stop (clock);
- }
-}
-
-/*
- * Callback routine used to release any values we associated with the control
- * dynamically.
- */
-static void
-release_data (GtkObject *object, void *data)
-{
- g_free (data);
-}
-#endif
-
-
-static void
-control_deactivate (BonoboControl *control, BonoboUIHandler *uih)
-{
- /* how to remove a menu item */
- bonobo_ui_handler_menu_remove (uih, "/Actions/New Contact");
-
- /* remove our toolbar */
- bonobo_ui_handler_dock_remove (uih, "/Toolbar");
-}
-
-static void
-do_nothing_cb (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- printf ("Yow! I am called back!\n");
-}
-
-static GnomeUIInfo gnome_toolbar [] = {
- GNOMEUIINFO_ITEM_STOCK (N_("New"), N_("Create a new contact"), do_nothing_cb, GNOME_STOCK_PIXMAP_NEW),
-
- GNOMEUIINFO_SEPARATOR,
-
- GNOMEUIINFO_ITEM_STOCK (N_("Find"), N_("Find a contact"), do_nothing_cb, GNOME_STOCK_PIXMAP_SEARCH),
- GNOMEUIINFO_ITEM_STOCK (N_("Print"), N_("Print contacts"), do_nothing_cb, GNOME_STOCK_PIXMAP_PRINT),
- GNOMEUIINFO_ITEM_STOCK (N_("Delete"), N_("Delete a contact"), do_nothing_cb, GNOME_STOCK_PIXMAP_TRASH),
-
- GNOMEUIINFO_END
-};
-
-
-
-
-static void
-control_activate (BonoboControl *control, BonoboUIHandler *uih)
-{
- Bonobo_UIHandler remote_uih;
- GtkWidget *toolbar;
- BonoboControl *toolbar_control;
-
- remote_uih = bonobo_control_get_remote_ui_handler (control);
- bonobo_ui_handler_set_container (uih, remote_uih);
- bonobo_object_release_unref (remote_uih, NULL);
-
- bonobo_ui_handler_menu_new_item (uih, "/Actions/New Contact", N_("_New Contact"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0, do_nothing_cb, NULL);
-
- toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL,
- GTK_TOOLBAR_BOTH);
-
- gnome_app_fill_toolbar (GTK_TOOLBAR (toolbar),
- gnome_toolbar,
- NULL);
-
- gtk_widget_show_all (toolbar);
-
- toolbar_control = bonobo_control_new (toolbar);
- bonobo_ui_handler_dock_add (
- uih, "/Toolbar",
- bonobo_object_corba_objref (BONOBO_OBJECT (toolbar_control)),
- GNOME_DOCK_ITEM_BEH_LOCKED |
- GNOME_DOCK_ITEM_BEH_EXCLUSIVE,
- GNOME_DOCK_TOP,
- 1, 1, 0);
-}
-
-static void
-control_activate_cb (BonoboControl *control,
- gboolean activate,
- gpointer user_data)
-{
- BonoboUIHandler *uih;
-
- uih = bonobo_control_get_ui_handler (control);
- g_assert (uih);
-
- if (activate)
- control_activate (control, uih);
- else
- control_deactivate (control, uih);
-}
-
-
-static BonoboObject *
-addressbook_factory (BonoboGenericFactory *Factory, void *closure)
-{
-#if 0
- BonoboPropertyBag *pb;
- CORBA_boolean *running;
-#endif
- BonoboControl *control;
- View *view;
-
- /* Create the control. */
- view = create_view();
- control = bonobo_control_new (view->widget);
-
- gtk_signal_connect (GTK_OBJECT (control), "activate",
- control_activate_cb, NULL);
-#if 0
- /* Create the properties. */
- pb = bonobo_property_bag_new ();
- bonobo_control_set_property_bag (control, pb);
-
- gtk_signal_connect (GTK_OBJECT (pb), "value_changed",
- bonobo_clock_control_prop_value_changed_cb,
- clock);
-
- running = g_new0 (CORBA_boolean, 1);
- *running = TRUE;
- bonobo_property_bag_add (pb, "running", "boolean",
- (gpointer) running,
- NULL, "Whether or not the clock is running", 0);
-
- /*
- * Release "running" when the object is destroyed
- */
- gtk_signal_connect (GTK_OBJECT (pb), "destroy", GTK_SIGNAL_FUNC (release_data), running);
-#endif
-
- return BONOBO_OBJECT (control);
-}
-
-void
-addressbook_factory_init (void)
-{
- static BonoboGenericFactory *addressbook_control_factory = NULL;
-
- if (addressbook_control_factory != NULL)
- return;
-
- addressbook_control_factory =
- bonobo_generic_factory_new (
- "control-factory:addressbook",
- addressbook_factory, NULL);
-
- if (addressbook_control_factory == NULL) {
- g_error ("I could not register a Addressbook factory.");
- }
-}
diff --git a/addressbook/demo/addressbook.gnorba b/addressbook/demo/addressbook.gnorba
deleted file mode 100644
index 7114b1c332..0000000000
--- a/addressbook/demo/addressbook.gnorba
+++ /dev/null
@@ -1,11 +0,0 @@
-[control-factory:addressbook]
-type=exe
-repo_id=IDL:GNOME/GenericFactory:1.0
-description=Factory for the sample Addressbook control
-location_info=evolution-addressbook
-
-[control:addressbook]
-type=factory
-repo_id=IDL:BonoboControl/addressbook-control:1.0 IDL:GNOME/Control:1.0
-description=A sample Bonobo control which displays an addressbook.
-location_info=control-factory:addressbook
diff --git a/addressbook/demo/addressbook.h b/addressbook/demo/addressbook.h
deleted file mode 100644
index e9289128a6..0000000000
--- a/addressbook/demo/addressbook.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __ADDRESSBOOK_H__
-#define __ADDRESSBOOK_H__
-
-#include <bonobo/bonobo-control.h>
-
-void addressbook_factory_init (void);
-
-#endif /* __ADDRESSBOOK_H__ */
diff --git a/addressbook/demo/demo.c b/addressbook/demo/demo.c
deleted file mode 100644
index 1e2c256d3a..0000000000
--- a/addressbook/demo/demo.c
+++ /dev/null
@@ -1,462 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include <gnome-xml/tree.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-#include "e-util/e-cursors.h"
-#include "e-canvas.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-#include "e-reflow.h"
-#include "e-minicard.h"
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "table-test.h"
-
-#include "e-test-model.h"
-
-#define COLS 4
-
-/* Here we define the initial layout of the table. This is an xml
- format that allows you to change the initial ordering of the
- columns or to do sorting or grouping initially. This specification
- shows all 5 columns, but moves the importance column nearer to the
- front. It also sorts by the "Full Name" column (ascending.)
- Sorting and grouping take the model column as their arguments
- (sorting is specified by the "column" argument to the leaf elemnt. */
-#define INITIAL_SPEC "<ETableSpecification> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 1 </column> \
- <column> 2 </column> \
- <column> 3 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-char *headers[COLS] = {
- "Email",
- "Full Name",
- "Address",
- "Phone"
-};
-
-typedef struct _View View;
-
-typedef enum {
- VIEW_TYPE_REFLOW,
- VIEW_TYPE_TABLE
-} ViewType;
-
-typedef struct {
- GtkAllocation last_alloc;
- GnomeCanvasItem *reflow;
- GtkWidget *canvas;
- GnomeCanvasItem *rect;
- int model_changed_id;
-} Reflow;
-
-struct _View {
- ETestModel *model;
- GtkWidget *window;
- GtkWidget *frame;
- GtkWidget *child;
-
- ViewType type;
-
- Reflow *reflow;
-};
-
-static int window_count = 0;
-static GHashTable *models = NULL;
-
-static void
-remove_model(ETableModel *model, gchar *filename)
-{
- g_hash_table_remove(models, filename);
- g_free(filename);
-}
-
-static ETestModel *
-get_model(char *filename)
-{
- ETestModel *model;
- if ( models == NULL ) {
- models = g_hash_table_new(g_str_hash, g_str_equal);
- }
-
- model = g_hash_table_lookup(models, filename);
- if ( model )
- return model;
-
- filename = g_strdup(filename);
-
- model = E_TEST_MODEL(e_test_model_new(filename));
- g_hash_table_insert(models,
- filename, model);
- gtk_signal_connect(GTK_OBJECT(model), "destroy",
- GTK_SIGNAL_FUNC(remove_model), filename);
- return model;
-}
-
-static void
-add_address_cb(GtkWidget *button, gpointer data)
-{
- View *view = (View *) data;
- Address *newadd = g_new(Address, 1);
- newadd->email = g_strdup("");
- newadd->phone = g_strdup("");
- newadd->full_name = g_strdup("");
- newadd->street = g_strdup("");
- e_test_model_add_column (view->model, newadd);
-}
-
-static void
-rebuild_reflow(ETableModel *model, gpointer data)
-{
- int i;
- View *view = (View *) data;
- Reflow *reflow = view->reflow;
- if (!reflow)
- return;
- gtk_object_destroy(GTK_OBJECT(reflow->reflow));
- reflow->reflow = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( reflow->canvas ) ),
- e_reflow_get_type(),
- "height", (double) reflow->last_alloc.height,
- "minimum_width", (double) reflow->last_alloc.width,
- NULL );
-
- for ( i = 0; i < view->model->data_count; i++ )
- {
- GnomeCanvasItem *item;
- item = gnome_canvas_item_new( GNOME_CANVAS_GROUP(reflow->reflow),
- e_minicard_get_type(),
- "model", view->model,
- "row", i,
- NULL);
- e_reflow_add_item(E_REFLOW(reflow->reflow), item);
- }
- e_canvas_item_request_reflow(reflow->reflow);
-}
-
-static void
-destroy_reflow(View *view)
-{
- Reflow *reflow = view->reflow;
- if ( !reflow )
- return;
-
- gtk_signal_disconnect(GTK_OBJECT(view->model),
- reflow->model_changed_id);
- g_free(reflow);
- gtk_object_unref(GTK_OBJECT(view->model));
- view->reflow = NULL;
-}
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- View *view = (View *)data;
- if ( view->reflow ) {
- destroy_reflow(view);
- }
- gtk_object_unref(GTK_OBJECT(view->model));
- g_free(view);
- window_count --;
- if ( window_count <= 0 )
- exit(0);
-}
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data)
-{
- double width;
- View *view = (View *)data;
- Reflow *reflow = view->reflow;
- if ( !reflow )
- return;
- reflow->last_alloc = *allocation;
- gnome_canvas_item_set( reflow->reflow,
- "height", (double) allocation->height,
- NULL );
- gnome_canvas_item_set( reflow->reflow,
- "minimum_width", (double) allocation->width,
- NULL );
- gtk_object_get(GTK_OBJECT(reflow->reflow),
- "width", &width,
- NULL);
- width = MAX(width, allocation->width);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( reflow->canvas ), 0, 0, width, allocation->height );
- gnome_canvas_item_set( reflow->rect,
- "x2", (double) width,
- "y2", (double) allocation->height,
- NULL );
-}
-
-static void resize(ECanvas *canvas, gpointer data)
-{
- double width;
- View *view = (View *)data;
- Reflow *reflow = view->reflow;
- if ( !reflow )
- return;
- gtk_object_get(GTK_OBJECT(reflow->reflow),
- "width", &width,
- NULL);
- width = MAX(width, reflow->last_alloc.width);
- gnome_canvas_set_scroll_region(GNOME_CANVAS(reflow->canvas), 0, 0, width, reflow->last_alloc.height );
- gnome_canvas_item_set( reflow->rect,
- "x2", (double) width,
- "y2", (double) reflow->last_alloc.height,
- NULL );
-}
-
-static GtkWidget *
-create_reflow(View *view)
-{
- GtkWidget *inner_vbox;
- GtkWidget *scrollbar;
- int i;
- Reflow *reflow = g_new(Reflow, 1);
- view->reflow = reflow;
-
- view->type = VIEW_TYPE_REFLOW;
-
- /* Next we create our model. This uses the functions we defined
- earlier. */
-
- inner_vbox = gtk_vbox_new(FALSE, 0);
- reflow->canvas = e_canvas_new();
- reflow->rect = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( reflow->canvas ) ),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) 100,
- "y2", (double) 100,
- "fill_color", "white",
- NULL );
- reflow->reflow = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( reflow->canvas ) ),
- e_reflow_get_type(),
- "height", (double) 100,
- "minimum_width", (double) 100,
- NULL );
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( reflow->canvas ), "reflow",
- GTK_SIGNAL_FUNC( resize ),
- ( gpointer ) view);
-
- for ( i = 0; i < view->model->data_count; i++ )
- {
- GnomeCanvasItem *item;
- item = gnome_canvas_item_new( GNOME_CANVAS_GROUP(reflow->reflow),
- e_minicard_get_type(),
- "model", view->model,
- "row", i,
- NULL);
- e_reflow_add_item(E_REFLOW(reflow->reflow), item);
- }
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( reflow->canvas ),
- 0, 0,
- 100, 100 );
-
- scrollbar = gtk_hscrollbar_new(gtk_layout_get_hadjustment(GTK_LAYOUT(reflow->canvas)));
-
- gtk_signal_connect( GTK_OBJECT( reflow->canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( allocate_callback ),
- ( gpointer ) view );
-
- gdk_window_set_back_pixmap( GTK_LAYOUT(reflow->canvas)->bin_window, NULL, FALSE);
-
- reflow->model_changed_id = gtk_signal_connect(GTK_OBJECT( view->model ), "model_changed",
- GTK_SIGNAL_FUNC(rebuild_reflow), view);
-
- gtk_object_ref(GTK_OBJECT(view->model));
-
- /* Build the gtk widget hierarchy. */
- gtk_box_pack_start(GTK_BOX(inner_vbox), reflow->canvas, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(inner_vbox), scrollbar, FALSE, FALSE, 0);
-
- return inner_vbox;
-}
-
-/* We create a window containing our new table. */
-static GtkWidget *
-create_table(View *view)
-{
- ECell *cell_left_just;
- ETableHeader *e_table_header;
- GtkWidget *e_table;
- int i;
-
- view->type = VIEW_TYPE_TABLE;
-
- /*
- Next we create a header. The ETableHeader is used in two
- different way. The first is the full_header. This is the
- list of possible columns in the view. The second use is
- completely internal. Many of the ETableHeader functions are
- for that purpose. The only functions we really need are
- e_table_header_new and e_table_header_add_col.
-
- First we create the header. */
- e_table_header = e_table_header_new ();
-
- /* Next we have to build renderers for all of the columns.
- Since all our columns are text columns, we can simply use
- the same renderer over and over again. If we had different
- types of columns, we could use a different renderer for
- each column. */
- cell_left_just = e_cell_text_new (E_TABLE_MODEL(view->model), NULL, GTK_JUSTIFY_LEFT);
-
- /* Next we create a column object for each view column and add
- them to the header. We don't create a column object for
- the importance column since it will not be shown. */
- for (i = 0; i < LAST_COL; i++){
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, headers [i],
- 80, 20, cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /* 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. */
- e_table = e_table_new_from_spec_file (e_table_header, E_TABLE_MODEL(view->model), "spec");
-
-#if 0
- gtk_signal_connect(GTK_OBJECT(E_TABLE(e_table)->sort_info), "sort_info_changed",
- GTK_SIGNAL_FUNC(queue_header_save), e_table->sort_info);
-
- gtk_signal_connect(GTK_OBJECT(E_TABLE(e_table)->header), "structure_change",
- GTK_SIGNAL_FUNC(queue_header_save), e_table->sort_info);
- gtk_signal_connect(GTK_OBJECT(E_TABLE(e_table)->header), "dimension_change",
- GTK_SIGNAL_FUNC(queue_header_save), e_table->sort_info);
-#endif
-
- return e_table;
-}
-
-static void
-change_type(View *view, ViewType type)
-{
- gtk_object_ref(GTK_OBJECT(view->model));
- if (view->reflow)
- destroy_reflow(view);
- gtk_widget_destroy(view->child);
- switch(type) {
- case VIEW_TYPE_REFLOW:
- view->child = create_reflow(view);
- break;
- case VIEW_TYPE_TABLE:
- view->child = create_table(view);
- break;
- }
- gtk_container_add(GTK_CONTAINER(view->frame), view->child);
- gtk_widget_show_all(view->child);
- gtk_object_unref(GTK_OBJECT(view->model));
-}
-
-static void
-change_callback(GtkWidget *button, View *view)
-{
- if (view->type == VIEW_TYPE_REFLOW)
- change_type(view, VIEW_TYPE_TABLE);
- else
- change_type(view, VIEW_TYPE_REFLOW);
-}
-
-static GtkWidget *
-create_window(char *filename, ViewType type)
-{
- GtkWidget *button;
- GtkWidget *change_button;
- GtkWidget *vbox;
- View *view = g_new(View, 1);
-
- view->reflow = NULL;
-
- view->model = get_model(filename);
-
- /* Here we create a window for our new table. This window
- will get shown and the person will be able to test their
- item. */
- view->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
- gtk_signal_connect( GTK_OBJECT( view->window ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- view );
-
- /* This frame is simply to get a bevel around our table. */
- view->frame = gtk_frame_new (NULL);
-
- switch(type) {
- case VIEW_TYPE_REFLOW:
- view->child = create_reflow(view);
- break;
- case VIEW_TYPE_TABLE:
- view->child = create_table(view);
- break;
- }
-
-
- vbox = gtk_vbox_new(FALSE, 0);
-
- button = gtk_button_new_with_label("Add address");
- gtk_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(add_address_cb), view);
-
- change_button = gtk_button_new_with_label("Change View");
- gtk_signal_connect(GTK_OBJECT(change_button), "clicked",
- GTK_SIGNAL_FUNC(change_callback), view);
-
- /* Build the gtk widget hierarchy. */
-
- gtk_container_add (GTK_CONTAINER (view->frame), view->child);
- gtk_box_pack_start (GTK_BOX (vbox), view->frame, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), change_button, FALSE, FALSE, 0);
- gtk_container_add (GTK_CONTAINER (view->window), vbox);
-
- /* Size the initial window. */
- gtk_widget_set_usize (view->window, 200, 200);
- /* Show it all. */
- gtk_widget_show_all (view->window);
- gtk_object_ref(GTK_OBJECT(view->model));
- gtk_object_sink(GTK_OBJECT(view->model));
- window_count ++;
- return view->window;
-}
-
-/* This is the main function which just initializes gnome and call our create_table function */
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- create_window("addressbook.xml", VIEW_TYPE_TABLE);
- create_window("addressbook.xml", VIEW_TYPE_TABLE);
- create_window("addressbook.xml", VIEW_TYPE_TABLE);
- create_window("addressbook.xml", VIEW_TYPE_REFLOW);
- create_window("addressbook.xml", VIEW_TYPE_REFLOW);
- create_window("addressbook2.xml", VIEW_TYPE_TABLE);
- create_window("addressbook2.xml", VIEW_TYPE_REFLOW);
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
diff --git a/addressbook/demo/e-test-model.c b/addressbook/demo/e-test-model.c
deleted file mode 100644
index 941e1c006f..0000000000
--- a/addressbook/demo/e-test-model.c
+++ /dev/null
@@ -1,385 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-
-#include <config.h>
-#include "e-test-model.h"
-#include <gnome-xml/tree.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-#include <gnome.h>
-
-#define PARENT_TYPE e_table_model_get_type()
-/*
- * ETestModel callbacks
-n * These are the callbacks that define the behavior of our custom model.
- */
-
-static void
-test_destroy(GtkObject *object)
-{
- ETestModel *model = E_TEST_MODEL(object);
- int i;
- if (model->book)
- gtk_object_unref(GTK_OBJECT(model->book));
- if (model->book_view)
- gtk_object_unref(GTK_OBJECT(model->book_view));
- for ( i = 0; i < model->data_count; i++ ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- }
- g_free(model->data);
- g_free(model->uri);
-}
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-test_col_count (ETableModel *etc)
-{
- return LAST_COL;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-test_row_count (ETableModel *etc)
-{
- ETestModel *test = E_TEST_MODEL(etc);
- return test->data_count;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-test_value_at (ETableModel *etc, int col, int row)
-{
- ETestModel *test = E_TEST_MODEL(etc);
- ECardList *list;
- ECardIterator *iterator;
- gchar *string;
- if ( col >= LAST_COL || row >= test->data_count )
- return NULL;
- switch (col) {
- case EMAIL:
- gtk_object_get(GTK_OBJECT(test->data[row]),
- "email", &list,
- NULL);
- iterator = e_card_list_get_iterator(list);
- if (e_card_iterator_get(iterator))
- return (void *) e_card_iterator_get(iterator);
- else
- return "";
- gtk_object_unref(GTK_OBJECT(iterator));
- break;
- case FULL_NAME:
- gtk_object_get(GTK_OBJECT(test->data[row]),
- "full_name", &string,
- NULL);
- if (string)
- return string;
- else
- return "";
- break;
- case STREET:
- gtk_object_get(GTK_OBJECT(test->data[row]),
- "street", &list,
- NULL);
- iterator = e_card_list_get_iterator(list);
- if (e_card_iterator_get(iterator))
- return ((ECardDeliveryAddress *)e_card_iterator_get(iterator))->street;
- else
- return "";
- gtk_object_unref(GTK_OBJECT(iterator));
- break;
- case PHONE:
- gtk_object_get(GTK_OBJECT(test->data[row]),
- "phone", &list,
- NULL);
- iterator = e_card_list_get_iterator(list);
- if (e_card_iterator_get(iterator))
- return ((ECardPhone *)e_card_iterator_get(iterator))->number;
- else
- return "";
- gtk_object_unref(GTK_OBJECT(iterator));
- break;
- default:
- return NULL;
- }
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-test_set_value_at (ETableModel *etc, int col, int row, const void *val)
-{
- ETestModel *test = E_TEST_MODEL(etc);
- ECardList *list;
- ECardIterator *iterator;
- if ( col >= LAST_COL || row >= test->data_count )
- return;
- switch (col) {
- case EMAIL:
- gtk_object_get(GTK_OBJECT(test->data[row]),
- "email", &list,
- NULL);
- iterator = e_card_list_get_iterator(list);
- if (e_card_iterator_is_valid(iterator)) {
- e_card_iterator_set(iterator, val);
- } else {
- e_card_list_append(list, val);
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- break;
- case FULL_NAME:
- gtk_object_set(GTK_OBJECT(test->data[row]),
- "full_name", val,
- NULL);
- break;
- case STREET:
- gtk_object_get(GTK_OBJECT(test->data[row]),
- "address", &list,
- NULL);
- iterator = e_card_list_get_iterator(list);
- if (e_card_iterator_is_valid(iterator)) {
- const ECardDeliveryAddress *address = e_card_iterator_get(iterator);
- ECardDeliveryAddress *address_copy = e_card_delivery_address_copy(address);
- g_free(address_copy->street);
- address_copy->street = g_strdup(val);
- e_card_iterator_set(iterator, address_copy);
- e_card_delivery_address_free(address_copy);
- } else {
- ECardDeliveryAddress *address = g_new(ECardDeliveryAddress, 1);
- address->po = NULL;
- address->ext = NULL;
- address->street = g_strdup(val);
- address->city = NULL;
- address->region = NULL;
- address->code = NULL;
- address->country = NULL;
- address->flags = 0;
- e_card_list_append(list, address);
- e_card_delivery_address_free(address);
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- break;
- case PHONE:
- gtk_object_get(GTK_OBJECT(test->data[row]),
- "phone", &list,
- NULL);
- iterator = e_card_list_get_iterator(list);
- if (e_card_iterator_is_valid(iterator)) {
- const ECardPhone *phone = e_card_iterator_get(iterator);
- ECardPhone *phone_copy = e_card_phone_copy(phone);
- g_free(phone_copy->number);
- phone_copy->number = g_strdup(val);
- e_card_iterator_set(iterator, phone_copy);
- e_card_phone_free(phone_copy);
- } else {
- ECardPhone *phone = g_new(ECardPhone, 1);
- phone->number = g_strdup(val);
- phone->flags = 0;
- e_card_list_append(list, phone);
- e_card_phone_free(phone);
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- break;
- default:
- return;
- }
- e_book_commit_card(test->book, test->data[row], NULL, NULL);
- if ( !etc->frozen )
- e_table_model_cell_changed(etc, col, row);
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-test_is_cell_editable (ETableModel *etc, int col, int row)
-{
- return TRUE;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-test_duplicate_value (ETableModel *etc, int col, const void *value)
-{
- return g_strdup(value);
-}
-
-/* This function frees the value passed to it. */
-static void
-test_free_value (ETableModel *etc, int col, void *value)
-{
- g_free(value);
-}
-
-/* This function is for when the model is unfrozen. This can mostly
- be ignored for simple models. */
-static void
-test_thaw (ETableModel *etc)
-{
- e_table_model_changed(etc);
-}
-
-static void
-e_test_model_class_init (GtkObjectClass *object_class)
-{
- ETableModelClass *model_class = (ETableModelClass *) object_class;
-
- object_class->destroy = test_destroy;
-
- model_class->column_count = test_col_count;
- model_class->row_count = test_row_count;
- model_class->value_at = test_value_at;
- model_class->set_value_at = test_set_value_at;
- model_class->is_cell_editable = test_is_cell_editable;
- model_class->duplicate_value = test_duplicate_value;
- model_class->free_value = test_free_value;
- model_class->thaw = test_thaw;
-}
-
-static void
-e_test_model_init (GtkObject *object)
-{
- ETestModel *model = E_TEST_MODEL(object);
- model->data = NULL;
- model->data_count = 0;
- model->book = NULL;
- model->book_view = NULL;
-}
-
-GtkType
-e_test_model_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETestModel",
- sizeof (ETestModel),
- sizeof (ETestModelClass),
- (GtkClassInitFunc) e_test_model_class_init,
- (GtkObjectInitFunc) e_test_model_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-void
-e_test_model_add_column (ETestModel *model, Address *newadd)
-{
-#if 0
- model->data = g_realloc(model->data, (++model->data_count) * sizeof(Address *));
- model->data[model->data_count - 1] = newadd;
- e_test_model_queue_save(model);
- if ( model && !E_TABLE_MODEL(model)->frozen )
- e_table_model_changed(E_TABLE_MODEL(model));
-#endif
-}
-
-static void
-e_test_model_card_added(EBookView *book_view,
- const GList *cards,
- ETestModel *model)
-{
- model->data = g_realloc(model->data, (model->data_count + g_list_length((GList *)cards)) * sizeof(ECard *));
- for ( ; cards; cards = cards->next) {
- gtk_object_ref(GTK_OBJECT(cards->data));
- model->data[model->data_count++] = E_CARD (cards->data);
- }
- e_table_model_changed(E_TABLE_MODEL(model));
-}
-
-static void
-e_test_model_card_removed(EBookView *book_view,
- const char *id,
- ETestModel *model)
-{
- int i;
- for ( i = 0; i < model->data_count; i++) {
- if ( !strcmp(e_card_get_id(model->data[i]), id) ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- memmove(model->data + i, model->data + i + 1, (model->data_count - i - 1) * sizeof (ECard *));
- }
- }
- e_table_model_changed(E_TABLE_MODEL(model));
-}
-
-static void
-e_test_model_card_changed(EBookView *book_view,
- const GList *cards,
- ETestModel *model)
-{
- for ( ; cards; cards = cards->next) {
- int i;
- for ( i = 0; i < model->data_count; i++) {
- if ( !strcmp(e_card_get_id(model->data[i]), e_card_get_id(E_CARD(cards->data))) ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- model->data[i] = E_CARD(cards->data);
- gtk_object_ref(GTK_OBJECT(model->data[i]));
- e_table_model_row_changed(E_TABLE_MODEL(model), i);
- break;
- }
- }
- }
-}
-
-static void
-e_test_model_book_respond_get_view(EBook *book,
- EBookStatus status,
- EBookView *book_view,
- ETestModel *model)
-{
- if (status == E_BOOK_STATUS_SUCCESS) {
- model->book_view = book_view;
- gtk_object_ref(GTK_OBJECT(book_view));
- gtk_signal_connect(GTK_OBJECT(book_view),
- "card_changed",
- GTK_SIGNAL_FUNC(e_test_model_card_changed),
- model);
- gtk_signal_connect(GTK_OBJECT(book_view),
- "card_removed",
- GTK_SIGNAL_FUNC(e_test_model_card_removed),
- model);
- gtk_signal_connect(GTK_OBJECT(book_view),
- "card_added",
- GTK_SIGNAL_FUNC(e_test_model_card_added),
- model);
- }
-}
-
-static void
-e_test_model_uri_loaded(EBook *book,
- EBookStatus status,
- ETestModel *model)
-{
- if (status == E_BOOK_STATUS_SUCCESS) {
- e_book_get_book_view (book,
- "",
- (EBookBookViewCallback) e_test_model_book_respond_get_view,
- model);
- }
-}
-
-ETableModel *
-e_test_model_new (gchar *uri)
-{
- ETestModel *et;
-
- et = gtk_type_new (e_test_model_get_type ());
-
- et->uri = g_strdup(uri);
- et->book = e_book_new();
- e_book_load_uri(et->book,
- et->uri,
- (EBookCallback) e_test_model_uri_loaded,
- et);
-
- return E_TABLE_MODEL(et);
-}
diff --git a/addressbook/demo/e-test-model.h b/addressbook/demo/e-test-model.h
deleted file mode 100644
index 871ea11de8..0000000000
--- a/addressbook/demo/e-test-model.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TEST_MODEL_H_
-#define _E_TEST_MODEL_H_
-
-#include "e-table-model.h"
-#include <e-book.h>
-#include <e-book-view.h>
-#include <e-card.h>
-
-#define E_TEST_MODEL_TYPE (e_test_model_get_type ())
-#define E_TEST_MODEL(o) (GTK_CHECK_CAST ((o), E_TEST_MODEL_TYPE, ETestModel))
-#define E_TEST_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TEST_MODEL_TYPE, ETestModelClass))
-#define E_IS_TEST_MODEL(o) (GTK_CHECK_TYPE ((o), E_TEST_MODEL_TYPE))
-#define E_IS_TEST_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TEST_MODEL_TYPE))
-
-/* Virtual Column list:
- 0 Email
- 1 Full Name
- 2 Street
- 3 Phone
-*/
-typedef struct _Address Address;
-typedef enum _Rows Rows;
-
-struct _Address {
- gchar *email;
- gchar *full_name;
- gchar *street;
- gchar *phone;
-};
-
-enum _Rows {
- EMAIL,
- FULL_NAME,
- STREET,
- PHONE,
- LAST_COL
-};
-
-typedef struct {
- ETableModel parent;
-
- EBook *book;
-
- EBookView *book_view;
-
- ECard **data;
- int data_count;
-
- char *uri;
-} ETestModel;
-
-
-typedef struct {
- ETableModelClass parent_class;
-} ETestModelClass;
-
-
-GtkType e_test_model_get_type (void);
-ETableModel *e_test_model_new (char *uri);
-
-void e_test_model_add_column (ETestModel *model, Address *newadd);
-
-#endif /* _E_TEST_MODEL_H_ */
diff --git a/addressbook/demo/spec b/addressbook/demo/spec
deleted file mode 100644
index 2d366ed75f..0000000000
--- a/addressbook/demo/spec
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<ETableSpecification>
- <columns-shown>
- <column>1</column>
- <column>0</column>
- <column>2</column>
- <column>3</column>
- </columns-shown>
- <grouping>
- <leaf column="2" ascending="1"/>
- </grouping>
-</ETableSpecification>
diff --git a/addressbook/ename/.cvsignore b/addressbook/ename/.cvsignore
deleted file mode 100644
index 4f8c173841..0000000000
--- a/addressbook/ename/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
-test-ename-western
-test-ename-western-gtk
diff --git a/addressbook/ename/Makefile.am b/addressbook/ename/Makefile.am
deleted file mode 100644
index 25a67a929c..0000000000
--- a/addressbook/ename/Makefile.am
+++ /dev/null
@@ -1,50 +0,0 @@
-INCLUDES = \
- -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
- -DG_LOG_DOMAIN=\"EName\" \
- -I$(srcdir) \
- -I$(srcdir)/.. \
- -I$(top_srcdir) \
- -I. \
- -I.. \
- -I$(top_builddir) \
- -I$(includedir) \
- $(GNOME_INCLUDEDIR)
-
-gnome_libs = \
- $(BONOBO_GNOME_LIBS) \
- $(INTLLIBS)
-
-ename_libs = \
- libename.la \
- $(gnome_libs)
-
-lib_LTLIBRARIES = libename.la
-
-libename_la_SOURCES = \
- e-name-western.c
-
-libenameincludedir = $(includedir)/ename
-
-libenameinclude_HEADERS = \
- e-name-western-tables.h \
- e-name-western.h
-
-
-noinst_LTLIBRARIES = libename-static.la
-libename_static_la_SOURCES = $(libename_la_SOURCES)
-libename_static_la_LDFLAGS = --all-static
-
-
-noinst_PROGRAMS = \
- test-ename-western \
- test-ename-western-gtk
-
-test_ename_western_SOURCES = \
- test-ename-western.c
-
-test_ename_western_LDADD = $(ename_libs)
-
-test_ename_western_gtk_SOURCES = \
- test-ename-western-gtk.c
-
-test_ename_western_gtk_LDADD = $(ename_libs) $(gnome_libs)
diff --git a/addressbook/ename/TODO b/addressbook/ename/TODO
deleted file mode 100644
index 669661eea7..0000000000
--- a/addressbook/ename/TODO
+++ /dev/null
@@ -1,2 +0,0 @@
-* Support other naming systems.
-* Handle misspelled suffixes better.
diff --git a/addressbook/ename/e-name-western-tables.h b/addressbook/ename/e-name-western-tables.h
deleted file mode 100644
index bb29cc5292..0000000000
--- a/addressbook/ename/e-name-western-tables.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef __E_NAME_WESTERN_TABLES_H__
-#define __E_NAME_WESTERN_TABLES_H__
-
-char *e_name_western_pfx_table[] = {
-
- /*
- * English.
- */
- "mister", "miss.", "mr.", "mrs.", "ms.",
- "miss", "mr", "mrs", "ms", "sir",
- "professor", "prof.", "dr", "dr.", "doctor",
- "reverend", "president", "judge", "senator",
- "congressman", "congresswoman", "commander",
- "lieutenant", "colonel", "major", "general",
-
- "the honorable", "the reverend", "his holiness",
- "his eminence",
-
-
- /*
- * French.
- */
- "monsieur", "mr.", "mademoiselle", "melle.",
- "madame", "mme.", "professeur",
-
- /*
- * Spanish.
- */
- "senor", "senora", "senorita",
-
- NULL};
-
-char *e_name_western_sfx_table[] = {
-
- /*
- * English.
- */
- "junior", "senior", "jr", "sr", "I", "II", "III", "IV", "V",
- "phd", "ms", "md", "esq", "esq.", "esquire",
-
- NULL};
-
-char *e_name_western_twopart_sfx_table[] = {
-
- /*
- * English.
- */
- "the first", "the second", "the third",
-
- NULL};
-
-char *e_name_western_complex_last_table[] = {"van", "von", "de", NULL};
-
-#endif /* ! __E_NAME_WESTERN_TABLES_H__ */
diff --git a/addressbook/ename/e-name-western.c b/addressbook/ename/e-name-western.c
deleted file mode 100644
index 698cceec0b..0000000000
--- a/addressbook/ename/e-name-western.c
+++ /dev/null
@@ -1,868 +0,0 @@
-/*
- * A simple Western name parser.
- *
- * <Nat> Jamie, do you know anything about name parsing?
- * <jwz> Are you going down that rat hole? Bring a flashlight.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 1999, Helix Code, Inc.
- */
-
-#include <ctype.h>
-#include <string.h>
-#include <glib.h>
-
-#include <ename/e-name-western.h>
-#include <ename/e-name-western-tables.h>
-
-typedef struct {
- int prefix_idx;
- int first_idx;
- int middle_idx;
- int nick_idx;
- int last_idx;
- int suffix_idx;
-} ENameWesternIdxs;
-
-static int
-e_name_western_str_count_words (char *str)
-{
- int word_count;
- char *p;
-
- word_count = 0;
-
- for (p = str; p != NULL; p = strchr (p, ' ')) {
- word_count ++;
- p ++;
- }
-
- return word_count;
-}
-
-static void
-e_name_western_cleanup_string (char **str)
-{
- char *newstr;
- char *p;
-
- if (*str == NULL)
- return;
-
- /* skip any spaces and commas at the start of the string */
- p = *str;
- while (isspace (*p) || *p == ',')
- p ++;
-
- /* make the copy we're going to return */
- newstr = g_strdup (p);
-
- if ( strlen(newstr) > 0) {
- /* now search from the back, skipping over any spaces and commas */
- p = newstr + strlen (newstr) - 1;
- while (isspace (*p) || *p == ',')
- p --;
- /* advance p to after the character that caused us to exit the
- previous loop, and end the string. */
- if ((! isspace (*p)) && *p != ',')
- p ++;
- *p = '\0';
- }
-
- g_free (*str);
- *str = newstr;
-}
-
-static char *
-e_name_western_get_words_at_idx (char *str, int idx, int num_words)
-{
- char *words;
- char *p;
- int word_count;
- int words_len;
-
- /*
- * Walk to the end of the words.
- */
- word_count = 0;
- p = str + idx;
- while (word_count < num_words && *p != '\0') {
- while (! isspace (*p) && *p != '\0')
- p ++;
-
- while (isspace (*p) && *p != '\0')
- p ++;
-
- word_count ++;
- }
-
- words_len = p - str - idx - 1;
-
- if (*p == '\0')
- words_len ++;
-
- words = g_malloc0 (1 + words_len);
- strncpy (words, str + idx, words_len);
-
- return words;
-}
-
-/*
- * What the fuck is wrong with glib's MAX macro.
- */
-static int
-e_name_western_max (const int a, const int b)
-{
- if (a > b)
- return a;
-
- return b;
-}
-
-static gboolean
-e_name_western_word_is_suffix (char *word)
-{
- int i;
-
- for (i = 0; e_name_western_sfx_table [i] != NULL; i ++) {
- if (g_strcasecmp (word, e_name_western_sfx_table [i]))
- continue;
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static char *
-e_name_western_get_one_prefix_at_str (char *str)
-{
- char *word;
- int i;
-
- /*
- * Check for prefixes from our table.
- */
- for (i = 0; e_name_western_pfx_table [i] != NULL; i ++) {
- int pfx_words;
- char *words;
-
- pfx_words = e_name_western_str_count_words (e_name_western_pfx_table [i]);
- words = e_name_western_get_words_at_idx (str, 0, pfx_words);
-
- if (! g_strcasecmp (words, e_name_western_pfx_table [i]))
- return words;
-
- g_free (words);
- }
-
- /*
- * Check for prefixes we don't know about. These are always a
- * sequence of more than one letters followed by a period.
- */
- word = e_name_western_get_words_at_idx (str, 0, 1);
-
- if (strlen (word) > 2 && isalpha (word [0]) && isalpha (word [1]) &&
- word [strlen (word) - 1] == '.')
- return word;
-
- g_free (word);
-
- return NULL;
-}
-
-static char *
-e_name_western_get_prefix_at_str (char *str)
-{
- char *pfx;
- char *pfx1;
- char *pfx2;
- char *p;
-
- /* Get the first prefix. */
- pfx1 = e_name_western_get_one_prefix_at_str (str);
-
- if (pfx1 == NULL)
- return NULL;
-
- /* Check for a second prefix. */
- p = str + strlen (pfx1);
- while (isspace (*p) && *p != '\0')
- p ++;
-
- pfx2 = e_name_western_get_one_prefix_at_str (p);
-
- if (pfx2 != NULL) {
- int pfx_len;
-
- pfx_len = (p + strlen (pfx2)) - str;
- pfx = g_malloc0 (pfx_len + 1);
- strncpy (pfx, str, pfx_len);
- } else {
- pfx = g_strdup (pfx1);
- }
-
- g_free (pfx1);
- g_free (pfx2);
-
- return pfx;
-}
-
-static void
-e_name_western_extract_prefix (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- char *pfx;
-
- pfx = e_name_western_get_prefix_at_str (name->full);
-
- if (pfx == NULL)
- return;
-
- idxs->prefix_idx = 0;
- name->prefix = pfx;
-}
-
-static gboolean
-e_name_western_is_complex_last_beginning (char *word)
-{
- int i;
-
- for (i = 0; e_name_western_complex_last_table [i] != NULL; i ++) {
-
- if (! g_strcasecmp (
- word, e_name_western_complex_last_table [i]))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-e_name_western_extract_first (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- /*
- * If there's a prefix, then the first name is right after it.
- */
- if (idxs->prefix_idx != -1) {
- int first_idx;
- char *p;
-
- first_idx = idxs->prefix_idx + strlen (name->prefix);
-
- /* Skip past white space. */
- p = name->full + first_idx;
- while (isspace (*p) && *p != '\0')
- p++;
-
- if (*p == '\0')
- return;
-
- idxs->first_idx = p - name->full;
- name->first = e_name_western_get_words_at_idx (
- name->full, idxs->first_idx, 1);
-
- } else {
-
- /*
- * Otherwise, the first name is probably the first string.
- */
- idxs->first_idx = 0;
- name->first = e_name_western_get_words_at_idx (
- name->full, idxs->first_idx, 1);
- }
-
- /*
- * Check that we didn't just assign the beginning of a
- * compound last name to the first name.
- */
- if (name->first != NULL) {
- if (e_name_western_is_complex_last_beginning (name->first)) {
- g_free (name->first);
- name->first = NULL;
- idxs->first_idx = -1;
- }
- }
-}
-
-static void
-e_name_western_extract_middle (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- char *word;
- int middle_idx;
-
- /*
- * Middle names can only exist if you have a first name.
- */
- if (idxs->first_idx == -1)
- return;
-
- middle_idx = idxs->first_idx + strlen (name->first) + 1;
-
- if (middle_idx > strlen (name->full))
- return;
-
- /*
- * Search for the first space (or the terminating \0)
- */
- while (isspace (name->full [middle_idx]) &&
- name->full [middle_idx] != '\0')
- middle_idx ++;
-
- if (name->full [middle_idx] == '\0')
- return;
-
- /*
- * Skip past the nickname, if it's there.
- */
- if (name->full [middle_idx] == '\"') {
- if (idxs->nick_idx == -1)
- return;
-
- middle_idx = idxs->nick_idx + strlen (name->nick) + 1;
-
- while (isspace (name->full [middle_idx]) &&
- name->full [middle_idx] != '\0')
- middle_idx ++;
-
- if (name->full [middle_idx] == '\0')
- return;
- }
-
- /*
- * Make sure this isn't the beginning of a complex last name.
- */
- word = e_name_western_get_words_at_idx (name->full, middle_idx, 1);
- if (e_name_western_is_complex_last_beginning (word)) {
- g_free (word);
- return;
- }
-
- /*
- * Make sure this isn't a suffix.
- */
- e_name_western_cleanup_string (& word);
- if (e_name_western_word_is_suffix (word)) {
- g_free (word);
- return;
- }
-
- /*
- * Make sure we didn't just grab a cute nickname.
- */
- if (word [0] == '\"') {
- g_free (word);
- return;
- }
-
- idxs->middle_idx = middle_idx;
- name->middle = word;
-}
-
-static void
-e_name_western_extract_nickname (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- int idx;
- int start_idx;
- char *str;
-
- if (idxs->first_idx == -1)
- return;
-
- if (idxs->middle_idx > idxs->first_idx)
- idx = idxs->middle_idx + strlen (name->middle);
- else
- idx = idxs->first_idx + strlen (name->first);
-
- while (name->full [idx] != '\"' && name->full [idx] != '\0')
- idx ++;
-
- if (name->full [idx] != '\"')
- return;
-
- start_idx = idx;
-
- /*
- * Advance to the next double quote.
- */
- idx ++;
-
- while (name->full [idx] != '\"' && name->full [idx] != '\0')
- idx ++;
-
- if (name->full [idx] == '\0')
- return;
-
- str = g_malloc0 (idx - start_idx + 2);
- strncpy (str, name->full + start_idx, idx - start_idx + 1);
-
- name->nick = str;
- idxs->nick_idx = start_idx;
-}
-
-static int
-e_name_western_last_get_max_idx (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- int max_idx = -1;
-
- if (name->prefix != NULL)
- max_idx = e_name_western_max (
- max_idx, idxs->prefix_idx + strlen (name->prefix));
-
- if (name->first != NULL)
- max_idx = e_name_western_max (
- max_idx, idxs->first_idx + strlen (name->first));
-
- if (name->middle != NULL)
- max_idx = e_name_western_max (
- max_idx, idxs->middle_idx + strlen (name->middle));
-
- if (name->nick != NULL)
- max_idx = e_name_western_max (
- max_idx, idxs->nick_idx + strlen (name->nick));
-
- return max_idx;
-}
-
-static void
-e_name_western_extract_last (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- char *word;
- int idx = -1;
-
- idx = e_name_western_last_get_max_idx (name, idxs);
-
- /*
- * In the case where there is no preceding name element, the
- * name is either just a first name ("Nat", "John"), is a
- * single-element name ("Cher", which we treat as a first
- * name), or is just a last name. The only time we can
- * differentiate a last name alone from a single-element name
- * or a first name alone is if it's a complex last name ("de
- * Icaza", "van Josephsen"). So if there is no preceding name
- * element, we check to see whether or not the first part of
- * the name is the beginning of a complex name. If it is,
- * we subsume the entire string. If we accidentally subsume
- * the suffix, this will get fixed in the fixup routine.
- */
- if (idx == -1) {
- word = e_name_western_get_words_at_idx (name->full, 0, 1);
- if (! e_name_western_is_complex_last_beginning (word)) {
- g_free (word);
- return;
- }
-
- name->last = g_strdup (name->full);
- idxs->last_idx = 0;
- return;
- }
-
- /* Skip past the white space. */
- while (isspace (name->full [idx]) && name->full [idx] != '\0')
- idx ++;
-
- if (name->full [idx] == '\0')
- return;
-
- word = e_name_western_get_words_at_idx (name->full, idx, 1);
- e_name_western_cleanup_string (& word);
- if (e_name_western_word_is_suffix (word)) {
- g_free (word);
- return;
- }
- g_free (word);
-
- /*
- * Subsume the rest of the string into the last name. If we
- * accidentally include the prefix, it will get fixed later.
- * This is the only way to handle things like "Miguel de Icaza
- * Amozorrutia" without dropping data and forcing the user
- * to retype it.
- */
- name->last = g_strdup (name->full + idx);
- idxs->last_idx = idx;
-}
-
-static char *
-e_name_western_get_preceding_word (char *str, int idx)
-{
- int word_len;
- char *word;
- char *p;
-
- p = str + idx;
-
- while (isspace (*p) && p > str)
- p --;
-
- while (! isspace (*p) && p > str)
- p --;
-
- if (isspace (*p))
- p ++;
-
- word_len = (str + idx) - p;
- word = g_malloc0 (word_len + 1);
- if (word_len > 0)
- strncpy (word, p, word_len);
-
- return word;
-}
-
-static char *
-e_name_western_get_suffix_at_str_end (char *str)
-{
- char *suffix;
- char *p;
-
- /*
- * Walk backwards till we reach the beginning of the
- * (potentially-comma-separated) list of suffixes.
- */
- p = str + strlen (str);
- while (1) {
- char *nextp;
- char *word;
-
- word = e_name_western_get_preceding_word (str, p - str);
- nextp = p - strlen (word) - 1;
-
- e_name_western_cleanup_string (& word);
-
- if (e_name_western_word_is_suffix (word)) {
- p = nextp;
- g_free (word);
- } else {
- g_free (word);
- break;
- }
- }
-
- if (p == (str + strlen (str)))
- return NULL;
-
- suffix = g_strdup (p);
- e_name_western_cleanup_string (& suffix);
-
- if (strlen (suffix) == 0) {
- g_free (suffix);
- return NULL;
- }
-
- return suffix;
-}
-
-static void
-e_name_western_extract_suffix (ENameWestern *name, ENameWesternIdxs *idxs)
-{
-
- name->suffix = e_name_western_get_suffix_at_str_end (name->full);
-
- if (name->suffix == NULL)
- return;
-
- idxs->suffix_idx = strlen (name->full) - strlen (name->suffix);
-}
-
-static gboolean
-e_name_western_detect_backwards (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- char *comma;
- char *word;
-
- comma = strchr (name->full, ',');
-
- if (comma == NULL)
- return FALSE;
-
- /*
- * If there's a comma, we need to detect whether it's
- * separating the last name from the first or just separating
- * suffixes. So we grab the word which comes before the
- * comma and check if it's a suffix.
- */
- word = e_name_western_get_preceding_word (name->full, comma - name->full);
-
- if (e_name_western_word_is_suffix (word)) {
- g_free (word);
- return FALSE;
- }
-
- g_free (word);
- return TRUE;
-}
-
-static void
-e_name_western_reorder_asshole (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- char *prefix;
- char *last;
- char *suffix;
- char *firstmidnick;
- char *newfull;
-
- char *comma;
- char *p;
-
- if (! e_name_western_detect_backwards (name, idxs))
- return;
-
- /*
- * Convert
- * <Prefix> <Last name>, <First name> <Middle[+nick] name> <Suffix>
- * to
- * <Prefix> <First name> <Middle[+nick] name> <Last name> <Suffix>
- */
-
- /*
- * Grab the prefix from the beginning.
- */
- prefix = e_name_western_get_prefix_at_str (name->full);
-
- /*
- * Everything from the end of the prefix to the comma is the
- * last name.
- */
- comma = strchr (name->full, ',');
- if (comma == NULL)
- return;
-
- p = name->full + (prefix == NULL ? 0 : strlen (prefix));
-
- while (isspace (*p) && *p != '\0')
- p ++;
-
- last = g_malloc0 (comma - p + 1);
- strncpy (last, p, comma - p);
-
- /*
- * Get the suffix off the end.
- */
- suffix = e_name_western_get_suffix_at_str_end (name->full);
-
- /*
- * Firstmidnick is everything from the comma to the beginning
- * of the suffix.
- */
- p = comma + 1;
-
- while (isspace (*p) && *p != '\0')
- p ++;
-
- if (suffix != NULL) {
- char *q;
-
- /*
- * Point q at the beginning of the suffix.
- */
- q = name->full + strlen (name->full) - strlen (suffix) - 1;
-
- /*
- * Walk backwards until we hit the space which
- * separates the suffix from firstmidnick.
- */
- while (! isspace (*q) && q > comma)
- q --;
-
- if ((q - p + 1) > 0) {
- firstmidnick = g_malloc0 (q - p + 1);
- strncpy (firstmidnick, p, q - p);
- } else
- firstmidnick = NULL;
- } else {
- firstmidnick = g_strdup (p);
- }
-
- /*
- * Create our new reordered version of the name.
- */
-#define NULLSTR(a) ((a) == NULL ? "" : (a))
- newfull = g_strdup_printf ("%s %s %s %s", NULLSTR (prefix), NULLSTR (firstmidnick),
- NULLSTR (last), NULLSTR (suffix));
- g_strstrip (newfull);
- g_free (name->full);
- name->full = newfull;
-
-
- g_free (prefix);
- g_free (firstmidnick);
- g_free (last);
- g_free (suffix);
-}
-
-static void
-e_name_western_zap_nil (char **str, int *idx)
-{
- if (*str == NULL)
- return;
-
- if (strlen (*str) != 0)
- return;
-
- *idx = -1;
- g_free (*str);
- *str = NULL;
-}
-
-static void
-e_name_western_fixup (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- /*
- * The middle and last names cannot be the same.
- */
- if (idxs->middle_idx != -1 && idxs->middle_idx == idxs->last_idx) {
- idxs->middle_idx = -1;
- g_free (name->middle);
- name->middle = NULL;
- }
-
- /*
- * If we have a middle name and no last name, then we mistook
- * the last name for the middle name.
- */
- if (idxs->last_idx == -1 && idxs->middle_idx != -1) {
- idxs->last_idx = idxs->middle_idx;
- name->last = name->middle;
- name->middle = NULL;
- idxs->middle_idx = -1;
- }
-
- /*
- * Check to see if we accidentally included the suffix in the
- * last name.
- */
- if (idxs->suffix_idx != -1 && idxs->last_idx != -1 &&
- idxs->suffix_idx < (idxs->last_idx + strlen (name->last))) {
- char *sfx;
-
- sfx = name->last + (idxs->suffix_idx - idxs->last_idx);
- if (sfx != NULL) {
- char *newlast;
- char *p;
-
- p = sfx - 1;
- while (isspace (*p) && p > name->last)
- p --;
- p ++;
-
- newlast = g_malloc0 (p - name->last + 1);
- strncpy (newlast, name->last, p - name->last);
- g_free (name->last);
- name->last = newlast;
- }
- }
-
- /*
- * If we have a prefix and a first name, but no last name,
- * then we need to assign the first name to the last name.
- * This way we get things like "Mr Friedman" correctly.
- */
- if (idxs->first_idx != -1 && idxs->prefix_idx != -1 &&
- idxs->last_idx == -1) {
- name->last = name->first;
- idxs->last_idx = idxs->first_idx;
- idxs->first_idx = -1;
- name->first = NULL;
- }
-
- /*
- * Remove stray spaces and commas (although there don't seem
- * to be any in the test cases, they might show up later).
- */
- e_name_western_cleanup_string (& name->prefix);
- e_name_western_cleanup_string (& name->first);
- e_name_western_cleanup_string (& name->middle);
- e_name_western_cleanup_string (& name->nick);
- e_name_western_cleanup_string (& name->last);
- e_name_western_cleanup_string (& name->suffix);
-
- /*
- * Make zero-length strings just NULL.
- */
- e_name_western_zap_nil (& name->prefix, & idxs->prefix_idx);
- e_name_western_zap_nil (& name->first, & idxs->first_idx);
- e_name_western_zap_nil (& name->middle, & idxs->middle_idx);
- e_name_western_zap_nil (& name->nick, & idxs->nick_idx);
- e_name_western_zap_nil (& name->last, & idxs->last_idx);
- e_name_western_zap_nil (& name->suffix, & idxs->suffix_idx);
-}
-
-/**
- * e_name_western_western_parse_fullname:
- * @full_name: A string containing a Western name.
- *
- * Parses @full_name and returns an #ENameWestern object filled with
- * the component parts of the name.
- */
-ENameWestern *
-e_name_western_parse (const char *full_name)
-{
- ENameWesternIdxs *idxs;
- ENameWestern *wname;
-
- wname = g_new0 (ENameWestern, 1);
-
- wname->full = g_strdup (full_name);
-
- idxs = g_new0 (ENameWesternIdxs, 1);
-
- idxs->prefix_idx = -1;
- idxs->first_idx = -1;
- idxs->middle_idx = -1;
- idxs->nick_idx = -1;
- idxs->last_idx = -1;
- idxs->suffix_idx = -1;
-
- /*
- * An extremely simple algorithm.
- *
- * The goal here is to get it right 95% of the time for
- * Western names.
- *
- * First we check to see if this is an ass-backwards name
- * ("Prefix Last, First Middle Suffix"). These names really
- * suck (imagine "Dr von Johnson, Albert Roderick Jr"), so
- * we reorder them first and then parse them.
- *
- * Next, we grab the most obvious assignments for the various
- * parts of the name. Once this is done, we check for stupid
- * errors and fix them up.
- */
- e_name_western_reorder_asshole (wname, idxs);
-
- e_name_western_extract_prefix (wname, idxs);
- e_name_western_extract_first (wname, idxs);
- e_name_western_extract_nickname (wname, idxs);
- e_name_western_extract_middle (wname, idxs);
- e_name_western_extract_last (wname, idxs);
- e_name_western_extract_suffix (wname, idxs);
-
- e_name_western_fixup (wname, idxs);
-
- g_free (idxs);
-
- return wname;
-}
-
-/**
- * e_name_western_free:
- * @name: An ENameWestern object which needs to be freed.
- *
- * Deep-frees @name
- */
-void
-e_name_western_free (ENameWestern *w)
-{
-
- g_free (w->prefix);
- g_free (w->first);
- g_free (w->middle);
- g_free (w->nick);
- g_free (w->last);
- g_free (w->suffix);
-
- g_free (w->full);
-
- g_free (w);
-}
diff --git a/addressbook/ename/e-name-western.h b/addressbook/ename/e-name-western.h
deleted file mode 100644
index fa5bac494c..0000000000
--- a/addressbook/ename/e-name-western.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef __E_NAME_WESTERN_H__
-#define __E_NAME_WESTERN_H__
-
-typedef struct {
-
- /* Public */
- char *prefix;
- char *first;
- char *middle;
- char *nick;
- char *last;
- char *suffix;
-
- /* Private */
- char *full;
-} ENameWestern;
-
-ENameWestern *e_name_western_parse (const char *full_name);
-void e_name_western_free (ENameWestern *w);
-
-#endif /* ! __E_NAME_WESTERN_H__ */
diff --git a/addressbook/ename/test-ename-western-gtk.c b/addressbook/ename/test-ename-western-gtk.c
deleted file mode 100644
index 17daf42b30..0000000000
--- a/addressbook/ename/test-ename-western-gtk.c
+++ /dev/null
@@ -1,148 +0,0 @@
-#include <gnome.h>
-#include <ename/e-name-western.h>
-
-ENameWestern *name;
-GtkWidget *full;
-GtkWidget *prefix;
-GtkWidget *first;
-GtkWidget *middle;
-GtkWidget *nick;
-GtkWidget *last;
-GtkWidget *suffix;
-
-static void
-fill_entries (void)
-{
-
-#define SET(a,b) (gtk_entry_set_text (GTK_ENTRY (a), (b) == NULL ? "" : (b)))
- SET(prefix, name->prefix);
- SET(first, name->first);
- SET(middle, name->middle);
- SET(nick, name->nick);
- SET(last, name->last);
- SET(suffix, name->suffix);
-}
-
-static void
-full_changed_cb (GtkEntry *fulle)
-{
- e_name_western_free (name);
- name = e_name_western_parse (gtk_entry_get_text (fulle));
- fill_entries ();
-}
-
-static void
-create_window (void)
-{
- GtkWidget *app;
- GtkTable *table;
-
- GtkWidget *prefix_label;
- GtkWidget *first_label;
- GtkWidget *middle_label;
- GtkWidget *nick_label;
- GtkWidget *last_label;
- GtkWidget *suffix_label;
-
- app = gnome_app_new ("test", "Evolution Western Name Parser");
-
- table = GTK_TABLE (gtk_table_new (3, 6, FALSE));
-
- full = gtk_entry_new ();
- prefix = gtk_entry_new ();
- first = gtk_entry_new ();
- middle = gtk_entry_new ();
- nick = gtk_entry_new ();
- last = gtk_entry_new ();
- suffix = gtk_entry_new ();
-
- gtk_widget_set_usize (prefix, 100, 0);
- gtk_widget_set_usize (first, 100, 0);
- gtk_widget_set_usize (middle, 100, 0);
- gtk_widget_set_usize (nick, 100, 0);
- gtk_widget_set_usize (last, 100, 0);
- gtk_widget_set_usize (suffix, 100, 0);
-
- gtk_table_attach (table, full, 0, 6, 0, 1,
- GTK_EXPAND | GTK_FILL, 0,
- 0, 0);
-
- gtk_table_attach (table, prefix, 0, 1, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, first, 1, 2, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, middle, 2, 3, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, nick, 3, 4, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, last, 4, 5, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, suffix, 5, 6, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- prefix_label = gtk_label_new ("Prefix");
- first_label = gtk_label_new ("First");
- middle_label = gtk_label_new ("Middle");
- nick_label = gtk_label_new ("Nick");
- last_label = gtk_label_new ("Last");
- suffix_label = gtk_label_new ("Suffix");
-
- gtk_table_attach (table, prefix_label, 0, 1, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, first_label, 1, 2, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, middle_label, 2, 3, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, nick_label, 3, 4, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, last_label, 4, 5, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, suffix_label, 5, 6, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gnome_app_set_contents (GNOME_APP (app), GTK_WIDGET (table));
-
- gtk_widget_show_all (app);
-
- gtk_entry_set_text (GTK_ENTRY (full),
- "The Honorable Doctor van Jacobsen, Albert Roderick \"The Clenched Fist\" Jr, MD, PhD, Esquire");
-
- name = e_name_western_parse ("The Honorable Doctor van Jacobsen, Albert Roderick \"The Clenched Fist\" Jr, MD, PhD, Esquire");
- fill_entries ();
-
- gtk_signal_connect (GTK_OBJECT (full), "changed", full_changed_cb, NULL);
-}
-
-int
-main (int argc, char **argv)
-{
- gnome_init ("Test EName", "Test EName", argc, argv);
-
- create_window ();
-
- gtk_main ();
-
- return 0;
-}
diff --git a/addressbook/ename/test-ename-western.c b/addressbook/ename/test-ename-western.c
deleted file mode 100644
index 6d3beaf16f..0000000000
--- a/addressbook/ename/test-ename-western.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <gnome.h>
-#include <ctype.h>
-
-#include <ename/e-name-western.h>
-
-static void
-do_name (char *n)
-{
- ENameWestern *wname;
-
- wname = e_name_western_parse (n);
-
- printf ("Full Name: [%s]\n", n);
-
- printf ("Prefix: [%s]\n", wname->prefix);
- printf ("First: [%s]\n", wname->first);
- printf ("Middle: [%s]\n", wname->middle);
- printf ("Nick: [%s]\n", wname->nick);
- printf ("Last: [%s]\n", wname->last);
- printf ("Suffix: [%s]\n", wname->suffix);
-
- printf ("\n");
-
- e_name_western_free (wname);
-}
-
-int
-main (int argc, char **argv)
-{
- if (argc == 2) {
- while (! feof (stdin)) {
- char s[256];
-
- if (fgets (s, sizeof (s), stdin) == NULL)
- return 0;
-
- g_strstrip (s);
-
- do_name (s);
- }
-
- return 0;
- }
-
- do_name ("Nat");
- do_name ("Karl Anders Carlsson");
- do_name ("Miguel de Icaza Amozorrutia");
- do_name ("The Honorable Doctor de Icaza, Miguel \"Sparky\" Junior, PhD, MD");
- do_name ("Nat Friedman MD, Phd");
- do_name ("Nat Friedman PhD");
- do_name ("Friedman, Nat");
- do_name ("Miguel de Icaza Esquire");
- do_name ("Dr Miguel \"Sparky\" de Icaza");
- do_name ("Robert H.B. Netzer");
- do_name ("W. Richard Stevens");
- do_name ("Nat Friedman");
- do_name ("N. Friedman");
- do_name ("Miguel de Icaza");
- do_name ("Drew Johnson");
- do_name ("President Bill \"Slick Willy\" Clinton");
- do_name ("The Honorable Mark J. Einstein Jr");
- do_name ("Friedman, Nat");
- do_name ("de Icaza, Miguel");
- do_name ("Mr de Icaza, Miguel");
- do_name ("Smith, John Jr");
- do_name ("Nick Glennie-Smith");
- do_name ("Dr von Johnson, Albert Roderick Jr");
-
- return 0;
-}
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 a9fdef3273..0000000000
--- a/addressbook/gui/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = minicard search component \ No newline at end of file
diff --git a/addressbook/gui/component/.cvsignore b/addressbook/gui/component/.cvsignore
deleted file mode 100644
index a8ecb5d170..0000000000
--- a/addressbook/gui/component/.cvsignore
+++ /dev/null
@@ -1,10 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-evolution-addressbook
-evolution-addressbook.pure
-test-addressbook
diff --git a/addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in b/addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in
deleted file mode 100644
index 4f319fb947..0000000000
--- a/addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in
+++ /dev/null
@@ -1,88 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:e_minicard:16bb7c25-c7d2-46dc-a5f0-a0975d0e0595"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Addressbook Minicard control"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:e_minicard:f9542709-fb31-4c6a-bc00-d462ba41e4b9"
- type="factory"
- location="OAFIID:control-factory:e_minicard:16bb7c25-c7d2-46dc-a5f0-a0975d0e0595">
-
- <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="description" type="string"
- value="Factory for the Evolution addressbook minicard control."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control-factory:addressbook:3e10597b-0591-4d45-b082-d781b7aa6e17"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the sample Addressbook control"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:addressbook:851f883b-2fe7-4c94-a1e3-a1f2a7a03c49"
- type="factory"
- location="OAFIID:control-factory:addressbook:3e10597b-0591-4d45-b082-d781b7aa6e17">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/addressbook-control:1.0"/>
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="A sample Bonobo control which displays an addressbook."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:addressbook:dbf3bba0-4b0a-4f07-899b-1ec56fdf38a0"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution addressbook component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:addressbook:b7a26547-7014-4bb5-98ab-2bcac2bb55ca"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:addressbook:dbf3bba0-4b0a-4f07-899b-1ec56fdf38a0">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling contacts."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/addressbook/gui/component/GNOME_Evolution_Addressbook.oafinfo b/addressbook/gui/component/GNOME_Evolution_Addressbook.oafinfo
deleted file mode 100644
index 4f319fb947..0000000000
--- a/addressbook/gui/component/GNOME_Evolution_Addressbook.oafinfo
+++ /dev/null
@@ -1,88 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:e_minicard:16bb7c25-c7d2-46dc-a5f0-a0975d0e0595"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Addressbook Minicard control"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:e_minicard:f9542709-fb31-4c6a-bc00-d462ba41e4b9"
- type="factory"
- location="OAFIID:control-factory:e_minicard:16bb7c25-c7d2-46dc-a5f0-a0975d0e0595">
-
- <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="description" type="string"
- value="Factory for the Evolution addressbook minicard control."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control-factory:addressbook:3e10597b-0591-4d45-b082-d781b7aa6e17"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the sample Addressbook control"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:addressbook:851f883b-2fe7-4c94-a1e3-a1f2a7a03c49"
- type="factory"
- location="OAFIID:control-factory:addressbook:3e10597b-0591-4d45-b082-d781b7aa6e17">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/addressbook-control:1.0"/>
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="A sample Bonobo control which displays an addressbook."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:addressbook:dbf3bba0-4b0a-4f07-899b-1ec56fdf38a0"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution addressbook component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:addressbook:b7a26547-7014-4bb5-98ab-2bcac2bb55ca"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:addressbook:dbf3bba0-4b0a-4f07-899b-1ec56fdf38a0">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling contacts."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/addressbook/gui/component/Makefile.am b/addressbook/gui/component/Makefile.am
deleted file mode 100644
index 9dc6f10e3a..0000000000
--- a/addressbook/gui/component/Makefile.am
+++ /dev/null
@@ -1,91 +0,0 @@
-SUBDIRS = select-names
-
-CPPFLAGS = \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\"
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"evolution-addressbook\" \
- $(EXTRA_GNOME_CFLAGS) \
- $(GNOME_INCLUDEDIR) \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I$(top_srcdir)/shell \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/widgets/e-text \
- -I$(top_srcdir)/widgets/e-table \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_srcdir)/addressbook/gui/minicard \
- -I$(top_srcdir)/addressbook/contact-editor \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- $(BONOBO_HTML_GNOME_CFLAGS) \
- -DEVOLUTION_VERSION=\""$(VERSION)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \
- -DEVOLUTION_LOCALEDIR=\""$(datadir)/locale"\" \
- -DCAMEL_PROVIDERDIR=\""$(providerdir)"\"
-
-bin_PROGRAMS = \
- evolution-addressbook
-
-evolution_addressbook_SOURCES = \
- addressbook-component.c \
- addressbook-component.h \
- addressbook-factory.c \
- addressbook.c \
- addressbook.h \
- e-addressbook-model.c \
- e-addressbook-model.h \
- e-cardlist-model.c \
- e-cardlist-model.h \
- e-ldap-server-dialog.c \
- e-ldap-server-dialog.h \
- e-ldap-storage.c \
- e-ldap-storage.h
-
-evolution_addressbook_LDADD = \
- select-names/libeselectnames.la \
- $(top_builddir)/shell/libeshell.a \
- $(EXTRA_GNOME_LIBS) \
- $(BONOBO_HTML_GNOME_LIBS) \
- $(top_builddir)/addressbook/gui/minicard/libeminicard.a \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/addressbook/gui/search/libeaddressbooksearch.a
-
-evolution_addressbook_LDFLAGS = `gnome-config --libs gdk_pixbuf`
-
-if USING_OAF
-oafdir = $(datadir)/oaf
-oaf_DATA = addressbook.oafinfo
-else
-gnorbadir = $(sysconfdir)/CORBA/servers
-gnorba_DATA = addressbook.gnorba
-endif
-
-gladedir = $(datadir)/evolution/glade
-glade_DATA = ldap-server-dialog.glade ldap-server-dialog.glade.h alphabet.glade
-
-EXTRA_DIST = \
- $(glade_DATA) \
- addressbook.gnorba \
- addressbook.oafinfo \
- alphabet.glade.h
-
-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 b066330a49..0000000000
--- a/addressbook/gui/component/addressbook-component.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* addressbook-component.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo.h>
-
-#include "evolution-shell-component.h"
-#include "evolution-storage.h"
-
-#include "addressbook-component.h"
-#include "addressbook.h"
-#include "e-ldap-storage.h"
-
-
-#ifdef USING_OAF
-#define COMPONENT_FACTORY_ID "OAFIID:evolution-shell-component-factory:addressbook:dbf3bba0-4b0a-4f07-899b-1ec56fdf38a0"
-#else
-#define COMPONENT_FACTORY_ID "evolution-shell-component-factory:addressbook"
-#endif
-
-static BonoboGenericFactory *factory = NULL;
-
-static const EvolutionShellComponentFolderType folder_types[] = {
- { "contacts", "evolution-contacts.png" },
- { NULL, NULL }
-};
-
-
-/* EvolutionShellComponent methods and signals. */
-
-static EvolutionShellComponentResult
-create_view (EvolutionShellComponent *shell_component,
- const char *physical_uri,
- const char *type,
- BonoboControl **control_return,
- void *closure)
-{
- BonoboControl *control;
-
- if (g_strcasecmp (type, "contacts") != 0)
- return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE;
-
- control = addressbook_factory_new_control ();
- bonobo_control_set_property (control, "folder_uri", physical_uri, NULL);
-
- *control_return = control;
-
- return EVOLUTION_SHELL_COMPONENT_OK;
-}
-
-static int owner_count = 0;
-
-static void
-owner_set_cb (EvolutionShellComponent *shell_component,
- EvolutionShellClient *shell_client,
- const char *evolution_homedir,
- gpointer user_data)
-{
- owner_count ++;
-
- setup_ldap_storage (shell_component, evolution_homedir);
-}
-
-static void
-owner_unset_cb (EvolutionShellComponent *shell_component,
- Evolution_Shell shell_interface,
- gpointer user_data)
-{
- owner_count --;
- if (owner_count == 0)
- gtk_main_quit();
-}
-
-
-/* The factory function. */
-
-static BonoboObject *
-factory_fn (BonoboGenericFactory *factory,
- void *closure)
-{
- EvolutionShellComponent *shell_component;
-
- shell_component = evolution_shell_component_new (folder_types, create_view, NULL, NULL, NULL, NULL);
-
- gtk_signal_connect (GTK_OBJECT (shell_component), "owner_set",
- GTK_SIGNAL_FUNC (owner_set_cb), NULL);
-
- gtk_signal_connect (GTK_OBJECT (shell_component), "owner_unset",
- GTK_SIGNAL_FUNC (owner_unset_cb), NULL);
-
- return BONOBO_OBJECT (shell_component);
-}
-
-
-void
-addressbook_component_factory_init (void)
-{
- if (factory != NULL)
- return;
-
- factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, factory_fn, NULL);
-
- if (factory == NULL)
- g_error ("Cannot initialize the Evolution addressbook factory.");
-}
-
diff --git a/addressbook/gui/component/addressbook-component.h b/addressbook/gui/component/addressbook-component.h
deleted file mode 100644
index ec37da694a..0000000000
--- a/addressbook/gui/component/addressbook-component.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* addressbook-component.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _ADDRESSBOOK_COMPONENT_H
-#define _ADDRESSBOOK_COMPONENT_H
-
-void addressbook_component_factory_init (void);
-
-#endif /* _ADDRESSBOOK_COMPONENT_H */
diff --git a/addressbook/gui/component/addressbook-factory.c b/addressbook/gui/component/addressbook-factory.c
deleted file mode 100644
index 7b939318fb..0000000000
--- a/addressbook/gui/component/addressbook-factory.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * sample-control-factory.c
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * Author:
- * Nat Friedman (nat@nat.org)
- *
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <bonobo.h>
-#include <glade/glade.h>
-#include <e-util/e-cursors.h>
-
-#include "addressbook.h"
-#include "addressbook-component.h"
-#include "addressbook/gui/minicard/e-minicard-control.h"
-#include "select-names/e-select-names-factory.h"
-
-#ifdef USING_OAF
-
-#include <liboaf/liboaf.h>
-
-static void
-init_corba (int *argc, char **argv)
-{
- gnome_init_with_popt_table ("evolution-addressbook", "0.0",
- *argc, argv, oaf_popt_options, 0, NULL);
-
- oaf_init (*argc, argv);
-}
-
-#else
-
-#include <libgnorba/gnorba.h>
-
-static void
-init_corba (int *argc, char **argv)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- gnome_CORBA_init_with_popt_table (
- "evolution-addressbook", "0.0",
- argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
-
- CORBA_exception_free (&ev);
-}
-
-#endif
-
-static void
-init_bonobo (int argc, char **argv)
-{
- if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-
- glade_gnome_init ();
-}
-
-int
-main (int argc, char **argv)
-{
- init_corba (&argc, argv);
-
- init_bonobo (argc, argv);
-
- /* FIXME: Messy names here. This file should be `main.c'. `addressbook.c' should
- be `addressbook-control-factory.c' and the functions should be called
- `addressbook_control_factory_something()'. And `addressbook-component.c'
- should be `addressbook-component-factory.c'. */
-
- addressbook_factory_init ();
- addressbook_component_factory_init ();
-
- e_select_names_factory_init ();
-
- e_minicard_control_factory_init ();
-
- e_cursors_init();
-
- bonobo_main ();
-
- return 0;
-}
diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c
deleted file mode 100644
index 9c0213edd8..0000000000
--- a/addressbook/gui/component/addressbook.c
+++ /dev/null
@@ -1,1144 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * addressbook.c:
- *
- * Author:
- * Chris Lahey (clahey@helixcode.com)
- *
- * (C) 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-
-#include <gnome.h>
-#include <libgnorba/gnorba.h>
-#include <bonobo.h>
-
-#include "addressbook.h"
-
-#include <ebook/e-book.h>
-#include <e-util/e-util.h>
-#include <e-util/e-popup-menu.h>
-#include "e-minicard-view-widget.h"
-#include "addressbook/gui/search/e-addressbook-search-dialog.h"
-
-#include <e-table.h>
-#include <e-cell-text.h>
-
-#include <e-scroll-frame.h>
-
-#include <e-addressbook-model.h>
-#include <select-names/e-select-names.h>
-#include <select-names/e-select-names-manager.h>
-#include "e-contact-editor.h"
-#include "e-contact-save-as.h"
-#include "e-ldap-server-dialog.h"
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-dialog.h>
-#include <libgnomeprint/gnome-print-master.h>
-#include <libgnomeprint/gnome-print-master-preview.h>
-
-#include <addressbook/printing/e-contact-print.h>
-
-#ifdef USING_OAF
-#define CONTROL_FACTORY_ID "OAFIID:control-factory:addressbook:3e10597b-0591-4d45-b082-d781b7aa6e17"
-#else
-#define CONTROL_FACTORY_ID "control-factory:addressbook"
-#endif
-
-#define PROPERTY_FOLDER_URI "folder_uri"
-
-#define PROPERTY_FOLDER_URI_IDX 1
-
-typedef enum {
- ADDRESSBOOK_VIEW_NONE, /* initialized to this */
- ADDRESSBOOK_VIEW_TABLE,
- ADDRESSBOOK_VIEW_MINICARD
-} AddressbookViewType;
-
-typedef struct {
- AddressbookViewType view_type;
- EBook *book;
- GtkWidget *vbox;
- GtkWidget *minicard_hbox;
- GtkWidget *minicard_view;
- GtkWidget *table;
- ETableModel *model;
- ECardSimple *simple;
- GtkAllocation last_alloc;
- BonoboControl *control;
- BonoboPropertyBag *properties;
- char *uri;
-} AddressbookView;
-
-static void change_view_type (AddressbookView *view, AddressbookViewType view_type);
-
-static void
-control_deactivate (BonoboControl *control, BonoboUIHandler *uih)
-{
- /* how to remove a menu item */
- bonobo_ui_handler_menu_remove (uih, "/File/<Print Placeholder>/Print contacts...");
- bonobo_ui_handler_menu_remove (uih, "/File/<Print Placeholder>/separator1");
- bonobo_ui_handler_menu_remove (uih, "/File/TestSelectNames");
- bonobo_ui_handler_menu_remove (uih, "/View/<sep>");
- bonobo_ui_handler_menu_remove (uih, "/View/Toggle View");
- bonobo_ui_handler_menu_remove (uih, "/Actions/New Contact");
-#ifdef HAVE_LDAP
- bonobo_ui_handler_menu_remove (uih, "/Actions/New Directory Server");
-#endif
- bonobo_ui_handler_menu_remove (uih, "/<Component Placeholder>/Tools");
- bonobo_ui_handler_menu_remove (uih, "/<Component Placeholder>/Tools/Search");
- /* remove our toolbar */
- bonobo_ui_handler_dock_remove (uih, "/Toolbar");
-}
-
-static void
-card_added_cb (EBook* book, EBookStatus status, const char *id,
- gpointer user_data)
-{
- g_print ("%s: %s(): a card was added\n", __FILE__, __FUNCTION__);
-}
-
-static void
-card_modified_cb (EBook* book, EBookStatus status,
- gpointer user_data)
-{
- g_print ("%s: %s(): a card was modified\n", __FILE__, __FUNCTION__);
-}
-
-/* Callback for the add_card signal from the contact editor */
-static void
-add_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_add_card (book, card, card_added_cb, NULL);
-}
-
-/* Callback for the commit_card signal from the contact editor */
-static void
-commit_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_commit_card (book, card, card_modified_cb, NULL);
-}
-
-/* Callback for the delete_card signal from the contact editor */
-static void
-delete_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_remove_card (book, card, card_modified_cb, NULL);
-}
-
-/* Callback used when the contact editor is closed */
-static void
-editor_closed_cb (EContactEditor *ce, gpointer data)
-{
- gtk_object_unref (GTK_OBJECT (ce));
-}
-
-static void
-new_contact_cb (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- ECard *card;
- EBook *book;
- EContactEditor *ce;
- AddressbookView *view = (AddressbookView *) user_data;
- GtkObject *object;
-
- card = e_card_new("");
-
- if (view->minicard_view)
- object = GTK_OBJECT(view->minicard_view);
- else
- object = GTK_OBJECT(view->model);
-
- gtk_object_get(object, "book", &book, NULL);
- g_assert (E_IS_BOOK (book));
-
- ce = e_contact_editor_new (card, TRUE);
-
- gtk_signal_connect (GTK_OBJECT (ce), "add_card",
- GTK_SIGNAL_FUNC (add_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "commit_card",
- GTK_SIGNAL_FUNC (commit_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "delete_card",
- GTK_SIGNAL_FUNC (delete_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), NULL);
-
- gtk_object_sink(GTK_OBJECT(card));
-}
-
-static void
-toggle_view_as_cb (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- AddressbookView *view = user_data;
-
- if (view->view_type == ADDRESSBOOK_VIEW_TABLE)
- change_view_type (view, ADDRESSBOOK_VIEW_MINICARD);
- else
- change_view_type (view, ADDRESSBOOK_VIEW_TABLE);
-}
-
-#ifdef HAVE_LDAP
-static void
-null_cb (EBook *book, EBookStatus status, gpointer closure)
-{
-}
-
-static void
-new_server_cb (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- ELDAPServer *server = g_new (ELDAPServer, 1);
- EBook *book;
- AddressbookView *view = (AddressbookView *) user_data;
- GtkObject *object;
-
- /* fill in the defaults */
- server->name = g_strdup("");
- server->host = g_strdup("");
- server->port = g_strdup_printf("%d", 389);
- server->description = g_strdup("");
- server->rootdn = g_strdup("");
- server->uri = g_strdup_printf ("ldap://%s:%s/%s", server->host, server->port, server->rootdn);
- e_ldap_server_editor_show (server);
-
- if (view->minicard_view)
- object = GTK_OBJECT(view->minicard_view);
- else
- object = GTK_OBJECT(view->model);
- gtk_object_get(object, "book", &book, NULL);
- g_assert (E_IS_BOOK (book));
-
- /* write out the new server info */
- e_ldap_storage_add_server (server);
-
- /* now update the view */
- e_book_unload_uri (book);
- if (! e_book_load_uri (book, server->uri, null_cb, NULL)) {
- g_warning ("error calling load_uri!\n");
- }
-}
-#endif
-
-static void
-search_cb (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- EBook *book;
- AddressbookView *view = (AddressbookView *) user_data;
- GtkObject *object;
-
- if (view->minicard_view)
- object = GTK_OBJECT(view->minicard_view);
- else
- object = GTK_OBJECT(view->model);
- gtk_object_get(object, "book", &book, NULL);
- g_assert (E_IS_BOOK (book));
-
- gtk_widget_show(e_addressbook_search_dialog_new(book));
-}
-
-static char *
-get_query (AddressbookView *view)
-{
- GtkObject *object;
- char *query = NULL;
-
- if (view->minicard_view)
- object = GTK_OBJECT(view->minicard_view);
- else
- object = GTK_OBJECT(view->model);
-
- if (object)
- gtk_object_get (object, "query", &query, NULL);
-
- return query;
-}
-
-static void
-set_query (AddressbookView *view, char *query)
-{
- GtkObject *object;
-
- if (view->minicard_view)
- object = GTK_OBJECT(view->minicard_view);
- else
- object = GTK_OBJECT(view->model);
-
- gtk_object_set (object,
- "query", query,
- NULL);
-}
-
-static void
-set_book(AddressbookView *view)
-{
- if (view->book)
- gtk_object_set(view->minicard_view ? GTK_OBJECT(view->minicard_view) : GTK_OBJECT(view->model),
- "book", view->book,
- NULL);
-}
-
-static void
-find_contact_cb (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- gint result;
- GtkWidget* search_entry = gtk_entry_new();
- gchar* search_text;
- AddressbookView *view = (AddressbookView *) user_data;
-
- GtkWidget* dlg = gnome_dialog_new ("Search Contacts", "Find",
- GNOME_STOCK_BUTTON_CANCEL, NULL);
-
- search_text = get_query (view);
- gtk_entry_set_text(GTK_ENTRY(search_entry), search_text);
- g_free (search_text);
-
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dlg)->vbox),
- search_entry, TRUE, TRUE, 0);
-
- gtk_widget_show_all (dlg);
-
- gnome_dialog_close_hides (GNOME_DIALOG (dlg), TRUE);
- result = gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
-
- /* If the user clicks "okay"...*/
- if (result == 0) {
- search_text = gtk_entry_get_text(GTK_ENTRY(search_entry));
- set_query (view, search_text);
- }
-
-}
-
-static void
-card_deleted_cb (EBook* book, EBookStatus status, gpointer user_data)
-{
- g_print ("%s: %s(): a card was deleted\n", __FILE__, __FUNCTION__);
-}
-
-static void
-delete_contact_cb (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- if (view->minicard_view)
- e_minicard_view_widget_remove_selection (E_MINICARD_VIEW_WIDGET(view->minicard_view), card_deleted_cb, NULL);
-}
-
-static void
-e_contact_print_destroy(GnomeDialog *dialog, gpointer data)
-{
- ETableScrolled *table = gtk_object_get_data(GTK_OBJECT(dialog), "table");
- EPrintable *printable = gtk_object_get_data(GTK_OBJECT(dialog), "printable");
- gtk_object_unref(GTK_OBJECT(printable));
- gtk_object_unref(GTK_OBJECT(table));
-}
-
-static void
-e_contact_print_button(GnomeDialog *dialog, gint button, gpointer data)
-{
- GnomePrintMaster *master;
- GnomePrintContext *pc;
- EPrintable *printable = gtk_object_get_data(GTK_OBJECT(dialog), "printable");
- GtkWidget *preview;
- switch( button ) {
- case GNOME_PRINT_PRINT:
- master = gnome_print_master_new_from_dialog( GNOME_PRINT_DIALOG(dialog) );
- pc = gnome_print_master_get_context( master );
- e_printable_reset(printable);
- while (e_printable_data_left(printable)) {
- if (gnome_print_gsave(pc) == -1)
- /* FIXME */;
- if (gnome_print_translate(pc, .5 * 72, .5 * 72) == -1)
- /* FIXME */;
- e_printable_print_page(printable,
- pc,
- 7.5 * 72,
- 10.5 * 72,
- TRUE);
- if (gnome_print_grestore(pc) == -1)
- /* FIXME */;
- if (gnome_print_showpage(pc) == -1)
- /* FIXME */;
- }
- gnome_print_master_close(master);
- gnome_print_master_print(master);
- gtk_object_unref(GTK_OBJECT(master));
- gnome_dialog_close(dialog);
- break;
- case GNOME_PRINT_PREVIEW:
- master = gnome_print_master_new_from_dialog( GNOME_PRINT_DIALOG(dialog) );
- pc = gnome_print_master_get_context( master );
- e_printable_reset(printable);
- while (e_printable_data_left(printable)) {
- if (gnome_print_gsave(pc) == -1)
- /* FIXME */;
- if (gnome_print_translate(pc, .5 * 72, .5 * 72) == -1)
- /* FIXME */;
- e_printable_print_page(printable,
- pc,
- 7.5 * 72,
- 10.5 * 72,
- TRUE);
- if (gnome_print_grestore(pc) == -1)
- /* FIXME */;
- if (gnome_print_showpage(pc) == -1)
- /* FIXME */;
- }
- gnome_print_master_close(master);
- preview = GTK_WIDGET(gnome_print_master_preview_new(master, "Print Preview"));
- gtk_widget_show_all(preview);
- gtk_object_unref(GTK_OBJECT(master));
- break;
- case GNOME_PRINT_CANCEL:
- gnome_dialog_close(dialog);
- break;
- }
-}
-
-static void
-print_cb (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- if (view->minicard_view) {
- char *query = get_query(view);
- GtkWidget *print = e_contact_print_dialog_new(view->book, query);
- g_free(query);
- gtk_widget_show_all(print);
- } else {
- GtkWidget *dialog;
- EPrintable *printable;
-
- dialog = gnome_print_dialog_new("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);
-
- printable = e_table_scrolled_get_printable(E_TABLE_SCROLLED(view->table));
-
- gtk_object_ref(GTK_OBJECT(view->table));
-
- gtk_object_set_data(GTK_OBJECT(dialog), "table", view->table);
- gtk_object_set_data(GTK_OBJECT(dialog), "printable", printable);
-
- gtk_signal_connect(GTK_OBJECT(dialog),
- "clicked", GTK_SIGNAL_FUNC(e_contact_print_button), NULL);
- gtk_signal_connect(GTK_OBJECT(dialog),
- "destroy", GTK_SIGNAL_FUNC(e_contact_print_destroy), NULL);
- gtk_widget_show(dialog);
- }
-}
-
-static GnomeUIInfo gnome_toolbar [] = {
- GNOMEUIINFO_ITEM_STOCK (N_("New"), N_("Create a new contact"), new_contact_cb, GNOME_STOCK_PIXMAP_NEW),
-
- GNOMEUIINFO_SEPARATOR,
-
- GNOMEUIINFO_ITEM_STOCK (N_("Find"), N_("Find a contact"), find_contact_cb, GNOME_STOCK_PIXMAP_SEARCH),
- GNOMEUIINFO_ITEM_STOCK (N_("Print"), N_("Print contacts"), print_cb, GNOME_STOCK_PIXMAP_PRINT),
- GNOMEUIINFO_ITEM_STOCK (N_("Delete"), N_("Delete a contact"), delete_contact_cb, GNOME_STOCK_PIXMAP_TRASH),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_END
-};
-
-
-static void
-search_entry_activated (GtkWidget* widget, gpointer user_data)
-{
- char* search_word = gtk_entry_get_text(GTK_ENTRY(widget));
- char* search_query;
- AddressbookView *view = (AddressbookView *) user_data;
-
- if (search_word && strlen (search_word))
- search_query = g_strdup_printf (
- "(contains \"x-evolution-any-field\" \"%s\")",
- search_word);
- else
- search_query = g_strdup (
- "(contains \"full_name\" \"\")");
-
- set_query(view, search_query);
-
- g_free (search_query);
-}
-
-static GtkWidget*
-make_quick_search_widget (GtkSignalFunc start_search_func,
- gpointer user_data_for_search)
-{
- GtkWidget *search_vbox = gtk_vbox_new (FALSE, 0);
- GtkWidget *search_entry = gtk_entry_new ();
-
- if (start_search_func)
- {
- gtk_signal_connect (GTK_OBJECT (search_entry), "activate",
- (GtkSignalFunc) search_entry_activated,
- user_data_for_search);
- }
-
- /* add the search entry to the our search_vbox */
- gtk_box_pack_start (GTK_BOX (search_vbox), search_entry,
- FALSE, TRUE, 3);
- gtk_box_pack_start (GTK_BOX (search_vbox),
- gtk_label_new("Quick Search"),
- FALSE, TRUE, 0);
-
- return search_vbox;
-}
-
-static void
-control_activate (BonoboControl *control, BonoboUIHandler *uih,
- AddressbookView *view)
-{
- Bonobo_UIHandler remote_uih;
- GtkWidget *toolbar, *toolbar_frame;
- BonoboControl *toolbar_control;
- GnomeDockItemBehavior behavior;
- GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
- GtkWidget *quick_search_widget;
-
- remote_uih = bonobo_control_get_remote_ui_handler (control);
- bonobo_ui_handler_set_container (uih, remote_uih);
- bonobo_object_release_unref (remote_uih, NULL);
-
- bonobo_ui_handler_menu_new_separator (uih, "/View/<sep>", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/<Print Placeholder>/Print contacts...",
- N_("_Print Contacts..."),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_PRINT,
- 0, 0, print_cb,
- (gpointer) view);
-
- bonobo_ui_handler_menu_new_separator (uih, "/File/<Print Placeholder>/separator1", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/View/Toggle View",
- N_("As _Table"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0, toggle_view_as_cb,
- (gpointer)view);
-
- bonobo_ui_handler_menu_new_item (uih, "/Actions/New Contact",
- N_("_New Contact"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0, new_contact_cb,
- (gpointer)view);
-
-#ifdef HAVE_LDAP
- bonobo_ui_handler_menu_new_item (uih, "/Actions/New Directory Server",
- N_("N_ew Directory Server"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0, new_server_cb,
- (gpointer)view);
-#endif
-
- bonobo_ui_handler_menu_new_subtree (uih, "/<Component Placeholder>/Tools",
- _("_Tools"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-
- bonobo_ui_handler_menu_new_item (uih, "/<Component Placeholder>/Tools/Search",
- N_("_Search for contacts"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK, GNOME_STOCK_MENU_SEARCH,
- 0, 0, search_cb,
- (gpointer)view);
-
- toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL,
- GTK_TOOLBAR_BOTH);
-
- gnome_app_fill_toolbar_with_data (GTK_TOOLBAR (toolbar),
- gnome_toolbar,
- NULL, view);
-
- gtk_box_pack_start (GTK_BOX (hbox), toolbar, FALSE, TRUE, 0);
-
-
- /* add the search_vbox to the hbox which will be our toolbar */
- quick_search_widget = make_quick_search_widget (
- search_entry_activated, view);
-
- gtk_box_pack_start (GTK_BOX (hbox),
- quick_search_widget,
- FALSE, TRUE, 0);
-
- gtk_widget_show_all (hbox);
-
- toolbar_frame = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (GTK_FRAME (toolbar_frame), GTK_SHADOW_OUT);
- gtk_container_add (GTK_CONTAINER (toolbar_frame), hbox);
- gtk_widget_show (toolbar_frame);
-
- gtk_widget_show_all (toolbar_frame);
-
- behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE;
- if (!gnome_preferences_get_toolbar_detachable ())
- behavior |= GNOME_DOCK_ITEM_BEH_LOCKED;
-
- toolbar_control = bonobo_control_new (toolbar_frame);
- bonobo_ui_handler_dock_add (
- uih, "/Toolbar",
- bonobo_object_corba_objref (BONOBO_OBJECT (toolbar_control)),
- behavior,
- GNOME_DOCK_TOP,
- 1, 1, 0);
-}
-
-static void
-control_activate_cb (BonoboControl *control,
- gboolean activate,
- AddressbookView *view)
-{
- BonoboUIHandler *uih;
-
- uih = bonobo_control_get_ui_handler (control);
- g_assert (uih);
-
- if (activate)
- control_activate (control, uih, view);
- else
- control_deactivate (control, uih);
-}
-
-static void
-addressbook_view_free(AddressbookView *view)
-{
- if (view->properties)
- bonobo_object_unref(BONOBO_OBJECT(view->properties));
- if (view->book)
- gtk_object_unref(GTK_OBJECT(view->book));
- g_free(view->uri);
- g_free(view);
-}
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- AddressbookView *view = closure;
- if (status == E_BOOK_STATUS_SUCCESS) {
- set_book (view);
- } else {
- GtkWidget *warning_dialog, *label, *href;
- warning_dialog = gnome_dialog_new (
- _("Unable to open addressbook"),
- GNOME_STOCK_BUTTON_CLOSE,
- NULL);
-
- label = gtk_label_new (
- _("We were unable to open this addressbook. This either\n"
- "means you have entered an incorrect URI, or have tried\n"
- "to access an LDAP server and don't have LDAP support\n"
- "compiled in. If you've entered a URI, check the URI for\n"
- "correctness and reenter. If not, you probably have\n"
- "attempted to access an LDAP server. If you wish to be\n"
- "able to use LDAP, you'll need to download and install\n"
- "OpenLDAP and recompile and install evolution.\n"));
- gtk_misc_set_alignment(GTK_MISC(label),
- 0, .5);
- gtk_label_set_justify(GTK_LABEL(label),
- GTK_JUSTIFY_LEFT);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (warning_dialog)->vbox),
- label, TRUE, TRUE, 0);
- gtk_widget_show (label);
-
- href = gnome_href_new ("http://www.openldap.org/", "OpenLDAP at http://www.openldap.org/");
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (warning_dialog)->vbox),
- href, FALSE, FALSE, 0);
- gtk_widget_show (href);
-
- gnome_dialog_run (GNOME_DIALOG (warning_dialog));
-
- gtk_object_destroy (GTK_OBJECT (warning_dialog));
- }
-}
-
-static void destroy_callback(GtkWidget *widget, gpointer data)
-{
- AddressbookView *view = data;
- addressbook_view_free(view);
-}
-
-static void
-get_prop (BonoboPropertyBag *bag,
- BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- AddressbookView *view = user_data;
-
- switch (arg_id) {
-
- case PROPERTY_FOLDER_URI_IDX:
- if (view && view->uri)
- BONOBO_ARG_SET_STRING (arg, view->uri);
- else
- BONOBO_ARG_SET_STRING (arg, "");
- break;
-
- default:
- g_warning ("Unhandled arg %d\n", arg_id);
- }
-}
-
-static void
-set_prop (BonoboPropertyBag *bag,
- const BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- AddressbookView *view = user_data;
-
- char *uri_data;
-
- switch (arg_id) {
-
- case PROPERTY_FOLDER_URI_IDX:
- if (view->uri) {
- /* we've already had a uri set on this view, so unload it */
- e_book_unload_uri (view->book);
- g_free (view->uri);
- }
-
- view->uri = g_strdup(BONOBO_ARG_GET_STRING (arg));
-
- if (!strncmp (view->uri, "file:", 5)) {
- char *file_name = g_concat_dir_and_file(view->uri + 7, "addressbook.db");
- uri_data = g_strdup_printf("file://%s", file_name);
- g_free(file_name);
- }
- else {
- uri_data = g_strdup (view->uri);
- }
-
- if (! e_book_load_uri (view->book, uri_data, book_open_cb, view))
- printf ("error calling load_uri!\n");
-
- g_free(uri_data);
-
- break;
-
- default:
- g_warning ("Unhandled arg %d\n", arg_id);
- break;
- }
-}
-
-#define SPEC "<?xml version=\"1.0\"?> \
-<ETableSpecification click-to-add=\"1\"> \
- <columns-shown> \
- <column>0</column> \
- <column>1</column> \
- <column>5</column> \
- <column>3</column> \
- <column>4</column> \
- </columns-shown> \
- <grouping> \
- <leaf column=\"0\" ascending=\"1\"/> \
- </grouping> \
-</ETableSpecification>"
-
-static void
-teardown_minicard_view (AddressbookView *view)
-{
- if (view->minicard_view) {
- view->minicard_view = NULL;
- }
- if (view->minicard_hbox) {
- gtk_widget_destroy(view->minicard_hbox);
- view->minicard_hbox = NULL;
- }
-}
-
-typedef struct {
- AddressbookView *view;
- char letter;
-} LetterClosure;
-
-static void
-jump_to_letter(GtkWidget *button, LetterClosure *closure)
-{
- if (closure->view->minicard_view)
- e_minicard_view_widget_jump_to_letter(E_MINICARD_VIEW_WIDGET(closure->view->minicard_view), closure->letter);
-}
-
-static void
-free_closure(GtkWidget *button, LetterClosure *closure)
-{
- g_free(closure);
-}
-
-static void
-connect_button (AddressbookView *view, GladeXML *gui, char letter)
-{
- char *name;
- GtkWidget *button;
- LetterClosure *closure;
- name = g_strdup_printf("button-%c", letter);
- button = glade_xml_get_widget(gui, name);
- g_free(name);
- if (!button)
- return;
- closure = g_new(LetterClosure, 1);
- closure->view = view;
- closure->letter = letter;
- gtk_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(jump_to_letter), closure);
- gtk_signal_connect(GTK_OBJECT(button), "destroy",
- GTK_SIGNAL_FUNC(free_closure), closure);
-}
-
-static GtkWidget *
-create_alphabet (AddressbookView *view)
-{
- GtkWidget *widget;
- char letter;
- GladeXML *gui = glade_xml_new (EVOLUTION_GLADEDIR "/alphabet.glade", NULL);
-
- widget = glade_xml_get_widget(gui, "scrolledwindow-top");
- if (!widget) {
- return NULL;
- }
-
- connect_button(view, gui, '1');
- for (letter = 'a'; letter <= 'z'; letter ++) {
- connect_button(view, gui, letter);
- }
-
- gtk_object_unref(GTK_OBJECT(gui));
- return widget;
-}
-
-static void
-create_minicard_view (AddressbookView *view, char *initial_query)
-{
- GtkWidget *scrollframe;
- GtkWidget *alphabet;
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- view->minicard_hbox = gtk_hbox_new(FALSE, 0);
-
- view->minicard_view = e_minicard_view_widget_new();
-
- scrollframe = e_scroll_frame_new (NULL, NULL);
- e_scroll_frame_set_policy (E_SCROLL_FRAME (scrollframe),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_NEVER);
-
- gtk_container_add (GTK_CONTAINER (scrollframe), view->minicard_view);
-
- gtk_box_pack_start(GTK_BOX(view->minicard_hbox), scrollframe, TRUE, TRUE, 0);
-
- alphabet = create_alphabet(view);
- if (alphabet) {
- gtk_object_ref(GTK_OBJECT(alphabet));
- gtk_widget_unparent(alphabet);
- gtk_box_pack_start(GTK_BOX(view->minicard_hbox), alphabet, FALSE, FALSE, 0);
- gtk_object_unref(GTK_OBJECT(alphabet));
- }
-
- gtk_box_pack_start(GTK_BOX(view->vbox), view->minicard_hbox, TRUE, TRUE, 0);
-
- gtk_widget_show_all( GTK_WIDGET(view->minicard_hbox) );
-
-#if 0
- gdk_window_set_back_pixmap(
- GTK_LAYOUT(view->canvas)->bin_window, NULL, FALSE);
-#endif
-
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
-}
-
-static void
-teardown_table_view (AddressbookView *view)
-{
- if (view->table) {
- gtk_widget_destroy (GTK_WIDGET (view->table));
- view->table = NULL;
- }
- if (view->model) {
- gtk_object_unref (GTK_OBJECT (view->model));
- view->model = NULL;
- }
- if (view->simple) {
- gtk_object_destroy (GTK_OBJECT (view->simple));
- view->simple = NULL;
- }
-}
-
-static void
-table_double_click(ETableScrolled *table, gint row, AddressbookView *view)
-{
- ECard *card = e_addressbook_model_get_card(E_ADDRESSBOOK_MODEL(view->model), row);
- EBook *book;
- EContactEditor *ce;
-
- gtk_object_get(GTK_OBJECT(view->model),
- "book", &book,
- NULL);
-
- g_assert (E_IS_BOOK (book));
-
- ce = e_contact_editor_new (card, FALSE);
-
- gtk_signal_connect (GTK_OBJECT (ce), "add_card",
- GTK_SIGNAL_FUNC (add_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "commit_card",
- GTK_SIGNAL_FUNC (commit_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), NULL);
-
- gtk_object_unref(GTK_OBJECT(card));
-}
-
-typedef struct {
- EBook *book;
- ECard *card;
-} CardAndBook;
-
-static void
-card_and_book_free (CardAndBook *card_and_book)
-{
- gtk_object_unref(GTK_OBJECT(card_and_book->card));
- gtk_object_unref(GTK_OBJECT(card_and_book->book));
-}
-
-static void
-save_as (GtkWidget *widget, CardAndBook *card_and_book)
-{
- e_contact_save_as(_("Save as VCard"), card_and_book->card);
- card_and_book_free(card_and_book);
-}
-
-static void
-print (GtkWidget *widget, CardAndBook *card_and_book)
-{
- gtk_widget_show(e_contact_print_card_dialog_new(card_and_book->card));
- card_and_book_free(card_and_book);
-}
-
-static void
-delete (GtkWidget *widget, CardAndBook *card_and_book)
-{
- if (e_contact_editor_confirm_delete()) {
- /* Add the card in the contact editor to our ebook */
- e_book_remove_card (card_and_book->book,
- card_and_book->card,
- NULL,
- NULL);
- }
- card_and_book_free(card_and_book);
-}
-
-static gint
-table_right_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, AddressbookView *view)
-{
- CardAndBook *card_and_book;
-
- EPopupMenu menu[] = {
- {"Save as VCard", NULL, GTK_SIGNAL_FUNC(save_as), 0},
- {"Print", NULL, GTK_SIGNAL_FUNC(print), 0},
- {"Delete", NULL, GTK_SIGNAL_FUNC(delete), 0},
- {NULL, NULL, NULL, 0}
- };
-
- card_and_book = g_new(CardAndBook, 1);
- card_and_book->card = e_addressbook_model_get_card(E_ADDRESSBOOK_MODEL(view->model), row);
- gtk_object_get(GTK_OBJECT(view->model),
- "book", &(card_and_book->book),
- NULL);
-
- gtk_object_ref(GTK_OBJECT(card_and_book->book));
-
- e_popup_menu_run (menu, (GdkEventButton *)event, 0, 0, card_and_book);
-
- return TRUE;
-}
-
-static void
-create_table_view (AddressbookView *view, char *initial_query)
-{
- ECell *cell_left_just;
- ETableHeader *e_table_header;
- int i;
-
- view->simple = e_card_simple_new(NULL);
-
- view->model = e_addressbook_model_new();
-
- /*
- Next we create a header. The ETableHeader is used in two
- different way. The first is the full_header. This is the
- list of possible columns in the view. The second use is
- completely internal. Many of the ETableHeader functions are
- for that purpose. The only functions we really need are
- e_table_header_new and e_table_header_add_col.
-
- First we create the header. */
- e_table_header = e_table_header_new ();
-
- /* Next we have to build renderers for all of the columns.
- Since all our columns are text columns, we can simply use
- the same renderer over and over again. If we had different
- types of columns, we could use a different renderer for
- each column. */
- cell_left_just = e_cell_text_new (view->model, NULL, GTK_JUSTIFY_LEFT);
-
- /* Next we create a column object for each view column and add
- them to the header. We don't create a column object for
- the importance column since it will not be shown. */
- for (i = 0; i < E_CARD_SIMPLE_FIELD_LAST - 1; i++){
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, e_card_simple_get_name(view->simple, i+1),
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /* 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. */
- view->table = e_table_scrolled_new (e_table_header, E_TABLE_MODEL(view->model), SPEC);
-
- gtk_signal_connect(GTK_OBJECT(view->table), "double_click",
- GTK_SIGNAL_FUNC(table_double_click), view);
- gtk_signal_connect(GTK_OBJECT(view->table), "right_click",
- GTK_SIGNAL_FUNC(table_right_click), view);
-
- gtk_object_set (GTK_OBJECT(view->table),
- "click_to_add_message", _("* Click here to add a contact *"),
- NULL);
-
- gtk_box_pack_start(GTK_BOX(view->vbox), view->table, TRUE, TRUE, 0);
-
- gtk_widget_show( GTK_WIDGET(view->table) );
-}
-
-static void
-change_view_type (AddressbookView *view, AddressbookViewType view_type)
-{
- char *query = NULL;
- BonoboUIHandler *uih = bonobo_control_get_ui_handler (view->control);
-
- if (view_type == view->view_type)
- return;
-
- if (view->view_type != ADDRESSBOOK_VIEW_NONE)
- query = get_query(view);
- else
- query = g_strdup("(contains \"x-evolution-any-field\" \"\")");
-
-
- switch (view_type) {
- case ADDRESSBOOK_VIEW_MINICARD:
- teardown_table_view (view);
- create_minicard_view (view, query);
- if (uih)
- bonobo_ui_handler_menu_set_label (uih, "/View/Toggle View",
- N_("As _Table"));
- break;
- case ADDRESSBOOK_VIEW_TABLE:
- teardown_minicard_view (view);
- create_table_view (view, query);
- if (uih)
- bonobo_ui_handler_menu_set_label (uih, "/View/Toggle View",
- N_("As _Minicards"));
- break;
- default:
- g_warning ("view_type must be either TABLE or MINICARD\n");
- g_free (query);
- return;
- }
-
- view->view_type = view_type;
-
- /* set the book */
- set_book (view);
-
- /* and reset the query */
- if (query)
- set_query (view, query);
- g_free (query);
-}
-
-
-BonoboControl *
-addressbook_factory_new_control (void)
-{
- AddressbookView *view;
-
- view = g_new0 (AddressbookView, 1);
-
- view->vbox = gtk_vbox_new(FALSE, 0);
-
- gtk_signal_connect( GTK_OBJECT( view->vbox ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) view );
-
- /* Create the control. */
- view->control = bonobo_control_new(view->vbox);
-
- view->model = NULL;
- view->minicard_view = NULL;
-
- /* create the initial view */
- change_view_type (view, ADDRESSBOOK_VIEW_MINICARD);
-
- gtk_widget_show_all( view->vbox );
-
- /* create the view's ebook */
- view->book = e_book_new ();
-
- view->properties = bonobo_property_bag_new (get_prop, set_prop, view);
-
- bonobo_property_bag_add (
- view->properties, PROPERTY_FOLDER_URI, PROPERTY_FOLDER_URI_IDX,
- BONOBO_ARG_STRING, NULL, _("The URI that the Folder Browser will display"), 0);
-
- bonobo_control_set_property_bag (view->control,
- view->properties);
-
- view->uri = NULL;
-
- gtk_signal_connect (GTK_OBJECT (view->control), "activate",
- control_activate_cb, view);
-
- return view->control;
-}
-
-static BonoboObject *
-addressbook_factory (BonoboGenericFactory *Factory, void *closure)
-{
- return BONOBO_OBJECT (addressbook_factory_new_control ());
-}
-
-void
-addressbook_factory_init (void)
-{
- static BonoboGenericFactory *addressbook_control_factory = NULL;
-
- if (addressbook_control_factory != NULL)
- return;
-
- addressbook_control_factory = bonobo_generic_factory_new (CONTROL_FACTORY_ID,
- addressbook_factory,
- NULL);
-
- if (addressbook_control_factory == NULL) {
- g_error ("I could not register a Addressbook factory.");
- }
-}
diff --git a/addressbook/gui/component/addressbook.gnorba b/addressbook/gui/component/addressbook.gnorba
deleted file mode 100644
index bc3830686d..0000000000
--- a/addressbook/gui/component/addressbook.gnorba
+++ /dev/null
@@ -1,23 +0,0 @@
-[control-factory:addressbook]
-type=exe
-repo_id=IDL:GNOME/GenericFactory:1.0
-description=Factory for the sample Addressbook control
-location_info=evolution-addressbook
-
-[control:addressbook]
-type=factory
-repo_id=IDL:BonoboControl/addressbook-control:1.0 IDL:GNOME/Control:1.0
-description=A sample Bonobo control which displays an addressbook.
-location_info=control-factory:addressbook
-
-[evolution-shell-component-factory:addressbook]
-type=exe
-repo_id=IDL:GNOME/GenericFactory:1.0
-description=Factory for the Evolution addressbook component.
-location_info=evolution-addressbook
-
-[evolution-shell-component:addressbook]
-type=factory
-repo_id=IDL:Evolution/ShellComponent:1.0
-description=Evolution component for handling contacts.
-location_info=evolution-shell-component-factory:addressbook
diff --git a/addressbook/gui/component/addressbook.h b/addressbook/gui/component/addressbook.h
deleted file mode 100644
index 66c5a7e4e6..0000000000
--- a/addressbook/gui/component/addressbook.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef __ADDRESSBOOK_H__
-#define __ADDRESSBOOK_H__
-
-#include <bonobo/bonobo-control.h>
-
-BonoboControl *addressbook_factory_new_control (void);
-void addressbook_factory_init (void);
-
-#endif /* __ADDRESSBOOK_H__ */
diff --git a/addressbook/gui/component/addressbook.oafinfo b/addressbook/gui/component/addressbook.oafinfo
deleted file mode 100644
index 4f319fb947..0000000000
--- a/addressbook/gui/component/addressbook.oafinfo
+++ /dev/null
@@ -1,88 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:e_minicard:16bb7c25-c7d2-46dc-a5f0-a0975d0e0595"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Addressbook Minicard control"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:e_minicard:f9542709-fb31-4c6a-bc00-d462ba41e4b9"
- type="factory"
- location="OAFIID:control-factory:e_minicard:16bb7c25-c7d2-46dc-a5f0-a0975d0e0595">
-
- <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="description" type="string"
- value="Factory for the Evolution addressbook minicard control."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control-factory:addressbook:3e10597b-0591-4d45-b082-d781b7aa6e17"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the sample Addressbook control"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:addressbook:851f883b-2fe7-4c94-a1e3-a1f2a7a03c49"
- type="factory"
- location="OAFIID:control-factory:addressbook:3e10597b-0591-4d45-b082-d781b7aa6e17">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/addressbook-control:1.0"/>
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="A sample Bonobo control which displays an addressbook."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:addressbook:dbf3bba0-4b0a-4f07-899b-1ec56fdf38a0"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution addressbook component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:addressbook:b7a26547-7014-4bb5-98ab-2bcac2bb55ca"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:addressbook:dbf3bba0-4b0a-4f07-899b-1ec56fdf38a0">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling contacts."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/addressbook/gui/component/alphabet.glade b/addressbook/gui/component/alphabet.glade
deleted file mode 100644
index bc6e5f3798..0000000000
--- a/addressbook/gui/component/alphabet.glade
+++ /dev/null
@@ -1,357 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>alphabet</name>
- <program_name>alphabet</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <gnome_help_support>True</gnome_help_support>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>alphabet.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GtkWindow</class>
- <name>window2</name>
- <visible>False</visible>
- <title>window2</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow-top</name>
- <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
-
- <widget>
- <class>GtkViewport</class>
- <name>viewport1</name>
- <border_width>4</border_width>
- <shadow_type>GTK_SHADOW_NONE</shadow_type>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox2</name>
- <width>27</width>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
-
- <widget>
- <class>GtkButton</class>
- <name>button-1</name>
- <label>123</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-a</name>
- <label>a</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-b</name>
- <label>b</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-c</name>
- <label>c</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-d</name>
- <label>d</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-e</name>
- <label>e</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-f</name>
- <label>f</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-g</name>
- <label>g</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-h</name>
- <label>h</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-i</name>
- <label>i</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-j</name>
- <label>j</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-k</name>
- <label>k</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-l</name>
- <label>l</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-m</name>
- <label>m</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-n</name>
- <label>n</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-o</name>
- <label>o</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-p</name>
- <label>p</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-q</name>
- <label>q</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-r</name>
- <label>r</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-s</name>
- <label>s</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-t</name>
- <label>t</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-u</name>
- <label>u</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-v</name>
- <label>v</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-w</name>
- <can_focus>True</can_focus>
- <label>w</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-x</name>
- <label>x</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-y</name>
- <label>y</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-z</name>
- <label>z</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/gui/component/alphabet.glade.h b/addressbook/gui/component/alphabet.glade.h
deleted file mode 100644
index 2448eeb4fc..0000000000
--- a/addressbook/gui/component/alphabet.glade.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("window2");
-gchar *s = N_("123");
-gchar *s = N_("a");
-gchar *s = N_("b");
-gchar *s = N_("c");
-gchar *s = N_("d");
-gchar *s = N_("e");
-gchar *s = N_("f");
-gchar *s = N_("g");
-gchar *s = N_("h");
-gchar *s = N_("i");
-gchar *s = N_("j");
-gchar *s = N_("k");
-gchar *s = N_("l");
-gchar *s = N_("m");
-gchar *s = N_("n");
-gchar *s = N_("o");
-gchar *s = N_("p");
-gchar *s = N_("q");
-gchar *s = N_("r");
-gchar *s = N_("s");
-gchar *s = N_("t");
-gchar *s = N_("u");
-gchar *s = N_("v");
-gchar *s = N_("w");
-gchar *s = N_("x");
-gchar *s = N_("y");
-gchar *s = N_("z");
diff --git a/addressbook/gui/component/e-addressbook-model.c b/addressbook/gui/component/e-addressbook-model.c
deleted file mode 100644
index d46b42fe00..0000000000
--- a/addressbook/gui/component/e-addressbook-model.c
+++ /dev/null
@@ -1,421 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- *
- * Author:
- * Christopher James Lahey <clahey@helixcode.com>
- *
- * (C) 1999 Helix Code, Inc.
- */
-
-#include <config.h>
-#include "e-addressbook-model.h"
-#include <gnome-xml/tree.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-#include <gnome.h>
-
-#define PARENT_TYPE e_table_model_get_type()
-ETableModelClass *parent_class;
-
-/*
- * EAddressbookModel callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-static void e_addressbook_model_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_addressbook_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-
-enum {
- ARG_0,
- ARG_BOOK,
- ARG_QUERY,
- ARG_EDITABLE,
-};
-
-static void
-addressbook_destroy(GtkObject *object)
-{
- EAddressbookModel *model = E_ADDRESSBOOK_MODEL(object);
- int i;
-
- if (model->get_view_idle)
- g_source_remove(model->get_view_idle);
- if (model->book_view && model->create_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->create_card_id);
- if (model->book_view && model->remove_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->remove_card_id);
- if (model->book_view && model->modify_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->modify_card_id);
- if (model->book)
- gtk_object_unref(GTK_OBJECT(model->book));
- if (model->book_view)
- gtk_object_unref(GTK_OBJECT(model->book_view));
-
- for ( i = 0; i < model->data_count; i++ ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- }
- g_free(model->data);
-}
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-addressbook_col_count (ETableModel *etc)
-{
- return E_CARD_SIMPLE_FIELD_LAST;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-addressbook_row_count (ETableModel *etc)
-{
- EAddressbookModel *addressbook = E_ADDRESSBOOK_MODEL(etc);
- return addressbook->data_count;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-addressbook_value_at (ETableModel *etc, int col, int row)
-{
- EAddressbookModel *addressbook = E_ADDRESSBOOK_MODEL(etc);
- const char *value;
- if ( col >= E_CARD_SIMPLE_FIELD_LAST - 1 || row >= addressbook->data_count )
- return NULL;
-
- value = e_card_simple_get_const(addressbook->data[row],
- col + 1);
- return (void *)(value ? value : "");
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-addressbook_set_value_at (ETableModel *etc, int col, int row, const void *val)
-{
- EAddressbookModel *addressbook = E_ADDRESSBOOK_MODEL(etc);
- ECard *card;
- if (addressbook->editable) {
- if ( col >= E_CARD_SIMPLE_FIELD_LAST - 1|| row >= addressbook->data_count )
- return;
- e_card_simple_set(addressbook->data[row],
- col + 1,
- val);
- gtk_object_get(GTK_OBJECT(addressbook->data[row]),
- "card", &card,
- NULL);
- e_book_commit_card(addressbook->book, card, NULL, NULL);
-
- 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)
-{
- return E_ADDRESSBOOK_MODEL(etc)->editable;
-}
-
-static void
-addressbook_append_row (ETableModel *etm, ETableModel *source, gint row)
-{
- ECard *card;
- ECardSimple *simple;
- EAddressbookModel *addressbook = E_ADDRESSBOOK_MODEL(etm);
- int col;
-
- card = e_card_new("");
- simple = e_card_simple_new(card);
-
- for (col = 0; col < E_CARD_SIMPLE_FIELD_LAST - 1; col++) {
- const void *val = e_table_model_value_at(source, col, row);
- e_card_simple_set(simple,
- col + 1,
- val);
- }
- e_card_simple_sync_card(simple);
- e_book_add_card(addressbook->book, card, NULL, NULL);
- gtk_object_unref(GTK_OBJECT(simple));
- gtk_object_unref(GTK_OBJECT(card));
-}
-
-/* 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
-create_card(EBookView *book_view,
- const GList *cards,
- EAddressbookModel *model)
-{
- model->data = g_realloc(model->data, (model->data_count + g_list_length((GList *)cards)) * sizeof(ECard *));
- for ( ; cards; cards = cards->next) {
- model->data[model->data_count++] = e_card_simple_new (E_CARD(cards->data));
- e_table_model_row_inserted(E_TABLE_MODEL(model), model->data_count - 1);
- }
-}
-
-static void
-remove_card(EBookView *book_view,
- const char *id,
- EAddressbookModel *model)
-{
- int i;
- for ( i = 0; i < model->data_count; i++) {
- if ( !strcmp(e_card_simple_get_id(model->data[i]), id) ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- memmove(model->data + i, model->data + i + 1, (model->data_count - i - 1) * sizeof (ECard *));
- e_table_model_row_deleted(E_TABLE_MODEL(model), i);
- }
- }
-}
-
-static void
-modify_card(EBookView *book_view,
- const GList *cards,
- EAddressbookModel *model)
-{
- for ( ; cards; cards = cards->next) {
- int i;
- for ( i = 0; i < model->data_count; i++) {
- if ( !strcmp(e_card_simple_get_id(model->data[i]), e_card_get_id(E_CARD(cards->data))) ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- model->data[i] = e_card_simple_new(E_CARD(cards->data));
- gtk_object_ref(GTK_OBJECT(model->data[i]));
- e_table_model_row_changed(E_TABLE_MODEL(model), i);
- break;
- }
- }
- }
-}
-
-static void
-e_addressbook_model_class_init (GtkObjectClass *object_class)
-{
- ETableModelClass *model_class = (ETableModelClass *) object_class;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = addressbook_destroy;
- object_class->set_arg = e_addressbook_model_set_arg;
- object_class->get_arg = e_addressbook_model_get_arg;
-
- gtk_object_add_arg_type ("EAddressbookModel::book", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_BOOK);
- gtk_object_add_arg_type ("EAddressbookModel::query", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_QUERY);
- gtk_object_add_arg_type ("EAddressbookModel::editable", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_EDITABLE);
-
- 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
-e_addressbook_model_init (GtkObject *object)
-{
- EAddressbookModel *model = E_ADDRESSBOOK_MODEL(object);
- model->book = NULL;
- model->query = g_strdup("(contains \"x-evolution-any-field\" \"\")");
- model->book_view = NULL;
- model->get_view_idle = 0;
- model->create_card_id = 0;
- model->remove_card_id = 0;
- model->modify_card_id = 0;
- model->data = NULL;
- model->data_count = 0;
- model->editable = TRUE;
-}
-
-static void
-book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure)
-{
- EAddressbookModel *model = closure;
- int i;
- if (model->book_view && model->create_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->create_card_id);
- if (model->book_view && model->remove_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->remove_card_id);
- if (model->book_view && model->modify_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->modify_card_id);
- if (model->book_view)
- gtk_object_unref(GTK_OBJECT(model->book_view));
- model->book_view = book_view;
- if (model->book_view)
- gtk_object_ref(GTK_OBJECT(model->book_view));
- model->create_card_id = gtk_signal_connect(GTK_OBJECT(model->book_view),
- "card_added",
- GTK_SIGNAL_FUNC(create_card),
- model);
- model->remove_card_id = gtk_signal_connect(GTK_OBJECT(model->book_view),
- "card_removed",
- GTK_SIGNAL_FUNC(remove_card),
- model);
- model->modify_card_id = gtk_signal_connect(GTK_OBJECT(model->book_view),
- "card_changed",
- GTK_SIGNAL_FUNC(modify_card),
- model);
-
- for ( i = 0; i < model->data_count; i++ ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- }
-
- e_table_model_pre_change(E_TABLE_MODEL(model));
- g_free(model->data);
- model->data = NULL;
- model->data_count = 0;
- e_table_model_changed(E_TABLE_MODEL(model));
-}
-
-static gboolean
-get_view(EAddressbookModel *model)
-{
- if (model->book && model->query)
- e_book_get_book_view(model->book, model->query, book_view_loaded, model);
-
- model->get_view_idle = 0;
- return FALSE;
-}
-
-ECard *
-e_addressbook_model_get_card(EAddressbookModel *model,
- int row)
-{
- if (model->data && row < model->data_count) {
- ECard *card;
- gtk_object_get(GTK_OBJECT(model->data[row]),
- "card", &card,
- NULL);
- gtk_object_ref(GTK_OBJECT(card));
- return card;
- }
- return NULL;
-}
-
-static void
-e_addressbook_model_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EAddressbookModel *model;
-
- model = E_ADDRESSBOOK_MODEL (o);
-
- switch (arg_id){
- case ARG_BOOK:
- if (model->book)
- gtk_object_unref(GTK_OBJECT(model->book));
- model->book = E_BOOK(GTK_VALUE_OBJECT (*arg));
- if (model->book) {
- gtk_object_ref(GTK_OBJECT(model->book));
- if (model->get_view_idle == 0)
- model->get_view_idle = g_idle_add((GSourceFunc)get_view, model);
- }
- break;
- case ARG_QUERY:
- if (model->query)
- g_free(model->query);
- model->query = g_strdup(GTK_VALUE_STRING (*arg));
- if (model->get_view_idle == 0)
- model->get_view_idle = g_idle_add((GSourceFunc)get_view, model);
- break;
- case ARG_EDITABLE:
- model->editable = GTK_VALUE_BOOL (*arg);
- break;
- }
-}
-
-static void
-e_addressbook_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EAddressbookModel *e_addressbook_model;
-
- e_addressbook_model = E_ADDRESSBOOK_MODEL (object);
-
- switch (arg_id) {
- case ARG_BOOK:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_addressbook_model->book);
- break;
- case ARG_QUERY:
- GTK_VALUE_STRING (*arg) = g_strdup(e_addressbook_model->query);
- break;
- case ARG_EDITABLE:
- GTK_VALUE_BOOL (*arg) = e_addressbook_model->editable;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-GtkType
-e_addressbook_model_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "EAddressbookModel",
- sizeof (EAddressbookModel),
- sizeof (EAddressbookModelClass),
- (GtkClassInitFunc) e_addressbook_model_class_init,
- (GtkObjectInitFunc) e_addressbook_model_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-ETableModel *
-e_addressbook_model_new (void)
-{
- EAddressbookModel *et;
-
- et = gtk_type_new (e_addressbook_model_get_type ());
-
- return E_TABLE_MODEL(et);
-}
diff --git a/addressbook/gui/component/e-addressbook-model.h b/addressbook/gui/component/e-addressbook-model.h
deleted file mode 100644
index 8f5f6485cf..0000000000
--- a/addressbook/gui/component/e-addressbook-model.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_ADDRESSBOOK_MODEL_H_
-#define _E_ADDRESSBOOK_MODEL_H_
-
-#include "e-table-model.h"
-#include <ebook/e-book.h>
-#include <ebook/e-book-view.h>
-#include <ebook/e-card-simple.h>
-
-#define E_ADDRESSBOOK_MODEL_TYPE (e_addressbook_model_get_type ())
-#define E_ADDRESSBOOK_MODEL(o) (GTK_CHECK_CAST ((o), E_ADDRESSBOOK_MODEL_TYPE, EAddressbookModel))
-#define E_ADDRESSBOOK_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_ADDRESSBOOK_MODEL_TYPE, EAddressbookModelClass))
-#define E_IS_ADDRESSBOOK_MODEL(o) (GTK_CHECK_TYPE ((o), E_ADDRESSBOOK_MODEL_TYPE))
-#define E_IS_ADDRESSBOOK_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_ADDRESSBOOK_MODEL_TYPE))
-
-/* Virtual Column list:
- 0 Email
- 1 Full Name
- 2 Street
- 3 Phone
-*/
-
-typedef struct {
- ETableModel parent;
-
- /* item specific fields */
- EBook *book;
- char *query;
- EBookView *book_view;
-
- int get_view_idle;
-
- ECardSimple **data;
- int data_count;
-
- int create_card_id, remove_card_id, modify_card_id;
-
- guint editable : 1;
-} EAddressbookModel;
-
-
-typedef struct {
- ETableModelClass parent_class;
-} EAddressbookModelClass;
-
-
-GtkType e_addressbook_model_get_type (void);
-ETableModel *e_addressbook_model_new (void);
-
-/* Returns object with ref count of 1. */
-ECard *e_addressbook_model_get_card(EAddressbookModel *model,
- int row);
-
-#endif /* _E_ADDRESSBOOK_MODEL_H_ */
diff --git a/addressbook/gui/component/e-cardlist-model.c b/addressbook/gui/component/e-cardlist-model.c
deleted file mode 100644
index 23b61d58be..0000000000
--- a/addressbook/gui/component/e-cardlist-model.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- *
- * Author:
- * Christopher James Lahey <clahey@helixcode.com>
- *
- * (C) 1999 Helix Code, Inc.
- */
-
-#include <config.h>
-#include "e-cardlist-model.h"
-#include <gnome-xml/tree.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-#include <gnome.h>
-
-#define PARENT_TYPE e_table_model_get_type()
-
-static void
-e_cardlist_model_destroy(GtkObject *object)
-{
- ECardlistModel *model = E_CARDLIST_MODEL(object);
- int i;
-
- for ( i = 0; i < model->data_count; i++ ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- }
- g_free(model->data);
-}
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-e_cardlist_model_col_count (ETableModel *etc)
-{
- return E_CARD_SIMPLE_FIELD_LAST;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-e_cardlist_model_row_count (ETableModel *etc)
-{
- ECardlistModel *e_cardlist_model = E_CARDLIST_MODEL(etc);
- return e_cardlist_model->data_count;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-e_cardlist_model_value_at (ETableModel *etc, int col, int row)
-{
- ECardlistModel *e_cardlist_model = E_CARDLIST_MODEL(etc);
- const char *value;
- if ( col >= E_CARD_SIMPLE_FIELD_LAST - 1|| row >= e_cardlist_model->data_count )
- return NULL;
- value = e_card_simple_get_const(e_cardlist_model->data[row],
- col + 1);
- return (void *)(value ? value : "");
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-e_cardlist_model_set_value_at (ETableModel *etc, int col, int row, const void *val)
-{
- ECardlistModel *e_cardlist_model = E_CARDLIST_MODEL(etc);
- ECard *card;
- if ( col >= E_CARD_SIMPLE_FIELD_LAST - 1|| row >= e_cardlist_model->data_count )
- return;
- e_card_simple_set(e_cardlist_model->data[row],
- col + 1,
- val);
- gtk_object_get(GTK_OBJECT(e_cardlist_model->data[row]),
- "card", &card,
- NULL);
-
- e_table_model_cell_changed(etc, col, row);
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-e_cardlist_model_is_cell_editable (ETableModel *etc, int col, int row)
-{
- return TRUE;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-e_cardlist_model_duplicate_value (ETableModel *etc, int col, const void *value)
-{
- return g_strdup(value);
-}
-
-/* This function frees the value passed to it. */
-static void
-e_cardlist_model_free_value (ETableModel *etc, int col, void *value)
-{
- g_free(value);
-}
-
-static void *
-e_cardlist_model_initialize_value (ETableModel *etc, int col)
-{
- return g_strdup("");
-}
-
-static gboolean
-e_cardlist_model_value_is_empty (ETableModel *etc, int col, const void *value)
-{
- return !(value && *(char *)value);
-}
-
-static char *
-e_cardlist_model_value_to_string (ETableModel *etc, int col, const void *value)
-{
- return g_strdup(value);
-}
-
-void
-e_cardlist_model_add(ECardlistModel *model,
- ECard **cards,
- int count)
-{
- int i;
- model->data = g_realloc(model->data, model->data_count + count * sizeof(ECard *));
- for (i = 0; i < count; i++) {
- gboolean found = FALSE;
- gchar *id = e_card_get_id(cards[i]);
- for ( i = 0; i < model->data_count; i++) {
- if ( !strcmp(e_card_simple_get_id(model->data[i]), id) ) {
- found = TRUE;
- }
- }
- if (!found) {
- gtk_object_ref(GTK_OBJECT(cards[i]));
- model->data[model->data_count++] = e_card_simple_new (cards[i]);
- e_table_model_row_inserted(E_TABLE_MODEL(model), model->data_count - 1);
- }
- }
-}
-
-void
-e_cardlist_model_remove(ECardlistModel *model,
- const char *id)
-{
- int i;
- for ( i = 0; i < model->data_count; i++) {
- if ( !strcmp(e_card_simple_get_id(model->data[i]), id) ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- memmove(model->data + i, model->data + i + 1, (model->data_count - i - 1) * sizeof (ECard *));
- e_table_model_row_deleted(E_TABLE_MODEL(model), i);
- }
- }
-}
-
-static void
-e_cardlist_model_class_init (GtkObjectClass *object_class)
-{
- ETableModelClass *model_class = (ETableModelClass *) object_class;
-
- object_class->destroy = e_cardlist_model_destroy;
-
- model_class->column_count = e_cardlist_model_col_count;
- model_class->row_count = e_cardlist_model_row_count;
- model_class->value_at = e_cardlist_model_value_at;
- model_class->set_value_at = e_cardlist_model_set_value_at;
- model_class->is_cell_editable = e_cardlist_model_is_cell_editable;
- model_class->duplicate_value = e_cardlist_model_duplicate_value;
- model_class->free_value = e_cardlist_model_free_value;
- model_class->initialize_value = e_cardlist_model_initialize_value;
- model_class->value_is_empty = e_cardlist_model_value_is_empty;
- model_class->value_to_string = e_cardlist_model_value_to_string;
-}
-
-static void
-e_cardlist_model_init (GtkObject *object)
-{
- ECardlistModel *model = E_CARDLIST_MODEL(object);
- model->data = NULL;
- model->data_count = 0;
-}
-
-ECard *
-e_cardlist_model_get(ECardlistModel *model,
- int row)
-{
- if (model->data && row < model->data_count) {
- ECard *card;
- gtk_object_get(GTK_OBJECT(model->data[row]),
- "card", &card,
- NULL);
- gtk_object_ref(GTK_OBJECT(card));
- return card;
- }
- return NULL;
-}
-
-GtkType
-e_cardlist_model_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ECardlistModel",
- sizeof (ECardlistModel),
- sizeof (ECardlistModelClass),
- (GtkClassInitFunc) e_cardlist_model_class_init,
- (GtkObjectInitFunc) e_cardlist_model_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-ETableModel *
-e_cardlist_model_new (void)
-{
- ECardlistModel *et;
-
- et = gtk_type_new (e_cardlist_model_get_type ());
-
- return E_TABLE_MODEL(et);
-}
diff --git a/addressbook/gui/component/e-cardlist-model.h b/addressbook/gui/component/e-cardlist-model.h
deleted file mode 100644
index b7df356342..0000000000
--- a/addressbook/gui/component/e-cardlist-model.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_CARDLIST_MODEL_H_
-#define _E_CARDLIST_MODEL_H_
-
-#include "e-table-model.h"
-#include <ebook/e-book.h>
-#include <ebook/e-book-view.h>
-#include <ebook/e-card-simple.h>
-
-#define E_CARDLIST_MODEL_TYPE (e_cardlist_model_get_type ())
-#define E_CARDLIST_MODEL(o) (GTK_CHECK_CAST ((o), E_CARDLIST_MODEL_TYPE, ECardlistModel))
-#define E_CARDLIST_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CARDLIST_MODEL_TYPE, ECardlistModelClass))
-#define E_IS_CARDLIST_MODEL(o) (GTK_CHECK_TYPE ((o), E_CARDLIST_MODEL_TYPE))
-#define E_IS_CARDLIST_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CARDLIST_MODEL_TYPE))
-
-typedef struct {
- ETableModel parent;
-
- /* item specific fields */
- ECardSimple **data;
- int data_count;
-} ECardlistModel;
-
-
-typedef struct {
- ETableModelClass parent_class;
-} ECardlistModelClass;
-
-
-GtkType e_cardlist_model_get_type (void);
-ETableModel *e_cardlist_model_new (void);
-
-/* Returns object with an extra ref count. */
-ECard *e_cardlist_model_get (ECardlistModel *model,
- int row);
-void e_cardlist_model_add (ECardlistModel *model,
- ECard **card,
- int count);
-void e_cardlist_model_remove (ECardlistModel *model,
- const char *id);
-
-#endif /* _E_CARDLIST_MODEL_H_ */
diff --git a/addressbook/gui/component/e-ldap-server-dialog.c b/addressbook/gui/component/e-ldap-server-dialog.c
deleted file mode 100644
index 172f43280b..0000000000
--- a/addressbook/gui/component/e-ldap-server-dialog.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-ldap-server-dialog.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Toshok <toshok@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <glade/glade.h>
-#include "e-ldap-server-dialog.h"
-
-typedef struct {
- GladeXML *gui;
- GtkWidget *dialog;
- ELDAPServer *server;
-} ELDAPServerDialog;
-
-static void
-fill_in_server_info (ELDAPServerDialog *dialog)
-{
- ELDAPServer *ldap_server = dialog->server;
- GtkEditable *editable;
- int position;
-
- /* the name */
- position = 0;
- editable = GTK_EDITABLE(glade_xml_get_widget(dialog->gui, "name-entry"));
- gtk_editable_delete_text (editable, 0, -1);
- gtk_editable_insert_text (editable, ldap_server->name, strlen (ldap_server->name), &position);
-
- /* the server description */
- position = 0;
- editable = GTK_EDITABLE(glade_xml_get_widget(dialog->gui, "description-entry"));
- gtk_editable_delete_text (editable, 0, -1);
- gtk_editable_insert_text (editable, ldap_server->description, strlen (ldap_server->description), &position);
-
- /* the server hostname */
- position = 0;
- editable = GTK_EDITABLE(glade_xml_get_widget(dialog->gui, "server-entry"));
- gtk_editable_delete_text (editable, 0, -1);
- gtk_editable_insert_text (editable, ldap_server->host, strlen (ldap_server->host), &position);
-
- /* the server port */
- position = 0;
- editable = GTK_EDITABLE(glade_xml_get_widget(dialog->gui, "port-entry"));
- gtk_editable_delete_text (editable, 0, -1);
- gtk_editable_insert_text (editable, ldap_server->port, strlen (ldap_server->port), &position);
-
- /* the root dn */
- position = 0;
- editable = GTK_EDITABLE(glade_xml_get_widget(dialog->gui, "root-dn-entry"));
- gtk_editable_delete_text (editable, 0, -1);
- gtk_editable_insert_text (editable, ldap_server->rootdn, strlen (ldap_server->rootdn), &position);
-}
-
-static void
-extract_server_info (ELDAPServerDialog *dialog)
-{
- ELDAPServer *ldap_server = dialog->server;
- GtkEditable *editable;
- char *description, *server, *port, *rootdn, *name;
-
- /* the server name */
- editable = GTK_EDITABLE(glade_xml_get_widget(dialog->gui, "name-entry"));
- name = gtk_editable_get_chars(editable, 0, -1);
- if (name && *name) {
- if (ldap_server->name)
- g_free(ldap_server->name);
- ldap_server->name = name;
- }
-
- /* the server description */
- editable = GTK_EDITABLE(glade_xml_get_widget(dialog->gui, "description-entry"));
- description = gtk_editable_get_chars(editable, 0, -1);
- if (description && *description) {
- if (ldap_server->description)
- g_free(ldap_server->description);
- ldap_server->description = description;
- }
-
- /* the server hostname */
- editable = GTK_EDITABLE(glade_xml_get_widget(dialog->gui, "server-entry"));
- server = gtk_editable_get_chars(editable, 0, -1);
- if (server && *server) {
- if (ldap_server->host)
- g_free(ldap_server->host);
- ldap_server->host = server;
- }
-
- /* the server port */
- editable = GTK_EDITABLE(glade_xml_get_widget(dialog->gui, "port-entry"));
- port = gtk_editable_get_chars(editable, 0, -1);
- if (port && *port) {
- if (ldap_server->port)
- g_free (ldap_server->port);
- ldap_server->port = port;
- }
-
- /* the root dn */
- editable = GTK_EDITABLE(glade_xml_get_widget(dialog->gui, "root-dn-entry"));
- rootdn = gtk_editable_get_chars(editable, 0, -1);
- if (rootdn && *rootdn) {
- if (ldap_server->rootdn)
- g_free (ldap_server->rootdn);
- ldap_server->rootdn = rootdn;
- }
-}
-
-void
-e_ldap_server_editor_show(ELDAPServer *server)
-{
- ELDAPServerDialog *dialog = g_new0 (ELDAPServerDialog, 1);
-
- dialog->server = server;
- dialog->gui = glade_xml_new (EVOLUTION_GLADEDIR "/ldap-server-dialog.glade", NULL);
-
- dialog->dialog = glade_xml_get_widget(dialog->gui, "ldap-server-dialog");
-
- fill_in_server_info (dialog);
-
- gnome_dialog_run (GNOME_DIALOG(dialog->dialog));
-
- extract_server_info (dialog);
-
- gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-}
diff --git a/addressbook/gui/component/e-ldap-server-dialog.h b/addressbook/gui/component/e-ldap-server-dialog.h
deleted file mode 100644
index e5ae169f5c..0000000000
--- a/addressbook/gui/component/e-ldap-server-dialog.h
+++ /dev/null
@@ -1,9 +0,0 @@
-
-#ifndef __E_LDAP_SERVER_DIALOG_H__
-#define __E_LDAP_SERVER_DIALOG_H__
-
-#include "e-ldap-storage.h"
-
-void e_ldap_server_editor_show(ELDAPServer *server);
-
-#endif /* __E_LDAP_SERVER_DIALOG_H__ */
diff --git a/addressbook/gui/component/e-ldap-storage.c b/addressbook/gui/component/e-ldap-storage.c
deleted file mode 100644
index aa1e153a2a..0000000000
--- a/addressbook/gui/component/e-ldap-storage.c
+++ /dev/null
@@ -1,314 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-ldap-storage.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Chris Toshok
- */
-
-/* The ldap server file goes like this:
-
- <?xml version="1.0"?>
- <contactservers>
- <contactserver>
- <name>LDAP Server</name>
- <description>This is my company address book.</description>
- <host>ldap.server.com</host>
- <port>389</port>
- <rootdn></rootdn>
- </contactserver>
- </contactservers>
-
- FIXME: Do we want to use a namespace for this?
- FIXME: Do we want to have an internationalized description?
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo.h>
-
-#include "evolution-shell-component.h"
-#include "evolution-storage.h"
-
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include "e-ldap-storage.h"
-#include "e-ldap-server-dialog.h"
-
-#include "e-util/e-util.h"
-#include "e-util/e-xml-utils.h"
-
-#include <sys/types.h>
-#include <sys/fcntl.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-#define LDAPSERVER_XML "ldapservers.xml"
-
-static gboolean load_ldap_data (EvolutionStorage *storage, const char *file_path);
-static gboolean save_ldap_data (const char *file_path);
-
-GHashTable *servers;
-EvolutionStorage *storage;
-static char *ldapservers;
-
-void
-setup_ldap_storage (EvolutionShellComponent *shell_component,
- const char *evolution_homedir)
-{
- EvolutionShellClient *shell_client;
- Evolution_Shell corba_shell;
-
- shell_client = evolution_shell_component_get_owner (shell_component);
- if (shell_client == CORBA_OBJECT_NIL) {
- g_warning ("We have no shell!?");
- return;
- }
-
- corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client));
-
- storage = evolution_storage_new (_("External Directories"));
- if (evolution_storage_register_on_shell (storage, corba_shell) != EVOLUTION_STORAGE_OK) {
- g_warning ("Cannot register storage");
- return;
- }
-
- /* save the storage for later */
- servers = g_hash_table_new (g_str_hash, g_str_equal);
-
- gtk_object_set_data (GTK_OBJECT (shell_component), "e-storage", storage);
-
- if (ldapservers)
- g_free (ldapservers);
- ldapservers = g_strdup_printf ("%s/" LDAPSERVER_XML, evolution_homedir);
- load_ldap_data (storage, ldapservers);
-}
-
-static char *
-get_string_value (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 gboolean
-load_ldap_data (EvolutionStorage *storage,
- const char *file_path)
-{
- xmlDoc *doc;
- xmlNode *root;
- xmlNode *child;
-
- tryagain:
- doc = xmlParseFile (file_path);
- if (doc == NULL) {
- /* check to see if a ldapserver.xml.new file is
- there. if it is, rename it and run with it */
- char *new_path = g_strdup_printf ("%s.new", file_path);
- struct stat sb;
-
- if (stat (new_path, &sb) == 0) {
- int rv;
-
- rv = rename (new_path, file_path);
- g_free (new_path);
-
- if (0 > rv) {
- g_error ("Failed to rename ldapserver.xml: %s\n", strerror(errno));
- return FALSE;
- }
- else {
- goto tryagain;
- }
- }
-
- g_free (new_path);
- return TRUE;
- }
-
- root = xmlDocGetRootElement (doc);
- if (root == NULL || strcmp (root->name, "contactservers") != 0) {
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- for (child = root->childs; child; child = child->next) {
- char *path;
- ELDAPServer *server;
-
- if (strcmp (child->name, "contactserver")) {
- g_warning ("unknown node '%s' in %s", child->name, file_path);
- continue;
- }
-
- server = g_new (ELDAPServer, 1);
-
- server->name = get_string_value (child, "name");
- server->description = get_string_value (child, "description");
- server->port = get_string_value (child, "port");
- server->host = get_string_value (child, "host");
- server->rootdn = get_string_value (child, "rootdn");
- server->scope = get_string_value (child, "scope");
- server->uri = g_strdup_printf ("ldap://%s:%s/%s??%s", server->host, server->port, server->rootdn, server->scope);
-
- path = g_strdup_printf ("/%s", server->name);
- evolution_storage_new_folder (storage, path, "contacts", server->uri, server->description);
-
- g_hash_table_insert (servers, server->name, server);
-
- g_free (path);
- }
-
- xmlFreeDoc (doc);
-
- return TRUE;
-}
-
-static void
-ldap_server_foreach(gpointer key, gpointer value, gpointer user_data)
-{
- ELDAPServer *server = (ELDAPServer*)value;
- xmlNode *root = (xmlNode*)user_data;
- xmlNode *server_root = xmlNewNode (NULL,
- (xmlChar *) "contactserver");
-
- xmlAddChild (root, server_root);
-
- xmlNewChild (server_root, NULL, (xmlChar *) "name",
- (xmlChar *) server->name);
- xmlNewChild (server_root, NULL, (xmlChar *) "description",
- (xmlChar *) server->description);
-
- xmlNewChild (server_root, NULL, (xmlChar *) "port",
- (xmlChar *) server->port);
- xmlNewChild (server_root, NULL, (xmlChar *) "host",
- (xmlChar *) server->host);
- xmlNewChild (server_root, NULL, (xmlChar *) "rootdn",
- (xmlChar *) server->rootdn);
- xmlNewChild (server_root, NULL, (xmlChar *) "scope",
- (xmlChar *) server->scope);
-}
-
-static gboolean
-save_ldap_data (const char *file_path)
-{
- xmlDoc *doc;
- xmlNode *root;
- int fd, rv;
- xmlChar *buf;
- int buf_size;
- char *new_path = g_strdup_printf ("%s.new", file_path);
-
- doc = xmlNewDoc ((xmlChar *) "1.0");
- root = xmlNewDocNode (doc, NULL, (xmlChar *) "contactservers", NULL);
- xmlDocSetRootElement (doc, root);
-
- g_hash_table_foreach (servers, ldap_server_foreach, root);
-
- fd = open (new_path, O_CREAT | O_TRUNC | O_WRONLY, 0600);
- fchmod (fd, 0600);
-
- xmlDocDumpMemory (doc, &buf, &buf_size);
-
- if (buf == NULL) {
- g_error ("Failed to write ldapserver.xml: xmlBufferCreate() == NULL");
- return FALSE;
- }
-
- rv = write (fd, buf, buf_size);
- xmlFree (buf);
- close (fd);
-
- if (0 > rv) {
- g_error ("Failed to write new ldapserver.xml: %s\n", strerror(errno));
- unlink (new_path);
- return FALSE;
- }
- else {
- if (0 > rename (new_path, file_path)) {
- g_error ("Failed to rename ldapserver.xml: %s\n", strerror(errno));
- unlink (new_path);
- return FALSE;
- }
- return TRUE;
- }
-}
-
-void
-e_ldap_storage_add_server (ELDAPServer *server)
-{
- char *path;
- /* add it to our hashtable */
- g_hash_table_insert (servers, server->name, server);
-
- /* and then to the ui */
- path = g_strdup_printf ("/%s", server->name);
- evolution_storage_new_folder (storage, path, "contacts", server->uri, server->description);
-
- g_free (path);
-
- save_ldap_data (ldapservers);
-}
-
-void
-e_ldap_storage_remove_server (char *name)
-{
- char *path;
- ELDAPServer *server;
-
- /* remove it from our hashtable */
- server = (ELDAPServer*)g_hash_table_lookup (servers, name);
- g_hash_table_remove (servers, name);
-
- g_free (server->name);
- g_free (server->description);
- g_free (server->host);
- g_free (server->port);
- g_free (server->rootdn);
- g_free (server->scope);
- g_free (server->uri);
-
- g_free (server);
-
- /* and then from the ui */
- path = g_strdup_printf ("/%s", name);
- evolution_storage_removed_folder (storage, path);
-
- g_free (path);
-
- save_ldap_data (ldapservers);
-}
diff --git a/addressbook/gui/component/e-ldap-storage.h b/addressbook/gui/component/e-ldap-storage.h
deleted file mode 100644
index 9d3e35b4db..0000000000
--- a/addressbook/gui/component/e-ldap-storage.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-ldap-storage.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Chris Toshok
- */
-
-#ifndef __E_LDAP_STORAGE_H__
-#define __E_LDAP_STORAGE_H__
-
-#include "evolution-shell-component.h"
-
-typedef struct {
- char *name;
- char *description;
- char *host;
- char *port;
- char *rootdn;
- char *scope;
- char *uri; /* filled in from the above */
-} ELDAPServer;
-
-void setup_ldap_storage (EvolutionShellComponent *shell_component,
- const char *evolution_homedir);
-void e_ldap_storage_add_server (ELDAPServer *server);
-void e_ldap_storage_remove_server (char *name);
-
-#endif /* __E_LDAP_STORAGE_H__ */
diff --git a/addressbook/gui/component/ldap-server-dialog.glade b/addressbook/gui/component/ldap-server-dialog.glade
deleted file mode 100644
index a4dad9c2c2..0000000000
--- a/addressbook/gui/component/ldap-server-dialog.glade
+++ /dev/null
@@ -1,400 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>newserver</name>
- <program_name>newserver</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <output_main_file>False</output_main_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>ldap-server-dialog.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>ldap-server-dialog</name>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table2</name>
- <rows>5</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>0</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>description-entry</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>server-entry</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>port-entry</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>root-dn-entry</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment1</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>1</yscale>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label1</name>
- <label>Description:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment2</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>1</yscale>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label2</name>
- <label>LDAP Server:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment3</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>1</yscale>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label3</name>
- <label>Port Number:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment4</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>1</yscale>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label4</name>
- <label>Root DN:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>name-entry</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment5</name>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>1</yscale>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label5</name>
- <label>Name:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/gui/component/ldap-server-dialog.glade.h b/addressbook/gui/component/ldap-server-dialog.glade.h
deleted file mode 100644
index c99dfa3cb5..0000000000
--- a/addressbook/gui/component/ldap-server-dialog.glade.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Description:");
-gchar *s = N_("LDAP Server:");
-gchar *s = N_("Port Number:");
-gchar *s = N_("Root DN:");
-gchar *s = N_("Name:");
diff --git a/addressbook/gui/component/select-names/.cvsignore b/addressbook/gui/component/select-names/.cvsignore
deleted file mode 100644
index 1d8db60890..0000000000
--- a/addressbook/gui/component/select-names/.cvsignore
+++ /dev/null
@@ -1,11 +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
diff --git a/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl b/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl
deleted file mode 100644
index 2bc8154daf..0000000000
--- a/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * CORBA interface for the SelectNames dialog.
- *
- * Authors:
- * Ettore Perazzoli <ettore@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <Bonobo.idl>
-
-module Evolution {
-module Addressbook {
-
- interface SelectNames : Bonobo::Unknown {
- struct Section {
- string id;
- string title;
- };
-
- typedef sequence<Section> SectionList;
-
- exception DuplicateID {};
- exception SectionNotFound {};
-
- void add_section (in string id, in string title)
- raises (DuplicateID);
-
- Bonobo::Control get_entry_for_section (in string section_id)
- raises (SectionNotFound);
-
- void activate_dialog (in string section_id);
- };
-
-};
-};
diff --git a/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oaf.in b/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oaf.in
deleted file mode 100644
index e66c3aa38a..0000000000
--- a/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oaf.in
+++ /dev/null
@@ -1,29 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:factory:addressbook:select-names:b39eb1a1-f341-4d5a-9a91-e2616e206b2e"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Addressbook's name selection interface"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:addressbook:select-names:39301deb-174b-40d1-8a6e-5edc300f7b61"
- type="factory"
- location="OAFIID:factory:addressbook:select-names:b39eb1a1-f341-4d5a-9a91-e2616e206b2e">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/Addressbook/SelectNames"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution's addressbook name selection interface."/>
-
-</oaf_server>
-
-</oaf_info> \ No newline at end of file
diff --git a/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oafinfo b/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oafinfo
deleted file mode 100644
index e66c3aa38a..0000000000
--- a/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oafinfo
+++ /dev/null
@@ -1,29 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:factory:addressbook:select-names:b39eb1a1-f341-4d5a-9a91-e2616e206b2e"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Addressbook's name selection interface"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:addressbook:select-names:39301deb-174b-40d1-8a6e-5edc300f7b61"
- type="factory"
- location="OAFIID:factory:addressbook:select-names:b39eb1a1-f341-4d5a-9a91-e2616e206b2e">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/Addressbook/SelectNames"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution's addressbook name selection interface."/>
-
-</oaf_server>
-
-</oaf_info> \ No newline at end of file
diff --git a/addressbook/gui/component/select-names/Makefile.am b/addressbook/gui/component/select-names/Makefile.am
deleted file mode 100644
index 44209b15f9..0000000000
--- a/addressbook/gui/component/select-names/Makefile.am
+++ /dev/null
@@ -1,73 +0,0 @@
-# CORBA stuff
-
-IDLS = \
- Evolution-Addressbook-SelectNames.idl
-
-IDL_GENERATED = \
- Evolution-Addressbook-SelectNames.h \
- Evolution-Addressbook-SelectNames-common.c \
- Evolution-Addressbook-SelectNames-skels.c \
- Evolution-Addressbook-SelectNames-stubs.c
-
-Evolution-Addressbook-SelectNames-impl.o: Evolution-Addressbook-SelectNames.h
-
-$(IDL_GENERATED): $(IDLS)
- $(ORBIT_IDL) -I$(datadir)/idl `$(GNOME_CONFIG) --cflags idl` \
- -I$(srcdir) $(srcdir)/Evolution-Addressbook-SelectNames.idl
-
-oafdir = $(datadir)/oaf
-oaf_DATA = evolution-addressbook-select-names.oafinfo
-
-#
-
-CPPFLAGS = \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\"
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"evolution-addressbook\" \
- $(EXTRA_GNOME_CFLAGS) \
- $(GNOME_INCLUDEDIR) \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I$(top_srcdir)/shell \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/widgets/e-text \
- -I$(top_srcdir)/widgets/e-table \
- -I$(top_srcdir)/addressbook/gui/minicard \
- -I$(top_srcdir)/addressbook/contact-editor \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- $(BONOBO_HTML_GNOME_CFLAGS) \
- -DEVOLUTION_VERSION=\""$(VERSION)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \
- -DEVOLUTION_LOCALEDIR=\""$(datadir)/locale"\" \
- -DCAMEL_PROVIDERDIR=\""$(providerdir)"\"
-
-lib_LTLIBRARIES = libeselectnames.la
-
-libeselectnames_la_SOURCES = \
- $(IDL_GENERATED) \
- e-select-names-bonobo.c \
- e-select-names-bonobo.h \
- e-select-names-factory.c \
- e-select-names-factory.h \
- e-select-names-manager.c \
- e-select-names-manager.h \
- e-select-names-model.c \
- e-select-names-model.h \
- e-select-names-table-model.c \
- e-select-names-table-model.h \
- e-select-names-text-model.c \
- e-select-names-text-model.h \
- e-select-names.c \
- e-select-names.h
-
-gladedir = $(datadir)/evolution/glade
-glade_DATA = select-names.glade
-
-EXTRA_DIST = \
- $(glade_DATA) \
- select-names.glade.h \
- $(oaf_DATA) \
- $(IDLS)
diff --git a/addressbook/gui/component/select-names/e-select-names-bonobo.c b/addressbook/gui/component/select-names/e-select-names-bonobo.c
deleted file mode 100644
index a7b8f5b11f..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-bonobo.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-select-names-bonobo.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-
-#include <bonobo/bonobo-property-bag.h>
-#include <bonobo/bonobo-control.h>
-
-#include "Evolution-Addressbook-SelectNames.h"
-
-#include "e-util/e-util.h"
-#include "e-select-names-manager.h"
-
-#include "e-select-names-bonobo.h"
-
-
-#define PARENT_TYPE bonobo_object_get_type ()
-static BonoboObjectClass *parent_class = NULL;
-
-struct _ESelectNamesBonoboPrivate {
- ESelectNamesManager *manager;
-};
-
-enum _EntryPropertyID {
- ENTRY_PROPERTY_ID_TEXT
-};
-typedef enum _EntryPropertyID EntryPropertyID;
-
-
-/* PropertyBag implementation for the entry widgets. */
-
-static void
-entry_get_property_fn (BonoboPropertyBag *bag,
- BonoboArg *arg,
- unsigned int arg_id,
- void *user_data)
-{
- GtkWidget *widget;
- char *text;
-
- widget = GTK_WIDGET (user_data);
-
- switch (arg_id) {
- case ENTRY_PROPERTY_ID_TEXT:
- gtk_object_get (GTK_OBJECT (widget), "text", &text, NULL);
- BONOBO_ARG_SET_STRING (arg, text);
- break;
- default:
- break;
- }
-}
-
-static void
-entry_set_property_fn (BonoboPropertyBag *bag,
- const BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- GtkWidget *widget;
- const char *text;
-
- widget = GTK_WIDGET (user_data);
-
- switch (arg_id) {
- case ENTRY_PROPERTY_ID_TEXT:
- text = BONOBO_ARG_GET_STRING (arg);
- gtk_object_set (GTK_OBJECT (widget), "text", text, NULL);
- break;
- default:
- break;
- }
-}
-
-
-/* CORBA interface implementation. */
-
-static POA_Evolution_Addressbook_SelectNames__vepv SelectNames_vepv;
-
-static POA_Evolution_Addressbook_SelectNames *
-create_servant (void)
-{
- POA_Evolution_Addressbook_SelectNames *servant;
- CORBA_Environment ev;
-
- servant = (POA_Evolution_Addressbook_SelectNames *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &SelectNames_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_Addressbook_SelectNames__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- return servant;
-}
-
-static void
-impl_SelectNames_add_section (PortableServer_Servant servant,
- const CORBA_char *id,
- const CORBA_char *title,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- ESelectNamesBonobo *select_names;
- ESelectNamesBonoboPrivate *priv;
-
- bonobo_object = bonobo_object_from_servant (servant);
- select_names = E_SELECT_NAMES_BONOBO (bonobo_object);
- priv = select_names->priv;
-
- e_select_names_manager_add_section (priv->manager, id, title);
-}
-
-static Bonobo_Control
-impl_SelectNames_get_entry_for_section (PortableServer_Servant servant,
- const CORBA_char *section_id,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- ESelectNamesBonobo *select_names;
- ESelectNamesBonoboPrivate *priv;
- GtkWidget *entry_widget;
- BonoboControl *control;
- BonoboPropertyBag *property_bag;
-
- bonobo_object = bonobo_object_from_servant (servant);
- select_names = E_SELECT_NAMES_BONOBO (bonobo_object);
- priv = select_names->priv;
-
- entry_widget = e_select_names_manager_create_entry (priv->manager, section_id);
- gtk_widget_show (entry_widget);
-
- if (entry_widget == NULL) {
- CORBA_exception_set (ev,
- CORBA_USER_EXCEPTION,
- ex_Evolution_Addressbook_SelectNames_SectionNotFound,
- NULL);
- return CORBA_OBJECT_NIL;
- }
-
- control = bonobo_control_new (entry_widget);
-
- property_bag = bonobo_property_bag_new (entry_get_property_fn, entry_set_property_fn, entry_widget);
- bonobo_property_bag_add (property_bag, "text", ENTRY_PROPERTY_ID_TEXT,
- BONOBO_ARG_STRING, NULL, NULL,
- BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE);
-
- bonobo_control_set_property_bag (control, property_bag);
-
- return bonobo_object_corba_objref (BONOBO_OBJECT (control));
-}
-
-static void
-impl_SelectNames_activate_dialog (PortableServer_Servant servant,
- const CORBA_char *section_id,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- ESelectNamesBonobo *select_names;
- ESelectNamesBonoboPrivate *priv;
-
- bonobo_object = bonobo_object_from_servant (servant);
- select_names = E_SELECT_NAMES_BONOBO (bonobo_object);
- priv = select_names->priv;
-
- e_select_names_manager_activate_dialog (priv->manager, section_id);
-}
-
-
-/* GtkObject methods. */
-
-static void
-impl_destroy (GtkObject *object)
-{
- ESelectNamesBonobo *select_names;
- ESelectNamesBonoboPrivate *priv;
-
- select_names = E_SELECT_NAMES_BONOBO (object);
- priv = select_names->priv;
-
- gtk_object_unref (GTK_OBJECT (priv->manager));
-
- g_free (priv);
-}
-
-
-static void
-corba_class_init ()
-{
- POA_Evolution_Addressbook_SelectNames__vepv *vepv;
- POA_Evolution_Addressbook_SelectNames__epv *epv;
- PortableServer_ServantBase__epv *base_epv;
-
- base_epv = g_new0 (PortableServer_ServantBase__epv, 1);
- base_epv->_private = NULL;
- base_epv->finalize = NULL;
- base_epv->default_POA = NULL;
-
- epv = g_new0 (POA_Evolution_Addressbook_SelectNames__epv, 1);
- epv->add_section = impl_SelectNames_add_section;
- epv->get_entry_for_section = impl_SelectNames_get_entry_for_section;
- epv->activate_dialog = impl_SelectNames_activate_dialog;
-
- vepv = &SelectNames_vepv;
- vepv->Bonobo_Unknown_epv = bonobo_object_get_epv ();
- vepv->Evolution_Addressbook_SelectNames_epv = epv;
-}
-
-static void
-class_init (ESelectNamesBonoboClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- parent_class = gtk_type_class (bonobo_object_get_type ());
-
- object_class->destroy = impl_destroy;
-
- corba_class_init ();
-}
-
-static void
-init (ESelectNamesBonobo *select_names)
-{
- ESelectNamesBonoboPrivate *priv;
-
- priv = g_new (ESelectNamesBonoboPrivate, 1);
-
- priv->manager = e_select_names_manager_new ();
-
- select_names->priv = priv;
-}
-
-
-void
-e_select_names_bonobo_construct (ESelectNamesBonobo *select_names,
- Evolution_Addressbook_SelectNames corba_object)
-{
- g_return_if_fail (select_names != NULL);
- g_return_if_fail (E_IS_SELECT_NAMES_BONOBO (select_names));
-
- bonobo_object_construct (BONOBO_OBJECT (select_names), corba_object);
-}
-
-ESelectNamesBonobo *
-e_select_names_bonobo_new (void)
-{
- POA_Evolution_Addressbook_SelectNames *servant;
- Evolution_Addressbook_SelectNames corba_object;
- ESelectNamesBonobo *select_names;
-
- servant = create_servant ();
- if (servant == NULL)
- return NULL;
-
- select_names = gtk_type_new (e_select_names_bonobo_get_type ());
-
- corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (select_names), servant);
- e_select_names_bonobo_construct (select_names, corba_object);
-
- return select_names;
-}
-
-
-E_MAKE_TYPE (e_select_names_bonobo, "ESelectNamesBonobo", ESelectNamesBonobo, class_init, init, PARENT_TYPE)
diff --git a/addressbook/gui/component/select-names/e-select-names-bonobo.h b/addressbook/gui/component/select-names/e-select-names-bonobo.h
deleted file mode 100644
index 4531c1e024..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-bonobo.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-select-names-bonobo.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __E_SELECT_NAMES_BONOBO_H__
-#define __E_SELECT_NAMES_BONOBO_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo/bonobo-object.h>
-
-#include "Evolution-Addressbook-SelectNames.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_SELECT_NAMES_BONOBO (e_select_names_bonobo_get_type ())
-#define E_SELECT_NAMES_BONOBO(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_BONOBO, ESelectNamesBonobo))
-#define E_SELECT_NAMES_BONOBO_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_BONOBO, ESelectNamesBonoboClass))
-#define E_IS_SELECT_NAMES_BONOBO(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_BONOBO))
-#define E_IS_SELECT_NAMES_BONOBO_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SELECT_NAMES_BONOBO))
-
-
-typedef struct _ESelectNamesBonobo ESelectNamesBonobo;
-typedef struct _ESelectNamesBonoboPrivate ESelectNamesBonoboPrivate;
-typedef struct _ESelectNamesBonoboClass ESelectNamesBonoboClass;
-
-struct _ESelectNamesBonobo {
- BonoboObject parent;
-
- ESelectNamesBonoboPrivate *priv;
-};
-
-struct _ESelectNamesBonoboClass {
- BonoboObjectClass parent_class;
-};
-
-
-GtkType e_select_names_bonobo_get_type (void);
-void e_select_names_bonobo_construct (ESelectNamesBonobo *select_names,
- Evolution_Addressbook_SelectNames corba_object);
-ESelectNamesBonobo *e_select_names_bonobo_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_SELECT_NAMES_BONOBO_H__ */
diff --git a/addressbook/gui/component/select-names/e-select-names-factory.c b/addressbook/gui/component/select-names/e-select-names-factory.c
deleted file mode 100644
index 9a45692071..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-factory.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-select-names-factory.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo.h>
-
-#include "e-select-names-bonobo.h"
-
-#include "e-select-names-factory.h"
-
-
-#define COMPONENT_FACTORY_ID "OAFIID:factory:addressbook:select-names:b39eb1a1-f341-4d5a-9a91-e2616e206b2e"
-
-static BonoboGenericFactory *factory = NULL;
-
-
-static BonoboObject *
-factory_fn (BonoboGenericFactory *factory,
- void *closure)
-{
- return BONOBO_OBJECT (e_select_names_bonobo_new ());
-}
-
-
-gboolean
-e_select_names_factory_init (void)
-{
- if (factory != NULL)
- return TRUE;
-
- factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, factory_fn, NULL);
-
- if (factory == NULL)
- return FALSE;
-
- return TRUE;
-}
diff --git a/addressbook/gui/component/select-names/e-select-names-factory.h b/addressbook/gui/component/select-names/e-select-names-factory.h
deleted file mode 100644
index f65d5aaa9e..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-factory.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-select-names-factory.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_SECELT_NAMES_FACTORY_H
-#define _E_SECELT_NAMES_FACTORY_H
-
-#include <glib.h>
-
-gboolean e_select_names_factory_init (void);
-
-#endif
diff --git a/addressbook/gui/component/select-names/e-select-names-manager.c b/addressbook/gui/component/select-names/e-select-names-manager.c
deleted file mode 100644
index b67ea282e9..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-manager.c
+++ /dev/null
@@ -1,349 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-
-#include "e-select-names-manager.h"
-#include "e-select-names-model.h"
-#include "e-select-names-text-model.h"
-#include "e-select-names.h"
-#include "widgets/e-text/e-entry.h"
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_CARD,
-};
-
-
-typedef struct {
- char *id;
- char *title;
- ESelectNamesModel *model;
-} ESelectNamesManagerSection;
-
-typedef struct {
- char *id;
- EEntry *entry;
-} ESelectNamesManagerEntry;
-
-static void e_select_names_manager_init (ESelectNamesManager *manager);
-static void e_select_names_manager_class_init (ESelectNamesManagerClass *klass);
-
-static void e_select_names_manager_destroy (GtkObject *object);
-static void e_select_names_manager_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_select_names_manager_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-/**
- * e_select_names_manager_get_type:
- * @void:
- *
- * Registers the &ESelectNamesManager class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ESelectNamesManager class.
- **/
-GtkType
-e_select_names_manager_get_type (void)
-{
- static GtkType manager_type = 0;
-
- if (!manager_type) {
- GtkTypeInfo manager_info = {
- "ESelectNamesManager",
- sizeof (ESelectNamesManager),
- sizeof (ESelectNamesManagerClass),
- (GtkClassInitFunc) e_select_names_manager_class_init,
- (GtkObjectInitFunc) e_select_names_manager_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- manager_type = gtk_type_unique (gtk_object_get_type (), &manager_info);
- }
-
- return manager_type;
-}
-
-/**
- * e_select_names_manager_new:
- * @VCard: a string in vCard format
- *
- * Returns: a new #ESelectNamesManager that wraps the @VCard.
- */
-ESelectNamesManager *
-e_select_names_manager_new (void)
-{
- ESelectNamesManager *manager = E_SELECT_NAMES_MANAGER(gtk_type_new(e_select_names_manager_get_type()));
- return manager;
-}
-
-static void
-e_select_names_manager_class_init (ESelectNamesManagerClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
-
- gtk_object_add_arg_type ("ESelectNamesManager::card",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CARD);
-
- object_class->destroy = e_select_names_manager_destroy;
- object_class->get_arg = e_select_names_manager_get_arg;
- object_class->set_arg = e_select_names_manager_set_arg;
-}
-
-/*
- * ESelectNamesManager lifecycle management and vcard loading/saving.
- */
-
-static void
-e_select_names_manager_destroy (GtkObject *object)
-{
- ESelectNamesManager *manager;
-
- manager = E_SELECT_NAMES_MANAGER (object);
-
- gtk_object_unref(GTK_OBJECT(manager->sections));
- gtk_object_unref(GTK_OBJECT(manager->entries));
-}
-
-
-/* Set_arg handler for the manager */
-static void
-e_select_names_manager_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ESelectNamesManager *manager;
-
- manager = E_SELECT_NAMES_MANAGER (object);
-
- switch (arg_id) {
- case ARG_CARD:
- break;
- default:
- return;
- }
-}
-
-/* Get_arg handler for the manager */
-static void
-e_select_names_manager_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ESelectNamesManager *manager;
-
- manager = E_SELECT_NAMES_MANAGER (object);
-
- switch (arg_id) {
- case ARG_CARD:
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void *
-section_copy(const void *sec, void *data)
-{
- const ESelectNamesManagerSection *section = sec;
- ESelectNamesManagerSection *newsec;
-
- newsec = g_new(ESelectNamesManagerSection, 1);
- newsec->id = g_strdup(section->id);
- newsec->title = g_strdup(section->title);
- newsec->model = section->model;
- if (newsec->model)
- gtk_object_ref(GTK_OBJECT(newsec->model));
- return newsec;
-}
-
-static void
-section_free(void *sec, void *data)
-{
- ESelectNamesManagerSection *section = sec;
- g_free(section->id);
- g_free(section->title);
- if (section->model)
- gtk_object_unref(GTK_OBJECT(section->model));
- g_free(section);
-}
-
-static void *
-entry_copy(const void *ent, void *data)
-{
- const ESelectNamesManagerEntry *entry = ent;
- ESelectNamesManagerEntry *newent;
-
- newent = g_new(ESelectNamesManagerEntry, 1);
- newent->id = g_strdup(entry->id);
- newent->entry = entry->entry;
- if (newent->entry)
- gtk_object_ref(GTK_OBJECT(newent->entry));
- return newent;
-}
-
-static void
-entry_free(void *ent, void *data)
-{
- ESelectNamesManagerEntry *entry = ent;
- g_free(entry->id);
- if (entry->entry)
- gtk_object_unref(GTK_OBJECT(entry->entry));
- g_free(entry);
-}
-
-/**
- * e_select_names_manager_init:
- */
-static void
-e_select_names_manager_init (ESelectNamesManager *manager)
-{
- manager->sections = e_list_new(section_copy, section_free, manager);
- manager->entries = e_list_new(entry_copy, entry_free, manager);
-}
-
-void e_select_names_manager_add_section (ESelectNamesManager *manager,
- const char *id,
- const char *title)
-{
- ESelectNamesManagerSection *section;
-
- section = g_new(ESelectNamesManagerSection, 1);
- section->id = g_strdup(id);
- section->title = g_strdup(title);
- section->model = e_select_names_model_new();
- e_list_append(manager->sections, section);
- section_free(section, manager);
-}
-
-static void
-entry_destroyed(EEntry *entry, ESelectNamesManager *manager)
-{
- if(!GTK_OBJECT_DESTROYED(manager)) {
- EIterator *iterator = e_list_get_iterator(manager->entries);
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ESelectNamesManagerEntry *this_entry = e_iterator_get(iterator);
- if(entry == this_entry->entry) {
- e_iterator_delete(iterator);
- break;
- }
- }
- }
- gtk_object_unref(GTK_OBJECT(manager));
-}
-
-GtkWidget *e_select_names_manager_create_entry (ESelectNamesManager *manager,
- const char *id)
-{
- ETextModel *model;
- EIterator *iterator;
- iterator = e_list_get_iterator(manager->sections);
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ESelectNamesManagerSection *section = e_iterator_get(iterator);
- if (!strcmp(section->id, id)) {
- ESelectNamesManagerEntry *entry;
- EEntry *eentry;
- eentry = E_ENTRY(e_entry_new());
-
- entry = g_new(ESelectNamesManagerEntry, 1);
- entry->entry = eentry;
- entry->id = (char *)id;
- model = e_select_names_text_model_new(section->model);
- e_list_append(manager->entries, entry);
- g_free(entry);
-
- gtk_object_set(GTK_OBJECT(eentry),
- "model", model,
- "editable", TRUE,
- "use_ellipsis", TRUE,
- NULL);
- gtk_signal_connect(GTK_OBJECT(eentry), "destroy",
- GTK_SIGNAL_FUNC(entry_destroyed), manager);
- gtk_object_ref(GTK_OBJECT(manager));
- return GTK_WIDGET(eentry);
- }
- }
- return NULL;
-}
-
-static void
-e_select_names_clicked(ESelectNames *dialog, gint button, ESelectNamesManager *manager)
-{
- switch(button) {
- case 0: {
- EList *list = manager->sections;
- EIterator *iterator = e_list_get_iterator(list);
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- ESelectNamesManagerSection *section = (void *) e_iterator_get(iterator);
- ESelectNamesModel *source = e_select_names_get_source(dialog, section->id);
- if (section->model)
- gtk_object_unref(GTK_OBJECT(section->model));
- section->model = source;
- /* Don't ref because get_source returns a conceptual ref_count of 1. */
- }
- gtk_object_unref(GTK_OBJECT(iterator));
-
- list = manager->entries;
- iterator = e_list_get_iterator(list);
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- ESelectNamesManagerEntry *entry = (void *) e_iterator_get(iterator);
- ESelectNamesModel *source = e_select_names_get_source(dialog, entry->id);
- if (source) {
- ETextModel *model = e_select_names_text_model_new(source);
- if (model) {
- gtk_object_set(GTK_OBJECT(entry->entry),
- "model", model,
- NULL);
- gtk_object_unref(GTK_OBJECT(source));
- }
- gtk_object_unref(GTK_OBJECT(model));
- }
- }
- gtk_object_unref(GTK_OBJECT(iterator));
- break;
- }
- }
- gnome_dialog_close(GNOME_DIALOG(dialog));
-}
-
-void e_select_names_manager_activate_dialog (ESelectNamesManager *manager,
- const char *id)
-{
- ESelectNames *names = E_SELECT_NAMES(e_select_names_new());
- EIterator *iterator;
- iterator = e_list_get_iterator(manager->sections);
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ESelectNamesManagerSection *section = e_iterator_get(iterator);
- ESelectNamesModel *newmodel = e_select_names_model_duplicate(section->model);
- e_select_names_add_section(names, section->id, section->title, newmodel);
- gtk_object_unref(GTK_OBJECT(newmodel));
- }
- gtk_signal_connect(GTK_OBJECT(names), "clicked",
- GTK_SIGNAL_FUNC(e_select_names_clicked), manager);
- gtk_widget_show(GTK_WIDGET(names));
-}
-
-/* Of type ECard */
-EList *e_select_names_manager_get_cards (ESelectNamesManager *manager,
- const char *id)
-{
- EIterator *iterator;
- iterator = e_list_get_iterator(manager->sections);
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ESelectNamesManagerSection *section = e_iterator_get(iterator);
- if (!strcmp(section->id, id)) {
- return e_select_names_model_get_cards(section->model);
- }
- }
- return NULL;
-}
diff --git a/addressbook/gui/component/select-names/e-select-names-manager.h b/addressbook/gui/component/select-names/e-select-names-manager.h
deleted file mode 100644
index b05348ae79..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-manager.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#ifndef __E_SELECT_NAMES_MANAGER_H__
-#define __E_SELECT_NAMES_MANAGER_H__
-
-#include <time.h>
-#include <gtk/gtk.h>
-#include <stdio.h>
-#include <e-util/e-list.h>
-
-#define E_TYPE_SELECT_NAMES_MANAGER (e_select_names_manager_get_type ())
-#define E_SELECT_NAMES_MANAGER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_MANAGER, ESelectNamesManager))
-#define E_SELECT_NAMES_MANAGER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_MANAGER, ESelectNamesManagerClass))
-#define E_IS_SELECT_NAMES_MANAGER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_MANAGER))
-#define E_IS_SELECT_NAMES_MANAGER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_MANAGER))
-
-typedef struct _ESelectNamesManager ESelectNamesManager;
-typedef struct _ESelectNamesManagerClass ESelectNamesManagerClass;
-
-struct _ESelectNamesManager {
- GtkObject object;
-
- EList *sections;
- EList *entries;
-};
-
-struct _ESelectNamesManagerClass {
- GtkObjectClass parent_class;
-};
-
-ESelectNamesManager *e_select_names_manager_new (void);
-void e_select_names_manager_add_section (ESelectNamesManager *manager,
- const char *id,
- const char *title);
-GtkWidget *e_select_names_manager_create_entry (ESelectNamesManager *manager,
- const char *id);
-void e_select_names_manager_activate_dialog (ESelectNamesManager *manager,
- const char *id);
-
-/* Of type ECard */
-EList *e_select_names_manager_get_cards (ESelectNamesManager *manager,
- const char *id);
-
-/* Standard Gtk function */
-GtkType e_select_names_manager_get_type (void);
-
-#endif /* ! __E_SELECT_NAMES_MANAGER_H__ */
diff --git a/addressbook/gui/component/select-names/e-select-names-model.c b/addressbook/gui/component/select-names/e-select-names-model.c
deleted file mode 100644
index 32f2a85a56..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-model.c
+++ /dev/null
@@ -1,441 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-
-#include "e-select-names-model.h"
-#include "e-util/e-util.h"
-#include "addressbook/backend/ebook/e-card-simple.h"
-
-enum {
- E_SELECT_NAMES_MODEL_CHANGED,
- E_SELECT_NAMES_MODEL_LAST_SIGNAL
-};
-
-static guint e_select_names_model_signals[E_SELECT_NAMES_MODEL_LAST_SIGNAL] = { 0 };
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_CARD,
-};
-
-static void e_select_names_model_init (ESelectNamesModel *model);
-static void e_select_names_model_class_init (ESelectNamesModelClass *klass);
-
-static void e_select_names_model_destroy (GtkObject *object);
-static void e_select_names_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_select_names_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-/**
- * e_select_names_model_get_type:
- * @void:
- *
- * Registers the &ESelectNamesModel class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ESelectNamesModel class.
- **/
-GtkType
-e_select_names_model_get_type (void)
-{
- static GtkType model_type = 0;
-
- if (!model_type) {
- GtkTypeInfo model_info = {
- "ESelectNamesModel",
- sizeof (ESelectNamesModel),
- sizeof (ESelectNamesModelClass),
- (GtkClassInitFunc) e_select_names_model_class_init,
- (GtkObjectInitFunc) e_select_names_model_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- model_type = gtk_type_unique (gtk_object_get_type (), &model_info);
- }
-
- return model_type;
-}
-
-/**
- * e_select_names_model_new:
- * @VCard: a string in vCard format
- *
- * Returns: a new #ESelectNamesModel that wraps the @VCard.
- */
-ESelectNamesModel *
-e_select_names_model_new (void)
-{
- ESelectNamesModel *model = E_SELECT_NAMES_MODEL(gtk_type_new(e_select_names_model_get_type()));
- return model;
-}
-
-/**
- * e_select_names_model_new:
- * @VCard: a string in vCard format
- *
- * Returns: a new #ESelectNamesModel that wraps the @VCard.
- */
-ESelectNamesModel *
-e_select_names_model_duplicate (ESelectNamesModel *old)
-{
- ESelectNamesModel *model = E_SELECT_NAMES_MODEL(gtk_type_new(e_select_names_model_get_type()));
- model->data = e_list_duplicate(old->data);
- model->id = g_strdup(old->id);
- model->title = g_strdup(old->title);
- return model;
-}
-
-static void
-e_select_names_model_class_init (ESelectNamesModelClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
-
- e_select_names_model_signals[E_SELECT_NAMES_MODEL_CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ESelectNamesModelClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_select_names_model_signals, E_SELECT_NAMES_MODEL_LAST_SIGNAL);
-
- gtk_object_add_arg_type ("ESelectNamesModel::card",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CARD);
-
- klass->changed = NULL;
-
- object_class->destroy = e_select_names_model_destroy;
- object_class->get_arg = e_select_names_model_get_arg;
- object_class->set_arg = e_select_names_model_set_arg;
-}
-
-/*
- * ESelectNamesModel lifecycle management and vcard loading/saving.
- */
-
-static void
-e_select_names_model_destroy (GtkObject *object)
-{
- ESelectNamesModel *model;
-
- model = E_SELECT_NAMES_MODEL (object);
-
- gtk_object_unref(GTK_OBJECT(model->data));
-}
-
-
-/* Set_arg handler for the model */
-static void
-e_select_names_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ESelectNamesModel *model;
-
- model = E_SELECT_NAMES_MODEL (object);
-
- switch (arg_id) {
- case ARG_CARD:
- break;
- default:
- return;
- }
-}
-
-/* Get_arg handler for the model */
-static void
-e_select_names_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ESelectNamesModel *model;
-
- model = E_SELECT_NAMES_MODEL (object);
-
- switch (arg_id) {
- case ARG_CARD:
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void *
-data_copy(const void *sec, void *data)
-{
- const ESelectNamesModelData *section = sec;
- ESelectNamesModelData *newsec;
-
- newsec = g_new(ESelectNamesModelData, 1);
- newsec->type = section->type;
- newsec->card = section->card;
- if (newsec->card)
- gtk_object_ref(GTK_OBJECT(newsec->card));
- newsec->string = g_strdup(section->string);
- return newsec;
-}
-
-static void
-data_free(void *sec, void *data)
-{
- ESelectNamesModelData *section = sec;
- if (section->card)
- gtk_object_unref(GTK_OBJECT(section->card));
- g_free(section->string);
- g_free(section);
-}
-
-/**
- * e_select_names_model_init:
- */
-static void
-e_select_names_model_init (ESelectNamesModel *model)
-{
- model->data = e_list_new(data_copy, data_free, model);
-}
-
-static void *
-copy_func(const void *data, void *user_data)
-{
- GtkObject *object = (void *) data;
- if (object)
- gtk_object_ref(object);
- return object;
-}
-
-static void
-free_func(void *data, void *user_data)
-{
- GtkObject *object = data;
- if (object)
- gtk_object_unref(object);
-}
-
-/* Of type ECard */
-EList *e_select_names_model_get_cards (ESelectNamesModel *model)
-{
- EList *list = e_list_new(copy_func, free_func, NULL);
- EIterator *iterator = e_list_get_iterator(model->data);
- EIterator *new_iterator = e_list_get_iterator(list);
-
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- ESelectNamesModelData *node = (void *) e_iterator_get(iterator);
- ECard *card;
- ECardSimple *simple;
- if (node->card) {
- card = node->card;
- gtk_object_ref(GTK_OBJECT(card));
- } else {
- card = e_card_new("");
- }
- simple = e_card_simple_new(card);
- e_card_simple_set_arbitrary(simple, "text_version", "string", node->string);
- e_iterator_insert(new_iterator, card, FALSE);
- gtk_object_unref(GTK_OBJECT(card));
- gtk_object_unref(GTK_OBJECT(simple));
- }
- return list;
-}
-
-EList *e_select_names_model_get_data (ESelectNamesModel *model)
-{
- return model->data;
-}
-
-static void
-e_select_names_model_changed (ESelectNamesModel *model)
-{
- gtk_signal_emit(GTK_OBJECT(model),
- e_select_names_model_signals[E_SELECT_NAMES_MODEL_CHANGED]);
-}
-
-void
-e_select_names_model_insert (ESelectNamesModel *model,
- EIterator *iterator, /* Must be one of the iterators in the model, or NULL if the list is empty. */
- int index,
- char *data)
-{
- gchar **strings = e_strsplit(data, ",", -1);
- int i;
- if (iterator == NULL) {
- ESelectNamesModelData new = {E_SELECT_NAMES_MODEL_DATA_TYPE_STRING_ADDRESS, NULL, ""};
-
- e_list_append(model->data, &new);
- iterator = e_list_get_iterator(model->data);
-
- index = 0;
- } else {
- gtk_object_ref(GTK_OBJECT(iterator));
- }
- if (strings[0]) {
- ESelectNamesModelData *node = (void *) e_iterator_get(iterator);
- gchar *temp = g_strdup_printf("%.*s%s%s", index, node->string, strings[0], node->string + index);
- g_free(node->string);
- node->string = temp;
- index += strlen(strings[0]);
-
- for (i = 1; strings[i]; i++) {
- ESelectNamesModelData *node = (void *) e_iterator_get(iterator);
- gchar *temp = g_strdup_printf("%.*s", index, node->string);
- gchar *temp2 = g_strdup_printf("%s%s", strings[i], node->string + index);
-
- g_free(node->string);
- node->type = E_SELECT_NAMES_MODEL_DATA_TYPE_STRING_ADDRESS;
- node->string = temp;
- if (node->card)
- gtk_object_unref(GTK_OBJECT(node->card));
- node->card = NULL;
-
- node = g_new(ESelectNamesModelData, 1);
- node->type = E_SELECT_NAMES_MODEL_DATA_TYPE_STRING_ADDRESS;
- node->card = NULL;
- node->string = temp2;
- e_iterator_insert(iterator, node, 0);
- index = strlen(strings[i]);
- g_free(node->string);
- g_free(node);
- }
- }
- e_select_names_model_changed(model);
- gtk_object_unref(GTK_OBJECT(iterator));
-}
-
-void
-e_select_names_model_insert_length (ESelectNamesModel *model,
- EIterator *iterator, /* Must be one of the iterators in the model. */
- int index,
- char *data,
- int length)
-{
- gchar *string = g_new(char, length + 1);
- strncpy(string, data, length);
- string[length] = 0;
- e_select_names_model_insert(model, iterator, index, string);
- g_free(string);
-}
-
-void
-e_select_names_model_delete (ESelectNamesModel *model,
- EIterator *iterator, /* Must be one of the iterators in the model. */
- int index,
- int length)
-{
- while (length > 0 && e_iterator_is_valid(iterator)) {
- ESelectNamesModelData *node = (void *) e_iterator_get(iterator);
- int this_length = strlen(node->string);
- if (this_length <= index + length) {
- gchar *temp = g_strdup_printf("%.*s", index, node->string);
- g_free(node->string);
- node->string = temp;
- length -= this_length - index;
- } else {
- gchar *temp = g_strdup_printf("%.*s%s", index, node->string, node->string + index + length);
- g_free(node->string);
- node->string = temp;
- break;
- }
-
- if (length > 0) {
- e_iterator_next(iterator);
- if (e_iterator_is_valid(iterator)) {
- ESelectNamesModelData *node2 = (void *) e_iterator_get(iterator);
- gchar *temp = g_strdup_printf("%s%s", node->string, node2->string);
- g_free(node2->string);
- node2->string = temp;
- e_iterator_prev(iterator);
- e_iterator_delete(iterator);
- length --;
- }
- }
- }
- e_select_names_model_changed(model);
-}
-
-void
-e_select_names_model_replace (ESelectNamesModel *model,
- EIterator *iterator, /* Must be one of the iterators in the model. */
- int index,
- int length,
- char *data)
-{
- if (iterator == NULL) {
- ESelectNamesModelData new = {E_SELECT_NAMES_MODEL_DATA_TYPE_STRING_ADDRESS, NULL, ""};
-
- e_list_append(model->data, &new);
- iterator = e_list_get_iterator(model->data);
-
- index = 0;
- } else {
- gtk_object_ref(GTK_OBJECT(iterator));
- }
- while (length > 0 && e_iterator_is_valid(iterator)) {
- ESelectNamesModelData *node = (void *) e_iterator_get(iterator);
- int this_length = strlen(node->string);
- if (this_length <= index + length) {
- gchar *temp = g_strdup_printf("%.*s", index, node->string);
- g_free(node->string);
- node->string = temp;
- length -= this_length - index;
- } else {
- gchar *temp = g_strdup_printf("%.*s%s", index, node->string, node->string + index + length);
- g_free(node->string);
- node->string = temp;
- length = 0;
- }
-
- if (length > 0) {
- e_iterator_next(iterator);
- if (e_iterator_is_valid(iterator)) {
- ESelectNamesModelData *node2 = (void *) e_iterator_get(iterator);
- gchar *temp = g_strdup_printf("%s%s", node->string, node2->string);
- g_free(node2->string);
- node2->string = temp;
- e_iterator_prev(iterator);
- e_iterator_delete(iterator);
- }
- }
- }
- if (!e_iterator_is_valid(iterator)) {
- ESelectNamesModelData *node;
- e_iterator_last(iterator);
- if (e_iterator_is_valid(iterator)) {
- node = (void *) e_iterator_get(iterator);
- index = strlen(node->string);
- } else
- index = 0;
- }
- e_select_names_model_insert (model, iterator, index, data);
- gtk_object_unref(GTK_OBJECT(iterator));
-}
-
-
-void
-e_select_names_model_add_item (ESelectNamesModel *model,
- EIterator *iterator, /* NULL for at the beginning. */
- ESelectNamesModelData *data)
-{
- e_iterator_insert(iterator, data, FALSE);
- e_select_names_model_changed(model);
-}
-
-void
-e_select_names_model_remove_item (ESelectNamesModel *model,
- EIterator *iterator)
-{
- e_iterator_delete(iterator);
- e_select_names_model_changed(model);
-}
-
-
diff --git a/addressbook/gui/component/select-names/e-select-names-model.h b/addressbook/gui/component/select-names/e-select-names-model.h
deleted file mode 100644
index 4ea1bdc8db..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-model.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#ifndef __E_SELECT_NAMES_MODEL_H__
-#define __E_SELECT_NAMES_MODEL_H__
-
-#include <time.h>
-#include <gtk/gtk.h>
-#include <stdio.h>
-#include <e-util/e-list.h>
-#include <addressbook/backend/ebook/e-card.h>
-
-#define E_TYPE_SELECT_NAMES_MODEL (e_select_names_model_get_type ())
-#define E_SELECT_NAMES_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_MODEL, ESelectNamesModel))
-#define E_SELECT_NAMES_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_MODEL, ESelectNamesModelClass))
-#define E_IS_SELECT_NAMES_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_MODEL))
-#define E_IS_SELECT_NAMES_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_MODEL))
-
-typedef enum _ESelectNamesModelDataType ESelectNamesModelDataType;
-typedef struct _ESelectNamesModelData ESelectNamesModelData;
-typedef struct _ESelectNamesModel ESelectNamesModel;
-typedef struct _ESelectNamesModelClass ESelectNamesModelClass;
-
-enum _ESelectNamesModelDataType {
- E_SELECT_NAMES_MODEL_DATA_TYPE_CARD,
- E_SELECT_NAMES_MODEL_DATA_TYPE_STRING_ADDRESS,
-};
-
-struct _ESelectNamesModelData {
- ESelectNamesModelDataType type;
- ECard *card;
- char *string;
-};
-
-struct _ESelectNamesModel {
- GtkObject object;
-
- char *id;
- char *title;
-
- EList *data; /* Of type ESelectNamesModelData. */
-};
-
-struct _ESelectNamesModelClass {
- GtkObjectClass parent_class;
-
- void (*changed) (ESelectNamesModel *model);
-};
-
-ESelectNamesModel *e_select_names_model_new (void);
-ESelectNamesModel *e_select_names_model_duplicate (ESelectNamesModel *old);
-
-/* These lengths are allowed to go over objects and act just like the text model does. */
-void e_select_names_model_insert (ESelectNamesModel *model,
- EIterator *iterator, /* Must be one of the iterators in the model. */
- int index,
- char *data);
-void e_select_names_model_insert_length (ESelectNamesModel *model,
- EIterator *iterator, /* Must be one of the iterators in the model. */
- int index,
- char *data,
- int length);
-void e_select_names_model_delete (ESelectNamesModel *model,
- EIterator *iterator, /* Must be one of the iterators in the model. */
- int index,
- int length);
-void e_select_names_model_replace (ESelectNamesModel *model,
- EIterator *iterator, /* Must be one of the iterators in the model. */
- int index,
- int replacement_length,
- char *data);
-
-void e_select_names_model_add_item (ESelectNamesModel *model,
- EIterator *iterator, /* NULL for at the beginning. */
- ESelectNamesModelData *data);
-void e_select_names_model_remove_item (ESelectNamesModel *model,
- EIterator *iterator);
-
-/* Of type ECard */
-EList *e_select_names_model_get_cards (ESelectNamesModel *model);
-
-/* Of type ESelectNamesModelData */
-EList *e_select_names_model_get_data (ESelectNamesModel *model);
-
-/* Standard Gtk function */
-GtkType e_select_names_model_get_type (void);
-
-#endif /* ! __E_SELECT_NAMES_MODEL_H__ */
diff --git a/addressbook/gui/component/select-names/e-select-names-table-model.c b/addressbook/gui/component/select-names/e-select-names-table-model.c
deleted file mode 100644
index 0c56606c31..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-table-model.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-
-#include "e-util/e-util.h"
-#include "e-select-names-table-model.h"
-#include "addressbook/backend/ebook/e-card-simple.h"
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_SOURCE,
-};
-
-static void e_select_names_table_model_init (ESelectNamesTableModel *model);
-static void e_select_names_table_model_class_init (ESelectNamesTableModelClass *klass);
-
-static void e_select_names_table_model_destroy (GtkObject *object);
-static void e_select_names_table_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_select_names_table_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-static void e_select_names_table_model_model_changed (ESelectNamesModel *source,
- ESelectNamesTableModel *model);
-
-
-static void
-e_select_names_table_model_add_source (ESelectNamesTableModel *model,
- ESelectNamesModel *source)
-{
- model->source = source;
- if (model->source)
- gtk_object_ref(GTK_OBJECT(model->source));
- model->source_changed_id = gtk_signal_connect(GTK_OBJECT(model->source), "changed",
- GTK_SIGNAL_FUNC(e_select_names_table_model_model_changed),
- model);
-}
-
-static void
-e_select_names_table_model_drop_source (ESelectNamesTableModel *model)
-{
- if (model->source_changed_id)
- gtk_signal_disconnect(GTK_OBJECT(model->source), model->source_changed_id);
- if (model->source)
- gtk_object_unref(GTK_OBJECT(model->source));
- model->source = NULL;
- model->source_changed_id = 0;
-}
-
-/**
- * e_select_names_table_model_get_type:
- * @void:
- *
- * Registers the &ESelectNamesTableModel class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ESelectNamesTableModel class.
- **/
-GtkType
-e_select_names_table_model_get_type (void)
-{
- static GtkType model_type = 0;
-
- if (!model_type) {
- GtkTypeInfo model_info = {
- "ESelectNamesTableModel",
- sizeof (ESelectNamesTableModel),
- sizeof (ESelectNamesTableModelClass),
- (GtkClassInitFunc) e_select_names_table_model_class_init,
- (GtkObjectInitFunc) e_select_names_table_model_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- model_type = gtk_type_unique (e_table_model_get_type (), &model_info);
- }
-
- return model_type;
-}
-
-/**
- * e_select_names_table_model_new:
- * @VCard: a string in vCard format
- *
- * Returns: a new #ESelectNamesTableModel that wraps the @VCard.
- */
-ETableModel *
-e_select_names_table_model_new (ESelectNamesModel *source)
-{
- ETableModel *model = E_TABLE_MODEL(gtk_type_new(e_select_names_table_model_get_type()));
- gtk_object_set(GTK_OBJECT(model),
- "source", source,
- NULL);
- return model;
-}
-
-static void
-fill_in_info (ESelectNamesTableModel *model)
-{
- if (model->source) {
- EList *list = e_select_names_model_get_data(model->source);
- EIterator *iterator = e_list_get_iterator(list);
- int count = 0;
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- count ++;
- }
- model->count = count;
- model->data = g_new(ESelectNamesTableModelData, count);
- count = 0;
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ESelectNamesModelData *data = e_iterator_get(iterator);
- switch (data->type) {
- case E_SELECT_NAMES_MODEL_DATA_TYPE_CARD: {
- ECardSimple *simple = e_card_simple_new(data->card);
- model->data[count].name = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FULL_NAME);
- if ((model->data[count].name == 0) || *model->data[count].name == 0) {
- model->data[count].name = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_ORG);
- }
- if (model->data[count].name == 0)
- model->data[count].name = g_strdup("");
- model->data[count].email = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_EMAIL);
- if (model->data[count].email == 0)
- model->data[count].email = g_strdup("");
- gtk_object_unref(GTK_OBJECT(simple));
- count ++;
- break;
- }
- case E_SELECT_NAMES_MODEL_DATA_TYPE_STRING_ADDRESS:
- model->data[count].name = e_strdup_strip(data->string);
- model->data[count].email = e_strdup_strip(data->string);
- count ++;
- break;
- }
- }
- } else {
- model->count = 0;
- }
-}
-
-static void
-clear_info (ESelectNamesTableModel *model)
-{
- int i;
- for (i = 0; i < model->count; i++) {
- g_free(model->data[i].name);
- g_free(model->data[i].email);
- }
- g_free(model->data);
- model->data = NULL;
- model->count = -1;
-}
-
-/*
- * ESelectNamesTableModel lifecycle management and vcard loading/saving.
- */
-
-static void
-e_select_names_table_model_destroy (GtkObject *object)
-{
- ESelectNamesTableModel *model;
-
- model = E_SELECT_NAMES_TABLE_MODEL (object);
-
- e_select_names_table_model_drop_source (model);
- clear_info(model);
-}
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-e_select_names_table_model_col_count (ETableModel *etc)
-{
- return 2;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-e_select_names_table_model_row_count (ETableModel *etc)
-{
- ESelectNamesTableModel *e_select_names_table_model = E_SELECT_NAMES_TABLE_MODEL(etc);
- if (e_select_names_table_model->count == -1) {
- if (e_select_names_table_model->source) {
- fill_in_info(e_select_names_table_model);
- } else {
- return 0;
- }
- }
- return e_select_names_table_model->count;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-e_select_names_table_model_value_at (ETableModel *etc, int col, int row)
-{
- ESelectNamesTableModel *e_select_names_table_model = E_SELECT_NAMES_TABLE_MODEL(etc);
- if (e_select_names_table_model->data == NULL) {
- fill_in_info(e_select_names_table_model);
- }
- switch (col) {
- case 0:
- if (e_select_names_table_model->data[row].name == NULL) {
- fill_in_info(e_select_names_table_model);
- }
- return e_select_names_table_model->data[row].name;
- break;
- case 1:
- if (e_select_names_table_model->data[row].email == NULL) {
- fill_in_info(e_select_names_table_model);
- }
- return e_select_names_table_model->data[row].email;
- break;
- }
- return "";
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-e_select_names_table_model_set_value_at (ETableModel *etc, int col, int row, const void *val)
-{
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-e_select_names_table_model_is_cell_editable (ETableModel *etc, int col, int row)
-{
- return FALSE;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-e_select_names_table_model_duplicate_value (ETableModel *etc, int col, const void *value)
-{
- return g_strdup(value);
-}
-
-/* This function frees the value passed to it. */
-static void
-e_select_names_table_model_free_value (ETableModel *etc, int col, void *value)
-{
- g_free(value);
-}
-
-static void *
-e_select_names_table_model_initialize_value (ETableModel *etc, int col)
-{
- return g_strdup("");
-}
-
-static gboolean
-e_select_names_table_model_value_is_empty (ETableModel *etc, int col, const void *value)
-{
- return !(value && *(char *)value);
-}
-
-static char *
-e_select_names_table_model_value_to_string (ETableModel *etc, int col, const void *value)
-{
- return g_strdup(value);
-}
-
-static void
-e_select_names_table_model_model_changed (ESelectNamesModel *source,
- ESelectNamesTableModel *model)
-{
- clear_info(model);
- e_table_model_changed(E_TABLE_MODEL(model));
-}
-
-/* Set_arg handler for the model */
-static void
-e_select_names_table_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ESelectNamesTableModel *model;
-
- model = E_SELECT_NAMES_TABLE_MODEL (object);
-
- switch (arg_id) {
- case ARG_SOURCE:
- e_select_names_table_model_drop_source (model);
- e_select_names_table_model_add_source (model, E_SELECT_NAMES_MODEL(GTK_VALUE_OBJECT (*arg)));
- break;
- default:
- return;
- }
-}
-
-/* Get_arg handler for the model */
-static void
-e_select_names_table_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ESelectNamesTableModel *model;
-
- model = E_SELECT_NAMES_TABLE_MODEL (object);
-
- switch (arg_id) {
- case ARG_SOURCE:
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(model->source);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-/**
- * e_select_names_table_model_init:
- */
-static void
-e_select_names_table_model_init (ESelectNamesTableModel *model)
-{
- model->source = NULL;
- model->source_changed_id = 0;
-
- model->count = -1;
- model->data = NULL;
-}
-
-static void
-e_select_names_table_model_class_init (ESelectNamesTableModelClass *klass)
-{
- GtkObjectClass *object_class;
- ETableModelClass *table_model_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
- table_model_class = E_TABLE_MODEL_CLASS(klass);
-
- gtk_object_add_arg_type ("ESelectNamesTableModel::source",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_SOURCE);
-
- object_class->destroy = e_select_names_table_model_destroy;
- object_class->get_arg = e_select_names_table_model_get_arg;
- object_class->set_arg = e_select_names_table_model_set_arg;
-
- table_model_class->column_count = e_select_names_table_model_col_count;
- table_model_class->row_count = e_select_names_table_model_row_count;
- table_model_class->value_at = e_select_names_table_model_value_at;
- table_model_class->set_value_at = e_select_names_table_model_set_value_at;
- table_model_class->is_cell_editable = e_select_names_table_model_is_cell_editable;
- table_model_class->duplicate_value = e_select_names_table_model_duplicate_value;
- table_model_class->free_value = e_select_names_table_model_free_value;
- table_model_class->initialize_value = e_select_names_table_model_initialize_value;
- table_model_class->value_is_empty = e_select_names_table_model_value_is_empty;
- table_model_class->value_to_string = e_select_names_table_model_value_to_string;
-}
diff --git a/addressbook/gui/component/select-names/e-select-names-table-model.h b/addressbook/gui/component/select-names/e-select-names-table-model.h
deleted file mode 100644
index e0f0f5d804..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-table-model.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#ifndef __E_SELECT_NAMES_TABLE_MODEL_H__
-#define __E_SELECT_NAMES_TABLE_MODEL_H__
-
-#include <time.h>
-#include <gtk/gtk.h>
-#include <stdio.h>
-#include "e-select-names-model.h"
-#include <widgets/e-table/e-table-model.h>
-
-#define E_TYPE_SELECT_NAMES_TABLE_MODEL (e_select_names_table_model_get_type ())
-#define E_SELECT_NAMES_TABLE_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_TABLE_MODEL, ESelectNamesTableModel))
-#define E_SELECT_NAMES_TABLE_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_TABLE_MODEL, ESelectNamesTableModelClass))
-#define E_IS_SELECT_NAMES_TABLE_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_TABLE_MODEL))
-#define E_IS_SELECT_NAMES_TABLE_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_TABLE_MODEL))
-
-typedef struct {
- char *name;
- char *email;
-} ESelectNamesTableModelData;
-
-typedef struct _ESelectNamesTableModel ESelectNamesTableModel;
-typedef struct _ESelectNamesTableModelClass ESelectNamesTableModelClass;
-
-struct _ESelectNamesTableModel {
- ETableModel parent;
-
- ESelectNamesModel *source;
- int source_changed_id;
-
- int count;
- ESelectNamesTableModelData *data; /* This is used as an array. */
-};
-
-struct _ESelectNamesTableModelClass {
- ETableModelClass parent_class;
-};
-
-ETableModel *e_select_names_table_model_new (ESelectNamesModel *source);
-
-/* Standard Gtk function */
-GtkType e_select_names_table_model_get_type (void);
-
-#endif /* ! __E_SELECT_NAMES_TABLE_MODEL_H__ */
diff --git a/addressbook/gui/component/select-names/e-select-names-text-model.c b/addressbook/gui/component/select-names/e-select-names-text-model.c
deleted file mode 100644
index 71934c46dc..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-text-model.c
+++ /dev/null
@@ -1,357 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-
-#include "e-select-names-text-model.h"
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_SOURCE,
-};
-
-static void e_select_names_text_model_init (ESelectNamesTextModel *model);
-static void e_select_names_text_model_class_init (ESelectNamesTextModelClass *klass);
-
-static void e_select_names_text_model_destroy (GtkObject *object);
-static void e_select_names_text_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_select_names_text_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-static void e_select_names_text_model_set_text (ETextModel *model, gchar *text);
-static void e_select_names_text_model_insert (ETextModel *model, gint position, gchar *text);
-static void e_select_names_text_model_insert_length (ETextModel *model, gint position, gchar *text, gint length);
-static void e_select_names_text_model_delete (ETextModel *model, gint position, gint length);
-
-static void e_select_names_text_model_model_changed (ESelectNamesModel *source,
- ESelectNamesTextModel *model);
-
-
-ETextModelClass *parent_class;
-#define PARENT_TYPE e_text_model_get_type()
-
-/**
- * e_select_names_text_model_get_type:
- * @void:
- *
- * Registers the &ESelectNamesTextModel class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ESelectNamesTextModel class.
- **/
-GtkType
-e_select_names_text_model_get_type (void)
-{
- static GtkType model_type = 0;
-
- if (!model_type) {
- GtkTypeInfo model_info = {
- "ESelectNamesTextModel",
- sizeof (ESelectNamesTextModel),
- sizeof (ESelectNamesTextModelClass),
- (GtkClassInitFunc) e_select_names_text_model_class_init,
- (GtkObjectInitFunc) e_select_names_text_model_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- model_type = gtk_type_unique (PARENT_TYPE, &model_info);
- }
-
- return model_type;
-}
-
-/**
- * e_select_names_text_model_new:
- * @VCard: a string in vCard format
- *
- * Returns: a new #ESelectNamesTextModel that wraps the @VCard.
- */
-ETextModel *
-e_select_names_text_model_new (ESelectNamesModel *source)
-{
- ETextModel *model = E_TEXT_MODEL(gtk_type_new(e_select_names_text_model_get_type()));
- gtk_object_set(GTK_OBJECT(model),
- "source", source,
- NULL);
- e_select_names_text_model_model_changed (source, E_SELECT_NAMES_TEXT_MODEL(model));
- return model;
-}
-
-static void
-e_select_names_text_model_class_init (ESelectNamesTextModelClass *klass)
-{
- GtkObjectClass *object_class;
- ETextModelClass *text_model_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
- text_model_class = E_TEXT_MODEL_CLASS(klass);
-
- parent_class = gtk_type_class(PARENT_TYPE);
-
- gtk_object_add_arg_type ("ESelectNamesTextModel::source",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_SOURCE);
-
- object_class->destroy = e_select_names_text_model_destroy;
- object_class->get_arg = e_select_names_text_model_get_arg;
- object_class->set_arg = e_select_names_text_model_set_arg;
-
- text_model_class->set_text = e_select_names_text_model_set_text;
- text_model_class->insert = e_select_names_text_model_insert;
- text_model_class->insert_length = e_select_names_text_model_insert_length;
- text_model_class->delete = e_select_names_text_model_delete;
-}
-
-static int
-get_length(EIterator *iterator)
-{
- const ESelectNamesModelData *data = e_iterator_get(iterator);
- return strlen(data->string);
-}
-
-static void
-e_select_names_text_model_set_text (ETextModel *model, gchar *text)
-{
- ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL(model)->source;
- EIterator *iterator = e_list_get_iterator(e_select_names_model_get_data(source));
- int length = 0;
- if (model->text) {
- length = strlen(model->text);
- }
-
- e_iterator_reset(iterator);
- if (!e_iterator_is_valid(iterator)) {
- gtk_object_unref(GTK_OBJECT(iterator));
- iterator = NULL;
- }
- e_select_names_model_replace(source,
- iterator,
- 0,
- length,
- text);
- if (iterator)
- gtk_object_unref(GTK_OBJECT(iterator));
-}
-
-static void
-e_select_names_text_model_insert (ETextModel *model, gint position, gchar *text)
-{
- ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL(model)->source;
- EIterator *iterator = e_list_get_iterator(e_select_names_model_get_data(source));
-
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- int this_length = get_length(iterator);
- if (position <= this_length) {
- break;
- } else {
- position -= this_length + 1;
- }
- }
- if (!e_iterator_is_valid(iterator)) {
- gtk_object_unref(GTK_OBJECT(iterator));
- iterator = NULL;
- }
- e_select_names_model_insert(source,
- iterator,
- position,
- text);
- if (iterator)
- gtk_object_unref(GTK_OBJECT(iterator));
-}
-
-static void
-e_select_names_text_model_insert_length (ETextModel *model, gint position, gchar *text, gint length)
-{
- ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL(model)->source;
- EIterator *iterator = e_list_get_iterator(e_select_names_model_get_data(source));
-
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- int this_length = get_length(iterator);
- if (position <= this_length) {
- break;
- } else {
- position -= this_length + 1;
- }
- }
- if (!e_iterator_is_valid(iterator)) {
- gtk_object_unref(GTK_OBJECT(iterator));
- iterator = NULL;
- }
- e_select_names_model_insert_length(source,
- iterator,
- position,
- text,
- length);
- if (iterator)
- gtk_object_unref(GTK_OBJECT(iterator));
-}
-
-static void
-e_select_names_text_model_delete (ETextModel *model, gint position, gint length)
-{
- ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL(model)->source;
- EIterator *iterator = e_list_get_iterator(e_select_names_model_get_data(source));
-
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- int this_length = get_length(iterator);
- if (position <= this_length) {
- e_select_names_model_delete(source,
- iterator,
- position,
- length);
- break;
- } else {
- position -= this_length + 1;
- }
- }
- if (iterator)
- gtk_object_unref(GTK_OBJECT(iterator));
-}
-
-static void
-e_select_names_text_model_model_changed (ESelectNamesModel *source,
- ESelectNamesTextModel *model)
-{
- EList *list = e_select_names_model_get_data(source);
- EIterator *iterator = e_list_get_iterator(list);
- int length = 0;
- int length_count = 0;
- int *lengthsp;
- char *string;
- char *stringp;
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ESelectNamesModelData *data = e_iterator_get(iterator);
- length += strlen(data->string);
- length ++;
- length_count++;
- }
- if (length > 0)
- length --;
-
- g_free(model->lengths);
- model->lengths = g_new(int, length_count + 1);
- lengthsp = model->lengths;
-
- string = g_new(char, length + 1);
- stringp = string;
- *stringp = 0;
- for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
- const ESelectNamesModelData *data = e_iterator_get(iterator);
- int this_length;
-
- strcpy(stringp, data->string);
- this_length = strlen(stringp);
- stringp += this_length;
- *(stringp++) = ',';
- *(lengthsp++) = this_length;
- }
- if (stringp != string) {
- stringp --;
- *stringp = 0;
- }
- *lengthsp = -1;
- g_free(E_TEXT_MODEL(model)->text);
- E_TEXT_MODEL(model)->text = string;
- e_text_model_changed(E_TEXT_MODEL(model));
-}
-
-
-static void
-e_select_names_text_model_add_source (ESelectNamesTextModel *model,
- ESelectNamesModel *source)
-{
- model->source = source;
- if (model->source)
- gtk_object_ref(GTK_OBJECT(model->source));
- model->source_changed_id = gtk_signal_connect(GTK_OBJECT(model->source), "changed",
- GTK_SIGNAL_FUNC(e_select_names_text_model_model_changed),
- model);
-}
-
-static void
-e_select_names_text_model_drop_source (ESelectNamesTextModel *model)
-{
- if (model->source_changed_id)
- gtk_signal_disconnect(GTK_OBJECT(model->source), model->source_changed_id);
- if (model->source)
- gtk_object_unref(GTK_OBJECT(model->source));
- model->source = NULL;
- model->source_changed_id = 0;
-}
-
-/*
- * ESelectNamesTextModel lifecycle management and vcard loading/saving.
- */
-
-static void
-e_select_names_text_model_destroy (GtkObject *object)
-{
- ESelectNamesTextModel *model;
-
- model = E_SELECT_NAMES_TEXT_MODEL (object);
-
- e_select_names_text_model_drop_source(model);
- g_free(model->lengths);
-
- if (GTK_OBJECT_CLASS(parent_class)->destroy)
- GTK_OBJECT_CLASS(parent_class)->destroy(object);
-}
-
-
-/* Set_arg handler for the model */
-static void
-e_select_names_text_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ESelectNamesTextModel *model;
-
- model = E_SELECT_NAMES_TEXT_MODEL (object);
-
- switch (arg_id) {
- case ARG_SOURCE:
- e_select_names_text_model_drop_source(model);
- e_select_names_text_model_add_source(model, E_SELECT_NAMES_MODEL(GTK_VALUE_OBJECT(*arg)));
- break;
- default:
- return;
- }
-}
-
-/* Get_arg handler for the model */
-static void
-e_select_names_text_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ESelectNamesTextModel *model;
-
- model = E_SELECT_NAMES_TEXT_MODEL (object);
-
- switch (arg_id) {
- case ARG_SOURCE:
- GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(model->source);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-/**
- * e_select_names_text_model_init:
- */
-static void
-e_select_names_text_model_init (ESelectNamesTextModel *model)
-{
- model->source = NULL;
- model->source_changed_id = 0;
- model->lengths = NULL;
-}
-
diff --git a/addressbook/gui/component/select-names/e-select-names-text-model.h b/addressbook/gui/component/select-names/e-select-names-text-model.h
deleted file mode 100644
index aa23544251..0000000000
--- a/addressbook/gui/component/select-names/e-select-names-text-model.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#ifndef __E_SELECT_NAMES_TEXT_MODEL_H__
-#define __E_SELECT_NAMES_TEXT_MODEL_H__
-
-#include <time.h>
-#include <gtk/gtk.h>
-#include <stdio.h>
-#include "e-select-names-model.h"
-#include <widgets/e-text/e-text-model.h>
-
-#define E_TYPE_SELECT_NAMES_TEXT_MODEL (e_select_names_text_model_get_type ())
-#define E_SELECT_NAMES_TEXT_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_TEXT_MODEL, ESelectNamesTextModel))
-#define E_SELECT_NAMES_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_TEXT_MODEL, ESelectNamesTextModelClass))
-#define E_IS_SELECT_NAMES_TEXT_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_TEXT_MODEL))
-#define E_IS_SELECT_NAMES_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_TEXT_MODEL))
-
-typedef struct _ESelectNamesTextModel ESelectNamesTextModel;
-typedef struct _ESelectNamesTextModelClass ESelectNamesTextModelClass;
-
-struct _ESelectNamesTextModel {
- ETextModel parent;
-
- ESelectNamesModel *source;
- int source_changed_id;
- int *lengths;
-};
-
-struct _ESelectNamesTextModelClass {
- ETextModelClass parent_class;
-};
-
-ETextModel *e_select_names_text_model_new (ESelectNamesModel *source);
-
-/* Standard Gtk function */
-GtkType e_select_names_text_model_get_type (void);
-
-#endif /* ! __E_SELECT_NAMES_TEXT_MODEL_H__ */
diff --git a/addressbook/gui/component/select-names/e-select-names.c b/addressbook/gui/component/select-names/e-select-names.c
deleted file mode 100644
index 2303f13ad1..0000000000
--- a/addressbook/gui/component/select-names/e-select-names.c
+++ /dev/null
@@ -1,424 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-select-names.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-select-names.h"
-#include <e-table-simple.h>
-#include <e-cell-text.h>
-#include <addressbook/gui/component/e-addressbook-model.h>
-#include <addressbook/gui/component/e-cardlist-model.h>
-#include <addressbook/backend/ebook/e-book.h>
-#include "e-select-names-table-model.h"
-
-static void e_select_names_init (ESelectNames *card);
-static void e_select_names_class_init (ESelectNamesClass *klass);
-static void e_select_names_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_select_names_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_select_names_destroy (GtkObject *object);
-
-static GnomeDialogClass *parent_class = NULL;
-#define PARENT_TYPE gnome_dialog_get_type()
-
-/* The arguments we take */
-enum {
- ARG_0,
-};
-
-typedef struct {
- char *title;
- ETableModel *model;
- ESelectNamesModel *source;
- ESelectNames *names;
-} ESelectNamesChild;
-
-GtkType
-e_select_names_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type) {
- static const GtkTypeInfo info =
- {
- "ESelectNames",
- sizeof (ESelectNames),
- sizeof (ESelectNamesClass),
- (GtkClassInitFunc) e_select_names_class_init,
- (GtkObjectInitFunc) e_select_names_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-static void
-e_select_names_class_init (ESelectNamesClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass*) klass;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->set_arg = e_select_names_set_arg;
- object_class->get_arg = e_select_names_get_arg;
- object_class->destroy = e_select_names_destroy;
-}
-
-#define SPEC "<ETableSpecification no-header=\"1\"> \
- <columns-shown> \
- <column> 2 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-#define SPEC2 "<ETableSpecification no-header=\"1\"> \
- <columns-shown> \
- <column> 0 </column> \
- </columns-shown> \
- <grouping> </grouping> \
-</ETableSpecification>"
-
-GtkWidget *e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int num1, int num2);
-
-static void
-set_book(EBook *book, EBookStatus status, ETableModel *model)
-{
- gtk_object_set(GTK_OBJECT(model),
- "book", book,
- "query", "(contains \"email\" \"\")",
- NULL);
- gtk_object_unref(GTK_OBJECT(book));
-}
-
-GtkWidget *
-e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int num1, int num2)
-{
- ETableModel *model;
- ETableHeader *header;
- ECell *cell_left_just;
- EBook *book;
- GtkWidget *table;
- char *filename;
- char *uri;
-
- model = e_addressbook_model_new();
- gtk_object_set(GTK_OBJECT(model),
- "editable", FALSE,
- NULL);
- cell_left_just = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
-
- header = e_table_header_new ();
- e_table_header_add_column (header, e_table_col_new (0, "Full Name", 1.0, 20, cell_left_just,
- g_str_compare, TRUE), -1);
- e_table_header_add_column (header, e_table_col_new (1, "Email", 1.0, 20, cell_left_just,
- g_str_compare, TRUE), -1);
- e_table_header_add_column (header, e_table_col_new (34, "Name", 1.0, 20, cell_left_just,
- g_str_compare, TRUE), -1);
-
- book = e_book_new();
- gtk_object_ref(GTK_OBJECT(model));
- gtk_object_ref(GTK_OBJECT(book));
- filename = gnome_util_prepend_user_home("evolution/local/Contacts/addressbook.db");
- uri = g_strdup_printf("file://%s", filename);
- e_book_load_uri(book, uri, (EBookCallback) set_book, model);
- g_free(uri);
- g_free(filename);
- table = e_table_scrolled_new (header, model, SPEC);
-
- gtk_object_set(GTK_OBJECT(table),
- "cursor_mode", E_TABLE_CURSOR_LINE,
- NULL);
-
- gtk_object_set_data(GTK_OBJECT(table), "model", model);
- return table;
-}
-
-static void
-set_current_selection(ETableScrolled *table, int row, ESelectNames *names)
-{
- names->currently_selected = row;
-}
-
-static void
-e_select_names_init (ESelectNames *e_select_names)
-{
- GladeXML *gui;
- GtkWidget *widget;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/select-names.glade", NULL);
- e_select_names->gui = gui;
-
- e_select_names->children = g_hash_table_new(g_str_hash, g_str_equal);
- e_select_names->child_count = 0;
-
- widget = glade_xml_get_widget(gui, "table-top");
- if (!widget) {
- return;
- }
- gtk_widget_ref(widget);
- gtk_widget_unparent(widget);
- gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(e_select_names)->vbox), widget, TRUE, TRUE, 0);
- gtk_widget_unref(widget);
-
- gnome_dialog_append_buttons(GNOME_DIALOG(e_select_names),
- GNOME_STOCK_BUTTON_OK,
- GNOME_STOCK_BUTTON_CANCEL,
- NULL);
-
- gtk_window_set_policy(GTK_WINDOW(e_select_names), FALSE, TRUE, FALSE);
-
- e_select_names->table = E_TABLE_SCROLLED(glade_xml_get_widget(gui, "table-source"));
- e_select_names->model = gtk_object_get_data(GTK_OBJECT(e_select_names->table), "model");
-
- e_select_names->currently_selected = -1;
-
- gtk_signal_connect(GTK_OBJECT(e_select_names->table), "cursor_change",
- GTK_SIGNAL_FUNC(set_current_selection), e_select_names);
-}
-
-static void e_select_names_child_free(char *key, ESelectNamesChild *child, ESelectNames *e_select_names)
-{
- g_free(child->title);
- gtk_object_unref(GTK_OBJECT(child->model));
- gtk_object_unref(GTK_OBJECT(child->source));
- g_free(key);
-}
-
-static void
-e_select_names_destroy (GtkObject *object) {
- ESelectNames *e_select_names = E_SELECT_NAMES(object);
-
- gtk_object_unref(GTK_OBJECT(e_select_names->gui));
- g_hash_table_foreach(e_select_names->children, (GHFunc) e_select_names_child_free, e_select_names);
- g_hash_table_destroy(e_select_names->children);
-}
-
-GtkWidget*
-e_select_names_new (void)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_select_names_get_type ()));
- return widget;
-}
-
-static void
-e_select_names_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ESelectNames *editor;
-
- editor = E_SELECT_NAMES (o);
-
- switch (arg_id){
- default:
- return;
- }
-}
-
-static void
-e_select_names_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ESelectNames *e_select_names;
-
- e_select_names = E_SELECT_NAMES (object);
-
- switch (arg_id) {
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-button_clicked(GtkWidget *button, ESelectNamesChild *child)
-{
- ESelectNames *names = child->names;
- int row = names->currently_selected;
- if (row != -1) {
- ECard *card = e_addressbook_model_get_card(E_ADDRESSBOOK_MODEL(names->model), row);
- ESelectNamesModelData new = {E_SELECT_NAMES_MODEL_DATA_TYPE_CARD,
- card,
- NULL};
- char *name, *email;
- ECardSimple *simple = e_card_simple_new(card);
- EIterator *iterator;
-
- name = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FULL_NAME);
- email = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_EMAIL);
- if (name && *name && email && *email) {
- new.string = g_strdup_printf("%s <%s>", name, email);
- } else if (email && *email) {
- new.string = g_strdup_printf("%s", email);
- } else if (name && *name) {
- new.string = g_strdup_printf("%s <>", name);
- } else {
- new.string = g_strdup("");
- }
-
- iterator = e_list_get_iterator(e_select_names_model_get_data(child->source));
- e_iterator_last(iterator);
- e_select_names_model_add_item(child->source, iterator, &new);
-
- gtk_object_unref(GTK_OBJECT(simple));
- gtk_object_unref(GTK_OBJECT(card));
- g_free(email);
- g_free(name);
- g_free(new.string);
- }
-}
-
-static void
-remove_address(ETableScrolled *table, int row, ESelectNamesChild *child)
-{
- EIterator *iterator = e_list_get_iterator(e_select_names_model_get_data(child->source));
- e_iterator_reset(iterator);
- for (; row > 0; row--) {
- e_iterator_next(iterator);
- }
- e_select_names_model_remove_item(child->source, iterator);
-}
-
-void
-e_select_names_add_section(ESelectNames *e_select_names, char *name, char *id, ESelectNamesModel *source)
-{
- ESelectNamesChild *child;
- GtkWidget *button;
- GtkWidget *alignment;
- GtkTable *table;
- char *label;
-
- ETableModel *model;
- GtkWidget *etable;
- ETableHeader *header;
- ECell *cell_left_just;
-
- if (g_hash_table_lookup(e_select_names->children, id)) {
- return;
- }
-
- table = GTK_TABLE(glade_xml_get_widget (e_select_names->gui, "table-recipients"));
-
- child = g_new(ESelectNamesChild, 1);
-
- child->names = e_select_names;
- child->title = g_strdup(_(name));
-
- e_select_names->child_count++;
-
- alignment = gtk_alignment_new(0, 0, 1, 0);
- label = g_strdup_printf("%s ->", child->title);
- button = gtk_button_new_with_label(label);
- g_free(label);
- gtk_container_add(GTK_CONTAINER(alignment), button);
- gtk_widget_show_all(alignment);
- gtk_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(button_clicked), child);
- gtk_table_attach(table, alignment,
- 0, 1,
- e_select_names->child_count,
- e_select_names->child_count + 1,
- GTK_FILL, GTK_FILL,
- 0, 0);
-
- model = e_select_names_table_model_new(source);
- header = e_table_header_new ();
- cell_left_just = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
- e_table_header_add_column (header, e_table_col_new (0, "Name", 1.0, 20, cell_left_just,
- g_str_compare, TRUE), -1);
- e_table_header_add_column (header, e_table_col_new (1, "Email", 1.0, 20, cell_left_just,
- g_str_compare, TRUE), -1);
- etable = e_table_scrolled_new (header, model, SPEC2);
-
- gtk_signal_connect(GTK_OBJECT(etable), "double_click",
- GTK_SIGNAL_FUNC(remove_address), child);
-
- gtk_object_set(GTK_OBJECT(etable),
- "cursor_mode", E_TABLE_CURSOR_LINE,
- NULL);
-
- child->model = model;
- child->source = source;
- gtk_object_ref(GTK_OBJECT(child->model));
- gtk_object_ref(GTK_OBJECT(child->source));
-
- gtk_widget_show(etable);
-
- gtk_table_attach(table, etable,
- 1, 2,
- e_select_names->child_count,
- e_select_names->child_count + 1,
- GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
- 0, 0);
-
- g_hash_table_insert(e_select_names->children, g_strdup(id), child);
-}
-
-static void *
-card_copy(const void *value, void *closure)
-{
- gtk_object_ref(GTK_OBJECT(value));
- return (void *)value;
-}
-
-static void
-card_free(void *value, void *closure)
-{
- gtk_object_unref(GTK_OBJECT(value));
-}
-
-EList *
-e_select_names_get_section(ESelectNames *e_select_names, char *id)
-{
- ESelectNamesChild *child;
- int i;
- int rows;
- EList *list;
-
- child = g_hash_table_lookup(e_select_names->children, id);
- if (!child)
- return NULL;
- rows = e_table_model_row_count(child->model);
-
- list = e_list_new(card_copy, card_free, NULL);
- for (i = 0; i < rows; i++) {
- ECard *card = e_cardlist_model_get(E_CARDLIST_MODEL(child->model), i);
- e_list_append(list, card);
- gtk_object_unref(GTK_OBJECT(card));
- }
- return list;
-}
-
-ESelectNamesModel *
-e_select_names_get_source(ESelectNames *e_select_names,
- char *id)
-{
- ESelectNamesChild *child = g_hash_table_lookup(e_select_names->children, id);
- if (child) {
- if (child->source)
- gtk_object_ref(GTK_OBJECT(child->source));
- return child->source;
- } else
- return NULL;
-}
diff --git a/addressbook/gui/component/select-names/e-select-names.h b/addressbook/gui/component/select-names/e-select-names.h
deleted file mode 100644
index b1c11eb473..0000000000
--- a/addressbook/gui/component/select-names/e-select-names.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-select-names.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_SELECT_NAMES_H__
-#define __E_SELECT_NAMES_H__
-
-#include <gnome.h>
-#include <glade/glade.h>
-#include <e-util/e-list.h>
-#include <widgets/e-table/e-table.h>
-#include <widgets/e-table/e-table-scrolled.h>
-#include "e-select-names-model.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ESelectNames - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- */
-
-#define E_SELECT_NAMES_TYPE (e_select_names_get_type ())
-#define E_SELECT_NAMES(obj) (GTK_CHECK_CAST ((obj), E_SELECT_NAMES_TYPE, ESelectNames))
-#define E_SELECT_NAMES_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_SELECT_NAMES_TYPE, ESelectNamesClass))
-#define E_IS_SELECT_NAMES(obj) (GTK_CHECK_TYPE ((obj), E_SELECT_NAMES_TYPE))
-#define E_IS_SELECT_NAMES_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_SELECT_NAMES_TYPE))
-
-typedef struct _ESelectNames ESelectNames;
-typedef struct _ESelectNamesClass ESelectNamesClass;
-
-struct _ESelectNames
-{
- GnomeDialog parent;
-
- /* item specific fields */
- GladeXML *gui;
-
- GHashTable *children; /* Of type char * to ESelectNamesChild */
- int child_count;
- ETableScrolled *table;
- ETableModel *model;
- int currently_selected;
-};
-
-struct _ESelectNamesClass
-{
- GnomeDialogClass parent_class;
-};
-
-
-GtkWidget *e_select_names_new (void);
-GtkType e_select_names_get_type (void);
-
-void e_select_names_add_section (ESelectNames *e_select_names,
- char *name,
- char *id,
- ESelectNamesModel *source);
-ESelectNamesModel *e_select_names_get_source (ESelectNames *e_select_names,
- char *id);
-/* Returns a ref counted list of addresses. */
-EList *e_select_names_get_section (ESelectNames *e_select_names,
- char *id);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_SELECT_NAMES_H__ */
diff --git a/addressbook/gui/component/select-names/evolution-addressbook-select-names.oafinfo b/addressbook/gui/component/select-names/evolution-addressbook-select-names.oafinfo
deleted file mode 100644
index e66c3aa38a..0000000000
--- a/addressbook/gui/component/select-names/evolution-addressbook-select-names.oafinfo
+++ /dev/null
@@ -1,29 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:factory:addressbook:select-names:b39eb1a1-f341-4d5a-9a91-e2616e206b2e"
- type="exe"
- location="evolution-addressbook">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Addressbook's name selection interface"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:addressbook:select-names:39301deb-174b-40d1-8a6e-5edc300f7b61"
- type="factory"
- location="OAFIID:factory:addressbook:select-names:b39eb1a1-f341-4d5a-9a91-e2616e206b2e">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/Addressbook/SelectNames"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution's addressbook name selection interface."/>
-
-</oaf_server>
-
-</oaf_info> \ No newline at end of file
diff --git a/addressbook/gui/component/select-names/recipient.glade b/addressbook/gui/component/select-names/recipient.glade
deleted file mode 100644
index b60972d094..0000000000
--- a/addressbook/gui/component/select-names/recipient.glade
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Recipient</name>
- <program_name>recipient</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <gnome_help_support>True</gnome_help_support>
-</project>
-
-<widget>
- <class>GtkWindow</class>
- <name>window1</name>
- <visible>False</visible>
- <title>window1</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox-top</name>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment1</name>
- <xalign>1.08033e-07</xalign>
- <yalign>0</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>text-button</name>
- <can_focus>True</can_focus>
- <label>-&gt;</label>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/gui/component/select-names/select-names.glade b/addressbook/gui/component/select-names/select-names.glade
deleted file mode 100644
index 90ca93bd3a..0000000000
--- a/addressbook/gui/component/select-names/select-names.glade
+++ /dev/null
@@ -1,247 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Select-names</name>
- <program_name>select-names</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>select-names.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog-top</name>
- <visible>False</visible>
- <title>Select Names</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table-top</name>
- <rows>3</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>6</row_spacing>
- <column_spacing>6</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-find</name>
- <visible>False</visible>
- <can_focus>True</can_focus>
- <has_focus>True</has_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-find</name>
- <visible>False</visible>
- <can_focus>True</can_focus>
- <label>Find...</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel1</name>
- <label>Select name from List:</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>table-source</name>
- <creation_function>e_addressbook_create_ebook_table</creation_function>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Sat, 10 Jun 2000 22:02:57 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table-recipients</name>
- <rows>1</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel2</name>
- <label>Message Recipients</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/gui/component/select-names/select-names.glade.h b/addressbook/gui/component/select-names/select-names.glade.h
deleted file mode 100644
index 1cb9702956..0000000000
--- a/addressbook/gui/component/select-names/select-names.glade.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Select Names");
-gchar *s = N_("Find...");
-gchar *s = N_("Select name from List:");
-gchar *s = N_("Message Recipients");
diff --git a/addressbook/gui/contact-editor/.cvsignore b/addressbook/gui/contact-editor/.cvsignore
deleted file mode 100644
index 6fd0b5075c..0000000000
--- a/addressbook/gui/contact-editor/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-contact-editor-test
diff --git a/addressbook/gui/contact-editor/Makefile.am b/addressbook/gui/contact-editor/Makefile.am
deleted file mode 100644
index f51a0109ac..0000000000
--- a/addressbook/gui/contact-editor/Makefile.am
+++ /dev/null
@@ -1,65 +0,0 @@
-CPPFLAGS = \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DDATADIR=\""$(datadir)"\" \
- -DEVOLUTIONDIR=\""$(evolutiondir)"\"
-
-INCLUDES = \
- $(BONOBO_GNOME_CFLAGS) \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook/ \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_srcdir)/widgets/e-table \
- -DG_LOG_DOMAIN=\"contact-editor\"
-
-noinst_LIBRARIES = \
- libecontacteditor.a
-
-libecontacteditor_a_SOURCES = \
- e-contact-editor-categories.c \
- e-contact-editor-categories.h \
- e-contact-editor-fullname.c \
- e-contact-editor-fullname.h \
- e-contact-editor.c \
- e-contact-editor.h \
- e-contact-save-as.c \
- e-contact-save-as.h
-
-noinst_PROGRAMS = \
- contact-editor-test
-
-contact_editor_test_SOURCES = \
- test-editor.c
-
-contact_editor_test_LDADD = \
- libecontacteditor.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/libversit/libversit.la \
- $(GNOMEGNORBA_LIBS) \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(EXTRA_GNOME_LIBS)
-
-evolutiondir = $(datadir)/evolution
-
-evolution_DATA = arrow.png
-
-gladedir = $(datadir)/evolution/glade
-
-glade_DATA = \
- contact-editor.glade \
- fullname.glade \
- categories.glade \
- e-contact-editor-confirm-delete.glade
-
-EXTRA_DIST = $(evolution_DATA) \
- $(glade_DATA) \
- e-contact-editor-strings.h \
- fullname-strings.h \
- categories-strings.h \
- e-contact-editor-confirm-delete.glade.h
diff --git a/addressbook/gui/contact-editor/arrow.png b/addressbook/gui/contact-editor/arrow.png
deleted file mode 100644
index b102356c78..0000000000
--- a/addressbook/gui/contact-editor/arrow.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/gui/contact-editor/briefcase.png b/addressbook/gui/contact-editor/briefcase.png
deleted file mode 100644
index dd59b8fd39..0000000000
--- a/addressbook/gui/contact-editor/briefcase.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/gui/contact-editor/categories-strings.h b/addressbook/gui/contact-editor/categories-strings.h
deleted file mode 100644
index 813018a00e..0000000000
--- a/addressbook/gui/contact-editor/categories-strings.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("categories");
-gchar *s = N_("Item(s) belong to these categories:");
-gchar *s = N_("Available Categories:");
diff --git a/addressbook/gui/contact-editor/categories.glade b/addressbook/gui/contact-editor/categories.glade
deleted file mode 100644
index bf78008940..0000000000
--- a/addressbook/gui/contact-editor/categories.glade
+++ /dev/null
@@ -1,190 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>categories</name>
- <program_name>categories</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>False</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>False</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>categories-strings.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>categories</name>
- <cxx_use_heap>True</cxx_use_heap>
- <visible>False</visible>
- <title>categories</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table-categories</name>
- <cxx_use_heap>True</cxx_use_heap>
- <rows>4</rows>
- <columns>1</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>0</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Item(s) belong to these categories:</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel2</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Available Categories:</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-categories</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/gui/contact-editor/contact-editor.glade b/addressbook/gui/contact-editor/contact-editor.glade
deleted file mode 100644
index 7c328a72ce..0000000000
--- a/addressbook/gui/contact-editor/contact-editor.glade
+++ /dev/null
@@ -1,2332 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Contact-editor</name>
- <program_name>contact-editor</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>False</backup_source_files>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-contact-editor-strings.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog2</name>
- <border_width>2</border_width>
- <visible>False</visible>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area2</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button28</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button29</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button30</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table2</name>
- <rows>2</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>2</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry2</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>0</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>2</spacing>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button31</name>
- <border_width>2</border_width>
- <can_focus>True</can_focus>
- <label>_Add</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button32</name>
- <border_width>2</border_width>
- <can_focus>True</can_focus>
- <label>_Delete</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <height>200</height>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>clist1</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>True</show_titles>
- <shadow_type>GTK_SHADOW_NONE</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label20</name>
- <label>Phone Types</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog-add-phone</name>
- <visible>False</visible>
- <title>New phone type</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>vbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>hbuttonbox1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button43</name>
- <can_default>True</can_default>
- <has_default>True</has_default>
- <can_focus>True</can_focus>
- <label>Add</label>
- <stock_pixmap>GNOME_STOCK_PIXMAP_ADD</stock_pixmap>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button44</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame-add-phone</name>
- <border_width>4</border_width>
- <label>New phone type</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment9</name>
- <border_width>9</border_width>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>1</yscale>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-add-phone</name>
- <can_focus>True</can_focus>
- <has_focus>True</has_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-<widget>
- <class>GnomeApp</class>
- <name>contact editor</name>
- <title>Contact Editor</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <enable_layout_config>True</enable_layout_config>
-
- <widget>
- <class>GnomeDock</class>
- <child_name>GnomeApp:dock</child_name>
- <name>dock1</name>
- <allow_floating>True</allow_floating>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkNotebook</class>
- <child_name>GnomeDock:contents</child_name>
- <name>notebook-contact-editor</name>
- <can_focus>True</can_focus>
- <show_tabs>True</show_tabs>
- <show_border>True</show_border>
- <tab_pos>GTK_POS_TOP</tab_pos>
- <scrollable>False</scrollable>
- <tab_hborder>2</tab_hborder>
- <tab_vborder>2</tab_vborder>
- <popup_enable>False</popup_enable>
-
- <widget>
- <class>GtkTable</class>
- <name>table-contact-editor-general</name>
- <border_width>7</border_width>
- <rows>14</rows>
- <columns>8</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-phone1</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-phone2</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-phone3</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-phone4</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkText</class>
- <name>text-address</name>
- <width>1</width>
- <height>1</height>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text></text>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>9</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-fullname</name>
- <can_focus>True</can_focus>
- <label>_Full Name...</label>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel-fileas</name>
- <label>File As:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel-web</name>
- <label>Web page address:</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>8</top_attach>
- <bottom_attach>9</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment3</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>1</yscale>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-email1</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment5</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-phone4</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment7</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-phone2</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment8</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-phone1</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator4</name>
- <child>
- <left_attach>4</left_attach>
- <right_attach>8</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment6</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-phone3</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-fullname</name>
- <has_default>True</has_default>
- <can_focus>True</can_focus>
- <has_focus>True</has_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-jobtitle</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-company</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-email1</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-web</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>8</top_attach>
- <bottom_attach>9</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator5</name>
- <child>
- <left_attach>0</left_attach>
- <right_attach>4</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo-file-as</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>True</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items></items>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>entry-file-as</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator6</name>
- <child>
- <left_attach>0</left_attach>
- <right_attach>4</right_attach>
- <top_attach>7</top_attach>
- <bottom_attach>8</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment10</name>
- <xalign>0.5</xalign>
- <yalign>0</yalign>
- <xscale>1</xscale>
- <yscale>1</yscale>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>6</top_attach>
- <bottom_attach>7</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>True</xshrink>
- <yshrink>True</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton-htmlmail</name>
- <visible>False</visible>
- <label>Wants to receive _HTML mail</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment4</name>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-address</name>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>address-label</name>
- <label>Address:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>text-address</focus_target>
- <child>
- <left_attach>5</left_attach>
- <right_attach>7</right_attach>
- <top_attach>6</top_attach>
- <bottom_attach>7</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox1</name>
- <child>
- <left_attach>5</left_attach>
- <right_attach>6</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone1</name>
- <label>_Business</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox2</name>
- <child>
- <left_attach>5</left_attach>
- <right_attach>6</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone2</name>
- <label>_Home</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-phone2</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox3</name>
- <child>
- <left_attach>5</left_attach>
- <right_attach>6</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone3</name>
- <label>Business _Fax</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-phone3</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox4</name>
- <child>
- <left_attach>5</left_attach>
- <right_attach>6</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone4</name>
- <label>_Mobile</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-phone4</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox5</name>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-email1</name>
- <label>Primary Email</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-email1</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox-business</name>
- <child>
- <left_attach>5</left_attach>
- <right_attach>6</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-address</name>
- <label>B_usiness</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>text-address</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment2</name>
- <xalign>0</xalign>
- <yalign>0</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>9</top_attach>
- <bottom_attach>10</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton-mailingaddress</name>
- <visible>False</visible>
- <label>_This is the mailing address</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator9</name>
- <child>
- <left_attach>0</left_attach>
- <right_attach>4</right_attach>
- <top_attach>11</top_attach>
- <bottom_attach>12</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator10</name>
- <child>
- <left_attach>4</left_attach>
- <right_attach>8</right_attach>
- <top_attach>11</top_attach>
- <bottom_attach>12</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment-contacts</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>13</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-contacts</name>
- <can_focus>True</can_focus>
- <label>C_ontacts...</label>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment15</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>13</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-categories</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment14</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>13</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-contacts</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment16</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>5</left_attach>
- <right_attach>7</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>13</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button-categories</name>
- <can_focus>True</can_focus>
- <label>Ca_tegories...</label>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEventBox</class>
- <name>eventbox7</name>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label34</name>
- <label>_Job title:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-jobtitle</focus_target>
- </widget>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom1</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>malehead.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:19:47 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom2</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>cellphone.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:02 GMT</last_modification_time>
- <child>
- <left_attach>4</left_attach>
- <right_attach>5</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom3</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>envelope.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:19:51 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>7</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom4</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>house.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:06 GMT</last_modification_time>
- <child>
- <left_attach>4</left_attach>
- <right_attach>5</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>10</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom5</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>evolution-contacts.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:19:59 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>14</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom6</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>briefcase.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:09 GMT</last_modification_time>
- <child>
- <left_attach>4</left_attach>
- <right_attach>5</right_attach>
- <top_attach>12</top_attach>
- <bottom_attach>14</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom10</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>globe.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:19:56 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>8</top_attach>
- <bottom_attach>10</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label35</name>
- <label>_Company:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-company</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label15</name>
- <label>General</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table-contact-editor-details</name>
- <border_width>7</border_width>
- <rows>9</rows>
- <columns>6</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
-
- <widget>
- <class>GtkLabel</class>
- <name>label21</name>
- <label>_Department:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-department</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label22</name>
- <label>_Office:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-office</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label23</name>
- <label>_Profession:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-profession</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label24</name>
- <label>_Nickname:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-nickname</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label25</name>
- <label>_Spouse:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-spouse</focus_target>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label31</name>
- <label>_Birthday:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label30</name>
- <label>_Assistant's name:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-assistant</focus_target>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label29</name>
- <label>_Manager's Name:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>entry-manager</focus_target>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label32</name>
- <label>Anni_versary:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-spouse</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-department</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-office</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-profession</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-nickname</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GnomeDateEdit</class>
- <name>dateedit-anniversary</name>
- <show_time>False</show_time>
- <use_24_format>False</use_24_format>
- <week_start_monday>False</week_start_monday>
- <lower_hour>7</lower_hour>
- <upper_hour>19</upper_hour>
- <child>
- <left_attach>4</left_attach>
- <right_attach>6</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GnomeDateEdit</class>
- <name>dateedit-birthday</name>
- <show_time>False</show_time>
- <use_24_format>False</use_24_format>
- <week_start_monday>False</week_start_monday>
- <lower_hour>7</lower_hour>
- <upper_hour>19</upper_hour>
- <child>
- <left_attach>4</left_attach>
- <right_attach>6</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-assistant</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>4</left_attach>
- <right_attach>6</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-manager</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>4</left_attach>
- <right_attach>6</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator7</name>
- <child>
- <left_attach>0</left_attach>
- <right_attach>6</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label33</name>
- <label>No_tes:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>7</top_attach>
- <bottom_attach>8</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator8</name>
- <child>
- <left_attach>0</left_attach>
- <right_attach>6</right_attach>
- <top_attach>6</top_attach>
- <bottom_attach>7</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom7</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>briefcase.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:13 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom8</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>malehead.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:16 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow2</name>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <left_attach>1</left_attach>
- <right_attach>6</right_attach>
- <top_attach>8</top_attach>
- <bottom_attach>9</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkText</class>
- <name>text-comments</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>custom9</name>
- <creation_function>e_create_image_widget</creation_function>
- <string1>globe.png</string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 18 May 2000 12:20:19 GMT</last_modification_time>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>7</top_attach>
- <bottom_attach>9</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label16</name>
- <label>Details</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GnomeAppBar</class>
- <child_name>GnomeApp:appbar</child_name>
- <name>appbar1</name>
- <has_progress>True</has_progress>
- <has_status>True</has_status>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/gui/contact-editor/e-contact-editor-categories.c b/addressbook/gui/contact-editor/e-contact-editor-categories.c
deleted file mode 100644
index 9251a86948..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-categories.c
+++ /dev/null
@@ -1,470 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-editor-categories.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-contact-editor-categories.h>
-#include <e-table-scrolled.h>
-#include <e-table.h>
-#include <e-table-simple.h>
-#include <e-cell-text.h>
-#include <e-cell-checkbox.h>
-
-static void e_contact_editor_categories_init (EContactEditorCategories *card);
-static void e_contact_editor_categories_class_init (EContactEditorCategoriesClass *klass);
-static void e_contact_editor_categories_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_contact_editor_categories_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_contact_editor_categories_destroy (GtkObject *object);
-static int e_contact_editor_categories_col_count (ETableModel *etc, gpointer data);
-static int e_contact_editor_categories_row_count (ETableModel *etc, gpointer data);
-static void *e_contact_editor_categories_value_at (ETableModel *etc, int col, int row, gpointer data);
-static void e_contact_editor_categories_set_value_at (ETableModel *etc, int col, int row, const void *val, gpointer data);
-static gboolean e_contact_editor_categories_is_cell_editable (ETableModel *etc, int col, int row, gpointer data);
-static void *e_contact_editor_categories_duplicate_value (ETableModel *etc, int col, const void *value, gpointer data);
-static void e_contact_editor_categories_free_value (ETableModel *etc, int col, void *value, gpointer data);
-static void *e_contact_editor_categories_initialize_value (ETableModel *etc, int col, gpointer data);
-static gboolean e_contact_editor_categories_value_is_empty (ETableModel *etc, int col, const void *value, gpointer data);
-static char * e_contact_editor_categories_value_to_string (ETableModel *etc, int col, const void *value, gpointer data);
-
-static GnomeDialogClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_CATEGORIES
-};
-
-GtkType
-e_contact_editor_categories_get_type (void)
-{
- static GtkType contact_editor_categories_type = 0;
-
- if (!contact_editor_categories_type)
- {
- static const GtkTypeInfo contact_editor_categories_info =
- {
- "EContactEditorCategories",
- sizeof (EContactEditorCategories),
- sizeof (EContactEditorCategoriesClass),
- (GtkClassInitFunc) e_contact_editor_categories_class_init,
- (GtkObjectInitFunc) e_contact_editor_categories_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- contact_editor_categories_type = gtk_type_unique (gnome_dialog_get_type (), &contact_editor_categories_info);
- }
-
- return contact_editor_categories_type;
-}
-
-static void
-e_contact_editor_categories_class_init (EContactEditorCategoriesClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeDialogClass *dialog_class;
-
- object_class = (GtkObjectClass*) klass;
- dialog_class = (GnomeDialogClass *) klass;
-
- parent_class = gtk_type_class (gnome_dialog_get_type ());
-
- gtk_object_add_arg_type ("EContactEditorCategories::categories", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_CATEGORIES);
-
- object_class->set_arg = e_contact_editor_categories_set_arg;
- object_class->get_arg = e_contact_editor_categories_get_arg;
- object_class->destroy = e_contact_editor_categories_destroy;
-}
-
-gchar *builtin_categories[] = {
- "Business",
- "Competition",
- "Favorites",
- "Gifts",
- "Goals/Objectives",
- "Holiday",
- "Holiday Cards",
- "Hot Contacts",
- "Ideas",
- "International",
- "Key Customer",
- "Miscellaneous",
- "Personal",
- "Phone Calls",
- "Status",
- "Strategies",
- "Suppliers",
- "Time & Expenses",
- "VIP",
- "Waiting",
-};
-
-#define BUILTIN_CATEGORY_COUNT (sizeof(builtin_categories) / sizeof(builtin_categories[0]))
-
-static void
-add_list_unique(EContactEditorCategories *categories, char *string)
-{
- int k;
- char *temp = e_strdup_strip(string);
- char **list = categories->category_list;
-
- if (!*temp) {
- g_free(temp);
- return;
- }
- for (k = 0; k < categories->list_length; k++) {
- if (!strcmp(list[k], temp)) {
- categories->selected_list[k] = TRUE;
- break;
- }
- }
- if (k == categories->list_length) {
- categories->selected_list[categories->list_length] = TRUE;
- list[categories->list_length++] = temp;
- } else {
- g_free(temp);
- }
-}
-
-static void
-do_parse_categories(EContactEditorCategories *categories)
-{
- char *str = categories->categories;
- int length = strlen(str);
- char *copy = g_new(char, length + 1);
- int i, j;
- char **list;
- int count = 1;
-
- e_table_model_pre_change(categories->model);
-
- for (i = 0; i < categories->list_length; i++)
- g_free(categories->category_list[i]);
- g_free(categories->category_list);
- g_free(categories->selected_list);
-
- for (i = 0; str[i]; i++) {
- switch (str[i]) {
- case '\\':
- i++;
- if (!str[i])
- i--;
- break;
- case ',':
- count ++;
- break;
- }
- }
- list = g_new(char *, count + 1 + BUILTIN_CATEGORY_COUNT);
- categories->category_list = list;
-
- categories->selected_list = g_new(gboolean, count + 1 + BUILTIN_CATEGORY_COUNT);
-
- for (count = 0; count < BUILTIN_CATEGORY_COUNT; count++) {
- list[count] = g_strdup(builtin_categories[count]);
- categories->selected_list[count] = 0;
- }
-
- categories->list_length = count;
-
- for (i = 0, j = 0; str[i]; i++, j++) {
- switch (str[i]) {
- case '\\':
- i++;
- if (str[i]) {
- copy[j] = str[i];
- } else
- i--;
- break;
- case ',':
- copy[j] = 0;
- add_list_unique(categories, copy);
- j = -1;
- break;
- default:
- copy[j] = str[i];
- break;
- }
- }
- copy[j] = 0;
- add_list_unique(categories, copy);
- g_free(copy);
- e_table_model_changed(categories->model);
-}
-
-static void
-e_contact_editor_categories_entry_change (GtkWidget *entry,
- EContactEditorCategories *categories)
-{
- g_free(categories->categories);
- categories->categories = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
- do_parse_categories(categories);
-}
-
-
-#define INITIAL_SPEC "<ETableSpecification no-header=\"1\"> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 1 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-static void
-e_contact_editor_categories_init (EContactEditorCategories *categories)
-{
- GladeXML *gui;
- GtkWidget *table;
- ECell *cell_left_just;
- ECell *cell_checkbox;
- ETableHeader *header;
- ETableCol *col;
- GtkWidget *e_table;
-
- categories->list_length = 0;
- categories->category_list = NULL;
- categories->selected_list = NULL;
- categories->categories = NULL;
-
- gnome_dialog_append_button ( GNOME_DIALOG(categories),
- GNOME_STOCK_BUTTON_OK);
-
- gnome_dialog_append_button ( GNOME_DIALOG(categories),
- GNOME_STOCK_BUTTON_CANCEL);
-
- gtk_window_set_policy(GTK_WINDOW(categories), FALSE, TRUE, FALSE);
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/categories.glade", NULL);
- categories->gui = gui;
-
- table = glade_xml_get_widget(gui, "table-categories");
- gtk_widget_ref(table);
- gtk_container_remove(GTK_CONTAINER(table->parent), table);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (categories)->vbox), table, TRUE, TRUE, 0);
- gtk_widget_unref(table);
-
- categories->entry = glade_xml_get_widget(gui, "entry-categories");
-
- gtk_signal_connect(GTK_OBJECT(categories->entry), "changed",
- GTK_SIGNAL_FUNC(e_contact_editor_categories_entry_change), categories);
-
- categories->model = e_table_simple_new(e_contact_editor_categories_col_count,
- e_contact_editor_categories_row_count,
- e_contact_editor_categories_value_at,
- e_contact_editor_categories_set_value_at,
- e_contact_editor_categories_is_cell_editable,
- e_contact_editor_categories_duplicate_value,
- e_contact_editor_categories_free_value,
- e_contact_editor_categories_initialize_value,
- e_contact_editor_categories_value_is_empty,
- e_contact_editor_categories_value_to_string,
- categories);
-
- header = e_table_header_new();
-
- cell_checkbox = e_cell_checkbox_new();
- col = e_table_col_new (0, "",
- 0, 20, cell_checkbox,
- g_int_compare, TRUE);
- e_table_header_add_column (header, col, 0);
-
- cell_left_just = e_cell_text_new (categories->model, NULL, GTK_JUSTIFY_LEFT);
- col = e_table_col_new (1, "Category",
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
- e_table_header_add_column (header, col, 1);
-
- e_table = e_table_scrolled_new (header, categories->model, INITIAL_SPEC);
-
- gtk_object_sink(GTK_OBJECT(categories->model));
-
- gtk_widget_show(e_table);
-
- gtk_table_attach_defaults(GTK_TABLE(table),
- e_table,
- 0, 1,
- 3, 4);
-}
-
-void
-e_contact_editor_categories_destroy (GtkObject *object)
-{
- EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(object);
- int i;
-
- if (categories->gui)
- gtk_object_unref(GTK_OBJECT(categories->gui));
-
- g_free(categories->categories);
- for (i = 0; i < categories->list_length; i++)
- g_free(categories->category_list[i]);
- g_free(categories->category_list);
- g_free(categories->selected_list);
-}
-
-GtkWidget*
-e_contact_editor_categories_new (char *categories)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_editor_categories_get_type ()));
- gtk_object_set (GTK_OBJECT(widget),
- "categories", categories,
- NULL);
- return widget;
-}
-
-static void
-e_contact_editor_categories_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EContactEditorCategories *e_contact_editor_categories;
-
- e_contact_editor_categories = E_CONTACT_EDITOR_CATEGORIES (o);
-
- switch (arg_id){
- case ARG_CATEGORIES:
- gtk_entry_set_text(GTK_ENTRY(e_contact_editor_categories->entry), GTK_VALUE_STRING (*arg));
- break;
- }
-}
-
-static void
-e_contact_editor_categories_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EContactEditorCategories *e_contact_editor_categories;
-
- e_contact_editor_categories = E_CONTACT_EDITOR_CATEGORIES (object);
-
- switch (arg_id) {
- case ARG_CATEGORIES:
- GTK_VALUE_STRING (*arg) = g_strdup(e_contact_editor_categories->categories);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-e_contact_editor_categories_col_count (ETableModel *etc, gpointer data)
-{
- return 2;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-e_contact_editor_categories_row_count (ETableModel *etc, gpointer data)
-{
- EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
- return categories->list_length;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-e_contact_editor_categories_value_at (ETableModel *etc, int col, int row, gpointer data)
-{
- EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
- if (col == 0)
- return (void *) categories->selected_list[row];
- else
- return categories->category_list[row];
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-e_contact_editor_categories_set_value_at (ETableModel *etc, int col, int row, const void *val, gpointer data)
-{
- EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
- if ( col == 0 ) {
- char **strs;
- int i, j;
- char *string;
- categories->selected_list[row] = (gboolean) val;
- strs = g_new(char *, categories->list_length + 1);
- for (i = 0, j = 0; i < categories->list_length; i++) {
- if (categories->selected_list[i])
- strs[j++] = categories->category_list[i];
- }
- strs[j] = 0;
- string = g_strjoinv(", ", strs);
- gtk_entry_set_text(GTK_ENTRY(categories->entry), string);
- g_free(string);
- g_free(strs);
- }
- if ( col == 1 )
- return;
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-e_contact_editor_categories_is_cell_editable (ETableModel *etc, int col, int row, gpointer data)
-{
- return col == 0;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-e_contact_editor_categories_duplicate_value (ETableModel *etc, int col, const void *value, gpointer data)
-{
- if (col == 0)
- return (void *)value;
- else
- return g_strdup(value);
-}
-
-/* This function frees the value passed to it. */
-static void
-e_contact_editor_categories_free_value (ETableModel *etc, int col, void *value, gpointer data)
-{
- if (col == 0)
- return;
- else
- g_free(value);
-}
-
-static void *
-e_contact_editor_categories_initialize_value (ETableModel *etc, int col, gpointer data)
-{
- if (col == 0)
- return NULL;
- else
- return g_strdup("");
-}
-
-static gboolean
-e_contact_editor_categories_value_is_empty (ETableModel *etc, int col, const void *value, gpointer data)
-{
- if (col == 0)
- return value == NULL;
- else
- return !(value && *(char *)value);
-}
-
-static char *
-e_contact_editor_categories_value_to_string (ETableModel *etc, int col, const void *value, gpointer data)
-{
- if (col == 0)
- return g_strdup_printf("%d", (int) value);
- else
- return g_strdup(value);
-}
diff --git a/addressbook/gui/contact-editor/e-contact-editor-categories.h b/addressbook/gui/contact-editor/e-contact-editor-categories.h
deleted file mode 100644
index 529ef71b68..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-categories.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor-categories.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_CATEGORIES_H__
-#define __E_CONTACT_EDITOR_CATEGORIES_H__
-
-#include <gnome.h>
-#include <glade/glade.h>
-#include <ebook/e-card.h>
-#include <widgets/e-table/e-table-model.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EContactEditorCategories - 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_CONTACT_EDITOR_CATEGORIES_TYPE (e_contact_editor_categories_get_type ())
-#define E_CONTACT_EDITOR_CATEGORIES(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE, EContactEditorCategories))
-#define E_CONTACT_EDITOR_CATEGORIES_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_CATEGORIES_TYPE, EContactEditorCategoriesClass))
-#define E_IS_CONTACT_EDITOR_CATEGORIES(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE))
-#define E_IS_CONTACT_EDITOR_CATEGORIES_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE))
-
-
-typedef struct _EContactEditorCategories EContactEditorCategories;
-typedef struct _EContactEditorCategoriesClass EContactEditorCategoriesClass;
-
-struct _EContactEditorCategories
-{
- GnomeDialog parent;
-
- /* item specific fields */
- char *categories;
- GtkWidget *entry;
- ETableModel *model;
-
- int list_length;
- char **category_list;
- gboolean *selected_list;
-
- GladeXML *gui;
-};
-
-struct _EContactEditorCategoriesClass
-{
- GnomeDialogClass parent_class;
-};
-
-
-GtkWidget *e_contact_editor_categories_new(char *categories);
-GtkType e_contact_editor_categories_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CONTACT_EDITOR_CATEGORIES_H__ */
diff --git a/addressbook/gui/contact-editor/e-contact-editor-confirm-delete.glade b/addressbook/gui/contact-editor/e-contact-editor-confirm-delete.glade
deleted file mode 100644
index 7f52321021..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-confirm-delete.glade
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>e-contact-editor-confirm-delete</name>
- <program_name>e-contact-editor-confirm-delete</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <gnome_help_support>True</gnome_help_support>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-contact-editor-confirm-delete.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeMessageBox</class>
- <name>confirm-dialog</name>
- <message_box_type>GNOME_MESSAGE_BOX_QUESTION</message_box_type>
- <message>Are you sure you want
-to delete this contact?</message>
- <title>Delete Contact?</title>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>True</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button2</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/gui/contact-editor/e-contact-editor-confirm-delete.glade.h b/addressbook/gui/contact-editor/e-contact-editor-confirm-delete.glade.h
deleted file mode 100644
index 7168db0a5c..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-confirm-delete.glade.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Are you sure you want\n"
- "to delete this contact?");
-gchar *s = N_("Delete Contact?");
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 b2e598fdde..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-fullname.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-editor-fullname.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-contact-editor-fullname.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_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_contact_editor_fullname_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_contact_editor_fullname_destroy (GtkObject *object);
-
-static void fill_in_info(EContactEditorFullname *editor);
-static void extract_info(EContactEditorFullname *editor);
-
-static GnomeDialogClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_NAME
-};
-
-GtkType
-e_contact_editor_fullname_get_type (void)
-{
- static GtkType contact_editor_fullname_type = 0;
-
- if (!contact_editor_fullname_type)
- {
- static const GtkTypeInfo contact_editor_fullname_info =
- {
- "EContactEditorFullname",
- sizeof (EContactEditorFullname),
- sizeof (EContactEditorFullnameClass),
- (GtkClassInitFunc) e_contact_editor_fullname_class_init,
- (GtkObjectInitFunc) e_contact_editor_fullname_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- contact_editor_fullname_type = gtk_type_unique (gnome_dialog_get_type (), &contact_editor_fullname_info);
- }
-
- return contact_editor_fullname_type;
-}
-
-static void
-e_contact_editor_fullname_class_init (EContactEditorFullnameClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeDialogClass *dialog_class;
-
- object_class = (GtkObjectClass*) klass;
- dialog_class = (GnomeDialogClass *) klass;
-
- parent_class = gtk_type_class (gnome_dialog_get_type ());
-
- gtk_object_add_arg_type ("EContactEditorFullname::name", GTK_TYPE_POINTER,
- GTK_ARG_READWRITE, ARG_NAME);
-
- object_class->set_arg = e_contact_editor_fullname_set_arg;
- object_class->get_arg = e_contact_editor_fullname_get_arg;
- object_class->destroy = e_contact_editor_fullname_destroy;
-}
-
-static void
-e_contact_editor_fullname_init (EContactEditorFullname *e_contact_editor_fullname)
-{
- GladeXML *gui;
- GtkWidget *widget;
-
- gnome_dialog_append_button ( GNOME_DIALOG(e_contact_editor_fullname),
- GNOME_STOCK_BUTTON_OK);
-
- gnome_dialog_append_button ( GNOME_DIALOG(e_contact_editor_fullname),
- GNOME_STOCK_BUTTON_CANCEL);
-
- gtk_window_set_policy(GTK_WINDOW(e_contact_editor_fullname), TRUE, TRUE, FALSE);
-
- e_contact_editor_fullname->name = NULL;
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/fullname.glade", NULL);
- e_contact_editor_fullname->gui = gui;
-
- widget = glade_xml_get_widget(gui, "table-checkfullname");
- gtk_widget_ref(widget);
- gtk_container_remove(GTK_CONTAINER(widget->parent), widget);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (e_contact_editor_fullname)->vbox), widget, TRUE, TRUE, 0);
- gtk_widget_unref(widget);
-}
-
-void
-e_contact_editor_fullname_destroy (GtkObject *object)
-{
- EContactEditorFullname *e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME(object);
-
- if (e_contact_editor_fullname->gui)
- gtk_object_unref(GTK_OBJECT(e_contact_editor_fullname->gui));
- e_card_name_free(e_contact_editor_fullname->name);
-}
-
-GtkWidget*
-e_contact_editor_fullname_new (ECardName *name)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_editor_fullname_get_type ()));
- gtk_object_set (GTK_OBJECT(widget),
- "name", name,
- NULL);
- return widget;
-}
-
-static void
-e_contact_editor_fullname_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EContactEditorFullname *e_contact_editor_fullname;
-
- e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (o);
-
- switch (arg_id){
- case ARG_NAME:
- if (e_contact_editor_fullname->name)
- e_card_name_free(e_contact_editor_fullname->name);
- e_contact_editor_fullname->name = e_card_name_copy(GTK_VALUE_POINTER (*arg));
- fill_in_info(e_contact_editor_fullname);
- break;
- }
-}
-
-static void
-e_contact_editor_fullname_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EContactEditorFullname *e_contact_editor_fullname;
-
- e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object);
-
- switch (arg_id) {
- case ARG_NAME:
- extract_info(e_contact_editor_fullname);
- GTK_VALUE_POINTER (*arg) = e_card_name_copy(e_contact_editor_fullname->name);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- 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)
-{
- ECardName *name = editor->name;
- if (name) {
- fill_in_field(editor, "entry-title", name->prefix);
- 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->suffix);
- }
-}
-
-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)
-{
- ECardName *name = editor->name;
- if (!name)
- name = e_card_name_new();
- name->prefix = 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->suffix = 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 409ffc72d0..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-fullname.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor-fullname.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <glade/glade.h>
-#include <ebook/e-card.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* 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_CONTACT_EDITOR_FULLNAME_TYPE (e_contact_editor_fullname_get_type ())
-#define E_CONTACT_EDITOR_FULLNAME(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_FULLNAME_TYPE, EContactEditorFullname))
-#define E_CONTACT_EDITOR_FULLNAME_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_FULLNAME_TYPE, EContactEditorFullnameClass))
-#define E_IS_CONTACT_EDITOR_FULLNAME(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_FULLNAME_TYPE))
-#define E_IS_CONTACT_EDITOR_FULLNAME_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_FULLNAME_TYPE))
-
-
-typedef struct _EContactEditorFullname EContactEditorFullname;
-typedef struct _EContactEditorFullnameClass EContactEditorFullnameClass;
-
-struct _EContactEditorFullname
-{
- GnomeDialog parent;
-
- /* item specific fields */
- ECardName *name;
- GladeXML *gui;
-};
-
-struct _EContactEditorFullnameClass
-{
- GnomeDialogClass parent_class;
-};
-
-
-GtkWidget *e_contact_editor_fullname_new(ECardName *name);
-GtkType e_contact_editor_fullname_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CONTACT_EDITOR_FULLNAME_H__ */
diff --git a/addressbook/gui/contact-editor/e-contact-editor-strings.h b/addressbook/gui/contact-editor/e-contact-editor-strings.h
deleted file mode 100644
index d5ac9daf24..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-strings.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("_Add");
-gchar *s = N_("_Delete");
-gchar *s = N_("Phone Types");
-gchar *s = N_("New phone type");
-gchar *s = N_("Add");
-gchar *s = N_("New phone type");
-gchar *s = N_("Contact Editor");
-gchar *s = N_("_Full Name...");
-gchar *s = N_("File As:");
-gchar *s = N_("Web page address:");
-gchar *s = N_("Wants to receive _HTML mail");
-gchar *s = N_("Address:");
-gchar *s = N_("_Business");
-gchar *s = N_("_Home");
-gchar *s = N_("Business _Fax");
-gchar *s = N_("_Mobile");
-gchar *s = N_("Primary Email");
-gchar *s = N_("B_usiness");
-gchar *s = N_("_This is the mailing address");
-gchar *s = N_("C_ontacts...");
-gchar *s = N_("Ca_tegories...");
-gchar *s = N_("_Job title:");
-gchar *s = N_("_Company:");
-gchar *s = N_("General");
-gchar *s = N_("_Department:");
-gchar *s = N_("_Office:");
-gchar *s = N_("_Profession:");
-gchar *s = N_("_Nickname:");
-gchar *s = N_("_Spouse:");
-gchar *s = N_("_Birthday:");
-gchar *s = N_("_Assistant's name:");
-gchar *s = N_("_Manager's Name:");
-gchar *s = N_("Anni_versary:");
-gchar *s = N_("No_tes:");
-gchar *s = N_("Details");
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 e8062d83b9..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor.c
+++ /dev/null
@@ -1,1809 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-editor.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-contact-editor.h"
-#include <e-contact-editor-fullname.h>
-#include <e-contact-editor-categories.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
-#include <e-util/e-gui-utils.h>
-#include <e-contact-save-as.h>
-#include "addressbook/printing/e-contact-print.h"
-
-/* Signal IDs */
-enum {
- ADD_CARD,
- COMMIT_CARD,
- DELETE_CARD,
- EDITOR_CLOSED,
- LAST_SIGNAL
-};
-
-static void e_contact_editor_init (EContactEditor *card);
-static void e_contact_editor_class_init (EContactEditorClass *klass);
-static void e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_contact_editor_destroy (GtkObject *object);
-
-#if 0
-static GtkWidget *e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info);
-#endif
-static void _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor);
-static void _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor);
-static void _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor);
-static void fill_in_info(EContactEditor *editor);
-static void extract_info(EContactEditor *editor);
-static void set_fields(EContactEditor *editor);
-static void set_address_field(EContactEditor *editor, int result);
-static void add_field_callback(GtkWidget *widget, EContactEditor *editor);
-
-static GtkObjectClass *parent_class = NULL;
-
-static guint contact_editor_signals[LAST_SIGNAL];
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_CARD,
- ARG_IS_NEW_CARD
-};
-
-enum {
- DYNAMIC_LIST_EMAIL,
- DYNAMIC_LIST_PHONE,
- DYNAMIC_LIST_ADDRESS
-};
-
-GtkType
-e_contact_editor_get_type (void)
-{
- static GtkType contact_editor_type = 0;
-
- if (!contact_editor_type)
- {
- static const GtkTypeInfo contact_editor_info =
- {
- "EContactEditor",
- sizeof (EContactEditor),
- sizeof (EContactEditorClass),
- (GtkClassInitFunc) e_contact_editor_class_init,
- (GtkObjectInitFunc) e_contact_editor_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- contact_editor_type = gtk_type_unique (GTK_TYPE_OBJECT, &contact_editor_info);
- }
-
- return contact_editor_type;
-}
-
-static void
-e_contact_editor_class_init (EContactEditorClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass*) klass;
-
- parent_class = gtk_type_class (GTK_TYPE_OBJECT);
-
- gtk_object_add_arg_type ("EContactEditor::card", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_CARD);
- gtk_object_add_arg_type ("EContactEditor::is_new_card", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_IS_NEW_CARD);
-
- contact_editor_signals[ADD_CARD] =
- gtk_signal_new ("add_card",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EContactEditorClass, add_card),
- gtk_marshal_NONE__OBJECT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_OBJECT);
-
- contact_editor_signals[COMMIT_CARD] =
- gtk_signal_new ("commit_card",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EContactEditorClass, commit_card),
- gtk_marshal_NONE__OBJECT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_OBJECT);
-
- contact_editor_signals[DELETE_CARD] =
- gtk_signal_new ("delete_card",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EContactEditorClass, delete_card),
- gtk_marshal_NONE__OBJECT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_OBJECT);
-
- contact_editor_signals[EDITOR_CLOSED] =
- gtk_signal_new ("editor_closed",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EContactEditorClass, editor_closed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, contact_editor_signals, LAST_SIGNAL);
-
- object_class->set_arg = e_contact_editor_set_arg;
- object_class->get_arg = e_contact_editor_get_arg;
- object_class->destroy = e_contact_editor_destroy;
-}
-
-static void
-_replace_button(EContactEditor *editor, gchar *button_xml, gchar *image, GtkSignalFunc func)
-{
- GladeXML *gui = editor->gui;
- GtkWidget *button = glade_xml_get_widget(gui, button_xml);
- GtkWidget *pixmap;
- gchar *image_temp;
- if (button && GTK_IS_BUTTON(button)) {
- image_temp = g_strdup_printf("%s/%s", EVOLUTIONDIR, image);
- pixmap = e_create_image_widget(NULL, image_temp, NULL, 0, 0);
- gtk_container_add(GTK_CONTAINER(button),
- pixmap);
- g_free(image_temp);
- gtk_widget_show(pixmap);
- gtk_signal_connect(GTK_OBJECT(button), "button_press_event", func, editor);
- }
-}
-
-static void
-_replace_buttons(EContactEditor *editor)
-{
- _replace_button(editor, "button-phone1", "arrow.png", _phone_arrow_pressed);
- _replace_button(editor, "button-phone2", "arrow.png", _phone_arrow_pressed);
- _replace_button(editor, "button-phone3", "arrow.png", _phone_arrow_pressed);
- _replace_button(editor, "button-phone4", "arrow.png", _phone_arrow_pressed);
- _replace_button(editor, "button-address", "arrow.png", _address_arrow_pressed);
- _replace_button(editor, "button-email1", "arrow.png", _email_arrow_pressed);
-}
-
-static void
-phone_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- int which;
- gchar *string;
- GtkEntry *entry = GTK_ENTRY(widget);
- ECardPhone *phone;
-
- if ( widget == glade_xml_get_widget(editor->gui, "entry-phone1") ) {
- which = 1;
- } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone2") ) {
- which = 2;
- } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone3") ) {
- which = 3;
- } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone4") ) {
- which = 4;
- } else
- return;
- string = gtk_entry_get_text(entry);
- phone = e_card_phone_new();
- phone->number = string;
- e_card_simple_set_phone(editor->simple, editor->phone_choice[which - 1], phone);
- phone->number = NULL;
- e_card_phone_free(phone);
- set_fields(editor);
-}
-
-static void
-email_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- gchar *string;
- GtkEntry *entry = GTK_ENTRY(widget);
-
- string = gtk_entry_get_text(entry);
-
- e_card_simple_set_email(editor->simple, editor->email_choice, string);
-}
-
-static void
-address_text_changed (GtkWidget *widget, EContactEditor *editor)
-{
- GtkEditable *editable = GTK_EDITABLE(widget);
- ECardAddrLabel *address;
-
- if (editor->address_choice == -1)
- return;
-
- address = e_card_address_label_new();
- address->data = gtk_editable_get_chars(editable, 0, -1);
- e_card_simple_set_address(editor->simple, editor->address_choice, address);
- e_card_address_label_free(address);
-}
-
-/* This function tells you whether name_to_style will make sense. */
-static gboolean
-style_makes_sense(const ECardName *name, char *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->given && *name->given) || (name->family && *name->family)))
- return TRUE;
- else
- return FALSE;
- default:
- return FALSE;
- }
-}
-
-static char *
-name_to_style(const ECardName *name, char *company, int style)
-{
- char *string;
- char *strings[4], **stringptr;
- char *substring;
- switch (style) {
- case 0:
- stringptr = strings;
- 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->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->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"));
- char *filestring = gtk_entry_get_text(file_as);
- char *trystring;
- ECardName *name = editor->name;
- int i;
- int style;
-
- if (!name) return 0;
-
- style = -1;
- for (i = 0; i < 5; i++) {
- trystring = name_to_style(name, editor->company, i);
- if (!strcmp(trystring, filestring)) {
- g_free(trystring);
- return i;
- }
- g_free(trystring);
- }
- 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"));
- GtkWidget *widget;
-
-
- if (style == -1) {
- string = g_strdup(gtk_entry_get_text(file_as));
- strings = g_list_append(strings, string);
- }
-
- for (i = 0; i < 5; i++) {
- if (style_makes_sense(editor->name, editor->company, i)) {
- string = name_to_style(editor->name, editor->company, i);
- strings = g_list_append(strings, string);
- }
- }
-
- widget = glade_xml_get_widget(editor->gui, "combo-file-as");
- 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, editor->company, style);
- gtk_entry_set_text(file_as, string);
- g_free(string);
- }
-}
-
-static void
-name_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- GtkWidget *file_as;
- int style = 0;
-
- file_as = glade_xml_get_widget(editor->gui, "entry-file-as");
-
- if (file_as && GTK_IS_ENTRY(file_as)) {
- style = file_as_get_style(editor);
- }
-
- e_card_name_free(editor->name);
- editor->name = e_card_name_from_string(gtk_entry_get_text(GTK_ENTRY(widget)));
-
- if (file_as && GTK_IS_ENTRY(file_as)) {
- file_as_set_style(editor, style);
- }
-}
-
-static void
-company_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- int style = 0;
- GtkWidget *file_as;
-
- file_as = glade_xml_get_widget(editor->gui, "entry-file-as");
-
- if (file_as && GTK_IS_ENTRY(file_as)) {
- style = file_as_get_style(editor);
- }
-
- g_free(editor->company);
-
- editor->company = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
-
- if (file_as && GTK_IS_ENTRY(file_as)) {
- file_as_set_style(editor, style);
- }
-}
-
-static void
-set_entry_changed_signal_phone(EContactEditor *editor, char *id)
-{
- GtkWidget *widget = glade_xml_get_widget(editor->gui, id);
- if (widget && GTK_IS_ENTRY(widget))
- gtk_signal_connect(GTK_OBJECT(widget), "changed",
- phone_entry_changed, editor);
-}
-
-static void
-set_entry_changed_signals(EContactEditor *editor)
-{
- GtkWidget *widget;
- set_entry_changed_signal_phone(editor, "entry-phone1");
- set_entry_changed_signal_phone(editor, "entry-phone2");
- set_entry_changed_signal_phone(editor, "entry-phone3");
- set_entry_changed_signal_phone(editor, "entry-phone4");
- widget = glade_xml_get_widget(editor->gui, "entry-email1");
- if (widget && GTK_IS_ENTRY(widget)) {
- gtk_signal_connect(GTK_OBJECT(widget), "changed",
- email_entry_changed, editor);
- }
- widget = glade_xml_get_widget(editor->gui, "text-address");
- if (widget && GTK_IS_TEXT(widget)) {
- gtk_signal_connect(GTK_OBJECT(widget), "changed",
- address_text_changed, editor);
- }
- widget = glade_xml_get_widget(editor->gui, "entry-fullname");
- if (widget && GTK_IS_ENTRY(widget)) {
- gtk_signal_connect(GTK_OBJECT(widget), "changed",
- name_entry_changed, editor);
- }
- widget = glade_xml_get_widget(editor->gui, "entry-company");
- if (widget && GTK_IS_ENTRY(widget)) {
- gtk_signal_connect(GTK_OBJECT(widget), "changed",
- company_entry_changed, editor);
- }
-}
-
-static void
-full_name_clicked(GtkWidget *button, EContactEditor *editor)
-{
- GnomeDialog *dialog = GNOME_DIALOG(e_contact_editor_fullname_new(editor->name));
- int result;
- gtk_widget_show(GTK_WIDGET(dialog));
- result = gnome_dialog_run_and_close (dialog);
- if (result == 0) {
- ECardName *name;
- GtkWidget *fname_widget;
-
- gtk_object_get(GTK_OBJECT(dialog),
- "name", &name,
- NULL);
- e_card_name_free(editor->name);
- editor->name = e_card_name_copy(name);
-
- fname_widget = glade_xml_get_widget(editor->gui, "entry-fullname");
- if (fname_widget && GTK_IS_ENTRY(fname_widget)) {
- char *full_name = e_card_name_to_string(name);
- gtk_entry_set_text(GTK_ENTRY(fname_widget), full_name);
- g_free(full_name);
- }
- }
- gtk_object_unref(GTK_OBJECT(dialog));
-}
-
-static void
-categories_clicked(GtkWidget *button, EContactEditor *editor)
-{
- char *categories;
- GnomeDialog *dialog;
- int result;
- GtkWidget *entry = glade_xml_get_widget(editor->gui, "entry-categories");
- if (entry && GTK_IS_ENTRY(entry))
- categories = gtk_entry_get_text(GTK_ENTRY(entry));
- else if (editor->card)
- gtk_object_get(GTK_OBJECT(editor->card),
- "categories", &categories,
- NULL);
- dialog = GNOME_DIALOG(e_contact_editor_categories_new(categories));
- gtk_widget_show(GTK_WIDGET(dialog));
- result = gnome_dialog_run (dialog);
- if (result == 0) {
- gtk_object_get(GTK_OBJECT(dialog),
- "categories", &categories,
- NULL);
- if (entry && GTK_IS_ENTRY(entry))
- gtk_entry_set_text(GTK_ENTRY(entry), categories);
- else
- gtk_object_set(GTK_OBJECT(editor->card),
- "categories", categories,
- NULL);
- g_free(categories);
- }
- gtk_object_destroy(GTK_OBJECT(dialog));
- if (!entry)
- g_free(categories);
-}
-
-/* Emits the signal to request saving a card */
-static void
-save_card (EContactEditor *ce)
-{
- extract_info (ce);
- e_card_simple_sync_card (ce->simple);
-
- if (ce->is_new_card)
- gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[ADD_CARD],
- ce->card);
- else
- gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[COMMIT_CARD],
- ce->card);
-
- /* FIXME: should we set the ce->is_new_card here or have the client code
- * set the "is_new_card" argument on the contact editor object?
- */
-
- ce->is_new_card = FALSE;
-}
-
-/* Closes the dialog box and emits the appropriate signals */
-static void
-close_dialog (EContactEditor *ce)
-{
- g_assert (ce->app != NULL);
-
- gtk_widget_destroy (ce->app);
- ce->app = NULL;
-
- gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[EDITOR_CLOSED]);
-}
-
-/* Menu callbacks */
-
-/* File/Save callback */
-static void
-file_save_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (data);
- save_card (ce);
-}
-
-/* File/Close callback */
-static void
-file_close_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (data);
- close_dialog (ce);
-}
-
-static void
-file_save_as_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
- ECard *card;
-
- ce = E_CONTACT_EDITOR (data);
-
- extract_info (ce);
- e_card_simple_sync_card (ce->simple);
-
- card = ce->card;
- e_contact_save_as("Save as VCard", card);
-}
-
-gboolean
-e_contact_editor_confirm_delete(void)
-{
- GnomeDialog *dialog;
- GladeXML *gui;
- int result;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/e-contact-editor-confirm-delete.glade", NULL);
-
- dialog = GNOME_DIALOG(glade_xml_get_widget(gui, "confirm-dialog"));
-
- result = gnome_dialog_run_and_close(dialog);
-
- gtk_object_unref(GTK_OBJECT(gui));
-
- return !result;
-}
-
-static void
-delete_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- if (e_contact_editor_confirm_delete()) {
-
- ce = E_CONTACT_EDITOR (data);
-
- extract_info (ce);
- e_card_simple_sync_card (ce->simple);
-
- if (!ce->is_new_card)
- gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[DELETE_CARD],
- ce->card);
-
- file_close_cb(widget, data);
- }
-}
-
-/* Emits the signal to request printing a card */
-static void
-print_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (data);
-
- extract_info (ce);
- e_card_simple_sync_card (ce->simple);
-
- gtk_widget_show(e_contact_print_card_dialog_new(ce->card));
-}
-
-
-/* Menu bar */
-
-static GnomeUIInfo file_new_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Appointment"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Meeting Re_quest"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Mail Message"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Task"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Task _Request"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Journal Entry"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Note"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Ch_oose Form..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo file_page_setup_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Memo Style"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Define Print _Styles..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo file_menu[] = {
- GNOMEUIINFO_MENU_NEW_SUBTREE (file_new_menu),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: S_end"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_SAVE_ITEM (file_save_cb, NULL),
- GNOMEUIINFO_MENU_SAVE_AS_ITEM (file_save_as_cb, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Save Attac_hments..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("_Delete"), NULL, delete_cb),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Move to Folder..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Cop_y to Folder..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("Page Set_up"), file_page_setup_menu),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Print Pre_view"), NULL, NULL),
- GNOMEUIINFO_MENU_PRINT_ITEM (print_cb, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_PROPERTIES_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CLOSE_ITEM (file_close_cb, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo edit_object_menu[] = {
- GNOMEUIINFO_ITEM_NONE ("FIXME: what goes here?", NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo edit_menu[] = {
- GNOMEUIINFO_MENU_UNDO_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_REDO_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CUT_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_COPY_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_PASTE_ITEM (NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Paste _Special..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CLEAR_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_SELECT_ALL_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Mark as U_nread"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_FIND_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_FIND_AGAIN_ITEM (NULL, NULL),
- GNOMEUIINFO_SUBTREE (N_("_Object"), edit_object_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_previous_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Unread Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Fi_rst Item in Folder"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_next_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Unread Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Last Item in Folder"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_toolbars_menu[] = {
- { GNOME_APP_UI_TOGGLEITEM, N_("FIXME: _Standard"), NULL, NULL, NULL, NULL,
- GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },
- { GNOME_APP_UI_TOGGLEITEM, N_("FIXME: __Formatting"), NULL, NULL, NULL, NULL,
- GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Customize..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_menu[] = {
- GNOMEUIINFO_SUBTREE (N_("Pre_vious"), view_previous_menu),
- GNOMEUIINFO_SUBTREE (N_("Ne_xt"), view_next_menu),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("_Toolbars"), view_toolbars_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo insert_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _File..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: It_em..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Object..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo format_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Font..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Paragraph..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo tools_forms_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Ch_oose Form..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Desi_gn This Form"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: D_esign a Form..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Publish _Form..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Pu_blish Form As..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Script _Debugger"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo tools_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Spelling..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("_Forms"), tools_forms_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo actions_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _New Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New _Contact from Same Company"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New _Letter to Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New _Message to Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New Meetin_g with Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Plan a Meeting..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New _Task for Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: New _Journal Entry for Contact"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Flag for Follow Up..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Display Map of Address"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Open Web Page"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Forward as _vCard"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: For_ward"), NULL, NULL)
-};
-
-static GnomeUIInfo help_menu[] = {
- GNOMEUIINFO_ITEM_NONE ("FIXME: fix Bonobo so it supports help items!", NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo main_menu[] = {
- GNOMEUIINFO_MENU_FILE_TREE (file_menu),
- GNOMEUIINFO_MENU_EDIT_TREE (edit_menu),
- GNOMEUIINFO_MENU_VIEW_TREE (view_menu),
- GNOMEUIINFO_SUBTREE (N_("_Insert"), insert_menu),
- GNOMEUIINFO_SUBTREE (N_("F_ormat"), format_menu),
- GNOMEUIINFO_SUBTREE (N_("_Tools"), tools_menu),
- GNOMEUIINFO_SUBTREE (N_("Actio_ns"), actions_menu),
- GNOMEUIINFO_MENU_HELP_TREE (help_menu),
- GNOMEUIINFO_END
-};
-
-/* Creates the menu bar for the contact editor */
-static void
-create_menu (EContactEditor *ce)
-{
- BonoboUIHandlerMenuItem *list;
-
- bonobo_ui_handler_create_menubar (ce->uih);
-
- list = bonobo_ui_handler_menu_parse_uiinfo_list_with_data (main_menu, ce);
- bonobo_ui_handler_menu_add_list (ce->uih, "/", list);
-}
-
-/* Toolbar/Save and Close callback */
-static void
-tb_save_and_close_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (data);
- save_card (ce);
- close_dialog (ce);
-}
-
-/* Toolbar */
-
-static GnomeUIInfo toolbar[] = {
- GNOMEUIINFO_ITEM_STOCK (N_("Save and Close"),
- N_("Save the appointment and close the dialog box"),
- tb_save_and_close_cb,
- GNOME_STOCK_PIXMAP_SAVE),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_STOCK (N_("Print..."),
- N_("Print this item"), print_cb,
- GNOME_STOCK_PIXMAP_PRINT),
-#if 0
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Insert File..."),
- N_("Insert a file as an attachment"), NULL),
-#endif
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_STOCK (N_("Delete"),
- N_("Delete this item"), delete_cb,
- GNOME_STOCK_PIXMAP_TRASH),
- GNOMEUIINFO_SEPARATOR,
-#if 0
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Previous"),
- N_("Go to the previous item"), NULL,
- GNOME_STOCK_PIXMAP_BACK),
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Next"),
- N_("Go to the next item"), NULL,
- GNOME_STOCK_PIXMAP_FORWARD),
-#endif
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Help"),
- N_("See online help"), NULL, GNOME_STOCK_PIXMAP_HELP),
- GNOMEUIINFO_END
-};
-
-/* Creates the toolbar for the contact editor */
-static void
-create_toolbar (EContactEditor *ce)
-{
- BonoboUIHandlerToolbarItem *list;
- GnomeDockItem *dock_item;
- GtkWidget *toolbar_child;
-
- bonobo_ui_handler_create_toolbar (ce->uih, "Toolbar");
-
- /* Fetch the toolbar. What a pain in the ass. */
-
- dock_item = gnome_app_get_dock_item_by_name (GNOME_APP (ce->app), GNOME_APP_TOOLBAR_NAME);
- g_assert (dock_item != NULL);
-
- toolbar_child = gnome_dock_item_get_child (dock_item);
- g_assert (toolbar_child != NULL && GTK_IS_TOOLBAR (toolbar_child));
-
- /* Turn off labels as GtkToolbar sucks */
- gtk_toolbar_set_style (GTK_TOOLBAR (toolbar_child), GTK_TOOLBAR_ICONS);
-
- list = bonobo_ui_handler_toolbar_parse_uiinfo_list_with_data (toolbar, ce);
- bonobo_ui_handler_toolbar_add_list (ce->uih, "/Toolbar", list);
-}
-
-/* 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);
-
- close_dialog (ce);
- return TRUE;
-}
-
-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-phone1");
- list = add_to_tab_order(list, gui, "entry-phone2");
- list = add_to_tab_order(list, gui, "entry-phone3");
- list = add_to_tab_order(list, gui, "entry-phone4");
- list = g_list_reverse(list);
- e_container_change_tab_order(GTK_CONTAINER(container), list);
- g_list_free(list);
-
- list = NULL;
- list = add_to_tab_order(list, gui, "entry-email1");
- list = add_to_tab_order(list, gui, "entry-web");
- list = add_to_tab_order(list, gui, "text-address");
- list = add_to_tab_order(list, gui, "alignment-contacts");
- list = g_list_reverse(list);
- e_container_change_tab_order(GTK_CONTAINER(container), list);
- g_list_free(list);
- }
-}
-
-static void
-e_contact_editor_init (EContactEditor *e_contact_editor)
-{
- GladeXML *gui;
- GtkWidget *widget;
-
- e_contact_editor->email_info = NULL;
- e_contact_editor->phone_info = NULL;
- e_contact_editor->address_info = NULL;
- e_contact_editor->email_popup = NULL;
- e_contact_editor->phone_popup = NULL;
- e_contact_editor->address_popup = NULL;
- e_contact_editor->email_list = NULL;
- e_contact_editor->phone_list = NULL;
- e_contact_editor->address_list = NULL;
- e_contact_editor->name = NULL;
- e_contact_editor->company = g_strdup("");
-
- e_contact_editor->email_choice = 0;
- e_contact_editor->phone_choice[0] = E_CARD_SIMPLE_PHONE_ID_BUSINESS;
- e_contact_editor->phone_choice[1] = E_CARD_SIMPLE_PHONE_ID_HOME;
- e_contact_editor->phone_choice[2] = E_CARD_SIMPLE_PHONE_ID_BUSINESS_FAX;
- e_contact_editor->phone_choice[3] = E_CARD_SIMPLE_PHONE_ID_MOBILE;
- e_contact_editor->address_choice = 0;
-
- e_contact_editor->arbitrary_fields = NULL;
-
- e_contact_editor->simple = e_card_simple_new(NULL);
-
- e_contact_editor->card = NULL;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-editor.glade", NULL);
- e_contact_editor->gui = gui;
-
- setup_tab_order(gui);
-
- e_contact_editor->app = glade_xml_get_widget (gui, "contact editor");
-
- e_container_foreach_leaf (GTK_CONTAINER (e_contact_editor->app),
- (GtkCallback) add_field_callback,
- e_contact_editor);
-
- _replace_buttons(e_contact_editor);
- set_entry_changed_signals(e_contact_editor);
-
- widget = glade_xml_get_widget(e_contact_editor->gui, "button-fullname");
- if (widget && GTK_IS_BUTTON(widget))
- gtk_signal_connect(GTK_OBJECT(widget), "clicked",
- full_name_clicked, e_contact_editor);
-
- widget = glade_xml_get_widget(e_contact_editor->gui, "button-categories");
- if (widget && GTK_IS_BUTTON(widget))
- gtk_signal_connect(GTK_OBJECT(widget), "clicked",
- categories_clicked, e_contact_editor);
-
- /* Build the menu and toolbar */
-
- e_contact_editor->uih = bonobo_ui_handler_new ();
- if (!e_contact_editor->uih) {
- g_message ("e_contact_editor_init(): eeeeek, could not create the UI handler!");
- return;
- }
-
- bonobo_ui_handler_set_app (e_contact_editor->uih, GNOME_APP (e_contact_editor->app));
-
- create_menu (e_contact_editor);
- create_toolbar (e_contact_editor);
-
- /* Connect to the deletion of the dialog */
-
- gtk_signal_connect (GTK_OBJECT (e_contact_editor->app), "delete_event",
- GTK_SIGNAL_FUNC (app_delete_event_cb), e_contact_editor);
-}
-
-void
-e_contact_editor_destroy (GtkObject *object) {
- EContactEditor *e_contact_editor = E_CONTACT_EDITOR(object);
-
- if (e_contact_editor->email_list) {
- g_list_foreach(e_contact_editor->email_list, (GFunc) g_free, NULL);
- g_list_free(e_contact_editor->email_list);
- }
- if (e_contact_editor->email_info) {
- g_free(e_contact_editor->email_info);
- }
- if (e_contact_editor->email_popup) {
- gtk_widget_unref(e_contact_editor->email_popup);
- }
-
- if (e_contact_editor->phone_list) {
- g_list_foreach(e_contact_editor->phone_list, (GFunc) g_free, NULL);
- g_list_free(e_contact_editor->phone_list);
- }
- if (e_contact_editor->phone_info) {
- g_free(e_contact_editor->phone_info);
- }
- if (e_contact_editor->phone_popup) {
- gtk_widget_unref(e_contact_editor->phone_popup);
- }
-
- if (e_contact_editor->address_list) {
- g_list_foreach(e_contact_editor->address_list, (GFunc) g_free, NULL);
- g_list_free(e_contact_editor->address_list);
- }
- if (e_contact_editor->address_info) {
- g_free(e_contact_editor->address_info);
- }
- if (e_contact_editor->address_popup) {
- gtk_widget_unref(e_contact_editor->address_popup);
- }
-
- if (e_contact_editor->simple)
- gtk_object_unref(GTK_OBJECT(e_contact_editor->simple));
-
- g_free (e_contact_editor->company);
-
- gtk_object_unref(GTK_OBJECT(e_contact_editor->gui));
-}
-
-EContactEditor *
-e_contact_editor_new (ECard *card, gboolean is_new_card)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (gtk_type_new (E_CONTACT_EDITOR_TYPE));
-
- gtk_object_set (GTK_OBJECT (ce),
- "card", card,
- "is_new_card", is_new_card,
- NULL);
-
- gtk_widget_show (ce->app);
- return ce;
-}
-
-static void
-e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EContactEditor *editor;
-
- editor = E_CONTACT_EDITOR (o);
-
- switch (arg_id){
- case ARG_CARD:
- if (editor->card)
- gtk_object_unref(GTK_OBJECT(editor->card));
- editor->card = e_card_duplicate(E_CARD(GTK_VALUE_OBJECT (*arg)));
- gtk_object_set(GTK_OBJECT(editor->simple),
- "card", editor->card,
- NULL);
- fill_in_info(editor);
- break;
-
- case ARG_IS_NEW_CARD:
- editor->is_new_card = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE;
- break;
- }
-}
-
-static void
-e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EContactEditor *e_contact_editor;
-
- e_contact_editor = E_CONTACT_EDITOR (object);
-
- switch (arg_id) {
- case ARG_CARD:
- e_card_simple_sync_card(e_contact_editor->simple);
- extract_info(e_contact_editor);
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_contact_editor->card);
- break;
-
- case ARG_IS_NEW_CARD:
- GTK_VALUE_BOOL (*arg) = e_contact_editor->is_new_card ? TRUE : FALSE;
- break;
-
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-_popup_position(GtkMenu *menu,
- gint *x,
- gint *y,
- gpointer data)
-{
- GtkWidget *button = GTK_WIDGET(data);
- GtkRequisition request;
- int mh, mw;
- gdk_window_get_origin (button->window, x, y);
- *x += button->allocation.width;
- *y += button->allocation.height;
-
- gtk_widget_size_request(GTK_WIDGET(menu), &request);
-
- mh = request.height;
- mw = request.width;
-
- *x -= mw;
- if (*x < 0)
- *x = 0;
-
- if (*y < 0)
- *y = 0;
-
- if ((*x + mw) > gdk_screen_width ())
- *x = gdk_screen_width () - mw;
-
- if ((*y + mh) > gdk_screen_height ())
- *y = gdk_screen_height () - mh;
-}
-
-static gint
-_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor, GtkWidget *popup, GList **list, GnomeUIInfo **info, gchar *label, gchar *entry, gchar *dialog_title)
-{
- gint menu_item;
- gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "button_press_event");
- gtk_widget_realize(popup);
- menu_item = gnome_popup_menu_do_popup_modal(popup, _popup_position, widget, button, editor);
- if ( menu_item != -1 ) {
-#if 0
- if (menu_item == g_list_length (*list)) {
- e_contact_editor_build_dialog(editor, entry, label, dialog_title, list, info);
- } else {
-#endif
- GtkWidget *label_widget = glade_xml_get_widget(editor->gui, label);
- if (label_widget && GTK_IS_LABEL(label_widget)) {
- gtk_object_set(GTK_OBJECT(label_widget),
- "label", g_list_nth_data(*list, menu_item),
- NULL);
- }
-#if 0
- }
-#endif
- }
- return menu_item;
-}
-
-static void
-e_contact_editor_build_ui_info(GList *list, GnomeUIInfo **infop)
-{
- GnomeUIInfo *info;
- GnomeUIInfo singleton = { GNOME_APP_UI_TOGGLEITEM, NULL, NULL, NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, 0, 0, 0, NULL };
- GnomeUIInfo end = GNOMEUIINFO_END;
- int length;
- int i;
-
- info = *infop;
-
- if ( info )
- g_free(info);
- length = g_list_length( list );
- info = g_new(GnomeUIInfo, length + 2);
- for (i = 0; i < length; i++) {
- info[i] = singleton;
- info[i].label = _(list->data);
- list = list->next;
- }
- info[i] = end;
-
- *infop = info;
-}
-
-#if 0
-static void
-_dialog_clicked(GtkWidget *dialog, gint button, EContactEditor *editor)
-{
- GtkWidget *label = gtk_object_get_data(GTK_OBJECT(dialog),
- "e_contact_editor_label");
-
- GtkWidget *dialog_entry = gtk_object_get_data(GTK_OBJECT(dialog),
- "e_contact_editor_dialog_entry");
-
- GList **list = gtk_object_get_data(GTK_OBJECT(dialog),
- "e_contact_editor_list");
- GList **info = gtk_object_get_data(GTK_OBJECT(dialog),
- "e_contact_editor_info");
- switch (button) {
- case 0:
- if (label && GTK_IS_LABEL(label)) {
- gtk_object_set(GTK_OBJECT(label),
- "label", gtk_entry_get_text(GTK_ENTRY(dialog_entry)),
- NULL);
- *list = g_list_append(*list, g_strdup(gtk_entry_get_text(GTK_ENTRY(dialog_entry))));
- g_free(*info);
- *info = NULL;
- }
- break;
- }
- gnome_dialog_close(GNOME_DIALOG(dialog));
-}
-
-static void
-_dialog_destroy(EContactEditor *editor, GtkWidget *dialog)
-{
- gnome_dialog_close(GNOME_DIALOG(dialog));
-}
-
-static GtkWidget *
-e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info)
-{
- GtkWidget *dialog_entry = gtk_entry_new();
- GtkWidget *entry = glade_xml_get_widget(editor->gui, entry_id);
- GtkWidget *label = glade_xml_get_widget(editor->gui, label_id);
-
- GtkWidget *dialog = gnome_dialog_new(title,
- NULL);
-
- gtk_container_add(GTK_CONTAINER(GNOME_DIALOG(dialog)->vbox),
- gtk_widget_new (gtk_frame_get_type(),
- "border_width", 4,
- "label", title,
- "child", gtk_widget_new(gtk_alignment_get_type(),
- "child", dialog_entry,
- "xalign", .5,
- "yalign", .5,
- "xscale", 1.0,
- "yscale", 1.0,
- "border_width", 9,
- NULL),
- NULL));
-
- gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(dialog),
- "Add",
- GNOME_STOCK_PIXMAP_ADD);
- gnome_dialog_append_button(GNOME_DIALOG(dialog), GNOME_STOCK_BUTTON_CANCEL);
- gnome_dialog_set_default(GNOME_DIALOG(dialog), 0);
-
- gtk_signal_connect(GTK_OBJECT(dialog), "clicked",
- _dialog_clicked, editor);
- gtk_signal_connect_while_alive(GTK_OBJECT(editor), "destroy",
- _dialog_destroy, GTK_OBJECT(dialog), GTK_OBJECT(dialog));
-
- gtk_object_set_data(GTK_OBJECT(dialog),
- "e_contact_editor_entry", entry);
- gtk_object_set_data(GTK_OBJECT(dialog),
- "e_contact_editor_label", label);
- gtk_object_set_data(GTK_OBJECT(dialog),
- "e_contact_editor_dialog_entry", dialog_entry);
- gtk_object_set_data(GTK_OBJECT(dialog),
- "e_contact_editor_list", list);
- gtk_object_set_data(GTK_OBJECT(dialog),
- "e_contact_editor_info", info);
-
- gtk_widget_show_all(dialog);
- return dialog;
-}
-#endif
-
-static void
-_phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor)
-{
- int which;
- int i;
- gchar *label;
- gchar *entry;
- int result;
- if ( widget == glade_xml_get_widget(editor->gui, "button-phone1") ) {
- which = 1;
- } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone2") ) {
- which = 2;
- } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone3") ) {
- which = 3;
- } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone4") ) {
- which = 4;
- } else
- return;
-
- label = g_strdup_printf("label-phone%d", which);
- entry = g_strdup_printf("entry-phone%d", which);
-
- if (editor->phone_list == NULL) {
- static char *info[] = {
- N_("Assistant"),
- N_("Business"),
- N_("Business 2"),
- N_("Business Fax"),
- N_("Callback"),
- N_("Car"),
- N_("Company"),
- N_("Home"),
- N_("Home 2"),
- N_("Home Fax"),
- N_("ISDN"),
- N_("Mobile"),
- N_("Other"),
- N_("Other Fax"),
- N_("Pager"),
- N_("Primary"),
- N_("Radio"),
- N_("Telex"),
- N_("TTY/TDD")
- };
-
- for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) {
- editor->phone_list = g_list_append(editor->phone_list, g_strdup(info[i]));
- }
- }
- if (editor->phone_info == NULL) {
- e_contact_editor_build_ui_info(editor->phone_list, &editor->phone_info);
-
- if ( editor->phone_popup )
- gtk_widget_unref(editor->phone_popup);
-
- editor->phone_popup = gnome_popup_menu_new(editor->phone_info);
- }
-
- for(i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) {
- const ECardPhone *phone = e_card_simple_get_phone(editor->simple, i);
- gboolean checked;
- checked = phone && phone->number && *phone->number;
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->phone_info[i].widget),
- checked);
- gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(editor->phone_info[i].widget),
- TRUE);
- }
-
- result = _arrow_pressed (widget, button, editor, editor->phone_popup, &editor->phone_list, &editor->phone_info, label, entry, "Add new phone number type");
-
- if (result != -1) {
- editor->phone_choice[which - 1] = result;
- set_fields(editor);
- }
-
- g_free(label);
- g_free(entry);
-}
-
-static void
-_email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor)
-{
- int i;
- int result;
- if (editor->email_list == NULL) {
- static char *info[] = {
- N_("Primary Email"),
- N_("Email 2"),
- N_("Email 3")
- };
-
- for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) {
- editor->email_list = g_list_append(editor->email_list, g_strdup(info[i]));
- }
- }
- if (editor->email_info == NULL) {
- e_contact_editor_build_ui_info(editor->email_list, &editor->email_info);
-
- if ( editor->email_popup )
- gtk_widget_unref(editor->email_popup);
-
- editor->email_popup = gnome_popup_menu_new(editor->email_info);
- }
-
- for(i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) {
- const char *string = e_card_simple_get_email(editor->simple, i);
- gboolean checked;
- checked = string && *string;
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->email_info[i].widget),
- checked);
- gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(editor->email_info[i].widget),
- TRUE);
- }
-
- result = _arrow_pressed (widget, button, editor, editor->email_popup, &editor->email_list, &editor->email_info, "label-email1", "entry-email1", "Add new Email type");
-
- if (result != -1) {
- editor->email_choice = result;
- set_fields(editor);
- }
-}
-
-static void
-_address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor)
-{
- int i;
- int result;
- if (editor->address_list == NULL) {
- static char *info[] = {
- N_("Business"),
- N_("Home"),
- N_("Other")
- };
-
- for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) {
- editor->address_list = g_list_append(editor->address_list, g_strdup(info[i]));
- }
- }
- if (editor->address_info == NULL) {
- e_contact_editor_build_ui_info(editor->address_list, &editor->address_info);
-
- if ( editor->address_popup )
- gtk_widget_unref(editor->address_popup);
-
- editor->address_popup = gnome_popup_menu_new(editor->address_info);
- }
-
- for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) {
- const ECardAddrLabel *address = e_card_simple_get_address(editor->simple, i);
- gboolean checked;
- checked = address && address->data && *address->data;
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->address_info[i].widget),
- checked);
- gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(editor->address_info[i].widget),
- TRUE);
- }
-
- result = _arrow_pressed (widget, button, editor, editor->address_popup, &editor->address_list, &editor->address_info, "label-address", "text-address", "Add new Address type");
-
- if (result != -1) {
- set_address_field(editor, result);
- }
-}
-
-static void
-set_field(GtkEntry *entry, const char *string)
-{
- char *oldstring = gtk_entry_get_text(entry);
- if (!string)
- string = "";
- if (strcmp(string, oldstring))
- gtk_entry_set_text(entry, string);
-}
-
-static void
-set_phone_field(GtkWidget *entry, const ECardPhone *phone)
-{
- set_field(GTK_ENTRY(entry), phone ? phone->number : "");
-}
-
-static void
-set_fields(EContactEditor *editor)
-{
- GtkWidget *entry;
-
- entry = glade_xml_get_widget(editor->gui, "entry-phone1");
- if (entry && GTK_IS_ENTRY(entry))
- set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[0]));
-
- entry = glade_xml_get_widget(editor->gui, "entry-phone2");
- if (entry && GTK_IS_ENTRY(entry))
- set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[1]));
-
- entry = glade_xml_get_widget(editor->gui, "entry-phone3");
- if (entry && GTK_IS_ENTRY(entry))
- set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[2]));
-
- entry = glade_xml_get_widget(editor->gui, "entry-phone4");
- if (entry && GTK_IS_ENTRY(entry))
- set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[3]));
-
- entry = glade_xml_get_widget(editor->gui, "entry-email1");
- if (entry && GTK_IS_ENTRY(entry))
- set_field(GTK_ENTRY(entry), e_card_simple_get_email(editor->simple, editor->email_choice));
-
- set_address_field(editor, -1);
-}
-
-static void
-set_address_field(EContactEditor *editor, int result)
-{
- GtkWidget *widget;
-
- widget = glade_xml_get_widget(editor->gui, "text-address");
-
- if (widget && GTK_IS_TEXT(widget)) {
- int position;
- GtkEditable *editable;
- const ECardAddrLabel *address;
-
- if (result == -1)
- result = editor->address_choice;
- editor->address_choice = -1;
-
- position = 0;
- editable = GTK_EDITABLE(widget);
- gtk_editable_delete_text(editable, 0, -1);
- address = e_card_simple_get_address(editor->simple, result);
- if (address && address->data)
- gtk_editable_insert_text(editable, address->data, strlen(address->data), &position);
-
- editor->address_choice = result;
- }
-}
-
-static void
-add_field_callback(GtkWidget *widget, EContactEditor *editor)
-{
- const char *name;
- int i;
- static const char *builtins[] = {
- "entry-fullname",
- "entry-web",
- "entry-company",
- "entry-department",
- "entry-office",
- "entry-jobtitle",
- "entry-profession",
- "entry-manager",
- "entry-assistant",
- "entry-nickname",
- "entry-spouse",
- "text-comments",
- "entry-categories",
- "entry-contacts",
- "entry-file-as",
- "dateedit-anniversary",
- "dateedit-birthday",
- "entry-phone1",
- "entry-phone2",
- "entry-phone3",
- "entry-phone4",
- "entry-email1",
- "text-address",
- "checkbutton-mailingaddress",
- "checkbutton-htmlmail",
- NULL
- };
- name = glade_get_widget_name(widget);
- if (name) {
- for (i = 0; builtins[i]; i++) {
- if (!strcmp(name, builtins[i]))
- return;
- }
- if (GTK_IS_ENTRY(widget) || GTK_IS_TEXT(widget)) {
- editor->arbitrary_fields = g_list_prepend(editor->arbitrary_fields, g_strdup(name));
- }
- }
-}
-
-struct {
- char *id;
- char *key;
-} field_mapping [] = {
- { "entry-fullname", "full_name" },
- { "entry-web", "url" },
- { "entry-company", "org" },
- { "entry-department", "org_unit" },
- { "entry-office", "office" },
- { "entry-jobtitle", "title" },
- { "entry-profession", "role" },
- { "entry-manager", "manager" },
- { "entry-assistant", "assistant" },
- { "entry-nickname", "nickname" },
- { "entry-spouse", "spouse" },
- { "text-comments", "note" },
- { "entry-categories", "categories" },
-};
-
-static void
-fill_in_field(EContactEditor *editor, char *id, char *value)
-{
- GtkWidget *widget = glade_xml_get_widget(editor->gui, id);
- if (widget && GTK_IS_EDITABLE(widget)) {
- int position = 0;
- GtkEditable *editable = GTK_EDITABLE(widget);
- gtk_editable_delete_text(editable, 0, -1);
- if (value)
- gtk_editable_insert_text(editable, value, strlen(value), &position);
- }
-}
-
-static void
-fill_in_card_field(EContactEditor *editor, ECard *card, char *id, char *key)
-{
- char *string;
- gtk_object_get(GTK_OBJECT(card),
- key, &string,
- NULL);
- fill_in_field(editor, id, string);
-}
-
-static void
-fill_in_single_field(EContactEditor *editor, char *name)
-{
- ECardSimple *simple = editor->simple;
- GtkWidget *widget = glade_xml_get_widget(editor->gui, name);
- if (widget && GTK_IS_EDITABLE(widget)) {
- int position = 0;
- GtkEditable *editable = GTK_EDITABLE(widget);
- const ECardArbitrary *arbitrary;
-
- gtk_editable_delete_text(editable, 0, -1);
- arbitrary = e_card_simple_get_arbitrary(simple,
- name);
- if (arbitrary && arbitrary->value)
- gtk_editable_insert_text(editable, arbitrary->value, strlen(arbitrary->value), &position);
- }
-}
-
-static void
-fill_in_info(EContactEditor *editor)
-{
- ECard *card = editor->card;
- if (card) {
- char *file_as;
- ECardName *name;
- const ECardDate *anniversary;
- const ECardDate *bday;
- int i;
- GtkWidget *widget;
- GList *list;
-
- gtk_object_get(GTK_OBJECT(card),
- "file_as", &file_as,
- "name", &name,
- "anniversary", &anniversary,
- "birth_date", &bday,
- NULL);
-
- for (i = 0; i < sizeof(field_mapping) / sizeof(field_mapping[0]); i++) {
- fill_in_card_field(editor, card, field_mapping[i].id, field_mapping[i].key);
- }
-
- for (list = editor->arbitrary_fields; list; list = list->next) {
- fill_in_single_field(editor, list->data);
- }
-
- /* File as has to come after company and name or else it'll get messed up when setting them. */
- fill_in_field(editor, "entry-file-as", file_as);
-
- e_card_name_free(editor->name);
- editor->name = e_card_name_copy(name);
-
- widget = glade_xml_get_widget(editor->gui, "dateedit-anniversary");
- if (anniversary && widget && GNOME_IS_DATE_EDIT(widget)) {
- struct tm time_struct = {0,0,0,0,0,0,0,0,0};
- time_t time_val;
- GnomeDateEdit *dateedit;
-
- time_struct.tm_mday = anniversary->day;
- time_struct.tm_mon = anniversary->month - 1;
- time_struct.tm_year = anniversary->year - 1900;
- time_val = mktime(&time_struct);
- dateedit = GNOME_DATE_EDIT(widget);
- gnome_date_edit_set_time(dateedit, time_val);
- }
-
- widget = glade_xml_get_widget(editor->gui, "dateedit-birthday");
- if (bday && widget && GNOME_IS_DATE_EDIT(widget)) {
- struct tm time_struct = {0,0,0,0,0,0,0,0,0};
- time_t time_val;
- GnomeDateEdit *dateedit;
- time_struct.tm_mday = bday->day;
- time_struct.tm_mon = bday->month - 1;
- time_struct.tm_year = bday->year - 1900;
- time_val = mktime(&time_struct);
- dateedit = GNOME_DATE_EDIT(widget);
- gnome_date_edit_set_time(dateedit, time_val);
- }
-
- set_fields(editor);
- }
-}
-
-static void
-extract_field(EContactEditor *editor, ECard *card, char *editable_id, char *key)
-{
- GtkWidget *widget = glade_xml_get_widget(editor->gui, editable_id);
- if (widget && GTK_IS_EDITABLE(widget)) {
- GtkEditable *editable = GTK_EDITABLE(widget);
- char *string = gtk_editable_get_chars(editable, 0, -1);
- if (string && *string)
- gtk_object_set(GTK_OBJECT(card),
- key, string,
- NULL);
- else
- gtk_object_set(GTK_OBJECT(card),
- key, NULL,
- NULL);
- g_free(string);
- }
-}
-
-static void
-extract_single_field(EContactEditor *editor, char *name)
-{
- GtkWidget *widget = glade_xml_get_widget(editor->gui, name);
- ECardSimple *simple = editor->simple;
- if (widget && GTK_IS_EDITABLE(widget)) {
- GtkEditable *editable = GTK_EDITABLE(widget);
- char *string = gtk_editable_get_chars(editable, 0, -1);
-
- if (string && *string)
- e_card_simple_set_arbitrary(simple,
- name,
- NULL,
- string);
- else
- e_card_simple_set_arbitrary(simple,
- name,
- NULL,
- NULL);
- g_free(string);
- }
-}
-
-static void
-extract_info(EContactEditor *editor)
-{
- ECard *card = editor->card;
- if (card) {
- ECardDate *anniversary;
- ECardDate *bday;
- struct tm time_struct;
- time_t time_val;
- int i;
- GtkWidget *widget;
- GList *list;
-
- widget = glade_xml_get_widget(editor->gui, "entry-file-as");
- if (widget && GTK_IS_EDITABLE(widget)) {
- GtkEditable *editable = GTK_EDITABLE(widget);
- char *string = gtk_editable_get_chars(editable, 0, -1);
- if (string && *string)
- gtk_object_set(GTK_OBJECT(card),
- "file_as", string,
- NULL);
- g_free(string);
- }
-
- for (i = 0; i < sizeof(field_mapping) / sizeof(field_mapping[0]); i++) {
- extract_field(editor, card, field_mapping[i].id, field_mapping[i].key);
- }
-
- for (list = editor->arbitrary_fields; list; list = list->next) {
- extract_single_field(editor, list->data);
- }
-
- if (editor->name)
- gtk_object_set(GTK_OBJECT(card),
- "name", editor->name,
- NULL);
-
- widget = glade_xml_get_widget(editor->gui, "dateedit-anniversary");
- if (widget && GNOME_IS_DATE_EDIT(widget)) {
- time_val = gnome_date_edit_get_date(GNOME_DATE_EDIT(widget));
- gmtime_r(&time_val,
- &time_struct);
- anniversary = g_new(ECardDate, 1);
- anniversary->day = time_struct.tm_mday;
- anniversary->month = time_struct.tm_mon + 1;
- anniversary->year = time_struct.tm_year + 1900;
- gtk_object_set(GTK_OBJECT(card),
- "anniversary", anniversary,
- NULL);
- }
-
- widget = glade_xml_get_widget(editor->gui, "dateedit-birthday");
- if (widget && GNOME_IS_DATE_EDIT(widget)) {
- time_val = gnome_date_edit_get_date(GNOME_DATE_EDIT(widget));
- gmtime_r(&time_val,
- &time_struct);
- bday = g_new(ECardDate, 1);
- bday->day = time_struct.tm_mday;
- bday->month = time_struct.tm_mon + 1;
- bday->year = time_struct.tm_year + 1900;
- gtk_object_set(GTK_OBJECT(card),
- "birth_date", bday,
- NULL);
- }
- }
-}
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 de14b84ca3..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <glade/glade.h>
-#include <bonobo.h>
-#include <ebook/e-card.h>
-#include <ebook/e-card-simple.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* 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_CONTACT_EDITOR_TYPE (e_contact_editor_get_type ())
-#define E_CONTACT_EDITOR(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_TYPE, EContactEditor))
-#define E_CONTACT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_TYPE, EContactEditorClass))
-#define E_IS_CONTACT_EDITOR(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_TYPE))
-#define E_IS_CONTACT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_TYPE))
-
-
-typedef struct _EContactEditor EContactEditor;
-typedef struct _EContactEditorClass EContactEditorClass;
-
-struct _EContactEditor
-{
- GtkObject object;
-
- /* item specific fields */
- ECard *card;
- ECardSimple *simple;
-
- /* UI handler */
- BonoboUIHandler *uih;
-
- GladeXML *gui;
- GtkWidget *app;
- GnomeUIInfo *email_info;
- GnomeUIInfo *phone_info;
- GnomeUIInfo *address_info;
- GtkWidget *email_popup;
- GtkWidget *phone_popup;
- GtkWidget *address_popup;
- GList *email_list;
- GList *phone_list;
- GList *address_list;
-
- ECardName *name;
- char *company;
-
- ECardSimpleEmailId email_choice;
- ECardSimplePhoneId phone_choice[4];
- ECardSimpleAddressId address_choice;
-
- GList *arbitrary_fields;
-
- /* Whether we are editing a new card or an existing one */
- guint is_new_card : 1;
-};
-
-struct _EContactEditorClass
-{
- GtkObjectClass parent_class;
-
- /* Notification signals */
-
- void (* add_card) (EContactEditor *ce, ECard *card);
- void (* commit_card) (EContactEditor *ce, ECard *card);
- void (* delete_card) (EContactEditor *ce, ECard *card);
- void (* editor_closed) (EContactEditor *ce);
-};
-
-
-EContactEditor *e_contact_editor_new (ECard *card, gboolean is_new_card);
-GtkType e_contact_editor_get_type (void);
-
-
-gboolean e_contact_editor_confirm_delete(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CONTACT_EDITOR_H__ */
diff --git a/addressbook/gui/contact-editor/e-contact-save-as.c b/addressbook/gui/contact-editor/e-contact-save-as.c
deleted file mode 100644
index 51cb2619e7..0000000000
--- a/addressbook/gui/contact-editor/e-contact-save-as.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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-save-as.h>
-#include <e-util/e-util.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-typedef struct {
- GtkFileSelection *filesel;
- ECard *card;
-} SaveAsInfo;
-
-static void
-save_it(GtkWidget *widget, SaveAsInfo *info)
-{
- char *vcard = e_card_get_vcard(info->card);
- const char *filename = gtk_file_selection_get_filename(info->filesel);
- e_write_file(filename, vcard, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC);
- g_free(vcard);
- gtk_object_unref(GTK_OBJECT(info->card));
- gtk_widget_destroy(GTK_WIDGET(info->filesel));
- g_free(info);
-}
-
-static void
-close_it(GtkWidget *widget, SaveAsInfo *info)
-{
- gtk_object_unref(GTK_OBJECT(info->card));
- gtk_widget_destroy(GTK_WIDGET(info->filesel));
- g_free(info);
-}
-
-static void
-delete_it(GtkWidget *widget, SaveAsInfo *info)
-{
- gtk_object_unref(GTK_OBJECT(info->card));
- g_free(info);
-}
-
-void
-e_contact_save_as(char *title, ECard *card)
-{
- GtkFileSelection *filesel;
- SaveAsInfo *info = g_new(SaveAsInfo, 1);
-
- filesel = GTK_FILE_SELECTION(gtk_file_selection_new(title));
-
- info->filesel = filesel;
- info->card = e_card_duplicate(card);
-
- gtk_signal_connect(GTK_OBJECT(filesel->ok_button), "clicked",
- save_it, info);
- gtk_signal_connect(GTK_OBJECT(filesel->cancel_button), "clicked",
- close_it, info);
- gtk_signal_connect(GTK_OBJECT(filesel), "delete_event",
- delete_it, info);
- gtk_widget_show(GTK_WIDGET(filesel));
-}
diff --git a/addressbook/gui/contact-editor/e-contact-save-as.h b/addressbook/gui/contact-editor/e-contact-save-as.h
deleted file mode 100644
index e6af13e8fd..0000000000
--- a/addressbook/gui/contact-editor/e-contact-save-as.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-save-as.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_SAVE_AS_H__
-#define __E_CONTACT_SAVE_AS_H__
-
-#include <gnome.h>
-#include <glade/glade.h>
-#include <ebook/e-card.h>
-#include <ebook/e-card-simple.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-void
-e_contact_save_as(gchar *title, ECard *card);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CONTACT_EDITOR_H__ */
diff --git a/addressbook/gui/contact-editor/email.png b/addressbook/gui/contact-editor/email.png
deleted file mode 100644
index f3ff02e343..0000000000
--- a/addressbook/gui/contact-editor/email.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/gui/contact-editor/fullname-strings.h b/addressbook/gui/contact-editor/fullname-strings.h
deleted file mode 100644
index 0c84dfdc8f..0000000000
--- a/addressbook/gui/contact-editor/fullname-strings.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Check Full Name");
-gchar *s = N_("_Title:");
-gchar *s = N_("_First:");
-gchar *s = N_("_Middle:");
-gchar *s = N_("_Last:");
-gchar *s = N_("_Suffix:");
-gchar *s = N_("\n"
- "Mr.\n"
- "Mrs.\n"
- "Dr.\n"
- "");
-gchar *s = N_("\n"
- "Sr.\n"
- "Jr.\n"
- "I\n"
- "II\n"
- "III\n"
- "Esq.\n"
- "");
diff --git a/addressbook/gui/contact-editor/fullname.glade b/addressbook/gui/contact-editor/fullname.glade
deleted file mode 100644
index 8f811c5616..0000000000
--- a/addressbook/gui/contact-editor/fullname.glade
+++ /dev/null
@@ -1,391 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>fullname</name>
- <program_name>fullname</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>True</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>fullname-strings.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog-checkfullname</name>
- <visible>False</visible>
- <title>Check Full Name</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>True</modal>
- <allow_shrink>True</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>vbox-container</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table-checkfullname</name>
- <border_width>8</border_width>
- <rows>5</rows>
- <columns>3</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>6</row_spacing>
- <column_spacing>21</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel1</name>
- <label>_Title:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel2</name>
- <label>_First:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel3</name>
- <label>_Middle:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel4</name>
- <label>_Last:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAccelLabel</class>
- <name>accellabel5</name>
- <label>_Suffix:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo-title</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>False</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items>
-Mr.
-Mrs.
-Dr.
-</items>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>entry-title</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo-suffix</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>False</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items>
-Sr.
-Jr.
-I
-II
-III
-Esq.
-</items>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>entry-suffix</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-first</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-middle</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry-last</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>3</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>hbuttonbox1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button2</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/gui/contact-editor/head.png b/addressbook/gui/contact-editor/head.png
deleted file mode 100644
index ca00b75f92..0000000000
--- a/addressbook/gui/contact-editor/head.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/gui/contact-editor/netfreebusy.png b/addressbook/gui/contact-editor/netfreebusy.png
deleted file mode 100644
index 09ec8a2a5c..0000000000
--- a/addressbook/gui/contact-editor/netfreebusy.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/gui/contact-editor/netmeeting.png b/addressbook/gui/contact-editor/netmeeting.png
deleted file mode 100644
index 4cb90c121e..0000000000
--- a/addressbook/gui/contact-editor/netmeeting.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/gui/contact-editor/phone.png b/addressbook/gui/contact-editor/phone.png
deleted file mode 100644
index ebec84ba0b..0000000000
--- a/addressbook/gui/contact-editor/phone.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/gui/contact-editor/snailmail.png b/addressbook/gui/contact-editor/snailmail.png
deleted file mode 100644
index 647ae8f68c..0000000000
--- a/addressbook/gui/contact-editor/snailmail.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/gui/contact-editor/test-editor.c b/addressbook/gui/contact-editor/test-editor.c
deleted file mode 100644
index 80db2fe848..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 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <glade/glade.h>
-#include "e-contact-editor.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@helixcode.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--;
- gtk_object_unref (GTK_OBJECT (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, Helix Code, 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;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "Contact Editor Test", VERSION, argc, argv);
-
- glade_gnome_init ();
-
- cardstr = NULL;
- if (argc == 2)
- cardstr = read_file (argv [1]);
-
- if (cardstr == NULL)
- cardstr = TEST_VCARD;
-
- ce = e_contact_editor_new (e_card_new (cardstr), TRUE);
- gtk_signal_connect (GTK_OBJECT (ce), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), NULL);
-
- ce = e_contact_editor_new (e_card_new (cardstr), TRUE);
- gtk_signal_connect (GTK_OBJECT (ce), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), NULL);
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/gui/contact-editor/web.png b/addressbook/gui/contact-editor/web.png
deleted file mode 100644
index 3211a11b19..0000000000
--- a/addressbook/gui/contact-editor/web.png
+++ /dev/null
Binary files differ
diff --git a/addressbook/gui/minicard/.cvsignore b/addressbook/gui/minicard/.cvsignore
deleted file mode 100644
index 472fd2593f..0000000000
--- a/addressbook/gui/minicard/.cvsignore
+++ /dev/null
@@ -1,12 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-minicard-label-test
-minicard-test
-minicard-view-test
-minicard-widget-test
-reflow-test
diff --git a/addressbook/gui/minicard/Makefile.am b/addressbook/gui/minicard/Makefile.am
deleted file mode 100644
index 17f6d00548..0000000000
--- a/addressbook/gui/minicard/Makefile.am
+++ /dev/null
@@ -1,124 +0,0 @@
-INCLUDES = \
- -DG_LOG_DOMAIN=\"e-minicard\" \
- -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 \
- $(BONOBO_GNOME_CFLAGS)
-
-noinst_LIBRARIES = \
- libeminicard.a
-
-libeminicard_a_SOURCES = \
- e-minicard-control.c \
- e-minicard-control.h \
- e-minicard-label.c \
- e-minicard-label.h \
- e-minicard-view-widget.c \
- e-minicard-view-widget.h \
- e-minicard-view.c \
- e-minicard-view.h \
- e-minicard-widget.c \
- e-minicard-widget.h \
- e-minicard.c \
- e-minicard.h \
- e-reflow-sorted.c \
- e-reflow-sorted.h \
- e-reflow.c \
- e-reflow.h
-
-noinst_PROGRAMS = \
- minicard-widget-test \
- minicard-label-test \
- minicard-test \
- reflow-test \
- minicard-view-test
-
-minicard_label_test_SOURCES = \
- test-minicard-label.c
-
-minicard_label_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEGNORBA_LIBS) \
- libeminicard.a \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/e-util/libeutil.la
-
-minicard_test_SOURCES = \
- test-minicard.c
-
-minicard_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEGNORBA_LIBS) \
- libeminicard.a \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/widgets/e-text/libetext.a
-
-reflow_test_SOURCES = \
- test-reflow.c
-
-reflow_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEGNORBA_LIBS) \
- $(BONOBO_GNOME_LIBS) \
- libeminicard.a \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/widgets/e-text/libetext.a
-
-minicard_view_test_SOURCES = \
- test-minicard-view.c
-
-minicard_view_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEGNORBA_LIBS) \
- $(BONOBO_GNOME_LIBS) \
- libeminicard.a \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/widgets/e-text/libetext.a
-
-minicard_widget_test_SOURCES = \
- e-minicard-widget-test.c
-
-minicard_widget_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEGNORBA_LIBS) \
- $(BONOBO_GNOME_LIBS) \
- libeminicard.a \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/widgets/e-text/libetext.a
diff --git a/addressbook/gui/minicard/e-minicard-control.c b/addressbook/gui/minicard/e-minicard-control.c
deleted file mode 100644
index 7c1838b568..0000000000
--- a/addressbook/gui/minicard/e-minicard-control.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-control.c
- *
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright 1999, 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <bonobo.h>
-
-#include "addressbook/backend/ebook/e-book.h"
-
-#include "e-minicard-control.h"
-#include "e-minicard-widget.h"
-#include "addressbook/backend/ebook/e-card.h"
-
-#if 0
-enum {
- PROP_RUNNING
-} MyArgs;
-
-#define RUNNING_KEY "Clock::Running"
-
-static void
-get_prop (BonoboPropertyBag *bag,
- BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- GtkObject *clock = user_data;
-
- switch (arg_id) {
-
- case PROP_RUNNING:
- {
- gboolean b = GPOINTER_TO_UINT (gtk_object_get_data (clock, RUNNING_KEY));
- BONOBO_ARG_SET_BOOLEAN (arg, b);
- break;
- }
-
- default:
- g_warning ("Unhandled arg %d", arg_id);
- break;
- }
-}
-
-static void
-set_prop (BonoboPropertyBag *bag,
- const BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- GtkClock *clock = user_data;
-
- switch (arg_id) {
-
- case PROP_RUNNING:
- {
- guint i;
-
- i = BONOBO_ARG_GET_BOOLEAN (arg);
-
- if (i)
- gtk_clock_start (clock);
- else
- gtk_clock_stop (clock);
-
- gtk_object_set_data (GTK_OBJECT (clock), RUNNING_KEY,
- GUINT_TO_POINTER (i));
- break;
- }
-
- default:
- g_warning ("Unhandled arg %d", arg_id);
- break;
- }
-}
-#endif
-
-/*
- * 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);
-
- memcpy (data + length,
- buffer->_buffer, buffer->_length);
-
- length += buffer->_length;
-
- CORBA_free (buffer);
- } 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.
- */
-static void
-pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
- Bonobo_Persist_ContentType type, void *data,
- CORBA_Environment *ev)
-{
- ECard *card;
- char *vcard;
- GtkWidget *minicard = data;
-
- if (type && g_strcasecmp (type, "text/vCard") != 0 &&
- g_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;
- }
-
- card = e_card_new(vcard);
- g_free(vcard);
- gtk_object_set(GTK_OBJECT(minicard),
- "card", card,
- NULL);
- gtk_object_unref(GTK_OBJECT(card));
-} /* 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)
-{
- char *vcard;
- ECard *card;
- EMinicardWidget *minicard = data;
- int length;
-
- if (type && g_strcasecmp (type, "text/vCard") != 0 &&
- g_strcasecmp (type, "text/x-vCard") != 0) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Bonobo_Persist_WrongDataType, NULL);
- return;
- }
-
- gtk_object_get (GTK_OBJECT (minicard),
- "card", &card,
- NULL);
- vcard = e_card_get_vcard(card);
- length = strlen (vcard);
- bonobo_stream_client_write (stream, vcard, length, ev);
- g_free (vcard);
-} /* pstream_save */
-
-static CORBA_long
-pstream_get_max_size (BonoboPersistStream *ps, void *data,
- CORBA_Environment *ev)
-{
- GtkWidget *minicard = data;
- ECard *card;
- char *vcard;
- gint length;
-
- gtk_object_get (GTK_OBJECT (minicard),
- "card", &card, NULL);
- vcard = e_card_get_vcard(card);
- length = strlen (vcard);
- g_free (vcard);
-
- return length;
-}
-
-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)
-{
- ECard *card = closure;
- e_book_add_card(book, card, NULL, NULL);
-}
-
-static void
-save_in_addressbook(GtkWidget *button, EMinicardWidget *minicard)
-{
- EBook *book;
- gchar *path, *uri;
- ECard *card;
-
- book = e_book_new ();
-
- if (!book) {
- printf ("%s: %s(): Couldn't create EBook, bailing.\n",
- __FILE__,
- __FUNCTION__);
- return;
- }
-
-
- path = g_concat_dir_and_file (g_get_home_dir (),
- "evolution/local/Contacts/addressbook.db");
- uri = g_strdup_printf ("file://%s", path);
- g_free (path);
-
- gtk_object_get(GTK_OBJECT(minicard),
- "card", &card,
- NULL);
-
- if (! e_book_load_uri (book, uri, book_open_cb, card)) {
- printf ("error calling load_uri!\n");
- }
- g_free(uri);
-}
-
-static BonoboObject *
-e_minicard_control_factory (BonoboGenericFactory *Factory, void *closure)
-{
-#if 0
- BonoboPropertyBag *pb;
-#endif
- BonoboControl *control;
- BonoboPersistStream *stream;
- GtkWidget *minicard;
- GtkWidget *button;
- GtkWidget *vbox;
-
- /* Create the control. */
-
- minicard = e_minicard_widget_new ();
- gtk_widget_show (minicard);
-
- button = gtk_button_new_with_label(_("Save in addressbook"));
- gtk_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(save_in_addressbook), minicard);
- gtk_widget_show (button);
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), minicard, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
- gtk_widget_show (vbox);
-
- control = bonobo_control_new (vbox);
-
- stream = bonobo_persist_stream_new (pstream_load, pstream_save,
- pstream_get_max_size,
- pstream_get_content_types,
- minicard);
-
-#if 0
- /* Create the properties. */
- pb = bonobo_property_bag_new (get_prop, set_prop, clock);
- bonobo_control_set_property_bag (control, pb);
-
- bonobo_property_bag_add (pb, "running", PROP_RUNNING,
- BONOBO_ARG_BOOLEAN, NULL,
- "Whether or not the clock is running", 0);
-#endif
-
- if (stream == NULL) {
- bonobo_object_unref (BONOBO_OBJECT (control));
- return NULL;
- }
-
- bonobo_object_add_interface (BONOBO_OBJECT (control),
- BONOBO_OBJECT (stream));
-
- return BONOBO_OBJECT (control);
-}
-
-void
-e_minicard_control_factory_init (void)
-{
- static BonoboGenericFactory *factory = NULL;
-
- if (factory != NULL)
- return;
-
-#if USING_OAF
- factory =
- bonobo_generic_factory_new (
- "OAFIID:control-factory:e_minicard:16bb7c25-c7d2-46dc-a5f0-a0975d0e0595",
- e_minicard_control_factory, NULL);
-#else
- factory =
- bonobo_generic_factory_new (
- "control-factory:e-minicard",
- e_minicard_control_factory, NULL);
-#endif
-
- if (factory == NULL)
- g_error ("I could not register a EMinicard control factory.");
-}
diff --git a/addressbook/gui/minicard/e-minicard-control.gnorba b/addressbook/gui/minicard/e-minicard-control.gnorba
deleted file mode 100644
index 73daffd203..0000000000
--- a/addressbook/gui/minicard/e-minicard-control.gnorba
+++ /dev/null
@@ -1,24 +0,0 @@
-[control-factory:clock]
-type=exe
-repo_id=IDL:Bonobo/GenericFactory:1.0
-description=Factory for the sample BonoboClock control
-location_info=sample-control-factory
-
-[control:clock]
-type=factory
-repo_id=IDL:BonoboControl/clock-control:1.0 IDL:Bonobo/Control:1.0
-description=A sample Bonobo control which displays a clock.
-location_info=control-factory:clock
-
-[control-factory:entry]
-type=exe
-repo_id=IDL:Bonobo/GenericFactory:1.0
-description=Factory for the sample GtkEntry control
-location_info=sample-control-factory
-
-[control:entry]
-type=factory
-repo_id=IDL:BonoboControl/entry-control:1.0 IDL:Bonobo/Control:1.0
-description=A sample Bonbobo control wrapping a Gtk Entry widget.
-location_info=control-factory:entry
-
diff --git a/addressbook/gui/minicard/e-minicard-control.h b/addressbook/gui/minicard/e-minicard-control.h
deleted file mode 100644
index 4a0da88435..0000000000
--- a/addressbook/gui/minicard/e-minicard-control.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __E_MINICARD_CONTROL_H__
-#define __E_MINICARD_CONTROL_H__
-
-#include <bonobo/bonobo-control.h>
-
-void e_minicard_control_factory_init (void);
-
-#endif /* __E_MINICARD_CONTROL_H__ */
diff --git a/addressbook/gui/minicard/e-minicard-label.c b/addressbook/gui/minicard/e-minicard-label.c
deleted file mode 100644
index e765a89f21..0000000000
--- a/addressbook/gui/minicard/e-minicard-label.c
+++ /dev/null
@@ -1,446 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-label.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-minicard-label.h"
-#include "e-text.h"
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-#include <e-util/e-canvas-utils.h>
-
-static void e_minicard_label_init (EMinicardLabel *card);
-static void e_minicard_label_class_init (EMinicardLabelClass *klass);
-static void e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_minicard_label_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-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_resize_children( EMinicardLabel *e_minicard_label );
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_HAS_FOCUS,
- ARG_FIELD,
- ARG_FIELDNAME,
- ARG_TEXT_MODEL,
- ARG_MAX_FIELD_NAME_WIDTH,
-};
-
-GtkType
-e_minicard_label_get_type (void)
-{
- static GtkType minicard_label_type = 0;
-
- if (!minicard_label_type)
- {
- static const GtkTypeInfo minicard_label_info =
- {
- "EMinicardLabel",
- sizeof (EMinicardLabel),
- sizeof (EMinicardLabelClass),
- (GtkClassInitFunc) e_minicard_label_class_init,
- (GtkObjectInitFunc) e_minicard_label_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- minicard_label_type = gtk_type_unique (gnome_canvas_group_get_type (), &minicard_label_info);
- }
-
- return minicard_label_type;
-}
-
-static void
-e_minicard_label_class_init (EMinicardLabelClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- gtk_object_add_arg_type ("EMinicardLabel::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("EMinicardLabel::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("EMinicardLabel::has_focus", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_HAS_FOCUS);
- gtk_object_add_arg_type ("EMinicardLabel::field", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_FIELD);
- gtk_object_add_arg_type ("EMinicardLabel::fieldname", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_FIELDNAME);
- gtk_object_add_arg_type ("EMinicardLabel::text_model", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_TEXT_MODEL);
- gtk_object_add_arg_type ("EMinicardLabel::max_field_name_length", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MAX_FIELD_NAME_WIDTH);
-
- object_class->set_arg = e_minicard_label_set_arg;
- object_class->get_arg = e_minicard_label_get_arg;
- /* object_class->destroy = e_minicard_label_destroy; */
-
- /* 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_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EMinicardLabel *e_minicard_label;
-
- item = GNOME_CANVAS_ITEM (o);
- e_minicard_label = E_MINICARD_LABEL (o);
-
- switch (arg_id){
- case ARG_WIDTH:
- e_minicard_label->width = GTK_VALUE_DOUBLE (*arg);
- e_minicard_label_resize_children(e_minicard_label);
- e_canvas_item_request_reflow (item);
- break;
- case ARG_HAS_FOCUS:
- if (e_minicard_label->field && (GTK_VALUE_ENUM(*arg) != E_FOCUS_NONE))
- e_canvas_item_grab_focus(e_minicard_label->field);
- break;
- case ARG_FIELD:
- gnome_canvas_item_set( e_minicard_label->field, "text", GTK_VALUE_STRING (*arg), NULL );
- break;
- case ARG_FIELDNAME:
- gnome_canvas_item_set( e_minicard_label->fieldname, "text", GTK_VALUE_STRING (*arg), NULL );
- break;
- case ARG_TEXT_MODEL:
- gnome_canvas_item_set( e_minicard_label->field, "model", GTK_VALUE_OBJECT (*arg), NULL);
- break;
- case ARG_MAX_FIELD_NAME_WIDTH:
- e_minicard_label->max_field_name_length = GTK_VALUE_DOUBLE (*arg);
- break;
- }
-}
-
-static void
-e_minicard_label_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicardLabel *e_minicard_label;
- char *temp;
- ETextModel *tempmodel;
-
- e_minicard_label = E_MINICARD_LABEL (object);
-
- switch (arg_id) {
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_minicard_label->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = e_minicard_label->height;
- break;
- case ARG_HAS_FOCUS:
- GTK_VALUE_ENUM (*arg) = e_minicard_label->has_focus ? E_FOCUS_CURRENT : E_FOCUS_NONE;
- break;
- case ARG_FIELD:
- gtk_object_get( GTK_OBJECT( e_minicard_label->field ), "text", &temp, NULL );
- GTK_VALUE_STRING (*arg) = temp;
- break;
- case ARG_FIELDNAME:
- gtk_object_get( GTK_OBJECT( e_minicard_label->fieldname ), "text", &temp, NULL );
- GTK_VALUE_STRING (*arg) = temp;
- break;
- case ARG_TEXT_MODEL:
- gtk_object_get( GTK_OBJECT( e_minicard_label->field ), "model", &tempmodel, NULL );
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(tempmodel);
- break;
- case ARG_MAX_FIELD_NAME_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_minicard_label->max_field_name_length;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_minicard_label_realize (GnomeCanvasItem *item)
-{
- if (GNOME_CANVAS_ITEM_CLASS( parent_class )->realize)
- (* GNOME_CANVAS_ITEM_CLASS( parent_class )->realize) (item);
-
- e_canvas_item_request_reflow(item);
-
- if (!item->canvas->aa)
- {
- }
-}
-
-void
-e_minicard_label_construct (GnomeCanvasItem *item)
-{
- EMinicardLabel *e_minicard_label;
- GnomeCanvasGroup *group;
- static GdkFont *font = NULL;
-
- if (font == NULL) {
- font = gdk_font_load("lucidasans-10");
- }
-
- e_minicard_label = E_MINICARD_LABEL (item);
- group = GNOME_CANVAS_GROUP( 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,
- "font_gdk", font,
- "fill_color", "black",
- 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,
- "font_gdk", font,
- "fill_color", "black",
- "editable", TRUE,
- NULL );
- e_canvas_item_move_absolute(e_minicard_label->field, ( e_minicard_label->width / 2 + 2), 1);
-
- 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 (!item->canvas->aa)
- {
- }
-
- 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_FOCUS_CHANGE:
- {
- GdkEventFocus *focus_event = (GdkEventFocus *) event;
- if ( focus_event->in )
- {
- gnome_canvas_item_set( e_minicard_label->rect,
- "outline_color", "grey50",
- "fill_color", "grey90",
- NULL );
- e_minicard_label->has_focus = TRUE;
- }
- else
- {
- gnome_canvas_item_set( e_minicard_label->rect,
- "outline_color", NULL,
- "fill_color", NULL,
- NULL );
- e_minicard_label->has_focus = FALSE;
- }
- }
- break;
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- case GDK_MOTION_NOTIFY:
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY: {
- gboolean return_val;
-#if 0
- GnomeCanvasItem *field;
- ArtPoint p;
- double inv[6], affine[6];
-
- field = e_minicard_label->field;
- art_affine_identity (affine);
-
- if (field->xform != NULL) {
- if (field->object.flags & GNOME_CANVAS_ITEM_AFFINE_FULL) {
- art_affine_multiply (affine, affine, field->xform);
- } else {
- affine[4] += field->xform[0];
- affine[5] += field->xform[1];
- }
- }
-
- art_affine_invert (inv, affine);
- switch(event->type) {
- case GDK_MOTION_NOTIFY:
- p.x = event->motion.x;
- p.y = event->motion.y;
- art_affine_point (&p, &p, inv);
- event->motion.x = p.x;
- event->motion.y = p.y;
- break;
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- p.x = event->button.x;
- p.y = event->button.y;
- art_affine_point (&p, &p, inv);
- event->button.x = p.x;
- event->button.y = p.y;
- break;
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- p.x = event->crossing.x;
- p.y = event->crossing.y;
- art_affine_point (&p, &p, inv);
- event->crossing.x = p.x;
- event->crossing.y = p.y;
- break;
- default:
- break;
- }
-#endif
- gtk_signal_emit_by_name(GTK_OBJECT(e_minicard_label->field), "event", event, &return_val);
- return return_val;
- 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_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) ( left_width ),
- NULL );
- gnome_canvas_item_set( e_minicard_label->field,
- "clip_width", (double) ( e_minicard_label->width - 8 - left_width ),
- NULL );
-}
-
-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;
-
- gtk_object_get(GTK_OBJECT(e_minicard_label->fieldname),
- "text_height", &text_height,
- NULL);
-
- e_minicard_label->height = text_height;
-
-
- gtk_object_get(GTK_OBJECT(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 );
-
- 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);
- e_minicard_label_construct(item);
- return item;
-}
-
diff --git a/addressbook/gui/minicard/e-minicard-label.h b/addressbook/gui/minicard/e-minicard-label.h
deleted file mode 100644
index 08eb51ee53..0000000000
--- a/addressbook/gui/minicard/e-minicard-label.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-label.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.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_MINICARD_LABEL_TYPE (e_minicard_label_get_type ())
-#define E_MINICARD_LABEL(obj) (GTK_CHECK_CAST ((obj), E_MINICARD_LABEL_TYPE, EMinicardLabel))
-#define E_MINICARD_LABEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_MINICARD_LABEL_TYPE, EMiniCardLabelClass))
-#define E_IS_MINICARD_LABEL(obj) (GTK_CHECK_TYPE ((obj), E_MINICARD_LABEL_TYPE))
-#define E_IS_MINICARD_LABEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_MINICARD_LABEL_TYPE))
-
-
-typedef struct _EMinicardLabel EMinicardLabel;
-typedef struct _EMinicardLabelClass EMinicardLabelClass;
-
-struct _EMinicardLabel
-{
- GnomeCanvasGroup parent;
-
- /* item specific fields */
- double width;
- double height;
- double max_field_name_length;
- GnomeCanvasItem *fieldname;
- GnomeCanvasItem *field;
- GnomeCanvasItem *rect;
-
- gboolean has_focus;
-};
-
-struct _EMinicardLabelClass
-{
- GnomeCanvasGroupClass parent_class;
-};
-
-
-GtkType 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/minicard/e-minicard-view-widget.c b/addressbook/gui/minicard/e-minicard-view-widget.c
deleted file mode 100644
index cd1a999f14..0000000000
--- a/addressbook/gui/minicard/e-minicard-view-widget.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-view-widget.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-util/e-canvas.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_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_minicard_view_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_minicard_view_widget_destroy (GtkObject *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_realize (GtkWidget *widget);
-
-static ECanvasClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_BOOK,
- ARG_QUERY
-};
-
-GtkType
-e_minicard_view_widget_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type)
- {
- static const GtkTypeInfo info =
- {
- "EMinicardViewWidget",
- sizeof (EMinicardViewWidget),
- sizeof (EMinicardViewWidgetClass),
- (GtkClassInitFunc) e_minicard_view_widget_class_init,
- (GtkObjectInitFunc) e_minicard_view_widget_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (e_canvas_get_type (), &info);
- }
-
- return type;
-}
-
-static void
-e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- ECanvasClass *canvas_class;
-
- object_class = (GtkObjectClass*) klass;
- widget_class = GTK_WIDGET_CLASS (klass);
- canvas_class = E_CANVAS_CLASS (klass);
-
- parent_class = gtk_type_class (e_canvas_get_type ());
-
- gtk_object_add_arg_type ("EMinicardViewWidget::book", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_BOOK);
- gtk_object_add_arg_type ("EMinicardViewWidget::query", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_QUERY);
-
- object_class->set_arg = e_minicard_view_widget_set_arg;
- object_class->get_arg = e_minicard_view_widget_get_arg;
- object_class->destroy = e_minicard_view_widget_destroy;
-
- 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;
-}
-
-static void
-e_minicard_view_widget_init (EMinicardViewWidget *view)
-{
- view->emv = NULL;
- view->rect = NULL;
-
- view->book = NULL;
- view->query = NULL;
-}
-
-GtkWidget *
-e_minicard_view_widget_new (void)
-{
- return GTK_WIDGET (gtk_type_new (e_minicard_view_widget_get_type ()));
-}
-
-static void
-e_minicard_view_widget_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EMinicardViewWidget *emvw;
-
- emvw = E_MINICARD_VIEW_WIDGET (o);
-
- switch (arg_id){
- case ARG_BOOK:
- if (emvw->book)
- gtk_object_unref(GTK_OBJECT(emvw->book));
- emvw->book = E_BOOK(GTK_VALUE_OBJECT (*arg));
- if (emvw->book)
- gtk_object_ref(GTK_OBJECT(emvw->book));
- if (emvw->emv)
- gtk_object_set(GTK_OBJECT(emvw->emv),
- "book", emvw->book,
- NULL);
- break;
- case ARG_QUERY:
- emvw->query = g_strdup(GTK_VALUE_STRING (*arg));
- if (emvw->emv)
- gtk_object_set(GTK_OBJECT(emvw->emv),
- "query", emvw->query,
- NULL);
- break;
- }
-}
-
-static void
-e_minicard_view_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicardViewWidget *emvw;
-
- emvw = E_MINICARD_VIEW_WIDGET (object);
-
- switch (arg_id) {
- case ARG_BOOK:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(emvw->book);
- break;
- case ARG_QUERY:
- GTK_VALUE_STRING (*arg) = g_strdup(emvw->query);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_minicard_view_widget_destroy (GtkObject *object)
-{
- EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(object);
-
- if (view->book)
- gtk_object_unref(GTK_OBJECT(view->book));
- g_free(view->query);
-
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
-}
-
-static void
-e_minicard_view_widget_realize (GtkWidget *widget)
-{
- EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(widget);
-
- view->rect = gnome_canvas_item_new(
- gnome_canvas_root( GNOME_CANVAS(view) ),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) 100,
- "y2", (double) 100,
- "fill_color", "white",
- 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,
- NULL );
- gtk_object_set(GTK_OBJECT(view->emv),
- "book", view->book,
- "query", view->query,
- NULL);
-
- 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 );
- gtk_object_get(GTK_OBJECT(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);
- gnome_canvas_item_set( view->rect,
- "x2", (double) width,
- "y2", (double) allocation->height,
- NULL );
- }
-}
-
-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);
-
- gtk_object_get(GTK_OBJECT(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.width - 1);
- gnome_canvas_item_set( view->rect,
- "x2", (double) width,
- "y2", (double) GTK_WIDGET(canvas)->allocation.height,
- NULL );
-}
-
-void
-e_minicard_view_widget_remove_selection(EMinicardViewWidget *view,
- EBookCallback cb,
- gpointer closure)
-{
- if (view->emv)
- e_minicard_view_remove_selection(E_MINICARD_VIEW(view->emv), cb, closure);
-}
-
-void e_minicard_view_widget_jump_to_letter (EMinicardViewWidget *view,
- char letter)
-{
- if (view->emv)
- e_minicard_view_jump_to_letter(E_MINICARD_VIEW(view->emv), letter);
-}
diff --git a/addressbook/gui/minicard/e-minicard-view-widget.h b/addressbook/gui/minicard/e-minicard-view-widget.h
deleted file mode 100644
index 340fb1e03c..0000000000
--- a/addressbook/gui/minicard/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 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-minicard-view.h"
-#include "e-util/e-canvas.h"
-#include <ebook/e-book.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_MINICARD_VIEW_WIDGET_TYPE (e_minicard_view_widget_get_type ())
-#define E_MINICARD_VIEW_WIDGET(obj) (GTK_CHECK_CAST ((obj), E_MINICARD_VIEW_WIDGET_TYPE, EMinicardViewWidget))
-#define E_MINICARD_VIEW_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_MINICARD_VIEW_WIDGET_TYPE, EMinicardViewWidgetClass))
-#define E_IS_MINICARD_VIEW_WIDGET(obj) (GTK_CHECK_TYPE ((obj), E_MINICARD_VIEW_WIDGET_TYPE))
-#define E_IS_MINICARD_VIEW_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_MINICARD_VIEW_WIDGET_TYPE))
-
-
-typedef struct _EMinicardViewWidget EMinicardViewWidget;
-typedef struct _EMinicardViewWidgetClass EMinicardViewWidgetClass;
-
-struct _EMinicardViewWidget
-{
- ECanvas parent;
-
- GnomeCanvasItem *rect;
- GnomeCanvasItem *emv;
-
- EBook *book;
- char *query;
-};
-
-struct _EMinicardViewWidgetClass
-{
- ECanvasClass parent_class;
-};
-
-GtkType e_minicard_view_widget_get_type (void);
-void e_minicard_view_widget_remove_selection (EMinicardViewWidget *view,
- EBookCallback cb,
- gpointer closure);
-void e_minicard_view_widget_jump_to_letter (EMinicardViewWidget *view,
- char letter);
-
-GtkWidget *e_minicard_view_widget_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_MINICARD_VIEW_WIDGET_H__ */
diff --git a/addressbook/gui/minicard/e-minicard-view.c b/addressbook/gui/minicard/e-minicard-view.c
deleted file mode 100644
index 011ff9158f..0000000000
--- a/addressbook/gui/minicard/e-minicard-view.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-view.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-util/e-canvas.h>
-#include "e-minicard-view.h"
-#include "e-minicard.h"
-#include "e-contact-editor.h"
-static void e_minicard_view_init (EMinicardView *reflow);
-static void e_minicard_view_class_init (EMinicardViewClass *klass);
-static void e_minicard_view_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_minicard_view_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_minicard_view_destroy (GtkObject *object);
-static gboolean e_minicard_view_event (GnomeCanvasItem *item, GdkEvent *event);
-static void canvas_destroy (GtkObject *object, EMinicardView *view);
-static void disconnect_signals (EMinicardView *view);
-
-static EReflowSortedClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_BOOK,
- ARG_QUERY
-};
-
-GtkType
-e_minicard_view_get_type (void)
-{
- static GtkType reflow_type = 0;
-
- if (!reflow_type)
- {
- static const GtkTypeInfo reflow_info =
- {
- "EMinicardView",
- sizeof (EMinicardView),
- sizeof (EMinicardViewClass),
- (GtkClassInitFunc) e_minicard_view_class_init,
- (GtkObjectInitFunc) e_minicard_view_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- reflow_type = gtk_type_unique (e_reflow_sorted_get_type (), &reflow_info);
- }
-
- return reflow_type;
-}
-
-static void
-e_minicard_view_class_init (EMinicardViewClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (e_reflow_sorted_get_type ());
-
- gtk_object_add_arg_type ("EMinicardView::book", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_BOOK);
- gtk_object_add_arg_type ("EMinicardView::query", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_QUERY);
-
- object_class->set_arg = e_minicard_view_set_arg;
- object_class->get_arg = e_minicard_view_get_arg;
- object_class->destroy = e_minicard_view_destroy;
-
- item_class->event = e_minicard_view_event;
-
- /* GnomeCanvasItem method overrides */
-}
-
-static void
-e_minicard_view_init (EMinicardView *view)
-{
- view->book = NULL;
- view->query = g_strdup("(contains \"x-evolution-any-field\" \"\")");
- view->book_view = NULL;
- view->get_view_idle = 0;
- view->create_card_id = 0;
- view->remove_card_id = 0;
- view->modify_card_id = 0;
- view->canvas_destroy_id = 0;
-
- gtk_object_set(GTK_OBJECT(view),
- "empty_message", _("\n\nThere are no items to show in this view\n\n"
- "Double-click here to create a new Contact."),
- NULL);
-
- E_REFLOW_SORTED(view)->compare_func = (GCompareFunc) e_minicard_compare;
- E_REFLOW_SORTED(view)->string_func = (EReflowStringFunc) e_minicard_get_card_id;
-}
-
-static void
-create_card(EBookView *book_view, const GList *cards, EMinicardView *view)
-{
- for (; cards; cards = g_list_next(cards)) {
- GnomeCanvasItem *item = gnome_canvas_item_new(GNOME_CANVAS_GROUP(view),
- e_minicard_get_type(),
- "card", cards->data,
- NULL);
- e_reflow_add_item(E_REFLOW(view), item);
- }
-}
-
-static void
-modify_card(EBookView *book_view, const GList *cards, EMinicardView *view)
-{
- for (; cards; cards = g_list_next(cards)) {
- ECard *card = cards->data;
- gchar *id = e_card_get_id(card);
- GnomeCanvasItem *item = e_reflow_sorted_get_item(E_REFLOW_SORTED(view), id);
- if (item && !GTK_OBJECT_DESTROYED(item)) {
- gnome_canvas_item_set(item,
- "card", card,
- NULL);
- e_reflow_sorted_reorder_item(E_REFLOW_SORTED(view), id);
- }
- }
-}
-
-static void
-remove_card(EBookView *book_view, const char *id, EMinicardView *view)
-{
- e_reflow_sorted_remove_item(E_REFLOW_SORTED(view), id);
-}
-
-static void
-book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure)
-{
- EMinicardView *view = closure;
- disconnect_signals(view);
- if (view->book_view)
- gtk_object_unref(GTK_OBJECT(view->book_view));
-
- if (!view->canvas_destroy_id)
- view->canvas_destroy_id =
- gtk_signal_connect(GTK_OBJECT(GNOME_CANVAS_ITEM(view)->canvas),
- "destroy", GTK_SIGNAL_FUNC(canvas_destroy),
- view);
-
- view->book_view = book_view;
- if (view->book_view)
- gtk_object_ref(GTK_OBJECT(view->book_view));
-
-
- view->create_card_id = gtk_signal_connect(GTK_OBJECT(view->book_view),
- "card_added",
- GTK_SIGNAL_FUNC(create_card),
- view);
- view->remove_card_id = gtk_signal_connect(GTK_OBJECT(view->book_view),
- "card_removed",
- GTK_SIGNAL_FUNC(remove_card),
- view);
- view->modify_card_id = gtk_signal_connect(GTK_OBJECT(view->book_view),
- "card_changed",
- GTK_SIGNAL_FUNC(modify_card),
- view);
-
- g_list_foreach(E_REFLOW(view)->items, (GFunc) gtk_object_unref, NULL);
- g_list_foreach(E_REFLOW(view)->items, (GFunc) gtk_object_destroy, NULL);
- g_list_free(E_REFLOW(view)->items);
- E_REFLOW(view)->items = NULL;
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(view));
-}
-
-static gboolean
-get_view(EMinicardView *view)
-{
- if (view->book && view->query)
- e_book_get_book_view(view->book, view->query, book_view_loaded, view);
-
- view->get_view_idle = 0;
- return FALSE;
-}
-
-static void
-e_minicard_view_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EMinicardView *view;
-
- item = GNOME_CANVAS_ITEM (o);
- view = E_MINICARD_VIEW (o);
-
- switch (arg_id){
- case ARG_BOOK:
- if (view->book)
- gtk_object_unref(GTK_OBJECT(view->book));
- if (GTK_VALUE_OBJECT (*arg)) {
- view->book = E_BOOK(GTK_VALUE_OBJECT (*arg));
- gtk_object_ref(GTK_OBJECT(view->book));
- if (view->get_view_idle == 0)
- view->get_view_idle = g_idle_add((GSourceFunc)get_view, view);
- }
- else
- view->book = NULL;
- break;
- case ARG_QUERY:
- g_free(view->query);
- view->query = g_strdup(GTK_VALUE_STRING (*arg));
- if (view->get_view_idle == 0)
- view->get_view_idle = g_idle_add((GSourceFunc)get_view, view);
- break;
- }
-}
-
-static void
-e_minicard_view_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicardView *e_minicard_view;
-
- e_minicard_view = E_MINICARD_VIEW (object);
-
- switch (arg_id) {
- case ARG_BOOK:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_minicard_view->book);
- break;
- case ARG_QUERY:
- GTK_VALUE_STRING (*arg) = g_strdup(e_minicard_view->query);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_minicard_view_destroy (GtkObject *object)
-{
- EMinicardView *view = E_MINICARD_VIEW(object);
-
- if (view->get_view_idle)
- g_source_remove(view->get_view_idle);
- if (view->canvas_destroy_id)
- gtk_signal_disconnect(GTK_OBJECT (GNOME_CANVAS_ITEM(view)->canvas),
- view->canvas_destroy_id);
- disconnect_signals(view);
- g_free(view->query);
- if (view->book)
- gtk_object_unref(GTK_OBJECT(view->book));
- if (view->book_view)
- gtk_object_unref(GTK_OBJECT(view->book_view));
-
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
-}
-
-static void
-card_added_cb (EBook* book, EBookStatus status, const char *id,
- gpointer user_data)
-{
- g_print ("%s: %s(): a card was added\n", __FILE__, __FUNCTION__);
-}
-
-static void
-card_changed_cb (EBook* book, EBookStatus status, gpointer user_data)
-{
- g_print ("%s: %s(): a card was changed with status %d\n", __FILE__, __FUNCTION__, status);
-}
-
-/* Callback for the add_card signal from the contact editor */
-static void
-add_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_add_card (book, card, card_added_cb, NULL);
-}
-
-/* Callback for the commit_card signal from the contact editor */
-static void
-commit_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_commit_card (book, card, card_changed_cb, NULL);
-}
-
-/* Callback used when the contact editor is closed */
-static void
-editor_closed_cb (EContactEditor *ce, gpointer data)
-{
- gtk_object_unref (GTK_OBJECT (ce));
-}
-
-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)
- {
- ECard *card;
- EContactEditor *ce;
- EBook *book;
-
- card = e_card_new("");
-
- gtk_object_get(GTK_OBJECT(view), "book", &book, NULL);
- g_assert (E_IS_BOOK (book));
-
- ce = e_contact_editor_new (card, TRUE);
-
- gtk_signal_connect (GTK_OBJECT (ce), "add_card",
- GTK_SIGNAL_FUNC (add_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "commit_card",
- GTK_SIGNAL_FUNC (commit_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), NULL);
-
- gtk_object_sink(GTK_OBJECT(card));
- }
- return TRUE;
- default:
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS(parent_class)->event(item, event);
- else
- return FALSE;
- break;
- }
-}
-
-static void
-disconnect_signals(EMinicardView *view)
-{
- if (view->book_view && view->create_card_id)
- gtk_signal_disconnect(GTK_OBJECT (view->book_view),
- view->create_card_id);
- if (view->book_view && view->remove_card_id)
- gtk_signal_disconnect(GTK_OBJECT (view->book_view),
- view->remove_card_id);
- if (view->book_view && view->modify_card_id)
- gtk_signal_disconnect(GTK_OBJECT (view->book_view),
- view->modify_card_id);
-
- view->create_card_id = 0;
- view->remove_card_id = 0;
- view->modify_card_id = 0;
-}
-
-static void
-canvas_destroy(GtkObject *object, EMinicardView *view)
-{
- disconnect_signals(view);
-}
-
-void
-e_minicard_view_remove_selection(EMinicardView *view,
- EBookCallback cb,
- gpointer closure)
-{
- if (view->book) {
- EReflow *reflow = E_REFLOW(view);
- GList *list;
- for (list = reflow->items; list; list = g_list_next(list)) {
- GnomeCanvasItem *item = list->data;
- gboolean has_focus;
- gtk_object_get(GTK_OBJECT(item),
- "has_focus", &has_focus,
- NULL);
- if (has_focus) {
- ECard *card;
- gtk_object_get(GTK_OBJECT(item),
- "card", &card,
- NULL);
- e_book_remove_card(view->book, card, cb, closure);
- return;
- }
- }
- }
-}
-
-static int
-compare_to_letter(EMinicard *card, char *letter)
-{
- g_return_val_if_fail(card != NULL, 0);
- g_return_val_if_fail(E_IS_MINICARD(card), 0);
-
- if (*letter == '1')
- return 1;
-
- if (card->card) {
- char *file_as;
- gtk_object_get(GTK_OBJECT(card->card),
- "file_as", &file_as,
- NULL);
- if (file_as)
- return strncasecmp(file_as, letter, 1);
- else
- return 0;
- } else {
- return 0;
- }
-}
-
-void e_minicard_view_jump_to_letter (EMinicardView *view,
- char letter)
-{
- e_reflow_sorted_jump(E_REFLOW_SORTED(view),
- (GCompareFunc) compare_to_letter,
- &letter);
-}
diff --git a/addressbook/gui/minicard/e-minicard-view.h b/addressbook/gui/minicard/e-minicard-view.h
deleted file mode 100644
index a166a6ade1..0000000000
--- a/addressbook/gui/minicard/e-minicard-view.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-view.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-reflow-sorted.h"
-#include <ebook/e-book.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* 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_MINICARD_VIEW_TYPE (e_minicard_view_get_type ())
-#define E_MINICARD_VIEW(obj) (GTK_CHECK_CAST ((obj), E_MINICARD_VIEW_TYPE, EMinicardView))
-#define E_MINICARD_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_MINICARD_VIEW_TYPE, EMinicardViewClass))
-#define E_IS_MINICARD_VIEW(obj) (GTK_CHECK_TYPE ((obj), E_MINICARD_VIEW_TYPE))
-#define E_IS_MINICARD_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_MINICARD_VIEW_TYPE))
-
-
-typedef struct _EMinicardView EMinicardView;
-typedef struct _EMinicardViewClass EMinicardViewClass;
-
-struct _EMinicardView
-{
- EReflowSorted parent;
-
- /* item specific fields */
- EBook *book;
- char *query;
- EBookView *book_view;
-
- int get_view_idle;
-
- int canvas_destroy_id;
-
- int create_card_id, remove_card_id, modify_card_id;
-};
-
-struct _EMinicardViewClass
-{
- EReflowSortedClass parent_class;
-};
-
-GtkType 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,
- char letter);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_MINICARD_VIEW_H__ */
diff --git a/addressbook/gui/minicard/e-minicard-widget-test.c b/addressbook/gui/minicard/e-minicard-widget-test.c
deleted file mode 100644
index f6489f2a6a..0000000000
--- a/addressbook/gui/minicard/e-minicard-widget-test.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-minicard.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-#define TEST_VCARD \
-"BEGIN:VCARD
-" \
-"FN:Nat
-" \
-"N:Friedman;Nat;D;Mr.
-" \
-"ORG:Helix Code, Inc.
-" \
-"TITLE:Head Geek
-" \
-"ROLE:Programmer/Executive
-" \
-"BDAY:1977-08-06
-" \
-"TEL;WORK:617 679 1984
-" \
-"TEL;CELL:123 456 7890
-" \
-"EMAIL;INTERNET:nat@nat.org
-" \
-"EMAIL;INTERNET:nat@helixcode.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 <gnome.h>
-#include "e-minicard-widget.h"
-
-/* This is a horrible thing to do, but it is just a test. */
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- 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 ( _( "Minicard Widget Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the minicard widget" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *minicard;
- ECard *card;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "Minicard Widget Test", VERSION, argc, argv);
- app = gnome_app_new("Minicard Widget Test", NULL);
-
- minicard = e_minicard_widget_new();
- card = e_card_new(TEST_VCARD);
- gtk_object_set(GTK_OBJECT(minicard),
- "card", card,
- NULL);
-
- gnome_app_set_contents( GNOME_APP( app ), minicard );
-
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/gui/minicard/e-minicard-widget.c b/addressbook/gui/minicard/e-minicard-widget.c
deleted file mode 100644
index 3f765425e4..0000000000
--- a/addressbook/gui/minicard/e-minicard-widget.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-field-chooser.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-minicard-widget.h"
-#include "e-minicard.h"
-
-static void e_minicard_widget_init (EMinicardWidget *card);
-static void e_minicard_widget_class_init (EMinicardWidgetClass *klass);
-static void e_minicard_widget_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_minicard_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_minicard_widget_destroy (GtkObject *object);
-static void e_minicard_widget_size_request (GtkWidget *widget, GtkRequisition *requisition);
-static void e_minicard_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
-static void e_minicard_widget_reflow (ECanvas *canvas);
-
-static ECanvasClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_CARD,
-};
-
-GtkType
-e_minicard_widget_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type)
- {
- static const GtkTypeInfo info =
- {
- "EMinicardWidget",
- sizeof (EMinicardWidget),
- sizeof (EMinicardWidgetClass),
- (GtkClassInitFunc) e_minicard_widget_class_init,
- (GtkObjectInitFunc) e_minicard_widget_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (e_canvas_get_type (), &info);
- }
-
- return type;
-}
-
-static void
-e_minicard_widget_class_init (EMinicardWidgetClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- ECanvasClass *ecanvas_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
- widget_class = GTK_WIDGET_CLASS(klass);
- ecanvas_class = E_CANVAS_CLASS(klass);
-
- parent_class = gtk_type_class (e_canvas_get_type ());
-
- object_class->set_arg = e_minicard_widget_set_arg;
- object_class->get_arg = e_minicard_widget_get_arg;
- object_class->destroy = e_minicard_widget_destroy;
-
- widget_class->size_request = e_minicard_widget_size_request;
- widget_class->size_allocate = e_minicard_widget_size_allocate;
-
- ecanvas_class->reflow = e_minicard_widget_reflow;
-
- gtk_object_add_arg_type ("EMinicardWidget::card", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_CARD);
-}
-
-static void
-e_minicard_widget_size_request(GtkWidget *widget, GtkRequisition *requisition)
-{
- double height;
- EMinicardWidget *emw = E_MINICARD_WIDGET(widget);
- gtk_object_get(GTK_OBJECT(emw->item),
- "height", &height,
- NULL);
- if (height <= 0)
- height = 1;
- widget->requisition.height = height;
- widget->requisition.width = 200;
- requisition->height = height;
- requisition->width = 200;
-}
-
-static void
-e_minicard_widget_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
-{
- double height;
- EMinicardWidget *emw = E_MINICARD_WIDGET(widget);
- gnome_canvas_item_set( emw->item,
- "width", (double) allocation->width,
- NULL );
- gtk_object_get(GTK_OBJECT(emw->item),
- "height", &height,
- NULL);
- height = MAX(height, allocation->height);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( emw ), 0, 0, allocation->width - 1, height - 1);
- gnome_canvas_item_set( emw->rect,
- "x2", (double) allocation->width,
- "y2", (double) height,
- NULL );
- if (GTK_WIDGET_CLASS(parent_class)->size_allocate)
- GTK_WIDGET_CLASS(parent_class)->size_allocate(widget, allocation);
-}
-
-static void e_minicard_widget_reflow(ECanvas *canvas)
-{
- double height;
- EMinicardWidget *emw = E_MINICARD_WIDGET(canvas);
- gtk_object_get(GTK_OBJECT(emw->item),
- "height", &height,
- NULL);
-
- height = MAX(height, GTK_WIDGET(emw)->allocation.height);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS(emw), 0, 0, GTK_WIDGET(emw)->allocation.width - 1, height - 1);
- gnome_canvas_item_set( emw->rect,
- "x2", (double) GTK_WIDGET(emw)->allocation.width,
- "y2", (double) height,
- NULL );
-
- gtk_widget_queue_resize(GTK_WIDGET(canvas));
-}
-
-static void
-e_minicard_widget_init (EMinicardWidget *emw)
-{
- emw->rect = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(emw)),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) 100,
- "y2", (double) 100,
- "fill_color", "white",
- NULL );
-
- emw->item = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(emw)),
- e_minicard_get_type(),
- "width", (double) 100,
- NULL );
-
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( emw ),
- 0, 0,
- 100, 100 );
-
- emw->card = NULL;
-}
-
-static void
-e_minicard_widget_destroy (GtkObject *object)
-{
- EMinicardWidget *emw = E_MINICARD_WIDGET(object);
-
- if (emw->card)
- gtk_object_unref(GTK_OBJECT(emw->card));
-
- if (GTK_OBJECT_CLASS(parent_class)->destroy)
- GTK_OBJECT_CLASS(parent_class)->destroy(object);
-}
-
-GtkWidget*
-e_minicard_widget_new (void)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_minicard_widget_get_type ()));
- return widget;
-}
-
-static void
-e_minicard_widget_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicardWidget *emw = E_MINICARD_WIDGET(object);
-
- switch (arg_id){
- case ARG_CARD:
- if (emw->card)
- gtk_object_unref(GTK_OBJECT(emw->card));
- if (GTK_VALUE_OBJECT(*arg)) {
- emw->card = E_CARD(GTK_VALUE_OBJECT(*arg));
- gtk_object_ref(GTK_OBJECT(emw->card));
- }
- else
- emw->card = NULL;
- if (emw->item)
- gtk_object_set(GTK_OBJECT(emw->item),
- "card", emw->card,
- NULL);
- break;
- default:
- break;
- }
-}
-
-static void
-e_minicard_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicardWidget *emw = E_MINICARD_WIDGET(object);
-
- switch (arg_id) {
- case ARG_CARD:
- if (emw->card)
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(emw->card);
- else
- GTK_VALUE_OBJECT (*arg) = NULL;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
diff --git a/addressbook/gui/minicard/e-minicard-widget.h b/addressbook/gui/minicard/e-minicard-widget.h
deleted file mode 100644
index 8a3ec0ae16..0000000000
--- a/addressbook/gui/minicard/e-minicard-widget.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-widget.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_WIDGET_H__
-#define __E_MINICARD_WIDGET_H__
-
-#include <gnome.h>
-#include "addressbook/backend/ebook/e-card.h"
-#include "e-util/e-canvas.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EMinicardWidget - A card displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- */
-
-#define E_MINICARD_WIDGET_TYPE (e_minicard_widget_get_type ())
-#define E_MINICARD_WIDGET(obj) (GTK_CHECK_CAST ((obj), E_MINICARD_WIDGET_TYPE, EMinicardWidget))
-#define E_MINICARD_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_MINICARD_WIDGET_TYPE, EMinicardWidgetClass))
-#define E_IS_MINICARD_WIDGET(obj) (GTK_CHECK_TYPE ((obj), E_MINICARD_WIDGET_TYPE))
-#define E_IS_MINICARD_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_MINICARD_WIDGET_TYPE))
-
-
-typedef struct _EMinicardWidget EMinicardWidget;
-typedef struct _EMinicardWidgetClass EMinicardWidgetClass;
-
-struct _EMinicardWidget
-{
- ECanvas parent;
-
- /* item specific fields */
- GnomeCanvasItem *item;
-
- GnomeCanvasItem *rect;
- ECard *card;
-};
-
-struct _EMinicardWidgetClass
-{
- ECanvasClass parent_class;
-};
-
-
-GtkWidget *e_minicard_widget_new(void);
-GtkType e_minicard_widget_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_MINICARD_WIDGET_H__ */
diff --git a/addressbook/gui/minicard/e-minicard.c b/addressbook/gui/minicard/e-minicard.c
deleted file mode 100644
index e9bb85c89d..0000000000
--- a/addressbook/gui/minicard/e-minicard.c
+++ /dev/null
@@ -1,797 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-minicard.h"
-#include "e-minicard-label.h"
-#include "e-text.h"
-#include <ebook/e-book.h>
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-#include <e-util/e-canvas-utils.h>
-#include <e-util/e-popup-menu.h>
-#include "addressbook/printing/e-contact-print.h"
-#include "e-contact-editor.h"
-#include "e-contact-save-as.h"
-#include "e-minicard-view.h"
-
-static void e_minicard_init (EMinicard *card);
-static void e_minicard_class_init (EMinicardClass *klass);
-static void e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_minicard_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_minicard_destroy (GtkObject *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_resize_children( EMinicard *e_minicard );
-static void remodel( EMinicard *e_minicard );
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-typedef struct _EMinicardField EMinicardField;
-
-struct _EMinicardField {
- ECardSimpleField field;
- GnomeCanvasItem *label;
-};
-
-#define E_MINICARD_FIELD(field) ((EMinicardField *)(field))
-
-static void
-e_minicard_field_destroy(EMinicardField *field)
-{
- gtk_object_destroy(GTK_OBJECT(field->label));
- g_free(field);
-}
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_HAS_FOCUS,
- ARG_CARD
-};
-
-GtkType
-e_minicard_get_type (void)
-{
- static GtkType minicard_type = 0;
-
- if (!minicard_type)
- {
- static const GtkTypeInfo minicard_info =
- {
- "EMinicard",
- sizeof (EMinicard),
- sizeof (EMinicardClass),
- (GtkClassInitFunc) e_minicard_class_init,
- (GtkObjectInitFunc) e_minicard_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- minicard_type = gtk_type_unique (gnome_canvas_group_get_type (), &minicard_info);
- }
-
- return minicard_type;
-}
-
-static void
-e_minicard_class_init (EMinicardClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- gtk_object_add_arg_type ("EMinicard::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("EMinicard::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("EMinicard::has_focus", GTK_TYPE_ENUM,
- GTK_ARG_READWRITE, ARG_HAS_FOCUS);
- gtk_object_add_arg_type ("EMinicard::card", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_CARD);
-
- object_class->set_arg = e_minicard_set_arg;
- object_class->get_arg = e_minicard_get_arg;
- object_class->destroy = e_minicard_destroy;
-
- /* GnomeCanvasItem method overrides */
- item_class->realize = e_minicard_realize;
- item_class->unrealize = e_minicard_unrealize;
- item_class->event = e_minicard_event;
-}
-
-static void
-e_minicard_init (EMinicard *minicard)
-{
- /* minicard->card = NULL;*/
- minicard->rect = NULL;
- minicard->fields = NULL;
- minicard->width = 10;
- minicard->height = 10;
- minicard->has_focus = FALSE;
-
- minicard->card = NULL;
- minicard->simple = e_card_simple_new(NULL);
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(minicard), e_minicard_reflow);
-}
-
-static void
-e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EMinicard *e_minicard;
-
- item = GNOME_CANVAS_ITEM (o);
- e_minicard = E_MINICARD (o);
-
- switch (arg_id){
- case ARG_WIDTH:
- if (e_minicard->width != GTK_VALUE_DOUBLE (*arg)) {
- e_minicard->width = GTK_VALUE_DOUBLE (*arg);
- e_minicard_resize_children(e_minicard);
- if ( GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED )
- e_canvas_item_request_reflow(item);
- }
- break;
- case ARG_HAS_FOCUS:
- if (e_minicard->fields) {
- if ( GTK_VALUE_ENUM(*arg) == E_FOCUS_START ||
- GTK_VALUE_ENUM(*arg) == E_FOCUS_CURRENT) {
- gnome_canvas_item_set(E_MINICARD_FIELD(e_minicard->fields->data)->label,
- "has_focus", GTK_VALUE_ENUM(*arg),
- NULL);
- } else if ( GTK_VALUE_ENUM(*arg) == E_FOCUS_END ) {
- gnome_canvas_item_set(E_MINICARD_FIELD(g_list_last(e_minicard->fields)->data)->label,
- "has_focus", GTK_VALUE_ENUM(*arg),
- NULL);
- }
- }
- else
- e_canvas_item_grab_focus(item);
- break;
- case ARG_CARD:
- if (e_minicard->card)
- gtk_object_unref (GTK_OBJECT(e_minicard->card));
- e_minicard->card = E_CARD(GTK_VALUE_OBJECT (*arg));
- if (e_minicard->card)
- gtk_object_ref (GTK_OBJECT(e_minicard->card));
- gtk_object_set(GTK_OBJECT(e_minicard->simple),
- "card", e_minicard->card,
- NULL);
- remodel(e_minicard);
- e_canvas_item_request_reflow(item);
- break;
- }
-}
-
-static void
-e_minicard_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicard *e_minicard;
-
- e_minicard = E_MINICARD (object);
-
- switch (arg_id) {
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_minicard->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = e_minicard->height;
- break;
- case ARG_HAS_FOCUS:
- GTK_VALUE_ENUM (*arg) = e_minicard->has_focus ? E_FOCUS_CURRENT : E_FOCUS_NONE;
- break;
- case ARG_CARD:
- e_card_simple_sync_card(e_minicard->simple);
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_minicard->card);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_minicard_destroy (GtkObject *object)
-{
- EMinicard *e_minicard;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_MINICARD (object));
-
- e_minicard = E_MINICARD (object);
-
- g_list_foreach(e_minicard->fields, (GFunc) e_minicard_field_destroy, NULL);
- g_list_free(e_minicard->fields);
-
- if (e_minicard->card)
- gtk_object_unref (GTK_OBJECT(e_minicard->card));
- if (e_minicard->simple)
- gtk_object_unref (GTK_OBJECT(e_minicard->simple));
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-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) e_minicard->width - 1,
- "y2", (double) e_minicard->height - 1,
- "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) e_minicard->width - 3,
- "y2", (double) e_minicard->height - 3,
- "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) ( e_minicard->width - 12 ),
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "font", "lucidasans-bold-10",
- "fill_color_gdk", &canvas->style->fg[GTK_STATE_NORMAL],
- "text", "",
- NULL );
- e_canvas_item_move_absolute(e_minicard->header_text, 6, 6);
-
- remodel(e_minicard);
- e_canvas_item_request_reflow(item);
-
- if (!item->canvas->aa) {
- }
-}
-
-static void
-e_minicard_unrealize (GnomeCanvasItem *item)
-{
- EMinicard *e_minicard;
-
- e_minicard = E_MINICARD (item);
-
- if (!item->canvas->aa)
- {
- }
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item);
-}
-
-static void
-card_added_cb (EBook* book, EBookStatus status, const char *id, gpointer user_data)
-{
- g_print ("%s: %s(): a card was added\n", __FILE__, __FUNCTION__);
-}
-
-static void
-card_changed_cb (EBook* book, EBookStatus status, gpointer user_data)
-{
- g_print ("%s: %s(): a card was changed with status %d\n", __FILE__, __FUNCTION__, status);
-}
-
-static void
-save_as (GtkWidget *widget, EMinicard *minicard)
-{
- e_card_simple_sync_card(minicard->simple);
- e_contact_save_as(_("Save as VCard"), minicard->card);
-}
-
-static void
-delete (GtkWidget *widget, EMinicard *minicard)
-{
- EBook *book;
-
- if (e_contact_editor_confirm_delete()) {
- e_card_simple_sync_card(minicard->simple);
-
- gtk_object_get(GTK_OBJECT(GNOME_CANVAS_ITEM(minicard)->parent),
- "book", &book,
- NULL);
-
- /* Add the card in the contact editor to our ebook */
- e_book_remove_card (book,
- minicard->card,
- card_changed_cb,
- NULL);
- }
-}
-
-static void
-print (GtkWidget *widget, EMinicard *minicard)
-{
- e_card_simple_sync_card(minicard->simple);
-
- gtk_widget_show(e_contact_print_card_dialog_new(minicard->card));
-}
-
-/* Callback for the add_card signal from the contact editor */
-static void
-add_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_add_card (book, card, card_added_cb, NULL);
-}
-
-/* Callback for the commit_card signal from the contact editor */
-static void
-commit_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_commit_card (book, card, card_changed_cb, NULL);
-}
-
-/* Callback for the commit_card signal from the contact editor */
-static void
-delete_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_remove_card (book, card, card_changed_cb, NULL);
-}
-
-/* Callback used when the contact editor is closed */
-static void
-editor_closed_cb (EContactEditor *ce, gpointer data)
-{
- gtk_object_unref (GTK_OBJECT (ce));
-}
-
-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;
- if ( focus_event->in ) {
- gnome_canvas_item_set( e_minicard->rect,
- "outline_color_gdk", &canvas->style->bg[GTK_STATE_NORMAL],
- NULL );
- gnome_canvas_item_set( e_minicard->header_rect,
- "fill_color_gdk", &canvas->style->bg[GTK_STATE_SELECTED],
- NULL );
- gnome_canvas_item_set( e_minicard->header_text,
- "fill_color_gdk", &canvas->style->text[GTK_STATE_SELECTED],
- NULL );
- e_minicard->has_focus = TRUE;
- } else {
- EBook *book = NULL;
-
- e_card_simple_sync_card(e_minicard->simple);
-
- if (E_IS_MINICARD_VIEW(GNOME_CANVAS_ITEM(e_minicard)->parent)) {
-
- gtk_object_get(GTK_OBJECT(GNOME_CANVAS_ITEM(e_minicard)->parent),
- "book", &book,
- NULL);
-
- }
-
- if (book) {
-
- /* Add the card in the contact editor to our ebook */
- e_book_commit_card (book,
- e_minicard->card,
- card_changed_cb,
- NULL);
- } else {
- remodel(e_minicard);
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(e_minicard));
- }
-
- gnome_canvas_item_set( e_minicard->rect,
- "outline_color", NULL,
- NULL );
- gnome_canvas_item_set( e_minicard->header_rect,
- "fill_color_gdk",
- &canvas->style->bg[GTK_STATE_NORMAL],
- NULL );
- gnome_canvas_item_set( e_minicard->header_text,
- "fill_color_gdk",
- &canvas->style->fg[GTK_STATE_NORMAL],
- NULL );
- e_minicard->has_focus = FALSE;
- }
- }
- break;
- case GDK_BUTTON_PRESS:
- if (event->button.button == 1) {
- e_canvas_item_grab_focus(item);
- } else if (event->button.button == 3) {
- if (E_IS_MINICARD_VIEW(item->parent)) {
- EPopupMenu menu[] = { {"Save as VCard", NULL, GTK_SIGNAL_FUNC(save_as), 0},
- {"Print", NULL, GTK_SIGNAL_FUNC(print), 0},
- {"Delete", NULL, GTK_SIGNAL_FUNC(delete), 0},
- {NULL, NULL, NULL, 0}};
- e_popup_menu_run (menu, (GdkEventButton *)event, 0, 0, e_minicard);
- } else {
- EPopupMenu menu[] = { {"Save as VCard", NULL, GTK_SIGNAL_FUNC(save_as), 0},
- {"Print", NULL, GTK_SIGNAL_FUNC(print), 0},
- {NULL, NULL, NULL, 0}};
- e_popup_menu_run (menu, (GdkEventButton *)event, 0, 0, e_minicard);
- }
- }
- break;
-
- case GDK_2BUTTON_PRESS:
- if (event->button.button == 1 && E_IS_MINICARD_VIEW(item->parent)) {
- EContactEditor *ce;
- EBook *book = NULL;
- if (E_IS_MINICARD_VIEW(item->parent)) {
-
- gtk_object_get(GTK_OBJECT(item->parent),
- "book", &book,
- NULL);
- }
- ce = e_contact_editor_new (e_minicard->card, FALSE);
-
- if (book != NULL) {
- gtk_signal_connect (GTK_OBJECT (ce), "add_card",
- GTK_SIGNAL_FUNC (add_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "commit_card",
- GTK_SIGNAL_FUNC (commit_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "delete_card",
- GTK_SIGNAL_FUNC (delete_card_cb), book);
- }
-
- gtk_signal_connect (GTK_OBJECT (ce), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), NULL);
- return TRUE;
- }
- break;
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Tab ||
- event->key.keyval == GDK_KP_Tab ||
- event->key.keyval == GDK_ISO_Left_Tab) {
- GList *list;
- for (list = e_minicard->fields; list; list = list->next) {
- EMinicardField *field = E_MINICARD_FIELD(list->data);
- GnomeCanvasItem *item = field->label;
- EFocus has_focus;
- gtk_object_get(GTK_OBJECT(item),
- "has_focus", &has_focus,
- NULL);
- if (has_focus != E_FOCUS_NONE) {
- if (event->key.state & GDK_SHIFT_MASK)
- list = list->prev;
- else
- list = list->next;
- if (list) {
- EMinicardField *field = E_MINICARD_FIELD(list->data);
- GnomeCanvasItem *item = field->label;
- gnome_canvas_item_set(item,
- "has_focus", (event->key.state & GDK_SHIFT_MASK) ? E_FOCUS_END : E_FOCUS_START,
- NULL);
- return 1;
- } else {
- return 0;
- }
- }
- }
- }
- 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;
-
- if (e_minicard->header_text) {
- gnome_canvas_item_set( e_minicard->header_text,
- "width", (double) e_minicard->width - 12,
- NULL );
- }
- 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
-field_changed (EText *text, EMinicard *e_minicard)
-{
- ECardSimpleType type;
- char *string;
-
- type = GPOINTER_TO_INT
- (gtk_object_get_data(GTK_OBJECT(text),
- "EMinicard:field"));
- gtk_object_get(GTK_OBJECT(text),
- "text", &string,
- NULL);
- e_card_simple_set(e_minicard->simple,
- type,
- string);
- g_free(string);
-}
-
-static void
-add_field (EMinicard *e_minicard, ECardSimpleField field, gdouble left_width)
-{
- GnomeCanvasItem *new_item;
- GnomeCanvasGroup *group;
- ECardSimpleType type;
- EMinicardField *minicard_field;
- char *name;
- char *string;
-
- group = GNOME_CANVAS_GROUP( e_minicard );
-
- type = e_card_simple_type(e_minicard->simple, field);
- name = g_strdup_printf("%s:", e_card_simple_get_name(e_minicard->simple, field));
- string = e_card_simple_get(e_minicard->simple, 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,
- NULL );
- gtk_signal_connect(GTK_OBJECT(E_MINICARD_LABEL(new_item)->field),
- "changed", GTK_SIGNAL_FUNC(field_changed), e_minicard);
- gtk_object_set_data(GTK_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 gdouble
-get_left_width(EMinicard *e_minicard)
-{
- gchar *name;
- ECardSimpleField field;
- gdouble width = -1;
- static GdkFont *font = NULL;
-
- if (font == NULL) {
- font = gdk_font_load("lucidasans-10");
- }
-
- for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST; field++) {
- gdouble this_width;
- name = g_strdup_printf("%s:", e_card_simple_get_name(e_minicard->simple, field));
- this_width = gdk_text_width(font, name, strlen(name));
- if (width < this_width)
- width = this_width;
- g_free(name);
- }
- return width;
-}
-
-static void
-remodel( EMinicard *e_minicard )
-{
- int count = 0;
- if (e_minicard->simple) {
- ECardSimpleField field;
- GList *list;
- char *file_as;
- gdouble left_width = -1;
-
- if (e_minicard->header_text) {
- file_as = e_card_simple_get(e_minicard->simple, E_CARD_SIMPLE_FIELD_FILE_AS);
- gnome_canvas_item_set( e_minicard->header_text,
- "text", file_as ? file_as : "",
- NULL );
- g_free(file_as);
- }
-
- list = e_minicard->fields;
- e_minicard->fields = NULL;
-
- for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST - 2 && count < 5; field++) {
- EMinicardField *minicard_field = NULL;
-
- if (list)
- minicard_field = list->data;
- if (minicard_field && minicard_field->field == field) {
- GList *this_list = list;
- char *string;
-
- string = e_card_simple_get(e_minicard->simple, field);
- if (string && *string) {
- e_minicard->fields = g_list_append(e_minicard->fields, minicard_field);
- gtk_object_set(GTK_OBJECT(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_card_simple_get(e_minicard->simple, 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;
-
- gtk_object_get( GTK_OBJECT( 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;
- gtk_object_get (GTK_OBJECT(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,
- "y2", (double) e_minicard->height - 1,
- NULL );
-
- 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);
- }
-}
-
-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->card) {
- return e_card_get_id(minicard->card);
- } else {
- return "";
- }
-}
-
-int
-e_minicard_compare (EMinicard *minicard1, EMinicard *minicard2)
-{
- 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->card && minicard2->card) {
- char *file_as1, *file_as2;
- gtk_object_get(GTK_OBJECT(minicard1->card),
- "file_as", &file_as1,
- NULL);
- gtk_object_get(GTK_OBJECT(minicard2->card),
- "file_as", &file_as2,
- NULL);
- if (file_as1 && file_as2)
- return strcasecmp(file_as1, file_as2);
- if (file_as1)
- return -1;
- if (file_as2)
- return 1;
- return strcmp(e_minicard_get_card_id(minicard1), e_minicard_get_card_id(minicard2));
- } else {
- return 0;
- }
-}
diff --git a/addressbook/gui/minicard/e-minicard.h b/addressbook/gui/minicard/e-minicard.h
deleted file mode 100644
index 47da8110c2..0000000000
--- a/addressbook/gui/minicard/e-minicard.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <ebook/e-card.h>
-#include <ebook/e-card-simple.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_MINICARD_TYPE (e_minicard_get_type ())
-#define E_MINICARD(obj) (GTK_CHECK_CAST ((obj), E_MINICARD_TYPE, EMinicard))
-#define E_MINICARD_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_MINICARD_TYPE, EMinicardClass))
-#define E_IS_MINICARD(obj) (GTK_CHECK_TYPE ((obj), E_MINICARD_TYPE))
-#define E_IS_MINICARD_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_MINICARD_TYPE))
-
-
-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 */
- ECard *card;
- ECardSimple *simple;
-
- GnomeCanvasItem *rect;
- GnomeCanvasItem *header_rect;
- GnomeCanvasItem *header_text;
-
- GList *fields; /* Of type EMinicardField */
- guint needs_remodeling : 1;
-
- gboolean has_focus;
-
- double width;
- double height;
-};
-
-struct _EMinicardClass
-{
- GnomeCanvasGroupClass parent_class;
-
- void (* resize) (EMinicard *minicard);
-};
-
-
-GtkType e_minicard_get_type (void);
-char *e_minicard_get_card_id (EMinicard *minicard);
-int e_minicard_compare (EMinicard *minicard1, EMinicard *minicard2);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_MINICARD_H__ */
diff --git a/addressbook/gui/minicard/e-reflow-sorted.c b/addressbook/gui/minicard/e-reflow-sorted.c
deleted file mode 100644
index 2d2dcee787..0000000000
--- a/addressbook/gui/minicard/e-reflow-sorted.c
+++ /dev/null
@@ -1,272 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-reflow-sorted.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <math.h>
-#include <gnome.h>
-#include "e-reflow-sorted.h"
-#include <e-util/e-canvas-utils.h>
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-
-static void e_reflow_sorted_init (EReflowSorted *card);
-static void e_reflow_sorted_class_init (EReflowSortedClass *klass);
-static void e_reflow_sorted_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_reflow_sorted_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_reflow_sorted_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-
-#define E_REFLOW_DIVIDER_WIDTH 2
-#define E_REFLOW_BORDER_WIDTH 7
-#define E_REFLOW_FULL_GUTTER (E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH * 2)
-
-static EReflowClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_COMPARE_FUNC,
- ARG_STRING_FUNC
-};
-
-GtkType
-e_reflow_sorted_get_type (void)
-{
- static GtkType reflow_type = 0;
-
- if (!reflow_type)
- {
- static const GtkTypeInfo reflow_info =
- {
- "EReflowSorted",
- sizeof (EReflowSorted),
- sizeof (EReflowSortedClass),
- (GtkClassInitFunc) e_reflow_sorted_class_init,
- (GtkObjectInitFunc) e_reflow_sorted_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- reflow_type = gtk_type_unique (e_reflow_get_type (), &reflow_info);
- }
-
- return reflow_type;
-}
-
-static void
-e_reflow_sorted_class_init (EReflowSortedClass *klass)
-{
- GtkObjectClass *object_class;
- EReflowClass *reflow_class;
-
- object_class = (GtkObjectClass*) klass;
- reflow_class = E_REFLOW_CLASS (klass);
-
- parent_class = gtk_type_class (e_reflow_get_type ());
-
- gtk_object_add_arg_type ("EReflowSorted::compare_func", GTK_TYPE_POINTER,
- GTK_ARG_READWRITE, ARG_COMPARE_FUNC);
- gtk_object_add_arg_type ("EReflowSorted::string_func", GTK_TYPE_POINTER,
- GTK_ARG_READWRITE, ARG_STRING_FUNC);
-
- reflow_class->add_item = e_reflow_sorted_add_item;
-
- object_class->set_arg = e_reflow_sorted_set_arg;
- object_class->get_arg = e_reflow_sorted_get_arg;
-}
-
-static void
-e_reflow_sorted_init (EReflowSorted *reflow)
-{
- reflow->compare_func = NULL;
- reflow->string_func = NULL;
-}
-
-static void
-e_reflow_sorted_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EReflowSorted *e_reflow_sorted;
-
- item = GNOME_CANVAS_ITEM (o);
- e_reflow_sorted = E_REFLOW_SORTED (o);
-
- switch (arg_id){
- case ARG_COMPARE_FUNC:
- e_reflow_sorted->compare_func = GTK_VALUE_POINTER (*arg);
- break;
- case ARG_STRING_FUNC:
- e_reflow_sorted->string_func = GTK_VALUE_POINTER (*arg);
- break;
- }
-}
-
-static void
-e_reflow_sorted_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EReflowSorted *e_reflow_sorted;
-
- e_reflow_sorted = E_REFLOW_SORTED (object);
-
- switch (arg_id) {
- case ARG_COMPARE_FUNC:
- GTK_VALUE_POINTER (*arg) = e_reflow_sorted->compare_func;
- break;
- case ARG_STRING_FUNC:
- GTK_VALUE_POINTER (*arg) = e_reflow_sorted->string_func;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static GList *
-e_reflow_sorted_get_list(EReflowSorted *e_reflow_sorted, const gchar *id)
-{
- if (e_reflow_sorted->string_func) {
- EReflow *reflow = E_REFLOW(e_reflow_sorted);
- GList *list;
- for (list = reflow->items; list; list = g_list_next(list)) {
- GnomeCanvasItem *item = list->data;
- char *string = e_reflow_sorted->string_func (item);
- if (string && !strcmp(string, id)) {
- return list;
- }
- }
- }
- return NULL;
-}
-
-void
-e_reflow_sorted_remove_item(EReflowSorted *e_reflow_sorted, const gchar *id)
-{
- GList *list;
- GnomeCanvasItem *item = NULL;
-
- list = e_reflow_sorted_get_list(e_reflow_sorted, id);
- if (list)
- item = list->data;
-
- if (item) {
- EReflow *reflow = E_REFLOW(e_reflow_sorted);
- reflow->items = g_list_remove_link(reflow->items, list);
- g_list_free_1(list);
- gtk_object_unref(GTK_OBJECT(item));
- gtk_object_destroy(GTK_OBJECT(item));
- if ( GTK_OBJECT_FLAGS( e_reflow_sorted ) & GNOME_CANVAS_ITEM_REALIZED ) {
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(e_reflow_sorted));
- e_reflow_post_add_item(E_REFLOW(e_reflow_sorted), NULL);
- }
- }
-}
-
-void
-e_reflow_sorted_replace_item(EReflowSorted *e_reflow_sorted, GnomeCanvasItem *item)
-{
- if (e_reflow_sorted->string_func) {
- char *string = e_reflow_sorted->string_func (item);
- e_reflow_sorted_remove_item(e_reflow_sorted, string);
- e_reflow_sorted_add_item(E_REFLOW(e_reflow_sorted), item);
- }
-}
-
-GnomeCanvasItem *
-e_reflow_sorted_get_item(EReflowSorted *e_reflow_sorted, const gchar *id)
-{
- GList *list;
- list = e_reflow_sorted_get_list(e_reflow_sorted, id);
- if (list)
- return list->data;
- else
- return NULL;
-}
-
-void
-e_reflow_sorted_reorder_item(EReflowSorted *e_reflow_sorted, const gchar *id)
-{
- GList *list;
- GnomeCanvasItem *item = NULL;
-
- list = e_reflow_sorted_get_list(e_reflow_sorted, id);
- if (list)
- item = list->data;
- if (item) {
- EReflow *reflow = E_REFLOW(e_reflow_sorted);
- reflow->items = g_list_remove_link(reflow->items, list);
- gtk_object_unref(GTK_OBJECT(item));
- g_list_free_1(list);
- e_reflow_sorted_add_item(reflow, item);
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(e_reflow_sorted));
- }
-}
-
-static void
-e_reflow_sorted_add_item(EReflow *reflow, GnomeCanvasItem *item)
-{
- EReflowSorted *e_reflow_sorted = E_REFLOW_SORTED(reflow);
- if ( e_reflow_sorted->compare_func ) {
- reflow->items = g_list_insert_sorted(reflow->items, item, e_reflow_sorted->compare_func);
- gtk_object_ref(GTK_OBJECT(item));
-
- if ( GTK_OBJECT_FLAGS( e_reflow_sorted ) & GNOME_CANVAS_ITEM_REALIZED ) {
- gnome_canvas_item_set(item,
- "width", (double) reflow->column_width,
- NULL);
-
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(e_reflow_sorted));
- }
- }
- e_reflow_post_add_item(reflow, item);
-}
-
-void e_reflow_sorted_jump (EReflowSorted *sorted,
- GCompareFunc compare_func,
- void *value)
-{
- int columns = 0;
- EReflow *reflow = E_REFLOW(sorted);
- GList *list;
- GtkAdjustment *adjustment;
-
- for (list = reflow->columns; list; list = g_list_next(list)) {
- if (compare_func(((GList *)list->data)->data, value) >= 0) {
- GList *last = list->prev;
- if (last) {
- GList *walk;
- for (walk = last->data; walk != list->data; walk = g_list_next(walk)) {
- if (compare_func(walk->data, value) >= 0) {
- columns --;
- break;
- }
- }
- }
- adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(sorted)->canvas));
- gtk_adjustment_set_value(adjustment, (reflow->column_width + E_REFLOW_FULL_GUTTER) * columns);
- return;
- }
- columns ++;
- }
- columns --;
- adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(sorted)->canvas));
- gtk_adjustment_set_value(adjustment, (reflow->column_width + E_REFLOW_FULL_GUTTER) * columns);
-}
diff --git a/addressbook/gui/minicard/e-reflow-sorted.h b/addressbook/gui/minicard/e-reflow-sorted.h
deleted file mode 100644
index 1be4971fb2..0000000000
--- a/addressbook/gui/minicard/e-reflow-sorted.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-reflow-sorted.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_REFLOW_SORTED_H__
-#define __E_REFLOW_SORTED_H__
-
-#include <addressbook/gui/minicard/e-reflow.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EReflowSorted - A canvas item container.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * 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_REFLOW_SORTED_TYPE (e_reflow_sorted_get_type ())
-#define E_REFLOW_SORTED(obj) (GTK_CHECK_CAST ((obj), E_REFLOW_SORTED_TYPE, EReflowSorted))
-#define E_REFLOW_SORTED_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_REFLOW_SORTED_TYPE, EReflowSortedClass))
-#define E_IS_REFLOW_SORTED(obj) (GTK_CHECK_TYPE ((obj), E_REFLOW_SORTED_TYPE))
-#define E_IS_REFLOW_SORTED_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_REFLOW_SORTED_TYPE))
-
-typedef char * (* EReflowStringFunc) (GnomeCanvasItem *);
-
-typedef struct _EReflowSorted EReflowSorted;
-typedef struct _EReflowSortedClass EReflowSortedClass;
-
-/* FIXME: Try reimplementing this as a hash table with key as string
- and change EReflow to use a GTree. */
-struct _EReflowSorted
-{
- EReflow parent;
-
- /* item specific fields */
- GCompareFunc compare_func;
- EReflowStringFunc string_func;
-};
-
-struct _EReflowSortedClass
-{
- EReflowClass parent_class;
-};
-
-/*
- * To be added to a reflow, an item must have the argument "width" as
- * a Read/Write argument and "height" as a Read Only argument. It
- * should also do an ECanvas parent reflow request if its size
- * changes.
- */
-void e_reflow_sorted_remove_item (EReflowSorted *sorted, const char *id);
-void e_reflow_sorted_replace_item (EReflowSorted *sorted, GnomeCanvasItem *item);
-void e_reflow_sorted_reorder_item (EReflowSorted *e_reflow_sorted, const gchar *id);
-GnomeCanvasItem *e_reflow_sorted_get_item (EReflowSorted *e_reflow_sorted, const gchar *id);
-GtkType e_reflow_sorted_get_type (void);
-void e_reflow_sorted_jump (EReflowSorted *sorted, GCompareFunc compare_func, void *value);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_REFLOW_SORTED_H__ */
diff --git a/addressbook/gui/minicard/e-reflow.c b/addressbook/gui/minicard/e-reflow.c
deleted file mode 100644
index 0e9c8b92b1..0000000000
--- a/addressbook/gui/minicard/e-reflow.c
+++ /dev/null
@@ -1,859 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-reflow.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <math.h>
-#include "e-reflow.h"
-#include "e-text.h"
-#include <e-util/e-canvas-utils.h>
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-
-static void e_reflow_init (EReflow *reflow);
-static void e_reflow_class_init (EReflowClass *klass);
-static void e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_reflow_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_reflow_destroy (GtkObject *object);
-static gboolean e_reflow_event (GnomeCanvasItem *item, GdkEvent *event);
-static void e_reflow_realize (GnomeCanvasItem *item);
-static void e_reflow_unrealize (GnomeCanvasItem *item);
-static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-static void e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags);
-static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item);
-static void e_reflow_reflow (GnomeCanvasItem *item, int flags);
-static void e_reflow_real_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-static void set_empty(EReflow *e_reflow);
-
-static void e_reflow_resize_children (GnomeCanvasItem *item);
-
-#define E_REFLOW_DIVIDER_WIDTH 2
-#define E_REFLOW_BORDER_WIDTH 7
-#define E_REFLOW_FULL_GUTTER (E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH * 2)
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_MINIMUM_WIDTH,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_EMPTY_MESSAGE,
-};
-
-GtkType
-e_reflow_get_type (void)
-{
- static GtkType reflow_type = 0;
-
- if (!reflow_type)
- {
- static const GtkTypeInfo reflow_info =
- {
- "EReflow",
- sizeof (EReflow),
- sizeof (EReflowClass),
- (GtkClassInitFunc) e_reflow_class_init,
- (GtkObjectInitFunc) e_reflow_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- reflow_type = gtk_type_unique (gnome_canvas_group_get_type (), &reflow_info);
- }
-
- return reflow_type;
-}
-
-static void
-e_reflow_class_init (EReflowClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- gtk_object_add_arg_type ("EReflow::minimum_width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MINIMUM_WIDTH);
- gtk_object_add_arg_type ("EReflow::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_WIDTH);
- gtk_object_add_arg_type ("EReflow::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_HEIGHT);
- gtk_object_add_arg_type ("EReflow::empty_message", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_EMPTY_MESSAGE);
-
- klass->add_item = e_reflow_real_add_item;
-
- object_class->set_arg = e_reflow_set_arg;
- object_class->get_arg = e_reflow_get_arg;
- object_class->destroy = e_reflow_destroy;
-
- /* GnomeCanvasItem method overrides */
- item_class->event = e_reflow_event;
- item_class->realize = e_reflow_realize;
- item_class->unrealize = e_reflow_unrealize;
- item_class->draw = e_reflow_draw;
- item_class->update = e_reflow_update;
- item_class->point = e_reflow_point;
-}
-
-static void
-e_reflow_init (EReflow *reflow)
-{
- reflow->items = NULL;
- reflow->columns = NULL;
- reflow->column_width = 150;
-
- reflow->minimum_width = 10;
- reflow->width = 10;
- reflow->height = 10;
- reflow->idle = 0;
-
- reflow->empty_message = NULL;
- reflow->empty_text = NULL;
-
- reflow->column_drag = FALSE;
-
- reflow->need_height_update = FALSE;
- reflow->need_column_resize = FALSE;
-
- reflow->default_cursor_shown = TRUE;
- reflow->arrow_cursor = NULL;
- reflow->default_cursor = NULL;
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(reflow), e_reflow_reflow);
-}
-
-static void
-e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EReflow *e_reflow;
-
- item = GNOME_CANVAS_ITEM (o);
- e_reflow = E_REFLOW (o);
-
- switch (arg_id){
- case ARG_HEIGHT:
- e_reflow->height = GTK_VALUE_DOUBLE (*arg);
- e_canvas_item_request_reflow(item);
- break;
- case ARG_MINIMUM_WIDTH:
- e_reflow->minimum_width = GTK_VALUE_DOUBLE (*arg);
- if (GNOME_CANVAS_ITEM_REALIZED & GTK_OBJECT_FLAGS(o))
- set_empty(e_reflow);
- e_canvas_item_request_reflow(item);
- break;
- case ARG_EMPTY_MESSAGE:
- g_free(e_reflow->empty_message);
- e_reflow->empty_message = g_strdup(GTK_VALUE_STRING (*arg));
- if (GNOME_CANVAS_ITEM_REALIZED & GTK_OBJECT_FLAGS(o))
- set_empty(e_reflow);
- }
-}
-
-static void
-e_reflow_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (object);
-
- switch (arg_id) {
- case ARG_MINIMUM_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_reflow->minimum_width;
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_reflow->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = e_reflow->height;
- break;
- case ARG_EMPTY_MESSAGE:
- GTK_VALUE_STRING (*arg) = g_strdup(e_reflow->empty_message);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_reflow_destroy (GtkObject *object)
-{
- EReflow *reflow = E_REFLOW(object);
-
- g_list_foreach(reflow->items, (GFunc) gtk_object_unref, NULL);
- g_list_free(reflow->items);
- reflow->items = NULL;
-
- g_free(reflow->empty_message);
-
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
-}
-
-static void
-e_reflow_realize (GnomeCanvasItem *item)
-{
- EReflow *e_reflow;
- GnomeCanvasGroup *group;
- GList *list;
- GtkAdjustment *adjustment;
-
- e_reflow = E_REFLOW (item);
- group = GNOME_CANVAS_GROUP( item );
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
-
- e_reflow->arrow_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
- e_reflow->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
-
- for(list = e_reflow->items; list; list = g_list_next(list)) {
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(item,
- "width", (double) e_reflow->column_width,
- NULL);
- }
-
- set_empty(e_reflow);
-
- e_canvas_item_request_reflow(item);
-
- adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- adjustment->step_increment = (e_reflow->column_width + E_REFLOW_FULL_GUTTER) / 2;
- adjustment->page_increment = adjustment->page_size - adjustment->step_increment;
- gtk_adjustment_changed(adjustment);
-
- if (!item->canvas->aa) {
- }
-}
-
-static void
-e_reflow_unrealize (GnomeCanvasItem *item)
-{
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (item);
-
- if (!item->canvas->aa)
- {
- }
-
- gdk_cursor_destroy (e_reflow->arrow_cursor);
- gdk_cursor_destroy (e_reflow->default_cursor);
- e_reflow->arrow_cursor = NULL;
- e_reflow->default_cursor = NULL;
-
- g_list_free (e_reflow->columns);
- e_reflow->columns = NULL;
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item);
-}
-
-static gint
-e_reflow_pick_line (EReflow *e_reflow, double x)
-{
- x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- x /= e_reflow->column_width + E_REFLOW_FULL_GUTTER;
- return x;
-}
-
-static gboolean
-e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (item);
-
- switch( event->type )
- {
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Tab ||
- event->key.keyval == GDK_KP_Tab ||
- event->key.keyval == GDK_ISO_Left_Tab) {
- GList *list;
- for (list = e_reflow->items; list; list = list->next) {
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (list->data);
- EFocus has_focus;
- gtk_object_get(GTK_OBJECT(item),
- "has_focus", &has_focus,
- NULL);
- if (has_focus) {
- if (event->key.state & GDK_SHIFT_MASK)
- list = list->prev;
- else
- list = list->next;
- if (list) {
- item = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(item,
- "has_focus", (event->key.state & GDK_SHIFT_MASK) ? E_FOCUS_END : E_FOCUS_START,
- NULL);
- return 1;
- } else {
- return 0;
- }
- }
- }
- }
- break;
- case GDK_BUTTON_PRESS:
- switch(event->button.button)
- {
- case 1:
- {
- GdkEventButton *button = (GdkEventButton *) event;
- double n_x, max_x;
- n_x = button->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
-
- max_x = E_REFLOW_BORDER_WIDTH;
- max_x += (e_reflow->column_width + E_REFLOW_FULL_GUTTER) * e_reflow->column_count;
- if ( button->y >= E_REFLOW_BORDER_WIDTH && button->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER && max_x > button->x ) {
- e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x);
- e_reflow->start_x = e_reflow->which_column_dragged * (e_reflow->column_width + E_REFLOW_FULL_GUTTER) - E_REFLOW_DIVIDER_WIDTH / 2;
- e_reflow->temp_column_width = e_reflow->column_width;
- e_reflow->column_drag = TRUE;
-
- gnome_canvas_item_grab (item,
- GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
- e_reflow->arrow_cursor,
- button->time);
-
- e_reflow->previous_temp_column_width = -1;
- e_reflow->need_column_resize = TRUE;
- gnome_canvas_item_request_update(item);
- return TRUE;
- }
- }
- break;
- case 4:
- {
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- gdouble new_value = adjustment->value;
- new_value -= adjustment->step_increment;
- gtk_adjustment_set_value(adjustment, new_value);
- }
- break;
- case 5:
- {
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- gdouble new_value = adjustment->value;
- new_value += adjustment->step_increment;
- if ( new_value > adjustment->upper - adjustment->page_size )
- new_value = adjustment->upper - adjustment->page_size;
- gtk_adjustment_set_value(adjustment, new_value);
- }
- break;
- }
- break;
- case GDK_BUTTON_RELEASE:
- if (e_reflow->column_drag) {
- gdouble old_width = e_reflow->column_width;
- GdkEventButton *button = (GdkEventButton *) event;
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- e_reflow->temp_column_width = e_reflow->column_width +
- (button->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
- if ( e_reflow->temp_column_width < 50 )
- e_reflow->temp_column_width = 50;
- e_reflow->column_drag = FALSE;
- if ( old_width != e_reflow->temp_column_width ) {
- gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width));
- e_reflow->column_width = e_reflow->temp_column_width;
- adjustment->step_increment = (e_reflow->column_width + E_REFLOW_FULL_GUTTER) / 2;
- adjustment->page_increment = adjustment->page_size - adjustment->step_increment;
- gtk_adjustment_changed(adjustment);
- e_reflow_resize_children(item);
- e_canvas_item_request_reflow(item);
- }
- e_reflow->need_column_resize = TRUE;
- gnome_canvas_item_request_update(item);
- gnome_canvas_item_ungrab (item, button->time);
- return TRUE;
- }
- break;
- case GDK_MOTION_NOTIFY:
- if (e_reflow->column_drag) {
- double old_width = e_reflow->temp_column_width;
- GdkEventMotion *motion = (GdkEventMotion *) event;
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- e_reflow->temp_column_width = e_reflow->column_width +
- (motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
- if (e_reflow->temp_column_width < 50)
- e_reflow->temp_column_width = 50;
- if (old_width != e_reflow->temp_column_width) {
- e_reflow->need_column_resize = TRUE;
- gnome_canvas_item_request_update(item);
- }
- return TRUE;
- } else {
- GdkEventMotion *motion = (GdkEventMotion *) event;
- double n_x, max_x;
-
- n_x = motion->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
-
- max_x = E_REFLOW_BORDER_WIDTH;
- max_x += (e_reflow->column_width + E_REFLOW_FULL_GUTTER) * e_reflow->column_count;
-
- if ( motion->y >= E_REFLOW_BORDER_WIDTH && motion->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER && max_x > motion->x) {
- if ( e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
- e_reflow->default_cursor_shown = FALSE;
- }
- } else
- if ( ! e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
- e_reflow->default_cursor_shown = TRUE;
- }
-
- }
- break;
- case GDK_ENTER_NOTIFY:
- if (!e_reflow->column_drag) {
- GdkEventCrossing *crossing = (GdkEventCrossing *) event;
- double n_x, max_x;
- n_x = crossing->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
-
- max_x = E_REFLOW_BORDER_WIDTH;
- max_x += (e_reflow->column_width + E_REFLOW_FULL_GUTTER) * e_reflow->column_count;
- if ( crossing->y >= E_REFLOW_BORDER_WIDTH && crossing->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER && max_x > crossing->x) {
- if ( e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
- e_reflow->default_cursor_shown = FALSE;
- }
- }
- }
- break;
- case GDK_LEAVE_NOTIFY:
- if (!e_reflow->column_drag) {
- GdkEventCrossing *crossing = (GdkEventCrossing *) event;
- double n_x;
- n_x = crossing->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
- if ( !( crossing->y >= E_REFLOW_BORDER_WIDTH && crossing->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER ) ) {
- if ( ! e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
- e_reflow->default_cursor_shown = TRUE;
- }
- }
- }
- 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_reflow_real_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
-{
- e_reflow->items = g_list_append(e_reflow->items, item);
- gtk_object_ref(GTK_OBJECT(item));
- if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
- gnome_canvas_item_set(item,
- "width", (double) e_reflow->column_width,
- NULL);
- e_reflow_post_add_item(e_reflow, item);
- e_canvas_item_request_reflow(item);
- }
-
-}
-
-static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- int x_rect, y_rect, width_rect, height_rect;
- gdouble running_width;
- EReflow *e_reflow = E_REFLOW(item);
- int i;
- double column_width;
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->draw)
- GNOME_CANVAS_ITEM_CLASS(parent_class)->draw (item, drawable, x, y, width, height);
- column_width = e_reflow->column_width;
- running_width = E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- x_rect = running_width;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- /* Compute first column to draw. */
- i = x;
- i /= column_width + E_REFLOW_FULL_GUTTER;
- running_width += i * (column_width + E_REFLOW_FULL_GUTTER);
-
- for ( ; i < e_reflow->column_count; i++) {
- if ( running_width > x + width )
- break;
- x_rect = running_width;
- gtk_paint_flat_box(GTK_WIDGET(item->canvas)->style,
- drawable,
- GTK_STATE_ACTIVE,
- GTK_SHADOW_NONE,
- NULL,
- GTK_WIDGET(item->canvas),
- "reflow",
- x_rect - x,
- y_rect - y,
- width_rect,
- height_rect);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- if (e_reflow->column_drag) {
- int start_line = e_reflow_pick_line(e_reflow,
- gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
- i = x - start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width = start_line * (column_width + E_REFLOW_FULL_GUTTER);
- column_width = e_reflow->temp_column_width;
- running_width -= start_line * (column_width + E_REFLOW_FULL_GUTTER);
- i += start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width += E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- x_rect = running_width;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- /* Compute first column to draw. */
- i /= column_width + E_REFLOW_FULL_GUTTER;
- running_width += i * (column_width + E_REFLOW_FULL_GUTTER);
-
- for ( ; i < e_reflow->column_count; i++) {
- if ( running_width > x + width )
- break;
- x_rect = running_width;
- gdk_draw_rectangle(drawable,
- GTK_WIDGET(item->canvas)->style->fg_gc[GTK_STATE_NORMAL],
- TRUE,
- x_rect - x,
- y_rect - y,
- width_rect - 1,
- height_rect - 1);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- }
-}
-
-static void
-e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags)
-{
- EReflow *e_reflow;
- double x0, x1, y0, y1;
-
- e_reflow = E_REFLOW (item);
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update)
- GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags);
-
- x0 = item->x1;
- y0 = item->y1;
- x1 = item->x2;
- y1 = item->y2;
- if ( x1 < x0 + e_reflow->width )
- x1 = x0 + e_reflow->width;
- if ( y1 < y0 + e_reflow->height )
- y1 = y0 + e_reflow->height;
- item->x2 = x1;
- item->y2 = y1;
-
- if (e_reflow->need_height_update) {
- x0 = item->x1;
- y0 = item->y1;
- x1 = item->x2;
- y1 = item->y2;
- if ( x0 > 0 )
- x0 = 0;
- if ( y0 > 0 )
- y0 = 0;
- if ( x1 < E_REFLOW(item)->width )
- x1 = E_REFLOW(item)->width;
- if ( x1 < E_REFLOW(item)->height )
- x1 = E_REFLOW(item)->height;
-
- gnome_canvas_request_redraw(item->canvas, x0, y0, x1, y1);
- e_reflow->need_height_update = FALSE;
- } else if (e_reflow->need_column_resize) {
- int x_rect, y_rect, width_rect, height_rect;
- int start_line = e_reflow_pick_line(e_reflow,
- gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
- gdouble running_width;
- int i;
- double column_width;
-
- if ( e_reflow->previous_temp_column_width != -1 ) {
- running_width = start_line * (e_reflow->column_width + E_REFLOW_FULL_GUTTER);
- column_width = e_reflow->previous_temp_column_width;
- running_width -= start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width += E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- for ( i = 0; i < e_reflow->column_count; i++) {
- x_rect = running_width;
- gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- }
-
- if ( e_reflow->temp_column_width != -1 ) {
- running_width = start_line * (e_reflow->column_width + E_REFLOW_FULL_GUTTER);
- column_width = e_reflow->temp_column_width;
- running_width -= start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width += E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- for ( i = 0; i < e_reflow->column_count; i++) {
- x_rect = running_width;
- gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- }
-
- e_reflow->previous_temp_column_width = e_reflow->temp_column_width;
- e_reflow->need_column_resize = FALSE;
- }
-}
-
-static void
-e_reflow_resize_children (GnomeCanvasItem *item)
-{
- GList *list;
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (item);
- for ( list = e_reflow->items; list; list = list->next ) {
- GnomeCanvasItem *child = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(child,
- "width", (double) e_reflow->column_width,
- NULL);
- }
-}
-
-static double
-e_reflow_point (GnomeCanvasItem *item,
- double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- double distance = 1;
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->point)
- distance = GNOME_CANVAS_ITEM_CLASS(parent_class)->point (item, x, y, cx, cy, actual_item);
- if (*actual_item)
- return 0;
-
- *actual_item = item;
- return 0;
-#if 0
- if (y >= E_REFLOW_BORDER_WIDTH && y <= e_reflow->height - E_REFLOW_BORDER_WIDTH) {
- float n_x;
- n_x = x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x, (e_reflow->column_width + E_REFLOW_FULL_GUTTER));
- if (n_x < E_REFLOW_FULL_GUTTER) {
- *actual_item = item;
- return 0;
- }
- }
- return distance;
-#endif
-}
-
-static void
-_reflow( EReflow *e_reflow )
-{
- gdouble running_height;
- GList *list;
- double item_height;
-
- if (e_reflow->columns) {
- g_list_free (e_reflow->columns);
- e_reflow->columns = NULL;
- }
-
- e_reflow->column_count = 0;
-
- if (e_reflow->items == NULL) {
- e_reflow->columns = NULL;
- e_reflow->column_count = 0;
- return;
- }
-
- list = e_reflow->items;
-
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- running_height = E_REFLOW_BORDER_WIDTH + item_height + E_REFLOW_BORDER_WIDTH;
- e_reflow->columns = g_list_append (e_reflow->columns, list);
- e_reflow->column_count = 1;
-
- list = g_list_next(list);
-
- for ( ; list; list = g_list_next(list)) {
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- if (running_height + item_height + E_REFLOW_BORDER_WIDTH > e_reflow->height) {
- running_height = E_REFLOW_BORDER_WIDTH + item_height + E_REFLOW_BORDER_WIDTH;
- e_reflow->columns = g_list_append (e_reflow->columns, list);
- e_reflow->column_count ++;
- } else {
- running_height += item_height + E_REFLOW_BORDER_WIDTH;
- }
- }
-}
-
-static void
-set_empty(EReflow *e_reflow)
-{
- if (e_reflow->items == NULL) {
- if (e_reflow->empty_text) {
- if (e_reflow->empty_message) {
- gnome_canvas_item_set(e_reflow->empty_text,
- "width", e_reflow->minimum_width,
- "text", e_reflow->empty_message,
- NULL);
- e_canvas_item_move_absolute(e_reflow->empty_text,
- e_reflow->minimum_width / 2,
- 0);
- } else {
- gtk_object_destroy(GTK_OBJECT(e_reflow->empty_text));
- e_reflow->empty_text = NULL;
- }
- } else {
- if (e_reflow->empty_message)
- e_reflow->empty_text =
- gnome_canvas_item_new(GNOME_CANVAS_GROUP(e_reflow),
- e_text_get_type(),
- "anchor", GTK_ANCHOR_N,
- "width", e_reflow->minimum_width,
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "font_gdk", GTK_WIDGET(GNOME_CANVAS_ITEM(e_reflow)->canvas)->style->font,
- "fill_color", "black",
- "justification", GTK_JUSTIFY_CENTER,
- "text", e_reflow->empty_message,
- NULL);
- e_canvas_item_move_absolute(e_reflow->empty_text,
- e_reflow->minimum_width / 2,
- 0);
- }
- } else {
- if (e_reflow->empty_text) {
- gtk_object_destroy(GTK_OBJECT(e_reflow->empty_text));
- e_reflow->empty_text = NULL;
- }
- }
-}
-
-static void
-e_reflow_reflow( GnomeCanvasItem *item, int flags )
-{
- EReflow *e_reflow = E_REFLOW(item);
- if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
-
- gdouble old_width;
- gdouble running_width;
-
- _reflow (e_reflow);
-
- old_width = e_reflow->width;
-
- running_width = E_REFLOW_BORDER_WIDTH;
-
- if (e_reflow->items == NULL) {
- } else {
- GList *list;
- GList *next_column;
- gdouble item_height;
- gdouble running_height;
-
- running_height = E_REFLOW_BORDER_WIDTH;
-
- list = e_reflow->items;
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- e_canvas_item_move_absolute(GNOME_CANVAS_ITEM(list->data),
- (double) running_width,
- (double) running_height);
- running_height += item_height + E_REFLOW_BORDER_WIDTH;
- next_column = g_list_next(e_reflow->columns);
- list = g_list_next(list);
-
- for( ; list; list = g_list_next(list)) {
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
-
- if (next_column && (next_column->data == list)) {
- next_column = g_list_next (next_column);
- running_height = E_REFLOW_BORDER_WIDTH;
- running_width += e_reflow->column_width + E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH;
- }
- e_canvas_item_move_absolute(GNOME_CANVAS_ITEM(list->data),
- (double) running_width,
- (double) running_height);
-
- running_height += item_height + E_REFLOW_BORDER_WIDTH;
- }
-
- }
- e_reflow->width = running_width + e_reflow->column_width + E_REFLOW_BORDER_WIDTH;
- if ( e_reflow->width < e_reflow->minimum_width )
- e_reflow->width = e_reflow->minimum_width;
- if (old_width != e_reflow->width)
- e_canvas_item_request_parent_reflow(item);
- }
-}
-
-void
-e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
-{
- if (E_REFLOW_CLASS(GTK_OBJECT(e_reflow)->klass)->add_item)
- (E_REFLOW_CLASS(GTK_OBJECT(e_reflow)->klass)->add_item) (e_reflow, item);
-}
-
-void
-e_reflow_post_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
-{
- set_empty(e_reflow);
-}
diff --git a/addressbook/gui/minicard/e-reflow.h b/addressbook/gui/minicard/e-reflow.h
deleted file mode 100644
index eb66b094a5..0000000000
--- a/addressbook/gui/minicard/e-reflow.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-reflow.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_REFLOW_H__
-#define __E_REFLOW_H__
-
-#include <gnome.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EReflow - A canvas item container.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * 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_REFLOW_TYPE (e_reflow_get_type ())
-#define E_REFLOW(obj) (GTK_CHECK_CAST ((obj), E_REFLOW_TYPE, EReflow))
-#define E_REFLOW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_REFLOW_TYPE, EReflowClass))
-#define E_IS_REFLOW(obj) (GTK_CHECK_TYPE ((obj), E_REFLOW_TYPE))
-#define E_IS_REFLOW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_REFLOW_TYPE))
-
-
-typedef struct _EReflow EReflow;
-typedef struct _EReflowClass EReflowClass;
-
-struct _EReflow
-{
- GnomeCanvasGroup parent;
-
- /* item specific fields */
- GList *items; /* Of type GnomeCanvasItem */
- GList *columns; /* Of type GList of type GnomeCanvasItem (points into items) */
- gint column_count; /* Number of columnns */
-
- GnomeCanvasItem *empty_text;
- gchar *empty_message;
-
- double minimum_width;
- double width;
- double height;
-
- double column_width;
-
- int idle;
-
- /* These are all for when the column is being dragged. */
- gboolean column_drag;
- gdouble start_x;
- gint which_column_dragged;
- double temp_column_width;
- double previous_temp_column_width;
-
- guint need_height_update : 1;
- guint need_column_resize : 1;
-
- guint default_cursor_shown : 1;
- GdkCursor *arrow_cursor;
- GdkCursor *default_cursor;
-};
-
-struct _EReflowClass
-{
- GnomeCanvasGroupClass parent_class;
-
- /* Virtual methods. */
- void (* add_item) (EReflow *reflow, GnomeCanvasItem *item);
-};
-
-/*
- * To be added to a reflow, an item must have the argument "width" as
- * a Read/Write argument and "height" as a Read Only argument. It
- * should also do an ECanvas parent reflow request if its size
- * changes.
- */
-void e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-GtkType e_reflow_get_type (void);
-
-/* Internal usage only: */
-void e_reflow_post_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_REFLOW_H__ */
diff --git a/addressbook/gui/minicard/test-minicard-label.c b/addressbook/gui/minicard/test-minicard-label.c
deleted file mode 100644
index 57bc69222a..0000000000
--- a/addressbook/gui/minicard/test-minicard-label.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-minicard-label.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-
-
-#include "config.h"
-
-#include <gnome.h>
-#include "e-minicard-label.h"
-#include <e-util/e-canvas.h>
-
-/* This is a horrible thing to do, but it is just a test. */
-GnomeCanvasItem *label;
-GnomeCanvasItem *rect;
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- exit(0);
-}
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data)
-{
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, allocation->width, allocation->height );
- gnome_canvas_item_set( label,
- "width", (double) allocation->width,
- "height", (double) allocation->height,
- NULL );
- gnome_canvas_item_set( rect,
- "x2", (double) allocation->width,
- "y2", (double) allocation->height,
- NULL );
-}
-
-#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 ( _( "Minicard Label Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the minicard label canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-static void button_press_callback( GtkWidget *widget, gpointer data )
-{
- gnome_canvas_item_grab_focus( label );
-}
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *canvas;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "Minicard Label Test", VERSION, argc, argv);
- app = gnome_app_new("Minicard Label Test", NULL);
-
- 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 );
- label = e_minicard_label_new(gnome_canvas_root( GNOME_CANVAS( canvas ) ));
- gnome_canvas_item_set( label,
- "width", (double) 100,
- "height", (double) 100,
- "fieldname", "Full Name:",
- "field", "Christopher James Lahey",
- NULL );
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ),
- 0, 0,
- 100, 100 );
-
- gnome_app_set_contents( GNOME_APP( app ), canvas );
-
-
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( allocate_callback ),
- ( gpointer ) app );
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "button_press_event",
- GTK_SIGNAL_FUNC( button_press_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/gui/minicard/test-minicard-view.c b/addressbook/gui/minicard/test-minicard-view.c
deleted file mode 100644
index c03d11d07e..0000000000
--- a/addressbook/gui/minicard/test-minicard-view.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-reflow.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-#include "config.h"
-
-#include <gnome.h>
-#include <libgnorba/gnorba.h>
-#include <bonobo.h>
-#include <e-util/e-canvas.h>
-#include "e-minicard-view.h"
-
-/* This is a horrible thing to do, but it is just a test. */
-GnomeCanvasItem *reflow;
-GnomeCanvasItem *rect;
-GtkAllocation last_alloc;
-
-CORBA_Environment ev;
-CORBA_ORB orb;
-
-static void
-init_bonobo (int argc, char **argv)
-{
-
- gnome_CORBA_init_with_popt_table (
- "Reflow Test", VERSION,
- &argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
-
- orb = gnome_CORBA_ORB ();
-
- if (bonobo_init (orb, NULL, NULL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-
-}
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- 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 );
- gtk_object_get(GTK_OBJECT(reflow),
- "width", &width,
- NULL);
- width = MAX(width, allocation->width);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, width, allocation->height );
- gnome_canvas_item_set( rect,
- "x2", (double) width,
- "y2", (double) allocation->height,
- NULL );
-}
-
-static void resize(GnomeCanvas *canvas, gpointer data)
-{
- double width;
- gtk_object_get(GTK_OBJECT(reflow),
- "width", &width,
- NULL);
- width = MAX(width, last_alloc.width);
- gnome_canvas_set_scroll_region(canvas , 0, 0, width, last_alloc.height );
- gnome_canvas_item_set( rect,
- "x2", (double) width,
- "y2", (double) last_alloc.height,
- NULL );
-}
-
-#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 ( _( "Reflow Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the reflow canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- if (status == E_BOOK_STATUS_SUCCESS)
- gnome_canvas_item_set(reflow,
- "book", book,
- NULL);
-}
-
-static guint
-ebook_create (void)
-{
- EBook *book;
-
- book = e_book_new ();
-
- if (!book) {
- printf ("%s: %s(): Couldn't create EBook, bailing.\n",
- __FILE__,
- __FUNCTION__);
- return FALSE;
- }
-
-
- if (! e_book_load_uri (book, "file:/tmp/test.db", book_open_cb, NULL)) {
- printf ("error calling load_uri!\n");
- }
-
-
- return FALSE;
-}
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *canvas;
- GtkWidget *vbox;
- GtkWidget *scrollbar;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- CORBA_exception_init (&ev);
- init_bonobo (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_minicard_view_get_type(),
- "height", (double) 100,
- "minimum_width", (double) 100,
- NULL );
- gtk_signal_connect( GTK_OBJECT( canvas ), "reflow",
- GTK_SIGNAL_FUNC( resize ),
- ( gpointer ) app);
-
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ),
- 0, 0,
- 100, 100 );
-
- gtk_box_pack_start(GTK_BOX(vbox), canvas, TRUE, TRUE, 0);
-
- scrollbar = gtk_hscrollbar_new(gtk_layout_get_hadjustment(GTK_LAYOUT(canvas)));
-
- gtk_box_pack_start(GTK_BOX(vbox), scrollbar, FALSE, FALSE, 0);
-
- gnome_app_set_contents( GNOME_APP( app ), vbox );
-
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( allocate_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
- gdk_window_set_back_pixmap( GTK_LAYOUT(canvas)->bin_window, NULL, FALSE);
-
- gtk_idle_add ((GtkFunction) ebook_create, NULL);
-
- bonobo_main ();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/gui/minicard/test-minicard.c b/addressbook/gui/minicard/test-minicard.c
deleted file mode 100644
index e16ca675b3..0000000000
--- a/addressbook/gui/minicard/test-minicard.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-minicard.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-
-
-#include "config.h"
-
-#include <gnome.h>
-#include "e-minicard.h"
-
-/* This is a horrible thing to do, but it is just a test. */
-GnomeCanvasItem *card;
-GnomeCanvasItem *rect;
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- exit(0);
-}
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data)
-{
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, allocation->width, allocation->height );
- gnome_canvas_item_set( card,
- "width", (double) allocation->width,
- NULL );
- gnome_canvas_item_set( rect,
- "x2", (double) allocation->width,
- "y2", (double) allocation->height,
- NULL );
-}
-
-#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 ( _( "Minicard Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the minicard canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *canvas;
- int i;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "Minicard Test", VERSION, argc, argv);
- app = gnome_app_new("Minicard Test", NULL);
-
- canvas = gnome_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 );
- for ( i = 0; i < 1; i++ )
- {
- card = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ),
- e_minicard_get_type(),
- "width", (double) 100,
- NULL );
- }
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ),
- 0, 0,
- 100, 100 );
-
- gnome_app_set_contents( GNOME_APP( app ), canvas );
-
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( allocate_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/gui/minicard/test-reflow.c b/addressbook/gui/minicard/test-reflow.c
deleted file mode 100644
index 8013c428d5..0000000000
--- a/addressbook/gui/minicard/test-reflow.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-reflow.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-
-#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@helixcode.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 <gnome.h>
-#include <e-util/e-canvas.h>
-#include "e-reflow.h"
-#include "e-minicard.h"
-#include "e-scroll-frame.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(GtkWidget *app, gpointer data)
-{
- 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 );
- gtk_object_get(GTK_OBJECT(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;
- gtk_object_get(GTK_OBJECT(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 );
-}
-
-#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 ( _( "Reflow Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the reflow canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-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 );
- gtk_signal_connect( GTK_OBJECT( canvas ), "reflow",
- GTK_SIGNAL_FUNC( 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);
- }
- 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 */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( 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/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 1050da1843..0000000000
--- a/addressbook/gui/search/Makefile.am
+++ /dev/null
@@ -1,16 +0,0 @@
-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 \
- $(BONOBO_GNOME_CFLAGS)
-
-noinst_LIBRARIES = \
- libeaddressbooksearch.a
-
-libeaddressbooksearch_a_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 d855561cce..0000000000
--- a/addressbook/gui/search/addresstypes.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<filterdescription>
-<partset>
- <part name="name">
- <title>Sender</title>
- <input type="optionlist" name="name-type">
- <option value="contains">
- <title>contains</title>
- <code>(contains "fullname" ${name}))</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(not (contains "fullname" ${name})))</code>
- </option>
- </input>
- <input type="string" name="name"/>
- </part>
- <part name="email">
- <title>Sender</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>
- </input>
- <input type="string" name="email"/>
- </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 4acfd1585c..0000000000
--- a/addressbook/gui/search/e-addressbook-search-dialog.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-addressbook-search-dialog.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-util/e-canvas.h>
-#include "e-addressbook-search-dialog.h"
-#include "addressbook/gui/minicard/e-minicard-view-widget.h"
-#include "widgets/misc/e-scroll-frame.h"
-static void e_addressbook_search_dialog_init (EAddressbookSearchDialog *widget);
-static void e_addressbook_search_dialog_class_init (EAddressbookSearchDialogClass *klass);
-static void e_addressbook_search_dialog_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_addressbook_search_dialog_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_addressbook_search_dialog_destroy (GtkObject *object);
-
-static ECanvasClass *parent_class = NULL;
-
-#define PARENT_TYPE (gnome_dialog_get_type())
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_BOOK,
-};
-
-GtkType
-e_addressbook_search_dialog_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type)
- {
- static const GtkTypeInfo info =
- {
- "EAddressbookSearchDialog",
- sizeof (EAddressbookSearchDialog),
- sizeof (EAddressbookSearchDialogClass),
- (GtkClassInitFunc) e_addressbook_search_dialog_class_init,
- (GtkObjectInitFunc) e_addressbook_search_dialog_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-static void
-e_addressbook_search_dialog_class_init (EAddressbookSearchDialogClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- ECanvasClass *canvas_class;
-
- object_class = (GtkObjectClass*) klass;
- widget_class = GTK_WIDGET_CLASS (klass);
- canvas_class = E_CANVAS_CLASS (klass);
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- gtk_object_add_arg_type ("EAddressbookSearchDialog::book", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_BOOK);
-
- object_class->set_arg = e_addressbook_search_dialog_set_arg;
- object_class->get_arg = e_addressbook_search_dialog_get_arg;
- object_class->destroy = e_addressbook_search_dialog_destroy;
-}
-
-static GtkWidget *
-get_widget ()
-{
- return gtk_entry_new();
-}
-
-static char *
-get_query ()
-{
- return "(contains \"email\" \"\")";
-}
-
-static void
-button_press (GtkWidget *widget, EAddressbookSearchDialog *dialog)
-{
- char *query;
- gtk_widget_show(dialog->scrolled_window);
- query = get_query();
- gtk_object_set(GTK_OBJECT(dialog->view),
- "query", query,
- NULL);
- g_free(query);
-}
-
-static void
-e_addressbook_search_dialog_init (EAddressbookSearchDialog *view)
-{
- GtkWidget *button;
- GnomeDialog *dialog = GNOME_DIALOG (view);
-
- gtk_window_set_policy(GTK_WINDOW(view), FALSE, TRUE, FALSE);
-
- view->search = get_widget();
- gtk_box_pack_start(GTK_BOX(dialog->vbox), view->search, TRUE, TRUE, 0);
- gtk_widget_show(view->search);
-
- button = gtk_button_new_with_label(_("Search"));
- gtk_box_pack_start(GTK_BOX(dialog->vbox), button, FALSE, FALSE, 0);
- gtk_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(button_press), view);
- gtk_widget_show(button);
-
- view->view = e_minicard_view_widget_new();
- gtk_widget_show(view->view);
-
- view->scrolled_window = e_scroll_frame_new(NULL, NULL);
- e_scroll_frame_set_policy(E_SCROLL_FRAME(view->scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
- gtk_container_add(GTK_CONTAINER(view->scrolled_window), view->view);
-
- gtk_box_pack_start(GTK_BOX(dialog->vbox), view->scrolled_window, TRUE, TRUE, 0);
-}
-
-GtkWidget *
-e_addressbook_search_dialog_new (EBook *book)
-{
- EAddressbookSearchDialog *view = gtk_type_new (e_addressbook_search_dialog_get_type ());
- gtk_object_set(GTK_OBJECT(view->view),
- "book", book,
- NULL);
- return GTK_WIDGET(view);
-}
-
-static void
-e_addressbook_search_dialog_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EAddressbookSearchDialog *emvw;
-
- emvw = E_ADDRESSBOOK_SEARCH_DIALOG (o);
-
- switch (arg_id){
- case ARG_BOOK:
- gtk_object_set(GTK_OBJECT(emvw->view),
- "book", GTK_VALUE_OBJECT (*arg),
- NULL);
- break;
- }
-}
-
-static void
-e_addressbook_search_dialog_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EAddressbookSearchDialog *emvw;
-
- emvw = E_ADDRESSBOOK_SEARCH_DIALOG (object);
-
- switch (arg_id) {
- case ARG_BOOK:
- gtk_object_get(GTK_OBJECT(emvw->view),
- "book", &(GTK_VALUE_OBJECT (*arg)),
- NULL);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_addressbook_search_dialog_destroy (GtkObject *object)
-{
- GTK_OBJECT_CLASS(parent_class)->destroy (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 84af66b4e1..0000000000
--- a/addressbook/gui/search/e-addressbook-search-dialog.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-view-widget.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_SEARCH_DIALOG_H__
-#define __E_ADDRESSBOOK_SEARCH_DIALOG_H__
-
-#include <gnome.h>
-#include <ebook/e-book.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_ADDRESSBOOK_SEARCH_DIALOG_TYPE (e_addressbook_search_dialog_get_type ())
-#define E_ADDRESSBOOK_SEARCH_DIALOG(obj) (GTK_CHECK_CAST ((obj), E_ADDRESSBOOK_SEARCH_DIALOG_TYPE, EAddressbookSearchDialog))
-#define E_ADDRESSBOOK_SEARCH_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_ADDRESSBOOK_SEARCH_DIALOG_TYPE, EAddressbookSearchDialogClass))
-#define E_IS_ADDRESSBOOK_SEARCH_DIALOG(obj) (GTK_CHECK_TYPE ((obj), E_ADDRESSBOOK_SEARCH_DIALOG_TYPE))
-#define E_IS_ADDRESSBOOK_SEARCH_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_ADDRESSBOOK_SEARCH_DIALOG_TYPE))
-
-
-typedef struct _EAddressbookSearchDialog EAddressbookSearchDialog;
-typedef struct _EAddressbookSearchDialogClass EAddressbookSearchDialogClass;
-
-struct _EAddressbookSearchDialog
-{
- GnomeDialog parent;
-
- GtkWidget *search;
- GtkWidget *view;
- GtkWidget *scrolled_window;
-};
-
-struct _EAddressbookSearchDialogClass
-{
- GnomeDialogClass parent_class;
-};
-
-GtkType e_addressbook_search_dialog_get_type (void);
-
-GtkWidget *e_addressbook_search_dialog_new (EBook *book);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_ADDRESSBOOK_SEARCH_DIALOG_H__ */
diff --git a/addressbook/gui/widgets/Makefile.am b/addressbook/gui/widgets/Makefile.am
deleted file mode 100644
index 17f6d00548..0000000000
--- a/addressbook/gui/widgets/Makefile.am
+++ /dev/null
@@ -1,124 +0,0 @@
-INCLUDES = \
- -DG_LOG_DOMAIN=\"e-minicard\" \
- -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 \
- $(BONOBO_GNOME_CFLAGS)
-
-noinst_LIBRARIES = \
- libeminicard.a
-
-libeminicard_a_SOURCES = \
- e-minicard-control.c \
- e-minicard-control.h \
- e-minicard-label.c \
- e-minicard-label.h \
- e-minicard-view-widget.c \
- e-minicard-view-widget.h \
- e-minicard-view.c \
- e-minicard-view.h \
- e-minicard-widget.c \
- e-minicard-widget.h \
- e-minicard.c \
- e-minicard.h \
- e-reflow-sorted.c \
- e-reflow-sorted.h \
- e-reflow.c \
- e-reflow.h
-
-noinst_PROGRAMS = \
- minicard-widget-test \
- minicard-label-test \
- minicard-test \
- reflow-test \
- minicard-view-test
-
-minicard_label_test_SOURCES = \
- test-minicard-label.c
-
-minicard_label_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEGNORBA_LIBS) \
- libeminicard.a \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/e-util/libeutil.la
-
-minicard_test_SOURCES = \
- test-minicard.c
-
-minicard_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEGNORBA_LIBS) \
- libeminicard.a \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/widgets/e-text/libetext.a
-
-reflow_test_SOURCES = \
- test-reflow.c
-
-reflow_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEGNORBA_LIBS) \
- $(BONOBO_GNOME_LIBS) \
- libeminicard.a \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/widgets/e-text/libetext.a
-
-minicard_view_test_SOURCES = \
- test-minicard-view.c
-
-minicard_view_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEGNORBA_LIBS) \
- $(BONOBO_GNOME_LIBS) \
- libeminicard.a \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/widgets/e-text/libetext.a
-
-minicard_widget_test_SOURCES = \
- e-minicard-widget-test.c
-
-minicard_widget_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEGNORBA_LIBS) \
- $(BONOBO_GNOME_LIBS) \
- libeminicard.a \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
- $(top_builddir)/addressbook/printing/libecontactprint.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/widgets/e-text/libetext.a
diff --git a/addressbook/gui/widgets/alphabet.glade b/addressbook/gui/widgets/alphabet.glade
deleted file mode 100644
index bc6e5f3798..0000000000
--- a/addressbook/gui/widgets/alphabet.glade
+++ /dev/null
@@ -1,357 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>alphabet</name>
- <program_name>alphabet</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <gnome_help_support>True</gnome_help_support>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>alphabet.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GtkWindow</class>
- <name>window2</name>
- <visible>False</visible>
- <title>window2</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow-top</name>
- <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
-
- <widget>
- <class>GtkViewport</class>
- <name>viewport1</name>
- <border_width>4</border_width>
- <shadow_type>GTK_SHADOW_NONE</shadow_type>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox2</name>
- <width>27</width>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
-
- <widget>
- <class>GtkButton</class>
- <name>button-1</name>
- <label>123</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-a</name>
- <label>a</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-b</name>
- <label>b</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-c</name>
- <label>c</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-d</name>
- <label>d</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-e</name>
- <label>e</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-f</name>
- <label>f</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-g</name>
- <label>g</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-h</name>
- <label>h</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-i</name>
- <label>i</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-j</name>
- <label>j</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-k</name>
- <label>k</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-l</name>
- <label>l</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-m</name>
- <label>m</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-n</name>
- <label>n</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-o</name>
- <label>o</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-p</name>
- <label>p</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-q</name>
- <label>q</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-r</name>
- <label>r</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-s</name>
- <label>s</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-t</name>
- <label>t</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-u</name>
- <label>u</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-v</name>
- <label>v</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-w</name>
- <can_focus>True</can_focus>
- <label>w</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-x</name>
- <label>x</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-y</name>
- <label>y</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-z</name>
- <label>z</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/gui/widgets/alphabet.glade.h b/addressbook/gui/widgets/alphabet.glade.h
deleted file mode 100644
index 2448eeb4fc..0000000000
--- a/addressbook/gui/widgets/alphabet.glade.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("window2");
-gchar *s = N_("123");
-gchar *s = N_("a");
-gchar *s = N_("b");
-gchar *s = N_("c");
-gchar *s = N_("d");
-gchar *s = N_("e");
-gchar *s = N_("f");
-gchar *s = N_("g");
-gchar *s = N_("h");
-gchar *s = N_("i");
-gchar *s = N_("j");
-gchar *s = N_("k");
-gchar *s = N_("l");
-gchar *s = N_("m");
-gchar *s = N_("n");
-gchar *s = N_("o");
-gchar *s = N_("p");
-gchar *s = N_("q");
-gchar *s = N_("r");
-gchar *s = N_("s");
-gchar *s = N_("t");
-gchar *s = N_("u");
-gchar *s = N_("v");
-gchar *s = N_("w");
-gchar *s = N_("x");
-gchar *s = N_("y");
-gchar *s = N_("z");
diff --git a/addressbook/gui/widgets/e-addressbook-model.c b/addressbook/gui/widgets/e-addressbook-model.c
deleted file mode 100644
index d46b42fe00..0000000000
--- a/addressbook/gui/widgets/e-addressbook-model.c
+++ /dev/null
@@ -1,421 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- *
- * Author:
- * Christopher James Lahey <clahey@helixcode.com>
- *
- * (C) 1999 Helix Code, Inc.
- */
-
-#include <config.h>
-#include "e-addressbook-model.h"
-#include <gnome-xml/tree.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-#include <gnome.h>
-
-#define PARENT_TYPE e_table_model_get_type()
-ETableModelClass *parent_class;
-
-/*
- * EAddressbookModel callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-static void e_addressbook_model_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_addressbook_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-
-enum {
- ARG_0,
- ARG_BOOK,
- ARG_QUERY,
- ARG_EDITABLE,
-};
-
-static void
-addressbook_destroy(GtkObject *object)
-{
- EAddressbookModel *model = E_ADDRESSBOOK_MODEL(object);
- int i;
-
- if (model->get_view_idle)
- g_source_remove(model->get_view_idle);
- if (model->book_view && model->create_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->create_card_id);
- if (model->book_view && model->remove_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->remove_card_id);
- if (model->book_view && model->modify_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->modify_card_id);
- if (model->book)
- gtk_object_unref(GTK_OBJECT(model->book));
- if (model->book_view)
- gtk_object_unref(GTK_OBJECT(model->book_view));
-
- for ( i = 0; i < model->data_count; i++ ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- }
- g_free(model->data);
-}
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-addressbook_col_count (ETableModel *etc)
-{
- return E_CARD_SIMPLE_FIELD_LAST;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-addressbook_row_count (ETableModel *etc)
-{
- EAddressbookModel *addressbook = E_ADDRESSBOOK_MODEL(etc);
- return addressbook->data_count;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-addressbook_value_at (ETableModel *etc, int col, int row)
-{
- EAddressbookModel *addressbook = E_ADDRESSBOOK_MODEL(etc);
- const char *value;
- if ( col >= E_CARD_SIMPLE_FIELD_LAST - 1 || row >= addressbook->data_count )
- return NULL;
-
- value = e_card_simple_get_const(addressbook->data[row],
- col + 1);
- return (void *)(value ? value : "");
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-addressbook_set_value_at (ETableModel *etc, int col, int row, const void *val)
-{
- EAddressbookModel *addressbook = E_ADDRESSBOOK_MODEL(etc);
- ECard *card;
- if (addressbook->editable) {
- if ( col >= E_CARD_SIMPLE_FIELD_LAST - 1|| row >= addressbook->data_count )
- return;
- e_card_simple_set(addressbook->data[row],
- col + 1,
- val);
- gtk_object_get(GTK_OBJECT(addressbook->data[row]),
- "card", &card,
- NULL);
- e_book_commit_card(addressbook->book, card, NULL, NULL);
-
- 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)
-{
- return E_ADDRESSBOOK_MODEL(etc)->editable;
-}
-
-static void
-addressbook_append_row (ETableModel *etm, ETableModel *source, gint row)
-{
- ECard *card;
- ECardSimple *simple;
- EAddressbookModel *addressbook = E_ADDRESSBOOK_MODEL(etm);
- int col;
-
- card = e_card_new("");
- simple = e_card_simple_new(card);
-
- for (col = 0; col < E_CARD_SIMPLE_FIELD_LAST - 1; col++) {
- const void *val = e_table_model_value_at(source, col, row);
- e_card_simple_set(simple,
- col + 1,
- val);
- }
- e_card_simple_sync_card(simple);
- e_book_add_card(addressbook->book, card, NULL, NULL);
- gtk_object_unref(GTK_OBJECT(simple));
- gtk_object_unref(GTK_OBJECT(card));
-}
-
-/* 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
-create_card(EBookView *book_view,
- const GList *cards,
- EAddressbookModel *model)
-{
- model->data = g_realloc(model->data, (model->data_count + g_list_length((GList *)cards)) * sizeof(ECard *));
- for ( ; cards; cards = cards->next) {
- model->data[model->data_count++] = e_card_simple_new (E_CARD(cards->data));
- e_table_model_row_inserted(E_TABLE_MODEL(model), model->data_count - 1);
- }
-}
-
-static void
-remove_card(EBookView *book_view,
- const char *id,
- EAddressbookModel *model)
-{
- int i;
- for ( i = 0; i < model->data_count; i++) {
- if ( !strcmp(e_card_simple_get_id(model->data[i]), id) ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- memmove(model->data + i, model->data + i + 1, (model->data_count - i - 1) * sizeof (ECard *));
- e_table_model_row_deleted(E_TABLE_MODEL(model), i);
- }
- }
-}
-
-static void
-modify_card(EBookView *book_view,
- const GList *cards,
- EAddressbookModel *model)
-{
- for ( ; cards; cards = cards->next) {
- int i;
- for ( i = 0; i < model->data_count; i++) {
- if ( !strcmp(e_card_simple_get_id(model->data[i]), e_card_get_id(E_CARD(cards->data))) ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- model->data[i] = e_card_simple_new(E_CARD(cards->data));
- gtk_object_ref(GTK_OBJECT(model->data[i]));
- e_table_model_row_changed(E_TABLE_MODEL(model), i);
- break;
- }
- }
- }
-}
-
-static void
-e_addressbook_model_class_init (GtkObjectClass *object_class)
-{
- ETableModelClass *model_class = (ETableModelClass *) object_class;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = addressbook_destroy;
- object_class->set_arg = e_addressbook_model_set_arg;
- object_class->get_arg = e_addressbook_model_get_arg;
-
- gtk_object_add_arg_type ("EAddressbookModel::book", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_BOOK);
- gtk_object_add_arg_type ("EAddressbookModel::query", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_QUERY);
- gtk_object_add_arg_type ("EAddressbookModel::editable", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_EDITABLE);
-
- 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
-e_addressbook_model_init (GtkObject *object)
-{
- EAddressbookModel *model = E_ADDRESSBOOK_MODEL(object);
- model->book = NULL;
- model->query = g_strdup("(contains \"x-evolution-any-field\" \"\")");
- model->book_view = NULL;
- model->get_view_idle = 0;
- model->create_card_id = 0;
- model->remove_card_id = 0;
- model->modify_card_id = 0;
- model->data = NULL;
- model->data_count = 0;
- model->editable = TRUE;
-}
-
-static void
-book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure)
-{
- EAddressbookModel *model = closure;
- int i;
- if (model->book_view && model->create_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->create_card_id);
- if (model->book_view && model->remove_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->remove_card_id);
- if (model->book_view && model->modify_card_id)
- gtk_signal_disconnect(GTK_OBJECT (model->book_view),
- model->modify_card_id);
- if (model->book_view)
- gtk_object_unref(GTK_OBJECT(model->book_view));
- model->book_view = book_view;
- if (model->book_view)
- gtk_object_ref(GTK_OBJECT(model->book_view));
- model->create_card_id = gtk_signal_connect(GTK_OBJECT(model->book_view),
- "card_added",
- GTK_SIGNAL_FUNC(create_card),
- model);
- model->remove_card_id = gtk_signal_connect(GTK_OBJECT(model->book_view),
- "card_removed",
- GTK_SIGNAL_FUNC(remove_card),
- model);
- model->modify_card_id = gtk_signal_connect(GTK_OBJECT(model->book_view),
- "card_changed",
- GTK_SIGNAL_FUNC(modify_card),
- model);
-
- for ( i = 0; i < model->data_count; i++ ) {
- gtk_object_unref(GTK_OBJECT(model->data[i]));
- }
-
- e_table_model_pre_change(E_TABLE_MODEL(model));
- g_free(model->data);
- model->data = NULL;
- model->data_count = 0;
- e_table_model_changed(E_TABLE_MODEL(model));
-}
-
-static gboolean
-get_view(EAddressbookModel *model)
-{
- if (model->book && model->query)
- e_book_get_book_view(model->book, model->query, book_view_loaded, model);
-
- model->get_view_idle = 0;
- return FALSE;
-}
-
-ECard *
-e_addressbook_model_get_card(EAddressbookModel *model,
- int row)
-{
- if (model->data && row < model->data_count) {
- ECard *card;
- gtk_object_get(GTK_OBJECT(model->data[row]),
- "card", &card,
- NULL);
- gtk_object_ref(GTK_OBJECT(card));
- return card;
- }
- return NULL;
-}
-
-static void
-e_addressbook_model_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EAddressbookModel *model;
-
- model = E_ADDRESSBOOK_MODEL (o);
-
- switch (arg_id){
- case ARG_BOOK:
- if (model->book)
- gtk_object_unref(GTK_OBJECT(model->book));
- model->book = E_BOOK(GTK_VALUE_OBJECT (*arg));
- if (model->book) {
- gtk_object_ref(GTK_OBJECT(model->book));
- if (model->get_view_idle == 0)
- model->get_view_idle = g_idle_add((GSourceFunc)get_view, model);
- }
- break;
- case ARG_QUERY:
- if (model->query)
- g_free(model->query);
- model->query = g_strdup(GTK_VALUE_STRING (*arg));
- if (model->get_view_idle == 0)
- model->get_view_idle = g_idle_add((GSourceFunc)get_view, model);
- break;
- case ARG_EDITABLE:
- model->editable = GTK_VALUE_BOOL (*arg);
- break;
- }
-}
-
-static void
-e_addressbook_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EAddressbookModel *e_addressbook_model;
-
- e_addressbook_model = E_ADDRESSBOOK_MODEL (object);
-
- switch (arg_id) {
- case ARG_BOOK:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_addressbook_model->book);
- break;
- case ARG_QUERY:
- GTK_VALUE_STRING (*arg) = g_strdup(e_addressbook_model->query);
- break;
- case ARG_EDITABLE:
- GTK_VALUE_BOOL (*arg) = e_addressbook_model->editable;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-GtkType
-e_addressbook_model_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "EAddressbookModel",
- sizeof (EAddressbookModel),
- sizeof (EAddressbookModelClass),
- (GtkClassInitFunc) e_addressbook_model_class_init,
- (GtkObjectInitFunc) e_addressbook_model_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-ETableModel *
-e_addressbook_model_new (void)
-{
- EAddressbookModel *et;
-
- et = gtk_type_new (e_addressbook_model_get_type ());
-
- return E_TABLE_MODEL(et);
-}
diff --git a/addressbook/gui/widgets/e-addressbook-model.h b/addressbook/gui/widgets/e-addressbook-model.h
deleted file mode 100644
index 8f5f6485cf..0000000000
--- a/addressbook/gui/widgets/e-addressbook-model.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_ADDRESSBOOK_MODEL_H_
-#define _E_ADDRESSBOOK_MODEL_H_
-
-#include "e-table-model.h"
-#include <ebook/e-book.h>
-#include <ebook/e-book-view.h>
-#include <ebook/e-card-simple.h>
-
-#define E_ADDRESSBOOK_MODEL_TYPE (e_addressbook_model_get_type ())
-#define E_ADDRESSBOOK_MODEL(o) (GTK_CHECK_CAST ((o), E_ADDRESSBOOK_MODEL_TYPE, EAddressbookModel))
-#define E_ADDRESSBOOK_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_ADDRESSBOOK_MODEL_TYPE, EAddressbookModelClass))
-#define E_IS_ADDRESSBOOK_MODEL(o) (GTK_CHECK_TYPE ((o), E_ADDRESSBOOK_MODEL_TYPE))
-#define E_IS_ADDRESSBOOK_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_ADDRESSBOOK_MODEL_TYPE))
-
-/* Virtual Column list:
- 0 Email
- 1 Full Name
- 2 Street
- 3 Phone
-*/
-
-typedef struct {
- ETableModel parent;
-
- /* item specific fields */
- EBook *book;
- char *query;
- EBookView *book_view;
-
- int get_view_idle;
-
- ECardSimple **data;
- int data_count;
-
- int create_card_id, remove_card_id, modify_card_id;
-
- guint editable : 1;
-} EAddressbookModel;
-
-
-typedef struct {
- ETableModelClass parent_class;
-} EAddressbookModelClass;
-
-
-GtkType e_addressbook_model_get_type (void);
-ETableModel *e_addressbook_model_new (void);
-
-/* Returns object with ref count of 1. */
-ECard *e_addressbook_model_get_card(EAddressbookModel *model,
- int row);
-
-#endif /* _E_ADDRESSBOOK_MODEL_H_ */
diff --git a/addressbook/gui/widgets/e-minicard-control.c b/addressbook/gui/widgets/e-minicard-control.c
deleted file mode 100644
index 7c1838b568..0000000000
--- a/addressbook/gui/widgets/e-minicard-control.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-control.c
- *
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright 1999, 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <bonobo.h>
-
-#include "addressbook/backend/ebook/e-book.h"
-
-#include "e-minicard-control.h"
-#include "e-minicard-widget.h"
-#include "addressbook/backend/ebook/e-card.h"
-
-#if 0
-enum {
- PROP_RUNNING
-} MyArgs;
-
-#define RUNNING_KEY "Clock::Running"
-
-static void
-get_prop (BonoboPropertyBag *bag,
- BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- GtkObject *clock = user_data;
-
- switch (arg_id) {
-
- case PROP_RUNNING:
- {
- gboolean b = GPOINTER_TO_UINT (gtk_object_get_data (clock, RUNNING_KEY));
- BONOBO_ARG_SET_BOOLEAN (arg, b);
- break;
- }
-
- default:
- g_warning ("Unhandled arg %d", arg_id);
- break;
- }
-}
-
-static void
-set_prop (BonoboPropertyBag *bag,
- const BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- GtkClock *clock = user_data;
-
- switch (arg_id) {
-
- case PROP_RUNNING:
- {
- guint i;
-
- i = BONOBO_ARG_GET_BOOLEAN (arg);
-
- if (i)
- gtk_clock_start (clock);
- else
- gtk_clock_stop (clock);
-
- gtk_object_set_data (GTK_OBJECT (clock), RUNNING_KEY,
- GUINT_TO_POINTER (i));
- break;
- }
-
- default:
- g_warning ("Unhandled arg %d", arg_id);
- break;
- }
-}
-#endif
-
-/*
- * 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);
-
- memcpy (data + length,
- buffer->_buffer, buffer->_length);
-
- length += buffer->_length;
-
- CORBA_free (buffer);
- } 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.
- */
-static void
-pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
- Bonobo_Persist_ContentType type, void *data,
- CORBA_Environment *ev)
-{
- ECard *card;
- char *vcard;
- GtkWidget *minicard = data;
-
- if (type && g_strcasecmp (type, "text/vCard") != 0 &&
- g_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;
- }
-
- card = e_card_new(vcard);
- g_free(vcard);
- gtk_object_set(GTK_OBJECT(minicard),
- "card", card,
- NULL);
- gtk_object_unref(GTK_OBJECT(card));
-} /* 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)
-{
- char *vcard;
- ECard *card;
- EMinicardWidget *minicard = data;
- int length;
-
- if (type && g_strcasecmp (type, "text/vCard") != 0 &&
- g_strcasecmp (type, "text/x-vCard") != 0) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Bonobo_Persist_WrongDataType, NULL);
- return;
- }
-
- gtk_object_get (GTK_OBJECT (minicard),
- "card", &card,
- NULL);
- vcard = e_card_get_vcard(card);
- length = strlen (vcard);
- bonobo_stream_client_write (stream, vcard, length, ev);
- g_free (vcard);
-} /* pstream_save */
-
-static CORBA_long
-pstream_get_max_size (BonoboPersistStream *ps, void *data,
- CORBA_Environment *ev)
-{
- GtkWidget *minicard = data;
- ECard *card;
- char *vcard;
- gint length;
-
- gtk_object_get (GTK_OBJECT (minicard),
- "card", &card, NULL);
- vcard = e_card_get_vcard(card);
- length = strlen (vcard);
- g_free (vcard);
-
- return length;
-}
-
-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)
-{
- ECard *card = closure;
- e_book_add_card(book, card, NULL, NULL);
-}
-
-static void
-save_in_addressbook(GtkWidget *button, EMinicardWidget *minicard)
-{
- EBook *book;
- gchar *path, *uri;
- ECard *card;
-
- book = e_book_new ();
-
- if (!book) {
- printf ("%s: %s(): Couldn't create EBook, bailing.\n",
- __FILE__,
- __FUNCTION__);
- return;
- }
-
-
- path = g_concat_dir_and_file (g_get_home_dir (),
- "evolution/local/Contacts/addressbook.db");
- uri = g_strdup_printf ("file://%s", path);
- g_free (path);
-
- gtk_object_get(GTK_OBJECT(minicard),
- "card", &card,
- NULL);
-
- if (! e_book_load_uri (book, uri, book_open_cb, card)) {
- printf ("error calling load_uri!\n");
- }
- g_free(uri);
-}
-
-static BonoboObject *
-e_minicard_control_factory (BonoboGenericFactory *Factory, void *closure)
-{
-#if 0
- BonoboPropertyBag *pb;
-#endif
- BonoboControl *control;
- BonoboPersistStream *stream;
- GtkWidget *minicard;
- GtkWidget *button;
- GtkWidget *vbox;
-
- /* Create the control. */
-
- minicard = e_minicard_widget_new ();
- gtk_widget_show (minicard);
-
- button = gtk_button_new_with_label(_("Save in addressbook"));
- gtk_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(save_in_addressbook), minicard);
- gtk_widget_show (button);
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), minicard, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
- gtk_widget_show (vbox);
-
- control = bonobo_control_new (vbox);
-
- stream = bonobo_persist_stream_new (pstream_load, pstream_save,
- pstream_get_max_size,
- pstream_get_content_types,
- minicard);
-
-#if 0
- /* Create the properties. */
- pb = bonobo_property_bag_new (get_prop, set_prop, clock);
- bonobo_control_set_property_bag (control, pb);
-
- bonobo_property_bag_add (pb, "running", PROP_RUNNING,
- BONOBO_ARG_BOOLEAN, NULL,
- "Whether or not the clock is running", 0);
-#endif
-
- if (stream == NULL) {
- bonobo_object_unref (BONOBO_OBJECT (control));
- return NULL;
- }
-
- bonobo_object_add_interface (BONOBO_OBJECT (control),
- BONOBO_OBJECT (stream));
-
- return BONOBO_OBJECT (control);
-}
-
-void
-e_minicard_control_factory_init (void)
-{
- static BonoboGenericFactory *factory = NULL;
-
- if (factory != NULL)
- return;
-
-#if USING_OAF
- factory =
- bonobo_generic_factory_new (
- "OAFIID:control-factory:e_minicard:16bb7c25-c7d2-46dc-a5f0-a0975d0e0595",
- e_minicard_control_factory, NULL);
-#else
- factory =
- bonobo_generic_factory_new (
- "control-factory:e-minicard",
- e_minicard_control_factory, NULL);
-#endif
-
- if (factory == NULL)
- g_error ("I could not register a EMinicard control factory.");
-}
diff --git a/addressbook/gui/widgets/e-minicard-control.h b/addressbook/gui/widgets/e-minicard-control.h
deleted file mode 100644
index 4a0da88435..0000000000
--- a/addressbook/gui/widgets/e-minicard-control.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __E_MINICARD_CONTROL_H__
-#define __E_MINICARD_CONTROL_H__
-
-#include <bonobo/bonobo-control.h>
-
-void e_minicard_control_factory_init (void);
-
-#endif /* __E_MINICARD_CONTROL_H__ */
diff --git a/addressbook/gui/widgets/e-minicard-label.c b/addressbook/gui/widgets/e-minicard-label.c
deleted file mode 100644
index e765a89f21..0000000000
--- a/addressbook/gui/widgets/e-minicard-label.c
+++ /dev/null
@@ -1,446 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-label.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-minicard-label.h"
-#include "e-text.h"
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-#include <e-util/e-canvas-utils.h>
-
-static void e_minicard_label_init (EMinicardLabel *card);
-static void e_minicard_label_class_init (EMinicardLabelClass *klass);
-static void e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_minicard_label_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-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_resize_children( EMinicardLabel *e_minicard_label );
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_HAS_FOCUS,
- ARG_FIELD,
- ARG_FIELDNAME,
- ARG_TEXT_MODEL,
- ARG_MAX_FIELD_NAME_WIDTH,
-};
-
-GtkType
-e_minicard_label_get_type (void)
-{
- static GtkType minicard_label_type = 0;
-
- if (!minicard_label_type)
- {
- static const GtkTypeInfo minicard_label_info =
- {
- "EMinicardLabel",
- sizeof (EMinicardLabel),
- sizeof (EMinicardLabelClass),
- (GtkClassInitFunc) e_minicard_label_class_init,
- (GtkObjectInitFunc) e_minicard_label_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- minicard_label_type = gtk_type_unique (gnome_canvas_group_get_type (), &minicard_label_info);
- }
-
- return minicard_label_type;
-}
-
-static void
-e_minicard_label_class_init (EMinicardLabelClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- gtk_object_add_arg_type ("EMinicardLabel::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("EMinicardLabel::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("EMinicardLabel::has_focus", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_HAS_FOCUS);
- gtk_object_add_arg_type ("EMinicardLabel::field", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_FIELD);
- gtk_object_add_arg_type ("EMinicardLabel::fieldname", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_FIELDNAME);
- gtk_object_add_arg_type ("EMinicardLabel::text_model", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_TEXT_MODEL);
- gtk_object_add_arg_type ("EMinicardLabel::max_field_name_length", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MAX_FIELD_NAME_WIDTH);
-
- object_class->set_arg = e_minicard_label_set_arg;
- object_class->get_arg = e_minicard_label_get_arg;
- /* object_class->destroy = e_minicard_label_destroy; */
-
- /* 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_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EMinicardLabel *e_minicard_label;
-
- item = GNOME_CANVAS_ITEM (o);
- e_minicard_label = E_MINICARD_LABEL (o);
-
- switch (arg_id){
- case ARG_WIDTH:
- e_minicard_label->width = GTK_VALUE_DOUBLE (*arg);
- e_minicard_label_resize_children(e_minicard_label);
- e_canvas_item_request_reflow (item);
- break;
- case ARG_HAS_FOCUS:
- if (e_minicard_label->field && (GTK_VALUE_ENUM(*arg) != E_FOCUS_NONE))
- e_canvas_item_grab_focus(e_minicard_label->field);
- break;
- case ARG_FIELD:
- gnome_canvas_item_set( e_minicard_label->field, "text", GTK_VALUE_STRING (*arg), NULL );
- break;
- case ARG_FIELDNAME:
- gnome_canvas_item_set( e_minicard_label->fieldname, "text", GTK_VALUE_STRING (*arg), NULL );
- break;
- case ARG_TEXT_MODEL:
- gnome_canvas_item_set( e_minicard_label->field, "model", GTK_VALUE_OBJECT (*arg), NULL);
- break;
- case ARG_MAX_FIELD_NAME_WIDTH:
- e_minicard_label->max_field_name_length = GTK_VALUE_DOUBLE (*arg);
- break;
- }
-}
-
-static void
-e_minicard_label_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicardLabel *e_minicard_label;
- char *temp;
- ETextModel *tempmodel;
-
- e_minicard_label = E_MINICARD_LABEL (object);
-
- switch (arg_id) {
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_minicard_label->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = e_minicard_label->height;
- break;
- case ARG_HAS_FOCUS:
- GTK_VALUE_ENUM (*arg) = e_minicard_label->has_focus ? E_FOCUS_CURRENT : E_FOCUS_NONE;
- break;
- case ARG_FIELD:
- gtk_object_get( GTK_OBJECT( e_minicard_label->field ), "text", &temp, NULL );
- GTK_VALUE_STRING (*arg) = temp;
- break;
- case ARG_FIELDNAME:
- gtk_object_get( GTK_OBJECT( e_minicard_label->fieldname ), "text", &temp, NULL );
- GTK_VALUE_STRING (*arg) = temp;
- break;
- case ARG_TEXT_MODEL:
- gtk_object_get( GTK_OBJECT( e_minicard_label->field ), "model", &tempmodel, NULL );
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(tempmodel);
- break;
- case ARG_MAX_FIELD_NAME_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_minicard_label->max_field_name_length;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_minicard_label_realize (GnomeCanvasItem *item)
-{
- if (GNOME_CANVAS_ITEM_CLASS( parent_class )->realize)
- (* GNOME_CANVAS_ITEM_CLASS( parent_class )->realize) (item);
-
- e_canvas_item_request_reflow(item);
-
- if (!item->canvas->aa)
- {
- }
-}
-
-void
-e_minicard_label_construct (GnomeCanvasItem *item)
-{
- EMinicardLabel *e_minicard_label;
- GnomeCanvasGroup *group;
- static GdkFont *font = NULL;
-
- if (font == NULL) {
- font = gdk_font_load("lucidasans-10");
- }
-
- e_minicard_label = E_MINICARD_LABEL (item);
- group = GNOME_CANVAS_GROUP( 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,
- "font_gdk", font,
- "fill_color", "black",
- 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,
- "font_gdk", font,
- "fill_color", "black",
- "editable", TRUE,
- NULL );
- e_canvas_item_move_absolute(e_minicard_label->field, ( e_minicard_label->width / 2 + 2), 1);
-
- 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 (!item->canvas->aa)
- {
- }
-
- 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_FOCUS_CHANGE:
- {
- GdkEventFocus *focus_event = (GdkEventFocus *) event;
- if ( focus_event->in )
- {
- gnome_canvas_item_set( e_minicard_label->rect,
- "outline_color", "grey50",
- "fill_color", "grey90",
- NULL );
- e_minicard_label->has_focus = TRUE;
- }
- else
- {
- gnome_canvas_item_set( e_minicard_label->rect,
- "outline_color", NULL,
- "fill_color", NULL,
- NULL );
- e_minicard_label->has_focus = FALSE;
- }
- }
- break;
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- case GDK_MOTION_NOTIFY:
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY: {
- gboolean return_val;
-#if 0
- GnomeCanvasItem *field;
- ArtPoint p;
- double inv[6], affine[6];
-
- field = e_minicard_label->field;
- art_affine_identity (affine);
-
- if (field->xform != NULL) {
- if (field->object.flags & GNOME_CANVAS_ITEM_AFFINE_FULL) {
- art_affine_multiply (affine, affine, field->xform);
- } else {
- affine[4] += field->xform[0];
- affine[5] += field->xform[1];
- }
- }
-
- art_affine_invert (inv, affine);
- switch(event->type) {
- case GDK_MOTION_NOTIFY:
- p.x = event->motion.x;
- p.y = event->motion.y;
- art_affine_point (&p, &p, inv);
- event->motion.x = p.x;
- event->motion.y = p.y;
- break;
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- p.x = event->button.x;
- p.y = event->button.y;
- art_affine_point (&p, &p, inv);
- event->button.x = p.x;
- event->button.y = p.y;
- break;
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- p.x = event->crossing.x;
- p.y = event->crossing.y;
- art_affine_point (&p, &p, inv);
- event->crossing.x = p.x;
- event->crossing.y = p.y;
- break;
- default:
- break;
- }
-#endif
- gtk_signal_emit_by_name(GTK_OBJECT(e_minicard_label->field), "event", event, &return_val);
- return return_val;
- 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_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) ( left_width ),
- NULL );
- gnome_canvas_item_set( e_minicard_label->field,
- "clip_width", (double) ( e_minicard_label->width - 8 - left_width ),
- NULL );
-}
-
-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;
-
- gtk_object_get(GTK_OBJECT(e_minicard_label->fieldname),
- "text_height", &text_height,
- NULL);
-
- e_minicard_label->height = text_height;
-
-
- gtk_object_get(GTK_OBJECT(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 );
-
- 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);
- e_minicard_label_construct(item);
- 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 08eb51ee53..0000000000
--- a/addressbook/gui/widgets/e-minicard-label.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-label.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.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_MINICARD_LABEL_TYPE (e_minicard_label_get_type ())
-#define E_MINICARD_LABEL(obj) (GTK_CHECK_CAST ((obj), E_MINICARD_LABEL_TYPE, EMinicardLabel))
-#define E_MINICARD_LABEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_MINICARD_LABEL_TYPE, EMiniCardLabelClass))
-#define E_IS_MINICARD_LABEL(obj) (GTK_CHECK_TYPE ((obj), E_MINICARD_LABEL_TYPE))
-#define E_IS_MINICARD_LABEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_MINICARD_LABEL_TYPE))
-
-
-typedef struct _EMinicardLabel EMinicardLabel;
-typedef struct _EMinicardLabelClass EMinicardLabelClass;
-
-struct _EMinicardLabel
-{
- GnomeCanvasGroup parent;
-
- /* item specific fields */
- double width;
- double height;
- double max_field_name_length;
- GnomeCanvasItem *fieldname;
- GnomeCanvasItem *field;
- GnomeCanvasItem *rect;
-
- gboolean has_focus;
-};
-
-struct _EMinicardLabelClass
-{
- GnomeCanvasGroupClass parent_class;
-};
-
-
-GtkType 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 cd1a999f14..0000000000
--- a/addressbook/gui/widgets/e-minicard-view-widget.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-view-widget.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-util/e-canvas.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_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_minicard_view_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_minicard_view_widget_destroy (GtkObject *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_realize (GtkWidget *widget);
-
-static ECanvasClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_BOOK,
- ARG_QUERY
-};
-
-GtkType
-e_minicard_view_widget_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type)
- {
- static const GtkTypeInfo info =
- {
- "EMinicardViewWidget",
- sizeof (EMinicardViewWidget),
- sizeof (EMinicardViewWidgetClass),
- (GtkClassInitFunc) e_minicard_view_widget_class_init,
- (GtkObjectInitFunc) e_minicard_view_widget_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (e_canvas_get_type (), &info);
- }
-
- return type;
-}
-
-static void
-e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- ECanvasClass *canvas_class;
-
- object_class = (GtkObjectClass*) klass;
- widget_class = GTK_WIDGET_CLASS (klass);
- canvas_class = E_CANVAS_CLASS (klass);
-
- parent_class = gtk_type_class (e_canvas_get_type ());
-
- gtk_object_add_arg_type ("EMinicardViewWidget::book", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_BOOK);
- gtk_object_add_arg_type ("EMinicardViewWidget::query", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_QUERY);
-
- object_class->set_arg = e_minicard_view_widget_set_arg;
- object_class->get_arg = e_minicard_view_widget_get_arg;
- object_class->destroy = e_minicard_view_widget_destroy;
-
- 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;
-}
-
-static void
-e_minicard_view_widget_init (EMinicardViewWidget *view)
-{
- view->emv = NULL;
- view->rect = NULL;
-
- view->book = NULL;
- view->query = NULL;
-}
-
-GtkWidget *
-e_minicard_view_widget_new (void)
-{
- return GTK_WIDGET (gtk_type_new (e_minicard_view_widget_get_type ()));
-}
-
-static void
-e_minicard_view_widget_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EMinicardViewWidget *emvw;
-
- emvw = E_MINICARD_VIEW_WIDGET (o);
-
- switch (arg_id){
- case ARG_BOOK:
- if (emvw->book)
- gtk_object_unref(GTK_OBJECT(emvw->book));
- emvw->book = E_BOOK(GTK_VALUE_OBJECT (*arg));
- if (emvw->book)
- gtk_object_ref(GTK_OBJECT(emvw->book));
- if (emvw->emv)
- gtk_object_set(GTK_OBJECT(emvw->emv),
- "book", emvw->book,
- NULL);
- break;
- case ARG_QUERY:
- emvw->query = g_strdup(GTK_VALUE_STRING (*arg));
- if (emvw->emv)
- gtk_object_set(GTK_OBJECT(emvw->emv),
- "query", emvw->query,
- NULL);
- break;
- }
-}
-
-static void
-e_minicard_view_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicardViewWidget *emvw;
-
- emvw = E_MINICARD_VIEW_WIDGET (object);
-
- switch (arg_id) {
- case ARG_BOOK:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(emvw->book);
- break;
- case ARG_QUERY:
- GTK_VALUE_STRING (*arg) = g_strdup(emvw->query);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_minicard_view_widget_destroy (GtkObject *object)
-{
- EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(object);
-
- if (view->book)
- gtk_object_unref(GTK_OBJECT(view->book));
- g_free(view->query);
-
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
-}
-
-static void
-e_minicard_view_widget_realize (GtkWidget *widget)
-{
- EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(widget);
-
- view->rect = gnome_canvas_item_new(
- gnome_canvas_root( GNOME_CANVAS(view) ),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) 100,
- "y2", (double) 100,
- "fill_color", "white",
- 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,
- NULL );
- gtk_object_set(GTK_OBJECT(view->emv),
- "book", view->book,
- "query", view->query,
- NULL);
-
- 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 );
- gtk_object_get(GTK_OBJECT(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);
- gnome_canvas_item_set( view->rect,
- "x2", (double) width,
- "y2", (double) allocation->height,
- NULL );
- }
-}
-
-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);
-
- gtk_object_get(GTK_OBJECT(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.width - 1);
- gnome_canvas_item_set( view->rect,
- "x2", (double) width,
- "y2", (double) GTK_WIDGET(canvas)->allocation.height,
- NULL );
-}
-
-void
-e_minicard_view_widget_remove_selection(EMinicardViewWidget *view,
- EBookCallback cb,
- gpointer closure)
-{
- if (view->emv)
- e_minicard_view_remove_selection(E_MINICARD_VIEW(view->emv), cb, closure);
-}
-
-void e_minicard_view_widget_jump_to_letter (EMinicardViewWidget *view,
- char letter)
-{
- if (view->emv)
- e_minicard_view_jump_to_letter(E_MINICARD_VIEW(view->emv), letter);
-}
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 340fb1e03c..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 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-minicard-view.h"
-#include "e-util/e-canvas.h"
-#include <ebook/e-book.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_MINICARD_VIEW_WIDGET_TYPE (e_minicard_view_widget_get_type ())
-#define E_MINICARD_VIEW_WIDGET(obj) (GTK_CHECK_CAST ((obj), E_MINICARD_VIEW_WIDGET_TYPE, EMinicardViewWidget))
-#define E_MINICARD_VIEW_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_MINICARD_VIEW_WIDGET_TYPE, EMinicardViewWidgetClass))
-#define E_IS_MINICARD_VIEW_WIDGET(obj) (GTK_CHECK_TYPE ((obj), E_MINICARD_VIEW_WIDGET_TYPE))
-#define E_IS_MINICARD_VIEW_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_MINICARD_VIEW_WIDGET_TYPE))
-
-
-typedef struct _EMinicardViewWidget EMinicardViewWidget;
-typedef struct _EMinicardViewWidgetClass EMinicardViewWidgetClass;
-
-struct _EMinicardViewWidget
-{
- ECanvas parent;
-
- GnomeCanvasItem *rect;
- GnomeCanvasItem *emv;
-
- EBook *book;
- char *query;
-};
-
-struct _EMinicardViewWidgetClass
-{
- ECanvasClass parent_class;
-};
-
-GtkType e_minicard_view_widget_get_type (void);
-void e_minicard_view_widget_remove_selection (EMinicardViewWidget *view,
- EBookCallback cb,
- gpointer closure);
-void e_minicard_view_widget_jump_to_letter (EMinicardViewWidget *view,
- char letter);
-
-GtkWidget *e_minicard_view_widget_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#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 011ff9158f..0000000000
--- a/addressbook/gui/widgets/e-minicard-view.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-view.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-util/e-canvas.h>
-#include "e-minicard-view.h"
-#include "e-minicard.h"
-#include "e-contact-editor.h"
-static void e_minicard_view_init (EMinicardView *reflow);
-static void e_minicard_view_class_init (EMinicardViewClass *klass);
-static void e_minicard_view_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_minicard_view_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_minicard_view_destroy (GtkObject *object);
-static gboolean e_minicard_view_event (GnomeCanvasItem *item, GdkEvent *event);
-static void canvas_destroy (GtkObject *object, EMinicardView *view);
-static void disconnect_signals (EMinicardView *view);
-
-static EReflowSortedClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_BOOK,
- ARG_QUERY
-};
-
-GtkType
-e_minicard_view_get_type (void)
-{
- static GtkType reflow_type = 0;
-
- if (!reflow_type)
- {
- static const GtkTypeInfo reflow_info =
- {
- "EMinicardView",
- sizeof (EMinicardView),
- sizeof (EMinicardViewClass),
- (GtkClassInitFunc) e_minicard_view_class_init,
- (GtkObjectInitFunc) e_minicard_view_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- reflow_type = gtk_type_unique (e_reflow_sorted_get_type (), &reflow_info);
- }
-
- return reflow_type;
-}
-
-static void
-e_minicard_view_class_init (EMinicardViewClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (e_reflow_sorted_get_type ());
-
- gtk_object_add_arg_type ("EMinicardView::book", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_BOOK);
- gtk_object_add_arg_type ("EMinicardView::query", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_QUERY);
-
- object_class->set_arg = e_minicard_view_set_arg;
- object_class->get_arg = e_minicard_view_get_arg;
- object_class->destroy = e_minicard_view_destroy;
-
- item_class->event = e_minicard_view_event;
-
- /* GnomeCanvasItem method overrides */
-}
-
-static void
-e_minicard_view_init (EMinicardView *view)
-{
- view->book = NULL;
- view->query = g_strdup("(contains \"x-evolution-any-field\" \"\")");
- view->book_view = NULL;
- view->get_view_idle = 0;
- view->create_card_id = 0;
- view->remove_card_id = 0;
- view->modify_card_id = 0;
- view->canvas_destroy_id = 0;
-
- gtk_object_set(GTK_OBJECT(view),
- "empty_message", _("\n\nThere are no items to show in this view\n\n"
- "Double-click here to create a new Contact."),
- NULL);
-
- E_REFLOW_SORTED(view)->compare_func = (GCompareFunc) e_minicard_compare;
- E_REFLOW_SORTED(view)->string_func = (EReflowStringFunc) e_minicard_get_card_id;
-}
-
-static void
-create_card(EBookView *book_view, const GList *cards, EMinicardView *view)
-{
- for (; cards; cards = g_list_next(cards)) {
- GnomeCanvasItem *item = gnome_canvas_item_new(GNOME_CANVAS_GROUP(view),
- e_minicard_get_type(),
- "card", cards->data,
- NULL);
- e_reflow_add_item(E_REFLOW(view), item);
- }
-}
-
-static void
-modify_card(EBookView *book_view, const GList *cards, EMinicardView *view)
-{
- for (; cards; cards = g_list_next(cards)) {
- ECard *card = cards->data;
- gchar *id = e_card_get_id(card);
- GnomeCanvasItem *item = e_reflow_sorted_get_item(E_REFLOW_SORTED(view), id);
- if (item && !GTK_OBJECT_DESTROYED(item)) {
- gnome_canvas_item_set(item,
- "card", card,
- NULL);
- e_reflow_sorted_reorder_item(E_REFLOW_SORTED(view), id);
- }
- }
-}
-
-static void
-remove_card(EBookView *book_view, const char *id, EMinicardView *view)
-{
- e_reflow_sorted_remove_item(E_REFLOW_SORTED(view), id);
-}
-
-static void
-book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure)
-{
- EMinicardView *view = closure;
- disconnect_signals(view);
- if (view->book_view)
- gtk_object_unref(GTK_OBJECT(view->book_view));
-
- if (!view->canvas_destroy_id)
- view->canvas_destroy_id =
- gtk_signal_connect(GTK_OBJECT(GNOME_CANVAS_ITEM(view)->canvas),
- "destroy", GTK_SIGNAL_FUNC(canvas_destroy),
- view);
-
- view->book_view = book_view;
- if (view->book_view)
- gtk_object_ref(GTK_OBJECT(view->book_view));
-
-
- view->create_card_id = gtk_signal_connect(GTK_OBJECT(view->book_view),
- "card_added",
- GTK_SIGNAL_FUNC(create_card),
- view);
- view->remove_card_id = gtk_signal_connect(GTK_OBJECT(view->book_view),
- "card_removed",
- GTK_SIGNAL_FUNC(remove_card),
- view);
- view->modify_card_id = gtk_signal_connect(GTK_OBJECT(view->book_view),
- "card_changed",
- GTK_SIGNAL_FUNC(modify_card),
- view);
-
- g_list_foreach(E_REFLOW(view)->items, (GFunc) gtk_object_unref, NULL);
- g_list_foreach(E_REFLOW(view)->items, (GFunc) gtk_object_destroy, NULL);
- g_list_free(E_REFLOW(view)->items);
- E_REFLOW(view)->items = NULL;
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(view));
-}
-
-static gboolean
-get_view(EMinicardView *view)
-{
- if (view->book && view->query)
- e_book_get_book_view(view->book, view->query, book_view_loaded, view);
-
- view->get_view_idle = 0;
- return FALSE;
-}
-
-static void
-e_minicard_view_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EMinicardView *view;
-
- item = GNOME_CANVAS_ITEM (o);
- view = E_MINICARD_VIEW (o);
-
- switch (arg_id){
- case ARG_BOOK:
- if (view->book)
- gtk_object_unref(GTK_OBJECT(view->book));
- if (GTK_VALUE_OBJECT (*arg)) {
- view->book = E_BOOK(GTK_VALUE_OBJECT (*arg));
- gtk_object_ref(GTK_OBJECT(view->book));
- if (view->get_view_idle == 0)
- view->get_view_idle = g_idle_add((GSourceFunc)get_view, view);
- }
- else
- view->book = NULL;
- break;
- case ARG_QUERY:
- g_free(view->query);
- view->query = g_strdup(GTK_VALUE_STRING (*arg));
- if (view->get_view_idle == 0)
- view->get_view_idle = g_idle_add((GSourceFunc)get_view, view);
- break;
- }
-}
-
-static void
-e_minicard_view_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicardView *e_minicard_view;
-
- e_minicard_view = E_MINICARD_VIEW (object);
-
- switch (arg_id) {
- case ARG_BOOK:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_minicard_view->book);
- break;
- case ARG_QUERY:
- GTK_VALUE_STRING (*arg) = g_strdup(e_minicard_view->query);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_minicard_view_destroy (GtkObject *object)
-{
- EMinicardView *view = E_MINICARD_VIEW(object);
-
- if (view->get_view_idle)
- g_source_remove(view->get_view_idle);
- if (view->canvas_destroy_id)
- gtk_signal_disconnect(GTK_OBJECT (GNOME_CANVAS_ITEM(view)->canvas),
- view->canvas_destroy_id);
- disconnect_signals(view);
- g_free(view->query);
- if (view->book)
- gtk_object_unref(GTK_OBJECT(view->book));
- if (view->book_view)
- gtk_object_unref(GTK_OBJECT(view->book_view));
-
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
-}
-
-static void
-card_added_cb (EBook* book, EBookStatus status, const char *id,
- gpointer user_data)
-{
- g_print ("%s: %s(): a card was added\n", __FILE__, __FUNCTION__);
-}
-
-static void
-card_changed_cb (EBook* book, EBookStatus status, gpointer user_data)
-{
- g_print ("%s: %s(): a card was changed with status %d\n", __FILE__, __FUNCTION__, status);
-}
-
-/* Callback for the add_card signal from the contact editor */
-static void
-add_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_add_card (book, card, card_added_cb, NULL);
-}
-
-/* Callback for the commit_card signal from the contact editor */
-static void
-commit_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_commit_card (book, card, card_changed_cb, NULL);
-}
-
-/* Callback used when the contact editor is closed */
-static void
-editor_closed_cb (EContactEditor *ce, gpointer data)
-{
- gtk_object_unref (GTK_OBJECT (ce));
-}
-
-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)
- {
- ECard *card;
- EContactEditor *ce;
- EBook *book;
-
- card = e_card_new("");
-
- gtk_object_get(GTK_OBJECT(view), "book", &book, NULL);
- g_assert (E_IS_BOOK (book));
-
- ce = e_contact_editor_new (card, TRUE);
-
- gtk_signal_connect (GTK_OBJECT (ce), "add_card",
- GTK_SIGNAL_FUNC (add_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "commit_card",
- GTK_SIGNAL_FUNC (commit_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), NULL);
-
- gtk_object_sink(GTK_OBJECT(card));
- }
- return TRUE;
- default:
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS(parent_class)->event(item, event);
- else
- return FALSE;
- break;
- }
-}
-
-static void
-disconnect_signals(EMinicardView *view)
-{
- if (view->book_view && view->create_card_id)
- gtk_signal_disconnect(GTK_OBJECT (view->book_view),
- view->create_card_id);
- if (view->book_view && view->remove_card_id)
- gtk_signal_disconnect(GTK_OBJECT (view->book_view),
- view->remove_card_id);
- if (view->book_view && view->modify_card_id)
- gtk_signal_disconnect(GTK_OBJECT (view->book_view),
- view->modify_card_id);
-
- view->create_card_id = 0;
- view->remove_card_id = 0;
- view->modify_card_id = 0;
-}
-
-static void
-canvas_destroy(GtkObject *object, EMinicardView *view)
-{
- disconnect_signals(view);
-}
-
-void
-e_minicard_view_remove_selection(EMinicardView *view,
- EBookCallback cb,
- gpointer closure)
-{
- if (view->book) {
- EReflow *reflow = E_REFLOW(view);
- GList *list;
- for (list = reflow->items; list; list = g_list_next(list)) {
- GnomeCanvasItem *item = list->data;
- gboolean has_focus;
- gtk_object_get(GTK_OBJECT(item),
- "has_focus", &has_focus,
- NULL);
- if (has_focus) {
- ECard *card;
- gtk_object_get(GTK_OBJECT(item),
- "card", &card,
- NULL);
- e_book_remove_card(view->book, card, cb, closure);
- return;
- }
- }
- }
-}
-
-static int
-compare_to_letter(EMinicard *card, char *letter)
-{
- g_return_val_if_fail(card != NULL, 0);
- g_return_val_if_fail(E_IS_MINICARD(card), 0);
-
- if (*letter == '1')
- return 1;
-
- if (card->card) {
- char *file_as;
- gtk_object_get(GTK_OBJECT(card->card),
- "file_as", &file_as,
- NULL);
- if (file_as)
- return strncasecmp(file_as, letter, 1);
- else
- return 0;
- } else {
- return 0;
- }
-}
-
-void e_minicard_view_jump_to_letter (EMinicardView *view,
- char letter)
-{
- e_reflow_sorted_jump(E_REFLOW_SORTED(view),
- (GCompareFunc) compare_to_letter,
- &letter);
-}
diff --git a/addressbook/gui/widgets/e-minicard-view.h b/addressbook/gui/widgets/e-minicard-view.h
deleted file mode 100644
index a166a6ade1..0000000000
--- a/addressbook/gui/widgets/e-minicard-view.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-view.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-reflow-sorted.h"
-#include <ebook/e-book.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* 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_MINICARD_VIEW_TYPE (e_minicard_view_get_type ())
-#define E_MINICARD_VIEW(obj) (GTK_CHECK_CAST ((obj), E_MINICARD_VIEW_TYPE, EMinicardView))
-#define E_MINICARD_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_MINICARD_VIEW_TYPE, EMinicardViewClass))
-#define E_IS_MINICARD_VIEW(obj) (GTK_CHECK_TYPE ((obj), E_MINICARD_VIEW_TYPE))
-#define E_IS_MINICARD_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_MINICARD_VIEW_TYPE))
-
-
-typedef struct _EMinicardView EMinicardView;
-typedef struct _EMinicardViewClass EMinicardViewClass;
-
-struct _EMinicardView
-{
- EReflowSorted parent;
-
- /* item specific fields */
- EBook *book;
- char *query;
- EBookView *book_view;
-
- int get_view_idle;
-
- int canvas_destroy_id;
-
- int create_card_id, remove_card_id, modify_card_id;
-};
-
-struct _EMinicardViewClass
-{
- EReflowSortedClass parent_class;
-};
-
-GtkType 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,
- char letter);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_MINICARD_VIEW_H__ */
diff --git a/addressbook/gui/widgets/e-minicard-widget-test.c b/addressbook/gui/widgets/e-minicard-widget-test.c
deleted file mode 100644
index f6489f2a6a..0000000000
--- a/addressbook/gui/widgets/e-minicard-widget-test.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-minicard.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-#define TEST_VCARD \
-"BEGIN:VCARD
-" \
-"FN:Nat
-" \
-"N:Friedman;Nat;D;Mr.
-" \
-"ORG:Helix Code, Inc.
-" \
-"TITLE:Head Geek
-" \
-"ROLE:Programmer/Executive
-" \
-"BDAY:1977-08-06
-" \
-"TEL;WORK:617 679 1984
-" \
-"TEL;CELL:123 456 7890
-" \
-"EMAIL;INTERNET:nat@nat.org
-" \
-"EMAIL;INTERNET:nat@helixcode.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 <gnome.h>
-#include "e-minicard-widget.h"
-
-/* This is a horrible thing to do, but it is just a test. */
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- 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 ( _( "Minicard Widget Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the minicard widget" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *minicard;
- ECard *card;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "Minicard Widget Test", VERSION, argc, argv);
- app = gnome_app_new("Minicard Widget Test", NULL);
-
- minicard = e_minicard_widget_new();
- card = e_card_new(TEST_VCARD);
- gtk_object_set(GTK_OBJECT(minicard),
- "card", card,
- NULL);
-
- gnome_app_set_contents( GNOME_APP( app ), minicard );
-
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/gui/widgets/e-minicard-widget.c b/addressbook/gui/widgets/e-minicard-widget.c
deleted file mode 100644
index 3f765425e4..0000000000
--- a/addressbook/gui/widgets/e-minicard-widget.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-field-chooser.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-minicard-widget.h"
-#include "e-minicard.h"
-
-static void e_minicard_widget_init (EMinicardWidget *card);
-static void e_minicard_widget_class_init (EMinicardWidgetClass *klass);
-static void e_minicard_widget_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_minicard_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_minicard_widget_destroy (GtkObject *object);
-static void e_minicard_widget_size_request (GtkWidget *widget, GtkRequisition *requisition);
-static void e_minicard_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
-static void e_minicard_widget_reflow (ECanvas *canvas);
-
-static ECanvasClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_CARD,
-};
-
-GtkType
-e_minicard_widget_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type)
- {
- static const GtkTypeInfo info =
- {
- "EMinicardWidget",
- sizeof (EMinicardWidget),
- sizeof (EMinicardWidgetClass),
- (GtkClassInitFunc) e_minicard_widget_class_init,
- (GtkObjectInitFunc) e_minicard_widget_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (e_canvas_get_type (), &info);
- }
-
- return type;
-}
-
-static void
-e_minicard_widget_class_init (EMinicardWidgetClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- ECanvasClass *ecanvas_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
- widget_class = GTK_WIDGET_CLASS(klass);
- ecanvas_class = E_CANVAS_CLASS(klass);
-
- parent_class = gtk_type_class (e_canvas_get_type ());
-
- object_class->set_arg = e_minicard_widget_set_arg;
- object_class->get_arg = e_minicard_widget_get_arg;
- object_class->destroy = e_minicard_widget_destroy;
-
- widget_class->size_request = e_minicard_widget_size_request;
- widget_class->size_allocate = e_minicard_widget_size_allocate;
-
- ecanvas_class->reflow = e_minicard_widget_reflow;
-
- gtk_object_add_arg_type ("EMinicardWidget::card", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_CARD);
-}
-
-static void
-e_minicard_widget_size_request(GtkWidget *widget, GtkRequisition *requisition)
-{
- double height;
- EMinicardWidget *emw = E_MINICARD_WIDGET(widget);
- gtk_object_get(GTK_OBJECT(emw->item),
- "height", &height,
- NULL);
- if (height <= 0)
- height = 1;
- widget->requisition.height = height;
- widget->requisition.width = 200;
- requisition->height = height;
- requisition->width = 200;
-}
-
-static void
-e_minicard_widget_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
-{
- double height;
- EMinicardWidget *emw = E_MINICARD_WIDGET(widget);
- gnome_canvas_item_set( emw->item,
- "width", (double) allocation->width,
- NULL );
- gtk_object_get(GTK_OBJECT(emw->item),
- "height", &height,
- NULL);
- height = MAX(height, allocation->height);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( emw ), 0, 0, allocation->width - 1, height - 1);
- gnome_canvas_item_set( emw->rect,
- "x2", (double) allocation->width,
- "y2", (double) height,
- NULL );
- if (GTK_WIDGET_CLASS(parent_class)->size_allocate)
- GTK_WIDGET_CLASS(parent_class)->size_allocate(widget, allocation);
-}
-
-static void e_minicard_widget_reflow(ECanvas *canvas)
-{
- double height;
- EMinicardWidget *emw = E_MINICARD_WIDGET(canvas);
- gtk_object_get(GTK_OBJECT(emw->item),
- "height", &height,
- NULL);
-
- height = MAX(height, GTK_WIDGET(emw)->allocation.height);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS(emw), 0, 0, GTK_WIDGET(emw)->allocation.width - 1, height - 1);
- gnome_canvas_item_set( emw->rect,
- "x2", (double) GTK_WIDGET(emw)->allocation.width,
- "y2", (double) height,
- NULL );
-
- gtk_widget_queue_resize(GTK_WIDGET(canvas));
-}
-
-static void
-e_minicard_widget_init (EMinicardWidget *emw)
-{
- emw->rect = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(emw)),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) 100,
- "y2", (double) 100,
- "fill_color", "white",
- NULL );
-
- emw->item = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(emw)),
- e_minicard_get_type(),
- "width", (double) 100,
- NULL );
-
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( emw ),
- 0, 0,
- 100, 100 );
-
- emw->card = NULL;
-}
-
-static void
-e_minicard_widget_destroy (GtkObject *object)
-{
- EMinicardWidget *emw = E_MINICARD_WIDGET(object);
-
- if (emw->card)
- gtk_object_unref(GTK_OBJECT(emw->card));
-
- if (GTK_OBJECT_CLASS(parent_class)->destroy)
- GTK_OBJECT_CLASS(parent_class)->destroy(object);
-}
-
-GtkWidget*
-e_minicard_widget_new (void)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_minicard_widget_get_type ()));
- return widget;
-}
-
-static void
-e_minicard_widget_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicardWidget *emw = E_MINICARD_WIDGET(object);
-
- switch (arg_id){
- case ARG_CARD:
- if (emw->card)
- gtk_object_unref(GTK_OBJECT(emw->card));
- if (GTK_VALUE_OBJECT(*arg)) {
- emw->card = E_CARD(GTK_VALUE_OBJECT(*arg));
- gtk_object_ref(GTK_OBJECT(emw->card));
- }
- else
- emw->card = NULL;
- if (emw->item)
- gtk_object_set(GTK_OBJECT(emw->item),
- "card", emw->card,
- NULL);
- break;
- default:
- break;
- }
-}
-
-static void
-e_minicard_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicardWidget *emw = E_MINICARD_WIDGET(object);
-
- switch (arg_id) {
- case ARG_CARD:
- if (emw->card)
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(emw->card);
- else
- GTK_VALUE_OBJECT (*arg) = NULL;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
diff --git a/addressbook/gui/widgets/e-minicard-widget.h b/addressbook/gui/widgets/e-minicard-widget.h
deleted file mode 100644
index 8a3ec0ae16..0000000000
--- a/addressbook/gui/widgets/e-minicard-widget.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-widget.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_WIDGET_H__
-#define __E_MINICARD_WIDGET_H__
-
-#include <gnome.h>
-#include "addressbook/backend/ebook/e-card.h"
-#include "e-util/e-canvas.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EMinicardWidget - A card displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- */
-
-#define E_MINICARD_WIDGET_TYPE (e_minicard_widget_get_type ())
-#define E_MINICARD_WIDGET(obj) (GTK_CHECK_CAST ((obj), E_MINICARD_WIDGET_TYPE, EMinicardWidget))
-#define E_MINICARD_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_MINICARD_WIDGET_TYPE, EMinicardWidgetClass))
-#define E_IS_MINICARD_WIDGET(obj) (GTK_CHECK_TYPE ((obj), E_MINICARD_WIDGET_TYPE))
-#define E_IS_MINICARD_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_MINICARD_WIDGET_TYPE))
-
-
-typedef struct _EMinicardWidget EMinicardWidget;
-typedef struct _EMinicardWidgetClass EMinicardWidgetClass;
-
-struct _EMinicardWidget
-{
- ECanvas parent;
-
- /* item specific fields */
- GnomeCanvasItem *item;
-
- GnomeCanvasItem *rect;
- ECard *card;
-};
-
-struct _EMinicardWidgetClass
-{
- ECanvasClass parent_class;
-};
-
-
-GtkWidget *e_minicard_widget_new(void);
-GtkType e_minicard_widget_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_MINICARD_WIDGET_H__ */
diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c
deleted file mode 100644
index e9bb85c89d..0000000000
--- a/addressbook/gui/widgets/e-minicard.c
+++ /dev/null
@@ -1,797 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-minicard.h"
-#include "e-minicard-label.h"
-#include "e-text.h"
-#include <ebook/e-book.h>
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-#include <e-util/e-canvas-utils.h>
-#include <e-util/e-popup-menu.h>
-#include "addressbook/printing/e-contact-print.h"
-#include "e-contact-editor.h"
-#include "e-contact-save-as.h"
-#include "e-minicard-view.h"
-
-static void e_minicard_init (EMinicard *card);
-static void e_minicard_class_init (EMinicardClass *klass);
-static void e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_minicard_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_minicard_destroy (GtkObject *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_resize_children( EMinicard *e_minicard );
-static void remodel( EMinicard *e_minicard );
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-typedef struct _EMinicardField EMinicardField;
-
-struct _EMinicardField {
- ECardSimpleField field;
- GnomeCanvasItem *label;
-};
-
-#define E_MINICARD_FIELD(field) ((EMinicardField *)(field))
-
-static void
-e_minicard_field_destroy(EMinicardField *field)
-{
- gtk_object_destroy(GTK_OBJECT(field->label));
- g_free(field);
-}
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_HAS_FOCUS,
- ARG_CARD
-};
-
-GtkType
-e_minicard_get_type (void)
-{
- static GtkType minicard_type = 0;
-
- if (!minicard_type)
- {
- static const GtkTypeInfo minicard_info =
- {
- "EMinicard",
- sizeof (EMinicard),
- sizeof (EMinicardClass),
- (GtkClassInitFunc) e_minicard_class_init,
- (GtkObjectInitFunc) e_minicard_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- minicard_type = gtk_type_unique (gnome_canvas_group_get_type (), &minicard_info);
- }
-
- return minicard_type;
-}
-
-static void
-e_minicard_class_init (EMinicardClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- gtk_object_add_arg_type ("EMinicard::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("EMinicard::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("EMinicard::has_focus", GTK_TYPE_ENUM,
- GTK_ARG_READWRITE, ARG_HAS_FOCUS);
- gtk_object_add_arg_type ("EMinicard::card", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_CARD);
-
- object_class->set_arg = e_minicard_set_arg;
- object_class->get_arg = e_minicard_get_arg;
- object_class->destroy = e_minicard_destroy;
-
- /* GnomeCanvasItem method overrides */
- item_class->realize = e_minicard_realize;
- item_class->unrealize = e_minicard_unrealize;
- item_class->event = e_minicard_event;
-}
-
-static void
-e_minicard_init (EMinicard *minicard)
-{
- /* minicard->card = NULL;*/
- minicard->rect = NULL;
- minicard->fields = NULL;
- minicard->width = 10;
- minicard->height = 10;
- minicard->has_focus = FALSE;
-
- minicard->card = NULL;
- minicard->simple = e_card_simple_new(NULL);
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(minicard), e_minicard_reflow);
-}
-
-static void
-e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EMinicard *e_minicard;
-
- item = GNOME_CANVAS_ITEM (o);
- e_minicard = E_MINICARD (o);
-
- switch (arg_id){
- case ARG_WIDTH:
- if (e_minicard->width != GTK_VALUE_DOUBLE (*arg)) {
- e_minicard->width = GTK_VALUE_DOUBLE (*arg);
- e_minicard_resize_children(e_minicard);
- if ( GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED )
- e_canvas_item_request_reflow(item);
- }
- break;
- case ARG_HAS_FOCUS:
- if (e_minicard->fields) {
- if ( GTK_VALUE_ENUM(*arg) == E_FOCUS_START ||
- GTK_VALUE_ENUM(*arg) == E_FOCUS_CURRENT) {
- gnome_canvas_item_set(E_MINICARD_FIELD(e_minicard->fields->data)->label,
- "has_focus", GTK_VALUE_ENUM(*arg),
- NULL);
- } else if ( GTK_VALUE_ENUM(*arg) == E_FOCUS_END ) {
- gnome_canvas_item_set(E_MINICARD_FIELD(g_list_last(e_minicard->fields)->data)->label,
- "has_focus", GTK_VALUE_ENUM(*arg),
- NULL);
- }
- }
- else
- e_canvas_item_grab_focus(item);
- break;
- case ARG_CARD:
- if (e_minicard->card)
- gtk_object_unref (GTK_OBJECT(e_minicard->card));
- e_minicard->card = E_CARD(GTK_VALUE_OBJECT (*arg));
- if (e_minicard->card)
- gtk_object_ref (GTK_OBJECT(e_minicard->card));
- gtk_object_set(GTK_OBJECT(e_minicard->simple),
- "card", e_minicard->card,
- NULL);
- remodel(e_minicard);
- e_canvas_item_request_reflow(item);
- break;
- }
-}
-
-static void
-e_minicard_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EMinicard *e_minicard;
-
- e_minicard = E_MINICARD (object);
-
- switch (arg_id) {
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_minicard->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = e_minicard->height;
- break;
- case ARG_HAS_FOCUS:
- GTK_VALUE_ENUM (*arg) = e_minicard->has_focus ? E_FOCUS_CURRENT : E_FOCUS_NONE;
- break;
- case ARG_CARD:
- e_card_simple_sync_card(e_minicard->simple);
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_minicard->card);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_minicard_destroy (GtkObject *object)
-{
- EMinicard *e_minicard;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_MINICARD (object));
-
- e_minicard = E_MINICARD (object);
-
- g_list_foreach(e_minicard->fields, (GFunc) e_minicard_field_destroy, NULL);
- g_list_free(e_minicard->fields);
-
- if (e_minicard->card)
- gtk_object_unref (GTK_OBJECT(e_minicard->card));
- if (e_minicard->simple)
- gtk_object_unref (GTK_OBJECT(e_minicard->simple));
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-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) e_minicard->width - 1,
- "y2", (double) e_minicard->height - 1,
- "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) e_minicard->width - 3,
- "y2", (double) e_minicard->height - 3,
- "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) ( e_minicard->width - 12 ),
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "font", "lucidasans-bold-10",
- "fill_color_gdk", &canvas->style->fg[GTK_STATE_NORMAL],
- "text", "",
- NULL );
- e_canvas_item_move_absolute(e_minicard->header_text, 6, 6);
-
- remodel(e_minicard);
- e_canvas_item_request_reflow(item);
-
- if (!item->canvas->aa) {
- }
-}
-
-static void
-e_minicard_unrealize (GnomeCanvasItem *item)
-{
- EMinicard *e_minicard;
-
- e_minicard = E_MINICARD (item);
-
- if (!item->canvas->aa)
- {
- }
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item);
-}
-
-static void
-card_added_cb (EBook* book, EBookStatus status, const char *id, gpointer user_data)
-{
- g_print ("%s: %s(): a card was added\n", __FILE__, __FUNCTION__);
-}
-
-static void
-card_changed_cb (EBook* book, EBookStatus status, gpointer user_data)
-{
- g_print ("%s: %s(): a card was changed with status %d\n", __FILE__, __FUNCTION__, status);
-}
-
-static void
-save_as (GtkWidget *widget, EMinicard *minicard)
-{
- e_card_simple_sync_card(minicard->simple);
- e_contact_save_as(_("Save as VCard"), minicard->card);
-}
-
-static void
-delete (GtkWidget *widget, EMinicard *minicard)
-{
- EBook *book;
-
- if (e_contact_editor_confirm_delete()) {
- e_card_simple_sync_card(minicard->simple);
-
- gtk_object_get(GTK_OBJECT(GNOME_CANVAS_ITEM(minicard)->parent),
- "book", &book,
- NULL);
-
- /* Add the card in the contact editor to our ebook */
- e_book_remove_card (book,
- minicard->card,
- card_changed_cb,
- NULL);
- }
-}
-
-static void
-print (GtkWidget *widget, EMinicard *minicard)
-{
- e_card_simple_sync_card(minicard->simple);
-
- gtk_widget_show(e_contact_print_card_dialog_new(minicard->card));
-}
-
-/* Callback for the add_card signal from the contact editor */
-static void
-add_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_add_card (book, card, card_added_cb, NULL);
-}
-
-/* Callback for the commit_card signal from the contact editor */
-static void
-commit_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_commit_card (book, card, card_changed_cb, NULL);
-}
-
-/* Callback for the commit_card signal from the contact editor */
-static void
-delete_card_cb (EContactEditor *ce, ECard *card, gpointer data)
-{
- EBook *book;
-
- book = E_BOOK (data);
- e_book_remove_card (book, card, card_changed_cb, NULL);
-}
-
-/* Callback used when the contact editor is closed */
-static void
-editor_closed_cb (EContactEditor *ce, gpointer data)
-{
- gtk_object_unref (GTK_OBJECT (ce));
-}
-
-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;
- if ( focus_event->in ) {
- gnome_canvas_item_set( e_minicard->rect,
- "outline_color_gdk", &canvas->style->bg[GTK_STATE_NORMAL],
- NULL );
- gnome_canvas_item_set( e_minicard->header_rect,
- "fill_color_gdk", &canvas->style->bg[GTK_STATE_SELECTED],
- NULL );
- gnome_canvas_item_set( e_minicard->header_text,
- "fill_color_gdk", &canvas->style->text[GTK_STATE_SELECTED],
- NULL );
- e_minicard->has_focus = TRUE;
- } else {
- EBook *book = NULL;
-
- e_card_simple_sync_card(e_minicard->simple);
-
- if (E_IS_MINICARD_VIEW(GNOME_CANVAS_ITEM(e_minicard)->parent)) {
-
- gtk_object_get(GTK_OBJECT(GNOME_CANVAS_ITEM(e_minicard)->parent),
- "book", &book,
- NULL);
-
- }
-
- if (book) {
-
- /* Add the card in the contact editor to our ebook */
- e_book_commit_card (book,
- e_minicard->card,
- card_changed_cb,
- NULL);
- } else {
- remodel(e_minicard);
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(e_minicard));
- }
-
- gnome_canvas_item_set( e_minicard->rect,
- "outline_color", NULL,
- NULL );
- gnome_canvas_item_set( e_minicard->header_rect,
- "fill_color_gdk",
- &canvas->style->bg[GTK_STATE_NORMAL],
- NULL );
- gnome_canvas_item_set( e_minicard->header_text,
- "fill_color_gdk",
- &canvas->style->fg[GTK_STATE_NORMAL],
- NULL );
- e_minicard->has_focus = FALSE;
- }
- }
- break;
- case GDK_BUTTON_PRESS:
- if (event->button.button == 1) {
- e_canvas_item_grab_focus(item);
- } else if (event->button.button == 3) {
- if (E_IS_MINICARD_VIEW(item->parent)) {
- EPopupMenu menu[] = { {"Save as VCard", NULL, GTK_SIGNAL_FUNC(save_as), 0},
- {"Print", NULL, GTK_SIGNAL_FUNC(print), 0},
- {"Delete", NULL, GTK_SIGNAL_FUNC(delete), 0},
- {NULL, NULL, NULL, 0}};
- e_popup_menu_run (menu, (GdkEventButton *)event, 0, 0, e_minicard);
- } else {
- EPopupMenu menu[] = { {"Save as VCard", NULL, GTK_SIGNAL_FUNC(save_as), 0},
- {"Print", NULL, GTK_SIGNAL_FUNC(print), 0},
- {NULL, NULL, NULL, 0}};
- e_popup_menu_run (menu, (GdkEventButton *)event, 0, 0, e_minicard);
- }
- }
- break;
-
- case GDK_2BUTTON_PRESS:
- if (event->button.button == 1 && E_IS_MINICARD_VIEW(item->parent)) {
- EContactEditor *ce;
- EBook *book = NULL;
- if (E_IS_MINICARD_VIEW(item->parent)) {
-
- gtk_object_get(GTK_OBJECT(item->parent),
- "book", &book,
- NULL);
- }
- ce = e_contact_editor_new (e_minicard->card, FALSE);
-
- if (book != NULL) {
- gtk_signal_connect (GTK_OBJECT (ce), "add_card",
- GTK_SIGNAL_FUNC (add_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "commit_card",
- GTK_SIGNAL_FUNC (commit_card_cb), book);
- gtk_signal_connect (GTK_OBJECT (ce), "delete_card",
- GTK_SIGNAL_FUNC (delete_card_cb), book);
- }
-
- gtk_signal_connect (GTK_OBJECT (ce), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), NULL);
- return TRUE;
- }
- break;
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Tab ||
- event->key.keyval == GDK_KP_Tab ||
- event->key.keyval == GDK_ISO_Left_Tab) {
- GList *list;
- for (list = e_minicard->fields; list; list = list->next) {
- EMinicardField *field = E_MINICARD_FIELD(list->data);
- GnomeCanvasItem *item = field->label;
- EFocus has_focus;
- gtk_object_get(GTK_OBJECT(item),
- "has_focus", &has_focus,
- NULL);
- if (has_focus != E_FOCUS_NONE) {
- if (event->key.state & GDK_SHIFT_MASK)
- list = list->prev;
- else
- list = list->next;
- if (list) {
- EMinicardField *field = E_MINICARD_FIELD(list->data);
- GnomeCanvasItem *item = field->label;
- gnome_canvas_item_set(item,
- "has_focus", (event->key.state & GDK_SHIFT_MASK) ? E_FOCUS_END : E_FOCUS_START,
- NULL);
- return 1;
- } else {
- return 0;
- }
- }
- }
- }
- 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;
-
- if (e_minicard->header_text) {
- gnome_canvas_item_set( e_minicard->header_text,
- "width", (double) e_minicard->width - 12,
- NULL );
- }
- 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
-field_changed (EText *text, EMinicard *e_minicard)
-{
- ECardSimpleType type;
- char *string;
-
- type = GPOINTER_TO_INT
- (gtk_object_get_data(GTK_OBJECT(text),
- "EMinicard:field"));
- gtk_object_get(GTK_OBJECT(text),
- "text", &string,
- NULL);
- e_card_simple_set(e_minicard->simple,
- type,
- string);
- g_free(string);
-}
-
-static void
-add_field (EMinicard *e_minicard, ECardSimpleField field, gdouble left_width)
-{
- GnomeCanvasItem *new_item;
- GnomeCanvasGroup *group;
- ECardSimpleType type;
- EMinicardField *minicard_field;
- char *name;
- char *string;
-
- group = GNOME_CANVAS_GROUP( e_minicard );
-
- type = e_card_simple_type(e_minicard->simple, field);
- name = g_strdup_printf("%s:", e_card_simple_get_name(e_minicard->simple, field));
- string = e_card_simple_get(e_minicard->simple, 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,
- NULL );
- gtk_signal_connect(GTK_OBJECT(E_MINICARD_LABEL(new_item)->field),
- "changed", GTK_SIGNAL_FUNC(field_changed), e_minicard);
- gtk_object_set_data(GTK_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 gdouble
-get_left_width(EMinicard *e_minicard)
-{
- gchar *name;
- ECardSimpleField field;
- gdouble width = -1;
- static GdkFont *font = NULL;
-
- if (font == NULL) {
- font = gdk_font_load("lucidasans-10");
- }
-
- for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST; field++) {
- gdouble this_width;
- name = g_strdup_printf("%s:", e_card_simple_get_name(e_minicard->simple, field));
- this_width = gdk_text_width(font, name, strlen(name));
- if (width < this_width)
- width = this_width;
- g_free(name);
- }
- return width;
-}
-
-static void
-remodel( EMinicard *e_minicard )
-{
- int count = 0;
- if (e_minicard->simple) {
- ECardSimpleField field;
- GList *list;
- char *file_as;
- gdouble left_width = -1;
-
- if (e_minicard->header_text) {
- file_as = e_card_simple_get(e_minicard->simple, E_CARD_SIMPLE_FIELD_FILE_AS);
- gnome_canvas_item_set( e_minicard->header_text,
- "text", file_as ? file_as : "",
- NULL );
- g_free(file_as);
- }
-
- list = e_minicard->fields;
- e_minicard->fields = NULL;
-
- for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST - 2 && count < 5; field++) {
- EMinicardField *minicard_field = NULL;
-
- if (list)
- minicard_field = list->data;
- if (minicard_field && minicard_field->field == field) {
- GList *this_list = list;
- char *string;
-
- string = e_card_simple_get(e_minicard->simple, field);
- if (string && *string) {
- e_minicard->fields = g_list_append(e_minicard->fields, minicard_field);
- gtk_object_set(GTK_OBJECT(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_card_simple_get(e_minicard->simple, 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;
-
- gtk_object_get( GTK_OBJECT( 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;
- gtk_object_get (GTK_OBJECT(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,
- "y2", (double) e_minicard->height - 1,
- NULL );
-
- 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);
- }
-}
-
-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->card) {
- return e_card_get_id(minicard->card);
- } else {
- return "";
- }
-}
-
-int
-e_minicard_compare (EMinicard *minicard1, EMinicard *minicard2)
-{
- 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->card && minicard2->card) {
- char *file_as1, *file_as2;
- gtk_object_get(GTK_OBJECT(minicard1->card),
- "file_as", &file_as1,
- NULL);
- gtk_object_get(GTK_OBJECT(minicard2->card),
- "file_as", &file_as2,
- NULL);
- if (file_as1 && file_as2)
- return strcasecmp(file_as1, file_as2);
- if (file_as1)
- return -1;
- if (file_as2)
- return 1;
- return strcmp(e_minicard_get_card_id(minicard1), e_minicard_get_card_id(minicard2));
- } else {
- return 0;
- }
-}
diff --git a/addressbook/gui/widgets/e-minicard.h b/addressbook/gui/widgets/e-minicard.h
deleted file mode 100644
index 47da8110c2..0000000000
--- a/addressbook/gui/widgets/e-minicard.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <ebook/e-card.h>
-#include <ebook/e-card-simple.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_MINICARD_TYPE (e_minicard_get_type ())
-#define E_MINICARD(obj) (GTK_CHECK_CAST ((obj), E_MINICARD_TYPE, EMinicard))
-#define E_MINICARD_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_MINICARD_TYPE, EMinicardClass))
-#define E_IS_MINICARD(obj) (GTK_CHECK_TYPE ((obj), E_MINICARD_TYPE))
-#define E_IS_MINICARD_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_MINICARD_TYPE))
-
-
-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 */
- ECard *card;
- ECardSimple *simple;
-
- GnomeCanvasItem *rect;
- GnomeCanvasItem *header_rect;
- GnomeCanvasItem *header_text;
-
- GList *fields; /* Of type EMinicardField */
- guint needs_remodeling : 1;
-
- gboolean has_focus;
-
- double width;
- double height;
-};
-
-struct _EMinicardClass
-{
- GnomeCanvasGroupClass parent_class;
-
- void (* resize) (EMinicard *minicard);
-};
-
-
-GtkType e_minicard_get_type (void);
-char *e_minicard_get_card_id (EMinicard *minicard);
-int e_minicard_compare (EMinicard *minicard1, EMinicard *minicard2);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_MINICARD_H__ */
diff --git a/addressbook/gui/widgets/test-minicard-label.c b/addressbook/gui/widgets/test-minicard-label.c
deleted file mode 100644
index 57bc69222a..0000000000
--- a/addressbook/gui/widgets/test-minicard-label.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-minicard-label.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-
-
-#include "config.h"
-
-#include <gnome.h>
-#include "e-minicard-label.h"
-#include <e-util/e-canvas.h>
-
-/* This is a horrible thing to do, but it is just a test. */
-GnomeCanvasItem *label;
-GnomeCanvasItem *rect;
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- exit(0);
-}
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data)
-{
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, allocation->width, allocation->height );
- gnome_canvas_item_set( label,
- "width", (double) allocation->width,
- "height", (double) allocation->height,
- NULL );
- gnome_canvas_item_set( rect,
- "x2", (double) allocation->width,
- "y2", (double) allocation->height,
- NULL );
-}
-
-#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 ( _( "Minicard Label Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the minicard label canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-static void button_press_callback( GtkWidget *widget, gpointer data )
-{
- gnome_canvas_item_grab_focus( label );
-}
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *canvas;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "Minicard Label Test", VERSION, argc, argv);
- app = gnome_app_new("Minicard Label Test", NULL);
-
- 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 );
- label = e_minicard_label_new(gnome_canvas_root( GNOME_CANVAS( canvas ) ));
- gnome_canvas_item_set( label,
- "width", (double) 100,
- "height", (double) 100,
- "fieldname", "Full Name:",
- "field", "Christopher James Lahey",
- NULL );
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ),
- 0, 0,
- 100, 100 );
-
- gnome_app_set_contents( GNOME_APP( app ), canvas );
-
-
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( allocate_callback ),
- ( gpointer ) app );
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "button_press_event",
- GTK_SIGNAL_FUNC( button_press_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/gui/widgets/test-minicard-view.c b/addressbook/gui/widgets/test-minicard-view.c
deleted file mode 100644
index c03d11d07e..0000000000
--- a/addressbook/gui/widgets/test-minicard-view.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-reflow.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-#include "config.h"
-
-#include <gnome.h>
-#include <libgnorba/gnorba.h>
-#include <bonobo.h>
-#include <e-util/e-canvas.h>
-#include "e-minicard-view.h"
-
-/* This is a horrible thing to do, but it is just a test. */
-GnomeCanvasItem *reflow;
-GnomeCanvasItem *rect;
-GtkAllocation last_alloc;
-
-CORBA_Environment ev;
-CORBA_ORB orb;
-
-static void
-init_bonobo (int argc, char **argv)
-{
-
- gnome_CORBA_init_with_popt_table (
- "Reflow Test", VERSION,
- &argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
-
- orb = gnome_CORBA_ORB ();
-
- if (bonobo_init (orb, NULL, NULL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-
-}
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- 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 );
- gtk_object_get(GTK_OBJECT(reflow),
- "width", &width,
- NULL);
- width = MAX(width, allocation->width);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, width, allocation->height );
- gnome_canvas_item_set( rect,
- "x2", (double) width,
- "y2", (double) allocation->height,
- NULL );
-}
-
-static void resize(GnomeCanvas *canvas, gpointer data)
-{
- double width;
- gtk_object_get(GTK_OBJECT(reflow),
- "width", &width,
- NULL);
- width = MAX(width, last_alloc.width);
- gnome_canvas_set_scroll_region(canvas , 0, 0, width, last_alloc.height );
- gnome_canvas_item_set( rect,
- "x2", (double) width,
- "y2", (double) last_alloc.height,
- NULL );
-}
-
-#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 ( _( "Reflow Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the reflow canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- if (status == E_BOOK_STATUS_SUCCESS)
- gnome_canvas_item_set(reflow,
- "book", book,
- NULL);
-}
-
-static guint
-ebook_create (void)
-{
- EBook *book;
-
- book = e_book_new ();
-
- if (!book) {
- printf ("%s: %s(): Couldn't create EBook, bailing.\n",
- __FILE__,
- __FUNCTION__);
- return FALSE;
- }
-
-
- if (! e_book_load_uri (book, "file:/tmp/test.db", book_open_cb, NULL)) {
- printf ("error calling load_uri!\n");
- }
-
-
- return FALSE;
-}
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *canvas;
- GtkWidget *vbox;
- GtkWidget *scrollbar;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- CORBA_exception_init (&ev);
- init_bonobo (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_minicard_view_get_type(),
- "height", (double) 100,
- "minimum_width", (double) 100,
- NULL );
- gtk_signal_connect( GTK_OBJECT( canvas ), "reflow",
- GTK_SIGNAL_FUNC( resize ),
- ( gpointer ) app);
-
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ),
- 0, 0,
- 100, 100 );
-
- gtk_box_pack_start(GTK_BOX(vbox), canvas, TRUE, TRUE, 0);
-
- scrollbar = gtk_hscrollbar_new(gtk_layout_get_hadjustment(GTK_LAYOUT(canvas)));
-
- gtk_box_pack_start(GTK_BOX(vbox), scrollbar, FALSE, FALSE, 0);
-
- gnome_app_set_contents( GNOME_APP( app ), vbox );
-
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( allocate_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
- gdk_window_set_back_pixmap( GTK_LAYOUT(canvas)->bin_window, NULL, FALSE);
-
- gtk_idle_add ((GtkFunction) ebook_create, NULL);
-
- bonobo_main ();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/gui/widgets/test-minicard.c b/addressbook/gui/widgets/test-minicard.c
deleted file mode 100644
index e16ca675b3..0000000000
--- a/addressbook/gui/widgets/test-minicard.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-minicard.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-
-
-#include "config.h"
-
-#include <gnome.h>
-#include "e-minicard.h"
-
-/* This is a horrible thing to do, but it is just a test. */
-GnomeCanvasItem *card;
-GnomeCanvasItem *rect;
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- exit(0);
-}
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data)
-{
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, allocation->width, allocation->height );
- gnome_canvas_item_set( card,
- "width", (double) allocation->width,
- NULL );
- gnome_canvas_item_set( rect,
- "x2", (double) allocation->width,
- "y2", (double) allocation->height,
- NULL );
-}
-
-#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 ( _( "Minicard Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the minicard canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *canvas;
- int i;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "Minicard Test", VERSION, argc, argv);
- app = gnome_app_new("Minicard Test", NULL);
-
- canvas = gnome_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 );
- for ( i = 0; i < 1; i++ )
- {
- card = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ),
- e_minicard_get_type(),
- "width", (double) 100,
- NULL );
- }
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ),
- 0, 0,
- 100, 100 );
-
- gnome_app_set_contents( GNOME_APP( app ), canvas );
-
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( allocate_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/gui/widgets/test-reflow.c b/addressbook/gui/widgets/test-reflow.c
deleted file mode 100644
index 8013c428d5..0000000000
--- a/addressbook/gui/widgets/test-reflow.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-reflow.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-
-#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@helixcode.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 <gnome.h>
-#include <e-util/e-canvas.h>
-#include "e-reflow.h"
-#include "e-minicard.h"
-#include "e-scroll-frame.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(GtkWidget *app, gpointer data)
-{
- 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 );
- gtk_object_get(GTK_OBJECT(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;
- gtk_object_get(GTK_OBJECT(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 );
-}
-
-#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 ( _( "Reflow Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the reflow canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-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 );
- gtk_signal_connect( GTK_OBJECT( canvas ), "reflow",
- GTK_SIGNAL_FUNC( 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);
- }
- 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 */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( 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/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 62a401dc5d..0000000000
--- a/addressbook/printing/Makefile.am
+++ /dev/null
@@ -1,67 +0,0 @@
-ecpsdir = $(datadir)/evolution/ecps
-
-ecps_DATA = \
- smallbook.ecps \
- medbook.ecps \
- phonelist.ecps
-
-gladedir = $(datadir)/evolution/glade
-
-glade_DATA = \
- e-contact-print.glade \
- e-contact-print.glade.h
-
-CPPFLAGS = \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ECPSDIR=\""$(ecpsdir)"\" \
- -DDATADIR=\""$(datadir)"\" \
- $(GNOME_PRINT_CFLAGS) \
- $(BONOBO_GNOME_CFLAGS)
-
-INCLUDES = \
- $(GNOME_INCLUDEDIR) \
- -DG_LOG_DOMAIN=\"addressbook-printing\" \
- -I$(top_srcdir)/addressbook \
- -I$(top_srcdir)
-
-noinst_LIBRARIES = \
- libecontactprint.a
-
-libecontactprint_a_SOURCES = \
- e-contact-print.c \
- e-contact-print.h \
- e-contact-print-style-editor.c \
- e-contact-print-style-editor.h \
- e-contact-print-types.h
-
-noinst_PROGRAMS = \
- contact-print-test \
- contact-print-style-editor-test
-
-contact_print_test_SOURCES = \
- test-print.c
-
-contact_print_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- libecontactprint.a \
- $(GNOME_PRINT_LIBS)
-
-contact_print_style_editor_test_SOURCES = \
- test-contact-print-style-editor.c
-
-contact_print_style_editor_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(BONOBO_GNOME_LIBS) \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la \
- libecontactprint.a \
- $(GNOME_PRINT_LIBS)
-
-EXTRA_DIST = $(glade_DATA) $(ecps_DATA)
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 5eb5cadacf..0000000000
--- a/addressbook/printing/e-contact-print-style-editor.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-print-style-editor.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#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);
- 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);
- gtk_object_unref(GTK_OBJECT(e_contact_print_style_editor->gui));
-}
-
-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 cf0f17f889..0000000000
--- a/addressbook/printing/e-contact-print-style-editor.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-print-style-editor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.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 e99cfe6d39..0000000000
--- a/addressbook/printing/e-contact-print-types.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-print-types.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.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 00a32f0d57..0000000000
--- a/addressbook/printing/e-contact-print.c
+++ /dev/null
@@ -1,1112 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-print.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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.h"
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-dialog.h>
-#include <libgnomeprint/gnome-print-master.h>
-#include <libgnomeprint/gnome-print-master-preview.h>
-#include <libgnomeprint/gnome-print-multipage.h>
-#include <gnome-xml/tree.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-#include <ctype.h>
-#include <addressbook/backend/ebook/e-book.h>
-#include <addressbook/backend/ebook/e-card.h>
-#include <addressbook/backend/ebook/e-card-simple.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;
- GnomePrintMaster *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;
- gchar *query;
-
- GList *cards;
-};
-
-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_string(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_string_n(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_string(font, " ");
- linestart = lastend + 1;
- x += gnome_font_get_width_string_n(font, text + linestart, i - linestart);
- lastend = i;
- linecount ++;
- } else {
- x += gnome_font_get_width_string_n(font, text + lastend, i - lastend);
- lastend = i;
- }
- firstword = 0;
- } else if ( text[i] == '\n' ) {
- if ( (!firstword) && x + gnome_font_get_width_string_n(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_string(font, " ");
-
- firstword = 1;
- }
- }
- if ( (!firstword) && x + gnome_font_get_width_string_n(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_string(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 * font->size;
- if ( first_line ) {
- x += gnome_font_get_width_string(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, 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 * font->size;
-}
-
-#if 0
-static void
-e_contact_output_and_advance(EContactPrintContext *ctxt, GnomeFont *font, double x, double width, gchar *text)
-{
- ctxt->y -= .1 * font->size;
- 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 * font->size;
-}
-#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_string(ctxt->letter_tab_font, "123") + 4 + 18;
-}
-
-static double
-e_contact_print_letter_tab (EContactPrintContext *ctxt)
-{
- 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_string(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_string(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_string(ctxt->style->body_font, "123") + ctxt->style->body_font->size / 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_string(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_string(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);
-
- ctxt->first_char_on_page = ctxt->last_char_on_page + 1;
-}
-
-static double
-e_contact_get_card_size(ECardSimple *simple, EContactPrintContext *ctxt)
-{
- gdouble height = 0;
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
- gdouble column_width;
- 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 += ctxt->style->headings_font->size * .2;
-
- height += ctxt->style->headings_font->size * .2;
-
- gtk_object_get(GTK_OBJECT(simple->card),
- "file_as", &file_as,
- NULL);
- height += e_contact_text_height(ctxt->pc, ctxt->style->headings_font, column_width - 4, file_as);
- height += ctxt->style->headings_font->size * .2;
-
- height += ctxt->style->headings_font->size * .2;
-
- for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST; field++) {
- char *string;
- string = e_card_simple_get(simple, field);
- if (string && *string) {
- double xoff = 0;
- xoff += gnome_font_get_width_string(ctxt->style->body_font, e_card_simple_get_name(simple, field));
- xoff += gnome_font_get_width_string(ctxt->style->body_font, ": ");
- height += e_contact_text_height(ctxt->pc, ctxt->style->body_font, column_width - xoff, string);
- height += .2 * ctxt->style->body_font->size;
- }
- g_free(string);
- }
- height += ctxt->style->headings_font->size * .4;
- return height;
-}
-
-
-static void
-e_contact_print_card (ECardSimple *simple, 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 -= ctxt->style->headings_font->size * .2;
-
- ctxt->y -= ctxt->style->headings_font->size * .2;
-
- gtk_object_get(GTK_OBJECT(simple->card),
- "file_as", &file_as,
- NULL);
- if (ctxt->style->print_using_grey)
- e_contact_rectangle(ctxt->pc, ctxt->x, ctxt->y + ctxt->style->headings_font->size * .3, ctxt->x + column_width, ctxt->y - e_contact_text_height(ctxt->pc, ctxt->style->headings_font, column_width - 4, file_as) - ctxt->style->headings_font->size * .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);
- ctxt->y -= ctxt->style->headings_font->size * .2;
-
- ctxt->y -= ctxt->style->headings_font->size * .2;
-
- for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST; field++) {
- char *string;
- string = e_card_simple_get(simple, field);
- if (string && *string) {
- double xoff = 0;
- e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x + xoff, ctxt->y, -1, e_card_simple_get_name(simple, field));
- xoff += gnome_font_get_width_string(ctxt->style->body_font, e_card_simple_get_name(simple, field));
- e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x + xoff, ctxt->y, -1, ": ");
- xoff += gnome_font_get_width_string(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 * ctxt->style->body_font->size;
- }
- g_free(string);
- }
-
- ctxt->y -= ctxt->style->headings_font->size * .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, EContactPrintContext *ctxt)
-{
- GList *cards = ctxt->cards;
-
- 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;
-
- for(; cards; cards = cards->next) {
- ECard *card = cards->data;
- ECardSimple *simple = e_card_simple_new(card);
- gchar *file_as;
-
- gtk_object_get(GTK_OBJECT(card),
- "file_as", &file_as,
- NULL);
- if ( file_as && (!ctxt->character || *ctxt->character != tolower(*file_as)) ) {
- 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_card_size(simple, ctxt) < ctxt->style->bottom_margin * 72))
- e_contact_start_new_column(ctxt);
- if (!ctxt->character)
- ctxt->character = g_strdup(" ");
- *ctxt->character = tolower(*file_as);
- 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_card_size(simple, 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->last_char_on_page = 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_card(simple, ctxt);
- ctxt->first_contact = FALSE;
- gtk_object_unref(GTK_OBJECT(simple));
- }
- 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);
- g_free(ctxt->character);
- if (book_view)
- gtk_object_unref(GTK_OBJECT(book_view));
- if (ctxt->type == GNOME_PRINT_PREVIEW) {
- GtkWidget *preview;
- preview = GTK_WIDGET(gnome_print_master_preview_new(ctxt->master, "Print Preview"));
- gtk_widget_show_all(preview);
- } else {
- gnome_print_master_print(ctxt->master);
- }
- gtk_object_unref(GTK_OBJECT(ctxt->pc));
- gtk_object_unref(GTK_OBJECT(ctxt->master));
- if (ctxt->book)
- gtk_object_unref(GTK_OBJECT(ctxt->book));
- g_free(ctxt->query);
- g_list_foreach(ctxt->cards, (GFunc) gtk_object_unref, NULL);
- g_list_free(ctxt->cards);
- gtk_object_unref(GTK_OBJECT(ctxt->style->headings_font));
- gtk_object_unref(GTK_OBJECT(ctxt->style->body_font));
- gtk_object_unref(GTK_OBJECT(ctxt->style->header_font));
- gtk_object_unref(GTK_OBJECT(ctxt->style->footer_font));
- gtk_object_unref(GTK_OBJECT(ctxt->letter_heading_font));
- gtk_object_unref(GTK_OBJECT(ctxt->letter_tab_font));
- g_free(ctxt->style);
- g_free(ctxt);
-}
-
-static int
-card_compare (ECard *card1, ECard *card2) {
- if (card1 && card2) {
- char *file_as1, *file_as2;
- gtk_object_get(GTK_OBJECT(card1),
- "file_as", &file_as1,
- NULL);
- gtk_object_get(GTK_OBJECT(card2),
- "file_as", &file_as2,
- NULL);
- if (file_as1 && file_as2)
- return strcasecmp(file_as1, file_as2);
- if (file_as1)
- return -1;
- if (file_as2)
- return 1;
- return strcmp(e_card_get_id(card1), e_card_get_id(card2));
- } else {
- return 0;
- }
-}
-
-static void
-create_card(EBookView *book_view, const GList *cards, EContactPrintContext *ctxt)
-{
- for(; cards; cards = cards->next) {
- ECard *card = cards->data;
- gtk_object_ref(GTK_OBJECT(card));
- ctxt->cards = g_list_insert_sorted(ctxt->cards, card, (GCompareFunc) card_compare);
- }
-}
-
-static void
-book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, EContactPrintContext *ctxt)
-{
- gtk_object_ref(GTK_OBJECT(book_view));
-
- gtk_signal_connect(GTK_OBJECT(book_view),
- "card_added",
- GTK_SIGNAL_FUNC(create_card),
- ctxt);
-
- gtk_signal_connect(GTK_OBJECT(book_view),
- "sequence_complete",
- GTK_SIGNAL_FUNC(complete_sequence),
- ctxt);
-}
-
-static void
-e_contact_do_print_cards (EBook *book, char *query, EContactPrintContext *ctxt)
-{
- e_book_get_book_view(book, query, (EBookBookViewCallback) book_view_loaded, ctxt);
-}
-
-#if 0
-static double
-e_contact_get_phone_list_size(ECardSimple *simple, EContactPrintContext *ctxt)
-{
- double height = 0;
- int field;
-
- height += ctxt->style->headings_font->size * .2;
-
- height += ctxt->style->headings_font->size * .2;
-
- for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST; field++) {
- char *string;
- string = e_card_simple_get(simple, field);
- if (string && *string) {
- if ( 1 ) /* field is a phone field. */ {
- gchar *field = string;
- height += e_contact_text_height(ctxt->pc, ctxt->style->body_font, 100, field);
- height += .2 * ctxt->style->body_font->size;
- }
- }
- g_free(string);
- }
- height += ctxt->style->headings_font->size * .4;
- return height;
-}
-
-
-static void
-e_contact_print_phone_list (ECard *card, EContactPrintContext *ctxt)
-{
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
- gdouble column_width;
- double xoff, dotwidth;
- int dotcount;
- char *dots;
- int i;
- char *file_as;
- 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 -= ctxt->style->headings_font->size * .2;
-
- ctxt->y -= ctxt->style->headings_font->size * .2;
-
- e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x, ctxt->y, -1, e_card_get_string_fileas(card));
-
- xoff = column_width - 9 * ctxt->style->body_font->size;
- dotwidth = xoff -
- gnome_font_get_width_string(ctxt->style->body_font, e_card_get_string_fileas(card)) -
- gnome_font_get_width_string(ctxt->style->body_font, " ");
- dotcount = dotwidth / gnome_font_get_width(ctxt->style->body_font, '.');
- dots = g_new(gchar, dotcount + 1);
- for (i = 0; i < dotcount; i++)
- dots[i] = '.';
- dots[dotcount] = 0;
- e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x + xoff - dotcount * gnome_font_get_width(ctxt->style->body_font, '.'), ctxt->y, -1, dots);
- g_free(dots);
-
- for(; shown_fields; shown_fields = g_list_next(shown_fields)) {
- if ( 1 ) /* field is a phone field. */ {
- gchar *field = e_card_get_string(card, shown_fields->data);
- e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x + xoff, ctxt->y, -1, shown_fields->data);
- e_contact_output(ctxt->pc, ctxt->style->body_font,
- ctxt->x + column_width - gnome_font_get_width_string(ctxt->style->body_font,
- field),
- ctxt->y,
- -1,
- field);
- ctxt->y -= e_contact_text_height(ctxt->pc, ctxt->style->body_font, 100, field);
- ctxt->y -= .2 * ctxt->style->body_font->size;
- }
- }
- ctxt->y -= ctxt->style->headings_font->size * .4;
- gnome_print_grestore(ctxt->pc);
-}
-
-static void
-e_contact_do_print_phone_list (EBook *book, char *query, EContactPrintContext *ctxt)
-{
- ECard *card = NULL;
- int i;
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
- gdouble column_width;
- 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;
-
- column_width = (page_width + 18) / ctxt->style->num_columns - 18;
- /*
- for(card = e_book_get_first(book); card; card = e_book_get_next(book)) {
- */
- for (i=0; i < 30; i++) {
- gchar *file_as = e_card_get_string_fileas(card);
- if ( file_as && (!character || *character != tolower(*file_as)) ) {
- if (ctxt->style->sections_start_new_page && ! first_contact) {
- e_contact_start_new_page(ctxt);
- }
- else if ((!first_contact) && (ctxt->y - e_contact_get_letter_heading_height(ctxt) - e_contact_get_phone_list_size(card, ctxt, shown_fields) < ctxt->style->bottom_margin * 72))
- e_contact_start_new_column(ctxt);
- if (!character)
- character = g_strdup(" ");
- *character = tolower(*file_as);
- if ( ctxt->style->letter_headings )
- e_contact_print_letter_heading(ctxt, character);
- ctxt->first_section = FALSE;
- }
- else if ( (!first_contact) && (ctxt->y - e_contact_get_card_size(card, ctxt, shown_fields) < ctxt->style->bottom_margin * 72)) {
- e_contact_start_new_column(ctxt);
- if ( ctxt->style->letter_headings )
- e_contact_print_letter_heading(ctxt, character);
- }
- ctxt->last_char_on_page = 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_phone_list(card, ctxt, shown_fields);
- 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);
- g_free(character);
-}
-#endif
-
-static void
-e_contact_do_print (EBook *book, char *query, EContactPrintContext *ctxt)
-{
- switch ( ctxt->style->type ) {
- case E_CONTACT_PRINT_TYPE_CARDS:
- e_contact_do_print_cards( book, query, ctxt);
- break;
-#if 0
- case E_CONTACT_PRINT_TYPE_PHONE_LIST:
- e_contact_do_print_phone_list( book, query, ctxt );
- break;
-#endif
- default:
- break;
- }
-}
-
-static void lowify( char *data )
-{
- for ( ; *data; data++ )
- *data = tolower(*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_new_from_full_name( data );
- if ( font ) {
- gtk_object_unref( GTK_OBJECT(*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_new("Helvetica-Bold", 8);
- style->body_font = gnome_font_new("Helvetica", 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_new("Helvetica", 6);
- style->left_header = g_strdup("");
- style->center_header = g_strdup("");
- style->right_header = g_strdup("");
- style->footer_font = gnome_font_new("Helvetica", 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->childs; 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_button(GnomeDialog *dialog, gint button, gpointer data)
-{
- EContactPrintContext *ctxt = g_new(EContactPrintContext, 1);
- EContactPrintStyle *style = g_new(EContactPrintStyle, 1);
- GnomePrintMaster *master;
- GnomePrintContext *pc;
- gboolean uses_book = (gint) gtk_object_get_data(GTK_OBJECT(dialog), "uses_book");
- EBook *book = NULL;
- char *query = NULL;
- ECard *card = NULL;
- gdouble font_size;
- if (uses_book) {
- book = gtk_object_get_data(GTK_OBJECT(dialog), "book");
- query = gtk_object_get_data(GTK_OBJECT(dialog), "query");
- } else {
- card = gtk_object_get_data(GTK_OBJECT(dialog), "card");
- }
- switch( button ) {
- case GNOME_PRINT_PRINT:
- master = gnome_print_master_new_from_dialog( GNOME_PRINT_DIALOG(dialog) );
- pc = gnome_print_master_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_PRINT;
-
- font_size = 72 * ctxt->style->page_height / 27.0 / 2.0;
- ctxt->letter_heading_font = gnome_font_new(gnome_font_get_name(ctxt->style->headings_font), ctxt->style->headings_font->size * 1.5);
- ctxt->letter_tab_font = gnome_font_new(gnome_font_get_name(ctxt->style->headings_font), font_size);
-
- 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));
-
- ctxt->book = book;
- ctxt->query = query;
- if (uses_book) {
- ctxt->cards = NULL;
- e_contact_do_print(book, ctxt->query, ctxt);
- } else {
- ctxt->cards = g_list_append(NULL, card);
- complete_sequence(NULL, ctxt);
- }
- gnome_dialog_close(dialog);
- break;
- case GNOME_PRINT_PREVIEW:
- master = gnome_print_master_new_from_dialog( GNOME_PRINT_DIALOG(dialog) );
- pc = gnome_print_master_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_PREVIEW;
-
- font_size = 72 * ctxt->style->page_height / 27.0 / 2.0;
- ctxt->letter_heading_font = gnome_font_new(gnome_font_get_name(ctxt->style->headings_font), ctxt->style->headings_font->size * 1.5);
- ctxt->letter_tab_font = gnome_font_new(gnome_font_get_name(ctxt->style->headings_font), font_size);
-
- 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));
-
- ctxt->book = book;
- ctxt->query = g_strdup(query);
- if (uses_book) {
- ctxt->cards = NULL;
- gtk_object_ref(GTK_OBJECT(book));
- e_contact_do_print(book, ctxt->query, ctxt);
- } else {
- ctxt->cards = g_list_append(NULL, card);
- gtk_object_ref(GTK_OBJECT(card));
- complete_sequence(NULL, ctxt);
- }
- break;
- case GNOME_PRINT_CANCEL:
- if (uses_book)
- gtk_object_unref(GTK_OBJECT(book));
- else
- gtk_object_unref(GTK_OBJECT(card));
- g_free(query);
- gnome_dialog_close(dialog);
- g_free(style);
- g_free(ctxt);
- break;
- }
-}
-
-GtkWidget *
-e_contact_print_dialog_new(EBook *book, char *query)
-{
- GtkWidget *dialog;
-
-
- dialog = gnome_print_dialog_new("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);
-
- gtk_object_ref(GTK_OBJECT(book));
- gtk_object_set_data(GTK_OBJECT(dialog), "uses_book", (void *) 1);
- gtk_object_set_data(GTK_OBJECT(dialog), "book", book);
- gtk_object_set_data(GTK_OBJECT(dialog), "query", g_strdup(query));
- gtk_signal_connect(GTK_OBJECT(dialog),
- "clicked", GTK_SIGNAL_FUNC(e_contact_print_button), NULL);
- gtk_signal_connect(GTK_OBJECT(dialog),
- "close", GTK_SIGNAL_FUNC(e_contact_print_close), NULL);
- return dialog;
-}
-
-GtkWidget *
-e_contact_print_card_dialog_new(ECard *card)
-{
- GtkWidget *dialog;
-
- dialog = gnome_print_dialog_new("Print card", GNOME_PRINT_DIALOG_COPIES);
-
- card = e_card_duplicate(card);
- gtk_object_set_data(GTK_OBJECT(dialog), "card", card);
- gtk_object_set_data(GTK_OBJECT(dialog), "uses_book", (void *) 0);
- gtk_signal_connect(GTK_OBJECT(dialog),
- "clicked", GTK_SIGNAL_FUNC(e_contact_print_button), NULL);
- gtk_signal_connect(GTK_OBJECT(dialog),
- "close", GTK_SIGNAL_FUNC(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 be24c9fc60..0000000000
--- a/addressbook/printing/e-contact-print.glade
+++ /dev/null
@@ -1,2009 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Printing</name>
- <program_name>printing</program_name>
- <directory></directory>
- <source_directory></source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>False</gnome_support>
- <gettext_support>False</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>True</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-contact-print.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>print-edit-style</name>
- <visible>False</visible>
- <title>Page Setup:</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox-contact-print-style-editor</name>
- <homogeneous>False</homogeneous>
- <spacing>5</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox2</name>
- <border_width>5</border_width>
- <homogeneous>False</homogeneous>
- <spacing>16</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label8</name>
- <label>Style name:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>label-style-name</name>
- <can_focus>True</can_focus>
- <editable>False</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkNotebook</class>
- <name>notebook1</name>
- <can_focus>True</can_focus>
- <show_tabs>True</show_tabs>
- <show_border>True</show_border>
- <tab_pos>GTK_POS_TOP</tab_pos>
- <scrollable>False</scrollable>
- <tab_hborder>2</tab_hborder>
- <tab_vborder>2</tab_vborder>
- <popup_enable>False</popup_enable>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox2</name>
- <border_width>5</border_width>
- <homogeneous>False</homogeneous>
- <spacing>5</spacing>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment1</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame5</name>
- <label>Preview:</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox1</name>
- <homogeneous>True</homogeneous>
- <spacing>7</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame6</name>
- <label>Options</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment4</name>
- <xalign>0</xalign>
- <yalign>0</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
-
- <widget>
- <class>GtkTable</class>
- <name>table1</name>
- <border_width>8</border_width>
- <rows>6</rows>
- <columns>5</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>0</column_spacing>
-
- <widget>
- <class>GtkLabel</class>
- <name>label5</name>
- <label>Include:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label4</name>
- <label>Sections:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment2</name>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>1</left_attach>
- <right_attach>5</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>radiobutton1</name>
- <can_focus>True</can_focus>
- <label>Immediately follow each other</label>
- <active>True</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton1</name>
- <can_focus>True</can_focus>
- <label>Letter tabs on side</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <left_attach>1</left_attach>
- <right_attach>5</right_attach>
- <top_attach>4</top_attach>
- <bottom_attach>5</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton2</name>
- <can_focus>True</can_focus>
- <label>Headings for each letter</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <left_attach>1</left_attach>
- <right_attach>5</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment3</name>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>1</left_attach>
- <right_attach>5</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>radiobutton2</name>
- <can_focus>True</can_focus>
- <label>Start on a new page</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label6</name>
- <label>Number of columns:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>3</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label7</name>
- <label>Blank forms at end:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>3</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment6</name>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>spinbutton2</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>2</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment5</name>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>spinbutton1</name>
- <width>45</width>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>1</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox3</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame7</name>
- <label>Fonts</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table2</name>
- <border_width>8</border_width>
- <rows>2</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>13</row_spacing>
- <column_spacing>8</column_spacing>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment7</name>
- <xalign>0.5</xalign>
- <yalign>1</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button6</name>
- <can_focus>True</can_focus>
- <label>Font...</label>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment8</name>
- <xalign>0.5</xalign>
- <yalign>1</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button5</name>
- <width>90</width>
- <can_focus>True</can_focus>
- <label>Font...</label>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox4</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label10</name>
- <label>Headings</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry3</name>
- <width>100</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text>10 pt. Tahoma</text>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox5</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label9</name>
- <label>Body</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry2</name>
- <width>100</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text>8 pt. Tahoma</text>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame8</name>
- <label>Shading</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton3</name>
- <can_focus>True</can_focus>
- <label>Print using gray shading</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label1</name>
- <label>Format</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox3</name>
- <homogeneous>True</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox6</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame9</name>
- <label>Paper</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox16</name>
- <border_width>10</border_width>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox17</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label21</name>
- <label>Type:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>clist1</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>False</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label26</name>
- <label>label26</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox18</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label24</name>
- <label>Dimensions:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox5</name>
- <homogeneous>True</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label27</name>
- <label>Width:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry9</name>
- <width>1</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label28</name>
- <label>Height:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry10</name>
- <width>1</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox19</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label25</name>
- <label>Paper source:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo1</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>False</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items></items>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>combo-entry1</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame10</name>
- <label>Margins</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table4</name>
- <border_width>15</border_width>
- <rows>2</rows>
- <columns>4</columns>
- <homogeneous>True</homogeneous>
- <row_spacing>6</row_spacing>
- <column_spacing>9</column_spacing>
-
- <widget>
- <class>GtkLabel</class>
- <name>label29</name>
- <label>Top:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label30</name>
- <label>Bottom:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label31</name>
- <label>Left:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry11</name>
- <width>1</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry12</name>
- <width>1</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry13</name>
- <width>1</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry14</name>
- <width>1</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label32</name>
- <label>Right:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox7</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame11</name>
- <label>Page</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox8</name>
- <border_width>10</border_width>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox20</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label33</name>
- <label>Size:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow2</name>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>clist2</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>False</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label35</name>
- <label>label26</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox21</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label34</name>
- <label>Dimensions:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox6</name>
- <homogeneous>True</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label36</name>
- <label>Width:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry15</name>
- <width>1</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label37</name>
- <label>Height:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry16</name>
- <width>1</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame12</name>
- <label>Orientation</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox4</name>
- <homogeneous>False</homogeneous>
- <spacing>10</spacing>
-
- <widget>
- <class>Placeholder</class>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox9</name>
- <homogeneous>False</homogeneous>
- <spacing>5</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment9</name>
- <xalign>0</xalign>
- <yalign>1</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>radiobutton3</name>
- <can_focus>True</can_focus>
- <label>Portrait</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment10</name>
- <xalign>0</xalign>
- <yalign>0</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>radiobutton4</name>
- <can_focus>True</can_focus>
- <label>Landscape</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label2</name>
- <label>Paper</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox10</name>
- <border_width>8</border_width>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkTable</class>
- <name>table5</name>
- <rows>4</rows>
- <columns>3</columns>
- <homogeneous>True</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment15</name>
- <xalign>0</xalign>
- <yalign>1</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button11</name>
- <can_focus>True</can_focus>
- <label>Font...</label>
- </widget>
- </widget>
-
- <widget>
- <class>GtkText</class>
- <name>text10</name>
- <height>50</height>
- <can_focus>True</can_focus>
- <editable>False</editable>
- <text></text>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkText</class>
- <name>text11</name>
- <height>50</height>
- <can_focus>True</can_focus>
- <editable>False</editable>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkText</class>
- <name>text12</name>
- <height>50</height>
- <can_focus>True</can_focus>
- <editable>False</editable>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkText</class>
- <name>text13</name>
- <height>50</height>
- <can_focus>True</can_focus>
- <editable>False</editable>
- <text></text>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkText</class>
- <name>text14</name>
- <height>5</height>
- <can_focus>True</can_focus>
- <editable>False</editable>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkText</class>
- <name>text15</name>
- <height>50</height>
- <can_focus>True</can_focus>
- <editable>False</editable>
- <text></text>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment16</name>
- <xalign>0.5</xalign>
- <yalign>1</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox14</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkLabel</class>
- <name>label14</name>
- <label>Header</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry7</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment17</name>
- <xalign>0.5</xalign>
- <yalign>1</yalign>
- <xscale>1</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox15</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkLabel</class>
- <name>label15</name>
- <label>Footer:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry8</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment14</name>
- <xalign>0</xalign>
- <yalign>1</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button10</name>
- <can_focus>True</can_focus>
- <label>Font...</label>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox7</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkToolbar</class>
- <name>toolbar1</name>
- <orientation>GTK_ORIENTATION_HORIZONTAL</orientation>
- <type>GTK_TOOLBAR_ICONS</type>
- <space_size>5</space_size>
- <space_style>GTK_TOOLBAR_SPACE_EMPTY</space_style>
- <relief>GTK_RELIEF_NORMAL</relief>
- <tooltips>True</tooltips>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>Placeholder</class>
- </widget>
-
- <widget>
- <class>Placeholder</class>
- </widget>
-
- <widget>
- <class>Placeholder</class>
- </widget>
-
- <widget>
- <class>Placeholder</class>
- </widget>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton4</name>
- <can_focus>True</can_focus>
- <label>Reverse on even pages</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label3</name>
- <label>Header/Footer</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button2</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/addressbook/printing/e-contact-print.glade.h b/addressbook/printing/e-contact-print.glade.h
deleted file mode 100644
index b3b03d6d68..0000000000
--- a/addressbook/printing/e-contact-print.glade.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Page Setup:");
-gchar *s = N_("Style name:");
-gchar *s = N_("Preview:");
-gchar *s = N_("Options");
-gchar *s = N_("Include:");
-gchar *s = N_("Sections:");
-gchar *s = N_("Immediately follow each other");
-gchar *s = N_("Letter tabs on side");
-gchar *s = N_("Headings for each letter");
-gchar *s = N_("Start on a new page");
-gchar *s = N_("Number of columns:");
-gchar *s = N_("Blank forms at end:");
-gchar *s = N_("Fonts");
-gchar *s = N_("Font...");
-gchar *s = N_("Font...");
-gchar *s = N_("Headings");
-gchar *s = N_("10 pt. Tahoma");
-gchar *s = N_("Body");
-gchar *s = N_("8 pt. Tahoma");
-gchar *s = N_("Shading");
-gchar *s = N_("Print using gray shading");
-gchar *s = N_("Format");
-gchar *s = N_("Paper");
-gchar *s = N_("Type:");
-gchar *s = N_("label26");
-gchar *s = N_("Dimensions:");
-gchar *s = N_("Width:");
-gchar *s = N_("Height:");
-gchar *s = N_("Paper source:");
-gchar *s = N_("Margins");
-gchar *s = N_("Top:");
-gchar *s = N_("Bottom:");
-gchar *s = N_("Left:");
-gchar *s = N_("Right:");
-gchar *s = N_("Page");
-gchar *s = N_("Size:");
-gchar *s = N_("label26");
-gchar *s = N_("Dimensions:");
-gchar *s = N_("Width:");
-gchar *s = N_("Height:");
-gchar *s = N_("Orientation");
-gchar *s = N_("Portrait");
-gchar *s = N_("Landscape");
-gchar *s = N_("Paper");
-gchar *s = N_("Font...");
-gchar *s = N_("Header");
-gchar *s = N_("Footer:");
-gchar *s = N_("Font...");
-gchar *s = N_("Reverse on even pages");
-gchar *s = N_("Header/Footer");
diff --git a/addressbook/printing/e-contact-print.h b/addressbook/printing/e-contact-print.h
deleted file mode 100644
index fb17271f6b..0000000000
--- a/addressbook/printing/e-contact-print.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-print.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <addressbook/backend/ebook/e-book.h>
-#include "e-contact-print-types.h"
-
-GtkWidget *e_contact_print_dialog_new(EBook *book, char *query);
-GtkWidget *e_contact_print_card_dialog_new(ECard *card);
-
-#endif /* E_CONTACT_PRINT_H */
diff --git a/addressbook/printing/medbook.ecps b/addressbook/printing/medbook.ecps
deleted file mode 100644
index 72cca146dd..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 53ca294d36..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 5844851bfb..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 d4dccc0b87..0000000000
--- a/addressbook/printing/test-contact-print-style-editor.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * test-contact-print-style-editor.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.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, Helix Code, 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_init( "Contact Print Style Editor Test", VERSION, argc, argv);
-
- glade_gnome_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 */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/printing/test-print.c b/addressbook/printing/test-print.c
deleted file mode 100644
index 1b73fda3da..0000000000
--- a/addressbook/printing/test-print.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * test-print.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <glade/glade.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, Helix Code, 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_init( "Contact Print Test", VERSION, argc, argv);
-
- glade_gnome_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);
- gtk_signal_connect(GTK_OBJECT(print), "close", GTK_SIGNAL_FUNC(test_close), NULL);
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/announcement-0.4.1.txt b/announcement-0.4.1.txt
deleted file mode 100644
index 6cf35a537b..0000000000
--- a/announcement-0.4.1.txt
+++ /dev/null
@@ -1,167 +0,0 @@
-Hello,
-
-In honor of last week's conference and expo: a new development snapshot
-release of the Evolution groupware suite (0.4.1, code name "aLeWifE") is
-out.
-
-Evolution is the GNOME mailer, calendar, and addressbook application.
-
-* Availability
-
- You can get the Evolution 0.4.1 tarball here:
-
- ftp://ftp.gnome.org/pub/GNOME/unstable/sources/evolution
-
- Evolution also requires the latest versions of GtkHTML
- (0.6.1), Bonobo (0.18), OAF (0.5.1), GNOME VFS (0.3.1), GConf
- (0.8), libunicode (0.4), GNOME Print (0.20) and ORBit (0.5.3).
-
- ftp://ftp.gnome.org/pub/GNOME/unstable/sources/gtkhtml
- ftp://ftp.gnome.org/pub/GNOME/unstable/sources/bonobo
- ftp://ftp.gnome.org/pub/GNOME/unstable/sources/oaf
- ftp://ftp.gnome.org/pub/GNOME/unstable/sources/gnome-vfs
- ftp://ftp.gnome.org/pub/GNOME/unstable/sources/GConf
- ftp://ftp.gnome.org/pub/GNOME/unstable/sources/libunicode
- ftp://ftp.gnome.org/pub/GNOME/stable/sources/gnome-print
- ftp://ftp.gnome.org/pub/GNOME/stable/sources/ORBit
-
- You can also get Evolution 0.4.1 for Redhat through Helix
- Update, or Evolution 0.4.1 for debian through the Helix GNOME
- debian distribution. Support for other distributions will be
- coming later this week.
-
-* Changes since version 0.3
-
- 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.1
- 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).
-
-* Mailing lists
-
- You can subscribe to the Evolution developers list or the
- Evolution users list by going to the Evolution home page on
- http://www.helixcode.com/apps/evolution.php3
-
-Please note that this is still software in development and should not
-be used for production work. We appreciate testers and contributors,
-but please remember that Evolution will still be buggy, incomplete,
-and temperamental.
-
-Thanks to the many people who have sent in suggestions and fixes.
-
-(And of course, this announcement was sent with Evolution. :-))
-
-Enjoy,
- The Evolution team. \ No newline at end of file
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/Makefile.am b/art/Makefile.am
deleted file mode 100644
index 4ec6c2812c..0000000000
--- a/art/Makefile.am
+++ /dev/null
@@ -1,34 +0,0 @@
-imagesdir = $(datadir)/images/evolution
-
-images_DATA = \
- evolution-calendar.png \
- evolution-contacts.png \
- evolution-inbox.png \
- evolution-notes.png \
- evolution-tasks.png \
- evolution-calendar-mini.png \
- evolution-contacts-mini.png \
- evolution-inbox-mini.png \
- evolution-notes-mini.png \
- evolution-tasks-mini.png \
- evolution-today.png \
- briefcase.png \
- cellphone.png \
- globe.png \
- house.png \
- envelope.png \
- malehead.png
-
-EXTRA_DIST = \
- attachment.xpm \
- empty.xpm \
- mail-new.xpm \
- mail-read.xpm \
- mail-replied.xpm \
- mark.xpm \
- meeting.xpm \
- priority-high.xpm \
- priority-low.xpm \
- tree-expanded.xpm \
- tree-unexpanded.xpm \
- $(images_DATA)
diff --git a/art/attachment.xpm b/art/attachment.xpm
deleted file mode 100644
index 1bcc0386d2..0000000000
--- a/art/attachment.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static char * attachment_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #000000",
-" ",
-" ",
-" ... ",
-" . . . ",
-" . . . . ",
-" . . . . ",
-" . . . . ",
-" . . . . ",
-" . . . . ",
-" . . . . ",
-" . . . . ",
-" . . . ",
-" . . ",
-" . . ",
-" ... ",
-" "};
diff --git a/art/briefcase.png b/art/briefcase.png
deleted file mode 100644
index 424ad09632..0000000000
--- a/art/briefcase.png
+++ /dev/null
Binary files differ
diff --git a/art/cellphone.png b/art/cellphone.png
deleted file mode 100644
index c8d70ae663..0000000000
--- a/art/cellphone.png
+++ /dev/null
Binary files differ
diff --git a/art/empty.xpm b/art/empty.xpm
deleted file mode 100644
index 93b02c0164..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/envelope.png b/art/envelope.png
deleted file mode 100644
index 77acd63100..0000000000
--- a/art/envelope.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-calendar-mini.png b/art/evolution-calendar-mini.png
deleted file mode 100644
index 5386190d96..0000000000
--- a/art/evolution-calendar-mini.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-calendar.png b/art/evolution-calendar.png
deleted file mode 100644
index 76afca6b6f..0000000000
--- a/art/evolution-calendar.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-contacts-mini.png b/art/evolution-contacts-mini.png
deleted file mode 100644
index 685812c137..0000000000
--- a/art/evolution-contacts-mini.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-contacts.png b/art/evolution-contacts.png
deleted file mode 100644
index 0d2cfb7e5f..0000000000
--- a/art/evolution-contacts.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-inbox-mini.png b/art/evolution-inbox-mini.png
deleted file mode 100644
index dbc20fcef1..0000000000
--- a/art/evolution-inbox-mini.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-inbox.png b/art/evolution-inbox.png
deleted file mode 100644
index 3b0f90b292..0000000000
--- a/art/evolution-inbox.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-notes-mini.png b/art/evolution-notes-mini.png
deleted file mode 100644
index f5b5d776d0..0000000000
--- a/art/evolution-notes-mini.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-notes.png b/art/evolution-notes.png
deleted file mode 100644
index f82006b894..0000000000
--- a/art/evolution-notes.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-tasks-mini.png b/art/evolution-tasks-mini.png
deleted file mode 100644
index d23b5a0be7..0000000000
--- a/art/evolution-tasks-mini.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-tasks.png b/art/evolution-tasks.png
deleted file mode 100644
index 0878645f9f..0000000000
--- a/art/evolution-tasks.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution-today.png b/art/evolution-today.png
deleted file mode 100644
index 010bcb8cc7..0000000000
--- a/art/evolution-today.png
+++ /dev/null
Binary files differ
diff --git a/art/globe.png b/art/globe.png
deleted file mode 100644
index 84bebd7e9a..0000000000
--- a/art/globe.png
+++ /dev/null
Binary files differ
diff --git a/art/house.png b/art/house.png
deleted file mode 100644
index df43ec6181..0000000000
--- a/art/house.png
+++ /dev/null
Binary files differ
diff --git a/art/mail-new.xpm b/art/mail-new.xpm
deleted file mode 100644
index dee13fb6b3..0000000000
--- a/art/mail-new.xpm
+++ /dev/null
@@ -1,67 +0,0 @@
-/* XPM */
-static char * mail_new_xpm[] = {
-"16 16 48 1",
-" c None",
-". c #000000",
-"+ c #202020",
-"@ c #817968",
-"# c #F5F5F5",
-"$ c #4D493C",
-"% c #736C5C",
-"& c #F5EEEE",
-"* c #FFEDC7",
-"= c #FAF3EC",
-"- c #FCE6B5",
-"; c #60594D",
-"> c #D3C29E",
-", c #746D5D",
-"' c #F5F1F1",
-") c #FDEECD",
-"! c #F8F4ED",
-"~ c #FAE3B3",
-"{ c #645F4F",
-"] c #C9BA98",
-"^ c #71685A",
-"/ c #FCF5EA",
-"( c #FFE8B7",
-"_ c #F5DEB2",
-": c #FFEABD",
-"< c #90856F",
-"[ c #7C7361",
-"} c #E4D1A9",
-"| c #C9B996",
-"1 c #FFEBC2",
-"2 c #887F6B",
-"3 c #726B59",
-"4 c #D1BF9C",
-"5 c #8B816C",
-"6 c #FFE9BA",
-"7 c #F9E2B2",
-"8 c #FFE8B8",
-"9 c #F6DFB3",
-"0 c #D4C19D",
-"a c #534D42",
-"b c #CFBF9C",
-"c c #645F51",
-"d c #C2B293",
-"e c #C4B393",
-"f c #C4B495",
-"g c #C5B596",
-"h c #CCBC99",
-"i c #4C483D",
-" ",
-" ",
-" ",
-" ",
-" .+......... ",
-" .@#########$. ",
-" .#%&*#*=*-;>. ",
-" .#*,')!*~{~]. ",
-" .#**^/*({*_]. ",
-" .#*:<{#{[-}|. ",
-" .#12**{((34|. ",
-" .#5*_67890ab. ",
-" .cdeeedffghi. ",
-" ........... ",
-" ",
-" "};
diff --git a/art/mail-read.xpm b/art/mail-read.xpm
deleted file mode 100644
index 81bcdf8fd3..0000000000
--- a/art/mail-read.xpm
+++ /dev/null
@@ -1,70 +0,0 @@
-/* XPM */
-static char * mail_read_xpm[] = {
-"16 16 51 1",
-" c None",
-". c #010101",
-"+ c #D9D6D0",
-"@ c #C3C0B9",
-"# c #EFEDE8",
-"$ c #F7F7F6",
-"% c #FAFAFA",
-"& c #B6B4AE",
-"* c #737373",
-"= c #C2BFB8",
-"- c #F5F4F2",
-"; c #FAFAF9",
-"> c #FFFFFF",
-", c #D2CFC9",
-"' c #707070",
-") c #5D5B57",
-"! c #868580",
-"~ c #E5E2DB",
-"{ c #FBFBF8",
-"] c #716E6B",
-"^ c #62605C",
-"/ c #F8F7F2",
-"( c #DDDAD4",
-"_ c #929191",
-": c #969390",
-"< c #92908A",
-"[ c #A1A0A0",
-"} c #F7F5F1",
-"| c #FBFAF7",
-"1 c #A5A29D",
-"2 c #908D87",
-"3 c #F9F7F3",
-"4 c #F0EEE8",
-"5 c #DDD9D2",
-"6 c #797873",
-"7 c #F9F8F4",
-"8 c #74726E",
-"9 c #E3E0D9",
-"0 c #7D7A77",
-"a c #FAF9F6",
-"b c #F8F6F2",
-"c c #FAF8F5",
-"d c #F7F5F2",
-"e c #E2DFD8",
-"f c #090808",
-"g c #D7D4CE",
-"h c #D8D5CF",
-"i c #D6D3CD",
-"j c #DAD7D1",
-"k c #E0DCD5",
-"l c #222221",
-" ",
-" ..... ",
-" .+++++. ",
-" .++++++@. ",
-" .+++++#$%&. ",
-" .*==-;>>>>,'. ",
-" .>)>>>>>>>!~. ",
-" .>{]>>>>>^/(. ",
-" .>{{_::<[{}(. ",
-" .>{|1{{{2345. ",
-" .>|6{{{77895. ",
-" .>0{}abcd~8e. ",
-" .fghhhi++jkl. ",
-" ........... ",
-" ",
-" "};
diff --git a/art/mail-replied.xpm b/art/mail-replied.xpm
deleted file mode 100644
index 9b398da7e0..0000000000
--- a/art/mail-replied.xpm
+++ /dev/null
@@ -1,52 +0,0 @@
-/* XPM */
-static char * mail_replied_xpm[] = {
-"16 16 33 1",
-" c None",
-". c #010101",
-"+ c #2F2F2F",
-"@ c #A7A4A0",
-"# c #FCFCFC",
-"$ c #64625F",
-"% c #95938E",
-"& c #FBFBFB",
-"* c #F9F8F6",
-"= c #FBFAFA",
-"- c #F6F5F1",
-"; c #7D7B78",
-"> c #EAE8E3",
-", c #969491",
-"' c #000000",
-") c #928F8B",
-"! c #FFFFFF",
-"~ c #F7F6F4",
-"{ c #B5B2AC",
-"] c #003366",
-"^ c #EFEFEF",
-"/ c #CCCCCC",
-"( c #AEABA6",
-"_ c #B0ADA7",
-": c #F5F3F0",
-"< c #83817E",
-"[ c #E1DFDA",
-"} c #E2DFD9",
-"| c #002C59",
-"1 c #002850",
-"2 c #00254A",
-"3 c #181818",
-"4 c #090909",
-" ",
-" ",
-" ",
-" ",
-" .+......... ",
-" .@#########$. ",
-" .#%&*#*=*-;>. ",
-" .#*,=''''''''' ",
-" .#**)'!!!!!!!' ",
-" .#*~{'!]]]]^/' ",
-" .#~(*'!]]]^^/' ",
-" .#_*:'!]]]]^/' ",
-" .<[}}'!]^]]|/' ",
-" ....'!^^^12/' ",
-" '!//////3 ",
-" ''4'''''' "};
diff --git a/art/malehead.png b/art/malehead.png
deleted file mode 100644
index ada9545c85..0000000000
--- a/art/malehead.png
+++ /dev/null
Binary files differ
diff --git a/art/mark.xpm b/art/mark.xpm
deleted file mode 100644
index 710cd0e872..0000000000
--- a/art/mark.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static char * mark_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #36592A",
-" ",
-" ",
-" ",
-" ",
-" . ",
-" .. ",
-" .. ",
-" . .. ",
-" .. ... ",
-" .... ",
-" ... ",
-" .. ",
-" . ",
-" ",
-" ",
-" "};
diff --git a/art/meeting.xpm b/art/meeting.xpm
deleted file mode 100644
index bf182fbd8f..0000000000
--- a/art/meeting.xpm
+++ /dev/null
@@ -1,64 +0,0 @@
-/* XPM */
-static char * meeting_xpm[] = {
-"16 16 45 1",
-" c None",
-". c #000000",
-"+ c #161616",
-"@ c #A7A7A7",
-"# c #8A8A8A",
-"$ c #757575",
-"% c #686868",
-"& c #555555",
-"* c #434343",
-"= c #2F2F2F",
-"- c #2B2B2B",
-"; c #FFFFFF",
-"> c #CACACA",
-", c #C0C0C0",
-"' c #B6B6B6",
-") c #D8D5CD",
-"! c #CFCFCF",
-"~ c #AEADA5",
-"{ c #7F7D78",
-"] c #85847F",
-"^ c #92908A",
-"/ c #E0DFD7",
-"( c #A09E98",
-"_ c #E6E5E0",
-": c #E5E3DF",
-"< c #A5A49D",
-"[ c #9D9B95",
-"} c #D5D5D5",
-"| c #B4B1AB",
-"1 c #83817C",
-"2 c #D44D41",
-"3 c #A7453E",
-"4 c #919089",
-"5 c #E2E1DB",
-"6 c #9C9A94",
-"7 c #DEDBD5",
-"8 c #D9D6CE",
-"9 c #E79E3C",
-"0 c #934238",
-"a c #B4B1AA",
-"b c #807F79",
-"c c #82817C",
-"d c #7E7D78",
-"e c #ACA9A3",
-"f c #A3A09A",
-" ",
-" ",
-" ",
-" ",
-" ............. ",
-" +@#$%&&***=-. ",
-" .;;>;;,;;';). ",
-" .!~{~~]~~{~^. ",
-" .;/(_:<))[)~. ",
-" .}|1||2333|4. ",
-" .;56783990)~. ",
-" .}|1||3000|4. ",
-" .)ab~~c~~def. ",
-" ............. ",
-" ",
-" "};
diff --git a/art/priority-high.xpm b/art/priority-high.xpm
deleted file mode 100644
index 8858f5bf94..0000000000
--- a/art/priority-high.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static char * priority_high_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #A7453E",
-" ",
-" ",
-" ",
-" . ",
-" ... ",
-" ... ",
-" ... ",
-" .. ",
-" .. ",
-" . ",
-" ",
-" .. ",
-" .. ",
-" ",
-" ",
-" "};
diff --git a/art/priority-low.xpm b/art/priority-low.xpm
deleted file mode 100644
index ad53e9e0cc..0000000000
--- a/art/priority-low.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static char * priority_low_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #21405A",
-" ",
-" ",
-" ",
-" .. ",
-" .. ",
-" .. ",
-" .. ",
-" .. ",
-" ...... ",
-" .... ",
-" .... ",
-" .. ",
-" .. ",
-" ",
-" ",
-" "};
diff --git a/art/tree-expanded.xpm b/art/tree-expanded.xpm
deleted file mode 100644
index fc748953eb..0000000000
--- a/art/tree-expanded.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * tree_expanded_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" ......... ",
-" .+++++++. ",
-" .+++++++. ",
-" .+++++++. ",
-" .+.....+. ",
-" .+++++++. ",
-" .+++++++. ",
-" .+++++++. ",
-" ......... ",
-" ",
-" ",
-" "};
diff --git a/art/tree-unexpanded.xpm b/art/tree-unexpanded.xpm
deleted file mode 100644
index 0dfb12a0a5..0000000000
--- a/art/tree-unexpanded.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * tree_unexpanded_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" ......... ",
-" .+++++++. ",
-" .+++.+++. ",
-" .+++.+++. ",
-" .+.....+. ",
-" .+++.+++. ",
-" .+++.+++. ",
-" .+++++++. ",
-" ......... ",
-" ",
-" ",
-" "};
diff --git a/autogen.sh b/autogen.sh
deleted file mode 100755
index eec4b5f56d..0000000000
--- a/autogen.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-# Run this to generate all the initial makefiles, etc.
-
-srcdir=`dirname $0`
-test -z "$srcdir" && srcdir=.
-
-PKG_NAME="evolution"
-
-
-. $srcdir/macros/autogen.sh
diff --git a/calendar/.cvsignore b/calendar/.cvsignore
deleted file mode 100644
index 2497bd97d5..0000000000
--- a/calendar/.cvsignore
+++ /dev/null
@@ -1,10 +0,0 @@
-Makefile.in
-Makefile
-.deps
-_libs
-.libs
-*.lo
-GnomeCal-stubs.c
-GnomeCal-skels.c
-GnomeCal-common.c
-GnomeCal.h
diff --git a/calendar/AUTHORS b/calendar/AUTHORS
deleted file mode 100644
index 7e482aef97..0000000000
--- a/calendar/AUTHORS
+++ /dev/null
@@ -1,4 +0,0 @@
-Miguel de Icaza <miguel@kernel.org>
-Federico Mena <federico@helixcode.com>
-Arturo Esponosa <arturo@nuclecu.unam.mx>
-Russell Steinthal <rms39@columbia.edu>
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
deleted file mode 100644
index 8df21920f3..0000000000
--- a/calendar/ChangeLog
+++ /dev/null
@@ -1,5513 +0,0 @@
-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 82accbfda5..0000000000
--- a/calendar/Makefile.am
+++ /dev/null
@@ -1,2 +0,0 @@
-SUBDIRS = idl cal-util pcs cal-client
-#SUBDIRS = idl cal-util pcs cal-client gui conduits
diff --git a/calendar/TODO b/calendar/TODO
deleted file mode 100644
index 4a5dd6c6ff..0000000000
--- a/calendar/TODO
+++ /dev/null
@@ -1,88 +0,0 @@
-Cal-util:
-
-- calobj.h depends on libversit/vcc.h, because it uses a VObject for
- ical_object_create_from_vobject(). This should be an internal
- function in the PCS and nothing else (we do not install libversit,
- so our public libraries should not depend on it).
-
-- Or maybe we *should* install libversit, since the addressbook code
- uses it as well.
-
-- timeutil has a lot of crap and some namespace pollution. Clean it
- up.
-
-PCS:
-
-- When loading a calendar, substitute duplicated UIDs by new ones, and
- possibly print out a warning message.
-
------ Old Gnomecal TODO starts here -----
-
-Pilot:
-
-* Better support for untimed events (we have none now).
-
-* Hash objects based on their UIDs.
-
-* Add placeholders for deleted events, so that we can kill those
- when syncing to the pilot.
-
-BUGS:
-
-- Recurrence end date is wrong. An event that repeats daily will not
- be included in the ending date of the recurrence (off-by-one
- error?).
-
-- X-fields (extensions) are stripped from a vCal file when it is
- saved. They should be preserved.
-
-Features:
-
-- Add a calendar-week so that people know which week of the year it is
-
-Year view:
-
-- See why it is so fucking slow when opening its notebook page for the
- first time.
-
-Month view:
-
-- Popup menu like in the year view.
-
-- Double click on a day takes you to the day view.
-
-- DnD of appointments to move them around.
-
-Week view:
-
-- Nice display as in the Palm Pilot.
-
-Day view:
-
-- Rewrite in terms of the canvas and make it pretty.
-
-Preferences:
-
-- BUG: 12/24 hours stuff is not consistent - I remember that on editing
- new appointment you get the time-selectors always on 12-hr format
-
-Event editor dialog:
-
-- Make it figure out whether the alarm is in
- minutes/hours/days/etc. (via a cascade of conditions) and set the
- widgets appropriately.
-
-Gnome date selection widget:
-
-- Make the displayed date be localized properly -- use strftime().
-
-General:
-
-- Write online help. Nice help. Lots of help.
-
-- If you leave the calendar running overnight, the "current day"
- marker in the GnomeMonthItems does not get updated.
-
-- Add categories support. Color-coded categories.
-
-- Untimed events
diff --git a/calendar/cal-client/.cvsignore b/calendar/cal-client/.cvsignore
deleted file mode 100644
index 6ac95f13c4..0000000000
--- a/calendar/cal-client/.cvsignore
+++ /dev/null
@@ -1,17 +0,0 @@
-Makefile.in
-.deps
-.libs
-.pure
-Makefile
-evolution-calendar-stubs.c
-evolution-calendar-skels.c
-evolution-calendar-common.c
-evolution-calendar.h
-evolution-calendar-common.lo
-evolution-calendar-skels.lo
-evolution-calendar-stubs.lo
-cal-client.lo
-cal-listener.lo
-libcal-client.la
-client-test
-libcal-client-static.la \ No newline at end of file
diff --git a/calendar/cal-client/Makefile.am b/calendar/cal-client/Makefile.am
deleted file mode 100644
index 8a88215257..0000000000
--- a/calendar/cal-client/Makefile.am
+++ /dev/null
@@ -1,71 +0,0 @@
-#
-# libcal-client
-#
-
-CORBA_GENERATED = \
- evolution-calendar.h \
- evolution-calendar-common.c \
- evolution-calendar-skels.c \
- evolution-calendar-stubs.c
-
-idls = \
- $(srcdir)/../idl/evolution-calendar.idl
-
-idl_flags = `$(GNOME_CONFIG) --cflags idl` -I $(datadir)/idl
-
-$(CORBA_GENERATED): $(idls)
- $(ORBIT_IDL) $(idl_flags) $(srcdir)/../idl/evolution-calendar.idl
-
-INCLUDES = \
- -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
- -DG_LOG_DOMAIN=\"cal-client\" \
- -I$(top_srcdir)/calendar \
- -I$(srcdir) -I$(top_srcdir) \
- -I. \
- -I.. \
- -I$(top_builddir) \
- -I$(top_builddir)/libical/src/libical \
- -I$(top_srcdir)/libical/src/libical \
- $(BONOBO_GNOME_CFLAGS)
-
-lib_LTLIBRARIES = libcal-client.la
-
-libcal_clientincludedir = $(includedir)/evolution/cal-client
-
-libcal_client_la_SOURCES = \
- $(CORBA_GENERATED) \
- cal-client.c \
- cal-listener.c \
- cal-listener.h
-
-libcal_clientinclude_HEADERS = \
- cal-client.h
-
-
-#
-# make a static library for use by calendar conduit's shared library
-#
-noinst_LTLIBRARIES = libcal-client-static.la
-libcal_client_static_la_SOURCES = $(libcal_client_la_SOURCES)
-libcal_client_static_la_LDFLAGS = --all-static
-
-
-#
-# client-test program
-#
-
-noinst_PROGRAMS = client-test
-
-client_test_SOURCES = \
- client-test.c
-
-client_test_INCLUDES = \
- $(INCLUDES) \
- -DG_LOG_DOMAIN=\"client-test\"
-
-client_test_LDADD = \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(top_builddir)/calendar/cal-util/libcal-util.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/libical/src/libical/libical.a \
- libcal-client.la
diff --git a/calendar/cal-client/cal-client.c b/calendar/cal-client/cal-client.c
deleted file mode 100644
index b038c26752..0000000000
--- a/calendar/cal-client/cal-client.c
+++ /dev/null
@@ -1,1396 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar client
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-
-#ifdef USING_OAF
-#include <liboaf/liboaf.h>
-#else
-#include <libgnorba/gnorba.h>
-#endif
-
-#include "cal-client.h"
-#include "cal-listener.h"
-
-
-
-/* Loading state for the calendar client */
-typedef enum {
- LOAD_STATE_NOT_LOADED,
- LOAD_STATE_LOADING,
- LOAD_STATE_LOADED
-} LoadState;
-
-/* Private part of the CalClient structure */
-typedef struct {
- /* Load state to avoid multiple loads */
- LoadState load_state;
-
- /* The calendar factory we are contacting */
- Evolution_Calendar_CalFactory factory;
-
- /* Our calendar listener */
- CalListener *listener;
-
- /* The calendar client interface object we are contacting */
- Evolution_Calendar_Cal cal;
-} CalClientPrivate;
-
-
-
-/* Signal IDs */
-enum {
- CAL_LOADED,
- OBJ_UPDATED,
- OBJ_REMOVED,
- LAST_SIGNAL
-};
-
-static void cal_client_class_init (CalClientClass *class);
-static void cal_client_init (CalClient *client);
-static void cal_client_destroy (GtkObject *object);
-
-static guint cal_client_signals[LAST_SIGNAL];
-
-static GtkObjectClass *parent_class;
-
-
-
-/**
- * cal_client_get_type:
- * @void:
- *
- * Registers the #CalClient class if necessary, and returns the type ID assigned
- * to it.
- *
- * Return value: The type ID of the #CalClient class.
- **/
-GtkType
-cal_client_get_type (void)
-{
- static GtkType cal_client_type = 0;
-
- if (!cal_client_type) {
- static const GtkTypeInfo cal_client_info = {
- "CalClient",
- sizeof (CalClient),
- sizeof (CalClientClass),
- (GtkClassInitFunc) cal_client_class_init,
- (GtkObjectInitFunc) cal_client_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- cal_client_type = gtk_type_unique (GTK_TYPE_OBJECT, &cal_client_info);
- }
-
- return cal_client_type;
-}
-
-/* Class initialization function for the calendar client */
-static void
-cal_client_class_init (CalClientClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- parent_class = gtk_type_class (GTK_TYPE_OBJECT);
-
- cal_client_signals[CAL_LOADED] =
- gtk_signal_new ("cal_loaded",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (CalClientClass, cal_loaded),
- gtk_marshal_NONE__ENUM,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_ENUM);
- cal_client_signals[OBJ_UPDATED] =
- gtk_signal_new ("obj_updated",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (CalClientClass, obj_updated),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
- cal_client_signals[OBJ_REMOVED] =
- gtk_signal_new ("obj_removed",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (CalClientClass, obj_removed),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
-
- gtk_object_class_add_signals (object_class, cal_client_signals, LAST_SIGNAL);
-
- object_class->destroy = cal_client_destroy;
-}
-
-/* Object initialization function for the calendar client */
-static void
-cal_client_init (CalClient *client)
-{
- CalClientPrivate *priv;
-
- priv = g_new0 (CalClientPrivate, 1);
- client->priv = priv;
-
- priv->factory = CORBA_OBJECT_NIL;
- priv->load_state = LOAD_STATE_NOT_LOADED;
-}
-
-/* Gets rid of the factory that a client knows about */
-static void
-destroy_factory (CalClient *client)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- int result;
-
- priv = client->priv;
-
- CORBA_exception_init (&ev);
- result = CORBA_Object_is_nil (priv->factory, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("destroy_factory(): could not see if the factory was nil");
- priv->factory = CORBA_OBJECT_NIL;
- CORBA_exception_free (&ev);
- return;
- }
- CORBA_exception_free (&ev);
-
- if (result)
- return;
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (priv->factory, &ev);
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("destroy_factory(): could not release the factory");
-
- CORBA_exception_free (&ev);
- priv->factory = CORBA_OBJECT_NIL;
-}
-
-/* Gets rid of the listener that a client knows about */
-static void
-destroy_listener (CalClient *client)
-{
- CalClientPrivate *priv;
-
- priv = client->priv;
-
- if (!priv->listener)
- return;
-
- bonobo_object_unref (BONOBO_OBJECT (priv->listener));
- priv->listener = NULL;
-}
-
-/* Gets rid of the calendar client interface object that a client knows about */
-static void
-destroy_cal (CalClient *client)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- int result;
-
- priv = client->priv;
-
- CORBA_exception_init (&ev);
- result = CORBA_Object_is_nil (priv->cal, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("destroy_cal(): could not see if the "
- "calendar client interface object was nil");
- priv->cal = CORBA_OBJECT_NIL;
- CORBA_exception_free (&ev);
- return;
- }
- CORBA_exception_free (&ev);
-
- if (result)
- return;
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Cal_unref (priv->cal, &ev);
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("destroy_cal(): could not unref the calendar client interface object");
-
- CORBA_exception_free (&ev);
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (priv->cal, &ev);
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("destroy_cal(): could not release the calendar client interface object");
-
- CORBA_exception_free (&ev);
- priv->cal = CORBA_OBJECT_NIL;
-
-}
-
-/* Destroy handler for the calendar client */
-static void
-cal_client_destroy (GtkObject *object)
-{
- CalClient *client;
- CalClientPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CAL_CLIENT (object));
-
- client = CAL_CLIENT (object);
- priv = client->priv;
-
- destroy_factory (client);
- destroy_listener (client);
- destroy_cal (client);
-
- priv->load_state = LOAD_STATE_NOT_LOADED;
-
- g_free (priv);
- client->priv = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-
-/* Signal handlers for the listener's signals */
-
-/* Handle the cal_loaded signal from the listener */
-static void
-cal_loaded_cb (CalListener *listener,
- Evolution_Calendar_Listener_LoadStatus status,
- Evolution_Calendar_Cal cal,
- gpointer data)
-{
- CalClient *client;
- CalClientPrivate *priv;
- CORBA_Environment ev;
- Evolution_Calendar_Cal cal_copy;
- CalClientLoadStatus client_status;
-
- client = CAL_CLIENT (data);
- priv = client->priv;
-
- g_assert (priv->load_state == LOAD_STATE_LOADING);
-
- client_status = CAL_CLIENT_LOAD_ERROR;
-
- switch (status) {
- case Evolution_Calendar_Listener_SUCCESS:
- CORBA_exception_init (&ev);
- cal_copy = CORBA_Object_duplicate (cal, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_loaded(): could not duplicate the calendar client interface");
- CORBA_exception_free (&ev);
- goto error;
- }
- CORBA_exception_free (&ev);
-
- priv->cal = cal_copy;
- priv->load_state = LOAD_STATE_LOADED;
-
- client_status = CAL_CLIENT_LOAD_SUCCESS;
- goto out;
-
- case Evolution_Calendar_Listener_ERROR:
- client_status = CAL_CLIENT_LOAD_ERROR;
- goto error;
-
- case Evolution_Calendar_Listener_IN_USE:
- client_status = CAL_CLIENT_LOAD_IN_USE;
- goto error;
-
- case Evolution_Calendar_Listener_METHOD_NOT_SUPPORTED:
- client_status = CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED;
- goto error;
-
- default:
- g_assert_not_reached ();
- }
-
- error:
-
- bonobo_object_unref (BONOBO_OBJECT (priv->listener));
- priv->listener = NULL;
- priv->load_state = LOAD_STATE_NOT_LOADED;
-
- out:
-
- g_assert (priv->load_state != LOAD_STATE_LOADING);
-
- gtk_signal_emit (GTK_OBJECT (client), cal_client_signals[CAL_LOADED],
- client_status);
-}
-
-/* Handle the obj_updated signal from the listener */
-static void
-obj_updated_cb (CalListener *listener, const Evolution_Calendar_CalObjUID uid, gpointer data)
-{
- CalClient *client;
-
- client = CAL_CLIENT (data);
- gtk_signal_emit (GTK_OBJECT (client), cal_client_signals[OBJ_UPDATED], uid);
-}
-
-/* Handle the obj_removed signal from the listener */
-static void
-obj_removed_cb (CalListener *listener, const Evolution_Calendar_CalObjUID uid, gpointer data)
-{
- CalClient *client;
-
- client = CAL_CLIENT (data);
- gtk_signal_emit (GTK_OBJECT (client), cal_client_signals[OBJ_REMOVED], uid);
-}
-
-
-
-/**
- * cal_client_construct:
- * @client: A calendar client.
- *
- * Constructs a calendar client object by contacting the calendar factory of the
- * calendar server.
- *
- * Return value: The same object as the @client argument, or NULL if the
- * calendar factory could not be contacted.
- **/
-CalClient *
-cal_client_construct (CalClient *client)
-{
- CalClientPrivate *priv;
- Evolution_Calendar_CalFactory factory, factory_copy;
- CORBA_Environment ev;
- int result;
-
- CORBA_exception_init (&ev);
- g_return_val_if_fail (client != NULL, NULL);
- g_return_val_if_fail (IS_CAL_CLIENT (client), NULL);
-
- priv = client->priv;
-
-#ifdef USING_OAF
- factory = (Evolution_Calendar_CalFactory) oaf_activate_from_id (
- "OAFIID:evolution:calendar-factory:1c915858-ece3-4a6f-9d81-ea0f108a9554",
- OAF_FLAG_NO_LOCAL, NULL, &ev);
-#else
- factory = (Evolution_Calendar_CalFactory) goad_server_activate_with_id (
- NULL,
- "evolution:calendar-factory",
- GOAD_ACTIVATE_REMOTE,
- NULL);
-#endif
-
- result = CORBA_Object_is_nil (factory, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_client_construct(): could not see if the factory is NIL");
- CORBA_exception_free (&ev);
- return NULL;
- }
- CORBA_exception_free (&ev);
-
- if (result) {
- g_message ("cal_client_construct(): could not contact Wombat, "
- "the personal calendar server");
- return NULL;
- }
-
- CORBA_exception_init (&ev);
- factory_copy = CORBA_Object_duplicate (factory, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_client_construct(): could not duplicate the calendar factory");
- CORBA_exception_free (&ev);
- return NULL;
- }
- CORBA_exception_free (&ev);
-
- priv->factory = factory_copy;
- return client;
-}
-
-/**
- * cal_client_new:
- *
- * Creates a new calendar client. It should be initialized by calling
- * cal_client_load_calendar() or cal_client_create_calendar().
- *
- * Return value: A newly-created calendar client, or NULL if the client could
- * not be constructed because it could not contact the calendar server.
- **/
-CalClient *
-cal_client_new (void)
-{
- CalClient *client;
-
- client = gtk_type_new (CAL_CLIENT_TYPE);
-
- if (!cal_client_construct (client)) {
- g_message ("cal_client_new(): could not construct the calendar client");
- gtk_object_unref (GTK_OBJECT (client));
- return NULL;
- }
-
- return client;
-}
-
-/* Issues a load or create request */
-static gboolean
-load_or_create (CalClient *client, const char *str_uri, gboolean load)
-{
- CalClientPrivate *priv;
- Evolution_Calendar_Listener corba_listener;
- CORBA_Environment ev;
-
- g_return_val_if_fail (client != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE);
-
- priv = client->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_NOT_LOADED, FALSE);
-
- g_return_val_if_fail (str_uri != NULL, FALSE);
-
- priv->listener = cal_listener_new ();
- if (!priv->listener) {
- g_message ("load_or_create(): could not create the listener");
- return FALSE;
- }
-
- gtk_signal_connect (GTK_OBJECT (priv->listener), "cal_loaded",
- GTK_SIGNAL_FUNC (cal_loaded_cb),
- client);
- gtk_signal_connect (GTK_OBJECT (priv->listener), "obj_updated",
- GTK_SIGNAL_FUNC (obj_updated_cb),
- client);
- gtk_signal_connect (GTK_OBJECT (priv->listener), "obj_removed",
- GTK_SIGNAL_FUNC (obj_removed_cb),
- client);
-
- corba_listener = (Evolution_Calendar_Listener) bonobo_object_corba_objref (
- BONOBO_OBJECT (priv->listener));
-
- CORBA_exception_init (&ev);
-
- priv->load_state = LOAD_STATE_LOADING;
-
- if (load)
- Evolution_Calendar_CalFactory_load (priv->factory, str_uri, corba_listener, &ev);
- else
- Evolution_Calendar_CalFactory_create (priv->factory, str_uri, corba_listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("load_or_create(): load/create request failed");
- bonobo_object_unref (BONOBO_OBJECT (priv->listener));
- priv->listener = NULL;
- priv->load_state = LOAD_STATE_NOT_LOADED;
- CORBA_exception_free (&ev);
- return FALSE;
- }
- CORBA_exception_free (&ev);
-
- return TRUE;
-}
-
-/**
- * cal_client_load_calendar:
- * @client: A calendar client.
- * @str_uri: URI of calendar to load.
- *
- * Makes a calendar client initiate a request to load a calendar. The calendar
- * client will emit the "cal_loaded" signal when the response from the server is
- * received.
- *
- * Return value: TRUE on success, FALSE on failure to issue the load request.
- **/
-gboolean
-cal_client_load_calendar (CalClient *client, const char *str_uri)
-{
- return load_or_create (client, str_uri, TRUE);
-}
-
-/**
- * cal_client_create_calendar:
- * @client: A calendar client.
- * @str_uri: URI that will contain the calendar data.
- *
- * Makes a calendar client initiate a request to create a new calendar. The
- * calendar client will emit the "cal_loaded" signal when the response from the
- * server is received.
- *
- * Return value: TRUE on success, FALSE on failure to issue the create request.
- **/
-gboolean
-cal_client_create_calendar (CalClient *client, const char *str_uri)
-{
- return load_or_create (client, str_uri, FALSE);
-}
-
-/* Converts our representation of a calendar component type into its CORBA representation */
-static Evolution_Calendar_CalObjType
-corba_obj_type (CalObjType type)
-{
- return (((type & CALOBJ_TYPE_EVENT) ? Evolution_Calendar_TYPE_EVENT : 0)
- | ((type & CALOBJ_TYPE_TODO) ? Evolution_Calendar_TYPE_TODO : 0)
- | ((type & CALOBJ_TYPE_JOURNAL) ? Evolution_Calendar_TYPE_JOURNAL : 0));
-}
-
-/**
- * cal_client_get_n_objects:
- * @client: A calendar client.
- * @type: Type of objects that will be counted.
- *
- * Counts the number of calendar components of the specified @type. This can be
- * used to count how many events, to-dos, or journals there are, for example.
- *
- * Return value: Number of components.
- **/
-int
-cal_client_get_n_objects (CalClient *client, CalObjType type)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- int n;
- int t;
-
- g_return_val_if_fail (client != NULL, -1);
- g_return_val_if_fail (IS_CAL_CLIENT (client), -1);
-
- priv = client->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, -1);
-
- t = corba_obj_type (type);
-
- CORBA_exception_init (&ev);
- n = Evolution_Calendar_Cal_get_n_objects (priv->cal, t, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_client_get_n_objects(): could not get the number of objects");
- CORBA_exception_free (&ev);
- return -1;
- }
-
- CORBA_exception_free (&ev);
- return n;
-}
-
-/**
- * cal_client_get_object:
- * @client: A calendar client.
- * @uid: Unique identifier for a calendar component.
- * @comp: Return value for the calendar component object.
- *
- * Queries a calendar for a calendar component object based on its unique
- * identifier.
- *
- * Return value: Result code based on the status of the operation.
- **/
-CalClientGetStatus
-cal_client_get_object (CalClient *client, const char *uid, CalComponent **comp)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- Evolution_Calendar_CalObj calobj_str;
- CalClientGetStatus retval;
- icalcomponent *icalcomp;
-
- g_return_val_if_fail (client != NULL, CAL_CLIENT_GET_NOT_FOUND);
- g_return_val_if_fail (IS_CAL_CLIENT (client), CAL_CLIENT_GET_NOT_FOUND);
-
- priv = client->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, CAL_CLIENT_GET_NOT_FOUND);
-
- g_return_val_if_fail (uid != NULL, CAL_CLIENT_GET_NOT_FOUND);
- g_return_val_if_fail (comp != NULL, CAL_CLIENT_GET_NOT_FOUND);
-
- retval = CAL_CLIENT_GET_NOT_FOUND;
- *comp = NULL;
-
- CORBA_exception_init (&ev);
- calobj_str = Evolution_Calendar_Cal_get_object (priv->cal, (char *) uid, &ev);
-
- if (ev._major == CORBA_USER_EXCEPTION
- && strcmp (CORBA_exception_id (&ev), ex_Evolution_Calendar_Cal_NotFound) == 0)
- goto out;
- else if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_client_get_object(): could not get the object");
- goto out;
- }
-
- icalcomp = icalparser_parse_string (calobj_str);
- CORBA_free (calobj_str);
-
- if (!icalcomp) {
- retval = CAL_CLIENT_GET_SYNTAX_ERROR;
- goto out;
- }
-
- *comp = cal_component_new ();
- if (!cal_component_set_icalcomponent (*comp, icalcomp)) {
- icalcomponent_free (icalcomp);
- gtk_object_unref (GTK_OBJECT (*comp));
- *comp = NULL;
-
- retval = CAL_CLIENT_GET_SYNTAX_ERROR;
- goto out;
- }
-
- retval = CAL_CLIENT_GET_SUCCESS;
-
- out:
-
- CORBA_exception_free (&ev);
- return retval;
-}
-
-CalClientGetStatus
-cal_client_get_uid_by_pilot_id (CalClient *client,
- unsigned long pilot_id,
- char **uid)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- CalClientGetStatus retval;
- char *uid_str;
-
- g_return_val_if_fail (client != NULL, CAL_CLIENT_GET_NOT_FOUND);
- g_return_val_if_fail (IS_CAL_CLIENT (client),
- CAL_CLIENT_GET_NOT_FOUND);
-
- priv = client->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED,
- CAL_CLIENT_GET_NOT_FOUND);
-
- retval = CAL_CLIENT_GET_NOT_FOUND;
- *uid = NULL;
-
- CORBA_exception_init (&ev);
- uid_str = Evolution_Calendar_Cal_get_uid_by_pilot_id (priv->cal, pilot_id, &ev);
-
- if (ev._major == CORBA_USER_EXCEPTION &&
- strcmp (CORBA_exception_id (&ev),
- ex_Evolution_Calendar_Cal_NotFound) == 0)
- goto out;
- else if (ev._major != CORBA_NO_EXCEPTION) {
- //g_message ("cal_client_get_object(): could not get the object");
- goto out;
- }
-
- if (uid_str) {
- retval = CAL_CLIENT_GET_SUCCESS;
- (*uid) = g_strdup (uid_str);
- CORBA_free (uid_str);
- }
-
- out:
-
- CORBA_exception_free (&ev);
- return retval;
-}
-
-
-
-void cal_client_update_pilot_id (CalClient *client, char *uid,
- unsigned long pilot_id,
- unsigned long pilot_status)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
-
- g_return_if_fail (client != NULL);
- g_return_if_fail (IS_CAL_CLIENT (client));
-
- priv = client->priv;
- g_return_if_fail (priv->load_state == LOAD_STATE_LOADED);
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Cal_update_pilot_id (priv->cal, uid,
- pilot_id, pilot_status,
- &ev);
-
- CORBA_exception_free (&ev);
-}
-
-/* Builds an UID list out of a CORBA UID sequence */
-static GList *
-build_uid_list (Evolution_Calendar_CalObjUIDSeq *seq)
-{
- GList *uids;
- int i;
-
- uids = NULL;
-
- for (i = 0; i < seq->_length; i++)
- uids = g_list_prepend (uids, g_strdup (seq->_buffer[i]));
-
- return uids;
-}
-
-/**
- * cal_client_get_uids:
- * @client: A calendar client.
- * @type: Bitmask with types of objects to return.
- *
- * Queries a calendar for a list of unique identifiers corresponding to calendar
- * objects whose type matches one of the types specified in the @type flags.
- *
- * Return value: A list of strings that are the sought UIDs.
- **/
-GList *
-cal_client_get_uids (CalClient *client, CalObjType type)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- Evolution_Calendar_CalObjUIDSeq *seq;
- int t;
- GList *uids;
-
- g_return_val_if_fail (client != NULL, NULL);
- g_return_val_if_fail (IS_CAL_CLIENT (client), NULL);
-
- priv = client->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, NULL);
-
- t = corba_obj_type (type);
-
- CORBA_exception_init (&ev);
-
- seq = Evolution_Calendar_Cal_get_uids (priv->cal, t, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_client_get_uids(): could not get the list of UIDs");
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- uids = build_uid_list (seq);
- CORBA_free (seq);
-
- return uids;
-}
-
-/* FIXME: Not used? */
-#if 0
-/* Builds a GList of CalObjInstance structures from the CORBA sequence */
-static GList *
-build_object_instance_list (Evolution_Calendar_CalObjInstanceSeq *seq)
-{
- GList *list;
- int i;
-
- /* Create the list in reverse order */
-
- list = NULL;
- for (i = 0; i < seq->_length; i++) {
- Evolution_Calendar_CalObjInstance *corba_icoi;
- CalObjInstance *icoi;
-
- corba_icoi = &seq->_buffer[i];
- icoi = g_new (CalObjInstance, 1);
-
- icoi->uid = g_strdup (corba_icoi->uid);
- icoi->start = corba_icoi->start;
- icoi->end = corba_icoi->end;
-
- list = g_list_prepend (list, icoi);
- }
-
- list = g_list_reverse (list);
- return list;
-}
-#endif
-
-/**
- * cal_client_get_objects_in_range:
- * @client: A calendar client.
- * @type: Bitmask with types of objects to return.
- * @start: Start time for query.
- * @end: End time for query.
- *
- * Queries a calendar for the objects that occur or recur in the specified range
- * of time.
- *
- * Return value: A list of UID strings. This should be freed using the
- * cal_obj_uid_list_free() function.
- **/
-GList *
-cal_client_get_objects_in_range (CalClient *client, CalObjType type, time_t start, time_t end)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- Evolution_Calendar_CalObjUIDSeq *seq;
- GList *uids;
- int t;
-
- g_return_val_if_fail (client != NULL, NULL);
- g_return_val_if_fail (IS_CAL_CLIENT (client), NULL);
-
- priv = client->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, NULL);
-
- g_return_val_if_fail (start != -1 && end != -1, NULL);
- g_return_val_if_fail (start <= end, NULL);
-
- CORBA_exception_init (&ev);
-
- t = corba_obj_type (type);
-
- seq = Evolution_Calendar_Cal_get_objects_in_range (priv->cal, t, start, end, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_client_get_objects_in_range(): could not get the objects");
- CORBA_exception_free (&ev);
- return NULL;
- }
- CORBA_exception_free (&ev);
-
- uids = build_uid_list (seq);
- CORBA_free (seq);
-
- return uids;
-}
-
-/* Callback used when an object is updated and we must update the copy we have */
-static void
-generate_instances_obj_updated_cb (CalClient *client, const char *uid, gpointer data)
-{
- GHashTable *uid_comp_hash;
- CalComponent *comp;
- CalClientGetStatus status;
- const char *comp_uid;
-
- uid_comp_hash = data;
-
- comp = g_hash_table_lookup (uid_comp_hash, uid);
- if (!comp)
- /* OK, so we don't care about new objects that may indeed be in
- * the requested time range. We only care about the ones that
- * were returned by the first query to
- * cal_client_get_objects_in_range().
- */
- return;
-
- g_hash_table_remove (uid_comp_hash, uid);
- gtk_object_unref (GTK_OBJECT (comp));
-
- status = cal_client_get_object (client, uid, &comp);
-
- switch (status) {
- case CAL_CLIENT_GET_SUCCESS:
- /* The hash key comes from the component's internal data */
- cal_component_get_uid (comp, &comp_uid);
- g_hash_table_insert (uid_comp_hash, (char *) comp_uid, comp);
- break;
-
- case CAL_CLIENT_GET_NOT_FOUND:
- /* No longer in the server, too bad */
- break;
-
- case CAL_CLIENT_GET_SYNTAX_ERROR:
- g_message ("obj_updated_cb(): Syntax error when getting "
- "object `%s'; ignoring...", uid);
- break;
-
- }
-}
-
-/* Callback used when an object is removed and we must delete the copy we have */
-static void
-generate_instances_obj_removed_cb (CalClient *client, const char *uid, gpointer data)
-{
- GHashTable *uid_comp_hash;
- CalComponent *comp;
-
- uid_comp_hash = data;
-
- comp = g_hash_table_lookup (uid_comp_hash, uid);
- if (!comp)
- return;
-
- g_hash_table_remove (uid_comp_hash, uid);
- gtk_object_unref (GTK_OBJECT (comp));
-}
-
-/* Adds a component to the list; called from g_hash_table_foreach() */
-static void
-add_component (gpointer key, gpointer value, gpointer data)
-{
- CalComponent *comp;
- GList **list;
-
- comp = CAL_COMPONENT (value);
- list = data;
-
- *list = g_list_prepend (*list, comp);
-}
-
-/* Gets a list of components that recur within the specified range of time. It
- * ensures that the resulting list of CalComponent objects contains only objects
- * that are actually in the server at the time the initial
- * cal_client_get_objects_in_range() query ends.
- */
-static GList *
-get_objects_atomically (CalClient *client, CalObjType type, time_t start, time_t end)
-{
- GList *uids;
- GHashTable *uid_comp_hash;
- GList *objects;
- guint obj_updated_id;
- guint obj_removed_id;
- GList *l;
-
- uids = cal_client_get_objects_in_range (client, type, start, end);
-
- uid_comp_hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- /* While we are getting the actual object data, keep track of changes */
-
- obj_updated_id = gtk_signal_connect (GTK_OBJECT (client), "obj_updated",
- GTK_SIGNAL_FUNC (generate_instances_obj_updated_cb),
- uid_comp_hash);
-
- obj_removed_id = gtk_signal_connect (GTK_OBJECT (client), "obj_removed",
- GTK_SIGNAL_FUNC (generate_instances_obj_removed_cb),
- uid_comp_hash);
-
- /* Get the objects */
-
- for (l = uids; l; l = l->next) {
- CalComponent *comp;
- CalClientGetStatus status;
- char *uid;
- const char *comp_uid;
-
- uid = l->data;
-
- status = cal_client_get_object (client, uid, &comp);
-
- switch (status) {
- case CAL_CLIENT_GET_SUCCESS:
- /* The hash key comes from the component's internal data
- * instead of the duped UID from the list of UIDS.
- */
- cal_component_get_uid (comp, &comp_uid);
- g_hash_table_insert (uid_comp_hash, (char *) comp_uid, comp);
- break;
-
- case CAL_CLIENT_GET_NOT_FOUND:
- /* Object disappeared from the server, so don't log it */
- break;
-
- case CAL_CLIENT_GET_SYNTAX_ERROR:
- g_message ("get_objects_atomically(): Syntax error when getting "
- "object `%s'; ignoring...", uid);
- break;
-
- default:
- g_assert_not_reached ();
- }
- }
-
- cal_obj_uid_list_free (uids);
-
- /* Now our state is consistent with the server, so disconnect from the
- * notification signals and generate the final list of components.
- */
-
- gtk_signal_disconnect (GTK_OBJECT (client), obj_updated_id);
- gtk_signal_disconnect (GTK_OBJECT (client), obj_removed_id);
-
- objects = NULL;
- g_hash_table_foreach (uid_comp_hash, add_component, &objects);
- g_hash_table_destroy (uid_comp_hash);
-
- return objects;
-}
-
-struct comp_instance {
- CalComponent *comp;
- time_t start;
- time_t end;
-};
-
-/* Called from cal_recur_generate_instances(); adds an instance to the list */
-static gboolean
-add_instance (CalComponent *comp, time_t start, time_t end, gpointer data)
-{
- GList **list;
- struct comp_instance *ci;
-
- list = data;
-
- ci = g_new (struct comp_instance, 1);
-
- ci->comp = comp;
- gtk_object_ref (GTK_OBJECT (ci->comp));
-
- ci->start = start;
- ci->end = end;
-
- return TRUE;
-}
-
-/* Used from g_list_sort(); compares two struct comp_instance structures */
-static gint
-compare_comp_instance (gconstpointer a, gconstpointer b)
-{
- const struct comp_instance *cia, *cib;
- time_t diff;
-
- cia = a;
- cib = b;
-
- diff = cia->start - cib->start;
- return (diff < 0) ? -1 : (diff > 0) ? 1 : 0;
-}
-
-/**
- * cal_client_generate_instances:
- * @client: A calendar client.
- * @type: Bitmask with types of objects to return.
- * @start: Start time for query.
- * @end: End time for query.
- * @cb: Callback for each generated instance.
- * @cb_data: Closure data for the callback.
- *
- * Does a combination of cal_client_get_objects_in_range() and
- * cal_recur_generate_instances(). It fetches the list of objects in an atomic
- * way so that the generated instances are actually in the server at the time
- * the initial cal_client_get_objects_in_range() query ends.
- *
- * The callback function should do a gtk_object_ref() of the calendar component
- * it gets passed if it intends to keep it around.
- **/
-void
-cal_client_generate_instances (CalClient *client, CalObjType type,
- time_t start, time_t end,
- CalRecurInstanceFn cb, gpointer cb_data)
-{
- CalClientPrivate *priv;
- GList *objects;
- GList *instances;
- GList *l;
-
- g_return_if_fail (client != NULL);
- g_return_if_fail (IS_CAL_CLIENT (client));
-
- priv = client->priv;
- g_return_if_fail (priv->load_state == LOAD_STATE_LOADED);
-
- g_return_if_fail (start != -1 && end != -1);
- g_return_if_fail (start <= end);
- g_return_if_fail (cb != NULL);
-
- /* Generate objects */
-
- objects = get_objects_atomically (client, type, start, end);
- instances = NULL;
-
- for (l = objects; l; l = l->next) {
- CalComponent *comp;
-
- comp = l->data;
- cal_recur_generate_instances (comp, start, end, add_instance, &instances);
- }
-
- g_list_free (objects);
-
- /* Generate instances and spew them out */
-
- instances = g_list_sort (instances, compare_comp_instance);
-
- for (l = instances; l; l = l->next) {
- struct comp_instance *ci;
- gboolean result;
-
- ci = l->data;
-
- result = (* cb) (ci->comp, ci->start, ci->end, cb_data);
-
- if (!result)
- break;
- }
-
- /* Clean up */
-
- for (l = instances; l; l = l->next) {
- struct comp_instance *ci;
-
- ci = l->data;
- gtk_object_unref (GTK_OBJECT (ci->comp));
- g_free (ci);
- }
-
- g_list_free (instances);
-}
-
-
-#if 0
-/* Translates the CORBA representation of an AlarmType */
-static enum AlarmType
-uncorba_alarm_type (Evolution_Calendar_AlarmType corba_type)
-{
- switch (corba_type) {
- case Evolution_Calendar_MAIL:
- return ALARM_MAIL;
-
- case Evolution_Calendar_PROGRAM:
- return ALARM_PROGRAM;
-
- case Evolution_Calendar_DISPLAY:
- return ALARM_DISPLAY;
-
- case Evolution_Calendar_AUDIO:
- return ALARM_AUDIO;
-
- default:
- g_assert_not_reached ();
- return ALARM_DISPLAY;
- }
-}
-#endif
-
-/* Builds a GList of CalAlarmInstance structures from the CORBA sequence */
-static GList *
-build_alarm_instance_list (Evolution_Calendar_CalAlarmInstanceSeq *seq)
-{
- GList *list;
- int i;
-
- /* Create the list in reverse order */
-
- list = NULL;
- for (i = 0; i < seq->_length; i++) {
- Evolution_Calendar_CalAlarmInstance *corba_ai;
- CalAlarmInstance *ai;
-
- corba_ai = &seq->_buffer[i];
- ai = g_new (CalAlarmInstance, 1);
-
- ai->uid = g_strdup (corba_ai->uid);
-#if 0
- ai->type = uncorba_alarm_type (corba_ai->type);
-#endif
- ai->trigger = corba_ai->trigger;
- ai->occur = corba_ai->occur;
-
- list = g_list_prepend (list, ai);
- }
-
- list = g_list_reverse (list);
- return list;
-}
-
-/**
- * cal_client_get_alarms_in_range:
- * @client: A calendar client.
- * @start: Start time for query.
- * @end: End time for query.
- *
- * Queries a calendar for the alarms that trigger in the specified range of
- * time.
- *
- * Return value: A list of #CalAlarmInstance structures.
- **/
-GList *
-cal_client_get_alarms_in_range (CalClient *client, time_t start, time_t end)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- Evolution_Calendar_CalAlarmInstanceSeq *seq;
- GList *alarms;
-
- g_return_val_if_fail (client != NULL, NULL);
- g_return_val_if_fail (IS_CAL_CLIENT (client), NULL);
-
- priv = client->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, NULL);
-
- g_return_val_if_fail (start != -1 && end != -1, NULL);
- g_return_val_if_fail (start <= end, NULL);
-
- CORBA_exception_init (&ev);
-
- seq = Evolution_Calendar_Cal_get_alarms_in_range (priv->cal, start, end, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_client_get_alarms_in_range(): could not get the alarm range");
- CORBA_exception_free (&ev);
- return NULL;
- }
- CORBA_exception_free (&ev);
-
- alarms = build_alarm_instance_list (seq);
- CORBA_free (seq);
-
- return alarms;
-}
-
-/**
- * cal_client_get_alarms_for_object:
- * @client: A calendar client.
- * @uid: Unique identifier for a calendar object.
- * @start: Start time for query.
- * @end: End time for query.
- * @alarms: Return value for the list of alarm instances.
- *
- * Queries a calendar for the alarms of a particular object that trigger in the
- * specified range of time.
- *
- * Return value: TRUE on success, FALSE if the object was not found.
- **/
-gboolean
-cal_client_get_alarms_for_object (CalClient *client, const char *uid,
- time_t start, time_t end,
- GList **alarms)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- Evolution_Calendar_CalAlarmInstanceSeq *seq;
- gboolean retval;
-
- g_return_val_if_fail (client != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE);
-
- priv = client->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, FALSE);
-
- g_return_val_if_fail (uid != NULL, FALSE);
- g_return_val_if_fail (start != -1 && end != -1, FALSE);
- g_return_val_if_fail (start <= end, FALSE);
- g_return_val_if_fail (alarms != NULL, FALSE);
-
- *alarms = NULL;
- retval = FALSE;
-
- CORBA_exception_init (&ev);
-
- seq = Evolution_Calendar_Cal_get_alarms_for_object (priv->cal, (char *) uid, start, end, &ev);
- if (ev._major == CORBA_USER_EXCEPTION
- && strcmp (CORBA_exception_id (&ev), ex_Evolution_Calendar_Cal_NotFound) == 0)
- goto out;
- else if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_client_get_alarms_for_object(): could not get the alarm range");
- goto out;
- }
-
- retval = TRUE;
- *alarms = build_alarm_instance_list (seq);
- CORBA_free (seq);
-
- out:
- CORBA_exception_free (&ev);
- return retval;
-
-}
-
-/**
- * cal_client_update_object:
- * @client: A calendar client.
- * @comp: A calendar component object.
- *
- * Asks a calendar to update a component. Any existing component with the
- * specified component's UID will be replaced. The client program should not
- * assume that the object is actually in the server's storage until it has
- * received the "obj_updated" notification signal.
- *
- * Return value: TRUE on success, FALSE on specifying an invalid component.
- **/
-gboolean
-cal_client_update_object (CalClient *client, CalComponent *comp)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- gboolean retval;
- char *obj_string;
- const char *uid;
-
- g_return_val_if_fail (client != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE);
-
- priv = client->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, FALSE);
-
- g_return_val_if_fail (comp != NULL, FALSE);
-
- retval = FALSE;
-
- cal_component_commit_sequence (comp);
- obj_string = cal_component_get_as_string (comp);
-
- cal_component_get_uid (comp, &uid);
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Cal_update_object (priv->cal, (char *) uid, obj_string, &ev);
- g_free (obj_string);
-
- if (ev._major == CORBA_USER_EXCEPTION &&
- strcmp (CORBA_exception_id (&ev), ex_Evolution_Calendar_Cal_InvalidObject) == 0)
- goto out;
- else if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_client_update_object(): could not update the object");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- CORBA_exception_free (&ev);
- return retval;
-}
-
-gboolean
-cal_client_remove_object (CalClient *client, const char *uid)
-{
- CalClientPrivate *priv;
- CORBA_Environment ev;
- gboolean retval;
-
- g_return_val_if_fail (client != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE);
-
- priv = client->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, FALSE);
-
- g_return_val_if_fail (uid != NULL, FALSE);
-
- retval = FALSE;
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Cal_remove_object (priv->cal, (char *) uid, &ev);
-
- if (ev._major == CORBA_USER_EXCEPTION &&
- strcmp (CORBA_exception_id (&ev), ex_Evolution_Calendar_Cal_NotFound) == 0)
- goto out;
- else if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_client_remove_object(): could not remove the object");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- CORBA_exception_free (&ev);
- return retval;
-}
diff --git a/calendar/cal-client/cal-client.h b/calendar/cal-client/cal-client.h
deleted file mode 100644
index 24cc170350..0000000000
--- a/calendar/cal-client/cal-client.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/* Evolution calendar client
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 CAL_CLIENT_H
-#define CAL_CLIENT_H
-
-#include <libgnome/gnome-defs.h>
-#include <gtk/gtkobject.h>
-#include <cal-util/cal-recur.h>
-#include <cal-util/cal-util.h>
-
-BEGIN_GNOME_DECLS
-
-
-
-#define CAL_CLIENT_TYPE (cal_client_get_type ())
-#define CAL_CLIENT(obj) (GTK_CHECK_CAST ((obj), CAL_CLIENT_TYPE, CalClient))
-#define CAL_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_CLIENT_TYPE, CalClientClass))
-#define IS_CAL_CLIENT(obj) (GTK_CHECK_TYPE ((obj), CAL_CLIENT_TYPE))
-#define IS_CAL_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_CLIENT_TYPE))
-
-typedef struct _CalClient CalClient;
-typedef struct _CalClientClass CalClientClass;
-
-/* Load status for the cal_loaded signal */
-typedef enum {
- CAL_CLIENT_LOAD_SUCCESS,
- CAL_CLIENT_LOAD_ERROR,
- CAL_CLIENT_LOAD_IN_USE,
- CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED
-} CalClientLoadStatus;
-
-typedef enum {
- CAL_CLIENT_GET_SUCCESS,
- CAL_CLIENT_GET_NOT_FOUND,
- CAL_CLIENT_GET_SYNTAX_ERROR
-} CalClientGetStatus;
-
-
-struct _CalClient {
- GtkObject object;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _CalClientClass {
- GtkObjectClass parent_class;
-
- /* Notification signals */
-
- void (* cal_loaded) (CalClient *client, CalClientLoadStatus status);
-
- void (* obj_updated) (CalClient *client, const char *uid);
- void (* obj_removed) (CalClient *client, const char *uid);
-};
-
-GtkType cal_client_get_type (void);
-
-CalClient *cal_client_construct (CalClient *client);
-
-CalClient *cal_client_new (void);
-
-gboolean cal_client_load_calendar (CalClient *client, const char *str_uri);
-gboolean cal_client_create_calendar (CalClient *client, const char *str_uri);
-
-int cal_client_get_n_objects (CalClient *client, CalObjType type);
-
-CalClientGetStatus cal_client_get_object (CalClient *client,
- const char *uid,
- CalComponent **comp);
-
-CalClientGetStatus cal_client_get_uid_by_pilot_id (CalClient *client,
- unsigned long pilot_id,
- char **uid);
-
-void cal_client_update_pilot_id (CalClient *client, char *uid,
- unsigned long pilot_id,
- unsigned long pilot_status);
-
-GList *cal_client_get_uids (CalClient *client, CalObjType type);
-
-GList *cal_client_get_objects_in_range (CalClient *client, CalObjType type,
- time_t start, time_t end);
-
-void cal_client_generate_instances (CalClient *client, CalObjType type,
- time_t start, time_t end,
- CalRecurInstanceFn cb, gpointer cb_data);
-
-GList *cal_client_get_alarms_in_range (CalClient *client, time_t start, time_t end);
-
-gboolean cal_client_get_alarms_for_object (CalClient *client, const char *uid,
- time_t start, time_t end,
- GList **alarms);
-
-gboolean cal_client_update_object (CalClient *client, CalComponent *comp);
-
-gboolean cal_client_remove_object (CalClient *client, const char *uid);
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/cal-client/cal-listener.c b/calendar/cal-client/cal-listener.c
deleted file mode 100644
index d9a028b20d..0000000000
--- a/calendar/cal-client/cal-listener.c
+++ /dev/null
@@ -1,403 +0,0 @@
-/* Evolution calendar listener
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "cal-listener.h"
-
-
-
-/* Private part of the CalListener structure */
-typedef struct {
- /* The calendar this listener refers to */
- Evolution_Calendar_Cal cal;
-} CalListenerPrivate;
-
-
-
-/* Signal IDs */
-enum {
- CAL_LOADED,
- OBJ_UPDATED,
- OBJ_REMOVED,
- LAST_SIGNAL
-};
-
-static void cal_listener_class_init (CalListenerClass *class);
-static void cal_listener_init (CalListener *listener);
-static void cal_listener_destroy (GtkObject *object);
-
-static void marshal_cal_loaded (GtkObject *object, GtkSignalFunc func, gpointer data, GtkArg *args);
-
-static POA_Evolution_Calendar_Listener__vepv cal_listener_vepv;
-
-static guint cal_listener_signals[LAST_SIGNAL];
-
-static BonoboObjectClass *parent_class;
-
-
-
-/**
- * cal_listener_get_type:
- * @void:
- *
- * Registers the #CalListener class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #CalListener class.
- **/
-GtkType
-cal_listener_get_type (void)
-{
- static GtkType cal_listener_type = 0;
-
- if (!cal_listener_type) {
- static const GtkTypeInfo cal_listener_info = {
- "CalListener",
- sizeof (CalListener),
- sizeof (CalListenerClass),
- (GtkClassInitFunc) cal_listener_class_init,
- (GtkObjectInitFunc) cal_listener_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- cal_listener_type = gtk_type_unique (bonobo_object_get_type (), &cal_listener_info);
- }
-
- return cal_listener_type;
-}
-
-/* CORBA class initialization function for the calendar listener */
-static void
-init_cal_listener_corba_class (void)
-{
- cal_listener_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
- cal_listener_vepv.Evolution_Calendar_Listener_epv = cal_listener_get_epv ();
-}
-
-/* Class initialization function for the calendar listener */
-static void
-cal_listener_class_init (CalListenerClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- parent_class = gtk_type_class (bonobo_object_get_type ());
-
- cal_listener_signals[CAL_LOADED] =
- gtk_signal_new ("cal_loaded",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (CalListenerClass, cal_loaded),
- marshal_cal_loaded,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_ENUM,
- GTK_TYPE_POINTER);
- cal_listener_signals[OBJ_UPDATED] =
- gtk_signal_new ("obj_updated",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (CalListenerClass, obj_updated),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
- cal_listener_signals[OBJ_REMOVED] =
- gtk_signal_new ("obj_removed",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (CalListenerClass, obj_removed),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (object_class, cal_listener_signals, LAST_SIGNAL);
-
- object_class->destroy = cal_listener_destroy;
-
- init_cal_listener_corba_class ();
-}
-
-/* Object initialization function for the calendar listener */
-static void
-cal_listener_init (CalListener *listener)
-{
- CalListenerPrivate *priv;
-
- priv = g_new0 (CalListenerPrivate, 1);
- listener->priv = priv;
-
- priv->cal = CORBA_OBJECT_NIL;
-}
-
-/* Destroy handler for the calendar listener */
-static void
-cal_listener_destroy (GtkObject *object)
-{
- CalListener *listener;
- CalListenerPrivate *priv;
- CORBA_Environment ev;
- gboolean result;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CAL_LISTENER (object));
-
- listener = CAL_LISTENER (object);
- priv = listener->priv;
-
- CORBA_exception_init (&ev);
- result = CORBA_Object_is_nil (priv->cal, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("cal_listener_destroy(): could not see if the calendar was NIL");
- else if (!result) {
- CORBA_exception_free (&ev);
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (priv->cal, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("cal_listener_destroy(): could not release the calendar");
-
- priv->cal = CORBA_OBJECT_NIL;
- }
- CORBA_exception_free (&ev);
-
- g_free (priv);
- listener->priv = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-
-/* Marshalers */
-
-typedef void (* CalLoadedFunc) (GtkObject *object, gint status, gpointer cal, gpointer data);
-
-static void
-marshal_cal_loaded (GtkObject *object, GtkSignalFunc func, gpointer data, GtkArg *args)
-{
- CalLoadedFunc rfunc;
-
- rfunc = (CalLoadedFunc) func;
- (* rfunc) (object, GTK_VALUE_ENUM (args[0]), GTK_VALUE_POINTER (args[1]), data);
-}
-
-
-
-/* CORBA servant implementation */
-
-/* Listener::cal_loaded method */
-static void
-Listener_cal_loaded (PortableServer_Servant servant,
- Evolution_Calendar_Listener_LoadStatus status,
- Evolution_Calendar_Cal cal,
- CORBA_Environment *ev)
-{
- CalListener *listener;
- CalListenerPrivate *priv;
- CORBA_Environment aev;
- Evolution_Calendar_Cal cal_copy;
-
- listener = CAL_LISTENER (bonobo_object_from_servant (servant));
- priv = listener->priv;
-
- if (priv->cal != CORBA_OBJECT_NIL) {
- g_message ("Listener_cal_loaded(): calendar was already loaded!");
- return;
- }
-
- CORBA_exception_init (&aev);
- cal_copy = CORBA_Object_duplicate (cal, &aev);
-
- if (aev._major != CORBA_NO_EXCEPTION) {
- g_message ("Listener_cal_loaded(): could not duplicate the calendar");
- CORBA_exception_free (&aev);
- return;
- }
- CORBA_exception_free (&aev);
-
- priv->cal = cal_copy;
-
- gtk_signal_emit (GTK_OBJECT (listener), cal_listener_signals[CAL_LOADED],
- status, cal);
-}
-
-/* Listener::obj_updated method */
-static void
-Listener_obj_updated (PortableServer_Servant servant,
- Evolution_Calendar_CalObjUID uid,
- CORBA_Environment *ev)
-{
- CalListener *listener;
-
- listener = CAL_LISTENER (bonobo_object_from_servant (servant));
- gtk_signal_emit (GTK_OBJECT (listener), cal_listener_signals[OBJ_UPDATED],
- uid);
-}
-
-/* Listener::obj_removed method */
-static void
-Listener_obj_removed (PortableServer_Servant servant,
- Evolution_Calendar_CalObjUID uid,
- CORBA_Environment *ev)
-{
- CalListener *listener;
-
- listener = CAL_LISTENER (bonobo_object_from_servant (servant));
- gtk_signal_emit (GTK_OBJECT (listener), cal_listener_signals[OBJ_REMOVED],
- uid);
-}
-
-/**
- * cal_listener_get_epv:
- * @void:
- *
- * Creates an EPV for the Listener CORBA class.
- *
- * Return value: A newly-allocated EPV.
- **/
-POA_Evolution_Calendar_Listener__epv *
-cal_listener_get_epv (void)
-{
- POA_Evolution_Calendar_Listener__epv *epv;
-
- epv = g_new0 (POA_Evolution_Calendar_Listener__epv, 1);
- epv->cal_loaded = Listener_cal_loaded;
- epv->obj_updated = Listener_obj_updated;
- epv->obj_removed = Listener_obj_removed;
- return epv;
-}
-
-
-
-/**
- * cal_listener_construct:
- * @listener: A calendar listener.
- * @corba_listener: CORBA object for the calendar listener.
- *
- * Constructs a calendar listener by binding the corresponding CORBA object to
- * it.
- *
- * Return value: the same object as the @listener argument.
- **/
-CalListener *
-cal_listener_construct (CalListener *listener, Evolution_Calendar_Listener corba_listener)
-{
- g_return_val_if_fail (listener != NULL, NULL);
- g_return_val_if_fail (IS_CAL_LISTENER (listener), NULL);
-
- bonobo_object_construct (BONOBO_OBJECT (listener), corba_listener);
- return listener;
-}
-
-/**
- * cal_listener_corba_object_create:
- * @object: #BonoboObject that will wrap the CORBA object.
- *
- * Creates and activates the CORBA object that is wrapped by the specified
- * calendar listener @object.
- *
- * Return value: An activated object reference or #CORBA_OBJECT_NIL in case of
- * failure.
- **/
-Evolution_Calendar_Listener
-cal_listener_corba_object_create (BonoboObject *object)
-{
- POA_Evolution_Calendar_Listener *servant;
- CORBA_Environment ev;
-
- g_return_val_if_fail (object != NULL, CORBA_OBJECT_NIL);
- g_return_val_if_fail (IS_CAL_LISTENER (object), CORBA_OBJECT_NIL);
-
- servant = (POA_Evolution_Calendar_Listener *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &cal_listener_vepv;
-
- CORBA_exception_init (&ev);
- POA_Evolution_Calendar_Listener__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
- return CORBA_OBJECT_NIL;
- }
-
- CORBA_exception_free (&ev);
- return (Evolution_Calendar_Listener) bonobo_object_activate_servant (object, servant);
-}
-
-/**
- * cal_listener_new:
- * @void:
- *
- * Creates a new #CalListener object.
- *
- * Return value: A newly-created #CalListener, or NULL if its corresponding
- * CORBA object could not be created.
- **/
-CalListener *
-cal_listener_new (void)
-{
- CalListener *listener;
- CORBA_Environment ev;
- Evolution_Calendar_Listener corba_listener;
- gboolean result;
-
- listener = gtk_type_new (CAL_LISTENER_TYPE);
-
- corba_listener = cal_listener_corba_object_create (BONOBO_OBJECT (listener));
-
- CORBA_exception_init (&ev);
- result = CORBA_Object_is_nil (corba_listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION || result) {
- g_message ("cal_listener_new(): could not create the CORBA listener");
- bonobo_object_unref (BONOBO_OBJECT (listener));
- CORBA_exception_free (&ev);
- return NULL;
- }
- CORBA_exception_free (&ev);
-
- return cal_listener_construct (listener, corba_listener);
-}
-
-/**
- * cal_listener_get_calendar:
- * @listener: A calendar listener.
- *
- * Queries the calendar that a listener is watching.
- *
- * Return value: The calendar that the listener is watching.
- **/
-Evolution_Calendar_Cal
-cal_listener_get_calendar (CalListener *listener)
-{
- CalListenerPrivate *priv;
-
- g_return_val_if_fail (listener != NULL, CORBA_OBJECT_NIL);
- g_return_val_if_fail (IS_CAL_LISTENER (listener), CORBA_OBJECT_NIL);
-
- priv = listener->priv;
- return priv->cal;
-}
diff --git a/calendar/cal-client/cal-listener.h b/calendar/cal-client/cal-listener.h
deleted file mode 100644
index 171da0d5c3..0000000000
--- a/calendar/cal-client/cal-listener.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Evolution calendar listener
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 CAL_LISTENER_H
-#define CAL_LISTENER_H
-
-#include <libgnome/gnome-defs.h>
-#include <bonobo/bonobo-object.h>
-#include "evolution-calendar.h"
-
-BEGIN_GNOME_DECLS
-
-
-
-#define CAL_LISTENER_TYPE (cal_listener_get_type ())
-#define CAL_LISTENER(obj) (GTK_CHECK_CAST ((obj), CAL_LISTENER_TYPE, CalListener))
-#define CAL_LISTENER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_LISTENER_TYPE, \
- CalListenerClass))
-#define IS_CAL_LISTENER(obj) (GTK_CHECK_TYPE ((obj), CAL_LISTENER_TYPE))
-#define IS_CAL_LISTENER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_LISTENER_TYPE))
-
-typedef struct _CalListener CalListener;
-typedef struct _CalListenerClass CalListenerClass;
-
-struct _CalListener {
- BonoboObject object;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _CalListenerClass {
- BonoboObjectClass parent_class;
-
- /* Notification signals */
-
- void (* cal_loaded) (CalListener *listener,
- Evolution_Calendar_Listener_LoadStatus status,
- Evolution_Calendar_Cal cal);
- void (* obj_updated) (CalListener *listener, const Evolution_Calendar_CalObjUID uid);
- void (* obj_removed) (CalListener *listener, const Evolution_Calendar_CalObjUID uid);
-};
-
-GtkType cal_listener_get_type (void);
-
-CalListener *cal_listener_construct (CalListener *listener,
- Evolution_Calendar_Listener corba_listener);
-
-Evolution_Calendar_Listener cal_listener_corba_object_create (BonoboObject *object);
-
-CalListener *cal_listener_new (void);
-
-Evolution_Calendar_Cal cal_listener_get_calendar (CalListener *listener);
-
-POA_Evolution_Calendar_Listener__epv *cal_listener_get_epv (void);
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/cal-client/client-test.c b/calendar/cal-client/client-test.c
deleted file mode 100644
index 7f79b58266..0000000000
--- a/calendar/cal-client/client-test.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/* Evolution calendar client - test program
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <bonobo.h>
-#include <gnome.h>
-#include <cal-client/cal-client.h>
-
-static CalClient *client1;
-static CalClient *client2;
-
-/* Prints a message with a client identifier */
-static void
-cl_printf (CalClient *client, const char *format, ...)
-{
- va_list args;
-
- va_start (args, format);
- printf ("Client %s: ",
- client == client1 ? "1" :
- client == client2 ? "2" :
- "UNKNOWN");
- vprintf (format, args);
- va_end (args);
-}
-
-/* Dumps some interesting data from a component */
-static void
-dump_component (CalComponent *comp)
-{
- const char *uid;
- CalComponentText summary;
-
- cal_component_get_uid (comp, &uid);
-
- printf ("UID %s\n", uid);
-
- cal_component_get_summary (comp, &summary);
- if (summary.value)
- printf ("\tSummary: `%s', altrep `%s'\n",
- summary.value,
- summary.altrep ? summary.altrep : "NONE");
- else
- printf ("\tNo summary\n");
-}
-
-/* Lists the UIDs of objects in a calendar, called as an idle handler */
-static gboolean
-list_uids (gpointer data)
-{
- CalClient *client;
- GList *uids;
- GList *l;
-
- client = CAL_CLIENT (data);
-
- uids = cal_client_get_uids (client, CALOBJ_TYPE_ANY);
-
- cl_printf (client, "UIDs: ");
-
- if (!uids)
- printf ("none\n");
- else {
- for (l = uids; l; l = l->next) {
- char *uid;
-
- uid = l->data;
- printf ("`%s' ", uid);
- }
-
- printf ("\n");
-
- for (l = uids; l; l = l->next) {
- char *uid;
- CalComponent *comp;
- CalClientGetStatus status;
-
- uid = l->data;
- status = cal_client_get_object (client, uid, &comp);
-
- if (status == CAL_CLIENT_GET_SUCCESS) {
- printf ("------------------------------\n");
- dump_component (comp);
- printf ("------------------------------\n");
- gtk_object_unref (GTK_OBJECT (comp));
- } else {
- printf ("FAILED: %d\n", status);
- }
- }
- }
-
- cal_obj_uid_list_free (uids);
-
- gtk_object_unref (GTK_OBJECT (client));
-
- return FALSE;
-}
-
-/* Callback used when a calendar is loaded */
-static void
-cal_loaded (CalClient *client, CalClientLoadStatus status, gpointer data)
-{
- cl_printf (client, "Load/create %s\n",
- ((status == CAL_CLIENT_LOAD_SUCCESS) ? "success" :
- (status == CAL_CLIENT_LOAD_ERROR) ? "error" :
- (status == CAL_CLIENT_LOAD_IN_USE) ? "in use" :
- "unknown status value"));
-
- if (status == CAL_CLIENT_LOAD_SUCCESS)
- g_idle_add (list_uids, client);
- else
- gtk_object_unref (GTK_OBJECT (client));
-}
-
-/* Callback used when an object is updated */
-static void
-obj_updated (CalClient *client, const char *uid, gpointer data)
-{
- cl_printf (client, "Object updated: %s\n", uid);
-}
-
-/* Callback used when a client is destroyed */
-static void
-client_destroy_cb (GtkObject *object, gpointer data)
-{
- if (CAL_CLIENT (object) == client1)
- client1 = NULL;
- else if (CAL_CLIENT (object) == client2)
- client2 = NULL;
- else
- g_assert_not_reached ();
-
- if (!client1 && !client2)
- gtk_main_quit ();
-}
-
-/* Creates a calendar client and tries to load the specified URI into it */
-static void
-create_client (CalClient **client, const char *uri, gboolean load)
-{
- gboolean result;
-
- *client = cal_client_new ();
- if (!*client) {
- g_message ("create_client(): could not create the client");
- exit (1);
- }
-
- gtk_signal_connect (GTK_OBJECT (*client), "destroy",
- client_destroy_cb,
- NULL);
-
- gtk_signal_connect (GTK_OBJECT (*client), "cal_loaded",
- GTK_SIGNAL_FUNC (cal_loaded),
- NULL);
- gtk_signal_connect (GTK_OBJECT (*client), "obj_updated",
- GTK_SIGNAL_FUNC (obj_updated),
- NULL);
-
- printf ("Calendar loading `%s'...\n", uri);
-
- if (load)
- result = cal_client_load_calendar (*client, uri);
- else
- result = cal_client_create_calendar (*client, uri);
-
- if (!result) {
- g_message ("create_client(): failure when issuing calendar %s request `%s'",
- load ? "load" : "create",
- uri);
- exit (1);
- }
-}
-
-#ifdef USING_OAF
-
-#include <liboaf/liboaf.h>
-
-static void
-init_corba (int *argc, char **argv)
-{
- gnome_init ("tl-test", VERSION, *argc, argv);
- oaf_init (*argc, argv);
-}
-
-#else
-
-#include <libgnorba/gnorba.h>
-
-static void
-init_corba (int *argc, char **argv)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- gnome_CORBA_init ("tl-test", VERSION, &argc, argv, 0, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("main(): could not initialize the ORB");
- CORBA_exception_free (&ev);
- exit (1);
- }
- CORBA_exception_free (&ev);
-}
-
-#endif
-
-int
-main (int argc, char **argv)
-{
- bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);
-
- init_corba (&argc, argv);
-
- if (!bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL)) {
- g_message ("main(): could not initialize Bonobo");
- exit (1);
- }
-
- create_client (&client1, "/cvs/evolution/calendar/cal-client/test.ics", TRUE);
- create_client (&client2, "/cvs/evolution/calendar/cal-client/test.ics", FALSE);
-
- bonobo_main ();
- return 0;
-}
diff --git a/calendar/cal-client/test.ics b/calendar/cal-client/test.ics
deleted file mode 100644
index 128251ee11..0000000000
--- a/calendar/cal-client/test.ics
+++ /dev/null
@@ -1,318 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//hacksw/handcal//NONSGML v1.0//EN
-
-BEGIN:VEVENT
-DTSTART:19970714T170000Z
-DTEND:19970715T035959Z
-SUMMARY:Bastille Day Party
-END:VEVENT
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123401@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970903T163000Z
-DTEND:19970903T190000Z
-SUMMARY:Annual Employee Review
-CLASS:PRIVATE
-CATEGORIES:BUSINESS,HUMAN RESOURCES
-END:VEVENT
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123402@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970401T163000Z
-DTEND:19970402T010000Z
-SUMMARY:Laurel is in sensitivity awareness class.
-CLASS:PUBLIC
-CATEGORIES:BUSINESS,HUMAN RESOURCES
-TRANSP:TRANSPARENT
-END:VEVENT
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123403@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19971102
-SUMMARY:Our Blissful Anniversary
-CLASS:CONFIDENTIAL
-CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
-RRULE:FREQ=YEARLY
-END:VEVENT
-
-BEGIN:VTODO
-UID:19970901T130000Z-123404@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970415T133000Z
-DUE:19970416T045959Z
-SUMMARY:1996 Income Tax Preparation
-CLASS:CONFIDENTIAL
-CATEGORIES:FAMILY,FINANCE
-PRIORITY:1
-STATUS:NEEDS-ACTION
-END:VTODO
-
-BEGIN:VJOURNAL
-UID:19970901T130000Z-123405@host.com
-DTSTAMP:19970901T1300Z
-DTSTART;VALUE=DATE:19970317
-SUMMARY:Staff meeting minutes
-DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa
- and Bob. Aurora project plans were reviewed. There is currently
- no budget reserves for this project. Lisa will escalate to
- management. Next meeting on Tuesday.\n
- 2. Telephone Conference: ABC Corp. sales representative called
- to discuss new printer. Promised to get us a demo by Friday.\n
- 3. Henry Miller (Handsoff Insurance): Car was totaled by tree.
- Is looking into a loaner car. 654-2323 (tel).
-END:VJOURNAL
-
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jane_doe@host1.com
-ATTENDEE:MAILTO:john_public@host2.com
-DTSTART:19971015T050000Z
-DTEND:19971016T050000Z
-DTSTAMP:19970901T083000Z
-END:VFREEBUSY
-
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jane_doe@host1.com
-ATTENDEE:MAILTO:john_public@host2.com
-DTSTAMP:19970901T100000Z
-FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
- 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
-URL:http://host2.com/pub/busy/jpublic-01.ifb
-COMMENT:This iCalendar file contains busy time information for
- the next three months.
-END:VFREEBUSY
-
-BEGIN:VFREEBUSY
-ORGANIZER:jsmith@host.com
-DTSTART:19980313T141711Z
-DTEND:19980410T141711Z
-FREEBUSY:19980314T233000Z/19980315T003000Z
-FREEBUSY:19980316T153000Z/19980316T163000Z
-FREEBUSY:19980318T030000Z/19980318T040000Z
-URL:http://www.host.com/calendar/busytime/jsmith.ifb
-END:VFREEBUSY
-
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19971026T020000
-RDATE:19971026T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19971026T020000
-RDATE:19970406T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-LAST-MODIFIED:19870101T000000Z
-TZURL:http://zones.stds_r_us.net/tz/US-Eastern
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-
-BEGIN:VTIMEZONE
-TZID:US--Fictitious-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-
-BEGIN:VTIMEZONE
-TZID:US--Fictitious-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19990424T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-
-BEGIN:VALARM
-TRIGGER;VALUE=DATE-TIME:19970317T133000Z
-REPEAT:4
-DURATION:PT15M
-ACTION:AUDIO
-ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud
-END:VALARM
-BEGIN:VALARM
-TRIGGER:-PT30M
-REPEAT:2
-DURATION:PT15M
-ACTION:DISPLAY
-DESCRIPTION:Breakfast meeting with executive\n
- team at 8:30 AM EST.
-END:VALARM
-
-BEGIN:VALARM
-TRIGGER:-P2D
-ACTION:EMAIL
-ATTENDEE:MAILTO:john_doe@host.com
-SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
-DESCRIPTION:A draft agenda needs to be sent out to the attendees
- to the weekly managers meeting (MGR-LIST). Attached is a
- pointer the document template for the agenda file.
-ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen
- da.doc
-END:VALARM
-
-BEGIN:VALARM
-TRIGGER;VALUE=DATE-TIME:19980101T050000Z
-REPEAT:23
-DURATION:PT1H
-ACTION:PROCEDURE
-ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-
- procs/felizano.exe
-END:VALARM
-
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-BEGIN:STANDARD
-DTSTART:19981025T020000
-RDATE:19981025T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19990404T020000
-RDATE:19990404T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-
-BEGIN:VEVENT
-DTSTAMP:19980309T231000Z
-UID:guid-1.host1.com
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
- MAILTO:employee-A@host.com
-DESCRIPTION:Project XYZ Review Meeting
-CATEGORIES:MEETING
-CLASS:PUBLIC
-CREATED:19980309T130000Z
-SUMMARY:XYZ Project Review
-DTSTART;TZID=US-Eastern:19980312T083000
-DTEND;TZID=US-Eastern:19980312T093000
-LOCATION:1CP Conference Room 4350
-END:VEVENT
-
-BEGIN:VEVENT
-DTSTAMP:19970324T1200Z
-SEQUENCE:0
-UID:uid3@host1.com
-ORGANIZER:MAILTO:jdoe@host1.com
-DTSTART:19970324T123000Z
-DTEND:19970324T210000Z
-CATEGORIES:MEETING,PROJECT
-CLASS:PUBLIC
-SUMMARY:Calendaring Interoperability Planning Meeting
-DESCRIPTION:Discuss how we can test c&s interoperability\n
- using iCalendar and other IETF standards.
-LOCATION:LDB Lobby
-ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/
- conf/bkgrnd.ps
-END:VEVENT
-
-BEGIN:VTODO
-DTSTAMP:19980130T134500Z
-SEQUENCE:2
-UID:uid4@host1.com
-ORGANIZER:MAILTO:unclesam@us.gov
-ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
-DUE:19980415T235959
-STATUS:NEEDS-ACTION
-SUMMARY:Submit Income Taxes
-BEGIN:VALARM
-ACTION:AUDIO
-TRIGGER:19980403T120000
-ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-
- files/ssbanner.aud
-REPEAT:4
-DURATION:PT1H
-END:VALARM
-END:VTODO
-
-BEGIN:VJOURNAL
-DTSTAMP:19970324T120000Z
-UID:uid5@host1.com
-ORGANIZER:MAILTO:jsmith@host.com
-STATUS:DRAFT
-CLASS:PUBLIC
-CATEGORIES:Project Report, XYZ, Weekly Meeting
-DESCRIPTION:Project xyz Review Meeting Minutes\n
- Agenda\n1. Review of project version 1.0 requirements.\n2.
- Definition
- of project processes.\n3. Review of project schedule.\n
- Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was
- decided that the requirements need to be signed off by
- product marketing.\n-Project processes were accepted.\n
- -Project schedule needs to account for scheduled holidays
- and employee vacation time. Check with HR for specific
- dates.\n-New schedule will be distributed by Friday.\n-
- Next weeks meeting is cancelled. No meeting until 3/23.
-END:VJOURNAL
-
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jsmith@host.com
-DTSTART:19980313T141711Z
-DTEND:19980410T141711Z
-FREEBUSY:19980314T233000Z/19980315T003000Z
-FREEBUSY:19980316T153000Z/19980316T163000Z
-FREEBUSY:19980318T030000Z/19980318T040000Z
-URL:http://www.host.com/calendar/busytime/jsmith.ifb
-END:VFREEBUSY
-END:VCALENDAR
diff --git a/calendar/cal-util/.cvsignore b/calendar/cal-util/.cvsignore
deleted file mode 100644
index edf21e8e74..0000000000
--- a/calendar/cal-util/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.libs
-Makefile.in
-Makefile
-.deps
-*.lo
-*.la
-test-recur
-icalendar-test
diff --git a/calendar/cal-util/Makefile.am b/calendar/cal-util/Makefile.am
deleted file mode 100644
index 2c95bcaec5..0000000000
--- a/calendar/cal-util/Makefile.am
+++ /dev/null
@@ -1,73 +0,0 @@
-noinst_PROGRAMS = icalendar-test
-#noinst_PROGRAMS = test-recur icalendar-test
-
-INCLUDES = \
- -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
- -DG_LOG_DOMAIN=\"cal-util\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/calendar \
- -I. \
- -I.. \
- -I$(top_builddir) \
- -I$(top_srcdir)/libical/src/libical \
- -I$(top_builddir)/libical/src/libical \
- $(GNOME_INCLUDEDIR)
-
-#
-# cal util library
-#
-
-lib_LTLIBRARIES = libcal-util.la
-
-libcal_util_la_SOURCES = \
- cal-component.c \
- cal-recur.c \
- cal-util.c \
- calobj.c \
- icalendar.c \
- icalendar.h \
- icalendar-save.c \
- icalendar-save.h \
- timeutil.c
-
-libcal_utilincludedir = $(includedir)/evolution/cal-util
-
-libcal_utilinclude_HEADERS = \
- cal-component.h \
- cal-recur.h \
- cal-util.h \
- calobj.h \
- timeutil.h
-
-#
-# static library for use in conduits' shared libraries
-#
-noinst_LTLIBRARIES = libcal-util-static.la
-libcal_util_static_la_SOURCES = $(libcal_util_la_SOURCES)
-libcal_util_static_la_LDFLAGS = --all-static
-
-
-#
-# test program
-#
-
-icalendar_test_SOURCES = \
- icalendar-test.c \
- icalendar.c \
- icalendar-save.c
-
-icalendar_test_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/libical/src/libical/libical.a
-
-# $(top_builddir)/calendar/cal-util/libcal-util.la \
-
-#test_recur_SOURCES = \
-# test-recur.c
-#
-#test_recur_LDADD = \
-# libcal-util.la \
-# $(top_builddir)/libversit/libversit.la \
-# $(top_builddir)/libical/src/libical/libical.a \
-# $(EXTRA_GNOME_LIBS)
diff --git a/calendar/cal-util/cal-component.c b/calendar/cal-util/cal-component.c
deleted file mode 100644
index 7db5e348e4..0000000000
--- a/calendar/cal-util/cal-component.c
+++ /dev/null
@@ -1,3480 +0,0 @@
-/* Evolution calendar - iCalendar component object
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "cal-component.h"
-#include "timeutil.h"
-
-
-
-/* Private part of the CalComponent structure */
-struct _CalComponentPrivate {
- /* The icalcomponent we wrap */
- icalcomponent *icalcomp;
-
- /* Properties */
-
- icalproperty *uid;
-
- struct categories {
- icalproperty *prop;
- };
- GSList *categories_list; /* list of struct categories */
-
- icalproperty *classification;
-
- struct text {
- icalproperty *prop;
- icalparameter *altrep_param;
- };
-
- GSList *comment_list; /* list of struct text */
-
- icalproperty *completed;
- icalproperty *created;
-
- GSList *description_list; /* list of struct text */
-
- struct datetime {
- icalproperty *prop;
- icalparameter *tzid_param;
- };
-
- struct datetime dtstart;
- struct datetime dtend;
-
- icalproperty *dtstamp;
-
- struct datetime due;
-
- GSList *exdate_list; /* list of icalproperty objects */
- GSList *exrule_list; /* list of icalproperty objects */
-
- icalproperty *geo;
- icalproperty *last_modified;
- icalproperty *percent;
- icalproperty *priority;
-
- struct period {
- icalproperty *prop;
- icalparameter *value_param;
- };
-
- GSList *rdate_list; /* list of struct period */
-
- GSList *rrule_list; /* list of icalproperty objects */
-
- icalproperty *sequence;
-
- struct {
- icalproperty *prop;
- icalparameter *altrep_param;
- } summary;
-
- icalproperty *transparency;
- icalproperty *url;
-
- /* Whether we should increment the sequence number when piping the
- * object over the wire.
- */
- guint need_sequence_inc : 1;
-};
-
-/* Private structure for alarms */
-struct _CalComponentAlarm {
- /* Our parent component */
- CalComponent *parent;
-
- /* Alarm icalcomponent we wrap */
- icalcomponent *icalcomp;
-
- /* Properties */
-
- icalproperty *action;
- icalproperty *trigger;
-};
-
-
-
-static void cal_component_class_init (CalComponentClass *class);
-static void cal_component_init (CalComponent *comp);
-static void cal_component_destroy (GtkObject *object);
-
-static GtkObjectClass *parent_class;
-
-
-
-/**
- * cal_component_get_type:
- *
- * Registers the #CalComponent class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #CalComponent class.
- **/
-GtkType
-cal_component_get_type (void)
-{
- static GtkType cal_component_type = 0;
-
- if (!cal_component_type) {
- static const GtkTypeInfo cal_component_info = {
- "CalComponent",
- sizeof (CalComponent),
- sizeof (CalComponentClass),
- (GtkClassInitFunc) cal_component_class_init,
- (GtkObjectInitFunc) cal_component_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- cal_component_type = gtk_type_unique (GTK_TYPE_OBJECT, &cal_component_info);
- }
-
- return cal_component_type;
-}
-
-/* Class initialization function for the calendar component object */
-static void
-cal_component_class_init (CalComponentClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- parent_class = gtk_type_class (GTK_TYPE_OBJECT);
-
- object_class->destroy = cal_component_destroy;
-}
-
-/* Object initialization function for the calendar component object */
-static void
-cal_component_init (CalComponent *comp)
-{
- CalComponentPrivate *priv;
-
- priv = g_new0 (CalComponentPrivate, 1);
- comp->priv = priv;
-}
-
-/* Does a simple g_free() of the elements of a GSList and then frees the list
- * itself. Returns NULL.
- */
-static GSList *
-free_slist (GSList *slist)
-{
- GSList *l;
-
- for (l = slist; l; l = l->next)
- g_free (l->data);
-
- g_slist_free (slist);
- return NULL;
-}
-
-/* Frees the internal icalcomponent only if it does not have a parent. If it
- * does, it means we don't own it and we shouldn't free it.
- */
-static void
-free_icalcomponent (CalComponent *comp)
-{
- CalComponentPrivate *priv;
-
- priv = comp->priv;
-
- if (!priv->icalcomp)
- return;
-
- /* Free the icalcomponent */
-
- if (icalcomponent_get_parent (priv->icalcomp) != NULL)
- icalcomponent_free (priv->icalcomp);
-
- priv->icalcomp = NULL;
-
- /* Free the mappings */
-
- priv->uid = NULL;
-
- priv->categories_list = free_slist (priv->categories_list);
-
- priv->classification = NULL;
- priv->comment_list = NULL;
- priv->completed = NULL;
- priv->created = NULL;
-
- priv->description_list = free_slist (priv->description_list);
-
- priv->dtend.prop = NULL;
- priv->dtend.tzid_param = NULL;
-
- priv->dtstamp = NULL;
-
- priv->dtstart.prop = NULL;
- priv->dtstart.tzid_param = NULL;
-
- priv->due.prop = NULL;
- priv->due.tzid_param = NULL;
-
- g_slist_free (priv->exdate_list);
- priv->exdate_list = NULL;
-
- g_slist_free (priv->exrule_list);
- priv->exrule_list = NULL;
-
- priv->geo = NULL;
- priv->last_modified = NULL;
- priv->percent = NULL;
- priv->priority = NULL;
-
- priv->rdate_list = free_slist (priv->rdate_list);
-
- g_slist_free (priv->rrule_list);
- priv->rrule_list = NULL;
-
- priv->sequence = NULL;
-
- priv->summary.prop = NULL;
- priv->summary.altrep_param = NULL;
-
- priv->transparency = NULL;
- priv->url = NULL;
-
- /* Clean up */
-
- priv->need_sequence_inc = FALSE;
-}
-
-/* Destroy handler for the calendar component object */
-static void
-cal_component_destroy (GtkObject *object)
-{
- CalComponent *comp;
- CalComponentPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (object));
-
- comp = CAL_COMPONENT (object);
- priv = comp->priv;
-
- free_icalcomponent (comp);
-
- g_free (priv);
- comp->priv = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-
-/**
- * cal_component_gen_uid:
- *
- * Generates a unique identifier suitable for calendar components.
- *
- * Return value: A unique identifier string. Every time this function is called
- * a different string is returned.
- **/
-char *
-cal_component_gen_uid (void)
-{
- static char *hostname;
- time_t t = time (NULL);
- 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 (
- "%s-%d-%d-%d-%d@%s",
- isodate_from_time_t (t),
- getpid (),
- getgid (),
- getppid (),
- serial++,
- hostname);
-}
-
-/**
- * cal_component_new:
- *
- * Creates a new empty calendar component object. You should set it from an
- * #icalcomponent structure by using cal_component_set_icalcomponent() or with a
- * new empty component type by using cal_component_set_new_vtype().
- *
- * Return value: A newly-created calendar component object.
- **/
-CalComponent *
-cal_component_new (void)
-{
- return CAL_COMPONENT (gtk_type_new (CAL_COMPONENT_TYPE));
-}
-
-/**
- * cal_component_clone:
- * @comp: A calendar component object.
- *
- * Creates a new calendar component object by copying the information from
- * another one.
- *
- * Return value: A newly-created calendar component with the same values as the
- * original one.
- **/
-CalComponent *
-cal_component_clone (CalComponent *comp)
-{
- CalComponentPrivate *priv;
- CalComponent *new_comp;
- icalcomponent *new_icalcomp;
-
- g_return_val_if_fail (comp != NULL, NULL);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), NULL);
-
- priv = comp->priv;
- g_return_val_if_fail (priv->need_sequence_inc == FALSE, NULL);
-
- new_comp = cal_component_new ();
-
- if (priv->icalcomp) {
- new_icalcomp = icalcomponent_new_clone (priv->icalcomp);
- cal_component_set_icalcomponent (new_comp, new_icalcomp);
- }
-
- return new_comp;
-}
-
-/* Scans the categories property */
-static void
-scan_categories (CalComponent *comp, icalproperty *prop)
-{
- CalComponentPrivate *priv;
- struct categories *categ;
-
- priv = comp->priv;
-
- categ = g_new (struct categories, 1);
- categ->prop = prop;
-
- priv->categories_list = g_slist_append (priv->categories_list, categ);
-}
-
-/* Scans a date/time and timezone pair property */
-static void
-scan_datetime (CalComponent *comp, struct datetime *datetime, icalproperty *prop)
-{
- CalComponentPrivate *priv;
-
- priv = comp->priv;
-
- datetime->prop = prop;
- datetime->tzid_param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER);
-}
-
-/* Scans an exception date property */
-static void
-scan_exdate (CalComponent *comp, icalproperty *prop)
-{
- CalComponentPrivate *priv;
-
- priv = comp->priv;
- priv->exdate_list = g_slist_append (priv->exdate_list, prop);
-}
-
-/* Scans an icalperiodtype property */
-static void
-scan_period (CalComponent *comp, GSList **list, icalproperty *prop)
-{
- struct period *period;
-
- period = g_new (struct period, 1);
- period->prop = prop;
- period->value_param = icalproperty_get_first_parameter (prop, ICAL_VALUE_PARAMETER);
-
- *list = g_slist_append (*list, period);
-}
-
-/* Scans an icalrecurtype property */
-static void
-scan_recur (CalComponent *comp, GSList **list, icalproperty *prop)
-{
- *list = g_slist_append (*list, prop);
-}
-
-/* Scans the summary property */
-static void
-scan_summary (CalComponent *comp, icalproperty *prop)
-{
- CalComponentPrivate *priv;
-
- priv = comp->priv;
-
- priv->summary.prop = prop;
- priv->summary.altrep_param = icalproperty_get_first_parameter (prop, ICAL_ALTREP_PARAMETER);
-}
-
-/* Scans a text (i.e. text + altrep) property */
-static void
-scan_text (CalComponent *comp, GSList **text_list, icalproperty *prop)
-{
- struct text *text;
-
- text = g_new (struct text, 1);
- text->prop = prop;
- text->altrep_param = icalproperty_get_first_parameter (prop, ICAL_ALTREP_PARAMETER);
-
- *text_list = g_slist_append (*text_list, text);
-}
-
-/* Scans an icalproperty and adds its mapping to the component */
-static void
-scan_property (CalComponent *comp, icalproperty *prop)
-{
- CalComponentPrivate *priv;
- icalproperty_kind kind;
-
- priv = comp->priv;
-
- kind = icalproperty_isa (prop);
-
- switch (kind) {
- case ICAL_CATEGORIES_PROPERTY:
- scan_categories (comp, prop);
- break;
-
- case ICAL_CLASS_PROPERTY:
- priv->classification = prop;
- break;
-
- case ICAL_COMMENT_PROPERTY:
- scan_text (comp, &priv->comment_list, prop);
- break;
-
- case ICAL_COMPLETED_PROPERTY:
- priv->completed = prop;
- break;
-
- case ICAL_CREATED_PROPERTY:
- priv->created = prop;
- break;
-
- case ICAL_DESCRIPTION_PROPERTY:
- scan_text (comp, &priv->description_list, prop);
- break;
-
- case ICAL_DTEND_PROPERTY:
- scan_datetime (comp, &priv->dtend, prop);
- break;
-
- case ICAL_DTSTAMP_PROPERTY:
- priv->dtstamp = prop;
- break;
-
- case ICAL_DTSTART_PROPERTY:
- scan_datetime (comp, &priv->dtstart, prop);
- break;
-
- case ICAL_DUE_PROPERTY:
- scan_datetime (comp, &priv->due, prop);
- break;
-
- case ICAL_EXDATE_PROPERTY:
- scan_exdate (comp, prop);
- break;
-
- case ICAL_EXRULE_PROPERTY:
- scan_recur (comp, &priv->exrule_list, prop);
- break;
-
- case ICAL_GEO_PROPERTY:
- priv->geo = prop;
- break;
-
- case ICAL_LASTMODIFIED_PROPERTY:
- priv->last_modified = prop;
- break;
-
- case ICAL_PERCENTCOMPLETE_PROPERTY:
- priv->percent = prop;
- break;
-
- case ICAL_PRIORITY_PROPERTY:
- priv->priority = prop;
- break;
-
- case ICAL_RDATE_PROPERTY:
- scan_period (comp, &priv->rdate_list, prop);
- break;
-
- case ICAL_RRULE_PROPERTY:
- scan_recur (comp, &priv->rrule_list, prop);
- break;
-
- case ICAL_SEQUENCE_PROPERTY:
- priv->sequence = prop;
- break;
-
- case ICAL_SUMMARY_PROPERTY:
- scan_summary (comp, prop);
- break;
-
- case ICAL_TRANSP_PROPERTY:
- priv->transparency = prop;
- break;
-
- case ICAL_UID_PROPERTY:
- priv->uid = prop;
- break;
-
- case ICAL_URL_PROPERTY:
- priv->url = prop;
- break;
-
- default:
- break;
- }
-}
-
-/* Scans an icalcomponent for its properties so that we can provide
- * random-access to them.
- */
-static void
-scan_icalcomponent (CalComponent *comp)
-{
- CalComponentPrivate *priv;
- icalproperty *prop;
-
- priv = comp->priv;
-
- g_assert (priv->icalcomp != NULL);
-
- for (prop = icalcomponent_get_first_property (priv->icalcomp, ICAL_ANY_PROPERTY);
- prop;
- prop = icalcomponent_get_next_property (priv->icalcomp, ICAL_ANY_PROPERTY))
- scan_property (comp, prop);
-
- /* We don't scan for alarm subcomponents since they can be iterated
- * through using cal_component_get_{first,next}_alarm().
- */
-}
-
-/* Ensures that the mandatory calendar component properties (uid, dtstamp) do
- * exist. If they don't exist, it creates them automatically.
- */
-static void
-ensure_mandatory_properties (CalComponent *comp)
-{
- CalComponentPrivate *priv;
-
- priv = comp->priv;
- g_assert (priv->icalcomp != NULL);
-
- if (!priv->uid) {
- char *uid;
-
- uid = cal_component_gen_uid ();
- priv->uid = icalproperty_new_uid (uid);
- g_free (uid);
-
- icalcomponent_add_property (priv->icalcomp, priv->uid);
- }
-
- if (!priv->dtstamp) {
- time_t tim;
- struct icaltimetype t;
-
- tim = time (NULL);
- t = icaltimetype_from_timet (tim, FALSE);
-
- priv->dtstamp = icalproperty_new_dtstamp (t);
- icalcomponent_add_property (priv->icalcomp, priv->dtstamp);
- }
-}
-
-/**
- * cal_component_set_new_vtype:
- * @comp: A calendar component object.
- * @type: Type of calendar component to create.
- *
- * Clears any existing component data from a calendar component object and
- * creates a new #icalcomponent of the specified type for it. The only property
- * that will be set in the new component will be its unique identifier.
- **/
-void
-cal_component_set_new_vtype (CalComponent *comp, CalComponentVType type)
-{
- CalComponentPrivate *priv;
- icalcomponent *icalcomp;
- icalcomponent_kind kind;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
-
- free_icalcomponent (comp);
-
- if (type == CAL_COMPONENT_NO_TYPE)
- return;
-
- /* Figure out the kind and create the icalcomponent */
-
- switch (type) {
- case CAL_COMPONENT_EVENT:
- kind = ICAL_VEVENT_COMPONENT;
- break;
-
- case CAL_COMPONENT_TODO:
- kind = ICAL_VTODO_COMPONENT;
- break;
-
- case CAL_COMPONENT_JOURNAL:
- kind = ICAL_VJOURNAL_COMPONENT;
- break;
-
- case CAL_COMPONENT_FREEBUSY:
- kind = ICAL_VFREEBUSY_COMPONENT;
- break;
-
- case CAL_COMPONENT_TIMEZONE:
- kind = ICAL_VTIMEZONE_COMPONENT;
- break;
-
- default:
- g_assert_not_reached ();
- kind = ICAL_NO_COMPONENT;
- }
-
- icalcomp = icalcomponent_new (kind);
- if (!icalcomp) {
- g_message ("cal_component_set_new_vtype(): Could not create the icalcomponent!");
- return;
- }
-
- /* Scan the component to build our mapping table */
-
- priv->icalcomp = icalcomp;
- scan_icalcomponent (comp);
-
- /* Add missing stuff */
-
- ensure_mandatory_properties (comp);
-}
-
-/**
- * cal_component_set_icalcomponent:
- * @comp: A calendar component object.
- * @icalcomp: An #icalcomponent.
- *
- * Sets the contents of a calendar component object from an #icalcomponent
- * structure. If the @comp already had an #icalcomponent set into it, it will
- * will be freed automatically if the #icalcomponent does not have a parent
- * component itself.
- *
- * Supported component types are VEVENT, VTODO, VJOURNAL, VFREEBUSY, and VTIMEZONE.
- *
- * Return value: TRUE on success, FALSE if @icalcomp is an unsupported component
- * type.
- **/
-gboolean
-cal_component_set_icalcomponent (CalComponent *comp, icalcomponent *icalcomp)
-{
- CalComponentPrivate *priv;
- icalcomponent_kind kind;
-
- g_return_val_if_fail (comp != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), FALSE);
-
- priv = comp->priv;
-
- if (priv->icalcomp == icalcomp)
- return TRUE;
-
- free_icalcomponent (comp);
-
- if (!icalcomp) {
- priv->icalcomp = NULL;
- return TRUE;
- }
-
- kind = icalcomponent_isa (icalcomp);
-
- if (!(kind == ICAL_VEVENT_COMPONENT
- || kind == ICAL_VTODO_COMPONENT
- || kind == ICAL_VJOURNAL_COMPONENT
- || kind == ICAL_VFREEBUSY_COMPONENT
- || kind == ICAL_VTIMEZONE_COMPONENT))
- return FALSE;
-
- priv->icalcomp = icalcomp;
-
- scan_icalcomponent (comp);
- ensure_mandatory_properties (comp);
-
- return TRUE;
-}
-
-/**
- * cal_component_get_icalcomponent:
- * @comp: A calendar component object.
- *
- * Queries the #icalcomponent structure that a calendar component object is
- * wrapping.
- *
- * Return value: An #icalcomponent structure, or NULL if the @comp has no
- * #icalcomponent set to it.
- **/
-icalcomponent *
-cal_component_get_icalcomponent (CalComponent *comp)
-{
- CalComponentPrivate *priv;
-
- g_return_val_if_fail (comp != NULL, NULL);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), NULL);
-
- priv = comp->priv;
- g_return_val_if_fail (priv->need_sequence_inc == FALSE, NULL);
-
- return priv->icalcomp;
-}
-
-/**
- * cal_component_get_vtype:
- * @comp: A calendar component object.
- *
- * Queries the type of a calendar component object.
- *
- * Return value: The type of the component, as defined by RFC 2445.
- **/
-CalComponentVType
-cal_component_get_vtype (CalComponent *comp)
-{
- CalComponentPrivate *priv;
- icalcomponent_kind kind;
-
- g_return_val_if_fail (comp != NULL, CAL_COMPONENT_NO_TYPE);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), CAL_COMPONENT_NO_TYPE);
-
- priv = comp->priv;
- g_return_val_if_fail (priv->icalcomp != NULL, CAL_COMPONENT_NO_TYPE);
-
- kind = icalcomponent_isa (priv->icalcomp);
- switch (kind) {
- case ICAL_VEVENT_COMPONENT:
- return CAL_COMPONENT_EVENT;
-
- case ICAL_VTODO_COMPONENT:
- return CAL_COMPONENT_TODO;
-
- case ICAL_VJOURNAL_COMPONENT:
- return CAL_COMPONENT_JOURNAL;
-
- case ICAL_VFREEBUSY_COMPONENT:
- return CAL_COMPONENT_FREEBUSY;
-
- case ICAL_VTIMEZONE_COMPONENT:
- return CAL_COMPONENT_TIMEZONE;
-
- default:
- /* We should have been loaded with a supported type! */
- g_assert_not_reached ();
- return CAL_COMPONENT_NO_TYPE;
- }
-}
-
-/**
- * cal_component_get_as_string:
- * @comp: A calendar component.
- *
- * Gets the iCalendar string representation of a calendar component. You should
- * call cal_component_commit_sequence() before this function to ensure that the
- * component's sequence number is consistent with the state of the object.
- *
- * Return value: String representation of the calendar component according to
- * RFC 2445.
- **/
-char *
-cal_component_get_as_string (CalComponent *comp)
-{
- CalComponentPrivate *priv;
- char *str, *buf;
-
- g_return_val_if_fail (comp != NULL, NULL);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), NULL);
-
- priv = comp->priv;
- g_return_val_if_fail (priv->icalcomp != NULL, NULL);
-
- /* Ensure that the user has committed the new SEQUENCE */
- g_return_val_if_fail (priv->need_sequence_inc == FALSE, NULL);
-
- /* We dup the string; libical owns that memory */
-
- str = icalcomponent_as_ical_string (priv->icalcomp);
-
- if (str)
- buf = g_strdup (str);
- else
- buf = NULL;
-
- return buf;
-}
-
-/**
- * cal_component_commit_sequence:
- * @comp:
- *
- * Increments the sequence number property in a calendar component object if it
- * needs it. This needs to be done when any of a number of properties listed in
- * RFC 2445 change values, such as the start and end dates of a component.
- *
- * This function must be called before calling cal_component_get_as_string() to
- * ensure that the component is fully consistent.
- **/
-void
-cal_component_commit_sequence (CalComponent *comp)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (!priv->need_sequence_inc)
- return;
-
- if (priv->sequence) {
- int seq;
-
- seq = icalproperty_get_sequence (priv->sequence);
- icalproperty_set_sequence (priv->sequence, seq + 1);
- } else {
- /* The component had no SEQUENCE property, so assume that the
- * default would have been zero. Since it needed incrementing
- * anyways, we use a value of 1 here.
- */
- priv->sequence = icalproperty_new_sequence (1);
- icalcomponent_add_property (priv->icalcomp, priv->sequence);
- }
-
- priv->need_sequence_inc = FALSE;
-}
-
-/**
- * cal_component_get_uid:
- * @comp: A calendar component object.
- * @uid: Return value for the UID string.
- *
- * Queries the unique identifier of a calendar component object.
- **/
-void
-cal_component_get_uid (CalComponent *comp, const char **uid)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (uid != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- /* This MUST exist, since we ensured that it did */
- g_assert (priv->uid != NULL);
-
- *uid = icalproperty_get_uid (priv->uid);
-}
-
-/**
- * cal_component_set_uid:
- * @comp: A calendar component object.
- * @uid: Unique identifier.
- *
- * Sets the unique identifier string of a calendar component object.
- **/
-void
-cal_component_set_uid (CalComponent *comp, const char *uid)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (uid != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- /* This MUST exist, since we ensured that it did */
- g_assert (priv->uid != NULL);
-
- icalproperty_set_uid (priv->uid, (char *) uid);
-}
-
-/**
- * cal_component_get_categories_list:
- * @comp: A calendar component object.
- * @categ_list: Return value for the list of strings, where each string is a
- * category. This should be freed using cal_component_free_categories_list().
- *
- * Queries the list of categories of a calendar component object. Each element
- * in the returned categ_list is a string with the corresponding category.
- **/
-void
-cal_component_get_categories_list (CalComponent *comp, GSList **categ_list)
-{
- CalComponentPrivate *priv;
- const char *categories;
- const char *p;
- const char *cat_start;
- char *str;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (categ_list != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (!priv->categories_list) {
- *categ_list = NULL;
- return;
- }
-
- categories = icalproperty_get_categories (priv->categories_list);
- g_assert (categories != NULL);
-
- cat_start = categories;
-
- *categ_list = NULL;
-
- for (p = categories; *p; p++)
- if (*p == ',') {
- str = g_strndup (cat_start, p - cat_start);
- *categ_list = g_slist_prepend (*categ_list, str);
-
- cat_start = p + 1;
- }
-
- str = g_strndup (cat_start, p - cat_start);
- *categ_list = g_slist_prepend (*categ_list, str);
-
- *categ_list = g_slist_reverse (*categ_list);
-}
-
-/* Creates a comma-delimited string of categories */
-static char *
-stringify_categories (GSList *categ_list)
-{
- GString *s;
- GSList *l;
- char *str;
-
- s = g_string_new (NULL);
-
- for (l = categ_list; l; l = l->next) {
- g_string_append (s, l->data);
-
- if (l->next != NULL)
- g_string_append (s, ",");
- }
-
- str = s->str;
- g_string_free (s, FALSE);
-
- return str;
-}
-
-/**
- * cal_component_set_categories_list:
- * @comp: A calendar component object.
- * @categ_list: List of strings, one for each category.
- *
- * Sets the list of categories of a calendar component object.
- **/
-void
-cal_component_set_categories_list (CalComponent *comp, GSList *categ_list)
-{
- CalComponentPrivate *priv;
- struct categories *cat;
- char *categories_str;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- /* Free the old list */
-
- if (!categ_list) {
- if (priv->categories_list) {
- GSList *l;
-
- for (l = priv->categories_list; l; l = l->next) {
- struct categories *c;
-
- c = l->data;
- icalcomponent_remove_property (priv->icalcomp, c->prop);
- icalproperty_free (c->prop);
-
- g_free (c);
- }
-
- g_slist_free (priv->categories_list);
- priv->categories_list = NULL;
- }
-
- return;
- }
-
- /* Create a single string of categories */
-
- categories_str = stringify_categories (categ_list);
-
- /* Set the categories */
-
- cat = g_new (struct categories, 1);
- cat->prop = icalproperty_new_categories (categories_str);
- g_free (categories_str);
-
- icalcomponent_add_property (priv->icalcomp, cat->prop);
-}
-
-/**
- * cal_component_get_classification:
- * @comp: A calendar component object.
- * @classif: Return value for the classification.
- *
- * Queries the classification of a calendar component object. If the
- * classification property is not set on this component, this function returns
- * #CAL_COMPONENT_CLASS_NONE.
- **/
-void
-cal_component_get_classification (CalComponent *comp, CalComponentClassification *classif)
-{
- CalComponentPrivate *priv;
- const char *class;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (classif != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (!priv->classification) {
- *classif = CAL_COMPONENT_CLASS_NONE;
- return;
- }
-
- class = icalproperty_get_class (priv->classification);
-
- if (strcasecmp (class, "PUBLIC") == 0)
- *classif = CAL_COMPONENT_CLASS_PUBLIC;
- else if (strcasecmp (class, "PRIVATE") == 0)
- *classif = CAL_COMPONENT_CLASS_PRIVATE;
- else if (strcasecmp (class, "CONFIDENTIAL") == 0)
- *classif = CAL_COMPONENT_CLASS_CONFIDENTIAL;
- else
- *classif = CAL_COMPONENT_CLASS_UNKNOWN;
-}
-
-/**
- * cal_component_set_classification:
- * @comp: A calendar component object.
- * @classif: Classification to use.
- *
- * Sets the classification property of a calendar component object. To unset
- * the property, specify CAL_COMPONENT_CLASS_NONE for @classif.
- **/
-void
-cal_component_set_classification (CalComponent *comp, CalComponentClassification classif)
-{
- CalComponentPrivate *priv;
- char *str;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (classif != CAL_COMPONENT_CLASS_UNKNOWN);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (classif == CAL_COMPONENT_CLASS_NONE) {
- if (priv->classification) {
- icalcomponent_remove_property (priv->icalcomp, priv->classification);
- icalproperty_free (priv->classification);
- priv->classification = NULL;
- }
-
- return;
- }
-
- switch (classif) {
- case CAL_COMPONENT_CLASS_PUBLIC:
- str = "PUBLIC";
- break;
-
- case CAL_COMPONENT_CLASS_PRIVATE:
- str = "PRIVATE";
- break;
-
- case CAL_COMPONENT_CLASS_CONFIDENTIAL:
- str = "CONFIDENTIAL";
- break;
-
- default:
- g_assert_not_reached ();
- str = NULL;
- }
-
- if (priv->classification)
- icalproperty_set_class (priv->classification, str);
- else {
- priv->classification = icalproperty_new_class (str);
- icalcomponent_add_property (priv->icalcomp, priv->classification);
- }
-}
-
-/* Gets a text list value */
-static void
-get_text_list (GSList *text_list,
- char *(* get_prop_func) (icalproperty *prop),
- GSList **tl)
-{
- GSList *l;
-
- *tl = NULL;
-
- if (!text_list)
- return;
-
- for (l = text_list; l; l = l->next) {
- struct text *text;
- CalComponentText *t;
-
- text = l->data;
- g_assert (text->prop != NULL);
-
- t = g_new (CalComponentText, 1);
- t->value = (* get_prop_func) (text->prop);
-
- if (text->altrep_param)
- t->altrep = icalparameter_get_altrep (text->altrep_param);
- else
- t->altrep = NULL;
-
- *tl = g_slist_prepend (*tl, t);
- }
-
- *tl = g_slist_reverse (*tl);
-}
-
-/* Sets a text list value */
-static void
-set_text_list (CalComponent *comp,
- icalproperty *(* new_prop_func) (char *value),
- GSList **text_list,
- GSList *tl)
-{
- CalComponentPrivate *priv;
- GSList *l;
-
- priv = comp->priv;
-
- /* Remove old texts */
-
- for (l = *text_list; l; l = l->next) {
- struct text *text;
-
- text = l->data;
- g_assert (text->prop != NULL);
-
- icalcomponent_remove_property (priv->icalcomp, text->prop);
- icalproperty_free (text->prop);
- g_free (text);
- }
-
- g_slist_free (*text_list);
- *text_list = NULL;
-
- /* Add in new texts */
-
- for (l = tl; l; l = l->next) {
- CalComponentText *t;
- struct text *text;
-
- t = l->data;
- g_return_if_fail (t->value != NULL);
-
- text = g_new (struct text, 1);
-
- text->prop = (* new_prop_func) ((char *) t->value);
- icalcomponent_add_property (priv->icalcomp, text->prop);
-
- if (t->altrep) {
- text->altrep_param = icalparameter_new_altrep ((char *) t->altrep);
- icalproperty_add_parameter (text->prop, text->altrep_param);
- } else
- text->altrep_param = NULL;
-
- *text_list = g_slist_prepend (*text_list, text);
- }
-
- *text_list = g_slist_reverse (*text_list);
-}
-
-/**
- * cal_component_get_comment_list:
- * @comp: A calendar component object.
- * @text_list: Return value for the comment properties and their parameters, as
- * a list of #CalComponentText structures. This should be freed using the
- * cal_component_free_text_list() function.
- *
- * Queries the comment of a calendar component object. The comment property can
- * appear several times inside a calendar component, and so a list of
- * #CalComponentText is returned.
- **/
-void
-cal_component_get_comment_list (CalComponent *comp, GSList **text_list)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (text_list != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_text_list (priv->comment_list, icalproperty_get_comment, text_list);
-}
-
-/**
- * cal_component_set_comment_list:
- * @comp: A calendar component object.
- * @text_list: List of #CalComponentText structures.
- *
- * Sets the comment of a calendar component object. The comment property can
- * appear several times inside a calendar component, and so a list of
- * #CalComponentText structures is used.
- **/
-void
-cal_component_set_comment_list (CalComponent *comp, GSList *text_list)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_text_list (comp, icalproperty_new_comment, &priv->comment_list, text_list);
-}
-
-/* Gets a struct icaltimetype value */
-static void
-get_icaltimetype (icalproperty *prop,
- struct icaltimetype (* get_prop_func) (icalproperty *prop),
- struct icaltimetype **t)
-{
- if (!prop) {
- *t = NULL;
- return;
- }
-
- *t = g_new (struct icaltimetype, 1);
- **t = (* get_prop_func) (prop);
-}
-
-/* Sets a struct icaltimetype value */
-static void
-set_icaltimetype (CalComponent *comp, icalproperty **prop,
- icalproperty *(* prop_new_func) (struct icaltimetype v),
- void (* prop_set_func) (icalproperty *prop, struct icaltimetype v),
- struct icaltimetype *t)
-{
- CalComponentPrivate *priv;
-
- priv = comp->priv;
-
- if (!t) {
- if (*prop) {
- icalcomponent_remove_property (priv->icalcomp, *prop);
- icalproperty_free (*prop);
- *prop = NULL;
- }
-
- return;
- }
-
- if (*prop)
- (* prop_set_func) (*prop, *t);
- else {
- *prop = (* prop_new_func) (*t);
- icalcomponent_add_property (priv->icalcomp, *prop);
- }
-}
-
-/**
- * cal_component_get_completed:
- * @comp: A calendar component object.
- * @t: Return value for the completion date. This should be freed using the
- * cal_component_free_icaltimetype() function.
- *
- * Queries the date at which a calendar compoment object was completed.
- **/
-void
-cal_component_get_completed (CalComponent *comp, struct icaltimetype **t)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (t != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_icaltimetype (priv->completed, icalproperty_get_completed, t);
-}
-
-/**
- * cal_component_set_completed:
- * @comp: A calendar component object.
- * @t: Value for the completion date.
- *
- * Sets the date at which a calendar component object was completed.
- **/
-void
-cal_component_set_completed (CalComponent *comp, struct icaltimetype *t)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_icaltimetype (comp, &priv->completed,
- icalproperty_new_completed,
- icalproperty_set_completed,
- t);
-}
-
-
-/**
- * cal_component_get_created:
- * @comp: A calendar component object.
- * @t: Return value for the creation date. This should be freed using the
- * cal_component_free_icaltimetype() function.
- *
- * Queries the date in which a calendar component object was created in the
- * calendar store.
- **/
-void
-cal_component_get_created (CalComponent *comp, struct icaltimetype **t)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (t != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_icaltimetype (priv->created, icalproperty_get_created, t);
-}
-
-/**
- * cal_component_set_created:
- * @comp: A calendar component object.
- * @t: Value for the creation date.
- *
- * Sets the date in which a calendar component object is created in the calendar
- * store. This should only be used inside a calendar store application, i.e.
- * not by calendar user agents.
- **/
-void
-cal_component_set_created (CalComponent *comp, struct icaltimetype *t)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_icaltimetype (comp, &priv->created,
- icalproperty_new_created,
- icalproperty_set_created,
- t);
-}
-
-/**
- * cal_component_get_description_list:
- * @comp: A calendar component object.
- * @text_list: Return value for the description properties and their parameters,
- * as a list of #CalComponentText structures. This should be freed using the
- * cal_component_free_text_list() function.
- *
- * Queries the description of a calendar component object. Journal components
- * may have more than one description, and as such this function returns a list
- * of #CalComponentText structures. All other types of components can have at
- * most one description.
- **/
-void
-cal_component_get_description_list (CalComponent *comp, GSList **text_list)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (text_list != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_text_list (priv->description_list, icalproperty_get_description, text_list);
-}
-
-/**
- * cal_component_set_description_list:
- * @comp: A calendar component object.
- * @text_list: List of #CalComponentSummary structures.
- *
- * Sets the description of a calendar component object. Journal components may
- * have more than one description, and as such this function takes in a list of
- * #CalComponentDescription structures. All other types of components can have
- * at most one description.
- **/
-void
-cal_component_set_description_list (CalComponent *comp, GSList *text_list)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_text_list (comp, icalproperty_new_description, &priv->description_list, text_list);
-}
-
-/* Gets a date/time and timezone pair */
-static void
-get_datetime (struct datetime *datetime,
- struct icaltimetype (* get_prop_func) (icalproperty *prop),
- CalComponentDateTime *dt)
-{
- if (datetime->prop) {
- dt->value = g_new (struct icaltimetype, 1);
- *dt->value = (* get_prop_func) (datetime->prop);
- } else
- dt->value = NULL;
-
- if (datetime->tzid_param)
- dt->tzid = icalparameter_get_tzid (datetime->tzid_param);
- else
- dt->tzid = NULL;
-}
-
-/* Sets a date/time and timezone pair */
-static void
-set_datetime (CalComponent *comp, struct datetime *datetime,
- icalproperty *(* prop_new_func) (struct icaltimetype v),
- void (* prop_set_func) (icalproperty * prop, struct icaltimetype v),
- CalComponentDateTime *dt)
-{
- CalComponentPrivate *priv;
-
- priv = comp->priv;
-
- if (!dt) {
- if (datetime->prop) {
- icalcomponent_remove_property (priv->icalcomp, datetime->prop);
- icalproperty_free (datetime->prop);
-
- datetime->prop = NULL;
- datetime->tzid_param = NULL;
- }
-
- return;
- }
-
- g_return_if_fail (dt->value != NULL);
-
- if (datetime->prop)
- (* prop_set_func) (datetime->prop, *dt->value);
- else {
- datetime->prop = (* prop_new_func) (*dt->value);
- icalcomponent_add_property (priv->icalcomp, datetime->prop);
- }
-
- if (dt->tzid) {
- g_assert (datetime->prop != NULL);
-
- if (datetime->tzid_param)
- icalparameter_set_tzid (datetime->tzid_param, (char *) dt->tzid);
- else {
- datetime->tzid_param = icalparameter_new_tzid ((char *) dt->tzid);
- icalproperty_add_parameter (datetime->prop, datetime->tzid_param);
- }
- } else if (datetime->tzid_param) {
-#if 0
- /* FIXME: this fucking routine will assert(0) since it is not implemented */
- icalproperty_remove_parameter (datetime->prop, ICAL_TZID_PARAMETER);
- icalparameter_free (datetime->tzid_param);
-#endif
- datetime->tzid_param = NULL;
- }
-}
-
-/**
- * cal_component_get_dtend:
- * @comp: A calendar component object.
- * @dt: Return value for the date/time end. This should be freed with the
- * cal_component_free_datetime() function.
- *
- * Queries the date/time end of a calendar component object.
- **/
-void
-cal_component_get_dtend (CalComponent *comp, CalComponentDateTime *dt)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (dt != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_datetime (&priv->dtend, icalproperty_get_dtend, dt);
-}
-
-/**
- * cal_component_set_dtend:
- * @comp: A calendar component object.
- * @dt: End date/time.
- *
- * Sets the date/time end property of a calendar component object.
- **/
-void
-cal_component_set_dtend (CalComponent *comp, CalComponentDateTime *dt)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_datetime (comp, &priv->dtend,
- icalproperty_new_dtend,
- icalproperty_set_dtend,
- dt);
-
- priv->need_sequence_inc = TRUE;
-}
-
-/**
- * cal_component_get_dtstamp:
- * @comp: A calendar component object.
- * @t: Return value for the date/timestamp.
- *
- * Queries the date/timestamp property of a calendar component object, which is
- * the last time at which the object was modified by a calendar user agent.
- **/
-void
-cal_component_get_dtstamp (CalComponent *comp, struct icaltimetype *t)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (t != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- /* This MUST exist, since we ensured that it did */
- g_assert (priv->dtstamp != NULL);
-
- *t = icalproperty_get_dtstamp (priv->dtstamp);
-}
-
-/**
- * cal_component_set_dtstamp:
- * @comp: A calendar component object.
- * @t: Date/timestamp value.
- *
- * Sets the date/timestamp of a calendar component object. This should be
- * called whenever a calendar user agent makes a change to a component's
- * properties.
- **/
-void
-cal_component_set_dtstamp (CalComponent *comp, struct icaltimetype *t)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (t != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- /* This MUST exist, since we ensured that it did */
- g_assert (priv->dtstamp != NULL);
-
- icalproperty_set_dtstamp (priv->dtstamp, *t);
-}
-
-/**
- * cal_component_get_dtstart:
- * @comp: A calendar component object.
- * @dt: Return value for the date/time start. This should be freed with the
- * cal_component_free_datetime() function.
- *
- * Queries the date/time start of a calendar component object.
- **/
-void
-cal_component_get_dtstart (CalComponent *comp, CalComponentDateTime *dt)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (dt != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_datetime (&priv->dtstart, icalproperty_get_dtstart, dt);
-}
-
-/**
- * cal_component_set_dtstart:
- * @comp: A calendar component object.
- * @dt: Start date/time.
- *
- * Sets the date/time start property of a calendar component object.
- **/
-void
-cal_component_set_dtstart (CalComponent *comp, CalComponentDateTime *dt)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_datetime (comp, &priv->dtstart,
- icalproperty_new_dtstart,
- icalproperty_set_dtstart,
- dt);
-
- priv->need_sequence_inc = TRUE;
-}
-
-/**
- * cal_component_get_due:
- * @comp: A calendar component object.
- * @dt: Return value for the due date/time. This should be freed with the
- * cal_component_free_datetime() function.
- *
- * Queries the due date/time of a calendar component object.
- **/
-void
-cal_component_get_due (CalComponent *comp, CalComponentDateTime *dt)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (dt != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_datetime (&priv->due, icalproperty_get_due, dt);
-}
-
-/**
- * cal_component_set_due:
- * @comp: A calendar component object.
- * @dt: End date/time.
- *
- * Sets the due date/time property of a calendar component object.
- **/
-void
-cal_component_set_due (CalComponent *comp, CalComponentDateTime *dt)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_datetime (comp, &priv->due,
- icalproperty_new_due,
- icalproperty_set_due,
- dt);
-
- priv->need_sequence_inc = TRUE;
-}
-
-/* Builds a list of CalComponentPeriod structures based on a list of icalproperties */
-static void
-get_period_list (GSList *period_list,
- struct icalperiodtype (* get_prop_func) (icalproperty *prop),
- GSList **list)
-{
- GSList *l;
-
- *list = NULL;
-
- if (!period_list)
- return;
-
- for (l = period_list; l; l = l->next) {
- struct period *period;
- CalComponentPeriod *p;
- struct icalperiodtype ip;
-
- period = l->data;
- g_assert (period->prop != NULL);
-
- p = g_new (CalComponentPeriod, 1);
-
- /* Get value parameter */
-
- if (period->value_param) {
- icalparameter_value value_type;
-
- value_type = icalparameter_get_value (period->value_param);
-
- if (value_type == ICAL_VALUE_DATE || value_type == ICAL_VALUE_DATETIME)
- p->type = CAL_COMPONENT_PERIOD_DATETIME;
- else if (value_type == ICAL_VALUE_DURATION)
- p->type = CAL_COMPONENT_PERIOD_DURATION;
- else {
- g_message ("get_period_list(): Unknown value for period %d; "
- "using DATETIME", value_type);
- p->type = CAL_COMPONENT_PERIOD_DATETIME;
- }
- } else
- p->type = CAL_COMPONENT_PERIOD_DATETIME;
-
- /* Get start and end/duration */
-
- ip = (* get_prop_func) (period->prop);
-
- p->start = ip.start;
-
- if (p->type == CAL_COMPONENT_PERIOD_DATETIME)
- p->u.end = ip.end;
- else if (p->type == CAL_COMPONENT_PERIOD_DURATION)
- p->u.duration = ip.duration;
- else
- g_assert_not_reached ();
-
- /* Put in list */
-
- *list = g_slist_prepend (*list, p);
- }
-
- *list = g_slist_reverse (*list);
-}
-
-/* Sets a period list value */
-static void
-set_period_list (CalComponent *comp,
- icalproperty *(* new_prop_func) (struct icalperiodtype period),
- GSList **period_list,
- GSList *pl)
-{
- CalComponentPrivate *priv;
- GSList *l;
-
- priv = comp->priv;
-
- /* Remove old periods */
-
- for (l = *period_list; l; l = l->next) {
- struct period *period;
-
- period = l->data;
- g_assert (period->prop != NULL);
-
- icalcomponent_remove_property (priv->icalcomp, period->prop);
- icalproperty_free (period->prop);
- g_free (period);
- }
-
- g_slist_free (*period_list);
- *period_list = NULL;
-
- /* Add in new periods */
-
- for (l = pl; l; l = l->next) {
- CalComponentPeriod *p;
- struct period *period;
- struct icalperiodtype ip;
- icalparameter_value value_type;
-
- g_assert (l->data != NULL);
- p = l->data;
-
- /* Create libical value */
-
- ip.start = p->start;
-
- if (p->type == CAL_COMPONENT_PERIOD_DATETIME) {
- value_type = ICAL_VALUE_DATETIME;
- ip.end = p->u.end;
- } else if (p->type == CAL_COMPONENT_PERIOD_DURATION) {
- value_type = ICAL_VALUE_DURATION;
- ip.duration = p->u.duration;
- } else {
- g_assert_not_reached ();
- return;
- }
-
- /* Create property */
-
- period = g_new (struct period, 1);
-
- period->prop = (* new_prop_func) (ip);
- period->value_param = icalparameter_new_value (value_type);
- icalproperty_add_parameter (period->prop, period->value_param);
-
- /* Add to list */
-
- *period_list = g_slist_prepend (*period_list, period);
- }
-
- *period_list = g_slist_reverse (*period_list);
-}
-
-/**
- * cal_component_get_exdate_list:
- * @comp: A calendar component object.
- * @exdate_list: Return value for the list of exception dates, as a list of
- * struct #icaltimetype structures. This should be freed using the
- * cal_component_free_exdate_list() function.
- *
- * Queries the list of exception date properties in a calendar component object.
- **/
-void
-cal_component_get_exdate_list (CalComponent *comp, GSList **exdate_list)
-{
- CalComponentPrivate *priv;
- GSList *l;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (exdate_list != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- *exdate_list = NULL;
-
- for (l = priv->exdate_list; l; l = l->next) {
- icalproperty *prop;
- struct icaltimetype *t;
-
- prop = l->data;
-
- t = g_new (struct icaltimetype, 1);
- *t = icalproperty_get_exdate (prop);
-
- *exdate_list = g_slist_prepend (*exdate_list, t);
- }
-
- *exdate_list = g_slist_reverse (*exdate_list);
-}
-
-/**
- * cal_component_set_exdate_list:
- * @comp: A calendar component object.
- * @exdate_list: List of struct #icaltimetype structures.
- *
- * Sets the list of exception dates in a calendar component object.
- **/
-void
-cal_component_set_exdate_list (CalComponent *comp, GSList *exdate_list)
-{
- CalComponentPrivate *priv;
- GSList *l;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- /* Remove old exception dates */
-
- for (l = priv->exdate_list; l; l = l->next) {
- icalproperty *prop;
-
- prop = l->data;
- icalcomponent_remove_property (priv->icalcomp, prop);
- icalproperty_free (prop);
- }
-
- g_slist_free (priv->exdate_list);
- priv->exdate_list = NULL;
-
- /* Add in new exception dates */
-
- for (l = exdate_list; l; l = l->next) {
- icalproperty *prop;
- struct icaltimetype *t;
-
- g_assert (l->data != NULL);
- t = l->data;
-
- prop = icalproperty_new_exdate (*t);
- icalcomponent_add_property (priv->icalcomp, prop);
-
- priv->exdate_list = g_slist_prepend (priv->exdate_list, prop);
- }
-
- priv->exdate_list = g_slist_reverse (priv->exdate_list);
-
- priv->need_sequence_inc = TRUE;
-}
-
-/* Gets a list of recurrence rules */
-static void
-get_recur_list (GSList *recur_list,
- struct icalrecurrencetype (* get_prop_func) (icalproperty *prop),
- GSList **list)
-{
- GSList *l;
-
- *list = NULL;
-
- for (l = recur_list; l; l = l->next) {
- icalproperty *prop;
- struct icalrecurrencetype *r;
-
- prop = l->data;
-
- r = g_new (struct icalrecurrencetype, 1);
- *r = (* get_prop_func) (prop);
-
- *list = g_slist_prepend (*list, r);
- }
-
- *list = g_slist_reverse (*list);
-}
-
-/* Sets a list of recurrence rules */
-static void
-set_recur_list (CalComponent *comp,
- icalproperty *(* new_prop_func) (struct icalrecurrencetype recur),
- GSList **recur_list,
- GSList *rl)
-{
- CalComponentPrivate *priv;
- GSList *l;
-
- priv = comp->priv;
-
- /* Remove old recurrences */
-
- for (l = *recur_list; l; l = l->next) {
- icalproperty *prop;
-
- prop = l->data;
- icalcomponent_remove_property (priv->icalcomp, prop);
- icalproperty_free (prop);
- }
-
- g_slist_free (*recur_list);
- *recur_list = NULL;
-
- /* Add in new recurrences */
-
- for (l = rl; l; l = l->next) {
- icalproperty *prop;
- struct icalrecurrencetype *recur;
-
- g_assert (l->data != NULL);
- recur = l->data;
-
- prop = (* new_prop_func) (*recur);
- icalcomponent_add_property (priv->icalcomp, prop);
-
- *recur_list = g_slist_prepend (*recur_list, prop);
- }
-
- *recur_list = g_slist_reverse (*recur_list);
-}
-
-/**
- * cal_component_get_exrule_list:
- * @comp: A calendar component object.
- * @recur_list: List of exception rules as struct #icalrecurrencetype
- * structures. This should be freed using the cal_component_free_recur_list()
- * function.
- *
- * Queries the list of exception rule properties of a calendar component
- * object.
- **/
-void
-cal_component_get_exrule_list (CalComponent *comp, GSList **recur_list)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (recur_list != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_recur_list (priv->exrule_list, icalproperty_get_exrule, recur_list);
-}
-
-/**
- * cal_component_set_exrule_list:
- * @comp: A calendar component object.
- * @recur_list: List of struct #icalrecurrencetype structures.
- *
- * Sets the list of exception rules in a calendar component object.
- **/
-void
-cal_component_set_exrule_list (CalComponent *comp, GSList *recur_list)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_recur_list (comp, icalproperty_new_exrule, &priv->exrule_list, recur_list);
-
- priv->need_sequence_inc = TRUE;
-}
-
-/**
- * cal_component_get_geo:
- * @comp: A calendar component object.
- * @geo: Return value for the geographic position property. This should be
- * freed using the cal_component_free_geo() function.
- *
- * Sets the geographic position property of a calendar component object.
- **/
-void
-cal_component_get_geo (CalComponent *comp, struct icalgeotype **geo)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (geo != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (priv->geo) {
- *geo = g_new (struct icalgeotype, 1);
- **geo = icalproperty_get_geo (priv->geo);
- } else
- *geo = NULL;
-}
-
-/**
- * cal_component_set_geo:
- * @comp: A calendar component object.
- * @geo: Value for the geographic position property.
- *
- * Sets the geographic position property on a calendar component object.
- **/
-void
-cal_component_set_geo (CalComponent *comp, struct icalgeotype *geo)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (!geo) {
- if (priv->geo) {
- icalcomponent_remove_property (priv->icalcomp, priv->geo);
- icalproperty_free (priv->geo);
- priv->geo = NULL;
- }
-
- return;
- }
-
- if (priv->geo)
- icalproperty_set_geo (priv->geo, *geo);
- else {
- priv->geo = icalproperty_new_geo (*geo);
- icalcomponent_add_property (priv->icalcomp, priv->geo);
- }
-}
-
-/**
- * cal_component_get_last_modified:
- * @comp: A calendar component object.
- * @t: Return value for the last modified time value.
- *
- * Queries the time at which a calendar component object was last modified in
- * the calendar store.
- **/
-void
-cal_component_get_last_modified (CalComponent *comp, struct icaltimetype **t)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (t != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_icaltimetype (priv->last_modified, icalproperty_get_lastmodified, t);
-}
-
-/**
- * cal_component_set_last_modified:
- * @comp: A calendar component object.
- * @t: Value for the last time modified.
- *
- * Sets the time at which a calendar component object was last stored in the
- * calendar store. This should not be called by plain calendar user agents.
- **/
-void
-cal_component_set_last_modified (CalComponent *comp, struct icaltimetype *t)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_icaltimetype (comp, &priv->last_modified,
- icalproperty_new_lastmodified,
- icalproperty_set_lastmodified,
- t);
-}
-
-/**
- * cal_component_get_percent:
- * @comp: A calendar component object.
- * @percent: Return value for the percent-complete property. This should be
- * freed using the cal_component_free_percent() function.
- *
- * Queries the percent-complete property of a calendar component object.
- **/
-void
-cal_component_get_percent (CalComponent *comp, int **percent)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (percent != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (priv->percent) {
- *percent = g_new (int, 1);
- **percent = icalproperty_get_percentcomplete (priv->percent);
- } else
- *percent = NULL;
-}
-
-/**
- * cal_component_set_percent:
- * @comp: A calendar component object.
- * @percent: Value for the percent-complete property.
- *
- * Sets the percent-complete property of a calendar component object.
- **/
-void
-cal_component_set_percent (CalComponent *comp, int *percent)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (!percent) {
- if (priv->percent) {
- icalcomponent_remove_property (priv->icalcomp, priv->percent);
- icalproperty_free (priv->percent);
- priv->percent = NULL;
- }
-
- return;
- }
-
- g_return_if_fail (*percent >= 0 && *percent <= 100);
-
- if (priv->percent)
- icalproperty_set_percentcomplete (priv->percent, *percent);
- else {
- priv->percent = icalproperty_new_percentcomplete (*percent);
- icalcomponent_add_property (priv->icalcomp, priv->percent);
- }
-}
-
-/**
- * cal_component_get_priority:
- * @comp: A calendar component object.
- * @priority: Return value for the priority property. This should be freed using
- * the cal_component_free_priority() function.
- *
- * Queries the priority property of a calendar component object.
- **/
-void
-cal_component_get_priority (CalComponent *comp, int **priority)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (priority != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (priv->priority) {
- *priority = g_new (int, 1);
- **priority = icalproperty_get_priority (priv->priority);
- } else
- *priority = NULL;
-}
-
-/**
- * cal_component_set_priority:
- * @comp: A calendar component object.
- * @priority: Value for the priority property.
- *
- * Sets the priority property of a calendar component object.
- **/
-void
-cal_component_set_priority (CalComponent *comp, int *priority)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (!priority) {
- if (priv->priority) {
- icalcomponent_remove_property (priv->icalcomp, priv->priority);
- icalproperty_free (priv->priority);
- priv->priority = NULL;
- }
-
- return;
- }
-
- g_return_if_fail (*priority >= 0 && *priority <= 9);
-
- if (priv->priority)
- icalproperty_set_priority (priv->priority, *priority);
- else {
- priv->priority = icalproperty_new_priority (*priority);
- icalcomponent_add_property (priv->icalcomp, priv->priority);
- }
-}
-
-/**
- * cal_component_get_rdate_list:
- * @comp: A calendar component object.
- * @period_list: Return value for the list of recurrence dates, as a list of
- * #CalComponentPeriod structures. This should be freed using the
- * cal_component_free_period_list() function.
- *
- * Queries the list of recurrence date properties in a calendar component
- * object.
- **/
-void
-cal_component_get_rdate_list (CalComponent *comp, GSList **period_list)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (period_list != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_period_list (priv->rdate_list, icalproperty_get_rdate, period_list);
-}
-
-/**
- * cal_component_set_rdate_list:
- * @comp: A calendar component object.
- * @period_list: List of #CalComponentPeriod structures.
- *
- * Sets the list of recurrence dates in a calendar component object.
- **/
-void
-cal_component_set_rdate_list (CalComponent *comp, GSList *period_list)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (period_list != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_period_list (comp, icalproperty_new_rdate, &priv->rdate_list, period_list);
-
- priv->need_sequence_inc = TRUE;
-}
-
-/**
- * cal_component_has_rdates:
- * @comp: A calendar component object.
- *
- * Queries whether a calendar component object has any recurrence dates defined
- * for it.
- *
- * Return value: TRUE if the component has recurrence dates, FALSE otherwise.
- **/
-gboolean
-cal_component_has_rdates (CalComponent *comp)
-{
- CalComponentPrivate *priv;
-
- g_return_val_if_fail (comp != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), FALSE);
-
- priv = comp->priv;
- g_return_val_if_fail (priv->icalcomp != NULL, FALSE);
-
- return (priv->rdate_list != NULL);
-}
-
-/**
- * cal_component_get_rrule_list:
- * @comp: A calendar component object.
- * @recur_list: List of recurrence rules as struct #icalrecurrencetype
- * structures. This should be freed using the cal_component_free_recur_list()
- * function.
- *
- * Queries the list of recurrence rule properties of a calendar component
- * object.
- **/
-void
-cal_component_get_rrule_list (CalComponent *comp, GSList **recur_list)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (recur_list != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- get_recur_list (priv->rrule_list, icalproperty_get_rrule, recur_list);
-}
-
-/**
- * cal_component_set_rrule_list:
- * @comp: A calendar component object.
- * @recur_list: List of struct #icalrecurrencetype structures.
- *
- * Sets the list of recurrence rules in a calendar component object.
- **/
-void
-cal_component_set_rrule_list (CalComponent *comp, GSList *recur_list)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (recur_list != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- set_recur_list (comp, icalproperty_new_rrule, &priv->rrule_list, recur_list);
-
- priv->need_sequence_inc = TRUE;
-}
-
-/**
- * cal_component_has_rrules:
- * @comp: A calendar component object.
- *
- * Queries whether a calendar component object has any recurrence rules defined
- * for it.
- *
- * Return value: TRUE if the component has recurrence rules, FALSE otherwise.
- **/
-gboolean
-cal_component_has_rrules (CalComponent *comp)
-{
- CalComponentPrivate *priv;
-
- g_return_val_if_fail (comp != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), FALSE);
-
- priv = comp->priv;
- g_return_val_if_fail (priv->icalcomp != NULL, FALSE);
-
- return (priv->rrule_list != NULL);
-}
-
-/**
- * cal_component_get_sequence:
- * @comp: A calendar component object.
- * @sequence: Return value for the sequence number. This should be freed using
- * cal_component_free_sequence().
- *
- * Queries the sequence number of a calendar component object.
- **/
-void
-cal_component_get_sequence (CalComponent *comp, int **sequence)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (sequence != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (!priv->sequence) {
- *sequence = NULL;
- return;
- }
-
- *sequence = g_new (int, 1);
- **sequence = icalproperty_get_sequence (priv->sequence);
-}
-
-/**
- * cal_component_set_sequence:
- * @comp: A calendar component object.
- * @sequence: Sequence number value.
- *
- * Sets the sequence number of a calendar component object. Normally this
- * function should not be called, since the sequence number is incremented
- * automatically at the proper times.
- **/
-void
-cal_component_set_sequence (CalComponent *comp, int *sequence)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- priv->need_sequence_inc = FALSE;
-
- if (!sequence) {
- if (priv->sequence) {
- icalcomponent_remove_property (priv->icalcomp, priv->sequence);
- icalproperty_free (priv->sequence);
- priv->sequence = NULL;
- }
-
- return;
- }
-
- if (priv->sequence)
- icalproperty_set_sequence (priv->sequence, *sequence);
- else {
- priv->sequence = icalproperty_new_sequence (*sequence);
- icalcomponent_add_property (priv->icalcomp, priv->sequence);
- }
-}
-
-/**
- * cal_component_get_summary:
- * @comp: A calendar component object.
- * @summary: Return value for the summary property and its parameters.
- *
- * Queries the summary of a calendar component object.
- **/
-void
-cal_component_get_summary (CalComponent *comp, CalComponentText *summary)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (summary != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (priv->summary.prop)
- summary->value = icalproperty_get_summary (priv->summary.prop);
- else
- summary->value = NULL;
-
- if (priv->summary.altrep_param)
- summary->altrep = icalparameter_get_altrep (priv->summary.altrep_param);
- else
- summary->altrep = NULL;
-}
-
-/**
- * cal_component_set_summary:
- * @comp: A calendar component object.
- * @summary: Summary property and its parameters.
- *
- * Sets the summary of a calendar component object.
- **/
-void
-cal_component_set_summary (CalComponent *comp, CalComponentText *summary)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (!summary) {
- if (priv->summary.prop) {
- icalcomponent_remove_property (priv->icalcomp, priv->summary.prop);
- icalproperty_free (priv->summary.prop);
-
- priv->summary.prop = NULL;
- priv->summary.altrep_param = NULL;
- }
-
- return;
- }
-
- g_return_if_fail (summary->value != NULL);
-
- if (priv->summary.prop)
- icalproperty_set_summary (priv->summary.prop, (char *) summary->value);
- else {
- priv->summary.prop = icalproperty_new_summary ((char *) summary->value);
- icalcomponent_add_property (priv->icalcomp, priv->summary.prop);
- }
-
- if (summary->altrep) {
- g_assert (priv->summary.prop != NULL);
-
- if (priv->summary.altrep_param)
- icalparameter_set_altrep (priv->summary.altrep_param,
- (char *) summary->altrep);
- else {
- priv->summary.altrep_param = icalparameter_new_altrep (
- (char *) summary->altrep);
- icalproperty_add_parameter (priv->summary.prop,
- priv->summary.altrep_param);
- }
- } else if (priv->summary.altrep_param) {
-#if 0
- /* FIXME: this fucking routine will assert(0) since it is not implemented */
- icalproperty_remove_parameter (priv->summary.prop, ICAL_ALTREP_PARAMETER);
- icalparameter_free (priv->summary.altrep_param);
-#endif
- priv->summary.altrep_param = NULL;
- }
-}
-
-/**
- * cal_component_get_transparency:
- * @comp: A calendar component object.
- * @transp: Return value for the time transparency.
- *
- * Queries the time transparency of a calendar component object.
- **/
-void
-cal_component_get_transparency (CalComponent *comp, CalComponentTransparency *transp)
-{
- CalComponentPrivate *priv;
- const char *val;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (transp != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (!priv->transparency) {
- *transp = CAL_COMPONENT_TRANSP_NONE;
- return;
- }
-
- val = icalproperty_get_transp (priv->transparency);
-
- if (strcasecmp (val, "TRANSPARENT"))
- *transp = CAL_COMPONENT_TRANSP_TRANSPARENT;
- else if (strcasecmp (val, "OPAQUE"))
- *transp = CAL_COMPONENT_TRANSP_OPAQUE;
- else
- *transp = CAL_COMPONENT_TRANSP_UNKNOWN;
-}
-
-/**
- * cal_component_set_transparency:
- * @comp: A calendar component object.
- * @transp: Time transparency value.
- *
- * Sets the time transparency of a calendar component object.
- **/
-void
-cal_component_set_transparency (CalComponent *comp, CalComponentTransparency transp)
-{
- CalComponentPrivate *priv;
- char *str;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (transp != CAL_COMPONENT_TRANSP_UNKNOWN);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
-
- if (transp == CAL_COMPONENT_TRANSP_NONE) {
- if (priv->transparency) {
- icalcomponent_remove_property (priv->icalcomp, priv->transparency);
- icalproperty_free (priv->transparency);
- priv->transparency = NULL;
- }
-
- return;
- }
-
- switch (transp) {
- case CAL_COMPONENT_TRANSP_TRANSPARENT:
- str = "TRANSPARENT";
- break;
-
- case CAL_COMPONENT_TRANSP_OPAQUE:
- str = "OPAQUE";
- break;
-
- default:
- g_assert_not_reached ();
- str = NULL;
- }
-
- if (priv->transparency)
- icalproperty_set_transp (priv->transparency, str);
- else {
- priv->transparency = icalproperty_new_transp (str);
- icalcomponent_add_property (priv->icalcomp, priv->transparency);
- }
-}
-
-/**
- * cal_component_get_url:
- * @comp: A calendar component object.
- * @url: Return value for the URL.
- *
- * Queries the uniform resource locator property of a calendar component object.
- **/
-void
-cal_component_get_url (CalComponent *comp, const char **url)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
- g_return_if_fail (url != NULL);
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (priv->url)
- *url = icalproperty_get_url (priv->url);
- else
- *url = NULL;
-}
-
-/**
- * cal_component_set_url:
- * @comp: A calendar component object.
- * @url: URL value.
- *
- * Sets the uniform resource locator property of a calendar component object.
- **/
-void
-cal_component_set_url (CalComponent *comp, const char *url)
-{
- CalComponentPrivate *priv;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (IS_CAL_COMPONENT (comp));
-
- priv = comp->priv;
- g_return_if_fail (priv->icalcomp != NULL);
-
- if (!url) {
- if (priv->url) {
- icalcomponent_remove_property (priv->icalcomp, priv->url);
- icalproperty_free (priv->url);
- priv->url = NULL;
- }
-
- return;
- }
-
- if (priv->url)
- icalproperty_set_url (priv->url, (char *) url);
- else {
- priv->url = icalproperty_new_url ((char *) url);
- icalcomponent_add_property (priv->icalcomp, priv->url);
- }
-}
-
-/**
- * cal_component_get_pilot_id:
- * @comp: A calendar component object.
- * @pilot_id: Return value for the pilot ID.
- *
- * Queries the pilot id of a calendar component object, if any.
- **/
-void
-cal_component_get_pilot_id (CalComponent *comp, unsigned long *pilot_id)
-{
- /* pilot_id maybe should be recordid_t */
- /* FIX ME */
- *pilot_id = 0;
-}
-
-/**
- * cal_component_set_pilot_id:
- * @comp: A calendar component object.
- * @pilot_id: Return value for the pilot ID.
- *
- * Sets the pilot id of a clanedar component object.
- **/
-void
-cal_component_set_pilot_id (CalComponent *comp, unsigned long pilot_id)
-{
- /* pilot_id maybe should be recordid_t */
- /* FIX ME */
-}
-
-/**
- * cal_component_get_pilot_status:
- * @comp: A calendar component object.
- * @pilot_status: Return value for the pilot sync status.
- *
- * Queries the pilot status of a calendar component object, if any.
- **/
-void
-cal_component_get_pilot_status (CalComponent *comp, unsigned long *pilot_status)
-{
- /* FIX ME */
- /* pilot_status should be iCalPilotState ? */
- *pilot_status = 0;
-}
-
-/**
- * cal_component_set_pilot_id:
- * @comp: A calendar component object.
- * @pilot_id: Return value for the pilot ID.
- *
- * Sets the pilot id of a clanedar component object.
- **/
-void
-cal_component_set_pilot_status (CalComponent *comp, unsigned long pilot_status)
-{
- /* pilot_id maybe should be recordid_t */
- /* FIX ME */
-}
-
-
-
-
-
-/**
- * cal_component_free_categories_list:
- * @categ_list: List of category strings.
- *
- * Frees a list of category strings.
- **/
-void
-cal_component_free_categories_list (GSList *categ_list)
-{
- GSList *l;
-
- for (l = categ_list; l; l = l->next)
- g_free (l->data);
-
- g_slist_free (categ_list);
-}
-
-/**
- * cal_component_free_datetime:
- * @dt: A date/time structure.
- *
- * Frees a date/time structure.
- **/
-void
-cal_component_free_datetime (CalComponentDateTime *dt)
-{
- g_return_if_fail (dt != NULL);
-
- if (dt->value)
- g_free (dt->value);
-}
-
-/**
- * cal_component_free_exdate_list:
- * @exdate_list: List of struct #icaltimetype structures.
- *
- * Frees a list of struct #icaltimetype structures.
- **/
-void
-cal_component_free_exdate_list (GSList *exdate_list)
-{
- GSList *l;
-
- for (l = exdate_list; l; l = l->next) {
- struct icaltimetype *t;
-
- g_assert (l->data != NULL);
- t = l->data;
-
- g_free (t);
- }
-
- g_slist_free (exdate_list);
-}
-
-/**
- * cal_component_free_geo:
- * @geo: An #icalgeotype structure.
- *
- * Frees a struct #icalgeotype structure as returned by the calendar component
- * functions.
- **/
-void
-cal_component_free_geo (struct icalgeotype *geo)
-{
- g_return_if_fail (geo != NULL);
-
- g_free (geo);
-}
-
-/**
- * cal_component_free_icaltimetype:
- * @t: An #icaltimetype structure.
- *
- * Frees a struct #icaltimetype value as returned by the calendar component
- * functions.
- **/
-void
-cal_component_free_icaltimetype (struct icaltimetype *t)
-{
- g_return_if_fail (t != NULL);
-
- g_free (t);
-}
-
-/**
- * cal_component_free_percent:
- * @percent: Percent value.
- *
- * Frees a percent value as returned by the cal_component_get_percent()
- * function.
- **/
-void
-cal_component_free_percent (int *percent)
-{
- g_return_if_fail (percent != NULL);
-
- g_free (percent);
-}
-
-/**
- * cal_component_free_priority:
- * @priority: Priority value.
- *
- * Frees a priority value as returned by the cal_component_get_priority()
- * function.
- **/
-void
-cal_component_free_priority (int *priority)
-{
- g_return_if_fail (priority != NULL);
-
- g_free (priority);
-}
-
-/**
- * cal_component_free_period_list:
- * @period_list: List of #CalComponentPeriod structures.
- *
- * Frees a list of #CalComponentPeriod structures.
- **/
-void
-cal_component_free_period_list (GSList *period_list)
-{
- GSList *l;
-
- for (l = period_list; l; l = l->next) {
- CalComponentPeriod *period;
-
- g_assert (l->data != NULL);
-
- period = l->data;
- g_free (period);
- }
-
- g_slist_free (period_list);
-}
-
-/**
- * cal_component_free_recur_list:
- * @recur_list: List of struct #icalrecurrencetype structures.
- *
- * Frees a list of struct #icalrecurrencetype structures.
- **/
-void
-cal_component_free_recur_list (GSList *recur_list)
-{
- GSList *l;
-
- for (l = recur_list; l; l = l->next) {
- struct icalrecurrencetype *r;
-
- g_assert (l->data != NULL);
- r = l->data;
-
- g_free (l);
- }
-
- g_slist_free (recur_list);
-}
-
-/**
- * cal_component_free_sequence:
- * @sequence: Sequence number value.
- *
- * Frees a sequence number value.
- **/
-void
-cal_component_free_sequence (int *sequence)
-{
- g_return_if_fail (sequence != NULL);
-
- g_free (sequence);
-}
-
-/**
- * cal_component_free_text_list:
- * @text_list: List of #CalComponentText structures.
- *
- * Frees a list of #CalComponentText structures. This function should only be
- * used to free lists of text values as returned by the other getter functions
- * of #CalComponent.
- **/
-void
-cal_component_free_text_list (GSList *text_list)
-{
- GSList *l;
-
- for (l = text_list; l; l = l->next) {
- CalComponentText *text;
-
- g_assert (l->data != NULL);
-
- text = l->data;
- g_return_if_fail (text != NULL);
- g_free (text);
- }
-
- g_slist_free (text_list);
-}
-
-
-
-/* Scans an icalproperty from a calendar component and adds its mapping to our
- * own alarm structure.
- */
-static void
-scan_alarm_property (CalComponentAlarm *alarm, icalproperty *prop)
-{
- icalproperty_kind kind;
-
- kind = icalproperty_isa (prop);
-
- switch (kind) {
- case ICAL_ACTION_PROPERTY:
- alarm->action = prop;
- break;
-
- case ICAL_TRIGGER_PROPERTY:
- alarm->trigger = prop;
- break;
-
- default:
- break;
- }
-}
-
-/* Creates a CalComponentAlarm from a libical alarm subcomponent */
-static CalComponentAlarm *
-make_alarm (CalComponent *comp, icalcomponent *subcomp)
-{
- CalComponentAlarm *alarm;
- icalproperty *prop;
-
- alarm = g_new (CalComponentAlarm, 1);
-
- alarm->parent = comp;
- alarm->icalcomp = subcomp;
-
- for (prop = icalcomponent_get_first_property (subcomp, ICAL_ANY_PROPERTY);
- prop;
- prop = icalcomponent_get_next_property (subcomp, ICAL_ANY_PROPERTY))
- scan_alarm_property (alarm, prop);
-
- return alarm;
-}
-
-/**
- * cal_component_get_first_alarm:
- * @comp: A calendar component object.
- *
- * Starts an iterator for the alarms in a calendar component object. Subsequent
- * alarms can be obtained with the cal_component_get_next_alarm() function.
- *
- * Return value: The first alarm in the component, or NULL if the component has
- * no alarms. This should be freed using the cal_component_alarm_free()
- * function.
- **/
-CalComponentAlarm *
-cal_component_get_first_alarm (CalComponent *comp)
-{
- CalComponentPrivate *priv;
- icalcomponent *subcomp;
-
- g_return_val_if_fail (comp != NULL, NULL);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), NULL);
-
- priv = comp->priv;
- g_return_val_if_fail (priv->icalcomp != NULL, NULL);
-
- subcomp = icalcomponent_get_first_component (priv->icalcomp, ICAL_VALARM_COMPONENT);
- if (!subcomp)
- return NULL;
-
- return make_alarm (comp, subcomp);
-}
-
-/**
- * cal_component_get_next_alarm:
- * @comp: A calendar component object.
- *
- * Gets the next alarm on a calendar component object. This should be used as
- * an iterator function after calling cal_component_get_first_alarm().
- *
- * Return value: The next alarm in the component, or NULL if the component has
- * no more alarms. This should be freed using the cal_component_alarm_free()
- * function.
- **/
-CalComponentAlarm *
-cal_component_get_next_alarm (CalComponent *comp)
-{
- CalComponentPrivate *priv;
- icalcomponent *subcomp;
-
- g_return_val_if_fail (comp != NULL, NULL);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), NULL);
-
- priv = comp->priv;
- g_return_val_if_fail (priv->icalcomp != NULL, NULL);
-
- subcomp = icalcomponent_get_next_component (priv->icalcomp, ICAL_VALARM_COMPONENT);
- if (!subcomp)
- return NULL;
-
- return make_alarm (comp, subcomp);
-}
-
-/**
- * cal_component_alarm_free:
- * @alarm: A calendar alarm.
- *
- * Frees an alarm structure.
- **/
-void
-cal_component_alarm_free (CalComponentAlarm *alarm)
-{
- g_return_if_fail (alarm != NULL);
-
- g_assert (alarm->icalcomp != NULL);
-
- if (icalcomponent_get_parent (alarm->icalcomp) != NULL)
- icalcomponent_free (alarm->icalcomp);
-
- alarm->icalcomp = NULL;
-
- alarm->parent = NULL;
- alarm->action = NULL;
-
- g_free (alarm);
-}
-
-/**
- * cal_component_alarm_get_action:
- * @alarm: An alarm.
- * @action: Return value for the alarm's action type.
- *
- * Queries the action type of an alarm.
- **/
-void
-cal_component_alarm_get_action (CalComponentAlarm *alarm, CalComponentAlarmAction *action)
-{
- const char *str;
-
- g_return_if_fail (alarm != NULL);
- g_return_if_fail (action != NULL);
-
- g_assert (alarm->icalcomp != NULL);
-
- if (!alarm->action) {
- *action = CAL_COMPONENT_ALARM_NONE;
- return;
- }
-
- str = icalproperty_get_action (alarm->action);
-
- if (strcasecmp (str, "AUDIO") == 0)
- *action = CAL_COMPONENT_ALARM_AUDIO;
- else if (strcasecmp (str, "DISPLAY") == 0)
- *action = CAL_COMPONENT_ALARM_DISPLAY;
- else if (strcasecmp (str, "EMAIL") == 0)
- *action = CAL_COMPONENT_ALARM_EMAIL;
- else if (strcasecmp (str, "PROCEDURE") == 0)
- *action = CAL_COMPONENT_ALARM_PROCEDURE;
- else
- *action = CAL_COMPONENT_ALARM_UNKNOWN;
-}
-
-/**
- * cal_component_alarm_set_action:
- * @alarm: An alarm.
- * @action: Action type.
- *
- * Sets the action type for an alarm.
- **/
-void
-cal_component_alarm_set_action (CalComponentAlarm *alarm, CalComponentAlarmAction action)
-{
- char *str;
-
- g_return_if_fail (alarm != NULL);
- g_return_if_fail (action != CAL_COMPONENT_ALARM_NONE);
- g_return_if_fail (action != CAL_COMPONENT_ALARM_UNKNOWN);
-
- g_assert (alarm->icalcomp != NULL);
-
- switch (action) {
- case CAL_COMPONENT_ALARM_AUDIO:
- str = "AUDIO";
- break;
-
- case CAL_COMPONENT_ALARM_DISPLAY:
- str = "DISPLAY";
- break;
-
- case CAL_COMPONENT_ALARM_EMAIL:
- str = "EMAIL";
- break;
-
- case CAL_COMPONENT_ALARM_PROCEDURE:
- str = "PROCEDURE";
- break;
-
- default:
- g_assert_not_reached ();
- str = NULL;
- }
-
- if (alarm->action)
- icalproperty_set_action (alarm->action, str);
- else {
- alarm->action = icalproperty_new_action (str);
- icalcomponent_add_property (alarm->icalcomp, alarm->action);
- }
-}
-
-/**
- * cal_component_alarm_get_trigger:
- * @alarm: An alarm.
- * @trigger: Return value for the trigger time. This should be freed using the
- * cal_component_alarm_free_trigger() function.
- *
- * Queries the trigger time for an alarm.
- **/
-void
-cal_component_alarm_get_trigger (CalComponentAlarm *alarm, CalComponentAlarmTrigger **trigger)
-{
- icalparameter *param;
- union icaltriggertype t;
-
- g_return_if_fail (alarm != NULL);
- g_return_if_fail (trigger != NULL);
-
- g_assert (alarm->icalcomp != NULL);
-
- if (!alarm->trigger) {
- *trigger = NULL;
- return;
- }
-
- *trigger = g_new (CalComponentAlarmTrigger, 1);
-
- /* Get trigger type */
-
- param = icalproperty_get_first_parameter (alarm->trigger, ICAL_VALUE_PARAMETER);
-
- if (param) {
- icalparameter_value value;
-
- value = icalparameter_get_value (param);
-
- switch (value) {
- case ICAL_VALUE_DURATION:
- (*trigger)->type = CAL_COMPONENT_ALARM_TRIGGER_RELATIVE;
- break;
-
- case ICAL_VALUE_DATETIME:
- (*trigger)->type = CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE;
- break;
-
- default:
- g_message ("cal_component_alarm_get_trigger(): Unknown value for trigger "
- "value %d; using RELATIVE", value);
-
- (*trigger)->type = CAL_COMPONENT_ALARM_TRIGGER_RELATIVE;
- break;
- }
- } else
- (*trigger)->type = CAL_COMPONENT_ALARM_TRIGGER_RELATIVE;
-
- /* Get trigger value and the RELATED parameter */
-
- t = icalproperty_get_trigger (alarm->trigger);
-
- switch ((*trigger)->type) {
- case CAL_COMPONENT_ALARM_TRIGGER_RELATIVE:
- (*trigger)->u.relative.duration = t.duration;
-
- param = icalproperty_get_first_parameter (alarm->trigger, ICAL_RELATED_PARAMETER);
- if (param) {
- icalparameter_related rel;
-
- rel = icalparameter_get_related (param);
-
- switch (rel) {
- case ICAL_RELATED_START:
- (*trigger)->u.relative.related =
- CAL_COMPONENT_ALARM_TRIGGER_RELATED_START;
- break;
-
- case ICAL_RELATED_END:
- (*trigger)->u.relative.related =
- CAL_COMPONENT_ALARM_TRIGGER_RELATED_END;
- break;
-
- default:
- g_assert_not_reached ();
- }
- } else
- (*trigger)->u.relative.related = CAL_COMPONENT_ALARM_TRIGGER_RELATED_START;
-
- break;
-
- case CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE:
- (*trigger)->u.absolute = t.time;
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-/**
- * cal_component_alarm_set_trigger:
- * @alarm: An alarm.
- * @trigger: Trigger time structure.
- *
- * Sets the trigger time of an alarm.
- **/
-void
-cal_component_alarm_set_trigger (CalComponentAlarm *alarm, CalComponentAlarmTrigger *trigger)
-{
- union icaltriggertype t;
- icalparameter *param;
- icalparameter_value value_type;
- icalparameter_related related;
-
- g_return_if_fail (alarm != NULL);
- g_return_if_fail (trigger != NULL);
-
- g_assert (alarm->icalcomp != NULL);
-
- /* Delete old trigger */
-
- if (alarm->trigger) {
- icalcomponent_remove_property (alarm->icalcomp, alarm->trigger);
- icalproperty_free (alarm->trigger);
- alarm->trigger = NULL;
- }
-
- /* Set the value */
-
- value_type = ICAL_DURATION_VALUE; /* Keep GCC happy */
- related = ICAL_RELATED_START; /* Ditto */
-
- switch (trigger->type) {
- case CAL_COMPONENT_ALARM_TRIGGER_RELATIVE:
- t.duration = trigger->u.relative.duration;
- value_type = ICAL_DURATION_VALUE;
-
- switch (trigger->u.relative.related) {
- case CAL_COMPONENT_ALARM_TRIGGER_RELATED_START:
- related = ICAL_RELATED_START;
- break;
-
- case CAL_COMPONENT_ALARM_TRIGGER_RELATED_END:
- related = ICAL_RELATED_END;
- break;
-
- default:
- g_assert_not_reached ();
- return;
- }
-
- break;
-
- case CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE:
- t.time = trigger->u.absolute;
- value_type = ICAL_DATETIME_VALUE;
- break;
-
- default:
- g_assert_not_reached ();
- return;
- }
-
- alarm->trigger = icalproperty_new_trigger (t);
- icalcomponent_add_property (alarm->icalcomp, alarm->trigger);
-
- /* Value parameters */
-
- param = icalproperty_get_first_parameter (alarm->trigger, ICAL_VALUE_PARAMETER);
- if (param)
- icalparameter_set_value (param, value_type);
- else {
- param = icalparameter_new_value (value_type);
- icalproperty_add_parameter (alarm->trigger, param);
- }
-
- /* Related parameter */
-
- if (trigger->type == CAL_COMPONENT_ALARM_TRIGGER_RELATIVE) {
- param = icalproperty_get_first_parameter (alarm->trigger, ICAL_RELATED_PARAMETER);
-
- if (param)
- icalparameter_set_related (param, related);
- else {
- param = icalparameter_new_related (related);
- icalproperty_add_parameter (alarm->trigger, param);
- }
- }
-}
-
-/**
- * cal_component_alarm_free_trigger:
- * @trigger: A #CalComponentAlarmTrigger structure.
- *
- * Frees a #CalComponentAlarmTrigger structure.
- **/
-void
-cal_component_alarm_free_trigger (CalComponentAlarmTrigger *trigger)
-{
- g_return_if_fail (trigger != NULL);
-
- g_free (trigger);
-}
diff --git a/calendar/cal-util/cal-component.h b/calendar/cal-util/cal-component.h
deleted file mode 100644
index c8e2627448..0000000000
--- a/calendar/cal-util/cal-component.h
+++ /dev/null
@@ -1,306 +0,0 @@
-/* Evolution calendar - iCalendar component object
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 CAL_COMPONENT_H
-#define CAL_COMPONENT_H
-
-#include <libgnome/gnome-defs.h>
-#include <time.h>
-#include <gtk/gtkobject.h>
-#include <ical.h>
-
-BEGIN_GNOME_DECLS
-
-
-
-#define CAL_COMPONENT_TYPE (cal_component_get_type ())
-#define CAL_COMPONENT(obj) (GTK_CHECK_CAST ((obj), CAL_COMPONENT_TYPE, CalComponent))
-#define CAL_COMPONENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_COMPONENT_TYPE, \
- CalComponentClass))
-#define IS_CAL_COMPONENT(obj) (GTK_CHECK_TYPE ((obj), CAL_COMPONENT_TYPE))
-#define IS_CAL_COMPONENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_COMPONENT_TYPE))
-
-/* Types of calendar components to be stored by a CalComponent, as per RFC 2445.
- * We don't put the alarm component type here since we store alarms as separate
- * structures inside the other "real" components.
- */
-typedef enum {
- CAL_COMPONENT_NO_TYPE,
- CAL_COMPONENT_EVENT,
- CAL_COMPONENT_TODO,
- CAL_COMPONENT_JOURNAL,
- CAL_COMPONENT_FREEBUSY,
- CAL_COMPONENT_TIMEZONE
-} CalComponentVType;
-
-/* Field identifiers for a calendar component */
-typedef enum {
- CAL_COMPONENT_FIELD_CATEGORIES, /* concatenation of the categories list */
- CAL_COMPONENT_FIELD_CLASSIFICATION,
- CAL_COMPONENT_FIELD_COMPLETED,
- CAL_COMPONENT_FIELD_DTEND,
- CAL_COMPONENT_FIELD_DTSTART,
- CAL_COMPONENT_FIELD_DUE,
- CAL_COMPONENT_FIELD_GEO,
- CAL_COMPONENT_FIELD_PERCENT,
- CAL_COMPONENT_FIELD_PRIORITY,
- CAL_COMPONENT_FIELD_SUMMARY,
- CAL_COMPONENT_FIELD_TRANSPARENCY,
- CAL_COMPONENT_FIELD_URL,
- CAL_COMPONENT_FIELD_HAS_ALARMS, /* not a real field */
- CAL_COMPONENT_FIELD_ICON, /* not a real field */
- CAL_COMPONENT_FIELD_COMPLETE, /* not a real field */
- CAL_COMPONENT_FIELD_RECURRING, /* not a real field */
- CAL_COMPONENT_FIELD_OVERDUE, /* not a real field */
- CAL_COMPONENT_FIELD_COLOR, /* not a real field */
- CAL_COMPONENT_FIELD_NUM_FIELDS
-} CalComponentField;
-
-/* Structures to return properties and their parameters */
-
-typedef enum {
- CAL_COMPONENT_CLASS_NONE,
- CAL_COMPONENT_CLASS_PUBLIC,
- CAL_COMPONENT_CLASS_PRIVATE,
- CAL_COMPONENT_CLASS_CONFIDENTIAL,
- CAL_COMPONENT_CLASS_UNKNOWN
-} CalComponentClassification;
-
-typedef struct {
- /* Actual date/time value */
- struct icaltimetype *value;
-
- /* Timezone ID */
- const char *tzid;
-} CalComponentDateTime;
-
-typedef enum {
- CAL_COMPONENT_PERIOD_DATETIME,
- CAL_COMPONENT_PERIOD_DURATION
-} CalComponentPeriodType;
-
-typedef struct {
- CalComponentPeriodType type;
-
- struct icaltimetype start;
-
- union {
- struct icaltimetype end;
- struct icaldurationtype duration;
- } u;
-} CalComponentPeriod;
-
-typedef struct {
- /* Description string */
- const char *value;
-
- /* Alternate representation URI */
- const char *altrep;
-} CalComponentText;
-
-typedef enum {
- CAL_COMPONENT_TRANSP_NONE,
- CAL_COMPONENT_TRANSP_TRANSPARENT,
- CAL_COMPONENT_TRANSP_OPAQUE,
- CAL_COMPONENT_TRANSP_UNKNOWN
-} CalComponentTransparency;
-
-typedef struct _CalComponentAlarm CalComponentAlarm;
-
-typedef struct _CalComponent CalComponent;
-typedef struct _CalComponentClass CalComponentClass;
-
-typedef struct _CalComponentPrivate CalComponentPrivate;
-
-struct _CalComponent {
- GtkObject object;
-
- /* Private data */
- CalComponentPrivate *priv;
-};
-
-struct _CalComponentClass {
- GtkObjectClass parent_class;
-};
-
-/* Calendar component */
-
-GtkType cal_component_get_type (void);
-
-char *cal_component_gen_uid (void);
-
-CalComponent *cal_component_new (void);
-
-CalComponent *cal_component_clone (CalComponent *comp);
-
-void cal_component_set_new_vtype (CalComponent *comp, CalComponentVType type);
-
-gboolean cal_component_set_icalcomponent (CalComponent *comp, icalcomponent *icalcomp);
-icalcomponent *cal_component_get_icalcomponent (CalComponent *comp);
-
-CalComponentVType cal_component_get_vtype (CalComponent *comp);
-
-char *cal_component_get_as_string (CalComponent *comp);
-
-void cal_component_commit_sequence (CalComponent *comp);
-
-void cal_component_get_uid (CalComponent *comp, const char **uid);
-void cal_component_set_uid (CalComponent *comp, const char *uid);
-
-void cal_component_get_categories_list (CalComponent *comp, GSList **categ_list);
-void cal_component_set_categories_list (CalComponent *comp, GSList *categ_list);
-
-void cal_component_get_classification (CalComponent *comp, CalComponentClassification *classif);
-void cal_component_set_classification (CalComponent *comp, CalComponentClassification classif);
-
-void cal_component_get_comment_list (CalComponent *comp, GSList **text_list);
-void cal_component_set_comment_list (CalComponent *comp, GSList *text_list);
-
-void cal_component_get_completed (CalComponent *comp, struct icaltimetype **t);
-void cal_component_set_completed (CalComponent *comp, struct icaltimetype *t);
-
-void cal_component_get_created (CalComponent *comp, struct icaltimetype **t);
-void cal_component_set_created (CalComponent *comp, struct icaltimetype *t);
-
-void cal_component_get_description_list (CalComponent *comp, GSList **text_list);
-void cal_component_set_description_list (CalComponent *comp, GSList *text_list);
-
-void cal_component_get_dtend (CalComponent *comp, CalComponentDateTime *dt);
-void cal_component_set_dtend (CalComponent *comp, CalComponentDateTime *dt);
-
-void cal_component_get_dtstamp (CalComponent *comp, struct icaltimetype *t);
-void cal_component_set_dtstamp (CalComponent *comp, struct icaltimetype *t);
-
-void cal_component_get_dtstart (CalComponent *comp, CalComponentDateTime *dt);
-void cal_component_set_dtstart (CalComponent *comp, CalComponentDateTime *dt);
-
-void cal_component_get_due (CalComponent *comp, CalComponentDateTime *dt);
-void cal_component_set_due (CalComponent *comp, CalComponentDateTime *dt);
-
-void cal_component_get_exdate_list (CalComponent *comp, GSList **exdate_list);
-void cal_component_set_exdate_list (CalComponent *comp, GSList *exdate_list);
-
-void cal_component_get_exrule_list (CalComponent *comp, GSList **recur_list);
-void cal_component_set_exrule_list (CalComponent *comp, GSList *recur_list);
-
-void cal_component_get_geo (CalComponent *comp, struct icalgeotype **geo);
-void cal_component_set_geo (CalComponent *comp, struct icalgeotype *geo);
-
-void cal_component_get_last_modified (CalComponent *comp, struct icaltimetype **t);
-void cal_component_set_last_modified (CalComponent *comp, struct icaltimetype *t);
-
-void cal_component_get_percent (CalComponent *comp, int **percent);
-void cal_component_set_percent (CalComponent *comp, int *percent);
-
-void cal_component_get_priority (CalComponent *comp, int **priority);
-void cal_component_set_priority (CalComponent *comp, int *priority);
-
-void cal_component_get_rdate_list (CalComponent *comp, GSList **period_list);
-void cal_component_set_rdate_list (CalComponent *comp, GSList *period_list);
-gboolean cal_component_has_rdates (CalComponent *comp);
-
-void cal_component_get_rrule_list (CalComponent *comp, GSList **recur_list);
-void cal_component_set_rrule_list (CalComponent *comp, GSList *recur_list);
-gboolean cal_component_has_rrules (CalComponent *comp);
-
-void cal_component_get_sequence (CalComponent *comp, int **sequence);
-void cal_component_set_sequence (CalComponent *comp, int *sequence);
-
-void cal_component_get_summary (CalComponent *comp, CalComponentText *summary);
-void cal_component_set_summary (CalComponent *comp, CalComponentText *summary);
-
-void cal_component_get_transparency (CalComponent *comp, CalComponentTransparency *transp);
-void cal_component_set_transparency (CalComponent *comp, CalComponentTransparency transp);
-
-void cal_component_get_url (CalComponent *comp, const char **url);
-void cal_component_set_url (CalComponent *comp, const char *url);
-
-void cal_component_get_pilot_id (CalComponent *comp, unsigned long *pilot_id);
-void cal_component_set_pilot_id (CalComponent *comp, unsigned long pilot_id);
-
-void cal_component_get_pilot_status (CalComponent *comp, unsigned long *pilot_status);
-void cal_component_set_pilot_status (CalComponent *comp, unsigned long pilot_status);
-
-/* Functions to free returned values */
-
-void cal_component_free_categories_list (GSList *categ_list);
-void cal_component_free_datetime (CalComponentDateTime *dt);
-void cal_component_free_exdate_list (GSList *exdate_list);
-void cal_component_free_geo (struct icalgeotype *geo);
-void cal_component_free_icaltimetype (struct icaltimetype *t);
-void cal_component_free_percent (int *percent);
-void cal_component_free_priority (int *priority);
-void cal_component_free_period_list (GSList *period_list);
-void cal_component_free_recur_list (GSList *recur_list);
-void cal_component_free_sequence (int *sequence);
-void cal_component_free_text_list (GSList *text_list);
-
-/* Alarms */
-
-typedef enum {
- CAL_COMPONENT_ALARM_NONE,
- CAL_COMPONENT_ALARM_AUDIO,
- CAL_COMPONENT_ALARM_DISPLAY,
- CAL_COMPONENT_ALARM_EMAIL,
- CAL_COMPONENT_ALARM_PROCEDURE,
- CAL_COMPONENT_ALARM_UNKNOWN
-} CalComponentAlarmAction;
-
-typedef enum {
- CAL_COMPONENT_ALARM_TRIGGER_RELATIVE,
- CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE
-} CalComponentAlarmTriggerType;
-
-typedef enum {
- CAL_COMPONENT_ALARM_TRIGGER_RELATED_START,
- CAL_COMPONENT_ALARM_TRIGGER_RELATED_END
-} CalComponentAlarmTriggerRelated;
-
-typedef struct {
- CalComponentAlarmTriggerType type;
-
- union {
- struct {
- struct icaldurationtype duration;
- CalComponentAlarmTriggerRelated related;
- } relative;
-
- struct icaltimetype absolute;
- } u;
-} CalComponentAlarmTrigger;
-
-CalComponentAlarm *cal_component_get_first_alarm (CalComponent *comp);
-CalComponentAlarm *cal_component_get_next_alarm (CalComponent *comp);
-
-void cal_component_alarm_free (CalComponentAlarm *alarm);
-
-void cal_component_alarm_get_action (CalComponentAlarm *alarm, CalComponentAlarmAction *action);
-void cal_component_alarm_set_action (CalComponentAlarm *alarm, CalComponentAlarmAction action);
-
-void cal_component_alarm_get_trigger (CalComponentAlarm *alarm, CalComponentAlarmTrigger **trigger);
-void cal_component_alarm_set_trigger (CalComponentAlarm *alarm, CalComponentAlarmTrigger *trigger);
-void cal_component_alarm_free_trigger (CalComponentAlarmTrigger *trigger);
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/cal-util/cal-recur.c b/calendar/cal-util/cal-recur.c
deleted file mode 100644
index 164ffdbfc6..0000000000
--- a/calendar/cal-util/cal-recur.c
+++ /dev/null
@@ -1,3054 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Evolution calendar recurrence rule functions
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Damon Chaplin <damon@helixcode.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.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-#include <cal-util/cal-recur.h>
-#include <cal-util/timeutil.h>
-
-
-/*
- * Introduction to The Recurrence Generation Functions:
- *
- * Note: This is pretty complicated. See the iCalendar spec (RFC 2445) for
- * the specification of the recurrence rules and lots of examples
- * (sections 4.3.10 & 4.8.5). We also want to support the older
- * vCalendar spec, though this should be easy since it is basically a
- * subset of iCalendar.
- *
- * o An iCalendar event can have any number of recurrence rules specifying
- * occurrences of the event, as well as dates & times of specific
- * occurrences. It can also have any number of recurrence rules and
- * specific dates & times specifying exceptions to the occurrences.
- * So we first merge all the occurrences generated, eliminating any
- * duplicates, then we generate all the exceptions and remove these to
- * form the final set of occurrences.
- *
- * o There are 7 frequencies of occurrences: YEARLY, MONTHLY, WEEKLY, DAILY,
- * HOURLY, MINUTELY & SECONDLY. The 'interval' property specifies the
- * multiples of the frequency which we step by. We generate a 'set' of
- * occurrences for each period defined by the frequency & interval.
- * So for a YEARLY frequency with an interval of 3, we generate a set of
- * occurrences for every 3rd year. We use complete years here - any
- * generated occurrences that occur before the event's start (or after its
- * end) are just discarded.
- *
- * o There are 8 frequency modifiers: BYMONTH, BYWEEKNO, BYYEARDAY, BYMONTHDAY,
- * BYDAY, BYHOUR, BYMINUTE & BYSECOND. These can either add extra occurrences
- * or filter out occurrences. For example 'FREQ=YEARLY;BYMONTH=1,2' produces
- * 2 occurrences for each year rather than the default 1. And
- * 'FREQ=DAILY;BYMONTH=1' filters out all occurrences except those in Jan.
- * If the modifier works on periods which are less than the recurrence
- * frequency, then extra occurrences are added, otherwise occurrences are
- * filtered. So we have 2 functions for each modifier - one to expand events
- * and the other to filter. We use a table of functions for each frequency
- * which points to the appropriate function to use for each modifier.
- *
- * o Any number of frequency modifiers can be used in a recurrence rule.
- * (Though the iCalendar spec says that BYWEEKNO can only be used in a YEARLY
- * rule, and some modifiers aren't appropriate for some frequencies - e.g.
- * BYMONTHDAY is not really useful in a WEEKLY frequency, and BYYEARDAY is
- * not useful in a MONTHLY or WEEKLY frequency).
- * The frequency modifiers are applied in the order given above. The first 5
- * modifier rules (BYMONTH, BYWEEKNO, BYYEARDAY, BYMONTHDAY & BYDAY) all
- * produce the days on which the occurrences take place, and so we have to
- * compute some of these in parallel rather than sequentially, or we may end
- * up with too many days.
- *
- * o Note that some expansion functions may produce days which are invalid,
- * e.g. 31st September, 30th Feb. These invalid days are removed before the
- * BYHOUR, BYMINUTE & BYSECOND modifier functions are applied.
- *
- * o After the set of occurrences for the frequency interval are generated,
- * the BYSETPOS property is used to select which of the occurrences are
- * finally output. If BYSETPOS is not specified then all the occurrences are
- * output.
- */
-
-
-/* This is what we use to pass to all the filter functions. */
-typedef struct _RecurData RecurData;
-struct _RecurData {
- CalRecurrence *recur;
-
- /* This is used for the WEEKLY frequency. */
- gint weekday;
-
- /* This is used for fast lookup in BYMONTH filtering. */
- guint8 months[12];
-
- /* This is used for fast lookup in BYYEARDAY filtering. */
- guint8 yeardays[367], neg_yeardays[367]; /* Days are 1 - 366. */
-
- /* This is used for fast lookup in BYMONTHDAY filtering. */
- guint8 monthdays[32], neg_monthdays[32]; /* Days are 1 to 31. */
-
- /* This is used for fast lookup in BYDAY filtering. */
- guint8 weekdays[7];
-
- /* This is used for fast lookup in BYHOUR filtering. */
- guint8 hours[24];
-
- /* This is used for fast lookup in BYMINUTE filtering. */
- guint8 minutes[60];
-
- /* This is used for fast lookup in BYSECOND filtering. */
- guint8 seconds[61];
-};
-
-
-
-typedef gboolean (*CalObjFindStartFn) (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime);
-typedef gboolean (*CalObjFindNextFn) (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end);
-typedef GArray* (*CalObjFilterFn) (RecurData *recur_data,
- GArray *occs);
-
-typedef struct _CalRecurVTable CalRecurVTable;
-struct _CalRecurVTable {
- CalObjFindStartFn find_start_position;
- CalObjFindNextFn find_next_position;
-
- CalObjFilterFn bymonth_filter;
- CalObjFilterFn byweekno_filter;
- CalObjFilterFn byyearday_filter;
- CalObjFilterFn bymonthday_filter;
- CalObjFilterFn byday_filter;
- CalObjFilterFn byhour_filter;
- CalObjFilterFn byminute_filter;
- CalObjFilterFn bysecond_filter;
-};
-
-
-/* This is used to specify which parts of the CalObjTime to compare in
- cal_obj_time_compare(). */
-typedef enum {
- CALOBJ_YEAR,
- CALOBJ_MONTH,
- CALOBJ_DAY,
- CALOBJ_HOUR,
- CALOBJ_MINUTE,
- CALOBJ_SECOND
-} CalObjTimeComparison;
-
-static void cal_object_compute_duration (CalObjTime *start,
- CalObjTime *end,
- gint *days,
- gint *seconds);
-
-static gboolean generate_instances_for_year (CalComponent *comp,
- time_t comp_dtstart,
- GSList *rrules,
- GSList *rdates,
- GSList *exrules,
- GSList *exdates,
- CalObjTime *event_start,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- time_t interval_start_time,
- time_t interval_end_time,
- gint duration_days,
- gint duration_seconds,
- CalRecurInstanceFn cb,
- gpointer cb_data);
-
-static GArray* cal_obj_expand_recurrence (CalObjTime *event_start,
- CalRecurrence *recur,
- CalObjTime *interval_start,
- CalObjTime *interval_end);
-
-static GArray* cal_obj_generate_set_yearly (RecurData *recur_data,
- CalRecurVTable *vtable,
- CalObjTime *occ);
-static GArray* cal_obj_generate_set_monthly (RecurData *recur_data,
- CalRecurVTable *vtable,
- CalObjTime *occ);
-static GArray* cal_obj_generate_set_default (RecurData *recur_data,
- CalRecurVTable *vtable,
- CalObjTime *occ);
-
-
-static CalRecurVTable* cal_obj_get_vtable (CalRecurType recur_type);
-static void cal_obj_initialize_recur_data (RecurData *recur_data,
- CalRecurrence *recur,
- CalObjTime *event_start);
-static void cal_obj_sort_occurrences (GArray *occs);
-static gint cal_obj_time_compare_func (const void *arg1,
- const void *arg2);
-static void cal_obj_remove_duplicates_and_invalid_dates (GArray *occs);
-static void cal_obj_remove_exceptions (GArray *occs,
- GArray *ex_occs);
-static GArray* cal_obj_bysetpos_filter (CalRecurrence *recur,
- GArray *occs);
-
-
-static gboolean cal_obj_yearly_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime);
-static gboolean cal_obj_yearly_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end);
-
-static gboolean cal_obj_monthly_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime);
-static gboolean cal_obj_monthly_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end);
-
-static gboolean cal_obj_weekly_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime);
-static gboolean cal_obj_weekly_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end);
-
-static gboolean cal_obj_daily_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime);
-static gboolean cal_obj_daily_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end);
-
-static gboolean cal_obj_hourly_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime);
-static gboolean cal_obj_hourly_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end);
-
-static gboolean cal_obj_minutely_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime);
-static gboolean cal_obj_minutely_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end);
-
-static gboolean cal_obj_secondly_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime);
-static gboolean cal_obj_secondly_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end);
-
-static GArray* cal_obj_bymonth_expand (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_bymonth_filter (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_byweekno_expand (RecurData *recur_data,
- GArray *occs);
-#if 0
-/* This isn't used at present. */
-static GArray* cal_obj_byweekno_filter (RecurData *recur_data,
- GArray *occs);
-#endif
-static GArray* cal_obj_byyearday_expand (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_byyearday_filter (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_bymonthday_expand (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_bymonthday_filter (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_byday_expand_yearly (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_byday_expand_monthly (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_byday_expand_weekly (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_byday_filter (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_byhour_expand (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_byhour_filter (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_byminute_expand (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_byminute_filter (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_bysecond_expand (RecurData *recur_data,
- GArray *occs);
-static GArray* cal_obj_bysecond_filter (RecurData *recur_data,
- GArray *occs);
-
-static void cal_obj_time_add_months (CalObjTime *cotime,
- gint months);
-static void cal_obj_time_add_days (CalObjTime *cotime,
- gint days);
-static void cal_obj_time_subtract_days (CalObjTime *cotime,
- gint days);
-static void cal_obj_time_add_hours (CalObjTime *cotime,
- gint hours);
-static void cal_obj_time_add_minutes (CalObjTime *cotime,
- gint minutes);
-static void cal_obj_time_add_seconds (CalObjTime *cotime,
- gint seconds);
-static gint cal_obj_time_compare (CalObjTime *cotime1,
- CalObjTime *cotime2,
- CalObjTimeComparison type);
-static gint cal_obj_time_weekday (CalObjTime *cotime,
- CalRecurrence *recur);
-static gint cal_obj_time_day_of_year (CalObjTime *cotime);
-static void cal_obj_time_find_first_week (CalObjTime *cotime,
- RecurData *recur_data);
-static void cal_object_time_from_time (CalObjTime *cotime,
- time_t t);
-
-
-CalRecurVTable cal_obj_yearly_vtable = {
- cal_obj_yearly_find_start_position,
- cal_obj_yearly_find_next_position,
-
- cal_obj_bymonth_expand,
- cal_obj_byweekno_expand,
- cal_obj_byyearday_expand,
- cal_obj_bymonthday_expand,
- cal_obj_byday_expand_yearly,
- cal_obj_byhour_expand,
- cal_obj_byminute_expand,
- cal_obj_bysecond_expand
-};
-
-CalRecurVTable cal_obj_monthly_vtable = {
- cal_obj_monthly_find_start_position,
- cal_obj_monthly_find_next_position,
-
- cal_obj_bymonth_filter,
- NULL, /* BYWEEKNO is only applicable to YEARLY frequency. */
- NULL, /* BYYEARDAY is not useful in a MONTHLY frequency. */
- cal_obj_bymonthday_expand,
- cal_obj_byday_expand_monthly,
- cal_obj_byhour_expand,
- cal_obj_byminute_expand,
- cal_obj_bysecond_expand
-};
-
-CalRecurVTable cal_obj_weekly_vtable = {
- cal_obj_weekly_find_start_position,
- cal_obj_weekly_find_next_position,
-
- cal_obj_bymonth_filter,
- NULL, /* BYWEEKNO is only applicable to YEARLY frequency. */
- NULL, /* BYYEARDAY is not useful in a WEEKLY frequency. */
- NULL, /* BYMONTHDAY is not useful in a WEEKLY frequency. */
- cal_obj_byday_expand_weekly,
- cal_obj_byhour_expand,
- cal_obj_byminute_expand,
- cal_obj_bysecond_expand
-};
-
-CalRecurVTable cal_obj_daily_vtable = {
- cal_obj_daily_find_start_position,
- cal_obj_daily_find_next_position,
-
- cal_obj_bymonth_filter,
- NULL, /* BYWEEKNO is only applicable to YEARLY frequency. */
- cal_obj_byyearday_filter,
- cal_obj_bymonthday_filter,
- cal_obj_byday_filter,
- cal_obj_byhour_expand,
- cal_obj_byminute_expand,
- cal_obj_bysecond_expand
-};
-
-CalRecurVTable cal_obj_hourly_vtable = {
- cal_obj_hourly_find_start_position,
- cal_obj_hourly_find_next_position,
-
- cal_obj_bymonth_filter,
- NULL, /* BYWEEKNO is only applicable to YEARLY frequency. */
- cal_obj_byyearday_filter,
- cal_obj_bymonthday_filter,
- cal_obj_byday_filter,
- cal_obj_byhour_filter,
- cal_obj_byminute_expand,
- cal_obj_bysecond_expand
-};
-
-CalRecurVTable cal_obj_minutely_vtable = {
- cal_obj_minutely_find_start_position,
- cal_obj_minutely_find_next_position,
-
- cal_obj_bymonth_filter,
- NULL, /* BYWEEKNO is only applicable to YEARLY frequency. */
- cal_obj_byyearday_filter,
- cal_obj_bymonthday_filter,
- cal_obj_byday_filter,
- cal_obj_byhour_filter,
- cal_obj_byminute_filter,
- cal_obj_bysecond_expand
-};
-
-CalRecurVTable cal_obj_secondly_vtable = {
- cal_obj_secondly_find_start_position,
- cal_obj_secondly_find_next_position,
-
- cal_obj_bymonth_filter,
- NULL, /* BYWEEKNO is only applicable to YEARLY frequency. */
- cal_obj_byyearday_filter,
- cal_obj_bymonthday_filter,
- cal_obj_byday_filter,
- cal_obj_byhour_filter,
- cal_obj_byminute_filter,
- cal_obj_bysecond_filter
-};
-
-/*
- * Calls the given callback function for each occurrence of the event between
- * the given start and end times. If end is 0 it continues until the event
- * ends or forever if the event has an infinite recurrence rule.
- * If the callback routine return 0 the occurrence generation stops.
- */
-void
-cal_recur_generate_instances (CalComponent *comp,
- time_t start,
- time_t end,
- CalRecurInstanceFn cb,
- gpointer cb_data)
-{
- CalComponentDateTime dtstart, dtend;
- time_t dtstart_time;
- GSList *rrules, *rdates, *exrules, *exdates;
- CalObjTime interval_start, interval_end, event_start;
- CalObjTime chunk_start, chunk_end;
- gint days, seconds, year;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (cb != NULL);
-
- /* Get dtstart, dtend, recurrences, and exceptions */
-
- cal_component_get_dtstart (comp, &dtstart);
- cal_component_get_dtend (comp, &dtend);
-
- if (!dtstart.value) {
- g_message ("cal_recur_generate_instances(): bogus component, does not have "
- "DTSTART. Skipping...");
- goto out;
- }
-
- dtstart_time = time_from_icaltimetype (*dtstart.value);
-
- cal_component_get_rrule_list (comp, &rrules);
- cal_component_get_rdate_list (comp, &rdates);
- cal_component_get_exrule_list (comp, &exrules);
- cal_component_get_exdate_list (comp, &exdates);
-
- /* If there is no recurrence, just call the callback if the event
- intersects the given interval. */
-
- if (!(rrules || rdates || exrules || exdates)) {
- time_t dtend_time;
-
- if (dtend.value)
- dtend_time = time_from_icaltimetype (*dtend.value);
- else
- dtend_time = time_day_end (dtstart_time);
-
- if ((end && dtstart_time < end && dtend_time > start)
- || (end == 0 && dtend_time > start)) {
- (* cb) (comp, dtstart_time, dtend_time, cb_data);
- }
-
- goto out;
- }
-
- /* Convert the interval start & end to CalObjTime. */
- cal_object_time_from_time (&interval_start, start);
- cal_object_time_from_time (&interval_end, end);
-
- cal_object_time_from_time (&event_start, dtstart_time);
-
- /* Calculate the duration of the event, which we use for all
- occurrences. We can't just subtract start from end since that may
- be affected by daylight-saving time. We also don't want to just
- use the number of seconds, since leap seconds will then cause a
- problem. So we want a value of days + seconds. */
- cal_object_compute_duration (&interval_start, &interval_end,
- &days, &seconds);
-
- /* Expand the recurrence for each year between start & end, or until
- the callback returns 0 if end is 0. */
- for (year = interval_start.year; year <= interval_end.year; year++) {
- chunk_start = interval_start;
- chunk_start.year = year;
- chunk_end = interval_end;
- chunk_end.year = year;
-
- if (year != interval_start.year) {
- chunk_start.month = 0;
- chunk_start.day = 0;
- chunk_start.hour = 0;
- chunk_start.minute = 0;
- chunk_start.second = 0;
- }
- if (year != interval_end.year) {
- chunk_end.year++;
- chunk_end.month = 0;
- chunk_end.day = 0;
- chunk_end.hour = 0;
- chunk_end.minute = 0;
- chunk_end.second = 0;
- }
-
- if (!generate_instances_for_year (comp, dtstart_time,
- rrules, rdates,
- exrules, exdates,
- &event_start,
- &interval_start,
- &interval_end,
- start, end,
- days, seconds,
- cb, cb_data))
- break;
- }
-
- out:
- cal_component_free_datetime (&dtstart);
- cal_component_free_datetime (&dtend);
-}
-
-/* Builds a list of GINT_TO_POINTER() elements out of a short array from a
- * struct icalrecurrencetype.
- */
-static GList *
-array_to_list (short *array, int max_elements)
-{
- GList *l;
- int i;
-
- l = NULL;
-
- for (i = 0; i < max_elements && array[i] != SHRT_MAX; i++)
- l = g_list_prepend (l, GINT_TO_POINTER ((int) (array[i])));
-
- return g_list_reverse (l);
-}
-
-/**
- * cal_recur_from_icalrecurrencetype:
- * @ir: A struct #icalrecurrencetype.
- *
- * Converts a struct #icalrecurrencetype to a #CalRecurrence. This should be
- * freed using the cal_recur_free() function.
- *
- * Return value: #CalRecurrence structure.
- **/
-CalRecurrence *
-cal_recur_from_icalrecurrencetype (struct icalrecurrencetype *ir)
-{
- CalRecurrence *r;
-
- g_return_val_if_fail (ir != NULL, NULL);
-
- r = g_new (CalRecurrence, 1);
-
- switch (ir->freq) {
- case ICAL_SECONDLY_RECURRENCE:
- r->type = CAL_RECUR_SECONDLY;
- break;
-
- case ICAL_MINUTELY_RECURRENCE:
- r->type = CAL_RECUR_MINUTELY;
- break;
-
- case ICAL_HOURLY_RECURRENCE:
- r->type = CAL_RECUR_HOURLY;
- break;
-
- case ICAL_DAILY_RECURRENCE:
- r->type = CAL_RECUR_DAILY;
- break;
-
- case ICAL_WEEKLY_RECURRENCE:
- r->type = CAL_RECUR_WEEKLY;
- break;
-
- case ICAL_MONTHLY_RECURRENCE:
- r->type = CAL_RECUR_MONTHLY;
- break;
-
- case ICAL_YEARLY_RECURRENCE:
- r->type = CAL_RECUR_YEARLY;
- break;
-
- default:
- g_message ("cal_recur_from_icalrecurrencetype(): Unknown recurrence frequency %d",
- (int) ir->freq);
- g_free (r);
- return NULL;
- }
-
- r->interval = ir->interval;
-
- /* FIXME: we don't deal with ir->count. Also, how does libical
- * distinguish between n-occurrences and until-some-date rules?
- */
- r->enddate = time_from_icaltimetype (ir->until);
-
- switch (ir->week_start) {
- case ICAL_MONDAY_WEEKDAY:
- r->week_start_day = 0;
- break;
-
- case ICAL_TUESDAY_WEEKDAY:
- r->week_start_day = 1;
- break;
-
- case ICAL_WEDNESDAY_WEEKDAY:
- r->week_start_day = 2;
- break;
-
- case ICAL_THURSDAY_WEEKDAY:
- r->week_start_day = 3;
- break;
-
- case ICAL_FRIDAY_WEEKDAY:
- r->week_start_day = 4;
- break;
-
- case ICAL_SATURDAY_WEEKDAY:
- r->week_start_day = 5;
- break;
-
- case ICAL_SUNDAY_WEEKDAY:
- r->week_start_day = 6;
- break;
-
- default:
- g_message ("cal_recur_from_icalrecurrencetype(): Unknown week day %d",
- ir->week_start);
- g_free (r);
- return NULL;
- }
-
- r->bymonth = array_to_list (ir->by_month,
- sizeof (ir->by_month) / sizeof (ir->by_month[0]));
-
- r->byweekno = array_to_list (ir->by_week_no,
- sizeof (ir->by_week_no) / sizeof (ir->by_week_no[0]));
-
- r->byyearday = array_to_list (ir->by_year_day,
- sizeof (ir->by_year_day) / sizeof (ir->by_year_day[0]));
-
- r->bymonthday = array_to_list (ir->by_month_day,
- sizeof (ir->by_month_day) / sizeof (ir->by_month_day[0]));
-
- r->byday = NULL; /* FIXME: libical sucks in this respect */
-
- r->byhour = array_to_list (ir->by_hour,
- sizeof (ir->by_hour) / sizeof (ir->by_hour[0]));
-
- r->byminute = array_to_list (ir->by_minute,
- sizeof (ir->by_minute) / sizeof (ir->by_minute[0]));
-
- r->bysecond = array_to_list (ir->by_second,
- sizeof (ir->by_second) / sizeof (ir->by_second[0]));
-
- r->bysetpos = array_to_list (ir->by_set_pos,
- sizeof (ir->by_set_pos) / sizeof (ir->by_set_pos[0]));
-
- return r;
-}
-
-/**
- * cal_recur_free:
- * @r: A #CalRecurrence structure.
- *
- * Frees a #CalRecurrence structure.
- **/
-void
-cal_recur_free (CalRecurrence *r)
-{
- g_return_if_fail (r != NULL);
-
- g_list_free (r->bymonth);
- g_list_free (r->byweekno);
- g_list_free (r->byyearday);
- g_list_free (r->bymonthday);
- g_list_free (r->byday);
- g_list_free (r->byhour);
- g_list_free (r->byminute);
- g_list_free (r->bysecond);
- g_list_free (r->bysetpos);
-
- g_free (r);
-}
-
-/* Generates one year's worth of recurrence instances. Returns TRUE if all the
- * callback invocations returned TRUE, or FALSE when any one of them returns
- * FALSE, i.e. meaning that the instance generation should be stopped.
- */
-static gboolean
-generate_instances_for_year (CalComponent *comp,
- time_t comp_dtstart,
- GSList *rrules,
- GSList *rdates,
- GSList *exrules,
- GSList *exdates,
- CalObjTime *event_start,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- time_t interval_start_time,
- time_t interval_end_time,
- gint duration_days,
- gint duration_seconds,
- CalRecurInstanceFn cb,
- gpointer cb_data)
-{
- GArray *occs, *ex_occs, *tmp_occs;
- CalObjTime cotime, *occ;
- GSList *elem;
- gint i, status;
- time_t start_time, end_time;
- struct tm start_tm, end_tm;
-
- occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
- ex_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- /* Expand each of the recurrence rules. */
- for (elem = rrules; elem; elem = elem->next) {
- struct icalrecurrencetype *ir;
- CalRecurrence *r;
-
- ir = elem->data;
- r = cal_recur_from_icalrecurrencetype (ir);
-
- tmp_occs = cal_obj_expand_recurrence (event_start, r,
- interval_start,
- interval_end);
- cal_recur_free (r);
-
- g_array_append_vals (occs, tmp_occs->data, tmp_occs->len);
- g_array_free (tmp_occs, TRUE);
- }
-
- /* Add on specific occurrence dates. */
- for (elem = rdates; elem; elem = elem->next) {
- CalComponentPeriod *period;
- time_t t;
-
- /* FIXME: this only deals with the start time */
-
- period = elem->data;
- t = time_from_icaltimetype (period->start);
-
- cal_object_time_from_time (&cotime, t);
- g_array_append_val (occs, cotime);
- }
-
- /* Expand each of the exception rules. */
- for (elem = exrules; elem; elem = elem->next) {
- struct icalrecurrencetype *ir;
- CalRecurrence *r;
-
- ir = elem->data;
- r = cal_recur_from_icalrecurrencetype (ir);
-
- tmp_occs = cal_obj_expand_recurrence (event_start, r,
- interval_start,
- interval_end);
- cal_recur_free (r);
-
- g_array_append_vals (ex_occs, tmp_occs->data, tmp_occs->len);
- g_array_free (tmp_occs, TRUE);
- }
-
- /* Add on specific exception dates. */
- for (elem = exdates; elem; elem = elem->next) {
- CalComponentPeriod *period;
- time_t t;
-
- /* FIXME: this only deals with the start time */
-
- period = elem->data;
- t = time_from_icaltimetype (period->start);
-
- cal_object_time_from_time (&cotime, t);
- g_array_append_val (ex_occs, cotime);
- }
-
-
- /* Sort both arrays. */
- cal_obj_sort_occurrences (occs);
- cal_obj_sort_occurrences (ex_occs);
-
- /* Create the final array, by removing the exceptions from the
- occurrences, and removing any duplicates. */
- cal_obj_remove_exceptions (occs, ex_occs);
-
-
- /* Call the callback for each occurrence. If it returns 0 we break
- out of the loop. */
- for (i = 0; i < occs->len; i++) {
- /* Convert each CalObjTime into a start & end time_t, and
- check it is within the bounds of the event & interval. */
- occ = &g_array_index (occs, CalObjTime, i);
-
- start_tm.tm_year = occ->year - 1900;
- start_tm.tm_mon = occ->month;
- start_tm.tm_mday = occ->day;
- start_tm.tm_hour = occ->hour;
- start_tm.tm_min = occ->minute;
- start_tm.tm_sec = occ->second;
- start_time = mktime (&start_tm);
-
- if (start_time < comp_dtstart
- || start_time >= interval_end_time)
- continue;
-
- cal_obj_time_add_days (occ, duration_days);
- cal_obj_time_add_seconds (occ, duration_seconds);
-
- end_tm.tm_year = occ->year - 1900;
- end_tm.tm_mon = occ->month;
- end_tm.tm_mday = occ->day;
- end_tm.tm_hour = occ->hour;
- end_tm.tm_min = occ->minute;
- end_tm.tm_sec = occ->second;
- end_time = mktime (&end_tm);
-
- if (end_time < interval_start_time)
- continue;
-
- status = (*cb) (comp, start_time, end_time, cb_data);
- if (!status)
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-static void
-cal_object_compute_duration (CalObjTime *start,
- CalObjTime *end,
- gint *days,
- gint *seconds)
-{
- GDate start_date, end_date;
- gint start_seconds, end_seconds;
-
- g_date_clear (&start_date, 1);
- g_date_clear (&end_date, 1);
- g_date_set_dmy (&start_date, start->day, start->month + 1,
- start->year);
- g_date_set_dmy (&end_date, end->day, end->month + 1,
- end->year);
-
- *days = g_date_julian (&end_date) - g_date_julian (&start_date);
- start_seconds = start->hour * 3600 + start->minute * 60
- + start->second;
- end_seconds = end->hour * 3600 + end->minute * 60 + end->second;
-
- *seconds = end_seconds - start_seconds;
- if (*seconds < 0) {
- *days = *days - 1;
- *seconds += 24 * 60 * 60;
- }
-}
-
-
-/* Returns an unsorted GArray of CalObjTime's resulting from expanding the
- given recurrence rule within the given interval. Note that it doesn't
- clip the generated occurrences to the interval, i.e. if the interval
- starts part way through the year this function still returns all the
- occurrences for the year. Clipping is done later. */
-static GArray*
-cal_obj_expand_recurrence (CalObjTime *event_start,
- CalRecurrence *recur,
- CalObjTime *interval_start,
- CalObjTime *interval_end)
-{
- CalRecurVTable *vtable;
- CalObjTime *event_end = NULL, event_end_cotime;
- RecurData recur_data;
- CalObjTime occ, *cotime;
- GArray *all_occs, *occs;
- gint len;
-
- vtable = cal_obj_get_vtable (recur->type);
-
- /* This is the resulting array of CalObjTime elements. */
- all_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- /* Calculate some useful data such as some fast lookup tables. */
- cal_obj_initialize_recur_data (&recur_data, recur, event_start);
-
- /* Compute the event_end, if the recur's enddate is set. */
- if (recur->enddate) {
- cal_object_time_from_time (&event_end_cotime,
- recur->enddate);
- event_end = &event_end_cotime;
- }
-
- /* Get the first period based on the frequency and the interval that
- intersects the interval between start and end. */
- if ((*vtable->find_start_position) (event_start, event_end,
- &recur_data,
- interval_start, interval_end,
- &occ))
- return all_occs;
-
- /* Loop until the event ends or we go past the end of the required
- interval. */
- for (;;) {
- /* Generate the set of occurrences for this period. */
- switch (recur->type) {
- case CAL_RECUR_YEARLY:
- occs = cal_obj_generate_set_yearly (&recur_data,
- vtable, &occ);
- break;
- case CAL_RECUR_MONTHLY:
- occs = cal_obj_generate_set_monthly (&recur_data,
- vtable, &occ);
- break;
- default:
- occs = cal_obj_generate_set_default (&recur_data,
- vtable, &occ);
- break;
- }
-
- /* Sort the occurrences and remove duplicates. */
- cal_obj_sort_occurrences (occs);
- cal_obj_remove_duplicates_and_invalid_dates (occs);
-
- /* Apply the BYSETPOS property. */
- occs = cal_obj_bysetpos_filter (recur, occs);
-
- /* Remove any occs after event_end. */
- len = occs->len - 1;
- if (event_end) {
- while (len >= 0) {
- cotime = &g_array_index (occs, CalObjTime,
- len);
- if (cal_obj_time_compare_func (cotime,
- event_end) <= 0)
- break;
- len--;
- }
- }
-
- /* Add the occurrences onto the main array. */
- if (len >= 0)
- g_array_append_vals (all_occs, occs->data, len + 1);
-
- g_array_free (occs, TRUE);
-
- /* Skip to the next period, or exit the loop if finished. */
- if ((*vtable->find_next_position) (&occ, event_end,
- &recur_data, interval_end))
- break;
- }
-
- return all_occs;
-}
-
-
-static GArray*
-cal_obj_generate_set_yearly (RecurData *recur_data,
- CalRecurVTable *vtable,
- CalObjTime *occ)
-{
- CalRecurrence *recur = recur_data->recur;
- GArray *occs_arrays[4], *occs, *occs2;
- gint num_occs_arrays = 0, i;
-
- /* This is a bit complicated, since the iCalendar spec says that
- several BYxxx modifiers can be used simultaneously. So we have to
- be quite careful when determining the days of the occurrences.
- The BYHOUR, BYMINUTE & BYSECOND modifiers are no problem at all.
-
- The modifiers we have to worry about are: BYMONTH, BYWEEKNO,
- BYYEARDAY, BYMONTHDAY & BYDAY. We can't do these sequentially
- since each filter will mess up the results of the previous one.
- But they aren't all completely independant, e.g. BYMONTHDAY and
- BYDAY are related to BYMONTH, and BYDAY is related to BYWEEKNO.
-
- BYDAY & BYMONTHDAY can also be applied independently, which makes
- it worse. So we assume that if BYMONTH or BYWEEKNO is used, then
- the BYDAY modifier applies to those, else it is applied
- independantly.
-
- We expand the occurrences in parallel into the occs_arrays[] array,
- and then merge them all into one GArray before expanding BYHOUR,
- BYMINUTE & BYSECOND. */
-
- if (recur->bymonth) {
- occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
- g_array_append_vals (occs, occ, 1);
-
- occs = (*vtable->bymonth_filter) (recur_data, occs);
-
- /* If BYMONTHDAY & BYDAY are both set we need to expand them
- in parallel and add the results. */
- if (recur->bymonthday && recur->byday) {
- /* Copy the occs array. */
- occs2 = g_array_new (FALSE, FALSE,
- sizeof (CalObjTime));
- g_array_append_vals (occs2, occs->data, occs->len);
-
- occs = (*vtable->bymonthday_filter) (recur_data, occs);
- /* Note that we explicitly call the monthly version
- of the BYDAY expansion filter. */
- occs2 = cal_obj_byday_expand_monthly (recur_data,
- occs2);
-
- /* Add the 2 resulting arrays together. */
- g_array_append_vals (occs, occs2->data, occs2->len);
- g_array_free (occs2, TRUE);
- } else {
- occs = (*vtable->bymonthday_filter) (recur_data, occs);
- /* Note that we explicitly call the monthly version
- of the BYDAY expansion filter. */
- occs = cal_obj_byday_expand_monthly (recur_data, occs);
- }
-
- occs_arrays[num_occs_arrays++] = occs;
- }
-
- if (recur->byweekno) {
- occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
- g_array_append_vals (occs, occ, 1);
-
- occs = (*vtable->byweekno_filter) (recur_data, occs);
- /* Note that we explicitly call the weekly version of the
- BYDAY expansion filter. */
- occs = cal_obj_byday_expand_weekly (recur_data, occs);
-
- occs_arrays[num_occs_arrays++] = occs;
- }
-
- if (recur->byyearday) {
- occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
- g_array_append_vals (occs, occ, 1);
-
- occs = (*vtable->byyearday_filter) (recur_data, occs);
-
- occs_arrays[num_occs_arrays++] = occs;
- }
-
- /* If BYMONTHDAY is set, and BYMONTH is not set, we need to
- expand BYMONTHDAY independantly. */
- if (recur->bymonthday && !recur->bymonth) {
- occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
- g_array_append_vals (occs, occ, 1);
-
- occs = (*vtable->bymonthday_filter) (recur_data, occs);
-
- occs_arrays[num_occs_arrays++] = occs;
- }
-
- /* If BYDAY is set, and BYMONTH and BYWEEKNO are not set, we need to
- expand BYDAY independantly. */
- if (recur->byday && !recur->bymonth && !recur->byweekno) {
- occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
- g_array_append_vals (occs, occ, 1);
-
- occs = (*vtable->byday_filter) (recur_data, occs);
-
- occs_arrays[num_occs_arrays++] = occs;
- }
-
- /* Add all the arrays together. */
- occs = occs_arrays[0];
- for (i = 1; i < num_occs_arrays; i++) {
- occs2 = occs_arrays[i];
- g_array_append_vals (occs, occs2->data, occs2->len);
- g_array_free (occs2, TRUE);
- }
-
- /* Now expand BYHOUR, BYMINUTE & BYSECOND. */
- occs = (*vtable->byhour_filter) (recur_data, occs);
- occs = (*vtable->byminute_filter) (recur_data, occs);
- occs = (*vtable->bysecond_filter) (recur_data, occs);
-
- return occs;
-}
-
-
-static GArray*
-cal_obj_generate_set_monthly (RecurData *recur_data,
- CalRecurVTable *vtable,
- CalObjTime *occ)
-{
- GArray *occs, *occs2;
-
- /* We start with just the one time in each set. */
- occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
- g_array_append_vals (occs, occ, 1);
-
- occs = (*vtable->bymonth_filter) (recur_data, occs);
-
- /* We need to combine the output of BYMONTHDAY & BYDAY, by doing them
- in parallel rather than sequentially. If we did them sequentially
- then we would lose the occurrences generated by BYMONTHDAY, and
- instead have repetitions of the occurrences from BYDAY. */
- if (recur_data->recur->bymonthday && recur_data->recur->byday) {
- occs2 = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
- g_array_append_vals (occs2, occs->data, occs->len);
-
- occs = (*vtable->bymonthday_filter) (recur_data, occs);
- occs2 = (*vtable->byday_filter) (recur_data, occs2);
-
- g_array_append_vals (occs, occs2->data, occs2->len);
- g_array_free (occs2, TRUE);
- } else {
- occs = (*vtable->bymonthday_filter) (recur_data, occs);
- occs = (*vtable->byday_filter) (recur_data, occs);
- }
-
- occs = (*vtable->byhour_filter) (recur_data, occs);
- occs = (*vtable->byminute_filter) (recur_data, occs);
- occs = (*vtable->bysecond_filter) (recur_data, occs);
-
- return occs;
-}
-
-
-static GArray*
-cal_obj_generate_set_default (RecurData *recur_data,
- CalRecurVTable *vtable,
- CalObjTime *occ)
-{
- GArray *occs;
-#if 0
- g_print ("Generating set for %i/%i/%i %02i:%02i:%02i\n",
- occ->day, occ->month, occ->year, occ->hour, occ->minute,
- occ->second);
-#endif
- /* We start with just the one time in the set. */
- occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
- g_array_append_vals (occs, occ, 1);
-
- occs = (*vtable->bymonth_filter) (recur_data, occs);
- if (vtable->byweekno_filter)
- occs = (*vtable->byweekno_filter) (recur_data, occs);
- if (vtable->byyearday_filter)
- occs = (*vtable->byyearday_filter) (recur_data, occs);
- if (vtable->bymonthday_filter)
- occs = (*vtable->bymonthday_filter) (recur_data, occs);
- occs = (*vtable->byday_filter) (recur_data, occs);
-
- occs = (*vtable->byhour_filter) (recur_data, occs);
- occs = (*vtable->byminute_filter) (recur_data, occs);
- occs = (*vtable->bysecond_filter) (recur_data, occs);
-
- return occs;
-}
-
-
-
-/* Returns the function table corresponding to the recurrence frequency. */
-static CalRecurVTable*
-cal_obj_get_vtable (CalRecurType recur_type)
-{
- switch (recur_type) {
- case CAL_RECUR_YEARLY:
- return &cal_obj_yearly_vtable;
- case CAL_RECUR_MONTHLY:
- return &cal_obj_monthly_vtable;
- case CAL_RECUR_WEEKLY:
- return &cal_obj_weekly_vtable;
- case CAL_RECUR_DAILY:
- return &cal_obj_daily_vtable;
- case CAL_RECUR_HOURLY:
- return &cal_obj_hourly_vtable;
- case CAL_RECUR_MINUTELY:
- return &cal_obj_minutely_vtable;
- case CAL_RECUR_SECONDLY:
- return &cal_obj_secondly_vtable;
- }
- return NULL;
-}
-
-
-/* This creates a number of fast lookup tables used when filtering with the
- modifier properties BYMONTH, BYYEARDAY etc. */
-static void
-cal_obj_initialize_recur_data (RecurData *recur_data,
- CalRecurrence *recur,
- CalObjTime *event_start)
-{
- GList *elem;
- gint month, yearday, monthday, weekday, week_num, hour, minute, second;
-
- /* Clear the entire RecurData. */
- memset (recur_data, 0, sizeof (RecurData));
-
- recur_data->recur = recur;
-
- /* Set the weekday, used for the WEEKLY frequency and the BYWEEKNO
- modifier. */
- recur_data->weekday = cal_obj_time_weekday (event_start, recur);
-
- /* Create an array of months from bymonths for fast lookup. */
- elem = recur->bymonth;
- while (elem) {
- month = GPOINTER_TO_INT (elem->data);
- recur_data->months[month] = 1;
- elem = elem->next;
- }
-
- /* Create an array of yeardays from byyearday for fast lookup.
- We create a second array to handle the negative values. The first
- element there corresponds to the last day of the year. */
- elem = recur->byyearday;
- while (elem) {
- yearday = GPOINTER_TO_INT (elem->data);
- if (yearday >= 0)
- recur_data->yeardays[yearday] = 1;
- else
- recur_data->neg_yeardays[-yearday] = 1;
- elem = elem->next;
- }
-
- /* Create an array of monthdays from bymonthday for fast lookup.
- We create a second array to handle the negative values. The first
- element there corresponds to the last day of the month. */
- elem = recur->bymonthday;
- while (elem) {
- monthday = GPOINTER_TO_INT (elem->data);
- if (monthday >= 0)
- recur_data->monthdays[monthday] = 1;
- else
- recur_data->neg_monthdays[-monthday] = 1;
- elem = elem->next;
- }
-
- /* Create an array of weekdays from byday for fast lookup. */
- elem = recur->byday;
- while (elem) {
- weekday = GPOINTER_TO_INT (elem->data);
- elem = elem->next;
- /* The week number is not used when filtering. */
- week_num = GPOINTER_TO_INT (elem->data);
- elem = elem->next;
-
- recur_data->weekdays[weekday] = 1;
- }
-
- /* Create an array of hours from byhour for fast lookup. */
- elem = recur->byhour;
- while (elem) {
- hour = GPOINTER_TO_INT (elem->data);
- recur_data->hours[hour] = 1;
- elem = elem->next;
- }
-
- /* Create an array of minutes from byminutes for fast lookup. */
- elem = recur->byminute;
- while (elem) {
- minute = GPOINTER_TO_INT (elem->data);
- recur_data->minutes[minute] = 1;
- elem = elem->next;
- }
-
- /* Create an array of seconds from byseconds for fast lookup. */
- elem = recur->bysecond;
- while (elem) {
- second = GPOINTER_TO_INT (elem->data);
- recur_data->seconds[second] = 1;
- elem = elem->next;
- }
-}
-
-
-static void
-cal_obj_sort_occurrences (GArray *occs)
-{
- qsort (occs->data, occs->len, sizeof (CalObjTime),
- cal_obj_time_compare_func);
-}
-
-
-static void
-cal_obj_remove_duplicates_and_invalid_dates (GArray *occs)
-{
- static const int days_in_month[12] = {
- 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
- };
-
- CalObjTime *occ, *prev_occ = NULL;
- gint len, i, j = 0, year, month, days;
- gboolean keep_occ;
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
- keep_occ = TRUE;
-
- if (prev_occ && cal_obj_time_compare_func (occ,
- prev_occ) == 0)
- keep_occ = FALSE;
-
- year = occ->year;
- month = occ->month;
- days = days_in_month[occ->month];
- /* If it is february and a leap year, add a day. */
- if (month == 1 && (year % 4 == 0
- && (year % 100 != 0
- || year % 400 == 0)))
- days++;
- if (occ->day > days)
- keep_occ = FALSE;
-
- if (keep_occ) {
- if (i != j)
- g_array_index (occs, CalObjTime, j)
- = g_array_index (occs, CalObjTime, i);
- j++;
- }
-
- prev_occ = occ;
- }
-
- g_array_set_size (occs, j);
-}
-
-
-/* Removes the exceptions from the ex_occs array from the occurrences in the
- occs array, and removes any duplicates. Both arrays are sorted. */
-static void
-cal_obj_remove_exceptions (GArray *occs,
- GArray *ex_occs)
-{
- CalObjTime *occ, *prev_occ = NULL, *ex_occ;
- gint i, j = 0, cmp, ex_index, occs_len, ex_occs_len;
- gboolean keep_occ;
-
- if (occs->len == 0 || ex_occs->len == 0)
- return;
-
- ex_index = 0;
- occs_len = occs->len;
- ex_occs_len = ex_occs->len;
-
- ex_occ = &g_array_index (ex_occs, CalObjTime, ex_index);
- for (i = 0; i < occs_len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
- keep_occ = TRUE;
-
- /* If the occurrence is a duplicate of the previous one, skip
- it. */
- if (prev_occ
- && cal_obj_time_compare_func (occ, prev_occ) == 0) {
- keep_occ = FALSE;
- } else if (ex_occ) {
- /* Step through the exceptions until we come to one
- that matches or follows this occurrence. */
- while (ex_occ) {
- cmp = cal_obj_time_compare_func (ex_occ, occ);
- if (cmp > 0)
- break;
-
- /* Move to the next exception, or set ex_occ
- to NULL when we reach the end of array. */
- ex_index++;
- if (ex_index < ex_occs_len)
- ex_occ = &g_array_index (ex_occs,
- CalObjTime,
- ex_index);
- else
- ex_occ = NULL;
-
- /* If the current exception matches this
- occurrence we remove it. */
- if (cmp == 0) {
- keep_occ = FALSE;
- break;
- }
- }
- }
-
- if (keep_occ) {
- if (i != j)
- g_array_index (occs, CalObjTime, j)
- = g_array_index (occs, CalObjTime, i);
- j++;
- }
-
- prev_occ = occ;
- }
-
- g_array_set_size (occs, j);
-}
-
-
-
-static GArray*
-cal_obj_bysetpos_filter (CalRecurrence *recur,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- GList *elem;
- gint len, pos;
-
- /* If BYSETPOS has not been specified, or the array is empty, just
- return the array. */
- elem = recur->bysetpos;
- if (!elem || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- /* Iterate over the indices given in bysetpos, adding the corresponding
- element from occs to new_occs. */
- len = occs->len;
- while (elem) {
- pos = GPOINTER_TO_INT (elem->data);
-
- /* Negative values count back from the end of the array. */
- if (pos < 0)
- pos += len;
-
- if (pos >= 0 && pos < len) {
- occ = &g_array_index (occs, CalObjTime, pos);
- g_array_append_vals (new_occs, occ, 1);
- }
- elem = elem->next;
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-
-
-/* Finds the first year from the event_start, counting in multiples of the
- recurrence interval, that intersects the given interval. It returns TRUE
- if there is no intersection. */
-static gboolean
-cal_obj_yearly_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime)
-{
- *cotime = *event_start;
-
- /* Move on to the next interval, if the event starts before the
- given interval. */
- if (cotime->year < interval_start->year) {
- gint years = interval_start->year - cotime->year
- + recur_data->recur->interval - 1;
- years -= years % recur_data->recur->interval;
- /* NOTE: The day may now be invalid, e.g. 29th Feb. */
- cotime->year += years;
- }
-
- if ((event_end && cotime->year > event_end->year)
- || (interval_end && cotime->year > interval_end->year))
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_yearly_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end)
-{
- /* NOTE: The day may now be invalid, e.g. 29th Feb. */
- cotime->year += recur_data->recur->interval;
-
- if ((event_end && cotime->year > event_end->year)
- || (interval_end && cotime->year > interval_end->year))
- return TRUE;
-
- return FALSE;
-}
-
-
-
-static gboolean
-cal_obj_monthly_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime)
-{
- *cotime = *event_start;
-
- /* Move on to the next interval, if the event starts before the
- given interval. */
- if (cal_obj_time_compare (cotime, interval_start, CALOBJ_MONTH) < 0) {
- gint months = (interval_start->year - cotime->year) * 12
- + interval_start->month - cotime->month
- + recur_data->recur->interval - 1;
- months -= months % recur_data->recur->interval;
- /* NOTE: The day may now be invalid, e.g. 31st Sep. */
- cal_obj_time_add_months (cotime, months);
- }
-
- if (event_end && cal_obj_time_compare (cotime, event_end,
- CALOBJ_MONTH) > 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (cotime, interval_end,
- CALOBJ_MONTH) > 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_monthly_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end)
-{
- /* NOTE: The day may now be invalid, e.g. 31st Sep. */
- cal_obj_time_add_months (cotime, recur_data->recur->interval);
-
- if (event_end && cal_obj_time_compare (cotime, event_end,
- CALOBJ_MONTH) > 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (cotime, interval_end,
- CALOBJ_MONTH) > 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-
-static gboolean
-cal_obj_weekly_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime)
-{
- GDate event_start_date, interval_start_date;
- guint32 event_start_julian, interval_start_julian;
- gint interval_start_weekday;
- CalObjTime week_start;
-
- if (event_end && cal_obj_time_compare (event_end, interval_start,
- CALOBJ_DAY) < 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (event_start, interval_end,
- CALOBJ_DAY) > 0)
- return TRUE;
-
- *cotime = *event_start;
-
- /* Convert the event start and interval start to GDates, so we can
- easily find the number of days between them. */
- g_date_clear (&event_start_date, 1);
- g_date_set_dmy (&event_start_date, event_start->day,
- event_start->month + 1, event_start->year);
- g_date_clear (&interval_start_date, 1);
- g_date_set_dmy (&interval_start_date, interval_start->day,
- interval_start->month + 1, interval_start->year);
-
- /* Calculate the start of the weeks corresponding to the event start
- and interval start. */
- event_start_julian = g_date_julian (&event_start_date);
- event_start_julian -= recur_data->weekday;
-
- interval_start_julian = g_date_julian (&interval_start_date);
- interval_start_weekday = cal_obj_time_weekday (interval_start,
- recur_data->recur);
- interval_start_julian -= interval_start_weekday;
-
- /* We want to find the first full week using the recurrence interval
- that intersects the given interval dates. */
- if (event_start_julian < interval_start_julian) {
- gint weeks = (interval_start_julian - event_start_julian) / 7;
- weeks += recur_data->recur->interval - 1;
- weeks -= weeks % recur_data->recur->interval;
- cal_obj_time_add_days (cotime, weeks * 7);
- }
-
- week_start = *cotime;
- cal_obj_time_subtract_days (&week_start, recur_data->weekday);
-
- if (event_end && cal_obj_time_compare (&week_start, event_end,
- CALOBJ_DAY) > 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (&week_start, interval_end,
- CALOBJ_DAY) > 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_weekly_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end)
-{
- CalObjTime week_start;
-
- cal_obj_time_add_days (cotime, recur_data->recur->interval * 7);
-
- /* Return TRUE if the start of this week is after the event finishes
- or is after the end of the required interval. */
- week_start = *cotime;
- cal_obj_time_subtract_days (&week_start, recur_data->weekday);
-
- if (event_end && cal_obj_time_compare (&week_start, event_end,
- CALOBJ_DAY) > 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (&week_start, interval_end,
- CALOBJ_DAY) > 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_daily_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime)
-{
- GDate event_start_date, interval_start_date;
- guint32 event_start_julian, interval_start_julian, days;
-
- if (interval_end && cal_obj_time_compare (event_start, interval_end,
- CALOBJ_DAY) > 0)
- return TRUE;
- if (event_end && cal_obj_time_compare (event_end, interval_start,
- CALOBJ_DAY) < 0)
- return TRUE;
-
- *cotime = *event_start;
-
- /* Convert the event start and interval start to GDates, so we can
- easily find the number of days between them. */
- g_date_clear (&event_start_date, 1);
- g_date_set_dmy (&event_start_date, event_start->day,
- event_start->month + 1, event_start->year);
- g_date_clear (&interval_start_date, 1);
- g_date_set_dmy (&interval_start_date, interval_start->day,
- interval_start->month + 1, interval_start->year);
-
- event_start_julian = g_date_julian (&event_start_date);
- interval_start_julian = g_date_julian (&interval_start_date);
-
- if (event_start_julian < interval_start_julian) {
- days = interval_start_julian - event_start_julian
- + recur_data->recur->interval - 1;
- days -= days % recur_data->recur->interval;
- cal_obj_time_add_days (cotime, days);
- }
-
- if (event_end && cal_obj_time_compare (cotime, event_end,
- CALOBJ_DAY) > 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (cotime, interval_end,
- CALOBJ_DAY) > 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_daily_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end)
-{
- cal_obj_time_add_days (cotime, recur_data->recur->interval);
-
- if (event_end && cal_obj_time_compare (cotime, event_end,
- CALOBJ_DAY) > 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (cotime, interval_end,
- CALOBJ_DAY) > 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_hourly_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime)
-{
- GDate event_start_date, interval_start_date;
- guint32 event_start_julian, interval_start_julian, hours;
-
- if (interval_end && cal_obj_time_compare (event_start, interval_end,
- CALOBJ_HOUR) > 0)
- return TRUE;
- if (event_end && cal_obj_time_compare (event_end, interval_start,
- CALOBJ_HOUR) < 0)
- return TRUE;
-
- *cotime = *event_start;
-
- if (cal_obj_time_compare (event_start, interval_start,
- CALOBJ_HOUR) < 0) {
- /* Convert the event start and interval start to GDates, so we
- can easily find the number of days between them. */
- g_date_clear (&event_start_date, 1);
- g_date_set_dmy (&event_start_date, event_start->day,
- event_start->month + 1, event_start->year);
- g_date_clear (&interval_start_date, 1);
- g_date_set_dmy (&interval_start_date, interval_start->day,
- interval_start->month + 1,
- interval_start->year);
-
- event_start_julian = g_date_julian (&event_start_date);
- interval_start_julian = g_date_julian (&interval_start_date);
-
- hours = (interval_start_julian - event_start_julian) * 24;
- hours += interval_start->hour - event_start->hour;
- hours += recur_data->recur->interval - 1;
- hours -= hours % recur_data->recur->interval;
- cal_obj_time_add_hours (cotime, hours);
- }
-
- if (event_end && cal_obj_time_compare (cotime, event_end,
- CALOBJ_HOUR) > 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (cotime, interval_end,
- CALOBJ_HOUR) > 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_hourly_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end)
-{
- cal_obj_time_add_hours (cotime, recur_data->recur->interval);
-
- if (event_end && cal_obj_time_compare (cotime, event_end,
- CALOBJ_HOUR) > 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (cotime, interval_end,
- CALOBJ_HOUR) > 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_minutely_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime)
-{
- GDate event_start_date, interval_start_date;
- guint32 event_start_julian, interval_start_julian, minutes;
-
- if (interval_end && cal_obj_time_compare (event_start, interval_end,
- CALOBJ_MINUTE) > 0)
- return TRUE;
- if (event_end && cal_obj_time_compare (event_end, interval_start,
- CALOBJ_MINUTE) < 0)
- return TRUE;
-
- *cotime = *event_start;
-
- if (cal_obj_time_compare (event_start, interval_start,
- CALOBJ_MINUTE) < 0) {
- /* Convert the event start and interval start to GDates, so we
- can easily find the number of days between them. */
- g_date_clear (&event_start_date, 1);
- g_date_set_dmy (&event_start_date, event_start->day,
- event_start->month + 1, event_start->year);
- g_date_clear (&interval_start_date, 1);
- g_date_set_dmy (&interval_start_date, interval_start->day,
- interval_start->month + 1,
- interval_start->year);
-
- event_start_julian = g_date_julian (&event_start_date);
- interval_start_julian = g_date_julian (&interval_start_date);
-
- minutes = (interval_start_julian - event_start_julian)
- * 24 * 60;
- minutes += (interval_start->hour - event_start->hour) * 24;
- minutes += interval_start->minute - event_start->minute;
- minutes += recur_data->recur->interval - 1;
- minutes -= minutes % recur_data->recur->interval;
- cal_obj_time_add_minutes (cotime, minutes);
- }
-
- if (event_end && cal_obj_time_compare (cotime, event_end,
- CALOBJ_MINUTE) > 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (cotime, interval_end,
- CALOBJ_MINUTE) > 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_minutely_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end)
-{
- cal_obj_time_add_minutes (cotime, recur_data->recur->interval);
-
- if (event_end && cal_obj_time_compare (cotime, event_end,
- CALOBJ_MINUTE) > 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (cotime, interval_end,
- CALOBJ_MINUTE) > 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_secondly_find_start_position (CalObjTime *event_start,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_start,
- CalObjTime *interval_end,
- CalObjTime *cotime)
-{
- GDate event_start_date, interval_start_date;
- guint32 event_start_julian, interval_start_julian, seconds;
-
- if (interval_end && cal_obj_time_compare (event_start, interval_end,
- CALOBJ_SECOND) > 0)
- return TRUE;
- if (event_end && cal_obj_time_compare (event_end, interval_start,
- CALOBJ_SECOND) < 0)
- return TRUE;
-
- *cotime = *event_start;
-
- if (cal_obj_time_compare (event_start, interval_start,
- CALOBJ_SECOND) < 0) {
- /* Convert the event start and interval start to GDates, so we
- can easily find the number of days between them. */
- g_date_clear (&event_start_date, 1);
- g_date_set_dmy (&event_start_date, event_start->day,
- event_start->month + 1, event_start->year);
- g_date_clear (&interval_start_date, 1);
- g_date_set_dmy (&interval_start_date, interval_start->day,
- interval_start->month + 1,
- interval_start->year);
-
- event_start_julian = g_date_julian (&event_start_date);
- interval_start_julian = g_date_julian (&interval_start_date);
-
- seconds = (interval_start_julian - event_start_julian)
- * 24 * 60 * 60;
- seconds += (interval_start->hour - event_start->hour)
- * 24 * 60;
- seconds += (interval_start->minute - event_start->minute) * 60;
- seconds += interval_start->second - event_start->second;
- seconds += recur_data->recur->interval - 1;
- seconds -= seconds % recur_data->recur->interval;
- cal_obj_time_add_seconds (cotime, seconds);
- }
-
- if (event_end && cal_obj_time_compare (cotime, event_end,
- CALOBJ_SECOND) >= 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (cotime, interval_end,
- CALOBJ_SECOND) >= 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-static gboolean
-cal_obj_secondly_find_next_position (CalObjTime *cotime,
- CalObjTime *event_end,
- RecurData *recur_data,
- CalObjTime *interval_end)
-{
- cal_obj_time_add_seconds (cotime, recur_data->recur->interval);
-
- if (event_end && cal_obj_time_compare (cotime, event_end,
- CALOBJ_SECOND) >= 0)
- return TRUE;
- if (interval_end && cal_obj_time_compare (cotime, interval_end,
- CALOBJ_SECOND) >= 0)
- return TRUE;
-
- return FALSE;
-}
-
-
-
-
-
-/* If the BYMONTH rule is specified it expands each occurrence in occs, by
- using each of the months in the bymonth list. */
-static GArray*
-cal_obj_bymonth_expand (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- GList *elem;
- gint len, i;
-
- /* If BYMONTH has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->bymonth || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- elem = recur_data->recur->bymonth;
- while (elem) {
- /* NOTE: The day may now be invalid, e.g. 31st Feb. */
- occ->month = GPOINTER_TO_INT (elem->data);
- g_array_append_vals (new_occs, occ, 1);
- elem = elem->next;
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-/* If the BYMONTH rule is specified it filters out all occurrences in occs
- which do not match one of the months in the bymonth list. */
-static GArray*
-cal_obj_bymonth_filter (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- gint len, i;
-
- /* If BYMONTH has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->bymonth || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
- if (recur_data->months[occ->month])
- g_array_append_vals (new_occs, occ, 1);
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-
-static GArray*
-cal_obj_byweekno_expand (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ, year_start_cotime, year_end_cotime, cotime;
- GList *elem;
- gint len, i, weekno;
-
- /* If BYWEEKNO has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byweekno || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- /* Find the day that would correspond to week 1 (note that
- week 1 is the first week starting from the specified week
- start day that has 4 days in the new year). */
- year_start_cotime = *occ;
- cal_obj_time_find_first_week (&year_start_cotime,
- recur_data);
-
- /* Find the day that would correspond to week 1 of the next
- year, which we use for -ve week numbers. */
- year_end_cotime = *occ;
- year_end_cotime.year++;
- cal_obj_time_find_first_week (&year_end_cotime,
- recur_data);
-
- /* Now iterate over the week numbers in byweekno, generating a
- new occurrence for each one. */
- elem = recur_data->recur->byweekno;
- while (elem) {
- weekno = GPOINTER_TO_INT (elem->data);
- if (weekno > 0) {
- cotime = year_start_cotime;
- cal_obj_time_add_days (&cotime,
- (weekno - 1) * 7);
- } else {
- cotime = year_end_cotime;
- cal_obj_time_subtract_days (&cotime,
- -weekno * 7);
- }
-
- /* Skip occurrences if they fall outside the year. */
- if (cotime.year == occ->year)
- g_array_append_val (new_occs, cotime);
- elem = elem->next;
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-#if 0
-/* This isn't used at present. */
-static GArray*
-cal_obj_byweekno_filter (RecurData *recur_data,
- GArray *occs)
-{
-
- return occs;
-}
-#endif
-
-
-static GArray*
-cal_obj_byyearday_expand (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ, year_start_cotime, year_end_cotime, cotime;
- GList *elem;
- gint len, i, dayno;
-
- /* If BYYEARDAY has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byyearday || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- /* Find the day that would correspond to day 1. */
- year_start_cotime = *occ;
- year_start_cotime.month = 0;
- year_start_cotime.day = 1;
-
- /* Find the day that would correspond to day 1 of the next
- year, which we use for -ve day numbers. */
- year_end_cotime = *occ;
- year_end_cotime.year++;
- year_end_cotime.month = 0;
- year_end_cotime.day = 1;
-
- /* Now iterate over the day numbers in byyearday, generating a
- new occurrence for each one. */
- elem = recur_data->recur->byyearday;
- while (elem) {
- dayno = GPOINTER_TO_INT (elem->data);
- if (dayno > 0) {
- cotime = year_start_cotime;
- cal_obj_time_add_days (&cotime, dayno - 1);
- } else {
- cotime = year_end_cotime;
- cal_obj_time_subtract_days (&cotime, -dayno);
- }
-
- /* Skip occurrences if they fall outside the year. */
- if (cotime.year == occ->year)
- g_array_append_val (new_occs, cotime);
- elem = elem->next;
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-/* Note: occs must not contain invalid dates, e.g. 31st September. */
-static GArray*
-cal_obj_byyearday_filter (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- gint yearday, len, i, days_in_year;
-
- /* If BYYEARDAY has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byyearday || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
- yearday = cal_obj_time_day_of_year (occ);
- if (recur_data->yeardays[yearday]) {
- g_array_append_vals (new_occs, occ, 1);
- } else {
- days_in_year = g_date_is_leap_year (occ->year)
- ? 366 : 365;
- if (recur_data->neg_yeardays[days_in_year + 1
- - yearday])
- g_array_append_vals (new_occs, occ, 1);
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-
-static GArray*
-cal_obj_bymonthday_expand (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ, month_start_cotime, month_end_cotime, cotime;
- GList *elem;
- gint len, i, dayno;
-
- /* If BYMONTHDAY has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->bymonthday || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- /* Find the day that would correspond to day 1. */
- month_start_cotime = *occ;
- month_start_cotime.day = 1;
-
- /* Find the day that would correspond to day 1 of the next
- month, which we use for -ve day numbers. */
- month_end_cotime = *occ;
- month_end_cotime.month++;
- month_end_cotime.day = 1;
-
- /* Now iterate over the day numbers in bymonthday, generating a
- new occurrence for each one. */
- elem = recur_data->recur->bymonthday;
- while (elem) {
- dayno = GPOINTER_TO_INT (elem->data);
- if (dayno > 0) {
- cotime = month_start_cotime;
- cal_obj_time_add_days (&cotime, dayno - 1);
- } else {
- cotime = month_end_cotime;
- cal_obj_time_subtract_days (&cotime, -dayno);
- }
-
- /* Skip occurrences if they fall outside the month. */
- if (cotime.month == occ->month)
- g_array_append_val (new_occs, cotime);
- elem = elem->next;
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-static GArray*
-cal_obj_bymonthday_filter (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- gint len, i, days_in_month;
-
- /* If BYMONTHDAY has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->bymonthday || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
- if (recur_data->monthdays[occ->day]) {
- g_array_append_vals (new_occs, occ, 1);
- } else {
- days_in_month = time_days_in_month (occ->year,
- occ->month);
- if (recur_data->neg_monthdays[days_in_month + 1
- - occ->day])
- g_array_append_vals (new_occs, occ, 1);
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-
-static GArray*
-cal_obj_byday_expand_yearly (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- GList *elem;
- gint len, i, weekday, week_num;
- gint first_weekday, last_weekday, offset;
- guint16 year;
-
- /* If BYDAY has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byday || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- elem = recur_data->recur->byday;
- while (elem) {
- weekday = GPOINTER_TO_INT (elem->data);
- elem = elem->next;
- week_num = GPOINTER_TO_INT (elem->data);
- elem = elem->next;
-
- year = occ->year;
- if (week_num == 0) {
- occ->month = 0;
- occ->day = 1;
- first_weekday = cal_obj_time_weekday (occ, recur_data->recur);
- offset = (weekday + 7 - first_weekday) % 7;
- cal_obj_time_add_days (occ, offset);
-
- while (occ->year == year) {
- g_array_append_vals (new_occs, occ, 1);
- cal_obj_time_add_days (occ, 7);
- }
-
- } else if (week_num > 0) {
- occ->month = 0;
- occ->day = 1;
- first_weekday = cal_obj_time_weekday (occ, recur_data->recur);
- offset = (weekday + 7 - first_weekday) % 7;
- offset += (week_num - 1) * 7;
- cal_obj_time_add_days (occ, offset);
- if (occ->year == year)
- g_array_append_vals (new_occs, occ, 1);
-
- } else {
- occ->month = 11;
- occ->day = 31;
- last_weekday = cal_obj_time_weekday (occ, recur_data->recur);
- offset = (last_weekday + 7 - weekday) % 7;
- offset += (week_num - 1) * 7;
- cal_obj_time_subtract_days (occ, offset);
- if (occ->year == year)
- g_array_append_vals (new_occs, occ, 1);
- }
-
- /* Reset the year, as we may have gone past the end. */
- occ->year = year;
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-static GArray*
-cal_obj_byday_expand_monthly (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- GList *elem;
- gint len, i, weekday, week_num;
- gint first_weekday, last_weekday, offset;
- guint16 year;
- guint8 month;
-
- /* If BYDAY has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byday || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- elem = recur_data->recur->byday;
- while (elem) {
- weekday = GPOINTER_TO_INT (elem->data);
- elem = elem->next;
- week_num = GPOINTER_TO_INT (elem->data);
- elem = elem->next;
-
- year = occ->year;
- month = occ->month;
- if (week_num == 0) {
- occ->day = 1;
- first_weekday = cal_obj_time_weekday (occ, recur_data->recur);
- offset = (weekday + 7 - first_weekday) % 7;
- cal_obj_time_add_days (occ, offset);
-
- while (occ->year == year
- && occ->month == month) {
- g_array_append_vals (new_occs, occ, 1);
- cal_obj_time_add_days (occ, 7);
- }
-
- } else if (week_num > 0) {
- occ->day = 1;
- first_weekday = cal_obj_time_weekday (occ, recur_data->recur);
- offset = (weekday + 7 - first_weekday) % 7;
- offset += (week_num - 1) * 7;
- cal_obj_time_add_days (occ, offset);
- if (occ->year == year && occ->month == month)
- g_array_append_vals (new_occs, occ, 1);
-
- } else {
- occ->day = time_days_in_month (occ->year,
- occ->month);
- last_weekday = cal_obj_time_weekday (occ, recur_data->recur);
- offset = (last_weekday + 7 - weekday) % 7;
- offset += (week_num - 1) * 7;
- cal_obj_time_subtract_days (occ, offset);
- if (occ->year == year && occ->month == month)
- g_array_append_vals (new_occs, occ, 1);
- }
-
- /* Reset the year & month, as we may have gone past
- the end. */
- occ->year = year;
- occ->month = month;
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-/* Note: occs must not contain invalid dates, e.g. 31st September. */
-static GArray*
-cal_obj_byday_expand_weekly (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- GList *elem;
- gint len, i, weekday, week_num;
- gint current_weekday;
- gint day_of_week, new_day_of_week, days_to_add;
-
- /* If BYDAY has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byday || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- elem = recur_data->recur->byday;
- while (elem) {
- weekday = GPOINTER_TO_INT (elem->data);
- elem = elem->next;
- week_num = GPOINTER_TO_INT (elem->data);
- elem = elem->next;
-
- current_weekday = cal_obj_time_weekday (occ, recur_data->recur);
- day_of_week = (current_weekday + 7
- - recur_data->recur->week_start_day) % 7;
- new_day_of_week = (weekday + 7
- - recur_data->recur->week_start_day) % 7;
- days_to_add = new_day_of_week - day_of_week;
- if (days_to_add > 0)
- cal_obj_time_add_days (occ, days_to_add);
- else if (days_to_add < 0)
- cal_obj_time_subtract_days (occ, -days_to_add);
- g_array_append_vals (new_occs, occ, 1);
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-/* Note: occs must not contain invalid dates, e.g. 31st September. */
-static GArray*
-cal_obj_byday_filter (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- gint len, i, weekday;
-
- /* If BYDAY has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byday || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
- weekday = cal_obj_time_weekday (occ, recur_data->recur);
-
- /* See if the weekday on its own is set. */
- if (recur_data->weekdays[weekday])
- g_array_append_vals (new_occs, occ, 1);
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-
-/* If the BYHOUR rule is specified it expands each occurrence in occs, by
- using each of the hours in the byhour list. */
-static GArray*
-cal_obj_byhour_expand (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- GList *elem;
- gint len, i;
-
- /* If BYHOUR has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byhour || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- elem = recur_data->recur->byhour;
- while (elem) {
- occ->hour = GPOINTER_TO_INT (elem->data);
- g_array_append_vals (new_occs, occ, 1);
- elem = elem->next;
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-/* If the BYHOUR rule is specified it filters out all occurrences in occs
- which do not match one of the hours in the byhour list. */
-static GArray*
-cal_obj_byhour_filter (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- gint len, i;
-
- /* If BYHOUR has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byhour || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
- if (recur_data->hours[occ->hour])
- g_array_append_vals (new_occs, occ, 1);
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-
-/* If the BYMINUTE rule is specified it expands each occurrence in occs, by
- using each of the minutes in the byminute list. */
-static GArray*
-cal_obj_byminute_expand (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- GList *elem;
- gint len, i;
-
- /* If BYMINUTE has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byminute || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- elem = recur_data->recur->byminute;
- while (elem) {
- occ->minute = GPOINTER_TO_INT (elem->data);
- g_array_append_vals (new_occs, occ, 1);
- elem = elem->next;
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-/* If the BYMINUTE rule is specified it filters out all occurrences in occs
- which do not match one of the minutes in the byminute list. */
-static GArray*
-cal_obj_byminute_filter (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- gint len, i;
-
- /* If BYMINUTE has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->byminute || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
- if (recur_data->minutes[occ->minute])
- g_array_append_vals (new_occs, occ, 1);
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-
-/* If the BYSECOND rule is specified it expands each occurrence in occs, by
- using each of the seconds in the bysecond list. */
-static GArray*
-cal_obj_bysecond_expand (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- GList *elem;
- gint len, i;
-
- /* If BYSECOND has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->bysecond || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- elem = recur_data->recur->bysecond;
- while (elem) {
- occ->second = GPOINTER_TO_INT (elem->data);
- g_array_append_vals (new_occs, occ, 1);
- elem = elem->next;
- }
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-/* If the BYSECOND rule is specified it filters out all occurrences in occs
- which do not match one of the seconds in the bysecond list. */
-static GArray*
-cal_obj_bysecond_filter (RecurData *recur_data,
- GArray *occs)
-{
- GArray *new_occs;
- CalObjTime *occ;
- gint len, i;
-
- /* If BYSECOND has not been specified, or the array is empty, just
- return the array. */
- if (!recur_data->recur->bysecond || occs->len == 0)
- return occs;
-
- new_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
- if (recur_data->seconds[occ->second])
- g_array_append_vals (new_occs, occ, 1);
- }
-
- g_array_free (occs, TRUE);
-
- return new_occs;
-}
-
-
-
-
-
-/* Adds a positive number of months to the given CalObjTime, updating the year
- appropriately so we end up with a valid month. Note that the day may be
- invalid. */
-static void
-cal_obj_time_add_months (CalObjTime *cotime,
- gint months)
-{
- guint month;
-
- /* We use a guint to avoid overflow on the guint8. */
- month = cotime->month + months;
- cotime->year += month / 12;
- cotime->month = month % 12;
-}
-
-
-/* Adds a positive number of days to the given CalObjTime, updating the month
- and year appropriately so we end up with a valid day. */
-static void
-cal_obj_time_add_days (CalObjTime *cotime,
- gint days)
-{
- guint day, days_in_month;
-
- /* We use a guint to avoid overflow on the guint8. */
- day = (guint) cotime->day;
- day += days;
-
- for (;;) {
- days_in_month = time_days_in_month (cotime->year,
- cotime->month);
- if (day <= days_in_month)
- break;
-
- cotime->month++;
- if (cotime->month >= 12) {
- cotime->year++;
- cotime->month = 0;
- }
-
- day -= days_in_month;
- }
-
- cotime->day = (guint8) day;
-}
-
-
-/* Subtracts a positive number of days from the given CalObjTime, updating the
- month and year appropriately so we end up with a valid day. */
-static void
-cal_obj_time_subtract_days (CalObjTime *cotime,
- gint days)
-{
- gint day, days_in_month;
-
- /* We use a gint to avoid overflow on the guint8. */
- day = (gint) cotime->day;
- day -= days;
-
- while (day <= 0) {
- if (cotime->month == 0) {
- cotime->year--;
- cotime->month = 11;
- } else {
- cotime->month--;
- }
-
- days_in_month = time_days_in_month (cotime->year,
- cotime->month);
-
- day += days_in_month;
- }
-
- cotime->day = (guint8) day;
-}
-
-
-/* Adds a positive number of hours to the given CalObjTime, updating the day,
- month & year appropriately so we end up with a valid time. */
-static void
-cal_obj_time_add_hours (CalObjTime *cotime,
- gint hours)
-{
- guint hour;
-
- /* We use a guint to avoid overflow on the guint8. */
- hour = cotime->hour + hours;
- cotime->hour = hour % 24;
- if (hour >= 24)
- cal_obj_time_add_days (cotime, hour / 24);
-}
-
-
-/* Adds a positive number of minutes to the given CalObjTime, updating the
- rest of the CalObjTime appropriately. */
-static void
-cal_obj_time_add_minutes (CalObjTime *cotime,
- gint minutes)
-{
- guint minute;
-
- /* We use a guint to avoid overflow on the guint8. */
- minute = cotime->minute + minutes;
- cotime->minute = minute % 60;
- if (minute >= 60)
- cal_obj_time_add_hours (cotime, minute / 60);
-}
-
-
-/* Adds a positive number of seconds to the given CalObjTime, updating the
- rest of the CalObjTime appropriately. */
-static void
-cal_obj_time_add_seconds (CalObjTime *cotime,
- gint seconds)
-{
- guint second;
-
- /* We use a guint to avoid overflow on the guint8. */
- second = cotime->second + seconds;
- cotime->second = second % 60;
- if (second >= 60)
- cal_obj_time_add_minutes (cotime, second / 60);
-}
-
-
-/* Compares 2 CalObjTimes. Returns -1 if the cotime1 is before cotime2, 0 if
- they are the same, or 1 if cotime1 is after cotime2. The comparison type
- specifies which parts of the times we are interested in, e.g. if CALOBJ_DAY
- is used we only want to know if the days are different. */
-static gint
-cal_obj_time_compare (CalObjTime *cotime1,
- CalObjTime *cotime2,
- CalObjTimeComparison type)
-{
- if (cotime1->year < cotime2->year)
- return -1;
- if (cotime1->year > cotime2->year)
- return 1;
-
- if (type == CALOBJ_YEAR)
- return 0;
-
- if (cotime1->month < cotime2->month)
- return -1;
- if (cotime1->month > cotime2->month)
- return 1;
-
- if (type == CALOBJ_MONTH)
- return 0;
-
- if (cotime1->day < cotime2->day)
- return -1;
- if (cotime1->day > cotime2->day)
- return 1;
-
- if (type == CALOBJ_DAY)
- return 0;
-
- if (cotime1->hour < cotime2->hour)
- return -1;
- if (cotime1->hour > cotime2->hour)
- return 1;
-
- if (type == CALOBJ_HOUR)
- return 0;
-
- if (cotime1->minute < cotime2->minute)
- return -1;
- if (cotime1->minute > cotime2->minute)
- return 1;
-
- if (type == CALOBJ_MINUTE)
- return 0;
-
- if (cotime1->second < cotime2->second)
- return -1;
- if (cotime1->second > cotime2->second)
- return 1;
-
- return 0;
-}
-
-
-/* This is the same as the above function, but without the comparison type.
- It is used for qsort(). */
-static gint
-cal_obj_time_compare_func (const void *arg1,
- const void *arg2)
-{
- CalObjTime *cotime1, *cotime2;
-
- cotime1 = (CalObjTime*) arg1;
- cotime2 = (CalObjTime*) arg2;
-
- if (cotime1->year < cotime2->year)
- return -1;
- if (cotime1->year > cotime2->year)
- return 1;
-
- if (cotime1->month < cotime2->month)
- return -1;
- if (cotime1->month > cotime2->month)
- return 1;
-
- if (cotime1->day < cotime2->day)
- return -1;
- if (cotime1->day > cotime2->day)
- return 1;
-
- if (cotime1->hour < cotime2->hour)
- return -1;
- if (cotime1->hour > cotime2->hour)
- return 1;
-
- if (cotime1->minute < cotime2->minute)
- return -1;
- if (cotime1->minute > cotime2->minute)
- return 1;
-
- if (cotime1->second < cotime2->second)
- return -1;
- if (cotime1->second > cotime2->second)
- return 1;
-
- return 0;
-}
-
-
-/* Returns the weekday of the given CalObjTime, from 0 - 6. The week start
- day is Monday by default, but can be set in the recurrence rule. */
-static gint
-cal_obj_time_weekday (CalObjTime *cotime,
- CalRecurrence *recur)
-{
- GDate date;
- gint weekday;
-
- g_date_clear (&date, 1);
- g_date_set_dmy (&date, cotime->day, cotime->month + 1, cotime->year);
-
- /* This results in a value of 0 (Monday) - 6 (Sunday). */
- weekday = g_date_weekday (&date) - 1;
-
- /* This calculates the offset of our day from the start of the week.
- We just add on a week (to avoid any possible negative values) and
- then subtract the specified week start day, then convert it into a
- value from 0-6. */
- weekday = (weekday + 7 - recur->week_start_day) % 7;
-
- return weekday;
-}
-
-
-/* Returns the day of the year of the given CalObjTime, from 1 - 366. */
-static gint
-cal_obj_time_day_of_year (CalObjTime *cotime)
-{
- GDate date;
-
- g_date_clear (&date, 1);
- g_date_set_dmy (&date, cotime->day, cotime->month + 1, cotime->year);
-
- return g_date_day_of_year (&date);
-}
-
-
-/* Finds the first week in the given CalObjTime's year, using the same weekday
- as the event start day (i.e. from the RecurData).
- The first week of the year is the first week starting from the specified
- week start day that has 4 days in the new year. It may be in the previous
- year. */
-static void
-cal_obj_time_find_first_week (CalObjTime *cotime,
- RecurData *recur_data)
-{
- GDate date;
- gint weekday, week_start_day, offset;
-
- /* Find out the weekday of the 1st of the year. */
- g_date_clear (&date, 1);
- g_date_set_dmy (&date, 1, 1, cotime->year);
-
- /* This results in a value of 0 (Monday) - 6 (Sunday). */
- weekday = g_date_weekday (&date) - 1;
-
- /* Calculate the first day of the year that starts a new week. */
- week_start_day = recur_data->recur->week_start_day;
- offset = (week_start_day + 7 - weekday) % 7;
-
- /* Now see if we have to move backwards 1 week, i.e. if the week
- starts on or after Jan 5th (since the previous week has 4 days in
- this year and so will be the first week of the year). */
- if (offset >= 4)
- offset -= 7;
-
- /* Now move to the required day. */
- offset += (recur_data->weekday + 7 - week_start_day) % 7;
-
- /* Now move the cotime to the appropriate day. */
- cotime->month = 0;
- cotime->day = 1;
- if (offset > 0)
- cal_obj_time_add_days (cotime, offset);
- else
- cal_obj_time_subtract_days (cotime, offset);
-}
-
-
-static void
-cal_object_time_from_time (CalObjTime *cotime,
- time_t t)
-{
- struct tm *tmp_tm;
- time_t tmp_time_t;
-
- tmp_time_t = t;
- tmp_tm = localtime (&tmp_time_t);
-
- cotime->year = tmp_tm->tm_year + 1900;
- cotime->month = tmp_tm->tm_mon;
- cotime->day = tmp_tm->tm_mday;
- cotime->hour = tmp_tm->tm_hour;
- cotime->minute = tmp_tm->tm_min;
- cotime->second = tmp_tm->tm_sec;
-}
diff --git a/calendar/cal-util/cal-recur.h b/calendar/cal-util/cal-recur.h
deleted file mode 100644
index 621985b71b..0000000000
--- a/calendar/cal-util/cal-recur.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Evolution calendar recurrence rule functions
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Damon Chaplin <damon@helixcode.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 CAL_RECUR_H
-#define CAL_RECUR_H
-
-#include <libgnome/gnome-defs.h>
-#include <glib.h>
-#include <cal-util/cal-component.h>
-
-BEGIN_GNOME_DECLS
-
-typedef enum {
- CAL_RECUR_YEARLY,
- CAL_RECUR_MONTHLY,
- CAL_RECUR_WEEKLY,
- CAL_RECUR_DAILY,
- CAL_RECUR_HOURLY,
- CAL_RECUR_MINUTELY,
- CAL_RECUR_SECONDLY
-} CalRecurType;
-
-typedef struct {
- CalRecurType type;
-
- int interval;
-
- /* Specifies the end of the recurrence. No occurrences are generated
- after this date. If it is 0, the event recurs forever. */
- time_t enddate;
-
- /* WKST property - the week start day: 0 = Monday to 6 = Sunday. */
- gint week_start_day;
-
-
- /* NOTE: I've used GList's here, but it doesn't matter if we use
- other data structures like arrays. The code should be easy to
- change. So long as it is easy to see if the modifier is set. */
-
- /* For BYMONTH modifier. A list of GINT_TO_POINTERs, 0-11. */
- GList *bymonth;
-
- /* For BYWEEKNO modifier. A list of GINT_TO_POINTERs, [+-]1-53. */
- GList *byweekno;
-
- /* For BYYEARDAY modifier. A list of GINT_TO_POINTERs, [+-]1-366. */
- GList *byyearday;
-
- /* For BYMONTHDAY modifier. A list of GINT_TO_POINTERs, [+-]1-31. */
- GList *bymonthday;
-
- /* For BYDAY modifier. A list of GINT_TO_POINTERs, in pairs.
- The first of each pair is the weekday, 0 = Monday to 6 = Sunday.
- The second of each pair is the week number [+-]0-53. */
- GList *byday;
-
- /* For BYHOUR modifier. A list of GINT_TO_POINTERs, 0-23. */
- GList *byhour;
-
- /* For BYMINUTE modifier. A list of GINT_TO_POINTERs, 0-59. */
- GList *byminute;
-
- /* For BYSECOND modifier. A list of GINT_TO_POINTERs, 0-60. */
- GList *bysecond;
-
- /* For BYSETPOS modifier. A list of GINT_TO_POINTERs, +ve or -ve. */
- GList *bysetpos;
-} CalRecurrence;
-
-/* This is what we use to represent a date & time. */
-typedef struct _CalObjTime CalObjTime;
-struct _CalObjTime {
- guint16 year;
- guint8 month; /* 0 - 11 */
- guint8 day; /* 1 - 31 */
- guint8 hour; /* 0 - 23 */
- guint8 minute; /* 0 - 59 */
- guint8 second; /* 0 - 59 (maybe 60 for leap second) */
-};
-
-typedef gboolean (* CalRecurInstanceFn) (CalComponent *comp,
- time_t instance_start,
- time_t instace_end,
- gpointer data);
-
-void cal_recur_generate_instances (CalComponent *comp,
- time_t start,
- time_t end,
- CalRecurInstanceFn cb,
- gpointer cb_data);
-
-CalRecurrence *cal_recur_from_icalrecurrencetype (struct icalrecurrencetype *ir);
-void cal_recur_free (CalRecurrence *r);
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/cal-util/cal-util.c b/calendar/cal-util/cal-util.c
deleted file mode 100644
index 40c4fe5bfe..0000000000
--- a/calendar/cal-util/cal-util.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Evolution calendar utilities and types
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include "cal-util.h"
-#include "libversit/vcc.h"
-
-
-
-/**
- * cal_obj_instance_list_free:
- * @list: List of #CalObjInstance structures.
- *
- * Frees a list of #CalObjInstance structures.
- **/
-void
-cal_obj_instance_list_free (GList *list)
-{
- CalObjInstance *i;
- GList *l;
-
- for (l = list; l; l = l->next) {
- i = l->data;
-
- g_assert (i != NULL);
- g_assert (i->uid != NULL);
-
- g_free (i->uid);
- g_free (i);
- }
-
- g_list_free (list);
-}
-
-/**
- * cal_alarm_instance_list_free:
- * @list: List of #CalAlarmInstance structures.
- *
- * Frees a list of #CalAlarmInstance structures.
- **/
-void
-cal_alarm_instance_list_free (GList *list)
-{
- CalAlarmInstance *i;
- GList *l;
-
- for (l = list; l; l = l->next) {
- i = l->data;
-
- g_assert (i != NULL);
- g_assert (i->uid != NULL);
-
- g_free (i->uid);
- g_free (i);
- }
-
- g_list_free (list);
-}
-
-/**
- * cal_obj_uid_list_free:
- * @list: List of strings with unique identifiers.
- *
- * Frees a list of unique identifiers for calendar objects.
- **/
-void
-cal_obj_uid_list_free (GList *list)
-{
- GList *l;
-
- for (l = list; l; l = l->next) {
- char *uid;
-
- uid = l->data;
-
- g_assert (uid != NULL);
- g_free (uid);
- }
-
- g_list_free (list);
-}
diff --git a/calendar/cal-util/cal-util.h b/calendar/cal-util/cal-util.h
deleted file mode 100644
index 154f4c2ad5..0000000000
--- a/calendar/cal-util/cal-util.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Evolution calendar utilities and types
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 CAL_UTIL_H
-#define CAL_UTIL_H
-
-#include <libgnome/gnome-defs.h>
-#include <time.h>
-#include <glib.h>
-
-BEGIN_GNOME_DECLS
-
-
-
-/* Instance of a calendar object. This can be an actual occurrence, a
- * recurrence, or an alarm trigger of a `real' calendar object.
- */
-typedef struct {
- char *uid; /* UID of the object */
- time_t start; /* Start time of instance */
- time_t end; /* End time of instance */
-} CalObjInstance;
-
-void cal_obj_instance_list_free (GList *list);
-
-/* Instance of an alarm trigger */
-typedef struct {
- char *uid; /* UID of object */
-#if 0
- enum AlarmType type; /* Type of alarm */
-#endif
- time_t trigger; /* Alarm trigger time */
- time_t occur; /* Occurrence time */
-} CalAlarmInstance;
-
-void cal_alarm_instance_list_free (GList *list);
-
-/* Used for multiple UID queries */
-typedef enum {
- CALOBJ_TYPE_EVENT = 1 << 0,
- CALOBJ_TYPE_TODO = 1 << 1,
- CALOBJ_TYPE_JOURNAL = 1 << 2,
- CALOBJ_TYPE_ANY = 0x07
-} CalObjType;
-
-void cal_obj_uid_list_free (GList *list);
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/cal-util/calobj.c b/calendar/cal-util/calobj.c
deleted file mode 100644
index 0ede42ebc6..0000000000
--- a/calendar/cal-util/calobj.c
+++ /dev/null
@@ -1,2008 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Calendar objects implementations.
- * Copyright (C) 1998 the Free Software Foundation
- *
- * Authors:
- * Miguel de Icaza (miguel@gnu.org)
- * Federico Mena (quartic@gimp.org)
- */
-#include <config.h>
-#include <string.h>
-#include <glib.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <time.h>
-#include "calobj.h"
-#include "timeutil.h"
-#include "libversit/vcc.h"
-#include "icalendar-save.h"
-#include "icalendar.h"
-
-
-
-/* VCalendar product ID */
-#define PRODID "-//Helix Code//NONSGML Evolution Calendar//EN"
-
-static gint compare_exdates (gconstpointer a, gconstpointer b);
-static void ical_object_normalize_summary (iCalObject *ico);
-static void list_free (GList *list);
-
-
-
-char *
-ical_gen_uid (void)
-{
- static char *hostname;
- time_t t = time (NULL);
- static int serial;
-
- if (!hostname){
- char buffer [128];
-
- if ((gethostname (buffer, sizeof (buffer)-1) == 0) &&
- (buffer [0] != 0))
- hostname = g_strdup (buffer);
- else
- hostname = g_strdup ("localhost");
- }
-
- return g_strdup_printf (
- "%s-%d-%d-%d-%d@%s",
- isodate_from_time_t (t),
- getpid (),
- getgid (),
- getppid (),
- serial++,
- hostname);
-}
-
-iCalObject *
-ical_object_new (void)
-{
- iCalObject *ico;
-
- ico = g_new0 (iCalObject, 1);
-
- ico->seq = -1;
- ico->dtstamp = time (NULL);
- ico->uid = ical_gen_uid ();
-
- ico->pilot_id = 0;
- ico->pilot_status = ICAL_PILOT_SYNC_MOD;
-
- ico->ref_count = 1;
-
- return ico;
-}
-
-iCalObject *
-ical_new (char *comment, char *organizer, char *summary)
-{
- iCalObject *ico;
-
- ico = ical_object_new ();
-
- ico->comment = g_strdup (comment);
- ico->organizer = g_new0 (iCalPerson, 1);
- ico->organizer->addr = g_strdup (organizer);
- ico->summary = g_strdup (summary);
- ico->class = g_strdup ("PUBLIC");
- ico->status = g_strdup ("NEEDS ACTION");
-
- ico->dalarm.type = ALARM_DISPLAY;
- ico->palarm.type = ALARM_PROGRAM;
- ico->malarm.type = ALARM_MAIL;
- ico->aalarm.type = ALARM_AUDIO;
-
- ical_object_normalize_summary (ico);
-
- return ico;
-}
-
-
-void
-ical_object_ref (iCalObject *ico)
-{
- ico->ref_count++;
-}
-
-
-#define free_if_defined(x) if (x){ g_free (x); x = 0; }
-#define lfree_if_defined(x) if (x){ list_free (x); x = 0; }
-static void
-ical_object_destroy (iCalObject *ico)
-{
- /* Regular strings */
- free_if_defined (ico->comment);
- free_if_defined (ico->organizer);
- free_if_defined (ico->summary);
- free_if_defined (ico->uid);
- free_if_defined (ico->status);
- free_if_defined (ico->class);
- free_if_defined (ico->url);
- free_if_defined (ico->recur);
-
- /* Lists */
- lfree_if_defined (ico->exdate);
- lfree_if_defined (ico->categories);
- lfree_if_defined (ico->resources);
- lfree_if_defined (ico->related);
- lfree_if_defined (ico->attach);
-
- /* Alarms */
- g_free (ico->dalarm.data);
- g_free (ico->palarm.data);
- g_free (ico->malarm.data);
- g_free (ico->aalarm.data);
-
- g_free (ico);
-}
-
-void
-ical_object_unref (iCalObject *ico)
-{
- ico->ref_count--;
- if (ico->ref_count == 0)
- ical_object_destroy (ico);
-}
-
-
-static void
-my_free (gpointer data, gpointer user_dat_ignored)
-{
- g_free (data);
-}
-
-static void
-list_free (GList *list)
-{
- g_list_foreach (list, my_free, 0);
- g_list_free (list);
-}
-
-/* This resets any recurrence rules of the iCalObject. */
-void
-ical_object_reset_recurrence (iCalObject *ico)
-{
- free_if_defined (ico->recur);
- lfree_if_defined (ico->exdate);
-}
-
-static GList *
-set_list (char *str)
-{
- GList *list = 0;
- char *s;
-
- for (s = strtok (str, ";"); s; s = strtok (NULL, ";"))
- list = g_list_prepend (list, g_strdup (s));
-
- return list;
-}
-
-static GList *
-set_date_list (char *str)
-{
- GList *list = 0;
- char *s;
-
- for (s = strtok (str, ";,"); s; s = strtok (NULL, ";,")){
- time_t *t = g_new (time_t, 1);
-
- while (*s && isspace (*s))
- s++;
- *t = time_from_isodate (s);
- list = g_list_prepend (list, t);
- }
- return list;
-}
-
-void
-ical_object_add_exdate (iCalObject *o, time_t t)
-{
- time_t *pt = g_new (time_t, 1);
-
- *pt = t;
- o->exdate = g_list_prepend (o->exdate, pt);
-}
-
-static void
-ignore_space(char **str)
-{
- while (**str && isspace (**str))
- (*str)++;
-}
-
-static void
-skip_numbers (char **str)
-{
- while (**str){
- ignore_space (str);
- if (!isdigit (**str))
- return;
- while (**str && isdigit (**str))
- (*str)++;
- }
-}
-
-static void
-weekdaylist (iCalObject *o, char **str)
-{
- int i;
- struct {
- char first_letter, second_letter;
- int index;
- } days [] = {
- { 'S', 'U', 0 },
- { 'M', 'O', 1 },
- { 'T', 'U', 2 },
- { 'W', 'E', 3 },
- { 'T', 'H', 4 },
- { 'F', 'R', 5 },
- { 'S', 'A', 6 }
- };
-
- ignore_space (str);
- do {
- for (i = 0; i < 7; i++){
- if (**str == days [i].first_letter && *(*str+1) == days [i].second_letter){
- o->recur->weekday |= 1 << i;
- *str += 2;
- if (**str == ' ')
- (*str)++;
- }
- }
- } while (isalpha (**str));
-
- if (o->recur->weekday == 0){
- struct tm tm = *localtime (&o->dtstart);
-
- o->recur->weekday = 1 << tm.tm_wday;
- }
-}
-
-static void
-weekdaynum (iCalObject *o, char **str)
-{
- int i;
- struct {
- char first_letter, second_letter;
- int index;
- } days [] = {
- { 'S', 'U', 0 },
- { 'M', 'O', 1 },
- { 'T', 'U', 2 },
- { 'W', 'E', 3 },
- { 'T', 'H', 4 },
- { 'F', 'R', 5 },
- { 'S', 'A', 6 }
- };
-
- ignore_space (str);
- do {
- for (i = 0; i < 7; i++){
- if (**str == days [i].first_letter && *(*str+1) == days [i].second_letter){
- o->recur->weekday = i;
- *str += 2;
- if (**str == ' ')
- (*str)++;
- }
- }
- } while (isalpha (**str));
-}
-
-static void
-ocurrencelist (iCalObject *o, char **str)
-{
- char *p;
-
- ignore_space (str);
- p = *str;
- if (!isdigit (*p))
- return;
-
- if (!(*p >= '1' && *p <= '5'))
- return;
-
- if (!(*(p+1) == '+' || *(p+1) == '-'))
- return;
-
- o->recur->u.month_pos = (*p-'0') * (*(p+1) == '+' ? 1 : -1);
- *str += 2;
-}
-
-#if 0
-
-static void
-daynumber (iCalObject *o, char **str)
-{
- int val = 0;
- char *p = *str;
-
- ignore_space (str);
- if (strcmp (p, "LD")){
- o->recur->u.month_day = DAY_LASTDAY;
- *str += 2;
- return;
- }
-
- if (!(isdigit (*p)))
- return;
-
- while (**str && isdigit (**str)){
- val = val * 10 + (**str - '0');
- (*str)++;
- }
-
- if (**str == '+')
- (*str)++;
-
- if (**str == '-')
- val *= -1;
- o->recur->u.month_day = val;
-}
-
-#endif
-
-static void
-daynumberlist (iCalObject *o, char **str)
-{
- int first = 0;
- int val = 0;
-
- ignore_space (str);
-
- while (**str){
- if (!isdigit (**str))
- return;
- while (**str && isdigit (**str)){
- val = 10 * val + (**str - '0');
- (*str)++;
- }
- if (!first){
- /*
- * Some broken applications set this to zero
- */
- if (val == 0){
- struct tm day = *localtime (&o->dtstart);
-
- val = day.tm_mday;
- }
- o->recur->u.month_day = val;
- first = 1;
- val = 0;
- }
- }
-}
-
-static void
-load_recur_weekly (iCalObject *o, char **str)
-{
- weekdaylist (o, str);
-}
-
-static void
-load_recur_monthly_pos (iCalObject *o, char **str)
-{
- ocurrencelist (o, str);
- weekdaynum (o, str);
-}
-
-static void
-load_recur_monthly_day (iCalObject *o, char **str)
-{
- daynumberlist (o, str);
-}
-
-static void
-load_recur_yearly_month (iCalObject *o, char **str)
-{
- /* Skip as we do not support multiple months and we do expect
- * the dtstart to agree with the value on this field
- */
- skip_numbers (str);
-}
-
-static void
-load_recur_yearly_day (iCalObject *o, char **str)
-{
- /* Skip as we do not support multiple days and we do expect
- * the dtstart to agree with the value on this field
- *
- * FIXME: we should support every-n-years
- */
- skip_numbers (str);
-}
-
-static void
-duration (iCalObject *o, char **str)
-{
- unsigned int duration = 0;
-
- ignore_space (str);
- if (**str != '#')
- return;
- (*str)++;
- while (**str && isdigit (**str)){
- duration = duration * 10 + (**str - '0');
- (*str)++;
- }
- o->recur->duration = duration;
-}
-
-static void
-enddate (iCalObject *o, char **str)
-{
- ignore_space (str);
- if (isdigit (**str)){
- o->recur->_enddate = time_from_isodate (*str);
- *str += 16;
- }
-}
-
-static int
-load_recurrence (iCalObject *o, char *str)
-{
- enum RecurType type;
- int interval = 0;
-
- type = -1;
- switch (*str++){
- case 'D':
- type = RECUR_DAILY;
- break;
-
- case 'W':
- type = RECUR_WEEKLY;
- break;
-
- case 'M':
- if (*str == 'P')
- type = RECUR_MONTHLY_BY_POS;
- else if (*str == 'D')
- type = RECUR_MONTHLY_BY_DAY;
- str++;
- break;
-
- case 'Y':
- if (*str == 'M')
- type = RECUR_YEARLY_BY_MONTH;
- else if (*str == 'D')
- type = RECUR_YEARLY_BY_DAY;
- str++;
- break;
- }
- if (type == -1)
- return 0;
-
- o->recur = g_new0 (Recurrence, 1);
- o->recur->type = type;
- ignore_space (&str);
-
- /* Get the interval */
- for (;*str && isdigit (*str);str++)
- interval = interval * 10 + (*str-'0');
-
- if (interval == 0)
- interval = 1;
-
- o->recur->interval = interval;
-
- /* this is the default per the spec */
- o->recur->duration = 2;
-
- ignore_space (&str);
-
- switch (type){
- case RECUR_DAILY:
- break;
- case RECUR_WEEKLY:
- load_recur_weekly (o, &str);
- break;
- case RECUR_MONTHLY_BY_POS:
- load_recur_monthly_pos (o, &str);
- break;
- case RECUR_MONTHLY_BY_DAY:
- load_recur_monthly_day (o, &str);
- break;
- case RECUR_YEARLY_BY_MONTH:
- load_recur_yearly_month (o, &str);
- break;
- case RECUR_YEARLY_BY_DAY:
- load_recur_yearly_day (o, &str);
- break;
- default:
- g_warning ("Unimplemented recurrence type %d", (int) type);
- break;
- }
- duration (o, &str);
- enddate (o, &str);
-
- /* Compute the enddate */
- if (o->recur->_enddate == 0){
- if (o->recur->duration != 0){
- ical_object_compute_end (o);
- } else
- o->recur->enddate = 0;
- } else {
- o->recur->enddate = o->recur->_enddate;
- }
- return 1;
-}
-
-#define is_a_prop_of(obj,prop) isAPropertyOf (obj,prop)
-#define str_val(obj) the_str = fakeCString (vObjectUStringZValue (obj))
-#define has(obj,prop) (vo = isAPropertyOf (obj, prop))
-
-/*
- * FIXME: This is loosing precission. Enhanec the thresholds
- */
-#define HOURS(n) (n*(60*60))
-
-static void
-setup_alarm_at (iCalObject *ico, CalendarAlarm *alarm, char *iso_time, VObject *vo)
-{
- time_t alarm_time = time_from_isodate (iso_time);
- time_t base = ico->dtstart;
- int d = difftime (base, alarm_time);
- VObject *a;
- char *the_str;
-
- alarm->enabled = 1;
- if (d > HOURS (2)){
- if (d > HOURS (48)){
- alarm->count = d / HOURS (24);
- alarm->units = ALARM_DAYS;
- } else {
- alarm->count = d / (60*60);
- alarm->units = ALARM_HOURS;
- }
- } else {
- alarm->count = d / 60;
- alarm->units = ALARM_MINUTES;
- }
-
- if ((a = is_a_prop_of (vo, VCSnoozeTimeProp))){
- alarm->snooze_secs = isodiff_to_secs (str_val (a));
- free (the_str);
- }
-
- if ((a = is_a_prop_of (vo, VCRepeatCountProp))){
- alarm->snooze_repeat = atoi (str_val (a));
- free (the_str);
- }
-}
-
-/*
- * Duplicates an iCalObject. Implementation is a grand hack.
- * If you need the new ICalObject to have a new uid, free the current one,
- * and call ical_gen_uid() to generate a new one.
- */
-iCalObject *
-ical_object_duplicate (iCalObject *o)
-{
- VObject *vo;
- iCalObject *new;
-
- vo = ical_object_to_vobject (o);
- switch (o->type){
- case ICAL_EVENT:
- new = ical_object_create_from_vobject (vo, VCEventProp);
- break;
- case ICAL_TODO:
- new = ical_object_create_from_vobject (vo, VCTodoProp);
- break;
- default:
- new = NULL;
- }
-
- cleanVObject (vo);
- return new;
-}
-
-/* FIXME: we need to load the recurrence properties */
-iCalObject *
-ical_object_create_from_vobject (VObject *o, const char *object_name)
-{
- time_t now = time (NULL);
- iCalObject *ical;
- VObject *vo, *a;
- VObjectIterator i;
- char *the_str;
-
- ical = g_new0 (iCalObject, 1);
-
- if (strcmp (object_name, VCEventProp) == 0)
- ical->type = ICAL_EVENT;
- else if (strcmp (object_name, VCTodoProp) == 0)
- ical->type = ICAL_TODO;
- else {
- g_free (ical);
- return 0;
- }
-
- ical->ref_count = 1;
-
- /* uid */
- if (has (o, VCUniqueStringProp)){
- ical->uid = g_strdup (str_val (vo));
- free (the_str);
- } else {
- ical->uid = ical_gen_uid ();
- }
-
- /* seq */
- if (has (o, VCSequenceProp)){
- ical->seq = atoi (str_val (vo));
- free (the_str);
- } else
- ical->seq = 0;
-
- /* dtstart */
- if (has (o, VCDTstartProp)){
- ical->dtstart = time_from_isodate (str_val (vo));
- free (the_str);
- } else
- ical->dtstart = 0;
-
- /* dtend */
- ical->dtend = 0; /* default value */
- if (ical->type == ICAL_EVENT){
- if (has (o, VCDTendProp)){
- ical->dtend = time_from_isodate (str_val (vo));
- free (the_str);
- }
- } else if (ical->type == ICAL_TODO){
- if (has (o, VCDueProp)){
- ical->dtend = time_from_isodate (str_val (vo));
- free (the_str);
- }
- }
-
- /* dcreated */
- if (has (o, VCDCreatedProp)){
- ical->created = time_from_isodate (str_val (vo));
- free (the_str);
- }
-
- /* completed */
- if (has (o, VCCompletedProp)){
- ical->completed = time_from_isodate (str_val (vo));
- free (the_str);
- }
-
- /* last_mod */
- if (has (o, VCLastModifiedProp)){
- ical->last_mod = time_from_isodate (str_val (vo));
- free (the_str);
- } else
- ical->last_mod = now;
-
- /* exdate */
- if (has (o, VCExpDateProp)){
- ical->exdate = set_date_list (str_val (vo));
- free (the_str);
- }
-
- /* description/comment */
- if (has (o, VCDescriptionProp)){
- ical->comment = g_strdup (str_val (vo));
- free (the_str);
- }
-
- /* summary */
- if (has (o, VCSummaryProp)){
- ical->summary = g_strdup (str_val (vo));
- free (the_str);
-
- /* Convert any CR/LF/CRLF sequences in the summary field to
- spaces so we just have a one-line field. */
- ical_object_normalize_summary (ical);
- } else
- ical->summary = g_strdup ("");
-
- /* status */
- if (has (o, VCStatusProp)){
- ical->status = g_strdup (str_val (vo));
- free (the_str);
- } else
- ical->status = g_strdup ("NEEDS ACTION");
-
- if (has (o, VCClassProp)){
- ical->class = g_strdup (str_val (vo));
- free (the_str);
- } else
- ical->class = g_strdup ("PUBLIC");
-
- /* categories */
- if (has (o, VCCategoriesProp)){
- ical->categories = set_list (str_val (vo));
- free (the_str);
- }
-
- /* resources */
- if (has (o, VCResourcesProp)){
- ical->resources = set_list (str_val (vo));
- free (the_str);
- }
-
- /* priority */
- if (has (o, VCPriorityProp)){
- ical->priority = atoi (str_val (vo));
- free (the_str);
- }
-
- /* tranparency */
- if (has (o, VCTranspProp)){
- ical->transp = atoi (str_val (vo)) ? ICAL_TRANSPARENT : ICAL_OPAQUE;
- free (the_str);
- }
-
- /* Organizer */
- if (has (o, VCOrgNameProp)){
- ical->organizer = g_new0 (iCalPerson, 1);
- ical->organizer->addr = g_strdup (str_val (vo));
- free (the_str);
- }
-
- /* related */
- if (has (o, VCRelatedToProp)){
- char *str;
- char *s;
- iCalRelation *rel;
- str = str_val (vo);
- for (s = strtok (str, ";"); s; s = strtok (NULL, ";")) {
- rel = g_new0 (iCalRelation, 1);
- rel->uid = g_strdup (s);
- rel->reltype = g_strdup ("PARENT");
- ical->related = g_list_prepend (ical->related, rel);
- }
- free (the_str);
- }
-
- /* attach */
- initPropIterator (&i, o);
- while (moreIteration (&i)){
- vo = nextVObject (&i);
- if (strcmp (vObjectName (vo), VCAttachProp) == 0){
- ical->attach = g_list_prepend (ical->attach, g_strdup (str_val (vo)));
- free (the_str);
- }
- }
-
- /* url */
- if (has (o, VCURLProp)){
- /* There seems to be a problem with the URL property. For some
- reason an empty property gets saved, vObjectUStringZValue
- returns NULL and fakeCString crashes. So we check for NULL.
- */
- const wchar_t *zval;
-
- zval = vObjectUStringZValue (o);
- if (zval) {
- the_str = fakeCString (zval);
- ical->url = g_strdup (the_str);
- free (the_str);
- }
- }
-
- /* dalarm */
- ical->dalarm.type = ALARM_DISPLAY;
- ical->dalarm.enabled = 0;
- if (has (o, VCDAlarmProp)){
- if ((a = is_a_prop_of (vo, VCRunTimeProp))){
- setup_alarm_at (ical, &ical->dalarm, str_val (a), vo);
- free (the_str);
- }
- }
-
- /* aalarm */
- ical->aalarm.type = ALARM_AUDIO;
- ical->aalarm.enabled = 0;
- if (has (o, VCAAlarmProp)){
- if ((a = is_a_prop_of (vo, VCRunTimeProp))){
- setup_alarm_at (ical, &ical->aalarm, str_val (a), vo);
- free (the_str);
- }
- }
-
- /* palarm */
- ical->palarm.type = ALARM_PROGRAM;
- ical->palarm.enabled = 0;
- if (has (o, VCPAlarmProp)){
- ical->palarm.type = ALARM_PROGRAM;
- if ((a = is_a_prop_of (vo, VCRunTimeProp))){
- setup_alarm_at (ical, &ical->palarm, str_val (a), vo);
- free (the_str);
-
- if ((a = is_a_prop_of (vo, VCProcedureNameProp))){
- ical->palarm.data = g_strdup (str_val (a));
- free (the_str);
- } else
- ical->palarm.data = g_strdup ("");
- }
- }
-
- /* malarm */
- ical->malarm.type = ALARM_MAIL;
- ical->malarm.enabled = 0;
- if (has (o, VCMAlarmProp)){
- ical->malarm.type = ALARM_MAIL;
- if ((a = is_a_prop_of (vo, VCRunTimeProp))){
- setup_alarm_at (ical, &ical->malarm, str_val (a), vo);
- free (the_str);
-
- if ((a = is_a_prop_of (vo, VCEmailAddressProp))){
- ical->malarm.data = g_strdup (str_val (a));
- free (the_str);
- } else
- ical->malarm.data = g_strdup ("");
- }
- }
-
- /* rrule */
- if (has (o, VCRRuleProp)){
- if (!load_recurrence (ical, str_val (vo))) {
- ical_object_unref (ical);
- return NULL;
- }
- free (the_str);
- }
-
- /*
- * Pilot
- */
- if (has (o, XPilotIdProp)){
- ical->pilot_id = atoi (str_val (vo));
- free (the_str);
- } else
- ical->pilot_id = 0;
-
- if (has (o, XPilotStatusProp)){
- ical->pilot_status = atoi (str_val (vo));
- free (the_str);
- } else
- ical->pilot_status = ICAL_PILOT_SYNC_MOD;
-
- return ical;
-}
-
-static char *
-to_str (int num)
-{
- static char buf [40];
-
- sprintf (buf, "%d", num);
- return buf;
-}
-
-/*
- * stores a GList in the property.
- */
-static void
-store_list (VObject *o, char *prop, GList *values)
-{
- GList *l;
- int len;
- char *result, *p;
-
- for (len = 0, l = values; l; l = l->next)
- len += strlen (l->data) + 1;
-
- result = g_malloc (len);
-
- for (p = result, l = values; l; l = l->next) {
- int len = strlen (l->data);
-
- strcpy (p, l->data);
-
- if (l->next) {
- p [len] = ';';
- p += len+1;
- } else
- p += len;
- }
-
- *p = 0;
-
- addPropValue (o, prop, result);
- g_free (result);
-}
-
-static void
-store_rel_list (VObject *o, char *prop, GList *values)
-{
- GList *l;
- int len;
- char *result, *p;
-
- for (len = 0, l = values; l; l = l->next)
- len += strlen (((iCalRelation*)(l->data))->uid) + 1;
-
- result = g_malloc (len);
-
- for (p = result, l = values; l; l = l->next) {
- int len = strlen (((iCalRelation*)(l->data))->uid);
-
- strcpy (p, ((iCalRelation*)(l->data))->uid);
-
- if (l->next) {
- p [len] = ';';
- p += len+1;
- } else
- p += len;
- }
-
- *p = 0;
-
- addPropValue (o, prop, result);
- g_free (result);
-}
-
-static void
-store_date_list (VObject *o, char *prop, GList *values)
-{
- GList *l;
- int size, len;
- char *s, *p;
-
- size = g_list_length (values);
- s = p = g_malloc ((size * 17 + 1) * sizeof (char));
-
- for (l = values; l; l = l->next){
- strcpy (s, isodate_from_time_t (*(time_t *)l->data));
- len = strlen (s);
- s [len] = ',';
- s += len + 1;
- }
- s--;
- *s = 0;
- addPropValue (o, prop, p);
- g_free (p);
-}
-
-static char *recur_type_name [] = { "D", "W", "MP", "MD", "YM", "YD" };
-static char *recur_day_list [] = { "SU", "MO", "TU","WE", "TH", "FR", "SA" };
-static char *alarm_names [] = { VCMAlarmProp, VCPAlarmProp, VCDAlarmProp, VCAAlarmProp };
-
-static VObject *
-save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical)
-{
- VObject *alarm_object;
- struct tm tm;
- time_t alarm_time;
-
- if (!alarm->enabled)
- return NULL;
- tm = *localtime (&ical->dtstart);
- switch (alarm->units){
- case ALARM_MINUTES:
- tm.tm_min -= alarm->count;
- break;
-
- case ALARM_HOURS:
- tm.tm_hour -= alarm->count;
- break;
-
- case ALARM_DAYS:
- tm.tm_mday -= alarm->count;
- break;
- }
-
- alarm_time = mktime (&tm);
- alarm_object = addProp (o, alarm_names [alarm->type]);
- addPropValue (alarm_object, VCRunTimeProp, isodate_from_time_t (alarm_time));
-
- if (alarm->snooze_secs)
- addPropValue (alarm_object, VCSnoozeTimeProp, isodiff_from_secs (alarm->snooze_secs));
- else
- addPropValue (alarm_object, VCSnoozeTimeProp, "");
-
- if (alarm->snooze_repeat){
- char buf [20];
-
- sprintf (buf, "%d", alarm->snooze_repeat);
- addPropValue (alarm_object, VCRepeatCountProp, buf);
- } else
- addPropValue (alarm_object, VCRepeatCountProp, "");
- return alarm_object;
-}
-
-VObject *
-ical_object_to_vobject (iCalObject *ical)
-{
- VObject *o, *alarm, *s;
- GList *l;
-
- if (ical->type == ICAL_EVENT)
- o = newVObject (VCEventProp);
- else
- o = newVObject (VCTodoProp);
-
- /* uid */
- if (ical->uid)
- addPropValue (o, VCUniqueStringProp, ical->uid);
-
- /* seq */
- addPropValue (o, VCSequenceProp, to_str (ical->seq));
-
- /* dtstart */
- addPropValue (o, VCDTstartProp, isodate_from_time_t (ical->dtstart));
-
- /* dtend */
- if (ical->type == ICAL_EVENT){
- addPropValue (o, VCDTendProp, isodate_from_time_t (ical->dtend));
- } else if (ical->type == ICAL_TODO){
- addPropValue (o, VCDueProp, isodate_from_time_t (ical->dtend));
- }
-
- /* dcreated */
- addPropValue (o, VCDCreatedProp, isodate_from_time_t (ical->created));
-
- /* completed */
- if (ical->completed)
- addPropValue (o, VCDTendProp, isodate_from_time_t (ical->completed));
-
- /* last_mod */
- addPropValue (o, VCLastModifiedProp, isodate_from_time_t (ical->last_mod));
-
- /* exdate */
- if (ical->exdate)
- store_date_list (o, VCExpDateProp, ical->exdate);
-
- /* description/comment */
- if (ical->comment && strlen (ical->comment)){
- s = addPropValue (o, VCDescriptionProp, ical->comment);
- if (strchr (ical->comment, '\n'))
- addProp (s, VCQuotedPrintableProp);
- }
-
- /* summary */
- if (ical->summary && strlen (ical->summary)) {
- s = addPropValue (o, VCSummaryProp, ical->summary);
- if (strchr (ical->summary, '\n'))
- addProp (s, VCQuotedPrintableProp);
- }
-
- /* status */
- addPropValue (o, VCStatusProp, ical->status);
-
- /* class */
- addPropValue (o, VCClassProp, ical->class);
-
- /* categories */
- if (ical->categories)
- store_list (o, VCCategoriesProp, ical->categories);
-
- /* resources */
- if (ical->resources)
- store_list (o, VCCategoriesProp, ical->resources);
-
- /* priority */
- addPropValue (o, VCPriorityProp, to_str (ical->priority));
-
- /* transparency */
- addPropValue (o, VCTranspProp, to_str (ical->transp));
-
- /* Owner/organizer */
- if (ical->organizer && ical->organizer->addr)
- addPropValue (o, VCOrgNameProp, ical->organizer->addr);
-
- /* related */
- if (ical->related)
- store_rel_list (o, VCRelatedToProp, ical->related);
-
- /* attach */
- for (l = ical->attach; l; l = l->next)
- addPropValue (o, VCAttachProp, l->data);
-
- /* url */
- if (ical->url)
- addPropValue (o, VCURLProp, ical->url);
-
- if (ical->recur){
- char result [256];
- char buffer [80];
- int i;
-
- sprintf (result, "%s%d ", recur_type_name [ical->recur->type], ical->recur->interval);
- switch (ical->recur->type){
- case RECUR_DAILY:
- break;
-
- case RECUR_WEEKLY:
- for (i = 0; i < 7; i++){
- if (ical->recur->weekday & (1 << i)){
- sprintf (buffer, "%s ", recur_day_list [i]);
- strcat (result, buffer);
- }
- }
- break;
-
- case RECUR_MONTHLY_BY_POS: {
- int nega = ical->recur->u.month_pos < 0;
-
- sprintf (buffer, "%d%s ", nega ? -ical->recur->u.month_pos : ical->recur->u.month_pos,
- nega ? "-" : "+");
- strcat (result, buffer);
- /* the gui is set up for a single day, not a set here in this case */
- sprintf (buffer, "%s ", recur_day_list [ical->recur->weekday]);
- strcat (result, buffer);
- }
- break;
-
- case RECUR_MONTHLY_BY_DAY:
- sprintf (buffer, "%d ", ical->recur->u.month_pos);
- strcat (result, buffer);
- break;
-
- case RECUR_YEARLY_BY_MONTH:
- break;
-
- case RECUR_YEARLY_BY_DAY:
- break;
- }
- if (ical->recur->_enddate == 0)
- sprintf (buffer, "#%d ",ical->recur->duration);
- else
- sprintf (buffer, "%s ", isodate_from_time_t (ical->recur->_enddate));
- strcat (result, buffer);
- addPropValue (o, VCRRuleProp, result);
- }
-
- save_alarm (o, &ical->aalarm, ical);
- save_alarm (o, &ical->dalarm, ical);
-
- if ((alarm = save_alarm (o, &ical->palarm, ical)))
- addPropValue (alarm, VCProcedureNameProp, ical->palarm.data);
- if ((alarm = save_alarm (o, &ical->malarm, ical)))
- addPropValue (alarm, VCEmailAddressProp, ical->malarm.data);
-
- /* Pilot */
- {
- char buffer [20];
-
- sprintf (buffer, "%d", ical->pilot_id);
- addPropValue (o, XPilotIdProp, buffer);
- sprintf (buffer, "%d", ical->pilot_status);
- addPropValue (o, XPilotStatusProp, buffer);
- }
-
- return o;
-}
-
-void
-ical_foreach (GList *events, calendarfn fn, void *closure)
-{
- for (; events; events = events->next){
- iCalObject *ical = events->data;
-
- (*fn) (ical, ical->dtstart, ical->dtend, closure);
- }
-}
-
-static int
-is_date_in_list (GList *list, struct tm *date)
-{
- struct tm tm;
-
- for (; list; list = list->next){
- time_t *timep = list->data;
-
- tm = *localtime (timep);
- if (date->tm_mday == tm.tm_mday &&
- date->tm_mon == tm.tm_mon &&
- date->tm_year == tm.tm_year){
- return 1;
- }
- }
- return 0;
-}
-
-/* Generates an event instance based on the reference time */
-static gboolean
-generate (iCalObject *ico, time_t reference, calendarfn cb, void *closure)
-{
- time_t offset;
- struct tm tm_start, ref;
- time_t start, end;
-
- offset = ico->dtend - ico->dtstart;
-
- tm_start = *localtime (&ico->dtstart);
- ref = *localtime (&reference);
-
- tm_start.tm_mday = ref.tm_mday;
- tm_start.tm_mon = ref.tm_mon;
- tm_start.tm_year = ref.tm_year;
-
- start = mktime (&tm_start);
- if (start == -1) {
- g_message ("generate(): Produced invalid start date!");
- return FALSE;
- }
-
- end = start + offset;
-
-#if 0
- /* FIXME: I think this is not needed, since we are offsetting by full day values,
- * and the times should remain the same --- if you have a daily appointment
- * at 18:00, it is always at 18:00 even during daylight savings.
- *
- * However, what should happen on the exact change-of-savings day with
- * appointments in the early morning hours?
- */
-
- if (ref.tm_isdst > tm_start.tm_isdst) {
- tm_start.tm_hour--;
- tm_end.tm_hour--;
- } else if (ref.tm_isdst < tm_start.tm_isdst) {
- tm_start.tm_hour++;
- tm_end.tm_hour++;
- }
-#endif
-
- if (ico->exdate && is_date_in_list (ico->exdate, &tm_start))
- return TRUE;
-
- return (*cb) (ico, start, end, closure);
-}
-
-int
-ical_object_get_first_weekday (int weekday_mask)
-{
- int i;
-
- for (i = 0; i < 7; i++)
- if (weekday_mask & (1 << i))
- return i;
-
- return -1;
-}
-
-#define time_in_range(t, a, b) ((t >= a) && (b ? (t < b) : 1))
-#define recur_in_range(t, r) (r->enddate ? (t < r->enddate) : 1)
-
-/*
- * Generate every possible event. Invokes the callback routine for
- * every occurrence of the event in the [START, END] time interval.
- *
- * If END is zero, the event is generated forever.
- * The callback routine is expected to return 0 when no further event
- * generation is requested.
- */
-void
-ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendarfn cb, void *closure)
-{
- time_t current;
- int first_week_day;
-
- /* If there is no recurrence, just check ranges */
-
- if (!ico->recur) {
- if ((end && (ico->dtstart < end) && (ico->dtend > start))
- || ((end == 0) && (ico->dtend > start))) {
- /* The new calendar views expect the times to not be
- clipped, so they can show that it continues past
- the end of the viewable area. */
-#if 0
- time_t ev_s, ev_e;
-
- /* Clip range */
-
- ev_s = MAX (ico->dtstart, start);
- ev_e = MIN (ico->dtend, end);
-
- (* cb) (ico, ev_s, ev_e, closure);
-#else
- (* cb) (ico, ico->dtstart, ico->dtend, closure);
-#endif
- }
- return;
- }
-
- /* The event has a recurrence rule -- check that we will generate at least one instance */
-
- if (end != 0) {
- if (ico->dtstart > end)
- return;
-
- if (!IS_INFINITE (ico->recur) && (ico->recur->enddate < start))
- return;
- }
-
- /* Generate the instances */
-
- current = ico->dtstart;
-
- switch (ico->recur->type) {
- case RECUR_DAILY:
- do {
- if (time_in_range (current, start, end) && recur_in_range (current, ico->recur))
- if (!generate (ico, current, cb, closure))
- return;
-
- /* Advance */
-
- current = time_add_day (current, ico->recur->interval);
-
- if (current == -1) {
- g_warning ("RECUR_DAILY: time_add_day() returned invalid time");
- return;
- }
- } while ((current < end) || (end == 0));
-
- break;
-
- case RECUR_WEEKLY:
- do {
- struct tm tm;
-
- tm = *localtime (&current);
-
- if (time_in_range (current, start, end) && recur_in_range (current, ico->recur)) {
- /* Weekdays to recur on are specified as a bitmask */
- if (ico->recur->weekday & (1 << tm.tm_wday)) {
- if (!generate (ico, current, cb, closure))
- return;
- }
- }
-
- /* Advance by day for scanning the week or by interval at week end */
-
- if (tm.tm_wday == 6)
- current = time_add_day (current, (ico->recur->interval - 1) * 7 + 1);
- else
- current = time_add_day (current, 1);
-
- if (current == -1) {
- g_warning ("RECUR_WEEKLY: time_add_day() returned invalid time\n");
- return;
- }
- } while (current < end || (end == 0));
-
- break;
-
- case RECUR_MONTHLY_BY_POS:
- /* FIXME: We only deal with positives now */
- if (ico->recur->u.month_pos < 0) {
- g_warning ("RECUR_MONTHLY_BY_POS does not support negative positions yet");
- return;
- }
-
- if (ico->recur->u.month_pos == 0)
- return;
-
- first_week_day = /* ical_object_get_first_weekday (ico->recur->weekday); */
- ico->recur->weekday; /* the i/f only lets you choose a single day of the week! */
-
- /* This should not happen, but take it into account */
- if (first_week_day == -1) {
- g_warning ("ical_object_get_first_weekday() returned -1");
- return;
- }
-
- do {
- struct tm tm;
- time_t t;
- int week_day_start;
-
- tm = *localtime (&current);
- tm.tm_mday = 1;
- t = mktime (&tm);
- tm = *localtime (&t);
- week_day_start = tm.tm_wday;
-
- tm.tm_mday = (7 * (ico->recur->u.month_pos - ((week_day_start <= first_week_day ) ? 1 : 0))
- - (week_day_start - first_week_day) + 1);
- if( tm.tm_mday > 31 )
- {
- tm.tm_mday = 1;
- tm.tm_mon += ico->recur->interval;
- current = mktime (&tm);
- continue;
- }
-
- switch( tm.tm_mon )
- {
- case 3:
- case 5:
- case 8:
- case 10:
- if( tm.tm_mday > 30 )
- {
- tm.tm_mday = 1;
- tm.tm_mon += ico->recur->interval;
- current = mktime (&tm);
- continue;
- }
- break;
- case 1:
- if( ((tm.tm_year+1900)%4) == 0
- && ((tm.tm_year+1900)%400) != 100
- && ((tm.tm_year+1900)%400) != 200
- && ((tm.tm_year+1900)%400) != 300 )
- {
-
- if( tm.tm_mday > 29 )
- {
- tm.tm_mday = 1;
- tm.tm_mon += ico->recur->interval;
- current = mktime (&tm);
- continue;
- }
- }
- else
- {
- if( tm.tm_mday > 28 )
- {
- tm.tm_mday = 1;
- tm.tm_mon += ico->recur->interval;
- current = mktime (&tm);
- continue;
- }
- }
- break;
- }
-
- t = mktime (&tm);
-
- if (time_in_range (t, start, end) && recur_in_range (current, ico->recur))
- if (!generate (ico, t, cb, closure))
- return;
-
- /* Advance by the appropriate number of months */
-
- current = mktime (&tm);
-
- tm.tm_mday = 1;
- tm.tm_mon += ico->recur->interval;
- current = mktime (&tm);
-
- if (current == -1) {
- g_warning ("RECUR_MONTHLY_BY_DAY: mktime error\n");
- return;
- }
- } while ((current < end) || (end == 0));
-
- break;
-
- case RECUR_MONTHLY_BY_DAY:
- do {
- struct tm tm;
- time_t t;
- int p;
-
- tm = *localtime (&current);
-
- p = tm.tm_mday;
- tm.tm_mday = ico->recur->u.month_day;
- t = mktime (&tm);
- if (time_in_range (t, start, end) && recur_in_range (current, ico->recur))
- if (!generate (ico, t, cb, closure))
- return;
-
- /* Advance by the appropriate number of months */
-
- tm.tm_mday = p;
- tm.tm_mon += ico->recur->interval;
- current = mktime (&tm);
-
- if (current == -1) {
- g_warning ("RECUR_MONTHLY_BY_DAY: mktime error\n");
- return;
- }
- } while (current < end || (end == 0));
-
- break;
-
- case RECUR_YEARLY_BY_MONTH:
- case RECUR_YEARLY_BY_DAY:
- do {
- if (time_in_range (current, start, end) && recur_in_range (current, ico->recur))
- if (!generate (ico, current, cb, closure))
- return;
-
- /* Advance */
-
- current = time_add_year (current, ico->recur->interval);
- } while (current < end || (end == 0));
-
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-static int
-duration_callback (iCalObject *ico, time_t start, time_t end, void *closure)
-{
- int *count = closure;
- struct tm tm;
-
- tm = *localtime (&start);
-
- (*count)++;
- if (ico->recur->duration == *count) {
- ico->recur->enddate = time_day_end (end);
- return 0;
- }
- return 1;
-}
-
-/* Computes ico->recur->enddate from ico->recur->duration */
-void
-ical_object_compute_end (iCalObject *ico)
-{
- int count = 0;
-
- g_return_if_fail (ico->recur != NULL);
-
- ico->recur->_enddate = 0;
- ico->recur->enddate = 0;
- ical_object_generate_events (ico, ico->dtstart, 0, duration_callback, &count);
-}
-
-int
-alarm_compute_offset (CalendarAlarm *a)
-{
- if (!a->enabled)
- return -1;
- switch (a->units){
- case ALARM_MINUTES:
- a->offset = a->count * 60;
- break;
- case ALARM_HOURS:
- a->offset = a->count * 3600;
- break;
- case ALARM_DAYS:
- a->offset = a->count * 24 * 3600;
- }
- return a->offset;
-}
-
-
-/**
- * ical_object_find_in_string:
- * @uid: Unique identifier of the sought object.
- * @vcalobj: String representation of a complete calendar object.
- * @ico: The resulting #iCalObject is stored here.
- *
- * Parses a complete vCalendar object string and tries to find the calendar
- * object that matches the specified @uid. If found, it stores the resulting
- * #iCalObject in the @ico parameter.
- *
- * Return value: A result code depending on whether the parse and search were
- * successful.
- **/
-CalObjFindStatus
-ical_object_find_in_string (const char *uid, const char *vcalobj, iCalObject **ico)
-{
-#if 0
- icalcomponent* comp = NULL;
- icalcomponent *subcomp;
- iCalObject *ical;
-
- g_return_val_if_fail (vcalobj != NULL, CAL_OBJ_FIND_NOT_FOUND);
-
- comp = icalparser_parse_string (vcalobj);
-
- if (!comp) {
- printf ("CAL_OBJ_FIND_SYNTAX_ERROR #1\n");
- return CAL_OBJ_FIND_SYNTAX_ERROR;
- }
-
- subcomp = icalcomponent_get_first_component (comp,
- ICAL_ANY_COMPONENT);
- if (!subcomp) {
- printf ("CAL_OBJ_FIND_SYNTAX_ERROR #2\n");
- return CAL_OBJ_FIND_SYNTAX_ERROR;
- }
-
- while (subcomp) {
- ical = ical_object_create_from_icalcomponent (subcomp);
- if (ical->type != ICAL_EVENT &&
- ical->type != ICAL_TODO &&
- ical->type != ICAL_JOURNAL) {
- g_warning ("Skipping unsupported iCalendar component");
- } else {
- if (strcasecmp (ical->uid, uid) == 0) {
- (*ico) = ical;
- (*ico)->ref_count = 1;
- printf ("CAL_OBJ_FIND_SUCCESS\n");
-
- printf ("ical_object_find_in_string:\n");
- printf ("-----------------------------------------------------\n");
- dump_icalobject (*ico);
- printf ("-----------------------------------------------------\n");
-
-
- return CAL_OBJ_FIND_SUCCESS;
- }
- }
- subcomp = icalcomponent_get_next_component (comp,
- ICAL_ANY_COMPONENT);
- }
-
- printf ("CAL_OBJ_FIND_NOT_FOUND\n");
- return CAL_OBJ_FIND_NOT_FOUND;
-
-#else /* 1 */
- VObject *vcal;
- VObjectIterator i;
- CalObjFindStatus status;
-
- g_return_val_if_fail (uid != NULL, CAL_OBJ_FIND_SYNTAX_ERROR);
- g_return_val_if_fail (vcalobj != NULL, CAL_OBJ_FIND_SYNTAX_ERROR);
- g_return_val_if_fail (ico != NULL, CAL_OBJ_FIND_SYNTAX_ERROR);
-
- *ico = NULL;
- status = CAL_OBJ_FIND_NOT_FOUND;
-
- vcal = Parse_MIME (vcalobj, strlen (vcalobj));
-
- if (!vcal)
- return CAL_OBJ_FIND_SYNTAX_ERROR;
-
- initPropIterator (&i, vcal);
-
- while (moreIteration (&i)) {
- VObject *vobj;
- VObject *uid_prop;
- char *the_str;
-
- vobj = nextVObject (&i);
-
- uid_prop = isAPropertyOf (vobj, VCUniqueStringProp);
- if (!uid_prop)
- continue;
-
- /* str_val() sets the_str to the string representation of the
- * property.
- */
- str_val (uid_prop);
-
- if (strcmp (the_str, uid) == 0) {
- const char *object_name;
-
- object_name = vObjectName (vobj);
- *ico = ical_object_create_from_vobject (vobj, object_name);
-
- if (*ico)
- status = CAL_OBJ_FIND_SUCCESS;
- }
-
- free (the_str);
-
- if (status == CAL_OBJ_FIND_SUCCESS)
- break;
- }
-
- cleanVObject (vcal);
- cleanStrTbl ();
-
- return status;
-#endif /* 1 */
-}
-
-
-#if 1
-/* Creates a VObject with the base information of a calendar */
-static VObject *
-get_calendar_base_vobject (void)
-{
- VObject *vobj;
- time_t now;
- struct tm tm;
-
- /* We call localtime for the side effect of setting tzname */
-
- now = time (NULL);
- tm = *localtime (&now);
-
- vobj = newVObject (VCCalProp);
-
- addPropValue (vobj, VCProdIdProp, PRODID);
-
-#if defined (HAVE_TM_ZONE)
- addPropValue (vobj, VCTimeZoneProp, tm.tm_zone);
-#elif defined (HAVE_TZNAME)
- addPropValue (vobj, VCTimeZoneProp, tzname[0]);
-#endif
-
- /* Per the vCalendar spec, this must be "1.0" */
- addPropValue (vobj, VCVersionProp, "1.0");
-
- return vobj;
-}
-#endif /* 0 */
-
-/**
- * ical_object_to_string:
- * @ico: A calendar object.
- *
- * Converts a vCalendar object to its string representation. It is wrapped
- * inside a complete VCALENDAR object because other auxiliary information such
- * as timezones may appear there.
- *
- * Return value: String representation of the object.
- **/
-char *
-ical_object_to_string (iCalObject *ico)
-{
-#if 0
- icalcomponent *top = icalcomponent_new (ICAL_VCALENDAR_COMPONENT);
- char *out_cal_string;
- icalcomponent *comp;
-
- printf ("ical_object_to_string:\n");
- printf ("-----------------------------------------------------\n");
- dump_icalobject (ico);
- printf ("-----------------------------------------------------\n");
-
- comp = icalcomponent_create_from_ical_object (ico);
- icalcomponent_add_component (top, comp);
- out_cal_string = icalcomponent_as_ical_string (top);
- return g_strdup (out_cal_string);
-
-#else /* 1 */
- VObject *vcalobj, *vobj;
- char *buf, *gbuf;
-
- vcalobj = get_calendar_base_vobject ();
- vobj = ical_object_to_vobject (ico);
- addVObjectProp (vcalobj, vobj);
-
- buf = writeMemVObject (NULL, NULL, vcalobj);
-
- cleanVObject (vcalobj);
- cleanStrTbl ();
-
- /* We have to g_strdup() it because libversit uses malloc()/realloc(),
- * and we want clients to be able to use g_free(). Sigh.
- */
- gbuf = g_strdup (buf);
- free (buf);
-
- return gbuf;
-#endif /* 1 */
-}
-
-
-/**
- * ical_object_compare_dates:
- * @ico1: A calendar event.
- * @ico2: A calendar event to compare with @ico1.
- *
- * Returns TRUE if the dates of both objects match, including any recurrence
- * rules. Both calendar objects must have a type of ICAL_EVENT.
- *
- * Return value: TRUE if both calendar objects have the same dates.
- **/
-gboolean
-ical_object_compare_dates (iCalObject *ico1,
- iCalObject *ico2)
-{
- Recurrence *recur1, *recur2;
- gint num_exdates;
- GList *elem1, *elem2;
- time_t *time1, *time2;
-
- g_return_val_if_fail (ico1 != NULL, FALSE);
- g_return_val_if_fail (ico2 != NULL, FALSE);
- g_return_val_if_fail (ico1->type == ICAL_EVENT, FALSE);
- g_return_val_if_fail (ico2->type == ICAL_EVENT, FALSE);
-
- /* First check the base dates. */
- if (ico1->dtstart != ico2->dtstart
- || ico1->dtend != ico2->dtend)
- return FALSE;
-
- recur1 = ico1->recur;
- recur2 = ico2->recur;
-
- /* If the event doesn't recur, we already know it matches. */
- if (!recur1 && !recur2)
- return TRUE;
-
- /* Check that both recur. */
- if (!(recur1 && recur2))
- return FALSE;
-
- /* Now we need to see if the recurrence rules are the same. */
- if (recur1->type != recur2->type
- || recur1->interval != recur2->interval
- || recur1->enddate != recur2->enddate
- || recur1->weekday != recur2->weekday
- || recur1->duration != recur2->duration
- || recur1->_enddate != recur2->_enddate
- || recur1->__count != recur2->__count)
- return FALSE;
-
- switch (recur1->type) {
- case RECUR_MONTHLY_BY_POS:
- if (recur1->u.month_pos != recur2->u.month_pos)
- return FALSE;
- break;
- case RECUR_MONTHLY_BY_DAY:
- if (recur1->u.month_day != recur2->u.month_day)
- return FALSE;
- break;
- default:
- break;
- }
-
- /* Now check if the excluded dates match. */
- num_exdates = g_list_length (ico1->exdate);
- if (g_list_length (ico2->exdate) != num_exdates)
- return FALSE;
- if (num_exdates == 0)
- return TRUE;
-
- ico1->exdate = g_list_sort (ico1->exdate, compare_exdates);
- ico2->exdate = g_list_sort (ico2->exdate, compare_exdates);
-
- elem1 = ico1->exdate;
- elem2 = ico2->exdate;
- while (elem1) {
- time1 = (time_t*) elem1->data;
- time2 = (time_t*) elem2->data;
-
- if (*time1 != *time2)
- return FALSE;
-
- elem1 = elem1->next;
- elem2 = elem2->next;
- }
-
- return TRUE;
-}
-
-
-static gint
-compare_exdates (gconstpointer a, gconstpointer b)
-{
- const time_t *ca = a, *cb = b;
- time_t diff = *ca - *cb;
- return (diff < 0) ? -1 : (diff > 0) ? 1 : 0;
-}
-
-
-/* Converts any CR/LF sequences in the summary field to spaces so we just
- have a one-line field. The iCalObjects summary field is changed. */
-static void
-ical_object_normalize_summary (iCalObject *ico)
-{
- gchar *src, *dest, ch;
- gboolean just_output_space = FALSE;
-
- src = dest = ico->summary;
- while ((ch = *src++)) {
- if (ch == '\n' || ch == '\r') {
- /* We only output 1 space for each sequence of CR & LF
- characters. */
- if (!just_output_space) {
- *dest++ = ' ';
- just_output_space = TRUE;
- }
- } else {
- *dest++ = ch;
- just_output_space = FALSE;
- }
- }
- *dest = '\0';
-}
-
-
-void dump_icalobject (iCalObject *ico)
-{
- if (!ico) {
- printf ("<<NULL>>\n");
- return;
- }
-
- printf ("type ");
- switch (ico->type) {
- case ICAL_EVENT: printf ("event"); break;
- case ICAL_TODO: printf ("todo"); break;
- case ICAL_JOURNAL: printf ("journal"); break;
- case ICAL_FBREQUEST: printf ("fbrequest"); break;
- case ICAL_FBREPLY: printf ("fbreply"); break;
- case ICAL_BUSYTIME: printf ("busytime"); break;
- case ICAL_TIMEZONE: printf ("timezone"); break;
- }
- printf ("\n");
-
- printf ("attach-length %d\n", g_list_length (ico->attach));
-
- printf ("attendee-length %d\n", g_list_length (ico->attendee));
-
- printf ("catagories-length %d\n", g_list_length (ico->categories));
-
- printf ("class '%s'\n", ico->class ? ico->class : "NULL");
-
- printf ("comment '%s'\n", ico->comment ? ico->comment : "NULL");
-
- printf ("completed %ld=%s",
- ico->completed, ctime (&ico->completed));
-
- printf ("created %ld=%s", ico->created, ctime (&ico->created));
-
- printf ("contact-length %d\n", g_list_length (ico->contact));
-
- printf ("desc '%s'\n", ico->desc ? ico->desc : "NULL");
-
- printf ("dtstamp %ld=%s", ico->dtstamp, ctime (&ico->dtstamp));
-
- printf ("dtstart %ld=%s", ico->dtstart, ctime (&ico->dtstart));
-
- printf ("dtend %ld=%s", ico->dtend, ctime (&ico->dtend));
-
- printf ("date_only %d\n", ico->date_only);
-
- printf ("exdate-length %d\n", g_list_length (ico->exdate));
-
- printf ("exrule-length %d\n", g_list_length (ico->exrule));
-
- printf ("iCalGeo %d %f %f\n",
- ico->geo.valid, ico->geo.latitude, ico->geo.longitude);
-
- printf ("last_mod %ld=%s", ico->last_mod, ctime (&ico->last_mod));
-
- printf ("location '%s'\n", ico->location ? ico->location : "NULL");
-
- printf ("organizer %p\n", ico->organizer);
-
- printf ("percent %d\n", ico->percent);
-
- printf ("priority %d\n", ico->priority);
-
- printf ("rstatus '%s'\n", ico->rstatus ? ico->rstatus : "NULL");
-
- printf ("related-length %d\n", g_list_length (ico->related));
-
- printf ("resources-length %d\n", g_list_length (ico->resources));
-
- printf ("rdate-length %d\n", g_list_length (ico->rdate));
-
- printf ("rrule-length %d\n", g_list_length (ico->rrule));
-
- printf ("seq %d\n", ico->seq);
-
- printf ("status '%s'\n", ico->status ? ico->status : "NULL");
-
- printf ("summary '%s'\n", ico->summary ? ico->summary : "NULL");
-
- printf ("transp ");
- switch (ico->transp) {
- case ICAL_OPAQUE: printf ("opaque"); break;
- case ICAL_TRANSPARENT: printf ("transparent"); break;
- }
- printf ("\n");
-
- printf ("uid '%s'\n", ico->uid ? ico->uid : "NULL");
-
- printf ("url '%s'\n", ico->url ? ico->url : "NULL");
-
- printf ("recurid %ld=%s", ico->recurid, ctime (&ico->recurid));
-
- printf ("dalarm %d\n", ico->dalarm.enabled);
-
- printf ("aalarm %d\n", ico->aalarm.enabled);
-
- printf ("palarm %d\n", ico->palarm.enabled);
-
- printf ("malarm %d\n", ico->malarm.enabled);
-
- printf ("alarms-length %d\n", g_list_length (ico->alarms));
-
- printf ("recur %p\n", ico->recur);
-
- printf ("new %d\n", ico->new);
-
- printf ("user_data %p\n", ico->user_data);
-
- printf ("ref_count %d\n", ico->ref_count);
-}
diff --git a/calendar/cal-util/calobj.h b/calendar/cal-util/calobj.h
deleted file mode 100644
index 3caef945e2..0000000000
--- a/calendar/cal-util/calobj.h
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Internal representation of a Calendar object. This is modeled after the
- * iCalendar/vCalendar specificiation
- *
- * Authors: Miguel de Icaza (miguel@gnu.org)
- * Federico Mena (quartic@gimp.org).
- */
-#ifndef CALOBJ_H
-#define CALOBJ_H
-
-#include <libgnome/libgnome.h>
-#include "libversit/vcc.h"
-
-BEGIN_GNOME_DECLS
-
-/* Alarm types */
-enum AlarmType {
- ALARM_MAIL,
- ALARM_PROGRAM,
- ALARM_DISPLAY,
- ALARM_AUDIO
-};
-
-/* Whether the alarm should trigger N mins/hours/days before its due time */
-enum AlarmUnit {
- ALARM_MINUTES,
- ALARM_HOURS,
- ALARM_DAYS
-};
-
-/* Field identifiers for the iCalObject structure. These are also used to
- identify columns in ECalendarTable, so be careful when reordering them. */
-typedef enum {
- ICAL_OBJECT_FIELD_COMMENT,
- ICAL_OBJECT_FIELD_COMPLETED,
- ICAL_OBJECT_FIELD_CREATED,
- ICAL_OBJECT_FIELD_DESCRIPTION,
- ICAL_OBJECT_FIELD_DTSTAMP,
- ICAL_OBJECT_FIELD_DTSTART,
- ICAL_OBJECT_FIELD_DTEND,
- ICAL_OBJECT_FIELD_GEO,
- ICAL_OBJECT_FIELD_LAST_MOD,
- ICAL_OBJECT_FIELD_LOCATION,
- ICAL_OBJECT_FIELD_ORGANIZER,
- ICAL_OBJECT_FIELD_PERCENT,
- ICAL_OBJECT_FIELD_PRIORITY,
- ICAL_OBJECT_FIELD_SUMMARY,
- ICAL_OBJECT_FIELD_URL,
- ICAL_OBJECT_FIELD_HAS_ALARMS, /* not a real field */
- ICAL_OBJECT_FIELD_ICON, /* not a real field */
- ICAL_OBJECT_FIELD_COMPLETE, /* not a real field */
- ICAL_OBJECT_FIELD_RECURRING, /* not a real field */
- ICAL_OBJECT_FIELD_OVERDUE, /* not a real field */
- ICAL_OBJECT_FIELD_COLOR, /* not a real field */
- ICAL_OBJECT_FIELD_NUM_FIELDS
-} iCalObjectField;
-
-typedef struct {
- enum AlarmType type;
- int enabled;
- int count;
- enum AlarmUnit units;
- char *data; /* not used for iCalendar alarms */
-
- /* the following pointers are used for iCalendar alarms */
-
- char *attach; /* AUDIO, EMAIL, PROC */
- char *desc; /* DISPLAY, EMAIL, PROC */
- char *summary; /* EMAIL */
- char *attendee; /* EMAIL */
-
- /* Does not get saved, internally used */
- time_t offset;
- time_t trigger;
-
- int snooze_secs;
- int snooze_repeat;
-
- /* Widgets */
- void *w_count; /* A GtkEntry */
- void *w_enabled; /* A GtkChecButton */
- void *w_timesel; /* A GtkMenu */
- void *w_entry; /* A GnomeEntryFile/GtkEntry for PROGRAM/MAIL */
- void *w_label;
-} CalendarAlarm;
-
-/* Calendar object type */
-typedef enum {
- ICAL_EVENT,
- ICAL_TODO,
- ICAL_JOURNAL,
- ICAL_FBREQUEST,
- ICAL_FBREPLY,
- ICAL_BUSYTIME,
- ICAL_TIMEZONE
-} iCalType;
-
-/* For keys that might contain binary or text/binary */
-typedef struct {
- char *data;
- int len;
-} iCalValue;
-
-typedef enum {
- ICAL_PILOT_SYNC_NONE = 0,
- ICAL_PILOT_SYNC_MOD = 1,
- ICAL_PILOT_SYNC_DEL = 3
-} iCalPilotState;
-
-typedef struct {
- int valid; /* true if the Geography was specified */
- double latitude;
- double longitude;
-} iCalGeo;
-
-typedef enum {
- ICAL_OPAQUE,
- ICAL_TRANSPARENT
-} iCalTransp;
-
-typedef struct {
- char *uid;
- char *reltype;
-} iCalRelation;
-
-typedef char NotYet;
-
-enum RecurType {
- RECUR_DAILY,
- RECUR_WEEKLY,
- RECUR_MONTHLY_BY_POS,
- RECUR_MONTHLY_BY_DAY,
- RECUR_YEARLY_BY_MONTH,
- RECUR_YEARLY_BY_DAY,
-};
-
-#define DAY_LASTDAY 10000
-
-typedef struct {
- enum RecurType type;
-
- int interval;
-
- /* Used for recur computation */
- time_t enddate; /* If the value is zero, it is an infinite event
- * otherwise, it is either the _enddate value (if
- * this is what got specified) or it is our computed
- * ending date (computed from the duration item).
- */
-
- int weekday;
-
- union {
- int month_pos;
- int month_day;
- } u;
-
- int duration;
- time_t _enddate; /* As found on the vCalendar file */
- int __count;
-} Recurrence;
-
-/*
- NOTE: iCalPerson is used for various property values which specify
- people (e.g. ATTENDEE, ORGANIZER, etc. Not all fields are valid
- under RFC 2445 for all property values, but iCalPerson can store
- them anyway. Enforcing the RFC is a job for the parser.
-*/
-
-typedef struct {
- char *addr;
- char *name;
- char *role;
- char *partstat;
- gboolean rsvp;
- char *cutype; /* calendar user type */
- GList *member; /* group memberships */
- GList *deleg_to;
- GList *deleg_from;
- char *sent_by;
- char *directory;
- GList *altrep; /* list of char* URI's */
-} iCalPerson;
-
-#define IS_INFINITE(r) (r->duration == 0)
-
-/* Flags to indicate what has changed in an object */
-typedef enum {
- CHANGE_NEW = 1 << 0, /* new object */
- CHANGE_SUMMARY = 1 << 1, /* summary */
- CHANGE_DATES = 1 << 2, /* dtstart / dtend */
- CHANGE_ALL = CHANGE_SUMMARY | CHANGE_DATES
-} CalObjectChange;
-
-/*
- * This describes an iCalendar object, note that we never store durations, instead we
- * always compute the end time computed from the start + duration.
- */
-typedef struct {
- iCalType type;
-
- GList *attach; /* type: one or more URIs or binary data */
- GList *attendee; /* type: CAL-ADDRESS (list of iCalPerson) */
- GList *categories; /* type: one or more TEXT */
- char *class;
-
- char *comment; /* we collapse one or more TEXTs into one */
- time_t completed;
- time_t created;
- GList *contact; /* type: one or more TEXT */
- char *desc;
- time_t dtstamp;
- time_t dtstart;
- time_t dtend; /* also duedate for todo's */
- gboolean date_only; /* set if the start/end times were
- specified using dates, not times (internal use, not stored to disk) */
- GList *exdate; /* type: one or more time_t's */
- GList *exrule; /* type: one or more RECUR */
- iCalGeo geo;
- time_t last_mod;
- char *location;
- iCalPerson *organizer;
- int percent;
- int priority;
- char *rstatus; /* request status for freebusy */
- GList *related; /* type: one or more TEXT */
- GList *resources; /* type: one or more TEXT */
- GList *rdate; /* type: one or more recurrence date */
- GList *rrule; /* type: one or more recurrence rules */
- int seq;
- char *status;
- char *summary;
- iCalTransp transp;
- char *uid;
- char *url;
- time_t recurid;
-
- CalendarAlarm dalarm;
- CalendarAlarm aalarm;
- CalendarAlarm palarm;
- CalendarAlarm malarm;
-
- GList *alarms;
-
- Recurrence *recur;
-
- int new;
- void *user_data; /* Generic data pointer */
-
- /* Pilot */
- iCalPilotState pilot_status; /* Status information */
- guint32 pilot_id; /* Pilot ID */
-
- guint ref_count;
-} iCalObject;
-
-/* The callback for the recurrence generator */
-typedef int (*calendarfn) (iCalObject *, time_t, time_t, void *);
-
-iCalObject *ical_new (char *comment, char *organizer, char *summary);
-iCalObject *ical_object_new (void);
-
-void ical_object_ref (iCalObject *ico);
-void ical_object_unref (iCalObject *ico);
-
-iCalObject *ical_object_create_from_vobject (VObject *obj, const char *object_name);
-VObject *ical_object_to_vobject (iCalObject *ical);
-iCalObject *ical_object_duplicate (iCalObject *o);
-void ical_foreach (GList *events, calendarfn fn, void *closure);
-void ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendarfn cb, void *closure);
-void ical_object_add_exdate (iCalObject *o, time_t t);
-
-/* Computes the enddate field of the recurrence based on the duration */
-void ical_object_compute_end (iCalObject *ico);
-
-typedef enum {
- CAL_OBJ_FIND_SUCCESS,
- CAL_OBJ_FIND_SYNTAX_ERROR,
- CAL_OBJ_FIND_NOT_FOUND
-} CalObjFindStatus;
-
-CalObjFindStatus ical_object_find_in_string (const char *uid, const char *vcalobj, iCalObject **ico);
-
-char *ical_object_to_string (iCalObject *ico);
-
-
-/* Returns the first toggled day in a weekday mask -- we do this because we do not support multiple
- * days on a monthly-by-pos recurrence. If no days are toggled, it returns -1.
- */
-int ical_object_get_first_weekday (int weekday_mask);
-
-/* Returns the number of seconds configured to trigger the alarm in advance to an event */
-int alarm_compute_offset (CalendarAlarm *a);
-
-
-/* Returns TRUE if the dates of both objects match, including any recurrence
- rules. */
-gboolean ical_object_compare_dates (iCalObject *ico1, iCalObject *ico2);
-
-/* Generates a new uid for a calendar object. Should be g_free'd eventually. */
-char *ical_gen_uid (void);
-
-/* This resets any recurrence rules of the iCalObject. */
-void ical_object_reset_recurrence (iCalObject *ico);
-
-
-void dump_icalobject (iCalObject *ico);
-
-END_GNOME_DECLS
-
-#endif
-
diff --git a/calendar/cal-util/icalendar-save.c b/calendar/cal-util/icalendar-save.c
deleted file mode 100644
index 8f2335763f..0000000000
--- a/calendar/cal-util/icalendar-save.c
+++ /dev/null
@@ -1,516 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <config.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include "icalendar-save.h"
-
-
-static void unparse_person (iCalPerson *person, icalproperty *person_prop);
-static struct icaltimetype timet_to_icaltime (time_t tt);
-static icalproperty *unparse_related (iCalRelation *rel);
-static icalcomponent *unparse_alarm (CalendarAlarm *alarm);
-
-
-icalcomponent*
-icalcomponent_create_from_ical_object (iCalObject *ical)
-{
- icalcomponent_kind kind;
- icalcomponent *comp;
- icalproperty *prop;
-
- switch (ical->type) {
- case ICAL_EVENT: kind = ICAL_VEVENT_COMPONENT; break;
- case ICAL_TODO: kind = ICAL_VTODO_COMPONENT; break;
- case ICAL_JOURNAL: kind = ICAL_VJOURNAL_COMPONENT; break;
- case ICAL_FBREQUEST: kind = ICAL_VFREEBUSY_COMPONENT; break;
- case ICAL_TIMEZONE: kind = ICAL_VTIMEZONE_COMPONENT; break;
- default:
- kind = ICAL_NO_COMPONENT; break;
- }
-
- comp = icalcomponent_new (kind);
-
- /*** calscale ***/
- prop = icalproperty_new_calscale ("GREGORIAN");
- icalcomponent_add_property (comp, prop);
-
- /*** catagories ***/
- if (ical->categories) {
- /* ical->categories is a GList of (char *) */
- GList *cur;
- for (cur = ical->categories; cur; cur = cur->next) {
- prop = icalproperty_new_categories ((char *) cur);
- icalcomponent_add_property (comp, prop);
- }
- }
-
- /*** class ***/
- if (ical->class) {
- prop = icalproperty_new_class (ical->class);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** comment ***/
- if (ical->comment) {
- prop = icalproperty_new_comment (ical->comment);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** description ***/
- if (ical->desc) {
- prop = icalproperty_new_description (ical->desc);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** geo ***/
- if (ical->geo.valid) {
- struct icalgeotype v;
- v.lat = ical->geo.latitude;
- v.lon = ical->geo.longitude;
- prop = icalproperty_new_geo (v);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** location ***/
- if (ical->location) {
- prop = icalproperty_new_location (ical->location);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** percentcomplete ***/
- prop = icalproperty_new_percentcomplete (ical->percent);
- icalcomponent_add_property (comp, prop);
-
- /*** priority ***/
- if (ical->priority) {
- prop = icalproperty_new_priority (ical->priority);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** resources ***/
- if (ical->resources) {
- /* ical->resources is a GList of (char *) */
- GList *cur;
- for (cur = ical->resources; cur; cur = cur->next) {
- prop = icalproperty_new_resources ((char *) cur);
- icalcomponent_add_property (comp, prop);
- }
- }
-
- /*** status ***/
- if (ical->status) {
- prop = icalproperty_new_status (ical->status);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** summary ***/
- if (ical->summary) {
- prop = icalproperty_new_summary (ical->summary);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** completed ***/
- if (ical->completed) {
- struct icaltimetype ictime;
- ictime = timet_to_icaltime (ical->completed);
- prop = icalproperty_new_completed (ictime);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** dtend ***/ /*** due ***/
- if (ical->dtend) {
- /* FIXME: We should handle timezone specifiers */
- struct icaltimetype ictime;
- ictime = timet_to_icaltime (ical->dtend);
- if (ical->type == ICAL_TODO)
- prop = icalproperty_new_due (ictime);
- else
- prop = icalproperty_new_dtend (ictime);
- if (ical->date_only) {
- icalparameter *param;
- param = icalparameter_new (ICAL_VALUE_PARAMETER);
- icalparameter_set_value (param, ICAL_VALUE_DATE);
- icalproperty_add_parameter (prop, param);
- }
- icalcomponent_add_property (comp, prop);
- }
-
- /*** dtstart ***/
- if (ical->dtstart) {
- /* FIXME: We should handle timezone specifiers */
- struct icaltimetype ictime;
- ictime = timet_to_icaltime (ical->dtstart);
- prop = icalproperty_new_dtstart (ictime);
- if (ical->date_only) {
- icalparameter *param;
- param = icalparameter_new (ICAL_VALUE_PARAMETER);
- icalparameter_set_value (param, ICAL_VALUE_DATE);
- icalproperty_add_parameter (prop, param);
- }
- icalcomponent_add_property (comp, prop);
- }
-
- /*** duration ***/
- {
- /* FIX ME */
- }
-
- /*** freebusy ***/
- {
- /* FIX ME */
- }
-
- /*** transp ***/
- {
- if (ical->transp == ICAL_TRANSP_PROPERTY)
- prop = icalproperty_new_transp ("TRANSPARENT");
- else
- prop = icalproperty_new_transp ("OPAQUE");
- icalcomponent_add_property (comp, prop);
- }
-
- /*
- ICAL_TZID_PROPERTY:
- ICAL_TZNAME_PROPERTY:
- ICAL_TZOFFSETFROM_PROPERTY:
- ICAL_TZOFFSETTO_PROPERTY:
- ICAL_TZURL_PROPERTY:
- */
-
- /*** attendee ***/
- if (ical->attendee) {
- /* a list of (iCalPerson *) */
- GList *cur;
- for (cur = ical->attendee; cur; cur = cur->next) {
- iCalPerson *person = (iCalPerson *) cur->data;
- prop = icalproperty_new_attendee (person->addr);
- unparse_person (person, prop);
- icalcomponent_add_property (comp, prop);
- }
- }
-
- /*** contact ***/
- if (ical->contact) {
- /* a list of (iCalPerson *) */
- GList *cur;
- for (cur = ical->contact; cur; cur = cur->next) {
- iCalPerson *person = (iCalPerson *) cur->data;
- prop = icalproperty_new_contact (person->addr);
- unparse_person (person, prop);
- icalcomponent_add_property (comp, prop);
- }
- }
-
- /*** organizer ***/
- if (ical->organizer) {
- prop = icalproperty_new_organizer (ical->organizer->addr);
- unparse_person (ical->organizer, prop);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** recurrenceid ***/
- if (ical->recurid) {
- struct icaltimetype ictime;
- ictime = timet_to_icaltime (ical->recurid);
- prop = icalproperty_new_recurrenceid (ictime);
- }
-
- /*** relatedto ***/
-
- if (ical->related) {
- /* a list of (iCalPerson *) */
- GList *cur;
- for (cur = ical->related; cur; cur = cur->next) {
- iCalRelation *related = (iCalRelation *) cur->data;
- prop = unparse_related (related);
- icalcomponent_add_property (comp, prop);
- }
- }
-
-
- /*** url ***/
- if (ical->url) {
- prop = icalproperty_new_url (ical->url);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** uid ***/
- if (ical->uid) {
- prop = icalproperty_new_uid (ical->uid);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** exdate ***/
- if (ical->exdate) {
- struct icaltimetype v;
- GList *cur;
- for (cur = ical->exdate; cur; cur = cur->next) {
- time_t t = (time_t) cur->data;
- v = timet_to_icaltime (t);
- prop = icalproperty_new_exdate (v);
- icalcomponent_add_property (comp, prop);
- }
- }
-
- /*** created ***/
- if (ical->created) {
- struct icaltimetype v;
- v = timet_to_icaltime (ical->created);
- prop = icalproperty_new_created (v);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** dtstamp ***/
- if (ical->dtstamp) {
- struct icaltimetype v;
- v = timet_to_icaltime (ical->dtstamp);
- prop = icalproperty_new_created (v);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** lastmodified ***/
- if (ical->last_mod) {
- struct icaltimetype v;
- v = timet_to_icaltime (ical->last_mod);
- prop = icalproperty_new_created (v);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** sequence ***/
- if (ical->seq) {
- prop = icalproperty_new_sequence (ical->seq);
- icalcomponent_add_property (comp, prop);
- }
-
- /*** requeststatus ***/
- if (ical->rstatus) {
- prop = icalproperty_new_requeststatus (ical->rstatus);
- icalcomponent_add_property (comp, prop);
- }
-
- /* if there is a VALARM subcomponent, add it here */
-
- if (ical->alarms) {
- GList *cur;
- for (cur = ical->alarms; cur; cur = cur->next) {
- CalendarAlarm *alarm = (CalendarAlarm *) cur->data;
- icalcomponent *subcomp = unparse_alarm (alarm);
- icalcomponent_add_component (comp, subcomp);
- }
- }
-
- return comp;
-}
-
-
-/* FIX ME -- same as icaltimetype_from_timet in icaltypes.c */
-static
-struct icaltimetype timet_to_icaltime (time_t tt)
-{
- struct tm *t;
- struct icaltimetype i;
-
- //t = gmtime (&tt);
- t = localtime (&tt);
-
- /*return tt - (i->is_utc ? timezone : 0); */
- i.is_utc = 0;
-
- i.year = t->tm_year + 1900;
- i.month = t->tm_mon + 1;
- i.day = t->tm_mday;
-
- if (t->tm_hour == 0 && t->tm_min == 0 && t->tm_sec == 0) {
- i.is_date = 1;
- i.hour = 0;
- i.minute = 0;
- i.second = 0;
- } else {
- i.is_date = 0;
- i.hour = t->tm_hour;
- i.minute = t->tm_min;
- i.second = t->tm_sec;
- }
-
- return i;
-}
-
-
-/* fills in "person_prop" with information from "person" */
-
-static
-void unparse_person (iCalPerson *person, icalproperty *person_prop)
-{
- icalparameter *param;
- GList *cur;
-
- /* convert iCalPerson to an icalproperty */
-
- if (person->name) {
- param = icalparameter_new_cn (person->name);
- icalproperty_add_parameter (person_prop, param);
- }
-
- if (person->role) {
- if (g_strcasecmp (person->role, "CHAIR") == 0)
- param = icalparameter_new_role (ICAL_ROLE_CHAIR);
- else if (g_strcasecmp (person->role, "REQPARTICIPANT") == 0)
- param = icalparameter_new_role (ICAL_ROLE_REQPARTICIPANT);
- else if (g_strcasecmp (person->role, "OPTPARTICIPANT") == 0)
- param = icalparameter_new_role (ICAL_ROLE_OPTPARTICIPANT);
- else if (g_strcasecmp (person->role, "NONPARTICIPANT") == 0)
- param = icalparameter_new_role (ICAL_ROLE_NONPARTICIPANT);
- else
- param = icalparameter_new_role (ICAL_ROLE_XNAME);
- icalproperty_add_parameter (person_prop, param);
- }
-
- if (person->partstat) {
- if (g_strcasecmp (person->partstat, "NEEDSACTION") == 0)
- param = icalparameter_new_partstat (ICAL_PARTSTAT_NEEDSACTION);
- else if (g_strcasecmp (person->partstat, "ACCEPTED") == 0)
- param = icalparameter_new_partstat (ICAL_PARTSTAT_ACCEPTED);
- else if (g_strcasecmp (person->partstat, "DECLINED") == 0)
- param = icalparameter_new_partstat (ICAL_PARTSTAT_DECLINED);
- else if (g_strcasecmp (person->partstat, "TENTATIVE") == 0)
- param = icalparameter_new_partstat (ICAL_PARTSTAT_TENTATIVE);
- else if (g_strcasecmp (person->partstat, "DELEGATED") == 0)
- param = icalparameter_new_partstat (ICAL_PARTSTAT_DELEGATED);
- else if (g_strcasecmp (person->partstat, "COMPLETED") == 0)
- param = icalparameter_new_partstat (ICAL_PARTSTAT_COMPLETED);
- else if (g_strcasecmp (person->partstat, "INPROCESS") == 0)
- param = icalparameter_new_partstat (ICAL_PARTSTAT_INPROCESS);
- else /* FIX ME, NEEDSACTION instead? */
- param = icalparameter_new_partstat (ICAL_PARTSTAT_XNAME);
- icalproperty_add_parameter (person_prop, param);
- }
-
- if (person->rsvp != FALSE) {
- param = icalparameter_new_rsvp (TRUE);
- icalproperty_add_parameter (person_prop, param);
- }
-
- if (person->cutype) {
- if (g_strcasecmp (person->cutype, "INDIVIDUAL") == 0)
- param = icalparameter_new_cutype (ICAL_CUTYPE_INDIVIDUAL);
- else if (g_strcasecmp (person->cutype, "GROUP") == 0)
- param = icalparameter_new_cutype (ICAL_CUTYPE_GROUP);
- else if (g_strcasecmp (person->cutype, "RESOURCE") == 0)
- param = icalparameter_new_cutype (ICAL_CUTYPE_RESOURCE);
- else if (g_strcasecmp (person->cutype, "ROOM") == 0)
- param = icalparameter_new_cutype (ICAL_CUTYPE_ROOM);
- else /* FIX ME, INDIVIDUAL instead? */
- param = icalparameter_new_cutype (ICAL_CUTYPE_UNKNOWN);
- icalproperty_add_parameter (person_prop, param);
- }
-
- /* person->member is a list of ICAL_MEMBER_PARAMETER */
- for (cur = person->member; cur; cur = cur->next) {
- gchar *member = (gchar *) cur->data;
- param = icalparameter_new_member (member);
- icalproperty_add_parameter (person_prop, param);
- }
-
- /* person->deleg_to is a list of ICAL_DELEGATEDTO_PARAMETER */
- for (cur = person->deleg_to; cur; cur = cur->next) {
- gchar *deleg_to = (gchar *) cur->data;
- param = icalparameter_new_delegatedto (deleg_to);
- icalproperty_add_parameter (person_prop, param);
- }
-
- /* ret->deleg_from is a list of ICAL_DELEGATEDFROM_PARAMETER */
- for (cur = person->deleg_from; cur; cur = cur->next) {
- gchar *deleg_from = (gchar *) cur->data;
- param = icalparameter_new_delegatedfrom (deleg_from);
- icalproperty_add_parameter (person_prop, param);
- }
-
- if (person->sent_by) {
- param = icalparameter_new_sentby (person->sent_by);
- icalproperty_add_parameter (person_prop, param);
- }
-
- /* ret->deleg_to is a list of ICAL_DIR_PARAMETER */
- /* FIX ME ... */
-}
-
-
-static
-icalproperty *unparse_related (iCalRelation *rel)
-{
- icalproperty *prop;
-
- prop = icalproperty_new_relatedto (rel->reltype);
-
- icalproperty_set_relatedto (prop, rel->uid);
-
- /* FIX ME RELTYPE_XNAME ? */
-
- return prop;
-}
-
-
-static
-icalcomponent *unparse_alarm (CalendarAlarm *alarm)
-{
- icalcomponent *comp = icalcomponent_new (ICAL_VALARM_COMPONENT);
- icalproperty *prop;
-
- prop = NULL;
- switch (alarm->type){
- case ALARM_AUDIO:
- prop = icalproperty_new_action ("AUDIO");
- break;
- case ALARM_DISPLAY:
- prop = icalproperty_new_action ("DISPLAY");
- break;
- case ALARM_MAIL:
- prop = icalproperty_new_action ("EMAIL");
- break;
- case ALARM_PROGRAM:
- prop = icalproperty_new_action ("PROCEDURE");
- break;
- default:
- g_warning ("Unsupported alarm type!");
- break;
- }
- if (prop)
- icalcomponent_add_property (comp, prop);
-
- if (alarm->snooze_repeat)
- prop = icalproperty_new_repeat (alarm->snooze_repeat);
-
- if (alarm->snooze_secs) {
- struct icaldurationtype dur;
- dur = icaldurationtype_from_timet (alarm->snooze_secs);
- prop = icalproperty_new_duration (dur);
- icalcomponent_add_property (comp, prop);
- }
-
- if (alarm->attach) {
- struct icalattachtype *attach;
- attach = icalattachtype_new ();
- icalattachtype_set_url (attach, alarm->attach);
- prop = icalproperty_new_attach (*attach);
- icalattachtype_free (attach);
- icalcomponent_add_property (comp, prop);
- }
-
- if (alarm->desc) {
- prop = icalproperty_new_description (alarm->desc);
- icalcomponent_add_property (comp, prop);
- }
-
- if (alarm->summary) {
- prop = icalproperty_new_summary (alarm->summary);
- icalcomponent_add_property (comp, prop);
- }
-
- if (alarm->attendee) {
- icalproperty_new_attendee (alarm->attendee);
- icalcomponent_add_property (comp, prop);
- }
-
- return comp;
-}
diff --git a/calendar/cal-util/icalendar-save.h b/calendar/cal-util/icalendar-save.h
deleted file mode 100644
index 1e0ab59e70..0000000000
--- a/calendar/cal-util/icalendar-save.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef ICALENDAR_SAVE_H
-#define ICALENDAR_SAVE_H
-
-#include <ical.h>
-#include <cal-util/calobj.h>
-
-
-
-icalcomponent *icalcomponent_create_from_ical_object (iCalObject *ical);
-
-
-
-#endif
diff --git a/calendar/cal-util/icalendar-test.c b/calendar/cal-util/icalendar-test.c
deleted file mode 100644
index 921e109a2c..0000000000
--- a/calendar/cal-util/icalendar-test.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <sys/stat.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <cal-util/calobj.h>
-#include "libversit/vcc.h"
-
-#include "icalendar-save.h"
-#include "icalendar.h"
-
-
-static icalcomponent*
-icalendar_parse_file (char* fname)
-{
- FILE* fp;
- icalcomponent* comp = NULL;
- gchar* str;
- struct stat st;
- int n;
-
- fp = fopen (fname, "r");
- if (!fp) {
- g_warning ("Cannot open open calendar file.");
- return NULL;
- }
-
- stat (fname, &st);
-
- str = g_malloc (st.st_size + 2);
-
- n = fread ((gchar*) str, 1, st.st_size, fp);
- if (n != st.st_size) {
- g_warning ("Read error.");
- }
- str[n] = '\0';
-
- fclose (fp);
-
- comp = icalparser_parse_string (str);
- g_free (str);
-
- return comp;
-}
-
-
-static GList *
-icalendar_calendar_load (GList *icals, char *fname)
-{
- icalcomponent *comp;
- icalcomponent *subcomp;
- iCalObject *ical;
-
- comp = icalendar_parse_file (fname);
- subcomp = icalcomponent_get_first_component (comp,
- ICAL_ANY_COMPONENT);
- while (subcomp) {
- ical = ical_object_create_from_icalcomponent (subcomp);
- if (ical->type != ICAL_EVENT &&
- ical->type != ICAL_TODO &&
- ical->type != ICAL_JOURNAL) {
- g_warning ("Skipping unsupported iCalendar component");
- } else {
- printf ("prepending %p\n", ical);
- icals = g_list_prepend (icals, ical);
- }
- subcomp = icalcomponent_get_next_component (comp,
- ICAL_ANY_COMPONENT);
- }
-
- return icals;
-}
-
-
-
-
-static void
-icalendar_calendar_save (GList *icals, char *fname)
-{
- GList *cur;
- icalcomponent *top = icalcomponent_new (ICAL_VCALENDAR_COMPONENT);
- char *out_cal_string;
-
- for (cur=icals; cur; cur=cur->next) {
- iCalObject *ical = (iCalObject *) cur->data;
- icalcomponent *comp;
- comp = icalcomponent_create_from_ical_object (ical);
- icalcomponent_add_component (top, comp);
- }
-
- out_cal_string = icalcomponent_as_ical_string (top);
-
- printf ("---------------------------------------------------------\n");
- printf ("%s", out_cal_string);
-}
-
-
-
-int main (int argc, char *argv[])
-{
- GList *icals = NULL;
- int i;
- long int n0, n1;
- struct icaldurationtype dt;
-
-
- /* test icaldurationtype_from_timet */
- srandom (time (0));
-
- for (i=0; i<10; i++) {
- n0 = random () % ((60 * 60 * 24 * 7) * 4);
- dt = icaldurationtype_from_timet (n0);
- n1 = icaldurationtype_as_timet (dt);
-
- printf ("%ld -> (%d %d %d %d %d) -> %ld\n",
- n0,
- dt.weeks, dt.days, dt.hours, dt.minutes, dt.seconds,
- n1);
- if (n0 != n1) abort ();
- }
-
- /*****************/
- /* test conversion of icalcomponents to and from iCalObjects */
- /*****************/
-
- /* load an ical file */
-
- if (argc < 2) {
- printf ("give ical file as argument.\n");
- return 1;
- }
-
- icals = icalendar_calendar_load (icals, argv[ 1 ]);
-
- printf ("loaded %d ical components\n", g_list_length (icals));
-
-
- /* save it back out */
-
- icalendar_calendar_save (icals, "out.ical");
-
- return 0;
-}
diff --git a/calendar/cal-util/icalendar.c b/calendar/cal-util/icalendar.c
deleted file mode 100644
index c43d0fba77..0000000000
--- a/calendar/cal-util/icalendar.c
+++ /dev/null
@@ -1,673 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * icalendar server for gnomecal
- *
- * This module interfaces between libical and the gnomecal internal
- * representation
- *
- * Copyright (C) 1999 The Free Software Foundation
- * Authors:
- * Russell Steinthal (rms39@columbia.edu)
- *
- */
-
-#include <config.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include "icalendar.h"
-
-static time_t icaltime_to_timet (struct icaltimetype* i);
-static CalendarAlarm* parse_alarm (icalproperty *prop);
-static iCalPerson* parse_person (icalproperty *prop, gchar *value);
-static iCalRelation* parse_related (icalproperty *prop);
-
-/* Duplicate a string without memory leaks */
-static gchar* copy_str (gchar** store, gchar* src)
-{
- if (*store)
- g_free (*store);
- return (*store = g_strdup (src));
-}
-
-static GList*
-copy_to_list (GList** store, gchar* src)
-{
- *store = g_list_prepend (*store, g_strdup (src));
- return *store;
-}
-
-
-iCalObject *
-ical_object_create_from_icalcomponent (icalcomponent* comp)
-{
- iCalObject *ical = NULL;
- iCalPerson *person;
- icalcomponent *subcomp;
- icalproperty *prop;
- icalparameter *param;
- struct icaltimetype ictime;
- time_t *pt;
- CalendarAlarm *alarm = NULL;
- icalcomponent_kind compType;
- struct icalgeotype geo;
- struct icalperiodtype period;
-
- gboolean root = FALSE;
- gboolean attachment = FALSE;
-
- char *tmpStr; /* this is a library-owned string */
-
- ical = g_new0 (iCalObject, 1);
-
- compType = icalcomponent_isa (comp);
-
- switch (compType) {
- case ICAL_XROOT_COMPONENT:
- root = TRUE;
- break;
- case ICAL_XATTACH_COMPONENT:
- attachment = TRUE;
- break;
- case ICAL_VEVENT_COMPONENT:
- ical->type = ICAL_EVENT;
- break;
- case ICAL_VTODO_COMPONENT:
- ical->type = ICAL_TODO;
- break;
- case ICAL_VJOURNAL_COMPONENT:
- ical->type = ICAL_JOURNAL;
- break;
- case ICAL_VCALENDAR_COMPONENT:
- /* FIXME: what does this mean? */
- break;
- case ICAL_VFREEBUSY_COMPONENT:
- ical->type = ICAL_FBREQUEST;
- /* NOTE: This is not conclusive- you need to analyze
- properties to determine whether this is an
- FBREQUEST or an FBREPLY */
- break;
- case ICAL_VTIMEZONE_COMPONENT:
- ical->type = ICAL_TIMEZONE;
- break;
- case ICAL_VALARM_COMPONENT:
- case ICAL_XAUDIOALARM_COMPONENT:
- case ICAL_XDISPLAYALARM_COMPONENT:
- case ICAL_XEMAILALARM_COMPONENT:
- case ICAL_XPROCEDUREALARM_COMPONENT:
- /* this should not be reached, since this loop should
- only be processing first level components */
- break;
- case ICAL_XSTANDARD_COMPONENT:
- /* FIXME: what does this mean? */
- break;
- case ICAL_XDAYLIGHT_COMPONENT:
- /* FIXME: what does this mean? */
- break;
- case ICAL_X_COMPONENT:
- /* FIXME: what does this mean? */
- break;
- case ICAL_VSCHEDULE_COMPONENT:
- /* FIXME: what does this mean? */
- break;
- case ICAL_XLICINVALID_COMPONENT:
- /* FIXME: what does this mean? */
- break;
- case ICAL_NO_COMPONENT:
- case ICAL_ANY_COMPONENT:
- /* should not occur */
- break;
- case ICAL_VQUERY_COMPONENT:
- case ICAL_VCAR_COMPONENT:
- case ICAL_VCOMMAND_COMPONENT:
- /* FIXME: what does this mean? */
- break;
- }
-
- prop = icalcomponent_get_first_property (comp, ICAL_ANY_PROPERTY);
- while (prop) {
- switch (icalproperty_isa (prop)) {
- case ICAL_CALSCALE_PROPERTY:
- if (g_strcasecmp (icalproperty_get_calscale (prop),
- "GREGORIAN"))
- g_warning ("Unknown calendar format.");
- break;
- case ICAL_METHOD_PROPERTY:
- /* FIXME: implement something here */
- break;
- case ICAL_ATTACH_PROPERTY:
- /* FIXME: not yet implemented */
- break;
- case ICAL_CATEGORIES_PROPERTY:
- copy_to_list (&ical->categories,
- icalproperty_get_categories (prop));
- break;
- case ICAL_CLASS_PROPERTY:
- copy_str (&ical->class, icalproperty_get_class (prop));
- break;
- case ICAL_COMMENT_PROPERTY:
- /*tmpStr = icalproperty_get_comment (prop);*/
- tmpStr = g_strconcat (icalproperty_get_comment (prop),
- ical->comment,
- NULL);
- if (ical->comment)
- g_free (ical->comment);
- ical->comment = tmpStr;
- break;
- case ICAL_DESCRIPTION_PROPERTY:
- copy_str (&ical->desc,
- icalproperty_get_description (prop));
- break;
- case ICAL_GEO_PROPERTY:
- geo = icalproperty_get_geo (prop);
- ical->geo.latitude = geo.lat;
- ical->geo.longitude = geo.lon;
- ical->geo.valid = TRUE;
- break;
- case ICAL_LOCATION_PROPERTY:
- copy_str (&ical->location,
- icalproperty_get_location (prop));
- break;
- case ICAL_PERCENTCOMPLETE_PROPERTY:
- ical->percent = icalproperty_get_percentcomplete (prop);
- break;
- case ICAL_PRIORITY_PROPERTY:
- ical->priority = icalproperty_get_priority (prop);
- if (ical->priority < 0 || ical->priority > 9)
- g_warning ("Priority out-of-range (see RFC2445)");
- break;
- case ICAL_RESOURCES_PROPERTY:
- copy_to_list (&ical->resources,
- icalproperty_get_resources (prop));
- break;
- case ICAL_STATUS_PROPERTY:
- copy_str (&ical->status,
- icalproperty_get_status (prop));
- break;
- case ICAL_SUMMARY_PROPERTY:
- copy_str (&ical->summary,
- icalproperty_get_summary (prop));
- break;
- case ICAL_COMPLETED_PROPERTY:
- ictime = icalproperty_get_completed (prop);
- ical->completed = icaltime_to_timet (&ictime);
- break;
- case ICAL_DTEND_PROPERTY:
- ictime = icalproperty_get_dtend (prop);
- ical->dtend = icaltime_to_timet (&ictime);
- param = icalproperty_get_first_parameter (prop,
- ICAL_VALUE_PARAMETER);
- if (param)
- ical->date_only = (icalparameter_get_value (param) == ICAL_VALUE_DATE);
- /* FIXME: We should handle timezone specifiers */
- break;
- case ICAL_DUE_PROPERTY:
- ictime = icalproperty_get_due (prop);
- ical->dtend = icaltime_to_timet (&ictime);
- param = icalproperty_get_first_parameter (prop,
- ICAL_VALUE_PARAMETER);
- ical->date_only = (icalparameter_get_value (param) ==
- ICAL_VALUE_DATE);
- /* FIXME: We should handle timezone specifiers */
- break;
- case ICAL_DTSTART_PROPERTY:
- ictime = icalproperty_get_dtstart (prop);
- ical->dtstart = icaltime_to_timet (&ictime);
- param = icalproperty_get_first_parameter (prop,
- ICAL_VALUE_PARAMETER);
- if (param)
- ical->date_only = (icalparameter_get_value (param) == ICAL_VALUE_DATE);
- /* FIXME: We should handle timezone specifiers */
- break;
- case ICAL_DURATION_PROPERTY:
- /* FIXME: I don't see the necessary libical function */
- break;
- case ICAL_FREEBUSY_PROPERTY:
- period = icalproperty_get_freebusy (prop);
- ical->dtstart = icaltime_to_timet (&(period.start));
- /* FIXME: period.end is specified as being relative
- to start, so this may not be correct */
- ical->dtend = icaltime_to_timet (&(period.end));
- break;
- case ICAL_TRANSP_PROPERTY:
- tmpStr = icalproperty_get_transp (prop);
- /* do not i18n the following string constant! */
- if (!g_strcasecmp (tmpStr, "TRANSPARENT"))
- ical->transp = ICAL_TRANSPARENT;
- else
- ical->transp = ICAL_OPAQUE;
- break;
- case ICAL_TZID_PROPERTY:
- case ICAL_TZNAME_PROPERTY:
- case ICAL_TZOFFSETFROM_PROPERTY:
- case ICAL_TZOFFSETTO_PROPERTY:
- case ICAL_TZURL_PROPERTY:
- /* no implementation for now */
- break;
- case ICAL_ATTENDEE_PROPERTY:
- tmpStr = icalproperty_get_attendee (prop);
- person = parse_person (prop, tmpStr);
- ical->attendee = g_list_prepend (ical->attendee,
- person);
- break;
- case ICAL_CONTACT_PROPERTY:
- tmpStr = icalproperty_get_contact (prop);
- person = parse_person (prop, tmpStr);
- ical->contact = g_list_prepend (ical->contact, person);
- break;
- case ICAL_ORGANIZER_PROPERTY:
- tmpStr = icalproperty_get_organizer (prop);
- person = parse_person (prop, tmpStr);
- if (ical->organizer)
- g_free (ical->organizer);
- ical->organizer = person;
- break;
- case ICAL_RECURRENCEID_PROPERTY:
- ictime = icalproperty_get_recurrenceid (prop);
- ical->recurid = icaltime_to_timet (&ictime);
- /* FIXME: Range parameter not implemented */
- break;
- case ICAL_RELATEDTO_PROPERTY:
- ical->related = g_list_prepend (ical->related,
- parse_related (prop));
- break;
- case ICAL_URL_PROPERTY:
- copy_str (&ical->url,
- icalproperty_get_url (prop));
- break;
- case ICAL_UID_PROPERTY:
- copy_str (&ical->uid,
- icalproperty_get_uid (prop));
- break;
- case ICAL_EXDATE_PROPERTY:
- /* FIXME: This does not appear to parse
- multiple exdate values in one property, as
- allowed by the RFC; needs a libical fix */
- ictime = icalproperty_get_exdate (prop);
- pt = g_new0 (time_t, 1);
- *pt = icaltime_to_timet (&ictime);
- ical->exdate = g_list_prepend (ical->exdate, pt);
- break;
- case ICAL_EXRULE_PROPERTY:
- case ICAL_RDATE_PROPERTY:
- case ICAL_RRULE_PROPERTY:
- /* FIXME: need recursion processing */
- break;
- case ICAL_ACTION_PROPERTY:
- case ICAL_REPEAT_PROPERTY:
- case ICAL_TRIGGER_PROPERTY:
- /* should only occur in VALARM's, handled below */
- g_assert_not_reached();
- break;
- case ICAL_CREATED_PROPERTY:
- ictime = icalproperty_get_created (prop);
- ical->created = icaltime_to_timet (&ictime);
- break;
- case ICAL_DTSTAMP_PROPERTY:
- ictime = icalproperty_get_dtstamp (prop);
- ical->dtstamp = icaltime_to_timet (&ictime);
- break;
- case ICAL_LASTMODIFIED_PROPERTY:
- ictime = icalproperty_get_lastmodified (prop);
- ical->last_mod = icaltime_to_timet (&ictime);
- break;
- case ICAL_SEQUENCE_PROPERTY:
- ical->seq = icalproperty_get_sequence (prop);
- break;
- case ICAL_REQUESTSTATUS_PROPERTY:
- copy_str (&ical->rstatus,
- icalproperty_get_requeststatus (prop));
- break;
- case ICAL_X_PROPERTY:
- g_warning ("Unsupported X-property: %s",
- icalproperty_as_ical_string (prop));
- break;
- case ICAL_XLICERROR_PROPERTY:
- g_warning ("Unsupported property: %s",
- icalproperty_get_xlicerror (prop));
- break;
- case ICAL_PRODID_PROPERTY:
- case ICAL_VERSION_PROPERTY:
- /* nothing to do for this property */
- break;
- default:
- g_warning ("Unsupported property: %s", icalproperty_as_ical_string (prop));
- break;
-
- }
-
- prop = icalcomponent_get_next_property (comp,
- ICAL_ANY_PROPERTY);
- }
-
- /* now parse subcomponents --- should only be VALARM's */
- subcomp = icalcomponent_get_first_component (comp,
- ICAL_ANY_COMPONENT);
- while (subcomp) {
- compType = icalcomponent_isa (subcomp);
- switch (compType) {
- case ICAL_VALARM_COMPONENT:
- alarm = parse_alarm (subcomp);
- if (alarm)
- ical->alarms = g_list_prepend (ical->alarms,
- alarm);
- break;
- default:
- g_warning ("Only nested VALARM components are supported.");
- }
-
- subcomp = icalcomponent_get_next_component (comp,
- ICAL_ANY_COMPONENT);
- }
-
- return ical;
-}
-
-
-static time_t icaltime_to_timet (struct icaltimetype* i)
-{
- struct tm t;
- time_t ret;
-
- t.tm_year = i->year - 1900;
- t.tm_mon = i->month - 1;
- t.tm_mday = i->day;
- if (!i->is_date) {
- t.tm_hour = i->hour;
- t.tm_min = i->minute;
- t.tm_sec = i->second;
- } else {
- t.tm_hour = 0;
- t.tm_min = 0;
- t.tm_sec = 0;
- }
-
- ret = mktime(&t);
-
- if (i->is_utc) {
-#ifdef HAVE_TIMEZONE
- extern long timezone;
- ret -= timezone;
-#else
- struct tm *tmp;
- time_t tod = time(NULL);
- tmp = localtime (&tod);
- ret += tmp->tm_gmtoff;
-#endif
- }
-
- return ret;
-}
-
-static iCalPerson*
-parse_person (icalproperty* prop, gchar* value)
-{
- icalparameter* param;
- icalparameter_role role;
- icalparameter_partstat partstat;
- icalparameter_cutype cutype;
-
- iCalPerson* ret;
-
- ret = g_new0 (iCalPerson, 1);
-
- ret->addr = g_strdup (value);
-
- param = icalproperty_get_first_parameter (prop,
- ICAL_CN_PARAMETER);
- if (param)
- ret->name = g_strdup (icalparameter_get_cn (param));
- else
- ret->name = NULL;
-
-
- param = icalproperty_get_first_parameter (prop,
- ICAL_ROLE_PARAMETER);
- if (param) {
- role = icalparameter_get_role (param);
- switch (role) {
- case ICAL_ROLE_CHAIR:
- ret->role = g_strdup ("CHAIR");
- break;
- case ICAL_ROLE_REQPARTICIPANT:
- ret->role = g_strdup ("REQPARTICIPANT");
- break;
- case ICAL_ROLE_OPTPARTICIPANT:
- ret->role = g_strdup ("OPTPARTICIPANT");
- break;
- case ICAL_ROLE_NONPARTICIPANT:
- ret->role = g_strdup ("NONPARTICIPANT");
- break;
- case ICAL_ROLE_XNAME:
- default:
- ret->role = g_strdup ("UNKNOWN");
- break;
- }
- } else
- ret->role = g_strdup ("REQPARTICIPANT");
-
- param = icalproperty_get_first_parameter (prop, ICAL_PARTSTAT_PARAMETER);
- if (param) {
- partstat = icalparameter_get_partstat (param);
- switch (partstat) {
- case ICAL_PARTSTAT_NEEDSACTION:
- ret->partstat = g_strdup ("NEEDSACTION");
- break;
- case ICAL_PARTSTAT_ACCEPTED:
- ret->partstat = g_strdup ("ACCEPTED");
- break;
- case ICAL_PARTSTAT_DECLINED:
- ret->partstat = g_strdup ("DECLINED");
- break;
- case ICAL_PARTSTAT_TENTATIVE:
- ret->partstat = g_strdup ("TENTATIVE");
- break;
- case ICAL_PARTSTAT_DELEGATED:
- ret->partstat = g_strdup ("DELEGATED");
- break;
- case ICAL_PARTSTAT_COMPLETED:
- ret->partstat = g_strdup ("COMPLETED");
- break;
- case ICAL_PARTSTAT_INPROCESS:
- ret->partstat = g_strdup ("INPROCESS");
- break;
- case ICAL_PARTSTAT_XNAME:
- ret->partstat = g_strdup (icalparameter_get_xvalue (param));
- break;
- default:
- ret->partstat = g_strdup ("UNKNOWN");
- break;
- }
- } else
- ret->partstat = g_strdup ("NEEDSACTION");
-
- param = icalproperty_get_first_parameter (prop, ICAL_RSVP_PARAMETER);
- if (param)
- ret->rsvp = icalparameter_get_rsvp (param);
- else
- ret->rsvp = FALSE;
-
- param = icalproperty_get_first_parameter (prop, ICAL_CUTYPE_PARAMETER
-);
- if (param) {
- cutype = icalparameter_get_cutype (param);
- switch (cutype) {
- case ICAL_CUTYPE_INDIVIDUAL:
- ret->cutype = g_strdup ("INDIVIDUAL");
- break;
- case ICAL_CUTYPE_GROUP:
- ret->cutype = g_strdup ("GROUP");
- break;
- case ICAL_CUTYPE_RESOURCE:
- ret->cutype = g_strdup ("RESOURCE");
- break;
- case ICAL_CUTYPE_ROOM:
- ret->cutype = g_strdup ("ROOM");
- break;
- case ICAL_CUTYPE_UNKNOWN:
- case ICAL_CUTYPE_XNAME:
- default:
- ret->cutype = g_strdup ("UNKNOWN");
- break;
- }
- } else
- ret->cutype = g_strdup ("INDIVIDUAL");
-
- param = icalproperty_get_first_parameter (prop, ICAL_MEMBER_PARAMETER
-);
- while (param) {
- copy_to_list (&ret->member, icalparameter_get_member (param));
- param = icalproperty_get_next_parameter (prop,
- ICAL_MEMBER_PARAMETER);
- }
-
- param = icalproperty_get_first_parameter (prop, ICAL_DELEGATEDTO_PARAMETER);
- while (param) {
- copy_to_list (&ret->deleg_to,
- icalparameter_get_delegatedto (param));
- param = icalproperty_get_next_parameter (prop,
- ICAL_DELEGATEDTO_PARAMETER);
- }
-
- param = icalproperty_get_first_parameter (prop, ICAL_DELEGATEDFROM_PARAMETER);
- while (param) {
- copy_to_list (&ret->deleg_from,
- icalparameter_get_delegatedfrom (param));
- param = icalproperty_get_next_parameter (prop,
- ICAL_DELEGATEDFROM_PARAMETER);
- }
-
- param = icalproperty_get_first_parameter (prop, ICAL_SENTBY_PARAMETER);
- if (param)
- copy_str (&ret->sent_by, icalparameter_get_sentby (param));
- else
- ret->sent_by = NULL;
-
- param = icalproperty_get_first_parameter (prop, ICAL_DIR_PARAMETER);
- while (param) {
- copy_to_list (&ret->deleg_to,
- icalparameter_get_delegatedto (param));
- param = icalproperty_get_next_parameter (prop,
- ICAL_DIR_PARAMETER);
- }
-
- return ret;
-}
-
-static iCalRelation*
-parse_related (icalproperty* prop)
-{
- iCalRelation* rel;
- icalparameter* param;
- icalparameter_reltype type;
-
- rel = g_new0 (iCalRelation, 1);
- rel->uid = g_strdup (icalproperty_get_relatedto (prop));
-
- param = icalproperty_get_first_parameter (prop,
- ICAL_RELTYPE_PARAMETER);
- if (param) {
- type = icalparameter_get_reltype (param);
- switch (type) {
- case ICAL_RELTYPE_PARENT:
- rel->reltype = g_strdup ("PARENT");
- break;
- case ICAL_RELTYPE_CHILD:
- rel->reltype = g_strdup ("CHILD");
- break;
- case ICAL_RELTYPE_SIBLING:
- rel->reltype = g_strdup ("SIBLING");
- break;
- case ICAL_RELTYPE_XNAME:
- rel->reltype = g_strdup (icalparameter_get_xvalue (param));
- break;
- default:
- rel->reltype = g_strdup ("UNKNOWN");
- break;
- }
- } else
- rel->reltype = g_strdup ("PARENT");
-
- return rel;
-}
-
-#ifdef TEST
-
-int main(int argc, char* argv[])
-{
- icalcomponent* comp;
- comp = icalendar_parse_file (argv[1]);
- printf ("%s\n", icalcomponent_as_ical_string (comp));
- return 0;
-}
-
-#endif
-
-
-static CalendarAlarm*
-parse_alarm (icalcomponent* comp)
-{
- CalendarAlarm *alarm;
- icalproperty *prop;
- char *tmpStr;
- struct icaldurationtype dur;
- struct icalattachtype attach;
-
- g_return_val_if_fail (comp != NULL, NULL);
-
- alarm = g_new0 (CalendarAlarm, 1);
-
- prop = icalcomponent_get_first_property (comp, ICAL_ANY_PROPERTY);
- while (prop) {
- switch (icalproperty_isa (prop)) {
- case ICAL_ACTION_PROPERTY:
- tmpStr = icalproperty_get_action (prop);
- if (!g_strcasecmp (tmpStr, "AUDIO"))
- alarm->type = ALARM_AUDIO;
- else if (!g_strcasecmp (tmpStr, "DISPLAY"))
- alarm->type = ALARM_DISPLAY;
- else if (!g_strcasecmp (tmpStr, "EMAIL"))
- alarm->type = ALARM_MAIL;
- else if (!g_strcasecmp (tmpStr, "PROCEDURE"))
- alarm->type = ALARM_PROGRAM;
- else
- g_warning ("Unsupported alarm type!");
- break;
- case ICAL_TRIGGER_PROPERTY:
- /* FIXME: waiting on proper libical support */
- break;
- case ICAL_REPEAT_PROPERTY:
- alarm->snooze_repeat = icalproperty_get_repeat (prop);
- break;
- case ICAL_DURATION_PROPERTY:
- dur = icalproperty_get_duration (prop);
- alarm->snooze_secs = icaldurationtype_as_timet (dur);
- break;
- case ICAL_ATTACH_PROPERTY:
- attach = icalproperty_get_attach (prop);
- copy_str (&alarm->attach,
- icalattachtype_get_url (&attach));
- break;
- case ICAL_DESCRIPTION_PROPERTY:
- copy_str (&alarm->desc,
- icalproperty_get_description (prop));
- break;
- case ICAL_SUMMARY_PROPERTY:
- copy_str (&alarm->summary,
- icalproperty_get_summary (prop));
- break;
- case ICAL_ATTENDEE_PROPERTY:
- copy_str (&alarm->attendee,
- icalproperty_get_attendee (prop));
- break;
- default:
- g_warning ("Unsupported alarm property: %s",
- icalproperty_as_ical_string (prop));
- break;
- }
-
- prop = icalcomponent_get_next_property (comp,
- ICAL_ANY_PROPERTY);
- }
-
- return alarm;
-}
diff --git a/calendar/cal-util/icalendar.h b/calendar/cal-util/icalendar.h
deleted file mode 100644
index 2a22fbab71..0000000000
--- a/calendar/cal-util/icalendar.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef ICALENDAR_H
-#define ICALENDAR_H
-
-#include <ical.h>
-#include <cal-util/calobj.h>
-
-
-
-iCalObject *ical_object_create_from_icalcomponent (icalcomponent* comp);
-
-
-
-#endif
diff --git a/calendar/cal-util/test-recur.c b/calendar/cal-util/test-recur.c
deleted file mode 100644
index 83602bb0d6..0000000000
--- a/calendar/cal-util/test-recur.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * This tests the recurrence rule expansion functions.
- */
-
-#include <config.h>
-#include <string.h>
-#include <time.h>
-#include <glib.h>
-#include "cal-recur.h"
-
-static void set_time (CalObjTime *cotime, gint year, gint month, gint day,
- gint hour, gint minute, gint second);
-static void display_occs (GArray *occs);
-static GList* build_list (gint first, ...);
-static gchar* time_to_string (CalObjTime *cotime);
-static void do_test (gchar *description,
- CalObjTime *event_start,
- CalObjRecurrence *recur,
- CalObjTime *interval_start,
- CalObjTime *interval_end);
-
-#define LIST_END 999
-
-static void
-test_yearly ()
-{
- CalObjTime event_start, interval_start, interval_end;
- CalObjRecurrence recur;
-
- set_time (&event_start, 2000, 0, 1, 0, 0, 0);
-
- /* We set the interval to a wide range so we just test the event. */
- set_time (&interval_start, 2000, 0, 1, 0, 0, 0);
- set_time (&interval_end, 2010, 0, 1, 0, 0, 0);
-
- memset (&recur, 0, sizeof (recur));
- recur.type = CAL_RECUR_YEARLY;
- recur.interval = 3;
- recur.byweekno = build_list (3, 9, 24, LIST_END);
- recur.byday = build_list (3, 0, 5, 0, LIST_END);
- do_test ("YEARLY every 3 years in weeks 3, 9, 24 on Thu/Sat",
- &event_start, &recur, &interval_start, &interval_end);
-
-
- set_time (&interval_end, 2002, 0, 1, 0, 0, 0);
- memset (&recur, 0, sizeof (recur));
- recur.type = CAL_RECUR_YEARLY;
- recur.interval = 1;
- recur.bymonth = build_list (0, 6, LIST_END);
- recur.byday = build_list (0, 0, 6, 0, LIST_END);
- do_test ("YEARLY every year in Jan/Jul on Mon/Sun",
- &event_start, &recur, &interval_start, &interval_end);
-
-
- memset (&recur, 0, sizeof (recur));
- recur.type = CAL_RECUR_YEARLY;
- recur.interval = 1;
- recur.bymonthday = build_list (3, 7, LIST_END);
- do_test ("YEARLY every year on 3rd & 7th of the month",
- &event_start, &recur, &interval_start, &interval_end);
-
-
-
- memset (&recur, 0, sizeof (recur));
- recur.type = CAL_RECUR_YEARLY;
- recur.interval = 1;
- recur.byyearday = build_list (15, 126, 360, LIST_END);
- do_test ("YEARLY every year on 15th, 126th & 360th day of the year",
- &event_start, &recur, &interval_start, &interval_end);
-
-}
-
-
-static void
-test_monthly ()
-{
- CalObjTime event_start, interval_start, interval_end;
- CalObjRecurrence recur;
-
- set_time (&event_start, 2000, 0, 1, 0, 0, 0);
-
- /* We set the interval to a wide range so we just test the event. */
- set_time (&interval_start, 2000, 0, 1, 0, 0, 0);
- set_time (&interval_end, 2002, 0, 1, 0, 0, 0);
-
- memset (&recur, 0, sizeof (recur));
- recur.type = CAL_RECUR_MONTHLY;
- recur.interval = 1;
- do_test ("MONTHLY every month",
- &event_start, &recur, &interval_start, &interval_end);
-
-}
-
-static void
-test_weekly ()
-{
- CalObjTime event_start, interval_start, interval_end;
- CalObjRecurrence recur;
-
- set_time (&event_start, 2000, 0, 1, 0, 0, 0);
-
- /* We set the interval to a wide range so we just test the event. */
- set_time (&interval_start, 2000, 0, 1, 0, 0, 0);
- set_time (&interval_end, 2002, 0, 1, 0, 0, 0);
-
- memset (&recur, 0, sizeof (recur));
- recur.type = CAL_RECUR_WEEKLY;
- recur.interval = 1;
- do_test ("WEEKLY every week",
- &event_start, &recur, &interval_start, &interval_end);
-
-}
-
-static void
-test_daily ()
-{
- CalObjTime event_start, interval_start, interval_end;
- CalObjRecurrence recur;
-
- set_time (&event_start, 2000, 0, 1, 0, 0, 0);
-
- /* We set the interval to a wide range so we just test the event. */
- set_time (&interval_start, 2000, 0, 1, 0, 0, 0);
- set_time (&interval_end, 2000, 6, 1, 0, 0, 0);
-
- memset (&recur, 0, sizeof (recur));
- recur.type = CAL_RECUR_DAILY;
- recur.interval = 1;
- do_test ("DAILY every day",
- &event_start, &recur, &interval_start, &interval_end);
-
-}
-
-static void
-test_hourly ()
-{
- CalObjTime event_start, interval_start, interval_end;
- CalObjRecurrence recur;
-
- set_time (&event_start, 2000, 0, 1, 2, 15, 0);
-
- /* We set the interval to a wide range so we just test the event. */
- set_time (&interval_start, 2000, 0, 1, 0, 0, 0);
- set_time (&interval_end, 2002, 0, 1, 0, 0, 0);
-
- memset (&recur, 0, sizeof (recur));
- recur.type = CAL_RECUR_HOURLY;
- recur.interval = 3;
- recur.bymonth = build_list (3, 11, LIST_END);
- recur.byday = build_list (2, 0, 4, 0, LIST_END);
- do_test ("HOURLY every 3 hours in Apr/Dec on Wed & Fri",
- &event_start, &recur, &interval_start, &interval_end);
-}
-
-static void
-test_minutely ()
-{
- CalObjTime event_start, interval_start, interval_end;
- CalObjRecurrence recur;
-
- set_time (&event_start, 2000, 0, 1, 0, 0, 0);
-
- /* We set the interval to a wide range so we just test the event. */
- set_time (&interval_start, 2000, 0, 1, 0, 0, 0);
- set_time (&interval_end, 2000, 0, 2, 0, 0, 0);
-
- memset (&recur, 0, sizeof (recur));
- recur.type = CAL_RECUR_MINUTELY;
- recur.interval = 45;
- do_test ("MINUTELY every 45 minutes",
- &event_start, &recur, &interval_start, &interval_end);
-}
-
-static void
-test_secondly ()
-{
- CalObjTime event_start, interval_start, interval_end;
- CalObjRecurrence recur;
-
- set_time (&event_start, 2000, 0, 1, 0, 0, 0);
-
- /* We set the interval to a wide range so we just test the event. */
- set_time (&interval_start, 2000, 0, 1, 0, 0, 0);
- set_time (&interval_end, 2000, 0, 2, 0, 0, 0);
-
- memset (&recur, 0, sizeof (recur));
- recur.type = CAL_RECUR_SECONDLY;
- recur.interval = 15;
- recur.byhour = build_list (2, 4, 6, LIST_END);
- recur.byminute = build_list (0, 30, LIST_END);
- do_test ("SECONDLY every 15 seconds at 2:00,2:30,4:00,4:30,6:00,6:30",
- &event_start, &recur, &interval_start, &interval_end);
-}
-
-int
-main (int argc, char *argv[])
-{
-
- test_yearly ();
- test_monthly ();
- test_weekly ();
- test_daily ();
- test_hourly ();
- test_minutely ();
- test_secondly ();
-
- return 0;
-}
-
-
-static void
-set_time (CalObjTime *cotime, gint year, gint month, gint day,
- gint hour, gint minute, gint second)
-{
- cotime->year = year;
- cotime->month = month;
- cotime->day = day;
- cotime->hour = hour;
- cotime->minute = minute;
- cotime->second = second;
-}
-
-
-static GList*
-build_list (gint first, ...)
-{
- va_list args;
- GList *list;
- gint num;
-
- va_start (args, first);
-
- list = g_list_prepend (NULL, GINT_TO_POINTER (first));
-
- num = va_arg (args, gint);
- while (num != LIST_END) {
- list = g_list_prepend (list, GINT_TO_POINTER (num));
- num = va_arg (args, gint);
- }
-
- list = g_list_reverse (list);
-
- va_end (args);
-
- return list;
-}
-
-
-static void
-do_test (gchar *description,
- CalObjTime *event_start,
- CalObjRecurrence *recur,
- CalObjTime *interval_start,
- CalObjTime *interval_end)
-{
- GArray *occs;
-
- g_print ("========================================================\n");
- g_print ("%s\n", description);
- g_print ("(From %s", time_to_string (interval_start));
- g_print (" To %s)\n\n", time_to_string (interval_end));
-
- occs = cal_obj_expand_recurrence (event_start, recur,
- interval_start, interval_end);
- display_occs (occs);
- g_array_free (occs, TRUE);
-}
-
-
-static gchar*
-time_to_string (CalObjTime *cotime)
-{
- static gchar buffer[64];
- gint month;
- gchar *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "XXX" };
-
- month = cotime->month;
- if (month < 0 || month > 12)
- month = 12;
-
- sprintf (buffer, "%s %2i %02i:%02i:%02i %4i",
- months[month], cotime->day,
- cotime->hour, cotime->minute, cotime->second,
- cotime->year);
-
- return buffer;
-}
-
-static void
-display_occs (GArray *occs)
-{
- CalObjTime *occ;
- gint len, i;
- struct tm t;
-
- len = occs->len;
- for (i = 0; i < len; i++) {
- occ = &g_array_index (occs, CalObjTime, i);
-
- t.tm_sec = occ->second;
- t.tm_min = occ->minute;
- t.tm_hour = occ->hour;
- t.tm_mday = occ->day;
- t.tm_mon = occ->month;
- t.tm_year = occ->year - 1900;
- t.tm_isdst = -1;
-
- mktime (&t);
-
- g_print ("%s", asctime (&t));
- }
-}
diff --git a/calendar/cal-util/timeutil.c b/calendar/cal-util/timeutil.c
deleted file mode 100644
index bbce9b82d6..0000000000
--- a/calendar/cal-util/timeutil.c
+++ /dev/null
@@ -1,590 +0,0 @@
-/* Miscellaneous time-related utilities
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Authors: Federico Mena <federico@nuclecu.unam.mx>
- * Miguel de Icaza <miguel@nuclecu.unam.mx>
- */
-
-#include <libgnome/libgnome.h>
-#include <string.h>
-#include "timeutil.h"
-
-
-
-/**
- * time_from_icaltimetype:
- * @itt: A struct icaltimetype value.
- *
- * Converts a struct icaltimetype value into a time_t value. Does not deal with
- * timezones.
- *
- * Return value: A time_t value.
- **/
-time_t
-time_from_icaltimetype (struct icaltimetype itt)
-{
- struct tm tm;
-
- /* FIXME: this does not handle timezones */
-
- memset (&tm, 0, sizeof (tm));
-
- tm.tm_year = itt.year - 1900;
- tm.tm_mon = itt.month - 1;
- tm.tm_mday = itt.day;
-
- if (!itt.is_date) {
- tm.tm_hour = itt.hour;
- tm.tm_min = itt.minute;
- tm.tm_sec = itt.second;
- }
-
- return mktime (&tm);
-}
-
-#define digit_at(x,y) (x [y] - '0')
-
-time_t
-time_from_isodate (char *str)
-{
- struct tm my_tm;
- time_t t;
-
- if (strlen (str) < 14)
- return -1;
-
- my_tm.tm_year = (digit_at (str, 0) * 1000 + digit_at (str, 1) * 100 +
- digit_at (str, 2) * 10 + digit_at (str, 3)) - 1900;
-
- my_tm.tm_mon = digit_at (str, 4) * 10 + digit_at (str, 5) - 1;
- my_tm.tm_mday = digit_at (str, 6) * 10 + digit_at (str, 7);
- my_tm.tm_hour = digit_at (str, 9) * 10 + digit_at (str, 10);
- my_tm.tm_min = digit_at (str, 11) * 10 + digit_at (str, 12);
- my_tm.tm_sec = digit_at (str, 13) * 10 + digit_at (str, 14);
- my_tm.tm_isdst = -1;
-
- t = mktime (&my_tm);
-
- if (str [15] == 'Z')
-#if defined(HAVE_TM_GMTOFF)
- t -= my_tm.tm_gmtoff
-#elsif defined(HAVE_TIMEZONE)
- t -= timezone
-#endif
- ;
-
- return t;
-}
-
-void
-print_time_t (time_t t)
-{
- struct tm *tm = localtime (&t);
-
- printf ("TIEMPO: %d/%d/%d %d:%d:%d\n",
- tm->tm_mon+1, tm->tm_mday, tm->tm_year,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
-}
-
-int
-get_time_t_hour (time_t t)
-{
- struct tm *tm;
-
- tm = localtime (&t);
- return tm->tm_hour;
-}
-
-char *
-isodate_from_time_t (time_t t)
-{
- struct tm *tm;
- static char isotime [40];
-
- tm = localtime (&t);
- strftime (isotime, sizeof (isotime)-1, "%Y%m%dT%H%M%S", tm);
- return isotime;
-}
-
-time_t
-time_from_start_duration (time_t start, char *duration)
-{
- printf ("Not yet implemented\n");
- return 0;
-}
-
-char *
-format_simple_hour (int hour, int use_am_pm)
-{
- static char buf[256];
-
- /* I don't know whether this is the best way to internationalize it.
- * Does any language use different conventions? - Federico
- */
-
- if (use_am_pm)
- g_snprintf (buf, sizeof(buf), "%d%s",
- (hour == 0) ? 12 : (hour > 12) ? (hour - 12) : hour,
- (hour < 12) ? _("am") : _("pm"));
- else
- g_snprintf (buf, sizeof(buf), "%02d%s", hour, _("h"));
-
- return buf;
-
-}
-
-time_t
-time_add_minutes (time_t time, int minutes)
-{
- struct tm *tm = localtime (&time);
- time_t new_time;
-
- tm->tm_min += minutes;
- if ((new_time = mktime (tm)) == -1){
- g_message ("time_add_minutes(): mktime() could not handle "
- "adding %d minutes with\n", minutes);
- print_time_t (time);
- return time;
- }
- return new_time;
-}
-
-/* Adds a day onto the time, using local time.
- Note that if clocks go forward due to daylight savings time, there are
- some non-existent local times, so the hour may be changed to make it a
- valid time. This also means that it may not be wise to keep calling
- time_add_day() to step through a certain period - if the hour gets changed
- to make it valid time, any further calls to time_add_day() will also return
- this hour, which may not be what you want. */
-time_t
-time_add_day (time_t time, int days)
-{
- struct tm *tm = localtime (&time);
- time_t new_time;
-#if 0
- int dst_flag = tm->tm_isdst;
-#endif
-
- tm->tm_mday += days;
-
- if ((new_time = mktime (tm)) == -1){
- g_message ("time_add_day(): mktime() could not handling adding %d days with\n",
- days);
- print_time_t (time);
- return time;
- }
-
-#if 0
- /* I don't know what this is for. See also time_day_begin() and
- time_day_end(). - Damon. */
- if (dst_flag > tm->tm_isdst){
- tm->tm_hour++;
- new_time += 3600;
- } else if (dst_flag < tm->tm_isdst){
- tm->tm_hour--;
- new_time -= 3600;
- }
-#endif
-
- return new_time;
-}
-
-time_t
-time_add_week (time_t time, int weeks)
-{
- return time_add_day (time, weeks * 7);
-}
-
-time_t
-time_add_month (time_t time, int months)
-{
- struct tm *tm = localtime (&time);
- time_t new_time;
- int mday;
-
- mday = tm->tm_mday;
-
- tm->tm_mon += months;
- tm->tm_isdst = -1;
- if ((new_time = mktime (tm)) == -1){
- g_message ("time_add_month(): mktime() could not handling adding %d months with\n",
- months);
- print_time_t (time);
- return time;
- }
- tm = localtime (&new_time);
- if (tm->tm_mday < mday){
- tm->tm_mon--;
- tm->tm_mday = time_days_in_month (tm->tm_year+1900, tm->tm_mon);
- return new_time = mktime (tm);
- }
- else
- return new_time;
-}
-
-time_t
-time_add_year (time_t time, int years)
-{
- struct tm *tm = localtime (&time);
- time_t new_time;
-
- tm->tm_year += years;
- if ((new_time = mktime (tm)) == -1){
- g_message ("time_add_year(): mktime() could not handling adding %d years with\n",
- years);
- print_time_t (time);
- return time;
- }
- return new_time;
-}
-
-time_t
-time_day_hour (time_t t, int hour)
-{
- struct tm tm;
-
- tm = *localtime (&t);
- tm.tm_hour = hour;
- tm.tm_min = 0;
- tm.tm_sec = 0;
-
- return mktime (&tm);
-}
-
-/* Number of days in a month, for normal and leap years */
-static const int days_in_month[2][12] = {
- { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
- { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
-};
-
-/* Returns whether the specified year is a leap year */
-static int
-is_leap_year (int year)
-{
- if (year <= 1752)
- return !(year % 4);
- else
- return (!(year % 4) && (year % 100)) || !(year % 400);
-}
-
-int
-time_days_in_month (int year, int month)
-{
- g_return_val_if_fail (year >= 1900, 0);
- g_return_val_if_fail ((month >= 0) && (month < 12), 0);
-
- return days_in_month [is_leap_year (year)][month];
-}
-
-time_t
-time_from_day (int year, int month, int day)
-{
- struct tm tm;
-
- memset (&tm, 0, sizeof (tm));
- tm.tm_year = year - 1900;
- tm.tm_mon = month;
- tm.tm_mday = day;
- tm.tm_isdst = -1;
-
- return mktime (&tm);
-}
-
-time_t
-time_year_begin (time_t t)
-{
- struct tm tm;
-
- tm = *localtime (&t);
- tm.tm_hour = 0;
- tm.tm_min = 0;
- tm.tm_sec = 0;
- tm.tm_mon = 0;
- tm.tm_mday = 1;
- tm.tm_isdst = -1;
-
- return mktime (&tm);
-}
-
-time_t
-time_year_end (time_t t)
-{
- struct tm tm;
-
- tm = *localtime (&t);
- tm.tm_hour = 0;
- tm.tm_min = 0;
- tm.tm_sec = 0;
- tm.tm_mon = 0;
- tm.tm_mday = 1;
- tm.tm_year++;
- tm.tm_isdst = -1;
-
- return mktime (&tm);
-}
-
-time_t
-time_month_begin (time_t t)
-{
- struct tm tm;
-
- tm = *localtime (&t);
- tm.tm_hour = 0;
- tm.tm_min = 0;
- tm.tm_sec = 0;
- tm.tm_mday = 1;
- tm.tm_isdst = -1;
-
- return mktime (&tm);
-}
-
-time_t
-time_month_end (time_t t)
-{
- struct tm tm;
-
- tm = *localtime (&t);
- tm.tm_hour = 0;
- tm.tm_min = 0;
- tm.tm_sec = 0;
- tm.tm_mday = 1;
- tm.tm_mon++;
- tm.tm_isdst = -1;
-
- return mktime (&tm);
-}
-
-time_t
-time_week_begin (time_t t)
-{
- struct tm tm;
-
- /* FIXME: make it take week_starts_on_monday into account */
-
- tm = *localtime (&t);
- tm.tm_hour = 0;
- tm.tm_min = 0;
- tm.tm_sec = 0;
- tm.tm_mday -= tm.tm_wday;
- tm.tm_isdst = -1;
-
- return mktime (&tm);
-}
-
-time_t
-time_week_end (time_t t)
-{
- struct tm tm;
-
- /* FIXME: make it take week_starts_on_monday into account */
-
- tm = *localtime (&t);
- tm.tm_hour = 0;
- tm.tm_min = 0;
- tm.tm_sec = 0;
- tm.tm_mday += 7 - tm.tm_wday;
- tm.tm_isdst = -1;
-
- return mktime (&tm);
-}
-
-/* Returns the start of the day, according to the local time. */
-time_t
-time_day_begin (time_t t)
-{
-#if 1
- struct tm tm;
-
- tm = *localtime (&t);
- tm.tm_hour = 0;
- tm.tm_min = 0;
- tm.tm_sec = 0;
- tm.tm_isdst = -1;
-
- return mktime (&tm);
-
-#else
- /* This is the original code which sometimes produces a time of 1:00.
- I don't understand why it looked at the tm_isdst flags at all.
- - Damon. */
-
- struct tm tm;
- time_t temp = t - 43200;
- int dstflag, dstflag2;
-
- tm = *localtime(&temp); /* one day */
- dstflag = tm.tm_isdst;
-
- tm = *localtime (&t);
- dstflag2 = tm.tm_isdst;
-
- if (dstflag < dstflag2)
- tm.tm_hour = 1;
- else
- tm.tm_hour = 0;
-
- tm.tm_min = 0;
- tm.tm_sec = 0;
-
- temp = mktime(&tm);
- if (dstflag > dstflag2){
- temp += 3600;
- }
-
- return temp;
-#endif
-}
-
-/* Returns the end of the day, according to the local time. */
-time_t
-time_day_end (time_t t)
-{
-#if 1
- struct tm tm;
-
- tm = *localtime (&t);
- tm.tm_mday++;
- tm.tm_hour = 0;
- tm.tm_min = 0;
- tm.tm_sec = 0;
- tm.tm_isdst = -1;
-
- return mktime (&tm);
-
-#else
- /* This is the original code which has more problems than
- time_day_begin(). - Damon. */
-
- struct tm tm;
- time_t temp;
- int dstflag, dstflag2;
-
- t += 10800;
- temp = t - 86400;
-
- tm = *localtime(&temp); /* one day */
- dstflag = tm.tm_isdst;
-
- tm = *localtime (&t);
- dstflag2 = tm.tm_isdst;
-
- if (dstflag < dstflag2)
- tm.tm_hour = 23;
- else {
- tm.tm_mday++;
- tm.tm_hour = 0;
- }
- tm.tm_min = 0;
- tm.tm_sec = 0;
-
- temp = mktime(&tm);
- if(dstflag > dstflag2) {
- }
- return temp;
-#endif
-}
-
-static char *
-pcat (char *dest, int num, char key)
-{
- int c;
-
- c = sprintf (dest, "%d%c", num, key);
- return dest + c;
-}
-
-/* Converts secs into the ISO difftime representation */
-char *
-isodiff_from_secs (int secs)
-{
- static char buffer [60], *p;
- int years, months, weeks, days, hours, minutes;
-
- years = months = weeks = days = hours = minutes = 0;
-
- years = secs / (365 * 86400);
- secs %= (365 * 86400);
- months = secs / (30 * 86400);
- secs %= (30 * 86400);
- weeks = secs / (7 * 86400);
- secs %= (7 * 86400);
- days = secs / 86400;
- secs %= 86400;
- hours = secs / 3600;
- secs %= 3600;
- minutes = secs / 60;
- secs %= 60;
-
- strcpy (buffer, "P");
- p = buffer + 1;
- if (years)
- p = pcat (p, years, 'Y');
- if (months)
- p = pcat (p, months, 'M');
- if (weeks)
- p = pcat (p, weeks, 'W');
- if (days)
- p = pcat (p, days, 'D');
- if (hours || minutes || secs){
- *p++ = 'T';
- if (hours)
- p = pcat (p, hours, 'H');
- if (minutes)
- p = pcat (p, minutes, 'M');
- if (secs)
- p = pcat (p, secs, 'S');
- }
-
- return buffer;
-}
-
-int
-isodiff_to_secs (char *str)
-{
- int value, time;
- int years, months, weeks, days, hours, minutes, seconds;
-
- value = years = months = weeks = days = hours = minutes = time = seconds = 0;
- if (*str != 'P')
- return 0;
-
- str++;
- while (*str){
- switch (*str){
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- value = value * 10 + (*str - '0');
- break;
- case 'Y':
- years = value; value = 0;
- break;
- case 'M':
- if (time)
- minutes = value;
- else
- months = value;
- value = 0;
- break;
- case 'W':
- weeks = value; value = 0;
- break;
- case 'D':
- days = value; value = 0;
- break;
- case 'T':
- value = 0; time = 1;
- break;
- case 'H':
- hours = value; value = 0;
- break;
- case 'S':
- seconds = value; value = 0;
- break;
- }
- str++;
- }
- return seconds + (minutes * 60) + (hours * 3600) +
- (days * 86400) + (weeks * 7 * 86400) +
- (months * 30 * 86400) + (years * 365 * 86400);
-}
diff --git a/calendar/cal-util/timeutil.h b/calendar/cal-util/timeutil.h
deleted file mode 100644
index 37b70ee6cf..0000000000
--- a/calendar/cal-util/timeutil.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Miscellaneous time-related utilities
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Authors: Federico Mena <federico@nuclecu.unam.mx>
- * Miguel de Icaza <miguel@nuclecu.unam.mx>
- */
-
-#ifndef TIMEUTIL_H
-#define TIMEUTIL_H
-
-
-#include <time.h>
-#include <icaltypes.h>
-
-
-time_t time_from_icaltimetype (struct icaltimetype itt);
-time_t time_from_isodate (char *str);
-time_t time_from_start_duration (time_t start, char *duration);
-char *isodate_from_time_t (time_t t);
-int get_time_t_hour (time_t t);
-int isodiff_to_secs (char *str);
-char *isodiff_from_secs (int secs);
-
-time_t time_add_minutes (time_t time, int minutes);
-time_t time_add_day (time_t time, int days);
-time_t time_add_week (time_t time, int weeks);
-time_t time_add_month (time_t time, int months);
-time_t time_add_year (time_t time, int years);
-
-
-/* Returns pointer to a statically-allocated buffer with a string of the form
- * 3am, 4am, 12pm, 08h, 17h, etc.
- * The string is internationalized, hopefully correctly.
- */
-char *format_simple_hour (int hour, int use_am_pm);
-
-/* Returns the number of days in the specified month. Years are full years (starting from year 1).
- * Months are in [0, 11].
- */
-int time_days_in_month (int year, int month);
-
-/* Converts the specified date to a time_t at the start of the specified day. Years are full years
- * (starting from year 1). Months are in [0, 11]. Days are 1-based.
- */
-time_t time_from_day (int year, int month, int day);
-
-time_t time_day_hour (time_t t, int hour);
-
-/* For the functions below, time ranges are considered to contain the start time, but not the end
- * time.
- */
-
-/* These two functions take a time value and return the beginning or end of the corresponding year,
- * respectively.
- */
-time_t time_year_begin (time_t t);
-time_t time_year_end (time_t t);
-
-/* These two functions take a time value and return the beginning or end of the corresponding month,
- * respectively.
- */
-time_t time_month_begin (time_t t);
-time_t time_month_end (time_t t);
-
-/* These functions take a time value and return the beginning or end of the corresponding week,
- * respectively. This takes into account the global week_starts_on_monday flag.
- */
-time_t time_week_begin (time_t t);
-time_t time_week_end (time_t t);
-
-/* These two functions take a time value and return the beginning or end of the corresponding day,
- * respectively.
- */
-time_t time_day_begin (time_t t);
-time_t time_day_end (time_t t);
-
-time_t parse_date (char *str);
-void print_time_t (time_t t);
-
-
-#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 0029a85a37..0000000000
--- a/calendar/conduits/calendar/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-Makefile.in
-Makefile
-.deps
-calendar.conduit
-*.lo
-.libs
-libcalendar_conduit.la
-calendar-conduit-control-applet
diff --git a/calendar/conduits/calendar/Makefile.am b/calendar/conduits/calendar/Makefile.am
deleted file mode 100644
index 1aa9abecd6..0000000000
--- a/calendar/conduits/calendar/Makefile.am
+++ /dev/null
@@ -1,81 +0,0 @@
-#
-#
-#
-
-INCLUDES = \
- -I$(top_srcdir)/calendar \
- $(GNOME_PILOT_CFLAGS)
-
-file_conduitsdir=$(libdir)/gnome-pilot/conduits
-
-bin_PROGRAMS = calendar-conduit-control-applet
-
-calendar_conduit_control_applet_SOURCES = calendar-conduit-control-applet.c
-
-calendar_conduit_control_applet_LDADD = \
- $(CAPPLET_LIBS) \
- $(GNOME_LIBDIR) \
- -lgpilotdcm \
- -lgpilotd \
- -lgpilotdconduit \
- $(GNOME_CAPPLET_LIBS) \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(GNOME_XML_LIB) \
- $(GNOMEUI_LIBS) \
- $(PISOCK_LIBDIR) $(PISOCK_LIBS) \
- $(INTLLIBS)
-
-
-# $(top_builddir)/libgpilotdCM/libgpilotdcm.la \
-# $(top_builddir)/gpilotd/libgpilotd.la \
-# $(top_builddir)/gpilotd/libgpilotdconduit.la \
-
-
-# calendar_conduit
-calendar_conduitsdir=$(libdir)/gnome-pilot/conduits
-calendar_conduits_LTLIBRARIES = libcalendar_conduit.la
-
-libcalendar_conduit_la_SOURCES = \
- calendar-conduit.c
-
-# calendar-conduit.c: my_gnomecal_idl
-
-calendar.conduit: calendar.conduit.in Makefile
- sed -e 's^\@prefix\@^$(prefix)^g' < $(srcdir)/calendar.conduit.in > calendar.conduit.tmp \
- && mv calendar.conduit.tmp calendar.conduit
-
-#
-# conduit
-#
-
-libcalendar_conduit_la_LDFLAGS = \
- -rpath $(libdir)
-
-libcalendar_conduit_la_LIBADD = \
- $(top_builddir)/calendar/cal-client/libcal-client-static.la \
- $(top_builddir)/calendar/cal-util/libcal-util-static.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/libical/src/libical/libical-static.la \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(PISOCK_LIBDIR) $(PISOCK_LIBS) \
- $(GNOME_LIBDIR) \
- $(GNOME_LIBS)
-
-ccenterdir = $(datadir)/control-center
-ccenterPalmPilotdir = $(ccenterdir)/Peripherals
-ccenterConduitsdir = $(ccenterPalmPilotdir)/Conduits
-ccenterConduits_DATA = calendar-conduit-control-applet.desktop
-
-panelConduitsdir = $(datadir)/gnome/apps/Settings/Peripherals/Conduits
-panelConduits_DATA = $(ccenterConduits_DATA)
-
-Conduitdir = $(datadir)/gnome-pilot/conduits/
-Conduit_DATA = calendar.conduit
-
-EXTRA_DIST = \
- calendar.conduit.in \
- $(ccenterConduits_DATA)
-
-install-data-local:
- $(mkinstalldirs) $(ccenterConduitsdir)
- $(mkinstalldirs) $(Conduitdir)
diff --git a/calendar/conduits/calendar/calendar-conduit-control-applet.c b/calendar/conduits/calendar/calendar-conduit-control-applet.c
deleted file mode 100644
index 291d429bab..0000000000
--- a/calendar/conduits/calendar/calendar-conduit-control-applet.c
+++ /dev/null
@@ -1,387 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Control applet ("capplet") for the gnome-pilot calendar conduit, */
-/* based on */
-/* gpilotd control applet ('capplet') for use with the GNOME control center */
-
-#include <pwd.h>
-#include <sys/types.h>
-#include <signal.h>
-#include <gnome.h>
-
-#include <config.h>
-#include <capplet-widget.h>
-
-#include <libgpilotdCM/gnome-pilot-conduit-management.h>
-#include <libgpilotdCM/gnome-pilot-conduit-config.h>
-#include <gpilotd/gnome-pilot-client.h>
-
-#include "calendar-conduit.h"
-
-
-/* tell changes callbacks to ignore changes or not */
-static gboolean ignore_changes=FALSE;
-
-/* capplet widget */
-static GtkWidget *capplet=NULL;
-
-/* host/device/pilot configuration windows */
-GtkWidget *cfgOptionsWindow=NULL;
-GtkWidget *cfgStateWindow=NULL;
-GtkWidget *dialogWindow=NULL;
-
-gboolean activated,org_activation_state;
-GnomePilotConduitManagement *conduit;
-GnomePilotConduitConfig *conduit_config;
-GCalConduitCfg *origState = NULL;
-GCalConduitCfg *curState = NULL;
-
-static void doTrySettings(GtkWidget *widget, GCalConduitCfg *GCalConduitCfg);
-static void doRevertSettings(GtkWidget *widget, GCalConduitCfg *GCalConduitCfg);
-static void doSaveSettings(GtkWidget *widget, GCalConduitCfg *GCalConduitCfg);
-
-//static void readStateCfg (GtkWidget *w, GCalConduitCfg *c);
-static void setStateCfg (GtkWidget *w, GCalConduitCfg *c);
-
-gint pilotId;
-/* CORBA_Environment ev; */
-static GnomePilotClient *gpc;
-
-
-
-/* This array must be in the same order as enumerations
- in GnomePilotConduitSyncType as they are used as index.
- Custom type implies Disabled state.
-*/
-static gchar* sync_options[] ={ N_("Disabled"),
- N_("Synchronize"),
- N_("Copy From Pilot"),
- N_("Copy To Pilot"),
- N_("Merge From Pilot"),
- N_("Merge To Pilot")};
-#define SYNC_OPTIONS_COUNT 6
-
-
-
-
-/* Saves the configuration data. */
-static void
-gcalconduit_save_configuration(GCalConduitCfg *c)
-{
- gchar prefix[256];
-
- g_snprintf(prefix,255,"/gnome-pilot.d/calendar-conduit/Pilot_%u/",c->pilotId);
-
- gnome_config_push_prefix(prefix);
- gnome_config_set_bool ("open_secret", c->open_secret);
- gnome_config_pop_prefix();
-
- gnome_config_sync();
- gnome_config_drop_all();
-}
-
-/* Creates a duplicate of the configuration data */
-static GCalConduitCfg*
-gcalconduit_dupe_configuration(GCalConduitCfg *c) {
- GCalConduitCfg *retval;
- g_return_val_if_fail(c!=NULL,NULL);
- retval = g_new0(GCalConduitCfg,1);
- retval->sync_type = c->sync_type;
- retval->open_secret = c->open_secret;
- retval->pilotId = c->pilotId;
- return retval;
-}
-
-
-static void
-doTrySettings(GtkWidget *widget, GCalConduitCfg *c)
-{
- /*
- readStateCfg (cfgStateWindow, curState);
- if (activated)
- gnome_pilot_conduit_config_enable (conduit_config, GnomePilotConduitSyncTypeCustom);
- else
- gnome_pilot_conduit_config_disable (conduit_config);
- */
-
- if (c->sync_type!=GnomePilotConduitSyncTypeCustom)
- gnome_pilot_conduit_config_enable_with_first_sync (conduit_config,
- c->sync_type,
- c->sync_type,
- TRUE);
- else
- gnome_pilot_conduit_config_disable (conduit_config);
-
- gcalconduit_save_configuration (c);
-}
-
-
-static void
-doSaveSettings(GtkWidget *widget, GCalConduitCfg *GCalConduitCfg)
-{
- doTrySettings(widget, GCalConduitCfg);
- gcalconduit_save_configuration(GCalConduitCfg);
-}
-
-
-static void
-doCancelSettings(GtkWidget *widget, GCalConduitCfg *c)
-{
- doSaveSettings (widget, c);
-}
-
-
-static void
-doRevertSettings(GtkWidget *widget, GCalConduitCfg *GCalConduitCfg)
-{
- activated = org_activation_state;
- setStateCfg (cfgStateWindow, curState);
-}
-
-static void
-about_cb (GtkWidget *widget, gpointer data)
-{
- GtkWidget *about;
- const gchar *authors[] = {_("Eskil Heyn Olsen <deity@eskil.dk>"),NULL};
-
- about = gnome_about_new (_("Gpilotd calendar conduit"), VERSION,
- _("(C) 1998 the Free Software Foundation"),
- authors,
- _("Configuration utility for the calendar conduit.\n"),
- _("gnome-unknown.xpm"));
- gtk_widget_show (about);
-
- return;
-}
-
-
-/* called by the sync_type GtkOptionMenu */
-static void
-sync_action_selection(GtkMenuShell *widget, gpointer unused)
-{
- if (!ignore_changes) {
- capplet_widget_state_changed(CAPPLET_WIDGET (capplet), TRUE);
- }
-}
-
-
-/* called by the sync_type GtkOptionMenu */
-static void
-activate_sync_type(GtkMenuItem *widget, gpointer data)
-{
- curState->sync_type = GPOINTER_TO_INT(data);
- if(!ignore_changes)
- capplet_widget_state_changed(CAPPLET_WIDGET(capplet), TRUE);
-}
-
-
-static GtkWidget
-*createStateCfgWindow(void)
-{
- GtkWidget *vbox, *table;
- GtkWidget *label;
- GtkWidget *optionMenu,*menuItem;
- GtkMenu *menu;
- gint i;
-
- vbox = gtk_vbox_new(FALSE, GNOME_PAD);
-
- table = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, GNOME_PAD);
-
- label = gtk_label_new(_("Synchronize Action"));
- gtk_box_pack_start(GTK_BOX(table), label, FALSE, FALSE, GNOME_PAD);
-
- optionMenu=gtk_option_menu_new();
- gtk_object_set_data(GTK_OBJECT(vbox), "conduit_state", optionMenu);
- menu = GTK_MENU(gtk_menu_new());
-
- for (i=0; i<SYNC_OPTIONS_COUNT;i++) {
- sync_options[i]=_(sync_options[i]);
- menuItem = gtk_menu_item_new_with_label(sync_options[i]);
- gtk_widget_show(menuItem);
- gtk_signal_connect(GTK_OBJECT(menuItem),"activate",
- GTK_SIGNAL_FUNC(activate_sync_type),
- GINT_TO_POINTER(i));
- gtk_menu_append(menu,menuItem);
- }
-
- gtk_option_menu_set_menu(GTK_OPTION_MENU(optionMenu),GTK_WIDGET(menu));
- gtk_signal_connect(GTK_OBJECT(menu), "selection-done",
- GTK_SIGNAL_FUNC(sync_action_selection),
- NULL);
-
- gtk_box_pack_start(GTK_BOX(table), optionMenu, FALSE, FALSE, 0);
-
- return vbox;
-}
-
-
-static void
-setStateCfg (GtkWidget *w, GCalConduitCfg *c)
-{
- GtkOptionMenu *optionMenu;
- GtkMenu *menu;
-
- optionMenu = gtk_object_get_data (GTK_OBJECT(w), "conduit_state");
- g_assert (optionMenu != NULL);
- menu = GTK_MENU (gtk_option_menu_get_menu (optionMenu));
-
- ignore_changes = TRUE;
- /* Here were are relying on the items in menu being the same
- order as in GnomePilotConduitSyncType. */
- gtk_option_menu_set_history (optionMenu, (int) c->sync_type);
- ignore_changes = FALSE;
-}
-
-
-#if 0
-static void
-readStateCfg (GtkWidget *w, GCalConduitCfg *c)
-{
- /*
- GtkWidget *button;
- button = gtk_object_get_data(GTK_OBJECT(cfg), "conduit_on_off");
- g_assert(button!=NULL);
- activated = GTK_TOGGLE_BUTTON(button)->active;
- */
-}
-#endif /* 0 */
-
-
-static void
-pilot_capplet_setup(void)
-{
- GtkWidget *frame, *table;
-
- capplet = capplet_widget_new();
-
- table = gtk_table_new(1, 2, FALSE);
- gtk_container_border_width(GTK_CONTAINER(table), GNOME_PAD);
- gtk_container_add(GTK_CONTAINER(capplet), table);
-
- frame = gtk_frame_new(_("Conduit state"));
- gtk_container_border_width(GTK_CONTAINER(frame), GNOME_PAD_SMALL);
- gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 1, 0, 1);
- cfgStateWindow = createStateCfgWindow();
- gtk_container_add(GTK_CONTAINER(frame), cfgStateWindow);
-
- gtk_signal_connect(GTK_OBJECT(capplet), "try",
- GTK_SIGNAL_FUNC(doTrySettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "revert",
- GTK_SIGNAL_FUNC(doRevertSettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "ok",
- GTK_SIGNAL_FUNC(doSaveSettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "cancel",
- GTK_SIGNAL_FUNC(doCancelSettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "help",
- GTK_SIGNAL_FUNC(about_cb), NULL);
-
-
- setStateCfg (cfgStateWindow, curState);
-
- gtk_widget_show_all (capplet);
-}
-
-
-static void
-run_error_dialog(gchar *mesg,...)
-{
- char tmp[80];
- va_list ap;
-
- va_start(ap,mesg);
- vsnprintf(tmp,79,mesg,ap);
- dialogWindow = gnome_message_box_new(mesg,GNOME_MESSAGE_BOX_ERROR,GNOME_STOCK_BUTTON_OK,NULL);
- gnome_dialog_run_and_close(GNOME_DIALOG(dialogWindow));
- va_end(ap);
-}
-
-
-static gint
-get_pilot_id_from_gpilotd()
-{
- GList *pilots=NULL;
- gint pilot;
- int i,err;
-
- i=0;
- /* we don't worry about leaking here, so pilots isn't freed */
- switch(err = gnome_pilot_client_get_pilots(gpc,&pilots)) {
- case GPILOTD_OK: {
- if(pilots) {
- for(i=0;i<g_list_length(pilots);i++) {
- g_message("pilot %d = \"%s\"",i,(gchar*)g_list_nth(pilots,i)->data);
- }
- if(i==0) {
- run_error_dialog(_("No pilot configured, please choose the\n'Pilot Link Properties' capplet first."));
- return -1;
- } else {
- gnome_pilot_client_get_pilot_id_by_name(gpc,
- pilots->data, /* this is the first pilot */
- &pilot);
- if(i>1) {
- g_message("too many pilots...");
- /* need a choose here */
- }
- return pilot;
- }
- } else {
- run_error_dialog(_("No pilot configured, please choose the\n'Pilot Link Properties' capplet first."));
- return -1;
- }
- break;
- }
- case GPILOTD_ERR_NOT_CONNECTED:
- run_error_dialog(_("Not connected to the gnome-pilot daemon"));
- return -1;
- break;
- default:
- g_warning("gnome_pilot_client_get_pilot_ids(...) = %d",err);
- run_error_dialog(_("An error occured when trying to fetch\npilot list from the gnome-pilot daemon"));
- return -1;
- break;
- }
-}
-
-
-int
-main (int argc, char *argv[])
-{
- g_log_set_always_fatal (G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL |
- G_LOG_LEVEL_WARNING);
-
- /* we're a capplet */
- gnome_capplet_init ("calendar conduit control applet", NULL, argc, argv,
- NULL, 0, NULL);
-
-
- gpc = gnome_pilot_client_new();
- gnome_pilot_client_connect_to_daemon(gpc);
- pilotId = get_pilot_id_from_gpilotd();
- if(!pilotId) return -1;
-
- /* put all code to set things up in here */
- gcalconduit_load_configuration (&origState, pilotId);
-
- conduit = gnome_pilot_conduit_management_new ("Calendar", GNOME_PILOT_CONDUIT_MGMT_ID);
- if (conduit == NULL) return -1;
- conduit_config = gnome_pilot_conduit_config_new (conduit, pilotId);
- org_activation_state = gnome_pilot_conduit_config_is_enabled (conduit_config,
- &origState->sync_type);
- activated = org_activation_state;
-
- //gpilotd_conduit_mgmt_get_sync_type (conduit, pilotId, &origState->sync_type);
-
- curState = gcalconduit_dupe_configuration(origState);
-
- pilot_capplet_setup ();
-
-
- /* done setting up, now run main loop */
- capplet_gtk_main();
-
- gnome_pilot_conduit_management_destroy(conduit);
-
- return 0;
-}
diff --git a/calendar/conduits/calendar/calendar-conduit-control-applet.desktop b/calendar/conduits/calendar/calendar-conduit-control-applet.desktop
deleted file mode 100644
index 15fd0dc77b..0000000000
--- a/calendar/conduits/calendar/calendar-conduit-control-applet.desktop
+++ /dev/null
@@ -1,13 +0,0 @@
-[Desktop Entry]
-Name=Calendar conduit
-Name[da]=Gnome kalender
-Name[no]=GNOME kalender
-Name[tr]=Takvim parçasý
-Comment=Configure the GnomeCal conduit
-Comment[da]=Konfigurér GnomeCal-komponent
-Comment[no]=Konfigurér GnomeCal-komponent
-Comment[tr]=GnomeCal takvim parçasý ayarlarý
-Exec=calendar-conduit-control-applet --cap-id=1
-Terminal=0
-Type=Application
-Icon=gnome-calendar-conduit.png
diff --git a/calendar/conduits/calendar/calendar-conduit.c b/calendar/conduits/calendar/calendar-conduit.c
deleted file mode 100644
index 8094fee315..0000000000
--- a/calendar/conduits/calendar/calendar-conduit.c
+++ /dev/null
@@ -1,1727 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <config.h>
-#include <sys/stat.h>
-#include <utime.h>
-#include <unistd.h>
-#include <pwd.h>
-#include <signal.h>
-#include <errno.h>
-
-#include <cal-client/cal-client.h>
-// #include <cal-util/calobj.h>
-#include <cal-util/timeutil.h>
-#include <pi-source.h>
-#include <pi-socket.h>
-#include <pi-file.h>
-#include <pi-dlp.h>
-#include <libgnorba/gnorba.h>
-#include <libgnorba/gnome-factory.h>
-#include <pi-version.h>
-#include <gpilotd/gnome-pilot-conduit.h>
-#include <gpilotd/gnome-pilot-conduit-standard-abs.h>
-#include <calendar-conduit.h>
-
-#include <bonobo.h>
-
-GnomePilotConduit * conduit_get_gpilot_conduit (guint32);
-void conduit_destroy_gpilot_conduit (GnomePilotConduit*);
-void local_record_from_icalobject (GCalLocalRecord *local, CalComponent *obj);
-
-#define CONDUIT_VERSION "0.8.11"
-#ifdef G_LOG_DOMAIN
-#undef G_LOG_DOMAIN
-#endif
-#define G_LOG_DOMAIN "gcalconduit"
-
-#define DEBUG_CALCONDUIT
-#undef DEBUG_CALCONDUIT
-
-#ifdef DEBUG_CALCONDUIT
-#define show_exception(e) g_warning ("Exception: %s\n", CORBA_exception_id (e))
-#define LOG(e...) g_log(G_LOG_DOMAIN,G_LOG_LEVEL_MESSAGE, e)
-#else
-#define show_exception(e)
-#define LOG(e...)
-#endif
-
-#define WARN(e...) g_log(G_LOG_DOMAIN,G_LOG_LEVEL_WARNING, e)
-#define INFO(e...) g_log(G_LOG_DOMAIN,G_LOG_LEVEL_MESSAGE, e)
-
-#define catch_ret_val(_env,ret) \
- if (_env._major != CORBA_NO_EXCEPTION) { \
- g_log(G_LOG_DOMAIN,G_LOG_LEVEL_MESSAGE,"%s:%d: Caught exception",__FILE__,__LINE__); \
- g_warning ("Exception: %s\n", CORBA_exception_id (&(_env))); \
- CORBA_exception_free(&(_env)); \
- return ret; \
- }
-
-
-
-
-/* debug spew DELETE ME */
-static char *print_ical (CalComponent *obj)
-{
- static char buff[ 4096 ];
- CalComponentText summary;
- GSList *comments;
- CalComponentText *first_comment = NULL;
-
- if (obj == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- cal_component_get_summary (obj, &summary);
- cal_component_get_comment_list (obj, &comments);
- if (comments)
- first_comment = (CalComponentText *) comments->data;
-
-
- sprintf (buff, "['%s' '%s']",
- summary.value, /* description */
- first_comment ? first_comment->value : "" /* note */);
- return buff;
-}
-
-
-/* debug spew DELETE ME */
-static char *print_local (GCalLocalRecord *local)
-{
- static char buff[ 4096 ];
-
- if (local == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- if (local->a && local->a->description) {
- sprintf (buff, "['%s' '%s']",
- local->a->description,
- local->a->note);
- return buff;
- }
-
- return print_ical (local->ical);
-}
-
-
-/* debug spew DELETE ME */
-static char *print_remote (PilotRecord *remote)
-{
- static char buff[ 4096 ];
- struct Appointment a;
-
- if (remote == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- memset (&a, 0, sizeof (struct Appointment));
- unpack_Appointment (&a, remote->record, remote->length);
-
- sprintf (buff, "['%s' '%s']",
- a.description,
- a.note);
-
- return buff;
-}
-
-
-
-/* Destroys any data allocated by gcalconduit_load_configuration
- and deallocates the given configuration. */
-static void
-gcalconduit_destroy_configuration(GCalConduitCfg **c)
-{
- g_return_if_fail(c!=NULL);
- g_return_if_fail(*c!=NULL);
- g_free(*c);
- *c = NULL;
-}
-
-
-/* Given a GCalConduitContxt*, allocates the structure */
-static void
-gcalconduit_new_context(GCalConduitContext **ctxt,
- GCalConduitCfg *c)
-{
- *ctxt = g_new0(GCalConduitContext,1);
- g_assert(ctxt!=NULL);
- (*ctxt)->cfg = c;
- CORBA_exception_init (&((*ctxt)->ev));
-}
-
-
-/* Destroys any data allocated by gcalconduit_new_context
- and deallocates its data. */
-static void
-gcalconduit_destroy_context(GCalConduitContext **ctxt)
-{
- g_return_if_fail(ctxt!=NULL);
- g_return_if_fail(*ctxt!=NULL);
-/*
- if ((*ctxt)->cfg!=NULL)
- gcalconduit_destroy_configuration(&((*ctxt)->cfg));
-*/
- g_free(*ctxt);
- *ctxt = NULL;
-}
-
-
-static void
-gnome_calendar_load_cb (GtkWidget *cal_client,
- CalClientLoadStatus status,
- GCalConduitContext *ctxt)
-{
- CalClient *client = CAL_CLIENT (cal_client);
-
- printf (" calendar-conduit entering "
- "gnome_calendar_load_cb, tried=%d\n",
- ctxt->calendar_load_tried);
-
- if (status == CAL_CLIENT_LOAD_SUCCESS) {
- ctxt->calendar_load_success = TRUE;
- printf (" success\n");
- gtk_main_quit (); /* end the sub event loop */
- } else {
- if (ctxt->calendar_load_tried) {
- printf (" load and create of calendar failed\n");
- gtk_main_quit (); /* end the sub event loop */
- return;
- }
-
- cal_client_create_calendar (client, ctxt->calendar_file);
- ctxt->calendar_load_tried = 1;
- }
-}
-
-
-
-
-
-static int
-start_calendar_server (GnomePilotConduitStandardAbs *conduit,
- GCalConduitContext *ctxt)
-{
-
- g_return_val_if_fail(conduit!=NULL,-2);
- g_return_val_if_fail(ctxt!=NULL,-2);
-
- ctxt->client = cal_client_new ();
-
- /* FIX ME */
- ctxt->calendar_file = g_concat_dir_and_file (g_get_home_dir (),
- "evolution/local/Calendar/calendar.vcf");
-
- gtk_signal_connect (GTK_OBJECT (ctxt->client), "cal_loaded",
- gnome_calendar_load_cb, ctxt);
-
- printf (" calling cal_client_load_calendar\n");
- cal_client_load_calendar (ctxt->client, ctxt->calendar_file);
-
- /* run a sub event loop to turn cal-client's async load
- notification into a synchronous call */
- gtk_main ();
-
- if (ctxt->calendar_load_success)
- return 0;
-
- return -1;
-}
-
-
-#if 0
-/* Just a stub to link with */
-void calendar_notify (time_t time, CalendarAlarm *which, void *data);
-void calendar_notify (time_t time, CalendarAlarm *which, void *data) { }
-#endif /* 0 */
-
-
-static GSList *
-get_calendar_objects(GnomePilotConduitStandardAbs *conduit,
- gboolean *status,
- GCalConduitContext *ctxt)
-{
- GList *uids;
- GSList *result = NULL;
-
- g_return_val_if_fail (conduit != NULL, NULL);
- g_return_val_if_fail (ctxt != NULL, NULL);
-
- /* uids = cal_client_get_uids (ctxt->client, CALOBJ_TYPE_ANY); */
- uids = cal_client_get_uids (ctxt->client,
- CALOBJ_TYPE_EVENT |
- /*CALOBJ_TYPE_TODO |*/
- CALOBJ_TYPE_JOURNAL);
-
- if (status != NULL)
- (*status) = TRUE;
-
- if (! uids)
- INFO ("No entries found");
- else {
- GList *c;
- for (c=uids; c; c=c->next)
- result = g_slist_prepend (result, (gchar *) c->data);
- /* FIX ME free uids */
- }
-
- return result;
-}
-
-
-static void
-local_record_from_ical_uid (GCalLocalRecord *local,
- char *uid,
- GCalConduitContext *ctxt)
-{
- CalComponent *obj;
- CalClientGetStatus status;
-
- g_assert (local != NULL);
-
- status = cal_client_get_object (ctxt->client, uid, &obj);
-
- if (status == CAL_CLIENT_GET_SUCCESS)
- local_record_from_icalobject (local, obj);
- else
- INFO ("Object did not exist");
-}
-
-
-/*
- * converts a CalComponent to a GCalLocalRecord
- */
-
-void
-local_record_from_icalobject (GCalLocalRecord *local,
- CalComponent *obj)
-{
- unsigned long int pilot_status;
-
- g_return_if_fail(local!=NULL);
- g_return_if_fail(obj!=NULL);
-
- local->ical = obj;
- cal_component_get_pilot_id (obj, &local->local.ID);
- cal_component_get_pilot_status (obj, &pilot_status);
-
-/*
- LOG ("local->Id = %ld [%s], status = %d",
- local->local.ID,obj->summary,local->ical->pilot_status);
-*/
- switch (pilot_status) {
- case ICAL_PILOT_SYNC_NONE:
- local->local.attr = GnomePilotRecordNothing;
- break;
- case ICAL_PILOT_SYNC_MOD:
- local->local.attr = GnomePilotRecordModified;
- break;
- case ICAL_PILOT_SYNC_DEL:
- local->local.attr = GnomePilotRecordDeleted;
- break;
- }
-
- /* Records without a pilot_id are new */
- if (local->local.ID == 0)
- local->local.attr = GnomePilotRecordNew;
-
- /*
- local->local.secret = 0;
- if(obj->class!=NULL)
- if(strcmp(obj->class,"PRIVATE")==0)
- local->local.secret = 1;
- */
-
- local->local.archived = 0;
-}
-
-
-/*
- * Given a PilotRecord, find the matching record in
- * the calendar repository. If no match, return NULL
- */
-static GCalLocalRecord *
-find_record_in_repository(GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- char *uid = NULL;
- GCalLocalRecord *loc;
- CalClientGetStatus status;
- CalComponent *obj;
-
- g_return_val_if_fail(conduit!=NULL,NULL);
- g_return_val_if_fail(remote!=NULL,NULL);
-
- printf ("find_record_in_repository: remote=%s... ",
- print_remote (remote));
-
- status = cal_client_get_uid_by_pilot_id (ctxt->client, remote->ID, &uid);
-
- if (status == CAL_CLIENT_GET_SUCCESS) {
- status = cal_client_get_object (ctxt->client, uid, &obj);
- if (status == CAL_CLIENT_GET_SUCCESS) {
- printf ("found %s\n", print_ical (obj));
- loc = g_new0(GCalLocalRecord,1);
- /* memory allocated in new_from_string is freed in free_match */
- local_record_from_icalobject (loc, obj);
- return loc;
- }
- }
-
- printf ("not found\n");
- return NULL;
-}
-
-
-/*
- * updates an given CalComponent in the repository
- */
-static void
-update_calendar_entry_in_repository(GnomePilotConduitStandardAbs *conduit,
- CalComponent *obj,
- GCalConduitContext *ctxt)
-{
- gboolean success;
-
- g_return_if_fail(conduit!=NULL);
- g_return_if_fail(obj!=NULL);
-
- printf (" update_calendar_entry_in_repository "
- "saving %s to desktop\n",
- print_ical (obj));
-
- success = cal_client_update_object (ctxt->client, obj);
-
- if (! success) {
- WARN (_("Error while communicating with calendar server"));
- }
-}
-
-
-static CalComponent *
-ical_from_remote_record(GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- CalComponent *in_obj)
-{
- CalComponent *obj;
- // int i;
- struct Appointment a;
- struct icaltimetype now = icaltimetype_from_timet (time (NULL), FALSE);
-
- CalComponentText summary = {NULL, NULL};
- CalComponentText comment = {NULL, NULL};
- GSList *comment_list;
-
- g_return_val_if_fail(remote!=NULL,NULL);
- memset(&a,0,sizeof(struct Appointment));
- unpack_Appointment(&a,remote->record,remote->length);
-
- printf (" ical_from_remote_record: "
- "merging remote %s into local %s\n",
- print_remote (remote), print_ical (in_obj));
-
-
- if (in_obj == NULL) {
- obj = cal_component_new ();
- } else {
- obj = in_obj;
- }
-
- summary.value = a.description;
- cal_component_set_summary (obj, &summary);
-
- comment.value = a.note;
- comment_list = g_slist_append (NULL, &comment);
- cal_component_set_comment_list (obj, comment_list);
- g_slist_free (comment_list);
-
- cal_component_set_new_vtype (obj, CAL_COMPONENT_EVENT);
-
- //obj->created = now;
- cal_component_set_created (obj, &now);
- //obj->last_mod = now;
- cal_component_set_last_modified (obj, &now);
- //obj->priority = 0;
- //obj->transp = 0;
- cal_component_set_transparency (obj,
- /*CalComponentTransparency transp*/
- CAL_COMPONENT_TRANSP_NONE);
- //obj->related = NULL;
-
- // obj->pilot_id = remote->ID;
- // cal_component_set_pilot_status (obj, ICAL_PILOT_SYNC_NONE);
-
- /*
- * Begin and end
- */
-
- if (a.event)
- {
- /* turn day-long events into a full day's appointment
- FIXME: get settings from gnomecal */
- a.begin.tm_sec = 0;
- a.begin.tm_min = 0;
- a.begin.tm_hour = 0;
-
- a.end.tm_sec = 0;
- a.end.tm_min =59;
- a.end.tm_hour = 23;
- }
-
- //obj->dtstart = mktime (&a.begin);
- {
- /* do i need to malloc these? FIX ME */
- struct icaltimetype dtstart_ictt;
- CalComponentDateTime dtstart;
-
- dtstart_ictt = icaltimetype_from_timet (mktime (& a.begin), FALSE);
- dtstart.value = &dtstart_ictt;
- dtstart.tzid = NULL;
- cal_component_set_dtstart (obj, &dtstart);
- }
-
- //obj->dtend = mktime (&a.end);
- {
- /* do i need to malloc these? FIX ME */
- struct icaltimetype dtend_ictt;
- CalComponentDateTime dtend;
-
- dtend_ictt = icaltimetype_from_timet (mktime (& a.end), FALSE);
- dtend.value = &dtend_ictt;
- dtend.tzid = NULL;
- cal_component_set_dtend (obj, &dtend);
- }
-
-
- /* Special case: daily repetitions are converted to a multi-day event */
- /* This sucketh, a pilot event scheduled for dailyRepeat, freq 1, end on
- whatever is cleary converted wrong
- if (a.repeatType == repeatDaily){
- time_t newt = time_add_day (obj->dtend, a.repeatFrequency);
-
- obj->dtend = newt;
- }
- */
-
-#warning "finish alarms here"
-#if 0
- /*
- * Alarm
- */
- if (a.alarm){
- obj->aalarm.type = ALARM_AUDIO;
- obj->aalarm.enabled = 1;
- obj->aalarm.count = a.advance;
-
- switch (a.advanceUnits){
- case advMinutes:
- obj->aalarm.units = ALARM_MINUTES;
- break;
-
- case advHours:
- obj->aalarm.units = ALARM_HOURS;
- break;
-
- case advDays:
- obj->aalarm.units = ALARM_DAYS;
- break;
- default:
- }
- }
-#endif /* 0 */
-
-#warning "finish recurrence here"
-#if 0
- /*
- * Recurrence
- */
- if (a.repeatFrequency) {
- obj->recur = g_new0 (Recurrence, 1);
-
- switch (a.repeatType){
- case repeatDaily:
- /*
- * In the Pilot daily repetitions are actually
- * multi-day events
- */
- obj->recur->type = RECUR_DAILY;
- break;
-
- case repeatMonthlyByDate:
- obj->recur->type = RECUR_MONTHLY_BY_DAY;
- obj->recur->u.month_day = a.repeatFrequency;
- break;
-
- case repeatWeekly:
- {
- int wd;
-
- obj->recur->type = RECUR_WEEKLY;
- for (wd = 0; wd < 7; wd++)
- if (a.repeatDays [wd])
- obj->recur->weekday |= 1 << wd;
-
- if (obj->recur->weekday == 0){
- struct tm tm = *localtime (&obj->dtstart);
-
- obj->recur->weekday = 1 << tm.tm_wday;
- }
- break;
- }
-
- case repeatMonthlyByDay:
- obj->recur->type = RECUR_MONTHLY_BY_POS;
- obj->recur->u.month_pos = a.repeatFrequency;
- obj->recur->weekday = (a.repeatDay / 7);
- break;
-
- case repeatYearly:
- obj->recur->type = RECUR_YEARLY_BY_DAY;
- break;
-
- default:
- g_assert_not_reached();
- }
-
- if (a.repeatForever)
- obj->recur->duration = 0;
- else
- obj->recur->_enddate = mktime (&a.repeatEnd);
-
- obj->recur->interval = a.repeatFrequency;
- }
-
- /*
- * Load exception dates
- */
- obj->exdate = NULL;
- for (i = 0; i < a.exceptions; i++){
- time_t *t = g_new (time_t, 1);
-
- *t = mktime (&(a.exception [i]));
- obj->exdate = g_list_prepend (obj->exdate, t);
- }
-#endif /* 0 */
-
- // g_free (obj->class);
-
- if (remote->attr & dlpRecAttrSecret)
- cal_component_set_classification (obj, CAL_COMPONENT_CLASS_PRIVATE);
- else
- cal_component_set_classification (obj, CAL_COMPONENT_CLASS_PUBLIC);
-
- free_Appointment(&a);
-
- return obj;
-}
-
-
-/* Code blatantly stolen from
- * calendar-pilot-sync.c:
- *
- * (C) 1999 International GNOME Support
- *
- * Author:
- * Miguel de Icaza (miguel@gnome-support.com)
- *
- */
-static gint
-update_record (GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- CalComponent *obj;
- struct Appointment a;
- CalClientGetStatus status;
- char *uid;
-
- CalComponentText summary = {NULL, NULL};
- CalComponentText comment = {NULL, NULL};
- GSList *comment_list;
-
- g_return_val_if_fail(remote!=NULL,-1);
-
- memset(&a,0,sizeof(struct Appointment));
- unpack_Appointment(&a,remote->record,remote->length);
-
- printf (" cal_client_get_uid_by_pilot_id... ");
-
- status = cal_client_get_uid_by_pilot_id (ctxt->client,
- remote->ID, &uid);
- if (status == CAL_CLIENT_GET_SUCCESS) {
- printf (" succeeded with '%s'\n", uid);
- printf (" cal_client_get_object... ");
- status = cal_client_get_object (ctxt->client, uid, &obj);
- }
-
- if (status != CAL_CLIENT_GET_SUCCESS) {
- struct icaltimetype now = icaltimetype_from_timet (time (NULL), FALSE);
-
- printf ("failed, making a new one.\n");
-
- obj = cal_component_new ();
-
- summary.value = a.description;
- cal_component_set_summary (obj, &summary);
-
- comment.value = a.note;
- comment_list = g_slist_append (NULL, &comment);
- cal_component_set_comment_list (obj, comment_list);
- g_slist_free (comment_list);
-
- // obj->type = ICAL_TODO;
- cal_component_set_new_vtype (obj, CAL_COMPONENT_TODO);
- // obj->new = TRUE;
- // obj->created = now;
- cal_component_set_created (obj, &now);
- // obj->last_mod = now;
- cal_component_set_last_modified (obj, &now);
- // obj->priority = 0;
- // obj->transp = 0;
- cal_component_set_transparency (obj,
- /*CalComponentTransparency transp*/
- CAL_COMPONENT_TRANSP_NONE);
- // obj->related = NULL;
- //obj->pilot_id = remote->ID;
- //obj->pilot_status = ICAL_PILOT_SYNC_NONE;
- cal_component_set_pilot_id (obj, remote->ID);
- cal_component_set_pilot_status (obj, ICAL_PILOT_SYNC_NONE);
- } else {
- CalComponent *new_obj;
-
- printf ("succeeded %s\n", print_ical (obj));
-
- new_obj = ical_from_remote_record (conduit, remote, obj);
- obj = new_obj;
- }
-
- /* update record on server */
- {
- const char *uid;
- unsigned long pilot_id;
-
- cal_component_get_uid (obj, &uid);
- cal_component_get_pilot_id (obj, &pilot_id);
-
- update_calendar_entry_in_repository (conduit, obj, ctxt);
- cal_client_update_pilot_id (ctxt->client, (char *) uid, pilot_id,
- ICAL_PILOT_SYNC_NONE);
- }
-
- /*
- * Shutdown
- */
- //ical_object_unref (obj);
- free_Appointment(&a);
-
- return 0;
-}
-
-static void
-check_for_slow_setting (GnomePilotConduit *c, GCalConduitContext *ctxt)
-{
- GList *uids;
- unsigned long int entry_number;
-
- /* get all but TODOs, those are handled by the todo conduit */
- /* uids = cal_client_get_uids (ctxt->client, CALOBJ_TYPE_ANY); */
- uids = cal_client_get_uids (ctxt->client,
- CALOBJ_TYPE_EVENT |
- /*CALOBJ_TYPE_TODO |*/
- CALOBJ_TYPE_JOURNAL);
-
- entry_number = g_list_length (uids);
-
- /* If the local base is empty, do a slow sync */
- if (entry_number == 0) {
- GnomePilotConduitStandard *conduit;
- printf (" doing slow sync\n");
- conduit = GNOME_PILOT_CONDUIT_STANDARD (c);
- gnome_pilot_conduit_standard_set_slow (conduit);
- } else {
- printf (" doing fast sync\n");
- }
-}
-
-static gint
-pre_sync (GnomePilotConduit *c,
- GnomePilotDBInfo *dbi,
- GCalConduitContext *ctxt)
-{
- int l;
- unsigned char *buf;
- GnomePilotConduitStandardAbs *conduit;
-
-
- /*
- g_log_set_always_fatal (G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL |
- G_LOG_LEVEL_WARNING);
- */
-
-
- conduit = GNOME_PILOT_CONDUIT_STANDARD_ABS(c);
-
-
- printf ("---------------------------------------------------------\n");
- printf ("pre_sync: Calendar Conduit v.%s\n", CONDUIT_VERSION);
- g_message ("Calendar Conduit v.%s", CONDUIT_VERSION);
-
- ctxt->client = NULL;
-
- if (start_calendar_server (GNOME_PILOT_CONDUIT_STANDARD_ABS(c), ctxt) != 0) {
- WARN(_("Could not start gnomecal server"));
- gnome_pilot_conduit_error(GNOME_PILOT_CONDUIT(c),
- _("Could not start gnomecal server"));
- return -1;
- }
-
-
-#if 0
- /* Set the counters for the progress bar crap */
- num_records = GNOME_Calendar_Repository_get_number_of_objects (ctxt->calendar, GNOME_Calendar_Repository_ANY, &(ctxt->ev));
-
- catch_ret_val (ctxt->ev, -1);
- gnome_pilot_conduit_standard_abs_set_num_local_records(GNOME_PILOT_CONDUIT_STANDARD_ABS(c), num_records);
- num_records = GNOME_Calendar_Repository_get_number_of_objects (ctxt->calendar, GNOME_Calendar_Repository_MODIFIED, &(ctxt->ev));
- catch_ret_val (ctxt->ev, -1);
- gnome_pilot_conduit_standard_abs_set_num_updated_local_records(GNOME_PILOT_CONDUIT_STANDARD_ABS(c), num_records);
- num_records = GNOME_Calendar_Repository_get_number_of_objects (ctxt->calendar, GNOME_Calendar_Repository_NEW, &(ctxt->ev));
- catch_ret_val (ctxt->ev, -1);
- gnome_pilot_conduit_standard_abs_set_num_new_local_records(GNOME_PILOT_CONDUIT_STANDARD_ABS(c), num_records);
- num_records = GNOME_Calendar_Repository_get_number_of_objects (ctxt->calendar, GNOME_Calendar_Repository_DELETED, &(ctxt->ev));
- catch_ret_val (ctxt->ev, -1);
- gnome_pilot_conduit_standard_abs_set_num_deleted_local_records(GNOME_PILOT_CONDUIT_STANDARD_ABS(c), num_records);
-#endif /* 0 */
-
- gtk_object_set_data(GTK_OBJECT(c),"dbinfo",dbi);
-
- /* load_records(c); */
-
- buf = (unsigned char*)g_malloc(0xffff);
- if((l=dlp_ReadAppBlock(dbi->pilot_socket,dbi->db_handle,0,(unsigned char *)buf,0xffff)) < 0) {
- WARN(_("Could not read pilot's DateBook application block"));
- WARN("dlp_ReadAppBlock(...) = %d",l);
- gnome_pilot_conduit_error(GNOME_PILOT_CONDUIT(c),
- _("Could not read pilot's DateBook application block"));
- return -1;
- }
- unpack_AppointmentAppInfo(&(ctxt->ai),buf,l);
- g_free(buf);
-
- check_for_slow_setting(c,ctxt);
-
- return 0;
-}
-
-/**
- * Find (if possible) the local record which matches
- * the given PilotRecord.
- * if successfull, return non-zero and set *local to
- * a non-null value (the located local record),
- * otherwise return 0 and set *local = NULL;
- */
-
-static gint
-match_record (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord **local,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- printf ("match_record: 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 = find_record_in_repository(conduit,remote,ctxt);
-
- if (*local == NULL)
- printf (" match_record: not found.\n");
- else
- printf (" match_record: found, %s\n", print_local (*local));
-
- if (*local==NULL) return -1;
- return 0;
-}
-
-/**
- * Free the data allocated by a previous match_record call.
- * If successfull, return non-zero and ser *local=NULL, otherwise
- * return 0.
- */
-static gint
-free_match (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord **local,
- GCalConduitContext *ctxt)
-{
- printf ("free_match: %s\n", print_local (*local));
-
- g_return_val_if_fail (local!=NULL, -1);
- g_return_val_if_fail (*local!=NULL, -1);
-
- // ical_object_unref (GCAL_LOCALRECORD(*local)->ical);
- g_free (*local);
-
- *local = NULL;
- return 0;
-}
-
-/*
- Move to archive and set status to Nothing
- */
-static gint
-archive_local (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- GCalConduitContext *ctxt)
-{
- printf ("archive_local: doing nothing with %s\n", print_local (local));
-
- g_return_val_if_fail(local!=NULL,-1);
-
- return -1;
-}
-
-/*
- Store in archive and set status to Nothing
- */
-static gint
-archive_remote (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- printf ("archive_remote: doing nothing with %s\n",
- print_local (local));
-
- //g_return_val_if_fail(remote!=NULL,-1);
- //g_return_val_if_fail(local!=NULL,-1);
-
- return -1;
-}
-
-/*
- Store and set status to Nothing
- */
-static gint
-store_remote (GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- printf ("store_remote: copying pilot record %s to desktop\n",
- print_remote (remote));
-
- g_return_val_if_fail(remote!=NULL,-1);
- remote->attr = GnomePilotRecordNothing;
-
- return update_record(conduit,remote,ctxt);
-}
-
-static gint
-clear_status_archive_local (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- GCalConduitContext *ctxt)
-{
- printf ("clear_status_archive_local: doing nothing\n");
-
- g_return_val_if_fail(local!=NULL,-1);
-
- return -1;
-}
-
-static gint
-iterate (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord **local,
- GCalConduitContext *ctxt)
-{
- static GSList *events,*iterator;
- static int hest;
-
- g_return_val_if_fail(local!=NULL,-1);
-
- if(*local==NULL) {
- LOG ("beginning iteration");
-
- events = get_calendar_objects(conduit,NULL,ctxt);
- hest = 0;
-
- if(events!=NULL) {
- LOG ("iterating over %d records", g_slist_length (events));
- *local = g_new0(GCalLocalRecord,1);
-
- local_record_from_ical_uid(*local,(gchar*)events->data,ctxt);
- iterator = events;
- } else {
- LOG ("no events");
- (*local) = NULL;
- }
- } else {
- hest++;
- if(g_slist_next(iterator)==NULL) {
- GSList *l;
-
- LOG ("ending");
- /** free stuff allocated for iteration */
- g_free((*local));
-
- LOG ("iterated over %d records", hest);
- for(l=events;l;l=l->next)
- g_free(l->data);
-
- g_slist_free(events);
-
- /* ends iteration */
- (*local) = NULL;
- return 0;
- } else {
- iterator = g_slist_next(iterator);
- local_record_from_ical_uid(*local,(gchar*)(iterator->data),ctxt);
- }
- }
- return 1;
-}
-
-
-static gint
-iterate_specific (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord **local,
- gint flag,
- gint archived,
- GCalConduitContext *ctxt)
-{
- (*local) = NULL;
-
- /* debugging */
- {
- gchar *tmp;
- switch (flag) {
- case GnomePilotRecordNothing:
- tmp = g_strdup("RecordNothing"); break;
- case GnomePilotRecordModified:
- tmp = g_strdup("RecordModified"); break;
- case GnomePilotRecordDeleted:
- tmp = g_strdup("RecordDeleted"); break;
- case GnomePilotRecordNew:
- tmp = g_strdup("RecordNew"); break;
- default: tmp = g_strdup_printf("0x%x",flag); break;
- }
- printf ("\niterate_specific: (flag = %s)... ", tmp);
- g_free(tmp);
- }
-
-
- g_return_val_if_fail(local!=NULL,-1);
-
- /* iterate until a record meets the criteria */
- while (gnome_pilot_conduit_standard_abs_iterate (conduit,
- (LocalRecord**)local)) {
- if((*local)==NULL) break;
- if(archived && ((*local)->local.archived==archived)) break;
- if(((*local)->local.attr == flag)) break;
- }
-
- if ((*local)) {
- printf (" found %s\n", print_local (*local));
- } else {
- printf (" no more found.\n");
- }
-
- return (*local)==NULL?0:1;
-}
-
-
-static gint
-purge (GnomePilotConduitStandardAbs *conduit,
- GCalConduitContext *ctxt)
-{
- printf ("purge: doing nothing\n");
-
- /* HEST, gem posterne her */
-
- return -1;
-}
-
-
-static char *gnome_pilot_status_to_string (gint status)
-{
- switch(status) {
- case GnomePilotRecordPending: return "GnomePilotRecordPending";
- case GnomePilotRecordNothing: return "GnomePilotRecordNothing";
- case GnomePilotRecordDeleted: return "GnomePilotRecordDeleted";
- case GnomePilotRecordNew: return "GnomePilotRecordNew";
- case GnomePilotRecordModified: return "GnomePilotRecordModified";
- }
-
- return "Unknown";
-}
-
-
-static gint
-set_status (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- gint status,
- GCalConduitContext *ctxt)
-{
- gboolean success;
- iCalPilotState new_state;
-
- printf ("set_status: %s status is now '%s'\n",
- print_local (local),
- gnome_pilot_status_to_string (status));
-
- g_return_val_if_fail(local!=NULL,-1);
- g_assert(local->ical!=NULL);
-
- local->local.attr = status;
- switch(status) {
- case GnomePilotRecordPending:
- case GnomePilotRecordNothing:
- new_state = ICAL_PILOT_SYNC_NONE;
- break;
- case GnomePilotRecordDeleted:
- break;
- case GnomePilotRecordNew:
- case GnomePilotRecordModified:
- new_state = ICAL_PILOT_SYNC_MOD;
- break;
- }
-
- if (status == GnomePilotRecordDeleted) {
- const char *uid;
- cal_component_get_uid (local->ical, &uid);
- success = cal_client_remove_object (ctxt->client, uid);
- } else {
- const char *uid;
- unsigned long pilot_id;
-
- cal_component_get_uid (local->ical, &uid);
- cal_component_get_pilot_id (local->ical, &pilot_id);
-
- success = cal_client_update_object (ctxt->client, local->ical);
- cal_client_update_pilot_id (ctxt->client, (char *) uid,
- pilot_id, new_state);
- }
-
- if (! success) {
- WARN (_("Error while communicating with calendar server"));
- }
-
- return 0;
-}
-
-static gint
-set_archived (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- gint archived,
- GCalConduitContext *ctxt)
-{
- printf ("set_archived: %s archived flag is now '%d'\n",
- print_local (local), archived);
-
- g_return_val_if_fail(local!=NULL,-1);
- g_assert(local->ical!=NULL);
-
- local->local.archived = archived;
- update_calendar_entry_in_repository(conduit,local->ical,ctxt);
- /* FIXME: This should move the entry into a speciel
- calendar file, eg. Archive, or (by config option), simply
- delete it */
- return 0;
-}
-
-static gint
-set_pilot_id (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- guint32 ID,
- GCalConduitContext *ctxt)
-{
- const char *uid;
- unsigned long int pilot_status;
-
- printf ("set_pilot_id: %s pilot ID is now '%d'\n",
- print_local (local), ID);
-
- g_return_val_if_fail(local!=NULL,-1);
- g_assert(local->ical!=NULL);
-
- local->local.ID = ID;
- cal_component_set_pilot_id (local->ical, ID);
-
- cal_component_get_uid (local->ical, &uid);
- cal_component_get_pilot_status (local->ical, &pilot_status);
-
- cal_client_update_pilot_id (ctxt->client,
- (char *) uid,
- local->local.ID,
- pilot_status);
-
- return 0;
-}
-
-static gint
-transmit (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- PilotRecord **remote,
- GCalConduitContext *ctxt)
-{
- PilotRecord *p;
- //int daycount;
-
- CalComponentText summary;
- GSList *comment_list = NULL;
- CalComponentText *comment;
-
- printf ("transmit: encoding local %s\n", print_local (local));
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(remote!=NULL,-1);
- g_assert(local->ical!=NULL);
-
- p = g_new0(PilotRecord,1);
-
- p->ID = local->local.ID;
- p->attr = local->local.attr;
- p->archived = local->local.archived;
- p->secret = local->local.secret;
-
- local->a = g_new0(struct Appointment,1);
-
- local->a->event = 0; /* if no start time, leave at 1 */
- //local->a->begin = *localtime(&local->ical->dtstart);
- {
- CalComponentDateTime dtstart;
- time_t dtstart_time_t;
-
- cal_component_get_dtstart (local->ical, &dtstart);
- dtstart_time_t = time_from_icaltimetype (*dtstart.value);
-
- local->a->begin = *localtime (&dtstart_time_t);
- }
-
- //local->a->end = *localtime(&local->ical->dtend);
- {
- CalComponentDateTime dtend;
- time_t dtend_time_t;
-
- cal_component_get_dtend (local->ical, &dtend);
- dtend_time_t = time_from_icaltimetype (*dtend.value);
-
- local->a->end = *localtime (&dtend_time_t);
- }
-
-#warning "finish alarm and recurrence here"
-#if 0
- /* set the Audio Alarm parameters */
- if(local->ical->aalarm.enabled) {
- local->a->alarm = 1;
- local->a->advance = local->ical->aalarm.count;
- switch(local->ical->aalarm.units) {
- case ALARM_MINUTES:
- local->a->advanceUnits = advMinutes;
- break;
- case ALARM_HOURS:
- local->a->advanceUnits = advHours;
- break;
- case ALARM_DAYS:
- local->a->advanceUnits = advDays;
- break;
- }
- } else {
- local->a->alarm = 0;
- local->a->advance = 0;
- local->a->advanceUnits = advMinutes;
- }
-
- /* set the recurrence parameters */
- if (local->ical->recur != NULL) {
- switch (local->ical->recur->type) {
- case RECUR_DAILY:
- local->a->repeatType = repeatDaily;
- break;
- case RECUR_WEEKLY:
- local->a->repeatType = repeatWeekly;
- break;
- case RECUR_MONTHLY_BY_POS:
- local->a->repeatType = repeatMonthlyByDate;
- break;
- case RECUR_MONTHLY_BY_DAY:
- local->a->repeatType = repeatMonthlyByDay;
- break;
- case RECUR_YEARLY_BY_MONTH:
- local->a->repeatType = repeatYearly;
- break;
- case RECUR_YEARLY_BY_DAY:
- local->a->repeatType = repeatYearly;
- break;
- }
- if (local->ical->recur->duration == 0) {
- local->a->repeatForever = 1;
- } else {
- local->a->repeatForever = 0;
- local->a->repeatEnd = *localtime(&local->ical->recur->_enddate);
- }
- local->a->repeatFrequency = local->ical->recur->interval;
-
-
- for ( daycount=0; daycount<7; daycount++ ) {
- if (local->ical->recur->weekday & (1 << daycount))
- local->a->repeatDays[daycount] = 1;
- }
- } else {
- local->a->repeatType = repeatNone;
- local->a->repeatForever = 0;
- local->a->repeatEnd = local->a->end;
- local->a->repeatFrequency = 0;
- local->a->repeatDay = dom1stSun;
- local->a->repeatDays[0] = 0;
- local->a->repeatDays[1] = 0;
- local->a->repeatDays[2] = 0;
- local->a->repeatDays[3] = 0;
- local->a->repeatDays[4] = 0;
- local->a->repeatDays[5] = 0;
- local->a->repeatDays[6] = 0;
- local->a->repeatWeekstart = 0;
- local->a->exceptions = 0;
- local->a->exception = NULL;
- }
-#endif /* 0 */
-
- /* STOP: don't replace these with g_strdup, since free_Appointment
- uses free to deallocte */
-
- cal_component_get_summary (local->ical, &summary);
- local->a->note =
- //local->ical->comment==NULL?NULL:strdup(local->ical->comment);
- strdup ((char *) summary.value);
-
- /* local->a->description =
- local->ical->summary==NULL?NULL:strdup(local->ical->summary); */
-
- cal_component_get_comment_list (local->ical, &comment_list);
- if (comment_list) {
- comment = (CalComponentText *) comment_list->data;
- if (comment && comment->value)
- local->a->description = strdup (comment->value);
- else
- local->a->description = NULL;
- } else {
- local->a->note = NULL;
- }
-
- /* Generate pilot record structure */
- p->record = g_new0(char,0xffff);
- p->length = pack_Appointment(local->a,p->record,0xffff);
-
-#if 0
- /* This is some debug code that hexdumps the calendar entry...
- You won't need this. */
- {
- int x,y;
- g_message("calconduit: new item from %s to %s",asctime(&(local->a->begin)),asctime(&(local->a->end)));
-
- g_message("local->a->note = %s",local->a->note);
- g_message("local->a->description = %s",local->a->description);
- g_message("sizeof(p->record) = %d, length is %d",sizeof(p->record),p->length);
- for(x=0;x<p->length;x+=32) {
- for(y=x;y<x+32;y++)
- if(p->record[y]<33 || p->record[y]>128)
- printf("%02X",p->record[y]);
- else
- printf(" %c",p->record[y]);
- printf("\n");
- }
- }
-#endif
-
- *remote = p;
-
- return 0;
-}
-
-static gint
-free_transmit (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- PilotRecord **remote,
- GCalConduitContext *ctxt)
-{
- LOG ("entering free_transmit");
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(remote!=NULL,-1);
-
- /* free_Appointment(local->a); */ /* FIX ME is this needed? */
- g_free((*remote)->record);
- *remote = NULL;
- return 0;
-}
-
-
-static gint
-compare (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- /* used by the quick compare */
- PilotRecord *remoteOfLocal;
- int err;
- int retval;
-
- /* used by the tedious compare */
- //struct Appointment a;
-
- printf ("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);
-#if 1
- err = transmit(conduit,local,&remoteOfLocal,ctxt);
- if (err != 0) return err;
-
- retval = 0;
- if (remote->length == remoteOfLocal->length) {
- if (memcmp (remoteOfLocal->record,
- remote->record, remote->length)!=0) {
- printf (" compare failed on contents\n");
- retval = 1;
- }
- } else {
- g_message("compare failed on length");
- retval = 1;
- }
-
-
- if (retval == 0) {
- printf (" match.\n");
- } else {
- /* debug spew */
- printf (" local:%s\n", print_remote (remoteOfLocal));
- printf (" remote:%s\n", print_remote (remote));
- }
-
- free_transmit(conduit,local,&remoteOfLocal,ctxt);
- return retval;
-
-#else
- /** FIXME: All the { LOG("yadayada"); return 1; } bloat is for debug purposes.
- Once this is known to work, compact to return 1;'s */
-
- /* Check record attributes */
- if (local->local.ID != remote->ID) {
- LOG("failed local->local.ID == remote->ID");
- return 1;
- }
- if (local->local.attr != remote->attr) {
- LOG("failed local->local.attr == remote->attr");
- return 1;
- }
- if (local->local.archived != remote->archived) {
- LOG("failed local->local.archived == remote->archived");
- return 1;
- }
- if (local->local.secret != remote->secret) {
- LOG("failed local->local.secret == remote->secret");
- return 1;
- }
-
- unpack_Appointment(&a,remote->record,remote->length);
-
- /* Check records begin/end time */
- if (a.event==0) {
-/* FIXME
- if (a.begin != *localtime(&local->ical->dtstart)) {
- LOG("a.begin == *localtime(&local->ical->dtstart)");
- return 1;
- }
- if (a.end != *localtime(&local->ical->dtend)) {
- LOG("a.end == *localtime(&local->ical->dtend)");
- return 1;
- }
-*/
- } else {
- LOG("failed local->a.event != 0, unsupported by gnomecal");
- return 1;
- }
-
- /* Check records alarm settings */
- if(a.alarm == 1) {
- if (local->ical->aalarm.enabled == 1) {
- if (a.advance != local->ical->aalarm.count) {
- LOG("failed a.advance == local->ical->aalarm.count");
- return 1;
- }
- switch(local->ical->aalarm.units) {
- case ALARM_MINUTES:
- if (a.advanceUnits != advMinutes) {
- LOG("failed local->ical->aalarm.units == a.advanceUnits");
- return 1;
- }
- break;
- case ALARM_HOURS:
- if (a.advanceUnits != advHours) {
- LOG("failed local->ical->aalarm.units == a.advanceUnits");
- return 1;
- }
- break;
- case ALARM_DAYS:
- if (a.advanceUnits != advDays) {
- LOG("failed local->ical->aalarm.units == a.advanceUnits");
- return 1;
- }
- break;
- }
- } else {
- LOG("failed a.alarm == 1 && local->ical->aalarm.enabled == 1");
- return 1;
- }
- } else if (local->ical->aalarm.enabled == 1) {
- LOG("failed a.alarm != 1 && local->ical->aalarm.enabled != 1");
- return 1;
- }
-
- /* Check records recurrence settings */
- /* If this code is broken, a more or less safe although not efficient
- approach is (other the fixing the bug), if either has recurrence,
- return 1, thus failing the comparision */
- if (local->ical->recur != NULL) {
- if (a.repeatType == repeatNone) {
- LOG("failed: local->ical->recur != NULL && a.repeatType != repeatNone");
- return 1;
- }
- switch (local->ical->recur->type) {
- case RECUR_DAILY:
- if (a.repeatType != repeatDaily) {
- LOG("failed a.repeatType == repeatDaily");
- return 1; }
- break;
- case RECUR_WEEKLY:
- if (a.repeatType != repeatWeekly) {
- LOG("failed a.repeatType == repeatWeekly");
- return 1; }
- break;
- case RECUR_MONTHLY_BY_POS:
- if (a.repeatType != repeatMonthlyByDate) {
- LOG("failed a.repeatType == repeatMonthlyByDate");
- return 1; }
- break;
- case RECUR_MONTHLY_BY_DAY:
- if (a.repeatType != repeatMonthlyByDay) {
- LOG("failed a.repeatType == repeatMonthlyByDay");
- return 1; }
- break;
- case RECUR_YEARLY_BY_MONTH:
- if (a.repeatType != repeatYearly) {
- LOG("failed a.repeatType == repeatYearly");
- return 1; }
- break;
- case RECUR_YEARLY_BY_DAY:
- if (a.repeatType != repeatYearly) {
- LOG("failed a.repeatType == repeatYearly");
- return 1; }
- break;
- }
- if (local->ical->recur->duration == 0) {
- if(a.repeatForever != 1) {
- LOG("failed local->ical->recur->duration == 0 && a.repeatForever == 1");
- return 1;
- }
- } else {
- if(a.repeatForever != 0) {
- LOG("failed local->ical->recur->duration != 0 && ! a.repeatForever == 0");
- return 1;
- }
-/* FIXME
- if(a.repeatEnd != *localtime(&local->ical->recur->_enddate)) {
- LOG("failed a.repeatEnd == *localtime(&local->ical->recur->_enddate)");
- return 1;
- }
-*/
- }
- if (a.repeatFrequency != local->ical->recur->interval) {
- LOG("failed a.repeatFrequency == local->ical->recur->interval");
- return 1;
- }
- for (daycount = 0; daycount<7; daycount++) {
- if(local->ical->recur->weekday & (1<<daycount)) {
- if (a.repeatDays[daycount]!=1) {
- LOG("failed local->ical->recur->weekday & (1<<daycount) && a.repeatDays[daycount]==1");
- return 1;
- }
- } else {
- if (a.repeatDays[daycount]!=0) {
- LOG("failed local->ical->recur->weekday &! (1<<daycount) && a.repeatDays[daycount]==0");
- return 1;
- }
- }
- }
- } else if (a.repeatType != repeatNone ) {
- LOG("failed: local->ical->recur == NULL && a.repeatType == repeatNone");
- return 1;
- }
-
- /* check the note and description */
- if(a.note!=NULL) {
- if(local->ical->comment==NULL) {
- LOG("failed a.note != NULL && local->ical->coment != NULL");
- return 1;
- }
- if(strcmp(local->ical->comment,a.note)!=0) {
- LOG("failed strcmp(local->ical->comment,a.note)==0");
- return 1;
- }
- } if(local->ical->comment!=NULL) {
- LOG("failed a.note == NULL && local->ical->coment == NULL");
- return 1;
- }
- if(a.description!=NULL) {
- if(local->ical->summary==NULL) {
- LOG("failed a.description != NULL && local->ical->coment != NULL");
- return 1;
- }
- if(strcmp(local->ical->summary,a.description)!=0) {
- LOG("failed strcmp(local->ical->summary,a.description)==0");
- return 1;
- }
- } if(local->ical->summary!=NULL) {
- LOG("failed a.description == NULL && local->ical->coment == NULL");
- return 1;
- }
-#endif
- return 0;
-}
-
-static gint
-compare_backup (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- printf ("compare_backup: doing nothing\n");
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(remote!=NULL,-1);
-
- return -1;
-}
-
-
-static gint
-delete_all (GnomePilotConduitStandardAbs *conduit,
- GCalConduitContext *ctxt)
-{
- GSList *events,*it;
- gboolean error;
- gboolean success;
-
- events = get_calendar_objects(conduit,&error,ctxt);
-
- printf ("delete_all: deleting all objects from desktop\n");
-
- if (error == FALSE) return -1;
- for (it=events; it; it = g_slist_next (it)) {
- success = cal_client_remove_object (ctxt->client, it->data);
-
- if (!success)
- INFO ("Object did not exist");
-
- g_free (it->data);
- }
-
- g_slist_free (events);
- return -1;
-}
-
-
-static ORBit_MessageValidationResult
-accept_all_cookies (CORBA_unsigned_long request_id,
- CORBA_Principal *principal,
- CORBA_char *operation)
-{
- /* allow ALL cookies */
- return ORBIT_MESSAGE_ALLOW_ALL;
-}
-
-
-GnomePilotConduit *
-conduit_get_gpilot_conduit (guint32 pilotId)
-{
- GtkObject *retval;
- GCalConduitCfg *cfg;
- GCalConduitContext *ctxt;
-
- printf ("in calendar's conduit_get_gpilot_conduit\n");
-
- /* we need to find wombat with oaf, so make sure oaf
- is initialized here. once the desktop is converted
- to oaf and gpilotd is built with oaf, this can go away */
- if (! oaf_is_initialized ())
- {
- char *argv[ 1 ] = {"hi"};
- oaf_init (1, argv);
-
- if (bonobo_init (CORBA_OBJECT_NIL,
- CORBA_OBJECT_NIL,
- CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-
- ORBit_set_request_validation_handler (accept_all_cookies);
- }
-
-
- retval = gnome_pilot_conduit_standard_abs_new ("DatebookDB", 0x64617465);
- g_assert (retval != NULL);
- gnome_pilot_conduit_construct(GNOME_PILOT_CONDUIT(retval),"GnomeCalConduit");
-
- gcalconduit_load_configuration(&cfg,pilotId);
- gtk_object_set_data(retval,"gcalconduit_cfg",cfg);
-
- gcalconduit_new_context(&ctxt,cfg);
- gtk_object_set_data(GTK_OBJECT(retval),"gcalconduit_context",ctxt);
-
- gtk_signal_connect (retval, "match_record", (GtkSignalFunc) match_record, ctxt);
- gtk_signal_connect (retval, "free_match", (GtkSignalFunc) free_match, ctxt);
- gtk_signal_connect (retval, "archive_local", (GtkSignalFunc) archive_local, ctxt);
- gtk_signal_connect (retval, "archive_remote", (GtkSignalFunc) archive_remote, ctxt);
- gtk_signal_connect (retval, "store_remote", (GtkSignalFunc) store_remote, ctxt);
- gtk_signal_connect (retval, "clear_status_archive_local", (GtkSignalFunc) clear_status_archive_local, ctxt);
- gtk_signal_connect (retval, "iterate", (GtkSignalFunc) iterate, ctxt);
- gtk_signal_connect (retval, "iterate_specific", (GtkSignalFunc) iterate_specific, ctxt);
- gtk_signal_connect (retval, "purge", (GtkSignalFunc) purge, ctxt);
- gtk_signal_connect (retval, "set_status", (GtkSignalFunc) set_status, ctxt);
- gtk_signal_connect (retval, "set_archived", (GtkSignalFunc) set_archived, ctxt);
- gtk_signal_connect (retval, "set_pilot_id", (GtkSignalFunc) set_pilot_id, ctxt);
- gtk_signal_connect (retval, "compare", (GtkSignalFunc) compare, ctxt);
- gtk_signal_connect (retval, "compare_backup", (GtkSignalFunc) compare_backup, ctxt);
- gtk_signal_connect (retval, "free_transmit", (GtkSignalFunc) free_transmit, ctxt);
- gtk_signal_connect (retval, "delete_all", (GtkSignalFunc) delete_all, ctxt);
- gtk_signal_connect (retval, "transmit", (GtkSignalFunc) transmit, ctxt);
- gtk_signal_connect (retval, "pre_sync", (GtkSignalFunc) pre_sync, ctxt);
-
- return GNOME_PILOT_CONDUIT (retval);
-}
-
-void
-conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit)
-{
- GCalConduitCfg *cc;
- GCalConduitContext *ctxt;
-
- cc = GET_GCALCONFIG(conduit);
- ctxt = GET_GCALCONTEXT(conduit);
-
- if (ctxt->client != NULL) {
- gtk_object_unref (GTK_OBJECT (ctxt->client));
- //pi_close (ctxt->link);
- //GNOME_Calendar_Repository_done (ctxt->calendar, &(ctxt->ev));
- }
-
- gcalconduit_destroy_configuration (&cc);
-
- gcalconduit_destroy_context (&ctxt);
-
- gtk_object_destroy (GTK_OBJECT (conduit));
-}
diff --git a/calendar/conduits/calendar/calendar-conduit.h b/calendar/conduits/calendar/calendar-conduit.h
deleted file mode 100644
index a8a1c81a50..0000000000
--- a/calendar/conduits/calendar/calendar-conduit.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* $Id$ */
-
-#ifndef __CALENDAR_CONDUIT_H__
-#define __CALENDAR_CONDUIT_H__
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <gnome.h>
-#include <pi-datebook.h>
-#include <gpilotd/gnome-pilot-conduit.h>
-#include <gpilotd/gnome-pilot-conduit-standard-abs.h>
-#include <cal-client/cal-client.h>
-#include <cal-util/calobj.h>
-#include <cal-util/timeutil.h>
-
-#ifdef USING_OAF
-#include <liboaf/liboaf.h>
-#else
-#include <libgnorba/gnorba.h>
-#endif
-
-
-/* This is the local record structure for the GnomeCal conduit. */
-typedef struct _GCalLocalRecord GCalLocalRecord;
-struct _GCalLocalRecord {
- /* 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.
- */
- LocalRecord local;
- /* The corresponding iCal object, as found by GnomeCal. */
- CalComponent *ical;
- /* pilot-link appointment structure, used for implementing Transmit. */
- struct Appointment *a;
-};
-#define GCAL_LOCALRECORD(s) ((GCalLocalRecord*)(s))
-
-/* This is the configuration of the GnomeCal conduit. */
-typedef struct _GCalConduitCfg GCalConduitCfg;
-struct _GCalConduitCfg {
- gboolean open_secret;
- guint32 pilotId;
- GnomePilotConduitSyncType sync_type; /* only used by capplet */
-};
-#define GET_GCALCONFIG(c) ((GCalConduitCfg*)gtk_object_get_data(GTK_OBJECT(c),"gcalconduit_cfg"))
-
-/* This is the context for all the GnomeCal conduit methods. */
-typedef struct _GCalConduitContext GCalConduitContext;
-struct _GCalConduitContext {
- struct AppointmentAppInfo ai;
- GCalConduitCfg *cfg;
- CalClient *client;
- CORBA_Environment ev;
- CORBA_ORB orb;
- gboolean calendar_load_tried;
- gboolean calendar_load_success;
-
- char *calendar_file;
-};
-#define GET_GCALCONTEXT(c) ((GCalConduitContext*)gtk_object_get_data(GTK_OBJECT(c),"gcalconduit_context"))
-
-
-/* Given a GCalConduitCfg*, allocates the structure and
- loads the configuration data for the given pilot.
- this is defined in the header file because it is used by
- both calendar-conduit and calendar-conduit-control-applet,
- and we don't want to export any symbols we don't have to. */
-static void
-gcalconduit_load_configuration(GCalConduitCfg **c,
- guint32 pilotId)
-{
- gchar prefix[256];
- g_snprintf(prefix,255,"/gnome-pilot.d/calendard-conduit/Pilot_%u/",pilotId);
-
- *c = g_new0(GCalConduitCfg,1);
- g_assert(*c != NULL);
- gnome_config_push_prefix(prefix);
- (*c)->open_secret = gnome_config_get_bool("open_secret=FALSE");
- (*c)->sync_type = GnomePilotConduitSyncTypeCustom; /* set in capplets main */
- gnome_config_pop_prefix();
-
- (*c)->pilotId = pilotId;
-}
-
-
-#endif __CALENDAR_CONDUIT_H__
diff --git a/calendar/conduits/calendar/calendar.conduit.in b/calendar/conduits/calendar/calendar.conduit.in
deleted file mode 100644
index fb48e00584..0000000000
--- a/calendar/conduits/calendar/calendar.conduit.in
+++ /dev/null
@@ -1,8 +0,0 @@
-<gnome-pilot-conduit version="1.0">
-<conduit id="Calendar" type="shlib" location="@prefix@/lib/gnome-pilot/conduits/libcalendar_conduit.so"/>
-<name value="Calendar"/>
-<conduit-attribute name="description" value="Synchronizes with Evolution"/>
-<conduit-attribute name="default-synctype" value="synchronize"/>
-<conduit-attribute name="icon" value="@prefix@/share/pixmaps/gnome-calendar-conduit.png"/>
-<conduit-attribute name="settings" value="TRUE"/>
-</gnome-pilot-conduit>
diff --git a/calendar/conduits/todo/.cvsignore b/calendar/conduits/todo/.cvsignore
deleted file mode 100644
index 2820c43c3b..0000000000
--- a/calendar/conduits/todo/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-Makefile.in
-Makefile
-.deps
-.libs
-*.lo
-*.la
-todo-conduit-control-applet
-todo.conduit
diff --git a/calendar/conduits/todo/Makefile.am b/calendar/conduits/todo/Makefile.am
deleted file mode 100644
index 6801c6150d..0000000000
--- a/calendar/conduits/todo/Makefile.am
+++ /dev/null
@@ -1,81 +0,0 @@
-#
-#
-#
-
-INCLUDES = \
- -I$(top_srcdir)/calendar \
- $(GNOME_PILOT_CFLAGS)
-
-file_conduitsdir=$(libdir)/gnome-pilot/conduits
-
-bin_PROGRAMS = todo-conduit-control-applet
-
-todo_conduit_control_applet_SOURCES = todo-conduit-control-applet.c
-
-todo_conduit_control_applet_LDADD = \
- $(CAPPLET_LIBS) \
- $(GNOME_LIBDIR) \
- -lgpilotdcm \
- -lgpilotd \
- -lgpilotdconduit \
- $(GNOME_CAPPLET_LIBS) \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(GNOME_XML_LIB) \
- $(GNOMEUI_LIBS) \
- $(PISOCK_LIBDIR) $(PISOCK_LIBS) \
- $(INTLLIBS)
-
-
-# $(top_builddir)/libgpilotdCM/libgpilotdcm.la \
-# $(top_builddir)/gpilotd/libgpilotd.la \
-# $(top_builddir)/gpilotd/libgpilotdconduit.la \
-
-
-# todo_conduit
-todo_conduitsdir=$(libdir)/gnome-pilot/conduits
-todo_conduits_LTLIBRARIES = libtodo_conduit.la
-
-libtodo_conduit_la_SOURCES = \
- todo-conduit.c
-
-# todo-conduit.c: my_gnomecal_idl
-
-todo.conduit: todo.conduit.in Makefile
- sed -e 's^\@prefix\@^$(prefix)^g' < $(srcdir)/todo.conduit.in > todo.conduit.tmp \
- && mv todo.conduit.tmp todo.conduit
-
-#
-# conduit
-#
-
-libtodo_conduit_la_LDFLAGS = \
- -rpath $(libdir)
-
-libtodo_conduit_la_LIBADD = \
- $(top_builddir)/calendar/cal-client/libcal-client-static.la \
- $(top_builddir)/calendar/cal-util/libcal-util-static.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/libical/src/libical/libical-static.la \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(PISOCK_LIBDIR) $(PISOCK_LIBS) \
- $(GNOME_LIBDIR) \
- $(GNOME_LIBS)
-
-ccenterdir = $(datadir)/control-center
-ccenterPalmPilotdir = $(ccenterdir)/Peripherals
-ccenterConduitsdir = $(ccenterPalmPilotdir)/Conduits
-ccenterConduits_DATA = todo-conduit-control-applet.desktop
-
-panelConduitsdir = $(datadir)/gnome/apps/Settings/Peripherals/Conduits
-panelConduits_DATA = $(ccenterConduits_DATA)
-
-Conduitdir = $(datadir)/gnome-pilot/conduits/
-Conduit_DATA = todo.conduit
-
-EXTRA_DIST = \
- todo.conduit.in \
- $(ccenterConduits_DATA)
-
-install-data-local:
- $(mkinstalldirs) $(ccenterConduitsdir)
- $(mkinstalldirs) $(Conduitdir)
diff --git a/calendar/conduits/todo/todo-conduit-control-applet.c b/calendar/conduits/todo/todo-conduit-control-applet.c
deleted file mode 100644
index 188aadc16e..0000000000
--- a/calendar/conduits/todo/todo-conduit-control-applet.c
+++ /dev/null
@@ -1,386 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Control applet ("capplet") for the gnome-pilot todo conduit, */
-/* based on */
-/* gpilotd control applet ('capplet') for use with the GNOME control center */
-
-#include <pwd.h>
-#include <sys/types.h>
-#include <signal.h>
-#include <gnome.h>
-
-#include <config.h>
-#include <capplet-widget.h>
-
-#include <libgpilotdCM/gnome-pilot-conduit-management.h>
-#include <libgpilotdCM/gnome-pilot-conduit-config.h>
-#include <gpilotd/gnome-pilot-client.h>
-
-#include "todo-conduit.h"
-
-
-/* tell changes callbacks to ignore changes or not */
-static gboolean ignore_changes=FALSE;
-
-/* capplet widget */
-static GtkWidget *capplet=NULL;
-
-/* host/device/pilot configuration windows */
-GtkWidget *cfgOptionsWindow=NULL;
-GtkWidget *cfgStateWindow=NULL;
-GtkWidget *dialogWindow=NULL;
-
-gboolean activated,org_activation_state;
-GnomePilotConduitManagement *conduit;
-GnomePilotConduitConfig *conduit_config;
-GCalConduitCfg *origState = NULL;
-GCalConduitCfg *curState = NULL;
-
-static void doTrySettings(GtkWidget *widget, GCalConduitCfg *GCalConduitCfg);
-static void doRevertSettings(GtkWidget *widget, GCalConduitCfg *GCalConduitCfg);
-static void doSaveSettings(GtkWidget *widget, GCalConduitCfg *GCalConduitCfg);
-
-//static void readStateCfg (GtkWidget *w, GCalConduitCfg *c);
-static void setStateCfg (GtkWidget *w, GCalConduitCfg *c);
-
-gint pilotId;
-CORBA_Environment ev;
-static GnomePilotClient *gpc;
-
-
-
-/* This array must be in the same order as enumerations
- in GnomePilotConduitSyncType as they are used as index.
- Custom type implies Disabled state.
-*/
-static gchar* sync_options[] ={ N_("Disabled"),
- N_("Synchronize"),
- N_("Copy From Pilot"),
- N_("Copy To Pilot"),
- N_("Merge From Pilot"),
- N_("Merge To Pilot")};
-#define SYNC_OPTIONS_COUNT 6
-
-
-
-
-/* Saves the configuration data. */
-static void
-gcalconduit_save_configuration(GCalConduitCfg *c)
-{
- gchar prefix[256];
-
- g_snprintf(prefix,255,"/gnome-pilot.d/todo-conduit/Pilot_%u/",c->pilotId);
-
- gnome_config_push_prefix(prefix);
- gnome_config_set_bool ("open_secret", c->open_secret);
- gnome_config_pop_prefix();
-
- gnome_config_sync();
- gnome_config_drop_all();
-}
-
-/* Creates a duplicate of the configuration data */
-static GCalConduitCfg*
-gcalconduit_dupe_configuration(GCalConduitCfg *c) {
- GCalConduitCfg *retval;
- g_return_val_if_fail(c!=NULL,NULL);
- retval = g_new0(GCalConduitCfg,1);
- retval->sync_type = c->sync_type;
- retval->open_secret = c->open_secret;
- retval->pilotId = c->pilotId;
- return retval;
-}
-
-
-static void
-doTrySettings(GtkWidget *widget, GCalConduitCfg *c)
-{
- /*
- readStateCfg (cfgStateWindow, curState);
- if (activated)
- gnome_pilot_conduit_config_enable (conduit_config, GnomePilotConduitSyncTypeCustom);
- else
- gnome_pilot_conduit_config_disable (conduit_config);
- */
-
- if (c->sync_type!=GnomePilotConduitSyncTypeCustom)
- gnome_pilot_conduit_config_enable_with_first_sync (conduit_config,
- c->sync_type,
- c->sync_type,
- TRUE);
- else
- gnome_pilot_conduit_config_disable (conduit_config);
-
- gcalconduit_save_configuration (c);
-}
-
-
-static void
-doSaveSettings(GtkWidget *widget, GCalConduitCfg *GCalConduitCfg)
-{
- doTrySettings(widget, GCalConduitCfg);
- gcalconduit_save_configuration(GCalConduitCfg);
-}
-
-
-static void
-doCancelSettings(GtkWidget *widget, GCalConduitCfg *c)
-{
- doSaveSettings (widget, c);
-}
-
-
-static void
-doRevertSettings(GtkWidget *widget, GCalConduitCfg *GCalConduitCfg)
-{
- activated = org_activation_state;
- setStateCfg (cfgStateWindow, curState);
-}
-
-static void
-about_cb (GtkWidget *widget, gpointer data)
-{
- GtkWidget *about;
- const gchar *authors[] = {_("Eskil Heyn Olsen <deity@eskil.dk>"),NULL};
-
- about = gnome_about_new (_("Gpilotd todo conduit"), VERSION,
- _("(C) 1998 the Free Software Foundation"),
- authors,
- _("Configuration utility for the todo conduit.\n"),
- _("gnome-unknown.xpm"));
- gtk_widget_show (about);
-
- return;
-}
-
-
-/* called by the sync_type GtkOptionMenu */
-static void
-sync_action_selection(GtkMenuShell *widget, gpointer unused)
-{
- if (!ignore_changes) {
- capplet_widget_state_changed(CAPPLET_WIDGET (capplet), TRUE);
- }
-}
-
-
-/* called by the sync_type GtkOptionMenu */
-static void
-activate_sync_type(GtkMenuItem *widget, gpointer data)
-{
- curState->sync_type = GPOINTER_TO_INT(data);
- if(!ignore_changes)
- capplet_widget_state_changed(CAPPLET_WIDGET(capplet), TRUE);
-}
-
-
-static GtkWidget
-*createStateCfgWindow(void)
-{
- GtkWidget *vbox, *table;
- GtkWidget *label;
- GtkWidget *optionMenu,*menuItem;
- GtkMenu *menu;
- gint i;
-
- vbox = gtk_vbox_new(FALSE, GNOME_PAD);
-
- table = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, GNOME_PAD);
-
- label = gtk_label_new(_("Synchronize Action"));
- gtk_box_pack_start(GTK_BOX(table), label, FALSE, FALSE, GNOME_PAD);
-
- optionMenu=gtk_option_menu_new();
- gtk_object_set_data(GTK_OBJECT(vbox), "conduit_state", optionMenu);
- menu = GTK_MENU(gtk_menu_new());
-
- for (i=0; i<SYNC_OPTIONS_COUNT;i++) {
- sync_options[i]=_(sync_options[i]);
- menuItem = gtk_menu_item_new_with_label(sync_options[i]);
- gtk_widget_show(menuItem);
- gtk_signal_connect(GTK_OBJECT(menuItem),"activate",
- GTK_SIGNAL_FUNC(activate_sync_type),
- GINT_TO_POINTER(i));
- gtk_menu_append(menu,menuItem);
- }
-
- gtk_option_menu_set_menu(GTK_OPTION_MENU(optionMenu),GTK_WIDGET(menu));
- gtk_signal_connect(GTK_OBJECT(menu), "selection-done",
- GTK_SIGNAL_FUNC(sync_action_selection),
- NULL);
-
- gtk_box_pack_start(GTK_BOX(table), optionMenu, FALSE, FALSE, 0);
-
- return vbox;
-}
-
-
-static void
-setStateCfg (GtkWidget *w, GCalConduitCfg *c)
-{
- GtkOptionMenu *optionMenu;
- GtkMenu *menu;
-
- optionMenu = gtk_object_get_data (GTK_OBJECT(w), "conduit_state");
- g_assert (optionMenu != NULL);
- menu = GTK_MENU (gtk_option_menu_get_menu (optionMenu));
-
- ignore_changes = TRUE;
- /* Here were are relying on the items in menu being the same
- order as in GnomePilotConduitSyncType. */
- gtk_option_menu_set_history (optionMenu, (int) c->sync_type);
- ignore_changes = FALSE;
-}
-
-
-#if 0
-static void
-readStateCfg (GtkWidget *w, GCalConduitCfg *c)
-{
- /*
- GtkWidget *button;
- button = gtk_object_get_data(GTK_OBJECT(cfg), "conduit_on_off");
- g_assert(button!=NULL);
- activated = GTK_TOGGLE_BUTTON(button)->active;
- */
-}
-#endif /* 0 */
-
-
-static void
-pilot_capplet_setup(void)
-{
- GtkWidget *frame, *table;
-
- capplet = capplet_widget_new();
-
- table = gtk_table_new(1, 2, FALSE);
- gtk_container_border_width(GTK_CONTAINER(table), GNOME_PAD);
- gtk_container_add(GTK_CONTAINER(capplet), table);
-
- frame = gtk_frame_new(_("Conduit state"));
- gtk_container_border_width(GTK_CONTAINER(frame), GNOME_PAD_SMALL);
- gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 1, 0, 1);
- cfgStateWindow = createStateCfgWindow();
- gtk_container_add(GTK_CONTAINER(frame), cfgStateWindow);
-
- gtk_signal_connect(GTK_OBJECT(capplet), "try",
- GTK_SIGNAL_FUNC(doTrySettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "revert",
- GTK_SIGNAL_FUNC(doRevertSettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "ok",
- GTK_SIGNAL_FUNC(doSaveSettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "cancel",
- GTK_SIGNAL_FUNC(doCancelSettings), curState);
- gtk_signal_connect(GTK_OBJECT(capplet), "help",
- GTK_SIGNAL_FUNC(about_cb), NULL);
-
-
- setStateCfg (cfgStateWindow, curState);
-
- gtk_widget_show_all (capplet);
-}
-
-
-static void
-run_error_dialog(gchar *mesg,...)
-{
- char tmp[80];
- va_list ap;
-
- va_start(ap,mesg);
- vsnprintf(tmp,79,mesg,ap);
- dialogWindow = gnome_message_box_new(mesg,GNOME_MESSAGE_BOX_ERROR,GNOME_STOCK_BUTTON_OK,NULL);
- gnome_dialog_run_and_close(GNOME_DIALOG(dialogWindow));
- va_end(ap);
-}
-
-
-static gint
-get_pilot_id_from_gpilotd()
-{
- GList *pilots=NULL;
- gint pilot;
- int i,err;
-
- i=0;
- /* we don't worry about leaking here, so pilots isn't freed */
- switch(err = gnome_pilot_client_get_pilots(gpc,&pilots)) {
- case GPILOTD_OK: {
- if(pilots) {
- for(i=0;i<g_list_length(pilots);i++) {
- g_message("pilot %d = \"%s\"",i,(gchar*)g_list_nth(pilots,i)->data);
- }
- if(i==0) {
- run_error_dialog(_("No pilot configured, please choose the\n'Pilot Link Properties' capplet first."));
- return -1;
- } else {
- gnome_pilot_client_get_pilot_id_by_name(gpc,
- pilots->data, /* this is the first pilot */
- &pilot);
- if(i>1) {
- g_message("too many pilots...");
- /* need a choose here */
- }
- return pilot;
- }
- } else {
- run_error_dialog(_("No pilot configured, please choose the\n'Pilot Link Properties' capplet first."));
- return -1;
- }
- break;
- }
- case GPILOTD_ERR_NOT_CONNECTED:
- run_error_dialog(_("Not connected to the gnome-pilot daemon"));
- return -1;
- break;
- default:
- g_warning("gnome_pilot_client_get_pilot_ids(...) = %d",err);
- run_error_dialog(_("An error occured when trying to fetch\npilot list from the gnome-pilot daemon"));
- return -1;
- break;
- }
-}
-
-
-int
-main (int argc, char *argv[])
-{
- g_log_set_always_fatal (G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL |
- G_LOG_LEVEL_WARNING);
-
- /* we're a capplet */
- gnome_capplet_init ("todo conduit control applet", NULL, argc, argv,
- NULL, 0, NULL);
-
- gpc = gnome_pilot_client_new();
- gnome_pilot_client_connect_to_daemon(gpc);
- pilotId = get_pilot_id_from_gpilotd();
- if(!pilotId) return -1;
-
- /* put all code to set things up in here */
- gcalconduit_load_configuration (&origState, pilotId);
-
- conduit = gnome_pilot_conduit_management_new ("todo_conduit", GNOME_PILOT_CONDUIT_MGMT_ID);
- if (conduit == NULL) return -1;
- conduit_config = gnome_pilot_conduit_config_new (conduit, pilotId);
- org_activation_state = gnome_pilot_conduit_config_is_enabled (conduit_config,
- &origState->sync_type);
- activated = org_activation_state;
-
- //gpilotd_conduit_mgmt_get_sync_type (conduit, pilotId, &origState->sync_type);
-
- curState = gcalconduit_dupe_configuration(origState);
-
- pilot_capplet_setup ();
-
-
- /* done setting up, now run main loop */
- capplet_gtk_main();
-
- gnome_pilot_conduit_management_destroy(conduit);
-
- return 0;
-}
diff --git a/calendar/conduits/todo/todo-conduit-control-applet.desktop b/calendar/conduits/todo/todo-conduit-control-applet.desktop
deleted file mode 100644
index 28bbeebde3..0000000000
--- a/calendar/conduits/todo/todo-conduit-control-applet.desktop
+++ /dev/null
@@ -1,12 +0,0 @@
-[Desktop Entry]
-Name=Todo conduit
-Name[da]=Udstående
-Name[no]=Oppgaver
-Name[tr]=Yapýlacaklar parçasý
-Comment=Configure the todo conduit
-Comment[da]=Konfigurér Udstående
-Comment[no]=Konfigurér oppgavelisten
-Comment[tr]=Yapýlacaklar parçasý ayarlarý
-Exec=todo-conduit-control-applet --cap-id=1
-Terminal=0
-Type=Application
diff --git a/calendar/conduits/todo/todo-conduit.c b/calendar/conduits/todo/todo-conduit.c
deleted file mode 100644
index 2a3c643a3d..0000000000
--- a/calendar/conduits/todo/todo-conduit.c
+++ /dev/null
@@ -1,1355 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <config.h>
-#include <sys/stat.h>
-#include <utime.h>
-#include <unistd.h>
-#include <pwd.h>
-#include <signal.h>
-#include <errno.h>
-
-#include <cal-client/cal-client.h>
-// #include <cal-util/calobj.h>
-#include <cal-util/timeutil.h>
-#include <pi-source.h>
-#include <pi-socket.h>
-#include <pi-file.h>
-#include <pi-dlp.h>
-#include <libgnorba/gnorba.h>
-#include <libgnorba/gnome-factory.h>
-#include <pi-version.h>
-#include <gpilotd/gnome-pilot-conduit.h>
-#include <gpilotd/gnome-pilot-conduit-standard-abs.h>
-#include <todo-conduit.h>
-#include <libical/src/libical/icaltypes.h>
-
-#include <bonobo.h>
-
-//#include "GnomeCal.h"
-
-GnomePilotConduit * conduit_get_gpilot_conduit (guint32);
-void conduit_destroy_gpilot_conduit (GnomePilotConduit*);
-void local_record_from_icalobject (GCalLocalRecord *local, CalComponent *obj);
-
-#define CONDUIT_VERSION "0.8.11"
-#ifdef G_LOG_DOMAIN
-#undef G_LOG_DOMAIN
-#endif
-#define G_LOG_DOMAIN "todoconduit"
-
-#define DEBUG_CALCONDUIT 1
-/* #undef DEBUG_CALCONDUIT */
-
-#ifdef DEBUG_CALCONDUIT
-#define show_exception(e) g_warning ("Exception: %s\n", CORBA_exception_id (e))
-#define LOG(e...) g_log(G_LOG_DOMAIN,G_LOG_LEVEL_MESSAGE, e)
-#else
-#define show_exception(e)
-#define LOG(e...)
-#endif
-
-#define WARN(e...) g_log(G_LOG_DOMAIN,G_LOG_LEVEL_WARNING, e)
-#define INFO(e...) g_log(G_LOG_DOMAIN,G_LOG_LEVEL_MESSAGE, e)
-
-#define catch_ret_val(_env,ret) \
- if (_env._major != CORBA_NO_EXCEPTION) { \
- g_log(G_LOG_DOMAIN,G_LOG_LEVEL_MESSAGE,"%s:%d: Caught exception",__FILE__,__LINE__); \
- g_warning ("Exception: %s\n", CORBA_exception_id (&(_env))); \
- CORBA_exception_free(&(_env)); \
- return ret; \
- }
-
-
-
-/* debug spew DELETE ME */
-static char *print_ical (CalComponent *obj
- /*iCalObject *obj*/)
-{
- static char buff[ 4096 ];
-
- int indefinite;
- CalComponentDateTime dtend;
- int priority;
- struct icaltimetype *complete;
- CalComponentText summary;
- GSList *comments;
- CalComponentText *first_comment = NULL;
-
- if (obj == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- indefinite = 0; /* FIX ME how do i get this */
- cal_component_get_dtend (obj, &dtend);
- priority = 1; /* FIX ME how do i get this */
- cal_component_get_completed (obj, &complete);
-
- cal_component_get_summary (obj, &summary);
- cal_component_get_comment_list (obj, &comments);
- if (comments)
- first_comment = (CalComponentText *) comments->data;
-
- sprintf (buff, "[%d %d-%d-%d %d %d-%d-%d '%s' '%s']",
- indefinite,
- dtend.value->year, dtend.value->month, dtend.value->day,
- priority,
- complete->year, complete->month, complete->day,
- summary.value, /* description */
- first_comment ? first_comment->value : "" /* note */
- );
- return buff;
-}
-
-
-/* debug spew DELETE ME */
-static char *print_local (GCalLocalRecord *local)
-{
- static char buff[ 4096 ];
-
- if (local == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- if (local->todo && local->todo->description) {
- sprintf (buff, "[%d %ld %d %d '%s' '%s']",
- local->todo->indefinite,
- mktime (& local->todo->due),
- local->todo->priority,
- local->todo->complete,
- local->todo->description,
- local->todo->note);
- return buff;
- }
-
- return print_ical (local->ical);
-}
-
-
-/* debug spew DELETE ME */
-static char *print_remote (PilotRecord *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);
-
- sprintf (buff, "[%d %ld %d %d '%s' '%s']",
- todo.indefinite,
- mktime (& todo.due),
- todo.priority,
- todo.complete,
- todo.description,
- todo.note);
-
- return buff;
-}
-
-
-
-
-/* Destroys any data allocated by gcalconduit_load_configuration
- and deallocates the given configuration. */
-static void
-gcalconduit_destroy_configuration(GCalConduitCfg **c)
-{
- g_return_if_fail(c!=NULL);
- g_return_if_fail(*c!=NULL);
- g_free(*c);
- *c = NULL;
-}
-
-
-/* Given a GCalConduitContxt*, allocates the structure */
-static void
-gcalconduit_new_context(GCalConduitContext **ctxt,
- GCalConduitCfg *c)
-{
- *ctxt = g_new0(GCalConduitContext,1);
- g_assert(ctxt!=NULL);
- (*ctxt)->cfg = c;
- CORBA_exception_init (&((*ctxt)->ev));
-}
-
-
-/* Destroys any data allocated by gcalconduit_new_context
- and deallocates its data. */
-static void
-gcalconduit_destroy_context(GCalConduitContext **ctxt)
-{
- g_return_if_fail(ctxt!=NULL);
- g_return_if_fail(*ctxt!=NULL);
-/*
- if ((*ctxt)->cfg!=NULL)
- gcalconduit_destroy_configuration(&((*ctxt)->cfg));
-*/
- g_free(*ctxt);
- *ctxt = NULL;
-}
-
-
-static void
-gnome_calendar_load_cb (GtkWidget *cal_client,
- CalClientLoadStatus status,
- GCalConduitContext *ctxt)
-{
- CalClient *client = CAL_CLIENT (cal_client);
-
- LOG (" todo-conduit entering gnome_calendar_load_cb, tried=%d\n",
- ctxt->calendar_load_tried);
-
- if (status == CAL_CLIENT_LOAD_SUCCESS) {
- ctxt->calendar_load_success = TRUE;
- LOG (" success\n");
- gtk_main_quit (); /* end the sub event loop */
- } else {
- if (ctxt->calendar_load_tried) {
- LOG (" load and create of calendar failed\n");
- gtk_main_quit (); /* end the sub event loop */
- return;
- }
-
- cal_client_create_calendar (client, ctxt->calendar_file);
- ctxt->calendar_load_tried = 1;
- }
-}
-
-
-
-
-
-static int
-start_calendar_server (GnomePilotConduitStandardAbs *conduit,
- GCalConduitContext *ctxt)
-{
-
- g_return_val_if_fail(conduit!=NULL,-2);
- g_return_val_if_fail(ctxt!=NULL,-2);
-
- ctxt->client = cal_client_new ();
-
- /* FIX ME */
- ctxt->calendar_file = g_concat_dir_and_file (g_get_home_dir (),
- "evolution/local/Calendar/calendar.vcf");
-
- gtk_signal_connect (GTK_OBJECT (ctxt->client), "cal_loaded",
- gnome_calendar_load_cb, ctxt);
-
- LOG (" calling cal_client_load_calendar\n");
- cal_client_load_calendar (ctxt->client, ctxt->calendar_file);
-
- /* run a sub event loop to turn cal-client's async load
- notification into a synchronous call */
- gtk_main ();
-
- if (ctxt->calendar_load_success)
- return 0;
-
- return -1;
-}
-
-
-#if 0
-/* Just a stub to link with */
-void calendar_notify (time_t time, CalendarAlarm *which, void *data);
-void calendar_notify (time_t time, CalendarAlarm *which, void *data) { }
-#endif /* 0 */
-
-
-static GSList *
-get_calendar_objects(GnomePilotConduitStandardAbs *conduit,
- gboolean *status,
- GCalConduitContext *ctxt)
-{
- GList *uids;
- GSList *result = NULL;
-
- g_return_val_if_fail (conduit != NULL, NULL);
- g_return_val_if_fail (ctxt != NULL, NULL);
-
- uids = cal_client_get_uids (ctxt->client, CALOBJ_TYPE_TODO);
-
- // LOG ("got %d todo entries from cal server\n", g_list_length (uids));
-
- if (status != NULL)
- (*status) = TRUE;
-
- if (! uids)
- INFO ("No entries found");
- else {
- GList *c;
- for (c=uids; c; c=c->next)
- result = g_slist_prepend (result, (gchar *) c->data);
- /* FIX ME free uids */
- }
-
- return result;
-}
-
-
-static void
-local_record_from_ical_uid (GCalLocalRecord *local,
- char *uid,
- GCalConduitContext *ctxt)
-{
- //iCalObject *obj;
- CalComponent *obj;
- CalClientGetStatus status;
-
- g_assert(local!=NULL);
-
- status = cal_client_get_object (ctxt->client, uid, &obj);
-
- if (status == CAL_CLIENT_GET_SUCCESS)
- local_record_from_icalobject (local, obj);
- else
- INFO ("Object did not exist");
-}
-
-
-
-static char *gnome_pilot_status_to_string (gint status)
-{
- switch(status) {
- case GnomePilotRecordPending: return "GnomePilotRecordPending";
- case GnomePilotRecordNothing: return "GnomePilotRecordNothing";
- case GnomePilotRecordDeleted: return "GnomePilotRecordDeleted";
- case GnomePilotRecordNew: return "GnomePilotRecordNew";
- case GnomePilotRecordModified: return "GnomePilotRecordModified";
- }
-
- return "Unknown";
-}
-
-
-
-/*
- * converts a iCalObject to a GCalLocalRecord
- */
-
-void
-local_record_from_icalobject(GCalLocalRecord *local,
- CalComponent *obj)
-{
- //iCalPilotState pilot_status;
- unsigned long int pilot_status;
-
- g_return_if_fail(local!=NULL);
- g_return_if_fail(obj!=NULL);
-
- local->ical = obj;
- local->todo = NULL; /* ??? */
- cal_component_get_pilot_id (obj, &local->local.ID);
- cal_component_get_pilot_status (obj, &pilot_status);
-
- switch (pilot_status) {
- case ICAL_PILOT_SYNC_NONE:
- local->local.attr = GnomePilotRecordNothing;
- break;
- case ICAL_PILOT_SYNC_MOD:
- local->local.attr = GnomePilotRecordModified;
- break;
- case ICAL_PILOT_SYNC_DEL:
- local->local.attr = GnomePilotRecordDeleted;
- break;
- default:
- g_warning ("unhandled pilot status: %ld\n", pilot_status);
- }
-
- /* Records without a pilot_id are new */
- if(local->local.ID == 0)
- local->local.attr = GnomePilotRecordNew;
-
- /*
- local->local.secret = 0;
- if (obj->class!=NULL)
- if (strcmp(obj->class,"PRIVATE")==0)
- local->local.secret = 1;
- */
-
- local->local.archived = 0;
-}
-
-
-/*
- * Given a PilotRecord, find the matching record in
- * the calendar repository. If no match, return NULL
- */
-static GCalLocalRecord *
-find_record_in_repository(GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- char *uid = NULL;
- GCalLocalRecord *loc;
- CalClientGetStatus status;
- //iCalObject *obj;
- CalComponent *obj;
-
- g_return_val_if_fail(conduit!=NULL,NULL);
- g_return_val_if_fail(remote!=NULL,NULL);
-
- LOG ("find_record_in_repository: remote=%s... ",
- print_remote (remote));
-
- // LOG ("requesting %ld", remote->ID);
-
- status = cal_client_get_uid_by_pilot_id (ctxt->client, remote->ID, &uid);
-
- if (status == CAL_CLIENT_GET_SUCCESS) {
- status = cal_client_get_object (ctxt->client, uid, &obj);
- if (status == CAL_CLIENT_GET_SUCCESS) {
- LOG ("found %s\n", print_ical (obj));
- loc = g_new0(GCalLocalRecord,1);
- /* memory allocated in new_from_string is freed in free_match */
- local_record_from_icalobject (loc, obj);
- return loc;
- }
- }
-
- // INFO ("Object did not exist");
- LOG ("not found\n");
- return NULL;
-}
-
-
-/*
- * updates an given iCalObject in the repository
- */
-static void
-update_calendar_entry_in_repository(GnomePilotConduitStandardAbs *conduit,
- CalComponent *obj,
- GCalConduitContext *ctxt)
-{
- gboolean success;
-
- g_return_if_fail (conduit!=NULL);
- g_return_if_fail (obj!=NULL);
-
- LOG (" update_calendar_entry_in_repository "
- "saving %s to desktop\n",
- print_ical (obj));
-
- success = cal_client_update_object (ctxt->client, obj);
-
- if (! success) {
- WARN (_("Error while communicating with calendar server"));
- }
-}
-
-
-static CalComponent *
-ical_from_remote_record (GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- CalComponent *in_obj)
-{
- CalComponent *obj;
- struct ToDo todo;
- struct icaltimetype now = icaltimetype_from_timet (time (NULL), FALSE);
-
- CalComponentText summary = {NULL, NULL};
- CalComponentText comment = {NULL, NULL};
- GSList *comment_list;
-
- g_return_val_if_fail(remote!=NULL,NULL);
- memset (&todo, 0, sizeof (struct ToDo));
- unpack_ToDo (&todo, remote->record, remote->length);
-
- LOG (" ical_from_remote_record: "
- "merging remote %s into local %s\n",
- print_remote (remote), print_ical (in_obj));
-
- if (in_obj == NULL) {
- obj = cal_component_new ();
- } else {
- obj = in_obj;
- }
-
- summary.value = todo.description;
- cal_component_set_summary (obj, &summary);
-
- comment.value = todo.note;
- comment_list = g_slist_append (NULL, &comment);
- cal_component_set_comment_list (obj, comment_list);
- g_slist_free (comment_list);
-
- cal_component_set_new_vtype (obj, CAL_COMPONENT_TODO);
- // obj->new = TRUE;
- // obj->created = now;
- cal_component_set_created (obj, &now);
- // obj->last_mod = now;
- cal_component_set_last_modified (obj, &now);
- /* obj->priority = 0; */
- // obj->transp = 0;
- cal_component_set_transparency (obj,
- /*CalComponentTransparency transp*/
- CAL_COMPONENT_TRANSP_NONE);
- /* obj->related = NULL; */
-
- // cal_component_set_pilot_status (obj, ICAL_PILOT_SYNC_NONE);
-
- /*
- * Begin and end
- */
-
- // obj->dtend = mktime (& todo.due);
- {
- /* do i need to malloc these? FIX ME */
- struct icaltimetype dtend_ictt;
- CalComponentDateTime dtend;
-
- dtend_ictt = icaltimetype_from_timet (mktime (& todo.due), FALSE);
- dtend.value = &dtend_ictt;
- dtend.tzid = NULL;
- cal_component_set_dtend (obj, &dtend);
- }
-
-
- /*
- if (todo.complete) {
- obj->completed = now-5;
- obj->percent = 100;
- }
- */
- {
- cal_component_set_completed (obj, &now);
- }
-
- /*
- LOG ("[%s] from pilot, complete=%d/%ld\n",
- todo.description,
- todo.complete,
- obj->completed);
- */
-
-
- //obj->priority = todo.priority; FIX ME
-
- /* g_free (obj->class); */
-
- /*
- if (remote->attr & dlpRecAttrSecret)
- obj->class = g_strdup ("PRIVATE");
- else
- obj->class = g_strdup ("PUBLIC");
- */
-
- if (remote->attr & dlpRecAttrSecret)
- cal_component_set_classification (obj, CAL_COMPONENT_CLASS_PRIVATE);
- else
- cal_component_set_classification (obj, CAL_COMPONENT_CLASS_PUBLIC);
-
- free_ToDo(&todo);
-
- return obj;
-}
-
-
-/* Code blatantly stolen from
- * calendar-pilot-sync.c:
- *
- * (C) 1999 International GNOME Support
- *
- * Author:
- * Miguel de Icaza (miguel@gnome-support.com)
- *
- * store a copy of a pilot record in the desktop database
- *
- */
-static gint
-update_record (GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- //iCalObject *obj;
- CalComponent *obj;
- struct ToDo todo;
- CalClientGetStatus status;
- char *uid;
-
- CalComponentText summary = {NULL, NULL};
- CalComponentText comment = {NULL, NULL};
- GSList *comment_list;
-
- g_return_val_if_fail(remote!=NULL,-1);
-
- memset (&todo, 0, sizeof (struct ToDo));
- unpack_ToDo (&todo, remote->record, remote->length);
-
- LOG (" cal_client_get_uid_by_pilot_id... ");
-
- status = cal_client_get_uid_by_pilot_id (ctxt->client,
- remote->ID, &uid);
- if (status == CAL_CLIENT_GET_SUCCESS) {
- LOG (" succeeded with '%s'\n", uid);
- LOG (" cal_client_get_object... ");
- status = cal_client_get_object (ctxt->client, uid, &obj);
- }
-
- if (status != CAL_CLIENT_GET_SUCCESS) {
- struct icaltimetype now = icaltimetype_from_timet (time (NULL), FALSE);
-
- LOG ("failed, making a new one.\n");
-
- obj = cal_component_new ();
-
- summary.value = todo.description;
- cal_component_set_summary (obj, &summary);
-
- comment.value = todo.note;
- comment_list = g_slist_append (NULL, &comment);
- cal_component_set_comment_list (obj, comment_list);
- g_slist_free (comment_list);
-
- // obj->type = ICAL_TODO;
- cal_component_set_new_vtype (obj, CAL_COMPONENT_TODO);
- // obj->new = TRUE;
- // obj->created = now;
- cal_component_set_created (obj, &now);
- // obj->last_mod = now;
- cal_component_set_last_modified (obj, &now);
- // obj->priority = 0;
- // obj->transp = 0;
- cal_component_set_transparency (obj,
- /*CalComponentTransparency transp*/
- CAL_COMPONENT_TRANSP_NONE);
- // obj->related = NULL;
- //obj->pilot_id = remote->ID;
- //obj->pilot_status = ICAL_PILOT_SYNC_NONE;
- cal_component_set_pilot_id (obj, remote->ID);
- cal_component_set_pilot_status (obj, ICAL_PILOT_SYNC_NONE);
- } else {
- CalComponent *new_obj;
-
- LOG ("succeeded %s\n", print_ical (obj));
-
- new_obj = ical_from_remote_record (conduit, remote, obj);
- obj = new_obj;
- }
-
- /* update record on server */
- {
- const char *uid;
- unsigned long pilot_id;
-
- cal_component_get_uid (obj, &uid);
- cal_component_get_pilot_id (obj, &pilot_id);
-
- update_calendar_entry_in_repository (conduit, obj, ctxt);
- cal_client_update_pilot_id (ctxt->client, (char *) uid, pilot_id,
- ICAL_PILOT_SYNC_NONE);
- }
-
- /*
- * Shutdown
- */
- //ical_object_unref (obj);
- free_ToDo(&todo);
-
- return 0;
-}
-
-static void
-check_for_slow_setting (GnomePilotConduit *c, GCalConduitContext *ctxt)
-{
- GList *uids;
- unsigned long int entry_number;
-
- uids = cal_client_get_uids (ctxt->client, CALOBJ_TYPE_TODO);
-
- entry_number = g_list_length (uids);
-
- /* If the local base is empty, do a slow sync */
- if (entry_number == 0) {
- GnomePilotConduitStandard *conduit;
- LOG (" doing slow sync\n");
- conduit = GNOME_PILOT_CONDUIT_STANDARD (c);
- gnome_pilot_conduit_standard_set_slow (conduit);
- } else {
- LOG (" doing fast sync\n");
- }
-}
-
-static gint
-pre_sync (GnomePilotConduit *c,
- GnomePilotDBInfo *dbi,
- GCalConduitContext *ctxt)
-{
- int l;
- unsigned char *buf;
- GnomePilotConduitStandardAbs *conduit;
- /* gint num_records; */
- //GList *uids;
-
- /*
- g_log_set_always_fatal (G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL |
- G_LOG_LEVEL_WARNING);
- */
-
-
- conduit = GNOME_PILOT_CONDUIT_STANDARD_ABS(c);
-
- LOG ("---------------------------------------------------------\n");
- LOG ("pre_sync: ToDo Conduit v.%s", CONDUIT_VERSION);
- g_message ("ToDo Conduit v.%s", CONDUIT_VERSION);
-
- ctxt->client = NULL;
-
- if (start_calendar_server (GNOME_PILOT_CONDUIT_STANDARD_ABS(c), ctxt) != 0) {
- WARN(_("Could not start gnomecal server"));
- gnome_pilot_conduit_error(GNOME_PILOT_CONDUIT(c),
- _("Could not start gnomecal server"));
- return -1;
- }
-
-
-#if 0
- /* Set the counters for the progress bar crap */
- num_records = GNOME_Calendar_Repository_get_number_of_objects (ctxt->calendar, GNOME_Calendar_Repository_ANY, &(ctxt->ev));
-
- catch_ret_val (ctxt->ev, -1);
- gnome_pilot_conduit_standard_abs_set_num_local_records(GNOME_PILOT_CONDUIT_STANDARD_ABS(c), num_records);
- num_records = GNOME_Calendar_Repository_get_number_of_objects (ctxt->calendar, GNOME_Calendar_Repository_MODIFIED, &(ctxt->ev));
- catch_ret_val (ctxt->ev, -1);
- gnome_pilot_conduit_standard_abs_set_num_updated_local_records(GNOME_PILOT_CONDUIT_STANDARD_ABS(c), num_records);
- num_records = GNOME_Calendar_Repository_get_number_of_objects (ctxt->calendar, GNOME_Calendar_Repository_NEW, &(ctxt->ev));
- catch_ret_val (ctxt->ev, -1);
- gnome_pilot_conduit_standard_abs_set_num_new_local_records(GNOME_PILOT_CONDUIT_STANDARD_ABS(c), num_records);
- num_records = GNOME_Calendar_Repository_get_number_of_objects (ctxt->calendar, GNOME_Calendar_Repository_DELETED, &(ctxt->ev));
- catch_ret_val (ctxt->ev, -1);
- gnome_pilot_conduit_standard_abs_set_num_deleted_local_records(GNOME_PILOT_CONDUIT_STANDARD_ABS(c), num_records);
-#endif /* 0 */
-
- gtk_object_set_data(GTK_OBJECT(c),"dbinfo",dbi);
-
- /* load_records(c); */
-
- buf = (unsigned char*)g_malloc(0xffff);
- if((l=dlp_ReadAppBlock(dbi->pilot_socket,dbi->db_handle,0,(unsigned char *)buf,0xffff)) < 0) {
- WARN(_("Could not read pilot's ToDo application block"));
- WARN("dlp_ReadAppBlock(...) = %d",l);
- gnome_pilot_conduit_error(GNOME_PILOT_CONDUIT(c),
- _("Could not read pilot's ToDo application block"));
- return -1;
- }
- unpack_ToDoAppInfo(&(ctxt->ai),buf,l);
- g_free(buf);
-
- check_for_slow_setting(c,ctxt);
-
- return 0;
-}
-
-/**
- * Find (if possible) the local record which matches
- * the given PilotRecord.
- * if successfull, return non-zero and set *local to
- * a non-null value (the located local record),
- * otherwise return 0 and set *local = NULL;
- */
-
-static gint
-match_record (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord **local,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- LOG ("match_record: 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 = find_record_in_repository(conduit,remote,ctxt);
-
- if (*local == NULL)
- LOG (" match_record: not found.\n");
- else
- LOG (" match_record: found, %s\n", print_local (*local));
-
- if (*local==NULL) return -1;
- return 0;
-}
-
-/**
- * Free the data allocated by a previous match_record call.
- * If successfull, return non-zero and ser *local=NULL, otherwise
- * return 0.
- */
-static gint
-free_match (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord **local,
- GCalConduitContext *ctxt)
-{
- LOG ("free_match: %s\n", print_local (*local));
-
- g_return_val_if_fail (local!=NULL, -1);
- g_return_val_if_fail (*local!=NULL, -1);
-
- // ical_object_unref (GCAL_LOCALRECORD(*local)->ical);
- g_free (*local);
-
- *local = NULL;
- return 0;
-}
-
-/*
- Move to archive and set status to Nothing
- */
-static gint
-archive_local (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- GCalConduitContext *ctxt)
-{
- LOG ("archive_local: doing nothing with %s\n", print_local (local));
-
- g_return_val_if_fail(local!=NULL,-1);
-
- return -1;
-}
-
-/*
- Store in archive and set status to Nothing
- */
-static gint
-archive_remote (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- LOG ("archive_remote: doing nothing with %s\n",
- print_local (local));
-
- //g_return_val_if_fail(remote!=NULL,-1);
- //g_return_val_if_fail(local!=NULL,-1);
-
- return -1;
-}
-
-/*
- Store and set status to Nothing
- */
-static gint
-store_remote (GnomePilotConduitStandardAbs *conduit,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- LOG ("store_remote: copying pilot record %s to desktop\n",
- print_remote (remote));
-
- g_return_val_if_fail(remote!=NULL,-1);
- remote->attr = GnomePilotRecordNothing;
-
- return update_record(conduit,remote,ctxt);
-}
-
-static gint
-clear_status_archive_local (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- GCalConduitContext *ctxt)
-{
- LOG ("clear_status_archive_local: doing nothing\n");
-
- g_return_val_if_fail(local!=NULL,-1);
-
- return -1;
-}
-
-static gint
-iterate (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord **local,
- GCalConduitContext *ctxt)
-{
- static GSList *events,*iterator;
- static int hest;
-
- g_return_val_if_fail(local!=NULL,-1);
-
- if(*local==NULL) {
- // LOG ("beginning iteration");
-
- events = get_calendar_objects(conduit,NULL,ctxt);
- hest = 0;
-
- if(events!=NULL) {
- // LOG ("iterating over %d records", g_slist_length (events));
- *local = g_new0(GCalLocalRecord,1);
-
- local_record_from_ical_uid(*local,(gchar*)events->data,ctxt);
- iterator = events;
- } else {
- // LOG ("no events");
- (*local) = NULL;
- }
- } else {
- /* LOG ("continuing iteration\n"); */
- hest++;
- if(g_slist_next(iterator)==NULL) {
- GSList *l;
-
- // LOG ("ending");
- /** free stuff allocated for iteration */
- g_free((*local));
-
- // LOG ("iterated over %d records", hest);
- for(l=events;l;l=l->next)
- g_free(l->data);
-
- g_slist_free(events);
-
- /* ends iteration */
- (*local) = NULL;
- return 0;
- } else {
- iterator = g_slist_next(iterator);
- local_record_from_ical_uid(*local,(gchar*)(iterator->data),ctxt);
- }
- }
- return 1;
-}
-
-
-static gint
-iterate_specific (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord **local,
- gint flag,
- gint archived,
- GCalConduitContext *ctxt)
-{
- (*local) = NULL; /* ??? */
-
- /* debugging */
- {
- gchar *tmp;
- switch (flag) {
- case GnomePilotRecordNothing:
- tmp = g_strdup("RecordNothing"); break;
- case GnomePilotRecordModified:
- tmp = g_strdup("RecordModified"); break;
- case GnomePilotRecordDeleted:
- tmp = g_strdup("RecordDeleted"); break;
- case GnomePilotRecordNew:
- tmp = g_strdup("RecordNew"); break;
- default: tmp = g_strdup_printf("0x%x",flag); break;
- }
- LOG ("\niterate_specific: (flag = %s)... ", tmp);
- g_free(tmp);
- }
-
- g_return_val_if_fail(local!=NULL,-1);
-
- /* iterate until a record meets the criteria */
- while (gnome_pilot_conduit_standard_abs_iterate (conduit,
- (LocalRecord**)local)) {
- if((*local)==NULL) break;
- if(archived && ((*local)->local.archived==archived)) break;
- if(((*local)->local.attr == flag)) break;
- }
-
- if ((*local)) {
- LOG (" found %s\n", print_local (*local));
- } else {
- LOG (" no more found.\n");
- }
-
- return (*local)==NULL?0:1;
-}
-
-static gint
-purge (GnomePilotConduitStandardAbs *conduit,
- GCalConduitContext *ctxt)
-{
- LOG ("purge: doing nothing\n");
-
- /* HEST, gem posterne her */
-
- return -1;
-}
-
-
-static gint
-set_status (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- gint status,
- GCalConduitContext *ctxt)
-{
- gboolean success;
- iCalPilotState new_state;
-
- LOG ("set_status: %s status is now '%s'\n",
- print_local (local),
- gnome_pilot_status_to_string (status));
-
- g_return_val_if_fail(local!=NULL,-1);
- g_assert(local->ical!=NULL);
-
- local->local.attr = status;
- switch(status) {
- case GnomePilotRecordPending:
- case GnomePilotRecordNothing:
- new_state = ICAL_PILOT_SYNC_NONE;
- break;
- case GnomePilotRecordDeleted:
- break;
- case GnomePilotRecordNew:
- case GnomePilotRecordModified:
- new_state = ICAL_PILOT_SYNC_MOD;
- break;
- }
-
- if (status == GnomePilotRecordDeleted) {
- const char *uid;
- cal_component_get_uid (local->ical, &uid);
- success = cal_client_remove_object (ctxt->client, uid);
- } else {
- const char *uid;
- unsigned long pilot_id;
-
- cal_component_get_uid (local->ical, &uid);
- cal_component_get_pilot_id (local->ical, &pilot_id);
-
- success = cal_client_update_object (ctxt->client, local->ical);
- cal_client_update_pilot_id (ctxt->client, (char *) uid,
- pilot_id, new_state);
- }
-
- if (! success) {
- WARN (_("Error while communicating with calendar server"));
- }
-
- return 0;
-}
-
-static gint
-set_archived (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- gint archived,
- GCalConduitContext *ctxt)
-{
- LOG ("set_archived: %s archived flag is now '%d'\n",
- print_local (local), archived);
-
- g_return_val_if_fail(local!=NULL,-1);
- g_assert(local->ical!=NULL);
-
- local->local.archived = archived;
- update_calendar_entry_in_repository(conduit,local->ical,ctxt);
- /* FIXME: This should move the entry into a speciel
- calendar file, eg. Archive, or (by config option), simply
- delete it */
- return 0;
-}
-
-static gint
-set_pilot_id (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- guint32 ID,
- GCalConduitContext *ctxt)
-{
- const char *uid;
- unsigned long int pilot_status;
-
- LOG ("set_pilot_id: %s pilot ID is now '%d'\n",
- print_local (local), ID);
-
- g_return_val_if_fail(local!=NULL,-1);
- g_assert(local->ical!=NULL);
-
- local->local.ID = ID;
- cal_component_set_pilot_id (local->ical, ID);
-
- cal_component_get_uid (local->ical, &uid);
- cal_component_get_pilot_status (local->ical, &pilot_status);
-
- cal_client_update_pilot_id (ctxt->client,
- (char *) uid,
- local->local.ID,
- pilot_status);
-
- return 0;
-}
-
-static gint
-transmit (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- PilotRecord **remote,
- GCalConduitContext *ctxt)
-{
- PilotRecord *p;
- /* priority; FIX ME */
- struct icaltimetype *completed;
- CalComponentText summary;
- GSList *comment_list = NULL;
- CalComponentText *comment;
-
- LOG ("transmit: encoding local %s\n", print_local (local));
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(remote!=NULL,-1);
- g_assert(local->ical!=NULL);
-
- p = g_new0(PilotRecord,1);
-
- p->ID = local->local.ID;
- p->attr = local->local.attr;
- p->archived = local->local.archived;
- p->secret = local->local.secret;
-
- local->todo = g_new0(struct ToDo,1);
-
- {
- CalComponentDateTime dtend;
- time_t dtend_time_t;
-
- cal_component_get_dtend (local->ical, &dtend);
- dtend_time_t = time_from_icaltimetype (*dtend.value);
-
- local->todo->due = *localtime (&dtend_time_t);
- local->todo->indefinite = (dtend.value->year == 0);
- }
-
- //local->todo->priority = local->ical->priority;
- local->todo->priority = 1; /* FIX ME */
-
- cal_component_get_completed (local->ical, &completed);
- if (completed->year > 0)
- local->todo->complete = 1; /* FIX ME */
-
- /* STOP: don't replace these with g_strdup, since free_ToDo
- uses free to deallocte */
-
- cal_component_get_summary (local->ical, &summary);
- local->todo->description =
- //local->ical->summary == NULL ? NULL : strdup (summary.value);
- strdup ((char *) summary.value);
-
-
- cal_component_get_comment_list (local->ical, &comment_list);
- if (comment_list) {
- comment = (CalComponentText *) comment_list->data;
- if (comment && comment->value)
- local->todo->note = strdup (comment->value);
- else
- local->todo->note = NULL;
- } else {
- local->todo->note = NULL;
- }
-
- /*
- LOG ("transmitting todo to pilot [%s] complete=%d/%ld\n",
- local->ical->summary==NULL?"NULL":local->ical->summary,
- local->todo->complete, local->ical->completed);
- */
-
- /* Generate pilot record structure */
- p->record = g_new0(char,0xffff);
- p->length = pack_ToDo(local->todo,p->record,0xffff);
-
- *remote = p;
-
- return 0;
-}
-
-static gint
-free_transmit (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- PilotRecord **remote,
- GCalConduitContext *ctxt)
-{
- LOG ("free_transmit: freeing %s\n",
- print_local (local));
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(remote!=NULL,-1);
-
- /* free_ToDo(local->todo); */ /* FIX ME is this needed? */
- g_free((*remote)->record);
- *remote = NULL;
- return 0;
-}
-
-
-static gint
-compare (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- /* used by the quick compare */
- PilotRecord *remoteOfLocal;
- int err;
- int retval;
-
- LOG ("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);
-
- err = transmit(conduit,local,&remoteOfLocal,ctxt);
- if (err != 0) return err;
-
- retval = 0;
- if (remote->length == remoteOfLocal->length) {
- if (memcmp (remoteOfLocal->record,
- remote->record, remote->length)!=0) {
- LOG (" compare failed on contents\n");
- retval = 1;
- }
- } else {
- LOG(" compare failed on length\n");
- retval = 1;
- }
-
-
- if (retval == 0) {
- LOG (" match.\n");
- } else {
- /* debug spew */
- LOG (" local:%s\n", print_remote (remoteOfLocal));
- LOG (" remote:%s\n", print_remote (remote));
- }
-
- free_transmit(conduit,local,&remoteOfLocal,ctxt);
- return retval;
-}
-
-
-static gint
-compare_backup (GnomePilotConduitStandardAbs *conduit,
- GCalLocalRecord *local,
- PilotRecord *remote,
- GCalConduitContext *ctxt)
-{
- LOG ("compare_backup: doing nothing\n");
-
- g_return_val_if_fail(local!=NULL,-1);
- g_return_val_if_fail(remote!=NULL,-1);
-
- return -1;
-}
-
-
-static gint
-delete_all (GnomePilotConduitStandardAbs *conduit,
- GCalConduitContext *ctxt)
-{
- GSList *events,*it;
- gboolean error;
- gboolean success;
-
- events = get_calendar_objects(conduit,&error,ctxt);
-
- LOG ("delete_all: deleting all objects from desktop\n");
-
- if (error == FALSE) return -1;
- for (it=events; it; it = g_slist_next (it)) {
- success = cal_client_remove_object (ctxt->client, it->data);
-
- if (!success)
- INFO ("Object did not exist");
-
- g_free (it->data);
- }
-
- g_slist_free (events);
- return -1;
-}
-
-
-static ORBit_MessageValidationResult
-accept_all_cookies (CORBA_unsigned_long request_id,
- CORBA_Principal *principal,
- CORBA_char *operation)
-{
- /* allow ALL cookies */
- return ORBIT_MESSAGE_ALLOW_ALL;
-}
-
-
-GnomePilotConduit *
-conduit_get_gpilot_conduit (guint32 pilotId)
-{
- GtkObject *retval;
- GCalConduitCfg *cfg;
- GCalConduitContext *ctxt;
-
- LOG ("in todo's conduit_get_gpilot_conduit\n");
-
- /* we need to find wombat with oaf, so make sure oaf
- is initialized here. once the desktop is converted
- to oaf and gpilotd is built with oaf, this can go away */
- if (! oaf_is_initialized ())
- {
- char *argv[ 1 ] = {"hi"};
- oaf_init (1, argv);
-
- if (bonobo_init (CORBA_OBJECT_NIL,
- CORBA_OBJECT_NIL,
- CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-
- ORBit_set_request_validation_handler (accept_all_cookies);
- }
-
- retval = gnome_pilot_conduit_standard_abs_new ("ToDoDB", 0x746F646F);
- g_assert (retval != NULL);
- gnome_pilot_conduit_construct(GNOME_PILOT_CONDUIT(retval),"ToDoConduit");
-
- gcalconduit_load_configuration(&cfg,pilotId);
- gtk_object_set_data(retval,"todoconduit_cfg",cfg);
-
- gcalconduit_new_context(&ctxt,cfg);
- gtk_object_set_data(GTK_OBJECT(retval),"todoconduit_context",ctxt);
-
- gtk_signal_connect (retval, "match_record", (GtkSignalFunc) match_record, ctxt);
- gtk_signal_connect (retval, "free_match", (GtkSignalFunc) free_match, ctxt);
- gtk_signal_connect (retval, "archive_local", (GtkSignalFunc) archive_local, ctxt);
- gtk_signal_connect (retval, "archive_remote", (GtkSignalFunc) archive_remote, ctxt);
- gtk_signal_connect (retval, "store_remote", (GtkSignalFunc) store_remote, ctxt);
- gtk_signal_connect (retval, "clear_status_archive_local", (GtkSignalFunc) clear_status_archive_local, ctxt);
- gtk_signal_connect (retval, "iterate", (GtkSignalFunc) iterate, ctxt);
- gtk_signal_connect (retval, "iterate_specific", (GtkSignalFunc) iterate_specific, ctxt);
- gtk_signal_connect (retval, "purge", (GtkSignalFunc) purge, ctxt);
- gtk_signal_connect (retval, "set_status", (GtkSignalFunc) set_status, ctxt);
- gtk_signal_connect (retval, "set_archived", (GtkSignalFunc) set_archived, ctxt);
- gtk_signal_connect (retval, "set_pilot_id", (GtkSignalFunc) set_pilot_id, ctxt);
- gtk_signal_connect (retval, "compare", (GtkSignalFunc) compare, ctxt);
- gtk_signal_connect (retval, "compare_backup", (GtkSignalFunc) compare_backup, ctxt);
- gtk_signal_connect (retval, "free_transmit", (GtkSignalFunc) free_transmit, ctxt);
- gtk_signal_connect (retval, "delete_all", (GtkSignalFunc) delete_all, ctxt);
- gtk_signal_connect (retval, "transmit", (GtkSignalFunc) transmit, ctxt);
- gtk_signal_connect (retval, "pre_sync", (GtkSignalFunc) pre_sync, ctxt);
-
- return GNOME_PILOT_CONDUIT (retval);
-}
-
-void
-conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit)
-{
- GCalConduitCfg *cc;
- GCalConduitContext *ctxt;
-
- cc = GET_GCALCONFIG(conduit);
- ctxt = GET_GCALCONTEXT(conduit);
-
- if (ctxt->client != NULL) {
- gtk_object_unref (GTK_OBJECT (ctxt->client));
- //pi_close (ctxt->link);
- //GNOME_Calendar_Repository_done (ctxt->calendar, &(ctxt->ev));
- }
-
- gcalconduit_destroy_configuration (&cc);
-
- gcalconduit_destroy_context (&ctxt);
-
- gtk_object_destroy (GTK_OBJECT (conduit));
-}
diff --git a/calendar/conduits/todo/todo-conduit.h b/calendar/conduits/todo/todo-conduit.h
deleted file mode 100644
index f01b52173d..0000000000
--- a/calendar/conduits/todo/todo-conduit.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#ifndef __TODO_CONDUIT_H__
-#define __TODO_CONDUIT_H__
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <gnome.h>
-#include <pi-todo.h>
-#include <gpilotd/gnome-pilot-conduit.h>
-#include <gpilotd/gnome-pilot-conduit-standard-abs.h>
-#include <cal-client/cal-client.h>
-#include <cal-util/calobj.h>
-#include <cal-util/timeutil.h>
-
-/*
-#ifdef USING_OAF
-#include <liboaf/liboaf.h>
-#else
-#include <libgnorba/gnorba.h>
-#endif
-*/
-
-#include <liboaf/liboaf.h>
-#include <libgnorba/gnorba.h>
-
-/* This is the local record structure for the GnomeCal conduit. */
-typedef struct _GCalLocalRecord GCalLocalRecord;
-struct _GCalLocalRecord {
- /* 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.
- */
- LocalRecord local;
- /* The corresponding iCal object, as found by GnomeCal. */
- //iCalObject *ical;
- CalComponent *ical;
-
- /* pilot-link todo structure, used for implementing Transmit. */
- struct ToDo *todo;
-};
-#define GCAL_LOCALRECORD(s) ((GCalLocalRecord*)(s))
-
-/* This is the configuration of the GnomeCal conduit. */
-typedef struct _GCalConduitCfg GCalConduitCfg;
-struct _GCalConduitCfg {
- gboolean open_secret;
- guint32 pilotId;
- GnomePilotConduitSyncType sync_type; /* only used by capplet */
-};
-#define GET_GCALCONFIG(c) ((GCalConduitCfg*)gtk_object_get_data(GTK_OBJECT(c),"todoconduit_cfg"))
-
-/* This is the context for all the GnomeCal conduit methods. */
-typedef struct _GCalConduitContext GCalConduitContext;
-struct _GCalConduitContext {
- struct ToDoAppInfo ai;
- GCalConduitCfg *cfg;
- CalClient *client;
- CORBA_Environment ev;
- CORBA_ORB orb;
- gboolean calendar_load_tried;
- gboolean calendar_load_success;
-
- char *calendar_file;
-};
-#define GET_GCALCONTEXT(c) ((GCalConduitContext*)gtk_object_get_data(GTK_OBJECT(c),"todoconduit_context"))
-
-
-/* Given a GCalConduitCfg*, allocates the structure and
- loads the configuration data for the given pilot.
- this is defined in the header file because it is used by
- both todo-conduit and todo-conduit-control-applet,
- and we don't want to export any symbols we don't have to. */
-static void
-gcalconduit_load_configuration(GCalConduitCfg **c,
- guint32 pilotId)
-{
- gchar prefix[256];
- g_snprintf(prefix,255,"/gnome-pilot.d/todo-conduit/Pilot_%u/",pilotId);
-
- *c = g_new0(GCalConduitCfg,1);
- g_assert(*c != NULL);
- gnome_config_push_prefix(prefix);
- (*c)->open_secret = gnome_config_get_bool("open_secret=FALSE");
- (*c)->sync_type = GnomePilotConduitSyncTypeCustom; /* set in capplets main */
- gnome_config_pop_prefix();
-
- (*c)->pilotId = pilotId;
-}
-
-
-#endif __TODO_CONDUIT_H__
diff --git a/calendar/conduits/todo/todo.conduit.in b/calendar/conduits/todo/todo.conduit.in
deleted file mode 100644
index b940c2b498..0000000000
--- a/calendar/conduits/todo/todo.conduit.in
+++ /dev/null
@@ -1,8 +0,0 @@
-<gnome-pilot-conduit version="1.0">
-<conduit id="todo_conduit" type="shlib" location="@prefix@/lib/gnome-pilot/conduits/libtodo_conduit.so"/>
-<name value="todo"/>
-<conduit-attribute name="description" value="Synchronizes with Evolution"/>
-<conduit-attribute name="default-synctype" value="synchronize"/>
-<conduit-attribute name="icon" value="@prefix@/share/pixmaps/gnome-calendar-conduit.png"/>
-<conduit-attribute name="settings" value="TRUE"/>
-</gnome-pilot-conduit>
diff --git a/calendar/gui/.cvsignore b/calendar/gui/.cvsignore
deleted file mode 100644
index c55e5d266f..0000000000
--- a/calendar/gui/.cvsignore
+++ /dev/null
@@ -1,21 +0,0 @@
-Makefile.in
-Makefile
-.deps
-_libs
-.libs
-.pure
-gncal
-evolution-calendar
-evolution-calendar.pure
-test-calendar-widget
-getdate.c
-GnomeCal-skels.c
-GnomeCal-common.c
-GnomeCal.h
-calendar-pilot-sync
-evolution-calendar-stubs.c
-evolution-calendar-skels.c
-evolution-calendar-common.c
-evolution-calendar.h
-GnomeCal-stubs.c
-*.lo
diff --git a/calendar/gui/GNOME_Evolution_Calendar.oaf.in b/calendar/gui/GNOME_Evolution_Calendar.oaf.in
deleted file mode 100644
index c8a4907854..0000000000
--- a/calendar/gui/GNOME_Evolution_Calendar.oaf.in
+++ /dev/null
@@ -1,29 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921"
- type="exe"
- location="evolution-calendar">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution calendar component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-calendar:2eb9eb63-d305-4918-9c35-faae5db19e51"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling the calendar."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/GNOME_Evolution_Calendar.oafinfo b/calendar/gui/GNOME_Evolution_Calendar.oafinfo
deleted file mode 100644
index c8a4907854..0000000000
--- a/calendar/gui/GNOME_Evolution_Calendar.oafinfo
+++ /dev/null
@@ -1,29 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921"
- type="exe"
- location="evolution-calendar">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution calendar component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-calendar:2eb9eb63-d305-4918-9c35-faae5db19e51"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling the calendar."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/GNOME_Evolution_Calendar_Control.oaf.in b/calendar/gui/GNOME_Evolution_Calendar_Control.oaf.in
deleted file mode 100644
index fb0f138caf..0000000000
--- a/calendar/gui/GNOME_Evolution_Calendar_Control.oaf.in
+++ /dev/null
@@ -1,28 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:calendar:f4f90989-0f50-4af2-ad94-8bbdf331f0bc"
- type="exe"
- location="evolution-calendar">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the sample Calendar control"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:calendar:dd34ddae-25c6-486b-a8a8-3e8f0286b54c"
- type="factory"
- location="OAFIID:control-factory:calendar:f4f90989-0f50-4af2-ad94-8bbdf331f0bc">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/calendar-control:1.0"/>
- <item value="IDL:Bonobo/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="A sample Bonobo control which displays an calendar."/>
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/GNOME_Evolution_Calendar_Control.oafinfo b/calendar/gui/GNOME_Evolution_Calendar_Control.oafinfo
deleted file mode 100644
index fb0f138caf..0000000000
--- a/calendar/gui/GNOME_Evolution_Calendar_Control.oafinfo
+++ /dev/null
@@ -1,28 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:calendar:f4f90989-0f50-4af2-ad94-8bbdf331f0bc"
- type="exe"
- location="evolution-calendar">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the sample Calendar control"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:calendar:dd34ddae-25c6-486b-a8a8-3e8f0286b54c"
- type="factory"
- location="OAFIID:control-factory:calendar:f4f90989-0f50-4af2-ad94-8bbdf331f0bc">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/calendar-control:1.0"/>
- <item value="IDL:Bonobo/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="A sample Bonobo control which displays an calendar."/>
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/GNOME_Evolution_Calendar_gnomecal.oaf.in b/calendar/gui/GNOME_Evolution_Calendar_gnomecal.oaf.in
deleted file mode 100644
index c8a4907854..0000000000
--- a/calendar/gui/GNOME_Evolution_Calendar_gnomecal.oaf.in
+++ /dev/null
@@ -1,29 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921"
- type="exe"
- location="evolution-calendar">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution calendar component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-calendar:2eb9eb63-d305-4918-9c35-faae5db19e51"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling the calendar."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/GNOME_Evolution_Calendar_gnomecal.oafinfo b/calendar/gui/GNOME_Evolution_Calendar_gnomecal.oafinfo
deleted file mode 100644
index c8a4907854..0000000000
--- a/calendar/gui/GNOME_Evolution_Calendar_gnomecal.oafinfo
+++ /dev/null
@@ -1,29 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921"
- type="exe"
- location="evolution-calendar">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution calendar component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-calendar:2eb9eb63-d305-4918-9c35-faae5db19e51"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling the calendar."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am
deleted file mode 100644
index 4927f7c6b6..0000000000
--- a/calendar/gui/Makefile.am
+++ /dev/null
@@ -1,143 +0,0 @@
-SUBDIRS = dialogs
-
-help_base = $(datadir)/gnome/help/cal
-
-bin_PROGRAMS = evolution-calendar
-
-CPPFLAGS = \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\"
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"calendar-gui\" \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir) \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir)/libical/src/libical \
- -I$(top_srcdir)/widgets \
- -I$(includedir) \
- $(BONOBO_VFS_GNOME_CFLAGS) \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DGNOMELOCALEDIR=\""$(datadir)/locale"\"
-
-LINK_FLAGS = \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(INTLLIBS) \
- dialogs/libcal-dialogs.a \
- $(top_builddir)/calendar/cal-client/libcal-client.la \
- $(top_builddir)/calendar/cal-util/libcal-util.la \
- $(top_builddir)/widgets/e-paned/libepaned.a \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/libical/src/libical/libical.a
-
-gladedir = $(datadir)/evolution/glade
-
-glade_DATA = \
- event-editor-dialog.glade
-
-glade_messages = event-editor-dialog.glade.h
-
-evolution_calendar_SOURCES = \
- alarm.c \
- alarm.h \
- calendar-commands.c \
- calendar-commands.h \
- calendar-model.c \
- calendar-model.h \
- control-factory.c \
- control-factory.h \
- component-factory.c \
- component-factory.h \
- e-calendar-table.h \
- e-calendar-table.c \
- 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-week-view-event-item.c \
- e-week-view-event-item.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 \
- event-editor.c \
- event-editor.h \
- getdate.y \
- gncal-todo.c \
- gncal-todo.h \
- gnome-cal.c \
- gnome-cal.h \
- gnome-month-item.c \
- gnome-month-item.h \
- goto.c \
- main.c \
- mark.c \
- mark.h \
- popup-menu.c \
- popup-menu.h \
- print.c \
- print.h \
- prop.c
-
-evolution_calendar_LDADD = \
- $(top_builddir)/shell/libeshell.a \
- $(EXTRA_GNOME_LIBS) \
- $(BONOBO_HTML_GNOME_LIBS) \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/e-util/libeutil.la \
- $(LINK_FLAGS)
-
-evolution_calendar_LDFLAGS = `gnome-config --libs gdk_pixbuf`
-
-if USING_OAF
-oafdir = $(datadir)/oaf
-oaf_DATA = calendar-control.oafinfo evolution-calendar.oafinfo
-else
-gnorbadir = $(sysconfdir)/CORBA/servers
-gnorba_DATA = calendar-control.gnorba evolution-calendar.gnorba
-endif
-
-OAF_GNORBA_EXTRAS = calendar-control.oafinfo evolution-calendar.oafinfo calendar-control.gnorba evolution-calendar.gnorba
-EXTRA_DIST = \
- $(OAF_GNORBA_EXTRAS) \
- $(glade_DATA) \
- bell.xpm \
- dayview.xpm \
- jump.xpm \
- monthview.xpm \
- recur.xpm \
- task-assigned-to.xpm \
- task-assigned.xpm \
- task-recurring.xpm \
- task.xpm \
- weekview.xpm \
- workweekview.xpm \
- yearview.xpm \
- calendar-control.gnorba \
- calendar-control.oafinfo
-
-
-install-data-local:
- $(mkinstalldirs) $(DESTDIR)$(help_base)/C
- $(mkinstalldirs) $(Conduitsdir)
-
-if ENABLE_PURIFY
-PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-
-all-local: evolution-calendar.pure
-
-evolution-calendar.pure: evolution-calendar
- @rm -f evolution-calendar.pure
- $(PLINK) $(evolution_calendar_LDFLAGS) $(evolution_calendar_OBJECTS) $(evolution_calendar_LDADD) $(LIBS)
-
-endif
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 7d8357599c..0000000000
--- a/calendar/gui/alarm-notify/alarm-notify-dialog.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/* Evolution calendar - alarm notification dialog
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <glade/glade.h>
-#include "alarm-notify-dialog.h"
-
-
-
-/* The useful contents of the alarm notify dialog */
-typedef struct {
- GladeXML *xml;
-
- GtkWidget *dialog;
- GtkWidget *close;
- GtkWidget *snooze;
- GtkWidget *edit;
- GtkWidget *heading;
- GtkWidget *summary;
- GtkWidget *snooze_time;
-
- AlarmNotifyFunc func;
- gpointer func_data;
-} AlarmNotify;
-
-
-
-/* Callback used when the notify dialog is destroyed */
-static void
-dialog_destroy_cb (GtkObject *object, gpointer data)
-{
- AlarmNotify *an;
-
- an = data;
- gtk_object_unref (GTK_OBJECT (an->xml));
- g_free (an);
-}
-
-/* Delete_event handler for the alarm notify dialog */
-static gint
-delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- AlarmNotify *an;
-
- an = data;
- g_assert (an->func != NULL);
-
- (* an->func) (ALARM_NOTIFY_CLOSE, -1, an->func_data);
-
- gtk_widget_destroy (widget);
- return TRUE;
-}
-
-/* Callback for the close button */
-static void
-close_clicked_cb (GtkWidget *widget, gpointer data)
-{
- AlarmNotify *an;
-
- an = data;
- g_assert (an->func != NULL);
-
- (* an->func) (ALARM_NOTIFY_CLOSE, -1, an->func_data);
-
- gtk_widget_destroy (an->dialog);
-}
-
-/* Callback for the snooze button */
-static void
-snooze_clicked_cb (GtkWidget *widget, gpointer data)
-{
- AlarmNotify *an;
- int snooze_time;
-
- an = data;
- g_assert (an->func != NULL);
-
- snooze_time = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (an->snooze_time));
- (* an->func) (ALARM_NOTIFY_SNOOZE, snooze_time, an->func_data);
-
- gtk_widget_destroy (an->dialog);
-}
-
-/* Callback for the edit button */
-static void
-edit_clicked_cb (GtkWidget *widget, gpointer data)
-{
- AlarmNotify *an;
-
- an = data;
- g_assert (an->func != NULL);
-
- (* an->func) (ALARM_NOTIFY_EDIT, -1, an->func_data);
-
- gtk_widget_destroy (an->dialog);
-}
-
-/**
- * alarm_notify_dialog:
- * @trigger: Trigger time for the alarm.
- * @occur: Occurrence time for the event.
- * @comp: Calendar component object which corresponds to the alarm.
- * @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: TRUE on success, FALSE if the dialog could not be created.
- **/
-gboolean
-alarm_notify_dialog (time_t trigger, time_t occur, CalComponent *comp,
- AlarmNotifyFunc func, gpointer func_data)
-{
- AlarmNotify *an;
- char buf[256];
- struct tm tm_trigger;
- struct tm tm_occur;
- CalComponentText summary;
-
- g_return_val_if_fail (trigger != -1, FALSE);
- g_return_val_if_fail (occur != -1, FALSE);
- g_return_val_if_fail (comp != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), FALSE);
- g_return_val_if_fail (func != NULL, FALSE);
-
- an = g_new0 (AlarmNotify, 1);
-
- an->func = func;
- an->func_data = func_data;
-
- an->xml = glade_xml_new (EVOLUTION_GLADEDIR "/alarm-notify.glade", NULL);
- if (!an->xml) {
- g_message ("alarm_notify_dialog(): Could not load the Glade XML file!");
- g_free (an);
- return FALSE;
- }
-
- an->dialog = glade_xml_get_widget (an->xml, "alarm-notify");
- an->close = glade_xml_get_widget (an->xml, "close");
- an->snooze = glade_xml_get_widget (an->xml, "snooze");
- an->edit = glade_xml_get_widget (an->xml, "edit");
- an->heading = glade_xml_get_widget (an->xml, "heading");
- an->summary = glade_xml_get_widget (an->xml, "summary");
- an->snooze_time = glade_xml_get_widget (an->xml, "snooze-time");
-
- if (!(an->dialog && an->close && an->snooze && an->edit && an->heading && an->summary
- && an->snooze_time)) {
- g_message ("alarm_notify_dialog(): Could not find all widgets in Glade file!");
- gtk_object_unref (GTK_OBJECT (an->xml));
- g_free (an);
- return FALSE;
- }
-
- gtk_object_set_data (GTK_OBJECT (an->dialog), "alarm-notify", an);
- gtk_signal_connect (GTK_OBJECT (an->dialog), "destroy",
- GTK_SIGNAL_FUNC (dialog_destroy_cb), an);
-
- /* Title */
-
- /* FIXME: use am_pm_flag or 24-hour time */
-
- tm_trigger = *localtime (&trigger);
- strftime (buf, sizeof (buf), _("Alarm on %A %b %d %Y %H:%M"), &tm_trigger);
- gtk_window_set_title (GTK_WINDOW (an->dialog), buf);
-
- /* Heading */
-
- tm_occur = *localtime (&occur);
- strftime (buf, sizeof (buf),
- _("Notification about your appointment on %A %b %d %Y %H:%M"),
- &tm_occur);
- gtk_label_set_text (GTK_LABEL (an->heading), buf);
-
- /* Summary */
-
- cal_component_get_summary (comp, &summary);
-
- if (summary.value)
- gtk_label_set_text (GTK_LABEL (an->summary), summary.value);
- else
- gtk_label_set_text (GTK_LABEL (an->summary), _("No summary available."));
-
- /* Connect actions */
-
- gtk_signal_connect (GTK_OBJECT (an->dialog), "delete_event",
- GTK_SIGNAL_FUNC (delete_event_cb),
- an);
-
- gtk_signal_connect (GTK_OBJECT (an->close), "clicked",
- GTK_SIGNAL_FUNC (close_clicked_cb),
- an);
-
- gtk_signal_connect (GTK_OBJECT (an->snooze), "clicked",
- GTK_SIGNAL_FUNC (snooze_clicked_cb),
- an);
-
- gtk_signal_connect (GTK_OBJECT (an->edit), "clicked",
- GTK_SIGNAL_FUNC (edit_clicked_cb),
- an);
-
- /* Run! */
-
- gtk_widget_show (an->dialog);
- return TRUE;
-}
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 1e56f1c586..0000000000
--- a/calendar/gui/alarm-notify/alarm-notify-dialog.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Evolution calendar - alarm notification dialog
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 ALARM_NOTIFY_DIALOG_H
-#define ALARM_NOTIFY_DIALOG_H
-
-#include <time.h>
-#include <glib.h>
-#include <cal-util/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);
-
-gboolean alarm_notify_dialog (time_t trigger, time_t occur, CalComponent *comp,
- AlarmNotifyFunc func, gpointer func_data);
-
-
-
-#endif
diff --git a/calendar/gui/alarm-notify/alarm-notify.glade b/calendar/gui/alarm-notify/alarm-notify.glade
deleted file mode 100644
index 32d7e03f8b..0000000000
--- a/calendar/gui/alarm-notify/alarm-notify.glade
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Evolution Calendar</name>
- <program_name>evolution-calendar</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>True</output_main_file>
- <output_support_files>True</output_support_files>
- <output_build_files>True</output_build_files>
- <backup_source_files>True</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>alarm-notify.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GtkWindow</class>
- <name>alarm-notify</name>
- <cxx_use_heap>True</cxx_use_heap>
- <title></title>
- <type>GTK_WINDOW_DIALOG</type>
- <position>GTK_WIN_POS_CENTER</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox2</name>
- <border_width>4</border_width>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox3</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox5</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>heading</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label></label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>True</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>summary</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label></label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>True</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox4</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>close</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <label>Close</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>snooze</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <label>Snooze</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>edit</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <label>Edit appointment</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox4</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label4</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Snooze time (minutes)</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>snooze-time</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>5</value>
- <lower>1</lower>
- <upper>1440</upper>
- <step>1</step>
- <page>5</page>
- <page_size>5</page_size>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/calendar/gui/alarm-notify/alarm.c b/calendar/gui/alarm-notify/alarm.c
deleted file mode 100644
index c89b65ff5e..0000000000
--- a/calendar/gui/alarm-notify/alarm.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* Evolution calendar - alarm notification support
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Miguel de Icaza <miguel@helixcode.com>
- * Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <time.h>
-#include <gnome.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/time.h>
-#include "alarm.h"
-
-
-
-/* The pipes used to notify about an alarm */
-static int alarm_pipes [2];
-
-/* The list of pending alarms */
-static GList *alarms;
-
-/* A queued alarm structure */
-typedef struct {
- time_t trigger;
- AlarmFunction alarm_fn;
- gpointer data;
- AlarmDestroyNotify destroy_notify_fn;
-} AlarmRecord;
-
-
-
-/* SIGALRM handler. Notifies the callback about the alarm. */
-static void
-alarm_signal (int arg)
-{
- char c = 0;
-
- write (alarm_pipes [1], &c, 1);
-}
-
-/* Sets up an itimer and returns a success code */
-static gboolean
-setup_itimer (time_t diff)
-{
- struct itimerval itimer;
- int v;
-
- itimer.it_interval.tv_sec = 0;
- itimer.it_interval.tv_usec = 0;
- itimer.it_value.tv_sec = diff;
- itimer.it_value.tv_usec = 0;
-
- v = setitimer (ITIMER_REAL, &itimer, NULL);
-
- return (v == 0) ? TRUE : FALSE;
-}
-
-/* Removes the head alarm, returns it, and schedules the next alarm in the
- * queue.
- */
-static AlarmRecord *
-pop_alarm (void)
-{
- AlarmRecord *ar;
- GList *l;
-
- if (!alarms)
- return NULL;
-
- ar = alarms->data;
-
- l = alarms;
- alarms = g_list_remove_link (alarms, l);
- g_list_free_1 (l);
-
- if (alarms) {
- time_t now;
- AlarmRecord *new_ar;
-
- now = time (NULL);
- new_ar = alarms->data;
-
- if (!setup_itimer (new_ar->trigger - now)) {
- g_message ("pop_alarm(): Could not reset the timer! "
- "Weird things will happen.");
-
- /* FIXME: should we free the alarm list? What
- * about further alarm removal requests that
- * will fail?
- */
- }
- } else {
- struct itimerval itimer;
- int v;
-
- itimer.it_interval.tv_sec = 0;
- itimer.it_interval.tv_usec = 0;
- itimer.it_value.tv_sec = 0;
- itimer.it_value.tv_usec = 0;
-
- v = setitimer (ITIMER_REAL, &itimer, NULL);
- if (v != 0)
- g_message ("pop_alarm(): Could not clear the timer! "
- "Weird things may happen.");
- }
-
- return ar;
-}
-
-/* Input handler for our own alarm notification pipe */
-static void
-alarm_ready (gpointer data, gint fd, GdkInputCondition cond)
-{
- AlarmRecord *ar;
- char c;
-
- if (read (alarm_pipes [0], &c, 1) != 1) {
- g_message ("alarm_ready(): Uh? Could not read from notification pipe.");
- return;
- }
-
- g_assert (alarms != NULL);
- ar = pop_alarm ();
-
- g_message ("alarm_ready(): Notifying about alarm on %s", ctime (&ar->trigger));
-
- (* ar->alarm_fn) (ar, ar->trigger, ar->data);
-
- if (ar->destroy_notify_fn)
- (* ar->destroy_notify_fn) (ar->data);
-
- g_free (ar);
-}
-
-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 gboolean
-queue_alarm (time_t now, AlarmRecord *ar)
-{
- time_t diff;
- AlarmRecord *old_head;
-
- if (alarms)
- old_head = alarms->data;
- else
- old_head = NULL;
-
- alarms = g_list_insert_sorted (alarms, ar, compare_alarm_by_time);
-
- if (old_head == alarms->data)
- return TRUE;
-
- /* Set the timer for removal upon activation */
-
- diff = ar->trigger - now;
- if (!setup_itimer (diff)) {
- GList *l;
-
- g_message ("queue_alarm(): Could not set up timer! Not queueing alarm.");
-
- l = g_list_find (alarms, ar);
- g_assert (l != NULL);
-
- alarms = g_list_remove_link (alarms, l);
- g_list_free_1 (l);
- return FALSE;
- }
-
- return TRUE;
-}
-
-/**
- * alarm_add:
- * @trigger: Time at which alarm will trigger.
- * @alarm_fn: Callback for trigger.
- * @data: Closure data for 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)
-{
- time_t now;
- AlarmRecord *ar;
-
- now = time (NULL);
- if (trigger < now)
- return NULL;
-
- ar = g_new (AlarmRecord, 1);
- ar->trigger = trigger;
- ar->alarm_fn = alarm_fn;
- ar->data = data;
- ar->destroy_notify_fn = destroy_notify_fn;
-
- g_message ("alarm_add(): Adding alarm for %s", ctime (&trigger));
-
- if (!queue_alarm (now, ar)) {
- if (ar->destroy_notify_fn)
- (* ar->destroy_notify_fn) (ar->data);
-
- g_free (ar);
- ar = NULL;
- }
-
- return ar;
-}
-
-/**
- * alarm_remove:
- * @alarm: A queued alarm identifier.
- *
- * Removes an alarm from the alarm queue.
- **/
-void
-alarm_remove (gpointer alarm)
-{
- AlarmRecord *ar;
- AlarmRecord *old_head;
- GList *l;
-
- ar = alarm;
-
- l = g_list_find (alarms, ar);
- if (!l) {
- g_message ("alarm_remove(): Requested removal of nonexistent alarm!");
- return;
- }
-
- old_head = alarms->data;
-
- if (old_head == ar)
- pop_alarm ();
- else {
- alarms = g_list_remove_link (alarms, l);
- g_list_free_1 (l);
- }
-
- if (ar->destroy_notify_fn)
- (* ar->destroy_notify_fn) (ar->data);
-
- g_free (ar);
-}
-
-/**
- * alarm_init:
- * @void:
- *
- * Initializes the alarm notification system. This must be called near the
- * beginning of the program.
- **/
-void
-alarm_init (void)
-{
- struct sigaction sa;
- int flags;
-
- pipe (alarm_pipes);
-
- /* set non blocking mode */
- flags = 0;
- fcntl (alarm_pipes [0], F_GETFL, &flags);
- fcntl (alarm_pipes [0], F_SETFL, flags | O_NONBLOCK);
- gdk_input_add (alarm_pipes [0], GDK_INPUT_READ, alarm_ready, NULL);
-
- /* Setup the signal handler */
- sa.sa_handler = alarm_signal;
- sigemptyset (&sa.sa_mask);
- sa.sa_flags = SA_RESTART;
- sigaction (SIGALRM, &sa, NULL);
-}
diff --git a/calendar/gui/alarm-notify/alarm.h b/calendar/gui/alarm-notify/alarm.h
deleted file mode 100644
index 2394d28024..0000000000
--- a/calendar/gui/alarm-notify/alarm.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Evolution calendar - alarm notification support
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Miguel de Icaza <miguel@helixcode.com>
- * Federico Mena-Quintero <federico@helixcode.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 ALARM_H
-#define ALARM_H
-
-#include <time.h>
-
-
-
-typedef void (* AlarmFunction) (gpointer alarm_id, time_t trigger, gpointer data);
-typedef void (* AlarmDestroyNotify) (gpointer data);
-
-void alarm_init (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.c b/calendar/gui/alarm.c
deleted file mode 100644
index c89b65ff5e..0000000000
--- a/calendar/gui/alarm.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* Evolution calendar - alarm notification support
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Miguel de Icaza <miguel@helixcode.com>
- * Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <time.h>
-#include <gnome.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/time.h>
-#include "alarm.h"
-
-
-
-/* The pipes used to notify about an alarm */
-static int alarm_pipes [2];
-
-/* The list of pending alarms */
-static GList *alarms;
-
-/* A queued alarm structure */
-typedef struct {
- time_t trigger;
- AlarmFunction alarm_fn;
- gpointer data;
- AlarmDestroyNotify destroy_notify_fn;
-} AlarmRecord;
-
-
-
-/* SIGALRM handler. Notifies the callback about the alarm. */
-static void
-alarm_signal (int arg)
-{
- char c = 0;
-
- write (alarm_pipes [1], &c, 1);
-}
-
-/* Sets up an itimer and returns a success code */
-static gboolean
-setup_itimer (time_t diff)
-{
- struct itimerval itimer;
- int v;
-
- itimer.it_interval.tv_sec = 0;
- itimer.it_interval.tv_usec = 0;
- itimer.it_value.tv_sec = diff;
- itimer.it_value.tv_usec = 0;
-
- v = setitimer (ITIMER_REAL, &itimer, NULL);
-
- return (v == 0) ? TRUE : FALSE;
-}
-
-/* Removes the head alarm, returns it, and schedules the next alarm in the
- * queue.
- */
-static AlarmRecord *
-pop_alarm (void)
-{
- AlarmRecord *ar;
- GList *l;
-
- if (!alarms)
- return NULL;
-
- ar = alarms->data;
-
- l = alarms;
- alarms = g_list_remove_link (alarms, l);
- g_list_free_1 (l);
-
- if (alarms) {
- time_t now;
- AlarmRecord *new_ar;
-
- now = time (NULL);
- new_ar = alarms->data;
-
- if (!setup_itimer (new_ar->trigger - now)) {
- g_message ("pop_alarm(): Could not reset the timer! "
- "Weird things will happen.");
-
- /* FIXME: should we free the alarm list? What
- * about further alarm removal requests that
- * will fail?
- */
- }
- } else {
- struct itimerval itimer;
- int v;
-
- itimer.it_interval.tv_sec = 0;
- itimer.it_interval.tv_usec = 0;
- itimer.it_value.tv_sec = 0;
- itimer.it_value.tv_usec = 0;
-
- v = setitimer (ITIMER_REAL, &itimer, NULL);
- if (v != 0)
- g_message ("pop_alarm(): Could not clear the timer! "
- "Weird things may happen.");
- }
-
- return ar;
-}
-
-/* Input handler for our own alarm notification pipe */
-static void
-alarm_ready (gpointer data, gint fd, GdkInputCondition cond)
-{
- AlarmRecord *ar;
- char c;
-
- if (read (alarm_pipes [0], &c, 1) != 1) {
- g_message ("alarm_ready(): Uh? Could not read from notification pipe.");
- return;
- }
-
- g_assert (alarms != NULL);
- ar = pop_alarm ();
-
- g_message ("alarm_ready(): Notifying about alarm on %s", ctime (&ar->trigger));
-
- (* ar->alarm_fn) (ar, ar->trigger, ar->data);
-
- if (ar->destroy_notify_fn)
- (* ar->destroy_notify_fn) (ar->data);
-
- g_free (ar);
-}
-
-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 gboolean
-queue_alarm (time_t now, AlarmRecord *ar)
-{
- time_t diff;
- AlarmRecord *old_head;
-
- if (alarms)
- old_head = alarms->data;
- else
- old_head = NULL;
-
- alarms = g_list_insert_sorted (alarms, ar, compare_alarm_by_time);
-
- if (old_head == alarms->data)
- return TRUE;
-
- /* Set the timer for removal upon activation */
-
- diff = ar->trigger - now;
- if (!setup_itimer (diff)) {
- GList *l;
-
- g_message ("queue_alarm(): Could not set up timer! Not queueing alarm.");
-
- l = g_list_find (alarms, ar);
- g_assert (l != NULL);
-
- alarms = g_list_remove_link (alarms, l);
- g_list_free_1 (l);
- return FALSE;
- }
-
- return TRUE;
-}
-
-/**
- * alarm_add:
- * @trigger: Time at which alarm will trigger.
- * @alarm_fn: Callback for trigger.
- * @data: Closure data for 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)
-{
- time_t now;
- AlarmRecord *ar;
-
- now = time (NULL);
- if (trigger < now)
- return NULL;
-
- ar = g_new (AlarmRecord, 1);
- ar->trigger = trigger;
- ar->alarm_fn = alarm_fn;
- ar->data = data;
- ar->destroy_notify_fn = destroy_notify_fn;
-
- g_message ("alarm_add(): Adding alarm for %s", ctime (&trigger));
-
- if (!queue_alarm (now, ar)) {
- if (ar->destroy_notify_fn)
- (* ar->destroy_notify_fn) (ar->data);
-
- g_free (ar);
- ar = NULL;
- }
-
- return ar;
-}
-
-/**
- * alarm_remove:
- * @alarm: A queued alarm identifier.
- *
- * Removes an alarm from the alarm queue.
- **/
-void
-alarm_remove (gpointer alarm)
-{
- AlarmRecord *ar;
- AlarmRecord *old_head;
- GList *l;
-
- ar = alarm;
-
- l = g_list_find (alarms, ar);
- if (!l) {
- g_message ("alarm_remove(): Requested removal of nonexistent alarm!");
- return;
- }
-
- old_head = alarms->data;
-
- if (old_head == ar)
- pop_alarm ();
- else {
- alarms = g_list_remove_link (alarms, l);
- g_list_free_1 (l);
- }
-
- if (ar->destroy_notify_fn)
- (* ar->destroy_notify_fn) (ar->data);
-
- g_free (ar);
-}
-
-/**
- * alarm_init:
- * @void:
- *
- * Initializes the alarm notification system. This must be called near the
- * beginning of the program.
- **/
-void
-alarm_init (void)
-{
- struct sigaction sa;
- int flags;
-
- pipe (alarm_pipes);
-
- /* set non blocking mode */
- flags = 0;
- fcntl (alarm_pipes [0], F_GETFL, &flags);
- fcntl (alarm_pipes [0], F_SETFL, flags | O_NONBLOCK);
- gdk_input_add (alarm_pipes [0], GDK_INPUT_READ, alarm_ready, NULL);
-
- /* Setup the signal handler */
- sa.sa_handler = alarm_signal;
- sigemptyset (&sa.sa_mask);
- sa.sa_flags = SA_RESTART;
- sigaction (SIGALRM, &sa, NULL);
-}
diff --git a/calendar/gui/alarm.h b/calendar/gui/alarm.h
deleted file mode 100644
index 2394d28024..0000000000
--- a/calendar/gui/alarm.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Evolution calendar - alarm notification support
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Miguel de Icaza <miguel@helixcode.com>
- * Federico Mena-Quintero <federico@helixcode.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 ALARM_H
-#define ALARM_H
-
-#include <time.h>
-
-
-
-typedef void (* AlarmFunction) (gpointer alarm_id, time_t trigger, gpointer data);
-typedef void (* AlarmDestroyNotify) (gpointer data);
-
-void alarm_init (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/bell.xpm b/calendar/gui/bell.xpm
deleted file mode 100644
index b1ab537a17..0000000000
--- a/calendar/gui/bell.xpm
+++ /dev/null
@@ -1,83 +0,0 @@
-/* XPM */
-static char * bell_xpm[] = {
-"16 16 64 1",
-" c None",
-". c #000000",
-"+ c #E3BB43",
-"@ c #E6C049",
-"# c #EED275",
-"$ c #F4E193",
-"% c #F4DF8C",
-"& c #EAC95C",
-"* c #EFD57A",
-"= c #FAEFBB",
-"- c #FDF6D3",
-"; c #FDF5C6",
-"> c #F4E18F",
-", c #E4BD43",
-"' c #F6E295",
-") c #FEF9D8",
-"! c #FFFFFF",
-"~ c #FFFADA",
-"{ c #FCEEAA",
-"] c #EBCA5A",
-"^ c #E9C550",
-"/ c #FAEA9C",
-"( c #FEF7CB",
-"_ c #FFF8CC",
-": c #FDF1A8",
-"< c #EED060",
-"[ c #D39D12",
-"} c #F2D55D",
-"| c #FCEC91",
-"1 c #FFF4AE",
-"2 c #FFF5B6",
-"3 c #FEEF97",
-"4 c #F3D65E",
-"5 c #D5A216",
-"6 c #FAE05C",
-"7 c #FFED7C",
-"8 c #FFEF8C",
-"9 c #FFF092",
-"0 c #FDEB7A",
-"a c #F4D750",
-"b c #D8A717",
-"c c #EAC01D",
-"d c #F6D83E",
-"e c #FAE255",
-"f c #FAE362",
-"g c #F9E161",
-"h c #F6DE5B",
-"i c #F1D145",
-"j c #E6BE28",
-"k c #D09B09",
-"l c #B67E00",
-"m c #CE9100",
-"n c #D69F04",
-"o c #E0B011",
-"p c #E6BA1D",
-"q c #E3B721",
-"r c #E0B21E",
-"s c #DCAB16",
-"t c #D7A20D",
-"u c #CC9303",
-"v c #BE8400",
-"w c #AC7500",
-"x c #A06B00",
-"y c #FFDD00",
-" ",
-" .. ",
-" .+@. ",
-" .#$%&. ",
-" .*=-;>,. ",
-" .')!~{]. ",
-" .^/(~_:<[. ",
-" .}|121345. ",
-" .678980ab. ",
-" .cdefghijkl. ",
-" .mnopqrstuvwx. ",
-" .............. ",
-" .8y. ",
-" .. ",
-" ",
-" "};
diff --git a/calendar/gui/calendar-commands.c b/calendar/gui/calendar-commands.c
deleted file mode 100644
index 2dd63f832c..0000000000
--- a/calendar/gui/calendar-commands.c
+++ /dev/null
@@ -1,855 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Main file for the GNOME Calendar program
- * Copyright (C) 1998 the Free Software Foundation
- *
- * Authors:
- * Miguel de Icaza (miguel@kernel.org)
- * Federico Mena (federico@helixcode.com)
- */
-
-#include <config.h>
-#include <pwd.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <gnome.h>
-#include <libgnorba/gnorba.h>
-#include <bonobo.h>
-#include <cal-util/timeutil.h>
-#include "gnome-cal.h"
-#include "calendar-commands.h"
-#include "print.h"
-
-#include "dayview.xpm"
-#include "workweekview.xpm"
-#include "weekview.xpm"
-#include "monthview.xpm"
-
-#if 0
-#include "yearview.xpm"
-#endif
-
-/* The username, used to set the `owner' field of the event */
-char *user_name;
-
-/* The full user name from the Gecos field */
-char *full_name;
-
-/* a gnome-config string prefix that can be used to access the calendar config info */
-char *calendar_settings;
-
-/* Day begin, day end parameters */
-int day_begin, day_end;
-
-/* Whether weeks starts on Sunday or Monday */
-int week_starts_on_monday;
-
-/* If AM/PM indicators should be used. This may not be supported by the new
- views. */
-int am_pm_flag = 0;
-
-/* The array of color properties -- keep in sync with the enumeration defined in main.h. The color
- * values specified here are the defaults for the program.
- */
-struct color_prop color_props[] = {
- { 0x3e72, 0x35ec, 0x8ba2, N_("Outline:"), "/calendar/Colors/outline" },
- { 0xffff, 0xffff, 0xffff, N_("Headings:"), "/calendar/Colors/headings" },
- { 0xf26c, 0xecec, 0xbbe7, N_("Empty days:"), "/calendar/Colors/empty_bg" },
- { 0xfc1e, 0xf87f, 0x5f80, N_("Appointments:"), "/calendar/Colors/mark_bg" },
- { 0xd364, 0xc6b7, 0x7969, N_("Highlighted day:"), "/calendar/Colors/prelight_bg" },
- { 0x01f0, 0x01f0, 0x01f0, N_("Day numbers:"), "/calendar/Colors/day_fg" },
- { 0x0000, 0x0000, 0xffff, N_("Current day's number:"), "/calendar/Colors/current_fg" },
- { 0xbbbb, 0xbbbb, 0x0000, N_("To-Do item that is not yet due:"), "/calendar/Colors/todo_not_yet" },
- { 0xdddd, 0xbbbb, 0x0000, N_("To-Do item that is due today:"), "/calendar/Colors/todo_today" },
- { 0xbbbb, 0xdddd, 0x0000, N_("To-Do item that is overdue:"), "/calendar/Colors/todo_overdue" }
-};
-
-/* Number of active calendars */
-int active_calendars = 0;
-
-/* A list of all of the calendars started */
-GList *all_calendars = NULL;
-
-/* If set, beep on display alarms */
-gboolean beep_on_display = 0;
-
-/* If true, timeout the beeper on audio alarms */
-
-gboolean enable_aalarm_timeout = 0;
-guint audio_alarm_timeout = 0;
-const guint MAX_AALARM_TIMEOUT = 3600;
-const guint MAX_SNOOZE_SECS = 3600;
-gboolean enable_snooze = 0;
-guint snooze_secs = 60;
-
-#if 0
-CalendarAlarm alarm_defaults[4] = {
- { ALARM_MAIL, 0, 15, ALARM_MINUTES },
- { ALARM_PROGRAM, 0, 15, ALARM_MINUTES },
- { ALARM_DISPLAY, 0, 15, ALARM_MINUTES },
- { ALARM_AUDIO, 0, 15, ALARM_MINUTES }
-};
-#endif
-
-static void
-init_username (void)
-{
- user_name = g_strdup(g_get_user_name());
- full_name = g_strdup(g_get_real_name());
-}
-
-static int
-range_check_hour (int hour)
-{
- if (hour < 0)
- hour = 0;
- else if (hour >= 24)
- hour = 23;
-
- return hour;
-}
-
-#if 0
-static void
-init_default_alarms (void)
-{
- int i;
- gboolean def;
-
- alarm_defaults [ALARM_DISPLAY].type = ALARM_DISPLAY;
- alarm_defaults [ALARM_AUDIO].type = ALARM_AUDIO;
- alarm_defaults [ALARM_PROGRAM].type = ALARM_PROGRAM;
- alarm_defaults [ALARM_MAIL].type = ALARM_MAIL;
-
- for (i = 0; i < 4; i++) {
- switch (alarm_defaults [i].type) {
- case ALARM_DISPLAY:
- gnome_config_push_prefix ("/calendar/alarms/def_disp_");
- break;
- case ALARM_AUDIO:
- gnome_config_push_prefix ("/calendar/alarms/def_audio_");
- break;
- case ALARM_PROGRAM:
- gnome_config_push_prefix ("/calendar/alarms/def_prog_");
- break;
- case ALARM_MAIL:
- gnome_config_push_prefix ("/calendar/alarms/def_mail_");
- break;
- }
-
- alarm_defaults[i].enabled = gnome_config_get_int ("enabled=0");
- if (alarm_defaults[i].type != ALARM_MAIL) {
- alarm_defaults[i].count = gnome_config_get_int ("count=15");
- alarm_defaults[i].units = gnome_config_get_int ("units=0");
- } else {
- alarm_defaults[i].count = gnome_config_get_int ("count=1");
- alarm_defaults[i].count = gnome_config_get_int ("count=2");
- }
-
- alarm_defaults[i].data = gnome_config_get_string_with_default ("data=",
- &def);
- if (def)
- alarm_defaults[i].data = NULL;
-
- gnome_config_pop_prefix ();
- }
-}
-#endif
-
-static void
-about_calendar_cmd (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GtkWidget *about;
- const gchar *authors[] = {
- "Miguel de Icaza (miguel@kernel.org)",
- "Federico Mena (federico@gimp.org)",
- "Arturo Espinosa (arturo@nuclecu.unam.mx)",
- "Russell Steinthal (rms39@columbia.edu)",
- NULL
- };
-
- about = gnome_about_new (_("Gnome Calendar"), VERSION,
- "(C) 1998 the Free Software Foundation",
- authors,
- _("The GNOME personal calendar and schedule manager."),
- NULL);
- gtk_window_set_modal (GTK_WINDOW (about), TRUE);
- gnome_dialog_set_close (GNOME_DIALOG (about), TRUE);
- gtk_widget_show (about);
-}
-
-/* Callback for the new appointment command */
-static void
-new_appointment_cb (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (user_data);
- gnome_calendar_new_appointment (gcal);
-}
-
-/* Prints the calendar at its current view and time range */
-static void
-print (GnomeCalendar *gcal, gboolean preview)
-{
- time_t start;
- const char *view;
- PrintView print_view;
-
- gnome_calendar_get_current_time_range (gcal, &start, NULL);
- view = gnome_calendar_get_current_view_name (gcal);
-
- if (strcmp (view, "dayview") == 0)
- print_view = PRINT_VIEW_DAY;
- else if (strcmp (view, "workweekview") == 0 || strcmp (view, "weekview") == 0)
- print_view = PRINT_VIEW_WEEK;
- else if (strcmp (view, "monthview") == 0)
- print_view = PRINT_VIEW_MONTH;
- else {
- g_assert_not_reached ();
- print_view = PRINT_VIEW_DAY;
- }
-
- print_calendar (gcal, preview, start, print_view);
-}
-
-/* Toolbar/Print callback */
-static void
-tb_print_cb (GtkWidget *widget, gpointer data)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
- print (gcal, FALSE);
-}
-
-/* File/Print callback */
-static void
-file_print_cb (BonoboUIHandler *uih, void *data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
- print (gcal, FALSE);
-}
-
-void
-time_format_changed (void)
-{
- GList *l;
-
- for (l = all_calendars; l; l = l->next)
- gnome_calendar_time_format_changed (GNOME_CALENDAR (l->data));
-}
-
-void
-colors_changed (void)
-{
- GList *l;
-
- for (l = all_calendars; l; l = l->next)
- gnome_calendar_colors_changed (GNOME_CALENDAR (l->data));
-}
-
-void
-todo_properties_changed(void)
-{
- GList *l;
-
- for (l = all_calendars; l; l = l->next)
- gnome_calendar_todo_properties_changed (GNOME_CALENDAR (l->data));
-}
-
-/* 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 (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- set_clock_cursor (gcal);
- gnome_calendar_previous (gcal);
- set_normal_cursor (gcal);
-}
-
-static void
-next_clicked (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- set_clock_cursor (gcal);
- gnome_calendar_next (gcal);
- set_normal_cursor (gcal);
-}
-
-static void
-today_clicked (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- set_clock_cursor (gcal);
- gnome_calendar_goto_today (gcal);
- set_normal_cursor (gcal);
-}
-
-static void
-goto_clicked (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- goto_dialog (gcal);
-}
-
-static void
-show_day_view_clicked (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- gnome_calendar_set_view (gcal, "dayview");
- gtk_widget_grab_focus (gcal->day_view);
-}
-
-static void
-show_work_week_view_clicked (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- gnome_calendar_set_view (gcal, "workweekview");
- gtk_widget_grab_focus (gcal->work_week_view);
-}
-
-static void
-show_week_view_clicked (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- gnome_calendar_set_view (gcal, "weekview");
- gtk_widget_grab_focus (gcal->week_view);
-}
-
-static void
-show_month_view_clicked (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- gnome_calendar_set_view (gcal, "monthview");
- gtk_widget_grab_focus (gcal->month_view);
-}
-
-#if 0
-static void
-show_year_view_clicked (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- gnome_calendar_set_view (gcal, "yearview");
- gtk_widget_grab_focus (gcal->year_view);
-}
-#endif
-
-static void
-new_calendar_cmd (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- new_calendar (full_name, NULL, NULL, FALSE);
-}
-
-static void
-close_cmd (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- all_calendars = g_list_remove (all_calendars, gcal);
-
- gtk_widget_destroy (GTK_WIDGET (gcal));
- active_calendars--;
-
- if (active_calendars == 0)
- gtk_main_quit ();
-}
-
-
-void
-quit_cmd (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- while (all_calendars){
- GnomeCalendar *cal = GNOME_CALENDAR (all_calendars->data);
-
- close_cmd (uih, cal, path);
- }
-}
-
-
-static void
-open_ok (GtkWidget *widget, GtkFileSelection *fs)
-{
- GtkWidget *error_dialog;
- int ret;
- if(!g_file_exists (gtk_file_selection_get_filename (fs))) {
- error_dialog = gnome_message_box_new (
- _("File not found"),
- GNOME_MESSAGE_BOX_ERROR,
- GNOME_STOCK_BUTTON_OK,
- NULL);
-
- gnome_dialog_set_parent (GNOME_DIALOG (error_dialog), GTK_WINDOW (fs));
- ret = gnome_dialog_run (GNOME_DIALOG (error_dialog));
- } else {
- /* FIXME: find out who owns this calendar and use that name */
-#warning "FIXME: find out who owns this calendar and use that name"
- /*
- new_calendar ("Somebody", gtk_file_selection_get_filename (fs), NULL, NULL, FALSE);
- */
- gtk_widget_destroy (GTK_WIDGET (fs));
- }
-}
-
-static void
-open_calendar_cmd (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GtkFileSelection *fs;
-
- fs = GTK_FILE_SELECTION (gtk_file_selection_new (_("Open calendar")));
-
- gtk_signal_connect (GTK_OBJECT (fs->ok_button), "clicked",
- (GtkSignalFunc) open_ok,
- fs);
- gtk_signal_connect_object (GTK_OBJECT (fs->cancel_button), "clicked",
- (GtkSignalFunc) gtk_widget_destroy,
- GTK_OBJECT (fs));
-
- gtk_widget_show (GTK_WIDGET (fs));
- gtk_grab_add (GTK_WIDGET (fs)); /* Yes, it is modal, so sue me */
-}
-
-static void
-save_ok (GtkWidget *widget, GtkFileSelection *fs)
-{
- GnomeCalendar *gcal;
- gchar *fname;
-
- gcal = GNOME_CALENDAR (gtk_object_get_user_data (GTK_OBJECT (fs)));
- gtk_window_set_wmclass (GTK_WINDOW (gcal), "gnomecal", "gnomecal");
-
- fname = g_strdup (gtk_file_selection_get_filename (fs));
- g_free(fname);
- gtk_main_quit ();
-}
-
-static gint
-close_save (GtkWidget *w)
-{
- gtk_main_quit ();
- return TRUE;
-}
-
-static void
-save_as_calendar_cmd (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GtkFileSelection *fs;
-
- fs = GTK_FILE_SELECTION (gtk_file_selection_new (_("Save calendar")));
- gtk_object_set_user_data (GTK_OBJECT (fs), user_data);
-
- gtk_signal_connect (GTK_OBJECT (fs->ok_button), "clicked",
- (GtkSignalFunc) save_ok,
- fs);
- gtk_signal_connect_object (GTK_OBJECT (fs->cancel_button), "clicked",
- (GtkSignalFunc) close_save,
- GTK_OBJECT (fs));
- gtk_signal_connect_object (GTK_OBJECT (fs), "delete_event",
- GTK_SIGNAL_FUNC (close_save),
- GTK_OBJECT (fs));
- gtk_widget_show (GTK_WIDGET (fs));
- gtk_grab_add (GTK_WIDGET (fs)); /* Yes, it is modal, so sue me even more */
- gtk_main ();
- gtk_widget_destroy (GTK_WIDGET (fs));
-}
-
-static void
-properties_cmd (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- GnomeCalendar *gcal = GNOME_CALENDAR (user_data);
- properties (GTK_WIDGET (gcal));
-}
-
-
-static GnomeUIInfo gnome_toolbar_view_buttons [] = {
- GNOMEUIINFO_RADIOITEM (N_("Day"), N_("Show 1 day"),
- show_day_view_clicked,
- dayview_xpm),
- GNOMEUIINFO_RADIOITEM (N_("5 Days"), N_("Show the working week"),
- show_work_week_view_clicked,
- workweekview_xpm),
- GNOMEUIINFO_RADIOITEM (N_("Week"), N_("Show 1 week"),
- show_week_view_clicked,
- weekview_xpm),
- GNOMEUIINFO_RADIOITEM (N_("Month"), N_("Show 1 month"),
- show_month_view_clicked,
- monthview_xpm),
-#if 0
- GNOMEUIINFO_RADIOITEM (N_("Year"), N_("Show 1 year"),
- show_year_view_clicked,
- yearview_xpm),
-#endif
- GNOMEUIINFO_END
-};
-
-
-static GnomeUIInfo calendar_toolbar [] = {
- GNOMEUIINFO_ITEM_STOCK (N_("New"), N_("Create a new appointment"),
- new_appointment_cb, GNOME_STOCK_PIXMAP_NEW),
-
- GNOMEUIINFO_SEPARATOR,
-
- GNOMEUIINFO_ITEM_STOCK (N_("Print"), N_("Print this calendar"), tb_print_cb, GNOME_STOCK_PIXMAP_PRINT),
-
- GNOMEUIINFO_SEPARATOR,
-
- GNOMEUIINFO_ITEM_STOCK (N_("Prev"), N_("Go back in time"), previous_clicked, GNOME_STOCK_PIXMAP_BACK),
- GNOMEUIINFO_ITEM_STOCK (N_("Today"), N_("Go to present time"), today_clicked, GNOME_STOCK_PIXMAP_HOME),
- GNOMEUIINFO_ITEM_STOCK (N_("Next"), N_("Go forward in time"), next_clicked, GNOME_STOCK_PIXMAP_FORWARD),
-
- GNOMEUIINFO_SEPARATOR,
-
- GNOMEUIINFO_ITEM_STOCK (N_("Go to"), N_("Go to a specific date"), goto_clicked, GNOME_STOCK_PIXMAP_JUMP_TO),
-
- GNOMEUIINFO_SEPARATOR,
-
- GNOMEUIINFO_RADIOLIST (gnome_toolbar_view_buttons),
-
- GNOMEUIINFO_END
-};
-
-
-
-/* Performs signal connection as appropriate for interpreters or native bindings */
-static void
-do_ui_signal_connect (GnomeUIInfo *uiinfo, gchar *signal_name,
- GnomeUIBuilderData *uibdata)
-{
- if (uibdata->is_interp)
- gtk_signal_connect_full (GTK_OBJECT (uiinfo->widget),
- signal_name, NULL, uibdata->relay_func,
- uibdata->data ?
- uibdata->data : uiinfo->user_data,
- uibdata->destroy_func, FALSE, FALSE);
-
- else if (uiinfo->moreinfo)
- gtk_signal_connect (GTK_OBJECT (uiinfo->widget),
- signal_name, uiinfo->moreinfo, uibdata->data ?
- uibdata->data : uiinfo->user_data);
-}
-
-
-void
-calendar_control_activate (BonoboControl *control,
- GnomeCalendar *cal)
-{
- Bonobo_UIHandler remote_uih;
- GtkWidget *toolbar, *toolbar_frame;
- BonoboControl *toolbar_control;
- GnomeUIBuilderData uibdata;
- BonoboUIHandler *uih;
- gchar *page_name;
- gint button, i;
- int behavior;
-
- uih = bonobo_control_get_ui_handler (control);
- g_assert (uih != NULL);
-
- uibdata.connect_func = do_ui_signal_connect;
- uibdata.data = cal;
- uibdata.is_interp = FALSE;
- uibdata.relay_func = NULL;
- uibdata.destroy_func = NULL;
-
- g_print ("In calendar_control_activate\n");
-
- remote_uih = bonobo_control_get_remote_ui_handler (control);
- bonobo_ui_handler_set_container (uih, remote_uih);
- bonobo_object_release_unref (remote_uih, NULL);
-
- toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL,
- GTK_TOOLBAR_BOTH);
- gnome_app_fill_toolbar_custom (GTK_TOOLBAR (toolbar),
- calendar_toolbar, &uibdata,
- /*app->accel_group*/ NULL);
-
- /*gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));*/
-
- for (i = 0; i < GNOME_CALENDAR_NUM_VIEWS; i++)
- cal->view_toolbar_buttons[i] = gnome_toolbar_view_buttons[i].widget;
-
- /* Note that these indices should correspond with the button indices
- in gnome_toolbar_view_buttons. */
- page_name = gnome_calendar_get_current_view_name (cal);
- if (!strcmp (page_name, "dayview")) {
- button = 0;
- } else if (!strcmp (page_name, "workweekview")) {
- button = 1;
- } else if (!strcmp (page_name, "weekview")) {
- button = 2;
- } else if (!strcmp (page_name, "monthview")) {
- button = 3;
-#if 0
- } else if (!strcmp (page_name, "yearview")) {
- button = 4;
-#endif
- } else {
- g_warning ("Unknown calendar view: %s", page_name);
- button = 0;
- }
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cal->view_toolbar_buttons[button]), TRUE);
-
- gtk_widget_show_all (toolbar);
-
- toolbar_frame = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (GTK_FRAME (toolbar_frame), GTK_SHADOW_OUT);
- gtk_container_add (GTK_CONTAINER (toolbar_frame), toolbar);
- gtk_widget_show (toolbar_frame);
-
- gtk_widget_show_all (toolbar_frame);
-
- behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL;
-
- if (!gnome_preferences_get_toolbar_detachable ())
- behavior |= GNOME_DOCK_ITEM_BEH_LOCKED;
-
- toolbar_control = bonobo_control_new (toolbar_frame);
-
- bonobo_ui_handler_dock_add (uih, "/Toolbar",
- bonobo_object_corba_objref (BONOBO_OBJECT (toolbar_control)),
- behavior,
- GNOME_DOCK_TOP,
- 1, 1, 0);
-
- /* file menu */
- bonobo_ui_handler_menu_new_item (uih, "/File/New/Calendar", N_("New Ca_lendar"),
- N_("Create a new calendar"),
- -1, BONOBO_UI_HANDLER_PIXMAP_NONE,
- NULL, 0, 0, new_calendar_cmd, cal);
- bonobo_ui_handler_menu_new_item (uih, "/File/Open/Calendar", N_("Open Ca_lendar"),
- N_("Open a calendar"), -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0, open_calendar_cmd, cal);
- bonobo_ui_handler_menu_new_item (uih, "/File/Save Calendar As",
- N_("Save Calendar As"),
- N_("Save Calendar As"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0, save_as_calendar_cmd, cal);
- bonobo_ui_handler_menu_new_item (uih, "/File/Print", N_("Print..."),
- N_("Print this calendar"), -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_PIXMAP_PRINT,
- 'p', GDK_CONTROL_MASK,
- file_print_cb, cal);
-
- /* edit menu */
- bonobo_ui_handler_menu_new_item (uih, "/Edit/New Appointment",
- N_("_New appointment..."), N_("Create a new appointment"),
- -1, BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_NEW, 0, 0,
- new_appointment_cb, cal);
-
- //bonobo_ui_handler_menu_new_separator (uih, "/Edit", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/Edit/Preferences",
- N_("Preferences"), N_("Preferences"),
- -1, BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0, properties_cmd, cal);
- /* help menu */
-
- bonobo_ui_handler_menu_new_item (uih,
- "/Help/About Calendar",
- N_("About Calendar"),
- N_("About Calendar"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0, about_calendar_cmd, cal);
-
-}
-
-
-void
-calendar_control_deactivate (BonoboControl *control)
-{
- BonoboUIHandler *uih = bonobo_control_get_ui_handler (control);
- g_assert (uih);
-
- g_print ("In calendar_control_deactivate\n");
-
- bonobo_ui_handler_dock_remove (uih, "/Toolbar");
- bonobo_ui_handler_unset_container (uih);
-}
-
-
-
-
-static gint
-calendar_close_event (GtkWidget *widget, GdkEvent *event, GnomeCalendar *gcal)
-{
- close_cmd (NULL, gcal, NULL);
- return TRUE;
-}
-
-
-GnomeCalendar *
-new_calendar (char *full_name, char *geometry, char *page, gboolean hidden)
-{
- GtkWidget *toplevel;
- char title[128];
- int xpos, ypos, width, height;
-
-
- /* i18n: This "%s%s" indicates possession. Languages where the order is
- * the inverse should translate it to "%2$s%1$s".
- */
- g_snprintf(title, 128, _("%s%s"), full_name, _("'s calendar"));
-
- toplevel = gnome_calendar_new (title);
-
- if (gnome_parse_geometry (geometry, &xpos, &ypos, &width, &height)){
- if (xpos != -1)
- gtk_widget_set_uposition (toplevel, xpos, ypos);
- }
-
- if (page)
- gnome_calendar_set_view (GNOME_CALENDAR (toplevel), page);
-
- gtk_signal_connect (GTK_OBJECT (toplevel), "delete_event",
- GTK_SIGNAL_FUNC(calendar_close_event), toplevel);
-
- active_calendars++;
- all_calendars = g_list_prepend (all_calendars, toplevel);
-
- if (hidden){
- GnomeWinState state;
-
- /* Realize the toplevel window to prevent a segfault */
- gtk_widget_realize (toplevel);
- state = gnome_win_hints_get_state (toplevel);
-
- state |= WIN_STATE_MINIMIZED;
- gnome_win_hints_set_state (toplevel, state);
- }
-
- gtk_widget_show (toplevel);
-
- return GNOME_CALENDAR (toplevel);
-}
-
-
-void calendar_set_uri (GnomeCalendar *gcal, char *calendar_file)
-{
- gboolean success;
-
- g_return_if_fail (gcal);
- g_return_if_fail (calendar_file);
-
- printf ("calendar_set_uri: calendar_file is '%s'\n", calendar_file);
-
- success = gnome_calendar_open (gcal,
- calendar_file,
- CALENDAR_OPEN_OR_CREATE);
-
- printf (" load or create returned %d\n", success);
-}
-
-
-
-
-
-/*
- * Initializes the calendar internal variables, loads defaults
- */
-void
-init_calendar (void)
-{
- int i;
- char *cspec, *color;
- char *str;
-
- init_username ();
- /*user_calendar_file = g_concat_dir_and_file (gnome_util_user_home (), ".gnome/user-cal.vcf");*/
-
- gnome_config_push_prefix (calendar_settings);
-
- /* Read calendar settings */
-
- day_begin = range_check_hour (gnome_config_get_int ("/calendar/Calendar/Day start=8"));
- day_end = range_check_hour (gnome_config_get_int ("/calendar/Calendar/Day end=17"));
- am_pm_flag = gnome_config_get_bool ("/calendar/Calendar/AM PM flag=0");
- week_starts_on_monday = gnome_config_get_bool ("/calendar/Calendar/Week starts on Monday=0");
-
- if (day_end < day_begin){
- day_begin = 8;
- day_end = 17;
- }
-
- /* Read color settings */
-
- for (i = 0; i < COLOR_PROP_LAST; i++) {
- cspec = build_color_spec (color_props[i].r, color_props[i].g, color_props[i].b);
- str = g_strconcat (color_props[i].key, "=", cspec, NULL);
-
- color = gnome_config_get_string (str);
- parse_color_spec (color, &color_props[i].r, &color_props[i].g, &color_props[i].b);
-
- g_free (str);
- g_free (color);
- }
-
- /* read todolist settings */
-
- todo_show_time_remaining = gnome_config_get_bool("/calendar/Todo/show_time_remain");
- todo_show_due_date = gnome_config_get_bool("/calendar/Todo/show_due_date");
-
- todo_item_dstatus_highlight_overdue = gnome_config_get_bool("/calendar/Todo/highlight_overdue");
-
- todo_item_dstatus_highlight_due_today = gnome_config_get_bool("/calendar/Todo/highlight_due_today");
-
- todo_item_dstatus_highlight_not_due_yet = gnome_config_get_bool("/calendar/Todo/highlight_not_due_yet");
-
- todo_current_sort_column = gnome_config_get_int("/calendar/Todo/sort_column");
-
- todo_current_sort_type = gnome_config_get_int("/calendar/Todo/sort_type");
-
- todo_show_priority = gnome_config_get_bool("/calendar/Todo/show_priority");
-
- /* read alarm settings */
- beep_on_display = gnome_config_get_bool ("/calendar/alarms/beep_on_display=FALSE");
- enable_aalarm_timeout = gnome_config_get_bool ("/calendar/alarms/enable_audio_timeout=FALSE");
- audio_alarm_timeout = gnome_config_get_int ("/calendar/alarms/audio_alarm_timeout=60");
- if (audio_alarm_timeout < 1)
- audio_alarm_timeout = 1;
- if (audio_alarm_timeout > MAX_AALARM_TIMEOUT)
- audio_alarm_timeout = MAX_AALARM_TIMEOUT;
- enable_snooze = gnome_config_get_bool ("/calendar/alarms/enable_snooze=FALSE");
- snooze_secs = gnome_config_get_int ("/calendar/alarms/snooze_secs=300");
- if (snooze_secs < 1)
- snooze_secs = 1;
- if (snooze_secs > MAX_SNOOZE_SECS)
- snooze_secs = MAX_SNOOZE_SECS;
-
-#if 0
- init_default_alarms ();
-#endif
-
- /* Done */
-
- gnome_config_pop_prefix ();
-}
diff --git a/calendar/gui/calendar-commands.h b/calendar/gui/calendar-commands.h
deleted file mode 100644
index f48ba333bc..0000000000
--- a/calendar/gui/calendar-commands.h
+++ /dev/null
@@ -1,125 +0,0 @@
-#ifndef CALENDAR_COMMANDS_H
-#define CALENDAR_COMMANDS_H
-
-#include <bonobo/bonobo-control.h>
-#include "gnome-cal.h"
-
-/* This enum and the following array define the color preferences */
-
-typedef enum {
- COLOR_PROP_OUTLINE_COLOR, /* Color of calendar outline */
- COLOR_PROP_HEADING_COLOR, /* Color for headings */
- COLOR_PROP_EMPTY_DAY_BG, /* Background color for empty days */
- COLOR_PROP_MARK_DAY_BG, /* Background color for days with appointments */
- COLOR_PROP_PRELIGHT_DAY_BG, /* Background color for prelighted day */
- COLOR_PROP_DAY_FG, /* Color for day numbers */
- COLOR_PROP_CURRENT_DAY_FG, /* Color for current day's number */
- COLOR_PROP_TODO_NOT_DUE_YET, /* Color for Todo items not yet due */
- COLOR_PROP_TODO_DUE_TODAY, /* Color for Todo items due today */
- COLOR_PROP_TODO_OVERDUE, /* Color for Todo items that are overdue */
- COLOR_PROP_LAST /* Number of color properties */
-} ColorProp;
-
-struct color_prop {
- int r; /* Values are in [0, 65535] */
- int g;
- int b;
- char *label; /* Label for properties dialog */
- char *key; /* Key for gnome_config */
-};
-
-extern struct color_prop color_props[];
-
-
-#define COOKIE_USER_HOME_DIR ((char *) -1)
-
-
-/* Calendar preferences */
-
-extern int day_begin, day_end;
-extern char *user_name;
-extern int am_pm_flag;
-extern int week_starts_on_monday;
-
-/* todo preferences */
-extern int todo_show_due_date;
-
-extern int todo_item_dstatus_highlight_overdue;
-extern int todo_item_dstatus_highlight_due_today;
-extern int todo_item_dstatus_highlight_not_due_yet;
-
-extern int todo_show_time_remaining;
-extern int todo_show_priority;
-extern char *todo_overdue_font_text;
-extern gboolean todo_style_changed;
-extern gint todo_current_sort_column;
-extern gint todo_current_sort_type;
-
-/* alarm stuff */
-#if 0
-extern CalendarAlarm alarm_defaults[4];
-#endif
-extern gboolean beep_on_display;
-extern gboolean enable_aalarm_timeout;
-extern guint audio_alarm_timeout;
-extern const guint MAX_AALARM_TIMEOUT;
-extern gboolean enable_snooze;
-extern guint snooze_secs;
-extern const guint MAX_SNOOZE_SECS;
-
-/* Creates and runs the preferences dialog box */
-void properties (GtkWidget *toplevel);
-
-/* Asks for all the time-related displays to be updated when the user changes the time format
- * preferences.
- */
-void time_format_changed (void);
-
-/* Asks for all the month items' colors to be reset */
-void colors_changed (void);
-
-/* Asks for all todo lists to reflect the accurate properties */
-void todo_properties_changed(void);
-
-/* Creates and runs the Go-to date dialog */
-void goto_dialog (GnomeCalendar *gcal);
-
-/* Returns a pointer to a statically-allocated string with a representation of the specified color.
- * Values must be in [0, 65535].
- */
-char *build_color_spec (int r, int g, int b);
-
-/* Parses a color specification of the form "#%04x%04x%04x" and returns the color components. */
-void parse_color_spec (char *spec, int *r, int *g, int *b);
-
-/* Calls build_color_spec() for the color in the specified property number */
-char *color_spec_from_prop (ColorProp propnum);
-
-GnomeCalendar *new_calendar (char *full_name,
- char *geometry,
- char *page,
- gboolean hidden);
-
-void calendar_set_uri (GnomeCalendar *gcal, char *calendar_file);
-
-
-/*----------------------------------------------------------------------*/
-/* FIXME -- where should this stuff go? */
-/*----------------------------------------------------------------------*/
-
-void init_calendar (void);
-
-void calendar_control_activate (BonoboControl *control,
- GnomeCalendar *cal);
-void calendar_control_deactivate (BonoboControl *control);
-
-void quit_cmd (BonoboUIHandler *uih, void *user_data, const char *path);
-
-/*extern char *user_calendar_file;*/
-extern char *user_name;
-extern char *full_name;
-extern int debug_alarms;
-extern int active_calendars;
-extern GList *all_calendars;
-
-#endif /* CALENDAR_COMMANDS_H */
diff --git a/calendar/gui/calendar-component.c b/calendar/gui/calendar-component.c
deleted file mode 100644
index 8644b8928c..0000000000
--- a/calendar/gui/calendar-component.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* component-factory.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#include <config.h>
-#include <bonobo.h>
-#include "evolution-shell-component.h"
-#include "component-factory.h"
-#include "control-factory.h"
-
-
-
-#ifdef USING_OAF
-#define COMPONENT_FACTORY_ID "OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921"
-#else
-#define COMPONENT_FACTORY_ID "evolution-shell-component-factory:evolution-calendar"
-#endif
-
-static BonoboGenericFactory *factory = NULL;
-
-static const EvolutionShellComponentFolderType folder_types[] = {
- { "calendar", "evolution-calendar.png" },
- { NULL, NULL }
-};
-
-
-/* EvolutionShellComponent methods and signals. */
-
-static EvolutionShellComponentResult
-create_view (EvolutionShellComponent *shell_component,
- const char *physical_uri,
- const char *type,
- BonoboControl **control_return,
- void *closure)
-{
- BonoboControl *control;
-
- if (g_strcasecmp (type, "calendar") != 0)
- return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE;
-
- control = control_factory_new_control ();
- bonobo_control_set_property (control, "folder_uri", physical_uri, NULL);
-
- *control_return = control;
-
- return EVOLUTION_SHELL_COMPONENT_OK;
-}
-
-static gint owner_count = 0;
-
-static void
-owner_set_cb (EvolutionShellComponent *shell_component,
- Evolution_Shell shell_interface,
- const char *evolution_homedir)
-{
- owner_count ++;
-}
-
-static void
-owner_unset_cb (EvolutionShellComponent *shell_component,
- Evolution_Shell shell_interface,
- EvolutionShellClient shell_client,
- void *data)
-{
- owner_count --;
- if (owner_count <= 0)
- gtk_main_quit();
-}
-
-
-/* The factory function. */
-
-static BonoboObject *
-factory_fn (BonoboGenericFactory *factory,
- void *closure)
-{
- EvolutionShellComponent *shell_component;
-
- shell_component = evolution_shell_component_new (folder_types, create_view, NULL, NULL, NULL, NULL);
-
- gtk_signal_connect (GTK_OBJECT (shell_component), "owner_set",
- GTK_SIGNAL_FUNC (owner_set_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (shell_component), "owner_unset",
- GTK_SIGNAL_FUNC (owner_unset_cb), NULL);
-
- return BONOBO_OBJECT (shell_component);
-}
-
-
-void
-component_factory_init (void)
-{
- if (factory != NULL)
- return;
-
- factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, factory_fn, NULL);
-
- if (factory == NULL)
- g_error ("Cannot initialize Evolution's calendar component.");
-}
diff --git a/calendar/gui/calendar-component.h b/calendar/gui/calendar-component.h
deleted file mode 100644
index f83a849452..0000000000
--- a/calendar/gui/calendar-component.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* component-factory.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _COMPONENT_FACTORY_H_
-#define _COMPONENT_FACTORY_H_
-
-void component_factory_init (void);
-
-#endif /* _COMPONENT_FACTORY_H_ */
diff --git a/calendar/gui/calendar-control.gnorba b/calendar/gui/calendar-control.gnorba
deleted file mode 100644
index ed504d8f5b..0000000000
--- a/calendar/gui/calendar-control.gnorba
+++ /dev/null
@@ -1,11 +0,0 @@
-[control-factory:calendar]
-type=exe
-repo_id=IDL:Bonobo/GenericFactory:1.0
-description=Factory for the sample Calendar control
-location_info=evolution-calendar
-
-[control:calendar]
-type=factory
-repo_id=IDL:BonoboControl/calendar-control:1.0 IDL:Bonobo/Control:1.0
-description=A sample Bonobo control which displays an calendar.
-location_info=control-factory:calendar
diff --git a/calendar/gui/calendar-control.oafinfo b/calendar/gui/calendar-control.oafinfo
deleted file mode 100644
index fb0f138caf..0000000000
--- a/calendar/gui/calendar-control.oafinfo
+++ /dev/null
@@ -1,28 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:calendar:f4f90989-0f50-4af2-ad94-8bbdf331f0bc"
- type="exe"
- location="evolution-calendar">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the sample Calendar control"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:calendar:dd34ddae-25c6-486b-a8a8-3e8f0286b54c"
- type="factory"
- location="OAFIID:control-factory:calendar:f4f90989-0f50-4af2-ad94-8bbdf331f0bc">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/calendar-control:1.0"/>
- <item value="IDL:Bonobo/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="A sample Bonobo control which displays an calendar."/>
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/calendar-model.c b/calendar/gui/calendar-model.c
deleted file mode 100644
index a39044f7e6..0000000000
--- a/calendar/gui/calendar-model.c
+++ /dev/null
@@ -1,1782 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* Evolution calendar - Data model for ETable
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-/* We need this for strptime. */
-#define _XOPEN_SOURCE
-
-#include <config.h>
-#include <ctype.h>
-#include <math.h>
-#undef _XOPEN_SOURCE
-#include <sys/time.h>
-#define _XOPEN_SOURCE
-#include <time.h>
-#include <gnome.h>
-#include <cal-util/timeutil.h>
-#include "calendar-model.h"
-#include "calendar-commands.h"
-
-
-
-/* Private part of the ECalendarModel structure */
-typedef struct {
- /* Calendar client we are using */
- CalClient *client;
-
- /* Types of objects we are dealing with */
- CalObjType type;
-
- /* Array of pointers to calendar objects */
- GArray *objects;
-
- /* UID -> array index hash */
- GHashTable *uid_index_hash;
-
- /* HACK: so that ETable can do its stupid append_row() thing */
- guint appending_row : 1;
-} CalendarModelPrivate;
-
-
-
-static void calendar_model_class_init (CalendarModelClass *class);
-static void calendar_model_init (CalendarModel *model);
-static void calendar_model_destroy (GtkObject *object);
-
-static int calendar_model_column_count (ETableModel *etm);
-static int calendar_model_row_count (ETableModel *etm);
-static void *calendar_model_value_at (ETableModel *etm, int col, int row);
-static void calendar_model_set_value_at (ETableModel *etm, int col, int row, const void *value);
-static gboolean calendar_model_is_cell_editable (ETableModel *etm, int col, int row);
-static void calendar_model_append_row (ETableModel *etm, ETableModel *source, gint row);
-static void *calendar_model_duplicate_value (ETableModel *etm, int col, const void *value);
-static void calendar_model_free_value (ETableModel *etm, int col, void *value);
-static void *calendar_model_initialize_value (ETableModel *etm, int col);
-static gboolean calendar_model_value_is_empty (ETableModel *etm, int col, const void *value);
-#if 0
-static char * calendar_model_value_to_string (ETableModel *etm, int col, const void *value);
-#endif
-static void load_objects (CalendarModel *model);
-static int remove_object (CalendarModel *model, const char *uid);
-
-static ETableModelClass *parent_class;
-
-
-
-/**
- * calendar_model_get_type:
- * @void:
- *
- * Registers the #CalendarModel class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #CalendarModel class.
- **/
-GtkType
-calendar_model_get_type (void)
-{
- static GtkType calendar_model_type = 0;
-
- if (!calendar_model_type) {
- static GtkTypeInfo calendar_model_info = {
- "CalendarModel",
- sizeof (CalendarModel),
- sizeof (CalendarModelClass),
- (GtkClassInitFunc) calendar_model_class_init,
- (GtkObjectInitFunc) calendar_model_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- calendar_model_type = gtk_type_unique (E_TABLE_MODEL_TYPE, &calendar_model_info);
- }
-
- return calendar_model_type;
-}
-
-/* Class initialization function for the calendar table model */
-static void
-calendar_model_class_init (CalendarModelClass *class)
-{
- GtkObjectClass *object_class;
- ETableModelClass *etm_class;
-
- object_class = (GtkObjectClass *) class;
- etm_class = (ETableModelClass *) class;
-
- parent_class = gtk_type_class (E_TABLE_MODEL_TYPE);
-
- object_class->destroy = calendar_model_destroy;
-
- etm_class->column_count = calendar_model_column_count;
- etm_class->row_count = calendar_model_row_count;
- etm_class->value_at = calendar_model_value_at;
- etm_class->set_value_at = calendar_model_set_value_at;
- etm_class->is_cell_editable = calendar_model_is_cell_editable;
- etm_class->append_row = calendar_model_append_row;
- etm_class->duplicate_value = calendar_model_duplicate_value;
- etm_class->free_value = calendar_model_free_value;
- etm_class->initialize_value = calendar_model_initialize_value;
- etm_class->value_is_empty = calendar_model_value_is_empty;
-#if 0
- etm_class->value_to_string = calendar_model_value_to_string;
-#endif
-}
-
-/* Object initialization function for the calendar table model */
-static void
-calendar_model_init (CalendarModel *model)
-{
- CalendarModelPrivate *priv;
-
- priv = g_new0 (CalendarModelPrivate, 1);
- model->priv = priv;
-
- priv->objects = g_array_new (FALSE, TRUE, sizeof (CalComponent *));
- priv->uid_index_hash = g_hash_table_new (g_str_hash, g_str_equal);
-}
-
-/* Called from g_hash_table_foreach_remove(), frees a stored UID->index
- * mapping.
- */
-static gboolean
-free_uid_index (gpointer key, gpointer value, gpointer data)
-{
- int *idx;
-
- idx = value;
- g_free (idx);
-
- return TRUE;
-}
-
-/* Frees the objects stored in the calendar model */
-static void
-free_objects (CalendarModel *model)
-{
- CalendarModelPrivate *priv;
- int i;
-
- priv = model->priv;
-
- g_hash_table_foreach_remove (priv->uid_index_hash, free_uid_index, NULL);
-
- for (i = 0; i < priv->objects->len; i++) {
- CalComponent *comp;
-
- comp = g_array_index (priv->objects, CalComponent *, i);
- g_assert (comp != NULL);
- gtk_object_unref (GTK_OBJECT (comp));
- }
-
- g_array_set_size (priv->objects, 0);
-}
-
-/* Destroy handler for the calendar table model */
-static void
-calendar_model_destroy (GtkObject *object)
-{
- CalendarModel *model;
- CalendarModelPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CALENDAR_MODEL (object));
-
- model = CALENDAR_MODEL (object);
- priv = model->priv;
-
- /* Free the calendar client interface object */
-
- if (priv->client) {
- gtk_signal_disconnect_by_data (GTK_OBJECT (priv->client), model);
- gtk_object_unref (GTK_OBJECT (priv->client));
- priv->client = NULL;
- }
-
- /* Free the uid->index hash data and the array of UIDs */
-
- free_objects (model);
-
- g_hash_table_destroy (priv->uid_index_hash);
- priv->uid_index_hash = NULL;
-
- g_array_free (priv->objects, TRUE);
- priv->objects = NULL;
-
- /* Free the private structure */
-
- g_free (priv);
- model->priv = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-
-/* ETableModel methods */
-
-/* column_count handler for the calendar table model */
-static int
-calendar_model_column_count (ETableModel *etm)
-{
- return CAL_COMPONENT_FIELD_NUM_FIELDS;
-}
-
-/* row_count handler for the calendar table model */
-static int
-calendar_model_row_count (ETableModel *etm)
-{
- CalendarModel *model;
- CalendarModelPrivate *priv;
-
- model = CALENDAR_MODEL (etm);
- priv = model->priv;
-
- return priv->objects->len;
-}
-
-/* Creates a nice string representation of a time value */
-static char*
-get_time_t (time_t *t, gboolean skip_midnight)
-{
- static char buffer[32];
- struct tm *tmp_tm;
-
- if (*t <= 0) {
- buffer[0] = '\0';
- } else {
- tmp_tm = localtime (t);
-
- if (skip_midnight && tmp_tm->tm_hour == 0
- && tmp_tm->tm_min == 0 && tmp_tm->tm_sec == 0)
- strftime (buffer, 32, "%a %x", tmp_tm);
- else
- strftime (buffer, 32, "%a %x %T", tmp_tm);
- }
-
- return buffer;
-}
-
-/* Builds a string based on the list of CATEGORIES properties of a calendar
- * component.
- */
-static char *
-get_categories (CalComponent *comp)
-{
- GSList *categories;
- GString *str;
- char *s;
- GSList *l;
-
- cal_component_get_categories_list (comp, &categories);
-
- str = g_string_new (NULL);
-
- for (l = categories; l; l = l->next) {
- const char *category;
-
- category = l->data;
- g_string_append (str, category);
-
- if (l->next != NULL)
- g_string_append (str, ", ");
- }
-
- s = str->str;
-
- g_string_free (str, FALSE);
- cal_component_free_categories_list (categories);
-
- return s;
-}
-
-/* Returns a string based on the CLASSIFICATION property of a calendar component */
-static char *
-get_classification (CalComponent *comp)
-{
- CalComponentClassification classif;
-
- cal_component_get_classification (comp, &classif);
-
- switch (classif) {
- case CAL_COMPONENT_CLASS_NONE:
- return "";
-
- case CAL_COMPONENT_CLASS_PUBLIC:
- return _("Public");
-
- case CAL_COMPONENT_CLASS_PRIVATE:
- return _("Private");
-
- case CAL_COMPONENT_CLASS_CONFIDENTIAL:
- return _("Confidential");
-
- case CAL_COMPONENT_CLASS_UNKNOWN:
- return _("Unknown");
-
- default:
- g_assert_not_reached ();
- return NULL;
- }
-}
-
-/* Builds a string for the COMPLETED property of a calendar component */
-static char *
-get_completed (CalComponent *comp)
-{
- struct icaltimetype *completed;
- time_t t;
-
- cal_component_get_completed (comp, &completed);
-
- if (!completed)
- t = 0;
- else {
- t = time_from_icaltimetype (*completed);
- cal_component_free_icaltimetype (completed);
- }
-
- return get_time_t (&t, FALSE);
-}
-
-/* Builds a string for and frees a date/time value */
-static char *
-get_and_free_datetime (CalComponentDateTime dt)
-{
- time_t t;
-
- if (!dt.value)
- t = 0;
- else
- t = time_from_icaltimetype (*dt.value);
-
- cal_component_free_datetime (&dt);
-
- return get_time_t (&t, FALSE);
-}
-
-/* Builds a string for the DTEND property of a calendar component */
-static char *
-get_dtend (CalComponent *comp)
-{
- CalComponentDateTime dt;
-
- cal_component_get_dtend (comp, &dt);
- return get_and_free_datetime (dt);
-}
-
-/* Builds a string for the DTSTART property of a calendar component */
-static char *
-get_dtstart (CalComponent *comp)
-{
- CalComponentDateTime dt;
-
- cal_component_get_dtstart (comp, &dt);
- return get_and_free_datetime (dt);
-}
-
-/* Builds a string for the DUE property of a calendar component */
-static char *
-get_due (CalComponent *comp)
-{
- CalComponentDateTime dt;
-
- cal_component_get_due (comp, &dt);
- return get_and_free_datetime (dt);
-}
-
-/* Builds a string for the GEO property of a calendar component */
-static char*
-get_geo (CalComponent *comp)
-{
- struct icalgeotype *geo;
- static gchar buf[32];
-
- cal_component_get_geo (comp, &geo);
-
- if (!geo)
- buf[0] = '\0';
- else {
- 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"));
- cal_component_free_geo (geo);
- }
-
- return buf;
-}
-
-/* Builds a string for the PERCENT property of a calendar component */
-static char *
-get_percent (CalComponent *comp)
-{
- int *percent;
- static char buf[32];
-
- cal_component_get_percent (comp, &percent);
-
- if (!percent)
- buf[0] = '\0';
- else {
- g_snprintf (buf, sizeof (buf), "%d%%", *percent);
- cal_component_free_percent (percent);
- }
-
- return buf;
-}
-
-/* Builds a string for the PRIORITY property of a calendar component */
-static char *
-get_priority (CalComponent *comp)
-{
- int *priority;
- static char buf[32];
-
- cal_component_get_priority (comp, &priority);
-
- if (!priority)
- buf[0] = '\0';
- else {
- g_snprintf (buf, sizeof (buf), "%d", *priority);
- cal_component_free_priority (priority);
- }
-
- return buf;
-}
-
-/* Builds a string for the SUMMARY property of a calendar component */
-static char *
-get_summary (CalComponent *comp)
-{
- CalComponentText summary;
-
- cal_component_get_summary (comp, &summary);
-
- if (summary.value)
- return (char *) summary.value;
- else
- return "";
-}
-
-/* Builds a string for the TRANSPARENCY property of a calendar component */
-static char *
-get_transparency (CalComponent *comp)
-{
- CalComponentTransparency transp;
-
- cal_component_get_transparency (comp, &transp);
-
- switch (transp) {
- case CAL_COMPONENT_TRANSP_NONE:
- return "";
-
- case CAL_COMPONENT_TRANSP_TRANSPARENT:
- return _("Transparent");
-
- case CAL_COMPONENT_TRANSP_OPAQUE:
- return _("Opaque");
-
- case CAL_COMPONENT_TRANSP_UNKNOWN:
- return _("Unknown");
-
- default:
- g_assert_not_reached ();
- return NULL;
- }
-}
-
-/* Builds a string for the URL property of a calendar component */
-static char *
-get_url (CalComponent *comp)
-{
- const char *url;
-
- cal_component_get_url (comp, &url);
-
- if (url)
- return (char *) url;
- else
- return "";
-}
-
-/* Returns whether the component has any alarms defined for it */
-static gboolean
-get_has_alarms (CalComponent *comp)
-{
- CalComponentAlarm *alarm;
- gboolean retval;
-
- alarm = cal_component_get_first_alarm (comp);
- retval = (alarm != NULL);
-
- cal_component_alarm_free (alarm);
- return retval;
-}
-
-/* Returns whether the component has any recurrences defined for it */
-static gboolean
-get_has_recurrences (CalComponent *comp)
-{
- return cal_component_has_rdates (comp) || cal_component_has_rrules (comp);
-}
-
-/* Returns whether the completion date has been set on a component */
-static gboolean
-get_is_complete (CalComponent *comp)
-{
- struct icaltimetype *t;
- gboolean retval;
-
- cal_component_get_completed (comp, &t);
- retval = (t != NULL);
-
- cal_component_free_icaltimetype (t);
- return retval;
-}
-
-/* Returns whether a calendar component is overdue.
- *
- * FIXME: This will only get called when the component is scrolled into the
- * ETable. There should be some sort of dynamic update thingy for if a component
- * becomes overdue while it is being viewed.
- */
-static gboolean
-get_is_overdue (CalComponent *comp)
-{
- CalComponentDateTime dt;
- gboolean retval;
-
- cal_component_get_due (comp, &dt);
-
- /* First, do we have a due date? */
-
- if (!dt.value)
- retval = FALSE;
- else {
- struct icaltimetype *completed;
- time_t t;
-
- /* Second, is it already completed? */
-
- cal_component_get_completed (comp, &completed);
-
- if (completed) {
- retval = FALSE;
-
- cal_component_free_icaltimetype (completed);
- goto out;
- }
-
- /* Third, are we overdue as of right now?
- *
- * FIXME: should we check the PERCENT as well? If it is at 100%
- * but the COMPLETED property is not set, is the component
- * really overdue?
- **/
-
- t = time_from_icaltimetype (*dt.value);
-
- if (t < time (NULL))
- retval = TRUE;
- else
- retval = FALSE;
- }
-
- out:
-
- cal_component_free_datetime (&dt);
-
- return retval;
-}
-
-/* value_at handler for the calendar table model */
-static void *
-calendar_model_value_at (ETableModel *etm, int col, int row)
-{
- CalendarModel *model;
- CalendarModelPrivate *priv;
- CalComponent *comp;
-
- model = CALENDAR_MODEL (etm);
- priv = model->priv;
-
- g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, NULL);
- g_return_val_if_fail (row >= 0 && row < priv->objects->len, NULL);
-
- comp = g_array_index (priv->objects, CalComponent *, row);
- g_assert (comp != NULL);
-
- switch (col) {
- case CAL_COMPONENT_FIELD_CATEGORIES:
- return get_categories (comp);
-
- case CAL_COMPONENT_FIELD_CLASSIFICATION:
- return get_classification (comp);
-
- case CAL_COMPONENT_FIELD_COMPLETED:
- return get_completed (comp);
-
- case CAL_COMPONENT_FIELD_DTEND:
- return get_dtend (comp);
-
- case CAL_COMPONENT_FIELD_DTSTART:
- return get_dtstart (comp);
-
- case CAL_COMPONENT_FIELD_DUE:
- return get_due (comp);
-
- case CAL_COMPONENT_FIELD_GEO:
- return get_geo (comp);
-
- case CAL_COMPONENT_FIELD_PERCENT:
- return get_percent (comp);
-
- case CAL_COMPONENT_FIELD_PRIORITY:
- return get_priority (comp);
-
- case CAL_COMPONENT_FIELD_SUMMARY:
- return get_summary (comp);
-
- case CAL_COMPONENT_FIELD_TRANSPARENCY:
- return get_transparency (comp);
-
- case CAL_COMPONENT_FIELD_URL:
- return get_url (comp);
-
- case CAL_COMPONENT_FIELD_HAS_ALARMS:
- return GINT_TO_POINTER (get_has_alarms (comp));
-
- case CAL_COMPONENT_FIELD_ICON:
- /* FIXME: Also support 'Assigned to me' & 'Assigned to someone
- else'. */
- if (get_has_recurrences (comp))
- return GINT_TO_POINTER (1);
- else
- return GINT_TO_POINTER (0);
-
- case CAL_COMPONENT_FIELD_COMPLETE:
- return GINT_TO_POINTER (get_is_complete (comp));
-
- case CAL_COMPONENT_FIELD_RECURRING:
- return GINT_TO_POINTER (get_has_recurrences (comp));
-
- case CAL_COMPONENT_FIELD_OVERDUE:
- return GINT_TO_POINTER (get_is_overdue (comp));
-
- case CAL_COMPONENT_FIELD_COLOR:
- if (get_is_overdue (comp))
- return "red";
- else
- return NULL;
-
- default:
- g_message ("calendar_model_value_at(): Requested invalid column %d", col);
- return NULL;
- }
-}
-
-/* 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;
-}
-
-
-/* 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_date_warning (void)
-{
- GtkWidget *dialog;
- char buffer[32], message[256];
- time_t t;
- struct tm *tmp_tm;
-
- t = time (NULL);
- tmp_tm = localtime (&t);
- strftime (buffer, 32, "%a %x %T", 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);
-}
-
-/* Builds a list of categories from a comma-delimited string */
-static GSList *
-categories_from_string (const char *value)
-{
- GSList *list;
- const char *categ_start;
- const char *categ_end;
- const char *p;
-
- if (!value)
- return NULL;
-
- list = NULL;
-
- categ_start = categ_end = NULL;
-
- for (p = value; *p; p++) {
- if (categ_start) {
- if (*p == ',') {
- char *c;
-
- c = g_strndup (categ_start, categ_end - categ_start + 1);
- list = g_slist_prepend (list, c);
-
- categ_start = categ_end = NULL;
- } else if (!isspace (*p))
- categ_end = p;
- } else if (!isspace (*p) && *p != ',')
- categ_start = categ_end = p;
- }
-
- if (categ_start) {
- char *c;
-
- c = g_strndup (categ_start, categ_end - categ_start + 1);
- list = g_slist_prepend (list, c);
- }
-
- return g_slist_reverse (list);
-}
-
-/* Sets the list of categories from a comma-delimited string */
-static void
-set_categories (CalComponent *comp, const char *value)
-{
- GSList *list;
- GSList *l;
-
- list = categories_from_string (value);
-
- cal_component_set_categories_list (comp, list);
-
- for (l = list; l; l = l->next) {
- char *s;
-
- s = l->data;
- g_free (s);
- }
-
- g_slist_free (list);
-}
-
-/* Parses a time value entered by the user; returns -1 if it could not be
- * parsed. Returns 0 for an empty time.
- */
-static time_t
-parse_time (const char *value)
-{
- struct tm tmp_tm;
- struct tm *today_tm;
- time_t t;
- const char *p;
-
- if (string_is_empty (value))
- return 0;
-
- /* Skip any weekday name. */
- p = strptime (value, "%a", &tmp_tm);
- if (!p)
- p = value;
-
- /* Try to match the full date & time, or without the seconds,
- or just the date, or just the time with/without seconds.
- The info pages say we should clear the tm before calling
- strptime. It also means that if we don't match a time we
- get 00:00:00 which is good. */
- memset (&tmp_tm, 0, sizeof (tmp_tm));
- if (!strptime (value, "%x %T", &tmp_tm)) {
- memset (&tmp_tm, 0, sizeof (tmp_tm));
- if (!strptime (value, "%x %H:%M", &tmp_tm)) {
- memset (&tmp_tm, 0, sizeof (tmp_tm));
- if (!strptime (value, "%x", &tmp_tm)) {
- memset (&tmp_tm, 0, sizeof (tmp_tm));
- if (!strptime (value, "%T", &tmp_tm)) {
- memset (&tmp_tm, 0, sizeof (tmp_tm));
- if (!strptime (value, "%H:%M", &tmp_tm))
- return -1; /* Could not parse it */
- }
-
- /* We only got a time, so we use the
- current day. */
- t = time (NULL);
- today_tm = localtime (&t);
- tmp_tm.tm_mday = today_tm->tm_mday;
- tmp_tm.tm_mon = today_tm->tm_mon;
- tmp_tm.tm_year = today_tm->tm_year;
- }
- }
- }
-
- tmp_tm.tm_isdst = -1;
- return mktime (&tmp_tm);
-}
-
-/* Sets the completion time of a component */
-static void
-set_completed (CalComponent *comp, const char *value)
-{
- time_t t;
- struct icaltimetype itt;
-
- t = parse_time (value);
- if (t == -1) {
- show_date_warning ();
- return;
- } else if (t == 0) {
- cal_component_set_completed (comp, NULL);
- return;
- } else {
- itt = icaltimetype_from_timet (t, FALSE);
- cal_component_set_completed (comp, &itt);
- }
-}
-
-/* Sets a CalComponentDateTime value */
-static void
-set_datetime (CalComponent *comp, const char *value,
- void (* set_func) (CalComponent *comp, CalComponentDateTime *dt))
-{
- time_t t;
-
- t = parse_time (value);
- if (t == -1) {
- show_date_warning ();
- return;
- } else if (t == 0) {
- (* set_func) (comp, NULL);
- return;
- } else {
- CalComponentDateTime dt;
- struct icaltimetype itt;
-
- itt = icaltimetype_from_timet (t, FALSE);
- dt.value = &itt;
- dt.tzid = NULL;
-
- (* set_func) (comp, &dt);
- }
-}
-
-/* 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 = gnome_message_box_new (_("The geographical position must be entered "
- "in the format: \n\n45.436845,125.862501"),
- GNOME_MESSAGE_BOX_ERROR,
- GNOME_STOCK_BUTTON_OK, NULL);
- gtk_widget_show (dialog);
-}
-
-/* Sets the geographical position value of a component */
-static void
-set_geo (CalComponent *comp, const char *value)
-{
- double latitude, longitude;
- int matched;
- struct icalgeotype geo;
-
- if (string_is_empty (value)) {
- cal_component_set_geo (comp, NULL);
- return;
- }
-
- matched = sscanf (value, "%lg , %lg", &latitude, &longitude);
-
- if (matched != 2) {
- show_geo_warning ();
- return;
- }
-
- geo.lat = latitude;
- geo.lon = longitude;
- cal_component_set_geo (comp, &geo);
-}
-
-/* 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_percent_warning (void)
-{
- GtkWidget *dialog;
-
- dialog = gnome_message_box_new (_("The percent value must be between 0 and 100, inclusive"),
- GNOME_MESSAGE_BOX_ERROR,
- GNOME_STOCK_BUTTON_OK, NULL);
- gtk_widget_show (dialog);
-}
-
-/* Sets the percent value of a calendar component */
-static void
-set_percent (CalComponent *comp, const char *value)
-{
- int matched, percent;
-
- if (string_is_empty (value)) {
- cal_component_set_percent (comp, NULL);
- return;
- }
-
- matched = sscanf (value, "%i", &percent);
-
- if (matched != 1 || percent < 0 || percent > 100) {
- show_percent_warning ();
- return;
- }
-
- cal_component_set_percent (comp, &percent);
-}
-
-/* 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_priority_warning (void)
-{
- GtkWidget *dialog;
-
- dialog = gnome_message_box_new (_("The priority must be between 1 and 9, inclusive"),
- GNOME_MESSAGE_BOX_ERROR,
- GNOME_STOCK_BUTTON_OK, NULL);
- gtk_widget_show (dialog);
-}
-
-/* Sets the priority of a calendar component */
-static void
-set_priority (CalComponent *comp, const char *value)
-{
- int matched, priority;
-
- if (string_is_empty (value)) {
- cal_component_set_priority (comp, NULL);
- return;
- }
-
- matched = sscanf (value, "%i", &priority);
-
- if (matched != 1 || priority < 1 || priority > 9) {
- show_priority_warning ();
- return;
- }
-
- cal_component_set_priority (comp, &priority);
-}
-
-/* Sets the summary of a calendar component */
-static void
-set_summary (CalComponent *comp, const char *value)
-{
- CalComponentText text;
-
- if (string_is_empty (value)) {
- cal_component_set_summary (comp, NULL);
- return;
- }
-
- text.value = value;
- text.altrep = NULL; /* FIXME: should we preserve the old ALTREP? */
-
- cal_component_set_summary (comp, &text);
-}
-
-/* Sets the URI of a calendar component */
-static void
-set_url (CalComponent *comp, const char *value)
-{
- if (string_is_empty (value)) {
- cal_component_set_url (comp, NULL);
- return;
- }
-
- cal_component_set_url (comp, value);
-}
-
-/* set_value_at handler for the calendar table model */
-static void
-calendar_model_set_value_at (ETableModel *etm, int col, int row, const void *value)
-{
- CalendarModel *model;
- CalendarModelPrivate *priv;
- CalComponent *comp;
-
- model = CALENDAR_MODEL (etm);
- priv = model->priv;
-
- g_return_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS);
- g_return_if_fail (row >= 0 && row < priv->objects->len);
-
- comp = g_array_index (priv->objects, CalComponent *, row);
- g_assert (comp != NULL);
-
- switch (col) {
- case CAL_COMPONENT_FIELD_CATEGORIES:
- set_categories (comp, value);
- break;
-
- /* FIXME: CLASSIFICATION requires an option menu cell renderer */
-
- case CAL_COMPONENT_FIELD_COMPLETED:
- set_completed (comp, value);
- break;
-
- case CAL_COMPONENT_FIELD_DTEND:
- /* FIXME: Need to reset dtstart if dtend happens before it */
- set_datetime (comp, value, cal_component_set_dtend);
- break;
-
- case CAL_COMPONENT_FIELD_DTSTART:
- /* FIXME: Need to reset dtend if dtstart happens after it */
- set_datetime (comp, value, cal_component_set_dtstart);
- break;
-
- case CAL_COMPONENT_FIELD_DUE:
- set_datetime (comp, value, cal_component_set_due);
- break;
-
- case CAL_COMPONENT_FIELD_GEO:
- set_geo (comp, value);
- break;
-
- case CAL_COMPONENT_FIELD_PERCENT:
- set_percent (comp, value);
- break;
-
- case CAL_COMPONENT_FIELD_PRIORITY:
- set_priority (comp, value);
- break;
-
- case CAL_COMPONENT_FIELD_SUMMARY:
- set_summary (comp, value);
- break;
-
- /* FIXME: TRANSPARENCY requires an option menu cell renderer */
-
- case CAL_COMPONENT_FIELD_URL:
- set_url (comp, value);
- break;
-
- default:
- g_message ("calendar_model_set_value_at(): Requested invalid column %d", col);
- break;
- }
-
- /* FIXME: this is an ugly HACK. ETable needs a better API for the
- * "click here to add an element" thingy.
- */
- if (priv->appending_row)
- return;
-
- if (!cal_client_update_object (priv->client, comp))
- g_message ("calendar_model_set_value_at(): Could not update the object!");
-}
-
-/* is_cell_editable handler for the calendar table model */
-static gboolean
-calendar_model_is_cell_editable (ETableModel *etm, int col, int row)
-{
- CalendarModel *model;
- CalendarModelPrivate *priv;
-
- model = CALENDAR_MODEL (etm);
- priv = model->priv;
-
- g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, FALSE);
-
- /* FIXME: We can't check this as 'click-to-add' passes row 0. */
- /*g_return_val_if_fail (row >= 0 && row < priv->objects->len, FALSE);*/
-
- switch (col) {
- case CAL_COMPONENT_FIELD_CATEGORIES:
- case CAL_COMPONENT_FIELD_COMPLETED:
- case CAL_COMPONENT_FIELD_DTEND:
- case CAL_COMPONENT_FIELD_DTSTART:
- case CAL_COMPONENT_FIELD_DUE:
- case CAL_COMPONENT_FIELD_GEO:
- case CAL_COMPONENT_FIELD_PERCENT:
- case CAL_COMPONENT_FIELD_PRIORITY:
- case CAL_COMPONENT_FIELD_SUMMARY:
- case CAL_COMPONENT_FIELD_URL:
- return TRUE;
-
- default:
- return FALSE;
- }
-}
-
-/* append_row handler for the calendar model */
-static void
-calendar_model_append_row (ETableModel *etm, ETableModel *source, gint row)
-{
- CalendarModel *model;
- CalendarModelPrivate *priv;
- CalComponent *comp;
- int *new_idx, col;
- const char *uid;
-
- model = CALENDAR_MODEL (etm);
- priv = model->priv;
-
- /* This is a HACK */
- priv->appending_row = TRUE;
-
- /* FIXME: This should support other types of components, but for now it
- * is only used for the task list.
- */
- comp = cal_component_new ();
- cal_component_set_new_vtype (comp, CAL_COMPONENT_TODO);
-
- cal_component_get_uid (comp, &uid);
-
- g_array_append_val (priv->objects, comp);
- new_idx = g_new (int, 1);
- *new_idx = priv->objects->len - 1;
- g_hash_table_insert (priv->uid_index_hash, (char *) uid, new_idx);
-
- /* Notify the views about the new row. I think we have to do that here,
- or the views may become confused when they start getting
- "row_changed" or "cell_changed" signals for this new row. */
- e_table_model_row_inserted (etm, *new_idx);
-
- for (col = 0; col < CAL_COMPONENT_FIELD_NUM_FIELDS; col++) {
- const void *val;
-
- if (!e_table_model_is_cell_editable (etm, col, *new_idx))
- continue;
-
- val = e_table_model_value_at(source, col, row);
- e_table_model_set_value_at (etm, col, *new_idx, val);
- }
-
- /* This is the end of the HACK */
- priv->appending_row = FALSE;
-
- if (!cal_client_update_object (priv->client, comp)) {
- /* FIXME: Show error dialog. */
- g_message ("calendar_model_append_row(): Could not add new object!");
- remove_object (model, uid);
- e_table_model_row_deleted (etm, *new_idx);
- }
-}
-
-/* Duplicates a string value */
-static char *
-dup_string (const char *value)
-{
- return g_strdup (value);
-}
-
-/* duplicate_value handler for the calendar table model */
-static void *
-calendar_model_duplicate_value (ETableModel *etm, int col, const void *value)
-{
- g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, NULL);
-
- /* They are almost all dup_string()s for now, but we'll have real fields
- * later.
- */
-
- switch (col) {
- case CAL_COMPONENT_FIELD_CATEGORIES:
- return dup_string (value);
-
- case CAL_COMPONENT_FIELD_CLASSIFICATION:
- return (void *) value;
-
- case CAL_COMPONENT_FIELD_COMPLETED:
- case CAL_COMPONENT_FIELD_DTEND:
- case CAL_COMPONENT_FIELD_DTSTART:
- case CAL_COMPONENT_FIELD_DUE:
- case CAL_COMPONENT_FIELD_GEO:
- case CAL_COMPONENT_FIELD_PERCENT:
- case CAL_COMPONENT_FIELD_PRIORITY:
- return dup_string (value);
-
- case CAL_COMPONENT_FIELD_TRANSPARENCY:
- return (void *) value;
-
- case CAL_COMPONENT_FIELD_URL:
- return dup_string (value);
-
- case CAL_COMPONENT_FIELD_HAS_ALARMS:
- case CAL_COMPONENT_FIELD_ICON:
- case CAL_COMPONENT_FIELD_COMPLETE:
- case CAL_COMPONENT_FIELD_RECURRING:
- case CAL_COMPONENT_FIELD_OVERDUE:
- case CAL_COMPONENT_FIELD_COLOR:
- return (void *) value;
-
- default:
- g_message ("calendar_model_duplicate_value(): Requested invalid column %d", col);
- return NULL;
- }
-}
-
-/* free_value handler for the calendar table model */
-static void
-calendar_model_free_value (ETableModel *etm, int col, void *value)
-{
- g_return_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS);
-
- switch (col) {
- case CAL_COMPONENT_FIELD_CATEGORIES:
- g_free (value);
-
- case CAL_COMPONENT_FIELD_CLASSIFICATION:
- return;
-
- case CAL_COMPONENT_FIELD_COMPLETED:
- case CAL_COMPONENT_FIELD_DTEND:
- case CAL_COMPONENT_FIELD_DTSTART:
- case CAL_COMPONENT_FIELD_DUE:
- case CAL_COMPONENT_FIELD_GEO:
- case CAL_COMPONENT_FIELD_PERCENT:
- case CAL_COMPONENT_FIELD_PRIORITY:
- g_free (value);
-
- case CAL_COMPONENT_FIELD_TRANSPARENCY:
- return;
-
- case CAL_COMPONENT_FIELD_URL:
- g_free (value);
-
- case CAL_COMPONENT_FIELD_HAS_ALARMS:
- case CAL_COMPONENT_FIELD_ICON:
- case CAL_COMPONENT_FIELD_COMPLETE:
- case CAL_COMPONENT_FIELD_RECURRING:
- case CAL_COMPONENT_FIELD_OVERDUE:
- case CAL_COMPONENT_FIELD_COLOR:
- return;
-
- default:
- g_message ("calendar_model_free_value(): Requested invalid column %d", col);
- return;
- }
-}
-
-/* Initializes a string value */
-static char *
-init_string (void)
-{
- return g_strdup ("");
-}
-
-/* initialize_value handler for the calendar table model */
-static void *
-calendar_model_initialize_value (ETableModel *etm, int col)
-{
- g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, NULL);
-
- switch (col) {
- case CAL_COMPONENT_FIELD_CATEGORIES:
- return init_string ();
-
- case CAL_COMPONENT_FIELD_CLASSIFICATION:
- return NULL;
-
- case CAL_COMPONENT_FIELD_COMPLETED:
- case CAL_COMPONENT_FIELD_DTEND:
- case CAL_COMPONENT_FIELD_DTSTART:
- case CAL_COMPONENT_FIELD_DUE:
- case CAL_COMPONENT_FIELD_GEO:
- case CAL_COMPONENT_FIELD_PERCENT:
- case CAL_COMPONENT_FIELD_PRIORITY:
- return init_string ();
-
- case CAL_COMPONENT_FIELD_TRANSPARENCY:
- return NULL;
-
- case CAL_COMPONENT_FIELD_URL:
- return init_string ();
-
- case CAL_COMPONENT_FIELD_HAS_ALARMS:
- case CAL_COMPONENT_FIELD_ICON:
- case CAL_COMPONENT_FIELD_COMPLETE:
- case CAL_COMPONENT_FIELD_RECURRING:
- case CAL_COMPONENT_FIELD_OVERDUE:
- case CAL_COMPONENT_FIELD_COLOR:
- return NULL;
-
- default:
- g_message ("calendar_model_initialize_value(): Requested invalid column %d", col);
- return NULL;
- }
-}
-
-/* value_is_empty handler for the calendar model. This should return TRUE
- unless a significant value has been set. The 'click-to-add' feature
- checks all fields to see if any are not empty and if so it adds a new
- row, so we only want to return FALSE if we have a useful object. */
-static gboolean
-calendar_model_value_is_empty (ETableModel *etm, int col, const void *value)
-{
- g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, TRUE);
-
- switch (col) {
- case CAL_COMPONENT_FIELD_CATEGORIES:
- case CAL_COMPONENT_FIELD_CLASSIFICATION: /* actually goes here, not by itself */
- case CAL_COMPONENT_FIELD_COMPLETED:
- case CAL_COMPONENT_FIELD_DTEND:
- case CAL_COMPONENT_FIELD_DTSTART:
- case CAL_COMPONENT_FIELD_DUE:
- case CAL_COMPONENT_FIELD_GEO:
- case CAL_COMPONENT_FIELD_PERCENT:
- case CAL_COMPONENT_FIELD_PRIORITY:
- case CAL_COMPONENT_FIELD_TRANSPARENCY:
- case CAL_COMPONENT_FIELD_URL:
- return string_is_empty (value);
-
- case CAL_COMPONENT_FIELD_HAS_ALARMS:
- case CAL_COMPONENT_FIELD_ICON:
- case CAL_COMPONENT_FIELD_COMPLETE:
- case CAL_COMPONENT_FIELD_RECURRING:
- case CAL_COMPONENT_FIELD_OVERDUE:
- case CAL_COMPONENT_FIELD_COLOR:
- return TRUE;
-
- default:
- g_message ("calendar_model_value_is_empty(): Requested invalid column %d", col);
- return TRUE;
- }
-}
-
-
-
-/**
- * calendar_model_new:
- *
- * Creates a new calendar model. It must be told about the calendar client
- * interface object it will monitor with calendar_model_set_cal_client().
- *
- * Return value: A newly-created calendar model.
- **/
-CalendarModel *
-calendar_model_new (void)
-{
- return CALENDAR_MODEL (gtk_type_new (TYPE_CALENDAR_MODEL));
-}
-
-
-/* Callback used when a calendar is loaded into the server */
-static void
-cal_loaded_cb (CalClient *client,
- CalClientLoadStatus status,
- CalendarModel *model)
-{
- g_return_if_fail (IS_CALENDAR_MODEL (model));
-
- e_table_model_pre_change (E_TABLE_MODEL (model));
- load_objects (model);
- e_table_model_changed (E_TABLE_MODEL (model));
-}
-
-
-/* Removes an object from the model and updates all the indices that follow.
- * Returns the index of the object that was removed, or -1 if no object with
- * such UID was found.
- */
-static int
-remove_object (CalendarModel *model, const char *uid)
-{
- CalendarModelPrivate *priv;
- int *idx;
- CalComponent *orig_comp;
- int i;
- int n;
-
- priv = model->priv;
-
- /* Find the index of the object to be removed */
-
- idx = g_hash_table_lookup (priv->uid_index_hash, uid);
- if (!idx)
- return -1;
-
- orig_comp = g_array_index (priv->objects, CalComponent *, *idx);
- g_assert (orig_comp != NULL);
-
- /* Decrease the indices of all the objects that follow in the array */
-
- for (i = *idx + 1; i < priv->objects->len; i++) {
- CalComponent *comp;
- int *comp_idx;
- const char *comp_uid;
-
- comp = g_array_index (priv->objects, CalComponent *, i);
- g_assert (comp != NULL);
-
- cal_component_get_uid (comp, &comp_uid);
-
- comp_idx = g_hash_table_lookup (priv->uid_index_hash, comp_uid);
- g_assert (comp_idx != NULL);
-
- (*comp_idx)--;
- g_assert (*comp_idx >= 0);
- }
-
- /* Remove this object from the array and hash */
-
- g_hash_table_remove (priv->uid_index_hash, uid);
- g_array_remove_index (priv->objects, *idx);
-
- gtk_object_unref (GTK_OBJECT (orig_comp));
-
- n = *idx;
- g_free (idx);
-
- return n;
-}
-
-/* Callback used when an object is updated in the server */
-static void
-obj_updated_cb (CalClient *client, const char *uid, gpointer data)
-{
- CalendarModel *model;
- CalendarModelPrivate *priv;
- int orig_idx;
- CalComponent *new_comp;
- const char *new_comp_uid;
- int *new_idx;
- CalClientGetStatus status;
- gboolean added;
-
- model = CALENDAR_MODEL (data);
- priv = model->priv;
-
- orig_idx = remove_object (model, uid);
-
- status = cal_client_get_object (priv->client, uid, &new_comp);
-
- added = FALSE;
-
- switch (status) {
- case CAL_CLIENT_GET_SUCCESS:
- cal_component_get_uid (new_comp, &new_comp_uid);
-
- if (orig_idx == -1) {
- /* The object not in the model originally, so we just append it */
-
- g_array_append_val (priv->objects, new_comp);
-
- new_idx = g_new (int, 1);
- *new_idx = priv->objects->len - 1;
-
- g_hash_table_insert (priv->uid_index_hash, (char *) new_comp_uid, new_idx);
- } else {
- int i;
-
- /* Insert the new version of the object in its old position */
-
- g_array_insert_val (priv->objects, orig_idx, new_comp);
-
- new_idx = g_new (int, 1);
- *new_idx = orig_idx;
- g_hash_table_insert (priv->uid_index_hash, (char *) new_comp_uid, new_idx);
-
- /* Increase the indices of all subsequent objects */
-
- for (i = orig_idx + 1; i < priv->objects->len; i++) {
- CalComponent *comp;
- int *comp_idx;
- const char *comp_uid;
-
- comp = g_array_index (priv->objects, CalComponent *, i);
- g_assert (comp != NULL);
-
- cal_component_get_uid (comp, &comp_uid);
-
- comp_idx = g_hash_table_lookup (priv->uid_index_hash, comp_uid);
- g_assert (comp_idx != NULL);
-
- (*comp_idx)++;
- }
- }
-
- e_table_model_row_changed (E_TABLE_MODEL (model), *new_idx);
- break;
-
- case CAL_CLIENT_GET_NOT_FOUND:
- /* Nothing; the object may have been removed from the server. We just
- * notify that the old object was deleted.
- */
- if (orig_idx != -1)
- e_table_model_row_deleted (E_TABLE_MODEL (model), orig_idx);
-
- break;
-
- case CAL_CLIENT_GET_SYNTAX_ERROR:
- g_message ("obj_updated_cb(): Syntax error when getting object `%s'", uid);
-
- /* Same notification as above */
- if (orig_idx != -1)
- e_table_model_row_deleted (E_TABLE_MODEL (model), orig_idx);
-
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-/* Callback used when an object is removed in the server */
-static void
-obj_removed_cb (CalClient *client, const char *uid, gpointer data)
-{
- CalendarModel *model;
- int idx;
-
- model = CALENDAR_MODEL (data);
-
- idx = remove_object (model, uid);
-
- if (idx != -1)
- e_table_model_row_deleted (E_TABLE_MODEL (model), idx);
-}
-
-/* Loads the required objects from the calendar client */
-static void
-load_objects (CalendarModel *model)
-{
- CalendarModelPrivate *priv;
- GList *uids;
- GList *l;
-
- priv = model->priv;
-
- uids = cal_client_get_uids (priv->client, priv->type);
-
- for (l = uids; l; l = l->next) {
- char *uid;
- CalComponent *comp;
- const char *comp_uid;
- CalClientGetStatus status;
- int *idx;
-
- uid = l->data;
- status = cal_client_get_object (priv->client, uid, &comp);
-
- switch (status) {
- case CAL_CLIENT_GET_SUCCESS:
- break;
-
- case CAL_CLIENT_GET_NOT_FOUND:
- /* Nothing; the object may have been removed from the server */
- continue;
-
- case CAL_CLIENT_GET_SYNTAX_ERROR:
- g_message ("load_objects(): Syntax error when getting object `%s'", uid);
- continue;
-
- default:
- g_assert_not_reached ();
- }
-
- idx = g_new (int, 1);
-
- g_array_append_val (priv->objects, comp);
- *idx = priv->objects->len - 1;
-
- cal_component_get_uid (comp, &comp_uid);
- g_hash_table_insert (priv->uid_index_hash, (char *) comp_uid, idx);
- }
-
- cal_obj_uid_list_free (uids);
-}
-
-/**
- * calendar_model_get_cal_client:
- * @model: A calendar model.
- *
- * Queries the calendar client interface object that a calendar model is using.
- *
- * Return value: A calendar client interface object.
- **/
-CalClient *
-calendar_model_get_cal_client (CalendarModel *model)
-{
- CalendarModelPrivate *priv;
-
- g_return_val_if_fail (model != NULL, NULL);
- g_return_val_if_fail (IS_CALENDAR_MODEL (model), NULL);
-
- priv = model->priv;
-
- return priv->client;
-}
-
-
-/**
- * calendar_model_set_cal_client:
- * @model: A calendar model.
- * @client: A calendar client interface object.
- * @type: Type of objects to present.
- *
- * Sets the calendar client interface object that a calendar model will monitor.
- * It also sets the types of objects this model will present to an #ETable.
- **/
-void
-calendar_model_set_cal_client (CalendarModel *model, CalClient *client, CalObjType type)
-{
- CalendarModelPrivate *priv;
-
- g_return_if_fail (model != NULL);
- g_return_if_fail (IS_CALENDAR_MODEL (model));
-
- if (client)
- g_return_if_fail (IS_CAL_CLIENT (client));
-
- priv = model->priv;
-
- if (priv->client == client && priv->type == type)
- return;
-
- e_table_model_pre_change (E_TABLE_MODEL(model));
-
- if (client)
- gtk_object_ref (GTK_OBJECT (client));
-
- if (priv->client) {
- gtk_signal_disconnect_by_data (GTK_OBJECT (priv->client), model);
- gtk_object_unref (GTK_OBJECT (priv->client));
- }
-
- free_objects (model);
-
- priv->client = client;
- priv->type = type;
-
- if (priv->client) {
- gtk_signal_connect (GTK_OBJECT (priv->client), "cal_loaded",
- GTK_SIGNAL_FUNC (cal_loaded_cb), model);
- gtk_signal_connect (GTK_OBJECT (priv->client), "obj_updated",
- GTK_SIGNAL_FUNC (obj_updated_cb), model);
- gtk_signal_connect (GTK_OBJECT (priv->client), "obj_removed",
- GTK_SIGNAL_FUNC (obj_removed_cb), model);
-
- load_objects (model);
- }
-
- e_table_model_changed (E_TABLE_MODEL (model));
-}
-
-
-void
-calendar_model_delete_task (CalendarModel *model,
- gint row)
-{
- CalendarModelPrivate *priv;
- CalComponent *comp;
- const char *uid;
-
- g_return_if_fail (model != NULL);
- g_return_if_fail (IS_CALENDAR_MODEL (model));
-
- priv = model->priv;
-
- g_return_if_fail (row >= 0 && row < priv->objects->len);
-
- comp = g_array_index (priv->objects, CalComponent *, row);
- g_assert (comp != NULL);
-
- cal_component_get_uid (comp, &uid);
-
- if (!cal_client_remove_object (priv->client, uid))
- g_message ("calendar_model_delete_task(): Could not remove the object!");
-}
-
-
-void
-calendar_model_mark_task_complete (CalendarModel *model,
- gint row)
-{
- CalendarModelPrivate *priv;
- CalComponent *comp;
- int percent;
- struct icaltimetype itt;
-
- g_return_if_fail (model != NULL);
- g_return_if_fail (IS_CALENDAR_MODEL (model));
-
- priv = model->priv;
-
- g_return_if_fail (row >= 0 && row < priv->objects->len);
-
- comp = g_array_index (priv->objects, CalComponent *, row);
- g_assert (comp != NULL);
-
- percent = 100;
- cal_component_set_percent (comp, &percent);
-
- itt = icaltimetype_from_timet (time (NULL), FALSE);
- cal_component_set_completed (comp, &itt);
-
- if (!cal_client_update_object (priv->client, comp))
- g_message ("calendar_model_mark_task_complete(): Could not update the object!");
-}
-
-
-/* Frees the objects stored in the calendar model */
-CalComponent *
-calendar_model_get_cal_object (CalendarModel *model,
- gint row)
-{
- CalendarModelPrivate *priv;
-
- g_return_val_if_fail (model != NULL, NULL);
- g_return_val_if_fail (IS_CALENDAR_MODEL (model), NULL);
-
- priv = model->priv;
-
- g_return_val_if_fail (row >= 0 && row < priv->objects->len, NULL);
-
- return g_array_index (priv->objects, CalComponent *, row);
-}
diff --git a/calendar/gui/calendar-model.h b/calendar/gui/calendar-model.h
deleted file mode 100644
index d1481a4ece..0000000000
--- a/calendar/gui/calendar-model.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Evolution calendar - Data model for ETable
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@helixcode.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_MODEL_H
-#define CALENDAR_MODEL_H
-
-#include <libgnome/gnome-defs.h>
-#include <e-table/e-table-model.h>
-#include <cal-client/cal-client.h>
-
-BEGIN_GNOME_DECLS
-
-
-
-#define TYPE_CALENDAR_MODEL (calendar_model_get_type ())
-#define CALENDAR_MODEL(obj) (GTK_CHECK_CAST ((obj), TYPE_CALENDAR_MODEL, CalendarModel))
-#define CALENDAR_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_CALENDAR_MODEL, \
- CalendarModelClass))
-#define IS_CALENDAR_MODEL(obj) (GTK_CHECK_TYPE ((obj), TYPE_CALENDAR_MODEL))
-#define IS_CALENDAR_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_CALENDAR_MODEL))
-
-typedef struct _CalendarModel CalendarModel;
-typedef struct _CalendarModelClass CalendarModelClass;
-
-struct _CalendarModel {
- ETableModel model;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _CalendarModelClass {
- ETableModelClass parent_class;
-};
-
-GtkType calendar_model_get_type (void);
-
-CalendarModel* calendar_model_new (void);
-
-CalClient* calendar_model_get_cal_client (CalendarModel *model);
-void calendar_model_set_cal_client (CalendarModel *model,
- CalClient *client,
- CalObjType type);
-
-void calendar_model_mark_task_complete (CalendarModel *model,
- gint row);
-void calendar_model_delete_task (CalendarModel *model,
- gint row);
-
-CalComponent* calendar_model_get_cal_object (CalendarModel *model,
- gint row);
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/gui/component-factory.c b/calendar/gui/component-factory.c
deleted file mode 100644
index 8644b8928c..0000000000
--- a/calendar/gui/component-factory.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* component-factory.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#include <config.h>
-#include <bonobo.h>
-#include "evolution-shell-component.h"
-#include "component-factory.h"
-#include "control-factory.h"
-
-
-
-#ifdef USING_OAF
-#define COMPONENT_FACTORY_ID "OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921"
-#else
-#define COMPONENT_FACTORY_ID "evolution-shell-component-factory:evolution-calendar"
-#endif
-
-static BonoboGenericFactory *factory = NULL;
-
-static const EvolutionShellComponentFolderType folder_types[] = {
- { "calendar", "evolution-calendar.png" },
- { NULL, NULL }
-};
-
-
-/* EvolutionShellComponent methods and signals. */
-
-static EvolutionShellComponentResult
-create_view (EvolutionShellComponent *shell_component,
- const char *physical_uri,
- const char *type,
- BonoboControl **control_return,
- void *closure)
-{
- BonoboControl *control;
-
- if (g_strcasecmp (type, "calendar") != 0)
- return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE;
-
- control = control_factory_new_control ();
- bonobo_control_set_property (control, "folder_uri", physical_uri, NULL);
-
- *control_return = control;
-
- return EVOLUTION_SHELL_COMPONENT_OK;
-}
-
-static gint owner_count = 0;
-
-static void
-owner_set_cb (EvolutionShellComponent *shell_component,
- Evolution_Shell shell_interface,
- const char *evolution_homedir)
-{
- owner_count ++;
-}
-
-static void
-owner_unset_cb (EvolutionShellComponent *shell_component,
- Evolution_Shell shell_interface,
- EvolutionShellClient shell_client,
- void *data)
-{
- owner_count --;
- if (owner_count <= 0)
- gtk_main_quit();
-}
-
-
-/* The factory function. */
-
-static BonoboObject *
-factory_fn (BonoboGenericFactory *factory,
- void *closure)
-{
- EvolutionShellComponent *shell_component;
-
- shell_component = evolution_shell_component_new (folder_types, create_view, NULL, NULL, NULL, NULL);
-
- gtk_signal_connect (GTK_OBJECT (shell_component), "owner_set",
- GTK_SIGNAL_FUNC (owner_set_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (shell_component), "owner_unset",
- GTK_SIGNAL_FUNC (owner_unset_cb), NULL);
-
- return BONOBO_OBJECT (shell_component);
-}
-
-
-void
-component_factory_init (void)
-{
- if (factory != NULL)
- return;
-
- factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, factory_fn, NULL);
-
- if (factory == NULL)
- g_error ("Cannot initialize Evolution's calendar component.");
-}
diff --git a/calendar/gui/component-factory.h b/calendar/gui/component-factory.h
deleted file mode 100644
index f83a849452..0000000000
--- a/calendar/gui/component-factory.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* component-factory.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _COMPONENT_FACTORY_H_
-#define _COMPONENT_FACTORY_H_
-
-void component_factory_init (void);
-
-#endif /* _COMPONENT_FACTORY_H_ */
diff --git a/calendar/gui/control-factory.c b/calendar/gui/control-factory.c
deleted file mode 100644
index d7626d21f3..0000000000
--- a/calendar/gui/control-factory.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* control-factory.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <glade/glade.h>
-#include <bonobo.h>
-#include <bonobo/bonobo-control.h>
-#include <glade/glade.h>
-
-#ifdef USING_OAF
-#include <liboaf/liboaf.h>
-#else
-#include <libgnorba/gnorba.h>
-#endif
-
-#include <cal-util/timeutil.h>
-#include <gui/alarm.h>
-#include <gui/gnome-cal.h>
-#include <gui/calendar-commands.h>
-
-#include "control-factory.h"
-
-#define PROPERTY_CALENDAR_URI "folder_uri"
-
-#define PROPERTY_CALENDAR_URI_IDX 1
-
-#ifdef USING_OAF
-#define CONTROL_FACTORY_ID "OAFIID:control-factory:calendar:f4f90989-0f50-4af2-ad94-8bbdf331f0bc"
-#else
-#define CONTROL_FACTORY_ID "control-factory:calendar"
-#endif
-
-
-CORBA_Environment ev;
-CORBA_ORB orb;
-
-
-static void
-control_activate_cb (BonoboControl *control,
- gboolean activate,
- gpointer user_data)
-{
- if (activate)
- calendar_control_activate (control, user_data);
- else
- calendar_control_deactivate (control);
-}
-
-
-static void
-get_prop (BonoboPropertyBag *bag,
- BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- /*GnomeCalendar *gcal = user_data;*/
-
- switch (arg_id) {
-
- case PROPERTY_CALENDAR_URI_IDX:
- /*
- if (fb && fb->uri)
- BONOBO_ARG_SET_STRING (arg, fb->uri);
- else
- BONOBO_ARG_SET_STRING (arg, "");
- */
- break;
-
- default:
- g_warning ("Unhandled arg %d\n", arg_id);
- }
-}
-
-
-static void
-set_prop (BonoboPropertyBag *bag,
- const BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- GnomeCalendar *gcal = user_data;
- char *filename;
-
- switch (arg_id) {
-
- case PROPERTY_CALENDAR_URI_IDX:
- printf ("set_prop: '%s'\n", BONOBO_ARG_GET_STRING (arg));
- filename = g_strdup_printf ("%s/calendar.vcf",
- BONOBO_ARG_GET_STRING (arg));
- calendar_set_uri (gcal, filename);
- g_free (filename);
- break;
-
- default:
- g_warning ("Unhandled arg %d\n", arg_id);
- break;
- }
-}
-
-
-static void
-calendar_properties_init (GnomeCalendar *gcal)
-{
- gcal->properties = bonobo_property_bag_new (get_prop, set_prop, gcal);
-
- bonobo_property_bag_add (gcal->properties,
- PROPERTY_CALENDAR_URI,
- PROPERTY_CALENDAR_URI_IDX,
- BONOBO_ARG_STRING,
- NULL,
- _("The URI that the calendar will display"),
- 0);
-
- bonobo_control_set_property_bag (gcal->control, gcal->properties);
-}
-
-
-static BonoboControl *
-create_control (void)
-{
- BonoboControl *control;
- GnomeCalendar *cal;
-
- cal = new_calendar (full_name, NULL, NULL, 0);
- gtk_widget_show (GTK_WIDGET (cal));
-
- control = bonobo_control_new (GTK_WIDGET (cal));
- cal->control = control;
-
- calendar_properties_init (cal);
-
- gtk_signal_connect (GTK_OBJECT (control), "activate",
- control_activate_cb, cal);
-
- return control;
-}
-
-
-static BonoboObject *
-control_factory (BonoboGenericFactory *Factory, void *closure)
-{
- return BONOBO_OBJECT (create_control ());
-}
-
-
-void
-control_factory_init (void)
-{
- static BonoboGenericFactory *factory = NULL;
-
- if (factory != NULL)
- return;
-
- puts ("XXXXXX - initializing calendar factory!!!");
-
- factory = bonobo_generic_factory_new (CONTROL_FACTORY_ID, control_factory, NULL);
-
- if (factory == NULL)
- g_error ("I could not register a Calendar control factory.");
-}
-
-
-BonoboControl *
-control_factory_new_control (void)
-{
- return create_control ();
-}
diff --git a/calendar/gui/control-factory.h b/calendar/gui/control-factory.h
deleted file mode 100644
index bacd2d3d90..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 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Federico Mena Quintero
- */
-
-#ifndef _CONTROL_FACTORY_H_
-#define _CONTROL_FACTORY_H_
-
-void control_factory_init (void);
-BonoboControl *control_factory_new_control (void);
-
-#endif /* _CONTROL_FACTORY_H_ */
diff --git a/calendar/gui/dayview.xpm b/calendar/gui/dayview.xpm
deleted file mode 100644
index bc8e74e4d6..0000000000
--- a/calendar/gui/dayview.xpm
+++ /dev/null
@@ -1,42 +0,0 @@
-/* XPM */
-static char * dayview_xpm[] = {
-"24 24 15 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-"@ c #D1D1D1",
-"# c #AAAFE2",
-"$ c #C7CAEB",
-"% c #A3A6C7",
-"& c #0010A8",
-"* c #555FC5",
-"= c #1725AC",
-"- c #4550B5",
-"; c #E3E4F5",
-"> c #8B90C3",
-", c #3945BB",
-"' c #BABBCC",
-" ",
-" ",
-" ",
-" ",
-" ...................... ",
-" .............+.++.++.. ",
-" .++@++@++@++@++@++@++. ",
-" .++@++@++@++@++@++@++. ",
-" .@@@@@@@@@@@@@@@@@@@@. ",
-" .++@++@++@#$@++@++@++. ",
-" .++@++@++%&*@++@++@++. ",
-" .@@@@@@@%=&-@@@@@@@@@. ",
-" .++@++@++@&*@++@++@++. ",
-" .++@++@++@&*@++@++@++. ",
-" .@@@@@@@@@&-@@@@@@@@@. ",
-" .++@++@++@&*@++@++@++. ",
-" .++@++@+;>&,>++@++@++. ",
-" .@@@@@@@'>>>>@@@@@@@@. ",
-" .++@++@++@++@++@++@++. ",
-" .++@++@++@++@++@++@++. ",
-" ...................... ",
-" ",
-" ",
-" "};
diff --git a/calendar/gui/dialogs/.cvsignore b/calendar/gui/dialogs/.cvsignore
deleted file mode 100644
index e995588475..0000000000
--- a/calendar/gui/dialogs/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.deps
-Makefile
-Makefile.in
diff --git a/calendar/gui/dialogs/Makefile.am b/calendar/gui/dialogs/Makefile.am
deleted file mode 100644
index 227cb5aa07..0000000000
--- a/calendar/gui/dialogs/Makefile.am
+++ /dev/null
@@ -1,31 +0,0 @@
-gladedir = $(datadir)/evolution/glade
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"calendar-gui\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir)/libical/src/libical \
- -I$(includedir) \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- $(BONOBO_VFS_GNOME_CFLAGS) \
- -DGNOMELOCALEDIR=\""$(datadir)/locale"\"
-
-noinst_LIBRARIES = libcal-dialogs.a
-
-libcal_dialogs_a_SOURCES = \
- alarm-notify-dialog.c \
- alarm-notify-dialog.h \
- task-editor.c \
- task-editor.h
-
-glade_DATA = \
- alarm-notify.glade \
- task-editor-dialog.glade
-
-glade_messages = \
- alarm-notify.glade.h \
- task-editor-dialog.glade.h
-
-EXTRA_DIST = \
- $(glade_DATA) \
- $(glade_messages)
diff --git a/calendar/gui/dialogs/alarm-notify-dialog.c b/calendar/gui/dialogs/alarm-notify-dialog.c
deleted file mode 100644
index 7d8357599c..0000000000
--- a/calendar/gui/dialogs/alarm-notify-dialog.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/* Evolution calendar - alarm notification dialog
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <glade/glade.h>
-#include "alarm-notify-dialog.h"
-
-
-
-/* The useful contents of the alarm notify dialog */
-typedef struct {
- GladeXML *xml;
-
- GtkWidget *dialog;
- GtkWidget *close;
- GtkWidget *snooze;
- GtkWidget *edit;
- GtkWidget *heading;
- GtkWidget *summary;
- GtkWidget *snooze_time;
-
- AlarmNotifyFunc func;
- gpointer func_data;
-} AlarmNotify;
-
-
-
-/* Callback used when the notify dialog is destroyed */
-static void
-dialog_destroy_cb (GtkObject *object, gpointer data)
-{
- AlarmNotify *an;
-
- an = data;
- gtk_object_unref (GTK_OBJECT (an->xml));
- g_free (an);
-}
-
-/* Delete_event handler for the alarm notify dialog */
-static gint
-delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- AlarmNotify *an;
-
- an = data;
- g_assert (an->func != NULL);
-
- (* an->func) (ALARM_NOTIFY_CLOSE, -1, an->func_data);
-
- gtk_widget_destroy (widget);
- return TRUE;
-}
-
-/* Callback for the close button */
-static void
-close_clicked_cb (GtkWidget *widget, gpointer data)
-{
- AlarmNotify *an;
-
- an = data;
- g_assert (an->func != NULL);
-
- (* an->func) (ALARM_NOTIFY_CLOSE, -1, an->func_data);
-
- gtk_widget_destroy (an->dialog);
-}
-
-/* Callback for the snooze button */
-static void
-snooze_clicked_cb (GtkWidget *widget, gpointer data)
-{
- AlarmNotify *an;
- int snooze_time;
-
- an = data;
- g_assert (an->func != NULL);
-
- snooze_time = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (an->snooze_time));
- (* an->func) (ALARM_NOTIFY_SNOOZE, snooze_time, an->func_data);
-
- gtk_widget_destroy (an->dialog);
-}
-
-/* Callback for the edit button */
-static void
-edit_clicked_cb (GtkWidget *widget, gpointer data)
-{
- AlarmNotify *an;
-
- an = data;
- g_assert (an->func != NULL);
-
- (* an->func) (ALARM_NOTIFY_EDIT, -1, an->func_data);
-
- gtk_widget_destroy (an->dialog);
-}
-
-/**
- * alarm_notify_dialog:
- * @trigger: Trigger time for the alarm.
- * @occur: Occurrence time for the event.
- * @comp: Calendar component object which corresponds to the alarm.
- * @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: TRUE on success, FALSE if the dialog could not be created.
- **/
-gboolean
-alarm_notify_dialog (time_t trigger, time_t occur, CalComponent *comp,
- AlarmNotifyFunc func, gpointer func_data)
-{
- AlarmNotify *an;
- char buf[256];
- struct tm tm_trigger;
- struct tm tm_occur;
- CalComponentText summary;
-
- g_return_val_if_fail (trigger != -1, FALSE);
- g_return_val_if_fail (occur != -1, FALSE);
- g_return_val_if_fail (comp != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_COMPONENT (comp), FALSE);
- g_return_val_if_fail (func != NULL, FALSE);
-
- an = g_new0 (AlarmNotify, 1);
-
- an->func = func;
- an->func_data = func_data;
-
- an->xml = glade_xml_new (EVOLUTION_GLADEDIR "/alarm-notify.glade", NULL);
- if (!an->xml) {
- g_message ("alarm_notify_dialog(): Could not load the Glade XML file!");
- g_free (an);
- return FALSE;
- }
-
- an->dialog = glade_xml_get_widget (an->xml, "alarm-notify");
- an->close = glade_xml_get_widget (an->xml, "close");
- an->snooze = glade_xml_get_widget (an->xml, "snooze");
- an->edit = glade_xml_get_widget (an->xml, "edit");
- an->heading = glade_xml_get_widget (an->xml, "heading");
- an->summary = glade_xml_get_widget (an->xml, "summary");
- an->snooze_time = glade_xml_get_widget (an->xml, "snooze-time");
-
- if (!(an->dialog && an->close && an->snooze && an->edit && an->heading && an->summary
- && an->snooze_time)) {
- g_message ("alarm_notify_dialog(): Could not find all widgets in Glade file!");
- gtk_object_unref (GTK_OBJECT (an->xml));
- g_free (an);
- return FALSE;
- }
-
- gtk_object_set_data (GTK_OBJECT (an->dialog), "alarm-notify", an);
- gtk_signal_connect (GTK_OBJECT (an->dialog), "destroy",
- GTK_SIGNAL_FUNC (dialog_destroy_cb), an);
-
- /* Title */
-
- /* FIXME: use am_pm_flag or 24-hour time */
-
- tm_trigger = *localtime (&trigger);
- strftime (buf, sizeof (buf), _("Alarm on %A %b %d %Y %H:%M"), &tm_trigger);
- gtk_window_set_title (GTK_WINDOW (an->dialog), buf);
-
- /* Heading */
-
- tm_occur = *localtime (&occur);
- strftime (buf, sizeof (buf),
- _("Notification about your appointment on %A %b %d %Y %H:%M"),
- &tm_occur);
- gtk_label_set_text (GTK_LABEL (an->heading), buf);
-
- /* Summary */
-
- cal_component_get_summary (comp, &summary);
-
- if (summary.value)
- gtk_label_set_text (GTK_LABEL (an->summary), summary.value);
- else
- gtk_label_set_text (GTK_LABEL (an->summary), _("No summary available."));
-
- /* Connect actions */
-
- gtk_signal_connect (GTK_OBJECT (an->dialog), "delete_event",
- GTK_SIGNAL_FUNC (delete_event_cb),
- an);
-
- gtk_signal_connect (GTK_OBJECT (an->close), "clicked",
- GTK_SIGNAL_FUNC (close_clicked_cb),
- an);
-
- gtk_signal_connect (GTK_OBJECT (an->snooze), "clicked",
- GTK_SIGNAL_FUNC (snooze_clicked_cb),
- an);
-
- gtk_signal_connect (GTK_OBJECT (an->edit), "clicked",
- GTK_SIGNAL_FUNC (edit_clicked_cb),
- an);
-
- /* Run! */
-
- gtk_widget_show (an->dialog);
- return TRUE;
-}
diff --git a/calendar/gui/dialogs/alarm-notify-dialog.h b/calendar/gui/dialogs/alarm-notify-dialog.h
deleted file mode 100644
index 1e56f1c586..0000000000
--- a/calendar/gui/dialogs/alarm-notify-dialog.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Evolution calendar - alarm notification dialog
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 ALARM_NOTIFY_DIALOG_H
-#define ALARM_NOTIFY_DIALOG_H
-
-#include <time.h>
-#include <glib.h>
-#include <cal-util/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);
-
-gboolean alarm_notify_dialog (time_t trigger, time_t occur, CalComponent *comp,
- AlarmNotifyFunc func, gpointer func_data);
-
-
-
-#endif
diff --git a/calendar/gui/dialogs/alarm-notify.glade b/calendar/gui/dialogs/alarm-notify.glade
deleted file mode 100644
index 32d7e03f8b..0000000000
--- a/calendar/gui/dialogs/alarm-notify.glade
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Evolution Calendar</name>
- <program_name>evolution-calendar</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>True</output_main_file>
- <output_support_files>True</output_support_files>
- <output_build_files>True</output_build_files>
- <backup_source_files>True</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>alarm-notify.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GtkWindow</class>
- <name>alarm-notify</name>
- <cxx_use_heap>True</cxx_use_heap>
- <title></title>
- <type>GTK_WINDOW_DIALOG</type>
- <position>GTK_WIN_POS_CENTER</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox2</name>
- <border_width>4</border_width>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox3</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox5</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>heading</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label></label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>True</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>summary</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label></label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>True</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox4</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>close</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <label>Close</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>snooze</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <label>Snooze</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>edit</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <label>Edit appointment</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox4</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label4</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Snooze time (minutes)</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>snooze-time</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>5</value>
- <lower>1</lower>
- <upper>1440</upper>
- <step>1</step>
- <page>5</page>
- <page_size>5</page_size>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/calendar/gui/dialogs/alarm-notify.glade.h b/calendar/gui/dialogs/alarm-notify.glade.h
deleted file mode 100644
index c7b8918e06..0000000000
--- a/calendar/gui/dialogs/alarm-notify.glade.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Close");
-gchar *s = N_("Snooze");
-gchar *s = N_("Edit appointment");
-gchar *s = N_("Snooze time (minutes)");
diff --git a/calendar/gui/dialogs/task-editor-dialog.glade b/calendar/gui/dialogs/task-editor-dialog.glade
deleted file mode 100644
index 56f7f83422..0000000000
--- a/calendar/gui/dialogs/task-editor-dialog.glade
+++ /dev/null
@@ -1,822 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>task-editor-dialog</name>
- <program_name>task-editor-dialog</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>task-editor-dialog.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeApp</class>
- <name>task-editor-dialog</name>
- <visible>False</visible>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <enable_layout_config>True</enable_layout_config>
-
- <widget>
- <class>GnomeDock</class>
- <child_name>GnomeApp:dock</child_name>
- <name>dock1</name>
- <allow_floating>True</allow_floating>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkNotebook</class>
- <child_name>GnomeDock:contents</child_name>
- <name>notebook1</name>
- <border_width>2</border_width>
- <can_focus>True</can_focus>
- <show_tabs>True</show_tabs>
- <show_border>True</show_border>
- <tab_pos>GTK_POS_TOP</tab_pos>
- <scrollable>False</scrollable>
- <tab_hborder>2</tab_hborder>
- <tab_vborder>2</tab_vborder>
- <popup_enable>False</popup_enable>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox1</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
-
- <widget>
- <class>GtkTable</class>
- <name>table3</name>
- <rows>2</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label3</name>
- <label>S_ubject:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <default_focus_target>entry1</default_focus_target>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry1</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label10</name>
- <label>Owner:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label11</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator1</name>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox4</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table1</name>
- <rows>2</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>2</row_spacing>
- <column_spacing>4</column_spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GnomeDateEdit</class>
- <name>dateedit1</name>
- <show_time>True</show_time>
- <use_24_format>False</use_24_format>
- <week_start_monday>False</week_start_monday>
- <lower_hour>7</lower_hour>
- <upper_hour>19</upper_hour>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GnomeDateEdit</class>
- <name>dateedit2</name>
- <show_time>True</show_time>
- <use_24_format>True</use_24_format>
- <week_start_monday>False</week_start_monday>
- <lower_hour>7</lower_hour>
- <upper_hour>19</upper_hour>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label6</name>
- <label>Sta_rt Date:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label5</name>
- <label>_Due Date:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator2</name>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox3</name>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label7</name>
- <label>_Status:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <default_focus_target>combo-entry1</default_focus_target>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo1</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>False</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items>Not Started
-In Progress
-Completed
-Cancelled
-</items>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>combo-entry1</name>
- <width>60</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text>Not Started</text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label8</name>
- <label>_Priority:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <default_focus_target>combo-entry2</default_focus_target>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo2</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>False</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items>High
-Normal
-Low
-</items>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>combo-entry2</name>
- <width>60</width>
- <can_focus>True</can_focus>
- <editable>False</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text>High</text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label9</name>
- <label>% Comp_lete:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <default_focus_target>spinbutton1</default_focus_target>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>spinbutton1</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>0</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>10</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkText</class>
- <name>text1</name>
- <height>150</height>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>2</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <can_focus>True</can_focus>
- <label>_Contacts...</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry2</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button4</name>
- <can_focus>True</can_focus>
- <label>Ca_tegories...</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry3</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton1</name>
- <can_focus>True</can_focus>
- <label>Private</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label1</name>
- <label>Task</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table4</name>
- <border_width>4</border_width>
- <rows>4</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>2</row_spacing>
- <column_spacing>4</column_spacing>
-
- <widget>
- <class>GnomeDateEdit</class>
- <name>dateedit3</name>
- <show_time>True</show_time>
- <use_24_format>True</use_24_format>
- <week_start_monday>False</week_start_monday>
- <lower_hour>7</lower_hour>
- <upper_hour>19</upper_hour>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label12</name>
- <label>Date Completed:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label13</name>
- <label>Location:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label14</name>
- <label>URL:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry4</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry5</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label15</name>
- <label>Resources:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry6</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label2</name>
- <label>Details</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/calendar/gui/dialogs/task-editor-dialog.glade.h b/calendar/gui/dialogs/task-editor-dialog.glade.h
deleted file mode 100644
index 9ee959817f..0000000000
--- a/calendar/gui/dialogs/task-editor-dialog.glade.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("S_ubject:");
-gchar *s = N_("Owner:");
-gchar *s = N_("Sta_rt Date:");
-gchar *s = N_("_Due Date:");
-gchar *s = N_("_Status:");
-gchar *s = N_("Not Started\n"
- "In Progress\n"
- "Completed\n"
- "Cancelled\n"
- "");
-gchar *s = N_("Not Started");
-gchar *s = N_("_Priority:");
-gchar *s = N_("High\n"
- "Normal\n"
- "Low\n"
- "");
-gchar *s = N_("High");
-gchar *s = N_("% Comp_lete:");
-gchar *s = N_("_Contacts...");
-gchar *s = N_("Ca_tegories...");
-gchar *s = N_("Private");
-gchar *s = N_("Task");
-gchar *s = N_("Date Completed:");
-gchar *s = N_("Location:");
-gchar *s = N_("URL:");
-gchar *s = N_("Resources:");
-gchar *s = N_("Details");
diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c
deleted file mode 100644
index dd40c1b9df..0000000000
--- a/calendar/gui/dialogs/task-editor.c
+++ /dev/null
@@ -1,481 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * TaskEditor - a GtkObject which handles a libglade-loaded dialog to edit
- * tasks.
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <glade/glade.h>
-#include <e-util/e-util.h>
-#include <cal-client/cal-client.h>
-#include "task-editor.h"
-
-
-typedef struct {
- /* Glade XML data */
- GladeXML *xml;
-
- /* UI handler */
- BonoboUIHandler *uih;
-
- /* Calendar component we are editing; this is an internal copy and is
- * not one of the read-only objects from the parent calendar.
- */
- CalComponent *comp;
-
- /* Widgets from the Glade file */
-
- GtkWidget *app;
-} TaskEditorPrivate;
-
-
-static void task_editor_class_init (TaskEditorClass *class);
-static void task_editor_init (TaskEditor *tedit);
-TaskEditor * task_editor_construct (TaskEditor *tedit);
-static gboolean get_widgets (TaskEditor *tedit);
-static void init_widgets (TaskEditor *tedit);
-static void create_menu (TaskEditor *tedit);
-static void create_toolbar (TaskEditor *tedit);
-static void task_editor_destroy (GtkObject *object);
-
-static GtkObjectClass *parent_class;
-
-E_MAKE_TYPE(task_editor, "TaskEditor", TaskEditor,
- task_editor_class_init, task_editor_init, GTK_TYPE_OBJECT)
-
-
-static void
-task_editor_class_init (TaskEditorClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- parent_class = gtk_type_class (GTK_TYPE_OBJECT);
-
-
- object_class->destroy = task_editor_destroy;
-}
-
-
-static void
-task_editor_init (TaskEditor *tedit)
-{
- TaskEditorPrivate *priv;
-
- priv = g_new0 (TaskEditorPrivate, 1);
- tedit->priv = priv;
-}
-
-
-/**
- * task_editor_new:
- * @Returns: a new #TaskEditor.
- *
- * Creates a new #TaskEditor.
- **/
-TaskEditor *
-task_editor_new (void)
-{
- TaskEditor *tedit;
-
- tedit = TASK_EDITOR (gtk_type_new (task_editor_get_type ()));
-
- return task_editor_construct (tedit);
-}
-
-
-/**
- * task_editor_construct:
- * @tedit: A #TaskEditor.
- *
- * Constructs a task editor by loading its Glade XML file.
- *
- * Return value: The same object as @tedit, or NULL if the widgets could not be
- * created. In the latter case, the task editor will automatically be
- * destroyed.
- **/
-TaskEditor *
-task_editor_construct (TaskEditor *tedit)
-{
- TaskEditorPrivate *priv;
-
- g_return_val_if_fail (tedit != NULL, NULL);
- g_return_val_if_fail (IS_TASK_EDITOR (tedit), NULL);
-
- priv = tedit->priv;
-
- /* Load the content widgets */
-
- priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/task-editor-dialog.glade", NULL);
- if (!priv->xml) {
- g_message ("task_editor_construct(): Could not load the Glade XML file!");
- goto error;
- }
-
- if (!get_widgets (tedit)) {
- g_message ("task_editor_construct(): Could not find all widgets in the XML file!");
- goto error;
- }
-
- init_widgets (tedit);
-
- /* Construct the app */
-
- priv->uih = bonobo_ui_handler_new ();
- if (!priv->uih) {
- g_message ("task_editor_construct(): Could not create the UI handler");
- goto error;
- }
-
- bonobo_ui_handler_set_app (priv->uih, GNOME_APP (priv->app));
-
- create_menu (tedit);
- create_toolbar (tedit);
-
- /* Hook to destruction of the dialog */
-
-#if 0
- gtk_signal_connect (GTK_OBJECT (priv->app), "delete_event",
- GTK_SIGNAL_FUNC (app_delete_event_cb), tedit);
-#endif
-
- /* Show the dialog */
-
- gtk_widget_show (priv->app);
-
- return tedit;
-
- error:
-
- gtk_object_unref (GTK_OBJECT (tedit));
- return NULL;
-}
-
-
-/* Gets the widgets from the XML file and returns if they are all available.
- * For the widgets whose values can be simply set with e-dialog-utils, it does
- * that as well.
- */
-static gboolean
-get_widgets (TaskEditor *tedit)
-{
- TaskEditorPrivate *priv;
-
- priv = tedit->priv;
-
-#define GW(name) glade_xml_get_widget (priv->xml, name)
-
- priv->app = GW ("task-editor-dialog");
-
- return TRUE;
-}
-
-
-/* Hooks the widget signals */
-static void
-init_widgets (TaskEditor *tedit)
-{
- TaskEditorPrivate *priv;
-
- priv = tedit->priv;
-
-}
-
-
-/* Menu bar */
-
-static GnomeUIInfo file_new_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Task"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Task _Request"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Mail Message"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Appointment"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Meeting Re_quest"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Task"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Task _Request"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Journal Entry"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Note"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Ch_oose Form..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo file_page_setup_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Memo Style"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Define Print _Styles..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo file_menu[] = {
- GNOMEUIINFO_MENU_NEW_SUBTREE (file_new_menu),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: S_end"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_SAVE_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_SAVE_AS_ITEM (NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Save Attac_hments..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Delete"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Move to Folder..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Cop_y to Folder..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("Page Set_up"), file_page_setup_menu),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Print Pre_view"), NULL, NULL),
- GNOMEUIINFO_MENU_PRINT_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_PROPERTIES_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CLOSE_ITEM (NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo edit_object_menu[] = {
- GNOMEUIINFO_ITEM_NONE ("FIXME: what goes here?", NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo edit_menu[] = {
- GNOMEUIINFO_MENU_UNDO_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_REDO_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CUT_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_COPY_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_PASTE_ITEM (NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Paste _Special..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CLEAR_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_SELECT_ALL_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Mark as U_nread"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_FIND_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_FIND_AGAIN_ITEM (NULL, NULL),
- GNOMEUIINFO_SUBTREE (N_("_Object"), edit_object_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_previous_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Unread Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: In_complete Task"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Fi_rst Item in Folder"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_next_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Unread Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: In_complete Task"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Last Item in Folder"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_toolbars_menu[] = {
- { GNOME_APP_UI_TOGGLEITEM, N_("FIXME: _Standard"), NULL, NULL, NULL, NULL,
- GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },
- { GNOME_APP_UI_TOGGLEITEM, N_("FIXME: __Formatting"), NULL, NULL, NULL, NULL,
- GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Customize..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_menu[] = {
- GNOMEUIINFO_SUBTREE (N_("Pre_vious"), view_previous_menu),
- GNOMEUIINFO_SUBTREE (N_("Ne_xt"), view_next_menu),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("_Toolbars"), view_toolbars_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo insert_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _File..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: It_em..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Object..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo format_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Font..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Paragraph..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo tools_forms_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Ch_oose Form..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Desi_gn This Form"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: D_esign a Form..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Publish _Form..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Pu_blish Form As..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Script _Debugger"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo tools_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Spelling..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Chec_k Names"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Address _Book..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("_Forms"), tools_forms_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo actions_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _New Task"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: S_end Status Report"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Mark Complete"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Rec_urrence..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: S_kip Occurrence"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Assig_n Task"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Reply"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Reply to A_ll"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: For_ward"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo help_menu[] = {
- GNOMEUIINFO_ITEM_NONE ("FIXME: fix Bonobo so it supports help items!", NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo main_menu[] = {
- GNOMEUIINFO_MENU_FILE_TREE (file_menu),
- GNOMEUIINFO_MENU_EDIT_TREE (edit_menu),
- GNOMEUIINFO_MENU_VIEW_TREE (view_menu),
- GNOMEUIINFO_SUBTREE (N_("_Insert"), insert_menu),
- GNOMEUIINFO_SUBTREE (N_("F_ormat"), format_menu),
- GNOMEUIINFO_SUBTREE (N_("_Tools"), tools_menu),
- GNOMEUIINFO_SUBTREE (N_("Actio_ns"), actions_menu),
- GNOMEUIINFO_MENU_HELP_TREE (help_menu),
- GNOMEUIINFO_END
-};
-
-
-/* Creates the menu bar for the event editor */
-static void
-create_menu (TaskEditor *tedit)
-{
- TaskEditorPrivate *priv;
- BonoboUIHandlerMenuItem *list;
-
- priv = tedit->priv;
-
- bonobo_ui_handler_create_menubar (priv->uih);
-
- list = bonobo_ui_handler_menu_parse_uiinfo_list_with_data (main_menu,
- tedit);
- bonobo_ui_handler_menu_add_list (priv->uih, "/", list);
-}
-
-
-/* Toolbar */
-
-static GnomeUIInfo toolbar[] = {
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Save and Close"),
- N_("Save the task and close the dialog box"),
- NULL,
- GNOME_STOCK_PIXMAP_SAVE),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Print..."),
- N_("Print this item"), NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Insert File..."),
- N_("Insert a file as an attachment"), NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Recurrence..."),
- N_("Configure recurrence rules"), NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Assign Task..."),
- N_("Assign the task to someone"), NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Delete"),
- N_("Delete this item"), NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Previous"),
- N_("Go to the previous item"), NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Next"),
- N_("Go to the next item"), NULL),
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Help"),
- N_("See online help"), NULL, GNOME_STOCK_PIXMAP_HELP),
- GNOMEUIINFO_END
-};
-
-
-/* Creates the toolbar for the event editor */
-static void
-create_toolbar (TaskEditor *tedit)
-{
- TaskEditorPrivate *priv;
- BonoboUIHandlerToolbarItem *list;
- GnomeDockItem *dock_item;
- GtkWidget *toolbar_child;
-
- priv = tedit->priv;
-
- bonobo_ui_handler_create_toolbar (priv->uih, "Toolbar");
-
- /* Fetch the toolbar. What a pain in the ass. */
-
- dock_item = gnome_app_get_dock_item_by_name (GNOME_APP (priv->app), GNOME_APP_TOOLBAR_NAME);
- g_assert (dock_item != NULL);
-
- toolbar_child = gnome_dock_item_get_child (dock_item);
- g_assert (toolbar_child != NULL && GTK_IS_TOOLBAR (toolbar_child));
-
- /* Turn off labels as GtkToolbar sucks */
- gtk_toolbar_set_style (GTK_TOOLBAR (toolbar_child), GTK_TOOLBAR_ICONS);
-
- list = bonobo_ui_handler_toolbar_parse_uiinfo_list_with_data (toolbar,
- tedit);
- bonobo_ui_handler_toolbar_add_list (priv->uih, "/Toolbar", list);
-}
-
-
-static void
-task_editor_destroy (GtkObject *object)
-{
- TaskEditor *tedit;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_TASK_EDITOR (object));
-
- tedit = TASK_EDITOR (object);
-
-
-}
-
-
diff --git a/calendar/gui/dialogs/task-editor.h b/calendar/gui/dialogs/task-editor.h
deleted file mode 100644
index 159b969ab9..0000000000
--- a/calendar/gui/dialogs/task-editor.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- *
- * 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 _TASK_EDITOR_H_
-#define _TASK_EDITOR_H_
-
-#include <gtk/gtkobject.h>
-#include <libgnome/gnome-defs.h>
-#include <bonobo.h>
-
-BEGIN_GNOME_DECLS
-
-
-#define TASK_EDITOR(obj) GTK_CHECK_CAST (obj, task_editor_get_type (), TaskEditor)
-#define TASK_EDITOR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, task_editor_get_type (), TaskEditorClass)
-#define IS_TASK_EDITOR(obj) GTK_CHECK_TYPE (obj, task_editor_get_type ())
-
-
-typedef struct _TaskEditor TaskEditor;
-typedef struct _TaskEditorClass TaskEditorClass;
-
-struct _TaskEditor
-{
- GtkObject object;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _TaskEditorClass
-{
- GtkObjectClass parent_class;
-};
-
-
-GtkType task_editor_get_type (void);
-TaskEditor* task_editor_new (void);
-
-
-
-END_GNOME_DECLS
-
-#endif /* _TASK_EDITOR_H_ */
diff --git a/calendar/gui/dialogs/task-page.glade b/calendar/gui/dialogs/task-page.glade
deleted file mode 100644
index 56f7f83422..0000000000
--- a/calendar/gui/dialogs/task-page.glade
+++ /dev/null
@@ -1,822 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>task-editor-dialog</name>
- <program_name>task-editor-dialog</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>task-editor-dialog.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeApp</class>
- <name>task-editor-dialog</name>
- <visible>False</visible>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <enable_layout_config>True</enable_layout_config>
-
- <widget>
- <class>GnomeDock</class>
- <child_name>GnomeApp:dock</child_name>
- <name>dock1</name>
- <allow_floating>True</allow_floating>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkNotebook</class>
- <child_name>GnomeDock:contents</child_name>
- <name>notebook1</name>
- <border_width>2</border_width>
- <can_focus>True</can_focus>
- <show_tabs>True</show_tabs>
- <show_border>True</show_border>
- <tab_pos>GTK_POS_TOP</tab_pos>
- <scrollable>False</scrollable>
- <tab_hborder>2</tab_hborder>
- <tab_vborder>2</tab_vborder>
- <popup_enable>False</popup_enable>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox1</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
-
- <widget>
- <class>GtkTable</class>
- <name>table3</name>
- <rows>2</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label3</name>
- <label>S_ubject:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <default_focus_target>entry1</default_focus_target>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry1</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label10</name>
- <label>Owner:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label11</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator1</name>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox4</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table1</name>
- <rows>2</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>2</row_spacing>
- <column_spacing>4</column_spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GnomeDateEdit</class>
- <name>dateedit1</name>
- <show_time>True</show_time>
- <use_24_format>False</use_24_format>
- <week_start_monday>False</week_start_monday>
- <lower_hour>7</lower_hour>
- <upper_hour>19</upper_hour>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GnomeDateEdit</class>
- <name>dateedit2</name>
- <show_time>True</show_time>
- <use_24_format>True</use_24_format>
- <week_start_monday>False</week_start_monday>
- <lower_hour>7</lower_hour>
- <upper_hour>19</upper_hour>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label6</name>
- <label>Sta_rt Date:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label5</name>
- <label>_Due Date:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHSeparator</class>
- <name>hseparator2</name>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox3</name>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label7</name>
- <label>_Status:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <default_focus_target>combo-entry1</default_focus_target>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo1</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>False</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items>Not Started
-In Progress
-Completed
-Cancelled
-</items>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>combo-entry1</name>
- <width>60</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text>Not Started</text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label8</name>
- <label>_Priority:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <default_focus_target>combo-entry2</default_focus_target>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCombo</class>
- <name>combo2</name>
- <value_in_list>False</value_in_list>
- <ok_if_empty>True</ok_if_empty>
- <case_sensitive>False</case_sensitive>
- <use_arrows>True</use_arrows>
- <use_arrows_always>False</use_arrows_always>
- <items>High
-Normal
-Low
-</items>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GtkCombo:entry</child_name>
- <name>combo-entry2</name>
- <width>60</width>
- <can_focus>True</can_focus>
- <editable>False</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text>High</text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label9</name>
- <label>% Comp_lete:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <default_focus_target>spinbutton1</default_focus_target>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>spinbutton1</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>0</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>10</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkText</class>
- <name>text1</name>
- <height>150</height>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>2</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <can_focus>True</can_focus>
- <label>_Contacts...</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry2</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button4</name>
- <can_focus>True</can_focus>
- <label>Ca_tegories...</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry3</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton1</name>
- <can_focus>True</can_focus>
- <label>Private</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label1</name>
- <label>Task</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table4</name>
- <border_width>4</border_width>
- <rows>4</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>2</row_spacing>
- <column_spacing>4</column_spacing>
-
- <widget>
- <class>GnomeDateEdit</class>
- <name>dateedit3</name>
- <show_time>True</show_time>
- <use_24_format>True</use_24_format>
- <week_start_monday>False</week_start_monday>
- <lower_hour>7</lower_hour>
- <upper_hour>19</upper_hour>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label12</name>
- <label>Date Completed:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label13</name>
- <label>Location:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label14</name>
- <label>URL:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry4</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry5</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label15</name>
- <label>Resources:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>entry6</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label2</name>
- <label>Details</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c
deleted file mode 100644
index 1a9e00de12..0000000000
--- a/calendar/gui/e-calendar-table.c
+++ /dev/null
@@ -1,482 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * ECalendarTable - displays the iCalendar objects in a table (an ETable).
- * Used for calendar events and tasks.
- */
-
-#include <config.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomeui/gnome-popup-menu.h>
-#include <e-table/e-table-scrolled.h>
-#include <e-table/e-cell-checkbox.h>
-#include <e-table/e-cell-toggle.h>
-#include <e-table/e-cell-text.h>
-#include "e-calendar-table.h"
-#include "calendar-model.h"
-#include "gncal-todo.h"
-
-/* Pixmaps. */
-#include "task.xpm"
-#include "task-recurring.xpm"
-#include "task-assigned.xpm"
-#include "task-assigned-to.xpm"
-
-#include <e-table/check-filled.xpm>
-
-
-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,
- ECalendarTable *cal_table);
-static gint e_calendar_table_on_right_click (ETable *table,
- gint row,
- gint col,
- GdkEventButton *event,
- ECalendarTable *cal_table);
-static void e_calendar_table_on_open_task (GtkWidget *menuitem,
- gpointer data);
-static void e_calendar_table_on_mark_task_complete (GtkWidget *menuitem,
- gpointer data);
-static void e_calendar_table_on_delete_task (GtkWidget *menuitem,
- gpointer data);
-static gint e_calendar_table_on_key_press (ETable *table,
- gint row,
- gint col,
- GdkEventKey *event,
- ECalendarTable *cal_table);
-
-static void e_calendar_table_open_task (ECalendarTable *cal_table,
- gint row);
-
-/* The icons to represent the task. */
-#define E_CALENDAR_MODEL_NUM_ICONS 4
-static char** icon_xpm_data[E_CALENDAR_MODEL_NUM_ICONS] = {
- task_xpm, task_recurring_xpm, task_assigned_xpm, task_assigned_to_xpm
-};
-static GdkPixbuf* icon_pixbufs[E_CALENDAR_MODEL_NUM_ICONS] = { 0 };
-
-static GtkTableClass *parent_class;
-
-
-GtkType
-e_calendar_table_get_type (void)
-{
- static GtkType e_calendar_table_type = 0;
-
- if (!e_calendar_table_type){
- GtkTypeInfo e_calendar_table_info = {
- "ECalendarTable",
- sizeof (ECalendarTable),
- sizeof (ECalendarTableClass),
- (GtkClassInitFunc) e_calendar_table_class_init,
- (GtkObjectInitFunc) e_calendar_table_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- parent_class = gtk_type_class (GTK_TYPE_TABLE);
- e_calendar_table_type = gtk_type_unique (GTK_TYPE_TABLE,
- &e_calendar_table_info);
- }
-
- return e_calendar_table_type;
-}
-
-
-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;
-
-#if 0
- widget_class->realize = e_calendar_table_realize;
- widget_class->unrealize = e_calendar_table_unrealize;
- widget_class->style_set = e_calendar_table_style_set;
- widget_class->size_allocate = e_calendar_table_size_allocate;
- widget_class->focus_in_event = e_calendar_table_focus_in;
- widget_class->focus_out_event = e_calendar_table_focus_out;
- widget_class->key_press_event = e_calendar_table_key_press;
-#endif
-}
-
-
-#define E_CALENDAR_TABLE_SPEC \
- "<ETableSpecification click-to-add=\"1\">" \
- "<columns-shown>" \
- "<column> 16 </column>" \
- "<column> 17 </column>" \
- "<column> 13 </column>" \
- "</columns-shown>" \
- "<grouping> </grouping>" \
- "</ETableSpecification>"
-
-#define e_cell_time_new e_cell_text_new
-#define e_cell_time_compare g_str_compare
-#define e_cell_geo_pos_new e_cell_text_new
-#define e_cell_geo_pos_compare g_str_compare
-
-static void
-e_calendar_table_init (ECalendarTable *cal_table)
-{
- GtkWidget *table;
- ETableModel *model;
- ETableHeader *header;
- ECell *cell;
- ETableCol *column;
- gint i;
- GdkPixbuf *pixbuf;
- GdkColormap *colormap;
- gboolean success[E_CALENDAR_TABLE_COLOR_LAST];
- gint nfailed;
-
- /* Allocate the colors we need. */
- colormap = gtk_widget_get_colormap (GTK_WIDGET (cal_table));
-
- cal_table->colors[E_CALENDAR_TABLE_COLOR_OVERDUE].red = 65535;
- cal_table->colors[E_CALENDAR_TABLE_COLOR_OVERDUE].green = 0;
- cal_table->colors[E_CALENDAR_TABLE_COLOR_OVERDUE].blue = 0;
-
- nfailed = gdk_colormap_alloc_colors (colormap, cal_table->colors,
- E_CALENDAR_TABLE_COLOR_LAST,
- FALSE, TRUE, success);
- if (nfailed)
- g_warning ("Failed to allocate all colors");
-
-
- cal_table->model = calendar_model_new ();
- model = E_TABLE_MODEL (cal_table->model);
-
- header = e_table_header_new ();
- gtk_object_ref (GTK_OBJECT (header));
- gtk_object_sink (GTK_OBJECT (header));
-
-
- cell = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_COMMENT, _("Comment"),
- 1.0, 10, cell, g_str_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_COMMENT);
-
- cell = e_cell_time_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_COMPLETED, _("Completed"),
- 1.0, 10, cell, e_cell_time_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_COMPLETED);
-
- cell = e_cell_time_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_CREATED, _("Created"),
- 1.0, 10, cell, e_cell_time_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_CREATED);
-
- cell = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_DESCRIPTION, _("Description"),
- 1.0, 10, cell, g_str_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_DESCRIPTION);
-
- cell = e_cell_time_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_DTSTAMP, _("Timestamp"),
- 1.0, 10, cell, e_cell_time_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_DTSTAMP);
-
- cell = e_cell_time_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_DTSTART, _("Start Date"),
- 1.0, 10, cell, e_cell_time_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_DTSTART);
-
- cell = e_cell_time_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_DTEND, _("End Date"),
- 1.0, 10, cell, e_cell_time_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_DTEND);
-
- cell = e_cell_geo_pos_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_GEO, _("Geographical Position"),
- 1.0, 10, cell, e_cell_geo_pos_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_GEO);
-
- cell = e_cell_time_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_LAST_MOD, _("Last Modification Date"),
- 1.0, 10, cell, e_cell_time_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_LAST_MOD);
-
- cell = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_LOCATION, _("Location"),
- 1.0, 10, cell, g_str_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_LOCATION);
-
- cell = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_ORGANIZER, _("Organizer"),
- 1.0, 10, cell, g_str_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_ORGANIZER);
-
- cell = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_PERCENT, _("% Complete"),
- 1.0, 10, cell, g_str_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_PERCENT);
-
- cell = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_PRIORITY, _("Priority"),
- 1.0, 10, cell, g_str_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_PRIORITY);
-
- /* FIXME: This should really be 'Subject' in the big view. */
- cell = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
- gtk_object_set (GTK_OBJECT (cell),
- "strikeout_column", ICAL_OBJECT_FIELD_COMPLETE,
- "bold_column", ICAL_OBJECT_FIELD_OVERDUE,
- "color_column", ICAL_OBJECT_FIELD_COLOR,
- NULL);
- column = e_table_col_new (ICAL_OBJECT_FIELD_SUMMARY, _("TaskPad"),
- 1.0, 10, cell, g_str_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_SUMMARY);
-
- cell = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_URL, _("URL"),
- 1.0, 10, cell, g_str_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_URL);
-
- cell = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
- column = e_table_col_new (ICAL_OBJECT_FIELD_HAS_ALARMS, _("Reminder"),
- 1.0, 10, cell, g_str_compare, TRUE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_HAS_ALARMS);
-
- /* Create pixmaps. */
- if (!icon_pixbufs[0]) {
- for (i = 0; i < E_CALENDAR_MODEL_NUM_ICONS; i++) {
- icon_pixbufs[i] = gdk_pixbuf_new_from_xpm_data (
- (const char **) icon_xpm_data[i]);
- }
- }
-
- cell = e_cell_toggle_new (0, 4, icon_pixbufs);
- column = e_table_col_new_with_pixbuf (ICAL_OBJECT_FIELD_ICON,
- icon_pixbufs[0], 0.0, 16, cell,
- g_int_compare, FALSE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_ICON);
-
- cell = e_cell_checkbox_new ();
- pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) check_filled_xpm);
- column = e_table_col_new_with_pixbuf (ICAL_OBJECT_FIELD_COMPLETE,
- pixbuf, 0.0, 16, cell,
- g_int_compare, FALSE);
- e_table_header_add_column (header, column, ICAL_OBJECT_FIELD_COMPLETE);
-
-
- table = e_table_scrolled_new (header, model, E_CALENDAR_TABLE_SPEC);
- gtk_object_set (GTK_OBJECT (table),
- "click_to_add_message", "Click here to add a new Task",
- NULL);
- 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);
-
- gtk_signal_connect (GTK_OBJECT (table), "double_click",
- GTK_SIGNAL_FUNC (e_calendar_table_on_double_click),
- cal_table);
- gtk_signal_connect (GTK_OBJECT (table), "right_click",
- GTK_SIGNAL_FUNC (e_calendar_table_on_right_click),
- cal_table);
- gtk_signal_connect (GTK_OBJECT (table), "key_press",
- GTK_SIGNAL_FUNC (e_calendar_table_on_key_press),
- cal_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 (gtk_type_new (e_calendar_table_get_type ()));
-
- return cal_table;
-}
-
-
-static void
-e_calendar_table_destroy (GtkObject *object)
-{
- ECalendarTable *cal_table;
-
- cal_table = E_CALENDAR_TABLE (object);
-
-
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-
-void
-e_calendar_table_set_cal_client (ECalendarTable *cal_table,
- CalClient *client)
-{
- g_print ("In e_calendar_table_set_cal_client\n");
-
- calendar_model_set_cal_client (cal_table->model, client,
- CALOBJ_TYPE_TODO);
-}
-
-
-static void
-e_calendar_table_on_double_click (ETable *table,
- gint row,
- ECalendarTable *cal_table)
-{
- g_print ("In e_calendar_table_on_double_click row:%i\n", row);
-
- e_calendar_table_open_task (cal_table, row);
-}
-
-
-static GnomeUIInfo e_calendar_table_popup_uiinfo[] = {
- { GNOME_APP_UI_ITEM, N_("Open..."),
- N_("Open the task"), e_calendar_table_on_open_task,
- NULL, NULL, 0, 0, 0, 0 },
- { GNOME_APP_UI_ITEM, N_("Mark Complete"),
- N_("Mark the task complete"), e_calendar_table_on_mark_task_complete,
- NULL, NULL, 0, 0, 0, 0 },
- { GNOME_APP_UI_ITEM, N_("Delete"),
- N_("Delete the task"), e_calendar_table_on_delete_task,
- NULL, NULL, 0, 0, 0, 0 },
-
- GNOMEUIINFO_END
-};
-
-
-typedef struct _ECalendarMenuData ECalendarMenuData;
-struct _ECalendarMenuData {
- ECalendarTable *cal_table;
- gint row;
-};
-
-static gint
-e_calendar_table_on_right_click (ETable *table,
- gint row,
- gint col,
- GdkEventButton *event,
- ECalendarTable *cal_table)
-{
- ECalendarMenuData menu_data;
- GtkWidget *popup_menu;
-
- menu_data.cal_table = cal_table;
- menu_data.row = row;
-
- popup_menu = gnome_popup_menu_new (e_calendar_table_popup_uiinfo);
- gnome_popup_menu_do_popup_modal (popup_menu, NULL, NULL, event,
- &menu_data);
-
- gtk_widget_destroy (popup_menu);
-
- return TRUE;
-}
-
-
-static void
-e_calendar_table_on_open_task (GtkWidget *menuitem,
- gpointer data)
-{
- ECalendarMenuData *menu_data = (ECalendarMenuData*) data;
-
- e_calendar_table_open_task (menu_data->cal_table,
- menu_data->row);
-}
-
-
-static void
-e_calendar_table_on_mark_task_complete (GtkWidget *menuitem,
- gpointer data)
-{
- ECalendarMenuData *menu_data = (ECalendarMenuData*) data;
-
- calendar_model_mark_task_complete (menu_data->cal_table->model,
- menu_data->row);
-}
-
-
-static void
-e_calendar_table_on_delete_task (GtkWidget *menuitem,
- gpointer data)
-{
- ECalendarMenuData *menu_data = (ECalendarMenuData*) data;
-
- calendar_model_delete_task (menu_data->cal_table->model,
- menu_data->row);
-}
-
-
-
-static gint
-e_calendar_table_on_key_press (ETable *table,
- gint row,
- gint col,
- GdkEventKey *event,
- ECalendarTable *cal_table)
-{
- g_print ("In e_calendar_table_on_key_press\n");
-
- if (event->keyval == GDK_Delete) {
- g_print (" delete key!!!\n");
-
- calendar_model_delete_task (cal_table->model, row);
- }
-
- return FALSE;
-}
-
-
-static void
-e_calendar_table_open_task (ECalendarTable *cal_table,
- gint row)
-{
- iCalObject *ico;
-
-#if 0
- task_editor_new ();
- /* FIXME: Set iCalObject to edit. */
-#endif
-
- ico = calendar_model_get_cal_object (cal_table->model, row);
-
- gncal_todo_edit (calendar_model_get_cal_client (cal_table->model),
- ico);
-}
-
-
diff --git a/calendar/gui/e-calendar-table.h b/calendar/gui/e-calendar-table.h
deleted file mode 100644
index eed021e846..0000000000
--- a/calendar/gui/e-calendar-table.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- *
- * 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_CALENDAR_TABLE_H_
-#define _E_CALENDAR_TABLE_H_
-
-#include <gtk/gtktable.h>
-#include "calendar-model.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * ECalendarTable - displays the iCalendar objects in a table (an ETable).
- * Used for calendar events and tasks.
- */
-
-/* These index our colors array. */
-typedef enum
-{
- E_CALENDAR_TABLE_COLOR_OVERDUE,
-
- E_CALENDAR_TABLE_COLOR_LAST
-} ECalendarTableColors;
-
-
-#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;
-
- CalendarModel *model;
-
- /* Colors for drawing. */
- GdkColor colors[E_CALENDAR_TABLE_COLOR_LAST];
-};
-
-struct _ECalendarTableClass
-{
- GtkTableClass parent_class;
-};
-
-
-GtkType e_calendar_table_get_type (void);
-GtkWidget* e_calendar_table_new (void);
-
-
-void e_calendar_table_set_cal_client (ECalendarTable *cal_table,
- CalClient *client);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_CALENDAR_TABLE_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 8353c0497e..0000000000
--- a/calendar/gui/e-day-view-main-item.c
+++ /dev/null
@@ -1,651 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EDayViewMainItem - canvas item which displays most of the appointment
- * data in the main Day/Work Week display.
- */
-
-#include <config.h>
-#include "e-day-view-main-item.h"
-
-static void e_day_view_main_item_class_init (EDayViewMainItemClass *class);
-static void e_day_view_main_item_init (EDayViewMainItem *dvtitem);
-
-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);
-
-static GnomeCanvasItemClass *parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_DAY_VIEW
-};
-
-
-GtkType
-e_day_view_main_item_get_type (void)
-{
- static GtkType e_day_view_main_item_type = 0;
-
- if (!e_day_view_main_item_type) {
- GtkTypeInfo e_day_view_main_item_info = {
- "EDayViewMainItem",
- sizeof (EDayViewMainItem),
- sizeof (EDayViewMainItemClass),
- (GtkClassInitFunc) e_day_view_main_item_class_init,
- (GtkObjectInitFunc) e_day_view_main_item_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- e_day_view_main_item_type = gtk_type_unique (gnome_canvas_item_get_type (), &e_day_view_main_item_info);
- }
-
- return e_day_view_main_item_type;
-}
-
-
-static void
-e_day_view_main_item_class_init (EDayViewMainItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type());
-
- 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;
-}
-
-
-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 (parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (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 *fg_gc, *bg_gc, *light_gc, *dark_gc, *gc;
- GdkFont *font;
- gint row, row_y, grid_x1, grid_x2;
- gint day, grid_y1, grid_y2;
- gint work_day_start_row, work_day_end_row;
- gint work_day_start_y, work_day_end_y;
- gint work_day_x, work_day_w;
- gint start_row, end_row, rect_x, rect_y, rect_width, rect_height;
-
-#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 (day_view)->style;
- font = style->font;
- 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];
-
- /* Paint the background colors. */
- gc = day_view->main_gc;
- work_day_start_row = e_day_view_convert_time_to_row (day_view, day_view->work_day_start_hour, day_view->work_day_start_minute);
- work_day_start_y = work_day_start_row * day_view->row_height - y;
- work_day_end_row = e_day_view_convert_time_to_row (day_view, day_view->work_day_end_hour, day_view->work_day_end_minute);
- work_day_end_y = work_day_end_row * day_view->row_height - y;
-
- work_day_x = day_view->day_offsets[0] - x;
- work_day_w = width - work_day_x;
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]);
- gdk_draw_rectangle (drawable, gc, TRUE,
- work_day_x, 0 - y,
- work_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,
- work_day_x, work_day_start_y,
- work_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,
- work_day_x, work_day_end_y,
- work_day_w, height - work_day_end_y);
-
- /* Paint the selection background. */
- if (GTK_WIDGET_HAS_FOCUS (day_view)
- && 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;
-
- gc = style->bg_gc[GTK_STATE_SELECTED];
- 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;
-
- 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, dark_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, fg_gc,
- grid_x1, grid_y1,
- grid_x1, grid_y2);
- gdk_draw_line (drawable, fg_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;
-
- 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++) {
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- /* 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);
- }
-}
-
-
-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;
-
- 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++) {
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- if (!e_day_view_find_long_event_days (day_view, event,
- &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);
- }
- }
-
-
- }
-}
-
-
-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;
- CalComponent *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;
-
- 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;
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]);
-
- /* 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 white 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. */
-#if 0
- if (event->start_row_or_col == 0)
- gdk_draw_rectangle (drawable, style->white_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, style->white_gc, TRUE,
- item_x + 1, item_y + 1,
- MAX (item_w - 2, 0), item_h - 2);
-
- /* Draw the right edge of the vertical bar. */
- gdk_draw_line (drawable, style->black_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_DAY_VIEW_POS_NONE
- && day_view->resize_event_day == day
- && day_view->resize_event_num == event_num) {
- if (day_view->resize_drag_pos == E_DAY_VIEW_POS_TOP_EDGE)
- bar_y1 = item_y + 1;
- else if (day_view->resize_drag_pos == E_DAY_VIEW_POS_BOTTOM_EDGE)
- bar_y2 = item_y + item_h - 1;
- }
-
- 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_draw_rectangle (drawable, style->black_gc, FALSE,
- item_x, item_y, MAX (item_w - 1, 0), item_h - 1);
-
-#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;
- 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;
- comp = event->comp;
-
-#if 0
- if (ico->dalarm.enabled || ico->malarm.enabled
- || ico->palarm.enabled || ico->aalarm.enabled) {
- draw_reminder_icon = TRUE;
- num_icons++;
- }
-#endif
-
- if (cal_component_has_rrules (comp)
- || cal_component_has_rdates (comp)) {
- draw_recurrence_icon = TRUE;
- 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_origin (gc, icon_x, icon_y);
- gdk_gc_set_clip_mask (gc, day_view->reminder_mask);
- gdk_draw_pixmap (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));
- 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_origin (gc, icon_x, icon_y);
- gdk_gc_set_clip_mask (gc, day_view->recurrence_mask);
- gdk_draw_pixmap (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_gc_set_clip_mask (gc, NULL);
- }
-}
-
-
-/* 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 d8305e594d..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@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_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 c2dcf55727..0000000000
--- a/calendar/gui/e-day-view-time-item.c
+++ /dev/null
@@ -1,531 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EDayViewTimeItem - canvas item which displays the times down the left of
- * the EDayView.
- */
-
-#include <config.h>
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkradiomenuitem.h>
-#include "e-day-view-time-item.h"
-#include "../../e-util/e-gui-utils.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). */
-#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
-
-
-static void e_day_view_time_item_class_init (EDayViewTimeItemClass *class);
-static void e_day_view_time_item_init (EDayViewTimeItem *dvtmitem);
-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_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);
-
-
-static GnomeCanvasItemClass *parent_class;
-
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_DAY_VIEW
-};
-
-
-GtkType
-e_day_view_time_item_get_type (void)
-{
- static GtkType e_day_view_time_item_type = 0;
-
- if (!e_day_view_time_item_type) {
- GtkTypeInfo e_day_view_time_item_info = {
- "EDayViewTimeItem",
- sizeof (EDayViewTimeItem),
- sizeof (EDayViewTimeItemClass),
- (GtkClassInitFunc) e_day_view_time_item_class_init,
- (GtkObjectInitFunc) e_day_view_time_item_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- e_day_view_time_item_type = gtk_type_unique (gnome_canvas_item_get_type (), &e_day_view_time_item_info);
- }
-
- return e_day_view_time_item_type;
-}
-
-
-static void
-e_day_view_time_item_class_init (EDayViewTimeItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type());
-
- 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 (parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (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;
-
- day_view = dvtmitem->day_view;
- g_return_val_if_fail (day_view != NULL, 0);
-
- /* Calculate the width of each time column. */
- if (day_view->mins_per_row == 60) {
- dvtmitem->column_width = day_view->max_small_hour_width
- + day_view->colon_width
- + day_view->max_minute_width
- + E_DVTMI_60_MIN_X_PAD * 2
- + E_DVTMI_TIME_GRID_X_PAD * 2;
- } else {
- dvtmitem->column_width = day_view->max_large_hour_width
- + day_view->max_minute_width
- + E_DVTMI_MIN_X_PAD * 2
- + E_DVTMI_HOUR_L_PAD
- + E_DVTMI_HOUR_R_PAD
- + E_DVTMI_TIME_GRID_X_PAD * 2;
- }
-
- 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;
- gint time_hour_x1, time_hour_x2, time_min_x1;
- gint hour, minute, hour_y, min_y, hour_r, min_r, start_y;
- gint row, row_y, min_width, hour_width;
- GtkStyle *style;
- GdkFont *small_font, *large_font;
- GdkGC *fg_gc, *dark_gc;
- gchar buffer[16];
-
- dvtmitem = E_DAY_VIEW_TIME_ITEM (canvas_item);
- day_view = dvtmitem->day_view;
- g_return_if_fail (day_view != NULL);
-
- style = GTK_WIDGET (day_view)->style;
- small_font = style->font;
- large_font = day_view->large_font;
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- dark_gc = style->dark_gc[GTK_STATE_NORMAL];
-
- /* Step through each row, drawing the horizontal grid lines for each
- day column and the times. */
- time_hour_x1 = E_DVTMI_TIME_GRID_X_PAD - x;
- time_hour_x2 = dvtmitem->column_width - E_DVTMI_TIME_GRID_X_PAD - x;
- if (day_view->mins_per_row == 60) {
- min_r = time_hour_x2 - E_DVTMI_60_MIN_X_PAD;
- } else {
- time_min_x1 = time_hour_x2 - E_DVTMI_MIN_X_PAD * 2
- - day_view->max_minute_width;
- hour_r = time_min_x1 - E_DVTMI_HOUR_R_PAD;
- min_r = time_hour_x2 - E_DVTMI_MIN_X_PAD;
- }
-
- hour = day_view->first_hour_shown;
- hour_y = large_font->ascent + 2; /* FIXME */
- minute = day_view->first_minute_shown;
- min_y = small_font->ascent + 2; /* FIXME */
- start_y = 0 - MAX (day_view->row_height, hour_y + large_font->descent);
- for (row = 0, row_y = 0 - y;
- row < day_view->rows && row_y < height;
- row++, row_y += day_view->row_height) {
- if (row_y > start_y) {
- /* Draw the times down the left if needed. */
- if (min_r <= 0)
- continue;
-
- if (day_view->mins_per_row == 60) {
- gdk_draw_line (drawable, dark_gc,
- time_hour_x1, row_y,
- time_hour_x2, row_y);
- sprintf (buffer, "%02i:%02i", hour, minute);
- min_width = day_view->small_hour_widths[hour] + day_view->minute_widths[minute / 5] + day_view->colon_width;
- gdk_draw_string (drawable, small_font, fg_gc,
- min_r - min_width,
- row_y + min_y, buffer);
- } else {
- if (minute == 0) {
- gdk_draw_line (drawable, dark_gc,
- time_hour_x1, row_y,
- time_hour_x2, row_y);
- sprintf (buffer, "%02i", hour);
- hour_width = day_view->large_hour_widths[hour];
- gdk_draw_string (drawable, large_font,
- fg_gc,
- hour_r - hour_width,
- row_y + hour_y,
- buffer);
- } else {
- gdk_draw_line (drawable, dark_gc,
- time_min_x1, row_y,
- time_hour_x2, row_y);
- }
-
- if (day_view->mins_per_row != 30
- || minute != 30) {
- sprintf (buffer, "%02i", minute);
- min_width = day_view->minute_widths[minute / 5];
- gdk_draw_string (drawable, small_font,
- fg_gc,
- min_r - min_width,
- row_y + min_y,
- buffer);
- }
- }
- }
-
- minute += day_view->mins_per_row;
- if (minute >= 60) {
- hour++;
- minute -= 60;
- }
- }
-}
-
-
-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_hide (GTK_MENU (menu));
-
- for (i = 0; i < num_divisions; i++) {
- sprintf (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);
-
- gtk_object_set_data (GTK_OBJECT (item), "divisions",
- GINT_TO_POINTER (divisions[i]));
-
- gtk_signal_connect (GTK_OBJECT (item), "toggled",
- 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 (item)->active)
- return;
-
- divisions = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (item),
- "divisions"));
- e_day_view_set_mins_per_row (day_view, 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 8b20fe999e..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@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_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 88e30885ca..0000000000
--- a/calendar/gui/e-day-view-top-item.c
+++ /dev/null
@@ -1,586 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EDayViewTopItem - displays the top part of the Day/Work Week calendar view.
- */
-
-#include <config.h>
-#include "e-day-view-top-item.h"
-
-static void e_day_view_top_item_class_init (EDayViewTopItemClass *class);
-static void e_day_view_top_item_init (EDayViewTopItem *dvtitem);
-
-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);
-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);
-
-
-static GnomeCanvasItemClass *parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_DAY_VIEW
-};
-
-
-GtkType
-e_day_view_top_item_get_type (void)
-{
- static GtkType e_day_view_top_item_type = 0;
-
- if (!e_day_view_top_item_type) {
- GtkTypeInfo e_day_view_top_item_info = {
- "EDayViewTopItem",
- sizeof (EDayViewTopItem),
- sizeof (EDayViewTopItemClass),
- (GtkClassInitFunc) e_day_view_top_item_class_init,
- (GtkObjectInitFunc) e_day_view_top_item_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- e_day_view_top_item_type = gtk_type_unique (gnome_canvas_item_get_type (), &e_day_view_top_item_info);
- }
-
- return e_day_view_top_item_type;
-}
-
-
-static void
-e_day_view_top_item_class_init (EDayViewTopItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type());
-
- 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 (parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (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 *fg_gc, *bg_gc, *light_gc, *dark_gc;
- gchar buffer[128];
- GdkRectangle clip_rect;
- GdkFont *font;
- gint canvas_width, canvas_height, left_edge, day, date_width, date_x;
- gint item_height, event_num;
- struct tm *day_start;
-
-#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 (day_view)->style;
- font = style->font;
- 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;
-
- /* Clear the entire background. */
- gdk_draw_rectangle (drawable, dark_gc, TRUE,
- left_edge - x, 0,
- canvas_width - left_edge, height);
-
- /* Draw the shadow around the dates. */
- gdk_draw_line (drawable, light_gc,
- left_edge + 1 - x, 1 - y,
- canvas_width - 2 - x, 1 - y);
- gdk_draw_line (drawable, light_gc,
- left_edge + 1 - x, 2 - y,
- left_edge + 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);
-
- /* 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_draw_rectangle (drawable, style->white_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++) {
- day_start = localtime (&day_view->day_starts[day]);
-
- if (day_view->date_format == E_DAY_VIEW_DATE_FULL)
- strftime (buffer, 128, "%d %B", day_start);
- else if (day_view->date_format == E_DAY_VIEW_DATE_ABBREVIATED)
- strftime (buffer, 128, "%d %b", day_start);
- else
- strftime (buffer, 128, "%d", day_start);
-
- 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);
-
- date_width = gdk_string_width (font, buffer);
- date_x = day_view->day_offsets[day] + (day_view->day_widths[day] - date_width) / 2;
- gdk_draw_string (drawable, font, fg_gc,
- date_x - x, 3 + font->ascent - y, buffer);
-
- 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_draw_line (drawable, style->black_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;
- GdkFont *font;
- gint start_day, end_day;
- gint item_x, item_y, item_w, item_h;
- gint text_x, icon_x, icon_y, icon_x_inc;
- CalComponent *comp;
- gchar buffer[16];
- gint hour, minute, offset, time_width, time_x, min_end_time_x;
- gboolean draw_start_triangle, draw_end_triangle;
- GdkRectangle clip_rect;
-
- 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 (day_view)->style;
- font = style->font;
- gc = day_view->main_gc;
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- bg_gc = style->bg_gc[GTK_STATE_NORMAL];
- comp = event->comp;
-
- /* Draw the lines across the top & bottom of the entire event. */
- gdk_draw_line (drawable, fg_gc,
- item_x - x, item_y - y,
- item_x + item_w - 1 - x, item_y - y);
- gdk_draw_line (drawable, fg_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. */
- gdk_draw_rectangle (drawable, bg_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_DAY_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_DAY_VIEW_POS_LEFT_EDGE)
- draw_start_triangle = FALSE;
-
- if (day_view->resize_drag_pos == E_DAY_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);
- } else {
- gdk_draw_line (drawable, fg_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);
- } else {
- gdk_draw_line (drawable, fg_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 icons. */
- icon_x_inc = E_DAY_VIEW_ICON_WIDTH + E_DAY_VIEW_ICON_X_PAD;
- icon_x = text_x - icon_x_inc - x;
- icon_y = item_y + 1 + E_DAY_VIEW_ICON_Y_PAD - y;
-
- if (cal_component_has_rrules (comp)
- || cal_component_has_rdates (comp)) {
- gdk_gc_set_clip_origin (gc, icon_x, icon_y);
- gdk_gc_set_clip_mask (gc, day_view->recurrence_mask);
- gdk_draw_pixmap (drawable, gc,
- day_view->recurrence_icon,
- 0, 0, icon_x, icon_y,
- E_DAY_VIEW_ICON_WIDTH,
- E_DAY_VIEW_ICON_HEIGHT);
- icon_x -= icon_x_inc;
- }
-
-#if 0
- if (ico->dalarm.enabled || ico->malarm.enabled
- || ico->palarm.enabled || ico->aalarm.enabled) {
- gdk_gc_set_clip_origin (gc, icon_x, icon_y);
- gdk_gc_set_clip_mask (gc, day_view->reminder_mask);
- gdk_draw_pixmap (drawable, gc,
- day_view->reminder_icon,
- 0, 0, icon_x, icon_y,
- E_DAY_VIEW_ICON_WIDTH,
- E_DAY_VIEW_ICON_HEIGHT);
- icon_x -= icon_x_inc;
- }
- gdk_gc_set_clip_mask (gc, NULL);
-#endif
-
- /* Draw the start & end times, if necessary.
- Note that GtkLabel adds 1 to the ascent so we must do that to be
- level with it. */
- min_end_time_x = item_x + E_DAY_VIEW_LONG_EVENT_X_PAD - x;
-
- 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;
- sprintf (buffer, "%02i:%02i", hour, minute);
-
- 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);
-
- gdk_draw_string (drawable, font, fg_gc,
- item_x + E_DAY_VIEW_LONG_EVENT_X_PAD - x,
- item_y + E_DAY_VIEW_LONG_EVENT_Y_PAD + font->ascent + 1 - y,
- buffer);
-
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
-
- min_end_time_x += day_view->small_hour_widths[hour] + 2
- + day_view->max_minute_width + day_view->colon_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_width = day_view->small_hour_widths[hour]
- + day_view->max_minute_width + day_view->colon_width;
- 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) {
- sprintf (buffer, "%02i:%02i", hour, minute);
- gdk_draw_string (drawable, font, fg_gc,
- time_x,
- item_y + E_DAY_VIEW_LONG_EVENT_Y_PAD
- + font->ascent + 1 - y,
- buffer);
- }
- }
-}
-
-
-/* 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)
-{
- EDayView *day_view;
- GtkStyle *style;
- GdkGC *fg_gc, *bg_gc;
- GdkPoint points[3];
- gint c1, c2;
-
- day_view = dvtitem->day_view;
-
- style = GTK_WIDGET (day_view)->style;
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- bg_gc = style->bg_gc[GTK_STATE_NORMAL];
-
- points[0].x = x;
- points[0].y = y;
- points[1].x = x + w;
- points[1].y = y + (h / 2) - 1;
- 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--;
-
- gdk_draw_polygon (drawable, bg_gc, TRUE, points, 3);
- gdk_draw_line (drawable, fg_gc, x, y, x + w, c1);
- gdk_draw_line (drawable, fg_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;
-}
-
-
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 435ef12b58..0000000000
--- a/calendar/gui/e-day-view-top-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@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_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);
-
-
-
-#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 c14da5f58f..0000000000
--- a/calendar/gui/e-day-view.c
+++ /dev/null
@@ -1,5716 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EDayView - displays the Day & Work-Week views of the calendar.
- */
-
-#include <config.h>
-#include <math.h>
-#include <time.h>
-#include <gnome.h>
-#include <gdk/gdkx.h>
-#include <cal-util/timeutil.h>
-#include "e-day-view.h"
-#include "e-day-view-time-item.h"
-#include "e-day-view-top-item.h"
-#include "e-day-view-main-item.h"
-#include "calendar-commands.h"
-#include "popup-menu.h"
-#include "../e-util/e-canvas.h"
-#include "../widgets/e-text/e-text.h"
-#include "e-util/e-canvas-utils.h"
-
-/* Images */
-#include "bell.xpm"
-#include "recur.xpm"
-
-/* 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 \
- "-adobe-utopia-regular-r-normal-*-*-240-*-*-p-*-iso8859-*"
-#define E_DAY_VIEW_LARGE_FONT_FALLBACK \
- "-adobe-helvetica-bold-r-normal-*-*-240-*-*-p-*-iso8859-*"
-
-/* 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
-
-/* Drag and Drop stuff. */
-enum {
- TARGET_CALENDAR_EVENT
-};
-static GtkTargetEntry target_table[] = {
- { "application/x-e-calendar-event", 0, TARGET_CALENDAR_EVENT }
-};
-static guint n_targets = sizeof(target_table) / sizeof(target_table[0]);
-
-static void e_day_view_class_init (EDayViewClass *class);
-static void e_day_view_init (EDayView *day_view);
-static void e_day_view_destroy (GtkObject *object);
-static void e_day_view_realize (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 gint e_day_view_key_press (GtkWidget *widget,
- GdkEventKey *event);
-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_ensure_rows_visible (EDayView *day_view,
- gint start_row,
- gint end_row);
-
-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_time_canvas_button_press (GtkWidget *widget,
- GdkEventButton *event,
- EDayView *day_view);
-
-static void e_day_view_update_calendar_selection_time (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,
- EDayViewPosition 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,
- EDayViewPosition pos,
- gint event_x,
- gint event_y);
-static void e_day_view_on_long_event_click (EDayView *day_view,
- gint event_num,
- GdkEventButton *bevent,
- EDayViewPosition 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,
- EDayViewPosition 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_recalc_day_starts (EDayView *day_view,
- time_t start_time);
-static void e_day_view_recalc_num_rows (EDayView *day_view);
-
-static EDayViewPosition e_day_view_convert_position_in_top_canvas (EDayView *day_view,
- gint x,
- gint y,
- gint *day_return,
- gint *event_num_return);
-static EDayViewPosition 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_item (EDayView *day_view,
- GnomeCanvasItem *item,
- gint *day_return,
- gint *event_num_return);
-static gboolean e_day_view_find_event_from_uid (EDayView *day_view,
- const gchar *uid,
- 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_with_uid (EDayView *day_view,
- const gchar *uid,
- EDayViewForeachEventCallback callback,
- gpointer data);
-
-static void e_day_view_reload_events (EDayView *day_view);
-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 (CalComponent *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_layout_long_events (EDayView *day_view);
-static void e_day_view_layout_long_event (EDayView *day_view,
- EDayViewEvent *event,
- guint8 *grid);
-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_layout_day_events (EDayView *day_view,
- gint day);
-static void e_day_view_layout_day_event (EDayView *day_view,
- gint day,
- EDayViewEvent *event,
- guint8 *grid,
- guint16 *group_starts);
-static void e_day_view_expand_day_event (EDayView *day_view,
- gint day,
- EDayViewEvent *event,
- guint8 *grid);
-static void e_day_view_recalc_cols_per_row (EDayView *day_view,
- gint day,
- guint16 *group_starts);
-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 gint e_day_view_event_sort_func (const void *arg1,
- const void *arg2);
-
-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 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 void e_day_view_on_new_appointment (GtkWidget *widget,
- gpointer data);
-static void e_day_view_on_edit_appointment (GtkWidget *widget,
- gpointer data);
-static void e_day_view_on_delete_occurrence (GtkWidget *widget,
- gpointer data);
-static void e_day_view_on_delete_appointment (GtkWidget *widget,
- gpointer data);
-static void e_day_view_on_unrecur_appointment (GtkWidget *widget,
- gpointer data);
-static EDayViewEvent* e_day_view_get_popup_menu_event (EDayView *day_view);
-
-static gint 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 gint 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 GtkTableClass *parent_class;
-
-
-GtkType
-e_day_view_get_type (void)
-{
- static GtkType e_day_view_type = 0;
-
- if (!e_day_view_type){
- GtkTypeInfo e_day_view_info = {
- "EDayView",
- sizeof (EDayView),
- sizeof (EDayViewClass),
- (GtkClassInitFunc) e_day_view_class_init,
- (GtkObjectInitFunc) e_day_view_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- parent_class = gtk_type_class (GTK_TYPE_TABLE);
- e_day_view_type = gtk_type_unique (GTK_TYPE_TABLE,
- &e_day_view_info);
- }
-
- return e_day_view_type;
-}
-
-
-static void
-e_day_view_class_init (EDayViewClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) 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;
-}
-
-
-static void
-e_day_view_init (EDayView *day_view)
-{
- GdkColormap *colormap;
- gboolean success[E_DAY_VIEW_COLOR_LAST];
- gint day, nfailed;
- GnomeCanvasGroup *canvas_group;
-
- GTK_WIDGET_SET_FLAGS (day_view, GTK_CAN_FOCUS);
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view));
-
- day_view->calendar = NULL;
-
- 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;
-
- 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;
-
- /* FIXME: Initialize day_starts. */
- 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->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->scroll_to_work_day = TRUE;
-
- day_view->editing_event_day = -1;
- day_view->editing_event_num = -1;
- day_view->editing_new_event = FALSE;
-
- day_view->resize_bars_event_day = -1;
- day_view->resize_bars_event_num = -1;
-
- 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_DAY_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;
-
- /* Create the large font. */
- day_view->large_font = gdk_font_load (E_DAY_VIEW_LARGE_FONT);
- if (!day_view->large_font)
- day_view->large_font = gdk_font_load (E_DAY_VIEW_LARGE_FONT_FALLBACK);
- if (!day_view->large_font)
- g_warning ("Couldn't load font");
-
-
- /* Allocate the colors. */
-#if 1
- day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING].red = 247 * 257;
- day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING].green = 247 * 257;
- day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING].blue = 244 * 257;
-
- day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING].red = 216 * 257;
- day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING].green = 216 * 257;
- day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING].blue = 214 * 257;
-#else
-
- /* FG: MistyRose1, LightPink3 | RosyBrown | MistyRose3. */
-
- day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING].red = 255 * 257;
- day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING].green = 228 * 257;
- day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING].blue = 225 * 257;
-
- day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING].red = 238 * 257;
- day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING].green = 162 * 257;
- day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING].blue = 173 * 257;
-#endif
-
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR].red = 0;
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR].green = 0;
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR].blue = 65535;
-
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].red = 65535;
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].green = 65535;
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].blue = 65535;
-
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER].red = 0;
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER].green = 0;
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER].blue = 0;
-
- nfailed = gdk_colormap_alloc_colors (colormap, day_view->colors,
- E_DAY_VIEW_COLOR_LAST, FALSE,
- TRUE, success);
- if (nfailed)
- g_warning ("Failed to allocate all colors");
-
-
-
- /*
- * 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);
- gtk_signal_connect_after (GTK_OBJECT (day_view->top_canvas), "button_press_event",
- GTK_SIGNAL_FUNC (e_day_view_on_top_canvas_button_press),
- day_view);
- gtk_signal_connect_after (GTK_OBJECT (day_view->top_canvas), "button_release_event",
- GTK_SIGNAL_FUNC (e_day_view_on_top_canvas_button_release),
- day_view);
- gtk_signal_connect_after (GTK_OBJECT (day_view->top_canvas), "motion_notify_event",
- GTK_SIGNAL_FUNC (e_day_view_on_top_canvas_motion),
- day_view);
- gtk_signal_connect_after (GTK_OBJECT (day_view->top_canvas),
- "drag_motion",
- GTK_SIGNAL_FUNC (e_day_view_on_top_canvas_drag_motion),
- day_view);
- gtk_signal_connect_after (GTK_OBJECT (day_view->top_canvas),
- "drag_leave",
- GTK_SIGNAL_FUNC (e_day_view_on_top_canvas_drag_leave),
- day_view);
- gtk_signal_connect (GTK_OBJECT (day_view->top_canvas),
- "drag_begin",
- GTK_SIGNAL_FUNC (e_day_view_on_drag_begin),
- day_view);
- gtk_signal_connect (GTK_OBJECT (day_view->top_canvas),
- "drag_end",
- GTK_SIGNAL_FUNC (e_day_view_on_drag_end),
- day_view);
- gtk_signal_connect (GTK_OBJECT (day_view->top_canvas),
- "drag_data_get",
- GTK_SIGNAL_FUNC (e_day_view_on_drag_data_get),
- day_view);
- gtk_signal_connect (GTK_OBJECT (day_view->top_canvas),
- "drag_data_received",
- GTK_SIGNAL_FUNC (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(),
- "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_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,
- "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_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,
- 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);
- gtk_signal_connect (GTK_OBJECT (day_view->main_canvas), "realize",
- GTK_SIGNAL_FUNC (e_day_view_on_canvas_realized),
- day_view);
- gtk_signal_connect_after (GTK_OBJECT (day_view->main_canvas),
- "button_press_event",
- GTK_SIGNAL_FUNC (e_day_view_on_main_canvas_button_press),
- day_view);
- gtk_signal_connect_after (GTK_OBJECT (day_view->main_canvas),
- "button_release_event",
- GTK_SIGNAL_FUNC (e_day_view_on_main_canvas_button_release),
- day_view);
- gtk_signal_connect_after (GTK_OBJECT (day_view->main_canvas),
- "motion_notify_event",
- GTK_SIGNAL_FUNC (e_day_view_on_main_canvas_motion),
- day_view);
- gtk_signal_connect_after (GTK_OBJECT (day_view->main_canvas),
- "drag_motion",
- GTK_SIGNAL_FUNC (e_day_view_on_main_canvas_drag_motion),
- day_view);
- gtk_signal_connect_after (GTK_OBJECT (day_view->main_canvas),
- "drag_leave",
- GTK_SIGNAL_FUNC (e_day_view_on_main_canvas_drag_leave),
- day_view);
- gtk_signal_connect (GTK_OBJECT (day_view->main_canvas),
- "drag_begin",
- GTK_SIGNAL_FUNC (e_day_view_on_drag_begin),
- day_view);
- gtk_signal_connect (GTK_OBJECT (day_view->main_canvas),
- "drag_end",
- GTK_SIGNAL_FUNC (e_day_view_on_drag_end),
- day_view);
- gtk_signal_connect (GTK_OBJECT (day_view->main_canvas),
- "drag_data_get",
- GTK_SIGNAL_FUNC (e_day_view_on_drag_data_get),
- day_view);
- gtk_signal_connect (GTK_OBJECT (day_view->main_canvas),
- "drag_data_received",
- GTK_SIGNAL_FUNC (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(),
- "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_hide (day_view->resize_rect_item);
-
- day_view->resize_bar_item =
- gnome_canvas_item_new (canvas_group,
- gnome_canvas_rect_get_type(),
- "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_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,
- "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_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,
- "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_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,
- "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_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,
- "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_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,
- 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);
- gtk_signal_connect_after (GTK_OBJECT (day_view->time_canvas),
- "button_press_event",
- GTK_SIGNAL_FUNC (e_day_view_on_time_canvas_button_press),
- 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 pixmaps. */
- day_view->reminder_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &day_view->reminder_mask, NULL, bell_xpm);
- day_view->recurrence_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &day_view->recurrence_mask, NULL, recur_xpm);
-
-
- /* Create the cursors. */
- day_view->normal_cursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW);
- 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);
- gtk_drag_dest_set (day_view->main_canvas,
- GTK_DEST_DEFAULT_ALL,
- target_table, n_targets,
- GDK_ACTION_COPY | GDK_ACTION_MOVE);
-}
-
-
-/* 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)
-{
- GtkWidget *day_view;
-
- day_view = GTK_WIDGET (gtk_type_new (e_day_view_get_type ()));
-
- return day_view;
-}
-
-
-static void
-e_day_view_destroy (GtkObject *object)
-{
- EDayView *day_view;
- gint day;
-
- day_view = E_DAY_VIEW (object);
-
- e_day_view_stop_auto_scroll (day_view);
-
- if (day_view->large_font)
- gdk_font_unref (day_view->large_font);
-
- gdk_cursor_destroy (day_view->normal_cursor);
- gdk_cursor_destroy (day_view->move_cursor);
- gdk_cursor_destroy (day_view->resize_width_cursor);
- gdk_cursor_destroy (day_view->resize_height_cursor);
-
- e_day_view_free_events (day_view);
- g_array_free (day_view->long_events, TRUE);
- for (day = 0; day < E_DAY_VIEW_MAX_DAYS; day++)
- g_array_free (day_view->events[day], TRUE);
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-
-static void
-e_day_view_realize (GtkWidget *widget)
-{
- EDayView *day_view;
-
- if (GTK_WIDGET_CLASS (parent_class)->realize)
- (*GTK_WIDGET_CLASS (parent_class)->realize)(widget);
-
- day_view = E_DAY_VIEW (widget);
- day_view->main_gc = gdk_gc_new (widget->window);
-}
-
-
-static void
-e_day_view_unrealize (GtkWidget *widget)
-{
- EDayView *day_view;
-
- day_view = E_DAY_VIEW (widget);
-
- gdk_gc_unref (day_view->main_gc);
- day_view->main_gc = NULL;
-
- if (GTK_WIDGET_CLASS (parent_class)->unrealize)
- (*GTK_WIDGET_CLASS (parent_class)->unrealize)(widget);
-}
-
-
-static void
-e_day_view_style_set (GtkWidget *widget,
- GtkStyle *previous_style)
-{
- EDayView *day_view;
- GdkFont *font;
- gint top_rows, top_canvas_height;
- gint month, max_month_width, max_abbr_month_width, number_width;
- gint hour, max_large_hour_width, month_width;
- gint minute, max_minute_width, i;
- GDate date;
- gchar buffer[128];
- gint times_width;
-
- if (GTK_WIDGET_CLASS (parent_class)->style_set)
- (*GTK_WIDGET_CLASS (parent_class)->style_set)(widget, previous_style);
-
- day_view = E_DAY_VIEW (widget);
- font = widget->style->font;
-
- /* Recalculate the height of each row based on the font size. */
- day_view->row_height = font->ascent + font->descent + E_DAY_VIEW_EVENT_BORDER_HEIGHT * 2 + 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 = font->ascent + font->descent + 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 biggest full month name. */
- g_date_clear (&date, 1);
- g_date_set_dmy (&date, 20, 1, 2000);
- max_month_width = 0;
- max_abbr_month_width = 0;
- for (month = 1; month <= 12; month++) {
- g_date_set_month (&date, month);
-
- g_date_strftime (buffer, 128, "%B", &date);
- month_width = gdk_string_width (font, buffer);
- max_month_width = MAX (max_month_width, month_width);
-
- g_date_strftime (buffer, 128, "%b", &date);
- month_width = gdk_string_width (font, buffer);
- max_abbr_month_width = MAX (max_abbr_month_width, month_width);
- }
- number_width = gdk_string_width (font, "31 ");
- day_view->long_format_width = number_width + max_month_width
- + E_DAY_VIEW_DATE_X_PAD;
- day_view->abbreviated_format_width = number_width
- + max_abbr_month_width + E_DAY_VIEW_DATE_X_PAD;
-
- /* 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++) {
- sprintf (buffer, "%02i", hour);
- day_view->small_hour_widths[hour] = gdk_string_width (font, buffer);
- day_view->large_hour_widths[hour] = gdk_string_width (day_view->large_font, buffer);
- day_view->max_small_hour_width = MAX (day_view->max_small_hour_width, day_view->small_hour_widths[hour]);
- max_large_hour_width = MAX (max_large_hour_width, day_view->large_hour_widths[hour]);
- }
- day_view->max_large_hour_width = max_large_hour_width;
-
- max_minute_width = 0;
- for (minute = 0, i = 0; minute < 60; minute += 5, i++) {
- sprintf (buffer, "%02i", minute);
- day_view->minute_widths[i] = gdk_string_width (font, buffer);
- max_minute_width = MAX (max_minute_width, day_view->minute_widths[i]);
- }
- day_view->max_minute_width = max_minute_width;
- day_view->colon_width = gdk_string_width (font, ":");
-
- /* 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);
-}
-
-
-/* This recalculates the sizes of each column. */
-static void
-e_day_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
-{
- EDayView *day_view;
- gfloat width, offset;
- gint col, 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 (parent_class)->size_allocate) (widget, allocation);
-
- /* 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 (col = 0; col <= day_view->days_shown; col++) {
- day_view->day_offsets[col] = floor (offset + 0.5);
- offset += width;
- }
-
- /* Calculate the days widths based on the offsets. */
- for (col = 0; col < day_view->days_shown; col++) {
- day_view->day_widths[col] = day_view->day_offsets[col + 1] - day_view->day_offsets[col];
- }
-
- /* Determine which date format to use, based on the column widths. */
- if (day_view->day_widths[0] > day_view->long_format_width)
- day_view->date_format = E_DAY_VIEW_DATE_FULL;
- else if (day_view->day_widths[0] > day_view->abbreviated_format_width)
- day_view->date_format = E_DAY_VIEW_DATE_ABBREVIATED;
- else
- day_view->date_format = E_DAY_VIEW_DATE_SHORT;
-
- /* 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 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;
-}
-
-
-void
-e_day_view_set_calendar (EDayView *day_view,
- GnomeCalendar *calendar)
-{
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- day_view->calendar = calendar;
-
- /* FIXME: free current events? */
-}
-
-
-/* This reloads all calendar events. */
-void
-e_day_view_update_all_events (EDayView *day_view)
-{
- e_day_view_reload_events (day_view);
-}
-
-
-/* This is called when one event has been added or updated. */
-void
-e_day_view_update_event (EDayView *day_view,
- const gchar *uid)
-{
- EDayViewEvent *event;
- CalComponent *comp;
- CalClientGetStatus status;
- gint day, event_num;
-
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
-#if 0
- /* FIXME: Just for testing. */
- chdir ("/home/damon/tmp");
- g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL);
-
- g_print ("In e_day_view_update_event day_view:%p uid:%s\n",
- day_view, uid);
-#endif
-
- /* If our calendar or time hasn't been set yet, just return. */
- if (!day_view->calendar
- || (day_view->lower == 0 && day_view->upper == 0))
- return;
-
- /* Get the event from the server. */
- status = cal_client_get_object (day_view->calendar->client, uid, &comp);
-
- switch (status) {
- case CAL_CLIENT_GET_SUCCESS:
- /* Do nothing. */
- break;
- case CAL_CLIENT_GET_SYNTAX_ERROR:
- g_warning ("syntax error uid=%s\n", uid);
- return;
- case CAL_CLIENT_GET_NOT_FOUND:
- g_warning ("obj not found uid=%s\n", uid);
- return;
- }
-
- /* We only care about events. */
- if (comp && cal_component_get_vtype (comp) == CAL_COMPONENT_EVENT) {
- gtk_object_unref (GTK_OBJECT (comp));
- return;
- }
-
- /* If the event already exists and the dates didn't change, we can
- update the event fairly easily without changing the events arrays
- or computing a new layout. */
- if (e_day_view_find_event_from_uid (day_view, uid, &day, &event_num)) {
- 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);
-#warning "FIX ME"
- /* Do this the long way every time for now */
-#if 0
- if (ical_object_compare_dates (event->ico, ico)) {
- g_print ("updated object's dates unchanged\n");
- e_day_view_foreach_event_with_uid (day_view, uid, e_day_view_update_event_cb, ico);
- ical_object_unref (ico);
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- return;
- }
-#endif
- /* The dates have changed, so we need to remove the
- old occurrrences before adding the new ones. */
- g_print ("dates changed - removing occurrences\n");
- e_day_view_foreach_event_with_uid (day_view, uid,
- e_day_view_remove_event_cb,
- NULL);
- }
-
- /* Add the occurrences of the event. */
- cal_recur_generate_instances (comp, day_view->lower,
- day_view->upper,
- e_day_view_add_event,
- day_view);
- gtk_object_unref (GTK_OBJECT (comp));
-
- e_day_view_check_layout (day_view);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-static gboolean
-e_day_view_update_event_cb (EDayView *day_view,
- gint day,
- gint event_num,
- gpointer data)
-{
- EDayViewEvent *event;
- CalComponent *comp;
-
- comp = 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);
- }
-
- gtk_object_unref (GTK_OBJECT (event->comp));
- event->comp = comp;
- gtk_object_ref (GTK_OBJECT (comp));
-
- /* If we are editing an event which we have just created, we will get
- an update_event callback from the server. But we need to ignore it
- or we will lose the text the user has already typed in. */
- if (day_view->editing_new_event
- && day_view->editing_event_day == day
- && day_view->editing_event_num == event_num) {
- return TRUE;
- }
-
- 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);
- }
- return TRUE;
-}
-
-
-/* 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_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);
-
- cal_component_get_uid (event->comp, &u);
- 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);
-
- cal_component_get_uid (event->comp, &u);
- if (u && !strcmp (uid, u)) {
- if (!(*callback) (day_view, E_DAY_VIEW_LONG_EVENT,
- event_num, data))
- return;
- }
- }
-}
-
-
-/* This removes all the events associated with the given uid. Note that for
- recurring events there may be more than one. If any events are found and
- removed we need to layout the events again. */
-void
-e_day_view_remove_event (EDayView *day_view,
- const gchar *uid)
-{
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
-#if 1
- g_print ("In e_day_view_remove_event day_view:%p uid:%s\n",
- day_view, uid);
-#endif
-
- 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);
-}
-
-
-static gboolean
-e_day_view_remove_event_cb (EDayView *day_view,
- gint day,
- gint event_num,
- gpointer data)
-{
- EDayViewEvent *event;
-
-#if 1
- 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 we were editing this event, set editing_event_num 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));
- gtk_object_unref (GTK_OBJECT (event->comp));
-
- 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;
- gchar *text;
- gboolean free_text = FALSE, editing_event = FALSE;
- gint offset, start_minute, end_minute;
- CalComponentText 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;
-
- cal_component_get_summary (event->comp, &summary);
- text = summary.value ? summary.value : "";
-
- 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
- || 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;
- text = g_strdup_printf ("%02i:%02i-%02i:%02i %s",
- start_minute / 60,
- start_minute % 60,
- end_minute / 60,
- end_minute % 60,
- 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;
- CalComponentText 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;
-
- cal_component_get_summary (event->comp, &summary);
- gnome_canvas_item_set (event->canvas_item,
- "text", summary.value ? summary.value : "",
- 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. */
-static 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,
- const gchar *uid,
- gint *day_return,
- gint *event_num_return)
-{
- EDayViewEvent *event;
- gint day, event_num;
- const char *u;
-
- 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);
-
- cal_component_get_uid (event->comp, &u);
- if (u && !strcmp (uid, u)) {
- *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);
-
- cal_component_get_uid (event->comp, &u);
- if (u && !strcmp (uid, u)) {
- *day_return = E_DAY_VIEW_LONG_EVENT;
- *event_num_return = event_num;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-
-/* This sets the selected time range. The EDayView will show the day or week
- corresponding to the start time. 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. */
-void
-e_day_view_set_selected_time_range (EDayView *day_view,
- time_t start_time,
- time_t end_time)
-{
- GDate date;
- time_t lower;
- 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));
-
- /* 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
- Monday. */
- if (day_view->days_shown == 1)
- lower = time_day_begin (start_time);
- else {
- g_date_clear (&date, 1);
- g_date_set_time (&date, start_time);
- g_date_subtract_days (&date, g_date_weekday (&date) - 1);
- lower = time_from_day (g_date_year (&date),
- g_date_month (&date) - 1,
- g_date_day (&date));
- }
-
- /* See if we need to change the days shown. */
- if (lower != day_view->lower) {
- e_day_view_recalc_day_starts (day_view, lower);
- e_day_view_reload_events (day_view);
- need_redraw = TRUE;
- }
-
- /* 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. */
-void
-e_day_view_get_selected_time_range (EDayView *day_view,
- time_t *start_time,
- time_t *end_time)
-{
- gint start_col, start_row, end_col, end_row;
- time_t start, end;
-
- 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;
-}
-
-
-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 (day_view->day_starts[day - 1], 1);
- }
-
- day_view->lower = start_time;
- day_view->upper = day_view->day_starts[day_view->days_shown];
-}
-
-
-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) {
- day_view->days_shown = days_shown;
-
- /* FIXME: Update everything. */
- }
-}
-
-
-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 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);
-}
-
-
-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, scroll_x, scroll_y, day, event_num;
- EDayViewPosition 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;
-
- /* The top canvas doesn't scroll, but just in case. */
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
- &scroll_x, &scroll_y);
- event_x += scroll_x;
- event_y += scroll_y;
-
- pos = e_day_view_convert_position_in_top_canvas (day_view,
- event_x, event_y,
- &day, &event_num);
-
- if (pos == E_DAY_VIEW_POS_OUTSIDE)
- return FALSE;
-
- if (pos != E_DAY_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 (!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));
-
- 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, scroll_x, scroll_y, row, day, event_num;
- EDayViewPosition pos;
-
- /* Handle scroll wheel events */
- if (event->button == 4 || event->button == 5) {
- GtkAdjustment *adj = GTK_LAYOUT (day_view->main_canvas)->vadjustment;
- gfloat new_value;
-
- new_value = adj->value + ((event->button == 4) ?
- -adj->page_increment / 2:
- adj->page_increment / 2);
- new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
- gtk_adjustment_set_value (adj, new_value);
-
- return TRUE;
- }
-
- /* 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;
-
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
- &scroll_x, &scroll_y);
- event_x += scroll_x;
- event_y += scroll_y;
-
- /* 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_DAY_VIEW_POS_OUTSIDE)
- return FALSE;
-
- if (pos != E_DAY_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 (!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, row);
- }
- } else if (event->button == 3) {
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- e_day_view_on_event_right_click (day_view, event, -1, -1);
- }
-
- return TRUE;
-}
-
-
-static gboolean
-e_day_view_on_time_canvas_button_press (GtkWidget *widget,
- GdkEventButton *event,
- EDayView *day_view)
-{
- /* Handle scroll wheel events */
- if (event->button == 4 || event->button == 5) {
- GtkAdjustment *adj = GTK_LAYOUT (day_view->main_canvas)->vadjustment;
- gfloat new_value;
-
- new_value = adj->value + ((event->button == 4) ?
- -adj->page_increment / 2:
- adj->page_increment / 2);
- new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
- gtk_adjustment_set_value (adj, new_value);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-static gboolean
-e_day_view_on_long_event_button_press (EDayView *day_view,
- gint event_num,
- GdkEventButton *event,
- EDayViewPosition 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);
- return TRUE;
- }
- } else if (event->button == 3) {
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- 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,
- EDayViewPosition 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);
- return TRUE;
- }
- } else if (event->button == 3) {
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- 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,
- EDayViewPosition 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_DAY_VIEW_POS_EVENT
- && E_TEXT (event->canvas_item)->editing)
- return;
-
- if (!(cal_component_has_rrules (event->comp)
- && cal_component_has_rdates (event->comp))
- && (pos == E_DAY_VIEW_POS_LEFT_EDGE
- || pos == E_DAY_VIEW_POS_RIGHT_EDGE)) {
- if (!e_day_view_find_long_event_days (day_view, event,
- &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,
- EDayViewPosition 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_DAY_VIEW_POS_EVENT
- && E_TEXT (event->canvas_item)->editing)
- return;
-
- if (!(cal_component_has_rrules (event->comp)
- && cal_component_has_rdates (event->comp))
- && (pos == E_DAY_VIEW_POS_TOP_EDGE
- || pos == E_DAY_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;
-
- 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_DAY_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_DAY_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)
-{
-#if 0
- g_print ("In e_day_view_on_event_double_click\n");
-#endif
-
-}
-
-
-static void
-e_day_view_on_event_right_click (EDayView *day_view,
- GdkEventButton *bevent,
- gint day,
- gint event_num)
-{
- EDayViewEvent *event;
- int have_selection, not_being_edited, items, i;
- struct menu_item *context_menu;
-
- static struct menu_item main_items[] = {
- { N_("New appointment..."), (GtkSignalFunc) e_day_view_on_new_appointment, NULL, TRUE }
- };
-
- static struct menu_item child_items[] = {
- { N_("Edit this appointment..."), (GtkSignalFunc) e_day_view_on_edit_appointment, NULL, TRUE },
- { N_("Delete this appointment"), (GtkSignalFunc) e_day_view_on_delete_appointment, NULL, TRUE },
- { NULL, NULL, NULL, TRUE },
- { N_("New appointment..."), (GtkSignalFunc) e_day_view_on_new_appointment, NULL, TRUE }
- };
-
- static struct menu_item recur_child_items[] = {
- { N_("Edit this appointment..."), (GtkSignalFunc) e_day_view_on_edit_appointment, NULL, TRUE },
- { N_("Make this appointment movable"), (GtkSignalFunc) e_day_view_on_unrecur_appointment, NULL, TRUE },
- { N_("Delete this occurrence"), (GtkSignalFunc) e_day_view_on_delete_occurrence, NULL, TRUE },
- { N_("Delete all occurrences"), (GtkSignalFunc) e_day_view_on_delete_appointment, NULL, TRUE },
- { NULL, NULL, NULL, TRUE },
- { N_("New appointment..."), (GtkSignalFunc) e_day_view_on_new_appointment, NULL, TRUE }
- };
-
- have_selection = GTK_WIDGET_HAS_FOCUS (day_view)
- && day_view->selection_start_day != -1;
-
- if (event_num == -1) {
- items = 1;
- context_menu = &main_items[0];
- context_menu[0].sensitive = have_selection;
- } else {
- 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);
-
- /* This used to be set only if the event wasn't being edited
- in the event editor, but we can't check that at present.
- We could possibly set up another method of checking it. */
- not_being_edited = TRUE;
-
- if (cal_component_has_rrules (event->comp)
- || cal_component_has_rdates (event->comp)) {
- items = 6;
- context_menu = &recur_child_items[0];
- context_menu[0].sensitive = not_being_edited;
- context_menu[1].sensitive = not_being_edited;
- context_menu[2].sensitive = not_being_edited;
- context_menu[3].sensitive = not_being_edited;
- context_menu[5].sensitive = have_selection;
- } else {
- items = 4;
- context_menu = &child_items[0];
- context_menu[0].sensitive = not_being_edited;
- context_menu[1].sensitive = not_being_edited;
- context_menu[3].sensitive = have_selection;
- }
- }
-
- for (i = 0; i < items; i++)
- context_menu[i].data = day_view;
-
- day_view->popup_event_day = day;
- day_view->popup_event_num = event_num;
- popup_menu (context_menu, items, bevent);
-}
-
-
-static void
-e_day_view_on_new_appointment (GtkWidget *widget, gpointer data)
-{
- EDayView *day_view;
- CalComponent *comp;
- CalComponentDateTime date;
- time_t dtstart, dtend;
-
- day_view = E_DAY_VIEW (data);
-
- comp = cal_component_new ();
- e_day_view_get_selected_time_range (day_view, &dtstart, &dtend);
-
- date.value = g_new (struct icaltimetype, 1);
- *date.value = icaltimetype_from_timet (dtstart, FALSE);
- cal_component_set_dtstart (comp, &date);
- *date.value = icaltimetype_from_timet (dtend, FALSE);
- cal_component_set_dtend (comp, &date);
- g_free (date.value);
-
- gnome_calendar_edit_object (day_view->calendar, comp);
- gtk_object_unref (GTK_OBJECT (comp));
-}
-
-
-static void
-e_day_view_on_edit_appointment (GtkWidget *widget, gpointer data)
-{
- EDayView *day_view;
- EDayViewEvent *event;
-
- day_view = E_DAY_VIEW (data);
-
- event = e_day_view_get_popup_menu_event (day_view);
- if (event == NULL)
- return;
-
- gnome_calendar_edit_object (day_view->calendar, event->comp);
-}
-
-
-static void
-e_day_view_on_delete_occurrence (GtkWidget *widget, gpointer data)
-{
- EDayView *day_view;
- EDayViewEvent *event;
- CalComponent *comp;
- CalComponentDateTime *date=NULL;
- GSList *list;
-
- day_view = E_DAY_VIEW (data);
-
- event = e_day_view_get_popup_menu_event (day_view);
- if (event == NULL)
- return;
-
- /* We must duplicate the CalComponent, or we won't know it has changed
- when we get the "update_event" callback. */
- comp = cal_component_clone (event->comp);
- cal_component_get_exdate_list (comp, &list);
- list = g_slist_append (list, date);
- date = g_new0 (CalComponentDateTime, 1);
- date->value = g_new (struct icaltimetype, 1);
- *date->value = icaltimetype_from_timet (event->start, TRUE);
- cal_component_set_exdate_list (comp, list);
- cal_component_free_exdate_list (list);
-
- if (!cal_client_update_object (day_view->calendar->client, comp))
- g_message ("e_day_view_on_delete_occurrence(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (comp));
-}
-
-
-static void
-e_day_view_on_delete_appointment (GtkWidget *widget, gpointer data)
-{
- EDayView *day_view;
- EDayViewEvent *event;
- const char *uid;
-
- day_view = E_DAY_VIEW (data);
-
- event = e_day_view_get_popup_menu_event (day_view);
- if (event == NULL)
- return;
-
- if (day_view->editing_event_day >= 0)
- e_day_view_stop_editing_event (day_view);
-
- cal_component_get_uid (event->comp, &uid);
- if (!cal_client_remove_object (day_view->calendar->client, uid))
- g_message ("e_day_view_on_delete_appointment(): Could not remove the object!");
-}
-
-
-static void
-e_day_view_on_unrecur_appointment (GtkWidget *widget, gpointer data)
-{
- EDayView *day_view;
- EDayViewEvent *event;
- CalComponent *comp, *new_comp;
- CalComponentDateTime *date;
- GSList *list;
-
- day_view = E_DAY_VIEW (data);
-
- event = e_day_view_get_popup_menu_event (day_view);
- if (event == NULL)
- return;
-
- /* For the recurring object, we add a exception to get rid of the
- instance. */
- comp = cal_component_clone (event->comp);
- cal_component_get_exdate_list (comp, &list);
- date = g_new0 (CalComponentDateTime, 1);
- date->value = g_new (struct icaltimetype, 1);
- *date->value = icaltimetype_from_timet (event->start, TRUE);
- list = g_slist_append (list, date);
- cal_component_set_exdate_list (comp, list);
- cal_component_free_exdate_list (list);
-
- /* 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 = cal_component_clone (event->comp);
- cal_component_set_uid (new_comp, cal_component_gen_uid ());
- cal_component_set_exdate_list (new_comp, NULL);
- cal_component_set_exrule_list (new_comp, NULL);
-
- date = g_new0 (CalComponentDateTime, 1);
- date->value = g_new (struct icaltimetype, 1);
-
- *date->value = icaltimetype_from_timet (event->start, FALSE);
- cal_component_set_dtstart (new_comp, date);
- *date->value = icaltimetype_from_timet (event->end, FALSE);
- cal_component_set_dtend (new_comp, date);
-
- cal_component_free_datetime (date);
-
- /* Now update both CalComponents. Note that we do this last since at
- * present the updates happen synchronously so our event may disappear.
- */
- if (!cal_client_update_object (day_view->calendar->client, comp))
- g_message ("e_day_view_on_unrecur_appointment(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (comp));
-
- if (!cal_client_update_object (day_view->calendar->client, new_comp))
- g_message ("e_day_view_on_unrecur_appointment(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (new_comp));
-}
-
-
-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_DAY_VIEW_POS_NONE) {
- e_day_view_finish_long_event_resize (day_view);
- gdk_pointer_ungrab (event->time);
- } 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 (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_DAY_VIEW_POS_NONE) {
- e_day_view_finish_resize (day_view);
- gdk_pointer_ungrab (event->time);
- 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;
-}
-
-
-static void
-e_day_view_update_calendar_selection_time (EDayView *day_view)
-{
- time_t start, end;
-
- e_day_view_get_selected_time_range (day_view, &start, &end);
- gnome_calendar_set_selected_time_range (day_view->calendar,
- start, end);
-}
-
-
-static gboolean
-e_day_view_on_top_canvas_motion (GtkWidget *widget,
- GdkEventMotion *mevent,
- EDayView *day_view)
-{
- EDayViewEvent *event = NULL;
- EDayViewPosition pos;
- gint event_x, event_y, scroll_x, scroll_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;
-
- /* The top canvas doesn't scroll, but just in case. */
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
- &scroll_x, &scroll_y);
- canvas_x = event_x + scroll_x;
- canvas_y = event_y + scroll_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_DAY_VIEW_POS_NONE) {
- if (pos != E_DAY_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 (!(cal_component_has_rdates (event->comp)
- && cal_component_has_rrules (event->comp))
- && (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 &&
- !(cal_component_has_rrules (event->comp)
- && cal_component_has_rdates (event->comp))) {
- switch (pos) {
- case E_DAY_VIEW_POS_LEFT_EDGE:
- case E_DAY_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;
- EDayViewPosition pos;
- gint event_x, event_y, scroll_x, scroll_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;
-
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
- &scroll_x, &scroll_y);
- canvas_x = event_x + scroll_x;
- canvas_y = event_y + scroll_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_DAY_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_DAY_VIEW_POS_NONE) {
- if (pos != E_DAY_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 (!(cal_component_has_rrules (event->comp)
- && cal_component_has_rdates (event->comp))
- && (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 &&
- !(cal_component_has_rrules (event->comp)
- && cal_component_has_rdates (event->comp))) {
- switch (pos) {
- case E_DAY_VIEW_POS_LEFT_EDGE:
- cursor = day_view->move_cursor;
- break;
- case E_DAY_VIEW_POS_TOP_EDGE:
- case E_DAY_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_DAY_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_DAY_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;
- CalComponent *comp;
- CalComponentDateTime date;
- time_t dt;
-
- event_num = day_view->resize_event_num;
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- /* 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 = cal_component_clone (event->comp);
-
- date.value = g_new (struct icaltimetype, 1);
- if (day_view->resize_drag_pos == E_DAY_VIEW_POS_LEFT_EDGE) {
- dt = day_view->day_starts[day_view->resize_start_row];
- *date.value = icaltimetype_from_timet (dt, FALSE);
- cal_component_set_dtstart (comp, &date);
- } else {
- dt = day_view->day_starts[day_view->resize_end_row + 1];
- *date.value = icaltimetype_from_timet (dt, FALSE);
- cal_component_set_dtend (comp, &date);
- }
- g_free (date.value);
-
- gnome_canvas_item_hide (day_view->resize_long_event_rect_item);
-
- day_view->resize_drag_pos = E_DAY_VIEW_POS_NONE;
-
- if (!cal_client_update_object (day_view->calendar->client, comp))
- g_message ("e_day_view_finish_long_event_resize(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (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;
- CalComponent *comp;
- CalComponentDateTime date;
- time_t dt;
-
- day = day_view->resize_event_day;
- event_num = day_view->resize_event_num;
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- /* 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 = cal_component_clone (event->comp);
-
- date.value = g_new (struct icaltimetype, 1);
- if (day_view->resize_drag_pos == E_DAY_VIEW_POS_TOP_EDGE) {
- dt = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_start_row);
- *date.value = icaltimetype_from_timet (dt, FALSE);
- 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 = icaltimetype_from_timet (dt, FALSE);
- cal_component_set_dtend (comp, &date);
- }
- g_free (date.value);
-
- 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_DAY_VIEW_POS_NONE;
-
- if (!cal_client_update_object (day_view->calendar->client, comp))
- g_message ("e_day_view_finish_resize(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (comp));
-}
-
-
-static void
-e_day_view_abort_resize (EDayView *day_view,
- guint32 time)
-{
- gint day, event_num;
-
- if (day_view->resize_drag_pos == E_DAY_VIEW_POS_NONE)
- return;
-
- day_view->resize_drag_pos = E_DAY_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_reload_events (EDayView *day_view)
-{
- e_day_view_free_events (day_view);
-
- /* 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;
-
- /* If both lower & upper are 0, then the time range hasn't been set,
- so we don't try to load any events. */
- if (day_view->calendar
- && (day_view->lower != 0 || day_view->upper != 0)) {
- cal_client_generate_instances (day_view->calendar->client,
- CALOBJ_TYPE_EVENT,
- day_view->lower,
- day_view->upper,
- e_day_view_add_event,
- day_view);
- }
-
- /* We need to do this to make sure the top canvas is resized. */
- day_view->long_events_need_layout = TRUE;
-
- e_day_view_check_layout (day_view);
- e_day_view_reshape_main_canvas_resize_bars (day_view);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-static void
-e_day_view_free_events (EDayView *day_view)
-{
- gint day;
-
- 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));
- gtk_object_unref (GTK_OBJECT (event->comp));
- }
-
- 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 (CalComponent *comp,
- time_t start,
- time_t end,
- gpointer data)
-
-{
- EDayView *day_view;
- EDayViewEvent event;
- gint day, offset;
- struct tm start_tm, end_tm;
-
- day_view = E_DAY_VIEW (data);
-
- /* Check that the event times are valid. */
- g_return_val_if_fail (start <= end, TRUE);
- g_return_val_if_fail (start < day_view->upper, TRUE);
- g_return_val_if_fail (end > day_view->lower, TRUE);
-
- start_tm = *(localtime (&start));
- end_tm = *(localtime (&end));
-
- event.comp = comp;
- gtk_object_ref (GTK_OBJECT (comp));
- 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;
- event.start_minute = start_tm.tm_hour * 60 + start_tm.tm_min - offset;
- event.end_minute = end_tm.tm_hour * 60 + end_tm.tm_min - offset;
-
- event.start_row_or_col = -1;
- event.num_columns = -1;
-
- /* Find out which array to add the event to. */
- for (day = 0; day < day_view->days_shown; day++) {
- if (start >= day_view->day_starts[day]
- && end <= 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 == 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 == day_view->day_starts[day])
- break;
-
- event.end_minute = 24 * 60;
- }
-
- g_array_append_val (day_view->events[day], event);
- day_view->events_sorted[day] = FALSE;
- 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 (day_view->long_events, event);
- day_view->long_events_sorted = FALSE;
- 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;
-
- /* 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, 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);
-
- 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_layout_long_events (EDayView *day_view)
-{
- EDayViewEvent *event;
- gint event_num, old_rows_in_top_display, top_canvas_height, top_rows;
- 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,
- day_view->long_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. */
- old_rows_in_top_display = day_view->rows_in_top_display;
- day_view->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 < day_view->long_events->len;
- event_num++) {
- event = &g_array_index (day_view->long_events,
- EDayViewEvent, event_num);
- e_day_view_layout_long_event (day_view, event, grid);
- }
-
- /* Free the grid. */
- g_free (grid);
-
- /* 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 != old_rows_in_top_display) {
- 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);
- }
-}
-
-
-static void
-e_day_view_layout_long_event (EDayView *day_view,
- EDayViewEvent *event,
- guint8 *grid)
-{
- gint start_day, end_day, free_row, day, row;
-
- event->num_columns = 0;
-
- if (!e_day_view_find_long_event_days (day_view, event,
- &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. */
- day_view->rows_in_top_display = MAX (day_view->rows_in_top_display,
- free_row + 1);
-}
-
-
-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;
- GdkFont *font;
- 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;
- CalComponent *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;
-
- 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 = event->comp;
- font = GTK_WIDGET (day_view)->style->font;
-
- if (day_view->resize_drag_pos != E_DAY_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 0
- if (show_icons) {
- if (ico->dalarm.enabled || ico->malarm.enabled
- || ico->palarm.enabled || ico->aalarm.enabled)
- num_icons++;
- if (ico->recur)
- num_icons++;
- }
-#endif
-
- if (!event->canvas_item) {
- event->canvas_item =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->top_canvas)->root),
- e_text_get_type (),
- "font_gdk", GTK_WIDGET (day_view)->style->font,
- "anchor", GTK_ANCHOR_NW,
- "clip", TRUE,
- "max_lines", 1,
- "editable", TRUE,
- "use_ellipsis", TRUE,
- NULL);
- gtk_signal_connect (GTK_OBJECT (event->canvas_item), "event",
- GTK_SIGNAL_FUNC (e_day_view_on_text_item_event),
- day_view);
- 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;
- time_width = day_view->max_small_hour_width + day_view->colon_width
- + day_view->max_minute_width;
-
- if (use_max_width) {
- text_x = item_x;
- text_w = item_w;
- } else {
- /* Get the requested size of the label. */
- gtk_object_get (GTK_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);
- text_width = gdk_text_width (font, text, line_len);
- 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);
-}
-
-
-/* Find the start and end days for the event. */
-gboolean
-e_day_view_find_long_event_days (EDayView *day_view,
- EDayViewEvent *event,
- gint *start_day_return,
- gint *end_day_return)
-{
- gint day, start_day, end_day;
-
- start_day = -1;
- end_day = -1;
-
- for (day = 0; day < day_view->days_shown; day++) {
- if (start_day == -1
- && event->start < day_view->day_starts[day + 1])
- start_day = day;
- if (event->end > day_view->day_starts[day])
- end_day = day;
- }
-
- /* Sanity check. */
- if (start_day < 0 || start_day >= day_view->days_shown
- || end_day < 0 || end_day >= day_view->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;
-}
-
-
-static void
-e_day_view_layout_day_events (EDayView *day_view,
- gint day)
-{
- 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. */
- for (row = 0; row < day_view->rows; row++) {
- day_view->cols_per_row[day][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, day_view->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 < day_view->events[day]->len;
- event_num++) {
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- e_day_view_layout_day_event (day_view, day, event,
- grid, group_starts);
- }
-
- /* Recalculate the number of columns needed in each row. */
- e_day_view_recalc_cols_per_row (day_view, day, group_starts);
-
- /* Iterate over the events again, trying to expand events horizontally
- if there is enough space. */
- for (event_num = 0; event_num < day_view->events[day]->len;
- event_num++) {
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
- e_day_view_expand_day_event (day_view, day, event, grid);
- }
-
- /* 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 (EDayView *day_view,
- gint day,
- EDayViewEvent *event,
- guint8 *grid,
- guint16 *group_starts)
-{
- gint start_row, end_row, free_col, col, row, group_start;
-
- start_row = event->start_minute / day_view->mins_per_row;
- end_row = (event->end_minute - 1) / day_view->mins_per_row;
-
- event->num_columns = 0;
-
- /* If the event can't currently be seen, just return. */
- if (start_row >= day_view->rows || end_row < 0)
- return;
-
- /* Make sure we don't go outside the visible times. */
- start_row = CLAMP (start_row, 0, day_view->rows - 1);
- end_row = CLAMP (end_row, 0, day_view->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;
- day_view->cols_per_row[day][row]++;
- group_starts[row] = group_start;
- }
-
- /* If any following rows should be in the same group, add them. */
- for (row = end_row + 1; row < day_view->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 (EDayView *day_view,
- gint day,
- guint16 *group_starts)
-{
- gint start_row = 0, row, next_start_row, max_events;
-
- while (start_row < day_view->rows) {
-
- max_events = 0;
- for (row = start_row; row < day_view->rows && group_starts[row] == start_row; row++)
- max_events = MAX (max_events, day_view->cols_per_row[day][row]);
-
- next_start_row = row;
-
- for (row = start_row; row < next_start_row; row++)
- day_view->cols_per_row[day][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 (EDayView *day_view,
- gint day,
- EDayViewEvent *event,
- guint8 *grid)
-{
- gint start_row, end_row, col, row;
- gboolean clashed;
-
- start_row = event->start_minute / day_view->mins_per_row;
- end_row = (event->end_minute - 1) / day_view->mins_per_row;
-
- /* Try each column until we find a free one. */
- clashed = FALSE;
- for (col = event->start_row_or_col + 1; col < day_view->cols_per_row[day][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++;
- }
-}
-
-
-/* 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++) {
- e_day_view_reshape_day_event (day_view, day, event_num);
- }
-}
-
-
-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;
- CalComponent *comp;
-
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
- comp = event->comp;
-
- 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_DAY_VIEW_POS_NONE
- || day_view->resize_event_day != day
- || day_view->resize_event_num != event_num) {
-#if 0
- if (ico->dalarm.enabled || ico->malarm.enabled
- || ico->palarm.enabled || ico->aalarm.enabled)
- num_icons++;
-#endif
- if (cal_component_has_rrules (comp)
- || cal_component_has_rdates (comp))
- num_icons++;
- }
-
- 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) {
- event->canvas_item =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->main_canvas)->root),
- e_text_get_type (),
- "font_gdk", GTK_WIDGET (day_view)->style->font,
- "anchor", GTK_ANCHOR_NW,
- "line_wrap", TRUE,
- "editable", TRUE,
- "clip", TRUE,
- "use_ellipsis", TRUE,
- NULL);
- gtk_signal_connect (GTK_OBJECT (event->canvas_item),
- "event",
- GTK_SIGNAL_FUNC (e_day_view_on_text_item_event),
- day_view);
- 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) {
- gtk_object_get (GTK_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;
- }
- }
-}
-
-
-static 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 gint
-e_day_view_key_press (GtkWidget *widget, GdkEventKey *event)
-{
- EDayView *day_view;
- CalComponent *comp;
- gint day, event_num;
- gchar *initial_text;
- guint keyval;
- gboolean stop_emission;
- time_t dtstart, dtend;
- const char *uid;
-
- 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_DAY_VIEW_POS_NONE) {
- if (keyval == GDK_Escape) {
- e_day_view_abort_resize (day_view, event->time);
- }
- return FALSE;
- }
-
- /* 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 {
- 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;
- default:
- stop_emission = FALSE;
- break;
- }
- }
- 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;
- }
-
- /* 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->length == 0)
- || (event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK))) {
- return FALSE;
- } else {
- initial_text = event->string;
- }
-
- /* Add a new event covering the selected range.
- Note that user_name is a global variable. */
- comp = cal_component_new ();
-
- e_day_view_get_selected_time_range (day_view, &dtstart, &dtend);
-
- /* We add the event locally and start editing it. When we get the
- "update_event" callback from the server, we basically ignore it.
- If we were to wait for the "update_event" callback it wouldn't be
- as responsive and we may lose a few keystrokes. */
- e_day_view_add_event (comp, dtstart, dtend, day_view);
- e_day_view_check_layout (day_view);
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-
- cal_component_get_uid (comp, &uid);
- if (e_day_view_find_event_from_uid (day_view, uid, &day, &event_num)) {
- e_day_view_start_editing_event (day_view, day, event_num,
- initial_text);
- day_view->editing_new_event = TRUE;
- } else {
- g_warning ("Couldn't find event to start editing.\n");
- }
-
- if (!cal_client_update_object (day_view->calendar->client, comp))
- g_message ("e_day_view_key_press(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (comp));
-
- return TRUE;
-}
-
-
-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 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);
-
- 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);
-
- 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 (day_view->calendar);
- } 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);
- }
-}
-
-
-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 (day_view->calendar);
- } 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);
- }
-}
-
-
-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 FALSE;
- if (start_row == 0 && end_row == day_view->rows)
- return FALSE;
-
- /* 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;
-}
-
-
-static 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;
-
- /* 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 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);
-
- 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. */
- gtk_object_get (GTK_OBJECT (event->canvas_item),
- "event_processor", &event_processor,
- NULL);
- if (event_processor) {
- command.action = E_TEP_MOVE;
- command.position = E_TEP_END_OF_BUFFER;
- gtk_signal_emit_by_name (GTK_OBJECT (event_processor),
- "command", &command);
- }
-}
-
-
-/* This stops the current edit. If accept is TRUE the event summary is update,
- 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);
-}
-
-
-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) {
- /* 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;
- }
- 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 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);
- }
-}
-
-
-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;
- CalComponentText summary;
- const char *uid;
-
- /* 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 no item is being edited, just return. */
- if (day == -1)
- return;
-
-#if 0
- g_print ("In e_day_view_on_editing_stopped Day:%i Event:%i\n",
- day, event_num);
-#endif
-
- 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->editing_new_event = FALSE;
-
- day_view->resize_bars_event_day = -1;
- day_view->resize_bars_event_num = -1;
-
- /* Check that the event is still valid. */
- cal_component_get_uid (event->comp, &uid);
- if (!uid)
- return;
-
- gtk_object_get (GTK_OBJECT (event->canvas_item),
- "text", &text,
- NULL);
-
- /* Only update the summary if necessary. */
- cal_component_get_summary (event->comp, &summary);
- if (text && summary.value && !strcmp (text, summary.value)) {
- g_free (text);
-
- if (day == E_DAY_VIEW_LONG_EVENT)
- e_day_view_reshape_long_event (day_view, event_num);
- return;
- }
-
- cal_component_set_summary (event->comp, &summary);
- g_free (text);
-
- if (!cal_client_update_object (day_view->calendar->client, event->comp))
- g_message ("e_day_view_on_editing_stopped(): Could not update the object!");
-}
-
-
-/* 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 tm *tmp_tm;
- 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];
-
- /* We convert the start of the day to a struct tm, then set the
- hour and minute, then convert it back to a time_t. */
- tmp_tm = localtime (&day_view->day_starts[col]);
-
- tmp_tm->tm_hour = minutes / 60;
- tmp_tm->tm_min = minutes % 60;
- tmp_tm->tm_isdst = -1;
-
- val = mktime (tmp_tm);
- return val;
-}
-
-
-static gboolean
-e_day_view_convert_time_to_grid_position (EDayView *day_view,
- time_t time,
- gint *col,
- gint *row)
-{
- struct tm *tmp_tm;
- 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 a struct tm,
- calculate the offset in minutes from the top of the display and
- divide it by the mins per row setting. */
- tmp_tm = localtime (&time);
- minutes = tmp_tm->tm_hour * 60 + tmp_tm->tm_min;
- 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)
-{
- 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;
- EDayViewPosition 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. */
- gtk_layout_freeze (GTK_LAYOUT (day_view->main_canvas));
-
- gnome_canvas_scroll_to (GNOME_CANVAS (day_view->main_canvas),
- scroll_x, new_scroll_y);
-
- gtk_layout_thaw (GTK_LAYOUT (day_view->main_canvas));
- }
-
- 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_DAY_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_DAY_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_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;
-
- start_row = event->start_minute / day_view->mins_per_row;
- end_row = (event->end_minute - 1) / day_view->mins_per_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_DAY_VIEW_POS_NONE
- && day_view->resize_event_day == day
- && day_view->resize_event_num == event_num) {
- if (day_view->resize_drag_pos == E_DAY_VIEW_POS_TOP_EDGE)
- start_row = day_view->resize_start_row;
- else if (day_view->resize_drag_pos == E_DAY_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;
- *item_h = (end_row - start_row + 1) * day_view->row_height;
-
- 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 (day_view, event,
- start_day, end_day))
- return FALSE;
-
- /* If the event is being resize, use the resize position. */
- if (day_view->resize_drag_pos != E_DAY_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_DAY_VIEW_POS_LEFT_EDGE)
- *start_day = day_view->resize_start_row;
- else if (day_view->resize_drag_pos == E_DAY_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 EDayViewPosition
-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_DAY_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_DAY_VIEW_POS_OUTSIDE;
-
- *day_return = day;
-
- /* If only the grid position is wanted, return. */
- if (event_num_return == NULL)
- return E_DAY_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_DAY_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_DAY_VIEW_POS_RIGHT_EDGE;
-
- return E_DAY_VIEW_POS_EVENT;
- }
-
- return E_DAY_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 EDayViewPosition
-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;
-
- *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_DAY_VIEW_POS_OUTSIDE;
-
- row = y / day_view->row_height;
- if (row >= day_view->rows)
- return E_DAY_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_DAY_VIEW_POS_OUTSIDE;
-
- *day_return = day;
- *row_return = row;
-
- /* If only the grid position is wanted, return. */
- if (event_num_return == NULL)
- return E_DAY_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_DAY_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_DAY_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_DAY_VIEW_POS_LEFT_EDGE;
-
- if (y < item_y + E_DAY_VIEW_EVENT_BORDER_HEIGHT
- + E_DAY_VIEW_EVENT_Y_PAD)
- return E_DAY_VIEW_POS_TOP_EDGE;
-
- if (y >= item_y + item_h - E_DAY_VIEW_EVENT_BORDER_HEIGHT
- - E_DAY_VIEW_EVENT_Y_PAD)
- return E_DAY_VIEW_POS_BOTTOM_EDGE;
-
- return E_DAY_VIEW_POS_EVENT;
- }
-
- return E_DAY_VIEW_POS_NONE;
-}
-
-
-static gint
-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)
-{
- EDayViewPosition 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_DAY_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;
- GdkFont *font;
- 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 (day_view, event,
- &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);
-
- font = GTK_WIDGET (day_view)->style->font;
- gnome_canvas_item_set (day_view->drag_long_event_item,
- "font_gdk", font,
- "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)) {
- CalComponentText summary;
-
- cal_component_get_summary (event->comp, &summary);
- if (event) {
- cal_component_get_summary (event->comp, &summary);
- text = g_strdup (summary.value);
- } 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 gint
-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, x, y);
-
- return TRUE;
-}
-
-
-static void
-e_day_view_reshape_main_canvas_drag_item (EDayView *day_view)
-{
- EDayViewPosition 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_DAY_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;
- GdkFont *font;
- 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_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;
- 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);
-
- font = GTK_WIDGET (day_view)->style->font;
- gnome_canvas_item_set (day_view->drag_item,
- "font_gdk", font,
- "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(event->canvas_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)) {
- CalComponentText summary;
-
- if (event) {
- cal_component_get_summary (event->comp, &summary);
- text = g_strdup (summary.value);
- } 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;
- const char *event_uid;
-
- 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);
-
-
- cal_component_get_uid (event->comp, &event_uid);
-
- g_return_if_fail (event_uid != NULL);
-
- if (info == TARGET_CALENDAR_EVENT) {
- gtk_selection_data_set (selection_data, selection_data->target,
- 8, event_uid, strlen (event_uid));
- }
-}
-
-
-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;
- EDayViewPosition pos;
- gint day, start_day, end_day, num_days;
- gint start_offset, end_offset;
- gchar *event_uid;
- CalComponent *comp;
- CalComponentDateTime date;
- time_t dt;
-
- if ((data->length >= 0) && (data->format == 8)) {
- pos = e_day_view_convert_position_in_top_canvas (day_view,
- x, y, &day,
- NULL);
- if (pos != E_DAY_VIEW_POS_OUTSIDE) {
- const char *uid;
- num_days = 1;
- start_offset = 0;
- end_offset = -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);
- day -= day_view->drag_event_offset;
- day = MAX (day, 0);
-
- e_day_view_find_long_event_days (day_view,
- event,
- &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 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);
- }
-
- event_uid = data->data;
-
- cal_component_get_uid (event->comp, &uid);
-
- if (!event_uid || !uid || strcmp (event_uid, uid))
- g_warning ("Unexpected event UID");
-
- /* We use a temporary shallow 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 = cal_component_clone (event->comp);
-
- date.value = g_new (struct icaltimetype, 1);
- dt = day_view->day_starts[day] + start_offset * 60;
- *date.value = icaltimetype_from_timet (dt, FALSE);
- cal_component_set_dtstart (comp, &date);
- if (end_offset == -1 || end_offset == 0)
- dt = day_view->day_starts[day + num_days];
- else
- dt = day_view->day_starts[day + num_days - 1] + end_offset * 60;
- *date.value = icaltimetype_from_timet (dt, FALSE);
- cal_component_set_dtend (comp, &date);
- g_free (date.value);
-
- 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 (!cal_client_update_object (day_view->calendar->client, comp))
- g_message ("e_day_view_on_top_canvas_drag_data_received(): Could "
- "not update the object!");
-
- gtk_object_unref (GTK_OBJECT (comp));
-
- return;
- }
- }
-
- 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;
- EDayViewPosition pos;
- gint day, row, start_row, end_row, num_rows, scroll_x, scroll_y;
- gint start_offset, end_offset;
- gchar *event_uid;
- CalComponent *comp;
- CalComponentDateTime date;
- time_t dt;
-
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
- &scroll_x, &scroll_y);
- x += scroll_x;
- y += scroll_y;
-
- if ((data->length >= 0) && (data->format == 8)) {
- pos = e_day_view_convert_position_in_main_canvas (day_view,
- x, y, &day,
- &row, NULL);
- if (pos != E_DAY_VIEW_POS_OUTSIDE) {
- const char *uid;
- 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 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);
- 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;
- 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;
- }
-
- event_uid = data->data;
-
- cal_component_get_uid (event->comp, &uid);
- if (!event_uid || !uid || strcmp (event_uid, uid))
- g_warning ("Unexpected event UID");
-
- /* 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 = cal_component_clone (event->comp);
-
- date.value = g_new (struct icaltimetype, 1);
- dt = e_day_view_convert_grid_position_to_time (day_view, day, row) + start_offset * 60;
- *date.value = icaltimetype_from_timet (dt, FALSE);
- 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 = icaltimetype_from_timet (dt, FALSE);
- cal_component_set_dtend (comp, &date);
- g_free (date.value);
-
- 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 (!cal_client_update_object (day_view->calendar->client, comp))
- g_message ("e_day_view_on_main_canvas_drag_data_received(): "
- "Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (comp));
-
- return;
- }
- }
-
- gtk_drag_finish (context, FALSE, FALSE, time);
-}
-
-
-
-
-
diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h
deleted file mode 100644
index 955ef0541c..0000000000
--- a/calendar/gui/e-day-view.h
+++ /dev/null
@@ -1,504 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_DAY_VIEW_H_
-#define _E_DAY_VIEW_H_
-
-#include <time.h>
-#include <gtk/gtktable.h>
-#include <libgnomeui/gnome-canvas.h>
-
-#include "gnome-cal.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EDayView - displays the Day & Work-Week views of the calendar.
- */
-
-/* The maximum number of days shown. We use 7 since we only show 1 week max. */
-#define E_DAY_VIEW_MAX_DAYS 7
-
-/* 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 8
-
-/* 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 8
-
-/* 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 0
-#define E_DAY_VIEW_ICON_Y_PAD 0
-
-/* 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 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 'September 12'. The abbreviated format is like
- 'Sep 12'. The short format is like '12'. The actual format used is
- determined in style_set(), once we know the font being used. */
-typedef enum
-{
- E_DAY_VIEW_DATE_FULL,
- E_DAY_VIEW_DATE_ABBREVIATED,
- 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_EVENT_VBAR,
-
- E_DAY_VIEW_COLOR_EVENT_BACKGROUND,
- E_DAY_VIEW_COLOR_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;
-
-/* Specifies the position of the mouse. */
-typedef enum
-{
- E_DAY_VIEW_POS_OUTSIDE,
- E_DAY_VIEW_POS_NONE,
- E_DAY_VIEW_POS_EVENT,
- E_DAY_VIEW_POS_LEFT_EDGE,
- E_DAY_VIEW_POS_RIGHT_EDGE,
- E_DAY_VIEW_POS_TOP_EDGE,
- E_DAY_VIEW_POS_BOTTOM_EDGE
-} EDayViewPosition;
-
-typedef struct _EDayViewEvent EDayViewEvent;
-struct _EDayViewEvent {
- CalComponent *comp;
- time_t start;
- time_t end;
- guint8 start_row_or_col;/* The start column for normal events, or the
- start row for long events. */
- guint8 num_columns; /* 0 indicates not displayed. For long events
- this is just 1 if the event is shown. */
- guint16 start_minute; /* Offsets from the start of the display. */
- guint16 end_minute;
- GnomeCanvasItem *canvas_item;
-};
-
-
-#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
-{
- GtkTable table;
-
- /* 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;
-
- /* The calendar we are associated with. */
- GnomeCalendar *calendar;
-
- /* The start and end of the day shown. */
- time_t lower;
- time_t upper;
-
- /* The number of days we are showing. Usually 1 or 5. Maybe 6 or 7. */
- 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 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;
-
- /* 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;
-
- /* 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. */
- guint8 cols_per_row[E_DAY_VIEW_MAX_DAYS][12 * 24];
-
- /* Sizes of the various time strings. */
- gint large_hour_widths[24];
- gint small_hour_widths[24];
- gint minute_widths[12]; /* intervals of 5 minutes. */
- gint max_small_hour_width;
- gint max_large_hour_width;
- gint max_minute_width;
- gint colon_width;
-
- /* This specifies how we are displaying the dates at the top. */
- EDayViewDateFormat date_format;
-
- /* These are the maximum widths of the different types of dates. */
- gint long_format_width;
- gint abbreviated_format_width;
-
- /* The large font use to display the hours. I don't think we need a
- fontset since we only display numbers. */
- GdkFont *large_font;
-
- /* The GC used for painting in different colors. */
- GdkGC *main_gc;
-
- /* The icons. */
- GdkPixmap *reminder_icon;
- GdkBitmap *reminder_mask;
- GdkPixmap *recurrence_icon;
- GdkBitmap *recurrence_mask;
-
- /* 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 TRUE if we are editing an event which we have just created.
- We ignore the "update_event" callback which we will get from the
- server when the event is added. */
- gboolean editing_new_event;
-
- /* 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;
- EDayViewPosition resize_drag_pos;
- gint resize_start_row;
- gint resize_end_row;
-
- /* 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;
-};
-
-struct _EDayViewClass
-{
- GtkTableClass parent_class;
-};
-
-
-GtkType e_day_view_get_type (void);
-GtkWidget* e_day_view_new (void);
-
-void e_day_view_set_calendar (EDayView *day_view,
- GnomeCalendar *calendar);
-
-/* This sets the selected time range. The EDayView will show the day or week
- corresponding to the start time. 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. */
-void e_day_view_set_selected_time_range (EDayView *day_view,
- time_t start_time,
- time_t end_time);
-
-/* Returns the selected time range. */
-void e_day_view_get_selected_time_range (EDayView *day_view,
- time_t *start_time,
- time_t *end_time);
-
-/* This reloads all calendar events. */
-void e_day_view_update_all_events (EDayView *day_view);
-
-/* This is called when one event has been added or updated. */
-void e_day_view_update_event (EDayView *day_view,
- const gchar *uid);
-
-/* This removes all the events associated with the given uid. Note that for
- recurring events there may be more than one. If any events are found and
- removed we need to layout the events again. */
-void e_day_view_remove_event (EDayView *day_view,
- const gchar *uid);
-
-/* 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);
-
-
-
-/*
- * 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_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);
-gboolean e_day_view_find_long_event_days (EDayView *day_view,
- EDayViewEvent *event,
- gint *start_day,
- gint *end_day);
-
-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);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_DAY_VIEW_H_ */
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 f8812f6c33..0000000000
--- a/calendar/gui/e-week-view-event-item.c
+++ /dev/null
@@ -1,753 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * 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.
- */
-
-#include <config.h>
-#include "../widgets/e-text/e-text.h"
-#include "e-week-view-event-item.h"
-
-static void e_week_view_event_item_class_init (EWeekViewEventItemClass *class);
-static void e_week_view_event_item_init (EWeekViewEventItem *wveitem);
-
-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_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 EWeekViewPosition e_week_view_event_item_get_position (EWeekViewEventItem *wveitem,
- gdouble x,
- gdouble y);
-
-
-static GnomeCanvasItemClass *parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_EVENT_NUM,
- ARG_SPAN_NUM
-};
-
-
-GtkType
-e_week_view_event_item_get_type (void)
-{
- static GtkType e_week_view_event_item_type = 0;
-
- if (!e_week_view_event_item_type) {
- GtkTypeInfo e_week_view_event_item_info = {
- "EWeekViewEventItem",
- sizeof (EWeekViewEventItem),
- sizeof (EWeekViewEventItemClass),
- (GtkClassInitFunc) e_week_view_event_item_class_init,
- (GtkObjectInitFunc) e_week_view_event_item_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- e_week_view_event_item_type = gtk_type_unique (gnome_canvas_item_get_type (), &e_week_view_event_item_info);
- }
-
- return e_week_view_event_item_type;
-}
-
-
-static void
-e_week_view_event_item_class_init (EWeekViewEventItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type());
-
- 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 (parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (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 *fg_gc, *gc;
- GdkFont *font;
- gint x1, y1, x2, y2, time_x, time_y, time_y_small_min;
- gint icon_x, icon_y, time_width, min_end_time_x;
- gint rect_x, rect_w, rect_x2;
- gboolean one_day_event, editing_span = FALSE;
- gint start_minute, end_minute;
- gchar buffer[128];
- gboolean draw_start_triangle = FALSE, draw_end_triangle = FALSE;
- GdkRectangle clip_rect;
-
-#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;
-
- 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);
-
- style = GTK_WIDGET (week_view)->style;
- font = style->font;
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- 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_y = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT + E_WEEK_VIEW_ICON_Y_PAD;
- start_minute = event->start_minute;
- end_minute = event->end_minute;
- time_y = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT
- + E_WEEK_VIEW_EVENT_TEXT_Y_PAD + font->ascent;
- if (week_view->small_font)
- time_y_small_min = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT
- + E_WEEK_VIEW_EVENT_TEXT_Y_PAD
- + week_view->small_font->ascent;
- if (week_view->use_small_font && week_view->small_font)
- 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;
-
- 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;
-
- /* Convert the time into a string. We use different parts of
- the string for the different time formats. Notice that the
- string is always 11 characters long. */
- sprintf (buffer, "%02i:%02i %02i:%02i",
- start_minute / 60, start_minute % 60,
- end_minute / 60, end_minute % 60);
-
- /* Draw the start and end times, as required. */
- switch (week_view->time_format) {
- case E_WEEK_VIEW_TIME_BOTH_SMALL_MIN:
- gdk_draw_text (drawable, font, fg_gc,
- time_x, time_y, buffer, 2);
- gdk_draw_text (drawable, week_view->small_font, fg_gc,
- time_x + week_view->digit_width * 2,
- time_y_small_min, buffer + 3, 2);
- gdk_draw_text (drawable, font, fg_gc,
- time_x + week_view->digit_width * 4 - 2,
- time_y, buffer + 6, 2);
- gdk_draw_text (drawable, week_view->small_font, fg_gc,
- time_x + week_view->digit_width * 6 - 2,
- time_y_small_min, buffer + 9, 2);
-
- icon_x = x1 + time_width * 2 + week_view->space_width
- + E_WEEK_VIEW_EVENT_TEXT_X_PAD;
- break;
- case E_WEEK_VIEW_TIME_START_SMALL_MIN:
- gdk_draw_text (drawable, font, fg_gc,
- time_x, time_y, buffer, 2);
- gdk_draw_text (drawable, week_view->small_font, fg_gc,
- time_x + week_view->digit_width * 2,
- time_y_small_min, buffer + 3, 2);
-
- icon_x = x1 + time_width
- + E_WEEK_VIEW_EVENT_TEXT_X_PAD;
- break;
- case E_WEEK_VIEW_TIME_BOTH:
- gdk_draw_text (drawable, font, fg_gc,
- time_x, time_y, buffer, 11);
- icon_x = x1 + time_width * 2 + week_view->space_width
- + E_WEEK_VIEW_EVENT_TEXT_X_PAD;
- break;
- case E_WEEK_VIEW_TIME_START:
- gdk_draw_text (drawable, font, fg_gc,
- time_x, time_y, buffer, 5);
- icon_x = x1 + time_width
- + E_WEEK_VIEW_EVENT_TEXT_X_PAD;
- break;
- case E_WEEK_VIEW_TIME_NONE:
- icon_x = x1 + E_WEEK_VIEW_EVENT_L_PAD;
- break;
- }
-
- /* 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. */
- 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;
- }
-
- 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 necessary. */
- min_end_time_x = x1 + E_WEEK_VIEW_EVENT_L_PAD
- + E_WEEK_VIEW_EVENT_BORDER_WIDTH
- + E_WEEK_VIEW_EVENT_TEXT_X_PAD;
- if (!editing_span
- && event->start > week_view->day_starts[span->start_day]) {
- sprintf (buffer, "%02i:%02i",
- start_minute / 60, start_minute % 60);
- time_x = x1 + E_WEEK_VIEW_EVENT_L_PAD
- + E_WEEK_VIEW_EVENT_BORDER_WIDTH
- + E_WEEK_VIEW_EVENT_TEXT_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 (fg_gc, &clip_rect);
-
- if (week_view->use_small_font
- && week_view->small_font) {
- gdk_draw_text (drawable, font, fg_gc,
- time_x, time_y, buffer, 2);
- gdk_draw_text (drawable, week_view->small_font,
- fg_gc,
- time_x + week_view->digit_width * 2,
- time_y_small_min,
- buffer + 3, 2);
- } else {
- gdk_draw_text (drawable, font, fg_gc,
- time_x, time_y, buffer, 5);
- }
-
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
-
- min_end_time_x += time_width + 2;
- }
-
- if (!editing_span
- && event->end < week_view->day_starts[span->start_day
- + span->num_days]) {
- sprintf (buffer, "%02i:%02i",
- end_minute / 60, end_minute % 60);
- time_x = x2 - E_WEEK_VIEW_EVENT_R_PAD
- - E_WEEK_VIEW_EVENT_BORDER_WIDTH
- - E_WEEK_VIEW_EVENT_TEXT_X_PAD - 1
- - time_width;
-
- if (time_x >= min_end_time_x) {
- if (week_view->use_small_font
- && week_view->small_font) {
- gdk_draw_text (drawable, font, fg_gc,
- time_x, time_y,
- buffer, 2);
- gdk_draw_text (drawable,
- week_view->small_font,
- fg_gc,
- time_x + week_view->digit_width * 2,
- time_y_small_min,
- buffer + 3, 2);
- } else {
- gdk_draw_text (drawable, font, fg_gc,
- time_x, time_y,
- buffer, 5);
- }
- }
- }
-
- /* Draw the icons. */
- if (span->text_item) {
- icon_x = span->text_item->x1 - x;
- e_week_view_event_item_draw_icons (wveitem, drawable,
- icon_x, icon_y,
- x2, TRUE);
- }
- }
-}
-
-
-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;
- CalComponent *comp;
- GdkGC *gc;
- gint num_icons = 0, icon_x_inc;
- gboolean draw_reminder_icon = FALSE, draw_recurrence_icon = FALSE;
-
- 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 = event->comp;
-
- gc = week_view->main_gc;
-
-#if 0
- if (ico->dalarm.enabled || ico->malarm.enabled
- || ico->palarm.enabled || ico->aalarm.enabled) {
- draw_reminder_icon = TRUE;
- num_icons++;
- }
-#endif
-
- if (cal_component_has_rdates (comp)
- || cal_component_has_rrules (comp)) {
- draw_recurrence_icon = TRUE;
- 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_origin (gc, icon_x, icon_y);
- gdk_gc_set_clip_mask (gc, week_view->reminder_mask);
- gdk_draw_pixmap (drawable, gc,
- week_view->reminder_icon,
- 0, 0, icon_x, icon_y,
- E_WEEK_VIEW_ICON_WIDTH,
- E_WEEK_VIEW_ICON_HEIGHT);
- icon_x += icon_x_inc;
- }
-
- if (draw_recurrence_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- gdk_gc_set_clip_origin (gc, icon_x, icon_y);
- gdk_gc_set_clip_mask (gc, week_view->recurrence_mask);
- gdk_draw_pixmap (drawable, gc,
- week_view->recurrence_icon,
- 0, 0, icon_x, icon_y,
- E_WEEK_VIEW_ICON_WIDTH,
- E_WEEK_VIEW_ICON_HEIGHT);
- icon_x += icon_x_inc;
- }
-
- 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;
- GdkGC *gc;
- GdkPoint points[3];
- gint c1, c2;
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (GNOME_CANVAS_ITEM (wveitem)->canvas)->parent);
-
- gc = week_view->main_gc;
-
- points[0].x = x;
- points[0].y = y;
- points[1].x = x + w;
- points[1].y = y + (h / 2) - 1;
- points[2].x = x;
- points[2].y = y + h - 1;
-
- 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_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;
- EWeekViewPosition 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_WEEK_VIEW_POS_NONE)
- return FALSE;
-
- week_view->pressed_event_num = wveitem->event_num;
- week_view->pressed_span_num = wveitem->span_num;
-
- if (bevent->button.button == 1) {
- /* 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.
- */
- } else if (bevent->button.button == 3) {
- if (!GTK_WIDGET_HAS_FOCUS (week_view))
- gtk_widget_grab_focus (GTK_WIDGET (week_view));
- 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;
-}
-
-
-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 EWeekViewPosition
-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_WEEK_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_WEEK_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_TEXT_X_PAD)
- return E_WEEK_VIEW_POS_LEFT_EDGE;
-
- if (x >= item->x2 - E_WEEK_VIEW_EVENT_R_PAD
- - E_WEEK_VIEW_EVENT_BORDER_WIDTH
- - E_WEEK_VIEW_EVENT_TEXT_X_PAD)
- return E_WEEK_VIEW_POS_RIGHT_EDGE;
- }
-
- return E_WEEK_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 cfe58699b0..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@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_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-main-item.c b/calendar/gui/e-week-view-main-item.c
deleted file mode 100644
index 49c2ca3d7d..0000000000
--- a/calendar/gui/e-week-view-main-item.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EWeekViewMainItem - displays the background grid and dates for the Week and
- * Month calendar views.
- */
-
-#include <config.h>
-#include "e-week-view-main-item.h"
-
-static void e_week_view_main_item_class_init (EWeekViewMainItemClass *class);
-static void e_week_view_main_item_init (EWeekViewMainItem *wvmitem);
-
-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);
-
-
-static GnomeCanvasItemClass *parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_WEEK_VIEW
-};
-
-
-GtkType
-e_week_view_main_item_get_type (void)
-{
- static GtkType e_week_view_main_item_type = 0;
-
- if (!e_week_view_main_item_type) {
- GtkTypeInfo e_week_view_main_item_info = {
- "EWeekViewMainItem",
- sizeof (EWeekViewMainItem),
- sizeof (EWeekViewMainItemClass),
- (GtkClassInitFunc) e_week_view_main_item_class_init,
- (GtkObjectInitFunc) e_week_view_main_item_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- e_week_view_main_item_type = gtk_type_unique (gnome_canvas_item_get_type (), &e_week_view_main_item_info);
- }
-
- return e_week_view_main_item_type;
-}
-
-
-static void
-e_week_view_main_item_class_init (EWeekViewMainItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type());
-
- 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;
-}
-
-
-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 (parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (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->display_month ? E_WEEK_VIEW_MAX_WEEKS * 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 *fg_gc, *bg_gc, *light_gc, *dark_gc, *gc, *date_gc;
- GdkGC *selected_fg_gc, *selected_bg_gc;
- GdkFont *font;
- 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;
-
-#if 0
- g_print ("Drawing Day:%i at %i,%i\n", day, x, y);
-#endif
- week_view = wvmitem->week_view;
- style = GTK_WIDGET (week_view)->style;
- font = style->font;
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- bg_gc = style->bg_gc[GTK_STATE_PRELIGHT];
- light_gc = style->light_gc[GTK_STATE_NORMAL];
- dark_gc = style->dark_gc[GTK_STATE_NORMAL];
- selected_fg_gc = style->fg_gc[GTK_STATE_SELECTED];
- selected_bg_gc = style->bg_gc[GTK_STATE_SELECTED];
- gc = week_view->main_gc;
-
- month = g_date_month (date);
- day_of_month = g_date_day (date);
- line_y = y + E_WEEK_VIEW_DATE_T_PAD + font->ascent
- + font->descent + 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->display_month && (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_draw_line (drawable, fg_gc,
- right_edge, y, right_edge, bottom_edge);
- gdk_draw_line (drawable, fg_gc,
- x, bottom_edge, right_edge, bottom_edge);
-
- /* If the day is selected, draw the blue background. */
- selected = TRUE;
- if (!GTK_WIDGET_HAS_FOCUS (week_view)
- || week_view->selection_start_day == -1
- || week_view->selection_start_day > day
- || week_view->selection_end_day < day)
- selected = FALSE;
- if (selected) {
- if (week_view->display_month)
- gdk_draw_rectangle (drawable, selected_bg_gc, TRUE,
- x + 2, y + 1,
- width - 5,
- E_WEEK_VIEW_DATE_T_PAD - 1
- + font->ascent + font->descent);
- else
- gdk_draw_rectangle (drawable, selected_bg_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->display_month) {
- 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_abbr_day_width +
- week_view->digit_width * 2 + week_view->space_width * 2
- + week_view->month_widths[month - 1] < max_width)
- 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)
- format_string = "%d %B";
- else if (week_view->digit_width * 2 + week_view->space_width
- + week_view->abbr_month_widths[month - 1] < max_width)
- format_string = "%d %b";
- }
-
- g_date_strftime (buffer, 128, format_string ? format_string : "%d",
- date);
- date_width = gdk_string_width (font, buffer);
- date_x = x + width - date_width - E_WEEK_VIEW_DATE_R_PAD;
- date_x = MAX (date_x, x + 1);
-
- if (selected)
- date_gc = selected_fg_gc;
- else
- date_gc = fg_gc;
- gdk_draw_string (drawable, font, date_gc,
- date_x, y + E_WEEK_VIEW_DATE_T_PAD + font->ascent,
- buffer);
-
- /* Draw the line under the date. */
- if (!week_view->display_month) {
- gdk_draw_line (drawable, fg_gc,
- x + E_WEEK_VIEW_DATE_LINE_L_PAD, line_y,
- right_edge, line_y);
- }
-}
-
-
-
-
-/* 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 f75dcb0ec9..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@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_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 14f47e4bcf..0000000000
--- a/calendar/gui/e-week-view-titles-item.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EWeekViewTitlesItem - displays the 'Monday', 'Tuesday' etc. at the top of
- * the Month calendar view.
- */
-
-#include <config.h>
-#include "e-week-view-titles-item.h"
-
-static void e_week_view_titles_item_class_init (EWeekViewTitlesItemClass *class);
-static void e_week_view_titles_item_init (EWeekViewTitlesItem *wvtitem);
-
-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);
-
-
-static GnomeCanvasItemClass *parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_WEEK_VIEW
-};
-
-
-GtkType
-e_week_view_titles_item_get_type (void)
-{
- static GtkType e_week_view_titles_item_type = 0;
-
- if (!e_week_view_titles_item_type) {
- GtkTypeInfo e_week_view_titles_item_info = {
- "EWeekViewTitlesItem",
- sizeof (EWeekViewTitlesItem),
- sizeof (EWeekViewTitlesItemClass),
- (GtkClassInitFunc) e_week_view_titles_item_class_init,
- (GtkObjectInitFunc) e_week_view_titles_item_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- e_week_view_titles_item_type = gtk_type_unique (gnome_canvas_item_get_type (), &e_week_view_titles_item_info);
- }
-
- return e_week_view_titles_item_type;
-}
-
-
-static void
-e_week_view_titles_item_class_init (EWeekViewTitlesItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type());
-
- 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 (parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (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;
- GdkFont *font;
- 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;
-
-#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 (week_view)->style;
- font = style->font;
- 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;
-
- /* 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);
- g_date_set_dmy (&date, 27, 3, 2000); /* Must be a Monday. */
- for (col = 0; col < week_view->columns; col++) {
- if (col == 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 (col == 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[col];
- else
- date_width = week_view->abbr_day_widths[col];
-
- 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]);
- gdk_draw_string (drawable, font, fg_gc,
- date_x - x, 3 + font->ascent - y, buffer);
-
- 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);
- }
-
- g_date_add_days (&date, 1);
- }
-}
-
-
-/* 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 7ce1ccd386..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@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_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 faf78db567..0000000000
--- a/calendar/gui/e-week-view.c
+++ /dev/null
@@ -1,2925 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EWeekView - displays the Week & Month views of the calendar.
- */
-
-#include <config.h>
-#include <math.h>
-#include <gnome.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
-#include "calendar-commands.h"
-#include "e-week-view.h"
-#include "e-week-view-event-item.h"
-#include "e-week-view-main-item.h"
-#include "e-week-view-titles-item.h"
-#include <cal-util/timeutil.h>
-#include "popup-menu.h"
-#include "../e-util/e-canvas.h"
-#include "../widgets/e-text/e-text.h"
-#include "e-util/e-canvas-utils.h"
-
-/* Images */
-#include "bell.xpm"
-#include "recur.xpm"
-
-#include "jump.xpm"
-
-#define E_WEEK_VIEW_SMALL_FONT \
- "-adobe-utopia-regular-r-normal-*-*-100-*-*-p-*-iso8859-*"
-#define E_WEEK_VIEW_SMALL_FONT_FALLBACK \
- "-adobe-helvetica-medium-r-normal-*-*-80-*-*-p-*-iso8859-*"
-
-/* 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
-
-#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
-
-static void e_week_view_class_init (EWeekViewClass *class);
-static void e_week_view_init (EWeekView *week_view);
-static void e_week_view_destroy (GtkObject *object);
-static void e_week_view_realize (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 void e_week_view_draw (GtkWidget *widget,
- GdkRectangle *area);
-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_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_reload_events (EWeekView *week_view);
-static void e_week_view_free_events (EWeekView *week_view);
-static gboolean e_week_view_add_event (CalComponent *comp,
- time_t start,
- time_t end,
- gpointer data);
-static void e_week_view_check_layout (EWeekView *week_view);
-static void e_week_view_layout_events (EWeekView *week_view);
-static void e_week_view_layout_event (EWeekView *week_view,
- EWeekViewEvent *event,
- guint8 *grid,
- GArray *spans);
-static void e_week_view_ensure_events_sorted (EWeekView *week_view);
-static gint e_week_view_event_sort_func (const void *arg1,
- const void *arg2);
-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 gint e_week_view_find_day (EWeekView *week_view,
- time_t time_to_find,
- gboolean include_midnight_in_prev_day);
-static gint e_week_view_find_span_end (EWeekView *week_view,
- gint day);
-static void e_week_view_recalc_day_starts (EWeekView *week_view,
- time_t lower);
-static void e_week_view_on_adjustment_changed (GtkAdjustment *adjustment,
- EWeekView *week_view);
-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_item (EWeekView *week_view,
- GnomeCanvasItem *item,
- gint *event_num,
- gint *span_num);
-static gboolean e_week_view_find_event_from_uid (EWeekView *week_view,
- const gchar *uid,
- gint *event_num_return);
-typedef gboolean (* EWeekViewForeachEventCallback) (EWeekView *week_view,
- gint event_num,
- 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_on_jump_button_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EWeekView *week_view);
-static gint e_week_view_key_press (GtkWidget *widget, GdkEventKey *event);
-static void e_week_view_on_new_appointment (GtkWidget *widget,
- gpointer data);
-static void e_week_view_on_edit_appointment (GtkWidget *widget,
- gpointer data);
-static void e_week_view_on_delete_occurrence (GtkWidget *widget,
- gpointer data);
-static void e_week_view_on_delete_appointment (GtkWidget *widget,
- gpointer data);
-static void e_week_view_on_unrecur_appointment (GtkWidget *widget,
- gpointer data);
-
-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 GtkTableClass *parent_class;
-
-
-GtkType
-e_week_view_get_type (void)
-{
- static GtkType e_week_view_type = 0;
-
- if (!e_week_view_type){
- GtkTypeInfo e_week_view_info = {
- "EWeekView",
- sizeof (EWeekView),
- sizeof (EWeekViewClass),
- (GtkClassInitFunc) e_week_view_class_init,
- (GtkObjectInitFunc) e_week_view_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- parent_class = gtk_type_class (GTK_TYPE_TABLE);
- e_week_view_type = gtk_type_unique (GTK_TYPE_TABLE,
- &e_week_view_info);
- }
-
- return e_week_view_type;
-}
-
-
-static void
-e_week_view_class_init (EWeekViewClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) 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->expose_event = e_week_view_expose_event;
- widget_class->draw = e_week_view_draw;
-}
-
-
-static void
-e_week_view_init (EWeekView *week_view)
-{
- GdkColormap *colormap;
- gboolean success[E_WEEK_VIEW_COLOR_LAST];
- gint nfailed;
- GnomeCanvasGroup *canvas_group;
- GtkObject *adjustment;
- GdkPixbuf *pixbuf;
- gint i;
-
- GTK_WIDGET_SET_FLAGS (week_view, GTK_CAN_FOCUS);
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (week_view));
-
- week_view->calendar = 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->spans = NULL;
-
- week_view->display_month = FALSE;
- week_view->rows = 6;
- week_view->columns = 2;
- week_view->compress_weekend = TRUE;
-
- 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->editing_new_event = FALSE;
-
- /* Create the small font. */
- week_view->use_small_font = TRUE;
- week_view->small_font = gdk_font_load (E_WEEK_VIEW_SMALL_FONT);
- if (!week_view->small_font)
- week_view->small_font = gdk_font_load (E_WEEK_VIEW_SMALL_FONT_FALLBACK);
- if (!week_view->small_font)
- g_warning ("Couldn't load font");
-
- /* Allocate the colors. */
- week_view->colors[E_WEEK_VIEW_COLOR_EVEN_MONTHS].red = 0xeded;
- week_view->colors[E_WEEK_VIEW_COLOR_EVEN_MONTHS].green = 0xeded;
- week_view->colors[E_WEEK_VIEW_COLOR_EVEN_MONTHS].blue = 0xeded;
-
- week_view->colors[E_WEEK_VIEW_COLOR_ODD_MONTHS].red = 65535;
- week_view->colors[E_WEEK_VIEW_COLOR_ODD_MONTHS].green = 65535;
- week_view->colors[E_WEEK_VIEW_COLOR_ODD_MONTHS].blue = 65535;
-
- week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].red = 0xd6d6;
- week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].green = 0xd6d6;
- week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].blue = 0xd6d6;
-
- week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER].red = 0;
- week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER].green = 0;
- week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER].blue = 0;
-
- nfailed = gdk_colormap_alloc_colors (colormap, week_view->colors,
- E_WEEK_VIEW_COLOR_LAST, FALSE,
- TRUE, success);
- if (nfailed)
- g_warning ("Failed to allocate all colors");
-
-
- /*
- * 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);
-
- gtk_signal_connect_after (GTK_OBJECT (week_view->main_canvas),
- "button_press_event",
- GTK_SIGNAL_FUNC (e_week_view_on_button_press),
- week_view);
- gtk_signal_connect_after (GTK_OBJECT (week_view->main_canvas),
- "button_release_event",
- GTK_SIGNAL_FUNC (e_week_view_on_button_release),
- week_view);
- gtk_signal_connect_after (GTK_OBJECT (week_view->main_canvas),
- "motion_notify_event",
- GTK_SIGNAL_FUNC (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);
-
- gtk_signal_connect (GTK_OBJECT (week_view->jump_buttons[i]),
- "event",
- GTK_SIGNAL_FUNC (e_week_view_on_jump_button_event),
- week_view);
- }
-
-
- /*
- * Scrollbar.
- */
- adjustment = gtk_adjustment_new (0, -52, 52, 1, 1, 1);
- gtk_signal_connect (adjustment, "value_changed",
- GTK_SIGNAL_FUNC (e_week_view_on_adjustment_changed),
- week_view);
-
- 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 pixmaps. */
- week_view->reminder_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &week_view->reminder_mask, NULL, bell_xpm);
- week_view->recurrence_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &week_view->recurrence_mask, NULL, recur_xpm);
-
-
- /* Create the cursors. */
- week_view->normal_cursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW);
- 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;
-}
-
-
-/**
- * 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 (gtk_type_new (e_week_view_get_type ()));
-
- return week_view;
-}
-
-
-static void
-e_week_view_destroy (GtkObject *object)
-{
- EWeekView *week_view;
-
- week_view = E_WEEK_VIEW (object);
-
- /* FIXME: free the colors. In EDayView as well. */
- /* FIXME: free the events and the spans. In EDayView as well? */
-
- if (week_view->small_font)
- gdk_font_unref (week_view->small_font);
-
- gdk_cursor_destroy (week_view->normal_cursor);
- gdk_cursor_destroy (week_view->move_cursor);
- gdk_cursor_destroy (week_view->resize_width_cursor);
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-
-static void
-e_week_view_realize (GtkWidget *widget)
-{
- EWeekView *week_view;
-
- if (GTK_WIDGET_CLASS (parent_class)->realize)
- (*GTK_WIDGET_CLASS (parent_class)->realize)(widget);
-
- week_view = E_WEEK_VIEW (widget);
- week_view->main_gc = gdk_gc_new (widget->window);
-}
-
-
-static void
-e_week_view_unrealize (GtkWidget *widget)
-{
- EWeekView *week_view;
-
- week_view = E_WEEK_VIEW (widget);
-
- gdk_gc_unref (week_view->main_gc);
- week_view->main_gc = NULL;
-
- if (GTK_WIDGET_CLASS (parent_class)->unrealize)
- (*GTK_WIDGET_CLASS (parent_class)->unrealize)(widget);
-}
-
-
-static void
-e_week_view_style_set (GtkWidget *widget,
- GtkStyle *previous_style)
-{
- EWeekView *week_view;
- GdkFont *font;
- gint day, day_width, max_day_width, max_abbr_day_width;
- gint month, month_width, max_month_width, max_abbr_month_width;
- GDate date;
- gchar buffer[128];
-
- if (GTK_WIDGET_CLASS (parent_class)->style_set)
- (*GTK_WIDGET_CLASS (parent_class)->style_set)(widget, previous_style);
-
- week_view = E_WEEK_VIEW (widget);
- font = widget->style->font;
-
- /* Recalculate the height of each row based on the font size. */
- week_view->row_height = font->ascent + font->descent + 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);
-
- /* Set the height of the top canvas. */
- gtk_widget_set_usize (week_view->titles_canvas, -1,
- font->ascent + font->descent + 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 = gdk_string_width (font, 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 = gdk_string_width (font, 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 = gdk_string_width (font, 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 = gdk_string_width (font, buffer);
- week_view->abbr_month_widths[month] = month_width;
- max_abbr_month_width = MAX (max_abbr_month_width, month_width);
- }
-
- week_view->space_width = gdk_string_width (font, " ");
- week_view->colon_width = gdk_string_width (font, ":");
- week_view->slash_width = gdk_string_width (font, "/");
- week_view->digit_width = gdk_string_width (font, "5");
- if (week_view->small_font)
- week_view->small_digit_width = gdk_string_width (week_view->small_font, "5");
- 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;
-}
-
-
-/* This recalculates the sizes of each column. */
-static void
-e_week_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
-{
- EWeekView *week_view;
- gint width, height, time_width;
- gdouble old_x2, old_y2, new_x2, new_y2;
- GdkFont *font;
-
- week_view = E_WEEK_VIEW (widget);
- font = widget->style->font;
-
- (*GTK_WIDGET_CLASS (parent_class)->size_allocate) (widget, allocation);
-
- e_week_view_recalc_cell_sizes (week_view);
-
- /* Calculate the number of rows of events in each cell, for the large
- cells and the compressed weekend cells. */
- if (week_view->display_month) {
- week_view->events_y_offset = E_WEEK_VIEW_DATE_T_PAD
- + font->ascent + font->descent
- + E_WEEK_VIEW_DATE_B_PAD;
- } else {
- week_view->events_y_offset = E_WEEK_VIEW_DATE_T_PAD
- + font->ascent + font->descent
- + 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];
-
- week_view->time_format = E_WEEK_VIEW_TIME_NONE;
- if (week_view->use_small_font && week_view->small_font) {
- time_width = week_view->digit_width * 2
- + week_view->small_digit_width * 2;
- if (width / 2 > time_width * 2 + week_view->space_width)
- 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 {
- time_width = week_view->digit_width * 4
- + week_view->colon_width;
- if (width / 2 > time_width * 2 + week_view->space_width)
- week_view->time_format = E_WEEK_VIEW_TIME_BOTH;
- else if (width / 2 > time_width)
- week_view->time_format = E_WEEK_VIEW_TIME_START;
- }
-
- /* 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 width, height, offset;
- gint row, col;
-
- if (week_view->display_month) {
- week_view->rows = 10;
- week_view->columns = 6;
- } 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. */
- width = week_view->main_canvas->allocation.width + 1;
- width /= week_view->columns;
- offset = 0;
- for (col = 0; col <= week_view->columns; col++) {
- week_view->col_offsets[col] = floor (offset + 0.5);
- offset += 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. */
- height = week_view->main_canvas->allocation.height + 1;
- height /= week_view->rows;
- offset = 0;
- for (row = 0; row <= week_view->rows; row++) {
- week_view->row_offsets[row] = floor (offset + 0.5);
- offset += 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];
- }
-}
-
-
-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 (parent_class)->expose_event)
- (*GTK_WIDGET_CLASS (parent_class)->expose_event)(widget, event);
-
- return FALSE;
-}
-
-
-static void
-e_week_view_draw (GtkWidget *widget,
- GdkRectangle *area)
-{
- EWeekView *week_view;
-
- week_view = E_WEEK_VIEW (widget);
-
- e_week_view_draw_shadow (week_view);
-
- if (GTK_WIDGET_CLASS (parent_class)->draw)
- (*GTK_WIDGET_CLASS (parent_class)->draw)(widget, area);
-}
-
-
-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);
-}
-
-
-void
-e_week_view_set_calendar (EWeekView *week_view,
- GnomeCalendar *calendar)
-{
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- week_view->calendar = calendar;
-
- /* FIXME: free current events? */
-}
-
-
-/* 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. */
-void
-e_week_view_set_selected_time_range (EWeekView *week_view,
- time_t start_time,
- time_t end_time)
-{
- GDate date, base_date, end_date;
- gint day_offset, num_days;
- gboolean update_adjustment_value = FALSE;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- g_date_clear (&date, 1);
- g_date_set_time (&date, start_time);
-
- if (week_view->display_month) {
- /* Find the number of days since the start of the month. */
- day_offset = g_date_day (&date) - 1;
-
- /* Find the 1st Monday at or before the start of the month. */
- base_date = date;
- g_date_set_day (&base_date, 1);
- day_offset += g_date_weekday (&base_date) - 1;
- } else {
- /* Find the 1st Monday at or before the given day. */
- day_offset = g_date_weekday (&date) - 1;
- }
-
- /* 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_time = time_add_day (start_time, -day_offset);
- start_time = time_day_begin (start_time);
- e_week_view_recalc_day_starts (week_view, start_time);
- e_week_view_reload_events (week_view);
- }
-
- /* Set the selection to the given days. */
- week_view->selection_start_day = g_date_julian (&date)
- - g_date_julian (&base_date);
- if (end_time == start_time
- || end_time <= time_add_day (start_time, 1))
- week_view->selection_end_day = week_view->selection_start_day;
- else {
- g_date_clear (&end_date, 1);
- g_date_set_time (&end_date, end_time - 60);
- week_view->selection_end_day = g_date_julian (&end_date)
- - g_date_julian (&base_date);
- }
-
- /* Make sure the selection is valid. */
- num_days = week_view->display_month ? E_WEEK_VIEW_MAX_WEEKS * 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);
-}
-
-
-/* Returns the selected time range. */
-void
-e_week_view_get_selected_time_range (EWeekView *week_view,
- time_t *start_time,
- time_t *end_time)
-{
- gint start_day, end_day;
-
- 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];
-}
-
-
-/* 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->display_month ? E_WEEK_VIEW_MAX_WEEKS * 7 : 7;
-
- tmp_time = lower;
- week_view->day_starts[0] = tmp_time;
- for (day = 1; day <= num_days; day++) {
- /* FIXME: There is a bug in time_add_day(). */
-#if 0
- g_print ("Day:%i - %s\n", day, ctime (&tmp_time));
-#endif
- tmp_time = time_add_day (tmp_time, 1);
- week_view->day_starts[day] = tmp_time;
- }
-}
-
-
-gboolean
-e_week_view_get_display_month (EWeekView *week_view)
-{
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
- return week_view->display_month;
-}
-
-
-void
-e_week_view_set_display_month (EWeekView *week_view,
- gboolean display_month)
-{
- GtkAdjustment *adjustment;
- gint page_increment, page_size;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- if (week_view->display_month == display_month)
- return;
-
- week_view->display_month = display_month;
-
- if (display_month) {
- 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);
-
- /* FIXME: Need to change start date and adjustment value? */
-
- e_week_view_recalc_day_starts (week_view, week_view->day_starts[0]);
- e_week_view_recalc_cell_sizes (week_view);
- e_week_view_reload_events (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)
-{
- 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->display_month)
- return;
-
- /* FIXME: Need to update layout. */
-}
-
-
-/* This reloads all calendar events. */
-void
-e_week_view_update_all_events (EWeekView *week_view)
-{
- e_week_view_reload_events (week_view);
-}
-
-
-/* This is called when one event has been added or updated. */
-void
-e_week_view_update_event (EWeekView *week_view,
- const gchar *uid)
-{
- EWeekViewEvent *event;
- gint event_num, num_days;
- CalComponent *comp;
- CalClientGetStatus status;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
-#if 0
- g_print ("In e_week_view_update_event\n");
-#endif
-
- /* If we don't have a calendar or valid date set yet, just return. */
- if (!week_view->calendar
- || !g_date_valid (&week_view->first_day_shown))
- return;
-
- /* Get the event from the server. */
- status = cal_client_get_object (week_view->calendar->client, uid, &comp);
-
- switch (status) {
- case CAL_CLIENT_GET_SUCCESS:
- /* Do nothing. */
- break;
- case CAL_CLIENT_GET_SYNTAX_ERROR:
- g_warning ("syntax error uid=%s\n", uid);
- return;
- case CAL_CLIENT_GET_NOT_FOUND:
- g_warning ("obj not found uid=%s\n", uid);
- return;
- }
-
- /* We only care about events. */
- if (comp && cal_component_get_vtype (comp) != CAL_COMPONENT_EVENT) {
- gtk_object_unref (GTK_OBJECT (comp));
- return;
- }
-
- /* If the event already exists and the dates didn't change, we can
- update the event fairly easily without changing the events arrays
- or computing a new layout. */
- if (e_week_view_find_event_from_uid (week_view, uid, &event_num)) {
-#warning "FIX ME"
- /* Do this the long way every time for now */
-#if 0
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
-
- if (ical_object_compare_dates (event->ico, ico)) {
- e_week_view_foreach_event_with_uid (week_view, uid, e_week_view_update_event_cb, comp);
- gtk_object_unref (GTK_OBJECT (comp));
- gtk_widget_queue_draw (week_view->main_canvas);
- return;
- }
-#endif
- /* The dates have changed, so we need to remove the
- old occurrrences before adding the new ones. */
- e_week_view_foreach_event_with_uid (week_view, uid,
- e_week_view_remove_event_cb,
- NULL);
- }
-
- /* Add the occurrences of the event. */
- num_days = week_view->display_month ? E_WEEK_VIEW_MAX_WEEKS * 7 : 7;
-
- cal_recur_generate_instances (comp,
- week_view->day_starts[0],
- week_view->day_starts[num_days],
- e_week_view_add_event,
- week_view);
-
- gtk_object_unref (GTK_OBJECT (comp));
-
- e_week_view_check_layout (week_view);
-
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-
-static gboolean
-e_week_view_update_event_cb (EWeekView *week_view,
- gint event_num,
- gpointer data)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint span_num;
- gchar *text;
- CalComponent *comp;
-
- comp = data;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- event->comp = comp;
- gtk_object_ref (GTK_OBJECT (comp));
-
- /* If we are editing an event which we have just created, we will get
- an update_event callback from the server. But we need to ignore it
- or we will lose the text the user has already typed in. */
- if (week_view->editing_new_event
- && week_view->editing_event_num == event_num) {
- return TRUE;
- }
-
- 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) {
- CalComponentText t;
-
- cal_component_get_summary (event->comp, &t);
- text = g_strdup (t.value);
- gnome_canvas_item_set (span->text_item,
- "text", text ? text : "",
- NULL);
- g_free (text);
-
- e_week_view_reshape_event_span (week_view, event_num,
- span_num);
- }
- }
-
- return TRUE;
-}
-
-
-/* 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);
-
- cal_component_get_uid (event->comp, &u);
- if (u && !strcmp (uid, u)) {
- if (!(*callback) (week_view, event_num, data))
- return;
- }
- }
-}
-
-
-/* This removes all the events associated with the given uid. Note that for
- recurring events there may be more than one. If any events are found and
- removed we need to layout the events again. */
-void
-e_week_view_remove_event (EWeekView *week_view,
- const gchar *uid)
-{
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- e_week_view_foreach_event_with_uid (week_view, uid,
- e_week_view_remove_event_cb, NULL);
-
- e_week_view_check_layout (week_view);
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-
-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 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;
- }
- }
-
- gtk_object_unref (GTK_OBJECT (event->comp));
-
- 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 week, day_of_week, row;
-
- *day_x = *day_y = *day_w = *day_h = 0;
- g_return_if_fail (day >= 0);
-
- if (week_view->display_month) {
- g_return_if_fail (day < E_WEEK_VIEW_MAX_WEEKS * 7);
-
- week = day / 7;
- day_of_week = day % 7;
- if (week_view->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_view->row_offsets[week * 2];
- *day_h = week_view->row_heights[week * 2];
- } else {
- *day_y = week_view->row_offsets[week * 2 + 1];
- *day_h = week_view->row_heights[week * 2 + 1];
- }
- /* Both Saturday and Sunday are in the 6th column. */
- *day_x = week_view->col_offsets[5];
- *day_w = week_view->col_widths[5];
- } else {
- *day_y = week_view->row_offsets[week * 2];
- *day_h = week_view->row_heights[week * 2]
- + week_view->row_heights[week * 2 + 1];
- *day_x = week_view->col_offsets[day_of_week];
- *day_w = week_view->col_widths[day_of_week];
- }
- } else {
- g_return_if_fail (day < 7);
-
- /* The week view has Mon, Tue & Wed down the left column and
- Thu, Fri & Sat/Sun down the right. */
- if (day < 3) {
- *day_x = week_view->col_offsets[0];
- *day_w = week_view->col_widths[0];
- } else {
- *day_x = week_view->col_offsets[1];
- *day_w = week_view->col_widths[1];
- }
-
- if (day < 5) {
- row = (day % 3) * 2;
- *day_y = week_view->row_offsets[row];
- *day_h = week_view->row_heights[row]
- + week_view->row_heights[row + 1];
- } else {
- /* Saturday & Sunday. */
- *day_y = week_view->row_offsets[day - 1];
- *day_h = week_view->row_heights[day - 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. */
-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 end_day_of_week, 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 (span->row >= week_view->rows_per_cell)
- return FALSE;
-
- end_day_of_week = (span->start_day + span->num_days - 1) % 7;
- num_days = span->num_days;
- /* Check if the row will not be visible in compressed cells. */
- if (span->row >= week_view->rows_per_compressed_cell) {
- if (week_view->display_month) {
- if (week_view->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 (num_days == 1) {
- return FALSE;
- } else {
- 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;
- }
- }
-
- 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;
- } 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 - start_x + end_w;
- }
-
- 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");
-#endif
-
- /* Handle scroll wheel events */
- if (event->button == 4 || event->button == 5) {
- GtkAdjustment *adj = GTK_RANGE (week_view->vscrollbar)->adjustment;
- gfloat new_value;
-
- new_value = adj->value + ((event->button == 4) ?
- -adj->page_increment:
- adj->page_increment);
- new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
- gtk_adjustment_set_value (adj, new_value);
-
- return TRUE;
- }
-
- /* If an event is pressed just return. */
- if (week_view->pressed_event_num != -1)
- return FALSE;
-
- /* 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;
-
- /* Start the selection drag. */
- if (event->button == 1) {
- if (!GTK_WIDGET_HAS_FOCUS (week_view))
- 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;
-
- /* 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));
- e_week_view_show_popup_menu (week_view, event, -1);
- }
-
- return FALSE;
-}
-
-
-static gboolean
-e_week_view_on_button_release (GtkWidget *widget,
- GdkEventButton *event,
- EWeekView *week_view)
-{
- time_t start, end;
-
-#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);
- start = week_view->day_starts[week_view->selection_start_day];
- end = week_view->day_starts[week_view->selection_end_day + 1];
- gnome_calendar_set_selected_time_range (week_view->calendar,
- start, end);
- }
-
- return FALSE;
-}
-
-
-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;
-
- /* 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->display_month) {
- week = grid_y / 2;
- if (week_view->compress_weekend && grid_x == 5
- && grid_y % 2 == 1)
- day = 6;
- else
- day = grid_x;
- } else {
- week = 0;
- if (grid_x == 0)
- day = grid_y / 2;
- else if (grid_y == 5)
- day = 6;
- else
- day = grid_y / 2 + 3;
- }
-
- 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_reload_events (EWeekView *week_view)
-{
- gint num_days;
-
- e_week_view_free_events (week_view);
-
- if (week_view->calendar
- && g_date_valid (&week_view->first_day_shown)) {
- num_days = week_view->display_month
- ? E_WEEK_VIEW_MAX_WEEKS * 7 : 7;
-
- cal_client_generate_instances (week_view->calendar->client,
- CALOBJ_TYPE_EVENT,
- week_view->day_starts[0],
- week_view->day_starts[num_days],
- e_week_view_add_event,
- week_view);
- }
-
- e_week_view_check_layout (week_view);
-
- 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;
-
- for (event_num = 0; event_num < week_view->events->len; event_num++) {
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
- gtk_object_unref (GTK_OBJECT (event->comp));
- }
-
- 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;
- }
-}
-
-
-/* This adds one event to the view, adding it to the appropriate array. */
-static gboolean
-e_week_view_add_event (CalComponent *comp,
- time_t start,
- time_t end,
- gpointer data)
-
-{
- EWeekView *week_view;
- EWeekViewEvent event;
- gint num_days;
- struct tm start_tm, end_tm;
-
- week_view = E_WEEK_VIEW (data);
-
- /* Check that the event times are valid. */
- num_days = week_view->display_month ? E_WEEK_VIEW_MAX_WEEKS * 7 : 7;
-
-#if 0
- g_print ("View start:%li end:%li Event start:%li end:%li\n",
- week_view->day_starts[0], week_view->day_starts[num_days],
- start, end);
-#endif
-
- g_return_val_if_fail (start <= end, TRUE);
- g_return_val_if_fail (start < week_view->day_starts[num_days], TRUE);
- g_return_val_if_fail (end > week_view->day_starts[0], TRUE);
-
- start_tm = *(localtime (&start));
- end_tm = *(localtime (&end));
-
- event.comp = comp;
- gtk_object_ref (GTK_OBJECT (event.comp));
- event.start = start;
- event.end = end;
- event.spans_index = 0;
- event.num_spans = 0;
-
- event.start_minute = start_tm.tm_hour * 60 + start_tm.tm_min;
- event.end_minute = end_tm.tm_hour * 60 + end_tm.tm_min;
- if (event.end_minute == 0 && start != end)
- event.end_minute = 24 * 60;
-
- g_array_append_val (week_view->events, event);
- week_view->events_sorted = FALSE;
- 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)
- e_week_view_layout_events (week_view);
-
- 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_layout_events (EWeekView *week_view)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint num_days, day, event_num, span_num;
- guint8 *grid;
- GArray *spans, *old_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 = week_view->display_month ? E_WEEK_VIEW_MAX_WEEKS * 7 : 7;
- for (day = 0; day <= num_days; day++) {
- week_view->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 < week_view->events->len; event_num++) {
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
- e_week_view_layout_event (week_view, event, grid, spans);
- }
-
- /* Free the grid. */
- g_free (grid);
-
- /* Replace the spans array. */
- old_spans = week_view->spans;
- week_view->spans = spans;
-
- /* 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);
- }
-}
-
-
-static void
-e_week_view_layout_event (EWeekView *week_view,
- EWeekViewEvent *event,
- guint8 *grid,
- GArray *spans)
-{
- 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, max_day;
- EWeekViewEventSpan span, *old_span;
-
- start_day = e_week_view_find_day (week_view, event->start, FALSE);
- end_day = e_week_view_find_day (week_view, event->end, TRUE);
- max_day = week_view->display_month ? E_WEEK_VIEW_MAX_WEEKS * 7 - 1
- : 7 - 1;
- start_day = CLAMP (start_day, 0, max_day);
- end_day = CLAMP (end_day, 0, max_day);
-
-#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 (week_view,
- 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;
- week_view->rows_per_day[day] = MAX (week_view->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 (week_view->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;
-}
-
-
-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;
- }
-}
-
-
-static 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++) {
- e_week_view_reshape_event_span (week_view, event_num,
- span_num);
- }
- }
-
- /* Reshape the jump buttons and show/hide them as appropriate. */
- num_days = week_view->display_month ? E_WEEK_VIEW_MAX_WEEKS * 7 : 7;
- for (day = 0; day < num_days; day++) {
-
- is_weekend = (day % 7 >= 5) ? TRUE : FALSE;
- if (!is_weekend || (week_view->display_month
- && !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;
- GdkFont *font;
- 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;
- CalComponent *comp;
- gdouble text_x, text_y, text_w, text_h;
- gchar *text, *end_of_line;
- gint line_len, text_width;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + span_num);
- comp = event->comp;
- font = GTK_WIDGET (week_view)->style->font;
-
- 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;
- return;
- }
-
- 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;
- }
-
- num_icons = 0;
-#if 0
- if (show_icons) {
- if (ico->dalarm.enabled || ico->malarm.enabled
- || ico->palarm.enabled || ico->aalarm.enabled)
- num_icons++;
- if (ico->recur)
- num_icons++;
- }
-#endif
-
- /* 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) {
- CalComponentText text;
-
- 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 (),
- "font_gdk", GTK_WIDGET (week_view)->style->font,
- "anchor", GTK_ANCHOR_NW,
- "clip", TRUE,
-#if 0
- "max_lines", 1,
-#endif
- "editable", TRUE,
- "text", text.value ? text.value : "",
- "use_ellipsis", TRUE,
- NULL);
- gtk_signal_connect (GTK_OBJECT (span->text_item), "event",
- GTK_SIGNAL_FUNC (e_week_view_on_text_item_event),
- week_view);
- }
-
- /* 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". */
- if (week_view->use_small_font && week_view->small_font)
- 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;
-
- /* Calculate the space needed for the icons. */
- icons_width = (E_WEEK_VIEW_ICON_WIDTH + E_WEEK_VIEW_ICON_X_PAD)
- * num_icons;
-
- /* 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 = font->ascent + font->descent;
-
- if (one_day_event) {
- text_x = span_x + E_WEEK_VIEW_EVENT_L_PAD + icons_width;
-
- switch (week_view->time_format) {
- case E_WEEK_VIEW_TIME_BOTH_SMALL_MIN:
- case E_WEEK_VIEW_TIME_BOTH:
- text_x += time_width * 2 + week_view->space_width
- + E_WEEK_VIEW_EVENT_TIME_R_PAD;
- break;
- case E_WEEK_VIEW_TIME_START_SMALL_MIN:
- case E_WEEK_VIEW_TIME_START:
- text_x += time_width + E_WEEK_VIEW_EVENT_TIME_R_PAD;
- break;
- case E_WEEK_VIEW_TIME_NONE:
- break;
- }
- text_w = span_x + span_w - E_WEEK_VIEW_EVENT_BORDER_WIDTH
- - E_WEEK_VIEW_EVENT_R_PAD - text_x;
-
- } else {
- if (use_max_width) {
- text_x = span_x + E_WEEK_VIEW_EVENT_L_PAD
- + E_WEEK_VIEW_EVENT_BORDER_WIDTH
- + E_WEEK_VIEW_EVENT_TEXT_X_PAD;
- text_w = span_x + span_w - E_WEEK_VIEW_EVENT_R_PAD
- - E_WEEK_VIEW_EVENT_BORDER_WIDTH
- - E_WEEK_VIEW_EVENT_TEXT_X_PAD - text_x;
- } else {
- /* Get the requested size of the label. */
- gtk_object_get (GTK_OBJECT (span->text_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);
- text_width = gdk_text_width (font, text, line_len);
- g_free (text);
- }
-
- /* Add on the width of the icons and find the default
- position. */
- 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_TEXT_X_PAD;
- if (event->start > week_view->day_starts[span->start_day])
- min_text_x += time_width
- + E_WEEK_VIEW_EVENT_TIME_R_PAD;
-
- 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_TEXT_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_R_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 (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);
-}
-
-
-/* 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 (EWeekView *week_view,
- time_t time_to_find,
- gboolean include_midnight_in_prev_day)
-{
- gint num_days, day;
- time_t *day_starts;
-
- num_days = week_view->display_month ? E_WEEK_VIEW_MAX_WEEKS * 7 : 7;
- day_starts = week_view->day_starts;
-
- if (time_to_find < day_starts[0])
- return -1;
- if (time_to_find > day_starts[num_days])
- return num_days;
-
- for (day = 1; day <= num_days; 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 num_days;
-}
-
-
-/* This returns the last 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 Monday to Saturday of each
- week is a span, and the Sundays are separate spans. */
-static gint
-e_week_view_find_span_end (EWeekView *week_view,
- gint day)
-{
- gint week, day_of_week, end_day;
-
- if (week_view->display_month) {
- week = day / 7;
- day_of_week = day % 7;
- if (week_view->compress_weekend && day_of_week <= 5)
- end_day = 5;
- else
- end_day = 6;
- return week * 7 + end_day;
- } else {
- return day;
- }
-}
-
-
-static void
-e_week_view_on_adjustment_changed (GtkAdjustment *adjustment,
- EWeekView *week_view)
-{
- GDate date;
- gint week_offset;
- struct tm tm;
- time_t lower, start, end;
- 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;
-
- /* Set the new first day shown. */
- week_view->first_day_shown = date;
-
- /* Convert it to a time_t. */
- g_date_to_struct_tm (&date, &tm);
- lower = mktime (&tm);
- lower = time_day_begin (lower);
-
- e_week_view_recalc_day_starts (week_view, lower);
- e_week_view_reload_events (week_view);
-
- /* Update the selection, if needed. */
- if (week_view->selection_start_day != -1) {
- start = week_view->day_starts[week_view->selection_start_day];
- end = week_view->day_starts[week_view->selection_end_day + 1];
- gnome_calendar_set_selected_time_range (week_view->calendar,
- start, end);
- }
-
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-
-void
-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;
-
- /* 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;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + span_num);
-
- /* If the event is not shown, don't try to edit it. */
- if (!span->text_item)
- return;
-
- if (initial_text) {
- gnome_canvas_item_set (span->text_item,
- "text", initial_text,
- NULL);
- }
-
- e_canvas_item_grab_focus (span->text_item);
-
- /* Try to move the cursor to the end of the text. */
- gtk_object_get (GTK_OBJECT (span->text_item),
- "event_processor", &event_processor,
- NULL);
- if (event_processor) {
- command.action = E_TEP_MOVE;
- command.position = E_TEP_END_OF_BUFFER;
- gtk_signal_emit_by_name (GTK_OBJECT (event_processor),
- "command", &command);
- }
-}
-
-
-/* This stops the current edit. If accept is TRUE the event summary is update,
- else the edit is cancelled. */
-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);
-}
-
-
-static gboolean
-e_week_view_on_text_item_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EWeekView *week_view)
-{
- gint event_num, span_num;
-
-#if 0
- g_print ("In e_week_view_on_text_item_event\n");
-#endif
-
- switch (event->type) {
- case GDK_KEY_PRESS:
- if (event && event->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;
- }
- break;
- case GDK_BUTTON_PRESS:
- if (!e_week_view_find_event_from_item (week_view, item,
- &event_num, &span_num))
- return FALSE;
-
- if (event->button.button == 3) {
- if (!GTK_WIDGET_HAS_FOCUS (week_view))
- gtk_widget_grab_focus (GTK_WIDGET (week_view));
- e_week_view_show_popup_menu (week_view,
- (GdkEventButton*) event,
- event_num);
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item->canvas),
- "button_press_event");
- return TRUE;
- }
-
- 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 (event) {
- week_view->drag_event_x = event->button.x;
- week_view->drag_event_y = event->button.y;
- } else
- g_warning ("No GdkEvent");
-
- /* FIXME: Remember the day offset from the start of
- the event. */
-
- 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 (event->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 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);
- }
-}
-
-
-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;
- CalComponentText summary;
- const char *uid;
-
- /* 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;
- week_view->editing_new_event = FALSE;
-
- /* Check that the event is still valid. */
- cal_component_get_uid (event->comp, &uid);
- if (!uid)
- return;
-
- gtk_object_get (GTK_OBJECT (span->text_item),
- "text", &text,
- NULL);
-
- /* Only update the summary if necessary. */
- cal_component_get_summary (event->comp, &summary);
- if (text && summary.value && !strcmp (text, summary.value)) {
- g_free (text);
- if (!e_week_view_is_one_day_event (week_view, event_num))
- e_week_view_reshape_event_span (week_view, event_num,
- span_num);
- return;
- }
-
- summary.value = text;
- cal_component_set_summary (event->comp, &summary);
- g_free (text);
-
- if (!cal_client_update_object (week_view->calendar->client, event->comp))
- g_message ("e_week_view_on_editing_stopped(): Could not update the object!");
-}
-
-
-static 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,
- const gchar *uid,
- gint *event_num_return)
-{
- EWeekViewEvent *event;
- gint event_num, num_events;
-
- num_events = week_view->events->len;
- for (event_num = 0; event_num < num_events; event_num++) {
- const char *u;
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
-
- cal_component_get_uid (event->comp, &u);
- if (u && !strcmp (uid, u)) {
- *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
-e_week_view_key_press (GtkWidget *widget, GdkEventKey *event)
-{
- EWeekView *week_view;
- CalComponent *comp;
- gint event_num;
- gchar *initial_text;
- CalComponentDateTime date;
- time_t dtstart, dtend;
- const char *uid;
-
- 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);
-
- /* The Escape key aborts a resize operation. */
-#if 0
- if (week_view->resize_drag_pos != E_WEEK_VIEW_POS_NONE) {
- if (event->keyval == GDK_Escape) {
- e_week_view_abort_resize (week_view, event->time);
- }
- return FALSE;
- }
-#endif
-
- if (week_view->selection_start_day == -1)
- 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->length == 0)
- || (event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK))) {
- return FALSE;
- } else {
- initial_text = event->string;
- }
-
- /* Add a new event covering the selected range. */
- comp = cal_component_new ();
- dtstart = week_view->day_starts[week_view->selection_start_day];
- dtend = week_view->day_starts[week_view->selection_end_day + 1];
-
- date.value = g_new0 (struct icaltimetype, 1);
- *date.value = icaltimetype_from_timet (dtstart, FALSE);
- cal_component_set_dtstart (comp, &date);
- *date.value = icaltimetype_from_timet (dtend, FALSE);
- cal_component_set_dtend (comp, &date);
- g_free (date.value);
-
- /* We add the event locally and start editing it. When we get the
- "update_event" callback from the server, we basically ignore it.
- If we were to wait for the "update_event" callback it wouldn't be
- as responsive and we may lose a few keystrokes. */
- e_week_view_add_event (comp, dtstart, dtend, week_view);
- e_week_view_check_layout (week_view);
- gtk_widget_queue_draw (week_view->main_canvas);
-
- cal_component_get_uid (comp, &uid);
- if (e_week_view_find_event_from_uid (week_view, uid, &event_num)) {
- e_week_view_start_editing_event (week_view, event_num, 0,
- initial_text);
- week_view->editing_new_event = TRUE;
- } else {
- g_warning ("Couldn't find event to start editing.\n");
- }
-
- if (!cal_client_update_object (week_view->calendar->client, comp))
- g_message ("e_week_view_key_press(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (comp));
-
- return TRUE;
-}
-
-
-void
-e_week_view_show_popup_menu (EWeekView *week_view,
- GdkEventButton *bevent,
- gint event_num)
-{
- EWeekViewEvent *event;
- int have_selection, not_being_edited, num_items, i;
- struct menu_item *context_menu;
-
- static struct menu_item items[] = {
- { N_("New appointment..."), (GtkSignalFunc) e_week_view_on_new_appointment, NULL, TRUE }
- };
-
- static struct menu_item child_items[] = {
- { N_("Edit this appointment..."), (GtkSignalFunc) e_week_view_on_edit_appointment, NULL, TRUE },
- { N_("Delete this appointment"), (GtkSignalFunc) e_week_view_on_delete_appointment, NULL, TRUE },
- { NULL, NULL, NULL, TRUE },
- { N_("New appointment..."), (GtkSignalFunc) e_week_view_on_new_appointment, NULL, TRUE }
- };
-
- static struct menu_item recur_child_items[] = {
- { N_("Edit this appointment..."), (GtkSignalFunc) e_week_view_on_edit_appointment, NULL, TRUE },
- { N_("Make this appointment movable"), (GtkSignalFunc) e_week_view_on_unrecur_appointment, NULL, TRUE },
- { N_("Delete this occurrence"), (GtkSignalFunc) e_week_view_on_delete_occurrence, NULL, TRUE },
- { N_("Delete all occurrences"), (GtkSignalFunc) e_week_view_on_delete_appointment, NULL, TRUE },
- { NULL, NULL, NULL, TRUE },
- { N_("New appointment..."), (GtkSignalFunc) e_week_view_on_new_appointment, NULL, TRUE }
- };
-
- have_selection = GTK_WIDGET_HAS_FOCUS (week_view)
- && week_view->selection_start_day != -1;
-
- if (event_num == -1) {
- num_items = 1;
- context_menu = &items[0];
- context_menu[0].sensitive = have_selection;
- } else {
- event = &g_array_index (week_view->events,
- EWeekViewEvent, event_num);
-
- /* This used to be set only if the event wasn't being edited
- in the event editor, but we can't check that at present.
- We could possibly set up another method of checking it. */
- not_being_edited = TRUE;
-
- if (cal_component_has_rrules (event->comp)
- || cal_component_has_rdates (event->comp)) {
- num_items = 6;
- context_menu = &recur_child_items[0];
- context_menu[0].sensitive = not_being_edited;
- context_menu[1].sensitive = not_being_edited;
- context_menu[2].sensitive = not_being_edited;
- context_menu[3].sensitive = not_being_edited;
- context_menu[5].sensitive = have_selection;
- } else {
- num_items = 4;
- context_menu = &child_items[0];
- context_menu[0].sensitive = not_being_edited;
- context_menu[1].sensitive = not_being_edited;
- context_menu[3].sensitive = have_selection;
- }
- }
-
- for (i = 0; i < num_items; i++)
- context_menu[i].data = week_view;
-
- week_view->popup_event_num = event_num;
- popup_menu (context_menu, num_items, bevent);
-}
-
-
-static void
-e_week_view_on_new_appointment (GtkWidget *widget, gpointer data)
-{
- EWeekView *week_view;
- CalComponent *comp;
- CalComponentDateTime date;
- week_view = E_WEEK_VIEW (data);
-
- comp = cal_component_new ();
-
- date.value = g_new0 (struct icaltimetype, 1);
-
- *date.value =
- icaltimetype_from_timet (week_view->day_starts[week_view->selection_start_day],
- FALSE);
- cal_component_set_dtstart (comp, &date);
-
- *date.value =
- icaltimetype_from_timet (week_view->day_starts[week_view->selection_end_day + 1],
- FALSE);
- cal_component_set_dtend (comp, &date);
-
- g_free (date.value);
-
- gnome_calendar_edit_object (week_view->calendar, comp);
-
- gtk_object_unref (GTK_OBJECT (comp));
-}
-
-
-static void
-e_week_view_on_edit_appointment (GtkWidget *widget, gpointer data)
-{
- EWeekView *week_view;
- EWeekViewEvent *event;
-
- week_view = E_WEEK_VIEW (data);
-
- if (week_view->popup_event_num == -1)
- return;
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- week_view->popup_event_num);
-
- gnome_calendar_edit_object (week_view->calendar, event->comp);
-}
-
-
-static void
-e_week_view_on_delete_occurrence (GtkWidget *widget, gpointer data)
-{
- EWeekView *week_view;
- EWeekViewEvent *event;
- CalComponent *comp;
- CalComponentDateTime *date=NULL;
- GSList *list;
-
- week_view = E_WEEK_VIEW (data);
-
- if (week_view->popup_event_num == -1)
- return;
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- week_view->popup_event_num);
-
- /* We must duplicate the CalComponent, or we won't know it has changed
- when we get the "update_event" callback. */
-
- comp = cal_component_clone (event->comp);
- cal_component_get_exdate_list (comp, &list);
- list = g_slist_append (list, date);
- date = g_new0 (CalComponentDateTime, 1);
- date->value = g_new (struct icaltimetype, 1);
- *date->value = icaltimetype_from_timet (event->start, TRUE);
- cal_component_set_exdate_list (comp, list);
- cal_component_free_exdate_list (list);
-
- if (!cal_client_update_object (week_view->calendar->client, comp))
- g_message ("e_week_view_on_delete_occurrence(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (comp));
-}
-
-
-static void
-e_week_view_on_delete_appointment (GtkWidget *widget, gpointer data)
-{
- EWeekView *week_view;
- EWeekViewEvent *event;
- const char *uid;
-
- week_view = E_WEEK_VIEW (data);
-
- if (week_view->popup_event_num == -1)
- return;
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- week_view->popup_event_num);
-
- cal_component_get_uid (event->comp, &uid);
- if (!cal_client_remove_object (week_view->calendar->client, uid))
- g_message ("e_week_view_on_delete_appointment(): Could not remove the object!");
-}
-
-
-static void
-e_week_view_on_unrecur_appointment (GtkWidget *widget, gpointer data)
-{
- EWeekView *week_view;
- EWeekViewEvent *event;
- CalComponent *comp, *new_comp;
- CalComponentDateTime *date;
- GSList *list;
-
- week_view = E_WEEK_VIEW (data);
-
- if (week_view->popup_event_num == -1)
- return;
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- week_view->popup_event_num);
-
- /* For the recurring object, we add a exception to get rid of the
- instance. */
-
- comp = cal_component_clone (event->comp);
- cal_component_get_exdate_list (comp, &list);
- date = g_new0 (CalComponentDateTime, 1);
- date->value = g_new (struct icaltimetype, 1);
- *date->value = icaltimetype_from_timet (event->start, TRUE);
- list = g_slist_append (list, date);
- cal_component_set_exdate_list (comp, list);
- cal_component_free_exdate_list (list);
-
- /* 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 = cal_component_clone (event->comp);
- cal_component_set_uid (new_comp, cal_component_gen_uid ());
- cal_component_set_exdate_list (new_comp, NULL);
- cal_component_set_exrule_list (new_comp, NULL);
-
- date = g_new0 (CalComponentDateTime, 1);
- date->value = g_new (struct icaltimetype, 1);
-
- *date->value = icaltimetype_from_timet (event->start, TRUE);
- cal_component_set_dtstart (new_comp, date);
- *date->value = icaltimetype_from_timet (event->end, TRUE);
- cal_component_set_dtend (new_comp, date);
-
- cal_component_free_datetime (date);
-
- /* Now update both CalComponents. Note that we do this last since at
- present the updates happen synchronously so our event may disappear.
- */
- if (!cal_client_update_object (week_view->calendar->client, comp))
- g_message ("e_week_view_on_unrecur_appointment(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (comp));
-
- if (!cal_client_update_object (week_view->calendar->client, new_comp))
- g_message ("e_week_view_on_unrecur_appointment(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (new_comp));
-}
-
-
-static gboolean
-e_week_view_on_jump_button_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EWeekView *week_view)
-{
- gint day;
-
- if (event->type == GDK_BUTTON_PRESS) {
- for (day = 0; day < E_WEEK_VIEW_MAX_WEEKS * 7; day++) {
- if (item == week_view->jump_buttons[day]) {
- gnome_calendar_dayjump (week_view->calendar,
- week_view->day_starts[day]);
- /* A quick hack to make the 'Day' toolbar
- button active. */
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (week_view->calendar->view_toolbar_buttons[0]), TRUE);
- return TRUE;
- }
- }
-
- }
-
- return FALSE;
-}
diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h
deleted file mode 100644
index dc2b01e4ff..0000000000
--- a/calendar/gui/e-week-view.h
+++ /dev/null
@@ -1,380 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_WEEK_VIEW_H_
-#define _E_WEEK_VIEW_H_
-
-#include <gtk/gtktable.h>
-#include <libgnomeui/gnome-canvas.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. */
-#define E_WEEK_VIEW_MAX_WEEKS 5
-
-/* The size of the reminder & recurrence icons, and padding around them. */
-#define E_WEEK_VIEW_ICON_WIDTH 16
-#define E_WEEK_VIEW_ICON_HEIGHT 16
-#define E_WEEK_VIEW_ICON_X_PAD 0
-#define E_WEEK_VIEW_ICON_Y_PAD 0
-
-/* The space on the left & right 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 3
-
-/* The vertical spacing between rows of events. */
-#define E_WEEK_VIEW_EVENT_Y_SPACING 1
-
-/* The size of the border around the event. */
-#define E_WEEK_VIEW_EVENT_BORDER_WIDTH 1
-#define E_WEEK_VIEW_EVENT_BORDER_HEIGHT 1
-
-/* The padding on each side of the event text. */
-#define E_WEEK_VIEW_EVENT_TEXT_X_PAD 4
-#define E_WEEK_VIEW_EVENT_TEXT_Y_PAD 1
-
-/* The space on the right of the time string, if it is shown. */
-#define E_WEEK_VIEW_EVENT_TIME_R_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
-
-/* 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_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;
-
-/* Specifies the position of the mouse. */
-typedef enum
-{
- E_WEEK_VIEW_POS_OUTSIDE,
- E_WEEK_VIEW_POS_NONE,
- E_WEEK_VIEW_POS_EVENT,
- E_WEEK_VIEW_POS_LEFT_EDGE,
- E_WEEK_VIEW_POS_RIGHT_EDGE
-} EWeekViewPosition;
-
-
-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 {
- CalComponent *comp;
- time_t start;
- time_t end;
- guint16 start_minute; /* Minutes from the start of the day. */
- guint16 end_minute;
- gint spans_index;
- guint 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
-{
- GtkTable table;
-
- /* 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];
-
- GtkWidget *vscrollbar;
-
- /* The calendar we are associated with. */
- GnomeCalendar *calendar;
-
- /* The array of EWeekViewEvent elements. */
- GArray *events;
- gboolean events_sorted;
- gboolean events_need_layout;
- gboolean events_need_reshape;
-
- /* 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 1 week or 1 month. */
- gboolean display_month;
-
- /* 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;
-
- /* 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. */
- GdkFont *small_font;
-
- /* 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. 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[10];
- gint row_offsets[11];
-
- /* 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. */
- GdkPixmap *reminder_icon;
- GdkBitmap *reminder_mask;
- GdkPixmap *recurrence_icon;
- GdkBitmap *recurrence_mask;
-
- /* 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 TRUE if we are editing an event which we have just created.
- We ignore the "update_event" callback which we will get from the
- server when the event is added. */
- gboolean editing_new_event;
-
- /* 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;
-};
-
-struct _EWeekViewClass
-{
- GtkTableClass parent_class;
-};
-
-
-GtkType e_week_view_get_type (void);
-GtkWidget* e_week_view_new (void);
-
-void e_week_view_set_calendar (EWeekView *week_view,
- GnomeCalendar *calendar);
-
-/* 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. */
-void e_week_view_set_selected_time_range (EWeekView *week_view,
- time_t start_time,
- time_t end_time);
-
-/* Returns the selected time range. */
-void e_week_view_get_selected_time_range (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_display_month (EWeekView *week_view);
-void e_week_view_set_display_month (EWeekView *week_view,
- gboolean display_month);
-
-/* 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);
-
-/* This reloads all calendar events. */
-void e_week_view_update_all_events (EWeekView *week_view);
-
-/* This is called when one event has been added or updated. */
-void e_week_view_update_event (EWeekView *week_view,
- const gchar *uid);
-
-/* This removes all the events associated with the given uid. Note that for
- recurring events there may be more than one. If any events are found and
- removed we need to layout the events again. */
-void e_week_view_remove_event (EWeekView *week_view,
- const gchar *uid);
-
-
-/*
- * 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);
-void 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);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_WEEK_VIEW_H_ */
diff --git a/calendar/gui/event-editor-dialog.glade b/calendar/gui/event-editor-dialog.glade
deleted file mode 100644
index d166bca079..0000000000
--- a/calendar/gui/event-editor-dialog.glade
+++ /dev/null
@@ -1,2024 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>event-editor-dialog</name>
- <program_name>event-editor-dialog</program_name>
- <directory></directory>
- <source_directory>.</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>event-editor-dialog.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeApp</class>
- <name>event-editor-dialog</name>
- <visible>False</visible>
- <title>event-editor-dialog</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <enable_layout_config>True</enable_layout_config>
-
- <widget>
- <class>GnomeDock</class>
- <child_name>GnomeApp:dock</child_name>
- <name>dock2</name>
- <allow_floating>True</allow_floating>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkNotebook</class>
- <child_name>GnomeDock:contents</child_name>
- <name>dialog-contents</name>
- <border_width>2</border_width>
- <can_focus>True</can_focus>
- <show_tabs>True</show_tabs>
- <show_border>True</show_border>
- <tab_pos>GTK_POS_TOP</tab_pos>
- <scrollable>False</scrollable>
- <tab_hborder>2</tab_hborder>
- <tab_vborder>2</tab_vborder>
- <popup_enable>False</popup_enable>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox2</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>6</spacing>
-
- <widget>
- <class>GtkTable</class>
- <name>table5</name>
- <rows>2</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>general-owner</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>general-summary</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label41</name>
- <label>_Summary:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>7.45058e-09</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>general-summary</focus_target>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label13</name>
- <label>_Owner:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>7.45058e-09</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>general-owner</focus_target>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame4</name>
- <label>Time</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table3</name>
- <border_width>4</border_width>
- <rows>2</rows>
- <columns>3</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
-
- <widget>
- <class>GtkLabel</class>
- <name>label15</name>
- <label>Start time:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label16</name>
- <label>End time:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>start-time</name>
- <creation_function>make_date_edit_with_time</creation_function>
- <string1></string1>
- <string2></string2>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Tue, 16 May 2000 19:11:05 GMT</last_modification_time>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>end-time</name>
- <creation_function>make_date_edit_with_time</creation_function>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Tue, 16 May 2000 19:11:10 GMT</last_modification_time>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>all-day-event</name>
- <can_focus>True</can_focus>
- <label>A_ll day event</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow3</name>
- <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkText</class>
- <name>description</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame5</name>
- <label>Classification</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox6</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>classification-radio</name>
- <can_focus>True</can_focus>
- <label>Pu_blic</label>
- <active>True</active>
- <draw_indicator>True</draw_indicator>
- <group>classification_radio_group</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkRadioButton</class>
- <name></name>
- <can_focus>True</can_focus>
- <label>Pri_vate</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <group>classification_radio_group</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkRadioButton</class>
- <name></name>
- <can_focus>True</can_focus>
- <label>_Confidential</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <group>classification_radio_group</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label11</name>
- <label>General</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table4</name>
- <border_width>4</border_width>
- <rows>4</rows>
- <columns>5</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>4</row_spacing>
- <column_spacing>4</column_spacing>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>alarm-display-amount</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>True</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>0</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>alarm-audio-amount</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>0</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>alarm-program-amount</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>0</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>alarm-mail-amount</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>0</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkOptionMenu</class>
- <name>alarm-display-unit</name>
- <can_focus>True</can_focus>
- <items>Minutes
-Hours
-Days
-</items>
- <initial_choice>0</initial_choice>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkOptionMenu</class>
- <name>alarm-audio-unit</name>
- <can_focus>True</can_focus>
- <items>Minutes
-Hours
-Days
-</items>
- <initial_choice>0</initial_choice>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkOptionMenu</class>
- <name>alarm-program-unit</name>
- <can_focus>True</can_focus>
- <items>Minutes
-Hours
-Days
-</items>
- <initial_choice>0</initial_choice>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkOptionMenu</class>
- <name>alarm-mail-unit</name>
- <can_focus>True</can_focus>
- <items>Minutes
-Hours
-Days
-</items>
- <initial_choice>0</initial_choice>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>alarm-mail-mail-to</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>4</left_attach>
- <right_attach>5</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GnomeFileEntry</class>
- <name>alarm-program-run-program</name>
- <max_saved>10</max_saved>
- <directory>False</directory>
- <modal>False</modal>
- <child>
- <left_attach>4</left_attach>
- <right_attach>5</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GnomeEntry:entry</child_name>
- <name>alarm-program-run-program-entry</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>alarm-display</name>
- <can_focus>True</can_focus>
- <label>_Display</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>alarm-audio</name>
- <can_focus>True</can_focus>
- <label>_Audio</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>alarm-program</name>
- <can_focus>True</can_focus>
- <label>_Program</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>alarm-mail</name>
- <can_focus>True</can_focus>
- <label>_Mail</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label18</name>
- <label>Mail _to:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>7.45058e-09</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>alarm-mail-mail-to</focus_target>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label17</name>
- <label>_Run program:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <focus_target>alarm-program-run-program-entry</focus_target>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label42</name>
- <label>Reminder</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox3</name>
- <border_width>6</border_width>
- <homogeneous>False</homogeneous>
- <spacing>6</spacing>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame8</name>
- <label>Recurrence rule</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox7</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox4</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>recurrence-rule-none</name>
- <can_focus>True</can_focus>
- <label>None</label>
- <active>True</active>
- <draw_indicator>True</draw_indicator>
- <group>recurrence_rule_group</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>recurrence-rule-daily</name>
- <can_focus>True</can_focus>
- <label>Daily</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <group>recurrence_rule_group</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>recurrence-rule-weekly</name>
- <can_focus>True</can_focus>
- <label>Weekly</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <group>recurrence_rule_group</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>recurrence-rule-monthly</name>
- <can_focus>True</can_focus>
- <label>Monthly</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <group>recurrence_rule_group</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>recurrence-rule-yearly</name>
- <can_focus>True</can_focus>
- <label>Yearly</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <group>recurrence_rule_group</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVSeparator</class>
- <name>vseparator1</name>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkNotebook</class>
- <name>recurrence-rule-notebook</name>
- <show_tabs>False</show_tabs>
- <show_border>False</show_border>
- <tab_pos>GTK_POS_TOP</tab_pos>
- <scrollable>False</scrollable>
- <tab_hborder>2</tab_hborder>
- <tab_vborder>2</tab_vborder>
- <popup_enable>False</popup_enable>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table6</name>
- <rows>3</rows>
- <columns>3</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>0</column_spacing>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label23</name>
- <label>label23</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
- <name>alignment1</name>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xscale>1</xscale>
- <yscale>1</yscale>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox7</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox13</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label31</name>
- <label>Every </label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>recurrence-rule-daily-days</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>1</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label32</name>
- <label>day(s)</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label24</name>
- <label>label24</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox8</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>2</spacing>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox14</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label33</name>
- <label>Every </label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>recurrence-rule-weekly-weeks</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>1</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label34</name>
- <label>week(s)</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox15</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>recurrence-rule-weekly-mon</name>
- <can_focus>True</can_focus>
- <label>Mon</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>recurrence-rule-weekly-tue</name>
- <can_focus>True</can_focus>
- <label>Tue</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>recurrence-rule-weekly-wed</name>
- <can_focus>True</can_focus>
- <label>Wed</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>recurrence-rule-weekly-thu</name>
- <can_focus>True</can_focus>
- <label>Thu</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>recurrence-rule-weekly-fri</name>
- <can_focus>True</can_focus>
- <label>Fri</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>recurrence-rule-weekly-sat</name>
- <can_focus>True</can_focus>
- <label>Sat</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>recurrence-rule-weekly-sun</name>
- <can_focus>True</can_focus>
- <label>Sun</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label25</name>
- <label>label25</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table8</name>
- <rows>2</rows>
- <columns>4</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>2</row_spacing>
- <column_spacing>2</column_spacing>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>recurrence-rule-monthly-on-day</name>
- <can_focus>True</can_focus>
- <label>Recur on the</label>
- <active>True</active>
- <draw_indicator>True</draw_indicator>
- <group>recurrence_rule_monthly_group</group>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>recurrence-rule-monthly-weekday</name>
- <can_focus>True</can_focus>
- <label>Recur on the</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <group>recurrence_rule_monthly_group</group>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label35</name>
- <label>th day of the month</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkOptionMenu</class>
- <name>recurrence-rule-monthly-week</name>
- <can_focus>True</can_focus>
- <items>1st
-2nd
-3rd
-4th
-5th
-</items>
- <initial_choice>0</initial_choice>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkOptionMenu</class>
- <name>recurrence-rule-monthly-weekpos</name>
- <can_focus>True</can_focus>
- <items>Monday
-Tuesday
-Wednesday
-Thursday
-Friday
-Saturday
-Sunday
-</items>
- <initial_choice>0</initial_choice>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox19</name>
- <border_width>3</border_width>
- <homogeneous>False</homogeneous>
- <spacing>3</spacing>
- <child>
- <left_attach>3</left_attach>
- <right_attach>4</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label36</name>
- <label>Every</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>recurrence-rule-monthly-every-n-months</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>1</value>
- <lower>1</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label37</name>
- <label>month(s)</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>recurrence-rule-monthly-day-nth</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>1</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label26</name>
- <label>label26</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox11</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox20</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label38</name>
- <label>Every </label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>recurrence-rule-yearly-every-n-years</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>1</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label39</name>
- <label>year(s)</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label27</name>
- <label>label27</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox8</name>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame9</name>
- <label>Ending date</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox5</name>
- <border_width>4</border_width>
- <homogeneous>True</homogeneous>
- <spacing>2</spacing>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>recurrence-ending-date-repeat-forever</name>
- <can_focus>True</can_focus>
- <label>Repeat forever</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <group>recurrence_ending_date</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox12</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>recurrence-ending-date-end-on</name>
- <can_focus>True</can_focus>
- <label>End on </label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <group>recurrence_ending_date</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>Custom</class>
- <name>recurrence-ending-date-end-on-date</name>
- <width>100</width>
- <creation_function>make_date_edit</creation_function>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Sat, 13 May 2000 18:02:55 GMT</last_modification_time>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox10</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkRadioButton</class>
- <name>recurrence-ending-date-end-after</name>
- <can_focus>True</can_focus>
- <label>End after</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <group>recurrence_ending_date</group>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>recurrence-ending-date-end-after-count</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>False</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>2</value>
- <lower>0</lower>
- <upper>100</upper>
- <step>1</step>
- <page>10</page>
- <page_size>10</page_size>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label28</name>
- <label>occurrence(s)</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame10</name>
- <label>Exceptions</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox12</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
-
- <widget>
- <class>Custom</class>
- <name>recurrence-exceptions-date</name>
- <creation_function>make_date_edit</creation_function>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Tue, 16 May 2000 01:42:29 GMT</last_modification_time>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox21</name>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox13</name>
- <homogeneous>False</homogeneous>
- <spacing>2</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>recurrence-exceptions-add</name>
- <can_focus>True</can_focus>
- <label>Add</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>recurrence-exceptions-change</name>
- <can_focus>True</can_focus>
- <label>Change</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>recurrence-exceptions-delete</name>
- <can_focus>True</can_focus>
- <label>Delete</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow2</name>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>recurrence-exceptions-list</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>False</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label40</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label12</name>
- <label>Recurrence</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GnomeAppBar</class>
- <child_name>GnomeApp:appbar</child_name>
- <name>appbar2</name>
- <has_progress>True</has_progress>
- <has_status>True</has_status>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/calendar/gui/event-editor-dialog.glade.h b/calendar/gui/event-editor-dialog.glade.h
deleted file mode 100644
index d921f3746a..0000000000
--- a/calendar/gui/event-editor-dialog.glade.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("event-editor-dialog");
-gchar *s = N_("_Summary:");
-gchar *s = N_("_Owner:");
-gchar *s = N_("Time");
-gchar *s = N_("Start time:");
-gchar *s = N_("End time:");
-gchar *s = N_("A_ll day event");
-gchar *s = N_("Classification");
-gchar *s = N_("Pu_blic");
-gchar *s = N_("Pri_vate");
-gchar *s = N_("_Confidential");
-gchar *s = N_("General");
-gchar *s = N_("Minutes\n"
- "Hours\n"
- "Days\n"
- "");
-gchar *s = N_("Minutes\n"
- "Hours\n"
- "Days\n"
- "");
-gchar *s = N_("Minutes\n"
- "Hours\n"
- "Days\n"
- "");
-gchar *s = N_("Minutes\n"
- "Hours\n"
- "Days\n"
- "");
-gchar *s = N_("_Display");
-gchar *s = N_("_Audio");
-gchar *s = N_("_Program");
-gchar *s = N_("_Mail");
-gchar *s = N_("Mail _to:");
-gchar *s = N_("_Run program:");
-gchar *s = N_("Reminder");
-gchar *s = N_("Recurrence rule");
-gchar *s = N_("None");
-gchar *s = N_("Daily");
-gchar *s = N_("Weekly");
-gchar *s = N_("Monthly");
-gchar *s = N_("Yearly");
-gchar *s = N_("label23");
-gchar *s = N_("Every ");
-gchar *s = N_("day(s)");
-gchar *s = N_("label24");
-gchar *s = N_("Every ");
-gchar *s = N_("week(s)");
-gchar *s = N_("Mon");
-gchar *s = N_("Tue");
-gchar *s = N_("Wed");
-gchar *s = N_("Thu");
-gchar *s = N_("Fri");
-gchar *s = N_("Sat");
-gchar *s = N_("Sun");
-gchar *s = N_("label25");
-gchar *s = N_("Recur on the");
-gchar *s = N_("Recur on the");
-gchar *s = N_("th day of the month");
-gchar *s = N_("1st\n"
- "2nd\n"
- "3rd\n"
- "4th\n"
- "5th\n"
- "");
-gchar *s = N_("Monday\n"
- "Tuesday\n"
- "Wednesday\n"
- "Thursday\n"
- "Friday\n"
- "Saturday\n"
- "Sunday\n"
- "");
-gchar *s = N_("Every");
-gchar *s = N_("month(s)");
-gchar *s = N_("label26");
-gchar *s = N_("Every ");
-gchar *s = N_("year(s)");
-gchar *s = N_("label27");
-gchar *s = N_("Ending date");
-gchar *s = N_("Repeat forever");
-gchar *s = N_("End on ");
-gchar *s = N_("End after");
-gchar *s = N_("occurrence(s)");
-gchar *s = N_("Exceptions");
-gchar *s = N_("Add");
-gchar *s = N_("Change");
-gchar *s = N_("Delete");
-gchar *s = N_("Recurrence");
diff --git a/calendar/gui/event-editor.c b/calendar/gui/event-editor.c
deleted file mode 100644
index ff4a6e7e29..0000000000
--- a/calendar/gui/event-editor.c
+++ /dev/null
@@ -1,1985 +0,0 @@
-/* Evolution calendar - Event editor dialog
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Miguel de Icaza <miguel@helixcode.com>
- * Federico Mena-Quintero <federico@helixcode.com>
- * Seth Alves <alves@helixcode.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.
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <glade/glade.h>
-#include <e-util/e-dialog-widgets.h>
-#include <cal-util/timeutil.h>
-#include "event-editor.h"
-
-
-
-
-typedef struct {
- /* Glade XML data */
- GladeXML *xml;
-
- /* UI handler */
- BonoboUIHandler *uih;
-
- /* Calendar object we are editing; this is an internal copy and is not
- * one of the read-only objects from the parent calendar.
- */
- CalComponent *comp;
-
- /* Widgets from the Glade file */
-
- GtkWidget *app;
-
- GtkWidget *general_owner;
- GtkWidget *general_summary;
-
- GtkWidget *start_time;
- GtkWidget *end_time;
- GtkWidget *all_day_event;
-
- GtkWidget *description;
-
- GtkWidget *alarm_display;
- GtkWidget *alarm_program;
- GtkWidget *alarm_audio;
- GtkWidget *alarm_mail;
- GtkWidget *alarm_display_amount;
- GtkWidget *alarm_display_unit;
- GtkWidget *alarm_audio_amount;
- GtkWidget *alarm_audio_unit;
- GtkWidget *alarm_program_amount;
- GtkWidget *alarm_program_unit;
- GtkWidget *alarm_program_run_program;
- GtkWidget *alarm_program_run_program_entry;
- GtkWidget *alarm_mail_amount;
- GtkWidget *alarm_mail_unit;
- GtkWidget *alarm_mail_mail_to;
-
- GtkWidget *classification_radio;
-
- GtkWidget *recurrence_rule_notebook;
- GtkWidget *recurrence_rule_none;
- GtkWidget *recurrence_rule_daily;
- GtkWidget *recurrence_rule_weekly;
- GtkWidget *recurrence_rule_monthly;
- GtkWidget *recurrence_rule_yearly;
-
- GtkWidget *recurrence_rule_daily_days;
-
- GtkWidget *recurrence_rule_weekly_weeks;
- GtkWidget *recurrence_rule_weekly_sun;
- GtkWidget *recurrence_rule_weekly_mon;
- GtkWidget *recurrence_rule_weekly_tue;
- GtkWidget *recurrence_rule_weekly_wed;
- GtkWidget *recurrence_rule_weekly_thu;
- GtkWidget *recurrence_rule_weekly_fri;
- GtkWidget *recurrence_rule_weekly_sat;
-
- GtkWidget *recurrence_rule_monthly_on_day;
- GtkWidget *recurrence_rule_monthly_weekday;
- GtkWidget *recurrence_rule_monthly_day_nth;
- GtkWidget *recurrence_rule_monthly_week;
- GtkWidget *recurrence_rule_monthly_weekpos;
- GtkWidget *recurrence_rule_monthly_every_n_months;
- GtkWidget *recurrence_rule_yearly_every_n_years;
-
- GtkWidget *recurrence_ending_date_repeat_forever;
- GtkWidget *recurrence_ending_date_end_on;
- GtkWidget *recurrence_ending_date_end_on_date;
- GtkWidget *recurrence_ending_date_end_after;
- GtkWidget *recurrence_ending_date_end_after_count;
-
- GtkWidget *recurrence_exceptions_date;
- GtkWidget *recurrence_exceptions_list;
- GtkWidget *recurrence_exception_add;
- GtkWidget *recurrence_exception_delete;
- GtkWidget *recurrence_exception_change;
-
- GtkWidget *exception_list;
- GtkWidget *exception_date;
-} EventEditorPrivate;
-
-
-
-/* Signal IDs */
-enum {
- SAVE_ICAL_OBJECT,
- ICAL_OBJECT_RELEASED,
- EDITOR_CLOSED,
- LAST_SIGNAL
-};
-
-static void event_editor_class_init (EventEditorClass *class);
-static void event_editor_init (EventEditor *ee);
-static void event_editor_destroy (GtkObject *object);
-
-static GtkObjectClass *parent_class;
-
-extern int day_begin, day_end;
-extern char *user_name;
-extern int am_pm_flag;
-extern int week_starts_on_monday;
-
-
-static void append_exception (EventEditor *ee, time_t t);
-static void check_all_day (EventEditor *ee);
-static void set_all_day (GtkWidget *toggle, EventEditor *ee);
-static void alarm_toggle (GtkWidget *toggle, EventEditor *ee);
-static void check_dates (GnomeDateEdit *gde, EventEditor *ee);
-static void check_times (GnomeDateEdit *gde, EventEditor *ee);
-static void recurrence_toggled (GtkWidget *radio, EventEditor *ee);
-static void recurrence_exception_added (GtkWidget *widget, EventEditor *ee);
-static void recurrence_exception_deleted (GtkWidget *widget, EventEditor *ee);
-static void recurrence_exception_changed (GtkWidget *widget, EventEditor *ee);
-
-static guint event_editor_signals[LAST_SIGNAL];
-
-
-
-/**
- * event_editor_get_type:
- * @void:
- *
- * Registers the #EventEditor class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #EventEditor class.
- **/
-GtkType
-event_editor_get_type (void)
-{
- static GtkType event_editor_type = 0;
-
- if (!event_editor_type) {
- static const GtkTypeInfo event_editor_info = {
- "EventEditor",
- sizeof (EventEditor),
- sizeof (EventEditorClass),
- (GtkClassInitFunc) event_editor_class_init,
- (GtkObjectInitFunc) event_editor_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- event_editor_type = gtk_type_unique (GTK_TYPE_OBJECT, &event_editor_info);
- }
-
- return event_editor_type;
-}
-
-/* Class initialization function for the event editor */
-static void
-event_editor_class_init (EventEditorClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- parent_class = gtk_type_class (GTK_TYPE_OBJECT);
-
- event_editor_signals[SAVE_ICAL_OBJECT] =
- gtk_signal_new ("save_ical_object",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EventEditorClass, save_ical_object),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
-
- event_editor_signals[ICAL_OBJECT_RELEASED] =
- gtk_signal_new ("ical_object_released",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EventEditorClass, ical_object_released),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
-
- event_editor_signals[EDITOR_CLOSED] =
- gtk_signal_new ("editor_closed",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EventEditorClass, editor_closed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, event_editor_signals, LAST_SIGNAL);
-
- object_class->destroy = event_editor_destroy;
-}
-
-/* Object initialization function for the event editor */
-static void
-event_editor_init (EventEditor *ee)
-{
- EventEditorPrivate *priv;
-
- priv = g_new0 (EventEditorPrivate, 1);
- ee->priv = priv;
-}
-
-/* Destroy handler for the event editor */
-static void
-event_editor_destroy (GtkObject *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;
-
- if (priv->uih) {
- bonobo_object_unref (BONOBO_OBJECT (priv->uih));
- priv->uih = NULL;
- }
-
- if (priv->app) {
- gtk_signal_disconnect_by_data (GTK_OBJECT (priv->app), ee);
- gtk_widget_destroy (priv->app);
- priv->app = NULL;
- }
-
- if (priv->comp) {
- /* We do not emit the "ical_object_released" signal here. If
- * the user cloased the dialog box, then it has already been
- * released. If the application just destroyed the event
- * editor, then it had better clean up after itself.
- */
- gtk_object_unref (GTK_OBJECT (priv->comp));
- priv->comp = NULL;
- }
-
- if (priv->xml) {
- gtk_object_unref (GTK_OBJECT (priv->xml));
- priv->xml = NULL;
- }
-
- g_free (priv);
- ee->priv = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-/* Creates an appropriate title for the event editor dialog */
-static char *
-make_title_from_comp (CalComponent *comp)
-{
- const char *summary;
- CalComponentVType type;
- CalComponentText text;
-
- if (!comp)
- return g_strdup (_("Edit Appointment"));
-
- cal_component_get_summary (comp, &text);
- if (text.value)
- summary = text.value;
- else
- summary = _("No summary");
-
-
- type = cal_component_get_vtype (comp);
- switch (type) {
- case CAL_COMPONENT_EVENT:
- return g_strdup_printf (_("Appointment - %s"), summary);
-
- case CAL_COMPONENT_TODO:
- return g_strdup_printf (_("Task - %s"), summary);
-
- case CAL_COMPONENT_JOURNAL:
- return g_strdup_printf (_("Journal entry - %s"), summary);
-
- default:
- g_message ("make_title_from_comp(): Cannot handle object of type %d", type);
- return NULL;
- }
-}
-
-/* Gets the widgets from the XML file and returns if they are all available.
- * For the widgets whose values can be simply set with e-dialog-utils, it does
- * that as well.
- */
-static gboolean
-get_widgets (EventEditor *ee)
-{
- EventEditorPrivate *priv;
-
- priv = ee->priv;
-
-#define GW(name) glade_xml_get_widget (priv->xml, name)
-
- priv->app = GW ("event-editor-dialog");
-
- priv->general_owner = GW ("general-owner");
- priv->general_summary = GW ("general-summary");
-
- priv->start_time = GW ("start-time");
- priv->end_time = GW ("end-time");
- priv->all_day_event = GW ("all-day-event");
-
- priv->description = GW ("description");
-
- priv->alarm_display = GW ("alarm-display");
- priv->alarm_program = GW ("alarm-program");
- priv->alarm_audio = GW ("alarm-audio");
- priv->alarm_mail = GW ("alarm-mail");
- priv->alarm_display_amount = GW ("alarm-display-amount");
- priv->alarm_display_unit = GW ("alarm-display-unit");
- priv->alarm_audio_amount = GW ("alarm-audio-amount");
- priv->alarm_audio_unit = GW ("alarm-audio-unit");
- priv->alarm_program_amount = GW ("alarm-program-amount");
- priv->alarm_program_unit = GW ("alarm-program-unit");
- priv->alarm_program_run_program = GW ("alarm-program-run-program");
- priv->alarm_program_run_program_entry = GW ("alarm-program-run-program-entry");
- priv->alarm_mail_amount = GW ("alarm-mail-amount");
- priv->alarm_mail_unit = GW ("alarm-mail-unit");
- priv->alarm_mail_mail_to = GW ("alarm-mail-mail-to");
-
- priv->classification_radio = GW ("classification-radio");
-
- priv->recurrence_rule_notebook = GW ("recurrence-rule-notebook");
- priv->recurrence_rule_none = GW ("recurrence-rule-none");
- priv->recurrence_rule_daily = GW ("recurrence-rule-daily");
- priv->recurrence_rule_weekly = GW ("recurrence-rule-weekly");
- priv->recurrence_rule_monthly = GW ("recurrence-rule-monthly");
- priv->recurrence_rule_yearly = GW ("recurrence-rule-yearly");
-
- priv->recurrence_rule_daily_days = GW ("recurrence-rule-daily-days");
-
- priv->recurrence_rule_weekly_weeks = GW ("recurrence-rule-weekly-weeks");
- priv->recurrence_rule_weekly_sun = GW ("recurrence-rule-weekly-sun");
- priv->recurrence_rule_weekly_mon = GW ("recurrence-rule-weekly-mon");
- priv->recurrence_rule_weekly_tue = GW ("recurrence-rule-weekly-tue");
- priv->recurrence_rule_weekly_wed = GW ("recurrence-rule-weekly-wed");
- priv->recurrence_rule_weekly_thu = GW ("recurrence-rule-weekly-thu");
- priv->recurrence_rule_weekly_fri = GW ("recurrence-rule-weekly-fri");
- priv->recurrence_rule_weekly_sat = GW ("recurrence-rule-weekly-sat");
-
- priv->recurrence_rule_monthly_on_day = GW ("recurrence-rule-monthly-on-day");
- priv->recurrence_rule_monthly_weekday = GW ("recurrence-rule-monthly-weekday");
- priv->recurrence_rule_monthly_day_nth = GW ("recurrence-rule-monthly-day-nth");
- priv->recurrence_rule_monthly_week = GW ("recurrence-rule-monthly-week");
- priv->recurrence_rule_monthly_weekpos = GW ("recurrence-rule-monthly-weekpos");
- priv->recurrence_rule_monthly_every_n_months = GW ("recurrence-rule-monthly-every-n-months");
- priv->recurrence_rule_yearly_every_n_years = GW ("recurrence-rule-yearly-every-n-years");
-
- priv->recurrence_ending_date_repeat_forever = GW ("recurrence-ending-date-repeat-forever");
- priv->recurrence_ending_date_end_on = GW ("recurrence-ending-date-end-on");
- priv->recurrence_ending_date_end_on_date = GW ("recurrence-ending-date-end-on-date");
- priv->recurrence_ending_date_end_after = GW ("recurrence-ending-date-end-after");
- priv->recurrence_ending_date_end_after_count = GW ("recurrence-ending-date-end-after-count");
-
- priv->recurrence_exceptions_date = GW ("recurrence-exceptions-date");
- priv->recurrence_exceptions_list = GW ("recurrence-exceptions-list");
- priv->recurrence_exception_add = GW ("recurrence-exceptions-add");
- priv->recurrence_exception_delete = GW ("recurrence-exceptions-delete");
- priv->recurrence_exception_change = GW ("recurrence-exceptions-change");
-
- priv->exception_list = GW ("recurrence-exceptions-list");
- priv->exception_date = GW ("recurrence-exceptions-date");
-
-#undef GW
-
- return (priv->general_owner
- && priv->general_summary
- && priv->start_time
- && priv->end_time
- && priv->all_day_event
- && priv->description
- && priv->alarm_display
- && priv->alarm_program
- && priv->alarm_audio
- && priv->alarm_mail
- && priv->alarm_display_amount
- && priv->alarm_display_unit
- && priv->alarm_audio_amount
- && priv->alarm_audio_unit
- && priv->alarm_program_amount
- && priv->alarm_program_unit
- && priv->alarm_program_run_program
- && priv->alarm_program_run_program_entry
- && priv->alarm_mail_amount
- && priv->alarm_mail_unit
- && priv->alarm_mail_mail_to
- && priv->classification_radio
- && priv->recurrence_rule_notebook
- && priv->recurrence_rule_none
- && priv->recurrence_rule_daily
- && priv->recurrence_rule_weekly
- && priv->recurrence_rule_monthly
- && priv->recurrence_rule_yearly
- && priv->recurrence_rule_daily_days
- && priv->recurrence_rule_weekly_weeks
- && priv->recurrence_rule_monthly_on_day
- && priv->recurrence_rule_monthly_weekday
- && priv->recurrence_rule_monthly_day_nth
- && priv->recurrence_rule_monthly_week
- && priv->recurrence_rule_monthly_weekpos
- && priv->recurrence_rule_monthly_every_n_months
- && priv->recurrence_rule_yearly_every_n_years
- && priv->recurrence_ending_date_repeat_forever
- && priv->recurrence_ending_date_end_on
- && priv->recurrence_ending_date_end_on_date
- && priv->recurrence_ending_date_end_after
- && priv->recurrence_ending_date_end_after_count
- && priv->recurrence_exceptions_date
- && priv->recurrence_exceptions_list
- && priv->recurrence_exception_add
- && priv->recurrence_exception_delete
- && priv->recurrence_exception_change
- && priv->exception_list
- && priv->exception_date);
-}
-
-static const int classification_map[] = {
- CAL_COMPONENT_CLASS_PUBLIC,
- CAL_COMPONENT_CLASS_PRIVATE,
- CAL_COMPONENT_CLASS_CONFIDENTIAL,
- -1
-};
-
-#if 0
-static const int alarm_unit_map[] = {
- ALARM_MINUTES,
- ALARM_HOURS,
- ALARM_DAYS,
- -1
-};
-
-static void
-alarm_unit_set (GtkWidget *widget, enum AlarmUnit unit)
-{
- e_dialog_option_menu_set (widget, unit, alarm_unit_map);
-}
-
-static enum AlarmUnit
-alarm_unit_get (GtkWidget *widget)
-{
- return e_dialog_option_menu_get (widget, alarm_unit_map);
-}
-#endif
-
-/* Recurrence types for mapping them to radio buttons */
-static const int recur_options_map[] = {
- ICAL_NO_RECURRENCE,
- ICAL_DAILY_RECURRENCE,
- ICAL_WEEKLY_RECURRENCE,
- ICAL_MONTHLY_RECURRENCE,
- ICAL_YEARLY_RECURRENCE,
- -1
-};
-
-static icalrecurrencetype_frequency
-recur_options_get (GtkWidget *widget)
-{
- return e_dialog_radio_get (widget, recur_options_map);
-}
-
-static const int month_pos_map[] = { 0, 1, 2, 3, 4, -1 };
-static const int weekday_map[] = { 0, 1, 2, 3, 4, 5, 6, -1 };
-
-/* Frees the rows and the row data in the recurrence exceptions GtkCList */
-static void
-free_exception_clist_data (GtkCList *clist)
-{
- int i;
-
- for (i = 0; i < clist->rows; i++) {
- gpointer data;
-
- data = gtk_clist_get_row_data (clist, i);
- g_free (data);
- gtk_clist_set_row_data (clist, i, NULL);
- }
-
- gtk_clist_clear (clist);
-}
-
-/* Hooks the widget signals */
-static void
-init_widgets (EventEditor *ee)
-{
- EventEditorPrivate *priv;
- GnomeDateEdit *gde;
- GtkWidget *widget;
-
- priv = ee->priv;
-
- /* Start and end times */
-
- gtk_signal_connect (GTK_OBJECT (priv->start_time), "date_changed",
- GTK_SIGNAL_FUNC (check_dates), ee);
- gtk_signal_connect (GTK_OBJECT (priv->start_time), "time_changed",
- GTK_SIGNAL_FUNC (check_times), ee);
-
- gtk_signal_connect (GTK_OBJECT (priv->end_time), "date_changed",
- GTK_SIGNAL_FUNC (check_dates), ee);
- gtk_signal_connect (GTK_OBJECT (priv->end_time), "time_changed",
- GTK_SIGNAL_FUNC (check_times), ee);
-
- gtk_signal_connect (GTK_OBJECT (priv->all_day_event), "toggled",
- GTK_SIGNAL_FUNC (set_all_day), ee);
-
- /* Alarms */
-
- gtk_signal_connect (GTK_OBJECT (priv->alarm_display), "toggled",
- GTK_SIGNAL_FUNC (alarm_toggle), ee);
- gtk_signal_connect (GTK_OBJECT (priv->alarm_program), "toggled",
- GTK_SIGNAL_FUNC (alarm_toggle), ee);
- gtk_signal_connect (GTK_OBJECT (priv->alarm_audio), "toggled",
- GTK_SIGNAL_FUNC (alarm_toggle), ee);
- gtk_signal_connect (GTK_OBJECT (priv->alarm_mail), "toggled",
- GTK_SIGNAL_FUNC (alarm_toggle), ee);
-
- /* Recurrence types */
-
- gtk_signal_connect (GTK_OBJECT (priv->recurrence_rule_none), "toggled",
- GTK_SIGNAL_FUNC (recurrence_toggled), ee);
- gtk_signal_connect (GTK_OBJECT (priv->recurrence_rule_daily), "toggled",
- GTK_SIGNAL_FUNC (recurrence_toggled), ee);
- gtk_signal_connect (GTK_OBJECT (priv->recurrence_rule_weekly), "toggled",
- GTK_SIGNAL_FUNC (recurrence_toggled), ee);
- gtk_signal_connect (GTK_OBJECT (priv->recurrence_rule_monthly), "toggled",
- GTK_SIGNAL_FUNC (recurrence_toggled), ee);
- gtk_signal_connect (GTK_OBJECT (priv->recurrence_rule_yearly), "toggled",
- GTK_SIGNAL_FUNC (recurrence_toggled), ee);
-
- /* Exception buttons */
-
- gtk_signal_connect (GTK_OBJECT (priv->recurrence_exception_add), "clicked",
- GTK_SIGNAL_FUNC (recurrence_exception_added), ee);
- gtk_signal_connect (GTK_OBJECT (priv->recurrence_exception_delete), "clicked",
- GTK_SIGNAL_FUNC (recurrence_exception_deleted), ee);
- gtk_signal_connect (GTK_OBJECT (priv->recurrence_exception_change), "clicked",
- GTK_SIGNAL_FUNC (recurrence_exception_changed), ee);
-
- /* Hide the stupid 'Calendar' labels. */
- gde = GNOME_DATE_EDIT (priv->start_time);
- gtk_widget_hide (gde->cal_label);
- widget = gde->date_entry;
- gtk_box_set_child_packing (GTK_BOX (widget->parent), widget,
- FALSE, FALSE, 0, GTK_PACK_START);
- widget = gde->time_entry;
- gtk_box_set_child_packing (GTK_BOX (widget->parent), widget,
- FALSE, FALSE, 0, GTK_PACK_START);
- gtk_box_set_spacing (GTK_BOX (widget->parent), 2);
-
- gde = GNOME_DATE_EDIT (priv->end_time);
- gtk_widget_hide (gde->cal_label);
- widget = gde->date_entry;
- gtk_box_set_child_packing (GTK_BOX (widget->parent), widget,
- FALSE, FALSE, 0, GTK_PACK_START);
- widget = gde->time_entry;
- gtk_box_set_child_packing (GTK_BOX (widget->parent), widget,
- FALSE, FALSE, 0, GTK_PACK_START);
- gtk_box_set_spacing (GTK_BOX (widget->parent), 2);
-}
-
-/* Fills the widgets with default values */
-static void
-clear_widgets (EventEditor *ee)
-{
- EventEditorPrivate *priv;
- time_t now;
-
- priv = ee->priv;
-
- now = time (NULL);
-
- /* Owner, summary */
-
- e_dialog_editable_set (priv->general_owner, _("?"));
- e_dialog_editable_set (priv->general_summary, NULL);
- e_dialog_editable_set (priv->description, NULL);
-
- /* Start and end times */
-
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), ee);
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), ee);
-
- e_dialog_dateedit_set (priv->start_time, now);
- e_dialog_dateedit_set (priv->end_time, now);
-
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), ee);
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), ee);
-
- check_all_day (ee);
-
- /* Alarms */
-
- /* FIXMe: these should use configurable defaults */
-
- e_dialog_toggle_set (priv->alarm_display, FALSE);
- e_dialog_toggle_set (priv->alarm_program, FALSE);
- e_dialog_toggle_set (priv->alarm_audio, FALSE);
- e_dialog_toggle_set (priv->alarm_mail, FALSE);
-
- e_dialog_spin_set (priv->alarm_display_amount, 15);
- e_dialog_spin_set (priv->alarm_audio_amount, 15);
- e_dialog_spin_set (priv->alarm_program_amount, 15);
- e_dialog_spin_set (priv->alarm_mail_amount, 15);
-
-#if 0
- alarm_unit_set (priv->alarm_display_unit, ALARM_MINUTES);
- alarm_unit_set (priv->alarm_audio_unit, ALARM_MINUTES);
- alarm_unit_set (priv->alarm_program_unit, ALARM_MINUTES);
- alarm_unit_set (priv->alarm_mail_unit, ALARM_MINUTES);
-#endif
-
- e_dialog_editable_set (priv->alarm_program_run_program_entry, NULL);
- e_dialog_editable_set (priv->alarm_mail_mail_to, NULL);
-
- /* Classification */
-
- e_dialog_radio_set (priv->classification_radio,
- CAL_COMPONENT_CLASS_PRIVATE, classification_map);
-
- /* Recurrences */
-
- e_dialog_radio_set (priv->recurrence_rule_none, ICAL_NO_RECURRENCE, recur_options_map);
-
- e_dialog_spin_set (priv->recurrence_rule_daily_days, 1);
-
- e_dialog_spin_set (priv->recurrence_rule_weekly_weeks, 1);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_sun, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_mon, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_tue, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_wed, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_thu, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_fri, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_sat, FALSE);
-
- e_dialog_toggle_set (priv->recurrence_rule_monthly_on_day, TRUE);
- e_dialog_spin_set (priv->recurrence_rule_monthly_day_nth, 1);
- e_dialog_spin_set (priv->recurrence_rule_monthly_every_n_months, 1);
- e_dialog_option_menu_set (priv->recurrence_rule_monthly_week, 0, month_pos_map);
- e_dialog_option_menu_set (priv->recurrence_rule_monthly_weekpos, 0, weekday_map);
- e_dialog_spin_set (priv->recurrence_rule_monthly_every_n_months, 1);
-
- e_dialog_spin_set (priv->recurrence_rule_yearly_every_n_years, 1);
-
- e_dialog_toggle_set (priv->recurrence_ending_date_repeat_forever, TRUE);
- e_dialog_spin_set (priv->recurrence_ending_date_end_after_count, 1);
- e_dialog_dateedit_set (priv->recurrence_ending_date_end_on_date,
- time_add_day (time (NULL), 1));
-
- /* Exceptions list */
-
- free_exception_clist_data (GTK_CLIST (priv->recurrence_exceptions_list));
-}
-
-/* Fills in the widgets with the proper values */
-static void
-fill_widgets (EventEditor *ee)
-{
- EventEditorPrivate *priv;
- CalComponentText text;
- CalComponentClassification cl;
- CalComponentDateTime d;
- GSList *list, *l;
- time_t dtstart, dtend;
-
- priv = ee->priv;
-
- clear_widgets (ee);
-
- if (!priv->comp)
- return;
-
- /* Owner, summary */
-#warning "FIX ME"
- /* kludge until I figure out where to get the organizer */
-/* e_dialog_editable_set (priv->general_owner, */
-/* priv->ico->organizer->addr ? */
-/* priv->ico->organizer->addr : _("?")); */
- e_dialog_editable_set (priv->general_owner, _("?"));
-
- cal_component_get_summary (priv->comp, &text);
- e_dialog_editable_set (priv->general_summary, text.value);
-
- cal_component_get_description_list (priv->comp, &l);
- if (l) {
- text = *(CalComponentText *)l->data;
- e_dialog_editable_set (priv->description, text.value);
- }
- cal_component_free_text_list (l);
-
- /* Start and end times */
-
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), ee);
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), ee);
-
- /* All-day events are inclusive, i.e. if the end date shown is 2nd Feb
- then the event includes all of the 2nd Feb. We would normally show
- 3rd Feb as the end date, since it really ends at midnight on 3rd,
- so we have to subtract a day so we only show the 2nd. */
- cal_component_get_dtstart (priv->comp, &d);
- dtstart = time_from_icaltimetype (*d.value);
- cal_component_get_dtend (priv->comp, &d);
- dtend = time_from_icaltimetype (*d.value);
- if (time_day_begin (dtstart) == dtstart
- && time_day_begin (dtend) == dtend) {
- dtend = time_add_day (dtend, -1);
- }
-
- e_dialog_dateedit_set (priv->start_time, dtstart);
- e_dialog_dateedit_set (priv->end_time, dtend);
-
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), ee);
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), ee);
-
- check_all_day (ee);
-
- /* Alarms */
-#if 0
- e_dialog_toggle_set (priv->alarm_display, priv->ico->dalarm.enabled);
- e_dialog_toggle_set (priv->alarm_program, priv->ico->palarm.enabled);
- e_dialog_toggle_set (priv->alarm_audio, priv->ico->aalarm.enabled);
- e_dialog_toggle_set (priv->alarm_mail, priv->ico->malarm.enabled);
-#endif
- /* Alarm data */
-#if 0
- e_dialog_spin_set (priv->alarm_display_amount, priv->ico->dalarm.count);
- e_dialog_spin_set (priv->alarm_audio_amount, priv->ico->aalarm.count);
- e_dialog_spin_set (priv->alarm_program_amount, priv->ico->palarm.count);
- e_dialog_spin_set (priv->alarm_mail_amount, priv->ico->malarm.count);
-
- alarm_unit_set (priv->alarm_display_unit, priv->ico->dalarm.units);
- alarm_unit_set (priv->alarm_audio_unit, priv->ico->aalarm.units);
- alarm_unit_set (priv->alarm_program_unit, priv->ico->palarm.units);
- alarm_unit_set (priv->alarm_mail_unit, priv->ico->malarm.units);
-
- e_dialog_editable_set (priv->alarm_program_run_program_entry, priv->ico->palarm.data);
- e_dialog_editable_set (priv->alarm_mail_mail_to, priv->ico->malarm.data);
-#endif
- /* Classification */
- cal_component_get_classification (priv->comp, &cl);
- switch (cl) {
- case CAL_COMPONENT_CLASS_PUBLIC:
- e_dialog_radio_set (priv->classification_radio, CAL_COMPONENT_CLASS_PUBLIC,
- classification_map);
- case CAL_COMPONENT_CLASS_PRIVATE:
- e_dialog_radio_set (priv->classification_radio, CAL_COMPONENT_CLASS_PRIVATE,
- classification_map);
- case CAL_COMPONENT_CLASS_CONFIDENTIAL:
- e_dialog_radio_set (priv->classification_radio, CAL_COMPONENT_CLASS_CONFIDENTIAL,
- classification_map);
- default:
- /* What do do? We can't g_assert_not_reached() since it is a
- * value from an external file.
- */
- }
-
- /* Recurrences */
-#warning "FIX ME"
- /* Need to handle recurrence dates as well as recurrence rules */
- /* Need to handle more than one rrule */
- if (cal_component_has_rrules (priv->comp)) {
- struct icalrecurrencetype *r;
- int i;
-
- cal_component_get_rrule_list (priv->comp, &list);
- r = list->data;
-
- switch (r->freq) {
- case ICAL_DAILY_RECURRENCE:
- e_dialog_radio_set (priv->recurrence_rule_daily, ICAL_DAILY_RECURRENCE,
- recur_options_map);
- e_dialog_spin_set (priv->recurrence_rule_daily_days, r->interval);
- break;
-
- case ICAL_WEEKLY_RECURRENCE:
- e_dialog_radio_set (priv->recurrence_rule_weekly, ICAL_WEEKLY_RECURRENCE,
- recur_options_map);
- e_dialog_spin_set (priv->recurrence_rule_weekly_weeks, r->interval);
-
- e_dialog_toggle_set (priv->recurrence_rule_weekly_sun, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_mon, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_tue, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_wed, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_thu, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_fri, FALSE);
- e_dialog_toggle_set (priv->recurrence_rule_weekly_sat, FALSE);
-
- for (i=0; i<8 && r->by_day[i] != SHRT_MAX; i++) {
- switch (r->by_day[i]) {
- case ICAL_SUNDAY_WEEKDAY:
- e_dialog_toggle_set (priv->recurrence_rule_weekly_sun, TRUE);
- break;
- case ICAL_MONDAY_WEEKDAY:
- e_dialog_toggle_set (priv->recurrence_rule_weekly_mon, TRUE);
- break;
- case ICAL_TUESDAY_WEEKDAY:
- e_dialog_toggle_set (priv->recurrence_rule_weekly_tue, TRUE);
- break;
- case ICAL_WEDNESDAY_WEEKDAY:
- e_dialog_toggle_set (priv->recurrence_rule_weekly_wed, TRUE);
- break;
- case ICAL_THURSDAY_WEEKDAY:
- e_dialog_toggle_set (priv->recurrence_rule_weekly_thu, TRUE);
- break;
- case ICAL_FRIDAY_WEEKDAY:
- e_dialog_toggle_set (priv->recurrence_rule_weekly_fri, TRUE);
- break;
- case ICAL_SATURDAY_WEEKDAY:
- e_dialog_toggle_set (priv->recurrence_rule_weekly_sat, TRUE);
- break;
- default:
- g_assert_not_reached ();
- }
- }
- break;
-
- case ICAL_MONTHLY_RECURRENCE:
- e_dialog_radio_set (priv->recurrence_rule_monthly, ICAL_MONTHLY_RECURRENCE,
- recur_options_map);
-
- if (r->by_month_day[0] != SHRT_MAX) {
- e_dialog_toggle_set (priv->recurrence_rule_monthly_on_day, TRUE);
- e_dialog_spin_set (priv->recurrence_rule_monthly_day_nth,
- r->by_month_day[0]);
- } else if (r->by_day[0] != SHRT_MAX) {
- e_dialog_toggle_set (priv->recurrence_rule_monthly_weekday, TRUE);
- /* libical does not handle ints in by day */
-/* e_dialog_option_menu_set (priv->recurrence_rule_monthly_week, */
-/* priv->ico->recur->u.month_pos, */
-/* month_pos_map); */
-/* e_dialog_option_menu_set (priv->recurrence_rule_monthly_weekpos, */
-/* priv->ico->recur->weekday, */
-/* weekday_map); */
- }
-
- e_dialog_spin_set (priv->recurrence_rule_monthly_every_n_months,
- r->interval);
- break;
-
- case ICAL_YEARLY_RECURRENCE:
- e_dialog_radio_set (priv->recurrence_rule_yearly, ICAL_YEARLY_RECURRENCE,
- recur_options_map);
- e_dialog_spin_set (priv->recurrence_rule_yearly_every_n_years,
- r->interval);
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- if (r->until.year == 0) {
- if (r->count == 0)
- e_dialog_toggle_set (priv->recurrence_ending_date_repeat_forever,
- TRUE);
- else {
- e_dialog_toggle_set (priv->recurrence_ending_date_end_after, TRUE);
- e_dialog_spin_set (priv->recurrence_ending_date_end_after_count,
- r->count);
- }
- } else {
- time_t t = time_from_icaltimetype (r->until);
- e_dialog_toggle_set (priv->recurrence_ending_date_end_on, TRUE);
- /* Shorten by one day, as we store end-on date a day ahead */
- /* FIXME is this correct? */
- e_dialog_dateedit_set (priv->recurrence_ending_date_end_on_date,
- time_add_day (t, -1));
- }
- cal_component_free_recur_list (list);
- }
-
- /* Exceptions list */
-#warning "FIX ME"
- /* Need to handle exception rules as well as dates */
- cal_component_get_exdate_list (priv->comp, &list);
- for (l = list; l; l = l->next) {
- struct icaltimetype *t;
- time_t ext;
-
- t = l->data;
- ext = time_from_icaltimetype (*t);
- append_exception (ee, ext);
- }
- cal_component_free_exdate_list (list);
-}
-
-
-
-/* Decode the radio button group for classifications */
-static CalComponentClassification
-classification_get (GtkWidget *widget)
-{
- return e_dialog_radio_get (widget, classification_map);
-}
-
-/* Get the values of the widgets in the event editor and put them in the iCalObject */
-static void
-dialog_to_comp_object (EventEditor *ee)
-{
- EventEditorPrivate *priv;
- CalComponent *comp;
- CalComponentText *text;
- CalComponentDateTime date;
- time_t t;
- struct icalrecurrencetype *recur;
- gboolean all_day_event;
- int i, pos = 0;
- GtkCList *exception_list;
- GSList *list = NULL;
-
- priv = ee->priv;
- comp = priv->comp;
-
- text = g_new0 (CalComponentText, 1);
- text->value = e_dialog_editable_get (priv->general_summary);
- cal_component_set_summary (comp, text);
-
- text->value = e_dialog_editable_get (priv->description);
- g_slist_prepend (list, text);
- cal_component_set_description_list (comp, list);
- cal_component_free_text_list (list);
- list = NULL;
-
- date.value = g_new (struct icaltimetype, 1);
- t = e_dialog_dateedit_get (priv->start_time);
- *date.value = icaltimetype_from_timet (t, FALSE);
- cal_component_set_dtstart (comp, &date);
-
- /* If the all_day toggle is set, the end date is inclusive of the
- entire day on which it points to. */
- all_day_event = e_dialog_toggle_get (priv->all_day_event);
- t = e_dialog_dateedit_get (priv->end_time);
- if (all_day_event)
- t = time_day_end (t);
-
- *date.value = icaltimetype_from_timet (t, FALSE);
- cal_component_set_dtend (comp, &date);
- g_free (date.value);
-
-#if 0
- ico->dalarm.enabled = e_dialog_toggle_get (priv->alarm_display);
- ico->aalarm.enabled = e_dialog_toggle_get (priv->alarm_program);
- ico->palarm.enabled = e_dialog_toggle_get (priv->alarm_audio);
- ico->malarm.enabled = e_dialog_toggle_get (priv->alarm_mail);
-
- ico->dalarm.count = e_dialog_spin_get_int (priv->alarm_display_amount);
- ico->aalarm.count = e_dialog_spin_get_int (priv->alarm_audio_amount);
- ico->palarm.count = e_dialog_spin_get_int (priv->alarm_program_amount);
- ico->malarm.count = e_dialog_spin_get_int (priv->alarm_mail_amount);
-
- ico->dalarm.units = alarm_unit_get (priv->alarm_display_unit);
- ico->aalarm.units = alarm_unit_get (priv->alarm_audio_unit);
- ico->palarm.units = alarm_unit_get (priv->alarm_program_unit);
- ico->malarm.units = alarm_unit_get (priv->alarm_mail_unit);
-
- if (ico->palarm.data)
- g_free (ico->palarm.data);
-
- if (ico->malarm.data)
- g_free (ico->malarm.data);
-
- ico->palarm.data = e_dialog_editable_get (priv->alarm_program_run_program_entry);
- ico->malarm.data = e_dialog_editable_get (priv->alarm_mail_mail_to);
-#endif
-
- cal_component_set_classification (comp, classification_get (priv->classification_radio));
-
- /* Recurrence information */
- recur = g_new (struct icalrecurrencetype, 1);
- icalrecurrencetype_clear (recur);
- recur->freq = recur_options_get (priv->recurrence_rule_none);
-
- switch (recur->freq) {
- case ICAL_NO_RECURRENCE:
- /* nothing */
- break;
-
- case ICAL_DAILY_RECURRENCE:
- recur->interval = e_dialog_spin_get_int (priv->recurrence_rule_daily_days);
- break;
-
- case ICAL_WEEKLY_RECURRENCE:
-
- recur->interval = e_dialog_spin_get_int (priv->recurrence_rule_weekly_weeks);
-
-
- if (e_dialog_toggle_get (priv->recurrence_rule_weekly_sun))
- recur->by_day[pos++] = ICAL_SUNDAY_WEEKDAY;
- if (e_dialog_toggle_get (priv->recurrence_rule_weekly_mon))
- recur->by_day[pos++] = ICAL_MONDAY_WEEKDAY;
- if (e_dialog_toggle_get (priv->recurrence_rule_weekly_tue))
- recur->by_day[pos++] = ICAL_TUESDAY_WEEKDAY;
- if (e_dialog_toggle_get (priv->recurrence_rule_weekly_wed))
- recur->by_day[pos++] = ICAL_WEDNESDAY_WEEKDAY;
- if (e_dialog_toggle_get (priv->recurrence_rule_weekly_thu))
- recur->by_day[pos++] = ICAL_THURSDAY_WEEKDAY;
- if (e_dialog_toggle_get (priv->recurrence_rule_weekly_fri))
- recur->by_day[pos++] = ICAL_FRIDAY_WEEKDAY;
- if (e_dialog_toggle_get (priv->recurrence_rule_weekly_sat))
- recur->by_day[pos++] = ICAL_SATURDAY_WEEKDAY;
-
- break;
-
- case ICAL_MONTHLY_RECURRENCE:
-
- if (e_dialog_toggle_get (priv->recurrence_rule_monthly_on_day)) {
- /* by day of in the month (ex: the 5th) */
- recur->by_month_day[0] =
- e_dialog_spin_get_int (priv->recurrence_rule_monthly_day_nth);
- } else if (e_dialog_toggle_get (priv->recurrence_rule_monthly_weekday)) {
- /* "recurrence-rule-monthly-weekday" is TRUE */
- /* by position on the calender (ex: 2nd monday) */
- /* libical does not handle this yet */
-/* ico->recur->u.month_pos = e_dialog_option_menu_get ( */
-/* priv->recurrence_rule_monthly_week, */
-/* month_pos_map); */
-/* ico->recur->weekday = e_dialog_option_menu_get ( */
-/* priv->recurrence_rule_monthly_weekpos, */
-/* weekday_map); */
-
- } else
- g_assert_not_reached ();
-
- recur->interval = e_dialog_spin_get_int (priv->recurrence_rule_monthly_every_n_months);
-
- break;
-
- case ICAL_YEARLY_RECURRENCE:
- recur->interval = e_dialog_spin_get_int (priv->recurrence_rule_yearly_every_n_years);
-
- default:
- g_assert_not_reached ();
- }
-
- /* recurrence ending date */
- if (e_dialog_toggle_get (priv->recurrence_ending_date_end_on)) {
- /* Also here, to ensure that the event is used, we add 86400
- * secs to get get next day, in accordance to the RFC
- */
- t = e_dialog_dateedit_get (priv->recurrence_ending_date_end_on_date) + 86400;
- recur->until = icaltimetype_from_timet (t, TRUE);
- } else if (e_dialog_toggle_get (priv->recurrence_ending_date_end_after)) {
- recur->count = e_dialog_spin_get_int (priv->recurrence_ending_date_end_after_count);
- }
- g_slist_append (list, recur);
- cal_component_set_rrule_list (comp, list);
- list = NULL;
-
- /* Get exceptions from clist into ico->exdate */
- exception_list = GTK_CLIST (priv->recurrence_exceptions_list);
- for (i = 0; i < exception_list->rows; i++) {
- struct icaltimetype *tt = g_new (struct icaltimetype, 1);
- time_t *t;
-
- t = gtk_clist_get_row_data (exception_list, i);
- *tt = icaltimetype_from_timet (*t, FALSE);
-
- list = g_slist_prepend (list, tt);
- }
- cal_component_set_exdate_list (comp, list);
- cal_component_free_exdate_list (list);
-}
-
-/* Emits the "save_ical_object" signal if the event editor is editing an object. */
-static void
-save_ical_object (EventEditor *ee)
-{
- EventEditorPrivate *priv;
- char *title;
-
- priv = ee->priv;
-
- if (!priv->comp)
- return;
-
- dialog_to_comp_object (ee);
-
- title = make_title_from_comp (priv->comp);
- gtk_window_set_title (GTK_WINDOW (priv->app), title);
- g_free (title);
-
- gtk_signal_emit (GTK_OBJECT (ee), event_editor_signals[SAVE_ICAL_OBJECT],
- priv->comp);
-}
-
-/* Closes the dialog box and emits the appropriate signals */
-static void
-close_dialog (EventEditor *ee)
-{
- EventEditorPrivate *priv;
-
- priv = ee->priv;
-
- g_assert (priv->app != NULL);
-
- free_exception_clist_data (GTK_CLIST (priv->recurrence_exceptions_list));
-
- gtk_widget_destroy (priv->app);
- priv->app = NULL;
-
- if (priv->comp) {
- const char *uid;
-
- cal_component_get_uid (priv->comp, &uid);
- gtk_signal_emit (GTK_OBJECT (ee), event_editor_signals[ICAL_OBJECT_RELEASED], uid);
- gtk_object_unref (GTK_OBJECT (priv->comp));
- priv->comp = NULL;
- }
-
- gtk_signal_emit (GTK_OBJECT (ee), event_editor_signals[EDITOR_CLOSED]);
-}
-
-
-
-/* File/Save callback */
-static void
-file_save_cb (GtkWidget *widget, gpointer data)
-{
- EventEditor *ee;
-
- ee = EVENT_EDITOR (data);
- save_ical_object (ee);
-}
-
-/* File/Close callback */
-static void
-file_close_cb (GtkWidget *widget, gpointer data)
-{
- EventEditor *ee;
-
- /* FIXME: need to check for a dirty object */
-
- ee = EVENT_EDITOR (data);
- close_dialog (ee);
-}
-
-
-
-/* Menu bar */
-
-static GnomeUIInfo file_new_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Appointment"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Meeting Re_quest"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Mail Message"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Contact"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Task"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Task _Request"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Journal Entry"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Note"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Ch_oose Form..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo file_page_setup_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Memo Style"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Define Print _Styles..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo file_menu[] = {
- GNOMEUIINFO_MENU_NEW_SUBTREE (file_new_menu),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: S_end"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_SAVE_ITEM (file_save_cb, NULL),
- GNOMEUIINFO_MENU_SAVE_AS_ITEM (NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Save Attac_hments..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Delete"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Move to Folder..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Cop_y to Folder..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("Page Set_up"), file_page_setup_menu),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Print Pre_view"), NULL, NULL),
- GNOMEUIINFO_MENU_PRINT_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_PROPERTIES_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CLOSE_ITEM (file_close_cb, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo edit_object_menu[] = {
- GNOMEUIINFO_ITEM_NONE ("FIXME: what goes here?", NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo edit_menu[] = {
- GNOMEUIINFO_MENU_UNDO_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_REDO_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CUT_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_COPY_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_PASTE_ITEM (NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Paste _Special..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_CLEAR_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_SELECT_ALL_ITEM (NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Mark as U_nread"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_FIND_ITEM (NULL, NULL),
- GNOMEUIINFO_MENU_FIND_AGAIN_ITEM (NULL, NULL),
- GNOMEUIINFO_SUBTREE (N_("_Object"), edit_object_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_previous_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Unread Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Fi_rst Item in Folder"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_next_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Unread Item"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Last Item in Folder"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_toolbars_menu[] = {
- { GNOME_APP_UI_TOGGLEITEM, N_("FIXME: _Standard"), NULL, NULL, NULL, NULL,
- GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },
- { GNOME_APP_UI_TOGGLEITEM, N_("FIXME: __Formatting"), NULL, NULL, NULL, NULL,
- GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Customize..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_menu[] = {
- GNOMEUIINFO_SUBTREE (N_("Pre_vious"), view_previous_menu),
- GNOMEUIINFO_SUBTREE (N_("Ne_xt"), view_next_menu),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Ca_lendar..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("_Toolbars"), view_toolbars_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo insert_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _File..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: It_em..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Object..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo format_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Font..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Paragraph..."), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo tools_forms_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Ch_oose Form..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Desi_gn This Form"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: D_esign a Form..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Publish _Form..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Pu_blish Form As..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Script _Debugger"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo tools_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Spelling..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Chec_k Names"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Address _Book..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_SUBTREE (N_("_Forms"), tools_forms_menu),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo actions_menu[] = {
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: _New Appointment"), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Rec_urrence..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Invite _Attendees..."), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: C_ancel Invitation..."), NULL, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Forward as v_Calendar"), NULL, NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: For_ward"), NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo help_menu[] = {
- GNOMEUIINFO_ITEM_NONE ("FIXME: fix Bonobo so it supports help items!", NULL, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo main_menu[] = {
- GNOMEUIINFO_MENU_FILE_TREE (file_menu),
- GNOMEUIINFO_MENU_EDIT_TREE (edit_menu),
- GNOMEUIINFO_MENU_VIEW_TREE (view_menu),
- GNOMEUIINFO_SUBTREE (N_("_Insert"), insert_menu),
- GNOMEUIINFO_SUBTREE (N_("F_ormat"), format_menu),
- GNOMEUIINFO_SUBTREE (N_("_Tools"), tools_menu),
- GNOMEUIINFO_SUBTREE (N_("Actio_ns"), actions_menu),
- GNOMEUIINFO_MENU_HELP_TREE (help_menu),
- GNOMEUIINFO_END
-};
-
-/* Creates the menu bar for the event editor */
-static void
-create_menu (EventEditor *ee)
-{
- EventEditorPrivate *priv;
- BonoboUIHandlerMenuItem *list;
-
- priv = ee->priv;
-
- bonobo_ui_handler_create_menubar (priv->uih);
-
- list = bonobo_ui_handler_menu_parse_uiinfo_list_with_data (main_menu, ee);
- bonobo_ui_handler_menu_add_list (priv->uih, "/", list);
-}
-
-
-
-/* Toolbar/Save and Close callback */
-static void
-tb_save_and_close_cb (GtkWidget *widget, gpointer data)
-{
- EventEditor *ee;
-
- ee = EVENT_EDITOR (data);
- save_ical_object (ee);
- close_dialog (ee);
-}
-
-
-
-/* Toolbar */
-
-static GnomeUIInfo toolbar[] = {
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Save and Close"),
- N_("Save the appointment and close the dialog box"),
- tb_save_and_close_cb,
- GNOME_STOCK_PIXMAP_SAVE),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Print..."),
- N_("Print this item"), NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Insert File..."),
- N_("Insert a file as an attachment"), NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Recurrence..."),
- N_("Configure recurrence rules"), NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Invite Attendees..."),
- N_("Invite attendees to a meeting"), NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Delete"),
- N_("Delete this item"), NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Previous"),
- N_("Go to the previous item"), NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Next"),
- N_("Go to the next item"), NULL),
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Help"),
- N_("See online help"), NULL, GNOME_STOCK_PIXMAP_HELP),
- GNOMEUIINFO_END
-};
-
-/* Creates the toolbar for the event editor */
-static void
-create_toolbar (EventEditor *ee)
-{
- EventEditorPrivate *priv;
- BonoboUIHandlerToolbarItem *list;
- GnomeDockItem *dock_item;
- GtkWidget *toolbar_child;
-
- priv = ee->priv;
-
- bonobo_ui_handler_create_toolbar (priv->uih, "Toolbar");
-
- /* Fetch the toolbar. What a pain in the ass. */
-
- dock_item = gnome_app_get_dock_item_by_name (GNOME_APP (priv->app), GNOME_APP_TOOLBAR_NAME);
- g_assert (dock_item != NULL);
-
- toolbar_child = gnome_dock_item_get_child (dock_item);
- g_assert (toolbar_child != NULL && GTK_IS_TOOLBAR (toolbar_child));
-
- /* Turn off labels as GtkToolbar sucks */
- gtk_toolbar_set_style (GTK_TOOLBAR (toolbar_child), GTK_TOOLBAR_ICONS);
-
- list = bonobo_ui_handler_toolbar_parse_uiinfo_list_with_data (toolbar, ee);
- bonobo_ui_handler_toolbar_add_list (priv->uih, "/Toolbar", list);
-}
-
-
-
-/* Callback used when the dialog box is destroyed */
-static gint
-app_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- EventEditor *ee;
-
- /* FIXME: need to check for a dirty object */
-
- ee = EVENT_EDITOR (data);
- close_dialog (ee);
-
- return TRUE;
-}
-
-/**
- * event_editor_construct:
- * @ee: An event editor.
- *
- * Constructs an event editor by loading its Glade data.
- *
- * Return value: The same object as @ee, or NULL if the widgets could not be
- * created. In the latter case, the event editor will automatically be
- * destroyed.
- **/
-EventEditor *
-event_editor_construct (EventEditor *ee)
-{
- EventEditorPrivate *priv;
-
- g_return_val_if_fail (ee != NULL, NULL);
- g_return_val_if_fail (IS_EVENT_EDITOR (ee), NULL);
-
- priv = ee->priv;
-
- /* Load the content widgets */
-
- priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/event-editor-dialog.glade", NULL);
- if (!priv->xml) {
- g_message ("event_editor_construct(): Could not load the Glade XML file!");
- goto error;
- }
-
- if (!get_widgets (ee)) {
- g_message ("event_editor_construct(): Could not find all widgets in the XML file!");
- goto error;
- }
-
- init_widgets (ee);
-
- /* Construct the app */
-
- priv->uih = bonobo_ui_handler_new ();
- if (!priv->uih) {
- g_message ("event_editor_construct(): Could not create the UI handler");
- goto error;
- }
-
- bonobo_ui_handler_set_app (priv->uih, GNOME_APP (priv->app));
-
- create_menu (ee);
- create_toolbar (ee);
-
- /* Hook to destruction of the dialog */
-
- gtk_signal_connect (GTK_OBJECT (priv->app), "delete_event",
- GTK_SIGNAL_FUNC (app_delete_event_cb), ee);
-
- /* Show the dialog */
-
- gtk_widget_show (priv->app);
-
- return ee;
-
- error:
-
- gtk_object_unref (GTK_OBJECT (ee));
- return NULL;
-}
-
-/**
- * event_editor_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.
- **/
-EventEditor *
-event_editor_new (void)
-{
- EventEditor *ee;
-
- ee = EVENT_EDITOR (gtk_type_new (TYPE_EVENT_EDITOR));
- return event_editor_construct (EVENT_EDITOR (ee));
-}
-
-/**
- * event_editor_set_ical_object:
- * @ee: An event editor.
- * @comp: A calendar object.
- *
- * Sets the calendar object that an event editor dialog will manipulate.
- **/
-void
-event_editor_set_ical_object (EventEditor *ee, CalComponent *comp)
-{
- EventEditorPrivate *priv;
- char *title;
-
- g_return_if_fail (ee != NULL);
- g_return_if_fail (IS_EVENT_EDITOR (ee));
-
- priv = ee->priv;
-
- if (priv->comp) {
- const char *uid;
-
- cal_component_get_uid (priv->comp, &uid);
- gtk_signal_emit (GTK_OBJECT (ee), event_editor_signals[ICAL_OBJECT_RELEASED], uid);
- gtk_object_unref (GTK_OBJECT (priv->comp));
- priv->comp = NULL;
- }
-
- if (comp)
- priv->comp = cal_component_clone (comp);
-
- title = make_title_from_comp (priv->comp);
- gtk_window_set_title (GTK_WINDOW (priv->app), title);
- g_free (title);
-
- fill_widgets (ee);
-}
-
-/* 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);
-}
-
-/**
- * event_editor_focus:
- * @ee: An event editor.
- *
- * Makes sure an event editor is shown, on top of other windows, and focused.
- **/
-void
-event_editor_focus (EventEditor *ee)
-{
- EventEditorPrivate *priv;
-
- g_return_if_fail (ee != NULL);
- g_return_if_fail (IS_EVENT_EDITOR (ee));
-
- priv = ee->priv;
- gtk_widget_show_now (priv->app);
- raise_and_focus (priv->app);
-}
-
-static void
-alarm_toggle (GtkWidget *toggle, EventEditor *ee)
-{
- EventEditorPrivate *priv;
- GtkWidget *alarm_amount = NULL;
- GtkWidget *alarm_unit = NULL;
- gboolean active;
-
- priv = ee->priv;
-
- active = GTK_TOGGLE_BUTTON (toggle)->active;
-
- if (toggle == priv->alarm_display) {
- alarm_amount = priv->alarm_display_amount;
- alarm_unit = priv->alarm_display_unit;
- } else if (toggle == priv->alarm_audio) {
- alarm_amount = priv->alarm_audio_amount;
- alarm_unit = priv->alarm_audio_unit;
- } else if (toggle == priv->alarm_program) {
- alarm_amount = priv->alarm_program_amount;
- alarm_unit = priv->alarm_program_unit;
- gtk_widget_set_sensitive (priv->alarm_program_run_program, active);
- } else if (toggle == priv->alarm_mail) {
- alarm_amount = priv->alarm_mail_amount;
- alarm_unit = priv->alarm_mail_unit;
- gtk_widget_set_sensitive (priv->alarm_mail_mail_to, active);
- } else
- g_assert_not_reached ();
-
- gtk_widget_set_sensitive (alarm_amount, active);
- gtk_widget_set_sensitive (alarm_unit, active);
-}
-
-/*
- * Checks if the day range occupies all the day, and if so, check the
- * box accordingly
- */
-static void
-check_all_day (EventEditor *ee)
-{
- EventEditorPrivate *priv;
- time_t ev_start, ev_end;
-
- priv = ee->priv;
-
- ev_start = e_dialog_dateedit_get (priv->start_time);
- ev_end = e_dialog_dateedit_get (priv->end_time);
-
- /* all day event checkbox */
- if (time_day_begin (ev_start) == ev_start
- && time_day_begin (ev_end) == ev_end)
- e_dialog_toggle_set (priv->all_day_event, TRUE);
- else
- e_dialog_toggle_set (priv->all_day_event, FALSE);
-}
-
-/*
- * Callback: all day event box clicked
- */
-static void
-set_all_day (GtkWidget *toggle, EventEditor *ee)
-{
- EventEditorPrivate *priv;
- struct tm start_tm, end_tm;
- time_t start_t, end_t;
- gboolean all_day;
- int flags;
-
- priv = ee->priv;
-
- /* If the all_day toggle is set, the end date is inclusive of the
- entire day on which it points to. */
- all_day = GTK_TOGGLE_BUTTON (toggle)->active;
-
- start_t = e_dialog_dateedit_get (priv->start_time);
- start_tm = *localtime (&start_t);
- start_tm.tm_min = 0;
- start_tm.tm_sec = 0;
-
- if (all_day)
- start_tm.tm_hour = 0;
- else
- start_tm.tm_hour = day_begin;
-
- e_dialog_dateedit_set (priv->start_time, mktime (&start_tm));
-
- end_t = e_dialog_dateedit_get (priv->end_time);
- end_tm = *localtime (&end_t);
- end_tm.tm_min = 0;
- end_tm.tm_sec = 0;
-
- if (all_day) {
- /* mktime() will fix this if we go past the end of the month.*/
- end_tm.tm_hour = 0;
- } else {
- if (end_tm.tm_year == start_tm.tm_year
- && end_tm.tm_mon == start_tm.tm_mon
- && end_tm.tm_mday == start_tm.tm_mday
- && end_tm.tm_hour <= start_tm.tm_hour)
- end_tm.tm_hour = start_tm.tm_hour + 1;
- }
-
- flags = gnome_date_edit_get_flags (GNOME_DATE_EDIT (priv->start_time));
- if (all_day)
- flags &= ~GNOME_DATE_EDIT_SHOW_TIME;
- else
- flags |= GNOME_DATE_EDIT_SHOW_TIME;
- gnome_date_edit_set_flags (GNOME_DATE_EDIT (priv->start_time), flags);
- gnome_date_edit_set_flags (GNOME_DATE_EDIT (priv->end_time), flags);
-
- e_dialog_dateedit_set (priv->end_time, mktime (&end_tm));
-
- gtk_widget_hide (GNOME_DATE_EDIT (priv->start_time)->cal_label);
- gtk_widget_hide (GNOME_DATE_EDIT (priv->end_time)->cal_label);
-}
-
-/*
- * Callback: checks that the dates are start < end
- */
-static void
-check_dates (GnomeDateEdit *gde, EventEditor *ee)
-{
- EventEditorPrivate *priv;
- time_t start, end;
- struct tm tm_start, tm_end;
-
- priv = ee->priv;
-
- start = e_dialog_dateedit_get (priv->start_time);
- end = e_dialog_dateedit_get (priv->end_time);
-
- if (start > end) {
- tm_start = *localtime (&start);
- tm_end = *localtime (&end);
-
- if (GTK_WIDGET (gde) == priv->start_time) {
- tm_end.tm_year = tm_start.tm_year;
- tm_end.tm_mon = tm_start.tm_mon;
- tm_end.tm_mday = tm_start.tm_mday;
-
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), ee);
- e_dialog_dateedit_set (priv->end_time, mktime (&tm_end));
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), ee);
- } else if (GTK_WIDGET (gde) == priv->end_time) {
- tm_start.tm_year = tm_end.tm_year;
- tm_start.tm_mon = tm_end.tm_mon;
- tm_start.tm_mday = tm_end.tm_mday;
-
-#if 0
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), ee);
- e_dialog_dateedit_set (priv->start_time, mktime (&tm_start));
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), ee);
-#endif
- }
- }
-}
-
-/*
- * Callback: checks that start_time < end_time and whether the
- * selected hour range spans all of the day
- */
-static void
-check_times (GnomeDateEdit *gde, EventEditor *ee)
-{
- EventEditorPrivate *priv;
- time_t start, end;
- struct tm tm_start, tm_end;
-
- priv = ee->priv;
-#if 0
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- gdk_flush ();
-#endif
- start = e_dialog_dateedit_get (priv->start_time);
- end = e_dialog_dateedit_get (priv->end_time);
-
- if (start > end) {
- tm_start = *localtime (&start);
- tm_end = *localtime (&end);
-
- if (GTK_WIDGET (gde) == priv->start_time) {
- tm_end.tm_min = tm_start.tm_min;
- tm_end.tm_sec = tm_start.tm_sec;
- tm_end.tm_hour = tm_start.tm_hour + 1;
-
- if (tm_end.tm_hour >= 24) {
- tm_end.tm_hour = 24; /* mktime() will bump the day */
- tm_end.tm_min = 0;
- tm_end.tm_sec = 0;
- }
-
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), ee);
- e_dialog_dateedit_set (priv->end_time, mktime (&tm_end));
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), ee);
- } else if (GTK_WIDGET (gde) == priv->end_time) {
- tm_start.tm_min = tm_end.tm_min;
- tm_start.tm_sec = tm_end.tm_sec;
- tm_start.tm_hour = tm_end.tm_hour - 1;
-
- if (tm_start.tm_hour < 0) {
- tm_start.tm_hour = 0;
- tm_start.tm_min = 0;
- tm_start.tm_min = 0;
- }
-
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), ee);
- e_dialog_dateedit_set (priv->start_time, mktime (&tm_start));
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), ee);
- }
- }
-
- /* Check whether the event spans the whole day */
-
- check_all_day (ee);
-}
-
-static void
-recurrence_toggled (GtkWidget *radio, EventEditor *ee)
-{
- EventEditorPrivate *priv;
- icalrecurrencetype_frequency rf;
-
- priv = ee->priv;
-
- if (!GTK_TOGGLE_BUTTON (radio)->active)
- return;
-
- rf = e_dialog_radio_get (radio, recur_options_map);
-
- gtk_notebook_set_page (GTK_NOTEBOOK (priv->recurrence_rule_notebook), (int) rf);
-}
-
-
-static char *
-get_exception_string (time_t t)
-{
- static char buf[256];
-
- strftime (buf, sizeof (buf), _("%a %b %d %Y"), localtime (&t));
- return buf;
-}
-
-
-static void
-append_exception (EventEditor *ee, time_t t)
-{
- EventEditorPrivate *priv;
- time_t *tt;
- char *c[1];
- int i;
- GtkCList *clist;
-
- priv = ee->priv;
-
- c[0] = get_exception_string (t);
-
- tt = g_new (time_t, 1);
- *tt = t;
-
- clist = GTK_CLIST (priv->recurrence_exceptions_list);
-
- i = gtk_clist_append (clist, c);
- gtk_clist_set_row_data (clist, i, tt);
- gtk_clist_select_row (clist, i, 0);
-
-/* gtk_widget_set_sensitive (ee->recur_ex_vbox, TRUE); */
-}
-
-
-static void
-recurrence_exception_added (GtkWidget *widget, EventEditor *ee)
-{
- EventEditorPrivate *priv;
- time_t t;
-
- priv = ee->priv;
-
- t = e_dialog_dateedit_get (priv->recurrence_exceptions_date);
- append_exception (ee, t);
-}
-
-
-static void
-recurrence_exception_deleted (GtkWidget *widget, EventEditor *ee)
-{
- EventEditorPrivate *priv;
- GtkCList *clist;
- int sel;
-
- priv = ee->priv;
-
- clist = GTK_CLIST (priv->recurrence_exceptions_list);
- if (!clist->selection)
- return;
-
- sel = GPOINTER_TO_INT (clist->selection->data);
-
- g_free (gtk_clist_get_row_data (clist, sel)); /* free the time_t stored there */
-
- gtk_clist_remove (clist, sel);
- if (sel >= clist->rows)
- sel--;
-
- gtk_clist_select_row (clist, sel, 0);
-}
-
-
-static void
-recurrence_exception_changed (GtkWidget *widget, EventEditor *ee)
-{
- EventEditorPrivate *priv;
- GtkCList *clist;
- time_t *t;
- int sel;
-
- priv = ee->priv;
-
- clist = GTK_CLIST (priv->recurrence_exceptions_list);
- if (!clist->selection)
- return;
-
- sel = GPOINTER_TO_INT (clist->selection->data);
-
- t = gtk_clist_get_row_data (clist, sel);
- *t = e_dialog_dateedit_get (priv->recurrence_exceptions_date);
-
- gtk_clist_set_text (clist, sel, 0, get_exception_string (*t));
-}
-
-
-GtkWidget *
-make_date_edit (void)
-{
- return date_edit_new (time (NULL), FALSE);
-}
-
-
-GtkWidget *
-make_date_edit_with_time (void)
-{
- return date_edit_new (time (NULL), TRUE);
-}
-
-
-GtkWidget *
-date_edit_new (time_t the_time, int show_time)
-{
- return gnome_date_edit_new_flags (the_time,
- ((show_time ? GNOME_DATE_EDIT_SHOW_TIME : 0)
- | (am_pm_flag ? 0 : GNOME_DATE_EDIT_24_HR)
- | (week_starts_on_monday
- ? GNOME_DATE_EDIT_WEEK_STARTS_ON_MONDAY
- : 0)));
-}
-
-
-
-GtkWidget *
-make_spin_button (int val, int low, int high)
-{
- GtkAdjustment *adj;
- GtkWidget *spin;
-
- adj = GTK_ADJUSTMENT (gtk_adjustment_new (val, low, high, 1, 10, 10));
- spin = gtk_spin_button_new (adj, 0.5, 0);
- gtk_widget_set_usize (spin, 60, 0);
-
- return spin;
-}
-
-
-/* todo
-
- build some of the recur stuff by hand to take into account
- the start-on-monday preference?
-
- get the apply button to work right
-
- make the properties stuff unglobal
-
- figure out why alarm units aren't sticking between edits
-
- closing the dialog window with the wm caused a crash
- Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
- on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
- */
diff --git a/calendar/gui/event-editor.h b/calendar/gui/event-editor.h
deleted file mode 100644
index 8e95e08cfb..0000000000
--- a/calendar/gui/event-editor.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* Evolution calendar - Event editor dialog
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Miguel de Icaza <miguel@helixcode.com>
- * Federico Mena-Quintero <federico@helixcode.com>
- * Seth Alves <alves@helixcode.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 __EVENT_EDITOR_DIALOG_H__
-#define __EVENT_EDITOR_DIALOG_H__
-
-#include <libgnome/gnome-defs.h>
-#include <gtk/gtkobject.h>
-#include "gnome-cal.h"
-
-
-
-#define TYPE_EVENT_EDITOR (event_editor_get_type ())
-#define EVENT_EDITOR(obj) (GTK_CHECK_CAST ((obj), TYPE_EVENT_EDITOR, EventEditor))
-#define EVENT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_EVENT_EDITOR, \
- EventEditorClass))
-#define IS_EVENT_EDITOR(obj) (GTK_CHECK_TYPE ((obj), TYPE_EVENT_EDITOR))
-#define IS_EVENT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_EVENT_EDITOR))
-
-typedef struct _EventEditor EventEditor;
-typedef struct _EventEditorClass EventEditorClass;
-
-struct _EventEditor {
- GtkObject object;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _EventEditorClass {
- GtkObjectClass parent_class;
-
- /* Notification signals */
-
- void (* save_ical_object) (EventEditor *ee, CalComponent *comp);
- void (* ical_object_released) (EventEditor *ee, const char *uid);
- void (* editor_closed) (EventEditor *ee);
-};
-
-
-GtkType event_editor_get_type (void);
-EventEditor *event_editor_construct (EventEditor *ee);
-
-EventEditor *event_editor_new (void);
-
-void event_editor_set_ical_object (EventEditor *ee, CalComponent *comp);
-
-void event_editor_focus (EventEditor *ee);
-
-#if 0
-/* Convenience function to create and show a new event editor for an
- * event that goes from day_begin to day_end of the specified day.
- */
-void event_editor_new_whole_day (GnomeCalendar *owner, time_t day);
-#endif
-
-GtkWidget *make_date_edit (void);
-GtkWidget *make_date_edit_with_time (void);
-GtkWidget *date_edit_new (time_t the_time, int show_time);
-
-GtkWidget *make_spin_button (int val, int low, int high);
-
-
-
-#endif /* __EVENT_EDITOR_DIALOG_H__ */
diff --git a/calendar/gui/evolution-calendar-control.c b/calendar/gui/evolution-calendar-control.c
deleted file mode 100644
index 7ebe2b5f8e..0000000000
--- a/calendar/gui/evolution-calendar-control.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <config.h>
-#include <gnome.h>
-#include <glade/glade.h>
-#include <bonobo.h>
-#include <bonobo/bonobo-control.h>
-#include <glade/glade.h>
-
-#ifdef USING_OAF
-#include <liboaf/liboaf.h>
-#else
-#include <libgnorba/gnorba.h>
-#endif
-
-#include <cal-util/timeutil.h>
-#include <gui/alarm.h>
-#include <gui/gnome-cal.h>
-#include <gui/calendar-commands.h>
-
-#define PROPERTY_CALENDAR_URI "folder_uri"
-
-#define PROPERTY_CALENDAR_URI_IDX 1
-
-#ifdef USING_OAF
-#define CONTROL_FACTORY_ID "OAFIID:control-factory:calendar:f4f90989-0f50-4af2-ad94-8bbdf331f0bc"
-#else
-#define CONTROL_FACTORY_ID "control-factory:calendar"
-#endif
-
-CORBA_Environment ev;
-CORBA_ORB orb;
-
-
-static void
-control_activate_cb (BonoboControl *control,
- gboolean activate,
- gpointer user_data)
-{
- if (activate)
- calendar_control_activate (control, user_data);
- else
- calendar_control_deactivate (control);
-}
-
-
-
-static void
-init_bonobo (int *argc, char **argv)
-{
-#ifdef USING_OAF
- /* FIXME: VERSION instead of "0.0". */
- gnome_init_with_popt_table ("evolution-calendar", "0.0",
- *argc, argv, oaf_popt_options,
- 0, NULL);
- oaf_init (*argc, argv);
-#else
- gnome_CORBA_init_with_popt_table (
- "evolution-calendar", "0.0",
- argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
-#endif
-
- if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-
- glade_gnome_init ();
-}
-
-
-
-static void
-get_prop (BonoboPropertyBag *bag,
- BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- /*GnomeCalendar *gcal = user_data;*/
-
- switch (arg_id) {
-
- case PROPERTY_CALENDAR_URI_IDX:
- /*
- if (fb && fb->uri)
- BONOBO_ARG_SET_STRING (arg, fb->uri);
- else
- BONOBO_ARG_SET_STRING (arg, "");
- */
- break;
-
- default:
- g_warning ("Unhandled arg %d\n", arg_id);
- }
-}
-
-static void
-set_prop (BonoboPropertyBag *bag,
- const BonoboArg *arg,
- guint arg_id,
- gpointer user_data)
-{
- GnomeCalendar *gcal = user_data;
- char *filename;
-
- switch (arg_id) {
-
- case PROPERTY_CALENDAR_URI_IDX:
- printf ("set_prop: '%s'\n", BONOBO_ARG_GET_STRING (arg));
- filename = g_strdup_printf ("%s/calendar.vcf",
- BONOBO_ARG_GET_STRING (arg));
- calendar_set_uri (gcal, filename);
- g_free (filename);
- break;
-
- default:
- g_warning ("Unhandled arg %d\n", arg_id);
- break;
- }
-}
-
-
-static void
-calendar_properties_init (GnomeCalendar *gcal)
-{
- gcal->properties = bonobo_property_bag_new (get_prop, set_prop, gcal);
-
- bonobo_property_bag_add (gcal->properties,
- PROPERTY_CALENDAR_URI,
- PROPERTY_CALENDAR_URI_IDX,
- BONOBO_ARG_STRING,
- NULL,
- _("The URI that the calendar will display"),
- 0);
-
- bonobo_control_set_property_bag (gcal->control, gcal->properties);
-}
-
-
-
-static BonoboObject *
-calendar_control_factory (BonoboGenericFactory *Factory, void *closure)
-{
- BonoboControl *control;
-
- /* Create the control. */
- GnomeCalendar *cal = new_calendar (full_name, NULL, NULL, 0);
-
- gtk_widget_show (GTK_WIDGET (cal));
-
- control = bonobo_control_new (GTK_WIDGET (cal));
- cal->control = control;
-
- calendar_properties_init (cal);
-
- gtk_signal_connect (GTK_OBJECT (control), "activate",
- control_activate_cb, cal);
-
- return BONOBO_OBJECT (control);
-}
-
-
-static void
-calendar_control_factory_init (void)
-{
- static BonoboGenericFactory *factory = NULL;
-
- if (factory != NULL)
- return;
-
- puts ("XXXXXX - initializing calendar factory!!!");
-
- factory = bonobo_generic_factory_new (CONTROL_FACTORY_ID, calendar_control_factory, NULL);
-
- if (factory == NULL)
- g_error ("I could not register a Calendar control factory.");
-}
-
-
-int
-main (int argc, char **argv)
-{
- init_bonobo (&argc, argv);
- glade_gnome_init ();
- alarm_init ();
- e_cursors_init ();
-
- init_calendar ();
-
- //g_log_set_always_fatal ((GLogLevelFlags) 0xFFFF);
- g_log_set_always_fatal (G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL |
- G_LOG_LEVEL_WARNING);
-
- CORBA_exception_init (&ev);
-
- calendar_control_factory_init ();
- component_factory_init ();
-
- bonobo_main ();
-
- return 0;
-}
diff --git a/calendar/gui/evolution-calendar.gnorba b/calendar/gui/evolution-calendar.gnorba
deleted file mode 100644
index e2f1107926..0000000000
--- a/calendar/gui/evolution-calendar.gnorba
+++ /dev/null
@@ -1,11 +0,0 @@
-[evolution-shell-component-factory:evolution-calendar]
-type=exe
-repo_id=IDL:Bonobo/GenericFactory:1.0
-description=Factory for the Evolution calendar component.
-location_info=evolution-calendar
-
-[evolution-shell-component:evolution-calendar]
-type=factory
-repo_id=IDL:Evolution/ShellComponent:1.0
-description=Evolution component for handling the calendar.
-location_info=evolution-shell-component-factory:evolution-calendar
diff --git a/calendar/gui/evolution-calendar.oafinfo b/calendar/gui/evolution-calendar.oafinfo
deleted file mode 100644
index c8a4907854..0000000000
--- a/calendar/gui/evolution-calendar.oafinfo
+++ /dev/null
@@ -1,29 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921"
- type="exe"
- location="evolution-calendar">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution calendar component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-calendar:2eb9eb63-d305-4918-9c35-faae5db19e51"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-calendar:cba77062-1466-4aac-8ce7-b019eaf2e921">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling the calendar."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/getdate.y b/calendar/gui/getdate.y
deleted file mode 100644
index 6df71bddda..0000000000
--- a/calendar/gui/getdate.y
+++ /dev/null
@@ -1,1001 +0,0 @@
-%{
-/*
-** Originally) written by Steven M. Bellovin <smb@research.att.com> while
-** at the University of North Carolina at Chapel Hill. Later tweaked by
-** a couple of people on Usenet. Completely overhauled by Rich $alz
-** <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990;
-** send any email to Rich.
-**
-** This grammar has 10 shift/reduce conflicts.
-**
-** This code is in the public domain and has no copyright.
-*/
-/* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */
-/* SUPPRESS 288 on yyerrlab *//* Label unused */
-
-#include <config.h>
-#include <gnome.h>
-
-/* Since the code of getdate.y is not included in the Emacs executable
- itself, there is no need to #define static in this file. Even if
- the code were included in the Emacs executable, it probably
- wouldn't do any harm to #undef it here; this will only cause
- problems if we try to write to a static variable, which I don't
- think this code needs to do. */
-#ifdef emacs
-#undef static
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-
-/* The code at the top of get_date which figures out the offset of the
- current time zone checks various CPP symbols to see if special
- tricks are need, but defaults to using the gettimeofday system call.
- Include <sys/time.h> if that will be used. */
-
-#if defined(vms)
-
-#include <types.h>
-#include <time.h>
-
-#else
-
-#include <sys/types.h>
-
-#ifdef TIME_WITH_SYS_TIME
-#include <sys/time.h>
-#include <time.h>
-#else
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#else
-#include <time.h>
-#endif
-#endif
-
-#ifdef timezone
-#undef timezone /* needed for sgi */
-#endif
-
-#if defined(HAVE_SYS_TIMEB_H)
-#include <sys/timeb.h>
-#else
-/*
-** We use the obsolete `struct timeb' as part of our interface!
-** Since the system doesn't have it, we define it here;
-** our callers must do likewise.
-*/
-struct timeb {
- time_t time; /* Seconds since the epoch */
- unsigned short millitm; /* Field not used */
- short timezone; /* Minutes west of GMT */
- short dstflag; /* Field not used */
-};
-#endif /* defined(HAVE_SYS_TIMEB_H) */
-
-#endif /* defined(vms) */
-
-#if defined (STDC_HEADERS) || defined (USG)
-#include <string.h>
-#endif
-
-/* Some old versions of bison generate parsers that use bcopy.
- That loses on systems that don't provide the function, so we have
- to redefine it here. */
-#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy)
-#define bcopy(from, to, len) memcpy ((to), (from), (len))
-#endif
-
-#if defined (STDC_HEADERS)
-#include <stdlib.h>
-#endif
-
-/* NOTES on rebuilding getdate.c (particularly for inclusion in CVS
- releases):
-
- We don't want to mess with all the portability hassles of alloca.
- In particular, most (all?) versions of bison will use alloca in
- their parser. If bison works on your system (e.g. it should work
- with gcc), then go ahead and use it, but the more general solution
- is to use byacc instead of bison, which should generate a portable
- parser. I played with adding "#define alloca dont_use_alloca", to
- give an error if the parser generator uses alloca (and thus detect
- unportable getdate.c's), but that seems to cause as many problems
- as it solves. */
-
-extern struct tm *gmtime();
-extern struct tm *localtime();
-
-#define yyparse getdate_yyparse
-#define yylex getdate_yylex
-#define yyerror getdate_yyerror
-
-static int yylex ();
-static int yyerror ();
-
-#define EPOCH 1970
-#define HOUR(x) ((time_t)(x) * 60)
-#define SECSPERDAY (24L * 60L * 60L)
-
-
-/*
-** An entry in the lexical lookup table.
-*/
-typedef struct _TABLE {
- char *name;
- int type;
- time_t value;
-} TABLE;
-
-
-/*
-** Daylight-savings mode: on, off, or not yet known.
-*/
-typedef enum _DSTMODE {
- DSTon, DSToff, DSTmaybe
-} DSTMODE;
-
-/*
-** Meridian: am, pm, or 24-hour style.
-*/
-typedef enum _MERIDIAN {
- MERam, MERpm, MER24
-} MERIDIAN;
-
-
-/*
-** Global variables. We could get rid of most of these by using a good
-** union as the yacc stack. (This routine was originally written before
-** yacc had the %union construct.) Maybe someday; right now we only use
-** the %union very rarely.
-*/
-static char *yyInput;
-static DSTMODE yyDSTmode;
-static time_t yyDayOrdinal;
-static time_t yyDayNumber;
-static int yyHaveDate;
-static int yyHaveDay;
-static int yyHaveRel;
-static int yyHaveTime;
-static int yyHaveZone;
-static time_t yyTimezone;
-static time_t yyDay;
-static time_t yyHour;
-static time_t yyMinutes;
-static time_t yyMonth;
-static time_t yySeconds;
-static time_t yyYear;
-static MERIDIAN yyMeridian;
-static time_t yyRelMonth;
-static time_t yyRelSeconds;
-
-%}
-
-%union {
- time_t Number;
- enum _MERIDIAN Meridian;
-}
-
-%token tAGO tDAY tDAYZONE tID tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT
-%token tSEC_UNIT tSNUMBER tUNUMBER tZONE tDST
-
-%type <Number> tDAY tDAYZONE tMINUTE_UNIT tMONTH tMONTH_UNIT
-%type <Number> tSEC_UNIT tSNUMBER tUNUMBER tZONE
-%type <Meridian> tMERIDIAN o_merid
-
-%%
-
-spec : /* NULL */
- | spec item
- ;
-
-item : time {
- yyHaveTime++;
- }
- | zone {
- yyHaveZone++;
- }
- | date {
- yyHaveDate++;
- }
- | day {
- yyHaveDay++;
- }
- | rel {
- yyHaveRel++;
- }
- | number
- ;
-
-time : tUNUMBER tMERIDIAN {
- yyHour = $1;
- yyMinutes = 0;
- yySeconds = 0;
- yyMeridian = $2;
- }
- | tUNUMBER ':' tUNUMBER o_merid {
- yyHour = $1;
- yyMinutes = $3;
- yySeconds = 0;
- yyMeridian = $4;
- }
- | tUNUMBER ':' tUNUMBER tSNUMBER {
- yyHour = $1;
- yyMinutes = $3;
- yyMeridian = MER24;
- yyDSTmode = DSToff;
- yyTimezone = - ($4 % 100 + ($4 / 100) * 60);
- }
- | tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid {
- yyHour = $1;
- yyMinutes = $3;
- yySeconds = $5;
- yyMeridian = $6;
- }
- | tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER {
- yyHour = $1;
- yyMinutes = $3;
- yySeconds = $5;
- yyMeridian = MER24;
- yyDSTmode = DSToff;
- yyTimezone = - ($6 % 100 + ($6 / 100) * 60);
- }
- ;
-
-zone : tZONE {
- yyTimezone = $1;
- yyDSTmode = DSToff;
- }
- | tDAYZONE {
- yyTimezone = $1;
- yyDSTmode = DSTon;
- }
- |
- tZONE tDST {
- yyTimezone = $1;
- yyDSTmode = DSTon;
- }
- ;
-
-day : tDAY {
- yyDayOrdinal = 1;
- yyDayNumber = $1;
- }
- | tDAY ',' {
- yyDayOrdinal = 1;
- yyDayNumber = $1;
- }
- | tUNUMBER tDAY {
- yyDayOrdinal = $1;
- yyDayNumber = $2;
- }
- ;
-
-date : tUNUMBER '/' tUNUMBER {
- yyMonth = $1;
- yyDay = $3;
- }
- | tUNUMBER '/' tUNUMBER '/' tUNUMBER {
- yyMonth = $1;
- yyDay = $3;
- yyYear = $5;
- }
- | tUNUMBER tSNUMBER tSNUMBER {
- /* ISO 8601 format. yyyy-mm-dd. */
- yyYear = $1;
- yyMonth = -$2;
- yyDay = -$3;
- }
- | tUNUMBER tMONTH tSNUMBER {
- /* e.g. 17-JUN-1992. */
- yyDay = $1;
- yyMonth = $2;
- yyYear = -$3;
- }
- | tMONTH tUNUMBER {
- yyMonth = $1;
- yyDay = $2;
- }
- | tMONTH tUNUMBER ',' tUNUMBER {
- yyMonth = $1;
- yyDay = $2;
- yyYear = $4;
- }
- | tUNUMBER tMONTH {
- yyMonth = $2;
- yyDay = $1;
- }
- | tUNUMBER tMONTH tUNUMBER {
- yyMonth = $2;
- yyDay = $1;
- yyYear = $3;
- }
- ;
-
-rel : relunit tAGO {
- yyRelSeconds = -yyRelSeconds;
- yyRelMonth = -yyRelMonth;
- }
- | relunit
- ;
-
-relunit : tUNUMBER tMINUTE_UNIT {
- yyRelSeconds += $1 * $2 * 60L;
- }
- | tSNUMBER tMINUTE_UNIT {
- yyRelSeconds += $1 * $2 * 60L;
- }
- | tMINUTE_UNIT {
- yyRelSeconds += $1 * 60L;
- }
- | tSNUMBER tSEC_UNIT {
- yyRelSeconds += $1;
- }
- | tUNUMBER tSEC_UNIT {
- yyRelSeconds += $1;
- }
- | tSEC_UNIT {
- yyRelSeconds++;
- }
- | tSNUMBER tMONTH_UNIT {
- yyRelMonth += $1 * $2;
- }
- | tUNUMBER tMONTH_UNIT {
- yyRelMonth += $1 * $2;
- }
- | tMONTH_UNIT {
- yyRelMonth += $1;
- }
- ;
-
-number : tUNUMBER {
- if (yyHaveTime && yyHaveDate && !yyHaveRel)
- yyYear = $1;
- else {
- if($1>10000) {
- yyHaveDate++;
- yyDay= ($1)%100;
- yyMonth= ($1/100)%100;
- yyYear = $1/10000;
- }
- else {
- yyHaveTime++;
- if ($1 < 100) {
- yyHour = $1;
- yyMinutes = 0;
- }
- else {
- yyHour = $1 / 100;
- yyMinutes = $1 % 100;
- }
- yySeconds = 0;
- yyMeridian = MER24;
- }
- }
- }
- ;
-
-o_merid : /* NULL */ {
- $$ = MER24;
- }
- | tMERIDIAN {
- $$ = $1;
- }
- ;
-
-%%
-
-/* Month and day table. */
-static TABLE const MonthDayTable[] = {
- { N_("january"), tMONTH, 1 },
- { N_("february"), tMONTH, 2 },
- { N_("march"), tMONTH, 3 },
- { N_("april"), tMONTH, 4 },
- { N_("may"), tMONTH, 5 },
- { N_("june"), tMONTH, 6 },
- { N_("july"), tMONTH, 7 },
- { N_("august"), tMONTH, 8 },
- { N_("september"), tMONTH, 9 },
- { N_("sept"), tMONTH, 9 },
- { N_("october"), tMONTH, 10 },
- { N_("november"), tMONTH, 11 },
- { N_("december"), tMONTH, 12 },
- { N_("sunday"), tDAY, 0 },
- { N_("monday"), tDAY, 1 },
- { N_("tuesday"), tDAY, 2 },
- { N_("tues"), tDAY, 2 },
- { N_("wednesday"), tDAY, 3 },
- { N_("wednes"), tDAY, 3 },
- { N_("thursday"), tDAY, 4 },
- { N_("thur"), tDAY, 4 },
- { N_("thurs"), tDAY, 4 },
- { N_("friday"), tDAY, 5 },
- { N_("saturday"), tDAY, 6 },
- { NULL }
-};
-
-/* Time units table. */
-static TABLE const UnitsTable[] = {
- { N_("year"), tMONTH_UNIT, 12 },
- { N_("month"), tMONTH_UNIT, 1 },
- { N_("fortnight"), tMINUTE_UNIT, 14 * 24 * 60 },
- { N_("week"), tMINUTE_UNIT, 7 * 24 * 60 },
- { N_("day"), tMINUTE_UNIT, 1 * 24 * 60 },
- { N_("hour"), tMINUTE_UNIT, 60 },
- { N_("minute"), tMINUTE_UNIT, 1 },
- { N_("min"), tMINUTE_UNIT, 1 },
- { N_("second"), tSEC_UNIT, 1 },
- { N_("sec"), tSEC_UNIT, 1 },
- { NULL }
-};
-
-/* Assorted relative-time words. */
-static TABLE const OtherTable[] = {
- { N_("tomorrow"), tMINUTE_UNIT, 1 * 24 * 60 },
- { N_("yesterday"), tMINUTE_UNIT, -1 * 24 * 60 },
- { N_("today"), tMINUTE_UNIT, 0 },
- { N_("now"), tMINUTE_UNIT, 0 },
- { N_("last"), tUNUMBER, -1 },
- { N_("this"), tMINUTE_UNIT, 0 },
- { N_("next"), tUNUMBER, 2 },
- { N_("first"), tUNUMBER, 1 },
-/* { N_("second"), tUNUMBER, 2 }, */
- { N_("third"), tUNUMBER, 3 },
- { N_("fourth"), tUNUMBER, 4 },
- { N_("fifth"), tUNUMBER, 5 },
- { N_("sixth"), tUNUMBER, 6 },
- { N_("seventh"), tUNUMBER, 7 },
- { N_("eighth"), tUNUMBER, 8 },
- { N_("ninth"), tUNUMBER, 9 },
- { N_("tenth"), tUNUMBER, 10 },
- { N_("eleventh"), tUNUMBER, 11 },
- { N_("twelfth"), tUNUMBER, 12 },
- { N_("ago"), tAGO, 1 },
- { NULL }
-};
-
-/* The timezone table. */
-/* Some of these are commented out because a time_t can't store a float. */
-static TABLE const TimezoneTable[] = {
- { "gmt", tZONE, HOUR( 0) }, /* Greenwich Mean */
- { "ut", tZONE, HOUR( 0) }, /* Universal (Coordinated) */
- { "utc", tZONE, HOUR( 0) },
- { "wet", tZONE, HOUR( 0) }, /* Western European */
- { "bst", tDAYZONE, HOUR( 0) }, /* British Summer */
- { "wat", tZONE, HOUR( 1) }, /* West Africa */
- { "at", tZONE, HOUR( 2) }, /* Azores */
-#if 0
- /* For completeness. BST is also British Summer, and GST is
- * also Guam Standard. */
- { "bst", tZONE, HOUR( 3) }, /* Brazil Standard */
- { "gst", tZONE, HOUR( 3) }, /* Greenland Standard */
-#endif
-#if 0
- { "nft", tZONE, HOUR(3.5) }, /* Newfoundland */
- { "nst", tZONE, HOUR(3.5) }, /* Newfoundland Standard */
- { "ndt", tDAYZONE, HOUR(3.5) }, /* Newfoundland Daylight */
-#endif
- { "ast", tZONE, HOUR( 4) }, /* Atlantic Standard */
- { "adt", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */
- { "est", tZONE, HOUR( 5) }, /* Eastern Standard */
- { "edt", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */
- { "cst", tZONE, HOUR( 6) }, /* Central Standard */
- { "cdt", tDAYZONE, HOUR( 6) }, /* Central Daylight */
- { "mst", tZONE, HOUR( 7) }, /* Mountain Standard */
- { "mdt", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */
- { "pst", tZONE, HOUR( 8) }, /* Pacific Standard */
- { "pdt", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */
- { "yst", tZONE, HOUR( 9) }, /* Yukon Standard */
- { "ydt", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */
- { "hst", tZONE, HOUR(10) }, /* Hawaii Standard */
- { "hdt", tDAYZONE, HOUR(10) }, /* Hawaii Daylight */
- { "cat", tZONE, HOUR(10) }, /* Central Alaska */
- { "ahst", tZONE, HOUR(10) }, /* Alaska-Hawaii Standard */
- { "nt", tZONE, HOUR(11) }, /* Nome */
- { "idlw", tZONE, HOUR(12) }, /* International Date Line West */
- { "cet", tZONE, -HOUR(1) }, /* Central European */
- { "met", tZONE, -HOUR(1) }, /* Middle European */
- { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */
- { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
- { "swt", tZONE, -HOUR(1) }, /* Swedish Winter */
- { "sst", tDAYZONE, -HOUR(1) }, /* Swedish Summer */
- { "fwt", tZONE, -HOUR(1) }, /* French Winter */
- { "fst", tDAYZONE, -HOUR(1) }, /* French Summer */
- { "eet", tZONE, -HOUR(2) }, /* Eastern Europe, USSR Zone 1 */
- { "bt", tZONE, -HOUR(3) }, /* Baghdad, USSR Zone 2 */
-#if 0
- { "it", tZONE, -HOUR(3.5) },/* Iran */
-#endif
- { "zp4", tZONE, -HOUR(4) }, /* USSR Zone 3 */
- { "zp5", tZONE, -HOUR(5) }, /* USSR Zone 4 */
-#if 0
- { "ist", tZONE, -HOUR(5.5) },/* Indian Standard */
-#endif
- { "zp6", tZONE, -HOUR(6) }, /* USSR Zone 5 */
-#if 0
- /* For completeness. NST is also Newfoundland Stanard, and SST is
- * also Swedish Summer. */
- { "nst", tZONE, -HOUR(6.5) },/* North Sumatra */
- { "sst", tZONE, -HOUR(7) }, /* South Sumatra, USSR Zone 6 */
-#endif /* 0 */
- { "wast", tZONE, -HOUR(7) }, /* West Australian Standard */
- { "wadt", tDAYZONE, -HOUR(7) }, /* West Australian Daylight */
-#if 0
- { "jt", tZONE, -HOUR(7.5) },/* Java (3pm in Cronusland!) */
-#endif
- { "cct", tZONE, -HOUR(8) }, /* China Coast, USSR Zone 7 */
- { "jst", tZONE, -HOUR(9) }, /* Japan Standard, USSR Zone 8 */
-#if 0
- { "cast", tZONE, -HOUR(9.5) },/* Central Australian Standard */
- { "cadt", tDAYZONE, -HOUR(9.5) },/* Central Australian Daylight */
-#endif
- { "east", tZONE, -HOUR(10) }, /* Eastern Australian Standard */
- { "eadt", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */
- { "gst", tZONE, -HOUR(10) }, /* Guam Standard, USSR Zone 9 */
- { "nzt", tZONE, -HOUR(12) }, /* New Zealand */
- { "nzst", tZONE, -HOUR(12) }, /* New Zealand Standard */
- { "nzdt", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */
- { "idle", tZONE, -HOUR(12) }, /* International Date Line East */
- { NULL }
-};
-
-/* Military timezone table. */
-static TABLE const MilitaryTable[] = {
- { "a", tZONE, HOUR( 1) },
- { "b", tZONE, HOUR( 2) },
- { "c", tZONE, HOUR( 3) },
- { "d", tZONE, HOUR( 4) },
- { "e", tZONE, HOUR( 5) },
- { "f", tZONE, HOUR( 6) },
- { "g", tZONE, HOUR( 7) },
- { "h", tZONE, HOUR( 8) },
- { "i", tZONE, HOUR( 9) },
- { "k", tZONE, HOUR( 10) },
- { "l", tZONE, HOUR( 11) },
- { "m", tZONE, HOUR( 12) },
- { "n", tZONE, HOUR(- 1) },
- { "o", tZONE, HOUR(- 2) },
- { "p", tZONE, HOUR(- 3) },
- { "q", tZONE, HOUR(- 4) },
- { "r", tZONE, HOUR(- 5) },
- { "s", tZONE, HOUR(- 6) },
- { "t", tZONE, HOUR(- 7) },
- { "u", tZONE, HOUR(- 8) },
- { "v", tZONE, HOUR(- 9) },
- { "w", tZONE, HOUR(-10) },
- { "x", tZONE, HOUR(-11) },
- { "y", tZONE, HOUR(-12) },
- { "z", tZONE, HOUR( 0) },
- { NULL }
-};
-
-
-
-
-/* ARGSUSED */
-static int
-yyerror(s)
- char *s;
-{
- return 0;
-}
-
-
-static time_t
-ToSeconds(Hours, Minutes, Seconds, Meridian)
- time_t Hours;
- time_t Minutes;
- time_t Seconds;
- MERIDIAN Meridian;
-{
- if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59)
- return -1;
- switch (Meridian) {
- case MER24:
- if (Hours < 0 || Hours > 23)
- return -1;
- return (Hours * 60L + Minutes) * 60L + Seconds;
- case MERam:
- if (Hours < 1 || Hours > 12)
- return -1;
- return (Hours * 60L + Minutes) * 60L + Seconds;
- case MERpm:
- if (Hours < 1 || Hours > 12)
- return -1;
- return ((Hours + 12) * 60L + Minutes) * 60L + Seconds;
- default:
- abort ();
- }
- /* NOTREACHED */
-}
-
-
-static time_t
-Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode)
- time_t Month;
- time_t Day;
- time_t Year;
- time_t Hours;
- time_t Minutes;
- time_t Seconds;
- MERIDIAN Meridian;
- DSTMODE DSTmode;
-{
- static int DaysInMonth[12] = {
- 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
- };
- time_t tod;
- time_t Julian;
- int i;
-
- if (Year < 0)
- Year = -Year;
- if (Year < 100)
- Year += 1900;
- DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
- ? 29 : 28;
- if (Year < EPOCH || Year > 1999
- || Month < 1 || Month > 12
- /* Lint fluff: "conversion from long may lose accuracy" */
- || Day < 1 || Day > DaysInMonth[(int)--Month])
- return -1;
-
- for (Julian = Day - 1, i = 0; i < Month; i++)
- Julian += DaysInMonth[i];
- for (i = EPOCH; i < Year; i++)
- Julian += 365 + (i % 4 == 0);
- Julian *= SECSPERDAY;
- Julian += yyTimezone * 60L;
- if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0)
- return -1;
- Julian += tod;
- if (DSTmode == DSTon
- || (DSTmode == DSTmaybe && localtime(&Julian)->tm_isdst))
- Julian -= 60 * 60;
- return Julian;
-}
-
-
-static time_t
-DSTcorrect(Start, Future)
- time_t Start;
- time_t Future;
-{
- time_t StartDay;
- time_t FutureDay;
-
- StartDay = (localtime(&Start)->tm_hour + 1) % 24;
- FutureDay = (localtime(&Future)->tm_hour + 1) % 24;
- return (Future - Start) + (StartDay - FutureDay) * 60L * 60L;
-}
-
-
-static time_t
-RelativeDate(Start, DayOrdinal, DayNumber)
- time_t Start;
- time_t DayOrdinal;
- time_t DayNumber;
-{
- struct tm *tm;
- time_t now;
-
- now = Start;
- tm = localtime(&now);
- now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7);
- now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1);
- return DSTcorrect(Start, now);
-}
-
-
-static time_t
-RelativeMonth(Start, RelMonth)
- time_t Start;
- time_t RelMonth;
-{
- struct tm *tm;
- time_t Month;
- time_t Year;
-
- if (RelMonth == 0)
- return 0;
- tm = localtime(&Start);
- Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
- Year = Month / 12;
- Month = Month % 12 + 1;
- return DSTcorrect(Start,
- Convert(Month, (time_t)tm->tm_mday, Year,
- (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec,
- MER24, DSTmaybe));
-}
-
-
-static int
-LookupWord(buff)
- char *buff;
-{
- register char *p;
- register char *q;
- register const TABLE *tp;
- int i;
- int abbrev;
-
- /* Make it lowercase. */
- for (p = buff; *p; p++)
- if (isupper(*p))
- *p = tolower(*p);
-
- if (strcmp(buff, "am") == 0 || strcmp(buff, "a.m.") == 0) {
- yylval.Meridian = MERam;
- return tMERIDIAN;
- }
- if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) {
- yylval.Meridian = MERpm;
- return tMERIDIAN;
- }
-
- /* See if we have an abbreviation for a month. */
- if (strlen(buff) == 3)
- abbrev = 1;
- else if (strlen(buff) == 4 && buff[3] == '.') {
- abbrev = 1;
- buff[3] = '\0';
- }
- else
- abbrev = 0;
-
- for (tp = MonthDayTable; tp->name; tp++) {
- if (abbrev) {
- if (strncmp(buff, tp->name, 3) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- }
- else if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- }
-
- for (tp = TimezoneTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- if (strcmp(buff, "dst") == 0)
- return tDST;
-
- for (tp = UnitsTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- /* Strip off any plural and try the units table again. */
- i = strlen(buff) - 1;
- if (buff[i] == 's') {
- buff[i] = '\0';
- for (tp = UnitsTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- buff[i] = 's'; /* Put back for "this" in OtherTable. */
- }
-
- for (tp = OtherTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- /* Military timezones. */
- if (buff[1] == '\0' && isalpha(*buff)) {
- for (tp = MilitaryTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- }
-
- /* Drop out any periods and try the timezone table again. */
- for (i = 0, p = q = buff; *q; q++)
- if (*q != '.')
- *p++ = *q;
- else
- i++;
- *p = '\0';
- if (i)
- for (tp = TimezoneTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- return tID;
-}
-
-
-static int
-yylex()
-{
- register char c;
- register char *p;
- char buff[20];
- int Count;
- int sign;
-
- for ( ; ; ) {
- while (isspace(*yyInput))
- yyInput++;
-
- if (isdigit(c = *yyInput) || c == '-' || c == '+') {
- if (c == '-' || c == '+') {
- sign = c == '-' ? -1 : 1;
- if (!isdigit(*++yyInput))
- /* skip the '-' sign */
- continue;
- }
- else
- sign = 0;
- for (yylval.Number = 0; isdigit(c = *yyInput++); )
- yylval.Number = 10 * yylval.Number + c - '0';
- yyInput--;
- if (sign < 0)
- yylval.Number = -yylval.Number;
- return sign ? tSNUMBER : tUNUMBER;
- }
- if (isalpha(c)) {
- for (p = buff; isalpha(c = *yyInput++) || c == '.'; )
- if (p < &buff[sizeof buff - 1])
- *p++ = c;
- *p = '\0';
- yyInput--;
- return LookupWord(buff);
- }
- if (c != '(')
- return *yyInput++;
- Count = 0;
- do {
- c = *yyInput++;
- if (c == '\0')
- return c;
- if (c == '(')
- Count++;
- else if (c == ')')
- Count--;
- } while (Count > 0);
- }
-}
-
-#define TM_YEAR_ORIGIN 1900
-
-/* Yield A - B, measured in seconds. */
-static long
-difftm (a, b)
- struct tm *a, *b;
-{
- int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
- int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
- int days = (
- /* difference in day of year */
- a->tm_yday - b->tm_yday
- /* + intervening leap days */
- + ((ay >> 2) - (by >> 2))
- - (ay/100 - by/100)
- + ((ay/100 >> 2) - (by/100 >> 2))
- /* + difference in years * 365 */
- + (long)(ay-by) * 365
- );
- return (60*(60*(24*days + (a->tm_hour - b->tm_hour))
- + (a->tm_min - b->tm_min))
- + (a->tm_sec - b->tm_sec));
-}
-
-time_t
-get_date(p, now)
- char *p;
- struct timeb *now;
-{
- struct tm *tm, gmt;
- struct timeb ftz;
- time_t Start;
- time_t tod;
- time_t nowtime;
-
- yyInput = p;
- if (now == NULL) {
- now = &ftz;
- (void)time (&nowtime);
-
- if (! (tm = gmtime (&nowtime)))
- return -1;
- gmt = *tm; /* Make a copy, in case localtime modifies *tm. */
-
- if (! (tm = localtime (&nowtime)))
- return -1;
-
- ftz.timezone = difftm (&gmt, tm) / 60;
- if(tm->tm_isdst)
- ftz.timezone += 60;
- }
- else
- {
- nowtime = now->time;
- }
-
- tm = localtime(&nowtime);
- yyYear = tm->tm_year;
- yyMonth = tm->tm_mon + 1;
- yyDay = tm->tm_mday;
- yyTimezone = now->timezone;
- yyDSTmode = DSTmaybe;
- yyHour = 0;
- yyMinutes = 0;
- yySeconds = 0;
- yyMeridian = MER24;
- yyRelSeconds = 0;
- yyRelMonth = 0;
- yyHaveDate = 0;
- yyHaveDay = 0;
- yyHaveRel = 0;
- yyHaveTime = 0;
- yyHaveZone = 0;
-
- if (yyparse()
- || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)
- return -1;
-
- if (yyHaveDate || yyHaveTime || yyHaveDay) {
- Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
- yyMeridian, yyDSTmode);
- if (Start < 0)
- return -1;
- }
- else {
- Start = nowtime;
- if (!yyHaveRel)
- Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec;
- }
-
- Start += yyRelSeconds;
- Start += RelativeMonth(Start, yyRelMonth);
-
- if (yyHaveDay && !yyHaveDate) {
- tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber);
- Start += tod;
- }
-
- /* Have to do *something* with a legitimate -1 so it's distinguishable
- * from the error return value. (Alternately could set errno on error.) */
- return Start == -1 ? 0 : Start;
-}
-
-
-#if defined(TEST)
-
-/* ARGSUSED */
-int
-main(ac, av)
- int ac;
- char *av[];
-{
- char buff[128];
- time_t d;
-
- (void)printf("Enter date, or blank line to exit.\n\t> ");
- (void)fflush(stdout);
- while (gets(buff) && buff[0]) {
- d = get_date(buff, (struct timeb *)NULL);
- if (d == -1)
- (void)printf("Bad format - couldn't convert.\n");
- else
- (void)printf("%s", ctime(&d));
- (void)printf("\t> ");
- (void)fflush(stdout);
- }
- exit(0);
- /* NOTREACHED */
-}
-#endif /* defined(TEST) */
diff --git a/calendar/gui/gncal-todo.c b/calendar/gui/gncal-todo.c
deleted file mode 100644
index a79d39363c..0000000000
--- a/calendar/gui/gncal-todo.c
+++ /dev/null
@@ -1,960 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* To-do widget for gncal
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <quartic@gimp.org>
- */
-
-#include <config.h>
-#include <string.h>
-#include <gnome.h>
-#include <cal-client/cal-client.h>
-#include <cal-util/timeutil.h>
-#include "event-editor.h"
-#include "gncal-todo.h"
-#include "calendar-commands.h"
-#include "popup-menu.h"
-
-int todo_show_due_date = 0;
-int todo_show_priority = 0;
-int todo_show_time_remaining = 0;
-
-int todo_item_dstatus_highlight_overdue = 0;
-int todo_item_dstatus_highlight_due_today = 0;
-int todo_item_dstatus_highlight_not_due_yet = 0;
-
-
-char *todo_overdue_font_text;
-gint todo_current_sort_column = 0;
-gint todo_current_sort_type = GTK_SORT_ASCENDING;
-
-gboolean todo_style_changed =0;
-gboolean todo_list_autoresize = 1;
-gboolean todo_list_redraw_in_progess = 0;
-static void gncal_todo_init (GncalTodo *todo);
-
-
-guint
-gncal_todo_get_type (void)
-{
- static guint todo_type = 0;
-
- if (!todo_type) {
- GtkTypeInfo todo_info = {
- "GncalTodo",
- sizeof (GncalTodo),
- sizeof (GncalTodoClass),
- (GtkClassInitFunc) NULL,
- (GtkObjectInitFunc) gncal_todo_init,
- (GtkArgSetFunc) NULL,
- (GtkArgGetFunc) NULL
- };
-
- todo_type = gtk_type_unique (gtk_vbox_get_type (), &todo_info);
- }
-
- return todo_type;
-}
-
-static void
-ok_button (GtkWidget *widget, GnomeDialog *dialog)
-{
- CalComponent *comp;
- CalClient *cal_client;
- GnomeDateEdit *due_date;
- GtkEditable *entry;
- GtkSpinButton *priority;
- GtkText *comment;
- CalComponentText *text = g_new0 (CalComponentText, 1);
- CalComponentDateTime date;
- GSList *l;
- gchar *t;
- time_t d;
- int p;
-
- comp = gtk_object_get_user_data (GTK_OBJECT (dialog));
-
- cal_client = (CalClient*) (gtk_object_get_data (GTK_OBJECT (dialog), "cal_client"));
-
- /* Due date */
- due_date = GNOME_DATE_EDIT (gtk_object_get_data(GTK_OBJECT(dialog), "due_date"));
- d = gnome_date_edit_get_date (due_date);
- date.value = g_new0 (struct icaltimetype, 1);
- *date.value = icaltimetype_from_timet (d, 1);
- cal_component_set_dtend (comp, &date);
-
- /* Summary */
- entry = GTK_EDITABLE (gtk_object_get_data (GTK_OBJECT (dialog), "summary_entry"));
- t = gtk_editable_get_chars (entry, 0, -1);
- text->value = t;
- cal_component_set_summary (comp, text);
- g_free (t);
-
- /* Priority */
- priority = GTK_SPIN_BUTTON (gtk_object_get_data(GTK_OBJECT(dialog), "priority"));
- p = gtk_spin_button_get_value_as_int (priority);
- cal_component_set_priority (comp, &p);
-
- /* Comment */
- cal_component_get_comment_list (comp, &l);
- comment = GTK_TEXT(gtk_object_get_data (GTK_OBJECT(dialog), "comment"));
- t = gtk_editable_get_chars (entry, 0, -1);
- text->value = t;
- g_slist_append (l, text);
- cal_component_set_comment_list (comp, l);
- cal_component_free_text_list (l);
-
- if (!cal_client_update_object (cal_client, comp))
- g_message ("ok_button(): Could not update the object!");
-
- gtk_object_unref (GTK_OBJECT (comp));
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
-}
-
-static void
-cancel_button (GtkWidget *widget, GnomeDialog *dialog)
-{
- CalComponent *comp;
-
- comp = gtk_object_get_user_data (GTK_OBJECT (dialog));
-
- gtk_object_unref (GTK_OBJECT (comp));
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
-}
-
-static gint
-delete_event (GtkWidget *widget, GdkEvent *event, GnomeDialog *dialog)
-{
- cancel_button (NULL, dialog);
- return TRUE;
-}
-
-/* I've hacked this so we can use it separate from the rest of GncalTodo.
- This whole file will go once we've got the new editor working. */
-void
-gncal_todo_edit (CalClient *client, CalComponent *comp)
-{
- GtkWidget *dialog;
- GtkWidget *hbox;
- GtkWidget *due_box;
- GtkWidget *due_label;
- GtkWidget *due_entry;
- GtkWidget *comment_box;
- GtkWidget *comment_label;
- GtkWidget *comment_text;
- GtkWidget *comment_internal_box;
- GtkWidget *comment_sep;
- GtkWidget *w;
- GtkWidget *pri_box;
- GtkWidget *pri_label;
- GtkWidget *pri_spin;
- GtkObject *pri_adj;
- GtkWidget *entry;
- gboolean new;
- CalComponentText text;
- CalComponentDateTime date;
- GSList *l;
- time_t d;
- gint *p;
-
- new = (CAL_COMPONENT_NO_TYPE == cal_component_get_vtype (comp));
- if (new)
- cal_component_set_new_vtype (comp, CAL_COMPONENT_TODO);
-
- dialog = gnome_dialog_new (new ? _("Create to-do item") : _("Edit to-do item"),
- GNOME_STOCK_BUTTON_OK,
- GNOME_STOCK_BUTTON_CANCEL,
- NULL);
-#if 0
- gnome_dialog_set_parent (GNOME_DIALOG (dialog),
- GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (todo->calendar))));
-#endif
- hbox = gtk_hbox_new (FALSE, 4);
- gtk_container_border_width (GTK_CONTAINER (hbox), 4);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox),
- hbox, FALSE, FALSE, 0);
- gtk_widget_show (hbox);
-
-
- due_box = gtk_hbox_new (FALSE, 4);
- gtk_container_border_width (GTK_CONTAINER (due_box), 4);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), due_box, FALSE, FALSE, 0);
- gtk_widget_show (due_box);
-
- pri_box = gtk_hbox_new (FALSE, 4);
- gtk_container_border_width (GTK_CONTAINER (pri_box), 4);
- gtk_box_pack_start(GTK_BOX (GNOME_DIALOG (dialog)->vbox), pri_box, FALSE, FALSE, 0);
- gtk_widget_show (pri_box);
-
- comment_box = gtk_hbox_new (FALSE, 4);
- gtk_container_border_width (GTK_CONTAINER (comment_box), 4);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), comment_box, FALSE, FALSE, 0);
- gtk_widget_show (comment_box);
-
- comment_internal_box = gtk_vbox_new(FALSE,2);
- gtk_container_border_width (GTK_CONTAINER (comment_internal_box), 4);
-
- gtk_box_pack_start (GTK_BOX (comment_box), comment_internal_box, TRUE, TRUE, 0);
- gtk_widget_show (comment_internal_box);
-
- w = gtk_label_new (_("Summary:"));
- gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- entry = gtk_entry_new ();
- cal_component_get_summary (comp, &text);
- gtk_entry_set_text (GTK_ENTRY (entry), text.value);
- gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
- gtk_widget_show (entry);
-
-
- due_label = gtk_label_new (_("Due Date:"));
- gtk_box_pack_start (GTK_BOX (due_box), due_label, FALSE, FALSE, 0);
- gtk_widget_show (due_label);
-
- due_entry = gtk_entry_new ();
- cal_component_get_dtend (comp, &date);
- d = time_from_icaltimetype (*date.value);
- due_entry = date_edit_new (d, TRUE);
- gtk_box_pack_start (GTK_BOX (due_box), due_entry, TRUE, TRUE, 0);
- gtk_widget_show (due_entry);
-
- pri_label = gtk_label_new (_("Priority:"));
- gtk_box_pack_start (GTK_BOX (pri_box), pri_label, FALSE, FALSE, 0);
- gtk_widget_show (pri_label);
-
- pri_adj = gtk_adjustment_new (5.0, 1.0, 9.0, 1.0, 3.0, 0.0);
- pri_spin = gtk_spin_button_new (GTK_ADJUSTMENT(pri_adj), 0.0, 0);
- gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (pri_spin), TRUE);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (pri_spin), FALSE);
- gtk_spin_button_set_snap_to_ticks (GTK_SPIN_BUTTON (pri_spin), FALSE);
- cal_component_get_priority (comp, &p);
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (pri_spin), (gfloat) *p);
- gtk_box_pack_start (GTK_BOX (pri_box), pri_spin, FALSE, FALSE, 0);
- gtk_widget_show (pri_spin);
-
- comment_sep = gtk_hseparator_new ();
- gtk_box_pack_start (GTK_BOX (comment_box), comment_sep, FALSE, FALSE, 0);
- gtk_widget_show(comment_sep);
-
- comment_label = gtk_label_new (_("Item Comments:"));
- gtk_label_set_justify(GTK_LABEL(comment_label), GTK_JUSTIFY_LEFT);
- gtk_box_pack_start (GTK_BOX (comment_internal_box), comment_label, TRUE, TRUE, 0);
- gtk_widget_show (comment_label);
-
- comment_text = gtk_text_new (NULL, NULL);
- gtk_text_set_editable (GTK_TEXT (comment_text), TRUE);
- gtk_text_set_word_wrap( GTK_TEXT(comment_text), TRUE);
- gtk_text_freeze(GTK_TEXT(comment_text));
-#warning "FIX ME"
- /* Need to handle multiple comments */
- cal_component_get_comment_list (comp, &l);
- if (l) {
- CalComponentText text = *(CalComponentText*)l->data;
-
- gtk_text_insert(GTK_TEXT(comment_text), NULL, NULL, NULL,
- text.value, strlen(text.value));
- }
- cal_component_free_text_list (l);
- gtk_text_thaw(GTK_TEXT(comment_text));
- gtk_box_pack_start (GTK_BOX (comment_internal_box), comment_text, FALSE, TRUE, 0);
- gtk_widget_show (comment_text);
-
- gtk_object_set_user_data (GTK_OBJECT (dialog), comp);
- gtk_object_ref (GTK_OBJECT (comp));
-
- gtk_object_set_data (GTK_OBJECT (dialog), "cal_client", client);
- gtk_object_set_data (GTK_OBJECT (dialog), "summary_entry", entry);
- gtk_object_set_data (GTK_OBJECT (dialog), "due_date", due_entry);
- gtk_object_set_data (GTK_OBJECT (dialog), "priority", pri_spin);
- gtk_object_set_data (GTK_OBJECT (dialog), "comment", comment_text);
-
- gnome_dialog_button_connect (GNOME_DIALOG (dialog), 0, (GtkSignalFunc) ok_button, dialog);
- gnome_dialog_button_connect (GNOME_DIALOG (dialog), 1, (GtkSignalFunc) cancel_button, dialog);
-
- gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
- (GtkSignalFunc) delete_event,
- dialog);
-
- gnome_dialog_set_default (GNOME_DIALOG (dialog), 0);
- gnome_dialog_editable_enters (GNOME_DIALOG (dialog), GTK_EDITABLE(entry));
-
- gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
- gtk_widget_show (dialog);
- gtk_widget_grab_focus (entry);
-}
-
-static CalComponent *
-get_clist_selected_comp (GtkCList *clist)
-{
- gint sel;
-
- if (!clist->selection)
- return NULL;
-
- sel = GPOINTER_TO_INT(clist->selection->data);
-
- return gtk_clist_get_row_data (clist, sel);
-}
-
-static void
-add_todo (GncalTodo *todo)
-{
- CalComponent *comp;
-
- comp = cal_component_new ();
-
-#if 0
- gncal_todo_edit (todo, comp);
-#endif
- gtk_object_unref (GTK_OBJECT (comp));
-}
-
-static void
-edit_todo (GncalTodo *todo)
-{
- CalComponent *comp;
-
- comp = get_clist_selected_comp (todo->clist);
-
-#if 0
- gncal_todo_edit (todo, comp);
-#endif
-}
-
-static void
-delete_todo (GncalTodo *todo)
-{
- CalComponent *comp;
- const char *uid;
-
- comp = get_clist_selected_comp (todo->clist);
- cal_component_get_uid (comp, &uid);
-
- if (!cal_client_remove_object (todo->calendar->client, uid))
- g_message ("delete_todo(): Could not remove the object!");
-}
-
-static void
-add_activated (GtkWidget *widget, GncalTodo *todo)
-{
- GtkWidget *w;
-
- while ((w = gtk_grab_get_current ()) != NULL)
- gtk_grab_remove (w);
-
- add_todo (todo);
-}
-
-static void
-edit_activated (GtkWidget *widget, GncalTodo *todo)
-{
- GtkWidget *w;
-
- while ((w = gtk_grab_get_current ()) != NULL)
- gtk_grab_remove (w);
-
- edit_todo (todo);
-}
-
-static void
-delete_activated (GtkWidget *widget, GncalTodo *todo)
-{
- delete_todo (todo);
-}
-
-
-static void
-clist_row_selected (GtkCList *clist, gint row, gint column, GdkEventButton *event, GncalTodo *todo)
-{
- static struct menu_item items[] = {
- { N_("Add to-do item..."), (GtkSignalFunc) add_activated, NULL, TRUE },
- { N_("Edit this item..."), (GtkSignalFunc) edit_activated, NULL, TRUE },
- { N_("Delete this item"), (GtkSignalFunc) delete_activated, NULL, TRUE }
- };
-
- int i;
-
- gtk_widget_set_sensitive (todo->edit_button, (todo->clist->selection != NULL));
- gtk_widget_set_sensitive (todo->delete_button, (todo->clist->selection != NULL));
-
- if (!event)
- return;
-
- switch (event->button) {
- case 1:
- if (event->type == GDK_2BUTTON_PRESS)
- edit_todo (todo);
- break;
-
- case 3:
- for (i = 0; i < (sizeof (items) / sizeof (items[0])); i++)
- items[i].data = todo;
-
- popup_menu (items, sizeof (items) / sizeof (items[0]), event);
- break;
-
- default:
- break;
- }
-}
-
-/*
- * once we get a call back stating that a column
- * has been resized never ever automatically resize again
- */
-static void
-column_resized (GtkWidget *widget, GncalTodo *todo)
-{
- /* disabling autoresize of columns */
- if (todo_list_autoresize && !todo_list_redraw_in_progess){
- todo_list_autoresize = 0;
- }
-}
-
-/*
- * restore the previously set settings for sorting the
- * todo list
- */
-static void
-init_column_sorting (GtkCList *clist)
-{
-
- /* due date isn't shown so we can't sort by it */
- if (todo_current_sort_column == 1 && ! todo_show_due_date)
- todo_current_sort_column = 0;
-
- clist->sort_type = todo_current_sort_type;
- clist->sort_column = todo_current_sort_column;
-
- gtk_clist_set_sort_column (clist, todo_current_sort_column);
- gtk_clist_sort (clist);
-}
-
-static void
-todo_click_column (GtkCList *clist, gint column, gpointer data)
-{
- if (column == clist->sort_column)
- {
- if (clist->sort_type == GTK_SORT_ASCENDING) {
- clist->sort_type = GTK_SORT_DESCENDING;
- todo_current_sort_type = GTK_SORT_DESCENDING;
- } else {
- clist->sort_type = GTK_SORT_ASCENDING;
- todo_current_sort_type = GTK_SORT_ASCENDING;
- }
- }
- else {
- gtk_clist_set_sort_column (clist, column);
- todo_current_sort_column = column;
- }
-
- gtk_clist_sort (clist);
-
- /*
- * save the sorting preferences cause I hate to have the user
- * click twice
- */
-
- gnome_config_set_int("/calendar/Todo/sort_column", todo_current_sort_column);
- gnome_config_set_int("/calendar/Todo/sort_type", todo_current_sort_type);
- gnome_config_sync();
-}
-
-static void
-gncal_todo_init (GncalTodo *todo)
-{
- GtkWidget *w;
- GtkWidget *sw;
- GtkWidget *hbox;
- gchar *titles[4] = {
- N_("Summary"),
- N_("Due Date"),
- N_("Priority"),
- N_("Time Left")
- };
- char *tmp[4];
- tmp[0] = _(titles[0]);
- tmp[1] = _(titles[1]);
- tmp[2] = _(titles[2]);
- tmp[3] = _(titles[3]);
-
- gtk_box_set_spacing (GTK_BOX (todo), 4);
-
- /* Label */
-
- w = gtk_label_new (_("To-do list"));
- gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
- gtk_box_pack_start (GTK_BOX (todo), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- /* Clist */
-
- sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_box_pack_start (GTK_BOX (todo), sw, TRUE, TRUE, 0);
- gtk_widget_show (sw);
-
-
- w = gtk_clist_new_with_titles(4, tmp);
-
- todo->clist = GTK_CLIST (w);
- gtk_clist_set_selection_mode (todo->clist, GTK_SELECTION_BROWSE);
-
- gtk_signal_connect (GTK_OBJECT (todo->clist), "select_row",
- (GtkSignalFunc) clist_row_selected,
- todo);
- gtk_clist_set_button_actions (todo->clist, 2, GTK_BUTTON_SELECTS);
- gtk_signal_connect (GTK_OBJECT (todo->clist), "resize_column",
- (GtkSignalFunc) column_resized,
- todo);
- gtk_signal_connect (GTK_OBJECT (todo->clist), "click_column",
- (GtkSignalFunc) todo_click_column, NULL);
-
- gtk_container_add (GTK_CONTAINER (sw), w);
- gtk_widget_show (w);
-
- /* Box for buttons */
-
- hbox = gtk_hbox_new (TRUE, 4);
- gtk_box_pack_start (GTK_BOX (todo), hbox, FALSE, FALSE, 0);
- gtk_widget_show (hbox);
-
- /* Add */
-
- w = gtk_button_new_with_label (_("Add..."));
- gtk_signal_connect (GTK_OBJECT (w), "clicked",
- (GtkSignalFunc) add_activated,
- todo);
- gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
- gtk_widget_show (w);
-
- /* Edit */
-
- w = gtk_button_new_with_label (_("Edit..."));
- todo->edit_button = w;
- gtk_widget_set_sensitive (w, FALSE);
- gtk_signal_connect (GTK_OBJECT (w), "clicked",
- (GtkSignalFunc) edit_activated,
- todo);
- gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
- gtk_widget_show (w);
-
- /* Delete */
-
- w = gtk_button_new_with_label (_("Delete"));
- todo->delete_button = w;
- gtk_widget_set_sensitive (w, FALSE);
- gtk_signal_connect (GTK_OBJECT (w), "clicked",
- (GtkSignalFunc) delete_activated,
- todo);
- gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
- gtk_widget_show (w);
-}
-
-GtkWidget *
-gncal_todo_new (GnomeCalendar *calendar)
-{
- GncalTodo *todo;
-
- g_return_val_if_fail (calendar != NULL, NULL);
-
- todo = gtk_type_new (gncal_todo_get_type ());
-
- todo->calendar = calendar;
-
- gncal_todo_update (todo, NULL, 0);
-
- return GTK_WIDGET (todo);
-}
-
-static char *
-convert_time_t_to_char (time_t t)
-{
- char buf[100];
- struct tm tm;
-
- tm = *localtime (&t);
- strftime(buf, sizeof (buf), "%m/%d/%Y", &tm);
-
- return g_strdup (buf);
-}
-
-
-enum todo_styles {
- TODO_STYLE_OVERDUE,
- TODO_STYLE_DUE_TODAY,
- TODO_STYLE_NOT_DUE
-};
-
-
-enum todo_status {
- TODO_ITEM_DSTATUS_NOT_DUE_YET,
- TODO_ITEM_DSTATUS_DUE_TODAY,
- TODO_ITEM_DSTATUS_OVERDUE,
- TODO_ITEM_DSTATUS_LAST_DUE_STATUS
-};
-typedef enum todo_status todo_status;
-
-static GtkStyle *
-make_todo_style(GncalTodo *todo, todo_status style_type)
-{
- GtkStyle *style = NULL;
- GdkColor style_color;
- int color_prop = 0;
- switch(style_type) {
- case TODO_ITEM_DSTATUS_NOT_DUE_YET:
- color_prop = COLOR_PROP_TODO_NOT_DUE_YET;
- break;
- case TODO_ITEM_DSTATUS_DUE_TODAY:
- color_prop = COLOR_PROP_TODO_DUE_TODAY;
- break;
- case TODO_ITEM_DSTATUS_OVERDUE:
- color_prop = COLOR_PROP_TODO_OVERDUE;
- break;
- case TODO_ITEM_DSTATUS_LAST_DUE_STATUS:
- }
-
- style_color.red = color_props[color_prop].r;
- style_color.green = color_props[color_prop].g;
- style_color.blue = color_props[color_prop].b;
-
- style = gtk_style_copy (GTK_WIDGET (todo->clist)->style);
- style->base[GTK_STATE_NORMAL] = style_color;
- return style;
-}
-
-
-static
-todo_status todo_item_due_status(time_t *todo_due_time) {
- struct tm due_tm_time;
- struct tm current_time;
- struct tm *temp_tm;
- time_t current_time_val = time(NULL);
- temp_tm = localtime(todo_due_time);
- /* make a copy so it dosen't get over written */
- memcpy(&due_tm_time, temp_tm, sizeof(struct tm));
-
-
- temp_tm = localtime(&current_time_val);
- memcpy(&current_time, temp_tm, sizeof(struct tm));
-
- if(due_tm_time.tm_mon == current_time.tm_mon &&
- due_tm_time.tm_mday == current_time.tm_mday &&
- due_tm_time.tm_year == current_time.tm_year) {
- return TODO_ITEM_DSTATUS_DUE_TODAY;
- }
-
- if((*todo_due_time) < current_time_val) {
- return TODO_ITEM_DSTATUS_OVERDUE;
- }
-
- return TODO_ITEM_DSTATUS_NOT_DUE_YET;
-}
-
-
-enum todo_remaining_time_form {
- TODO_ITEM_REMAINING_WEEKS,
- TODO_ITEM_REMAINING_DAYS,
- TODO_ITEM_REMAINING_HOURS,
- TODO_ITEM_REMAINING_MINUTES,
- TODO_ITEM_REMAINING_SECONDS
-};
-typedef enum todo_remaining_time_form todo_remaining_time_form;
-
-
-static void
-insert_in_clist (GncalTodo *todo, CalComponent *comp)
-{
- int i;
- CalComponentText t;
- CalComponentDateTime date;
- char *text[4];
- char time_remaining_buffer[100];
- time_t time_remain;
- todo_remaining_time_form time_remaining_form;
- int sec_in_week = 3600*7*24;
- int sec_in_day = 3600*24;
- int sec_in_hour = 3600;
- int sec_in_minute = 60;
- int weeks = 0;
- int days = 0;
- int hours = 0;
- int minutes = 0;
- int seconds = 0;
- int *p;
- time_t d;
-
- /* an array for the styles of items */
- static GtkStyle *dstatus_styles[TODO_ITEM_DSTATUS_LAST_DUE_STATUS];
- /* we want to remake the styles when the status is changed,
- also we need to check for the null value in the pointer so we init them
- at startup */
- if (todo_style_changed || !dstatus_styles[TODO_ITEM_DSTATUS_NOT_DUE_YET]) {
- g_free(dstatus_styles[TODO_ITEM_DSTATUS_NOT_DUE_YET]);
- g_free(dstatus_styles[TODO_ITEM_DSTATUS_OVERDUE]);
- g_free(dstatus_styles[TODO_ITEM_DSTATUS_DUE_TODAY]);
-
- dstatus_styles[TODO_ITEM_DSTATUS_NOT_DUE_YET] = make_todo_style(todo, TODO_ITEM_DSTATUS_NOT_DUE_YET);
- dstatus_styles[TODO_ITEM_DSTATUS_OVERDUE] = make_todo_style(todo, TODO_ITEM_DSTATUS_OVERDUE);
- dstatus_styles[TODO_ITEM_DSTATUS_DUE_TODAY] = make_todo_style(todo, TODO_ITEM_DSTATUS_DUE_TODAY);
-
- todo_style_changed = 0;
- }
-
- cal_component_get_summary (comp, &t);
- text[0] = g_strdup (t.value);
-
- if(todo_show_time_remaining) {
- memset(time_remaining_buffer, 0, 100);
- /* we need to make a string that represents the amount of time remaining
- before this task is due */
-
- /* for right now all I'll do is up to the hours. */
- cal_component_get_dtend (comp, &date);
- time_remain = time_from_icaltimetype (*date.value) - time (NULL);
- if(time_remain < 0) {
- text[3] = "Overdue!";
- }
- else {
-
- /* lets determine a decent denomination to display */
- if(time_remain / (sec_in_week))
- {
- /* we have weeks available */
- time_remaining_form = TODO_ITEM_REMAINING_WEEKS;
- weeks = time_remain / sec_in_week;
- days = (time_remain % (sec_in_week))/sec_in_day;
- }
- else if(time_remain / (sec_in_day))
- {
- /* we have days available */
- time_remaining_form = TODO_ITEM_REMAINING_DAYS;
- days = time_remain / sec_in_day;
- hours = (time_remain % sec_in_day)/sec_in_hour;
- }
- else if(time_remain / (sec_in_hour))
- {
- /* we have hours available */
- time_remaining_form = TODO_ITEM_REMAINING_HOURS;
- hours = time_remain /sec_in_hour;
- minutes = (time_remain % sec_in_hour) / sec_in_minute;
- }
- else if(time_remain / sec_in_minute)
- {
- time_remaining_form = TODO_ITEM_REMAINING_MINUTES;
- minutes = time_remain / sec_in_minute;
- seconds = time_remain % sec_in_minute;
- }
- else
- {
- time_remaining_form = TODO_ITEM_REMAINING_SECONDS;
- seconds = time_remain;
- }
-
- switch(time_remaining_form)
- {
- case TODO_ITEM_REMAINING_WEEKS:
- snprintf(time_remaining_buffer, 100, "%d %s %d %s", weeks,
- (weeks > 1) ? _("Weeks") : _("Week"),
- days, (days > 1) ? _("Days") : _("Day"));
- break;
- case TODO_ITEM_REMAINING_DAYS:
- snprintf(time_remaining_buffer, 100, "%d %s %d %s", days,
- (days > 1) ? _("Days") : _("Day"),
- hours, (hours > 1) ? _("Hours") : _("Hour"));
- break;
- case TODO_ITEM_REMAINING_HOURS:
- snprintf(time_remaining_buffer, 100, "%d %s %d %s", hours,
- (hours > 1) ? _("Hours") : _("Hour"),
- minutes, (minutes > 1) ? _("Minutes") : _("Minute"));
- break;
- case TODO_ITEM_REMAINING_MINUTES:
- snprintf(time_remaining_buffer, 100, "%d %s %d %s", minutes,
- (minutes > 1) ? _("Minutes") : _("Minute"),
- seconds, (seconds > 1) ? _("Seconds") : _("Second"));
- break;
- case TODO_ITEM_REMAINING_SECONDS:
- snprintf(time_remaining_buffer, 100, "%d %s", seconds,
- (seconds > 1) ? _("Seconds") : _("Second"));
- break;
- }
- text[3] = g_strdup(time_remaining_buffer);
- todo->data_ptrs = g_slist_append(todo->data_ptrs, text[3]);
- }
-
- }
- else {
- text[3] = "Loose penguini!";
- }
- /*
- * right now column 0 will be the summary
- * and column 1 will be the due date.
- * WISH: this should be able to be changed on the fly
- */
-
- cal_component_get_dtend (comp, &date);
- d = time_from_icaltimetype (*date.value);
- if(todo_show_due_date)
- {
- text[1] = convert_time_t_to_char (d);
- /* Append the data's pointer so later it can be properly freed */
- todo->data_ptrs = g_slist_append (todo->data_ptrs, text[1]);
- }
- else
- text[1] = NULL;
-
- cal_component_get_priority (comp, &p);
- if(p && todo_show_priority)
- {
- text[2] = g_strdup_printf ("%d", *p);
- todo->data_ptrs = g_slist_append (todo->data_ptrs, text[2]);
- }
- else
- text[2] = NULL;
-
- i = gtk_clist_append (todo->clist, text);
-
- gtk_clist_set_row_data_full (todo->clist, i, comp,
- (GtkDestroyNotify) gtk_object_ref);
- gtk_object_ref (GTK_OBJECT (comp));
-
- /*
- * determine if the task is overdue..
- * if so mark with the apropriate style
- */
-
- switch(todo_item_due_status(&d)) {
- case TODO_ITEM_DSTATUS_NOT_DUE_YET:
- if(todo_item_dstatus_highlight_not_due_yet)
- {
- gtk_clist_set_row_style(todo->clist, i, dstatus_styles[TODO_ITEM_DSTATUS_NOT_DUE_YET]);
- }
- break;
- case TODO_ITEM_DSTATUS_DUE_TODAY:
- if(todo_item_dstatus_highlight_due_today)
- {
- gtk_clist_set_row_style(todo->clist, i, dstatus_styles[TODO_ITEM_DSTATUS_DUE_TODAY]);
- }
- break;
- case TODO_ITEM_DSTATUS_OVERDUE:
- if(todo_item_dstatus_highlight_overdue)
- {
- gtk_clist_set_row_style(todo->clist, i, dstatus_styles[TODO_ITEM_DSTATUS_OVERDUE]);
- }
- break;
- case TODO_ITEM_DSTATUS_LAST_DUE_STATUS:
- }
-
- /* keep the list in order */
- gtk_clist_sort (todo->clist);
-}
-
-
-void
-gncal_todo_update (GncalTodo *todo, CalComponent *comp, int flags)
-{
- GSList *current_list;
- CalClientGetStatus status;
- GList *l, *uids;
-
- g_return_if_fail (todo != NULL);
- g_return_if_fail (GNCAL_IS_TODO (todo));
-
- /*
- * shut down the resize handler cause we are playing with the list.
- * In otherwords turn off the event handler
- */
- todo_list_redraw_in_progess =1;
-
- /* freeze the list */
- gtk_clist_freeze (todo->clist);
- init_column_sorting (todo->clist);
-
- /*
- * before here we have to free some of the memory that
- * stores the due date, or else we have a memory leak.
- * luckily all of the pointers are stored in todo->data_ptrs;
- */
-
- /* check on the columns that we should display */
- /* check for due date */
-
- if(todo_show_due_date) {
- gtk_clist_set_column_visibility (todo->clist, 1, 1);
- }
- else {
- gtk_clist_set_column_visibility (todo->clist, 1, 0);
- }
-
- if(todo_show_time_remaining) {
- gtk_clist_set_column_visibility (todo->clist, 3, 1);
- }
- else {
- gtk_clist_set_column_visibility (todo->clist, 3, 0);
- }
-
-
- if(todo_show_priority)
- gtk_clist_set_column_visibility (todo->clist, 2, 1);
- else
- gtk_clist_set_column_visibility (todo->clist, 2, 0);
-
- /* free the memory locations that were used in the previous display */
- for (current_list = todo->data_ptrs;
- current_list != NULL;
- current_list = g_slist_next(current_list)){
- g_free(current_list->data);
- }
-
- /* free the list and clear out the pointer */
- g_slist_free(todo->data_ptrs);
- todo->data_ptrs = NULL;
-
- gtk_clist_clear (todo->clist);
-
-
- uids = cal_client_get_uids (todo->calendar->client, CAL_COMPONENT_TODO);
- for (l = uids; l; l = l->next){
- char *uid = l->data;
- CalComponent *comp;
-
- status = cal_client_get_object (todo->calendar->client, uid,
- &comp);
-
- if (status == CAL_CLIENT_GET_SUCCESS) {
- insert_in_clist (todo, comp);
- gtk_object_unref (GTK_OBJECT (comp));
- }
-#warning "FIX ME"
- /* else? */
- g_free (uid);
- }
- g_list_free (uids);
-
- /* if we are autoresizing then do it now */
- if(todo_list_autoresize && todo->clist->rows != 0)
- gtk_clist_columns_autosize (todo->clist);
-
- gtk_clist_thaw (todo->clist);
-
- gtk_widget_set_sensitive (todo->edit_button,
- (todo->clist->selection != NULL));
- gtk_widget_set_sensitive (todo->delete_button,
- (todo->clist->selection != NULL));
- todo_list_redraw_in_progess = 0;
-}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/calendar/gui/gncal-todo.h b/calendar/gui/gncal-todo.h
deleted file mode 100644
index 1102e32d77..0000000000
--- a/calendar/gui/gncal-todo.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* To-do widget for gncal
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <quartic@gimp.org>
- */
-
-#ifndef GNCAL_TODO_H
-#define GNCAL_TODO_H
-
-#include <gtk/gtkclist.h>
-#include <gtk/gtkvbox.h>
-#include <libgnome/gnome-defs.h>
-#include "gnome-cal.h"
-
-
-BEGIN_GNOME_DECLS
-
-
-#define GNCAL_TODO(obj) GTK_CHECK_CAST (obj, gncal_todo_get_type (), GncalTodo)
-#define GNCAL_TODO_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gncal_todo_get_type (), GncalTodoClass)
-#define GNCAL_IS_TODO(obj) GTK_CHECK_TYPE (obj, gncal_todo_get_type ())
-
-
-typedef struct _GncalTodo GncalTodo;
-typedef struct _GncalTodoClass GncalTodoClass;
-
-struct _GncalTodo {
- GtkVBox vbox;
-
- GnomeCalendar *calendar; /* the calendar we are associated to */
-
- GtkCList *clist;
-
- GtkWidget *edit_button;
- GtkWidget *delete_button;
- GSList *data_ptrs;
-};
-
-struct _GncalTodoClass {
- GtkVBoxClass parent_class;
-};
-
-
-guint gncal_todo_get_type (void);
-GtkWidget *gncal_todo_new (GnomeCalendar *calendar);
-
-void gncal_todo_update (GncalTodo *todo, CalComponent *comp, int flags);
-
-void gncal_todo_edit (CalClient *client, CalComponent *comp);
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
deleted file mode 100644
index 334e66f331..0000000000
--- a/calendar/gui/gnome-cal.c
+++ /dev/null
@@ -1,1530 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * GnomeCalendar widget
- * Copyright (C) 1998 the Free Software Foundation
- *
- * Authors: Miguel de Icaza (miguel@kernel.org)
- * Federico Mena-Quintero <federico@helixcode.com>
- */
-
-#include <config.h>
-#include <unistd.h>
-#include <signal.h>
-#include <sys/wait.h>
-#include <fcntl.h>
-#include <gtk/gtkframe.h>
-#include <widgets/e-paned/e-hpaned.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtknotebook.h>
-#include <gtk/gtkscrolledwindow.h>
-#include <widgets/e-paned/e-vpaned.h>
-#include <libgnomeui/gnome-messagebox.h>
-#include <cal-util/timeutil.h>
-#include "dialogs/alarm-notify-dialog.h"
-#include "alarm.h"
-#include "e-calendar-table.h"
-#include "e-day-view.h"
-#include "e-week-view.h"
-#include "event-editor.h"
-#include "gnome-cal.h"
-#include "calendar-commands.h"
-
-
-
-/* An entry in the UID->alarms hash table. The UID key *is* the uid field in
- * this structure, so don't free it separately.
- */
-typedef struct {
- char *uid;
- GList *alarm_ids;
-} ObjectAlarms;
-
-
-
-static void gnome_calendar_class_init (GnomeCalendarClass *class);
-static void gnome_calendar_init (GnomeCalendar *gcal);
-static void gnome_calendar_destroy (GtkObject *object);
-
-static void gnome_calendar_update_view_times (GnomeCalendar *gcal,
- GtkWidget *page);
-static void gnome_calendar_update_gtk_calendar (GnomeCalendar *gcal);
-static void gnome_calendar_on_day_selected (GtkCalendar *calendar,
- GnomeCalendar *gcal);
-static void gnome_calendar_on_month_changed (GtkCalendar *calendar,
- GnomeCalendar *gcal);
-
-static GtkVBoxClass *parent_class;
-
-static void setup_alarm (GnomeCalendar *cal, CalAlarmInstance *ai);
-
-
-
-guint
-gnome_calendar_get_type (void)
-{
- static guint gnome_calendar_type = 0;
- if(!gnome_calendar_type) {
- GtkTypeInfo gnome_calendar_info = {
- "GnomeCalendar",
- sizeof (GnomeCalendar),
- sizeof (GnomeCalendarClass),
- (GtkClassInitFunc) gnome_calendar_class_init,
- (GtkObjectInitFunc) gnome_calendar_init,
- (GtkArgSetFunc) NULL,
- (GtkArgGetFunc) NULL,
- };
- /*
- gnome_calendar_type = gtk_type_unique(gnome_app_get_type(), &gnome_calendar_info);
- parent_class = gtk_type_class (gnome_app_get_type());
- */
- gnome_calendar_type = gtk_type_unique (gtk_vbox_get_type (),
- &gnome_calendar_info);
- parent_class = gtk_type_class (gtk_vbox_get_type ());
- }
- return gnome_calendar_type;
-}
-
-/* Class initialization function for the gnome calendar */
-static void
-gnome_calendar_class_init (GnomeCalendarClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- object_class->destroy = gnome_calendar_destroy;
-}
-
-/* Object initialization function for the gnome calendar */
-static void
-gnome_calendar_init (GnomeCalendar *gcal)
-{
- gcal->object_editor_hash = g_hash_table_new (g_str_hash, g_str_equal);
- gcal->alarms = g_hash_table_new (g_str_hash, g_str_equal);
-}
-
-/* Used from g_hash_table_foreach(); frees an object alarms entry */
-static void
-free_object_alarms (gpointer key, gpointer value, gpointer data)
-{
- ObjectAlarms *oa;
-
- oa = value;
-
- g_assert (oa->uid != NULL);
- g_free (oa->uid);
- oa->uid = NULL;
-
- g_assert (oa->alarm_ids != NULL);
- g_list_free (oa->alarm_ids);
- oa->alarm_ids = NULL;
-
- g_free (oa);
-}
-
-/* Used from g_hash_table_foreach(); frees an UID string */
-static void
-free_uid (gpointer key, gpointer value, gpointer data)
-{
- char *uid;
-
- uid = key;
- g_free (uid);
-}
-
-static void
-gnome_calendar_destroy (GtkObject *object)
-{
- GnomeCalendar *gcal;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (object));
-
- gcal = GNOME_CALENDAR (object);
-
- gtk_object_unref (GTK_OBJECT (gcal->client));
-
- g_hash_table_foreach (gcal->alarms, free_object_alarms, NULL);
- g_hash_table_destroy (gcal->alarms);
- gcal->alarms = NULL;
-
- g_hash_table_foreach (gcal->object_editor_hash, free_uid, NULL);
- g_hash_table_destroy (gcal->object_editor_hash);
- gcal->object_editor_hash = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-setup_widgets (GnomeCalendar *gcal)
-{
- GtkWidget *vpane, *w;
-
- /* The Main Notebook. */
- gcal->main_notebook = gtk_notebook_new ();
- gtk_notebook_set_show_border (GTK_NOTEBOOK (gcal->main_notebook),
- FALSE);
- gtk_notebook_set_show_tabs (GTK_NOTEBOOK (gcal->main_notebook), FALSE);
- gtk_widget_show (gcal->main_notebook);
- gtk_box_pack_start (GTK_BOX (gcal), gcal->main_notebook,
- TRUE, TRUE, 0);
-
- /* The First Page of the Main Notebook, containing a HPaned with the
- Sub-Notebook on the left and the GtkCalendar and ToDo list on the
- right. */
- gcal->hpane = e_hpaned_new ();
- gtk_widget_show (gcal->hpane);
- gtk_notebook_append_page (GTK_NOTEBOOK (gcal->main_notebook),
- gcal->hpane, gtk_label_new (""));
-
- /* The Sub-Notebook, to contain the Day, Work-Week & Week views. */
- gcal->sub_notebook = gtk_notebook_new ();
- gtk_notebook_set_show_border (GTK_NOTEBOOK (gcal->sub_notebook),
- FALSE);
- gtk_notebook_set_show_tabs (GTK_NOTEBOOK (gcal->sub_notebook), FALSE);
- gtk_widget_show (gcal->sub_notebook);
- e_paned_pack1 (E_PANED (gcal->hpane), gcal->sub_notebook,
- TRUE, TRUE);
-
- /* The VPaned widget, to contain the GtkCalendar & ToDo list. */
- vpane = e_vpaned_new ();
- gtk_widget_show (vpane);
- e_paned_pack2 (E_PANED (gcal->hpane), vpane, FALSE, TRUE);
-
- /* The GtkCalendar. */
- w = gtk_calendar_new ();
- gcal->gtk_calendar = GTK_CALENDAR (w);
- gtk_widget_show (w);
- e_paned_pack1 (E_PANED (vpane), w, FALSE, TRUE);
- gcal->day_selected_id = gtk_signal_connect (GTK_OBJECT (gcal->gtk_calendar),
- "day_selected",
- (GtkSignalFunc) gnome_calendar_on_day_selected,
- gcal);
- gtk_signal_connect (GTK_OBJECT (gcal->gtk_calendar), "month_changed",
- GTK_SIGNAL_FUNC (gnome_calendar_on_month_changed),
- gcal);
-
- /* The ToDo list. */
-#if 0
- gcal->todo = gncal_todo_new (gcal);
- e_paned_pack2 (E_PANED (vpane), gcal->todo, TRUE, TRUE);
- gtk_widget_show (gcal->todo);
-#endif
-
- gcal->todo = e_calendar_table_new ();
- e_paned_pack2 (E_PANED (vpane), gcal->todo, TRUE, TRUE);
- gtk_widget_show (gcal->todo);
- e_calendar_table_set_cal_client (E_CALENDAR_TABLE (gcal->todo),
- gcal->client);
-
-
- /* The Day View. */
- gcal->day_view = e_day_view_new ();
- e_day_view_set_calendar (E_DAY_VIEW (gcal->day_view), gcal);
- gtk_widget_show (gcal->day_view);
- gtk_notebook_append_page (GTK_NOTEBOOK (gcal->sub_notebook),
- gcal->day_view, gtk_label_new (""));
-
- /* The Work Week View. */
- gcal->work_week_view = e_day_view_new ();
- e_day_view_set_days_shown (E_DAY_VIEW (gcal->work_week_view), 5);
- e_day_view_set_calendar (E_DAY_VIEW (gcal->work_week_view), gcal);
- gtk_widget_show (gcal->work_week_view);
- gtk_notebook_append_page (GTK_NOTEBOOK (gcal->sub_notebook),
- gcal->work_week_view, gtk_label_new (""));
-
- /* The Week View. */
- gcal->week_view = e_week_view_new ();
- e_week_view_set_calendar (E_WEEK_VIEW (gcal->week_view), gcal);
- gtk_widget_show (gcal->week_view);
- gtk_notebook_append_page (GTK_NOTEBOOK (gcal->sub_notebook),
- gcal->week_view, gtk_label_new (""));
-
- /* The Month View. */
- gcal->month_view = e_week_view_new ();
- e_week_view_set_calendar (E_WEEK_VIEW (gcal->month_view), gcal);
- e_week_view_set_display_month (E_WEEK_VIEW (gcal->month_view), TRUE);
- gtk_widget_show (gcal->month_view);
- gtk_notebook_append_page (GTK_NOTEBOOK (gcal->main_notebook),
- gcal->month_view, gtk_label_new (""));
-}
-
-static GtkWidget *
-get_current_page (GnomeCalendar *gcal)
-{
- GtkWidget *page;
-
- page = GTK_NOTEBOOK (gcal->main_notebook)->cur_page->child;
- if (page == gcal->hpane)
- return GTK_NOTEBOOK (gcal->sub_notebook)->cur_page->child;
- else
- return page;
-}
-
-char *
-gnome_calendar_get_current_view_name (GnomeCalendar *gcal)
-{
- GtkWidget *page;
-
- g_return_val_if_fail (gcal != NULL, "dayview");
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), "dayview");
-
- page = get_current_page (gcal);
-
- if (page == gcal->day_view)
- return "dayview";
- else if (page == gcal->work_week_view)
- return "workweekview";
- else if (page == gcal->week_view)
- return "weekview";
- else if (page == gcal->month_view)
- return "monthview";
- else
- return "dayview";
-}
-
-void
-gnome_calendar_goto (GnomeCalendar *gcal, time_t new_time)
-{
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (new_time != -1);
-
- gcal->selection_start_time = time_day_begin (new_time);
- gcal->selection_end_time = time_add_day (gcal->selection_start_time,
- 1);
- gnome_calendar_update_view_times (gcal, NULL);
- gnome_calendar_update_gtk_calendar (gcal);
-}
-
-
-static void
-gnome_calendar_update_view_times (GnomeCalendar *gcal,
- GtkWidget *page)
-{
- if (page == NULL)
- page = get_current_page (gcal);
-
- if (page == gcal->day_view
- || page == gcal->work_week_view)
- e_day_view_set_selected_time_range (E_DAY_VIEW (page),
- gcal->selection_start_time,
- gcal->selection_end_time);
- else if (page == gcal->week_view
- || page == gcal->month_view)
- e_week_view_set_selected_time_range (E_WEEK_VIEW (page),
- gcal->selection_start_time,
- gcal->selection_end_time);
- else {
- g_warning ("My penguin is gone!");
- g_assert_not_reached ();
- }
-}
-
-static void
-gnome_calendar_direction (GnomeCalendar *gcal, int direction)
-{
- GtkWidget *cp = get_current_page (gcal);
- time_t start_time, end_time;
-
- start_time = gcal->selection_start_time;
- end_time = gcal->selection_end_time;
-
- if (cp == gcal->day_view) {
- start_time = time_add_day (start_time, direction);
- end_time = time_add_day (end_time, direction);
- } else if (cp == gcal->work_week_view) {
- start_time = time_add_week (start_time, direction);
- end_time = time_add_week (end_time, direction);
- } else if (cp == gcal->week_view) {
- start_time = time_add_week (start_time, direction);
- end_time = time_add_week (end_time, direction);
- } else if (cp == gcal->month_view) {
- start_time = time_add_month (start_time, direction);
- end_time = time_add_month (end_time, direction);
- } else {
- g_warning ("Weee! Where did the penguin go?");
- g_assert_not_reached ();
- start_time = 0;
- end_time = 0;
- }
-
- gcal->selection_start_time = start_time;
- gcal->selection_end_time = end_time;
-
- gnome_calendar_update_view_times (gcal, NULL);
- gnome_calendar_update_gtk_calendar (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)
-{
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- gnome_calendar_set_view (gcal, "dayview");
- gnome_calendar_goto (gcal, time);
-}
-
-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));
-}
-
-
-/* This sets which view is currently shown. It also updates the selection time
- of the view so it shows the appropriate days. */
-void
-gnome_calendar_set_view (GnomeCalendar *gcal, char *page_name)
-{
- GtkWidget *page;
- int main_page = 0, sub_page = -1;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (page_name != NULL);
-
- if (strcmp (page_name, "dayview") == 0) {
- page = gcal->day_view;
- sub_page = 0;
- } else if (strcmp (page_name, "workweekview") == 0) {
- page = gcal->work_week_view;
- sub_page = 1;
- } else if (strcmp (page_name, "weekview") == 0) {
- page = gcal->week_view;
- sub_page = 2;
- } else if (strcmp (page_name, "monthview") == 0) {
- page = gcal->month_view;
- main_page = 1;
- } else {
- g_warning ("Unknown calendar view: %s", page_name);
- return;
- }
-
- gnome_calendar_update_view_times (gcal, page);
-
- if (sub_page != -1)
- gtk_notebook_set_page (GTK_NOTEBOOK (gcal->sub_notebook),
- sub_page);
- gtk_notebook_set_page (GTK_NOTEBOOK (gcal->main_notebook), main_page);
-
- gnome_calendar_update_gtk_calendar (gcal);
-}
-
-/* Sends a mail notification of an alarm trigger */
-static void
-mail_notification (char *mail_address, char *text, time_t app_time)
-{
- pid_t pid;
- int p [2];
- char *command;
-
- pipe (p);
- pid = fork ();
- if (pid == 0){
- int dev_null;
-
- dev_null = open ("/dev/null", O_RDWR);
- dup2 (p [0], 0);
- dup2 (dev_null, 1);
- dup2 (dev_null, 2);
- execl ("/usr/lib/sendmail", "/usr/lib/sendmail",
- mail_address, NULL);
- _exit (127);
- }
- command = g_strconcat ("To: ", mail_address, "\n",
- "Subject: ", _("Reminder of your appointment at "),
- ctime (&app_time), "\n\n", text, "\n", NULL);
- write (p [1], command, strlen (command));
- close (p [1]);
- close (p [0]);
- g_free (command);
-}
-
-static int
-max_open_files (void)
-{
- static int files;
-
- if (files)
- return files;
-
- files = sysconf (_SC_OPEN_MAX);
- if (files != -1)
- return files;
-#ifdef OPEN_MAX
- return files = OPEN_MAX;
-#else
- return files = 256;
-#endif
-}
-
-/* Executes a program as a notification of an alarm trigger */
-static void
-program_notification (char *command, int close_standard)
-{
- struct sigaction ignore, save_intr, save_quit;
- int status = 0, i;
- pid_t pid;
-
- ignore.sa_handler = SIG_IGN;
- sigemptyset (&ignore.sa_mask);
- ignore.sa_flags = 0;
-
- sigaction (SIGINT, &ignore, &save_intr);
- sigaction (SIGQUIT, &ignore, &save_quit);
-
- if ((pid = fork ()) < 0){
- fprintf (stderr, "\n\nfork () = -1\n");
- return;
- }
- if (pid == 0){
- pid = fork ();
- if (pid == 0){
- const int top = max_open_files ();
- sigaction (SIGINT, &save_intr, NULL);
- sigaction (SIGQUIT, &save_quit, NULL);
-
- for (i = (close_standard ? 0 : 3); i < top; i++)
- close (i);
-
- /* FIXME: As an excercise to the reader, copy the
- * code from mc to setup shell properly instead of
- * /bin/sh. Yes, this comment is larger than a cut and paste.
- */
- execl ("/bin/sh", "/bin/sh", "-c", command, (char *) 0);
-
- _exit (127);
- } else {
- _exit (127);
- }
- }
- wait (&status);
- sigaction (SIGINT, &save_intr, NULL);
- sigaction (SIGQUIT, &save_quit, NULL);
-}
-
-/* Queues a snooze alarm */
-static void
-snooze (GnomeCalendar *gcal, CalComponent *comp, time_t occur, int snooze_mins, gboolean audio)
-{
- time_t now, trigger;
- struct tm tm;
- CalAlarmInstance ai;
-
- now = time (NULL);
- tm = *localtime (&now);
- tm.tm_min += snooze_mins;
-
- trigger = mktime (&tm);
- if (trigger == -1) {
- g_message ("snooze(): produced invalid time_t; not queueing alarm!");
- return;
- }
-
-#if 0
- cal_component_get_uid (comp, &ai.uid);
- ai.type = audio ? ALARM_AUDIO : ALARM_DISPLAY;
-#endif
- ai.trigger = trigger;
- ai.occur = occur;
-
- setup_alarm (gcal, &ai);
-}
-
-/* Edits an appointment from the alarm notification dialog */
-static void
-edit (GnomeCalendar *gcal, CalComponent *comp)
-{
- gnome_calendar_edit_object (gcal, comp);
-}
-
-struct alarm_notify_closure {
- GnomeCalendar *gcal;
- CalComponent *comp;
- time_t occur;
-};
-
-/* Callback used for the result of the alarm notification dialog */
-static void
-display_notification_cb (AlarmNotifyResult result, int snooze_mins, gpointer data)
-{
- struct alarm_notify_closure *c;
-
- c = data;
-
- switch (result) {
- case ALARM_NOTIFY_CLOSE:
- break;
-
- case ALARM_NOTIFY_SNOOZE:
- snooze (c->gcal, c->comp, c->occur, snooze_mins, FALSE);
- break;
-
- case ALARM_NOTIFY_EDIT:
- edit (c->gcal, c->comp);
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- gtk_object_unref (GTK_OBJECT (c->comp));
- g_free (c);
-}
-
-/* Present a display notification of an alarm trigger */
-static void
-display_notification (time_t trigger, time_t occur, CalComponent *comp, GnomeCalendar *gcal)
-{
- gboolean result;
- struct alarm_notify_closure *c;
-
- gtk_object_ref (GTK_OBJECT (comp));
-
- c = g_new (struct alarm_notify_closure, 1);
- c->gcal = gcal;
- c->comp = comp;
- c->occur = occur;
-
- result = alarm_notify_dialog (trigger, occur, comp, display_notification_cb, c);
- if (!result) {
- g_message ("display_notification(): could not display the alarm notification dialog");
- g_free (c);
- gtk_object_unref (GTK_OBJECT (comp));
- }
-}
-
-/* Present an audible notification of an alarm trigger */
-static void
-audio_notification (time_t trigger, time_t occur, CalComponent *comp, GnomeCalendar *gcal)
-{
- g_message ("AUDIO NOTIFICATION!");
- /* FIXME */
-}
-
-struct trigger_alarm_closure {
- GnomeCalendar *gcal;
- char *uid;
- CalComponentAlarmAction type;
- time_t occur;
-};
-
-/* Callback function used when an alarm is triggered */
-static void
-trigger_alarm_cb (gpointer alarm_id, time_t trigger, gpointer data)
-{
- struct trigger_alarm_closure *c;
- CalComponent *comp;
- CalClientGetStatus status;
- const char *uid;
- ObjectAlarms *oa;
- GList *l;
-
- c = data;
-
- /* Fetch the object */
-
- status = cal_client_get_object (c->gcal->client, c->uid, &comp);
-
- switch (status) {
- case CAL_CLIENT_GET_SUCCESS:
- /* Go on */
- break;
- case CAL_CLIENT_GET_SYNTAX_ERROR:
- case CAL_CLIENT_GET_NOT_FOUND:
- g_message ("trigger_alarm_cb(): syntax error in fetched object");
- return;
- }
-
- g_assert (comp != NULL);
-
- /* Present notification */
-
- switch (c->type) {
- case CAL_COMPONENT_ALARM_EMAIL:
-#if 0
- g_assert (ico->malarm.enabled);
- mail_notification (ico->malarm.data, ico->summary, c->occur);
-#endif
- break;
-
- case CAL_COMPONENT_ALARM_PROCEDURE:
-#if 0
- g_assert (ico->palarm.enabled);
- program_notification (ico->palarm.data, FALSE);
-#endif
- break;
-
- case CAL_COMPONENT_ALARM_DISPLAY:
-#if 0
- g_assert (ico->dalarm.enabled);
-#endif
- display_notification (trigger, c->occur, comp, c->gcal);
- break;
-
- case CAL_COMPONENT_ALARM_AUDIO:
-#if 0
- g_assert (ico->aalarm.enabled);
-#endif
- audio_notification (trigger, c->occur, comp, c->gcal);
- break;
-
- default:
- break;
- }
-
- /* Remove the alarm from the hash table */
- cal_component_get_uid (comp, &uid);
- oa = g_hash_table_lookup (c->gcal->alarms, uid);
- g_assert (oa != NULL);
-
- l = g_list_find (oa->alarm_ids, alarm_id);
- g_assert (l != NULL);
-
- oa->alarm_ids = g_list_remove_link (oa->alarm_ids, l);
- g_list_free_1 (l);
-
- if (!oa->alarm_ids) {
- g_hash_table_remove (c->gcal->alarms, uid);
- g_free (oa->uid);
- g_free (oa);
- }
-
- gtk_object_unref (GTK_OBJECT (comp));
-}
-
-/* Frees a struct trigger_alarm_closure */
-static void
-free_trigger_alarm_closure (gpointer data)
-{
- struct trigger_alarm_closure *c;
-
- c = data;
- g_free (c->uid);
- g_free (c);
-}
-
-/* Queues the specified alarm */
-static void
-setup_alarm (GnomeCalendar *cal, CalAlarmInstance *ai)
-{
- struct trigger_alarm_closure *c;
- gpointer alarm;
- ObjectAlarms *oa;
-
- c = g_new (struct trigger_alarm_closure, 1);
- c->gcal = cal;
- c->uid = g_strdup (ai->uid);
-#if 0
- c->type = ai->type;
-#endif
- c->occur = ai->occur;
-
- alarm = alarm_add (ai->trigger, trigger_alarm_cb, c, free_trigger_alarm_closure);
- if (!alarm) {
- g_message ("setup_alarm(): Could not set up alarm");
- g_free (c->uid);
- g_free (c);
- return;
- }
-
- oa = g_hash_table_lookup (cal->alarms, ai->uid);
- if (oa)
- oa->alarm_ids = g_list_prepend (oa->alarm_ids, alarm);
- else {
- oa = g_new (ObjectAlarms, 1);
- oa->uid = g_strdup (ai->uid);
- oa->alarm_ids = g_list_prepend (NULL, alarm);
-
- g_hash_table_insert (cal->alarms, oa->uid, oa);
- }
-}
-
-static void load_alarms (GnomeCalendar *cal);
-
-/* Called nightly to refresh the day's alarms */
-static void
-midnight_refresh_cb (gpointer alarm_id, time_t trigger, gpointer data)
-{
- GnomeCalendar *cal;
-
- cal = GNOME_CALENDAR (data);
- cal->midnight_alarm_refresh_id = NULL;
-
- load_alarms (cal);
-}
-
-/* Loads and queues the alarms from the current time up to midnight. */
-static void
-load_alarms (GnomeCalendar *gcal)
-{
- time_t now;
- time_t end_of_day;
- GList *alarms, *l;
-
- now = time (NULL);
- end_of_day = time_day_end (now);
-
- /* Queue alarms */
-
- alarms = cal_client_get_alarms_in_range (gcal->client, now, end_of_day);
-
- for (l = alarms; l; l = l->next)
- setup_alarm (gcal, l->data);
-
- cal_alarm_instance_list_free (alarms);
-
- /* Queue the midnight alarm refresh */
-
- gcal->midnight_alarm_refresh_id = alarm_add (end_of_day, midnight_refresh_cb, gcal, NULL);
- if (!gcal->midnight_alarm_refresh_id) {
- g_message ("load_alarms(): Could not set up the midnight refresh alarm!");
- /* FIXME: what to do? */
- }
-}
-
-/* This tells all components to reload all calendar objects. */
-static void
-gnome_calendar_update_all (GnomeCalendar *cal)
-{
- load_alarms (cal);
-
- e_day_view_update_all_events (E_DAY_VIEW (cal->day_view));
- e_day_view_update_all_events (E_DAY_VIEW (cal->work_week_view));
- e_week_view_update_all_events (E_WEEK_VIEW (cal->week_view));
- e_week_view_update_all_events (E_WEEK_VIEW (cal->month_view));
-
-#if 0
- gncal_todo_update (GNCAL_TODO (cal->todo), NULL, TRUE);
-#endif
- gnome_calendar_tag_calendar (cal, cal->gtk_calendar);
-}
-
-/* Removes any queued alarms for the specified UID */
-static void
-remove_alarms_for_object (GnomeCalendar *gcal, const char *uid)
-{
- ObjectAlarms *oa;
- GList *l;
-
- oa = g_hash_table_lookup (gcal->alarms, uid);
- if (!oa)
- return;
-
- for (l = oa->alarm_ids; l; l = l->next) {
- gpointer alarm_id;
-
- alarm_id = l->data;
- alarm_remove (alarm_id);
- }
-
- g_hash_table_remove (gcal->alarms, uid);
-
- g_free (oa->uid);
- g_list_free (oa->alarm_ids);
- g_free (oa);
-}
-
-/* Adds today's alarms for the specified object */
-static void
-add_alarms_for_object (GnomeCalendar *gcal, const char *uid)
-{
- GList *alarms;
- gboolean result;
- time_t now, end_of_day;
- GList *l;
-
- now = time (NULL);
- end_of_day = time_day_end (now);
-
- result = cal_client_get_alarms_for_object (gcal->client, uid, now, end_of_day, &alarms);
- if (!result) {
- /* FIXME: should we warn here, or is it OK if the object
- * disappeared in the meantime?
- */
- return;
- }
-
- for (l = alarms; l; l = l->next)
- setup_alarm (gcal, l->data);
-
- cal_alarm_instance_list_free (alarms);
-}
-
-static void
-gnome_calendar_object_updated_cb (GtkWidget *cal_client,
- const char *uid,
- GnomeCalendar *gcal)
-{
- g_message ("gnome-cal: got object changed_cb, uid='%s'",
- uid?uid:"<NULL>");
-
- remove_alarms_for_object (gcal, uid);
- add_alarms_for_object (gcal, uid);
-
- /* FIXME: do we really want each view to reload the event itself?
- Maybe we should keep track of events globally, maybe with ref
- counts. We also need to sort out where they get freed. */
- e_day_view_update_event (E_DAY_VIEW (gcal->day_view), uid);
- e_day_view_update_event (E_DAY_VIEW (gcal->work_week_view), uid);
- e_week_view_update_event (E_WEEK_VIEW (gcal->week_view), uid);
- e_week_view_update_event (E_WEEK_VIEW (gcal->month_view), uid);
-
-#if 0
- gncal_todo_update (GNCAL_TODO (gcal->todo), NULL, TRUE);
-#endif
- gnome_calendar_tag_calendar (gcal, gcal->gtk_calendar);
-}
-
-
-static void
-gnome_calendar_object_removed_cb (GtkWidget *cal_client,
- const char *uid,
- GnomeCalendar *gcal)
-{
- g_message ("gnome-cal: got object removed _cb, uid='%s'",
- uid?uid:"<NULL>");
-
- remove_alarms_for_object (gcal, uid);
-
- e_day_view_remove_event (E_DAY_VIEW (gcal->day_view), uid);
- e_day_view_remove_event (E_DAY_VIEW (gcal->work_week_view), uid);
- e_week_view_remove_event (E_WEEK_VIEW (gcal->week_view), uid);
- e_week_view_remove_event (E_WEEK_VIEW (gcal->month_view), uid);
-
-#if 0
- gncal_todo_update (GNCAL_TODO (gcal->todo), NULL, CHANGE_ALL);
-#endif
- gnome_calendar_tag_calendar (gcal, gcal->gtk_calendar);
-}
-
-
-GtkWidget *
-gnome_calendar_new (char *title)
-{
- GtkWidget *retval;
- GnomeCalendar *gcal;
-
- retval = gtk_type_new (gnome_calendar_get_type ());
-
- gcal = GNOME_CALENDAR (retval);
-
- gcal->selection_start_time = time_day_begin (time (NULL));
- gcal->selection_end_time = time_add_day (gcal->selection_start_time, 1);
- gcal->client = cal_client_new ();
-
- setup_widgets (gcal);
-
- gnome_calendar_set_view (gcal, "dayview");
-
- gtk_signal_connect (GTK_OBJECT (gcal->client), "obj_updated",
- gnome_calendar_object_updated_cb, gcal);
- gtk_signal_connect (GTK_OBJECT (gcal->client), "obj_removed",
- gnome_calendar_object_removed_cb, gcal);
-
- return retval;
-}
-
-typedef struct
-{
- GnomeCalendar *gcal;
- char *uri;
- GnomeCalendarOpenMode gcom;
- guint signal_handle;
-} load_or_create_data;
-
-
-static void
-gnome_calendar_load_cb (CalClient *cal_client,
- CalClientLoadStatus status,
- load_or_create_data *locd)
-{
- g_return_if_fail (locd);
- g_return_if_fail (GNOME_IS_CALENDAR (locd->gcal));
-
- switch (status) {
- case CAL_CLIENT_LOAD_SUCCESS:
- gnome_calendar_update_all (locd->gcal);
- g_message ("gnome_calendar_load_cb: success");
- break;
-
- case CAL_CLIENT_LOAD_ERROR:
- g_message ("gnome_calendar_load_cb: load error");
- if (locd->gcom == CALENDAR_OPEN_OR_CREATE) {
- g_message ("gnome_calendar_load_cb: trying create...");
- /* FIXME: connect to the cal_loaded signal of the
- * CalClient and get theasynchronous notification
- * properly! */
- /*gtk_signal_connect (GTK_OBJECT (gcal->client),
- "cal_loaded",
- gnome_calendar_create_cb, gcal);*/
-
- gtk_signal_disconnect (GTK_OBJECT (locd->gcal->client),
- locd->signal_handle);
-
- cal_client_create_calendar (locd->gcal->client,
- locd->uri);
- gnome_calendar_update_all (locd->gcal);
- }
- break;
-
- case CAL_CLIENT_LOAD_IN_USE:
- /* FIXME: what to do? */
- g_message ("gnome_calendar_load_cb: in use");
- break;
-
- case CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED:
- /* FIXME: what to do? */
- g_message ("gnome_calendar_load_cb(): method not supported");
- break;
-
- default:
- g_message ("gnome_calendar_load_cb(): unhandled result code %d!", (int) status);
- g_assert_not_reached ();
- }
-
- g_free (locd->uri);
- g_free (locd);
-}
-
-
-int
-gnome_calendar_open (GnomeCalendar *gcal,
- char *file,
- GnomeCalendarOpenMode gcom)
-{
- load_or_create_data *locd;
-
- g_return_val_if_fail (gcal != NULL, 0);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), 0);
- g_return_val_if_fail (file != NULL, 0);
-
- locd = g_new0 (load_or_create_data, 1);
- locd->gcal = gcal;
- locd->uri = g_strdup (file);
- locd->gcom = gcom;
-
- locd->signal_handle = gtk_signal_connect (GTK_OBJECT (gcal->client),
- "cal_loaded",
- gnome_calendar_load_cb,
- locd);
-
- if (cal_client_load_calendar (gcal->client, file) == FALSE){
- g_message ("Error loading calendar: %s", file);
- return 0;
- }
-
- return 1;
-}
-
-static void
-stop_beeping (GtkObject* object, gpointer data)
-{
- guint timer_tag, beep_tag;
- timer_tag = GPOINTER_TO_INT (gtk_object_get_data (object, "timer_tag"));
- beep_tag = GPOINTER_TO_INT (gtk_object_get_data (object, "beep_tag"));
-
- if (beep_tag > 0) {
- gtk_timeout_remove (beep_tag);
- gtk_object_set_data (object, "beep_tag", GINT_TO_POINTER (0));
- }
- if (timer_tag > 0) {
- gtk_timeout_remove (timer_tag);
- gtk_object_set_data (object, "timer_tag", GINT_TO_POINTER (0));
- }
-}
-
-static gint
-start_beeping (gpointer data)
-{
- gdk_beep ();
-
- return TRUE;
-}
-
-static gint
-timeout_beep (gpointer data)
-{
- stop_beeping (data, NULL);
- return FALSE;
-}
-
-#if 0
-
-void
-calendar_notify (time_t activation_time, CalendarAlarm *which, void *data)
-{
- iCalObject *ico = data;
- guint beep_tag, timer_tag;
- int ret;
- gchar* snooze_button = (enable_snooze ? _("Snooze") : NULL);
- time_t now, diff;
-
- if (&ico->aalarm == which){
- time_t app = ico->aalarm.trigger + ico->aalarm.offset;
- GtkWidget *w;
- char *msg;
-
- msg = g_strconcat (_("Reminder of your appointment at "),
- ctime (&app), "`",
- ico->summary, "'", NULL);
-
- /* Idea: we need Snooze option :-) */
- w = gnome_message_box_new (msg, GNOME_MESSAGE_BOX_INFO, _("Ok"), snooze_button, NULL);
- beep_tag = gtk_timeout_add (1000, start_beeping, NULL);
- if (enable_aalarm_timeout)
- timer_tag = gtk_timeout_add (audio_alarm_timeout*1000,
- timeout_beep, w);
- else
- timer_tag = 0;
- gtk_object_set_data (GTK_OBJECT (w), "timer_tag",
- GINT_TO_POINTER (timer_tag));
- gtk_object_set_data (GTK_OBJECT (w), "beep_tag",
- GINT_TO_POINTER (beep_tag));
- gtk_widget_ref (w);
- gtk_window_set_modal (GTK_WINDOW (w), FALSE);
- ret = gnome_dialog_run (GNOME_DIALOG (w));
- switch (ret) {
- case 1:
- stop_beeping (GTK_OBJECT (w), NULL);
- now = time (NULL);
- diff = now - which->trigger;
- which->trigger = which->trigger + diff + snooze_secs;
- which->offset = which->offset - diff - snooze_secs;
- alarm_add (which, &calendar_notify, data);
- break;
- default:
- stop_beeping (GTK_OBJECT (w), NULL);
- break;
- }
-
- gtk_widget_unref (w);
- return;
- }
-
- if (&ico->palarm == which){
- execute (ico->palarm.data, 0);
- return;
- }
-
- if (&ico->malarm == which){
- time_t app = ico->malarm.trigger + ico->malarm.offset;
-
- mail_notify (ico->malarm.data, ico->summary, app);
- return;
- }
-
- if (&ico->dalarm == which){
- time_t app = ico->dalarm.trigger + ico->dalarm.offset;
- GtkWidget *w;
- char *msg;
-
- if (beep_on_display)
- gdk_beep ();
- msg = g_strconcat (_("Reminder of your appointment at "),
- ctime (&app), "`",
- ico->summary, "'", NULL);
- w = gnome_message_box_new (msg, GNOME_MESSAGE_BOX_INFO,
- _("Ok"), snooze_button, NULL);
- gtk_window_set_modal (GTK_WINDOW (w), FALSE);
- ret = gnome_dialog_run (GNOME_DIALOG (w));
- switch (ret) {
- case 1:
- now = time (NULL);
- diff = now - which->trigger;
- which->trigger = which->trigger + diff + snooze_secs;
- which->offset = which->offset - diff - snooze_secs;
- alarm_add (which, &calendar_notify, data);
- break;
- default:
- break;
- }
-
- return;
- }
-}
-
-#endif
-
-/* Marks the specified range in a GtkCalendar */
-static void
-mark_gtk_calendar_day (GtkCalendar *calendar, time_t start, time_t end)
-{
- time_t t;
-
- t = time_day_begin (start);
-
- do {
- struct tm tm;
-
- tm = *localtime (&t);
- gtk_calendar_mark_day (calendar, tm.tm_mday);
-
- t = time_day_end (t);
- } while (t < end);
-}
-
-/*
- * Tags the dates with appointments in a GtkCalendar based on the
- * GnomeCalendar contents
- */
-struct calendar_tag_closure
-{
- GtkCalendar *gtk_cal;
- time_t month_begin;
- time_t month_end;
-};
-
-static gboolean
-gnome_calendar_tag_calendar_cb (CalComponent *comp, time_t istart, time_t iend, gpointer data)
-{
- struct calendar_tag_closure *c = data;
-
- start = MAX (istart, c->month_begin);
- end = MIN (iend, c->month_end);
-
- if (start > end)
- return TRUE;
-
- /* Clip the occurrence's start and end times to the month's limits */
- mark_gtk_calendar_day (c->gtk_cal, start, end);
-
- return TRUE;
-}
-
-void
-gnome_calendar_tag_calendar (GnomeCalendar *cal, GtkCalendar *gtk_cal)
-{
- struct calendar_tag_closure c;
-
- g_return_if_fail (cal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (cal));
- g_return_if_fail (gtk_cal != NULL);
- g_return_if_fail (GTK_IS_CALENDAR (gtk_cal));
-
- /* If the GtkCalendar isn't visible, we just return. */
- if (!GTK_WIDGET_VISIBLE (cal->gtk_calendar))
- return;
-
- c.gtk_cal = gtk_cal;
-
- c.month_begin = time_from_day (gtk_cal->year, gtk_cal->month, 1);
- if (c.month_begin == -1) {
- g_message ("gnome_calendar_tag_calendar(): Generated invalid month begin!");
- return;
- }
-
- c.month_end = time_month_end (c.month_begin);
- if (c.month_end == -1) {
- g_message ("gnome_calendar_tag_calendar(): Generated invalid month end!");
- return;
- }
-
- gtk_calendar_freeze (gtk_cal);
- gtk_calendar_clear_marks (gtk_cal);
-
- cal_client_generate_instances (cal->client, CALOBJ_TYPE_EVENT,
- c.month_begin, c.month_end,
- gnome_calendar_tag_calendar_cb, &c);
-
- gtk_calendar_thaw (gtk_cal);
-}
-
-/* This is called when the day begin & end times, the AM/PM flag, or the
- week_starts_on_monday flags are changed.
- FIXME: Which of these options do we want the new views to support? */
-void
-gnome_calendar_time_format_changed (GnomeCalendar *gcal)
-{
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- gtk_calendar_display_options (gcal->gtk_calendar,
- (week_starts_on_monday
- ? (gcal->gtk_calendar->display_flags
- | GTK_CALENDAR_WEEK_START_MONDAY)
- : (gcal->gtk_calendar->display_flags
- & ~GTK_CALENDAR_WEEK_START_MONDAY)));
-}
-
-/* This is called when any of the color settings are changed.
- FIXME: Need to update for the new views. */
-void
-gnome_calendar_colors_changed (GnomeCalendar *gcal)
-{
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- todo_style_changed = 1;
-#if 0
- gncal_todo_update (GNCAL_TODO (gcal->todo), NULL, 0);
-#endif
-}
-
-void
-gnome_calendar_todo_properties_changed (GnomeCalendar *gcal)
-{
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- todo_style_changed = 1;
-#if 0
- gncal_todo_update (GNCAL_TODO (gcal->todo), NULL, 0);
-#endif
-}
-
-
-void
-gnome_calendar_set_selected_time_range (GnomeCalendar *gcal,
- time_t start_time,
- time_t end_time)
-{
- gcal->selection_start_time = start_time;
- gcal->selection_end_time = end_time;
-
- gnome_calendar_update_gtk_calendar (gcal);
-}
-
-/* Callback used when an event editor finishes editing an object */
-static void
-ical_object_released_cb (EventEditor *ee, const char *uid, gpointer data)
-{
- GnomeCalendar *gcal;
- gboolean result;
- gpointer orig_key;
- char *orig_uid;
-
- gcal = GNOME_CALENDAR (data);
-
- result = g_hash_table_lookup_extended (gcal->object_editor_hash, uid, &orig_key, NULL);
- g_assert (result != FALSE);
-
- orig_uid = orig_key;
-
- g_hash_table_remove (gcal->object_editor_hash, orig_uid);
- g_free (orig_uid);
-}
-
-/* Callback used when an event editor dialog is closed */
-static void
-editor_closed_cb (EventEditor *ee, gpointer data)
-{
- gtk_object_unref (GTK_OBJECT (ee));
-}
-
-/* Callback used when an event editor requests that an object be saved */
-static void
-save_ical_object_cb (EventEditor *ee, CalComponent *comp, gpointer data)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
- if (!cal_client_update_object (gcal->client, comp))
- g_message ("save_ical_object_cb(): Could not update the object!");
-}
-
-void
-gnome_calendar_edit_object (GnomeCalendar *gcal, CalComponent *comp)
-{
- EventEditor *ee;
- const char *uid;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (comp != NULL);
-
- cal_component_get_uid (comp, &uid);
-
- ee = g_hash_table_lookup (gcal->object_editor_hash, uid);
- if (!ee) {
- ee = event_editor_new ();
- if (!ee) {
- g_message ("gnome_calendar_edit_object(): Could not create the event editor");
- return;
- }
-
- /* FIXME: what to do when an event editor wants to switch
- * objects? We would need to know about it as well.
- */
-
- g_hash_table_insert (gcal->object_editor_hash, g_strdup (uid), ee);
- gtk_signal_connect (GTK_OBJECT (ee), "ical_object_released",
- GTK_SIGNAL_FUNC (ical_object_released_cb), gcal);
-
- gtk_signal_connect (GTK_OBJECT (ee), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), gcal);
-
- gtk_signal_connect (GTK_OBJECT (ee), "save_ical_object",
- GTK_SIGNAL_FUNC (save_ical_object_cb), gcal);
-
- event_editor_set_ical_object (EVENT_EDITOR (ee), comp);
- }
-
- event_editor_focus (ee);
-}
-
-/**
- * gnome_calendar_new_appointment:
- * @gcal: An Evolution calendar.
- *
- * 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
- * views.
- **/
-void
-gnome_calendar_new_appointment (GnomeCalendar *gcal)
-{
- CalComponent *comp;
- time_t dtstart, dtend;
- CalComponentDateTime dt;
- struct icaltimetype itt;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- gnome_calendar_get_current_time_range (gcal, &dtstart, &dtend);
- dt.value = &itt;
- dt.tzid = NULL;
-
- comp = cal_component_new ();
- cal_component_set_new_vtype (comp, CAL_COMPONENT_EVENT);
-
- itt = icaltimetype_from_timet (dtstart, 0);
- cal_component_set_dtstart (comp, &dt);
-
- itt = icaltimetype_from_timet (dtend, 0);
- cal_component_set_dtend (comp, &dt);
-
- gnome_calendar_edit_object (gcal, comp);
- gtk_object_unref (GTK_OBJECT (comp));
-
-}
-
-/* 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)
-{
- GtkWidget *page;
-
- page = get_current_page (gcal);
-
- if (page == gcal->day_view
- || page == gcal->work_week_view)
- e_day_view_get_selected_time_range (E_DAY_VIEW (page),
- start_time, end_time);
- else if (page == gcal->week_view
- || page == gcal->month_view)
- e_week_view_get_selected_time_range (E_WEEK_VIEW (page),
- start_time, end_time);
- else {
- g_message ("My penguin is gone!");
- g_assert_not_reached ();
- }
-}
-
-
-
-/* This updates the month shown and the day selected in the calendar, if
- necessary. */
-static void
-gnome_calendar_update_gtk_calendar (GnomeCalendar *gcal)
-{
- GDate date;
- guint current_year, current_month, current_day;
- guint new_year, new_month, new_day;
- gboolean set_day = FALSE;
-
- /* If the GtkCalendar isn't visible, we just return. */
- if (!GTK_WIDGET_VISIBLE (gcal->gtk_calendar))
- return;
-
- gtk_calendar_get_date (gcal->gtk_calendar, &current_year,
- &current_month, &current_day);
-
- g_date_clear (&date, 1);
- g_date_set_time (&date, gcal->selection_start_time);
- new_year = g_date_year (&date);
- new_month = g_date_month (&date) - 1;
- new_day = g_date_day (&date);
-
- /* Block the "day_selected" signal while we update the calendar. */
- gtk_signal_handler_block (GTK_OBJECT (gcal->gtk_calendar),
- gcal->day_selected_id);
-
- /* If the year & month don't match, update it. */
- if (new_year != current_year || new_month != current_month) {
- /* FIXME: GtkCalendar bug workaround. If we select a month
- which has less days than the currently selected day, it
- causes a problem next time we set the day. */
- if (current_day > 28) {
- gtk_calendar_select_day (gcal->gtk_calendar, 28);
- set_day = TRUE;
- }
- gtk_calendar_select_month (gcal->gtk_calendar, new_month,
- new_year);
- }
-
- /* If the day doesn't match, update it. */
- if (new_day != current_day || set_day)
- gtk_calendar_select_day (gcal->gtk_calendar, new_day);
-
- gtk_signal_handler_unblock (GTK_OBJECT (gcal->gtk_calendar),
- gcal->day_selected_id);
-}
-
-static void
-gnome_calendar_on_day_selected (GtkCalendar *calendar,
- GnomeCalendar *gcal)
-{
- gint y, m, d;
- struct tm tm;
-
- gtk_calendar_get_date (calendar, &y, &m, &d);
-
- tm.tm_year = y - 1900;
- tm.tm_mon = m;
- tm.tm_mday = d;
- tm.tm_hour = 5; /* for daylight savings time fix */
- tm.tm_min = 0;
- tm.tm_sec = 0;
-
- gnome_calendar_goto (gcal, mktime (&tm));
-}
-
-
-static void
-gnome_calendar_on_month_changed (GtkCalendar *calendar,
- GnomeCalendar *gcal)
-{
- gnome_calendar_tag_calendar (gcal, gcal->gtk_calendar);
-}
diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h
deleted file mode 100644
index df087395e1..0000000000
--- a/calendar/gui/gnome-cal.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * GnomeCalendar widget
- * Copyright (C) 1998 the Free Software Foundation
- *
- * Authors: Miguel de Icaza (miguel@kernel.org)
- * Federico Mena-Quintero <federico@helixcode.com>
- */
-
-#ifndef GNOME_CALENDAR_APP_H
-#define GNOME_CALENDAR_APP_H
-
-#include <time.h>
-#include <gtk/gtkcalendar.h>
-#include <gtk/gtkvbox.h>
-#include <libgnome/gnome-defs.h>
-#include <bonobo.h>
-#include <cal-client/cal-client.h>
-
-BEGIN_GNOME_DECLS
-
-
-
-#define GNOME_CALENDAR(obj) GTK_CHECK_CAST(obj, gnome_calendar_get_type(), GnomeCalendar)
-#define GNOME_CALENDAR_CLASS(class) GTK_CHECK_CAST_CLASS(class, gnome_calendar_get_type(), GnomeCalendarClass)
-#define GNOME_IS_CALENDAR(obj) GTK_CHECK_TYPE(obj, gnome_calendar_get_type())
-
-#define GNOME_CALENDAR_NUM_VIEWS 4
-
-typedef struct {
- GtkVBox vbox;
-
- CalClient *client;
-
- BonoboPropertyBag *properties;
- BonoboControl *control;
-
- GHashTable *object_editor_hash;
-
- time_t selection_start_time;
- time_t selection_end_time;
-
- GtkWidget *main_notebook;
- GtkWidget *sub_notebook;
- GtkWidget *hpane;
- GtkCalendar *gtk_calendar;
- GtkWidget *todo;
-
- GtkWidget *day_view;
- GtkWidget *work_week_view;
- GtkWidget *week_view;
- GtkWidget *month_view;
-
- GtkWidget *view_toolbar_buttons[GNOME_CALENDAR_NUM_VIEWS];
-
- void *event_editor;
-
- /* The signal handler id for our GtkCalendar "day_selected" handler. */
- guint day_selected_id;
-
- /* Alarm ID for the midnight refresh function */
- gpointer midnight_alarm_refresh_id;
-
- /* UID->alarms hash */
- GHashTable *alarms;
-} GnomeCalendar;
-
-typedef struct {
- GtkVBoxClass parent_class;
-} GnomeCalendarClass;
-
-
-typedef enum {
- CALENDAR_OPEN,
- CALENDAR_OPEN_OR_CREATE
-} GnomeCalendarOpenMode;
-
-guint gnome_calendar_get_type (void);
-GtkWidget *gnome_calendar_new (char *title);
-int gnome_calendar_open (GnomeCalendar *gcal,
- char *file,
- GnomeCalendarOpenMode gcom);
-/*
-int gnome_calendar_create (GnomeCalendar *gcal,
- char *file);
-*/
-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);
-void gnome_calendar_tag_calendar (GnomeCalendar *cal,
- GtkCalendar *gtk_cal);
-char *gnome_calendar_get_current_view_name (GnomeCalendar *gcal);
-void gnome_calendar_set_view (GnomeCalendar *gcal,
- char *page_name);
-
-void gnome_calendar_set_selected_time_range (GnomeCalendar *gcal,
- time_t start_time,
- time_t end_time);
-
-void gnome_calendar_edit_object (GnomeCalendar *gcal,
- CalComponent *comp);
-
-void gnome_calendar_new_appointment (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);
-
-
-/* Notifies the calendar that the time format has changed and it must update all its views */
-void gnome_calendar_time_format_changed (GnomeCalendar *gcal);
-
-/* Notifies the calendar that the todo list properties have changed and its time
- * to update the views.
- */
-void gnome_calendar_colors_changed (GnomeCalendar *gcal);
-
-/* Notifies the calendar that the todo list properties have changed and its time
- * to update the views.
- */
-void gnome_calendar_todo_properties_changed (GnomeCalendar *gcal);
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/gui/gnome-cal.html b/calendar/gui/gnome-cal.html
deleted file mode 100644
index 5a7d0a537f..0000000000
--- a/calendar/gui/gnome-cal.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!-- Some simple instructions on how to use the help browser -->
-<BODY>
-<!-- <TITLE>GNOME Calendar Documentation</TITLE> -->
-<H2> GNOME Calendar Documentation </H2>
-<p>
-The GNOME calendar program is the calendaring program of the GNOME
-system. It uses the vCalendar standard for transfering calendar
-information (and is also the on-disk format used).
-
-<p>
-
-<a name="cmdline">
-<h2>Command line options</h2>
-
-Several options are available on the command line, they are:
-<ul>
- <li><tt>--events</tt> Displays the events for the date
- specified (or today, if no date is specified).
-
- <li><tt>--from DATE</tt> Define the beginning of the range for
- the event display, or the startup day on the calenday views.
- By default, the event will span the whole day specified in
- DATE.
-
- <li><tt>--to DATE</tt> Define the range end for the event
- display. If this is not specified, it will default to the end
- of the day specified by the <tt>--from</tt> option.
-
- <li><tt>--file FILE</tt> Set the calendar to the FILE
- specified on the command line.
-
- <li><tt>--todo</tt> Dumps the to-do values to standard output.
-</ul>
-
-<p>
-
-DATE is interpreted as being in the local time- zone, unless a
-specific timezone is specified. Examples of valid date specifications
-include: "1 month ago", "2 hours ago", "400000 seconds ago", "last
-year", "last Monday", "yesterday", "a fortnight ago", "3/31/92
-10:00:07 PST", "January 23, 1987 10:05pm", "22:00 GMT".
-
-</BODY>
-
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/gnome-month-item.c b/calendar/gui/gnome-month-item.c
deleted file mode 100644
index 58e393e4ee..0000000000
--- a/calendar/gui/gnome-month-item.c
+++ /dev/null
@@ -1,1246 +0,0 @@
-/* General-purpose monthly calendar canvas item for GNOME
- *
- * Copyright (C) 1998 Red Hat Software, Inc.
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- */
-
-#include <config.h>
-#include <math.h>
-#include <time.h>
-#include <gnome.h>
-#include "gnome-month-item.h"
-
-
-#define DEFAULT_FONT "-*-helvetica-medium-r-normal--10-*-*-*-p-*-*-*"
-
-
-/* Number of days in a month, for normal and leap years */
-static const int days_in_month[2][12] = {
- { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
- { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
-};
-
-/* 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 REFORMATION_DAY 639787 /* First day of the reformation, counted from 1 Jan 1 */
-#define MISSING_DAYS 11 /* They corrected out 11 days */
-#define THURSDAY 4 /* First day of reformation */
-#define SATURDAY 6 /* Offset value; 1 Jan 1 was a Saturday */
-#define SEPT_1752_START 2 /* Start day within month */
-#define SEPT_1752_END 20 /* End day within month */
-
-
-enum {
- ARG_0,
- ARG_YEAR,
- ARG_MONTH,
- ARG_X,
- ARG_Y,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_ANCHOR,
- ARG_HEAD_PADDING,
- ARG_DAY_PADDING,
- ARG_DAY_NAMES,
- ARG_HEADING_HEIGHT,
- ARG_HEADING_ANCHOR,
- ARG_DAY_ANCHOR,
- ARG_START_ON_MONDAY,
- ARG_HEAD_FONT,
- ARG_HEAD_FONTSET,
- ARG_HEAD_FONT_GDK,
- ARG_DAY_FONT,
- ARG_DAY_FONTSET,
- ARG_DAY_FONT_GDK,
- ARG_HEAD_COLOR,
- ARG_HEAD_COLOR_GDK,
- ARG_OUTLINE_COLOR,
- ARG_OUTLINE_COLOR_GDK,
- ARG_DAY_BOX_COLOR,
- ARG_DAY_BOX_COLOR_GDK,
- ARG_DAY_COLOR,
- ARG_DAY_COLOR_GDK
-};
-
-
-static void gnome_month_item_class_init (GnomeMonthItemClass *class);
-static void gnome_month_item_init (GnomeMonthItem *mitem);
-static void gnome_month_item_destroy (GtkObject *object);
-static void gnome_month_item_set_arg (GtkObject *object,
- GtkArg *arg,
- guint arg_id);
-static void gnome_month_item_get_arg (GtkObject *object,
- GtkArg *arg,
- guint arg_id);
-
-
-
-static GnomeCanvasGroupClass *parent_class;
-
-
-GtkType
-gnome_month_item_get_type (void)
-{
- static GtkType month_item_type = 0;
-
- if (!month_item_type) {
- GtkTypeInfo month_item_info = {
- "GnomeMonthItem",
- sizeof (GnomeMonthItem),
- sizeof (GnomeMonthItemClass),
- (GtkClassInitFunc) gnome_month_item_class_init,
- (GtkObjectInitFunc) gnome_month_item_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- month_item_type = gtk_type_unique (gnome_canvas_group_get_type (), &month_item_info);
- }
-
- return month_item_type;
-}
-
-static void
-gnome_month_item_class_init (GnomeMonthItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- gtk_object_add_arg_type ("GnomeMonthItem::year", GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_YEAR);
- gtk_object_add_arg_type ("GnomeMonthItem::month", GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_MONTH);
- gtk_object_add_arg_type ("GnomeMonthItem::x", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_X);
- gtk_object_add_arg_type ("GnomeMonthItem::y", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_Y);
- gtk_object_add_arg_type ("GnomeMonthItem::width", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("GnomeMonthItem::height", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_HEIGHT);
- gtk_object_add_arg_type ("GnomeMonthItem::anchor", GTK_TYPE_ANCHOR_TYPE, GTK_ARG_READWRITE, ARG_ANCHOR);
- gtk_object_add_arg_type ("GnomeMonthItem::heading_padding", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_HEAD_PADDING);
- gtk_object_add_arg_type ("GnomeMonthItem::day_padding", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_DAY_PADDING);
- gtk_object_add_arg_type ("GnomeMonthItem::day_names", GTK_TYPE_POINTER, GTK_ARG_WRITABLE, ARG_DAY_NAMES);
- gtk_object_add_arg_type ("GnomeMonthItem::heading_height", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_HEADING_HEIGHT);
- gtk_object_add_arg_type ("GnomeMonthItem::heading_anchor", GTK_TYPE_ANCHOR_TYPE, GTK_ARG_READWRITE, ARG_HEADING_ANCHOR);
- gtk_object_add_arg_type ("GnomeMonthItem::day_anchor", GTK_TYPE_ANCHOR_TYPE, GTK_ARG_READWRITE, ARG_DAY_ANCHOR);
- gtk_object_add_arg_type ("GnomeMonthItem::start_on_monday", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_START_ON_MONDAY);
- gtk_object_add_arg_type ("GnomeMonthItem::heading_font", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_HEAD_FONT);
- gtk_object_add_arg_type ("GnomeMonthItem::heading_fontset", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_HEAD_FONTSET);
- gtk_object_add_arg_type ("GnomeMonthItem::heading_font_gdk", GTK_TYPE_GDK_FONT, GTK_ARG_READWRITE, ARG_HEAD_FONT_GDK);
- gtk_object_add_arg_type ("GnomeMonthItem::day_font", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_DAY_FONT);
- gtk_object_add_arg_type ("GnomeMonthItem::day_fontset", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_DAY_FONTSET);
- gtk_object_add_arg_type ("GnomeMonthItem::day_font_gdk", GTK_TYPE_GDK_FONT, GTK_ARG_READWRITE, ARG_DAY_FONT_GDK);
- gtk_object_add_arg_type ("GnomeMonthItem::heading_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_HEAD_COLOR);
- gtk_object_add_arg_type ("GnomeMonthItem::heading_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_HEAD_COLOR_GDK);
- gtk_object_add_arg_type ("GnomeMonthItem::outline_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_OUTLINE_COLOR);
- gtk_object_add_arg_type ("GnomeMonthItem::outline_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_OUTLINE_COLOR_GDK);
- gtk_object_add_arg_type ("GnomeMonthItem::day_box_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_DAY_BOX_COLOR);
- gtk_object_add_arg_type ("GnomeMonthItem::day_box_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_DAY_BOX_COLOR_GDK);
- gtk_object_add_arg_type ("GnomeMonthItem::day_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_DAY_COLOR);
- gtk_object_add_arg_type ("GnomeMonthItem::day_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_DAY_COLOR_GDK);
-
- object_class->destroy = gnome_month_item_destroy;
- object_class->set_arg = gnome_month_item_set_arg;
- object_class->get_arg = gnome_month_item_get_arg;
-}
-
-/* Calculates the minimum heading height based on the heading font size and padding. It also
- * calculates the minimum width of the month item based on the width of the headings.
- */
-static void
-check_heading_sizes (GnomeMonthItem *mitem)
-{
- double m_height;
- double m_width;
- int width;
- int max_width;
- int i;
-
- /* Calculate minimum height */
-
- m_height = mitem->head_font->ascent + mitem->head_font->descent + 2 * mitem->head_padding;
-
- if (mitem->head_height < m_height)
- mitem->head_height = m_height;
-
- /* Go through each heading and remember the widest one */
-
- max_width = 0;
-
- for (i = 0; i < 7; i++) {
- width = gdk_string_width (mitem->head_font, mitem->day_names[i]);
- if (max_width < width)
- max_width = width;
- }
-
- m_width = 7 * (max_width + 2 * mitem->head_padding);
-
- if (mitem->width < m_width)
- mitem->width = m_width;
-}
-
-/* Calculates the minimum width and height of the month item based on the day font size and padding.
- * Assumes that the minimum heading height has already been computed.
- */
-static void
-check_day_sizes (GnomeMonthItem *mitem)
-{
- double m_height;
- double m_width;
- int width;
- int max_width;
- char buf[100];
- int i;
-
- /* Calculate minimum height */
-
- m_height = mitem->head_height + 6 * (mitem->day_font->ascent + mitem->day_font->descent + 2 * mitem->day_padding);
-
- if (mitem->height < m_height)
- mitem->height = m_height;
-
- /* Calculate minimum width */
-
- max_width = 0;
-
- for (i = 1; i < 32; i++) {
- sprintf (buf, "%d", i);
- width = gdk_string_width (mitem->day_font, buf);
- if (max_width < width)
- max_width = width;
- }
-
- m_width = 7 * (max_width + 2 * mitem->day_padding);
-
- if (mitem->width < m_width)
- mitem->width = m_width;
-}
-
-/* Calculates the minimum size of the month item based on the font sizes and paddings. If the
- * current size of the month item is smaller than the required minimum size, this function will
- * change the size to the appropriate values.
- */
-static void
-check_sizes (GnomeMonthItem *mitem)
-{
- check_heading_sizes (mitem);
- check_day_sizes (mitem);
-}
-
-/* Recalculates the position of the toplevel calendar group based on the logical position and anchor */
-static void
-reanchor (GnomeMonthItem *mitem)
-{
- double x, y;
-
- x = mitem->x;
- y = mitem->y;
-
- switch (mitem->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- x -= mitem->width / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- x -= mitem->width;
- break;
- }
-
- switch (mitem->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- y -= mitem->height / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- y -= mitem->height;
- break;
- }
-
- /* Explicitly use the canvas group class prefix since the month item class has x and y
- * arguments as well.
- */
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
- "GnomeCanvasGroup::x", x,
- "GnomeCanvasGroup::y", y,
- NULL);
-}
-
-/* Takes an anchor specification and the corners of a rectangle, and returns an anchored point with
- * respect to that rectangle.
- */
-static void
-get_label_anchor (GtkAnchorType anchor, double x1, double y1, double x2, double y2, double *x, double *y)
-{
- switch (anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- *x = x1;
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- *x = (x1 + x2) / 2.0;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- *x = x2;
- break;
- }
-
- switch (anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- *y = y1;
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- *y = (y1 + y2) / 2.0;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- *y = y2;
- break;
- }
-}
-
-/* Resets the position of the day name headings in the calendar */
-static void
-reshape_headings (GnomeMonthItem *mitem)
-{
- double width;
- int i;
- double x, y;
-
- width = mitem->width / 7;
-
- for (i = 0; i < 7; i++) {
- /* Group */
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_GROUP + i],
- "x", width * i,
- "y", 0.0,
- NULL);
-
- /* Box */
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_BOX + i],
- "x1", 0.0,
- "y1", 0.0,
- "x2", width,
- "y2", mitem->head_height,
- NULL);
-
- /* Label */
- get_label_anchor (mitem->head_anchor,
- mitem->head_padding,
- mitem->head_padding,
- width - mitem->head_padding,
- mitem->head_height - mitem->head_padding,
- &x, &y);
-
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_LABEL + i],
- "x", x,
- "y", y,
- "anchor", mitem->head_anchor,
- NULL);
- }
-}
-
-/* Resets the position of the days in the calendar */
-static void
-reshape_days (GnomeMonthItem *mitem)
-{
- double width, height;
- double x, y;
- int row, col;
- int i;
-
- width = mitem->width / 7;
- height = (mitem->height - mitem->head_height) / 6;
-
- i = 0;
-
- for (row = 0; row < 6; row++)
- for (col = 0; col < 7; col++) {
- /* Group */
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_GROUP + i],
- "x", width * col,
- "y", mitem->head_height + height * row,
- NULL);
-
- /* Box */
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_BOX + i],
- "x1", 0.0,
- "y1", 0.0,
- "x2", width,
- "y2", height,
- NULL);
-
- /* Label */
- get_label_anchor (mitem->day_anchor,
- mitem->day_padding,
- mitem->day_padding,
- width - mitem->day_padding,
- height - mitem->day_padding,
- &x, &y);
-
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_LABEL + i],
- "x", x,
- "y", y,
- "anchor", mitem->day_anchor,
- NULL);
-
- i++;
- }
-}
-
-/* Changes the positions and resizes the items in the calendar to match the new size of the
- * calendar.
- */
-static void
-reshape (GnomeMonthItem *mitem)
-{
- check_sizes (mitem);
- reanchor (mitem);
- reshape_headings (mitem);
- reshape_days (mitem);
-}
-
-/* Sets the font for all the day headings */
-static void
-set_head_font (GnomeMonthItem *mitem)
-{
- int i;
-
- for (i = 0; i < 7; i++)
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_LABEL + i],
- "font_gdk", mitem->head_font,
- NULL);
-}
-
-/* Sets the color for all the headings */
-static void
-set_head_color (GnomeMonthItem *mitem)
-{
- int i;
- GdkColor outline;
- GdkColor head;
-
- outline.pixel = mitem->outline_pixel;
- head.pixel = mitem->head_pixel;
-
- for (i = 0; i < 7; i++) {
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_BOX + i],
- "fill_color_gdk", &outline,
- NULL);
-
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_LABEL + i],
- "fill_color_gdk", &head,
- NULL);
- }
-}
-
-/* Creates the items for the day name headings */
-static void
-create_headings (GnomeMonthItem *mitem)
-{
- int i;
-
- /* Just create the items; they will be positioned and configured by a call to reshape() */
-
- for (i = 0; i < 7; i++) {
- /* Group */
- mitem->items[GNOME_MONTH_ITEM_HEAD_GROUP + i] =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem),
- gnome_canvas_group_get_type (),
- NULL);
-
- /* Box */
- mitem->items[GNOME_MONTH_ITEM_HEAD_BOX + i] =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[GNOME_MONTH_ITEM_HEAD_GROUP + i]),
- gnome_canvas_rect_get_type (),
- NULL);
-
- /* Label */
- mitem->items[GNOME_MONTH_ITEM_HEAD_LABEL + i] =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[GNOME_MONTH_ITEM_HEAD_GROUP + i]),
- gnome_canvas_text_get_type (),
- NULL);
- }
-
- set_head_font (mitem);
- set_head_color (mitem);
-}
-
-/* Returns the number of leap years since year 1 up to (but not including) the specified year */
-static int
-leap_years_up_to (int year)
-{
- return (year / 4 /* trivial leapness */
- - ((year > 1700) ? (year / 100 - 17) : 0) /* minus centuries since 1700 */
- + ((year > 1600) ? ((year - 1600) / 400) : 0)); /* plus centuries since 1700 divisible by 400 */
-}
-
-/* Returns whether the specified year is a leap year */
-static int
-is_leap_year (int year)
-{
- if (year <= 1752)
- return !(year % 4);
- else
- return (!(year % 4) && (year % 100)) || !(year % 400);
-}
-
-/* Returns the 1-based day number within the year of the specified date */
-static int
-day_in_year (int day, int month, int year)
-{
- int is_leap, i;
-
- is_leap = is_leap_year (year);
-
- for (i = 0; i < month; i++)
- day += days_in_month [is_leap][i];
-
- return day;
-}
-
-/* Returns the day of the week (zero-based, zero is Sunday) for the specified date. For the days
- * that were removed on the Gregorian reformation, it returns Thursday.
- */
-static int
-day_in_week (int day, int month, int year)
-{
- int n;
-
- n = (year - 1) * 365 + leap_years_up_to (year - 1) + day_in_year (day, month, year);
-
- if (n < REFORMATION_DAY)
- return (n - 1 + SATURDAY) % 7;
-
- if (n >= (REFORMATION_DAY + MISSING_DAYS))
- return (n - 1 + SATURDAY - MISSING_DAYS) % 7;
-
- return THURSDAY;
-}
-
-/* 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 start_on_monday, int *days, int *start, int *end)
-{
- int i;
- int d_month, d_week;
-
- /* 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 = days_in_month[is_leap_year (year)][month];
- d_week = day_in_week (1, month, year);
-
- if (start_on_monday)
- d_week = (d_week + 6) % 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;
-}
-
-/* Set the day numbers in the monthly calendar */
-static void
-set_days (GnomeMonthItem *mitem)
-{
- int i;
- int start, end;
- char buf[100];
-
- build_month (mitem->month, mitem->year, mitem->start_on_monday, mitem->day_numbers, &start, &end);
-
- /* Clear days before start of month */
-
- for (i = 0; i < start; i++)
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_LABEL + i],
- "text", NULL,
- NULL);
-
- /* Set days of month */
-
- for (; start <= end; start++, i++) {
- sprintf (buf, "%d", mitem->day_numbers[start]);
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_LABEL + i],
- "text", buf,
- NULL);
- }
-
- /* Clear days after end of month */
-
- for (; i < 42; i++)
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_LABEL + i],
- "text", NULL,
- NULL);
-}
-
-/* Sets the font for all the day numbers */
-static void
-set_day_font (GnomeMonthItem *mitem)
-{
- int i;
-
- for (i = 0; i < 42; i++)
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_LABEL + i],
- "font_gdk", mitem->day_font,
- NULL);
-}
-
-/* Sets the color for all the day items */
-static void
-set_day_color (GnomeMonthItem *mitem)
-{
- int i;
- GdkColor outline;
- GdkColor day_box;
- GdkColor day;
-
- outline.pixel = mitem->outline_pixel;
- day_box.pixel = mitem->day_box_pixel;
- day.pixel = mitem->day_pixel;
-
- for (i = 0; i < 42; i++) {
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_BOX + i],
- "outline_color_gdk", &outline,
- "fill_color_gdk", &day_box,
- NULL);
-
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_LABEL + i],
- "fill_color_gdk", &day,
- NULL);
- }
-}
-
-/* Creates the items for the days */
-static void
-create_days (GnomeMonthItem *mitem)
-{
- int i;
-
- /* Just create the items; they will be positioned and configured by a call to reshape() */
-
- for (i = 0; i < 42; i++) {
- /* Group */
- mitem->items[GNOME_MONTH_ITEM_DAY_GROUP + i] =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem),
- gnome_canvas_group_get_type (),
- NULL);
-
- /* Box */
- mitem->items[GNOME_MONTH_ITEM_DAY_BOX + i] =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[GNOME_MONTH_ITEM_DAY_GROUP + i]),
- gnome_canvas_rect_get_type (),
- NULL);
-
- /* Label */
- mitem->items[GNOME_MONTH_ITEM_DAY_LABEL + i] =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[GNOME_MONTH_ITEM_DAY_GROUP + i]),
- gnome_canvas_text_get_type (),
- NULL);
- }
-
- set_day_font (mitem);
- set_day_color (mitem);
- set_days (mitem);
-}
-
-/* Resets the text of the day name headings */
-static void
-set_day_names (GnomeMonthItem *mitem)
-{
- int i;
-
- for (i = 0; i < 7; i++)
- gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_LABEL + i],
- "text", mitem->day_names[mitem->start_on_monday ? ((i + 1) % 7) : i],
- NULL);
-}
-
-/* Creates all the canvas items that make up the calendar */
-static void
-create_items (GnomeMonthItem *mitem)
-{
- mitem->items = g_new (GnomeCanvasItem *, GNOME_MONTH_ITEM_LAST);
-
- create_headings (mitem);
- create_days (mitem);
-
- /* Initialize by default to three-letter day names */
-
- mitem->day_names[0] = g_strdup (_("Sun"));
- mitem->day_names[1] = g_strdup (_("Mon"));
- mitem->day_names[2] = g_strdup (_("Tue"));
- mitem->day_names[3] = g_strdup (_("Wed"));
- mitem->day_names[4] = g_strdup (_("Thu"));
- mitem->day_names[5] = g_strdup (_("Fri"));
- mitem->day_names[6] = g_strdup (_("Sat"));
-
- set_day_names (mitem);
- reshape (mitem);
-}
-
-static void
-gnome_month_item_init (GnomeMonthItem *mitem)
-{
- time_t t;
- struct tm tm;
-
- /* Initialize to the current month by default */
-
- t = time (NULL);
- tm = *localtime (&t);
-
- mitem->year = tm.tm_year + 1900;
- mitem->month = tm.tm_mon;
-
- mitem->x = 0.0;
- mitem->y = 0.0;
- mitem->width = 150.0; /* not unreasonable defaults, I hope */
- mitem->height = 100.0;
- mitem->anchor = GTK_ANCHOR_NW;
- mitem->head_padding = 0.0;
- mitem->day_padding = 2.0;
- mitem->head_height = 14.0;
- mitem->head_anchor = GTK_ANCHOR_CENTER;
- mitem->day_anchor = GTK_ANCHOR_CENTER;
-
- /* Load the default fonts */
-
- mitem->head_font = gdk_font_load (DEFAULT_FONT);
- if (!mitem->head_font) {
- mitem->head_font = gdk_font_load ("fixed");
- g_assert (mitem->head_font != NULL);
- }
-
- mitem->day_font = gdk_font_load (DEFAULT_FONT);
- if (!mitem->day_font) {
- mitem->day_font = gdk_font_load ("fixed");
- g_assert (mitem->day_font != NULL);
- }
-}
-
-GnomeCanvasItem *
-gnome_month_item_new (GnomeCanvasGroup *parent)
-{
- GnomeMonthItem *mitem;
-
- g_return_val_if_fail (parent != NULL, NULL);
- g_return_val_if_fail (GNOME_IS_CANVAS_GROUP (parent), NULL);
-
- mitem = GNOME_MONTH_ITEM (gnome_canvas_item_new (parent,
- gnome_month_item_get_type (),
- NULL));
-
- gnome_month_item_construct (mitem);
-
- return GNOME_CANVAS_ITEM (mitem);
-}
-
-void
-gnome_month_item_construct (GnomeMonthItem *mitem)
-{
- GdkColor color;
-
- g_return_if_fail (mitem != NULL);
- g_return_if_fail (GNOME_IS_MONTH_ITEM (mitem));
-
- gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, "#d6d6d6d6d6d6", &color);
- mitem->head_pixel = color.pixel;
- mitem->day_box_pixel = color.pixel;
-
- gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, "black", &color);
- mitem->outline_pixel = color.pixel;
- mitem->day_pixel = color.pixel;
-
- create_items (mitem);
-}
-
-static void
-free_day_names (GnomeMonthItem *mitem)
-{
- int i;
-
- if (mitem->day_names[0])
- for (i = 0; i < 7; i++)
- g_free (mitem->day_names[i]);
-}
-
-static void
-gnome_month_item_destroy (GtkObject *object)
-{
- GnomeMonthItem *mitem;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_MONTH_ITEM (object));
-
- mitem = GNOME_MONTH_ITEM (object);
-
- free_day_names (mitem);
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-/* Sets the color of the specified pixel value to that of the specified argument, which must be in
- * GdkColor format if format is TRUE, otherwise it must be in string format.
- */
-static void
-set_color_arg (GnomeMonthItem *mitem, gulong *pixel, GtkArg *arg, int gdk_format, int set_head, int set_day)
-{
- GdkColor color;
-
- if (gdk_format)
- *pixel = ((GdkColor *) GTK_VALUE_BOXED (*arg))->pixel;
- else {
- if (gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, GTK_VALUE_STRING (*arg), &color))
- *pixel = color.pixel;
- else
- *pixel = 0;
- }
-
- if (set_head)
- set_head_color (mitem);
-
- if (set_day)
- set_day_color (mitem);
-}
-
-static void
-gnome_month_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- GnomeMonthItem *mitem;
- char **day_names;
- int i;
-
- mitem = GNOME_MONTH_ITEM (object);
-
- switch (arg_id) {
- case ARG_YEAR:
- mitem->year = GTK_VALUE_UINT (*arg);
- set_days (mitem);
- break;
-
- case ARG_MONTH:
- mitem->month = GTK_VALUE_UINT (*arg);
- set_days (mitem);
- break;
-
- case ARG_X:
- mitem->x = GTK_VALUE_DOUBLE (*arg);
- reanchor (mitem);
- break;
-
- case ARG_Y:
- mitem->y = GTK_VALUE_DOUBLE (*arg);
- reanchor (mitem);
- break;
-
- case ARG_WIDTH:
- mitem->width = fabs (GTK_VALUE_DOUBLE (*arg));
- reshape (mitem);
- break;
-
- case ARG_HEIGHT:
- mitem->height = fabs (GTK_VALUE_DOUBLE (*arg));
- reshape (mitem);
- break;
-
- case ARG_ANCHOR:
- mitem->anchor = GTK_VALUE_ENUM (*arg);
- reanchor (mitem);
- break;
-
- case ARG_HEAD_PADDING:
- mitem->head_padding = fabs (GTK_VALUE_DOUBLE (*arg));
- reshape (mitem);
- break;
-
- case ARG_DAY_PADDING:
- mitem->day_padding = fabs (GTK_VALUE_DOUBLE (*arg));
- reshape (mitem);
- break;
-
- case ARG_DAY_NAMES:
- day_names = GTK_VALUE_POINTER (*arg);
-
- /* First, check that none of the names is null */
-
- for (i = 0; i < 7; i++)
- if (!day_names[i]) {
- g_warning ("Day number %d was NULL; day names cannot be NULL!", i);
- return;
- }
-
- /* Set the new names */
-
- free_day_names (mitem);
- for (i = 0; i < 7; i++)
- mitem->day_names[i] = g_strdup (day_names[i]);
-
- set_day_names (mitem);
- reshape (mitem);
- break;
-
- case ARG_HEADING_HEIGHT:
- mitem->head_height = fabs (GTK_VALUE_DOUBLE (*arg));
- reshape (mitem);
- break;
-
- case ARG_HEADING_ANCHOR:
- mitem->head_anchor = GTK_VALUE_ENUM (*arg);
- reshape (mitem);
- break;
-
- case ARG_DAY_ANCHOR:
- mitem->day_anchor = GTK_VALUE_ENUM (*arg);
- reshape (mitem);
- break;
-
- case ARG_START_ON_MONDAY:
- mitem->start_on_monday = GTK_VALUE_BOOL (*arg);
- set_day_names (mitem);
- set_days (mitem);
- break;
-
- case ARG_HEAD_FONT:
- gdk_font_unref (mitem->head_font);
-
- mitem->head_font = gdk_font_load (GTK_VALUE_STRING (*arg));
- if (!mitem->head_font) {
- mitem->head_font = gdk_font_load ("fixed");
- g_assert (mitem->head_font != NULL);
- }
-
- set_head_font (mitem);
- reshape (mitem);
- break;
-
- case ARG_HEAD_FONTSET:
- gdk_font_unref (mitem->head_font);
-
- mitem->head_font = gdk_fontset_load (GTK_VALUE_STRING (*arg));
- if (!mitem->head_font) {
- mitem->head_font =
- gdk_fontset_load ("-*-fixed-medium-r-semicondensed--13-120-75-75-c-60-*-*");
- g_assert (mitem->head_font != NULL);
- }
-
- set_head_font (mitem);
- reshape (mitem);
- break;
-
- case ARG_HEAD_FONT_GDK:
- gdk_font_unref (mitem->head_font);
-
- mitem->head_font = GTK_VALUE_BOXED (*arg);
- gdk_font_ref (mitem->head_font);
- set_head_font (mitem);
- reshape (mitem);
- break;
-
- case ARG_DAY_FONT:
- gdk_font_unref (mitem->day_font);
-
- mitem->day_font = gdk_font_load (GTK_VALUE_STRING (*arg));
- if (!mitem->day_font) {
- mitem->day_font = gdk_font_load ("fixed");
- g_assert (mitem->day_font != NULL);
- }
-
- set_day_font (mitem);
- reshape (mitem);
- break;
-
- case ARG_DAY_FONTSET:
- gdk_font_unref (mitem->day_font);
-
- mitem->day_font = gdk_fontset_load (GTK_VALUE_STRING (*arg));
- if (!mitem->day_font) {
- mitem->day_font =
- gdk_fontset_load ("-*-fixed-medium-r-semicondensed--13-120-75-75-c-60-*-*");
- g_assert (mitem->day_font != NULL);
- }
-
- set_day_font (mitem);
- reshape (mitem);
- break;
-
- case ARG_DAY_FONT_GDK:
- gdk_font_unref (mitem->day_font);
-
- mitem->day_font = GTK_VALUE_BOXED (*arg);
- gdk_font_ref (mitem->day_font);
- set_day_font (mitem);
- reshape (mitem);
- break;
-
- case ARG_HEAD_COLOR:
- set_color_arg (mitem, &mitem->head_pixel, arg, FALSE, TRUE, FALSE);
- break;
-
- case ARG_HEAD_COLOR_GDK:
- set_color_arg (mitem, &mitem->head_pixel, arg, TRUE, TRUE, FALSE);
- break;
-
- case ARG_OUTLINE_COLOR:
- set_color_arg (mitem, &mitem->outline_pixel, arg, FALSE, TRUE, TRUE);
- break;
-
- case ARG_OUTLINE_COLOR_GDK:
- set_color_arg (mitem, &mitem->outline_pixel, arg, TRUE, TRUE, TRUE);
- break;
-
- case ARG_DAY_BOX_COLOR:
- set_color_arg (mitem, &mitem->day_box_pixel, arg, FALSE, FALSE, TRUE);
- break;
-
- case ARG_DAY_BOX_COLOR_GDK:
- set_color_arg (mitem, &mitem->day_box_pixel, arg, TRUE, FALSE, TRUE);
- break;
-
- case ARG_DAY_COLOR:
- set_color_arg (mitem, &mitem->day_pixel, arg, FALSE, FALSE, TRUE);
- break;
-
- case ARG_DAY_COLOR_GDK:
- set_color_arg (mitem, &mitem->day_pixel, arg, TRUE, FALSE, TRUE);
- break;
-
- default:
- break;
- }
-}
-
-/* Allocates a GdkColor structure filled with the specified pixel, and puts it into the specified
- * arg for returning it in the get_arg method.
- */
-static void
-get_color_arg (GnomeMonthItem *mitem, gulong pixel, GtkArg *arg)
-{
- GdkColor *color;
-
- color = g_new (GdkColor, 1);
- color->pixel = pixel;
- gdk_color_context_query_color (GNOME_CANVAS_ITEM (mitem)->canvas->cc, color);
- GTK_VALUE_BOXED (*arg) = color;
-}
-
-static void
-gnome_month_item_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- GnomeMonthItem *mitem;
-
- mitem = GNOME_MONTH_ITEM (object);
-
- switch (arg_id) {
- case ARG_YEAR:
- GTK_VALUE_UINT (*arg) = mitem->year;
- break;
-
- case ARG_MONTH:
- GTK_VALUE_UINT (*arg) = mitem->month;
- break;
-
- case ARG_X:
- GTK_VALUE_DOUBLE (*arg) = mitem->x;
- break;
-
- case ARG_Y:
- GTK_VALUE_DOUBLE (*arg) = mitem->y;
- break;
-
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = mitem->width;
- break;
-
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = mitem->height;
- break;
-
- case ARG_ANCHOR:
- GTK_VALUE_ENUM (*arg) = mitem->anchor;
- break;
-
- case ARG_HEAD_PADDING:
- GTK_VALUE_DOUBLE (*arg) = mitem->head_padding;
- break;
-
- case ARG_DAY_PADDING:
- GTK_VALUE_DOUBLE (*arg) = mitem->day_padding;
- break;
-
- case ARG_HEADING_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = mitem->head_height;
- break;
-
- case ARG_HEADING_ANCHOR:
- GTK_VALUE_ENUM (*arg) = mitem->head_anchor;
- break;
-
- case ARG_DAY_ANCHOR:
- GTK_VALUE_ENUM (*arg) = mitem->day_anchor;
- break;
-
- case ARG_START_ON_MONDAY:
- GTK_VALUE_BOOL (*arg) = mitem->start_on_monday;
- break;
-
- case ARG_HEAD_FONT_GDK:
- GTK_VALUE_BOXED (*arg) = mitem->head_font;
- break;
-
- case ARG_DAY_FONT_GDK:
- GTK_VALUE_BOXED (*arg) = mitem->day_font;
- break;
-
- case ARG_HEAD_COLOR_GDK:
- get_color_arg (mitem, mitem->head_pixel, arg);
- break;
-
- case ARG_OUTLINE_COLOR_GDK:
- get_color_arg (mitem, mitem->outline_pixel, arg);
- break;
-
- case ARG_DAY_BOX_COLOR_GDK:
- get_color_arg (mitem, mitem->day_box_pixel, arg);
- break;
-
- case ARG_DAY_COLOR_GDK:
- get_color_arg (mitem, mitem->day_pixel, arg);
- break;
-
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-GnomeCanvasItem *
-gnome_month_item_num2child (GnomeMonthItem *mitem, int child_num)
-{
- g_return_val_if_fail (mitem != NULL, NULL);
- g_return_val_if_fail (GNOME_IS_MONTH_ITEM (mitem), NULL);
-
- return mitem->items[child_num];
-}
-
-int
-gnome_month_item_child2num (GnomeMonthItem *mitem, GnomeCanvasItem *child)
-{
- int i;
-
- g_return_val_if_fail (mitem != NULL, -1);
- g_return_val_if_fail (GNOME_IS_MONTH_ITEM (mitem), -1);
- g_return_val_if_fail (child != NULL, -1);
- g_return_val_if_fail (GNOME_IS_CANVAS_ITEM (child), -1);
-
- for (i = 0; i < GNOME_MONTH_ITEM_LAST; i++)
- if (mitem->items[i] == child)
- return i;
-
- return -1;
-}
-
-int
-gnome_month_item_num2day (GnomeMonthItem *mitem, int child_num)
-{
- g_return_val_if_fail (mitem != NULL, 0);
- g_return_val_if_fail (GNOME_IS_MONTH_ITEM (mitem), 0);
-
- if ((child_num >= GNOME_MONTH_ITEM_DAY_GROUP) && (child_num < GNOME_MONTH_ITEM_LAST)) {
- child_num = (child_num - GNOME_MONTH_ITEM_DAY_GROUP) % 42;
- return mitem->day_numbers[child_num];
- } else
- return 0;
-}
-
-int
-gnome_month_item_day2index (GnomeMonthItem *mitem, int day_num)
-{
- int i;
-
- g_return_val_if_fail (mitem != NULL, -1);
- g_return_val_if_fail (GNOME_IS_MONTH_ITEM (mitem), -1);
- g_return_val_if_fail (day_num >= 1, -1);
-
- /* Find first day of month */
-
- for (i = 0; mitem->day_numbers[i] == 0; i++)
- ;
-
- /* Find the specified day */
-
- for (; (mitem->day_numbers[i] != 0) && (i < 42); i++)
- if (mitem->day_numbers[i] == day_num)
- return i;
-
- /* Bail out */
-
- return -1;
-}
diff --git a/calendar/gui/gnome-month-item.h b/calendar/gui/gnome-month-item.h
deleted file mode 100644
index 0ec4fd484c..0000000000
--- a/calendar/gui/gnome-month-item.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/* General-purpose monthly calendar canvas item for GNOME
- *
- * Copyright (C) 1998 Red Hat Software, Inc.
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- */
-
-#ifndef GNOME_MONTH_ITEM_H
-#define GNOME_MONTH_ITEM_H
-
-#include <libgnome/gnome-defs.h>
-#include <gtk/gtkpacker.h> /* why the hell is GtkAnchorType here and not in gtkenums.h? */
-#include <libgnomeui/gnome-canvas.h>
-
-
-BEGIN_GNOME_DECLS
-
-
-/* These values are used to identify the canvas items that make up a complete GnomeMonthItem, which
- * is made up of the following "pieces":
- *
- * Headings line:
- * - 7 GnomeCanvasGroups:
- * Each group contains one box (GnomeCanvasRectangle) and one label
- * (GnomeCanvasText)
- *
- * Day slots:
- * - 42 GnomeCanvasGroups:
- * Each group contains one box (GnomeCanvasRectangle) and one label
- * (GnomeCanvasText)
- *
- * The headings are organized from left to right. The day slots are organized as a table in
- * row-major order.
- *
- * If you want to access the individual items of the GnomeMonthItem, you can use these numbers with
- * the gnome_month_item_num2child() function. If you want to convert a number into the
- * corresponding GnomeCanvasItem, you can use the gnome_month_item_child2num() function.
- */
-typedef enum {
- GNOME_MONTH_ITEM_HEAD_GROUP = 0, /* 7 groups for headings */
- GNOME_MONTH_ITEM_HEAD_BOX = 7, /* 7 boxes for headings */
- GNOME_MONTH_ITEM_HEAD_LABEL = 14, /* 7 labels for headings */
- GNOME_MONTH_ITEM_DAY_GROUP = 21, /* 42 groups for days */
- GNOME_MONTH_ITEM_DAY_BOX = 63, /* 42 boxes for days */
- GNOME_MONTH_ITEM_DAY_LABEL = 105, /* 42 labels for days */
- GNOME_MONTH_ITEM_LAST = 147 /* total number of items */
-} GnomeMonthItemChild;
-
-/* The MonthItem canvas item defines a simple monthly calendar. It is made out of a number of
- * canvas items, which can be accessed using the functions provided. The monthly calendar is
- * anchored with respect to a point. The following arguments are available:
- *
- * name type read/write description
- * ------------------------------------------------------------------------------------------
- * year uint RW Full year (1-9999)
- * month uint RW Number of month (0-11)
- * x double RW X position of anchor point
- * y double RW Y position of anchor point
- * width double RW Width of calendar in canvas units
- * height double RW Height of calendar in canvas units
- * anchor GtkAnchorType RW Anchor side for calendar
- * heading_padding double RW Padding inside heading boxes
- * day_padding double RW Padding inside day boxes
- * day_names char ** W Array of strings corresponding to the day names (sun-sat)
- * heading_height double RW Height of headings bar in canvas units
- * heading_anchor GtkAnchorType RW Anchor side for headings inside heading boxes
- * day_anchor GtkAnchorType RW Anchor side for day numbers inside day boxes
- * start_on_monday boolean RW Specifies whether the week starts on Monday or Sunday
- * heading_font string W X logical font descriptor for the headings
- * heading_fontset string W X logical fontset descriptor for the headings
- * heading_font_gdk GdkFont * RW Pointer to GdkFont for the headings
- * day_font string W X logical font descriptor for the day numbers
- * day_fontset string W X logical fontset descriptor for the day numbers
- * day_font_gdk GdkFont * RW Pointer to GdkFont for the day numbers
- * heading_color string W X color specification for heading labels
- * heading_color_gdk GdkColor * RW Pointer to an allocated GdkColor for heading labels
- * outline_color string W X color specification for outline (lines and fill of heading boxes)
- * outline_color_gdk GdkColor * RW Pointer to an allocated GdkColor for outline
- * day_box_color string W X color specification for day boxes
- * day_box_color_gdk GdkColor * RW Pointer to an allocated GdkColor for day boxes
- * day_color string W X color specification for day number labels
- * day_color_gdk GdkColor * RW Pointer to an allocated GdkColor for day number labels
- */
-
-#define GNOME_TYPE_MONTH_ITEM (gnome_month_item_get_type ())
-#define GNOME_MONTH_ITEM(obj) (GTK_CHECK_CAST ((obj), GNOME_TYPE_MONTH_ITEM, GnomeMonthItem))
-#define GNOME_MONTH_ITEM_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GNOME_TYPE_MONTH_ITEM, GnomeMonthItemClass))
-#define GNOME_IS_MONTH_ITEM(obj) (GTK_CHECK_TYPE ((obj), GNOME_TYPE_MONTH_ITEM))
-#define GNOME_IS_MONTH_ITEM_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_MONTH_ITEM))
-
-
-typedef struct _GnomeMonthItem GnomeMonthItem;
-typedef struct _GnomeMonthItemClass GnomeMonthItemClass;
-
-struct _GnomeMonthItem {
- GnomeCanvasGroup group;
-
- int year; /* Year to show (full, no two-digit crap) */
- int month; /* Month to show (0-11) */
-
- double x, y; /* Position at anchor */
- double width, height; /* Size of calendar */
- GtkAnchorType anchor; /* Anchor side for calendar */
-
- double head_padding; /* Padding to use between heading lines and text */
- double day_padding; /* Padding to use between day number lines and text */
-
- char *day_names[7]; /* Names to use for the day labels, starting from Sunday */
-
- double head_height; /* Height of the headings row */
- GtkAnchorType head_anchor; /* Anchor side for the heading labels */
- GtkAnchorType day_anchor; /* Anchor side for the day number labels */
-
- GnomeCanvasItem **items; /* All the items that make up the calendar */
- int day_numbers[42]; /* The numbers of the days, as they are shown in the display */
-
- GdkFont *head_font; /* Font for the headings */
- GdkFont *day_font; /* Font for the day numbers */
-
- gulong head_pixel; /* Color for heading labels */
- gulong outline_pixel; /* Color for the outline (lines and heading boxes) */
- gulong day_box_pixel; /* Color for the day boxes */
- gulong day_pixel; /* Color for day number labels */
-
- int start_on_monday : 1; /* Start the week on Monday? If false, then start from Sunday */
-};
-
-struct _GnomeMonthItemClass {
- GnomeCanvasGroupClass parent_class;
-};
-
-
-/* Standard Gtk function */
-GtkType gnome_month_item_get_type (void);
-
-/* Creates a new month item with the specified group as parent */
-GnomeCanvasItem *gnome_month_item_new (GnomeCanvasGroup *parent);
-
-/* Constructor function useful for derived classes */
-void gnome_month_item_construct (GnomeMonthItem *mitem);
-
-/* Returns the child item defined by the child number (as specified on the GnomeMonthItemChild
- * enumeration above).
- */
-GnomeCanvasItem *gnome_month_item_num2child (GnomeMonthItem *mitem, int child_num);
-
-/* Returns the number of the specified child item, as defined on the GnomeMonthItemChild enumeration
- * above. If the specified object is not found, it returns -1.
- */
-int gnome_month_item_child2num (GnomeMonthItem *mitem, GnomeCanvasItem *child);
-
-/* Returns the number of the day relevant to the specified child item. Day numbers are 1-based. If
- * the specified child is outside the range of displayed days, then it returns 0.
- */
-int gnome_month_item_num2day (GnomeMonthItem *mitem, int child_num);
-
-/* Returns the index (0-41) of the specified date within the table of days. If the day number is
- * invalid for the current monthly calendar, then -1 is returned.
- */
-int gnome_month_item_day2index (GnomeMonthItem *mitem, int day_num);
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/gui/gnomecal.gnorba b/calendar/gui/gnomecal.gnorba
deleted file mode 100644
index 74df8ecf04..0000000000
--- a/calendar/gui/gnomecal.gnorba
+++ /dev/null
@@ -1,11 +0,0 @@
-[IDL:GNOME:Calendar:Repository:1.0]
-type=factory
-repo_id=IDL:Gnome/Calendar/Repository:1.0
-description=Calendar Repository
-location_info=IDL:GNOME:Calendar:RepositoryLocator:1.0
-
-[IDL:GNOME:Calendar:RepositoryLocator:1.0]
-type=exe
-repo_id=IDL:GNOME/GenericFactory:1.0
-description=Calendar Server
-location_info=gnomecal
diff --git a/calendar/gui/gnomecal.oafinfo b/calendar/gui/gnomecal.oafinfo
deleted file mode 100644
index c4b91b9dd8..0000000000
--- a/calendar/gui/gnomecal.oafinfo
+++ /dev/null
@@ -1,27 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:IDL:GNOME:Calendar:Repository:1.0:56989bb6-65a1-430c-86a8-81bbe64bf7ab"
- type="factory"
- location="OAFIID:IDL:GNOME:Calendar:RepositoryLocator:1.0:83b25bb0-b68b-4c6b-86e7-c303e9897c21">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Gnome/Calendar/Repository:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Calendar Repository"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:IDL:GNOME:Calendar:RepositoryLocator:1.0:83b25bb0-b68b-4c6b-86e7-c303e9897c21"
- type="exe"
- location="gnomecal">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Calendar Server"/>
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/goto.c b/calendar/gui/goto.c
deleted file mode 100644
index d6c69016a1..0000000000
--- a/calendar/gui/goto.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/* Go to date dialog for gnomecal
- *
- * Copyright (C) 1998 Red Hat Software, Inc.
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <cal-util/timeutil.h>
-#include "gnome-cal.h"
-#include "gnome-month-item.h"
-#include "calendar-commands.h"
-#include "mark.h"
-
-
-static GtkWidget *goto_win; /* The goto dialog window */
-static GnomeMonthItem *month_item; /* The month item in the dialog */
-static GnomeCalendar *gnome_calendar; /* The gnome calendar the dialog refers to */
-static int current_index; /* The index of the day marked as current, or -1 if none */
-
-
-/* Updates the specified month item by marking it appropriately from the calendar the dialog refers
- * to. Also marks the current day if appropriate.
- */
-static void
-update (void)
-{
- GnomeCanvasItem *item;
- time_t t;
- struct tm tm;
-
- unmark_month_item (month_item);
- mark_month_item (month_item, gnome_calendar);
-
- if (current_index != -1) {
- item = gnome_month_item_num2child (month_item,
- GNOME_MONTH_ITEM_DAY_LABEL + current_index);
- gnome_canvas_item_set (item,
- "fill_color", color_spec_from_prop (COLOR_PROP_DAY_FG),
- "fontset", NORMAL_DAY_FONTSET,
- NULL);
- current_index = -1;
- }
-
- t = time (NULL);
- tm = *localtime (&t);
-
- if (((tm.tm_year + 1900) == month_item->year) && (tm.tm_mon == month_item->month)) {
- current_index = gnome_month_item_day2index (month_item, tm.tm_mday);
- g_assert (current_index != -1);
-
- item = gnome_month_item_num2child (month_item,
- GNOME_MONTH_ITEM_DAY_LABEL + current_index);
- gnome_canvas_item_set (item,
- "fill_color", color_spec_from_prop (COLOR_PROP_CURRENT_DAY_FG),
- "fontset", CURRENT_DAY_FONTSET,
- NULL);
- }
-}
-
-/* Callback used when the year adjustment is changed */
-static void
-year_changed (GtkAdjustment *adj, gpointer data)
-{
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (month_item),
- "year", (int) adj->value,
- NULL);
- update ();
-}
-
-/* Creates the year control with its adjustment */
-static GtkWidget *
-create_year (int year)
-{
- GtkWidget *hbox;
- GtkAdjustment *adj;
- GtkWidget *w;
-
- hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
-
- w = gtk_label_new (_("Year:"));
- gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- adj = GTK_ADJUSTMENT (gtk_adjustment_new (year, 1900, 9999, 1, 10, 10));
- gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
- (GtkSignalFunc) year_changed,
- NULL);
-
- w = gtk_spin_button_new (adj, 1.0, 0);
- gtk_widget_set_usize (w, 60, 0);
- gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- return hbox;
-}
-
-/* Callback used when a month button is toggled */
-static void
-month_toggled (GtkToggleButton *toggle, gpointer data)
-{
- if (!toggle->active)
- return;
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (month_item),
- "month", GPOINTER_TO_INT (data),
- NULL);
- update ();
-}
-
-/* Creates the months control */
-static GtkWidget *
-create_months (int month)
-{
- GtkWidget *table;
- GtkWidget *w;
- GSList *group;
- int i, row, col;
- struct tm tm;
- char buf[100];
-
- tm = *localtime (&gnome_calendar->selection_start_time);
-
- table = gtk_table_new (2, 6, TRUE);
-
- group = NULL;
-
- for (i = 0; i < 12; i++) {
- row = i / 6;
- col = i % 6;
-
- tm.tm_mon = i;
- strftime (buf, 100, "%b", &tm);
-
- w = gtk_radio_button_new (group);
- group = gtk_radio_button_group (GTK_RADIO_BUTTON (w));
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (w), FALSE);
-
- gtk_container_add (GTK_CONTAINER (w), gtk_label_new (buf));
-
- if (i == month)
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (w), TRUE);
-
- gtk_signal_connect (GTK_OBJECT (w), "toggled",
- (GtkSignalFunc) month_toggled,
- GINT_TO_POINTER (i));
- gtk_table_attach (GTK_TABLE (table), w,
- col, col + 1,
- row, row + 1,
- GTK_EXPAND | GTK_FILL,
- GTK_EXPAND | GTK_FILL,
- 0, 0);
- gtk_widget_show_all (w);
- }
-
- return table;
-}
-
-/* Sets the scrolling region of the canvas to the allocation size */
-static void
-set_scroll_region (GtkWidget *widget, GtkAllocation *allocation)
-{
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (month_item),
- "width", (double) (allocation->width - 1),
- "height", (double) (allocation->height - 1),
- NULL);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS (widget),
- 0, 0,
- allocation->width, allocation->height);
-}
-
-/* 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 gint
-day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
-{
- int child_num, day;
-
- child_num = gnome_month_item_child2num (month_item, item);
- day = gnome_month_item_num2day (month_item, child_num);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- if ((event->button.button == 1) && (day != 0)) {
- gnome_calendar_goto (gnome_calendar,
- time_from_day (month_item->year, month_item->month, day));
- gtk_widget_destroy (goto_win);
- }
- break;
-
- default:
- break;
- }
-
- return FALSE;
-}
-
-/* Creates the canvas with the month item for selecting days */
-static GtkWidget *
-create_days (int day, int month, int year)
-{
- GtkWidget *canvas;
- int i;
- GnomeCanvasItem *day_group;
-
- canvas = gnome_canvas_new ();
- gtk_widget_set_usize (canvas, 150, 120);
-
- month_item = GNOME_MONTH_ITEM (gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (canvas))));
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (month_item),
- "month", month,
- "year", year,
- "start_on_monday", week_starts_on_monday,
- NULL);
- colorify_month_item (month_item, default_color_func, NULL);
- month_item_prepare_prelight (month_item, default_color_func, NULL);
- update ();
-
- /* Connect to size_allocate so that we can change the size of the month item and the
- * scrolling region appropriately.
- */
-
- gtk_signal_connect (GTK_OBJECT (canvas), "size_allocate",
- (GtkSignalFunc) set_scroll_region,
- NULL);
-
- /* Bind the day groups to our event handler */
-
- for (i = 0; i < 42; i++) {
- day_group = gnome_month_item_num2child (month_item, i + GNOME_MONTH_ITEM_DAY_GROUP);
- gtk_signal_connect (GTK_OBJECT (day_group), "event",
- (GtkSignalFunc) day_event,
- NULL);
- }
-
- return canvas;
-}
-
-static void
-goto_today (GtkWidget *widget, gpointer data)
-{
- gnome_calendar_goto_today (gnome_calendar);
- gtk_widget_destroy (goto_win);
-}
-
-/* Creates a "goto date" dialog and runs it */
-void
-goto_dialog (GnomeCalendar *gcal)
-{
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *w;
- GtkWidget *days;
- struct tm tm;
-
- gnome_calendar = gcal;
- current_index = -1;
-
- tm = *localtime (&gnome_calendar->selection_start_time);
-
- goto_win = gnome_dialog_new (_("Go to date"),
- GNOME_STOCK_BUTTON_CANCEL,
- NULL);
- gnome_dialog_set_parent (GNOME_DIALOG (goto_win),
- GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))));
-
-
- vbox = GNOME_DIALOG (goto_win)->vbox;
-
- /* Instructions */
-
- w = gtk_label_new (_("Please select the date you want to go to.\n"
- "When you click on a day, you will be taken\n"
- "to that date."));
- gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
- gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.0);
- gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- /* Create month item before creating the year controls, since the
- * latter ones need the month_item to be created.
- */
-
- days = create_days (tm.tm_mday, tm.tm_mon, tm.tm_year + 1900);
-
- /* Year */
-
- w = create_year (tm.tm_year + 1900);
- gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- /* Month */
-
- w = create_months (tm.tm_mon);
- gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- /* Days (canvas with month item) */
-
- gtk_box_pack_start (GTK_BOX (vbox), days, TRUE, TRUE, 0);
- gtk_widget_show (days);
-
- /* Today button */
-
- hbox = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show (hbox);
-
- w = gtk_button_new_with_label (_("Go to today"));
- gtk_signal_connect (GTK_OBJECT (w), "clicked",
- (GtkSignalFunc) goto_today,
- NULL);
- gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- /* Run! */
-
- gtk_window_set_modal (GTK_WINDOW (goto_win), TRUE);
- gnome_dialog_set_close (GNOME_DIALOG (goto_win), TRUE);
- gnome_dialog_set_parent (GNOME_DIALOG (goto_win),
- GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gnome_calendar))));
- gtk_widget_show (goto_win);
-}
diff --git a/calendar/gui/jump.xpm b/calendar/gui/jump.xpm
deleted file mode 100644
index d974142d9a..0000000000
--- a/calendar/gui/jump.xpm
+++ /dev/null
@@ -1,14 +0,0 @@
-/* XPM */
-static char * jump_xpm[] = {
-"16 8 3 1",
-" c None",
-". c #000000",
-"+ c #FFFF00",
-"................",
-".++++++++++++++.",
-".++++++++++++++.",
-".++..++..++..++.",
-".++..++..++..++.",
-".++++++++++++++.",
-".++++++++++++++.",
-"................"};
diff --git a/calendar/gui/main.c b/calendar/gui/main.c
deleted file mode 100644
index 6876fbd6b5..0000000000
--- a/calendar/gui/main.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* control-factory.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-#include <glade/glade.h>
-#include <bonobo.h>
-#include <bonobo/bonobo-control.h>
-#include <glade/glade.h>
-
-#ifdef USING_OAF
-#include <liboaf/liboaf.h>
-#else
-#include <libgnorba/gnorba.h>
-#endif
-
-#include <cal-util/timeutil.h>
-#include <gui/alarm.h>
-#include <gui/gnome-cal.h>
-#include <gui/calendar-commands.h>
-#include "component-factory.h"
-#include "control-factory.h"
-
-
-static void
-init_bonobo (int *argc, char **argv)
-{
-#ifdef USING_OAF
- /* FIXME: VERSION instead of "0.0". */
- gnome_init_with_popt_table ("evolution-calendar", "0.0",
- *argc, argv, oaf_popt_options,
- 0, NULL);
- oaf_init (*argc, argv);
-#else
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- gnome_CORBA_init_with_popt_table (
- "evolution-calendar", "0.0",
- argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
- CORBA_exception_free (&ev);
-#endif
-
- if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-}
-
-
-int
-main (int argc, char **argv)
-{
- init_bonobo (&argc, argv);
- glade_gnome_init ();
- alarm_init ();
- e_cursors_init ();
-
- init_calendar ();
-
-#if 0
- //g_log_set_always_fatal ((GLogLevelFlags) 0xFFFF);
- g_log_set_always_fatal (G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL |
- G_LOG_LEVEL_WARNING);
-#endif
-
- control_factory_init ();
- component_factory_init ();
-
- bonobo_main ();
- fprintf (stderr, "main(): Out of bonobo_main(), we are dying cleanly. Have a nice day.\n");
-
- return 0;
-}
diff --git a/calendar/gui/mark.c b/calendar/gui/mark.c
deleted file mode 100644
index 383eca5196..0000000000
--- a/calendar/gui/mark.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/* Evolution calendar - Functions to mark calendars
- *
- * Copyright (C) 1998 Red Hat Software, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <cal-util/timeutil.h>
-#include "gnome-cal.h"
-#include "calendar-commands.h"
-#include "mark.h"
-
-/* Closure data */
-struct minfo
-{
- GnomeMonthItem *mitem;
- time_t start;
- time_t end;
-};
-
-
-
-/* Frees the specified data when an object is destroyed */
-static void
-free_data (GtkObject *object, gpointer data)
-{
- g_free (data);
-}
-
-/* If the array of "marked" attributes for the days in a a month item has not been created yet, this
- * function creates the array and clears it. Otherwise, it just returns the existing array.
- */
-static char *
-get_attributes (GnomeMonthItem *mitem)
-{
- char *attrs;
-
- attrs = gtk_object_get_data (GTK_OBJECT (mitem), "day_mark_attributes");
-
- if (!attrs) {
- attrs = g_new0 (char, 42);
- gtk_object_set_data (GTK_OBJECT (mitem), "day_mark_attributes", attrs);
- gtk_signal_connect (GTK_OBJECT (mitem), "destroy",
- (GtkSignalFunc) free_data,
- attrs);
- }
-
- return attrs;
-}
-
-void
-colorify_month_item (GnomeMonthItem *mitem, GetColorFunc func, gpointer func_data)
-{
- g_return_if_fail (mitem != NULL);
- g_return_if_fail (GNOME_IS_MONTH_ITEM (mitem));
- g_return_if_fail (func != NULL);
-
- unmark_month_item (mitem);
-
- /* We have to do this in several calls to gnome_canvas_item_set(), as color_spec_from_prop()
- * returns a pointer to a static string -- and we need several values.
- */
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
- "heading_color", (* func) (COLOR_PROP_HEADING_COLOR, func_data),
- NULL);
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
- "outline_color", (* func) (COLOR_PROP_OUTLINE_COLOR, func_data),
- NULL);
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
- "day_box_color", (* func) (COLOR_PROP_EMPTY_DAY_BG, func_data),
- NULL);
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
- "day_color", (* func) (COLOR_PROP_DAY_FG, func_data),
- NULL);
-}
-
-/* In the month item, marks all the days that are touched by the specified time span. Assumes that
- * the time span is completely contained within the month. The array of day attributes is modified
- * accordingly.
- */
-static void
-mark_event_in_month (GnomeMonthItem *mitem, time_t start, time_t end)
-{
- struct tm tm;
- int day_index;
-
- tm = *localtime (&start);
-
- for (; start <= end; start += 60 * 60 * 24) {
- mktime (&tm); /* normalize the time */
-
- /* Figure out the day index that corresponds to this time */
-
- day_index = gnome_month_item_day2index (mitem, tm.tm_mday);
- g_assert (day_index >= 0);
-
- /* Mark the day box */
-
- mark_month_item_index (mitem, day_index, default_color_func, NULL);
-
- /* Next day */
-
- tm.tm_mday++;
- }
-}
-
-static gboolean
-mark_month_item_cb (CalComponent *comp, time_t istart, time_t iend, gpointer data)
-{
- struct minfo *mi = (struct minfo *)data;
-
- mark_event_in_month (mi->mitem, MAX (istart, mi->start), MIN (iend, mi->end));
-
- return TRUE;
-}
-
-void
-mark_month_item (GnomeMonthItem *mitem, GnomeCalendar *gcal)
-{
- struct minfo mi;
-
- g_return_if_fail (mitem != NULL);
- g_return_if_fail (GNOME_IS_MONTH_ITEM (mitem));
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- mi.mitem = mitem;
- mi.start = time_month_begin (time_from_day (mitem->year, mitem->month, 1));
- mi.end = time_month_end (mi.start);
-
- cal_client_generate_instances (gcal->client, CALOBJ_TYPE_EVENT, mi.start, mi.end,
- mark_month_item_cb, &mi);
-}
-
-
-void
-mark_month_item_index (GnomeMonthItem *mitem, int index, GetColorFunc func, gpointer func_data)
-{
- char *attrs;
- GnomeCanvasItem *item;
-
- g_return_if_fail (mitem != NULL);
- g_return_if_fail (GNOME_IS_MONTH_ITEM (mitem));
- g_return_if_fail ((index >= 0) && (index < 42));
- g_return_if_fail (func != NULL);
-
- attrs = get_attributes (mitem);
-
- attrs[index] = TRUE;
-
- item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_BOX + index);
- gnome_canvas_item_set (item,
- "fill_color", (* func) (COLOR_PROP_MARK_DAY_BG, func_data),
- NULL);
-}
-
-void
-unmark_month_item (GnomeMonthItem *mitem)
-{
- int i;
- char *attrs;
- GnomeCanvasItem *item;
-
- g_return_if_fail (mitem != NULL);
- g_return_if_fail (GNOME_IS_MONTH_ITEM (mitem));
-
- attrs = get_attributes (mitem);
-
- /* Find marked days and unmark them by turning off their marked attribute flag and changing
- * the color.
- */
-
- for (i = 0; i < 42; i++)
- if (attrs[i]) {
- attrs[i] = FALSE;
-
- item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_BOX + i);
- gnome_canvas_item_set (item,
- "fill_color", color_spec_from_prop (COLOR_PROP_EMPTY_DAY_BG),
- NULL);
- }
-}
-
-/* Handles EnterNotify and LeaveNotify events from the month item's day groups, and performs
- * appropriate prelighting.
- */
-static gint
-day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
-{
- GnomeMonthItem *mitem;
- GnomeCanvasItem *box;
- int child_num, day;
- GetColorFunc func;
- gpointer func_data;
- char *color;
- char *attrs;
-
- /* We only accept enters and leaves */
-
- if (!((event->type == GDK_ENTER_NOTIFY) || (event->type == GDK_LEAVE_NOTIFY)))
- return FALSE;
-
- /* Get index information */
-
- mitem = GNOME_MONTH_ITEM (data);
- child_num = gnome_month_item_child2num (mitem, item);
- day = gnome_month_item_num2day (mitem, child_num);
-
- if (day == 0)
- return FALSE; /* it was a day outside the month's range */
-
- child_num -= GNOME_MONTH_ITEM_DAY_GROUP;
- box = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_BOX + child_num);
-
- /* Get colors */
-
- func = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_color_func");
- func_data = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_color_data");
-
- /* Now actually set the proper color in the item */
-
- switch (event->type) {
- case GDK_ENTER_NOTIFY:
- color = (* func) (COLOR_PROP_PRELIGHT_DAY_BG, func_data);
- gnome_canvas_item_set (box,
- "fill_color", color,
- NULL);
- break;
-
- case GDK_LEAVE_NOTIFY:
- attrs = get_attributes (mitem);
- color = (* func) (attrs[child_num] ? COLOR_PROP_MARK_DAY_BG : COLOR_PROP_EMPTY_DAY_BG,
- func_data);
- gnome_canvas_item_set (box,
- "fill_color", color,
- NULL);
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- return TRUE;
-}
-
-void
-month_item_prepare_prelight (GnomeMonthItem *mitem, GetColorFunc func, gpointer func_data)
-{
- GnomeCanvasItem *day_group;
- int i;
-
- g_return_if_fail (mitem != NULL);
- g_return_if_fail (GNOME_IS_MONTH_ITEM (mitem));
- g_return_if_fail (func != NULL);
-
- /* Store the function in the object data */
-
- gtk_object_set_data (GTK_OBJECT (mitem), "prelight_color_func", func);
- gtk_object_set_data (GTK_OBJECT (mitem), "prelight_color_data", func_data);
-
- /* Connect the appropriate signals to perform prelighting */
-
- for (i = 0; i < 42; i++) {
- day_group = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_GROUP + i);
- gtk_signal_connect (GTK_OBJECT (day_group), "event",
- (GtkSignalFunc) day_event,
- mitem);
- }
-}
-
-char *
-default_color_func (ColorProp propnum, gpointer data)
-{
- return color_spec_from_prop (propnum);
-}
-
-
-
diff --git a/calendar/gui/mark.h b/calendar/gui/mark.h
deleted file mode 100644
index 76c82c580d..0000000000
--- a/calendar/gui/mark.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Evolution calendar - Functions to mark calendars
- *
- * Copyright (C) 1998 Red Hat Software, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 MARK_H
-#define MARK_H
-
-/*#include "calendar.h"*/
-#include "gnome-month-item.h"
-
-
-
-/* These are the fonts used for the montly calendars */
-
-#define HEADING_FONTSET "-adobe-helvetica-medium-r-*-*-14-*-*-*-p-*-*-*,-cronyx-helvetica-medium-r-normal-*-17-*-*-*-p-*-koi8-r,-*-*-medium-r-*-*-14-*-*-*-*-*-ksc5601.1987-0,*"
-#define TITLE_FONTSET "-adobe-helvetica-bold-r-normal--12-*-*-*-p-*-*-*,-cronyx-helvetica-medium-r-normal-*-14-*-*-*-p-*-koi8-r,-*-*-bold-r-normal--12-*-*-*-*-*-ksc5601.1987-0,*"
-#define DAY_HEADING_FONTSET "-adobe-helvetica-medium-r-normal--10-*-*-*-p-*-*-*,-cronyx-helvetica-medium-r-normal-*-11-*-*-*-p-*-koi8-r,-*-*-medium-r-normal--10-*-*-*-*-*-ksc5601.1987-0,*"
-#define NORMAL_DAY_FONTSET "-adobe-helvetica-medium-r-normal--10-*-*-*-p-*-*-*,-cronyx-helvetica-medium-r-normal-*-11-*-*-*-p-*-koi8-r,-*-*-medium-r-normal--10-*-*-*-*-*-ksc5601.1987-0,*"
-#define CURRENT_DAY_FONTSET "-adobe-helvetica-bold-r-normal--12-*-*-*-p-*-*-*,-cronyx-helvetica-medium-r-normal-*-14-*-*-*-p-*-koi8-r,-*-*-bold-r-normal--12-*-*-*-*-*-ksc5601.1987-0,*"
-#define BIG_DAY_HEADING_FONTSET "-adobe-helvetica-bold-r-normal--14-*-*-*-p-*-*-*,-cronyx-helvetica-bold-r-normal-*-17-*-*-*-p-*-koi8-r,-*-*-bold-r-normal--14-*-*-*-*-*-ksc5601.1987-0,*"
-#define BIG_NORMAL_DAY_FONTSET "-adobe-helvetica-medium-r-normal--14-*-*-*-p-*-*-*,-cronyx-helvetica-medium-r-normal-*-17-*-*-*-p-*-koi8-r,-*-*-medium-r-normal--14-*-*-*-*-*-ksc5601.1987-0,*"
-#define BIG_CURRENT_DAY_FONTSET "-adobe-helvetica-bold-r-normal--14-*-*-*-p-*-*-*,-cronyx-helvetica-bold-r-normal-*-17-*-*-*-p-*-koi8-r,-*-*-bold-r-normal--14-*-*-*-*-*-ksc5601.1987-0,*"
-#define EVENT_FONTSET "-adobe-helvetica-medium-r-*-*-10-*-*-*-p-*-*-*,-cronyx-helvetica-medium-r-normal-*-11-*-*-*-p-*-koi8-r,-*-*-medium-r-normal--10-*-*-*-*-*-ksc5601.1987-0,*"
-
-
-/* Functions of this type are used by the marking functions to fetch color specifications. Such
- * a function must return a color spec based on the property passed to it.
- */
-typedef char * (* GetColorFunc) (ColorProp propnum, gpointer data);
-
-
-/* Sets the user-configured colors and font for a month item. It also tags the days as unmarked. */
-void colorify_month_item (GnomeMonthItem *month, GetColorFunc func, gpointer func_data);
-
-/* Takes a monthly calendar item and marks the days that have events
- * scheduled for them in the specified calendar. It also highlights
- * the current day.
- */
-void mark_month_item (GnomeMonthItem *mitem, GnomeCalendar *cal);
-
-/* Marks a day specified by index, not by day number */
-void mark_month_item_index (GnomeMonthItem *mitem, int index, GetColorFunc func, gpointer func_data);
-
-/* Unmarks all the days in the specified month item */
-void unmark_month_item (GnomeMonthItem *mitem);
-
-/* Prepares a monthly calendar item to prelight when the mouse goes over the days. */
-
-void month_item_prepare_prelight (GnomeMonthItem *mitem, GetColorFunc func, gpointer func_data);
-
-/* This is the default prelight function you can use for most puposes. You can use NULL as the
- * func_data.
- */
-char *default_color_func (ColorProp prop_num, gpointer data);
-
-
-
-#endif
diff --git a/calendar/gui/monthview.xpm b/calendar/gui/monthview.xpm
deleted file mode 100644
index 1a1b1d936a..0000000000
--- a/calendar/gui/monthview.xpm
+++ /dev/null
@@ -1,46 +0,0 @@
-/* XPM */
-static char * monthview_xpm[] = {
-"24 24 19 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-"@ c #D1D1D1",
-"# c #BABBCC",
-"$ c #AAAFE2",
-"% c #8B90C3",
-"& c #E3E4F5",
-"* c #A3A6C7",
-"= c #5D66BA",
-"- c #3945BB",
-"; c #555FC5",
-"> c #2E3BB1",
-", c #727ACE",
-"' c #C7CAEB",
-") c #0010A8",
-"! c #4550B5",
-"~ c #1725AC",
-"{ c #8E95D8",
-" ",
-" ",
-" ",
-" ",
-" ...................... ",
-" .............+.++.++.. ",
-" .++@++@++@++@++@++@++. ",
-" .++@++@++@++@++@++@++. ",
-" .@@@@@@@@@@@@@@@@@@@@. ",
-" .++@++#$$%&+@+$*++@++. ",
-" .++@+&=-;>,+@')!++@++. ",
-" .@@@@%)%@%)@*~)!@@@@@. ",
-" .++@++@'$=-+@+)!++@++. ",
-" .++@++@{;>,+@+)!++@++. ",
-" .@@@@@@@@%)@@@)!@@@@@. ",
-" .++@+$)$+%)+@+)!++@++. ",
-" .++@+'>,$=-+#$)>$+@++. ",
-" .@@@@@#%%%#@#%%%%@@@@. ",
-" .++@++@++@++@++@++@++. ",
-" .++@++@++@++@++@++@++. ",
-" ...................... ",
-" ",
-" ",
-" "};
diff --git a/calendar/gui/popup-menu.c b/calendar/gui/popup-menu.c
deleted file mode 100644
index a90c38d490..0000000000
--- a/calendar/gui/popup-menu.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Popup menu utilities for gncal
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <quartic@gimp.org>
- */
-
-#include <config.h>
-#include <gnome.h>
-#include "popup-menu.h"
-#include "../../e-util/e-gui-utils.h"
-
-
-void
-popup_menu (struct menu_item *items, int nitems, GdkEventButton *event)
-{
- GtkWidget *menu;
- GtkWidget *item;
- int i;
-
- menu = gtk_menu_new ();
-
- /* Make sure the menu is destroyed when it disappears. */
- e_auto_kill_popup_menu_on_hide (GTK_MENU (menu));
-
- for (i = 0; i < nitems; i++) {
- if (items[i].text) {
- item = gtk_menu_item_new_with_label (_(items[i].text));
- gtk_signal_connect (GTK_OBJECT (item), "activate",
- items[i].callback,
- items[i].data);
- gtk_widget_set_sensitive (item, items[i].sensitive);
- } else
- item = gtk_menu_item_new ();
-
- gtk_widget_show (item);
- gtk_menu_append (GTK_MENU (menu), item);
- }
-
- gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, event->button, event->time);
-}
diff --git a/calendar/gui/popup-menu.h b/calendar/gui/popup-menu.h
deleted file mode 100644
index a4590dbb98..0000000000
--- a/calendar/gui/popup-menu.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Popup menu utilities for gncal
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <quartic@gimp.org>
- */
-
-#ifndef POPUP_MENU_H
-#define POPUP_MENU_H
-
-#include <gdk/gdktypes.h>
-#include <gtk/gtksignal.h>
-
-
-struct menu_item {
- char *text;
- GtkSignalFunc callback;
- gpointer data;
- int sensitive;
-};
-
-void popup_menu (struct menu_item *items, int nitems, GdkEventButton *event);
-
-
-#endif
diff --git a/calendar/gui/print.c b/calendar/gui/print.c
deleted file mode 100644
index 1554be0b96..0000000000
--- a/calendar/gui/print.c
+++ /dev/null
@@ -1,1313 +0,0 @@
-/* Evolution calendar - Print support
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- * Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <sys/stat.h>
-#include <math.h>
-#include <gnome.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-copies.h>
-#include <libgnomeprint/gnome-print-master.h>
-#include <libgnomeprint/gnome-print-master-preview.h>
-#include <libgnomeprint/gnome-print-preview.h>
-#include <libgnomeprint/gnome-printer-profile.h>
-#include <libgnomeprint/gnome-printer-dialog.h>
-#include <e-util/e-dialog-widgets.h>
-#include <cal-util/timeutil.h>
-#include "calendar-commands.h"
-#include "gnome-cal.h"
-#include "print.h"
-
-
-
-/* copied from gnome-month-item.c this should be shared?? */
-
-/* Number of days in a month, for normal and leap years */
-static const int days_in_month[2][12] = {
- { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
- { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
-};
-
-/* 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 REFORMATION_DAY 639787 /* First day of the reformation, counted from 1 Jan 1 */
-#define MISSING_DAYS 11 /* They corrected out 11 days */
-#define THURSDAY 4 /* First day of reformation */
-#define SATURDAY 6 /* Offset value; 1 Jan 1 was a Saturday */
-#define SEPT_1752_START 2 /* Start day within month */
-#define SEPT_1752_END 20 /* End day within month */
-
-struct pdinfo
-{
- GList *slots;
-};
-
-struct psinfo
-{
- GList *events;
-};
-
-struct ptinfo
-{
- GList *todos;
-};
-
-struct einfo
-{
- char *text;
- time_t start;
- time_t end;
- int count;
-};
-
-
-/* Returns the number of leap years since year 1 up to (but not including) the specified year */
-static int
-leap_years_up_to (int year)
-{
- return (year / 4 /* trivial leapness */
- - ((year > 1700) ? (year / 100 - 17) : 0) /* minus centuries since 1700 */
- + ((year > 1600) ? ((year - 1600) / 400) : 0)); /* plus centuries since 1700 divisible by 400 */
-}
-
-/* Returns whether the specified year is a leap year */
-static int
-is_leap_year (int year)
-{
- if (year <= 1752)
- return !(year % 4);
- else
- return (!(year % 4) && (year % 100)) || !(year % 400);
-}
-
-/* Returns the 1-based day number within the year of the specified date */
-static int
-day_in_year (int day, int month, int year)
-{
- int is_leap, i;
-
- is_leap = is_leap_year (year);
-
- for (i = 0; i < month; i++)
- day += days_in_month [is_leap][i];
-
- return day;
-}
-
-/* Returns the day of the week (zero-based, zero is Sunday) for the specified date. For the days
- * that were removed on the Gregorian reformation, it returns Thursday.
- */
-static int
-day_in_week (int day, int month, int year)
-{
- int n;
-
- n = (year - 1) * 365 + leap_years_up_to (year - 1) + day_in_year (day, month, year);
-
- if (n < REFORMATION_DAY)
- return (n - 1 + SATURDAY) % 7;
-
- if (n >= (REFORMATION_DAY + MISSING_DAYS))
- return (n - 1 + SATURDAY - MISSING_DAYS) % 7;
-
- return THURSDAY;
-}
-
-/* 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 start_on_monday, int *days, int *start, int *end)
-{
- int i;
- int d_month, d_week;
-
- /* 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 = days_in_month[is_leap_year (year)][month];
- d_week = day_in_week (1, month, year);
-
- if (start_on_monday)
- d_week = (d_week + 6) % 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;
-}
-
-
-enum align_box {
- ALIGN_LEFT=1,
- ALIGN_RIGHT,
- ALIGN_CENTRE,
- ALIGN_BORDER= 1<<8
-};
-
-/* width = width of border, -'ve is no border
- fillcolour = shade of fill, -'ve is no fill */
-static void
-print_border(GnomePrintContext *pc, double l, double r, double t, double b, double width, double fillcolour)
-{
- int i;
- gnome_print_gsave (pc);
- if (fillcolour<0.0)
- i=1;
- else
- i=0;
- for (;i<2;i++) {
- 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_lineto(pc, l, t);
- if (i==0) {
- gnome_print_setrgbcolor(pc, fillcolour, fillcolour, fillcolour);
- gnome_print_fill(pc);
- if (width<0.0)
- i=2;
- } else {
- gnome_print_setrgbcolor(pc, 0, 0, 0);
- gnome_print_setlinewidth(pc, width);
- gnome_print_stroke(pc);
- }
- }
- gnome_print_grestore (pc);
-}
-
-/* outputs 1 line of aligned text in a box */
-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;
- gnome_print_gsave (pc);
- w = gnome_font_get_width_string(font, text);
- switch (align&3) {
- default:
- case ALIGN_LEFT:
- x = l;
- break;
- case ALIGN_RIGHT:
- x = l+(r-l)-w-2;
- break;
- case ALIGN_CENTRE:
- x = l+((r-l)-w)/2;
- break;
- }
- gnome_print_moveto(pc, x, t-font->size);
- 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 bold font */
-static void
-print_text_size(GnomePrintContext *pc, double size, const char *text, enum align_box align, double l, double r, double t, double b)
-{
- GnomeFont *font;
-
- font = gnome_font_new_closest ("Times", GNOME_FONT_BOLD, 0, size);
- print_text(pc, font, text, align, l, r, t, b);
- gtk_object_unref (GTK_OBJECT (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)
-{
- if (align&ALIGN_BORDER) {
- gnome_print_gsave(pc);
- print_border(pc, *l, *r, *t, *t-font->size-font->size*0.4, linewidth, 0.9);
- print_border(pc, *l, *r, *t-font->size-font->size*0.4, *b, linewidth, -1.0);
- gnome_print_grestore(pc);
- *l+=2;
- *r-=2;
- *b+=2;
- }
- print_text(pc, font, text, align, *l, *r, *t, *b);
- *t-=font->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)
-{
- char fmt[64];
- struct tm tm;
-
- tm = *localtime(&time);
- 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");
- }
- strftime(buffer, bufflen, fmt, &tm);
- return buffer;
-}
-
-
-/*
- 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)
-{
- GnomeFont *font, *font_bold, *font_normal;
- time_t now, next;
- int x, y;
- int days[42];
- int day;
- char buf[100];
- struct tm tm;
- double xpad, ypad, size;
- char *daynames[] = { _("Su"), _("Mo"), _("Tu"), _("We"), _("Th"), _("Fr"), _("Sa") };
-
- xpad = (right-left)/7;
- ypad = (top-bottom)/8.3;
- if (xpad>ypad)
- size=ypad;
- else
- size=xpad;
-
- size = (xpad+ypad)/3.0;
-
- tm = *localtime (&month);
-
- /* get month days */
- build_month(tm.tm_mon, tm.tm_year+1900, week_starts_on_monday, days, 0, 0);
-
- /* build day-busy bits */
- now = time_month_begin(month);
-
- /* get title */
- format_date(month, titleflags, buf, 100);
- font = gnome_font_new_closest ("Times", GNOME_FONT_BOLD, 1, size*1.2); /* title font */
- if (bordertitle)
- print_border(pc,
- left, left+7*xpad, top, top-font->size*1.3,
- 1.0, 0.9);
- print_text(pc, font, buf, ALIGN_CENTRE,
- left, left+7*xpad, top, top - font->size);
- gtk_object_unref (GTK_OBJECT (font));
-
- font_normal = gnome_font_new_closest ("Times", GNOME_FONT_BOOK, 0, size);
- font_bold = gnome_font_new_closest ("Times", GNOME_FONT_BOLD, 0, size);
-
- gnome_print_setrgbcolor (pc, 0,0,0);
- for (x=0;x<7;x++) {
- print_text(pc, font_bold, daynames[(week_starts_on_monday?x+1:x)%7], ALIGN_CENTRE,
- left+x*xpad, left+(x+1)*xpad, bottom+7*ypad, bottom+7*ypad-font_bold->size);
- }
-
- for (y=0;y<6;y++) {
- for (x=0;x<7;x++) {
- day = days[y*7+x];
- if (day!=0) {
- GList *uids;
-
- sprintf(buf, "%d", day);
-
- /* this is a slow messy way to do this ... but easy ... */
- uids = cal_client_get_objects_in_range (gcal->client, CALOBJ_TYPE_EVENT, now, time_day_end (now));
- font = uids ? font_bold : font_normal;
- cal_obj_uid_list_free (uids);
-
- next = time_add_day(now, 1);
- if ((now>=greystart && now<greyend)
- || (greystart>=now && greystart<next)) {
- print_border(pc,
- left+x*xpad+xpad*0.1,
- left+(x+1)*xpad+xpad*0.1,
- bottom+(5-y)*ypad+font->size-ypad*0.15,
- bottom+(5-y)*ypad-ypad*0.15,
- -1.0, 0.75);
- }
- print_text(pc, font, buf, ALIGN_RIGHT,
- left+x*xpad, left+(x+1)*xpad, bottom+(5-y)*ypad+font->size, bottom+(5-y)*ypad);
- now = next;
- }
- }
- }
- gtk_object_unref (GTK_OBJECT (font_normal));
- gtk_object_unref (GTK_OBJECT (font_bold));
-}
-
-
-
-/* wraps text into the print context, not taking up more than its allowed space */
-static double
-bound_text(GnomePrintContext *pc, GnomeFont *font, char *text, double left, double right, double top, double bottom, double indent)
-{
- double maxwidth = right-left;
- double width;
- 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 -= font->size;
- 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;
- width+=gnome_font_get_width(font, c);
- if (width>maxwidth)
- dump=1;
- else
- dump=0;
- }
- 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_string_n(font, outbuffer, o-wordstart);
- o=outbuffer+(o-wordstart);
- wordstart = outbuffer;
- top -= font->size;
- 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 -= font->size;
- }
- g_free(outbuffer);
- return top;
-}
-
-/*
- * Print Day Details
- */
-static gboolean
-print_day_details_cb (CalComponent *comp, time_t istart, time_t iend, gpointer data)
-{
- CalComponentText text;
- GList *l, *col = NULL;
- struct pdinfo *pdi = (struct pdinfo *)data;
- struct einfo *ei;
-
- ei = g_new (struct einfo, 1);
-
- cal_component_get_summary (comp, &text);
- ei->text = g_strdup (text.value);
-
- ei->start = istart;
- ei->end = iend;
- ei->count = 0;
-
- for (l = pdi->slots; l; l = l->next) {
- struct einfo *testei;
-
- col = (GList *)l->data;
- testei = (struct einfo *)col->data;
-
- if (ei->start >= testei->end) {
- col = g_list_prepend (col, ei);
- l->data = col;
- return TRUE;
- }
-
- testei->count++;
- ei->count++;
- }
-
- col = NULL;
- col = g_list_prepend (col, ei);
- pdi->slots = g_list_append (pdi->slots, col);
-
- return TRUE;
-}
-
-static void
-print_day_details (GnomePrintContext *pc, GnomeCalendar *gcal, time_t whence,
- double left, double right, double top, double bottom)
-{
- struct pdinfo pdi;
- time_t start, end;
- GList *l;
- int num_slots, i;
- GnomeFont *font_hour, *font_minute, *font_summary;
- double yinc, y, yend, x, xend;
- double width=40, slot_width;
- char buf[20];
-
- yinc = (top-bottom)/24;
-
- /* fill static detail */
- font_hour = gnome_font_new_closest ("Times", GNOME_FONT_BOLD, 0, yinc/2);
- font_minute = gnome_font_new_closest ("Times", GNOME_FONT_BOLD, 0, yinc/3);
- font_summary = gnome_font_new_closest ("Times", GNOME_FONT_BOOK, 0, yinc/3);
-
- gnome_print_setrgbcolor (pc, 0, 0, 0);
-
- /* internal lines */
- gnome_print_setlinewidth(pc, 0.0);
- gnome_print_moveto(pc, left+width, bottom);
- gnome_print_lineto(pc, left+width, top);
- gnome_print_stroke (pc);
-
- for (i=0;i<24;i++) {
- y = top - yinc*(i+1);
- print_border(pc, left+1, left+width-1, y, y+yinc-1, -1.0, 0.9);
- gnome_print_setrgbcolor (pc, 0, 0, 0);
-
- /* the hour label/minute */
- sprintf(buf, "%d", i);
- print_text(pc, font_hour, buf, ALIGN_RIGHT, left, left+width/2, y+yinc, y);
- switch(i) {
- case 12: sprintf(buf, _("pm")); break;
- case 0: sprintf(buf, _("am")); break;
- default: sprintf(buf, "00"); break;
- }
- print_text(pc, font_minute, buf, ALIGN_LEFT, left+width/2, left+width/2, y+yinc, y);
-
- /* internal lines */
- gnome_print_moveto(pc, left+width, y);
- gnome_print_lineto(pc, right, y);
- gnome_print_stroke (pc);
- gnome_print_moveto(pc, left+width/2, y+yinc/2);
- gnome_print_lineto(pc, right, y+yinc/2);
- gnome_print_stroke (pc);
-
- }
-
- start = time_day_begin(whence);
- end = time_day_end(start);
-
- cal_client_generate_instances (gcal->client, CALOBJ_TYPE_EVENT, start, end,
- print_day_details_cb, &pdi);
-
- num_slots = g_list_length (pdi.slots);
- slot_width = (right-left-width)/num_slots;
-
- for (i = num_slots, l = pdi.slots; l; i--, l = l->next) {
- GList *e = (GList *)l->data;
-
- for (; e; e = e->next) {
- struct einfo *ei = (struct einfo *)e->data;
-
- y = top - (top - bottom) * (ei->start - start) / (end - start) - 1;
- yend = top - (top - bottom) * (ei->end - start) / (end - start) + 1;
- x = left + width + slot_width * (num_slots - i);
-
- if (num_slots > 0)
- x++;
-
- if (i == 0)
- xend = x + (num_slots - ei->count) * slot_width - 2;
- else
- xend = x + slot_width - 2;
-
- print_border (pc, x, xend, y, yend, 0.0, 0.9);
-
- bound_text (pc, font_summary, ei->text, x, xend, y, yend, 0);
-
- g_free (ei);
- }
- g_list_free (e);
- }
- g_list_free (pdi.slots);
-
- print_border (pc, left, right, top, bottom, 1.0, -1.0);
-
- gtk_object_unref (GTK_OBJECT (font_hour));
- gtk_object_unref (GTK_OBJECT (font_minute));
- gtk_object_unref (GTK_OBJECT (font_summary));
-}
-
-/*
- * Print Day Summary
- */
-#if 0
-#define TIME_FMT "%X"
-#else
-#define TIME_FMT "%l:%M%p"
-#endif
-
-static gboolean
-print_day_summary_cb (CalComponent *comp, time_t istart, time_t iend, gpointer data)
-{
- CalComponentText text;
- struct psinfo *psi = (struct psinfo *)data;
- struct einfo *ei;
-
- ei = g_new (struct einfo, 1);
-
- cal_component_get_summary (comp, &text);
- ei->text = g_strdup (text.value);
-
- ei->start = istart;
- ei->end = iend;
- ei->count = 0;
-
- g_list_append (psi->events, ei);
-
- return TRUE;
-}
-
-static void
-print_day_summary (GnomePrintContext *pc, GnomeCalendar *gcal, time_t whence,
- double left, double right, double top, double bottom,
- double size, int totime, int titleformat)
-{
- struct psinfo psi;
- time_t start, end;
- GList *l;
- GnomeFont *font_summary;
- double y, yend, x, xend, inc, incsmall;
- char buf[100];
- double margin;
- struct tm tm;
-
- /* fill static detail */
- font_summary = gnome_font_new_closest ("Times", GNOME_FONT_BOOK, 0, size);
-
- gnome_print_setfont (pc, font_summary);
-
- start = time_day_begin(whence);
- end = time_day_end(start);
-
- tm = *localtime(&start);
-
- format_date(start, titleformat, buf, 100);
- titled_box (pc, buf, font_summary, ALIGN_RIGHT | ALIGN_BORDER,
- &left, &right, &top, &bottom, 0.0);
-
- cal_client_generate_instances (gcal->client, CALOBJ_TYPE_EVENT, start, end,
- print_day_summary_cb, &psi);
- inc = size*0.3;
- incsmall = size*0.2;
-
- y = top-inc;
- yend = bottom-incsmall;
-
- /* do a good rough approximation of the 'widest' time */
- tm.tm_year = 2000;
- tm.tm_mon = 12;
- tm.tm_mday = 22;
- tm.tm_sec = 22;
- tm.tm_min = 22;
- tm.tm_hour = 23;
- strftime(buf, 100, TIME_FMT, &tm);
- margin = gnome_font_get_width_string(font_summary, buf);
-
- for (l = psi.events; l; l = l->next) {
- struct einfo *ei = (struct einfo *)l->data;
-
- x = left + incsmall;
- xend = right - inc;
-
- if (y - font_summary->size < bottom)
- break;
-
- tm = *localtime (&ei->start);
- strftime (buf, 100, TIME_FMT, &tm);
- gnome_print_moveto (pc, x + (margin
- - gnome_font_get_width_string (font_summary, buf)),
- y - font_summary->size);
- gnome_print_show (pc, buf);
-
- if (totime) {
- tm = *localtime (&ei->end);
- strftime (buf, 100, TIME_FMT, &tm);
- gnome_print_moveto (pc,
- (x + margin + inc
- + (margin
- - gnome_font_get_width_string (font_summary, buf))),
- y - font_summary->size);
- gnome_print_show (pc, buf);
-
- y = bound_text (pc, font_summary, ei->text,
- x + margin * 2 + inc * 2, xend,
- y, yend, 0);
- } else {
- /* we also indent back after each time is printed */
- y = bound_text (pc, font_summary, ei->text,
- x + margin + inc, xend,
- y, yend, -margin + inc);
- }
-
- y += font_summary->size - inc;
-
- g_free (ei);
- }
- g_list_free (psi.events);
-
- gtk_object_unref (GTK_OBJECT (font_summary));
-}
-
-static void
-print_week_summary (GnomePrintContext *pc, GnomeCalendar *gcal, time_t whence,
- double left, double right, double top, double bottom)
-{
- double y, l, r, t, b;
- time_t now;
- int i;
-
- l = left;
- r = (right-left)/2+left;
- t = top;
- y = (top-bottom)/3;
- b = top-y;
- now = time_week_begin(whence); /* returns sunday, we need monday */
- now = time_add_day(now, 1);
- for (i = 0; i < 7; i++) {
- print_day_summary (pc, gcal, now, l, r, t, b,
- 10, TRUE, DATE_DAY | DATE_DAYNAME | DATE_MONTH);
- now = time_add_day (now, 1);
- switch (i) {
- case 5:
- y /= 2.0;
- b += y;
- case 0:
- case 1:
- case 3:
- case 4:
- t -= y;
- b -= y;
- break;
- case 2:
- l = r;
- r = right;
- t = top;
- b = t-y;
- break;
- case 6:
- break;
- }
- }
-}
-
-static void
-print_year_summary (GnomePrintContext *pc, GnomeCalendar *gcal, time_t whence,
- double left, double right, double top, double bottom, int morerows)
-{
- double y, x, l, r, t, b;
- time_t now;
- int xx, yy, rows, cols;
-
- l = left;
- t = top;
- if (morerows) {
- rows=4;
- cols=3;
- } else {
- rows=3;
- cols=4;
- }
- y = (top-bottom)/rows;
- x = (right-left)/cols;
- r = l+x;
- b = top-y;
- now = time_year_begin(whence);
- for (yy = 0; yy < rows; yy++) {
- t = top - y * yy;
- b = t - y;
- for (xx = 0; xx < cols; xx++) {
- l = left + x * xx;
- r = l + x;
- print_month_small (pc, gcal, now,
- l + 8, r - 8, t - 8, b + 8, DATE_MONTH, 0, 0, TRUE);
- now = time_add_month (now, 1);
- }
- }
-}
-
-static void
-print_month_summary (GnomePrintContext *pc, GnomeCalendar *gcal, time_t whence,
- double left, double right, double top, double bottom)
-{
- time_t now, today;
- int days[42];
- int day;
- struct tm tm;
- int x, y;
- char buf[100];
- GnomeFont *font_days;
-
- now = time_month_begin(whence);
- tm = *localtime (&now);
-
- /* get month days */
- build_month(tm.tm_mon, tm.tm_year+1900, week_starts_on_monday, days, 0, 0);
-
- /* a little margin */
- top -= 4;
-
- /* do day names ... */
- font_days = gnome_font_new_closest ("Times", GNOME_FONT_BOLD, 0, 10);
- gnome_print_setfont(pc, font_days);
- for (x=0;x<7;x++) {
- today = time_add_day(now, days[6+x]);
- format_date(today, DATE_DAYNAME, buf, 100);
- print_text(pc, font_days, buf, ALIGN_CENTRE,
- (right-left)*x/7+left, (right-left)*(x+1)/7+left,
- top, top-font_days->size);
- }
- top -= font_days->size*1.5;
- gtk_object_unref (GTK_OBJECT (font_days));
-
- for (y=0;y<6;y++) {
- for (x=0;x<7;x++) {
- day = days[y*7+x];
- if (day!=0) {
- print_day_summary (pc, gcal, now,
- (right-left)*x/7+left,
- (right-left)*(x+1)/7+left,
- top - (top-bottom)*y/6,
- top - (top-bottom)*(y+1)/6, 6, FALSE,
- day==1?(DATE_DAY|DATE_MONTH):DATE_DAY);
- now = time_add_day(now, 1);
- }
- }
- }
-}
-
-/*
- * Print to do details
- */
-static gboolean
-print_todo_details_cb (CalComponent *comp, time_t istart, time_t iend, gpointer data)
-{
- CalComponentText text;
- struct ptinfo *pti = (struct ptinfo *)data;
- struct einfo *ei;
-
- ei = g_new0 (struct einfo, 1);
-
- cal_component_get_summary (comp, &text);
- ei->text = g_strdup (text.value);
-
- g_list_append (pti->todos, ei);
-
- return TRUE;
-}
-
-static void
-print_todo_details (GnomePrintContext *pc, GnomeCalendar *gcal, time_t start, time_t end,
- double left, double right, double top, double bottom)
-{
- struct ptinfo pti;
- GList *l;
- GnomeFont *font_summary;
- double y, yend, x, xend;
-
- font_summary = gnome_font_new_closest ("Times", GNOME_FONT_BOOK, 0, 10);
-
- gnome_print_setrgbcolor (pc, 0, 0, 0);
- gnome_print_setlinewidth (pc, 0.0);
-
- titled_box (pc, _("TODO Items"), font_summary,
- ALIGN_CENTRE | ALIGN_BORDER, &left, &right, &top, &bottom, 1.0);
-
- y = top - 3;
- yend = bottom - 2;
-
- cal_client_generate_instances (gcal->client, CALOBJ_TYPE_TODO, start, end,
- print_todo_details_cb, &pti);
-
- for (l = pti.todos; l; l = l->next) {
- struct einfo *ei = (struct einfo *)l->data;
-
- x = left;
- xend = right-2;
-
- if (y < bottom)
- break;
-
- y = bound_text (pc, font_summary, ei->text, x + 2, xend, y, yend, 0);
- y += font_summary->size;
- gnome_print_moveto (pc, x, y - 3);
- gnome_print_lineto (pc, xend, y - 3);
- gnome_print_stroke (pc);
- y -= 3;
-
- g_free (ei);
- }
- g_list_free (pti.todos);
-
- gtk_object_unref (GTK_OBJECT (font_summary));
-}
-
-#if 0
-
-static GnomePrintContext *
-print_context (int preview, char *paper)
-{
- GtkWidget *toplevel, *canvas, *sw;
- GnomePrinter *printer;
- GnomePrintContext *pc;
-
- if (preview) {
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
- gtk_widget_push_visual (gdk_rgb_get_visual ());
-
- toplevel = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_widget_set_usize (toplevel, 700, 700);
- sw = gtk_scrolled_window_new (NULL, NULL);
- canvas = gnome_canvas_new_aa ();
- gtk_container_add (GTK_CONTAINER (toplevel), sw);
- gtk_container_add (GTK_CONTAINER (sw), canvas);
-
- gnome_canvas_set_pixels_per_unit((GnomeCanvas *)canvas, 1);
-
- pc = gnome_print_preview_new ((GnomeCanvas *)canvas, paper);
-
- gtk_widget_show_all (toplevel);
-
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
- } else {
- printer = gnome_printer_dialog_new_modal ();
-
- if (!printer)
- return NULL;
-
- pc = gnome_print_context_new_with_paper_size (printer, paper);
- }
-
- return pc;
-}
-
-#endif
-
-/* 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)
-{
- GtkWidget *box;
- GtkWidget *radio;
- GSList *group;
- char text[1024];
- struct tm tm;
- time_t week_begin, week_end;
- struct tm week_begin_tm, week_end_tm;
-
- box = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
-
- tm = *localtime (&at);
-
- /* Day */
-
- strftime (text, sizeof (text), _("Current 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_begin = time_week_begin (at);
- week_end = time_add_day (time_week_end (at), -1);
-
- week_begin_tm = *localtime (&week_begin);
- week_end_tm = *localtime (&week_end);
-
- /* FIXME: how to make this localization-friendly? */
-
- if (week_begin_tm.tm_mon == week_end_tm.tm_mon) {
- char month[128];
- char day1[128];
- char day2[128];
-
- strftime (month, sizeof (month), _("%a"), &week_begin_tm);
- strftime (day1, sizeof (day1), _("%b"), &week_begin_tm);
- strftime (day2, sizeof (day2), _("%b"), &week_end_tm);
-
- g_snprintf (text, sizeof (text), _("Current week (%s %s %d - %s %d %d)"),
- day1, month, week_begin_tm.tm_mday,
- day2, week_end_tm.tm_mday,
- week_begin_tm.tm_year + 1900);
- } else {
- char month1[128];
- char month2[128];
- char day1[128];
- char day2[128];
-
- strftime (month1, sizeof (month1), _("%a"), &week_begin_tm);
- strftime (month2, sizeof (month2), _("%a"), &week_end_tm);
- strftime (day1, sizeof (day1), _("%b"), &week_begin_tm);
- strftime (day2, sizeof (day2), _("%b"), &week_end_tm);
-
- if (week_begin_tm.tm_year == week_end_tm.tm_year)
- g_snprintf (text, sizeof (text),
- _("Current week (%s %s %d - %s %s %d %d)"),
- day1, month1, week_begin_tm.tm_mday,
- day2, month2, week_end_tm.tm_mday,
- week_begin_tm.tm_year + 1900);
- else
- g_snprintf (text, sizeof (text),
- _("Current week (%s %s %d %d - %s %s %d %d)"),
- day1, month1, week_begin_tm.tm_mday,
- week_begin_tm.tm_year + 1900,
- day2, month2, week_end_tm.tm_mday,
- week_end_tm.tm_year + 1900);
- }
-
- 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 */
-
- strftime (text, sizeof (text), _("Current month (%a %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 */
-
- strftime (text, sizeof (text), _("Current 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;
-}
-
-void
-print_calendar (GnomeCalendar *gcal, gboolean preview, time_t at, PrintView default_view)
-{
- GnomePrinter *printer;
- GnomePrintMaster *gpm;
- GnomePrintContext *pc;
- int copies, collate;
- const GnomePaper *paper_info;
- double l, r, t, b, todo, header;
- char buf[100];
- time_t when;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- printer = NULL;
- copies = 1;
- collate = FALSE;
-
- if (!preview) {
- GtkWidget *gpd;
- GtkWidget *range;
- int view;
-
- gpd = gnome_print_dialog_new (_("Print Calendar"),
- GNOME_PRINT_DIALOG_RANGE | GNOME_PRINT_DIALOG_COPIES);
-
- view = (int) default_view;
- range = range_selector_new (gpd, at, &view);
- gnome_print_dialog_construct_range_custom (GNOME_PRINT_DIALOG (gpd), range);
-
- gnome_dialog_set_default (GNOME_DIALOG (gpd), GNOME_PRINT_PRINT);
-
- /* Run dialog */
-
- switch (gnome_dialog_run (GNOME_DIALOG (gpd))) {
- case GNOME_PRINT_PRINT:
- break;
-
- case GNOME_PRINT_PREVIEW:
- preview = TRUE;
- break;
-
- case -1:
- return;
-
- default:
- gnome_dialog_close (GNOME_DIALOG (gpd));
- return;
- }
-
- e_dialog_get_values (gpd);
- default_view = (PrintView) view;
-
- gnome_print_dialog_get_copies (GNOME_PRINT_DIALOG (gpd), &copies, &collate);
- printer = gnome_print_dialog_get_printer (GNOME_PRINT_DIALOG (gpd));
-
- gnome_dialog_close (GNOME_DIALOG (gpd));
- }
-
- /* FIXME: allow configuration of paper size */
-
- gpm = gnome_print_master_new ();
-
- paper_info = gnome_paper_with_name (gnome_paper_name_default ());
- gnome_print_master_set_paper (gpm, paper_info);
-
- if (printer)
- gnome_print_master_set_printer (gpm, printer);
-
- gnome_print_master_set_copies (gpm, copies, collate);
-
- pc = gnome_print_master_get_context (gpm);
-
- l = gnome_paper_lmargin (paper_info);
- r = gnome_paper_pswidth (paper_info) - gnome_paper_rmargin (paper_info);
- t = gnome_paper_psheight (paper_info) - gnome_paper_tmargin (paper_info);
- b = gnome_paper_bmargin (paper_info);
-
- /* depending on the view, do a different output */
- switch (default_view) {
- case PRINT_VIEW_DAY: {
- int i, days = 1;
-
- for (i = 0; i < days; i++) {
- todo = ((r - l) / 5) * 4 + l;
- header = t - 70;
- print_todo_details (pc, gcal, 0, INT_MAX, todo, r, header, b);
- print_day_details (pc, gcal, at, l, todo - 2.0, header, b);
-
- print_border (pc, l, r, t, header + 2.0, 1.0, 0.9);
-
- print_month_small (pc, gcal, at, r - 190, r - 104, t - 4,
- header + 8, DATE_MONTH | DATE_YEAR, at, at, FALSE);
- print_month_small (pc, gcal, time_add_month (at, 1), r - 90, r - 4, t - 4,
- header + 8, DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
-
- format_date (at, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size (pc, 24, buf, ALIGN_LEFT, l + 3, todo, t - 3, header);
-
- format_date (at, DATE_DAYNAME, buf, 100);
- print_text_size (pc, 18, buf, ALIGN_LEFT, l + 3, todo, t - 27 - 4, header);
- gnome_print_showpage (pc);
- at = time_add_day (at, 1);
- }
- break;
- }
-
- case PRINT_VIEW_WEEK:
- header = t - 70;
- print_week_summary (pc, gcal, at, l, r, header, b);
-
- /* more solid total outline */
- print_border (pc, l, r, header, b, 1.0, -1.0);
-
- /* header border */
- print_border (pc, l, r, t, header + 2.0, 1.0, 0.9);
-
- when = time_week_begin (at);
- when = time_add_day (when, 1);
-
- print_month_small (pc, gcal, at, r - 90, r - 4, t - 4,
- header + 8, DATE_MONTH | DATE_YEAR, when, time_add_week (when, 1),
- FALSE);
- print_month_small (pc, gcal, time_add_month (at, -1), r - 190, r - 104, t - 4,
- header + 8, DATE_MONTH | DATE_YEAR, when, time_add_week (when, 1),
- FALSE);
-
- format_date (when, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size (pc, 24, buf, ALIGN_LEFT, l + 3, r, t - 4, header);
-
- when = time_add_day (when, 6);
- format_date (when, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size (pc, 24, buf, ALIGN_LEFT, l + 3, r, t - 24 - 3, header);
- gnome_print_showpage (pc);
- break;
-
- case PRINT_VIEW_MONTH:
- header = t - 70;
- gnome_print_rotate (pc, 90);
- gnome_print_translate (pc, 0, -gnome_paper_pswidth (paper_info));
- /*print_month_summary(pc, cal, at, l, r, header, b);*/
- print_month_summary (pc, gcal, at, b, t, r - 70, l);
-
- print_border (pc, b, t, r, r - 72.0, 1.0, 0.9);
-
- print_month_small (pc, gcal, time_add_month (at, 1),
- t - (t - b) / 7 + 2, t - 8, r - 4, r - 68,
- DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
- print_month_small (pc, gcal, time_add_month (at, -1),
- b + 8, b + (t - b) / 7 - 2, r - 4, r - 68,
- DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
-
- /* centered title */
- format_date (at, DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size (pc, 24, buf, ALIGN_CENTRE, b + 3, t, r - 3, l);
- gnome_print_showpage (pc);
- break;
-
- case PRINT_VIEW_YEAR:
-#if 0
- /* landscape */
- gnome_print_rotate(pc, 90);
- gnome_print_translate(pc, 0, -gnome_paper_pswidth(paper_info));
- print_year_summary(pc, gcal, at, b, t, r-50, l, FALSE);
-
- /* centered title */
- format_date(at, DATE_YEAR, buf, 100);
- print_text_size(pc, 24, buf, ALIGN_CENTRE, b+3, t, r-3, l);
-#else
- /* portrait */
- print_year_summary(pc, gcal, at, l, r, t-50, b, TRUE);
-
- /* centered title */
- format_date(at, DATE_YEAR, buf, 100);
- print_text_size(pc, 24, buf, ALIGN_CENTRE, l+3, r, t-3, b);
-#endif
- gnome_print_showpage(pc);
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- gnome_print_master_close (gpm);
-
- if (preview) {
- GnomePrintMasterPreview *gpmp;
-
- gpmp = gnome_print_master_preview_new (gpm, _("Print Preview"));
- gtk_widget_show (GTK_WIDGET (gpmp));
- } else
- gnome_print_master_print (gpm);
-
- gtk_object_unref (GTK_OBJECT (gpm));
-}
diff --git a/calendar/gui/print.h b/calendar/gui/print.h
deleted file mode 100644
index e88c4a8e01..0000000000
--- a/calendar/gui/print.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Evolution calendar - Print support
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- * Federico Mena-Quintero <federico@helixcode.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 PRINT_H
-#define PRINT_H
-
-#include "gnome-cal.h"
-
-
-
-typedef enum {
- PRINT_VIEW_DAY,
- PRINT_VIEW_WEEK,
- PRINT_VIEW_MONTH,
- PRINT_VIEW_YEAR
-} PrintView;
-
-void print_calendar (GnomeCalendar *gcal, gboolean preview, time_t at, PrintView default_view);
-
-
-
-#endif
diff --git a/calendar/gui/prop.c b/calendar/gui/prop.c
deleted file mode 100644
index 2555059af8..0000000000
--- a/calendar/gui/prop.c
+++ /dev/null
@@ -1,938 +0,0 @@
-/* Calendar properties dialog box
- *
- * Copyright (C) 1998 the Free Software Foundation
- *
- * Authors: Miguel de Icaza <miguel@kernel.org>
- * Federico Mena <federico@nuclecu.unam.mx>
- */
-#include <config.h>
-#ifdef HAVE_LANGINGO_H
-#include <langinfo.h>
-#else
-#include <locale.h>
-#endif
-#include <gnome.h>
-#include "gnome-cal.h"
-#include "gnome-month-item.h"
-#include "calendar-commands.h"
-#include "mark.h"
-
-/* These specify the page numbers in the preferences notebook */
-enum {
- PROP_TIME_DISPLAY,
- PROP_COLORS,
- PROP_TODO,
- PROP_ALARMS
-};
-
-static GtkWidget *prop_win; /* The preferences dialog */
-
-/* Widgets for the time display page */
-
-static GtkWidget *time_format_12; /* Radio button for 12-hour format */
-static GtkWidget *time_format_24; /* Radio button for 24-hour format */
-static GtkWidget *start_on_sunday; /* Check button for weeks starting on Sunday */
-static GtkWidget *start_on_monday; /* Check button for weeks starting on Monday */
-static GtkWidget *start_omenu; /* Option menu for start of day */
-static GtkWidget *end_omenu; /* Option menu for end of day */
-static GtkWidget *start_items[24]; /* Menu items for start of day menu */
-static GtkWidget *end_items[24]; /* Menu items for end of day menu */
-
-/* Widgets for the colors page */
-
-static GtkWidget *color_pickers[COLOR_PROP_LAST];
-static GnomeCanvasItem *month_item;
-
-/* Widgets for the todo page */
-static GtkWidget *due_date_show_button;
-
-static GtkWidget *todo_item_time_remaining_show_button;
-
-static GtkWidget *todo_item_highlight_overdue;
-static GtkWidget *todo_item_highlight_not_due_yet;
-static GtkWidget *todo_item_highlight_due_today;
-
-static GtkWidget *priority_show_button;
-
-/* Widgets for the alarm page */
-static GtkWidget *enable_display_beep;
-static GtkWidget *to_cb;
-static GtkWidget *to_spin;
-static GtkWidget *snooze_cb;
-static GtkWidget *snooze_spin;
-
-/* prototypes */
-#if 0
-static void prop_apply_alarms (void);
-#endif
-static void create_alarm_page (void);
-static void to_cb_changed (GtkWidget* object, gpointer data);
-static void snooze_cb_changed (GtkWidget* object, gpointer data);
-
-GtkWidget* make_spin_button (int val, int low, int high);
-void ee_create_ae (GtkTable *table, char *str, CalendarAlarm *alarm,
- enum AlarmType type, int y, gboolean sens,
- GtkSignalFunc dirty_func);
-void ee_store_alarm (CalendarAlarm *alarm, enum AlarmType type);
-
-/* Callback used when the property box is closed -- just sets the prop_win variable to null. */
-static int
-prop_cancel (void)
-{
- prop_win = NULL;
- return FALSE;
-}
-
-/* Returns the index of the active item in a menu */
-static int
-get_active_index (GtkWidget *menu)
-{
- GtkWidget *active;
-
- active = gtk_menu_get_active (GTK_MENU (menu));
- return GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (active)));
-}
-
-/* Applies the settings in the time display page */
-static void
-prop_apply_time_display (void)
-{
- /* Day begin/end */
-
- day_begin = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (start_omenu)));
- day_end = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (end_omenu)));
- gnome_config_set_int ("/calendar/Calendar/Day start", day_begin);
- gnome_config_set_int ("/calendar/Calendar/Day end", day_end);
-
- /* Time format */
-
- am_pm_flag = GTK_TOGGLE_BUTTON (time_format_12)->active;
- gnome_config_set_bool ("/calendar/Calendar/AM PM flag", am_pm_flag);
-
- /* Week start */
-
- week_starts_on_monday = GTK_TOGGLE_BUTTON (start_on_monday)->active;
- gnome_config_set_bool ("/calendar/Calendar/Week starts on Monday", week_starts_on_monday);
-
- gnome_config_sync ();
- time_format_changed ();
-}
-
-/* Applies the settings in the colors page */
-static void
-prop_apply_colors (void)
-{
- int i;
- char *cspec;
- gushort r, g, b;
-
- for (i = 0; i < COLOR_PROP_LAST; i++) {
- gnome_color_picker_get_i16 (GNOME_COLOR_PICKER (color_pickers[i]), &r, &g, &b, NULL);
- color_props[i].r = r;
- color_props[i].g = g;
- color_props[i].b = b;
-
- cspec = build_color_spec (color_props[i].r, color_props[i].g, color_props[i].b);
- gnome_config_set_string (color_props[i].key, cspec);
- }
-
- gnome_config_sync ();
- colors_changed ();
-}
-/* Applies the settings in the todo page (FIX THIS IF ITS NOT WRITTEN) */
-static void
-prop_apply_todo(void)
-{
- todo_show_due_date = GTK_TOGGLE_BUTTON (due_date_show_button)->active;
-
- todo_item_dstatus_highlight_overdue = GTK_TOGGLE_BUTTON(todo_item_highlight_overdue)->active;
- todo_item_dstatus_highlight_not_due_yet = GTK_TOGGLE_BUTTON(todo_item_highlight_not_due_yet)->active;
- todo_item_dstatus_highlight_due_today = GTK_TOGGLE_BUTTON(todo_item_highlight_due_today)->active;
-
- todo_show_priority = GTK_TOGGLE_BUTTON (priority_show_button)->active;
-
- todo_show_time_remaining = GTK_TOGGLE_BUTTON (todo_item_time_remaining_show_button)->active;
-
- /* storing the values */
-
- gnome_config_set_bool("/calendar/Todo/show_time_remain", todo_show_time_remaining);
- gnome_config_set_bool("/calendar/Todo/highlight_overdue", todo_item_dstatus_highlight_overdue);
-
- gnome_config_set_bool("/calendar/Todo/highlight_due_today", todo_item_dstatus_highlight_due_today);
-
- gnome_config_set_bool("/calendar/Todo/highlight_not_due_yet", todo_item_dstatus_highlight_not_due_yet);
- gnome_config_set_bool("/calendar/Todo/show_due_date", todo_show_due_date);
- gnome_config_set_bool("/calendar/Todo/show_priority", todo_show_priority);
- /* need to sync our config changes. */
- gnome_config_sync ();
-
- /* apply the current changes */
- todo_properties_changed();
-}
-
-
-/* Callback used when the Apply button is clicked. */
-static void
-prop_apply (GtkWidget *w, int page)
-{
- switch (page) {
- case PROP_TIME_DISPLAY:
- prop_apply_time_display ();
- break;
-
- case PROP_COLORS:
- prop_apply_colors ();
- break;
-
- case PROP_TODO:
- prop_apply_todo ();
- break;
-
- case PROP_ALARMS:
-#if 0
- prop_apply_alarms ();
-#endif
- break;
-
- case -1:
- break;
-
- default:
- g_warning ("We have a loose penguin!");
- g_assert_not_reached ();
- }
-}
-
-/* Notifies the property box that the data has changed */
-static void
-prop_changed (void)
-{
- gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
-}
-
-/* Builds and returns a two-element radio button group surrounded by a frame. The radio buttons are
- * stored in the specified variables, and the first radio button's state is set according to the
- * specified flag value. The buttons are connected to the prop_changed() function to update the property
- * box's dirty state.
- */
-static GtkWidget *
-build_two_radio_group (char *title,
- char *radio_1_title, GtkWidget **radio_1_widget,
- char *radio_2_title, GtkWidget **radio_2_widget,
- int radio_1_value)
-{
- GtkWidget *frame;
- GtkWidget *vbox;
-
- frame = gtk_frame_new (title);
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_add (GTK_CONTAINER (frame), vbox);
-
- *radio_1_widget = gtk_radio_button_new_with_label (NULL, radio_1_title);
- gtk_box_pack_start (GTK_BOX (vbox), *radio_1_widget, FALSE, FALSE, 0);
-
- *radio_2_widget = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (*radio_1_widget),
- radio_2_title);
- gtk_box_pack_start (GTK_BOX (vbox), *radio_2_widget, FALSE, FALSE, 0);
-
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (*radio_1_widget), radio_1_value);
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (*radio_2_widget), !radio_1_value);
-
- gtk_signal_connect (GTK_OBJECT (*radio_1_widget), "toggled",
- (GtkSignalFunc) prop_changed,
- NULL);
-
- return frame;
-}
-
-/* Callback invoked when a menu item from the start/end time option menus is selected. It adjusts
- * the other menu to the proper time, if needed.
- */
-static void
-hour_activated (GtkWidget *widget, gpointer data)
-{
- int start, end;
-
- if (data == start_omenu) {
- /* Adjust the end menu */
-
- start = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (widget)));
- end = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (end_omenu)));
-
- if (end < start)
- gtk_option_menu_set_history (GTK_OPTION_MENU (end_omenu), start);
- } else if (data == end_omenu) {
- /* Adjust the start menu */
-
- end = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (widget)));
- start = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (start_omenu)));
-
- if (start > end)
- gtk_option_menu_set_history (GTK_OPTION_MENU (start_omenu), end);
- } else
- g_assert_not_reached ();
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
-}
-
-/* Builds an option menu of 24 hours */
-static GtkWidget *
-build_hours_menu (GtkWidget **items, int active)
-{
- GtkWidget *omenu;
- GtkWidget *menu;
- int i;
- char buf[100];
- struct tm tm;
- int am_pm_flag;
-
- omenu = gtk_option_menu_new ();
- menu = gtk_menu_new ();
- am_pm_flag = GTK_TOGGLE_BUTTON (time_format_12)->active;
-
- memset (&tm, 0, sizeof (tm));
-
- for (i = 0; i < 24; i++) {
- tm.tm_hour = i;
- if (am_pm_flag)
- strftime (buf, 100, "%I:%M %p", &tm);
- else
- strftime (buf, 100, "%H:%M", &tm);
-
- items[i] = gtk_menu_item_new_with_label (buf);
- gtk_object_set_user_data (GTK_OBJECT (items[i]), GINT_TO_POINTER (i));
- gtk_signal_connect (GTK_OBJECT (items[i]), "activate",
- (GtkSignalFunc) hour_activated,
- omenu);
-
- gtk_menu_append (GTK_MENU (menu), items[i]);
- gtk_widget_show (items[i]);
- }
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), active);
- return omenu;
-}
-
-/* Creates the time display page in the preferences dialog */
-static void
-create_time_display_page (void)
-{
- GtkWidget *table;
- GtkWidget *vbox;
- GtkWidget *frame;
- GtkWidget *hbox2;
- GtkWidget *hbox3;
- GtkWidget *w;
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (table), GNOME_PAD_SMALL);
- gtk_table_set_row_spacings (GTK_TABLE (table), GNOME_PAD_SMALL);
- gtk_table_set_col_spacings (GTK_TABLE (table), GNOME_PAD_SMALL);
- gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), table,
- gtk_label_new (_("Time display")));
-
- /* Time format */
-
- w = build_two_radio_group (_("Time format"),
- _("12-hour (AM/PM)"), &time_format_12,
- _("24-hour"), &time_format_24,
- am_pm_flag);
- gtk_table_attach (GTK_TABLE (table), w,
- 0, 1, 0, 1,
- GTK_EXPAND | GTK_FILL,
- GTK_EXPAND | GTK_FILL,
- 0, 0);
-
- /* Weeks start on */
-
- w = build_two_radio_group (_("Weeks start on"),
- _("Sunday"), &start_on_sunday,
- _("Monday"), &start_on_monday,
- !week_starts_on_monday);
- gtk_table_attach (GTK_TABLE (table), w,
- 0, 1, 1, 2,
- GTK_EXPAND | GTK_FILL,
- GTK_EXPAND | GTK_FILL,
- 0, 0);
-
- /* Day range */
-
- frame = gtk_frame_new (_("Day range"));
- gtk_table_attach (GTK_TABLE (table), frame,
- 1, 2, 0, 2,
- GTK_EXPAND | GTK_FILL,
- GTK_EXPAND | GTK_FILL,
- 0, 0);
-
- vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
- gtk_container_set_border_width (GTK_CONTAINER (vbox), GNOME_PAD_SMALL);
- gtk_container_add (GTK_CONTAINER (frame), vbox);
-
- w = gtk_label_new (_("Please select the start and end hours you want\n"
- "to be displayed in the day view and week view.\n"
- "Times outside this range will not be displayed\n"
- "by default."));
- gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
- gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.0);
- gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
-
- hbox2 = gtk_hbox_new (FALSE, GNOME_PAD);
- gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
-
- /* Day start */
-
- hbox3 = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
- gtk_box_pack_start (GTK_BOX (hbox2), hbox3, FALSE, FALSE, 0);
-
- w = gtk_label_new (_("Day start:"));
- gtk_box_pack_start (GTK_BOX (hbox3), w, FALSE, FALSE, 0);
-
- start_omenu = build_hours_menu (start_items, day_begin);
- gtk_box_pack_start (GTK_BOX (hbox3), start_omenu, FALSE, FALSE, 0);
-
- /* Day end */
-
- hbox3 = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
- gtk_box_pack_start (GTK_BOX (hbox2), hbox3, FALSE, FALSE, 0);
-
- w = gtk_label_new (_("Day end:"));
- gtk_box_pack_start (GTK_BOX (hbox3), w, FALSE, FALSE, 0);
-
- end_omenu = build_hours_menu (end_items, day_end);
- gtk_box_pack_start (GTK_BOX (hbox3), end_omenu, FALSE, FALSE, 0);
-}
-
-/* Called when the canvas for the month item is size allocated. We use this to change the canvas'
- * scrolling region and the month item's size.
- */
-static void
-canvas_size_allocate (GtkWidget *widget, GtkAllocation *allocation, gpointer data)
-{
- gnome_canvas_item_set (month_item,
- "width", (double) (allocation->width - 1),
- "height", (double) (allocation->height - 1),
- NULL);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS (widget),
- 0, 0,
- allocation->width, allocation->height);
-}
-
-/* Returns a color spec based on the color pickers */
-static char *
-color_spec_from_picker (int num)
-{
- gushort r, g, b;
-
- gnome_color_picker_get_i16 (GNOME_COLOR_PICKER (color_pickers[num]), &r, &g, &b, NULL);
-
- return build_color_spec (r, g, b);
-}
-
-/* Callback used to query color information for the properties box */
-static char *
-fetch_color_spec (ColorProp propnum, gpointer data)
-{
- return color_spec_from_picker (propnum);
-}
-
-/* Marks fake event days in the month item sample */
-static void
-fake_mark_days (void)
-{
- static int day_nums[] = { 1, 4, 8, 16, 17, 18, 20, 25, 28 }; /* some random days */
- int first_day_index;
- int i;
-
- first_day_index = gnome_month_item_day2index (GNOME_MONTH_ITEM (month_item), 1);
-
- for (i = 0; i < (sizeof (day_nums) / sizeof (day_nums[0])); i++)
- mark_month_item_index (GNOME_MONTH_ITEM (month_item), first_day_index + day_nums[i] - 1,
- fetch_color_spec, NULL);
-}
-
-/* Switches the month item to the current date and highlights the current day's number */
-static void
-set_current_day (void)
-{
- struct tm tm;
- time_t t;
- GnomeCanvasItem *item;
- int day_index;
-
- /* Set the date */
-
- t = time (NULL);
- tm = *localtime (&t);
-
- gnome_canvas_item_set (month_item,
- "year", tm.tm_year + 1900,
- "month", tm.tm_mon,
- NULL);
-
- /* Highlight current day */
-
- day_index = gnome_month_item_day2index (GNOME_MONTH_ITEM (month_item), tm.tm_mday);
- item = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), GNOME_MONTH_ITEM_DAY_LABEL + day_index);
- gnome_canvas_item_set (item,
- "fill_color", color_spec_from_picker (COLOR_PROP_CURRENT_DAY_FG),
- "fontset", CURRENT_DAY_FONTSET,
- NULL);
-}
-
-/* This is the version of a color spec query function that is appropriate for the preferences dialog */
-static char *
-prop_color_func (ColorProp propnum, gpointer data)
-{
- return color_spec_from_picker (propnum);
-}
-
-/* Sets the colors of the month item to the current prerences */
-static void
-reconfigure_month (void)
-{
- colorify_month_item (GNOME_MONTH_ITEM (month_item), prop_color_func, NULL);
- fake_mark_days ();
- set_current_day ();
-
- /* Reset prelighting information */
-
- month_item_prepare_prelight (GNOME_MONTH_ITEM (month_item), fetch_color_spec, NULL);
-}
-
-/* Callback used when a color is changed */
-static void
-color_set (void)
-{
- reconfigure_month ();
- prop_changed ();
-}
-
-/* Creates the colors page in the preferences dialog */
-static void
-create_colors_page (void)
-{
- GtkWidget *frame;
- GtkWidget *hbox;
- GtkWidget *table;
- GtkWidget *w;
- int i;
-
- frame = gtk_frame_new (_("Colors for display"));
- gtk_container_set_border_width (GTK_CONTAINER (frame), GNOME_PAD_SMALL);
- gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), frame,
- gtk_label_new (_("Colors")));
-
- hbox = gtk_hbox_new (FALSE, GNOME_PAD);
- gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
- gtk_container_add (GTK_CONTAINER (frame), hbox);
-
- table = gtk_table_new (COLOR_PROP_LAST, 2, FALSE);
- gtk_table_set_col_spacings (GTK_TABLE (table), GNOME_PAD_SMALL);
- gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
-
- /* Create the color pickers */
-
- for (i = 0; i < COLOR_PROP_LAST; i++) {
- /* Label */
-
- w = gtk_label_new (_(color_props[i].label));
- gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
- gtk_table_attach (GTK_TABLE (table), w,
- 0, 1, i, i + 1,
- GTK_FILL, 0,
- 0, 0);
-
- /* Color picker */
-
- color_pickers[i] = gnome_color_picker_new ();
- gnome_color_picker_set_title (GNOME_COLOR_PICKER (color_pickers[i]), _(color_props[i].label));
- gnome_color_picker_set_i16 (GNOME_COLOR_PICKER (color_pickers[i]),
- color_props[i].r, color_props[i].g, color_props[i].b, 0);
- gtk_table_attach (GTK_TABLE (table), color_pickers[i],
- 1, 2, i, i + 1,
- 0, 0,
- 0, 0);
- gtk_signal_connect (GTK_OBJECT (color_pickers[i]), "color_set",
- (GtkSignalFunc) color_set,
- NULL);
- }
-
- /* Create the sample calendar */
-
- w = gnome_canvas_new ();
- gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
-
- month_item = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (w)));
- gnome_canvas_item_set (month_item,
- "start_on_monday", week_starts_on_monday,
- NULL);
- reconfigure_month ();
-
- gtk_signal_connect (GTK_OBJECT (w), "size_allocate",
- canvas_size_allocate,
- NULL);
-
-}
-
-
-static void
-set_todo_page_options(void)
-{
-
-
- while (gtk_events_pending ())
- gtk_main_iteration ();
-}
-
-static void
-todo_option_set (void)
-{
- prop_changed ();
- set_todo_page_options ();
-}
-
-/* Creates the colors page in the preferences dialog */
-static GtkWidget *
-build_list_options_frame(void)
-{
- GtkWidget *frame;
- GtkWidget *vbox;
- frame = gtk_frame_new (_("Show on TODO List:"));
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_add (GTK_CONTAINER (frame), vbox);
-
- due_date_show_button = gtk_check_button_new_with_label (_("Due Date"));
- priority_show_button = gtk_check_button_new_with_label (_("Priority"));
- todo_item_time_remaining_show_button = gtk_check_button_new_with_label (_("Time Until Due"));
-
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(due_date_show_button), todo_show_due_date);
- gtk_signal_connect (GTK_OBJECT(due_date_show_button),
- "clicked",
- (GtkSignalFunc) todo_option_set,
- NULL);
- gtk_box_pack_start (GTK_BOX (vbox), due_date_show_button, FALSE, FALSE, 0);
-
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(todo_item_time_remaining_show_button), todo_show_time_remaining);
- gtk_signal_connect (GTK_OBJECT(todo_item_time_remaining_show_button),
- "clicked",
- (GtkSignalFunc) todo_option_set,
- NULL);
- gtk_box_pack_start (GTK_BOX (vbox), todo_item_time_remaining_show_button, FALSE, FALSE, 0);
-
-
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(priority_show_button), todo_show_priority);
- gtk_signal_connect (GTK_OBJECT(priority_show_button),
- "clicked",
- (GtkSignalFunc) todo_option_set,
- NULL);
- gtk_box_pack_start (GTK_BOX (vbox), priority_show_button, FALSE, FALSE, 0);
- return frame;
-}
-static GtkWidget *
-build_style_list_options_frame(void)
-{
- GtkWidget *frame;
- GtkWidget *vbox;
-
- frame = gtk_frame_new (_("To Do List style options:"));
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_add (GTK_CONTAINER (frame), vbox);
-
- todo_item_highlight_overdue = gtk_check_button_new_with_label (_("Highlight overdue items"));
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(todo_item_highlight_overdue),
- todo_item_dstatus_highlight_overdue);
- todo_item_highlight_not_due_yet = gtk_check_button_new_with_label (_("Highlight not yet due items"));
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(todo_item_highlight_not_due_yet),
- todo_item_dstatus_highlight_overdue);
- todo_item_highlight_due_today = gtk_check_button_new_with_label (_("Highlight items due today"));
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(todo_item_highlight_due_today),
- todo_item_dstatus_highlight_overdue);
-
- gtk_signal_connect (GTK_OBJECT(todo_item_highlight_overdue),
- "clicked",
- (GtkSignalFunc) todo_option_set,
- NULL);
- gtk_signal_connect (GTK_OBJECT(todo_item_highlight_not_due_yet),
- "clicked",
- (GtkSignalFunc) todo_option_set,
- NULL);
- gtk_signal_connect (GTK_OBJECT(todo_item_highlight_due_today),
- "clicked",
- (GtkSignalFunc) todo_option_set,
- NULL);
-
- gtk_box_pack_start (GTK_BOX (vbox), todo_item_highlight_overdue, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), todo_item_highlight_due_today, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), todo_item_highlight_not_due_yet, FALSE, FALSE, 0);
- return frame;
-}
-static void
-create_todo_page (void)
-{
- GtkWidget *frame;
- GtkWidget *main_box;
- GtkWidget *hbox;
-
-
- frame = gtk_frame_new (_("To Do List Properties"));
- gtk_container_set_border_width (GTK_CONTAINER (frame), GNOME_PAD_SMALL);
- gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), frame,
- gtk_label_new (_("To Do List")));
-
- /* first vbox*/
- main_box = gtk_vbox_new(FALSE, GNOME_PAD);
- gtk_container_set_border_width (GTK_CONTAINER (main_box), GNOME_PAD_SMALL);
- gtk_container_add (GTK_CONTAINER (frame), main_box);
-
-
- /* first hbox*/
- hbox = gtk_hbox_new (FALSE, GNOME_PAD);
- gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
- gtk_container_add (GTK_CONTAINER (main_box), hbox);
-
- gtk_box_pack_start (GTK_BOX(hbox), build_list_options_frame(), FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX(hbox), build_style_list_options_frame(), FALSE, FALSE, 0);
-
- set_todo_page_options();
-}
-
-/* Creates and displays the preferences dialog for the whole application */
-void
-properties (GtkWidget *toplevel)
-{
- static GnomeHelpMenuEntry help_entry = { NULL, "properties" };
-
- help_entry.name = gnome_app_id;
-
- if (prop_win)
- return;
-
- prop_win = gnome_property_box_new ();
- gtk_window_set_title (GTK_WINDOW (prop_win), _("Preferences"));
- gnome_dialog_set_parent (GNOME_DIALOG (prop_win),
- GTK_WINDOW (gtk_widget_get_toplevel (toplevel)));
-
- create_time_display_page ();
- create_colors_page ();
- create_todo_page ();
- create_alarm_page ();
-
- gtk_signal_connect (GTK_OBJECT (prop_win), "destroy",
- (GtkSignalFunc) prop_cancel, NULL);
-
- gtk_signal_connect (GTK_OBJECT (prop_win), "delete_event",
- (GtkSignalFunc) prop_cancel, NULL);
-
- gtk_signal_connect (GTK_OBJECT (prop_win), "apply",
- (GtkSignalFunc) prop_apply, NULL);
-
- gtk_signal_connect (GTK_OBJECT (prop_win), "help",
- GTK_SIGNAL_FUNC (gnome_help_pbox_display),
- &help_entry);
-
- gtk_widget_show_all (prop_win);
-}
-
-char *
-build_color_spec (int r, int g, int b)
-{
- static char spec[100];
-
- sprintf (spec, "#%04x%04x%04x", r, g, b);
- return spec;
-}
-
-void
-parse_color_spec (char *spec, int *r, int *g, int *b)
-{
- g_return_if_fail (spec != NULL);
- g_return_if_fail (r != NULL);
- g_return_if_fail (r != NULL);
- g_return_if_fail (r != NULL);
-
- if (sscanf (spec, "#%04x%04x%04x", r, g, b) != 3) {
- g_warning ("Invalid color specification %s, returning black", spec);
-
- *r = *g = *b = 0;
- }
-}
-
-char *
-color_spec_from_prop (ColorProp propnum)
-{
- return build_color_spec (color_props[propnum].r, color_props[propnum].g, color_props[propnum].b);
-}
-
-static void
-create_alarm_page (void)
-{
- GtkWidget *main_box;
- GtkWidget *default_frame;
- GtkWidget *default_table;
- GtkWidget *misc_frame;
- GtkWidget *misc_box;
- GtkWidget *box, *l;
-
- main_box = gtk_vbox_new (FALSE, GNOME_PAD);
- gtk_container_set_border_width (GTK_CONTAINER (main_box), GNOME_PAD_SMALL);
- gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win),
- main_box, gtk_label_new (_("Alarms")));
-
- /* build miscellaneous box */
- misc_frame = gtk_frame_new (_("Alarm Properties"));
- gtk_container_set_border_width (GTK_CONTAINER (misc_frame),
- GNOME_PAD_SMALL);
- misc_box = gtk_vbox_new (FALSE, GNOME_PAD);
-
- gtk_container_set_border_width (GTK_CONTAINER (misc_frame), GNOME_PAD_SMALL);
- gtk_container_add (GTK_CONTAINER (misc_frame), misc_box);
-
- gtk_box_pack_start (GTK_BOX (main_box), misc_frame, FALSE, FALSE, 0);
-
- enable_display_beep = gtk_check_button_new_with_label (_("Beep on display alarms"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (enable_display_beep),
- beep_on_display);
- gtk_box_pack_start (GTK_BOX (misc_box), enable_display_beep, FALSE, FALSE, 0);
- gtk_signal_connect (GTK_OBJECT (enable_display_beep), "toggled",
- (GtkSignalFunc) prop_changed,
- NULL);
-
- /* audio timeout widgets */
- box = gtk_hbox_new (FALSE, GNOME_PAD);
- to_cb = gtk_check_button_new_with_label (_("Audio alarms timeout after"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (to_cb),
- enable_aalarm_timeout);
- gtk_signal_connect (GTK_OBJECT (to_cb), "toggled",
- (GtkSignalFunc) to_cb_changed, NULL);
- gtk_box_pack_start (GTK_BOX (box), to_cb, FALSE, FALSE, 0);
- to_spin = make_spin_button (audio_alarm_timeout, 1, MAX_AALARM_TIMEOUT);
- gtk_widget_set_sensitive (to_spin, enable_aalarm_timeout);
- gtk_signal_connect (GTK_OBJECT (to_spin), "changed",
- (GtkSignalFunc) prop_changed, NULL);
- gtk_box_pack_start (GTK_BOX (box), to_spin, FALSE, FALSE, 0);
- l = gtk_label_new (_(" seconds"));
- gtk_box_pack_start (GTK_BOX (box), l, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (misc_box), box, FALSE, FALSE, 0);
-
- /* snooze widgets */
- box = gtk_hbox_new (FALSE, GNOME_PAD);
- snooze_cb = gtk_check_button_new_with_label (_("Enable snoozing for "));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (snooze_cb),
- enable_snooze);
- gtk_signal_connect (GTK_OBJECT (snooze_cb), "toggled",
- (GtkSignalFunc) snooze_cb_changed, NULL);
- gtk_box_pack_start (GTK_BOX (box), snooze_cb, FALSE, FALSE, 0);
- snooze_spin = make_spin_button (snooze_secs, 1, MAX_SNOOZE_SECS);
- gtk_widget_set_sensitive (snooze_spin, enable_snooze);
- gtk_signal_connect (GTK_OBJECT (snooze_spin), "changed",
- (GtkSignalFunc) prop_changed, NULL);
- gtk_box_pack_start (GTK_BOX (box), snooze_spin, FALSE, FALSE, 0);
- l = gtk_label_new (_(" seconds"));
- gtk_box_pack_start (GTK_BOX (box), l, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (misc_box), box, FALSE, FALSE, 0);
-
- /* populate default frame/box */
- default_frame = gtk_frame_new (_("Defaults"));
- gtk_container_set_border_width (GTK_CONTAINER (default_frame), GNOME_PAD_SMALL);
- gtk_box_pack_start (GTK_BOX (main_box), default_frame, FALSE, FALSE, 0);
- default_table = gtk_table_new (1, 1, 0);
- gtk_container_set_border_width (GTK_CONTAINER (default_table), 4);
- gtk_table_set_row_spacings (GTK_TABLE (default_table), 4);
- gtk_table_set_col_spacings (GTK_TABLE (default_table), 4);
- gtk_container_add (GTK_CONTAINER (default_frame), default_table);
-
-#warning "FIX ME"
- /*
- ee_create_ae (GTK_TABLE (default_table), _("Display"),
- &alarm_defaults [ALARM_DISPLAY], ALARM_DISPLAY, 1,
- FALSE, prop_changed);
- ee_create_ae (GTK_TABLE (default_table), _("Audio"),
- &alarm_defaults [ALARM_AUDIO], ALARM_AUDIO, 2,
- FALSE, prop_changed);
- ee_create_ae (GTK_TABLE (default_table), _("Program"),
- &alarm_defaults [ALARM_PROGRAM], ALARM_PROGRAM, 3,
- FALSE, prop_changed);
- ee_create_ae (GTK_TABLE (default_table), _("Mail"),
- &alarm_defaults [ALARM_MAIL], ALARM_MAIL, 4,
- FALSE, prop_changed);
- */
-}
-
-static void
-prop_store_alarm_default_values (CalendarAlarm* alarm)
-{
-#warning "FIX ME"
- // ee_store_alarm (alarm, alarm->type);
-
- switch (alarm->type) {
- case ALARM_DISPLAY:
- gnome_config_push_prefix ("/calendar/alarms/def_disp_");
- break;
- case ALARM_AUDIO:
- gnome_config_push_prefix ("/calendar/alarms/def_audio_");
- break;
- case ALARM_PROGRAM:
- gnome_config_push_prefix ("/calendar/alarms/def_prog_");
- break;
- case ALARM_MAIL:
- gnome_config_push_prefix ("/calendar/alarms/def_mail_");
- break;
- }
-
- gnome_config_set_int ("enabled", alarm->enabled);
- gnome_config_set_int ("count", alarm->count);
- gnome_config_set_int ("units", alarm->units);
- if (alarm->data)
- gnome_config_set_string ("data", alarm->data);
-
- gnome_config_pop_prefix ();
- gnome_config_sync ();
-}
-
-#if 0
-static void
-prop_apply_alarms ()
-{
- int i;
- for (i=0; i < 4; i++)
- prop_store_alarm_default_values (&alarm_defaults [i]);
-
- beep_on_display = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (enable_display_beep));
- gnome_config_set_bool ("/calendar/alarms/beep_on_display", beep_on_display);
- enable_aalarm_timeout = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (to_cb));
- gnome_config_set_bool ("/calendar/alarms/enable_audio_timeout", enable_aalarm_timeout);
- audio_alarm_timeout = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (to_spin));
- gnome_config_set_int ("/calendar/alarms/audio_alarm_timeout", audio_alarm_timeout);
- enable_snooze = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (snooze_cb));
- gnome_config_set_bool ("/calendar/alarms/enable_snooze", enable_snooze);
- snooze_secs = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (snooze_spin));
- gnome_config_set_int ("/calendar/alarms/snooze_secs", snooze_secs);
-
- gnome_config_sync();
-}
-#endif
-
-static void
-to_cb_changed (GtkWidget *object, gpointer data)
-{
- gboolean active =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (to_cb));
- gtk_widget_set_sensitive (to_spin, active);
- prop_changed ();
-}
-
-static void
-snooze_cb_changed (GtkWidget *object, gpointer data)
-{
- gboolean active =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (snooze_cb));
- gtk_widget_set_sensitive (snooze_spin, active);
- prop_changed ();
-}
-
-
diff --git a/calendar/gui/recur.xpm b/calendar/gui/recur.xpm
deleted file mode 100644
index 49836b62e7..0000000000
--- a/calendar/gui/recur.xpm
+++ /dev/null
@@ -1,83 +0,0 @@
-/* XPM */
-static char * recur_xpm[] = {
-"16 16 64 1",
-" c None",
-". c #350000",
-"+ c #2A0000",
-"@ c #1B0000",
-"# c #280000",
-"$ c #430000",
-"% c #090000",
-"& c #160000",
-"* c #250000",
-"= c #460000",
-"- c #550000",
-"; c #610000",
-"> c #0D0000",
-", c #1F0000",
-"' c #4B0000",
-") c #5E0000",
-"! c #6B0000",
-"~ c #750000",
-"{ c #790000",
-"] c #810000",
-"^ c #FFFF83",
-"/ c #FFFF89",
-"( c #FFFF93",
-"_ c #8B0000",
-": c #900000",
-"< c #930000",
-"[ c #FFFF62",
-"} c #A10000",
-"| c #FFFF41",
-"1 c #FFFF3B",
-"2 c #FFFF31",
-"3 c #B70000",
-"4 c #B20000",
-"5 c #AE0000",
-"6 c #FFFF22",
-"7 c #FFFF16",
-"8 c #FFFF06",
-"9 c #C90000",
-"0 c #C10000",
-"a c #BB0000",
-"b c #FFF600",
-"c c #FFE100",
-"d c #FFC500",
-"e c #E40000",
-"f c #D70000",
-"g c #CD0000",
-"h c #FFDB00",
-"i c #FFA900",
-"j c #FF8500",
-"k c #FF5900",
-"l c #FF2800",
-"m c #FC0000",
-"n c #ED0000",
-"o c #E10000",
-"p c #FFAF00",
-"q c #FF9400",
-"r c #FF7400",
-"s c #FF5000",
-"t c #FF0100",
-"u c #F30000",
-"v c #E80000",
-"w c #FF6900",
-"x c #FF4900",
-"y c #FF0800",
-" ",
-" . ",
-" +. ",
-" @#.$ ",
-" %&*.=-; ",
-" >,.')!~ ",
-" &. !{] ",
-" ^/( . _:< ",
-" [[[ }}} ",
-" |12 345 ",
-" 678 90a ",
-" bcd efg ",
-" hdijklmnof ",
-" pqrsltuv ",
-" wxly ",
-" "};
diff --git a/calendar/gui/task-assigned-to.xpm b/calendar/gui/task-assigned-to.xpm
deleted file mode 100644
index f5b0ab6f25..0000000000
--- a/calendar/gui/task-assigned-to.xpm
+++ /dev/null
@@ -1,120 +0,0 @@
-/* XPM */
-static char * task_assigned_to_xpm[] = {
-"16 16 101 2",
-" c None",
-". c #0F0E0D",
-"+ c #3B2F22",
-"@ c #080808",
-"# c #292623",
-"$ c #CBBFAD",
-"% c #BEA47E",
-"& c #AD9A7E",
-"* c #000000",
-"= c #232221",
-"- c #CDC8C1",
-"; c #CBC5BF",
-"> c #766D62",
-", c #887053",
-"' c #A38664",
-") c #A49887",
-"! c #F6DEBC",
-"~ c #957D59",
-"{ c #151211",
-"] c #F3EFEA",
-"^ c #BBB7B0",
-"/ c #A69E97",
-"( c #FEFEFE",
-"_ c #F8F7F5",
-": c #524C45",
-"< c #BBA382",
-"[ c #A59176",
-"} c #F6DBB8",
-"| c #E79E3C",
-"1 c #CB783E",
-"2 c #171716",
-"3 c #EFE8DF",
-"4 c #716A61",
-"5 c #FDFCFC",
-"6 c #605D57",
-"7 c #26221F",
-"8 c #86735E",
-"9 c #D5C0A0",
-"0 c #C4AD8B",
-"a c #F9E9D5",
-"b c #C97138",
-"c c #121110",
-"d c #E9E8E7",
-"e c #73604D",
-"f c #332F29",
-"g c #534C40",
-"h c #D3BFA0",
-"i c #D0BB98",
-"j c #D0BA96",
-"k c #F9E7D1",
-"l c #CA773D",
-"m c #090807",
-"n c #B1B1AF",
-"o c #FBFBF9",
-"p c #CAB290",
-"q c #D5C0A1",
-"r c #D0BA97",
-"s c #FBEFDF",
-"t c #CB793E",
-"u c #272625",
-"v c #F4F4F4",
-"w c #F4EFE7",
-"x c #D0BA98",
-"y c #CFB896",
-"z c #F9EAD5",
-"A c #CC793A",
-"B c #0F0F0D",
-"C c #100F0E",
-"D c #494949",
-"E c #FDFCFB",
-"F c #DACBB0",
-"G c #F5D9B4",
-"H c #CA7537",
-"I c #B79F80",
-"J c #B0A693",
-"K c #262525",
-"L c #939292",
-"M c #ECE3D5",
-"N c #FBF3E8",
-"O c #CA7337",
-"P c #C7B08E",
-"Q c #D3C2A5",
-"R c #918776",
-"S c #0B0A0A",
-"T c #555453",
-"U c #828282",
-"V c #A09179",
-"W c #897C67",
-"X c #5B5245",
-"Y c #191716",
-"Z c #413E3C",
-"` c #978368",
-" . c #867C6A",
-".. c #70685D",
-"+. c #1C1B18",
-"@. c #1D1C1A",
-"#. c #575654",
-"$. c #887B68",
-"%. c #676055",
-"&. c #141211",
-"*. c #0F0F0E",
-" ",
-" . + @ @ ",
-" @ # $ % & @ * * ",
-" @ = - ; > , ' ) @ * ! ~ * ",
-" { ] ^ / ( _ : < [ @ * } | 1 * ",
-" 2 3 4 5 6 7 8 9 0 * a | b * ",
-" c d e f g h i j * k | l * ",
-" m n o p q r j * s | t * ",
-" u v w x y * z | A * B ",
-" C D E F * G | H * I J @ ",
-" K L M * N O * P Q R S ",
-" @ T * U * * V W X Y @ ",
-" Z * * ` ...+.@ @ ",
-" @.#.$.%.&.@ @ ",
-" * *.@ @ ",
-" @ @ "};
diff --git a/calendar/gui/task-assigned.xpm b/calendar/gui/task-assigned.xpm
deleted file mode 100644
index 89faae95f1..0000000000
--- a/calendar/gui/task-assigned.xpm
+++ /dev/null
@@ -1,120 +0,0 @@
-/* XPM */
-static char * task_assigned_xpm[] = {
-"16 16 101 2",
-" c None",
-". c #0F0E0D",
-"+ c #3B2F22",
-"@ c #080808",
-"# c #292623",
-"$ c #CBBFAD",
-"% c #BEA47E",
-"& c #AD9A7E",
-"* c #000000",
-"= c #232221",
-"- c #CDC8C1",
-"; c #CBC5BF",
-"> c #766D62",
-", c #887053",
-"' c #A38664",
-") c #A49887",
-"! c #F6DEBC",
-"~ c #957D59",
-"{ c #151211",
-"] c #F3EFEA",
-"^ c #BBB7B0",
-"/ c #A69E97",
-"( c #FEFEFE",
-"_ c #F8F7F5",
-": c #524C45",
-"< c #BBA382",
-"[ c #A59176",
-"} c #F6DBB8",
-"| c #E79E3C",
-"1 c #CB783E",
-"2 c #171716",
-"3 c #EFE8DF",
-"4 c #716A61",
-"5 c #FDFCFC",
-"6 c #605D57",
-"7 c #26221F",
-"8 c #86735E",
-"9 c #D5C0A0",
-"0 c #C4AD8B",
-"a c #F9E9D5",
-"b c #C97138",
-"c c #121110",
-"d c #E9E8E7",
-"e c #73604D",
-"f c #332F29",
-"g c #534C40",
-"h c #D3BFA0",
-"i c #D0BB98",
-"j c #D0BA96",
-"k c #F9E7D1",
-"l c #CA773D",
-"m c #090807",
-"n c #B1B1AF",
-"o c #FBFBF9",
-"p c #CAB290",
-"q c #D5C0A1",
-"r c #D0BA97",
-"s c #FBEFDF",
-"t c #CB793E",
-"u c #272625",
-"v c #F4F4F4",
-"w c #F4EFE7",
-"x c #D0BA98",
-"y c #CFB896",
-"z c #F9EAD5",
-"A c #CC793A",
-"B c #0F0F0D",
-"C c #100F0E",
-"D c #494949",
-"E c #FDFCFB",
-"F c #DACBB0",
-"G c #F5D9B4",
-"H c #CA7537",
-"I c #B79F80",
-"J c #B0A693",
-"K c #262525",
-"L c #939292",
-"M c #ECE3D5",
-"N c #FBF3E8",
-"O c #CA7337",
-"P c #C7B08E",
-"Q c #D3C2A5",
-"R c #918776",
-"S c #0B0A0A",
-"T c #555453",
-"U c #828282",
-"V c #A09179",
-"W c #897C67",
-"X c #5B5245",
-"Y c #191716",
-"Z c #413E3C",
-"` c #978368",
-" . c #867C6A",
-".. c #70685D",
-"+. c #1C1B18",
-"@. c #1D1C1A",
-"#. c #575654",
-"$. c #887B68",
-"%. c #676055",
-"&. c #141211",
-"*. c #0F0F0E",
-" ",
-" . + @ @ ",
-" @ # $ % & @ * * ",
-" @ = - ; > , ' ) @ * ! ~ * ",
-" { ] ^ / ( _ : < [ @ * } | 1 * ",
-" 2 3 4 5 6 7 8 9 0 * a | b * ",
-" c d e f g h i j * k | l * ",
-" m n o p q r j * s | t * ",
-" u v w x y * z | A * B ",
-" C D E F * G | H * I J @ ",
-" K L M * N O * P Q R S ",
-" @ T * U * * V W X Y @ ",
-" Z * * ` ...+.@ @ ",
-" @.#.$.%.&.@ @ ",
-" * *.@ @ ",
-" @ @ "};
diff --git a/calendar/gui/task-recurring.xpm b/calendar/gui/task-recurring.xpm
deleted file mode 100644
index b3c6126e03..0000000000
--- a/calendar/gui/task-recurring.xpm
+++ /dev/null
@@ -1,120 +0,0 @@
-/* XPM */
-static char * task_recurring_xpm[] = {
-"16 16 101 2",
-" c None",
-". c #0F0E0D",
-"+ c #3B2F22",
-"@ c #080808",
-"# c #292623",
-"$ c #CBBFAD",
-"% c #BEA47E",
-"& c #AD9A7E",
-"* c #000000",
-"= c #232221",
-"- c #CDC8C1",
-"; c #CBC5BF",
-"> c #766D62",
-", c #887053",
-"' c #A38664",
-") c #A49887",
-"! c #F6DEBC",
-"~ c #957D59",
-"{ c #151211",
-"] c #F3EFEA",
-"^ c #BBB7B0",
-"/ c #A69E97",
-"( c #FEFEFE",
-"_ c #F8F7F5",
-": c #524C45",
-"< c #BBA382",
-"[ c #A59176",
-"} c #F6DBB8",
-"| c #E79E3C",
-"1 c #CB783E",
-"2 c #171716",
-"3 c #EFE8DF",
-"4 c #716A61",
-"5 c #FDFCFC",
-"6 c #605D57",
-"7 c #26221F",
-"8 c #86735E",
-"9 c #D5C0A0",
-"0 c #C4AD8B",
-"a c #F9E9D5",
-"b c #C97138",
-"c c #121110",
-"d c #E9E8E7",
-"e c #73604D",
-"f c #332F29",
-"g c #534C40",
-"h c #D3BFA0",
-"i c #D0BB98",
-"j c #D0BA96",
-"k c #F9E7D1",
-"l c #CA773D",
-"m c #090807",
-"n c #B1B1AF",
-"o c #FBFBF9",
-"p c #CAB290",
-"q c #D5C0A1",
-"r c #D0BA97",
-"s c #FBEFDF",
-"t c #CB793E",
-"u c #272625",
-"v c #F4F4F4",
-"w c #F4EFE7",
-"x c #D0BA98",
-"y c #CFB896",
-"z c #F9EAD5",
-"A c #CC793A",
-"B c #0F0F0D",
-"C c #100F0E",
-"D c #494949",
-"E c #FDFCFB",
-"F c #DACBB0",
-"G c #F5D9B4",
-"H c #CA7537",
-"I c #B79F80",
-"J c #B0A693",
-"K c #262525",
-"L c #939292",
-"M c #ECE3D5",
-"N c #FBF3E8",
-"O c #CA7337",
-"P c #C7B08E",
-"Q c #D3C2A5",
-"R c #918776",
-"S c #0B0A0A",
-"T c #555453",
-"U c #828282",
-"V c #A09179",
-"W c #897C67",
-"X c #5B5245",
-"Y c #191716",
-"Z c #413E3C",
-"` c #978368",
-" . c #867C6A",
-".. c #70685D",
-"+. c #1C1B18",
-"@. c #1D1C1A",
-"#. c #575654",
-"$. c #887B68",
-"%. c #676055",
-"&. c #141211",
-"*. c #0F0F0E",
-" ",
-" . + @ @ ",
-" @ # $ % & @ * * ",
-" @ = - ; > , ' ) @ * ! ~ * ",
-" { ] ^ / ( _ : < [ @ * } | 1 * ",
-" 2 3 4 5 6 7 8 9 0 * a | b * ",
-" c d e f g h i j * k | l * ",
-" m n o p q r j * s | t * ",
-" u v w x y * z | A * B ",
-" C D E F * G | H * I J @ ",
-" K L M * N O * P Q R S ",
-" @ T * U * * V W X Y @ ",
-" Z * * ` ...+.@ @ ",
-" @.#.$.%.&.@ @ ",
-" * *.@ @ ",
-" @ @ "};
diff --git a/calendar/gui/task.xpm b/calendar/gui/task.xpm
deleted file mode 100644
index 8115025e20..0000000000
--- a/calendar/gui/task.xpm
+++ /dev/null
@@ -1,120 +0,0 @@
-/* XPM */
-static char * task_xpm[] = {
-"16 16 101 2",
-" c None",
-". c #0F0E0D",
-"+ c #3B2F22",
-"@ c #080808",
-"# c #292623",
-"$ c #CBBFAD",
-"% c #BEA47E",
-"& c #AD9A7E",
-"* c #000000",
-"= c #232221",
-"- c #CDC8C1",
-"; c #CBC5BF",
-"> c #766D62",
-", c #887053",
-"' c #A38664",
-") c #A49887",
-"! c #F6DEBC",
-"~ c #957D59",
-"{ c #151211",
-"] c #F3EFEA",
-"^ c #BBB7B0",
-"/ c #A69E97",
-"( c #FEFEFE",
-"_ c #F8F7F5",
-": c #524C45",
-"< c #BBA382",
-"[ c #A59176",
-"} c #F6DBB8",
-"| c #E79E3C",
-"1 c #CB783E",
-"2 c #171716",
-"3 c #EFE8DF",
-"4 c #716A61",
-"5 c #FDFCFC",
-"6 c #605D57",
-"7 c #26221F",
-"8 c #86735E",
-"9 c #D5C0A0",
-"0 c #C4AD8B",
-"a c #F9E9D5",
-"b c #C97138",
-"c c #121110",
-"d c #E9E8E7",
-"e c #73604D",
-"f c #332F29",
-"g c #534C40",
-"h c #D3BFA0",
-"i c #D0BB98",
-"j c #D0BA96",
-"k c #F9E7D1",
-"l c #CA773D",
-"m c #090807",
-"n c #B1B1AF",
-"o c #FBFBF9",
-"p c #CAB290",
-"q c #D5C0A1",
-"r c #D0BA97",
-"s c #FBEFDF",
-"t c #CB793E",
-"u c #272625",
-"v c #F4F4F4",
-"w c #F4EFE7",
-"x c #D0BA98",
-"y c #CFB896",
-"z c #F9EAD5",
-"A c #CC793A",
-"B c #0F0F0D",
-"C c #100F0E",
-"D c #494949",
-"E c #FDFCFB",
-"F c #DACBB0",
-"G c #F5D9B4",
-"H c #CA7537",
-"I c #B79F80",
-"J c #B0A693",
-"K c #262525",
-"L c #939292",
-"M c #ECE3D5",
-"N c #FBF3E8",
-"O c #CA7337",
-"P c #C7B08E",
-"Q c #D3C2A5",
-"R c #918776",
-"S c #0B0A0A",
-"T c #555453",
-"U c #828282",
-"V c #A09179",
-"W c #897C67",
-"X c #5B5245",
-"Y c #191716",
-"Z c #413E3C",
-"` c #978368",
-" . c #867C6A",
-".. c #70685D",
-"+. c #1C1B18",
-"@. c #1D1C1A",
-"#. c #575654",
-"$. c #887B68",
-"%. c #676055",
-"&. c #141211",
-"*. c #0F0F0E",
-" ",
-" . + @ @ ",
-" @ # $ % & @ * * ",
-" @ = - ; > , ' ) @ * ! ~ * ",
-" { ] ^ / ( _ : < [ @ * } | 1 * ",
-" 2 3 4 5 6 7 8 9 0 * a | b * ",
-" c d e f g h i j * k | l * ",
-" m n o p q r j * s | t * ",
-" u v w x y * z | A * B ",
-" C D E F * G | H * I J @ ",
-" K L M * N O * P Q R S ",
-" @ T * U * * V W X Y @ ",
-" Z * * ` ...+.@ @ ",
-" @.#.$.%.&.@ @ ",
-" * *.@ @ ",
-" @ @ "};
diff --git a/calendar/gui/test.vcf b/calendar/gui/test.vcf
deleted file mode 100644
index bfe93b3c14..0000000000
--- a/calendar/gui/test.vcf
+++ /dev/null
@@ -1,133 +0,0 @@
-BEGIN:VCALENDAR
-PRODID:-//GNOME//NONSGML GnomeCalendar//EN
-TZ:MST
-VERSION:0.13
-BEGIN:VEVENT
-UID:KOrganizer - 846930886
-SEQUENCE:1
-DTSTART:19980601T150000
-DTEND:19980601T150000
-DCREATED:19980402T023558
-LAST-MODIFIED:19980402T023558
-SUMMARY:Cada dos dias de 06/01 al 07/01
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:D2 19980701T140000
-END:VEVENT
-
-BEGIN:VEVENT
-UID:KOrganizer - 846930886
-SEQUENCE:1
-DTSTART:19980501T140000
-DTEND:19980501T140000
-DCREATED:19980402T023558
-LAST-MODIFIED:19980402T023558
-SUMMARY:5 dias.
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:D1 #5
-END:VEVENT
-
-BEGIN:VEVENT
-UID:KOrganizer - 846930886
-SEQUENCE:1
-DTSTART:19980501T140000
-DTEND:19980501T150000
-DCREATED:19980402T023558
-LAST-MODIFIED:19980429T004635
-SUMMARY:Diariamente de 05/01 al 06/01
-STATUS:NEEDS ACTION
-CLASS:PRIVATE
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:D1 19980601T000000
-END:VEVENT
-
-BEGIN:VEVENT
-UID:KOrganizer - 1804289383
-SEQUENCE:1
-DTSTART:19980415T010000
-DTEND:19980415T013000
-DCREATED:19980402T023552
-LAST-MODIFIED:19980330T225948
-SUMMARY:Diario durante 5 dias
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:D1 #5
-END:VEVENT
-
-BEGIN:VEVENT
-UID:KOrganizer - 1804289383
-SEQUENCE:1
-DTSTART:19980415T010000
-DTEND:19980415T013000
-DCREATED:19980402T023552
-LAST-MODIFIED:19980330T225948
-SUMMARY:Diario durante 5 dias
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:D1 #5
-END:VEVENT
-
-BEGIN:VTODO
-UID:KOrganizer - 846930886
-SEQUENCE:1
-DTSTART:19980415T140000
-DUE:19691231T180000
-DCREATED:19980402T023558
-LAST-MODIFIED:19980402T023558
-SUMMARY:Normal
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-END:VTODO
-
-BEGIN:VTODO
-UID:KOrganizer - 1804289383
-SEQUENCE:1
-DTSTART:19980415T120000
-DUE:19691231T180000
-DCREATED:19980402T023552
-LAST-MODIFIED:19980330T225948
-SUMMARY:Semanal -- 4 semanas
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:W1 WE #4
-END:VTODO
-
-BEGIN:VTODO
-UID:KOrganizer - 1804289383
-SEQUENCE:1
-DTSTART:19980415T003000
-DUE:19691231T180000
-DCREATED:19980402T023552
-LAST-MODIFIED:19980330T225948
-SUMMARY:Semana: Mi, Ju, Vi, Dom (10 veces)
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:W1 SU WE TH FR #10
-END:VTODO
-
-END:VCALENDAR
-
diff --git a/calendar/gui/test2.vcf b/calendar/gui/test2.vcf
deleted file mode 100644
index 6446507989..0000000000
--- a/calendar/gui/test2.vcf
+++ /dev/null
@@ -1,133 +0,0 @@
-BEGIN:VCALENDAR
-PRODID:-//GNOME//NONSGML GnomeCalendar//EN
-TZ:MST
-VERSION:0.13
-BEGIN:VEVENT
-UID:KOrganizer - 8469308861
-SEQUENCE:1
-DTSTART:19980601T150000
-DTEND:19980601T150000
-DCREATED:19980402T023558
-LAST-MODIFIED:19980402T023558
-SUMMARY:Cada dos dias de 06/01 al 07/01
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:D2 19980701T140000
-END:VEVENT
-
-BEGIN:VEVENT
-UID:KOrganizer - 8469308862
-SEQUENCE:1
-DTSTART:19980501T140000
-DTEND:19980501T140000
-DCREATED:19980402T023558
-LAST-MODIFIED:19980402T023558
-SUMMARY:5 dias.
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:D1 #5
-END:VEVENT
-
-BEGIN:VEVENT
-UID:KOrganizer - 8469308863
-SEQUENCE:1
-DTSTART:19980501T140000
-DTEND:19980501T150000
-DCREATED:19980402T023558
-LAST-MODIFIED:19980429T004635
-SUMMARY:Diariamente de 05/01 al 06/01
-STATUS:NEEDS ACTION
-CLASS:PRIVATE
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:D1 19980601T000000
-END:VEVENT
-
-BEGIN:VEVENT
-UID:KOrganizer - 18042893834
-SEQUENCE:1
-DTSTART:19980415T010000
-DTEND:19980415T013000
-DCREATED:19980402T023552
-LAST-MODIFIED:19980330T225948
-SUMMARY:Diario durante 5 dias
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:D1 #5
-END:VEVENT
-
-BEGIN:VEVENT
-UID:KOrganizer - 18042893835
-SEQUENCE:1
-DTSTART:19980415T010000
-DTEND:19980415T013000
-DCREATED:19980402T023552
-LAST-MODIFIED:19980330T225948
-SUMMARY:Diario durante 5 dias
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:D1 #5
-END:VEVENT
-
-BEGIN:VTODO
-UID:KOrganizer - 8469308866
-SEQUENCE:1
-DTSTART:19980415T140000
-DUE:19691231T180000
-DCREATED:19980402T023558
-LAST-MODIFIED:19980402T023558
-SUMMARY:Normal
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-END:VTODO
-
-BEGIN:VTODO
-UID:KOrganizer - 18042893837
-SEQUENCE:1
-DTSTART:19980415T120000
-DUE:19691231T180000
-DCREATED:19980402T023552
-LAST-MODIFIED:19980330T225948
-SUMMARY:Semanal -- 4 semanas
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:W1 WE #4
-END:VTODO
-
-BEGIN:VTODO
-UID:KOrganizer - 18042893838
-SEQUENCE:1
-DTSTART:19980415T003000
-DUE:19691231T180000
-DCREATED:19980402T023552
-LAST-MODIFIED:19980330T225948
-SUMMARY:Semana: Mi, Ju, Vi, Dom (10 veces)
-STATUS:NEEDS ACTION
-CLASS:PUBLIC
-PRIORITY:0
-TRANSP:0
-RELATED-TO:0
-RRULE:W1 SU WE TH FR #10
-END:VTODO
-
-END:VCALENDAR
-
diff --git a/calendar/gui/topic.dat b/calendar/gui/topic.dat
deleted file mode 100644
index edc7813b26..0000000000
--- a/calendar/gui/topic.dat
+++ /dev/null
@@ -1,2 +0,0 @@
-gnome-cal.html Manual
-gnome-cal.html#cmdline Command line options \ No newline at end of file
diff --git a/calendar/gui/weekview.xpm b/calendar/gui/weekview.xpm
deleted file mode 100644
index f4900856eb..0000000000
--- a/calendar/gui/weekview.xpm
+++ /dev/null
@@ -1,41 +0,0 @@
-/* XPM */
-static char * weekview_xpm[] = {
-"24 24 14 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-"@ c #D1D1D1",
-"# c #E3E4F5",
-"$ c #8B90C3",
-"% c #AAAFE2",
-"& c #C7CAEB",
-"* c #4550B5",
-"= c #555FC5",
-"- c #2E3BB1",
-"; c #0010A8",
-"> c #BABBCC",
-", c #A3A6C7",
-" ",
-" ",
-" ",
-" ",
-" ...................... ",
-" .............+.++.++.. ",
-" .++@++@++@++@++@++@++. ",
-" .++@++@++@++@++@++@++. ",
-" .@@@@@@@@@@@@@@@@@@@@. ",
-" .++@++@+#$%%$%+@++@++. ",
-" .++@++@+&*==-;+@++@++. ",
-" .@@@@@@@@@@@$;@@@@@@@. ",
-" .++@++@++@+%;%+@++@++. ",
-" .++@++@++@+%;%+@++@++. ",
-" .@@@@@@@@@@-->@@@@@@@. ",
-" .++@++@++@+;*++@++@++. ",
-" .++@++@++@+;*++@++@++. ",
-" .@@@@@@@@@@$,@@@@@@@@. ",
-" .++@++@++@++@++@++@++. ",
-" .++@++@++@++@++@++@++. ",
-" ...................... ",
-" ",
-" ",
-" "};
diff --git a/calendar/gui/workweekview.xpm b/calendar/gui/workweekview.xpm
deleted file mode 100644
index f47061589c..0000000000
--- a/calendar/gui/workweekview.xpm
+++ /dev/null
@@ -1,43 +0,0 @@
-/* XPM */
-static char * workweekview_xpm[] = {
-"24 24 16 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-"@ c #D1D1D1",
-"# c #E3E4F5",
-"$ c #8B90C3",
-"% c #AAAFE2",
-"& c #0010A8",
-"* c #3945BB",
-"= c #555FC5",
-"- c #4550B5",
-"; c #727ACE",
-"> c #C7CAEB",
-", c #2E3BB1",
-"' c #5D66BA",
-") c #BABBCC",
-" ",
-" ",
-" ",
-" ",
-" ...................... ",
-" .............+.++.++.. ",
-" .++@++@++@++@++@++@++. ",
-" .++@++@++@++@++@++@++. ",
-" .@@@@@@@@@@@@@@@@@@@@. ",
-" .++@++@+#$%%$%+@++@++. ",
-" .++@++@+%&*=-=+@++@++. ",
-" .@@@@@@@$&$@@@@@@@@@@. ",
-" .++@++@+%&;%$#+@++@++. ",
-" .++@++@+>-==,;+@++@++. ",
-" .@@@@@@@@@@@$&@@@@@@@. ",
-" .++@++@+#$#+$&+@++@++. ",
-" .++@++@+>,;%'*+@++@++. ",
-" .@@@@@@@@)$$$)@@@@@@@. ",
-" .++@++@++@++@++@++@++. ",
-" .++@++@++@++@++@++@++. ",
-" ...................... ",
-" ",
-" ",
-" "};
diff --git a/calendar/gui/yearview.xpm b/calendar/gui/yearview.xpm
deleted file mode 100644
index 9629150417..0000000000
--- a/calendar/gui/yearview.xpm
+++ /dev/null
@@ -1,45 +0,0 @@
-/* XPM */
-static char * yearview_xpm[] = {
-"24 24 18 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-"@ c #D1D1D1",
-"# c #BABBCC",
-"$ c #AAAFE2",
-"% c #8B90C3",
-"& c #E3E4F5",
-"* c #C7CAEB",
-"= c #5D66BA",
-"- c #3945BB",
-"; c #555FC5",
-"> c #2E3BB1",
-", c #727ACE",
-"' c #4550B5",
-") c #0010A8",
-"! c #A3A6C7",
-"~ c #8E95D8",
-" ",
-" ",
-" ",
-" ",
-" ...................... ",
-" .............+.++.++.. ",
-" .++@++@++@++@++@++@++. ",
-" .++@++@++@++@++@++@++. ",
-" .@@@@@@@@@@@@@@@@@@@@. ",
-" .++#$$%&+@*$%&&%$$%$+. ",
-" .+&=-;>,+#-;'*$)-;';+. ",
-" .@%)%@%)!>=@@@%)%@@@@. ",
-" .++@*$=-$),$%&$),$%&+. ",
-" .++@~;>,$)-;>,*';;>,+. ",
-" .@@@@@%)%)%@%)@@@@%)@. ",
-" .+$)$+%)$)$+%)&%&+%)+. ",
-" .+*>,$=-*>,$=-*>,$=-+. ",
-" .@@#%%%#@#%%%#@#%%%#@. ",
-" .++@++@++@++@++@++@++. ",
-" .++@++@++@++@++@++@++. ",
-" ...................... ",
-" ",
-" ",
-" "};
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 ec6b4e45f0..0000000000
--- a/calendar/idl/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-idldir = $(datadir)/idl
-
-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 4b9b9a7b34..0000000000
--- a/calendar/idl/evolution-calendar.idl
+++ /dev/null
@@ -1,181 +0,0 @@
-/* Evolution calendar interface
- *
- * Copyright (C) 2000 Eskil Heyn Olsen
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Eskil Heyn Olsen <deity@eskil.dk>
- * Federico Mena-Quintero <federico@helixcode.com>
- */
-
-#ifndef _EVOLUTION_CALENDAR_IDL_
-#define _EVOLUTION_CALENDAR_IDL_
-
-#include <Bonobo.idl>
-
-module Evolution {
-
-module Calendar {
- /* A calendar object (event/todo/journal/etc), represented as an
- * iCalendar string.
- */
- typedef string CalObj;
-
- /* An unique identifier for a calendar object */
- typedef string CalObjUID;
-
- /* Sequence of unique identifiers */
- typedef sequence<CalObjUID> CalObjUIDSeq;
-
- /* Flags for getting UID sequences */
- typedef long CalObjType;
- const CalObjType TYPE_EVENT = 1 << 0;
- const CalObjType TYPE_TODO = 1 << 1;
- const CalObjType TYPE_JOURNAL = 1 << 2;
- const CalObjType TYPE_ANY = 0x07;
-
- /* Types of alarms */
- enum AlarmType {
- MAIL,
- PROGRAM,
- DISPLAY,
- AUDIO
- };
-
- /* Used to store a time_t */
- typedef unsigned long Time_t;
-
- /* Used to store pilot IDs */
- typedef unsigned long PilotID;
-
- /* An instance of a calendar object that actually occurs. These are
- * "virtual" objects in that they are used to represent instances of
- * recurring events and alarms. "Real" objects just contain the
- * information required to figure out the times at which they recur or
- * trigger.
- */
- struct CalObjInstance {
- CalObjUID uid;
- Time_t start;
- Time_t end;
- };
-
- typedef sequence<CalObjInstance> CalObjInstanceSeq;
-
- /* An alarm trigger instance */
- struct CalAlarmInstance {
- CalObjUID uid;
- AlarmType type;
- Time_t trigger;
- Time_t occur;
- };
-
- typedef sequence<CalAlarmInstance> CalAlarmInstanceSeq;
-
- interface Listener;
-
- /* Calendar client interface */
- interface Cal : Bonobo::Unknown {
- exception NotFound {};
- exception InvalidRange {};
- exception InvalidObject {};
-
- /* A calendar is identified by its URI */
- readonly attribute string uri;
-
- /* Gets the number of objects of the specified types */
- long get_n_objects (in CalObjType type);
-
- /* Gets an object based on its URI */
- CalObj get_object (in CalObjUID uid)
- raises (NotFound);
-
- /* Gets a list of UIDs based on object type */
- CalObjUIDSeq get_uids (in CalObjType type);
-
- /* Gets a list of objects that occur or recur in the specified time range */
- CalObjUIDSeq get_objects_in_range (in CalObjType type,
- in Time_t start, in Time_t end)
- raises (InvalidRange);
-
- /* Gets the objects whose alarms trigger in the specified time
- * range.
- */
- CalAlarmInstanceSeq get_alarms_in_range (in Time_t start, in Time_t end)
- raises (InvalidRange);
-
- /* Gets the alarms for the specified object that trigger in the
- * specified time range.
- */
- CalAlarmInstanceSeq get_alarms_for_object (in CalObjUID uid,
- in Time_t start, in Time_t end)
- raises (NotFound, InvalidRange);
-
-
- /* something
- *
- */
- CalObjUID get_uid_by_pilot_id (in PilotID pilotid)
- raises (NotFound);
-
-
- /*
- * update_pilot_id:
- * @uid: Unique identifier for the event we want to update
- * @pilot_id: new ID assigned by the pilot
- * @pilot_status: Status to flag the event with
- */
- void update_pilot_id (in CalObjUID uid, in PilotID pilot_id, in unsigned long pilot_status)
- raises (NotFound);
-
- /* Updates an object by adding it if it does not exist or by
- * changing an existing one.
- */
- void update_object (in CalObjUID uid, in CalObj calobj)
- raises (InvalidObject);
-
- /* Removes an object */
- void remove_object (in CalObjUID uid)
- raises (NotFound);
- };
-
- /* Listener for changes in a calendar */
- interface Listener : Bonobo::Unknown {
- /* Return status when loading a calendar; we need better error reporting */
- enum LoadStatus {
- SUCCESS, /* All OK */
- ERROR, /* Generic error */
- IN_USE, /* Requested create while a calendar
- * with the same URI was in use.
- */
- METHOD_NOT_SUPPORTED /* A method handler is not registered */
- };
-
- /* Called from a CalFactory when a calendar is initially loaded
- * or created. The listener must remember the cal object.
- */
- void cal_loaded (in LoadStatus status, in Cal cal);
-
- /* Called from a Calendar when an object is added or changed */
- void obj_updated (in CalObjUID uid);
-
- /* Called from a Calendar when an object is removed */
- void obj_removed (in CalObjUID uid);
- };
-
- /* A calendar factory, can load and create calendars */
- interface CalFactory : Bonobo::Unknown {
- exception NilListener {};
-
- /* Load a calendar from an URI */
- void load (in string uri, in Listener listener)
- raises (NilListener);
-
- /* Create a new calendar at the specified URI */
- void create (in string uri, in Listener listener)
- raises (NilListener);
- };
-};
-
-};
-
-#endif
diff --git a/calendar/pcs/.cvsignore b/calendar/pcs/.cvsignore
deleted file mode 100644
index 7250bfdff6..0000000000
--- a/calendar/pcs/.cvsignore
+++ /dev/null
@@ -1,12 +0,0 @@
-Makefile
-Makefile.in
-.deps
-.libs
-.pure
-*.la
-*.lo
-evolution-calendar-stubs.c
-evolution-calendar-skels.c
-evolution-calendar-common.c
-evolution-calendar.h
-icalendar-test
diff --git a/calendar/pcs/Makefile.am b/calendar/pcs/Makefile.am
deleted file mode 100644
index b435b90229..0000000000
--- a/calendar/pcs/Makefile.am
+++ /dev/null
@@ -1,42 +0,0 @@
-INCLUDES = \
- -DG_LOG_DOMAIN=\"wombat-pcs\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir)/libical/src/libical \
- -I$(top_builddir)/libical/src/libical \
- $(BONOBO_VFS_GNOME_CFLAGS) \
- -DGNOMELOCALEDIR=\""$(datadir)/locale"\"
-
-CORBA_GENERATED = \
- evolution-calendar.h \
- evolution-calendar-common.c \
- evolution-calendar-skels.c \
- evolution-calendar-stubs.c
-
-idls = \
- $(srcdir)/../idl/evolution-calendar.idl
-
-idl_flags = `$(GNOME_CONFIG) --cflags idl` -I $(datadir)/idl
-
-$(CORBA_GENERATED): $(idls)
- $(ORBIT_IDL) $(idl_flags) $(srcdir)/../idl/evolution-calendar.idl
-
-noinst_LIBRARIES = libpcs.a
-
-libpcs_a_SOURCES = \
- $(CORBA_GENERATED) \
- cal.c \
- cal.h \
- cal-backend.c \
- cal-backend.h \
- cal-backend-file.c \
- cal-backend-file.h \
- cal-common.h \
- cal-factory.c \
- cal-factory.h \
- job.c \
- job.h
-
-
-BUILT_SOURCES = $(CORBA_GENERATED)
-CLEANFILES += $(BUILT_SOURCES)
diff --git a/calendar/pcs/cal-backend-file.c b/calendar/pcs/cal-backend-file.c
deleted file mode 100644
index 5e74689095..0000000000
--- a/calendar/pcs/cal-backend-file.c
+++ /dev/null
@@ -1,1056 +0,0 @@
-/* Evolution calendar - iCalendar file backend
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "cal-util/cal-recur.h"
-#include "cal-backend-file.h"
-
-
-
-/* Private part of the CalBackendFile structure */
-struct _CalBackendFilePrivate {
- /* URI where the calendar data is stored */
- GnomeVFSURI *uri;
-
- /* List of Cal objects with their listeners */
- GList *clients;
-
- /* Toplevel VCALENDAR component */
- icalcomponent *icalcomp;
-
- /* All the CalComponent objects in the calendar, hashed by UID. The
- * hash key *is* the uid returned by cal_component_get_uid(); it is not
- * copied, so don't free it when you remove an object from the hash
- * table.
- */
- GHashTable *comp_uid_hash;
-
- /* All event, to-do, and journal components in the calendar; they are
- * here just for easy access (i.e. so that you don't have to iterate
- * over the comp_uid_hash). If you need *all* the components in the
- * calendar, iterate over the hash instead.
- */
- GList *events;
- GList *todos;
- GList *journals;
-
- /* Idle handler for saving the calendar when it is dirty */
- guint idle_id;
-};
-
-
-
-static void cal_backend_file_class_init (CalBackendFileClass *class);
-static void cal_backend_file_init (CalBackendFile *cbfile);
-static void cal_backend_file_destroy (GtkObject *object);
-
-static GnomeVFSURI *cal_backend_file_get_uri (CalBackend *backend);
-static void cal_backend_file_add_cal (CalBackend *backend, Cal *cal);
-static CalBackendLoadStatus cal_backend_file_load (CalBackend *backend, GnomeVFSURI *uri);
-static void cal_backend_file_create (CalBackend *backend, GnomeVFSURI *uri);
-
-static int cal_backend_file_get_n_objects (CalBackend *backend, CalObjType type);
-static char *cal_backend_file_get_object (CalBackend *backend, const char *uid);
-static GList *cal_backend_file_get_uids (CalBackend *backend, CalObjType type);
-static GList *cal_backend_file_get_objects_in_range (CalBackend *backend, CalObjType type,
- time_t start, time_t end);
-static GList *cal_backend_file_get_alarms_in_range (CalBackend *backend, time_t start, time_t end);
-static gboolean cal_backend_file_get_alarms_for_object (CalBackend *backend, const char *uid,
- time_t start, time_t end,
- GList **alarms);
-static gboolean cal_backend_file_update_object (CalBackend *backend, const char *uid,
- const char *calobj);
-static gboolean cal_backend_file_remove_object (CalBackend *backend, const char *uid);
-static char *cal_backend_file_get_uid_by_pilot_id (CalBackend *backend, unsigned long int pilot_id);
-static void cal_backend_file_update_pilot_id (CalBackend *backend,
- const char *uid,
- unsigned long int pilot_id,
- unsigned long int pilot_status);
-
-
-static CalBackendClass *parent_class;
-
-
-
-/**
- * cal_backend_file_get_type:
- * @void:
- *
- * Registers the #CalBackendFile class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #CalBackendFile class.
- **/
-GtkType
-cal_backend_file_get_type (void)
-{
- static GtkType cal_backend_file_type = 0;
-
- if (!cal_backend_file_type) {
- static const GtkTypeInfo cal_backend_file_info = {
- "CalBackendFile",
- sizeof (CalBackendFile),
- sizeof (CalBackendFileClass),
- (GtkClassInitFunc) cal_backend_file_class_init,
- (GtkObjectInitFunc) cal_backend_file_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- cal_backend_file_type = gtk_type_unique (CAL_BACKEND_TYPE, &cal_backend_file_info);
- }
-
- return cal_backend_file_type;
-}
-
-/* Class initialization function for the file backend */
-static void
-cal_backend_file_class_init (CalBackendFileClass *class)
-{
- GtkObjectClass *object_class;
- CalBackendClass *backend_class;
-
- object_class = (GtkObjectClass *) class;
- backend_class = (CalBackendClass *) class;
-
- parent_class = gtk_type_class (CAL_BACKEND_TYPE);
-
- object_class->destroy = cal_backend_file_destroy;
-
- backend_class->get_uri = cal_backend_file_get_uri;
- backend_class->add_cal = cal_backend_file_add_cal;
- backend_class->load = cal_backend_file_load;
- backend_class->create = cal_backend_file_create;
- backend_class->get_n_objects = cal_backend_file_get_n_objects;
- backend_class->get_object = cal_backend_file_get_object;
- backend_class->get_uids = cal_backend_file_get_uids;
- backend_class->get_objects_in_range = cal_backend_file_get_objects_in_range;
- backend_class->get_alarms_in_range = cal_backend_file_get_alarms_in_range;
- backend_class->get_alarms_for_object = cal_backend_file_get_alarms_for_object;
- backend_class->update_object = cal_backend_file_update_object;
- backend_class->remove_object = cal_backend_file_remove_object;
- backend_class->get_uid_by_pilot_id = cal_backend_file_get_uid_by_pilot_id;
- backend_class->update_pilot_id = cal_backend_file_update_pilot_id;
-}
-
-/* Object initialization function for the file backend */
-static void
-cal_backend_file_init (CalBackendFile *cbfile)
-{
- CalBackendFilePrivate *priv;
-
- priv = g_new0 (CalBackendFilePrivate, 1);
- cbfile->priv = priv;
-}
-
-/* g_hash_table_foreach() callback to destroy a CalComponent */
-static void
-free_cal_component (gpointer key, gpointer value, gpointer data)
-{
- CalComponent *comp;
-
- comp = CAL_COMPONENT (value);
- gtk_object_unref (GTK_OBJECT (comp));
-}
-
-/* Saves the calendar data */
-static void
-save (CalBackendFile *cbfile)
-{
- CalBackendFilePrivate *priv;
-
- priv = cbfile->priv;
- g_assert (priv->uri != NULL);
- g_assert (priv->icalcomp != NULL);
-
- /* FIXME */
-
- /* FIXME: ensure we have the mandatory PRODID and VERSION properties, and throw
- * in CALSCALE for good measure.
- */
-}
-
-/* Destroy handler for the file backend */
-static void
-cal_backend_file_destroy (GtkObject *object)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CAL_BACKEND_FILE (object));
-
- cbfile = CAL_BACKEND_FILE (object);
- priv = cbfile->priv;
-
- g_assert (priv->clients == NULL);
-
- /* Save if necessary */
-
- if (priv->idle_id != 0) {
- save (cbfile);
- g_source_remove (priv->idle_id);
- priv->idle_id = 0;
- }
-
- /* Clean up */
-
- if (priv->uri) {
- gnome_vfs_uri_unref (priv->uri);
- priv->uri = NULL;
- }
-
- if (priv->comp_uid_hash) {
- g_hash_table_foreach (priv->comp_uid_hash, free_cal_component, NULL);
- g_hash_table_destroy (priv->comp_uid_hash);
- priv->comp_uid_hash = NULL;
- }
-
- g_list_free (priv->events);
- g_list_free (priv->todos);
- g_list_free (priv->journals);
-
- priv->events = NULL;
- priv->todos = NULL;
- priv->journals = NULL;
-
- if (priv->icalcomp) {
- icalcomponent_free (priv->icalcomp);
- priv->icalcomp = NULL;
- }
-
- g_free (priv);
- cbfile->priv = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-
-/* Looks up a component by its UID on the backend's component hash table */
-static CalComponent *
-lookup_component (CalBackendFile *cbfile, const char *uid)
-{
- CalBackendFilePrivate *priv;
- CalComponent *comp;
-
- priv = cbfile->priv;
- comp = g_hash_table_lookup (priv->comp_uid_hash, uid);
-
- return comp;
-}
-
-
-
-/* Calendar backend methods */
-
-/* Get_uri handler for the file backend */
-static GnomeVFSURI *
-cal_backend_file_get_uri (CalBackend *backend)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (priv->icalcomp != NULL, NULL);
- g_assert (priv->uri != NULL);
-
- return priv->uri;
-}
-
-/* Callback used when a Cal is destroyed */
-static void
-cal_destroy_cb (GtkObject *object, gpointer data)
-{
- Cal *cal;
- Cal *lcal;
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
- GList *l;
-
- cal = CAL (object);
-
- cbfile = CAL_BACKEND_FILE (data);
- priv = cbfile->priv;
-
- /* Find the cal in the list of clients */
-
- for (l = priv->clients; l; l = l->next) {
- lcal = CAL (l->data);
-
- if (lcal == cal)
- break;
- }
-
- g_assert (l != NULL);
-
- /* Disconnect */
-
- priv->clients = g_list_remove_link (priv->clients, l);
- g_list_free_1 (l);
-
- /* When all clients go away, notify the parent factory about it so that
- * it may decide whether to kill the backend or not.
- */
- if (!priv->clients)
- cal_backend_last_client_gone (CAL_BACKEND (cbfile));
-}
-
-/* Add_cal handler for the file backend */
-static void
-cal_backend_file_add_cal (CalBackend *backend, Cal *cal)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_if_fail (priv->icalcomp != NULL);
- g_return_if_fail (cal != NULL);
- g_return_if_fail (IS_CAL (cal));
-
- /* We do not keep a reference to the Cal since the calendar user agent
- * owns it.
- */
-
- gtk_signal_connect (GTK_OBJECT (cal), "destroy",
- GTK_SIGNAL_FUNC (cal_destroy_cb),
- backend);
-
- priv->clients = g_list_prepend (priv->clients, cal);
-}
-
-/* Idle handler; we save the calendar since it is dirty */
-static gboolean
-save_idle (gpointer data)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
-
- cbfile = CAL_BACKEND_FILE (data);
- priv = cbfile->priv;
-
- g_assert (priv->icalcomp != NULL);
-
- save (cbfile);
-
- priv->idle_id = 0;
- return FALSE;
-}
-
-/* Marks the file backend as dirty and queues a save operation */
-static void
-mark_dirty (CalBackendFile *cbfile)
-{
- CalBackendFilePrivate *priv;
-
- priv = cbfile->priv;
-
- if (priv->idle_id != 0)
- return;
-
- priv->idle_id = g_idle_add (save_idle, cbfile);
-}
-
-/* Checks if the specified component has a duplicated UID and if so changes it */
-static void
-check_dup_uid (CalBackendFile *cbfile, CalComponent *comp)
-{
- CalBackendFilePrivate *priv;
- CalComponent *old_comp;
- const char *uid;
- char *new_uid;
-
- priv = cbfile->priv;
-
- cal_component_get_uid (comp, &uid);
-
- old_comp = g_hash_table_lookup (priv->comp_uid_hash, uid);
- if (!old_comp)
- return; /* Everything is fine */
-
- g_message ("check_dup_uid(): Got object with duplicated UID `%s', changing it...", uid);
-
- new_uid = cal_component_gen_uid ();
- cal_component_set_uid (comp, new_uid);
- g_free (new_uid);
-
- /* FIXME: I think we need to reset the SEQUENCE property and reset the
- * CREATED/DTSTAMP/LAST-MODIFIED.
- */
-
- mark_dirty (cbfile);
-}
-
-/* Tries to add an icalcomponent to the file backend. We only store the objects
- * of the types we support; all others just remain in the toplevel component so
- * that we don't lose them.
- */
-static void
-add_component (CalBackendFile *cbfile, CalComponent *comp)
-{
- CalBackendFilePrivate *priv;
- GList **list;
- const char *uid;
-
- priv = cbfile->priv;
-
- switch (cal_component_get_vtype (comp)) {
- case CAL_COMPONENT_EVENT:
- list = &priv->events;
- break;
-
- case CAL_COMPONENT_TODO:
- list = &priv->todos;
- break;
-
- case CAL_COMPONENT_JOURNAL:
- list = &priv->journals;
- break;
-
- default:
- g_assert_not_reached ();
- return;
- }
-
- /* Ensure that the UID is unique; some broken implementations spit
- * components with duplicated UIDs.
- */
-
- check_dup_uid (cbfile, comp);
- cal_component_get_uid (comp, &uid);
-
- g_hash_table_insert (priv->comp_uid_hash, (char *) uid, comp);
- *list = g_list_prepend (*list, comp);
-}
-
-/* Removes a component from the backend's hash and lists. Does not perform
- * notification on the clients.
- */
-static void
-remove_component (CalBackendFile *cbfile, CalComponent *comp)
-{
- CalBackendFilePrivate *priv;
- const char *uid;
- GList **list, *l;
-
- priv = cbfile->priv;
-
- cal_component_get_uid (comp, &uid);
- g_hash_table_remove (priv->comp_uid_hash, uid);
-
- switch (cal_component_get_vtype (comp)) {
- case CAL_COMPONENT_EVENT:
- list = &priv->events;
- break;
-
- case CAL_COMPONENT_TODO:
- list = &priv->todos;
- break;
-
- case CAL_COMPONENT_JOURNAL:
- list = &priv->journals;
- break;
-
- default:
- /* Make the compiler shut up. */
- list = NULL;
- g_assert_not_reached ();
- }
-
- l = g_list_find (*list, comp);
- g_assert (l != NULL);
-
- *list = g_list_remove_link (*list, l);
- g_list_free_1 (l);
-
- gtk_object_unref (GTK_OBJECT (comp));
-}
-
-/* Scans the toplevel VCALENDAR component and stores the objects it finds */
-static void
-scan_vcalendar (CalBackendFile *cbfile)
-{
- CalBackendFilePrivate *priv;
- icalcomponent *icalcomp;
-
- priv = cbfile->priv;
- g_assert (priv->icalcomp != NULL);
- g_assert (priv->comp_uid_hash != NULL);
-
- for (icalcomp = icalcomponent_get_first_component (priv->icalcomp, ICAL_ANY_COMPONENT);
- icalcomp;
- icalcomp = icalcomponent_get_next_component (priv->icalcomp, ICAL_ANY_COMPONENT)) {
- icalcomponent_kind kind;
- CalComponent *comp;
-
- kind = icalcomponent_isa (icalcomp);
-
- if (!(kind == ICAL_VEVENT_COMPONENT
- || kind == ICAL_VTODO_COMPONENT
- || kind == ICAL_VJOURNAL_COMPONENT))
- continue;
-
- comp = cal_component_new ();
-
- if (!cal_component_set_icalcomponent (comp, icalcomp))
- continue;
-
- add_component (cbfile, comp);
- }
-}
-
-/* Callback used from icalparser_parse() */
-static char *
-get_line (char *s, size_t size, void *data)
-{
- FILE *file;
-
- file = data;
- return fgets (s, size, file);
-}
-
-/* Load handler for the file backend */
-static CalBackendLoadStatus
-cal_backend_file_load (CalBackend *backend, GnomeVFSURI *uri)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
- char *str_uri;
- FILE *file;
- icalparser *parser;
- icalcomponent *icalcomp;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (priv->icalcomp == NULL, CAL_BACKEND_LOAD_ERROR);
- g_return_val_if_fail (uri != NULL, CAL_BACKEND_LOAD_ERROR);
-
- /* FIXME: this looks rather bad; maybe we should check for local files
- * and fail if they are remote.
- */
-
- str_uri = gnome_vfs_uri_to_string (uri,
- (GNOME_VFS_URI_HIDE_USER_NAME
- | GNOME_VFS_URI_HIDE_PASSWORD
- | GNOME_VFS_URI_HIDE_HOST_NAME
- | GNOME_VFS_URI_HIDE_HOST_PORT
- | GNOME_VFS_URI_HIDE_TOPLEVEL_METHOD));
-
- /* Load! */
-
- file = fopen (str_uri, "r");
- g_free (str_uri);
-
- if (!file)
- return CAL_BACKEND_LOAD_ERROR;
-
- parser = icalparser_new ();
- icalparser_set_gen_data (parser, file);
-
- icalcomp = icalparser_parse (parser, get_line);
- icalparser_free (parser);
-
- if (fclose (file) != 0)
- return CAL_BACKEND_LOAD_ERROR;
-
- if (!icalcomp)
- return CAL_BACKEND_LOAD_ERROR;
-
- /* FIXME: should we try to demangle XROOT components and individual
- * components as well?
- */
-
- if (icalcomponent_isa (icalcomp) != ICAL_VCALENDAR_COMPONENT)
- return CAL_BACKEND_LOAD_ERROR;
-
- priv->icalcomp = icalcomp;
-
- priv->comp_uid_hash = g_hash_table_new (g_str_hash, g_str_equal);
- scan_vcalendar (cbfile);
-
- /* Clean up */
-
- gnome_vfs_uri_ref (uri);
- priv->uri = uri;
-
- return CAL_BACKEND_LOAD_SUCCESS;
-}
-
-/* Create handler for the file backend */
-static void
-cal_backend_file_create (CalBackend *backend, GnomeVFSURI *uri)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
- icalproperty *prop;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_if_fail (priv->icalcomp == NULL);
- g_return_if_fail (uri != NULL);
-
- /* Create the new calendar information */
-
- g_assert (priv->icalcomp == NULL);
- priv->icalcomp = icalcomponent_new (ICAL_VCALENDAR_COMPONENT);
-
- /* RFC 2445, section 4.7.1 */
- prop = icalproperty_new_calscale ("GREGORIAN");
- icalcomponent_add_property (priv->icalcomp, prop);
-
- /* RFC 2445, section 4.7.3 */
- prop = icalproperty_new_prodid ("-//Helix Code//NONSGML Evolution Calendar//EN");
- icalcomponent_add_property (priv->icalcomp, prop);
-
- /* RFC 2445, section 4.7.4 */
- prop = icalproperty_new_version ("2.0");
- icalcomponent_add_property (priv->icalcomp, prop);
-
- /* Create our internal data */
-
- g_assert (priv->comp_uid_hash == NULL);
- priv->comp_uid_hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- /* Done */
-
- gnome_vfs_uri_ref (uri);
-
- priv->uri = uri;
-
- mark_dirty (cbfile);
-}
-
-/* Get_n_objects handler for the file backend */
-static int
-cal_backend_file_get_n_objects (CalBackend *backend, CalObjType type)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
- int n;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (priv->icalcomp != NULL, -1);
-
- n = 0;
-
- if (type & CALOBJ_TYPE_EVENT)
- n += g_list_length (priv->events);
-
- if (type & CALOBJ_TYPE_TODO)
- n += g_list_length (priv->todos);
-
- if (type & CALOBJ_TYPE_JOURNAL)
- n += g_list_length (priv->journals);
-
- return n;
-}
-
-/* Get_object handler for the file backend */
-static char *
-cal_backend_file_get_object (CalBackend *backend, const char *uid)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
- CalComponent *comp;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (uid != NULL, NULL);
-
- g_return_val_if_fail (priv->icalcomp != NULL, NULL);
- g_assert (priv->comp_uid_hash != NULL);
-
- comp = lookup_component (cbfile, uid);
-
- if (!comp)
- return NULL;
-
- return cal_component_get_as_string (comp);
-}
-
-/* Builds a list of UIDs from a list of CalComponent objects */
-static void
-build_uids_list (GList **list, GList *components)
-{
- GList *l;
-
- for (l = components; l; l = l->next) {
- CalComponent *comp;
- const char *uid;
-
- comp = CAL_COMPONENT (l->data);
- cal_component_get_uid (comp, &uid);
- *list = g_list_prepend (*list, g_strdup (uid));
- }
-}
-
-/* Get_uids handler for the file backend */
-static GList *
-cal_backend_file_get_uids (CalBackend *backend, CalObjType type)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
- GList *list;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (priv->icalcomp != NULL, NULL);
-
- list = NULL;
-
- if (type & CALOBJ_TYPE_EVENT)
- build_uids_list (&list, priv->events);
-
- if (type & CALOBJ_TYPE_TODO)
- build_uids_list (&list, priv->todos);
-
- if (type & CALOBJ_TYPE_JOURNAL)
- build_uids_list (&list, priv->journals);
-
- return list;
-}
-
-/* Callback used from cal_recur_generate_instances(); adds the component's UID
- * to our hash table.
- */
-static gboolean
-add_instance (CalComponent *comp, time_t start, time_t end, gpointer data)
-{
- GHashTable *uid_hash;
- const char *uid;
- const char *old_uid;
-
- uid_hash = data;
-
- /* We only care that the component's UID is listed in the hash table;
- * that's why we only allow generation of one instance (i.e. return
- * FALSE every time).
- */
-
- cal_component_get_uid (comp, &uid);
-
- old_uid = g_hash_table_lookup (uid_hash, uid);
- if (old_uid)
- return FALSE;
-
- g_hash_table_insert (uid_hash, (char *) uid, NULL);
- return FALSE;
-}
-
-/* Populates a hash table with the UIDs of the components that occur or recur
- * within a specific time range.
- */
-static void
-get_instances_in_range (GHashTable *uid_hash, GList *components, time_t start, time_t end)
-{
- GList *l;
-
- for (l = components; l; l = l->next) {
- CalComponent *comp;
-
- comp = CAL_COMPONENT (l->data);
- cal_recur_generate_instances (comp, start, end, add_instance, uid_hash);
- }
-}
-
-/* Used from g_hash_table_foreach(), adds a UID from the hash table to our list */
-static void
-add_uid_to_list (gpointer key, gpointer value, gpointer data)
-{
- GList **list;
- const char *uid;
- char *uid_copy;
-
- list = data;
-
- uid = key;
- uid_copy = g_strdup (uid);
-
- *list = g_list_prepend (*list, uid_copy);
-}
-
-/* Get_objects_in_range handler for the file backend */
-static GList *
-cal_backend_file_get_objects_in_range (CalBackend *backend, CalObjType type,
- time_t start, time_t end)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
- GList *event_list;
- GHashTable *uid_hash;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (priv->icalcomp != NULL, NULL);
-
- g_return_val_if_fail (start != -1 && end != -1, NULL);
- g_return_val_if_fail (start <= end, NULL);
-
- uid_hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- if (type & CALOBJ_TYPE_EVENT)
- get_instances_in_range (uid_hash, priv->events, start, end);
-
- if (type & CALOBJ_TYPE_TODO)
- get_instances_in_range (uid_hash, priv->todos, start, end);
-
- if (type & CALOBJ_TYPE_JOURNAL)
- get_instances_in_range (uid_hash, priv->journals, start, end);
-
- event_list = NULL;
- g_hash_table_foreach (uid_hash, add_uid_to_list, &event_list);
- g_hash_table_destroy (uid_hash);
-
- return event_list;
-}
-
-/* Get_alarms_in_range handler for the file backend */
-static GList *
-cal_backend_file_get_alarms_in_range (CalBackend *backend, time_t start, time_t end)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (priv->icalcomp != NULL, NULL);
-
- g_return_val_if_fail (start != -1 && end != -1, NULL);
- g_return_val_if_fail (start <= end, NULL);
-
- /* FIXME: have to deal with an unknown number of alarms; we can't just
- * do the same thing as in cal-backend-imc.
- */
- return NULL;
-}
-
-/* Get_alarms_for_object handler for the file backend */
-static gboolean
-cal_backend_file_get_alarms_for_object (CalBackend *backend, const char *uid,
- time_t start, time_t end,
- GList **alarms)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (priv->icalcomp != NULL, FALSE);
-
- g_return_val_if_fail (uid != NULL, FALSE);
- g_return_val_if_fail (start != -1 && end != -1, FALSE);
- g_return_val_if_fail (start <= end, FALSE);
- g_return_val_if_fail (alarms != NULL, FALSE);
-
- /* FIXME */
-
- *alarms = NULL;
- return FALSE;
-}
-
-/* Notifies a backend's clients that an object was updated */
-static void
-notify_update (CalBackendFile *cbfile, const char *uid)
-{
- CalBackendFilePrivate *priv;
- GList *l;
-
- priv = cbfile->priv;
-
- for (l = priv->clients; l; l = l->next) {
- Cal *cal;
-
- cal = CAL (l->data);
- cal_notify_update (cal, uid);
- }
-}
-
-/* Notifies a backend's clients that an object was removed */
-static void
-notify_remove (CalBackendFile *cbfile, const char *uid)
-{
- CalBackendFilePrivate *priv;
- GList *l;
-
- priv = cbfile->priv;
-
- for (l = priv->clients; l; l = l->next) {
- Cal *cal;
-
- cal = CAL (l->data);
- cal_notify_remove (cal, uid);
- }
-}
-
-/* Update_object handler for the file backend */
-static gboolean
-cal_backend_file_update_object (CalBackend *backend, const char *uid, const char *calobj)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
- icalcomponent *icalcomp;
- icalcomponent_kind kind;
- CalComponent *old_comp;
- CalComponent *comp;
- const char *comp_uid;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (priv->icalcomp != NULL, FALSE);
-
- g_return_val_if_fail (uid != NULL, FALSE);
- g_return_val_if_fail (calobj != NULL, FALSE);
-
- /* Pull the component from the string and ensure that it is sane */
-
- icalcomp = icalparser_parse_string ((char *) calobj);
-
- if (!icalcomp)
- return FALSE;
-
- kind = icalcomponent_isa (icalcomp);
-
- if (!(kind == ICAL_VEVENT_COMPONENT
- || kind == ICAL_VTODO_COMPONENT
- || kind == ICAL_VJOURNAL_COMPONENT)) {
- /* We don't support this type of component */
- icalcomponent_free (icalcomp);
- return FALSE;
- }
-
- comp = cal_component_new ();
- if (!cal_component_set_icalcomponent (comp, icalcomp)) {
- gtk_object_unref (GTK_OBJECT (comp));
- icalcomponent_free (icalcomp);
- return FALSE;
- }
-
- /* Check the UID for sanity's sake */
-
- cal_component_get_uid (comp, &comp_uid);
-
- if (strcmp (uid, comp_uid) != 0) {
- gtk_object_unref (GTK_OBJECT (comp));
- return FALSE;
- }
-
- /* Update the component */
-
- old_comp = lookup_component (cbfile, uid);
-
- if (old_comp)
- remove_component (cbfile, old_comp);
-
- add_component (cbfile, comp);
-#if 0
- /* FIXME */
- new_ico->pilot_status = ICAL_PILOT_SYNC_MOD;
-#endif
-
- mark_dirty (cbfile);
-
- /* FIXME: do the notification asynchronously */
- notify_update (cbfile, comp_uid);
-
- return TRUE;
-}
-
-/* Remove_object handler for the file backend */
-static gboolean
-cal_backend_file_remove_object (CalBackend *backend, const char *uid)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
- CalComponent *comp;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (priv->icalcomp != NULL, FALSE);
-
- g_return_val_if_fail (uid != NULL, FALSE);
-
- comp = lookup_component (cbfile, uid);
- if (!comp)
- return FALSE;
-
- remove_component (cbfile, comp);
-
- mark_dirty (cbfile);
-
- /* FIXME: do the notification asynchronously */
- notify_remove (cbfile, uid);
-
- return TRUE;
-}
-
-/* Get_uid_by_pilot_id handler for the file backend */
-static char *
-cal_backend_file_get_uid_by_pilot_id (CalBackend *backend, unsigned long int pilot_id)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_val_if_fail (priv->icalcomp != NULL, FALSE);
-
- /* FIXME */
- return NULL;
-}
-
-/* Update_pilot_id handler for the file backend */
-static void
-cal_backend_file_update_pilot_id (CalBackend *backend,
- const char *uid,
- unsigned long int pilot_id,
- unsigned long int pilot_status)
-{
- CalBackendFile *cbfile;
- CalBackendFilePrivate *priv;
-
- cbfile = CAL_BACKEND_FILE (backend);
- priv = cbfile->priv;
-
- g_return_if_fail (priv->icalcomp != NULL);
-
- g_return_if_fail (uid != NULL);
-
- /* FIXME */
-}
diff --git a/calendar/pcs/cal-backend-file.h b/calendar/pcs/cal-backend-file.h
deleted file mode 100644
index 376790751c..0000000000
--- a/calendar/pcs/cal-backend-file.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Evolution calendar - iCalendar file backend
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 CAL_BACKEND_FILE_H
-#define CAL_BACKEND_FILE_H
-
-#include <libgnome/gnome-defs.h>
-#include "cal-backend.h"
-
-BEGIN_GNOME_DECLS
-
-
-
-#define CAL_BACKEND_FILE_TYPE (cal_backend_file_get_type ())
-#define CAL_BACKEND_FILE(obj) (GTK_CHECK_CAST ((obj), CAL_BACKEND_FILE_TYPE, \
- CalBackendFile))
-#define CAL_BACKEND_FILE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_BACKEND_FILE_TYPE, \
- CalBackendFileClass))
-#define IS_CAL_BACKEND_FILE(obj) (GTK_CHECK_TYPE ((obj), CAL_BACKEND_FILE_TYPE))
-#define IS_CAL_BACKEND_FILE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_BACKEND_FILE_TYPE))
-
-typedef struct _CalBackendFile CalBackendFile;
-typedef struct _CalBackendFileClass CalBackendFileClass;
-
-typedef struct _CalBackendFilePrivate CalBackendFilePrivate;
-
-struct _CalBackendFile {
- CalBackend backend;
-
- /* Private data */
- CalBackendFilePrivate *priv;
-};
-
-struct _CalBackendFileClass {
- CalBackendClass parent_class;
-};
-
-GtkType cal_backend_file_get_type (void);
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/pcs/cal-backend-imc.c b/calendar/pcs/cal-backend-imc.c
deleted file mode 100644
index d50fc0d347..0000000000
--- a/calendar/pcs/cal-backend-imc.c
+++ /dev/null
@@ -1,1421 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - Internet Mail Consortium formats backend
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@helixcode.com>
- * Seth Alves <alves@helixcode.com>
- * Miguel de Icaza <miguel@helixcode.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.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "cal-backend-imc.h"
-#include "cal-util/icalendar.h"
-
-
-
-/* Supported calendar formats from the IMC */
-typedef enum {
- CAL_FORMAT_UNKNOWN,
- CAL_FORMAT_VCALENDAR,
- CAL_FORMAT_ICALENDAR
-} CalendarFormat;
-
-/* Private part of the CalBackendIMC structure */
-typedef struct {
- /* URI where the calendar data is stored */
- GnomeVFSURI *uri;
-
- /* Format of this calendar (iCalendar or vCalendar) */
- CalendarFormat format;
-
- /* List of Cal objects with their listeners */
- GList *clients;
-
- /* All the iCalObject structures in the calendar, hashed by UID. The
- * hash key *is* icalobj->uid; it is not copied, so don't free it when
- * you remove an object from the hash table.
- */
- GHashTable *object_hash;
-
- /* All events, TODOs, and journals in the calendar */
- GList *events;
- GList *todos;
- GList *journals;
-
- /* Whether a calendar has been loaded */
- guint loaded : 1;
-
- /* Do we need to sync to permanent storage? */
- gboolean dirty : 1;
-} IMCPrivate;
-
-
-
-static void cal_backend_imc_class_init (CalBackendIMCClass *class);
-static void cal_backend_imc_init (CalBackendIMC *bimc);
-static void cal_backend_imc_destroy (GtkObject *object);
-
-static GnomeVFSURI *cal_backend_imc_get_uri (CalBackend *backend);
-static void cal_backend_imc_add_cal (CalBackend *backend, Cal *cal);
-static CalBackendLoadStatus cal_backend_imc_load (CalBackend *backend, GnomeVFSURI *uri);
-static void cal_backend_imc_create (CalBackend *backend, GnomeVFSURI *uri);
-
-static int cal_backend_imc_get_n_objects (CalBackend *backend, CalObjType type);
-static char *cal_backend_imc_get_object (CalBackend *backend, const char *uid);
-static GList *cal_backend_imc_get_uids (CalBackend *backend, CalObjType type);
-static GList *cal_backend_imc_get_events_in_range (CalBackend *backend, time_t start, time_t end);
-static GList *cal_backend_imc_get_alarms_in_range (CalBackend *backend, time_t start, time_t end);
-static gboolean cal_backend_imc_get_alarms_for_object (CalBackend *backend, const char *uid,
- time_t start, time_t end,
- GList **alarms);
-static gboolean cal_backend_imc_update_object (CalBackend *backend, const char *uid,
- const char *calobj);
-static gboolean cal_backend_imc_remove_object (CalBackend *backend, const char *uid);
-static char *cal_backend_imc_get_uid_by_pilot_id (CalBackend *backend, unsigned long int pilot_id);
-static void cal_backend_imc_update_pilot_id (CalBackend *backend,
- const char *uid,
- unsigned long int pilot_id,
- unsigned long int pilot_status);
-
-
-
-static void notify_update (CalBackendIMC *cbimc, const char *uid);
-
-static CalBackendClass *parent_class;
-
-
-
-/**
- * cal_backend_imc_get_type:
- * @void:
- *
- * Registers the #CalBackendIMC class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #CalBackendIMC class.
- **/
-GtkType
-cal_backend_imc_get_type (void)
-{
- static GtkType cal_backend_imc_type = 0;
-
- if (!cal_backend_imc_type) {
- static const GtkTypeInfo cal_backend_imc_info = {
- "CalBackendIMC",
- sizeof (CalBackendIMC),
- sizeof (CalBackendIMCClass),
- (GtkClassInitFunc) cal_backend_imc_class_init,
- (GtkObjectInitFunc) cal_backend_imc_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- cal_backend_imc_type = gtk_type_unique (CAL_BACKEND_TYPE, &cal_backend_imc_info);
- }
-
- return cal_backend_imc_type;
-}
-
-/* Class initialization function for the IMC backend */
-static void
-cal_backend_imc_class_init (CalBackendIMCClass *class)
-{
- GtkObjectClass *object_class;
- CalBackendClass *backend_class;
-
- object_class = (GtkObjectClass *) class;
- backend_class = (CalBackendClass *) class;
-
- parent_class = gtk_type_class (CAL_BACKEND_TYPE);
-
- backend_class->get_uri = cal_backend_imc_get_uri;
- backend_class->add_cal = cal_backend_imc_add_cal;
- backend_class->load = cal_backend_imc_load;
- backend_class->create = cal_backend_imc_create;
- backend_class->get_n_objects = cal_backend_imc_get_n_objects;
- backend_class->get_object = cal_backend_imc_get_object;
- backend_class->get_uids = cal_backend_imc_get_uids;
- backend_class->get_events_in_range = cal_backend_imc_get_events_in_range;
- backend_class->get_alarms_in_range = cal_backend_imc_get_alarms_in_range;
- backend_class->get_alarms_for_object = cal_backend_imc_get_alarms_for_object;
- backend_class->update_object = cal_backend_imc_update_object;
- backend_class->remove_object = cal_backend_imc_remove_object;
- backend_class->get_uid_by_pilot_id = cal_backend_imc_get_uid_by_pilot_id;
- backend_class->update_pilot_id = cal_backend_imc_update_pilot_id;
-
- object_class->destroy = cal_backend_imc_destroy;
-}
-
-/* Object initialization function for the IMC backend */
-static void
-cal_backend_imc_init (CalBackendIMC *cbimc)
-{
- IMCPrivate *priv;
-
- priv = g_new0 (IMCPrivate, 1);
- cbimc->priv = priv;
-
- priv->format = CAL_FORMAT_UNKNOWN;
-}
-
-static void
-save_to_vcal (CalBackendIMC *cbimc, char *fname)
-{
- FILE *fp;
- IMCPrivate *priv;
- VObject *vcal;
- GList *l;
-
- priv = cbimc->priv;
-
- if (g_file_exists (fname)) {
- char *backup_name = g_strconcat (fname, "~", NULL);
-
- /* FIXME: do error checking on system calls!!!! */
-
- if (g_file_exists (backup_name))
- unlink (backup_name);
-
- rename (fname, backup_name);
- g_free (backup_name);
- }
-
- vcal = newVObject (VCCalProp);
- addPropValue (vcal, VCProdIdProp,
- "-//Helix Code//NONSGML Evolution Calendar//EN");
-
- /* Per the vCalendar spec, this must be "1.0" */
- addPropValue (vcal, VCVersionProp, "1.0");
-
- /* FIXME: this should really iterate over the object hash table instead
- * of the lists; that way we won't lose objects if they are of a type
- * that we don't support but are in the calendar anyways.
- */
-
- for (l = priv->events; l; l = l->next) {
- iCalObject *ical = l->data;
- VObject *vobject = ical_object_to_vobject (ical);
- addVObjectProp (vcal, vobject);
- }
-
- for (l = priv->todos; l; l = l->next) {
- iCalObject *ical = l->data;
- VObject *vobject = ical_object_to_vobject (ical);
- addVObjectProp (vcal, vobject);
- }
-
- for (l = priv->journals; l; l = l->next) {
- iCalObject *ical = l->data;
- VObject *vobject = ical_object_to_vobject (ical);
- addVObjectProp (vcal, vobject);
- }
-
- fp = fopen(fname,"w");
- if (fp) {
- writeVObject(fp, vcal);
- fclose(fp);
- }
- cleanVObject (vcal);
- cleanStrTbl ();
-}
-
-/* Saves a calendar */
-static void
-save (CalBackendIMC *cbimc)
-{
- char *str_uri;
- IMCPrivate *priv = cbimc->priv;
-
- str_uri = gnome_vfs_uri_to_string (priv->uri,
- (GNOME_VFS_URI_HIDE_USER_NAME
- | GNOME_VFS_URI_HIDE_PASSWORD
- | GNOME_VFS_URI_HIDE_HOST_NAME
- | GNOME_VFS_URI_HIDE_HOST_PORT
- | GNOME_VFS_URI_HIDE_TOPLEVEL_METHOD));
-
- if (!priv->dirty)
- return;
-
- switch (priv->format) {
- case CAL_FORMAT_VCALENDAR:
- save_to_vcal (cbimc, str_uri);
- break;
-
- case CAL_FORMAT_ICALENDAR:
- /*icalendar_calendar_save (cbimc, str_uri);*/
- /* FIX ME */
- break;
-
- default:
- g_message ("save(): Attempt to save a calendar with an unknown format!");
- break;
- }
-
- printf ("cal-backend-imc: '%s' saved\n", str_uri);
-
- g_free (str_uri);
-}
-
-/* g_hash_table_foreach() callback to destroy an iCalObject */
-static void
-free_ical_object (gpointer key, gpointer value, gpointer data)
-{
- iCalObject *ico;
-
- ico = value;
- ical_object_unref (ico);
-}
-
-/* Destroys an IMC backend's data */
-static void
-destroy (CalBackendIMC *cbimc)
-{
- IMCPrivate *priv;
-
- priv = cbimc->priv;
-
- if (priv->uri) {
- gnome_vfs_uri_unref (priv->uri);
- priv->uri = NULL;
- }
-
- g_assert (priv->clients == NULL);
-
- if (priv->object_hash) {
- g_hash_table_foreach (priv->object_hash, free_ical_object, NULL);
- g_hash_table_destroy (priv->object_hash);
- priv->object_hash = NULL;
- }
-
- g_list_free (priv->events);
- g_list_free (priv->todos);
- g_list_free (priv->journals);
-
- priv->events = NULL;
- priv->todos = NULL;
- priv->journals = NULL;
-
- priv->loaded = FALSE;
- priv->format = CAL_FORMAT_UNKNOWN;
-}
-
-/* Destroy handler for the IMC backend */
-static void
-cal_backend_imc_destroy (GtkObject *object)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CAL_BACKEND_IMC (object));
-
- cbimc = CAL_BACKEND_IMC (object);
- priv = cbimc->priv;
-
- /*
- if (priv->loaded)
- save (cbimc);
- */
-
- destroy (cbimc);
-
- g_free (priv);
- cbimc->priv = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-
-/* iCalObject manipulation functions */
-
-/* Looks up an object by its UID in the backend's object hash table */
-static iCalObject *
-lookup_object (CalBackendIMC *cbimc, const char *uid)
-{
- IMCPrivate *priv;
- iCalObject *ico;
-
- priv = cbimc->priv;
- ico = g_hash_table_lookup (priv->object_hash, uid);
-
- return ico;
-}
-
-/* Ensures that an iCalObject has a unique identifier. If it doesn't have one,
- * it will create one for it.
- */
-static void
-ensure_uid (iCalObject *ico)
-{
- char *buf;
- gulong str_time;
- static guint seqno = 0;
-
- if (ico->uid)
- return;
-
- str_time = (gulong) time (NULL);
-
- /* Is this good enough? */
-
- buf = g_strdup_printf ("Evolution-Calendar-%d-%ld-%u",
- (int) getpid(), str_time, seqno++);
- ico->uid = buf;
-}
-
-/* Adds an object to the calendar backend. Does *not* perform notification to
- * calendar clients.
- */
-static void
-add_object (CalBackendIMC *cbimc, iCalObject *ico)
-{
- IMCPrivate *priv;
-
- g_assert (ico != NULL);
-
- priv = cbimc->priv;
-
-#if 0
- /* FIXME: gnomecal old code */
- ico->new = 0;
-#endif
-
- ensure_uid (ico);
- g_hash_table_insert (priv->object_hash, ico->uid, ico);
-
- priv->dirty = TRUE;
-
- switch (ico->type) {
- case ICAL_EVENT:
- priv->events = g_list_prepend (priv->events, ico);
-#if 0
- /* FIXME: gnomecal old code */
- ical_object_try_alarms (ico);
-# ifdef DEBUGGING_MAIL_ALARM
- ico->malarm.trigger = 0;
- calendar_notify (0, ico);
-# endif
-#endif
- break;
-
- case ICAL_TODO:
- priv->todos = g_list_prepend (priv->todos, ico);
- break;
-
- case ICAL_JOURNAL:
- priv->journals = g_list_prepend (priv->journals, ico);
- break;
-
- default:
- g_assert_not_reached ();
- }
-
-#if 0
- /* FIXME: gnomecal old code */
- ico->last_mod = time (NULL);
-#endif
-}
-
-/* Removes an object from the backend's hash and lists. Does not perform
- * notification on the clients.
- */
-static void
-remove_object (CalBackendIMC *cbimc, iCalObject *ico)
-{
- IMCPrivate *priv;
- GList **list, *l;
-
- priv = cbimc->priv;
-
- g_assert (ico->uid != NULL);
- g_hash_table_remove (priv->object_hash, ico->uid);
-
- priv->dirty = TRUE;
-
- switch (ico->type) {
- case ICAL_EVENT:
- list = &priv->events;
- break;
-
- case ICAL_TODO:
- list = &priv->todos;
- break;
-
- case ICAL_JOURNAL:
- list = &priv->journals;
- break;
-
- default:
- /* Make the compiler shut up. */
- list = NULL;
- g_assert_not_reached ();
- }
-
- l = g_list_find (*list, ico);
- g_assert (l != NULL);
-
- *list = g_list_remove_link (*list, l);
- g_list_free_1 (l);
-
- ical_object_unref (ico);
-}
-
-/* Load a calendar from a VObject */
-static void
-load_from_vobject (CalBackendIMC *cbimc, VObject *vobject)
-{
- IMCPrivate *priv;
- VObjectIterator i;
-
- priv = cbimc->priv;
-
- g_assert (!priv->loaded);
- g_assert (priv->object_hash == NULL);
- priv->object_hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- initPropIterator (&i, vobject);
-
- while (moreIteration (&i)) {
- VObject *this;
- iCalObject *ical;
- const char *object_name;
-
- this = nextVObject (&i);
- object_name = vObjectName (this);
-#if 0
- /* FIXME? What is this used for in gnomecal? */
- if (strcmp (object_name, VCDCreatedProp) == 0) {
- cal->created = time_from_isodate (str_val (this));
- continue;
- }
-#endif
- if (strcmp (object_name, VCLocationProp) == 0)
- continue; /* FIXME: imlement */
-
- if (strcmp (object_name, VCProdIdProp) == 0)
- continue; /* FIXME: implement */
-
- if (strcmp (object_name, VCVersionProp) == 0)
- continue; /* FIXME: implement */
-
- if (strcmp (object_name, VCTimeZoneProp) == 0)
- continue; /* FIXME: implement */
-
- ical = ical_object_create_from_vobject (this, object_name);
-
- /* FIXME: some broken files (ahem, old KOrganizer files) may
- * have duplicated UIDs. This is Bad(tm). Deal with it by
- * creating new UIDs for them and spitting some messages to the
- * console.
- */
-
- if (ical)
- add_object (cbimc, ical);
- }
-}
-
-
-
-/* Calendar backend methods */
-
-/* Get_uri handler for the IMC backend */
-static GnomeVFSURI *
-cal_backend_imc_get_uri (CalBackend *backend)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_val_if_fail (priv->loaded, NULL);
- g_assert (priv->uri != NULL);
-
- return priv->uri;
-}
-
-/* Callback used when a Cal is destroyed */
-static void
-cal_destroy_cb (GtkObject *object, gpointer data)
-{
- Cal *cal;
- Cal *lcal;
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- GList *l;
-
- fprintf (stderr, "cal_destroy_cb(): A Cal was destroyed!\n");
-
- cal = CAL (object);
-
- cbimc = CAL_BACKEND_IMC (data);
- priv = cbimc->priv;
-
- /* Find the cal in the list of clients */
-
- for (l = priv->clients; l; l = l->next) {
- lcal = CAL (l->data);
-
- if (lcal == cal)
- break;
- }
-
- g_assert (l != NULL);
-
- /* Disconnect */
-
- priv->clients = g_list_remove_link (priv->clients, l);
- g_list_free_1 (l);
-
- /* When all clients go away, notify the parent factory about it so that
- * it may decide whether to kill the backend or not.
- */
- if (!priv->clients)
- cal_backend_last_client_gone (CAL_BACKEND (cbimc));
-}
-
-/* Add_cal handler for the IMC backend */
-static void
-cal_backend_imc_add_cal (CalBackend *backend, Cal *cal)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_if_fail (priv->loaded);
- g_return_if_fail (cal != NULL);
- g_return_if_fail (IS_CAL (cal));
-
- /* We do not keep a reference to the Cal since the calendar user agent
- * owns it.
- */
-
- gtk_signal_connect (GTK_OBJECT (cal), "destroy",
- GTK_SIGNAL_FUNC (cal_destroy_cb),
- backend);
-
- priv->clients = g_list_prepend (priv->clients, cal);
-}
-
-static icalcomponent *
-icalendar_parse_file (char *fname)
-{
- FILE *fp;
- icalcomponent *comp = NULL;
- char *str;
- struct stat st;
- int n;
-
- fp = fopen (fname, "r");
- if (!fp) {
- /* FIXME: remove message */
- g_message ("icalendar_parse_file(): Cannot open open calendar file.");
- return NULL;
- }
-
- stat (fname, &st);
-
- str = g_malloc (st.st_size + 2);
-
- n = fread (str, 1, st.st_size, fp);
- if (n != st.st_size) {
- /* FIXME: remove message, return error code instead */
- g_message ("icalendar_parse_file(): Read error.");
- }
- str[n] = '\0';
-
- fclose (fp);
-
- comp = icalparser_parse_string (str);
- g_free (str);
-
- return comp;
-}
-
-static void
-icalendar_calendar_load (CalBackendIMC *cbimc, char *fname)
-{
- IMCPrivate *priv;
- icalcomponent *comp;
- icalcomponent *subcomp;
- iCalObject *ical;
-
- priv = cbimc->priv;
-
- g_assert (!priv->loaded);
- g_assert (priv->object_hash == NULL);
-
- priv->object_hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- comp = icalendar_parse_file (fname);
- subcomp = icalcomponent_get_first_component (comp,
- ICAL_ANY_COMPONENT);
- while (subcomp) {
- ical = ical_object_create_from_icalcomponent (subcomp);
- if (ical->type != ICAL_EVENT &&
- ical->type != ICAL_TODO &&
- ical->type != ICAL_JOURNAL) {
- g_message ("icalendar_calendar_load(): Skipping unsupported "
- "iCalendar component.");
- } else
- add_object (cbimc, ical);
-
- subcomp = icalcomponent_get_next_component (comp,
- ICAL_ANY_COMPONENT);
- }
-}
-
-/* ics is to be used to designate a file containing (an arbitrary set of)
- * calendaring and scheduling information.
- *
- * ifb is to be used to designate a file containing free or busy time
- * information.
- *
- * anything else is assumed to be a vcal file.
- *
- * FIXME: should we return UNKNOWN at some point?
- */
-static CalendarFormat
-cal_get_type_from_filename (char *str_uri)
-{
- int len;
-
- if (str_uri == NULL)
- return CAL_FORMAT_VCALENDAR;
-
- len = strlen (str_uri);
- if (len < 4)
- return CAL_FORMAT_VCALENDAR;
-
- if (str_uri[len - 4] == '.' && str_uri[len - 3] == 'i' &&
- str_uri[len - 2] == 'c' && str_uri[len - 1] == 's')
- return CAL_FORMAT_ICALENDAR;
-
- if (str_uri[len - 4] == '.' && str_uri[len - 3] == 'i' &&
- str_uri[len - 2] == 'f' && str_uri[len - 1] == 'b')
- return CAL_FORMAT_ICALENDAR;
-
- if (str_uri[len - 4] == '.' && str_uri[len - 3] == 'i' &&
- str_uri[len - 2] == 'c' && str_uri[len - 1] == 's')
- return CAL_FORMAT_ICALENDAR;
-
- if (len < 5)
- return CAL_FORMAT_VCALENDAR;
-
- if (str_uri[len - 5] == '.' && str_uri[len - 4] == 'i' &&
- str_uri[len - 3] == 'c' && str_uri[len - 2] == 'a' &&
- str_uri[len - 1] == 'l')
- return CAL_FORMAT_ICALENDAR;
-
- return CAL_FORMAT_VCALENDAR;
-}
-
-/* Load handler for the IMC backend */
-static CalBackendLoadStatus
-cal_backend_imc_load (CalBackend *backend, GnomeVFSURI *uri)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- VObject *vobject;
- char *str_uri;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_val_if_fail (!priv->loaded, CAL_BACKEND_LOAD_ERROR);
- g_return_val_if_fail (uri != NULL, CAL_BACKEND_LOAD_ERROR);
-
- /* FIXME: this looks rather bad; maybe we should check for local files
- * and fail if they are remote.
- */
-
- str_uri = gnome_vfs_uri_to_string (uri,
- (GNOME_VFS_URI_HIDE_USER_NAME
- | GNOME_VFS_URI_HIDE_PASSWORD
- | GNOME_VFS_URI_HIDE_HOST_NAME
- | GNOME_VFS_URI_HIDE_HOST_PORT
- | GNOME_VFS_URI_HIDE_TOPLEVEL_METHOD));
-
- /* look at the extension on the filename and decide if this is a
- * iCalendar or vCalendar file.
- */
- priv->format = cal_get_type_from_filename (str_uri);
-
- /* load */
-
- switch (priv->format) {
- case CAL_FORMAT_VCALENDAR:
- vobject = Parse_MIME_FromFileName (str_uri);
-
- if (!vobject){
- g_free (str_uri);
- return CAL_BACKEND_LOAD_ERROR;
- }
-
- load_from_vobject (cbimc, vobject);
- cleanVObject (vobject);
- cleanStrTbl ();
- break;
-
- case CAL_FORMAT_ICALENDAR:
- icalendar_calendar_load (cbimc, str_uri);
- break;
-
- default:
- g_free (str_uri);
- return CAL_BACKEND_LOAD_ERROR;
- }
-
- g_free (str_uri);
-
- gnome_vfs_uri_ref (uri);
-
- priv->uri = uri;
- priv->loaded = TRUE;
-
- return CAL_BACKEND_LOAD_SUCCESS;
-}
-
-/* Create handler for the IMC backend */
-static void
-cal_backend_imc_create (CalBackend *backend, GnomeVFSURI *uri)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- char *str_uri;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_if_fail (!priv->loaded);
- g_return_if_fail (uri != NULL);
-
- /* Create the new calendar information */
-
- g_assert (priv->object_hash == NULL);
- priv->object_hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- priv->dirty = TRUE;
-
- /* Done */
-
- /* FIXME: this looks rather bad; maybe we should check for local files
- * and fail if they are remote.
- */
-
- str_uri = gnome_vfs_uri_to_string (uri,
- (GNOME_VFS_URI_HIDE_USER_NAME
- | GNOME_VFS_URI_HIDE_PASSWORD
- | GNOME_VFS_URI_HIDE_HOST_NAME
- | GNOME_VFS_URI_HIDE_HOST_PORT
- | GNOME_VFS_URI_HIDE_TOPLEVEL_METHOD));
-
- /* look at the extension on the filename and decide if this is a
- * iCalendar or vCalendar file.
- */
- priv->format = cal_get_type_from_filename (str_uri);
-
- g_free (str_uri);
-
- gnome_vfs_uri_ref (uri);
-
- priv->uri = uri;
- priv->loaded = TRUE;
-
- save (cbimc);
-}
-
-struct get_n_objects_closure {
- CalObjType type;
- int n;
-};
-
-/* Counts the number of objects of the specified type. Called from
- * g_hash_table_foreach().
- */
-static void
-count_objects (gpointer key, gpointer value, gpointer data)
-{
- iCalObject *ico;
- struct get_n_objects_closure *c;
- gboolean store;
-
- ico = value;
- c = data;
-
- store = FALSE;
-
- if (ico->type == ICAL_EVENT)
- store = (c->type & CALOBJ_TYPE_EVENT) != 0;
- else if (ico->type == ICAL_TODO)
- store = (c->type & CALOBJ_TYPE_TODO) != 0;
- else if (ico->type == ICAL_JOURNAL)
- store = (c->type & CALOBJ_TYPE_JOURNAL) != 0;
-
- if (store)
- c->n++;
-}
-
-/* Get_n_objects handler for the IMC backend */
-static int
-cal_backend_imc_get_n_objects (CalBackend *backend, CalObjType type)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- struct get_n_objects_closure c;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_val_if_fail (priv->loaded, -1);
-
- c.type = type;
- c.n = 0;
-
- g_hash_table_foreach (priv->object_hash, count_objects, &c);
-
- return c.n;
-}
-
-/* Get_object handler for the IMC backend */
-static char *
-cal_backend_imc_get_object (CalBackend *backend, const char *uid)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- iCalObject *ico;
- char *buf;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_val_if_fail (uid != NULL, NULL);
-
- g_return_val_if_fail (priv->loaded, NULL);
- g_assert (priv->object_hash != NULL);
-
- ico = lookup_object (cbimc, uid);
-
- if (!ico)
- return NULL;
-
- buf = ical_object_to_string (ico);
-
- return buf;
-}
-
-struct get_uids_closure {
- CalObjType type;
- GList *uid_list;
-};
-
-/* Builds a list of UIDs for objects that match the sought type. Called from
- * g_hash_table_foreach().
- */
-static void
-build_uids_list (gpointer key, gpointer value, gpointer data)
-{
- iCalObject *ico;
- struct get_uids_closure *c;
- gboolean store;
-
- ico = value;
- c = data;
-
- store = FALSE;
-
- if (ico->type == ICAL_EVENT)
- store = (c->type & CALOBJ_TYPE_EVENT) ? TRUE : FALSE;
- else if (ico->type == ICAL_TODO)
- store = (c->type & CALOBJ_TYPE_TODO) ? TRUE : FALSE;
- else if (ico->type == ICAL_JOURNAL)
- store = (c->type & CALOBJ_TYPE_JOURNAL) ? TRUE : FALSE;
-
- if (store)
- c->uid_list = g_list_prepend (c->uid_list, g_strdup (ico->uid));
-}
-
-/* Get_uids handler for the IMC backend */
-static GList *
-cal_backend_imc_get_uids (CalBackend *backend, CalObjType type)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- struct get_uids_closure c;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_val_if_fail (priv->loaded, NULL);
-
- c.type = type;
- c.uid_list = NULL;
- g_hash_table_foreach (priv->object_hash, build_uids_list, &c);
-
- return c.uid_list;
-}
-
-
-
-static char *
-cal_backend_imc_get_uid_by_pilot_id (CalBackend *backend,
- unsigned long int pilot_id)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- GList *l;
- iCalObject *obj = NULL;
-
- g_return_val_if_fail (backend != NULL, NULL);
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
- g_return_val_if_fail (priv->loaded, NULL);
-
- for (l = priv->events; l; l = l->next){
- obj = l->data;
- if (obj->pilot_id == pilot_id)
- goto done;
- }
-
- for (l = priv->todos; l; l = l->next){
- obj = l->data;
- if (obj->pilot_id == pilot_id)
- goto done;
- }
-
- done:
- if (!obj || obj->pilot_id != pilot_id)
- return NULL;
-
- return g_strdup (obj->uid);
-}
-
-
-void
-cal_backend_imc_update_pilot_id (CalBackend *backend,
- const char *uid,
- unsigned long int pilot_id,
- unsigned long int pilot_status)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- iCalObject *obj;
-
- g_return_if_fail (backend != NULL);
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
- g_return_if_fail (priv->loaded);
-
- obj = lookup_object (cbimc, uid);
-
- obj->pilot_id = pilot_id;
- obj->pilot_status = pilot_status;
-
- save (cbimc);
-
- notify_update (cbimc, uid);
-}
-
-
-
-/* Allocates and fills in a new CalObjInstance structure */
-static CalObjInstance *
-build_cal_obj_instance (iCalObject *ico, time_t start, time_t end)
-{
- CalObjInstance *icoi;
-
- g_assert (ico->uid != NULL);
-
- icoi = g_new (CalObjInstance, 1);
- icoi->uid = g_strdup (ico->uid);
- icoi->start = start;
- icoi->end = end;
-
- return icoi;
-}
-
-struct build_event_list_closure {
- CalBackendIMC *cbimc;
- GList *event_list;
-};
-
-/* Builds a sorted list of event object instances. Used as a callback from
- * ical_object_generate_events().
- */
-static int
-build_event_list (iCalObject *ico, time_t start, time_t end, void *data)
-{
- CalObjInstance *icoi;
- struct build_event_list_closure *c;
-
- c = data;
-
- icoi = build_cal_obj_instance (ico, start, end);
- c->event_list = g_list_prepend (c->event_list, icoi);
-
- return TRUE;
-}
-
-/* Compares two CalObjInstance structures by their start times. Called from
- * g_list_sort().
- */
-static gint
-compare_instance_func (gconstpointer a, gconstpointer b)
-{
- const CalObjInstance *ca, *cb;
- time_t diff;
-
- ca = a;
- cb = b;
-
- diff = ca->start - cb->start;
- return (diff < 0) ? -1 : (diff > 0) ? 1 : 0;
-}
-
-/* Get_events_in_range handler for the IMC backend */
-static GList *
-cal_backend_imc_get_events_in_range (CalBackend *backend, time_t start, time_t end)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- struct build_event_list_closure c;
- GList *l;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_val_if_fail (priv->loaded, NULL);
-
- g_return_val_if_fail (start != -1 && end != -1, NULL);
- g_return_val_if_fail (start <= end, NULL);
-
- c.cbimc = cbimc;
- c.event_list = NULL;
-
- for (l = priv->events; l; l = l->next) {
- iCalObject *ico;
-
- ico = l->data;
- ical_object_generate_events (ico, start, end,
- build_event_list, &c);
- }
-
- c.event_list = g_list_sort (c.event_list, compare_instance_func);
- return c.event_list;
-}
-
-struct build_alarm_list_closure {
- time_t start;
- time_t end;
- GList *alarms;
-};
-
-/* Computes the offset in minutes from an alarm trigger to the actual event */
-static int
-compute_alarm_offset (CalendarAlarm *a)
-{
- int ofs;
-
- if (!a->enabled)
- return -1;
-
- switch (a->units) {
- case ALARM_MINUTES:
- ofs = a->count * 60;
- break;
-
- case ALARM_HOURS:
- ofs = a->count * 3600;
- break;
-
- case ALARM_DAYS:
- ofs = a->count * 24 * 3600;
- break;
-
- default:
- ofs = -1;
- g_assert_not_reached ();
- }
-
- return ofs;
-}
-
-/* Allocates and fills in a new CalAlarmInstance structure */
-static CalAlarmInstance *
-build_cal_alarm_instance (iCalObject *ico, enum AlarmType type, time_t trigger, time_t occur)
-{
- CalAlarmInstance *ai;
-
- g_assert (ico->uid != NULL);
-
- ai = g_new (CalAlarmInstance, 1);
- ai->uid = g_strdup (ico->uid);
- ai->type = type;
- ai->trigger = trigger;
- ai->occur = occur;
-
- return ai;
-}
-
-/* Adds the specified alarm to the list if its trigger time falls within the
- * requested range.
- */
-static void
-try_add_alarm (time_t occur_start, iCalObject *ico, CalendarAlarm *alarm,
- struct build_alarm_list_closure *c)
-{
- int ofs;
- time_t trigger;
- CalAlarmInstance *ai;
-
- if (!alarm->enabled)
- return;
-
- ofs = compute_alarm_offset (alarm);
- g_assert (ofs != -1);
-
- trigger = occur_start - ofs;
-
- if (trigger < c->start || trigger > c->end)
- return;
-
- ai = build_cal_alarm_instance (ico, alarm->type, trigger, occur_start);
- c->alarms = g_list_prepend (c->alarms, ai);
-}
-
-/* Builds a list of alarm instances. Used as a callback from
- * ical_object_generate_events().
- */
-static int
-build_alarm_list (iCalObject *ico, time_t start, time_t end, void *data)
-{
- struct build_alarm_list_closure *c;
-
- c = data;
-
- try_add_alarm (start, ico, &ico->dalarm, c);
- try_add_alarm (start, ico, &ico->aalarm, c);
- try_add_alarm (start, ico, &ico->palarm, c);
- try_add_alarm (start, ico, &ico->malarm, c);
-
- return TRUE;
-}
-
-/* Adds all the alarm triggers that occur within the specified time range */
-static GList *
-add_alarms_for_object (GList *alarms, iCalObject *ico, time_t start, time_t end)
-{
- struct build_alarm_list_closure c;
- int dofs, aofs, pofs, mofs;
- int max_ofs;
-
- dofs = compute_alarm_offset (&ico->dalarm);
- aofs = compute_alarm_offset (&ico->aalarm);
- pofs = compute_alarm_offset (&ico->palarm);
- mofs = compute_alarm_offset (&ico->malarm);
-
- max_ofs = MAX (dofs, MAX (aofs, MAX (pofs, mofs)));
- if (max_ofs == -1)
- return alarms;
-
- c.start = start;
- c.end = end;
- c.alarms = alarms;
-
- ical_object_generate_events (ico, start, end, build_alarm_list, &c);
- return c.alarms;
-}
-
-/* Get_alarms_in_range handler for the IMC backend */
-static GList *
-cal_backend_imc_get_alarms_in_range (CalBackend *backend, time_t start, time_t end)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- GList *l;
- GList *alarms;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_val_if_fail (priv->loaded, NULL);
-
- g_return_val_if_fail (start != -1 && end != -1, NULL);
- g_return_val_if_fail (start <= end, NULL);
-
- /* Only VEVENT and VTODO components can have alarms */
-
- alarms = NULL;
-
- for (l = priv->events; l; l = l->next)
- alarms = add_alarms_for_object (alarms, (iCalObject *) l->data, start, end);
-
- for (l = priv->todos; l; l = l->next)
- alarms = add_alarms_for_object (alarms, (iCalObject *) l->data, start, end);
-
- alarms = g_list_sort (alarms, compare_instance_func);
- return alarms;
-}
-
-/* Get_alarms_for_object handler for the IMC backend */
-static gboolean
-cal_backend_imc_get_alarms_for_object (CalBackend *backend, const char *uid,
- time_t start, time_t end,
- GList **alarms)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- iCalObject *ico;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_val_if_fail (priv->loaded, FALSE);
- g_return_val_if_fail (uid != NULL, FALSE);
- g_return_val_if_fail (start != -1 && end != -1, FALSE);
- g_return_val_if_fail (start <= end, FALSE);
- g_return_val_if_fail (alarms != NULL, FALSE);
-
- *alarms = NULL;
-
- ico = lookup_object (cbimc, uid);
- if (!ico)
- return FALSE;
-
- /* Only VEVENT and VTODO components can have alarms */
-
- if (ico->type != ICAL_EVENT && ico->type != ICAL_TODO)
- return TRUE;
-
- *alarms = add_alarms_for_object (*alarms, ico, start, end);
- *alarms = g_list_sort (*alarms, compare_instance_func);
-
- return TRUE;
-}
-
-/* Notifies a backend's clients that an object was updated */
-static void
-notify_update (CalBackendIMC *cbimc, const char *uid)
-{
- IMCPrivate *priv;
- GList *l;
-
- priv = cbimc->priv;
-
- for (l = priv->clients; l; l = l->next) {
- Cal *cal;
-
- cal = CAL (l->data);
- cal_notify_update (cal, uid);
- }
-}
-
-/* Notifies a backend's clients that an object was removed */
-static void
-notify_remove (CalBackendIMC *cbimc, const char *uid)
-{
- IMCPrivate *priv;
- GList *l;
-
- priv = cbimc->priv;
-
- for (l = priv->clients; l; l = l->next) {
- Cal *cal;
-
- cal = CAL (l->data);
- cal_notify_remove (cal, uid);
- }
-}
-
-/* Update_object handler for the IMC backend */
-static gboolean
-cal_backend_imc_update_object (CalBackend *backend, const char *uid, const char *calobj)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- iCalObject *ico, *new_ico;
- CalObjFindStatus status;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_val_if_fail (priv->loaded, FALSE);
-
- g_return_val_if_fail (uid != NULL, FALSE);
- g_return_val_if_fail (calobj != NULL, FALSE);
-
- /* Pull the object from the string */
-
- status = ical_object_find_in_string (uid, calobj, &new_ico);
-
- if (status != CAL_OBJ_FIND_SUCCESS)
- return FALSE;
-
- /* Update the object */
-
- ico = lookup_object (cbimc, uid);
-
- if (ico)
- remove_object (cbimc, ico);
-
- add_object (cbimc, new_ico);
- new_ico->pilot_status = ICAL_PILOT_SYNC_MOD;
- save (cbimc);
-
- /* FIXME: do the notification asynchronously */
-
- notify_update (cbimc, new_ico->uid);
-
- return TRUE;
-}
-
-/* Remove_object handler for the IMC backend */
-static gboolean
-cal_backend_imc_remove_object (CalBackend *backend, const char *uid)
-{
- CalBackendIMC *cbimc;
- IMCPrivate *priv;
- iCalObject *ico;
-
- cbimc = CAL_BACKEND_IMC (backend);
- priv = cbimc->priv;
-
- g_return_val_if_fail (priv->loaded, FALSE);
-
- g_return_val_if_fail (uid != NULL, FALSE);
-
- ico = lookup_object (cbimc, uid);
- if (!ico)
- return FALSE;
-
- remove_object (cbimc, ico);
-
- priv->dirty = TRUE;
- save (cbimc);
-
- /* FIXME: do the notification asynchronously */
- notify_remove (cbimc, uid);
-
- return TRUE;
-}
diff --git a/calendar/pcs/cal-backend-imc.h b/calendar/pcs/cal-backend-imc.h
deleted file mode 100644
index 954bbc52cc..0000000000
--- a/calendar/pcs/cal-backend-imc.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Evolution calendar - Internet Mail Consortium formats backend
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@helixcode.com>
- * Seth Alves <alves@helixcode.com>
- * Miguel de Icaza <miguel@helixcode.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 CAL_BACKEND_IMC_H
-#define CAL_BACKEND_IMC_H
-
-#include <libgnome/gnome-defs.h>
-#include "cal-backend.h"
-
-BEGIN_GNOME_DECLS
-
-
-
-#define CAL_BACKEND_IMC_TYPE (cal_backend_imc_get_type ())
-#define CAL_BACKEND_IMC(obj) (GTK_CHECK_CAST ((obj), CAL_BACKEND_IMC_TYPE, CalBackendIMC))
-#define CAL_BACKEND_IMC_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_BACKEND_IMC_TYPE, \
- CalBackendIMCClass))
-#define IS_CAL_BACKEND_IMC(obj) (GTK_CHECK_TYPE ((obj), CAL_BACKEND_IMC_TYPE))
-#define IS_CAL_BACKEND_IMC_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_BACKEND_IMC_TYPE))
-
-typedef struct _CalBackendIMC CalBackendIMC;
-typedef struct _CalBackendIMCClass CalBackendIMCClass;
-
-struct _CalBackendIMC {
- CalBackend backend;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _CalBackendIMCClass {
- CalBackendClass parent_class;
-};
-
-GtkType cal_backend_imc_get_type (void);
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/pcs/cal-backend.c b/calendar/pcs/cal-backend.c
deleted file mode 100644
index e33cedeae8..0000000000
--- a/calendar/pcs/cal-backend.c
+++ /dev/null
@@ -1,403 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - generic backend class
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <cal-util/calobj.h>
-#include "cal-backend.h"
-#include "libversit/vcc.h"
-
-
-
-/* Signal IDs */
-enum {
- LAST_CLIENT_GONE,
- LAST_SIGNAL
-};
-
-static void cal_backend_class_init (CalBackendClass *class);
-
-static GtkObjectClass *parent_class;
-
-static guint cal_backend_signals[LAST_SIGNAL];
-
-#define CLASS(backend) (CAL_BACKEND_CLASS (GTK_OBJECT (backend)->klass))
-
-
-
-/**
- * cal_backend_get_type:
- * @void:
- *
- * Registers the #CalBackend class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #CalBackend class.
- **/
-GtkType
-cal_backend_get_type (void)
-{
- static GtkType cal_backend_type = 0;
-
- if (!cal_backend_type) {
- static const GtkTypeInfo cal_backend_info = {
- "CalBackend",
- sizeof (CalBackend),
- sizeof (CalBackendClass),
- (GtkClassInitFunc) cal_backend_class_init,
- (GtkObjectInitFunc) NULL,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- cal_backend_type =
- gtk_type_unique (GTK_TYPE_OBJECT, &cal_backend_info);
- }
-
- return cal_backend_type;
-}
-
-/* Class initialization function for the calendar backend */
-static void
-cal_backend_class_init (CalBackendClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- parent_class = gtk_type_class (GTK_TYPE_OBJECT);
-
- cal_backend_signals[LAST_CLIENT_GONE] =
- gtk_signal_new ("last_client_gone",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (CalBackendClass, last_client_gone),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, cal_backend_signals, LAST_SIGNAL);
-}
-
-
-
-/**
- * cal_backend_get_uri:
- * @backend: A calendar backend.
- *
- * Queries the URI of a calendar backend, which must already have a loaded
- * calendar.
- *
- * Return value: The URI where the calendar is stored.
- **/
-GnomeVFSURI *
-cal_backend_get_uri (CalBackend *backend)
-{
- g_return_val_if_fail (backend != NULL, NULL);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
-
- g_assert (CLASS (backend)->get_uri != NULL);
- return (* CLASS (backend)->get_uri) (backend);
-}
-
-/**
- * cal_backend_add_cal:
- * @backend: A calendar backend.
- * @cal: A calendar client interface object.
- *
- * Adds a calendar client interface object to a calendar @backend.
- * The calendar backend must already have a loaded calendar.
- **/
-void
-cal_backend_add_cal (CalBackend *backend, Cal *cal)
-{
- g_return_if_fail (backend != NULL);
- g_return_if_fail (IS_CAL_BACKEND (backend));
-
- g_assert (CLASS (backend)->add_cal != NULL);
- (* CLASS (backend)->add_cal) (backend, cal);
-}
-
-/**
- * cal_backend_load:
- * @backend: A calendar backend.
- * @uri: URI that contains the calendar data.
- *
- * Loads a calendar backend with data from a calendar stored at the specified
- * URI.
- *
- * Return value: An operation status code.
- **/
-CalBackendLoadStatus
-cal_backend_load (CalBackend *backend, GnomeVFSURI *uri)
-{
- g_return_val_if_fail (backend != NULL, CAL_BACKEND_LOAD_ERROR);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), CAL_BACKEND_LOAD_ERROR);
- g_return_val_if_fail (uri != NULL, CAL_BACKEND_LOAD_ERROR);
-
- g_assert (CLASS (backend)->load != NULL);
- return (* CLASS (backend)->load) (backend, uri);
-}
-
-/**
- * cal_backend_create:
- * @backend: A calendar backend.
- * @uri: URI that will contain the calendar data.
- *
- * Creates a new empty calendar in a calendar backend.
- **/
-void
-cal_backend_create (CalBackend *backend, GnomeVFSURI *uri)
-{
- g_return_if_fail (backend != NULL);
- g_return_if_fail (IS_CAL_BACKEND (backend));
- g_return_if_fail (uri != NULL);
-
- g_assert (CLASS (backend)->create != NULL);
- (* CLASS (backend)->create) (backend, uri);
-}
-
-/**
- * cal_backend_get_n_objects:
- * @backend: A calendar backend.
- * @type: Types of objects that will be included in the count.
- *
- * Queries the number of calendar objects of a particular type.
- *
- * Return value: Number of objects of the specified @type.
- **/
-int
-cal_backend_get_n_objects (CalBackend *backend, CalObjType type)
-{
- g_return_val_if_fail (backend != NULL, -1);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), -1);
-
- g_assert (CLASS (backend)->get_n_objects != NULL);
- return (* CLASS (backend)->get_n_objects) (backend, type);
-}
-
-/**
- * cal_backend_get_object:
- * @backend: A calendar backend.
- * @uid: Unique identifier for a calendar object.
- *
- * Queries a calendar backend for a calendar object based on its unique
- * identifier.
- *
- * Return value: The string representation of a complete calendar wrapping the
- * the sought object, or NULL if no object had the specified UID. A complete
- * calendar is returned because you also need the timezone data.
- **/
-char *
-cal_backend_get_object (CalBackend *backend, const char *uid)
-{
- g_return_val_if_fail (backend != NULL, NULL);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
- g_return_val_if_fail (uid != NULL, NULL);
-
- g_assert (CLASS (backend)->get_object != NULL);
- return (* CLASS (backend)->get_object) (backend, uid);
-}
-
-/**
- * cal_backend_get_uids:
- * @backend: A calendar backend.
- * @type: Bitmask with types of objects to return.
- *
- * Builds a list of unique identifiers corresponding to calendar objects whose
- * type matches one of the types specified in the @type flags.
- *
- * Return value: A list of strings that are the sought UIDs. The list should be
- * freed using the cal_obj_uid_list_free() function.
- **/
-GList *
-cal_backend_get_uids (CalBackend *backend, CalObjType type)
-{
- g_return_val_if_fail (backend != NULL, NULL);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
-
- g_assert (CLASS (backend)->get_uids != NULL);
- return (* CLASS (backend)->get_uids) (backend, type);
-}
-
-/**
- * cal_backend_get_objects_in_range:
- * @backend: A calendar backend.
- * @type: Bitmask with types of objects to return.
- * @start: Start time for query.
- * @end: End time for query.
- *
- * Builds a list of unique identifiers corresponding to calendar objects of the
- * specified type that occur or recur within the specified time range.
- *
- * Return value: A list of UID strings. The list should be freed using the
- * cal_obj_uid_list_free() function.
- **/
-GList *
-cal_backend_get_objects_in_range (CalBackend *backend, CalObjType type,
- time_t start, time_t end)
-{
- g_return_val_if_fail (backend != NULL, NULL);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
- g_return_val_if_fail (start != -1 && end != -1, NULL);
- g_return_val_if_fail (start <= end, NULL);
-
- g_assert (CLASS (backend)->get_objects_in_range != NULL);
- return (* CLASS (backend)->get_objects_in_range) (backend, type, start, end);
-}
-
-/**
- * cal_backend_get_alarms_in_range:
- * @backend: A calendar backend.
- * @start: Start time for query.
- * @end: End time for query.
- *
- * Builds a sorted list of the alarms that trigger in the specified time range.
- *
- * Return value: A list of #CalAlarmInstance structures, sorted by trigger time.
- **/
-GList *
-cal_backend_get_alarms_in_range (CalBackend *backend, time_t start, time_t end)
-{
- g_return_val_if_fail (backend != NULL, NULL);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
- g_return_val_if_fail (start != -1 && end != -1, NULL);
- g_return_val_if_fail (start <= end, NULL);
-
- g_assert (CLASS (backend)->get_alarms_in_range != NULL);
- return (* CLASS (backend)->get_alarms_in_range) (backend, start, end);
-}
-
-/**
- * cal_backend_get_alarms_for_object:
- * @backend: A calendar backend.
- * @uid: Unique identifier for a calendar object.
- * @start: Start time for query.
- * @end: End time for query.
- * @alarms: Return value for the list of alarm instances.
- *
- * Builds a sorted list of the alarms of the specified event that trigger in a
- * particular time range.
- *
- * Return value: TRUE on success, FALSE if the object was not found.
- **/
-gboolean
-cal_backend_get_alarms_for_object (CalBackend *backend, const char *uid,
- time_t start, time_t end,
- GList **alarms)
-{
- g_return_val_if_fail (backend != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), FALSE);
- g_return_val_if_fail (uid != NULL, FALSE);
- g_return_val_if_fail (start != -1 && end != -1, FALSE);
- g_return_val_if_fail (start <= end, FALSE);
- g_return_val_if_fail (alarms != NULL, FALSE);
-
- g_assert (CLASS (backend)->get_alarms_for_object != NULL);
- return (* CLASS (backend)->get_alarms_for_object) (backend, uid, start, end, alarms);
-}
-
-
-char *cal_backend_get_uid_by_pilot_id (CalBackend *backend, unsigned long int pilot_id)
-{
- g_return_val_if_fail (backend != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), FALSE);
- g_assert (CLASS(backend)->get_uid_by_pilot_id != NULL);
- return (* CLASS(backend)->get_uid_by_pilot_id) (backend, pilot_id);
-}
-
-
-void cal_backend_update_pilot_id (CalBackend *backend, const char *uid,
- unsigned long int pilot_id,
- unsigned long int pilot_status)
-{
- g_return_if_fail (backend != NULL);
- g_return_if_fail (IS_CAL_BACKEND (backend));
- g_assert (CLASS(backend)->update_pilot_id != NULL);
- (* CLASS(backend)->update_pilot_id) (backend, uid,
- pilot_id, pilot_status);
-}
-
-
-
-/**
- * cal_backend_update_object:
- * @backend: A calendar backend.
- * @uid: Unique identifier of the object to update.
- * @calobj: String representation of the new calendar object.
- *
- * Updates an object in a calendar backend. It will replace any existing
- * object that has the same UID as the specified one. The backend will in
- * turn notify all of its clients about the change.
- *
- * Return value: TRUE on success, FALSE on being passed an invalid object or one
- * with an unsupported type.
- **/
-gboolean
-cal_backend_update_object (CalBackend *backend, const char *uid, const char *calobj)
-{
- g_return_val_if_fail (backend != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), FALSE);
- g_return_val_if_fail (uid != NULL, FALSE);
- g_return_val_if_fail (calobj != NULL, FALSE);
-
- g_assert (CLASS (backend)->update_object != NULL);
- return (* CLASS (backend)->update_object) (backend, uid, calobj);
-}
-
-/**
- * cal_backend_remove_object:
- * @backend: A calendar backend.
- * @uid: Unique identifier of the object to remove.
- *
- * Removes an object in a calendar backend. The backend will notify all of its
- * clients about the change.
- *
- * Return value: TRUE on success, FALSE on being passed an UID for an object
- * that does not exist in the backend.
- **/
-gboolean
-cal_backend_remove_object (CalBackend *backend, const char *uid)
-{
- g_return_val_if_fail (backend != NULL, FALSE);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), FALSE);
- g_return_val_if_fail (uid != NULL, FALSE);
-
- g_assert (CLASS (backend)->remove_object != NULL);
- return (* CLASS (backend)->remove_object) (backend, uid);
-}
-
-/**
- * cal_backend_last_client_gone:
- * @backend: A calendar backend.
- *
- * Emits the "last_client_gone" signal of a calendar backend. This function is
- * to be used only by backend implementations.
- **/
-void
-cal_backend_last_client_gone (CalBackend *backend)
-{
- g_return_if_fail (backend != NULL);
- g_return_if_fail (IS_CAL_BACKEND (backend));
-
- gtk_signal_emit (GTK_OBJECT (backend), cal_backend_signals[LAST_CLIENT_GONE]);
-}
diff --git a/calendar/pcs/cal-backend.h b/calendar/pcs/cal-backend.h
deleted file mode 100644
index e1122f4d1c..0000000000
--- a/calendar/pcs/cal-backend.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - generic backend class
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 CAL_BACKEND_H
-#define CAL_BACKEND_H
-
-#include <libgnome/gnome-defs.h>
-#include <libgnomevfs/gnome-vfs.h>
-#include <cal-util/cal-util.h>
-#include "calendar/pcs/evolution-calendar.h"
-#include "cal-common.h"
-#include "cal.h"
-
-BEGIN_GNOME_DECLS
-
-
-
-#define CAL_BACKEND_TYPE (cal_backend_get_type ())
-#define CAL_BACKEND(obj) (GTK_CHECK_CAST ((obj), CAL_BACKEND_TYPE, CalBackend))
-#define CAL_BACKEND_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_BACKEND_TYPE, \
- CalBackendClass))
-#define IS_CAL_BACKEND(obj) (GTK_CHECK_TYPE ((obj), CAL_BACKEND_TYPE))
-#define IS_CAL_BACKEND_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_BACKEND_TYPE))
-
-/* Load status values */
-typedef enum {
- CAL_BACKEND_LOAD_SUCCESS, /* Loading OK */
- CAL_BACKEND_LOAD_ERROR /* We need better error reporting in libversit */
-} CalBackendLoadStatus;
-
-struct _CalBackend {
- GtkObject object;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _CalBackendClass {
- GtkObjectClass parent_class;
-
- /* Notification signals */
- void (* last_client_gone) (CalBackend *backend);
-
- /* Virtual methods */
- GnomeVFSURI *(* get_uri) (CalBackend *backend);
- void (* add_cal) (CalBackend *backend, Cal *cal);
- CalBackendLoadStatus (* load) (CalBackend *backend, GnomeVFSURI *uri);
- void (* create) (CalBackend *backend, GnomeVFSURI *uri);
-
- int (* get_n_objects) (CalBackend *backend, CalObjType type);
- char *(* get_object) (CalBackend *backend, const char *uid);
- GList *(* get_uids) (CalBackend *backend, CalObjType type);
- GList *(* get_objects_in_range) (CalBackend *backend, CalObjType type,
- time_t start, time_t end);
- GList *(* get_alarms_in_range) (CalBackend *backend, time_t start, time_t end);
- gboolean (* get_alarms_for_object) (CalBackend *backend, const char *uid,
- time_t start, time_t end,
- GList **alarms);
- gboolean (* update_object) (CalBackend *backend, const char *uid, const char *calobj);
- gboolean (* remove_object) (CalBackend *backend, const char *uid);
- char *(* get_uid_by_pilot_id) (CalBackend *backend, unsigned long int pilot_id);
- void (* update_pilot_id) (CalBackend *backend, const char *uid,
- unsigned long int pilot_id, unsigned long int pilot_status);
-};
-
-GtkType cal_backend_get_type (void);
-
-GnomeVFSURI *cal_backend_get_uri (CalBackend *backend);
-
-void cal_backend_add_cal (CalBackend *backend, Cal *cal);
-
-CalBackendLoadStatus cal_backend_load (CalBackend *backend, GnomeVFSURI *uri);
-
-void cal_backend_create (CalBackend *backend, GnomeVFSURI *uri);
-
-int cal_backend_get_n_objects (CalBackend *backend, CalObjType type);
-
-char *cal_backend_get_object (CalBackend *backend, const char *uid);
-
-GList *cal_backend_get_uids (CalBackend *backend, CalObjType type);
-
-GList *cal_backend_get_objects_in_range (CalBackend *backend, CalObjType type,
- time_t start, time_t end);
-
-GList *cal_backend_get_alarms_in_range (CalBackend *backend, time_t start, time_t end);
-
-gboolean cal_backend_get_alarms_for_object (CalBackend *backend, const char *uid,
- time_t start, time_t end,
- GList **alarms);
-
-
-gboolean cal_backend_update_object (CalBackend *backend, const char *uid, const char *calobj);
-
-gboolean cal_backend_remove_object (CalBackend *backend, const char *uid);
-
-void cal_backend_last_client_gone (CalBackend *backend);
-
-char *cal_backend_get_uid_by_pilot_id (CalBackend *backend, unsigned long int pilot_id);
-
-void cal_backend_update_pilot_id (CalBackend *backend, const char *uid,
- unsigned long int pilot_id,
- unsigned long int pilot_status);
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/pcs/cal-common.h b/calendar/pcs/cal-common.h
deleted file mode 100644
index e51ddf1bdd..0000000000
--- a/calendar/pcs/cal-common.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Evolution calendar server - common declarations
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 CAL_COMMON_H
-#define CAL_COMMON_H
-
-#include <libgnome/gnome-defs.h>
-
-BEGIN_GNOME_DECLS
-
-
-
-typedef struct _CalBackend CalBackend;
-typedef struct _CalBackendClass CalBackendClass;
-
-typedef struct _Cal Cal;
-typedef struct _CalClass CalClass;
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/pcs/cal-factory.c b/calendar/pcs/cal-factory.c
deleted file mode 100644
index ab19ccb8b3..0000000000
--- a/calendar/pcs/cal-factory.c
+++ /dev/null
@@ -1,858 +0,0 @@
-/* Evolution calendar factory
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <gtk/gtksignal.h>
-#include "cal.h"
-#include "cal-backend.h"
-#include "cal-factory.h"
-#include "job.h"
-
-
-
-/* Private part of the CalFactory structure */
-typedef struct {
- /* Hash table from URI method strings to GtkType * for backend class types */
- GHashTable *methods;
-
- /* Hash table from GnomeVFSURI structures to CalBackend objects */
- GHashTable *backends;
-} CalFactoryPrivate;
-
-
-
-/* Signal IDs */
-enum {
- LAST_CALENDAR_GONE,
- LAST_SIGNAL
-};
-
-static void cal_factory_class_init (CalFactoryClass *class);
-static void cal_factory_init (CalFactory *factory);
-static void cal_factory_destroy (GtkObject *object);
-
-static POA_Evolution_Calendar_CalFactory__vepv cal_factory_vepv;
-
-static BonoboObjectClass *parent_class;
-
-static guint cal_factory_signals[LAST_SIGNAL];
-
-
-
-/**
- * cal_factory_get_type:
- * @void:
- *
- * Registers the #CalFactory class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #CalFactory class.
- **/
-GtkType
-cal_factory_get_type (void)
-{
- static GtkType cal_factory_type = 0;
-
- if (!cal_factory_type) {
- static const GtkTypeInfo cal_factory_info = {
- "CalFactory",
- sizeof (CalFactory),
- sizeof (CalFactoryClass),
- (GtkClassInitFunc) cal_factory_class_init,
- (GtkObjectInitFunc) cal_factory_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- cal_factory_type = gtk_type_unique (bonobo_object_get_type (), &cal_factory_info);
- }
-
- return cal_factory_type;
-}
-
-/* CORBA class initialization function for the calendar factory */
-static void
-init_cal_factory_corba_class (void)
-{
- cal_factory_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
- cal_factory_vepv.Evolution_Calendar_CalFactory_epv = cal_factory_get_epv ();
-}
-
-/* Class initialization function for the calendar factory */
-static void
-cal_factory_class_init (CalFactoryClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- parent_class = gtk_type_class (bonobo_object_get_type ());
-
- cal_factory_signals[LAST_CALENDAR_GONE] =
- gtk_signal_new ("last_calendar_gone",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (CalFactoryClass, last_calendar_gone),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, cal_factory_signals, LAST_SIGNAL);
-
- object_class->destroy = cal_factory_destroy;
-
- init_cal_factory_corba_class ();
-}
-
-/* Object initialization function for the calendar factory */
-static void
-cal_factory_init (CalFactory *factory)
-{
- CalFactoryPrivate *priv;
-
- priv = g_new0 (CalFactoryPrivate, 1);
- factory->priv = priv;
-
- priv->methods = g_hash_table_new (g_str_hash, g_str_equal);
- priv->backends = g_hash_table_new (gnome_vfs_uri_hash, gnome_vfs_uri_hequal);
-}
-
-/* Frees a method/GtkType * pair from the methods hash table */
-static void
-free_method (gpointer key, gpointer value, gpointer data)
-{
- char *method;
- GtkType *type;
-
- method = key;
- type = value;
-
- g_free (method);
- g_free (type);
-}
-
-/* Frees a uri/backend pair from the backends hash table */
-static void
-free_backend (gpointer key, gpointer value, gpointer data)
-{
- GnomeVFSURI *uri;
- CalBackend *backend;
-
- uri = key;
- backend = value;
-
- gnome_vfs_uri_unref (uri);
- gtk_object_unref (GTK_OBJECT (backend));
-}
-
-/* Destroy handler for the calendar */
-static void
-cal_factory_destroy (GtkObject *object)
-{
- CalFactory *factory;
- CalFactoryPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CAL_FACTORY (object));
-
- factory = CAL_FACTORY (object);
- priv = factory->priv;
-
- g_hash_table_foreach (priv->methods, free_method, NULL);
- g_hash_table_destroy (priv->methods);
- priv->methods = NULL;
-
- /* Should we assert that there are no more backends? */
-
- g_hash_table_foreach (priv->backends, free_backend, NULL);
- g_hash_table_destroy (priv->backends);
- priv->backends = NULL;
-
- g_free (priv);
- factory->priv = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-
-/* Loading and creating calendars */
-
-/* Job data */
-typedef struct {
- CalFactory *factory;
- char *uri;
- Evolution_Calendar_Listener listener;
-} LoadCreateJobData;
-
-/* Queues a load or create request */
-static void
-queue_load_create_job (CalFactory *factory, const char *uri, Evolution_Calendar_Listener listener,
- JobFunc func)
-{
- LoadCreateJobData *jd;
- CORBA_Environment ev;
- Evolution_Calendar_Listener listener_copy;
- gboolean result;
-
- g_assert (uri != NULL);
-
- CORBA_exception_init (&ev);
- result = CORBA_Object_is_nil (listener, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("queue_load_create_job(): could not see if the listener was NIL");
- CORBA_exception_free (&ev);
- return;
- }
- CORBA_exception_free (&ev);
-
- if (result) {
- g_message ("queue_load_create_job(): cannot operate on a NIL listener!");
- return;
- }
-
- listener_copy = CORBA_Object_duplicate (listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("queue_load_create_job(): could not duplicate the listener");
- CORBA_exception_free (&ev);
- return;
- }
-
- CORBA_exception_free (&ev);
-
- jd = g_new (LoadCreateJobData, 1);
- jd->factory = factory;
- jd->uri = g_strdup (uri);
- jd->listener = listener_copy;
-
- job_add (func, jd);
-}
-
-/* Looks up a calendar backend in a factory's hash table of uri->cal */
-static CalBackend *
-lookup_backend (CalFactory *factory, GnomeVFSURI *uri)
-{
- CalFactoryPrivate *priv;
- CalBackend *backend;
-
- priv = factory->priv;
-
- backend = g_hash_table_lookup (priv->backends, uri);
- return backend;
-}
-
-/* Callback used when a backend loses its last connected client */
-static void
-backend_last_client_gone_cb (CalBackend *backend, gpointer data)
-{
- CalFactory *factory;
- CalFactoryPrivate *priv;
- GnomeVFSURI *uri;
- gpointer orig_key;
- gboolean result;
- GnomeVFSURI *orig_uri;
-
- fprintf (stderr, "backend_last_client_gone_cb() called!\n");
-
- factory = CAL_FACTORY (data);
- priv = factory->priv;
-
- /* Remove the backend from the hash table */
-
- uri = cal_backend_get_uri (backend);
- g_assert (uri != NULL);
-
- result = g_hash_table_lookup_extended (priv->backends, uri, &orig_key, NULL);
- g_assert (result != FALSE);
-
- orig_uri = orig_key;
-
- g_hash_table_remove (priv->backends, orig_uri);
- gnome_vfs_uri_unref (orig_uri);
-
- gtk_object_unref (GTK_OBJECT (backend));
-
- /* Notify upstream if there are no more backends */
-
- if (g_hash_table_size (priv->backends) == 0)
- gtk_signal_emit (GTK_OBJECT (factory), cal_factory_signals[LAST_CALENDAR_GONE]);
-}
-
-/* Adds a backend to the calendar factory's hash table */
-static void
-add_backend (CalFactory *factory, GnomeVFSURI *uri, CalBackend *backend)
-{
- CalFactoryPrivate *priv;
-
- priv = factory->priv;
-
- gnome_vfs_uri_ref (uri);
- g_hash_table_insert (priv->backends, uri, backend);
-
- gtk_signal_connect (GTK_OBJECT (backend), "last_client_gone",
- GTK_SIGNAL_FUNC (backend_last_client_gone_cb),
- factory);
-}
-
-/* Tries to launch a backend for the method of the specified URI. If there is
- * no such method registered in the factory, it sends the listener the
- * MethodNotSupported error code.
- */
-static CalBackend *
-launch_backend_for_uri (CalFactory *factory, GnomeVFSURI *uri, Evolution_Calendar_Listener listener)
-{
- CalFactoryPrivate *priv;
- char *method;
- GtkType *type;
- CalBackend *backend;
-
- priv = factory->priv;
-
- /* FIXME: add an accessor function to gnome-vfs */
- method = uri->method_string;
-
- type = g_hash_table_lookup (priv->methods, method);
-
- if (!type) {
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Listener_cal_loaded (
- listener,
- Evolution_Calendar_Listener_METHOD_NOT_SUPPORTED,
- CORBA_OBJECT_NIL,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("launch_backend_for_uri(): could not notify the listener");
-
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- backend = gtk_type_new (*type);
- if (!backend)
- g_message ("launch_backend_for_uri(): could not launch the backend");
-
- return backend;
-}
-
-/* Loads a calendar backend and puts it in the factory's backend hash table */
-static CalBackend *
-load_backend (CalFactory *factory, GnomeVFSURI *uri, Evolution_Calendar_Listener listener)
-{
- CalFactoryPrivate *priv;
- CalBackend *backend;
- CalBackendLoadStatus status;
- CORBA_Environment ev;
-
- priv = factory->priv;
-
- backend = launch_backend_for_uri (factory, uri, listener);
- if (!backend)
- return NULL;
-
- status = cal_backend_load (backend, uri);
-
- switch (status) {
- case CAL_BACKEND_LOAD_SUCCESS:
- add_backend (factory, uri, backend);
- return backend;
-
- case CAL_BACKEND_LOAD_ERROR:
- gtk_object_unref (GTK_OBJECT (backend));
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Listener_cal_loaded (listener,
- Evolution_Calendar_Listener_ERROR,
- CORBA_OBJECT_NIL,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("load_backend(): could not notify the listener");
-
- CORBA_exception_free (&ev);
- return NULL;
-
- default:
- g_assert_not_reached ();
- return NULL;
- }
-}
-
-/* Creates a calendar backend and puts it in the factory's backend hash table */
-static CalBackend *
-create_backend (CalFactory *factory, GnomeVFSURI *uri, Evolution_Calendar_Listener listener)
-{
- CalFactoryPrivate *priv;
- CalBackend *backend;
-
- priv = factory->priv;
-
- backend = launch_backend_for_uri (factory, uri, listener);
- if (!backend)
- return NULL;
-
- cal_backend_create (backend, uri);
-
- /* FIXME: add error reporting to cal_backend_create() */
-#if 0
- {
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Listener_cal_loaded (listener,
- Evolution_Calendar_Listener_ERROR,
- CORBA_OBJECT_NIL,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("create_fn(): could not notify the listener");
-
- CORBA_exception_free (&ev);
- }
-#endif
-
- add_backend (factory, uri, backend);
-
- return backend;
-}
-
-/* Adds a listener to a calendar backend by creating a calendar client interface
- * object.
- */
-static void
-add_calendar_client (CalFactory *factory, CalBackend *backend, Evolution_Calendar_Listener listener)
-{
- Cal *cal;
- CORBA_Environment ev;
-
- cal = cal_new (backend, listener);
- if (!cal) {
- g_message ("add_calendar_client(): could not create the calendar client interface");
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Listener_cal_loaded (listener,
- Evolution_Calendar_Listener_ERROR,
- CORBA_OBJECT_NIL,
- &ev);
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("add_calendar_client(): could not notify the listener");
-
- CORBA_exception_free (&ev);
- return;
- }
-
- cal_backend_add_cal (backend, cal);
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Listener_cal_loaded (listener,
- Evolution_Calendar_Listener_SUCCESS,
- bonobo_object_corba_objref (BONOBO_OBJECT (cal)),
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("add_calendar_client(): could not notify the listener");
- bonobo_object_unref (BONOBO_OBJECT (cal));
- }
-
- CORBA_exception_free (&ev);
-}
-
-/* Job handler for the load calendar command */
-static void
-load_fn (gpointer data)
-{
- LoadCreateJobData *jd;
- CalFactory *factory;
- GnomeVFSURI *uri;
- Evolution_Calendar_Listener listener;
- CalBackend *backend;
- CORBA_Environment ev;
-
- jd = data;
- g_assert (jd->uri != NULL);
-
- /* Check the URI */
-
- uri = gnome_vfs_uri_new (jd->uri);
- g_free (jd->uri);
-
- factory = jd->factory;
- listener = jd->listener;
- g_free (jd);
-
- if (!uri) {
- CORBA_exception_init (&ev);
- Evolution_Calendar_Listener_cal_loaded (listener,
- Evolution_Calendar_Listener_ERROR,
- CORBA_OBJECT_NIL,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("load_fn(): Could not notify the listener!");
-
- CORBA_exception_free (&ev);
- goto out;
- }
-
- /* Look up the backend and create it if needed */
-
- backend = lookup_backend (factory, uri);
-
- if (!backend)
- backend = load_backend (factory, uri, listener);
-
- gnome_vfs_uri_unref (uri);
-
- if (backend)
- add_calendar_client (factory, backend, listener);
-
- out:
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("load_fn(): could not release the listener");
-
- CORBA_exception_free (&ev);
-}
-
-/* Job handler for the create calendar command */
-static void
-create_fn (gpointer data)
-{
- LoadCreateJobData *jd;
- CalFactory *factory;
- GnomeVFSURI *uri;
- Evolution_Calendar_Listener listener;
- CalBackend *backend;
- CORBA_Environment ev;
-
- jd = data;
- g_assert (jd->uri != NULL);
-
- /* Check the URI */
-
- uri = gnome_vfs_uri_new (jd->uri);
- g_free (jd->uri);
-
- factory = jd->factory;
- listener = jd->listener;
- g_free (jd);
-
- if (!uri) {
- CORBA_exception_init (&ev);
- Evolution_Calendar_Listener_cal_loaded (listener,
- Evolution_Calendar_Listener_ERROR,
- CORBA_OBJECT_NIL,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("create_fn(): Could not notify the listener!");
-
- CORBA_exception_free (&ev);
- goto out;
- }
-
- /* Check that the backend is not in use */
-
- backend = lookup_backend (factory, uri);
-
- if (backend) {
- CORBA_exception_init (&ev);
- Evolution_Calendar_Listener_cal_loaded (listener,
- Evolution_Calendar_Listener_IN_USE,
- CORBA_OBJECT_NIL,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("create_fn(): could not notify the listener");
-
- CORBA_exception_free (&ev);
- goto out;
- }
-
- /* Create the backend */
-
- backend = create_backend (factory, uri, listener);
-
- if (backend)
- add_calendar_client (factory, backend, listener);
-
- gnome_vfs_uri_unref (uri);
-
- out:
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (listener, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("create_fn(): could not release the listener");
-
- CORBA_exception_free (&ev);
-}
-
-
-
-/* CORBA servant implementation */
-
-/* CalFactory::load method */
-static void
-CalFactory_load (PortableServer_Servant servant,
- const CORBA_char *uri,
- Evolution_Calendar_Listener listener,
- CORBA_Environment *ev)
-{
- CalFactory *factory;
- CalFactoryPrivate *priv;
- CORBA_Environment ev2;
- gboolean result;
-
- factory = CAL_FACTORY (bonobo_object_from_servant (servant));
- priv = factory->priv;
-
- CORBA_exception_init (&ev2);
- result = CORBA_Object_is_nil (listener, &ev2);
-
- if (ev2._major != CORBA_NO_EXCEPTION || result) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_Calendar_CalFactory_NilListener,
- NULL);
-
- CORBA_exception_free (&ev2);
- return;
- }
- CORBA_exception_free (&ev2);
-
- queue_load_create_job (factory, uri, listener, load_fn);
-}
-
-/* CalFactory::create method */
-static void
-CalFactory_create (PortableServer_Servant servant,
- const CORBA_char *uri,
- Evolution_Calendar_Listener listener,
- CORBA_Environment *ev)
-{
- CalFactory *factory;
- CalFactoryPrivate *priv;
-
- factory = CAL_FACTORY (bonobo_object_from_servant (servant));
- priv = factory->priv;
-
- queue_load_create_job (factory, uri, listener, create_fn);
-}
-
-/**
- * cal_factory_get_epv:
- * @void:
- *
- * Creates an EPV for the CalFactory CORBA class.
- *
- * Return value: A newly-allocated EPV.
- **/
-POA_Evolution_Calendar_CalFactory__epv *
-cal_factory_get_epv (void)
-{
- POA_Evolution_Calendar_CalFactory__epv *epv;
-
- epv = g_new0 (POA_Evolution_Calendar_CalFactory__epv, 1);
- epv->load = CalFactory_load;
- epv->create = CalFactory_create;
-
- return epv;
-}
-
-
-
-/**
- * cal_factory_construct:
- * @factory: A calendar factory.
- * @corba_factory: CORBA object for the calendar factory.
- *
- * Constructs a calendar factory by binding the corresponding CORBA object to
- * it.
- *
- * Return value: The same object as the @factory argument.
- **/
-CalFactory *
-cal_factory_construct (CalFactory *factory, Evolution_Calendar_CalFactory corba_factory)
-{
- g_return_val_if_fail (factory != NULL, NULL);
- g_return_val_if_fail (IS_CAL_FACTORY (factory), NULL);
-
- bonobo_object_construct (BONOBO_OBJECT (factory), corba_factory);
- return factory;
-}
-
-/**
- * cal_factory_corba_object_create:
- * @object: #BonoboObject that will wrap the CORBA object.
- *
- * Creates and activates the CORBA object that is wrapped by the specified
- * calendar factory @object.
- *
- * Return value: An activated object reference or #CORBA_OBJECT_NIL in case of
- * failure.
- **/
-Evolution_Calendar_CalFactory
-cal_factory_corba_object_create (BonoboObject *object)
-{
- POA_Evolution_Calendar_CalFactory *servant;
- CORBA_Environment ev;
-
- g_return_val_if_fail (object != NULL, CORBA_OBJECT_NIL);
- g_return_val_if_fail (IS_CAL_FACTORY (object), CORBA_OBJECT_NIL);
-
- servant = (POA_Evolution_Calendar_CalFactory *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &cal_factory_vepv;
-
- CORBA_exception_init (&ev);
- POA_Evolution_Calendar_CalFactory__init ((PortableServer_Servant) servant, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_factory_corba_object_create(): could not init the servant");
- g_free (servant);
- CORBA_exception_free (&ev);
- return CORBA_OBJECT_NIL;
- }
-
- CORBA_exception_free (&ev);
- return (Evolution_Calendar_CalFactory) bonobo_object_activate_servant (object, servant);
-}
-
-/**
- * cal_factory_new:
- * @void:
- *
- * Creates a new #CalFactory object.
- *
- * Return value: A newly-created #CalFactory, or NULL if its corresponding CORBA
- * object could not be created.
- **/
-CalFactory *
-cal_factory_new (void)
-{
- CalFactory *factory;
- CORBA_Environment ev;
- Evolution_Calendar_CalFactory corba_factory;
- gboolean retval;
-
- factory = gtk_type_new (CAL_FACTORY_TYPE);
-
- corba_factory = cal_factory_corba_object_create (BONOBO_OBJECT (factory));
-
- CORBA_exception_init (&ev);
- retval = CORBA_Object_is_nil (corba_factory, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION || retval) {
- g_message ("cal_factory_new(): could not create the CORBA factory");
- bonobo_object_unref (BONOBO_OBJECT (factory));
- CORBA_exception_free (&ev);
- return NULL;
- }
- CORBA_exception_free (&ev);
-
- return cal_factory_construct (factory, corba_factory);
-}
-
-/* Returns the lowercase version of a string */
-static char *
-str_tolower (const char *s)
-{
- char *str;
- char *p;
-
- str = g_strdup (s);
- for (p = str; *p; p++)
- if (isalpha (*p))
- *p = tolower (*p);
-
- return str;
-}
-
-/**
- * cal_factory_register_method:
- * @factory: A calendar factory.
- * @method: Method for the URI, i.e. "http", "file", etc.
- * @backend_type: Class type of the backend to create for this @method.
- *
- * Registers the type of a #CalBackend subclass that will be used to handle URIs
- * with a particular method. When the factory is asked to load a particular
- * URI, it will look in its list of registered methods and create a backend of
- * the appropriate type.
- **/
-void
-cal_factory_register_method (CalFactory *factory, const char *method, GtkType backend_type)
-{
- CalFactoryPrivate *priv;
- GtkType *type;
- char *method_str;
-
- g_return_if_fail (factory != NULL);
- g_return_if_fail (IS_CAL_FACTORY (factory));
- g_return_if_fail (method != NULL);
- g_return_if_fail (backend_type != 0);
- g_return_if_fail (gtk_type_is_a (backend_type, CAL_BACKEND_TYPE));
-
- priv = factory->priv;
-
- method_str = str_tolower (method);
-
- type = g_hash_table_lookup (priv->methods, method_str);
- if (type) {
- g_message ("cal_factory_register_method(): Method `%s' already registered!",
- method_str);
- g_free (method_str);
- return;
- }
-
- type = g_new (GtkType, 1);
- *type = backend_type;
-
- g_hash_table_insert (priv->methods, method_str, type);
-}
-
-/**
- * cal_factory_get_n_backends:
- * @factory: A calendar factory.
- *
- * Queries the number of running calendar backends in a calendar factory.
- *
- * Return value: Number of running backends.
- **/
-int
-cal_factory_get_n_backends (CalFactory *factory)
-{
- CalFactoryPrivate *priv;
-
- g_return_val_if_fail (factory != NULL, -1);
- g_return_val_if_fail (IS_CAL_FACTORY (factory), -1);
-
- priv = factory->priv;
- return g_hash_table_size (priv->backends);
-}
diff --git a/calendar/pcs/cal-factory.h b/calendar/pcs/cal-factory.h
deleted file mode 100644
index f96ba4ba92..0000000000
--- a/calendar/pcs/cal-factory.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Evolution calendar factory
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 CAL_FACTORY_H
-#define CAL_FACTORY_H
-
-#include <libgnome/gnome-defs.h>
-#include <bonobo/bonobo-object.h>
-
-#include "calendar/pcs/evolution-calendar.h"
-
-BEGIN_GNOME_DECLS
-
-
-
-#define CAL_FACTORY_TYPE (cal_factory_get_type ())
-#define CAL_FACTORY(obj) (GTK_CHECK_CAST ((obj), CAL_FACTORY_TYPE, CalFactory))
-#define CAL_FACTORY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_FACTORY_TYPE, \
- CalFactoryClass))
-#define IS_CAL_FACTORY(obj) (GTK_CHECK_TYPE ((obj), CAL_FACTORY_TYPE))
-#define IS_CAL_FACTORY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_FACTORY_TYPE))
-
-typedef struct _CalFactory CalFactory;
-typedef struct _CalFactoryClass CalFactoryClass;
-
-struct _CalFactory {
- BonoboObject object;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _CalFactoryClass {
- BonoboObjectClass parent_class;
-
- /* Notification signals */
- void (* last_calendar_gone) (CalFactory *factory);
-};
-
-GtkType cal_factory_get_type (void);
-
-CalFactory *cal_factory_construct (CalFactory *factory, Evolution_Calendar_CalFactory corba_factory);
-Evolution_Calendar_CalFactory cal_factory_corba_object_create (BonoboObject *object);
-
-CalFactory *cal_factory_new (void);
-
-void cal_factory_register_method (CalFactory *factory, const char *method, GtkType backend_type);
-
-int cal_factory_get_n_backends (CalFactory *factory);
-
-POA_Evolution_Calendar_CalFactory__epv *cal_factory_get_epv (void);
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/pcs/cal.c b/calendar/pcs/cal.c
deleted file mode 100644
index fdb7682e7c..0000000000
--- a/calendar/pcs/cal.c
+++ /dev/null
@@ -1,761 +0,0 @@
-/* Evolution calendar client interface object
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include "cal.h"
-#include "cal-backend.h"
-
-
-
-/* Private part of the Cal structure */
-typedef struct {
- /* Our backend */
- CalBackend *backend;
-
- /* Listener on the client we notify */
- Evolution_Calendar_Listener listener;
-} CalPrivate;
-
-
-
-static void cal_class_init (CalClass *class);
-static void cal_init (Cal *cal);
-static void cal_destroy (GtkObject *object);
-
-static POA_Evolution_Calendar_Cal__vepv cal_vepv;
-
-static BonoboObjectClass *parent_class;
-
-
-
-/**
- * cal_get_type:
- * @void:
- *
- * Registers the #Cal class if necessary, and returns the type ID associated to
- * it.
- *
- * Return value: The type ID of the #Cal class.
- **/
-GtkType
-cal_get_type (void)
-{
- static GtkType cal_type = 0;
-
- if (!cal_type) {
- static const GtkTypeInfo cal_info = {
- "Cal",
- sizeof (Cal),
- sizeof (CalClass),
- (GtkClassInitFunc) cal_class_init,
- (GtkObjectInitFunc) cal_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- cal_type = gtk_type_unique (BONOBO_OBJECT_TYPE, &cal_info);
- }
-
- return cal_type;
-}
-
-/* CORBA class initialzation function for the calendar */
-static void
-init_cal_corba_class (void)
-{
- cal_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
- cal_vepv.Evolution_Calendar_Cal_epv = cal_get_epv ();
-}
-
-/* Class initialization function for the calendar */
-static void
-cal_class_init (CalClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- parent_class = gtk_type_class (BONOBO_OBJECT_TYPE);
-
- object_class->destroy = cal_destroy;
-
- init_cal_corba_class ();
-}
-
-/* Object initialization function for the calendar */
-static void
-cal_init (Cal *cal)
-{
- CalPrivate *priv;
-
- priv = g_new0 (CalPrivate, 1);
- cal->priv = priv;
-
- priv->listener = CORBA_OBJECT_NIL;
-}
-
-/* Destroy handler for the calendar */
-static void
-cal_destroy (GtkObject *object)
-{
- Cal *cal;
- CalPrivate *priv;
- CORBA_Environment ev;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CAL (object));
-
- cal = CAL (object);
- priv = cal->priv;
-
- priv->backend = NULL;
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (priv->listener, &ev);
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("cal_destroy(): could not release the listener");
-
- CORBA_exception_free (&ev);
-
- g_free (priv);
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-
-/* CORBA servant implementation */
-
-/* Cal::get_uri method */
-static CORBA_char *
-Cal_get_uri (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- Cal *cal;
- CalPrivate *priv;
- GnomeVFSURI *uri;
- char *str_uri;
- CORBA_char *str_uri_copy;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- uri = cal_backend_get_uri (priv->backend);
- str_uri = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
- str_uri_copy = CORBA_string_dup (str_uri);
- g_free (str_uri);
-
- return str_uri_copy;
-}
-
-/* Converts a calendar object type from its CORBA representation to our own
- * representation.
- */
-static CalObjType
-uncorba_obj_type (Evolution_Calendar_CalObjType type)
-{
- return (((type & Evolution_Calendar_TYPE_EVENT) ? CALOBJ_TYPE_EVENT : 0)
- | ((type & Evolution_Calendar_TYPE_TODO) ? CALOBJ_TYPE_TODO : 0)
- | ((type & Evolution_Calendar_TYPE_JOURNAL) ? CALOBJ_TYPE_JOURNAL : 0));
-}
-
-/* Cal::get_n_objects method */
-static CORBA_long
-Cal_get_n_objects (PortableServer_Servant servant,
- Evolution_Calendar_CalObjType type,
- CORBA_Environment *ev)
-{
- Cal *cal;
- CalPrivate *priv;
- int t;
- int n;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- t = uncorba_obj_type (type);
- n = cal_backend_get_n_objects (priv->backend, t);
- return n;
-}
-
-/* Cal::get_object method */
-static Evolution_Calendar_CalObj
-Cal_get_object (PortableServer_Servant servant,
- const Evolution_Calendar_CalObjUID uid,
- CORBA_Environment *ev)
-{
- Cal *cal;
- CalPrivate *priv;
- char *calobj;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- calobj = cal_backend_get_object (priv->backend, uid);
-
- if (calobj) {
- CORBA_char *calobj_copy;
-
- calobj_copy = CORBA_string_dup (calobj);
- g_free (calobj);
- return calobj_copy;
- } else {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_Calendar_Cal_NotFound,
- NULL);
- return NULL;
- }
-}
-
-static Evolution_Calendar_CalObjUIDSeq *
-build_uid_seq (GList *uids)
-{
- Evolution_Calendar_CalObjUIDSeq *seq;
- GList *l;
- int n, i;
-
- n = g_list_length (uids);
-
- seq = Evolution_Calendar_CalObjUIDSeq__alloc ();
- CORBA_sequence_set_release (seq, TRUE);
- seq->_length = n;
- seq->_buffer = CORBA_sequence_Evolution_Calendar_CalObjUID_allocbuf (n);
-
- /* Fill the sequence */
-
- for (i = 0, l = uids; l; i++, l = l->next) {
- char *uid;
-
- uid = l->data;
- seq->_buffer[i] = CORBA_string_dup (uid);
- }
-
- return seq;
-}
-
-/* Cal::get_uids method */
-static Evolution_Calendar_CalObjUIDSeq *
-Cal_get_uids (PortableServer_Servant servant,
- Evolution_Calendar_CalObjType type,
- CORBA_Environment *ev)
-{
- Cal *cal;
- CalPrivate *priv;
- GList *uids;
- Evolution_Calendar_CalObjUIDSeq *seq;
- int t;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- t = uncorba_obj_type (type);
-
- uids = cal_backend_get_uids (priv->backend, t);
- seq = build_uid_seq (uids);
-
- cal_obj_uid_list_free (uids);
-
- return seq;
-}
-
-/* Cal::get_objects_in_range method */
-static Evolution_Calendar_CalObjUIDSeq *
-Cal_get_objects_in_range (PortableServer_Servant servant,
- Evolution_Calendar_CalObjType type,
- Evolution_Calendar_Time_t start,
- Evolution_Calendar_Time_t end,
- CORBA_Environment *ev)
-{
- Cal *cal;
- CalPrivate *priv;
- int t;
- time_t t_start, t_end;
- Evolution_Calendar_CalObjUIDSeq *seq;
- GList *uids;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- t = uncorba_obj_type (type);
- t_start = (time_t) start;
- t_end = (time_t) end;
-
- if (t_start > t_end || t_start == -1 || t_end == -1) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_Calendar_Cal_InvalidRange,
- NULL);
- return NULL;
- }
-
- uids = cal_backend_get_objects_in_range (priv->backend, t, t_start, t_end);
- seq = build_uid_seq (uids);
-
- cal_obj_uid_list_free (uids);
-
- return seq;
-}
-
-#if 0
-/* Translates an enum AlarmType to its CORBA representation */
-static Evolution_Calendar_AlarmType
-corba_alarm_type (enum AlarmType type)
-{
- switch (type) {
- case ALARM_MAIL:
- return Evolution_Calendar_MAIL;
-
- case ALARM_PROGRAM:
- return Evolution_Calendar_PROGRAM;
-
- case ALARM_DISPLAY:
- return Evolution_Calendar_DISPLAY;
-
- case ALARM_AUDIO:
- return Evolution_Calendar_AUDIO;
-
- default:
- g_assert_not_reached ();
- return Evolution_Calendar_DISPLAY;
- }
-}
-#endif
-
-/* Builds a CORBA sequence of alarm instances from a CalAlarmInstance list. */
-static Evolution_Calendar_CalAlarmInstanceSeq *
-build_alarm_instance_seq (GList *alarms)
-{
- GList *l;
- int n, i;
- Evolution_Calendar_CalAlarmInstanceSeq *seq;
-
- n = g_list_length (alarms);
-
- seq = Evolution_Calendar_CalAlarmInstanceSeq__alloc ();
- CORBA_sequence_set_release (seq, TRUE);
- seq->_length = n;
- seq->_buffer = CORBA_sequence_Evolution_Calendar_CalAlarmInstance_allocbuf (n);
-
- /* Fill the sequence */
-
- for (i = 0, l = alarms; l; i++, l = l->next) {
- CalAlarmInstance *ai;
- Evolution_Calendar_CalAlarmInstance *corba_ai;
-
- ai = l->data;
- corba_ai = &seq->_buffer[i];
-
- corba_ai->uid = CORBA_string_dup (ai->uid);
-#if 0
- corba_ai->type = corba_alarm_type (ai->type);
-#endif
- corba_ai->trigger = ai->trigger;
- corba_ai->occur = ai->occur;
- }
-
- return seq;
-}
-
-/* Cal::get_alarms_in_range method */
-static Evolution_Calendar_CalAlarmInstanceSeq *
-Cal_get_alarms_in_range (PortableServer_Servant servant,
- Evolution_Calendar_Time_t start,
- Evolution_Calendar_Time_t end,
- CORBA_Environment *ev)
-{
- Cal *cal;
- CalPrivate *priv;
- time_t t_start, t_end;
- Evolution_Calendar_CalAlarmInstanceSeq *seq;
- GList *alarms;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- t_start = (time_t) start;
- t_end = (time_t) end;
-
- if (t_start > t_end || t_start == -1 || t_end == -1) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_Calendar_Cal_InvalidRange,
- NULL);
- return NULL;
- }
-
- /* Figure out the list and allocate the sequence */
-
- alarms = cal_backend_get_alarms_in_range (priv->backend, t_start, t_end);
- seq = build_alarm_instance_seq (alarms);
- cal_alarm_instance_list_free (alarms);
-
- return seq;
-}
-
-/* Cal::get_alarms_for_object method */
-static Evolution_Calendar_CalAlarmInstanceSeq *
-Cal_get_alarms_for_object (PortableServer_Servant servant,
- const Evolution_Calendar_CalObjUID uid,
- Evolution_Calendar_Time_t start,
- Evolution_Calendar_Time_t end,
- CORBA_Environment *ev)
-{
- Cal *cal;
- CalPrivate *priv;
- time_t t_start, t_end;
- Evolution_Calendar_CalAlarmInstanceSeq *seq;
- GList *alarms;
- gboolean result;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- t_start = (time_t) start;
- t_end = (time_t) end;
-
- if (t_start > t_end || t_start == -1 || t_end == -1) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_Calendar_Cal_InvalidRange,
- NULL);
- return NULL;
- }
-
- result = cal_backend_get_alarms_for_object (priv->backend, uid, t_start, t_end, &alarms);
- if (!result) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_Calendar_Cal_NotFound,
- NULL);
- return NULL;
- }
-
- seq = build_alarm_instance_seq (alarms);
- cal_alarm_instance_list_free (alarms);
-
- return seq;
-}
-
-/* Cal::update_object method */
-static void
-Cal_update_object (PortableServer_Servant servant,
- const Evolution_Calendar_CalObjUID uid,
- const Evolution_Calendar_CalObj calobj,
- CORBA_Environment *ev)
-{
- Cal *cal;
- CalPrivate *priv;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- if (!cal_backend_update_object (priv->backend, uid, calobj))
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_Calendar_Cal_InvalidObject,
- NULL);
-}
-
-/* Cal::remove_object method */
-static void
-Cal_remove_object (PortableServer_Servant servant,
- const Evolution_Calendar_CalObjUID uid,
- CORBA_Environment *ev)
-{
- Cal *cal;
- CalPrivate *priv;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- if (!cal_backend_remove_object (priv->backend, uid))
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_Calendar_Cal_NotFound,
- NULL);
-}
-
-
-
-/* Cal::get_uid_by_pilot_id method */
-static Evolution_Calendar_CalObjUID
-Cal_get_uid_by_pilot_id (PortableServer_Servant servant,
- const Evolution_Calendar_PilotID pilot_id,
- CORBA_Environment *ev)
-{
- Cal *cal;
- CalPrivate *priv;
- char *uid;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- uid = cal_backend_get_uid_by_pilot_id (priv->backend, pilot_id);
-
- if (uid) {
- CORBA_char *uid_copy;
-
- uid_copy = CORBA_string_dup (uid);
- g_free (uid);
- return uid_copy;
- } else {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_Calendar_Cal_NotFound,
- NULL);
- return NULL;
- }
-}
-
-
-/* Cal::update_pilot_id method */
-static void
-Cal_update_pilot_id (PortableServer_Servant servant,
- const Evolution_Calendar_CalObjUID uid,
- const Evolution_Calendar_PilotID pilot_id,
- const CORBA_unsigned_long pilot_status,
- CORBA_Environment * ev)
-{
- Cal *cal;
- CalPrivate *priv;
-
- cal = CAL (bonobo_object_from_servant (servant));
- priv = cal->priv;
-
- cal_backend_update_pilot_id (priv->backend, uid,
- pilot_id, pilot_status);
-}
-
-
-/**
- * cal_get_epv:
- * @void:
- *
- * Creates an EPV for the Cal CORBA class.
- *
- * Return value: A newly-allocated EPV.
- **/
-POA_Evolution_Calendar_Cal__epv *
-cal_get_epv (void)
-{
- POA_Evolution_Calendar_Cal__epv *epv;
-
- epv = g_new0 (POA_Evolution_Calendar_Cal__epv, 1);
- epv->_get_uri = Cal_get_uri;
- epv->get_n_objects = Cal_get_n_objects;
- epv->get_object = Cal_get_object;
- epv->get_uids = Cal_get_uids;
- epv->get_objects_in_range = Cal_get_objects_in_range;
- epv->get_alarms_in_range = Cal_get_alarms_in_range;
- epv->get_alarms_for_object = Cal_get_alarms_for_object;
- epv->update_object = Cal_update_object;
- epv->remove_object = Cal_remove_object;
- epv->get_uid_by_pilot_id = Cal_get_uid_by_pilot_id;
- epv->update_pilot_id = Cal_update_pilot_id;
-
- return epv;
-}
-
-
-
-/**
- * cal_construct:
- * @cal: A calendar client interface.
- * @corba_cal: CORBA object for the calendar.
- * @backend: Calendar backend that this @cal presents an interface to.
- * @listener: Calendar listener for notification.
- *
- * Constructs a calendar client interface object by binding the corresponding
- * CORBA object to it. The calendar interface is bound to the specified
- * @backend, and will notify the @listener about changes to the calendar.
- *
- * Return value: The same object as the @cal argument.
- **/
-Cal *
-cal_construct (Cal *cal,
- Evolution_Calendar_Cal corba_cal,
- CalBackend *backend,
- Evolution_Calendar_Listener listener)
-{
- CalPrivate *priv;
- CORBA_Environment ev;
-
- g_return_val_if_fail (cal != NULL, NULL);
- g_return_val_if_fail (IS_CAL (cal), NULL);
- g_return_val_if_fail (backend != NULL, NULL);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
-
- priv = cal->priv;
-
- CORBA_exception_init (&ev);
- priv->listener = CORBA_Object_duplicate (listener, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_construct: could not duplicate the listener");
- priv->listener = CORBA_OBJECT_NIL;
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- priv->backend = backend;
-
- bonobo_object_construct (BONOBO_OBJECT (cal), corba_cal);
- return cal;
-}
-
-/**
- * cal_corba_object_create:
- * @object: #BonoboObject that will wrap the CORBA object.
- *
- * Creates and activates the CORBA object that is wrapped by the specified
- * calendar client interface @object.
- *
- * Return value: An activated object reference or #CORBA_OBJECT_NIL in case of
- * failure.
- **/
-Evolution_Calendar_Cal
-cal_corba_object_create (BonoboObject *object)
-{
- POA_Evolution_Calendar_Cal *servant;
- CORBA_Environment ev;
-
- g_return_val_if_fail (object != NULL, CORBA_OBJECT_NIL);
- g_return_val_if_fail (IS_CAL (object), CORBA_OBJECT_NIL);
-
- servant = (POA_Evolution_Calendar_Cal *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &cal_vepv;
-
- CORBA_exception_init (&ev);
- POA_Evolution_Calendar_Cal__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("cal_corba_object_create(): could not init the servant");
- g_free (servant);
- CORBA_exception_free (&ev);
- return CORBA_OBJECT_NIL;
- }
-
- CORBA_exception_free (&ev);
- return (Evolution_Calendar_Cal) bonobo_object_activate_servant (object, servant);
-}
-
-/**
- * cal_new:
- * @backend: A calendar backend.
- * @listener: A calendar listener.
- *
- * Creates a new calendar client interface object and binds it to the specified
- * @backend and @listener objects.
- *
- * Return value: A newly-created #Cal calendar client interface object, or NULL
- * if its corresponding CORBA object could not be created.
- **/
-Cal *
-cal_new (CalBackend *backend, Evolution_Calendar_Listener listener)
-{
- Cal *cal, *retval;
- Evolution_Calendar_Cal corba_cal;
- CORBA_Environment ev;
- gboolean ret;
-
- g_return_val_if_fail (backend != NULL, NULL);
- g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
-
- cal = CAL (gtk_type_new (CAL_TYPE));
- corba_cal = cal_corba_object_create (BONOBO_OBJECT (cal));
-
- CORBA_exception_init (&ev);
- ret = CORBA_Object_is_nil ((CORBA_Object) corba_cal, &ev);
- if (ev._major != CORBA_NO_EXCEPTION || ret) {
- g_message ("cal_new(): could not create the CORBA object");
- bonobo_object_unref (BONOBO_OBJECT (cal));
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- retval = cal_construct (cal, corba_cal, backend, listener);
- if (!retval) {
- g_message ("cal_new(): could not construct the calendar client interface");
- bonobo_object_unref (BONOBO_OBJECT (cal));
- return NULL;
- }
-
- return retval;
-}
-
-/**
- * cal_notify_update:
- * @cal: A calendar client interface.
- * @uid: UID of object that was updated.
- *
- * Notifies a listener attached to a calendar client interface object about an
- * update to a calendar object.
- **/
-void
-cal_notify_update (Cal *cal, const char *uid)
-{
- CalPrivate *priv;
- CORBA_Environment ev;
-
- g_return_if_fail (cal != NULL);
- g_return_if_fail (IS_CAL (cal));
- g_return_if_fail (uid != NULL);
-
- priv = cal->priv;
- g_return_if_fail (priv->listener != CORBA_OBJECT_NIL);
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Listener_obj_updated (priv->listener, (char *) uid, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("cal_notify_update(): could not notify the listener "
- "about an updated object");
-
- CORBA_exception_free (&ev);
-}
-
-/**
- * cal_notify_remove:
- * @cal: A calendar client interface.
- * @uid: UID of object that was removed.
- *
- * Notifies a listener attached to a calendar client interface object about a
- * calendar object that was removed.
- **/
-void
-cal_notify_remove (Cal *cal, const char *uid)
-{
- CalPrivate *priv;
- CORBA_Environment ev;
-
- g_return_if_fail (cal != NULL);
- g_return_if_fail (IS_CAL (cal));
- g_return_if_fail (uid != NULL);
-
- priv = cal->priv;
- g_return_if_fail (priv->listener != CORBA_OBJECT_NIL);
-
- CORBA_exception_init (&ev);
- Evolution_Calendar_Listener_obj_removed (priv->listener, (char *) uid, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- g_message ("cal_notify_remove(): could not notify the listener "
- "about a removed object");
-
- CORBA_exception_free (&ev);
-}
diff --git a/calendar/pcs/cal.h b/calendar/pcs/cal.h
deleted file mode 100644
index a11cedebbb..0000000000
--- a/calendar/pcs/cal.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Evolution calendar client interface object
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 CAL_H
-#define CAL_H
-
-#include <libgnome/gnome-defs.h>
-#include <bonobo/bonobo-object.h>
-#include "calendar/pcs/evolution-calendar.h"
-#include "cal-common.h"
-
-BEGIN_GNOME_DECLS
-
-
-
-#define CAL_TYPE (cal_get_type ())
-#define CAL(obj) (GTK_CHECK_CAST ((obj), CAL_TYPE, Cal))
-#define CAL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_TYPE, CalClass))
-#define IS_CAL(obj) (GTK_CHECK_TYPE ((obj), CAL_TYPE))
-#define IS_CAL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_TYPE))
-
-struct _Cal {
- BonoboObject object;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _CalClass {
- BonoboObjectClass parent_class;
-};
-
-GtkType cal_get_type (void);
-
-Cal *cal_construct (Cal *cal,
- Evolution_Calendar_Cal corba_cal,
- CalBackend *backend,
- Evolution_Calendar_Listener listener);
-Evolution_Calendar_Cal cal_corba_object_create (BonoboObject *object);
-
-Cal *cal_new (CalBackend *backend, Evolution_Calendar_Listener listener);
-
-void cal_notify_update (Cal *cal, const char *uid);
-void cal_notify_remove (Cal *cal, const char *uid);
-
-POA_Evolution_Calendar_Cal__epv *cal_get_epv (void);
-
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/calendar/pcs/job.c b/calendar/pcs/job.c
deleted file mode 100644
index d97df6d883..0000000000
--- a/calendar/pcs/job.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* GNOME personal calendar server - job manager
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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.
- */
-
-#include <config.h>
-#include "job.h"
-
-
-
-/* The job list */
-
-typedef struct {
- JobFunc func;
- gpointer data;
-} Job;
-
-static GSList *jobs_head;
-static GSList *jobs_tail;
-
-static guint jobs_idle_id;
-
-
-
-/* Runs a job and dequeues it */
-static gboolean
-run_job (gpointer data)
-{
- Job *job;
- GSList *l;
-
- g_assert (jobs_head != NULL);
-
- job = jobs_head->data;
- (* job->func) (job->data);
- g_free (job);
-
- l = jobs_head;
- jobs_head = g_slist_remove_link (jobs_head, jobs_head);
- g_slist_free_1 (l);
-
- if (!jobs_head) {
- jobs_tail = NULL;
- jobs_idle_id = 0;
- return FALSE;
- } else
- return TRUE;
-}
-
-/**
- * job_add:
- * @func: Function to run the job.
- * @data: Data to pass to @function.
- *
- * Adds a job to the queue. The job will automatically be run asynchronously.
- **/
-void
-job_add (JobFunc func, gpointer data)
-{
- Job *job;
-
- g_return_if_fail (func != NULL);
-
- job = g_new (Job, 1);
- job->func = func;
- job->data = data;
-
- if (!jobs_head) {
- g_assert (jobs_tail == NULL);
- g_assert (jobs_idle_id == 0);
-
- jobs_head = g_slist_append (NULL, job);
- jobs_tail = jobs_head;
-
- jobs_idle_id = g_idle_add (run_job, NULL);
- } else {
- g_assert (jobs_tail != NULL);
- g_assert (jobs_idle_id != 0);
-
- jobs_tail = g_slist_append (jobs_tail, job)->next;
- }
-}
diff --git a/calendar/pcs/job.h b/calendar/pcs/job.h
deleted file mode 100644
index c9bce24dd4..0000000000
--- a/calendar/pcs/job.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* GNOME personal calendar server - job manager
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@helixcode.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 JOB_H
-#define JOB_H
-
-#include <glib.h>
-
-
-
-typedef void (* JobFunc) (gpointer data);
-
-void job_add (JobFunc func, gpointer data);
-
-
-
-#endif
diff --git a/camel/.cvsignore b/camel/.cvsignore
deleted file mode 100644
index 521f6065df..0000000000
--- a/camel/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-.deps
-*.lo
-*.la
-temp-test
diff --git a/camel/CODING.STYLE b/camel/CODING.STYLE
deleted file mode 100644
index 58e9c68bbe..0000000000
--- a/camel/CODING.STYLE
+++ /dev/null
@@ -1,19 +0,0 @@
-Note to hackers
----------------
-
-When hacking on camel (and on the gnome mailer in general),
-be sure to follow the same coding style as the initial authors.
-Please read the file HACKING in gnumeric and follow the
-general guidelines explained in it.
-
-Please take a look at camel source files and try to exactly
-imitate the coding style. We are perfectly aware that this
-is not the best and unique style, but it is absolutely
-mandatory that Camel is homogeneous. If you find the current
-coding style to have some weaknesses, please contact the
-authors to discuss this matter.
-
-Thanks.
-
- Bertrand.
-
diff --git a/camel/ChangeLog b/camel/ChangeLog
deleted file mode 100644
index 48d8dbf1c0..0000000000
--- a/camel/ChangeLog
+++ /dev/null
@@ -1,5332 +0,0 @@
-2000-08-21 JP Rosevear <jpr@helixcode.com>
-
- * providers/nntp/camel-nntp-folder.c (nntp_folder_get_subfolder_names):
- Make sure newsrc is not null
- (nntp_folder_get_subfolder_names): ditto
-
- * providers/nntp/camel-nntp-newsrc.c
- (camel_nntp_newsrc_get_subscribed_group_names): Programming check
- for newsrc == NULL
- (camel_nntp_newsrc_get_all_group_names): ditto
- (camel_nntp_newsrc_write_to_file): ditto
- (camel_nntp_newsrc_write): ditto
-
-2000-08-21 JP Rosevear <jpr@helixcode.com>
-
- * providers/nntp/camel-nntp-store.c (camel_nntp_command):
- Make sure respbuffer is not null before manipulating it.
- If it is null, return CAMEL_NNTP_FAIL and a decent error
- message.
-
-2000-08-18 Peter Williams <peterw@helixcode.com>
-
- * camel-internet-address.c (internet_encode): If the name is "" we
- weren't outputting anything; output the address at least.
-
-2000-08-16 Peter Williams <peterw@helixcode.com>
-
- * camel-internet-address.c (internet_encode): Fix a leak when
- name = "". It's a single-byte leak, but it's the little things
- that count.
-
- * camel-object.c (camel_type_lock_up): Don't leave the type
- system locked when a bad unlock happens.
-
- * providers/mbox/camel-mbox-store.c (get_folder): Fix a leak.
-
-2000-08-15 Peter Williams <peterw@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_copy_message_to): Typo fix.
-
-2000-08-14 Peter Williams <peterw@helixcode.com>
-
- * camel-folder-search.c (search_get_sent_date): New search function;
- returns the time_t when the message was sent.
- (search_get_receive_date): Same for when it was received.
- (search_get_current_date): Gets the current time for use with the
- above two. Is this in the right place?
-
- * camel-folder-search.h: Add the new functions above to the class.
-
-2000-08-13 Dan Winship <danw@helixcode.com>
-
- * providers/nntp/Makefile.am (libcamelnntpinclude_HEADERS): Add
- camel-nntp-utils.h
-
- * providers/imap/camel-imap-folder.c
- (imap_get_subfolder_names_internal): do a strcasecmp rather than
- just a strcmp when checking if a folder is "INBOX", since it is
- a case-insensitive name.
-
-2000-08-12 Dan Winship <danw@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_summary_internal):
- Don't assume the FETCH results will come back in the order they
- were requested.
- (imap_get_subfolder_names_internal): Add "INBOX" to the list as
- g_malloc'ed memory, not a static string.
-
-2000-08-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c
- (camel_imap_command_continuation): Now takes a char * parameter
- rather than a stream
- (camel_imap_command_continuation_with_stream): Same function as
- above but takes a stream parameter instead
-
- * providers/imap/camel-imap-folder.c (imap_append_message): Use
- camel_imap_command_continuation_with_stream
-
-2000-08-12 Dan Winship <danw@helixcode.com>
-
- * providers/pop3/camel-pop3-store.c (pop3_try_authenticate): New
- function to do one round of attempted authentication.
- (pop3_connect): Move a bunch of code out into
- pop3_try_authenticate and fix some bugs in the edge cases.
-
-2000-08-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (query_auth_types): No longer
- calls try_connect() to get authtypes
-
-2000-08-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c
- (camel_imap_command_continuation): Changed param order a bit and
- fixed some logic
-
- * providers/imap/camel-imap-folder.c (imap_append_message): Use
- the new multi-transactional convenience functions
-
-2000-08-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c
- (camel_imap_command_preliminary): New convenience function for
- multi-transactional commands (opening request)
- (camel_imap_command_continuation): New convenience function for
- multi-transactional commands (followup data)
-
-2000-08-11 Christopher James Lahey <clahey@helixcode.com>
-
- * providers/mh/camel-mh-folder.c: Fixed a warning.
-
-2000-08-11 Chris Toshok <toshok@helixcode.com>
-
- * providers/nntp/camel-nntp-folder.c
- (camel_nntp_folder_class_init): remove get_name and get_full_name
- assignments, since the camel-folder.c implementation does what we
- need.
-
-2000-08-11 Chris Toshok <toshok@helixcode.com>
-
- * providers/nntp/camel-nntp-store.c
- (camel_nntp_store_get_toplevel_dir): use g_get_home_dir, since
- evolution_dir isn't available in the providers.
-
-2000-08-11 Peter Williams <peterw@helixcode.com>
-
- * camel-folder.c (thaw): Fix a bug where the message_changed
- signal wasn't being emitted.
-
-2000-08-11 Not Zed <NotZed@HelixCode.com>
-
- * providers/mh/camel-mh-folder.c (mh_set_message_user_tag):
- Implement.
- (mh_get_message_user_tag): Implement.
-
- * providers/mbox/camel-mbox-folder.c (mbox_get_message_user_tag):
- (mbox_set_message_user_tag): Implement.
-
- * camel-folder.c (move_message_to): Yay so lets fix an already
- fixed fix, again.
- (copy_message_to): and here too ... update for api change to append().
- And removed another warning.
- (camel_folder_set_message_user_tag): Routine to set message tags.
- (camel_folder_get_message_user_tag): And accessor.
-
-2000-08-10 Christopher James Lahey <clahey@helixcode.com>
-
- * camel-folder-search.c, camel-folder-summary.c, camel-medium.c,
- camel-mime-filter-charset.c, camel-mime-filter.c,
- camel-mime-filter.h, camel-mime-message.c, camel-mime-parser.c,
- camel-mime-part-utils.c, camel-mime-part.c, camel-mime-utils.c,
- camel-movemail.c, camel-multipart.c, camel-object.c,
- camel-stream-mem.c, providers/mbox/camel-mbox-folder.c,
- providers/mbox/camel-mbox-summary.c,
- providers/mh/camel-mh-folder.c,
- providers/smtp/camel-smtp-transport.c: Fixed some warnings.
-
-2000-08-11 Not Zed <NotZed@HelixCode.com>
-
- * providers/vee/camel-vee-folder.c (vee_folder_build_folder): Free
- the search properly.
- (vee_folder_build): And here too.
-
-2000-08-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (camel_imap_folder_changed):
- If we go over the max number of messages, don't keep requesting
- new message summaries, just break.
-
-2000-08-11 Not Zed <NotZed@HelixCode.com>
-
- * camel-mime-parser.c (folder_scan_header): A better way to
- compress leading whitespace. The code is probably invalid anyway,
- I dont think it will work across buffer boundaries.
-
- * providers/mbox/camel-mbox-folder.c (mbox_append_message): And
- write out proper format From lines here too.
-
- * providers/mbox/camel-mbox-summary.c
- (camel_mbox_summary_build_from): New function to build a more
- compatible mbox "From " line.
- (camel_mbox_summary_sync): Write From lines in the proper format.
-
-2000-08-10 Not Zed <NotZed@HelixCode.com>
-
- * providers/mh/camel-mh-store.c (get_folder): Remove warnin g.
-
- * providers/mbox/camel-mbox-store.c (xrename): Kill some warnings
- with constification.
-
- * providers/imap/camel-imap-folder.c (imap_append_message): Fixed
- for append api change. Eek this routine seriously wastes memory.
-
- * providers/mh/camel-mh-folder.c (mh_search_free): Impelemnt.
- (mh_append_message): Fix for api change, and include user flags
- and tags in new message.
-
- * providers/vee/camel-vee-folder.c (vee_search_by_expression): Fix
- for search api change.
-
- * camel-folder.c (camel_folder_search_free): New function for
- freeing search results.
- (search_free): Changed my mind, implement a default that actually
- does something. Free as to the old interface.
- (camel_folder_append_message): Changed to accept a
- camelmessageinfo rather than flags, which just doesn't have enough
- info in it.
- (copy_message_to): Change for append_message api change.
- (move_message_to): Likewise.
-
- * providers/mbox/camel-mbox-folder.c (mbox_search_free):
- Implement.
- (mbox_append_message): Fix for api change, and also copy user
- flags/tags across to new summary.
-
- * camel-folder-search.c (search_user_tag): A search expression
- that returns the current use flag by name.
- (camel_folder_search_free_result): New function to free the result
- of a search.
-
- * camel-folder-summary.c: Bump summary version.
- (message_info_new):
- (message_info_load):
- (message_info_save):
- (camel_message_info_dup_to):
- (camel_message_info_free): Added support for arbitrary tag/value
- pairs (CamelTag's).
- (camel_tag_get):
- (camel_tag_set):
- (camel_tag_list_size):
- (camel_tag_list_free): Operations for working with CamelTags.
-
-2000-08-09 Peter Williams <peterw@helixcode.com>
-
- * camel-store.c (camel_store_get_folder): Connect beforehand, if
- necessary.
-
- * providers/imap/camel-imap-store.c (camel_imap_store_init): Default
- the dir_sep to "/" so that certain functions can safely assume that
- dir_sep is valid (at least, nonnull).
-
-2000-08-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * providers/nntp/camel-nntp-folder.c
- (nntp_folder_set_message_flags): Get rid of an unused variable.
-
- * providers/nntp/Makefile.am (INCLUDES): Fix includes so that we
- don't use installed headers anymore. [I copied this over from the
- IMAP provider, that does not seem to have this problem.]
-
-2000-08-09 Not Zed <NotZed@HelixCode.com>
-
- * camel-folder-search.c (camel_folder_search_execute_expression):
- Reorder search result in summary order if we searched with a
- summary.
-
-2000-08-08 Dan Winship <danw@helixcode.com>
-
- * camel-uid-cache.c: New code to keep an on-disk cache of what
- UIDs have been seen in a folder.
-
- * camel-provider.h: Add new flags CAMEL_PROVIDER_IS_SOURCE (mail
- can arrive in it by non-Camel means) and CAMEL_PROVIDER_IS_STORAGE
- (you can work with mail directly without needing to copy it local).
-
- * providers/*/camel-*-provider.c: Add flags as needed: imap and
- mbox are SOURCE and STORAGE. mh and nntp are just STORAGE, pop3 is
- just SOURCE.
-
- * camel-mime-message.c (process_header): Add another subject
- g_strstrip that fejj's earlier commit missed.
-
-2000-08-08 Peter Williams <peterw@helixcode.com>
-
- * camel-provider.h: Remove some GTK stuff that I missed.
-
- * providers/imap/camel-imap-store.c (imap_noop): Turn this
- back on with the new timeout interface in CamelSession.
-
- * camel-session.[ch] (camel_session_register_timeout): New
- interface for Camel to register timeouts. Basically the
- GTK timeout interface is copied. We do this because Camel isn't
- allowed to use GTK anymore.
-
-2000-08-07 Not Zed <NotZed@HelixCode.com>
-
- * providers/mh/camel-mh-folder.c (mh_append_message): Only retry
- another uid if we had a name clash, otherwise fail.
-
-2000-08-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c
- (imap_get_subfolder_names_internal): If we are trying to get a
- subfolder listing of the root folder, always make sure INBOX is
- there...
-
- * providers/imap/camel-imap-utils.c (imap_parse_list_response):
- Check for NIL as a directory separator.
-
-2000-08-07 Peter Williams <peterw@helixcode.com>
-
- * providers/nntp/Makefile.am: Reorder the INCLUDES to pull
- in the camel headers from the local source tree before
- the ones in $(includedir). This was causing compile problems
- because the installed, Gtk-based camel-object.h was included
- before the uninstall Camel-based one.
-
-2000-08-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-utils.c (imap_translate_sexp): Strip
- all \n's from the expression
-
- * string-utils.c (strip): New convenience function to strip
- occurences of a single char from a string
-
- * camel-mime-message.c (camel_mime_message_set_subject): Do a
- g_strstrip on the subject so we can stop getting those annoying
- leading spaces
-
-2000-08-07 Dan Winship <danw@helixcode.com>
-
- * camel-folder.c (camel_folder_free_deep): Fix this to not require
- NULL-termination of the array.
-
-2000-08-04 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (imap_connect): If we fail to
- get a dir_sep, then supply the default of "/".
- (get_folder): Undo changes by Peter
-
-2000-08-04 Peter Williams <peterw@helixcode.com>
-
- * providers/imap/camel-imap-store.c (get_folder): Prevent a coredump
- when get_folder()ing from a store with dir_sep = NULL.
-
-2000-08-04 Peter Williams <peterw@helixcode.com>
-
- * camel-store.h: Include camel-object.h. Ettore said this wasn't
- compiling.
-
-2000-08-04 Not Zed <NotZed@HelixCode.com>
-
- * camel-url.c (camel_url_set_protocol):
- (camel_url_set_host):
- (camel_url_set_path):
- (camel_url_set_port): Url editing functions.
-
-2000-08-04 Dan Winship <danw@helixcode.com>
-
- * providers/pop3/camel-pop3-folder.c (pop3_set_message_flags):
- (pop3_sync): Indexes into the flags array are message_number minus
- 1, not just message_number.
-
- * providers/pop3/camel-pop3-store.c: add a debugging macro for
- doing protocol tracing.
-
-2000-08-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (camel_imap_folder_new): Only
- call imap_get_summary_internal if the folder can hold messages
-
- * providers/nntp/camel-nntp-provider.c (camel_provider_module_init):
- Initialize the service_cache for the news/nntp providers
-
-2000-08-03 Peter Williams <peterw@helixcode.com>
-
- * providers/nntp/Makefile.am (INCLUDES): Add -I$(top_srcdir) to
- pull in libibex/ibex.h
-
-2000-08-02 Not Zed <NotZed@HelixCode.com>
-
- * providers/mh/camel-mh-summary.c (camel_mh_summary_sync): Expunge
- from the end, so the index isn't messed up when you remove a
- message.
-
- * providers/mh/camel-mh-folder.c (mh_append_message): Fix a bug
- where it would never open an output file/uid.
-
- * providers/mbox/camel-mbox-store.c (rename_folder):
- Implementation for mbox as well.
-
- * camel-store.c (camel_store_rename_folder): New method to rename folders.
- (rename_folder): Default implementation.
-
- * providers/mh/camel-mh-store.c (delete_folder): Implement this.
- (rename_folder): Implement a rename operation.
-
-2000-08-02 Dan Winship <danw@helixcode.com>
-
- * providers/MH: Kill this. It doesn't have any code to do anything
- the new mh provider doesn't do better.
-
- * providers/Makefile.am: Remove reference to MH subdir, and
- promote nntp to fully-supported status, since it does compile and
- all.
-
- * camel-mime-message.c (camel_mime_message_set_subject): Trim
- trailing space from the subject. I've now seen replies from two
- different people that tricked the threading code by (a) not having
- References/In-Reply-To, and (b) adding an extra space to the end
- of the subject line so the subject-based threading fails too. Who
- writes these broken mailers anyway?
-
-2000-08-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/smtp/camel-smtp-transport.c (smtp_helo): When forced
- to use the IP, place it in square brackets.
-
- * providers/imap/camel-imap-utils.c (imap_translate_sexp): New and
- improved sexp parser. An honest try at using e-sexp is wrapped in
- a #ifdef at the bottom of the file but is currently not used
-
- * providers/imap/camel-imap-folder.c (imap_search_by_expression):
- We want to do a UID SEARCH so we get UIDs back instead of sequence
- numbers
-
-2000-08-01 Not Zed <NotZed@HelixCode.com>
-
- * providers/mh: New mh provider implementation.
-
- * providers/Makefile.am (SUBDIRS): Added mh provider.
-
-2000-07-31 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_message_info_internal):
- Some IMAP servers don't wrap the UID in ()'s so don't depend on that
- (imap_get_summary_internal): Same
-
- * providers/imap/camel-imap-utils.c (free_sexp_node): Oops, forgot to
- free node->function - not good.
-
-2000-07-31 Peter Williams <peterw@helixcode.com>
-
- * providers/vee/camel-vee-folder.c (vee_search_by_expression): Add
- a NULL to the matches pointer array so that g_strfreev knows where
- the end is.
-
-2000-07-31 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-utils.c (imap_translate_sexp): New
- convenience function to translate a Camel sexp into the equivalent
- IMAP sexp.
-
- * providers/imap/camel-imap-store.c: More places now use
- imap_next_word
-
- * providers/imap/camel-imap-folder.c (imap_search_by_expression):
- Implemented initial version (this may or may not work quite right)
-
-2000-07-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_expunge): Make sure
- the third word/token (whatever) is "EXPUNGE" and not something
- else like "EXISTS" or "RECENT". When removing the message from
- the summary also make sure to free that data to avoid leakage.
- Also make sure to subtract 1 from the 'id' since IMAP starts
- at 1 and our summary starts at 0 :-)
-
-2000-07-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (camel_imap_status): Cleaned
- up a bit, now uses imap_next_word()
- (camel_imap_command_extended): Now uses imap_next_word(). When
- checking for RECENT, allow the first digit of the recent-count
- be between 0 and 9 inclusive instead of exclusive.
-
- * providers/imap/camel-imap-folder.c (imap_expunge): Optimized.
- No longer will it need to reload the summary as it now instead
- removes the appropriate message summaries from the cache.
- (camel_imap_folder_changed): If recent == 0 then return. If
- recent < 0 then just emit the folder_changed signal, don't reload
- summaries.
-
-2000-07-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c
- (imap_get_message_count_internal): Get message count when STATUS
- is not available.
- (imap_init): folder->has_search_capability is required for IMAP so
- should always be set to TRUE (is currently being set to FALSE as
- I've not yet implemented SEARCH support).
- (camel_imap_folder_changed): Seem to have fixed my optimization
- hack
-
-2000-07-28 Jon K Hellan <hellan@acm.org>
-
- * providers/imap/camel-imap-store.h (CamelImapServerLevel): New
- enum.
- (CamelImapStore): Added server_level and has_status_capability
- members.
-
- * providers/imap/camel-imap-store.c (imap_connect): Detect
- IMAP4REV1, IMAP4 and STATUS in capability response.
-
- * providers/imap/camel-imap-folder.c
- (imap_get_message_count_internal): Use STATUS only if server
- supports it. TODO: Get message count when STATUS not supported.
- (imap_get_message, imap_get_summary_internal,
- imap_get_message_info_internal): Handle IMAP4 as well.
- (imap_protocol_get_summary_specifier): New function: Make a data
- item specifier for the header lines we need, appropriate to the
- server level.
-
-2000-07-27 Peter Williams <peterw@helixcode.com>
-
- * camel-mime-utils.c (header_decode_lwsp): More
- checks for end of string.
-
- * providers/imap/camel-imap-store.c:
- (imap_command_extended): Free the elements of our
- array (huge mem leak)
-
- * providers/imap/camel-imap-folder.c:
- (summary_get_internal): Same as above.
-
-
-2000-07-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (camel_imap_folder_changed):
- Fixed my routine to only fetch new headers, my IDs were off by 1
- on the high end, so when it would fetch the last newly arrived
- message it would fail and end up fetching all of the summaries
- because of the corruption.
-
-2000-07-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-url.c (camel_url_to_string): If the path doesn't begin
- with a / and there is a host, prepend a / to the path.
-
-2000-07-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/Makefile.am: Added camel-imap-utils.[c,h]
-
- * providers/imap/camel-imap-utils.[c,h]: Utilities for parsing
- server responses for use in both camel-imap-store.c and
- camel-imap-folder.c
-
- * providers/imap/camel-imap-folder.c (imap_get_summary_internal):
- Free all the pointers in the headers array.
- (imap_get_subfolder_names_internal): Updated to use
- imap_parse_list_response
- (imap_parse_subfolder_list): Removed in favor of
- imap_parse_list_response
-
- * providers/imap/camel-imap-store.c (camel_imap_command_extended):
- Free all the pointers in the data array.
- (imap_connect): Updated to use imap_parse_list_response and fixed
- a leak
- (folder_is_selectable): Updated.
-
-2000-07-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_message_info): Now
- uses a hash table for looking up message info rather than a linear
- search :)
-
-2000-07-27 Peter Williams <peterw@helixcode.com>
-
- * providers/*/Makefile.am: Don't specify SUBDIRS =
- [nothing]. Messes up distcheck.
-
-2000-07-26 Peter Williams <peterw@helixcode.com>
-
- * camel-mime-parser.c (folder_scan_init): Initialize
- outbuf to be "" -- it's not guaranteed to be zeroed.
-
- * camel-mime-utils.c (header_references_decode): Return
- if the header is NULL -> or "" <-. Don't do our stupid
- mailer trick if we point to \0.
- (header_decode_quoted_string): Don't rip past end of
- string!
-
-2000-07-26 Dan Winship <danw@helixcode.com>
-
- * camel-movemail.c (movemail_external): routine to call an
- external movemail program.
- (camel_movemail): Nuke return value, use movemail_external when
- available and useful, and don't delete "dest" on errors, since
- it might have started non-empty.
-
-2000-07-26 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-url.c (camel_url_to_string): Should now always prepend a '/'
- before the path if it doesn't already exist.
-
- * providers/imap/camel-imap-folder.c: Fixed a few compiler warnings
-
-2000-07-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_summary_free): Fixed the
- real problem that Peter was running into.
-
-2000-07-25 Dan Winship <danw@helixcode.com>
-
- * camel-mime-message.c (write_to_stream): Don't add a Mime-Version
- header to a message that already has one.
-
- * camel-internet-address.c (internet_encode): Don't put <>s around
- addresses with no name part.
-
-2000-07-25 Peter Williams <peterw@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_expunge): Set
- imap_folder->summary to NULL after calling imap_summary_free,
- so we don't get stuck with a junk summary pointer. Should
- we free it at all?
-
-2000-07-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (camel_imap_folder_changed):
- Optimized to try and get the new message headers without reloading
- the entire summary from scratch.
- (imap_get_summary_internal): Will now sync() before attempting to
- reload the summary so that flags are set in the reloaded summary
- as well.
-
-2000-07-24 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (get_folder): Updated to give
- special attention to the root folder.
-
- * providers/imap/camel-imap-folder.c
- (imap_get_subfolder_names_internal): Updated to handle the root
- folder
- (imap_get_message_count_internal): return 0 if folder can't hold
- messages
- (camel_imap_folder_new): Change so that root folder gets special
- attention and always gets can_hold_messages set to FALSE
-
-2000-07-24 Dan Winship <danw@helixcode.com>
-
- * camel-folder.c: Remove exceptions from a number of methods that
- work on what ought to be static data: get_parent_folder,
- get_parent_store, get_message_count, get_unread_message_count,
- get_permanent_flags, get_message_flags, set_message_flags,
- get_message_user_flag, set_message_user_flag, get_uids,
- get_summary, get_subfolder_names. Turn camel_folder_delete_message
- into a macro. (Mostly a pull-up from the camel-async branch.)
-
- * providers/{imap,mbox,nntp,pop3,vee}: Update for CamelFolder
- changes
-
-2000-07-24 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_message_info): Updated
- to port easily to the new Camel API
- (imap_init): Don't SELECT INBOX, we don't need to do that
-
-2000-07-24 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (camel_imap_folder_new):
- Initialize the summary and subfolder listing.
- (imap_summary_free): Now takes a GPtrArray arg rather than a
- CamelImapFolder as it increases it's usefullness for free()'ing
- temporary summaries.
- (imap_get_message_count_internal): A new convenience function for
- getting the actual message count on a server to be used by
- imap_get_summary_internal)
- (imap_get_message_count): Since the Camel API is on the move again,
- the future version of this function will not be able to make a
- call to the store, it must only access previously fetched data (thus
- the creation of the _internal function)
- (imap_get_subfolder_names_internal): Again, because the future version
- of imap_get_subfolder_names will not take an exception, we must rename
- this function which will be called by camel_imap_folder_new()
- (imap_get_subfolder_names): We now return the previously collected
- subfolder listing that the _internal function fetched previously
- (imap_get_summary_internal): Again, same idea as the previous _internal
- functions...
- (imap_get_summary): Again... now returns a previously aquired summary
-
- * providers/imap/camel-imap-store.c (imap_noop): This will hopefully
- prevent the imap store from disconnecting.
- (imap_connect): Modified to add a gtk timeout event that will call
- imap_noop() every 10 minutes (we may want to change this time value)
- (imap_disconnect): Modified to remove the NOOP timeout event from the
- store.
- (camel_imap_command_extended): Commented out the code that would try
- and detect if the store was disconnected and then reconnect if it was
- needed.
-
-2000-07-24 Dan Winship <danw@helixcode.com>
-
- * camel-folder.[ch]: Remove camel_folder_get_message_uid, which
- was not used, and not implemented by any provider.
-
- * providers/nntp/camel-nntp-folder.c: Remove get_message_uid
- non-implementation.
-
- * camel-folder-pt-proxy.[ch], camel-arg-collector.c,
- camel-marshal-utils.[ch]: Bye bye bye.
-
- * Makefile.am: remove reference to camel-arg-collector.c
-
-2000-07-23 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (imap_disconnect): Made it a
- little more forgiving. Also set current_folder to NULL as there is
- no selected folder after a disconnect.
- (stream_is_alive): Detects whether or not a socket is "alive"
- (camel_imap_command_extended): Use stream_is_alive() to aid in the
- detection of a disconnected state.
-
-2000-07-22 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (get_folder): Clear
- CamelExceptions when appropriate (eg when folder is marked as
- \NoSelect). Still needs some cleanup and perhaps Dan will have a
- better way of doing this as this seems like a messy way of
- handling this.
-
- * providers/imap/camel-imap-folder.c (imap_get_uids): Took out
- some debug statements as they are no longer needed.
-
-2000-07-21 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_subfolder_names):
- Updated to not strip out subfolders that are marked as \NoSelect
- because this will be correctly handled in store->get_folder from
- now on.
-
- * providers/imap/camel-imap-store.c (folder_is_selectable): New
- convenience function for use in get_folder().
- (parse_list_response): Now takes a char **flags argument which is
- needed by folder_is_selectable().
- (imap_connect): Updated to reflect changes to
- parse_list_response().
-
-2000-07-21 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-stream.c (stream_read): Updated with
- some of the same fixes I've made to camel-imap-folder.c like
- recalculating message part lengths.
-
- * providers/imap/camel-imap-store.c (camel_imap_command_extended):
- Rewrote the code to check for "* %d RECENT". Still needs to be
- modified, but should no longer cause an infinite loop by detecting
- mis-detecting RECENT messages.
-
-2000-07-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_summary):
- (imap_get_message_info): Oops. Fix UID parser to allow 0 and 9 to
- be in the range of valid UID chars.
-
-2000-07-20 Peter Williams <peterw@helixcode.com>
-
- * camel-object.c (camel_object_unref): Add a new global mutex
- 'refcount' held when refcounting operations occur.
-
-2000-07-19 Peter Williams <peterw@helixcode.com>
-
- * camel-object.c (camel_type_lock_up): Correct the recursiveness;
- the locklevel is stored as a private, so each thread has its own
- idea of the locklevel. Thus one thread can relock, but a different
- one will think that it's a level 0 and try to lock the type_system
- mutex.
-
-2000-07-19 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c: General cleanup working
- towards getting Actions->Expunge working correctly.
-
- * providers/imap/camel-imap-store.c
- (cammel_imap_command_extended): Added code to look for "* %d
- RECENT" and to emit the folder_changed signal if there are any
- recent messages. Note: this is a hack and needs to be rewritten
- badly.
-
-2000-07-19 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_summary): If the
- folder's message count is not the same as the number of summaries,
- free the old summary and create a new summary.
-
-2000-07-18 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c
- (camel_imap_folder_class_init): Added in
- imap_[g,s]et_message_user_flag() methods
- (imap_get_message_info): Rewrote to use the more efficient way of
- downloading summary information and also added a UID comparison so
- that if the UID requested doesn't match the UID received, it
- returns NULL. FIXME: When the mailer gets NULL when it requested
- message info, it seems that it displays a row for that message and
- when you try and select the blank row, it segfaults.
-
- * providers/imap/camel-imap-store.c (get_folder): Oops, this
- should not be checking against "/", it should be checking against
- dir_sep.
-
- * providers/imap/camel-imap-folder.c (imap_parse_subfolder_line):
- Updated to trim out the leading namespace.
- (imap_get_subfolder_names): Let the subfolder parser trim the
- namespace off the folder name.
-
-2000-07-17 Peter Williams <peterw@helixcode.com>
-
- * camel-object.c (camel_type_lock_up): New function; the
- Camel type_system lock is now fakey-recursive, being controlled
- by a semaphore that goes up and down and is protected by another
- lock. Theoretically all we need is the lock on the semaphore,
- but this we catch exceptions "better" (by deadlocking).
- (camel_type_lock_down): Corresponding to above.
- (all functions): s,G_LOCK,camel_type_lock_up, etc.
-
-2000-07-17 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (imap_disconnect): Send a
- "LOGOUT" command.
-
- * providers/imap/camel-imap-folder.c (imap_get_message): Hacks to
- get IMAP code to work with CommunigatePro and MS Exchange (and any
- other servers that send back a UID at the end of each FETCH inside
- of the main body of the message part).
- (imap_sync): Un-#if 0 the code that sets the flags on the IMAP
- server for messages that have changed. Oops, don't mask with
- DELETED to find out if the message has been answered ;-)
- (imap_expunge): sync before expunging.
-
-2000-07-16 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c: All SELECT calls now pass
- a NULL folder argument to camel_imap_command_extended() since it's
- not needed.
- (imap_connect): Moved service_class->connect() to the point right
- after a connection is established with the server rather than
- waiting until the end of the function.
- (camel_imap_command): Updated the documentation comment
- (camel_imap_command_extended): Before sending a command, first
- check to make sure we are connected; if we aren't, then reconnect.
- Don't strncmp() command with "SELECT" as it's redundant.
-
- * providers/imap/camel-imap-folder.c: All SELECT calls now pass
- a NULL folder argument to camel_imap_command_extended() since it's
- not needed. Also s/camel_imap_command/camel_imap_command_extended as
- I will probably be doing away with camel_imap_command() or at least
- only using it for LOGIN and similar commands where the server won't
- notify us of any recent messages.
-
-2000-07-15 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (camel_imap_folder_new):
- One last fix to get rid of hard-coded "/" directory separators
-
-2000-07-14 Peter Williams <peterw@helixcode.com>
-
- * camel-object.c : Implement 'events', which are suspiciously
- like signals except without all the marshalling baggage, and
- with quasi-thread-safety.
- (camel_object_class_declare_event): New func.
- (camel_object_hook_event): Ditto.
- (camel_object_trigger_event): Ditto.
- (obj_class_init): Declare the "finalize" event.
- (obj_class_finalize): Free the hashtable of events->preps
- (obj_finalize): Free the hashtable of events->hooklists
- (camel_object_unref): Trigger the finalize event (ourselves,
- to prevent massively unpleasant looping things.)
-
-2000-07-14 Peter Williams <peterw@helixcode.com>
-
- * camel-object.c (make_global_classfuncs): Change to return
- a CamelObjectClass. Change parents to a GSList and free it
- when done.
- (camel_object_new): Don't allocate a classfuncs for every object;
- merely give it a reference to the global_classfuncs. Convert
- parents to a GSList and free it when done.
- (camel_object_unref): Don't free the classfuncs. Free the parents
- list, which is changed to a GSList.
-
-2000-07-14 Jeffrey Stedfast <fejj@helixcode.com>
-
- * string-utils.c (string_unquote): New convenience function
- to unquote a string if it's encapsulated by "'s
-
- * providers/imap/camel-imap-folder.c:
- * providers/imap/camel-imap-store.c: Made the necessary changes
- to stop using hard coded directory separators.
-
-2000-07-13 Dan Winship <danw@helixcode.com>
-
- * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_load):
- If the summary is for a smaller mbox, and rebuilding from the
- last-known end position fails, try rebuilding from the beginning.
- Deals with the case where the user edits the mbox and makes it
- bigger, without adding new messages.
-
-2000-07-13 Peter Williams <peterw@helixcode.com>
-
- * camel-object.c: Rewritten to not be based on GtkObject,
- but a tiny threadsafe ripoff thereof. Objects still cannot
- be shared across threads, but ref/unref/destroy/new/etc
- will work. Signals are not implemented because doing it
- robustly would be a major pain in the butt, but class
- functions are. There's a small demonstration that it doesn't
- crash in ./temp-test.c: build it with ./make-test.sh.
- * camel-stream.c, camel-seekable-stream.c, camel-stream-mem.c:
- moved over to CamelObject. Proof of concept: two levels of
- subclass and class functions, all working without coredumps.
- To port to CamelObject:
- - s,GTK_,CAMEL_,g in the cast checks
- - s,gtk_type_new,camel_object_new,g
- - s,GtkType,CamelType,g
- - Change get_type function over to camel_type_declare
- - instead of hooking to finalize function, it goes into the
- type declaration.
- - remove signals.
- - instead of GTK_OBJECT(so)->klass, CAMEL_OBJECT_GET_CLASS(so)
- - s,gtk_type_class,camel_type_get_global_classfuncs,g
- - don't chain finalize handlers; it will be done for you
-
-2000-07-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c:
- * providers/imap/camel-imap-store.c: If a SELECT fails, set
- imap_store->current_folder to NULL so a SELECT is forced before
- any message/folder operations are requested. Also, because some
- users don't use a namespace, make sure that if the url->path is
- "/" we don't use it when creating the folder_path.
- (camel_imap_command[_extended]): Since we allow the passing of
- a NULL folder which we can use to bypass a forced SELECT, no need
- to check for the individual commands that don't require a folder
- to be selected.
-
-2000-07-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c:
- * providers/imap/camel-imap-store.c: Updated to use CAMEL_IMAP_OK,
- CAMEL_IMAP_NO, CAMEL_IMAP_BAD, and CAMEL_IMAP_FAIL rather than the
- ones copied from the POP3 provider.
-
-2000-07-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_summary): Oops.
- If the number of messages in the folder is 0, don't fetch
- summaries 1 thru 0, just return an empty summary.
- (imap_copy_message_to): Fixed to use message UID and also send
- the source folder as an arg to camel_imap_command rather than NULL.
- (imap_move_message_to): Same.
- (imap_init): If SELECT is successful, we need to set the current
- folder to the one selected, this was causing problems with move/copy
-
-2000-07-13 Dan Winship <danw@helixcode.com>
-
- * camel-service.h: define a set of CAMEL_SERVICE_URL_ALLOW_* flags
- parallel to the _NEED_* flags, and make the _NEED_* flags imply
- the _ALLOW_* ones.
-
- * providers/imap/camel-imap-store.c (camel_imap_store_init): imap
- urls ALLOW_PATH
-
-2000-07-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_summary): New
- and improved approach to fetching an entire folder summary
- that should be much much faster than the old way as it gets
- the entire folder summary in 1 shot rather than requesting
- message by message. As with the last update, this version
- also only fetches the minimum number of header fields.
- (imap_get_summary): Oops, forgot to free the temp
- GPtrArray *headers
-
-2000-07-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_summary): Don't
- fetch the entire RFC822 header, just fetch the fields we want.
- (imap_get_message_info): Same.
-
-2000-07-13 Not Zed <NotZed@HelixCode.com>
-
- * camel-mime-filter-basic.c (camel_mime_filter_basic_new_type):
- Reset filter on setup.
- (reset): When resetting qp encoding, set the state to -1, instead
- of 0.
-
- * camel-mime-utils.c (quoted_encode_step): Actually count the
- characters output sofar (it never counted any). Bunch of other
- fixes.
- (quoted_encode_close): Also flush out final character, if there's
- one.
-
-2000-07-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- Chris forgot to add #include <e-util/e-util.h> to the source files
-
- * providers/imap/camel-imap-store.c (imap_connect): Fixed Peter's
- fix, we don't want to send a string to a %d.
-
-2000-07-12 Christopher James Lahey <clahey@helixcode.com>
-
- * camel-folder-search.c, providers/imap/camel-imap-store.c:
- Changed from strstrcase to e_strstrcase.
-
- * string-utils.c, string-utils.h: Removed strstrcase (in favor of
- e_strstrcase in e-util/e-util.c.)
-
-2000-07-12 Chris Toshok <toshok@helixcode.com>
-
- * providers/nntp/camel-nntp-folder.c
- (nntp_folder_set_message_flags): get the article num out of our
- uid and mark it read in the newsrc.
- (nntp_folder_get_message): get the message id out of the uid to
- fetch the article.
-
- * providers/nntp/camel-nntp-utils.c (get_XOVER_headers): the uid
- is now <article-num>,<messageid>
- (get_HEAD_headers): same.
-
- * camel-mime-parser.c (folder_scan_step): go to HSCAN_MESSAGE
- state when ct->subtype is "news" as well as "rfc822". this makes
- attachments of type "message/news" display properly.
-
-2000-07-12 Dan Winship <danw@helixcode.com>
-
- * camel-folder.c (camel_folder_free_deep,
- camel_folder_free_shallow, camel_folder_free_nop): Useful default
- implementations for free_{uids,subfolder_names,summary}.
- (free_subfolder_names, free_uids): Make these g_warning-ing
- default implementations.
-
- * providers/*/camel-*-folder.c: Use the new functions where
- appropriate, remove duplicated code.
-
-2000-07-12 Peter Williams <peterw@helixcode.com>
-
- * providers/imap/camel-imap-store.c (query_auth_types): Check for
- NULL parameters when setting the exception so as to not crash on
- Solaris (can't handle a %s passed NULL).
- (imap_connect): Same.
-
-2000-07-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/mbox/camel-mbox-folder.c (mbox_delete_message): Use
- mbox_set_message_flags () instead of setting the flags by hand. This
- fixes the problem of the "message_changed" signal not being emitted
- at the correct time.
-
- * providers/imap/camel-imap-folder.c: "folder_changed" signals should
- pass a third argument (which is ignored).
-
- * camel-folder.c: Undo gtk signal emits done in set_flags and
- expunge.
- (move_message_to):
- (copy_message_to): Create info as a const CamelMessageInfo
-
-2000-07-12 Chris Toshok <toshok@helixcode.com>
-
- * providers/nntp/Makefile.am: don't add test-newsrc to the build
- since it needs libcamel (which isn't built at the time test-newsrc
- needs linking.)
-
- * providers/nntp/camel-nntp-utils.c (get_HEAD_headers): fill in
- MessageInfo->message_id.
- (get_XOVER_headers): same.
-
- * providers/nntp/camel-nntp-folder.c (nntp_folder_init): move
- summary loading here.
- (nntp_folder_sync): summary/newsrc changes should be stored here.
- put a comment to that effect.
- (nntp_folder_set_message_flags): don't save the newsrc here.
- (nntp_folder_get_uids): use g_ptr_array_index instead of the
- cast/addition.
- (nntp_folder_get_summary): no need to check if we should generate
- the summary here. already done.
- (nntp_folder_get_message_info): implement.
-
- * providers/nntp/camel-nntp-store.c
- (camel_nntp_store_get_toplevel_dir): use evolution_dir instead of
- computing it ourselves.
- (nntp_store_disconnect): call camel_nntp_newsrc_write.
- (ensure_news_dir_exists): new function to create the news/<news
- server> subdir.
- (camel_nntp_store_class_init): hook up connect/disconnect and
- finalize.
- (nntp_store_connect): if ensure_news_dir_exists fails throw an
- exception.
-
-2000-07-12 Peter Williams <peterw@helixcode.com>
-
- * camel-folder.c (camel_folder_set_message_flags): Emit a message_changed
- signal once the flags are set on the message.
- (camel_folder_set_user_flag): Ditto.
- (camel_folder_expunge): Emit a folder_changed if no exception.
-
-2000-07-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-stream.c: Use size_t and ssize_t for read/write methods
-
- * providers/imap/camel-imap-folder.c (imap_set_message_flags):
- Updated to emit the message_changed signal.
- (imap_delete_message): Updated to use imap_set_message_flags ().
- (imap_move_message_to): Updated to use imap_set_message_flags ()
- and to emit the folder_changed signal on the destination folder.
- (imap_copy_message_to): Updated to emit the folder_changed signal
- on the destination folder.
- (imap_append_message): Updated to emit the folder_changed signal
- on the destination folder.
-
-2000-07-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-folder.c (camel_folder_append_message): Now takes a
- flags argument to specify the flags to be set on the message
- since we might not necessarily want the flags to be wiped clean.
- (move_message_to):
- (copy_message_to): Updated to send a flags argument to
- append_message (); currently sends the original message's flags.
-
- * providers/mbox/camel-mbox-folder.c (mbox_append_message):
- * providers/imap/camel-imap-folder.c (imap_append_message):
- Updated.
-
-2000-07-11 Dan Winship <danw@helixcode.com>
-
- * camel-folder.c: Remove exceptions from a number of methods
- that work on what ought to be static data: get_parent_folder,
- get_parent_store, get_message_count, get_unread_message_count,
- get_permanent_flags, get_message_flags, set_message_flags,
- get_message_user_flag, set_message_user_flag, get_message_uid,
- get_uids, get_summary, get_subfolder_names. Turn
- camel_folder_delete_message into a macro.
-
- * providers/{mbox,pop3,vee}: Update for CamelFolder changes
-
- * providers/Makefile.am: Disable imap and nntp for now
-
-2000-07-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_search_by_expression):
- This shouldn't return NULL, it should return g_ptr_array_new ()
- so the mailer gets what it expects.
-
-2000-07-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-folder-summary.c (camel_folder_summary_decode_string):
- Oops, an unsigned integer can never be < 0
-
-2000-07-10 Dan Winship <danw@helixcode.com>
-
- * providers/vee/camel-vee-folder.c (vee_search_by_expression):
- Initialize a variable to make this not crash again. And fix a bug
- so it actually does something.
-
-2000-07-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-folder-summary.c: Cleaned up a bunch of compile warnings
-
-2000-07-10 Dan Winship <danw@helixcode.com>
-
- * providers/vee: kill more debugging messages
-
-2000-07-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/mbox/camel-mbox-folder.c (mbox_get_unread_message_count):
- * providers/vee/camel-vee-folder.c (vee_get_unread_message_count):
- * providers/imap/camel-imap-folder.c (imap_get_unread_message_count):
- Implemented.
-
- * camel-folder.c (camel_folder_get_unread_message_count): New
- convenience function to allow the mailer to query the number
- of unread messages in a folder (for displaying message stats
- in a folder tree?).
-
-2000-07-09 Dan Winship <danw@helixcode.com>
-
- * camel-mime-utils.c (header_references_dup): New function to copy
- a header_references structure.
-
- * camel-folder-summary.c (camel_message_info_dup_to): New function
- to (deep) copy the data from one CamelMessageInfo into another.
- (camel_message_info_free): And free the data.
-
- * providers/vee/camel-vee-folder.c (vee_sync): Implement. (empty).
- (vee_search_by_expression): belatedly update for
- camel_folder_search change.
- (vee_folder_build): belatedly update for camel_folder_search
- change. Use camel_message_info_dup_to and camel_message_info_free
- (in particular, so that we get message_id and references info so
- vfolders can be threaded).
- (vee_folder_build_folder): Ditto.
-
-2000-07-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/nntp/camel-nntp-folder.c:
- * providers/nntp/camel-nntp-utils.c:
- * providers/nntp/camel-nntp-store.c: Update to reflect past changes
- in the Camel API. Use gtk macro casts wherever possible and use glib's
- memory functions instead of standard c's (since they are not
- compatable)
-
- * providers/smtp/camel-smtp-transport.c:
- * providers/imap/camel-imap-store.c: Wrap debug print statements
- in a macro
-
- * providers/imap/camel-imap-stream.c (stream_read): Make sure
- that we get up to and including the last \n of the mime part.
-
- * providers/imap/camel-imap-folder.c (imap_get_message): Make sure
- that we get up to and including the last \n of the mime part.
- Wrap debug print statements in a macro.
-
- * providers/imap/camel-imap-stream.c (stream_read): Only cache
- the important data (aka the mime part requested and no extra
- server response stuff)
-
-2000-07-07 Dan Winship <danw@helixcode.com>
-
- * camel-mime-utils.c (header_references_decode): Work around
- In-Reply-To's with unquoted punctuation. So many broken mailers.
-
- * camel-folder.c (camel_folder_search_by_expression): Make this
- return a GPtrArray rather than a GList.
-
- * camel-folder-search.c (camel_folder_search_execute_expression):
- * providers/imap/camel-imap-folder.c (imap_search_by_expression):
- * providers/mbox/camel-mbox-folder.c (mbox_search_by_expression):
- * providers/nntp/camel-nntp-folder.c (nntp_search_by_expression):
- Update to return a GPtrArray rather than a GList.
-
-2000-07-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/smtp/camel-smtp-transport.c (esmtp_get_authtypes):
- Fixed the parser to actually work
-
-2000-07-06 Dan Winship <danw@helixcode.com>
-
- * camel-mime-utils.c (header_references_decode): Make this deal
- with the full RFC822 References/In-Reply-To format rather than
- just the more-nicely-behaved RFC1036 version. (Needed to parse
- In-Reply-To headers with extra junk in them.)
-
-2000-07-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_summary): Parse for
- more header information to allow message threading in IMAP.
- (imap_get_message_info): Same.
-
- * camel-folder-summary.c: Renamed summary_format_* to
- camel_summary_format_* and moved them into public scope.
-
- * providers/smtp/camel-smtp-transport.c (smtp_connect): Oops. Don't
- pass port # as a string in the error code (if it fails to connect).
-
- * providers/imap/camel-imap-folder.c (imap_append_message): Changed
- over to camel_imap_command_extended as that was the source of the
- problems - apparently appending replies with more than just 1 line.
-
-2000-07-05 Dan Winship <danw@helixcode.com>
-
- * camel-folder-search.c (search_header_contains): make header
- matching case-insensitive
-
- * camel-folder-summary.c:
- * camel-session.c:
- * providers/mbox/camel-mbox-folder.c:
- * providers/mbox/camel-mbox-summary.c: Remove some non-error case
- debugging-type messages.
-
-2000-07-05 Ettore Perazzoli <ettore@helixcode.com>
-
- * providers/mbox/camel-mbox-summary.c (d): Define to empty so that
- we get rid of a ton of debugging messages.
-
-2000-07-05 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-mime-utils.h: Added prototype for uudecode_step
-
- * camel-mime-utils.c (uudecode_step): Cleaned up some junk that
- should have been cleaned up when debugging printf's were taken out.
-
-2000-07-05 Ettore Perazzoli <ettore@helixcode.com>
-
- * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_sync):
- Update the X-Evolution: header even if the in-memory UID and the
- saved UID are not the same. Otherwise mboxes with clashing UIDs
- can never be fixed.
-
- * camel-folder-summary.c
- (camel_folder_summary_add_from_parser): Add the message to the
- summary before doing any ibex stuff. In fact, this might also
- have the side effect of reassigning the UID so it needs to be done
- before we start using the UID.
-
- * providers/mbox/camel-mbox-folder.c (mbox_append_message): Add
- debugging message to keep track of the UIDs we add.
-
-2000-07-05 Dan Winship <danw@helixcode.com>
-
- * camel-folder-summary.c: Add "Cc" to summary and bump summary
- version number.
-
- * camel-folder-search.c (search_header_contains): make "Cc" a
- searchable header.
-
-2000-07-03 Ettore Perazzoli <ettore@helixcode.com>
-
- * camel-folder-summary.c (camel_folder_summary_next_uid_string):
- New.
- (camel_folder_summary_add): Use
- `camel_folder_summary_next_uid_string()' instead of recomputing
- the UID manually here.
- (camel_folder_summary_add_from_parser): Likewise.
-
-2000-07-03 Ettore Perazzoli <ettore@helixcode.com>
-
- * camel-folder-summary.c (camel_folder_summary_set_uid): Removed.
-
-2000-07-03 Dan Winship <danw@helixcode.com>
-
- * camel-folder-summary.c (message_info_new): Parse In-Reply-To
- with header_references_decode, not header_msgid_decode.
-
- * camel-mime-message.c (camel_mime_message_class_init): message
- headers are case-insensitive.
-
- * providers/pop3/camel-pop3-store.c (camel_pop3_command): Fix a
- bug in error-setting code.
- (pop3_connect): Don't re-prompt for password in the KPOP case.
- (pop3_get_response): New function, split out from
- camel_pop3_command.
- (connect_to_server): Use pop3_get_response to parse the greeting
- message, and error out appropriately if it's -ERR.
-
-2000-07-02 Dan Winship <danw@helixcode.com>
-
- * camel-folder.c (camel_folder_freeze, camel_folder_thaw): New
- functions to freeze and thaw a folder (to prevent message/folder
- changed signals in the middle of a long series of operations).
- (camel_folder_class_init): Change signals to GTK_RUN_FIRST.
- (message_changed, folder_changed): Add default implementations
- that stop the emission and record info for later if the folder is
- frozen.
-
- * providers/mbox/camel-mbox-folder.c (mbox_sync): leftover fixes
- from the close->sync change: don't destroy the ibex, summary, and
- search when syncing.
- (append_message): emit "folder_changed" on a successful append.
-
-2000-07-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-mime-utils.c (uudecode_step): A rather complex uudecoder
- written in the spirit of Zucchi-ness, is it up to par? Only the
- Z-man can tell us :-)
-
-2000-07-01 Dan Winship <danw@helixcode.com>
-
- * camel-service.c (camel_service_get_name): New method, to return
- an end-user-friendly name corresponding to a service. (eg, "POP
- service for danw on trna.helixcode.com").
-
- * providers/imap/camel-imap-store.c,
- providers/mbox/camel-mbox-store.c,
- providers/nntp/camel-nntp-store.c,
- providers/pop3/camel-pop3-store.c,
- providers/sendmail/camel-sendmail-transport.c,
- providers/smtp/camel-smtp-transport.c: Implement.
-
- * providers/imap/Makefile.am: remove unneeded
- libcamelimap_la_LDADD.
-
- * providers/pop3/camel-pop3-store.c (connect_to_server): fix the
- CAPA-parsing code to not get into an infinite loop.
-
-2000-07-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_message): Fixed
- the bug that would sometimes leave part of the server response
- tacked on to the end of the message.
-
- * camel-folder.c: Renamed _by_uid methods. Since we no longer
- have get-by-number methods, no need to have the _by_uid
- extensions.
- (get_message_by_uid): Renamed to get_message
- (delete_message_by_uid): Renamed to delete_message
- (summary_get_by_uid): Renamed to get_message_info
-
- * providers/mbox/camel-mbox-folder.c:
- * providers/pop3/camel-pop3-folder.c:
- * providers/imap/camel-imap-folder.c:
- * providers/vee/camel-vee-folder.c: Updated to reflect
- camel-folder changes.
-
-2000-06-30 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-folder.c (camel_folder_copy_message_to): New function, to
- copy a message from one folder to another. The default
- implementation just uses append_message, but providers can
- implement more efficient versions for use when both folders are on
- the same store.
-
- * broken-date-parser.[c,h]: Utilities for parsing broken
- date strings.
-
- * providers/imap/camel-imap-folder.c (imap_move_message_to):
- (imap_copy_message_to): Implemented.
-
- * camel-mime-utils.c (header_decode_date): Wrote some code to try
- and un-mangle broken date formats and then parse that new string
- instead.
-
-2000-06-30 Dan Winship <danw@helixcode.com>
-
- * camel-folder.c (camel_folder_move_message_to): New function, to
- move a message from one folder to another. The default
- implementation just uses append_message and delete_message, but
- providers can implement more efficient versions for use when both
- folders are on the same store.
-
-2000-06-29 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_expunge): Should now
- print a meaningful error message when it doesn't succeed
-
-2000-06-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (imap_connect): Changed to
- keep prompting user for a valid password until it either
- authenticates or until Canceled by the user.
- (camel_imap_command_extended): Improved speed (replaced the
- g_strjoinv call with a faster implementation)
-
- * providers/pop3/camel-pop3-store.c
- (camel_pop3_command_get_additional_data): Fixed.
- (pop3_connect): Changed to keep prompting the user for a
- password until it either works or until Canceled by the user.
-
- * providers/mbox/camel-mbox-summary.c: General cleanup
- (camel_mbox_summary_sync): Fixed a memory leak and added
- CamelException handling.
-
- * providers/mbox/camel-mbox-store.c (delete_folder): Fixed a
- memory leak
-
- * providers/mbox/camel-mbox-folder.c (mbox_append_message):
- Default 'off_t seek' to -1 so as to make sure it's initialized
- before it's used in the case of a bad stat() call.
- (mbox_sync): Updated
- (mbox_expunge): Updated
-
-2000-06-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (imap_connect): Move the
- CAPABILITY command here so we don't have to keep checking
- each time we open a folder.
- (camel_imap_command_extended): If we are doing an EXAMINE,
- don't bother doing a SELECT first.
-
- * providers/imap/camel-imap-folder.c (imap_init): Update so
- folder->has_search_capability depends on the parent IMAP store
- (since this is really dependant on the IMAP implementation and
- not the folder)
-
-2000-06-27 Christopher James Lahey <clahey@helixcode.com>
-
- * providers/smtp/camel-smtp-transport.c: Don't close the filter
- stream when done with it (this causes the source stream to close);
- Instead, just flush it when done.
-
-2000-06-27 Michael Zucchi <zucchi@zedzone.mmc.com.au>
-
- * camel-folder-search.c (search_header_contains): Make header
- search 'to' match 'to', and not 'from', small typo, fixes #317.
-
-2000-06-26 Christopher James Lahey <clahey@helixcode.com>
-
- * providers/mbox/camel-mbox-summary.c: Added debugging
- information.
-
-2000-06-23 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c:
- * providers/imap/camel-imap-folder.c: Improved folder parsing.
- Not specifying a namespace should no longer list the entire
- filesystem.
-
-2000-06-22 Chris Toshok <toshok@helixcode.com>
-
- * providers/nntp/.cvsignore: ignore test-newsrc
-
- * providers/nntp/camel-nntp-store.c,
- providers/nntp/camel-nntp-store.h,
- providers/nntp/camel-nntp-folder.c,
- providers/nntp/camel-nntp-folder.h,
- providers/nntp/camel-nntp-utils.c: Bring the nntp provider up to a
- state where it builds and is usable with the current camel. there
- are still warts (semi-broken .newsrc file handling, and a lack of
- a subscribe ui -- in fact no way to add a new server, really), but
- it'll display news messages.
-
- * providers/nntp/Makefile.am (libcamelnntp_la_SOURCES): add
- camel-nntp-newsrc.c
- (libcamelnntpinclude_HEADERS): add camel-nntp-newsrc.h
- also, add test-newsrc stuff.
-
- * providers/nntp/test-newsrc.c: new file that tests the newsrc
- stuff by parsing and regurgitating a .newsrc file for a particular
- server.
-
- * providers/nntp/camel-nntp-newsrc.c,
- providers/nntp/camel-nntp-newsrc.h: new files, initial support for .newsrc files.
-
-2000-06-22 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_message_count):
- Oops. Now appends the namespace to the folder before querying
- for the number of messages.
-
- * providers/imap/camel-imap-store.c (imap_folder_exists): New
- convenience function for use by imap_create().
- (get_folder): If folder is specified as "/", we really want
- "INBOX".
-
- * providers/sendmail/camel-sendmail-provider.c:
- * providers/vee/camel-vee-provider.c:
- * providers/smtp/camel-smtp-provider.c:
- * providers/mbox/camel-mbox-provider.c:
- * providers/pop3/camel-pop3-provider.c:
- * providers/imap/camel-imap-provider.c: Updated
-
- * camel-session.c: Moved service_cache hash table into the
- providers.
- (service_cache_remove): Updated.
- (camel_session_get_service): Updated.
-
- * camel-url.c (camel_url_hash): Took out the hashing of
- url->passwd. We don't want this anymore.
-
- * providers/imap/camel-imap-folder.c (imap_init): Took out
- references to 'namespace'
- (camel_imap_folder_init): Same
-
- * providers/imap/camel-imap-folder.h: No more namespace. We are
- instead going to use url->path as the namespace.
-
-2000-06-21 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (imap_create): Modified to
- use the "namespace" (url->path) if it exists.
-
- * providers/imap/camel-imap-folder.c (imap_delete_message_by_uid):
- Now just sets the deleted flag on the summary rather than speaking
- directly to the IMAP server. This is both faster and cleaner.
-
-2000-06-21 Dan Winship <danw@helixcode.com>
-
- * providers/pop3/camel-pop3-store.c (query_auth_types): Fix dumb
- bug.
-
-2000-06-21 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_message_by_uid):
- We are getting mail in IMAP now!! whoo-hoo!. Stripped out the
- filtering so messages may have some dot-stuffing, but the
- filtering can always be added back in later when we know it
- works and isn't the problem.
-
-2000-06-21 Peter Williams <peterw@curious-george.helixcode.com>
-
- * providers/mbox/camel-mbox-folder.c (mbox_init): Use the basename
- of the mailbox so we don't get pathnames like ~/evolution/inbox///movemail.ibex
-
-2000-06-21 Dan Winship <danw@helixcode.com>
-
- * camel-folder-summary.c (message_info_new): Set date_received
- based on the first (most recent) "Received" header.
-
-2000-06-20 Dan Winship <danw@helixcode.com>
-
- * camel-mime-part.c (write_to_stream): flush the filter stream
- before unreffing it, so it will camel_mime_filter_complete.
-
- * camel-stream-filter.c (camel_stream_filter_class_init): Fix a
- braino so camel_stream_flush works here.
-
- * camel-stream-mem.c (stream_seek): Fix a bug that resulted in
- large attachments being silently dropped.
-
- * providers/pop3/camel-pop3-store.c
- (camel_pop3_command_get_additional_data): Don't use g_strjoinv
- here, since it is O(n^2) on the length of the output string, and
- we can do O(n).
-
- * camel-mime-part-utils.c
- (simple_data_wrapper_construct_from_parser): add a CRLF decoder
- after the QP/B64 decoder if it's text.
-
-2000-06-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_summary): Only
- fetch the summary if the folder summary doesn't already exist.
- When the summary *does* exist, start fetching from 1, not 0.
- (imap_free_summary): Don't do anything here.
- (imap_finalize): Free the summary here instead of in
- imap_free_summary().
- (imap_set_message_flags): Implemented
- (imap_sync): Added code to set flags on messages that have had
- their flags changed (however I #if'd it out until we are more
- confidant in the IMAP code :)
- (imap_summary_get_by_uid): Now parese flags correctly.
- (imap_get_summary): Now parese flags correctly. Also correctly
- parses the UID correctly.
-
- * camel-url.c (check_equal): No need to check s1 if s2 is NULL
- (camel_url_equal): Don't check the passwd component of the url.
-
-2000-06-20 Dan Winship <danw@helixcode.com>
-
- * camel-folder-summary.c (camel_folder_summary_add): mark the
- message info with CAMEL_MESSAGE_FOLDER_FLAGGED if we change the
- uid, so the folder will know that it's dirty.
-
-2000-06-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (camel_imap_command_extended):
- Now returns the last line of data that the server sends back as
- well. This is needed for commands like SELECT (like Peter pointed
- out).
- (camel_imap_command): No longer checks for SELECT (no need)
-
- * providers/imap/camel-imap-folder.c: Added namespace stuff
- which we will need later on...
- (imap_parse_subfolder_line): Convenience function for use in
- get_subfolder_names()
- (imap_get_subfolder_names): Updated. Also changed it to use LIST
- instead of LSUB (temporary change).
-
-2000-06-19 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (camel_imap_folder_init): Set
- summary equal to NULL.
- (imap_get_summary): Store the summary in the ImapFolder
- (imap_summary_get_by_uid): If we have a summary cache in the
- ImapFolder, first check to see if that message info is in the
- cached summary first, if not fetch it directly from the IMAP
- server and append it to the summary cache.
- (imap_get_message_flags): Don't free the message info that we get
- back from summary_get_by_uid as we don't want to be corrupting our
- cached summary.
-
-2000-06-19 Peter Williams <peterw@curious-george.helixcode.com>
-
- * providers/imap/camel-imap-store.c (camel_imap_command{,_extended}): When
- SELECT'ing a folder for an IMAP command, use _extended to grab the entire
- response (before we just used camel_imap_command and missed the OK codes)
-
-2000-06-18 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_summary_get_by_uid):
- Now gets the message flags as it should.
- (imap_get_summary): Same as imap_summary_get_by_uid
- (imap_get_permanent_flags): Return the permanent flags stored
- on the folder.
- (imap_get_message_flags): Return message flags associated with
- given uid. Note: we may want to somehow cache summary info so
- that we don't have to keep querying the IMAP provider in
- imap_summary_get_by_uid().
-
-2000-06-17 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_free_summary): We were
- leaking memory - but not anymore!
- (imap_get_summary): We now get the UIDs and the beginnings of the
- code to get the message flags as well.
-
-2000-06-17 Dan Winship <danw@helixcode.com>
-
- * camel-mime-parser.c (folder_scan_header): Don't copy newlines
- into the parsed header text, and turn any number of tabs and
- spaces after a newline into a single space.
-
-2000-06-17 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_init): Should now
- correctly do CAPABILITY.
-
-2000-06-17 Dan Winship <danw@helixcode.com>
-
- * providers/mbox/camel-mbox-summary.c: Add some debugging printfs
- when rebulding summary to help figure out why people's summaries
- are always being rebuilt.
-
-2000-06-17 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_search_by_expression):
- Began to implement, need to get information on how to
- deconstruct @expression into an IMAP search expression and
- parse the results.
- (imap_init): Now queries the IMAP provider for CAPABILITY to
- determine if SEARCH is implemented or not.
-
- * providers/imap/imap.c: Removed - no longer a need to have
- this as an example for anyone interesting to help mecode IMAP
- support.
-
-2000-06-16 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_sync): Added code
- to expunge if called for (still need to finish coding this).
- (imap_get_uids): Implemented.
- (imap_get_summary): Found a way to get the date
- (imap_summary_get_by_uid): Same.
- (imap_free_summary): Implemented.
-
- * string-utils.c (strstrcase): Fixed a compile warning
-
- * providers/imap/camel-imap-summary.c: Removed - we don't
- need a CamelImapSummary structure.
-
-2000-06-16 Dan Winship <danw@helixcode.com>
-
- Move flag handling from CamelMimeMessage to CamelFolder. This
- simplifies several flag-handling pieces of code in the mailer, and
- lets you change a message's flags without having to fetch the
- message body. It also means that fully-constructed
- CamelMimeMessages are now essentially constant, which will help
- simplify locking issues later since it means two threads
- interested in the same message can just work with separate copies
- of it.
-
- * camel-mime-message.h (struct _CamelMimeMessage): Removed flags
- and user_flags (moved to summary). Removed expunged and
- message_number which were unused. Removed message_uid and folder
- which are no longer needed in the new scheme.
- (struct CamelMimeMessageClass): Removed message_changed signal and
- get/set_message_number methods.
-
- * camel-mime-message.c: Updates for CamelMimeMessage changes.
- (camel_mime_message_get/set_flags,
- camel_mime_message_get/set_user_flag): Replaced with methods in
- CamelFolder.
- (camel_flag_get, camel_flag_set, camel_flag_list_size,
- camel_flag_list_free): Moved verbatim to camel-folder-summary.c
-
- * camel-folder.c (camel_folder_get/set_message_flags,
- camel_folder_get/set_message_user_flag): New methods (and
- corresponding useless default implementations)
- (camel_folder_class_init): add a message_changed signal
-
- * camel-folder-summary.c (camel_flag_get, camel_flag_set,
- camel_flag_list_size, camel_flag_list_free): Moved here from
- camel-mime-message.c
-
- * providers/mbox/camel-mbox-folder.c (message_changed): Removed.
- (mbox_get_message_flags, mbox_set_message_flags,
- mbox_get_message_user_flag, mbox_set_message_user_flag): Tweak
- summary bits as appropriate. (Functionality moved here from
- message_changed.)
- (mbox_get_message_by_uid): Update for CamelMimeMessage changes
- (less stuff to initialize).
-
- * providers/imap/camel-imap-folder.c (message_changed): Remove
- this. It was just copied from the mbox provider and doesn't deal
- with the real IMAP flag stuff anyway. (So there's currently no
- flag support in the IMAP provider.)
- (imap_get_message_by_uid): Update for CamelMimeMessage changes.
-
- * providers/vee/camel-vee-folder.c: (message_changed): Remove old
- one. Add a new one to listen for message_changed on each folder
- and re-emit message_changed signals that correspond to messages in
- the vfolder.
- (vee_get/set_message_flags, vee_get/set_message_user_flag): Proxy
- flag setting to the underlying real messages.
- (vee_append_message): Removed for now; there's no way to translate
- this into the new CamelMimeMessage/CamelFolder scheme, but (a)
- there's also no code which would ever call it and (b) we're
- probably going want a better interface than append_message for
- message drag and drop to work anyway. To be revisited.
-
-2000-06-16 Dan Winship <danw@helixcode.com>
-
- * camel-mime-utils.c (rfc2047_decode_word):
- * camel-mime-part-utils.c (simple_data_wrapper_construct_from_parser):
- * camel-folder-summary.c (summary_build_content_info):
- KLUDGE! Since neither ETable nor GtkHTML supports UTF-8 yet,
- output ISO-8859-1 instead, so Ettore can read his Italian mail. :)
- This will be reverted later.
-
-2000-06-15 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_summary): Started to
- implement - may want to use ENVELOPE instead of BODY.PEEK[HEADER]
- (imap_summary_get_by_uid): Started to code, I've got to find a way to
- get the date in time_t format and also get the flags
-
- * string-utils.c (strstrcase): Added this convenience function - I
- know about strcasestr() but it's not portable.
-
-2000-06-15 Dan Winship <danw@helixcode.com>
-
- * camel-service.c: Remove camel_service_connect_with_url. (URLs
- must be specified when the service is requested from the session,
- so that there can only ever be one service for any URL.)
-
- * camel-folder.c: (camel_folder_open, camel_folder_is_open,
- camel_folder_get_mode): Kill. Folders are now always open, and
- handle "closing" sorts of operations at sync or finalize time.
- (camel_folder_sync): renamed from camel_folder_close. Syncs state
- to the store but doesn't necessarily close/disconnect.
-
- * providers/*/camel-*-folder.c: Merge "open" methods into "init"
- methods. Rename close to sync and update appropriately.
-
- * providers/imap/camel-imap-store.c: Remove camel_imap_store_open
- and camel_imap_store_close, which should not have been copied from
- the POP provider (where the exist to work around limitations of
- the POP protocol).
-
- * providers/mbox/camel-mbox-summary.c: fix a bug. (don't expunge
- deleted messages if called with expunge == FALSE)
-
- * providers/pop3/camel-pop3-store.c (connect_to_server): Check
- server for various interesting extensions.
-
- * providers/pop3/camel-pop3-folder.c (get_uids): If the server
- supports UIDL, use real UIDs rather than fake ones.
- (etc): Map uids back to numbers appropriately
-
- * providers/mbox/camel-mbox-folder.c (mbox_append_message): Fix to
- previous change: make sure the "seek" variable ends up with the
- value it should.
-
- * providers/mbox/camel-mbox-summary.c (summary_rebuild): Update
- summary mtime as well as size.
-
-2000-06-14 Dan Winship <danw@helixcode.com>
-
- * providers/mbox/camel-mbox-folder.c (mbox_append_message): if the
- mbox doesn't end with a '\n', write one before appending the new
- message.
-
-2000-06-14 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-mime-filter-crlf.c (filter): Updated the encoder to allocate
- more memory (since we are also now adding dots). Also updated the
- decoder as we have found that it sometimes passes the end of the
- buffer.
-
- * providers/pop3/camel-pop3-folder.c (get_message_by_uid): Took out the
- filter code (we already filter in
- camel_pop3_command_get_additional_data)
-
- * camel-folder.c (init): Updated: a separator is now a char* rather
- than a single char because IMAP can have a string for a directory
- separator. Also, since IMAP does not begin with a directory separator,
- there is a new argument (path_begins_with_sep) which decides if a
- directory should begin with a directory separator.
-
- * providers/imap/camel-imap-store.c (imap_create): Since, on connect,
- Camel tries to create INBOX (which already exists on every IMAP
- provider) we can return TRUE when the folder name is "INBOX".
-
- * providers/vee/camel-vee-folder.c (vee_init): Updated.
-
- * providers/imap/camel-imap-folder.c (camel_imap_folder_new): Updated.
-
- * providers/mbox/camel-mbox-store.c (get_folder): Updated.
-
- * providers/mbox/camel-mbox-folder.c (mbox_init): Updated.
-
- * providers/pop3/camel-pop3-folder.c (camel_pop3_folder_new): Updated.
-
-2000-06-14 Dan Winship <danw@helixcode.com>
-
- * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_sync):
- Renamed from camel_mbox_summary_expunge. Takes a gboolean saying
- whether to expunge or just sync the mbox file. Change some
- g_errors to g_warning so we don't abort. Make the quick
- X-Evolution updating code lseek around correctly. Update the
- mbox mtime in the summary file even in the quick case.
-
- * providers/mbox/camel-mbox-summary.h: make
- CAMEL_MESSAGE_FOLDER_NOXEV not conflict with
- CAMEL_MESSAGE_FOLDER_FLAGGED defined in camel-mime-message.h
-
- * providers/mbox/camel-mbox-folder.c (mbox_close): call
- camel_mbox_summary_sync to save flag state if not expunging.
- (mbox_expunge): Update for camel_mbox_summary_expunge rename.
-
-2000-06-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (camel_imap_store_open):
- (camel_imap_store_close): Added.
- (camel_imap_command_extended): Fixed a segfault and updated
- to use camel_imap_status()
- (camel_imap_command): Updated to use camel_imap_status()
- (camel_imap_status): New convenience function for parsing
- the return status of an IMAP command
-
-2000-06-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c (imap_get_message_by_uid):
- Works like the POP fetch code, should work temporarily until
- we get around to coding it the way it "Should Be".
-
- * providers/pop3/camel-pop3-folder.c (get_message_by_uid): Now uses
- the camel-mime-filter-crlf decoder when retrieving messages.
-
- * camel-mime-filter-smtp.c: Deprecated.
-
- * providers/smtp/camel-smtp-transport.c (smtp_data): Updated to use
- camel-mime-filter-crlf with my 'dot' extension in place of
- camel-mime-filter-smtp
-
- * camel-mime-part.c (write_to_stream): Updated to reflect changes
- made to camel-mime-filter-crlf.c
-
- * camel-mime-filter-crlf.c (filter): Modified to be able to
- encode/decode dots ("\n.\n"<->"\n..\n"). Also fixed the decoder
- so that it should no longer get caught in an infinite loop.
-
-2000-06-12 Dan Winship <danw@helixcode.com>
-
- * providers/*/Makefile.am: don't pass a second (incorrect) -rpath
- in addition to the (correct) one automatically provided by
- automake.
-
- * camel-mime-filter-crlf.c: New filter to do CRLF<->LF conversion.
- (Currently only tested in the LF->CRLF direction.)
-
- * camel-mime-part.c (write_to_stream): if content-type is text,
- and it's QP or B64 encoded, pass through the CRLF filter before
- the other filter to satisfy the "canonical encoding" rules in the
- MIME spec.
-
-2000-06-09 Dan Winship <danw@helixcode.com>
-
- * camel-session.c (camel_session_query_authenticator): Add another
- argument, "mode", which can be CAMEL_AUTHENTICATOR_ASK or
- CAMEL_AUTHENTICATOR_TELL, so callers can get the app to un-cache
- bad info.
-
- * providers/pop3/camel-pop3-store.c (pop3_connect): uncache the
- password if it doesn't work.
-
-2000-06-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-stream.c (stream_read): Updated to reflect
- changes made in camel-imap-store.c
-
- * providers/imap/camel-imap-store.c (imap_create): No longer checks to
- make sure a folder doesn't already exists (as this is no longer needed)
- (camel_imap_command): Now takes a CamelFolder argument so it can detect
- whether or not it needs to SELECT a folder or not
- (camel_imap_command_extended): Same.
-
- * providers/smtp/camel-smtp-transport.c (smtp_connect): Will now always
- send EHLO first, if that fails it will fall back on HELO.
- (esmtp_get_authtypes): Should now correctly parse authtypes.
-
-2000-06-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-summary.c: Now builds (not that it's worth
- much yet).
-
- * providers/imap/camel-imap-folder.c (imap_get_uids): Now uses the
- correct cast to a CamelImapMessageInfo structure (should get rid of
- compile warnings).
-
- * providers/imap/Makefile.am: Added rules to build
- camel-imap-stream
-
- * providers/imap/camel-imap-store.c (get_folder): Update.
- Moved imap_create here.
-
- * providers/imap/camel-imap-folder.c (delete_messages): Remove.
- (imap_create): Removed.
- (imap_delete): Removed.
- (imap_exists): Removed.
-
- * providers/imap/camel-imap-stream.h: Added typedef's for the stream
-
- * providers/imap/camel-imap-stream.c: Modified to build cleanly
-
-2000-06-07 Not Zed <NotZed@HelixCode.com>
-
- * camel-mime-utils.c (header_msgid_decode_internal): Properly
- dereference warning/debug messages.
- (header_references_decode): Check we actually have msgid stuff
- before trying to decode it ...
-
-2000-06-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-imap-stream.[c,h]: Removed
-
- * providers/imap/camel-imap-stream.[c,h]: Relocated to this
- location
-
- * providers/imap/camel-imap-summary.c: Added
-
-2000-06-06 Dan Winship <danw@helixcode.com>
-
- * camel-folder.c: Remove exists, create, delete. A CamelFolder
- now always references an existing folder. Remove delete_messages
- too since it wasn't being used. Add a "create" flag to
- get_subfolder saying whether or not to create the subfolder if it
- doesn't yet exist.
-
- * camel-store.c (camel_store_get_folder): Add a "create" flag to
- say whether or not to create the folder if it doesn't yet exist.
- (camel_store_delete_folder): New method, moved from CamelFolder.
- (cache_folder, uncache_folder): Fix up a bit.
- (get_folder_name): Explain what this is for.
-
- * providers/mbox/camel-mbox-folder.c:
- * providers/mbox/camel-mbox-store.c: Update. Remove support for
- hierarchical folders to simplify this for now, since we're not
- using it, and it's not completely clear how they should work in an
- ELocalStorage world. Needs to be revisited.
-
- * providers/pop3/camel-pop3-folder.c (delete_messages): Remove.
- * providers/pop3/camel-pop3-store.c (get_folder): Update.
-
- * providers/vee/camel-vee-folder.c (exists): Remove.
- * providers/vee/camel-vee-store.c (vee_get_folder): Update.
-
-2000-06-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-*.[c,h]: Started on getting
- imap to build cleanly (tho some work has not been completed
- so it still won't build until camel-imap-summary is finished
- along with a few methods in camel-imap-folder)
-
- * camel-stream.[c,h]: Changed the read and write method prototypes
- to return an ssize_t type rather than an int and also changed
- the 'number of bytes' to read or write to a size_t type
-
- * camel-stream-fs.c: same as above
-
- * camel-stream-mem.c: again, same as above
-
- * camel-stream-buffer.c: same
-
- * camel-imap-stream.[c,h]: Added this new stream, cache's previously
- read data so each successive call will instead read from the cache
-
-2000-06-05 Dan Winship <danw@helixcode.com>
-
- * camel-mime-part.c (camel_mime_part_set_disposition): fix
- typo/braino (set "Content-Disposition", not "Content-Description")
- (camel_mime_part_set_filename): const poison
-
-2000-06-02 Not Zed <NotZed@HelixCode.com>
-
- * camel-mime-utils.c (base64_encode_step): Ick, damn signs! Fix a
- bug with sign extended bytes.
-
- * camel-mime-filter-smtp.c (filter): Changed layout/logic slightly
- (to match From filter)
-
-2000-06-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * camel-mime-filter-smtp.c (filter): Fixed the filter so that it
- wouldn't insert garbage under certain conditions.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * camel-session.c: Don't ref the services in the cache.
-
-2000-06-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/smtp/camel-smtp-transport.c: Rearanged where debug
- fprintf statements we placed so that any data the server sends
- back is printed out before an exception is set and the function
- returns.
-
-2000-06-02 Not Zed <NotZed@HelixCode.com>
-
- * camel-mime-utils.c (header_decode_date): If we get a funny
- result, just throw it out. Basically a fix for the one true
- broken TradeClient.
-
-2000-06-01 Not Zed <NotZed@HelixCode.com>
-
- * camel-folder-summary.c (message_info_free): Free
- references/messsage id.
- (message_info_save): Save them.
- (message_info_load): Load them.
- (message_info_new): And get them from the new message.
- (CAMEL_FOLDER_SUMMARY_VERSION): Bumped for new changes.
-
- * camel-folder-summary.h: Added references and messageid to
- summary.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * camel-session.c: Ref and unref objects in the service cache
- properly.
-
- * camel-store.c: Ref the folder when returning it using
- lookup_folder. Used the folder's full name for the key for the
- folder cache since that's used to uncache it.
-
-2000-06-02 Dan Winship <danw@helixcode.com>
-
- Fun with purify.
-
- * providers/pop3/camel-pop3-store.c (pop3_connect): free msg on
- success as well as failure.
- (camel_pop3_command_get_additional_data): free buf after reading
- the last line (".").
-
- * providers/pop3/camel-pop3-folder.c (get_message_by_uid): free
- body data after creating the memstream from it (which will copy
- the data).
-
- * providers/mbox/camel-mbox-folder.c (mbox_finalize): free summary
- and index paths.
-
- * camel-data-wrapper.c (finalize): unref the stream, if it exists.
-
-2000-06-01 Not Zed <NotZed@HelixCode.com>
-
- * camel-mime-part.c (construct_from_parser): For a message part,
- set the default content-type to message/rfc822. Maybe needs to be
- done for multiparts too?
-
-2000-05-31 Not Zed <NotZed@HelixCode.com>
-
- * camel-mime-message.c (construct_from_parser): Typo in assersion.
-
- * camel-mime-parser.c (folder_scan_step): Use a default type of
- message/rfc822 for multipart/digest. Bug Z192.
- (folder_scan_drop_step): Remove warning.
-
-2000-05-30 Not Zed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-folder.c (mbox_append_message): Init
- filter_from to NULL, for exception case.
- (mbox_get_message_by_uid): Cast off_t to long int for diagnostics.
-
- * camel-url.c (camel_url_hash): Hash funciton for using camel
- url's as hash keys.
- (camel_url_equal): equal function for same.
-
- * camel-session.c (camel_session_finalise): Free cached services.
- (camel_session_init): Init service cache.
- (service_cache_remove): destroy callback to remove a service from
- the cache.
-
- * camel-store.c (get_folder_internal): Remove the extra ref of the
- folder. That seems the right behaviour ...?
- (camel_store_get_type): Doh, actually call store init, so the
- cache works.
- (cache_folder): strdup the folder name! no wonder it never found
- it again.
-
-2000-05-30 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-folder.c: Implemented a few more
- methods like imap_append and 1 or 2 others
-
-2000-05-29 Not Zed <NotZed@HelixCode.com>
-
- * camel-store.c (camel_store_init): Move it to here. If this
- level is going to maintain it, it should set it up. Lets see what
- caching folders breaks :(
-
- * providers/pop3/camel-pop3-store.c (camel_pop3_store_init): Dont
- init folder cache here.
-
- * providers/mbox/camel-mbox-summary.c
- (camel_mbox_summary_expunge): Make sure we copy messages which are
- still intact to the new folder.
- (camel_mbox_summary_expunge): Update the frompos as well when
- moving the content.
- (camel_mbox_summary_expunge): Remove some debug, and dont offset
- frompos?
-
- * providers/vee/camel-vee-folder.c (vee_folder_build): Check the
- searched folder is open before trying to search it.
- (message_changed): Track changes to the source message in the
- summary.
- (folder_changed): Track folder changes, re-query the folder that
- changed, and cascade the changed event as well.
- (camel_vee_folder_finalise): Free subfolder and subfolder summary.
-
-2000-05-29 Dan Winship <danw@helixcode.com>
-
- * camel-service.c (camel_service_new): Fix up some glib
- precondition stuff. Try to set the URL in camel_service_new before
- checking whether or not it's "empty" so that you can successfully
- set "sendmail:" as a URL.
-
-2000-05-28 Dan Winship <danw@helixcode.com>
-
- * camel-provider.h: Add a domain field to CamelProvider, to say
- what kind of data it provides.
-
- * providers/imap/camel-imap-provider.c:
- * providers/mbox/camel-mbox-provider.c:
- * providers/pop3/camel-pop3-provider.c:
- * providers/sendmail/camel-sendmail-provider.c:
- * providers/smtp/camel-smtp-provider.c: Set domain to "mail".
-
- * providers/nntp/camel-nntp-provider.c: Set domain to "news".
-
- * providers/vee/camel-vee-provider.c: Set domain to "vfolder". (So
- it doesn't end up being listed as a potential mail source in the
- mail config wizard.)
-
- * providers/pop3/camel-pop3-store.c: Split apart password and APOP
- auth, since some servers seem to do both, but don't really.
- (connect_to_server): Renamed from try_connect. Now actually does
- the connection up to the point of checking the greeting for APOP
- support.
- (query_auth_types): Return APOP, if appropriate. Call
- pop3_disconnect after connect_to_server since we don't really want
- to be connected.
- (pop3_connect): Use connect_to_server rather than duplicating
- code. Fix a one-byte buffer overrun in the APOP code.
- (pop3_disconnect): Make this able to clean up after a partial
- connect.
- (connect_to_server): Remove port number from error message since
- it's not terribly useful and we were getting it from the wrong
- place anyway.
-
- * camel-mime-utils.c (header_address_list_format_append): Use
- `foo@bar' rather than `"" <foo@bar>' for email addresses with no
- name component.
-
-2000-05-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c: Removed
- camel_imap_command_get_additional_data() as it was
- completely useless, replaced with
- camel_imap_command_extended() which may eventually replace
- camel_imap_command() as well.
-
- * providers/imap/camel-imap-store.h: Modified to reflect
- changes made to camel-imap-store.c
-
- * providers/imap/camel-imap-folder.c: Wrote the first of many
- methods: camel_imap_init(), imap_open(), imap_expunge(),
- imap_get_message_count(), and imap_get_subfolder_names()
-
-2000-05-26 Dan Winship <danw@helixcode.com>
-
- * camel-multipart.c (camel_multipart_init): Don't set a default
- boundary. Require the caller to do that.
- (set_boundary): if boundary is NULL, generate a "random" boundary.
-
- * camel-mime-part-utils.c
- (camel_mime_part_construct_content_from_parser): Add a call to
- camel_multipart_set_boundary after creating a new multipart.
-
-2000-05-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap/camel-imap-store.c (try_connect): Removed
- Exception code - Pop doesn't seem to set exceptions
-
- * providers/imap/camel-imap-folder.c: Initial code, mostly
- just a template for future code
-
- * providers/imap/imap.[c,h]: Source code from my personal
- mailer - for reference only!
-
-2000-05-25 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-part-utils.c
- (camel_mime_part_construct_content_from_parser): Replace simple
- data wrapper here too, oops.
-
- * Makefile.am (libcamel_la_SOURCES): Removed
- camel-simple-data-wrapper again. Less code to maintain == better
- code.
-
- * camel-data-wrapper.c (construct_from_stream): Fixes for bug
- where text attachments dont work. Made data-wrapper concrete for
- the second time.
-
-2000-05-23 NotZed <NotZed@HelixCode.com>
-
- * providers/vee/camel-vee-folder.c (vee_folder_build_folder):
- Update the vfolder details for a single folder.
-
-2000-05-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/smtp/camel-smtp-transport.c (_send_to): Took out code
- that had been there to reconnect to the server if it was not
- already connected - Mailer code was fixed so that this should not
- be needed.
-
- * providers/imap/camel-imap-store.[c,h]: Initial code.
-
-2000-05-24 Dan Winship <danw@helixcode.com>
-
- * camel.h: Re-add camel-simple-data-wrapper.h, which was removed
- for some reason.
-
-2000-05-24 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/smtp/camel-smtp-transport.[c,h]: Moved global
- variables into struct CamelSmtpTransport to make SMTP
- thread-safe
-
- * providers/imap/camel-imap-*.h: Stolen from Mbox. Rough structure
- for Imap.
-
-2000-05-23 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/imap: Added some initial code to the camel tree
- for IMAPv4
-
- * providers/imap/.cvsignore: Added to repository
-
- * providers/smtp/camel-smtp-transport.c: Added debug fprintf's
- so that testers can provide more information. Tested with simple
- messages and a reply to the hello@helixcode.com default message
- but should really be tested more.
- (smtp_data): Fixed to use data_wrapper_write_to_stream.
-
- * camel-mime-filter-smtp.c (filter): Modified to escape all lines
- beginning with a '.' and to place a \r before each \n if one did
- not previously exist. Removed code to escape "From " as it was
- found to not be needed for SMTP.
-
-2000-05-22 Jeffrey Stedfast <fejj@helixcode.com>
-
- * providers/smtp/camel-smtp-transport.c (smtp_data): Fixed the
- filtered stream. Fixes for stream changes, updated to use
- camel-mime-filter-smtp.
-
- * Makefile.am: Added camel-mime-filter-smtp.c
-
- * camel-mime-filter-smtp.[c,h]: Added to camel tree
- Smtp filter used to change \n into \r\n, escape lone dots,
- and escape "From "'s.
-
-2000-05-19 NotZed <NotZed@HelixCode.com>
-
- * camel-simple-data-wrapper.c (construct_from_stream): If we
- already have been constructed, unref our content.
- (write_to_stream): Check we've been constructued, and change for
- stream api changes.
-
- * camel-mime-parser.c: Removed exception stuff.
-
- * md5-utils.c (md5_get_digest_from_stream): repaired.
-
- * camel-mime-message.c: Remove exception from write_to_stream, and
- fix, and fix formatting.
-
- * providers/sendmail/camel-sendmail-transport.c (_send_internal):
- Fix for stream changes.
-
- * providers/pop3/camel-pop3-store.c (camel_pop3_command): Fixes
- for stream changes.
-
- * providers/mbox/camel-mbox-folder.c, and elsewhere, fix all
- stream api changes.
- (mbox_append_message): Use stream_close() now its back.
- (mbox_append_message): unref the from filter.
-
- * camel-stream-mem.c: And here.
-
- * camel-stream-fs.[ch]: Here too.
-
- * camel-stream-filter.c: Likewise. This is getting tedious.
-
- * camel-stream-buffer.c (stream_write): Fix a few little problems.
- (stream_close): Reimplement.
- (camel_stream_buffer_read_line): Slightly more efficient version,
- that also only allocates the right amount of memory for strings.
-
- * camel-seekable-substream.c: Likewise.
-
- * camel-seekable-stream.[ch]: Remove exceptions, fix formatting,
- changes for stream (re)fixes. set_bounds returns an error.
-
- * camel-stream.[ch]: Remove exceptions. Make flush and reset return
- an error code, repair all the screwed up formatting, and put back
- close.
-
- * camel-mime-part-utils.c
- (camel_mime_part_construct_content_from_parser): And here.
-
- * camel-mime-part.c (camel_mime_part_set_content): And this too.
- (write_to_stream): Fixed for stream changes.
-
- * camel.h: Fixed.
-
- * providers/vee/camel-vee-folder.c (vee_search_by_expression):
- Implement. Performs an intersection of the two searches.
- (camel_vee_folder_finalise): Unref search folders.
- (vee_append_message): Implement append.
-
-2000-05-18 Dan Winship <danw@helixcode.com>
-
- * camel-folder.c: remove message_number_capability and require uid
- capatibility.
- (camel_folder_list_subfolders, camel_folder_get_uid_list,
- camel_folder_get_subfolder_info, camel_folder_get_message_info):
- removed
- (camel_folder_get_subfolder_names,
- camel_folder_free_subfolder_names): new subfolder interfaces.
- (camel_folder_get_uids, camel_folder_free_uids): new uid
- interfaces
- (camel_folder_get_summary, camel_folder_free_summary): new summary
- interfaces
-
- * providers/mbox/camel-mbox-folder.c,
- * providers/nntp/camel-nntp-folder.c:
- * providers/vee/camel-vee-folder.c: Update for changes
-
- * providers/pop3/camel-pop3-folder.c: Implement get_uids, update
- for other changes.
-
-2000-05-18 NotZed <NotZed@HelixCode.com>
-
- * providers/vee/camel-vee-folder.c: Guess!
-
- * camel-folder-search.c (search_user_flag): Implement user_flag
- search term.
-
- * camel-folder-search.h: Added user_flag search capability
- (user-flag "blah")
-
- * providers/mbox/camel-mbox-folder.c (mbox_init): Set USER flag in
- permanent flags for the folder.
-
-2000-05-17 Dan Winship <danw@helixcode.com>
-
- * camel-folder.c: Remove unused async open/close and
- copy_message_to functions.
- Rename functions without initial _. Fix glib preconditions and
- gtk-doc comments.
-
-2000-05-17 Dan Winship <danw@helixcode.com>
-
- * camel-data-wrapper.c: remove get/set_output_stream operations.
- They're redundant with write_to_stream, and CamelMimePart and
- CamelMimeMessage only implement the latter, meaning that trying to
- get_output_stream on a CamelMimeMessage that was built from pieces
- rather than being parsed from a stream doesn't work. Anything that
- uses get_output_stream can be rewritten to use write_to_stream, so
- we'll standardize on that.
- (camel_data_wrapper_new): remove this: CamelDataWrapper is
- supposed to be an abstract class.
- (write_to_stream): remove default implementation. (Moved to
- CamelSimpleDataWrapper)
-
- * camel-simple-data-wrapper.c: resurrect, although it's not really
- the same thing it was before. A simple data wrapper, which is
- backed by a CamelStream.
-
- * camel-mime-part-utils.c
- (simple_data_wrapper_construct_from_parser): Use
- construct_from_stream rather than set_output_stream.
- (camel_mime_part_construct_content_from_parser): Change
- camel_data_wrapper_new to camel_simple_data_wrapper_new.
-
- * camel-mime-part.c (camel_mime_part_set_content): Change
- camel_data_wrapper_new to camel_simple_data_wrapper_new.
-
-
-2000-05-17 Darin Adler <darin@eazel.com>
-
- * camel-folder-summary.c: (message_info_load):
- Quick fix to get it to compile. I hope I don't get into trouble.
-
-2000-05-17 Dan Winship <danw@helixcode.com>
-
- * camel.h: Don't include the no-longer-distributed
- possibly-to-be-removed headers.
-
- * providers/smtp/camel-smtp-transport.c
- (smtp_get_email_addr_from_text): fix an off-by-one error in
- address parsing
- (smtp_data): use camel_data_wrapper_get_output_stream rather than
- data_wrapper->output_stream
-
-2000-05-17 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-folder.c (message_changed): Snoop
- changes to user flags on the message into the summary as well.
-
- * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_init):
- Changed version init to include the parent class version info
- (i.e. add it not overwrite it).
-
- * camel-folder-summary.c (message_info_new): Initialise user_flags
- to empty.
- (message_info_load): And load user flags.
- (message_info_save): And save user flags.
- (message_info_free): And free them.
- (CAMEL_FOLDER_SUMMARY_VERSION): Bumped file revision.
-
- * camel-folder-summary.h: Added user-flags to summary.
-
- * camel-mime-message.c (camel_mime_message_set_user_flag): Dont
- use a hashtable for user flags.
- (camel_mime_message_get_user_flag): And changed here too.
- (camel_flag_get): New interface to get a flag from a flag
- list. Flag lists are easier to work with than hash tables, and
- save memory too.
- (camel_flag_set): And set.
- (camel_flag_list_free): And free.
- (free_key_only): Discard.
- (finalize): Remove the flag list.
-
-2000-05-17 Jeffrey Stedfast <fejj@stampede.org>
-
- * providers/smtp/camel-smtp-transport.c: (smtp_helo): Error
- checking on gethostbyaddr() eliminating a possible segfault.
-
-2000-05-16 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-folder.c (mbox_delete_message_by_uid):
- Implement.
-
-2000-05-12 NotZed <NotZed@HelixCode.com>
-
- * camel-movemail.c (camel_movemail): Open the destination with
- O_APPEND, so we dont blow away a partially transferred mbox.
- (camel_movemail): Loop if we get errno=INTR, and not fail.
-
-2000-05-11 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-summary.c (summary_rebuild): Update
- the summarised file size, if everything went ok.
- (camel_mbox_summary_expunge): Clear header flags after updating.
-
-2000-05-16 Chris Toshok <toshok@helixcode.com>
-
- * providers/nntp/camel-nntp-folder.c:
- * providers/nntp/camel-nntp-folder.h:
- * providers/nntp/camel-nntp-provider.c:
- * providers/nntp/camel-nntp-store.c:
- * providers/nntp/camel-nntp-utils.c:
- * providers/nntp/camel-nntp-utils.h:
- get things working with new camel summary stuff.
-
- * providers/nntp/camel-nntp-summary.c:
- * providers/nntp/camel-nntp-summary.h:
- removed files since camel-folder-summary does all we need.
-
-2000-05-15 Jeffrey Stedfast <fejj@stampede.org>
-
- * providers/smtp/camel-smtp-transport.c: Added some preliminary
- AUTH support.
-
-2000-05-15 Dan Winship <danw@helixcode.com>
-
- * camel-folder.h: Remove camel_folder_get_summary, which no longer
- exists.
-
-2000-05-11 Dan Winship <danw@helixcode.com>
-
- * Makefile.am: remove some cruft that we're not currently using.
-
- * camel-stream-mem.c (camel_stream_mem_new_with_buffer): Change
- to match prototype (size_t vs unsigned int) so it works on 64-bit
- machines. Noted by msw.
-
-2000-05-11 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-folder.c (message_changed): Indicate
- the summary changed also.
-
-2000-05-11 Jeffrey Stedfast <fejj@stampede.org>
-
- * providers/smtp/camel-smtp-transport.c: (smtp_helo):
- Updated to more closely comply with RFC 821 standards
-
-2000-05-11 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-part.c (write_to_stream): Unref the filter after
- adding it to the filtering stream.
-
- * providers/mbox/camel-mbox-summary.c
- (camel_mbox_summary_finalise): Free the folder path.
- (camel_mbox_summary_update): Also save summary when done.
- (camel_mbox_summary_expunge): Unindex items when deleting them.
- (camel_mbox_summary_expunge): Save the index as well as the
- summary.
-
- * camel-folder-summary.c (camel_folder_summary_finalise): Free the
- summary path.
- (camel_folder_summary_touch): New function, indicate the summary
- info changed.
- (camel_folder_summary_remove): Dirty here.
-
- * camel-internet-address.c (internet_decode): Free multiple entry
- addresses properly.
-
- * camel-mime-utils.c (header_decode_mailbox): Plugged another
- memleak, free text after converting it.
- (header_decode_addrspec): More leaks plugged.
-
- * camel-mime-message.c (finalize): Free message_uid.
- (finalize): Free the recipients hashtable.
-
-2000-05-11 <notzed@helixcode.com>
-
- * camel-folder-summary.c (camel_folder_summary_finalise): Free
- summary items and charset filters.
-
-2000-05-10 <notzed@helixcode.com>
-
- * camel-folder-summary.c (camel_folder_summary_finalise): Don't
- free stuff in p, after we've free'd p.
-
- * providers/mbox/camel-mbox-folder.c (mbox_append_message): Unref
- the stream we created for appending.
-
-2000-05-10 Jeffrey Stedfast <fejj@stampede.org>
-
- * providers/smtp/camel-smtp-transport.c: (camel_smtp_transport_class_init):
- Added initialization for service_class
-
-2000-05-10 Dan Winship <danw@helixcode.com>
-
- * camel-multipart.c (write_to_stream): fix a stupid typo. Thank
- you, C.
-
- * camel-mime-part.c (write_to_stream): don't ref the stream before
- wrapper a filter around it, since nothing will ever unref it.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added camel-types.h, camel-folder-pt-proxy.h, and
- camel-thread-proxy.h.
-
-2000-05-09 Dan Winship <danw@helixcode.com>
-
- * providers/sendmail/camel-sendmail-transport.c (_send_internal):
- Bleah. Can't fsync a pipe. As a quick kludge, just don't
- stream_flush it. The right fix will require bringing back
- stream_close though.
-
-2000-05-09 Jeffrey Stedfast <fejj@stampede.org>
- * camel-internet-address.[c,h]: Undid my changes (moved
- struct _address back into came-internet-address.c)
- * providers/smtp/camel-smtp-transport.c: (_send): changed
- from using it's own address manipulation (using struct _address)
- to using camel_internet_address_get(). Also some format changes
- to keep consistant with the rest of Camel
-
-2000-05-09 Jeffrey Stedfast <fejj@stampede.org>
-
- * camel-internet-address.[c,h]: Moved struct _address from
- camel-internet-address.c to camel-internet-address.h
- (hopefully this doesn't break anything...)
- * providers/smtp/camel-smtp-transport.c: (_send): now
- populates the recipient list with To, Cc, and Bcc addresses.
- Should now be able to use this module.
-
-2000-05-09 Dan Winship <danw@helixcode.com>
-
- * providers/mbox/camel-mbox-folder.c (mbox_get_message_by_uid):
- one more refcounting fix I missed before.
-
-2000-05-08 Jeffrey Stedfast <fejj@stampede.org>
-
- * providers/smtp/camel-smtp-transport.c: no longer frees memory it
- shouldn't, updated to reflect camel-stream changes involving
- CamelException (perhaps it should use a different CamelException
- variable than is passed to the camel smtp module?)
-
-2000-05-08 Dan Winship <danw@helixcode.com>
-
- * camel-stream.c (camel_stream_read, camel_stream_write,
- camel_stream_flush, camel_stream_reset, camel_stream_printf,
- camel_stream_write_to_stream): Use CamelException to signal
- failure.
- (camel_stream_write_strings): Remove. camel_stream_printf is more
- useful in most of the places that used this.
- (camel_stream_write_string): Change from macro to function to
- prevent problems with double-evaluation.
-
- * camel-seekable-stream.c (camel_seekable_stream_seek,
- camel_seekable_stream_set_bounds): Use CamelException.
- (reset): Update.
-
- * camel-seekable-substream.c, camel-stream-buffer.c,
- camel-stream-filter.c, camel-stream-fs.c, camel-stream-mem.c:
- Update.
-
- * camel-stream-fs.c: Remove the virtual init functions and move
- the code into the creator functions. Add CamelExceptions to
- creation functions that could fail.
-
- * camel-data-wrapper.c (camel_data_wrapper_write_to_stream): Use
- CamelException.
- * camel-mime-message.c, camel-mime-part.c, camel-multipart.c
- (write_to_stream): Update.
-
- * camel-mime-parser.c: add an exception to the mime parser private
- data and pass that to stream functions as needed.
-
- * gmime-content-field.c, md5-utils.c: Update (badly) for stream
- changes.
-
- * camel-exception.h (camel_exception_is_set): convenience macro.
-
- * providers/Makefile.am: disable SMTP for now
-
- * providers/mbox/camel-mbox-folder.c (mbox_append_message): Pass
- CamelException to the functions that now need it. Check the
- exception after calling camel_stream_flush, and fail if it fails.
- (mbox_get_message_by_uid): More updates.
-
- * providers/pop/camel-pop3-folder.c,
- providers/pop/camel-pop3-store.c,
- providers/sendmail/camel-sendmail/transport.c: Update.
-
-
-2000-05-08 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-message.c (process_header): Format From and Reply-To
- to at least a decoded string. Should probably store them as an
- camelinternetaddress.
-
- * Merged NEW_SUMMARY branch back to trunk, and resolved conflicts.
-
- * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_update):
- Return status.
- (camel_mbox_summary_expunge): Force an update of the summary
- before we do anything.
- (camel_mbox_summary_expunge): Build new xev line in xevnew, and
- free that, and consify xev.
- (camel_mbox_summary_load): If we are rebuilding from scratch, make
- sure we clear the summary content.
-
- * camel-stream-filter.c (do_close): We NEED a stream close.
-
-2000-05-07 Dan Winship <danw@helixcode.com>
-
- Make camel not leak like a sieve.
-
- * camel-object.c: New subclass of GtkObject which is now the base
- of the Camel object hierarchy. Currently the only difference
- between CamelObject and GtkObject is that CamelObjects don't start
- out floating.
-
- * *.h: Move a bunch of typedefs to camel-types.h. Standardize on
- using <camel/foo.h> in header files rather than <foo.h>, "foo.h",
- or "camel/foo.h". Remove some unneeded includes.
-
- * camel-address.c, camel-data-wrapper.c, camel-folder-search.c,
- camel-folder-summary.c, camel-folder.c, camel-mime-filter.c,
- camel-mime-parser.c, camel-service.c, camel-session.c,
- camel-stream.c: These are now subclasses of CamelObject.
-
- * camel-data-wrapper.c (set_output_stream):
- * camel-medium.c (set_content_object):
- * camel-seekable-substream.c
- (init_with_seekable_stream_and_bounds):
- * providers/mbox/camel-mbox-folder.c (mbox_get_message_by_uid):
- remove gtk_object_sink calls.
-
- * camel-stream-buffer.c (init_vbuf):
- * camel-stream-filter.c (camel_stream_filter_new_with_stream):
- ref the original stream.
-
- * camel-folder-summary.c (camel_folder_summary_finalise): unref
- the filters when finalizing.
-
- * camel-mime-part-utils.c
- (simple_data_wrapper_construct_from_parser,
- camel_mime_part_construct_content_from_parser):
- * camel-mime-part.c (camel_mime_part_set_content): Unref objects
- that are created only to be handed off to other objects. If
- they're going to be needed later, they will have been additionally
- ref'ed by the object that needs them.
-
- * providers/pop3/camel-pop3-folder.c (get_message_by_number):
- unref the message stream after creating the data from it.
-
- * camel-stream.c, camel-stream-buffer.c, camel-stream-filter.c,
- camel-stream-fs.c, camel-stream-mem.c: Remove camel_stream_close,
- since its semantics are dubious (what happens when you close a
- stream other people still have references on?).
-
- * providers/nntp/camel-nntp-store.c:
- * providers/smtp/camel-smtp-transport.c:
- * providers/pop3/camel-pop3-store.c:
- replace camel_stream_close calls with gtk_object_unref.
-
- * providers/mbox/camel-mbox-folder.c:
- * providers/nntp/camel-nntp-folder.c:
- * providers/sendmail/camel-sendmail-transport.c:
- replace camel_stream_close with camel_stream_flush +
- gtk_object_unref
-
-2000-05-06 Dan Winship <danw@helixcode.com>
-
- * providers/pop3/camel-pop3-store.c (query_auth_types): A machine
- which serves neither POP nor KPOP is not a POP server.
-
- * providers/smtp/camel-smtp-provider.c: Note in the description
- that this provider is not yet tested.
-
-2000-05-08 <notzed@helixcode.com>
-
- * camel-mime-part.c (write_to_stream): Free the filter stream when
- done.
-
- * camel-mime-parser.c (folder_seek): Make sure we add the \n
- terminal when we seek as well (frob!).
-
- * camel-mime-utils.c (header_decode_addrspec): Plug minor memleak.
-
- * camel-mime-part.c (finalize): Free header tables once finished.
-
- * camel-folder-summary.c (camel_folder_summary_remove): Dont try
- to access info after its free'd.
-
-2000-05-07 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-part.c (write_to_stream): Apply encoding to content
- part, when writing to a stream *sigh*.
-
- * camel-stream-filter.c (do_write): implement write for the
- filtering stream. Writes shouldn't be mixed with reads.
- (do_flush): Implemented flush. Again write/flush shouldn't be
- mixed with reads. Only flushes if the last op was write.
- (do_close): Force flush on close.
-
- * camel-mime-filter.c (filter_run): Oops, make sure we include the
- backlen in the total length before passing onto the filter.
-
- * camel-mime-filter-from.c: New filter, munges 'From ' lines into
- '>From ', for mbox.
-
- * camel-mime-parser.c (camel_mime_parser_header_remove): New
- function to remove the parser's raw header, rather than
- manipulating the header directly (wich doesn't work with
- mempools).
-
- * camel-mime-utils.c (header_address_list_clear): Fixed some
- broken(tm) logic, which would leak entries on multivalued lists.
-
- * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_load):
- Use ibex_save() to save the ibex. Makes a big difference to
- startup times for very large mailboxes.
- (camel_mbox_summary_expunge): Dum de dum, reimplemented. Designed
- to be much more robust, and to stop immediately if anything awry
- happens.
- (copy_block): Utility function to copy n bytes from one fd to
- another.
- (header_write): Utility function to write out raw headers to an
- fd.
- (camel_mbox_summary_update): Incremental summary updater.
-
- * providers/mbox/camel-mbox-folder.c (mbox_get_message_by_uid):
- Dont unref the stream, because of the broken(tm) ref model of gtk
- widget that for some odd reason is being perpetuated in camel.
- (mbox_expunge): Reenable expunge again.
- (mbox_append_message): Removed the optimised mbox append. If its
- an issue, it can go back later. Cleaned up a lot, checks error
- returns, and automagically translates 'From ' into '>From' as
- necessary.
-
-2000-05-07 <notzed@helixcode.com>
-
- * camel-mime-filter.c (filter_run): Oops, forgot to add the
- backlen to the pre-buffer (*poof*).
-
-2000-05-07 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-message.c (construct_from_parser): Allow
- HSCAN_FROM_END to terminate the processing of a message.
-
- * camel-folder-summary.c (perform_content_info_load): Ick, dont
- try and append a node onto its own list.
- (camel_folder_summary_clear): Actually clear the indexes after
- we've removed the messages.
- (camel_folder_summary_clear): Set dirty if it changes.
- (camel_folder_summary_load): Clear dirty.
- (camel_folder_summary_save): Only save if dirty.
-
- * providers/mbox/camel-mbox-summary.c (summary_header_load): Oops,
- remember to call that parent class first ...
- (summary_header_save): Here too.
- (camel_mbox_summary_load): Do more checking to verify the index
- contents as well as teh summary contents, against the mbox
- contents.
- (camel_mbox_summary_load): Removed some fo that checking, it needs
- more code to work reliably.
-
-2000-05-07 <notzed@helixcode.com>
-
- * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_load):
- Set the size and mtime of the mbox we indexed once done.
-
- * camel-folder-summary.c (camel_folder_summary_set_index): Dont
- write the index if it changes - let the claler fix it (uh, kind of
- impacts performance).
- (camel_folder_summary_load): close in.
-
- * camel-folder-summary.c (summary_format_string): Check header
- exists before trying to strip its leading spaces.
-
-2000-05-06 NotZed <NotZed@HelixCode.com>
-
- * camel-folder.h: Removed summary info from here, and include
- camel-folder-summary.h as well.
-
- * camel-mime-parser.c (camel_mime_parser_step): Allow it to accept
- a NULL databuffer.
-
- * providers/mbox/camel-mbox-summary.c: Totally new file, now
- subclasses camel-folder-summary.
-
- * camel-folder-summary.c (message_info_load): Load the uid as a
- string.
- (message_info_save): And save too.
- (camel_folder_summary_clear): New function, clears the contents of
- the summary.
-
- * providers/mbox/camel-mbox-folder.c: Fixes for summary changes.
- (mbox_get_message_by_uid): Completely redone. Now cross-checks
- the summary information to make sure we get a real message.
- (mbox_append_message): Disabled the copy version of append for
- now.
- (mbox_expunge): Temporarily disabled the expunge function, until
- it is put back in camel-mbox-summary.c
-
-2000-05-05 NotZed <NotZed@HelixCode.com>
-
- * camel-folder-summary.c: And same here ...
- (camel_folder_summary_encode_fixed_int32): Ugh, fwrite doesn't
- return -1 on error ..
- (camel_folder_summary_decode_fixed_int32): Neither deos fread.
- (camel_folder_summary_encode_token): Fix here too.
- (summary_build_content_info): Use start-headers to get the pos of
- the message, not parser_tell(), which might not be what we
- expected because of parser_unstep().
- (camel_folder_summary_encode_token): Use bserch() to tokenise the
- values, rather than a linear search.
-
- * camel-mime-utils.c: Defined out some memory profiling stuff I
- left there by mistake.
- (header_decode_mailbox): Dont try to append the word part of a
- local address if we ran out of words.
-
- * camel-mime-parser.c (folder_scan_content): Apply the fix from
- the header scanner to here too.
- (folder_scan_header): Only check for end of header if we have
- space for it (didn't end the read with a newline)
- (folder_scan_header): inptr is the only real thing we need
- registerised for performance. Try to help the compiler be smart
- about it ..
- (folder_scan_header): Simplified the save header case a tad.
-
- Commented out some memory profiling stuff.
-
-2000-05-05 <notzed@helixcode.com>
-
- * camel-mime-utils.c (header_decode_mailbox): Plug a memory leak.
- (header_decode_text): Fixed memory leaks with g_string_append().
- (header_encode_string): And here too, and a few other places. The
- glib api is so awful ...
- (header_content_type_decode): More memory leaks.
-
-2000-05-05 <notzed@helixcode.com>
-
- * camel-mime-parser.c (folder_scan_init_with_fd): Make sure we
- init the end of buffer sentinal!
- (folder_scan_init_with_stream): And here too ...
-
-2000-05-04 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-folder.c (summary_get_message_info):
- Maxcount is minimum of the max and the requested count, not the
- maximum :)
-
- * camel-mime-parser.c (folder_scan_content): Properly set midline,
- so we dont falsely catch offset boundary markers (i.e. From inside
- content).
- (folder_read): Set a sentinal on the end of the read data (\n) so
- we dont have to check the buffer boundary in the inner loop.
- (mempool_*): New experimental memory management routines, speed
- up simple structure parsing by about 25% ... not compiled in by
- default. Something similar may be needed for camel-mime-utils to
- address performance issues with g_malloc and friends.
-
- * camel-mime-utils.c: Added a macro w(x) used to wrap all warnings
- about mime/rfc violations, so they can be turned off.
-
- * camel-folder-summary.c (summary_build_content_info): Step after
- the end of a message ...
- Turn into a stand-alone program for testing and profiling.
-
-2000-05-04 Dan Winship <danw@helixcode.com>
-
- * providers/pop3/camel-pop3-store.c (pop3_connect): Don't fall
- back to plaintext passwords if APOP fails, since it should also
- fail.
-
-2000-05-04 Dan Winship <danw@helixcode.com>
-
- * camel-session.c (camel_session_list_providers): New function to
- replace camel_provider_scan. Returns a list of either (a) all
- currently-loaded providers, or (b) all available providers.
-
- * camel-url.[ch]: Add an "empty" flag to CamelURL (indicating that
- it contains only a protocol).
-
- * camel-service.c (camel_service_query_auth_types): Make this take
- a CamelException (since it may have to try to connect to the
- server, and it might not able to.)
-
- * providers/pop3/camel-pop3-store.c: add KPOP (Kerberized POP)
- support. This is mostly so I have two kinds of authmech to play
- with instead of just one. (But it does actually work.)
-
- * providers/smtp/camel-smtp-transport.c (query_auth_types): update
- for prototype change, but disable the functionality, since it
- doesn't really support any auth types yet.
- (camel_smtp_transport_get_type): add an object init function to
- set the service url_flags.
-
-2000-05-04 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-summary.c: Yes, and anotherone.
-
- * camel-mime-utils.c: And another one.
-
- * camel-mime-part.c: And another one.
-
- * camel-mime-part-utils.c: And another one.
-
- * camel-folder-search.c: And another one.
-
- * camel-mime-parser.c: Reverted a change wihtout a ChangeLog entry.
-
-2000-05-04 NotZed <NotZed@HelixCode.com>
-
- * camel-folder-summary.[hc]: Yes, CamelFolderSummary is back ...
- ... re-usable class to summarise and index any stream or message
- and to manage/load/save the created summaries.
-
- * camel-folder.c: Include string.h to kill a warning.
-
-2000-05-03 Jason Leach <leach@wam.umd.edu>
-
- * Makefile.am (INCLUDES): add $(UNICODE_CFLAGS) to the INCLUDES,
- people who installed libunicde in non-standard include paths need
- this.
-
-2000-05-03 NotZed <NotZed@HelixCode.com>
-
- * camel-folder.h: Added pos/bodypos/endpos to the basic message
- content info object. Size to be removed? Moved the
- messageconentinfo and messageinfo back to camel-folder-summary.h.
-
- * camel-mime-filter-index.c (camel_mime_filter_index_set_ibex):
- New function to (re)set the index to use on a filter.
-
- * camel-mime-parser.c (camel_mime_parser_scan_from): Whole bunch
- of inline docs.
- (camel_mime_parser_drop_step): New function to drop a state from
- the parser. Needs more testing.
-
- * camel-mime-utils.c (rfc2047_decode_word): If the iconv handle is
- -1, then dont try and convert (crashes unicode_iconv?).
- (rfc2047_decode_word): Use alloca for variables instead of
- g_malloc - by the rfc they should always be short.
- (rfc2047_decode_word): If we can't do the charset conversion, undo
- the quoted-printable/base64 at least? Should probably convert
- unknown characters to the utf-8 unknown character.
-
-2000-05-02 Larry Ewing <lewing@helixcode.com>
-
- * camel-mime-utils.c (header_decode_date): fix typo when
- dereferencing saveoffset.
-
-2000-05-02 NotZed <NotZed@HelixCode.com>
-
- * camel-folder-search.c: Added some header doco.
-
- * camel.h: REmove gmime-utils.h from here.
-
- * providers/mbox/camel-mbox-search.[ch]: Removed. Functionally
- redundant.
-
- * providers/mbox/camel-mbox-folder.c (mbox_search_by_expression):
- Use the new CamelFolderSearch class to do the actual searching,
- just setup the search here.
-
- * camel-folder-search.[ch]: A helper class that providers may
- subclass to provide their own search functionality, or they can
- simply use as is, it supports body searches if an ibex is
- supplied, and header searches if a summary is supplied.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: set G_LOG_DOMAIN.
- * providers/MH/Makefile.am: same.
- * providers/maildir/Makefile.am: same.
- * providers/mbox/Makefile.am: same.
- * providers/nntp/Makefile.am: same.
- * providers/pop3/Makefile.am: same.
- * providers/sendmail/Makefile.am: same.
- * providers/smtp/Makefile.am: same.
-
-2000-05-02 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-search.c
- (camel_mbox_folder_search_by_expression): Dont store/remove
- current search from the search list.
-
- * providers/mbox/camel-mbox-folder.h: Removed searches list,
- searches are all sync now.
-
- * gmime-utils.[ch]: What the hell, remove it. This will break the
- nntp provider. The mime parser can be used instead though.
- Removed from all code including it (but none were using it).
-
- * gmime-utils.c (_store_header_pair_from_string): Removed bizarre
- string_dichotomy version of this. This code is somewhat redundant
- now, and is headed for death anyway.
-
- * gstring-util.c (g_string_dichotomy): Same with this one.
- (g_string_clone): Removed a memory leak, g_string_new() allocates
- its own memory.
- (g_string_append_g_string): Allow to append an empty gstring onto
- another gstring, dont abort()!
-
- * string-utils.c (string_dichotomy): Removed this incredibly weird
- function.
-
- * camel-folder.c (_create): Replaced the rather obtuse use of
- "string_dichotomy" function with a simple strrchr(). Still not
- sure it'll work.
-
- * camel-folder-summary.c: cvs removed a long-removed file.
-
- * camel-mime-parser.c (folder_scan_header): Fix the previous
- overflow problem properly (can happen in 2 places).
- (header_append): A new macro to include the code changed above, so
- it only appears in one place.
- (folder_scan_step): Change the content type to text/plain if the
- multipart is broken. Doesn't actually change the header though.
- (header_append): Also move the header-start tracking stuff here.
- Could be a static function to save code.
-
-2000-05-02 <notzed@helixcode.com>
-
- * camel-mime-part-utils.c
- (simple_data_wrapper_construct_from_parser): Dont use autofill on
- these fucking long function anmes!!!!!!
-
-2000-05-02 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-summary.c
- (camel_mbox_summary_expunge): Fix the offset for the summary when
- an item is expunged to take account of the From line.
-
-2000-05-01 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-folder.h (CamelMboxFolder): Removed
- search_id.
-
- * providers/mbox/camel-mbox-search.c
- (camel_mbox_folder_search_cancel): Remove.d
- (camel_mbox_folder_search_complete): Removed.
- (camel_mbox_folder_search_by_expression): Changed back to sync
- api.
- (struct _searchcontext): Removed cancelled flag.
- (find_context): Removed.
- (func_header_contains): Debug out some search stuff.
-
- * providers/mbox/camel-mbox-search.h
- (camel_mbox_folder_search_by_expression): Moved back to sync api.
-
- * providers/mbox/camel-mbox-summary.c
- (camel_mbox_summary_set_flags_by_uid): New function to update the
- flags in the summary.
- (camel_mbox_summary_expunge): Expunge messages from a folder.
- (offset_content): Re-align offsets of summary when messages
- added/removed to an existing summary.
- (camel_mbox_summary_remove_uid): Remove a message summary entry by
- uid.
- (index_folder): Restore flags from X-Evolution header, if they are set.
- (index_folder): Make sure we index using a decimal uid, since
- thats what everything else indexes off (oops).
- Upped SUMMARY_VERSION as a result.
- (camel_mbox_summary_expunge): Oops, my wrong, use the string uid
- to unindex on.
-
- * providers/mbox/camel-mbox-folder.c (_get_message_by_uid):
- Connect to the message_changed signal.
- (_init): Set permanent flags to something reasonable. No user
- flags yet ...
- (message_changed): If the flags of the message change, update the
- flags in the summary.
- (mbox_expunge): Implement the expunge.
- (camel_mbox_folder_class_init): Renamed all leading _'s to mbox_'s
- (mbox_expunge): Emit a folder_changed signal on expunge (uh, even
- if it didn't ...)
-
- * camel-folder.c (_finalize): Uh, dont free permanent_flags
- anymore (this wouldn't failed anyway, it was a GList !!!)
- (camel_folder_search_complete): Removed.
- (camel_folder_search_cancel): Removed.
- (camel_folder_expunge): Changed to only allow expunge on an open
- folder. It doesn't make sense for mbox, otherwise (?)
- (camel_folder_class_init): Added a folder_changed signal.
-
- * camel-folder.h (struct _CamelFolder): Change permanent_flags to
- a bitfield.
- (list_permanent_flags): Renamed to get_permanent_flags, and
- returns a bitfield.
- (camel_folder_expunge): Changed expunge to a void type. The
- messages would no longer be useful after they have been removed
- ...
- (CamelFolderClass): New function summary_get_by_uid() to get a single
- summary.
- (*search*): Moved back to synchronous search api ... *sigh*
-
- * camel-folder.h: Removed CamelSearchFunc.
-
- * camel-mime-message.c (set_flag): Removed.
- (camel_mime_message_set_flag): Removed.
- (get_flag): Removed.
- (camel_mime_message_get_flag): Removed.
- (add_flag_to_list): Removed.
- (get_flag_list): Removed.
- (camel_mime_message_get_flag_list): Removed.
- (camel_mime_message_get_flags): New interface to get system flags.
- (camel_mime_message_set_flags): " to set ".
- (camel_mime_message_get_user_flag): To get a user flag.
- (camel_mime_message_set_user_flag): To set a user flag.
- (finalize): Hmm, the old one free'd the key and data, not good
- when the data is a boolean ...
-
-2000-04-30 Dan Winship <danw@helixcode.com>
-
- * camel-provider.h: Tweak the definition of CamelProvider. Among
- other things, a provider may now be both a store and a transport.
-
- * camel-provider.c: Remove a lot of code we had no intention of
- using. This now only contains two functions: camel_provider_init
- to read the installed .urls files, and camel_provider_load to
- load and register a new provider.
-
- * camel-session.c: Remove more unused code and simplify some of
- the remaining code. The list of available provider modules is now
- stored in the session, and it handles calling camel_provider_load
- to load them as needed. Provider registration is now done by
- calling back from the module init routine, which allows a single
- module to register providers for multiple URL types.
-
- * providers/*: Update provider structures and init routines for
- the new stuff. Add a .urls file to each provider specifying what
- urls it handles, and install that with the library.
-
- * providers/nntp/camel-nntp-provider.c: Add hints towards
- supporting both news: and nntp: URLs, and using nntp as both a
- store and a transport.
-
-2000-04-29 Dan Winship <danw@helixcode.com>
-
- * camel-internet-address.c (camel_internet_address_get): const
- poison
-
- * camel-mime-part-utils.c
- (simple_data_wrapper_construct_from_parser):
- camel_mime_parser_tell() returns an offset from where it started
- parsing, not necessarily from the start of data. Since we're
- parsing a bounded seekable_stream, we need to add the stream's
- starting bound to camel_mime_parser_tell's return value to
- create the substream in the right place.
-
- * camel-seekable-substream.c
- (camel_seekable_substream_new_with_seekable_stream_and_bounds):
- say CAMEL_STREAM_UNBOUND rather than -1 in doc.
-
- * camel-seekable-stream.c (camel_seekable_stream_seek): Add more
- info to docs.
-
-2000-04-28 Dan Winship <danw@helixcode.com>
-
- * camel-mime-parser.c (folder_scan_header): fix a bug that would
- cause corruption with very long headers.
-
-2000-04-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * providers/pop3/Makefile.am (INCLUDES): Add `-I$(srcdir)/../../..'
- to pick the Camel includes.
- * providers/sendmail/Makefile.am (INCLUDES): Likewise.
-
- * camel.h: Don't #include <camel/data-wrapper-repository.h> anymore.
-
-2000-04-27 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-utils.c (check_header): Dont try and check a NULL
- header.
-
- * camel-recipient.[ch]: Dead. Its not pining.
-
- * camel-mime-message.h: Dont include recipients.h anymore.
-
- * camel-mime-message.c (camel_mime_message_add_recipient): Accept
- name/address separately, and store in an CamelInternetAddress.
- (add_recipient): Removed.
- (remove_recipient): Removed.
- (remove_recipient_address): Renamed from remove_receipient, works
- via address.
- (camel_mime_message_remove_recipient_name): New function to remove
- by name.
- (get_recipients): Removed.
- (camel_mime_message_get_recipients): Return a camel-internet-address.
- (write_to_stream): No longer write receipients directly.
- (write_recipients_to_stream): Removed.
- (write_one_recipient_to_stream): Removed.
- (camel_mime_message_init): Setup recipients hashtable, rather than
- usign the recipients stuff.
- (set_recipient_list_from_string): Killed, a violent and lengthy
- death.
- (process_header): Simplified recipient handling code a lot.
- (received_date_str, sent_date_str, reply_to_str, subject_str,
- from_str): Removed some oddly-defined global statics.
- (camel_mime_message_class_init): Dont initialise above variables
- anymore.
- (init_header_name_table): Removed, use a table to init this, and
- do it in class init (2 lines of code ...).
-
- * camel-news-address.c: Class to represent news addresses -
- currently empty, and not built.
-
- * camel-internet-address.h: Class to represent internet (email)
- addresses.
-
- * camel-address.h: Abstract class to represent (lists of)
- addresses.
-
-2000-04-27 Dan Winship <danw@helixcode.com>
-
- * camel-mime-part.c (write_to_stream): Revert previous change. I
- was confused.
-
- * camel-url.[ch] (camel_url_encode, camel_url_decode): expose
- these routines.
-
-2000-04-26 Dan Winship <danw@helixcode.com>
-
- * camel-mime-part.c (write_to_stream): Only write a newline
- between the headers and the content object if the content object
- is not a CamelMedium. (If the content is a medium, it may have its
- own headers, which then need to go before the blank line.)
-
- * camel-mime-body-part.[ch]: Remove. We weren't using the fields
- that made this different from camel-mime-part, so it basically
- just forced us to do lots of gratuitous typecasting.
-
- * camel-multipart.[ch]: Use CamelMimePart. Remove the multipart
- parent stuff, since we weren't using that either.
-
- * etc: update for CamelMimeBodyPart -> CamelMimePart
-
-2000-04-26 Dan Winship <danw@helixcode.com>
-
- * camel-medium.c (set_content_object): sink the content object
- after referencing it.
-
- * camel-mime-part.c: fix various little things in the handling
- of CamelMedium methods. Change camel_mime_part_set_text to the
- more generic camel_mime_part_set_content.
-
- * camel.h: sync to current reality
-
- * camel-folder-utils.[ch]: removed
-
- * camel-mime-utils.c (header_format_date): fix format specifier
- for time zone. Fix typo in month names array.
-
-2000-04-26 NotZed <NotZed@HelixCode.com>
-
- * camel-seekable-substream.c (stream_seek): Changed to have
- absolute seek semantics, not relative to the bounds.
-
- * camel-seekable-stream.c (reset): When we reset, seek to the
- start of the bound, if there is one.
- (stream_tell): Make tell virtual.
-
- * camel-stream-filter.c (do_available): Removed.
-
- * camel-stream-buffer.c: Remove leading _'s from static functions.
- (stream_read): Renamed from read(). Fancy that conflicting! (my
- boo!) Others too.
-
- * providers/pop3/camel-pop3-folder.c (get_message_by_number):
- Changed to stream_mem interface.
-
- * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): Fixed
- for streamfs interface changes, and implement a failure case.
- (_append_message): Changed for fs stream interface change.
-
- * camel-multipart.c (print_part): Iterate rahter than callback. I
- hate glists's interface (hence, move this to write_to_stream).
- (write_to_stream): Return an error (yuck, this is a royal PITA to
- do with the stream write interface).
-
- * camel-mime-message.c: Removed leading _ from static names.
-
- * camel-mime-part.h: construct_from_parser() now returns an error
- code.
-
- * camel-mime-part-utils.c
- (camel_mime_part_construct_content_from_parser): Changed to use a
- camel-data-wrapper instead of a camel-simple-data-wrapper (no
- change needed elsewhere?).
- (simple_data_wrapper_construct_from_parser): Fixes for stream-mem
- interface changes.
-
- * camel-simple-data-wrapper.[ch],
- camel-simple-data-wrapper-stream.[ch],
- camel-stream-data-wrapper.[ch], removed. Fixed including of these
- files.
-
- * camel-mime-part.c (camel_mime_part_set_text): Remove the use of
- the camel-simple-data-wrapper-stream, just use a mem stream.
- (write_to_stream): Renamed from my_*
- (construct_from_stream): Return an error on error.
-
- * camel-stream-mem.c (camel_stream_mem_new*): Remove mode
- parameter.
-
- * camel-stream-mem.h (enum CamelStreamMemMode): Removed. It
- wasn't used at all.
-
- * camel-data-wrapper.h: Add camel_data_wrapper_new() to create
- these.
- (write_to_stream, construct_from_stream): Return an error
- indicator for success. Fixed all methods to match (ICK).
-
- * Makefile.am (libcamel_la_SOURCES): Remove
- camel-simple-data-wrapper.c, camel-simple-data-wrapper-stream.c,
- camel-stream-data-wrapper.c. Obsoleted by code re-use!
-
- * camel-data-wrapper.c (construct_from_stream): Change the default
- implementation to just set the output stream == construction
- stream. Well, this lets me get rid of both simple-data-wrapper
- and stream-data-wrapper (unused anyway), and
- simple-data-wrapper-stream in one hit. CamelDataWrapper is now
- also a concrete class.
- (write_to_stream): Use camel_stream_write_to_stream() to
- calculate/return values (and save code).
- Include <errno.h> for obvious reasons.
-
- * camel-stream.c (eos): Provide a default implementation of .eos().
- (camel_stream_write_to_stream): Make it return an error code on
- error.
- (camel_stream_printf): Changed to return the number of bytes
- written/error.
- (camel_stream_available): Removed.
-
- * camel-stream-fs.h (enum CamelStreamFsMode): Removed. Changed to
- use unix modes and so forth (wasn't used for anything but new file
- creation and didn't work well either).
-
- * camel-stream-fs.c: Removed leading _'s for names. And removed
- some virtual method 'documentation'.
- (destroy): Dont try and close a closed/error fd. Only report
- error if close returns -1. Moved all the code to finalise(), and
- killed this function.
- (init_with_fd): Properly setup the seek offset, if it is a
- valid and seekable file descriptor.
- (init_with_fd_and_bounds): Use off_t for bounds, set bounds on the
- seekable stream.
- (init_with_name): Return error codes.
- (init_with_name_and_bounds): Ditto.
- (camel_stream_fs_new_with_name): REturn NULL object if it failed.
- (camel_stream_fs_new_with_name_and_bounds): Return NULL object on
- failure. Changed with_name* api's to take unix open style args
- and flags.
- (read): The bounded stream bounds checking seemed off, simplified
- code a bit.
- (write): Implement bounds checking for writing, the comment was
- wrong, it could make sense to bound writing. Cleaned up a little.
- (available): Gone.
- (eos): Removed. Use CamelStream's implementation now.
- (close): Reset the fd to -1, provide a warning for bad usage.
- (seek): Cleaned up. Changed the behaviour a little, the returned
- offset is the absolute position in the file, even in bounded
- streams.
- (seek): Seek from end mirrors lseek() behaviour (reverse seeking).
-
-2000-04-25 NotZed <NotZed@HelixCode.com>
-
- * camel-stream-fs.h (struct _CamelStreamFs): Moved bounds and eof
- indicator to other parent classes.
-
- * camel-stream.c (camel_stream_printf): New utility
- function. Obvious use.
-
- * camel-stream-mem.c: Removed leading _'s from static func's.
- (camel_stream_mem_new_with_byte_array): Fixed for api changes, set
- the owner for the byte array to us.
- : Removed A bunch of gtk doc stuff for static (implementation) functions.
- (available): Removed.
- (write): Fixed the write implementation so that seek() works on a
- seekable memory stream, as expected. Seeking past the end of the
- buffer has unix semantics (filling with 0).
- (available): Removed.
- (write): Implement seekable stream bounded stream.
- (read): Implement seekable stream bounded stream.
- (close): Dont free the stream_mem if we're not the owner.
- (seek): Allow to seek beyond the end of memory area,
- implement bounds checking.
- (seek): Set errno on bad policy.
-
- * camel-stream-mem.h (struct _CamelStreamMem): Changed position to off_t.
- (new_with_buffer): Changed len to be a size_t.
- (set_buffer, set_byte_array): New interface functions.
- (struct _CamelStreamMem): Removed position, it is stored in the
- superclass.
-
- * camel-stream.h: Removed some of the seemingly random
- whitespace. Removed the available method (its not
- impelemented/useful enough).
-
- * camel-seekable-substream.c
- (init_with_seekable_stream_and_bounds): Remove the data_available
- stuff, it hasn't been properly implemented/finished, and may never
- work (unfortunately *sigh).
- (reemit_parent_signal): Removed part of the above change.
- (set_bounds): Removed (moved to seekable-stream).
- : Fixed up some of the generally unreadable indenting (sorry,
- wrapping at 80 characters with
- camels_really_long_function_names()
- just_doesnt_work_very_well_does_it().
- (available): Removed.
- (stream_seek): Fixup for object changes. Make sure we return -1
- if the parent stream can't seek.
-
- * camel-seekable-stream.c (ccamel_seekable_stream_set_bounds): New
- function to bound any seekable stream.
- : Removed _'s.
- (camel_seekable_stream_class_init): Implement an init function, to
- setup the stream bounds to unbound.
-
- * camel-seekable-stream.h (CamelSeekableStreamClass): New virtual
- method set_bounds for seekable streams.
- (CAMEL_STREAM_UNBOUND): New define for no bound.
-
- * camel-seekable-substream.h (struct _CamelSeekableSubstream):
- Removed sup_bound and inf_bound, moved to CamelSeekableStream (and
- renamed, and changed to off_t's).
- (new_with_seekable_stream_and_bounds): Use off_t as the bounds.
- (CamelSeekableSubstreamClass): Uh, why was the intialiser virtual?
- Removed.
-
- * camel-seekable-stream.[ch] (CamelSeekableStreamClass): Changed seek
- to accept an off_t as the offset.
- (struct _CamelSeekableStream): Renamed cur_pos to position and
- changed it to an off_t type.
- (enum CamelStreamSeekPolicy): Set to match the SEEK_* constants
- from lseek().
- (get_current_position): Renamed to tell().
-
- * camel-stream-buffer.h: Commented out set_vbuf - never implemented.
-
-2000-04-25 Dan Winship <danw@helixcode.com>
-
- * camel-stream-buffer.c (_eos): only return TRUE if the parent is
- at eos AND the buffer has been exhausted
-
- * camel-mime-message.c: fix some incorrect macro usage that
- resulted in bogus casts
-
-2000-04-24 Dan Winship <danw@helixcode.com>
-
- * camel-mime-part-utils.c
- (simple_data_wrapper_construct_from_parser): fix a cut-and-pasto.
-
- * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): ref
- (and sink) the message stream if we're going to unref it later.
- Otherwise it could get destroyed while there are still substreams
- attached to it. This needs a cleaner solution.
-
- * camel.h: remove data-wrapper-repository.h include(s)
-
-2000-04-24 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-message.c (construct_from_parser): Allow MESSAGE_END
- _or_ EOF as valid termination conditions.
-
- * providers/mbox/camel-mbox-summary.c (message_struct_new): Decode
- and then re-encode the addresses, so they are consistently
- formatted.
-
- * camel-mime-utils.c (header_decode_mailbox): Store the address in
- a _header_address. And try to get a comment-stored name if there
- is one.
- (header_decode_address): Actually return an address.
- (header_to_decode): Renamed to header_address_decode()
- (header_mailbox_decode): New function to get a single mailbox.
- (header_mime_decode): Return the major/minor value, as
- appropriate.
- (header_address_new, and friends): Whole bunch of utility
- functions for working with the address thingies.
- (header_decode_domain): Free the string header, and dont expand
- '.' into ' . '.
-
- * camel.c (camel_init): No longer call
- data_wrapper_repository_init.
-
- * camel-medium.c (write_to_stream): Moved (back) to
- camel-mime-part.
- (add_header):
- (set_header):
- (remove_header):
- (get_header): Make all these abstract, and spit warnings if
- called. I guess it could manage the list, but well, it doesn't.
-
- * camel-medium.h (struct _CamelMedium): Dont store headers here,
- the implementor is the only one who knows their format.
- (CamelMediumClass): Changed header values to be void *'s. They
- need not be strings?
-
- * camel-simple-data-wrapper.c (construct_from_stream): And we're
- back. Set the output stream.
- (construct_from_parser): Moved to camel-mime-part-utils.
-
- * camel-mime-part-utils.c
- (camel_mime_part_construct_content_from_parser): Create the
- contents of multipart and simple messages.
- (camel_mime_part_construct_content_from_parser): Oops, this was
- totally screwed up, try creating the right cotnent on the right
- object.
-
- * camel-multipart.c (construct_from_parser): Moved to
- camel-mime-part-utils.
- (separate_part): Removed.
-
- * camel-mime-part.c (construct_from_stream): Back again! This now
- switches over to using a mime parser for any mime parts, only.
- (my_write_to_stream): Write our headers and so forth here.
- (add_header): Add header directly, parent class is abstract.
- (remove_header): Ditto.
- (set_header): Ditto.
-
- * camel-data-wrapper.c (camel_data_wrapper_construct_from_stream):
- Remade abstract.
- (camel_data_wrapper_construct_from_parser): Moved to
- camel_mime_part.
-
- * camel-data-wrapper.h: Put back construct_from_stream.
-
- * camel-mime-part.h: Put construct_from_parser in here, the
- data-wrapper shouldn't know about mime. Ok, so now to undo half
- of the last hours changes ... duh.
-
-2000-04-23 Dan Winship <danw@helixcode.com>
-
- * camel-mime-utils.c (header_to_decode, header_mime_decode): fix
- some obvious minor bugs noted by -Wall.
-
-2000-04-23 NotZed <NotZed@HelixCode.com>
-
- * providers/pop3/camel-pop3-folder.c (get_message_by_number): Use
- construct_from_stream instead of set_input_stream().
-
- * camel-simple-data-wrapper-stream.c
- (camel_simple_data_wrapper_stream_construct): REmoved the destroy
- callback code.
- (wrapper_destroy_cb): Removed.
-
- * camel-simple-data-wrapper.h: Add prototype for _construct()
- method.
-
- * camel.c: Include unicode.h to kill a warning.
-
- * camel-data-wrapper.h (CameldataWrapperClass): Removed
- construct_from_stream virtual method.
- Removed get/set input stream.
-
- * data-wrapper-repository.[ch]: Removed&from build. Obsoleted?
- The justification as is follows: It is mixing storage
- protocol/format with message architecture. It really just doesn't
- serve any purpose, as each medium implementor will have to have its
- own type->handler mapping, and the only current implementor,
- mimepart has a very simple structure and no need for this.
-
- * camel-medium.c (write_to_stream): Moved here from most of the
- stuff in camel-mime-part. Well, the MEDIUM is the one that knows
- what the headers are, and the content is, let it write it out.
-
- * camel-mime-part-utils.c (camel_mime_part_construct_content):
- Copied from camel-mime-part.c, removed handling of message
- followon state (moved to camel-mime-message).
- (camel_mime_part_construct_content_from_parser): Renamed from
- construct_content.
- (camel_mime_part_construct_headers_from_stream):
- (camel_mime_part_construct_content_from_stream):
- (camel_mime_part_store_stream_in_buffer): Removed. Replaced by
- the new construct from parser stuff.
-
- * camel-mime-message.c (construct_from_parser): Do
- construct_from_parser for mime-message.
- (_write_to_stream): Set the mime-version header for medium to
- write out, rather than writing it out ourselves.
-
- * camel-data-wrapper.c (set_mime_type_field): Ref the
- content_field when we get it?
- (construct_from_stream): Removed.
- (camel_data_wrapper_construct_from_stream): Changed to a helper
- function, creates a mime_parser, and constructs from that.
- (set_input_stream): Removed.
- (camel_data_wrapper_set_input_stream): Removed.
- (get_input_stream): Removed.
- (camel_data_wrapper_get_input_stream): Removed.
-
- * camel-mime-parser.c (camel_mime_parser_unstep): New function.
- Cause a subsequent call to mime_parser_step() to return the same
- state over again.
-
- * providers/mbox/camel-mbox-folder.c (_get_message_by_uid):
- Initial test code using the mime parser to construct the message.
- (_get_message_by_uid): Use construct_from_stream() instead of
- creating our own parser.
-
- * camel-mime-part.c (construct_from_parser): part constructor.
- (camel_mime_part_construct_content): Basically a simpler
- replacement for the datawrapper repository.
- (camel_mime_part_init): Set the default type to text/plain.
- (camel_mime_part_construct_content): Removed to
- camel-mime-part-utils.c
- (my_get_output_stream): Removed. The streeam is in the
- data-wrapper.
- (my_get_content_object): Removed. The content object is stored in
- the medium. If none is there, the object wasn't created properly.
- (my_write_content_to_stream): Removed. The content object is the
- one that knows how to write itself out!!!!!!!!
- (my_write_to_stream): Remove the base header writing stuff - has
- been moved to camel-medium, where it belongs. This can just be
- used to check for mandatory headers.
- (my_construct_from_stream): Removed.
- (my_set_input_stream): What the hell, i'll remove this too.
- Nobody seems to understand how it differs from create from stream,
- and they both seem to serve the same purpose ...
-
- * camel-simple-data-wrapper.c (construct_from_parser): Initial
- implementation of a content constructor.
- (construct_from_stream): Removed! Job taken over by
- construct_from_parser.
-
- * camel-multipart.c (construct_from_parser): Multipart
- construction routine.
- (camel_multipart_init): Set the default multipart type to
- multipart/mixed. Duh, no subtype is not allowed anyway.
- (set_input_stream): REmoved. Replaced by construct_from_parser.
-
-2000-04-22 Dan Winship <danw@helixcode.com>
-
- * camel-multipart.[ch]: clean, document, etc.
- (camel_multipart_init): pick a prettier default boundary. Still
- need to deal with the larger problem
-
-2000-04-22 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-message.h (struct _CamelMimeMessage): Removed
- send_date, and received_date, and replaced it with a time_t
- 'date' (this is what the header is called), and date_offset to
- store the GMT offset of the date.
-
- * camel-mime-message.c (camel_mime_message_set_from): Update raw
- header as we go.
- (_set_from): Removed.
- (_get_from): Removed.
- (camel_mime_message_get_from): Moved implementation here.
- (camel_mime_message_get_subject): Move implementation here.
- (_get_subject): Nuked.
- (camel_mime_message_set_subject): Handle utf-8 input, and also
- update raw header when changed.
- (_set_subject): Removed.
- (_set_received_date): Removed.
- (camel_mime_message_set_received_date): Removed.
- (_get_received_date): Removed.
- (camel_mime_message_get_received_date): Removed.
- (_get_sent_date): Removed.
- (camel_mime_message_get_sent_date): Removed.
- (camel_mime_message_get_date): New function to get the date as a
- time_t/offset.
- (camel_mime_message_set_date): Set the date as a time_t/offset.
- (camel_mime_message_get_date_string): Get the date as a string.
- (camel_mime_message_init): Initialise the current date as
- 'CMAEL_MESSAGE_DATE_CURRENT'.
- (_set_reply_to): Removed.
- (camel_mime_message_set_reply_to): Moved implementation here.
- This is still broken, reply-to can have multiple addresses.
- (_get_reply_to): Removed.
- (_set_field): Removed, no longer used anywhere.
- (_get_field): Also removed.
- (_init_header_name_table): Add the Date header.
- (process_header): Also handle snooping of Date header here.
-
- * camel-stream-filter.c (finalise): Unref the source stream on
- finalise, and also call the parent class (oops).
-
- * camel-mime-parser.c (camel_mime_parser_state): New function to
- get the current parser state.
- (camel_mime_parser_stream): Allow you to get the stream back from
- the mime_parser.
- (camel_mime_parser_fd): Alternative to allow you to get the fd
- back from the mime_parser.
- (folder_scan_init_with_stream): Properly ref/unref the stream.
- (folder_scan_close): Properly unref the stream/close the fd on
- exit.
- (folder_scan_init_with_fd): Close the old fd if there is one.
-
- * camel-data-wrapper.c (camel_data_wrapper_construct_from_parser):
- New method, construct a data wrapper from an initialised parser.
- (construct_from_parser): Empty implementation.
-
- * providers/mbox/camel-mbox-summary.c (message_struct_new):
- Convert subject line to unicode, before storing in the summary.
- (strdup_trim): Removed, no longer needed.
-
- * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): Ref
- the folder after setting it in the new message.
-
- * camel-mime-part.c (my_set_content_object): Have the headers
- follow the content-type change here too.
- (my_write_to_stream): Dont write content-type here, automatically
- stored in the headers ...
- (my_write_to_stream): Use header_disposition_format() to format
- the content-disposition header.
- (my_write_to_stream): Removed old code, all headers are now stored
- in the camel-medium level, always. Need to do the same with
- camel-mime-message i suppose ...
- (my_write_to_stream): Write the content using the parent class,
- not some weird function.
- (camel_mime_part_class_init): Dont override get_output_stream.
- (camel_mime_part_encoding_from_string): Bleh, make it
- case-insensitive.
-
- * camel-mime-utils.c (header_content_type_is): Handle empty types.
- (header_encode_string): Start of an implementation of the rfc2047
- encoder. It does iso-8859-1, and us-ascii, and utf-8 (others get
- tricky *sigh*)
- (rfc2047_encode_word): Convert a single word/string into rfc2047
- encoding.
- (quoted_encode): Different quoted-printable encoding for rfc2047
- encoding of headers.
-
- * gmime-content-field.c (gmime_content_field_write_to_stream): Use
- header_content_type_format() to format it.
-
-2000-04-21 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-utils.h: Add prototype for header_param_list_free.
-
- * camel-recipient.c: New function to remove all the types of a
- recipient list. I think this whole object needs a major review.
-
- * camel-mime-message.c (camel_mime_message_class_init): Removed
- parse_header_pair override, override add_header instead.
- (_parse_header_pair): Renamed to add_header.
- (remove_header): Add this method, to make sure we keep upto date
- with removed headers too.
- (_set_field): If given a NULL value, clear it out.
- (_set_recipient_list_from_string): Constify.
- (set_header): Override set_header from camel_medium.
- (process_header): Local function to handle set/add/remove of each
- header we know about.
-
- * camel-mime-part.c (camel_mime_part_class_init): Removed
- parse_header_pair setup.
- (my_parse_header_pair): Moved into add_header(), removed.
- (my_set_disposition): Allow a NULL disposition to clear it.
- (my_set_content_id): Allow NULL content id to clear it.
- (remove_header): Track removed headers.
- (my_set_description): Allow NULL description to clear it.
- (my_set_content_MD5): Make sure we copy the md5 value, and allow a
- NULL value to reset it.
- (my_set_filename): Copy the filename.
- (my_set_header_lines): Removed. Nothing uses it, it doesn't
- actually serve any purpose.
- (camel_mime_part_set_header_lines): Ditto.
- (my_get_header_lines): Ditto.
- (camel_mime_part_get_header_lines): Ditto.
- (camel_mime_part_class_init): Remove *_header_lines setup.
- (camel_mime_part_init): Remove header_lines init.
- (my_finalize): Remove header_lines finalise.
- (my_write_to_stream): Write the headers here. This is just WRONG,
- camel_medium should be doing this.
- (my_get_output_stream): Kill a warning.
- (camel_mime_part_encoding_to_string): Ditto.
- (camel_mime_part_set_description): Unvirtualiase, use add_header()
- to do the processing.
- (my_set_description): Removed.
- (set_disposition): Renamed from my_set_disposition.
- (camel_mime_part_get_description): Get the descriptionf rom the
- get_header method.
- (my_get_description): Removed.
- (my_set_filename): Removed.
- (camel_mime_part_get_filename): Get the parameter from the
- disposition.
- (camel_mime_part_encoding_from_string): Handle NULL string.
- (camel_mime_part_init): Remove reference to filename.
- (my_finalize): Dont free filename.
-
- * camel-mime-part.h (CamelMimePartClass): Removed
- parse_header_pair() method, it doesn't add anything that
- add_header() can't be used for.
- (CamelMimePartClass): Remove *_header_lines methods.
- (struct _CamelMimePart): Remove header_lines list.
- (struct _CamelMimePart): Removed filename attribute.
-
- * camel-medium.c (camel_medium_init): Init headers to null, not a
- hashtable.
- (add_header): Append the headers as a list.
- (remove_header): Remove headers as a list.
- (get_header): Likewise for lookup.
- (free_header): Removed, no longer needed.
- (finalize): Free headers using header_raw_clear().
- (camel_medium_set_header): New function, to reset and override all
- values of a header with a new value.
-
- * camel-medium.h (struct _CamelMedium): Changed to use a
- header_raw struct rather than a hash table, to store headers
- (many headers can occur multiple times).
-
- * camel-mime-utils.c (header_raw_find_next): New function, allows
- you to find multi-valued header fields.
- (header_disposition_format): New function to format/create
- content-disposition header string.
- (header_param_list_format_append): Function to format parameter
- lists into a GString.
- (header_content_type_format): Function to format content-type into
- a usable format.
- (header_set_param): allow NULL value to remove the parameter.
- (decode_token): Renamed from header_decode_token.
- (header_decode_token): New interface for external use.
- (quoted_decode): Made static to kill annoying warnings.
- (g_strdup_len): Killed, replaced with calls to g_strndup().
- (rfc2047_decode_word): Made static to kill warnings.
- (decode_coded_string): Terminated.
- (g_string_append_len): Made static to kill warnings.
- (header_decode_text): Made static to kill warnings.
- (header_decode_text): Constify.
- (rfc2047_decode_word): Constify.
- (header_param): Constify.
- (header_content_type_new): Copy the type/subtype strings.
- (header_param_list_decode): Made static.
- (header_param_list_format_append): Made static.
- (quoted_decode): Constify.
- (g_string_append_len): Constify.
- (header_token_decode): New function to decode a single token.
-
- * providers/mbox/camel-mbox-summary.c (header_write): Append a
- trailing \n when writing headers.
- (strdup_trim): Killed a warning.
- (camel_mbox_summary_set_uid): Make sure the next uid is at least 1
- higher than any existing one.
- (header_evolution_decode): Use header_token_decode to get the
- token.
-
- * camel-mime-parser.c (folder_scan_header): Strip the trailing \n
- of the end of all header lines.
-
-2000-04-20 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-utils.[ch]: Removed.
-
- * providers/mbox/camel-mbox-parser.[ch]: Removed. Removed
- references to it.
-
-2000-04-20 Dan Winship <danw@helixcode.com>
-
- * camel-mime-utils.c (rfc2047_decode_word): use libunicode iconv
- functions rather than libc ones (since libc might not have them).
- (header_decode_date): add autoconfiscation on timezone code
-
- * camel.c (camel_init): call unicode_init ()
-
-2000-04-20 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-summary.c (message_struct_new): Trim
- leading/trailing spaces off the raw headers.
-
- * MERGE NEW_PARSER branch into HEAD, fixed conflicts.
-
- * gmime-content-field.c (_print_parameter): Duh, removed again
- (@@#$@ cvs merge).
-
- * camel-mime-utils.c (header_content_type_is): Constify.
- (header_content_type_unref): Killed a couple warnings.
-
- * camel-folder.c (_init): Removed more log crap.
-
- * providers/Makefile.am (SUBDIRS): Removed nntp, pending fixes for
- summary changes.
-
- * providers/mbox/camel-mbox-folder.c (_get_message_by_number):
- Fixed for new summary interface. Added a warning for using this
- broken api.
- (_get_message_by_uid): Fixed for message new with session
- vanishing.
-
-2000-04-19 Dan Winship <danw@helixcode.com>
-
- * camel-simple-data-wrapper-stream.c
- (camel_simple_data_wrapper_stream_get_type): This is a subtype of
- CamelSeekableStream, not CamelStream.
-
- * camel-seekable-substream.c: clean up a lot.
- (eos): When testing for end-of-stream, reset the parent position
- before testing if it is at end-of-stream, since either (a) it may
- have been seek'ed to eos by someone else, or (b) we may have been
- seek'ed away from eos and it hasn't been synced yet.
-
- * camel-medium.[ch] (camel_medium_add_header): const poison.
- (Belatedly goes with my change of 2000-02-23.)
- (camel_medium_init): Use g_strcase_{hash,equal} on the header
- array.
-
-2000-04-18 Dan Winship <danw@helixcode.com>
-
- * camel-mime-part.c (my_set_input_stream):
- * camel-data-wrapper.c (set_input_stream, set_output_stream): do
- better reference counting of streams so they actually go away
- when they should.
-
- * camel-log.[ch], *: Nuke camel log stuff. Replace calls to
- CAMEL_LOG_WARNING with calls to g_warning.
-
- * camel-data-wrapper.[ch]:
- * camel-simple-data-wrapper.[ch]:
- * camel-medium.[ch]: Clean, polish, document. Most of the gtk-doc
- comments added to camel-data-wrapper.c note serious problems that
- need to be fixed.
-
-2000-04-17 Dan Winship <danw@helixcode.com>
-
- * camel-mime-message.[ch]: Remove the "session" field from
- CamelMimeMessage. Nothing uses it, about half of the existing
- calls to camel_mime_message_new_with_session pass NULL, and
- there's no obvious reason for it to be there.
-
- * providers/MH/camel-mh-folder.c:
- * providers/maildir/camel-maildir-folder.c:
- * providers/mbox/camel-mbox-folder.c:
- * providers/mbox/camel-mbox-utils.c:
- * providers/nntp/camel-nntp-folder.c:
- * providers/pop3/camel-pop3-folder.c: Use camel_mime_message_new
- instead of camel_mime_message_new_with_session.
-
- * camel-session.c (get_store_for_protocol_with_url): Set the
- exception if no provider is found.
-
- * camel-url.c: Add code to encode and decode %-escapes in URLs,
- and do some additional correctness-checking on URL syntax. From
- Tiago Antào with modifications by me.
-
-2000-04-14 Chris Toshok <toshok@helixcode.com>
-
- * providers/Makefile.am (SUBDIRS): add nntp
-
-2000-04-14 Christopher James Lahey <clahey@helixcode.com>
-
- * providers/mbox/camel-mbox-folder.c: Fix switch statement.
-
-2000-04-14 Chris Toshok <toshok@helixcode.com>
-
- * providers/nntp/camel-nntp-folder.c (_exists): always return TRUE
- for now. we need to check the server response to make sure the
- group exists.
- (_get_message_by_uid): make sure to account for the \n we add to
- the string after every line.
-
- * providers/nntp/camel-nntp-utils.c (get_XOVER_headers): function
- to get the headers using the XOVER command.
- (get_HEAD_headers): function to get the headers using the HEAD
- command on each message. slooooooow.
- (camel_nntp_get_headers): make this function use either XOVER or HEAD
- versions depending on whether or not the server extension is present.
-
-2000-04-14 Dan Winship <danw@helixcode.com>
-
- * camel-formatter.[ch]: This didn't belong in Camel. Move to mail/
-
- * Makefile.am, camel-types.h: remove references to
- camel-formatter.
-
-2000-04-12 Matt Loper <matt@helixcode.com>
-
- * camel-folder-pt-proxy.c (_folder_open_cb): Print warning message
- for broken function.
- (_folder_close_cb): Same.
-
-2000-04-12 Miguel de Icaza <miguel@gnu.org>
-
- * Makefile.am (pthread_SRC): Use correct names for the pthread
- source variables.
-
-2000-04-10 Dan Winship <danw@helixcode.com>
-
- * providers/pop3/camel-pop3-store.c (pop3_connect): fix various
- bugs in APOP code (still untested) and some of the error cases.
-
- * camel-provider.h: Clarify what provider.protocol, provider.name,
- and provider.description should be.
-
- * providers/mbox/camel-mbox-provider.c:
- * providers/pop3/camel-pop3-provider.c:
- * providers/sendmail/camel-sendmail-provider.c:
- * providers/smtp/camel-smtp-provider.c: update protocols, names,
- and descriptions
-
- * providers/mbox/camel-mbox-folder.c (_get_message_by_number):
- implement get_message_by_number for the mail fetch code.
-
-2000-04-09 Jeffrey Stedfast <fejj@stampede.org>
-
- * providers/smtp/camel-smtp-transport.c: reformatted to fit
- the standard indent format used by helix code
-
-2000-04-09 Dan Winship <danw@helixcode.com>
-
- * camel-movemail.c: New file with new function to dot-lock an mbox
- file and copy it to a safe private directory.
-
-2000-04-08 Christopher James Lahey <clahey@helixcode.com>
-
- * providers/smtp/.cvsignore: Added a .cvsignore file.
-
-2000-04-08 Dan Winship <danw@helixcode.com>
-
- * providers/sendmail/camel-sendmail-transport.c (_send_internal):
- actually record the pid returned by fork(). Noticed by clahey.
-
- * providers/smtp/camel-smtp-transport.c: #include <sys/param.h>
- for MAXHOSTNAMELEN. (This is a stopgap: some of the uses of
- MAXHOSTNAMELEN are wrong anyway...)
-
-2000-04-07 Jeffrey Stedfast <fejj@stampede.org>
-
- * providers/smtp/camel-smtp-transport.c: fixes to numerous bugs;
- should now build fine.
- * providers/Makefile.am: Readded smtp now that smtp builds without
- error.
-
-2000-04-20 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-summary.c
- (camel_mbox_summary_next_uid): Public function to get the next
- uid, makes sure its saved to disk too.
-
- * camel-mime-part.c (my_finalize): Fix disposition crap with a
- real disposition.
- (my_set_disposition): Likewise.
- (my_get_disposition): And here.
- (my_write_to_stream): And here, needs more cleanup.
-
- * providers/mbox/camel-mbox-folder.c (_append_message): Assign a
- new uid at this point.
-
- * gmime-content-field.c (gmime_content_field_write_to_stream):
- Make something up if we have an invalid/missing content type
- (i.e. text/plain).
-
-2000-04-19 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-folder.c (_delete): Fixed completely
- broken switch() syntax, only compiled because errno is a macro on
- some systems.
- (_list_subfolders): Likewise.
-
-2000-04-18 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-parser.c (folder_scan_init): init stream to null.
-
- * providers/mbox/camel-mbox-summary.c
- (CAMEL_MBOX_SUMMARY_VERSION): Moved to .c file, incremented.
- (index_folder): Changed to have index passed via the summary.
- (decode_string): Do a sanity check on the string size, so we dont
- visit g_malloc()'s friendly abort().
-
- * camel-folder-pt-proxy.c (camel_folder_pt_proxy_class_init):
- Removed reference to set_name.
- (_set_name): Removed.
-
- * providers/mbox/camel-mbox-utils.c
- (parsed_information_to_mbox_summary): Removed. Most of this file
- is about to be binned.
-
- * providers/mbox/camel-mbox-search.c (func_header_contains): Fixes
- for changes to summary interface.
- (struct _searchcontext): Remove pointer to message info, get it
- straight from the mboxsummary.
- (camel_mbox_folder_search_by_expression): New summary interface.
- (camel_mbox_folder_search_by_expression): Uh, the summary is not
- an object anymore (well not yet).
-
- * providers/mbox/camel-mbox-folder.c
- (camel_mbox_folder_class_init): Removed set_name init.
- (_set_name): Removed.
- (_open): Call new summary interface.
- (_close): Use new summary interface.
- (_create): Removed a summary object leak.
- (_get_message_count): New summary interface.
- (_get_uid_list): Use new summary interface. FIXME: this is leaky.
- (_get_message_by_uid): Use the new summary interface, some
- cleanup.
- (_append_message): Totally changed, basically just appends the
- message directly, ignores the summary (for now), the summary will
- fix itself up if it needs to.
- (_check_get_or_maybe_generate_summary_file): Bye bye old code.
- (summary_get_message_info): Implement get_message_info again, for
- folder.
-
- * camel-folder.c (camel_folder_class_init): Removed set_name
- setup.
- (_set_name): Moved contents into _init.
- (_init): Perform the old functions of set_name here.
-
- * camel-folder.h: Removed the set_name internal interface.
-
-2000-04-14 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-summary.[ch]: Completely replaced with
- new code.
-
- * Makefile.am (libcamel_la_SOURCES): Removed
- camel-folder-summary.[ch].
-
- * camel-folder.h (struct _CamelFolder): Removed summary.
- (struct _CamelFolder): Changed flags to be 1 bit bitfields.
-
- * camel-folder-summary.[ch]: Class removed entirely.
-
- * camel-folder.c (camel_folder_get_summary): Removed.
- (camel_folder_summary_get_message_info): Moved from
- camel-folder-summary.c
- (camel_folder_summary_get_subfolder_info): Moved from
- camel-folder-summary.c
-
- * camel-mime-parser.c (folder_scan_step): Store the start of
- headers and start of from in the scan state.
- (camel_mime_parser_tell_start_headers): Query the start of the
- headers.
- (camel_mime_parser_tell_start_from): Query the cached start of
- from marker.
-
-2000-04-13 NotZed <NotZed@HelixCode.com>
-
- * gmime-content-field.c (gmime_content_field_free): Removed this
- function. If its too dangerous to use, it shouldn't be here.
- (gmime_content_field_ref): Also ref the embedded content-type.
- (gmime_content_field_unref): Ditto to unref it.
-
- * camel-mime-utils.h: Add a refcount for content-type header.
-
- * camel-mime-utils.c (header_content_type_unref): Implement unref
- for content-type.
- (header_content_type_ref): Implement ref for header content type.
-
-2000-04-12 NotZed <NotZed@HelixCode.com>
-
- * gmime-content-field.h: Changed to use a _header_content_type.
- Added type/subtype back for compatability with clients.
-
- * gmime-content-field.c: Basically a total rewrite, and now just a
- thin wrapper ontop of header_content_type.
- (_free_parameter): Got rid of it.
- (gmime_content_field_new): Use header_content_type_* functions.
- (gmime_content_field_set_parameter): Likewise.
- (_print_parameter): Blow away.
- (gmime_content_field_write_to_stream): Get details from the
- content_type field. Should check if it needs to escape chars in
- the paramter value.
- (gmime_content_field_get_mime_type): Likewise.
- (___debug_print_parameter): Get rid of this rather annoyingly
- named function.
- (gmime_content_field_get_parameter): Simplified function.
- (gmime_content_field_construct_from_string): Fixed this to use a
- real parser.
- (gmime_content_field_is_type): New function to test if a type matches.
- (gmime_content_field_construct_from_string): Track type/subtype
- from subordinate content_type header struct.
-
- * gmime-rfc2047.[ch]: Removed. Unused.
-
- * camel-stream-b64.[ch]: Blown away more duplicated code.
-
- * Makefile.am: Removed camel-stream-b64.[ch], and
- gmime-base64.[ch].
-
- * camel-mime-part.c (my_get_content_object): Replaced
- camel-stream-b64 with camel-stream-filter/camel-mime-filter-basic.
- (my_write_content_to_stream): Replaced camel-stream-b64 with the
- camel-stream-filter with an encoder.
- (my_get_content_object): Also implement quoted-printable decoding.
- (my_write_content_to_stream): Also implement quoted-printable
- encoding.
- (my_get_output_stream): Took out stream-b64 code (nothing's being
- executed yet anyway).
-
- * gmime-base64.[ch]: Blown away. Not used, dont need it.
-
- * camel-mime-utils.h: Added offset for this header. Records where
- it is in the source.
-
- * camel-mime-utils.c (header_raw_append_parse): Add offset
- parameter, to store where the header is stored in the stream.
- (header_raw_append): Added offset param.
- (header_raw_find): Return offset, if a pointer supplied for it.
- (header_raw_replace): Add offset param.
- (header_content_type_new): New function, to create an empty
- content type.
- (header_content_type_set_param): Set a parameter in the
- content-type.
- (header_set_param): Generic header parameter setting function.
- (header_decode_string): Handle NULL input.
-
- * camel-mime-parser.c (camel_mime_parser_headers_raw): New
- function to get access to all the raw headers.
- (folder_scan_header): Keep track of the header start position, and
- store it when saving the header.
-
-2000-04-11 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-utils.c: Moved a bunch of printf's to debug.
-
- * camel-mime-parser.c: Moved a bunch of printf's to debug.
- (folder_scan_header): Detect end of each header line using the
- last scanned char, and not the last scanned position.
-
- * camel-mime-filter-index.[ch]: Indexing filter. Indexes unicode
- sequences into ibex files.
-
-2000-04-09 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-part.c: Dont include gmime-base64.h
-
- * camel-mime-filter-charset.c (complete): Implement the completion
- function.
-
- * camel-mime-parser.c (folder_scan_step): If we get to the end of
- the body data, check any filters for outstanding completion data.
- (camel_mime_parser_scan_from): Set whether we scan for "From "
- headers or not.
-
- * camel-stream-filter.c (do_read): If we get to end of stream on
- the source, then call the filtering completion function to see if
- we have any more data to return.
-
- * camel-mime-filter-basic.c (filter): Implement quoted printable
- encoding and decoding filters.
- (complete): And the complete function as well.
-
- * camel-mime-utils.c (base64_encode_close): Also take an input
- buffer, allow closing of filters.
- (quoted_encode_step): First cut, simple quoted-printable encoder.
- Doesn't handle trailing spaces/tabs on end of line properly yet.
- (quoted_encode_close): Complete a quoted-encoding.
- (is_qpsafe): New type check, for quoted-printable safe characters
- (that do not need encoding). Thats all bits used in the type
- table! Rebuilt the types table.
- (header_content_type_is): Checks a content type against at
- type/subtype match.
- (header_content_type_param): Handle NULL content type pointer.
-
-2000-04-08 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-filter-basic.c (filter): Implement the base64
- encoder. Problem is, there is no way to know when to close it.
- Close/Reset will have to provide the same args as filter, so it can
- flush remaining data *sigh*
-
- * camel-mime-utils.c (base64_encode_step): A rather complex base64
- encoder, fast?
- (base64_step_close): Companion function to finish off the base64
- sequence.
-
- * camel-mime-part.c (my_write_content_to_stream): Changed to use
- camel_stream_write_to_stream().
-
- * camel-stream.[ch] (camel_stream_write_to_stream): From
- camel_stream_b64_write_to_stream(). Fixed some infinite loop
- bugs with error conditions.
-
- * camel-stream-b64.[ch] (camel_stream_b64_write_to_stream): Removed.
- This has nothing to do with stream-b64, so i've moved it to
- CamelStream.
-
- * camel-mime-utils.h: Add a comment about refcounting
- header_content_type struct.
-
- * Makefile.am: Added camel-stream-filter*.[ch].
-
- * camel-stream-filter.[ch]: Class to implement a generic
- (multipass) filter ontop of a stream. Only implements a read-only
- stream.
-
- * camel-mime-parser.c (camel_mime_parser_filter_add): Ref the
- filter we just added.
-
- * Makefile.am: Added camel-mime-filter*.[ch].
-
- * camel-mime-filter-charset.[ch]: A filter to preform character set
- conversion (uses unicode_iconv).
-
- * camel-mime-filter-save.[ch]: A simple filter which will save all
- data directly to a file or file descriptor.
-
- * camel-mime-filter-basic.[ch]: Implements the basic mime filters,
- base64 and quoted-printable decoding (encoding not implemented yet).
-
- * camel-mime-filter.[ch]: A filtering class, which can filter streams
- of data without having to copy them. Simpler than stream classes,
- and can be plugged into a single stream class (when i write it).
-
-2000-04-07 Dan Winship <danw@helixcode.com>
-
- * providers/pop3/camel-pop3-store.c (pop3_connect): Clarify error
- messages.
- (finalize): fix a bug in camel_exception usage
- (pop3_connect): Remember the password after asking for it the
- first time.
-
-2000-04-07 NotZed <NotZed@HelixCode.com>
-
- * Makefile.am: Added camel-mime-parser/camel-mime-utils.
-
- * camel-mime-parser.c: Fast mime parser.
-
- * camel-mime-utils.c: Mime utility functions, and email header
- parsers.
-
-2000-04-07 NotZed <NotZed@HelixCode.com>
-
- * providers/Makefile.am: Removed smtp for now, its a long way from
- building.
- * providers/smtp/Makefile.in: Removed file that shouldn't have been
- checked in.
-
-2000-04-06 Matt Loper <matt@helixcode.com>
-
- * camel-folder-pt-proxy.c (_get_full_name): Remove exception param
- from get_full_name() called, since get_full_name() was changed to
- not have an exception in the last param (see dan's notes below).
- (_get_name): same.
-
-2000-04-06 Dan Winship <danw@helixcode.com>
-
- * camel-store.[ch]: Reorganize the folder-fetching methods and
- implement a folder cache so that multiple requests for the same
- folder will yield the same CamelFolder object (as long as it
- remains active). Includes some code to remove no-longer-active
- folders from the cache, but it doesn't get used since nothing is
- ever unref'ed in Camel right now...
-
- * providers/mbox/camel-mbox-store.c:
- * providers/pop3/camel-pop3-store.c: update for CamelStore
- changes.
-
- * camel-folder.[ch]: Remove the (unused) CamelException argument
- from camel_folder_get_name and camel_folder_get_full_name.
- (camel_folder_set_name): make this go away since changing a
- folder's name after it has been created could result in it
- conflicting with a separately-issued folder.
-
-2000-04-05 Dan Winship <danw@helixcode.com>
-
- * g_url_new really wanted to take a CamelException. So, rename
- Gurl to CamelURL, g_url_* to camel_url_* (with camel_url_new
- taking an exception), and url-util.[ch] to camel-url.[ch]. Also
- force url->port to be numeric and remove camel_service_getport. (I
- was confused before: the URL RFC says the port must be numeric, so
- we don't want to do getportbyname.)
-
-2000-04-01 Dan Winship <danw@helixcode.com>
-
- * providers/mbox/camel-mbox-folder.c
- (_check_get_or_maybe_generate_summary_file): Compare
- mbox_file_size and mbox_modtime to the results of stat()ing the
- mbox file, not the summary file. Duh.
- (_close): Update the summary's mbox_file_size and mbox_modtime
- before writing it to disk.
-
- * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_save,
- camel_mbox_summary_load): Wow. I must have been tired when I wrote
- this code. First, the comparison bug above. Second, it was using
- ntohs and htons instead of ntohl and htonl. Third, I was reading
- the status flag byte in two different places and thus getting out
- of sync. Fourth, it was writing out field_length bytes of each
- header field after having converted field_length to network byte
- order, resulting in lots of random crap being appended, and the
- summary files being huge. (Fortunately, since the size/modtime
- comparison was biffed, the garbage summary read from disk was
- always immediately discarded.)
-
- * providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file): fix
- an off-by-one error that caused the last-used UID to be reused if
- the summary file was regenerated. (That one wasn't my fault. :-)
-
-2000-03-31 Dan Winship <danw@helixcode.com>
-
- * camel-stream-mem.c: implement unimplemented methods
-
- * gmime-content-field.c
- (gmime_content_field_construct_from_string):
- * data-wrapper-repository.c
- (data_wrapper_repository_get_data_wrapper_type):
- * camel-simple-data-wrapper.c (my_write_to_stream):
- * camel-mime-part.c (my_set_input_stream):
- remove debugging printf()s that no longer seem useful.
-
-2000-03-31 Matt Loper <matt@helixcode.com>
-
- * camel-formatter.c (text_to_html): Added "convert_newlines_to_br"
- boolean param, to give the option of not converting '\n's to <br>
- tags. This way, when we stick stuff in a <pre> tag, newlines stay
- newlines.
-
-2000-03-30 Matt Loper <matt@helixcode.com>
-
- * camel-formatter.c (handle_text_plain): Use <pre> tag to force
- the use of monospaced fonts.
-
-2000-03-30 Dan Winship <danw@helixcode.com>
-
- * camel-service.c (camel_service_getport): Add a htons in the
- default_number case, and document the fact that the function
- returns the port in network byte order.
-
- * providers/pop3/camel-pop3-store.c (pop3_connect): Revert
- Miguel's change. The port number bug was actually somewhere
- else, and the IP address copying code was fine already.
-
-2000-03-29 Miguel de Icaza <miguel@gnu.org>
-
- * providers/pop3/camel-pop3-store.c (pop3_connect): Add htons
- (port), and only copy 4 bytes for the IP address to prevent a DNS
- attack.
-
-2000-03-28 Dan Winship <danw@helixcode.com>
-
- * camel-seekable-substream.c
- (camel_seekable_substream_new_with_seekable_stream_and_bounds):
- make this return a CamelStream rather than a
- CamelSeekableSubstream, because that's the way Gtk objects tend to
- work.
-
- * camel-service.c (camel_service_gethost,
- camel_service_getport): convenience functions to canonicalize
- the host and port values of a service's URL.
- * providers/pop3/camel-pop3-store.c: use them
-
- * providers/mbox/camel-mbox-folder.c
- (_check_get_or_maybe_generate_summary_file): Make this work when
- the inbox file doesn't yet exist.
-
-2000-03-27 Dan Winship <danw@helixcode.com>
-
- * providers/mbox/camel-mbox-folder.c (_append_message): uncomment
- the call to unlink the temp file: there's no way to tell
- camel_stream_fs to truncate a file, so reusing the same file was
- resulting in junk at the ends of messages.
-
- * camel-folder.[ch]: add delete_message_by_{number,uid}.
-
- * providers/pop3/camel-pop3-folder.[ch]: implement
- delete_message_by_uid. Add a close method to do expunging
- of deleted messages if requested.
-
- * providers/pop3/camel-pop3-store.[ch]: support for
- CamelPop3Folder::close. (You have to close the connection
- in order to expunge the folder, thus the store may be
- connected in the CamelService::is_connected sense when it
- is not actually connected to the server.) Also some bugfixes.
-
-2000-03-27 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-folder.c (_append_message): Unref the
- output_stream when done, close doesn't do it.
- (_append_message): Clear all uid's from the appending messages, so
- they are reassigned proper unique id's.
-
- * gmime-utils.c (get_header_array_from_stream): Actually free the
- header, it is copied elsewhere.
-
-2000-03-26 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev): Added
- folder parameter to function. Fixed callers.
- (index_message): Index a message as it is assigned a unique id.
-
- * camel-mime-part.c (my_set_content_id): Make sure we malloc and
- copy the content_id, otherwise *poof*
-
-2000-03-25 NotZed <NotZed@HelixCode.com>
-
- * camel-medium.c (_finalize): Another leak, unref the content if
- finished with it.
-
- * camel-recipient.c (camel_recipient_table_free): Plug another
- memory leak - actually free the recipient table.
-
- * camel-mime-message.c (_finalize): Plugged a memory leak with the
- flags table.
-
- * gmime-utils.c (_store_header_pair_from_string): A simpler, more
- debuggable and functionally identical header extraction function.
-
-2000-03-24 NotZed <NotZed@HelixCode.com>
-
- * gmime-content-field.c (gmime_content_field_set_parameter):
- Remove the hash table entry before freeing its key and data.
-
-2000-03-27 Dan Winship <danw@helixcode.com>
-
- * providers/Makefile.am (SUBDIRS): Add pop3.
-
- * providers/pop3/camel-pop3-store.c: keep separate input and
- output streams so the output doesn't end up being buffered.
-
- * providers/pop3/camel-pop3-folder.c (get_message_by_number):
- finish implementing this.
-
-2000-03-27 Michael Meeks <michael@helixcode.com>
-
- * camel-mime-part.c (my_set_disposition): fix so less broken.
- (my_finalize): remove dodgy disposition free.
-
- * camel-data-wrapper.c (my_set_mime_type_field): unref instead of
- free on mime_type.
-
-2000-03-27 Dan Winship <danw@helixcode.com>
-
- * camel-service.c (camel_service_free_auth_types): new routine to
- free the data allocated by camel_service_query_auth_types.
-
- * providers/pop3/camel-pop3-store.c (free_auth_types): implement
-
- * camel-stream-mem.c (camel_stream_mem_new_with_buffer): rename
- camel_stream_mem_new_with_buffer to ..._with_byte_array and add a
- new ..._with_buffer that takes a char * rather than a GByteArray.
-
- * Remove CamelStreamBufferedFs, since CamelStreamBuffer makes it
- redundant.
-
-2000-03-25 Dan Winship <danw@helixcode.com>
-
- * camel-folder-summary.[ch]: change the CamelFolderSummary
- interfaces to allow partial summary queries (for dealing
- with very large folders). Remove the "extended_fields" from
- CamelFolderInfo and CamelMessageInfo: this is better dealt
- with by subtyping.
-
- * providers/mbox/camel-mbox-summary.[ch]: Make CamelMboxSummary a
- subclass of CamelFolderSummary. Update interfaces for that. Remove
- the internal/external summary distinction. Remove the (unused) md5
- checksum in the folder summary. Change the summary file format
- (primarily to make it no longer byte-order dependent) and add a
- version number to it so it will be easier to change in the future.
-
- * providers/mbox/camel-mbox-folder.[ch]
- * providers/mbox/camel-mbox-search.c
- * providers/mbox/camel-mbox-utils.c: update for summary changes
-
- * camel-exception-list.def: add
- CAMEL_EXCEPTION_FOLDER_SUMMARY_INVALID
-
-2000-03-23 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-provider.c: Added flag to provider
- initialisation, to match changed structure.
-
-2000-03-22 NotZed <NotZed@HelixCode.com>
-
- * camel-folder.[ch]: Added async search api.
-
- * providers/mbox/camel-mbox-search.c
- (camel_mbox_folder_search_by_expression): Changed to use an
- asynchronous interface.
- (camel_mbox_folder_search_cancel): Cancel function for async
- interface.
-
-2000-03-23 Dan Winship <danw@helixcode.com>
-
- * camel-stream-buffer.c (camel_stream_buffer_read_line): Function
- to read one line of any size from a stream and return it in
- allocated memory.
-
-2000-03-22 Dan Winship <danw@helixcode.com>
-
- * camel-service.c (camel_service_query_auth_types): New function
- to query a service for the authentication protocols it supports.
- * providers/pop3/camel-pop3-store.c (query_auth_types): implement
-
- * camel-provider.c (camel_provider_scan): New function to
- scan the provider dir and return a list of all providers.
-
- * providers/pop3/camel-pop3-folder.c: fill this in partially
- * providers/pop3/camel-pop3-store.c: make camel_pop3_command
- return the text after "+OK"/"-ERR" and add a separate
- camel_pop3_get_additional_data to get the message body or
- whatever. Also make them take a CamelPop3Store rather than
- a CamelStreamBuffer.
-
-2000-03-22 Matt Loper <matt@helixcode.com>
-
- * camel-formatter.c (debug): Disabled some useless debug
- messaging.
-
-2000-03-21 Dan Winship <danw@helixcode.com>
-
- * providers/pop3: some initial bits of the POP3 provider, to
- make Matt happy. Incomplete, untested, etc.
-
-2000-03-21 bertrand <bertrand@helixcode.com>
-
- * providers/mbox/camel-mbox-summary.c
- (camel_mbox_summary_append_internal_to_external): copy the size field
-
- * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): initialize
- message_info to NULL
-
- * camel-folder-summary.h: added the size field.
-
- * providers/mbox/camel-mbox-summary.h:
- added the received_date field.
-
- * providers/mbox/camel-mbox-summary.c:
- documented all functions.
-
- * camel-folder-summary.h: name change and
- new fields.
-
- * providers/mbox/camel-mbox-search.c: update to
- conform to name change in the summary fields.
-
-2000-03-10 bertrand <bertrand@helixcode.com>
-
- * camel-service.h: cosmetic changes.
-
-2000-03-09 Dan Winship <danw@helixcode.com>
-
- * s/HelixCode/Helix Code, Inc./ in the copyrights
-
-2000-03-07 bertrand <bertrand@helixcode.com>
-
- * camel-formatter.c (handle_mime_part):
- plug mem leaks due to bad documentation
- of camel_content_field_get_mime_type
- (print_camel_body_part): idem
- (handle_multipart_alternative): idem
-
- * gmime-content-field.c (gmime_content_field_get_mime_type):
- documentation fix.
-
-
- * camel-mime-part.c (my_finalize): unref the
- content_input_stream if any.
-
-2000-03-06 bertrand <bertrand@helixcode.com>
-
- * camel-stream-fs.c (_seek): fix a bogus calculation
- in the return position.
-
-2000-03-05 bertrand <bertrand@helixcode.com>
-
- * camel-session.h: cosmetic fixes.
-
- * camel-stream-fs.c (_read):
- (_seek): fixed the current position so that it refers
- to the current position in the stream, not in its parent.
-
-2000-03-04 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-search.c
- (camel_mbox_folder_search_by_expression): Ref the summary
- after we have got it.
-
-2000-03-04 bertrand <bertrand@helixcode.com>
-
- * camel-mime-part.c (my_write_content_to_stream):
- stream the raw content instead of nothing if the encoding
- is not supported.
-
- * camel-stream-fs.c (_seek): handle eos more
- properly.
-
- * camel-formatter.c (get_bonobo_tag_for_object):
- bonobo-goad-id is the good key to look for.
- (get_bonobo_tag_for_object): close the <object> tag.
- (get_bonobo_tag_for_object): the correct syntax for the
- to set a parameter inside an <object> tag is :
- <object classid="..."> <param name="uid" value="..."> <param ...>
- </object>
-
-2000-03-03 bertrand <bertrand@helixcode.com>
-
- * providers/mbox/camel-mbox-folder.c (_get_message_by_uid):
- use set_input_stream instead of construct_from_stream
- to feed the message object.
-
- * camel-data-wrapper.c (my_write_to_stream): reset output stream.
- (my_set_input_stream): unref the previous input stream.
- use the set_output_stream for default behaviour.
- (my_set_output_stream): unref previous output stream.
-
- * camel-mime-part.c (my_write_content_to_stream): reset content
- object output stream.
-
-2000-03-03 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev): Make
- sure we open with create with a creation mask.
-
-2000-03-01 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-part-utils.c
- (camel_mime_part_construct_content_from_stream): DO NOT assert on
- content type, we have fallback code 4 lines below it ... *sigh*
-
-2000-02-29 NotZed <NotZed@HelixCode.com>
-
- * Makefile.am (libcamelinclude_HEADERS): Added camel-stream-buffer
- to build.
-
- * camel-stream-buffer.[ch]: Generic buffer which can be applied to
- any stream.
-
-2000-03-03 bertrand <bertrand@helixcode.com>
-
- * camel-formatter.c (handle_image): in the case
- of images, put the content object output stream
- in the url. This allows the message browser
- to show inline images.
-
- * camel-stream-b64.c (my_read_encode): fixed state
- 0 keep value.
-
-2000-03-02 bertrand <bertrand@helixcode.com>
-
- * camel-stream-b64.c (my_read_encode): don't forget to
- set the state to 0 after 3.
- (my_read_encode): don't forget to encode, even in state 3.
-
- * camel-simple-data-wrapper.c: static functions are prefixed
- with my_ instead of _
- * camel-multipart.c: static functions are prefixed
- with my_ instead of _
- (my_write_to_stream): commented.
- (my_write_to_stream): warning in case the boudary is set
- but is a zero length string.
-
- * camel-mime-part.c (camel_mime_part_encoding_from_string):
- remove debug trace.
-
- * camel-mime-part.c: Replaced all static functions
- with name begining with _ by the same name begining
- with "my_" to prevent the possible conflicts
- with system symbols Dan warned us about.
-
- * camel-stream-b64.c (camel_stream_b64_write_to_stream):
- use CamelStreamB64 type for the input stream.
-
- * camel-mime-part.c (_get_content_object): remove
- debugging trace
- (_write_content_to_stream): implement the b64
- encoding the new way (that is using camel_stream_b64)
-
- * camel-data-wrapper.c (my_write_to_stream):
- fix implementation so that it writes properly
- to the output stream even.
-
- * camel-stream-b64.c (camel_stream_b64_write_to_stream):
- fix implementation.
-
-2000-02-29 bertrand <bertrand@helixcode.com>
-
- * camel-stream-b64.c (camel_stream_b64_write_to_stream): new
- utility function.
-
- * camel-data-wrapper.c (_write_to_stream): default
- implementation.
-
- * gmime-utils.c (_store_header_pair_from_string):
- revert strange changes.
-
- * camel-stream-b64.c (my_read_decode): set eos to true when we
- have read the whole input stream.
- (my_reset): set eos to FALSE.
-
-2000-02-28 NotZed <NotZed@HelixCode.com>
-
- * camel-mime-part.c (_parse_header_pair): Dont free this either.
-
- * camel-medium.c (_remove_header): Ugh, dont free the header
- before we actually remove it.
- (_add_header): Ugh, dont free hashtable entries which may be
- duplicated (hash_insert _will_ reference that memory).
-
- * string-utils.c (string_trim): Trimming a 0-length string is not
- an error.
-
- * camel-mime-message.c (_parse_header_pair): Fixed very broken
- memory handling of header_name/value.
-
- * providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev):
- Initialise end_of_last_message always.
- (camel_mbox_copy_file_chunk): Stop trying to read if we run out of
- data, rather than looping forever.
- (camel_mbox_write_xev): Use an open flag when opening with create.
-
- * camel-folder.c (camel_folder_search_by_expression): No, its not
- a fatal error to search on a non-searchable folder, you just dont
- get any matches.
- (_open): Dont open an opened folder (i dont see why this is really
- a bug, but what the hell ...)
-
- * providers/mbox/camel-mbox-folder.c (_init): Set search cap on.
- (_open): Call parent class to perform open. Remove folder-open
- check to parent instead.
- (_create): open takes a creation mask, dont use umask to try and
- set the open mode.
- (_delete): Dont bother checking folder==NULL, its already been
- checked on the external interface (changed to an assertion, this
- would have to be a camel bug).
- (_delete_messages): Likewise.
- (_create): Ditto.
- (_init): Dont go and clear all the paths and shit that the parent
- open just setup for us.
- (_delete_messages): Get rid of more umask stuff.
- (_append_message): Make sure we pass file mode to open with create.
- (_append_message): Cleaned up some indenting to make it readable.
-
- * camel-stream-b64.c (my_read_encode): Fixed a typo.
-
- * providers/mbox/camel-mbox-search.c: Changed to use e-sexp,
- rather than filter-sexp.
-
-2000-02-28 bertrand <bertrand@helixcode.com>
-
- * camel-stream-b64.c (my_read_encode): encoding
- filter.
-
-2000-02-23 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel-stream-b64.c: changed the __static
- suffix into a my_ prefix.
- (camel_stream_b64_set_mode): reset the persistent
- status.
- (my_read_decode): remove superfluous %
-
- * providers/mbox/camel-mbox-utils.c (camel_mbox_copy_file_chunk):
- fix exception description message.
-
-2000-02-24 Dan Winship <danw@helixcode.com>
-
- * camel-session.c: Add camel_session_get_transport_for_protocol.
-
- * camel-transport.h:
- * camel-transport.c: Add an abstract CamelTransport class.
-
- * providers/sendmail/*: A CamelTransport that uses sendmail
- to deliver mail.
-
-2000-02-24 Dan Winship <danw@helixcode.com>
-
- * camel-folder.c: use CamelExceptions for run-time errors, not
- incorrect code. Don't bother validating that an object exists from
- inside one of its methods, since you couldn't have gotten there if
- it didn't. Fix some code style bugs.
-
- (_init): Rename init_with_store to init and add parent_folder,
- separator, and name arguments.
- (_set_name): Get separator from self, not parent_store now.
-
- * camel-store.h:
- * camel-store.c: Remove get/set_separator.
-
- * providers/mbox/: Update for above.
-
-2000-02-23 Dan Winship <danw@helixcode.com>
-
- * camel-medium.c (_finalize): Free the data in the headers hash
- table.
- (_add_header): g_strdup the header name and value when adding it.
-
- * camel-mime-part-utils.c
- (camel_mime_part_construct_headers_from_stream): Free the header
- data after calling camel_medium_add_header, since it will have
- g_strdup()ed it itself.
-
-2000-02-22 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-search.c: Dont compile by default.
-
- * providers/mbox/Makefile.am: Fuck off the filter code.
-
-2000-02-22 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel-stream-b64.c (read_decode__static):
- don't read the char if we reached the length
- of the output buffer. Hours lost on this
- %$!@# bug : 3.5
-
- * camel-folder.c (camel_folder_get_subfolder):
- (camel_folder_create):
- (camel_folder_delete):
- (camel_folder_delete_messages):
- (camel_folder_list_subfolders):
- (camel_folder_expunge):
- (camel_folder_get_message_by_number):
- (camel_folder_get_message_count):
- (camel_folder_append_message):
- (camel_folder_copy_message_to):
- (camel_folder_get_summary):
- (camel_folder_get_message_uid):
- (camel_folder_get_message_by_uid):
- (camel_folder_get_uid_list):
- Check folder state (open/close) and raise an
- exception if it is not ok.
-
- * providers/mbox/camel-mbox-folder.c (_create):
- create the file and the path with two different
- names.
-
- * camel-folder.c (_create): handle the case
- when the folder name starts with '/'
-
- * camel-exception.c (camel_exception_new): use
- (void) instead of () in decl.
-
- * camel-exception.h: cosmetic fixes.
-
- * camel-exception.c (camel_exception_init): new routine.
- Fix a bug in mail/message-list.c
-
-
- * camel-folder.h: cosmetic changes.
-
- * camel-stream-b64.c (reset__static): added a
- reset method. Thanks message-browser to find
- so much bugs :)
-
- * providers/mbox/Makefile.am (libcamelmbox_la_LIBADD): readd
- Unicode libs.
-
-2000-02-21 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel-formatter.c (lookup_unique_id):
- awful hack to test get_output_stream.
- * camel-stream-b64.[ch] :
- b64 encoding/decoding is now implemented as
- a stream.
-
-
-2000-02-21 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel-seekable-substream.c (_reemit_parent_signal):
- emit "data_available" when parent stream emits it.
-
-
-2000-02-21 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/Makefile.am: Uh, fixed LIBADD again. What was
- there was never ever going to work, wasn't it tested?
-
-
-2000-02-21 Dan Winship <danw@helixcode.com>
-
- * camel-session.h: (struct _CamelSession): Add authenticator.
-
- * camel-session.c (camel_session_new): Add authenticator.
- (camel_session_query_authenticator): New function to query the
- session authenticator for password, etc, information.
-
-2000-02-21 Dan Winship <danw@helixcode.com>
-
- * camel-session.c: add CamelExceptions to several functions. Use
- camel_session_new to initialize the session and URL fields of
- created CamelStores as appropriate.
-
- * camel-store.h:
- * camel-store.c
- * camel-service.h:
- * camel-service.c: Move the session and url (and associated
- functions) from CamelStore to CamelService. Add url_flags to
- CamelService so subclasses can specify which URL components
- are mandatory for them. Add camel_session_new for
- camel_session_get_store* to use.
-
- * providers/mbox/camel-mbox-folder.c:
- * providers/mbox/camel-mbox-store.c:
- * providers/mbox/camel-mbox-store.h: Update for above changes.
-
- * camel-exception-list.def: Once camel is being used for real,
- exceptions won't be renumberable. So renumber them now to make
- more room to add exceptions to the various categories later, and
- add a big warning message.
-
-2000-02-20 Dan Winship <danw@helixcode.com>
-
- * providers/mbox/Makefile.am: add libibex back to
- libcamelmbox_la_LIBADD
-
-2000-02-18 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/camel-mbox-search.h
- (camel_mbox_folder_search_by_expression): Added exception to call,
- and fixed caller.
-
- * providers/mbox/camel-mbox-search.c
- (camel_mbox_folder_search_by_expression): Major changes, to use
- the sexp evaluator from filter/filter-sexp.c to implement the
- searching.
- (func_body_contains): Changed to support multiple strings in 1
- command (results or'd together)
-
- * url-util.c (g_url_new): Fixed a typo (colon == 0 isn't right),
- and made it so full url's are absolute pathed (Dan, this is how it
- has to work!). Also, always include a path part, even if it is an
- empty string.
-
-2000-02-18 Dan Winship <danw@helixcode.com>
-
- * camel/camel-types.h: New header with the typedefs for all camel
- classes. Now the class headers can just include this and the
- header for the parent type. This makes it possible for
- CamelService to include a CamelSession without creating an
- #include loop.
-
- * camel/*:
- * composer/e-msg-composer-attachment-bar.h:
- * mail/folder-browser.c:
- * mail/message-list.c: frob #includes to match the new reality
-
-2000-02-17 Dan Winship <danw@helixcode.com>
-
- * camel/camel-service.h:
- * camel/camel-service.c: Make camel-service us a Gurl internally.
- Remove the login/password interfaces and instead provide
- camel_service_connect_with_url. Add CamelExceptions
-
-2000-02-17 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-formatter.c (handle_text_plain):
- (handle_text_html): use camel_stream_reset instead
- of seek. The formatter should be able to work
- with all streams, not only seekable streams.
- In the case where some provider implementation
- would not be able to provide a reset method
- to their stream, implementors would have
- to find a workaround.
-
- * camel/camel-session.c (camel_session_new): use
- (void) instean of () in function decl.
-
- * camel/camel-folder.c: ifdef async operation
- related code.
-
- * camel/camel-seekable-stream.c (_seek): added a warning.
- (_reset): default implementation of reset for seekable
- stream.
-
- * camel/camel-mime-message.h: set_received_date declaration fix.
- cosmetic changes.
-
- * camel/providers/mbox/camel-mbox-provider.c (camel_provider_module_init):
- use (void) instead of ().
-
- * camel/camel-stream.c (camel_stream_reset):
- new method for CamelStream.
-
-2000-02-17 Dan Winship <danw@helixcode.com>
-
- * camel/url-util.c (g_url_to_string): New function to convert
- a Gurl back into a char *.
-
-2000-02-17 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-formatter.c (handle_text_plain):
- revamped so that it uses the output stream
- of the data wrapper
- (handle_text_html): ditto.
-
-
- * camel/camel-simple-data-wrapper.h:
- * camel/camel-simple-data-wrapper.c (camel_simple_data_wrapper_new):
- use (void) instead of ().
- (_get_output_stream): simple implementation.
-
-2000-02-16 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-data-wrapper.c (_set_input_stream): ref input stream
- (_set_output_stream): ref output stream
- (_finalize): unref input and output streams
-
- * camel/camel-seekable-substream.c (_set_bounds): don't
- seek the begining of the substream.
- (_eos): fix eos condition testing.
- (_finalize): unref parent stream
- (_init_with_seekable_stream_and_bounds): ref parent stream
-
- * camel/gstring-util.c (g_string_equal_for_hash):
- (g_string_equal_for_glist): return type is int.
-
- * camel/camel.h:
- * camel/camel.c (camel_init): use (void)
- instead of ().
-
-2000-02-16 NotZed <NotZed@HelixCode.com>
-
- * providers/mbox/Makefile.am (libcamelmbox_la_LIBADD): Added
- libfilter to link line (temporarily?). Required for
- filter-sexp.
-
-2000-02-15 bertrand <bertrand@helixcode.com>
-
- * camel/camel-multipart.c (_localize_part):
- this routine replaces the _read_part routine
- and does not store the part in a buffer.
- (_set_input_stream): use the set_input_stream
- instead of the construct_from_stream.
- each bodypart is given an input stream.
-
- * camel/camel-mime-part-utils.c:
- include the data-wrapper-repository header.
- (camel_mime_part_construct_content_from_stream):
- use the set_input_stream instead of the
- construct_from_stream method.
-
- * camel/camel-seekable-substream.c (_set_bounds):
- cur position is set to 0 not to inf_bound.
-
-2000-02-15 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c: include gmime-base64.h
- various compilation and runtime fixes.
- (_set_input_stream): store the input substream
- for the content object.
-
- * camel/camel-data-wrapper.h: declare the
- set/get function on input/output stream.
-
- * camel/camel-mime-part.c (_get_content_object):
- don't use a temporary mem stream.
-
- * camel/camel-seekable-substream.c (_seek):
- (_eos):
- (_read): the substream can be unlimited in length
-
- * camel/camel-data-wrapper.c (camel_data_wrapper_class_init):
- set the get/set_input/output_stream methods.
-
- * camel/camel-multipart.c (_construct_from_stream):
- camel_stream_seek -> camel_seekable_stream_seek
-
-2000-02-14 Miguel de Icaza <miguel@gnu.org>
-
- * camel/providers/mbox/Makefile.am (libcamelmbox_la_LIBADD): Add
- the unicode libraries as well.
-
- * camel/camel-provider.c (camel_provider_register_as_module): Add
- error reporting here. Desire to use Solaris increases. Hair loss
- in the last two hours: 5,400.
-
- * camel/providers/mbox/camel-mbox-provider.c
- (camel_mbox_get_provider): Renamed function.
-
- * camel/camel.h: All include files use camel/ now here.
-
- * camel/providers/mbox/Makefile.am: Drop all the dynamism from
- Camel, and make this a standard library.
-
-2000-02-14 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/gmime-utils.c (get_header_array_from_stream): use the
- eos stream method.
- (gmime_read_line_from_stream): ditto.
-
- * camel/camel-stream-fs.h (struct ): add the eof field
- cosmetics changes.
-
- * camel/camel-stream-fs.c (camel_stream_fs_init): set eof.
- (_read): set eof on end of file.
- (_eos): implemented.
-
- * camel/gmime-utils.c (get_header_array_from_stream):
- make a blocking version of the header parser.
- When the fs stream uses gnome-vfs, this should
- be changed.
- (gmime_read_line_from_stream): ditto.
-
-2000-02-11 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-stream-fs.c:
- everywhere, when using the cur_pos field, do it
- on the CamelSeekableStream object.
- (_seek): small fix.
-
- * camel/camel-seekable-stream.c (camel_seekable_stream_seek):
- s/camel_stream_seek/camel_seekable_stream_seek/g
-
- * camel/camel-seekable-stream.h:
- (struct ): added a field to store the
- current position.
-
- * camel/camel-seekable-stream.c (camel_seekable_stream_get_current_position):
- New function. Allows to get the current position
- of a seekable stream.
-
-
-2000-02-13 NotZed <notzed@zedzone.helixcode.com>
-
- * providers/mbox/camel-mbox-search.c: New file, implements the
- search api for mbox folders.
-
- * providers/mbox/Makefile.am: Link with ibex.
-
- * camel-folder.c (camel_folder_has_search_capability): Api
- additions.
- (camel_folder_search_by_expression): Ditto.
-
-2000-02-12 NotZed <notzed@zedzone.helixcode.com>
-
- * providers/mbox/camel-mbox-folder.c (_set_name): Setup index
- filename as well.
- (_init_with_store): Init index filename. Hmm, none of these
- names ever seem to get free'd (FIXME?)
-
- * providers/mbox/camel-mbox-folder.h: Add index file name.
-
-2000-02-12 NotZed <notzed@helixcode.com>
-
- * camel-folder.h: Add folder search functions.
-
- ** Created ChangeLog just for camel **
- - refer to ../ChangeLog for changes prior to this date.
diff --git a/camel/Makefile.am b/camel/Makefile.am
deleted file mode 100644
index 4d2c29a4ca..0000000000
--- a/camel/Makefile.am
+++ /dev/null
@@ -1,131 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-SUBDIRS = providers
-
-libcamelincludedir = $(includedir)/camel
-providerdir = $(libdir)/evolution/camel-providers/$(VERSION)
-
-lib_LTLIBRARIES = libcamel.la
-
-INCLUDES = -I.. -I$(srcdir)/.. -I$(includedir) \
- -I$(top_srcdir)/intl \
- $(GLIB_CFLAGS) \
- $(UNICODE_CFLAGS) \
- -DCAMEL_PROVIDERDIR=\""$(providerdir)"\" \
- -DG_LOG_DOMAIN=\"camel\"
-
-libcamel_la_SOURCES = \
- broken-date-parser.c \
- camel-address.c \
- camel-data-wrapper.c \
- camel-exception.c \
- camel-folder-search.c \
- camel-folder-summary.c \
- camel-folder.c \
- camel-internet-address.c \
- camel-medium.c \
- camel-mime-filter-basic.c \
- camel-mime-filter-charset.c \
- camel-mime-filter-crlf.c \
- camel-mime-filter-from.c \
- camel-mime-filter-index.c \
- camel-mime-filter-save.c \
- camel-mime-filter.c \
- camel-mime-message.c \
- camel-mime-parser.c \
- camel-mime-part-utils.c \
- camel-mime-part.c \
- camel-mime-utils.c \
- camel-movemail.c \
- camel-multipart.c \
- camel-object.c \
- camel-provider.c \
- camel-seekable-stream.c \
- camel-seekable-substream.c \
- camel-service.c \
- camel-session.c \
- camel-store.c \
- camel-stream-buffer.c \
- camel-stream-filter.c \
- camel-stream-fs.c \
- camel-stream-mem.c \
- camel-stream.c \
- camel-transport.c \
- camel-uid-cache.c \
- camel-url.c \
- camel.c \
- gmime-content-field.c \
- gstring-util.c \
- hash-table-utils.c \
- md5-utils.c \
- string-utils.c
-
-libcamelinclude_HEADERS = \
- broken-date-parser.h \
- camel-address.h \
- camel-data-wrapper.h \
- camel-exception-list.def \
- camel-exception.h \
- camel-folder-search.h \
- camel-folder-summary.h \
- camel-folder.h \
- camel-internet-address.h \
- camel-medium.h \
- camel-mime-filter-basic.h \
- camel-mime-filter-charset.h \
- camel-mime-filter-crlf.h \
- camel-mime-filter-from.h \
- camel-mime-filter-index.h \
- camel-mime-filter-save.h \
- camel-mime-filter.h \
- camel-mime-message.h \
- camel-mime-parser.h \
- camel-mime-part-utils.h \
- camel-mime-part.h \
- camel-mime-utils.h \
- camel-movemail.h \
- camel-multipart.h \
- camel-object.h \
- camel-provider.h \
- camel-seekable-stream.h \
- camel-seekable-substream.h \
- camel-service.h \
- camel-session.h \
- camel-store.h \
- camel-stream-buffer.h \
- camel-stream-filter.h \
- camel-stream-fs.h \
- camel-stream-mem.h \
- camel-stream.h \
- camel-transport.h \
- camel-types.h \
- camel-uid-cache.h \
- camel-url.h \
- camel.h \
- gmime-content-field.h \
- gstring-util.h \
- hash-table-utils.h \
- md5-utils.h \
- string-utils.h
-
-libcamel_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir)
-
-EXTRA_DIST = \
- README
-
-#noinst_PROGRAMS = \
-# camel-mime-filter-from
-#
-#camel_mime_filter_from_SOURCES = \
-# camel-mime-filter-from.c
-#
-#camel_mime_filter_from_LDADD = \
-# ../camel/libcamel.la \
-# ../e-util/libeutil.la \
-# ../libibex/libibex.la \
-# $(GNOME_LIBDIR) \
-# $(GNOMEUI_LIBS) \
-# $(INTLLIBS) \
-# $(PTHREAD_LIB) \
-# $(EXTRA_GNOME_LIBS)
-
diff --git a/camel/README b/camel/README
deleted file mode 100644
index f020174d5e..0000000000
--- a/camel/README
+++ /dev/null
@@ -1,57 +0,0 @@
-
- CAMEL
-
-
- A generic Messaging Library
-
-
- ----
-
-
-Introduction:
--------------
-
-Camel will be a generic messaging library. It will evntually support
-the standard messaging system for receiving and sending messages.
-It aims at being the backend for the future gnome-mailer system.
-
-The name "camel" stands for ... nothing. Open area of development there.
-You know, that "bazaar" thing. Maybe could we organize a big contest on
-gnome-list to find the best explanation :)
-
-Camel draws heavily from JavaMail and the IMAP4rev1 RFC. People
-wanting to hack on a provider should read the JavaMail API
-specification, but CMC and MAPI are of interest too.
-
-Please, before starting anything, wait for me to finish the abstract
-classes. Some parts are not definitive yet.
-
-
-Organization:
--------------
-
-The library is roughly a set of abstract classes, some kind of generic
-"interfaces" (idl interfaces, not java interfaces ).
-
-Particular implementations are called providers.
-
-Here are the basic objects:
-
-* CamelService : an abstract class representing an access to a server.
-Handles the connection and authentication to any server.
-
-* CamelStore (CamelService): A hierarchy of folders on a server.
-
-* CamelFolder : An object containing messages. A folder is always
-associated with a store.
-
-* CamelMessage : An object contained in folders. Is defined by a set
-of attributes and a content. (Attributes include: the date it was
-received, the sender address, .....)
-
-* CamelTransport (CamelService): A way to send messages.
-
-....
-...
-
-
diff --git a/camel/README.COPYRIGHT b/camel/README.COPYRIGHT
deleted file mode 100644
index 91774e7339..0000000000
--- a/camel/README.COPYRIGHT
+++ /dev/null
@@ -1,47 +0,0 @@
-Important note for Camel hackers:
----------------------------------
-
-Camel has been a lot of work, and has been conceived to be general
-enough to be used outside the gnome-mailer. It is possible in the
-future that it is used in softwares with licenses incompatible with the
-LGPL. For this reason, the copyright has to be owned by a unique
-person. Be sure, however, that Camel will always be available under
-the LGPL. Significant authors will always be consulted before any
-special use of Camel. Moreover, in special situations, they may be
-given the authorization to use Camel with a license different than the
-LGPL.
-
-Thus, when adding code in Camel, always add the following lines at the
-begining of the file:
-
-/*
- *
- * Copyright 199x, 200x Helix Code, Inc. (http://www.helixcode.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
- */
-
-You may also want to add your name to the author name list after this
-header.
-
-Please contact me (Bertrand.Guiheneuf@aful.org) if you want to discuss
-this copyright issue.
-
-Happy hacking,
-
-Bertrand.
-
-
diff --git a/camel/README.HACKING b/camel/README.HACKING
deleted file mode 100644
index a4742ee7b8..0000000000
--- a/camel/README.HACKING
+++ /dev/null
@@ -1,14 +0,0 @@
-You want to hack on Camel ?
-
-Thanks. Camel aims at being the best messaging
-library for Linux and your help is welcome.
-Please be sure to read the following files before
-commiting any change or sending any patch:
-
-CODING.STYLE
-README.COPYRIGHT
-
-
-Thanks.
-
- Bertrand <Bertrand.Guiheneuf@aful.org> \ No newline at end of file
diff --git a/camel/broken-date-parser.c b/camel/broken-date-parser.c
deleted file mode 100644
index 544dc04e28..0000000000
--- a/camel/broken-date-parser.c
+++ /dev/null
@@ -1,315 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (www.helixcode.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.
- *
- */
-
-#include "broken-date-parser.h"
-
-/* prototypes for functions dealing with broken date formats */
-static GList *datetok (const gchar *date);
-static gint get_days_in_month (gint mon, gint year);
-static gint get_weekday (gchar *str);
-static gint get_month (gchar *str);
-
-static char *tz_months [] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
-};
-
-/*****************************************************************************
- * The following functions are here in the case of badly broken date formats *
- * *
- * -- fejj@helixcode.com *
- *****************************************************************************/
-
-typedef struct {
- gchar dow[6]; /* day of week (should only need 4 chars) */
- gint day;
- gint mon; /* 1->12 or 0 if invalid */
- gint year;
- gint hour;
- gint min;
- gint sec;
- gchar zone[6]; /* time zone */
-} date_t;
-
-static
-GList *datetok (const gchar *date)
-{
- GList *tokens = NULL;
- gchar *token, *start, *end;
-
- start = (gchar *) date;
- while (*start) {
- /* find the end of this token */
- for (end = start; *end && *end != ' '; end++);
-
- token = g_strndup (start, (end - start));
-
- if (token && *token)
- tokens = g_list_append (tokens, token);
- else
- g_free (token);
-
- if (*end)
- start = end + 1;
- else
- break;
- }
-
- return tokens;
-}
-
-static gint
-get_days_in_month (gint mon, gint year)
-{
- switch (mon) {
- case 1: case 3: case 5: case 7: case 8: case 10: case 12:
- return 31;
- case 4: case 6: case 9: case 11:
- return 30;
- case 2:
- if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
- return 29;
- return 28;
- default:
- return 30;
- }
-}
-
-static gint
-get_weekday (gchar *str)
-{
- g_return_val_if_fail ((str != NULL), 0);
-
- if (strncmp (str, "Mon", 3) == 0) {
- return 1;
- } else if (strncmp (str, "Tue", 3) == 0) {
- return 2;
- } else if (strncmp (str, "Wed", 3) == 0) {
- return 3;
- } else if (strncmp (str, "Thu", 3) == 0) {
- return 4;
- } else if (strncmp (str, "Fri", 3) == 0) {
- return 5;
- } else if (strncmp (str, "Sat", 3) == 0) {
- return 6;
- } else if (strncmp (str, "Sun", 3) == 0) {
- return 7;
- }
-
- return 0; /* unknown week day */
-}
-
-static gint
-get_month (gchar *str)
-{
- g_return_val_if_fail (str != NULL, 0);
-
- if (strncmp (str, "Jan", 3) == 0) {
- return 1;
- } else if (strncmp (str, "Feb", 3) == 0) {
- return 2;
- } else if (strncmp (str, "Mar", 3) == 0) {
- return 3;
- } else if (strncmp (str, "Apr", 3) == 0) {
- return 4;
- } else if (strncmp (str, "May", 3) == 0) {
- return 5;
- } else if (strncmp (str, "Jun", 3) == 0) {
- return 6;
- } else if (strncmp (str, "Jul", 3) == 0) {
- return 7;
- } else if (strncmp (str, "Aug", 3) == 0) {
- return 8;
- } else if (strncmp (str, "Sep", 3) == 0) {
- return 9;
- } else if (strncmp (str, "Oct", 3) == 0) {
- return 10;
- } else if (strncmp (str, "Nov", 3) == 0) {
- return 11;
- } else if (strncmp (str, "Dec", 3) == 0) {
- return 12;
- }
-
- return 0; /* unknown month */
-}
-
-gchar *
-parse_broken_date (const gchar *datestr)
-{
- GList *tokens;
- date_t date;
- gchar *token, *ptr, *newdatestr;
- guint len, i, retval;
- gdouble tz = 0.0;
-
- memset ((void*)&date, 0, sizeof (date_t));
- g_return_val_if_fail (datestr != NULL, NULL);
-
- tokens = datetok (datestr);
- len = g_list_length (tokens);
- for (i = 0; i < len; i++) {
- token = g_list_nth_data (tokens, i);
-
- if ((retval = get_weekday (token))) {
- strncpy (date.dow, datestr, 4);
- } else if ((retval = get_month (token))) {
- date.mon = retval;
- } else if (strlen (token) <= 2) {
- /* this could be a 1 or 2 digit day of the month */
- for (retval = 1, ptr = token; *ptr; ptr++)
- if (*ptr < '0' || *ptr > '9')
- retval = 0;
-
- if (retval && atoi (token) <= 31 && !date.day) /* probably should find a better way */
- date.day = atoi (token);
- else /* fubar'd client using a 2-digit year */
- date.year = atoi (token) < 69 ? 2000 + atoi (token) : 1900 + atoi (token);
- } else if (strlen (token) == 4) {
- /* this could be the year... */
- for (retval = 1, ptr = token; *ptr; ptr++)
- if (*ptr < '0' || *ptr > '9')
- retval = 0;
-
- if (retval)
- date.year = atoi (token);
- } else if (strchr (token, ':')) {
- /* this must be the time: hh:mm:ss */
- sscanf (token, "%d:%d:%d", &date.hour, &date.min, &date.sec);
- } else if (*token == '-' || *token == '+') {
- tz = atoi (token) / 100.0;
- }
- }
-
- g_list_free (tokens);
-
- /* adjust times based on time zones */
-
- if (tz != 0) {
- /* check for time-zone shift */
- if (tz > 0) {
- /* correct for positive hours off of UCT */
- date.hour -= (tz / 100);
- tz = (gint)tz % 100;
-
- if (tz > 0) /* correct for positive minutes off of UCT */
- date.min -= (gint)(((gdouble) tz / 100.0) * 60.0);
- } else {
- if (tz < 0) {
- /* correct for negative hours off of UCT */
- tz = -tz;
- date.hour += (tz / 100);
- tz = -((gint)tz % 100);
-
- if (tz < 0)
- date.min -= (gint)(((gdouble) tz / 100.0) * 60.0);
- }
- }
-
- /* adjust seconds to proper range */
- if (date.sec > 59) {
- date.min += (date.sec / 60);
- date.sec = (date.sec % 60);
- }
-
- /* adjust minutes to proper range */
- if (date.min > 59) {
- date.hour += (date.min / 60);
- date.min = (date.min % 60);
- } else {
- if (date.min < 0) {
- date.min = -date.min;
- date.hour -= (date.min / 60) - 1;
- date.min = 60 - (date.min % 60);
- }
- }
-
- /* adjust hours to the proper randge */
- if (date.hour > 23) {
- date.day += (date.hour / 24);
- date.hour -= (date.hour % 24);
- } else {
- if (date.hour < 0) {
- date.hour = -date.hour;
- date.day -= (date.hour / 24) - 1;
- date.hour = 24 - (date.hour % 60);
- }
- }
-
- /* adjust days to the proper range */
- while (date.day > get_days_in_month (date.mon, date.year)) {
- date.day -= get_days_in_month (date.mon, date.year);
- date.mon++;
- if (date.mon > 12) {
- date.year += (date.mon / 12);
- date.mon = (date.mon % 12);
- if (date.mon == 0) {
- /* month sanity check */
- date.mon = 12;
- date.year -= 1;
- }
- }
- }
-
- while (date.day < 1) {
- date.day += get_days_in_month (date.mon, date.year);
- date.mon--;
- if (date.mon < 1) {
- date.mon = -date.mon;
- date.year -= (date.mon / 12) - 1;
- date.mon = 12 - (date.mon % 12);
- }
- }
-
- /* adjust months to the proper range */
- if (date.mon > 12) {
- date.year += (date.mon / 12);
- date.mon = (date.mon % 12);
- if (date.mon == 0) {
- /* month sanity check */
- date.mon = 12;
- date.year -= 1;
- }
- } else {
- if (date.mon < 1) {
- date.mon = -date.mon;
- date.year -= (date.mon / 12) - 1;
- date.mon = 12 - (date.mon % 12);
- }
- }
- }
-
- /* now lets print this date into a string with the correct format */
- newdatestr = g_strdup_printf ("%s, %d %s %d %s%d:%s%d:%s%d -0000",
- date.dow, date.day, tz_months[date.mon-1],
- date.year,
- date.hour > 10 ? "" : "0", date.hour,
- date.min > 10 ? "" : "0", date.min,
- date.sec > 10 ? "" : "0", date.sec);
-
- return newdatestr;
-}
-
-/*****************************************************************************
- * This ends the code for the broken date parser... *
- * *
- * -- fejj@helixcode.com *
- *****************************************************************************/
diff --git a/camel/broken-date-parser.h b/camel/broken-date-parser.h
deleted file mode 100644
index 17000b3299..0000000000
--- a/camel/broken-date-parser.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (www.helixcode.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.
- *
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-#include <time.h>
-
-#include <ctype.h>
-
-/* prototypes for functions dealing with broken date formats */
-
-gchar *parse_broken_date (const gchar *datestr);
-
-
-
-
-
diff --git a/camel/camel-address.c b/camel/camel-address.c
deleted file mode 100644
index 8f7cea3d67..0000000000
--- a/camel/camel-address.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "camel-address.h"
-
-
-static void camel_address_class_init (CamelAddressClass *klass);
-static void camel_address_init (CamelAddress *obj);
-static void camel_address_finalize (CamelObject *obj);
-
-static CamelObjectClass *camel_address_parent;
-
-static void
-camel_address_class_init (CamelAddressClass *klass)
-{
- camel_address_parent = camel_type_get_global_classfuncs (camel_object_get_type ());
-}
-
-static void
-camel_address_init (CamelAddress *obj)
-{
- obj->addresses = g_ptr_array_new();
-}
-
-static void
-camel_address_finalize (CamelObject *obj)
-{
- camel_address_remove((CamelAddress *)obj, -1);
-}
-
-CamelType
-camel_address_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_object_get_type (), "CamelAddress",
- sizeof (CamelAddress),
- sizeof (CamelAddressClass),
- (CamelObjectClassInitFunc) camel_address_class_init,
- NULL,
- (CamelObjectInitFunc) camel_address_init,
- (CamelObjectFinalizeFunc) camel_address_finalize);
- }
-
- return type;
-}
-
-/**
- * camel_address_new:
- *
- * Create a new CamelAddress object.
- *
- * Return value: A new CamelAddress widget.
- **/
-CamelAddress *
-camel_address_new (void)
-{
- CamelAddress *new = CAMEL_ADDRESS ( camel_object_new (camel_address_get_type ()));
- return new;
-}
-
-
-/**
- * camel_address_decode:
- * @a: An address.
- * @raw: Raw address description.
- *
- * Construct a new address from a raw address field.
- *
- * Return value: Returns the number of addresses found,
- * or -1 if the addresses could not be parsed fully.
- **/
-int
-camel_address_decode (CamelAddress *a, const char *raw)
-{
- g_return_val_if_fail(IS_CAMEL_ADDRESS(a), -1);
-
- return CAMEL_ADDRESS_CLASS (CAMEL_OBJECT_GET_CLASS (a))->decode(a, raw);
-}
-
-/**
- * camel_address_encode:
- * @a:
- *
- * Encode an address in a format suitable for a raw header.
- *
- * Return value: The encoded address.
- **/
-char *
-camel_address_encode (CamelAddress *a)
-{
- g_return_val_if_fail(IS_CAMEL_ADDRESS(a), NULL);
-
- return CAMEL_ADDRESS_CLASS (CAMEL_OBJECT_GET_CLASS (a))->encode(a);
-}
-
-/**
- * camel_address_remove:
- * @a:
- * @index: The address to remove, use -1 to remove all address.
- *
- * Remove an address by index, or all addresses.
- **/
-void
-camel_address_remove (CamelAddress *a, int index)
-{
- g_return_if_fail(IS_CAMEL_ADDRESS(a));
-
- if (index == -1) {
- for (index=a->addresses->len; index>-1; index--)
- CAMEL_ADDRESS_CLASS (CAMEL_OBJECT_GET_CLASS (a))->remove(a, index);
- } else {
- CAMEL_ADDRESS_CLASS (CAMEL_OBJECT_GET_CLASS (a))->remove(a, index);
- }
-}
diff --git a/camel/camel-address.h b/camel/camel-address.h
deleted file mode 100644
index a2d6fe34dd..0000000000
--- a/camel/camel-address.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_ADDRESS_H
-#define _CAMEL_ADDRESS_H
-
-#include <camel/camel-object.h>
-
-#define CAMEL_ADDRESS(obj) CAMEL_CHECK_CAST (obj, camel_address_get_type (), CamelAddress)
-#define CAMEL_ADDRESS_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_address_get_type (), CamelAddressClass)
-#define IS_CAMEL_ADDRESS(obj) CAMEL_CHECK_TYPE (obj, camel_address_get_type ())
-
-typedef struct _CamelAddressClass CamelAddressClass;
-
-struct _CamelAddress {
- CamelObject parent;
-
- GPtrArray *addresses;
-
- struct _CamelAddressPrivate *priv;
-};
-
-struct _CamelAddressClass {
- CamelObjectClass parent_class;
-
- int (*decode) (CamelAddress *, const char *raw);
- char *(*encode) (CamelAddress *);
-
- void (*remove) (CamelAddress *, int index);
-};
-
-guint camel_address_get_type (void);
-CamelAddress *camel_address_new (void);
-
-int camel_address_decode (CamelAddress *, const char *);
-char *camel_address_encode (CamelAddress *);
-
-void camel_address_remove (CamelAddress *, int index);
-
-#endif /* ! _CAMEL_ADDRESS_H */
diff --git a/camel/camel-data-wrapper.c b/camel/camel-data-wrapper.c
deleted file mode 100644
index 52cf60bd33..0000000000
--- a/camel/camel-data-wrapper.c
+++ /dev/null
@@ -1,270 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-data-wrapper.c : Abstract class for a data_wrapper */
-
-/*
- *
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-#include <config.h>
-#include "camel-data-wrapper.h"
-#include "camel-exception.h"
-
-#include <errno.h>
-
-#define d(x)
-
-static CamelObjectClass *parent_class = NULL;
-
-/* Returns the class for a CamelDataWrapper */
-#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-
-static int construct_from_stream(CamelDataWrapper *, CamelStream *);
-static int write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream);
-static void set_mime_type (CamelDataWrapper *data_wrapper, const gchar *mime_type);
-static gchar *get_mime_type (CamelDataWrapper *data_wrapper);
-static GMimeContentField *get_mime_type_field (CamelDataWrapper *data_wrapper);
-static void set_mime_type_field (CamelDataWrapper *data_wrapper, GMimeContentField *mime_type);
-
-static void
-camel_data_wrapper_class_init (CamelDataWrapperClass *camel_data_wrapper_class)
-{
- parent_class = camel_type_get_global_classfuncs (camel_object_get_type ());
-
- /* virtual method definition */
- camel_data_wrapper_class->write_to_stream = write_to_stream;
- camel_data_wrapper_class->set_mime_type = set_mime_type;
- camel_data_wrapper_class->get_mime_type = get_mime_type;
- camel_data_wrapper_class->get_mime_type_field = get_mime_type_field;
- camel_data_wrapper_class->set_mime_type_field = set_mime_type_field;
-
- camel_data_wrapper_class->construct_from_stream = construct_from_stream;
-}
-
-static void
-camel_data_wrapper_init (gpointer object, gpointer klass)
-{
- CamelDataWrapper *camel_data_wrapper = CAMEL_DATA_WRAPPER (object);
-
- camel_data_wrapper->mime_type = gmime_content_field_new (NULL, NULL);
-}
-
-static void
-camel_data_wrapper_finalize (CamelObject *object)
-{
- CamelDataWrapper *camel_data_wrapper = CAMEL_DATA_WRAPPER (object);
-
- if (camel_data_wrapper->mime_type)
- gmime_content_field_unref (camel_data_wrapper->mime_type);
-
- if (camel_data_wrapper->stream)
- camel_object_unref (CAMEL_OBJECT (camel_data_wrapper->stream));
-}
-
-CamelType
-camel_data_wrapper_get_type (void)
-{
- static CamelType camel_data_wrapper_type = CAMEL_INVALID_TYPE;
-
- if (camel_data_wrapper_type == CAMEL_INVALID_TYPE) {
- camel_data_wrapper_type = camel_type_register (CAMEL_OBJECT_TYPE, "CamelDataWrapper",
- sizeof (CamelDataWrapper),
- sizeof (CamelDataWrapperClass),
- (CamelObjectClassInitFunc) camel_data_wrapper_class_init,
- NULL,
- (CamelObjectInitFunc) camel_data_wrapper_init,
- (CamelObjectFinalizeFunc) camel_data_wrapper_finalize);
- }
-
- return camel_data_wrapper_type;
-}
-
-static int
-write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream)
-{
- if (data_wrapper->stream == NULL) {
- return -1;
- }
-
- if (camel_stream_reset (data_wrapper->stream) == -1)
- return -1;
-
- return camel_stream_write_to_stream (data_wrapper->stream, stream);
-}
-
-CamelDataWrapper *
-camel_data_wrapper_new(void)
-{
- return (CamelDataWrapper *)camel_object_new(camel_data_wrapper_get_type());
-}
-
-/**
- * camel_data_wrapper_write_to_stream:
- * @data_wrapper: a data wrapper
- * @stream: stream for data to be written to
- * @ex: a CamelException
- *
- * Writes the data content to @stream in a machine-independent format
- * appropriate for the data. It should be possible to construct an
- * equivalent data wrapper object later by passing this stream to
- * camel_data_construct_from_stream().
- *
- * Return value: the number of bytes written, or -1 if an error occurs.
- **/
-int
-camel_data_wrapper_write_to_stream (CamelDataWrapper *data_wrapper,
- CamelStream *stream)
-{
- g_return_val_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper), -1);
- g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1);
-
- return CDW_CLASS (data_wrapper)->write_to_stream (data_wrapper, stream);
-}
-
-static int
-construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream)
-{
- if (data_wrapper->stream)
- camel_object_unref((CamelObject *)data_wrapper->stream);
-
- data_wrapper->stream = stream;
- camel_object_ref (CAMEL_OBJECT (stream));
- return 0;
-}
-
-/**
- * camel_data_wrapper_construct_from_stream:
- * @data_wrapper: a data wrapper
- * @stream: A stream that can be read from.
- *
- * Constructs the content of the data wrapper from the
- * supplied @stream.
- *
- * Return value: -1 on error.
- **/
-int
-camel_data_wrapper_construct_from_stream (CamelDataWrapper *data_wrapper,
- CamelStream *stream)
-{
- g_return_val_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper), -1);
- g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1);
-
- return CDW_CLASS (data_wrapper)->construct_from_stream (data_wrapper, stream);
-}
-
-
-static void
-set_mime_type (CamelDataWrapper *data_wrapper, const gchar *mime_type)
-{
- gmime_content_field_construct_from_string (data_wrapper->mime_type,
- mime_type);
-}
-
-/**
- * camel_data_wrapper_set_mime_type:
- * @data_wrapper: a data wrapper
- * @mime_type: the text representation of a MIME type
- *
- * This sets the data wrapper's MIME type.
- * It might fail, but you won't know. It will allow you to set
- * Content-Type parameters on the data wrapper, which are meaningless.
- * You should not be allowed to change the MIME type of a data wrapper
- * that contains data, or at least, if you do, it should invalidate the
- * data.
- **/
-void
-camel_data_wrapper_set_mime_type (CamelDataWrapper *data_wrapper,
- const gchar *mime_type)
-{
- g_return_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper));
- g_return_if_fail (mime_type != NULL);
-
- CDW_CLASS (data_wrapper)->set_mime_type (data_wrapper, mime_type);
-}
-
-static gchar *
-get_mime_type (CamelDataWrapper *data_wrapper)
-{
- return gmime_content_field_get_mime_type (data_wrapper->mime_type);
-}
-
-/**
- * camel_data_wrapper_get_mime_type:
- * @data_wrapper: a data wrapper
- *
- * Return value: the text form of the data wrapper's MIME type
- **/
-gchar *
-camel_data_wrapper_get_mime_type (CamelDataWrapper *data_wrapper)
-{
- g_return_val_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper), NULL);
-
- return CDW_CLASS (data_wrapper)->get_mime_type (data_wrapper);
-}
-
-
-static GMimeContentField *
-get_mime_type_field (CamelDataWrapper *data_wrapper)
-{
- return data_wrapper->mime_type;
-}
-
-/**
- * camel_data_wrapper_get_mime_type_field:
- * @data_wrapper: a data wrapper
- *
- * Return value: the parsed form of the data wrapper's MIME type
- **/
-GMimeContentField *
-camel_data_wrapper_get_mime_type_field (CamelDataWrapper *data_wrapper)
-{
- g_return_val_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper), NULL);
-
- return CDW_CLASS (data_wrapper)->get_mime_type_field (data_wrapper);
-}
-
-/**
- * camel_data_wrapper_set_mime_type_field:
- * @data_wrapper: a data wrapper
- * @mime_type: the parsed representation of a MIME type
- *
- * This sets the data wrapper's MIME type. It suffers from the same
- * flaws as camel_data_wrapper_set_mime_type.
- **/
-static void
-set_mime_type_field (CamelDataWrapper *data_wrapper,
- GMimeContentField *mime_type)
-{
- g_return_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper));
- g_return_if_fail (mime_type != NULL);
-
- if (data_wrapper->mime_type)
- gmime_content_field_unref (data_wrapper->mime_type);
- data_wrapper->mime_type = mime_type;
- if (mime_type)
- gmime_content_field_ref (data_wrapper->mime_type);
-}
-
-void
-camel_data_wrapper_set_mime_type_field (CamelDataWrapper *data_wrapper,
- GMimeContentField *mime_type)
-{
- CDW_CLASS (data_wrapper)->set_mime_type_field (data_wrapper, mime_type);
-}
diff --git a/camel/camel-data-wrapper.h b/camel/camel-data-wrapper.h
deleted file mode 100644
index 4a3074ae20..0000000000
--- a/camel/camel-data-wrapper.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-data-wrapper.h : Abstract class for a data wrapper */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_DATA_WRAPPER_H
-#define CAMEL_DATA_WRAPPER_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-object.h>
-#include <camel/gmime-content-field.h>
-
-#define CAMEL_DATA_WRAPPER_TYPE (camel_data_wrapper_get_type ())
-#define CAMEL_DATA_WRAPPER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_DATA_WRAPPER_TYPE, CamelDataWrapper))
-#define CAMEL_DATA_WRAPPER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_DATA_WRAPPER_TYPE, CamelDataWrapperClass))
-#define CAMEL_IS_DATA_WRAPPER(o) (CAMEL_CHECK_TYPE((o), CAMEL_DATA_WRAPPER_TYPE))
-
-struct _CamelDataWrapper
-{
- CamelObject parent_object;
-
- GMimeContentField *mime_type;
- CamelStream *stream;
-};
-
-typedef struct {
- CamelObjectClass parent_class;
-
- /* Virtual methods */
- void (*set_output_stream) (CamelDataWrapper *data_wrapper,
- CamelStream *stream);
- CamelStream * (*get_output_stream) (CamelDataWrapper *data_wrapper);
-
- void (*set_mime_type) (CamelDataWrapper *data_wrapper,
- const gchar * mime_type);
- gchar * (*get_mime_type) (CamelDataWrapper *data_wrapper);
- GMimeContentField * (*get_mime_type_field) (CamelDataWrapper *data_wrapper);
- void (*set_mime_type_field) (CamelDataWrapper *data_wrapper,
- GMimeContentField *mime_type_field);
-
- int (*write_to_stream) (CamelDataWrapper *data_wrapper,
- CamelStream *stream);
-
- int (*construct_from_stream) (CamelDataWrapper *data_wrapper,
- CamelStream *);
-} CamelDataWrapperClass;
-
-/* Standard Camel function */
-CamelType camel_data_wrapper_get_type (void);
-
-/* public methods */
-CamelDataWrapper * camel_data_wrapper_new(void);
-int camel_data_wrapper_write_to_stream (CamelDataWrapper *data_wrapper,
- CamelStream *stream);
-void camel_data_wrapper_set_mime_type (CamelDataWrapper *data_wrapper,
- const gchar *mime_type);
-gchar * camel_data_wrapper_get_mime_type (CamelDataWrapper *data_wrapper);
-GMimeContentField * camel_data_wrapper_get_mime_type_field (CamelDataWrapper *data_wrapper);
-void camel_data_wrapper_set_mime_type_field (CamelDataWrapper *data_wrapper,
- GMimeContentField *mime_type);
-
-int camel_data_wrapper_construct_from_stream (CamelDataWrapper *data_wrapper,
- CamelStream *stream);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_DATA_WRAPPER_H */
diff --git a/camel/camel-exception-list.def b/camel/camel-exception-list.def
deleted file mode 100644
index cdb95b1a81..0000000000
--- a/camel/camel-exception-list.def
+++ /dev/null
@@ -1,36 +0,0 @@
-/* WARNING: Exceptions MUST NOT be renumbered: they need to be
- * consistent across libraries compiled at different times.
- * Categories should be widely separated, old unused exceptions can
- * never be deleted, and new exceptions can be added only to the
- * ends of categories.
- */
-
-CAMEL_EXCEPTION_NONE = 0,
-
-/* Generic exceptions */
-CAMEL_EXCEPTION_INVALID_PARAM,
-CAMEL_EXCEPTION_SYSTEM,
-CAMEL_EXCEPTION_USER_CANCEL,
-
-/* CamelFolderException */
-CAMEL_EXCEPTION_FOLDER_NULL = 100,
-CAMEL_EXCEPTION_FOLDER_INVALID,
-CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
-CAMEL_EXCEPTION_FOLDER_NON_EMPTY,
-CAMEL_EXCEPTION_FOLDER_NON_UID,
-CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION,
-CAMEL_EXCEPTION_FOLDER_INVALID_PATH,
-CAMEL_EXCEPTION_FOLDER_INVALID_UID,
-CAMEL_EXCEPTION_FOLDER_SUMMARY_INVALID,
-
-/* CamelStoreException */
-CAMEL_EXCEPTION_STORE_NULL = 200,
-CAMEL_EXCEPTION_STORE_INVALID,
-CAMEL_EXCEPTION_STORE_NO_FOLDER,
-
-/* CamelServiceException */
-CAMEL_EXCEPTION_SERVICE_NULL = 300,
-CAMEL_EXCEPTION_SERVICE_INVALID,
-CAMEL_EXCEPTION_SERVICE_URL_INVALID,
-CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
-CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE
diff --git a/camel/camel-exception.c b/camel/camel-exception.c
deleted file mode 100644
index cf5daff9d3..0000000000
--- a/camel/camel-exception.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-execpetion.c : exception utils */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include "camel-exception.h"
-
-
-
-/**
- * camel_exception_new: allocate a new exception object.
- *
- * Create and returns a new exception object.
- *
- *
- * Return value: The newly allocated exception object.
- **/
-CamelException *
-camel_exception_new (void)
-{
- CamelException *ex;
-
- ex = g_new (CamelException, 1);
- ex->desc = NULL;
-
- /* set the Exception Id to NULL */
- ex->id = CAMEL_EXCEPTION_NONE;
-
- return ex;
-}
-
-/**
- * camel_exception_init: init a (statically allocated) exception.
- *
- * Init an exception. This routine is mainly
- * useful when using a statically allocated
- * exception.
- *
- *
- **/
-void
-camel_exception_init (CamelException *ex)
-{
- ex->desc = NULL;
-
- /* set the Exception Id to NULL */
- ex->id = CAMEL_EXCEPTION_NONE;
-}
-
-
-/**
- * camel_exception_clear: Clear an exception
- * @exception: the exception object
- *
- * Clear an exception, that is, set the
- * exception ID to CAMEL_EXCEPTION_NONE and
- * free the description text.
- * If the exception is NULL, this funtion just
- * returns.
- **/
-void
-camel_exception_clear (CamelException *exception)
-{
- if (!exception) return;
-
- /* free the description text */
- if (exception->desc)
- g_free (exception->desc);
- exception->desc = NULL;
-
- /* set the Exception Id to NULL */
- exception->id = CAMEL_EXCEPTION_NONE;
-}
-
-
-
-
-/**
- * camel_exception_free: Free an exception
- * @exception: The exception object to free
- *
- * Free an exception object. If the exception
- * is NULL, nothing is done, the routine simply
- * returns.
- **/
-void
-camel_exception_free (CamelException *exception)
-{
- if (!exception) return;
-
- /* free the description text */
- if (exception->desc)
- g_free (exception->desc);
- /* free the exeption itself */
- g_free (exception);
-}
-
-/**
- * camel_exception_set: set an exception
- * @ex: exception object
- * @id: exception id
- * @desc: textual description of the exception
- *
- * Set the value of an exception. The exception id is
- * a unique number representing the exception. The
- * textual description is a small text explaining
- * what happened and provoked the exception.
- *
- * When @ex is NULL, nothing is done, this routine
- * simply returns.
- *
- **/
-void
-camel_exception_set (CamelException *ex,
- ExceptionId id,
- const char *desc)
-{
- /* if no exception is given, do nothing */
- if (!ex) return;
-
- ex->id = id;
-
- /* remove the previous exception description */
- if (ex->desc)
- g_free (ex->desc);
- ex->desc = g_strdup (desc);
-}
-
-
-/**
- * camel_exception_setv: set an exception
- * @ex: exception object
- * @id: exception id
- * @format: format of the description string. The format string is
- * used as in printf().
- *
- * Set the value of an exception. The exception id is
- * a unique number representing the exception. The
- * textual description is a small text explaining
- * what happened and provoked the exception.
- * In this version, the string is created from the format
- * string and the variable argument list.
- *
- * It is safe to say:
- * camel_exception_setv (ex, ..., camel_exception_get_description (ex), ...);
- *
- * When @ex is NULL, nothing is done, this routine
- * simply returns.
- *
- **/
-void
-camel_exception_setv (CamelException *ex,
- ExceptionId id,
- const char *format,
- ...)
-{
- va_list args;
- gchar *tmp_desc_string;
-
-
- /* if no exception is given, do nothing */
- if (!ex) return;
-
-
- /* create the temporary exception string */
- va_start(args, format);
- tmp_desc_string = g_strdup_vprintf (format, args);
- va_end (args);
-
-
- /* now set the exception. We don't call
- camel_exception_set because we want to
- avoid a useless strdup () */
- ex->id = id;
-
- /* remove the previous exception description */
- if (ex->desc)
- g_free (ex->desc);
- ex->desc = g_strdup (tmp_desc_string);
-
-}
-
-
-
-
-
-
-
-/**
- * camel_exception_xfer: transfer an exception
- * @ex_dst: Destination exception object
- * @ex_src: Source exception object
- *
- * Transfer the content of an exception from
- * an exception object to another.
- * The destination exception receives the id and
- * the description text of the source exception.
- **/
-void
-camel_exception_xfer (CamelException *ex_dst,
- CamelException *ex_src)
-{
- if (ex_dst->desc)
- g_free (ex_dst->desc);
-
- ex_dst->id = ex_src->id;
- ex_dst->desc = ex_src->desc;
-
- ex_src->desc = NULL;
- ex_src->id = CAMEL_EXCEPTION_NONE;
-}
-
-
-
-
-
-
-
-/**
- * camel_exception_get_id: get the exception id
- * @ex: The exception object
- *
- * Return the id of an exception.
- * If @ex is NULL, return CAMEL_EXCEPTION_NONE;
- *
- * Return value: Exception ID.
- **/
-ExceptionId
-camel_exception_get_id (CamelException *ex)
-{
- if (ex)
- return ex->id;
- else
- return CAMEL_EXCEPTION_NONE;
-}
-
-
-
-
-/**
- * camel_exception_get_description: get the description of an exception.
- * @ex: The exception object
- *
- * Return the exception description text.
- * If @ex is NULL, return NULL;
- *
- *
- * Return value: Exception description text.
- **/
-const gchar *
-camel_exception_get_description (CamelException *ex)
-{
- if (ex)
- return ex->desc;
- else
- return NULL;
-}
diff --git a/camel/camel-exception.h b/camel/camel-exception.h
deleted file mode 100644
index d5c93e5941..0000000000
--- a/camel/camel-exception.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-execpetion.h : exception utils */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_EXCEPTION_H
-#define CAMEL_EXCEPTION_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <glib.h>
-#include <camel/camel-types.h>
-
-typedef enum {
-#include "camel-exception-list.def"
-
-} ExceptionId;
-
-
-struct _CamelException {
- /* do not access the fields directly */
- ExceptionId id;
- char *desc;
-
-};
-
-
-
-/* creation and destruction functions */
-CamelException * camel_exception_new (void);
-void camel_exception_free (CamelException *exception);
-void camel_exception_init (CamelException *ex);
-
-
-/* exception content manipulation */
-void camel_exception_clear (CamelException *exception);
-void camel_exception_set (CamelException *ex,
- ExceptionId id,
- const char *desc);
-void camel_exception_setv (CamelException *ex,
- ExceptionId id,
- const char *format,
- ...);
-
-
-/* exception content transfer */
-void camel_exception_xfer (CamelException *ex_dst,
- CamelException *ex_src);
-
-
-/* exception content retrieval */
-ExceptionId camel_exception_get_id (CamelException *ex);
-const gchar * camel_exception_get_description (CamelException *ex);
-
-#define camel_exception_is_set(ex) (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE)
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_EXCEPTION_H */
-
diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c
deleted file mode 100644
index 1c68f369ee..0000000000
--- a/camel/camel-folder-search.c
+++ /dev/null
@@ -1,598 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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
- */
-
-/* This is a helper class for folders to implement the search function.
- It implements enough to do basic searches on folders that can provide
- an in-memory summary and a body index. */
-
-#include <stdio.h>
-#include <string.h>
-#include <glib.h>
-
-#include "camel-folder-search.h"
-#include "string-utils.h"
-
-#define d(x) x
-#define r(x) x
-
-struct _CamelFolderSearchPrivate {
-};
-
-#define _PRIVATE(o) (((CamelFolderSearch *)(o))->priv)
-
-static ESExpResult *search_header_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_match_all(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *search);
-static ESExpResult *search_body_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_user_flag(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_user_tag(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_get_sent_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_get_received_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_get_current_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-
-static ESExpResult *search_dummy(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-
-static void camel_folder_search_class_init (CamelFolderSearchClass *klass);
-static void camel_folder_search_init (CamelFolderSearch *obj);
-static void camel_folder_search_finalize (CamelObject *obj);
-
-static CamelObjectClass *camel_folder_search_parent;
-
-static void
-camel_folder_search_class_init (CamelFolderSearchClass *klass)
-{
- camel_folder_search_parent = camel_type_get_global_classfuncs (camel_object_get_type ());
-
- klass->match_all = search_match_all;
- klass->body_contains = search_body_contains;
- klass->header_contains = search_header_contains;
- klass->user_tag = search_user_tag;
- klass->user_flag = search_user_flag;
- klass->get_sent_date = search_get_sent_date;
- klass->get_received_date = search_get_received_date;
- klass->get_current_date = search_get_current_date;
-}
-
-static void
-camel_folder_search_init (CamelFolderSearch *obj)
-{
- struct _CamelFolderSearchPrivate *p;
-
- p = _PRIVATE(obj) = g_malloc0(sizeof(*p));
-
- obj->sexp = e_sexp_new();
-}
-
-static void
-camel_folder_search_finalize (CamelObject *obj)
-{
- CamelFolderSearch *search = (CamelFolderSearch *)obj;
- if (search->sexp)
- camel_object_unref((CamelObject *)search->sexp);
-
- g_free(search->last_search);
-}
-
-CamelType
-camel_folder_search_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_object_get_type (), "CamelFolderSearch",
- sizeof (CamelFolderSearch),
- sizeof (CamelFolderSearchClass),
- (CamelObjectClassInitFunc) camel_folder_search_class_init,
- NULL,
- (CamelObjectInitFunc) camel_folder_search_init,
- (CamelObjectFinalizeFunc) camel_folder_search_finalize);
- }
-
- return type;
-}
-
-#ifdef offsetof
-#define CAMEL_STRUCT_OFFSET(type, field) ((gint) offsetof (type, field))
-#else
-#define CAMEL_STRUCT_OFFSET(type, field) ((gint) ((gchar*) &((type *) 0)->field))
-#endif
-
-struct {
- char *name;
- int offset;
- int flags; /* 0x02 = immediate, 0x01 = always enter */
-} builtins[] = {
- /* these have default implementations in e-sexp */
- { "and", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, and), 2 },
- { "or", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, or), 2 },
- { "not", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, not), 2 },
- { "<", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, lt), 2 },
- { ">", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, gt), 2 },
- { "=", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, eq), 2 },
-
- /* these we have to use our own default if there is none */
- /* they should all be defined in the language? so it poarses, or should they not?? */
- { "match-all", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, match_all), 3 },
- { "body-contains", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, body_contains), 1 },
- { "header-contains", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, header_contains), 1 },
- { "user-tag", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, user_tag), 1 },
- { "user-flag", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, user_flag), 1 },
- { "get-sent-date", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, get_sent_date), 1 },
- { "get-received-date", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, get_received_date), 1 },
- { "get-current-date", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, get_current_date), 1 }
-};
-
-void
-camel_folder_search_construct (CamelFolderSearch *search)
-{
- int i;
- CamelFolderSearchClass *klass = (CamelFolderSearchClass *)CAMEL_OBJECT_GET_CLASS(search);
-
- for (i=0;i<sizeof(builtins)/sizeof(builtins[0]);i++) {
- void *func;
- /* c is sure messy sometimes */
- func = *((void **)(((char *)klass)+builtins[i].offset));
- if (func == NULL && builtins[i].flags&1) {
- g_warning("Search class doesn't implement '%s' method: %s", builtins[i].name, camel_type_to_name(CAMEL_OBJECT_GET_CLASS(search)->s.type));
- func = (void *)search_dummy;
- }
- if (func != NULL) {
- if (builtins[i].flags&2) {
- e_sexp_add_ifunction(search->sexp, 0, builtins[i].name, (ESExpIFunc *)func, search);
- } else {
- e_sexp_add_function(search->sexp, 0, builtins[i].name, (ESExpFunc *)func, search);
- }
- }
- }
-}
-
-/**
- * camel_folder_search_new:
- *
- * Create a new CamelFolderSearch object.
- *
- * A CamelFolderSearch is a subclassable, extensible s-exp
- * evaluator which enforces a particular set of s-expressions.
- * Particular methods may be overriden by an implementation to
- * implement a search for any sort of backend.
- *
- * Return value: A new CamelFolderSearch widget.
- **/
-CamelFolderSearch *
-camel_folder_search_new (void)
-{
- CamelFolderSearch *new = CAMEL_FOLDER_SEARCH ( camel_object_new (camel_folder_search_get_type ()));
-
- camel_folder_search_construct(new);
- return new;
-}
-
-/**
- * camel_folder_search_set_folder:
- * @search:
- * @folder: A folder.
- *
- * Set the folder attribute of the search. This is currently unused, but
- * could be used to perform a slow-search when indexes and so forth are not
- * available. Or for use by subclasses.
- **/
-void
-camel_folder_search_set_folder(CamelFolderSearch *search, CamelFolder *folder)
-{
- search->folder = folder;
-}
-
-/**
- * camel_folder_search_set_summary:
- * @search:
- * @summary: An array of CamelMessageInfo pointers.
- *
- * Set the array of summary objects representing the span of the search.
- *
- * If this is not set, then a subclass must provide the functions
- * for searching headers and for the match-all operator.
- **/
-void
-camel_folder_search_set_summary(CamelFolderSearch *search, GPtrArray *summary)
-{
- search->summary = summary;
-}
-
-/**
- * camel_folder_search_set_body_index:
- * @search:
- * @index:
- *
- * Set the index (ibex) representing the contents of all messages
- * in this folder. If this is not set, then the folder implementation
- * should sub-class the CamelFolderSearch and provide its own
- * body-contains function.
- **/
-void
-camel_folder_search_set_body_index(CamelFolderSearch *search, ibex *index)
-{
- search->body_index = index;
-}
-
-/**
- * camel_folder_search_execute_expression:
- * @search:
- * @expr:
- * @ex:
- *
- * Execute the search expression @expr, returning an array of
- * all matches as a GPtrArray of uid's of matching messages.
- *
- * Note that any settings such as set_body_index(), set_folder(),
- * and so on are reset to #NULL once the search has completed.
- *
- * TODO: The interface should probably return summary items instead
- * (since they are much more useful to any client).
- *
- * Return value: A GPtrArray of strings of all matching messages.
- * This must only be freed by camel_folder_search_free_result.
- **/
-GPtrArray *
-camel_folder_search_execute_expression(CamelFolderSearch *search, const char *expr, CamelException *ex)
-{
- ESExpResult *r;
- GPtrArray *matches = g_ptr_array_new ();
- int i;
- GHashTable *results;
-
- /* only re-parse if the search has changed */
- if (search->last_search == NULL
- || strcmp(search->last_search, expr)) {
- e_sexp_input_text(search->sexp, expr, strlen(expr));
- e_sexp_parse(search->sexp);
- g_free(search->last_search);
- search->last_search = g_strdup(expr);
- }
- r = e_sexp_eval(search->sexp);
-
- /* now create a folder summary to return?? */
- if (r
- && r->type == ESEXP_RES_ARRAY_PTR) {
- d(printf("got result ...\n"));
- if (search->summary) {
- /* reorder result in summary order */
- results = g_hash_table_new(g_str_hash, g_str_equal);
- for (i=0;i<r->value.ptrarray->len;i++) {
- d(printf("adding match: %s\n", (char *)g_ptr_array_index(r->value.ptrarray, i)));
- g_hash_table_insert(results, g_ptr_array_index(r->value.ptrarray, i), (void *)1);
- }
- for (i=0;i<search->summary->len;i++) {
- CamelMessageInfo *info = g_ptr_array_index(search->summary, i);
- if (g_hash_table_lookup(results, info->uid)) {
- g_ptr_array_add(matches, g_strdup(info->uid));
- }
- }
- g_hash_table_destroy(results);
- } else {
- for (i=0;i<r->value.ptrarray->len;i++) {
- d(printf("adding match: %s\n", (char *)g_ptr_array_index(r->value.ptrarray, i)));
- g_ptr_array_add(matches, g_strdup(g_ptr_array_index(r->value.ptrarray, i)));
- }
- }
- e_sexp_result_free(r);
- } else {
- printf("no result!\n");
- }
-
- search->folder = NULL;
- search->summary = NULL;
- search->current = NULL;
- search->body_index = NULL;
-
- return matches;
-}
-
-void camel_folder_search_free_result(CamelFolderSearch *search, GPtrArray *result)
-{
- int i;
-
- for (i=0;i<result->len;i++)
- g_free(g_ptr_array_index(result, i));
- g_ptr_array_free(result, TRUE);
-}
-
-/* dummy function, returns false always, or an empty match array */
-static ESExpResult *
-search_dummy(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search)
-{
- ESExpResult *r;
-
- if (search->current == NULL) {
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = FALSE;
- } else {
- r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR);
- r->value.ptrarray = g_ptr_array_new();
- }
-
- return r;
-}
-
-static ESExpResult *
-search_match_all(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *search)
-{
- int i;
- ESExpResult *r, *r1;
-
- if (argc>1) {
- g_warning("match-all only takes a single argument, other arguments ignored");
- }
- r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR);
- r->value.ptrarray = g_ptr_array_new();
-
- if (search->summary == NULL) {
- /* TODO: make it work - e.g. use the folder and so forth for a slower search */
- g_warning("No summary supplied, match-all doesn't work with no summary");
- return r;
- }
-
- /* TODO: Could make this a bit faster in the uncommon case (of match-everything) */
- for (i=0;i<search->summary->len;i++) {
- search->current = g_ptr_array_index(search->summary, i);
- if (argc>0) {
- r1 = e_sexp_term_eval(f, argv[0]);
- if (r1->type == ESEXP_RES_BOOL) {
- if (r1->value.bool)
- g_ptr_array_add(r->value.ptrarray, search->current->uid);
- } else {
- g_warning("invalid syntax, matches require a single bool result");
- }
- e_sexp_result_free(r1);
- } else {
- g_ptr_array_add(r->value.ptrarray, search->current->uid);
- }
- }
- search->current = NULL;
-
- return r;
-}
-
-static ESExpResult *
-search_header_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search)
-{
- ESExpResult *r;
- int truth = FALSE;
-
- r(printf("executing header-contains\n"));
-
- /* are we inside a match-all? */
- if (search->current && argc>1
- && argv[0]->type == ESEXP_RES_STRING) {
- char *headername, *header = NULL;
- char strbuf[32];
- int i;
-
- /* only a subset of headers are supported .. */
- headername = argv[0]->value.string;
- if (!strcasecmp(headername, "subject")) {
- header = search->current->subject;
- } else if (!strcasecmp(headername, "date")) {
- /* FIXME: not a very useful form of the date */
- sprintf(strbuf, "%d", (int)search->current->date_sent);
- header = strbuf;
- } else if (!strcasecmp(headername, "from")) {
- header = search->current->from;
- } else if (!strcasecmp(headername, "to")) {
- header = search->current->to;
- } else if (!strcasecmp(headername, "cc")) {
- header = search->current->cc;
- } else {
- g_warning("Performing query on unknown header: %s", headername);
- }
-
- if (header) {
- /* performs an OR of all words */
- for (i=1;i<argc && !truth;i++) {
- if (argv[i]->type == ESEXP_RES_STRING
- && e_strstrcase (header, argv[i]->value.string)) {
- r(printf("%s got a match with %s of %s\n", search->current->uid, header, argv[i]->value.string));
- truth = TRUE;
- break;
- }
- }
- }
- }
- /* TODO: else, find all matches */
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = truth;
-
- return r;
-}
-
-/* this is just to OR results together */
-struct _glib_sux_donkeys {
- int count;
- GPtrArray *uids;
-};
-
-/* or, store all unique values */
-static void
-g_lib_sux_htor(char *key, int value, struct _glib_sux_donkeys *fuckup)
-{
- g_ptr_array_add(fuckup->uids, key);
-}
-
-static ESExpResult *
-search_body_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search)
-{
- ESExpResult *r;
- int i, j;
-
- if (search->current) {
- int truth = FALSE;
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- if (search->body_index) {
- for (i=0;i<argc && !truth;i++) {
- if (argv[i]->type == ESEXP_RES_STRING) {
- truth = ibex_find_name(search->body_index, search->current->uid, argv[i]->value.string);
- } else {
- g_warning("Invalid type passed to body-contains match function");
- }
- }
- } else {
- g_warning("Cannot perform indexed body query with no index");
- }
- r->value.bool = truth;
- } else {
- r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR);
-
- if (search->body_index) {
- if (argc==1) {
- /* common case */
- r->value.ptrarray = ibex_find(search->body_index, argv[0]->value.string);
- } else {
- GHashTable *ht = g_hash_table_new(g_str_hash, g_str_equal);
- GPtrArray *pa;
- struct _glib_sux_donkeys lambdafoo;
-
- /* this sux, perform an or operation on the result(s) of each word */
- for (i=0;i<argc;i++) {
- if (argv[i]->type == ESEXP_RES_STRING) {
- pa = ibex_find(search->body_index, argv[i]->value.string);
- for (j=0;j<pa->len;j++) {
- g_hash_table_insert(ht, g_ptr_array_index(pa, j), (void *)1);
- }
- g_ptr_array_free(pa, FALSE);
- } else {
- g_warning("invalid type passed to body-contains");
- }
- }
- lambdafoo.uids = g_ptr_array_new();
- g_hash_table_foreach(ht, (GHFunc)g_lib_sux_htor, &lambdafoo);
- r->value.ptrarray = lambdafoo.uids;
- g_hash_table_destroy(ht);
- }
- } else {
- r->value.ptrarray = g_ptr_array_new();
- }
- }
-
- return r;
-}
-
-static ESExpResult *search_user_flag(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search)
-{
- ESExpResult *r;
- int i;
-
- r(printf("executing user-flag\n"));
-
- /* are we inside a match-all? */
- if (search->current) {
- int truth = FALSE;
- /* performs an OR of all words */
- for (i=0;i<argc && !truth;i++) {
- if (argv[i]->type == ESEXP_RES_STRING
- && camel_flag_get(&search->current->user_flags, argv[i]->value.string)) {
- truth = TRUE;
- break;
- }
- }
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = truth;
- } else {
- r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR);
- r->value.ptrarray = g_ptr_array_new();
- }
-
- return r;
-}
-
-static ESExpResult *search_user_tag(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search)
-{
- ESExpResult *r;
-
- r(printf("executing user-tag\n"));
-
- /* are we inside a match-all? */
- if (search->current) {
- const char *value = NULL;
- if (argc == 1) {
- value = camel_tag_get(&search->current->user_tags, argv[0]->value.string);
- }
- r = e_sexp_result_new(ESEXP_RES_STRING);
- r->value.string = g_strdup(value?value:"");
- } else {
- r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR);
- r->value.ptrarray = g_ptr_array_new();
- }
-
- return r;
-}
-
-static ESExpResult *
-search_get_sent_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s)
-{
- ESExpResult *r;
-
- r(printf("executing get-sent-date\n"));
-
- /* are we inside a match-all? */
- if (s->current) {
- r = e_sexp_result_new (ESEXP_RES_INT);
-
- r->value.number = s->current->date_sent;
- } else {
- r = e_sexp_result_new (ESEXP_RES_ARRAY_PTR);
- r->value.ptrarray = g_ptr_array_new ();
- }
-
- return r;
-}
-
-static ESExpResult *
-search_get_received_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s)
-{
- ESExpResult *r;
-
- r(printf("executing get-received-date\n"));
-
- /* are we inside a match-all? */
- if (s->current) {
- r = e_sexp_result_new (ESEXP_RES_INT);
-
- r->value.number = s->current->date_received;
- } else {
- r = e_sexp_result_new (ESEXP_RES_ARRAY_PTR);
- r->value.ptrarray = g_ptr_array_new ();
- }
-
- return r;
-}
-
-static ESExpResult *
-search_get_current_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s)
-{
- ESExpResult *r;
-
- r(printf("executing get-current-date\n"));
-
- r = e_sexp_result_new (ESEXP_RES_INT);
- r->value.number = time (NULL);
- return r;
-}
-
diff --git a/camel/camel-folder-search.h b/camel/camel-folder-search.h
deleted file mode 100644
index aca9ff27f7..0000000000
--- a/camel/camel-folder-search.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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 _CAMEL_FOLDER_SEARCH_H
-#define _CAMEL_FOLDER_SEARCH_H
-
-#include <camel/camel-object.h>
-#include <e-util/e-sexp.h>
-#include <e-util/e-util.h>
-#include <libibex/ibex.h>
-#include <camel/camel-folder.h>
-
-#define CAMEL_FOLDER_SEARCH(obj) CAMEL_CHECK_CAST (obj, camel_folder_search_get_type (), CamelFolderSearch)
-#define CAMEL_FOLDER_SEARCH_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_folder_search_get_type (), CamelFolderSearchClass)
-#define IS_CAMEL_FOLDER_SEARCH(obj) CAMEL_CHECK_TYPE (obj, camel_folder_search_get_type ())
-
-typedef struct _CamelFolderSearchClass CamelFolderSearchClass;
-
-struct _CamelFolderSearch {
- CamelObject parent;
-
- struct _CamelFolderSearchPrivate *priv;
-
- ESExp *sexp; /* s-exp evaluator */
- char *last_search; /* last searched expression */
-
- /* these are only valid during the search, and are reset afterwards */
- CamelFolder *folder; /* folder for current search */
- GPtrArray *summary; /* summary array for current search */
- CamelMessageInfo *current; /* current message info, when searching one by one */
- ibex *body_index;
-};
-
-struct _CamelFolderSearchClass {
- CamelObjectClass parent_class;
-
- /* general bool/comparison options, usually these wont need to be set, unless it is compiling into another language */
- ESExpResult * (*and)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
- ESExpResult * (*or)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
- ESExpResult * (*not)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
- ESExpResult * (*lt)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
- ESExpResult * (*gt)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
- ESExpResult * (*eq)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
-
- /* search options */
- /* (match-all [boolean expression]) Apply match to all messages */
- ESExpResult * (*match_all)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
-
- /* (body-contains "string1" "string2" ...) Returns a list of matches, or true if in single-message mode */
- ESExpResult * (*body_contains)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-
- /* (header-contains "headername" "string1" ...) List of matches, or true if in single-message mode */
- ESExpResult * (*header_contains)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-
- /* (user-flag "flagname" "flagname" ...) If one of user-flag set */
- ESExpResult * (*user_flag)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-
- /* (user-tag "flagname") Returns the value of a user tag. Can only be used in match-all */
- ESExpResult * (*user_tag)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-
- /* (get-sent-date) Retrieve the date that the message was sent on as a time_t */
- ESExpResult * (*get_sent_date)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-
- /* (get-received-date) Retrieve the date that the message was received on as a time_t */
- ESExpResult * (*get_received_date)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-
- /* (get-current-date) Retrieve 'now' as a time_t */
- ESExpResult * (*get_current_date)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-};
-
-guint camel_folder_search_get_type (void);
-CamelFolderSearch *camel_folder_search_new (void);
-void camel_folder_search_construct (CamelFolderSearch *search);
-
-void camel_folder_search_set_folder(CamelFolderSearch *search, CamelFolder *folder);
-void camel_folder_search_set_summary(CamelFolderSearch *search, GPtrArray *summary);
-void camel_folder_search_set_body_index(CamelFolderSearch *search, ibex *index);
-GPtrArray *camel_folder_search_execute_expression(CamelFolderSearch *search, const char *expr, CamelException *ex);
-void camel_folder_search_free_result(CamelFolderSearch *search, GPtrArray *);
-
-#endif /* ! _CAMEL_FOLDER_SEARCH_H */
diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c
deleted file mode 100644
index 71456dbf4d..0000000000
--- a/camel/camel-folder-summary.c
+++ /dev/null
@@ -1,1641 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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
- */
-
-#include <unistd.h>
-#include <netinet/in.h>
-#include <ctype.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-
-#include "camel-folder-summary.h"
-
-#include <camel/camel-mime-message.h>
-
-#include <camel/camel-mime-filter.h>
-#include <camel/camel-mime-filter-index.h>
-#include <camel/camel-mime-filter-charset.h>
-#include <camel/camel-mime-filter-save.h>
-#include <camel/camel-mime-filter-basic.h>
-#include <camel/camel-mime-message.h>
-#include "hash-table-utils.h"
-
-/* this should probably be conditional on it existing */
-#define USE_BSEARCH
-
-#define d(x)
-#define io(x) /* io debug */
-
-#if 0
-extern int strdup_count, malloc_count, free_count;
-#endif
-
-#define CAMEL_FOLDER_SUMMARY_VERSION (7)
-
-struct _CamelFolderSummaryPrivate {
- GHashTable *filter_charset; /* CamelMimeFilterCharset's indexed by source charset */
-
- CamelMimeFilterIndex *filter_index;
- CamelMimeFilterBasic *filter_64;
- CamelMimeFilterBasic *filter_qp;
- CamelMimeFilterSave *filter_save;
-
- ibex *index;
-};
-
-#define _PRIVATE(o) (((CamelFolderSummary *)(o))->priv)
-
-/* trivial lists, just because ... */
-struct _node {
- struct _node *next;
-};
-
-static struct _node *my_list_append(struct _node **list, struct _node *n);
-static int my_list_size(struct _node **list);
-
-static int summary_header_load(CamelFolderSummary *, FILE *);
-static int summary_header_save(CamelFolderSummary *, FILE *);
-
-static CamelMessageInfo * message_info_new(CamelFolderSummary *, struct _header_raw *);
-static CamelMessageInfo * message_info_new_from_parser(CamelFolderSummary *, CamelMimeParser *);
-static CamelMessageInfo * message_info_load(CamelFolderSummary *, FILE *);
-static int message_info_save(CamelFolderSummary *, FILE *, CamelMessageInfo *);
-static void message_info_free(CamelFolderSummary *, CamelMessageInfo *);
-
-static CamelMessageContentInfo * content_info_new(CamelFolderSummary *, struct _header_raw *);
-static CamelMessageContentInfo * content_info_new_from_parser(CamelFolderSummary *, CamelMimeParser *);
-static CamelMessageContentInfo * content_info_load(CamelFolderSummary *, FILE *);
-static int content_info_save(CamelFolderSummary *, FILE *, CamelMessageContentInfo *);
-static void content_info_free(CamelFolderSummary *, CamelMessageContentInfo *);
-
-static CamelMessageContentInfo * summary_build_content_info(CamelFolderSummary *s, CamelMimeParser *mp);
-
-static void camel_folder_summary_class_init (CamelFolderSummaryClass *klass);
-static void camel_folder_summary_init (CamelFolderSummary *obj);
-static void camel_folder_summary_finalize (CamelObject *obj);
-
-static CamelObjectClass *camel_folder_summary_parent;
-
-static void
-camel_folder_summary_class_init (CamelFolderSummaryClass *klass)
-{
- camel_folder_summary_parent = camel_type_get_global_classfuncs (camel_object_get_type ());
-
- klass->summary_header_load = summary_header_load;
- klass->summary_header_save = summary_header_save;
-
- klass->message_info_new = message_info_new;
- klass->message_info_new_from_parser = message_info_new_from_parser;
- klass->message_info_load = message_info_load;
- klass->message_info_save = message_info_save;
- klass->message_info_free = message_info_free;
-
- klass->content_info_new = content_info_new;
- klass->content_info_new_from_parser = content_info_new_from_parser;
- klass->content_info_load = content_info_load;
- klass->content_info_save = content_info_save;
- klass->content_info_free = content_info_free;
-}
-
-static void
-camel_folder_summary_init (CamelFolderSummary *s)
-{
- struct _CamelFolderSummaryPrivate *p;
-
- p = _PRIVATE(s) = g_malloc0(sizeof(*p));
-
- p->filter_charset = g_hash_table_new(g_strcase_hash, g_strcase_equal);
-
- s->message_info_size = sizeof(CamelMessageInfo);
- s->content_info_size = sizeof(CamelMessageContentInfo);
-
- s->version = CAMEL_FOLDER_SUMMARY_VERSION;
- s->flags = 0;
- s->time = 0;
- s->nextuid = 1;
-
- s->messages = g_ptr_array_new();
- s->messages_uid = g_hash_table_new(g_str_hash, g_str_equal);
-}
-
-static void free_o_name(void *key, void *value, void *data)
-{
- camel_object_unref((CamelObject *)value);
- g_free(key);
-}
-
-static void
-camel_folder_summary_finalize (CamelObject *obj)
-{
- struct _CamelFolderSummaryPrivate *p;
- CamelFolderSummary *s = (CamelFolderSummary *)obj;
-
- p = _PRIVATE(obj);
-
- camel_folder_summary_clear(s);
- g_ptr_array_free(s->messages, TRUE);
- g_hash_table_destroy(s->messages_uid);
-
- g_hash_table_foreach(p->filter_charset, free_o_name, 0);
- g_hash_table_destroy(p->filter_charset);
-
- g_free(s->summary_path);
-
- if (p->filter_index)
- camel_object_unref ((CamelObject *)p->filter_index);
- if (p->filter_64)
- camel_object_unref ((CamelObject *)p->filter_64);
- if (p->filter_qp)
- camel_object_unref ((CamelObject *)p->filter_qp);
- if (p->filter_save)
- camel_object_unref ((CamelObject *)p->filter_save);
-
- g_free(p);
-}
-
-CamelType
-camel_folder_summary_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_object_get_type (), "CamelFolderSummary",
- sizeof (CamelFolderSummary),
- sizeof (CamelFolderSummaryClass),
- (CamelObjectClassInitFunc) camel_folder_summary_class_init,
- NULL,
- (CamelObjectInitFunc) camel_folder_summary_init,
- (CamelObjectFinalizeFunc) camel_folder_summary_finalize);
- }
-
- return type;
-}
-
-/**
- * camel_folder_summary_new:
- *
- * Create a new CamelFolderSummary object.
- *
- * Return value: A new CamelFolderSummary widget.
- **/
-CamelFolderSummary *
-camel_folder_summary_new (void)
-{
- CamelFolderSummary *new = CAMEL_FOLDER_SUMMARY ( camel_object_new (camel_folder_summary_get_type ()));
- return new;
-}
-
-
-void camel_folder_summary_set_filename(CamelFolderSummary *s, const char *name)
-{
- g_free(s->summary_path);
- s->summary_path = g_strdup(name);
-}
-
-void camel_folder_summary_set_index(CamelFolderSummary *s, ibex *index)
-{
- struct _CamelFolderSummaryPrivate *p = _PRIVATE(s);
-
- p->index = index;
-}
-
-void camel_folder_summary_set_build_content(CamelFolderSummary *s, gboolean state)
-{
- s->build_content = state;
-}
-
-int
-camel_folder_summary_count(CamelFolderSummary *s)
-{
- return s->messages->len;
-}
-
-CamelMessageInfo *
-camel_folder_summary_index(CamelFolderSummary *s, int i)
-{
- if (i<s->messages->len)
- return g_ptr_array_index(s->messages, i);
- return NULL;
-}
-
-CamelMessageInfo *
-camel_folder_summary_uid(CamelFolderSummary *s, const char *uid)
-{
- return g_hash_table_lookup(s->messages_uid, uid);
-}
-
-guint32 camel_folder_summary_next_uid(CamelFolderSummary *s)
-{
- guint32 uid = s->nextuid++;
-
- /* FIXME: sync this to disk */
-/* summary_header_save(s);*/
- return uid;
-}
-
-char *
-camel_folder_summary_next_uid_string (CamelFolderSummary *s)
-{
- return g_strdup_printf ("%u", camel_folder_summary_next_uid (s));
-}
-
-/* loads the content descriptions, recursively */
-static CamelMessageContentInfo *
-perform_content_info_load(CamelFolderSummary *s, FILE *in)
-{
- int i;
- guint32 count;
- CamelMessageContentInfo *ci, *part;
-
- ci = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_load(s, in);
- camel_folder_summary_decode_uint32(in, &count);
- for (i=0;i<count;i++) {
- part = perform_content_info_load(s, in);
- if (part) {
- my_list_append((struct _node **)&ci->childs, (struct _node *)part);
- part->parent = ci;
- } else {
- g_warning("Summary file format messed up?");
- }
- }
- return ci;
-}
-
-int
-camel_folder_summary_load(CamelFolderSummary *s)
-{
- FILE *in;
- int i;
- CamelMessageInfo *mi;
-
- g_assert(s->summary_path);
-
- in = fopen(s->summary_path, "r");
- if ( in == NULL ) {
- return -1;
- }
-
- if ( ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_load(s, in) == -1) {
- fclose(in);
- return -1;
- }
-
- /* now read in each message ... */
- /* FIXME: check returns */
- for (i=0;i<s->saved_count;i++) {
- mi = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_load(s, in);
-
- if (s->build_content) {
- mi->content = perform_content_info_load(s, in);
- }
-
- camel_folder_summary_add(s, mi);
- }
-
- if (fclose(in) == -1)
- return -1;
-
- s->flags &= ~CAMEL_SUMMARY_DIRTY;
-
- return 0;
-}
-
-/* saves the content descriptions, recursively */
-static int
-perform_content_info_save(CamelFolderSummary *s, FILE *out, CamelMessageContentInfo *ci)
-{
- CamelMessageContentInfo *part;
-
- ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_save(s, out, ci);
- camel_folder_summary_encode_uint32(out, my_list_size((struct _node **)&ci->childs));
- part = ci->childs;
- while (part) {
- perform_content_info_save(s, out, part);
- part = part->next;
- }
- return 0;
-}
-
-int
-camel_folder_summary_save(CamelFolderSummary *s)
-{
- FILE *out;
- int fd;
- int i;
- guint32 count;
- CamelMessageInfo *mi;
-
- g_assert(s->summary_path);
-
- if ((s->flags & CAMEL_SUMMARY_DIRTY) == 0)
- return 0;
-
- fd = open(s->summary_path, O_RDWR|O_CREAT, 0600);
- if (fd == -1)
- return -1;
- out = fdopen(fd, "w");
- if ( out == NULL ) {
- close(fd);
- return -1;
- }
-
- io(printf("saving header\n"));
-
- if ( ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_save(s, out) == -1) {
- fclose(out);
- return -1;
- }
-
- /* now write out each message ... */
- /* FIXME: check returns */
- count = camel_folder_summary_count(s);
- for (i=0;i<count;i++) {
- mi = camel_folder_summary_index(s, i);
- ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_save(s, out, mi);
-
- if (s->build_content) {
- perform_content_info_save(s, out, mi->content);
- }
- }
- if (fclose(out) == -1)
- return -1;
-
- s->flags &= ~CAMEL_SUMMARY_DIRTY;
- return 0;
-}
-
-void camel_folder_summary_add(CamelFolderSummary *s, CamelMessageInfo *info)
-{
- if (info == NULL)
- return;
-retry:
- if (info->uid == NULL) {
- info->uid = camel_folder_summary_next_uid_string (s);
- }
- if (g_hash_table_lookup(s->messages_uid, info->uid)) {
- g_warning("Trying to insert message with clashing uid (%s). new uid re-assigned", info->uid);
- g_free(info->uid);
- info->uid = NULL;
- info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
- goto retry;
- }
-
- g_ptr_array_add(s->messages, info);
- g_hash_table_insert(s->messages_uid, info->uid, info);
- s->flags |= CAMEL_SUMMARY_DIRTY;
-}
-
-CamelMessageInfo *camel_folder_summary_add_from_header(CamelFolderSummary *s, struct _header_raw *h)
-{
- CamelMessageInfo *info = NULL;
-
- info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s))) -> message_info_new(s, h);
- camel_folder_summary_add(s, info);
-
- return info;
-}
-
-CamelMessageInfo *camel_folder_summary_add_from_parser(CamelFolderSummary *s, CamelMimeParser *mp)
-{
- CamelMessageInfo *info = NULL;
- char *buffer;
- int len;
- struct _CamelFolderSummaryPrivate *p = _PRIVATE(s);
-
- /* should this check the parser is in the right state, or assume it is?? */
-
- if (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_EOF) {
- info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_new_from_parser(s, mp);
-
- camel_mime_parser_unstep(mp);
-
- camel_folder_summary_add(s, info);
-
- if (p->index) {
- if (p->filter_index == NULL)
- p->filter_index = camel_mime_filter_index_new_ibex(p->index);
- camel_mime_filter_index_set_name(p->filter_index, info->uid);
- ibex_unindex(p->index, info->uid);
- }
-
- /* build the content info, if we're supposed to */
- if (s->build_content) {
- info->content = summary_build_content_info(s, mp);
- if (info->content->pos != -1)
- info->size = info->content->endpos - info->content->pos;
- } else {
- camel_mime_parser_drop_step(mp);
- }
- }
- return info;
-}
-
-static void
-perform_content_info_free(CamelFolderSummary *s, CamelMessageContentInfo *ci)
-{
- CamelMessageContentInfo *pw, *pn;
-
- pw = ci->childs;
- ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_free(s, ci);
- while (pw) {
- pn = pw->next;
- perform_content_info_free(s, pw);
- pw = pn;
- }
-}
-
-void
-camel_folder_summary_touch(CamelFolderSummary *s)
-{
- s->flags |= CAMEL_SUMMARY_DIRTY;
-}
-
-void
-camel_folder_summary_clear(CamelFolderSummary *s)
-{
- int i;
-
- if (camel_folder_summary_count(s) == 0)
- return;
-
- for (i=0;i<camel_folder_summary_count(s);i++) {
- CamelMessageInfo *mi = camel_folder_summary_index(s, i);
- CamelMessageContentInfo *ci = mi->content;
-
- ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_free(s, mi);
- if (s->build_content && ci) {
- perform_content_info_free(s, ci);
- }
- }
-
- g_ptr_array_set_size(s->messages, 0);
- g_hash_table_destroy(s->messages_uid);
- s->messages_uid = g_hash_table_new(g_str_hash, g_str_equal);
- s->flags |= CAMEL_SUMMARY_DIRTY;
-}
-
-void camel_folder_summary_remove(CamelFolderSummary *s, CamelMessageInfo *info)
-{
- CamelMessageContentInfo *ci = info->content;
-
- g_hash_table_remove(s->messages_uid, info->uid);
- g_ptr_array_remove(s->messages, info);
- ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_free(s, info);
- if (s->build_content && ci) {
- perform_content_info_free(s, ci);
- }
- s->flags |= CAMEL_SUMMARY_DIRTY;
-}
-
-void camel_folder_summary_remove_uid(CamelFolderSummary *s, const char *uid)
-{
- CamelMessageInfo *oldinfo;
- char *olduid;
-
- if (g_hash_table_lookup_extended(s->messages_uid, uid, (void *)&olduid, (void *)&oldinfo)) {
- camel_folder_summary_remove(s, oldinfo);
- g_free(olduid);
- }
-}
-
-int
-camel_folder_summary_encode_uint32(FILE *out, guint32 value)
-{
- int i;
-
- io(printf("Encoding int %u\n", value));
-
- for (i=28;i>0;i-=7) {
- if (value >= (1<<i)) {
- unsigned int c = (value>>i) & 0x7f;
- if (fputc(c, out) == -1)
- return -1;
- }
- }
- return fputc(value | 0x80, out);
-}
-
-int
-camel_folder_summary_decode_uint32(FILE *in, guint32 *dest)
-{
- gint32 value=0, v;
-
- /* until we get the last byte, keep decoding 7 bits at a time */
- while ( ((v = fgetc(in)) & 0x80) == 0 && v!=EOF) {
- value |= v;
- value <<= 7;
- }
- if (v == EOF) {
- *dest = value>>7;
- return 01;
- }
- *dest = value | (v&0x7f);
-
- io(printf("Decoding int %u\n", *dest));
-
- return 0;
-}
-
-int
-camel_folder_summary_encode_fixed_int32(FILE *out, gint32 value)
-{
- guint32 save;
-
- save = htonl(value);
- if (fwrite(&save, sizeof(save), 1, out) != 1)
- return -1;
- return 0;
-}
-
-int
-camel_folder_summary_decode_fixed_int32(FILE *in, gint32 *dest)
-{
- guint32 save;
-
- if (fread(&save, sizeof(save), 1, in) == 1) {
- *dest = ntohl(save);
- return 0;
- } else {
- return -1;
- }
-}
-
-/* should be sorted, for binary search */
-/* This is a tokenisation mechanism for strings written to the
- summary - to save space.
- This list can have at most 31 words. */
-static char * tokens[] = {
- "7bit",
- "8bit",
- "alternative",
- "application",
- "base64",
- "boundary",
- "charset",
- "filename",
- "html",
- "image",
- "iso-8859-1",
- "iso-8859-8",
- "message",
- "mixed",
- "multipart",
- "name",
- "octet-stream",
- "parallel",
- "plain",
- "postscript",
- "quoted-printable",
- "related",
- "rfc822",
- "text",
- "us-ascii", /* 25 words */
-};
-
-#define tokens_len (sizeof(tokens)/sizeof(tokens[0]))
-
-/* baiscally ...
- 0 = null
- 1-tokens_len == tokens[id-1]
- >=32 string, length = n-32
-*/
-
-#ifdef USE_BSEARCH
-static int
-token_search_cmp(char *key, char **index)
-{
- d(printf("comparing '%s' to '%s'\n", key, *index));
- return strcmp(key, *index);
-}
-#endif
-
-int
-camel_folder_summary_encode_token(FILE *out, char *str)
-{
- io(printf("Encoding token: '%s'\n", str));
-
- if (str == NULL) {
- return camel_folder_summary_encode_uint32(out, 0);
- } else {
- int len = strlen(str);
- int i, token=-1;
-
- if (len <= 16) {
- char lower[32];
- char **match;
-
- for (i=0;i<len;i++)
- lower[i] = tolower(str[i]);
- lower[i] = 0;
-#ifdef USE_BSEARCH
- match = bsearch(lower, tokens, tokens_len, sizeof(char *), (int (*)(const void *, const void *))token_search_cmp);
- if (match)
- token = match-tokens;
-#else
- for (i=0;i<tokens_len;i++) {
- if (!strcmp(tokens[i], lower)) {
- token = i;
- break;
- }
- }
-#endif
- }
- if (token != -1) {
- return camel_folder_summary_encode_uint32(out, token+1);
- } else {
- if (camel_folder_summary_encode_uint32(out, len+32) == -1)
- return -1;
- if (fwrite(str, len, 1, out) != 1)
- return -1;
- }
- }
- return 0;
-}
-
-int
-camel_folder_summary_decode_token(FILE *in, char **str)
-{
- char *ret;
- guint32 len;
-
- io(printf("Decode token ...\n"));
-
- if (camel_folder_summary_decode_uint32(in, &len) == -1) {
- g_warning("Could not decode token from file");
- *str = NULL;
- return -1;
- }
-
- if (len<32) {
- if (len <= 0) {
- ret = NULL;
- } else if (len<= tokens_len) {
- ret = g_strdup(tokens[len-1]);
- } else {
- g_warning("Invalid token encountered: %d", len);
- *str = NULL;
- return -1;
- }
- } else if (len > 10240) {
- g_warning("Got broken string header length: %d bytes", len);
- *str = NULL;
- return -1;
- } else {
- len -= 32;
- ret = g_malloc(len+1);
- if (fread(ret, len, 1, in) != 1) {
- g_free(ret);
- *str = NULL;
- return -1;
- }
- ret[len]=0;
- }
-
- io(printf("Token = '%s'\n", ret));
-
- *str = ret;
- return 0;
-}
-
-int
-camel_folder_summary_encode_string(FILE *out, char *str)
-{
- register int len;
-
- io(printf("Encoding string: '%s'\n", str));
-
- if (str == NULL)
- return camel_folder_summary_encode_uint32(out, 0);
-
- len = strlen(str);
- if (camel_folder_summary_encode_uint32(out, len+1) == -1)
- return -1;
- if (fwrite(str, len, 1, out) == 1)
- return 0;
- return -1;
-}
-
-
-int
-camel_folder_summary_decode_string(FILE *in, char **str)
-{
- gint32 len;
- register char *ret;
-
- io(printf("Decode string ...\n", str));
-
- if (camel_folder_summary_decode_uint32(in, &len) == -1) {
- *str = NULL;
- return -1;
- }
-
- len--;
- if (len < 0) {
- *str = NULL;
- io(printf("String = '%s'\n", *str));
- return -1;
- }
-
- ret = g_malloc(len+1);
- if (fread(ret, len, 1, in) != 1) {
- g_free(ret);
- *str = NULL;
- return -1;
- }
-
- io(printf("String = '%s'\n", ret));
-
- ret[len] = 0;
- *str = ret;
- return 0;
-}
-
-void
-camel_folder_summary_offset_content(CamelMessageContentInfo *content, off_t offset)
-{
- content->pos += offset;
- content->bodypos += offset;
- content->endpos += offset;
- content = content->childs;
- while (content) {
- camel_folder_summary_offset_content(content, offset);
- content = content->next;
- }
-}
-
-static struct _node *
-my_list_append(struct _node **list, struct _node *n)
-{
- struct _node *ln = (struct _node *)list;
- while (ln->next)
- ln = ln->next;
- n->next = 0;
- ln->next = n;
- return n;
-}
-
-static int
-my_list_size(struct _node **list)
-{
- int len = 0;
- struct _node *ln = (struct _node *)list;
- while (ln->next) {
- ln = ln->next;
- len++;
- }
- return len;
-}
-
-static int
-summary_header_load(CamelFolderSummary *s, FILE *in)
-{
- gint32 version, flags, nextuid, count, utime;
-
- fseek(in, 0, SEEK_SET);
-
- io(printf("Loading header\n"));
-
- if (camel_folder_summary_decode_fixed_int32(in, &version) == -1
- || camel_folder_summary_decode_fixed_int32(in, &flags) == -1
- || camel_folder_summary_decode_fixed_int32(in, &nextuid) == -1
- || camel_folder_summary_decode_fixed_int32(in, &utime) == -1
- || camel_folder_summary_decode_fixed_int32(in, &count) == -1) {
- return -1;
- }
-
- s->nextuid = nextuid;
- s->flags = flags;
- s->time = (time_t) utime;
- s->saved_count = count;
- if (s->version != version) {
- g_warning("Summary header version mismatch");
- return -1;
- }
- return 0;
-}
-
-static int
-summary_header_save(CamelFolderSummary *s, FILE *out)
-{
- fseek(out, 0, SEEK_SET);
-
- io(printf("Savining header\n"));
-
- camel_folder_summary_encode_fixed_int32(out, s->version);
- camel_folder_summary_encode_fixed_int32(out, s->flags);
- camel_folder_summary_encode_fixed_int32(out, s->nextuid);
- camel_folder_summary_encode_fixed_int32(out, s->time);
- return camel_folder_summary_encode_fixed_int32(out, camel_folder_summary_count(s));
-}
-
-/* are these even useful for anything??? */
-static CamelMessageInfo * message_info_new_from_parser(CamelFolderSummary *s, CamelMimeParser *mp)
-{
- CamelMessageInfo *mi = NULL;
- int state;
-
- state = camel_mime_parser_state(mp);
- switch (state) {
- case HSCAN_HEADER:
- case HSCAN_MESSAGE:
- case HSCAN_MULTIPART:
- mi = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_new(s, camel_mime_parser_headers_raw(mp));
- break;
- default:
- g_error("Invalid parser state");
- }
-
- return mi;
-}
-
-static CamelMessageContentInfo * content_info_new_from_parser(CamelFolderSummary *s, CamelMimeParser *mp)
-{
- CamelMessageContentInfo *ci = NULL;
-
- switch (camel_mime_parser_state(mp)) {
- case HSCAN_HEADER:
- case HSCAN_MESSAGE:
- case HSCAN_MULTIPART:
- ci = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_new(s, camel_mime_parser_headers_raw(mp));
- if (ci) {
- ci->type = camel_mime_parser_content_type(mp);
- header_content_type_ref(ci->type);
- }
- break;
- default:
- g_error("Invalid parser state");
- }
-
- return ci;
-}
-
-char *
-camel_summary_format_address(struct _header_raw *h, const char *name)
-{
- struct _header_address *addr;
- const char *text;
- char *ret;
-
- text = header_raw_find(&h, name, NULL);
- addr = header_address_decode(text);
- if (addr) {
- ret = header_address_list_format(addr);
- header_address_list_clear(&addr);
- } else {
- ret = g_strdup(text);
- }
- return ret;
-}
-
-char *
-camel_summary_format_string(struct _header_raw *h, const char *name)
-{
- const char *text;
-
- text = header_raw_find(&h, name, NULL);
- if (text) {
- while (isspace(*text))
- text++;
- return header_decode_string(text);
- } else {
- return NULL;
- }
-}
-
-static CamelMessageInfo *
-message_info_new(CamelFolderSummary *s, struct _header_raw *h)
-{
- CamelMessageInfo *mi;
- const char *received;
-
- mi = g_malloc0(s->message_info_size);
-
- mi->subject = camel_summary_format_string(h, "subject");
- mi->from = camel_summary_format_address(h, "from");
- mi->to = camel_summary_format_address(h, "to");
- mi->cc = camel_summary_format_address(h, "cc");
- mi->user_flags = NULL;
- mi->user_tags = NULL;
- mi->date_sent = header_decode_date(header_raw_find(&h, "date", NULL), NULL);
- received = header_raw_find(&h, "received", NULL);
- if (received)
- received = strrchr(received, ';');
- if (received)
- mi->date_received = header_decode_date(received + 1, NULL);
- else
- mi->date_received = 0;
- mi->message_id = header_msgid_decode(header_raw_find(&h, "message-id", NULL));
- /* if we have a references, use that, otherwise, see if we have an in-reply-to
- header, with parsable content, otherwise *shrug* */
- mi->references = header_references_decode(header_raw_find(&h, "references", NULL));
- if (mi->references == NULL)
- mi->references = header_references_decode(header_raw_find(&h, "in-reply-to", NULL));
- return mi;
-}
-
-
-static CamelMessageInfo *
-message_info_load(CamelFolderSummary *s, FILE *in)
-{
- CamelMessageInfo *mi;
- guint32 udate_sent, udate_received;
- guint count;
- int i;
-
- mi = g_malloc0(s->message_info_size);
-
- io(printf("Loading message info\n"));
-
- camel_folder_summary_decode_string(in, &mi->uid);
- camel_folder_summary_decode_uint32(in, &mi->flags);
- camel_folder_summary_decode_uint32(in, &udate_sent); /* warnings, leave them here */
- camel_folder_summary_decode_uint32(in, &udate_received);
-/* ms->xev_offset = camel_folder_summary_decode_uint32(in);*/
- camel_folder_summary_decode_string(in, &mi->subject);
- camel_folder_summary_decode_string(in, &mi->from);
- camel_folder_summary_decode_string(in, &mi->to);
- camel_folder_summary_decode_string(in, &mi->cc);
- mi->content = NULL;
-
- mi->date_sent = (time_t) udate_sent;
- mi->date_received = (time_t) udate_received;
-
- camel_folder_summary_decode_string(in, &mi->message_id);
-
- camel_folder_summary_decode_uint32(in, &count);
- for (i=0;i<count;i++) {
- char *id;
- camel_folder_summary_decode_string(in, &id);
- header_references_list_append_asis(&mi->references, id);
- }
-
- camel_folder_summary_decode_uint32(in, &count);
- for (i=0;i<count;i++) {
- char *name;
- camel_folder_summary_decode_string(in, &name);
- camel_flag_set(&mi->user_flags, name, TRUE);
- g_free(name);
- }
-
- camel_folder_summary_decode_uint32(in, &count);
- for (i=0;i<count;i++) {
- char *name, *value;
- camel_folder_summary_decode_string(in, &name);
- camel_folder_summary_decode_string(in, &value);
- camel_tag_set(&mi->user_tags, name, value);
- g_free(name);
- g_free(value);
- }
-
- return mi;
-}
-
-static int
-message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *mi)
-{
- guint32 count;
- CamelFlag *flag;
- CamelTag *tag;
- struct _header_references *refs;
-
- io(printf("Saving message info\n"));
-
- camel_folder_summary_encode_string(out, mi->uid);
- camel_folder_summary_encode_uint32(out, mi->flags);
- camel_folder_summary_encode_uint32(out, mi->date_sent);
- camel_folder_summary_encode_uint32(out, mi->date_received);
-/* camel_folder_summary_encode_uint32(out, ms->xev_offset);*/
- camel_folder_summary_encode_string(out, mi->subject);
- camel_folder_summary_encode_string(out, mi->from);
- camel_folder_summary_encode_string(out, mi->to);
- camel_folder_summary_encode_string(out, mi->cc);
-
- camel_folder_summary_encode_string(out, mi->message_id);
-
- count = header_references_list_size(&mi->references);
- camel_folder_summary_encode_uint32(out, count);
- refs = mi->references;
- while (refs) {
- camel_folder_summary_encode_string(out, refs->id);
- refs = refs->next;
- }
-
- count = camel_flag_list_size(&mi->user_flags);
- camel_folder_summary_encode_uint32(out, count);
- flag = mi->user_flags;
- while (flag) {
- camel_folder_summary_encode_string(out, flag->name);
- flag = flag->next;
- }
-
- count = camel_tag_list_size(&mi->user_tags);
- camel_folder_summary_encode_uint32(out, count);
- tag = mi->user_tags;
- while (tag) {
- camel_folder_summary_encode_string(out, tag->name);
- camel_folder_summary_encode_string(out, tag->value);
- tag = tag->next;
- }
-
- return ferror(out);
-}
-
-static void
-message_info_free(CamelFolderSummary *s, CamelMessageInfo *mi)
-{
- camel_message_info_free(mi);
-}
-
-static CamelMessageContentInfo *
-content_info_new(CamelFolderSummary *s, struct _header_raw *h)
-{
- CamelMessageContentInfo *ci;
-
- ci = g_malloc0(s->content_info_size);
-
- ci->id = header_msgid_decode(header_raw_find(&h, "content-id", NULL));
- ci->description = header_decode_string(header_raw_find(&h, "content-description", NULL));
- ci->encoding = header_content_encoding_decode(header_raw_find(&h, "content-transfer-encoding", NULL));
-
- ci->pos = -1;
- ci->bodypos = -1;
- ci->endpos = -1;
- return ci;
-}
-
-static CamelMessageContentInfo *
-content_info_load(CamelFolderSummary *s, FILE *in)
-{
- CamelMessageContentInfo *ci;
- char *type, *subtype;
- guint32 count, i, upos, ubodypos, uendpos;
- struct _header_content_type *ct;
-
- io(printf("Loading content info\n"));
-
- ci = g_malloc0(s->content_info_size);
-
- camel_folder_summary_decode_uint32(in, &upos);
- camel_folder_summary_decode_uint32(in, &ubodypos);
- camel_folder_summary_decode_uint32(in, &uendpos);
-
- ci->pos = (off_t) upos;
- ci->bodypos = (off_t) ubodypos;
- ci->endpos = (off_t) uendpos;
-
- camel_folder_summary_decode_token(in, &type);
- camel_folder_summary_decode_token(in, &subtype);
- ct = header_content_type_new(type, subtype);
- g_free(type); /* can this be removed? */
- g_free(subtype);
- camel_folder_summary_decode_uint32(in, &count);
- for (i=0;i<count;i++) {
- char *name, *value;
- camel_folder_summary_decode_token(in, &name);
- camel_folder_summary_decode_token(in, &value);
- header_content_type_set_param(ct, name, value);
- /* TODO: do this so we dont have to double alloc/free */
- g_free(name);
- g_free(value);
- }
- ci->type = ct;
-
- camel_folder_summary_decode_token(in, &ci->id);
- camel_folder_summary_decode_token(in, &ci->description);
- camel_folder_summary_decode_token(in, &ci->encoding);
-
- ci->childs = NULL;
- return ci;
-}
-
-static int
-content_info_save(CamelFolderSummary *s, FILE *out, CamelMessageContentInfo *ci)
-{
- struct _header_content_type *ct;
- struct _header_param *hp;
-
- io(printf("Saving content info\n"));
-
- camel_folder_summary_encode_uint32(out, ci->pos);
- camel_folder_summary_encode_uint32(out, ci->bodypos);
- camel_folder_summary_encode_uint32(out, ci->endpos);
-
- ct = ci->type;
- if (ct) {
- camel_folder_summary_encode_token(out, ct->type);
- camel_folder_summary_encode_token(out, ct->subtype);
- camel_folder_summary_encode_uint32(out, my_list_size((struct _node **)&ct->params));
- hp = ct->params;
- while (hp) {
- camel_folder_summary_encode_token(out, hp->name);
- camel_folder_summary_encode_token(out, hp->value);
- hp = hp->next;
- }
- } else {
- camel_folder_summary_encode_token(out, NULL);
- camel_folder_summary_encode_token(out, NULL);
- camel_folder_summary_encode_uint32(out, 0);
- }
- camel_folder_summary_encode_token(out, ci->id);
- camel_folder_summary_encode_token(out, ci->description);
- return camel_folder_summary_encode_token(out, ci->encoding);
-}
-
-static void
-content_info_free(CamelFolderSummary *s, CamelMessageContentInfo *ci)
-{
- header_content_type_unref(ci->type);
- g_free(ci->id);
- g_free(ci->description);
- g_free(ci->encoding);
- g_free(ci);
-}
-
-/*
- OK
- Now this is where all the "smarts" happen, where the content info is built,
- and any indexing and what not is performed
-*/
-
-static CamelMessageContentInfo *
-summary_build_content_info(CamelFolderSummary *s, CamelMimeParser *mp)
-{
- int state, len;
- char *buffer;
- CamelMessageContentInfo *info = NULL;
- struct _header_content_type *ct;
- int body;
- int enc_id = -1, chr_id = -1, idx_id = -1;
- struct _CamelFolderSummaryPrivate *p = _PRIVATE(s);
- CamelMimeFilterCharset *mfc;
- CamelMessageContentInfo *part;
-
- d(printf("building content info\n"));
-
- /* start of this part */
- state = camel_mime_parser_step(mp, &buffer, &len);
- body = camel_mime_parser_tell(mp);
-
- info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_new_from_parser(s, mp);
-
- info->pos = camel_mime_parser_tell_start_headers(mp);
- info->bodypos = body;
-
- switch(state) {
- case HSCAN_HEADER:
- /* check content type for indexing, then read body */
- ct = camel_mime_parser_content_type(mp);
- if (p->index && header_content_type_is(ct, "text", "*")) {
- char *encoding;
- const char *charset;
-
- d(printf("generating index:\n"));
-
- encoding = header_content_encoding_decode(camel_mime_parser_header(mp, "content-transfer-encoding", NULL));
- if (encoding) {
- if (!strcasecmp(encoding, "base64")) {
- d(printf(" decoding base64\n"));
- if (p->filter_64 == NULL)
- p->filter_64 = camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_BASE64_DEC);
- enc_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)p->filter_64);
- } else if (!strcasecmp(encoding, "quoted-printable")) {
- d(printf(" decoding quoted-printable\n"));
- if (p->filter_qp == NULL)
- p->filter_qp = camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_QP_DEC);
- enc_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)p->filter_qp);
- } else {
- d(printf(" ignoring encoding %s\n", encoding));
- }
- g_free(encoding);
- }
-
- charset = header_content_type_param(ct, "charset");
- if (charset!=NULL
- && !(strcasecmp(charset, "us-ascii")==0
- || strcasecmp(charset, "iso-8859-1")==0)) {
- d(printf(" Adding conversion filter from %s to iso-8859-1\n", charset));
- mfc = g_hash_table_lookup(p->filter_charset, charset);
- if (mfc == NULL) {
- mfc = camel_mime_filter_charset_new_convert(charset, "iso-8859-1");
- if (mfc)
- g_hash_table_insert(p->filter_charset, g_strdup(charset), mfc);
- }
- if (mfc) {
- chr_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)mfc);
- } else {
- g_warning("Cannot convert '%s' to 'iso-8859-1', message index may be corrupt", charset);
- }
- }
-
- /* and this filter actually does the indexing */
- idx_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)p->filter_index);
- }
- /* and scan/index everything */
- while (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_BODY_END)
- ;
- /* and remove the filters */
- camel_mime_parser_filter_remove(mp, enc_id);
- camel_mime_parser_filter_remove(mp, chr_id);
- camel_mime_parser_filter_remove(mp, idx_id);
- break;
- case HSCAN_MULTIPART:
- d(printf("Summarising multipart\n"));
- while (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_MULTIPART_END) {
- camel_mime_parser_unstep(mp);
- part = summary_build_content_info(s, mp);
- if (part) {
- part->parent = info;
- my_list_append((struct _node **)&info->childs, (struct _node *)part);
- } else {
- g_error("Parsing failed: could not build part of a multipart");
- }
- }
- break;
- case HSCAN_MESSAGE:
- d(printf("Summarising message\n"));
- part = summary_build_content_info(s, mp);
- if (part) {
- part->parent = info;
- my_list_append((struct _node **)&info->childs, (struct _node *)part);
- } else {
- g_error("Parsing failed: no content of a message?");
- }
- state = camel_mime_parser_step(mp, &buffer, &len);
- if (state != HSCAN_MESSAGE_END) {
- g_error("Bad parser state: Expecing MESSAGE_END or MESSAGE_EOF, got: %d", state);
- camel_mime_parser_unstep(mp);
- }
- break;
- }
-
- info->endpos = camel_mime_parser_tell(mp);
-
- d(printf("finished building content info\n"));
-
- return info;
-}
-
-gboolean
-camel_flag_get(CamelFlag **list, const char *name)
-{
- CamelFlag *flag;
- flag = *list;
- while (flag) {
- if (!strcmp(flag->name, name))
- return TRUE;
- flag = flag->next;
- }
- return FALSE;
-}
-
-void
-camel_flag_set(CamelFlag **list, const char *name, gboolean value)
-{
- CamelFlag *flag, *tmp;
-
- /* this 'trick' works because flag->next is the first element */
- flag = (CamelFlag *)list;
- while (flag->next) {
- tmp = flag->next;
- if (!strcmp(flag->next->name, name)) {
- if (!value) {
- flag->next = tmp->next;
- g_free(tmp);
- }
- return;
- }
- flag = tmp;
- }
-
- if (value) {
- tmp = g_malloc(sizeof(*tmp) + strlen(name));
- strcpy(tmp->name, name);
- tmp->next = 0;
- flag->next = tmp;
- }
-}
-
-int
-camel_flag_list_size(CamelFlag **list)
-{
- int count=0;
- CamelFlag *flag;
-
- flag = *list;
- while (flag) {
- count++;
- flag = flag->next;
- }
- return count;
-}
-
-void
-camel_flag_list_free(CamelFlag **list)
-{
- CamelFlag *flag, *tmp;
- flag = *list;
- while (flag) {
- tmp = flag->next;
- g_free(flag);
- flag = tmp;
- }
- *list = NULL;
-}
-
-const char *camel_tag_get(CamelTag **list, const char *name)
-{
- CamelTag *tag;
-
- tag = *list;
- while (tag) {
- if (!strcmp(tag->name, name))
- return (const char *)tag->value;
- tag = tag->next;
- }
- return NULL;
-}
-
-void camel_tag_set(CamelTag **list, const char *name, const char *value)
-{
- CamelTag *tag, *tmp;
-
- /* this 'trick' works because tag->next is the first element */
- tag = (CamelTag *)list;
- while (tag->next) {
- tmp = tag->next;
- if (!strcmp(tmp->name, name)) {
- if (value == NULL) { /* clear it? */
- tag->next = tmp->next;
- g_free(tmp->value);
- g_free(tmp);
- } else if (strcmp(tmp->value, value)) { /* has it changed? */
- g_free(tmp->value);
- tmp->value = g_strdup(value);
- }
- return;
- }
- tag = tmp;
- }
-
- if (value) {
- tmp = g_malloc(sizeof(*tmp)+strlen(name));
- strcpy(tmp->name, name);
- tmp->value = g_strdup(value);
- tmp->next = 0;
- tag->next = tmp;
- }
-}
-
-int camel_tag_list_size(CamelTag **list)
-{
- int count=0;
- CamelTag *tag;
-
- tag = *list;
- while (tag) {
- count++;
- tag = tag->next;
- }
- return count;
-}
-
-void camel_tag_list_free(CamelTag **list)
-{
- CamelTag *tag, *tmp;
- tag = *list;
- while (tag) {
- tmp = tag->next;
- g_free(tag->value);
- g_free(tag);
- tag = tmp;
- }
- *list = NULL;
-}
-
-/**
- * camel_message_info_dup_to:
- * @from: source message info
- * @to: destination message info
- *
- * Duplicates the contents of one CamelMessageInfo structure into another.
- * (The destination is assumed to be empty: its contents are not freed.)
- * The slightly odd interface is to allow this to be used to initialize
- * "subclasses" of CamelMessageInfo.
- **/
-void
-camel_message_info_dup_to(const CamelMessageInfo *from, CamelMessageInfo *to)
-{
- CamelFlag *flag;
- CamelTag *tag;
-
- /* Copy numbers */
- to->flags = from->flags;
- to->size = from->size;
- to->date_sent = from->date_sent;
- to->date_received = from->date_received;
-
- /* Copy strings */
- to->subject = g_strdup(from->subject);
- to->from = g_strdup(from->from);
- to->to = g_strdup(from->to);
- to->cc = g_strdup(from->cc);
- to->uid = g_strdup(from->uid);
- to->message_id = g_strdup(from->message_id);
-
- /* Copy structures */
- to->references = header_references_dup(from->references);
- flag = from->user_flags;
- while (flag) {
- camel_flag_set(&to->user_flags, flag->name, TRUE);
- flag = flag->next;
- }
-
- tag = from->user_tags;
- while (tag) {
- camel_tag_set(&to->user_tags, tag->name, tag->value);
- tag = tag->next;
- }
-
- /* FIXME some day */
- to->content = NULL;
-}
-
-/**
- * camel_message_info_free:
- * @mi: the message info
- *
- * Frees a CamelMessageInfo and its contents.
- **/
-void
-camel_message_info_free(CamelMessageInfo *mi)
-{
- g_free(mi->uid);
- g_free(mi->subject);
- g_free(mi->from);
- g_free(mi->to);
- g_free(mi->cc);
- g_free(mi->message_id);
- header_references_list_clear(&mi->references);
- camel_flag_list_free(&mi->user_flags);
- camel_tag_list_free(&mi->user_tags);
- /* FIXME: content info? */
- g_free(mi);
-}
-
-#if 0
-static void
-content_info_dump(CamelMessageContentInfo *ci, int depth)
-{
- char *p;
-
- p = alloca(depth*4+1);
- memset(p, ' ', depth*4);
- p[depth*4] = 0;
-
- if (ci == NULL) {
- printf("%s<empty>\n", p);
- return;
- }
-
- printf("%sconent-type: %s/%s\n", p, ci->type->type, ci->type->subtype);
- printf("%sontent-transfer-encoding: %s\n", p, ci->encoding);
- printf("%scontent-description: %s\n", p, ci->description);
- printf("%sbytes: %d %d %d\n", p, (int)ci->pos, (int)ci->bodypos, (int)ci->endpos);
- ci = ci->childs;
- while (ci) {
- content_info_dump(ci, depth+1);
- ci = ci->next;
- }
-}
-
-static void
-message_info_dump(CamelMessageInfo *mi)
-{
- if (mi == NULL) {
- printf("No message?\n");
- return;
- }
-
- printf("Subject: %s\n", mi->subject);
- printf("To: %s\n", mi->to);
- printf("Cc: %s\n", mi->cc);
- printf("From: %s\n", mi->from);
- printf("UID: %s\n", mi->uid);
- printf("Flags: %04x\n", mi->flags & 0xffff);
- content_info_dump(mi->content, 0);
-}
-
-int main(int argc, char **argv)
-{
- CamelMimeParser *mp;
- int fd;
- CamelFolderSummary *s;
- char *buffer;
- int len;
- int i;
- ibex *index;
-
- /*g_tk_init(&argc, &argv);*/
-
-#if 0
- {
- int i;
- char *s;
- char buf[1024];
-
- for (i=0;i<434712;i++) {
- memcpy(buf, " ", 50);
- buf[50] = 0;
-#if 0
- s = g_strdup(buf);
- g_free(s);
-#endif
- }
- return 0;
- }
-#endif
-
- if (argc < 2 ) {
- printf("usage: %s mbox\n", argv[0]);
- return 1;
- }
-
- fd = open(argv[1], O_RDONLY);
-
- index = ibex_open("index.ibex", O_CREAT|O_RDWR, 0600);
-
- mp = camel_mime_parser_new();
- camel_mime_parser_scan_from(mp, TRUE);
-/* camel_mime_parser_set_header_regex(mp, "^(content-[^:]*|subject|from|to|date):");*/
- camel_mime_parser_init_with_fd(mp, fd);
-
- s = camel_folder_summary_new();
- camel_folder_summary_set_build_content(s, TRUE);
-/* camel_folder_summary_set_index(s, index);*/
-
- while (camel_mime_parser_step(mp, &buffer, &len) == HSCAN_FROM) {
- /*printf("Parsing message ...\n");*/
- camel_folder_summary_add_from_parser(s, mp);
- if (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_FROM_END) {
- g_warning("Uknown state encountered, excpecting %d, got %d\n", HSCAN_FROM_END, camel_mime_parser_state(mp));
- break;
- }
- }
-
- printf("Printing summary\n");
- for (i=0;i<camel_folder_summary_count(s);i++) {
- message_info_dump(camel_folder_summary_index(s, i));
- }
-
- printf("Saivng summary\n");
- camel_folder_summary_set_filename(s, "index.summary");
- camel_folder_summary_save(s);
-
- {
- CamelFolderSummary *n;
-
- printf("\nLoading summary\n");
- n = camel_folder_summary_new();
- camel_folder_summary_set_build_content(n, TRUE);
- camel_folder_summary_set_filename(n, "index.summary");
- camel_folder_summary_load(n);
-
- printf("Printing summary\n");
- for (i=0;i<camel_folder_summary_count(n);i++) {
- message_info_dump(camel_folder_summary_index(n, i));
- }
- camel_object_unref(n);
- }
-
-
- camel_object_unref(mp);
- camel_object_unref(s);
-
- printf("summarised %d messages\n", camel_folder_summary_count(s));
-#if 0
- printf("g_strdup count = %d\n", strdup_count);
- printf("g_malloc count = %d\n", malloc_count);
- printf("g_free count = %d\n", free_count);
-#endif
- return 0;
-}
-
-#endif
diff --git a/camel/camel-folder-summary.h b/camel/camel-folder-summary.h
deleted file mode 100644
index 22a108192a..0000000000
--- a/camel/camel-folder-summary.h
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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 _CAMEL_FOLDER_SUMMARY_H
-#define _CAMEL_FOLDER_SUMMARY_H
-
-#include <camel/camel-object.h>
-#include <stdio.h>
-#include <time.h>
-#include <camel/camel-mime-parser.h>
-#include <libibex/ibex.h>
-
-#define CAMEL_FOLDER_SUMMARY(obj) CAMEL_CHECK_CAST (obj, camel_folder_summary_get_type (), CamelFolderSummary)
-#define CAMEL_FOLDER_SUMMARY_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_folder_summary_get_type (), CamelFolderSummaryClass)
-#define IS_CAMEL_FOLDER_SUMMARY(obj) CAMEL_CHECK_TYPE (obj, camel_folder_summary_get_type ())
-
-/*typedef struct _CamelFolderSummary CamelFolderSummary;*/
-typedef struct _CamelFolderSummaryClass CamelFolderSummaryClass;
-
-/* these structs from camel-folder-summary.h ... (remove comment after cleanup soon) */
-/* TODO: perhaps they should be full-block objects? */
-/* FIXME: rename this to something more suitable */
-typedef struct {
- gchar *name;
- gint nb_message; /* ick, these should be renamed to something better */
- gint nb_unread_message;
- gint nb_deleted_message;
-} CamelFolderInfo;
-
-/* A tree of message content info structures
- describe the content structure of the message (if it has any) */
-typedef struct _CamelMessageContentInfo {
- struct _CamelMessageContentInfo *next;
-
- struct _CamelMessageContentInfo *childs;
- struct _CamelMessageContentInfo *parent;
-
- struct _header_content_type *type;
- char *id;
- char *description;
- char *encoding;
-
- /* information about where this object lives in the stream.
- if pos is -1 these are all invalid */
- off_t pos;
- off_t bodypos;
- off_t endpos;
-} CamelMessageContentInfo;
-
-/* system flag bits */
-enum _CamelMessageFlags {
- CAMEL_MESSAGE_ANSWERED = 1<<0,
- CAMEL_MESSAGE_DELETED = 1<<1,
- CAMEL_MESSAGE_DRAFT = 1<<2,
- CAMEL_MESSAGE_FLAGGED = 1<<3,
- CAMEL_MESSAGE_SEEN = 1<<4,
- /* following flags are for the folder, and are not really permanent flags */
- CAMEL_MESSAGE_FOLDER_FLAGGED = 1<<16, /* for use by the folder implementation */
- CAMEL_MESSAGE_USER = 1<<31 /* supports user flags */
-};
-
-typedef struct _CamelFlag {
- struct _CamelFlag *next;
- char name[1]; /* name allocated as part of the structure */
-} CamelFlag;
-
-typedef struct _CamelTag {
- struct _CamelTag *next;
- char *value;
- char name[1]; /* name allocated as part of the structure */
-} CamelTag;
-
-/* information about a given object */
-typedef struct {
- /* public fields */
- gchar *subject;
- gchar *from;
- gchar *to;
- gchar *cc;
-
- gchar *uid;
- guint32 flags;
- guint32 size;
-
- time_t date_sent;
- time_t date_received;
-
- /* Message-ID / References structures */
- char *message_id; /* for this message */
- struct _header_references *references; /* from parent to root */
-
- struct _CamelFlag *user_flags;
- struct _CamelTag *user_tags;
-
- /* tree of content description - NULL if it is not available */
- CamelMessageContentInfo *content;
-} CamelMessageInfo;
-
-enum _CamelFolderSummaryFlags {
- CAMEL_SUMMARY_DIRTY = 1<<0,
-};
-
-struct _CamelFolderSummary {
- CamelObject parent;
-
- struct _CamelFolderSummaryPrivate *priv;
-
- /* header info */
- guint32 version; /* version of file required, should be set by implementors */
- guint32 flags; /* flags */
- guint32 nextuid; /* next uid? */
- guint32 saved_count; /* how many were saved/loaded */
- time_t time; /* timestamp for this summary (for implementors to use) */
-
- /* sizes of memory objects */
- guint32 message_info_size;
- guint32 content_info_size;
-
- char *summary_path;
- gboolean build_content; /* do we try and parse/index the content, or not? */
-
- GPtrArray *messages; /* CamelMessageInfo's */
- GHashTable *messages_uid; /* CamelMessageInfo's by uid */
-};
-
-struct _CamelFolderSummaryClass {
- CamelObjectClass parent_class;
-
- /* load/save the global info */
- int (*summary_header_load)(CamelFolderSummary *, FILE *);
- int (*summary_header_save)(CamelFolderSummary *, FILE *);
-
- /* create/save/load an individual message info */
- CamelMessageInfo * (*message_info_new)(CamelFolderSummary *, struct _header_raw *);
- CamelMessageInfo * (*message_info_new_from_parser)(CamelFolderSummary *, CamelMimeParser *);
- CamelMessageInfo * (*message_info_load)(CamelFolderSummary *, FILE *);
- int (*message_info_save)(CamelFolderSummary *, FILE *, CamelMessageInfo *);
- void (*message_info_free)(CamelFolderSummary *, CamelMessageInfo *);
-
- /* save/load individual content info's */
- CamelMessageContentInfo * (*content_info_new)(CamelFolderSummary *, struct _header_raw *);
- CamelMessageContentInfo * (*content_info_new_from_parser)(CamelFolderSummary *, CamelMimeParser *);
- CamelMessageContentInfo * (*content_info_load)(CamelFolderSummary *, FILE *);
- int (*content_info_save)(CamelFolderSummary *, FILE *, CamelMessageContentInfo *);
- void (*content_info_free)(CamelFolderSummary *, CamelMessageContentInfo *);
-};
-
-guint camel_folder_summary_get_type (void);
-CamelFolderSummary *camel_folder_summary_new (void);
-
-void camel_folder_summary_set_filename(CamelFolderSummary *, const char *);
-void camel_folder_summary_set_index(CamelFolderSummary *, ibex *);
-void camel_folder_summary_set_build_content(CamelFolderSummary *, gboolean state);
-
-guint32 camel_folder_summary_next_uid (CamelFolderSummary *s);
-char *camel_folder_summary_next_uid_string (CamelFolderSummary *s);
-
-/* load/save the summary in its entirety */
-int camel_folder_summary_load(CamelFolderSummary *);
-int camel_folder_summary_save(CamelFolderSummary *);
-
-/* set the dirty bit on the summary */
-void camel_folder_summary_touch(CamelFolderSummary *s);
-
-/* add a new raw summary item */
-void camel_folder_summary_add(CamelFolderSummary *, CamelMessageInfo *info);
-
-/* build/add raw summary items */
-CamelMessageInfo *camel_folder_summary_add_from_header(CamelFolderSummary *, struct _header_raw *);
-CamelMessageInfo *camel_folder_summary_add_from_parser(CamelFolderSummary *, CamelMimeParser *);
-
-/* removes a summary item, doesn't fix content offsets */
-void camel_folder_summary_remove(CamelFolderSummary *s, CamelMessageInfo *info);
-void camel_folder_summary_remove_uid(CamelFolderSummary *s, const char *uid);
-/* remove all items */
-void camel_folder_summary_clear(CamelFolderSummary *s);
-
-/* lookup functions */
-int camel_folder_summary_count(CamelFolderSummary *);
-CamelMessageInfo *camel_folder_summary_index(CamelFolderSummary *, int);
-CamelMessageInfo *camel_folder_summary_uid(CamelFolderSummary *, const char *uid);
-
-/* shift content ... */
-void camel_folder_summary_offset_content(CamelMessageContentInfo *content, off_t offset);
-
-/* summary formatting utils */
-char *camel_summary_format_address (struct _header_raw *h, const char *name);
-char *camel_summary_format_string (struct _header_raw *h, const char *name);
-
-/* summary file loading/saving helper functions */
-int camel_folder_summary_encode_fixed_int32(FILE *, gint32);
-int camel_folder_summary_decode_fixed_int32(FILE *, gint32 *);
-
-int camel_folder_summary_encode_uint32(FILE *, guint32);
-int camel_folder_summary_decode_uint32(FILE *, guint32 *);
-
-int camel_folder_summary_encode_string(FILE *, char *);
-int camel_folder_summary_decode_string(FILE *, char **);
-
-/* basically like strings, but certain keywords can be compressed and de-cased */
-int camel_folder_summary_encode_token(FILE *, char *);
-int camel_folder_summary_decode_token(FILE *, char **);
-
-/* message flag operations */
-gboolean camel_flag_get(CamelFlag **list, const char *name);
-void camel_flag_set(CamelFlag **list, const char *name, gboolean state);
-int camel_flag_list_size(CamelFlag **list);
-void camel_flag_list_free(CamelFlag **list);
-
-/* message tag operations */
-const char *camel_tag_get(CamelTag **list, const char *name);
-void camel_tag_set(CamelTag **list, const char *name, const char *value);
-int camel_tag_list_size(CamelTag **list);
-void camel_tag_list_free(CamelTag **list);
-
-/* message info utils */
-void camel_message_info_dup_to(const CamelMessageInfo *from, CamelMessageInfo *to);
-void camel_message_info_free(CamelMessageInfo *mi);
-
-#endif /* ! _CAMEL_FOLDER_SUMMARY_H */
diff --git a/camel/camel-folder.c b/camel/camel-folder.c
deleted file mode 100644
index 201e2cc778..0000000000
--- a/camel/camel-folder.c
+++ /dev/null
@@ -1,1268 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-folder.c: Abstract class for an email folder */
-
-/*
- * Author:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include <string.h>
-#include "camel-folder.h"
-#include "camel-exception.h"
-#include "camel-store.h"
-#include "camel-mime-message.h"
-#include "string-utils.h"
-
-static CamelObjectClass *parent_class = NULL;
-
-/* Returns the class for a CamelFolder */
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-
-static void init (CamelFolder *folder, CamelStore *parent_store,
- CamelFolder *parent_folder, const gchar *name,
- gchar *separator, gboolean path_begins_with_sep,
- CamelException *ex);
-
-static void camel_folder_finalize (CamelObject *object);
-
-
-static void folder_sync (CamelFolder *folder, gboolean expunge,
- CamelException *ex);
-
-static const gchar *get_name (CamelFolder *folder);
-static const gchar *get_full_name (CamelFolder *folder);
-
-
-static gboolean can_hold_folders (CamelFolder *folder);
-static gboolean can_hold_messages (CamelFolder *folder);
-static guint32 get_permanent_flags (CamelFolder *folder);
-static guint32 get_message_flags (CamelFolder *folder, const char *uid);
-static void set_message_flags (CamelFolder *folder, const char *uid,
- guint32 flags, guint32 set);
-static gboolean get_message_user_flag (CamelFolder *folder, const char *uid, const char *name);
-static void set_message_user_flag (CamelFolder *folder, const char *uid,
- const char *name, gboolean value);
-static const char *get_message_user_tag(CamelFolder *folder, const char *uid, const char *name);
-static void set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value);
-
-static GPtrArray *get_subfolder_names (CamelFolder *folder);
-static void free_subfolder_names (CamelFolder *folder,
- GPtrArray *array);
-static CamelFolder *get_subfolder (CamelFolder *folder,
- const gchar *folder_name,
- gboolean create,
- CamelException *ex);
-static CamelFolder *get_parent_folder (CamelFolder *folder);
-static CamelStore *get_parent_store (CamelFolder *folder);
-
-static gint get_message_count (CamelFolder *folder);
-static gint get_unread_message_count (CamelFolder *folder);
-
-static void expunge (CamelFolder *folder,
- CamelException *ex);
-
-
-static void append_message (CamelFolder *folder, CamelMimeMessage *message,
- const CamelMessageInfo *info, CamelException *ex);
-
-
-static GPtrArray *get_uids (CamelFolder *folder);
-static void free_uids (CamelFolder *folder,
- GPtrArray *array);
-static GPtrArray *get_summary (CamelFolder *folder);
-static void free_summary (CamelFolder *folder,
- GPtrArray *array);
-
-static CamelMimeMessage *get_message (CamelFolder *folder,
- const gchar *uid,
- CamelException *ex);
-
-static const CamelMessageInfo *get_message_info (CamelFolder *folder,
- const char *uid);
-
-static GPtrArray *search_by_expression (CamelFolder *folder,
- const char *exp,
- CamelException *ex);
-static void search_free (CamelFolder * folder,
- GPtrArray * result);
-
-static void copy_message_to (CamelFolder *source,
- const char *uid,
- CamelFolder *dest,
- CamelException *ex);
-
-static void move_message_to (CamelFolder *source,
- const char *uid,
- CamelFolder *dest,
- CamelException *ex);
-
-static void freeze (CamelFolder *folder);
-static void thaw (CamelFolder *folder);
-
-static gboolean folder_changed (CamelObject *object,
- /*int type*/gpointer event_data);
-static gboolean message_changed (CamelObject *object,
- /*const char *uid*/gpointer event_data);
-
-static void
-camel_folder_class_init (CamelFolderClass *camel_folder_class)
-{
- CamelObjectClass *camel_object_class =
- CAMEL_OBJECT_CLASS (camel_folder_class);
-
- parent_class = camel_type_get_global_classfuncs (camel_object_get_type ());
-
- /* virtual method definition */
- camel_folder_class->init = init;
- camel_folder_class->sync = folder_sync;
- camel_folder_class->get_name = get_name;
- camel_folder_class->get_full_name = get_full_name;
- camel_folder_class->can_hold_folders = can_hold_folders;
- camel_folder_class->can_hold_messages = can_hold_messages;
- camel_folder_class->get_subfolder = get_subfolder;
- camel_folder_class->get_parent_folder = get_parent_folder;
- camel_folder_class->get_parent_store = get_parent_store;
- camel_folder_class->get_subfolder_names = get_subfolder_names;
- camel_folder_class->free_subfolder_names = free_subfolder_names;
- camel_folder_class->expunge = expunge;
- camel_folder_class->get_message_count = get_message_count;
- camel_folder_class->get_unread_message_count = get_unread_message_count;
- camel_folder_class->append_message = append_message;
- camel_folder_class->get_permanent_flags = get_permanent_flags;
- camel_folder_class->get_message_flags = get_message_flags;
- camel_folder_class->set_message_flags = set_message_flags;
- camel_folder_class->get_message_user_flag = get_message_user_flag;
- camel_folder_class->set_message_user_flag = set_message_user_flag;
- camel_folder_class->get_message_user_tag = get_message_user_tag;
- camel_folder_class->set_message_user_tag = set_message_user_tag;
- camel_folder_class->get_message = get_message;
- camel_folder_class->get_uids = get_uids;
- camel_folder_class->free_uids = free_uids;
- camel_folder_class->get_summary = get_summary;
- camel_folder_class->free_summary = free_summary;
- camel_folder_class->search_by_expression = search_by_expression;
- camel_folder_class->search_free = search_free;
- camel_folder_class->get_message_info = get_message_info;
- camel_folder_class->copy_message_to = copy_message_to;
- camel_folder_class->move_message_to = move_message_to;
- camel_folder_class->freeze = freeze;
- camel_folder_class->thaw = thaw;
-
- /* virtual method overload */
- camel_object_class_declare_event (camel_object_class, "folder_changed", folder_changed);
- camel_object_class_declare_event (camel_object_class, "message_changed", message_changed);
-
- /*
- signals[FOLDER_CHANGED] =
- gt_k_signal_new ("folder_changed",
- GT_K_RUN_FIRST,
- camel_object_class->type,
- GT_K_SIGNAL_OFFSET (CamelFolderClass,
- folder_changed),
- gt_k_marshal_NONE__INT,
- GT_K_TYPE_NONE, 1, GT_K_TYPE_INT);
-
- signals[MESSAGE_CHANGED] =
- gt_k_signal_new ("message_changed",
- GT_K_RUN_FIRST,
- camel_object_class->type,
- GT_K_SIGNAL_OFFSET (CamelFolderClass,
- message_changed),
- gt_k_marshal_NONE__STRING,
- GT_K_TYPE_NONE, 1, GT_K_TYPE_STRING);
-
- camel_object_class_add_signals (camel_object_class, signals, LAST_SIGNAL);
- */
-}
-
-static void
-camel_folder_finalize (CamelObject *object)
-{
- CamelFolder *camel_folder = CAMEL_FOLDER (object);
- GList *m;
-
- g_free (camel_folder->name);
- g_free (camel_folder->full_name);
-
- if (camel_folder->parent_store)
- camel_object_unref (CAMEL_OBJECT (camel_folder->parent_store));
- if (camel_folder->parent_folder)
- camel_object_unref (CAMEL_OBJECT (camel_folder->parent_folder));
-
- for (m = camel_folder->messages_changed; m; m = m->next)
- g_free (m->data);
- g_list_free (camel_folder->messages_changed);
-}
-
-CamelType
-camel_folder_get_type (void)
-{
- static CamelType camel_folder_type = CAMEL_INVALID_TYPE;
-
- if (camel_folder_type == CAMEL_INVALID_TYPE) {
- camel_folder_type = camel_type_register (CAMEL_OBJECT_TYPE, "CamelFolder",
- sizeof (CamelFolder),
- sizeof (CamelFolderClass),
- (CamelObjectClassInitFunc) camel_folder_class_init,
- NULL,
- NULL,
- (CamelObjectFinalizeFunc) camel_folder_finalize );
- }
-
- return camel_folder_type;
-}
-
-
-/**
- * init: init the folder
- * @folder: folder object to initialize
- * @parent_store: parent store object of the folder
- * @parent_folder: parent folder of the folder (may be NULL)
- * @name: (short) name of the folder
- * @separator: separator between the parent folder name and this name
- * @ex: a CamelException
- *
- * Initalizes the folder by setting the parent store, parent folder,
- * and name.
- **/
-static void
-init (CamelFolder *folder, CamelStore *parent_store,
- CamelFolder *parent_folder, const gchar *name,
- gchar *separator, gboolean path_begins_with_sep,
- CamelException *ex)
-{
- gchar *full_name;
- const gchar *parent_full_name;
-
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
- g_return_if_fail (CAMEL_IS_STORE (parent_store));
- g_return_if_fail (parent_folder == NULL || CAMEL_IS_FOLDER (parent_folder));
- g_return_if_fail (folder->parent_store == NULL);
-
- folder->parent_store = parent_store;
- camel_object_ref (CAMEL_OBJECT (parent_store));
-
- folder->parent_folder = parent_folder;
- if (parent_folder)
- camel_object_ref (CAMEL_OBJECT (parent_folder));
-
- folder->separator = separator;
- folder->path_begins_with_sep = path_begins_with_sep;
-
- /* if the folder already has a name, free it */
- g_free (folder->name);
- g_free (folder->full_name);
-
- /* set those fields to NULL now, so that if an
- exception occurs, they will be set anyway */
- folder->name = NULL;
- folder->full_name = NULL;
-
- if (folder->parent_folder) {
- parent_full_name = camel_folder_get_full_name(folder->parent_folder);
-
- full_name = g_strdup_printf("%s%s%s", parent_full_name, folder->separator, name);
- } else {
- if (path_begins_with_sep)
- full_name = g_strdup_printf("%s%s", folder->separator, name);
- else
- full_name = g_strdup(name);
- }
-
- folder->name = g_strdup(name);
- folder->full_name = full_name;
-
- folder->frozen = 0;
- folder->folder_changed = FALSE;
- folder->messages_changed = NULL;
-}
-
-
-static void
-folder_sync (CamelFolder *folder, gboolean expunge, CamelException *ex)
-{
- g_warning ("CamelFolder::sync not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
-}
-
-/**
- * camel_folder_sync:
- * @folder: The folder object
- * @expunge: whether or not to expunge deleted messages
- * @ex: exception object
- *
- * Sync changes made to a folder to its backing store, possibly expunging
- * deleted messages as well.
- **/
-void camel_folder_sync(CamelFolder * folder, gboolean expunge, CamelException * ex)
-{
- g_return_if_fail(CAMEL_IS_FOLDER(folder));
-
- CF_CLASS(folder)->sync(folder, expunge, ex);
-}
-
-static const gchar *get_name(CamelFolder * folder)
-{
- return folder->name;
-}
-
-/**
- * camel_folder_get_name:
- * @folder: a folder
- *
- * Get the (short) name of the folder. The fully qualified name
- * can be obtained with the get_full_name method.
- *
- * Return value: name of the folder
- **/
-const gchar *camel_folder_get_name(CamelFolder * folder)
-{
- g_return_val_if_fail(CAMEL_IS_FOLDER(folder), NULL);
-
- return CF_CLASS(folder)->get_name(folder);
-}
-
-static const gchar *get_full_name(CamelFolder * folder)
-{
- return folder->full_name;
-}
-
-/**
- * camel_folder_get_full_name:
- * @folder: a folder
- *
- * Get the (full) name of the folder.
- *
- * Return value: full name of the folder
- **/
-const gchar *camel_folder_get_full_name(CamelFolder * folder)
-{
- g_return_val_if_fail(CAMEL_IS_FOLDER(folder), NULL);
-
- return CF_CLASS(folder)->get_full_name(folder);
-}
-
-static gboolean can_hold_folders(CamelFolder * folder)
-{
- return folder->can_hold_folders;
-}
-
-static gboolean can_hold_messages(CamelFolder * folder)
-{
- return folder->can_hold_messages;
-}
-
-static CamelFolder *get_subfolder(CamelFolder * folder, const gchar * folder_name, gboolean create, CamelException * ex)
-{
- CamelFolder *new_folder;
- gchar *full_name;
- const gchar *current_folder_full_name;
-
- g_return_val_if_fail(CAMEL_IS_STORE(folder->parent_store), NULL);
-
- current_folder_full_name = camel_folder_get_full_name(folder);
-
- full_name = g_strdup_printf("%s%s%s", current_folder_full_name, folder->separator, folder_name);
- new_folder = camel_store_get_folder(folder->parent_store, full_name, create, ex);
- g_free(full_name);
-
- return new_folder;
-}
-
-/**
- * camel_folder_get_subfolder:
- * @folder: a folder
- * @folder_name: subfolder path
- * @create: whether or not to create the folder if it doesn't exist
- * @ex: a CamelException
- *
- * This method returns a folder object. This folder is a subfolder of
- * the given folder. It is an error to ask for a folder whose name begins
- * with the folder separator character.
- *
- * Return value: the requested folder, or %NULL if the subfolder object
- * could not be obtained
- **/
-CamelFolder *camel_folder_get_subfolder(CamelFolder * folder, const gchar * folder_name,
- gboolean create, CamelException * ex)
-{
- g_return_val_if_fail(CAMEL_IS_FOLDER(folder), NULL);
- g_return_val_if_fail(folder_name != NULL, NULL);
-
- return CF_CLASS(folder)->get_subfolder(folder, folder_name, create, ex);
-}
-
-static CamelFolder *get_parent_folder(CamelFolder * folder)
-{
- return folder->parent_folder;
-}
-
-/**
- * camel_folder_get_parent_folder:
- * @folder: folder to get the parent of
- *
- * Return value: the folder's parent
- **/
-CamelFolder *camel_folder_get_parent_folder(CamelFolder * folder)
-{
- g_return_val_if_fail(CAMEL_IS_FOLDER(folder), NULL);
-
- return CF_CLASS(folder)->get_parent_folder(folder);
-}
-
-static CamelStore *get_parent_store(CamelFolder * folder)
-{
- return folder->parent_store;
-}
-
-/**
- * camel_folder_get_parent_store:
- * @folder: folder to get the parent of
- *
- * Return value: the parent store of the folder.
- **/
-CamelStore *
-camel_folder_get_parent_store (CamelFolder *folder)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
-
- return CF_CLASS (folder)->get_parent_store (folder);
-}
-
-
-static GPtrArray *
-get_subfolder_names (CamelFolder *folder)
-{
- g_warning ("CamelFolder::get_subfolder_names not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return NULL;
-}
-
-/**
- * camel_folder_get_subfolder_names:
- * @folder: the folder
- *
- * Return value: an array containing the names of the folder's
- * subfolders. The array should not be modified and must be freed with
- * camel_folder_free_subfolder_names().
- **/
-GPtrArray *
-camel_folder_get_subfolder_names (CamelFolder *folder)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
-
- return CF_CLASS (folder)->get_subfolder_names (folder);
-}
-
-
-static void
-free_subfolder_names (CamelFolder *folder, GPtrArray *array)
-{
- g_warning ("CamelFolder::free_subfolder_names not implemented "
- "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
-}
-
-/**
- * camel_folder_free_subfolder_names:
- * @folder: folder object
- * @array: the array of subfolder names to free
- *
- * Frees the array of names returned by camel_folder_get_subfolder_names().
- **/
-void
-camel_folder_free_subfolder_names (CamelFolder *folder, GPtrArray *array)
-{
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
-
- CF_CLASS (folder)->free_subfolder_names (folder, array);
-}
-
-
-static void
-expunge (CamelFolder *folder, CamelException *ex)
-{
- g_warning ("CamelFolder::expunge not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
-}
-
-
-/**
- * camel_folder_expunge:
- * @folder: the folder
- * @ex: a CamelException
- *
- * Delete messages which have been marked as "DELETED"
- **/
-void
-camel_folder_expunge (CamelFolder *folder, CamelException *ex)
-{
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
-
- CF_CLASS (folder)->expunge (folder, ex);
-}
-
-
-static gint
-get_message_count (CamelFolder *folder)
-{
- g_warning ("CamelFolder::get_message_count not implemented "
- "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return -1;
-}
-
-/**
- * camel_folder_get_message_count:
- * @folder: A CamelFolder object
- *
- * Return value: the number of messages in the folder, or -1 if unknown.
- **/
-gint
-camel_folder_get_message_count (CamelFolder *folder)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1);
-
- return CF_CLASS (folder)->get_message_count (folder);
-}
-
-static gint
-get_unread_message_count (CamelFolder *folder)
-{
- g_warning ("CamelFolder::get_unread_message_count not implemented "
- "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return -1;
-}
-
-/**
- * camel_folder_unread_get_message_count:
- * @folder: A CamelFolder object
- *
- * Return value: the number of unread messages in the folder, or -1 if unknown.
- **/
-gint
-camel_folder_get_unread_message_count (CamelFolder *folder)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1);
-
- return CF_CLASS (folder)->get_unread_message_count (folder);
-}
-
-
-static void
-append_message (CamelFolder *folder, CamelMimeMessage *message,
- const CamelMessageInfo *info, CamelException *ex)
-{
- g_warning ("CamelFolder::append_message not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return;
-
-}
-
-/**
- * camel_folder_append_message: add a message to a folder
- * @folder: folder object to add the message to
- * @message: message object
- * @info: optional message info with additional flags/etc to set on new message.
- * @ex: exception object
- *
- * Add a message to a folder.
- **/
-void camel_folder_append_message(CamelFolder * folder, CamelMimeMessage * message, const CamelMessageInfo *info, CamelException * ex)
-{
- g_return_if_fail(CAMEL_IS_FOLDER(folder));
-
- CF_CLASS(folder)->append_message(folder, message, info, ex);
-}
-
-static guint32 get_permanent_flags(CamelFolder * folder)
-{
- return folder->permanent_flags;
-}
-
-/**
- * camel_folder_get_permanent_flags:
- * @folder: a CamelFolder
- *
- * Return value: the set of CamelMessageFlags that can be permanently
- * stored on a message between sessions. If it includes %CAMEL_FLAG_USER,
- * then user-defined flags will be remembered.
- **/
-guint32
-camel_folder_get_permanent_flags (CamelFolder *folder)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), 0);
-
- return CF_CLASS (folder)->get_permanent_flags (folder);
-}
-
-
-static guint32
-get_message_flags (CamelFolder *folder, const char *uid)
-{
- g_warning ("CamelFolder::get_message_flags not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return 0;
-}
-
-/**
- * camel_folder_get_message_flags:
- * @folder: a CamelFolder
- * @uid: the UID of a message in @folder
- *
- * Return value: the CamelMessageFlags that are set on the indicated
- * message.
- **/
-guint32
-camel_folder_get_message_flags (CamelFolder *folder, const char *uid)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), 0);
-
- return CF_CLASS (folder)->get_message_flags (folder, uid);
-}
-
-
-static void
-set_message_flags (CamelFolder *folder, const char *uid,
- guint32 flags, guint32 set)
-{
- g_warning ("CamelFolder::set_message_flags not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
-}
-
-/**
- * camel_folder_set_message_flags:
- * @folder: a CamelFolder
- * @uid: the UID of a message in @folder
- * @flags: a set of CamelMessageFlag values to set
- * @set: the mask of values in @flags to use.
- *
- * Sets those flags specified by @set to the values specified by @flags
- * on the indicated message. (This may or may not persist after the
- * folder or store is closed. See camel_folder_get_permanent_flags().)
- **/
-void
-camel_folder_set_message_flags (CamelFolder *folder, const char *uid,
- guint32 flags, guint32 set)
-{
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
-
- CF_CLASS (folder)->set_message_flags (folder, uid, flags, set);
-}
-
-
-static gboolean
-get_message_user_flag (CamelFolder *folder, const char *uid,
- const char *name)
-{
- g_warning ("CamelFolder::get_message_user_flag not implemented "
- "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return FALSE;
-}
-
-/**
- * camel_folder_get_message_user_flag:
- * @folder: a CamelFolder
- * @uid: the UID of a message in @folder
- * @name: the name of a user flag
- *
- * Return value: whether or not the given user flag is set on the message.
- **/
-gboolean
-camel_folder_get_message_user_flag (CamelFolder *folder, const char *uid,
- const char *name)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), 0);
-
- return CF_CLASS (folder)->get_message_user_flag (folder, uid, name);
-}
-
-
-static void
-set_message_user_flag (CamelFolder *folder, const char *uid,
- const char *name, gboolean value)
-{
- g_warning ("CamelFolder::set_message_user_flag not implemented "
- "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
-}
-
-/**
- * camel_folder_set_message_user_flag:
- * @folder: a CamelFolder
- * @uid: the UID of a message in @folder
- * @name: the name of the user flag to set
- * @value: the value to set it to
- *
- * Sets the user flag specified by @name to the value specified by @value
- * on the indicated message. (This may or may not persist after the
- * folder or store is closed. See camel_folder_get_permanent_flags().)
- **/
-void
-camel_folder_set_message_user_flag (CamelFolder *folder, const char *uid,
- const char *name, gboolean value)
-{
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
-
- CF_CLASS (folder)->set_message_user_flag (folder, uid, name, value);
-}
-
-static const char *get_message_user_tag(CamelFolder *folder, const char *uid, const char *name)
-{
- g_warning ("CamelFolder::get_message_user_tag not implemented "
- "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return NULL;
-}
-
-/**
- * camel_folder_get_message_user_tag:
- * @folder: a CamelFolder
- * @uid: the UID of a message in @folder
- * @name: the name of a user tag
- *
- * Return value: Returns the value of the user tag.
- **/
-const char *
-camel_folder_get_message_user_tag (CamelFolder *folder, const char *uid, const char *name)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), 0);
-
- return CF_CLASS (folder)->get_message_user_tag (folder, uid, name);
-}
-
-
-static void
-set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value)
-{
- g_warning ("CamelFolder::set_message_user_tag not implemented "
- "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
-}
-
-/**
- * camel_folder_set_message_user_tag:
- * @folder: a CamelFolder
- * @uid: the UID of a message in @folder
- * @name: the name of the user tag to set
- * @value: the value to set it to
- *
- * Sets the user tag specified by @name to the value specified by @value
- * on the indicated message. (This may or may not persist after the
- * folder or store is closed. See camel_folder_get_permanent_flags().)
- **/
-void
-camel_folder_set_message_user_tag (CamelFolder *folder, const char *uid, const char *name, const char *value)
-{
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
-
- CF_CLASS (folder)->set_message_user_tag (folder, uid, name, value);
-}
-
-
-static const CamelMessageInfo *
-get_message_info (CamelFolder *folder, const char *uid)
-{
- g_warning ("CamelFolder::get_message_info not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return NULL;
-}
-
-/**
- * camel_folder_get_message_info:
- * @folder: a CamelFolder
- * @uid: the uid of a message
- *
- * Return value: the summary information for the indicated message
- **/
-const CamelMessageInfo *
-camel_folder_get_message_info (CamelFolder *folder, const char *uid)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
- g_return_val_if_fail (uid != NULL, NULL);
-
- return CF_CLASS (folder)->get_message_info (folder, uid);
-}
-
-
-/* TODO: is this function required anyway? */
-gboolean
-camel_folder_has_summary_capability (CamelFolder *folder)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE);
-
- return folder->has_summary_capability;
-}
-
-
-/* UIDs stuff */
-
-static CamelMimeMessage *
-get_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
-{
- g_warning ("CamelFolder::get_message not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return NULL;
-}
-
-/**
- * camel_folder_get_message:
- * @folder: the folder object
- * @uid: the UID
- * @ex: a CamelException
- *
- * Get a message from its UID in the folder. Messages are cached
- * within a folder, that is, asking twice for the same UID returns the
- * same message object. (FIXME: is this true?)
- *
- * Return value: Message corresponding to the UID
- **/
-CamelMimeMessage *
-camel_folder_get_message (CamelFolder *folder, const gchar *uid,
- CamelException *ex)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
-
- return CF_CLASS (folder)->get_message (folder, uid, ex);
-}
-
-
-static GPtrArray *
-get_uids (CamelFolder *folder)
-{
- g_warning ("CamelFolder::get_uids not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return NULL;
-}
-
-/**
- * camel_folder_get_uids:
- * @folder: folder object
- *
- * Get the list of UIDs available in a folder. This routine is useful
- * for finding what messages are available when the folder does not
- * support summaries. The returned array shoudl not be modified, and
- * must be freed by passing it to camel_folder_free_uids().
- *
- * Return value: GPtrArray of UIDs corresponding to the messages
- * available in the folder.
- **/
-GPtrArray *
-camel_folder_get_uids (CamelFolder *folder)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
-
- return CF_CLASS (folder)->get_uids (folder);
-}
-
-
-static void
-free_uids (CamelFolder *folder, GPtrArray *array)
-{
- g_warning ("CamelFolder::free_uids not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
-}
-
-/**
- * camel_folder_free_uids:
- * @folder: folder object
- * @array: the array of uids to free
- *
- * Frees the array of UIDs returned by camel_folder_get_uids().
- **/
-void
-camel_folder_free_uids (CamelFolder *folder, GPtrArray *array)
-{
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
-
- CF_CLASS (folder)->free_uids (folder, array);
-}
-
-
-static GPtrArray *
-get_summary (CamelFolder *folder)
-{
- g_warning ("CamelFolder::get_summary not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return NULL;
-}
-
-/**
- * camel_folder_get_summary:
- * @folder: a folder object
- *
- * This returns the summary information for the folder. This array
- * should not be modified, and must be freed with
- * camel_folder_free_summary().
- *
- * Return value: an array of CamelMessageInfo
- **/
-GPtrArray *
-camel_folder_get_summary (CamelFolder *folder)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
-
- return CF_CLASS (folder)->get_summary (folder);
-}
-
-
-static void
-free_summary (CamelFolder *folder, GPtrArray *array)
-{
- g_warning ("CamelFolder::free_summary not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
-}
-
-/**
- * camel_folder_free_summary:
- * @folder: folder object
- * @array: the summary array to free
- *
- * Frees the summary array returned by camel_folder_get_summary().
- **/
-void camel_folder_free_summary(CamelFolder * folder, GPtrArray * array)
-{
- g_return_if_fail(CAMEL_IS_FOLDER(folder));
-
- CF_CLASS(folder)->free_summary(folder, array);
-}
-
-/**
- * camel_folder_has_search_capability:
- * @folder: Folder object
- *
- * Checks if a folder supports searching.
- *
- * Return value: %TRUE if the folder supports searching
- **/
-gboolean
-camel_folder_has_search_capability (CamelFolder *folder)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE);
-
- return folder->has_search_capability;
-}
-
-static GPtrArray *
-search_by_expression (CamelFolder *folder, const char *expression,
- CamelException *ex)
-{
- g_warning ("CamelFolder::search_by_expression not implemented for "
- "`%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder)));
- return NULL;
-}
-
-/**
- * camel_folder_search_by_expression:
- * @folder: Folder object
- * @expression: a search expression
- * @ex: a CamelException
- *
- * Searches the folder for messages matching the given search expression.
- *
- * Return value: a list of uids of matching messages. The caller must
- * free the list and each of the elements when it is done.
- **/
-GPtrArray *
-camel_folder_search_by_expression (CamelFolder *folder, const char *expression,
- CamelException *ex)
-{
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
- g_return_val_if_fail (folder->has_search_capability, NULL);
-
- return CF_CLASS (folder)->search_by_expression (folder, expression, ex);
-}
-
-static void
-search_free(CamelFolder * folder, GPtrArray * result)
-{
- int i;
-
- for (i = 0; i < result->len; i++)
- g_free(g_ptr_array_index(result, i));
- g_ptr_array_free(result, TRUE);
-}
-
-/**
- * camel_folder_search_free:
- * @folder:
- * @result:
- *
- * Free the result of a search.
- **/
-void
-camel_folder_search_free(CamelFolder * folder, GPtrArray * result)
-{
- g_return_if_fail(CAMEL_IS_FOLDER(folder));
- g_return_if_fail(folder->has_search_capability);
-
- return CF_CLASS(folder)->search_free(folder, result);
-}
-
-
-static void
-copy_message_to (CamelFolder *source, const char *uid, CamelFolder *dest,
- CamelException *ex)
-{
- CamelMimeMessage *msg;
- const CamelMessageInfo *info;
-
- /* Default implementation. */
-
- msg = camel_folder_get_message(source, uid, ex);
- if (!msg)
- return;
- info = camel_folder_get_message_info(source, uid);
- camel_folder_append_message(dest, msg, info, ex);
- camel_object_unref(CAMEL_OBJECT (msg));
- if (camel_exception_is_set(ex))
- return;
-}
-
-/**
- * camel_folder_copy_message_to:
- * @source: source folder
- * @uid: UID of message in @source
- * @dest: destination folder
- * @ex: a CamelException
- *
- * This copies a message from one folder to another. If the @source and
- * @dest folders have the same parent_store, this may be more efficient
- * than a camel_folder_append_message().
- **/
-void
-camel_folder_copy_message_to (CamelFolder *source, const char *uid,
- CamelFolder *dest, CamelException *ex)
-{
- g_return_if_fail (CAMEL_IS_FOLDER (source));
- g_return_if_fail (CAMEL_IS_FOLDER (dest));
- g_return_if_fail (uid != NULL);
-
- if (source->parent_store == dest->parent_store) {
- return CF_CLASS (source)->copy_message_to(source, uid,dest, ex);
- } else
- return copy_message_to(source, uid, dest, ex);
-}
-
-
-static void
-move_message_to (CamelFolder *source, const char *uid, CamelFolder *dest, CamelException *ex)
-{
- CamelMimeMessage *msg;
- const CamelMessageInfo *info;
-
- /* Default implementation. */
-
- msg = camel_folder_get_message(source, uid, ex);
- if (!msg)
- return;
- info = camel_folder_get_message_info(source, uid);
- camel_folder_append_message(dest, msg, info, ex);
- camel_object_unref(CAMEL_OBJECT(msg));
- if (camel_exception_is_set(ex))
- return;
- camel_folder_delete_message (source, uid);
-}
-
-/**
- * camel_folder_move_message_to:
- * @source: source folder
- * @uid: UID of message in @source
- * @dest: destination folder
- * @ex: a CamelException
- *
- * This moves a message from one folder to another. If the @source and
- * @dest folders have the same parent_store, this may be more efficient
- * than a camel_folder_append_message() followed by
- * camel_folder_delete_message().
- **/
-void camel_folder_move_message_to(CamelFolder * source, const char *uid, CamelFolder * dest, CamelException * ex)
-{
- g_return_if_fail(CAMEL_IS_FOLDER(source));
- g_return_if_fail(CAMEL_IS_FOLDER(dest));
- g_return_if_fail(uid != NULL);
-
- if (source->parent_store == dest->parent_store) {
- return CF_CLASS(source)->move_message_to(source, uid, dest, ex);
- } else
- return move_message_to(source, uid, dest, ex);
-}
-
-static void freeze(CamelFolder * folder)
-{
- folder->frozen++;
-}
-
-/**
- * camel_folder_freeze:
- * @folder: a folder
- *
- * Freezes the folder so that a series of operation can be performed
- * without "message_changed" and "folder_changed" signals being emitted.
- * When the folder is later thawed with camel_folder_thaw(), the
- * suppressed signals will be emitted.
- **/
-void camel_folder_freeze(CamelFolder * folder)
-{
- g_return_if_fail(CAMEL_IS_FOLDER(folder));
-
- CF_CLASS(folder)->freeze(folder);
-}
-
-static void thaw(CamelFolder * folder)
-{
- GList *messages, *m;
-
- folder->frozen--;
- if (folder->frozen != 0)
- return;
-
- /* Clear messages_changed now in case the signal handler ends
- * up calling freeze and thaw itself.
- */
- messages = folder->messages_changed;
- folder->messages_changed = NULL;
-
- /* If the folder changed, emit that and ignore the individual
- * messages (since the UIDs may no longer be valid).
- */
- if (folder->folder_changed) {
- folder->folder_changed = FALSE;
-
- camel_object_trigger_event (CAMEL_OBJECT (folder), "folder_changed", GINT_TO_POINTER(0));
- } else if (messages) {
- /* FIXME: would be nice to not emit more than once for
- * a given message
- */
- for (m = messages; m; m = m->next) {
- camel_object_trigger_event (CAMEL_OBJECT (folder), "message_changed", m->data);
- g_free (m->data);
- }
- g_list_free (messages);
- return;
- }
-
- if (messages) {
- for (m = messages; m; m = m->next)
- g_free (m->data);
- g_list_free (messages);
- }
-}
-
-/**
- * camel_folder_thaw:
- * @folder: a folder
- *
- * Thaws the folder and emits any pending folder_changed or
- * message_changed signals.
- **/
-void
-camel_folder_thaw (CamelFolder *folder)
-{
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
- g_return_if_fail (folder->frozen != 0);
-
- CF_CLASS (folder)->thaw (folder);
-}
-
-
-/* Event hooks that block emission when frozen */
-static gboolean folder_changed (CamelObject *obj, /*int type*/gpointer event_data)
-{
- CamelFolder *folder = CAMEL_FOLDER (obj);
-
- if (folder->frozen) {
- folder->folder_changed = TRUE;
- return FALSE;
- }
-
- return TRUE;
-}
-
-static gboolean message_changed (CamelObject *obj, /*const char *uid*/gpointer event_data)
-{
- CamelFolder *folder = CAMEL_FOLDER (obj);
-
- if (folder->frozen) {
- /*
- * if g_tk_signal_handler_pending (CAMEL_OBJECT (folder),
- * signals[MESSAGE_CHANGED],
- * FALSE)) {
- */
-
- /* Only record the UID if it will be useful later. */
- if (!folder->folder_changed) {
- folder->messages_changed =
- g_list_prepend (folder->messages_changed,
- g_strdup ((gchar *)event_data));
- }
-
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-/**
- * camel_folder_free_nop:
- * @folder: a folder
- * @array: an array of uids, subfolder names, or CamelMessageInfo
- *
- * "Frees" the provided array by doing nothing. Used by CamelFolder
- * subclasses as an implementation for free_uids, free_summary,
- * or free_subfolder_names when the returned array is "static"
- * information and should not be freed.
- **/
-void camel_folder_free_nop(CamelFolder * folder, GPtrArray * array)
-{
- ;
-}
-
-/**
- * camel_folder_free_shallow:
- * @folder: a folder
- * @array: an array of uids, subfolder names, or CamelMessageInfo
- *
- * Frees the provided array but not its contents. Used by CamelFolder
- * subclasses as an implementation for free_uids, free_summary, or
- * free_subfolder_names when the returned array needs to be freed
- * but its contents come from "static" information.
- **/
-void camel_folder_free_shallow(CamelFolder * folder, GPtrArray * array)
-{
- g_ptr_array_free(array, TRUE);
-}
-
-/**
- * camel_folder_free_deep:
- * @folder: a folder
- * @array: an array of uids or subfolder names
- *
- * Frees the provided array and its contents. Used by CamelFolder
- * subclasses as an implementation for free_uids or
- * free_subfolder_names (but NOT free_summary) when the provided
- * information was created explicitly by the corresponding get_ call.
- **/
-void camel_folder_free_deep(CamelFolder * folder, GPtrArray * array)
-{
- int i;
-
- for (i = 0; i < array->len; i++)
- g_free(array->pdata[i]);
- g_ptr_array_free(array, TRUE);
-}
diff --git a/camel/camel-folder.h b/camel/camel-folder.h
deleted file mode 100644
index da76618b57..0000000000
--- a/camel/camel-folder.h
+++ /dev/null
@@ -1,315 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-folder.h: Abstract class for an email folder */
-
-/*
- * Author:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_FOLDER_H
-#define CAMEL_FOLDER_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-object.h>
-#include <camel/camel-folder-summary.h>
-
-#define CAMEL_FOLDER_TYPE (camel_folder_get_type ())
-#define CAMEL_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_FOLDER_TYPE, CamelFolder))
-#define CAMEL_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_FOLDER_TYPE, CamelFolderClass))
-#define CAMEL_IS_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_FOLDER_TYPE))
-
-struct _CamelFolder
-{
- CamelObject parent_object;
-
- int frozen;
- gboolean folder_changed;
- GList *messages_changed;
-
- gchar *name;
- gchar *full_name;
- gchar *separator;
- CamelStore *parent_store;
- CamelFolder *parent_folder;
- guint32 permanent_flags;
-
- gboolean path_begins_with_sep;
-
- gboolean can_hold_folders:1;
- gboolean can_hold_messages:1;
- gboolean has_summary_capability:1;
- gboolean has_search_capability:1;
-};
-
-typedef struct {
- CamelObjectClass parent_class;
-
- /* signals */
- /* Not anymore! bwahahahah!
- * void (*folder_changed) (CamelFolder *, int type);
- * void (*message_changed) (CamelFolder *,
- * const char *uid);
- */
-
- /* Virtual methods */
- void (*init) (CamelFolder *folder, CamelStore *parent_store,
- CamelFolder *parent_folder, const gchar *name,
- gchar *separator, gboolean path_begins_with_sep,
- CamelException *ex);
-
- void (*sync) (CamelFolder *folder, gboolean expunge,
- CamelException *ex);
-
- const gchar * (*get_name) (CamelFolder *folder);
-
- const gchar * (*get_full_name) (CamelFolder *folder);
-
- gboolean (*can_hold_folders) (CamelFolder *folder);
-
- gboolean (*can_hold_messages) (CamelFolder *folder);
-
- CamelFolder * (*get_subfolder) (CamelFolder *folder,
- const gchar *folder_name,
- gboolean create,
- CamelException *ex);
-
- CamelFolder * (*get_parent_folder) (CamelFolder *folder);
-
- CamelStore * (*get_parent_store) (CamelFolder *folder);
-
- void (*expunge) (CamelFolder *folder,
- CamelException *ex);
-
- gint (*get_message_count) (CamelFolder *folder);
-
- gint (*get_unread_message_count) (CamelFolder *folder);
-
- void (*append_message) (CamelFolder *folder,
- CamelMimeMessage *message,
- const CamelMessageInfo *info,
- CamelException *ex);
-
- guint32 (*get_permanent_flags) (CamelFolder *folder);
- guint32 (*get_message_flags) (CamelFolder *folder,
- const char *uid);
- void (*set_message_flags) (CamelFolder *folder,
- const char *uid,
- guint32 flags, guint32 set);
-
- gboolean (*get_message_user_flag) (CamelFolder *folder,
- const char *uid,
- const char *name);
- void (*set_message_user_flag) (CamelFolder *folder,
- const char *uid,
- const char *name,
- gboolean value);
-
- const char * (*get_message_user_tag) (CamelFolder *folder,
- const char *uid,
- const char *name);
- void (*set_message_user_tag) (CamelFolder *folder,
- const char *uid,
- const char *name,
- const char *value);
-
- CamelMimeMessage * (*get_message) (CamelFolder *folder,
- const gchar *uid,
- CamelException *ex);
-
- void (*delete_message) (CamelFolder *folder,
- const gchar *uid,
- CamelException *ex);
-
- GPtrArray * (*get_uids) (CamelFolder *folder);
- void (*free_uids) (CamelFolder *folder,
- GPtrArray *array);
-
- GPtrArray * (*get_summary) (CamelFolder *folder);
- void (*free_summary) (CamelFolder *folder,
- GPtrArray *summary);
-
- GPtrArray * (*get_subfolder_names) (CamelFolder *folder);
- void (*free_subfolder_names) (CamelFolder *folder,
- GPtrArray *subfolders);
-
- gboolean (*has_search_capability) (CamelFolder *folder);
-
- GPtrArray * (*search_by_expression) (CamelFolder *folder,
- const char *expression,
- CamelException *ex);
-
- void (*search_free) (CamelFolder *folder, GPtrArray *result);
-
- const CamelMessageInfo * (*get_message_info) (CamelFolder *, const char *uid);
-
- void (*copy_message_to) (CamelFolder *source,
- const char *uid,
- CamelFolder *destination,
- CamelException *ex);
-
- void (*move_message_to) (CamelFolder *source,
- const char *uid,
- CamelFolder *destination,
- CamelException *ex);
-
- void (*freeze) (CamelFolder *folder);
- void (*thaw) (CamelFolder *folder);
-} CamelFolderClass;
-
-
-
-/* Standard Camel function */
-CamelType camel_folder_get_type (void);
-
-
-/* public methods */
-
-
-
-CamelFolder * camel_folder_get_subfolder (CamelFolder *folder,
- const gchar *folder_name,
- gboolean create,
- CamelException *ex);
-
-void camel_folder_sync (CamelFolder *folder,
- gboolean expunge,
- CamelException *ex);
-
-CamelFolder * camel_folder_get_parent_folder (CamelFolder *folder);
-CamelStore * camel_folder_get_parent_store (CamelFolder *folder);
-
-
-/* delete operations */
-void camel_folder_expunge (CamelFolder *folder,
- CamelException *ex);
-
-
-/* folder name operations */
-const gchar * camel_folder_get_name (CamelFolder *folder);
-const gchar * camel_folder_get_full_name (CamelFolder *folder);
-
-
-/* various properties accessors */
-guint32 camel_folder_get_permanent_flags (CamelFolder *folder);
-
-guint32 camel_folder_get_message_flags (CamelFolder *folder,
- const char *uid);
-
-void camel_folder_set_message_flags (CamelFolder *folder,
- const char *uid,
- guint32 flags,
- guint32 set);
-
-gboolean camel_folder_get_message_user_flag (CamelFolder *folder,
- const char *uid,
- const char *name);
-
-void camel_folder_set_message_user_flag (CamelFolder *folder,
- const char *uid,
- const char *name,
- gboolean value);
-const char * camel_folder_get_message_user_tag (CamelFolder *folder,
- const char *uid,
- const char *name);
-
-void camel_folder_set_message_user_tag (CamelFolder *folder,
- const char *uid,
- const char *name,
- const char *value);
-
-
-
-/* message manipulation */
-void camel_folder_append_message (CamelFolder *folder,
- CamelMimeMessage *message,
- const CamelMessageInfo *info,
- CamelException *ex);
-
-
-/* summary related operations */
-gboolean camel_folder_has_summary_capability (CamelFolder *folder);
-
-
-gint camel_folder_get_message_count (CamelFolder *folder);
-
-gint camel_folder_get_unread_message_count (CamelFolder *folder);
-
-GPtrArray * camel_folder_get_summary (CamelFolder *folder);
-void camel_folder_free_summary (CamelFolder *folder,
- GPtrArray *array);
-
-GPtrArray * camel_folder_get_subfolder_names (CamelFolder *folder);
-void camel_folder_free_subfolder_names (CamelFolder *folder,
- GPtrArray *array);
-
-
-/* uid based access operations */
-CamelMimeMessage * camel_folder_get_message (CamelFolder *folder,
- const gchar *uid,
- CamelException *ex);
-#define camel_folder_delete_message(folder, uid) \
- camel_folder_set_message_flags (folder, uid, CAMEL_MESSAGE_DELETED, CAMEL_MESSAGE_DELETED)
-
-GPtrArray * camel_folder_get_uids (CamelFolder *folder);
-void camel_folder_free_uids (CamelFolder *folder,
- GPtrArray *array);
-
-/* search api */
-gboolean camel_folder_has_search_capability (CamelFolder *folder);
-GPtrArray * camel_folder_search_by_expression (CamelFolder *folder,
- const char *expression,
- CamelException *ex);
-void camel_folder_search_free (CamelFolder *folder, GPtrArray *);
-
-/* summary info */
-const CamelMessageInfo *camel_folder_get_message_info (CamelFolder *summary,
- const char *uid);
-
-void camel_folder_copy_message_to (CamelFolder *source,
- const char *uid,
- CamelFolder *dest,
- CamelException *ex);
-
-void camel_folder_move_message_to (CamelFolder *source,
- const char *uid,
- CamelFolder *dest,
- CamelException *ex);
-
-void camel_folder_freeze (CamelFolder *folder);
-void camel_folder_thaw (CamelFolder *folder);
-
-
-/* For use by subclasses (for free_{uids,summary,subfolder_names}) */
-void camel_folder_free_nop (CamelFolder *folder, GPtrArray *array);
-void camel_folder_free_shallow (CamelFolder *folder, GPtrArray *array);
-void camel_folder_free_deep (CamelFolder *folder, GPtrArray *array);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_FOLDER_H */
-
diff --git a/camel/camel-internet-address.c b/camel/camel-internet-address.c
deleted file mode 100644
index 65b7e1dfaf..0000000000
--- a/camel/camel-internet-address.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "camel-mime-utils.h"
-#include "camel-internet-address.h"
-
-static int internet_decode (CamelAddress *, const char *raw);
-static char * internet_encode (CamelAddress *);
-static void internet_remove (CamelAddress *, int index);
-
-static void camel_internet_address_class_init (CamelInternetAddressClass *klass);
-static void camel_internet_address_init (CamelInternetAddress *obj);
-
-static CamelAddressClass *camel_internet_address_parent;
-
-struct _address {
- char *name;
- char *address;
-};
-
-static void
-camel_internet_address_class_init (CamelInternetAddressClass *klass)
-{
- CamelAddressClass *address = (CamelAddressClass *) klass;
-
- camel_internet_address_parent = CAMEL_ADDRESS_CLASS (camel_type_get_global_classfuncs (camel_address_get_type ()));
-
- address->decode = internet_decode;
- address->encode = internet_encode;
- address->remove = internet_remove;
-}
-
-static void
-camel_internet_address_init (CamelInternetAddress *obj)
-{
-}
-
-CamelType
-camel_internet_address_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_address_get_type (), "CamelInternetAddress",
- sizeof (CamelInternetAddress),
- sizeof (CamelInternetAddressClass),
- (CamelObjectClassInitFunc) camel_internet_address_class_init,
- NULL,
- (CamelObjectInitFunc) camel_internet_address_init,
- NULL);
- }
-
- return type;
-}
-
-static int
-internet_decode (CamelAddress *a, const char *raw)
-{
- struct _header_address *ha, *n;
-
- /* Should probably use its own decoder or something */
- ha = header_address_decode(raw);
- if (ha) {
- n = ha;
- while (n) {
- if (n->type == HEADER_ADDRESS_NAME) {
- camel_internet_address_add((CamelInternetAddress *)a, n->name, n->v.addr);
- } else if (n->type == HEADER_ADDRESS_GROUP) {
- struct _header_address *g = n->v.members;
- while (g) {
- if (g->type == HEADER_ADDRESS_NAME)
- camel_internet_address_add((CamelInternetAddress *)a, g->name, g->v.addr);
- /* otherwise, its an error, infact */
- g = g->next;
- }
- }
- n = n->next;
- }
- header_address_list_clear(&ha);
- }
- return 0;
-}
-
-static char * internet_encode (CamelAddress *a)
-{
- int i;
- GString *out;
- char *ret;
-
- if (a->addresses->len == 0)
- return NULL;
-
- out = g_string_new("");
-
- for (i=0;i<a->addresses->len;i++) {
- struct _address *addr = g_ptr_array_index( a->addresses, i );
- char *name = header_encode_string(addr->name);
-
- if (i!=0)
- g_string_append(out, ", ");
-
- if (name) {
- if (*name)
- g_string_sprintfa(out, "%s <%s>", name, addr->address);
- else if (addr->address)
- g_string_sprintfa (out, "%s", addr->address);
- g_free(name);
- } else
- g_string_sprintfa(out, "%s", addr->address);
- }
- ret = out->str;
- g_string_free(out, FALSE);
- return ret;
-}
-
-static void internet_remove (CamelAddress *a, int index)
-{
- struct _address *addr;
-
- if (index <0 || index >= a->addresses->len)
- return;
-
- addr = g_ptr_array_index( a->addresses, index);
- g_free(addr->name);
- g_free(addr->address);
- g_free(addr);
- g_ptr_array_remove_index( a->addresses, index);
-}
-
-/**
- * camel_internet_address_new:
- *
- * Create a new CamelInternetAddress object.
- *
- * Return value: A new CamelInternetAddress object.
- **/
-CamelInternetAddress *
-camel_internet_address_new (void)
-{
- CamelInternetAddress *new = CAMEL_INTERNET_ADDRESS ( camel_object_new (camel_internet_address_get_type ()));
- return new;
-}
-
-/**
- * camel_internet_address_add:
- * @a:
- * @name:
- * @address:
- *
- * Add a new internet address to the address object.
- *
- * Return value: Index of added entry.
- **/
-int
-camel_internet_address_add (CamelInternetAddress *a, const char *name, const char *address)
-{
- struct _address *new;
- int index;
-
- g_return_val_if_fail(IS_CAMEL_INTERNET_ADDRESS(a), -1);
-
- new = g_malloc(sizeof(*new));
- new->name = g_strdup(name);
- new->address = g_strdup(address);
- index = ((CamelAddress *)a)->addresses->len;
- g_ptr_array_add(((CamelAddress *)a)->addresses, new);
-
- return index;
-}
-
-/**
- * camel_internet_address_get:
- * @a:
- * @index:
- * @namep: Holder for the returned name, or NULL, if not required.
- * @addressp: Holder for the returned address, or NULL, if not required.
- *
- * Get the address at @index.
- *
- * Return value: TRUE if such an address exists, or FALSE otherwise.
- **/
-gboolean
-camel_internet_address_get (const CamelInternetAddress *a, int index, const char **namep, const char **addressp)
-{
- struct _address *addr;
-
- g_return_val_if_fail(IS_CAMEL_INTERNET_ADDRESS(a), -1);
- g_return_val_if_fail(index >= 0, -1);
-
- if (index >= ((CamelAddress *)a)->addresses->len)
- return FALSE;
-
- addr = g_ptr_array_index( ((CamelAddress *)a)->addresses, index);
- if (namep)
- *namep = addr->name;
- if (addressp)
- *addressp = addr->address;
- return TRUE;
-}
-
-/**
- * camel_internet_address_find_name:
- * @a:
- * @name:
- * @addressp: Holder for address part, or NULL, if not required.
- *
- * Find address by real name.
- *
- * Return value: The index of the address matching the name, or -1
- * if no match was found.
- **/
-int
-camel_internet_address_find_name(CamelInternetAddress *a, const char *name, const char **addressp)
-{
- struct _address *addr;
- int i, len;
-
- g_return_val_if_fail(IS_CAMEL_INTERNET_ADDRESS(a), -1);
-
- len = ((CamelAddress *)a)->addresses->len;
- for (i=0;i<len;i++) {
- addr = g_ptr_array_index( ((CamelAddress *)a)->addresses, i );
- if (!strcmp(addr->name, name)) {
- if (addressp)
- *addressp = addr->address;
- return i;
- }
- }
- return -1;
-}
-
-/**
- * camel_internet_address_find_address:
- * @a:
- * @address:
- * @namep: Return for the matching name, or NULL, if not required.
- *
- * Find an address by address.
- *
- * Return value: The index of the address, or -1 if not found.
- **/
-int
-camel_internet_address_find_address(CamelInternetAddress *a, const char *address, const char **namep)
-{
- struct _address *addr;
- int i, len;
-
- g_return_val_if_fail(IS_CAMEL_INTERNET_ADDRESS(a), -1);
-
- len = ((CamelAddress *)a)->addresses->len;
- for (i=0;i<len;i++) {
- addr = g_ptr_array_index( ((CamelAddress *)a)->addresses, i );
- if (!strcmp(addr->address, address)) {
- if (namep)
- *namep = addr->name;
- return i;
- }
- }
- return -1;
-}
diff --git a/camel/camel-internet-address.h b/camel/camel-internet-address.h
deleted file mode 100644
index 6b303eef8f..0000000000
--- a/camel/camel-internet-address.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_INTERNET_ADDRESS_H
-#define _CAMEL_INTERNET_ADDRESS_H
-
-#include <camel/camel-address.h>
-
-#define CAMEL_INTERNET_ADDRESS(obj) CAMEL_CHECK_CAST (obj, camel_internet_address_get_type (), CamelInternetAddress)
-#define CAMEL_INTERNET_ADDRESS_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_internet_address_get_type (), CamelInternetAddressClass)
-#define IS_CAMEL_INTERNET_ADDRESS(obj) CAMEL_CHECK_TYPE (obj, camel_internet_address_get_type ())
-
-typedef struct _CamelInternetAddressClass CamelInternetAddressClass;
-
-struct _CamelInternetAddress {
- CamelAddress parent;
-
- struct _CamelInternetAddressPrivate *priv;
-};
-
-struct _CamelInternetAddressClass {
- CamelAddressClass parent_class;
-};
-
-guint camel_internet_address_get_type (void);
-CamelInternetAddress *camel_internet_address_new (void);
-
-int camel_internet_address_add (CamelInternetAddress *, const char *, const char *);
-gboolean camel_internet_address_get (const CamelInternetAddress *, int, const char **, const char **);
-
-int camel_internet_address_find_name(CamelInternetAddress *, const char *, const char **);
-int camel_internet_address_find_address(CamelInternetAddress *, const char *, const char **);
-
-#endif /* ! _CAMEL_INTERNET_ADDRESS_H */
diff --git a/camel/camel-medium.c b/camel/camel-medium.c
deleted file mode 100644
index 3c5954e40f..0000000000
--- a/camel/camel-medium.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* camelMedium.c : Abstract class for a medium
- *
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-#include <config.h>
-#include <stdio.h>
-#include <ctype.h>
-#include "camel-medium.h"
-#include "gmime-content-field.h"
-#include "string-utils.h"
-#include "hash-table-utils.h"
-
-#define d(x)
-
-static CamelDataWrapperClass *parent_class = NULL;
-
-/* Returns the class for a CamelMedium */
-#define CM_CLASS(so) CAMEL_MEDIUM_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static void add_header (CamelMedium *medium, const gchar *header_name,
- const void *header_value);
-static void set_header (CamelMedium *medium, const gchar *header_name, const void *header_value);
-static void remove_header (CamelMedium *medium, const gchar *header_name);
-static const void *get_header (CamelMedium *medium, const gchar *header_name);
-
-static CamelDataWrapper *get_content_object (CamelMedium *medium);
-static void set_content_object (CamelMedium *medium,
- CamelDataWrapper *content);
-
-static void
-camel_medium_class_init (CamelMediumClass *camel_medium_class)
-{
- /*
- * CamelDataWrapperClass *camel_data_wrapper_class =
- * CAMEL_DATA_WRAPPER_CLASS (camel_medium_class);
- */
-
- parent_class = CAMEL_DATA_WRAPPER_CLASS (camel_type_get_global_classfuncs (camel_data_wrapper_get_type ()));
-
- /* virtual method definition */
- camel_medium_class->add_header = add_header;
- camel_medium_class->set_header = set_header;
- camel_medium_class->remove_header = remove_header;
- camel_medium_class->get_header = get_header;
-
- camel_medium_class->set_content_object = set_content_object;
- camel_medium_class->get_content_object = get_content_object;
-}
-
-static void
-camel_medium_init (gpointer object, gpointer klass)
-{
- CamelMedium *camel_medium = CAMEL_MEDIUM (object);
-
- camel_medium->content = NULL;
-}
-
-static void
-camel_medium_finalize (CamelObject *object)
-{
- CamelMedium *medium = CAMEL_MEDIUM (object);
-
- if (medium->content)
- camel_object_unref (CAMEL_OBJECT (medium->content));
-}
-
-
-CamelType
-camel_medium_get_type (void)
-{
- static CamelType camel_medium_type = CAMEL_INVALID_TYPE;
-
- if (camel_medium_type == CAMEL_INVALID_TYPE) {
- camel_medium_type = camel_type_register (CAMEL_DATA_WRAPPER_TYPE, "medium",
- sizeof (CamelMedium),
- sizeof (CamelMediumClass),
- (CamelObjectClassInitFunc) camel_medium_class_init,
- NULL,
- (CamelObjectInitFunc) camel_medium_init,
- (CamelObjectFinalizeFunc) camel_medium_finalize);
- }
-
- return camel_medium_type;
-}
-
-static void
-add_header (CamelMedium *medium, const gchar *header_name,
- const void *header_value)
-{
- g_warning("No %s::add_header implemented, adding %s", camel_type_to_name(CAMEL_OBJECT_GET_TYPE(medium)), header_name);
-}
-
-/**
- * camel_medium_add_header:
- * @medium: a CamelMedium
- * @header_name: name of the header
- * @header_value: value of the header
- *
- * Adds a header to a medium.
- *
- * FIXME: Where does it add it? We need to be able to prepend and
- * append headers, and also be able to insert them relative to other
- * headers. No we dont, order isn't important! Z
- **/
-void
-camel_medium_add_header (CamelMedium *medium, const gchar *header_name,
- const void *header_value)
-{
- g_return_if_fail (CAMEL_IS_MEDIUM (medium));
- g_return_if_fail (header_name != NULL);
- g_return_if_fail (header_value != NULL);
-
- CM_CLASS (medium)->add_header (medium, header_name, header_value);
-}
-
-static void
-set_header (CamelMedium *medium, const gchar *header_name, const void *header_value)
-{
- g_warning("No %s::set_header implemented, setting %s", camel_type_to_name(CAMEL_OBJECT_GET_TYPE(medium)), header_name);
-}
-
-/**
- * camel_medium_set_header:
- * @medium: a CamelMedium
- * @header_name: name of the header
- * @header_value: value of the header
- *
- * Sets the value of a header. Any other occurances of the header
- * will be removed.
- **/
-void
-camel_medium_set_header (CamelMedium *medium, const gchar *header_name, const void *header_value)
-{
- g_return_if_fail (CAMEL_IS_MEDIUM (medium));
- g_return_if_fail (header_name != NULL);
- g_return_if_fail (header_value != NULL);
-
- CM_CLASS (medium)->add_header (medium, header_name, header_value);
-}
-
-static void
-remove_header (CamelMedium *medium, const gchar *header_name)
-{
- g_warning("No %s::remove_header implemented, removing %s", camel_type_to_name(CAMEL_OBJECT_GET_TYPE(medium)), header_name);
-}
-
-/**
- * camel_medium_remove_header:
- * @medium: a medium
- * @header_name: the name of the header
- *
- * Removes the named header from the medium. All occurances of the
- * header are removed.
- **/
-void
-camel_medium_remove_header (CamelMedium *medium, const gchar *header_name)
-{
- g_return_if_fail (CAMEL_IS_MEDIUM (medium));
- g_return_if_fail (header_name != NULL);
-
- CM_CLASS (medium)->remove_header (medium, header_name);
-}
-
-
-static const void *
-get_header (CamelMedium *medium, const gchar *header_name)
-{
- g_warning("No %s::get_header implemented, getting %s", camel_type_to_name(CAMEL_OBJECT_GET_TYPE(medium)), header_name);
- return NULL;
-}
-
-/**
- * camel_medium_get_header:
- * @medium: a medium
- * @header_name: the name of the header
- *
- * Returns the value of the named header in the medium, or %NULL if
- * it is unset. The caller should not modify or free the data.
- *
- * FIXME: What if the header occurs more than once?
- *
- * Return value: the value of the named header, or %NULL
- **/
-const void *
-camel_medium_get_header (CamelMedium *medium, const gchar *header_name)
-{
- g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), NULL);
- g_return_val_if_fail (header_name != NULL, NULL);
-
-#ifndef NO_WARNINGS
-#warning No way to get multi-valued headers?
-#endif
-
- return CM_CLASS (medium)->get_header (medium, header_name);
-}
-
-
-static CamelDataWrapper *
-get_content_object (CamelMedium *medium)
-{
- return medium->content;
-}
-
-/**
- * camel_medium_get_content_object:
- * @medium: a medium
- *
- * Returns a data wrapper that represents the content of the medium,
- * without its headers.
- *
- * Return value: the medium's content object.
- **/
-CamelDataWrapper *
-camel_medium_get_content_object (CamelMedium *medium)
-{
- g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), NULL);
-
- return CM_CLASS (medium)->get_content_object (medium);
-}
-
-
-static void
-set_content_object (CamelMedium *medium, CamelDataWrapper *content)
-{
- if (medium->content)
- camel_object_unref (CAMEL_OBJECT (medium->content));
- camel_object_ref (CAMEL_OBJECT (content));
- medium->content = content;
-}
-
-/**
- * camel_medium_set_content_object:
- * @medium: a medium
- * @content: a data wrapper representing the medium's content
- *
- * Sets the content of @medium to be @content.
- **/
-void
-camel_medium_set_content_object (CamelMedium *medium,
- CamelDataWrapper *content)
-{
- g_return_if_fail (CAMEL_IS_MEDIUM (medium));
- g_return_if_fail (CAMEL_IS_DATA_WRAPPER (content));
-
- CM_CLASS (medium)->set_content_object (medium, content);
-}
diff --git a/camel/camel-medium.h b/camel/camel-medium.h
deleted file mode 100644
index 9ce548ba1d..0000000000
--- a/camel/camel-medium.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-medium.h : class for a medium object */
-
-/*
- *
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_MEDIUM_H
-#define CAMEL_MEDIUM_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-data-wrapper.h>
-
-#define CAMEL_MEDIUM_TYPE (camel_medium_get_type ())
-#define CAMEL_MEDIUM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MEDIUM_TYPE, CamelMedium))
-#define CAMEL_MEDIUM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MEDIUM_TYPE, CamelMediumClass))
-#define CAMEL_IS_MEDIUM(o) (CAMEL_CHECK_TYPE((o), CAMEL_MEDIUM_TYPE))
-
-
-struct _CamelMedium
-{
- CamelDataWrapper parent_object;
-
- /* The content of the medium, as opposed to our parent
- * CamelDataWrapper, which wraps both the headers and the
- * content.
- */
- CamelDataWrapper *content;
-
-};
-
-
-
-typedef struct {
- CamelDataWrapperClass parent_class;
-
- /* Virtual methods */
- void (*add_header) (CamelMedium *medium, const gchar *header_name, const void *header_value);
- void (*set_header) (CamelMedium *medium, const gchar *header_name, const void *header_value);
- void (*remove_header) (CamelMedium *medium, const gchar *header_name);
- const void * (*get_header) (CamelMedium *medium, const gchar *header_name);
-
- CamelDataWrapper * (*get_content_object) (CamelMedium *medium);
- void (*set_content_object) (CamelMedium *medium, CamelDataWrapper *content);
-
-} CamelMediumClass;
-
-/* Standard Camel function */
-CamelType camel_medium_get_type (void);
-
-/* Header get/set interface */
-void camel_medium_add_header (CamelMedium *medium, const gchar *header_name, const void *header_value);
-void camel_medium_set_header (CamelMedium *medium, const gchar *header_name, const void *header_value);
-void camel_medium_remove_header (CamelMedium *medium, const gchar *header_name);
-const void *camel_medium_get_header (CamelMedium *medium, const gchar *header_name);
-
-/* accessor methods */
-CamelDataWrapper *camel_medium_get_content_object (CamelMedium *medium);
-void camel_medium_set_content_object (CamelMedium *medium,
- CamelDataWrapper *content);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MEDIUM_H */
-
diff --git a/camel/camel-mime-filter-basic.c b/camel/camel-mime-filter-basic.c
deleted file mode 100644
index 4b351e4ff4..0000000000
--- a/camel/camel-mime-filter-basic.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "camel-mime-filter-basic.h"
-
-#include "camel-mime-utils.h"
-
-static void reset(CamelMimeFilter *mf);
-static void complete(CamelMimeFilter *mf, char *in, size_t len,
- size_t prespace, char **out,
- size_t *outlen, size_t *outprespace);
-static void filter(CamelMimeFilter *mf, char *in, size_t len,
- size_t prespace, char **out,
- size_t *outlen, size_t *outprespace);
-
-static void camel_mime_filter_basic_class_init (CamelMimeFilterBasicClass *klass);
-static void camel_mime_filter_basic_init (CamelMimeFilterBasic *obj);
-
-static CamelMimeFilterClass *camel_mime_filter_basic_parent;
-
-static void
-camel_mime_filter_basic_class_init (CamelMimeFilterBasicClass *klass)
-{
- CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass;
-
- camel_mime_filter_basic_parent = CAMEL_MIME_FILTER_CLASS(camel_type_get_global_classfuncs (camel_mime_filter_get_type ()));
-
- filter_class->reset = reset;
- filter_class->filter = filter;
- filter_class->complete = complete;
-}
-
-static void
-camel_mime_filter_basic_init (CamelMimeFilterBasic *obj)
-{
- obj->state = 0;
- obj->save = 0;
-}
-
-
-CamelType
-camel_mime_filter_basic_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterBasic",
- sizeof (CamelMimeFilterBasic),
- sizeof (CamelMimeFilterBasicClass),
- (CamelObjectClassInitFunc) camel_mime_filter_basic_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mime_filter_basic_init,
- NULL);
- }
-
- return type;
-}
-
-/* should this 'flush' outstanding state/data bytes? */
-static void
-reset(CamelMimeFilter *mf)
-{
- CamelMimeFilterBasic *f = (CamelMimeFilterBasic *)mf;
-
- switch(f->type) {
- case CAMEL_MIME_FILTER_BASIC_QP_ENC:
- f->state = -1;
- break;
- default:
- f->state = 0;
- }
- f->save = 0;
-}
-
-static void
-complete(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace)
-{
- CamelMimeFilterBasic *f = (CamelMimeFilterBasic *)mf;
- int newlen;
-
- switch(f->type) {
- case CAMEL_MIME_FILTER_BASIC_BASE64_ENC:
- /* wont go to more than 2x size (overly conservative) */
- camel_mime_filter_set_size(mf, len*2, FALSE);
- newlen = base64_encode_close(in, len, mf->outbuf, &f->state, &f->save);
- break;
- case CAMEL_MIME_FILTER_BASIC_QP_ENC:
- /* FIXME: *3 is probably not quite enough ... */
- camel_mime_filter_set_size(mf, len*3, FALSE);
- newlen = quoted_encode_close(in, len, mf->outbuf, &f->state, &f->save);
- break;
- case CAMEL_MIME_FILTER_BASIC_BASE64_DEC:
- /* output can't possibly exceed the input size */
- camel_mime_filter_set_size(mf, len, FALSE);
- newlen = base64_decode_step(in, len, mf->outbuf, &f->state, &f->save);
- break;
- case CAMEL_MIME_FILTER_BASIC_QP_DEC:
- /* output can't possibly exceed the input size */
- camel_mime_filter_set_size(mf, len, FALSE);
- newlen = quoted_decode_step(in, len, mf->outbuf, &f->state, &f->save);
- break;
- default:
- g_warning("unknown type %d in CamelMimeFilterBasic", f->type);
- goto donothing;
- }
-
- *out = mf->outbuf;
- *outlen = newlen;
- *outprespace = mf->outpre;
-
- return;
-donothing:
- *out = in;
- *outlen = len;
- *outprespace = prespace;
-}
-
-/* here we do all of the basic mime filtering */
-static void
-filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace)
-{
- CamelMimeFilterBasic *f = (CamelMimeFilterBasic *)mf;
- int newlen;
-
- switch(f->type) {
- case CAMEL_MIME_FILTER_BASIC_BASE64_ENC:
- /* wont go to more than 2x size (overly conservative) */
- camel_mime_filter_set_size(mf, len*2, FALSE);
- newlen = base64_encode_step(in, len, mf->outbuf, &f->state, &f->save);
- break;
- case CAMEL_MIME_FILTER_BASIC_QP_ENC:
- /* FIXME: *3 is probably not quite enough ... */
- camel_mime_filter_set_size(mf, len*3, FALSE);
- newlen = quoted_encode_step(in, len, mf->outbuf, &f->state, &f->save);
- break;
- case CAMEL_MIME_FILTER_BASIC_BASE64_DEC:
- /* output can't possibly exceed the input size */
- camel_mime_filter_set_size(mf, len, FALSE);
- newlen = base64_decode_step(in, len, mf->outbuf, &f->state, &f->save);
- break;
- case CAMEL_MIME_FILTER_BASIC_QP_DEC:
- /* output can't possibly exceed the input size */
- camel_mime_filter_set_size(mf, len, FALSE);
- newlen = quoted_decode_step(in, len, mf->outbuf, &f->state, &f->save);
- break;
- default:
- g_warning("unknown type %d in CamelMimeFilterBasic", f->type);
- goto donothing;
- }
-
- *out = mf->outbuf;
- *outlen = newlen;
- *outprespace = mf->outpre;
-
- return;
-donothing:
- *out = in;
- *outlen = len;
- *outprespace = prespace;
-}
-
-/**
- * camel_mime_filter_basic_new:
- *
- * Create a new CamelMimeFilterBasic object.
- *
- * Return value: A new CamelMimeFilterBasic widget.
- **/
-CamelMimeFilterBasic *
-camel_mime_filter_basic_new (void)
-{
- CamelMimeFilterBasic *new = CAMEL_MIME_FILTER_BASIC ( camel_object_new (camel_mime_filter_basic_get_type ()));
- return new;
-}
-
-CamelMimeFilterBasic *
-camel_mime_filter_basic_new_type(CamelMimeFilterBasicType type)
-{
- CamelMimeFilterBasic *new;
-
- switch (type) {
- case CAMEL_MIME_FILTER_BASIC_BASE64_ENC:
- case CAMEL_MIME_FILTER_BASIC_QP_ENC:
- case CAMEL_MIME_FILTER_BASIC_BASE64_DEC:
- case CAMEL_MIME_FILTER_BASIC_QP_DEC:
- new = camel_mime_filter_basic_new();
- new->type = type;
- break;
- default:
- g_warning("Invalid type of CamelMimeFilterBasic requested: %d", type);
- new = NULL;
- break;
- }
- camel_mime_filter_reset((CamelMimeFilter *)new);
- return new;
-}
-
diff --git a/camel/camel-mime-filter-basic.h b/camel/camel-mime-filter-basic.h
deleted file mode 100644
index 42713e334d..0000000000
--- a/camel/camel-mime-filter-basic.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_MIME_FILTER_BASIC_H
-#define _CAMEL_MIME_FILTER_BASIC_H
-
-#include <camel/camel-mime-filter.h>
-
-#define CAMEL_MIME_FILTER_BASIC(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_basic_get_type (), CamelMimeFilterBasic)
-#define CAMEL_MIME_FILTER_BASIC_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_basic_get_type (), CamelMimeFilterBasicClass)
-#define IS_CAMEL_MIME_FILTER_BASIC(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_basic_get_type ())
-
-typedef struct _CamelMimeFilterBasicClass CamelMimeFilterBasicClass;
-
-typedef enum {
- CAMEL_MIME_FILTER_BASIC_BASE64_ENC = 1,
- CAMEL_MIME_FILTER_BASIC_BASE64_DEC,
- CAMEL_MIME_FILTER_BASIC_QP_ENC,
- CAMEL_MIME_FILTER_BASIC_QP_DEC,
-} CamelMimeFilterBasicType;
-
-struct _CamelMimeFilterBasic {
- CamelMimeFilter parent;
-
- struct _CamelMimeFilterBasicPrivate *priv;
-
- CamelMimeFilterBasicType type;
-
- int state;
- int save;
-};
-
-struct _CamelMimeFilterBasicClass {
- CamelMimeFilterClass parent_class;
-};
-
-guint camel_mime_filter_basic_get_type (void);
-CamelMimeFilterBasic *camel_mime_filter_basic_new (void);
-CamelMimeFilterBasic *camel_mime_filter_basic_new_type (CamelMimeFilterBasicType type);
-
-#endif /* ! _CAMEL_MIME_FILTER_BASIC_H */
diff --git a/camel/camel-mime-filter-charset.c b/camel/camel-mime-filter-charset.c
deleted file mode 100644
index 788c7022ab..0000000000
--- a/camel/camel-mime-filter-charset.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-
-#include <unicode.h>
-
-#include <string.h>
-#include <errno.h>
-
-#include "camel-mime-filter-charset.h"
-
-
-static void camel_mime_filter_charset_class_init (CamelMimeFilterCharsetClass *klass);
-static void camel_mime_filter_charset_init (CamelMimeFilterCharset *obj);
-static void camel_mime_filter_charset_finalize (CamelObject *o);
-
-static CamelMimeFilterClass *camel_mime_filter_charset_parent;
-
-CamelType
-camel_mime_filter_charset_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterCharset",
- sizeof (CamelMimeFilterCharset),
- sizeof (CamelMimeFilterCharsetClass),
- (CamelObjectClassInitFunc) camel_mime_filter_charset_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mime_filter_charset_init,
- (CamelObjectFinalizeFunc) camel_mime_filter_charset_finalize);
- }
-
- return type;
-}
-
-static void
-camel_mime_filter_charset_finalize(CamelObject *o)
-{
- CamelMimeFilterCharset *f = (CamelMimeFilterCharset *)o;
-
- g_free(f->from);
- g_free(f->to);
- if (f->ic != (unicode_iconv_t)-1) {
- unicode_iconv_close(f->ic);
- f->ic = (unicode_iconv_t) -1;
- }
-}
-
-static void
-reset(CamelMimeFilter *mf)
-{
- CamelMimeFilterCharset *f = (CamelMimeFilterCharset *)mf;
- char buf[16];
- char *buffer;
- int outlen = 16;
-
- /* what happens with the output bytes if this resets the state? */
- if (f->ic != (unicode_iconv_t) -1) {
- buffer = buf;
- unicode_iconv(f->ic, NULL, 0, &buffer, &outlen);
- }
-}
-
-static void
-complete(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlenptr, size_t *outprespace)
-{
- CamelMimeFilterCharset *f = (CamelMimeFilterCharset *)mf;
- int converted;
- const char *inbuf;
- char *outbuf;
- int inlen, outlen;
-
- if (f->ic == (unicode_iconv_t) -1) {
- goto donothing;
- }
-
- /* FIXME: there's probably a safer way to size this ...? */
- /* We could always resize if we run out of room in outbuf (but it'd be nice not
- to have to) */
- camel_mime_filter_set_size(mf, len*5, FALSE);
- inbuf = in;
- inlen = len;
- outbuf = mf->outbuf;
- outlen = mf->outsize;
- if (inlen>0) {
- converted = unicode_iconv(f->ic, &inbuf, &inlen, &outbuf, &outlen);
- if (converted == -1) {
- if (errno != EINVAL) {
- g_warning("error occured converting: %s", strerror(errno));
- goto donothing;
- }
- }
-
- if (inlen>0) {
- g_warning("Output lost in character conversion, invalid sequence encountered?");
- }
- }
-
- /* this 'resets' the output stream, returning back to the initial
- shift state for multishift charactersets */
- converted = unicode_iconv(f->ic, NULL, 0, &outbuf, &outlen);
- if (converted == -1) {
- g_warning("Conversion failed to complete: %s", strerror(errno));
- }
-
- *out = mf->outbuf;
- *outlenptr = mf->outsize - outlen;
- *outprespace = mf->outpre;
- return;
-
-donothing:
- *out = in;
- *outlenptr = len;
- *outprespace = prespace;
-}
-
-static void
-filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlenptr, size_t *outprespace)
-{
- CamelMimeFilterCharset *f = (CamelMimeFilterCharset *)mf;
- int converted;
- const char *inbuf;
- char *outbuf;
- int inlen, outlen;
-
- if (f->ic == (unicode_iconv_t) -1) {
- goto donothing;
- }
-
- /* FIXME: there's probably a safer way to size this ...? */
- camel_mime_filter_set_size(mf, len*5, FALSE);
- inbuf = in;
- inlen = len;
- outbuf = mf->outbuf;
- outlen = mf->outsize;
- converted = unicode_iconv(f->ic, &inbuf, &inlen, &outbuf, &outlen);
- if (converted == -1) {
- if (errno != EINVAL) {
- g_warning("error occured converting: %s", strerror(errno));
- goto donothing;
- }
- }
-
- /*
- NOTE: This assumes EINVAL only occurs because we ran out of
- bytes for a multibyte sequence, if not, we're in trouble.
- */
-
- if (inlen>0) {
- camel_mime_filter_backup(mf, inbuf, inlen);
- }
-
- *out = mf->outbuf;
- *outlenptr = mf->outsize - outlen;
- *outprespace = mf->outpre;
- return;
-
-donothing:
- *out = in;
- *outlenptr = len;
- *outprespace = prespace;
-}
-
-static void
-camel_mime_filter_charset_class_init (CamelMimeFilterCharsetClass *klass)
-{
- CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass;
-
- camel_mime_filter_charset_parent = CAMEL_MIME_FILTER_CLASS (camel_type_get_global_classfuncs (camel_mime_filter_get_type ()));
-
- filter_class->reset = reset;
- filter_class->filter = filter;
- filter_class->complete = complete;
-}
-
-static void
-camel_mime_filter_charset_init (CamelMimeFilterCharset *obj)
-{
- obj->ic = (unicode_iconv_t)-1;
-}
-
-/**
- * camel_mime_filter_charset_new:
- *
- * Create a new CamelMimeFilterCharset object.
- *
- * Return value: A new CamelMimeFilterCharset widget.
- **/
-CamelMimeFilterCharset *
-camel_mime_filter_charset_new (void)
-{
- CamelMimeFilterCharset *new = CAMEL_MIME_FILTER_CHARSET ( camel_object_new (camel_mime_filter_charset_get_type ()));
- return new;
-}
-
-CamelMimeFilterCharset *
-camel_mime_filter_charset_new_convert(const char *from_charset, const char *to_charset)
-{
- CamelMimeFilterCharset *new = CAMEL_MIME_FILTER_CHARSET ( camel_object_new (camel_mime_filter_charset_get_type ()));
-
- new->ic = unicode_iconv_open(to_charset, from_charset);
- if (new->ic == (unicode_iconv_t) -1) {
- g_warning("Cannot create charset conversion from %s to %s: %s", from_charset, to_charset, strerror(errno));
- camel_object_unref((CamelObject *)new);
- new = NULL;
- } else {
- new->from = g_strdup(from_charset);
- new->to = g_strdup(to_charset);
- }
- return new;
-}
diff --git a/camel/camel-mime-filter-charset.h b/camel/camel-mime-filter-charset.h
deleted file mode 100644
index c53254c8ab..0000000000
--- a/camel/camel-mime-filter-charset.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_MIME_FILTER_CHARSET_H
-#define _CAMEL_MIME_FILTER_CHARSET_H
-
-#include <camel/camel-mime-filter.h>
-#include <unicode.h>
-
-#define CAMEL_MIME_FILTER_CHARSET(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_charset_get_type (), CamelMimeFilterCharset)
-#define CAMEL_MIME_FILTER_CHARSET_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_charset_get_type (), CamelMimeFilterCharsetClass)
-#define IS_CAMEL_MIME_FILTER_CHARSET(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_charset_get_type ())
-
-typedef struct _CamelMimeFilterCharsetClass CamelMimeFilterCharsetClass;
-
-struct _CamelMimeFilterCharset {
- CamelMimeFilter parent;
-
- struct _CamelMimeFilterCharsetPrivate *priv;
-
- unicode_iconv_t ic;
- char *from;
- char *to;
-};
-
-struct _CamelMimeFilterCharsetClass {
- CamelMimeFilterClass parent_class;
-};
-
-guint camel_mime_filter_charset_get_type (void);
-CamelMimeFilterCharset *camel_mime_filter_charset_new (void);
-
-CamelMimeFilterCharset *camel_mime_filter_charset_new_convert (const char *from_charset, const char *to_charset);
-
-#endif /* ! _CAMEL_MIME_FILTER_CHARSET_H */
diff --git a/camel/camel-mime-filter-crlf.c b/camel/camel-mime-filter-crlf.c
deleted file mode 100644
index 71a3e8bace..0000000000
--- a/camel/camel-mime-filter-crlf.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Dan Winship <danw@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "camel-mime-filter-crlf.h"
-
-static void filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace);
-static void complete (CamelMimeFilter *f, char *in, size_t len,
- size_t prespace, char **out, size_t *outlen,
- size_t *outprespace);
-static void reset (CamelMimeFilter *f);
-
-
-static void
-camel_mime_filter_crlf_class_init (CamelMimeFilterCRLFClass *klass)
-{
- CamelMimeFilterClass *mime_filter_class =
- (CamelMimeFilterClass *) klass;
-
- mime_filter_class->filter = filter;
- mime_filter_class->complete = complete;
- mime_filter_class->reset = reset;
-}
-
-CamelType
-camel_mime_filter_crlf_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_mime_filter_get_type(), "CamelMimeFilterCRLF",
- sizeof (CamelMimeFilterCRLF),
- sizeof (CamelMimeFilterCRLFClass),
- (CamelObjectClassInitFunc) camel_mime_filter_crlf_class_init,
- NULL,
- NULL,
- NULL);
- }
-
- return type;
-}
-
-static void
-filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace)
-{
- CamelMimeFilterCRLF *crlf = (CamelMimeFilterCRLF *)f;
- gboolean do_dots;
- char *p, *q;
-
- do_dots = crlf->mode == CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS;
-
- if (crlf->direction == CAMEL_MIME_FILTER_CRLF_ENCODE) {
- camel_mime_filter_set_size (f, 3 * len, FALSE);
-
- p = in;
- q = f->outbuf;
- while (p < in + len) {
- if (*p == '\n')
- *q++ = '\r';
- else
- if (do_dots && *(p - 1) == '\n' && *p == '.')
- *q++ = '.';
- *q++ = *p++;
- }
- } else {
- camel_mime_filter_set_size (f, len, FALSE);
-
- p = in;
- q = f->outbuf;
- while (p < in + len) {
- if (*p == '\r') {
- crlf->saw_cr = TRUE;
- } else {
- if (crlf->saw_cr) {
- if (*p != '\n')
- *q++ = '\r';
- crlf->saw_cr = FALSE;
- }
- *q++ = *p;
- }
-
- if (do_dots) {
- if (*p == '.' && *(p - 1) == '\n') {
- crlf->saw_dot = TRUE;
- } else {
- if (crlf->saw_dot) {
- if (*p == '.')
- p++;
- crlf->saw_dot = FALSE;
- }
- *q++ = *p;
- }
- }
-
- p++;
- }
- }
-
- *out = f->outbuf;
- *outlen = q - f->outbuf;
- *outprespace = f->outpre;
-}
-
-static void
-complete (CamelMimeFilter *f, char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace)
-{
- if (len)
- filter (f, in, len, prespace, out, outlen, outprespace);
-}
-
-static void
-reset (CamelMimeFilter *f)
-{
- CamelMimeFilterCRLF *crlf = (CamelMimeFilterCRLF *)f;
-
- crlf->saw_cr = FALSE;
-}
-
-CamelMimeFilter *
-camel_mime_filter_crlf_new (CamelMimeFilterCRLFDirection direction, CamelMimeFilterCRLFMode mode)
-{
- CamelMimeFilterCRLF *crlf = CAMEL_MIME_FILTER_CRLF(camel_object_new (CAMEL_MIME_FILTER_CRLF_TYPE));
-
- crlf->direction = direction;
- crlf->mode = mode;
- crlf->saw_cr = FALSE;
-
- return (CamelMimeFilter *)crlf;
-}
diff --git a/camel/camel-mime-filter-crlf.h b/camel/camel-mime-filter-crlf.h
deleted file mode 100644
index 6ba109d154..0000000000
--- a/camel/camel-mime-filter-crlf.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Dan Winship <danw@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_MIME_FILTER_CRLF_H
-#define _CAMEL_MIME_FILTER_CRLF_H
-
-#include <camel/camel-mime-filter.h>
-
-#define CAMEL_MIME_FILTER_CRLF_TYPE (camel_mime_filter_crlf_get_type ())
-#define CAMEL_MIME_FILTER_CRLF(obj) CAMEL_CHECK_CAST (obj, CAMEL_MIME_FILTER_CRLF_TYPE, CamelMimeFilterCRLF)
-#define CAMEL_MIME_FILTER_CRLF_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, CAMEL_MIME_FILTER_CRLF_TYPE, CamelMimeFilterCRLFClass)
-#define CAMEL_IS_MIME_FILTER_CRLF(obj) CAMEL_CHECK_TYPE (obj, CAMEL_MIME_FILTER_CRLF_TYPE)
-
-typedef struct _CamelMimeFilterCRLFClass CamelMimeFilterCRLFClass;
-
-typedef enum {
- CAMEL_MIME_FILTER_CRLF_ENCODE,
- CAMEL_MIME_FILTER_CRLF_DECODE
-} CamelMimeFilterCRLFDirection;
-
-typedef enum {
- CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS,
- CAMEL_MIME_FILTER_CRLF_MODE_CRLF_ONLY,
-} CamelMimeFilterCRLFMode;
-
-struct _CamelMimeFilterCRLF {
- CamelMimeFilter parent;
-
- CamelMimeFilterCRLFDirection direction;
- CamelMimeFilterCRLFMode mode;
- gboolean saw_cr;
- gboolean saw_dot;
-};
-
-struct _CamelMimeFilterCRLFClass {
- CamelMimeFilterClass parent_class;
-};
-
-CamelType camel_mime_filter_crlf_get_type (void);
-
-CamelMimeFilter *camel_mime_filter_crlf_new (CamelMimeFilterCRLFDirection direction, CamelMimeFilterCRLFMode mode);
-
-#endif /* ! _CAMEL_MIME_FILTER_CRLF_H */
diff --git a/camel/camel-mime-filter-from.c b/camel/camel-mime-filter-from.c
deleted file mode 100644
index 017a256471..0000000000
--- a/camel/camel-mime-filter-from.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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
- */
-
-#include "camel-mime-filter-from.h"
-#include <string.h>
-
-#define d(x)
-
-struct _CamelMimeFilterFromPrivate {
-};
-
-#define _PRIVATE(o) (((CamelMimeFilterFrom *)(o))->priv)
-
-static void camel_mime_filter_from_class_init (CamelMimeFilterFromClass *klass);
-static void camel_mime_filter_from_init (CamelMimeFilterFrom *obj);
-
-static CamelMimeFilterClass *camel_mime_filter_from_parent;
-
-CamelType
-camel_mime_filter_from_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterFrom",
- sizeof (CamelMimeFilterFrom),
- sizeof (CamelMimeFilterFromClass),
- (CamelObjectClassInitFunc) camel_mime_filter_from_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mime_filter_from_init,
- NULL);
- }
-
- return type;
-}
-
-struct fromnode {
- struct fromnode *next;
- char *pointer;
-};
-
-static void
-complete(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace)
-{
- *out = in;
- *outlen = len;
- *outprespace = prespace;
-}
-
-/* Yes, it is complicated ... */
-static void
-filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace)
-{
- CamelMimeFilterFrom *f = (CamelMimeFilterFrom *)mf;
- register char *inptr, *inend;
- int left;
- int midline = f->midline;
- int fromcount = 0;
- struct fromnode *head = NULL, *tail = (struct fromnode *)&head, *node;
- char *outptr;
-
- inptr = in;
- inend = inptr+len;
-
- d(printf("Filtering '%.*s'\n", len, in));
-
- /* first, see if we need to escape any from's */
- while (inptr<inend) {
- register int c = -1;
-
- if (midline)
- while (inptr < inend && (c = *inptr++) != '\n')
- ;
-
- if (c == '\n' || !midline) {
- left = inend-inptr;
- if (left > 0) {
- midline = TRUE;
- if (left < 5) {
- if (inptr[0] == 'F') {
- camel_mime_filter_backup(mf, inptr, left);
- midline = FALSE;
- inend = inptr;
- break;
- }
- } else {
- if (!strncmp(inptr, "From ", 5)) {
- fromcount++;
- /* yes, we do alloc them on the stack ... at most we're going to get
- len / 7 of them anyway */
- node = alloca(sizeof(*node));
- node->pointer = inptr;
- node->next = NULL;
- tail->next = node;
- tail = node;
- inptr += 5;
- }
- }
- } else {
- /* \n is at end of line, check next buffer */
- midline = FALSE;
- }
- }
- }
-
- f->midline = midline;
-
- if (fromcount > 0) {
- camel_mime_filter_set_size(mf, len + fromcount, FALSE);
- node = head;
- inptr = in;
- outptr = mf->outbuf;
- while (node) {
- memcpy(outptr, inptr, node->pointer - inptr);
- outptr += node->pointer - inptr;
- *outptr++ = '>';
- inptr = node->pointer;
- node = node->next;
- }
- memcpy(outptr, inptr, inend - inptr);
- outptr += inend - inptr;
- *out = mf->outbuf;
- *outlen = outptr - mf->outbuf;
- *outprespace = mf->outbuf - mf->outreal;
-
- d(printf("Filtered '%.*s'\n", *outlen, *out));
- } else {
- *out = in;
- *outlen = inend - in;
- *outprespace = prespace;
-
- d(printf("Filtered '%.*s'\n", *outlen, *out));
- }
-}
-
-static void
-camel_mime_filter_from_class_init (CamelMimeFilterFromClass *klass)
-{
- CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass;
-
- camel_mime_filter_from_parent = CAMEL_MIME_FILTER_CLASS (camel_type_get_global_classfuncs (camel_mime_filter_get_type ()));
-
- filter_class->filter = filter;
- filter_class->complete = complete;
-}
-
-static void
-camel_mime_filter_from_init (CamelMimeFilterFrom *obj)
-{
- struct _CamelMimeFilterFromPrivate *p;
-
- p = _PRIVATE(obj) = g_malloc0(sizeof(*p));
- obj->midline = FALSE;
-}
-
-/**
- * camel_mime_filter_from_new:
- *
- * Create a new CamelMimeFilterFrom object.
- *
- * Return value: A new CamelMimeFilterFrom widget.
- **/
-CamelMimeFilterFrom *
-camel_mime_filter_from_new (void)
-{
- CamelMimeFilterFrom *new = CAMEL_MIME_FILTER_FROM ( camel_object_new (camel_mime_filter_from_get_type ()));
- return new;
-}
-
-#if 0
-
-#include <stdio.h>
-
-int main(int argc, char **argv)
-{
- CamelMimeFilterFrom *f;
- char *buffer;
- int len, prespace;
-
- g_tk_init(&argc, &argv);
-
-
- f = camel_mime_filter_from_new();
-
- buffer = "This is a test\nFrom Someone\nTo someone. From Someone else, From\n From blah\nFromblah\nBye! \nFrom ";
- len = strlen(buffer);
- prespace = 0;
-
- printf("input = '%.*s'\n", len, buffer);
- camel_mime_filter_filter(f, buffer, len, prespace, &buffer, &len, &prespace);
- printf("output = '%.*s'\n", len, buffer);
- buffer = "";
- len = 0;
- prespace = 0;
- camel_mime_filter_complete(f, buffer, len, prespace, &buffer, &len, &prespace);
- printf("complete = '%.*s'\n", len, buffer);
-
-
- return 0;
-}
-
-#endif
diff --git a/camel/camel-mime-filter-from.h b/camel/camel-mime-filter-from.h
deleted file mode 100644
index ac526b6e15..0000000000
--- a/camel/camel-mime-filter-from.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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 _CAMEL_MIME_FILTER_FROM_H
-#define _CAMEL_MIME_FILTER_FROM_H
-
-#include <camel/camel-mime-filter.h>
-
-#define CAMEL_MIME_FILTER_FROM(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_from_get_type (), CamelMimeFilterFrom)
-#define CAMEL_MIME_FILTER_FROM_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_from_get_type (), CamelMimeFilterFromClass)
-#define IS_CAMEL_MIME_FILTER_FROM(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_from_get_type ())
-
-typedef struct _CamelMimeFilterFrom CamelMimeFilterFrom;
-typedef struct _CamelMimeFilterFromClass CamelMimeFilterFromClass;
-
-struct _CamelMimeFilterFrom {
- CamelMimeFilter parent;
-
- struct _CamelMimeFilterFromPrivate *priv;
-
- int midline; /* are we between lines? */
-};
-
-struct _CamelMimeFilterFromClass {
- CamelMimeFilterClass parent_class;
-};
-
-guint camel_mime_filter_from_get_type (void);
-CamelMimeFilterFrom *camel_mime_filter_from_new (void);
-
-#endif /* ! _CAMEL_MIME_FILTER_FROM_H */
diff --git a/camel/camel-mime-filter-index.c b/camel/camel-mime-filter-index.c
deleted file mode 100644
index 46e0f3f5e8..0000000000
--- a/camel/camel-mime-filter-index.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "camel-mime-filter-index.h"
-
-
-static void camel_mime_filter_index_class_init (CamelMimeFilterIndexClass *klass);
-static void camel_mime_filter_index_finalize (CamelObject *o);
-
-static CamelMimeFilterClass *camel_mime_filter_index_parent;
-
-CamelType
-camel_mime_filter_index_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterIndex",
- sizeof (CamelMimeFilterIndex),
- sizeof (CamelMimeFilterIndexClass),
- (CamelObjectClassInitFunc) camel_mime_filter_index_class_init,
- NULL,
- NULL,
- (CamelObjectFinalizeFunc) camel_mime_filter_index_finalize);
- }
-
- return type;
-}
-
-static void
-camel_mime_filter_index_finalize(CamelObject *o)
-{
- CamelMimeFilterIndex *f = (CamelMimeFilterIndex *)o;
-
- g_free(f->name);
- f->index = NULL; /* ibex's need refcounting? */
-}
-
-static void
-complete(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlenptr, size_t *outprespace)
-{
- CamelMimeFilterIndex *f = (CamelMimeFilterIndex *)mf;
-
- if (f->index == NULL || f->name==NULL) {
- goto donothing;
- }
-
- ibex_index_buffer(f->index, f->name, in, len, NULL);
-
-donothing:
- *out = in;
- *outlenptr = len;
- *outprespace = prespace;
-}
-
-static void
-filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlenptr, size_t *outprespace)
-{
- CamelMimeFilterIndex *f = (CamelMimeFilterIndex *)mf;
- int inleft = 0;
-
- if (f->index == NULL || f->name==NULL) {
- goto donothing;
- }
-
- ibex_index_buffer(f->index, f->name, in, len, &inleft);
-
- if (inleft>0) {
- camel_mime_filter_backup(mf, in+(len-inleft), inleft);
- }
-
- *out = in;
- *outlenptr = len-inleft;
- *outprespace = prespace;
- return;
-
-donothing:
- *out = in;
- *outlenptr = len;
- *outprespace = prespace;
-}
-
-static void
-camel_mime_filter_index_class_init (CamelMimeFilterIndexClass *klass)
-{
- CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass;
-
- camel_mime_filter_index_parent = CAMEL_MIME_FILTER_CLASS (camel_type_get_global_classfuncs (camel_mime_filter_get_type ()));
-
- /*filter_class->reset = reset;*/
- filter_class->filter = filter;
- filter_class->complete = complete;
-}
-
-/**
- * camel_mime_filter_index_new:
- *
- * Create a new CamelMimeFilterIndex object.
- *
- * Return value: A new CamelMimeFilterIndex widget.
- **/
-CamelMimeFilterIndex *
-camel_mime_filter_index_new (void)
-{
- CamelMimeFilterIndex *new = CAMEL_MIME_FILTER_INDEX ( camel_object_new (camel_mime_filter_index_get_type ()));
- return new;
-}
-
-CamelMimeFilterIndex *camel_mime_filter_index_new_ibex (ibex *index)
-{
- CamelMimeFilterIndex *new = camel_mime_filter_index_new();
-
- if (new) {
- new->index = index;
- new->name = g_strdup("");
- }
- return new;
-}
-
-/* Set the match name for any indexed words */
-void camel_mime_filter_index_set_name (CamelMimeFilterIndex *mf, char *name)
-{
- g_free(mf->name);
- mf->name = g_strdup(name);
-}
-
-void camel_mime_filter_index_set_ibex (CamelMimeFilterIndex *mf, ibex *index)
-{
- if (mf->index) {
- char *out;
- size_t outlen, outspace;
-
- camel_mime_filter_complete((CamelMimeFilter *)mf, "", 0, 0, &out, &outlen, &outspace);
- }
- mf->index = index;
-}
-
-
-
diff --git a/camel/camel-mime-filter-index.h b/camel/camel-mime-filter-index.h
deleted file mode 100644
index b0a9107852..0000000000
--- a/camel/camel-mime-filter-index.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_MIME_FILTER_INDEX_H
-#define _CAMEL_MIME_FILTER_INDEX_H
-
-#include <camel/camel-mime-filter.h>
-#include <libibex/ibex.h>
-
-#define CAMEL_MIME_FILTER_INDEX(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_index_get_type (), CamelMimeFilterIndex)
-#define CAMEL_MIME_FILTER_INDEX_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_index_get_type (), CamelMimeFilterIndexClass)
-#define IS_CAMEL_MIME_FILTER_INDEX(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_index_get_type ())
-
-typedef struct _CamelMimeFilterIndexClass CamelMimeFilterIndexClass;
-
-struct _CamelMimeFilterIndex {
- CamelMimeFilter parent;
-
- struct _CamelMimeFilterIndexPrivate *priv;
-
- ibex *index;
- char *name;
-};
-
-struct _CamelMimeFilterIndexClass {
- CamelMimeFilterClass parent_class;
-};
-
-guint camel_mime_filter_index_get_type (void);
-CamelMimeFilterIndex *camel_mime_filter_index_new (void);
-
-CamelMimeFilterIndex *camel_mime_filter_index_new_ibex (ibex *);
-
-/* Set the match name for any indexed words */
-void camel_mime_filter_index_set_name (CamelMimeFilterIndex *, char *);
-void camel_mime_filter_index_set_ibex (CamelMimeFilterIndex *mf, ibex *index);
-
-#endif /* ! _CAMEL_MIME_FILTER_INDEX_H */
diff --git a/camel/camel-mime-filter-save.c b/camel/camel-mime-filter-save.c
deleted file mode 100644
index e1761994ed..0000000000
--- a/camel/camel-mime-filter-save.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <sys/types.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include <string.h>
-#include <errno.h>
-
-#include "camel-mime-filter-save.h"
-
-static void camel_mime_filter_save_class_init (CamelMimeFilterSaveClass *klass);
-static void camel_mime_filter_save_init (CamelMimeFilterSave *obj);
-static void camel_mime_filter_save_finalize (CamelObject *o);
-
-static CamelMimeFilterClass *camel_mime_filter_save_parent;
-
-CamelType
-camel_mime_filter_save_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterSave",
- sizeof (CamelMimeFilterSave),
- sizeof (CamelMimeFilterSaveClass),
- (CamelObjectClassInitFunc) camel_mime_filter_save_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mime_filter_save_init,
- (CamelObjectFinalizeFunc) camel_mime_filter_save_finalize);
- }
-
- return type;
-}
-
-static void
-camel_mime_filter_save_finalize(CamelObject *o)
-{
- CamelMimeFilterSave *f = (CamelMimeFilterSave *)o;
-
- g_free(f->filename);
- if (f->fd != -1) {
- /* FIXME: what do we do with failed writes???? */
- close(f->fd);
- }
-}
-
-static void
-reset(CamelMimeFilter *mf)
-{
- CamelMimeFilterSave *f = (CamelMimeFilterSave *)mf;
-
- /* i dunno, how do you 'reset' a file? reopen it? do i care? */
- if (f->fd != -1){
- lseek(f->fd, 0, SEEK_SET);
- }
-}
-
-/* all this code just to support this little trivial filter! */
-static void
-filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace)
-{
- CamelMimeFilterSave *f = (CamelMimeFilterSave *)mf;
-
- if (f->fd != -1) {
- /* FIXME: check return */
- int outlen = write(f->fd, in, len);
- if (outlen != len) {
- g_warning("could not write to '%s': %s", f->filename?f->filename:"<descriptor>", strerror(errno));
- }
- }
- *out = in;
- *outlen = len;
- *outprespace = prespace;
-}
-
-static void
-camel_mime_filter_save_class_init (CamelMimeFilterSaveClass *klass)
-{
- CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass;
-
- camel_mime_filter_save_parent = CAMEL_MIME_FILTER_CLASS (camel_type_get_global_classfuncs (camel_mime_filter_get_type ()));
-
- filter_class->reset = reset;
- filter_class->filter = filter;
-}
-
-static void
-camel_mime_filter_save_init (CamelMimeFilterSave *f)
-{
- f->fd = -1;
-}
-
-/**
- * camel_mime_filter_save_new:
- *
- * Create a new CamelMimeFilterSave object.
- *
- * Return value: A new CamelMimeFilterSave widget.
- **/
-CamelMimeFilterSave *
-camel_mime_filter_save_new (void)
-{
- CamelMimeFilterSave *new = CAMEL_MIME_FILTER_SAVE ( camel_object_new (camel_mime_filter_save_get_type ()));
- return new;
-}
-
-CamelMimeFilterSave *
-camel_mime_filter_save_new_name (const char *name, int flags, int mode)
-{
- CamelMimeFilterSave *new = NULL;
-
- new = camel_mime_filter_save_new();
- if (new) {
- new->fd = open(name, flags, mode);
- if (new->fd != -1) {
- new->filename = g_strdup(name);
- } else {
- camel_object_unref((CamelObject *)new);
- new = NULL;
- }
- }
- return new;
-}
-
diff --git a/camel/camel-mime-filter-save.h b/camel/camel-mime-filter-save.h
deleted file mode 100644
index abc1bf1186..0000000000
--- a/camel/camel-mime-filter-save.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_MIME_FILTER_SAVE_H
-#define _CAMEL_MIME_FILTER_SAVE_H
-
-#include <camel/camel-mime-filter.h>
-
-#define CAMEL_MIME_FILTER_SAVE(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_save_get_type (), CamelMimeFilterSave)
-#define CAMEL_MIME_FILTER_SAVE_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_save_get_type (), CamelMimeFilterSaveClass)
-#define IS_CAMEL_MIME_FILTER_SAVE(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_save_get_type ())
-
-typedef struct _CamelMimeFilterSaveClass CamelMimeFilterSaveClass;
-
-struct _CamelMimeFilterSave {
- CamelMimeFilter parent;
-
- struct _CamelMimeFilterSavePrivate *priv;
-
- char *filename;
- int fd;
-};
-
-struct _CamelMimeFilterSaveClass {
- CamelMimeFilterClass parent_class;
-};
-
-guint camel_mime_filter_save_get_type (void);
-CamelMimeFilterSave *camel_mime_filter_save_new (void);
-
-CamelMimeFilterSave *camel_mime_filter_save_new_name (const char *name, int flags, int mode);
-
-#endif /* ! _CAMEL_MIME_FILTER_SAVE_H */
diff --git a/camel/camel-mime-filter.c b/camel/camel-mime-filter.c
deleted file mode 100644
index 678d450af2..0000000000
--- a/camel/camel-mime-filter.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "camel-mime-filter.h"
-
-struct _CamelMimeFilterPrivate {
- char *inbuf;
- size_t inlen;
-};
-
-#define PRE_HEAD (64)
-#define BACK_HEAD (64)
-#define _PRIVATE(o) (((CamelMimeFilter *)(o))->priv)
-#define FCLASS(o) ((CamelMimeFilterClass *)(CAMEL_OBJECT_GET_CLASS(o)))
-
-static CamelObjectClass *camel_mime_filter_parent;
-
-static void complete (CamelMimeFilter *mf, char *in, size_t len,
- size_t prespace, char **out, size_t *outlen,
- size_t *outprespace);
-
-static void
-camel_mime_filter_class_init (CamelMimeFilterClass *klass)
-{
- camel_mime_filter_parent = camel_type_get_global_classfuncs (camel_object_get_type ());
-
- klass->complete = complete;
-}
-
-static void
-camel_mime_filter_init (CamelMimeFilter *obj)
-{
- obj->outreal = NULL;
- obj->outbuf = NULL;
- obj->outsize = 0;
-
- obj->backbuf = NULL;
- obj->backsize = 0;
- obj->backlen = 0;
-
- _PRIVATE(obj) = g_malloc0(sizeof(*obj->priv));
-}
-
-static void
-camel_mime_filter_finalize(CamelObject *o)
-{
- CamelMimeFilter *f = (CamelMimeFilter *)o;
- struct _CamelMimeFilterPrivate *p = _PRIVATE(f);
-
- g_free(f->outreal);
- g_free(f->backbuf);
- g_free(p->inbuf);
- g_free(p);
-}
-
-CamelType
-camel_mime_filter_get_type (void)
-{
- static CamelType camel_mime_filter_type = CAMEL_INVALID_TYPE;
-
- if (camel_mime_filter_type == CAMEL_INVALID_TYPE) {
- camel_mime_filter_type = camel_type_register (CAMEL_OBJECT_TYPE, "CamelMimeFilter",
- sizeof (CamelMimeFilter),
- sizeof (CamelMimeFilterClass),
- (CamelObjectClassInitFunc) camel_mime_filter_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mime_filter_init,
- (CamelObjectFinalizeFunc) camel_mime_filter_finalize);
- }
-
- return camel_mime_filter_type;
-}
-
-static void
-complete(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace)
-{
- /* default - do nothing */
-}
-
-/**
- * camel_mime_filter_new:
- *
- * Create a new CamelMimeFilter object.
- *
- * Return value: A new CamelMimeFilter widget.
- **/
-CamelMimeFilter *
-camel_mime_filter_new (void)
-{
- CamelMimeFilter *new = CAMEL_MIME_FILTER ( camel_object_new (camel_mime_filter_get_type ()));
- return new;
-}
-
-static void filter_run(CamelMimeFilter *f,
- char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace,
- void (*filterfunc)(CamelMimeFilter *f,
- char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace))
-{
- struct _CamelMimeFilterPrivate *p;
-
- /*
- here we take a performance hit, if the input buffer doesn't
- have the pre-space required. We make a buffer that does ...
- */
- if (prespace < f->backlen) {
- int newlen = len+prespace+f->backlen;
- p = _PRIVATE(f);
- if (p->inlen < newlen) {
- /* NOTE: g_realloc copies data, we dont need that (slower) */
- g_free(p->inbuf);
- p->inbuf = g_malloc(newlen+PRE_HEAD);
- p->inlen = newlen+PRE_HEAD;
- }
- /* copy to end of structure */
- memcpy(p->inbuf+p->inlen - len, in, len);
- in = p->inbuf+p->inlen - len;
- prespace = p->inlen - len;
- }
-
- /* preload any backed up data */
- if (f->backlen > 0) {
- memcpy(in-f->backlen, f->backbuf, f->backlen);
- in -= f->backlen;
- len += f->backlen;
- prespace -= f->backlen;
- f->backlen = 0;
- }
-
- filterfunc(f, in, len, prespace, out, outlen, outprespace);
-}
-
-void camel_mime_filter_filter(CamelMimeFilter *f,
- char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace)
-{
- if (FCLASS(f)->filter)
- filter_run(f, in, len, prespace, out, outlen, outprespace, FCLASS(f)->filter);
- else
- g_error("Filter function unplmenented in class");
-}
-
-void camel_mime_filter_complete(CamelMimeFilter *f,
- char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace)
-{
- if (FCLASS(f)->complete)
- filter_run(f, in, len, prespace, out, outlen, outprespace, FCLASS(f)->complete);
-}
-
-void camel_mime_filter_reset(CamelMimeFilter *f)
-{
- if (FCLASS(f)->reset) {
- FCLASS(f)->reset(f);
- }
-
- /* could free some buffers, if they are really big? */
- f->backlen = 0;
-}
-
-/* sets number of bytes backed up on the input, new calls replace previous ones */
-void camel_mime_filter_backup(CamelMimeFilter *f, const char *data, size_t length)
-{
- if (f->backsize < length) {
- /* g_realloc copies data, unnecessary overhead */
- g_free(f->backbuf);
- f->backbuf = g_malloc(length+BACK_HEAD);
- f->backsize = length+BACK_HEAD;
- }
- f->backlen = length;
- memcpy(f->backbuf, data, length);
-}
-
-/* ensure this much size available for filter output (if required) */
-void camel_mime_filter_set_size(CamelMimeFilter *f, size_t size, int keep)
-{
- if (f->outsize < size) {
- int offset = f->outptr - f->outreal;
- if (keep) {
- f->outreal = g_realloc(f->outreal, size + PRE_HEAD*4);
- } else {
- g_free(f->outreal);
- f->outreal = g_malloc(size + PRE_HEAD*4);
- }
- f->outptr = f->outreal + offset;
- f->outbuf = f->outreal + PRE_HEAD*4;
- f->outsize = size;
- /* this could be offset from the end of the structure, but
- this should be good enough */
- f->outpre = PRE_HEAD*4;
- }
-}
-
diff --git a/camel/camel-mime-filter.h b/camel/camel-mime-filter.h
deleted file mode 100644
index 65d8590fa5..0000000000
--- a/camel/camel-mime-filter.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/* Abstract class for non-copying filters */
-
-#ifndef _CAMEL_MIME_FILTER_H
-#define _CAMEL_MIME_FILTER_H
-
-#include <camel/camel-object.h>
-#include <sys/types.h>
-
-#define CAMEL_MIME_FILTER_TYPE (camel_mime_filter_get_type ())
-#define CAMEL_MIME_FILTER(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_get_type (), CamelMimeFilter)
-#define CAMEL_MIME_FILTER_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_get_type (), CamelMimeFilterClass)
-#define IS_CAMEL_MIME_FILTER(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_get_type ())
-
-typedef struct _CamelMimeFilterClass CamelMimeFilterClass;
-
-struct _CamelMimeFilter {
- CamelObject parent;
-
- struct _CamelMimeFilterPrivate *priv;
-
- char *outreal; /* real malloc'd buffer */
- char *outbuf; /* first 'writable' position allowed (outreal + outpre) */
- char *outptr;
- int outsize;
- int outpre; /* prespace of this buffer */
-
- char *backbuf;
- int backsize;
- int backlen; /* significant data there */
-};
-
-struct _CamelMimeFilterClass {
- CamelObjectClass parent_class;
-
- /* virtual functions */
- void (*filter)(CamelMimeFilter *f,
- char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace);
- void (*complete)(CamelMimeFilter *f,
- char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace);
- void (*reset)(CamelMimeFilter *f);
-};
-
-CamelType camel_mime_filter_get_type (void);
-CamelMimeFilter *camel_mime_filter_new (void);
-
-void camel_mime_filter_filter(CamelMimeFilter *f,
- char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace);
-
-void camel_mime_filter_complete(CamelMimeFilter *f,
- char *in, size_t len, size_t prespace,
- char **out, size_t *outlen, size_t *outprespace);
-
-void camel_mime_filter_reset(CamelMimeFilter *f);
-
-/* sets/returns number of bytes backed up on the input */
-void camel_mime_filter_backup(CamelMimeFilter *f, const char *data, size_t length);
-
-/* ensure this much size available for filter output */
-void camel_mime_filter_set_size(CamelMimeFilter *f, size_t size, int keep);
-
-#endif /* ! _CAMEL_MIME_FILTER_H */
diff --git a/camel/camel-mime-message.c b/camel/camel-mime-message.c
deleted file mode 100644
index d8f61facc4..0000000000
--- a/camel/camel-mime-message.c
+++ /dev/null
@@ -1,532 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-mime-message.c : class for a mime_message */
-
-/*
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include "camel-mime-message.h"
-#include <stdio.h>
-#include "gmime-content-field.h"
-#include "string-utils.h"
-#include "hash-table-utils.h"
-
-#define d(x)
-
-/* these 2 below should be kept in sync */
-typedef enum {
- HEADER_UNKNOWN,
- HEADER_FROM,
- HEADER_REPLY_TO,
- HEADER_SUBJECT,
- HEADER_TO,
- HEADER_CC,
- HEADER_BCC,
- HEADER_DATE
-} CamelHeaderType;
-
-static char *header_names[] = {
- /* dont include HEADER_UNKNOWN string */
- "From", "Reply-To", "Subject", "To", "Cc", "Bcc", "Date", NULL
-};
-
-static GHashTable *header_name_table;
-
-static CamelMimePartClass *parent_class=NULL;
-
-static char *recipient_names[] = {
- "To", "Cc", "Bcc", NULL
-};
-
-static int write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream);
-static void add_header (CamelMedium *medium, const char *header_name, const void *header_value);
-static void set_header (CamelMedium *medium, const char *header_name, const void *header_value);
-static void remove_header (CamelMedium *medium, const char *header_name);
-static int construct_from_parser (CamelMimePart *, CamelMimeParser *);
-static void g_lib_is_uber_crappy_shit(gpointer whocares, gpointer getlost, gpointer blah);
-
-/* Returns the class for a CamelMimeMessage */
-#define CMM_CLASS(so) CAMEL_MIME_MESSAGE_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CMD_CLASS(so) CAMEL_MEDIUM_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static void
-camel_mime_message_class_init (CamelMimeMessageClass *camel_mime_message_class)
-{
- CamelDataWrapperClass *camel_data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_mime_message_class);
- CamelMimePartClass *camel_mime_part_class = CAMEL_MIME_PART_CLASS (camel_mime_message_class);
- CamelMediumClass *camel_medium_class = CAMEL_MEDIUM_CLASS (camel_mime_message_class);
- int i;
-
- parent_class = CAMEL_MIME_PART_CLASS(camel_type_get_global_classfuncs (camel_mime_part_get_type ()));
-
- header_name_table = g_hash_table_new (g_strcase_hash, g_strcase_equal);
- for (i=0;header_names[i];i++)
- g_hash_table_insert (header_name_table, header_names[i], (gpointer)i+1);
-
- /* virtual method overload */
- camel_data_wrapper_class->write_to_stream = write_to_stream;
-
- camel_medium_class->add_header = add_header;
- camel_medium_class->set_header = set_header;
- camel_medium_class->remove_header = remove_header;
-
- camel_mime_part_class->construct_from_parser = construct_from_parser;
-}
-
-
-
-
-static void
-camel_mime_message_init (gpointer object, gpointer klass)
-{
- CamelMimeMessage *mime_message = (CamelMimeMessage *)object;
- int i;
-
- camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (object), "message/rfc822");
-
- mime_message->recipients = g_hash_table_new(g_strcase_hash, g_strcase_equal);
- for (i=0;recipient_names[i];i++) {
- g_hash_table_insert(mime_message->recipients, recipient_names[i], camel_internet_address_new());
- }
-
- mime_message->subject = NULL;
- mime_message->reply_to = NULL;
- mime_message->from = NULL;
- mime_message->date = CAMEL_MESSAGE_DATE_CURRENT;
- mime_message->date_offset = 0;
- mime_message->date_str = NULL;
-}
-
-static void
-camel_mime_message_finalize (CamelObject *object)
-{
- CamelMimeMessage *message = CAMEL_MIME_MESSAGE (object);
-
- g_free (message->date_str);
- g_free (message->subject);
- g_free (message->reply_to);
- g_free (message->from);
-
- g_hash_table_foreach (message->recipients, g_lib_is_uber_crappy_shit, NULL);
- g_hash_table_destroy(message->recipients);
-}
-
-
-CamelType
-camel_mime_message_get_type (void)
-{
- static CamelType camel_mime_message_type = CAMEL_INVALID_TYPE;
-
- if (camel_mime_message_type == CAMEL_INVALID_TYPE) {
- camel_mime_message_type = camel_type_register (camel_mime_part_get_type(), "CamelMimeMessage",
- sizeof (CamelMimeMessage),
- sizeof (CamelMimeMessageClass),
- (CamelObjectClassInitFunc) camel_mime_message_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mime_message_init,
- (CamelObjectFinalizeFunc) camel_mime_message_finalize);
- }
-
- return camel_mime_message_type;
-}
-
-/* annoying way to free objects in a hashtable, i mean, its not like anyone
- would want to store them in a hashtable, really */
-/* peterw: somebody's not bitter :-) */
-static void g_lib_is_uber_crappy_shit(gpointer whocares, gpointer getlost, gpointer blah)
-{
- camel_object_unref((CamelObject *)getlost);
-}
-
-
-
-CamelMimeMessage *
-camel_mime_message_new (void)
-{
- CamelMimeMessage *mime_message;
- mime_message = CAMEL_MIME_MESSAGE(camel_object_new (CAMEL_MIME_MESSAGE_TYPE));
-
- return mime_message;
-}
-
-
-/* **** Date: */
-
-void
-camel_mime_message_set_date(CamelMimeMessage *message, time_t date, int offset)
-{
- g_assert(message);
- if (date == CAMEL_MESSAGE_DATE_CURRENT) {
- struct tm *local;
- int tz;
-
- date = time(0);
- local = localtime(&date);
- offset = 0;
-#if defined(HAVE_TIMEZONE)
- tz = timezone;
-#elif defined(HAVE_TM_GMTOFF)
- tz = local->tm_gmtoff;
-#endif
- offset = ((tz/60/60) * 100) + (tz/60 % 60);
- }
- message->date = date;
- message->date_offset = offset;
- g_free(message->date_str);
- message->date_str = header_format_date(date, offset);
-
- CAMEL_MEDIUM_CLASS(parent_class)->set_header((CamelMedium *)message, "Date", message->date_str);
-}
-
-void
-camel_mime_message_get_date(CamelMimeMessage *message, time_t *date, int *offset)
-{
- if (message->date == CAMEL_MESSAGE_DATE_CURRENT)
- camel_mime_message_set_date(message, CAMEL_MESSAGE_DATE_CURRENT, 0);
- if (date)
- *date = message->date;
- if (offset)
- *offset = message->date_offset;
-}
-
-char *
-camel_mime_message_get_date_string(CamelMimeMessage *message)
-{
- if (message->date == CAMEL_MESSAGE_DATE_CURRENT)
- camel_mime_message_set_date(message, CAMEL_MESSAGE_DATE_CURRENT, 0);
- return message->date_str;
-}
-
-/* **** Reply-To: */
-
-void
-camel_mime_message_set_reply_to (CamelMimeMessage *mime_message, const gchar *reply_to)
-{
- g_assert (mime_message);
-
- /* FIXME: check format of string, handle it nicer ... */
-
- g_free(mime_message->reply_to);
- mime_message->reply_to = g_strdup(reply_to);
- CAMEL_MEDIUM_CLASS(parent_class)->set_header((CamelMedium *)mime_message, "Reply-To", reply_to);
-}
-
-const gchar *
-camel_mime_message_get_reply_to (CamelMimeMessage *mime_message)
-{
- g_assert (mime_message);
-
- return mime_message->reply_to;
-}
-
-void
-camel_mime_message_set_subject (CamelMimeMessage *mime_message,
- const gchar *subject)
-{
- char *text;
- g_assert (mime_message);
-
- g_free(mime_message->subject);
- mime_message->subject = g_strstrip (g_strdup (subject));
- text = header_encode_string(subject);
- CAMEL_MEDIUM_CLASS(parent_class)->set_header((CamelMedium *)mime_message, "Subject", text);
- g_free(text);
-}
-
-const gchar *
-camel_mime_message_get_subject (CamelMimeMessage *mime_message)
-{
- g_assert (mime_message);
-
- return mime_message->subject;
-}
-
-/* *** From: */
-void
-camel_mime_message_set_from (CamelMimeMessage *mime_message, const gchar *from)
-{
- g_assert (mime_message);
-
- g_free(mime_message->from);
- mime_message->from = g_strdup(from);
- CAMEL_MEDIUM_CLASS(parent_class)->set_header((CamelMedium *)mime_message, "From", from);
-}
-
-const gchar *
-camel_mime_message_get_from (CamelMimeMessage *mime_message)
-{
- g_assert (mime_message);
-
- return mime_message->from;
-}
-
-/* **** */
-
-void
-camel_mime_message_add_recipient (CamelMimeMessage *mime_message,
- const gchar *type,
- const gchar *name, const char *address)
-{
- CamelInternetAddress *addr;
- char *text;
-
- g_assert (mime_message);
-
- addr = g_hash_table_lookup(mime_message->recipients, type);
- if (addr == NULL) {
- g_warning("trying to add a non-valid receipient type: %s = %s %s", type, name, address);
- return;
- }
-
- camel_internet_address_add(addr, name, address);
-
- /* FIXME: maybe this should be delayed till we're ready to write out? */
- text = camel_address_encode((CamelAddress*)addr);
- CAMEL_MEDIUM_CLASS(parent_class)->set_header((CamelMedium *)mime_message, type, text);
- g_free(text);
-}
-
-void
-camel_mime_message_remove_recipient_address (CamelMimeMessage *mime_message,
- const gchar *type,
- const gchar *address)
-{
- CamelInternetAddress *addr;
- int index;
- char *text;
-
-
- g_assert (mime_message);
-
- addr = g_hash_table_lookup(mime_message->recipients, type);
- if (addr == NULL) {
- g_warning("trying to remove a non-valid receipient type: %s = %s", type, address);
- return;
- }
- index = camel_internet_address_find_address(addr, address, NULL);
- if (index == -1) {
- g_warning("trying to remove address for nonexistand address: %s", address);
- return;
- }
-
- camel_address_remove((CamelAddress *)addr, index);
-
- /* FIXME: maybe this should be delayed till we're ready to write out? */
- text = camel_address_encode((CamelAddress *)addr);
- CAMEL_MEDIUM_CLASS(parent_class)->set_header((CamelMedium *)mime_message, type, text);
- g_free(text);
-}
-
-void
-camel_mime_message_remove_recipient_name (CamelMimeMessage *mime_message,
- const gchar *type,
- const gchar *name)
-{
- CamelInternetAddress *addr;
- int index;
- char *text;
-
- g_assert (mime_message);
-
- addr = g_hash_table_lookup(mime_message->recipients, type);
- if (addr == NULL) {
- g_warning("trying to remove a non-valid receipient type: %s = %s", type, name);
- return;
- }
- index = camel_internet_address_find_name(addr, name, NULL);
- if (index == -1) {
- g_warning("trying to remove address for nonexistand name: %s", name);
- return;
- }
-
- camel_address_remove((CamelAddress *)addr, index);
-
- /* FIXME: maybe this should be delayed till we're ready to write out? */
- text = camel_address_encode((CamelAddress *)addr);
- CAMEL_MEDIUM_CLASS(parent_class)->set_header((CamelMedium *)mime_message, type, text);
- g_free(text);
-}
-
-const CamelInternetAddress *
-camel_mime_message_get_recipients (CamelMimeMessage *mime_message,
- const gchar *type)
-{
- g_assert (mime_message);
-
- return g_hash_table_lookup(mime_message->recipients, type);
-}
-
-
-
-/* mime_message */
-static int
-construct_from_parser(CamelMimePart *dw, CamelMimeParser *mp)
-{
- char *buf;
- int len;
- int state;
- int ret;
-
- d(printf("constructing mime-message\n"));
-
- d(printf("mime_message::construct_from_parser()\n"));
-
- /* let the mime-part construct the guts ... */
- ret = ((CamelMimePartClass *)parent_class)->construct_from_parser(dw, mp);
-
- if (ret == -1)
- return -1;
-
- /* ... then clean up the follow-on state */
- state = camel_mime_parser_step(mp, &buf, &len);
- switch (state) {
- case HSCAN_EOF: case HSCAN_FROM_END: /* these doesn't belong to us */
- camel_mime_parser_unstep(mp);
- case HSCAN_MESSAGE_END:
- break;
- default:
- g_error("Bad parser state: Expecing MESSAGE_END or EOF or EOM, got: %d", camel_mime_parser_state(mp));
- camel_mime_parser_unstep(mp);
- return -1;
- }
-
- d(printf("mime_message::construct_from_parser() leaving\n"));
-#ifndef NO_WARNINGS
-#warning "return a real error code"
-#endif
- return 0;
-}
-
-static int
-write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream)
-{
- CamelMimeMessage *mm = CAMEL_MIME_MESSAGE (data_wrapper);
-
- /* force mandatory headers ... */
- if (mm->from == NULL) {
- g_warning("No from set for message");
- camel_mime_message_set_from(mm, "");
- }
- if (mm->date_str == NULL) {
- g_warning("Application did not set date, using 'now'");
- camel_mime_message_set_date(mm, CAMEL_MESSAGE_DATE_CURRENT, 0);
- }
- if (mm->subject == NULL) {
- g_warning("Application did not set subject, creating one");
- camel_mime_message_set_subject(mm, "No Subject");
- }
-
- /* FIXME: "To" header needs to be set explicitly as well ... */
-
- if (!camel_medium_get_header ((CamelMedium *)mm, "Mime-Version"))
- camel_medium_set_header((CamelMedium *)mm, "Mime-Version", "1.0");
-
- return CAMEL_DATA_WRAPPER_CLASS (parent_class)->write_to_stream (data_wrapper, stream);
-}
-
-static char *
-format_address(const char *text)
-{
- struct _header_address *addr;
- char *ret;
-
- addr = header_address_decode(text);
- if (addr) {
- ret = header_address_list_format(addr);
- header_address_list_clear(&addr);
- } else {
- ret = g_strdup(text);
- }
- return ret;
-}
-
-/* FIXME: check format of fields. */
-static gboolean
-process_header(CamelMedium *medium, const char *header_name, const char *header_value)
-{
- CamelHeaderType header_type;
- CamelMimeMessage *message = CAMEL_MIME_MESSAGE (medium);
- CamelInternetAddress *addr;
-
- header_type = (CamelHeaderType) g_hash_table_lookup (header_name_table, header_name);
- switch (header_type) {
- case HEADER_FROM:
- g_free(message->from);
- message->from = format_address(header_value);
- break;
- case HEADER_REPLY_TO:
- g_free(message->reply_to);
- message->reply_to = format_address(header_value);
- break;
- case HEADER_SUBJECT:
- g_free(message->subject);
- message->subject = g_strstrip (header_decode_string(header_value));
- break;
- case HEADER_TO:
- case HEADER_CC:
- case HEADER_BCC:
- addr = g_hash_table_lookup(message->recipients, header_name);
- if (header_value)
- camel_address_decode((CamelAddress *)addr, header_value);
- else
- camel_address_remove((CamelAddress *)addr, -1);
- break;
- case HEADER_DATE:
- g_free(message->date_str);
- message->date_str = g_strdup(header_value);
- if (header_value) {
- message->date = header_decode_date(header_value, &message->date_offset);
- } else {
- message->date = CAMEL_MESSAGE_DATE_CURRENT;
- }
- break;
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-static void
-set_header(CamelMedium *medium, const char *header_name, const void *header_value)
-{
- process_header(medium, header_name, header_value);
- parent_class->parent_class.set_header (medium, header_name, header_value);
-}
-
-static void
-add_header(CamelMedium *medium, const char *header_name, const void *header_value)
-{
- /* if we process it, then it must be forced unique as well ... */
- if (process_header(medium, header_name, header_value))
- parent_class->parent_class.set_header (medium, header_name, header_value);
- else
- parent_class->parent_class.add_header (medium, header_name, header_value);
-}
-
-static void
-remove_header(CamelMedium *medium, const char *header_name)
-{
- process_header(medium, header_name, NULL);
- parent_class->parent_class.remove_header (medium, header_name);
-}
-
diff --git a/camel/camel-mime-message.h b/camel/camel-mime-message.h
deleted file mode 100644
index 7e90d7cbcc..0000000000
--- a/camel/camel-mime-message.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camelMimeMessage.h : class for a mime message
- *
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_MIME_MESSAGE_H
-#define CAMEL_MIME_MESSAGE_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-mime-part.h>
-#include <camel/camel-mime-utils.h>
-#include <camel/camel-internet-address.h>
-
-#define CAMEL_RECIPIENT_TYPE_TO "To"
-#define CAMEL_RECIPIENT_TYPE_CC "Cc"
-#define CAMEL_RECIPIENT_TYPE_BCC "Bcc"
-
-
-#define CAMEL_MIME_MESSAGE_TYPE (camel_mime_message_get_type ())
-#define CAMEL_MIME_MESSAGE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MIME_MESSAGE_TYPE, CamelMimeMessage))
-#define CAMEL_MIME_MESSAGE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MIME_MESSAGE_TYPE, CamelMimeMessageClass))
-#define CAMEL_IS_MIME_MESSAGE(o) (CAMEL_CHECK_TYPE((o), CAMEL_MIME_MESSAGE_TYPE))
-
-
-/* specify local time */
-#define CAMEL_MESSAGE_DATE_CURRENT (~0)
-
-struct _CamelMimeMessage
-{
- CamelMimePart parent_object;
-
- /* header fields */
- time_t date;
- int date_offset; /* GMT offset */
- char *date_str; /* cached copy of date string */
-
- gchar *subject;
- gchar *reply_to;
-
- gchar *from;
-
- GHashTable *recipients; /* hash table of CamelInternetAddress's */
-};
-
-typedef struct {
- CamelMimePartClass parent_class;
-
- /* Virtual methods */
-
-} CamelMimeMessageClass;
-
-
-
-/* Standard Camel function */
-CamelType camel_mime_message_get_type (void);
-
-
-/* public methods */
-CamelMimeMessage * camel_mime_message_new (void);
-
-
-void camel_mime_message_set_date (CamelMimeMessage *mime_message, time_t date, int offset);
-void camel_mime_message_get_date (CamelMimeMessage *mime_message, time_t *date, int *offset);
-char *camel_mime_message_get_date_string (CamelMimeMessage *mime_message);
-
-const gchar * camel_mime_message_get_received_date (CamelMimeMessage *mime_message);
-const gchar * camel_mime_message_get_sent_date (CamelMimeMessage *mime_message);
-void camel_mime_message_set_reply_to (CamelMimeMessage *mime_message,
- const gchar *reply_to);
-const gchar * camel_mime_message_get_reply_to (CamelMimeMessage *mime_message);
-void camel_mime_message_set_subject (CamelMimeMessage *mime_message,
- const gchar *subject);
-const gchar * camel_mime_message_get_subject (CamelMimeMessage *mime_message);
-void camel_mime_message_set_from (CamelMimeMessage *mime_message,
- const gchar *from);
-const gchar * camel_mime_message_get_from (CamelMimeMessage *mime_message);
-
-
-void camel_mime_message_add_recipient (CamelMimeMessage *mime_message,
- const char *type, const char *name, const char *address);
-void camel_mime_message_remove_recipient_address (CamelMimeMessage *mime_message,
- const char *type, const char *address);
-void camel_mime_message_remove_recipient_name (CamelMimeMessage *mime_message,
- const char *type, const char *name);
-
-const CamelInternetAddress *camel_mime_message_get_recipients (CamelMimeMessage *mime_message,
- const char *type);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MIME_MESSAGE_H */
diff --git a/camel/camel-mime-parser.c b/camel/camel-mime-parser.c
deleted file mode 100644
index 9599e5bde2..0000000000
--- a/camel/camel-mime-parser.c
+++ /dev/null
@@ -1,1791 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/* What should hopefully be a fast mail parser */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-#include <string.h>
-
-#include <stdio.h>
-#include <errno.h>
-
-#include <unicode.h>
-
-#include <regex.h>
-#include <ctype.h>
-
-#include <glib.h>
-#include "camel-mime-parser.h"
-#include "camel-mime-utils.h"
-#include "camel-mime-filter.h"
-#include "camel-stream.h"
-#include "camel-seekable-stream.h"
-
-#define r(x)
-#define h(x)
-#define c(x)
-#define d(x)
-
-/*#define PURIFY*/
-
-#define MEMPOOL
-
-#define STRUCT_ALIGN 4
-
-#ifdef PURIFY
-int inend_id = -1,
- inbuffer_id = -1;
-#endif
-
-#if 0
-extern int strdup_count;
-extern int malloc_count;
-extern int free_count;
-
-#define g_strdup(x) (strdup_count++, g_strdup(x))
-#define g_malloc(x) (malloc_count++, g_malloc(x))
-#define g_free(x) (free_count++, g_free(x))
-#endif
-
-#ifdef MEMPOOL
-typedef struct _MemPoolNode {
- struct _MemPoolNode *next;
-
- int free;
- char data[1];
-} MemPoolNode;
-
-typedef struct _MemPoolThresholdNode {
- struct _MemPoolThresholdNode *next;
- char data[1];
-} MemPoolThresholdNode;
-
-typedef struct _MemPool {
- int blocksize;
- int threshold;
- struct _MemPoolNode *blocks;
- struct _MemPoolThresholdNode *threshold_blocks;
-} MemPool;
-
-MemPool *mempool_new(int blocksize, int threshold);
-void *mempool_alloc(MemPool *pool, int size);
-void mempool_flush(MemPool *pool, int freeall);
-void mempool_free(MemPool *pool);
-
-MemPool *mempool_new(int blocksize, int threshold)
-{
- MemPool *pool;
-
- pool = g_malloc(sizeof(*pool));
- if (threshold >= blocksize)
- threshold = blocksize * 2 / 3;
- pool->blocksize = blocksize;
- pool->threshold = threshold;
- pool->blocks = NULL;
- pool->threshold_blocks = NULL;
- return pool;
-}
-
-void *mempool_alloc(MemPool *pool, int size)
-{
- size = (size + STRUCT_ALIGN) & (~(STRUCT_ALIGN-1));
- if (size>=pool->threshold) {
- MemPoolThresholdNode *n;
-
- n = g_malloc(sizeof(*n) - sizeof(char) + size);
- n->next = pool->threshold_blocks;
- pool->threshold_blocks = n;
- return &n->data[0];
- } else {
- MemPoolNode *n;
-
- n = pool->blocks;
- while (n) {
- if (n->free >= size) {
- n->free -= size;
- return &n->data[n->free];
- }
- n = n->next;
- }
-
- n = g_malloc(sizeof(*n) - sizeof(char) + pool->blocksize);
- n->next = pool->blocks;
- pool->blocks = n;
- n->free = pool->blocksize - size;
- return &n->data[n->free];
- }
-}
-
-void mempool_flush(MemPool *pool, int freeall)
-{
- MemPoolThresholdNode *tn, *tw;
- MemPoolNode *pw, *pn;
-
- tw = pool->threshold_blocks;
- while (tw) {
- tn = tw->next;
- g_free(tw);
- tw = tn;
- }
- pool->threshold_blocks = NULL;
-
- if (freeall) {
- pw = pool->blocks;
- while (pw) {
- pn = pw->next;
- g_free(pw);
- pw = pn;
- }
- pool->blocks = NULL;
- } else {
- pw = pool->blocks;
- while (pw) {
- pw->free = pool->blocksize;
- pw = pw->next;
- }
- }
-}
-
-void mempool_free(MemPool *pool)
-{
- if (pool) {
- mempool_flush(pool, 1);
- g_free(pool);
- }
-}
-
-#endif
-
-
-
-
-
-
-
-
-
-
-
-
-#define SCAN_BUF 4096 /* size of read buffer */
-#define SCAN_HEAD 128 /* headroom guaranteed to be before each read buffer */
-
-/* a little hacky, but i couldn't be bothered renaming everything */
-#define _header_scan_state _CamelMimeParserPrivate
-#define _PRIVATE(o) (((CamelMimeParser *)(o))->priv)
-
-struct _header_scan_state {
-
- /* global state */
-
- enum _header_state state;
-
- /* for building headers during scanning */
- char *outbuf;
- char *outptr;
- char *outend;
-
- int fd; /* input for a fd input */
- CamelStream *stream; /* or for a stream */
-
- /* for scanning input buffers */
- char *realbuf; /* the real buffer, SCAN_HEAD*2 + SCAN_BUF bytes */
- char *inbuf; /* points to a subset of the allocated memory, the underflow */
- char *inptr; /* (upto SCAN_HEAD) is for use by filters so they dont copy all data */
- char *inend;
-
- int atleast;
-
- int seek; /* current offset to start of buffer */
- int unstep; /* how many states to 'unstep' (repeat the current state) */
-
- int midline; /* are we mid-line interrupted? */
- int scan_from; /* do we care about From lines? */
-
- int start_of_from; /* where from started */
- int start_of_headers; /* where headers started from the last scan */
-
- int header_start; /* start of last header, or -1 */
-
- struct _header_scan_stack *top_part; /* top of message header */
- int top_start; /* offset of start */
-
- struct _header_scan_stack *pending; /* if we're pending part info, from the wrong part end */
-
- /* filters to apply to all content before output */
- int filterid; /* id of next filter */
- struct _header_scan_filter *filters;
-
- /* per message/part info */
- struct _header_scan_stack *parts;
-
-};
-
-struct _header_scan_stack {
- struct _header_scan_stack *parent;
-
- enum _header_state savestate; /* state at invocation of this part */
-
-#ifdef MEMPOOL
- MemPool *pool; /* memory pool to keep track of headers/etc at this level */
-#endif
- struct _header_raw *headers; /* headers for this part */
-
- struct _header_content_type *content_type;
-
- char *boundary; /* for multipart/ * boundaries, including leading -- and trailing -- for the final part */
- int boundarylen; /* length of boundary, including leading -- */
-};
-
-struct _header_scan_filter {
- struct _header_scan_filter *next;
- int id;
- CamelMimeFilter *filter;
-};
-
-static void folder_scan_step(struct _header_scan_state *s, char **databuffer, int *datalength);
-static void folder_scan_drop_step(struct _header_scan_state *s);
-static int folder_scan_init_with_fd(struct _header_scan_state *s, int fd);
-static int folder_scan_init_with_stream(struct _header_scan_state *s, CamelStream *stream);
-static struct _header_scan_state *folder_scan_init(void);
-static void folder_scan_close(struct _header_scan_state *s);
-static struct _header_scan_stack *folder_scan_content(struct _header_scan_state *s, int *lastone, char **data, int *length);
-static struct _header_scan_stack *folder_scan_header(struct _header_scan_state *s, int *lastone);
-static int folder_scan_skip_line(struct _header_scan_state *s);
-static off_t folder_seek(struct _header_scan_state *s, off_t offset, int whence);
-static off_t folder_tell(struct _header_scan_state *s);
-#ifdef MEMPOOL
-static void header_append_mempool(struct _header_scan_state *s, struct _header_scan_stack *h, char *header, int offset);
-#endif
-
-static void camel_mime_parser_class_init (CamelMimeParserClass *klass);
-static void camel_mime_parser_init (CamelMimeParser *obj);
-
-#if d(!)0
-static char *states[] = {
- "HSCAN_INITIAL",
- "HSCAN_FROM", /* got 'From' line */
- "HSCAN_HEADER", /* toplevel header */
- "HSCAN_BODY", /* scanning body of message */
- "HSCAN_MULTIPART", /* got multipart header */
- "HSCAN_MESSAGE", /* rfc822/news message */
-
- "HSCAN_PART", /* part of a multipart */
- "<invalid>",
-
- "HSCAN_EOF", /* end of file */
- "HSCAN_FROM_END",
- "HSCAN_HEAER_END",
- "HSCAN_BODY_END",
- "HSCAN_MULTIPART_END",
- "HSCAN_MESSAGE_END",
-};
-#endif
-
-
-static CamelObjectClass *camel_mime_parser_parent;
-
-static void
-camel_mime_parser_class_init (CamelMimeParserClass *klass)
-{
- camel_mime_parser_parent = camel_type_get_global_classfuncs (camel_object_get_type ());
-}
-
-static void
-camel_mime_parser_init (CamelMimeParser *obj)
-{
- struct _header_scan_state *s;
-
- s = folder_scan_init();
- _PRIVATE(obj) = s;
-}
-
-static void
-camel_mime_parser_finalize(CamelObject *o)
-{
- struct _header_scan_state *s = _PRIVATE(o);
-#ifdef PURIFY
- purify_watch_remove_all();
-#endif
- folder_scan_close(s);
-}
-
-CamelType
-camel_mime_parser_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_object_get_type (), "CamelMimeParser",
- sizeof (CamelMimeParser),
- sizeof (CamelMimeParserClass),
- (CamelObjectClassInitFunc) camel_mime_parser_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mime_parser_init,
- (CamelObjectFinalizeFunc) camel_mime_parser_finalize);
- }
-
- return type;
-}
-
-/**
- * camel_mime_parser_new:
- *
- * Create a new CamelMimeParser object.
- *
- * Return value: A new CamelMimeParser widget.
- **/
-CamelMimeParser *
-camel_mime_parser_new (void)
-{
- CamelMimeParser *new = CAMEL_MIME_PARSER ( camel_object_new (camel_mime_parser_get_type ()));
- return new;
-}
-
-
-/**
- * camel_mime_parser_filter_add:
- * @m:
- * @mf:
- *
- * Add a filter that will be applied to any body content before it is passed
- * to the caller. Filters may be pipelined to perform multi-pass operations
- * on the content, and are applied in the order they were added.
- *
- * Note that filters are only applied to the body content of messages, and once
- * a filter has been set, all content returned by a filter_step() with a state
- * of HSCAN_BODY will have passed through the filter.
- *
- * Return value: An id that may be passed to filter_remove() to remove
- * the filter, or -1 if the operation failed.
- **/
-int
-camel_mime_parser_filter_add(CamelMimeParser *m, CamelMimeFilter *mf)
-{
- struct _header_scan_state *s = _PRIVATE(m);
- struct _header_scan_filter *f, *new;
-
- new = g_malloc(sizeof(*new));
- new->filter = mf;
- new->id = s->filterid++;
- if (s->filterid == -1)
- s->filterid++;
- new->next = 0;
- camel_object_ref((CamelObject *)mf);
-
- /* yes, this is correct, since 'next' is the first element of the struct */
- f = (struct _header_scan_filter *)&s->filters;
- while (f->next)
- f = f->next;
- f->next = new;
- return new->id;
-}
-
-/**
- * camel_mime_parser_filter_remove:
- * @m:
- * @id:
- *
- * Remove a processing filter from the pipeline. There is no
- * restriction on the order the filters can be removed.
- **/
-void
-camel_mime_parser_filter_remove(CamelMimeParser *m, int id)
-{
- struct _header_scan_state *s = _PRIVATE(m);
- struct _header_scan_filter *f, *old;
-
- f = (struct _header_scan_filter *)&s->filters;
- while (f && f->next) {
- old = f->next;
- if (old->id == id) {
- camel_object_unref((CamelObject *)old->filter);
- f->next = old->next;
- g_free(old);
- /* there should only be a single matching id, but
- scan the whole lot anyway */
- }
- f = f->next;
- }
-}
-
-/**
- * camel_mime_parser_header:
- * @m:
- * @name: Name of header.
- * @offset: Pointer that can receive the offset of the header in
- * the stream from the start of parsing.
- *
- * Lookup a header by name.
- *
- * Return value: The header value, or NULL if the header is not
- * defined.
- **/
-const char *
-camel_mime_parser_header(CamelMimeParser *m, const char *name, int *offset)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- if (s->parts &&
- s->parts->headers) {
- return header_raw_find(&s->parts->headers, name, offset);
- }
- return NULL;
-}
-
-/**
- * camel_mime_parser_headers_raw:
- * @m:
- *
- * Get the list of the raw headers which are defined for the
- * current state of the parser. These headers are valid
- * until the next call to parser_step(), or parser_drop_step().
- *
- * Return value: The raw headers, or NULL if there are no headers
- * defined for the current part or state. These are READ ONLY.
- **/
-struct _header_raw *
-camel_mime_parser_headers_raw(CamelMimeParser *m)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- if (s->parts)
- return s->parts->headers;
- return NULL;
-}
-
-/**
- * camel_mime_parser_init_with_fd:
- * @m:
- * @fd: A valid file descriptor.
- *
- * Initialise the scanner with an fd. The scanner's offsets
- * will be relative to the current file position of the file
- * descriptor. As a result, seekable descritors should
- * be seeked using the parser seek functions.
- *
- * An initial buffer will be read from the file descriptor
- * immediately, although no parsing will occur.
- *
- * Return value: Returns -1 on error.
- **/
-int
-camel_mime_parser_init_with_fd(CamelMimeParser *m, int fd)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- return folder_scan_init_with_fd(s, fd);
-}
-
-/**
- * camel_mime_parser_init_with_stream:
- * @m:
- * @stream:
- *
- * Initialise the scanner with a source stream. The scanner's
- * offsets will be relative to the current file position of
- * the stream. As a result, seekable streams should only
- * be seeked using the parser seek function.
- *
- * An initial buffer will be read from the stream
- * immediately, although no parsing will occur.
- *
- * Return value: -1 on error.
- **/
-int
-camel_mime_parser_init_with_stream(CamelMimeParser *m, CamelStream *stream)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- return folder_scan_init_with_stream(s, stream);
-}
-
-/**
- * camel_mime_parser_scan_from:
- * @m:
- * @scan_from: #TRUE if the scanner should scan From lines.
- *
- * Tell the scanner if it should scan "^From " lines or not.
- *
- * If the scanner is scanning from lines, two additional
- * states HSCAN_FROM and HSCAN_FROM_END will be returned
- * to the caller during parsing.
- **/
-void
-camel_mime_parser_scan_from(CamelMimeParser *m, int scan_from)
-{
- struct _header_scan_state *s = _PRIVATE(m);
- s->scan_from = scan_from;
-}
-
-/**
- * camel_mime_parser_content_type:
- * @m:
- *
- * Get the content type defined in the current part.
- *
- * Return value: A content_type structure, or NULL if there
- * is no content-type defined for this part of state of the
- * parser.
- **/
-struct _header_content_type *
-camel_mime_parser_content_type(CamelMimeParser *m)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- /* FIXME: should this search up until its found the 'right'
- content-type? can it? */
- if (s->parts)
- return s->parts->content_type;
- return NULL;
-}
-
-/**
- * camel_mime_parser_unstep:
- * @m:
- *
- * Cause the last step operation to repeat itself. If this is
- * called repeated times, then the same step will be repeated
- * that many times.
- *
- * Note that it is not possible to scan back using this function,
- * only to have a way of peeking the next state.
- **/
-void camel_mime_parser_unstep(CamelMimeParser *m)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- s->unstep++;
-}
-
-/**
- * camel_mime_parser_drop_step:
- * @m:
- *
- * Drop the last step call. This should only be used
- * in conjunction with seeking of the stream as the
- * stream may be in an undefined state relative to the
- * state of the parser.
- *
- * Use this call with care.
- **/
-void camel_mime_parser_drop_step(CamelMimeParser *m)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- s->unstep = 0;
- folder_scan_drop_step(s);
-}
-
-/**
- * camel_mime_parser_step:
- * @m:
- * @databuffer: Pointer to accept a pointer to the data
- * associated with this step (if any). May be #NULL,
- * in which case datalength is also ingored.
- * @datalength: Pointer to accept a pointer to the data
- * length associated with this step (if any).
- *
- * Parse the next part of the MIME message. If _unstep()
- * has been called, then continue to return the same state
- * for that many calls.
- *
- * If the step is HSCAN_BODY then the databuffer and datalength
- * pointers will be setup to point to the internal data buffer
- * of the scanner and may be processed as required. Any
- * filters will have already been applied to this data.
- *
- * Refer to the state diagram elsewhere for a full listing of
- * the states an application is gauranteed to get from the
- * scanner.
- *
- * Return value: The current new state of the parser
- * is returned.
- **/
-enum _header_state
-camel_mime_parser_step(CamelMimeParser *m, char **databuffer, int *datalength)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- d(printf("OLD STATE: '%s' :\n", states[s->state]));
-
- if (s->unstep <= 0) {
- char *dummy;
- int dummylength;
-
- if (databuffer == NULL) {
- databuffer = &dummy;
- datalength = &dummylength;
- }
-
- folder_scan_step(s, databuffer, datalength);
- } else
- s->unstep--;
-
- d(printf("NEW STATE: '%s' :\n", states[s->state]));
-
- return s->state;
-}
-
-/**
- * camel_mime_parser_tell:
- * @m:
- *
- * Return the current scanning offset. The meaning of this
- * value will depend on the current state of the parser.
- *
- * An incomplete listing of the states:
- *
- * HSCAN_INITIAL, The start of the current message.
- * HSCAN_HEADER, HSCAN_MESSAGE, HSCAN_MULTIPART, the character
- * position immediately after the end of the header.
- * HSCAN_BODY, Position within the message of the start
- * of the current data block.
- * HSCAN_*_END, The position of the character starting
- * the next section of the scan (the last position + 1 of
- * the respective current state).
- *
- * Return value: See above.
- **/
-off_t camel_mime_parser_tell(CamelMimeParser *m)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- return folder_tell(s);
-}
-
-/**
- * camel_mime_parser_tell_start_headers:
- * @m:
- *
- * Find out the position within the file of where the
- * headers started, this is cached by the parser
- * at the time.
- *
- * Return value: The header start position, or -1 if
- * no headers were scanned in the current state.
- **/
-off_t camel_mime_parser_tell_start_headers(CamelMimeParser *m)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- return s->start_of_headers;
-}
-
-/**
- * camel_mime_parser_tell_start_from:
- * @m:
- *
- * If the parser is scanning From lines, then this returns
- * the position of the start of the From line.
- *
- * Return value: The start of the from line, or -1 if there
- * was no From line, or From lines are not being scanned.
- **/
-off_t camel_mime_parser_tell_start_from(CamelMimeParser *m)
-{
- struct _header_scan_state *s = _PRIVATE(m);
-
- return s->start_of_from;
-}
-
-/**
- * camel_mime_parser_seek:
- * @m:
- * @off: Number of bytes to offset the seek by.
- * @whence: SEEK_SET, SEEK_CUR, SEEK_END
- *
- * Reset the source position to a known value.
- *
- * Note that if the source stream/descriptor was not
- * positioned at 0 to begin with, and an absolute seek
- * is specified (whence != SEEK_CUR), then the seek
- * position may not match the desired seek position.
- *
- * Return value: The new seek offset, or -1 on
- * an error (for example, trying to seek on a non-seekable
- * stream or file descriptor).
- **/
-off_t camel_mime_parser_seek(CamelMimeParser *m, off_t off, int whence)
-{
- struct _header_scan_state *s = _PRIVATE(m);
- return folder_seek(s, off, whence);
-}
-
-/**
- * camel_mime_parser_state:
- * @m:
- *
- * Get the current parser state.
- *
- * Return value: The current parser state.
- **/
-enum _header_state camel_mime_parser_state(CamelMimeParser *m)
-{
- struct _header_scan_state *s = _PRIVATE(m);
- return s->state;
-}
-
-/**
- * camel_mime_parser_stream:
- * @m:
- *
- * Get the stream, if any, the parser has been initialised
- * with. May be used to setup sub-streams, but should not
- * be read from directly (without saving and restoring
- * the seek position in between).
- *
- * Return value: The stream from _init_with_stream(), or NULL
- * if the parser is reading from a file descriptor or is
- * uninitialised.
- **/
-CamelStream *camel_mime_parser_stream(CamelMimeParser *m)
-{
- struct _header_scan_state *s = _PRIVATE(m);
- return s->stream;
-}
-
-/**
- * camel_mime_parser_fd:
- * @m:
- *
- * Return the file descriptor, if any, the parser has been
- * initialised with.
- *
- * Should not be read from unless the parser it to terminate,
- * or the seek offset can be reset before the next parse
- * step.
- *
- * Return value: The file descriptor or -1 if the parser
- * is reading from a stream or has not been initialised.
- **/
-int camel_mime_parser_fd(CamelMimeParser *m)
-{
- struct _header_scan_state *s = _PRIVATE(m);
- return s->fd;
-}
-
-/* ********************************************************************** */
-/* Implementation */
-/* ********************************************************************** */
-
-/* read the next bit of data, ensure there is enough room 'atleast' bytes */
-static int
-folder_read(struct _header_scan_state *s)
-{
- int len;
- int inoffset;
-
- if (s->inptr<s->inend-s->atleast)
- return s->inend-s->inptr;
-#ifdef PURIFY
- purify_watch_remove(inend_id);
- purify_watch_remove(inbuffer_id);
-#endif
- /* check for any remaning bytes (under the atleast limit( */
- inoffset = s->inend - s->inptr;
- if (inoffset>0) {
- memcpy(s->inbuf, s->inptr, inoffset);
- }
- if (s->stream) {
- len = camel_stream_read(s->stream, s->inbuf+inoffset, SCAN_BUF-inoffset);
- } else {
- len = read(s->fd, s->inbuf+inoffset, SCAN_BUF-inoffset);
- }
- r(printf("read %d bytes, offset = %d\n", len, inoffset));
- if (len>=0) {
- /* add on the last read block */
- s->seek += s->inptr - s->inbuf;
- s->inptr = s->inbuf;
- s->inend = s->inbuf+len+inoffset;
- r(printf("content = %d '%.*s'\n",s->inend - s->inptr, s->inend - s->inptr, s->inptr));
- }
-
- g_assert(s->inptr<=s->inend);
-#ifdef PURIFY
- inend_id = purify_watch(&s->inend);
- inbuffer_id = purify_watch_n(s->inend+1, SCAN_HEAD-1, "rw");
-#endif
- r(printf("content = %d '%.*s'\n", s->inend - s->inptr, s->inend - s->inptr, s->inptr));
- /* set a sentinal, for the inner loops to check against */
- s->inend[0] = '\n';
- return s->inend-s->inptr;
-}
-
-/* return the current absolute position of the data pointer */
-static off_t
-folder_tell(struct _header_scan_state *s)
-{
- return s->seek + (s->inptr - s->inbuf);
-}
-
-/*
- need some way to prime the parser state, so this actually works for
- other than top-level messages
-*/
-static off_t
-folder_seek(struct _header_scan_state *s, off_t offset, int whence)
-{
- off_t newoffset;
- int len;
-
- if (s->stream) {
- if (CAMEL_IS_SEEKABLE_STREAM(s->stream)) {
- /* NOTE: assumes whence seekable stream == whence libc, which is probably
- the case (or bloody well should've been) */
- newoffset = camel_seekable_stream_seek((CamelSeekableStream *)s->stream, offset, whence);
- } else {
- newoffset = -1;
- errno = EINVAL;
- }
- } else {
- newoffset = lseek(s->fd, offset, whence);
- }
-#ifdef PURIFY
- purify_watch_remove(inend_id);
- purify_watch_remove(inbuffer_id);
-#endif
- if (newoffset != -1) {
- s->seek = newoffset;
- s->inptr = s->inbuf;
- s->inend = s->inbuf;
- if (s->stream)
- len = camel_stream_read(s->stream, s->inbuf, SCAN_BUF);
- else
- len = read(s->fd, s->inbuf, SCAN_BUF);
- if (len>=0) {
- s->inend = s->inbuf+len;
- s->inend[0] = '\n';
- } else
- newoffset = -1;
- }
-#ifdef PURIFY
- inend_id = purify_watch(&s->inend);
- inbuffer_id = purify_watch_n(s->inend+1, SCAN_HEAD-1, "rw");
-#endif
- return newoffset;
-}
-
-static void
-folder_push_part(struct _header_scan_state *s, struct _header_scan_stack *h)
-{
- h->parent = s->parts;
- s->parts = h;
-}
-
-static void
-folder_pull_part(struct _header_scan_state *s)
-{
- struct _header_scan_stack *h;
-
- h = s->parts;
- if (h) {
- s->parts = h->parent;
- g_free(h->boundary);
-#ifdef MEMPOOL
- mempool_free(h->pool);
-#else
- header_raw_clear(&h->headers);
-#endif
- header_content_type_unref(h->content_type);
- g_free(h);
- } else {
- g_warning("Header stack underflow!\n");
- }
-}
-
-static int
-folder_scan_skip_line(struct _header_scan_state *s)
-{
- int atleast = s->atleast;
- register char *inptr, *inend, c;
- int len;
-
- s->atleast = 1;
-
- while ( (len = folder_read(s)) > 0 && len > s->atleast) { /* ensure we have at least enough room here */
- inptr = s->inptr;
- inend = s->inend-1;
-
- c = -1;
- while (inptr<inend
- && (c = *inptr++)!='\n')
- ;
-
- s->inptr = inptr;
-
- if (c=='\n') {
- s->atleast = atleast;
- return 0;
- }
- }
-
- s->atleast = atleast;
-
- return -1; /* not found */
-}
-
-/* TODO: Is there any way to make this run faster? It gets called a lot ... */
-static struct _header_scan_stack *
-folder_boundary_check(struct _header_scan_state *s, const char *boundary, int *lastone)
-{
- struct _header_scan_stack *part;
- int len = s->atleast-2; /* make sure we dont access past the buffer */
-
- h(printf("checking boundary marker upto %d bytes\n", len));
- part = s->parts;
- while (part) {
- h(printf(" boundary: %s\n", part->boundary));
- h(printf(" against: '%.*s'\n", len, boundary));
- if (part->boundary
- && part->boundarylen <= len
- && memcmp(boundary, part->boundary, part->boundarylen)==0) {
- h(printf("matched boundary: %s\n", part->boundary));
- /* again, make sure we're in range */
- if (part->boundarylen <= len+2) {
- h(printf("checking lastone\n"));
- *lastone = (boundary[part->boundarylen]=='-'
- && boundary[part->boundarylen+1]=='-');
- } else {
- h(printf("not enough room to check last one?\n"));
- *lastone = FALSE;
- }
- /*printf("ok, we found it! : %s \n", (*lastone)?"Last one":"More to come?");*/
- return part;
- }
- part = part->parent;
- }
- return NULL;
-}
-
-#ifdef MEMPOOL
-static void
-header_append_mempool(struct _header_scan_state *s, struct _header_scan_stack *h, char *header, int offset)
-{
- struct _header_raw *l, *n;
- char *content;
-
- d(printf("Header: %s: %s\n", name, value));
-
- content = strchr(header, ':');
- if (content) {
- register int len;
- n = mempool_alloc(h->pool, sizeof(*n));
- n->next = NULL;
-
- len = content-header;
- n->name = mempool_alloc(h->pool, len+1);
- memcpy(n->name, header, len);
- n->name[len] = 0;
-
- content++;
-
- len = s->outptr - content;
- n->value = mempool_alloc(h->pool, len+1);
- memcpy(n->value, content, len);
- n->value[len] = 0;
-
- n->offset = offset;
-
- l = (struct _header_raw *)&h->headers;
- while (l->next) {
- l = l->next;
- }
- l->next = n;
- }
-
-}
-
-#define header_raw_append_parse(a, b, c) (header_append_mempool(s, h, b, c))
-
-#endif
-
-/* Copy the string start->inptr into the header buffer (s->outbuf),
- grow if necessary
- and track the start offset of the header */
-/* Basically an optimised version of g_byte_array_append() */
-#define header_append(s, start, inptr) \
-{ \
- register int headerlen = inptr-start; \
- \
- if (headerlen >= (s->outend - s->outptr)) { \
- register char *outnew; \
- register int len = ((s->outend - s->outbuf)+headerlen)*2+1; \
- outnew = g_realloc(s->outbuf, len); \
- s->outptr = s->outptr - s->outbuf + outnew; \
- s->outbuf = outnew; \
- s->outend = outnew + len; \
- } \
- memcpy(s->outptr, start, headerlen); \
- s->outptr += headerlen; \
- if (s->header_start == -1) \
- s->header_start = (start-s->inbuf) + s->seek; \
-}
-
-static struct _header_scan_stack *
-folder_scan_header(struct _header_scan_state *s, int *lastone)
-{
- int atleast = s->atleast;
- char *start;
- int len;
- struct _header_scan_stack *part, *overpart = s->parts;
- struct _header_scan_stack *h;
- char *inend;
- register char *inptr;
-
- h(printf("scanning first bit\n"));
-
- h = g_malloc0(sizeof(*h));
-#ifdef MEMPOOL
- h->pool = mempool_new(8192, 4096);
-#endif
-
- /* FIXME: this info should be cached ? */
- part = s->parts;
- s->atleast = 5;
- while (part) {
- if (part->boundary)
- s->atleast = MAX(s->atleast, part->boundarylen+2);
- part = part->parent;
- }
-#if 0
- s->atleast = MAX(s->atleast, 5);
- if (s->parts)
- s->atleast = MAX(s->atleast, s->parts->boundarylen+2);
-#endif
-
- *lastone = FALSE;
-retry:
-
- while ((len = folder_read(s))>0 && len >= s->atleast) { /* ensure we have at least enough room here */
- inptr = s->inptr;
- inend = s->inend-s->atleast;
-
- while (inptr<=inend) {
- /*printf(" '%.20s'\n", inptr);*/
-
- start = inptr;
-
- if (!s->midline) {
- if ((part = folder_boundary_check(s, inptr, lastone))) {
- if ((s->outptr>s->outbuf) || (inptr-start))
- goto header_truncated; /* may not actually be truncated */
-
- goto normal_exit;
- }
-
- /* Replace any number of spaces and tabs at the start of the line with
- * a single space.
- */
- if (*start == ' ' || *start == '\t') {
- do
- start++;
- while (*start == ' ' || *start == '\t');
- start--;
- *start = ' ';
- }
- }
-
- /* goto next line */
- while ((*inptr++)!='\n')
- ;
-
- g_assert(inptr<=s->inend+1);
-
- header_append(s, start, inptr-1);
-
- /* check against the real buffer end, not our 'atleast limited' end */
- /* also make sure we have at least 1 char lookahead, so even if we found a \n at
- the end, well, make out we didn't, and re-scan it next pass */
- if (inptr>=s->inend) {
- inptr--;
- s->midline = TRUE;
- } else {
- s->midline = FALSE;
- }
-
- h(printf("outbuf[0] = %02x '%c' oubuf[1] = %02x '%c'\n",
- s->outbuf[0], isprint(s->outbuf[0])?s->outbuf[0]:'.',
- s->outbuf[1], isprint(s->outbuf[1])?s->outbuf[1]:'.'));
-
- if (!s->midline
- && !(inptr[0] == ' ' || inptr[0] == '\t')) {
- if (s->outbuf[0] == '\n'
- || (s->outbuf[0] == '\r' && s->outbuf[1]=='\n')) {
- goto header_done;
- }
-
- /* we always have at least _1_ char here ... */
- if (s->outptr > s->outbuf && s->outptr[-1] == '\n')
- s->outptr--;
- s->outptr[0] = 0;
-
- d(printf("header %.10s at %d\n", s->outbuf, s->header_start));
-
- header_raw_append_parse(&h->headers, s->outbuf, s->header_start);
-
- if (inptr[0]=='\n'
- || (inptr[0] == '\r' && inptr[1]=='\n')) {
- inptr++;
- goto header_done;
- }
- s->outptr = s->outbuf;
- s->header_start = -1;
- }
- }
- s->inptr = inptr;
- }
-
- /* ok, we're at the end of the data, just make sure we're not missing out some small
- truncated header markers */
- if (overpart) {
- overpart = overpart->parent;
- while (overpart) {
- if (overpart->boundary && (overpart->boundarylen+2) < s->atleast) {
- s->atleast = overpart->boundarylen+2;
- h(printf("Retrying next smaller part ...\n"));
- goto retry;
- }
- overpart = overpart->parent;
- }
- }
-
- if ((s->outptr > s->outbuf) || s->inend > s->inptr) {
- start = s->inptr;
- inptr = s->inend;
- goto header_truncated;
- }
-
- s->atleast = atleast;
-
- return h;
-
-header_truncated:
-
- header_append(s, start, inptr);
-
- if (s->outptr>s->outbuf && s->outptr[-1] == '\n')
- s->outptr--;
- s->outptr[0] = 0;
-
- if (s->outbuf[0] == '\n'
- || (s->outbuf[0] == '\r' && s->outbuf[1]=='\n')) {
- goto header_done;
- }
-
- header_raw_append_parse(&h->headers, s->outbuf, s->header_start);
-
-header_done:
- part = s->parts;
-
- s->outptr = s->outbuf;
-normal_exit:
- s->inptr = inptr;
- s->atleast = atleast;
- s->header_start = -1;
- return h;
-}
-
-static struct _header_scan_stack *
-folder_scan_content(struct _header_scan_state *s, int *lastone, char **data, int *length)
-{
- int atleast = s->atleast;
- register char *inptr;
- char *inend;
- char *start;
- int len;
- struct _header_scan_stack *part, *overpart = s->parts;
- int already_packed = FALSE;
-
- /*printf("scanning content\n");*/
-
- /* FIXME: this info should be cached ? */
- part = s->parts;
- s->atleast = 5;
- while (part) {
- if (part->boundary) {
- c(printf("boundary: %s\n", part->boundary));
- s->atleast = MAX(s->atleast, part->boundarylen+2);
- }
- part = part->parent;
- }
-/* s->atleast = MAX(s->atleast, 5);*/
-#if 0
- if (s->parts)
- s->atleast = MAX(s->atleast, s->parts->boundarylen+2);
-#endif
- *lastone = FALSE;
-
-retry:
- c(printf("atleast = %d\n", s->atleast));
-
- while ((len = folder_read(s))>0 && len >= s->atleast) { /* ensure we have at least enough room here */
- inptr = s->inptr;
- inend = s->inend-s->atleast;
- start = inptr;
-
- c(printf("inptr = %p, inend = %p\n", inptr, inend));
-
- while (inptr<=inend) {
- if (!s->midline
- && (part = folder_boundary_check(s, inptr, lastone))) {
- if ( (inptr-start) )
- goto content;
-
- goto normal_exit;
- }
-
- /* goto the next line */
- while ((*inptr++)!='\n')
- ;
-
- /* check against the real buffer end, not our 'atleast limited' end */
- if (inptr> s->inend) {
- inptr--;
- s->midline = TRUE;
- } else {
- s->midline = FALSE;
- }
-
- g_assert(inptr<=s->inend);
- }
-
- /* *sigh* so much for the beautiful simplicity of the code so far - here we
- have the snot to deal with the nasty end-cases that come from the read-ahead
- buffers we use */
- /* what this does, is if we are somewhere near the end of the buffer,
- force it to the front, and re-read, ensuring we bunch as much together
- as possible, for the final read, without copying too much of the time */
- /* make sure we dont loop forever, but also make sure we try smaller
- boundaries, if there are any, so we dont miss any. */
- /* this is not needed for the header scanner, since it copies its own
- data */
- c(printf("start offset = %d atleast = %d\n", start-s->inbuf, s->atleast));
- if (start > (s->inbuf + s->atleast)) {
- /* force a re-scan of this data */
- s->inptr = start;
- if (already_packed)
- goto smaller_boundary;
- c(printf("near the end, try and bunch things up a bit first\n"));
- already_packed = TRUE;
- } else {
- c(printf("dumping what i've got ...\n"));
- /* what would be nice here, is if that we're at eof, we bunch the last
- little bit in the same content, but i dont think this is easy */
- goto content_mid;
- }
- }
-
- c(printf("length read = %d\n", len));
-smaller_boundary:
-
- /* ok, we're at the end of the data, just make sure we're not missing out some small
- truncated header markers */
- if (overpart) {
- overpart = overpart->parent;
- while (overpart) {
- if (overpart->boundary && (overpart->boundarylen+2) < s->atleast) {
- s->atleast = overpart->boundarylen+2;
- c(printf("Retrying next smaller part ...\n"));
- goto retry;
- }
- overpart = overpart->parent;
- }
- }
-
- if (s->inend > s->inptr) {
- start = s->inptr;
- inptr = s->inend;
- goto content;
- }
-
- *length = 0;
- s->atleast = atleast;
- return NULL;
-
-content_mid:
- s->midline = TRUE;
-content:
- part = s->parts;
-normal_exit:
- s->atleast = atleast;
- s->inptr = inptr;
-
- *data = start;
- *length = inptr-start;
-
-/* printf("got %scontent: %.*s", s->midline?"partial ":"", inptr-start, start);*/
-
- return part;
-}
-
-
-static void
-folder_scan_close(struct _header_scan_state *s)
-{
- g_free(s->realbuf);
- g_free(s->outbuf);
- while (s->parts)
- folder_pull_part(s);
- if (s->fd != -1)
- close(s->fd);
- if (s->stream) {
- camel_object_unref((CamelObject *)s->stream);
- }
- g_free(s);
-}
-
-
-static struct _header_scan_state *
-folder_scan_init(void)
-{
- struct _header_scan_state *s;
-
- s = g_malloc(sizeof(*s));
-
- s->fd = -1;
- s->stream = NULL;
-
- s->outbuf = g_malloc(1024);
- s->outbuf[0] = '\0';
- s->outptr = s->outbuf;
- s->outend = s->outbuf+1024;
-
- s->realbuf = g_malloc(SCAN_BUF + SCAN_HEAD*2);
- s->inbuf = s->realbuf + SCAN_HEAD;
- s->inptr = s->inbuf;
- s->inend = s->inbuf;
- s->atleast = 0;
-
- s->seek = 0; /* current character position in file of the last read block */
- s->unstep = 0;
-
- s->header_start = -1;
-
- s->start_of_from = -1;
- s->start_of_headers = -1;
-
- s->midline = FALSE;
- s->scan_from = FALSE;
-
- s->filters = NULL;
- s->filterid = 1;
-
- s->parts = NULL;
-
- s->state = HSCAN_INITIAL;
- return s;
-}
-
-static int
-folder_scan_init_with_fd(struct _header_scan_state *s, int fd)
-{
- int len;
-
- len = read(fd, s->inbuf, SCAN_BUF);
- if (len>=0) {
- s->inend = s->inbuf+len;
- s->inptr = s->inbuf;
- s->inend[0] = '\n';
- if (s->fd != -1)
- close(s->fd);
- s->fd = fd;
- if (s->stream) {
- camel_object_unref((CamelObject *)s->stream);
- s->stream = NULL;
- }
- return 0;
- } else {
- return -1;
- }
-}
-
-static int
-folder_scan_init_with_stream(struct _header_scan_state *s, CamelStream *stream)
-{
- int len;
-
- len = camel_stream_read(stream, s->inbuf, SCAN_BUF);
- if (len >= 0) {
- s->inend = s->inbuf+len;
- s->inptr = s->inbuf;
- s->inend[0] = '\n';
- if (s->stream)
- camel_object_unref((CamelObject *)s->stream);
- s->stream = stream;
- camel_object_ref((CamelObject *)stream);
- if (s->fd != -1) {
- close(s->fd);
- s->fd = -1;
- }
- return 0;
- } else {
- return -1;
- }
-}
-
-#define USE_FROM
-
-static void
-folder_scan_step(struct _header_scan_state *s, char **databuffer, int *datalength)
-{
- struct _header_scan_stack *h, *hb;
- const char *content;
- const char *bound;
- int type;
- int state;
- struct _header_content_type *ct = NULL;
- struct _header_scan_filter *f;
- size_t presize;
-
-/* printf("\nSCAN PASS: state = %d '%s'\n", s->state, states[s->state]);*/
-
-tail_recurse:
- d({
- printf("\nSCAN STACK:\n");
- printf(" '%s' :\n", states[s->state]);
- hb = s->parts;
- while (hb) {
- printf(" '%s' : %s ", states[hb->savestate], hb->boundary);
- if (hb->content_type) {
- printf("(%s/%s)", hb->content_type->type, hb->content_type->subtype);
- } else {
- printf("(default)");
- }
- printf("\n");
- hb = hb->parent;
- }
- printf("\n");
- });
-
- switch (s->state) {
-
- case HSCAN_INITIAL:
-#ifdef USE_FROM
- if (s->scan_from) {
- /* FIXME: it would be nice not to have to allocate this every pass */
- h = g_malloc0(sizeof(*h));
- h->boundary = g_strdup("From ");
- h->boundarylen = strlen(h->boundary);
- folder_push_part(s, h);
-
- h = s->parts;
- do {
- hb = folder_scan_content(s, &state, databuffer, datalength);
- } while (hb==h && *datalength>0);
-
- if (*datalength==0 && hb==h) {
- d(printf("found 'From '\n"));
- s->start_of_from = folder_tell(s);
- folder_scan_skip_line(s);
- h->savestate = HSCAN_INITIAL;
- s->state = HSCAN_FROM;
- } else {
- folder_pull_part(s);
- s->state = HSCAN_EOF;
- }
- return;
- } else {
- s->start_of_from = -1;
- }
-
-#endif
- case HSCAN_FROM:
- s->start_of_headers = folder_tell(s);
- h = folder_scan_header(s, &state);
-#ifdef USE_FROM
- if (s->scan_from)
- h->savestate = HSCAN_FROM_END;
- else
-#endif
- h->savestate = HSCAN_EOF;
-
- /* FIXME: should this check for MIME-Version: 1.0 as well? */
-
- type = HSCAN_HEADER;
- if ( (content = header_raw_find(&h->headers, "Content-Type", NULL))
- && (ct = header_content_type_decode(content))) {
- if (!strcasecmp(ct->type, "multipart")) {
- bound = header_content_type_param(ct, "boundary");
- if (bound) {
- d(printf("multipart, boundary = %s\n", bound));
- h->boundarylen = strlen(bound)+2;
- h->boundary = g_malloc(h->boundarylen+3);
- sprintf(h->boundary, "--%s--", bound);
- type = HSCAN_MULTIPART;
- } else {
- header_content_type_unref(ct);
- ct = header_content_type_decode("text/plain");
-/* We can't quite do this, as it will mess up all the offsets ... */
-/* header_raw_replace(&h->headers, "Content-Type", "text/plain", offset);*/
- g_warning("Multipart with no boundary, treating as text/plain");
- }
- } else if (!strcasecmp(ct->type, "message")) {
- if (!strcasecmp(ct->subtype, "rfc822")
- || !strcasecmp(ct->subtype, "news")
- /*|| !strcasecmp(ct->subtype, "partial")*/) {
- type = HSCAN_MESSAGE;
- }
- }
- } else {
- /* make the default type for multipart/digest be message/rfc822 */
- if ((s->parts
- && header_content_type_is(s->parts->content_type, "multipart", "digest"))) {
- ct = header_content_type_decode("message/rfc822");
- type = HSCAN_MESSAGE;
- d(printf("parent was multipart/digest, autoupgrading to message/rfc822?\n"));
- /* maybe we should do this too?
- header_raw_append_parse(&h->headers, "Content-Type: message/rfc822", -1);*/
- }
- }
- h->content_type = ct;
- folder_push_part(s, h);
- s->state = type;
- return;
-
- case HSCAN_HEADER:
- s->state = HSCAN_BODY;
-
- case HSCAN_BODY:
- h = s->parts;
- *datalength = 0;
- presize = SCAN_HEAD;
- f = s->filters;
-
- do {
- hb = folder_scan_content(s, &state, databuffer, datalength);
- if (*datalength>0) {
- d(printf("Content raw: '%.*s'\n", *datalength, *databuffer));
-
- while (f) {
- camel_mime_filter_filter(f->filter, *databuffer, *datalength, presize,
- databuffer, datalength, &presize);
- f = f->next;
- }
- return;
- }
- } while (hb==h && *datalength>0);
-
- /* check for any filter completion data */
- while (f) {
- camel_mime_filter_filter(f->filter, *databuffer, *datalength, presize,
- databuffer, datalength, &presize);
- f = f->next;
- }
- if (*datalength > 0)
- return;
-
- s->state = HSCAN_BODY_END;
- break;
-
- case HSCAN_MULTIPART:
- h = s->parts;
- do {
- do {
- hb = folder_scan_content(s, &state, databuffer, datalength);
- if (*datalength>0) {
- /* FIXME: needs a state to return this shit??? */
- d(printf("Multipart Content: '%.*s'\n", *datalength, *databuffer));
- }
- } while (hb==h && *datalength>0);
- if (*datalength==0 && hb==h) {
- d(printf("got boundary: %s\n", hb->boundary));
- folder_scan_skip_line(s);
- if (!state) {
- s->state = HSCAN_FROM;
- folder_scan_step(s, databuffer, datalength);
- s->parts->savestate = HSCAN_MULTIPART; /* set return state for the new head part */
- return;
- }
- } else {
- break;
- }
- } while (1);
-
- s->state = HSCAN_MULTIPART_END;
- break;
-
- case HSCAN_MESSAGE:
- s->state = HSCAN_FROM;
- folder_scan_step(s, databuffer, datalength);
- s->parts->savestate = HSCAN_MESSAGE_END;
- break;
-
- case HSCAN_FROM_END:
- case HSCAN_BODY_END:
- case HSCAN_MULTIPART_END:
- case HSCAN_MESSAGE_END:
- s->state = s->parts->savestate;
- folder_pull_part(s);
- if (s->state & HSCAN_END)
- return;
- goto tail_recurse;
-
- case HSCAN_EOF:
- return;
-
- default:
- g_warning("Invalid state in camel-mime-parser: %d", s->state);
- break;
- }
-
- return;
-}
-
-/* drops the current state back one */
-static void
-folder_scan_drop_step(struct _header_scan_state *s)
-{
- switch (s->state) {
- case HSCAN_INITIAL:
- case HSCAN_EOF:
- return;
-
- case HSCAN_FROM:
- s->state = HSCAN_INITIAL;
- folder_pull_part(s);
- return;
-
- case HSCAN_MESSAGE:
- case HSCAN_HEADER:
- case HSCAN_MULTIPART:
-
- case HSCAN_FROM_END:
- case HSCAN_BODY_END:
- case HSCAN_MULTIPART_END:
- case HSCAN_MESSAGE_END:
-
- s->state = s->parts->savestate;
- folder_pull_part(s);
- if (s->state & HSCAN_END) {
- s->state &= ~HSCAN_END;
- }
- return;
- default:
- /* FIXME: not sure if this is entirely right */
- }
-}
-
-#ifdef STANDALONE
-int main(int argc, char **argv)
-{
- int fd;
- struct _header_scan_state *s;
- char *data;
- int len;
- int state;
- char *name = "/tmp/evmail/Inbox";
- struct _header_scan_stack *h;
- int i;
- int attach = 0;
-
- if (argc==2)
- name = argv[1];
-
- printf("opening: %s", name);
-
- for (i=1;i<argc;i++) {
- const char *encoding = NULL, *charset = NULL;
- char *attachname;
-
- name = argv[i];
- printf("opening: %s", name);
-
- fd = open(name, O_RDONLY);
- if (fd==-1) {
- perror("Cannot open mailbox");
- exit(1);
- }
- s = folder_scan_init(fd);
- s->scan_from = FALSE;
-#if 0
- h = g_malloc0(sizeof(*h));
- h->savestate = HSCAN_EOF;
- folder_push_part(s, h);
-#endif
- while (s->state != HSCAN_EOF) {
- folder_scan_step(s, &data, &len);
- printf("\n -- PARSER STEP RETURN -- %d '%s'\n\n", s->state, states[s->state]);
- switch (s->state) {
- case HSCAN_HEADER:
- if (s->parts->content_type
- && (charset = header_content_type_param(s->parts->content_type, "charset"))) {
- if (strcasecmp(charset, "us-ascii")) {
- folder_push_filter_charset(s, "UTF-8", charset);
- } else {
- charset = NULL;
- }
- } else {
- charset = NULL;
- }
-
- encoding = header_raw_find(&s->parts->headers, "Content-transfer-encoding");
- printf("encoding = '%s'\n", encoding);
- if (encoding && !strncasecmp(encoding, " base64", 7)) {
- printf("adding base64 filter\n");
- attachname = g_strdup_printf("attach.%d.%d", i, attach++);
- folder_push_filter_save(s, attachname);
- g_free(attachname);
- folder_push_filter_mime(s, 0);
- }
- if (encoding && !strncasecmp(encoding, " quoted-printable", 17)) {
- printf("adding quoted-printable filter\n");
- attachname = g_strdup_printf("attach.%d.%d", i, attach++);
- folder_push_filter_save(s, attachname);
- g_free(attachname);
- folder_push_filter_mime(s, 1);
- }
-
- break;
- case HSCAN_BODY:
- break;
- case HSCAN_BODY_END:
- if (encoding && !strncasecmp(encoding, " base64", 7)) {
- printf("removing filters\n");
- folder_filter_pull(s);
- folder_filter_pull(s);
- }
- if (encoding && !strncasecmp(encoding, " quoted-printable", 17)) {
- printf("removing filters\n");
- folder_filter_pull(s);
- folder_filter_pull(s);
- }
- if (charset) {
- folder_filter_pull(s);
- charset = NULL;
- }
- encoding = NULL;
- break;
- default:
- break;
- }
- }
- folder_scan_close(s);
- close(fd);
- }
- return 0;
-}
-
-#endif /* STANDALONE */
-
diff --git a/camel/camel-mime-parser.h b/camel/camel-mime-parser.h
deleted file mode 100644
index 5baa58c88e..0000000000
--- a/camel/camel-mime-parser.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_MIME_PARSER_H
-#define _CAMEL_MIME_PARSER_H
-
-#include <camel/camel-object.h>
-
-#include <camel/camel-mime-utils.h>
-#include <camel/camel-mime-filter.h>
-#include <camel/camel-stream.h>
-
-#define CAMEL_MIME_PARSER(obj) CAMEL_CHECK_CAST (obj, camel_mime_parser_get_type (), CamelMimeParser)
-#define CAMEL_MIME_PARSER_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_parser_get_type (), CamelMimeParserClass)
-#define IS_CAMEL_MIME_PARSER(obj) CAMEL_CHECK_TYPE (obj, camel_mime_parser_get_type ())
-
-typedef struct _CamelMimeParserClass CamelMimeParserClass;
-
-/* NOTE: if you add more states, you may need to bump the
- start of the END tags to 16 or 32, etc - so they are
- the same as the matching start tag, with a bit difference */
-enum _header_state {
- HSCAN_INITIAL,
- HSCAN_FROM, /* got 'From' line */
- HSCAN_HEADER, /* toplevel header */
- HSCAN_BODY, /* scanning body of message */
- HSCAN_MULTIPART, /* got multipart header */
- HSCAN_MESSAGE, /* rfc822 message */
-
- HSCAN_PART, /* part of a multipart */
-
- HSCAN_END = 8, /* bit mask for 'end' flags */
-
- HSCAN_EOF = 8, /* end of file */
- HSCAN_FROM_END, /* end of whole from bracket */
- HSCAN_HEADER_END, /* dummy value */
- HSCAN_BODY_END, /* end of message */
- HSCAN_MULTIPART_END, /* end of multipart */
- HSCAN_MESSAGE_END, /* end of message */
-
-};
-
-struct _CamelMimeParser {
- CamelObject parent;
-
- struct _CamelMimeParserPrivate *priv;
-};
-
-struct _CamelMimeParserClass {
- CamelObjectClass parent_class;
-
- void (*message)(CamelMimeParser *, void *headers);
- void (*part)(CamelMimeParser *);
- void (*content)(CamelMimeParser *);
-};
-
-guint camel_mime_parser_get_type (void);
-CamelMimeParser *camel_mime_parser_new (void);
-
-/* using an fd will be a little faster, but not much (over a simple stream) */
-int camel_mime_parser_init_with_fd(CamelMimeParser *, int fd);
-int camel_mime_parser_init_with_stream(CamelMimeParser *m, CamelStream *stream);
-
-/* get the stream or fd back of the parser */
-CamelStream *camel_mime_parser_stream(CamelMimeParser *m);
-int camel_mime_parser_fd(CamelMimeParser *m);
-
-/* scan 'From' separators? */
-void camel_mime_parser_scan_from(CamelMimeParser *, int);
-
-/* what headers to save, MUST include ^Content-Type: */
-int camel_mime_parser_set_header_regex(CamelMimeParser *m, char *matchstr);
-
-/* normal interface */
-enum _header_state camel_mime_parser_step(CamelMimeParser *, char **, int *);
-void camel_mime_parser_unstep(CamelMimeParser *);
-void camel_mime_parser_drop_step(CamelMimeParser *m);
-enum _header_state camel_mime_parser_state(CamelMimeParser *);
-
-/* get content type for the current part/header */
-struct _header_content_type *camel_mime_parser_content_type(CamelMimeParser *);
-
-/* get/change raw header by name */
-const char *camel_mime_parser_header(CamelMimeParser *, const char *, int *offset);
-
-/* get all raw headers. READ ONLY! */
-struct _header_raw *camel_mime_parser_headers_raw(CamelMimeParser *);
-
-/* add a processing filter for body contents */
-int camel_mime_parser_filter_add(CamelMimeParser *, CamelMimeFilter *);
-void camel_mime_parser_filter_remove(CamelMimeParser *, int);
-
-/* these should be used with caution, because the state will not
- track the seeked position */
-/* FIXME: something to bootstrap the state? */
-off_t camel_mime_parser_tell(CamelMimeParser *);
-off_t camel_mime_parser_seek(CamelMimeParser *, off_t, int);
-
-off_t camel_mime_parser_tell_start_headers(CamelMimeParser *);
-off_t camel_mime_parser_tell_start_from(CamelMimeParser *);
-
-#endif /* ! _CAMEL_MIME_PARSER_H */
diff --git a/camel/camel-mime-part-utils.c b/camel/camel-mime-part-utils.c
deleted file mode 100644
index 646b0131b1..0000000000
--- a/camel/camel-mime-part-utils.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-mime-part-utils : Utility for mime parsing and so on
- *
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-#include <config.h>
-#include <string.h>
-#include "gmime-content-field.h"
-#include "string-utils.h"
-#include "camel-mime-part-utils.h"
-#include "camel-mime-message.h"
-#include "camel-multipart.h"
-#include "camel-seekable-substream.h"
-#include "camel-stream-filter.h"
-#include "camel-stream-mem.h"
-#include "camel-mime-filter-basic.h"
-#include "camel-mime-filter-charset.h"
-#include "camel-mime-filter-crlf.h"
-
-#define d(x)
-
-/* simple data wrapper */
-static void
-simple_data_wrapper_construct_from_parser(CamelDataWrapper *dw, CamelMimeParser *mp)
-{
- GByteArray *buffer;
- char *buf;
- int len;
- off_t start = 0, end;
- CamelMimeFilter *fdec = NULL, *fcrlf = NULL, *fch = NULL;
- struct _header_content_type *ct;
- int decid=-1, crlfid=-1, chrid=-1;
- CamelStream *source;
- CamelSeekableStream *seekable_source = NULL;
- char *encoding;
-
- d(printf("constructing data-wrapper\n"));
-
- /* Ok, try and be smart. If we're storing a small message (typical) convert it,
- and store it in memory as we parse it ... if not, throw away the conversion
- and scan till the end ... */
-
- /* if we can't seek, dont have a stream/etc, then we must cache it */
- source = camel_mime_parser_stream(mp);
- if (source) {
- camel_object_ref((CamelObject *)source);
- if (CAMEL_IS_SEEKABLE_STREAM (source)) {
- seekable_source = CAMEL_SEEKABLE_STREAM (source);
- }
- }
-
- /* first, work out conversion, if any, required, we dont care about what we dont know about */
- encoding = header_content_encoding_decode(camel_mime_parser_header(mp, "content-transfer-encoding", NULL));
- if (encoding) {
- if (!strcasecmp(encoding, "base64")) {
- d(printf("Adding base64 decoder ...\n"));
- fdec = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_BASE64_DEC);
- decid = camel_mime_parser_filter_add(mp, fdec);
- } else if (!strcasecmp(encoding, "quoted-printable")) {
- d(printf("Adding quoted-printable decoder ...\n"));
- fdec = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_QP_DEC);
- decid = camel_mime_parser_filter_add(mp, fdec);
- }
- g_free(encoding);
- }
-
- /* If we're doing text, we also need to do CRLF->LF and may have to convert it to UTF8 as well. */
- ct = camel_mime_parser_content_type(mp);
- if (header_content_type_is(ct, "text", "*")) {
- const char *charset = header_content_type_param(ct, "charset");
-
- if (fdec) {
- d(printf("Adding CRLF conversion filter\n"));
- fcrlf = (CamelMimeFilter *)camel_mime_filter_crlf_new(CAMEL_MIME_FILTER_CRLF_DECODE,
- CAMEL_MIME_FILTER_CRLF_MODE_CRLF_ONLY);
- crlfid = camel_mime_parser_filter_add(mp, fcrlf);
- }
-
- if (charset!=NULL
- && !(strcasecmp(charset, "us-ascii")==0
- || strcasecmp(charset, "iso-8859-1")==0)) {
- d(printf("Adding conversion filter from %s to iso-8859-1\n", charset));
- fch = (CamelMimeFilter *)camel_mime_filter_charset_new_convert(charset, "iso-8859-1");
- if (fch) {
- chrid = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)fch);
- } else {
- g_warning("Cannot convert '%s' to 'iso-8859-1', message display may be corrupt", charset);
- }
- }
-
- }
-
- buffer = g_byte_array_new();
-
- if (seekable_source /* !cache */) {
- start = camel_mime_parser_tell(mp) + seekable_source->bound_start;
- }
- while ( camel_mime_parser_step(mp, &buf, &len) != HSCAN_BODY_END ) {
- if (buffer) {
- if (buffer->len > 20480 && seekable_source) {
- /* is this a 'big' message? Yes? We dont want to convert it all then.*/
- camel_mime_parser_filter_remove(mp, decid);
- camel_mime_parser_filter_remove(mp, chrid);
- decid = -1;
- chrid = -1;
- g_byte_array_free(buffer, TRUE);
- buffer = NULL;
- } else {
- g_byte_array_append(buffer, buf, len);
- }
- }
- }
-
- if (buffer) {
- CamelStream *mem;
- d(printf("Small message part, kept in memory!\n"));
- mem = camel_stream_mem_new_with_byte_array(buffer);
- camel_data_wrapper_construct_from_stream (dw, mem);
- camel_object_unref ((CamelObject *)mem);
- } else {
- CamelStream *sub;
- CamelStreamFilter *filter;
-
- d(printf("Big message part, left on disk ...\n"));
-
- end = camel_mime_parser_tell(mp) + seekable_source->bound_start;
- sub = camel_seekable_substream_new_with_seekable_stream_and_bounds (seekable_source, start, end);
- if (fdec || fch) {
- filter = camel_stream_filter_new_with_stream(sub);
- if (fdec) {
- camel_mime_filter_reset(fdec);
- camel_stream_filter_add(filter, fdec);
- }
- if (fcrlf) {
- camel_mime_filter_reset(fcrlf);
- camel_stream_filter_add(filter, fcrlf);
- }
- if (fch) {
- camel_mime_filter_reset(fch);
- camel_stream_filter_add(filter, fch);
- }
- camel_data_wrapper_construct_from_stream (dw, (CamelStream *)filter);
- camel_object_unref ((CamelObject *)filter);
- } else {
- camel_data_wrapper_construct_from_stream (dw, sub);
- }
- camel_object_unref ((CamelObject *)sub);
- }
-
- camel_mime_parser_filter_remove(mp, decid);
- camel_mime_parser_filter_remove(mp, crlfid);
- camel_mime_parser_filter_remove(mp, chrid);
-
- if (fdec)
- camel_object_unref((CamelObject *)fdec);
- if (fcrlf)
- camel_object_unref((CamelObject *)fcrlf);
- if (fch)
- camel_object_unref((CamelObject *)fch);
- if (source)
- camel_object_unref((CamelObject *)source);
-
-}
-
-/* This replaces the data wrapper repository ... and/or could be replaced by it? */
-void
-camel_mime_part_construct_content_from_parser(CamelMimePart *dw, CamelMimeParser *mp)
-{
- CamelDataWrapper *content = NULL;
- char *buf;
- int len;
-
- switch (camel_mime_parser_state(mp)) {
- case HSCAN_HEADER:
- d(printf("Creating body part\n"));
- content = camel_data_wrapper_new();
- simple_data_wrapper_construct_from_parser(content, mp);
- break;
- case HSCAN_MESSAGE:
- d(printf("Creating message part\n"));
- content = (CamelDataWrapper *)camel_mime_message_new();
- camel_mime_part_construct_from_parser((CamelMimePart *)content, mp);
- break;
- case HSCAN_MULTIPART: {
- CamelDataWrapper *bodypart;
-
-#ifndef NO_WARNINGS
-#warning This should use a camel-mime-multipart
-#endif
- d(printf("Creating multi-part\n"));
- content = (CamelDataWrapper *)camel_multipart_new();
-
- /* FIXME: use the real boundary? */
- camel_multipart_set_boundary((CamelMultipart *)content, NULL);
- while (camel_mime_parser_step(mp, &buf, &len) != HSCAN_MULTIPART_END) {
- camel_mime_parser_unstep(mp);
- bodypart = (CamelDataWrapper *)camel_mime_part_new();
- camel_mime_part_construct_from_parser((CamelMimePart *)bodypart, mp);
- camel_multipart_add_part((CamelMultipart *)content, (CamelMimePart *)bodypart);
- camel_object_unref ((CamelObject *)bodypart);
- }
-
- d(printf("Created multi-part\n"));
- break; }
- default:
- g_warning("Invalid state encountered???: %d", camel_mime_parser_state(mp));
- }
- if (content) {
-#ifndef NO_WARNINGS
-#warning there just has got to be a better way ... to transfer the mime-type to the datawrapper
-#endif
- /* would you believe you have to set this BEFORE you set the content object??? oh my god !!!! */
- camel_data_wrapper_set_mime_type_field (content,
- camel_mime_part_get_content_type ((CamelMimePart *)dw));
- camel_medium_set_content_object((CamelMedium *)dw, content);
- camel_object_unref ((CamelObject *)content);
- }
-}
-
diff --git a/camel/camel-mime-part-utils.h b/camel/camel-mime-part-utils.h
deleted file mode 100644
index 1e1c3655aa..0000000000
--- a/camel/camel-mime-part-utils.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mime-part-utils : Utility for mime parsing and so on */
-
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_MIME_PART_UTILS_H
-#define CAMEL_MIME_PART_UTILS_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-mime-part.h>
-
-void camel_mime_part_construct_content_from_parser(CamelMimePart *, CamelMimeParser *mp);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MIME_PART_UTILS_H */
-
diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c
deleted file mode 100644
index f9519df5e4..0000000000
--- a/camel/camel-mime-part.c
+++ /dev/null
@@ -1,706 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camelMimePart.c : Abstract class for a mime_part */
-
-/*
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include <string.h>
-#include "camel-mime-part.h"
-#include <stdio.h>
-#include "gmime-content-field.h"
-#include "string-utils.h"
-#include "hash-table-utils.h"
-#include "camel-mime-part-utils.h"
-#include <ctype.h>
-#include "camel-mime-parser.h"
-#include "camel-stream-mem.h"
-#include "camel-stream-filter.h"
-#include "camel-mime-filter-basic.h"
-#include "camel-mime-filter-crlf.h"
-#include "camel-exception.h"
-
-#define d(x)
-
-typedef enum {
- HEADER_UNKNOWN,
- HEADER_DESCRIPTION,
- HEADER_DISPOSITION,
- HEADER_CONTENT_ID,
- HEADER_ENCODING,
- HEADER_CONTENT_MD5,
- HEADER_CONTENT_LANGUAGES,
- HEADER_CONTENT_TYPE
-} CamelHeaderType;
-
-
-static GHashTable *header_name_table;
-
-
-static CamelMediumClass *parent_class=NULL;
-
-/* Returns the class for a CamelMimePart */
-#define CMP_CLASS(so) CAMEL_MIME_PART_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CMD_CLASS(so) CAMEL_MEDIUM_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-/* from CamelDataWrapper */
-static int write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream);
-static int construct_from_stream (CamelDataWrapper *dw, CamelStream *s);
-
-/* from CamelMedia */
-static void add_header (CamelMedium *medium, const char *header_name, const void *header_value);
-static void set_header (CamelMedium *medium, const char *header_name, const void *header_value);
-static void remove_header (CamelMedium *medium, const char *header_name);
-static const void *get_header (CamelMedium *medium, const char *header_name);
-
-static void set_content_object (CamelMedium *medium, CamelDataWrapper *content);
-
-/* from camel mime parser */
-static int construct_from_parser (CamelMimePart *, CamelMimeParser *);
-
-/* forward references */
-static void set_disposition (CamelMimePart *mime_part, const gchar *disposition);
-
-
-/* loads in a hash table the set of header names we */
-/* recognize and associate them with a unique enum */
-/* identifier (see CamelHeaderType above) */
-static void
-init_header_name_table()
-{
- header_name_table = g_hash_table_new (g_strcase_hash, g_strcase_equal);
- g_hash_table_insert (header_name_table, "Content-Description", (gpointer)HEADER_DESCRIPTION);
- g_hash_table_insert (header_name_table, "Content-Disposition", (gpointer)HEADER_DISPOSITION);
- g_hash_table_insert (header_name_table, "Content-id", (gpointer)HEADER_CONTENT_ID);
- g_hash_table_insert (header_name_table, "Content-Transfer-Encoding", (gpointer)HEADER_ENCODING);
- g_hash_table_insert (header_name_table, "Content-MD5", (gpointer)HEADER_CONTENT_MD5);
- g_hash_table_insert (header_name_table, "Content-Type", (gpointer)HEADER_CONTENT_TYPE);
-
-}
-
-static void
-camel_mime_part_class_init (CamelMimePartClass *camel_mime_part_class)
-{
- CamelMediumClass *camel_medium_class = CAMEL_MEDIUM_CLASS (camel_mime_part_class);
- CamelDataWrapperClass *camel_data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_mime_part_class);
-
- parent_class = CAMEL_MEDIUM_CLASS (camel_type_get_global_classfuncs (camel_medium_get_type ()));
- init_header_name_table();
-
- camel_mime_part_class->construct_from_parser = construct_from_parser;
-
- /* virtual method overload */
- camel_medium_class->add_header = add_header;
- camel_medium_class->set_header = set_header;
- camel_medium_class->get_header = get_header;
- camel_medium_class->remove_header = remove_header;
- camel_medium_class->set_content_object = set_content_object;
-
- camel_data_wrapper_class->write_to_stream = write_to_stream;
- camel_data_wrapper_class->construct_from_stream= construct_from_stream;
-}
-
-static void
-camel_mime_part_init (gpointer object, gpointer klass)
-{
- CamelMimePart *camel_mime_part = CAMEL_MIME_PART (object);
-
- camel_mime_part->content_type = gmime_content_field_new ("text", "plain");
- camel_mime_part->description = NULL;
- camel_mime_part->disposition = NULL;
- camel_mime_part->content_id = NULL;
- camel_mime_part->content_MD5 = NULL;
- camel_mime_part->content_languages = NULL;
- camel_mime_part->encoding = CAMEL_MIME_PART_ENCODING_DEFAULT;
-
- camel_mime_part->temp_message_buffer = NULL;
- camel_mime_part->content_input_stream = NULL;
-}
-
-
-static void
-camel_mime_part_finalize (CamelObject *object)
-{
- CamelMimePart *mime_part = CAMEL_MIME_PART (object);
-
- g_free (mime_part->description);
- g_free (mime_part->content_id);
- g_free (mime_part->content_MD5);
- string_list_free (mime_part->content_languages);
- header_disposition_unref(mime_part->disposition);
-
- if (mime_part->content_type) gmime_content_field_unref (mime_part->content_type);
- if (mime_part->temp_message_buffer) g_byte_array_free (mime_part->temp_message_buffer, TRUE);
-
- if (mime_part->content_input_stream) camel_object_unref (CAMEL_OBJECT (mime_part->content_input_stream));
-
- header_raw_clear(&mime_part->headers);
-}
-
-
-
-CamelType
-camel_mime_part_get_type (void)
-{
- static CamelType camel_mime_part_type = CAMEL_INVALID_TYPE;
-
- if (camel_mime_part_type == CAMEL_INVALID_TYPE) {
- camel_mime_part_type = camel_type_register (CAMEL_MEDIUM_TYPE, "CamelMimePart",
- sizeof (CamelMimePart),
- sizeof (CamelMimePartClass),
- (CamelObjectClassInitFunc) camel_mime_part_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mime_part_init,
- (CamelObjectFinalizeFunc) camel_mime_part_finalize);
- }
-
- return camel_mime_part_type;
-}
-
-
-/* **** */
-
-static gboolean
-process_header(CamelMedium *medium, const char *header_name, const char *header_value)
-{
- CamelMimePart *mime_part = CAMEL_MIME_PART (medium);
- CamelHeaderType header_type;
- char *text;
-
- /* Try to parse the header pair. If it corresponds to something */
- /* known, the job is done in the parsing routine. If not, */
- /* we simply add the header in a raw fashion */
-
- /* FIXMME: MUST check fields for validity before adding them! */
-
- header_type = (CamelHeaderType) g_hash_table_lookup (header_name_table, header_name);
- switch (header_type) {
- case HEADER_DESCRIPTION: /* raw header->utf8 conversion */
- text = header_decode_string(header_value);
- g_free(mime_part->description);
- mime_part->description = text;
- break;
- case HEADER_DISPOSITION:
- set_disposition (mime_part, header_value);
- break;
- case HEADER_CONTENT_ID:
- text = header_msgid_decode(header_value);
- g_free(mime_part->content_id);
- mime_part->content_id = text;
- break;
- case HEADER_ENCODING:
- text = header_token_decode(header_value);
- mime_part->encoding = camel_mime_part_encoding_from_string (text);
- g_free(text);
- break;
- case HEADER_CONTENT_MD5:
- g_free(mime_part->content_MD5);
- mime_part->content_MD5 = g_strdup(header_value);
- break;
- case HEADER_CONTENT_TYPE:
- gmime_content_field_construct_from_string (mime_part->content_type, header_value);
- break;
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-
-static void
-set_header (CamelMedium *medium, const char *header_name, const void *header_value)
-{
- CamelMimePart *part = (CamelMimePart *)medium;
-
- process_header(medium, header_name, header_value);
- header_raw_replace(&part->headers, header_name, header_value, -1);
-}
-
-static void
-add_header (CamelMedium *medium, const char *header_name, const void *header_value)
-{
- CamelMimePart *part = (CamelMimePart *)medium;
-
- /* Try to parse the header pair. If it corresponds to something */
- /* known, the job is done in the parsing routine. If not, */
- /* we simply add the header in a raw fashion */
-
- /* FIXMME: MUST check fields for validity before adding them! */
-
- /* If it was one of the headers we handled, it must be unique, set it instead of add */
- if (process_header(medium, header_name, header_value))
- header_raw_replace(&part->headers, header_name, header_value, -1);
- else
- header_raw_append(&part->headers, header_name, header_value, -1);
-}
-
-static void
-remove_header (CamelMedium *medium, const char *header_name)
-{
- CamelMimePart *part = (CamelMimePart *)medium;
-
- process_header(medium, header_name, NULL);
- header_raw_remove(&part->headers, header_name);
-}
-
-static const void *
-get_header (CamelMedium *medium, const char *header_name)
-{
- CamelMimePart *part = (CamelMimePart *)medium;
-
- return header_raw_find(&part->headers, header_name, NULL);
-}
-
-
-/* **** Content-Description */
-void
-camel_mime_part_set_description (CamelMimePart *mime_part, const gchar *description)
-{
- camel_medium_set_header (CAMEL_MEDIUM (mime_part),
- "Content-Description", description);
-}
-
-const gchar *
-camel_mime_part_get_description (CamelMimePart *mime_part)
-{
- return mime_part->description;
-}
-
-/* **** Content-Disposition */
-
-static void
-set_disposition (CamelMimePart *mime_part, const gchar *disposition)
-{
- header_disposition_unref(mime_part->disposition);
- if (disposition)
- mime_part->disposition = header_disposition_decode(disposition);
- else
- mime_part->disposition = NULL;
-}
-
-
-void
-camel_mime_part_set_disposition (CamelMimePart *mime_part, const gchar *disposition)
-{
- char *text;
-
- /* we poke in a new disposition (so we dont lose 'filename', etc) */
- if (mime_part->disposition == NULL) {
- set_disposition(mime_part, disposition);
- }
- if (mime_part->disposition != NULL) {
- g_free(mime_part->disposition->disposition);
- mime_part->disposition->disposition = g_strdup(disposition);
- }
- text = header_disposition_format(mime_part->disposition);
-
- camel_medium_set_header (CAMEL_MEDIUM (mime_part),
- "Content-Disposition", text);
-
- g_free(text);
-}
-
-const gchar *
-camel_mime_part_get_disposition (CamelMimePart *mime_part)
-{
- if (mime_part->disposition)
- return (mime_part->disposition)->disposition;
- else
- return NULL;
-}
-
-
-/* **** Content-Disposition: filename="xxx" */
-
-void
-camel_mime_part_set_filename (CamelMimePart *mime_part, const gchar *filename)
-{
- char *str;
- if (mime_part->disposition == NULL)
- mime_part->disposition = header_disposition_decode("attachment");
-
- header_set_param(&mime_part->disposition->params, "filename", filename);
- str = header_disposition_format(mime_part->disposition);
-
- camel_medium_set_header (CAMEL_MEDIUM (mime_part),
- "Content-Disposition", str);
- g_free(str);
-}
-
-const gchar *
-camel_mime_part_get_filename (CamelMimePart *mime_part)
-{
- if (mime_part->disposition)
- return header_param(mime_part->disposition->params, "filename");
- return NULL;
-}
-
-
-/* **** Content-ID: */
-
-void
-camel_mime_part_set_content_id (CamelMimePart *mime_part, const char *contentid)
-{
- camel_medium_set_header (CAMEL_MEDIUM (mime_part), "Content-ID",
- contentid);
-}
-
-const gchar *
-camel_mime_part_get_content_id (CamelMimePart *mime_part)
-{
- return mime_part->content_id;
-}
-
-/* **** Content-MD5: */
-
-void
-camel_mime_part_set_content_MD5 (CamelMimePart *mime_part, const char *md5)
-{
- camel_medium_set_header (CAMEL_MEDIUM (mime_part), "Content-MD5", md5);
-}
-
-const gchar *
-camel_mime_part_get_content_MD5 (CamelMimePart *mime_part)
-{
- return mime_part->content_MD5;
-}
-
-/* **** Content-Transfer-Encoding: */
-
-void
-camel_mime_part_set_encoding (CamelMimePart *mime_part,
- CamelMimePartEncodingType encoding)
-{
- const char *text;
-
- text = camel_mime_part_encoding_to_string (encoding);
- camel_medium_set_header (CAMEL_MEDIUM (mime_part),
- "Content-Transfer-Encoding", text);
-}
-
-const CamelMimePartEncodingType
-camel_mime_part_get_encoding (CamelMimePart *mime_part)
-{
- return mime_part->encoding;
-}
-
-/* FIXME: do something with this stuff ... */
-
-void
-camel_mime_part_set_content_languages (CamelMimePart *mime_part, GList *content_languages)
-{
- if (mime_part->content_languages) string_list_free (mime_part->content_languages);
- mime_part->content_languages = content_languages;
-
- /* FIXME: translate to a header and set it */
-}
-
-const GList *
-camel_mime_part_get_content_languages (CamelMimePart *mime_part)
-{
- return mime_part->content_languages;
-}
-
-
-/* **** */
-
-/* **** Content-Type: */
-
-void
-camel_mime_part_set_content_type (CamelMimePart *mime_part, gchar *content_type)
-{
- camel_medium_set_header (CAMEL_MEDIUM (mime_part),
- "Content-Type", content_type);
-}
-
-GMimeContentField *
-camel_mime_part_get_content_type (CamelMimePart *mime_part)
-{
- return mime_part->content_type;
-}
-
-/*********/
-
-
-
-static void
-set_content_object (CamelMedium *medium, CamelDataWrapper *content)
-{
- CamelMimePart *mime_part = CAMEL_MIME_PART (medium);
- GMimeContentField *object_content_field;
-
- parent_class->set_content_object (medium, content);
-
- object_content_field = camel_data_wrapper_get_mime_type_field (content);
- if (mime_part->content_type &&
- (mime_part->content_type != object_content_field)) {
- char *txt;
-
- txt = header_content_type_format(object_content_field?object_content_field->content_type:NULL);
- camel_medium_set_header (CAMEL_MEDIUM (mime_part),
- "Content-Type", txt);
- }
-}
-
-/**********************************************************************/
-
-static int
-write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream)
-{
- CamelMimePart *mp = CAMEL_MIME_PART (data_wrapper);
- CamelMedium *medium = CAMEL_MEDIUM (data_wrapper);
- CamelDataWrapper *content;
- int total = 0;
- int count;
-
- d(printf("mime_part::write_to_stream\n"));
-
- /* FIXME: something needs to be done about this ... */
- /* FIXME: need to count these bytes too */
-#ifndef NO_WARNINGS
-#warning content-languages should be stored as a header
-#endif
-
- if (mp->headers) {
- struct _header_raw *h = mp->headers;
- while (h) {
- count = camel_stream_printf(stream, "%s%s%s\n", h->name, isspace(h->value[0]) ? ":" : ": ", h->value);
- if (count == -1)
- return -1;
- total += count;
- h = h->next;
- }
- }
-
- count = camel_stream_write (stream, "\n", 1);
- if (count == -1)
- return -1;
- total += count;
-
- content = camel_medium_get_content_object (medium);
- if (content) {
- /* I dont really like this here, but i dont know where else it might go ... */
-#define CAN_THIS_GO_ELSEWHERE
-#ifdef CAN_THIS_GO_ELSEWHERE
- CamelMimeFilter *filter = NULL;
- CamelStreamFilter *filter_stream = NULL;
-
- switch(mp->encoding) {
- case CAMEL_MIME_PART_ENCODING_BASE64:
- filter = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_BASE64_ENC);
- break;
- case CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE:
- filter = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_QP_ENC);
- break;
- default:
- break;
- }
- if (filter) {
- filter_stream = camel_stream_filter_new_with_stream(stream);
- if (!strcasecmp(mp->content_type->type, "text")) {
- CamelMimeFilter *crlf = camel_mime_filter_crlf_new(CAMEL_MIME_FILTER_CRLF_ENCODE,
- CAMEL_MIME_FILTER_CRLF_MODE_CRLF_ONLY);
- camel_stream_filter_add(filter_stream, crlf);
- camel_object_unref((CamelObject *)crlf);
- }
- camel_stream_filter_add(filter_stream, filter);
- camel_object_unref((CamelObject *)filter);
- stream = (CamelStream *)filter_stream;
- }
-
-#endif
- count = camel_data_wrapper_write_to_stream (content, stream);
- if (filter_stream) {
- camel_stream_flush((CamelStream *)filter_stream);
- camel_object_unref((CamelObject *)filter_stream);
- }
- if (count == -1)
- return -1;
- total += count;
- } else {
- g_warning("No content for medium, nothing to write");
- }
- return total;
-}
-
-/* mime_part */
-static int
-construct_from_parser(CamelMimePart *dw, CamelMimeParser *mp)
-{
- struct _header_raw *headers;
- char *buf;
- int len;
-
- d(printf("mime_part::construct_from_parser()\n"));
-
- switch (camel_mime_parser_step(mp, &buf, &len)) {
- case HSCAN_MESSAGE:
- /* set the default type of a message always */
- gmime_content_field_construct_from_string (dw->content_type, "message/rfc822");
- case HSCAN_HEADER:
- case HSCAN_MULTIPART:
- /* we have the headers, build them into 'us' */
- headers = camel_mime_parser_headers_raw(mp);
- while (headers) {
- camel_medium_add_header((CamelMedium *)dw, headers->name, headers->value);
- headers = headers->next;
- }
- camel_mime_part_construct_content_from_parser(dw, mp);
- break;
- default:
- g_warning("Invalid state encountered???: %d", camel_mime_parser_state(mp));
- }
-
- d(printf("mime_part::construct_from_parser() leaving\n"));
-#ifndef NO_WARNINGS
-#warning "Need to work out how to detect a (fatally) bad parse in the parser"
-#endif
- return 0;
-}
-
-/**
- * camel_mime_part_construct_from_parser:
- * @mime_part:
- * @mp:
- *
- *
- *
- * Return value:
- **/
-int
-camel_mime_part_construct_from_parser(CamelMimePart *mime_part, CamelMimeParser *mp)
-{
- return CMP_CLASS (mime_part)->construct_from_parser (mime_part, mp);
-}
-
-static int
-construct_from_stream(CamelDataWrapper *dw, CamelStream *s)
-{
- CamelMimeParser *mp;
- int ret;
-
- d(printf("mime_part::construct_from_stream()\n"));
-
- mp = camel_mime_parser_new();
- if (camel_mime_parser_init_with_stream(mp, s) == -1) {
- g_warning("Cannot create parser for stream");
- ret = -1;
- } else {
- ret = camel_mime_part_construct_from_parser((CamelMimePart *)dw, mp);
- }
- camel_object_unref((CamelObject *)mp);
- return ret;
-}
-
-
-const gchar *
-camel_mime_part_encoding_to_string (CamelMimePartEncodingType encoding)
-{
- switch (encoding) {
- case CAMEL_MIME_PART_ENCODING_DEFAULT:
- case CAMEL_MIME_PART_ENCODING_7BIT:
- return "7bit";
- case CAMEL_MIME_PART_ENCODING_8BIT:
- return "8bit";
- case CAMEL_MIME_PART_ENCODING_BASE64:
- return "base64";
- case CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE:
- return "quoted-printable";
- default:
- break;
- }
- return "";
-}
-
-
-
-/* FIXME I am not sure this is the correct way to do this. */
-CamelMimePartEncodingType
-camel_mime_part_encoding_from_string (const gchar *string)
-{
- if (string == NULL)
- return CAMEL_MIME_PART_ENCODING_DEFAULT;
- else if (strcasecmp (string, "7bit") == 0)
- return CAMEL_MIME_PART_ENCODING_7BIT;
- else if (strcasecmp (string, "8bit") == 0)
- return CAMEL_MIME_PART_ENCODING_8BIT;
- else if (strcasecmp (string, "base64") == 0)
- return CAMEL_MIME_PART_ENCODING_BASE64;
- else if (strcasecmp (string, "quoted-printable") == 0)
- return CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE;
- else
- /* FIXME? Spit a warning? */
- return CAMEL_MIME_PART_ENCODING_DEFAULT;
-}
-
-
-/******************************/
-/** Misc utility functions **/
-
-/**
- * camel_mime_part_new:
- *
- * Return value: a new CamelMimePart
- **/
-CamelMimePart *
-camel_mime_part_new (void)
-{
- return (CamelMimePart *)camel_object_new (CAMEL_MIME_PART_TYPE);
-}
-
-/**
- * camel_mime_part_set_content:
- * @camel_mime_part: Mime part
- * @data: data to put into the part
- * @length: length of @data
- * @type: Content-Type of the data
- *
- * Utility function used to set the content of a mime part object to
- * be the provided data. If @length is 0, this routine can be used as
- * a way to remove old content (in which case @data and @type are
- * ignored and may be %NULL).
- **/
-void
-camel_mime_part_set_content (CamelMimePart *camel_mime_part,
- const char *data, int length,
- const char *type) /* why on earth is the type last? */
-{
- CamelMedium *medium = CAMEL_MEDIUM (camel_mime_part);
-
- if (length) {
- CamelDataWrapper *dw;
- CamelStream *stream;
-
- dw = camel_data_wrapper_new ();
- camel_data_wrapper_set_mime_type (dw, type);
- stream = camel_stream_mem_new_with_buffer (data, length);
- camel_data_wrapper_construct_from_stream (dw, stream);
- camel_object_unref (CAMEL_OBJECT (stream));
- camel_medium_set_content_object (medium, dw);
- camel_object_unref (CAMEL_OBJECT (dw));
- } else {
- if (medium->content)
- camel_object_unref (CAMEL_OBJECT (medium->content));
- medium->content = NULL;
- }
-}
diff --git a/camel/camel-mime-part.h b/camel/camel-mime-part.h
deleted file mode 100644
index e423553318..0000000000
--- a/camel/camel-mime-part.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-mime-part.h : class for a mime part */
-
-/*
- *
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_MIME_PART_H
-#define CAMEL_MIME_PART_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-medium.h>
-#include <camel/camel-mime-utils.h>
-#include <camel/camel-mime-parser.h>
-
-#define CAMEL_MIME_PART_TYPE (camel_mime_part_get_type ())
-#define CAMEL_MIME_PART(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MIME_PART_TYPE, CamelMimePart))
-#define CAMEL_MIME_PART_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MIME_PART_TYPE, CamelMimePartClass))
-#define CAMEL_IS_MIME_PART(o) (CAMEL_CHECK_TYPE((o), CAMEL_MIME_PART_TYPE))
-
-
-enum _CamelMimePartEncodingType {
- CAMEL_MIME_PART_ENCODING_DEFAULT,
- CAMEL_MIME_PART_ENCODING_7BIT,
- CAMEL_MIME_PART_ENCODING_8BIT,
- CAMEL_MIME_PART_ENCODING_BASE64,
- CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE,
- CAMEL_MIME_PART_NUM_ENCODINGS
-};
-typedef enum _CamelMimePartEncodingType CamelMimePartEncodingType;
-
-
-/* Do not change these values directly, you would regret it one day */
-struct _CamelMimePart
-{
- CamelMedium parent_object;
-
- /* All fields here are -** PRIVATE **- */
- gchar *description;
- CamelMimeDisposition *disposition;
- gchar *content_id;
- gchar *content_MD5;
- GList *content_languages;
- CamelMimePartEncodingType encoding;
-
- GByteArray *temp_message_buffer;
- GMimeContentField *content_type;
- CamelStream *content_input_stream;
-
- struct _header_raw *headers; /* mime headers */
-};
-
-typedef struct _CamelMimePartClass {
- CamelMediumClass parent_class;
-
- /* Virtual methods */
- int (*construct_from_parser) (CamelMimePart *, CamelMimeParser *);
-} CamelMimePartClass;
-
-/* Standard Camel function */
-CamelType camel_mime_part_get_type (void);
-
-/* public methods */
-CamelMimePart * camel_mime_part_new (void);
-
-void camel_mime_part_set_description (CamelMimePart *mime_part, const gchar *description);
-const gchar *camel_mime_part_get_description (CamelMimePart *mime_part);
-
-void camel_mime_part_set_disposition (CamelMimePart *mime_part, const gchar *disposition);
-const gchar *camel_mime_part_get_disposition (CamelMimePart *mime_part);
-
-void camel_mime_part_set_filename (CamelMimePart *mime_part, const gchar *filename);
-const gchar *camel_mime_part_get_filename (CamelMimePart *mime_part);
-
-void camel_mime_part_set_content_id (CamelMimePart *mime_part, const char *contentid);
-const gchar *camel_mime_part_get_content_id (CamelMimePart *mime_part);
-
-void camel_mime_part_set_content_MD5 (CamelMimePart *mime_part, const char *);
-const gchar *camel_mime_part_get_content_MD5 (CamelMimePart *mime_part);
-
-void camel_mime_part_set_encoding (CamelMimePart *mime_part, CamelMimePartEncodingType type);
-CamelMimePartEncodingType camel_mime_part_get_encoding (CamelMimePart *mime_part);
-
-void camel_mime_part_set_content_languages (CamelMimePart *mime_part, GList *content_languages);
-const GList *camel_mime_part_get_content_languages (CamelMimePart *mime_part);
-
-/* FIXME: what about content-type parameters? what about major/minor parts? */
-void camel_mime_part_set_content_type (CamelMimePart *mime_part, gchar *content_type);
-GMimeContentField *camel_mime_part_get_content_type (CamelMimePart *mime_part);
-
-const gchar * camel_mime_part_encoding_to_string (CamelMimePartEncodingType encoding);
-CamelMimePartEncodingType camel_mime_part_encoding_from_string (const gchar *string);
-
-/* construction */
-int camel_mime_part_construct_from_parser (CamelMimePart *, CamelMimeParser *);
-
-/* utility functions */
-void camel_mime_part_set_content (CamelMimePart *camel_mime_part,
- const char *content, int length, const char *type);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MIME_PART_H */
-
diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c
deleted file mode 100644
index 3e85f4127f..0000000000
--- a/camel/camel-mime-utils.c
+++ /dev/null
@@ -1,2640 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <unicode.h>
-
-#include <glib.h>
-#include <time.h>
-
-#include <ctype.h>
-#include <errno.h>
-
-#include "camel-mime-utils.h"
-
-#include "broken-date-parser.h"
-
-#if 0
-int strdup_count = 0;
-int malloc_count = 0;
-int free_count = 0;
-
-#define g_strdup(x) (strdup_count++, g_strdup(x))
-#define g_malloc(x) (malloc_count++, g_malloc(x))
-#define g_free(x) (free_count++, g_free(x))
-#endif
-
-/* for all warnings ... */
-#define w(x) x
-
-#define d(x)
-#define d2(x)
-
-#define CAMEL_UUDECODE_CHAR(c) (((c) - ' ') & 077)
-
-static char *base64_alphabet =
-"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-static unsigned char tohex[16] = {
- '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
-};
-
-static unsigned char camel_mime_special_table[256] = {
- 5, 5, 5, 5, 5, 5, 5, 5, 5,167, 7, 5, 5, 39, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 178,128,140,128,128,128,128,128,140,140,128,128,140,128,136,132,
- 128,128,128,128,128,128,128,128,128,128,204,140,140, 4,140,132,
- 140,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
- 128,128,128,128,128,128,128,128,128,128,128,172,172,172,128,128,
- 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
- 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 5,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-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,
-};
-
-/*
- if any of these change, then the tables above should be regenerated
- by compiling this with -DBUILD_TABLE, and running.
-
- gcc -o buildtable `glib-config --cflags --libs` -DBUILD_TABLE camel-mime-utils.c
- ./buildtable
-
-*/
-enum {
- IS_CTRL = 1<<0,
- IS_LWSP = 1<<1,
- IS_TSPECIAL = 1<<2,
- IS_SPECIAL = 1<<3,
- IS_SPACE = 1<<4,
- IS_DSPECIAL = 1<<5,
- IS_COLON = 1<<6, /* rather wasteful of space ... */
- IS_QPSAFE = 1<<7
-};
-
-#define is_ctrl(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_CTRL) != 0)
-#define is_lwsp(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_LWSP) != 0)
-#define is_tspecial(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_TSPECIAL) != 0)
-#define is_type(x, t) ((camel_mime_special_table[(unsigned char)(x)] & (t)) != 0)
-#define is_ttoken(x) ((camel_mime_special_table[(unsigned char)(x)] & (IS_TSPECIAL|IS_LWSP|IS_CTRL)) == 0)
-#define is_atom(x) ((camel_mime_special_table[(unsigned char)(x)] & (IS_SPECIAL|IS_SPACE|IS_CTRL)) == 0)
-#define is_dtext(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_DSPECIAL) == 0)
-#define is_fieldname(x) ((camel_mime_special_table[(unsigned char)(x)] & (IS_CTRL|IS_SPACE|IS_COLON)) == 0)
-#define is_qpsafe(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_QPSAFE) != 0)
-
-/* only needs to be run to rebuild the tables above */
-#ifdef BUILD_TABLE
-
-#define CHARS_LWSP " \t\n\r"
-#define CHARS_TSPECIAL "()<>@,;:\\\"/[]?="
-#define CHARS_SPECIAL "()<>@,;:\\\".[]"
-#define CHARS_CSPECIAL "()\\\r" /* not in comments */
-#define CHARS_DSPECIAL "[]\\\r \t" /* not in domains */
-
-static void
-header_init_bits(unsigned char bit, unsigned char bitcopy, int remove, unsigned char *vals, int len)
-{
- int i;
-
- if (!remove) {
- for (i=0;i<len;i++) {
- camel_mime_special_table[vals[i]] |= bit;
- }
- if (bitcopy) {
- for (i=0;i<256;i++) {
- if (camel_mime_special_table[i] & bitcopy)
- camel_mime_special_table[i] |= bit;
- }
- }
- } else {
- for (i=0;i<256;i++)
- camel_mime_special_table[i] |= bit;
- for (i=0;i<len;i++) {
- camel_mime_special_table[vals[i]] &= ~bit;
- }
- if (bitcopy) {
- for (i=0;i<256;i++) {
- if (camel_mime_special_table[i] & bitcopy)
- camel_mime_special_table[i] &= ~bit;
- }
- }
- }
-}
-
-static void
-header_decode_init(void)
-{
- int i;
-
- for (i=0;i<256;i++) camel_mime_special_table[i] = 0;
- for (i=0;i<32;i++) camel_mime_special_table[i] |= IS_CTRL;
- camel_mime_special_table[127] = IS_CTRL;
- camel_mime_special_table[' '] = IS_SPACE;
- camel_mime_special_table[':'] = IS_COLON;
- header_init_bits(IS_LWSP, 0, 0, CHARS_LWSP, sizeof(CHARS_LWSP)-1);
- header_init_bits(IS_TSPECIAL, IS_CTRL, 0, CHARS_TSPECIAL, sizeof(CHARS_TSPECIAL)-1);
- header_init_bits(IS_SPECIAL, 0, 0, CHARS_SPECIAL, sizeof(CHARS_SPECIAL)-1);
- header_init_bits(IS_DSPECIAL, 0, FALSE, CHARS_DSPECIAL, sizeof(CHARS_DSPECIAL)-1);
- for (i=0;i<256;i++) if ((i>=33 && i<=60) || (i>=62 && i<=126) || i==32 || i==9) camel_mime_special_table[i] |= IS_QPSAFE;
-}
-
-void
-base64_init(void)
-{
- int i;
-
- memset(camel_mime_base64_rank, 0xff, sizeof(camel_mime_base64_rank));
- for (i=0;i<64;i++) {
- camel_mime_base64_rank[(unsigned int)base64_alphabet[i]] = i;
- }
- camel_mime_base64_rank['='] = 0;
-}
-
-int main(int argc, char **argv)
-{
- int i;
- void run_test(void);
-
- header_decode_init();
- base64_init();
-
- printf("static unsigned char camel_mime_special_table[256] = {\n\t");
- for (i=0;i<256;i++) {
- printf("%3d,", camel_mime_special_table[i]);
- if ((i&15) == 15) {
- printf("\n");
- if (i!=255) {
- printf("\t");
- }
- }
- }
- printf("};\n");
-
- printf("static unsigned char camel_mime_base64_rank[256] = {\n\t");
- for (i=0;i<256;i++) {
- printf("%3d,", camel_mime_base64_rank[i]);
- if ((i&15) == 15) {
- printf("\n");
- if (i!=255) {
- printf("\t");
- }
- }
- }
- printf("};\n");
-
- run_test();
-
- return 0;
-}
-
-#endif
-
-
-/* call this when finished encoding everything, to
- flush off the last little bit */
-int
-base64_encode_close(unsigned char *in, int inlen, unsigned char *out, int *state, int *save)
-{
- int c1, c2;
- unsigned char *outptr = out;
-
- if (inlen>0)
- outptr += base64_encode_step(in, inlen, outptr, state, save);
-
- c1 = ((char *)save)[1];
- c2 = ((char *)save)[2];
-
- switch (((char *)save)[0]) {
- case 2:
- outptr[2] = base64_alphabet [ ( (c2 &0x0f) << 2 ) ];
- 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;
- }
- *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).
-*/
-int
-base64_encode_step(unsigned char *in, int len, unsigned char *out, int *state, int *save)
-{
- register unsigned char *inptr, *outptr;
-
- if (len<=0)
- return 0;
-
- inptr = in;
- outptr = out;
-
- d(printf("we have %d chars, and %d saved chars\n", len, ((char *)save)[0]));
-
- 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, its 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 ((++already)>=19) {
- *outptr++='\n';
- already = 0;
- }
- }
-
- ((char *)save)[0] = 0;
- len = 2-(inptr-inend);
- *state = already;
- }
-
- d(printf("state = %d, len = %d\n",
- (int)((char *)save)[0],
- len));
-
- 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;
- }
-
- d(printf("mode = %d\nc1 = %c\nc2 = %c\n",
- (int)((char *)save)[0],
- (int)((char *)save)[1],
- (int)((char *)save)[2]));
-
- return outptr-out;
-}
-
-
-/**
- * base64_decode_step: decode a chunk of base64 encoded data
- * @in: input stream
- * @len: max length of data to decode ( normally strlen(in) ??)
- * @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
- **/
-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;
-}
-
-
-/**
- * uudecode_step: uudecode a chunk of data
- * @in: input stream
- * @len: max length of data to decode ( normally strlen(in) ??)
- * @out: output stream
- * @state: holds the number of bits that are stored in @save
- * @save: leftover bits that have not yet been decoded
- * @uulen: holds the value of the length-char which is used to calculate
- * how many more chars need to be decoded for that 'line'
- *
- * uudecodes a chunk of data. Assumes the "begin <mode> <file name>" line
- * has been stripped off.
- **/
-int
-uudecode_step (unsigned char *in, int len, unsigned char *out, int *state, guint32 *save, char *uulen)
-{
- register unsigned char *inptr, *outptr;
- unsigned char *inend, ch;
- register guint32 saved;
- gboolean last_was_eoln;
- int i;
-
- if (*uulen <= 0)
- last_was_eoln = TRUE;
- else
- last_was_eoln = FALSE;
-
- inend = in + len;
- outptr = out;
- saved = *save;
- i = *state;
- inptr = in;
- while (inptr < inend && *inptr) {
- if (*inptr == '\n' || last_was_eoln) {
- if (last_was_eoln) {
- *uulen = CAMEL_UUDECODE_CHAR (*inptr);
- last_was_eoln = FALSE;
- } else {
- last_was_eoln = TRUE;
- }
-
- inptr++;
- continue;
- }
-
- ch = *inptr++;
-
- if (*uulen > 0) {
- /* save the byte */
- saved = (saved << 8) | ch;
- i++;
- if (i == 4) {
- /* convert 4 uuencoded bytes to 3 normal bytes */
- unsigned char b0, b1, b2, b3;
-
- b0 = saved >> 24;
- b1 = saved >> 16 & 0xff;
- b2 = saved >> 8 & 0xff;
- b3 = saved & 0xff;
-
- if (*uulen >= 3) {
- *outptr++ = CAMEL_UUDECODE_CHAR (b0) << 2 | CAMEL_UUDECODE_CHAR (b1) >> 4;
- *outptr++ = CAMEL_UUDECODE_CHAR (b1) << 4 | CAMEL_UUDECODE_CHAR (b2) >> 2;
- *outptr++ = CAMEL_UUDECODE_CHAR (b2) << 6 | CAMEL_UUDECODE_CHAR (b3);
- } else {
- if (*uulen >= 1) {
- *outptr++ = CAMEL_UUDECODE_CHAR (b0) << 2 | CAMEL_UUDECODE_CHAR (b1) >> 4;
- }
- if (*uulen >= 2) {
- *outptr++ = CAMEL_UUDECODE_CHAR (b1) << 4 | CAMEL_UUDECODE_CHAR (b2) >> 2;
- }
- }
-
- i = 0;
- saved = 0;
- *uulen -= 3;
- }
- } else {
- break;
- }
- }
-
- *save = saved;
- *state = i;
-
- return outptr - out;
-}
-
-int
-quoted_encode_close(unsigned char *in, int len, unsigned char *out, int *state, int *save)
-{
- register unsigned char *outptr = out;
- int last;
-
- if (len>0)
- outptr += quoted_encode_step(in, len, outptr, state, save);
-
- last = *state;
- if (last != -1) {
- /* space/tab must be encoded if its the last character on
- the line */
- if (is_qpsafe(last) && last!=' ' && last!=9) {
- *outptr++ = last;
- } else {
- *outptr++ = '=';
- *outptr++ = tohex[(last>>4) & 0xf];
- *outptr++ = tohex[last & 0xf];
- }
- }
-
- /* hmm, not sure if this should really be added here, we dont want
- to add it to the content, afterall ...? */
- *outptr++ = '\n';
-
- *save = 0;
- *state = -1;
-
- return outptr-out;
-}
-
-int
-quoted_encode_step(unsigned char *in, int len, unsigned char *out, int *statep, int *save)
-{
- register unsigned char *inptr, *outptr, *inend;
- unsigned char c;
- register int sofar = *save, /* keeps track of how many chars on a line */
- last=*statep; /* keeps track if last char to end was a space cr etc */
-
- inptr = in;
- inend = in+len;
- outptr = out;
- while (inptr<inend) {
- c = *inptr++;
- if (c=='\r') {
- if (last != -1) {
- *outptr++ = '=';
- *outptr++ = tohex[(last>>4) & 0xf];
- *outptr++ = tohex[last & 0xf];
- sofar+=3;
- }
- last = c;
- } else if (c=='\n') {
- if (last != -1 && last!='\r') {
- *outptr++ = '=';
- *outptr++ = tohex[(last>>4) & 0xf];
- *outptr++ = tohex[last & 0xf];
- }
- *outptr++ = '\n';
- sofar=0;
- last = -1;
- } else {
- if (last != -1) {
- if (is_qpsafe(last)) {
- *outptr++ = last;
- sofar++;
- } else {
- *outptr++ = '=';
- *outptr++ = tohex[(last>>4) & 0xf];
- *outptr++ = tohex[last & 0xf];
- sofar+=3;
- }
- }
- if (is_qpsafe(c)) {
- if (sofar>74) {
- *outptr++='=';
- *outptr++='\n';
- sofar = 0;
- }
- /* delay output of space */
- if (c==' ' || c==0x09) {
- last = c;
- } else {
- *outptr++=c;
- sofar++;
- last = -1;
- }
- } else {
- if (sofar>72) {
- *outptr++='=';
- *outptr++='\n';
- sofar = 3;
- } else
- sofar += 3;
- *outptr++ = '=';
- *outptr++ = tohex[(c>>4) & 0xf];
- *outptr++ = tohex[c & 0xf];
- last = -1;
- }
- }
- }
- *save = sofar;
- *statep = last;
- return outptr-out;
-}
-
-/*
- FIXME: this does not strip trailing spaces from lines (as it should, rfc 2045, section 6.7)
- Should it also canonicalise the end of line to CR LF??
-
- Note: Trailing rubbish (at the end of input), like = or =x or =\r will be lost.
-*/
-
-int
-quoted_decode_step(unsigned char *in, int len, unsigned char *out, int *savestate, int *saveme)
-{
- register unsigned char *inptr, *outptr;
- unsigned char *inend, c;
- int state, save;
-
- inend = in+len;
- outptr = out;
-
- d(printf("quoted-printable, decoding text '%.*s'\n", len, in));
-
- state = *savestate;
- save = *saveme;
- inptr = in;
- while (inptr<inend) {
- switch (state) {
- case 0:
- while (inptr<inend) {
- c = *inptr++;
- /* FIXME: use a specials table to avoid 3 comparisons for the common case */
- if (c=='=') {
- state = 1;
- break;
- }
-#ifdef CANONICALISE_EOL
- /*else if (c=='\r') {
- state = 3;
- } else if (c=='\n') {
- *outptr++ = '\r';
- *outptr++ = c;
- } */
-#endif
- else {
- *outptr++ = c;
- }
- }
- break;
- case 1:
- c = *inptr++;
- if (c=='\n') {
- /* soft break ... unix end of line */
- state = 0;
- } else {
- save = c;
- state = 2;
- }
- break;
- case 2:
- c = *inptr++;
- if (isxdigit(c) && isxdigit(save)) {
- c = toupper(c);
- save = toupper(save);
- *outptr++ = (((save>='A'?save-'A'+10:save-'0')&0x0f) << 4)
- | ((c>='A'?c-'A'+10:c-'0')&0x0f);
- } else if (c=='\n' && save == '\r') {
- /* soft break ... canonical end of line */
- } else {
- /* just output the data */
- *outptr++ = '=';
- *outptr++ = save;
- *outptr++ = c;
- }
- state = 0;
- break;
-#ifdef CANONICALISE_EOL
- case 3:
- /* convert \r -> to \r\n, leaves \r\n alone */
- c = *inptr++;
- if (c=='\n') {
- *outptr++ = '\r';
- *outptr++ = c;
- } else {
- *outptr++ = '\r';
- *outptr++ = '\n';
- *outptr++ = c;
- }
- state = 0;
- break;
-#endif
- }
- }
-
- *savestate = state;
- *saveme = save;
-
- return outptr-out;
-}
-
-/*
- this is for the "Q" encoding of international words,
- which is slightly different than plain quoted-printable
-*/
-static int
-quoted_decode(const unsigned char *in, int len, unsigned char *out)
-{
- register const unsigned char *inptr;
- register unsigned char *outptr;
- unsigned const char *inend;
- unsigned char c, c1;
- int ret = 0;
-
- inend = in+len;
- outptr = out;
-
- d(printf("decoding text '%.*s'\n", len, in));
-
- inptr = in;
- while (inptr<inend) {
- c = *inptr++;
- if (c=='=') {
- /* silently ignore truncated data? */
- if (inend-in>=2) {
- c = toupper(*inptr++);
- c1 = toupper(*inptr++);
- *outptr++ = (((c>='A'?c-'A'+10:c-'0')&0x0f) << 4)
- | ((c1>='A'?c1-'A'+10:c1-'0')&0x0f);
- } else {
- ret = -1;
- break;
- }
- } else if (c=='_') {
- *outptr++ = 0x20;
- } else if (c==' ' || c==0x09) {
- /* FIXME: this is an error! ignore for now ... */
- ret = -1;
- break;
- } else {
- *outptr++ = c;
- }
- }
- if (ret==0) {
- return outptr-out;
- }
- return -1;
-}
-
-/* rfc2047 version of quoted-printable */
-static int
-quoted_encode(const unsigned char *in, int len, unsigned char *out)
-{
- register const unsigned char *inptr, *inend;
- unsigned char *outptr;
- unsigned char c;
-
- inptr = in;
- inend = in+len;
- outptr = out;
- while (inptr<inend) {
- c = *inptr++;
- if (is_qpsafe(c) && !(c=='_' || c=='?')) {
- if (c==' ')
- c='_';
- *outptr++=c;
- } else {
- *outptr++ = '=';
- *outptr++ = tohex[(c>>4) & 0xf];
- *outptr++ = tohex[c & 0xf];
- }
- }
-
- printf("encoding '%.*s' = '%.*s'\n", len, in, outptr-out, out);
-
- return outptr-out;
-}
-
-
-static void
-header_decode_lwsp(const char **in)
-{
- const char *inptr = *in;
- char c;
-
- d2(printf("is ws: '%s'\n", *in));
-
- while (is_lwsp(*inptr) || (*inptr =='(' && *inptr != '\0')) {
- while (is_lwsp(*inptr) && inptr != '\0') {
- d2(printf("(%c)", *inptr));
- inptr++;
- }
- d2(printf("\n"));
-
- /* check for comments */
- if (*inptr == '(') {
- int depth = 1;
- inptr++;
- while (depth && (c=*inptr) && *inptr != '\0') {
- if (c=='\\' && inptr[1]) {
- inptr++;
- } else if (c=='(') {
- depth++;
- } else if (c==')') {
- depth--;
- }
- inptr++;
- }
- }
- }
- *in = inptr;
-}
-
-/* decode rfc 2047 encoded string segment */
-static char *
-rfc2047_decode_word(const char *in, int len)
-{
- const char *inptr = in+2;
- const char *inend = in+len-2;
- char *encname;
- int tmplen;
- int ret;
- char *decword = NULL;
- char *decoded = NULL;
- char *outbase = NULL;
- char *inbuf, *outbuf;
- int inlen, outlen;
- unicode_iconv_t ic;
-
- d(printf("decoding '%.*s'\n", len, in));
-
- /* just make sure we're not passed shit */
- if (len<7
- || !(in[0]=='=' && in[1]=='?' && in[len-1]=='=' && in[len-2]=='?')) {
- d(printf("invalid\n"));
- return NULL;
- }
-
- inptr = memchr(inptr, '?', inend-inptr);
- if (inptr!=NULL
- && inptr<inend+2
- && inptr[2]=='?') {
- d(printf("found ?, encoding is '%c'\n", inptr[0]));
- inptr++;
- tmplen = inend-inptr-2;
- decword = alloca(tmplen); /* this will always be more-than-enough room */
- switch(toupper(inptr[0])) {
- case 'Q':
- inlen = quoted_decode(inptr+2, tmplen, decword);
- break;
- case 'B': {
- int state=0;
- unsigned int save=0;
- inlen = base64_decode_step((char *)inptr+2, tmplen, decword, &state, &save);
- /* if state != 0 then error? */
- break;
- }
- }
- d(printf("The encoded length = %d\n", inlen));
- if (inlen>0) {
- /* yuck, all this snot is to setup iconv! */
- tmplen = inptr-in-3;
- encname = alloca(tmplen+1);
- encname[tmplen]=0;
- memcpy(encname, in+2, tmplen);
-
- inbuf = decword;
-
- outlen = inlen*6;
- outbase = alloca(outlen);
- outbuf = outbase;
-
- /* TODO: Should this cache iconv converters? */
- ic = unicode_iconv_open("iso-8859-1", encname);
- if (ic != (unicode_iconv_t)-1) {
- ret = unicode_iconv(ic, (const char **)&inbuf, &inlen, &outbuf, &outlen);
- unicode_iconv_close(ic);
- if (ret>=0) {
- *outbuf = 0;
- decoded = g_strdup(outbase);
- }
- } else {
- w(g_warning("Cannot decode charset, header display may be corrupt: %s: %s", encname, strerror(errno)));
- /* TODO: Should this do this, or just leave the encoded strings? */
- decword[inlen] = 0;
- decoded = g_strdup(decword);
- }
- }
- }
-
- d(printf("decoded '%s'\n", decoded));
-
- return decoded;
-}
-
-/* grrr, glib should have this ! */
-static GString *
-g_string_append_len(GString *st, const char *s, int l)
-{
- char *tmp;
-
- tmp = alloca(l+1);
- tmp[l]=0;
- memcpy(tmp, s, l);
- return g_string_append(st, tmp);
-}
-
-/* decodes a simple text, rfc822 */
-static char *
-header_decode_text(const char *in, int inlen)
-{
- GString *out;
- const char *inptr = in;
- const char *inend = in+inlen;
- char *encstart, *encend;
- char *decword;
-
- out = g_string_new("");
- while ( (encstart = strstr(inptr, "=?"))
- && (encend = strstr(encstart+2, "?=")) ) {
-
- decword = rfc2047_decode_word(encstart, encend-encstart+2);
- if (decword) {
- out = g_string_append_len(out, inptr, encstart-inptr);
- out = g_string_append_len(out, decword, strlen(decword));
- free(decword);
- } else {
- out = g_string_append_len(out, inptr, encend-inptr+2);
- }
- inptr = encend+2;
- }
- out = g_string_append_len(out, inptr, inend-inptr);
-
- encstart = out->str;
- g_string_free(out, FALSE);
-
- return encstart;
-}
-
-char *
-header_decode_string(const char *in)
-{
- if (in == NULL)
- return NULL;
- return header_decode_text(in, strlen(in));
-}
-
-static char *encoding_map[] = {
- "US-ASCII",
- "ISO-8859-1",
- "UTF-8"
-};
-
-/* FIXME: needs a way to cache iconv opens for different charsets? */
-static
-char *rfc2047_encode_word(const char *in, int len, char *type)
-{
- unicode_iconv_t ic;
- char *buffer, *out, *ascii;
- size_t inlen, outlen, enclen;
-
- d(printf("Converting '%.*s' to %s\n", len, in, type));
-
- /* convert utf8->encoding */
- outlen = len*6;
- buffer = alloca(outlen);
- inlen = len;
- out = buffer;
-
- /* if we can't convert from utf-8, just encode as utf-8 */
- if (!strcasecmp(type, "UTF-8")
- || (ic = unicode_iconv_open(type, "UTF-8")) == (unicode_iconv_t)-1) {
- memcpy(buffer, in, len);
- out = buffer+len;
- type = "UTF-8";
- } else {
- if (unicode_iconv(ic, &in, &inlen, &out, &outlen) == -1) {
- w(g_warning("Conversion problem: conversion truncated: %s", strerror(errno)));
- }
- unicode_iconv_close(ic);
- }
- enclen = out-buffer;
-
- /* now create qp version */
- ascii = alloca(enclen*3 + strlen(type) + 8);
- out = ascii;
- /* should determine which encoding is smaller, and use that? */
- out += sprintf(out, "=?%s?Q?", type);
- out += quoted_encode(buffer, enclen, out);
- sprintf(out, "?=");
-
- d(printf("converted = %s\n", ascii));
- return g_strdup(ascii);
-}
-
-
-/* TODO: Should this worry about quotes?? */
-char *
-header_encode_string(const unsigned char *in)
-{
- GString *out;
- const unsigned char *inptr = in, *start;
- int encoding;
- char *outstr;
-
- if (in == NULL)
- return NULL;
-
- /* do a quick us-ascii check (the common case?) */
- while (*inptr) {
- if (*inptr > 127)
- break;
- inptr++;
- }
- if (*inptr == 0)
- return g_strdup(in);
-
- /* This gets each word out of the input, and checks to see what charset
- can be used to encode it. */
- /* TODO: Work out when to merge subsequent words, or across word-parts */
- /* FIXME: Make sure a converted word is less than the encoding size */
- out = g_string_new("");
- inptr = in;
- encoding = 0;
- start = inptr;
- while (inptr && *inptr) {
- unicode_char_t c;
- const char *newinptr;
- newinptr = unicode_get_utf8(inptr, &c);
- if (newinptr == NULL) {
- w(g_warning("Invalid UTF-8 sequence encountered (pos %d, char '%c'): %s", (inptr-in), inptr[0], in));
- inptr++;
- continue;
- }
- inptr = newinptr;
- if (unicode_isspace(c)) {
- if (encoding == 0) {
- out = g_string_append_len(out, start, inptr-start);
- } else {
- char *text = rfc2047_encode_word(start, inptr-start-1, encoding_map[encoding]);
- out = g_string_append(out, text);
- out = g_string_append_c(out, c);
- g_free(text);
- }
- start = inptr;
- encoding = 0;
- } else if (c>127 && c < 256) {
- encoding = MAX(encoding, 1);
- } else if (c >=256) {
- encoding = MAX(encoding, 2);
- }
- }
- if (inptr-start) {
- if (encoding == 0) {
- out = g_string_append_len(out, start, inptr-start);
- } else {
- char *text = rfc2047_encode_word(start, inptr-start, encoding_map[encoding]);
- out = g_string_append(out, text);
- g_free(text);
- }
- }
- outstr = out->str;
- g_string_free(out, FALSE);
- return outstr;
-}
-
-
-/* these are all internal parser functions */
-
-static char *
-decode_token(const char **in)
-{
- const char *inptr = *in;
- const char *start;
-
- header_decode_lwsp(&inptr);
- start = inptr;
- while (is_ttoken(*inptr))
- inptr++;
- if (inptr>start) {
- *in = inptr;
- return g_strndup(start, inptr-start);
- } else {
- return NULL;
- }
-}
-
-char *
-header_token_decode(const char *in)
-{
- if (in == NULL)
- return NULL;
-
- return decode_token(&in);
-}
-
-/*
- <"> * ( <any char except <"> \, cr / \ <any char> ) <">
-*/
-static char *
-header_decode_quoted_string(const char **in)
-{
- const char *inptr = *in;
- char *out = NULL, *outptr;
- int outlen;
- int c;
-
- header_decode_lwsp(&inptr);
- if (*inptr == '"') {
- const char *intmp;
- int skip = 0;
-
- /* first, calc length */
- inptr++;
- intmp = inptr;
- while ( (c = *intmp++) && c!= '"' && c != '\0') {
- if (c=='\\' && *intmp) {
- intmp++;
- skip++;
- }
- }
- outlen = intmp-inptr-skip;
- out = outptr = g_malloc(outlen+1);
- while ( (c = *inptr++) && c!= '"' && c != '\0') {
- if (c=='\\' && *inptr) {
- c = *inptr++;
- }
- *outptr++ = c;
- }
- *outptr = 0;
- }
- *in = inptr;
- return out;
-}
-
-static char *
-header_decode_atom(const char **in)
-{
- const char *inptr = *in, *start;
-
- header_decode_lwsp(&inptr);
- start = inptr;
- while (is_atom(*inptr))
- inptr++;
- *in = inptr;
- if (inptr > start)
- return g_strndup(start, inptr-start);
- else
- return NULL;
-}
-
-static char *
-header_decode_word(const char **in)
-{
- const char *inptr = *in;
-
- header_decode_lwsp(&inptr);
- if (*inptr == '"') {
- *in = inptr;
- return header_decode_quoted_string(in);
- } else {
- *in = inptr;
- return header_decode_atom(in);
- }
-}
-
-static char *
-header_decode_value(const char **in)
-{
- const char *inptr = *in;
-
- header_decode_lwsp(&inptr);
- if (*inptr == '"') {
- d(printf("decoding quoted string\n"));
- return header_decode_quoted_string(in);
- } else if (is_ttoken(*inptr)) {
- d(printf("decoding token\n"));
- /* this may not have the right specials for all params? */
- return decode_token(in);
- }
- return NULL;
-}
-
-/* shoudl this return -1 for no int? */
-static int
-header_decode_int(const char **in)
-{
- const char *inptr = *in;
- int c, v=0;
-
- header_decode_lwsp(&inptr);
- while ( (c=*inptr++ & 0xff)
- && isdigit(c) ) {
- v = v*10+(c-'0');
- }
- *in = inptr-1;
- return v;
-}
-
-static int
-header_decode_param(const char **in, char **paramp, char **valuep)
-{
- const char *inptr = *in;
- char *param, *value=NULL;
-
- param = decode_token(&inptr);
- header_decode_lwsp(&inptr);
- if (*inptr == '=') {
- inptr++;
- value = header_decode_value(&inptr);
- }
-
- if (param && value) {
- *paramp = param;
- *valuep = value;
- *in = inptr;
- return 0;
- } else {
- g_free(param);
- g_free(value);
- return 1;
- }
-}
-
-char *
-header_param(struct _header_param *p, const char *name)
-{
- while (p && strcasecmp(p->name, name) != 0)
- p = p->next;
- if (p)
- return p->value;
- return NULL;
-}
-
-struct _header_param *
-header_set_param(struct _header_param **l, const char *name, const char *value)
-{
- struct _header_param *p = (struct _header_param *)l, *pn;
-
- while (p->next) {
- pn = p->next;
- if (!strcasecmp(pn->name, name)) {
- g_free(pn->value);
- if (value) {
- pn->value = g_strdup(value);
- return pn;
- } else {
- p->next = pn->next;
- g_free(pn);
- return NULL;
- }
- }
- p = pn;
- }
-
- if (value == NULL)
- return NULL;
-
- pn = g_malloc(sizeof(*pn));
- pn->next = 0;
- pn->name = g_strdup(name);
- pn->value = g_strdup(value);
- p->next = pn;
-
- return pn;
-}
-
-const char *
-header_content_type_param(struct _header_content_type *t, const char *name)
-{
- if (t==NULL)
- return NULL;
- return header_param(t->params, name);
-}
-
-void header_content_type_set_param(struct _header_content_type *t, const char *name, const char *value)
-{
- header_set_param(&t->params, name, value);
-}
-
-/**
- * header_content_type_is:
- * @ct: A content type specifier, or #NULL.
- * @type: A type to check against.
- * @subtype: A subtype to check against, or "*" to match any subtype.
- *
- * Returns #TRUE if the content type @ct is of type @type/@subtype.
- * The subtype of "*" will match any subtype. If @ct is #NULL, then
- * it will match the type "text/plain".
- *
- * Return value: #TRUE or #FALSE depending on the matching of the type.
- **/
-int
-header_content_type_is(struct _header_content_type *ct, const char *type, const char *subtype)
-{
- /* no type == text/plain or text/"*" */
- if (ct==NULL) {
- return (!strcasecmp(type, "text")
- && (!strcasecmp(subtype, "plain")
- || !strcasecmp(subtype, "*")));
- }
-
- return (ct->type != NULL
- && (!strcasecmp(ct->type, type)
- && ((ct->subtype != NULL
- && !strcasecmp(ct->subtype, subtype))
- || !strcasecmp("*", subtype))));
-}
-
-void
-header_param_list_free(struct _header_param *p)
-{
- struct _header_param *n;
-
- while (p) {
- n = p->next;
- g_free(p->name);
- g_free(p->value);
- g_free(p);
- p = n;
- }
-}
-
-struct _header_content_type *
-header_content_type_new(const char *type, const char *subtype)
-{
- struct _header_content_type *t = g_malloc(sizeof(*t));
-
- t->type = g_strdup(type);
- t->subtype = g_strdup(subtype);
- t->params = NULL;
- t->refcount = 1;
- return t;
-}
-
-void
-header_content_type_ref(struct _header_content_type *ct)
-{
- if (ct)
- ct->refcount++;
-}
-
-
-void
-header_content_type_unref(struct _header_content_type *ct)
-{
- if (ct) {
- if (ct->refcount <= 1) {
- header_param_list_free(ct->params);
- g_free(ct->type);
- g_free(ct->subtype);
- g_free(ct);
- } else {
- ct->refcount--;
- }
- }
-}
-
-/* for decoding email addresses, canonically */
-static char *
-header_decode_domain(const char **in)
-{
- const char *inptr = *in, *start;
- int go = TRUE;
- char *ret;
- GString *domain = g_string_new("");
-
- /* domain ref | domain literal */
- header_decode_lwsp(&inptr);
- while (go) {
- if (*inptr == '[') { /* domain literal */
- domain = g_string_append(domain, "[ ");
- inptr++;
- header_decode_lwsp(&inptr);
- start = inptr;
- while (is_dtext(*inptr)) {
- domain = g_string_append_c(domain, *inptr);
- inptr++;
- }
- if (*inptr == ']') {
- domain = g_string_append(domain, " ]");
- inptr++;
- } else {
- w(g_warning("closing ']' not found in domain: %s", *in));
- }
- } else {
- char *a = header_decode_atom(&inptr);
- if (a) {
- domain = g_string_append(domain, a);
- g_free(a);
- } else {
- w(g_warning("missing atom from domain-ref"));
- break;
- }
- }
- header_decode_lwsp(&inptr);
- if (*inptr == '.') { /* next sub-domain? */
- domain = g_string_append_c(domain, '.');
- inptr++;
- header_decode_lwsp(&inptr);
- } else
- go = FALSE;
- }
-
- *in = inptr;
-
- ret = domain->str;
- g_string_free(domain, FALSE);
- return ret;
-}
-
-static char *
-header_decode_addrspec(const char **in)
-{
- const char *inptr = *in;
- char *word;
- GString *addr = g_string_new("");
-
- header_decode_lwsp(&inptr);
-
- /* addr-spec */
- word = header_decode_word(&inptr);
- if (word) {
- addr = g_string_append(addr, word);
- header_decode_lwsp(&inptr);
- g_free(word);
- while (*inptr == '.' && word) {
- inptr++;
- addr = g_string_append_c(addr, '.');
- word = header_decode_word(&inptr);
- if (word) {
- addr = g_string_append(addr, word);
- header_decode_lwsp(&inptr);
- g_free(word);
- } else {
- w(g_warning("Invalid address spec: %s", *in));
- }
- }
- if (*inptr == '@') {
- inptr++;
- addr = g_string_append_c(addr, '@');
- word = header_decode_domain(&inptr);
- if (word) {
- addr = g_string_append(addr, word);
- g_free(word);
- } else {
- w(g_warning("Invalid address, missing domain: %s", *in));
- }
- } else {
- w(g_warning("Invalid addr-spec, missing @: %s", *in));
- }
- } else {
- w(g_warning("invalid addr-spec, no local part"));
- }
-
- /* FIXME: return null on error? */
-
- *in = inptr;
- word = addr->str;
- g_string_free(addr, FALSE);
- return word;
-}
-
-/*
- address:
- word *('.' word) @ domain |
- *(word) '<' [ *('@' domain ) ':' ] word *( '.' word) @ domain |
-
- 1*word ':' [ word ... etc (mailbox, as above) ] ';'
- */
-
-/* mailbox:
- word *( '.' word ) '@' domain
- *(word) '<' [ *('@' domain ) ':' ] word *( '.' word) @ domain
- */
-
-static struct _header_address *
-header_decode_mailbox(const char **in)
-{
- const char *inptr = *in;
- char *pre;
- int closeme = FALSE;
- GString *addr;
- GString *name = NULL;
- struct _header_address *address = NULL;
-
- addr = g_string_new("");
-
- /* for each address */
- pre = header_decode_word(&inptr);
- header_decode_lwsp(&inptr);
- if (!(*inptr == '.' || *inptr == '@' || *inptr==',' || *inptr=='\0')) {
- /* ',' and '\0' required incase it is a simple address, no @ domain part (buggy writer) */
- name = g_string_new("");
- while (pre) {
- char *text;
-
- text = header_decode_string(pre);
- name = g_string_append(name, text);
- g_free(pre);
- g_free(text);
-
- /* rfc_decode(pre) */
- pre = header_decode_word(&inptr);
- if (pre)
- name = g_string_append_c(name, ' ');
- }
- header_decode_lwsp(&inptr);
- if (*inptr == '<') {
- closeme = TRUE;
- inptr++;
- header_decode_lwsp(&inptr);
- if (*inptr == '@') {
- while (*inptr == '@') {
- inptr++;
- header_decode_domain(&inptr);
- header_decode_lwsp(&inptr);
- if (*inptr == ',') {
- inptr++;
- header_decode_lwsp(&inptr);
- }
- }
- if (*inptr == ':') {
- inptr++;
- } else {
- w(g_warning("broken route-address, missing ':': %s", *in));
- }
- }
- pre = header_decode_word(&inptr);
- header_decode_lwsp(&inptr);
- } else {
- w(g_warning("broken address? %s", *in));
- }
- }
-
- if (pre) {
- addr = g_string_append(addr, pre);
- } else {
- w(g_warning("No local-part for email address: %s", *in));
- }
-
- /* should be at word '.' localpart */
- while (*inptr == '.' && pre) {
- inptr++;
- g_free(pre);
- pre = header_decode_word(&inptr);
- if (pre) {
- addr = g_string_append_c(addr, '.');
- addr = g_string_append(addr, pre);
- }
- header_decode_lwsp(&inptr);
- }
- g_free(pre);
-
- /* now at '@' domain part */
- if (*inptr == '@') {
- char *dom;
-
- inptr++;
- addr = g_string_append_c(addr, '@');
- dom = header_decode_domain(&inptr);
- addr = g_string_append(addr, dom);
- g_free(dom);
- } else {
- w(g_warning("invalid address, no '@' domain part at %c: %s", *inptr, *in));
- }
-
- if (closeme) {
- header_decode_lwsp(&inptr);
- if (*inptr == '>') {
- inptr++;
- } else {
- w(g_warning("invalid route address, no closing '>': %s", *in));
- }
- } else if (name == NULL) { /* check for comment after address */
- char *text, *tmp;
- const char *comment = inptr;
-
- header_decode_lwsp(&inptr);
- if (inptr-comment > 3) { /* just guess ... */
- tmp = g_strndup(comment, inptr-comment);
- text = header_decode_string(tmp);
- name = g_string_new(text);
- g_free(tmp);
- g_free(text);
- }
- }
-
- *in = inptr;
-
- if (addr->len > 0) {
- address = header_address_new_name(name?name->str:"", addr->str);
- }
-
- g_string_free(addr, TRUE);
- if (name)
- g_string_free(name, TRUE);
-
- d(printf("got mailbox: %s\n", addr->str));
- return address;
-}
-
-static struct _header_address *
-header_decode_address(const char **in)
-{
- const char *inptr = *in;
- char *pre;
- GString *group = g_string_new("");
- struct _header_address *addr = NULL, *member;
-
- /* pre-scan, trying to work out format, discard results */
- header_decode_lwsp(&inptr);
- while ( (pre = header_decode_word(&inptr)) ) {
- group = g_string_append(group, pre);
- group = g_string_append(group, " ");
- g_free(pre);
- }
- header_decode_lwsp(&inptr);
- if (*inptr == ':') {
- d(printf("group detected: %s\n", group->str));
- addr = header_address_new_group(group->str);
- /* that was a group spec, scan mailbox's */
- inptr++;
- /* FIXME: check rfc 2047 encodings of words, here or above in the loop */
- header_decode_lwsp(&inptr);
- if (*inptr != ';') {
- int go = TRUE;
- do {
- member = header_decode_mailbox(&inptr);
- if (member)
- header_address_add_member(addr, member);
- header_decode_lwsp(&inptr);
- if (*inptr == ',')
- inptr++;
- else
- go = FALSE;
- } while (go);
- if (*inptr == ';') {
- inptr++;
- } else {
- w(g_warning("Invalid group spec, missing closing ';': %s", *in));
- }
- } else {
- inptr++;
- }
- *in = inptr;
- } else {
- addr = header_decode_mailbox(in);
- }
-
- g_string_free(group, TRUE);
-
- return addr;
-}
-
-static char *
-header_msgid_decode_internal(const char **in)
-{
- const char *inptr = *in;
- char *msgid = NULL;
-
- d(printf("decoding Message-ID: '%s'\n", *in));
-
- header_decode_lwsp(&inptr);
- if (*inptr == '<') {
- inptr++;
- header_decode_lwsp(&inptr);
- msgid = header_decode_addrspec(&inptr);
- if (msgid) {
- header_decode_lwsp(&inptr);
- if (*inptr == '>') {
- inptr++;
- } else {
- w(g_warning("Missing closing '>' on message id: %s", *in));
- }
- } else {
- w(g_warning("Cannot find message id in: %s", *in));
- }
- } else {
- w(g_warning("missing opening '<' on message id: %s", *in));
- }
- *in = inptr;
-
- return msgid;
-}
-
-char *
-header_msgid_decode(const char *in)
-{
- if (in == NULL)
- return NULL;
-
- return header_msgid_decode_internal(&in);
-}
-
-void
-header_references_list_append_asis(struct _header_references **list, char *ref)
-{
- struct _header_references *w = (struct _header_references *)list, *n;
- while (w->next)
- w = w->next;
- n = g_malloc(sizeof(*n));
- n->id = ref;
- n->next = 0;
- w->next = n;
-}
-
-int
-header_references_list_size(struct _header_references **list)
-{
- int count = 0;
- struct _header_references *w = *list;
- while (w) {
- count++;
- w = w->next;
- }
- return count;
-}
-
-void
-header_references_list_clear(struct _header_references **list)
-{
- struct _header_references *w = *list, *n;
- while (w) {
- n = w->next;
- g_free(w->id);
- g_free(w);
- w = n;
- }
- *list = NULL;
-}
-
-/* generate a list of references, from most recent up */
-struct _header_references *
-header_references_decode(const char *in)
-{
- const char *inptr = in;
- struct _header_references *head = NULL, *node;
- char *id, *word;
-
- if (in == NULL || in[0] == '\0')
- return NULL;
-
- while (*inptr) {
- header_decode_lwsp(&inptr);
- if (*inptr == '<') {
- id = header_msgid_decode_internal(&inptr);
- if (id) {
- node = g_malloc(sizeof(*node));
- node->next = head;
- head = node;
- node->id = id;
- }
- } else {
- word = header_decode_word(&inptr);
- if (word)
- g_free (word);
- else if (*inptr != '\0')
- inptr++; /* Stupid mailer tricks */
- }
- }
-
- return head;
-}
-
-struct _header_references *
-header_references_dup(const struct _header_references *list)
-{
- struct _header_references *new = NULL, *tmp;
-
- while (list) {
- tmp = g_new(struct _header_references, 1);
- tmp->next = new;
- tmp->id = g_strdup(list->id);
- new = tmp;
- list = list->next;
- }
- return new;
-}
-
-struct _header_address *
-header_mailbox_decode(const char *in)
-{
- if (in == NULL)
- return NULL;
-
- return header_decode_mailbox(&in);
-}
-
-struct _header_address *
-header_address_decode(const char *in)
-{
- const char *inptr = in, *last;
- struct _header_address *list = NULL, *addr;
-
- d(printf("decoding To: '%s'\n", in));
-
-#ifndef NO_WARNINGS
-#warning header_to_decode needs to return some structure
-#endif
-
- if (in == NULL)
- return NULL;
-
- do {
- last = inptr;
- addr = header_decode_address(&inptr);
- if (addr)
- header_address_list_append(&list, addr);
- header_decode_lwsp(&inptr);
- if (*inptr == ',')
- inptr++;
- else
- break;
- } while (inptr != last);
-
- if (*inptr) {
- w(g_warning("Invalid input detected at %c (%d): %s\n or at: %s", *inptr, inptr-in, in, inptr));
- }
-
- if (inptr == last) {
- w(g_warning("detected invalid input loop at : %s", last));
- }
-
- return list;
-}
-
-void
-header_mime_decode(const char *in, int *maj, int *min)
-{
- const char *inptr = in;
- int major=-1, minor=-1;
-
- d(printf("decoding MIME-Version: '%s'\n", in));
-
- if (in != NULL) {
- header_decode_lwsp(&inptr);
- if (isdigit(*inptr)) {
- major = header_decode_int(&inptr);
- header_decode_lwsp(&inptr);
- if (*inptr == '.') {
- inptr++;
- header_decode_lwsp(&inptr);
- if (isdigit(*inptr))
- minor = header_decode_int(&inptr);
- }
- }
- }
-
- if (maj)
- *maj = major;
- if (min)
- *min = minor;
-
- d(printf("major = %d, minor = %d\n", major, minor));
-}
-
-static struct _header_param *
-header_param_list_decode(const char **in)
-{
- const char *inptr = *in;
- struct _header_param *head = NULL, *tail = NULL;
-
- header_decode_lwsp(&inptr);
- while (*inptr == ';') {
- char *param, *value;
- struct _header_param *p;
-
- inptr++;
- /* invalid format? */
- if (header_decode_param(&inptr, &param, &value) != 0)
- break;
-
- p = g_malloc(sizeof(*p));
- p->name = param;
- p->value = value;
- p->next = NULL;
- if (head == NULL)
- head = p;
- if (tail)
- tail->next = p;
- tail = p;
- header_decode_lwsp(&inptr);
- }
- *in = inptr;
- return head;
-}
-
-static void
-header_param_list_format_append(GString *out, struct _header_param *p)
-{
- int len = out->len;
- while (p) {
- int here = out->len;
- if (len+strlen(p->name)+strlen(p->value)>60) {
- out = g_string_append(out, "\n\t");
- len = 0;
- }
- /* FIXME: format the value properly */
- g_string_sprintfa(out, " ; %s=\"%s\"", p->name, p->value);
- len += (out->len - here);
- p = p->next;
- }
-}
-
-struct _header_content_type *
-header_content_type_decode(const char *in)
-{
- const char *inptr = in;
- char *type, *subtype = NULL;
- struct _header_content_type *t = NULL;
-
- if (in==NULL)
- return NULL;
-
- type = decode_token(&inptr);
- header_decode_lwsp(&inptr);
- if (type) {
- if (*inptr == '/') {
- inptr++;
- subtype = decode_token(&inptr);
- }
- if (subtype == NULL && (!strcasecmp(type, "text"))) {
- w(g_warning("text type with no subtype, resorting to text/plain: %s", in));
- subtype = g_strdup("plain");
- }
- if (subtype == NULL) {
- w(g_warning("MIME type with no subtype: %s", in));
- }
-
- t = header_content_type_new(type, subtype);
- t->params = header_param_list_decode(&inptr);
- g_free(type);
- g_free(subtype);
- } else {
- g_free(type);
- d(printf("cannot find MIME type in header (2) '%s'", in));
- }
- return t;
-}
-
-void
-header_content_type_dump(struct _header_content_type *ct)
-{
- struct _header_param *p;
-
- printf("Content-Type: ");
- if (ct==NULL) {
- printf("<NULL>\n");
- return;
- }
- printf("%s / %s", ct->type, ct->subtype);
- p = ct->params;
- if (p) {
- while (p) {
- printf(";\n\t%s=\"%s\"", p->name, p->value);
- p = p->next;
- }
- }
- printf("\n");
-}
-
-char *
-header_content_type_format(struct _header_content_type *ct)
-{
- GString *out;
- char *ret;
-
- if (ct==NULL)
- return NULL;
-
- out = g_string_new("");
- if (ct->type == NULL) {
- g_string_sprintfa(out, "text/plain");
- w(g_warning("Content-Type with no main type"));
- } else if (ct->subtype == NULL) {
- w(g_warning("Content-Type with no sub type: %s", ct->type));
- if (!strcasecmp(ct->type, "multipart"))
- g_string_sprintfa(out, "%s/mixed", ct->type);
- else
- g_string_sprintfa(out, "%s", ct->type);
- } else {
- g_string_sprintfa(out, "%s/%s", ct->type, ct->subtype);
- }
- header_param_list_format_append(out, ct->params);
-
- ret = out->str;
- g_string_free(out, FALSE);
- return ret;
-}
-
-char *
-header_content_encoding_decode(const char *in)
-{
- if (in)
- return decode_token(&in);
- return NULL;
-}
-
-CamelMimeDisposition *header_disposition_decode(const char *in)
-{
- CamelMimeDisposition *d = NULL;
- const char *inptr = in;
-
- if (in == NULL)
- return NULL;
-
- d = g_malloc(sizeof(*d));
- d->refcount = 1;
- d->disposition = decode_token(&inptr);
- if (d->disposition == NULL)
- w(g_warning("Empty disposition type"));
- d->params = header_param_list_decode(&inptr);
- return d;
-}
-
-void header_disposition_ref(CamelMimeDisposition *d)
-{
- if (d)
- d->refcount++;
-}
-void header_disposition_unref(CamelMimeDisposition *d)
-{
- if (d) {
- if (d->refcount<=1) {
- header_param_list_free(d->params);
- g_free(d->disposition);
- g_free(d);
- } else {
- d->refcount--;
- }
- }
-}
-
-char *header_disposition_format(CamelMimeDisposition *d)
-{
- GString *out;
- char *ret;
-
- if (d==NULL)
- return NULL;
-
- out = g_string_new("");
- if (d->disposition)
- out = g_string_append(out, d->disposition);
- else
- out = g_string_append(out, "attachment");
- header_param_list_format_append(out, d->params);
-
- ret = out->str;
- g_string_free(out, FALSE);
- return ret;
-}
-
-/* hrm, is there a library for this shit? */
-static struct {
- char *name;
- int offset;
-} tz_offsets [] = {
- { "UT", 0 },
- { "GMT", 0 },
- { "EST", -500 }, /* these are all US timezones. bloody yanks */
- { "EDT", -400 },
- { "CST", -600 },
- { "CDT", -500 },
- { "MST", -700 },
- { "MDT", -600 },
- { "PST", -800 },
- { "PDT", -700 },
- { "Z", 0 },
- { "A", -100 },
- { "M", -1200 },
- { "N", 100 },
- { "Y", 1200 },
-};
-
-static char *tz_months [] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
-};
-
-char *
-header_format_date(time_t time, int offset)
-{
- struct tm tm;
-
- d(printf("offset = %d\n", offset));
-
- d(printf("converting date %s", ctime(&time)));
-
- time += ((offset / 100) * (60*60)) + (offset % 100)*60;
-
- d(printf("converting date %s", ctime(&time)));
-
- memcpy(&tm, gmtime(&time), sizeof(tm));
-
- return g_strdup_printf("%02d %s %04d %02d:%02d:%02d %+05d",
- tm.tm_mday, tz_months[tm.tm_mon],
- tm.tm_year + 1900,
- tm.tm_hour, tm.tm_min, tm.tm_sec,
- offset);
-}
-
-/* convert a date to time_t representation */
-/* this is an awful mess oh well */
-time_t
-header_decode_date(const char *in, int *saveoffset)
-{
- const char *inptr = in;
- char *monthname;
- int year, offset = 0;
- struct tm tm;
- int i;
- time_t t;
-
- if (in == NULL) {
- if (saveoffset)
- *saveoffset = 0;
- return 0;
- }
-
- d(printf ("\ndecoding date '%s'\n", inptr));
-
- memset (&tm, 0, sizeof(tm));
-
- header_decode_lwsp (&inptr);
- if (!isdigit (*inptr)) {
- char *day = decode_token (&inptr);
- /* we dont really care about the day, its only for display */
- if (day) {
- d(printf ("got day: %s\n", day));
- g_free (day);
- header_decode_lwsp (&inptr);
- if (*inptr == ',') {
- inptr++;
- } else {
- gchar *newdate;
-
- w(g_warning("day not followed by ',' its probably a broken mail client, so we'll ignore its date entirely"));
- printf ("Giving it one last chance...\n");
- newdate = parse_broken_date (in);
- if (newdate) {
- printf ("Got: %s\n", newdate);
- if (saveoffset)
- *saveoffset = 0;
- t = header_decode_date (newdate, NULL);
- g_free (newdate);
- }
-
- if (saveoffset)
- *saveoffset = 0;
- return 0;
- }
- }
- }
- tm.tm_mday = header_decode_int(&inptr);
- monthname = decode_token(&inptr);
- if (monthname) {
- for (i=0;i<sizeof(tz_months)/sizeof(tz_months[0]);i++) {
- if (!strcasecmp(tz_months[i], monthname)) {
- tm.tm_mon = i;
- break;
- }
- }
- g_free(monthname);
- }
- year = header_decode_int(&inptr);
- if (year<100) {
- tm.tm_year = year;
- } else {
- tm.tm_year = year-1900;
- }
- /* get the time ... yurck */
- tm.tm_hour = header_decode_int(&inptr);
- header_decode_lwsp(&inptr);
- if (*inptr == ':')
- inptr++;
- tm.tm_min = header_decode_int(&inptr);
- header_decode_lwsp(&inptr);
- if (*inptr == ':')
- inptr++;
- tm.tm_sec = header_decode_int(&inptr);
- header_decode_lwsp(&inptr);
- if (*inptr == '+'
- || *inptr == '-') {
- offset = (*inptr++)=='-'?-1:1;
- offset = offset * header_decode_int(&inptr);
- d(printf("abs signed offset = %d\n", offset));
- } else if (isdigit(*inptr)) {
- offset = header_decode_int(&inptr);
- d(printf("abs offset = %d\n", offset));
- } else {
- char *tz = decode_token(&inptr);
-
- if (tz) {
- for (i=0;i<sizeof(tz_offsets)/sizeof(tz_offsets[0]);i++) {
- if (!strcasecmp(tz_offsets[i].name, tz)) {
- offset = tz_offsets[i].offset;
- break;
- }
- }
- g_free(tz);
- }
- /* some broken mailers seem to put in things like GMT+1030 instead of just +1030 */
- header_decode_lwsp(&inptr);
- if (*inptr == '+' || *inptr == '-') {
- int sign = (*inptr++)=='-'?-1:1;
- offset = offset + (header_decode_int(&inptr)*sign);
- }
- d(printf("named offset = %d\n", offset));
- }
-
- t = mktime(&tm);
-#if defined(HAVE_TIMEZONE)
- t -= timezone;
-#elif defined(HAVE_TM_GMTOFF)
- t += tm.tm_gmtoff;
-#else
-#error Neither HAVE_TIMEZONE nor HAVE_TM_GMTOFF defined. Rerun autoheader, autoconf, etc.
-#endif
-
- /* t is now GMT of the time we want, but not offset by the timezone ... */
-
- d(printf(" gmt normalized? = %s\n", ctime(&t)));
-
- /* this should convert the time to the GMT equiv time */
- t -= ( (offset/100) * 60*60) + (offset % 100)*60;
-
- d(printf(" gmt normalized for timezone? = %s\n", ctime(&t)));
-
- d({
- char *tmp;
- tmp = header_format_date(t, offset);
- printf(" encoded again: %s\n", tmp);
- g_free(tmp);
- });
-
- if (saveoffset)
- *saveoffset = offset;
-
- return t;
-}
-
-/* extra rfc checks */
-#define CHECKS
-
-#ifdef CHECKS
-static void
-check_header(struct _header_raw *h)
-{
- unsigned char *p;
-
- p = h->value;
- while (p && *p) {
- if (!isascii(*p)) {
- w(g_warning("Appending header violates rfc: %s: %s", h->name, h->value));
- return;
- }
- p++;
- }
-}
-#endif
-
-void
-header_raw_append_parse(struct _header_raw **list, const char *header, int offset)
-{
- register const char *in;
- int fieldlen;
- char *name;
-
- in = header;
- while (is_fieldname(*in))
- in++;
- fieldlen = in-header;
- while (is_lwsp(*in))
- in++;
- if (fieldlen == 0 || *in != ':') {
- printf("Invalid header line: '%s'\n", header);
- return;
- }
- in++;
- name = alloca(fieldlen+1);
- memcpy(name, header, fieldlen);
- name[fieldlen] = 0;
-
- header_raw_append(list, name, in, offset);
-}
-
-void
-header_raw_append(struct _header_raw **list, const char *name, const char *value, int offset)
-{
- struct _header_raw *l, *n;
-
- d(printf("Header: %s: %s\n", name, value));
-
- n = g_malloc(sizeof(*n));
- n->next = NULL;
- n->name = g_strdup(name);
- n->value = g_strdup(value);
- n->offset = offset;
-#ifdef CHECKS
- check_header(n);
-#endif
- l = (struct _header_raw *)list;
- while (l->next) {
- l = l->next;
- }
- l->next = n;
-
- /* debug */
-#if 0
- if (!strcasecmp(name, "To")) {
- printf("- Decoding To\n");
- header_to_decode(value);
- } else if (!strcasecmp(name, "Content-type")) {
- printf("- Decoding content-type\n");
- header_content_type_dump(header_content_type_decode(value));
- } else if (!strcasecmp(name, "MIME-Version")) {
- printf("- Decoding mime version\n");
- header_mime_decode(value);
- }
-#endif
-}
-
-static struct _header_raw *
-header_raw_find_node(struct _header_raw **list, const char *name)
-{
- struct _header_raw *l;
-
- l = *list;
- while (l) {
- if (!strcasecmp(l->name, name))
- break;
- l = l->next;
- }
- return l;
-}
-
-const char *
-header_raw_find(struct _header_raw **list, const char *name, int *offset)
-{
- struct _header_raw *l;
-
- l = header_raw_find_node(list, name);
- if (l) {
- if (offset)
- *offset = l->offset;
- return l->value;
- } else
- return NULL;
-}
-
-const char *
-header_raw_find_next(struct _header_raw **list, const char *name, int *offset, const char *last)
-{
- struct _header_raw *l;
-
- if (last == NULL || name == NULL)
- return NULL;
-
- l = *list;
- while (l && l->value != last)
- l = l->next;
- return header_raw_find(&l, name, offset);
-}
-
-static void
-header_raw_free(struct _header_raw *l)
-{
- g_free(l->name);
- g_free(l->value);
- g_free(l);
-}
-
-void
-header_raw_remove(struct _header_raw **list, const char *name)
-{
- struct _header_raw *l, *p;
-
- /* the next pointer is at the head of the structure, so this is safe */
- p = (struct _header_raw *)list;
- l = *list;
- while (l) {
- if (!strcasecmp(l->name, name)) {
- p->next = l->next;
- header_raw_free(l);
- l = p->next;
- } else {
- p = l;
- l = l->next;
- }
- }
-}
-
-void
-header_raw_replace(struct _header_raw **list, const char *name, const char *value, int offset)
-{
- header_raw_remove(list, name);
- header_raw_append(list, name, value, offset);
-}
-
-void
-header_raw_clear(struct _header_raw **list)
-{
- struct _header_raw *l, *n;
- l = *list;
- while (l) {
- n = l->next;
- header_raw_free(l);
- l = n;
- }
- *list = NULL;
-}
-
-
-/* ok, here's the address stuff, what a mess ... */
-struct _header_address *header_address_new(void)
-{
- struct _header_address *h;
- h = g_malloc0(sizeof(*h));
- h->type = HEADER_ADDRESS_NONE;
- h->refcount = 1;
- return h;
-}
-
-struct _header_address *header_address_new_name(const char *name, const char *addr)
-{
- struct _header_address *h;
-
- h = header_address_new();
- h->type = HEADER_ADDRESS_NAME;
- h->name = g_strdup(name);
- h->v.addr = g_strdup(addr);
- return h;
-}
-
-struct _header_address *header_address_new_group(const char *name)
-{
- struct _header_address *h;
-
- h = header_address_new();
- h->type = HEADER_ADDRESS_GROUP;
- h->name = g_strdup(name);
- return h;
-}
-
-void header_address_ref(struct _header_address *h)
-{
- if (h)
- h->refcount++;
-}
-
-void header_address_unref(struct _header_address *h)
-{
- if (h) {
- if (h->refcount <= 1) {
- if (h->type == HEADER_ADDRESS_GROUP) {
- header_address_list_clear(&h->v.members);
- } else if (h->type == HEADER_ADDRESS_NAME) {
- g_free(h->v.addr);
- }
- g_free(h->name);
- g_free(h);
- } else {
- h->refcount--;
- }
- }
-}
-
-void header_address_set_name(struct _header_address *h, const char *name)
-{
- if (h) {
- g_free(h->name);
- h->name = g_strdup(name);
- }
-}
-
-void header_address_set_addr(struct _header_address *h, const char *addr)
-{
- if (h) {
- if (h->type == HEADER_ADDRESS_NAME
- || h->type == HEADER_ADDRESS_NONE) {
- h->type = HEADER_ADDRESS_NAME;
- g_free(h->v.addr);
- h->v.addr = g_strdup(addr);
- } else {
- g_warning("Trying to set the address on a group");
- }
- }
-}
-
-void header_address_set_members(struct _header_address *h, struct _header_address *group)
-{
- if (h) {
- if (h->type == HEADER_ADDRESS_GROUP
- || h->type == HEADER_ADDRESS_NONE) {
- h->type = HEADER_ADDRESS_GROUP;
- header_address_list_clear(&h->v.members);
- /* should this ref them? */
- h->v.members = group;
- } else {
- g_warning("Trying to set the members on a name, not group");
- }
- }
-}
-
-void header_address_add_member(struct _header_address *h, struct _header_address *member)
-{
- if (h) {
- if (h->type == HEADER_ADDRESS_GROUP
- || h->type == HEADER_ADDRESS_NONE) {
- h->type = HEADER_ADDRESS_GROUP;
- header_address_list_append(&h->v.members, member);
- }
- }
-}
-
-void header_address_list_append_list(struct _header_address **l, struct _header_address **h)
-{
- if (l) {
- struct _header_address *n = (struct _header_address *)l;
-
- while (n->next)
- n = n->next;
- n->next = *h;
- }
-}
-
-
-void header_address_list_append(struct _header_address **l, struct _header_address *h)
-{
- if (h) {
- header_address_list_append_list(l, &h);
- h->next = NULL;
- }
-}
-
-void header_address_list_clear(struct _header_address **l)
-{
- struct _header_address *a, *n;
- a = *l;
- while (a) {
- n = a->next;
- header_address_unref(a);
- a = n;
- }
- *l = NULL;
-}
-
-static void
-header_address_list_format_append(GString *out, struct _header_address *a)
-{
- char *text;
-
- while (a) {
- switch (a->type) {
- case HEADER_ADDRESS_NAME:
-#ifndef NO_WARNINGS
-#warning needs to rfc2047 encode address phrase
-#endif
- /* FIXME: 2047 encoding?? */
- if (a->name && *a->name)
- g_string_sprintfa(out, "\"%s\" <%s>", a->name, a->v.addr);
- else
- g_string_append(out, a->v.addr);
- break;
- case HEADER_ADDRESS_GROUP:
- text = header_encode_string(a->name);
- g_string_sprintfa(out, "%s:\n ", text);
- header_address_list_format_append(out, a->v.members);
- g_string_sprintfa(out, ";");
- break;
- default:
- g_warning("Invalid address type");
- break;
- }
- a = a->next;
- }
-}
-
-/* FIXME: need a 'display friendly' version, as well as a 'rfc friendly' version? */
-char *
-header_address_list_format(struct _header_address *a)
-{
- GString *out;
- char *ret;
-
- if (a == NULL)
- return NULL;
-
- out = g_string_new("");
-
- header_address_list_format_append(out, a);
- ret = out->str;
- g_string_free(out, FALSE);
- return ret;
-}
-
-#ifdef BUILD_TABLE
-
-/* for debugging tests */
-/* should also have some regression tests somewhere */
-
-void run_test(void)
-{
- char *to = "gnome hacker dudes: license-discuss@opensource.org,
- \"Richard M. Stallman\" <rms@gnu.org>,
- Barry Chester <barry_che@antdiv.gov.au>,
- Michael Zucchi <zucchi.michael(this (is a nested) comment)@zedzone.mmc.com.au>,
- Miguel de Icaza <miguel@gnome.org>;,
- zucchi@zedzone.mmc.com.au, \"Foo bar\" <zed@zedzone>,
- <frob@frobzone>";
-
- header_to_decode(to);
-
- header_mime_decode("1.0");
- header_mime_decode("1.3 (produced by metasend V1.0)");
- header_mime_decode("(produced by metasend V1.0) 5.2");
- header_mime_decode("7(produced by metasend 1.0) . (produced by helix/send/1.0) 9 . 5");
- header_mime_decode("3.");
- header_mime_decode(".");
- header_mime_decode(".5");
- header_mime_decode("c.d");
- header_mime_decode("");
-
- header_msgid_decode(" <\"L3x2i1.0.Nm5.Xd-Wu\"@lists.redhat.com>");
- header_msgid_decode("<200001180446.PAA02065@beaker.htb.com.au>");
-
-}
-
-#endif /* BUILD_TABLE */
diff --git a/camel/camel-mime-utils.h b/camel/camel-mime-utils.h
deleted file mode 100644
index 4d8d6bb9ea..0000000000
--- a/camel/camel-mime-utils.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_MIME_UTILS_H
-#define _CAMEL_MIME_UTILS_H
-
-#include <glib.h>
-#include <time.h>
-
-/* a list of references for this message */
-struct _header_references {
- struct _header_references *next;
- char *id;
-};
-
-struct _header_param {
- struct _header_param *next;
- char *name;
- char *value;
-};
-
-/* describes a content-type */
-struct _header_content_type {
- char *type;
- char *subtype;
- struct _header_param *params;
- unsigned int refcount;
-};
-
-/* a raw rfc822 header */
-/* the value MUST be US-ASCII */
-struct _header_raw {
- struct _header_raw *next;
- char *name;
- char *value;
- int offset; /* in file, if known */
-};
-
-typedef struct _CamelMimeDisposition {
- char *disposition;
- struct _header_param *params;
- unsigned int refcount;
-} CamelMimeDisposition;
-
-enum _header_address_type {
- HEADER_ADDRESS_NONE, /* uninitialised */
- HEADER_ADDRESS_NAME,
- HEADER_ADDRESS_GROUP
-};
-
-struct _header_address {
- struct _header_address *next;
- enum _header_address_type type;
- char *name;
- union {
- char *addr;
- struct _header_address *members;
- } v;
- unsigned int refcount;
-};
-
-/* Address lists */
-struct _header_address *header_address_new(void);
-struct _header_address *header_address_new_name(const char *name, const char *addr);
-struct _header_address *header_address_new_group(const char *name);
-void header_address_ref(struct _header_address *);
-void header_address_unref(struct _header_address *);
-void header_address_set_name(struct _header_address *, const char *name);
-void header_address_set_addr(struct _header_address *, const char *addr);
-void header_address_set_members(struct _header_address *, struct _header_address *group);
-void header_address_add_member(struct _header_address *, struct _header_address *member);
-void header_address_list_append_list(struct _header_address **l, struct _header_address **h);
-void header_address_list_append(struct _header_address **, struct _header_address *);
-void header_address_list_clear(struct _header_address **);
-
-struct _header_address *header_address_decode(const char *in);
-struct _header_address *header_mailbox_decode(const char *in);
-char *header_address_list_format(struct _header_address *a);
-
-/* structured header prameters */
-char *header_param(struct _header_param *p, const char *name);
-struct _header_param *header_set_param(struct _header_param **l, const char *name, const char *value);
-void header_param_list_free(struct _header_param *p);
-
-/* Content-Type header */
-struct _header_content_type *header_content_type_new(const char *type, const char *subtype);
-struct _header_content_type *header_content_type_decode(const char *in);
-void header_content_type_unref(struct _header_content_type *ct);
-void header_content_type_ref(struct _header_content_type *ct);
-const char *header_content_type_param(struct _header_content_type *t, const char *name);
-void header_content_type_set_param(struct _header_content_type *t, const char *name, const char *value);
-int header_content_type_is(struct _header_content_type *ct, const char *type, const char *subtype);
-char *header_content_type_format(struct _header_content_type *ct);
-
-/* DEBUGGING function */
-void header_content_type_dump(struct _header_content_type *ct);
-
-/* Content-Disposition header */
-CamelMimeDisposition *header_disposition_decode(const char *in);
-void header_disposition_ref(CamelMimeDisposition *);
-void header_disposition_unref(CamelMimeDisposition *);
-char *header_disposition_format(CamelMimeDisposition *d);
-
-/* decode the contents of a content-encoding header */
-char *header_content_encoding_decode(const char *in);
-
-/* raw headers */
-void header_raw_append(struct _header_raw **list, const char *name, const char *value, int offset);
-void header_raw_append_parse(struct _header_raw **list, const char *header, int offset);
-const char *header_raw_find(struct _header_raw **list, const char *name, int *ofset);
-const char *header_raw_find_next(struct _header_raw **list, const char *name, int *ofset, const char *last);
-void header_raw_replace(struct _header_raw **list, const char *name, const char *value, int offset);
-void header_raw_remove(struct _header_raw **list, const char *name);
-void header_raw_clear(struct _header_raw **list);
-
-/* decode a header which is a simple token */
-char *header_token_decode(const char *in);
-
-/* decode/encode a string type, like a subject line */
-char *header_decode_string(const char *in);
-char *header_encode_string(const unsigned char *in);
-
-/* decode an email date field into a GMT time, + optional offset */
-time_t header_decode_date(const char *in, int *saveoffset);
-char *header_format_date(time_t time, int offset);
-
-/* decode a message id */
-char *header_msgid_decode(const char *in);
-
-/* decode a References header */
-struct _header_references *header_references_decode(const char *in);
-void header_references_list_clear(struct _header_references **list);
-void header_references_list_append_asis(struct _header_references **list, char *ref);
-int header_references_list_size(struct _header_references **list);
-struct _header_references *header_references_dup(const struct _header_references *list);
-
-/* decode the mime-type header */
-void header_mime_decode(const char *in, int *maj, int *min);
-
-/* do incremental base64/quoted-printable (de/en)coding */
-int base64_decode_step(unsigned char *in, int len, unsigned char *out, int *state, unsigned int *save);
-
-int base64_encode_step(unsigned char *in, int len, unsigned char *out, int *state, int *save);
-int base64_encode_close(unsigned char *in, int inlen, unsigned char *out, int *state, int *save);
-
-int uudecode_step (unsigned char *in, int len, unsigned char *out, int *state, guint32 *save, char *uulen);
-
-int quoted_decode_step(unsigned char *in, int len, unsigned char *out, int *savestate, int *saveme);
-
-int quoted_encode_step(unsigned char *in, int len, unsigned char *out, int *state, int *save);
-int quoted_encode_close(unsigned char *in, int len, unsigned char *out, int *state, int *save);
-
-#endif /* ! _CAMEL_MIME_UTILS_H */
diff --git a/camel/camel-movemail.c b/camel/camel-movemail.c
deleted file mode 100644
index b44c9edb1b..0000000000
--- a/camel/camel-movemail.c
+++ /dev/null
@@ -1,590 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-movemail.c: mbox copying function */
-
-/*
- * Author:
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-
-#include <sys/stat.h>
-#include <sys/uio.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <time.h>
-#include <unistd.h>
-#include <string.h>
-#include <signal.h>
-
-#include "camel-movemail.h"
-#include "camel-exception.h"
-
-#include "camel-mime-parser.h"
-#include "camel-mime-filter.h"
-#include "camel-mime-filter-from.h"
-
-#define d(x)
-
-#ifdef MOVEMAIL_PATH
-#include <sys/wait.h>
-
-static void movemail_external (const char *source, const char *dest,
- CamelException *ex);
-#endif
-
-/* these could probably be exposed as a utility? (but only mbox needs it) */
-#if 0
-static int camel_movemail_copy_filter(int fromfd, int tofd, off_t start, size_t bytes, CamelMimeFilter *filter);
-static int camel_movemail_copy(int fromfd, int tofd, off_t start, size_t bytes);
-#endif
-
-/**
- * camel_movemail: Copy an mbox file from a shared spool directory to a
- * new folder in a Camel store
- * @source: source file
- * @dest: destination file
- * @ex: a CamelException
- *
- * This copies an mbox file from a shared directory with multiple
- * readers and writers into a private (presumably Camel-controlled)
- * directory. Dot locking is used on the source file (but not the
- * destination).
- **/
-void
-camel_movemail (const char *source, const char *dest, CamelException *ex)
-{
- gboolean locked;
- int sfd, dfd, tmpfd;
- char *locktmpfile, *lockfile;
- struct stat st;
- time_t now, timeout;
- int nread, nwrote;
- char buf[BUFSIZ];
-
- camel_exception_clear (ex);
-
- /* Stat and then open the spool file. If it doesn't exist or
- * is empty, the user has no mail. (There's technically a race
- * condition here in that an MDA might have just now locked it
- * to deliver a message, but we don't care. In that case,
- * assuming it's unlocked is equivalent to pretending we were
- * called a fraction earlier.)
- */
- if (stat (source, &st) == -1) {
- if (errno != ENOENT) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not check mail file "
- "%s: %s", source,
- g_strerror (errno));
- }
- return;
- }
- if (st.st_size == 0)
- return;
-
- /* Create the unique lock file. */
- locktmpfile = g_strdup_printf ("%s.lock.XXXXXX", source);
-#ifdef HAVE_MKSTEMP
- tmpfd = mkstemp (locktmpfile);
-#else
- if (mktemp (locktmpfile)) {
- tmpfd = open (locktmpfile, O_RDWR | O_CREAT | O_EXCL,
- S_IRUSR | S_IWUSR);
- } else
- tmpfd = -1;
-#endif
- if (tmpfd == -1) {
- g_free (locktmpfile);
-#ifdef MOVEMAIL_PATH
- if (errno == EACCES) {
- /* movemail_external will fail if the dest file
- * already exists, so if it does, return now,
- * let the fetch code process the mail that's
- * already there, and then the user can try again.
- */
- if (stat (dest, &st) == 0)
- return;
-
- movemail_external (source, dest, ex);
- return;
- }
-#endif
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not create lock file "
- "for %s: %s", source, g_strerror (errno));
- return;
- }
- close (tmpfd);
-
- sfd = open (source, O_RDWR);
- if (sfd == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not open mail file %s: %s",
- source, g_strerror (errno));
- unlink (locktmpfile);
- g_free (locktmpfile);
- return;
- }
-
- dfd = open (dest, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
- if (dfd == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not open temporary mail "
- "file %s: %s", dest, g_strerror (errno));
- close (sfd);
- unlink (locktmpfile);
- g_free (locktmpfile);
- return;
- }
-
- lockfile = g_strdup_printf ("%s.lock", source);
- locked = FALSE;
- time (&timeout);
- timeout += 30;
-
- /* Loop trying to lock the file for 30 seconds. */
- while (time (&now) < timeout) {
- /* Try to make the lock. */
- if (symlink (locktmpfile, lockfile) == 0) {
- locked = TRUE;
- break;
- }
-
- /* If we fail for a reason other than that someone
- * else has the lock, then abort.
- */
- if (errno != EEXIST) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not create lock "
- "file for %s: %s", source,
- g_strerror (errno));
- break;
- }
-
- /* Check the modtime on the lock file. */
- if (stat (lockfile, &st) == -1) {
- /* If the lockfile disappeared, try again. */
- if (errno == ENOENT)
- continue;
-
- /* Some other error. Abort. */
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not test lock "
- "file for %s: %s", source,
- g_strerror (errno));
- break;
- }
-
- /* If the lock file is stale, remove it and try again. */
- if (st.st_mtime < now - 60) {
- unlink (lockfile);
- continue;
- }
-
- /* Otherwise, sleep and try again. */
- sleep (5);
- }
-
- if (!locked) {
- /* Something has gone awry. */
- if (now >= timeout) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Timed out trying to get "
- "lock file on %s. Try again "
- "later.", source);
- }
- g_free (lockfile);
- unlink (locktmpfile);
- g_free (locktmpfile);
- close (sfd);
- close (dfd);
- return;
- }
-
- /* OK. We have the file locked now. */
-
- /* FIXME: Set a timer to keep the file locked. */
-
- while (1) {
- int written = 0;
-
- nread = read (sfd, buf, sizeof (buf));
- if (nread == 0)
- break;
- else if (nread == -1) {
- if (errno == EINTR)
- continue;
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Error reading mail file: %s",
- g_strerror (errno));
- break;
- }
-
- while (nread) {
- nwrote = write (dfd, buf + written, nread);
- if (nwrote == -1) {
- if (errno == EINTR)
- continue; /* continues inner loop */
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Error writing "
- "mail temp file: %s",
- g_strerror (errno));
- break;
- }
- written += nwrote;
- nread -= nwrote;
- }
- }
-
- /* If no errors occurred copying the data, and we successfully
- * close the destination file, then truncate the source file.
- */
- if (!camel_exception_is_set (ex)) {
- if (close (dfd) == 0)
- ftruncate (sfd, 0);
- else {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Failed to store mail in "
- "temp file %s: %s", dest,
- g_strerror (errno));
- }
- } else
- close (dfd);
- close (sfd);
-
- /* Clean up lock files. */
- unlink (lockfile);
- g_free (lockfile);
- unlink (locktmpfile);
- g_free (locktmpfile);
-}
-
-#ifdef MOVEMAIL_PATH
-static void
-movemail_external (const char *source, const char *dest, CamelException *ex)
-{
- sigset_t mask, omask;
- pid_t pid;
- int fd[2], len = 0, nread, status;
- char buf[BUFSIZ], *output = NULL;
-
- /* Block SIGCHLD so the app can't mess us up. */
- sigemptyset (&mask);
- sigaddset (&mask, SIGCHLD);
- sigprocmask (SIG_BLOCK, &mask, &omask);
-
- if (pipe (fd) == -1) {
- sigprocmask (SIG_SETMASK, &omask, NULL);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not create pipe: %s",
- g_strerror (errno));
- return;
- }
-
- pid = fork ();
- switch (pid) {
- case -1:
- close (fd[0]);
- close (fd[1]);
- sigprocmask (SIG_SETMASK, &omask, NULL);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not fork: %s",
- g_strerror (errno));
- return;
-
- case 0:
- /* Child */
- close (fd[0]);
- close (STDIN_FILENO);
- dup2 (fd[1], STDOUT_FILENO);
- dup2 (fd[1], STDERR_FILENO);
-
- execl (MOVEMAIL_PATH, MOVEMAIL_PATH, source, dest, NULL);
- _exit (255);
- break;
-
- default:
- break;
- }
-
- /* Parent */
- close (fd[1]);
-
- /* Read movemail's output. */
- while ((nread = read (fd[0], buf, sizeof (buf))) > 0) {
- output = g_realloc (output, len + nread + 1);
- memcpy (output + len, buf, nread);
- len += nread;
- output[len] = '\0';
- }
- close (fd[0]);
-
- /* Now get the exit status. */
- while (waitpid (pid, &status, 0) == -1 && errno == EINTR)
- ;
- sigprocmask (SIG_SETMASK, &omask, NULL);
-
- if (!WIFEXITED (status) || WEXITSTATUS (status) != 0) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Movemail program failed: %s",
- output ? output : "(Unknown error)");
- }
- g_free (output);
-}
-#endif
-
-
-#if 0
-static int
-camel_movemail_copy(int fromfd, int tofd, off_t start, size_t bytes)
-{
- char buffer[4096];
- int written = 0;
-
- d(printf("writing %d bytes ... ", bytes));
-
- if (lseek(fromfd, start, SEEK_SET) != start)
- return -1;
-
- while (bytes>0) {
- int toread, towrite;
-
- toread = bytes;
- if (bytes>4096)
- toread = 4096;
- else
- toread = bytes;
- do {
- towrite = read(fromfd, buffer, toread);
- } while (towrite == -1 && errno == EINTR);
-
- if (towrite == -1)
- return -1;
-
- /* check for 'end of file' */
- if (towrite == 0) {
- d(printf("end of file?\n"));
- break;
- }
-
- do {
- toread = write(tofd, buffer, towrite);
- } while (toread == -1 && errno == EINTR);
-
- if (toread == -1)
- return -1;
-
- written += toread;
- bytes -= toread;
- }
-
- d(printf("written %d bytes\n", written));
-
- return written;
-}
-#endif
-
-#define PRE_SIZE (32)
-
-#if 0
-static int
-camel_movemail_copy_filter(int fromfd, int tofd, off_t start, size_t bytes, CamelMimeFilter *filter)
-{
- char buffer[4096+PRE_SIZE];
- int written = 0;
- char *filterbuffer;
- int filterlen, filterpre;
-
- d(printf("writing %d bytes ... ", bytes));
-
- camel_mime_filter_reset(filter);
-
- if (lseek(fromfd, start, SEEK_SET) != start)
- return -1;
-
- while (bytes>0) {
- int toread, towrite;
-
- toread = bytes;
- if (bytes>4096)
- toread = 4096;
- else
- toread = bytes;
- do {
- towrite = read(fromfd, buffer+PRE_SIZE, toread);
- } while (towrite == -1 && errno == EINTR);
-
- if (towrite == -1)
- return -1;
-
- /* check for 'end of file' */
- if (towrite == 0) {
- d(printf("end of file?\n"));
- camel_mime_filter_complete(filter, buffer+PRE_SIZE, towrite, PRE_SIZE,
- &filterbuffer, &filterlen, &filterpre);
- towrite = filterlen;
- if (towrite == 0)
- break;
- } else {
- camel_mime_filter_filter(filter, buffer+PRE_SIZE, towrite, PRE_SIZE,
- &filterbuffer, &filterlen, &filterpre);
- towrite = filterlen;
- }
-
- do {
- toread = write(tofd, filterbuffer, towrite);
- } while (toread == -1 && errno == EINTR);
-
- if (toread == -1)
- return -1;
-
- written += toread;
- bytes -= toread;
- }
-
- d(printf("written %d bytes\n", written));
-
- return written;
-}
-
-/* write the headers back out again, but not he Content-Length header, because we dont
- want to maintain it! */
-static int
-solaris_header_write(int fd, struct _header_raw *header)
-{
- struct iovec iv[4];
- int outlen = 0, len;
-
- iv[1].iov_base = ":";
- iv[1].iov_len = 1;
- iv[3].iov_base = "\n";
- iv[3].iov_len = 1;
-
- while (header) {
- if (strcasecmp(header->name, "Content-Length")) {
- iv[0].iov_base = header->name;
- iv[0].iov_len = strlen(header->name);
- iv[2].iov_base = header->value;
- iv[2].iov_len = strlen(header->value);
-
- do {
- len = writev(fd, iv, 4);
- } while (len == -1 && errno == EINTR);
-
- if (len == -1)
- return -1;
- outlen += len;
- }
- header = header->next;
- }
-
- do {
- len = write(fd, "\n", 1);
- } while (len == -1 && errno == EINTR);
-
- if (len == -1)
- return -1;
-
- outlen += 1;
-
- d(printf("Wrote %d bytes of headers\n", outlen));
-
- return outlen;
-}
-
-/* Well, since Solaris is a tad broken wrt its 'mbox' folder format,
- we must convert it to a real mbox format. Thankfully this is
- mostly pretty easy */
-static int
-camel_movemail_solaris (int sfd, int dfd, CamelException *ex)
-{
- CamelMimeParser *mp;
- char *buffer;
- int len;
- CamelMimeFilterFrom *ffrom;
- int ret = 1;
-
- mp = camel_mime_parser_new();
- camel_mime_parser_scan_from(mp, TRUE);
- camel_mime_parser_init_with_fd(mp, sfd);
-
- ffrom = camel_mime_filter_from_new();
-
- while (camel_mime_parser_step(mp, &buffer, &len) == HSCAN_FROM) {
- if (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_FROM_END) {
- const char *cl;
- int length;
- int start, body;
- off_t newpos;
-
- ret = 0;
-
- start = camel_mime_parser_tell_start_from(mp);
- body = camel_mime_parser_tell(mp);
-
- /* write out headers, but NOT content-length header */
- solaris_header_write(dfd, camel_mime_parser_headers_raw(mp));
-
- cl = camel_mime_parser_header(mp, "content-length", NULL);
- if (cl == NULL) {
- g_warning("Required Content-Length header is missing from solaris mail box @ %d", (int)camel_mime_parser_tell(mp));
- camel_mime_parser_drop_step(mp);
- camel_mime_parser_drop_step(mp);
- camel_mime_parser_step(mp, &buffer, &len);
- camel_mime_parser_unstep(mp);
- length = camel_mime_parser_tell_start_from(mp) - body;
- newpos = -1;
- } else {
- length = atoi(cl);
- camel_mime_parser_drop_step(mp);
- camel_mime_parser_drop_step(mp);
- newpos = length+body;
- }
- /* copy body->length converting From lines */
- if (camel_movemail_copy_filter(sfd, dfd, body, length, (CamelMimeFilter *)ffrom) == -1)
- goto fail;
- if (newpos != -1)
- camel_mime_parser_seek(mp, newpos, SEEK_SET);
- } else {
- g_error("Inalid parser state: %d", camel_mime_parser_state(mp));
- }
- }
-
- camel_object_unref((CamelObject *)mp);
- camel_object_unref((CamelObject *)ffrom);
-
- return ret;
-
-fail:
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Error copying "
- "mail temp file: %s",
- g_strerror (errno));
-
-
- camel_object_unref((CamelObject *)mp);
- camel_object_unref((CamelObject *)ffrom);
-
- return -1;
-}
-#endif
diff --git a/camel/camel-movemail.h b/camel/camel-movemail.h
deleted file mode 100644
index 8b73435a43..0000000000
--- a/camel/camel-movemail.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-movemail.h: mbox copy function */
-
-/*
- * Author:
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_MOVEMAIL_H
-#define CAMEL_MOVEMAIL_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-exception.h>
-
-void camel_movemail (const char *source, const char *dest, CamelException *ex);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MOVEMAIL_H */
diff --git a/camel/camel-multipart.c b/camel/camel-multipart.c
deleted file mode 100644
index 1d0446842c..0000000000
--- a/camel/camel-multipart.c
+++ /dev/null
@@ -1,476 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-multipart.c : Abstract class for a multipart */
-
-#ifndef NO_WARNINGS
-#warning This should be a mostly abstract class, but it is not!
-#endif
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include "gmime-content-field.h"
-#include "camel-stream-mem.h"
-#include "camel-multipart.h"
-#include "camel-mime-part.h"
-#include "camel-exception.h"
-#include "md5-utils.h"
-
-#include <unistd.h> /* for getpid */
-#include <time.h> /* for time */
-
-#define d(x)
-
-static void add_part (CamelMultipart *multipart,
- CamelMimePart *part);
-static void add_part_at (CamelMultipart *multipart,
- CamelMimePart *part,
- guint index);
-static void remove_part (CamelMultipart *multipart,
- CamelMimePart *part);
-static CamelMimePart * remove_part_at (CamelMultipart *multipart,
- guint index);
-static CamelMimePart * get_part (CamelMultipart *multipart,
- guint index);
-static guint get_number (CamelMultipart *multipart);
-static void set_boundary (CamelMultipart *multipart,
- gchar *boundary);
-static const gchar * get_boundary (CamelMultipart *multipart);
-static int write_to_stream (CamelDataWrapper *data_wrapper,
- CamelStream *stream);
-static void unref_part (gpointer data, gpointer user_data);
-
-static CamelDataWrapperClass *parent_class = NULL;
-
-
-
-/* Returns the class for a CamelMultipart */
-#define CMP_CLASS(so) CAMEL_MULTIPART_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-/* Returns the class for a CamelDataWrapper */
-#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-
-static void
-camel_multipart_class_init (CamelMultipartClass *camel_multipart_class)
-{
- CamelDataWrapperClass *camel_data_wrapper_class =
- CAMEL_DATA_WRAPPER_CLASS (camel_multipart_class);
-
- parent_class = CAMEL_DATA_WRAPPER_CLASS (camel_type_get_global_classfuncs (camel_data_wrapper_get_type ()));
-
- /* virtual method definition */
- camel_multipart_class->add_part = add_part;
- camel_multipart_class->add_part_at = add_part_at;
- camel_multipart_class->remove_part = remove_part;
- camel_multipart_class->remove_part_at = remove_part_at;
- camel_multipart_class->get_part = get_part;
- camel_multipart_class->get_number = get_number;
- camel_multipart_class->set_boundary = set_boundary;
- camel_multipart_class->get_boundary = get_boundary;
-
- /* virtual method overload */
- camel_data_wrapper_class->write_to_stream = write_to_stream;
-}
-
-static void
-camel_multipart_init (gpointer object, gpointer klass)
-{
- CamelMultipart *multipart = CAMEL_MULTIPART (object);
-
- camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (multipart),
- "multipart/mixed");
- multipart->preface = NULL;
- multipart->postface = NULL;
-}
-
-static void
-camel_multipart_finalize (CamelObject *object)
-{
- CamelMultipart *multipart = CAMEL_MULTIPART (object);
-
- g_list_foreach (multipart->parts, unref_part, NULL);
-
- if (multipart->boundary)
- g_free (multipart->boundary);
- if (multipart->preface)
- g_free (multipart->preface);
- if (multipart->postface)
- g_free (multipart->postface);
-}
-
-
-CamelType
-camel_multipart_get_type (void)
-{
- static CamelType camel_multipart_type = CAMEL_INVALID_TYPE;
-
- if (camel_multipart_type == CAMEL_INVALID_TYPE) {
- camel_multipart_type = camel_type_register (camel_data_wrapper_get_type (), "CamelMultipart",
- sizeof (CamelMultipart),
- sizeof (CamelMultipartClass),
- (CamelObjectClassInitFunc) camel_multipart_class_init,
- NULL,
- (CamelObjectInitFunc) camel_multipart_init,
- (CamelObjectFinalizeFunc) camel_multipart_finalize);
- }
-
- return camel_multipart_type;
-}
-
-static void
-unref_part (gpointer data, gpointer user_data)
-{
- CamelObject *part = CAMEL_OBJECT (data);
-
- camel_object_unref (part);
-}
-
-/**
- * camel_multipart_new:
- *
- * Create a new CamelMultipart object.
- *
- * Return value: a new CamelMultipart
- **/
-CamelMultipart *
-camel_multipart_new (void)
-{
- CamelMultipart *multipart;
-
- multipart = (CamelMultipart *)camel_object_new (CAMEL_MULTIPART_TYPE);
- multipart->preface = NULL;
- multipart->postface = NULL;
-
- return multipart;
-}
-
-
-static void
-add_part (CamelMultipart *multipart, CamelMimePart *part)
-{
- multipart->parts = g_list_append (multipart->parts, part);
- camel_object_ref (CAMEL_OBJECT (part));
-}
-
-/**
- * camel_multipart_add_part:
- * @multipart: a CamelMultipart
- * @part: the part to add
- *
- * Appends the part to the multipart object.
- **/
-void
-camel_multipart_add_part (CamelMultipart *multipart, CamelMimePart *part)
-{
- g_return_if_fail (CAMEL_IS_MULTIPART (multipart));
- g_return_if_fail (CAMEL_IS_MIME_PART (part));
-
- CMP_CLASS (multipart)->add_part (multipart, part);
-}
-
-
-static void
-add_part_at (CamelMultipart *multipart, CamelMimePart *part, guint index)
-{
- multipart->parts = g_list_insert (multipart->parts, part, index);
- camel_object_ref (CAMEL_OBJECT (part));
-}
-
-/**
- * camel_multipart_add_part_at:
- * @multipart: a CamelMultipart
- * @part: the part to add
- * @index: index to add the multipart at
- *
- * Adds the part to the multipart object after the @index'th
- * element. If @index is greater than the number of parts, it is
- * equivalent to camel_multipart_add_part().
- **/
-void
-camel_multipart_add_part_at (CamelMultipart *multipart,
- CamelMimePart *part, guint index)
-{
- g_return_if_fail (CAMEL_IS_MULTIPART (multipart));
- g_return_if_fail (CAMEL_IS_MIME_PART (part));
-
- CMP_CLASS (multipart)->add_part_at (multipart, part, index);
-}
-
-
-static void
-remove_part (CamelMultipart *multipart, CamelMimePart *part)
-{
- if (!multipart->parts)
- return;
- multipart->parts = g_list_remove (multipart->parts, part);
- camel_object_unref (CAMEL_OBJECT (part));
-}
-
-/**
- * camel_multipart_remove_part:
- * @multipart: a CamelMultipart
- * @part: the part to remove
- *
- * Removes @part from @multipart.
- **/
-void
-camel_multipart_remove_part (CamelMultipart *multipart,
- CamelMimePart *part)
-{
- g_return_if_fail (CAMEL_IS_MULTIPART (multipart));
- g_return_if_fail (CAMEL_IS_MIME_PART (part));
-
- CMP_CLASS (multipart)->remove_part (multipart, part);
-}
-
-
-static CamelMimePart *
-remove_part_at (CamelMultipart *multipart, guint index)
-{
- GList *parts_list;
- GList *part_to_remove;
- CamelMimePart *removed_part;
-
- if (!(multipart->parts))
- return NULL;
-
- parts_list = multipart->parts;
- part_to_remove = g_list_nth (parts_list, index);
- if (!part_to_remove) {
- g_warning ("CamelMultipart::remove_part_at: "
- "part to remove is NULL\n");
- return NULL;
- }
- removed_part = CAMEL_MIME_PART (part_to_remove->data);
-
- multipart->parts = g_list_remove_link (parts_list, part_to_remove);
- if (part_to_remove->data)
- camel_object_unref (CAMEL_OBJECT (part_to_remove->data));
- g_list_free_1 (part_to_remove);
-
- return removed_part;
-}
-
-/**
- * camel_multipart_remove_part_at:
- * @multipart: a CamelMultipart
- * @index: a zero-based index indicating the part to remove
- *
- * Remove the indicated part from the multipart object.
- *
- * Return value: the removed part. Note that it is camel_object_unref()ed
- * before being returned, which may cause it to be destroyed.
- **/
-CamelMimePart *
-camel_multipart_remove_part_at (CamelMultipart *multipart, guint index)
-{
- g_return_val_if_fail (CAMEL_IS_MULTIPART (multipart), NULL);
-
- return CMP_CLASS (multipart)->remove_part_at (multipart, index);
-}
-
-
-static CamelMimePart *
-get_part (CamelMultipart *multipart, guint index)
-{
- GList *part;
-
- if (!(multipart->parts))
- return NULL;
-
- part = g_list_nth (multipart->parts, index);
- if (part)
- return CAMEL_MIME_PART (part->data);
- else
- return NULL;
-}
-
-/**
- * camel_multipart_get_part:
- * @multipart: a CamelMultipart
- * @index: a zero-based index indicating the part to get
- *
- * Return value: the indicated subpart, or %NULL
- **/
-CamelMimePart *
-camel_multipart_get_part (CamelMultipart *multipart, guint index)
-{
- g_return_val_if_fail (CAMEL_IS_MULTIPART (multipart), NULL);
-
- return CMP_CLASS (multipart)->get_part (multipart, index);
-}
-
-
-static guint
-get_number (CamelMultipart *multipart)
-{
- return g_list_length (multipart->parts);
-}
-
-/**
- * camel_multipart_get_number:
- * @multipart: a CamelMultipart
- *
- * Return value: the number of subparts in @multipart
- **/
-guint
-camel_multipart_get_number (CamelMultipart *multipart)
-{
- g_return_val_if_fail (CAMEL_IS_MULTIPART (multipart), 0);
-
- return CMP_CLASS (multipart)->get_number (multipart);
-}
-
-
-static void
-set_boundary (CamelMultipart *multipart, gchar *boundary)
-{
- CamelDataWrapper *cdw = CAMEL_DATA_WRAPPER (multipart);
- char *bgen, digest[16], bbuf[27], *p;
- int state, save;
-
- g_return_if_fail (cdw->mime_type != NULL);
-
- if (!boundary) {
- /* Generate a fairly random boundary string. */
- bgen = g_strdup_printf ("%p:%lu:%lu", multipart,
- (unsigned long) getpid(),
- (unsigned long) time(0));
- md5_get_digest (bgen, strlen (bgen), digest);
- g_free (bgen);
- strcpy (bbuf, "=-");
- p = bbuf + 2;
- state = save = 0;
- p += base64_encode_step (digest, 16, p, &state, &save);
- *p = '\0';
-
- boundary = bbuf;
- }
-
- gmime_content_field_set_parameter (cdw->mime_type, "boundary",
- boundary);
-}
-
-/**
- * camel_multipart_set_boundary:
- * @multipart: a CamelMultipart
- * @boundary: the message boundary, or %NULL
- *
- * Sets the message boundary for @multipart to @boundary. This should
- * be a string which does not occur anywhere in any of @multipart's
- * subparts. If @boundary is %NULL, a randomly-generated boundary will
- * be used.
- **/
-void
-camel_multipart_set_boundary (CamelMultipart *multipart, gchar *boundary)
-{
- g_return_if_fail (CAMEL_IS_MULTIPART (multipart));
-
- CMP_CLASS (multipart)->set_boundary (multipart, boundary);
-}
-
-
-static const gchar *
-get_boundary (CamelMultipart *multipart)
-{
- CamelDataWrapper *cdw = CAMEL_DATA_WRAPPER (multipart);
-
- g_return_val_if_fail (cdw->mime_type != NULL, NULL);
- return gmime_content_field_get_parameter (cdw->mime_type, "boundary");
-}
-
-/**
- * camel_multipart_get_boundary:
- * @multipart: a CamelMultipart
- *
- * Return value: @multipart's message boundary
- **/
-const gchar *
-camel_multipart_get_boundary (CamelMultipart *multipart)
-{
- return CMP_CLASS (multipart)->get_boundary (multipart);
-}
-
-/* this is MIME specific, doesn't belong here really */
-static int
-write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream)
-{
- CamelMultipart *multipart = CAMEL_MULTIPART (data_wrapper);
- const gchar *boundary;
- int total = 0;
- int count;
- GList *node;
-
- /* get the bundary text */
- boundary = camel_multipart_get_boundary (multipart);
-
- /* we cannot write a multipart without a boundary string */
- g_return_val_if_fail (boundary && *boundary, -1);
-
- /*
- * write the preface text (usually something like
- * "This is a mime message, if you see this, then
- * your mail client probably doesn't support ...."
- */
- if (multipart->preface) {
- count = camel_stream_write_string (stream, multipart->preface);
- if (count == -1)
- return -1;
- total += count;
- }
-
- /*
- * Now, write all the parts, separated by the boundary
- * delimiter
- */
- node = multipart->parts;
- while (node) {
- count = camel_stream_printf (stream, "\n--%s\n", boundary);
- if (count == -1)
- return -1;
- total += count;
-
- count = camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (node->data), stream);
- if (count == -1)
- return -1;
- total += count;
- node = node->next;
- }
-
- /* write the terminating boudary delimiter */
- count = camel_stream_printf (stream, "\n--%s--\n", boundary);
- if (count == -1)
- return -1;
- total += count;
-
- /* and finally the postface */
- if (multipart->postface) {
- count = camel_stream_write_string (stream, multipart->postface);
- if (count == -1)
- return -1;
- total += count;
- }
-
- return total;
-}
diff --git a/camel/camel-multipart.h b/camel/camel-multipart.h
deleted file mode 100644
index 642cdb5255..0000000000
--- a/camel/camel-multipart.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-multipart.h : class for a multipart */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_MULTIPART_H
-#define CAMEL_MULTIPART_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-data-wrapper.h>
-
-#define CAMEL_MULTIPART_TYPE (camel_multipart_get_type ())
-#define CAMEL_MULTIPART(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MULTIPART_TYPE, CamelMultipart))
-#define CAMEL_MULTIPART_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MULTIPART_TYPE, CamelMultipartClass))
-#define CAMEL_IS_MULTIPART(o) (CAMEL_CHECK_TYPE((o), CAMEL_MULTIPART_TYPE))
-
-
-struct _CamelMultipart
-{
- CamelDataWrapper parent_object;
-
- CamelMimePart *parent;
- GList *parts;
- gchar *boundary;
- gchar *preface;
- gchar *postface;
-
-};
-
-
-
-typedef struct {
- CamelDataWrapperClass parent_class;
-
- /* Virtual methods */
- void (*add_part) (CamelMultipart *multipart, CamelMimePart *part);
- void (*add_part_at) (CamelMultipart *multipart, CamelMimePart *part, guint index);
- void (*remove_part) (CamelMultipart *multipart, CamelMimePart *part);
- CamelMimePart * (*remove_part_at) (CamelMultipart *multipart, guint index);
- CamelMimePart * (*get_part) (CamelMultipart *multipart, guint index);
- guint (*get_number) (CamelMultipart *multipart);
- void (*set_boundary) (CamelMultipart *multipart, gchar *boundary);
- const gchar * (*get_boundary) (CamelMultipart *multipart);
-
-} CamelMultipartClass;
-
-
-/* Standard Camel function */
-CamelType camel_multipart_get_type (void);
-
-
-/* public methods */
-CamelMultipart * camel_multipart_new (void);
-void camel_multipart_add_part (CamelMultipart *multipart,
- CamelMimePart *part);
-void camel_multipart_add_part_at (CamelMultipart *multipart,
- CamelMimePart *part,
- guint index);
-void camel_multipart_remove_part (CamelMultipart *multipart,
- CamelMimePart *part);
-CamelMimePart * camel_multipart_remove_part_at (CamelMultipart *multipart,
- guint index);
-CamelMimePart * camel_multipart_get_part (CamelMultipart *multipart,
- guint index);
-guint camel_multipart_get_number (CamelMultipart *multipart);
-void camel_multipart_set_boundary (CamelMultipart *multipart,
- gchar *boundary);
-const gchar * camel_multipart_get_boundary (CamelMultipart *multipart);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MULTIPART_H */
-
diff --git a/camel/camel-news-address.c b/camel/camel-news-address.c
deleted file mode 100644
index ebd35b80c7..0000000000
--- a/camel/camel-news-address.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors:
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "camel-news-address.h"
-
-
-static void camel_news_address_class_init (CamelNewsAddressClass *klass);
-
-static CamelAddressClass *camel_news_address_parent;
-
-static void
-camel_news_address_class_init (CamelNewsAddressClass *klass)
-{
- camel_news_address_parent = CAMEL_ADDRESS_CLASS (camel_type_get_global_classfuncs (camel_address_get_type ()));
-}
-
-
-CamelType
-camel_news_address_get_type (void)
-{
- static guint type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_address_get_type (), "CamelNewsAddress",
- sizeof (CamelNewsAddress),
- sizeof (CamelNewsAddressClass),
- (CamelObjectClassInitFunc) camel_news_address_class_init,
- NULL,
- NULL,
- NULL);
- }
-
- return type;
-}
-
-/**
- * camel_news_address_new:
- *
- * Create a new CamelNewsAddress object.
- *
- * Return value: A new CamelNewsAddress widget.
- **/
-CamelNewsAddress *
-camel_news_address_new (void)
-{
- CamelNewsAddress *new = CAMEL_NEWS_ADDRESS ( camel_object_new (camel_news_address_get_type ()));
- return new;
-}
diff --git a/camel/camel-news-address.h b/camel/camel-news-address.h
deleted file mode 100644
index 8d2aa03968..0000000000
--- a/camel/camel-news-address.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors:
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_NEWS_ADDRESS_H
-#define _CAMEL_NEWS_ADDRESS_H
-
-#include <camel/camel-address.h>
-
-#define CAMEL_NEWS_ADDRESS(obj) CAMEL_CHECK_CAST (obj, camel_news_address_get_type (), CamelNewsAddress)
-#define CAMEL_NEWS_ADDRESS_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_news_address_get_type (), CamelNewsAddressClass)
-#define IS_CAMEL_NEWS_ADDRESS(obj) CAMEL_CHECK_TYPE (obj, camel_news_address_get_type ())
-
-typedef struct _CamelNewsAddressClass CamelNewsAddressClass;
-
-struct _CamelNewsAddress {
- CamelAddress parent;
-
- struct _CamelNewsAddressPrivate *priv;
-};
-
-struct _CamelNewsAddressClass {
- CamelAddressClass parent_class;
-};
-
-guint camel_news_address_get_type (void);
-CamelNewsAddress *camel_news_address_new (void);
-
-#endif /* ! _CAMEL_NEWS_ADDRESS_H */
diff --git a/camel/camel-object.c b/camel/camel-object.c
deleted file mode 100644
index 7805546c9e..0000000000
--- a/camel/camel-object.c
+++ /dev/null
@@ -1,971 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-object.c: Base class for Camel */
-
-/*
- * Author:
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include "camel-object.h"
-
-/* I just mashed the keyboard for these... */
-#define CAMEL_OBJECT_MAGIC_VALUE 0x77A344EF
-#define CAMEL_OBJECT_CLASS_MAGIC_VALUE 0xEE26A990
-#define CAMEL_OBJECT_FINALIZED_VALUE 0x84AC3656
-#define CAMEL_OBJECT_CLASS_FINALIZED_VALUE 0x7621ABCD
-
-#define DEFAULT_PREALLOCS 8
-
-#define BAST_CASTARD 1 /* Define to return NULL when casts fail */
-
-#define NULL_PREP_VALUE ((gpointer)make_global_classfuncs) /* See camel_object_class_declare_event */
-
-/* ** Quickie type system ************************************************* */
-
-typedef struct _CamelTypeInfo
-{
- CamelType self;
- CamelType parent;
- const gchar *name;
-
- size_t instance_size;
- GMemChunk *instance_chunk;
- CamelObjectInitFunc instance_init;
- CamelObjectFinalizeFunc instance_finalize;
- GList *free_instances;
-
- size_t classfuncs_size;
- CamelObjectClassInitFunc class_init;
- CamelObjectClassFinalizeFunc class_finalize;
- CamelObjectClass *global_classfuncs;
-}
-CamelTypeInfo;
-
-typedef struct _CamelHookPair
-{
- CamelObjectEventHookFunc func;
- gpointer user_data;
-}
-CamelHookPair;
-
-/* ************************************************************************ */
-
-static void camel_type_lock_up (void);
-static void camel_type_lock_down (void);
-
-static void obj_init (CamelObject * obj);
-static void obj_finalize (CamelObject * obj);
-static void obj_class_init (CamelObjectClass * class);
-static void obj_class_finalize (CamelObjectClass * class);
-
-static gboolean shared_is_of_type (CamelObjectShared * sh, CamelType ctype,
- gboolean is_obj);
-static void make_global_classfuncs (CamelTypeInfo * type_info);
-
-/* ************************************************************************ */
-
-G_LOCK_DEFINE_STATIC (type_system);
-G_LOCK_DEFINE_STATIC (type_system_level);
-static GPrivate *type_system_locklevel = NULL;
-
-G_LOCK_DEFINE_STATIC (refcount);
-
-static gboolean type_system_initialized = FALSE;
-static GHashTable *ctype_to_typeinfo = NULL;
-static const CamelType camel_object_type = 1;
-static CamelType cur_max_type = CAMEL_INVALID_TYPE;
-
-/* ************************************************************************ */
-
-#define LOCK_VAL (GPOINTER_TO_INT (g_private_get (type_system_locklevel)))
-#define LOCK_SET( val ) g_private_set (type_system_locklevel, GINT_TO_POINTER (val))
-
-static void
-camel_type_lock_up (void)
-{
- G_LOCK (type_system_level);
-
- if (type_system_locklevel == NULL)
- type_system_locklevel = g_private_new (GINT_TO_POINTER (0));
-
- if (LOCK_VAL == 0) {
- G_UNLOCK (type_system_level);
- G_LOCK (type_system);
- G_LOCK (type_system_level);
- }
-
- LOCK_SET (LOCK_VAL + 1);
-
- G_UNLOCK (type_system_level);
-}
-
-static void
-camel_type_lock_down (void)
-{
- G_LOCK (type_system_level);
-
- if (type_system_locklevel == NULL) {
- g_warning
- ("camel_type_lock_down: lock down before a lock up?");
- type_system_locklevel = g_private_new (GINT_TO_POINTER (0));
- G_UNLOCK (type_system_level);
- return;
- }
-
- LOCK_SET (LOCK_VAL - 1);
-
- if (LOCK_VAL == 0)
- G_UNLOCK (type_system);
-
- G_UNLOCK (type_system_level);
-}
-
-void
-camel_type_init (void)
-{
- CamelTypeInfo *obj_info;
-
- camel_type_lock_up ();
-
- if (type_system_initialized) {
- g_warning
- ("camel_type_init: type system already initialized.");
- camel_type_lock_down ();
- return;
- }
-
- type_system_initialized = TRUE;
- ctype_to_typeinfo = g_hash_table_new (g_direct_hash, g_direct_equal);
-
- obj_info = g_new (CamelTypeInfo, 1);
- obj_info->self = camel_object_type;
- obj_info->parent = CAMEL_INVALID_TYPE;
- obj_info->name = "CamelObject";
-
- obj_info->instance_size = sizeof (CamelObject);
- obj_info->instance_chunk =
- g_mem_chunk_create (CamelObject, DEFAULT_PREALLOCS,
- G_ALLOC_ONLY);
- obj_info->instance_init = obj_init;
- obj_info->instance_finalize = obj_finalize;
- obj_info->free_instances = NULL;
-
- obj_info->classfuncs_size = sizeof (CamelObjectClass);
- obj_info->class_init = obj_class_init;
- obj_info->class_finalize = obj_class_finalize;
-
- g_hash_table_insert (ctype_to_typeinfo,
- GINT_TO_POINTER (CAMEL_INVALID_TYPE), NULL);
- g_hash_table_insert (ctype_to_typeinfo,
- GINT_TO_POINTER (camel_object_type), obj_info);
-
- /* Sigh. Ugly */
- make_global_classfuncs (obj_info);
-
- cur_max_type = camel_object_type;
-
- camel_type_lock_down ();
-}
-
-CamelType
-camel_type_register (CamelType parent, const gchar * name,
- size_t instance_size, size_t classfuncs_size,
- CamelObjectClassInitFunc class_init,
- CamelObjectClassFinalizeFunc class_finalize,
- CamelObjectInitFunc instance_init,
- CamelObjectFinalizeFunc instance_finalize)
-{
- CamelTypeInfo *parent_info;
- CamelTypeInfo *obj_info;
- gchar *chunkname;
-
- g_return_val_if_fail (parent != CAMEL_INVALID_TYPE,
- CAMEL_INVALID_TYPE);
- g_return_val_if_fail (name, CAMEL_INVALID_TYPE);
- g_return_val_if_fail (instance_size, CAMEL_INVALID_TYPE);
- g_return_val_if_fail (classfuncs_size, CAMEL_INVALID_TYPE);
-
- camel_type_lock_up ();
-
- if (type_system_initialized == FALSE) {
- G_UNLOCK (type_system);
- camel_type_init ();
- G_LOCK (type_system);
- }
-
- parent_info =
- g_hash_table_lookup (ctype_to_typeinfo,
- GINT_TO_POINTER (parent));
-
- if (parent_info == NULL) {
- g_warning
- ("camel_type_register: no such parent type %d of class `%s'",
- parent, name);
- camel_type_lock_down ();
- return CAMEL_INVALID_TYPE;
- }
-
- if (parent_info->instance_size > instance_size) {
- g_warning
- ("camel_type_register: instance of class `%s' would be smaller than parent `%s'",
- name, parent_info->name);
- camel_type_lock_down ();
- return CAMEL_INVALID_TYPE;
- }
-
- if (parent_info->classfuncs_size > classfuncs_size) {
- g_warning
- ("camel_type_register: classfuncs of class `%s' would be smaller than parent `%s'",
- name, parent_info->name);
- camel_type_lock_down ();
- return CAMEL_INVALID_TYPE;
- }
-
- cur_max_type++;
-
- obj_info = g_new (CamelTypeInfo, 1);
- obj_info->self = cur_max_type;
- obj_info->parent = parent;
- obj_info->name = name;
-
- obj_info->instance_size = instance_size;
- chunkname =
- g_strdup_printf ("chunk for instances of Camel type `%s'",
- name);
- obj_info->instance_chunk =
- g_mem_chunk_new (chunkname, instance_size,
- instance_size * DEFAULT_PREALLOCS,
- G_ALLOC_ONLY);
- g_free (chunkname);
- obj_info->instance_init = instance_init;
- obj_info->instance_finalize = instance_finalize;
- obj_info->free_instances = NULL;
-
- obj_info->classfuncs_size = classfuncs_size;
- obj_info->class_init = class_init;
- obj_info->class_finalize = class_finalize;
-
- g_hash_table_insert (ctype_to_typeinfo,
- GINT_TO_POINTER (obj_info->self), obj_info);
-
- /* Sigh. Ugly. */
- make_global_classfuncs (obj_info);
-
- camel_type_lock_down ();
- return obj_info->self;
-}
-
-CamelObjectClass *
-camel_type_get_global_classfuncs (CamelType type)
-{
- CamelTypeInfo *type_info;
-
- g_return_val_if_fail (type != CAMEL_INVALID_TYPE, NULL);
-
- camel_type_lock_up ();
- type_info =
- g_hash_table_lookup (ctype_to_typeinfo,
- GINT_TO_POINTER (type));
- camel_type_lock_down ();
-
- g_return_val_if_fail (type_info != NULL, NULL);
-
- return type_info->global_classfuncs;
-}
-
-const gchar *
-camel_type_to_name (CamelType type)
-{
- CamelTypeInfo *type_info;
-
- g_return_val_if_fail (type != CAMEL_INVALID_TYPE,
- "(the invalid type)");
-
- camel_type_lock_up ();
- type_info =
- g_hash_table_lookup (ctype_to_typeinfo,
- GINT_TO_POINTER (type));
- camel_type_lock_down ();
-
- g_return_val_if_fail (type_info != NULL,
- "(a bad type parameter was specified)");
-
- return type_info->name;
-}
-
-/* ** The CamelObject ***************************************************** */
-
-static void
-obj_init (CamelObject * obj)
-{
- obj->s.magic = CAMEL_OBJECT_MAGIC_VALUE;
- obj->ref_count = 1;
- obj->event_to_hooklist = NULL;
- obj->in_event = 0;
-}
-
-static void
-obj_finalize (CamelObject * obj)
-{
- g_return_if_fail (obj->s.magic == CAMEL_OBJECT_MAGIC_VALUE);
- g_return_if_fail (obj->ref_count == 0);
- g_return_if_fail (obj->in_event == 0);
-
- obj->s.magic = CAMEL_OBJECT_FINALIZED_VALUE;
-
- if (obj->event_to_hooklist) {
- g_hash_table_foreach (obj->event_to_hooklist, (GHFunc) g_free,
- NULL);
- g_hash_table_destroy (obj->event_to_hooklist);
- obj->event_to_hooklist = NULL;
- }
-}
-
-static void
-obj_class_init (CamelObjectClass * class)
-{
- class->s.magic = CAMEL_OBJECT_CLASS_MAGIC_VALUE;
-
- camel_object_class_declare_event (class, "finalize", NULL);
-}
-
-static void
-obj_class_finalize (CamelObjectClass * class)
-{
- g_return_if_fail (class->s.magic == CAMEL_OBJECT_CLASS_MAGIC_VALUE);
-
- class->s.magic = CAMEL_OBJECT_CLASS_FINALIZED_VALUE;
-
- if (class->event_to_preplist) {
- g_hash_table_foreach (class->event_to_preplist,
- (GHFunc) g_free, NULL);
- g_hash_table_destroy (class->event_to_preplist);
- class->event_to_preplist = NULL;
- }
-}
-
-CamelType
-camel_object_get_type (void)
-{
- if (type_system_initialized == FALSE)
- camel_type_init ();
-
- return camel_object_type;
-}
-
-CamelObject *
-camel_object_new (CamelType type)
-{
- CamelTypeInfo *type_info;
- GSList *parents = NULL;
- GSList *head = NULL;
- CamelObject *instance;
-
- g_return_val_if_fail (type != CAMEL_INVALID_TYPE, NULL);
-
- /* Look up the type */
-
- camel_type_lock_up ();
-
- type_info =
- g_hash_table_lookup (ctype_to_typeinfo,
- GINT_TO_POINTER (type));
-
- if (type_info == NULL) {
- g_warning
- ("camel_object_new: trying to create object of invalid type %d",
- type);
- camel_type_lock_down ();
- return NULL;
- }
-
- /* Grab an instance out of the freed ones if possible, alloc otherwise */
-
- if (type_info->free_instances) {
- GList *first;
-
- first = g_list_first (type_info->free_instances);
- instance = first->data;
- type_info->free_instances =
- g_list_remove_link (type_info->free_instances, first);
- g_list_free_1 (first);
- } else {
- instance = g_mem_chunk_alloc0 (type_info->instance_chunk);
- }
-
- /* Init the instance and classfuncs a bit */
-
- instance->s.type = type;
- instance->classfuncs = type_info->global_classfuncs;
-
- /* Loop through the parents in simplest -> most complex order, initing the class and instance.
-
- * When parent = CAMEL_INVALID_TYPE and we're at the end of the line, _lookup returns NULL
- * because we inserted it as corresponding to CAMEL_INVALID_TYPE. Clever, eh?
- */
-
- while (type_info) {
- parents = g_slist_prepend (parents, type_info);
- type_info =
- g_hash_table_lookup (ctype_to_typeinfo,
- GINT_TO_POINTER (type_info->
- parent));
- }
-
- head = parents;
-
- for (; parents && parents->data; parents = parents->next) {
- CamelTypeInfo *thisinfo;
-
- thisinfo = parents->data;
- if (thisinfo->instance_init)
- (thisinfo->instance_init) (instance);
- }
-
- g_slist_free (head);
-
- camel_type_lock_down ();
- return instance;
-}
-
-void
-camel_object_ref (CamelObject * obj)
-{
- g_return_if_fail (CAMEL_IS_OBJECT (obj));
-
- G_LOCK (refcount);
- obj->ref_count++;
- G_UNLOCK (refcount);
-}
-
-void
-camel_object_unref (CamelObject * obj)
-{
- CamelTypeInfo *type_info;
- CamelTypeInfo *iter;
- GSList *parents = NULL;
- GSList *head = NULL;
-
- g_return_if_fail (CAMEL_IS_OBJECT (obj));
-
- G_LOCK (refcount);
- obj->ref_count--;
-
- if (obj->ref_count > 0) {
- G_UNLOCK (refcount);
- return;
- }
-
- G_UNLOCK (refcount);
-
- /* Oh no! We want to emit a "finalized" event, but that function refs the object
- * because it's not supposed to get finalized in an event, but it is being finalized
- * right now, and AAUGH AAUGH AUGH AUGH!
- *
- * So we don't call camel_object_trigger_event. We do it ourselves. We even know
- * that CamelObject doesn't provide a prep for the finalized event, so we plunge
- * right in and call our hooks.
- *
- * And there was much rejoicing.
- */
-
-#define hooklist parents /*cough */
-
- if (obj->event_to_hooklist) {
- CamelHookPair *pair;
-
- hooklist =
- g_hash_table_lookup (obj->event_to_hooklist,
- "finalize");
-
- while (hooklist && hooklist->data) {
- pair = hooklist->data;
- (pair->func) (obj, NULL, pair->user_data);
- hooklist = hooklist->next;
- }
- }
-
- hooklist = NULL; /* Don't mess with this line */
-
-#undef hooklist
-
- /* Destroy it! hahaha! */
-
- camel_type_lock_up ();
-
- type_info =
- g_hash_table_lookup (ctype_to_typeinfo,
- GINT_TO_POINTER (obj->s.type));
-
- if (type_info == NULL) {
- g_warning
- ("camel_object_unref: seemingly valid object has a bad type %d",
- obj->s.type);
- camel_type_lock_down ();
- return;
- }
-
- /* Loop through the parents in most complex -> simplest order, finalizing the class
- * and instance.
- *
- * When parent = CAMEL_INVALID_TYPE and we're at the end of the line, _lookup returns NULL
- * because we inserted it as corresponding to CAMEL_INVALID_TYPE. Clever, eh?
- *
- * Use iter to preserve type_info for free_{instance,classfunc}s
- */
-
- iter = type_info;
-
- while (iter) {
- parents = g_slist_prepend (parents, iter);
- iter =
- g_hash_table_lookup (ctype_to_typeinfo,
- GINT_TO_POINTER (iter->parent));
- }
-
- parents = g_slist_reverse (parents);
- head = parents;
-
- for (; parents && parents->data; parents = parents->next) {
- CamelTypeInfo *thisinfo;
-
- thisinfo = parents->data;
- if (thisinfo->instance_finalize)
- (thisinfo->instance_finalize) (obj);
- }
-
- g_slist_free (head);
-
- /* A little bit of cleaning up.
-
- * Don't erase the type, so we can peek at it if a finalized object
- * is check_cast'ed somewhere.
- */
-
- memset (obj, 0, type_info->instance_size);
- obj->s.type = type_info->self;
- obj->s.magic = CAMEL_OBJECT_FINALIZED_VALUE;
-
- /* Tuck away the pointer for use in a new object */
-
- type_info->free_instances =
- g_list_prepend (type_info->free_instances, obj);
-
- camel_type_lock_down ();
-}
-
-gboolean
-camel_object_is_of_type (CamelObject * obj, CamelType ctype)
-{
- return shared_is_of_type ((CamelObjectShared *) obj, ctype, TRUE);
-}
-
-gboolean
-camel_object_class_is_of_type (CamelObjectClass * class, CamelType ctype)
-{
- return shared_is_of_type ((CamelObjectShared *) class, ctype, FALSE);
-}
-
-#ifdef BAST_CASTARD
-#define ERRVAL NULL
-#else
-#define ERRVAL obj
-#endif
-
-CamelObject *
-camel_object_check_cast (CamelObject * obj, CamelType ctype)
-{
- if (shared_is_of_type ((CamelObjectShared *) obj, ctype, TRUE))
- return obj;
- return ERRVAL;
-}
-
-CamelObjectClass *
-camel_object_class_check_cast (CamelObjectClass * class, CamelType ctype)
-{
- if (shared_is_of_type ((CamelObjectShared *) class, ctype, FALSE))
- return class;
- return ERRVAL;
-}
-
-#undef ERRVAL
-
-gchar *
-camel_object_describe (CamelObject * obj)
-{
- if (obj == NULL)
- return g_strdup ("a NULL pointer");
-
- if (obj->s.magic == CAMEL_OBJECT_MAGIC_VALUE) {
- return g_strdup_printf ("an instance of `%s' at %p",
- camel_type_to_name (obj->s.type),
- obj);
- } else if (obj->s.magic == CAMEL_OBJECT_FINALIZED_VALUE) {
- return g_strdup_printf ("a finalized instance of `%s' at %p",
- camel_type_to_name (obj->s.type),
- obj);
- } else if (obj->s.magic == CAMEL_OBJECT_CLASS_MAGIC_VALUE) {
- return g_strdup_printf ("the classfuncs of `%s' at %p",
- camel_type_to_name (obj->s.type),
- obj);
- } else if (obj->s.magic == CAMEL_OBJECT_CLASS_FINALIZED_VALUE) {
- return
- g_strdup_printf
- ("the finalized classfuncs of `%s' at %p",
- camel_type_to_name (obj->s.type), obj);
- }
-
- return g_strdup ("not a CamelObject");
-}
-
-/* This is likely to be called in the class_init callback,
- * and the type will likely be somewhat uninitialized.
- * Is this a problem? We'll see....
- */
-void
-camel_object_class_declare_event (CamelObjectClass * class,
- const gchar * name,
- CamelObjectEventPrepFunc prep)
-{
- g_return_if_fail (CAMEL_IS_OBJECT_CLASS (class));
- g_return_if_fail (name);
-
- if (class->event_to_preplist == NULL)
- class->event_to_preplist =
- g_hash_table_new (g_str_hash, g_str_equal);
- else if (g_hash_table_lookup (class->event_to_preplist, name) != NULL) {
- g_warning
- ("camel_object_class_declare_event: event `%s' already declared for `%s'",
- name, camel_type_to_name (class->s.type));
- return;
- }
-
- /* AIEEEEEEEEEEEEEEEEEEEEEE
-
- * I feel so naughty. Since it's valid to declare an event and not
- * provide a hook, it should be valid to insert a NULL value into
- * the table. However, then our lookup in trigger_event would be
- * ambiguous, not telling us whether the event is undefined or whether
- * it merely has no hook.
- *
- * So we create an 'NULL prep' value that != NULL... specifically, it
- * equals the address of one of our static functions , because that
- * can't possibly be your hook.
- *
- * Just don't forget to check for the 'evil value' and it'll work,
- * I promise.
- */
-
- if (prep == NULL)
- prep = NULL_PREP_VALUE;
-
- g_hash_table_insert (class->event_to_preplist, g_strdup (name), prep);
-}
-
-void
-camel_object_hook_event (CamelObject * obj, const gchar * name,
- CamelObjectEventHookFunc hook, gpointer user_data)
-{
- GSList *hooklist;
- CamelHookPair *pair;
-
- g_return_if_fail (CAMEL_IS_OBJECT (obj));
- g_return_if_fail (name);
- g_return_if_fail (hook);
-
- if (obj->event_to_hooklist == NULL)
- obj->event_to_hooklist =
- g_hash_table_new (g_str_hash, g_str_equal);
-
- pair = g_new (CamelHookPair, 1);
- pair->func = hook;
- pair->user_data = user_data;
-
- hooklist = g_hash_table_lookup (obj->event_to_hooklist, name);
- hooklist = g_slist_prepend (hooklist, pair);
- g_hash_table_insert (obj->event_to_hooklist, g_strdup (name),
- hooklist);
-}
-
-void
-camel_object_unhook_event (CamelObject * obj, const gchar * name,
- CamelObjectEventHookFunc hook, gpointer user_data)
-{
- GSList *hooklist;
- GSList *head;
-
- g_return_if_fail (CAMEL_IS_OBJECT (obj));
- g_return_if_fail (name);
- g_return_if_fail (hook);
-
- if (obj->event_to_hooklist == NULL) {
- g_warning
- ("camel_object_unhook_event: trying to unhook `%s' from an instance "
- "of `%s' with no hooks attached", name,
- camel_type_to_name (obj->s.type));
- return;
- }
-
- hooklist = g_hash_table_lookup (obj->event_to_hooklist, name);
-
- if (hooklist == NULL) {
- g_warning
- ("camel_object_unhook_event: trying to unhook `%s' from an instance "
- "of `%s' with no hooks attached to that event.",
- name, camel_type_to_name (obj->s.type));
- return;
- }
-
- head = hooklist;
-
- while (hooklist) {
- CamelHookPair *pair = (CamelHookPair *) hooklist->data;
-
- if (pair->func == hook && pair->user_data == user_data) {
- g_free (hooklist->data);
- head = g_slist_remove_link (head, hooklist);
- g_slist_free_1 (hooklist);
- g_hash_table_insert (obj->event_to_hooklist, (char *) name,
- head);
- return;
- }
-
- hooklist = hooklist->next;
- }
-
- g_warning
- ("camel_object_unhook_event: cannot find hook/data pair %p/%p in an "
- "instance of `%s' attached to `%s'", hook, user_data,
- camel_type_to_name (obj->s.type), name);
-}
-
-void
-camel_object_trigger_event (CamelObject * obj, const gchar * name,
- gpointer event_data)
-{
- GSList *hooklist;
- CamelHookPair *pair;
- CamelObjectEventPrepFunc prep;
-
- g_return_if_fail (CAMEL_IS_OBJECT (obj));
- g_return_if_fail (name);
-
- if (obj->in_event) {
- g_warning
- ("camel_object_trigger_event: trying to trigger `%s' in class "
- "`%s' while already triggering another event", name,
- camel_type_to_name (obj->s.type));
- return;
- }
-
- if (obj->classfuncs->event_to_preplist == NULL) {
- g_warning
- ("camel_object_trigger_event: trying to trigger `%s' in class "
- "`%s' with no defined events.", name,
- camel_type_to_name (obj->s.type));
- return;
- }
-
- prep = g_hash_table_lookup (obj->classfuncs->event_to_preplist, name);
-
- if (prep == NULL) {
- g_warning
- ("camel_object_trigger_event: trying to trigger undefined "
- "event `%s' in class `%s'.", name,
- camel_type_to_name (obj->s.type));
- return;
- }
-
- /* Ref so that it can't get destroyed in the event, which would
- * be Bad. And it's a valid ref anyway...
- */
-
- camel_object_ref (obj);
- obj->in_event = 1;
-
- if ((prep != NULL_PREP_VALUE && !prep (obj, event_data))
- || obj->event_to_hooklist == NULL) {
- obj->in_event = 0;
- camel_object_unref (obj);
- return;
- }
-
- hooklist = g_hash_table_lookup (obj->event_to_hooklist, name);
-
- while (hooklist && hooklist->data) {
- pair = hooklist->data;
- (pair->func) (obj, event_data, pair->user_data);
- hooklist = hooklist->next;
- }
-
- obj->in_event = 0;
- camel_object_unref (obj);
-}
-
-/* ** Static helpers ****************************************************** */
-
-static gboolean
-shared_is_of_type (CamelObjectShared * sh, CamelType ctype, gboolean is_obj)
-{
- CamelTypeInfo *type_info;
- gchar *targtype;
-
- if (is_obj)
- targtype = "instance";
- else
- targtype = "classdata";
-
- if (ctype == CAMEL_INVALID_TYPE) {
- g_warning
- ("shared_is_of_type: trying to cast to CAMEL_INVALID_TYPE");
- return FALSE;
- }
-
- if (sh == NULL) {
- g_warning
- ("shared_is_of_type: trying to cast NULL to %s of `%s'",
- targtype, camel_type_to_name (ctype));
- return FALSE;
- }
-
- if (sh->magic == CAMEL_OBJECT_FINALIZED_VALUE) {
- g_warning
- ("shared_is_of_type: trying to cast finalized instance "
- "of `%s' into %s of `%s'",
- camel_type_to_name (sh->type), targtype,
- camel_type_to_name (ctype));
- return FALSE;
- }
-
- if (sh->magic == CAMEL_OBJECT_CLASS_FINALIZED_VALUE) {
- g_warning
- ("shared_is_of_type: trying to cast finalized classdata "
- "of `%s' into %s of `%s'",
- camel_type_to_name (sh->type), targtype,
- camel_type_to_name (ctype));
- return FALSE;
- }
-
- if (is_obj) {
- if (sh->magic == CAMEL_OBJECT_CLASS_MAGIC_VALUE) {
- g_warning
- ("shared_is_of_type: trying to cast classdata "
- "of `%s' into instance of `%s'",
- camel_type_to_name (sh->type),
- camel_type_to_name (ctype));
- return FALSE;
- }
-
- if (sh->magic != CAMEL_OBJECT_MAGIC_VALUE) {
- g_warning
- ("shared_is_of_type: trying to cast junk data "
- "into instance of `%s'",
- camel_type_to_name (ctype));
- return FALSE;
- }
- } else {
- if (sh->magic == CAMEL_OBJECT_MAGIC_VALUE) {
- g_warning
- ("shared_is_of_type: trying to cast instance "
- "of `%s' into classdata of `%s'",
- camel_type_to_name (sh->type),
- camel_type_to_name (ctype));
- return FALSE;
- }
-
- if (sh->magic != CAMEL_OBJECT_CLASS_MAGIC_VALUE) {
- g_warning
- ("shared_is_of_type: trying to cast junk data "
- "into classdata of `%s'",
- camel_type_to_name (ctype));
- return FALSE;
- }
- }
-
- camel_type_lock_up ();
-
- type_info =
- g_hash_table_lookup (ctype_to_typeinfo,
- GINT_TO_POINTER (sh->type));
-
- if (type_info == NULL) {
- g_warning ("shared_is_of_type: seemingly valid %s has "
- "bad type %d.", targtype, sh->type);
- camel_type_lock_down ();
- return FALSE;
- }
-
- while (type_info) {
- if (type_info->self == ctype) {
- camel_type_lock_down ();
- return TRUE;
- }
-
- type_info =
- g_hash_table_lookup (ctype_to_typeinfo,
- GINT_TO_POINTER (type_info->
- parent));
- }
-
- g_warning
- ("shared_is_of_type: %s of `%s' (@%p) is not also %s of `%s'",
- targtype, camel_type_to_name (sh->type), sh, targtype,
- camel_type_to_name (ctype));
-
- camel_type_lock_down ();
- return FALSE;
-}
-
-static void
-make_global_classfuncs (CamelTypeInfo * type_info)
-{
- CamelObjectClass *funcs;
- GSList *parents;
- GSList *head;
-
- g_assert (type_info);
-
- funcs = g_malloc0 (type_info->classfuncs_size);
- funcs->s.type = type_info->self;
-
- type_info->global_classfuncs = funcs;
-
- parents = NULL;
- while (type_info) {
- parents = g_slist_prepend (parents, type_info);
- type_info =
- g_hash_table_lookup (ctype_to_typeinfo,
- GINT_TO_POINTER (type_info->
- parent));
- }
-
- head = parents;
-
- for (; parents && parents->data; parents = parents->next) {
- CamelTypeInfo *thisinfo;
-
- thisinfo = parents->data;
- if (thisinfo->class_init)
- (thisinfo->class_init) (funcs);
- }
-
- g_slist_free (head);
-}
diff --git a/camel/camel-object.h b/camel/camel-object.h
deleted file mode 100644
index fdcf7b4a15..0000000000
--- a/camel/camel-object.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-object.h: Base class for Camel */
-
-/*
- * Author:
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_OBJECT_H
-#define CAMEL_OBJECT_H 1
-
-#ifdef __cplusplus
-extern "C"
-{
-#pragma }
-#endif /* __cplusplus } */
-
-#include <stdlib.h> /* size_t */
-#include <camel/camel-types.h>
-#include <glib.h>
-
-#ifdef G_DISABLE_CHECKS
-#define CAMEL_CHECK_CAST( obj, ctype, ptype ) ((ptype *) obj)
-#define CAMEL_CHECK_CLASS_CAST( class, ctype, ptype ) ((ptype *) class)
-#define CAMEL_CHECK_TYPE( obj, ctype ) (TRUE)
-#define CAMEL_CHECK_CLASS_TYPE( class, ctype ) (TRUE)
-#else
-#define CAMEL_CHECK_CAST( obj, ctype, ptype ) ((ptype *) camel_object_check_cast( (CamelObject *)(obj), (CamelType)(ctype) ))
-#define CAMEL_CHECK_CLASS_CAST( class, ctype, ptype ) ((ptype *) camel_object_class_check_cast( (CamelObjectClass *)(class), (CamelType)(ctype) ))
-#define CAMEL_CHECK_TYPE( obj, ctype ) (camel_object_is_of_type( (CamelObject *)(obj), (CamelType)(ctype) ))
-#define CAMEL_CHECK_CLASS_TYPE( class, ctype ) (camel_object_class_is_of_type( (CamelObjectClass *)(class), (CamelType)(ctype) ))
-#endif
-
-#define CAMEL_INVALID_TYPE ((CamelType)0)
-
-#define CAMEL_OBJECT_TYPE (camel_object_get_type ())
-
-#define CAMEL_OBJECT(obj) (CAMEL_CHECK_CAST((obj), CAMEL_OBJECT_TYPE, CamelObject))
-#define CAMEL_OBJECT_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_OBJECT_TYPE, CamelObjectClass))
-#define CAMEL_IS_OBJECT(o) (CAMEL_CHECK_TYPE((o), CAMEL_OBJECT_TYPE))
-#define CAMEL_IS_OBJECT_CLASS(k) (CAMEL_CHECK_CLASS_TYPE((k), CAMEL_OBJECT_TYPE))
-
-#define CAMEL_OBJECT_GET_CLASS(o) ((CamelObjectClass *)(CAMEL_OBJECT(o))->classfuncs)
-#define CAMEL_OBJECT_GET_TYPE(o) ((CamelType)(CAMEL_OBJECT(o))->s.type)
-
- typedef guint32 CamelType;
-
- typedef struct _CamelObjectShared
- {
- guint32 magic;
- CamelType type;
- }
- CamelObjectShared;
-
- typedef struct _CamelObjectClass
- {
- CamelObjectShared s;
-
- GHashTable *event_to_preplist;
- }
- CamelObjectClass;
-
- typedef struct _CamelObject
- {
- CamelObjectShared s;
- guint32 ref_count:31;
- guint32 in_event:1;
- CamelObjectClass *classfuncs;
- GHashTable *event_to_hooklist;
- }
- CamelObject;
-
- typedef void (*CamelObjectClassInitFunc) (CamelObjectClass *);
- typedef void (*CamelObjectClassFinalizeFunc) (CamelObjectClass *);
- typedef void (*CamelObjectInitFunc) (CamelObject *);
- typedef void (*CamelObjectFinalizeFunc) (CamelObject *);
-
- typedef gboolean (*CamelObjectEventPrepFunc) (CamelObject *,
- gpointer);
- typedef void (*CamelObjectEventHookFunc) (CamelObject *, gpointer,
- gpointer);
-
-/* The type system .... it's pretty simple..... */
-
- void camel_type_init (void);
- CamelType camel_type_register (CamelType parent, const gchar * name,
- size_t instance_size,
- size_t classfuncs_size,
- CamelObjectClassInitFunc class_init,
- CamelObjectClassFinalizeFunc
- class_finalize,
- CamelObjectInitFunc instance_init,
- CamelObjectFinalizeFunc
- instance_finalize);
- CamelObjectClass *camel_type_get_global_classfuncs (CamelType type);
- const gchar *camel_type_to_name (CamelType type);
-
- CamelType camel_object_get_type (void);
- CamelObject *camel_object_new (CamelType type);
- void camel_object_ref (CamelObject * obj);
- void camel_object_unref (CamelObject * obj);
- CamelObject *camel_object_check_cast (CamelObject * obj,
- CamelType ctype);
- CamelObjectClass *camel_object_class_check_cast (CamelObjectClass *
- class,
- CamelType ctype);
- gboolean camel_object_is_of_type (CamelObject * obj, CamelType ctype);
- gboolean camel_object_class_is_of_type (CamelObjectClass * class,
- CamelType ctype);
- gchar *camel_object_describe (CamelObject * obj);
- void camel_object_class_declare_event (CamelObjectClass * class,
- const gchar * name,
- CamelObjectEventPrepFunc prep);
- void camel_object_hook_event (CamelObject * obj, const gchar * name,
- CamelObjectEventHookFunc hook,
- gpointer user_data);
- void camel_object_unhook_event (CamelObject * obj, const gchar * name,
- CamelObjectEventHookFunc hook,
- gpointer user_data);
- void camel_object_trigger_event (CamelObject * obj,
- const gchar * name,
- gpointer event_data);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_OBJECT_H */
diff --git a/camel/camel-op-queue.c b/camel/camel-op-queue.c
deleted file mode 100644
index 3e17222f0a..0000000000
--- a/camel/camel-op-queue.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-
-/* MT safe */
-
-
-#include <config.h>
-#include "camel-op-queue.h"
-
-static GStaticMutex op_queue_mutex = G_STATIC_MUTEX_INIT;
-
-
-
-/**
- * camel_op_queue_new: create a new operation queue
- *
- * Create a new operation queue.
- *
- * Return value: the newly allcated object
- **/
-CamelOpQueue *
-camel_op_queue_new ()
-{
- CamelOpQueue *op_queue;
-
- op_queue = g_new (CamelOpQueue, 1);
- op_queue->ops_tail = NULL;
- op_queue->ops_head = NULL;
- op_queue->service_available = TRUE;
-
- return op_queue;
-}
-
-
-void
-camel_op_queue_free (CamelOpQueue *op_queue)
-{
- g_list_free (op_queue->ops_head);
- g_free (op_queue);
-}
-
-/**
- * camel_op_queue_push_op: Add an operation to the queue
- * @queue: queue object
- * @op: operation to add
- *
- * Add an operation to an operation queue.
- * The queue is a FIFO queue.
- **/
-void
-camel_op_queue_push_op (CamelOpQueue *queue, CamelOp *op)
-{
- g_assert (queue);
- g_static_mutex_lock (&op_queue_mutex);
- if (!queue->ops_tail) {
- queue->ops_head = g_list_prepend (NULL, op);
- queue->ops_tail = queue->ops_head;
- } else
- queue->ops_head = g_list_prepend (queue->ops_head, op);
- g_static_mutex_unlock (&op_queue_mutex);
-}
-
-
-/**
- * camel_op_queue_pop_op: Pop the next operation pending in the queue
- * @queue: queue object
- *
- * Pop the next operation pending in the queue.
- *
- * Return value:
- **/
-CamelOp *
-camel_op_queue_pop_op (CamelOpQueue *queue)
-{
- GList *op_list;
- CamelOp *op;
-
- g_assert (queue);
-
- g_static_mutex_lock (&op_queue_mutex);
- op_list = queue->ops_tail;
- if (!op_list) return NULL;
-
- queue->ops_tail = queue->ops_tail->prev;
- op = (CamelOp *)op_list->data;
- g_static_mutex_unlock (&op_queue_mutex);
-
- return op;
-}
-
-
-/**
- * camel_op_queue_run_next_op: run the next pending operation
- * @queue: queue object
- *
- * Run the next pending operation in the queue.
- *
- * Return value: TRUE if an operation was launched FALSE if there was no operation pending in the queue.
- **/
-gboolean
-camel_op_queue_run_next_op (CamelOpQueue *queue)
-{
- CamelOp *op;
-
- op = camel_op_queue_pop_op (queue);
- if (!op) return FALSE;
-
- return FALSE;
-}
-
-/**
- * camel_op_queue_set_service_availability: set the service availability for an operation queue
- * @queue: queue object
- * @available: availability flag
- *
- * set the service availability
- **/
-void
-camel_op_queue_set_service_availability (CamelOpQueue *queue, gboolean available)
-{
- g_static_mutex_lock (&op_queue_mutex);
- queue->service_available = available;
- g_static_mutex_unlock (&op_queue_mutex);
-}
-
-/**
- * camel_op_queue_get_service_availability: determine if an operation queue service is available
- * @queue: queue object
- *
- * Determine if the service associated to an operation queue is available.
- *
- * Return value: service availability.
- **/
-gboolean
-camel_op_queue_get_service_availability (CamelOpQueue *queue)
-{
- gboolean available;
-
- g_static_mutex_lock (&op_queue_mutex);
- available = queue->service_available;
- g_static_mutex_unlock (&op_queue_mutex);
- return available;
-}
-
diff --git a/camel/camel-op-queue.h b/camel/camel-op-queue.h
deleted file mode 100644
index 49fdc152d3..0000000000
--- a/camel/camel-op-queue.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_OP_QUEUE_H
-#define CAMEL_OP_QUEUE_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <glib.h>
-#include <camel/camel-marshal-utils.h>
-
-
-
-typedef struct
-{
- GList *ops_head;
- GList *ops_tail;
- gboolean service_available;
-
-} CamelOpQueue;
-
-
-/* public methods */
-CamelOpQueue *camel_op_queue_new ();
-void camel_op_queue_free (CamelOpQueue *op_queue);
-void camel_op_queue_push_op (CamelOpQueue *queue, CamelOp *op);
-CamelOp *camel_op_queue_pop_op (CamelOpQueue *queue);
-gboolean camel_op_queue_run_next_op (CamelOpQueue *queue);
-gboolean camel_op_queue_get_service_availability (CamelOpQueue *queue);
-void camel_op_queue_set_service_availability (CamelOpQueue *queue, gboolean available);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_OP_QUEUE_H */
-
diff --git a/camel/camel-provider.c b/camel/camel-provider.c
deleted file mode 100644
index 9b76fc1766..0000000000
--- a/camel/camel-provider.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-provider.c: provider framework */
-
-/*
- *
- * Authors:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- * Dan Winship <danw@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-
-/* FIXME: Shouldn't we add a version number to providers ? */
-
-#include "config.h"
-#include "camel-provider.h"
-#include "camel-exception.h"
-#include "hash-table-utils.h"
-
-#include <dirent.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <gmodule.h>
-
-char *camel_provider_type_name[CAMEL_NUM_PROVIDER_TYPES] = {
- "store",
- "transport"
-};
-
-/**
- * camel_provider_init:
- *
- * Initialize the Camel provider system by reading in the .urls
- * files in the provider directory and creating a hash table mapping
- * URLs to module names.
- *
- * A .urls file has the same initial prefix as the shared library it
- * correspond to, and consists of a series of lines containing the URL
- * protocols that that library handles.
- *
- * Return value: a hash table mapping URLs to module names
- **/
-GHashTable *
-camel_provider_init (void)
-{
- GHashTable *providers;
- DIR *dir;
- struct dirent *d;
- char *p, *name, buf[80];
- FILE *f;
-
- providers = g_hash_table_new (g_strcase_hash, g_strcase_equal);
-
- dir = opendir (CAMEL_PROVIDERDIR);
- if (!dir) {
- g_error ("Could not open camel provider directory: %s",
- g_strerror (errno));
- return NULL;
- }
-
- while ((d = readdir (dir))) {
- p = strchr (d->d_name, '.');
- if (!p || strcmp (p, ".urls") != 0)
- continue;
-
- name = g_strdup_printf ("%s/%s", CAMEL_PROVIDERDIR, d->d_name);
- f = fopen (name, "r");
- if (!f) {
- g_warning ("Could not read provider info file %s: %s",
- name, g_strerror (errno));
- g_free (name);
- continue;
- }
-
- p = strrchr (name, '.');
- strcpy (p, ".so");
- while ((fgets (buf, sizeof (buf), f))) {
- buf[sizeof (buf) - 1] = '\0';
- p = strchr (buf, '\n');
- if (p)
- *p = '\0';
-
- g_hash_table_insert (providers, g_strdup (buf), name);
- }
- fclose (f);
- }
-
- closedir (dir);
- return providers;
-}
-
-/**
- * camel_provider_load:
- * @session: the current session
- * @path: the path to a shared library
- * @ex: a CamelException
- *
- * Loads the provider at @path, and calls its initialization function,
- * passing @session as an argument. The provider should then register
- * itself with @session.
- **/
-void
-camel_provider_load (CamelSession *session, const char *path, CamelException *ex)
-{
- GModule *module;
- CamelProvider *(*camel_provider_module_init) ();
-
- if (!g_module_supported ()) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not load %s: Module loading "
- "not supported on this system.",
- path);
- return;
- }
-
- module = g_module_open (path, 0);
- if (!module) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not load %s: %s",
- path, g_module_error ());
- return;
- }
-
- if (!g_module_symbol (module, "camel_provider_module_init",
- (gpointer *)&camel_provider_module_init)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not load %s: No initialization "
- "routine in module.", path);
- g_module_close (module);
- return;
- }
-
- camel_provider_module_init (session);
-}
diff --git a/camel/camel-provider.h b/camel/camel-provider.h
deleted file mode 100644
index 00375029db..0000000000
--- a/camel/camel-provider.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-provider.h : provider definition */
-
-/*
- *
- * Authors:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_PROVIDER_H
-#define CAMEL_PROVIDER_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-types.h>
-#include <camel/camel-object.h>
-
-#define CAMEL_PROVIDER(obj) ((CamelProvider *)(obj))
-
-typedef enum {
- CAMEL_PROVIDER_STORE,
- CAMEL_PROVIDER_TRANSPORT,
- CAMEL_NUM_PROVIDER_TYPES
-} CamelProviderType;
-
-extern char *camel_provider_type_name[CAMEL_NUM_PROVIDER_TYPES];
-
-/* _IS_SOURCE means the user can get mail from there.
- * _IS_STORAGE means the user can read mail from there.
- */
-#define CAMEL_PROVIDER_IS_REMOTE (1 << 0)
-#define CAMEL_PROVIDER_IS_SOURCE (1 << 1)
-#define CAMEL_PROVIDER_IS_STORAGE (1 << 2)
-
-typedef struct {
- /* Provider name used in CamelURLs. */
- char *protocol;
-
- /* Provider name as used by people. (May be the same as protocol) */
- char *name;
-
- /* Description of the provider. A novice user should be able
- * to read this description, and the information provided by
- * an ISP, IS department, etc, and determine whether or not
- * this provider is relevant to him, and if so, which
- * information goes with it.
- */
- char *description;
-
- /* The category of message that this provider works with.
- * (evolution-mail will only list a provider in the store/transport
- * config dialogs if its domain is "mail".)
- */
- char *domain;
-
- int flags;
-
- CamelType object_types [CAMEL_NUM_PROVIDER_TYPES];
-
- GHashTable *service_cache;
-
-} CamelProvider;
-
-GHashTable *camel_provider_init (void);
-void camel_provider_load (CamelSession *session, const char *path, CamelException *ex);
-
-/* This is defined by each module, not by camel-provider.c. */
-void camel_provider_module_init (CamelSession *session);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_PROVIDER_H */
diff --git a/camel/camel-seekable-stream.c b/camel/camel-seekable-stream.c
deleted file mode 100644
index c4ca950baa..0000000000
--- a/camel/camel-seekable-stream.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-
-#include <config.h>
-#include "camel-seekable-stream.h"
-
-static CamelStreamClass *parent_class = NULL;
-
-/* Returns the class for a CamelSeekableStream */
-#define CSS_CLASS(so) CAMEL_SEEKABLE_STREAM_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static off_t seek (CamelSeekableStream *stream, off_t offset,
- CamelStreamSeekPolicy policy);
-static off_t stream_tell (CamelSeekableStream *stream);
-static int reset (CamelStream *stream);
-static int set_bounds (CamelSeekableStream *stream, off_t start, off_t end);
-
-static void
-camel_seekable_stream_class_init (CamelSeekableStreamClass *camel_seekable_stream_class)
-{
- CamelStreamClass *camel_stream_class =
- CAMEL_STREAM_CLASS (camel_seekable_stream_class);
-
- parent_class = CAMEL_STREAM_CLASS( camel_type_get_global_classfuncs( CAMEL_STREAM_TYPE ) );
-
- /* seekable stream methods */
- camel_seekable_stream_class->seek = seek;
- camel_seekable_stream_class->tell = stream_tell;
- camel_seekable_stream_class->set_bounds = set_bounds;
-
- /* camel stream methods overload */
- camel_stream_class->reset = reset;
-}
-
-static void
-camel_seekable_stream_init (void *o)
-{
- CamelSeekableStream *stream = (CamelSeekableStream *)o;
-
- stream->bound_start = 0;
- stream->bound_end = CAMEL_STREAM_UNBOUND;
-}
-
-CamelType
-camel_seekable_stream_get_type (void)
-{
- static CamelType camel_seekable_stream_type = CAMEL_INVALID_TYPE;
-
- if (camel_seekable_stream_type == CAMEL_INVALID_TYPE) {
- camel_seekable_stream_type = camel_type_register( CAMEL_STREAM_TYPE,
- "CamelSeekableStream",
- sizeof( CamelSeekableStream ),
- sizeof( CamelSeekableStreamClass ),
- (CamelObjectClassInitFunc) camel_seekable_stream_class_init,
- NULL,
- (CamelObjectInitFunc) camel_seekable_stream_init,
- NULL );
- }
-
- return camel_seekable_stream_type;
-}
-
-
-static off_t
-seek (CamelSeekableStream *stream, off_t offset,
- CamelStreamSeekPolicy policy)
-{
- g_warning ("CamelSeekableStream::seek called on default "
- "implementation\n");
- return -1;
-}
-
-/**
- * camel_stream_seek:
- * @stream: a CamelStream object.
- * @offset: offset value
- * @policy: what to do with the offset
- *
- * Seek to the specified position in @stream.
- *
- * If @policy is CAMEL_STREAM_SET, seeks to @offset.
- *
- * If @policy is CAMEL_STREAM_CUR, seeks to the current position plus
- * @offset.
- *
- * If @policy is CAMEL_STREAM_END, seeks to the end of the stream plus
- * @offset.
- *
- * Regardless of @policy, the stream's final position will be clamped
- * to the range specified by its lower and upper bounds, and the
- * stream's eos state will be updated.
- *
- * Return value: new position, -1 if operation failed.
- **/
-off_t
-camel_seekable_stream_seek (CamelSeekableStream *stream, off_t offset,
- CamelStreamSeekPolicy policy)
-{
- g_return_val_if_fail (CAMEL_IS_SEEKABLE_STREAM (stream), -1);
-
- return CSS_CLASS (stream)->seek (stream, offset, policy);
-}
-
-
-static off_t
-stream_tell (CamelSeekableStream *stream)
-{
- return stream->position;
-}
-
-/**
- * camel_seekable_stream_tell:
- * @stream: seekable stream object
- *
- * Get the current position of a seekable stream.
- *
- * Return value: the position.
- **/
-off_t
-camel_seekable_stream_tell (CamelSeekableStream *stream)
-{
- g_return_val_if_fail (CAMEL_IS_SEEKABLE_STREAM (stream), -1);
-
- return CSS_CLASS (stream)->tell (stream);
-}
-
-static int
-set_bounds (CamelSeekableStream *stream, off_t start, off_t end)
-{
- /* store the bounds */
- stream->bound_start = start;
- stream->bound_end = end;
-
- if (start > stream->position)
- return camel_seekable_stream_seek (stream, start, CAMEL_STREAM_SET);
-
- return 0;
-}
-
-/**
- * camel_seekable_stream_set_bounds:
- * @stream: a seekable stream
- * @start: the first valid position
- * @end: the first invalid position, or CAMEL_STREAM_UNBOUND
- *
- * Set the range of valid data this stream is allowed to cover. If
- * there is to be no @end value, then @end should be set to
- * #CAMEL_STREAM_UNBOUND.
- *
- * Return value: -1 on error.
- **/
-int
-camel_seekable_stream_set_bounds (CamelSeekableStream *stream,
- off_t start, off_t end)
-{
- g_return_val_if_fail (CAMEL_IS_SEEKABLE_STREAM (stream), -1);
- g_return_val_if_fail (end == CAMEL_STREAM_UNBOUND || end >= start, -1);
-
- return CSS_CLASS (stream)->set_bounds (stream, start, end);
-}
-
-/* a default implementation of reset for seekable streams */
-static int
-reset (CamelStream *stream)
-{
- CamelSeekableStream *seekable_stream;
-
- seekable_stream = CAMEL_SEEKABLE_STREAM (stream);
-
- return camel_seekable_stream_seek (seekable_stream,
- seekable_stream->bound_start,
- CAMEL_STREAM_SET);
-}
-
-
-
-
-
-
diff --git a/camel/camel-seekable-stream.h b/camel/camel-seekable-stream.h
deleted file mode 100644
index 0fc67d59f8..0000000000
--- a/camel/camel-seekable-stream.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-stream-fs.h :stream based on unix filesystem */
-
-/*
- * Author:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_SEEKABLE_STREAM_H
-#define CAMEL_SEEKABLE_STREAM_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-stream.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#define CAMEL_SEEKABLE_STREAM_TYPE (camel_seekable_stream_get_type ())
-#define CAMEL_SEEKABLE_STREAM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SEEKABLE_STREAM_TYPE, CamelSeekableStream))
-#define CAMEL_SEEKABLE_STREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SEEKABLE_STREAM_TYPE, CamelSeekableStreamClass))
-#define CAMEL_IS_SEEKABLE_STREAM(o) (CAMEL_CHECK_TYPE((o), CAMEL_SEEKABLE_STREAM_TYPE))
-
-
-typedef enum
-{
- CAMEL_STREAM_SET = SEEK_SET,
- CAMEL_STREAM_CUR = SEEK_CUR,
- CAMEL_STREAM_END = SEEK_END
-} CamelStreamSeekPolicy;
-
-#define CAMEL_STREAM_UNBOUND (~0)
-
-struct _CamelSeekableStream
-{
- CamelStream parent_object;
-
- off_t position; /* current postion in the stream */
- off_t bound_start; /* first valid position */
- off_t bound_end; /* first invalid position */
-};
-
-typedef struct {
- CamelStreamClass parent_class;
-
- /* Virtual methods */
- off_t (*seek) (CamelSeekableStream *stream, off_t offset,
- CamelStreamSeekPolicy policy);
- off_t (*tell) (CamelSeekableStream *stream);
- int (*set_bounds) (CamelSeekableStream *stream,
- off_t start, off_t end);
-} CamelSeekableStreamClass;
-
-/* Standard Camel function */
-CamelType camel_seekable_stream_get_type (void);
-
-/* public methods */
-off_t camel_seekable_stream_seek (CamelSeekableStream *stream, off_t offset,
- CamelStreamSeekPolicy policy);
-off_t camel_seekable_stream_tell (CamelSeekableStream *stream);
-int camel_seekable_stream_set_bounds (CamelSeekableStream *, off_t start, off_t end);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_SEEKABLE_STREAM_H */
diff --git a/camel/camel-seekable-substream.c b/camel/camel-seekable-substream.c
deleted file mode 100644
index d62fc3bba4..0000000000
--- a/camel/camel-seekable-substream.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-stream-fs.c : file system based stream
- *
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-#include <config.h>
-#include "camel-seekable-substream.h"
-
-static CamelSeekableStreamClass *parent_class = NULL;
-
-/* Returns the class for a CamelSeekableSubStream */
-#define CSS_CLASS(so) CAMEL_SEEKABLE_SUBSTREAM_CLASS (CAMEL_OBJECT(so)->klass)
-
-static int stream_read (CamelStream *stream, char *buffer, unsigned int n);
-static int stream_write (CamelStream *stream, const char *buffer, unsigned int n);
-static int stream_flush (CamelStream *stream);
-static int stream_close (CamelStream *stream);
-static gboolean eos (CamelStream *stream);
-static off_t stream_seek (CamelSeekableStream *stream, off_t offset,
- CamelStreamSeekPolicy policy);
-
-static void
-camel_seekable_substream_class_init (CamelSeekableSubstreamClass *camel_seekable_substream_class)
-{
- CamelSeekableStreamClass *camel_seekable_stream_class =
- CAMEL_SEEKABLE_STREAM_CLASS (camel_seekable_substream_class);
- CamelStreamClass *camel_stream_class =
- CAMEL_STREAM_CLASS (camel_seekable_substream_class);
-
- parent_class = CAMEL_SEEKABLE_STREAM_CLASS (camel_type_get_global_classfuncs (camel_seekable_stream_get_type ()));
-
- /* virtual method definition */
-
- /* virtual method overload */
- camel_stream_class->read = stream_read;
- camel_stream_class->write = stream_write;
- camel_stream_class->flush = stream_flush;
- camel_stream_class->close = stream_close;
- camel_stream_class->eos = eos;
-
- camel_seekable_stream_class->seek = stream_seek;
-
-}
-
-static void
-camel_seekable_substream_finalize (CamelObject *object)
-{
- CamelSeekableSubstream *seekable_substream =
- CAMEL_SEEKABLE_SUBSTREAM (object);
-
- if (seekable_substream->parent_stream)
- camel_object_unref (CAMEL_OBJECT (seekable_substream->parent_stream));
-}
-
-
-CamelType
-camel_seekable_substream_get_type (void)
-{
- static CamelType camel_seekable_substream_type = CAMEL_INVALID_TYPE;
-
- if (camel_seekable_substream_type == CAMEL_INVALID_TYPE) {
- camel_seekable_substream_type = camel_type_register (camel_seekable_stream_get_type (), "CamelSeekableSubstream",
- sizeof (CamelSeekableSubstream),
- sizeof (CamelSeekableSubstreamClass),
- (CamelObjectClassInitFunc) camel_seekable_substream_class_init,
- NULL,
- NULL,
- (CamelObjectFinalizeFunc) camel_seekable_substream_finalize);
- }
-
- return camel_seekable_substream_type;
-}
-
-/**
- * camel_seekable_substream_new_with_seekable_stream_and_bounds:
- * @parent_stream: a seekable parent stream
- * @inf_bound: a lower bound
- * @sup_bound: an upper bound
- *
- * Creates a new CamelSeekableSubstream that references the portion
- * of @parent_stream from @inf_bound to @sup_bound. (If @sup_bound is
- * #CAMEL_STREAM_UNBOUND, it references to the end of stream, even if
- * the stream grows.)
- *
- * While the substream is open, the caller cannot assume anything about
- * the current position of @parent_stream. After the substream has been
- * closed, @parent_stream will stabilize again.
- *
- * Return value: the substream
- **/
-CamelStream *
-camel_seekable_substream_new_with_seekable_stream_and_bounds (CamelSeekableStream *parent_stream,
- off_t start, off_t end)
-{
- CamelSeekableSubstream *seekable_substream;
-
- g_return_val_if_fail (CAMEL_IS_SEEKABLE_STREAM (parent_stream), NULL);
-
- /* Create the seekable substream. */
- seekable_substream = CAMEL_SEEKABLE_SUBSTREAM (camel_object_new (camel_seekable_substream_get_type ()));
-
- /* Initialize it. */
- seekable_substream->parent_stream = parent_stream;
- camel_object_ref (CAMEL_OBJECT (parent_stream));
-
- /* Set the bound of the substream. We can ignore any possible error
- * here, because if we fail to seek now, it will try again later.
- */
- camel_seekable_stream_set_bounds ((CamelSeekableStream *)seekable_substream, start, end);
-
- return CAMEL_STREAM (seekable_substream);
-}
-
-static gboolean
-parent_reset (CamelSeekableSubstream *seekable_substream, CamelSeekableStream *parent)
-{
- CamelSeekableStream *seekable_stream =
- CAMEL_SEEKABLE_STREAM (seekable_substream);
-
- if (camel_seekable_stream_tell (parent) == seekable_stream->position)
- return TRUE;
-
- return camel_seekable_stream_seek (parent, seekable_stream->position, CAMEL_STREAM_SET)
- == seekable_stream->position;
-}
-
-static int
-stream_read (CamelStream *stream, char *buffer, unsigned int n)
-{
- CamelSeekableStream *parent;
- CamelSeekableStream *seekable_stream = CAMEL_SEEKABLE_STREAM (stream);
- CamelSeekableSubstream *seekable_substream =
- CAMEL_SEEKABLE_SUBSTREAM (stream);
- int v;
-
- if (n == 0)
- return 0;
-
- parent = seekable_substream->parent_stream;
-
- /* Go to our position in the parent stream. */
- if (!parent_reset (seekable_substream, parent)) {
- stream->eos = TRUE;
- return 0;
- }
-
- /* Compute how many bytes should be read. */
- if (seekable_stream->bound_end != CAMEL_STREAM_UNBOUND)
- n = MIN (seekable_stream->bound_end - seekable_stream->position, n);
-
- if (n == 0) {
- stream->eos = TRUE;
- return 0;
- }
-
- v = camel_stream_read (CAMEL_STREAM (parent), buffer, n);
-
- /* ignore <0 - its an error, let the caller deal */
- if (v > 0)
- seekable_stream->position += v;
-
- return v;
-}
-
-static int
-stream_write (CamelStream *stream, const char *buffer, unsigned int n)
-{
- /* NOT VALID ON SEEKABLE SUBSTREAM */
- /* Well, its entirely valid, just not implemented */
- g_warning ("CamelSeekableSubstream:: seekable substream doesn't "
- "have a write method yet?\n");
- return -1;
-}
-
-static int
-stream_flush (CamelStream *stream)
-{
- /* NOT VALID ON SEEKABLE SUBSTREAM */
- g_warning ("CamelSeekableSubstream:: seekable substream doesn't "
- "have a flush method\n");
- return -1;
-}
-
-static int
-stream_close (CamelStream *stream)
-{
- /* we dont really want to close the substream ... */
- return 0;
-}
-
-static gboolean
-eos (CamelStream *stream)
-{
- CamelSeekableSubstream *seekable_substream =
- CAMEL_SEEKABLE_SUBSTREAM (stream);
- CamelSeekableStream *seekable_stream = CAMEL_SEEKABLE_STREAM (stream);
- CamelSeekableStream *parent;
- gboolean eos;
-
- if (stream->eos)
- eos = TRUE;
- else {
- parent = seekable_substream->parent_stream;
- if (!parent_reset (seekable_substream, parent))
- return TRUE;
-
- eos = camel_stream_eos (CAMEL_STREAM (parent));
- if (!eos && (seekable_stream->bound_end != CAMEL_STREAM_UNBOUND)) {
- eos = seekable_stream->position >= seekable_stream->bound_end;
- }
- }
-
- return eos;
-}
-
-static off_t
-stream_seek (CamelSeekableStream *seekable_stream, off_t offset,
- CamelStreamSeekPolicy policy)
-{
- CamelSeekableSubstream *seekable_substream =
- CAMEL_SEEKABLE_SUBSTREAM (seekable_stream);
- CamelStream *stream = CAMEL_STREAM (seekable_stream);
- off_t real_offset = 0;
-
- stream->eos = FALSE;
-
- switch (policy) {
- case CAMEL_STREAM_SET:
- real_offset = offset;
- break;
-
- case CAMEL_STREAM_CUR:
- real_offset = seekable_stream->position + offset;
- break;
-
- case CAMEL_STREAM_END:
- real_offset = camel_seekable_stream_seek (seekable_substream->parent_stream,
- offset,
- CAMEL_STREAM_END);
- if (real_offset == -1)
- return -1;
- break;
- }
-
- if (seekable_stream->bound_end != CAMEL_STREAM_UNBOUND)
- real_offset = MIN (real_offset, seekable_stream->bound_end);
-
- if (real_offset<seekable_stream->bound_start)
- real_offset = seekable_stream->bound_start;
-
- seekable_stream->position = real_offset;
- return real_offset;
-}
diff --git a/camel/camel-seekable-substream.h b/camel/camel-seekable-substream.h
deleted file mode 100644
index 6ac5588a42..0000000000
--- a/camel/camel-seekable-substream.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-seekable-substream.h: stream that piggybacks on another stream */
-
-/*
- * Author:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_SEEKABLE_SUBSTREAM_H
-#define CAMEL_SEEKABLE_SUBSTREAM_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-seekable-stream.h>
-
-#define CAMEL_SEEKABLE_SUBSTREAM_TYPE (camel_seekable_substream_get_type ())
-#define CAMEL_SEEKABLE_SUBSTREAM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SEEKABLE_SUBSTREAM_TYPE, CamelSeekableSubstream))
-#define CAMEL_SEEKABLE_SUBSTREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SEEKABLE_SUBSTREAM_TYPE, CamelSeekableSubstreamClass))
-#define CAMEL_IS_SEEKABLE_SUBSTREAM(o) (CAMEL_CHECK_TYPE((o), CAMEL_SEEKABLE_SUBSTREAM_TYPE))
-
-struct _CamelSeekableSubstream
-{
- CamelSeekableStream parent_object;
-
- /* --**-- Private fields --**-- */
- CamelSeekableStream *parent_stream;
-};
-
-typedef struct {
- CamelSeekableStreamClass parent_class;
-
-} CamelSeekableSubstreamClass;
-
-/* Standard Camel function */
-CamelType camel_seekable_substream_get_type (void);
-
-/* public methods */
-
-/* obtain a new seekable substream */
-CamelStream *
-camel_seekable_substream_new_with_seekable_stream_and_bounds (CamelSeekableStream *parent_stream,
- off_t start, off_t end);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_SEEKABLE_SUBSTREAM_H */
diff --git a/camel/camel-service.c b/camel/camel-service.c
deleted file mode 100644
index 5631b6caf5..0000000000
--- a/camel/camel-service.c
+++ /dev/null
@@ -1,386 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-service.c : Abstract class for an email service */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-#include <config.h>
-#include "camel-service.h"
-#include "camel-session.h"
-#include "camel-exception.h"
-
-#include <ctype.h>
-#include <stdlib.h>
-
-static CamelObjectClass *parent_class = NULL;
-
-/* Returns the class for a CamelService */
-#define CSERV_CLASS(so) CAMEL_SERVICE_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static gboolean service_connect(CamelService *service, CamelException *ex);
-static gboolean service_disconnect(CamelService *service, CamelException *ex);
-static gboolean is_connected (CamelService *service);
-static GList * query_auth_types (CamelService *service, CamelException *ex);
-static void free_auth_types (CamelService *service, GList *authtypes);
-static char * get_name (CamelService *service, gboolean brief);
-static gboolean check_url (CamelService *service, CamelException *ex);
-
-
-static void
-camel_service_class_init (CamelServiceClass *camel_service_class)
-{
- parent_class = camel_type_get_global_classfuncs (CAMEL_OBJECT_TYPE);
-
- /* virtual method definition */
- camel_service_class->connect = service_connect;
- camel_service_class->disconnect = service_disconnect;
- camel_service_class->is_connected = is_connected;
- camel_service_class->query_auth_types = query_auth_types;
- camel_service_class->free_auth_types = free_auth_types;
- camel_service_class->get_name = get_name;
-}
-
-static void
-camel_service_finalize (CamelObject *object)
-{
- CamelService *camel_service = CAMEL_SERVICE (object);
-
- if (camel_service->url)
- camel_url_free (camel_service->url);
- if (camel_service->session)
- camel_object_unref (CAMEL_OBJECT (camel_service->session));
-}
-
-
-
-CamelType
-camel_service_get_type (void)
-{
- static CamelType camel_service_type = CAMEL_INVALID_TYPE;
-
- if (camel_service_type == CAMEL_INVALID_TYPE) {
- camel_service_type = camel_type_register( CAMEL_OBJECT_TYPE, "CamelService",
- sizeof (CamelService),
- sizeof (CamelServiceClass),
- (CamelObjectClassInitFunc) camel_service_class_init,
- NULL,
- NULL,
- camel_service_finalize );
- }
-
- return camel_service_type;
-}
-
-static gboolean
-check_url (CamelService *service, CamelException *ex)
-{
- char *url_string;
-
- if (service->url_flags & CAMEL_SERVICE_URL_NEED_USER &&
- (service->url->user == NULL || service->url->user[0] == '\0')) {
- url_string = camel_url_to_string (service->url, FALSE);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID,
- "URL '%s' needs a username component",
- url_string);
- g_free (url_string);
- return FALSE;
- } else if (service->url_flags & CAMEL_SERVICE_URL_NEED_HOST &&
- (service->url->host == NULL || service->url->host[0] == '\0')) {
- url_string = camel_url_to_string (service->url, FALSE);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID,
- "URL '%s' needs a host component",
- url_string);
- g_free (url_string);
- return FALSE;
- } else if (service->url_flags & CAMEL_SERVICE_URL_NEED_PATH &&
- (service->url->path == NULL || service->url->path[0] == '\0')) {
- url_string = camel_url_to_string (service->url, FALSE);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID,
- "URL '%s' needs a path component",
- url_string);
- g_free (url_string);
- return FALSE;
- }
-
- return TRUE;
-}
-
-/**
- * camel_service_new: create a new CamelService or subtype
- * @type: the CamelType of the class to create
- * @session: the session for the service
- * @url: the default URL for the service (may be NULL)
- * @ex: a CamelException
- *
- * Creates a new CamelService (or one of its subtypes), initialized
- * with the given parameters.
- *
- * Return value: the CamelService, or NULL.
- **/
-CamelService *
-camel_service_new (CamelType type, CamelSession *session, CamelURL *url,
- CamelException *ex)
-{
- CamelService *service;
-
- g_return_val_if_fail (CAMEL_IS_SESSION (session), NULL);
-
- service = CAMEL_SERVICE (camel_object_new (type));
- service->url = url;
- if (!url->empty && !check_url (service, ex)) {
- camel_object_unref (CAMEL_OBJECT (service));
- return NULL;
- }
-
- service->session = session;
- camel_object_ref (CAMEL_OBJECT (session));
-
- return service;
-}
-
-
-static gboolean
-service_connect (CamelService *service, CamelException *ex)
-{
- service->connected = TRUE;
- return TRUE;
-}
-
-/**
- * camel_service_connect:
- * @service: CamelService object
- * @ex: a CamelException
- *
- * Connect to the service using the parameters it was initialized
- * with.
- *
- * Return value: whether or not the connection succeeded
- **/
-gboolean
-camel_service_connect (CamelService *service, CamelException *ex)
-{
- g_return_val_if_fail (CAMEL_IS_SERVICE (service), FALSE);
- g_return_val_if_fail (service->session != NULL, FALSE);
- g_return_val_if_fail (service->url != NULL, FALSE);
-
- return CSERV_CLASS (service)->connect (service, ex);
-}
-
-
-static gboolean
-service_disconnect (CamelService *service, CamelException *ex)
-{
- service->connected = FALSE;
-
- return TRUE;
-}
-
-/**
- * camel_service_disconnect:
- * @service: CamelService object
- * @ex: a CamelException
- *
- * Disconnect from the service.
- *
- * Return value: whether or not the disconnection succeeded without
- * errors. (Consult @ex if %FALSE.)
- **/
-gboolean
-camel_service_disconnect (CamelService *service, CamelException *ex)
-{
- return CSERV_CLASS (service)->disconnect (service, ex);
-}
-
-
-static gboolean
-is_connected (CamelService *service)
-{
- return service->connected;
-}
-
-
-/**
- * camel_service_is_connected:
- * @service: object to test
- *
- * Return value: whether or not the service is connected
- **/
-gboolean
-camel_service_is_connected (CamelService *service)
-{
- return CSERV_CLASS (service)->is_connected (service);
-}
-
-
-/**
- * camel_service_get_url:
- * @service: a service
- *
- * Returns the URL representing a service. The returned URL must be
- * freed when it is no longer needed. For security reasons, this
- * routine does not return the password.
- *
- * Return value: the url name
- **/
-char *
-camel_service_get_url (CamelService *service)
-{
- return camel_url_to_string(service->url, FALSE);
-}
-
-
-static char *
-get_name (CamelService *service, gboolean brief)
-{
- g_warning ("CamelService::get_name not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (service)));
- return "???";
-}
-
-/**
- * camel_service_get_name:
- * @service: the service
- * @brief: whether or not to use a briefer form
- *
- * This gets the name of the service in a "friendly" (suitable for
- * humans) form. If @brief is %TRUE, this should be a brief description
- * such as for use in the folder tree. If @brief is %FALSE, it should
- * be a more complete and mostly unambiguous description.
- *
- * Return value: the description, which the caller must free.
- **/
-char *
-camel_service_get_name (CamelService *service, gboolean brief)
-{
- g_return_val_if_fail (CAMEL_IS_SERVICE (service), NULL);
- g_return_val_if_fail (service->url, NULL);
-
- return CSERV_CLASS (service)->get_name (service, brief);
-}
-
-
-/**
- * camel_service_get_session:
- * @service: a service
- *
- * Returns the CamelSession associated with the service.
- *
- * Return value: the session
- **/
-CamelSession *
-camel_service_get_session (CamelService *service)
-{
- return service->session;
-}
-
-
-GList *
-query_auth_types (CamelService *service, CamelException *ex)
-{
- return NULL;
-}
-
-/**
- * camel_service_query_auth_types:
- * @service: a CamelService
- * @ex: a CamelException
- *
- * This is used by the mail source wizard to get the list of
- * authentication types supported by the protocol, and information
- * about them.
- *
- * This may be called on a service with or without an associated URL.
- * If there is no URL, the routine must return a generic answer. If
- * the service does have a URL, the routine SHOULD connect to the
- * server and query what authentication mechanisms it supports. If
- * it cannot do that for any reason, it should set @ex accordingly.
- *
- * Return value: a list of CamelServiceAuthType records. The caller
- * must free the list by calling camel_service_free_auth_types when
- * it is done.
- **/
-GList *
-camel_service_query_auth_types (CamelService *service, CamelException *ex)
-{
- return CSERV_CLASS (service)->query_auth_types (service, ex);
-}
-
-
-static void
-free_auth_types (CamelService *service, GList *authtypes)
-{
- ;
-}
-
-/**
- * camel_service_free_auth_types:
- * @service: the service
- * @authtypes: the list of authtypes
- *
- * This frees the data allocated by camel_service_query_auth_types().
- **/
-void
-camel_service_free_auth_types (CamelService *service, GList *authtypes)
-{
- CSERV_CLASS (service)->free_auth_types (service, authtypes);
-}
-
-
-/* URL utility routines */
-
-/**
- * camel_service_gethost:
- * @service: a CamelService
- * @ex: a CamelException
- *
- * This is a convenience function to do a gethostbyname on the host
- * for the service's URL.
- *
- * Return value: a (statically-allocated) hostent.
- **/
-struct hostent *
-camel_service_gethost (CamelService *service, CamelException *ex)
-{
- struct hostent *h;
- char *hostname;
-
- if (service->url->host)
- hostname = service->url->host;
- else
- hostname = "localhost";
- h = gethostbyname (hostname);
- if (!h) {
- extern int h_errno;
-
- if (h_errno == HOST_NOT_FOUND || h_errno == NO_DATA) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID,
- "No such host %s.", hostname);
- } else {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Temporarily unable to look up "
- "hostname %s.", hostname);
- }
- return NULL;
- }
-
- return h;
-}
diff --git a/camel/camel-service.h b/camel/camel-service.h
deleted file mode 100644
index 50f0c2d4b4..0000000000
--- a/camel/camel-service.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-service.h : Abstract class for an email service */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_SERVICE_H
-#define CAMEL_SERVICE_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-object.h>
-#include <camel/camel-url.h>
-#include <netdb.h>
-
-#define CAMEL_SERVICE_TYPE (camel_service_get_type ())
-#define CAMEL_SERVICE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SERVICE_TYPE, CamelService))
-#define CAMEL_SERVICE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SERVICE_TYPE, CamelServiceClass))
-#define CAMEL_IS_SERVICE(o) (CAMEL_CHECK_TYPE((o), CAMEL_SERVICE_TYPE))
-
-
-struct _CamelService {
- CamelObject parent_object;
-
- CamelSession *session;
- gboolean connected;
- CamelURL *url;
- int url_flags;
-};
-
-
-typedef struct {
- CamelObjectClass parent_class;
-
- gboolean (*connect) (CamelService *service,
- CamelException *ex);
- gboolean (*disconnect) (CamelService *service,
- CamelException *ex);
-
- gboolean (*is_connected) (CamelService *service);
-
- GList * (*query_auth_types) (CamelService *service,
- CamelException *ex);
- void (*free_auth_types) (CamelService *service,
- GList *authtypes);
-
- char * (*get_name) (CamelService *service,
- gboolean brief);
-
-} CamelServiceClass;
-
-
-
-/* Flags for url_flags. "ALLOW" means the config dialog will let
- * the user configure it. "NEED" implies "ALLOW" but means the user
- * must configure it. Service code can assume that any url part
- * for which it has set the NEED flag will be set when the service
- * is created.
- */
-#define CAMEL_SERVICE_URL_ALLOW_USER (1 << 0)
-#define CAMEL_SERVICE_URL_ALLOW_AUTH (1 << 1)
-#define CAMEL_SERVICE_URL_ALLOW_PASSWORD (1 << 2)
-#define CAMEL_SERVICE_URL_ALLOW_HOST (1 << 3)
-#define CAMEL_SERVICE_URL_ALLOW_PORT (1 << 4)
-#define CAMEL_SERVICE_URL_ALLOW_PATH (1 << 5)
-
-#define CAMEL_SERVICE_URL_NEED_USER (1 << 6 | 1 << 0)
-#define CAMEL_SERVICE_URL_NEED_AUTH (1 << 7 | 1 << 1)
-#define CAMEL_SERVICE_URL_NEED_PASSWORD (1 << 8 | 1 << 2)
-#define CAMEL_SERVICE_URL_NEED_HOST (1 << 9 | 1 << 3)
-#define CAMEL_SERVICE_URL_NEED_PORT (1 << 10 | 1 << 4)
-#define CAMEL_SERVICE_URL_NEED_PATH (1 << 11 | 1 << 5)
-
-
-/* query_auth_types returns a GList of these */
-typedef struct {
- char *name, *description, *authproto;
- gboolean need_password;
-} CamelServiceAuthType;
-
-
-/* public methods */
-CamelService * camel_service_new (CamelType type,
- CamelSession *session,
- CamelURL *url,
- CamelException *ex);
-
-gboolean camel_service_connect (CamelService *service,
- CamelException *ex);
-gboolean camel_service_disconnect (CamelService *service,
- CamelException *ex);
-gboolean camel_service_is_connected (CamelService *service);
-
-char * camel_service_get_url (CamelService *service);
-char * camel_service_get_name (CamelService *service,
- gboolean brief);
-CamelSession * camel_service_get_session (CamelService *service);
-
-GList * camel_service_query_auth_types (CamelService *service,
- CamelException *ex);
-void camel_service_free_auth_types (CamelService *service,
- GList *authtypes);
-
-/* convenience functions */
-struct hostent * camel_service_gethost (CamelService *service,
- CamelException *ex);
-
-
-/* Standard Camel function */
-CamelType camel_service_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_SERVICE_H */
-
diff --git a/camel/camel-session.c b/camel/camel-session.c
deleted file mode 100644
index f9f0584294..0000000000
--- a/camel/camel-session.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-session.c : Abstract class for an email session */
-
-/*
- *
- * Author:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- * Dan Winship <danw@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include <stdio.h>
-#include "camel-session.h"
-#include "camel-store.h"
-#include "camel-transport.h"
-#include "camel-exception.h"
-#include "string-utils.h"
-#include "camel-url.h"
-#include "hash-table-utils.h"
-
-static CamelObjectClass *parent_class;
-
-static void
-camel_session_init (CamelSession *session)
-{
- session->modules = camel_provider_init ();
- session->providers = g_hash_table_new (g_strcase_hash, g_strcase_equal);
-}
-
-static gboolean
-camel_session_destroy_provider (gpointer key, gpointer value, gpointer user_data)
-{
- CamelProvider *prov = (CamelProvider *)value;
-
- g_hash_table_destroy (prov->service_cache);
-
- return TRUE;
-}
-
-static void
-camel_session_finalise (CamelObject *o)
-{
- CamelSession *session = (CamelSession *)o;
-
- g_hash_table_foreach_remove (session->providers,
- camel_session_destroy_provider, NULL);
- g_hash_table_destroy (session->providers);
-}
-
-static void
-camel_session_class_init (CamelSessionClass *camel_session_class)
-{
- parent_class = camel_type_get_global_classfuncs (camel_object_get_type ());
-}
-
-CamelType
-camel_session_get_type (void)
-{
- static CamelType camel_session_type = CAMEL_INVALID_TYPE;
-
- if (camel_session_type == CAMEL_INVALID_TYPE) {
- camel_session_type = camel_type_register (camel_object_get_type (), "CamelSession",
- sizeof (CamelSession),
- sizeof (CamelSessionClass),
- (CamelObjectClassInitFunc) camel_session_class_init,
- NULL,
- (CamelObjectInitFunc) camel_session_init,
- (CamelObjectFinalizeFunc) camel_session_finalise);
- }
-
- return camel_session_type;
-}
-
-
-CamelSession *
-camel_session_new (CamelAuthCallback authenticator,
- CamelTimeoutRegisterCallback registrar,
- CamelTimeoutRemoveCallback remover)
-{
- CamelSession *session = CAMEL_SESSION (camel_object_new (CAMEL_SESSION_TYPE));
-
- session->authenticator = authenticator;
- session->registrar = registrar;
- session->remover = remover;
- return session;
-}
-
-/**
- * camel_session_register_provider:
- * @session: a session object
- * @protocol: the protocol the provider provides for
- * @provider: provider object
- *
- * Registers a protocol to provider mapping for the session.
- **/
-void
-camel_session_register_provider (CamelSession *session,
- CamelProvider *provider)
-{
- g_return_if_fail (CAMEL_IS_SESSION (session));
- g_return_if_fail (provider != NULL);
-
- g_hash_table_insert (session->providers, provider->protocol, provider);
-}
-
-static void
-ensure_loaded (gpointer key, gpointer value, gpointer user_data)
-{
- CamelSession *session = user_data;
- char *name = key;
- char *path = value;
-
- if (!g_hash_table_lookup (session->providers, name)) {
- CamelException ex;
-
- camel_exception_init (&ex);
- camel_provider_load (session, path, &ex);
- camel_exception_clear (&ex);
- }
-}
-
-static gint
-provider_compare (gconstpointer a, gconstpointer b)
-{
- const CamelProvider *cpa = (const CamelProvider *)a;
- const CamelProvider *cpb = (const CamelProvider *)b;
-
- return strcmp (cpa->name, cpb->name);
-}
-
-static void
-add_to_list (gpointer key, gpointer value, gpointer user_data)
-{
- GList **list = user_data;
- CamelProvider *prov = value;
-
- *list = g_list_insert_sorted (*list, prov, provider_compare);
-}
-
-/**
- * camel_session_list_providers:
- * @session: the session
- * @load: whether or not to load in providers that are not already loaded
- *
- * This returns a list of available providers in this session. If @load
- * is %TRUE, it will first load in all available providers that haven't
- * yet been loaded.
- *
- * Return value: a GList of providers, which the caller must free.
- **/
-GList *
-camel_session_list_providers (CamelSession *session, gboolean load)
-{
- GList *list;
-
- g_return_val_if_fail (CAMEL_IS_SESSION (session), NULL);
-
- if (load) {
- g_hash_table_foreach (session->modules, ensure_loaded, session);
- }
-
- list = NULL;
- g_hash_table_foreach (session->providers, add_to_list, &list);
- return list;
-}
-
-static void
-service_cache_remove (CamelService *service, gpointer event_data, gpointer user_data)
-{
- CamelProvider *provider;
- CamelSession *session = CAMEL_SESSION (user_data);
-
- g_return_if_fail (CAMEL_IS_SESSION (session));
- g_return_if_fail (service != NULL);
- g_return_if_fail (service->url != NULL);
-
- provider = g_hash_table_lookup (session->providers, service->url->protocol);
- g_hash_table_remove (provider->service_cache, service->url);
-}
-
-CamelService *
-camel_session_get_service (CamelSession *session, const char *url_string,
- CamelProviderType type, CamelException *ex)
-{
- CamelURL *url;
- const CamelProvider *provider;
- CamelService *service;
-
- url = camel_url_new (url_string, ex);
- if (!url)
- return NULL;
-
- /* We need to look up the provider so we can then lookup
- the service in the provider's cache */
- provider = g_hash_table_lookup (session->providers, url->protocol);
- if (!provider) {
- /* See if there's one we can load. */
- char *path;
-
- path = g_hash_table_lookup (session->modules, url->protocol);
- if (path) {
- camel_provider_load (session, path, ex);
- if (camel_exception_get_id (ex) !=
- CAMEL_EXCEPTION_NONE) {
- camel_url_free (url);
- return NULL;
- }
- }
- provider = g_hash_table_lookup (session->providers, url->protocol);
- }
-
- if (!provider || !provider->object_types[type]) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID,
- "No %s available for protocol `%s'",
- camel_provider_type_name[type],
- url->protocol);
- camel_url_free (url);
- return NULL;
- }
-
- /* Now look up the service in the provider's cache */
- service = g_hash_table_lookup (provider->service_cache, url);
- if (service != NULL) {
- camel_url_free (url);
- camel_object_ref (CAMEL_OBJECT (service));
- return service;
- }
-
- service = camel_service_new (provider->object_types[type], session, url, ex);
- if (service) {
- g_hash_table_insert (provider->service_cache, url, service);
- camel_object_hook_event (CAMEL_OBJECT (service), "finalize", (CamelObjectEventHookFunc) service_cache_remove, session);
- }
-
- return service;
-}
-
-
-/**
- * camel_session_query_authenticator: query the session authenticator
- * @session: session object
- * @mode: %CAMEL_AUTHENTICATOR_ASK or %CAMEL_AUTHENTICATOR_TELL
- * @data: prompt to query user with, or data to cache
- * @secret: whether or not the data is secret (eg, a password)
- * @service: the service this query is being made by
- * @item: an identifier, unique within this service, for the information
- * @ex: a CamelException
- *
- * This function is used by a CamelService to discuss authentication
- * information with the application.
- *
- * @service and @item together uniquely identify the piece of data the
- * caller is concerned with.
- *
- * If @mode is %CAMEL_AUTHENTICATOR_ASK, then @data is a question to
- * ask the user (if the application doesn't already have the answer
- * cached). If @secret is set, the user's input should not be echoed
- * back. The authenticator should set @ex to
- * %CAMEL_EXCEPTION_USER_CANCEL if the user did not provide the
- * information. The caller must g_free() the information returned when
- * it is done with it.
- *
- * If @mode is %CAMEL_AUTHENTICATOR_TELL, then @data is information
- * that the application should cache, or %NULL if it should stop
- * caching anything about that datum (eg, because the data is a
- * password that turned out to be incorrect).
- *
- * Return value: the authentication information or %NULL.
- **/
-char *
-camel_session_query_authenticator (CamelSession *session,
- CamelAuthCallbackMode mode,
- char *prompt, gboolean secret,
- CamelService *service, char *item,
- CamelException *ex)
-{
- return session->authenticator (mode, prompt, secret,
- service, item, ex);
-}
-
-/**
- * camel_session_register_timeout: Register a timeout to be called
- * periodically.
- *
- * @session: the CamelSession
- * @interval: the number of milliseconds interval between calls
- * @callback: the function to call
- * @user_data: extra data to be passed to the callback
- *
- * This function will use the registrar callback provided upon
- * camel_session_new to register the timeout. The callback will
- * be called every @interval milliseconds until it returns @FALSE.
- * It will be passed one argument, @user_data.
- *
- * Returns a nonzero handle that can be used with
- * camel_session_remove_timeout on success, and 0 on failure to
- * register the timeout.
- **/
-
-guint
-camel_session_register_timeout (CamelSession *session,
- guint32 interval,
- CamelTimeoutCallback callback,
- gpointer user_data)
-{
- g_return_val_if_fail (CAMEL_IS_SESSION (session), FALSE);
-
- return session->registrar (interval, callback, user_data);
-}
-
-/**
- * camel_session_remove_timeout: Remove a previously registered
- * timeout.
- *
- * @session: the CamelSession
- * @handle: a value returned from camel_session_register_timeout
- *
- * This function will use the remover callback provided upon
- * camel_session_new to remove the timeout.
- *
- * Returns TRUE on success and FALSE on failure.
- **/
-
-gboolean camel_session_remove_timeout (CamelSession *session,
- guint handle)
-{
- return session->remover (handle);
-}
diff --git a/camel/camel-session.h b/camel/camel-session.h
deleted file mode 100644
index 704ae6a613..0000000000
--- a/camel/camel-session.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-session.h : Abstract class for an email session */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_SESSION_H
-#define CAMEL_SESSION_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-object.h>
-#include <camel/camel-provider.h>
-
-#define CAMEL_SESSION_TYPE (camel_session_get_type ())
-#define CAMEL_SESSION(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SESSION_TYPE, CamelSession))
-#define CAMEL_SESSION_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SESSION_TYPE, CamelSessionClass))
-#define CAMEL_IS_SESSION(o) (CAMEL_CHECK_TYPE((o), CAMEL_SESSION_TYPE))
-
-
-typedef enum {
- CAMEL_AUTHENTICATOR_ASK, CAMEL_AUTHENTICATOR_TELL
-} CamelAuthCallbackMode;
-
-typedef char *(*CamelAuthCallback) (CamelAuthCallbackMode mode,
- char *data, gboolean secret,
- CamelService *service, char *item,
- CamelException *ex);
-typedef gboolean (*CamelTimeoutCallback) (gpointer data);
-typedef guint (*CamelTimeoutRegisterCallback) (guint32 interval,
- CamelTimeoutCallback cb,
- gpointer camel_data);
-typedef gboolean (*CamelTimeoutRemoveCallback) (guint id);
-
-struct _CamelSession
-{
- CamelObject parent_object;
-
- CamelAuthCallback authenticator;
- CamelTimeoutRegisterCallback registrar;
- CamelTimeoutRemoveCallback remover;
-
- GHashTable *providers, *modules;
-};
-
-typedef struct {
- CamelObjectClass parent_class;
-
-} CamelSessionClass;
-
-
-/* public methods */
-
-/* Standard Camel function */
-CamelType camel_session_get_type (void);
-
-
-CamelSession * camel_session_new (CamelAuthCallback
- authenticator,
- CamelTimeoutRegisterCallback
- registrar,
- CamelTimeoutRemoveCallback
- remover);
-void camel_session_register_provider (CamelSession *session,
- CamelProvider *provider);
-GList * camel_session_list_providers (CamelSession *session,
- gboolean load);
-
-CamelService * camel_session_get_service (CamelSession *session,
- const char *url_string,
- CamelProviderType type,
- CamelException *ex);
-#define camel_session_get_store(session, url_string, ex) \
- ((CamelStore *) camel_session_get_service (session, url_string, CAMEL_PROVIDER_STORE, ex))
-#define camel_session_get_transport(session, url_string, ex) \
- ((CamelTransport *) camel_session_get_service (session, url_string, CAMEL_PROVIDER_TRANSPORT, ex))
-
-
-char * camel_session_query_authenticator (CamelSession *session,
- CamelAuthCallbackMode mode,
- char *prompt,
- gboolean secret,
- CamelService *service,
- char *item,
- CamelException *ex);
-
-guint camel_session_register_timeout (CamelSession *session,
- guint32 interval,
- CamelTimeoutCallback callback,
- gpointer user_data);
-
-gboolean camel_session_remove_timeout (CamelSession *session,
- guint handle);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_SESSION_H */
diff --git a/camel/camel-store.c b/camel/camel-store.c
deleted file mode 100644
index dd2d5e41a0..0000000000
--- a/camel/camel-store.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-store.c : Abstract class for an email store */
-
-/*
- *
- * Authors:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-#include <config.h>
-#include "camel-store.h"
-#include "camel-folder.h"
-#include "camel-exception.h"
-
-static CamelServiceClass *parent_class = NULL;
-
-/* Returns the class for a CamelStore */
-#define CS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static CamelFolder *get_folder (CamelStore *store, const char *folder_name,
- gboolean create, CamelException *ex);
-static void delete_folder (CamelStore *store, const char *folder_name,
- CamelException *ex);
-static void rename_folder (CamelStore *store, const char *old_name,
- const char *new_name, CamelException *ex);
-
-static char *get_folder_name (CamelStore *store, const char *folder_name,
- CamelException *ex);
-static char *get_root_folder_name (CamelStore *store, CamelException *ex);
-static char *get_default_folder_name (CamelStore *store, CamelException *ex);
-
-static CamelFolder *lookup_folder (CamelStore *store, const char *folder_name);
-static void cache_folder (CamelStore *store, const char *folder_name,
- CamelFolder *folder);
-static void uncache_folder (CamelStore *store, CamelFolder *folder);
-
-static void
-camel_store_class_init (CamelStoreClass *camel_store_class)
-{
- parent_class = CAMEL_SERVICE_CLASS (camel_type_get_global_classfuncs (camel_service_get_type ()));
-
- /* virtual method definition */
- camel_store_class->get_folder = get_folder;
- camel_store_class->delete_folder = delete_folder;
- camel_store_class->rename_folder = rename_folder;
- camel_store_class->get_folder_name = get_folder_name;
- camel_store_class->get_root_folder_name = get_root_folder_name;
- camel_store_class->get_default_folder_name = get_default_folder_name;
- camel_store_class->lookup_folder = lookup_folder;
- camel_store_class->cache_folder = cache_folder;
- camel_store_class->uncache_folder = uncache_folder;
-}
-
-static void
-camel_store_init (void *o, void *k)
-{
- CamelStore *store = o;
-
- store->folders = g_hash_table_new (g_str_hash, g_str_equal);
-}
-
-static void
-camel_store_finalize (CamelObject *object)
-{
- CamelStore *store = CAMEL_STORE (object);
-
- if (store->folders) {
- if (g_hash_table_size (store->folders) != 0) {
- g_warning ("Folder cache for store %p contains "
- "%d folders at destruction.", store,
- g_hash_table_size (store->folders));
- }
- g_hash_table_destroy (store->folders);
- }
-}
-
-
-CamelType
-camel_store_get_type (void)
-{
- static CamelType camel_store_type = CAMEL_INVALID_TYPE;
-
- if (camel_store_type == CAMEL_INVALID_TYPE) {
- camel_store_type = camel_type_register (CAMEL_SERVICE_TYPE, "CamelStore",
- sizeof (CamelStore),
- sizeof (CamelStoreClass),
- (CamelObjectClassInitFunc) camel_store_class_init,
- NULL,
- (CamelObjectInitFunc) camel_store_init,
- (CamelObjectFinalizeFunc) camel_store_finalize );
- }
-
- return camel_store_type;
-}
-
-
-static CamelFolder *
-get_folder (CamelStore *store, const char *folder_name,
- gboolean create, CamelException *ex)
-{
- g_warning ("CamelStore::get_folder not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store)));
- return NULL;
-}
-
-static void
-delete_folder (CamelStore *store, const char *folder_name, CamelException *ex)
-{
- g_warning ("CamelStore::delete_folder not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store)));
-}
-
-static void rename_folder (CamelStore *store, const char *old_name,
- const char *new_name, CamelException *ex)
-{
- g_warning ("CamelStore::rename_folder not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store)));
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "rename folder unimplemented for: %s",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store)));
-}
-
-
-/* CamelStore::get_folder_name should:
- * a) make sure that the provided name is valid
- * b) return it in canonical form, in allocated memory.
- *
- * This is used to make sure that duplicate names for the same folder
- * don't result in duplicate cache entries.
- */
-static char *
-get_folder_name (CamelStore *store, const char *folder_name,
- CamelException *ex)
-{
- g_warning ("CamelStore::get_folder_name not implemented for `%s'",
- camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store)));
- return NULL;
-}
-
-static char *
-get_root_folder_name (CamelStore *store, CamelException *ex)
-{
- return g_strdup ("/");
-}
-
-static char *
-get_default_folder_name (CamelStore *store, CamelException *ex)
-{
- return CS_CLASS (store)->get_root_folder_name (store, ex);
-}
-
-static CamelFolder *
-lookup_folder (CamelStore *store, const char *folder_name)
-{
- if (store->folders) {
- CamelFolder *folder = g_hash_table_lookup (store->folders, folder_name);
- if (folder)
- camel_object_ref(CAMEL_OBJECT(folder));
- return folder;
- }
- return NULL;
-}
-
-static void folder_finalize (CamelObject *folder, gpointer event_data, gpointer user_data)
-{
- CS_CLASS (user_data)->uncache_folder (CAMEL_STORE(user_data), CAMEL_FOLDER(folder));
-}
-
-static void
-cache_folder (CamelStore *store, const char *folder_name, CamelFolder *folder)
-{
- if (!store->folders)
- return;
-
- if (g_hash_table_lookup (store->folders, folder_name)) {
- g_warning ("Caching folder %s that already exists.",
- folder_name);
- }
- g_hash_table_insert (store->folders, g_strdup (folder_name), folder);
-
- camel_object_hook_event (CAMEL_OBJECT (folder), "finalize", folder_finalize, store);
-
- /*
- * gt_k so as not to get caught by my little gt_k cleanliness detector.
- *
- * gt_k_signal_connect_object (CAMEL_OBJECT (folder), "destroy",
- * GT_K_SIGNAL_FUNC (CS_CLASS (store)->uncache_folder),
- * CAMEL_OBJECT (store));
- */
-}
-
-static gboolean
-folder_matches (gpointer key, gpointer value, gpointer user_data)
-{
- if (value == user_data) {
- g_free (key);
- return TRUE;
- } else
- return FALSE;
-}
-
-static void
-uncache_folder (CamelStore *store, CamelFolder *folder)
-{
- g_hash_table_foreach_remove (store->folders, folder_matches, folder);
-}
-
-
-static CamelFolder *
-get_folder_internal (CamelStore *store, const char *folder_name,
- gboolean create, CamelException *ex)
-{
- CamelFolder *folder = NULL;
-
- /* Try cache first. */
- folder = CS_CLASS (store)->lookup_folder (store, folder_name);
-
- if (!folder) {
- folder = CS_CLASS (store)->get_folder (store, folder_name,
- create, ex);
- if (!folder)
- return NULL;
-
- CS_CLASS (store)->cache_folder (store, folder_name, folder);
- }
-
- return folder;
-}
-
-
-
-/**
- * camel_store_get_folder: Return the folder corresponding to a path.
- * @store: a CamelStore
- * @folder_name: name of the folder to get
- * @create: whether or not to create the folder if it doesn't already exist
- * @ex: a CamelException
- *
- * Returns the folder corresponding to the path @folder_name. If the
- * path begins with the separator character, it is relative to the
- * root folder. Otherwise, it is relative to the default folder. If
- * @create is %TRUE and the named folder does not already exist, it will
- * be created.
- *
- * Return value: the folder
- **/
-CamelFolder *
-camel_store_get_folder (CamelStore *store, const char *folder_name,
- gboolean create, CamelException *ex)
-{
- char *name;
- CamelFolder *folder = NULL;
-
- if (!camel_service_is_connected (CAMEL_SERVICE (store)))
- camel_service_connect (CAMEL_SERVICE (store), ex);
-
- name = CS_CLASS (store)->get_folder_name (store, folder_name, ex);
- if (name) {
- folder = get_folder_internal (store, name, create, ex);
- g_free (name);
- }
- return folder;
-}
-
-
-/**
- * camel_store_delete_folder: Delete the folder corresponding to a path.
- * @store: a CamelStore
- * @folder_name: name of the folder to delete
- * @ex: a CamelException
- *
- * Deletes the named folder. The folder must be empty.
- **/
-void
-camel_store_delete_folder (CamelStore *store, const char *folder_name,
- CamelException *ex)
-{
- char *name;
-
- name = CS_CLASS (store)->get_folder_name (store, folder_name, ex);
- if (name) {
- CS_CLASS (store)->delete_folder (store, name, ex);
- g_free (name);
- }
-}
-
-/**
- * camel_store_rename_folder:
- * @store:
- * @old_name:
- * @new_name:
- * @ex:
- *
- * Rename a named folder to a new name.
- **/
-void camel_store_rename_folder (CamelStore *store,
- const char *old_name,
- const char *new_name,
- CamelException *ex)
-{
- char *old, *new;
-
- old = CS_CLASS (store)->get_folder_name(store, old_name, ex);
- if (old) {
- new = CS_CLASS (store)->get_folder_name(store, new_name, ex);
- if (new) {
- CS_CLASS (store)->rename_folder(store, old, new, ex);
- g_free(new);
- }
- g_free(old);
- }
-}
-
-
-/**
- * camel_store_get_root_folder: return the top-level folder
- *
- * Returns the folder which is at the top of the folder hierarchy.
- * This folder may or may not be the same as the default folder.
- *
- * Return value: the top-level folder.
- **/
-CamelFolder *
-camel_store_get_root_folder (CamelStore *store, CamelException *ex)
-{
- char *name;
- CamelFolder *folder = NULL;
-
- name = CS_CLASS (store)->get_root_folder_name (store, ex);
- if (name) {
- folder = get_folder_internal (store, name, TRUE, ex);
- g_free (name);
- }
- return folder;
-}
-
-/**
- * camel_store_get_default_folder: return the store default folder
- *
- * The default folder is the folder which is presented to the user in
- * the default configuration. This defaults to the root folder if
- * the store doesn't override it.
- *
- * Return value: the default folder.
- **/
-CamelFolder *
-camel_store_get_default_folder (CamelStore *store, CamelException *ex)
-{
- char *name;
- CamelFolder *folder = NULL;
-
- name = CS_CLASS (store)->get_default_folder_name (store, ex);
- if (name) {
- folder = get_folder_internal (store, name, TRUE, ex);
- g_free (name);
- }
- return folder;
-}
-
diff --git a/camel/camel-store.h b/camel/camel-store.h
deleted file mode 100644
index 1ba2ff9869..0000000000
--- a/camel/camel-store.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-store.h : Abstract class for an email store */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_STORE_H
-#define CAMEL_STORE_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-object.h>
-#include <camel/camel-service.h>
-
-#define CAMEL_STORE_TYPE (camel_store_get_type ())
-#define CAMEL_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_STORE_TYPE, CamelStore))
-#define CAMEL_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_STORE_TYPE, CamelStoreClass))
-#define CAMEL_IS_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_STORE_TYPE))
-
-
-struct _CamelStore
-{
- CamelService parent_object;
-
- GHashTable *folders;
-
-};
-
-
-
-typedef struct {
- CamelServiceClass parent_class;
-
- CamelFolder * (*get_folder) (CamelStore *store,
- const char *folder_name,
- gboolean create,
- CamelException *ex);
-
- void (*delete_folder) (CamelStore *store,
- const char *folder_name,
- CamelException *ex);
- void (*rename_folder) (CamelStore *store,
- const char *old_name,
- const char *new_name,
- CamelException *ex);
- char * (*get_folder_name) (CamelStore *store,
- const char *folder_name,
- CamelException *ex);
- char * (*get_root_folder_name) (CamelStore *store,
- CamelException *ex);
- char * (*get_default_folder_name) (CamelStore *store,
- CamelException *ex);
-
- CamelFolder * (*lookup_folder) (CamelStore *store,
- const char *folder_name);
- void (*cache_folder) (CamelStore *store,
- const char *folder_name,
- CamelFolder *folder);
- void (*uncache_folder) (CamelStore *store,
- CamelFolder *folder);
-
-} CamelStoreClass;
-
-
-/* Standard Camel function */
-CamelType camel_store_get_type (void);
-
-/* public methods */
-CamelFolder * camel_store_get_folder (CamelStore *store,
- const char *folder_name,
- gboolean create,
- CamelException *ex);
-CamelFolder * camel_store_get_root_folder (CamelStore *store,
- CamelException *ex);
-CamelFolder * camel_store_get_default_folder (CamelStore *store,
- CamelException *ex);
-
-void camel_store_delete_folder (CamelStore *store,
- const char *folder_name,
- CamelException *ex);
-void camel_store_rename_folder (CamelStore *store,
- const char *old_name,
- const char *new_name,
- CamelException *ex);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_STORE_H */
diff --git a/camel/camel-stream-buffer.c b/camel/camel-stream-buffer.c
deleted file mode 100644
index c25cda09bc..0000000000
--- a/camel/camel-stream-buffer.c
+++ /dev/null
@@ -1,453 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-
-/* camel-stream-buffer.c : Buffer any other other stream
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-
-#include <config.h>
-#include "camel-stream-buffer.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-
-static CamelStreamClass *parent_class = NULL;
-
-enum {
- BUF_USER = 1<<0, /* user-supplied buffer, do not free */
-};
-
-#define BUF_SIZE 1024
-
-static ssize_t stream_read (CamelStream *stream, char *buffer, size_t n);
-static ssize_t stream_write (CamelStream *stream, const char *buffer, size_t n);
-static int stream_flush (CamelStream *stream);
-static int stream_close (CamelStream *stream);
-static gboolean stream_eos (CamelStream *stream);
-
-static void init_vbuf(CamelStreamBuffer *sbf, CamelStream *s, CamelStreamBufferMode mode, char *buf, guint32 size);
-static void init(CamelStreamBuffer *sbuf, CamelStream *s, CamelStreamBufferMode mode);
-
-static void
-camel_stream_buffer_class_init (CamelStreamBufferClass *camel_stream_buffer_class)
-{
- CamelStreamClass *camel_stream_class = CAMEL_STREAM_CLASS (camel_stream_buffer_class);
-
- parent_class = CAMEL_STREAM_CLASS (camel_type_get_global_classfuncs (camel_stream_get_type ()));
-
- /* virtual method definition */
- camel_stream_buffer_class->init = init;
- camel_stream_buffer_class->init_vbuf = init_vbuf;
-
- /* virtual method overload */
- camel_stream_class->read = stream_read;
- camel_stream_class->write = stream_write;
- camel_stream_class->flush = stream_flush;
- camel_stream_class->close = stream_close;
- camel_stream_class->eos = stream_eos;
-}
-
-static void
-camel_stream_buffer_init (gpointer object, gpointer klass)
-{
- CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (object);
-
- sbf->flags = 0;
- sbf->size = BUF_SIZE;
- sbf->buf = g_malloc(BUF_SIZE);
- sbf->ptr = sbf->buf;
- sbf->end = sbf->buf;
- sbf->mode = CAMEL_STREAM_BUFFER_READ | CAMEL_STREAM_BUFFER_BUFFER;
- sbf->stream = 0;
- sbf->linesize = 80;
- sbf->linebuf = g_malloc(sbf->linesize);
-}
-
-static void
-camel_stream_buffer_finalize (CamelObject *object)
-{
- CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (object);
-
- if (!(sbf->flags & BUF_USER)) {
- g_free(sbf->buf);
- }
- if (sbf->stream)
- camel_object_unref(CAMEL_OBJECT(sbf->stream));
-
- g_free(sbf->linebuf);
-}
-
-
-CamelType
-camel_stream_buffer_get_type (void)
-{
- static CamelType camel_stream_buffer_type = CAMEL_INVALID_TYPE;
-
- if (camel_stream_buffer_type == CAMEL_INVALID_TYPE) {
- camel_stream_buffer_type = camel_type_register (camel_stream_get_type (), "CamelStreamBuffer",
- sizeof (CamelStreamBuffer),
- sizeof (CamelStreamBufferClass),
- (CamelObjectClassInitFunc) camel_stream_buffer_class_init,
- NULL,
- (CamelObjectInitFunc) camel_stream_buffer_init,
- (CamelObjectFinalizeFunc) camel_stream_buffer_finalize);
- }
-
- return camel_stream_buffer_type;
-}
-
-
-static void
-set_vbuf(CamelStreamBuffer *sbf, char *buf, CamelStreamBufferMode mode, int size)
-{
- if (sbf->buf && !(sbf->flags & BUF_USER)) {
- g_free(sbf->buf);
- }
- if (buf) {
- sbf->buf = buf;
- sbf->flags |= BUF_USER;
- } else {
- sbf->buf = g_malloc(size);
- sbf->flags &= ~BUF_USER;
- }
- sbf->size = size;
- sbf->mode = mode;
-}
-
-static void
-init_vbuf(CamelStreamBuffer *sbf, CamelStream *s, CamelStreamBufferMode mode, char *buf, guint32 size)
-{
- set_vbuf(sbf, buf, mode, size);
- if (sbf->stream)
- camel_object_unref(CAMEL_OBJECT(sbf->stream));
- sbf->stream = s;
- camel_object_ref(CAMEL_OBJECT(sbf->stream));
-}
-
-static void
-init(CamelStreamBuffer *sbuf, CamelStream *s, CamelStreamBufferMode mode)
-{
- init_vbuf(sbuf, s, mode, NULL, BUF_SIZE);
-}
-
-
-/**
- * camel_stream_buffer_new:
- * @stream: Existing stream to buffer.
- * @mode: Operational mode of buffered stream.
- *
- * Create a new buffered stream of another stream. A default
- * buffer size (1024 bytes), automatically managed will be used
- * for buffering.
- *
- * See camel_stream_buffer_new_with_vbuf() for details on the
- * @mode parameter.
- *
- * Return value: A newly created buffered stream.
- **/
-CamelStream *
-camel_stream_buffer_new (CamelStream *stream, CamelStreamBufferMode mode)
-{
- CamelStreamBuffer *sbf;
- sbf = CAMEL_STREAM_BUFFER (camel_object_new (camel_stream_buffer_get_type ()));
- CAMEL_STREAM_BUFFER_CLASS (CAMEL_OBJECT_GET_CLASS(sbf))->init (sbf, stream, mode);
-
- return CAMEL_STREAM (sbf);
-}
-
-/**
- * camel_stream_buffer_new_with_vbuf:
- * @stream: An existing stream to buffer.
- * @mode: Mode to buffer in.
- * @buf: Memory to use for buffering.
- * @size: Size of buffer to use.
- *
- * Create a new stream which buffers another stream, @stream.
- *
- * The following values are available for @mode:
- *
- * CAMEL_STREAM_BUFFER_BUFFER, Buffer the input/output in blocks.
- * CAMEL_STREAM_BUFFER_NEWLINE, Buffer on newlines (for output).
- * CAMEL_STREAM_BUFFER_NONE, Perform no buffering.
- *
- * Note that currently this is ignored and CAMEL_STREAM_BUFFER_BUFFER
- * is always used.
- *
- * In addition, one of the following mode options should be or'd
- * together with the buffering mode:
- *
- * CAMEL_STREAM_BUFFER_WRITE, Buffer in write mode.
- * CAMEL_STREAM_BUFFER_READ, Buffer in read mode.
- *
- * Buffering can only be done in one direction for any
- * buffer instance.
- *
- * If @buf is non-NULL, then use the memory pointed to
- * (for upto @size bytes) as the buffer for all buffering
- * operations. It is upto the application to free this buffer.
- * If @buf is NULL, then allocate and manage @size bytes
- * for all buffering.
- *
- * Return value: A new stream with buffering applied.
- **/
-CamelStream *camel_stream_buffer_new_with_vbuf (CamelStream *stream, CamelStreamBufferMode mode, char *buf, guint32 size)
-{
- CamelStreamBuffer *sbf;
- sbf = CAMEL_STREAM_BUFFER (camel_object_new (camel_stream_buffer_get_type ()));
- CAMEL_STREAM_BUFFER_CLASS (CAMEL_OBJECT_GET_CLASS(sbf))->init_vbuf (sbf, stream, mode, buf, size);
-
- return CAMEL_STREAM (sbf);
-}
-
-static ssize_t
-stream_read (CamelStream *stream, char *buffer, size_t n)
-{
- CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (stream);
- ssize_t bytes_read = 1;
- ssize_t bytes_left;
- char *bptr = buffer;
-
- g_return_val_if_fail( (sbf->mode & CAMEL_STREAM_BUFFER_MODE) == CAMEL_STREAM_BUFFER_READ, 0);
-
- while (n && bytes_read > 0) {
- bytes_left = sbf->end - sbf->ptr;
- if (bytes_left < n) {
- if (bytes_left > 0) {
- memcpy(bptr, sbf->ptr, bytes_left);
- n -= bytes_left;
- bptr += bytes_left;
- sbf->ptr += bytes_left;
- }
- /* if we are reading a lot, then read directly to the destination buffer */
- if (n >= sbf->size/3) {
- bytes_read = camel_stream_read(sbf->stream, bptr, n);
- if (bytes_read>0) {
- n -= bytes_read;
- bptr += bytes_read;
- }
- } else {
- bytes_read = camel_stream_read(sbf->stream, sbf->buf, sbf->size);
- if (bytes_read>0) {
- sbf->ptr = sbf->buf;
- sbf->end = sbf->buf+bytes_read;
- memcpy(bptr, sbf->ptr, n);
- sbf->ptr += n;
- bptr += n;
- n -= bytes_read;
- }
- }
- } else {
- memcpy(bptr, sbf->ptr, bytes_left);
- sbf->ptr += n;
- bptr += n;
- n = 0;
- }
- }
-
- return (ssize_t)(bptr - buffer);
-}
-
-static ssize_t
-stream_write (CamelStream *stream, const char *buffer, size_t n)
-{
- CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (stream);
- const char *bptr = buffer;
- ssize_t bytes_written = 1;
- ssize_t bytes_left;
- ssize_t total = n;
-
- g_return_val_if_fail( (sbf->mode & CAMEL_STREAM_BUFFER_MODE) == CAMEL_STREAM_BUFFER_WRITE, 0);
-
- while (n && bytes_written > 0) {
- bytes_left = sbf->size - (sbf->ptr-sbf->buf);
- if (bytes_left<n) {
- memcpy(sbf->ptr, bptr, bytes_left);
- n -= bytes_left;
- bptr += bytes_left;
- bytes_written = camel_stream_write(sbf->stream, sbf->buf, sbf->size);
- sbf->ptr = sbf->buf;
- /* if we are writing a lot, write directly to the stream */
- if (n >= sbf->size/3) {
- bytes_written = camel_stream_write(sbf->stream, bptr, n);
- if (bytes_written >0) {
- bytes_written = n;
- n -= bytes_written;
- bptr += bytes_written;
- }
- } else {
- memcpy(sbf->ptr, bptr, n);
- sbf->ptr += n;
- bptr += n;
- n = 0;
- }
- } else {
- memcpy(sbf->ptr, bptr, n);
- sbf->ptr += n;
- bptr += n;
- n = 0;
- }
- }
- if (bytes_written == -1)
- return -1;
-
- return total;
-}
-
-static int
-stream_flush (CamelStream *stream)
-{
- CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (stream);
-
- if ((sbf->mode & CAMEL_STREAM_BUFFER_MODE) == CAMEL_STREAM_BUFFER_WRITE) {
- int len = sbf->ptr-sbf->buf;
- int written = camel_stream_write(sbf->stream, sbf->buf, len);
- if (written > 0)
- sbf->ptr += written;
- if (written != len)
- return -1;
- } else {
- /* nothing to do for read mode 'flush' */
- }
-
- return camel_stream_flush(sbf->stream);
-}
-
-static int
-stream_close (CamelStream *stream)
-{
- CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (stream);
-
- if (stream_flush(stream) == -1)
- return -1;
- return camel_stream_close(sbf->stream);
-}
-
-static gboolean
-stream_eos (CamelStream *stream)
-{
- CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (stream);
-
- return camel_stream_eos(sbf->stream) && sbf->ptr == sbf->end;
-}
-
-/**
- * camel_stream_buffer_gets:
- * @sbf: A CamelStreamBuffer.
- * @buf: Memory to write the string to.
- * @max: Maxmimum number of characters to store.
- *
- * Read a line of characters up to the next newline character or
- * @max characters.
- *
- * If the newline character is encountered, then it will be
- * included in the buffer @buf. The buffer will be #NUL terminated.
- *
- * Return value: The number of characters read, or 0 for end of file,
- * and -1 on error.
- **/
-int camel_stream_buffer_gets(CamelStreamBuffer *sbf, char *buf, unsigned int max)
-{
- register char *outptr, *inptr, *inend, c, *outend;
- int bytes_read;
-
- outptr = buf;
- inptr = sbf->ptr;
- inend = sbf->end;
- outend = buf+max-1; /* room for NUL */
-
- do {
- while (inptr<inend && outptr<outend) {
- c = *inptr++;
- *outptr++ = c;
- if (c == '\n') {
- *outptr = 0;
- sbf->ptr = inptr;
- return outptr-buf;
- }
- }
- if (outptr == outend)
- break;
-
- bytes_read = camel_stream_read(sbf->stream, sbf->buf, sbf->size);
- if (bytes_read == -1)
- return -1;
- inptr = sbf->ptr = sbf->buf;
- inend = sbf->end = sbf->buf + bytes_read;
- } while (bytes_read>0);
-
- sbf->ptr = inptr;
- if (outptr <= outend)
- *outptr = 0;
-
- return (int)(outptr - buf);
-}
-
-/**
- * camel_stream_buffer_read_line: read a complete line from the stream
- * @sbf: A CamelStreamBuffer
- *
- * This function reads a complete newline-terminated line from the stream
- * and returns it in allocated memory. The trailing newline (and carriage
- * return if any) are not included in the returned string.
- *
- * Return value: the line read, which the caller must free when done with,
- * or NULL on eof. If an error occurs, @ex will be set.
- **/
-char *
-camel_stream_buffer_read_line (CamelStreamBuffer *sbf)
-{
- unsigned char *p;
- int nread;
-
- p = sbf->linebuf;
-
- while (1) {
- nread = camel_stream_buffer_gets (sbf, p, sbf->linesize - (p - sbf->linebuf));
- if (nread <=0) {
- if (p > sbf->linebuf)
- break;
- return NULL;
- }
-
- p += nread;
- if (p[-1] == '\n')
- break;
-
- nread = p - sbf->linebuf;
- sbf->linesize *= 2;
- sbf->linebuf = g_realloc (sbf->linebuf, sbf->linesize);
- p = sbf->linebuf + nread;
- }
-
- p--;
- if (p[-1] == '\r')
- p--;
- p[0] = 0;
-
- return g_strdup(sbf->linebuf);
-}
-
-
-
-
-
-
diff --git a/camel/camel-stream-buffer.h b/camel/camel-stream-buffer.h
deleted file mode 100644
index 5c9037595a..0000000000
--- a/camel/camel-stream-buffer.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-stream-buffer.h :stream which buffers another stream */
-
-/*
- *
- * Author :
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 2000 Helix Code Inc. (http://www.helixcode.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 CAMEL_STREAM_BUFFER_H
-#define CAMEL_STREAM_BUFFER_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-seekable-stream.h>
-#include <stdio.h>
-
-#define CAMEL_STREAM_BUFFER_TYPE (camel_stream_buffer_get_type ())
-#define CAMEL_STREAM_BUFFER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_STREAM_BUFFER_TYPE, CamelStreamBuffer))
-#define CAMEL_STREAM_BUFFER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_STREAM_BUFFER_TYPE, CamelStreamBufferClass))
-#define CAMEL_IS_STREAM_BUFFER(o) (CAMEL_CHECK_TYPE((o), CAMEL_STREAM_BUFFER_TYPE))
-
-typedef enum
-{
- CAMEL_STREAM_BUFFER_BUFFER = 0,
- CAMEL_STREAM_BUFFER_NEWLINE,
- CAMEL_STREAM_BUFFER_NONE,
- CAMEL_STREAM_BUFFER_READ = 0x00,
- CAMEL_STREAM_BUFFER_WRITE = 0x80,
- CAMEL_STREAM_BUFFER_MODE = 0x80
-} CamelStreamBufferMode;
-
-struct _CamelStreamBuffer
-{
- CamelStream parent_object;
-
- /* these are all of course, private */
- CamelStream *stream;
-
- unsigned char *buf, *ptr, *end;
- int size;
-
- unsigned char *linebuf; /* for reading lines at a time */
- int linesize;
-
- CamelStreamBufferMode mode;
- unsigned int flags; /* internal flags */
-};
-
-
-typedef struct {
- CamelStreamClass parent_class;
-
- /* Virtual methods */
- void (*init) (CamelStreamBuffer *stream_buffer, CamelStream *stream,
- CamelStreamBufferMode mode);
- void (*init_vbuf) (CamelStreamBuffer *stream_buffer,
- CamelStream *stream, CamelStreamBufferMode mode,
- char *buf, guint32 size);
-
-} CamelStreamBufferClass;
-
-
-/* Standard Camel function */
-CamelType camel_stream_buffer_get_type (void);
-
-
-/* public methods */
-CamelStream *camel_stream_buffer_new (CamelStream *s,
- CamelStreamBufferMode mode);
-CamelStream *camel_stream_buffer_new_with_vbuf (CamelStream *s,
- CamelStreamBufferMode mode,
- char *buf, guint32 size);
-
-/* unimplemented
- CamelStream *camel_stream_buffer_set_vbuf (CamelStreamBuffer *b, CamelStreamBufferMode mode, char *buf, guint32 size); */
-
-/* read a line of characters */
-int camel_stream_buffer_gets (CamelStreamBuffer *b, char *buf, unsigned int max);
-
-char *camel_stream_buffer_read_line (CamelStreamBuffer *sbf);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_STREAM_BUFFER_H */
diff --git a/camel/camel-stream-filter.c b/camel/camel-stream-filter.c
deleted file mode 100644
index 7d66928bf5..0000000000
--- a/camel/camel-stream-filter.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "camel-stream-filter.h"
-
-struct _filter {
- struct _filter *next;
- int id;
- CamelMimeFilter *filter;
-};
-
-struct _CamelStreamFilterPrivate {
- struct _filter *filters;
- int filterid; /* next filter id */
-
- char *realbuffer; /* buffer - READ_PAD */
- char *buffer; /* READ_SIZE bytes */
-
- char *filtered; /* the filtered data */
- size_t filteredlen;
-
- int last_was_read; /* was the last op read or write? */
-};
-
-#define READ_PAD (64) /* bytes padded before buffer */
-#define READ_SIZE (4096)
-
-#define _PRIVATE(o) (((CamelStreamFilter *)(o))->priv)
-
-static void camel_stream_filter_class_init (CamelStreamFilterClass *klass);
-static void camel_stream_filter_init (CamelStreamFilter *obj);
-
-static ssize_t do_read (CamelStream *stream, char *buffer, size_t n);
-static ssize_t do_write (CamelStream *stream, const char *buffer, size_t n);
-static int do_flush (CamelStream *stream);
-static int do_close (CamelStream *stream);
-static gboolean do_eos (CamelStream *stream);
-static int do_reset (CamelStream *stream);
-
-static CamelStreamClass *camel_stream_filter_parent;
-
-static void
-camel_stream_filter_class_init (CamelStreamFilterClass *klass)
-{
- CamelStreamClass *camel_stream_class = (CamelStreamClass *) klass;
-
- camel_stream_filter_parent = CAMEL_STREAM_CLASS (camel_type_get_global_classfuncs (camel_stream_get_type ()));
-
- camel_stream_class->read = do_read;
- camel_stream_class->write = do_write;
- camel_stream_class->flush = do_flush;
- camel_stream_class->close = do_close;
- camel_stream_class->eos = do_eos;
- camel_stream_class->reset = do_reset;
-
-}
-
-static void
-camel_stream_filter_init (CamelStreamFilter *obj)
-{
- struct _CamelStreamFilterPrivate *p;
-
- _PRIVATE(obj) = p = g_malloc0(sizeof(*p));
- p->realbuffer = g_malloc(READ_SIZE + READ_PAD);
- p->buffer = p->realbuffer + READ_PAD;
- p->last_was_read = TRUE;
-}
-
-static void
-camel_stream_filter_finalize(CamelObject *o)
-{
- CamelStreamFilter *filter = (CamelStreamFilter *)o;
- struct _CamelStreamFilterPrivate *p = _PRIVATE(filter);
- struct _filter *fn, *f;
-
- f = p->filters;
- while (f) {
- fn = f->next;
- camel_object_unref((CamelObject *)f->filter);
- g_free(f);
- f = fn;
- }
- g_free(p->realbuffer);
- g_free(p);
- camel_object_unref((CamelObject *)filter->source);
-}
-
-
-CamelType
-camel_stream_filter_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (CAMEL_STREAM_TYPE, "CamelStreamFilter",
- sizeof (CamelStreamFilter),
- sizeof (CamelStreamFilterClass),
- (CamelObjectClassInitFunc) camel_stream_filter_class_init,
- NULL,
- (CamelObjectInitFunc) camel_stream_filter_init,
- (CamelObjectFinalizeFunc) camel_stream_filter_finalize);
- }
-
- return type;
-}
-
-
-/**
- * camel_stream_filter_new:
- *
- * Create a new CamelStreamFilter object.
- *
- * Return value: A new CamelStreamFilter object.
- **/
-CamelStreamFilter *
-camel_stream_filter_new_with_stream(CamelStream *stream)
-{
- CamelStreamFilter *new = CAMEL_STREAM_FILTER ( camel_object_new (camel_stream_filter_get_type ()));
-
- new->source = stream;
- camel_object_ref ((CamelObject *)stream);
-
- return new;
-}
-
-
-/**
- * camel_stream_filter_add:
- * @filter: Initialised CamelStreamFilter.
- * @mf: Filter to perform processing on stream.
- *
- * Add a new CamelMimeFilter to execute during the processing of this
- * stream. Each filter added is processed after the previous one.
- *
- * Note that a filter should only be added to a single stream
- * at a time, otherwise unpredictable results may occur.
- *
- * Return value: A filter id for this CamelStreamFilter.
- **/
-int
-camel_stream_filter_add(CamelStreamFilter *filter, CamelMimeFilter *mf)
-{
- struct _CamelStreamFilterPrivate *p = _PRIVATE(filter);
- struct _filter *fn, *f;
-
- fn = g_malloc(sizeof(*fn));
- fn->id = p->filterid++;
- fn->filter = mf;
- camel_object_ref((CamelObject *)mf);
-
- /* sure, we could use a GList, but we wouldn't save much */
- f = (struct _filter *)&p->filters;
- while (f->next)
- f = f->next;
- f->next = fn;
- fn->next = NULL;
- return fn->id;
-}
-
-/**
- * camel_stream_filter_remove:
- * @filter: Initialised CamelStreamFilter.
- * @id: Filter id, as returned from camel_stream_filter_add().
- *
- * Remove a processing filter from the stream, by id.
- **/
-void
-camel_stream_filter_remove(CamelStreamFilter *filter, int id)
-{
- struct _CamelStreamFilterPrivate *p = _PRIVATE(filter);
- struct _filter *fn, *f;
-
- f = (struct _filter *)&p->filters;
- while (f && f->next) {
- fn = f->next;
- if (fn->id == id) {
- f->next = fn->next;
- camel_object_unref((CamelObject *)fn->filter);
- g_free(fn);
- }
- f = f->next;
- }
-}
-
-static ssize_t
-do_read (CamelStream *stream, char *buffer, size_t n)
-{
- CamelStreamFilter *filter = (CamelStreamFilter *)stream;
- struct _CamelStreamFilterPrivate *p = _PRIVATE(filter);
- ssize_t size;
- struct _filter *f;
-
- p->last_was_read = TRUE;
-
- if (p->filteredlen<=0) {
- int presize = READ_SIZE;
-
- size = camel_stream_read(filter->source, p->buffer, READ_SIZE);
- if (size <= 0) {
- /* this is somewhat untested */
- if (camel_stream_eos(filter->source)) {
- f = p->filters;
- p->filtered = p->buffer;
- p->filteredlen = 0;
- while (f) {
- camel_mime_filter_complete(f->filter, p->filtered, p->filteredlen,
- presize, &p->filtered, &p->filteredlen, &presize);
- f = f->next;
- }
- size = p->filteredlen;
- }
- if (size <= 0)
- return size;
- } else {
- f = p->filters;
- p->filtered = p->buffer;
- p->filteredlen = size;
- while (f) {
- camel_mime_filter_filter(f->filter, p->filtered, p->filteredlen, presize,
- &p->filtered, &p->filteredlen, &presize);
- f = f->next;
- }
- }
- }
-
- size = MIN(n, p->filteredlen);
- memcpy(buffer, p->filtered, size);
- p->filteredlen -= size;
- p->filtered += size;
-
- return size;
-}
-
-static ssize_t
-do_write (CamelStream *stream, const char *buf, size_t n)
-{
- CamelStreamFilter *filter = (CamelStreamFilter *)stream;
- struct _CamelStreamFilterPrivate *p = _PRIVATE(filter);
- struct _filter *f;
- int presize;
- char *buffer = (char *)buf;
-
- p->last_was_read = FALSE;
-
- f = p->filters;
- presize = 0;
- while (f) {
- camel_mime_filter_filter(f->filter, buffer, n, presize, &buffer, &n, &presize);
- f = f->next;
- }
-
- return camel_stream_write(filter->source, buffer, n);
-}
-
-static int
-do_flush (CamelStream *stream)
-{
- CamelStreamFilter *filter = (CamelStreamFilter *)stream;
- struct _CamelStreamFilterPrivate *p = _PRIVATE(filter);
- struct _filter *f;
- char *buffer;
- int len, presize;
-
- if (p->last_was_read) {
- g_warning("Flushing a filter stream without writing to it");
- return 0;
- }
-
- buffer = "";
- len = 0;
- presize = 0;
- f = p->filters;
- while (f) {
- camel_mime_filter_complete(f->filter, buffer, len, presize, &buffer, &len, &presize);
- f = f->next;
- }
- if (len > 0 && camel_stream_write(filter->source, buffer, len) == -1)
- return -1;
- return camel_stream_flush(filter->source);
-}
-
-static int
-do_close (CamelStream *stream)
-{
- CamelStreamFilter *filter = (CamelStreamFilter *)stream;
- struct _CamelStreamFilterPrivate *p = _PRIVATE(filter);
-
- if (!p->last_was_read) {
- do_flush(stream);
- }
- return camel_stream_close(filter->source);
-}
-
-static gboolean
-do_eos (CamelStream *stream)
-{
- CamelStreamFilter *filter = (CamelStreamFilter *)stream;
- struct _CamelStreamFilterPrivate *p = _PRIVATE(filter);
-
- if (p->filteredlen > 0)
- return FALSE;
-
- return camel_stream_eos(filter->source);
-}
-
-static int
-do_reset (CamelStream *stream)
-{
- CamelStreamFilter *filter = (CamelStreamFilter *)stream;
- struct _CamelStreamFilterPrivate *p = _PRIVATE(filter);
- struct _filter *f;
-
- p->filteredlen = 0;
-
- /* and reset filters */
- f = p->filters;
- while (f) {
- camel_mime_filter_reset(f->filter);
- f = f->next;
- }
-
- return camel_stream_reset(filter->source);
-}
-
diff --git a/camel/camel-stream-filter.h b/camel/camel-stream-filter.h
deleted file mode 100644
index d0683135c7..0000000000
--- a/camel/camel-stream-filter.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_STREAM_FILTER_H
-#define _CAMEL_STREAM_FILTER_H
-
-#include <camel/camel-stream.h>
-#include <camel/camel-mime-filter.h>
-
-#define CAMEL_STREAM_FILTER(obj) CAMEL_CHECK_CAST (obj, camel_stream_filter_get_type (), CamelStreamFilter)
-#define CAMEL_STREAM_FILTER_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_stream_filter_get_type (), CamelStreamFilterClass)
-#define IS_CAMEL_STREAM_FILTER(obj) CAMEL_CHECK_TYPE (obj, camel_stream_filter_get_type ())
-
-typedef struct _CamelStreamFilterClass CamelStreamFilterClass;
-
-struct _CamelStreamFilter {
- CamelStream parent;
-
- CamelStream *source;
-
- struct _CamelStreamFilterPrivate *priv;
-};
-
-struct _CamelStreamFilterClass {
- CamelStreamClass parent_class;
-};
-
-guint camel_stream_filter_get_type (void);
-
-CamelStreamFilter *camel_stream_filter_new_with_stream (CamelStream *stream);
-
-int camel_stream_filter_add (CamelStreamFilter *filter, CamelMimeFilter *);
-void camel_stream_filter_remove (CamelStreamFilter *filter, int id);
-
-#endif /* ! _CAMEL_STREAM_FILTER_H */
diff --git a/camel/camel-stream-fs.c b/camel/camel-stream-fs.c
deleted file mode 100644
index 17c6b98e08..0000000000
--- a/camel/camel-stream-fs.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-stream-fs.c : file system based stream */
-
-/*
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include "camel-stream-fs.h"
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <string.h>
-
-static CamelSeekableStreamClass *parent_class = NULL;
-
-/* Returns the class for a CamelStreamFS */
-#define CSFS_CLASS(so) CAMEL_STREAM_FS_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static ssize_t stream_read (CamelStream *stream, char *buffer, size_t n);
-static ssize_t stream_write (CamelStream *stream, const char *buffer, size_t n);
-static int stream_flush (CamelStream *stream);
-static int stream_close (CamelStream *stream);
-static off_t stream_seek (CamelSeekableStream *stream, off_t offset,
- CamelStreamSeekPolicy policy);
-
-static void
-camel_stream_fs_class_init (CamelStreamFsClass *camel_stream_fs_class)
-{
- CamelSeekableStreamClass *camel_seekable_stream_class =
- CAMEL_SEEKABLE_STREAM_CLASS (camel_stream_fs_class);
- CamelStreamClass *camel_stream_class =
- CAMEL_STREAM_CLASS (camel_stream_fs_class);
-
- parent_class = CAMEL_SEEKABLE_STREAM_CLASS (camel_type_get_global_classfuncs (camel_seekable_stream_get_type ()));
-
- /* virtual method overload */
- camel_stream_class->read = stream_read;
- camel_stream_class->write = stream_write;
- camel_stream_class->flush = stream_flush;
- camel_stream_class->close = stream_close;
-
- camel_seekable_stream_class->seek = stream_seek;
-}
-
-static void
-camel_stream_fs_init (gpointer object, gpointer klass)
-{
- CamelStreamFs *stream = CAMEL_STREAM_FS (object);
-
- stream->fd = -1;
-}
-
-static void
-camel_stream_fs_finalize (CamelObject *object)
-{
- CamelStreamFs *stream_fs = CAMEL_STREAM_FS (object);
-
- if (stream_fs->fd != -1)
- close (stream_fs->fd);
-}
-
-
-CamelType
-camel_stream_fs_get_type (void)
-{
- static CamelType camel_stream_fs_type = CAMEL_INVALID_TYPE;
-
- if (camel_stream_fs_type == CAMEL_INVALID_TYPE) {
- camel_stream_fs_type = camel_type_register (camel_seekable_stream_get_type (), "CamelStreamFs",
- sizeof (CamelStreamFs),
- sizeof (CamelStreamFsClass),
- (CamelObjectClassInitFunc) camel_stream_fs_class_init,
- NULL,
- (CamelObjectInitFunc) camel_stream_fs_init,
- (CamelObjectFinalizeFunc) camel_stream_fs_finalize);
- }
-
- return camel_stream_fs_type;
-}
-
-/**
- * camel_stream_fs_new_with_fd:
- * @fd: a file descriptor
- *
- * Returns a stream associated with the given file descriptor.
- * When the stream is destroyed, the file descriptor will be closed.
- *
- * Return value: the stream
- **/
-CamelStream *
-camel_stream_fs_new_with_fd (int fd)
-{
- CamelStreamFs *stream_fs;
- off_t offset;
-
- stream_fs = CAMEL_STREAM_FS (camel_object_new (camel_stream_fs_get_type ()));
- stream_fs->fd = fd;
- offset = lseek (fd, 0, SEEK_CUR);
- if (offset == -1)
- offset = 0;
- CAMEL_SEEKABLE_STREAM (stream_fs)->position = offset;
-
- return CAMEL_STREAM (stream_fs);
-}
-
-/**
- * camel_stream_fs_new_with_fd_and_bounds:
- * @fd: a file descriptor
- * @start: the first valid position in the file
- * @end: the first invalid position in the file, or CAMEL_STREAM_UNBOUND
- *
- * Returns a stream associated with the given file descriptor and bounds.
- * When the stream is destroyed, the file descriptor will be closed.
- *
- * Return value: the stream
- **/
-CamelStream *
-camel_stream_fs_new_with_fd_and_bounds (int fd, off_t start, off_t end)
-{
- CamelStream *stream;
-
- stream = camel_stream_fs_new_with_fd (fd);
- camel_seekable_stream_set_bounds (CAMEL_SEEKABLE_STREAM (stream), start, end);
-
- return stream;
-}
-
-/**
- * camel_stream_fs_new_with_name:
- * @name: a local filename
- * @flags: flags as in open(2)
- * @mode: a file mode
- *
- * Creates a new CamelStream corresponding to the named file, flags,
- * and mode.
- *
- * Return value: the stream, or #NULL on error.
- **/
-CamelStream *
-camel_stream_fs_new_with_name (const char *name, int flags, mode_t mode)
-{
- int fd;
-
- fd = open (name, flags, mode);
- if (fd == -1) {
- return NULL;
- }
-
- return camel_stream_fs_new_with_fd (fd);
-}
-
-/**
- * camel_stream_fs_new_with_name_and_bounds:
- * @name: a local filename
- * @flags: flags as in open(2)
- * @mode: a file mode
- * @start: the first valid position in the file
- * @end: the first invalid position in the file, or CAMEL_STREAM_UNBOUND
- *
- * Creates a new CamelStream corresponding to the given arguments.
- *
- * Return value: the stream, or NULL on error.
- **/
-CamelStream *
-camel_stream_fs_new_with_name_and_bounds (const char *name, int flags,
- mode_t mode, off_t start, off_t end)
-{
- CamelStream *stream;
-
- stream = camel_stream_fs_new_with_name (name, flags, mode);
- if (stream == NULL)
- return NULL;
-
- camel_seekable_stream_set_bounds (CAMEL_SEEKABLE_STREAM (stream),
- start, end);
-
- return stream;
-}
-
-
-static ssize_t
-stream_read (CamelStream *stream, char *buffer, size_t n)
-{
- CamelStreamFs *stream_fs = CAMEL_STREAM_FS (stream);
- CamelSeekableStream *seekable = CAMEL_SEEKABLE_STREAM (stream);
- ssize_t nread;
-
- if (seekable->bound_end != CAMEL_STREAM_UNBOUND)
- n = MIN (seekable->bound_end - seekable->position, n);
-
- do {
- nread = read (stream_fs->fd, buffer, n);
- } while (nread == -1 && errno == EINTR);
-
- if (nread > 0)
- seekable->position += nread;
- else if (nread == 0)
- stream->eos = TRUE;
-
- return nread;
-}
-
-static ssize_t
-stream_write (CamelStream *stream, const char *buffer, size_t n)
-{
- CamelStreamFs *stream_fs = CAMEL_STREAM_FS (stream);
- CamelSeekableStream *seekable = CAMEL_SEEKABLE_STREAM (stream);
- ssize_t v, written = 0;
-
- if (seekable->bound_end != CAMEL_STREAM_UNBOUND)
- n = MIN (seekable->bound_end - seekable->position, n);
-
- do {
- v = write (stream_fs->fd, buffer, n);
- if (v > 0)
- written += v;
- } while (v == -1 && errno == EINTR);
-
- if (written > 0)
- seekable->position += written;
- else if (v == -1)
- return -1;
-
- return written;
-}
-
-static int
-stream_flush (CamelStream *stream)
-{
- return fsync(((CamelStreamFs *)stream)->fd);
-}
-
-static int
-stream_close (CamelStream *stream)
-{
- return close(((CamelStreamFs *)stream)->fd);
-}
-
-static off_t
-stream_seek (CamelSeekableStream *stream, off_t offset, CamelStreamSeekPolicy policy)
-{
- CamelStreamFs *stream_fs = CAMEL_STREAM_FS (stream);
- off_t real = 0;
-
- switch (policy) {
- case CAMEL_STREAM_SET:
- real = offset;
- break;
- case CAMEL_STREAM_CUR:
- real = stream->position + offset;
- break;
- case CAMEL_STREAM_END:
- if (stream->bound_end != CAMEL_STREAM_UNBOUND) {
- real = lseek(stream_fs->fd, offset, SEEK_END);
- if (real != -1)
- stream->position = real;
- return real;
- }
- real = stream->bound_end + offset;
- break;
- }
-
- if (stream->bound_end != CAMEL_STREAM_UNBOUND)
- real = MIN (real, stream->bound_end);
- real = MAX (real, stream->bound_start);
-
- real = lseek(stream_fs->fd, real, SEEK_SET);
- if (real == -1)
- return -1;
-
- if (real != stream->position && ((CamelStream *)stream)->eos)
- ((CamelStream *)stream)->eos = FALSE;
-
- stream->position = real;
-
- return real;
-}
diff --git a/camel/camel-stream-fs.h b/camel/camel-stream-fs.h
deleted file mode 100644
index ea403f584f..0000000000
--- a/camel/camel-stream-fs.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-stream-fs.h :stream based on unix filesystem */
-
-/*
- * Author:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_STREAM_FS_H
-#define CAMEL_STREAM_FS_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-seekable-stream.h>
-
-/* for open flags */
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#define CAMEL_STREAM_FS_TYPE (camel_stream_fs_get_type ())
-#define CAMEL_STREAM_FS(obj) (CAMEL_CHECK_CAST((obj), CAMEL_STREAM_FS_TYPE, CamelStreamFs))
-#define CAMEL_STREAM_FS_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_STREAM_FS_TYPE, CamelStreamFsClass))
-#define CAMEL_IS_STREAM_FS(o) (CAMEL_CHECK_TYPE((o), CAMEL_STREAM_FS_TYPE))
-
-struct _CamelStreamFs
-{
- CamelSeekableStream parent_object;
-
- int fd; /* file descriptor on the underlying file */
-};
-
-typedef struct {
- CamelSeekableStreamClass parent_class;
-
-} CamelStreamFsClass;
-
-/* Standard Camel function */
-CamelType camel_stream_fs_get_type (void);
-
-/* public methods */
-CamelStream * camel_stream_fs_new_with_name (const char *name, int flags, mode_t mode);
-CamelStream * camel_stream_fs_new_with_name_and_bounds (const char *name, int flags, mode_t mode,
- off_t start, off_t end);
-
-CamelStream * camel_stream_fs_new_with_fd (int fd);
-CamelStream * camel_stream_fs_new_with_fd_and_bounds (int fd, off_t start, off_t end);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_STREAM_FS_H */
diff --git a/camel/camel-stream-mem.c b/camel/camel-stream-mem.c
deleted file mode 100644
index 77941894b7..0000000000
--- a/camel/camel-stream-mem.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-stream-mem.c: memory buffer based stream */
-
-/*
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include "camel-stream-mem.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-
-static CamelSeekableStreamClass *parent_class = NULL;
-
-/* Returns the class for a CamelStreamMem */
-#define CSM_CLASS(so) CAMEL_STREAM_MEM_CLASS(CAMEL_OBJECT_GET_CLASS(so))
-
-static ssize_t stream_read (CamelStream *stream, char *buffer, size_t n);
-static ssize_t stream_write (CamelStream *stream, const char *buffer, size_t n);
-static gboolean stream_eos (CamelStream *stream);
-static off_t stream_seek (CamelSeekableStream *stream, off_t offset,
- CamelStreamSeekPolicy policy);
-
-static void camel_stream_mem_finalize (CamelObject *object);
-
-static void
-camel_stream_mem_class_init (CamelStreamMemClass *camel_stream_mem_class)
-{
- CamelSeekableStreamClass *camel_seekable_stream_class =
- CAMEL_SEEKABLE_STREAM_CLASS (camel_stream_mem_class);
- CamelStreamClass *camel_stream_class =
- CAMEL_STREAM_CLASS (camel_stream_mem_class);
-
- parent_class = CAMEL_SEEKABLE_STREAM_CLASS( camel_type_get_global_classfuncs( CAMEL_SEEKABLE_STREAM_TYPE ) );
-
- /* virtual method overload */
- camel_stream_class->read = stream_read;
- camel_stream_class->write = stream_write;
- camel_stream_class->eos = stream_eos;
-
- camel_seekable_stream_class->seek = stream_seek;
-}
-
-static void
-camel_stream_mem_init (CamelObject *object)
-{
- CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (object);
-
- stream_mem->owner = FALSE;
- stream_mem->buffer = 0;
-}
-
-CamelType
-camel_stream_mem_get_type (void)
-{
- static CamelType camel_stream_mem_type = CAMEL_INVALID_TYPE;
-
- if (camel_stream_mem_type == CAMEL_INVALID_TYPE) {
- camel_stream_mem_type = camel_type_register( CAMEL_SEEKABLE_STREAM_TYPE,
- "CamelStreamMem",
- sizeof( CamelStreamMem ),
- sizeof( CamelStreamMemClass ),
- (CamelObjectClassInitFunc) camel_stream_mem_class_init,
- NULL,
- (CamelObjectInitFunc) camel_stream_mem_init,
- (CamelObjectFinalizeFunc) camel_stream_mem_finalize );
- }
-
- return camel_stream_mem_type;
-}
-
-
-CamelStream *
-camel_stream_mem_new (void)
-{
- return camel_stream_mem_new_with_byte_array (g_byte_array_new ());
-}
-
-CamelStream *
-camel_stream_mem_new_with_buffer (const char *buffer, size_t len)
-{
- GByteArray *ba;
-
- ba = g_byte_array_new ();
- g_byte_array_append (ba, (const guint8 *)buffer, len);
- return camel_stream_mem_new_with_byte_array (ba);
-}
-
-CamelStream *
-camel_stream_mem_new_with_byte_array (GByteArray *byte_array)
-{
- CamelStreamMem *stream_mem;
-
- stream_mem = CAMEL_STREAM_MEM( camel_object_new (CAMEL_STREAM_MEM_TYPE) );
- stream_mem->buffer = byte_array;
- stream_mem->owner = TRUE;
-
- return CAMEL_STREAM (stream_mem);
-}
-
-/* note: with these functions the caller is the 'owner' of the buffer */
-void camel_stream_mem_set_byte_array (CamelStreamMem *s, GByteArray *buffer)
-{
- if (s->buffer && s->owner)
- g_byte_array_free(s->buffer, TRUE);
- s->owner = FALSE;
- s->buffer = buffer;
-}
-
-void camel_stream_mem_set_buffer (CamelStreamMem *s, const char *buffer,
- size_t len)
-{
- GByteArray *ba;
-
- ba = g_byte_array_new ();
- g_byte_array_append (ba, (const guint8 *)buffer, len);
- camel_stream_mem_set_byte_array(s, ba);
-}
-
-static void
-camel_stream_mem_finalize (CamelObject *object)
-{
- CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (object);
-
- if (stream_mem->buffer && stream_mem->owner)
- g_byte_array_free (stream_mem->buffer, TRUE);
-
- /* Will be called automagically in the Camel Type System!
- * Wheeee!
- * G_TK_OBJECT_CLASS (parent_class)->finalize (object);
- */
-}
-
-static ssize_t
-stream_read (CamelStream *stream, char *buffer, size_t n)
-{
- CamelStreamMem *camel_stream_mem = CAMEL_STREAM_MEM (stream);
- CamelSeekableStream *seekable = CAMEL_SEEKABLE_STREAM (stream);
- ssize_t nread;
-
- if (seekable->bound_end != CAMEL_STREAM_UNBOUND)
- n = MIN(seekable->bound_end - seekable->position, n);
-
- nread = MIN (n, camel_stream_mem->buffer->len - seekable->position);
- if (nread > 0) {
- memcpy (buffer, camel_stream_mem->buffer->data +
- seekable->position, nread);
- seekable->position += nread;
- } else
- nread = -1;
-
- return nread;
-}
-
-static ssize_t
-stream_write (CamelStream *stream, const char *buffer, size_t n)
-{
- CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (stream);
- CamelSeekableStream *seekable = CAMEL_SEEKABLE_STREAM (stream);
- ssize_t nwrite = n;
-
- if (seekable->bound_end != CAMEL_STREAM_UNBOUND)
- nwrite = MIN(seekable->bound_end - seekable->position, n);
-
-#ifndef NO_WARNINGS
-#warning "g_byte_arrays use g_malloc and so are totally unsuitable for this object"
-#endif
- if (seekable->position == stream_mem->buffer->len) {
- stream_mem->buffer =
- g_byte_array_append (stream_mem->buffer, (const guint8 *)buffer, nwrite);
- } else {
- g_byte_array_set_size (stream_mem->buffer,
- nwrite + stream_mem->buffer->len);
- memcpy (stream_mem->buffer->data + seekable->position, buffer, nwrite);
- }
- seekable->position += nwrite;
-
- return nwrite;
-}
-
-static gboolean
-stream_eos (CamelStream *stream)
-{
- CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (stream);
- CamelSeekableStream *seekable_stream = CAMEL_SEEKABLE_STREAM (stream);
-
- return stream_mem->buffer->len <= seekable_stream->position;
-}
-
-static off_t
-stream_seek (CamelSeekableStream *stream, off_t offset,
- CamelStreamSeekPolicy policy)
-{
- off_t position;
- CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (stream);
-
- switch (policy) {
- case CAMEL_STREAM_SET:
- position = offset;
- break;
- case CAMEL_STREAM_CUR:
- position = stream->position + offset;
- break;
- case CAMEL_STREAM_END:
- position = (stream_mem->buffer)->len + offset;
- break;
- default:
- position = offset;
- break;
- }
-
- if (stream->bound_end != CAMEL_STREAM_UNBOUND)
- position = MIN (position, stream->bound_end);
- if (stream->bound_start != CAMEL_STREAM_UNBOUND)
- position = MAX (position, 0);
- else
- position = MAX (position, stream->bound_start);
-
- if (position > stream_mem->buffer->len) {
- int oldlen = stream_mem->buffer->len;
- g_byte_array_set_size (stream_mem->buffer, position);
- memset (stream_mem->buffer->data + oldlen, 0,
- position - oldlen);
- }
-
- stream->position = position;
-
- return position;
-}
diff --git a/camel/camel-stream-mem.h b/camel/camel-stream-mem.h
deleted file mode 100644
index b27503efb6..0000000000
--- a/camel/camel-stream-mem.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-stream-mem.h: stream based on memory buffer */
-
-/*
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_STREAM_MEM_H
-#define CAMEL_STREAM_MEM_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-seekable-stream.h>
-#include <sys/types.h>
-
-#define CAMEL_STREAM_MEM_TYPE (camel_stream_mem_get_type ())
-#define CAMEL_STREAM_MEM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_STREAM_MEM_TYPE, CamelStreamMem))
-#define CAMEL_STREAM_MEM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_STREAM_MEM_TYPE, CamelStreamMemClass))
-#define CAMEL_IS_STREAM_MEM(o) (CAMEL_CHECK_TYPE((o), CAMEL_STREAM_MEM_TYPE))
-
-typedef struct _CamelStreamMemClass CamelStreamMemClass;
-
-struct _CamelStreamMem {
- CamelSeekableStream parent_object;
-
- gboolean owner; /* do we own the buffer? */
- GByteArray *buffer;
-};
-
-struct _CamelStreamMemClass {
- CamelSeekableStreamClass parent_class;
-
- /* Virtual methods */
-};
-
-/* Standard Camel function */
-CamelType camel_stream_mem_get_type (void);
-
-/* public methods */
-CamelStream *camel_stream_mem_new (void);
-CamelStream *camel_stream_mem_new_with_byte_array (GByteArray *buffer);
-CamelStream *camel_stream_mem_new_with_buffer (const char *buffer, size_t len);
-
-/* these are really only here for implementing classes */
-void camel_stream_mem_set_byte_array (CamelStreamMem *, GByteArray *buffer);
-void camel_stream_mem_set_buffer (CamelStreamMem *, const char *buffer, size_t len);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_STREAM_MEM_H */
diff --git a/camel/camel-stream.c b/camel/camel-stream.c
deleted file mode 100644
index f649494b2d..0000000000
--- a/camel/camel-stream.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-stream.c : abstract class for a stream */
-
-/*
- * Author:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include "camel-stream.h"
-
-static CamelObjectClass *parent_class = NULL;
-
-/* Returns the class for a CamelStream */
-#define CS_CLASS(so) CAMEL_STREAM_CLASS(CAMEL_OBJECT_GET_CLASS(so))
-
-static int stream_flush (CamelStream *stream);
-static int stream_close (CamelStream *stream);
-static gboolean stream_eos (CamelStream *stream);
-
-
-static void
-camel_stream_class_init (CamelStreamClass *camel_stream_class)
-{
- parent_class = camel_type_get_global_classfuncs( CAMEL_OBJECT_TYPE );
-
- /* virtual method definition */
- camel_stream_class->flush = stream_flush;
- camel_stream_class->close = stream_close;
- camel_stream_class->eos = stream_eos;
-}
-
-CamelType
-camel_stream_get_type (void)
-{
- static CamelType camel_stream_type = CAMEL_INVALID_TYPE;
-
- if (camel_stream_type == CAMEL_INVALID_TYPE) {
- camel_stream_type = camel_type_register( CAMEL_OBJECT_TYPE,
- "CamelStream",
- sizeof( CamelStream ),
- sizeof( CamelStreamClass ),
- (CamelObjectClassInitFunc) camel_stream_class_init,
- NULL,
- NULL,
- NULL );
- }
-
- return camel_stream_type;
-}
-
-/**
- * camel_stream_read:
- * @stream: a CamelStream.
- * @buffer: buffer where bytes pulled from the stream are stored.
- * @n: max number of bytes to read.
- *
- * Read at most @n bytes from the @stream object and stores them
- * in the buffer pointed at by @buffer.
- *
- * Return value: number of bytes actually read, or -1 on error and
- * set errno.
- **/
-ssize_t
-camel_stream_read (CamelStream *stream, char *buffer, size_t n)
-{
- g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1);
- g_return_val_if_fail (n == 0 || buffer, -1);
-
- return CS_CLASS (stream)->read (stream, buffer, n);
-}
-
-/**
- * camel_stream_write:
- * @stream: a CamelStream object.
- * @buffer: buffer to write.
- * @n: number of bytes to write
- *
- * Write @n bytes from the buffer pointed at by @buffer into @stream.
- *
- * Return value: the number of bytes actually written to the stream,
- * or -1 on error.
- **/
-ssize_t
-camel_stream_write (CamelStream *stream, const char *buffer, size_t n)
-{
- g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1);
- g_return_val_if_fail (n == 0 || buffer, -1);
-
- return CS_CLASS (stream)->write (stream, buffer, n);
-}
-
-
-static int
-stream_flush (CamelStream *stream)
-{
- /* nothing */
- return 0;
-}
-
-/**
- * camel_stream_flush:
- * @stream: a CamelStream object
- *
- * Flushes the contents of the stream to its backing store. Only meaningful
- * on writable streams.
- *
- * Return value: -1 on error.
- **/
-int
-camel_stream_flush (CamelStream *stream)
-{
- g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1);
-
- return CS_CLASS (stream)->flush (stream);
-}
-
-
-static int
-stream_close (CamelStream *stream)
-{
- /* nothing */
- return 0;
-}
-
-/**
- * camel_stream_close:
- * @stream:
- *
- * Close a stream.
- *
- * Return value: -1 on error.
- **/
-int
-camel_stream_close (CamelStream *stream)
-{
- g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1);
-
- return CS_CLASS (stream)->close (stream);
-}
-
-
-static gboolean
-stream_eos (CamelStream *stream)
-{
- return stream->eos;
-}
-
-/**
- * camel_stream_eos:
- * @stream: a CamelStream object
- *
- * Test if there are bytes left to read on the @stream object.
- *
- * Return value: %TRUE if all the contents on the stream has been read, or
- * %FALSE if information is still available.
- **/
-gboolean
-camel_stream_eos (CamelStream *stream)
-{
- g_return_val_if_fail (CAMEL_IS_STREAM (stream), TRUE);
-
- return CS_CLASS (stream)->eos (stream);
-}
-
-
-/**
- * camel_stream_reset: reset a stream
- * @stream: the stream object
- *
- * Reset a stream. That is, put it in a state where it can be read
- * from the beginning again. Not all streams in Camel are seekable,
- * but they must all be resettable.
- *
- * Return value: -1 on error.
- **/
-int
-camel_stream_reset (CamelStream *stream)
-{
- g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1);
-
- return CS_CLASS (stream)->reset (stream);
-}
-
-/***************** Utility functions ********************/
-
-/**
- * camel_stream_write_string:
- * @stream: a stream object
- * @string: a string
- *
- * Writes the string to the stream.
- *
- * Return value: the number of characters output, -1 on error.
- **/
-ssize_t
-camel_stream_write_string (CamelStream *stream, const char *string)
-{
- return camel_stream_write (stream, string, strlen (string));
-}
-
-/**
- * camel_stream_printf:
- * @stream: a stream object
- * @fmt: a printf-style format string
- *
- * This printfs the given data to @stream.
- *
- * Return value: the number of characters output, -1 on error.
- **/
-ssize_t
-camel_stream_printf (CamelStream *stream, const char *fmt, ... )
-{
- va_list args;
- char *string;
- int ret;
-
- g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1);
-
- va_start (args, fmt);
- string = g_strdup_vprintf (fmt, args);
- va_end (args);
-
- if (!string)
- return -1;
-
- ret = camel_stream_write (stream, string, strlen (string));
- g_free (string);
- return ret;
-}
-
-/**
- * camel_stream_write_to_stream:
- * @stream: Source CamelStream.
- * @output_stream: Destination CamelStream.
- *
- * Write all of a stream (until eos) into another stream, in a blocking
- * fashion.
- *
- * Return value: Returns -1 on error, or the number of bytes succesfully
- * copied across streams.
- **/
-ssize_t
-camel_stream_write_to_stream (CamelStream *stream, CamelStream *output_stream)
-{
- char tmp_buf[4096];
- ssize_t total = 0;
- ssize_t nb_read;
- ssize_t nb_written;
-
- g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1);
- g_return_val_if_fail (CAMEL_IS_STREAM (output_stream), -1);
-
- while (!camel_stream_eos (stream)) {
- nb_read = camel_stream_read (stream, tmp_buf, sizeof (tmp_buf));
- if (nb_read < 0)
- return -1;
- else if (nb_read > 0) {
- nb_written = 0;
-
- while (nb_written < nb_read) {
- ssize_t len = camel_stream_write (output_stream, tmp_buf + nb_written,
- nb_read - nb_written);
- if (len < 0)
- return -1;
- nb_written += len;
- }
- total += nb_written;
- }
- }
- return total;
-}
diff --git a/camel/camel-stream.h b/camel/camel-stream.h
deleted file mode 100644
index dec4e638e1..0000000000
--- a/camel/camel-stream.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-stream.h : class for an abstract stream */
-
-/*
- * Author:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_STREAM_H
-#define CAMEL_STREAM_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-object.h>
-#include <stdarg.h>
-#include <unistd.h>
-
-#define CAMEL_STREAM_TYPE (camel_stream_get_type ())
-#define CAMEL_STREAM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_STREAM_TYPE, CamelStream))
-#define CAMEL_STREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_STREAM_TYPE, CamelStreamClass))
-#define CAMEL_IS_STREAM(o) (CAMEL_CHECK_TYPE((o), CAMEL_STREAM_TYPE))
-
-struct _CamelStream
-{
- CamelObject parent_object;
-
- gboolean eos;
-};
-
-typedef struct {
- CamelObjectClass parent_class;
-
- /* Virtual methods */
-
- ssize_t (*read) (CamelStream *stream, char *buffer, size_t n);
- ssize_t (*write) (CamelStream *stream, const char *buffer, size_t n);
- int (*close) (CamelStream *stream);
- int (*flush) (CamelStream *stream);
- gboolean (*eos) (CamelStream *stream);
- int (*reset) (CamelStream *stream);
-
-} CamelStreamClass;
-
-/* Standard Camel function */
-CamelType camel_stream_get_type (void);
-
-/* public methods */
-ssize_t camel_stream_read (CamelStream *stream, char *buffer, size_t n);
-ssize_t camel_stream_write (CamelStream *stream, const char *buffer, size_t n);
-int camel_stream_flush (CamelStream *stream);
-int camel_stream_close (CamelStream *stream);
-gboolean camel_stream_eos (CamelStream *stream);
-int camel_stream_reset (CamelStream *stream);
-
-/* utility macros and funcs */
-ssize_t camel_stream_write_string (CamelStream *stream, const char *string);
-ssize_t camel_stream_printf (CamelStream *stream, const char *fmt, ... ) G_GNUC_PRINTF (2, 3);
-ssize_t camel_stream_vprintf (CamelStream *stream, const char *fmt, va_list ap);
-
-/* Write a whole stream to another stream, until eof or error on
- * either stream.
- */
-ssize_t camel_stream_write_to_stream (CamelStream *stream, CamelStream *output_stream);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_STREAM_H */
diff --git a/camel/camel-thread-proxy.c b/camel/camel-thread-proxy.c
deleted file mode 100644
index 9553499e8f..0000000000
--- a/camel/camel-thread-proxy.c
+++ /dev/null
@@ -1,514 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-folder-pt-proxy.c : proxy folder using posix threads */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-
-
-#include <config.h>
-#include "camel-marshal-utils.h"
-#include "camel-thread-proxy.h"
-#include <pthread.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-
-
-/* vocabulary:
- * operation: commanded by the main thread, executed by the child thread
- * callback: commanded by the child thread, generally when an operation is
- * completed. Executed in the main thread,
- */
-
-/* needed for proper casts of async funcs when
- * calling pthreads_create
- */
-typedef void * (*thread_call_func) (void *);
-
-/* forward declarations */
-static gboolean
-_thread_notification_catch (GIOChannel *source,
- GIOCondition condition,
- gpointer data);
-
-static void
-_notify_availability (CamelThreadProxy *proxy, gchar op_name);
-
-static int
-_init_notify_system (CamelThreadProxy *proxy);
-
-
-
-/**
- * camel_thread_proxy_new: create a new proxy object
- *
- * Create a new proxy object. This proxy object can be used
- * to run async operations and this operations can trigger
- * callbacks. It can also be used to proxy signals.
- *
- * Return value: The newly created proxy object
- **/
-CamelThreadProxy *
-camel_thread_proxy_new (void)
-{
- CamelThreadProxy *proxy;
-
- proxy = g_new (CamelThreadProxy, 1);
- if (!proxy)
- return NULL;
-
- proxy->server_op_queue = camel_op_queue_new ();
- proxy->client_op_queue = camel_op_queue_new ();
- proxy->signal_data_cond = g_cond_new();
- proxy->signal_data_mutex = g_mutex_new();
- if (_init_notify_system (proxy) < 0) {
- g_free (proxy);
- return NULL;
- }
- return proxy;
-}
-
-
-/**
- * camel_thread_proxy_free: free a proxy object
- * @proxy: proxy object to free
- *
- * free a proxy object
- **/
-void
-camel_thread_proxy_free (CamelThreadProxy *proxy)
-{
- g_cond_free (proxy->signal_data_cond);
- g_mutex_free (proxy->signal_data_mutex);
- camel_op_queue_free (proxy->server_op_queue);
- camel_op_queue_free (proxy->client_op_queue);
-}
-
-
-
-
-
-/* Operations handling */
-
-
-/**
- * _op_run_free_notify:
- * @folder: folder to notify when the operation is completed.
- * @op: operation to run.
- *
- * run an operation, free the operation field
- * and then notify the main thread of the op
- * completion.
- *
- * this routine is intended to be called
- * in a new thread (in _run_next_op_in_thread)
- *
- **/
-void
-_op_run_free_and_notify (CamelOp *op)
-{
- CamelThreadProxy *th_proxy;
-
- camel_op_run (op);
- camel_op_free (op);
- th_proxy = camel_op_get_user_data (op);
- _notify_availability (th_proxy, 'a');
-}
-
-
-/**
- * _run_next_op_in_thread:
- * @proxy_object:
- *
- * run the next operation pending in the proxy
- * operation queue
- **/
-static void
-_run_next_op_in_thread (CamelThreadProxy *proxy)
-{
- CamelOp *op;
- CamelOpQueue *server_op_queue;
- pthread_t thread;
-
- server_op_queue = proxy->server_op_queue;
- /* get the next pending operation */
- op = camel_op_queue_pop_op (server_op_queue);
- if (!op) {
- camel_op_queue_set_service_availability (server_op_queue, TRUE);
- return;
- }
-
- /* run the operation in a child thread */
- pthread_create (&thread, NULL, (thread_call_func) _op_run_free_and_notify, op);
-}
-
-
-
-/**
- * camel_thread_proxy_push_op: push an operation in the proxy operation queue
- * @proxy: proxy object
- * @op: operation to push in the execution queue
- *
- * if no thread is currently running, executes the
- * operation directly, otherwise push the operation
- * in the proxy operation queue.
- **/
-void
-camel_thread_proxy_push_op (CamelThreadProxy *proxy, CamelOp *op)
-{
- CamelOpQueue *server_op_queue;
-
- g_assert (proxy);
- server_op_queue = proxy->server_op_queue;
-
- /* put the proxy object in the user data
- so that it can be notified when the
- operation is completed */
- camel_op_set_user_data (op, (gpointer)proxy);
-
- /* get next operation */
- camel_op_queue_push_op (server_op_queue, op);
-
- if (camel_op_queue_get_service_availability (server_op_queue)) {
- /* no thread is currently running, run
- * the next operation. */
- camel_op_queue_set_service_availability (server_op_queue, FALSE);
- /* when the operation is completed in the
- child thread the main thread gets
- notified and executes next operation
- (see _thread_notification_catch, case 'a')
- so there is no need to set the service
- availability to FALSE except here
- */
- _run_next_op_in_thread (proxy);
- }
-}
-/**
- * _op_run_and_free: Run an operation and free it
- * @op: Operation object
- *
- * Run an operation object in the current thread
- * and free it.
- **/
-static void
-_op_run_and_free (CamelOp *op)
-{
- camel_op_run (op);
- camel_op_free (op);
-}
-
-
-
-
-
-
-/* Callbacks handling */
-
-/**
- * _run_next_cb: Run next callback pending in a proxy object
- * @proxy: Proxy object
- *
- * Run next callback in the callback queue of a proxy object
- **/
-static void
-_run_next_cb (CamelThreadProxy *proxy)
-{
- CamelOp *op;
- CamelOpQueue *client_op_queue;
-
- client_op_queue = proxy->client_op_queue;
-
- /* get the next pending operation */
- op = camel_op_queue_pop_op (client_op_queue);
- if (!op) return;
-
- /* run the operation in the main thread */
- _op_run_and_free (op);
-}
-
-
-/**
- * camel_thread_proxy_push_cb: push a callback in the client queue
- * @proxy: proxy object concerned by the callback
- * @cb: callback to push
- *
- * Push an operation in the client queue, ie the queue
- * containing the operations (callbacks) intended to be
- * executed in the main thread.
- **/
-void
-camel_thread_proxy_push_cb (CamelThreadProxy *proxy, CamelOp *cb)
-{
- CamelOpQueue *client_op_queue;
-
- client_op_queue = proxy->client_op_queue;
-
- /* put the proxy object in the user data
- so that it can be notified when the
- operation is completed */
- camel_op_set_user_data (cb, (gpointer)proxy);
-
- /* push the callback in the client queue */
- camel_op_queue_push_op (client_op_queue, cb);
-
- /* tell the main thread a new callback is there */
- _notify_availability (proxy, 'c');
-}
-
-
-
-/**
- * _init_notify_system: set the notify channel up
- * @proxy: proxy object
- *
- * called once to set the notification channel up
- **/
-static int
-_init_notify_system (CamelThreadProxy *proxy)
-{
- int filedes[2];
-
- /* set up the notification channel */
- if (pipe (filedes) < 0) {
- g_warning ("could not create pipe in "
- "CamelThreadProxy::_init_notify_system\n");
- return -1;
- }
-
-
- proxy->pipe_client_fd = filedes [0];
- proxy->pipe_server_fd = filedes [1];
- proxy->notify_source = g_io_channel_unix_new (filedes [0]);
- proxy->notify_channel = g_io_channel_unix_new (filedes [1]);
-
- /* the _thread_notification_catch function
- * will be called in the main thread when the
- * child thread writes some data in the channel */
- g_io_add_watch (proxy->notify_source, G_IO_IN,
- _thread_notification_catch,
- proxy);
-
- return 1;
-}
-
-/**
- * _notify_availability: notify the main thread from an event
- * @proxy: proxy object
- * @op_name: operation name
- *
- * called by child thread to notify the main
- * thread something is available for him.
- * What this thing is depends on @op_name:
- *
- * 'a' : thread available. That means the thread is ready
- * to process an operation.
- * 's' : a signal is available. Used by the signal proxy.
- *
- */
-static void
-_notify_availability (CamelThreadProxy *proxy, gchar op_name)
-{
- GIOChannel *notification_channel;
- guint bytes_written;
-
- notification_channel = proxy->notify_channel;
-
- do {
- /* the write operation will trigger the
- * watch on the main thread side */
- g_io_channel_write (notification_channel,
- &op_name,
- 1,
- &bytes_written);
- } while (bytes_written < 1);
-}
-
-
-
-/* signal proxying */
-
-
-
-/**
- * _signal_marshaller_server_side: called in the child thread to proxy a signal
- * @object:
- * @data:
- * @n_args:
- * @args:
- *
- *
- **/
-static void
-_signal_marshaller_server_side (GtkObject *object,
- gpointer data,
- guint n_args,
- GtkArg *args)
-{
- CamelThreadProxy *proxy;
- guint signal_id;
-
- proxy = CAMEL_THREAD_PROXY (gtk_object_get_data (object, "__proxy__"));
- signal_id = (guint)data;
- g_assert (proxy);
-
- g_mutex_lock (proxy->signal_data_mutex);
-
- /* we are going to wait for the main client thread
- * to have emitted the last signal we asked him
- * to proxy.
- */
- while (proxy->signal_data.args)
- g_cond_wait (proxy->signal_data_cond,
- proxy->signal_data_mutex);
-
- proxy->signal_data.signal_id = signal_id;
- proxy->signal_data.args = args;
-
-
- g_mutex_unlock (proxy->signal_data_mutex);
-
- /* tell the main thread there is a signal pending */
- _notify_availability (proxy, 's');
-}
-
-
-static void
-_signal_marshaller_client_side (CamelThreadProxy *proxy)
-{
- g_mutex_lock (proxy->signal_data_mutex);
- g_assert (proxy->signal_data.args);
-
- /* emit the pending signal */
- gtk_signal_emitv (GTK_OBJECT (proxy),
- proxy->signal_data.signal_id,
- proxy->signal_data.args);
-
- proxy->signal_data.args = NULL;
-
- /* if waiting for the signal to be treated,
- * awake the client thread up
- */
- g_cond_signal (proxy->signal_data_cond);
- g_mutex_unlock (proxy->signal_data_mutex);
-}
-
-
-/**
- * camel_thread_proxy_add_signals: init the signal proxy
- * @proxy: proxy
- * @proxy_object: Proxy Gtk Object
- * @real_object: Real Gtk Object
- * @signal_to_proxy: NULL terminated array of signal name
- *
- * Add some signals to the list of signals to be
- * proxied by the proxy object.
- * The signals emitted by the real object in the child
- * thread are reemited by the proxy object in the
- * main thread.
- **/
-void
-camel_thread_proxy_add_signals (CamelThreadProxy *proxy,
- GtkObject *proxy_object,
- GtkObject *real_object,
- char *signal_to_proxy[])
-{
- guint i;
-
- for (i=0; signal_to_proxy[i]; i++) {
- /* connect the signal to the signal marshaller
- * user_data is the signal id */
- gtk_signal_connect_full (GTK_OBJECT (real_object),
- signal_to_proxy[i],
- NULL,
- _signal_marshaller_server_side,
- (gpointer)gtk_signal_lookup (signal_to_proxy[i],
- GTK_OBJECT_CLASS (real_object)->type),
- NULL,
- TRUE,
- FALSE);
- }
-}
-
-/**** catch notification from child thread ****/
-/**
- * _thread_notification_catch: call by glib loop when data is available on the thread io channel
- * @source:
- * @condition:
- * @data:
- *
- * called by watch set on the IO channel
- *
- * Return value: TRUE because we don't want the watch to be removed
- **/
-static gboolean
-_thread_notification_catch (GIOChannel *source,
- GIOCondition condition,
- gpointer data)
-{
- CamelThreadProxy *proxy = CAMEL_THREAD_PROXY (data);
- gchar op_name;
- guint bytes_read;
- GIOError error;
-
- error = g_io_channel_read (source,
- &op_name,
- 1,
- &bytes_read);
-
- while ((!error) && (bytes_read == 1)) {
-
- switch (op_name) {
- case 'a': /* the thread is OK for a new operation */
- _run_next_op_in_thread (proxy);
- break;
- case 's': /* there is a pending signal to proxy */
- _signal_marshaller_client_side (proxy);
- break;
- case 'c': /* there is a cb pending in the main thread */
- _run_next_cb (proxy);
- break;
- }
-
- error = g_io_channel_read (source,
- &op_name,
- 1,
- &bytes_read);
-
- }
-
- /* do not remove the io watch */
- return TRUE;
-}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/camel/camel-thread-proxy.h b/camel/camel-thread-proxy.h
deleted file mode 100644
index 050d8ed598..0000000000
--- a/camel/camel-thread-proxy.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-folder-pt-proxy.h : proxy folder using posix threads */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_THREAD_PROXY_H
-#define CAMEL_THREAD_PROXY_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-op-queue.h>
-
-#define CAMEL_THREAD_PROXY(o) (CamelThreadProxy *)(o)
-
-
-typedef struct {
- guint signal_id;
- GtkArg *args;
-} CamelThreadProxySignalData;
-
-
-typedef struct {
-
- GtkObject *real_object;
- GtkObject *proxy_object;
-
- CamelOpQueue *server_op_queue;
- CamelOpQueue *client_op_queue;
-
-
- gint pipe_client_fd;
- gint pipe_server_fd;
- GIOChannel *notify_source;
- GIOChannel *notify_channel;
-
- /* signal proxy */
- GMutex *signal_data_mutex;
- GCond *signal_data_cond;
- CamelThreadProxySignalData signal_data;
-
-} CamelThreadProxy;
-
-
-CamelThreadProxy *camel_thread_proxy_new (void);
-void camel_thread_proxy_free (CamelThreadProxy *proxy);
-
-void camel_thread_proxy_push_op (CamelThreadProxy *proxy, CamelOp *op);
-void camel_thread_proxy_push_cb (CamelThreadProxy *proxy, CamelOp *cb);
-
-void camel_thread_proxy_add_signals (CamelThreadProxy *proxy,
- GtkObject *proxy_object,
- GtkObject *real_object,
- char *signal_to_proxy[]);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_THREAD_PROXY_H */
-
-
diff --git a/camel/camel-transport.c b/camel/camel-transport.c
deleted file mode 100644
index ff07728f5f..0000000000
--- a/camel/camel-transport.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-transport.c : Abstract class for an email transport */
-
-/*
- *
- * Author :
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-#include <config.h>
-#include "camel-transport.h"
-#include "camel-exception.h"
-
-/* Returns the class for a CamelTransport */
-#define CT_CLASS(so) CAMEL_TRANSPORT_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-CamelType
-camel_transport_get_type (void)
-{
- static CamelType camel_transport_type = CAMEL_INVALID_TYPE;
-
- if (camel_transport_type == CAMEL_INVALID_TYPE) {
- camel_transport_type = camel_type_register (CAMEL_SERVICE_TYPE, "CamelTransport",
- sizeof (CamelTransport),
- sizeof (CamelTransportClass),
- NULL,
- NULL,
- NULL,
- NULL);
- }
-
- return camel_transport_type;
-}
-
-
-/**
- * camel_transport_can_send: Determine if a message is send-able on a transport
- * @transport: the transport
- * @message: the message
- *
- * Determines if a CamelMedium is of an appropriate subclass to send
- * via the given @transport. (Mail transports are not able to send
- * netnews articles, and vice versa.)
- *
- * Return value: TRUE or FALSE
- **/
-gboolean
-camel_transport_can_send (CamelTransport *transport, CamelMedium *message)
-{
- return CT_CLASS (transport)->can_send (transport, message);
-}
-
-/**
- * camel_transport_send: Send a message via a transport
- * @transport: the transport
- * @message: the message
- * @ex: a CamelException
- *
- * Sends the message to the recipients indicated in the message.
- *
- * Return value: success or failure.
- **/
-gboolean
-camel_transport_send (CamelTransport *transport, CamelMedium *message,
- CamelException *ex)
-{
- return CT_CLASS (transport)->send (transport, message, ex);
-}
-
-/**
- * camel_transport_send_to: Send a message non-standard recipients
- * @transport: the transport
- * @message: the message
- * @recipients: the recipients
- * @ex: a CamelException
- *
- * Sends the message to the given recipients, rather than to the
- * recipients indicated in the message.
- *
- * Return value: success or failure.
- **/
-gboolean
-camel_transport_send_to (CamelTransport *transport, CamelMedium *message,
- GList *recipients, CamelException *ex)
-{
- return CT_CLASS (transport)->send_to (transport, message,
- recipients, ex);
-}
diff --git a/camel/camel-transport.h b/camel/camel-transport.h
deleted file mode 100644
index 0b66bd8eac..0000000000
--- a/camel/camel-transport.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-transport.h : Abstract class for an email transport */
-
-/*
- *
- * Author :
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_TRANSPORT_H
-#define CAMEL_TRANSPORT_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-service.h>
-
-#define CAMEL_TRANSPORT_TYPE (camel_transport_get_type ())
-#define CAMEL_TRANSPORT(obj) (CAMEL_CHECK_CAST((obj), CAMEL_TRANSPORT_TYPE, CamelTransport))
-#define CAMEL_TRANSPORT_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_TRANSPORT_TYPE, CamelTransportClass))
-#define CAMEL_IS_TRANSPORT(o) (CAMEL_CHECK_TYPE((o), CAMEL_TRANSPORT_TYPE))
-
-
-struct _CamelTransport
-{
- CamelService parent_object;
-
-};
-
-
-
-typedef struct {
- CamelServiceClass parent_class;
-
- gboolean (*can_send) (CamelTransport *transport, CamelMedium *message);
- gboolean (*send) (CamelTransport *transport, CamelMedium *message,
- CamelException *ex);
- gboolean (*send_to) (CamelTransport *transport,
- CamelMedium *message, GList *recipients,
- CamelException *ex);
-} CamelTransportClass;
-
-
-/* public methods */
-gboolean camel_transport_can_send (CamelTransport *transport,
- CamelMedium *message);
-
-gboolean camel_transport_send (CamelTransport *transport,
- CamelMedium *message,
- CamelException *ex);
-
-gboolean camel_transport_send_to (CamelTransport *transport,
- CamelMedium *message,
- GList *recipients,
- CamelException *ex);
-
-/* Standard Camel function */
-CamelType camel_transport_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_TRANSPORT_H */
diff --git a/camel/camel-types.h b/camel/camel-types.h
deleted file mode 100644
index d6813cb863..0000000000
--- a/camel/camel-types.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_TYPES_H
-#define CAMEL_TYPES_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-typedef struct _CamelAddress CamelAddress;
-typedef struct _CamelDataWrapper CamelDataWrapper;
-typedef struct _CamelException CamelException;
-typedef struct _CamelFolder CamelFolder;
-typedef struct _CamelFolderSearch CamelFolderSearch;
-typedef struct _CamelFolderSummary CamelFolderSummary;
-typedef struct _CamelInternetAddress CamelInternetAddress;
-typedef struct _CamelMedium CamelMedium;
-typedef struct _CamelMimeFilter CamelMimeFilter;
-typedef struct _CamelMimeFilterBasic CamelMimeFilterBasic;
-typedef struct _CamelMimeFilterCharset CamelMimeFilterCharset;
-typedef struct _CamelMimeFilterIndex CamelMimeFilterIndex;
-typedef struct _CamelMimeFilterSave CamelMimeFilterSave;
-typedef struct _CamelMimeFilterCRLF CamelMimeFilterCRLF;
-typedef struct _CamelMimeMessage CamelMimeMessage;
-typedef struct _CamelMimeParser CamelMimeParser;
-typedef struct _CamelMimePart CamelMimePart;
-typedef struct _CamelMultipart CamelMultipart;
-typedef struct _CamelNewsAddress CamelNewsAddress;
-typedef struct _CamelSeekableStream CamelSeekableStream;
-typedef struct _CamelSeekableSubstream CamelSeekableSubstream;
-typedef struct _CamelService CamelService;
-typedef struct _CamelSession CamelSession;
-typedef struct _CamelSimpleDataWrapper CamelSimpleDataWrapper;
-typedef struct _CamelStore CamelStore;
-typedef struct _CamelStream CamelStream;
-typedef struct _CamelStreamBuffer CamelStreamBuffer;
-typedef struct _CamelStreamDataWrapper CamelStreamDataWrapper;
-typedef struct _CamelStreamFilter CamelStreamFilter;
-typedef struct _CamelStreamFs CamelStreamFs;
-typedef struct _CamelStreamMem CamelStreamMem;
-typedef struct _CamelTransport CamelTransport;
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_TYPES_H */
-
-
-
diff --git a/camel/camel-uid-cache.c b/camel/camel-uid-cache.c
deleted file mode 100644
index 2b5faddb91..0000000000
--- a/camel/camel-uid-cache.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-uid-cache.c: UID caching code. */
-
-/*
- * Authors:
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include "config.h"
-#include "camel-uid-cache.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-static void free_uid (gpointer key, gpointer value, gpointer data);
-static void maybe_write_uid (gpointer key, gpointer value, gpointer data);
-
-/**
- * camel_uid_cache_new:
- * @filename: path to load the cache from
- *
- * Creates a new UID cache, initialized from @filename. If @filename
- * doesn't already exist, the UID cache will be empty. Otherwise, if
- * it does exist but can't be read, the function will return %NULL.
- *
- * Return value: a new UID cache, or %NULL
- **/
-CamelUIDCache *
-camel_uid_cache_new (const char *filename)
-{
- CamelUIDCache *cache;
- struct stat st;
- char *buf, **uids;
- int fd, i;
-
- fd = open (filename, O_RDWR | O_CREAT, 0700);
- if (fd == -1)
- return NULL;
-
- if (fstat (fd, &st) != 0) {
- close (fd);
- return NULL;
- }
- buf = g_malloc (st.st_size + 1);
-
- if (read (fd, buf, st.st_size) == -1) {
- close (fd);
- g_free (buf);
- return NULL;
- }
- buf[st.st_size] = '\0';
-
- cache = g_new (CamelUIDCache, 1);
- cache->fd = fd;
- cache->level = 1;
- cache->uids = g_hash_table_new (g_str_hash, g_str_equal);
-
- uids = g_strsplit (buf, "\n", 0);
- g_free (buf);
- for (i = 0; uids[i]; i++) {
- g_hash_table_insert (cache->uids, uids[i],
- GINT_TO_POINTER (cache->level));
- }
- g_free (uids);
-
- return cache;
-}
-
-/**
- * camel_uid_cache_save:
- * @cache: a CamelUIDCache
- *
- * Attempts to save @cache back to disk.
- *
- * Return value: success or failure
- **/
-gboolean
-camel_uid_cache_save (CamelUIDCache *cache)
-{
- if (lseek (cache->fd, 0, SEEK_SET) != 0)
- return FALSE;
- g_hash_table_foreach (cache->uids, maybe_write_uid, cache);
- return ftruncate (cache->fd, lseek (cache->fd, 0, SEEK_CUR)) == 0;
-}
-
-static void
-maybe_write_uid (gpointer key, gpointer value, gpointer data)
-{
- CamelUIDCache *cache = data;
-
- if (GPOINTER_TO_INT (value) == cache->level) {
- write (cache->fd, key, strlen (key));
- write (cache->fd, "\n", 1);
- }
-}
-
-/**
- * camel_uid_cache_destroy:
- * @cache: a CamelUIDCache
- *
- * Destroys @cache and frees its data.
- **/
-void
-camel_uid_cache_destroy (CamelUIDCache *cache)
-{
- g_hash_table_foreach (cache->uids, free_uid, NULL);
- g_hash_table_destroy (cache->uids);
- close (cache->fd);
- g_free (cache);
-}
-
-static void
-free_uid (gpointer key, gpointer value, gpointer data)
-{
- g_free (key);
-}
-
-/**
- * camel_uid_cache_get_new_uids:
- * @cache: a CamelUIDCache
- * @uids: an array of UIDs
- *
- * Returns an array of UIDs from @uids that are not in @cache, and
- * removes UIDs from @cache that aren't in @uids.
- *
- * Return value: an array of new UIDs, which must be freed with
- * camel_uid_cache_free_uids().
- **/
-GPtrArray *
-camel_uid_cache_get_new_uids (CamelUIDCache *cache, GPtrArray *uids)
-{
- GPtrArray *new_uids;
- char *uid;
- int i;
-
- new_uids = g_ptr_array_new ();
- cache->level++;
-
- for (i = 0; i < uids->len; i++) {
- uid = uids->pdata[i];
- if (g_hash_table_lookup (cache->uids, uid))
- g_hash_table_remove (cache->uids, uid);
- else
- g_ptr_array_add (new_uids, g_strdup (uid));
- g_hash_table_insert (cache->uids, g_strdup (uid),
- GINT_TO_POINTER (cache->level));
- }
-
- return new_uids;
-}
-
-/**
- * camel_uid_cache_free_uids:
- * @uids: an array returned from camel_uid_cache_get_new_uids()
- *
- * Frees the array of UIDs.
- **/
-void
-camel_uid_cache_free_uids (GPtrArray *uids)
-{
- int i;
-
- for (i = 0; i < uids->len; i++)
- g_free (uids->pdata[i]);
- g_ptr_array_free (uids, TRUE);
-}
diff --git a/camel/camel-uid-cache.h b/camel/camel-uid-cache.h
deleted file mode 100644
index 92226a3afd..0000000000
--- a/camel/camel-uid-cache.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-uid-cache.h: UID caching code. */
-
-/*
- * Authors:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_UID_CACHE_H
-#define CAMEL_UID_CACHE_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#include <glib.h>
-#include <stdio.h>
-
-typedef struct {
- int fd, level;
- GHashTable *uids;
-} CamelUIDCache;
-
-CamelUIDCache *camel_uid_cache_new (const char *filename);
-gboolean camel_uid_cache_save (CamelUIDCache *cache);
-void camel_uid_cache_destroy (CamelUIDCache *cache);
-
-GPtrArray *camel_uid_cache_get_new_uids (CamelUIDCache *cache,
- GPtrArray *uids);
-void camel_uid_cache_free_uids (GPtrArray *uids);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* CAMEL_UID_CACHE_H */
diff --git a/camel/camel-url.c b/camel/camel-url.c
deleted file mode 100644
index e52645c8e2..0000000000
--- a/camel/camel-url.c
+++ /dev/null
@@ -1,368 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-url.c : utility functions to parse URLs */
-
-
-/*
- * Authors:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- * Dan Winship <danw@helixcode.com>
- * Tiago Antào <tiagoantao@bigfoot.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "camel-url.h"
-#include "camel-exception.h"
-
-/**
- * camel_url_new: create a CamelURL object from a string
- * @url_string: The string containing the URL to scan
- *
- * This routine takes a string and parses it as a URL of the form:
- *
- * protocol://user;AUTH=mech:password@host:port/path
- *
- * The protocol, followed by a ":" is required. If it is followed by * "//",
- * there must be an "authority" containing at least a host,
- * which ends at the end of the string or at the next "/". If there
- * is an "@" in the authority, there must be a username before it,
- * and the host comes after it. The authmech, password, and port are
- * optional, and the punctuation that preceeds them is omitted if
- * they are. Everything after the authority (or everything after the
- * protocol if there was no authority) is the path. We consider the
- * "/" between the authority and the path to be part of the path,
- * although this is incorrect according to RFC 1738.
- *
- * The port, if present, must be numeric.
- *
- * If nothing but the protocol (and the ":") is present, the "empty"
- * flag will be set on the returned URL.
- *
- * Return value: a CamelURL structure containing the URL items.
- **/
-CamelURL *
-camel_url_new (const char *url_string, CamelException *ex)
-{
- CamelURL *url;
- char *semi, *colon, *at, *slash;
- char *p;
-
- /* Find protocol: initial substring until ":" */
- colon = strchr (url_string, ':');
- if (!colon) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID,
- "URL string `%s' contains no protocol",
- url_string);
- return NULL;
- }
-
- url = g_new0 (CamelURL, 1);
- url->protocol = g_strndup (url_string, colon - url_string);
- g_strdown (url->protocol);
-
- /* Check protocol */
- p = url->protocol;
- while (*p) {
- if (!((*p >= 'a' && *p <= 'z') ||
- (*p == '-') || (*p == '+') || (*p == '.'))) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID,
- "URL string `%s' contains an invalid protocol",
- url_string);
- return NULL;
- }
- p++;
- }
-
- if (strncmp (colon, "://", 3) != 0) {
- if (*(colon + 1)) {
- url->path = g_strdup (colon + 1);
- camel_url_decode (url->path);
- } else
- url->empty = TRUE;
- return url;
- }
-
- url_string = colon + 3;
-
- /* If there is an @ sign in the authority, look for user,
- * authmech, and password before it.
- */
- slash = strchr (url_string, '/');
- at = strchr (url_string, '@');
- if (at && (!slash || at < slash)) {
- colon = strchr (url_string, ':');
- if (colon && colon < at) {
- url->passwd = g_strndup (colon + 1, at - colon - 1);
- camel_url_decode (url->passwd);
- } else {
- url->passwd = NULL;
- colon = at;
- }
-
- semi = strchr(url_string, ';');
- if (semi && (semi < colon || (!colon && semi < at)) &&
- !strncasecmp (semi, ";auth=", 6)) {
- url->authmech = g_strndup (semi + 6,
- colon - semi - 6);
- camel_url_decode (url->authmech);
- } else {
- url->authmech = NULL;
- semi = colon;
- }
-
- url->user = g_strndup (url_string, semi - url_string);
- camel_url_decode (url->user);
- url_string = at + 1;
- } else
- url->user = url->passwd = url->authmech = NULL;
-
- /* Find host and port. */
- slash = strchr (url_string, '/');
- colon = strchr (url_string, ':');
- if (slash && colon > slash)
- colon = NULL;
-
- if (colon) {
- url->host = g_strndup (url_string, colon - url_string);
- url->port = strtoul (colon + 1, &colon, 10);
- if (*colon && colon != slash) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID,
- "Port number in URL `%s' is non-"
- "numeric", url_string);
- camel_url_free (url);
- return NULL;
- }
- } else if (slash) {
- url->host = g_strndup (url_string, slash - url_string);
- camel_url_decode (url->host);
- url->port = 0;
- } else {
- url->host = g_strdup (url_string);
- camel_url_decode (url->host);
- url->port = 0;
- }
-
- if (!slash)
- slash = "/";
- url->path = g_strdup (slash);
- camel_url_decode (url->path);
-
- return url;
-}
-
-char *
-camel_url_to_string (CamelURL *url, gboolean show_passwd)
-{
- char *return_result;
- char *user = NULL, *authmech = NULL, *passwd = NULL;
- char *host = NULL, *path = NULL;
- char port[20];
-
- if (url->user)
- user = camel_url_encode (url->user, TRUE, ":;@/");
- if (url->authmech)
- authmech = camel_url_encode (url->authmech, TRUE, ":@/");
- if (show_passwd && url->passwd)
- passwd = camel_url_encode (url->passwd, TRUE, "@/");
- if (url->host)
- host = camel_url_encode (url->host, TRUE, ":/");
- if (url->port)
- g_snprintf (port, sizeof (port), "%d", url->port);
- else
- *port = '\0';
- if (url->path)
- path = camel_url_encode (url->path, FALSE, NULL);
-
- return_result = g_strdup_printf ("%s:%s%s%s%s%s%s%s%s%s%s%s%s",
- url->protocol,
- host ? "//" : "",
- user ? user : "",
- authmech ? ";auth=" : "",
- authmech ? authmech : "",
- passwd ? ":" : "",
- passwd ? passwd : "",
- user ? "@" : "",
- host ? host : "",
- *port ? ":" : "",
- port,
- path && host && *path != '/' ? "/" : "",
- path ? path : "");
- g_free (user);
- g_free (authmech);
- g_free (passwd);
- g_free (host);
- g_free (path);
-
- return return_result;
-}
-
-void
-camel_url_free (CamelURL *url)
-{
- g_assert (url);
-
- g_free (url->protocol);
- g_free (url->user);
- g_free (url->authmech);
- g_free (url->passwd);
- g_free (url->host);
- g_free (url->path);
-
- g_free (url);
-}
-
-void camel_url_set_protocol(CamelURL *url, const char *p)
-{
- g_free(url->protocol);
- url->protocol = g_strdup(p);
-}
-
-void camel_url_set_host(CamelURL *url, const char *h)
-{
- g_free(url->host);
- url->host = g_strdup(h);
-}
-
-void camel_url_set_port(CamelURL *url, int port)
-{
- url->port = port;
-}
-void camel_url_set_path(CamelURL *url, const char *p)
-{
- g_free(url->path);
- url->path = g_strdup(p);
-}
-
-
-/**
- * camel_url_encode:
- * @part: a URL part
- * @escape_unsafe: whether or not to %-escape "unsafe" characters.
- * ("%#<>{}|\^~[]`)
- * @escape_extra: additional characters to escape.
- *
- * This %-encodes the given URL part and returns the escaped version
- * in allocated memory, which the caller must free when it is done.
- **/
-char *
-camel_url_encode (char *part, gboolean escape_unsafe, char *escape_extra)
-{
- char *work, *p;
-
- /* worst case scenario = 3 times the initial */
- p = work = g_malloc (3 * strlen (part) + 1);
-
- while (*part) {
- if (((guchar) *part >= 127) || ((guchar) *part <= ' ') ||
- (escape_unsafe && strchr ("\"%#<>{}|\\^~[]`", *part)) ||
- (escape_extra && strchr (escape_extra, *part))) {
- sprintf (p, "%%%.02hX", (guchar) *part++);
- p += 3;
- } else
- *p++ = *part++;
- }
- *p = '\0';
-
- return work;
-}
-
-#define HEXVAL(c) (isdigit (c) ? (c) - '0' : tolower (c) - 'a' + 10)
-
-/**
- * camel_url_decode:
- * @part: a URL part
- *
- * %-decodes the passed-in URL *in place*. The decoded version is
- * never longer than the encoded version, so there does not need to
- * be any additional space at the end of the string.
- */
-void
-camel_url_decode (char *part)
-{
- guchar *s, *d;
-
- s = d = (guchar *)part;
- while (*s) {
- if (*s == '%') {
- if (isxdigit (s[1]) && isxdigit (s[2])) {
- *d++ = HEXVAL (s[1]) * 16 + HEXVAL (s[2]);
- s += 3;
- } else
- *d++ = *s++;
- } else
- *d++ = *s++;
- }
- *d = '\0';
-}
-
-static void
-add_hash (guint *hash, char *s)
-{
- if (s)
- *hash ^= g_str_hash(s);
-}
-
-guint camel_url_hash (const void *v)
-{
- const CamelURL *u = v;
- guint hash = 0;
-
- add_hash (&hash, u->protocol);
- add_hash (&hash, u->user);
- add_hash (&hash, u->authmech);
- add_hash (&hash, u->host);
- add_hash (&hash, u->path);
- hash ^= u->port;
-
- return hash;
-}
-
-static int
-check_equal (char *s1, char *s2)
-{
- if (s1 == NULL) {
- if (s2 == NULL)
- return TRUE;
- else
- return FALSE;
- }
-
- if (s2 == NULL)
- return FALSE;
-
- return strcmp (s1, s2) == 0;
-}
-
-int camel_url_equal(const void *v, const void *v2)
-{
- const CamelURL *u1 = v, *u2 = v2;
-
- return check_equal(u1->protocol, u2->protocol)
- && check_equal(u1->user, u2->user)
- && check_equal(u1->authmech, u2->authmech)
- && check_equal(u1->host, u2->host)
- && check_equal(u1->path, u2->path)
- && u1->port == u2->port;
-}
diff --git a/camel/camel-url.h b/camel/camel-url.h
deleted file mode 100644
index aba903c08b..0000000000
--- a/camel/camel-url.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-url.h : utility functions to parse URLs */
-
-/*
- * Authors:
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_URL_H
-#define CAMEL_URL_H 1
-
-#include <glib.h>
-#include <camel/camel-types.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-typedef struct {
- char *protocol;
- char *user;
- char *authmech;
- char *passwd;
- char *host;
- int port;
- char *path;
-
- /* This is set if the URL contained only a protocol. */
- gboolean empty;
-} CamelURL;
-
-CamelURL *camel_url_new (const char *url_string, CamelException *ex);
-char *camel_url_to_string (CamelURL *url, gboolean show_password);
-void camel_url_free (CamelURL *url);
-
-char *camel_url_encode (char *part, gboolean escape_unsafe, char *escape_extra);
-void camel_url_decode (char *part);
-
-/* for editing url's */
-void camel_url_set_protocol(CamelURL *url, const char *);
-void camel_url_set_host(CamelURL *url, const char *);
-void camel_url_set_port(CamelURL *url, int port);
-void camel_url_set_path(CamelURL *url, const char *);
-
-/* for putting url's into hash tables */
-guint camel_url_hash (const void *v);
-int camel_url_equal(const void *v, const void *v2);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* URL_UTIL_H */
diff --git a/camel/camel.c b/camel/camel.c
deleted file mode 100644
index 0121c1082f..0000000000
--- a/camel/camel.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include "camel.h"
-#include <unicode.h>
-
-gint
-camel_init(void)
-{
-
-
-#ifdef ENABLE_THREADS
-#ifdef G_THREADS_ENABLED
- g_thread_init (NULL);
-#else /* G_THREADS_ENABLED */
- printf ("Threads are not supported by your version of glib\n");
-#endif /* G_THREADS_ENABLED */
-#endif /* ENABLE_THREADS */
-
- unicode_init ();
-
- return 0;
-}
diff --git a/camel/camel.h b/camel/camel.h
deleted file mode 100644
index 752b145b49..0000000000
--- a/camel/camel.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_H
-#define CAMEL_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-data-wrapper.h>
-#include <camel/camel-exception.h>
-#include <camel/camel-folder.h>
-#include <camel/camel-medium.h>
-#include <camel/camel-mime-filter-basic.h>
-#include <camel/camel-mime-filter-charset.h>
-#include <camel/camel-mime-filter-index.h>
-#include <camel/camel-mime-filter-save.h>
-#include <camel/camel-mime-filter-crlf.h>
-#include <camel/camel-mime-filter.h>
-#include <camel/camel-mime-message.h>
-#include <camel/camel-mime-parser.h>
-#include <camel/camel-mime-part-utils.h>
-#include <camel/camel-mime-part.h>
-#include <camel/camel-mime-utils.h>
-#include <camel/camel-movemail.h>
-#include <camel/camel-multipart.h>
-#include <camel/camel-provider.h>
-#include <camel/camel-seekable-stream.h>
-#include <camel/camel-seekable-substream.h>
-#include <camel/camel-service.h>
-#include <camel/camel-session.h>
-#include <camel/camel-store.h>
-#include <camel/camel-stream-buffer.h>
-#include <camel/camel-stream-filter.h>
-#include <camel/camel-stream-fs.h>
-#include <camel/camel-stream-mem.h>
-#include <camel/camel-stream.h>
-#include <camel/camel-transport.h>
-#include <camel/camel-uid-cache.h>
-#include <camel/camel-url.h>
-#include <camel/gmime-content-field.h>
-#include <camel/gstring-util.h>
-#include <camel/hash-table-utils.h>
-#include <camel/md5-utils.h>
-#include <camel/string-utils.h>
-
-gint camel_init (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_H */
diff --git a/camel/devel-docs/camel_data_wrapper.dia b/camel/devel-docs/camel_data_wrapper.dia
deleted file mode 100644
index 301563d1ee..0000000000
--- a/camel/devel-docs/camel_data_wrapper.dia
+++ /dev/null
Binary files differ
diff --git a/camel/devel-docs/camel_parser_states.dia b/camel/devel-docs/camel_parser_states.dia
deleted file mode 100644
index 556a5b1c49..0000000000
--- a/camel/devel-docs/camel_parser_states.dia
+++ /dev/null
Binary files differ
diff --git a/camel/devel-docs/camel_stream.dia b/camel/devel-docs/camel_stream.dia
deleted file mode 100644
index d91d1bb153..0000000000
--- a/camel/devel-docs/camel_stream.dia
+++ /dev/null
Binary files differ
diff --git a/camel/gmime-content-field.c b/camel/gmime-content-field.c
deleted file mode 100644
index 4d38314873..0000000000
--- a/camel/gmime-content-field.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* mime-content_field.c : mime content type field utilities */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include "gmime-content-field.h"
-#include "string-utils.h"
-#include <string.h>
-#include "camel-mime-utils.h"
-
-/**
- * gmime_content_field_new: Creates a new GMimeContentField object
- * @type: mime type
- * @subtype: mime subtype
- *
- * Creates a GMimeContentField object and initialize it with
- * a mime type and a mime subtype. For example,
- * gmime_content_field_new ("application", "postcript");
- * will create a content field with complete mime type
- * "application/postscript"
- *
- * Return value: The newly created GMimeContentField object
- **/
-GMimeContentField *
-gmime_content_field_new (const gchar *type, const gchar *subtype)
-{
- GMimeContentField *ctf;
-
- ctf = g_new (GMimeContentField, 1);
- ctf->content_type = header_content_type_new(type, subtype);
- ctf->type = ctf->content_type->type;
- ctf->subtype = ctf->content_type->subtype;
- ctf->ref = 1;
- return ctf;
-}
-
-/**
- * gmime_content_field_ref: add a reference to a GMimeContentField object
- * @content_field: GMimeContentField object
- *
- * Tell a GMimeContentField object that something holds a reference
- * on him. This, coupled with the corresponding
- * gmime_content_field_unref() method allow several
- * objects to use the same GMimeContentField object.
- **/
-void
-gmime_content_field_ref (GMimeContentField *content_field)
-{
- content_field->ref += 1;
- header_content_type_ref (content_field->content_type);
-}
-
-/**
- * gmime_content_field_unref: remove a reference to a GMimeContentField object
- * @content_field: GMimeContentField object
- *
- * Tell a GMimeContentField object that something which
- * was holding a reference to him does not need it anymore.
- * When no more reference exist, the GMimeContentField object
- * is freed using gmime_content_field_free().
- *
- **/
-void
-gmime_content_field_unref (GMimeContentField *content_field)
-{
- if (!content_field) return;
-
- content_field->ref -= 1;
- header_content_type_unref (content_field->content_type);
- if (content_field->ref <= 0)
- g_free (content_field);
-}
-
-
-
-/**
- * gmime_content_field_set_parameter: set a parameter for a GMimeContentField object
- * @content_field: content field
- * @attribute: parameter name
- * @value: paramteter value
- *
- * set a parameter (called attribute in RFC 2045) of a content field. Meaningfull
- * or valid parameters name depend on the content type object. For example,
- * gmime_content_field_set_parameter (cf, "charset", "us-ascii");
- * will make sense for a "text/plain" content field but not for a
- * "image/gif". This routine does not check parameter validity.
- **/
-void
-gmime_content_field_set_parameter (GMimeContentField *content_field, const gchar *attribute, const gchar *value)
-{
- header_content_type_set_param(content_field->content_type, attribute, value);
-}
-
-/**
- * gmime_content_field_write_to_stream: write a mime content type to a stream
- * @content_field: content type object
- * @stream: the stream
- *
- *
- **/
-void
-gmime_content_field_write_to_stream (GMimeContentField *content_field, CamelStream *stream)
-{
- char *txt;
-
- if (!content_field)
- return;
-
- txt = header_content_type_format(content_field->content_type);
- if (txt) {
- camel_stream_printf (stream, "Content-Type: %s\n", txt);
- g_free(txt);
- }
-}
-
-/**
- * gmime_content_field_get_mime_type: return the mime type of the content field object
- * @content_field: content field object
- *
- * A RFC 2045 content type field contains the mime type in the
- * form "type/subtype" (example : "application/postscript") and some
- * parameters (attribute/value pairs). This routine returns the mime type
- * in a gchar object. THIS OBJECT MUST BE FREED BY THE CALLER.
- *
- * Return value: the mime type in the form "type/subtype" or NULL if not defined.
- **/
-gchar *
-gmime_content_field_get_mime_type (GMimeContentField *content_field)
-{
- gchar *mime_type;
-
- if (!content_field->content_type->type) return NULL;
-
- if (content_field->content_type->subtype)
- mime_type = g_strdup_printf ("%s/%s", content_field->content_type->type, content_field->content_type->subtype);
- else
- mime_type = g_strdup (content_field->content_type->type);
- return mime_type;
-}
-
-/**
- * gmime_content_field_get_parameter: return the value of a mime type parameter
- * @content_field: content field object
- * @name: name of the parameter
- *
- * Returns the value of a parameter contained in the content field
- * object. The content type is formed of a mime type, a mime subtype,
- * and a parameter list. Each parameter is a name/value pair. This
- * routine returns the value assiciated to a given name.
- * When the parameter does not exist, NULL is returned.
- *
- * Return value: parameter value, or NULL if not found.
- **/
-const gchar *
-gmime_content_field_get_parameter (GMimeContentField *content_field, const gchar *name)
-{
- g_assert (content_field);
-
- g_assert (name);
- return header_content_type_param(content_field->content_type, name);
-}
-
-
-
-
-/**
- * gmime_content_field_construct_from_string: construct a ContentType object by parsing a string.
- *
- * @content_field: content type object to construct
- * @string: string containing the content type field
- *
- * Parse a string containing a content type field as defined in
- * RFC 2045, and construct the corresponding ContentType object.
- * The string is not modified and not used in the ContentType
- * object. It can and must be freed by the calling part.
- **/
-void
-gmime_content_field_construct_from_string (GMimeContentField *content_field, const gchar *string)
-{
- struct _header_content_type *new;
-
- g_assert (string);
- g_assert (content_field);
-
- new = header_content_type_decode(string);
- if (content_field->content_type)
- header_content_type_unref(content_field->content_type);
-
- if (new == NULL) {
- new = header_content_type_new(NULL, NULL);
- g_warning("Cannot parse content-type string: %s", string);
- }
- content_field->content_type = new;
- content_field->type = new->type;
- content_field->subtype = new->subtype;
-}
-
-/**
- * gmime_content_field_is_type:
- * @content_field: An initialised GMimeContentField.
- * @type: MIME Major type name.
- * @subtype: MIME subtype.
- *
- * Returns true if the content_field is of the type @type and subtype @subtype.
- * If @subtype is the special wildcard "*", then it will match any type.
- *
- * If the @content_field is empty, then it will match "text/plain", or "text/ *".
- *
- * Return value:
- **/
-int
-gmime_content_field_is_type (GMimeContentField *content_field, const char *type, const char *subtype)
-{
- return header_content_type_is(content_field->content_type, type, subtype);
-}
diff --git a/camel/gmime-content-field.h b/camel/gmime-content-field.h
deleted file mode 100644
index 5a28d0fedb..0000000000
--- a/camel/gmime-content-field.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* mime-content_field.h : mime content type field utilities */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 GMIME_CONTENT_FIELD_H
-#define GMIME_CONTENT_FIELD_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <glib.h>
-#include <stdio.h>
-#include <camel/camel-stream.h>
-#include <camel/camel-mime-utils.h>
-
-typedef struct {
- struct _header_content_type *content_type;
-
- /* these should be deprecated (use the accessors) */
- char *type; /* these are only copies of the ones in content_type */
- char *subtype;
-
- gint ref;
-
-} GMimeContentField;
-
-GMimeContentField *gmime_content_field_new (const gchar *type, const gchar *subtype);
-void gmime_content_field_ref (GMimeContentField *content_field);
-void gmime_content_field_unref (GMimeContentField *content_field);
-
-void gmime_content_field_set_parameter (GMimeContentField *content_field, const gchar *attribute, const gchar *value);
-void gmime_content_field_write_to_stream (GMimeContentField *content_field, CamelStream *stream);
-void gmime_content_field_construct_from_string (GMimeContentField *content_field, const gchar *string);
-void gmime_content_field_free (GMimeContentField *content_field);
-gchar * gmime_content_field_get_mime_type (GMimeContentField *content_field);
-const gchar *gmime_content_field_get_parameter (GMimeContentField *content_field, const gchar *name);
-
-int gmime_content_field_is_type (GMimeContentField *content_field, const char *type, const char *subtype);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* GMIME_CONTENT_FIELD_H */
diff --git a/camel/gstring-util.c b/camel/gstring-util.c
deleted file mode 100644
index a0c1345b71..0000000000
--- a/camel/gstring-util.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* gstring-util : utilities for gstring object */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-
-
-#include <config.h>
-#include "gstring-util.h"
-#include <string.h>
-
-/**
- * g_string_equals : test if two string are equal
- *
- * @string1 : first string
- * @string2 : second string
- *
- * @Return Value : true if the strings equal, false otherwise
- **/
-gboolean
-g_string_equals (GString *string1, GString *string2)
-{
- g_assert (string1);
- g_assert (string2);
- return !strcmp (string1->str, string2->str);
-}
-
-
-
-
-/**
- * g_string_clone : clone a GString
- *
- * @string : the string to clone
- *
- * @Return Value : the clone ...
- **/
-GString *
-g_string_clone (GString *string)
-{
- return g_string_new (string->str);
-}
-
-/**
- * g_string_append_g_string : append a GString to another GString
- *
- * @dest_string : string which will be appended
- * @other_string : string to append
- *
- **/
-void
-g_string_append_g_string(GString *dest_string, GString *other_string)
-{
- g_assert(other_string);
- g_assert(dest_string);
-
- if (other_string->len)
- g_string_append(dest_string, other_string->str);
-}
-
-/**
- * g_string_equal_for_hash: test equality of two GStrings for hash tables
- * @v: string 1
- * @v2: string 2
- *
- *
- *
- * Return value:
- **/
-gint
-g_string_equal_for_hash (gconstpointer v, gconstpointer v2)
-{
- return strcmp ( ((const GString*)v)->str, ((const GString*)v2)->str) == 0;
-}
-
-gint
-g_string_equal_for_glist (gconstpointer v, gconstpointer v2)
-{
- return !strcmp ( ((const GString*)v)->str, ((const GString*)v2)->str) == 0;
-}
-
-
-/**
- * g_string_hash: computes a hash value for a Gstring
- * @v: Gstring object
- *
- *
- *
- * Return value:
- **/
-guint
-g_string_hash (gconstpointer v)
-{
- return g_str_hash(((const GString*)v)->str);
-}
-
-
-
-
-/* utility func : frees a GString element in a GList */
-static void
-__g_string_list_free_string (gpointer data, gpointer user_data)
-{
- GString *string = (GString *)data;
- g_string_free(string, TRUE);
-}
-
-
-void
-g_string_list_free (GList *string_list)
-{
- g_list_foreach(string_list, __g_string_list_free_string, NULL);
- g_list_free(string_list);
-}
-
-
-
-
-
-
-GList *
-g_string_split (GString *string, char sep, gchar *trim_chars, GStringTrimOption trim_options)
-{
- GList *result = NULL;
- gint first, last, pos;
- gchar *str;
- gchar *new_str;
- GString *new_gstring;
-
- g_assert (string);
- str = string->str;
- if (!str) return NULL;
-
- first = 0;
- last = strlen(str) - 1;
-
- /* strip leading and trailing separators */
- while ( (first<=last) && (str[first]==sep) )
- first++;
- while ( (first<=last) && (str[last]==sep) )
- last--;
-
-
- while (first<=last) {
- pos = first;
- /* find next separator */
- while ((pos<=last) && (str[pos]!=sep)) pos++;
- if (first != pos) {
- new_str = g_strndup (str+first, pos-first);
- new_gstring = g_string_new (new_str);
- g_free (new_str);
- /* could do trimming in line to speed up this code */
- if (trim_chars) g_string_trim (new_gstring, trim_chars, trim_options);
- result = g_list_append (result, new_gstring);
- }
- first = pos + 1;
- }
-
- return result;
-}
-
-
-void
-g_string_trim (GString *string, gchar *chars, GStringTrimOption options)
-{
- gint first_ok;
- gint last_ok;
- guint length;
- gchar *str;
-
- if ((!string) || (!string->str))
- return;
- str = string->str;
- length = strlen (str);
- if (!length)
- return;
-
- first_ok = 0;
- last_ok = length - 1;
-
- if (options & GSTRING_TRIM_STRIP_LEADING)
- while ( (first_ok <= last_ok) && (strchr (chars, str[first_ok])) )
- first_ok++;
-
- if (options & GSTRING_TRIM_STRIP_TRAILING)
- while ( (first_ok <= last_ok) && (strchr (chars, str[last_ok])) )
- last_ok++;
-
- if (first_ok > 0)
- g_string_erase (string, 0, first_ok);
-
- if (last_ok < length-1)
- g_string_truncate (string, last_ok - first_ok +1);
-
-}
diff --git a/camel/gstring-util.h b/camel/gstring-util.h
deleted file mode 100644
index 487bbc8a3b..0000000000
--- a/camel/gstring-util.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* gstring-util : utilities for gstring object */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 GSTRING_UTIL_H
-#define GSTRING_UTIL_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <glib.h>
-
-typedef enum {
- GSTRING_TRIM_NONE = 0,
- GSTRING_TRIM_STRIP_TRAILING = 1,
- GSTRING_TRIM_STRIP_LEADING = 2
-} GStringTrimOption;
-
-
-gboolean g_string_equals (GString *string1, GString *string2);
-GString *g_string_clone (GString *string);
-void g_string_append_g_string (GString *dest_string,
- GString *other_string);
-
-gboolean g_string_equal_for_hash (gconstpointer v, gconstpointer v2);
-gboolean g_string_equal_for_glist (gconstpointer v, gconstpointer v2);
-guint g_string_hash (gconstpointer v);
-void g_string_list_free (GList *string_list);
-
-GList *g_string_split (GString *string, char sep,
- gchar *trim_chars, GStringTrimOption trim_options);
-void g_string_trim (GString *string, gchar *chars,
- GStringTrimOption options);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* GSTRING_UTIL_H */
diff --git a/camel/hash-table-utils.c b/camel/hash-table-utils.c
deleted file mode 100644
index b04eaa3ce7..0000000000
--- a/camel/hash-table-utils.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* generic utilities for hash tables */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <ctype.h>
-#include "glib.h"
-#include "hash-table-utils.h"
-
-
-/*
- * free a (key/value) hash table pair.
- * to be called in a g_hash_table_foreach()
- * before g_hash_table_destroy().
- */
-void
-g_hash_table_generic_free (gpointer key, gpointer value, gpointer user_data)
-{
- g_free (key);
- g_free (value);
-}
-
-
-
-/***/
-/* use these two funcs for case insensitive hash table */
-
-gint
-g_strcase_equal (gconstpointer a, gconstpointer b)
-{
- return (g_strcasecmp ((gchar *)a, (gchar *)b) == 0);
-}
-
-
-/* modified g_str_hash from glib/gstring.c
- because it would have been too slow to
- us g_strdown() on the string */
-/* a char* hash function from ASU */
-guint
-g_strcase_hash (gconstpointer v)
-{
- const char *s = (char*)v;
- const char *p;
- guint h=0, g;
-
- for(p = s; *p != '\0'; p += 1) {
- h = ( h << 4 ) + toupper(*p);
- if ( ( g = h & 0xf0000000 ) ) {
- h = h ^ (g >> 24);
- h = h ^ g;
- }
- }
-
- return h /* % M */;
-}
-
-
-
-/***/
diff --git a/camel/hash-table-utils.h b/camel/hash-table-utils.h
deleted file mode 100644
index 2904991848..0000000000
--- a/camel/hash-table-utils.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* generic utilities for hash tables */
-
-/*
- *
- * Author :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 HASH_TABLE_UTILS_H
-#define HASH_TABLE_UTILS_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-void g_hash_table_generic_free (gpointer key, gpointer value, gpointer user_data);
-
-gint g_strcase_equal (gconstpointer a, gconstpointer b);
-guint g_strcase_hash (gconstpointer v);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* HASH_TABLE_UTILS_H */
diff --git a/camel/md5-utils.c b/camel/md5-utils.c
deleted file mode 100644
index 7363eaec40..0000000000
--- a/camel/md5-utils.c
+++ /dev/null
@@ -1,391 +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 "md5-utils.h"
-#include <stdio.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_stream: get the md5 hash of a stream
- * @stream: stream
- * @digest: 16 bytes buffer receiving the hash code.
- *
- * Get the md5 hash of a stream. The result is put in
- * the 16 bytes buffer @digest .
- **/
-void
-md5_get_digest_from_stream (CamelStream *stream, guchar digest[16])
-{
- MD5Context ctx;
- guchar tmp_buf[1024];
- gint nb_bytes_read;
-
- md5_init (&ctx);
-
- nb_bytes_read = camel_stream_read (stream, tmp_buf, 1024);
- while (nb_bytes_read) {
- md5_update (&ctx, tmp_buf, nb_bytes_read);
- nb_bytes_read = camel_stream_read (stream, tmp_buf, 1024);
- }
-
- 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/camel/md5-utils.h b/camel/md5-utils.h
deleted file mode 100644
index c911250d56..0000000000
--- a/camel/md5-utils.h
+++ /dev/null
@@ -1,54 +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>
-#include <camel/camel-stream.h>
-
-typedef struct {
- 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]);
-void md5_get_digest_from_stream (CamelStream *stream, 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/camel/providers/.cvsignore b/camel/providers/.cvsignore
deleted file mode 100644
index 3dda72986f..0000000000
--- a/camel/providers/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile.in
-Makefile
diff --git a/camel/providers/Makefile.am b/camel/providers/Makefile.am
deleted file mode 100644
index dedeaa0b3b..0000000000
--- a/camel/providers/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-# SUBDIRS = mbox pop3 sendmail smtp vee
-SUBDIRS = mbox pop3 sendmail smtp vee imap mh nntp
-
-# these ones are disabled for the moment.
-# maildir
diff --git a/camel/providers/imap/.cvsignore b/camel/providers/imap/.cvsignore
deleted file mode 100644
index fd6b811c68..0000000000
--- a/camel/providers/imap/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-.deps
-*.lo
-*.la
diff --git a/camel/providers/imap/Makefile.am b/camel/providers/imap/Makefile.am
deleted file mode 100644
index 5ff249739f..0000000000
--- a/camel/providers/imap/Makefile.am
+++ /dev/null
@@ -1,42 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-libcamelimapincludedir = $(includedir)/camel
-
-
-providerdir = $(pkglibdir)/camel-providers/$(VERSION)
-
-provider_LTLIBRARIES = libcamelimap.la
-provider_DATA = libcamelimap.urls
-
-INCLUDES = -I.. \
- -I$(srcdir)/.. \
- -I$(top_srcdir)/camel \
- -I$(top_srcdir)/intl \
- -I$(top_srcdir)/libibex \
- -I$(top_srcdir)/e-util \
- -I$(top_srcdir) \
- -I$(includedir) \
- $(GTK_INCLUDEDIR) \
- -DG_LOG_DOMAIN=\"camel-imap-provider\"
-
-libcamelimap_la_SOURCES = \
- camel-imap-folder.c \
- camel-imap-provider.c \
- camel-imap-store.c \
- camel-imap-stream.c \
- camel-imap-utils.c
-
-libcamelimapinclude_HEADERS = \
- camel-imap-folder.h \
- camel-imap-store.h \
- camel-imap-stream.h \
- camel-imap-utils.h
-
-libcamelimap_la_LDFLAGS = -version-info 0:0:0
-
-EXTRA_DIST = libcamelimap.urls
-
-
-
-
-
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
deleted file mode 100644
index 2118554607..0000000000
--- a/camel/providers/imap/camel-imap-folder.c
+++ /dev/null
@@ -1,1578 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-imap-folder.c: Abstract class for an email folder */
-
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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
- */
-
-
-#include <config.h>
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <fcntl.h>
-
-#include <e-util/e-util.h>
-
-#include "camel-imap-folder.h"
-#include "camel-imap-store.h"
-#include "camel-imap-stream.h"
-#include "camel-imap-utils.h"
-#include "string-utils.h"
-#include "camel-stream.h"
-#include "camel-stream-fs.h"
-#include "camel-stream-mem.h"
-#include "camel-stream-buffer.h"
-#include "camel-data-wrapper.h"
-#include "camel-mime-message.h"
-#include "camel-stream-filter.h"
-#include "camel-mime-filter-from.h"
-#include "camel-mime-filter-crlf.h"
-#include "camel-exception.h"
-#include "camel-mime-utils.h"
-
-#define d(x) x
-
-#define CF_CLASS(o) (CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(o)))
-
-static CamelFolderClass *parent_class = NULL;
-
-static void imap_init (CamelFolder *folder, CamelStore *parent_store,
- CamelFolder *parent_folder, const gchar *name,
- gchar *separator, gboolean path_begns_with_sep,
- CamelException *ex);
-
-static void imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex);
-static void imap_expunge (CamelFolder *folder, CamelException *ex);
-
-static gint imap_get_message_count_internal (CamelFolder *folder, CamelException *ex);
-static gint imap_get_message_count (CamelFolder *folder);
-static gint imap_get_unread_message_count (CamelFolder *folder);
-
-static CamelMimeMessage *imap_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex);
-static void imap_append_message (CamelFolder *folder, CamelMimeMessage *message, const CamelMessageInfo *info, CamelException *ex);
-static void imap_copy_message_to (CamelFolder *source, const char *uid, CamelFolder *destination, CamelException *ex);
-static void imap_move_message_to (CamelFolder *source, const char *uid, CamelFolder *destination, CamelException *ex);
-
-static GPtrArray *imap_get_subfolder_names_internal (CamelFolder *folder, CamelException *ex);
-static GPtrArray *imap_get_subfolder_names (CamelFolder *folder);
-
-static GPtrArray *imap_get_uids (CamelFolder *folder);
-static GPtrArray *imap_get_summary_internal (CamelFolder *folder, CamelException *ex);
-static GPtrArray *imap_get_summary (CamelFolder *folder);
-static const CamelMessageInfo *imap_get_message_info (CamelFolder *folder, const char *uid);
-
-static GPtrArray *imap_search_by_expression (CamelFolder *folder, const char *expression, CamelException *ex);
-
-static void imap_finalize (CamelObject *object);
-
-/* flag methods */
-/*static guint32 imap_get_permanent_flags (CamelFolder *folder, CamelException *ex);*/
-static guint32 imap_get_message_flags (CamelFolder *folder, const char *uid);
-static void imap_set_message_flags (CamelFolder *folder, const char *uid, guint32 flags, guint32 set);
-static gboolean imap_get_message_user_flag (CamelFolder *folder, const char *uid, const char *name);
-static void imap_set_message_user_flag (CamelFolder *folder, const char *uid, const char *name,
- gboolean value);
-
-
-static void
-camel_imap_folder_class_init (CamelImapFolderClass *camel_imap_folder_class)
-{
- CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_imap_folder_class);
-
- parent_class = CAMEL_FOLDER_CLASS(camel_type_get_global_classfuncs (camel_folder_get_type ()));
-
- /* virtual method definition */
-
- /* virtual method overload */
- camel_folder_class->init = imap_init;
- camel_folder_class->sync = imap_sync;
- camel_folder_class->expunge = imap_expunge;
-
- camel_folder_class->get_uids = imap_get_uids;
- camel_folder_class->free_uids = camel_folder_free_nop;
- camel_folder_class->get_subfolder_names = imap_get_subfolder_names;
- camel_folder_class->free_subfolder_names = camel_folder_free_nop;
-
- camel_folder_class->get_message_count = imap_get_message_count;
- camel_folder_class->get_unread_message_count = imap_get_unread_message_count;
- camel_folder_class->get_message = imap_get_message;
- camel_folder_class->append_message = imap_append_message;
- camel_folder_class->copy_message_to = imap_copy_message_to;
- camel_folder_class->move_message_to = imap_move_message_to;
-
- camel_folder_class->get_summary = imap_get_summary;
- camel_folder_class->get_message_info = imap_get_message_info;
- camel_folder_class->free_summary = camel_folder_free_nop;
-
- camel_folder_class->search_by_expression = imap_search_by_expression;
-
- /*camel_folder_class->get_permanent_flags = imap_get_permanent_flags;*/
- camel_folder_class->get_message_flags = imap_get_message_flags;
- camel_folder_class->set_message_flags = imap_set_message_flags;
- camel_folder_class->get_message_user_flag = imap_get_message_user_flag;
- camel_folder_class->set_message_user_flag = imap_set_message_user_flag;
-}
-
-static void
-camel_imap_folder_init (gpointer object, gpointer klass)
-{
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (object);
- CamelFolder *folder = CAMEL_FOLDER (object);
-
- folder->can_hold_messages = TRUE;
- folder->can_hold_folders = TRUE;
- folder->has_summary_capability = TRUE;
- folder->has_search_capability = TRUE;
-
- imap_folder->summary = NULL;
- imap_folder->summary_hash = NULL;
- imap_folder->lsub = NULL;
-}
-
-CamelType
-camel_imap_folder_get_type (void)
-{
- static CamelType camel_imap_folder_type = CAMEL_INVALID_TYPE;
-
- if (camel_imap_folder_type == CAMEL_INVALID_TYPE) {
- camel_imap_folder_type = camel_type_register (CAMEL_FOLDER_TYPE, "CamelImapFolder",
- sizeof (CamelImapFolder),
- sizeof (CamelImapFolderClass),
- (CamelObjectClassInitFunc) camel_imap_folder_class_init,
- NULL,
- (CamelObjectInitFunc) camel_imap_folder_init,
- (CamelObjectFinalizeFunc) imap_finalize);
- }
-
- return camel_imap_folder_type;
-}
-
-CamelFolder *
-camel_imap_folder_new (CamelStore *parent, char *folder_name, CamelException *ex)
-{
- CamelFolder *folder = CAMEL_FOLDER (camel_object_new (camel_imap_folder_get_type ()));
- CamelURL *url = CAMEL_SERVICE (parent)->url;
- char *dir_sep;
-
- dir_sep = CAMEL_IMAP_STORE (parent)->dir_sep;
-
- CF_CLASS (folder)->init (folder, parent, NULL, folder_name, dir_sep, FALSE, ex);
-
- if (!strcmp (folder_name, url->path + 1))
- folder->can_hold_messages = FALSE;
-
- imap_get_subfolder_names_internal (folder, ex);
-
- if (folder->can_hold_messages)
- imap_get_summary_internal (folder, ex);
-
- return folder;
-}
-
-static void
-imap_summary_free (GPtrArray **summary)
-{
- CamelMessageInfo *info;
- GPtrArray *array = *summary;
- gint i, max;
-
- if (array) {
- max = array->len;
- for (i = 0; i < max; i++) {
- info = g_ptr_array_index (array, i);
- g_free (info->subject);
- g_free (info->from);
- g_free (info->to);
- g_free (info->cc);
- g_free (info->uid);
- g_free (info->message_id);
- header_references_list_clear (&info->references);
- g_free (info);
- info = NULL;
- }
-
- g_ptr_array_free (array, TRUE);
- *summary = NULL;
- }
-}
-
-static void
-imap_folder_summary_free (CamelImapFolder *imap_folder)
-{
- if (imap_folder->summary_hash) {
- g_hash_table_destroy (imap_folder->summary_hash);
- imap_folder->summary_hash = NULL;
- }
-
- imap_summary_free (&imap_folder->summary);
-}
-
-static void
-imap_finalize (CamelObject *object)
-{
- /* TODO: do we need to do more cleanup here? */
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (object);
- gint max, i;
-
- imap_folder_summary_free (imap_folder);
-
- if (imap_folder->lsub) {
- max = imap_folder->lsub->len;
-
- for (i = 0; i < max; i++) {
- g_free (imap_folder->lsub->pdata[i]);
- imap_folder->lsub->pdata[i] = NULL;
- }
-
- g_ptr_array_free (imap_folder->lsub, TRUE);
- }
-}
-
-static void
-imap_init (CamelFolder *folder, CamelStore *parent_store, CamelFolder *parent_folder,
- const gchar *name, gchar *separator, gboolean path_begins_with_sep, CamelException *ex)
-{
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
-
- /* call parent method */
- parent_class->init (folder, parent_store, parent_folder, name, separator, path_begins_with_sep, ex);
- if (camel_exception_get_id (ex))
- return;
-
- /* we assume that the parent init
- method checks for the existance of @folder */
- folder->can_hold_messages = TRUE;
- folder->can_hold_folders = TRUE;
- folder->has_summary_capability = TRUE;
- folder->has_search_capability = TRUE;
-
- /* some IMAP daemons support user-flags *
- * I would not, however, rely on this feature as *
- * most IMAP daemons are not 100% RFC compliant */
- folder->permanent_flags = CAMEL_MESSAGE_SEEN |
- CAMEL_MESSAGE_ANSWERED |
- CAMEL_MESSAGE_FLAGGED |
- CAMEL_MESSAGE_DELETED |
- CAMEL_MESSAGE_DRAFT |
- CAMEL_MESSAGE_USER;
-
- imap_folder->search = NULL;
- imap_folder->summary = NULL;
- imap_folder->summary_hash = NULL;
- imap_folder->lsub = NULL;
-}
-
-static void
-imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex)
-{
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
- gint i, max;
-
- if (expunge) {
- imap_expunge (folder, ex);
- return;
- }
-
- /* Set the flags on any messages that have changed this session */
- if (imap_folder->summary) {
- max = imap_folder->summary->len;
- for (i = 0; i < max; i++) {
- CamelMessageInfo *info;
-
- info = (CamelMessageInfo *) g_ptr_array_index (imap_folder->summary, i);
- if (info->flags & CAMEL_MESSAGE_FOLDER_FLAGGED) {
- char *flags;
-
- flags = g_strconcat (info->flags & CAMEL_MESSAGE_SEEN ? "\\Seen " : "",
- info->flags & CAMEL_MESSAGE_DRAFT ? "\\Draft " : "",
- info->flags & CAMEL_MESSAGE_DELETED ? "\\Deleted " : "",
- info->flags & CAMEL_MESSAGE_ANSWERED ? "\\Answered " : "",
- NULL);
- if (*flags) {
- gchar *result;
- gint s;
-
- *(flags + strlen (flags) - 1) = '\0';
- s = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store),
- folder, &result,
- "UID STORE %s FLAGS.SILENT (%s)",
- info->uid, flags);
-
- if (s != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not set flags on message %s on IMAP "
- "server %s: %s.", info->uid,
- service->url->host,
- s != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
- return;
- }
-
- g_free (result);
- }
- g_free (flags);
- }
- }
- }
-}
-
-static void
-imap_expunge (CamelFolder *folder, CamelException *ex)
-{
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
- gchar *node, *result;
- gint i, status, recent = -1;
-
- g_return_if_fail (folder != NULL);
-
- imap_sync (folder, FALSE, ex);
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder,
- &result, "EXPUNGE");
-
- if (status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not EXPUNGE from IMAP server %s: %s.",
- service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
- return;
- }
-
- /* determine which messages were successfully expunged */
- node = result;
- for (i = 0; node; i++) {
- if (*node == '*') {
- char *word;
-
- word = imap_next_word (node);
-
- if (!strncmp (word, "NO", 2)) {
- /* Something failed, probably a Read-Only mailbox? */
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
- char *reason, *ep;
-
- word = imap_next_word (word);
- for (ep = word; *ep && *ep != '\n'; ep++);
- reason = g_strndup (word, (gint)(ep - word) + 1);
-
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not EXPUNGE from IMAP server %s: %s.",
- service->url->host, reason ? reason :
- "Unknown error");
-
- g_free (reason);
- break;
- }
-
- /* else we have a message id? */
- if (*word >= '0' && *word <= '9' && !strncmp ("EXPUNGE", imap_next_word (word), 7)) {
- int id;
-
- id = atoi (word);
-
- d(fprintf (stderr, "Expunging message %d from the summary (i = %d)\n", id + i, i));
-
- if (id <= imap_folder->summary->len) {
- CamelMessageInfo *info;
-
- info = (CamelMessageInfo *) imap_folder->summary->pdata[id - 1];
-
- /* remove from the lookup table and summary */
- g_hash_table_remove (imap_folder->summary_hash, info->uid);
- g_ptr_array_remove_index (imap_folder->summary, id - 1);
-
- /* free the info data */
- g_free (info->subject);
- g_free (info->from);
- g_free (info->to);
- g_free (info->cc);
- g_free (info->uid);
- g_free (info->message_id);
- header_references_list_clear (&info->references);
- g_free (info);
- info = NULL;
- } else {
- /* Hopefully this should never happen */
- d(fprintf (stderr, "imap expunge-error: message %d is out of range\n", id));
- }
- } else if (*word >= '0' && *word <= '9' && !strncmp ("RECENT", imap_next_word (word), 6)) {
- recent = atoi (word);
- if (!recent)
- recent = -1;
- }
- } else {
- break;
- }
-
- for ( ; *node && *node != '\n'; node++);
- if (*node)
- node++;
- }
-
- g_free (result);
-
- camel_imap_folder_changed (folder, recent, ex);
-}
-
-static gint
-imap_get_message_count_internal (CamelFolder *folder, CamelException *ex)
-{
- CamelStore *store = CAMEL_STORE (folder->parent_store);
- CamelURL *url = CAMEL_SERVICE (store)->url;
- gchar *result, *msg_count, *folder_path, *dir_sep;
- gint status, count = 0;
-
- g_return_val_if_fail (folder != NULL, 0);
- g_return_val_if_fail (folder->can_hold_messages, 0);
-
- dir_sep = CAMEL_IMAP_STORE (folder->parent_store)->dir_sep;
-
- if (url && url->path && *(url->path + 1) && strcmp (folder->full_name, "INBOX"))
- folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
- else
- folder_path = g_strdup (folder->full_name);
-
- if (CAMEL_IMAP_STORE (store)->has_status_capability)
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (store), folder,
- &result, "STATUS %s (MESSAGES)", folder_path);
- else
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (store), folder,
- &result, "EXAMINE %s", folder_path);
-
- if (status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not get message count for %s from IMAP "
- "server %s: %s.", folder_path, service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
- g_free (folder_path);
- return 0;
- }
- g_free (folder_path);
-
- /* parse out the message count */
- if (result && *result == '*') {
- if (CAMEL_IMAP_STORE (store)->has_status_capability) {
- /* should come in the form: "* STATUS <folder> (MESSAGES <count>)" */
- if ((msg_count = strstr (result, "MESSAGES")) != NULL) {
- msg_count = imap_next_word (msg_count);
-
- /* we should now be pointing to the message count */
- count = atoi (msg_count);
- }
- } else {
- /* should come in the form: "* <count> EXISTS" */
- if ((msg_count = strstr (result, "EXISTS")) != NULL) {
- for ( ; msg_count > result && *msg_count != '*'; msg_count--);
-
- msg_count = imap_next_word (msg_count);
-
- /* we should now be pointing to the message count */
- count = atoi (msg_count);
- }
- }
- }
- g_free (result);
-
- return count;
-}
-
-static gint
-imap_get_message_count (CamelFolder *folder)
-{
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
-
- if (imap_folder->summary)
- return imap_folder->summary->len;
- else
- return 0;
-}
-
-static gint
-imap_get_unread_message_count (CamelFolder *folder)
-{
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
- CamelMessageInfo *info;
- GPtrArray *infolist;
- gint i, count = 0;
-
- g_return_val_if_fail (folder != NULL, 0);
-
- /* If we don't have a message count, return 0 */
- if (!imap_folder->summary)
- return 0;
-
- infolist = imap_get_summary (folder);
-
- for (i = 0; i < infolist->len; i++) {
- info = (CamelMessageInfo *) g_ptr_array_index (infolist, i);
- if (!(info->flags & CAMEL_MESSAGE_SEEN))
- count++;
- }
-
- return count;
-}
-
-static void
-imap_append_message (CamelFolder *folder, CamelMimeMessage *message, const CamelMessageInfo *info, CamelException *ex)
-{
- CamelStore *store = CAMEL_STORE (folder->parent_store);
- CamelURL *url = CAMEL_SERVICE (store)->url;
- CamelStream *memstream;
- GByteArray *ba;
- gchar *result, *cmdid, *dir_sep;
- gchar *folder_path, *flagstr = NULL;
- gint status;
-
- g_return_if_fail (folder != NULL);
- g_return_if_fail (message != NULL);
-
- dir_sep = CAMEL_IMAP_STORE (folder->parent_store)->dir_sep;
-
- if (url && url->path && *(url->path + 1) && strcmp (folder->full_name, "INBOX"))
- folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
- else
- folder_path = g_strdup (folder->full_name);
-
- /* create flag string param */
- if (info && info->flags) {
- flagstr = g_strconcat (" (", info->flags & CAMEL_MESSAGE_SEEN ? "\\Seen " : "",
- info->flags & CAMEL_MESSAGE_DRAFT ? "\\Draft " : "",
- info->flags & CAMEL_MESSAGE_DELETED ? "\\Answered " : "",
- NULL);
- if (flagstr)
- *(flagstr + strlen (flagstr) - 1) = ')';
- }
-
- ba = g_byte_array_new ();
- memstream = camel_stream_mem_new_with_byte_array (ba);
- /* FIXME: we need to crlf/dot filter */
- camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), memstream);
- camel_stream_write_string (memstream, "\r\n");
- camel_stream_reset (memstream);
-
- status = camel_imap_command_preliminary (CAMEL_IMAP_STORE (folder->parent_store),
- &result, &cmdid, "APPEND %s%s {%d}",
- folder_path, flagstr ? flagstr : "", ba->len - 2);
-
- if (status != CAMEL_IMAP_PLUS) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not APPEND message to IMAP server %s: %s.",
- service->url->host, result ? result : "Unknown error");
-
- g_free (result);
- g_free (cmdid);
- g_free (folder_path);
- return;
- }
-
- g_free (result);
- g_free (folder_path);
-
- /* send the rest of our data - the mime message */
- status = camel_imap_command_continuation_with_stream (CAMEL_IMAP_STORE (folder->parent_store),
- &result, cmdid, memstream);
-
- if (status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not APPEND message to IMAP server %s: %s.",
- service->url->host, result ? result : "Unknown error");
-
- camel_object_unref (CAMEL_OBJECT (memstream));
- g_free (result);
- g_free (cmdid);
- return;
- }
-
- camel_object_unref (CAMEL_OBJECT (memstream));
- g_free (cmdid);
- g_free (result);
-
- camel_imap_folder_changed (folder, 1, ex);
-}
-
-static void
-imap_copy_message_to (CamelFolder *source, const char *uid, CamelFolder *destination, CamelException *ex)
-{
- CamelStore *store = CAMEL_STORE (source->parent_store);
- CamelURL *url = CAMEL_SERVICE (store)->url;
- char *result, *folder_path, *dir_sep;
- int status;
-
- dir_sep = CAMEL_IMAP_STORE (source->parent_store)->dir_sep;
-
- if (url && url->path && *(url->path + 1) && strcmp (destination->full_name, "INBOX"))
- folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, destination->full_name);
- else
- folder_path = g_strdup (destination->full_name);
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (store), source, &result,
- "UID COPY %s %s", uid, folder_path);
-
- if (status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not COPY message %s to %s on IMAP server %s: %s.",
- uid, folder_path, service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
- g_free (folder_path);
- return;
- }
-
- g_free (result);
- g_free (folder_path);
-
- camel_imap_folder_changed (destination, 1, ex);
-}
-
-/* FIXME: Duplication of code! */
-static void
-imap_move_message_to (CamelFolder *source, const char *uid, CamelFolder *destination, CamelException *ex)
-{
- CamelStore *store = CAMEL_STORE (source->parent_store);
- CamelURL *url = CAMEL_SERVICE (store)->url;
- CamelMessageInfo *info;
- char *result, *folder_path, *dir_sep;
- int status;
-
- dir_sep = CAMEL_IMAP_STORE (source->parent_store)->dir_sep;
-
- if (url && url->path && *(url->path + 1) && strcmp (destination->full_name, "INBOX"))
- folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, destination->full_name);
- else
- folder_path = g_strdup (destination->full_name);
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (store), source, &result,
- "UID COPY %s %s", uid, folder_path);
-
- if (status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not COPY message %s to %s on IMAP server %s: %s.",
- uid, folder_path, service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
- g_free (folder_path);
- return;
- }
-
- g_free (result);
- g_free (folder_path);
-
- if (!(info = (CamelMessageInfo *)imap_get_message_info (source, uid))) {
- CamelService *service = CAMEL_SERVICE (store);
-
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not set flags for message %s on IMAP server %s: %s",
- uid, service->url->host, "Unknown error");
- return;
- }
-
- imap_set_message_flags (source, uid, CAMEL_MESSAGE_DELETED, ~(info->flags));
-
- camel_imap_folder_changed (destination, 1, ex);
-}
-
-static GPtrArray *
-imap_get_uids (CamelFolder *folder)
-{
- CamelMessageInfo *info;
- GPtrArray *array, *infolist;
- gint i, count;
-
- infolist = imap_get_summary (folder);
- count = infolist->len;
-
- array = g_ptr_array_new ();
- g_ptr_array_set_size (array, count);
-
- for (i = 0; i < count; i++) {
- info = (CamelMessageInfo *) g_ptr_array_index (infolist, i);
- array->pdata[i] = g_strdup (info->uid);
- }
-
- return array;
-}
-
-static GPtrArray *
-imap_get_subfolder_names_internal (CamelFolder *folder, CamelException *ex)
-{
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
- CamelStore *store = CAMEL_STORE (folder->parent_store);
- CamelURL *url = CAMEL_SERVICE (store)->url;
- GPtrArray *listing;
- gboolean found_inbox = FALSE;
- gint status;
- gchar *result, *namespace, *dir_sep;
-
- g_return_val_if_fail (folder != NULL, g_ptr_array_new ());
-
- dir_sep = CAMEL_IMAP_STORE (folder->parent_store)->dir_sep;
-
- if (url && url->path) {
- if (!strcmp (folder->full_name, url->path + 1))
- namespace = g_strdup (url->path + 1);
- else if (!strcmp (folder->full_name, "INBOX"))
- namespace = g_strdup (url->path + 1); /* FIXME: erm...not sure */
- else
- namespace = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
- } else {
- namespace = g_strdup (folder->full_name);
- }
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), NULL,
- &result, "LIST \"\" \"%s%s*\"", namespace,
- *namespace ? dir_sep : "");
-
- if (status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not get subfolder listing from IMAP "
- "server %s: %s.", service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
- g_free (namespace);
-
- imap_folder->lsub = g_ptr_array_new ();
- return imap_folder->lsub;
- }
-
- /* parse out the subfolders */
- listing = g_ptr_array_new ();
- if (result) {
- char *ptr = result;
-
- while (ptr && *ptr == '*') {
- gchar *flags, *sep, *dir, *buf, *end;
-
- for (end = ptr; *end && *end != '\n'; end++);
- buf = g_strndup (ptr, (gint)(end - ptr));
- ptr = end;
-
- if (!imap_parse_list_response (buf, namespace, &flags, &sep, &dir)) {
- g_free (buf);
- g_free (flags);
- g_free (sep);
- g_free (dir);
-
- if (*ptr == '\n')
- ptr++;
-
- continue;
- }
-
- g_free (buf);
- g_free (flags);
-
- if (*dir) {
- d(fprintf (stderr, "adding folder: %s\n", dir));
- if (!g_strcasecmp (dir, "INBOX"))
- found_inbox = TRUE;
- g_ptr_array_add (listing, dir);
- }
-
- g_free (sep);
-
- if (*ptr == '\n')
- ptr++;
- }
- }
-
- if (!strcmp (folder->name, namespace) && !found_inbox) {
- g_ptr_array_add (listing, g_strdup ("INBOX"));
- }
-
- g_free (result);
- g_free (namespace);
-
- imap_folder->lsub = listing;
-
- return listing;
-}
-
-static GPtrArray *
-imap_get_subfolder_names (CamelFolder *folder)
-{
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
-
- return imap_folder->lsub;
-}
-
-static CamelMimeMessage *
-imap_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
-{
- CamelStream *msgstream = NULL;
- /*CamelStreamFilter *f_stream;*/
- /*CamelMimeFilter *filter;*/
- CamelMimeMessage *msg = NULL;
- /*CamelMimePart *part;*/
- gchar *result, *header, *body, *mesg, *p, *q, *data_item;
- int status, part_len;
-
- if (CAMEL_IMAP_STORE (folder->parent_store)->server_level >= IMAP_LEVEL_IMAP4REV1)
- data_item = "BODY.PEEK[HEADER]";
- else
- data_item = "RFC822.HEADER";
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder,
- &result, "UID FETCH %s %s", uid,
- data_item);
-
- if (!result || status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
-
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not fetch message %s on IMAP server %s: %s",
- uid, service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
- return NULL;
- }
-
- for (p = result; *p && *p != '{' && *p != '\n'; p++);
- if (*p != '{') {
- g_free (result);
- return NULL;
- }
-
- part_len = atoi (p + 1);
- for ( ; *p && *p != '\n'; p++);
- if (*p != '\n') {
- g_free (result);
- return NULL;
- }
-
- /* calculate the new part-length */
- for (q = p; *q && (q - p) <= part_len; q++) {
- if (*q == '\n')
- part_len--;
- }
- /* FIXME: This is a hack for IMAP daemons that send us a UID at the end of each FETCH */
- for (q--, part_len--; q > p && *(q-1) != '\n'; q--, part_len--);
-
- header = g_strndup (p, part_len + 1);
-
- g_free (result);
- d(fprintf (stderr, "*** We got the header ***\n"));
-
- if (CAMEL_IMAP_STORE (folder->parent_store)->server_level >= IMAP_LEVEL_IMAP4REV1)
- data_item = "BODY[TEXT]";
- else
- data_item = "RFC822.TEXT";
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder,
- &result, "UID FETCH %s %s", uid,
- data_item);
-
- if (!result || status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
-
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not fetch message %s on IMAP server %s: %s",
- uid, service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
- g_free (header);
- return NULL;
- }
-
- for (p = result; *p && *p != '{' && *p != '\n'; p++);
- if (*p != '{') {
- /* this is a hack for when the part length isn't in {}'s */
- part_len = 1;
- for ( ; *p && *p != '\n'; p++);
- p++;
- } else {
- part_len = atoi (p + 1);
- for ( ; *p && *p != '\n'; p++);
- if (*p != '\n') {
- g_free (result);
- g_free (header);
- return NULL;
- }
- }
-
- /* calculate the new part-length */
- for (q = p; *q && (q - p) <= part_len; q++) {
- if (*q == '\n')
- part_len--;
- }
- /* FIXME: This is a hack for IMAP daemons that send us a UID at the end of each FETCH */
- for ( ; q > p && *(q-1) != '\n'; q--, part_len--);
-
- body = g_strndup (p, part_len + 1);
-
- g_free (result);
- d(fprintf (stderr, "*** We got the body ***\n"));
-
- mesg = g_strdup_printf ("%s\n%s", header, body);
- g_free (header);
- g_free (body);
- d(fprintf (stderr, "*** We got the mesg ***\n"));
-
- d(fprintf (stderr, "Message:\n%s\n", mesg));
-
- msgstream = camel_stream_mem_new_with_buffer (mesg, strlen (mesg) + 1);
-#if 0
- f_stream = camel_stream_filter_new_with_stream (msgstream);
- filter = camel_mime_filter_crlf_new (CAMEL_MIME_FILTER_CRLF_DECODE, CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS);
- id = camel_stream_filter_add (f_stream, CAMEL_MIME_FILTER (filter));
-#endif
- msg = camel_mime_message_new ();
- d(fprintf (stderr, "*** We created the camel_mime_message ***\n"));
-
- camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (msg), msgstream);
-#if 0
- camel_stream_filter_remove (f_stream, id);
- camel_stream_close (CAMEL_STREAM (f_stream));
-#endif
- camel_object_unref (CAMEL_OBJECT (msgstream));
- /*camel_object_unref (CAMEL_OBJECT (f_stream));*/
-
- d(fprintf (stderr, "*** We're returning... ***\n"));
-
- g_free (mesg);
- return msg;
-
-#if 0
- CamelStream *imap_stream;
- CamelStream *msgstream;
- CamelStreamFilter *f_stream; /* will be used later w/ crlf filter */
- CamelMimeFilter *filter; /* crlf/dot filter */
- CamelMimeMessage *msg;
- CamelMimePart *part;
- CamelDataWrapper *cdw;
- gchar *cmdbuf;
- int id;
-
- /* TODO: fetch the correct part, get rid of the hard-coded stuff */
- cmdbuf = g_strdup_printf ("UID FETCH %s BODY[TEXT]", uid);
- imap_stream = camel_imap_stream_new (CAMEL_IMAP_FOLDER (folder), cmdbuf);
- g_free (cmdbuf);
-
-
- /* Temp hack - basically we read in the entire message instead of getting a part as it's needed */
- msgstream = camel_stream_mem_new ();
- camel_stream_write_to_stream (CAMEL_STREAM (imap_stream), msgstream);
- camel_object_unref (CAMEL_OBJECT (imap_stream));
-
- f_stream = camel_stream_filter_new_with_stream (msgstream);
- filter = camel_mime_filter_crlf_new (CAMEL_MIME_FILTER_CRLF_DECODE, CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS);
- id = camel_stream_filter_add (f_stream, CAMEL_MIME_FILTER (filter));
-
- msg = camel_mime_message_new ();
-
- /*cdw = camel_data_wrapper_new ();*/
- /*camel_data_wrapper_construct_from_stream (cdw, CAMEL_STREAM (f_stream));*/
- camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (msg), CAMEL_STREAM (f_stream));
-
- camel_stream_filter_remove (f_stream, id);
- camel_stream_close (CAMEL_STREAM (f_stream));
- camel_object_unref (CAMEL_OBJECT (msgstream));
- camel_object_unref (CAMEL_OBJECT (f_stream));
-
- /*camel_data_wrapper_set_mime_type (cdw, "text/plain");*/
-
- /*camel_medium_set_content_object (CAMEL_MEDIUM (msg), CAMEL_DATA_WRAPPER (cdw));*/
- /*camel_object_unref (CAMEL_OBJECT (cdw));*/
-
- return msg;
-#endif
-}
-
-/* This probably shouldn't go here...but it will for now */
-static gchar *
-get_header_field (gchar *header, gchar *field)
-{
- gchar *part, *index, *p, *q;
-
- index = (char *) e_strstrcase (header, field);
- if (index == NULL)
- return NULL;
-
- p = index + strlen (field) + 1;
- for (q = p; *q; q++)
- if (*q == '\n' && (*(q + 1) != ' ' && *(q + 1) != '\t'))
- break;
-
- part = g_strndup (p, (gint)(q - p));
-
- /* it may be wrapped on multiple lines, so lets strip out \n's */
- for (p = part; *p; ) {
- if (*p == '\n')
- memmove (p, p + 1, strlen (p));
- else
- p++;
- }
-
- return part;
-}
-
-static char *header_fields[] = { "subject", "from", "to", "cc", "date",
- "received", "message-id", "references",
- "in-reply-to", "" };
-/**
- * imap_protocol_get_summary_specifier
- *
- * Make a data item specifier for the header lines we need,
- * appropriate to the server level.
- *
- * IMAP4rev1: UID FLAGS BODY[HEADER.FIELDS (SUBJECT FROM .. IN-REPLY-TO)]
- * IMAP4: UID FLAGS RFC822.HEADER.LINES (SUBJECT FROM .. IN-REPLY-TO)
- **/
-static char *
-imap_protocol_get_summary_specifier (CamelFolder *folder)
-{
- char *sect_begin, *sect_end;
- char *headers_wanted = "SUBJECT FROM TO CC DATE MESSAGE-ID REFERENCES IN-REPLY-TO";
-
- if (CAMEL_IMAP_STORE (folder->parent_store)->server_level >= IMAP_LEVEL_IMAP4REV1) {
- sect_begin = "BODY[HEADER.FIELDS";
- sect_end = "]";
- } else {
- sect_begin = "RFC822.HEADER.LINES";
- sect_end = "";
- }
-
- return g_strdup_printf ("UID FLAGS %s (%s)%s", sect_begin, headers_wanted, sect_end);
-}
-
-static GPtrArray *
-imap_get_summary_internal (CamelFolder *folder, CamelException *ex)
-{
- /* This ALWAYS updates the summary except on fail */
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
- GPtrArray *summary = NULL, *headers = NULL;
- GHashTable *hash = NULL;
- gint num, i, j, status = 0;
- char *result, *q, *node;
- const char *received;
- char *summary_specifier;
- struct _header_raw *h = NULL, *tail = NULL;
-
- num = imap_get_message_count_internal (folder, ex);
-
- /* sync any previously set/changed message flags */
- imap_sync (folder, FALSE, ex);
-
- if (num == 0) {
- /* clean up any previous summary data */
- imap_folder_summary_free (imap_folder);
-
- imap_folder->summary = g_ptr_array_new ();
- imap_folder->summary_hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- return imap_folder->summary;
- }
-
- summary_specifier = imap_protocol_get_summary_specifier (folder);
-
- if (num == 1) {
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder,
- &result, "FETCH 1 (%s)", summary_specifier);
- } else {
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder,
- &result, "FETCH 1:%d (%s)", num, summary_specifier);
- }
- g_free (summary_specifier);
-
- if (status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
-
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not get summary for %s on IMAP server %s: %s",
- folder->full_name, service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
-
- if (!imap_folder->summary) {
- imap_folder->summary = g_ptr_array_new ();
- imap_folder->summary_hash = g_hash_table_new (g_str_hash, g_str_equal);
- }
-
- return imap_folder->summary;
- }
-
- /* initialize our new summary-to-be */
- summary = g_ptr_array_new ();
- hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- /* create our array of headers from the server response */
- headers = g_ptr_array_new ();
- node = result;
- for (i = 1; node; i++) {
- char *end;
-
- if ((end = strstr (node + 2, "\n*"))) {
- g_ptr_array_add (headers, g_strndup (node, (gint)(end - node)));
- } else {
- g_ptr_array_add (headers, g_strdup (node));
- }
- node = end;
- }
- if (i < num) {
- d(fprintf (stderr, "IMAP server didn't respond with as many headers as we expected...\n"));
- /* should we error?? */
- }
-
- g_free (result);
- result = NULL;
-
- for (i = 0; i < headers->len; i++) {
- CamelMessageInfo *info;
- char *uid, *flags, *header;
-
- info = g_malloc0 (sizeof (CamelMessageInfo));
-
- /* lets grab the UID... */
- if (!(uid = strstr (headers->pdata[i], "UID "))) {
- d(fprintf (stderr, "Cannot get a uid for %d\n\n%s\n\n", i+1, (char *) headers->pdata[i]));
- g_free (info);
- break;
- }
-
- for (uid += 4; *uid && (*uid < '0' || *uid > '9'); uid++); /* advance to <uid> */
- for (q = uid; *q && *q >= '0' && *q <= '9'; q++); /* find the end of the <uid> */
- info->uid = g_strndup (uid, (gint)(q - uid));
- d(fprintf (stderr, "*** info->uid = %s\n", info->uid));
-
- /* now lets grab the FLAGS */
- if (!(flags = strstr (headers->pdata[i], "FLAGS "))) {
- d(fprintf (stderr, "We didn't seem to get any flags for %d...\n", i));
- g_free (info->uid);
- g_free (info);
- break;
- }
-
- for (flags += 6; *flags && *flags != '('; flags++); /* advance to <flags> */
- for (q = flags; *q && *q != ')'; q++); /* find the end of <flags> */
- flags = g_strndup (flags, (gint)(q - flags + 1));
- d(fprintf (stderr, "*** info->flags = %s\n", flags));
-
- /* now we gotta parse for the flags */
- info->flags = 0;
- if (strstr (flags, "\\Seen"))
- info->flags |= CAMEL_MESSAGE_SEEN;
- if (strstr (flags, "\\Answered"))
- info->flags |= CAMEL_MESSAGE_ANSWERED;
- if (strstr (flags, "\\Flagged"))
- info->flags |= CAMEL_MESSAGE_FLAGGED;
- if (strstr (flags, "\\Deleted"))
- info->flags |= CAMEL_MESSAGE_DELETED;
- if (strstr (flags, "\\Draft"))
- info->flags |= CAMEL_MESSAGE_DRAFT;
- g_free (flags);
- flags = NULL;
-
- /* construct the header list */
- /* fast-forward to beginning of header info... */
- for (header = headers->pdata[i]; *header && *header != '\n'; header++);
- h = NULL;
- for (j = 0; *header_fields[j]; j++) {
- struct _header_raw *raw;
- char *field, *value;
-
- field = g_strdup_printf ("\n%s:", header_fields[j]);
- value = get_header_field (header, field);
- g_free (field);
- if (!value)
- continue;
-
- raw = g_malloc0 (sizeof (struct _header_raw));
- raw->next = NULL;
- raw->name = g_strdup (header_fields[j]);
- raw->value = value;
- raw->offset = -1;
-
- if (!h) {
- h = raw;
- tail = h;
- } else {
- tail->next = raw;
- tail = raw;
- }
- }
-
- /* construct the CamelMessageInfo */
- info->subject = camel_summary_format_string (h, "subject");
- info->from = camel_summary_format_address (h, "from");
- info->to = camel_summary_format_address (h, "to");
- info->cc = camel_summary_format_address (h, "cc");
- info->user_flags = NULL;
- info->date_sent = header_decode_date (header_raw_find (&h, "date", NULL), NULL);
- received = header_raw_find (&h, "received", NULL);
- if (received)
- received = strrchr (received, ';');
- if (received)
- info->date_received = header_decode_date (received + 1, NULL);
- else
- info->date_received = 0;
- info->message_id = header_msgid_decode (header_raw_find (&h, "message-id", NULL));
- /* if we have a references, use that, otherwise, see if we have an in-reply-to
- header, with parsable content, otherwise *shrug* */
- info->references = header_references_decode (header_raw_find (&h, "references", NULL));
- if (info->references == NULL)
- info->references = header_references_decode (header_raw_find (&h, "in-reply-to", NULL));
-
- while (h) {
- struct _header_raw *next = h->next;
-
- g_free (h->name);
- g_free (h->value);
- g_free (h);
- h = next;
- }
-
- g_ptr_array_add (summary, info);
- g_hash_table_insert (hash, info->uid, info);
- }
-
- for (i = 0; i < headers->len; i++)
- g_free (headers->pdata[i]);
- g_ptr_array_free (headers, TRUE);
-
- /* clean up any previous summary data */
- imap_folder_summary_free (imap_folder);
-
- imap_folder->summary = summary;
- imap_folder->summary_hash = hash;
-
- return imap_folder->summary;
-}
-
-static GPtrArray *
-imap_get_summary (CamelFolder *folder)
-{
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
-
- return imap_folder->summary;
-}
-
-/* get a single message info from the server */
-static CamelMessageInfo *
-imap_get_message_info_internal (CamelFolder *folder, guint id)
-{
- CamelMessageInfo *info = NULL;
- struct _header_raw *h, *tail = NULL;
- const char *received;
- char *result, *uid, *flags, *header, *q;
- char *summary_specifier;
- int j, status;
-
- /* we don't have a cached copy, so fetch it */
- summary_specifier = imap_protocol_get_summary_specifier (folder);
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder,
- &result, "FETCH %d (%s)", id, summary_specifier);
-
- g_free (summary_specifier);
-
- if (status != CAMEL_IMAP_OK) {
- g_free (result);
- return NULL;
- }
-
- /* lets grab the UID... */
- if (!(uid = (char *) e_strstrcase (result, "UID "))) {
- d(fprintf (stderr, "Cannot get a uid for %d\n\n%s\n\n", id, result));
- g_free (result);
- return NULL;
- }
-
- for (uid += 4; *uid && (*uid < '0' || *uid > '9'); uid++); /* advance to <uid> */
- for (q = uid; *q && *q >= '0' && *q <= '9'; q++); /* find the end of the <uid> */
- uid = g_strndup (uid, (gint)(q - uid));
-
- info = g_malloc0 (sizeof (CamelMessageInfo));
- info->uid = uid;
- d(fprintf (stderr, "*** info->uid = %s\n", info->uid));
-
- /* now lets grab the FLAGS */
- if (!(flags = strstr (q, "FLAGS "))) {
- d(fprintf (stderr, "We didn't seem to get any flags for %s...\n", uid));
- g_free (info->uid);
- g_free (info);
- g_free (result);
- return NULL;
- }
-
- for (flags += 6; *flags && *flags != '('; flags++); /* advance to <flags> */
- for (q = flags; *q && *q != ')'; q++); /* find the end of <flags> */
- flags = g_strndup (flags, (gint)(q - flags + 1));
- d(fprintf (stderr, "*** info->flags = %s\n", flags));
-
- /* now we gotta parse for the flags */
- info->flags = 0;
- if (strstr (flags, "\\Seen"))
- info->flags |= CAMEL_MESSAGE_SEEN;
- if (strstr (flags, "\\Answered"))
- info->flags |= CAMEL_MESSAGE_ANSWERED;
- if (strstr (flags, "\\Flagged"))
- info->flags |= CAMEL_MESSAGE_FLAGGED;
- if (strstr (flags, "\\Deleted"))
- info->flags |= CAMEL_MESSAGE_DELETED;
- if (strstr (flags, "\\Draft"))
- info->flags |= CAMEL_MESSAGE_DRAFT;
- g_free (flags);
- flags = NULL;
-
- /* construct the header list */
- /* fast-forward to beginning of header info... */
- for (header = q; *header && *header != '\n'; header++);
- h = NULL;
- for (j = 0; *header_fields[j]; j++) {
- struct _header_raw *raw;
- char *field, *value;
-
- field = g_strdup_printf ("\n%s:", header_fields[j]);
- value = get_header_field (header, field);
- g_free (field);
- if (!value)
- continue;
-
- raw = g_malloc0 (sizeof (struct _header_raw));
- raw->next = NULL;
- raw->name = g_strdup (header_fields[j]);
- raw->value = value;
- raw->offset = -1;
-
- if (!h) {
- h = raw;
- tail = h;
- } else {
- tail->next = raw;
- tail = raw;
- }
- }
-
- /* construct the CamelMessageInfo */
- info->subject = camel_summary_format_string (h, "subject");
- info->from = camel_summary_format_address (h, "from");
- info->to = camel_summary_format_address (h, "to");
- info->cc = camel_summary_format_address (h, "cc");
- info->user_flags = NULL;
- info->date_sent = header_decode_date (header_raw_find (&h, "date", NULL), NULL);
- received = header_raw_find (&h, "received", NULL);
- if (received)
- received = strrchr (received, ';');
- if (received)
- info->date_received = header_decode_date (received + 1, NULL);
- else
- info->date_received = 0;
- info->message_id = header_msgid_decode (header_raw_find (&h, "message-id", NULL));
- /* if we have a references, use that, otherwise, see if we have an in-reply-to
- header, with parsable content, otherwise *shrug* */
- info->references = header_references_decode (header_raw_find (&h, "references", NULL));
- if (info->references == NULL)
- info->references = header_references_decode (header_raw_find (&h, "in-reply-to", NULL));
-
- while (h->next) {
- struct _header_raw *next = h->next;
-
- g_free (h->name);
- g_free (h->value);
- g_free (h);
- h = next;
- }
-
- g_free (result);
-
- return info;
-}
-
-/* get a single message info, by uid */
-static const CamelMessageInfo *
-imap_get_message_info (CamelFolder *folder, const char *uid)
-{
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
-
- g_return_val_if_fail (*uid != '\0', NULL);
-
- if (imap_folder->summary)
- return (CamelMessageInfo *) g_hash_table_lookup (imap_folder->summary_hash, uid);
-
- return NULL;
-}
-
-static GPtrArray *
-imap_search_by_expression (CamelFolder *folder, const char *expression, CamelException *ex)
-{
- /* NOTE: This is experimental code... */
- GPtrArray *uids = NULL;
- char *result, *sexp, *p;
- int status;
-
- d(fprintf (stderr, "camel sexp: '%s'\n", expression));
- sexp = imap_translate_sexp (expression);
- d(fprintf (stderr, "imap sexp: '%s'\n", sexp));
-
- uids = g_ptr_array_new ();
-
- if (!folder->has_search_capability) {
- g_free (sexp);
- return uids;
- }
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder,
- &result, "UID SEARCH %s", sexp);
-
- if (status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
-
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not get summary for %s on IMAP server %s: %s",
- folder->full_name, service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
- g_free (sexp);
- return uids;
- }
-
- if ((p = strstr (result, "* SEARCH"))) {
- char *word;
-
- word = imap_next_word (p); /* word now points to SEARCH */
-
- for (word = imap_next_word (word); *word && *word != '*'; word = imap_next_word (word)) {
- gboolean word_is_numeric = TRUE;
- char *ep;
-
- /* find the end of this word and make sure it's a numeric uid */
- for (ep = word; *ep && *ep != ' ' && *ep != '\n'; ep++)
- if (*ep < '0' || *ep > '9')
- word_is_numeric = FALSE;
-
- if (word_is_numeric)
- g_ptr_array_add (uids, g_strndup (word, (gint)(ep - word)));
- }
- }
-
- g_free (result);
- g_free (sexp);
-
- return uids;
-}
-
-#if 0
-static guint32
-imap_get_permanent_flags (CamelFolder *folder, CamelException *ex)
-{
- /* return permamnant flags */
- return folder->permanent_flags;
-}
-#endif
-
-static guint32
-imap_get_message_flags (CamelFolder *folder, const char *uid)
-{
- const CamelMessageInfo *info;
-
- info = imap_get_message_info (folder, uid);
- g_return_val_if_fail (info != NULL, 0);
-
- return info->flags;
-}
-
-static void
-imap_set_message_flags (CamelFolder *folder, const char *uid, guint32 flags, guint32 set)
-{
- CamelMessageInfo *info;
-
- info = (CamelMessageInfo*)imap_get_message_info (folder, uid);
- g_return_if_fail (info != NULL);
-
- info->flags = (info->flags & ~flags) | (set & flags) | CAMEL_MESSAGE_FOLDER_FLAGGED;
-
- /*gtk_signal_emit_by_name (GTK_OBJECT (folder), "message_changed", uid);*/
- camel_object_trigger_event (CAMEL_OBJECT (folder), "message_changed", (gpointer *) uid);
-}
-
-static gboolean
-imap_get_message_user_flag (CamelFolder *folder, const char *uid, const char *name)
-{
- return FALSE;
-}
-
-static void
-imap_set_message_user_flag (CamelFolder *folder, const char *uid, const char *name, gboolean value)
-{
- /*gtk_signal_emit_by_name (GTK_OBJECT (folder), "message_changed", uid);*/
- camel_object_trigger_event (CAMEL_OBJECT (folder), "message_changed", (gpointer *) uid);
-}
-
-void
-camel_imap_folder_changed (CamelFolder *folder, gint recent, CamelException *ex)
-{
- d(fprintf (stderr, "camel_imap_folder_changed: recent = %d\n", recent));
-
- g_return_if_fail (recent);
-
- if (recent > 0) {
- CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
- CamelMessageInfo *info;
- gint i, j, last;
-
- if (!imap_folder->summary) {
- imap_folder->summary = g_ptr_array_new ();
- imap_folder->summary_hash = g_hash_table_new (g_str_hash, g_str_equal);
- }
-
- last = imap_folder->summary->len + 1;
-
- for (i = last, j = 0; j < recent; i++, j++) {
- info = imap_get_message_info_internal (folder, i);
- if (info) {
- g_ptr_array_add (imap_folder->summary, info);
- g_hash_table_insert (imap_folder->summary_hash, info->uid, info);
- } else {
- /* our hack failed so now we need to do it the old fashioned way */
- /*imap_get_summary_internal (folder, ex);*/
- d(fprintf (stderr, "*** we tried to get message %d but failed\n", i));
- break;
- }
- }
- }
-
- /*gtk_signal_emit_by_name (GTK_OBJECT (folder), "folder_changed", 0);*/
- camel_object_trigger_event (CAMEL_OBJECT (folder), "folder_changed", GINT_TO_POINTER (0));
-}
diff --git a/camel/providers/imap/camel-imap-folder.h b/camel/providers/imap/camel-imap-folder.h
deleted file mode 100644
index bd1647c300..0000000000
--- a/camel/providers/imap/camel-imap-folder.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-imap-folder.h : Abstract class for an imap folder */
-
-/*
- * Author:
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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 CAMEL_IMAP_FOLDER_H
-#define CAMEL_IMAP_FOLDER_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include "camel-folder.h"
-#include <camel/camel-folder-search.h>
-
-#define CAMEL_IMAP_FOLDER_TYPE (camel_imap_folder_get_type ())
-#define CAMEL_IMAP_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_IMAP_FOLDER_TYPE, CamelImapFolder))
-#define CAMEL_IMAP_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_IMAP_FOLDER_TYPE, CamelImapFolderClass))
-#define IS_CAMEL_IMAP_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_IMAP_FOLDER_TYPE))
-
-typedef struct {
- CamelFolder parent_object;
-
- CamelFolderSearch *search; /* used to run searches */
-
- GPtrArray *summary;
- GHashTable *summary_hash;
-
- GPtrArray *lsub;
-} CamelImapFolder;
-
-
-typedef struct {
- CamelFolderClass parent_class;
-
- /* Virtual methods */
-
-} CamelImapFolderClass;
-
-
-/* public methods */
-CamelFolder *camel_imap_folder_new (CamelStore *parent, char *folder_name,
- CamelException *ex);
-
-void camel_imap_folder_changed (CamelFolder *folder, gint recent, CamelException *ex);
-
-/* Standard Camel function */
-CamelType camel_imap_folder_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_IMAP_FOLDER_H */
diff --git a/camel/providers/imap/camel-imap-provider.c b/camel/providers/imap/camel-imap-provider.c
deleted file mode 100644
index 21452d5cee..0000000000
--- a/camel/providers/imap/camel-imap-provider.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-imap-provider.c: imap provider registration code */
-
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (www.helixcode.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.
- *
- */
-
-
-#include "config.h"
-#include "camel-imap-store.h"
-#include "camel-provider.h"
-#include "camel-session.h"
-#include "camel-url.h"
-
-static void add_hash (guint *hash, char *s);
-static guint imap_url_hash (gconstpointer key);
-static gint check_equal (char *s1, char *s2);
-static gint imap_url_equal (gconstpointer a, gconstpointer b);
-
-static CamelProvider imap_provider = {
- "imap",
- "IMAPv4",
-
- "For reading and storing mail on IMAP servers.",
-
- "mail",
-
- CAMEL_PROVIDER_IS_REMOTE | CAMEL_PROVIDER_IS_SOURCE | CAMEL_PROVIDER_IS_STORAGE,
-
- { 0, 0 },
-
- NULL
-};
-
-void
-camel_provider_module_init (CamelSession *session)
-{
- imap_provider.object_types[CAMEL_PROVIDER_STORE] =
- camel_imap_store_get_type();
-
- imap_provider.service_cache = g_hash_table_new (imap_url_hash, imap_url_equal);
-
- camel_session_register_provider (session, &imap_provider);
-}
-
-static void
-add_hash (guint *hash, char *s)
-{
- if (s)
- *hash ^= g_str_hash(s);
-}
-
-static guint
-imap_url_hash (gconstpointer key)
-{
- const CamelURL *u = (CamelURL *)key;
- guint hash = 0;
-
- add_hash (&hash, u->user);
- add_hash (&hash, u->authmech);
- add_hash (&hash, u->host);
- hash ^= u->port;
-
- return hash;
-}
-
-static gint
-check_equal (char *s1, char *s2)
-{
- if (s1 == NULL) {
- if (s2 == NULL)
- return TRUE;
- else
- return FALSE;
- }
-
- if (s2 == NULL)
- return FALSE;
-
- return strcmp (s1, s2) == 0;
-}
-
-static gint
-imap_url_equal (gconstpointer a, gconstpointer b)
-{
- const CamelURL *u1 = a, *u2 = b;
-
- return check_equal (u1->user, u2->user)
- && check_equal (u1->authmech, u2->authmech)
- && check_equal (u1->host, u2->host)
- && u1->port == u2->port;
-}
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
deleted file mode 100644
index 0a2be4f326..0000000000
--- a/camel/providers/imap/camel-imap-store.c
+++ /dev/null
@@ -1,1262 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-imap-store.c : class for an imap store */
-
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (www.helixcode.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.
- *
- */
-
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include <e-util/e-util.h>
-
-#include "camel-imap-store.h"
-#include "camel-imap-folder.h"
-#include "camel-imap-utils.h"
-#include "camel-folder.h"
-#include "camel-exception.h"
-#include "camel-session.h"
-#include "camel-stream.h"
-#include "camel-stream-buffer.h"
-#include "camel-stream-fs.h"
-#include "camel-url.h"
-#include "string-utils.h"
-
-#define d(x) x
-
-/* Specified in RFC 2060 */
-#define IMAP_PORT 143
-
-static CamelServiceClass *service_class = NULL;
-
-static void finalize (CamelObject *object);
-static gboolean imap_create (CamelFolder *folder, CamelException *ex);
-static gboolean imap_connect (CamelService *service, CamelException *ex);
-static gboolean imap_disconnect (CamelService *service, CamelException *ex);
-static GList *query_auth_types (CamelService *service, CamelException *ex);
-static void free_auth_types (CamelService *service, GList *authtypes);
-static char *get_name (CamelService *service, gboolean brief);
-static CamelFolder *get_folder (CamelStore *store, const char *folder_name, gboolean create,
- CamelException *ex);
-static char *get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex);
-static gboolean imap_noop (gpointer data);
-/*static gboolean stream_is_alive (CamelStream *istream);*/
-static int camel_imap_status (char *cmdid, char *respbuf);
-
-static void
-camel_imap_store_class_init (CamelImapStoreClass *camel_imap_store_class)
-{
- /* virtual method overload */
- CamelServiceClass *camel_service_class =
- CAMEL_SERVICE_CLASS (camel_imap_store_class);
- CamelStoreClass *camel_store_class =
- CAMEL_STORE_CLASS (camel_imap_store_class);
-
- service_class = CAMEL_SERVICE_CLASS(camel_type_get_global_classfuncs (camel_service_get_type ()));
-
- /* virtual method overload */
- camel_service_class->connect = imap_connect;
- camel_service_class->disconnect = imap_disconnect;
- camel_service_class->query_auth_types = query_auth_types;
- camel_service_class->free_auth_types = free_auth_types;
- camel_service_class->get_name = get_name;
-
- camel_store_class->get_folder = get_folder;
- camel_store_class->get_folder_name = get_folder_name;
-}
-
-static void
-camel_imap_store_init (gpointer object, gpointer klass)
-{
- CamelService *service = CAMEL_SERVICE (object);
- CamelStore *store = CAMEL_STORE (object);
-
- service->url_flags = (CAMEL_SERVICE_URL_NEED_USER |
- CAMEL_SERVICE_URL_NEED_HOST |
- CAMEL_SERVICE_URL_ALLOW_PATH);
-
- store->folders = g_hash_table_new (g_str_hash, g_str_equal);
- CAMEL_IMAP_STORE (store)->dir_sep = g_strdup ("/"); /*default*/
- CAMEL_IMAP_STORE (store)->current_folder = NULL;
- CAMEL_IMAP_STORE (store)->timeout_id = 0;
-}
-
-CamelType
-camel_imap_store_get_type (void)
-{
- static CamelType camel_imap_store_type = CAMEL_INVALID_TYPE;
-
- if (camel_imap_store_type == CAMEL_INVALID_TYPE) {
- camel_imap_store_type = camel_type_register (CAMEL_STORE_TYPE, "CamelImapStore",
- sizeof (CamelImapStore),
- sizeof (CamelImapStoreClass),
- (CamelObjectClassInitFunc) camel_imap_store_class_init,
- NULL,
- (CamelObjectInitFunc) camel_imap_store_init,
- (CamelObjectFinalizeFunc) finalize);
- }
-
- return camel_imap_store_type;
-}
-
-static void
-finalize (CamelObject *object)
-{
- CamelException ex;
-
- camel_exception_init (&ex);
- imap_disconnect (CAMEL_SERVICE (object), &ex);
- camel_exception_clear (&ex);
-}
-
-static CamelServiceAuthType password_authtype = {
- "Password",
-
- "This option will connect to the IMAP server using a "
- "plaintext password.",
-
- "",
- TRUE
-};
-
-#if 0
-static gboolean
-try_connect (CamelService *service, CamelException *ex)
-{
- struct hostent *h;
- struct sockaddr_in sin;
- gint fd;
-
- h = camel_service_gethost (service, ex);
- if (!h)
- return FALSE;
-
- sin.sin_family = h->h_addrtype;
- sin.sin_port = htons (service->url->port ? service->url->port : IMAP_PORT);
- memcpy (&sin.sin_addr, h->h_addr, sizeof (sin.sin_addr));
-
- fd = socket (h->h_addrtype, SOCK_STREAM, 0);
- if (fd == -1 || connect (fd, (struct sockaddr *)&sin, sizeof (sin)) == -1) {
- /* We don't want to set a CamelException here */
-
- if (fd > -1)
- close (fd);
-
- return FALSE;
- }
-
- close (fd);
- return TRUE;
-}
-#endif
-
-static GList *
-query_auth_types (CamelService *service, CamelException *ex)
-{
- GList *ret = NULL;
- gboolean passwd = TRUE;
-#if 0
- if (service->url) {
- passwd = try_connect (service, ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE)
- return NULL;
- }
-#endif
- if (passwd)
- ret = g_list_append (ret, &password_authtype);
-
- if (!ret) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not connect to IMAP server on %s.",
- service->url->host ? service->url->host :
- "(unknown host)");
- }
-
- return ret;
-}
-
-static void
-free_auth_types (CamelService *service, GList *authtypes)
-{
- g_list_free (authtypes);
-}
-
-static char *
-get_name (CamelService *service, gboolean brief)
-{
- if (brief)
- return g_strdup_printf ("IMAP server %s", service->url->host);
- else {
- return g_strdup_printf ("IMAP service for %s on %s",
- service->url->user,
- service->url->host);
- }
-}
-
-static gboolean
-imap_connect (CamelService *service, CamelException *ex)
-{
- CamelImapStore *store = CAMEL_IMAP_STORE (service);
- struct hostent *h;
- struct sockaddr_in sin;
- gint fd, status;
- gchar *buf, *msg, *result, *errbuf = NULL;
- gboolean authenticated = FALSE;
-
- /* FIXME: do we really need this here? */
- /*
- *if (store->timeout_id) {
- * gtk_timeout_remove (store->timeout_id);
- * store->timeout_id = 0;
- *}
- */
-
- h = camel_service_gethost (service, ex);
- if (!h)
- return FALSE;
-
- /* connect to the IMAP server */
- sin.sin_family = h->h_addrtype;
- if (service->url->port)
- sin.sin_port = htons(service->url->port);
- else
- sin.sin_port = htons(IMAP_PORT);
-
- memcpy (&sin.sin_addr, h->h_addr, sizeof (sin.sin_addr));
-
- fd = socket (h->h_addrtype, SOCK_STREAM, 0);
- if (fd == -1 || connect (fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not connect to %s (port %d): %s",
- service->url->host ? service->url->host : "(unknown host)",
- service->url->port ? service->url->port : IMAP_PORT,
- strerror(errno));
- if (fd > -1)
- close (fd);
-
- return FALSE;
- }
-
- /* parent class conect initialization */
- service_class->connect (service, ex);
-
- store->ostream = camel_stream_fs_new_with_fd (fd);
- store->istream = camel_stream_buffer_new (store->ostream, CAMEL_STREAM_BUFFER_READ);
- store->command = 0;
- g_free (store->dir_sep);
- store->dir_sep = g_strdup ("/"); /* default dir sep */
-
- /* Read the greeting, if any. */
- buf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream));
- if (!buf) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not read greeting from IMAP "
- "server: %s",
- camel_exception_get_description (ex));
-
- imap_disconnect (service, ex);
- return FALSE;
- }
- g_free (buf);
-
- /* authenticate the user */
- while (!authenticated) {
- if (errbuf) {
- /* We need to un-cache the password before prompting again */
- camel_session_query_authenticator (camel_service_get_session (service),
- CAMEL_AUTHENTICATOR_TELL, NULL,
- TRUE, service, "password", ex);
- g_free (service->url->passwd);
- service->url->passwd = NULL;
- }
-
- if (!service->url->authmech && !service->url->passwd) {
- gchar *prompt;
-
- prompt = g_strdup_printf ("%sPlease enter the IMAP password for %s@%s",
- errbuf ? errbuf : "", service->url->user, h->h_name);
- service->url->passwd =
- camel_session_query_authenticator (camel_service_get_session (service),
- CAMEL_AUTHENTICATOR_ASK, prompt,
- TRUE, service, "password", ex);
- g_free (prompt);
- g_free (errbuf);
- errbuf = NULL;
-
- if (!service->url->passwd) {
- imap_disconnect (service, ex);
- return FALSE;
- }
- }
-
- status = camel_imap_command (store, NULL, &msg, "LOGIN \"%s\" \"%s\"",
- service->url->user,
- service->url->passwd);
-
- if (status != CAMEL_IMAP_OK) {
- errbuf = g_strdup_printf ("Unable to authenticate to IMAP server.\n"
- "Error sending password: %s\n\n",
- msg ? msg : "(Unknown)");
- } else {
- g_message ("IMAP Service sucessfully authenticated user %s", service->url->user);
- authenticated = TRUE;
- }
- }
-
- /* Now lets find out the IMAP capabilities */
- status = camel_imap_command_extended (store, NULL, &result, "CAPABILITY");
-
- if (status != CAMEL_IMAP_OK) {
- /* Non-fatal error, but we should still warn the user... */
- CamelService *service = CAMEL_SERVICE (store);
-
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not get capabilities on IMAP server %s: %s.",
- service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- }
-
- /* parse for capabilities here. */
- if (e_strstrcase (result, "IMAP4REV1"))
- store->server_level = IMAP_LEVEL_IMAP4REV1;
- else if (e_strstrcase (result, "IMAP4"))
- store->server_level = IMAP_LEVEL_IMAP4;
- else
- store->server_level = IMAP_LEVEL_UNKNOWN;
-
- if ((store->server_level >= IMAP_LEVEL_IMAP4REV1) || (e_strstrcase (result, "STATUS")))
- store->has_status_capability = TRUE;
- else
- store->has_status_capability = FALSE;
-
- g_free (result);
-
- /* We now need to find out which directory separator this daemon uses */
- status = camel_imap_command_extended (store, NULL, &result, "LIST \"\" \"\"");
-
- if (status != CAMEL_IMAP_OK) {
- /* Again, this is non-fatal */
- CamelService *service = CAMEL_SERVICE (store);
-
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not get directory separator on IMAP server %s: %s.",
- service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- } else {
- char *flags, *sep, *folder;
-
- if (imap_parse_list_response (result, "", &flags, &sep, &folder)) {
- if (*sep) {
- g_free (store->dir_sep);
- store->dir_sep = g_strdup (sep);
- }
- }
-
- g_free (flags);
- g_free (sep);
- g_free (folder);
- }
-
- /* default directory separator */
- if (!store->dir_sep)
- store->dir_sep = g_strdup ("/");
-
- g_free (result);
-
- /* Lets add a timeout so that we can hopefully prevent getting disconnected */
- /* FIXME fast timeout */
- store->timeout_id = camel_session_register_timeout (camel_service_get_session (service),
- 10 * 60 * 1000, imap_noop, service);
- /*store->timeout_id = gtk_timeout_add (600000, imap_noop, store);*/
-
- return TRUE;
-}
-
-static gboolean
-imap_disconnect (CamelService *service, CamelException *ex)
-{
- CamelImapStore *store = CAMEL_IMAP_STORE (service);
- char *result;
- int status;
-
- if (!service->connected)
- return TRUE;
-
- /* send the logout command */
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (service), NULL, &result, "LOGOUT");
- if (status != CAMEL_IMAP_OK) {
- /* Oh fuck it, we're disconnecting anyway... */
- }
- g_free (result);
-
- if (!service_class->disconnect (service, ex))
- return FALSE;
-
- if (store->istream) {
- camel_object_unref (CAMEL_OBJECT (store->istream));
- store->istream = NULL;
- }
-
- if (store->ostream) {
- camel_object_unref (CAMEL_OBJECT (store->ostream));
- store->ostream = NULL;
- }
-
- g_free (store->dir_sep);
- store->dir_sep = NULL;
-
- store->current_folder = NULL;
-
- if (store->timeout_id) {
- camel_session_remove_timeout (camel_service_get_session (CAMEL_SERVICE (store)),
- store->timeout_id);
- store->timeout_id = 0;
- }
-
- return TRUE;
-}
-
-const gchar *
-camel_imap_store_get_toplevel_dir (CamelImapStore *store)
-{
- CamelURL *url = CAMEL_SERVICE (store)->url;
-
- g_assert (url != NULL);
- return url->path;
-}
-
-static gboolean
-imap_folder_exists (CamelFolder *folder)
-{
- CamelStore *store = CAMEL_STORE (folder->parent_store);
- CamelURL *url = CAMEL_SERVICE (store)->url;
- gchar *result, *folder_path, *dir_sep;
- gint status;
-
- dir_sep = CAMEL_IMAP_STORE (folder->parent_store)->dir_sep;
-
- g_return_val_if_fail (dir_sep, FALSE);
-
- if (url && url->path && *(url->path + 1) && strcmp (folder->full_name, "INBOX"))
- folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
- else
- folder_path = g_strdup (folder->full_name);
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), NULL,
- &result, "EXAMINE %s", folder_path);
-
- if (status != CAMEL_IMAP_OK) {
- g_free (result);
- g_free (folder_path);
- return FALSE;
- }
- g_free (folder_path);
- g_free (result);
-
- return TRUE;
-}
-
-static gboolean
-imap_create (CamelFolder *folder, CamelException *ex)
-{
- CamelStore *store = CAMEL_STORE (folder->parent_store);
- CamelURL *url = CAMEL_SERVICE (store)->url;
- gchar *result, *folder_path, *dir_sep;
- gint status;
-
- g_return_val_if_fail (folder != NULL, FALSE);
-
- if (!(folder->full_name || folder->name)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID,
- "invalid folder path. Use set_name ?");
- return FALSE;
- }
-
- if (!strcmp (folder->full_name, "INBOX"))
- return TRUE;
-
- if (imap_folder_exists (folder))
- return TRUE;
-
- /* create the directory for the subfolder */
- dir_sep = CAMEL_IMAP_STORE (folder->parent_store)->dir_sep;
-
- g_return_val_if_fail (dir_sep, FALSE);
-
- if (url && url->path && *(url->path + 1) && strcmp (folder->full_name, "INBOX"))
- folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
- else
- folder_path = g_strdup (folder->full_name);
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), NULL,
- &result, "CREATE %s", folder_path);
-
- if (status != CAMEL_IMAP_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not CREATE %s on IMAP server %s: %s.",
- folder_path, service->url->host,
- status != CAMEL_IMAP_FAIL && result ? result :
- "Unknown error");
- g_free (result);
- g_free (folder_path);
- return FALSE;
- }
- g_free (folder_path);
- g_free (result);
-
- return TRUE;
-}
-
-static gboolean
-folder_is_selectable (CamelStore *store, const char *folder_path)
-{
- char *result, *flags, *sep, *folder;
- int status;
-
- if (!strcmp (folder_path, "INBOX"))
- return TRUE;
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (store), NULL,
- &result, "LIST \"\" %s", folder_path);
- if (status != CAMEL_IMAP_OK) {
- g_free (result);
- return FALSE;
- }
-
- if (imap_parse_list_response (result, "", &flags, &sep, &folder)) {
- gboolean retval;
-
- retval = !e_strstrcase (flags, "NoSelect");
- g_free (flags);
- g_free (sep);
- g_free (folder);
-
- return retval;
- }
- g_free (flags);
- g_free (sep);
- g_free (folder);
-
- return FALSE;
-}
-
-static CamelFolder *
-get_folder (CamelStore *store, const char *folder_name, gboolean create, CamelException *ex)
-{
- CamelURL *url = CAMEL_SERVICE (store)->url;
- CamelFolder *new_folder;
- char *folder_path, *dir_sep;
-
- g_return_val_if_fail (store != NULL, NULL);
- g_return_val_if_fail (folder_name != NULL, NULL);
-
- dir_sep = CAMEL_IMAP_STORE (store)->dir_sep;
-
- /* if we're trying to get the top-level dir, we really want the namespace */
- if (!dir_sep || !strcmp (folder_name, dir_sep))
- folder_path = g_strdup (url->path + 1);
- else
- folder_path = g_strdup (folder_name);
-
- new_folder = camel_imap_folder_new (store, folder_path, ex);
-
- /* this is the top-level dir, we already know it exists - it has to! */
- if (!strcmp (folder_name, dir_sep))
- return new_folder;
-
- if (create && !imap_create (new_folder, ex)) {
- if (!folder_is_selectable (store, folder_path)) {
- camel_exception_clear (ex);
- new_folder->can_hold_messages = FALSE;
- return new_folder;
- } else {
- g_free (folder_path);
- camel_object_unref (CAMEL_OBJECT (new_folder));
- return NULL;
- }
- }
-
- return new_folder;
-}
-
-static gchar *
-get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex)
-{
- return g_strdup (folder_name);
-}
-
-static gboolean
-imap_noop (gpointer data)
-{
- CamelImapStore *store = CAMEL_IMAP_STORE (data);
- char *result;
- int status;
-
- status = camel_imap_command_extended (store, store->current_folder, &result, "NOOP");
-
- g_free (result);
-
- return TRUE;
-}
-
-#if 0
-static gboolean
-stream_is_alive (CamelStream *istream)
-{
- CamelStreamFs *fs_stream;
- char buf;
-
- g_return_val_if_fail (istream != NULL, FALSE);
-
- fs_stream = CAMEL_STREAM_FS (CAMEL_STREAM_BUFFER (istream)->stream);
- g_return_val_if_fail (fs_stream->fd != -1, FALSE);
-
- if (read (fs_stream->fd, (void *) &buf, 0) == 0)
- return TRUE;
-
- return FALSE;
-}
-#endif
-
-static int
-camel_imap_status (char *cmdid, char *respbuf)
-{
- char *retcode;
-
- if (respbuf) {
- if (!strncmp (respbuf, cmdid, strlen (cmdid))) {
- retcode = imap_next_word (respbuf);
-
- if (!strncmp (retcode, "OK", 2))
- return CAMEL_IMAP_OK;
- else if (!strncmp (retcode, "NO", 2))
- return CAMEL_IMAP_NO;
- else if (!strncmp (retcode, "BAD", 3))
- return CAMEL_IMAP_BAD;
- }
- }
-
- return CAMEL_IMAP_FAIL;
-}
-
-/**
- * camel_imap_command: Send a command to a IMAP server.
- * @store: the IMAP store
- * @folder: The folder to perform the operation in
- * @ret: a pointer to return the full server response in
- * @fmt: a printf-style format string, followed by arguments
- *
- * This camel method sends the command specified by @fmt and the following
- * arguments to the connected IMAP store specified by @store. It then
- * reads the server's response and parses out the status code. If
- * the caller passed a non-NULL pointer for @ret, camel_imap_command
- * will set it to point to a buffer containing the rest of the
- * response from the IMAP server. (If @ret was passed but there was
- * no extended response, @ret will be set to NULL.) The caller function is
- * responsible for freeing @ret.
- *
- * Return value: one of CAMEL_IMAP_OK (command executed successfully),
- * CAMEL_IMAP_NO (operational error message), CAMEL_IMAP_BAD (error
- * message from the server), or CAMEL_IMAP_FAIL (a protocol-level error
- * occurred, and Camel is uncertain of the result of the command.)
- **/
-gint
-camel_imap_command (CamelImapStore *store, CamelFolder *folder, char **ret, char *fmt, ...)
-{
- CamelURL *url = CAMEL_SERVICE (store)->url;
- gchar *cmdbuf, *respbuf;
- gchar *cmdid;
- va_list ap;
- gint status = CAMEL_IMAP_OK;
-
- if (folder && store->current_folder != folder && strncmp (fmt, "CREATE", 5)) {
- /* We need to select the correct mailbox first */
- char *r, *folder_path, *dir_sep;
- int s;
-
- dir_sep = store->dir_sep;
- if (url && url->path && *(url->path + 1) && strcmp (folder->full_name, "INBOX"))
- folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
- else
- folder_path = g_strdup (folder->full_name);
-
- s = camel_imap_command_extended (store, NULL, &r, "SELECT %s", folder_path);
- g_free (folder_path);
- if (!r || s != CAMEL_IMAP_OK) {
- *ret = r;
- store->current_folder = NULL;
-
- return s;
- }
-
- g_free (r);
-
- store->current_folder = folder;
- }
-
- /* create the command */
- cmdid = g_strdup_printf ("A%.5d", store->command++);
- va_start (ap, fmt);
- cmdbuf = g_strdup_vprintf (fmt, ap);
- va_end (ap);
-
- d(fprintf (stderr, "sending : %s %s\r\n", cmdid, cmdbuf));
-
- if (camel_stream_printf (store->ostream, "%s %s\r\n", cmdid, cmdbuf) == -1) {
- g_free (cmdbuf);
- g_free (cmdid);
- if (*ret)
- *ret = g_strdup (strerror (errno));
- return CAMEL_IMAP_FAIL;
- }
- g_free (cmdbuf);
-
- /* Read the response */
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream));
- if (respbuf == NULL) {
- if (*ret)
- *ret = g_strdup (strerror (errno));
- return CAMEL_IMAP_FAIL;
- }
-
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-
- status = camel_imap_status (cmdid, respbuf);
- g_free (cmdid);
-
- if (ret) {
- if (status != CAMEL_IMAP_FAIL && respbuf) {
- char *word;
-
- word = imap_next_word (respbuf); /* word should now point to NO or BAD */
-
- *ret = g_strdup (imap_next_word (word));
- } else {
- *ret = NULL;
- }
- }
-
- g_free (respbuf);
-
- return status;
-}
-
-/**
- * camel_imap_command_extended: Send a command to a IMAP server and get
- * a multi-line response.
- * @store: the IMAP store
- * @folder: The folder to perform the operation in
- * @ret: a pointer to return the full server response in
- * @fmt: a printf-style format string, followed by arguments
- *
- * This camel method sends the IMAP command specified by @fmt and the
- * following arguments to the IMAP store specified by @store. If the
- * store is in a disconnected state, camel_imap_command_extended will first
- * re-connect the store before sending the specified IMAP command. It then
- * reads the server's response and parses out the status code. If the caller
- * passed a non-NULL pointer for @ret, camel_imap_command_extended will set
- * it to point to a buffer containing the rest of the response from the IMAP
- * server. (If @ret was passed but there was no extended response, @ret will
- * be set to NULL.) The caller function is responsible for freeing @ret.
- *
- * This camel method gets the additional data returned by "multi-line" IMAP
- * commands, such as SELECT, LIST, FETCH, and various other commands.
- * The returned data is un-byte-stuffed, and has lines termined by
- * newlines rather than CR/LF pairs.
- *
- * Return value: one of CAMEL_IMAP_OK (command executed successfully),
- * CAMEL_IMAP_NO (operational error message), CAMEL_IMAP_BAD (error
- * message from the server), or CAMEL_IMAP_FAIL (a protocol-level error
- * occurred, and Camel is uncertain of the result of the command.)
- **/
-gint
-camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char **ret, char *fmt, ...)
-{
- CamelService *service = CAMEL_SERVICE (store);
- CamelURL *url = service->url;
- gint len = 0, recent = 0, status = CAMEL_IMAP_OK;
- gchar *cmdid, *cmdbuf, *respbuf;
- GPtrArray *data;
- va_list app;
- int i;
-
-#if 0
- /* First make sure we're connected... */
- if (!service->connected || !stream_is_alive (store->istream)) {
- CamelException *ex;
-
- ex = camel_exception_new ();
-
- if (!imap_disconnect (service, ex) || !imap_connect (service, ex)) {
- camel_exception_free (ex);
-
- *ret = NULL;
-
- return CAMEL_IMAP_FAIL;
- }
- service->connected = TRUE;
-
- camel_exception_free (ex);
- }
-#endif
-
- if (folder && store->current_folder != folder && strncmp (fmt, "CREATE", 6)) {
- /* We need to select the correct mailbox first */
- char *r, *folder_path, *dir_sep;
- int s;
-
- dir_sep = store->dir_sep;
-
- if (url && url->path && *(url->path + 1) && strcmp (folder->full_name, "INBOX"))
- folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
- else
- folder_path = g_strdup (folder->full_name);
-
- s = camel_imap_command_extended (store, NULL, &r, "SELECT %s", folder_path);
- g_free (folder_path);
- if (!r || s != CAMEL_IMAP_OK) {
- *ret = r;
- store->current_folder = NULL;
-
- return s;
- }
-
- g_free (r);
-
- store->current_folder = folder;
- }
-
- /* Create the command */
- cmdid = g_strdup_printf ("A%.5d", store->command++);
- va_start (app, fmt);
- cmdbuf = g_strdup_vprintf (fmt, app);
- va_end (app);
-
- d(fprintf (stderr, "sending : %s %s\r\n", cmdid, cmdbuf));
-
- if (camel_stream_printf (store->ostream, "%s %s\r\n", cmdid, cmdbuf) == -1) {
- g_free (cmdbuf);
- g_free (cmdid);
-
- *ret = g_strdup (strerror (errno));
-
- return CAMEL_IMAP_FAIL;
- }
- g_free (cmdbuf);
-
- data = g_ptr_array_new ();
-
- while (1) {
- CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream);
- char *ptr;
-
- respbuf = camel_stream_buffer_read_line (stream);
- if (!respbuf || !strncmp (respbuf, cmdid, strlen (cmdid))) {
- /* IMAP's last response starts with our command id */
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-#if 0
- if (!respbuf && strcmp (fmt, "LOGOUT")) {
- /* we need to force a disconnect here? */
- CamelException *ex;
-
- ex = camel_exception_new ();
- imap_disconnect (service, ex);
- camel_exception_free (ex);
- }
-#endif
- break;
- }
-
- d(fprintf (stderr, "received: %s\n", respbuf));
-
- g_ptr_array_add (data, respbuf);
- len += strlen (respbuf) + 1;
-
- /* If recent was somehow set and this response doesn't begin with a '*'
- then recent must have been misdetected */
- if (recent && *respbuf != '*')
- recent = 0;
-
- if (*respbuf == '*' && (ptr = strstr (respbuf, "RECENT"))) {
- char *rcnt;
-
- d(fprintf (stderr, "*** We may have found a 'RECENT' flag: %s\n", respbuf));
- /* Make sure it's in the form: "* %d RECENT" */
- rcnt = imap_next_word (respbuf);
- if (*rcnt >= '0' && *rcnt <= '9' && !strncmp ("RECENT", imap_next_word (rcnt), 6))
- recent = atoi (rcnt);
- }
- }
-
- if (respbuf) {
- g_ptr_array_add (data, respbuf);
- len += strlen (respbuf) + 1;
-
- status = camel_imap_status (cmdid, respbuf);
- } else {
- status = CAMEL_IMAP_FAIL;
- }
- g_free (cmdid);
-
- if (status == CAMEL_IMAP_OK) {
- char *p;
-
- *ret = g_malloc0 (len + 1);
-
- for (i = 0, p = *ret; i < data->len; i++) {
- char *ptr, *datap;
-
- datap = (char *) data->pdata[i];
- ptr = (*datap == '.') ? datap + 1 : datap;
- len = strlen (ptr);
- memcpy (p, ptr, len);
- p += len;
- *p++ = '\n';
- }
- *p = '\0';
- } else {
- if (status != CAMEL_IMAP_FAIL && respbuf) {
- char *word;
-
- word = imap_next_word (respbuf); /* word should now point to NO or BAD */
-
- *ret = g_strdup (imap_next_word (word));
- } else {
- *ret = NULL;
- }
- }
-
- for (i = 0; i < data->len; i++)
- g_free (data->pdata[i]);
- g_ptr_array_free (data, TRUE);
-
- if (folder && recent > 0) {
- CamelException *ex;
-
- ex = camel_exception_new ();
- camel_imap_folder_changed (folder, recent, ex);
- camel_exception_free (ex);
- }
-
- return status;
-}
-
-/**
- * camel_imap_command_preliminary: Send a preliminary command to the
- * IMAP server.
- * @store: the IMAP store
- * @ret: a pointer to return the full server response in
- * @cmdid: a pointer to return the command identifier (for use in
- * camel_imap_command_continuation)
- * @fmt: a printf-style format string, followed by arguments
- *
- * This camel method sends a preliminary IMAP command specified by
- * @fmt and the following arguments to the IMAP store specified by
- * @store. This function is meant for use with multi-transactional
- * IMAP communications like Kerberos authentication and APPEND.
- *
- * If the caller passed a non-NULL pointer for @ret,
- * camel_imap_command_preliminary will set it to point to a buffer
- * containing the rest of the response from the IMAP server. The
- * caller function is responsible for freeing @ret.
- *
- * Return value: one of CAMEL_IMAP_PLUS or CAMEL_IMAP_FAIL
- *
- * Note: on success (CAMEL_IMAP_PLUS), you will need to follow up with
- * a camel_imap_command_continuation call.
- **/
-gint
-camel_imap_command_preliminary (CamelImapStore *store, char **ret, char **cmdid, char *fmt, ...)
-{
- gchar *cmdbuf, *respbuf;
- gint status = CAMEL_IMAP_OK;
- va_list app;
-
- /* Create the command */
- *cmdid = g_strdup_printf ("A%.5d", store->command++);
- va_start (app, fmt);
- cmdbuf = g_strdup_vprintf (fmt, app);
- va_end (app);
-
- d(fprintf (stderr, "sending : %s %s\r\n", *cmdid, cmdbuf));
-
- if (camel_stream_printf (store->ostream, "%s %s\r\n", *cmdid, cmdbuf) == -1) {
- g_free (cmdbuf);
-
- if (ret)
- *ret = g_strdup (strerror (errno));
-
- return CAMEL_IMAP_FAIL;
- }
- g_free (cmdbuf);
-
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream));
-
- if (respbuf) {
- switch (*respbuf) {
- case '+':
- /* continuation request */
- status = CAMEL_IMAP_PLUS;
- break;
- default:
- status = camel_imap_status (*cmdid, respbuf);
- }
-
- if (ret)
- *ret = g_strdup (imap_next_word (respbuf));
- } else {
- status = CAMEL_IMAP_FAIL;
- if (ret)
- *ret = NULL;
- }
-
- return status;
-}
-
-/**
- * camel_imap_command_continuation: Handle another transaction with the IMAP
- * server and possibly get a multi-line response.
- * @store: the IMAP store
- * @cmdid: The command identifier returned from camel_imap_command_preliminary
- * @ret: a pointer to return the full server response in
- * @cmdbuf: buffer containing the response/request data
- *
- * This method is for sending continuing responses to the IMAP server. Meant
- * to be used as a followup to camel_imap_command_preliminary.
- * camel_imap_command_continuation will set @ret to point to a buffer
- * containing the rest of the response from the IMAP server. The
- * caller function is responsible for freeing @ret.
- *
- * Return value: one of CAMEL_IMAP_PLUS (command requires additional data),
- * CAMEL_IMAP_OK (command executed successfully),
- * CAMEL_IMAP_NO (operational error message),
- * CAMEL_IMAP_BAD (error message from the server), or
- * CAMEL_IMAP_FAIL (a protocol-level error occurred, and Camel is uncertain
- * of the result of the command.)
- **/
-gint
-camel_imap_command_continuation (CamelImapStore *store, char **ret, char *cmdid, char *cmdbuf)
-{
- gint len = 0, status = CAMEL_IMAP_OK;
- gchar *respbuf;
- GPtrArray *data;
- int i;
-
- d(fprintf (stderr, "sending : %s\r\n", cmdbuf));
-
- if (camel_stream_printf (store->ostream, "%s\r\n", cmdbuf) == -1) {
- *ret = g_strdup (strerror (errno));
-
- return CAMEL_IMAP_FAIL;
- }
-
- data = g_ptr_array_new ();
-
- while (1) {
- CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream);
-
- respbuf = camel_stream_buffer_read_line (stream);
- if (!respbuf || *respbuf == '+' || !strncmp (respbuf, cmdid, strlen (cmdid))) {
- /* IMAP's last response starts with our command id or a continuation request */
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-
- break;
- }
-
- d(fprintf (stderr, "received: %s\n", respbuf));
-
- g_ptr_array_add (data, respbuf);
- len += strlen (respbuf) + 1;
- }
-
- if (respbuf) {
- g_ptr_array_add (data, respbuf);
- len += strlen (respbuf) + 1;
-
- switch (*respbuf) {
- case '+':
- status = CAMEL_IMAP_PLUS;
- break;
- default:
- status = camel_imap_status (cmdid, respbuf);
- }
- } else {
- status = CAMEL_IMAP_FAIL;
- }
-
- if (status == CAMEL_IMAP_OK || status == CAMEL_IMAP_PLUS) {
- char *p;
-
- *ret = g_malloc0 (len + 1);
-
- for (i = 0, p = *ret; i < data->len; i++) {
- char *ptr, *datap;
-
- datap = (char *) data->pdata[i];
- ptr = (*datap == '.') ? datap + 1 : datap;
- len = strlen (ptr);
- memcpy (p, ptr, len);
- p += len;
- *p++ = '\n';
- }
- *p = '\0';
- } else {
- if (status != CAMEL_IMAP_FAIL && respbuf) {
- char *word;
-
- word = imap_next_word (respbuf);
-
- if (*respbuf == '-')
- *ret = g_strdup (word);
- else
- *ret = g_strdup (imap_next_word (word));
- } else {
- *ret = NULL;
- }
- }
-
- for (i = 0; i < data->len; i++)
- g_free (data->pdata[i]);
- g_ptr_array_free (data, TRUE);
-
- return status;
-}
-
-/**
- * camel_imap_command_continuation_with_stream: Handle another transaction with the IMAP
- * server and possibly get a multi-line response.
- * @store: the IMAP store
- * @cmdid: The command identifier returned from camel_imap_command_preliminary
- * @ret: a pointer to return the full server response in
- * @cstream: a CamelStream containing a continuation response.
- *
- * This method is for sending continuing responses to the IMAP server. Meant
- * to be used as a followup to camel_imap_command_preliminary.
- * camel_imap_command_continuation will set @ret to point to a buffer
- * containing the rest of the response from the IMAP server. The
- * caller function is responsible for freeing @ret.
- *
- * Return value: one of CAMEL_IMAP_PLUS (command requires additional data),
- * CAMEL_IMAP_OK (command executed successfully),
- * CAMEL_IMAP_NO (operational error message),
- * CAMEL_IMAP_BAD (error message from the server), or
- * CAMEL_IMAP_FAIL (a protocol-level error occurred, and Camel is uncertain
- * of the result of the command.)
- **/
-gint
-camel_imap_command_continuation_with_stream (CamelImapStore *store, char **ret, char *cmdid, CamelStream *cstream)
-{
- gint len = 0, status = CAMEL_IMAP_OK;
- gchar *respbuf;
- GPtrArray *data;
- int i;
-
- d(fprintf (stderr, "sending continuation stream\r\n"));
-
- if (camel_stream_write_to_stream (cstream, store->ostream) == -1) {
- *ret = g_strdup (strerror (errno));
-
- return CAMEL_IMAP_FAIL;
- }
-
- data = g_ptr_array_new ();
-
- while (1) {
- CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream);
-
- respbuf = camel_stream_buffer_read_line (stream);
- if (!respbuf || *respbuf == '+' || !strncmp (respbuf, cmdid, strlen (cmdid))) {
- /* IMAP's last response starts with our command id or a continuation request */
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-
- break;
- }
-
- d(fprintf (stderr, "received: %s\n", respbuf));
-
- g_ptr_array_add (data, respbuf);
- len += strlen (respbuf) + 1;
- }
-
- if (respbuf) {
- g_ptr_array_add (data, respbuf);
- len += strlen (respbuf) + 1;
-
- switch (*respbuf) {
- case '+':
- status = CAMEL_IMAP_PLUS;
- break;
- default:
- status = camel_imap_status (cmdid, respbuf);
- }
- } else {
- status = CAMEL_IMAP_FAIL;
- }
-
- if (status == CAMEL_IMAP_OK || status == CAMEL_IMAP_PLUS) {
- char *p;
-
- *ret = g_malloc0 (len + 1);
-
- for (i = 0, p = *ret; i < data->len; i++) {
- char *ptr, *datap;
-
- datap = (char *) data->pdata[i];
- ptr = (*datap == '.') ? datap + 1 : datap;
- len = strlen (ptr);
- memcpy (p, ptr, len);
- p += len;
- *p++ = '\n';
- }
- *p = '\0';
- } else {
- if (status != CAMEL_IMAP_FAIL && respbuf) {
- char *word;
-
- word = imap_next_word (respbuf);
-
- if (*respbuf == '-')
- *ret = g_strdup (word);
- else
- *ret = g_strdup (imap_next_word (word));
- } else {
- *ret = NULL;
- }
- }
-
- for (i = 0; i < data->len; i++)
- g_free (data->pdata[i]);
- g_ptr_array_free (data, TRUE);
-
- return status;
-}
diff --git a/camel/providers/imap/camel-imap-store.h b/camel/providers/imap/camel-imap-store.h
deleted file mode 100644
index fcf0bcaf39..0000000000
--- a/camel/providers/imap/camel-imap-store.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-imap-store.h : class for an imap store */
-
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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 CAMEL_IMAP_STORE_H
-#define CAMEL_IMAP_STORE_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include "camel-store.h"
-
-#define CAMEL_IMAP_STORE_TYPE (camel_imap_store_get_type ())
-#define CAMEL_IMAP_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_IMAP_STORE_TYPE, CamelImapStore))
-#define CAMEL_IMAP_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_IMAP_STORE_TYPE, CamelImapStoreClass))
-#define IS_CAMEL_IMAP_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_IMAP_STORE_TYPE))
-
-typedef enum {
- IMAP_LEVEL_UNKNOWN,
- IMAP_LEVEL_IMAP4,
- IMAP_LEVEL_IMAP4REV1
-} CamelImapServerLevel;
-
-
-typedef struct {
- CamelStore parent_object;
-
- CamelFolder *current_folder;
- CamelStream *istream, *ostream;
-
- guint32 command;
-
- CamelImapServerLevel server_level;
- gboolean has_status_capability;
-
- gchar *dir_sep;
-
- guint timeout_id;
-} CamelImapStore;
-
-
-typedef struct {
- CamelStoreClass parent_class;
-
-} CamelImapStoreClass;
-
-
-/* public methods */
-void camel_imap_store_open (CamelImapStore *store, CamelException *ex);
-void camel_imap_store_close (CamelImapStore *store, gboolean expunge, CamelException *ex);
-
-/* support functions */
-
-enum {
- CAMEL_IMAP_OK = 0,
- CAMEL_IMAP_NO,
- CAMEL_IMAP_BAD,
- CAMEL_IMAP_PLUS,
- CAMEL_IMAP_FAIL
-};
-
-gint camel_imap_command (CamelImapStore *store, CamelFolder *folder, char **ret, char *fmt, ...);
-gint camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char **ret, char *fmt, ...);
-
-/* multi-transactional commands... */
-gint camel_imap_command_preliminary (CamelImapStore *store, char **ret, char **cmdid, char *fmt, ...);
-gint camel_imap_command_continuation (CamelImapStore *store, char **ret, char *cmdid, char *cmdbuf);
-gint camel_imap_command_continuation_with_stream (CamelImapStore *store, char **ret, char *cmdid, CamelStream *cstream);
-
-/* Standard Camel function */
-CamelType camel_imap_store_get_type (void);
-
-const gchar *camel_imap_store_get_toplevel_dir (CamelImapStore *store);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_IMAP_STORE_H */
diff --git a/camel/providers/imap/camel-imap-stream.c b/camel/providers/imap/camel-imap-stream.c
deleted file mode 100644
index 7b885437a2..0000000000
--- a/camel/providers/imap/camel-imap-stream.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (www.helixcode.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.
- *
- */
-
-
-#include <config.h>
-#include "camel-imap-stream.h"
-#include <sys/types.h>
-#include <errno.h>
-#include <stdlib.h>
-
-static CamelStreamClass *parent_class = NULL;
-
-/* Returns the class for a CamelImapStream */
-#define CIS_CLASS(so) CAMEL_IMAP_STREAM_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static ssize_t stream_read (CamelStream *stream, char *buffer, size_t n);
-static int stream_reset (CamelStream *stream);
-static gboolean stream_eos (CamelStream *stream);
-
-static void finalize (CamelObject *object);
-
-static void
-camel_imap_stream_class_init (CamelImapStreamClass *camel_imap_stream_class)
-{
- CamelStreamClass *camel_stream_class =
- CAMEL_STREAM_CLASS (camel_imap_stream_class);
-
- parent_class = CAMEL_STREAM_CLASS(camel_type_get_global_classfuncs (camel_stream_get_type ()));
-
- /* virtual method overload */
- camel_stream_class->read = stream_read;
- camel_stream_class->reset = stream_reset;
- camel_stream_class->eos = stream_eos;
-}
-
-static void
-camel_imap_stream_init (gpointer object, gpointer klass)
-{
- CamelImapStream *imap_stream = CAMEL_IMAP_STREAM (object);
-
- imap_stream->cache = NULL;
- imap_stream->cache_ptr = NULL;
-}
-
-CamelType
-camel_imap_stream_get_type (void)
-{
- static CamelType camel_imap_stream_type = CAMEL_INVALID_TYPE;
-
- if (camel_imap_stream_type == CAMEL_INVALID_TYPE) {
- camel_imap_stream_type = camel_type_register (camel_stream_get_type (), "CamelImapStream",
- sizeof (CamelImapStream),
- sizeof (CamelImapStreamClass),
- (CamelObjectClassInitFunc) camel_imap_stream_class_init,
- NULL,
- (CamelObjectInitFunc) camel_imap_stream_init,
- (CamelObjectFinalizeFunc) finalize);
- }
-
- return camel_imap_stream_type;
-}
-
-CamelStream *
-camel_imap_stream_new (CamelImapFolder *folder, char *command)
-{
- CamelImapStream *imap_stream;
-
- imap_stream = CAMEL_IMAP_STREAM(camel_object_new (camel_imap_stream_get_type ()));
-
- imap_stream->folder = folder;
- camel_object_ref (CAMEL_OBJECT (imap_stream->folder));
-
- imap_stream->command = g_strdup (command);
-
- return CAMEL_STREAM (imap_stream);
-}
-
-static void
-finalize (CamelObject *object)
-{
- CamelImapStream *imap_stream = CAMEL_IMAP_STREAM (object);
-
- g_free (imap_stream->cache);
- g_free (imap_stream->command);
-
- if (imap_stream->folder)
- camel_object_unref (CAMEL_OBJECT (imap_stream->folder));
-}
-
-static ssize_t
-stream_read (CamelStream *stream, char *buffer, size_t n)
-{
- ssize_t nread;
-
- /* do we want to do any IMAP specific parsing in here? If not, maybe rename to camel-stream-cache? */
- CamelImapStream *imap_stream = CAMEL_IMAP_STREAM (stream);
-
- if (!imap_stream->cache) {
- /* We need to send the IMAP command since this is our first fetch */
- CamelFolder *folder = CAMEL_FOLDER (imap_stream->folder);
- gchar *result, *p, *q;
- gint status, part_len;
-
- status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store),
- CAMEL_FOLDER (imap_stream->folder),
- &result, "%s\r\n",
- imap_stream->command);
-
- if (!result || status != CAMEL_IMAP_OK) {
- /* we got an error, dump this stuff */
- g_free (result);
- imap_stream->cache = NULL;
- camel_object_unref (CAMEL_OBJECT (imap_stream->folder));
-
- return -1;
- }
-
- /* we don't need the folder anymore... */
- camel_object_unref (CAMEL_OBJECT (imap_stream->folder));
-
- /* parse out the message part */
- for (p = result; *p && *p != '{' && *p != '\n'; p++);
- if (*p != '{') {
- g_free (result);
- return -1;
- }
-
- part_len = atoi (p + 1);
- for ( ; *p && *p != '\n'; p++);
- if (*p != '\n') {
- g_free (result);
- return -1;
- }
-
- /* calculate the new part-length */
- for (q = p; *q && (q - p) <= part_len; q++) {
- if (*q == '\n')
- part_len--;
- }
- /* FIXME: This is a hack for IMAP daemons that send us a UID at the end of each FETCH */
- for (q--, part_len--; q > p && *(q-1) != '\n'; q--, part_len--);
-
- imap_stream->cache = g_strndup (p, part_len + 1);
- g_free (result);
-
- imap_stream->cache_ptr = imap_stream->cache;
- }
-
- /* we've already read this stream, so return whats in the cache */
- nread = MIN (n, strlen (imap_stream->cache_ptr));
-
- if (nread > 0) {
- memcpy (buffer, imap_stream->cache_ptr, nread);
- imap_stream->cache_ptr += nread;
- } else {
- nread = -1;
- }
-
- return nread;
-}
-
-static int
-stream_reset (CamelStream *stream)
-{
- CamelImapStream *imap_stream = CAMEL_IMAP_STREAM (stream);
-
- imap_stream->cache_ptr = imap_stream->cache;
-
- return 1;
-}
-
-static gboolean
-stream_eos (CamelStream *stream)
-{
- CamelImapStream *imap_stream = CAMEL_IMAP_STREAM (stream);
-
- return (imap_stream->cache_ptr && strlen (imap_stream->cache_ptr));
-}
diff --git a/camel/providers/imap/camel-imap-stream.h b/camel/providers/imap/camel-imap-stream.h
deleted file mode 100644
index 88881e7c1f..0000000000
--- a/camel/providers/imap/camel-imap-stream.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (www.helixcode.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 CAMEL_IMAP_STREAM_H
-#define CAMEL_IMAP_STREAM_H
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-stream.h>
-#include "camel-imap-folder.h"
-#include "camel-imap-store.h"
-#include <sys/types.h>
-
-#define CAMEL_IMAP_STREAM_TYPE (camel_imap_stream_get_type ())
-#define CAMEL_IMAP_STREAM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_IMAP_STREAM_TYPE, CamelImapStream))
-#define CAMEL_IMAP_STREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_IMAP_STREAM_TYPE, CamelImapStreamClass))
-#define CAMEL_IS_IMAP_STREAM(o) (CAMEL_CHECK_TYPE((o), CAMEL_IMAP_STREAM_TYPE))
-
-typedef struct _CamelImapStream CamelImapStream;
-typedef struct _CamelImapStreamClass CamelImapStreamClass;
-
-struct _CamelImapStream {
- CamelStream parent_object;
-
- CamelImapFolder *folder;
- char *command;
- char *cache;
- char *cache_ptr;
-};
-
-struct _CamelImapStreamClass {
- CamelStreamClass parent_class;
-
- /* Virtual methods */
-};
-
-/* Standard Camel function */
-CamelType camel_imap_stream_get_type (void);
-
-/* public methods */
-CamelStream *camel_imap_stream_new (CamelImapFolder *folder, char *command);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_IMAP_STREAM_H */
diff --git a/camel/providers/imap/camel-imap-utils.c b/camel/providers/imap/camel-imap-utils.c
deleted file mode 100644
index 3378758a69..0000000000
--- a/camel/providers/imap/camel-imap-utils.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (www.helixcode.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.
- *
- */
-
-#include <stdio.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include "camel-imap-utils.h"
-#include "string-utils.h"
-#include <e-sexp.h>
-
-#define d(x) x
-
-static char *esexp_keys[] = { "and", "or", "body-contains", "header-contains", "match-all", NULL };
-static char *imap_keys[] = { "", "OR", "BODY", "HEADER", NULL };
-
-struct sexp_node {
- struct sexp_node *l_node, *r_node;
- char *function;
- char *data;
-};
-
-static char *get_quoted_token (char *string, int *len);
-static char *get_token (char *string, int *len);
-struct sexp_node *get_sexp_node (const char *exp);
-static void print_node (struct sexp_node *node, int depth);
-static const char *get_func (struct sexp_node *node);
-static char *get_data (struct sexp_node *node);
-static char *str_sexp_node (struct sexp_node *node);
-static void free_sexp_node (struct sexp_node *node);
-
-
-char *
-imap_next_word (char *buf)
-{
- char *word;
-
- /* skip over current word */
- for (word = buf; *word && *word != ' '; word++);
-
- /* skip over white space */
- for ( ; *word && *word == ' '; word++);
-
- return word;
-}
-
-gboolean
-imap_parse_list_response (char *buf, char *namespace, char **flags, char **sep, char **folder)
-{
- char *word, *ep, *f;
-
- *flags = NULL;
- *sep = NULL;
- *folder = NULL;
-
- if (*buf != '*')
- return FALSE;
-
- word = imap_next_word (buf);
- if (g_strncasecmp (word, "LIST", 4) && g_strncasecmp (word, "LSUB", 4))
- return FALSE;
-
- /* get the flags */
- word = imap_next_word (word);
- if (*word != '(')
- return FALSE;
-
- word++;
- for (ep = word; *ep && *ep != ')'; ep++);
- if (*ep != ')')
- return FALSE;
-
- *flags = g_strndup (word, (gint)(ep - word));
-
- /* get the directory separator */
- word = imap_next_word (ep);
- if (*word) {
- if (!strncmp (word, "NIL", 3)) {
- *sep = NULL;
- } else {
- for (ep = word; *ep && *ep != ' '; ep++);
- *sep = g_strndup (word, (gint)(ep - word));
- string_unquote (*sep);
- }
- } else {
- return FALSE;
- }
-
- /* get the folder name */
- word = imap_next_word (word);
- *folder = g_strdup (word);
- g_strstrip (*folder);
-
- /* chop out the folder prefix */
- if (*namespace && !strncmp (*folder, namespace, strlen (namespace))) {
- f = *folder + strlen (namespace) + strlen (*sep);
- memmove (*folder, f, strlen (f) + 1);
- }
-
- string_unquote (*folder); /* unquote the mailbox if it's quoted */
-
- return TRUE;
-}
-
-static char *
-get_quoted_token (char *string, int *len)
-{
- char *ep;
-
- for (ep = string + 1; *ep; ep++)
- if (*ep == '"' && *(ep - 1) != '\\')
- break;
- if (*ep)
- ep++;
-
- *len = ep - string;
-
- return g_strndup (string, *len);
-}
-
-static char *
-get_token (char *string, int *len)
-{
- char *p, *ep;
-
- for (p = string; *p && *p == ' '; p++);
-
- if (*p == '"') {
- char *token;
- int i;
-
- token = get_quoted_token (p, &i);
-
- *len = i + (p - string);
-
- return token;
- }
-
- for (ep = p; *ep && *ep != ' ' && *ep != ')'; ep++);
-
- *len = ep - string;
-
- return g_strndup (p, *len);
-}
-
-struct sexp_node *
-get_sexp_node (const char *exp)
-{
- struct sexp_node *node = NULL;
- char *left_exp, *right_exp, *this_exp;
- char *p, *ep;
- int len, pbal;
-
- if (exp && *exp) {
- node = g_malloc0 (sizeof (struct sexp_node));
- node->l_node = NULL;
- node->r_node = NULL;
- node->function = NULL;
- node->data = NULL;
-
- p = (char *) exp + 1;
- for (ep = p, pbal = 1; *ep && pbal; ep++) {
- if (*ep == '(')
- pbal++;
- if (*ep == ')')
- pbal--;
- }
-
- this_exp = g_strndup (p, (gint)(ep - p));
-
- for (left_exp = ep; *left_exp && *left_exp != '('; left_exp++);
- left_exp = g_strdup (left_exp);
-
- for (right_exp = this_exp; *right_exp && *right_exp != '('; right_exp++);
- pbal = 1;
- for (ep = right_exp; *ep && pbal; ep++) {
- if (*ep == '(')
- pbal++;
- if (*ep == ')')
- pbal--;
- }
- right_exp = g_strndup (right_exp, (gint)(ep - right_exp));
-
- /* fill in the node */
- node->function = get_token (this_exp, &len);
- p = this_exp + len;
- for (ep = p; *ep && *ep != '(' && *ep != ')'; ep++);
- node->data = g_strndup (p, (gint)(ep - p));
-
- g_strstrip (node->data);
-
- node->l_node = get_sexp_node (left_exp);
- node->r_node = get_sexp_node (right_exp);
-
- g_free (this_exp);
- g_free (left_exp);
- g_free (right_exp);
- }
-
- return node;
-}
-
-static void
-print_node (struct sexp_node *node, int depth)
-{
- int i;
-
- for (i = 0; i < depth; i++)
- d(fprintf (stderr, " "));
-
- d(fprintf (stderr, "%s\n", node->function));
-
- if (*node->data) {
- for (i = 0; i < depth + 1; i++)
- d(fprintf (stderr, " "));
-
- d(fprintf (stderr, "%s\n", node->data));
- }
-
- if (node->r_node)
- print_node (node->r_node, depth + 1);
-
- if (node->l_node)
- print_node (node->l_node, depth);
-}
-
-static const char *
-get_func (struct sexp_node *node)
-{
- int i;
-
- for (i = 0; esexp_keys[i]; i++)
- if (!strncmp (esexp_keys[i], node->function, strlen (node->function)))
- break;
-
- if (esexp_keys[i])
- return imap_keys[i];
- else
- return node->function;
-}
-
-static char *
-get_data (struct sexp_node *node)
-{
- GPtrArray *args;
- const char *func;
- char *data, *token, *p;
- int i, len;
-
- func = get_func (node);
-
- args = g_ptr_array_new ();
-
- p = node->data;
- while (p && *p) {
- token = get_token (p, &len);
- g_ptr_array_add (args, token);
- p += len;
- }
-
- if (func && !strcmp ("HEADER", func) && args->len > 0)
- string_unquote (args->pdata[0]);
-
- if (args->len > 0) {
- data = g_strjoinv (" ", (char **) args->pdata);
- } else {
- data = g_strdup ("");
- }
-
- for (i = 0; i < args->len; i++)
- g_free (args->pdata[i]);
-
- g_ptr_array_free (args, TRUE);
-
- return data;
-}
-
-static char *
-str_sexp_node (struct sexp_node *node)
-{
- char *node_str, *data, *str, *l_str, *r_str;
- const char *func;
-
- func = get_func (node);
- data = get_data (node);
-
- if (func) {
- if (*data)
- str = g_strdup_printf ("%s %s", func, data);
- else
- str = g_strdup (func);
- } else {
- str = NULL;
- }
-
- g_free (data);
-
- r_str = NULL;
- if (node->r_node)
- r_str = str_sexp_node (node->r_node);
-
- l_str = NULL;
- if (node->l_node)
- l_str = str_sexp_node (node->l_node);
-
- if (str) {
- if (r_str) {
- if (l_str)
- node_str = g_strdup_printf ("%s %s %s", str, r_str, l_str);
- else
- node_str = g_strdup_printf ("%s %s", str, r_str);
- } else {
- if (l_str)
- node_str = g_strdup_printf ("%s %s", str, l_str);
- else
- node_str = g_strdup_printf ("%s", str);
- }
- } else {
- if (r_str) {
- if (l_str)
- node_str = g_strdup_printf ("%s %s", r_str, l_str);
- else
- node_str = g_strdup_printf ("%s", r_str);
- } else {
- if (l_str)
- node_str = g_strdup_printf ("%s", l_str);
- else
- node_str = g_strdup ("");
- }
- }
-
- g_free (str);
- g_free (l_str);
- g_free (r_str);
-
- return node_str;
-}
-
-static void
-free_sexp_node (struct sexp_node *node)
-{
- if (node->r_node)
- free_sexp_node (node->r_node);
-
- if (node->l_node)
- free_sexp_node (node->l_node);
-
- g_free (node->function);
- g_free (node->data);
- g_free (node);
-}
-
-char *
-imap_translate_sexp (const char *expression)
-{
- struct sexp_node *root;
- char *sexp, *exp;
-
- exp = g_strdup (expression);
- strip (exp, '\n');
- root = get_sexp_node (exp);
- g_free (exp);
-
- d(print_node (root, 0));
- d(fprintf (stderr, "\n"));
-
- sexp = str_sexp_node (root);
-
- free_sexp_node (root);
-
- return sexp;
-}
-
-
-
-
-
-
-
-
-
-
-#ifdef _ALL_HELL_BROKE_LOOSE_
-static char *
-stresexptree (ESExpTerm *node)
-{
- char *node_str, *func, *str, *l_str, *r_str;
- int i;
-
- for (i = 0; esexp_keys[i]; i++)
- if (!strncmp (esexp_keys[i], node->func->sym->name, strlen (node->func->sym->name)))
- break;
-
- if (esexp_keys[i])
- func = imap_keys[i];
- else
- func = node->func->sym->name;
-
- if (func) {
- if (*node->var->name)
- str = g_strdup_printf ("%s %s", func, node->var->name);
- else
- str = g_strdup (func);
- } else {
- str = NULL;
- }
-
- r_str = NULL;
- if (node->r_node)
- r_str = str_sexp_node (node->r_node);
-
- l_str = NULL;
- if (node->l_node)
- l_str = str_sexp_node (node->l_node);
-
- if (str) {
- if (r_str) {
- if (l_str)
- node_str = g_strdup_printf ("%s %s %s", str, r_str, l_str);
- else
- node_str = g_strdup_printf ("%s %s", str, r_str);
- } else {
- if (l_str)
- node_str = g_strdup_printf ("%s %s", str, l_str);
- else
- node_str = g_strdup_printf ("%s", str);
- }
- } else {
-
- if (r_str) {
- if (l_str)
- node_str = g_strdup_printf ("%s %s", r_str, l_str);
- else
- node_str = g_strdup_printf ("%s", r_str);
- } else {
- if (l_str)
- node_str = g_strdup_printf ("%s", l_str);
- else
- node_str = g_strdup ("");
- }
- }
-
- g_free (str);
- g_free (l_str);
- g_free (r_str);
-
- return node_str;
-}
-
-char *
-imap_translate_sexp (const char *expression)
-{
- ESExp *esexp;
- char *sexp;
-
- esexp = e_sexp_new ();
-
- e_sexp_input_text (esexp, exp, strlen (exp));
- e_sexp_parse (esexp);
-
- sexp = stresexptree (esexp->tree);
-
- gtk_object_unref (GTK_OBJECT (esexp));
-
- return sexp;
-}
-#endif /* _ALL_HELL_BROKE_LOOSE_ */
diff --git a/camel/providers/imap/camel-imap-utils.h b/camel/providers/imap/camel-imap-utils.h
deleted file mode 100644
index 11c6c48956..0000000000
--- a/camel/providers/imap/camel-imap-utils.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (www.helixcode.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 CAMEL_IMAP_UTILS_H
-#define CAMEL_IMAP_UTILS_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <glib.h>
-
-char *imap_next_word (char *buf);
-
-gboolean imap_parse_list_response (char *buf, char *namespace, char **flags, char **sep, char **folder);
-
-char *imap_translate_sexp (const char *expression);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_IMAP_UTILS_H */
diff --git a/camel/providers/imap/libcamelimap.urls b/camel/providers/imap/libcamelimap.urls
deleted file mode 100644
index c301c0ffac..0000000000
--- a/camel/providers/imap/libcamelimap.urls
+++ /dev/null
@@ -1 +0,0 @@
-imap
diff --git a/camel/providers/maildir/.cvsignore b/camel/providers/maildir/.cvsignore
deleted file mode 100644
index 2e7b174532..0000000000
--- a/camel/providers/maildir/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-Makefile.in
-Makefile
-.deps
-*.lo
-*.la
-.libs
diff --git a/camel/providers/maildir/Makefile.am b/camel/providers/maildir/Makefile.am
deleted file mode 100644
index 80b41a2d45..0000000000
--- a/camel/providers/maildir/Makefile.am
+++ /dev/null
@@ -1,22 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-libcamelmaildirincludedir = $(includedir)/camel
-
-lib_LTLIBRARIES = libcamelmaildir.la
-
-INCLUDES = -I.. -I$(srcdir)/.. -I$(top_srcdir)/intl -I$(top_srcdir)/camel \
- $(GTK_INCLUDEDIR) -I$(includedir) \
- -DG_LOG_DOMAIN=\"camel-maildir-provider\"
-
-libcamelmaildir_la_SOURCES = \
- camel-maildir-folder.c \
- camel-maildir-provider.c \
- camel-maildir-store.c
-
-libcamelmaildirinclude_HEADERS = \
- camel-maildir-folder.h \
- camel-maildir-store.h
-
-libcamelmaildir_la_LDFLAGS = -version-info 0:0:0
-
-EXTRA_DIST =
diff --git a/camel/providers/maildir/camel-maildir-folder.c b/camel/providers/maildir/camel-maildir-folder.c
deleted file mode 100644
index 2cb81f3e81..0000000000
--- a/camel/providers/maildir/camel-maildir-folder.c
+++ /dev/null
@@ -1,802 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-maildir-folder.c : camel-folder subclass for maildir folders */
-
-/*
- *
- * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> .
- *
- * 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
- */
-
-/*
- * AUTHORS : Jukka Zitting
- *
- */
-
-
-#include <config.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <stdio.h>
-#include <errno.h>
-#include <time.h>
-#include <string.h>
-#include "camel-maildir-folder.h"
-#include "camel-maildir-store.h"
-#include "camel-stream-fs.h"
-#include "camel-log.h"
-
-static CamelFolderClass *parent_class=NULL;
-
-/* Returns the class for a CamelMaildirFolder */
-#define CMAILDIRF_CLASS(so) CAMEL_MAILDIR_FOLDER_CLASS (GTK_OBJECT(so)->klass)
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass)
-#define CMAILDIRS_CLASS(so) CAMEL_STORE_CLASS (GTK_OBJECT(so)->klass)
-
-static void _init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex);
-static void _set_name (CamelFolder *folder, const gchar *name, CamelException *ex);
-static gboolean _exists (CamelFolder *folder, CamelException *ex);
-static gboolean _create (CamelFolder *folder, CamelException *ex);
-static gboolean _delete (CamelFolder *folder, gboolean recurse, CamelException *ex);
-static gboolean _delete_messages (CamelFolder *folder, CamelException *ex);
-static CamelMimeMessage *_get_message (CamelFolder *folder, gint number, CamelException *ex);
-static gint _get_message_count (CamelFolder *folder, CamelException *ex);
-static void _expunge (CamelFolder *folder, CamelException *ex);
-static GList *_list_subfolders (CamelFolder *folder, CamelException *ex);
-
-/* fs utility functions */
-static DIR * _xopendir (const gchar *path);
-static gboolean _xstat (const gchar *path, struct stat *buf);
-static gboolean _xmkdir (const gchar *path);
-static gboolean _xrename (const gchar *from, const gchar *to);
-static gboolean _xunlink (const gchar *path);
-static gboolean _xrmdir (const gchar *path);
-/* ** */
-
-static void
-camel_maildir_folder_class_init (CamelMaildirFolderClass *camel_maildir_folder_class)
-{
- CamelFolderClass *camel_folder_class =
- CAMEL_FOLDER_CLASS (camel_maildir_folder_class);
-
- parent_class = gtk_type_class (camel_folder_get_type ());
-
- /* virtual method definition */
- /* virtual method overload */
- camel_folder_class->init_with_store = _init_with_store;
- camel_folder_class->set_name = _set_name;
- camel_folder_class->exists = _exists;
- camel_folder_class->create = _create;
- camel_folder_class->delete = _delete;
- camel_folder_class->delete_messages = _delete_messages;
- camel_folder_class->expunge = _expunge;
- camel_folder_class->get_message = _get_message;
- camel_folder_class->get_message_count = _get_message_count;
- camel_folder_class->list_subfolders = _list_subfolders;
-}
-
-GtkType
-camel_maildir_folder_get_type (void)
-{
- static GtkType camel_maildir_folder_type = 0;
-
- if (!camel_maildir_folder_type) {
- GtkTypeInfo camel_maildir_folder_info =
- {
- "CamelMaildirFolder",
- sizeof (CamelMaildirFolder),
- sizeof (CamelMaildirFolderClass),
- (GtkClassInitFunc) camel_maildir_folder_class_init,
- (GtkObjectInitFunc) NULL,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- camel_maildir_folder_type =
- gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_maildir_folder_info);
- }
-
- return camel_maildir_folder_type;
-}
-
-
-
-
-
-
-/**
- * CamelMaildirFolder::init_with_store: initializes the folder object
- * @folder: folder object to initialize
- * @parent_store: parent store object of the folder
- *
- * Simply tells that the folder can contain messages but not subfolders.
- * Perhaps we'll later implement subfolders too...
- */
-static void
-_init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex)
-{
- CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::init_with_store\n");
- g_assert (folder);
- g_assert (parent_store);
-
- /* call parent method */
- parent_class->init_with_store (folder, parent_store, ex);
-
- folder->can_hold_messages = TRUE;
- folder->can_hold_folders = TRUE;
- folder->has_summary_capability = FALSE;
-
- CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::init_with_store\n");
-}
-
-/**
- * CamelMaildirFolder::set_name: sets the name of the folder
- * @folder: folder object
- * @name: name of the folder
- *
- * Sets the name of the folder object. The existence of a folder with
- * the given name is not checked in this function.
- */
-static void
-_set_name (CamelFolder *folder, const gchar *name, CamelException *ex)
-{
- CamelMaildirFolder *maildir_folder;
- CamelMaildirStore *maildir_store;
-
- CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::set_name\n");
- g_assert (folder);
- g_assert (name);
- g_assert (folder->parent_store);
-
- maildir_folder = CAMEL_MAILDIR_FOLDER (folder);
- maildir_store = CAMEL_MAILDIR_STORE (folder->parent_store);
-
- /* call default implementation */
- parent_class->set_name (folder, name, ex);
-
- if (maildir_folder->directory_path)
- g_free (maildir_folder->directory_path);
-
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name full_name is %s\n", folder->full_name);
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name toplevel_dir is %s\n", maildir_store->toplevel_dir);
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name separator is %c\n", camel_store_get_separator (folder->parent_store));
-
- if (folder->full_name && folder->full_name[0])
- maildir_folder->directory_path =
- g_strconcat (maildir_store->toplevel_dir, G_DIR_SEPARATOR_S,
- folder->full_name, NULL);
- else
- maildir_folder->directory_path = g_strdup (maildir_store->toplevel_dir);
-
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name: name set to %s\n", name);
- CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::set_name\n");
-}
-
-/**
- * CamelMaildirFolder::exists: tests whether the named maildir exists
- * @folder: folder object
- *
- * A created maildir folder object doesn't necessarily exist yet in the
- * filesystem. This function checks whether the maildir exists.
- * The structure of the maildir is stated in the maildir.5 manpage.
- *
- * maildir.5:
- * A directory in maildir format has three subdirectories,
- * all on the same filesystem: tmp, new, and cur.
- *
- * Return value: TRUE if the maildir exists, FALSE otherwise
- */
-static gboolean
-_exists (CamelFolder *folder, CamelException *ex)
-{
- CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder);
- static const gchar *dir[3] = { "new", "cur", "tmp" };
- gint i;
- struct stat statbuf;
- const gchar *maildir;
- gchar *path;
- gboolean rv = TRUE;
-
- CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::exists\n");
- g_assert (folder);
- g_return_val_if_fail (maildir_folder->directory_path, FALSE);
-
- maildir = maildir_folder->directory_path;
-
- CAMEL_LOG_FULL_DEBUG ("CamelMailFolder::exists: checking maildir %s\n",
- maildir);
-
- /* check whether the toplevel directory exists */
- rv = _xstat (maildir, &statbuf) && S_ISDIR (statbuf.st_mode);
-
- /* check whether the maildir subdirectories exist */
- for (i = 0; rv && i < 3; i++) {
- path = g_strconcat (maildir, G_DIR_SEPARATOR_S, dir[i], NULL);
-
- rv = _xstat (path, &statbuf) && S_ISDIR (statbuf.st_mode);
-
- g_free (path);
- }
-
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::exists: %s\n",
- (rv) ? "maildir found" : "maildir not found");
- CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::exists\n");
- return rv;
-}
-
-/**
- * CamelMaildirFolder::create: creates the named maildir
- * @folder: folder object
- *
- * A created maildir folder object doesn't necessarily exist yet in the
- * filesystem. This function creates the maildir if it doesn't yet exist.
- * The structure of the maildir is stated in the maildir.5 manpage.
- *
- * maildir.5:
- * A directory in maildir format has three subdirectories,
- * all on the same filesystem: tmp, new, and cur.
- *
- * Return value: TRUE if the maildir existed already or was created,
- * FALSE otherwise
- */
-static gboolean
-_create (CamelFolder *folder, CamelException *ex)
-{
- CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder);
- static const gchar *dir[3] = { "new", "cur", "tmp" };
- gint i;
- const gchar *maildir;
- gchar *path;
- gboolean rv = TRUE;
-
- CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::create\n");
- g_assert (folder);
-
- /* check whether the maildir already exists */
- if (camel_folder_exists (folder, ex)) return TRUE;
-
- maildir = maildir_folder->directory_path;
-
- CAMEL_LOG_FULL_DEBUG ("CamelMailFolder::create: creating maildir %s\n",
- maildir);
-
- /* create the toplevel directory */
- rv = _xmkdir (maildir);
-
- /* create the maildir subdirectories */
- for (i = 0; rv && i < 3; i++) {
- path = g_strconcat (maildir, G_DIR_SEPARATOR_S, dir[i], NULL);
-
- rv = _xmkdir (path);
-
- g_free (path);
- }
-
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::create: %s\n",
- rv ? "maildir created" : "an error occurred");
- CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::create\n");
- return rv;
-}
-
-/**
- * CamelMaildirFolder::delete: delete the maildir folder
- * @folder: the folder object
- * @recurse:
- *
- * This function empties and deletes the maildir folder. The subdirectories
- * "tmp", "cur", and "new" are removed first and then the toplevel maildir
- * directory is deleted. All files from the directories are deleted as well,
- * so you should be careful when using this function. If a subdirectory cannot
- * be deleted, then the operation it is stopped. Thus if an error occurs, the
- * maildir directory won't be removed, but it might no longer be a valid maildir.
- */
-static gboolean
-_delete (CamelFolder *folder, gboolean recurse, CamelException *ex)
-{
- CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder);
- static const gchar *dir[3] = { "new", "cur", "tmp" };
- gint i;
- const gchar *maildir;
- gchar *path;
- gboolean rv = TRUE;
-
- CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::create\n");
- g_assert (folder);
-
- /* check whether the maildir already exists */
- if (!camel_folder_exists (folder, ex)) return TRUE;
-
- maildir = maildir_folder->directory_path;
-
- CAMEL_LOG_FULL_DEBUG ("CamelMailFolder::delete: deleting maildir %s\n",
- maildir);
-
- /* delete the maildir subdirectories */
- for (i = 0; rv && i < 3; i++) {
- path = g_strconcat (maildir, G_DIR_SEPARATOR_S, dir[i], NULL);
-
- rv = _xrmdir (path);
-
- g_free (path);
- }
-
- /* create the toplevel directory */
- if (rv)
- rv = _xrmdir (maildir);
-
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::delete: %s\n",
- rv ? "maildir deleted" : "an error occurred");
- CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::delete\n");
- return rv;
-}
-
-/**
- * CamelMaildirFolder::delete_messages: empty the maildir folder
- * @folder: the folder object
- *
- * This function empties the maildir folder. All messages from the
- * "cur" subdirectory are deleted. If a message cannot be deleted, then
- * it is just skipped and the rest of the messages are still deleted.
- * Files with names starting with a dot are skipped as described in the
- * maildir.5 manpage.
- *
- * maildir.5:
- * It is a good idea for readers to skip all filenames in new
- * and cur starting with a dot. Other than this, readers
- * should not attempt to parse filenames.
- *
- * Return value: FALSE on error and if some messages could not be deleted.
- * TRUE otherwise.
- */
-static gboolean
-_delete_messages (CamelFolder *folder, CamelException *ex)
-{
- CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder);
- const gchar *maildir;
- gchar *curdir, *file;
- DIR *dir_handle;
- struct dirent *dir_entry;
- gboolean rv = TRUE;
-
- CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::delete_messages\n");
- g_assert (folder);
-
- /* call default implementation */
- parent_class->delete_messages (folder, ex);
-
- /* Check if the folder didn't exist */
- if (!camel_folder_exists (folder, ex)) return TRUE;
-
- maildir = maildir_folder->directory_path;
-
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::delete_messages: "
- "deleting messages from %s\n", maildir);
-
- /* delete messages from the maildir subdirectory "cur" */
- curdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "cur", NULL);
-
- dir_handle = _xopendir (curdir);
- if (dir_handle) {
- while ((dir_entry = readdir (dir_handle))) {
- if (dir_entry->d_name[0] == '.') continue;
- file = g_strconcat (curdir, G_DIR_SEPARATOR_S,
- dir_entry->d_name, NULL);
-
- if (!_xunlink (file)) rv = FALSE;
-
- g_free (file);
- }
- closedir (dir_handle);
- } else
- rv = FALSE;
-
- g_free (curdir);
-
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::delete_messages: %s\n",
- rv ? "messages deleted" : "an error occurred");
- CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::delete_messages\n");
- return rv;
-}
-
-/**
- * CamelMaildirFolder::get_message: get a message from maildir
- * @folder: the folder object
- * @number: number of the message within the folder
- *
- * Return value: the message, NULL on error
- */
-static CamelMimeMessage *
-_get_message (CamelFolder *folder, gint number, CamelException *ex)
-{
- CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER(folder);
- DIR *dir_handle;
- struct dirent *dir_entry;
- CamelStream *stream;
- CamelMimeMessage *message = NULL;
- const gchar *maildir;
- gchar *curdir, *file = NULL;
- gint count = -1;
-
- CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::get_message\n");
- g_assert(folder);
-
- /* Check if the folder exists */
- if (!camel_folder_exists (folder, ex)) return NULL;
-
- maildir = maildir_folder->directory_path;
-
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message: "
- "getting message #%d from %s\n", number, maildir);
-
- /* Count until the desired message is reached */
- curdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "cur", NULL);
- if ((dir_handle = _xopendir (curdir))) {
- while ((count < number) && (dir_entry = readdir (dir_handle)))
- if (dir_entry->d_name[0] != '.') count++;
-
- if (count == number)
- file = g_strconcat (curdir, G_DIR_SEPARATOR_S,
- dir_entry->d_name, NULL);
-
- closedir (dir_handle);
- }
- g_free (curdir);
- if (!file) return NULL;
-
- /* Create the message object */
- message = camel_mime_message_new ();
- stream = camel_stream_fs_new_with_name (file, CAMEL_STREAM_FS_READ);
-
- if (!message || !stream) {
- g_free (file);
- if (stream) gtk_object_unref (GTK_OBJECT (stream));
- if (message) gtk_object_unref (GTK_OBJECT (message));
- return NULL;
- }
-
- camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (message),
- stream);
- gtk_object_unref (GTK_OBJECT (stream));
- gtk_object_set_data_full (GTK_OBJECT (message),
- "fullpath", file, g_free);
-
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message: "
- "message %p created from %s\n", message, file);
- CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::get_message\n");
- return message;
-}
-
-/**
- * CamelMaildirFolder::get_message_count: count messages in maildir
- * @folder: the folder object
- *
- * Returns the number of messages in the maildir folder. New messages
- * are included in this count.
- *
- * Return value: number of messages in the maildir, -1 on error
- */
-static gint
-_get_message_count (CamelFolder *folder, CamelException *ex)
-{
- CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER(folder);
- const gchar *maildir;
- gchar *newdir, *curdir, *newfile, *curfile;
- DIR *dir_handle;
- struct dirent *dir_entry;
- guint count = 0;
-
- CAMEL_LOG_FULL_DEBUG ("Entering "
- "CamelMaildirFolder::get_message_count\n");
- g_assert(folder);
-
- /* check if the maildir exists */
- if (!camel_folder_exists (folder, ex)) return -1;
-
- maildir = maildir_folder->directory_path;
-
- newdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "new", NULL);
- curdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "cur", NULL);
-
- /* Check new messages */
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message_count: "
- "getting new messages from %s\n", newdir);
- if ((dir_handle = _xopendir (newdir))) {
- while ((dir_entry = readdir (dir_handle))) {
- if (dir_entry->d_name[0] == '.') continue;
- newfile = g_strconcat (newdir, G_DIR_SEPARATOR_S,
- dir_entry->d_name, NULL);
- curfile = g_strconcat (curdir, G_DIR_SEPARATOR_S,
- dir_entry->d_name, ":2,", NULL);
-
- _xrename (newfile, curfile);
-
- g_free (curfile);
- g_free (newfile);
- }
- closedir (dir_handle);
- }
-
- /* Count messages */
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message_count: "
- "counting messages in %s\n", curdir);
- if ((dir_handle = _xopendir (curdir))) {
- while ((dir_entry = readdir (dir_handle)))
- if (dir_entry->d_name[0] != '.') count++;
- closedir (dir_handle);
- }
-
- g_free (curdir);
- g_free (newdir);
-
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message_count: "
- " found %d messages\n", count);
- CAMEL_LOG_FULL_DEBUG ("Leaving "
- "CamelMaildirFolder::get_message_count\n");
- return count;
-}
-
-
-
-
-/**
- * CamelMaildirFolder::expunge: expunge messages marked as deleted
- * @folder: the folder object
- *
- * Physically deletes the messages marked as deleted in the folder.
- */
-static void
-_expunge (CamelFolder *folder, CamelException *ex)
-{
- CamelMimeMessage *message;
- GList *node;
- gchar *fullpath;
-
- CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::expunge\n");
- g_assert(folder);
-
- /* expunge messages marked for deletion */
- for (node = folder->message_list; node; node = g_list_next(node)) {
- message = CAMEL_MIME_MESSAGE (node->data);
- if (!message) {
- CAMEL_LOG_WARNING ("CamelMaildirFolder::expunge: "
- "null message in node %p\n", node);
- continue;
- }
-
- if (camel_mime_message_get_flag (message, "DELETED")) {
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::expunge: "
- "expunging message #%d\n",
- message->message_number);
-
- /* expunge the message */
- fullpath = gtk_object_get_data (GTK_OBJECT (message),
- "fullpath");
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::expunge: "
- "message fullpath is %s\n",
- fullpath);
-
- if (_xunlink (fullpath))
- message->expunged = TRUE;
- } else {
- CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::expunge: "
- "skipping message #%d\n",
- message->message_number);
- }
- }
-
- CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::expunge\n");
-}
-
-
-
-
-/**
- * CamelMaildirFolder::list_subfolders: return a list of subfolders
- * @folder: the folder object
- *
- * Returns the names of the maildir subfolders in a list.
- *
- * Return value: list of subfolder names
- */
-static GList *
-_list_subfolders (CamelFolder *folder, CamelException *ex)
-{
- CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder);
- const gchar *maildir;
- gchar *subdir;
- struct stat statbuf;
- struct dirent *dir_entry;
- DIR *dir_handle;
- GList *subfolders = NULL;
-
- CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::list_subfolders\n");
- g_assert (folder);
-
- /* check if the maildir exists */
- if (!camel_folder_exists (folder, ex)) return NULL;
-
- /* scan through the maildir toplevel directory */
- maildir = maildir_folder->directory_path;
- if ((dir_handle = _xopendir (maildir))) {
- while ((dir_entry = readdir (dir_handle))) {
- if (dir_entry->d_name[0] == '.') continue;
- if (strcmp (dir_entry->d_name, "new") == 0) continue;
- if (strcmp (dir_entry->d_name, "cur") == 0) continue;
- if (strcmp (dir_entry->d_name, "tmp") == 0) continue;
-
- subdir = g_strconcat (maildir, G_DIR_SEPARATOR_S,
- dir_entry->d_name, NULL);
-
- if (_xstat (subdir, &statbuf)
- && S_ISDIR (statbuf.st_mode))
- subfolders =
- g_list_append (
- subfolders,
- g_strdup (dir_entry->d_name));
-
- g_free (subdir);
- }
- closedir (dir_handle);
- }
-
- CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::list_subfolders\n");
- return subfolders;
-}
-
-
-
-
-
-
-
-/*
- * fs utility function
- *
- */
-
-static DIR *
-_xopendir (const gchar *path)
-{
- DIR *handle;
- g_assert (path);
-
- handle = opendir (path);
- if (!handle) {
- CAMEL_LOG_WARNING ("ERROR: opendir (%s);\n", path);
- CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n",
- errno, strerror(errno));
- }
-
- return handle;
-}
-
-static gboolean
-_xstat (const gchar *path, struct stat *buf)
-{
- gint stat_error;
- g_assert (path);
- g_assert (buf);
-
- stat_error = stat (path, buf);
- if (stat_error == 0) {
- return TRUE;
- } else if (errno == ENOENT) {
- buf->st_mode = 0;
- return TRUE;
- } else {
- CAMEL_LOG_WARNING ("ERROR: stat (%s, %p);\n", path, buf);
- CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n",
- errno, strerror(errno));
- return FALSE;
- }
-}
-
-static gboolean
-_xmkdir (const gchar *path)
-{
- g_assert (path);
-
- if (mkdir (path, S_IRWXU) == -1) {
- CAMEL_LOG_WARNING ("ERROR: mkdir (%s, S_IRWXU);\n", path);
- CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n",
- errno, strerror(errno));
- return FALSE;
- }
-
- return TRUE;
-}
-
-static gboolean
-_xrename (const gchar *from, const gchar *to)
-{
- g_assert (from);
- g_assert (to);
-
- if (rename (from, to) == 0) {
- return TRUE;
- } else {
- CAMEL_LOG_WARNING ("ERROR: rename (%s, %s);\n", from, to);
- CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n",
- errno, strerror(errno));
- return FALSE;
- }
-}
-
-static gboolean
-_xunlink (const gchar *path)
-{
- g_assert (path);
-
- if (unlink (path) == 0) {
- return TRUE;
- } else if (errno == ENOENT) {
- return TRUE;
- } else {
- CAMEL_LOG_WARNING ("ERROR: unlink (%s);\n", path);
- CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n",
- errno, strerror(errno));
- return FALSE;
- }
-}
-
-static gboolean
-_xrmdir (const gchar *path)
-{
- DIR *dir_handle;
- struct dirent *dir_entry;
- gchar *file;
- struct stat statbuf;
- g_assert (path);
-
- dir_handle = opendir (path);
- if (!dir_handle && errno == ENOENT) {
- return TRUE;
- } else if (!dir_handle) {
- CAMEL_LOG_WARNING ("ERROR: opendir (%s);\n", path);
- CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n",
- errno, strerror(errno));
- return FALSE;
- }
-
- while ((dir_entry = readdir (dir_handle))) {
- file = g_strconcat (path, G_DIR_SEPARATOR_S, dir_entry->d_name,
- NULL);
- if (_xstat (file, &statbuf) && S_ISREG (statbuf.st_mode))
- _xunlink (file);
- g_free (file);
- }
-
- closedir (dir_handle);
-
- if (rmdir (path) == 0) {
- return TRUE;
- } else if (errno == ENOENT) {
- return TRUE;
- } else {
- CAMEL_LOG_WARNING ("ERROR: rmdir (%s);\n", path);
- CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n",
- errno, strerror(errno));
- return FALSE;
- }
-}
-
-/** *** **/
-
diff --git a/camel/providers/maildir/camel-maildir-folder.h b/camel/providers/maildir/camel-maildir-folder.h
deleted file mode 100644
index 5997da2011..0000000000
--- a/camel/providers/maildir/camel-maildir-folder.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-maildir-folder.h : Abstract class for an email folder */
-
-/*
- *
- * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> .
- *
- * 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 CAMEL_MAILDIR_FOLDER_H
-#define CAMEL_MAILDIR_FOLDER_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <gtk/gtk.h>
-#include "camel-folder.h"
-/* #include "camel-store.h" */
-
-#define CAMEL_MAILDIR_FOLDER_TYPE (camel_maildir_folder_get_type ())
-#define CAMEL_MAILDIR_FOLDER(obj) (GTK_CHECK_CAST((obj), CAMEL_MAILDIR_FOLDER_TYPE, CamelMaildirFolder))
-#define CAMEL_MAILDIR_FOLDER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MAILDIR_FOLDER_TYPE, CamelMaildirFolderClass))
-#define IS_CAMEL_MAILDIR_FOLDER(o) (GTK_CHECK_TYPE((o), CAMEL_MAILDIR_FOLDER_TYPE))
-
-
-typedef struct {
- CamelFolder parent_object;
-
- gchar *directory_path;
-} CamelMaildirFolder;
-
-
-
-typedef struct {
- CamelFolderClass parent_class;
-
- /* Virtual methods */
-
-} CamelMaildirFolderClass;
-
-
-/* public methods */
-
-/* Standard Gtk function */
-GtkType camel_maildir_folder_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MAILDIR_FOLDER_H */
diff --git a/camel/providers/maildir/camel-maildir-provider.c b/camel/providers/maildir/camel-maildir-provider.c
deleted file mode 100644
index cd5521adc0..0000000000
--- a/camel/providers/maildir/camel-maildir-provider.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-maildir-provider.c: maildir provider registration code */
-
-/*
- *
- * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> .
- *
- * 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
- */
-
-#include "config.h"
-#include "camel-maildir-store.h"
-#include "camel-provider.h"
-#include "camel-log.h"
-
-
-static CamelProvider _maildir_provider = {
- (GtkType) 0,
- PROVIDER_STORE,
- "maildir",
- "Maildir provider for Camel",
- "This maildir provider is based on the default MH provider of Camel",
- (GModule *) NULL
-};
-
-
-
-CamelProvider *
-camel_provider_module_init ()
-{
- _maildir_provider.object_type = camel_maildir_store_get_type();
- return &_maildir_provider;
-}
diff --git a/camel/providers/maildir/camel-maildir-store.c b/camel/providers/maildir/camel-maildir-store.c
deleted file mode 100644
index 8f37494003..0000000000
--- a/camel/providers/maildir/camel-maildir-store.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-maildir-store.c : class for an maildir store */
-
-/*
- *
- * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> .
- *
- * 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
- */
-
-#include "camel-maildir-store.h"
-#include "camel-maildir-folder.h"
-#include "url-util.h"
-
-static CamelStoreClass *parent_class=NULL;
-
-/* Returns the class for a CamelMaildirStore */
-#define CMAILDIRS_CLASS(so) CAMEL_MAILDIR_STORE_CLASS (GTK_OBJECT(so)->klass)
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass)
-#define CMAILDIRF_CLASS(so) CAMEL_MAILDIR_FOLDER_CLASS (GTK_OBJECT(so)->klass)
-
-static void _init (CamelStore *store, CamelSession *session,
- const gchar *url_name);
-static CamelFolder *_get_folder (CamelStore *store, const gchar *folder_name);
-
-static void
-camel_maildir_store_class_init (
- CamelMaildirStoreClass *camel_maildir_store_class)
-{
- CamelStoreClass *camel_store_class =
- CAMEL_STORE_CLASS (camel_maildir_store_class);
-
- parent_class = gtk_type_class (camel_store_get_type ());
-
- /* virtual method definition */
- /* virtual method overload */
- camel_store_class->init = _init;
- camel_store_class->get_folder = _get_folder;
-}
-
-static void
-camel_maildir_store_init (gpointer object, gpointer klass)
-{
- CamelMaildirStore *maildir_store = CAMEL_MAILDIR_STORE (object);
- CamelStore *store = CAMEL_STORE (object);
-
- store->separator = G_DIR_SEPARATOR;
-}
-
-GtkType
-camel_maildir_store_get_type (void)
-{
- static GtkType camel_maildir_store_type = 0;
-
- if (!camel_maildir_store_type) {
- GtkTypeInfo camel_maildir_store_info =
- {
- "CamelMaildirStore",
- sizeof (CamelMaildirStore),
- sizeof (CamelMaildirStoreClass),
- (GtkClassInitFunc) camel_maildir_store_class_init,
- (GtkObjectInitFunc) camel_maildir_store_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- camel_maildir_store_type =
- gtk_type_unique (CAMEL_STORE_TYPE,
- &camel_maildir_store_info);
- }
-
- return camel_maildir_store_type;
-}
-
-static void
-_init (CamelStore *store, CamelSession *session, const gchar *url_name)
-{
- CamelMaildirStore *maildir_store = CAMEL_MAILDIR_STORE (store);
- Gurl *store_url;
- g_assert (url_name);
-
- /* call parent implementation */
- parent_class->init (store, session, url_name);
-
- /* find the path in the URL*/
- store_url = g_url_new (url_name);
-
- g_return_if_fail (store_url);
- g_return_if_fail (store_url->path);
-
- maildir_store->toplevel_dir = g_strdup (store_url->path);
-
- g_url_free (store_url);
-}
-
-static CamelFolder *
-_get_folder (CamelStore *store, const gchar *folder_name)
-{
- CamelMaildirStore *maildir_store = CAMEL_MAILDIR_STORE (store);
- CamelMaildirFolder *new_maildir_folder;
- CamelFolder *new_folder;
-
- new_maildir_folder = gtk_type_new (CAMEL_MAILDIR_FOLDER_TYPE);
- new_folder = CAMEL_FOLDER (new_maildir_folder);
-
- CF_CLASS (new_folder)->init_with_store (new_folder, store, NULL);
- CF_CLASS (new_folder)->set_name (new_folder, folder_name, NULL);
-
- return new_folder;
-}
diff --git a/camel/providers/maildir/camel-maildir-store.h b/camel/providers/maildir/camel-maildir-store.h
deleted file mode 100644
index 1a95ed1436..0000000000
--- a/camel/providers/maildir/camel-maildir-store.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-maildirstore.h : class for an maildir store */
-
-/*
- *
- * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> .
- *
- * 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 CAMEL_MAILDIR_STORE_H
-#define CAMEL_MAILDIR_STORE_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <gtk/gtk.h>
-#include "camel-store.h"
-
-#define CAMEL_MAILDIR_STORE_TYPE (camel_maildir_store_get_type ())
-#define CAMEL_MAILDIR_STORE(obj) (GTK_CHECK_CAST((obj), CAMEL_MAILDIR_STORE_TYPE, CamelMaildirStore))
-#define CAMEL_MAILDIR_STORE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MAILDIR_STORE_TYPE, CamelMaildirStoreClass))
-#define IS_CAMEL_MAILDIR_STORE(o) (GTK_CHECK_TYPE((o), CAMEL_MAILDIR_STORE_TYPE))
-
-
-typedef struct {
- CamelStore parent_object;
-
- gchar *toplevel_dir;
-} CamelMaildirStore;
-
-
-
-typedef struct {
- CamelStoreClass parent_class;
-
-
-} CamelMaildirStoreClass;
-
-
-/* public methods */
-
-/* Standard Gtk function */
-GtkType camel_maildir_store_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MAILDIR_STORE_H */
-
-
diff --git a/camel/providers/mbox/.cvsignore b/camel/providers/mbox/.cvsignore
deleted file mode 100644
index fd6b811c68..0000000000
--- a/camel/providers/mbox/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-.deps
-*.lo
-*.la
diff --git a/camel/providers/mbox/Makefile.am b/camel/providers/mbox/Makefile.am
deleted file mode 100644
index 073d9830de..0000000000
--- a/camel/providers/mbox/Makefile.am
+++ /dev/null
@@ -1,39 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-libcamelmboxincludedir = $(includedir)/camel
-
-
-providerdir = $(pkglibdir)/camel-providers/$(VERSION)
-
-provider_LTLIBRARIES = libcamelmbox.la
-provider_DATA = libcamelmbox.urls
-
-INCLUDES = -I.. \
- -I$(srcdir)/.. \
- -I$(top_srcdir)/camel \
- -I$(top_srcdir)/intl \
- -I$(top_srcdir)/libibex \
- -I$(top_srcdir)/e-util \
- -I$(top_srcdir) \
- -I$(includedir) \
- $(GTK_INCLUDEDIR) \
- -DG_LOG_DOMAIN=\"camel-mbox-provider\"
-
-libcamelmbox_la_SOURCES = \
- camel-mbox-folder.c \
- camel-mbox-provider.c \
- camel-mbox-store.c \
- camel-mbox-summary.c
-
-libcamelmboxinclude_HEADERS = \
- camel-mbox-folder.h \
- camel-mbox-store.h \
- camel-mbox-summary.h
-
-libcamelmbox_la_LDFLAGS = -version-info 0:0:0
-
-libcamelmbox_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS)
-#libcamelmbox_la_LIBADD = $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS)
-
-EXTRA_DIST = libcamelmbox.urls
-
diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c
deleted file mode 100644
index d533b675b9..0000000000
--- a/camel/providers/mbox/camel-mbox-folder.c
+++ /dev/null
@@ -1,625 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-mbox-folder.c : Abstract class for an email folder */
-
-/*
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright (C) 1999, 2000 Helix Code Inc.
- *
- * 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
- */
-
-#include <config.h>
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <fcntl.h>
-
-#include "camel-mbox-folder.h"
-#include "camel-mbox-store.h"
-#include "string-utils.h"
-#include "camel-stream-fs.h"
-#include "camel-mbox-summary.h"
-#include "camel-data-wrapper.h"
-#include "camel-mime-message.h"
-#include "camel-stream-filter.h"
-#include "camel-mime-filter-from.h"
-#include "camel-exception.h"
-
-#define d(x)
-
-static CamelFolderClass *parent_class = NULL;
-
-/* Returns the class for a CamelMboxFolder */
-#define CMBOXF_CLASS(so) CAMEL_MBOX_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CMBOXS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-
-static void mbox_init(CamelFolder *folder, CamelStore * parent_store,
- CamelFolder *parent_folder, const gchar * name,
-
- gchar * separator, gboolean path_begins_with_sep, CamelException *ex);
-
-static void mbox_sync(CamelFolder *folder, gboolean expunge, CamelException *ex);
-static gint mbox_get_message_count(CamelFolder *folder);
-static gint mbox_get_unread_message_count(CamelFolder *folder);
-static void mbox_append_message(CamelFolder *folder, CamelMimeMessage * message, const CamelMessageInfo * info,
-
- CamelException *ex);
-static GPtrArray *mbox_get_uids(CamelFolder *folder);
-static GPtrArray *mbox_get_subfolder_names(CamelFolder *folder);
-static GPtrArray *mbox_get_summary(CamelFolder *folder);
-static CamelMimeMessage *mbox_get_message(CamelFolder *folder, const gchar * uid, CamelException *ex);
-
-static void mbox_expunge(CamelFolder *folder, CamelException *ex);
-
-static const CamelMessageInfo *mbox_get_message_info(CamelFolder *folder, const char *uid);
-
-static GPtrArray *mbox_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex);
-static void mbox_search_free(CamelFolder *folder, GPtrArray * result);
-
-static guint32 mbox_get_message_flags(CamelFolder *folder, const char *uid);
-static void mbox_set_message_flags(CamelFolder *folder, const char *uid, guint32 flags, guint32 set);
-static gboolean mbox_get_message_user_flag(CamelFolder *folder, const char *uid, const char *name);
-static void mbox_set_message_user_flag(CamelFolder *folder, const char *uid, const char *name, gboolean value);
-static const char *mbox_get_message_user_tag(CamelFolder *folder, const char *uid, const char *name);
-static void mbox_set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value);
-
-
-static void mbox_finalize(CamelObject * object);
-
-static void
-camel_mbox_folder_class_init(CamelMboxFolderClass * camel_mbox_folder_class)
-{
- CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS(camel_mbox_folder_class);
-
- parent_class = CAMEL_FOLDER_CLASS(camel_type_get_global_classfuncs(camel_folder_get_type()));
-
- /* virtual method definition */
-
- /* virtual method overload */
- camel_folder_class->init = mbox_init;
- camel_folder_class->sync = mbox_sync;
- camel_folder_class->get_message_count = mbox_get_message_count;
- camel_folder_class->get_unread_message_count = mbox_get_unread_message_count;
- camel_folder_class->append_message = mbox_append_message;
- camel_folder_class->get_uids = mbox_get_uids;
- camel_folder_class->free_uids = camel_folder_free_deep;
- camel_folder_class->get_subfolder_names = mbox_get_subfolder_names;
- camel_folder_class->free_subfolder_names = camel_folder_free_deep;
- camel_folder_class->get_summary = mbox_get_summary;
- camel_folder_class->free_summary = camel_folder_free_nop;
- camel_folder_class->expunge = mbox_expunge;
-
- camel_folder_class->get_message = mbox_get_message;
-
- camel_folder_class->search_by_expression = mbox_search_by_expression;
- camel_folder_class->search_free = mbox_search_free;
-
- camel_folder_class->get_message_info = mbox_get_message_info;
-
- camel_folder_class->get_message_flags = mbox_get_message_flags;
- camel_folder_class->set_message_flags = mbox_set_message_flags;
- camel_folder_class->get_message_user_flag = mbox_get_message_user_flag;
- camel_folder_class->set_message_user_flag = mbox_set_message_user_flag;
- camel_folder_class->get_message_user_tag = mbox_get_message_user_tag;
- camel_folder_class->set_message_user_tag = mbox_set_message_user_tag;
-}
-
-static void
-mbox_finalize(CamelObject * object)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(object);
-
- g_free(mbox_folder->folder_file_path);
- g_free(mbox_folder->summary_file_path);
- g_free(mbox_folder->folder_dir_path);
- g_free(mbox_folder->index_file_path);
-
-}
-
-CamelType camel_mbox_folder_get_type(void)
-{
- static CamelType camel_mbox_folder_type = CAMEL_INVALID_TYPE;
-
- if (camel_mbox_folder_type == CAMEL_INVALID_TYPE) {
- camel_mbox_folder_type = camel_type_register(CAMEL_FOLDER_TYPE, "CamelMboxFolder",
- sizeof(CamelMboxFolder),
- sizeof(CamelMboxFolderClass),
- (CamelObjectClassInitFunc) camel_mbox_folder_class_init,
- NULL,
- (CamelObjectInitFunc) NULL,
- (CamelObjectFinalizeFunc) mbox_finalize);
- }
-
- return camel_mbox_folder_type;
-}
-
-static void
-mbox_init(CamelFolder *folder, CamelStore * parent_store,
- CamelFolder *parent_folder, const gchar * name, gchar * separator,
- gboolean path_begins_with_sep, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = (CamelMboxFolder *) folder;
- const gchar *root_dir_path;
- gchar *real_name;
- int forceindex;
- struct stat st;
-
- /* call parent method */
- parent_class->init(folder, parent_store, parent_folder, name, separator, path_begins_with_sep, ex);
- if (camel_exception_get_id(ex))
- return;
-
- /* we assume that the parent init
- method checks for the existance of @folder */
- folder->can_hold_messages = TRUE;
- folder->can_hold_folders = TRUE;
- folder->has_summary_capability = TRUE;
- folder->has_search_capability = TRUE;
-
- folder->permanent_flags = CAMEL_MESSAGE_ANSWERED |
- CAMEL_MESSAGE_DELETED |
- CAMEL_MESSAGE_DRAFT | CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_USER;
- /* FIXME: we don't actually preserve user flags right now. */
-
- mbox_folder->summary = NULL;
- mbox_folder->search = NULL;
-
- /* now set the name info */
- g_free(mbox_folder->folder_file_path);
- g_free(mbox_folder->folder_dir_path);
- g_free(mbox_folder->index_file_path);
-
- root_dir_path = camel_mbox_store_get_toplevel_dir(CAMEL_MBOX_STORE(folder->parent_store));
-
- real_name = g_basename(folder->full_name);
- mbox_folder->folder_file_path = g_strdup_printf("%s/%s", root_dir_path, real_name);
- mbox_folder->summary_file_path = g_strdup_printf("%s/%s-ev-summary", root_dir_path, real_name);
- mbox_folder->folder_dir_path = g_strdup_printf("%s/%s.sdb", root_dir_path, real_name);
- mbox_folder->index_file_path = g_strdup_printf("%s/%s.ibex", root_dir_path, real_name);
-
- /* if we have no index file, force it */
- forceindex = stat(mbox_folder->index_file_path, &st) == -1;
-
- mbox_folder->index = ibex_open(mbox_folder->index_file_path, O_CREAT | O_RDWR, 0600);
- if (mbox_folder->index == NULL) {
- /* yes, this isn't fatal at all */
- g_warning("Could not open/create index file: %s: indexing not performed", strerror(errno));
- }
-
- /* no summary (disk or memory), and we're proverbially screwed */
- mbox_folder->summary = camel_mbox_summary_new(mbox_folder->summary_file_path,
- mbox_folder->folder_file_path, mbox_folder->index);
- if (mbox_folder->summary == NULL || camel_mbox_summary_load(mbox_folder->summary, forceindex) == -1) {
- camel_exception_set(ex, CAMEL_EXCEPTION_FOLDER_INVALID, /* FIXME: right error code */
- "Could not create summary");
- return;
- }
-}
-
-static void
-mbox_sync(CamelFolder *folder, gboolean expunge, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
-
- if (expunge)
- mbox_expunge(folder, ex);
- else
- camel_mbox_summary_sync(mbox_folder->summary, FALSE, ex);
-
- /* save index */
- if (mbox_folder->index)
- ibex_save(mbox_folder->index);
- if (mbox_folder->summary)
- camel_folder_summary_save(CAMEL_FOLDER_SUMMARY(mbox_folder->summary));
-}
-
-static void
-mbox_expunge(CamelFolder *folder, CamelException *ex)
-{
- CamelMboxFolder *mbox = CAMEL_MBOX_FOLDER(folder);
-
- camel_mbox_summary_sync(mbox->summary, TRUE, ex);
-
- /* TODO: check it actually changed */
- camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", GINT_TO_POINTER(0));
-}
-
-static gint
-mbox_get_message_count(CamelFolder *folder)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
-
- g_return_val_if_fail(mbox_folder->summary != NULL, -1);
-
- return camel_folder_summary_count(CAMEL_FOLDER_SUMMARY(mbox_folder->summary));
-}
-
-static gint
-mbox_get_unread_message_count(CamelFolder *folder)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
- CamelMessageInfo *info;
- GPtrArray *infolist;
- gint i, max, count = 0;
-
- g_return_val_if_fail(mbox_folder->summary != NULL, -1);
-
- max = camel_folder_summary_count(CAMEL_FOLDER_SUMMARY(mbox_folder->summary));
- if (max == -1)
- return -1;
-
- infolist = mbox_get_summary(folder);
-
- for (i = 0; i < infolist->len; i++) {
- info = (CamelMessageInfo *) g_ptr_array_index(infolist, i);
- if (!(info->flags & CAMEL_MESSAGE_SEEN))
- count++;
- }
-
- return count;
-}
-
-/* FIXME: this may need some tweaking for performance? */
-static void
-mbox_append_message(CamelFolder *folder, CamelMimeMessage * message, const CamelMessageInfo * info, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
- CamelStream *output_stream = NULL, *filter_stream = NULL;
- CamelMimeFilter *filter_from = NULL;
- CamelMessageInfo *newinfo;
- struct stat st;
- off_t seek = -1;
- char *xev, last;
- guint32 uid;
- char *fromline = NULL;
-
- if (stat(mbox_folder->folder_file_path, &st) != 0)
- goto fail;
-
- output_stream = camel_stream_fs_new_with_name(mbox_folder->folder_file_path, O_RDWR, 0600);
- if (output_stream == NULL)
- goto fail;
-
- if (st.st_size) {
- seek = camel_seekable_stream_seek((CamelSeekableStream *) output_stream, st.st_size - 1, SEEK_SET);
- if (++seek != st.st_size)
- goto fail;
-
- /* If the mbox doesn't end with a newline, fix that. */
- if (camel_stream_read(output_stream, &last, 1) != 1)
- goto fail;
- if (last != '\n')
- camel_stream_write(output_stream, "\n", 1);
- } else
- seek = 0;
-
- /* assign a new x-evolution header/uid */
- camel_medium_remove_header(CAMEL_MEDIUM(message), "X-Evolution");
- uid = camel_folder_summary_next_uid(CAMEL_FOLDER_SUMMARY(mbox_folder->summary));
- /* important that the header matches exactly 00000000-0000 */
- xev = g_strdup_printf("%08x-%04x", uid, info ? info->flags & 0xFFFF : 0);
- camel_medium_add_header(CAMEL_MEDIUM(message), "X-Evolution", xev);
- g_free(xev);
-
- /* we must write this to the non-filtered stream ... */
- fromline = camel_mbox_summary_build_from(CAMEL_MIME_PART(message)->headers);
- if (camel_stream_write_string(output_stream, fromline) == -1)
- goto fail;
-
- /* and write the content to the filtering stream, that translated '\nFrom' into '\n>From' */
- filter_stream = (CamelStream *) camel_stream_filter_new_with_stream(output_stream);
- filter_from = (CamelMimeFilter *) camel_mime_filter_from_new();
- camel_stream_filter_add((CamelStreamFilter *) filter_stream, filter_from);
- if (camel_data_wrapper_write_to_stream(CAMEL_DATA_WRAPPER(message), filter_stream) == -1)
- goto fail;
-
- if (camel_stream_close(filter_stream) == -1)
- goto fail;
-
- /* filter stream ref's the output stream itself, so we need to unref it too */
- camel_object_unref(CAMEL_OBJECT(filter_from));
- camel_object_unref(CAMEL_OBJECT(filter_stream));
- camel_object_unref(CAMEL_OBJECT(output_stream));
- g_free(fromline);
-
- /* force a summary update - will only update from the new position, if it can */
- if (camel_mbox_summary_update(mbox_folder->summary, seek) == 0) {
- char uidstr[16];
-
- sprintf(uidstr, "%u", uid);
- newinfo = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mbox_folder->summary), uidstr);
-
- if (info && newinfo) {
- CamelFlag *flag = info->user_flags;
- CamelTag *tag = info->user_tags;
-
- while (flag) {
- camel_flag_set(&(newinfo->user_flags), flag->name, TRUE);
- flag = flag->next;
- }
-
- while (tag) {
- camel_tag_set(&(newinfo->user_tags), tag->name, tag->value);
- tag = tag->next;
- }
- }
- camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", GINT_TO_POINTER(0));
- }
-
- return;
-
- fail:
- if (camel_exception_is_set(ex)) {
- camel_exception_setv(ex, camel_exception_get_id(ex),
- "Cannot append message to mbox file: %s", camel_exception_get_description(ex));
- } else {
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "Cannot append message to mbox file: %s", g_strerror(errno));
- }
- if (filter_stream) {
- /*camel_stream_close (filter_stream); */
- camel_object_unref(CAMEL_OBJECT(filter_stream));
- }
- if (output_stream)
- camel_object_unref(CAMEL_OBJECT(output_stream));
-
- if (filter_from)
- camel_object_unref(CAMEL_OBJECT(filter_from));
-
- g_free(fromline);
-
- /* make sure the file isn't munged by us */
- if (seek != -1) {
- int fd = open(mbox_folder->folder_file_path, O_WRONLY, 0600);
-
- if (fd != -1) {
- ftruncate(fd, st.st_size);
- close(fd);
- }
- }
-}
-
-static GPtrArray *
-mbox_get_uids(CamelFolder *folder)
-{
- GPtrArray *array;
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
- int i, count;
-
- count = camel_folder_summary_count(CAMEL_FOLDER_SUMMARY(mbox_folder->summary));
- array = g_ptr_array_new();
- g_ptr_array_set_size(array, count);
- for (i = 0; i < count; i++) {
- CamelMboxMessageInfo *info =
- (CamelMboxMessageInfo *) camel_folder_summary_index(CAMEL_FOLDER_SUMMARY(mbox_folder->summary), i);
-
- array->pdata[i] = g_strdup(info->info.uid);
- }
-
- return array;
-}
-
-static GPtrArray *
-mbox_get_subfolder_names(CamelFolder *folder)
-{
- /* No subfolders. */
- return g_ptr_array_new();
-}
-
-static CamelMimeMessage *
-mbox_get_message(CamelFolder *folder, const gchar * uid, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
- CamelStream *message_stream = NULL;
- CamelMimeMessage *message = NULL;
- CamelMboxMessageInfo *info;
- CamelMimeParser *parser = NULL;
- char *buffer;
- int len;
-
- /* get the message summary info */
- info = (CamelMboxMessageInfo *) camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mbox_folder->summary), uid);
-
- if (info == NULL) {
- errno = ENOENT;
- goto fail;
- }
-
- /* if this has no content, its an error in the library */
- g_assert(info->info.content);
- g_assert(info->frompos != -1);
-
- /* where we read from */
- message_stream = camel_stream_fs_new_with_name(mbox_folder->folder_file_path, O_RDONLY, 0);
- if (message_stream == NULL)
- goto fail;
-
- /* we use a parser to verify the message is correct, and in the correct position */
- parser = camel_mime_parser_new();
- camel_mime_parser_init_with_stream(parser, message_stream);
- camel_object_unref(CAMEL_OBJECT(message_stream));
- camel_mime_parser_scan_from(parser, TRUE);
-
- camel_mime_parser_seek(parser, info->frompos, SEEK_SET);
- if (camel_mime_parser_step(parser, &buffer, &len) != HSCAN_FROM) {
- g_warning("File appears truncated");
- goto fail;
- }
-
- if (camel_mime_parser_tell_start_from(parser) != info->frompos) {
- g_warning("Summary doesn't match the folder contents! eek!\n"
- " expecting offset %ld got %ld", (long int)info->frompos,
- (long int)camel_mime_parser_tell_start_from(parser));
- errno = EINVAL;
- goto fail;
- }
-
- message = camel_mime_message_new();
- if (camel_mime_part_construct_from_parser(CAMEL_MIME_PART(message), parser) == -1) {
- g_warning("Construction failed");
- goto fail;
- }
- camel_object_unref(CAMEL_OBJECT(parser));
-
- return message;
-
- fail:
- camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, "Cannot get message: %s", g_strerror(errno));
-
- if (parser)
- camel_object_unref(CAMEL_OBJECT(parser));
- if (message)
- camel_object_unref(CAMEL_OBJECT(message));
-
- return NULL;
-}
-
-GPtrArray *
-mbox_get_summary(CamelFolder *folder)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
-
- return CAMEL_FOLDER_SUMMARY(mbox_folder->summary)->messages;
-}
-
-/* get a single message info, by uid */
-static const CamelMessageInfo *
-mbox_get_message_info(CamelFolder *folder, const char *uid)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
-
- return camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mbox_folder->summary), uid);
-}
-
-static GPtrArray *
-mbox_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
-
- if (mbox_folder->search == NULL) {
- mbox_folder->search = camel_folder_search_new();
- }
-
- camel_folder_search_set_folder(mbox_folder->search, folder);
- if (mbox_folder->summary) {
- /* FIXME: dont access summary array directly? */
- camel_folder_search_set_summary(mbox_folder->search,
- CAMEL_FOLDER_SUMMARY(mbox_folder->summary)->messages);
- }
-
- camel_folder_search_set_body_index(mbox_folder->search, mbox_folder->index);
-
- return camel_folder_search_execute_expression(mbox_folder->search, expression, ex);
-}
-
-static void
-mbox_search_free(CamelFolder *folder, GPtrArray * result)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
-
- camel_folder_search_free_result(mbox_folder->search, result);
-}
-
-static guint32
-mbox_get_message_flags(CamelFolder *folder, const char *uid)
-{
- CamelMessageInfo *info;
- CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_val_if_fail(info != NULL, 0);
-
- return info->flags;
-}
-
-static void
-mbox_set_message_flags(CamelFolder *folder, const char *uid, guint32 flags, guint32 set)
-{
- CamelMessageInfo *info;
- CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_if_fail(info != NULL);
-
- info->flags = (info->flags & ~flags) | (set & flags) | CAMEL_MESSAGE_FOLDER_FLAGGED;
- camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary));
-
- camel_object_trigger_event(CAMEL_OBJECT(folder), "message_changed", (char *) uid);
-}
-
-static gboolean
-mbox_get_message_user_flag(CamelFolder *folder, const char *uid, const char *name)
-{
- CamelMessageInfo *info;
- CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_val_if_fail(info != NULL, FALSE);
-
- return camel_flag_get(&info->user_flags, name);
-}
-
-static void
-mbox_set_message_user_flag(CamelFolder *folder, const char *uid, const char *name, gboolean value)
-{
- CamelMessageInfo *info;
- CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_if_fail(info != NULL);
-
- camel_flag_set(&info->user_flags, name, value);
- info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
- camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary));
- camel_object_trigger_event(CAMEL_OBJECT(folder), "message_changed", (char *) uid);
-}
-
-static const char *mbox_get_message_user_tag(CamelFolder *folder, const char *uid, const char *name)
-{
- CamelMessageInfo *info;
- CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_val_if_fail(info != NULL, FALSE);
-
- return camel_tag_get(&info->user_tags, name);
-}
-
-static void mbox_set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value)
-{
- CamelMessageInfo *info;
- CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_if_fail(info != NULL);
-
- camel_tag_set(&info->user_tags, name, value);
- info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
- camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary));
- camel_object_trigger_event(CAMEL_OBJECT(folder), "message_changed", (char *) uid);
-}
-
-
diff --git a/camel/providers/mbox/camel-mbox-folder.h b/camel/providers/mbox/camel-mbox-folder.h
deleted file mode 100644
index 7c5558f362..0000000000
--- a/camel/providers/mbox/camel-mbox-folder.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-folder.h : Abstract class for an email folder */
-
-/*
- *
- * Author : Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright (C) 1999 Helix Code .
- *
- * 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 CAMEL_MBOX_FOLDER_H
-#define CAMEL_MBOX_FOLDER_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <camel/camel-folder.h>
-#include <camel/camel-folder-search.h>
-#include <libibex/ibex.h>
-#include "camel-mbox-summary.h"
-
-/* #include "camel-store.h" */
-
-#define CAMEL_MBOX_FOLDER_TYPE (camel_mbox_folder_get_type ())
-#define CAMEL_MBOX_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MBOX_FOLDER_TYPE, CamelMboxFolder))
-#define CAMEL_MBOX_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MBOX_FOLDER_TYPE, CamelMboxFolderClass))
-#define IS_CAMEL_MBOX_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_MBOX_FOLDER_TYPE))
-
-typedef struct {
- CamelFolder parent_object;
-
- gchar *folder_file_path; /* contains the messages */
- gchar *summary_file_path; /* contains the messages summary */
- gchar *folder_dir_path; /* contains the subfolders */
- gchar *index_file_path; /* index of body contents */
-
- ibex *index; /* index for this folder */
- CamelMboxSummary *summary;
- CamelFolderSearch *search; /* used to run searches, we just use the real thing (tm) */
-} CamelMboxFolder;
-
-
-
-typedef struct {
- CamelFolderClass parent_class;
-
- /* Virtual methods */
-
-} CamelMboxFolderClass;
-
-
-/* public methods */
-
-/* Standard Camel function */
-CamelType camel_mbox_folder_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MBOX_FOLDER_H */
diff --git a/camel/providers/mbox/camel-mbox-provider.c b/camel/providers/mbox/camel-mbox-provider.c
deleted file mode 100644
index d4048e1be3..0000000000
--- a/camel/providers/mbox/camel-mbox-provider.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-provider.c: mbox provider registration code */
-
-/*
- * Authors :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright (C) 2000 HelixCode (www.helixcode.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
- */
-
-#include "config.h"
-#include "camel-mbox-store.h"
-#include "camel-provider.h"
-#include "camel-session.h"
-#include "camel-url.h"
-
-static CamelProvider mbox_provider = {
- "mbox",
- "UNIX mbox-format mail files",
-
- "For reading mail delivered by the local system, and for "
- "storing mail on local disk.",
-
- "mail",
-
- CAMEL_PROVIDER_IS_SOURCE | CAMEL_PROVIDER_IS_STORAGE,
-
- { 0, 0 },
-
- NULL
-};
-
-void
-camel_provider_module_init (CamelSession *session)
-{
- mbox_provider.object_types[CAMEL_PROVIDER_STORE] =
- camel_mbox_store_get_type();
-
- mbox_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal);
-
- camel_session_register_provider (session, &mbox_provider);
-}
diff --git a/camel/providers/mbox/camel-mbox-store.c b/camel/providers/mbox/camel-mbox-store.c
deleted file mode 100644
index ed56e84407..0000000000
--- a/camel/providers/mbox/camel-mbox-store.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-store.c : class for an mbox store */
-
-/*
- *
- * Copyright (C) 2000 Helix Code, Inc. <bertrand@helixcode.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
- */
-
-
-#include <config.h>
-
-#include <sys/stat.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "camel-mbox-store.h"
-#include "camel-mbox-folder.h"
-#include "camel-exception.h"
-#include "camel-url.h"
-
-/* Returns the class for a CamelMboxStore */
-#define CMBOXS_CLASS(so) CAMEL_MBOX_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CMBOXF_CLASS(so) CAMEL_MBOX_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static char *get_name (CamelService *service, gboolean brief);
-static CamelFolder *get_folder (CamelStore *store, const char *folder_name,
- gboolean create, CamelException *ex);
-static void delete_folder (CamelStore *store, const char *folder_name,
- CamelException *ex);
-static void rename_folder(CamelStore *store, const char *old_name, const char *new_name, CamelException *ex);
-static char *get_folder_name (CamelStore *store, const char *folder_name,
- CamelException *ex);
-
-static void
-camel_mbox_store_class_init (CamelMboxStoreClass *camel_mbox_store_class)
-{
- CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS (camel_mbox_store_class);
- CamelServiceClass *camel_service_class = CAMEL_SERVICE_CLASS (camel_mbox_store_class);
-
- /* virtual method overload */
- camel_service_class->get_name = get_name;
-
- camel_store_class->get_folder = get_folder;
- camel_store_class->delete_folder = delete_folder;
- camel_store_class->rename_folder = rename_folder;
- camel_store_class->get_folder_name = get_folder_name;
-}
-
-static void
-camel_mbox_store_init (gpointer object, gpointer klass)
-{
- CamelService *service = CAMEL_SERVICE (object);
- CamelStore *store = CAMEL_STORE (object);
-
- service->url_flags = CAMEL_SERVICE_URL_NEED_PATH;
-
- /* mbox names are filenames, so they are case-sensitive. */
- store->folders = g_hash_table_new (g_str_hash, g_str_equal);
-}
-
-CamelType
-camel_mbox_store_get_type (void)
-{
- static CamelType camel_mbox_store_type = CAMEL_INVALID_TYPE;
-
- if (camel_mbox_store_type == CAMEL_INVALID_TYPE) {
- camel_mbox_store_type = camel_type_register (CAMEL_STORE_TYPE, "CamelMboxStore",
- sizeof (CamelMboxStore),
- sizeof (CamelMboxStoreClass),
- (CamelObjectClassInitFunc) camel_mbox_store_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mbox_store_init,
- NULL);
- }
-
- return camel_mbox_store_type;
-}
-
-const gchar *
-camel_mbox_store_get_toplevel_dir (CamelMboxStore *store)
-{
- CamelURL *url = CAMEL_SERVICE (store)->url;
-
- g_assert (url != NULL);
- return url->path;
-}
-
-static CamelFolder *
-get_folder (CamelStore *store, const char *folder_name, gboolean create,
- CamelException *ex)
-{
- CamelFolder *new_folder;
- char *name;
- struct stat st;
-
- name = g_strdup_printf ("%s%s", CAMEL_SERVICE (store)->url->path,
- folder_name);
-
- if (stat (name, &st) == -1) {
- int fd;
-
- if (errno != ENOENT) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not open folder `%s':"
- "\n%s", folder_name,
- g_strerror (errno));
- g_free (name);
- return NULL;
- }
- if (!create) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER,
- "Folder `%s' does not exist.",
- folder_name);
- g_free (name);
- return NULL;
- }
-
- fd = open (name, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
- g_free (name);
- if (fd == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not create folder `%s':"
- "\n%s", folder_name,
- g_strerror (errno));
- return NULL;
- }
- close (fd);
- } else if (!S_ISREG (st.st_mode)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER,
- "`%s' is not a regular file.",
- name);
- g_free (name);
- return NULL;
- } else
- g_free (name);
-
- new_folder = CAMEL_FOLDER (camel_object_new (CAMEL_MBOX_FOLDER_TYPE));
-
- CF_CLASS (new_folder)->init (new_folder, store, NULL,
- folder_name, "/", TRUE, ex);
-
- return new_folder;
-}
-
-static void
-delete_folder (CamelStore *store, const char *folder_name, CamelException *ex)
-{
- char *name, *name2;
- struct stat st;
- int status;
-
- name = g_strdup_printf ("%s%s", CAMEL_SERVICE (store)->url->path, folder_name);
- if (stat (name, &st) == -1) {
- if (errno == ENOENT) {
- /* file doesn't exist - it's kinda like deleting it ;-) */
- g_free (name);
- return;
- }
-
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not delete folder `%s':\n%s",
- folder_name, g_strerror (errno));
- g_free (name);
- return;
- }
-
- if (!S_ISREG (st.st_mode)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER,
- "`%s' is not a regular file.", name);
- g_free (name);
- return;
- }
-
- if (st.st_size != 0) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_NON_EMPTY,
- "Folder `%s' is not empty. Not deleted.",
- folder_name);
- g_free (name);
- return;
- }
-
- /* Delete index and summary first, then the main file. */
- name2 = g_strdup_printf ("%s.ibex", name);
- status = unlink (name2);
- g_free (name2);
- if (status == 0 || errno == ENOENT) {
- name2 = g_strdup_printf ("%s-ev-summary", name);
- status = unlink (name2);
- g_free (name2);
- }
- if (status == 0 || errno == ENOENT)
- status = unlink (name);
- g_free (name);
-
- if (status == -1 && errno != ENOENT) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not delete folder `%s':\n%s",
- folder_name, g_strerror (errno));
- }
-}
-
-static int xrename(const char *oldp, const char *newp, const char *prefix, const char *suffix, CamelException *ex)
-{
- struct stat st;
- char *old = g_strconcat(prefix, oldp, suffix, 0);
- char *new = g_strconcat(prefix, newp, suffix, 0);
- int ret = -1;
-
- printf("renaming %s%s to %s%s\n", oldp, suffix, newp, suffix);
-
- /* FIXME: this has races ... */
- if (!(stat(new, &st) == -1 && errno==ENOENT)) {
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not rename folder %s to %s: destination exists",
- old, new);
- } else if (rename(old, new) == 0 || errno==ENOENT) {
- ret = 0;
- } else if (stat(old, &st) == -1 && errno==ENOENT && stat(new, &st) == 0) {
- /* for nfs, check if the rename worked anyway ... */
- ret = 0;
- }
- printf("success = %d\n", ret);
-
- g_free(old);
- g_free(new);
- return ret;
-}
-
-static void rename_folder(CamelStore *store, const char *old, const char *new, CamelException *ex)
-{
- char *path = CAMEL_SERVICE (store)->url->path;
-
- /* try to rollback failures, has obvious races */
- if (xrename(old, new, path, ".ibex", ex)) {
- return;
- }
- if (xrename(old, new, path, "-ev-summary", ex)) {
- xrename(new, old, path, ".ibex", ex);
- return;
- }
- if (xrename(old, new, path, "", ex)) {
- xrename(new, old, path, "-ev-summary", ex);
- xrename(new, old, path, ".ibex", ex);
- }
-}
-
-static char *
-get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex)
-{
- /* For now, we don't allow hieararchy. FIXME. */
- if (strchr (folder_name + 1, '/')) {
- camel_exception_set (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER,
- "Mbox folders may not be nested.");
- return NULL;
- }
-
- return *folder_name == '/' ? g_strdup (folder_name) :
- g_strdup_printf ("/%s", folder_name);
-}
-
-static char *
-get_name (CamelService *service, gboolean brief)
-{
- if (brief)
- return g_strdup (service->url->path);
- else
- return g_strdup_printf ("Local mail file %s", service->url->path);
-}
diff --git a/camel/providers/mbox/camel-mbox-store.h b/camel/providers/mbox/camel-mbox-store.h
deleted file mode 100644
index 7b298b67f6..0000000000
--- a/camel/providers/mbox/camel-mbox-store.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-store.h : class for an mbox store */
-
-/*
- *
- * Copyright (C) 2000 Helix Code, Inc. <bertrand@helixcode.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 CAMEL_MBOX_STORE_H
-#define CAMEL_MBOX_STORE_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include "camel-store.h"
-
-#define CAMEL_MBOX_STORE_TYPE (camel_mbox_store_get_type ())
-#define CAMEL_MBOX_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MBOX_STORE_TYPE, CamelMboxStore))
-#define CAMEL_MBOX_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MBOX_STORE_TYPE, CamelMboxStoreClass))
-#define IS_CAMEL_MBOX_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_MBOX_STORE_TYPE))
-
-
-typedef struct {
- CamelStore parent_object;
-
-} CamelMboxStore;
-
-
-
-typedef struct {
- CamelStoreClass parent_class;
-
-} CamelMboxStoreClass;
-
-
-/* public methods */
-
-/* Standard Camel function */
-CamelType camel_mbox_store_get_type (void);
-
-const gchar *camel_mbox_store_get_toplevel_dir (CamelMboxStore *store);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MBOX_STORE_H */
-
-
diff --git a/camel/providers/mbox/camel-mbox-summary.c b/camel/providers/mbox/camel-mbox-summary.c
deleted file mode 100644
index 2a297594d7..0000000000
--- a/camel/providers/mbox/camel-mbox-summary.c
+++ /dev/null
@@ -1,872 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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
- */
-
-#include "camel-mbox-summary.h"
-#include <camel/camel-mime-message.h>
-
-#include <sys/stat.h>
-#include <sys/uio.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-
-#define io(x)
-#define d(x)
-
-#define CAMEL_MBOX_SUMMARY_VERSION (0x1000)
-
-struct _CamelMboxSummaryPrivate {
-};
-
-#define _PRIVATE(o) (((CamelMboxSummary *)(o))->priv)
-
-static int summary_header_load (CamelFolderSummary *, FILE *);
-static int summary_header_save (CamelFolderSummary *, FILE *);
-
-static CamelMessageInfo * message_info_new (CamelFolderSummary *, struct _header_raw *);
-static CamelMessageInfo * message_info_new_from_parser (CamelFolderSummary *, CamelMimeParser *);
-static CamelMessageInfo * message_info_load (CamelFolderSummary *, FILE *);
-static int message_info_save (CamelFolderSummary *, FILE *, CamelMessageInfo *);
-/*static void message_info_free (CamelFolderSummary *, CamelMessageInfo *);*/
-
-static void camel_mbox_summary_class_init (CamelMboxSummaryClass *klass);
-static void camel_mbox_summary_init (CamelMboxSummary *obj);
-static void camel_mbox_summary_finalise (CamelObject *obj);
-
-static CamelFolderSummaryClass *camel_mbox_summary_parent;
-
-CamelType
-camel_mbox_summary_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_folder_summary_get_type (), "CamelMboxSummary",
- sizeof (CamelMboxSummary),
- sizeof (CamelMboxSummaryClass),
- (CamelObjectClassInitFunc) camel_mbox_summary_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mbox_summary_init,
- (CamelObjectFinalizeFunc) camel_mbox_summary_finalise);
- }
-
- return type;
-}
-
-static void
-camel_mbox_summary_class_init (CamelMboxSummaryClass *klass)
-{
- CamelFolderSummaryClass *sklass = (CamelFolderSummaryClass *) klass;
-
- camel_mbox_summary_parent = CAMEL_FOLDER_SUMMARY_CLASS(camel_type_get_global_classfuncs (camel_folder_summary_get_type ()));
-
- sklass->summary_header_load = summary_header_load;
- sklass->summary_header_save = summary_header_save;
-
- sklass->message_info_new = message_info_new;
- sklass->message_info_new_from_parser = message_info_new_from_parser;
- sklass->message_info_load = message_info_load;
- sklass->message_info_save = message_info_save;
- /*sklass->message_info_free = message_info_free;*/
-}
-
-static void
-camel_mbox_summary_init (CamelMboxSummary *obj)
-{
- struct _CamelMboxSummaryPrivate *p;
- struct _CamelFolderSummary *s = (CamelFolderSummary *)obj;
-
- p = _PRIVATE(obj) = g_malloc0(sizeof(*p));
-
- /* subclasses need to set the right instance data sizes */
- s->message_info_size = sizeof(CamelMboxMessageInfo);
- s->content_info_size = sizeof(CamelMboxMessageContentInfo);
-
- /* and a unique file version */
- s->version += CAMEL_MBOX_SUMMARY_VERSION;
-}
-
-static void
-camel_mbox_summary_finalise (CamelObject *obj)
-{
- CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY (obj);
-
- g_free (mbs->folder_path);
-}
-
-/**
- * camel_mbox_summary_new:
- *
- * Create a new CamelMboxSummary object.
- *
- * Return value: A new CamelMboxSummary widget.
- **/
-CamelMboxSummary *
-camel_mbox_summary_new (const char *filename, const char *mbox_name, ibex *index)
-{
- CamelMboxSummary *new = CAMEL_MBOX_SUMMARY (camel_object_new (camel_mbox_summary_get_type ()));
-
- if (new) {
- /* ?? */
- camel_folder_summary_set_build_content (CAMEL_FOLDER_SUMMARY (new), TRUE);
- camel_folder_summary_set_filename (CAMEL_FOLDER_SUMMARY (new), filename);
- new->folder_path = g_strdup (mbox_name);
- new->index = index;
- }
- return new;
-}
-
-static int
-summary_header_load (CamelFolderSummary *s, FILE *in)
-{
- CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY (s);
-
- if (((CamelFolderSummaryClass *)camel_mbox_summary_parent)->summary_header_load (s, in) == -1)
- return -1;
-
- return camel_folder_summary_decode_uint32 (in, &mbs->folder_size);
-}
-
-static int
-summary_header_save (CamelFolderSummary *s, FILE *out)
-{
- CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY (s);
-
- if (((CamelFolderSummaryClass *)camel_mbox_summary_parent)->summary_header_save (s, out) == -1)
- return -1;
-
- return camel_folder_summary_encode_uint32 (out, mbs->folder_size);
-}
-
-static int
-header_evolution_decode (const char *in, guint32 *uid, guint32 *flags)
-{
- char *header;
-
- if (in && (header = header_token_decode(in))) {
- if (strlen (header) == strlen ("00000000-0000")
- && sscanf (header, "%08x-%04x", uid, flags) == 2) {
- g_free (header);
- return *uid;
- }
- g_free (header);
- }
-
- return -1;
-}
-
-static char *
-header_evolution_encode (guint32 uid, guint32 flags)
-{
- return g_strdup_printf ("%08x-%04x", uid, flags & 0xffff);
-}
-
-static CamelMessageInfo *
-message_info_new (CamelFolderSummary *s, struct _header_raw *h)
-{
- CamelMessageInfo *mi;
-
- mi = ((CamelFolderSummaryClass *)camel_mbox_summary_parent)->message_info_new (s, h);
- if (mi) {
- const char *xev;
- guint32 uid, flags;
- CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi;
-
- xev = header_raw_find (&h, "X-Evolution", NULL);
- if (xev && header_evolution_decode(xev, &uid, &flags) != -1) {
- g_free (mi->uid);
- mi->uid = g_strdup_printf ("%u", uid);
- mi->flags = flags;
- } else {
- /* to indicate it has no xev header? */
- mi->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED | CAMEL_MESSAGE_FOLDER_NOXEV;
- mi->uid = g_strdup_printf ("%u", camel_folder_summary_next_uid (s));
- }
- mbi->frompos = -1;
- }
-
- return mi;
-}
-
-static CamelMessageInfo *
-message_info_new_from_parser (CamelFolderSummary *s, CamelMimeParser *mp)
-{
- CamelMessageInfo *mi;
- CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY (s);
-
- mi = ((CamelFolderSummaryClass *)camel_mbox_summary_parent)->message_info_new_from_parser (s, mp);
- if (mi) {
- CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi;
-
- mbi->frompos = camel_mime_parser_tell_start_from (mp);
-
- /* do we want to index this message as we add it, as well? */
- if (mbs->index_force
- || (mi->flags & CAMEL_MESSAGE_FOLDER_FLAGGED) != 0
- || !ibex_contains_name(mbs->index, mi->uid)) {
-
- camel_folder_summary_set_index (s, mbs->index);
- } else {
- camel_folder_summary_set_index (s, NULL);
- }
- }
-
- return mi;
-}
-
-static CamelMessageInfo *
-message_info_load (CamelFolderSummary *s, FILE *in)
-{
- CamelMessageInfo *mi;
-
- io (printf ("loading mbox message info\n"));
-
- mi = ((CamelFolderSummaryClass *)camel_mbox_summary_parent)->message_info_load (s, in);
- if (mi) {
- guint32 position;
- CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi;
-
- camel_folder_summary_decode_uint32 (in, &position);
- mbi->frompos = position;
- }
-
- return mi;
-}
-
-static int
-message_info_save (CamelFolderSummary *s, FILE *out, CamelMessageInfo *mi)
-{
- CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi;
-
- io (printf ("saving mbox message info\n"));
-
- ((CamelFolderSummaryClass *)camel_mbox_summary_parent)->message_info_save (s, out, mi);
-
- return camel_folder_summary_encode_uint32 (out, mbi->frompos);
-}
-
-static int
-summary_rebuild (CamelMboxSummary *mbs, off_t offset)
-{
- CamelFolderSummary *s = CAMEL_FOLDER_SUMMARY (mbs);
- CamelMimeParser *mp;
- int fd;
- int ok = 0;
-
- fd = open (mbs->folder_path, O_RDONLY);
- if (fd == -1) {
- printf ("%s failed to open: %s", mbs->folder_path, strerror (errno));
- return -1;
- }
-
- mp = camel_mime_parser_new ();
- camel_mime_parser_init_with_fd (mp, fd);
- camel_mime_parser_scan_from (mp, TRUE);
- camel_mime_parser_seek (mp, offset, SEEK_SET);
-
- if (offset > 0) {
- if (camel_mime_parser_step (mp, NULL, NULL) == HSCAN_FROM) {
- if (camel_mime_parser_tell_start_from (mp) != offset) {
- g_warning ("The next message didn't start where I expected\nbuilding summary from start");
- camel_mime_parser_drop_step (mp);
- offset = 0;
- camel_mime_parser_seek (mp, offset, SEEK_SET);
- camel_folder_summary_clear (CAMEL_FOLDER_SUMMARY (mbs));
- } else {
- camel_mime_parser_unstep (mp);
- }
- } else {
- camel_object_unref (CAMEL_OBJECT (mp));
- /* end of file - no content? */
- return -1;
- }
- }
-
- while (camel_mime_parser_step (mp, NULL, NULL) == HSCAN_FROM) {
- CamelMessageInfo *info;
-
- info = camel_folder_summary_add_from_parser (CAMEL_FOLDER_SUMMARY (mbs), mp);
- if (info == NULL) {
- printf ("Could not build info from file?\n");
- ok = -1;
- break;
- }
-
- g_assert (camel_mime_parser_step (mp, NULL, NULL) == HSCAN_FROM_END);
- }
-
- camel_object_unref (CAMEL_OBJECT (mp));
-
- /* update the file size/mtime in the summary */
- if (ok != -1) {
- struct stat st;
-
- if (stat (mbs->folder_path, &st) == 0) {
- mbs->folder_size = st.st_size;
- s->time = st.st_mtime;
- }
- }
-
- return ok;
-}
-
-int
-camel_mbox_summary_update(CamelMboxSummary *mbs, off_t offset)
-{
- int ret;
-
- mbs->index_force = FALSE;
- ret = summary_rebuild(mbs, offset);
-
-#if 0
-#warning "Saving full summary and index after every summarisation is slow ..."
- if (ret != -1) {
- if (camel_folder_summary_save((CamelFolderSummary *)mbs) == -1)
- g_warning("Could not save summary: %s", strerror(errno));
- if (mbs->index)
- ibex_save(mbs->index);
- }
-#endif
- return ret;
-}
-
-int
-camel_mbox_summary_load(CamelMboxSummary *mbs, int forceindex)
-{
- CamelFolderSummary *s = CAMEL_FOLDER_SUMMARY(mbs);
- struct stat st;
- int ret = 0;
- off_t minstart;
-
- mbs->index_force = forceindex;
-
- /* is the summary out of date? */
- if (stat(mbs->folder_path, &st) == -1) {
- camel_folder_summary_clear(s);
- printf("Cannot summarise folder: '%s': %s\n", mbs->folder_path, strerror(errno));
- return -1;
- }
-
- if (forceindex || camel_folder_summary_load(s) == -1) {
- camel_folder_summary_clear(s);
- ret = summary_rebuild(mbs, 0);
- } else {
- minstart = st.st_size;
-#if 0
- /* find out the first unindexed message ... */
- /* TODO: For this to work, it has to check that the message is
- indexable, and contains content ... maybe it cannot be done
- properly? */
- for (i = 0; i < camel_folder_summary_count(s); i++) {
- CamelMessageInfo *mi = camel_folder_summary_index(s, i);
-
- if (!ibex_contains_name(mbs->index, mi->uid)) {
- minstart = ((CamelMboxMessageInfo *) mi)->frompos;
- printf("Found unindexed message: %s\n", mi->uid);
- break;
- }
- }
-#endif
- /* is the summary uptodate? */
- if (st.st_size == mbs->folder_size && st.st_mtime == s->time) {
- if (minstart < st.st_size) {
- /* FIXME: Only clear the messages and reindex from this point forward */
- camel_folder_summary_clear(s);
- ret = summary_rebuild(mbs, 0);
- }
- } else {
- if (mbs->folder_size < st.st_size) {
- if (minstart < mbs->folder_size) {
- /* FIXME: only make it rebuild as necessary */
- camel_folder_summary_clear(s);
- ret = summary_rebuild(mbs, 0);
- } else {
- ret = summary_rebuild(mbs, mbs->folder_size);
- /* If that fails, it might be because a message was changed
- * rather than appended... so try again from the beginning.
- */
- if (ret == -1) {
- camel_folder_summary_clear(s);
- ret = summary_rebuild(mbs, 0);
- }
- }
- } else {
- camel_folder_summary_clear(s);
- ret = summary_rebuild(mbs, 0);
- }
- }
- }
-
- if (ret != -1) {
- mbs->folder_size = st.st_size;
- s->time = st.st_mtime;
- if (camel_folder_summary_save(s) == -1)
- g_warning("Could not save summary: %s", strerror(errno));
- if (mbs->index)
- ibex_save(mbs->index);
- }
-
- return ret;
-}
-
-static int
-header_write(int fd, struct _header_raw *header, char *xevline)
-{
- struct iovec iv[4];
- int outlen = 0, len;
-
- iv[1].iov_base = ":";
- iv[1].iov_len = 1;
- iv[3].iov_base = "\n";
- iv[3].iov_len = 1;
-
- while (header) {
- if (strcasecmp(header->name, "X-Evolution")) {
- iv[0].iov_base = header->name;
- iv[0].iov_len = strlen(header->name);
- iv[2].iov_base = header->value;
- iv[2].iov_len = strlen(header->value);
-
- do {
- len = writev(fd, iv, 4);
- } while (len == -1 && errno == EINTR);
-
- if (len == -1)
- return -1;
- outlen += len;
- }
- header = header->next;
- }
-
- iv[0].iov_base = "X-Evolution: ";
- iv[0].iov_len = strlen(iv[0].iov_base);
- iv[1].iov_base = xevline;
- iv[1].iov_len = strlen(xevline);
- iv[2].iov_base = "\n\n";
- iv[2].iov_len = 2;
-
- do {
- len = writev(fd, iv, 3);
- } while (len == -1 && errno == EINTR);
-
- if (len == -1)
- return -1;
-
- outlen += 1;
-
- d(printf("Wrote %d bytes of headers\n", outlen));
-
- return outlen;
-}
-
-static int
-copy_block(int fromfd, int tofd, off_t start, size_t bytes)
-{
- char buffer[4096];
- int written = 0;
-
- d(printf("writing %d bytes ... ", bytes));
-
- if (lseek(fromfd, start, SEEK_SET) != start)
- return -1;
-
- while (bytes > 0) {
- int toread, towrite;
-
- toread = bytes;
- if (bytes > 4096)
- toread = 4096;
- else
- toread = bytes;
- do {
- towrite = read(fromfd, buffer, toread);
- } while (towrite == -1 && errno == EINTR);
-
- if (towrite == -1)
- return -1;
-
- /* check for 'end of file' */
- if (towrite == 0) {
- d(printf("end of file?\n"));
- break;
- }
-
- do {
- toread = write(tofd, buffer, towrite);
- } while (toread == -1 && errno == EINTR);
-
- if (toread == -1)
- return -1;
-
- written += toread;
- bytes -= toread;
- }
-
- d(printf("written %d bytes\n", written));
-
- return written;
-}
-
-static char *tz_months[] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
-};
-
-static char *tz_days[] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
-};
-
-/* tries to build a From line, based on message headers */
-char *
-camel_mbox_summary_build_from(struct _header_raw *header)
-{
- GString *out = g_string_new("From ");
- char *ret;
- const char *tmp;
- time_t thetime;
- int offset;
- struct tm tm;
-
- tmp = header_raw_find(&header, "Sender", NULL);
- if (tmp == NULL)
- tmp = header_raw_find(&header, "From", NULL);
- if (tmp != NULL) {
- struct _header_address *addr = header_address_decode(tmp);
-
- tmp = NULL;
- if (addr) {
- if (addr->type == HEADER_ADDRESS_NAME) {
- g_string_append(out, addr->v.addr);
- tmp = "";
- }
- header_address_unref(addr);
- }
- }
- if (tmp == NULL) {
- g_string_append(out, "unknown@nodomain.now.au");
- }
-
- /* try use the received header to get the date */
- tmp = header_raw_find(&header, "Received", NULL);
- if (tmp) {
- tmp = strrchr(tmp, ';');
- if (tmp)
- tmp++;
- }
-
- /* if there isn't one, try the Date field */
- if (tmp == NULL)
- tmp = header_raw_find(&header, "Date", NULL);
-
- thetime = header_decode_date(tmp, &offset);
-
- thetime += ((offset / 100) * (60 * 60)) + (offset % 100) * 60;
-
- /* a pseudo, but still bogus attempt at thread safing the function */
- memcpy(&tm, gmtime(&thetime), sizeof(tm));
-
- g_string_sprintfa(out, " %s %s %d %02d:%02d:%02d %4d\n",
- tz_days[tm.tm_wday],
- tz_months[tm.tm_mon], tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_year + 1900);
-
- ret = out->str;
- g_string_free(out, FALSE);
- return ret;
-}
-
-int
-camel_mbox_summary_sync(CamelMboxSummary *mbs, gboolean expunge, CamelException *ex)
-{
- CamelMimeParser *mp = NULL;
- int i, count;
- CamelMboxMessageInfo *info;
- CamelFolderSummary *s = CAMEL_FOLDER_SUMMARY(mbs);
- int fd = -1, fdout = -1;
- off_t offset = 0;
- char *tmpname = NULL;
- char *buffer, *xevnew = NULL;
- const char *xev;
- int len;
- guint32 uid, flags;
- int quick = TRUE, work = FALSE;
- struct stat st;
- char *fromline;
-
- /* make sure we're in sync */
- count = camel_folder_summary_count (s);
- if (count > 0) {
- CamelMessageInfo *mi = camel_folder_summary_index (s, count - 1);
- camel_mbox_summary_update (mbs, mi->content->endpos);
- } else {
- camel_mbox_summary_update (mbs, 0);
- }
-
- /* check if we have any work to do */
- d(printf ("Performing sync, %d messages in inbox\n", count));
- for (i = 0; quick && i < count; i++) {
- info = (CamelMboxMessageInfo *)camel_folder_summary_index (s, i);
- if ((expunge && (info->info.flags & CAMEL_MESSAGE_DELETED)) ||
- (info->info.flags & CAMEL_MESSAGE_FOLDER_NOXEV))
- quick = FALSE;
- else
- work |= (info->info.flags & CAMEL_MESSAGE_FOLDER_FLAGGED) != 0;
- }
-
- d(printf ("Options: %s %s %s\n", expunge ? "expunge" : "", quick ? "quick" : "", work ? "Work" : ""));
-
- if (quick && !work)
- return 0;
-
- fd = open (mbs->folder_path, O_RDWR);
- if (fd == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not open summary %s", mbs->folder_path);
- return -1;
- }
-
- mp = camel_mime_parser_new ();
- camel_mime_parser_scan_from (mp, TRUE);
- camel_mime_parser_init_with_fd (mp, fd);
-
- if (!quick) {
- tmpname = alloca (strlen (mbs->folder_path) + 5);
- sprintf (tmpname, "%s.tmp", mbs->folder_path);
- d(printf ("Writing tmp file to %s\n", tmpname));
- retry_out:
- fdout = open (tmpname, O_WRONLY | O_CREAT | O_EXCL, 0600);
- if (fdout == -1) {
- if (errno == EEXIST)
- if (unlink(tmpname) != -1)
- goto retry_out;
-
- free (tmpname);
- tmpname = NULL;
- g_warning ("Something failed (yo!)");
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Cannot open temporary mailbox: %s", strerror (errno));
- goto error;
- }
- }
-
- for (i = 0; i < count; i++) {
- off_t frompos, bodypos, lastpos;
- /* This has to be an int, not an off_t, because that's
- * what camel_mime_parser_header returns... FIXME.
- */
- int xevoffset;
-
- info = (CamelMboxMessageInfo *)camel_folder_summary_index(s, i);
-
- g_assert (info);
-
- d(printf ("Looking at message %s\n", info->info.uid));
-
- if (expunge && info->info.flags & CAMEL_MESSAGE_DELETED) {
- d(printf ("Deleting %s\n", info->info.uid));
-
- g_assert (!quick);
- offset -= (info->info.content->endpos - info->frompos);
- if (mbs->index)
- ibex_unindex (mbs->index, info->info.uid);
- camel_folder_summary_remove (s, (CamelMessageInfo *)info);
- count--;
- i--;
- info = NULL;
- } else if (info->info.flags & (CAMEL_MESSAGE_FOLDER_NOXEV | CAMEL_MESSAGE_FOLDER_FLAGGED)) {
- int xevok = FALSE;
-
- d(printf ("Updating header for %s flags = %08x\n", info->info.uid, info->info.flags));
-
- /* find the next message, header parts */
- camel_mime_parser_seek (mp, info->frompos, SEEK_SET);
- if (camel_mime_parser_step (mp, &buffer, &len) != HSCAN_FROM) {
- g_warning ("camel_mime_parser_step failed (1)");
- goto error;
- }
-
- if (camel_mime_parser_tell_start_from (mp) != info->frompos) {
- g_warning ("Summary/mbox mismatch, aborting sync");
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Summary mismatch, aborting sync");
- goto error;
- }
-
- if (camel_mime_parser_step (mp, &buffer, &len) == HSCAN_FROM_END) {
- g_warning ("camel_mime_parser_step failed (2)");
- goto error;
- }
-
- /* Check if the X-Evolution header is valid. */
-
- xev = camel_mime_parser_header (mp, "X-Evolution", &xevoffset);
- if (xev && header_evolution_decode (xev, &uid, &flags) != -1)
- xevok = TRUE;
-
- xevnew = header_evolution_encode (strtoul (info->info.uid, NULL, 10), info->info.flags & 0xffff);
- if (quick) {
- if (!xevok) {
- g_warning ("The summary told me I had an X-Evolution header, but i dont!");
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Summary mismatch, X-Evolution header missing");
- goto error;
- }
- buffer = g_strdup_printf ("X-Evolution: %s", xevnew);
- lastpos = lseek (fd, 0, SEEK_CUR);
- lseek (fd, xevoffset, SEEK_SET);
- do {
- len = write (fd, buffer, strlen (buffer));
- } while (len == -1 && errno == EINTR);
- lseek (fd, lastpos, SEEK_SET);
- g_free (buffer);
- if (len == -1) {
- g_warning ("Yahoo! len == -1");
- goto error;
- }
- } else {
- frompos = lseek (fdout, 0, SEEK_CUR);
- fromline = camel_mbox_summary_build_from (camel_mime_parser_headers_raw (mp));
- write (fdout, fromline, strlen(fromline));
- g_free (fromline);
- if (header_write (fdout, camel_mime_parser_headers_raw (mp), xevnew) == -1) {
- d(printf ("Error writing to tmp mailbox\n"));
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Error writing to temp mailbox: %s",
- strerror (errno));
- goto error;
- }
- bodypos = lseek (fdout, 0, SEEK_CUR);
- d(printf ("pos = %d, endpos = %d, bodypos = %d\n",
- (int) info->info.content->pos,
- (int) info->info.content->endpos,
- (int) info->info.content->bodypos));
- if (copy_block (fd, fdout, info->info.content->bodypos,
- info->info.content->endpos - info->info.content->bodypos) == -1) {
- g_warning ("Cannot copy data to output fd");
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Cannot copy data to output fd: %s",
- strerror (errno));
- goto error;
- }
- info->frompos = frompos;
- offset = bodypos - info->info.content->bodypos;
- }
- info->info.flags &= 0xffff;
- g_free (xevnew);
- xevnew = NULL;
- camel_mime_parser_drop_step (mp);
- camel_mime_parser_drop_step (mp);
- } else {
- if (!quick) {
- if (copy_block (fd, fdout, info->frompos,
- info->info.content->endpos - info->frompos) == -1) {
- g_warning ("Cannot copy data to output fd");
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Cannot copy data to output fd: %s",
- strerror (errno));
- goto error;
- }
- /* update from pos here? */
- info->frompos += offset;
- } else {
- d(printf ("Nothing to do for this message\n"));
- }
- }
- if (!quick && info != NULL && offset != 0) {
- d(printf ("offsetting content: %d\n", (int) offset));
- camel_folder_summary_offset_content (info->info.content, offset);
- d(printf ("pos = %d, endpos = %d, bodypos = %d\n",
- (int) info->info.content->pos,
- (int) info->info.content->endpos,
- (int) info->info.content->bodypos));
- }
- }
-
- d(printf ("Closing folders\n"));
-
- if (close (fd) == -1) {
- g_warning ("Cannot close source folder: %s", strerror (errno));
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not close source folder %s: %s",
- mbs->folder_path, strerror (errno));
- goto error;
- }
-
- if (!quick) {
- if (close (fdout) == -1) {
- g_warning ("Cannot close tmp folder: %s", strerror (errno));
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not close temp folder: %s",
- strerror (errno));
- goto error;
- }
-
- if (rename (tmpname, mbs->folder_path) == -1) {
- g_warning ("Cannot rename folder: %s", strerror (errno));
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not rename folder: %s",
- strerror (errno));
- goto error;
- }
- tmpname = NULL;
-
- if (mbs->index)
- ibex_save (mbs->index);
- }
-
- if (stat (mbs->folder_path, &st) == -1) {
- g_warning ("Hmm... stat(mbs->folder_path, &st) == -1");
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Unknown error: %s",
- strerror (errno));
- goto error;
- }
-
- camel_folder_summary_touch (s);
- s->time = st.st_mtime;
- mbs->folder_size = st.st_size;
- camel_folder_summary_save (s);
-
- camel_object_unref (CAMEL_OBJECT (mp));
-
- return 0;
- error:
- if (fd != -1)
- close (fd);
-
- if (fdout != -1)
- close (fdout);
-
- g_free (xevnew);
-
- if (tmpname)
- unlink (tmpname);
- if (mp)
- camel_object_unref (CAMEL_OBJECT (mp));
-
- return -1;
-}
-
-
-
-
-
diff --git a/camel/providers/mbox/camel-mbox-summary.h b/camel/providers/mbox/camel-mbox-summary.h
deleted file mode 100644
index 2462b72078..0000000000
--- a/camel/providers/mbox/camel-mbox-summary.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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 _CAMEL_MBOX_SUMMARY_H
-#define _CAMEL_MBOX_SUMMARY_H
-
-#include <camel/camel-folder-summary.h>
-#include <camel/camel-exception.h>
-#include <libibex/ibex.h>
-
-#define CAMEL_MBOX_SUMMARY(obj) CAMEL_CHECK_CAST (obj, camel_mbox_summary_get_type (), CamelMboxSummary)
-#define CAMEL_MBOX_SUMMARY_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mbox_summary_get_type (), CamelMboxSummaryClass)
-#define IS_CAMEL_MBOX_SUMMARY(obj) CAMEL_CHECK_TYPE (obj, camel_mbox_summary_get_type ())
-
-typedef struct _CamelMboxSummary CamelMboxSummary;
-typedef struct _CamelMboxSummaryClass CamelMboxSummaryClass;
-
-/* extra summary flags */
-enum {
- CAMEL_MESSAGE_FOLDER_NOXEV = 1<<17,
-};
-
-typedef struct _CamelMboxMessageContentInfo {
- CamelMessageContentInfo info;
-} CamelMboxMessageContentInfo;
-
-typedef struct _CamelMboxMessageInfo {
- CamelMessageInfo info;
-
- off_t frompos;
-} CamelMboxMessageInfo;
-
-struct _CamelMboxSummary {
- CamelFolderSummary parent;
-
- struct _CamelMboxSummaryPrivate *priv;
-
- char *folder_path; /* name of matching folder */
- size_t folder_size; /* size of the mbox file, last sync */
-
- ibex *index;
- int index_force; /* do we force index during creation? */
-};
-
-struct _CamelMboxSummaryClass {
- CamelFolderSummaryClass parent_class;
-};
-
-guint camel_mbox_summary_get_type (void);
-CamelMboxSummary *camel_mbox_summary_new (const char *filename, const char *mbox_name, ibex *index);
-
-/* load/check the summary */
-int camel_mbox_summary_load(CamelMboxSummary *mbs, int forceindex);
-/* incremental update */
-int camel_mbox_summary_update(CamelMboxSummary *mbs, off_t offset);
-/* perform a folder sync or expunge, if needed */
-int camel_mbox_summary_sync (CamelMboxSummary *mbs, gboolean expunge, CamelException *ex);
-/* generate a From line from headers */
-char *camel_mbox_summary_build_from(struct _header_raw *header);
-
-#endif /* ! _CAMEL_MBOX_SUMMARY_H */
-
diff --git a/camel/providers/mbox/libcamelmbox.urls b/camel/providers/mbox/libcamelmbox.urls
deleted file mode 100644
index e021190356..0000000000
--- a/camel/providers/mbox/libcamelmbox.urls
+++ /dev/null
@@ -1 +0,0 @@
-mbox
diff --git a/camel/providers/mh/.cvsignore b/camel/providers/mh/.cvsignore
deleted file mode 100644
index fd6b811c68..0000000000
--- a/camel/providers/mh/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-.deps
-*.lo
-*.la
diff --git a/camel/providers/mh/Makefile.am b/camel/providers/mh/Makefile.am
deleted file mode 100644
index 62f447171b..0000000000
--- a/camel/providers/mh/Makefile.am
+++ /dev/null
@@ -1,39 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-libcamelmhincludedir = $(includedir)/camel
-
-
-providerdir = $(pkglibdir)/camel-providers/$(VERSION)
-
-provider_LTLIBRARIES = libcamelmh.la
-provider_DATA = libcamelmh.urls
-
-INCLUDES = -I.. \
- -I$(srcdir)/.. \
- -I$(top_srcdir)/camel \
- -I$(top_srcdir)/intl \
- -I$(top_srcdir)/libibex \
- -I$(top_srcdir)/e-util \
- -I$(top_srcdir) \
- -I$(includedir) \
- $(GTK_INCLUDEDIR) \
- -DG_LOG_DOMAIN=\"camel-mh-provider\"
-
-libcamelmh_la_SOURCES = \
- camel-mh-folder.c \
- camel-mh-provider.c \
- camel-mh-store.c \
- camel-mh-summary.c
-
-libcamelmhinclude_HEADERS = \
- camel-mh-folder.h \
- camel-mh-store.h \
- camel-mh-summary.h
-
-libcamelmh_la_LDFLAGS = -version-info 0:0:0
-
-libcamelmh_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS)
-#libcamelmh_la_LIBADD = $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS)
-
-EXTRA_DIST = libcamelmh.urls
-
diff --git a/camel/providers/mh/camel-mh-folder.c b/camel/providers/mh/camel-mh-folder.c
deleted file mode 100644
index eae8ce6b00..0000000000
--- a/camel/providers/mh/camel-mh-folder.c
+++ /dev/null
@@ -1,528 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */
-/* camel-mh-folder.c : Abstract class for an email folder */
-
-/*
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright (C) 1999, 2000 Helix Code Inc.
- *
- * 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
- */
-
-#include <config.h>
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <fcntl.h>
-
-#include "camel-mh-folder.h"
-#include "camel-mh-store.h"
-#include "string-utils.h"
-#include "camel-stream-fs.h"
-#include "camel-mh-summary.h"
-#include "camel-data-wrapper.h"
-#include "camel-mime-message.h"
-#include "camel-stream-filter.h"
-#include "camel-mime-filter-from.h"
-#include "camel-exception.h"
-
-#define d(x)
-
-static CamelFolderClass *parent_class = NULL;
-
-/* Returns the class for a CamelMhFolder */
-#define CMHF_CLASS(so) CAMEL_MH_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CMHS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static void mh_init(CamelFolder * folder, CamelStore * parent_store,
- CamelFolder * parent_folder, const gchar * name,
- gchar * separator, gboolean path_begins_with_sep, CamelException * ex);
-
-static void mh_sync(CamelFolder * folder, gboolean expunge, CamelException * ex);
-static gint mh_get_message_count(CamelFolder * folder);
-static gint mh_get_unread_message_count(CamelFolder * folder);
-static void mh_append_message(CamelFolder * folder, CamelMimeMessage * message, const CamelMessageInfo *info, CamelException * ex);
-static GPtrArray *mh_get_uids(CamelFolder * folder);
-static GPtrArray *mh_get_subfolder_names(CamelFolder * folder);
-static GPtrArray *mh_get_summary(CamelFolder * folder);
-static CamelMimeMessage *mh_get_message(CamelFolder * folder, const gchar * uid, CamelException * ex);
-
-static void mh_expunge(CamelFolder * folder, CamelException * ex);
-
-static const CamelMessageInfo *mh_get_message_info(CamelFolder * folder, const char *uid);
-
-static GPtrArray *mh_search_by_expression(CamelFolder * folder, const char *expression, CamelException * ex);
-static void mh_search_free(CamelFolder *folder, GPtrArray *result);
-
-static guint32 mh_get_message_flags(CamelFolder * folder, const char *uid);
-static void mh_set_message_flags(CamelFolder * folder, const char *uid, guint32 flags, guint32 set);
-static gboolean mh_get_message_user_flag(CamelFolder * folder, const char *uid, const char *name);
-static void mh_set_message_user_flag(CamelFolder * folder, const char *uid, const char *name, gboolean value);
-static const char *mh_get_message_user_tag(CamelFolder *folder, const char *uid, const char *name);
-static void mh_set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value);
-
-static void mh_finalize(CamelObject * object);
-
-static void camel_mh_folder_class_init(CamelObjectClass * camel_mh_folder_class)
-{
- CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS(camel_mh_folder_class);
-
- parent_class = CAMEL_FOLDER_CLASS (camel_type_get_global_classfuncs(camel_folder_get_type()));
-
- /* virtual method definition */
-
- /* virtual method overload */
- camel_folder_class->init = mh_init;
- camel_folder_class->sync = mh_sync;
- camel_folder_class->get_message_count = mh_get_message_count;
- camel_folder_class->get_unread_message_count = mh_get_unread_message_count;
- camel_folder_class->append_message = mh_append_message;
- camel_folder_class->get_uids = mh_get_uids;
- camel_folder_class->free_uids = camel_folder_free_deep;
- camel_folder_class->get_subfolder_names = mh_get_subfolder_names;
- camel_folder_class->free_subfolder_names = camel_folder_free_deep;
- camel_folder_class->get_summary = mh_get_summary;
- camel_folder_class->free_summary = camel_folder_free_nop;
- camel_folder_class->expunge = mh_expunge;
-
- camel_folder_class->get_message = mh_get_message;
-
- camel_folder_class->search_by_expression = mh_search_by_expression;
- camel_folder_class->search_free = mh_search_free;
-
- camel_folder_class->get_message_info = mh_get_message_info;
-
- camel_folder_class->get_message_flags = mh_get_message_flags;
- camel_folder_class->set_message_flags = mh_set_message_flags;
- camel_folder_class->get_message_user_flag = mh_get_message_user_flag;
- camel_folder_class->set_message_user_flag = mh_set_message_user_flag;
- camel_folder_class->get_message_user_tag = mh_get_message_user_tag;
- camel_folder_class->set_message_user_tag = mh_set_message_user_tag;
-}
-
-static void mh_finalize(CamelObject * object)
-{
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(object);
-
- g_free(mh_folder->folder_file_path);
- g_free(mh_folder->summary_file_path);
- g_free(mh_folder->folder_dir_path);
- g_free(mh_folder->index_file_path);
-}
-
-CamelType camel_mh_folder_get_type(void)
-{
- static CamelType camel_mh_folder_type = CAMEL_INVALID_TYPE;
-
- if (camel_mh_folder_type == CAMEL_INVALID_TYPE) {
- camel_mh_folder_type = camel_type_register(CAMEL_FOLDER_TYPE, "CamelMhFolder",
- sizeof(CamelMhFolder),
- sizeof(CamelMhFolderClass),
- (CamelObjectClassInitFunc) camel_mh_folder_class_init,
- NULL,
- (CamelObjectInitFunc) NULL,
- (CamelObjectFinalizeFunc) mh_finalize);
- }
-
- return camel_mh_folder_type;
-}
-
-static void
-mh_init(CamelFolder * folder, CamelStore * parent_store,
- CamelFolder * parent_folder, const gchar * name, gchar * separator,
- gboolean path_begins_with_sep, CamelException * ex)
-{
- CamelMhFolder *mh_folder = (CamelMhFolder *) folder;
- const gchar *root_dir_path;
- gchar *real_name;
- int forceindex;
- struct stat st;
-
- /* call parent method */
- parent_class->init(folder, parent_store, parent_folder, name, separator, path_begins_with_sep, ex);
- if (camel_exception_get_id(ex))
- return;
-
- /* we assume that the parent init method checks for the existance of @folder */
- folder->can_hold_messages = TRUE;
- folder->can_hold_folders = TRUE;
- folder->has_summary_capability = TRUE;
- folder->has_search_capability = TRUE;
-
- folder->permanent_flags = CAMEL_MESSAGE_ANSWERED |
- CAMEL_MESSAGE_DELETED |
- CAMEL_MESSAGE_DRAFT | CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_USER;
-
- mh_folder->summary = NULL;
- mh_folder->search = NULL;
-
- /* now set the name info */
- g_free(mh_folder->folder_file_path);
- g_free(mh_folder->folder_dir_path);
- g_free(mh_folder->index_file_path);
-
- root_dir_path = camel_mh_store_get_toplevel_dir(CAMEL_MH_STORE(folder->parent_store));
-
- real_name = g_basename(folder->full_name);
- mh_folder->folder_file_path = g_strdup_printf("%s/%s", root_dir_path, real_name);
- mh_folder->summary_file_path = g_strdup_printf("%s/%s/ev-summary", root_dir_path, real_name);
- mh_folder->folder_dir_path = g_strdup_printf("%s/%s", root_dir_path, real_name);
- mh_folder->index_file_path = g_strdup_printf("%s/%s/ev-index.ibex", root_dir_path, real_name);
-
- /* if we have no index file, force it */
- forceindex = stat(mh_folder->index_file_path, &st) == -1;
-
- mh_folder->index = ibex_open(mh_folder->index_file_path, O_CREAT | O_RDWR, 0600);
- if (mh_folder->index == NULL) {
- /* yes, this isn't fatal at all */
- g_warning("Could not open/create index file: %s: indexing not performed", strerror(errno));
- }
-
- /* no summary (disk or memory), and we're proverbially screwed */
- mh_folder->summary = camel_mh_summary_new(mh_folder->summary_file_path,
- mh_folder->folder_file_path,
- mh_folder->index);
-
- if (camel_mh_summary_load(mh_folder->summary, forceindex) == -1) {
- camel_exception_set(ex, CAMEL_EXCEPTION_FOLDER_INVALID, /* FIXME: right error code */
- "Could not load or create summary");
- return;
- }
-}
-
-static void mh_sync(CamelFolder * folder, gboolean expunge, CamelException * ex)
-{
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder);
-
- if (expunge)
- mh_expunge(folder, ex);
- else
- camel_mh_summary_sync(mh_folder->summary, FALSE, ex);
-
- /* save index */
- if (mh_folder->index)
- ibex_save(mh_folder->index);
- if (mh_folder->summary)
- camel_folder_summary_save(CAMEL_FOLDER_SUMMARY(mh_folder->summary));
-}
-
-static void mh_expunge(CamelFolder * folder, CamelException * ex)
-{
- CamelMhFolder *mh = CAMEL_MH_FOLDER(folder);
-
- camel_mh_summary_sync(mh->summary, TRUE, ex);
-
- /* TODO: check it actually changed */
- camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", GINT_TO_POINTER (0));
-}
-
-static gint mh_get_message_count(CamelFolder * folder)
-{
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder);
-
- g_return_val_if_fail(mh_folder->summary != NULL, -1);
-
- return camel_folder_summary_count(CAMEL_FOLDER_SUMMARY(mh_folder->summary));
-}
-
-static gint mh_get_unread_message_count(CamelFolder * folder)
-{
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder);
- CamelMessageInfo *info;
- GPtrArray *infolist;
- gint i, count = 0;
-
- g_return_val_if_fail(mh_folder->summary != NULL, -1);
-
- infolist = mh_get_summary(folder);
-
- for (i = 0; i < infolist->len; i++) {
- info = (CamelMessageInfo *) g_ptr_array_index(infolist, i);
- if (!(info->flags & CAMEL_MESSAGE_SEEN))
- count++;
- }
-
- return count;
-}
-
-static void mh_append_message(CamelFolder * folder, CamelMimeMessage * message, const CamelMessageInfo *info, CamelException * ex)
-{
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder);
- CamelStream *output_stream = NULL;
- char *name = NULL;
- char *uid = NULL;
- CamelMessageInfo *newinfo;
-
- /* FIXME: probably needs additional locking */
-
- /* keep trying uid's until we find one thats ok */
- do {
- g_free(uid);
- g_free(name);
- uid = camel_folder_summary_next_uid_string((CamelFolderSummary *)mh_folder->summary);
- name = g_strdup_printf("%s/%s", mh_folder->folder_file_path, uid);
- output_stream = camel_stream_fs_new_with_name(name, O_WRONLY|O_CREAT|O_EXCL, 0600);
- } while (output_stream == NULL && errno == EEXIST);
-
- if (output_stream == NULL)
- goto fail;
-
- /* write the message */
- if (camel_data_wrapper_write_to_stream(CAMEL_DATA_WRAPPER(message), output_stream) == -1)
- goto fail;
-
- if (camel_stream_close(output_stream) == -1)
- goto fail;
-
- /* index/summarise the message. Yes this re-reads it, its just simpler */
- camel_mh_summary_add(mh_folder->summary, uid, TRUE);
-
- if (info
- && (newinfo = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mh_folder->summary), uid))) {
- CamelFlag *flag = info->user_flags;
- CamelTag *tag = info->user_tags;
-
- newinfo->flags = info->flags;
- while (flag) {
- camel_flag_set(&newinfo->user_flags, flag->name, TRUE);
- flag = flag->next;
- }
- while (tag) {
- camel_tag_set(&newinfo->user_tags, tag->name, tag->value);
- tag = tag->next;
- }
- }
-
- camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", GPOINTER_TO_INT (0));
- g_free(name);
- g_free(uid);
- return;
-
-fail:
- if (camel_exception_is_set(ex)) {
- camel_exception_setv(ex, camel_exception_get_id(ex),
- "Cannot append message to mh file: %s", camel_exception_get_description(ex));
- } else {
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "Cannot append message to mh file: %s", g_strerror(errno));
- }
- if (output_stream)
- camel_object_unref(CAMEL_OBJECT(output_stream));
- if (name) {
- unlink(name);
- g_free(name);
- }
- g_free(uid);
-}
-
-static GPtrArray *mh_get_uids(CamelFolder * folder)
-{
- GPtrArray *array;
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder);
- int i, count;
-
- count = camel_folder_summary_count(CAMEL_FOLDER_SUMMARY(mh_folder->summary));
- array = g_ptr_array_new();
- g_ptr_array_set_size(array, count);
- for (i = 0; i < count; i++) {
- CamelMessageInfo *info =
- camel_folder_summary_index(CAMEL_FOLDER_SUMMARY(mh_folder->summary), i);
-
- array->pdata[i] = g_strdup(info->uid);
- }
-
- return array;
-}
-
-static GPtrArray *mh_get_subfolder_names(CamelFolder * folder)
-{
- /* FIXME: scan for sub-folders */
- /* No subfolders. */
- return g_ptr_array_new();
-}
-
-static CamelMimeMessage *mh_get_message(CamelFolder * folder, const gchar * uid, CamelException * ex)
-{
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder);
- CamelStream *message_stream = NULL;
- CamelMimeMessage *message = NULL;
- CamelMessageInfo *info;
- char *name;
-
- name = g_strdup_printf("%s/%s", mh_folder->folder_file_path, uid);
-
- /* get the message summary info */
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mh_folder->summary), uid);
-
- if (info == NULL) {
- errno = ENOENT;
- goto fail;
- }
-
- message_stream = camel_stream_fs_new_with_name(name, O_RDONLY, 0);
-
- /* where we read from */
- if (message_stream == NULL)
- goto fail;
-
- message = camel_mime_message_new();
- if (camel_data_wrapper_construct_from_stream(CAMEL_DATA_WRAPPER(message), message_stream) == -1) {
- g_warning("Construction failed");
- errno = EINVAL;
- goto fail;
- }
- camel_object_unref(CAMEL_OBJECT(message_stream));
- g_free(name);
-
- return message;
-
-fail:
- camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, "Cannot get message: %s\n %s",
- name, g_strerror(errno));
-
- if (message_stream)
- camel_object_unref(CAMEL_OBJECT(message_stream));
-
- if (message)
- camel_object_unref(CAMEL_OBJECT(message));
-
- g_free(name);
-
- return NULL;
-}
-
-GPtrArray *mh_get_summary(CamelFolder * folder)
-{
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder);
-
- return CAMEL_FOLDER_SUMMARY(mh_folder->summary)->messages;
-}
-
-/* get a single message info, by uid */
-static const CamelMessageInfo *mh_get_message_info(CamelFolder * folder, const char *uid)
-{
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder);
-
- return camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mh_folder->summary), uid);
-}
-
-static GPtrArray *mh_search_by_expression(CamelFolder * folder, const char *expression, CamelException * ex)
-{
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder);
-
- if (mh_folder->search == NULL) {
- mh_folder->search = camel_folder_search_new();
- }
-
- camel_folder_search_set_folder(mh_folder->search, folder);
- if (mh_folder->summary) {
- /* FIXME: dont access summary array directly? */
- camel_folder_search_set_summary(mh_folder->search,
- CAMEL_FOLDER_SUMMARY(mh_folder->summary)->messages);
- }
-
- camel_folder_search_set_body_index(mh_folder->search, mh_folder->index);
-
- return camel_folder_search_execute_expression(mh_folder->search, expression, ex);
-}
-
-static void mh_search_free(CamelFolder *folder, GPtrArray *result)
-{
- CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder);
-
- camel_folder_search_free_result(mh_folder->search, result);
-}
-
-static guint32 mh_get_message_flags(CamelFolder * folder, const char *uid)
-{
- CamelMessageInfo *info;
- CamelMhFolder *mf = CAMEL_MH_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_val_if_fail(info != NULL, 0);
-
- return info->flags;
-}
-
-static void mh_set_message_flags(CamelFolder * folder, const char *uid, guint32 flags, guint32 set)
-{
- CamelMessageInfo *info;
- CamelMhFolder *mf = CAMEL_MH_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_if_fail(info != NULL);
-
- info->flags = (info->flags & ~flags) | (set & flags) | CAMEL_MESSAGE_FOLDER_FLAGGED;
- camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary));
-
- camel_object_trigger_event (CAMEL_OBJECT(folder), "message_changed", (char *) uid);
-}
-
-static gboolean mh_get_message_user_flag(CamelFolder * folder, const char *uid, const char *name)
-{
- CamelMessageInfo *info;
- CamelMhFolder *mf = CAMEL_MH_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_val_if_fail(info != NULL, FALSE);
-
- return camel_flag_get(&info->user_flags, name);
-}
-
-static void mh_set_message_user_flag(CamelFolder * folder, const char *uid, const char *name, gboolean value)
-{
- CamelMessageInfo *info;
- CamelMhFolder *mf = CAMEL_MH_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_if_fail(info != NULL);
-
- camel_flag_set(&info->user_flags, name, value);
- info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
- camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary));
- camel_object_trigger_event (CAMEL_OBJECT(folder), "message_changed", (char *) uid);
-}
-
-static const char *mh_get_message_user_tag(CamelFolder *folder, const char *uid, const char *name)
-{
- CamelMessageInfo *info;
- CamelMhFolder *mf = CAMEL_MH_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_val_if_fail(info != NULL, FALSE);
-
- return camel_tag_get(&info->user_tags, name);
-}
-
-static void mh_set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value)
-{
- CamelMessageInfo *info;
- CamelMhFolder *mf = CAMEL_MH_FOLDER(folder);
-
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid);
- g_return_if_fail(info != NULL);
-
- camel_tag_set(&info->user_tags, name, value);
- info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
- camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary));
- camel_object_trigger_event(CAMEL_OBJECT(folder), "message_changed", (char *) uid);
-}
diff --git a/camel/providers/mh/camel-mh-folder.h b/camel/providers/mh/camel-mh-folder.h
deleted file mode 100644
index 37ff133c9e..0000000000
--- a/camel/providers/mh/camel-mh-folder.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mh-folder.h : MH folder. */
-
-/*
- *
- * Authors:
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright (C) 1999 Helix Code Inc.
- *
- * 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 CAMEL_MH_FOLDER_H
-#define CAMEL_MH_FOLDER_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus } */
-#include <camel/camel-folder.h>
-#include <camel/camel-folder-search.h>
-#include <libibex/ibex.h>
-#include "camel-mh-summary.h"
-
-#define CAMEL_MH_FOLDER_TYPE (camel_mh_folder_get_type ())
-#define CAMEL_MH_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MH_FOLDER_TYPE, CamelMhFolder))
-#define CAMEL_MH_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MH_FOLDER_TYPE, CamelMhFolderClass))
-#define IS_CAMEL_MH_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_MH_FOLDER_TYPE))
-
-typedef struct {
- CamelFolder parent_object;
-
- gchar *folder_file_path; /* contains the messages */
- gchar *summary_file_path; /* contains the messages summary */
- gchar *folder_dir_path; /* contains the subfolders */
- gchar *index_file_path; /* index of body contents */
-
- ibex *index; /* index for this folder */
- CamelMhSummary *summary;
- CamelFolderSearch *search; /* used to run searches, we just use the real thing (tm) */
-} CamelMhFolder;
-
-typedef struct {
- CamelFolderClass parent_class;
-
- /* Virtual methods */
-
-} CamelMhFolderClass;
-
-/* public methods */
-
-/* Standard Camel function */
-CamelType camel_mh_folder_get_type(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* CAMEL_MH_FOLDER_H */
diff --git a/camel/providers/mh/camel-mh-provider.c b/camel/providers/mh/camel-mh-provider.c
deleted file mode 100644
index 58e97eed30..0000000000
--- a/camel/providers/mh/camel-mh-provider.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-provider.c: mbox provider registration code */
-
-/*
- * Authors :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright (C) 2000 HelixCode (www.helixcode.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
- */
-
-#include "config.h"
-#include "camel-mh-store.h"
-#include "camel-provider.h"
-#include "camel-session.h"
-#include "camel-url.h"
-
-static CamelProvider mh_provider = {
- "mh",
- "UNIX mh-format mail files",
-
- "For reading mail delivered by the local system, and for " "storing mail on local disk.",
-
- "mail",
-
- CAMEL_PROVIDER_IS_STORAGE,
-
- {0, 0},
-
- NULL
-};
-
-void camel_provider_module_init(CamelSession * session)
-{
- mh_provider.object_types[CAMEL_PROVIDER_STORE] = camel_mh_store_get_type();
-
- mh_provider.service_cache = g_hash_table_new(camel_url_hash, camel_url_equal);
-
- camel_session_register_provider(session, &mh_provider);
-}
diff --git a/camel/providers/mh/camel-mh-store.c b/camel/providers/mh/camel-mh-store.c
deleted file mode 100644
index c720cb1c91..0000000000
--- a/camel/providers/mh/camel-mh-store.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-store.c : class for an mbox store */
-
-/*
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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
- */
-
-#include <config.h>
-
-#include <sys/stat.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "camel-mh-store.h"
-#include "camel-mh-folder.h"
-#include "camel-exception.h"
-#include "camel-url.h"
-
-/* Returns the class for a CamelMhStore */
-#define CMHS_CLASS(so) CAMEL_MH_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CMHF_CLASS(so) CAMEL_MH_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static char *get_name(CamelService * service, gboolean brief);
-static CamelFolder *get_folder(CamelStore * store, const char *folder_name, gboolean create, CamelException * ex);
-static void delete_folder(CamelStore * store, const char *folder_name, CamelException * ex);
-static void rename_folder(CamelStore *store, const char *old_name, const char *new_name, CamelException *ex);
-static char *get_folder_name(CamelStore * store, const char *folder_name, CamelException * ex);
-
-static void camel_mh_store_class_init(CamelObjectClass * camel_mh_store_class)
-{
- CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS(camel_mh_store_class);
- CamelServiceClass *camel_service_class = CAMEL_SERVICE_CLASS(camel_mh_store_class);
-
- /* virtual method overload */
- camel_service_class->get_name = get_name;
-
- camel_store_class->get_folder = get_folder;
- camel_store_class->delete_folder = delete_folder;
- camel_store_class->rename_folder = rename_folder;
- camel_store_class->get_folder_name = get_folder_name;
-}
-
-static void camel_mh_store_init(CamelObject * object)
-{
- CamelService *service = CAMEL_SERVICE(object);
- CamelStore *store = CAMEL_STORE(object);
-
- service->url_flags = CAMEL_SERVICE_URL_NEED_PATH;
-
- /* mh names are filenames, so they are case-sensitive. */
- store->folders = g_hash_table_new(g_str_hash, g_str_equal);
-}
-
-CamelType camel_mh_store_get_type(void)
-{
- static CamelType camel_mh_store_type = CAMEL_INVALID_TYPE;
-
- if (camel_mh_store_type == CAMEL_INVALID_TYPE) {
- camel_mh_store_type = camel_type_register(CAMEL_STORE_TYPE, "CamelMhStore",
- sizeof(CamelMhStore),
- sizeof(CamelMhStoreClass),
- (CamelObjectClassInitFunc) camel_mh_store_class_init,
- NULL,
- (CamelObjectInitFunc) camel_mh_store_init,
- NULL);
- }
-
- return camel_mh_store_type;
-}
-
-const gchar *camel_mh_store_get_toplevel_dir(CamelMhStore * store)
-{
- CamelURL *url = CAMEL_SERVICE(store)->url;
-
- g_assert(url != NULL);
- return url->path;
-}
-
-static CamelFolder *get_folder(CamelStore * store, const char *folder_name, gboolean create, CamelException * ex)
-{
- CamelFolder *new_folder = NULL;
- char *name;
- struct stat st;
-
- name = g_strdup_printf("%s%s", CAMEL_SERVICE(store)->url->path, folder_name);
-
- printf("getting folder: %s\n", name);
- if (stat(name, &st) == -1) {
- printf("doesn't exist ...\n");
- if (errno != ENOENT) {
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not open folder `%s':" "\n%s", folder_name, g_strerror(errno));
- goto done;
- }
- if (!create) {
- camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER,
- "Folder `%s' does not exist.", folder_name);
- goto done;
- }
- printf("creating ...\n");
-
- if (mkdir(name, 0700) != 0) {
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not create folder `%s':" "\n%s", folder_name, g_strerror(errno));
- goto done;
- }
- printf("created ok?\n");
-
- } else if (!S_ISDIR(st.st_mode)) {
- camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, "`%s' is not a directory.", name);
- goto done;
- }
-
- new_folder = CAMEL_FOLDER (camel_object_new(CAMEL_MH_FOLDER_TYPE));
-
- CF_CLASS(new_folder)->init(new_folder, store, NULL, folder_name, "/", TRUE, ex);
-done:
- g_free(name);
- return new_folder;
-}
-
-static void delete_folder(CamelStore * store, const char *folder_name, CamelException * ex)
-{
- char *name;
- struct stat st;
- char *str;
-
- name = g_strdup_printf("%s%s", CAMEL_SERVICE(store)->url->path, folder_name);
- if (stat(name, &st) == -1) {
- if (errno != ENOENT)
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not delete folder `%s': %s", folder_name, strerror(errno));
- } else {
- /* this will 'fail' if there are still messages in the directory -
- but only the metadata is lost */
- str = g_strdup_printf("%s/ev-summary", name);
- unlink(str);
- g_free(str);
- str = g_strdup_printf("%s/ev-index.ibex", name);
- unlink(str);
- g_free(str);
- if (rmdir(name) == -1) {
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not delete folder `%s': %s", folder_name, strerror(errno));
- }
- }
- g_free(name);
-}
-
-static void rename_folder (CamelStore *store, const char *old_name, const char *new_name, CamelException *ex)
-{
- char *old, *new;
- struct stat st;
-
- old = g_strdup_printf("%s%s", CAMEL_SERVICE(store)->url->path, old_name);
- new = g_strdup_printf("%s%s", CAMEL_SERVICE(store)->url->path, new_name);
- if (stat(new, &st) == -1 && errno == ENOENT) {
- if (stat(old, &st) == 0 && S_ISDIR(st.st_mode)) {
- if (rename(old, new) != 0) {
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not rename folder `%s': %s", old_name, strerror(errno));
- }
- } else {
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not rename folder `%s': %s", old_name, strerror(errno));
- }
- } else {
- camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not rename folder `%s': %s exists", old_name, new_name);
- }
-}
-
-static char *get_folder_name(CamelStore * store, const char *folder_name, CamelException * ex)
-{
- /* For now, we don't allow hieararchy. FIXME. */
- if (strchr(folder_name + 1, '/')) {
- camel_exception_set(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, "Mh folders may not be nested.");
- return NULL;
- }
-
- return *folder_name == '/' ? g_strdup(folder_name) : g_strdup_printf("/%s", folder_name);
-}
-
-static char *get_name(CamelService * service, gboolean brief)
-{
- if (brief)
- return g_strdup(service->url->path);
- else
- return g_strdup_printf("Local mail file %s", service->url->path);
-}
diff --git a/camel/providers/mh/camel-mh-store.h b/camel/providers/mh/camel-mh-store.h
deleted file mode 100644
index e2e2bbb656..0000000000
--- a/camel/providers/mh/camel-mh-store.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mh-store.h : class for an mh store */
-
-/*
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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 CAMEL_MH_STORE_H
-#define CAMEL_MH_STORE_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus } */
-#include "camel-store.h"
-#define CAMEL_MH_STORE_TYPE (camel_mh_store_get_type ())
-#define CAMEL_MH_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MH_STORE_TYPE, CamelMhStore))
-#define CAMEL_MH_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MH_STORE_TYPE, CamelMhStoreClass))
-#define IS_CAMEL_MH_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_MH_STORE_TYPE))
-
-typedef struct {
- CamelStore parent_object;
-
-} CamelMhStore;
-
-typedef struct {
- CamelStoreClass parent_class;
-
-} CamelMhStoreClass;
-
-/* public methods */
-
-/* Standard Camel function */
-CamelType camel_mh_store_get_type(void);
-
-const gchar *camel_mh_store_get_toplevel_dir(CamelMhStore * store);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* CAMEL_MH_STORE_H */
diff --git a/camel/providers/mh/camel-mh-summary.c b/camel/providers/mh/camel-mh-summary.c
deleted file mode 100644
index dff025b258..0000000000
--- a/camel/providers/mh/camel-mh-summary.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "camel-mh-summary.h"
-#include <camel/camel-mime-message.h>
-
-#include <sys/stat.h>
-#include <sys/uio.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <sys/types.h>
-#include <dirent.h>
-
-#include <ctype.h>
-
-#define d(x)
-
-#define CAMEL_MH_SUMMARY_VERSION (0x2000)
-
-static CamelMessageInfo *message_info_new(CamelFolderSummary *, struct _header_raw *);
-
-static void camel_mh_summary_class_init (CamelMhSummaryClass *class);
-static void camel_mh_summary_init (CamelMhSummary *gspaper);
-static void camel_mh_summary_finalise (CamelObject *obj);
-
-#define _PRIVATE(x) (((CamelMhSummary *)(x))->priv)
-
-struct _CamelMhSummaryPrivate {
- char *current_uid;
-};
-
-static CamelFolderSummaryClass *parent_class;
-
-CamelType
-camel_mh_summary_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register(camel_folder_summary_get_type (), "CamelMhSummary",
- sizeof(CamelMhSummary),
- sizeof(CamelMhSummaryClass),
- (CamelObjectClassInitFunc)camel_mh_summary_class_init,
- NULL,
- (CamelObjectInitFunc)camel_mh_summary_init,
- (CamelObjectFinalizeFunc)camel_mh_summary_finalise);
- }
-
- return type;
-}
-
-static void
-camel_mh_summary_class_init (CamelMhSummaryClass *class)
-{
- CamelFolderSummaryClass *sklass = (CamelFolderSummaryClass *) class;
-
- parent_class = CAMEL_FOLDER_SUMMARY_CLASS (camel_type_get_global_classfuncs(camel_folder_summary_get_type ()));
-
- /* override methods */
- sklass->message_info_new = message_info_new;
-}
-
-static void
-camel_mh_summary_init (CamelMhSummary *o)
-{
- struct _CamelFolderSummary *s = (CamelFolderSummary *) o;
-
- o->priv = g_malloc0(sizeof(*o->priv));
-
- /* set unique file version */
- s->version += CAMEL_MH_SUMMARY_VERSION;
-}
-
-static void
-camel_mh_summary_finalise(CamelObject *obj)
-{
- CamelMhSummary *o = (CamelMhSummary *)obj;
-
- g_free(o->mh_path);
- g_free(o->priv);
-}
-
-/**
- * camel_mh_summary_new:
- *
- * Create a new CamelMhSummary object.
- *
- * Return value: A new #CamelMhSummary object.
- **/
-CamelMhSummary *camel_mh_summary_new (const char *filename, const char *mhdir, ibex *index)
-{
- CamelMhSummary *o = (CamelMhSummary *)camel_object_new(camel_mh_summary_get_type ());
-
- camel_folder_summary_set_build_content((CamelFolderSummary *)o, TRUE);
- camel_folder_summary_set_filename((CamelFolderSummary *)o, filename);
- o->mh_path = g_strdup(mhdir);
- o->index = index;
- return o;
-}
-
-static CamelMessageInfo *message_info_new(CamelFolderSummary * s, struct _header_raw *h)
-{
- CamelMessageInfo *mi;
- CamelMhSummary *mhs = (CamelMhSummary *)s;
-
- mi = ((CamelFolderSummaryClass *) parent_class)->message_info_new(s, h);
- if (mi) {
- /* it only ever indexes 1 message at a time */
- mi->uid = g_strdup(mhs->priv->current_uid);
- }
-
- return mi;
-}
-
-int camel_mh_summary_load(CamelMhSummary * mhs, int forceindex)
-{
- CamelFolderSummary *s = CAMEL_FOLDER_SUMMARY(mhs);
-
- d(printf("loading summary ...\n"));
-
- if (forceindex || camel_folder_summary_load(s) == -1) {
- camel_folder_summary_clear(s);
- }
- return camel_mh_summary_check(mhs, forceindex);
-}
-
-int camel_mh_summary_add(CamelMhSummary * mhs, const char *name, int forceindex)
-{
- char *filename = g_strdup_printf("%s/%s", mhs->mh_path, name);
- int fd;
- CamelMimeParser *mp;
-
- d(printf("summarising: %s\n", name));
-
- fd = open(filename, O_RDONLY);
- if (fd == -1) {
- g_warning("Cannot summarise/index: %s: %s", filename, strerror(errno));
- g_free(filename);
- return -1;
- }
- mp = camel_mime_parser_new();
- camel_mime_parser_scan_from(mp, FALSE);
- camel_mime_parser_init_with_fd(mp, fd);
- if (forceindex || !ibex_contains_name(mhs->index, (char *)name)) {
- d(printf("forcing indexing of message content\n"));
- camel_folder_summary_set_index((CamelFolderSummary *)mhs, mhs->index);
- } else {
- camel_folder_summary_set_index((CamelFolderSummary *)mhs, NULL);
- }
- mhs->priv->current_uid = (char *)name;
- camel_folder_summary_add_from_parser((CamelFolderSummary *)mhs, mp);
- camel_object_unref((CamelObject *)mp);
- mhs->priv->current_uid = NULL;
- camel_folder_summary_set_index((CamelFolderSummary *)mhs, NULL);
- g_free(filename);
- return 0;
-}
-
-static void
-remove_summary(char *key, CamelMessageInfo *info, CamelMhSummary *mhs)
-{
- d(printf("removing message %s from summary\n", key));
- ibex_unindex(mhs->index, info->uid);
- camel_folder_summary_remove((CamelFolderSummary *)mhs, info);
-}
-
-int camel_mh_summary_check(CamelMhSummary * mhs, int forceindex)
-{
- DIR *dir;
- struct dirent *d;
- char *p, c;
- CamelMessageInfo *info;
- GHashTable *left;
- int i, count;
-
- d(printf("checking summary ...\n"));
-
- /* scan the directory, check for mail files not in the index, or index entries that
- no longer exist */
- dir = opendir(mhs->mh_path);
- if (dir == NULL)
- return -1;
-
- /* keeps track of all uid's that have not been processed */
- left = g_hash_table_new(g_str_hash, g_str_equal);
- count = camel_folder_summary_count((CamelFolderSummary *)mhs);
- for (i=0;i<count;i++) {
- info = camel_folder_summary_index((CamelFolderSummary *)mhs, i);
- if (info) {
- g_hash_table_insert(left, info->uid, info);
- }
- }
- while ( (d = readdir(dir)) ) {
- /* FIXME: also run stat to check for regular file */
- p = d->d_name;
- while ( (c = *p++) ) {
- if (!isdigit(c))
- break;
- }
- if (c==0) {
- info = camel_folder_summary_uid((CamelFolderSummary *)mhs, d->d_name);
- if (info == NULL || (!ibex_contains_name(mhs->index, d->d_name))) {
- /* need to add this file to the summary */
- if (info != NULL) {
- g_hash_table_remove(left, info->uid);
- camel_folder_summary_remove((CamelFolderSummary *)mhs, info);
- }
- camel_mh_summary_add(mhs, d->d_name, forceindex);
- } else {
- g_hash_table_remove(left, info->uid);
- }
- }
- }
- closedir(dir);
- g_hash_table_foreach(left, (GHFunc)remove_summary, mhs);
- g_hash_table_destroy(left);
-
- return 0;
-}
-
-/* sync the summary with the ondisk files.
- It doesnt store the state in the file, the summary only, == MUCH faster */
-int camel_mh_summary_sync(CamelMhSummary * mhs, int expunge, CamelException *ex)
-{
- int count, i;
- CamelMessageInfo *info;
- char *name;
-
- printf("summary_sync(expunge=%s)\n", expunge?"true":"false");
-
- if (!expunge)
- return 0;
-
- count = camel_folder_summary_count((CamelFolderSummary *)mhs);
- for (i=count-1;i>=0;i--) {
- info = camel_folder_summary_index((CamelFolderSummary *)mhs, i);
- if (info && info->flags & CAMEL_MESSAGE_DELETED) {
- name = g_strdup_printf("%s/%s", mhs->mh_path, info->uid);
- (printf("deleting %s\n", name));
- if (unlink(name) == 0 || errno==ENOENT) {
- camel_folder_summary_remove((CamelFolderSummary *)mhs, info);
- }
- }
- }
- return 0;
-}
-
diff --git a/camel/providers/mh/camel-mh-summary.h b/camel/providers/mh/camel-mh-summary.h
deleted file mode 100644
index 28376c5d9b..0000000000
--- a/camel/providers/mh/camel-mh-summary.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_MH_SUMMARY_H
-#define _CAMEL_MH_SUMMARY_H
-
-#include <camel/camel-folder-summary.h>
-#include <camel/camel-exception.h>
-#include <libibex/ibex.h>
-
-#define CAMEL_MH_SUMMARY(obj) CAMEL_CHECK_CAST (obj, camel_mh_summary_get_type (), CamelMhSummary)
-#define CAMEL_MH_SUMMARY_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mh_summary_get_type (), CamelMhSummaryClass)
-#define IS_CAMEL_MH_SUMMARY(obj) CAMEL_CHECK_TYPE (obj, camel_mh_summary_get_type ())
-
-typedef struct _CamelMhSummary CamelMhSummary;
-typedef struct _CamelMhSummaryClass CamelMhSummaryClass;
-
-struct _CamelMhSummary {
- CamelFolderSummary parent;
- struct _CamelMhSummaryPrivate *priv;
-
- char *mh_path;
- ibex *index;
-};
-
-struct _CamelMhSummaryClass {
- CamelFolderSummaryClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-CamelType camel_mh_summary_get_type (void);
-CamelMhSummary *camel_mh_summary_new (const char *filename, const char *mhdir, ibex *index);
-
-/* methods */
-int camel_mh_summary_load(CamelMhSummary * mhs, int forceindex);
-int camel_mh_summary_check(CamelMhSummary * mhs, int forceindex);
-int camel_mh_summary_add(CamelMhSummary * mhs, const char *name, int forceindex);
-int camel_mh_summary_sync(CamelMhSummary * mhs, int expunge, CamelException *ex);
-
-#endif /* ! _CAMEL_MH_SUMMARY_H */
-
diff --git a/camel/providers/mh/libcamelmh.urls b/camel/providers/mh/libcamelmh.urls
deleted file mode 100644
index 372daaa98f..0000000000
--- a/camel/providers/mh/libcamelmh.urls
+++ /dev/null
@@ -1 +0,0 @@
-mh
diff --git a/camel/providers/nntp/.cvsignore b/camel/providers/nntp/.cvsignore
deleted file mode 100644
index 1f5b9d35fb..0000000000
--- a/camel/providers/nntp/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-.deps
-*.lo
-*.la
-test-newsrc
diff --git a/camel/providers/nntp/Makefile.am b/camel/providers/nntp/Makefile.am
deleted file mode 100644
index d9122e9026..0000000000
--- a/camel/providers/nntp/Makefile.am
+++ /dev/null
@@ -1,47 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-libcamelnntpincludedir = $(includedir)/camel
-
-providerdir = $(pkglibdir)/camel-providers/$(VERSION)
-
-provider_LTLIBRARIES = libcamelnntp.la
-provider_DATA = libcamelnntp.urls
-
-INCLUDES = -I../.. \
- -I$(top_srcdir)/camel \
- -I$(top_srcdir)/intl \
- -I$(top_srcdir)/libibex \
- -I$(top_srcdir)/e-util \
- -I$(top_srcdir) \
- -I$(includedir) \
- $(GTK_INCLUDEDIR) \
- -DG_LOG_DOMAIN=\"camel-nntp-provider\"
-
-libcamelnntp_la_SOURCES = \
- camel-nntp-folder.c \
- camel-nntp-newsrc.c \
- camel-nntp-provider.c \
- camel-nntp-store.c \
- camel-nntp-utils.c
-
-libcamelnntpinclude_HEADERS = \
- camel-nntp-folder.h \
- camel-nntp-newsrc.h \
- camel-nntp-store.h \
- camel-nntp-utils.h
-
-libcamelnntp_la_LDFLAGS = -version-info 0:0:0
-
-EXTRA_DIST = libcamelnntp.urls
-
-#noinst_PROGRAMS = test-newsrc
-
-#LDADD = \
- #$(top_builddir)/camel/libcamel.la \
- #$(top_builddir)/e-util/libeutil.la \
- #$(top_builddir)/libibex/libibex.la \
- #$(GNOME_LIBDIR) \
- #$(GNOMEUI_LIBS) $(INTLLIBS) $(EXTRA_GNOME_LIBS)
-# $(BONOBO_LIBS)
-
-#test_newsrc_LDADD = libcamelnntp.la $(LDADD)
diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c
deleted file mode 100644
index 091d35e591..0000000000
--- a/camel/providers/nntp/camel-nntp-folder.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-nntp-folder.c : Abstract class for an email folder */
-
-/*
- * Author : Chris Toshok <toshok@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code .
- *
- * 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
- */
-
-
-#include <config.h>
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <fcntl.h>
-
-#include "camel-folder-summary.h"
-#include "camel-nntp-store.h"
-#include "camel-nntp-folder.h"
-#include "camel-nntp-store.h"
-#include "camel-nntp-utils.h"
-
-#include "string-utils.h"
-#include "camel-stream-mem.h"
-#include "camel-stream-buffer.h"
-#include "camel-data-wrapper.h"
-#include "camel-mime-message.h"
-#include "camel-folder-summary.h"
-
-#include "camel-exception.h"
-
-static CamelFolderClass *parent_class=NULL;
-
-/* Returns the class for a CamelNNTPFolder */
-#define CNNTPF_CLASS(so) CAMEL_NNTP_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CNNTPS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-
-static void
-nntp_folder_init (CamelFolder *folder, CamelStore *parent_store,
- CamelFolder *parent_folder, const gchar *name,
- gchar *separator, gboolean path_begins_with_sep,
- CamelException *ex)
-{
- const gchar *root_dir_path;
- CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder);
-
- /* call parent method */
- parent_class->init (folder, parent_store, parent_folder,
- name, separator, path_begins_with_sep,
- ex);
- if (camel_exception_is_set (ex)) return;
-
- /* set flags */
-
- if (!strcmp (name, "/")) {
- /* the root folder is the only folder that has "subfolders" */
- folder->can_hold_folders = TRUE;
- folder->can_hold_messages = FALSE;
- }
- else {
- folder->can_hold_folders = FALSE;
- folder->can_hold_messages = TRUE;
- folder->has_summary_capability = TRUE;
- }
-
- /* XX */
- nntp_folder->group_name = g_strdup (strrchr (name, '/') + 1);
-
-#if 0
- /* get (or create) uid list */
- if (!(nntp_load_uid_list (nntp_folder) > 0))
- nntp_generate_uid_list (nntp_folder);
-#endif
-
- root_dir_path = camel_nntp_store_get_toplevel_dir (CAMEL_NNTP_STORE(folder->parent_store));
-
-
- /* load the summary if we have that ability */
- if (folder->has_summary_capability) {
- nntp_folder->summary_file_path = g_strdup_printf ("%s/%s-ev-summary",
- root_dir_path,
- nntp_folder->group_name);
-
- nntp_folder->summary = camel_folder_summary_new ();
- camel_folder_summary_set_filename (nntp_folder->summary,
- nntp_folder->summary_file_path);
-
- if (-1 == camel_folder_summary_load (nntp_folder->summary)) {
- /* Bad or nonexistant summary file */
- camel_nntp_get_headers (CAMEL_FOLDER( folder )->parent_store,
- nntp_folder, ex);
- if (camel_exception_get_id (ex))
- return;
-
- /* XXX check return value */
- camel_folder_summary_save (nntp_folder->summary);
- }
- }
-
-
-}
-
-static void
-nntp_folder_sync (CamelFolder *folder, gboolean expunge,
- CamelException *ex)
-{
- CamelNNTPStore *store;
-
- camel_folder_summary_save (CAMEL_NNTP_FOLDER(folder)->summary);
-
- store = CAMEL_NNTP_STORE (camel_folder_get_parent_store (folder));
-
- if (store->newsrc)
- camel_nntp_newsrc_write (store->newsrc);
-}
-
-static CamelFolder*
-nntp_folder_get_subfolder (CamelFolder *folder,
- const gchar *folder_name,
- gboolean create,
- CamelException *ex)
-{
- g_assert (0);
- return NULL;
-}
-
-static gint
-nntp_folder_get_message_count (CamelFolder *folder)
-{
- CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER(folder);
-
- g_assert (folder);
- g_assert (nntp_folder->summary);
-
- return camel_folder_summary_count(nntp_folder->summary);
-}
-
-static guint32
-nntp_folder_get_message_flags (CamelFolder *folder, const char *uid)
-{
- CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder);
- CamelMessageInfo *info = camel_folder_summary_uid (nntp_folder->summary, uid);
-
- return info->flags;
-}
-
-static void
-nntp_folder_set_message_flags (CamelFolder *folder, const char *uid,
- guint32 flags, guint32 set)
-{
- CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder);
- CamelMessageInfo *info = camel_folder_summary_uid (nntp_folder->summary, uid);
-
- info->flags = set;
-
- if (set & CAMEL_MESSAGE_SEEN) {
- int article_num;
- CamelNNTPStore *nntp_store = CAMEL_NNTP_STORE (camel_folder_get_parent_store (folder));
-
- sscanf (uid, "%d", &article_num);
-
- camel_nntp_newsrc_mark_article_read (nntp_store->newsrc,
- nntp_folder->group_name,
- article_num);
- }
-
- camel_folder_summary_touch (nntp_folder->summary);
-}
-
-static CamelMimeMessage *
-nntp_folder_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
-{
- CamelStream *nntp_istream;
- CamelStream *message_stream;
- CamelMimeMessage *message = NULL;
- CamelStore *parent_store;
- char *buf;
- int buf_len;
- int buf_alloc;
- int status;
- gboolean done;
- char *message_id;
-
- /* get the parent store */
- parent_store = camel_folder_get_parent_store (folder);
-
- message_id = strchr (uid, ',') + 1;
- status = camel_nntp_command (CAMEL_NNTP_STORE( parent_store ), NULL, "ARTICLE %s", message_id);
-
- nntp_istream = CAMEL_NNTP_STORE (parent_store)->istream;
-
- /* if the message_id was not found, raise an exception and return */
- if (status != CAMEL_NNTP_OK) {
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID_UID,
- "message %s not found.",
- message_id);
- return NULL;
- }
-
- /* XXX ick ick ick. read the entire message into a buffer and
- then create a stream_mem for it. */
- buf_alloc = 2048;
- buf_len = 0;
- buf = g_malloc(buf_alloc);
- done = FALSE;
-
- buf[0] = 0;
-
- while (!done) {
- char *line = camel_stream_buffer_read_line ( CAMEL_STREAM_BUFFER ( nntp_istream ));
- int line_length;
-
- /* XXX check exception */
-
- line_length = strlen ( line );
-
- if (!strcmp(line, ".")) {
- done = TRUE;
- g_free (line);
- }
- else {
- if (buf_len + line_length > buf_alloc) {
- buf_alloc *= 2;
- buf = g_realloc (buf, buf_alloc);
- }
- strcat(buf, line);
- strcat(buf, "\n");
- buf_len += strlen(line) + 1;
- g_free (line);
- }
- }
-
- /* create a stream bound to the message */
- message_stream = camel_stream_mem_new_with_buffer(buf, buf_len);
-
- message = camel_mime_message_new ();
- if (camel_data_wrapper_construct_from_stream ((CamelDataWrapper *)message, message_stream) == -1) {
- camel_object_unref (CAMEL_OBJECT (message));
- camel_object_unref (CAMEL_OBJECT (message_stream));
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID_UID, /* XXX */
- "Could not create message for message_id %s.", message_id);
-
- return NULL;
- }
- camel_object_unref (CAMEL_OBJECT (message_stream));
-
- /* init other fields? */
- camel_object_ref (CAMEL_OBJECT (folder));
-
-#if 0
- gtk_signal_connect (CAMEL_OBJECT (message), "message_changed", message_changed, folder);
-#endif
-
- return message;
-}
-
-static GPtrArray *
-nntp_folder_get_uids (CamelFolder *folder)
-{
- CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder);
- GPtrArray *out;
- CamelMessageInfo *message_info;
- int i;
- int count = camel_folder_summary_count (nntp_folder->summary);
-
- out = g_ptr_array_new ();
- g_ptr_array_set_size (out, count);
-
- for (i = 0; i < count; i++) {
- message_info = camel_folder_summary_index (nntp_folder->summary, i);
- out->pdata[i] = g_strdup (message_info->uid);
- }
-
- return out;
-}
-
-static GPtrArray *
-nntp_folder_get_summary (CamelFolder *folder)
-{
- CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder);
-
- return nntp_folder->summary->messages;
-}
-
-static GPtrArray *
-nntp_folder_get_subfolder_names (CamelFolder *folder)
-{
- if (!strcmp (folder->name, "/")) {
- CamelStore *store = camel_folder_get_parent_store (folder);
-
- if (CAMEL_NNTP_STORE (store)->newsrc) {
- GPtrArray *array = camel_nntp_newsrc_get_subscribed_group_names (CAMEL_NNTP_STORE (store)->newsrc);
- return array;
- }
- }
-
- return NULL;
-}
-
-static void
-nntp_folder_free_subfolder_names (CamelFolder *folder, GPtrArray *subfolders)
-{
- if (subfolders) {
- CamelStore *store = camel_folder_get_parent_store (folder);
- camel_nntp_newsrc_free_group_names (CAMEL_NNTP_STORE (store)->newsrc, subfolders);
- }
-}
-
-static GPtrArray*
-nntp_folder_search_by_expression (CamelFolder *folder, const char *expression, CamelException *ex)
-{
- g_assert (0);
- return NULL;
-}
-
-static const CamelMessageInfo*
-nntp_folder_get_message_info (CamelFolder *folder, const char *uid)
-{
- CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder);
-
- return camel_folder_summary_uid (nntp_folder->summary, uid);
-}
-
-static void
-nntp_folder_finalize (CamelObject *object)
-{
- CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (object);
-
- g_free (nntp_folder->summary_file_path);
-}
-
-static void
-camel_nntp_folder_class_init (CamelNNTPFolderClass *camel_nntp_folder_class)
-{
- CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_nntp_folder_class);
-
- parent_class = CAMEL_FOLDER_CLASS (camel_type_get_global_classfuncs (camel_folder_get_type ()));
-
- /* virtual method definition */
-
- /* virtual method overload */
- camel_folder_class->init = nntp_folder_init;
- camel_folder_class->sync = nntp_folder_sync;
- camel_folder_class->get_subfolder = nntp_folder_get_subfolder;
- camel_folder_class->get_message_count = nntp_folder_get_message_count;
- camel_folder_class->set_message_flags = nntp_folder_set_message_flags;
- camel_folder_class->get_message_flags = nntp_folder_get_message_flags;
- camel_folder_class->get_message = nntp_folder_get_message;
- camel_folder_class->get_uids = nntp_folder_get_uids;
- camel_folder_class->free_uids = camel_folder_free_deep;
- camel_folder_class->get_summary = nntp_folder_get_summary;
- camel_folder_class->free_summary = camel_folder_free_nop;
- camel_folder_class->get_subfolder_names = nntp_folder_get_subfolder_names;
- camel_folder_class->free_subfolder_names = nntp_folder_free_subfolder_names;
- camel_folder_class->search_by_expression = nntp_folder_search_by_expression;
- camel_folder_class->get_message_info = nntp_folder_get_message_info;
-}
-
-CamelType
-camel_nntp_folder_get_type (void)
-{
- static CamelType camel_nntp_folder_type = CAMEL_INVALID_TYPE;
-
- if (camel_nntp_folder_type == CAMEL_INVALID_TYPE) {
- camel_nntp_folder_type = camel_type_register (CAMEL_FOLDER_TYPE, "CamelNNTPFolder",
- sizeof (CamelNNTPFolder),
- sizeof (CamelNNTPFolderClass),
- (CamelObjectClassInitFunc) camel_nntp_folder_class_init,
- NULL,
- (CamelObjectInitFunc) NULL,
- (CamelObjectFinalizeFunc) nntp_folder_finalize);
- }
-
- return camel_nntp_folder_type;
-}
diff --git a/camel/providers/nntp/camel-nntp-folder.h b/camel/providers/nntp/camel-nntp-folder.h
deleted file mode 100644
index 9bbd1466b9..0000000000
--- a/camel/providers/nntp/camel-nntp-folder.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-nntp-folder.h : NNTP group (folder) support. */
-
-/*
- *
- * Author : Chris Toshok <toshok@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code .
- *
- * 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 CAMEL_NNTP_FOLDER_H
-#define CAMEL_NNTP_FOLDER_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include "camel-folder.h"
-
-/* #include "camel-store.h" */
-
-#define CAMEL_NNTP_FOLDER_TYPE (camel_nntp_folder_get_type ())
-#define CAMEL_NNTP_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_NNTP_FOLDER_TYPE, CamelNNTPFolder))
-#define CAMEL_NNTP_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_NNTP_FOLDER_TYPE, CamelNNTPFolderClass))
-#define IS_CAMEL_NNTP_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_NNTP_FOLDER_TYPE))
-
-
-typedef struct {
- CamelFolder parent_object;
-
- gchar *group_name;
- gchar *summary_file_path; /* contains the messages summary */
- CamelFolderSummary *summary;
-} CamelNNTPFolder;
-
-
-
-typedef struct {
- CamelFolderClass parent_class;
-
- /* Virtual methods */
-
-} CamelNNTPFolderClass;
-
-
-/* public methods */
-
-/* Standard Camel function */
-CamelType camel_nntp_folder_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_NNTP_FOLDER_H */
diff --git a/camel/providers/nntp/camel-nntp-newsrc.c b/camel/providers/nntp/camel-nntp-newsrc.c
deleted file mode 100644
index 81594d3dcd..0000000000
--- a/camel/providers/nntp/camel-nntp-newsrc.c
+++ /dev/null
@@ -1,469 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-nntp-newsrc.c - .newsrc parsing/regurgitating code */
-/*
- *
- * Copyright (C) 2000 Helix Code, Inc. <toshok@helixcode.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
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <glib.h>
-#include "camel-nntp-newsrc.h"
-
-typedef struct {
- guint low;
- guint high;
-} ArticleRange;
-
-typedef struct {
- char *name;
- GArray *ranges;
- gboolean subscribed;
-} NewsrcGroup;
-
-struct CamelNNTPNewsrc {
- gchar *filename;
- GHashTable *groups;
- GHashTable *subscribed_groups;
- gboolean dirty;
-} ;
-
-static NewsrcGroup *
-camel_nntp_newsrc_group_add (CamelNNTPNewsrc *newsrc, char *group_name, gboolean subscribed)
-{
- NewsrcGroup *new_group = g_malloc(sizeof(NewsrcGroup));
-
- new_group->name = g_strdup(group_name);
- new_group->subscribed = subscribed;
- new_group->ranges = g_array_new (FALSE, FALSE, sizeof (ArticleRange));
-
- g_hash_table_insert (newsrc->groups, new_group->name, new_group);
- if (subscribed)
- g_hash_table_insert (newsrc->subscribed_groups, new_group->name, new_group);
-
- newsrc->dirty = TRUE;
-
- return new_group;
-}
-
-static long
-camel_nntp_newsrc_group_get_highest_article_read(CamelNNTPNewsrc *newsrc, NewsrcGroup *group)
-{
- if (group->ranges->len == 0)
- return 0;
-
- return g_array_index(group->ranges, ArticleRange, group->ranges->len - 1).high;
-}
-
-static void
-camel_nntp_newsrc_group_mark_range_read(CamelNNTPNewsrc *newsrc, NewsrcGroup *group, long low, long high)
-{
- int i;
-
- if (group->ranges->len == 1
- && g_array_index (group->ranges, ArticleRange, 0).low == 0
- && g_array_index (group->ranges, ArticleRange, 0).high == 0) {
- g_array_index (group->ranges, ArticleRange, 0).low = low;
- g_array_index (group->ranges, ArticleRange, 0).high = high;
-
- newsrc->dirty = TRUE;
- }
- else {
- ArticleRange tmp_range;
-
- for (i = 0; i < group->ranges->len; i ++) {
- guint range_low = g_array_index (group->ranges, ArticleRange, i).low;
- guint range_high = g_array_index (group->ranges, ArticleRange, i).high;
-
- /* if it's already part of a range, return immediately. */
- if (low >= range_low &&
- low <= range_high &&
- high >= range_low &&
- high <= range_high) {
- return;
- }
- /* if we have a new lower bound for this range, set it. */
- else if (low <= range_low
- && high >= range_low
- && high <= range_high) {
- g_array_index (group->ranges, ArticleRange, i).low = low;
- newsrc->dirty = TRUE;
- return;
- }
- /* if we have a new upper bound for this range, set it. */
- else if (high >= range_high
- && low >= range_low
- && low <= range_high) {
- g_array_index (group->ranges, ArticleRange, i).high = high;
- newsrc->dirty = TRUE;
- return;
- }
- /* if we would be inserting another range that
- starts one index higher than an existing
- one, make the upper value of the existing
- range the upper value of the new one. */
- else if (low == range_high + 1) {
- g_array_index (group->ranges, ArticleRange, i).high = high;
- newsrc->dirty = TRUE;
- return;
- }
- /* if we would be inserting another range that
- ends one index lower than an existing one,
- group the existing range by setting its low
- to the new low */
- else if (high == range_low - 1) {
- g_array_index (group->ranges, ArticleRange, i).low = low;
- newsrc->dirty = TRUE;
- return;
- }
- /* if the range lies entirely outside another
- range, doesn't coincide with it's
- endpoints, and has lower values, insert it
- into the middle of the list. */
- else if (low < range_low
- && high < range_low) {
- tmp_range.low = low;
- tmp_range.high = high;
-
- group->ranges = g_array_insert_val (group->ranges, i, tmp_range);
- newsrc->dirty = TRUE;
-
- return;
- }
- }
-
- /* if we made it here, the range needs to go at the end */
- tmp_range.low = low;
- tmp_range.high = high;
- group->ranges = g_array_append_val (group->ranges, tmp_range);
- newsrc->dirty = TRUE;
- }
-}
-
-int
-camel_nntp_newsrc_get_highest_article_read (CamelNNTPNewsrc *newsrc, char *group_name)
-{
- NewsrcGroup *group;
-
- group = g_hash_table_lookup (newsrc->groups, group_name);
-
- return camel_nntp_newsrc_group_get_highest_article_read (newsrc, group);
-}
-
-void
-camel_nntp_newsrc_mark_article_read (CamelNNTPNewsrc *newsrc, char *group_name, int num)
-{
- camel_nntp_newsrc_mark_range_read (newsrc, group_name, num, num);
-}
-
-void
-camel_nntp_newsrc_mark_range_read(CamelNNTPNewsrc *newsrc, char *group_name, long low, long high)
-{
- NewsrcGroup *group;
-
- /* swap them if they're in the wrong order. */
- if (low > high) {
- long tmp;
-
- tmp = high;
- high = low;
- low = tmp;
- }
-
- group = g_hash_table_lookup (newsrc->groups, group_name);
-
- camel_nntp_newsrc_group_mark_range_read (newsrc, group, low, high);
-}
-
-gboolean
-camel_nntp_newsrc_article_is_read (CamelNNTPNewsrc *newsrc, char *group_name, long num)
-{
- int i;
- NewsrcGroup *group;
-
- group = g_hash_table_lookup (newsrc->groups, group_name);
-
- for (i = 0; i < group->ranges->len; i++) {
- if (num >= g_array_index (group->ranges, ArticleRange, i).low &&
- num <= g_array_index (group->ranges, ArticleRange, i).high) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-struct newsrc_ptr_array {
- GPtrArray *ptr_array;
- gboolean subscribed_only;
-};
-
-static void
-get_group_foreach (char *group_name, NewsrcGroup *group, struct newsrc_ptr_array *npa)
-{
- if (group->subscribed || !npa->subscribed_only) {
- g_ptr_array_add (npa->ptr_array, group_name);
- }
-}
-
-GPtrArray *
-camel_nntp_newsrc_get_subscribed_group_names (CamelNNTPNewsrc *newsrc)
-{
- struct newsrc_ptr_array npa;
-
- g_return_val_if_fail (newsrc, NULL);
-
- npa.ptr_array = g_ptr_array_new();
- npa.subscribed_only = TRUE;
-
- g_hash_table_foreach (newsrc->subscribed_groups,
- (GHFunc)get_group_foreach, &npa);
-
- return npa.ptr_array;
-}
-
-GPtrArray *
-camel_nntp_newsrc_get_all_group_names (CamelNNTPNewsrc *newsrc)
-{
- struct newsrc_ptr_array npa;
-
- g_return_val_if_fail (newsrc, NULL);
-
- npa.ptr_array = g_ptr_array_new();
- npa.subscribed_only = FALSE;
-
- g_hash_table_foreach (newsrc->groups,
- (GHFunc)get_group_foreach, &npa);
-
- return npa.ptr_array;
-}
-
-void
-camel_nntp_newsrc_free_group_names (CamelNNTPNewsrc *newsrc, GPtrArray *group_names)
-{
- g_ptr_array_free (group_names, TRUE);
-}
-
-struct newsrc_fp {
- CamelNNTPNewsrc *newsrc;
- FILE *fp;
-};
-
-static void
-camel_nntp_newsrc_write_group_line(gpointer key, NewsrcGroup *group, struct newsrc_fp *newsrc_fp)
-{
- CamelNNTPNewsrc *newsrc;
- FILE *fp;
- int i;
- int line_length = 0;
-
- fp = newsrc_fp->fp;
- newsrc = newsrc_fp->newsrc;
-
- fprintf (fp, "%s%c", group->name, group->subscribed ? ':' : '!');
-
- line_length += strlen(group->name) + 1;
-
- if (group->ranges->len == 1
- && g_array_index (group->ranges, ArticleRange, 0).low == 0
- && g_array_index (group->ranges, ArticleRange, 0).high == 0) {
- fprintf (fp, "\n");
-
- return; /* special case since our parsing code will insert this
- bogus range if there were no read articles. The code
- to add a range is smart enough to remove this one if we
- ever mark an article read, but we still need to deal with
- it if that code doesn't get hit. */
- }
-
- fprintf (fp, " ");
- line_length += 1;
-
- for (i = 0; i < group->ranges->len; i ++) {
- char range_buffer[100];
- guint low = g_array_index (group->ranges, ArticleRange, i).low;
- guint high = g_array_index (group->ranges, ArticleRange, i).high;
-
- if (low == high)
- sprintf(range_buffer, "%d", low);
- else if (low == high - 1)
- sprintf(range_buffer, "%d,%d", low, high);
- else
- sprintf(range_buffer, "%d-%d", low, high);
-
- if (i != group->ranges->len - 1)
- strcat(range_buffer, ",");
-
- /* this constant (991) gives the same line breaking as faried's .newsrc file */
- if (line_length + strlen(range_buffer) > 991 /*XXX*/) {
- char range_buffer2[101];
- int num_to_print = 991 - line_length;
-
- strcpy(range_buffer2, range_buffer);
- range_buffer2[num_to_print] = '!';
- range_buffer2[num_to_print+1] = '\n';
- range_buffer2[num_to_print+2] = '\0';
-
- fprintf (fp, range_buffer2);
-
- fprintf (fp, range_buffer + num_to_print);
-
- line_length = strlen(range_buffer) - num_to_print;
- }
- else {
- fprintf (fp, range_buffer);
- line_length += strlen(range_buffer);
- }
- }
-
- fprintf (fp, "\n");
-}
-
-void
-camel_nntp_newsrc_write_to_file(CamelNNTPNewsrc *newsrc, FILE *fp)
-{
- struct newsrc_fp newsrc_fp;
-
- g_return_if_fail (newsrc);
-
- newsrc_fp.newsrc = newsrc;
- newsrc_fp.fp = fp;
-
- g_hash_table_foreach (newsrc->groups,
- (GHFunc)camel_nntp_newsrc_write_group_line,
- &newsrc_fp);
-}
-
-void
-camel_nntp_newsrc_write(CamelNNTPNewsrc *newsrc)
-{
- FILE *fp;
-
- g_return_if_fail (newsrc);
-
- if (!newsrc->dirty)
- return;
-
- if ((fp = fopen(newsrc->filename, "w")) == NULL) {
- g_warning ("Couldn't open newsrc file '%s'.\n", newsrc->filename);
- return;
- }
-
- camel_nntp_newsrc_write_to_file(newsrc, fp);
-
- fclose(fp);
-}
-
-static void
-camel_nntp_newsrc_parse_line(CamelNNTPNewsrc *newsrc, char *line)
-{
- char *p, sep, *comma, *dash;
- gboolean is_subscribed;
- NewsrcGroup *group;
-
- p = strchr(line, ':');
-
- if (p) {
- is_subscribed = TRUE;
- }
- else {
- p = strchr(line, '!');
- if (p)
- is_subscribed = FALSE;
- else
- return; /* bogus line. */
- }
-
- sep = *p;
- *p = '\0';
-
- group = camel_nntp_newsrc_group_add (newsrc, line, is_subscribed);
-
- *p = sep;
-
- p++;
-
- do {
- guint high, low;
-
- comma = strchr(p, ',');
-
- if (comma)
- *comma = '\0';
-
- dash = strchr(p, '-');
-
- if (!dash) { /* there wasn't a dash. must be just one number */
- high = low = atol(p);
- }
- else { /* there was a dash. */
- *dash = '\0';
- low = atol(p);
- *dash = '-';
- p = dash + 1;
- high = atol(p);
- }
-
- camel_nntp_newsrc_group_mark_range_read (newsrc, group, low, high);
-
- if (comma) {
- *comma = ',';
- p = comma + 1;
- }
-
- } while(comma);
-}
-
-#define MAX_LINE_LENGTH 1500
-#define BUFFER_LENGTH (20 * MAX_LINE_LENGTH)
-
-CamelNNTPNewsrc *
-camel_nntp_newsrc_read_for_server (const char *server)
-{
- FILE *fp;
- char buf[BUFFER_LENGTH];
- CamelNNTPNewsrc *newsrc = g_new0(CamelNNTPNewsrc, 1);
-
- newsrc->filename = g_strdup_printf ("%s/.newsrc-%s", g_get_home_dir(), server);
- newsrc->groups = g_hash_table_new (g_str_hash, g_str_equal);
- newsrc->subscribed_groups = g_hash_table_new (g_str_hash, g_str_equal);
-
- if ((fp = fopen(newsrc->filename, "r")) == NULL) {
- g_free (newsrc->filename);
- g_free (newsrc);
- return NULL;
- }
-
- while (fgets(buf, MAX_LINE_LENGTH, fp) != NULL) {
- /* we silently ignore (and lose!) lines longer than 20 * 1500 chars.
- Too bad for them. */
- while(strlen(buf) < sizeof(buf)
- && buf[strlen(buf) - 2] == '!') {
- fgets(&buf[strlen(buf) - 2], MAX_LINE_LENGTH, fp);
- }
-
- camel_nntp_newsrc_parse_line(newsrc, buf);
- }
-
- fclose(fp);
-
- return newsrc;
-}
diff --git a/camel/providers/nntp/camel-nntp-newsrc.h b/camel/providers/nntp/camel-nntp-newsrc.h
deleted file mode 100644
index 3f4be6de8d..0000000000
--- a/camel/providers/nntp/camel-nntp-newsrc.h
+++ /dev/null
@@ -1,27 +0,0 @@
-
-#ifndef _CAMEL_NNTP_NEWSRC_H_
-#define _CAMEL_NNTP_NEWSRC_H_
-
-#include <stdio.h>
-#include "glib.h"
-
-typedef struct CamelNNTPNewsrc CamelNNTPNewsrc;
-
-int camel_nntp_newsrc_get_highest_article_read (CamelNNTPNewsrc *newsrc, char *group_name);
-void camel_nntp_newsrc_mark_article_read (CamelNNTPNewsrc *newsrc,
- char *group_name, int num);
-void camel_nntp_newsrc_mark_range_read (CamelNNTPNewsrc *newsrc,
- char *group_name, long low, long high);
-
-gboolean camel_nntp_newsrc_article_is_read (CamelNNTPNewsrc *newsrc,
- char *group_name, long num);
-
-GPtrArray *camel_nntp_newsrc_get_subscribed_group_names (CamelNNTPNewsrc *newsrc);
-GPtrArray *camel_nntp_newsrc_get_all_group_names (CamelNNTPNewsrc *newsrc);
-void camel_nntp_newsrc_free_group_names (CamelNNTPNewsrc *newsrc, GPtrArray *group_names);
-
-void camel_nntp_newsrc_write_to_file (CamelNNTPNewsrc *newsrc, FILE *fp);
-void camel_nntp_newsrc_write (CamelNNTPNewsrc *newsrc);
-CamelNNTPNewsrc *camel_nntp_newsrc_read_for_server (const char *server);
-
-#endif /* _CAMEL_NNTP_NEWSRC_H_ */
diff --git a/camel/providers/nntp/camel-nntp-provider.c b/camel/providers/nntp/camel-nntp-provider.c
deleted file mode 100644
index 214fd4b0fa..0000000000
--- a/camel/providers/nntp/camel-nntp-provider.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-nntp-provider.c: nntp provider registration code */
-
-/*
- * Authors :
- * Chris Toshok <toshok@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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
- */
-
-#include "config.h"
-#include "camel-nntp-store.h"
-#include "camel-provider.h"
-#include "camel-session.h"
-
-static CamelProvider news_provider = {
- "news",
- "USENET news",
-
- "This is a read-only provider for USENET newsgroups.",
-
- "news",
-
- CAMEL_PROVIDER_IS_REMOTE | CAMEL_PROVIDER_IS_STORAGE,
-
- { 0, 0 },
-
- NULL
-};
-
-static CamelProvider nntp_provider = {
- "nntp",
- "USENET news via NNTP",
-
- "This is a provider for reading from and posting to"
- "USENET newsgroups.",
-
- "news",
-
- CAMEL_PROVIDER_IS_REMOTE,
-
- { 0, 0 },
-
- NULL
-};
-
-void
-camel_provider_module_init (CamelSession *session)
-{
- news_provider.object_types[CAMEL_PROVIDER_STORE] =
- camel_nntp_store_get_type();
-#ifdef NOTYET
- nntp_provider.object_types[CAMEL_PROVIDER_TRANSPORT] =
- camel_nntp_transport_get_type();
-#endif
-
- news_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal);
- nntp_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal);
-
- camel_session_register_provider (session, &news_provider);
- camel_session_register_provider (session, &nntp_provider);
-}
-
-
-
diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c
deleted file mode 100644
index 74952015a4..0000000000
--- a/camel/providers/nntp/camel-nntp-store.c
+++ /dev/null
@@ -1,513 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-nntp-store.c : class for an nntp store */
-
-/*
- *
- * Copyright (C) 2000 Helix Code, Inc. <toshok@helixcode.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
- */
-
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "libgnome/libgnome.h"
-
-#include "camel-folder-summary.h"
-#include "camel-nntp-store.h"
-#include "camel-nntp-folder.h"
-#include "camel-stream-buffer.h"
-#include "camel-stream-fs.h"
-#include "camel-exception.h"
-#include "camel-url.h"
-#include "string-utils.h"
-
-#define NNTP_PORT 119
-
-static CamelServiceClass *service_class = NULL;
-
-/* Returns the class for a CamelNNTPStore */
-#define CNNTPS_CLASS(so) CAMEL_NNTP_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-#define CNNTPF_CLASS(so) CAMEL_NNTP_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
-
-static gboolean ensure_news_dir_exists (CamelNNTPStore *store);
-
-static gboolean
-nntp_store_connect (CamelService *service, CamelException *ex)
-{
- struct hostent *h;
- struct sockaddr_in sin;
- int fd;
- char *buf;
- CamelNNTPStore *store = CAMEL_NNTP_STORE (service);
-
- if (!ensure_news_dir_exists(store)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not open directory for news server: %s",
- strerror (errno));
- return FALSE;
- }
-
- if (!service_class->connect (service, ex))
- return FALSE;
-
- h = camel_service_gethost (service, ex);
- if (!h)
- return FALSE;
-
- sin.sin_family = h->h_addrtype;
- sin.sin_port = htons (service->url->port ? service->url->port : NNTP_PORT);
- memcpy (&sin.sin_addr, h->h_addr, sizeof (sin.sin_addr));
-
- fd = socket (h->h_addrtype, SOCK_STREAM, 0);
- if (fd == -1 ||
- connect (fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not connect to %s (port %s): %s",
- service->url->host, service->url->port,
- strerror(errno));
- if (fd > -1)
- close (fd);
- return FALSE;
- }
-
- store->ostream = camel_stream_fs_new_with_fd (fd);
- store->istream = camel_stream_buffer_new (store->ostream,
- CAMEL_STREAM_BUFFER_READ);
-
- /* Read the greeting */
- buf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream));
- if (!buf) {
- return -1;
- }
-
- g_free (buf);
-
- /* get a list of extensions that the server supports */
- if (CAMEL_NNTP_OK == camel_nntp_command (store, NULL, "LIST EXTENSIONS")) {
- char *ext_response = camel_nntp_command_get_additional_data(store);
-
- g_free (ext_response);
- }
-
- return TRUE;
-}
-
-static gboolean
-nntp_store_disconnect (CamelService *service, CamelException *ex)
-{
- CamelNNTPStore *store = CAMEL_NNTP_STORE (service);
-
- if (!service->connected)
- return TRUE;
-
- camel_nntp_command (store, NULL, "QUIT");
-
- if (store->newsrc)
- camel_nntp_newsrc_write (store->newsrc);
-
- if (!service_class->disconnect (service, ex))
- return FALSE;
-
- camel_object_unref (CAMEL_OBJECT (store->ostream));
- camel_object_unref (CAMEL_OBJECT (store->istream));
- store->ostream = NULL;
- store->istream = NULL;
- return TRUE;
-}
-
-static char *
-nntp_store_get_name (CamelService *service, gboolean brief)
-{
- /* Same info for long and brief... */
- return g_strdup_printf ("USENET news via %s", service->url->host);
-}
-
-static CamelFolder *
-nntp_store_get_folder (CamelStore *store, const gchar *folder_name,
- gboolean get_folder, CamelException *ex)
-{
- CamelNNTPFolder *new_nntp_folder;
- CamelFolder *new_folder;
- CamelNNTPStore *nntp_store = CAMEL_NNTP_STORE (store);
-
- /* if we haven't already read our .newsrc, read it now */
- if (!nntp_store->newsrc)
- nntp_store->newsrc =
- camel_nntp_newsrc_read_for_server (CAMEL_SERVICE(store)->url->host);
-
- /* check if folder has already been created */
- /* call the standard routine for that when */
- /* it is done ... */
-
- new_nntp_folder = CAMEL_NNTP_FOLDER (camel_object_new (CAMEL_NNTP_FOLDER_TYPE));
- new_folder = CAMEL_FOLDER (new_nntp_folder);
-
- /* XXX We shouldn't be passing NULL here, but it's equivalent to
- * what was there before, and there's no
- * CamelNNTPFolder::get_subfolder yet anyway...
- */
- CF_CLASS (new_folder)->init (new_folder, store, NULL,
- folder_name, ".", FALSE, ex);
-
- return new_folder;
-}
-
-static char *
-nntp_store_get_folder_name (CamelStore *store, const char *folder_name,
- CamelException *ex)
-{
- return g_strdup (folder_name);
-}
-
-static void
-finalize (CamelObject *object)
-{
- CamelException ex;
-
- camel_exception_init (&ex);
- nntp_store_disconnect (CAMEL_SERVICE (object), &ex);
- camel_exception_clear (&ex);
-}
-
-static void
-camel_nntp_store_class_init (CamelNNTPStoreClass *camel_nntp_store_class)
-{
- CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS (camel_nntp_store_class);
- CamelServiceClass *camel_service_class = CAMEL_SERVICE_CLASS (camel_nntp_store_class);
-
- service_class = CAMEL_SERVICE_CLASS (camel_type_get_global_classfuncs (camel_service_get_type ()));
-
- /* virtual method overload */
- camel_service_class->connect = nntp_store_connect;
- camel_service_class->disconnect = nntp_store_disconnect;
- camel_service_class->get_name = nntp_store_get_name;
-
- camel_store_class->get_folder = nntp_store_get_folder;
- camel_store_class->get_folder_name = nntp_store_get_folder_name;
-}
-
-
-
-static void
-camel_nntp_store_init (gpointer object, gpointer klass)
-{
- CamelService *service = CAMEL_SERVICE (object);
-
- service->url_flags = CAMEL_SERVICE_URL_NEED_HOST;
-}
-
-CamelType
-camel_nntp_store_get_type (void)
-{
- static CamelType camel_nntp_store_type = CAMEL_INVALID_TYPE;
-
- if (camel_nntp_store_type == CAMEL_INVALID_TYPE) {
- camel_nntp_store_type = camel_type_register (CAMEL_STORE_TYPE, "CamelNNTPStore",
- sizeof (CamelNNTPStore),
- sizeof (CamelNNTPStoreClass),
- (CamelObjectClassInitFunc) camel_nntp_store_class_init,
- NULL,
- (CamelObjectInitFunc) camel_nntp_store_init,
- (CamelObjectFinalizeFunc) finalize);
- }
-
- return camel_nntp_store_type;
-}
-
-
-/**
- * camel_nntp_command: Send a command to a NNTP server.
- * @store: the NNTP store
- * @ret: a pointer to return the full server response in
- * @fmt: a printf-style format string, followed by arguments
- *
- * This command sends the command specified by @fmt and the following
- * arguments to the connected NNTP store specified by @store. It then
- * reads the server's response and parses out the status code. If
- * the caller passed a non-NULL pointer for @ret, camel_nntp_command
- * will set it to point to an buffer containing the rest of the
- * response from the NNTP server. (If @ret was passed but there was
- * no extended response, @ret will be set to NULL.) The caller must
- * free this buffer when it is done with it.
- *
- * Return value: one of CAMEL_NNTP_OK (command executed successfully),
- * CAMEL_NNTP_ERR (command encounted an error), or CAMEL_NNTP_FAIL
- * (a protocol-level error occurred, and Camel is uncertain of the
- * result of the command.)
- **/
-int
-camel_nntp_command (CamelNNTPStore *store, char **ret, char *fmt, ...)
-{
- char *cmdbuf, *respbuf;
- va_list ap;
- int status;
- int resp_code;
- CamelException *ex;
-
- va_start (ap, fmt);
- cmdbuf = g_strdup_vprintf (fmt, ap);
- va_end (ap);
-
- ex = camel_exception_new();
-
- /* make sure we're connected */
- if (store->ostream == NULL)
- nntp_store_connect (CAMEL_SERVICE (store), ex);
-
- if (camel_exception_get_id (ex)) {
- camel_exception_free (ex);
- return CAMEL_NNTP_FAIL;
- }
-
- /* Send the command */
- camel_stream_write (store->ostream, cmdbuf, strlen (cmdbuf));
- g_free (cmdbuf);
- camel_stream_write (store->ostream, "\r\n", 2);
-
- /* Read the response */
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream));
-
- if (!respbuf) {
- if (ret)
- *ret = g_strdup (g_strerror (errno));
- return CAMEL_NNTP_FAIL;
- }
-
- resp_code = atoi (respbuf);
-
- if (resp_code < 400)
- status = CAMEL_NNTP_OK;
- else if (resp_code < 500)
- status = CAMEL_NNTP_ERR;
- else
- status = CAMEL_NNTP_FAIL;
-
- if (ret) {
- *ret = strchr (respbuf, ' ');
- if (*ret)
- *ret = g_strdup (*ret + 1);
- }
- g_free (respbuf);
-
- return status;
-}
-
-/**
- * camel_nntp_command_get_additional_data: get "additional data" from
- * a NNTP command.
- * @store: the NNTP store
- *
- * This command gets the additional data returned by
- * This command gets the additional data returned by "multi-line" POP
- * commands, such as LIST, RETR, TOP, and UIDL. This command _must_
- * be called after a successful (CAMEL_NNTP_OK) call to
- * camel_nntp_command for a command that has a multi-line response.
- * The returned data is un-byte-stuffed, and has lines termined by
- * newlines rather than CR/LF pairs.
- *
- * Return value: the data, which the caller must free.
- **/
-char *
-camel_nntp_command_get_additional_data (CamelNNTPStore *store)
-{
- CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream);
- GPtrArray *data;
- char *buf;
- int i, status = CAMEL_NNTP_OK;
-
- data = g_ptr_array_new ();
- while (1) {
- buf = camel_stream_buffer_read_line (stream);
- if (!buf) {
- status = CAMEL_NNTP_FAIL;
- break;
- }
-
- if (!strcmp (buf, "."))
- break;
- if (*buf == '.')
- memmove (buf, buf + 1, strlen (buf));
- g_ptr_array_add (data, buf);
- }
-
- if (status == CAMEL_NNTP_OK) {
- /* Append an empty string to the end of the array
- * so when we g_strjoinv it, we get a "\n" after
- * the last real line.
- */
- g_ptr_array_add (data, "");
- g_ptr_array_add (data, NULL);
- buf = g_strjoinv ("\n", (char **)data->pdata);
- } else
- buf = NULL;
-
- for (i = 0; i < data->len - 2; i++)
- g_free (data->pdata[i]);
- g_ptr_array_free (data, TRUE);
-
- return buf;
-}
-
-void
-camel_nntp_store_subscribe_group (CamelStore *store,
- const gchar *group_name)
-{
- gchar *root_dir = camel_nntp_store_get_toplevel_dir(CAMEL_NNTP_STORE(store));
- char *ret = NULL;
- CamelException *ex = camel_exception_new();
-
- if (camel_exception_get_id (ex)) {
- g_free (root_dir);
- camel_exception_free (ex);
- return;
- }
-
- if (CAMEL_NNTP_OK == camel_nntp_command ( CAMEL_NNTP_STORE (store),
- &ret, "GROUP %s", group_name)) {
- /* we create an empty summary file here, so that when
- the group is opened we'll know we need to build it. */
- gchar *summary_file;
- int fd;
- summary_file = g_strdup_printf ("%s/%s-ev-summary", root_dir, group_name);
-
- fd = open (summary_file, O_CREAT | O_RDWR, 0666);
- close (fd);
-
- g_free (summary_file);
- }
- if (ret) g_free (ret);
-
- g_free (root_dir);
- camel_exception_free (ex);
-}
-
-void
-camel_nntp_store_unsubscribe_group (CamelStore *store,
- const gchar *group_name)
-{
- gchar *root_dir = camel_nntp_store_get_toplevel_dir(CAMEL_NNTP_STORE(store));
- gchar *summary_file;
-
- summary_file = g_strdup_printf ("%s/%s-ev-summary", root_dir, group_name);
- if (g_file_exists (summary_file))
- unlink (summary_file);
- g_free (summary_file);
-
- g_free (root_dir);
-}
-
-GList *
-camel_nntp_store_list_subscribed_groups(CamelStore *store)
-{
- GList *group_name_list = NULL;
- struct stat stat_buf;
- gint stat_error = 0;
- gchar *entry_name;
- gchar *full_entry_name;
- gchar *real_group_name;
- struct dirent *dir_entry;
- DIR *dir_handle;
- gchar *root_dir = camel_nntp_store_get_toplevel_dir(CAMEL_NNTP_STORE(store));
-
- dir_handle = opendir (root_dir);
- g_return_val_if_fail (dir_handle, NULL);
-
- /* read the first entry in the directory */
- dir_entry = readdir (dir_handle);
- while ((stat_error != -1) && (dir_entry != NULL)) {
-
- /* get the name of the next entry in the dir */
- entry_name = dir_entry->d_name;
- full_entry_name = g_strdup_printf ("%s/%s", root_dir, entry_name);
- stat_error = stat (full_entry_name, &stat_buf);
- g_free (full_entry_name);
-
- /* is it a normal file ending in -ev-summary ? */
- if ((stat_error != -1) && S_ISREG (stat_buf.st_mode)) {
- gboolean summary_suffix_found;
-
- real_group_name = string_prefix (entry_name, "-ev-summary",
- &summary_suffix_found);
-
- if (summary_suffix_found)
- /* add the folder name to the list */
- group_name_list = g_list_append (group_name_list,
- real_group_name);
- }
- /* read next entry */
- dir_entry = readdir (dir_handle);
- }
-
- closedir (dir_handle);
-
- return group_name_list;
-}
-
-gchar *
-camel_nntp_store_get_toplevel_dir (CamelNNTPStore *store)
-{
- CamelURL *url = CAMEL_SERVICE (store)->url;
- char *top_dir;
-
- g_assert(url != NULL);
-
- top_dir = g_strdup_printf( "%s/evolution/news/%s",
- g_get_home_dir (),
- url->host );
-
- return top_dir;
-}
-
-static gboolean
-ensure_news_dir_exists (CamelNNTPStore *store)
-{
- gchar *dir = camel_nntp_store_get_toplevel_dir (store);
- struct stat sb;
- int rv;
-
- rv = stat (dir, &sb);
- if (-1 == rv && errno != ENOENT) {
- g_free (dir);
- return FALSE;
- }
-
- if (S_ISDIR (sb.st_mode)) {
- g_free (dir);
- return TRUE;
- }
- else {
- rv = mkdir (dir, 0777);
- g_free (dir);
-
- if (-1 == rv)
- return FALSE;
- else
- return TRUE;
- }
-}
diff --git a/camel/providers/nntp/camel-nntp-store.h b/camel/providers/nntp/camel-nntp-store.h
deleted file mode 100644
index 3099f84962..0000000000
--- a/camel/providers/nntp/camel-nntp-store.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-nntp-store.h : class for an nntp store */
-
-/*
- *
- * Copyright (C) 2000 Helix Code, Inc. <toshok@helixcode.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 CAMEL_NNTP_STORE_H
-#define CAMEL_NNTP_STORE_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include "camel-store.h"
-#include "camel-nntp-newsrc.h"
-
-#define CAMEL_NNTP_STORE_TYPE (camel_nntp_store_get_type ())
-#define CAMEL_NNTP_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_NNTP_STORE_TYPE, CamelNNTPStore))
-#define CAMEL_NNTP_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_NNTP_STORE_TYPE, CamelNNTPStoreClass))
-#define IS_CAMEL_NNTP_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_NNTP_STORE_TYPE))
-
-
-typedef struct {
- CamelStore parent_object;
-
-#define CAMEL_NNTP_EXT_XOVER 0x01
- guint32 extensions;
-
- CamelNNTPNewsrc *newsrc;
-
- CamelStream *istream, *ostream;
-} CamelNNTPStore;
-
-
-
-typedef struct {
- CamelStoreClass parent_class;
-
-} CamelNNTPStoreClass;
-
-
-/* public methods */
-void camel_nntp_store_open (CamelNNTPStore *store, CamelException *ex);
-void camel_nntp_store_close (CamelNNTPStore *store, gboolean expunge,
- CamelException *ex);
-
-void camel_nntp_store_subscribe_group (CamelStore *store, const gchar *group_name);
-void camel_nntp_store_unsubscribe_group (CamelStore *store, const gchar *group_name);
-GList *camel_nntp_store_list_subscribed_groups(CamelStore *store);
-
-gchar *camel_nntp_store_get_toplevel_dir (CamelNNTPStore *store);
-
-/* support functions */
-enum { CAMEL_NNTP_OK, CAMEL_NNTP_ERR, CAMEL_NNTP_FAIL };
-int camel_nntp_command (CamelNNTPStore *store, char **ret, char *fmt, ...);
-char *camel_nntp_command_get_additional_data (CamelNNTPStore *store);
-
-/* Standard Camel function */
-CamelType camel_nntp_store_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_NNTP_STORE_H */
-
-
diff --git a/camel/providers/nntp/camel-nntp-utils.c b/camel/providers/nntp/camel-nntp-utils.c
deleted file mode 100644
index e0a331f2a7..0000000000
--- a/camel/providers/nntp/camel-nntp-utils.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-nntp-utils.c : utilities used by the nntp code. */
-
-/*
- * Author : Chris Toshok <toshok@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code .
- *
- * 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
- */
-
-#include "camel-folder-summary.h"
-#include "camel-nntp-folder.h"
-#include "camel-nntp-store.h"
-#include "camel-nntp-utils.h"
-#include "camel-stream-buffer.h"
-#include "camel-stream-mem.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-static void
-get_XOVER_headers(CamelNNTPStore *nntp_store, CamelFolder *folder,
- int first_message, int last_message, CamelException *ex)
-{
- int status;
- CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder);
-
- status = camel_nntp_command (nntp_store, NULL,
- "XOVER %d-%d",
- first_message,
- last_message);
-
- if (status == CAMEL_NNTP_OK) {
- CamelStream *nntp_istream = nntp_store->istream;
- gboolean done = FALSE;
-
- while (!done) {
- char *line;
-
- line = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER ( nntp_istream ));
-
- if (*line == '.') {
- done = TRUE;
- }
- else {
- CamelMessageInfo *new_info = g_new0(CamelMessageInfo, 1);
- char **split_line = g_strsplit (line, "\t", 7);
-
- new_info->subject = g_strdup(split_line[1]);
- new_info->from = g_strdup(split_line[2]);
- new_info->to = g_strdup(nntp_folder->group_name);
- new_info->date_sent = header_decode_date(split_line[3], NULL);
-#if 0
- /* XXX do we need to fill in both dates? */
- new_info->headers.date_received = g_strdup(split_line[3]);
-#endif
- new_info->size = atoi(split_line[5]);
- new_info->uid = g_strdup_printf ("%s,%s", split_line[0], split_line[4]);
- new_info->message_id = g_strdup(split_line[4]);
- g_strfreev (split_line);
-
- if (camel_nntp_newsrc_article_is_read (nntp_store->newsrc,
- nntp_folder->group_name,
- atoi (split_line[0])))
- new_info->flags |= CAMEL_MESSAGE_SEEN;
-
- camel_folder_summary_add (nntp_folder->summary, new_info);
- }
- g_free (line);
- }
- }
-}
-
-#if 0
-static GArray*
-get_HEAD_headers(CamelNNTPStore *nntp_store, CamelFolder *folder,
- int first_message, int last_message, CamelException *ex)
-{
- int i;
- int status;
-
- for (i = first_message; i < last_message; i ++) {
- status = camel_nntp_command (nntp_store, NULL,
- "HEAD %d", i);
-
- if (status == CAMEL_NNTP_OK) {
- gboolean done = FALSE;
- char *buf;
- int buf_len;
- int buf_alloc;
- int h;
- CamelStream *header_stream;
- GArray *header_array;
- CamelStream *nntp_istream;
- CamelMessageInfo *new_info = g_new0(CamelMessageInfo, 1);
-
- buf_alloc = 2048;
- buf_len = 0;
- buf = g_malloc(buf_alloc);
- done = FALSE;
-
- buf[0] = 0;
-
- nntp_istream = nntp_store->istream;
-
- while (!done) {
- char *line;
- int line_length;
-
- line = camel_stream_buffer_read_line (
- CAMEL_STREAM_BUFFER ( nntp_istream ));
- line_length = strlen ( line );
-
- if (*line == '.') {
- done = TRUE;
- }
- else {
- if (buf_len + line_length > buf_alloc) {
- buf_alloc *= 2;
- buf = g_realloc (buf, buf_alloc);
- }
- strcat(buf, line);
- strcat(buf, "\n");
- buf_len += strlen(line);
- g_free (line);
- }
- }
-
- /* create a stream from which to parse the headers */
- header_stream = camel_stream_mem_new_with_buffer(buf,
- buf_len,
- CAMEL_STREAM_MEM_READ);
-
- header_array = get_header_array_from_stream (header_stream);
-
- memset (&info, 0, sizeof(info));
-
- for (h = 0; h < header_array->len; h ++) {
- Rfc822Header *header = &((Rfc822Header*)header_array->data)[h];
- if (!g_strcasecmp(header->name, "From"))
- new_info->from = g_strdup(header->value);
- else if (!g_strcasecmp(header->name, "To"))
- new_info->to = g_strdup(header->value);
- else if (!g_strcasecmp(header->name, "Subject"))
- new_info->subject = g_strdup(header->value);
- else if (!g_strcasecmp(header->name, "Message-ID")) {
- new_info->uid = g_strdup_printf("%d,%s", i, header->value);
- new_info->message_id = g_strdup(header->value);
- }
- else if (!g_strcasecmp(header->name, "Date")) {
- new_info->date_sent = header_decode_date (header->value);
-#if 0
- new_info->date_sent = g_strdup(header->value);
- new_info->date_received = g_strdup(header->value);
-#endif
- }
- }
-
- camel_folder_summary_add (nntp_folder->summary, new_info);
- }
- else if (status == CAMEL_NNTP_FAIL) {
- /* nasty things are afoot */
- g_warning ("failure doing HEAD\n");
- break;
- }
- }
-}
-#endif
-
-void
-camel_nntp_get_headers (CamelStore *store,
- CamelNNTPFolder *nntp_folder,
- CamelException *ex)
-{
- CamelNNTPStore *nntp_store = CAMEL_NNTP_STORE (store);
- CamelFolder *folder = CAMEL_FOLDER (nntp_folder);
- char *ret;
- int first_message, nb_message, last_message;
- int status;
-
- status = camel_nntp_command (nntp_store, &ret,
- "GROUP %s", CAMEL_NNTP_FOLDER (folder)->group_name);
-
- sscanf (ret, "%d %d %d", &nb_message, &first_message, &last_message);
- g_free (ret);
-
- if (status != CAMEL_NNTP_OK) {
- /* XXX throw invalid group exception */
- printf ("invalid group\n");
- return;
- }
-
-#if 0
- if (nntp_store->extensions & CAMEL_NNTP_EXT_XOVER) {
-#endif
- get_XOVER_headers (nntp_store, folder, first_message, last_message, ex);
-#if 0
- }
- else {
- get_HEAD_headers (nntp_store, folder, first_message, last_message, ex);
- }
-#endif
-}
-
diff --git a/camel/providers/nntp/camel-nntp-utils.h b/camel/providers/nntp/camel-nntp-utils.h
deleted file mode 100644
index f28697c744..0000000000
--- a/camel/providers/nntp/camel-nntp-utils.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-nntp-utils.h : Utilities for the NNTP provider */
-
-/*
- *
- * Author : Chris Toshok <toshok@helixcode.com>
- *
- * Copyright (C) 1999 Helix Code .
- *
- * 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 CAMEL_NNTP_UTILS_H
-#define CAMEL_NNTP_UTILS_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-void camel_nntp_get_headers (CamelStore *store, CamelNNTPFolder *nntp_folder, CamelException *ex);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_NNTP_UTILS_H */
diff --git a/camel/providers/nntp/libcamelnntp.urls b/camel/providers/nntp/libcamelnntp.urls
deleted file mode 100644
index dee2e70f14..0000000000
--- a/camel/providers/nntp/libcamelnntp.urls
+++ /dev/null
@@ -1,2 +0,0 @@
-news
-nntp
diff --git a/camel/providers/nntp/test-newsrc.c b/camel/providers/nntp/test-newsrc.c
deleted file mode 100644
index c4b985e565..0000000000
--- a/camel/providers/nntp/test-newsrc.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-#include <glib.h>
-#include "camel-nntp-newsrc.h"
-
-int
-main(int argc, char *argv[])
-{
- CamelNNTPNewsrc *newsrc = camel_nntp_newsrc_read_for_server (argv[1]);
- camel_nntp_newsrc_write_to_file (newsrc, stdout);
-}
diff --git a/camel/providers/pop3/.cvsignore b/camel/providers/pop3/.cvsignore
deleted file mode 100644
index 7d926a5545..0000000000
--- a/camel/providers/pop3/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-Makefile
-Makefile.in
-.libs
-.deps
-*.lo
-*.la
diff --git a/camel/providers/pop3/Makefile.am b/camel/providers/pop3/Makefile.am
deleted file mode 100644
index ffa62561be..0000000000
--- a/camel/providers/pop3/Makefile.am
+++ /dev/null
@@ -1,33 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-libcamelpop3includedir = $(includedir)/camel
-
-providerdir = $(pkglibdir)/camel-providers/$(VERSION)
-
-provider_LTLIBRARIES = libcamelpop3.la
-provider_DATA = libcamelpop3.urls
-
-INCLUDES = \
- -I.. \
- -I$(srcdir)/.. \
- -I$(srcdir)/../../.. \
- -I$(includedir) \
- -I$(top_srcdir)/intl \
- $(GTK_INCLUDEDIR) \
- -I$(top_srcdir)/camel \
- $(KRB4_CFLAGS) \
- -DG_LOG_DOMAIN=\"camel-pop3-provider\"
-
-libcamelpop3_la_SOURCES = \
- camel-pop3-folder.c \
- camel-pop3-provider.c \
- camel-pop3-store.c
-
-libcamelpop3include_HEADERS = \
- camel-pop3-folder.h \
- camel-pop3-store.h
-
-
-libcamelpop3_la_LDFLAGS = $(KRB4_LDFLAGS) -version-info 0:0:0
-
-EXTRA_DIST = libcamelpop3.urls
diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c
deleted file mode 100644
index 6dbba64c20..0000000000
--- a/camel/providers/pop3/camel-pop3-folder.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-pop3-folder.c : class for a pop3 folder */
-
-/*
- * Authors:
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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
- */
-
-#include "camel-pop3-folder.h"
-#include "camel-pop3-store.h"
-#include "camel-exception.h"
-#include "camel-stream-mem.h"
-#include "camel-stream-filter.h"
-#include "camel-mime-message.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#define CF_CLASS(o) (CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(o)))
-static CamelFolderClass *parent_class;
-
-static void pop3_finalize (CamelObject *object);
-
-static void pop3_sync (CamelFolder *folder, gboolean expunge,
- CamelException *ex);
-
-static gint pop3_get_message_count (CamelFolder *folder);
-static GPtrArray *pop3_get_uids (CamelFolder *folder);
-static CamelMimeMessage *pop3_get_message (CamelFolder *folder,
- const char *uid,
- CamelException *ex);
-static void pop3_set_message_flags (CamelFolder *folder, const char *uid,
- guint32 flags, guint32 set);
-
-static GPtrArray *parse_listing (int count, char *data);
-
-static void
-camel_pop3_folder_class_init (CamelPop3FolderClass *camel_pop3_folder_class)
-{
- CamelFolderClass *camel_folder_class =
- CAMEL_FOLDER_CLASS (camel_pop3_folder_class);
-
- parent_class = CAMEL_FOLDER_CLASS(camel_type_get_global_classfuncs (camel_folder_get_type ()));
-
- /* virtual method overload */
- camel_folder_class->sync = pop3_sync;
-
- camel_folder_class->get_message_count = pop3_get_message_count;
- camel_folder_class->get_uids = pop3_get_uids;
- camel_folder_class->free_uids = camel_folder_free_nop;
-
- camel_folder_class->get_message = pop3_get_message;
- camel_folder_class->set_message_flags = pop3_set_message_flags;
-}
-
-static void
-camel_pop3_folder_init (gpointer object)
-{
- CamelFolder *folder = CAMEL_FOLDER (object);
-
- folder->can_hold_messages = TRUE;
- folder->can_hold_folders = FALSE;
- folder->has_summary_capability = FALSE;
- folder->has_search_capability = FALSE;
-}
-
-CamelType
-camel_pop3_folder_get_type (void)
-{
- static CamelType camel_pop3_folder_type = CAMEL_INVALID_TYPE;
-
- if (!camel_pop3_folder_type) {
- camel_pop3_folder_type = camel_type_register (CAMEL_FOLDER_TYPE, "CamelPop3Folder",
- sizeof (CamelPop3Folder),
- sizeof (CamelPop3FolderClass),
- (CamelObjectClassInitFunc) camel_pop3_folder_class_init,
- NULL,
- (CamelObjectInitFunc) camel_pop3_folder_init,
- (CamelObjectFinalizeFunc) pop3_finalize);
- }
-
- return camel_pop3_folder_type;
-}
-
-void
-pop3_finalize (CamelObject *object)
-{
- CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (object);
-
- camel_folder_free_deep (NULL, pop3_folder->uids);
- g_free (pop3_folder->flags);
-}
-
-CamelFolder *
-camel_pop3_folder_new (CamelStore *parent, CamelException *ex)
-{
- CamelPop3Store *pop3_store = CAMEL_POP3_STORE (parent);
- CamelPop3Folder *pop3_folder;
- GPtrArray *uids;
- int status, count;
- char *data;
-
- status = camel_pop3_command (pop3_store, &data, "STAT");
- if (status != CAMEL_POP3_OK) {
- CamelService *service = CAMEL_SERVICE (parent);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not get message count from POP "
- "server %s: %s.", service->url->host,
- data ? data : "Unknown error");
- g_free (data);
- return NULL;
- }
-
- count = atoi (data);
- g_free (data);
-
- if (pop3_store->supports_uidl != FALSE) {
- status = camel_pop3_command (pop3_store, NULL, "UIDL");
- if (status != CAMEL_POP3_OK)
- pop3_store->supports_uidl = FALSE;
- }
-
- if (pop3_store->supports_uidl == FALSE) {
- int i;
-
- uids = g_ptr_array_new ();
- g_ptr_array_set_size (uids, count);
-
- for (i = 0; i < count; i++)
- uids->pdata[i] = g_strdup_printf ("%d", i + 1);
- } else {
- data = camel_pop3_command_get_additional_data (pop3_store, ex);
- if (camel_exception_is_set (ex))
- return NULL;
-
- uids = parse_listing (count, data);
- g_free (data);
-
- if (!uids) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not open folder: message "
- "listing was incomplete.");
- return NULL;
- }
- }
-
- pop3_folder = CAMEL_POP3_FOLDER(camel_object_new (CAMEL_POP3_FOLDER_TYPE));
- CF_CLASS (pop3_folder)->init ((CamelFolder *)pop3_folder, parent,
- NULL, "inbox", "/", TRUE, ex);
- pop3_folder->uids = uids;
- pop3_folder->flags = g_new0 (guint32, uids->len);
-
- return (CamelFolder *)pop3_folder;
-}
-
-static void
-pop3_sync (CamelFolder *folder, gboolean expunge, CamelException *ex)
-{
- CamelPop3Folder *pop3_folder;
- CamelPop3Store *pop3_store;
- int i, status;
- char *resp;
-
- if (!expunge)
- return;
-
- pop3_folder = CAMEL_POP3_FOLDER (folder);
- pop3_store = CAMEL_POP3_STORE (folder->parent_store);
-
- for (i = 0; i < pop3_folder->uids->len; i++) {
- if (pop3_folder->flags[i] & CAMEL_MESSAGE_DELETED) {
- status = camel_pop3_command (pop3_store, &resp,
- "DELE %d", i + 1);
- if (status != CAMEL_POP3_OK) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Unable to sync folder"
- "%s%s", resp ? ": " : "",
- resp ? resp : "");
- g_free (resp);
- return;
- }
- }
- }
-
- camel_pop3_store_expunge (pop3_store, ex);
-}
-
-
-static GPtrArray *
-parse_listing (int count, char *data)
-{
- GPtrArray *ans;
- char *p;
- int index, len;
-
- ans = g_ptr_array_new ();
- g_ptr_array_set_size (ans, count);
-
- p = data;
- while (*p) {
- index = strtoul (p, &p, 10);
- len = strcspn (p, "\n");
- if (index <= count && *p == ' ')
- ans->pdata[index - 1] = g_strndup (p + 1, len - 1);
- p += len;
- if (*p == '\n')
- p++;
- }
-
- for (index = 0; index < count; index++) {
- if (ans->pdata[index] == NULL) {
- g_ptr_array_free (ans, TRUE);
- return NULL;
- }
- }
-
- return ans;
-}
-
-static int
-uid_to_number (CamelPop3Folder *pop3_folder, const char *uid)
-{
- int i;
-
- for (i = 0; i < pop3_folder->uids->len; i++) {
- if (!strcmp (uid, pop3_folder->uids->pdata[i]))
- return i + 1;
- }
-
- return -1;
-}
-
-
-static CamelMimeMessage *
-pop3_get_message (CamelFolder *folder, const char *uid, CamelException *ex)
-{
- int status, num;
- char *result, *body;
- CamelStream *msgstream;
- CamelMimeMessage *msg;
-
- num = uid_to_number (CAMEL_POP3_FOLDER (folder), uid);
- if (num == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID,
- "No message with uid %s", uid);
- return NULL;
- }
-
- status = camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store),
- &result, "RETR %d", num);
- if (status != CAMEL_POP3_OK) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not retrieve message from POP "
- "server %s: %s.", service->url->host,
- status == CAMEL_POP3_ERR ? result :
- "Unknown error");
- g_free (result);
- return NULL;
- }
- g_free (result);
-
- body = camel_pop3_command_get_additional_data (CAMEL_POP3_STORE (folder->parent_store), ex);
- if (!body) {
- CamelService *service = CAMEL_SERVICE (folder->parent_store);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not retrieve message from POP "
- "server %s: %s", service->url->host,
- camel_exception_get_description (ex));
- return NULL;
- }
-
- msgstream = camel_stream_mem_new_with_buffer (body, strlen (body));
- g_free (body);
-
- msg = camel_mime_message_new ();
- camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (msg),
- CAMEL_STREAM (msgstream));
-
- camel_object_unref (CAMEL_OBJECT (msgstream));
-
- return msg;
-}
-
-static void
-pop3_set_message_flags (CamelFolder *folder, const char *uid,
- guint32 flags, guint32 set)
-{
- CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (folder);
- int num;
-
- num = uid_to_number (pop3_folder, uid);
- if (num == -1)
- return;
-
- pop3_folder->flags[num - 1] =
- (pop3_folder->flags[num] & ~flags) | (set & flags);
-}
-
-static gint
-pop3_get_message_count (CamelFolder *folder)
-{
- CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (folder);
-
- return pop3_folder->uids->len;
-}
-
-static GPtrArray *
-pop3_get_uids (CamelFolder *folder)
-{
- CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (folder);
-
- return pop3_folder->uids;
-}
diff --git a/camel/providers/pop3/camel-pop3-folder.h b/camel/providers/pop3/camel-pop3-folder.h
deleted file mode 100644
index b4cfd469b6..0000000000
--- a/camel/providers/pop3/camel-pop3-folder.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-pop3-folder.h : Class for a POP3 folder */
-
-/*
- * Author:
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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 CAMEL_POP3_FOLDER_H
-#define CAMEL_POP3_FOLDER_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include "camel-folder.h"
-
-#define CAMEL_POP3_FOLDER_TYPE (camel_pop3_folder_get_type ())
-#define CAMEL_POP3_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_POP3_FOLDER_TYPE, CamelPop3Folder))
-#define CAMEL_POP3_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_POP3_FOLDER_TYPE, CamelPop3FolderClass))
-#define IS_CAMEL_POP3_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_POP3_FOLDER_TYPE))
-
-
-typedef struct {
- CamelFolder parent_object;
-
- GPtrArray *uids;
- guint32 *flags;
-
-} CamelPop3Folder;
-
-
-
-typedef struct {
- CamelFolderClass parent_class;
-
- /* Virtual methods */
-
-} CamelPop3FolderClass;
-
-
-/* public methods */
-CamelFolder *camel_pop3_folder_new (CamelStore *parent, CamelException *ex);
-
-/* Standard Camel function */
-CamelType camel_pop3_folder_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_POP3_FOLDER_H */
diff --git a/camel/providers/pop3/camel-pop3-provider.c b/camel/providers/pop3/camel-pop3-provider.c
deleted file mode 100644
index 52399c99ec..0000000000
--- a/camel/providers/pop3/camel-pop3-provider.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-pop3-provider.c: pop3 provider registration code */
-
-/*
- * Authors :
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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
- */
-
-#include "config.h"
-#include "camel-pop3-store.h"
-#include "camel-provider.h"
-#include "camel-session.h"
-#include "camel-url.h"
-
-static CamelProvider pop3_provider = {
- "pop",
- "POP",
-
- "For connecting to POP servers. The POP protocol can also be used "
- "to retrieve mail from certain web mail providers and proprietary "
- "email systems.",
-
- "mail",
-
- CAMEL_PROVIDER_IS_REMOTE | CAMEL_PROVIDER_IS_SOURCE,
-
- { 0, 0 },
-
- NULL
-};
-
-void
-camel_provider_module_init (CamelSession *session)
-{
- pop3_provider.object_types[CAMEL_PROVIDER_STORE] =
- camel_pop3_store_get_type();
-
- pop3_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal);
-
- camel_session_register_provider (session, &pop3_provider);
-}
diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c
deleted file mode 100644
index 78d7d106e5..0000000000
--- a/camel/providers/pop3/camel-pop3-store.c
+++ /dev/null
@@ -1,750 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-pop3-store.c : class for a pop3 store */
-
-/*
- * Authors:
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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
- */
-
-#define d(x)
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include "camel-pop3-store.h"
-#include "camel-pop3-folder.h"
-#include "camel-stream-buffer.h"
-#include "camel-stream-fs.h"
-#include "camel-session.h"
-#include "camel-exception.h"
-#include "camel-url.h"
-#include "md5-utils.h"
-
-/* Specified in RFC 1939 */
-#define POP3_PORT 110
-
-#ifdef HAVE_KRB4
-/* Specified nowhere */
-#define KPOP_PORT 1109
-
-#include <krb.h>
-#endif
-
-static CamelServiceClass *service_class = NULL;
-
-static void finalize (CamelObject *object);
-
-static gboolean pop3_connect (CamelService *service, CamelException *ex);
-static gboolean pop3_disconnect (CamelService *service, CamelException *ex);
-static GList *query_auth_types (CamelService *service, CamelException *ex);
-static void free_auth_types (CamelService *service, GList *authtypes);
-static char *get_name (CamelService *service, gboolean brief);
-
-static CamelFolder *get_folder (CamelStore *store, const char *folder_name,
- gboolean create, CamelException *ex);
-static char *get_folder_name (CamelStore *store, const char *folder_name,
- CamelException *ex);
-static char *get_root_folder_name (CamelStore *store, CamelException *ex);
-
-static int pop3_get_response (CamelPop3Store *store, char **ret);
-
-
-static void
-camel_pop3_store_class_init (CamelPop3StoreClass *camel_pop3_store_class)
-{
- CamelServiceClass *camel_service_class =
- CAMEL_SERVICE_CLASS (camel_pop3_store_class);
- CamelStoreClass *camel_store_class =
- CAMEL_STORE_CLASS (camel_pop3_store_class);
-
- service_class = CAMEL_SERVICE_CLASS(camel_type_get_global_classfuncs (camel_service_get_type ()));
-
- /* virtual method overload */
- camel_service_class->connect = pop3_connect;
- camel_service_class->disconnect = pop3_disconnect;
- camel_service_class->query_auth_types = query_auth_types;
- camel_service_class->free_auth_types = free_auth_types;
- camel_service_class->get_name = get_name;
-
- camel_store_class->get_folder = get_folder;
- camel_store_class->get_folder_name = get_folder_name;
- camel_store_class->get_root_folder_name = get_root_folder_name;
-}
-
-
-
-static void
-camel_pop3_store_init (gpointer object, gpointer klass)
-{
- CamelService *service = CAMEL_SERVICE (object);
-
- service->url_flags = (CAMEL_SERVICE_URL_NEED_USER | CAMEL_SERVICE_URL_NEED_HOST);
-}
-
-CamelType
-camel_pop3_store_get_type (void)
-{
- static CamelType camel_pop3_store_type = CAMEL_INVALID_TYPE;
-
- if (!camel_pop3_store_type) {
- camel_pop3_store_type = camel_type_register (CAMEL_STORE_TYPE, "CamelPop3Store",
- sizeof (CamelPop3Store),
- sizeof (CamelPop3StoreClass),
- (CamelObjectClassInitFunc) camel_pop3_store_class_init,
- NULL,
- (CamelObjectInitFunc) camel_pop3_store_init,
- finalize);
- }
-
- return camel_pop3_store_type;
-}
-
-static void
-finalize (CamelObject *object)
-{
- CamelPop3Store *pop3_store = CAMEL_POP3_STORE (object);
- CamelException ex;
-
- camel_exception_init (&ex);
- pop3_disconnect (CAMEL_SERVICE (object), &ex);
- camel_exception_clear (&ex);
-
- if (pop3_store->apop_timestamp)
- g_free (pop3_store->apop_timestamp);
-}
-
-static CamelServiceAuthType password_authtype = {
- "Password",
-
- "This option will connect to the POP server using a plaintext "
- "password. This is the only option supported by many POP servers.",
-
- "",
- TRUE
-};
-
-static CamelServiceAuthType apop_authtype = {
- "APOP",
-
- "This option will connect to the POP server using an encrypted "
- "password via the APOP protocol. This may not work for all users "
- "even on servers that claim to support it.",
-
- "+APOP",
- TRUE
-};
-
-#ifdef HAVE_KRB4
-static CamelServiceAuthType kpop_authtype = {
- "Kerberos 4 (KPOP)",
-
- "This will connect to the POP server and use Kerberos 4 "
- "to authenticate to it.",
-
- "+KPOP",
- FALSE
-};
-#endif
-
-static gboolean
-connect_to_server (CamelService *service, gboolean real, CamelException *ex)
-{
- CamelPop3Store *store = CAMEL_POP3_STORE (service);
- struct hostent *h;
- struct sockaddr_in sin;
- int fd, status;
- char *buf, *apoptime, *apopend;
-#ifdef HAVE_KRB4
- gboolean kpop = (service->url->port == KPOP_PORT);
-#endif
-
- h = camel_service_gethost (service, ex);
- if (!h)
- return FALSE;
-
- sin.sin_family = h->h_addrtype;
- if (service->url->port)
- sin.sin_port = htons (service->url->port);
- else
- sin.sin_port = htons (POP3_PORT);
- memcpy (&sin.sin_addr, h->h_addr, sizeof (sin.sin_addr));
-
- fd = socket (h->h_addrtype, SOCK_STREAM, 0);
- if (fd == -1 ||
- connect (fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
- if (real) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not connect to %s: %s",
- h->h_name, g_strerror(errno));
- }
- if (fd > -1)
- close (fd);
- return FALSE;
- }
-
-#ifdef HAVE_KRB4
- if (kpop) {
- KTEXT_ST ticket_st;
- MSG_DAT msg_data;
- CREDENTIALS cred;
- Key_schedule schedule;
- char *hostname;
-
- /* Need to copy hostname, because krb_realmofhost will
- * call gethostbyname as well, and gethostbyname uses
- * static storage.
- */
- hostname = g_strdup (h->h_name);
- status = krb_sendauth (0, fd, &ticket_st, "pop", hostname,
- krb_realmofhost (hostname), 0,
- &msg_data, &cred, schedule,
- NULL, NULL, "KPOPV0.1");
- g_free (hostname);
- if (status != KSUCCESS) {
- if (real) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not authenticate "
- "to KPOP server: %s",
- krb_err_txt[status]);
- }
- close (fd);
- return FALSE;
- }
-
- if (!service->url->passwd)
- service->url->passwd = g_strdup (service->url->user);
- }
-#endif /* HAVE_KRB4 */
-
- store->ostream = camel_stream_fs_new_with_fd (fd);
- store->istream = camel_stream_buffer_new (store->ostream,
- CAMEL_STREAM_BUFFER_READ);
-
- /* Read the greeting, check status */
- status = pop3_get_response (store, &buf);
- if (status != CAMEL_POP3_OK) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "%s: %s", status == CAMEL_POP3_ERR ?
- "Error connecting to POP server" :
- "Error reading greeting from POP server",
- buf);
- g_free (buf);
- pop3_disconnect (service, ex);
- return FALSE;
- }
-
- apoptime = strchr (buf, '<');
- apopend = apoptime ? strchr (apoptime, '>') : NULL;
- if (apopend) {
- store->apop_timestamp = g_strndup (apoptime,
- apopend - apoptime + 1);
- memmove (apoptime, apopend + 1, strlen (apopend + 1));
- }
- store->implementation = buf;
-
- /* Check extensions */
- store->login_delay = -1;
- store->supports_top = -1;
- store->supports_uidl = -1;
- store->expires = -1;
-
- status = camel_pop3_command (store, NULL, "CAPA");
- if (status == CAMEL_POP3_OK) {
- char *p;
- int len;
-
- buf = camel_pop3_command_get_additional_data (store, ex);
- if (camel_exception_is_set (ex)) {
- pop3_disconnect (service, ex);
- return FALSE;
- }
-
- p = buf;
- while (*p) {
- len = strcspn (p, "\n");
- if (!strncmp (p, "IMPLEMENTATION ", 15)) {
- g_free (store->implementation);
- store->implementation =
- g_strndup (p + 15, len - 15);
- } else if (len == 3 && !strncmp (p, "TOP", 3))
- store->supports_top = TRUE;
- else if (len == 4 && !strncmp (p, "UIDL", 4))
- store->supports_uidl = TRUE;
- else if (!strncmp (p, "LOGIN-DELAY ", 12))
- store->login_delay = atoi (p + 12);
- else if (!strncmp (p, "EXPIRE NEVER", 12))
- store->expires = FALSE;
- else if (!strncmp (p, "EXPIRE ", 7))
- store->expires = TRUE;
-
- p += len;
- if (*p)
- p++;
- }
-
- g_free (buf);
- }
-
- return TRUE;
-}
-
-static GList *
-query_auth_types (CamelService *service, CamelException *ex)
-{
- CamelPop3Store *store = CAMEL_POP3_STORE (service);
- GList *ret = NULL;
- gboolean passwd = TRUE, apop = TRUE;
-#ifdef HAVE_KRB4
- gboolean kpop = TRUE;
- int saved_port;
-#endif
-
- if (service->url && !service->url->empty) {
- passwd = connect_to_server (service, FALSE, ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE)
- return NULL;
- apop = store->apop_timestamp != NULL;
- if (passwd)
- pop3_disconnect (service, ex);
-#ifdef HAVE_KRB4
- saved_port = service->url->port;
- service->url->port = KPOP_PORT;
- kpop = connect_to_server (service, FALSE, ex);
- service->url->port = saved_port;
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE)
- return NULL;
- if (kpop)
- pop3_disconnect (service, ex);
-#endif
- }
-
- if (passwd)
- ret = g_list_append (ret, &password_authtype);
- if (apop)
- ret = g_list_append (ret, &apop_authtype);
-#ifdef HAVE_KRB4
- if (kpop)
- ret = g_list_append (ret, &kpop_authtype);
-#endif
-
- if (!ret) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not connect to POP server on "
- "%s.", service->url->host);
- }
-
- return ret;
-}
-
-static void
-free_auth_types (CamelService *service, GList *authtypes)
-{
- g_list_free (authtypes);
-}
-
-static char *
-get_name (CamelService *service, gboolean brief)
-{
- if (brief)
- return g_strdup_printf ("POP server %s", service->url->host);
- else {
- return g_strdup_printf ("POP service for %s on %s",
- service->url->user,
- service->url->host);
- }
-}
-
-
-/**
- * camel_pop3_store_expunge:
- * @store: the store
- * @ex: a CamelException
- *
- * Expunge messages from the store. This will result in the connection
- * being closed, which may cause later commands to fail if they can't
- * reconnect.
- **/
-void
-camel_pop3_store_expunge (CamelPop3Store *store, CamelException *ex)
-{
- camel_pop3_command (store, NULL, "QUIT");
- pop3_disconnect (CAMEL_SERVICE (store), ex);
-}
-
-
-static gboolean
-pop3_try_authenticate (CamelService *service, gboolean kpop,
- const char *errmsg, CamelException *ex)
-{
- CamelPop3Store *store = (CamelPop3Store *)service;
- int status;
- char *msg;
-
- /* The KPOP code will have set the password to be the username
- * in connect_to_server. Password and APOP are the only other
- * cases, and they both need a password. So if there's no
- * password stored, query for it.
- */
- if (!service->url->passwd) {
- char *prompt;
-
- prompt = g_strdup_printf ("%sPlease enter the POP3 password "
- "for %s@%s", errmsg ? errmsg : "",
- service->url->user,
- service->url->host);
- service->url->passwd = camel_session_query_authenticator (
- camel_service_get_session (service),
- CAMEL_AUTHENTICATOR_ASK, prompt, TRUE,
- service, "password", ex);
- g_free (prompt);
- if (!service->url->passwd)
- return FALSE;
- }
-
- if (!service->url->authmech || kpop) {
- status = camel_pop3_command (store, &msg, "USER %s",
- service->url->user);
- if (status != CAMEL_POP3_OK) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
- "Unable to connect to POP "
- "server.\nError sending "
- "username: %s",
- msg ? msg : "(Unknown)");
- g_free (msg);
- return FALSE;
- }
- g_free (msg);
-
- status = camel_pop3_command (store, &msg, "PASS %s",
- service->url->passwd);
- } else if (!strcmp (service->url->authmech, "+APOP")
- && store->apop_timestamp) {
- char *secret, md5asc[33], *d;
- unsigned char md5sum[16], *s;
-
- secret = g_strdup_printf ("%s%s", store->apop_timestamp,
- service->url->passwd);
- md5_get_digest (secret, strlen (secret), md5sum);
- g_free (secret);
-
- for (s = md5sum, d = md5asc; d < md5asc + 32; s++, d += 2)
- sprintf (d, "%.2x", *s);
-
- status = camel_pop3_command (store, &msg, "APOP %s %s",
- service->url->user, md5asc);
- } else {
- camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
- "Unable to connect to POP server.\n"
- "No support for requested authentication "
- "mechanism.");
- return FALSE;
- }
-
- if (status != CAMEL_POP3_OK) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
- "Unable to connect to POP server.\n"
- "Error sending password: %s",
- msg ? msg : "(Unknown)");
- }
-
- g_free (msg);
- return camel_exception_is_set (ex);
-}
-
-static gboolean
-pop3_connect (CamelService *service, CamelException *ex)
-{
- char *errbuf = NULL;
- gboolean tryagain, kpop = FALSE;
-
-#ifdef HAVE_KRB4
- kpop = (service->url->authmech &&
- !strcmp (service->url->authmech, "+KPOP"));
-
- if (kpop && service->url->port == 0)
- service->url->port = KPOP_PORT;
-#endif
-
- d(printf ("POP3: Connecting to %s\n", service->url->host));
- if (!connect_to_server (service, TRUE, ex))
- return FALSE;
-
- camel_exception_clear (ex);
- do {
- if (camel_exception_is_set (ex)) {
- errbuf = g_strdup_printf (
- "%s\n\n",
- camel_exception_get_description (ex));
-
- /* Uncache the password before prompting again. */
- camel_session_query_authenticator (
- camel_service_get_session (service),
- CAMEL_AUTHENTICATOR_TELL, NULL, TRUE, service,
- "password", ex);
- g_free (service->url->passwd);
- service->url->passwd = NULL;
- }
-
- tryagain = pop3_try_authenticate (service, kpop, errbuf, ex);
- g_free (errbuf);
- } while (tryagain);
-
- if (camel_exception_is_set (ex)) {
- pop3_disconnect (service, NULL);
- return FALSE;
- }
-
- return service_class->connect (service, ex);
-}
-
-static gboolean
-pop3_disconnect (CamelService *service, CamelException *ex)
-{
- CamelPop3Store *store = CAMEL_POP3_STORE (service);
-
- if (!service_class->disconnect (service, ex))
- return FALSE;
-
- d(printf ("POP3: Disconnecting from %s\n", service->url->host));
-
- if (store->ostream) {
- camel_object_unref (CAMEL_OBJECT (store->ostream));
- store->ostream = NULL;
- }
- if (store->istream) {
- camel_object_unref (CAMEL_OBJECT (store->istream));
- store->istream = NULL;
- }
-
- if (store->apop_timestamp) {
- g_free (store->apop_timestamp);
- store->apop_timestamp = NULL;
- }
-
- return TRUE;
-}
-
-static CamelFolder *
-get_folder (CamelStore *store, const char *folder_name,
- gboolean create, CamelException *ex)
-{
- CamelService *service = CAMEL_SERVICE (store);
-
- if (!camel_service_is_connected (service)) {
- if (!camel_service_connect (service, ex))
- return NULL;
- }
- return camel_pop3_folder_new (store, ex);
-}
-
-static char *
-get_folder_name (CamelStore *store, const char *folder_name,
- CamelException *ex)
-{
- if (!g_strcasecmp (folder_name, "inbox"))
- return g_strdup ("inbox");
- else {
- camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID,
- "No such folder `%s'.", folder_name);
- return NULL;
- }
-}
-
-static char *
-get_root_folder_name (CamelStore *store, CamelException *ex)
-{
- return g_strdup ("inbox");
-}
-
-
-/**
- * camel_pop3_command: Send a command to a POP3 server.
- * @store: the POP3 store
- * @ret: a pointer to return the full server response in
- * @fmt: a printf-style format string, followed by arguments
- *
- * This command sends the command specified by @fmt and the following
- * arguments to the connected POP3 store specified by @store. It then
- * reads the server's response and parses out the status code. If
- * the caller passed a non-NULL pointer for @ret, camel_pop3_command
- * will set it to point to an buffer containing the rest of the
- * response from the POP3 server. (If @ret was passed but there was
- * no extended response, @ret will be set to NULL.) The caller must
- * free this buffer when it is done with it.
- *
- * Return value: one of CAMEL_POP3_OK (command executed successfully),
- * CAMEL_POP3_ERR (command encounted an error), or CAMEL_POP3_FAIL
- * (a protocol-level error occurred, and Camel is uncertain of the
- * result of the command.)
- **/
-int
-camel_pop3_command (CamelPop3Store *store, char **ret, char *fmt, ...)
-{
- char *cmdbuf;
- va_list ap;
-
- if (!store->ostream) {
- CamelException ex;
-
- camel_exception_init (&ex);
- if (!camel_service_connect (CAMEL_SERVICE (store), &ex)) {
- if (ret)
- *ret = g_strdup (camel_exception_get_description (&ex));
- camel_exception_clear (&ex);
- return CAMEL_POP3_FAIL;
- }
- }
-
- va_start (ap, fmt);
- cmdbuf = g_strdup_vprintf (fmt, ap);
- va_end (ap);
-
-#if d(!)0
- if (!strncmp (cmdbuf, "PASS", 4))
- printf ("POP3: >>> PASS xxx\n");
- else
- printf ("POP3: >>> %s\n", cmdbuf);
-#endif
-
- /* Send the command */
- if (camel_stream_printf (store->ostream, "%s\r\n", cmdbuf) == -1) {
- g_free (cmdbuf);
- if (*ret)
- *ret = g_strdup (g_strerror (errno));
- d(printf ("POP3: !!! %s\n", g_strerror (errno)));
- return CAMEL_POP3_FAIL;
- }
- g_free (cmdbuf);
-
- return pop3_get_response (store, ret);
-}
-
-static int
-pop3_get_response (CamelPop3Store *store, char **ret)
-{
- char *respbuf;
- int status;
-
- respbuf = camel_stream_buffer_read_line (
- CAMEL_STREAM_BUFFER (store->istream));
- if (respbuf == NULL) {
- if (ret)
- *ret = g_strdup (g_strerror (errno));
- d(printf ("POP3: !!! %s\n", g_strerror (errno)));
- return CAMEL_POP3_FAIL;
- }
- d(printf ("POP3: <<< %s\n", respbuf));
-
- if (!strncmp (respbuf, "+OK", 3))
- status = CAMEL_POP3_OK;
- else if (!strncmp (respbuf, "-ERR", 4))
- status = CAMEL_POP3_ERR;
- else
- status = CAMEL_POP3_FAIL;
-
- if (ret) {
- if (status != CAMEL_POP3_FAIL) {
- *ret = strchr (respbuf, ' ');
- if (*ret)
- *ret = g_strdup (*ret + 1);
- } else
- *ret = NULL;
- }
- g_free (respbuf);
-
- return status;
-}
-
-/**
- * camel_pop3_command_get_additional_data: get "additional data" from
- * a POP3 command.
- * @store: the POP3 store
- *
- * This command gets the additional data returned by "multi-line" POP
- * commands, such as LIST, RETR, TOP, and UIDL. This command _must_
- * be called after a successful (CAMEL_POP3_OK) call to
- * camel_pop3_command for a command that has a multi-line response.
- * The returned data is un-byte-stuffed, and has lines termined by
- * newlines rather than CR/LF pairs.
- *
- * Return value: the data, which the caller must free.
- **/
-char *
-camel_pop3_command_get_additional_data (CamelPop3Store *store, CamelException *ex)
-{
- CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream);
- GPtrArray *data;
- char *buf, *p;
- int i, len = 0, status = CAMEL_POP3_OK;
-
- data = g_ptr_array_new ();
- while (1) {
- buf = camel_stream_buffer_read_line (stream);
- if (!buf) {
- status = CAMEL_POP3_FAIL;
- break;
- }
-
- if (!strcmp (buf, "."))
- break;
-
- g_ptr_array_add (data, buf);
- len += strlen (buf) + 1;
- }
- g_free (buf);
-
- if (status == CAMEL_POP3_OK) {
- buf = g_malloc0 (len + 1);
-
- for (i = 0, p = buf; i < data->len; i++) {
- char *ptr, *datap;
-
- datap = (char *) data->pdata[i];
- ptr = (*datap == '.') ? datap + 1 : datap;
- len = strlen (ptr);
-#if d(!)0
- if (i == data->len - 1)
- printf ("POP3: <<<<<< %s\n", ptr);
- else if (i == 0)
- printf ("POP3: <<<<<< %s...\n", ptr);
-#endif
- memcpy (p, ptr, len);
- p += len;
- *p++ = '\n';
- }
- *p = '\0';
- } else
- buf = NULL;
-
- for (i = 0; i < data->len; i++)
- g_free (data->pdata[i]);
- g_ptr_array_free (data, TRUE);
-
- return buf;
-}
diff --git a/camel/providers/pop3/camel-pop3-store.h b/camel/providers/pop3/camel-pop3-store.h
deleted file mode 100644
index f5e447d9ea..0000000000
--- a/camel/providers/pop3/camel-pop3-store.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-pop3-store.h : class for an pop3 store */
-
-/*
- * Authors:
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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 CAMEL_POP3_STORE_H
-#define CAMEL_POP3_STORE_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include "camel-types.h"
-#include "camel-store.h"
-
-#define CAMEL_POP3_STORE_TYPE (camel_pop3_store_get_type ())
-#define CAMEL_POP3_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_POP3_STORE_TYPE, CamelPop3Store))
-#define CAMEL_POP3_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_POP3_STORE_TYPE, CamelPop3StoreClass))
-#define IS_CAMEL_POP3_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_POP3_STORE_TYPE))
-
-
-typedef struct {
- CamelStore parent_object;
-
- CamelStream *istream, *ostream;
- char *apop_timestamp, *implementation;
- gboolean supports_top, supports_uidl, expires;
- int login_delay;
-
-} CamelPop3Store;
-
-
-
-typedef struct {
- CamelStoreClass parent_class;
-
-} CamelPop3StoreClass;
-
-
-/* public methods */
-void camel_pop3_store_expunge (CamelPop3Store *store, CamelException *ex);
-
-/* support functions */
-enum { CAMEL_POP3_OK, CAMEL_POP3_ERR, CAMEL_POP3_FAIL };
-int camel_pop3_command (CamelPop3Store *store, char **ret, char *fmt, ...);
-char *camel_pop3_command_get_additional_data (CamelPop3Store *store,
- CamelException *ex);
-
-/* Standard Camel function */
-CamelType camel_pop3_store_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_POP3_STORE_H */
-
-
diff --git a/camel/providers/pop3/libcamelpop3.urls b/camel/providers/pop3/libcamelpop3.urls
deleted file mode 100644
index 7fffa4d861..0000000000
--- a/camel/providers/pop3/libcamelpop3.urls
+++ /dev/null
@@ -1 +0,0 @@
-pop
diff --git a/camel/providers/sendmail/.cvsignore b/camel/providers/sendmail/.cvsignore
deleted file mode 100644
index cacc3c5d5f..0000000000
--- a/camel/providers/sendmail/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-Makefile
-Makefile.in
-.deps
-.libs
-*.lo
-*.la
-*.o
diff --git a/camel/providers/sendmail/Makefile.am b/camel/providers/sendmail/Makefile.am
deleted file mode 100644
index 965f56afb8..0000000000
--- a/camel/providers/sendmail/Makefile.am
+++ /dev/null
@@ -1,29 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-libcamelsendmailincludedir = $(includedir)/camel
-
-
-providerdir = $(pkglibdir)/camel-providers/$(VERSION)
-
-provider_LTLIBRARIES = libcamelsendmail.la
-provider_DATA = libcamelsendmail.urls
-
-INCLUDES = \
- -I.. \
- -I$(srcdir)/.. \
- -I$(srcdir)/../../.. \
- -I$(includedir) \
- -I$(top_srcdir)/intl \
- $(GTK_INCLUDEDIR) -I$(top_srcdir)/camel \
- -DG_LOG_DOMAIN=\"camel-sendmail-provider\"
-
-libcamelsendmail_la_SOURCES = \
- camel-sendmail-provider.c \
- camel-sendmail-transport.c
-
-libcamelsendmailinclude_HEADERS = \
- camel-sendmail-transport.h
-
-libcamelsendmail_la_LDFLAGS = -version-info 0:0:0
-
-EXTRA_DIST = libcamelsendmail.urls
diff --git a/camel/providers/sendmail/camel-sendmail-provider.c b/camel/providers/sendmail/camel-sendmail-provider.c
deleted file mode 100644
index 3b0b35dd72..0000000000
--- a/camel/providers/sendmail/camel-sendmail-provider.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-sendmail-provider.c: sendmail provider registration code */
-
-/*
- * Authors :
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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
- */
-
-#include "config.h"
-#include "camel-provider.h"
-#include "camel-sendmail-transport.h"
-#include "camel-session.h"
-#include "camel-url.h"
-
-static CamelProvider sendmail_provider = {
- "sendmail",
- "Sendmail",
-
- "For delivering mail by passing it to the \"sendmail\" program "
- "on the local system.",
-
- "mail",
-
- 0,
-
- { 0, 0 },
-
- NULL
-};
-
-void
-camel_provider_module_init (CamelSession *session)
-{
- sendmail_provider.object_types[CAMEL_PROVIDER_TRANSPORT] =
- camel_sendmail_transport_get_type();
-
- sendmail_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal);
-
- camel_session_register_provider (session, &sendmail_provider);
-}
-
-
-
diff --git a/camel/providers/sendmail/camel-sendmail-transport.c b/camel/providers/sendmail/camel-sendmail-transport.c
deleted file mode 100644
index c53512ccb4..0000000000
--- a/camel/providers/sendmail/camel-sendmail-transport.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-sendmail-transport.c: Sendmail-based transport class. */
-
-/*
- *
- * Author :
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/wait.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "camel-sendmail-transport.h"
-#include "camel-mime-message.h"
-#include "camel-data-wrapper.h"
-#include "camel-stream-fs.h"
-#include "camel-exception.h"
-
-static char *get_name (CamelService *service, gboolean brief);
-
-static gboolean _can_send (CamelTransport *transport, CamelMedium *message);
-static gboolean _send (CamelTransport *transport, CamelMedium *message,
- CamelException *ex);
-static gboolean _send_to (CamelTransport *transport, CamelMedium *message,
- GList *recipients, CamelException *ex);
-
-
-static void
-camel_sendmail_transport_class_init (CamelSendmailTransportClass *camel_sendmail_transport_class)
-{
- CamelTransportClass *camel_transport_class =
- CAMEL_TRANSPORT_CLASS (camel_sendmail_transport_class);
- CamelServiceClass *camel_service_class =
- CAMEL_SERVICE_CLASS (camel_sendmail_transport_class);
-
- /* virtual method overload */
- camel_service_class->get_name = get_name;
-
- camel_transport_class->can_send = _can_send;
- camel_transport_class->send = _send;
- camel_transport_class->send_to = _send_to;
-}
-
-CamelType
-camel_sendmail_transport_get_type (void)
-{
- static CamelType camel_sendmail_transport_type = CAMEL_INVALID_TYPE;
-
- if (camel_sendmail_transport_type == CAMEL_INVALID_TYPE) {
- camel_sendmail_transport_type = camel_type_register (CAMEL_TRANSPORT_TYPE, "CamelSendmailTransport",
- sizeof (CamelSendmailTransport),
- sizeof (CamelSendmailTransportClass),
- (CamelObjectClassInitFunc) camel_sendmail_transport_class_init,
- NULL,
- (CamelObjectInitFunc) NULL,
- NULL);
- }
-
- return camel_sendmail_transport_type;
-}
-
-
-static gboolean
-_can_send (CamelTransport *transport, CamelMedium *message)
-{
- return CAMEL_IS_MIME_MESSAGE (message);
-}
-
-
-static gboolean
-_send_internal (CamelMedium *message, char **argv, CamelException *ex)
-{
- int fd[2], nullfd, wstat;
- sigset_t mask, omask;
- CamelStream *out;
- pid_t pid;
-
- g_assert (CAMEL_IS_MIME_MESSAGE (message));
-
- if (pipe (fd) == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not create pipe to sendmail: "
- "%s: mail not sent",
- g_strerror (errno));
- return FALSE;
- }
-
- /* Block SIGCHLD so the calling application doesn't notice
- * sendmail exiting before we do.
- */
- sigemptyset (&mask);
- sigaddset (&mask, SIGCHLD);
- sigprocmask (SIG_BLOCK, &mask, &omask);
-
- pid = fork ();
- switch (pid) {
- case -1:
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not fork sendmail: "
- "%s: mail not sent", g_strerror (errno));
- sigprocmask (SIG_SETMASK, &omask, NULL);
- return FALSE;
-
- case 0:
- /* Child process */
- nullfd = open ("/dev/null", O_RDWR);
- dup2 (fd[0], STDIN_FILENO);
- dup2 (nullfd, STDOUT_FILENO);
- dup2 (nullfd, STDERR_FILENO);
- close (nullfd);
- close (fd[1]);
-
- execv (SENDMAIL_PATH, argv);
- _exit (255);
- }
-
- /* Parent process. Write the message out. */
- close (fd[0]);
- out = camel_stream_fs_new_with_fd (fd[1]);
- if (camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), out) == -1
- || camel_stream_close(out) == -1) {
- camel_object_unref (CAMEL_OBJECT (out));
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not send message: %s",
- strerror(errno));
- return FALSE;
- }
- camel_object_unref (CAMEL_OBJECT (out));
-
- /* Wait for sendmail to exit. */
- while (waitpid (pid, &wstat, 0) == -1 && errno == EINTR)
- ;
- sigprocmask (SIG_SETMASK, &omask, NULL);
-
- if (!WIFEXITED (wstat)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "sendmail exited with signal %s: "
- "mail not sent.",
- g_strsignal (WTERMSIG (wstat)));
- return FALSE;
- } else if (WEXITSTATUS (wstat) != 0) {
- if (WEXITSTATUS (wstat) == 255) {
- camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM,
- "Could not execute "
- SENDMAIL_PATH ": mail not sent.");
- } else {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "sendmail exited with status "
- "%d: mail not sent.",
- WEXITSTATUS (wstat));
- }
- return FALSE;
- }
-
- return TRUE;
-}
-
-static gboolean
-_send_to (CamelTransport *transport, CamelMedium *message,
- GList *recipients, CamelException *ex)
-{
- GList *r;
- char **argv;
- int i, len;
- gboolean status;
-
- len = g_list_length (recipients);
- argv = g_malloc ((len + 4) * sizeof (char *));
- argv[0] = "sendmail";
- argv[1] = "-i";
- argv[2] = "--";
-
- for (i = 1, r = recipients; i <= len; i++, r = r->next)
- argv[i + 2] = r->data;
- argv[i + 2] = NULL;
-
- status = _send_internal (message, argv, ex);
- g_free (argv);
- return status;
-}
-
-static gboolean
-_send (CamelTransport *transport, CamelMedium *message,
- CamelException *ex)
-{
- char *argv[4] = { "sendmail", "-t", "-i", NULL };
-
- return _send_internal (message, argv, ex);
-}
-
-static char *
-get_name (CamelService *service, gboolean brief)
-{
- if (brief)
- return g_strdup ("sendmail");
- else
- return g_strdup ("Mail delivery via the sendmail program");
-}
diff --git a/camel/providers/sendmail/camel-sendmail-transport.h b/camel/providers/sendmail/camel-sendmail-transport.h
deleted file mode 100644
index bb5dca071b..0000000000
--- a/camel/providers/sendmail/camel-sendmail-transport.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-sendmail-transport.h: Sendmail-based transport class */
-
-/*
- *
- * Author :
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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 CAMEL_SENDMAIL_TRANSPORT_H
-#define CAMEL_SENDMAIL_TRANSPORT_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include "camel-transport.h"
-
-#define CAMEL_SENDMAIL_TRANSPORT_TYPE (camel_sendmail_transport_get_type ())
-#define CAMEL_SENDMAIL_TRANSPORT(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SENDMAIL_TRANSPORT_TYPE, CamelSendmailTransport))
-#define CAMEL_SENDMAIL_TRANSPORT_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SENDMAIL_TRANSPORT_TYPE, CamelSendmailTransportClass))
-#define CAMEL_IS_SENDMAIL_TRANSPORT(o) (CAMEL_CHECK_TYPE((o), CAMEL_SENDMAIL_TRANSPORT_TYPE))
-
-
-typedef struct {
- CamelTransport parent_object;
-
-} CamelSendmailTransport;
-
-
-typedef struct {
- CamelTransportClass parent_class;
-
-} CamelSendmailTransportClass;
-
-
-/* Standard Camel function */
-CamelType camel_sendmail_transport_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_SENDMAIL_TRANSPORT_H */
diff --git a/camel/providers/sendmail/libcamelsendmail.urls b/camel/providers/sendmail/libcamelsendmail.urls
deleted file mode 100644
index ccad52828e..0000000000
--- a/camel/providers/sendmail/libcamelsendmail.urls
+++ /dev/null
@@ -1 +0,0 @@
-sendmail
diff --git a/camel/providers/smtp/.cvsignore b/camel/providers/smtp/.cvsignore
deleted file mode 100644
index 09980ae6ba..0000000000
--- a/camel/providers/smtp/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
diff --git a/camel/providers/smtp/Makefile.am b/camel/providers/smtp/Makefile.am
deleted file mode 100644
index 0762283161..0000000000
--- a/camel/providers/smtp/Makefile.am
+++ /dev/null
@@ -1,30 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-libcamelsmtpincludedir = $(includedir)/camel
-
-providerdir = $(pkglibdir)/camel-providers/$(VERSION)
-
-provider_LTLIBRARIES = libcamelsmtp.la
-provider_DATA = libcamelsmtp.urls
-
-INCLUDES = \
- -I.. \
- -I$(srcdir)/.. \
- -I$(srcdir)/../../.. \
- -I$(includedir) \
- -I$(top_srcdir)/intl \
- $(GTK_INCLUDEDIR) \
- -I$(top_srcdir)/camel \
- -DG_LOG_DOMAIN=\"camel-smtp-provider\"
-
-libcamelsmtp_la_SOURCES = \
- camel-smtp-provider.c \
- camel-smtp-transport.c
-
-libcamelsmtpinclude_HEADERS = \
- camel-smtp-transport.h
-
-
-libcamelsmtp_la_LDFLAGS = -version-info 0:0:0
-
-EXTRA_DIST = libcamelsmtp.urls
diff --git a/camel/providers/smtp/camel-smtp-provider.c b/camel/providers/smtp/camel-smtp-provider.c
deleted file mode 100644
index 1d18e445cc..0000000000
--- a/camel/providers/smtp/camel-smtp-provider.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-smtp-provider.c: smtp provider registration code */
-
-/*
- * Authors :
- * Jeffrey Stedfast <fejj@stampede.org>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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
- */
-
-#include "config.h"
-#include "camel-smtp-transport.h"
-#include "camel-provider.h"
-#include "camel-session.h"
-#include "camel-url.h"
-
-static CamelProvider smtp_provider = {
- "smtp",
- "SMTP",
-
- "For delivering mail by connecting to a remote mailhub using SMTP.",
-
- "mail",
-
- 0,
-
- { 0, 0 },
-
- NULL
-};
-
-void
-camel_provider_module_init (CamelSession *session)
-{
- smtp_provider.object_types[CAMEL_PROVIDER_TRANSPORT] =
- camel_smtp_transport_get_type();
-
- smtp_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal);
-
- camel_session_register_provider (session, &smtp_provider);
-}
-
-
-
diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c
deleted file mode 100644
index 0486e4da75..0000000000
--- a/camel/providers/smtp/camel-smtp-transport.c
+++ /dev/null
@@ -1,803 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-smtp-transport.c : class for a smtp transport */
-
-/*
- * Authors:
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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
- */
-
-#include "config.h"
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#undef MIN
-#undef MAX
-#include "camel-mime-filter-crlf.h"
-#include "camel-stream-filter.h"
-#include "camel-smtp-transport.h"
-#include "camel-mime-message.h"
-#include "camel-stream-buffer.h"
-#include "camel-stream-fs.h"
-#include "camel-session.h"
-#include "camel-exception.h"
-#include "md5-utils.h"
-
-#define d(x) x
-
-/* Specified in RFC 821 */
-#define SMTP_PORT 25
-
-/* camel smtp transport class prototypes */
-static gboolean _can_send (CamelTransport *transport, CamelMedium *message);
-static gboolean _send (CamelTransport *transport, CamelMedium *message, CamelException *ex);
-static gboolean _send_to (CamelTransport *transport, CamelMedium *message, GList *recipients, CamelException *ex);
-
-/* support prototypes */
-static gboolean smtp_connect (CamelService *service, CamelException *ex);
-static gboolean smtp_disconnect (CamelService *service, CamelException *ex);
-static GList *esmtp_get_authtypes(gchar *buffer);
-static GList *query_auth_types (CamelService *service, CamelException *ex);
-static void free_auth_types (CamelService *service, GList *authtypes);
-static char *get_name (CamelService *service, gboolean brief);
-static gchar *smtp_get_email_addr_from_text (gchar *text);
-static gboolean smtp_helo (CamelSmtpTransport *transport, CamelException *ex);
-static gboolean smtp_mail (CamelSmtpTransport *transport, gchar *sender, CamelException *ex);
-static gboolean smtp_rcpt (CamelSmtpTransport *transport, gchar *recipient, CamelException *ex);
-static gboolean smtp_data (CamelSmtpTransport *transport, CamelMedium *message, CamelException *ex);
-static gboolean smtp_rset (CamelSmtpTransport *transport, CamelException *ex);
-static gboolean smtp_quit (CamelSmtpTransport *transport, CamelException *ex);
-
-/* private data members */
-static CamelServiceClass *service_class = NULL;
-
-static void
-camel_smtp_transport_class_init (CamelSmtpTransportClass *camel_smtp_transport_class)
-{
- CamelTransportClass *camel_transport_class =
- CAMEL_TRANSPORT_CLASS (camel_smtp_transport_class);
- CamelServiceClass *camel_service_class =
- CAMEL_SERVICE_CLASS (camel_smtp_transport_class);
-
- service_class = CAMEL_SERVICE_CLASS(camel_type_get_global_classfuncs (camel_service_get_type ()));
-
- /* virtual method overload */
- camel_service_class->connect = smtp_connect;
- camel_service_class->disconnect = smtp_disconnect;
- camel_service_class->query_auth_types = query_auth_types;
- camel_service_class->free_auth_types = free_auth_types;
- camel_service_class->get_name = get_name;
-
- camel_transport_class->can_send = _can_send;
- camel_transport_class->send = _send;
- camel_transport_class->send_to = _send_to;
-}
-
-static void
-camel_smtp_transport_init (gpointer object)
-{
- CamelService *service = CAMEL_SERVICE (object);
-
- service->url_flags = CAMEL_SERVICE_URL_NEED_HOST;
-}
-
-CamelType
-camel_smtp_transport_get_type (void)
-{
- static CamelType camel_smtp_transport_type = CAMEL_INVALID_TYPE;
-
- if (camel_smtp_transport_type == CAMEL_INVALID_TYPE) {
- camel_smtp_transport_type = camel_type_register (CAMEL_TRANSPORT_TYPE, "CamelSmtpTransport",
- sizeof (CamelSmtpTransport),
- sizeof (CamelSmtpTransportClass),
- (CamelObjectClassInitFunc) camel_smtp_transport_class_init,
- NULL,
- (CamelObjectInitFunc) camel_smtp_transport_init,
- NULL);
- }
-
- return camel_smtp_transport_type;
-}
-
-static gboolean
-smtp_connect (CamelService *service, CamelException *ex)
-{
- CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service);
- struct hostent *h;
- struct sockaddr_in sin;
- gint fd, num, i;
- guint32 addrlen;
- gchar *pass = NULL, *respbuf = NULL;
-
-
- if (!service_class->connect (service, ex))
- return FALSE;
-
- h = camel_service_gethost (service, ex);
- if (!h)
- return FALSE;
-
- /* set some smtp transport defaults */
- transport->smtp_is_esmtp = FALSE;
- transport->esmtp_supported_authtypes = NULL;
-
- sin.sin_family = h->h_addrtype;
- sin.sin_port = htons (service->url->port ? service->url->port : SMTP_PORT);
- memcpy (&sin.sin_addr, h->h_addr, sizeof (sin.sin_addr));
-
- fd = socket (h->h_addrtype, SOCK_STREAM, 0);
- if (fd == -1 || connect (fd, (struct sockaddr *)&sin, sizeof (sin)) == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- "Could not connect to %s (port %d): %s",
- service->url->host,
- service->url->port ? service->url->port : SMTP_PORT,
- strerror (errno));
- if (fd > -1)
- close (fd);
- g_free (pass);
- return FALSE;
- }
-
- /* get the localaddr - needed later by smtp_helo */
- addrlen = sizeof (transport->localaddr);
- getsockname (fd, (struct sockaddr*)&transport->localaddr, &addrlen);
-
- transport->ostream = camel_stream_fs_new_with_fd (fd);
- transport->istream = camel_stream_buffer_new (transport->ostream,
- CAMEL_STREAM_BUFFER_READ);
-
- /* Read the greeting, note whether the server is ESMTP or not. */
- do {
- /* Check for "220" */
- g_free (respbuf);
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream));
- if (!respbuf || strncmp (respbuf, "220", 3)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Welcome response error: "
- "%s: possibly non-fatal",
- g_strerror (errno));
- return FALSE;
- }
- if (strstr (respbuf, "ESMTP"))
- transport->smtp_is_esmtp = TRUE;
- } while (*(respbuf+3) == '-'); /* if we got "220-" then loop again */
- g_free (respbuf);
-
- /* send HELO (or EHLO, depending on the service type) */
- if (!transport->smtp_is_esmtp) {
- /* If we did not auto-detect ESMTP, we should still send EHLO */
- transport->smtp_is_esmtp = TRUE;
- if (!smtp_helo (transport, ex)) {
- /* Okay, apprently this server doesn't support ESMTP */
- transport->smtp_is_esmtp = FALSE;
- smtp_helo (transport, ex);
- }
- } else {
- smtp_helo (transport, ex);
- }
-
- /* check to see if AUTH is required, if so...then AUTH ourselves */
- if (transport->smtp_is_esmtp && transport->esmtp_supported_authtypes) {
- /* not really supported yet, but we can at least show what auth types are supported */
- d(fprintf (stderr, "camel-smtp-transport::connect(): %s requires AUTH\n", service->url->host));
- num = g_list_length (transport->esmtp_supported_authtypes);
-
- for (i = 0; i < num; i++)
- d(fprintf (stderr, "\nSupported AUTH: %s\n\n",
- (gchar *) g_list_nth_data (transport->esmtp_supported_authtypes, i)));
-
- g_list_free (transport->esmtp_supported_authtypes);
- transport->esmtp_supported_authtypes = NULL;
- } else {
- d(fprintf (stderr, "\ncamel-smtp-transport::connect(): provider does not use AUTH\n\n"));
- }
-
- return TRUE;
-}
-
-static gboolean
-smtp_disconnect (CamelService *service, CamelException *ex)
-{
- CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service);
-
- if (!service->connected)
- return TRUE;
-
- /* send the QUIT command to the SMTP server */
- smtp_quit(transport, ex);
-
- if (!service_class->disconnect (service, ex))
- return FALSE;
-
- g_free (transport->esmtp_supported_authtypes);
- transport->esmtp_supported_authtypes = NULL;
- camel_object_unref (CAMEL_OBJECT (transport->ostream));
- camel_object_unref (CAMEL_OBJECT (transport->istream));
- transport->ostream = NULL;
- transport->istream = NULL;
-
- return TRUE;
-}
-
-static GList *
-esmtp_get_authtypes (gchar *buffer)
-{
- GList *ret = NULL;
- gchar *start, *end;
-
- /* advance to the first token */
- for (start = buffer; *start == ' ' || *start == '='; start++);
-
- for ( ; *start; ) {
- /* advance to the end of the token */
- for (end = start; *end && *end != ' '; end++);
-
- ret = g_list_append (ret, g_strndup (start, end - start));
-
- /* advance to the next token */
- for (start = end; *start == ' '; start++);
- }
-
- return ret;
-}
-
-/* FIXME: use these? */
-#ifdef notyet
-static CamelServiceAuthType no_authtype = {
- "No authentication required",
-
- "This option will connect to the SMTP server without using any "
- "kind of authentication. This should be fine for connecting to "
- "most SMTP servers."
-
- "",
- FALSE
-};
-
-static CamelServiceAuthType cram_md5_authtype = {
- "CRAM-MD5",
-
- "This option will connect to the SMTP server using CRAM-MD5 "
- "authentication.",
-
- "CRAM-MD5",
- TRUE
-};
-#endif
-
-static GList *
-query_auth_types (CamelService *service, CamelException *ex)
-{
- /* FIXME: Re-enable this when auth types are actually
- * implemented.
- */
-
- return NULL;
-}
-
-static void
-free_auth_types (CamelService *service, GList *authtypes)
-{
- g_list_free (authtypes);
-}
-
-static char *
-get_name (CamelService *service, gboolean brief)
-{
- if (brief)
- return g_strdup_printf ("SMTP server %s", service->url->host);
- else {
- return g_strdup_printf ("SMTP mail delivery via %s",
- service->url->host);
- }
-}
-
-static gboolean
-_can_send (CamelTransport *transport, CamelMedium *message)
-{
- return CAMEL_IS_MIME_MESSAGE (message);
-}
-
-static gboolean
-_send_to (CamelTransport *transport, CamelMedium *message,
- GList *recipients, CamelException *ex)
-{
- GList *r;
- gchar *recipient, *s, *sender;
- guint i, len;
- CamelSmtpTransport *smtp_transport = CAMEL_SMTP_TRANSPORT (transport);
-
- s = g_strdup(camel_mime_message_get_from (CAMEL_MIME_MESSAGE (message)));
- if (!s) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Cannot send message: "
- "sender address not defined.");
- return FALSE;
- }
-
- sender = smtp_get_email_addr_from_text (s);
- smtp_mail (smtp_transport, sender, ex);
- g_free (sender);
- g_free (s);
-
- if (!(len = g_list_length(recipients))) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "Cannot send message: "
- "no recipients defined.");
- return FALSE;
- }
-
- for (i = 0, r = recipients; i < len; i++, r = r->next) {
- recipient = smtp_get_email_addr_from_text (r->data);
- if (!smtp_rcpt (smtp_transport, recipient, ex)) {
- g_free (recipient);
- return FALSE;
- }
- g_free (recipient);
- }
-
- if (!smtp_data (smtp_transport, message, ex))
- return FALSE;
-
- /* reset the service for our next transfer session */
- smtp_rset (smtp_transport, ex);
-
- return TRUE;
-}
-
-static gboolean
-_send (CamelTransport *transport, CamelMedium *message,
- CamelException *ex)
-{
- const CamelInternetAddress *to, *cc, *bcc;
- GList *recipients = NULL;
- guint index, len;
-
- to = camel_mime_message_get_recipients (CAMEL_MIME_MESSAGE (message), CAMEL_RECIPIENT_TYPE_TO);
- cc = camel_mime_message_get_recipients (CAMEL_MIME_MESSAGE (message), CAMEL_RECIPIENT_TYPE_CC);
- bcc = camel_mime_message_get_recipients (CAMEL_MIME_MESSAGE (message), CAMEL_RECIPIENT_TYPE_BCC);
-
- /* get all of the To addresses into our recipient list */
- len = CAMEL_ADDRESS (to)->addresses->len;
- for (index = 0; index < len; index++) {
- const char *addr;
-
- if (camel_internet_address_get (to, index, NULL, &addr))
- recipients = g_list_append (recipients, g_strdup (addr));
- }
-
- /* get all of the Cc addresses into our recipient list */
- len = CAMEL_ADDRESS (cc)->addresses->len;
- for (index = 0; index < len; index++) {
- const char *addr;
-
- if (camel_internet_address_get (cc, index, NULL, &addr))
- recipients = g_list_append (recipients, g_strdup (addr));
- }
-
- /* get all of the Bcc addresses into our recipient list */
- len = CAMEL_ADDRESS (bcc)->addresses->len;
- for (index = 0; index < len; index++) {
- const char *addr;
-
- if (camel_internet_address_get (bcc, index, NULL, &addr))
- recipients = g_list_append (recipients, g_strdup (addr));
- }
-
- return _send_to (transport, message, recipients, ex);
-}
-
-static gchar *
-smtp_get_email_addr_from_text (gchar *text)
-{
- /* get the actual email address from the string passed and place it in addr
- * we can assume the address will be in one of the following forms:
- * 1) The Name <person@host.com>
- * 2) <person@host.com>
- * 3) person@host.com
- * 4) person@host.com (The Name)
- */
-
- gchar *tmp, *addr = NULL;
- gchar *addr_strt; /* points to start of addr */
- gchar *addr_end; /* points to end of addr */
- gchar *ptr1;
-
-
- /* check the incoming args */
- if (!text || !*text)
- return NULL;
-
- /* scan the string for an open brace */
- for (addr_strt = text; *addr_strt; addr_strt++)
- if (*addr_strt == '<')
- break;
-
- if (*addr_strt) {
- /* we found an open brace, let's look for it's counterpart */
- for (addr_end = addr_strt; *addr_end; addr_end++)
- if (*addr_end == '>')
- break;
-
- /* if we didn't find it, or braces are empty... */
- if (!(*addr_end) || (addr_strt == addr_end - 1))
- return NULL;
-
- /* addr_strt points to '<' and addr_end points to '>'.
- * Now let's adjust 'em slightly to point to the beginning
- * and ending of the email addy
- */
- addr_strt++;
- addr_end--;
- } else {
- /* no open brace...assume type 3 or 4? */
- addr_strt = text;
-
- /* find the end of the email addr/string */
- for (addr_end = addr_strt; *addr_end || *addr_end == ' '; addr_end++);
-
- addr_end--; /* points to NULL, move it back one char */
- }
-
- /* now addr_strt & addr_end point to the beginning & ending of the email addy */
-
- /* copy the string into addr */
- addr = g_strndup (addr_strt, (gint)(addr_end - addr_strt + 1));
-
- for (ptr1 = addr_strt; ptr1 <= addr_end; ptr1++) /* look for an '@' sign */
- if (*ptr1 == '@')
- break;
-
- if (*ptr1 != '@') {
- /* here we found out the name doesn't have an '@' part
- * let's figure out what machine we're on & stick it on the end
- */
- gchar hostname[MAXHOSTNAMELEN];
-
- if (gethostname (hostname, MAXHOSTNAMELEN)) {
- g_free (addr);
- return NULL;
- }
- tmp = addr;
- addr = g_strconcat (tmp, "@", hostname, NULL);
- g_free (tmp);
- }
-
- return addr;
-}
-
-static gboolean
-smtp_helo (CamelSmtpTransport *transport, CamelException *ex)
-{
- /* say hello to the server */
- gchar *cmdbuf, *respbuf = NULL;
- struct hostent *host;
-
- /* get the local host name */
- host = gethostbyaddr ((gchar *)&transport->localaddr.sin_addr, sizeof (transport->localaddr.sin_addr), AF_INET);
-
- /* hiya server! how are you today? */
- if (transport->smtp_is_esmtp) {
- if (host && host->h_name)
- cmdbuf = g_strdup_printf ("EHLO %s\r\n", host->h_name);
- else
- cmdbuf = g_strdup_printf ("EHLO [%s]\r\n", inet_ntoa (transport->localaddr.sin_addr));
- } else {
- if (host && host->h_name)
- cmdbuf = g_strdup_printf ("HELO %s\r\n", host->h_name);
- else
- cmdbuf = g_strdup_printf ("HELO [%s]\r\n", inet_ntoa (transport->localaddr.sin_addr));
- }
-
- d(fprintf (stderr, "sending : %s", cmdbuf));
- if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) {
- g_free (cmdbuf);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "HELO request timed out: "
- "%s: non-fatal",
- g_strerror (errno));
- return FALSE;
- }
- g_free (cmdbuf);
-
- do {
- /* Check for "250" */
- g_free (respbuf);
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream));
-
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-
- if (!respbuf || strncmp (respbuf, "250", 3)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "HELO response error: "
- "%s: non-fatal",
- g_strerror (errno));
- return FALSE;
- }
- if (transport->smtp_is_esmtp && strstr (respbuf, "AUTH")) {
- /* parse for supported AUTH types */
- char *auths = strstr (respbuf, "AUTH") + 4;
-
- transport->esmtp_supported_authtypes = esmtp_get_authtypes (auths);
- }
- } while (*(respbuf+3) == '-'); /* if we got "250-" then loop again */
- g_free (respbuf);
-
- return TRUE;
-}
-
-static gboolean
-smtp_mail (CamelSmtpTransport *transport, gchar *sender, CamelException *ex)
-{
- /* we gotta tell the smtp server who we are. (our email addy) */
- gchar *cmdbuf, *respbuf = NULL;
-
- /* enclose address in <>'s since some SMTP daemons *require* that */
- cmdbuf = g_strdup_printf ("MAIL FROM: <%s>\r\n", sender);
-
- d(fprintf (stderr, "sending : %s", cmdbuf));
-
- if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) {
- g_free (cmdbuf);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "MAIL FROM request timed out: "
- "%s: mail not sent",
- g_strerror (errno));
- return FALSE;
- }
- g_free (cmdbuf);
-
- do {
- /* Check for "250 Sender OK..." */
- g_free (respbuf);
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream));
-
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-
- if (!respbuf || strncmp (respbuf, "250", 3)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "MAIL FROM response error: "
- "%s: mail not sent",
- g_strerror (errno));
- return FALSE;
- }
- } while (*(respbuf+3) == '-'); /* if we got "250-" then loop again */
- g_free (respbuf);
-
- return TRUE;
-}
-
-static gboolean
-smtp_rcpt (CamelSmtpTransport *transport, gchar *recipient, CamelException *ex)
-{
- /* we gotta tell the smtp server who we are going to be sending
- * our email to */
- gchar *cmdbuf, *respbuf = NULL;
-
- /* enclose address in <>'s since some SMTP daemons *require* that */
- cmdbuf = g_strdup_printf ("RCPT TO: <%s>\r\n", recipient);
-
- d(fprintf (stderr, "sending : %s", cmdbuf));
-
- if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) {
- g_free (cmdbuf);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "RCPT TO request timed out: "
- "%s: mail not sent",
- g_strerror (errno));
- return FALSE;
- }
- g_free (cmdbuf);
-
- do {
- /* Check for "250 Sender OK..." */
- g_free (respbuf);
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream));
-
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-
- if (!respbuf || strncmp (respbuf, "250", 3)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "RCPT TO response error: "
- "%s: mail not sent",
- g_strerror (errno));
- return FALSE;
- }
- } while (*(respbuf+3) == '-'); /* if we got "250-" then loop again */
- g_free (respbuf);
-
- return TRUE;
-}
-
-static gboolean
-smtp_data (CamelSmtpTransport *transport, CamelMedium *message, CamelException *ex)
-{
- /* now we can actually send what's important :p */
- gchar *cmdbuf, *respbuf = NULL;
- CamelStreamFilter *filtered_stream;
- CamelMimeFilter *mimefilter;
- gint id;
-
- /* enclose address in <>'s since some SMTP daemons *require* that */
- cmdbuf = g_strdup ("DATA\r\n");
-
- d(fprintf (stderr, "sending : %s", cmdbuf));
-
- if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) {
- g_free (cmdbuf);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "DATA request timed out: "
- "%s: mail not sent",
- g_strerror (errno));
- return FALSE;
- }
- g_free (cmdbuf);
-
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream));
-
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-
- if (!respbuf || strncmp (respbuf, "354", 3)) {
- /* we should have gotten instructions on how to use the DATA command:
- * 354 Enter mail, end with "." on a line by itself
- */
- g_free (respbuf);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "DATA response error: "
- "%s: mail not sent",
- g_strerror (errno));
- return FALSE;
- }
-
- /* setup stream filtering */
- mimefilter = camel_mime_filter_crlf_new (CAMEL_MIME_FILTER_CRLF_ENCODE, CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS);
- filtered_stream = camel_stream_filter_new_with_stream (transport->ostream);
- id = camel_stream_filter_add (filtered_stream, CAMEL_MIME_FILTER (mimefilter));
-
- if (camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), CAMEL_STREAM (filtered_stream)) == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "DATA send timed out: message termination: "
- "%s: mail not sent",
- g_strerror (errno));
- return FALSE;
- }
-
- camel_stream_filter_remove (filtered_stream, id);
- camel_stream_flush (CAMEL_STREAM(filtered_stream));
- camel_object_unref (CAMEL_OBJECT(filtered_stream));
-
- /* terminate the message body */
-
- d(fprintf (stderr, "sending : \\r\\n.\\r\\n\n"));
-
- if (camel_stream_write (transport->ostream, "\r\n.\r\n", 5) == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "DATA send timed out: message termination: "
- "%s: mail not sent",
- g_strerror (errno));
- return FALSE;
- }
-
- do {
- /* Check for "250 Sender OK..." */
- g_free (respbuf);
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream));
-
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-
- if (!respbuf || strncmp (respbuf, "250", 3)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "DATA response error: message termination: "
- "%s: mail not sent",
- g_strerror (errno));
- return FALSE;
- }
- } while (*(respbuf+3) == '-'); /* if we got "250-" then loop again */
- g_free (respbuf);
-
- return TRUE;
-}
-
-static gboolean
-smtp_rset (CamelSmtpTransport *transport, CamelException *ex)
-{
- /* we are going to reset the smtp server (just to be nice) */
- gchar *cmdbuf, *respbuf = NULL;
-
- cmdbuf = g_strdup ("RSET\r\n");
-
- d(fprintf (stderr, "sending : %s", cmdbuf));
-
- if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) {
- g_free (cmdbuf);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "RSET request timed out: "
- "%s",
- g_strerror (errno));
- return FALSE;
- }
- g_free (cmdbuf);
-
- do {
- /* Check for "250" */
- g_free (respbuf);
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream));
-
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-
- if (!respbuf || strncmp (respbuf, "250", 3)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "RSET response error: "
- "%s",
- g_strerror (errno));
- return FALSE;
- }
- } while (*(respbuf+3) == '-'); /* if we got "250-" then loop again */
- g_free (respbuf);
-
- return TRUE;
-}
-
-static gboolean
-smtp_quit (CamelSmtpTransport *transport, CamelException *ex)
-{
- /* we are going to reset the smtp server (just to be nice) */
- gchar *cmdbuf, *respbuf = NULL;
-
- cmdbuf = g_strdup ("QUIT\r\n");
-
- d(fprintf (stderr, "sending : %s", cmdbuf));
-
- if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) {
- g_free (cmdbuf);
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "QUIT request timed out: "
- "%s: non-fatal",
- g_strerror (errno));
- return FALSE;
- }
- g_free (cmdbuf);
-
- do {
- /* Check for "221" */
- g_free (respbuf);
- respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream));
-
- d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
-
- if (!respbuf || strncmp (respbuf, "221", 3)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "QUIT response error: "
- "%s: non-fatal",
- g_strerror (errno));
- return FALSE;
- }
- } while (*(respbuf+3) == '-'); /* if we got "221-" then loop again */
- g_free (respbuf);
-
- return TRUE;
-}
diff --git a/camel/providers/smtp/camel-smtp-transport.h b/camel/providers/smtp/camel-smtp-transport.h
deleted file mode 100644
index 21bdaa03f7..0000000000
--- a/camel/providers/smtp/camel-smtp-transport.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-smtp-transport.h : class for an smtp transfer */
-
-/*
- * Authors:
- * Jeffrey Stedfast <fejj@stampede.org>
- *
- * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.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 CAMEL_SMTP_TRANSPORT_H
-#define CAMEL_SMTP_TRANSPORT_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include "camel-transport.h"
-
-#define CAMEL_SMTP_TRANSPORT_TYPE (camel_smtp_transport_get_type ())
-#define CAMEL_SMTP_TRANSPORT(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SMTP_TRANSPORT_TYPE, CamelSmtpTransport))
-#define CAMEL_SMTP_TRANSPORT_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SMTP_TRANSPORT_TYPE, CamelSmtpTransportClass))
-#define IS_CAMEL_SMTP_TRANSPORT(o) (CAMEL_CHECK_TYPE((o), CAMEL_SMTP_TRANSPORT_TYPE))
-
-
-typedef struct {
- CamelTransport parent_object;
-
- CamelStream *istream, *ostream;
-
- gboolean smtp_is_esmtp;
-
- struct sockaddr_in localaddr;
-
- GList *esmtp_supported_authtypes;
-
-} CamelSmtpTransport;
-
-
-
-typedef struct {
- CamelTransportClass parent_class;
-
-} CamelSmtpTransportClass;
-
-
-/* Standard Camel function */
-CamelType camel_smtp_transport_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_SMTP_TRANSPORT_H */
-
-
diff --git a/camel/providers/smtp/libcamelsmtp.urls b/camel/providers/smtp/libcamelsmtp.urls
deleted file mode 100644
index ec2fc0fc16..0000000000
--- a/camel/providers/smtp/libcamelsmtp.urls
+++ /dev/null
@@ -1 +0,0 @@
-smtp
diff --git a/camel/providers/vee/.cvsignore b/camel/providers/vee/.cvsignore
deleted file mode 100644
index fd6b811c68..0000000000
--- a/camel/providers/vee/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-.deps
-*.lo
-*.la
diff --git a/camel/providers/vee/Makefile.am b/camel/providers/vee/Makefile.am
deleted file mode 100644
index 6c0693b02d..0000000000
--- a/camel/providers/vee/Makefile.am
+++ /dev/null
@@ -1,37 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-libcamelveeincludedir = $(includedir)/camel
-
-
-providerdir = $(pkglibdir)/camel-providers/$(VERSION)
-
-provider_LTLIBRARIES = libcamelvee.la
-provider_DATA = libcamelvee.urls
-
-INCLUDES = -I.. \
- -I$(srcdir)/.. \
- -I$(top_srcdir)/camel \
- -I$(top_srcdir)/intl \
- -I$(top_srcdir)/libibex \
- -I$(top_srcdir)/e-util \
- -I$(top_srcdir) \
- -I$(includedir) \
- $(GTK_INCLUDEDIR) \
- -DG_LOG_DOMAIN=\"camel-vee-provider\"
-
-libcamelvee_la_SOURCES = \
- camel-vee-folder.c \
- camel-vee-provider.c \
- camel-vee-store.c
-
-libcamelveeinclude_HEADERS = \
- camel-vee-folder.h \
- camel-vee-store.h
-
-libcamelvee_la_LDFLAGS = -version-info 0:0:0
-
-libcamelvee_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS)
-#libcamelvee_la_LIBADD = $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS)
-
-EXTRA_DIST = libcamelvee.urls
-
diff --git a/camel/providers/vee/camel-vee-folder.c b/camel/providers/vee/camel-vee-folder.c
deleted file mode 100644
index 26e6be2667..0000000000
--- a/camel/providers/vee/camel-vee-folder.c
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.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
- */
-
-#include "camel-exception.h"
-#include "camel-vee-folder.h"
-#include "camel-folder-summary.h"
-#include "camel-mime-message.h"
-
-#include <string.h>
-
-/* our message info includes the parent folder */
-typedef struct _CamelVeeMessageInfo {
- CamelMessageInfo info;
- CamelFolder *folder;
-} CamelVeeMessageInfo;
-
-struct _CamelVeeFolderPrivate {
- GList *folders;
-};
-
-#define _PRIVATE(o) (((CamelVeeFolder *)(o))->priv)
-
-static void vee_init (CamelFolder *folder, CamelStore *parent_store,
- CamelFolder *parent_folder, const gchar *name,
- gchar *separator, gboolean path_begins_with_sep,
- CamelException *ex);
-static void vee_sync (CamelFolder *folder, gboolean expunge, CamelException *ex);
-
-static GPtrArray *vee_get_uids (CamelFolder *folder);
-GPtrArray *vee_get_summary (CamelFolder *folder);
-
-static gint vee_get_message_count (CamelFolder *folder);
-static gint vee_get_unread_message_count (CamelFolder *folder);
-static CamelMimeMessage *vee_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex);
-
-static const CamelMessageInfo *vee_get_message_info (CamelFolder *folder, const char *uid);
-static GPtrArray *vee_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex);
-
-static guint32 vee_get_message_flags (CamelFolder *folder, const char *uid);
-static void vee_set_message_flags (CamelFolder *folder, const char *uid, guint32 flags, guint32 set);
-static gboolean vee_get_message_user_flag (CamelFolder *folder, const char *uid, const char *name);
-static void vee_set_message_user_flag (CamelFolder *folder, const char *uid, const char *name, gboolean value);
-
-
-static void camel_vee_folder_class_init (CamelVeeFolderClass *klass);
-static void camel_vee_folder_init (CamelVeeFolder *obj);
-static void camel_vee_folder_finalise (CamelObject *obj);
-
-static void vee_folder_build(CamelVeeFolder *vf, CamelException *ex);
-static void vee_folder_build_folder(CamelVeeFolder *vf, CamelFolder *source, CamelException *ex);
-
-static CamelFolderClass *camel_vee_folder_parent;
-
-CamelType
-camel_vee_folder_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_folder_get_type (), "CamelVeeFolder",
- sizeof (CamelVeeFolder),
- sizeof (CamelVeeFolderClass),
- (CamelObjectClassInitFunc) camel_vee_folder_class_init,
- NULL,
- (CamelObjectInitFunc) camel_vee_folder_init,
- (CamelObjectFinalizeFunc) camel_vee_folder_finalise);
- }
-
- return type;
-}
-
-static void
-camel_vee_folder_class_init (CamelVeeFolderClass *klass)
-{
- CamelFolderClass *folder_class = (CamelFolderClass *) klass;
-
- camel_vee_folder_parent = CAMEL_FOLDER_CLASS(camel_type_get_global_classfuncs (camel_folder_get_type ()));
-
- folder_class->init = vee_init;
- folder_class->sync = vee_sync;
-
- folder_class->get_uids = vee_get_uids;
- folder_class->free_uids = camel_folder_free_deep;
- folder_class->get_summary = vee_get_summary;
- folder_class->free_summary = camel_folder_free_nop;
- folder_class->get_message = vee_get_message;
-
- folder_class->get_message_info = vee_get_message_info;
-
- folder_class->get_message_count = vee_get_message_count;
- folder_class->get_unread_message_count = vee_get_unread_message_count;
- folder_class->search_by_expression = vee_search_by_expression;
-
- folder_class->get_message_flags = vee_get_message_flags;
- folder_class->set_message_flags = vee_set_message_flags;
- folder_class->get_message_user_flag = vee_get_message_user_flag;
- folder_class->set_message_user_flag = vee_set_message_user_flag;
-}
-
-static void
-camel_vee_folder_init (CamelVeeFolder *obj)
-{
- struct _CamelVeeFolderPrivate *p;
-
- p = _PRIVATE(obj) = g_malloc0(sizeof(*p));
-}
-
-static void
-camel_vee_folder_finalise (CamelObject *obj)
-{
- CamelVeeFolder *vf = (CamelVeeFolder *)obj;
- struct _CamelVeeFolderPrivate *p = _PRIVATE(vf);
- GList *node;
-
- node = p->folders;
- while (node) {
- CamelFolder *f = node->data;
- camel_object_unref((CamelObject *)f);
- node = g_list_next(node);
- }
-}
-
-/**
- * camel_vee_folder_new:
- *
- * Create a new CamelVeeFolder object.
- *
- * Return value: A new CamelVeeFolder widget.
- **/
-CamelVeeFolder *
-camel_vee_folder_new (void)
-{
- CamelVeeFolder *new = CAMEL_VEE_FOLDER ( camel_object_new (camel_vee_folder_get_type ()));
- return new;
-}
-
-static void
-folder_changed(CamelFolder *sub, gpointer type, CamelVeeFolder *vf)
-{
- CamelException *ex;
-
- ex = camel_exception_new();
- vee_folder_build_folder(vf, sub, ex);
- camel_exception_free(ex);
- /* FIXME: should only raise follow-on event if the result changed */
- camel_object_trigger_event( CAMEL_OBJECT(vf), "folder_changed", GINT_TO_POINTER(0));
-}
-
-/* track flag changes in the summary */
-static void
-message_changed(CamelFolder *f, const char *uid, CamelVeeFolder *mf)
-{
- const CamelMessageInfo *info;
- CamelMessageInfo *vinfo;
- CamelFlag *flag;
- char *vuid;
-
- info = camel_folder_get_message_info(f, uid);
-
- vuid = g_strdup_printf("%p:%s", f, uid);
- vinfo = (CamelMessageInfo *)vee_get_message_info((CamelFolder *)mf, vuid);
- if (info && vinfo) {
- vinfo->flags = info->flags;
- camel_flag_list_free(&vinfo->user_flags);
- flag = info->user_flags;
- while (flag) {
- camel_flag_set(&vinfo->user_flags, flag->name, TRUE);
- flag = flag->next;
- }
- camel_object_trigger_event( CAMEL_OBJECT(mf), "message_changed", vinfo->uid);
- }
- g_free(vuid);
-}
-
-void
-camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub)
-{
- struct _CamelVeeFolderPrivate *p = _PRIVATE(vf);
- CamelException *ex;
-
- camel_object_ref((CamelObject *)sub);
- p->folders = g_list_append(p->folders, sub);
-
- camel_object_hook_event ((CamelObject *)sub, "folder_changed", (CamelObjectEventHookFunc) folder_changed, vf);
- camel_object_hook_event ((CamelObject *)sub, "message_changed", (CamelObjectEventHookFunc) message_changed, vf);
-
- ex = camel_exception_new();
- vee_folder_build_folder(vf, sub, ex);
- camel_exception_free(ex);
- /* FIXME: should only raise follow-on event if the result changed */
- camel_object_trigger_event( CAMEL_OBJECT(vf), "folder_changed", GINT_TO_POINTER(0));
-}
-
-
-static void vee_init (CamelFolder *folder, CamelStore *parent_store,
- CamelFolder *parent_folder, const gchar *name,
- gchar *separator, gboolean path_begins_with_sep,
- CamelException *ex)
-{
- CamelVeeFolder *vf = (CamelVeeFolder *)folder;
- char *namepart, *searchpart;
-
- namepart = g_strdup(name);
- searchpart = strchr(namepart, '?');
- if (searchpart == NULL) {
- /* no search, no result! */
- searchpart = "(body-contains \"=some-invalid_string-sequence=xx\")";
- } else {
- *searchpart++ = 0;
- }
-
- camel_vee_folder_parent->init (folder, parent_store, parent_folder, name, separator, TRUE, ex);
- if (camel_exception_get_id (ex))
- return;
-
- folder->can_hold_messages = TRUE;
- folder->can_hold_folders = FALSE;
- folder->has_summary_capability = TRUE;
- folder->has_search_capability = TRUE;
-
- /* FIXME: what to do about user flags if the subfolder doesn't support them? */
- folder->permanent_flags = CAMEL_MESSAGE_ANSWERED |
- CAMEL_MESSAGE_DELETED |
- CAMEL_MESSAGE_DRAFT |
- CAMEL_MESSAGE_FLAGGED |
- CAMEL_MESSAGE_SEEN;
-
- vf->messages = g_ptr_array_new();
- vf->messages_uid = g_hash_table_new(g_str_hash, g_str_equal);
-
- vf->expression = g_strdup_printf("(or\n (match-all (user-flag \"%s\"))\n %s\n)", namepart, searchpart);
- vf->vname = g_strdup(namepart);
-
- g_free(namepart);
-
- vee_folder_build(vf, ex);
-}
-
-static void
-vee_sync (CamelFolder *folder, gboolean expunge, CamelException *ex)
-{
- ;
-}
-
-static gint vee_get_message_count (CamelFolder *folder)
-{
- CamelVeeFolder *vf = (CamelVeeFolder *)folder;
-
- return vf->messages->len;
-}
-
-static gint
-vee_get_unread_message_count (CamelFolder *folder)
-{
- CamelVeeFolder *vee_folder = CAMEL_VEE_FOLDER (folder);
- CamelMessageInfo *info;
- GPtrArray *infolist;
- gint i, count = 0;
-
- g_return_val_if_fail (folder != NULL, -1);
-
- infolist = vee_folder->messages;
-
- for (i = 0; i < infolist->len; i++) {
- info = (CamelMessageInfo *) g_ptr_array_index (infolist, i);
- if (!(info->flags & CAMEL_MESSAGE_SEEN))
- count++;
- }
-
- return count;
-}
-
-static gboolean
-get_real_message(CamelFolder *folder, const char *uid, CamelFolder **out_folder, const char **out_uid)
-{
- CamelVeeMessageInfo *mi;
-
- mi = (CamelVeeMessageInfo *)vee_get_message_info(folder, uid);
- g_return_val_if_fail(mi != NULL, FALSE);
-
- *out_folder = mi->folder;
- *out_uid = strchr(mi->info.uid, ':')+1;
- return TRUE;
-}
-
-static CamelMimeMessage *vee_get_message(CamelFolder *folder, const gchar *uid, CamelException *ex)
-{
- const char *real_uid;
- CamelFolder *real_folder;
-
- if (!get_real_message(folder, uid, &real_folder, &real_uid)) {
- camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID,
- "No such message %s in %s", uid,
- folder->name);
- return NULL;
- }
-
- return camel_folder_get_message (real_folder, real_uid, ex);
-}
-
-GPtrArray *vee_get_summary(CamelFolder *folder)
-{
- CamelVeeFolder *vf = (CamelVeeFolder *)folder;
-
- return vf->messages;
-}
-
-static const CamelMessageInfo *vee_get_message_info(CamelFolder *f, const char *uid)
-{
- CamelVeeFolder *vf = (CamelVeeFolder *)f;
-
- return g_hash_table_lookup(vf->messages_uid, uid);
-}
-
-static GPtrArray *vee_get_uids (CamelFolder *folder)
-{
- GPtrArray *result;
- int i;
- CamelVeeFolder *vf = (CamelVeeFolder *)folder;
-
- result = g_ptr_array_new ();
- g_ptr_array_set_size (result, vf->messages->len);
- for (i=0;i<vf->messages->len;i++) {
- CamelMessageInfo *mi = g_ptr_array_index(vf->messages, i);
- result->pdata[i] = g_strdup(mi->uid);
- }
-
- return result;
-}
-
-static GPtrArray *
-vee_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex)
-{
- GList *node;
- GPtrArray *matches, *result = g_ptr_array_new ();
- char *expr;
- CamelVeeFolder *vf = (CamelVeeFolder *)folder;
- struct _CamelVeeFolderPrivate *p = _PRIVATE(vf);
-
- expr = g_strdup_printf("(and %s %s)", vf->expression, expression);
- node = p->folders;
- while (node) {
- CamelFolder *f = node->data;
- int i;
-
- matches = camel_folder_search_by_expression(f, expression, ex);
- for (i = 0; i < matches->len; i++) {
- char *uid = matches->pdata[i];
- g_ptr_array_add(result, g_strdup_printf("%p:%s", f, uid));
- }
- camel_folder_search_free(f, matches);
- node = g_list_next(node);
- }
- return result;
-}
-
-static guint32
-vee_get_message_flags(CamelFolder *folder, const char *uid)
-{
- const char *real_uid;
- CamelFolder *real_folder;
-
- if (!get_real_message (folder, uid, &real_folder, &real_uid))
- return 0;
-
- return camel_folder_get_message_flags(real_folder, real_uid);
-}
-
-static void
-vee_set_message_flags(CamelFolder *folder, const char *uid, guint32 flags, guint32 set)
-{
- const char *real_uid;
- CamelFolder *real_folder;
-
- if (!get_real_message(folder, uid, &real_folder, &real_uid))
- return;
-
- camel_folder_set_message_flags(real_folder, real_uid, flags, set);
-}
-
-static gboolean
-vee_get_message_user_flag(CamelFolder *folder, const char *uid, const char *name)
-{
- const char *real_uid;
- CamelFolder *real_folder;
-
- if (!get_real_message(folder, uid, &real_folder, &real_uid))
- return FALSE;
-
- return camel_folder_get_message_user_flag(real_folder, real_uid, name);
-}
-
-static void
-vee_set_message_user_flag(CamelFolder *folder, const char *uid,
- const char *name, gboolean value)
-{
- const char *real_uid;
- CamelFolder *real_folder;
-
- if (!get_real_message(folder, uid, &real_folder, &real_uid))
- return;
-
- return camel_folder_set_message_user_flag(real_folder, real_uid, name, value);
-}
-
-
-/*
- need incremental update, based on folder.
- Need to watch folders for changes and update accordingly.
-*/
-
-/* this does most of the vfolder magic */
-static void
-vee_folder_build(CamelVeeFolder *vf, CamelException *ex)
-{
- struct _CamelVeeFolderPrivate *p = _PRIVATE(vf);
- GList *node;
- int i;
- GPtrArray *messages;
- GHashTable *messages_uid;
-
- for (i=0;i<vf->messages->len;i++) {
- CamelMessageInfo *mi = g_ptr_array_index(vf->messages, i);
- camel_message_info_free(mi);
- }
-
- messages = g_ptr_array_new();
- messages_uid = g_hash_table_new(g_str_hash, g_str_equal);
-
- node = p->folders;
- while (node) {
- GPtrArray *matches;
- CamelFolder *f = node->data;
- CamelVeeMessageInfo *mi;
- const CamelMessageInfo *info;
- int i;
-
- matches = camel_folder_search_by_expression(f, vf->expression, ex);
- for (i = 0; i < matches->len; i++) {
- info = camel_folder_get_message_info(f, matches->pdata[i]);
- if (info) {
- mi = g_malloc0(sizeof(*mi));
- camel_message_info_dup_to(info, (CamelMessageInfo *)mi);
- g_free (mi->info.uid);
- mi->info.uid = g_strdup_printf("%p:%s", f, info->uid);
- mi->folder = f;
- g_ptr_array_add(messages, mi);
- g_hash_table_insert(messages_uid, mi->info.uid, mi);
- }
- }
- camel_folder_search_free(f, matches);
- node = g_list_next(node);
- }
-
- g_ptr_array_free(vf->messages, TRUE);
- vf->messages = messages;
- g_hash_table_destroy(vf->messages_uid);
- vf->messages_uid = messages_uid;
-}
-
-
-/* build query contents for a single folder */
-static void
-vee_folder_build_folder(CamelVeeFolder *vf, CamelFolder *source, CamelException *ex)
-{
- GPtrArray *matches;
- CamelFolder *f = source;
- CamelVeeMessageInfo *mi;
- const CamelMessageInfo *info;
-
- GPtrArray *messages;
- GHashTable *messages_uid;
- int i;
-
- for (i=0;i<vf->messages->len;i++) {
- CamelVeeMessageInfo *mi = g_ptr_array_index(vf->messages, i);
- if (mi->folder == source) {
- g_hash_table_remove(vf->messages_uid, mi->info.uid);
- g_ptr_array_remove_index_fast(vf->messages, i);
-
- camel_message_info_free((CamelMessageInfo *)mi);
- i--;
- }
- }
-
- messages = vf->messages;
- messages_uid = vf->messages_uid;
-
- matches = camel_folder_search_by_expression(f, vf->expression, ex);
- for (i = 0; i < matches->len; i++) {
- info = camel_folder_get_message_info(f, matches->pdata[i]);
- if (info) {
- mi = g_malloc0(sizeof(*mi));
- camel_message_info_dup_to(info, (CamelMessageInfo*)mi);
- g_free (mi->info.uid);
- mi->info.uid = g_strdup_printf("%p:%s", f, info->uid);
- mi->folder = f;
- g_ptr_array_add(messages, mi);
- g_hash_table_insert(messages_uid, mi->info.uid, mi);
- }
- }
- camel_folder_search_free(f, matches);
-}
-
-
-/*
-
- (match-folder "folder1" "folder2")
-
- */
diff --git a/camel/providers/vee/camel-vee-folder.h b/camel/providers/vee/camel-vee-folder.h
deleted file mode 100644
index 6f7c788125..0000000000
--- a/camel/providers/vee/camel-vee-folder.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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 _CAMEL_VEE_FOLDER_H
-#define _CAMEL_VEE_FOLDER_H
-
-#include <camel/camel-folder.h>
-
-#define CAMEL_VEE_FOLDER(obj) CAMEL_CHECK_CAST (obj, camel_vee_folder_get_type (), CamelVeeFolder)
-#define CAMEL_VEE_FOLDER_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_vee_folder_get_type (), CamelVeeFolderClass)
-#define IS_CAMEL_VEE_FOLDER(obj) CAMEL_CHECK_TYPE (obj, camel_vee_folder_get_type ())
-
-typedef struct _CamelVeeFolder CamelVeeFolder;
-typedef struct _CamelVeeFolderClass CamelVeeFolderClass;
-
-struct _CamelVeeFolder {
- CamelFolder parent;
-
- struct _CamelVeeFolderPrivate *priv;
-
- char *expression; /* query expression */
- char *vname; /* local name */
- CamelFolder *local; /* local storage for folder */
-
- /* FIXME: Move this to a summary object??? */
- GPtrArray *messages; /* message info's */
- GHashTable *messages_uid;
-};
-
-struct _CamelVeeFolderClass {
- CamelFolderClass parent_class;
-};
-
-guint camel_vee_folder_get_type (void);
-CamelVeeFolder *camel_vee_folder_new (void);
-
-void camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub);
-
-#endif /* ! _CAMEL_VEE_FOLDER_H */
diff --git a/camel/providers/vee/camel-vee-provider.c b/camel/providers/vee/camel-vee-provider.c
deleted file mode 100644
index e36e7fcff1..0000000000
--- a/camel/providers/vee/camel-vee-provider.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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
- */
-
-#include "config.h"
-#include "camel-vee-store.h"
-#include "camel-provider.h"
-#include "camel-session.h"
-#include "camel-url.h"
-
-static CamelProvider vee_provider = {
- "vfolder",
- "Virtual folder email provider",
-
- "For reading mail as a query of another set of folders",
-
- "vfolder",
-
- 0,
-
- { 0, 0 },
-
- NULL
-};
-
-void
-camel_provider_module_init (CamelSession *session)
-{
- vee_provider.object_types[CAMEL_PROVIDER_STORE] =
- camel_vee_store_get_type();
-
- vee_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal);
-
- camel_session_register_provider (session, &vee_provider);
-}
diff --git a/camel/providers/vee/camel-vee-store.c b/camel/providers/vee/camel-vee-store.c
deleted file mode 100644
index 8be8298b2c..0000000000
--- a/camel/providers/vee/camel-vee-store.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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
- */
-
-#include "camel-vee-store.h"
-#include "camel-vee-folder.h"
-
-static CamelFolder *vee_get_folder (CamelStore *store, const char *folder_name, gboolean create, CamelException *ex);
-static char *vee_get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex);
-
-struct _CamelVeeStorePrivate {
-};
-
-#define _PRIVATE(o) (((CamelVeeStore *)(o))->priv)
-
-static void camel_vee_store_class_init (CamelVeeStoreClass *klass);
-static void camel_vee_store_init (CamelVeeStore *obj);
-
-static CamelStoreClass *camel_vee_store_parent;
-
-CamelType
-camel_vee_store_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (camel_store_get_type (), "CamelVeeStore",
- sizeof (CamelVeeStore),
- sizeof (CamelVeeStoreClass),
- (CamelObjectClassInitFunc) camel_vee_store_class_init,
- NULL,
- (CamelObjectInitFunc) camel_vee_store_init,
- NULL);
- }
-
- return type;
-}
-
-static void
-
-camel_vee_store_class_init (CamelVeeStoreClass *klass)
-{
- CamelStoreClass *store_class = (CamelStoreClass *) klass;
-
- camel_vee_store_parent = CAMEL_STORE_CLASS(camel_type_get_global_classfuncs (camel_store_get_type ()));
-
- /* virtual method overload */
- store_class->get_folder = vee_get_folder;
- store_class->get_folder_name = vee_get_folder_name;
-}
-
-static void
-camel_vee_store_init (CamelVeeStore *obj)
-{
- struct _CamelVeeStorePrivate *p;
-
- p = _PRIVATE(obj) = g_malloc0(sizeof(*p));
-}
-
-/**
- * camel_vee_store_new:
- *
- * Create a new CamelVeeStore object.
- *
- * Return value: A new CamelVeeStore widget.
- **/
-CamelVeeStore *
-camel_vee_store_new (void)
-{
- CamelVeeStore *new = CAMEL_VEE_STORE ( camel_object_new (camel_vee_store_get_type ()));
- return new;
-}
-
-static CamelFolder *
-vee_get_folder (CamelStore *store, const char *folder_name, gboolean create, CamelException *ex)
-{
- CamelFolder *folder;
-
- folder = CAMEL_FOLDER (camel_object_new (camel_vee_folder_get_type()));
-
- ((CamelFolderClass *)(CAMEL_OBJECT_GET_CLASS(folder)))->init (folder, store, NULL, folder_name, "/", TRUE, ex);
- return folder;
-}
-
-static char *
-vee_get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex)
-{
- return g_strdup(folder_name);
-}
-
diff --git a/camel/providers/vee/camel-vee-store.h b/camel/providers/vee/camel-vee-store.h
deleted file mode 100644
index d4ed7a0610..0000000000
--- a/camel/providers/vee/camel-vee-store.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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 _CAMEL_VEE_STORE_H
-#define _CAMEL_VEE_STORE_H
-
-#include <camel/camel-store.h>
-
-#define CAMEL_VEE_STORE(obj) CAMEL_CHECK_CAST (obj, camel_vee_store_get_type (), CamelVeeStore)
-#define CAMEL_VEE_STORE_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_vee_store_get_type (), CamelVeeStoreClass)
-#define IS_CAMEL_VEE_STORE(obj) CAMEL_CHECK_TYPE (obj, camel_vee_store_get_type ())
-
-typedef struct _CamelVeeStore CamelVeeStore;
-typedef struct _CamelVeeStoreClass CamelVeeStoreClass;
-
-struct _CamelVeeStore {
- CamelStore parent;
-
- struct _CamelVeeStorePrivate *priv;
-};
-
-struct _CamelVeeStoreClass {
- CamelStoreClass parent_class;
-};
-
-guint camel_vee_store_get_type (void);
-CamelVeeStore *camel_vee_store_new (void);
-
-#endif /* ! _CAMEL_VEE_STORE_H */
diff --git a/camel/providers/vee/libcamelvee.urls b/camel/providers/vee/libcamelvee.urls
deleted file mode 100644
index 6fa58dadb5..0000000000
--- a/camel/providers/vee/libcamelvee.urls
+++ /dev/null
@@ -1 +0,0 @@
-vfolder
diff --git a/camel/string-utils.c b/camel/string-utils.c
deleted file mode 100644
index 023aee16af..0000000000
--- a/camel/string-utils.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* string-util : utilities for gchar* strings */
-
-/*
- *
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include "string-utils.h"
-#include "string.h"
-
-gboolean
-string_equal_for_glist (gconstpointer v, gconstpointer v2)
-{
- return (!strcmp ( ((const gchar *)v), ((const gchar*)v2))) == 0;
-}
-
-/* utility func : frees a gchar element in a GList */
-static void
-__string_list_free_string (gpointer data, gpointer user_data)
-{
- gchar *string = (gchar *)data;
- g_free (string);
-}
-
-void
-string_list_free (GList *string_list)
-{
- if (string_list == NULL) return;
-
- g_list_foreach (string_list, __string_list_free_string, NULL);
- g_list_free (string_list);
-}
-
-GList *
-string_split (const gchar *string, char sep, const gchar *trim_chars, StringTrimOption trim_options)
-{
- GList *result = NULL;
- gint first, last, pos;
- gchar *new_string;
-
- g_assert (string);
-
- first = 0;
- last = strlen(string) - 1;
-
- /* strip leading and trailing separators */
- while ( (first<=last) && (string[first]==sep) )
- first++;
- while ( (first<=last) && (string[last]==sep) )
- last--;
-
-
- while (first<=last) {
- pos = first;
- /* find next separator */
- while ((pos<=last) && (string[pos]!=sep)) pos++;
- if (first != pos) {
- new_string = g_strndup (string+first, pos-first);
- /* could do trimming in line to speed up this code */
- if (trim_chars) string_trim (new_string, trim_chars, trim_options);
- result = g_list_append (result, new_string);
- }
- first = pos + 1;
- }
-
- return result;
-}
-
-void
-string_trim (gchar *string, const gchar *trim_chars, StringTrimOption options)
-{
- gint first_ok;
- gint last_ok;
- guint length;
-
- g_return_if_fail (string);
- length = strlen (string);
- if (length==0)
- return;
-
- first_ok = 0;
- last_ok = length - 1;
-
- if (options & STRING_TRIM_STRIP_LEADING)
- while ( (first_ok <= last_ok) && (strchr (trim_chars, string[first_ok])!=NULL) )
- first_ok++;
-
- if (options & STRING_TRIM_STRIP_TRAILING)
- while ( (first_ok <= last_ok) && (strchr (trim_chars, string[last_ok])!=NULL) )
- last_ok--;
-
- if (first_ok > 0)
- memmove (string, string+first_ok, last_ok - first_ok + 1);
- string[last_ok - first_ok +1] = '\0';
-
-}
-
-
-/**
- * remove_suffix: remove a suffix from a string
- * @s: the string to remove the suffix from.
- * @suffix: the suffix to remove
- * @suffix_found : suffix found flag
- *
- * Remove a suffix from a string. If the
- * string ends with the full suffix, a copy
- * of the string without the suffix is returned and
- * @suffix_found is set to %TRUE.
- * Otherwise, NULL is returned and
- * @suffix_found is set to %FALSE.
- *
- * Return value: an allocated copy of the string without the suffix or NULL if the suffix was not found.
- **/
-gchar *
-string_prefix (const gchar *s, const gchar *suffix, gboolean *suffix_found)
-{
- guint s_len, suf_len;
- guint suffix_pos;
- char *result_string;
-
- g_assert (s);
- g_assert (suffix);
- g_assert (suffix_found);
-
- s_len = strlen (s);
- suf_len = strlen (suffix);
-
- /* if the string is shorter than the suffix, do nothing */
- if (s_len < suf_len) {
- *suffix_found = FALSE;
- return NULL;
- }
-
- /* theoretical position of the prefix */
- suffix_pos = s_len - suf_len;
-
- /* compare the right hand side of the string with the suffix */
- if (!strncmp (s+suffix_pos, suffix, suf_len)) {
-
- /* if the suffix matches, check that there are
- characters before */
- if (suffix_pos == 0) {
- result_string = NULL;
- *suffix_found = TRUE;
- } else {
- result_string = g_strndup (s, suffix_pos);
- *suffix_found = TRUE;
- }
-
- } else {
- result_string = NULL;
- *suffix_found = FALSE;
- }
-
- return result_string;
-}
-
-void
-string_unquote (gchar *string)
-{
- /* if the string is quoted, unquote it */
-
- g_return_if_fail (string != NULL);
-
- if (*string == '"' && *(string + strlen (string) - 1) == '"') {
- *(string + strlen (string) - 1) = '\0';
- if (*string)
- memmove (string, string+1, strlen (string));
- }
-}
-
-gchar *
-strip (gchar *string, gchar c)
-{
- /* strip all occurances of c from the string */
- gchar *src, *dst;
-
- g_return_val_if_fail (string != NULL, NULL);
-
- for (src = dst = string; *src; src++)
- if (*src != c)
- *dst++ = *src;
- *dst = '\0';
-
- return string;
-}
diff --git a/camel/string-utils.h b/camel/string-utils.h
deleted file mode 100644
index 1556faa1df..0000000000
--- a/camel/string-utils.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* string-util : utilities for normal gchar * strings */
-
-/*
- *
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.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 STRING_UTIL_H
-#define STRING_UTIL_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <glib.h>
-
-typedef enum {
- STRING_TRIM_NONE = 0,
- STRING_TRIM_STRIP_TRAILING = 1,
- STRING_TRIM_STRIP_LEADING = 2
-} StringTrimOption;
-
-
-
-gboolean string_equal_for_glist (gconstpointer v, gconstpointer v2);
-
-void string_list_free (GList *string_list);
-
-GList *string_split (const gchar *string, char sep,
- const gchar *trim_chars, StringTrimOption trim_options);
-void string_trim (gchar *string, const gchar *chars,
- StringTrimOption options);
-
-gchar *string_prefix (const gchar *s, const gchar *suffix,
- gboolean *suffix_found);
-
-void string_unquote (gchar *string);
-
-gchar *strip (gchar *string, gchar c);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* STRING_UTIL_H */
diff --git a/composer/.cvsignore b/composer/.cvsignore
deleted file mode 100644
index 8acab05c77..0000000000
--- a/composer/.cvsignore
+++ /dev/null
@@ -1,12 +0,0 @@
-.deps
-.libs
-evolution-msg-composer
-Makefile
-Makefile.in
-*.lo
-*.la
-Evolution-Addressbook-SelectNames-stubs.c
-Evolution-Addressbook-SelectNames-skels.c
-Evolution-Addressbook-SelectNames-common.c
-Evolution-Addressbook-SelectNames.h
-
diff --git a/composer/ChangeLog b/composer/ChangeLog
deleted file mode 100644
index 9f5db71457..0000000000
--- a/composer/ChangeLog
+++ /dev/null
@@ -1,580 +0,0 @@
-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/Makefile.am b/composer/Makefile.am
deleted file mode 100644
index bb0f18b036..0000000000
--- a/composer/Makefile.am
+++ /dev/null
@@ -1,69 +0,0 @@
-## CORBA stuff
-
-IDLS = \
- $(top_srcdir)/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl
-
-IDL_GENERATED = \
- Evolution-Addressbook-SelectNames.h \
- Evolution-Addressbook-SelectNames-common.c \
- Evolution-Addressbook-SelectNames-skels.c \
- Evolution-Addressbook-SelectNames-stubs.c
-
-Evolution-Addressbook-SelectNames-impl.o: Evolution-Addressbook-SelectNames.h
-
-$(IDL_GENERATED): $(IDLS)
- $(ORBIT_IDL) -I$(datadir)/idl `$(GNOME_CONFIG) --cflags idl` \
- $(top_srcdir)/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl
-
-##
-
-gladedir = $(datadir)/evolution/glade
-
-glade_DATA = \
- e-msg-composer-address-dialog.glade \
- e-msg-composer-address-dialog.glade.h \
- e-msg-composer-attachment.glade \
- e-msg-composer-attachment.glade.h
-
-libcomposerincludedir = $(includedir)/composer
-
-noinst_LTLIBRARIES = libcomposer.la
-libcomposer_la_LDFLAGS = -static
-
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I$(top_srcdir)/widgets \
- -I$(top_builddir)/widgets \
- -I$(top_srcdir)/camel \
- -I$(top_builddir)/camel \
- -I$(top_builddir)/addressbook/gui/component/select-names \
- $(GNOME_INCLUDEDIR) \
- $(BONOBO_GNOME_CFLAGS) \
- $(GTKHTML_CFLAGS) \
- $(UNICODE_CFLAGS) \
- -DG_LOG_DOMAIN=\"composer\"
-
-CPPFLAGS = \
- -DE_GLADEDIR=\"$(gladedir)\"
-
-libcomposer_la_SOURCES = \
- $(IDL_GENERATED) \
- e-msg-composer-address-dialog.c \
- e-msg-composer-address-dialog.h \
- e-msg-composer-address-entry.c \
- e-msg-composer-address-entry.h \
- 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
-
-EXTRA_DIST = \
- $(glade_DATA) \
- ChangeLog
diff --git a/composer/e-msg-composer-address-dialog.c b/composer/e-msg-composer-address-dialog.c
deleted file mode 100644
index 5eec51c435..0000000000
--- a/composer/e-msg-composer-address-dialog.c
+++ /dev/null
@@ -1,656 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-address-dialog.c
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#include <gnome.h>
-#include "e-msg-composer-address-dialog.h"
-
-
-enum {
- APPLY,
- LAST_SIGNAL
-};
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static GnomeDialogClass *parent_class = NULL;
-
-
-/* This function should load the addresses we know of into the dialog. We
- don't have a precise setup for the addressbook yet, so we will just put some
- fake entries in. */
-static void
-load_addresses (EMsgComposerAddressDialog *dialog)
-{
- gchar *text[][3] = {
- { "Bertrand Guiheneuf", "Bertrand.Guiheneuf@aful.org", NULL },
- { "Ettore Perazzoli", "ettore@gnu.org", NULL },
- { "Miguel de Icaza", "miguel@gnu.org", NULL },
- { "Nat Friedman", "nat@nat.org", NULL },
- { NULL, NULL, NULL }
- };
- GtkCList *clist;
- guint i;
-
- clist = GTK_CLIST (glade_xml_get_widget (dialog->gui, "address_clist"));
-
- for (i = 0; text[i][0] != NULL; i++)
- gtk_clist_append (clist, text[i]);
-}
-
-/* Combine name and email into an address, e.g. "Ettore Perazzoli
- <ettore@gnu.org>". FIXME FIXME FIXME this does not handle quoting (commas
- will cause troubles), but it should. */
-static gchar *
-make_full_address (const gchar *name,
- const gchar *email)
-{
- return g_strconcat (name, " <", email, ">", NULL);
-}
-
-/* This loads the selected address in the address GtkCList into the requested
- GtkList. */
-static void
-add_address (EMsgComposerAddressDialog *dialog,
- const gchar *list_name)
-{
- GtkCList *src_clist;
- GtkCList *dest_clist;
- gchar *name, *email;
- gchar *text[2];
- guint row;
-
- src_clist = GTK_CLIST (glade_xml_get_widget (dialog->gui,
- "address_clist"));
- if (src_clist->selection == NULL)
- return;
-
- dest_clist = GTK_CLIST (glade_xml_get_widget (dialog->gui, list_name));
- row = GPOINTER_TO_INT (src_clist->selection->data);
-
- gtk_clist_get_text (src_clist, row, 0, &name);
- gtk_clist_get_text (src_clist, row, 1, &email);
-
- text[0] = make_full_address (name, email);
- text[1] = NULL;
-
- gtk_clist_append (dest_clist, text);
-
- g_free (text[0]);
-}
-
-static void
-apply (EMsgComposerAddressDialog *dialog)
-{
- gtk_signal_emit (GTK_OBJECT (dialog), signals[APPLY]);
-}
-
-
-/* Recipient list popup menu. */
-
-struct _RecipientListInfo {
- EMsgComposerAddressDialog *dialog;
- GtkCList *clist;
- gint row; /* -1 if menu was popped up in an empty
- area. */
-};
-typedef struct _RecipientListInfo RecipientListInfo;
-
-static void
-copy_recipient (RecipientListInfo *info,
- gboolean remove)
-{
- gchar *text;
- gint row;
-
- if (info->clist->selection == NULL)
- return;
-
- row = GPOINTER_TO_INT (info->clist->selection->data);
- gtk_clist_get_text (info->clist, row, 0, &text);
-
- g_free (info->dialog->cut_buffer);
- info->dialog->cut_buffer = g_strdup (text);
-
- if (remove)
- gtk_clist_remove (info->clist, row);
-
- gtk_selection_owner_set (GTK_WIDGET (info->clist),
- GDK_SELECTION_PRIMARY,
- GDK_CURRENT_TIME);
-}
-
-static void
-copy_recipient_cb (GtkWidget *widget,
- gpointer data)
-{
- RecipientListInfo *info;
-
- info = (RecipientListInfo *) data;
- copy_recipient (info, FALSE);
- g_free (info);
-}
-
-static void
-cut_recipient_cb (GtkWidget *widget,
- gpointer data)
-{
- RecipientListInfo *info;
-
- info = (RecipientListInfo *) data;
- copy_recipient (info, TRUE);
- g_free (info);
-}
-
-static void
-paste_recipient_cb (GtkWidget *widget,
- gpointer data)
-{
- RecipientListInfo *info;
- GdkAtom atom;
-
- info = (RecipientListInfo *) data;
-
- atom = gdk_atom_intern ("STRING", FALSE);
- gtk_selection_convert (GTK_WIDGET (info->clist),
- GDK_SELECTION_PRIMARY,
- atom,
- GDK_CURRENT_TIME);
-
- g_free (info);
-}
-
-static GnomeUIInfo recipient_list_item_popup_info[] = {
- GNOMEUIINFO_ITEM_STOCK (N_("Cut"),
- N_("Cut selected item into clipboard"),
- cut_recipient_cb,
- GNOME_STOCK_MENU_CUT),
- GNOMEUIINFO_ITEM_STOCK (N_("Copy"),
- N_("Copy selected item into clipboard"),
- copy_recipient_cb,
- GNOME_STOCK_MENU_COPY),
- GNOMEUIINFO_ITEM_STOCK (N_("Paste"),
- N_("Paste item from clipboard"),
- paste_recipient_cb,
- GNOME_STOCK_MENU_PASTE),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo recipient_list_popup_info[] = {
- GNOMEUIINFO_ITEM_STOCK (N_("Paste"),
- N_("Paste item from clipboard"),
- paste_recipient_cb,
- GNOME_STOCK_MENU_PASTE),
- GNOMEUIINFO_END
-};
-
-
-/* Signals. */
-
-static void
-add_to_cb (GtkWidget *widget,
- gpointer data)
-{
- add_address (E_MSG_COMPOSER_ADDRESS_DIALOG (data), "to_clist");
-}
-
-static void
-add_cc_cb (GtkWidget *widget,
- gpointer data)
-{
- add_address (E_MSG_COMPOSER_ADDRESS_DIALOG (data), "cc_clist");
-}
-
-static void
-add_bcc_cb (GtkWidget *widget,
- gpointer data)
-{
- add_address (E_MSG_COMPOSER_ADDRESS_DIALOG (data), "bcc_clist");
-}
-
-static void
-glade_connect (GladeXML *gui,
- const gchar *widget_name,
- const gchar *signal_name,
- GtkSignalFunc callback,
- gpointer callback_data)
-{
- GtkWidget *widget;
-
- widget = glade_xml_get_widget (gui, widget_name);
- if (widget == NULL)
- g_warning ("Widget `%s' was not found.", widget_name);
- else
- gtk_signal_connect (GTK_OBJECT (widget), signal_name,
- GTK_SIGNAL_FUNC (callback), callback_data);
-}
-
-static gint
-recipient_clist_button_press_cb (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data)
-{
- EMsgComposerAddressDialog *dialog;
- RecipientListInfo *info;
- GtkWidget *popup;
- GtkCList *clist;
- gboolean on_row;
- gint row, column;
-
- dialog = E_MSG_COMPOSER_ADDRESS_DIALOG (data);
-
- clist = GTK_CLIST (widget);
-
- if (event->window != clist->clist_window || event->button != 3)
- return FALSE;
-
- on_row = gtk_clist_get_selection_info (clist, event->x, event->y,
- &row, &column);
-
- info = g_new (RecipientListInfo, 1);
- info->dialog = dialog;
- info->clist = clist;
-
- if (on_row) {
- gtk_clist_unselect_all (clist);
- gtk_clist_select_row (clist, row, 0);
- info->row = row;
- popup = gnome_popup_menu_new (recipient_list_item_popup_info);
- } else {
- info->row = -1;
- popup = gnome_popup_menu_new (recipient_list_popup_info);
- }
-
- gnome_popup_menu_do_popup_modal (popup, NULL, NULL, event, info);
-
- gtk_widget_destroy (popup);
-
- return TRUE;
-}
-
-/* FIXME needs more work. */
-static void
-recipient_clist_selection_received_cb (GtkWidget *widget,
- GtkSelectionData *selection_data,
- guint time,
- gpointer data)
-{
- GtkCList *clist;
- gchar *text[2];
- gchar *p;
-
- puts (__FUNCTION__);
-
- if (selection_data->length < 0)
- return;
-
- clist = GTK_CLIST (widget);
-
- /* FIXME quoting. */
- text[0] = g_strdup (selection_data->data);
- text[1] = NULL;
-
- /* It is a common mistake to paste `\n's, let's work around that. */
- for (p = text[0]; *p != '\0'; p++) {
- if (*p == '\n') {
- *p = '\0';
- break;
- }
- }
-
- if (clist->selection != NULL) {
- gint row;
-
- row = GPOINTER_TO_INT (clist->selection->data);
- gtk_clist_insert (clist, row, text);
- } else {
- gtk_clist_append (clist, text);
- }
-
- g_free (text[0]);
-}
-
-static void
-recipient_clist_selection_get_cb (GtkWidget *widget,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- gpointer data)
-{
- EMsgComposerAddressDialog *dialog;
- GdkAtom atom;
-
- puts (__FUNCTION__);
-
- dialog = E_MSG_COMPOSER_ADDRESS_DIALOG (data);
- if (dialog->cut_buffer == NULL)
- return; /* FIXME should I do something special? */
-
- atom = gdk_atom_intern ("STRING", FALSE);
- gtk_selection_data_set (selection_data, atom, 8,
- dialog->cut_buffer,
- strlen (dialog->cut_buffer));
-}
-
-static void
-recipient_clist_selection_clear_event_cb (GtkWidget *widget,
- GdkEventSelection *selection,
- gpointer data)
-{
- EMsgComposerAddressDialog *dialog;
-
- dialog = E_MSG_COMPOSER_ADDRESS_DIALOG (data);
- g_free (dialog->cut_buffer);
- dialog->cut_buffer = NULL;
-}
-
-static void
-setup_recipient_list_signals (EMsgComposerAddressDialog *dialog,
- const gchar *name)
-{
- glade_connect (dialog->gui, name, "button_press_event",
- GTK_SIGNAL_FUNC (recipient_clist_button_press_cb),
- dialog);
- glade_connect (dialog->gui, name, "selection_received",
- GTK_SIGNAL_FUNC (recipient_clist_selection_received_cb),
- dialog);
- glade_connect (dialog->gui, name, "selection_get",
- GTK_SIGNAL_FUNC (recipient_clist_selection_get_cb),
- dialog);
- glade_connect (dialog->gui, name, "selection_clear_event",
- GTK_SIGNAL_FUNC (recipient_clist_selection_clear_event_cb),
- dialog);
-}
-
-static void
-setup_signals (EMsgComposerAddressDialog *dialog)
-{
- glade_connect (dialog->gui, "to_add_button", "clicked",
- GTK_SIGNAL_FUNC (add_to_cb), dialog);
- glade_connect (dialog->gui, "cc_add_button", "clicked",
- GTK_SIGNAL_FUNC (add_cc_cb), dialog);
- glade_connect (dialog->gui, "bcc_add_button", "clicked",
- GTK_SIGNAL_FUNC (add_bcc_cb), dialog);
-
- setup_recipient_list_signals (dialog, "to_clist");
- setup_recipient_list_signals (dialog, "cc_clist");
- setup_recipient_list_signals (dialog, "bcc_clist");
-}
-
-
-static void
-setup_selection_targets (EMsgComposerAddressDialog *dialog)
-{
- gtk_selection_add_target (glade_xml_get_widget (dialog->gui, "to_clist"),
- GDK_SELECTION_PRIMARY,
- GDK_SELECTION_TYPE_STRING, 0);
- gtk_selection_add_target (glade_xml_get_widget (dialog->gui, "cc_clist"),
- GDK_SELECTION_PRIMARY,
- GDK_SELECTION_TYPE_STRING, 0);
- gtk_selection_add_target (glade_xml_get_widget (dialog->gui, "bcc_clist"),
- GDK_SELECTION_PRIMARY,
- GDK_SELECTION_TYPE_STRING, 0);
-}
-
-
-/* GnomeDialog methods. */
-
-static void
-clicked (GnomeDialog *dialog,
- gint button_number)
-{
- switch (button_number) {
- case 0: /* OK */
- apply (E_MSG_COMPOSER_ADDRESS_DIALOG (dialog));
- gnome_dialog_close (dialog);
- break;
- case 1: /* Apply */
- apply (E_MSG_COMPOSER_ADDRESS_DIALOG (dialog));
- break;
- case 2: /* Cancel */
- gnome_dialog_close (dialog);
- break;
- }
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EMsgComposerAddressDialog *dialog;
-
- dialog = E_MSG_COMPOSER_ADDRESS_DIALOG (object);
-
- gtk_object_unref (GTK_OBJECT (dialog->gui));
- g_free (dialog->cut_buffer);
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* Initialization. */
-
-static void
-class_init (EMsgComposerAddressDialogClass *class)
-{
- GtkObjectClass *object_class;
- GnomeDialogClass *gnome_dialog_class;
-
- object_class = GTK_OBJECT_CLASS (class);
- object_class->destroy = destroy;
-
- gnome_dialog_class = GNOME_DIALOG_CLASS (class);
- gnome_dialog_class->clicked = clicked;
-
- parent_class = gtk_type_class (gnome_dialog_get_type ());
-
- signals[APPLY]
- = gtk_signal_new ("apply",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EMsgComposerAddressDialogClass,
- apply),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (EMsgComposerAddressDialog *dialog)
-{
- dialog->gui = NULL;
- dialog->cut_buffer = NULL;
-}
-
-
-GtkType
-e_msg_composer_address_dialog_get_type (void)
-{
- static GtkType type = 0;
-
- if (type == 0) {
- static const GtkTypeInfo info = {
- "EMsgComposerAddressDialog",
- sizeof (EMsgComposerAddressDialog),
- sizeof (EMsgComposerAddressDialogClass),
- (GtkClassInitFunc) class_init,
- (GtkObjectInitFunc) init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (gnome_dialog_get_type (), &info);
- }
-
- return type;
-}
-
-void
-e_msg_composer_address_dialog_construct (EMsgComposerAddressDialog *dialog)
-{
- static const gchar *buttons[] = {
- GNOME_STOCK_BUTTON_OK,
- GNOME_STOCK_BUTTON_APPLY,
- GNOME_STOCK_BUTTON_CANCEL,
- NULL
- };
-
- g_return_if_fail (dialog != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog));
-
- gnome_dialog_constructv (GNOME_DIALOG (dialog),
- _("Select recipients' addresses"),
- buttons);
-
- dialog->gui = glade_xml_new
- (E_GLADEDIR "/e-msg-composer-address-dialog.glade",
- "main_table");
- if (dialog->gui == NULL) {
- g_warning ("Cannot load `e-msg-composer-address-dialog.glade");
- return;
- }
-
- gtk_container_add (GTK_CONTAINER (GNOME_DIALOG (dialog)->vbox),
- glade_xml_get_widget (dialog->gui, "main_table"));
-
- setup_selection_targets (dialog);
- load_addresses (dialog);
- setup_signals (dialog);
-}
-
-GtkWidget *
-e_msg_composer_address_dialog_new (void)
-{
- EMsgComposerAddressDialog *new;
-
- new = gtk_type_new (e_msg_composer_address_dialog_get_type ());
- e_msg_composer_address_dialog_construct (new);
-
- return GTK_WIDGET (new);
-}
-
-
-static void
-set_list (EMsgComposerAddressDialog *dialog,
- const gchar *list_name,
- GList *list)
-{
- GtkCList *clist;
- GList *p;
- gchar *text[2];
-
- clist = GTK_CLIST (glade_xml_get_widget (dialog->gui, list_name));
-
- gtk_clist_freeze (clist);
- gtk_clist_clear (clist);
-
- text[1] = NULL;
- for (p = list; p != NULL; p = p->next) {
- text[0] = (gchar *) p->data;
- gtk_clist_append (clist, text);
- }
-
- gtk_clist_thaw (clist);
-}
-
-void
-e_msg_composer_address_dialog_set_to_list (EMsgComposerAddressDialog *dialog,
- GList *to_list)
-{
- g_return_if_fail (dialog != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog));
-
- set_list (dialog, "to_clist", to_list);
-}
-
-void
-e_msg_composer_address_dialog_set_cc_list (EMsgComposerAddressDialog *dialog,
- GList *cc_list)
-{
- g_return_if_fail (dialog != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog));
-
- set_list (dialog, "cc_clist", cc_list);
-}
-
-void
-e_msg_composer_address_dialog_set_bcc_list (EMsgComposerAddressDialog *dialog,
- GList *bcc_list)
-{
- g_return_if_fail (dialog != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog));
-
- set_list (dialog, "bcc_clist", bcc_list);
-}
-
-
-static GList *
-get_list (EMsgComposerAddressDialog *dialog,
- const gchar *clist_name)
-{
- GtkCList *clist;
- GList *list;
- guint i;
-
- clist = GTK_CLIST (glade_xml_get_widget (dialog->gui, clist_name));
-
- list = NULL;
- for (i = 0; i < clist->rows; i++) {
- gchar *addr;
-
- gtk_clist_get_text (clist, i, 0, &addr);
- list = g_list_prepend (list, g_strdup (addr));
- }
-
- return g_list_reverse (list);
-}
-
-GList *
-e_msg_composer_address_dialog_get_to_list (EMsgComposerAddressDialog *dialog)
-{
- g_return_val_if_fail (dialog != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog), NULL);
-
- return get_list (dialog, "to_clist");
-}
-
-GList *
-e_msg_composer_address_dialog_get_cc_list (EMsgComposerAddressDialog *dialog)
-{
- g_return_val_if_fail (dialog != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog), NULL);
-
- return get_list (dialog, "cc_clist");
-}
-
-GList *
-e_msg_composer_address_dialog_get_bcc_list (EMsgComposerAddressDialog *dialog)
-{
- g_return_val_if_fail (dialog != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog), NULL);
-
- return get_list (dialog, "bcc_clist");
-}
diff --git a/composer/e-msg-composer-address-dialog.glade b/composer/e-msg-composer-address-dialog.glade
deleted file mode 100644
index c90ef3f245..0000000000
--- a/composer/e-msg-composer-address-dialog.glade
+++ /dev/null
@@ -1,576 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>address-composer</name>
- <program_name>address-composer</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>True</output_main_file>
- <output_support_files>True</output_support_files>
- <output_build_files>True</output_build_files>
- <backup_source_files>True</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-msg-composer-address-dialog.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog1</name>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>main_table</name>
- <rows>3</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>2</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label3</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label1</name>
- <label>Recipient list:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>5</spacing>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>False</yfill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label2</name>
- <label>Name:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>name_entry</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>5</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>search_button</name>
- <width>65</width>
- <can_focus>True</can_focus>
- <label>Search...</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>5</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>address_clist</name>
- <width>180</width>
- <height>200</height>
- <can_focus>True</can_focus>
- <columns>2</columns>
- <column_widths>128,107</column_widths>
- <selection_mode>GTK_SELECTION_BROWSE</selection_mode>
- <show_titles>True</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label5</name>
- <width>50</width>
- <label>Name</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label6</name>
- <width>100</width>
- <label>Address</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox2</name>
- <homogeneous>True</homogeneous>
- <spacing>10</spacing>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button5</name>
- <can_focus>True</can_focus>
- <label>Properties...</label>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button6</name>
- <can_focus>True</can_focus>
- <label>Add...</label>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table2</name>
- <rows>3</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>0</column_spacing>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>5</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>to_add_button</name>
- <width>60</width>
- <can_focus>True</can_focus>
- <label>To: &gt;&gt;</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>5</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>cc_add_button</name>
- <width>60</width>
- <can_focus>True</can_focus>
- <label>Cc: &gt;&gt;</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>5</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>bcc_add_button</name>
- <width>60</width>
- <can_focus>True</can_focus>
- <label>Bcc: &gt;&gt;</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>5</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow4</name>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>2</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>bcc_clist</name>
- <width>180</width>
- <height>100</height>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_BROWSE</selection_mode>
- <show_titles>False</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label9</name>
- <label>label9</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow2</name>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>2</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>to_clist</name>
- <width>180</width>
- <height>100</height>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_BROWSE</selection_mode>
- <show_titles>False</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label7</name>
- <label>label7</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow3</name>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>2</xpad>
- <ypad>4</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>cc_clist</name>
- <width>180</width>
- <height>100</height>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_BROWSE</selection_mode>
- <show_titles>False</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label8</name>
- <label>label8</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <can_default>True</can_default>
- <has_default>True</has_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button2</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/composer/e-msg-composer-address-dialog.glade.h b/composer/e-msg-composer-address-dialog.glade.h
deleted file mode 100644
index a5d48ec275..0000000000
--- a/composer/e-msg-composer-address-dialog.glade.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Recipient list:");
-gchar *s = N_("Name:");
-gchar *s = N_("Search...");
-gchar *s = N_("Name");
-gchar *s = N_("Address");
-gchar *s = N_("Properties...");
-gchar *s = N_("Add...");
-gchar *s = N_("To: >>");
-gchar *s = N_("Cc: >>");
-gchar *s = N_("Bcc: >>");
-gchar *s = N_("label9");
-gchar *s = N_("label7");
-gchar *s = N_("label8");
diff --git a/composer/e-msg-composer-address-dialog.h b/composer/e-msg-composer-address-dialog.h
deleted file mode 100644
index 19ffeda703..0000000000
--- a/composer/e-msg-composer-address-dialog.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-address-dialog.h
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-#ifndef __E_MSG_COMPOSER_ADDRESS_DIALOG_H__
-#define __E_MSG_COMPOSER_ADDRESS_DIALOG_H__
-
-#include <gnome.h>
-#include <glade/glade-xml.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-
-#define E_TYPE_MSG_COMPOSER_ADDRESS_DIALOG (e_msg_composer_address_dialog_get_type ())
-#define E_MSG_COMPOSER_ADDRESS_DIALOG(obj) (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_DIALOG, EMsgComposerAddressDialog))
-#define E_MSG_COMPOSER_ADDRESS_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_ADDRESS_DIALOG, EMsgComposerAddressDialogClass))
-#define E_IS_MSG_COMPOSER_ADDRESS_DIALOG(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_DIALOG))
-#define E_IS_MSG_COMPOSER_ADDRESS_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_DIALOG))
-
-
-typedef struct _EMsgComposerAddressDialog EMsgComposerAddressDialog;
-typedef struct _EMsgComposerAddressDialogClass EMsgComposerAddressDialogClass;
-
-struct _EMsgComposerAddressDialog {
- GnomeDialog parent;
-
- GladeXML *gui;
-
- gchar *cut_buffer;
-};
-
-struct _EMsgComposerAddressDialogClass {
- GnomeDialogClass parent_class;
-
- void (* apply) (EMsgComposerAddressDialog *dialog);
-};
-
-
-GtkType e_msg_composer_address_dialog_get_type (void);
-GtkWidget *e_msg_composer_address_dialog_new (void);
-void e_msg_composer_address_dialog_construct (EMsgComposerAddressDialog *dialog);
-void e_msg_composer_address_dialog_set_to_list (EMsgComposerAddressDialog *dialog, GList *to_list);
-void e_msg_composer_address_dialog_set_cc_list (EMsgComposerAddressDialog *dialog, GList *cc_list);
-void e_msg_composer_address_dialog_set_bcc_list (EMsgComposerAddressDialog *dialog, GList *bcc_list);
-GList *e_msg_composer_address_dialog_get_to_list (EMsgComposerAddressDialog *dialog);
-GList *e_msg_composer_address_dialog_get_cc_list (EMsgComposerAddressDialog *dialog);
-GList *e_msg_composer_address_dialog_get_bcc_list (EMsgComposerAddressDialog *dialog);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_MSG_COMPOSER_ADDRESS_DIALOG_H__ */
diff --git a/composer/e-msg-composer-address-entry.c b/composer/e-msg-composer-address-entry.c
deleted file mode 100644
index ce946d203e..0000000000
--- a/composer/e-msg-composer-address-entry.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-address-entry.c
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-/* This is a custom GtkEntry for entering address lists. For now, it does not
- have any fancy features, but in the future we might want to make it
- cooler. */
-
-#include <gnome.h>
-
-#include "e-msg-composer-address-entry.h"
-
-
-static GtkEntryClass *parent_class = NULL;
-
-
-/* Initialization. */
-
-static void
-class_init (EMsgComposerAddressEntryClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass*) klass;
-
- parent_class = gtk_type_class (gtk_entry_get_type ());
-}
-
-static void
-init (EMsgComposerAddressEntry *msg_composer_address_entry)
-{
-}
-
-GtkType
-e_msg_composer_address_entry_get_type (void)
-{
- static GtkType type = 0;
-
- if (type == 0) {
- static const GtkTypeInfo info = {
- "EMsgComposerAddressEntry",
- sizeof (EMsgComposerAddressEntry),
- sizeof (EMsgComposerAddressEntryClass),
- (GtkClassInitFunc) class_init,
- (GtkObjectInitFunc) init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (gtk_entry_get_type (), &info);
- }
-
- return type;
-}
-
-
-GtkWidget *
-e_msg_composer_address_entry_new (void)
-{
- GtkWidget *new;
-
- new = gtk_type_new (e_msg_composer_address_entry_get_type ());
-
- return new;
-}
-
-
-/**
- * e_msg_composer_address_entry_get_addresses:
- * @entry: An address entry widget
- *
- * Retrieve the list of addresses stored in @entry.
- *
- * Return value: A GList of pointers to strings representing the addresses.
- * Notice that the strings must be freed by the caller when not needed anymore.
- **/
-GList *
-e_msg_composer_address_entry_get_addresses (EMsgComposerAddressEntry *entry)
-{
- GList *list;
- const gchar *s;
- const gchar *p, *oldp;
- gboolean in_quotes;
-
- s = gtk_entry_get_text (GTK_ENTRY (entry));
-
- in_quotes = FALSE;
- list = NULL;
-
- p = s;
- oldp = s;
-
- while (1) {
- if (*p == '"') {
- in_quotes = ! in_quotes;
- p++;
- } else if ((! in_quotes && *p == ',') || *p == 0) {
- if (p != oldp) {
- gchar *new_addr;
-
- new_addr = g_strndup (oldp, p - oldp);
- new_addr = g_strstrip (new_addr);
- if (*new_addr != '\0')
- list = g_list_prepend (list, new_addr);
- else
- g_free (new_addr);
- }
-
- while (*p == ',' || *p == ' ' || *p == '\t')
- p++;
-
- if (*p == 0)
- break;
-
- oldp = p;
- } else {
- p++;
- }
- }
-
- return g_list_reverse (list);
-}
-
-/**
- * e_msg_composer_address_entry_set_list:
- * @entry: An address entry
- * @list: List of pointers to strings representing the addresses that must
- * appear in the entry
- *
- * Set the address list from @list.
- **/
-void
-e_msg_composer_address_entry_set_list (EMsgComposerAddressEntry *entry,
- const GList *list)
-{
- GString *string;
- const GList *p;
-
- g_return_if_fail (entry != NULL);
-
- if (list == NULL) {
- gtk_editable_delete_text (GTK_EDITABLE (entry), -1, -1);
- return;
- }
-
- string = g_string_new (NULL);
- for (p = list; p != NULL; p = p->next) {
- if (string->str[0] != '\0')
- g_string_append (string, ", ");
- g_string_append (string, p->data);
- }
-
- gtk_entry_set_text (GTK_ENTRY (entry), string->str);
- g_string_free (string, TRUE);
-}
diff --git a/composer/e-msg-composer-address-entry.h b/composer/e-msg-composer-address-entry.h
deleted file mode 100644
index f2b671bde4..0000000000
--- a/composer/e-msg-composer-address-entry.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-address-entry.h
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __E_MSG_COMPOSER_ADDRESS_ENTRY_H__
-#define __E_MSG_COMPOSER_ADDRESS_ENTRY_H__
-
-#include <gnome.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_MSG_COMPOSER_ADDRESS_ENTRY (e_msg_composer_address_entry_get_type ())
-#define E_MSG_COMPOSER_ADDRESS_ENTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_ENTRY, EMsgComposerAddressEntry))
-#define E_MSG_COMPOSER_ADDRESS_ENTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_ADDRESS_ENTRY, EMsgComposerAddressEntryClass))
-#define E_IS_MSG_COMPOSER_ADDRESS_ENTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_ENTRY))
-#define E_IS_MSG_COMPOSER_ADDRESS_ENTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_ENTRY))
-
-
-typedef struct _EMsgComposerAddressEntry EMsgComposerAddressEntry;
-typedef struct _EMsgComposerAddressEntryClass EMsgComposerAddressEntryClass;
-
-struct _EMsgComposerAddressEntry {
- GtkEntry parent;
-};
-
-struct _EMsgComposerAddressEntryClass {
- GtkEntryClass parent_class;
-};
-
-
-GtkType e_msg_composer_address_entry_get_type (void);
-GtkWidget *e_msg_composer_address_entry_new (void);
-GList *e_msg_composer_address_entry_get_addresses (EMsgComposerAddressEntry *entry);
-void e_msg_composer_address_entry_set_list (EMsgComposerAddressEntry *entry,
- const GList *list);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_MSG_COMPOSER_ADDRESS_ENTRY_H__ */
diff --git a/composer/e-msg-composer-attachment-bar.c b/composer/e-msg-composer-attachment-bar.c
deleted file mode 100644
index 20b6c3d3d2..0000000000
--- a/composer/e-msg-composer-attachment-bar.c
+++ /dev/null
@@ -1,653 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-attachment-bar.c
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#include <gnome.h>
-#include <glade/glade.h>
-
-#include "e-msg-composer-attachment.h"
-#include "e-msg-composer-attachment-bar.h"
-#include "camel/camel-data-wrapper.h"
-#include "camel/camel-stream-fs.h"
-#include "camel/camel-mime-part.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;
-
- GtkWidget *context_menu;
- GtkWidget *icon_context_menu;
-};
-
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-static void update (EMsgComposerAttachmentBar *bar);
-
-
-static gchar *
-size_to_string (gulong size)
-{
- gchar *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) {
- if (size == 1)
- size_string = g_strdup (_("1 byte"));
- else
- size_string = g_strdup_printf (_("%u bytes"),
- (guint) size);
- } else {
- gdouble displayed_size;
-
- if (size < 1e6L) {
- displayed_size = (gdouble) size / 1.0e3;
- size_string = g_strdup_printf (_("%.1fK"),
- displayed_size);
- } else if (size < 1e9L) {
- displayed_size = (gdouble) size / 1.0e6;
- size_string = g_strdup_printf (_("%.1fM"),
- displayed_size);
- } else {
- displayed_size = (gdouble) size / 1.0e9;
- size_string = g_strdup_printf (_("%.1fG"),
- 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)
- gtk_object_unref (GTK_OBJECT (p->data));
-}
-
-static void
-attachment_changed_cb (EMsgComposerAttachment *attachment,
- gpointer data)
-{
- update (E_MSG_COMPOSER_ATTACHMENT_BAR (data));
-}
-
-static void
-add_common (EMsgComposerAttachmentBar *bar,
- EMsgComposerAttachment *attachment)
-{
- gtk_signal_connect (GTK_OBJECT (attachment), "changed",
- GTK_SIGNAL_FUNC (attachment_changed_cb),
- bar);
-
- bar->priv->attachments = g_list_append (bar->priv->attachments,
- attachment);
- bar->priv->num_attachments++;
-
- update (bar);
-
- gtk_signal_emit (GTK_OBJECT (bar), signals[CHANGED]);
-}
-
-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 gchar *file_name)
-{
- add_common (bar, e_msg_composer_attachment_new (file_name));
-}
-
-static void
-remove_attachment (EMsgComposerAttachmentBar *bar,
- EMsgComposerAttachment *attachment)
-{
- bar->priv->attachments = g_list_remove (bar->priv->attachments,
- attachment);
- bar->priv->num_attachments--;
-
- gtk_object_unref (GTK_OBJECT (attachment));
-
- gtk_signal_emit (GTK_OBJECT (bar), signals[CHANGED]);
-}
-
-
-/* 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;
- const gchar *icon_name, *desc;
- gchar *size_string, *label, *mime_type;
- GMimeContentField *content_type;
-
- attachment = p->data;
- content_type = camel_mime_part_get_content_type (attachment->body);
- mime_type = g_strdup_printf ("%s/%s", content_type->type,
- content_type->subtype);
- icon_name = gnome_mime_get_value (mime_type, "icon-filename");
- g_free (mime_type);
-
- /* FIXME we need some better default icon. */
- if (icon_name == NULL)
- icon_name = gnome_mime_get_value ("text/plain",
- "icon-filename");
-
- desc = camel_mime_part_get_description (attachment->body);
- if (!desc)
- 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);
-
- gnome_icon_list_append (icon_list, icon_name, label);
- g_free (label);
- }
-
- gnome_icon_list_thaw (icon_list);
-}
-
-static void
-remove_selected (EMsgComposerAttachmentBar *bar)
-{
- GnomeIconList *icon_list;
- EMsgComposerAttachment *attachment;
- GList *attachment_list;
- GList *p;
- gint num;
-
- 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;
- for (p = icon_list->selection; p != NULL; p = p->next) {
- num = GPOINTER_TO_INT (p->data);
- attachment = E_MSG_COMPOSER_ATTACHMENT
- (g_list_nth (bar->priv->attachments, num)->data);
- 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);
-}
-
-static void
-edit_selected (EMsgComposerAttachmentBar *bar)
-{
- GnomeIconList *icon_list;
- EMsgComposerAttachment *attachment;
- gint num;
-
- icon_list = GNOME_ICON_LIST (bar);
-
- num = GPOINTER_TO_INT (icon_list->selection->data);
- attachment = g_list_nth (bar->priv->attachments, num)->data;
-
- e_msg_composer_attachment_edit (attachment, GTK_WIDGET (bar));
-}
-
-
-/* "Attach" dialog. */
-
-static void
-attach_cb (GtkWidget *widget,
- gpointer data)
-{
- EMsgComposerAttachmentBar *bar;
- GtkWidget *file_selection;
- const gchar *file_name;
-
- file_selection = gtk_widget_get_toplevel (widget);
- bar = E_MSG_COMPOSER_ATTACHMENT_BAR (data);
-
- file_name = gtk_file_selection_get_filename
- (GTK_FILE_SELECTION (file_selection));
- add_from_file (bar, file_name);
-
- gtk_widget_hide (file_selection);
-}
-
-static void
-add_from_user (EMsgComposerAttachmentBar *bar)
-{
- static GtkWidget *fs;
-
- if (!fs) {
- GtkWidget *cancel_button;
- GtkWidget *ok_button;
-
- fs = gtk_file_selection_new (_("Add attachment"));
-
- ok_button = GTK_FILE_SELECTION (fs)->ok_button;
- gtk_signal_connect (GTK_OBJECT (ok_button),
- "clicked", GTK_SIGNAL_FUNC (attach_cb),
- bar);
-
- cancel_button = GTK_FILE_SELECTION (fs)->cancel_button;
- gtk_signal_connect_object (GTK_OBJECT (cancel_button),
- "clicked",
- GTK_SIGNAL_FUNC (gtk_widget_hide),
- GTK_OBJECT (fs));
-
- gtk_signal_connect (GTK_OBJECT (fs), "delete_event",
- GTK_SIGNAL_FUNC (gtk_widget_hide), NULL);
- } else
- gtk_file_selection_set_filename (GTK_FILE_SELECTION (fs), "");
-
- gtk_window_set_position (GTK_WINDOW (fs), GTK_WIN_POS_MOUSE);
-
- gtk_widget_show (GTK_WIDGET (fs));
-}
-
-
-/* Callbacks. */
-
-static void
-add_cb (GtkWidget *widget,
- gpointer data)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (data));
-
- add_from_user (E_MSG_COMPOSER_ATTACHMENT_BAR (data));
-}
-
-static void
-properties_cb (GtkWidget *widget,
- gpointer data)
-{
- EMsgComposerAttachmentBar *bar;
-
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (data));
-
- bar = E_MSG_COMPOSER_ATTACHMENT_BAR (data);
- edit_selected (data);
-}
-
-static void
-remove_cb (GtkWidget *widget,
- gpointer data)
-{
- EMsgComposerAttachmentBar *bar;
-
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (data));
-
- bar = E_MSG_COMPOSER_ATTACHMENT_BAR (data);
- remove_selected (bar);
-}
-
-
-/* Popup menu handling. */
-
-static GnomeUIInfo icon_context_menu_info[] = {
- GNOMEUIINFO_ITEM (N_("Remove"),
- N_("Remove selected items from the attachment list"),
- remove_cb, NULL),
- GNOMEUIINFO_MENU_PROPERTIES_ITEM (properties_cb, NULL),
- GNOMEUIINFO_END
-};
-
-static GtkWidget *
-get_icon_context_menu (EMsgComposerAttachmentBar *bar)
-{
- EMsgComposerAttachmentBarPrivate *priv;
-
- priv = bar->priv;
- if (priv->icon_context_menu == NULL)
- priv->icon_context_menu = gnome_popup_menu_new
- (icon_context_menu_info);
-
- return priv->icon_context_menu;
-}
-
-static void
-popup_icon_context_menu (EMsgComposerAttachmentBar *bar,
- gint num,
- GdkEventButton *event)
-{
- GtkWidget *menu;
-
- menu = get_icon_context_menu (bar);
- gnome_popup_menu_do_popup (menu, NULL, NULL, event, bar);
-}
-
-static GnomeUIInfo context_menu_info[] = {
- GNOMEUIINFO_ITEM (N_("Add attachment..."),
- N_("Attach a file to the message"),
- add_cb, NULL),
- GNOMEUIINFO_END
-};
-
-static GtkWidget *
-get_context_menu (EMsgComposerAttachmentBar *bar)
-{
- EMsgComposerAttachmentBarPrivate *priv;
-
- priv = bar->priv;
- if (priv->context_menu == NULL)
- priv->context_menu = gnome_popup_menu_new (context_menu_info);
-
- return priv->context_menu;
-}
-
-static void
-popup_context_menu (EMsgComposerAttachmentBar *bar,
- GdkEventButton *event)
-{
- GtkWidget *menu;
-
- menu = get_context_menu (bar);
- gnome_popup_menu_do_popup (menu, NULL, NULL, event, bar);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EMsgComposerAttachmentBar *bar;
-
- bar = E_MSG_COMPOSER_ATTACHMENT_BAR (object);
-
- free_attachment_list (bar);
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* GtkWidget methods. */
-
-static gint
-button_press_event (GtkWidget *widget,
- GdkEventButton *event)
-{
- EMsgComposerAttachmentBar *bar;
- GnomeIconList *icon_list;
- gint icon_number;
-
- bar = E_MSG_COMPOSER_ATTACHMENT_BAR (widget);
- icon_list = GNOME_ICON_LIST (widget);
-
- 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_select_icon (icon_list, icon_number);
- popup_icon_context_menu (bar, icon_number, event);
- } else {
- popup_context_menu (bar, event);
- }
-
- return TRUE;
-}
-
-
-/* Initialization. */
-
-static void
-class_init (EMsgComposerAttachmentBarClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GnomeIconListClass *icon_list_class;
-
- object_class = GTK_OBJECT_CLASS (class);
- widget_class = GTK_WIDGET_CLASS (class);
- icon_list_class = GNOME_ICON_LIST_CLASS (class);
-
- parent_class = gtk_type_class (gnome_icon_list_get_type ());
-
- object_class->destroy = destroy;
-
- widget_class->button_press_event = button_press_event;
-
- /* Setup signals. */
-
- signals[CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EMsgComposerAttachmentBarClass,
- changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (EMsgComposerAttachmentBar *bar)
-{
- EMsgComposerAttachmentBarPrivate *priv;
- guint icon_size;
-
- priv = g_new (EMsgComposerAttachmentBarPrivate, 1);
-
- priv->attachments = NULL;
- priv->context_menu = NULL;
- priv->icon_context_menu = NULL;
-
- priv->num_attachments = 0;
-
- bar->priv = priv;
-
- /* FIXME partly hardcoded. We should compute height from the font, and
- allow at least 2 lines for every item. */
- icon_size = ICON_WIDTH + ICON_SPACING + ICON_BORDER + ICON_TEXT_SPACING;
- icon_size += 24;
-
- gtk_widget_set_usize (GTK_WIDGET (bar), icon_size * 4, icon_size);
-}
-
-
-GtkType
-e_msg_composer_attachment_bar_get_type (void)
-{
- static GtkType type = 0;
-
- if (type == 0) {
- static const GtkTypeInfo info = {
- "EMsgComposerAttachmentBar",
- sizeof (EMsgComposerAttachmentBar),
- sizeof (EMsgComposerAttachmentBarClass),
- (GtkClassInitFunc) class_init,
- (GtkObjectInitFunc) init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (gnome_icon_list_get_type (), &info);
- }
-
- return type;
-}
-
-GtkWidget *
-e_msg_composer_attachment_bar_new (GtkAdjustment *adj)
-{
- EMsgComposerAttachmentBar *new;
- GnomeIconList *icon_list;
-
- gtk_widget_push_visual (gdk_imlib_get_visual ());
- gtk_widget_push_colormap (gdk_imlib_get_colormap ());
- new = gtk_type_new (e_msg_composer_attachment_bar_get_type ());
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
-
- icon_list = GNOME_ICON_LIST (new);
-
- gnome_icon_list_construct (icon_list, ICON_WIDTH, adj, 0);
-
- 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 void
-attach_to_multipart (CamelMultipart *multipart,
- EMsgComposerAttachment *attachment)
-{
- GMimeContentField *content_type;
-
- content_type = camel_mime_part_get_content_type (attachment->body);
-
- /* Kludge a bit on CTE. For now, we set QP for text and B64
- * for all else except message (which must be 7bit, 8bit, or
- * binary). FIXME.
- */
- if (!g_strcasecmp (content_type->type, "text")) {
- camel_mime_part_set_encoding (attachment->body,
- CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE);
- } else if (g_strcasecmp (content_type->type, "message") != 0) {
- camel_mime_part_set_encoding (attachment->body,
- CAMEL_MIME_PART_ENCODING_BASE64);
- }
-
- camel_multipart_add_part (multipart, attachment->body);
-}
-
-void
-e_msg_composer_attachment_bar_to_multipart (EMsgComposerAttachmentBar *bar,
- CamelMultipart *multipart)
-{
- EMsgComposerAttachmentBarPrivate *priv;
- GList *p;
-
- g_return_if_fail (bar != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar));
- g_return_if_fail (multipart != NULL);
- 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);
- }
-}
-
-
-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);
-}
-
-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 1f331c2870..0000000000
--- a/composer/e-msg-composer-attachment-bar.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* msg-composer-attachment-bar.h
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __E_MSG_COMPOSER_ATTACHMENT_BAR_H__
-#define __E_MSG_COMPOSER_ATTACHMENT_BAR_H__
-
-#include <gnome.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) \
- (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR, EMsgComposerAttachmentBar))
-#define E_MSG_COMPOSER_ATTACHMENT_BAR_CLASS(klass) \
- (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR, EMsgComposerAttachmentBarClass))
-#define E_IS_MSG_COMPOSER_ATTACHMENT_BAR(obj) \
- (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR))
-#define E_IS_MSG_COMPOSER_ATTACHMENT_BAR_CLASS(klass) \
- (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR))
-
-
-typedef struct _EMsgComposerAttachmentBarPrivate EMsgComposerAttachmentBarPrivate;
-
-struct _EMsgComposerAttachmentBar {
- GnomeIconList parent;
-
- EMsgComposerAttachmentBarPrivate *priv;
-};
-typedef struct _EMsgComposerAttachmentBar EMsgComposerAttachmentBar;
-
-struct _EMsgComposerAttachmentBarClass {
- GnomeIconListClass parent_class;
-
- void (* changed) (EMsgComposerAttachmentBar *bar);
-};
-typedef struct _EMsgComposerAttachmentBarClass EMsgComposerAttachmentBarClass;
-
-
-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);
-guint e_msg_composer_attachment_bar_get_num_attachments (EMsgComposerAttachmentBar *bar);
-void e_msg_composer_attachment_bar_attach (EMsgComposerAttachmentBar *bar, const gchar *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 9883640e23..0000000000
--- a/composer/e-msg-composer-attachment.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-attachment.c
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-/* This is the object representing an email attachment. It is implemented as a
- GtkObject 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. */
-
-#include <sys/stat.h>
-
-#include <gnome.h>
-#include <camel/camel.h>
-
-#include "e-msg-composer-attachment.h"
-
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static GtkObjectClass *parent_class = NULL;
-
-
-/* Utility functions. */
-
-static const gchar *
-get_mime_type (const gchar *file_name)
-{
- const gchar *mime_type;
-
- mime_type = gnome_mime_type_of_file (file_name);
- if (mime_type == NULL)
- mime_type = "application/octet-stream";
-
- return mime_type;
-}
-
-static void
-changed (EMsgComposerAttachment *attachment)
-{
- gtk_signal_emit (GTK_OBJECT (attachment), signals[CHANGED]);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EMsgComposerAttachment *attachment;
-
- attachment = E_MSG_COMPOSER_ATTACHMENT (object);
-
- camel_object_unref (CAMEL_OBJECT (attachment->body));
-}
-
-
-/* Signals. */
-
-static void
-real_changed (EMsgComposerAttachment *msg_composer_attachment)
-{
- g_return_if_fail (msg_composer_attachment != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT (msg_composer_attachment));
-}
-
-
-static void
-class_init (EMsgComposerAttachmentClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass*) klass;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-
- object_class->destroy = destroy;
-
- signals[CHANGED] = gtk_signal_new ("changed",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET
- (EMsgComposerAttachmentClass,
- changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-
- klass->changed = real_changed;
-}
-
-static void
-init (EMsgComposerAttachment *msg_composer_attachment)
-{
- msg_composer_attachment->editor_gui = NULL;
- msg_composer_attachment->body = NULL;
- msg_composer_attachment->size = 0;
-}
-
-GtkType
-e_msg_composer_attachment_get_type (void)
-{
- static GtkType type = 0;
-
- if (type == 0) {
- static const GtkTypeInfo info = {
- "EMsgComposerAttachment",
- sizeof (EMsgComposerAttachment),
- sizeof (EMsgComposerAttachmentClass),
- (GtkClassInitFunc) class_init,
- (GtkObjectInitFunc) init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
-
-
-/**
- * e_msg_composer_attachment_new:
- * @file_name:
- *
- * Return value:
- **/
-EMsgComposerAttachment *
-e_msg_composer_attachment_new (const gchar *file_name)
-{
- EMsgComposerAttachment *new;
- CamelMimePart *part;
- CamelDataWrapper *wrapper;
- CamelStream *data;
- struct stat statbuf;
-
- g_return_val_if_fail (file_name != NULL, NULL);
-
- data = camel_stream_fs_new_with_name (file_name, O_RDONLY, 0);
- if (!data)
- return NULL;
- wrapper = camel_data_wrapper_new ();
- camel_data_wrapper_construct_from_stream (wrapper, data);
- camel_object_unref (CAMEL_OBJECT (data));
- camel_data_wrapper_set_mime_type (wrapper, get_mime_type (file_name));
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper);
- camel_object_unref (CAMEL_OBJECT (wrapper));
-
- camel_mime_part_set_disposition (part, "attachment");
- if (strchr (file_name, '/'))
- camel_mime_part_set_filename (part, strrchr (file_name, '/') + 1);
- else
- camel_mime_part_set_filename (part, file_name);
-
- new = e_msg_composer_attachment_new_from_mime_part (part);
- if (stat (file_name, &statbuf) < 0)
- new->size = 0;
- else
- 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;
-
- g_return_val_if_fail (CAMEL_IS_MIME_PART (part), NULL);
-
- new = gtk_type_new (e_msg_composer_attachment_get_type ());
-
- new->editor_gui = NULL;
- new->body = part;
- camel_object_ref (CAMEL_OBJECT (part));
- new->guessed_type = FALSE;
- new->size = 0;
-
- return new;
-}
-
-
-/* The attachment property dialog. */
-
-struct _DialogData {
- GtkWidget *dialog;
- GtkEntry *file_name_entry;
- GtkEntry *description_entry;
- GtkEntry *mime_type_entry;
- EMsgComposerAttachment *attachment;
-};
-typedef struct _DialogData DialogData;
-
-static void
-destroy_dialog_data (DialogData *data)
-{
- g_free (data);
-}
-
-static void
-update_mime_type (DialogData *data)
-{
- const gchar *mime_type;
- const gchar *file_name;
-
- if (!data->attachment->guessed_type)
- return;
-
- file_name = gtk_entry_get_text (data->file_name_entry);
- mime_type = get_mime_type (file_name);
-
- gtk_entry_set_text (data->mime_type_entry, mime_type);
-}
-
-static void
-set_entry (GladeXML *xml,
- const gchar *widget_name,
- const gchar *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);
- gtk_entry_set_text (entry, value ? value : "");
-}
-
-static void
-connect_widget (GladeXML *gui,
- const gchar *name,
- const gchar *signal_name,
- GtkSignalFunc func,
- gpointer data)
-{
- GtkWidget *widget;
-
- widget = glade_xml_get_widget (gui, name);
- gtk_signal_connect (GTK_OBJECT (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 (glade_xml_get_widget (attachment->editor_gui,
- "dialog"));
- gtk_object_unref (GTK_OBJECT (attachment->editor_gui));
- attachment->editor_gui = NULL;
-
- destroy_dialog_data (dialog_data);
-}
-
-static void
-ok_cb (GtkWidget *widget,
- gpointer data)
-{
- DialogData *dialog_data;
- EMsgComposerAttachment *attachment;
-
- dialog_data = (DialogData *) data;
- attachment = dialog_data->attachment;
-
- camel_mime_part_set_filename (attachment->body, gtk_entry_get_text
- (dialog_data->file_name_entry));
-
- camel_mime_part_set_description (attachment->body, gtk_entry_get_text
- (dialog_data->description_entry));
-
- camel_mime_part_set_content_type (attachment->body, gtk_entry_get_text
- (dialog_data->mime_type_entry));
- camel_data_wrapper_set_mime_type (
- camel_medium_get_content_object (CAMEL_MEDIUM (attachment->body)),
- gtk_entry_get_text (dialog_data->mime_type_entry));
-
- changed (attachment);
- close_cb (widget, data);
-}
-
-static void
-file_name_focus_out_cb (GtkWidget *widget,
- GdkEventFocus *event,
- gpointer data)
-{
- DialogData *dialog_data;
-
- dialog_data = (DialogData *) data;
- update_mime_type (dialog_data);
-}
-
-
-void
-e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment,
- GtkWidget *parent)
-{
- DialogData *dialog_data;
- GladeXML *editor_gui;
-
- 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 (E_GLADEDIR "/e-msg-composer-attachment.glade",
- 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);
- 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"));
-
- if (attachment != NULL) {
- GMimeContentField *content_type;
- char *type;
-
- 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 = g_strdup_printf ("%s/%s", content_type->type,
- content_type->subtype);
- set_entry (editor_gui, "mime_type_entry", type);
- g_free (type);
- }
-
- connect_widget (editor_gui, "ok_button", "clicked", ok_cb, dialog_data);
- connect_widget (editor_gui, "close_button", "clicked", close_cb, dialog_data);
-
- connect_widget (editor_gui, "file_name_entry", "focus_out_event",
- file_name_focus_out_cb, dialog_data);
-}
diff --git a/composer/e-msg-composer-attachment.glade b/composer/e-msg-composer-attachment.glade
deleted file mode 100644
index a9717bef69..0000000000
--- a/composer/e-msg-composer-attachment.glade
+++ /dev/null
@@ -1,258 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>e-msg-composer-attachment</name>
- <program_name>e-msg-composer-attachment</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-msg-composer-attachment.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog</name>
- <title>Attachment properties</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>ok_button</name>
- <can_default>True</can_default>
- <has_default>True</has_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>close_button</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CLOSE</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkTable</class>
- <name>table1</name>
- <rows>3</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>10</row_spacing>
- <column_spacing>5</column_spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>description_entry</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox3</name>
- <homogeneous>False</homogeneous>
- <spacing>10</spacing>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>True</xshrink>
- <yshrink>True</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <name>file_name_entry</name>
- <width>290</width>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>mime_type_entry</name>
- <sensitive>False</sensitive>
- <can_focus>True</can_focus>
- <editable>False</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label3</name>
- <label>MIME type:</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label1</name>
- <label>Description:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label2</name>
- <label>File name:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/composer/e-msg-composer-attachment.glade.h b/composer/e-msg-composer-attachment.glade.h
deleted file mode 100644
index 845aea9b32..0000000000
--- a/composer/e-msg-composer-attachment.glade.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Attachment properties");
-gchar *s = N_("MIME type:");
-gchar *s = N_("Description:");
-gchar *s = N_("File name:");
diff --git a/composer/e-msg-composer-attachment.h b/composer/e-msg-composer-attachment.h
deleted file mode 100644
index e0cd2eb867..0000000000
--- a/composer/e-msg-composer-attachment.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-attachment.h
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-#ifndef __E_MSG_COMPOSER_ATTACHMENT_H__
-#define __E_MSG_COMPOSER_ATTACHMENT_H__
-
-#include <gnome.h>
-#include <glade/glade-xml.h>
-#include <camel/camel-mime-part.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) (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT, EMsgComposerAttachment))
-#define E_MSG_COMPOSER_ATTACHMENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_ATTACHMENT, EMsgComposerAttachmentClass))
-#define E_IS_MSG_COMPOSER_ATTACHMENT(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT))
-#define E_IS_MSG_COMPOSER_ATTACHMENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT))
-
-
-typedef struct _EMsgComposerAttachment EMsgComposerAttachment;
-typedef struct _EMsgComposerAttachmentClass EMsgComposerAttachmentClass;
-
-struct _EMsgComposerAttachment {
- GtkObject parent;
-
- GladeXML *editor_gui;
-
- CamelMimePart *body;
- gboolean guessed_type;
- gulong size;
-};
-
-struct _EMsgComposerAttachmentClass {
- GtkObjectClass parent_class;
-
- void (*changed) (EMsgComposerAttachment *msg_composer_attachment);
-};
-
-
-GtkType e_msg_composer_attachment_get_type (void);
-EMsgComposerAttachment *e_msg_composer_attachment_new (const gchar *file_name);
-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 1e3502c79a..0000000000
--- a/composer/e-msg-composer-hdrs.c
+++ /dev/null
@@ -1,709 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* msg-composer-hdrs.c
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef _HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-#include <camel/camel.h>
-
-#include <bonobo.h>
-
-#include <liboaf/liboaf.h>
-
-#include "Evolution-Addressbook-SelectNames.h"
-
-#include "e-msg-composer-address-entry.h"
-#include "e-msg-composer-hdrs.h"
-#include "widgets/e-text/e-entry.h"
-
-#include "mail/mail-config.h"
-
-
-#define SELECT_NAMES_OAFID "OAFIID:addressbook:select-names:39301deb-174b-40d1-8a6e-5edc300f7b61"
-
-struct _EMsgComposerHdrsPrivate {
- Evolution_Addressbook_SelectNames corba_select_names;
-
- /* Total number of headers that we have. */
- guint num_hdrs;
-
- /* The tooltips. */
- GtkTooltips *tooltips;
-
- /* Standard headers. */
- GtkWidget *from_entry;
- GtkWidget *to_entry;
- GtkWidget *cc_entry;
- GtkWidget *bcc_entry;
- GtkWidget *subject_entry;
-};
-
-
-static GtkTableClass *parent_class = NULL;
-
-enum {
- SHOW_ADDRESS_DIALOG,
- LAST_SIGNAL
-};
-
-enum {
- HEADER_ADDRBOOK,
- HEADER_COMBOBOX,
- HEADER_ENTRYBOX
-};
-
-static gint signals[LAST_SIGNAL];
-
-
-static gboolean
-setup_corba (EMsgComposerHdrs *hdrs)
-{
- EMsgComposerHdrsPrivate *priv;
- CORBA_Environment ev;
-
- priv = hdrs->priv;
-
- g_assert (priv->corba_select_names == CORBA_OBJECT_NIL);
-
- CORBA_exception_init (&ev);
-
- priv->corba_select_names = oaf_activate_from_id (SELECT_NAMES_OAFID, 0, NULL, &ev);
-
- /* OAF seems to be broken -- it can return a CORBA_OBJECT_NIL without
- raising an exception in `ev'. */
- if (ev._major != CORBA_NO_EXCEPTION || priv->corba_select_names == CORBA_OBJECT_NIL) {
- g_warning ("Cannot activate -- %s", SELECT_NAMES_OAFID);
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- return TRUE;
-}
-
-
-static void
-address_button_clicked_cb (GtkButton *button,
- gpointer data)
-{
- EMsgComposerHdrs *hdrs;
- EMsgComposerHdrsPrivate *priv;
- CORBA_Environment ev;
-
- hdrs = E_MSG_COMPOSER_HDRS (data);
- priv = hdrs->priv;
-
- CORBA_exception_init (&ev);
-
- /* FIXME section. */
- Evolution_Addressbook_SelectNames_activate_dialog (priv->corba_select_names, "", &ev);
-
- CORBA_exception_free (&ev);
-}
-
-static GtkWidget *
-create_dropdown_entry (EMsgComposerHdrs *hdrs,
- const char *name)
-{
- GtkWidget *combo;
- GList *values = NULL;
-
- combo = gtk_combo_new ();
- gtk_combo_set_use_arrows (GTK_COMBO (combo), TRUE);
- gtk_combo_set_case_sensitive (GTK_COMBO (combo), FALSE);
- if (!strcmp (name, _("From:"))) {
- CamelInternetAddress *ciaddr;
- GSList *ids, *stmp;
- GList *tmp;
- MailConfigIdentity *id;
- char *val;
-
- ids = mail_config_get_identities ();
- stmp = ids;
- while (stmp) {
- char *address;
-
- id = stmp->data;
- g_assert (id);
- g_assert (id->name);
- g_assert (id->address);
-
- ciaddr = camel_internet_address_new ();
- camel_internet_address_add (ciaddr, id->name, id->address);
- address = camel_address_encode (CAMEL_ADDRESS (ciaddr));
- values = g_list_append (values, address);
- stmp = stmp->next;
- }
-
- gtk_combo_set_popdown_strings (GTK_COMBO (combo), values);
-
- tmp = values;
- while (tmp) {
- g_free (tmp->data);
- tmp = tmp->next;
- }
- g_list_free (values);
-
- id = mail_config_get_default_identity ();
- g_assert (id);
- g_assert (id->name);
- g_assert (id->address);
-
- ciaddr = camel_internet_address_new ();
- camel_internet_address_add (ciaddr, id->name, id->address);
- val = camel_address_encode (CAMEL_ADDRESS (ciaddr));
-
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo)->entry), val);
- g_free (val);
- }
-
- return combo;
-}
-
-static GtkWidget *
-create_addressbook_entry (EMsgComposerHdrs *hdrs,
- const char *name)
-{
- EMsgComposerHdrsPrivate *priv;
- Evolution_Addressbook_SelectNames corba_select_names;
- Bonobo_Control corba_control;
- GtkWidget *control_widget;
- CORBA_Environment ev;
-
- priv = hdrs->priv;
- corba_select_names = priv->corba_select_names;
-
- CORBA_exception_init (&ev);
-
- Evolution_Addressbook_SelectNames_add_section (corba_select_names, name, name, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- corba_control = Evolution_Addressbook_SelectNames_get_entry_for_section (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, CORBA_OBJECT_NIL);
-
- return control_widget;
-}
-
-static GtkWidget *
-add_header (EMsgComposerHdrs *hdrs,
- const gchar *name,
- const gchar *tip,
- const gchar *tip_private,
- int type)
-{
- EMsgComposerHdrsPrivate *priv;
- GtkWidget *label;
- GtkWidget *entry;
- guint pad;
-
- priv = hdrs->priv;
-
- if (type == HEADER_ADDRBOOK) {
- label = gtk_button_new_with_label (name);
- GTK_OBJECT_UNSET_FLAGS(label, GTK_CAN_FOCUS);
- gtk_signal_connect (GTK_OBJECT (label), "clicked",
- GTK_SIGNAL_FUNC (address_button_clicked_cb),
- hdrs);
- pad = 2;
- gtk_tooltips_set_tip (hdrs->priv->tooltips, label,
- _("Click here for the address book"),
- NULL);
- } else {
- label = gtk_label_new (name);
- pad = GNOME_PAD;
- }
-
- gtk_table_attach (GTK_TABLE (hdrs), label,
- 0, 1, priv->num_hdrs, priv->num_hdrs + 1,
- GTK_FILL, GTK_FILL,
- pad, pad);
- gtk_widget_show (label);
-
- switch (type) {
- case HEADER_ADDRBOOK:
- entry = create_addressbook_entry (hdrs, name);
- break;
- case HEADER_COMBOBOX:
- entry = create_dropdown_entry (hdrs, name);
- break;
- default:
- entry = e_entry_new ();
- gtk_object_set(GTK_OBJECT(entry),
- "editable", TRUE,
- "use_ellipsis", TRUE,
- NULL);
- }
-
- if (entry != NULL) {
- gtk_widget_show (entry);
-
- gtk_table_attach (GTK_TABLE (hdrs), entry,
- 1, 2, priv->num_hdrs, priv->num_hdrs + 1,
- GTK_FILL | GTK_EXPAND, 0,
- 2, 2);
-
- gtk_tooltips_set_tip (hdrs->priv->tooltips, entry, tip, tip_private);
- }
-
- priv->num_hdrs++;
-
- return entry;
-}
-
-static void
-setup_headers (EMsgComposerHdrs *hdrs)
-{
- EMsgComposerHdrsPrivate *priv;
-
- priv = hdrs->priv;
-
- priv->from_entry = add_header
- (hdrs, _("From:"),
- _("Enter the identitiy you wish to send this message from"),
- NULL,
- HEADER_COMBOBOX);
- priv->to_entry = add_header
- (hdrs, _("To:"),
- _("Enter the recipients of the message"),
- NULL,
- HEADER_ADDRBOOK);
- priv->cc_entry = add_header
- (hdrs, _("Cc:"),
- _("Enter the addresses that will receive a carbon copy of "
- "the message"),
- NULL,
- HEADER_ADDRBOOK);
- priv->bcc_entry = add_header
- (hdrs, _("Bcc:"),
- _("Enter the addresses that will receive a carbon copy of "
- "the message without appearing in the recipient list of "
- "the message."),
- NULL,
- HEADER_ADDRBOOK);
- priv->subject_entry = add_header
- (hdrs, _("Subject:"),
- _("Enter the subject of the mail"),
- NULL,
- HEADER_ENTRYBOX);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EMsgComposerHdrs *hdrs;
- EMsgComposerHdrsPrivate *priv;
-
- hdrs = E_MSG_COMPOSER_HDRS (object);
- priv = hdrs->priv;
-
- if (priv->corba_select_names != CORBA_OBJECT_NIL) {
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (priv->corba_select_names, &ev);
- CORBA_exception_free (&ev);
- }
-
- gtk_object_destroy (GTK_OBJECT (priv->tooltips));
-
- 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 = gtk_type_class (gtk_table_get_type ());
-
- signals[SHOW_ADDRESS_DIALOG] =
- gtk_signal_new ("show_address_dialog",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EMsgComposerHdrsClass,
- show_address_dialog),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (EMsgComposerHdrs *hdrs)
-{
- EMsgComposerHdrsPrivate *priv;
-
- priv = g_new (EMsgComposerHdrsPrivate, 1);
-
- priv->corba_select_names = CORBA_OBJECT_NIL;
-
- priv->from_entry = NULL;
- priv->to_entry = NULL;
- priv->cc_entry = NULL;
- priv->bcc_entry = NULL;
- priv->subject_entry = NULL;
-
- priv->tooltips = gtk_tooltips_new ();
-
- priv->num_hdrs = 0;
-
- hdrs->priv = priv;
-}
-
-
-GtkType
-e_msg_composer_hdrs_get_type (void)
-{
- static GtkType type = 0;
-
- if (type == 0) {
- static const GtkTypeInfo info = {
- "EMsgComposerHdrs",
- sizeof (EMsgComposerHdrs),
- sizeof (EMsgComposerHdrsClass),
- (GtkClassInitFunc) class_init,
- (GtkObjectInitFunc) init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (gtk_table_get_type (), &info);
- }
-
- return type;
-}
-
-GtkWidget *
-e_msg_composer_hdrs_new (void)
-{
- EMsgComposerHdrs *new;
- EMsgComposerHdrsPrivate *priv;
-
- new = gtk_type_new (e_msg_composer_hdrs_get_type ());
- priv = new->priv;
-
- if (! setup_corba (new)) {
- gtk_widget_destroy (GTK_WIDGET (new));
- return NULL;
- }
-
- setup_headers (new);
-
- return GTK_WIDGET (new);
-}
-
-
-static GList *
-decode_addresses (const char *s)
-{
- const char *p, *oldp;
- gboolean in_quotes;
- GList *list;
-
- g_print ("Decoding addresses -- %s\n", s ? s : "(null)");
-
- if (s == NULL)
- return NULL;
-
- in_quotes = FALSE;
- list = NULL;
-
- p = s;
- oldp = s;
-
- while (1) {
- if (*p == '"') {
- in_quotes = ! in_quotes;
- p++;
- } else if ((! in_quotes && *p == ',') || *p == 0) {
- if (p != oldp) {
- char *new_addr;
-
- new_addr = g_strndup (oldp, p - oldp);
- new_addr = g_strstrip (new_addr);
- if (*new_addr != '\0')
- list = g_list_prepend (list, new_addr);
- else
- g_free (new_addr);
- }
-
- while (*p == ',' || *p == ' ' || *p == '\t')
- p++;
-
- if (*p == 0)
- break;
-
- oldp = p;
- } else {
- p++;
- }
- }
-
- return g_list_reverse (list);
-}
-
-static void
-set_recipients (CamelMimeMessage *msg,
- GtkWidget *entry_widget,
- const gchar *type)
-{
- GList *list;
- GList *p;
- struct _header_address *addr;
- char *s;
-
- bonobo_widget_get_property (BONOBO_WIDGET (entry_widget), "text", &s, NULL);
-
- list = decode_addresses (s);
-
- g_free (s);
-
- /* FIXME leak? */
-
- for (p = list; p != NULL; p = p->next) {
- addr = header_address_decode (p->data);
- camel_mime_message_add_recipient (msg, type, addr->name,
- addr->v.addr);
- header_address_unref (addr);
- }
-
- g_list_free (list);
-}
-
-void
-e_msg_composer_hdrs_to_message (EMsgComposerHdrs *hdrs,
- CamelMimeMessage *msg)
-{
- const gchar *s;
-
- g_return_if_fail (hdrs != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
- g_return_if_fail (msg != NULL);
- g_return_if_fail (CAMEL_IS_MIME_MESSAGE (msg));
-
- gtk_object_get(GTK_OBJECT(hdrs->priv->subject_entry),
- "text", &s,
- NULL);
- camel_mime_message_set_subject (msg, g_strdup (s));
-
- set_recipients (msg, hdrs->priv->to_entry, CAMEL_RECIPIENT_TYPE_TO);
- set_recipients (msg, hdrs->priv->cc_entry, CAMEL_RECIPIENT_TYPE_CC);
- set_recipients (msg, hdrs->priv->bcc_entry, CAMEL_RECIPIENT_TYPE_BCC);
-}
-
-
-static void
-set_entry (BonoboWidget *bonobo_widget,
- const GList *list)
-{
- GString *string;
- const GList *p;
-
- string = g_string_new (NULL);
- for (p = list; p != NULL; p = p->next) {
- if (string->str[0] != '\0')
- g_string_append (string, ", ");
- g_string_append (string, p->data);
- }
-
- bonobo_widget_set_property (BONOBO_WIDGET (bonobo_widget), "text", string->str, NULL);
-
- g_string_free (string, TRUE);
-}
-
-void
-e_msg_composer_hdrs_set_from (EMsgComposerHdrs *hdrs,
- const char *from)
-{
- GtkEntry *entry;
-
- g_return_if_fail (hdrs != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- entry = GTK_ENTRY (GTK_COMBO (hdrs->priv->from_entry)->entry);
- gtk_entry_set_text (entry, from);
-}
-
-void
-e_msg_composer_hdrs_set_to (EMsgComposerHdrs *hdrs,
- const GList *to_list)
-{
- g_return_if_fail (hdrs != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- set_entry (BONOBO_WIDGET (hdrs->priv->to_entry), to_list);
-}
-
-void
-e_msg_composer_hdrs_set_cc (EMsgComposerHdrs *hdrs,
- const GList *cc_list)
-{
- g_return_if_fail (hdrs != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- set_entry (BONOBO_WIDGET (hdrs->priv->cc_entry), cc_list);
-}
-
-void
-e_msg_composer_hdrs_set_bcc (EMsgComposerHdrs *hdrs,
- const GList *bcc_list)
-{
- g_return_if_fail (hdrs != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- set_entry (BONOBO_WIDGET (hdrs->priv->bcc_entry), bcc_list);
-}
-
-void
-e_msg_composer_hdrs_set_subject (EMsgComposerHdrs *hdrs,
- const char *subject)
-{
- g_return_if_fail (hdrs != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
- g_return_if_fail (subject != NULL);
-
- gtk_object_set(GTK_OBJECT(hdrs->priv->subject_entry),
- "text", subject,
- NULL);
-}
-
-
-char *
-e_msg_composer_hdrs_get_from (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (hdrs != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (hdrs->priv->from_entry)->entry));
-}
-
-/* FIXME this is currently unused and broken. */
-GList *
-e_msg_composer_hdrs_get_to (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (hdrs != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- g_assert_not_reached ();
-
- return NULL;
-}
-
-/* FIXME this is currently unused and broken. */
-GList *
-e_msg_composer_hdrs_get_cc (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (hdrs != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- g_assert_not_reached ();
-
- return NULL;
-}
-
-/* FIXME this is currently unused and broken. */
-GList *
-e_msg_composer_hdrs_get_bcc (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (hdrs != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- g_assert_not_reached ();
-
- return NULL;
-}
-
-const char *
-e_msg_composer_hdrs_get_subject (EMsgComposerHdrs *hdrs)
-{
- gchar *subject;
-
- g_return_val_if_fail (hdrs != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- gtk_object_get(GTK_OBJECT(hdrs->priv->subject_entry),
- "text", &subject,
- NULL);
-
- return subject;
-}
-
-
-GtkWidget *
-e_msg_composer_hdrs_get_to_entry (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (hdrs != NULL, NULL);
- 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 (hdrs != NULL, NULL);
- 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 (hdrs != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return hdrs->priv->bcc_entry;
-}
-
-GtkWidget *
-e_msg_composer_hdrs_get_subject_entry (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (hdrs != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return hdrs->priv->subject_entry;
-}
diff --git a/composer/e-msg-composer-hdrs.h b/composer/e-msg-composer-hdrs.h
deleted file mode 100644
index 78a478dbfa..0000000000
--- a/composer/e-msg-composer-hdrs.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* msg-composer-hdrs.h
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef ___E_MSG_COMPOSER_HDRS_H__
-#define ___E_MSG_COMPOSER_HDRS_H__
-
-#include <gnome.h>
-#include <camel/camel-mime-message.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) (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER_HDRS, EMsgComposerHdrs))
-#define E_MSG_COMPOSER_HDRS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_HDRS, EMsgComposerHdrsClass))
-#define E_IS_MSG_COMPOSER_HDRS(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER_HDRS))
-#define E_IS_MSG_COMPOSER_HDRS_CLASS(klass) (GTK_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;
-};
-
-struct _EMsgComposerHdrsClass {
- GtkTableClass parent_class;
-
- void (* show_address_dialog) (EMsgComposerHdrs *hdrs);
-};
-
-
-GtkType e_msg_composer_hdrs_get_type (void);
-GtkWidget *e_msg_composer_hdrs_new (void);
-
-void e_msg_composer_hdrs_to_message (EMsgComposerHdrs *hdrs,
- CamelMimeMessage *msg);
-
-void e_msg_composer_hdrs_set_from (EMsgComposerHdrs *hdrs,
- const char *from);
-void e_msg_composer_hdrs_set_to (EMsgComposerHdrs *hdrs,
- const GList *to_list);
-void e_msg_composer_hdrs_set_cc (EMsgComposerHdrs *hdrs,
- const GList *cc_list);
-void e_msg_composer_hdrs_set_bcc (EMsgComposerHdrs *hdrs,
- const GList *bcc_list);
-void e_msg_composer_hdrs_set_subject (EMsgComposerHdrs *hdrs,
- const char *subject);
-
-char *e_msg_composer_hdrs_get_from (EMsgComposerHdrs *hdrs);
-GList *e_msg_composer_hdrs_get_to (EMsgComposerHdrs *hdrs);
-GList *e_msg_composer_hdrs_get_cc (EMsgComposerHdrs *hdrs);
-GList *e_msg_composer_hdrs_get_bcc (EMsgComposerHdrs *hdrs);
-const char *e_msg_composer_hdrs_get_subject (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_subject_entry (EMsgComposerHdrs *hdrs);
-
-#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 e9f4e421a3..0000000000
--- a/composer/e-msg-composer-select-file.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-select-file.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#include <gtk/gtkfilesel.h>
-
-#include "e-msg-composer-select-file.h"
-
-
-struct _FileSelectionInfo {
- GtkWidget *widget;
- char *selected_file;
-};
-typedef struct _FileSelectionInfo FileSelectionInfo;
-
-
-static void
-confirm (FileSelectionInfo *info)
-{
- const char *filename;
-
- filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (info->widget));
- info->selected_file = g_strdup (filename);
-
- gtk_widget_hide (info->widget);
-
- gtk_main_quit ();
-}
-
-static void
-cancel (FileSelectionInfo *info)
-{
- g_assert (info->selected_file == NULL);
-
- gtk_widget_hide (info->widget);
-
- gtk_main_quit ();
-}
-
-
-/* Callbacks. */
-
-static void
-ok_clicked_cb (GtkWidget *widget,
- void *data)
-{
- FileSelectionInfo *info;
-
- info = (FileSelectionInfo *) data;
- confirm (info);
-}
-
-static void
-cancel_clicked_cb (GtkWidget *widget,
- void *data)
-{
- FileSelectionInfo *info;
-
- info = (FileSelectionInfo *) data;
- cancel (info);
-}
-
-static int
-delete_event_cb (GtkWidget *widget,
- GdkEventAny *event,
- void *data)
-{
- FileSelectionInfo *info;
-
- info = (FileSelectionInfo *) data;
- cancel (info);
-
- return TRUE;
-}
-
-
-/* Setup. */
-
-static FileSelectionInfo *
-create_file_selection (EMsgComposer *composer)
-{
- FileSelectionInfo *info;
- GtkWidget *widget;
- GtkWidget *ok_button;
- GtkWidget *cancel_button;
-
- info = g_new (FileSelectionInfo, 1);
-
- widget = gtk_file_selection_new (NULL);
- ok_button = GTK_FILE_SELECTION (widget)->ok_button;
- cancel_button = GTK_FILE_SELECTION (widget)->cancel_button;
-
- gtk_signal_connect (GTK_OBJECT (ok_button),
- "clicked", GTK_SIGNAL_FUNC (ok_clicked_cb), info);
- gtk_signal_connect (GTK_OBJECT (cancel_button),
- "clicked", GTK_SIGNAL_FUNC (cancel_clicked_cb), info);
- gtk_signal_connect (GTK_OBJECT (widget), "delete_event",
- GTK_SIGNAL_FUNC (delete_event_cb), info);
-
- info->widget = widget;
- info->selected_file = NULL;
-
- return info;
-}
-
-static void
-file_selection_info_destroy_notify (void *data)
-{
- FileSelectionInfo *info;
-
- info = (FileSelectionInfo *) data;
-
- g_free (info->selected_file);
- g_free (info);
-}
-
-
-char *
-e_msg_composer_select_file (EMsgComposer *composer,
- const char *title)
-{
- FileSelectionInfo *info;
- char *retval;
-
- g_return_val_if_fail (composer != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
- info = gtk_object_get_data (GTK_OBJECT (composer),
- "e-msg-composer-file-selection-info");
-
- if (info == NULL) {
- info = create_file_selection (composer);
- gtk_object_set_data_full (GTK_OBJECT (composer),
- "e-msg-composer-file-selection-info", info,
- file_selection_info_destroy_notify);
- }
-
- if (GTK_WIDGET_VISIBLE (info->widget))
- return NULL; /* Busy! */
-
- gtk_window_set_title (GTK_WINDOW (info->widget), title);
- gtk_widget_show (info->widget);
-
- GDK_THREADS_ENTER();
- gtk_main ();
- GDK_THREADS_LEAVE();
-
- retval = info->selected_file;
- info->selected_file = NULL;
-
- return retval;
-}
diff --git a/composer/e-msg-composer-select-file.h b/composer/e-msg-composer-select-file.h
deleted file mode 100644
index 2f89bd58b4..0000000000
--- a/composer/e-msg-composer-select-file.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-select-file.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * 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);
-
-#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 2d74775c7d..0000000000
--- a/composer/e-msg-composer.c
+++ /dev/null
@@ -1,1756 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer.c
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-/*
-
- TODO
-
- - Somehow users should be able to see if any file(s) are attached even when
- the attachment bar is not shown.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <errno.h>
-
-#include <bonobo.h>
-#include <bonobo/bonobo-stream-memory.h>
-#include <glade/glade.h>
-#include <gnome.h>
-#include <libgnorba/gnorba.h>
-#include <gtkhtml/gtkhtml.h>
-
-#include "camel/camel.h"
-
-#include "mail/mail.h"
-#include "mail/mail-tools.h"
-#include "mail/mail-threads.h"
-
-#include "e-util/e-html-utils.h"
-#include "e-util/e-gui-utils.h"
-#include "widgets/misc/e-scroll-frame.h"
-
-#include "e-msg-composer.h"
-#include "e-msg-composer-address-dialog.h"
-#include "e-msg-composer-attachment-bar.h"
-#include "e-msg-composer-hdrs.h"
-#include "e-msg-composer-select-file.h"
-
-#define HTML_EDITOR_CONTROL_ID "OAFIID:control:html-editor:63c5499b-8b0c-475a-9948-81ec96a9662c"
-
-
-#define DEFAULT_WIDTH 600
-#define DEFAULT_HEIGHT 500
-
-enum {
- SEND,
- POSTPONE,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static GnomeAppClass *parent_class = NULL;
-
-/* local prototypes */
-static GList *add_recipients (GList *list, const char *recips, gboolean decode);
-static void free_recipients (GList *list);
-
-
-static GtkWidget *
-create_editor (EMsgComposer *composer)
-{
- GtkWidget *control;
-
- control = bonobo_widget_new_control (HTML_EDITOR_CONTROL_ID,
- bonobo_object_corba_objref (BONOBO_OBJECT (composer->uih)));
- if (control == NULL) {
- g_error ("Cannot activate `%s'. Did you build gtkhtml with Bonobo and OAF support?", HTML_EDITOR_CONTROL_ID);
- return NULL;
- }
-
- return control;
-}
-
-static char *
-get_text (Bonobo_PersistStream persist, char *format)
-{
- BonoboStream *stream;
- BonoboStreamMem *stream_mem;
- CORBA_Environment ev;
- char *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_malloc (stream_mem->pos + 1);
- memcpy (text, stream_mem->buffer, stream_mem->pos);
- text[stream_mem->pos] = 0;
- bonobo_object_unref (BONOBO_OBJECT(stream));
-
- return text;
-}
-
-#define LINE_LEN 72
-
-/* This might be a temporary function... the GtkHTML export interfaces are
- * not yet complete, so some or all of this may move into GtkHTML.
- */
-static char *
-format_text (char *text)
-{
- GString *out;
- char *s, *space, *outstr;
- int len, tabbing, i;
- gboolean linestart = TRUE, cited = FALSE;
-
- tabbing = 0; /* Shut down compiler. */
- len = strlen (text);
- out = g_string_sized_new (len + len / LINE_LEN);
-
- s = text;
- while (*s) {
- if (linestart) {
- tabbing = 0;
- while (*s == '\t') {
- s++;
- tabbing++;
- }
- cited = (tabbing == 0 && *s == '>');
- }
-
- len = strcspn (s, "\n");
- if (!cited && len > LINE_LEN - tabbing * 8) {
- /* If we can break anywhere between s and
- * s + LINE_LEN, do that. We can break between
- * space and anything but &nbsp;
- */
- space = s + LINE_LEN - tabbing * 8;
- while (space > s && (*space != ' '
- || (*(space + 1) == '\240')
- || (*(space - 1) == '\240')))
- space--;
-
- if (space != s)
- len = space - s;
- }
-
- /* Do initial tabs */
- for (i = 0; i < tabbing; i++)
- g_string_append_c (out, '\t');
-
- /* Copy the line... */
- while (len--) {
- g_string_append_c (out, *s == '\240' ? ' ' : *s);
- s++;
- }
-
- /* Eat whitespace... */
- while (*s == ' ' || *s == '\240')
- s++;
- if (*s == '\n') {
- s++;
- linestart = TRUE;
- } else
- linestart = FALSE;
-
- /* And end the line. */
- g_string_append_c (out, '\n');
- }
-
- outstr = out->str;
- g_string_free (out, FALSE);
- return outstr;
-}
-
-typedef enum {
- MSG_FORMAT_PLAIN,
- MSG_FORMAT_ALTERNATIVE,
-} MsgFormat;
-
-/* This functions builds a CamelMimeMessage for the message that the user has
- composed in `composer'. */
-static CamelMimeMessage *
-build_message (EMsgComposer *composer)
-{
- EMsgComposerAttachmentBar *attachment_bar =
- E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar);
- CamelMimeMessage *new;
- CamelMultipart *body = NULL;
- CamelMimePart *part;
- char *html = NULL, *plain = NULL, *fmt = NULL;
- int i;
- MsgFormat type = MSG_FORMAT_ALTERNATIVE;
-
- if (composer->persist_stream_interface == CORBA_OBJECT_NIL)
- return NULL;
-
- if (composer->send_html)
- type = MSG_FORMAT_ALTERNATIVE;
- else
- type = MSG_FORMAT_PLAIN;
-
- new = camel_mime_message_new ();
-
- e_msg_composer_hdrs_to_message (E_MSG_COMPOSER_HDRS (composer->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]);
- }
-
- plain = get_text (composer->persist_stream_interface, "text/plain");
- fmt = format_text (plain);
- g_free (plain);
-
- if (type != MSG_FORMAT_PLAIN)
- html = get_text (composer->persist_stream_interface, "text/html");
-
- if (type == MSG_FORMAT_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_mime_part_set_content (part, fmt, strlen (fmt), "text/plain");
- g_free (fmt);
- camel_multipart_add_part (body, part);
- camel_object_unref (CAMEL_OBJECT (part));
-
- part = camel_mime_part_new ();
- camel_mime_part_set_content (part, html, strlen (html), "text/html");
- g_free (html);
- camel_multipart_add_part (body, part);
- camel_object_unref (CAMEL_OBJECT (part));
- }
-
- if (e_msg_composer_attachment_bar_get_num_attachments (attachment_bar)) {
- CamelMultipart *multipart = camel_multipart_new ();
-
- /* Generate a random boundary. */
- camel_multipart_set_boundary (multipart, NULL);
-
- part = camel_mime_part_new ();
- switch (type) {
- case MSG_FORMAT_ALTERNATIVE:
- camel_medium_set_content_object (CAMEL_MEDIUM (part),
- CAMEL_DATA_WRAPPER (body));
- camel_object_unref (CAMEL_OBJECT (body));
- break;
- case MSG_FORMAT_PLAIN:
- camel_mime_part_set_content (part, fmt, strlen (fmt), "text/plain");
- g_free(fmt);
- break;
- }
- camel_multipart_add_part (multipart, part);
- camel_object_unref (CAMEL_OBJECT (part));
-
- e_msg_composer_attachment_bar_to_multipart (attachment_bar, multipart);
-
- camel_medium_set_content_object (CAMEL_MEDIUM (new), CAMEL_DATA_WRAPPER (multipart));
- camel_object_unref (CAMEL_OBJECT (multipart));
- } else {
- CamelDataWrapper *cdw;
- CamelStream *stream;
- switch (type) {
- case MSG_FORMAT_ALTERNATIVE:
- camel_medium_set_content_object (CAMEL_MEDIUM (new), CAMEL_DATA_WRAPPER (body));
- camel_object_unref (CAMEL_OBJECT (body));
- break;
- case MSG_FORMAT_PLAIN:
- stream = camel_stream_mem_new_with_buffer (fmt, strlen (fmt));
- cdw = camel_data_wrapper_new ();
- camel_data_wrapper_construct_from_stream (cdw, stream);
- camel_object_unref (CAMEL_OBJECT (stream));
-
- camel_data_wrapper_set_mime_type (cdw, "text/plain");
-
- camel_medium_set_content_object (CAMEL_MEDIUM (new), CAMEL_DATA_WRAPPER (cdw));
- camel_object_unref (CAMEL_OBJECT (cdw));
- g_free (fmt);
- break;
-
- }
- }
-
- return new;
-}
-
-static char *
-get_signature (const char *sigfile)
-{
- char *rawsig;
- static char *htmlsig = NULL;
- static time_t sigmodtime = -1;
- struct stat st;
- int fd;
-
- if (!sigfile || !*sigfile) {
- return NULL;
- }
-
- if (stat (sigfile, &st) == -1) {
- char *msg;
-
- msg = g_strdup_printf ("Could not open signature file %s:\n%s",
- sigfile, g_strerror (errno));
- gnome_error_dialog (msg);
- g_free (msg);
-
- return NULL;
- }
-
- if (st.st_mtime == sigmodtime)
- return htmlsig;
-
- rawsig = g_malloc (st.st_size + 1);
- fd = open (sigfile, O_RDONLY);
- if (fd == -1) {
- char *msg;
-
- msg = g_strdup_printf ("Could not open signature file %s:\n%s",
- sigfile, g_strerror (errno));
- gnome_error_dialog (msg);
- g_free (msg);
-
- return NULL;
- }
-
- read (fd, rawsig, st.st_size);
- rawsig[st.st_size] = '\0';
- close (fd);
-
- htmlsig = e_text_to_html (rawsig, 0);
- sigmodtime = st.st_mtime;
-
- return htmlsig;
-}
-
-static void
-set_editor_text (BonoboWidget *editor, const char *sig_file, const char *text)
-{
- Bonobo_PersistStream persist;
- BonoboStream *stream;
- CORBA_Environment ev;
- char *sig, *fulltext;
-
- sig = get_signature (sig_file);
- if (sig) {
- if (!strncmp ("-- \n", sig, 3))
- fulltext = g_strdup_printf ("%s<br>\n<pre>\n%s</pre>",
- text, sig);
- else
- fulltext = g_strdup_printf ("%s<br>\n<pre>\n-- \n%s</pre>",
- text, sig);
- } else {
- if (!*text)
- return;
- fulltext = (char*)text;
- }
-
- CORBA_exception_init (&ev);
- persist = (Bonobo_PersistStream)
- bonobo_object_client_query_interface (
- bonobo_widget_get_server (editor),
- "IDL:Bonobo/PersistStream:1.0",
- &ev);
- g_assert (persist != CORBA_OBJECT_NIL);
-
- stream = bonobo_stream_mem_create (fulltext, strlen (fulltext),
- TRUE, FALSE);
- if (sig)
- g_free (fulltext);
- Bonobo_PersistStream_load (persist, (Bonobo_Stream)bonobo_object_corba_objref (BONOBO_OBJECT (stream)), "text/html", &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- /* FIXME. Some error message. */
- return;
- }
- if (ev._major != CORBA_SYSTEM_EXCEPTION)
- CORBA_Object_release (persist, &ev);
-
- Bonobo_Unknown_unref (persist, &ev);
- CORBA_exception_free (&ev);
- bonobo_object_unref (BONOBO_OBJECT(stream));
-}
-
-
-/* Commands. */
-
-static void
-show_attachments (EMsgComposer *composer,
- gboolean show)
-{
- if (show) {
- gtk_widget_show (composer->attachment_scroll_frame);
- gtk_widget_show (composer->attachment_bar);
- } else {
- gtk_widget_hide (composer->attachment_scroll_frame);
- gtk_widget_hide (composer->attachment_bar);
- }
-
- composer->attachment_bar_visible = show;
-
- /* Update the GUI. */
-
-#if 0
- gtk_check_menu_item_set_active
- (GTK_CHECK_MENU_ITEM
- (glade_xml_get_widget (composer->menubar_gui,
- "menu_view_attachments")),
- show);
-#endif
-
- /* XXX we should update the toggle toolbar item as well. At
- this point, it is not a toggle because Glade is broken. */
-}
-
-static void
-save (EMsgComposer *composer,
- const char *file_name)
-{
- CORBA_Environment ev;
- char *my_file_name;
-
- if (file_name != NULL)
- my_file_name = g_strdup (file_name);
- else
- my_file_name = e_msg_composer_select_file (composer, _("Save as..."));
-
- if (my_file_name == NULL)
- return;
-
- CORBA_exception_init (&ev);
-
- Bonobo_PersistFile_save (composer->persist_file_interface, my_file_name, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- e_notice (GTK_WINDOW (composer), GNOME_MESSAGE_BOX_ERROR,
- _("Error saving file: %s"), g_basename (file_name));
- }
-
- CORBA_exception_free (&ev);
-
- g_free (my_file_name);
-}
-
-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_notice (GTK_WINDOW (composer), GNOME_MESSAGE_BOX_ERROR,
- _("Error loading file: %s"), g_basename (file_name));
-
- CORBA_exception_free (&ev);
-}
-
-/* Exit dialog. (Displays a "Save composition to 'Drafts' before exiting?" warning before actually exiting.) */
-
-enum { REPLY_YES = 0, REPLY_NO, REPLY_CANCEL };
-
-typedef struct save_draft_input_s {
- EMsgComposer *composer;
-} save_draft_input_t;
-
-typedef struct save_draft_data_s {
- CamelMimeMessage *msg;
- CamelMessageInfo *info;
-} save_draft_data_t;
-
-static gchar *
-describe_save_draft (gpointer in_data, gboolean gerund)
-{
- if (gerund) {
- return g_strdup (_("Saving changes to message..."));
- } else {
- return g_strdup (_("About to save changes to message..."));
- }
-}
-
-static void
-setup_save_draft (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- save_draft_input_t *input = (save_draft_input_t *) in_data;
- save_draft_data_t *data = (save_draft_data_t *) op_data;
-
- g_return_if_fail (input->composer != NULL);
-
- /* initialize op_data */
- data->msg = e_msg_composer_get_message (input->composer);
- data->info = g_new0 (CamelMessageInfo, 1);
- data->info->flags = CAMEL_MESSAGE_DRAFT;
-}
-
-static void
-do_save_draft (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- /*save_draft_input_t *input = (save_draft_input_t *) in_data;*/
- save_draft_data_t *data = (save_draft_data_t *) op_data;
- extern CamelFolder *drafts_folder;
-
- /* perform camel operations */
- mail_tool_camel_lock_up ();
- camel_folder_append_message (drafts_folder, data->msg, data->info, ex);
- mail_tool_camel_lock_down ();
-}
-
-static void
-cleanup_save_draft (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- save_draft_input_t *input = (save_draft_input_t *) in_data;
- /*save_draft_data_t *data = (save_draft_data_t *) op_data;*/
-
- if (camel_exception_is_set (ex)) {
- char *reason;
-
- reason = g_strdup_printf ("Error saving composition to 'Drafts': %s",
- camel_exception_get_description (ex));
-
- gnome_warning_dialog_parented (reason, GTK_WINDOW (input->composer));
- g_free (reason);
- } else {
- gtk_widget_destroy (GTK_WIDGET (input->composer));
- }
-}
-
-static const mail_operation_spec op_save_draft = {
- describe_save_draft,
- sizeof (save_draft_data_t),
- setup_save_draft,
- do_save_draft,
- cleanup_save_draft
-};
-
-static void
-exit_dialog_cb (int reply, EMsgComposer *composer)
-{
- save_draft_input_t *input;
-
- switch (reply) {
- case REPLY_YES:
- /* this has to be done async */
- input = g_new0 (save_draft_input_t, 1);
- input->composer = composer;
- mail_operation_queue (&op_save_draft, input, TRUE);
- case REPLY_NO:
- gtk_widget_destroy (GTK_WIDGET (composer));
- break;
- case REPLY_CANCEL:
- default:
- }
-}
-
-static void
-do_exit (EMsgComposer *composer)
-{
- GtkWidget *dialog;
- GtkWidget *label;
- gint button;
-
- dialog = gnome_dialog_new (_("Evolution"),
- GNOME_STOCK_BUTTON_YES, /* Save */
- GNOME_STOCK_BUTTON_NO, /* Don't save */
- GNOME_STOCK_BUTTON_CANCEL, /* Cancel */
- NULL);
-
- label = gtk_label_new (_("This message has not been sent.\n\nDo you wish to save your changes?"));
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label, TRUE, TRUE, 0);
- gtk_widget_show (label);
- gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (composer));
- gnome_dialog_set_default (GNOME_DIALOG (dialog), 0);
- button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
-
- exit_dialog_cb (button, composer);
-}
-
-/* Menu callbacks. */
-
-static void
-menu_file_open_cb (BonoboUIHandler *uih,
- 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"));
- if (file_name == NULL)
- return;
-
- load (composer, file_name);
-
- g_free (file_name);
-}
-
-static void
-menu_file_save_cb (BonoboUIHandler *uih,
- 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_get_current_file (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 (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (data);
-
- save (composer, NULL);
-}
-
-static void
-menu_file_send_cb (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- /* FIXME: We should really write this to Outbox in the future? */
- gtk_signal_emit (GTK_OBJECT (data), signals[SEND]);
-}
-
-static void
-menu_file_close_cb (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (data);
- do_exit (composer);
-}
-
-static void
-menu_file_add_attachment_cb (BonoboUIHandler *uih,
- 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_view_attachments_activate_cb (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- gboolean state;
-
- state = bonobo_ui_handler_menu_get_toggle_state (uih, path);
- e_msg_composer_show_attachments (E_MSG_COMPOSER (data), state);
-}
-
-#if 0
-static void
-insert_file_ok_cb (GtkWidget *widget, void *user_data)
-{
- GtkFileSelection *fs;
- GdkAtom selection_atom = GDK_NONE;
- char *name;
- EMsgComposer *composer;
- struct stat sb;
- int fd;
- guint8 *buffer;
- size_t bufsz, actual;
-
- fs = GTK_FILE_SELECTION (gtk_widget_get_ancestor (widget,
- GTK_TYPE_FILE_SELECTION));
- composer = E_MSG_COMPOSER (user_data);
- name = gtk_file_selection_get_filename (fs);
-
- if (stat (name, &sb) < 0) {
- GtkWidget *dlg;
-
- dlg = gnome_error_dialog_parented( _("That file does not exist."),
- GTK_WINDOW (fs));
- gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
- gtk_widget_destroy (GTK_WIDGET (dlg));
- return;
- }
-
- if( !(S_ISREG (sb.st_mode)) ) {
- GtkWidget *dlg;
-
- dlg = gnome_error_dialog_parented( _("That is not a regular file."),
- GTK_WINDOW (fs));
- gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
- gtk_widget_destroy (GTK_WIDGET (dlg));
- return;
- }
-
- if (access (name, R_OK) != 0) {
- GtkWidget *dlg;
-
- dlg = gnome_error_dialog_parented( _("That file exists but is not readable."),
- GTK_WINDOW (fs));
- gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
- gtk_widget_destroy (GTK_WIDGET (dlg));
- return;
- }
-
- if ((fd = open (name, O_RDONLY)) < 0) {
- GtkWidget *dlg;
-
- dlg = gnome_error_dialog_parented( _("That file appeared accesible but open(2) failed."),
- GTK_WINDOW (fs));
- gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
- gtk_widget_destroy (GTK_WIDGET (dlg));
- return;
- }
-
- buffer = NULL;
- bufsz = 0;
- actual = 0;
- #define CHUNK 5120
-
- while( 1 ) {
- ssize_t chunk;
-
- if( bufsz - actual < CHUNK ) {
- bufsz += CHUNK;
-
- if( bufsz >= 102400 ) {
- GtkWidget *dlg;
- gint result;
-
- dlg = gnome_dialog_new( _("The file is very large (more than 100K).\n"
- "Are you sure you wish to insert it?"),
- GNOME_STOCK_BUTTON_YES,
- GNOME_STOCK_BUTTON_NO,
- NULL);
- gnome_dialog_set_parent (GNOME_DIALOG (dlg), GTK_WINDOW (fs));
- result = gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
- gtk_widget_destroy (GTK_WIDGET (dlg));
-
- if (result == 1)
- goto cleanup;
- }
-
- buffer = g_realloc (buffer, bufsz * sizeof (guint8));
- }
-
- chunk = read (fd, &(buffer[actual]), CHUNK);
-
- if (chunk < 0) {
- GtkWidget *dlg;
-
- dlg = gnome_error_dialog_parented( _("An error occurred while reading the file."),
- GTK_WINDOW (fs));
- gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
- gtk_widget_destroy (GTK_WIDGET (dlg));
- goto cleanup;
- }
-
- if( chunk == 0 )
- break;
-
- actual += chunk;
- }
-
- buffer[actual] = '\0';
-
- if (selection_atom == GDK_NONE)
- selection_atom = gdk_atom_intern ("TEMP_PASTE", FALSE);
- gtk_object_set_data (GTK_OBJECT (fs), "ev_file_buffer", buffer);
- gtk_selection_owner_set (GTK_WIDGET (fs), selection_atom, GDK_CURRENT_TIME);
- /*gtk_html_paste (composer->send_html);*/
-
- cleanup:
- close( fd );
- g_free( buffer );
- gtk_widget_destroy (GTK_WIDGET(fs));
-}
-
-static void fs_selection_get (GtkWidget *widget, GtkSelectionData *sdata,
- guint info, guint time)
-{
- gchar *buffer;
- GdkAtom encoding;
- gint format;
- guchar *ctext;
- gint length;
-
- buffer = gtk_object_get_data (GTK_OBJECT (widget), "ev_file_buffer");
- if (gdk_string_to_compound_text (buffer, &encoding, &format, &ctext,
- &length) == Success)
- gtk_selection_data_set (sdata, encoding, format, ctext, length);
- g_free (buffer);
- gtk_object_remove_data (GTK_OBJECT (widget), "ev_file_buffer");
-}
-
-#endif
-static void
-menu_file_insert_file_cb (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
-#if 0
- EMsgComposer *composer;
- GtkFileSelection *fs;
-
- composer = E_MSG_COMPOSER (data);
-
- fs = GTK_FILE_SELECTION (gtk_file_selection_new ("Choose File"));
- /* FIXME: remember the location or something */
- /*gtk_file_selection_set_filename( fs, g_get_home_dir() );*/
- gtk_signal_connect (GTK_OBJECT (fs->ok_button), "clicked",
- GTK_SIGNAL_FUNC (insert_file_ok_cb), data);
- gtk_signal_connect_object (GTK_OBJECT (fs->cancel_button),
- "clicked",
- GTK_SIGNAL_FUNC (gtk_widget_destroy),
- GTK_OBJECT (fs));
- gtk_widget_show (GTK_WIDGET(fs));
-#else
- g_message ("Insert file is unimplemented! oh no!");
-#endif
-}
-
-static void
-menu_format_html_cb (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- EMsgComposer *composer;
- gboolean new_state;
-
- composer = E_MSG_COMPOSER (data);
-
- new_state = bonobo_ui_handler_menu_get_toggle_state (uih, path);
- if ((new_state && composer->send_html) || (! new_state && ! composer->send_html))
- return;
-
- e_msg_composer_set_send_html (composer, new_state);
-}
-
-
-/* Menu bar creation. */
-
-static void
-create_menubar_file (EMsgComposer *composer,
- BonoboUIHandler *uih)
-{
- bonobo_ui_handler_menu_new_subtree (uih, "/File",
- _("_File"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/Open",
- _("_Open..."),
- _("Load a previously saved message"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_OPEN,
- 0, 0,
- menu_file_open_cb, composer);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/Save",
- _("_Save..."),
- _("Save message"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_SAVE,
- 0, 0,
- menu_file_save_cb, composer);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/Save as",
- _("_Save as..."),
- _("Save message with a different name"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_SAVE_AS,
- 0, 0,
- menu_file_save_as_cb, composer);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/Save in folder",
- _("Save in _folder..."),
- _("Save the message in a specified folder"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- NULL, composer);
-
- bonobo_ui_handler_menu_new_separator (uih, "/File/Separator1", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/Insert text file",
- _("_Insert text file... (FIXME)"),
- _("Insert a file as text into the message"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- menu_file_insert_file_cb, composer);
-
- bonobo_ui_handler_menu_new_separator (uih, "/File/Separator2", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/Send",
- _("_Send"),
- _("Send the message"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_MAIL_SND,
- 0, 0,
- menu_file_send_cb, composer);
-
- bonobo_ui_handler_menu_new_separator (uih, "/File/Separator3", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/Close",
- _("_Close..."),
- _("Quit the message composer"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_CLOSE,
- 0, 0,
- menu_file_close_cb, composer);
-}
-
-static void
-create_menubar_edit (EMsgComposer *composer,
- BonoboUIHandler *uih)
-{
- bonobo_ui_handler_menu_new_subtree (uih, "/Edit",
- _("_Edit"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-}
-
-static void
-create_menubar_format (EMsgComposer *composer,
- BonoboUIHandler *uih)
-{
- bonobo_ui_handler_menu_new_subtree (uih, "/Format",
- _("_Format"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-
- bonobo_ui_handler_menu_new_toggleitem (uih, "/Format/HTML",
- _("HTML"),
- _("Send the mail in HTML format"),
- -1,
- 0, 0,
- menu_format_html_cb, composer);
-
- bonobo_ui_handler_menu_set_toggle_state (uih, "/Format/HTML", composer->send_html);
-}
-
-static void
-create_menubar_view (EMsgComposer *composer,
- BonoboUIHandler *uih)
-{
- bonobo_ui_handler_menu_new_subtree (uih, "/View",
- _("_View"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-
- bonobo_ui_handler_menu_new_toggleitem (uih, "/View/Show attachments",
- _("Show _attachments"),
- _("Show/hide attachments"),
- -1,
- 0, 0,
- menu_view_attachments_activate_cb, composer);
-}
-
-static void
-create_menubar (EMsgComposer *composer)
-{
- BonoboUIHandler *uih;
-
- uih = composer->uih;
- bonobo_ui_handler_create_menubar (uih);
-
- create_menubar_file (composer, uih);
- create_menubar_edit (composer, uih);
- create_menubar_format (composer, uih);
- create_menubar_view (composer, uih);
-}
-
-
-/* Toolbar implementation. */
-
-static void
-create_toolbar (EMsgComposer *composer)
-{
- BonoboUIHandler *uih;
-
- uih = composer->uih;
- bonobo_ui_handler_create_toolbar (uih, "Toolbar");
-
- bonobo_ui_handler_toolbar_new_item (uih,
- "/Toolbar/Send",
- _("Send"),
- _("Send this message"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_PIXMAP_MAIL_SND,
- 0, 0,
- menu_file_send_cb, composer);
-
- bonobo_ui_handler_toolbar_new_item (uih,
- "/Toolbar/Attach",
- _("Attach"),
- _("Attach a file"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_PIXMAP_ATTACH,
- 0, 0,
- menu_file_add_attachment_cb, composer);
-}
-
-
-/* Miscellaneous callbacks. */
-
-static void
-attachment_bar_changed_cb (EMsgComposerAttachmentBar *bar,
- void *data)
-{
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (data);
-
- if (e_msg_composer_attachment_bar_get_num_attachments (bar) > 0)
- e_msg_composer_show_attachments (composer, TRUE);
- else
- e_msg_composer_show_attachments (composer, FALSE);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EMsgComposer *composer;
- CORBA_Environment ev;
-
- composer = E_MSG_COMPOSER (object);
-
- bonobo_object_unref (BONOBO_OBJECT (composer->uih));
-
- /* FIXME? I assume the Bonobo widget will get destroyed
- normally? */
-
- if (composer->address_dialog != NULL)
- gtk_widget_destroy (composer->address_dialog);
- if (composer->hdrs != NULL)
- gtk_widget_destroy (composer->hdrs);
-
- 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);
- }
-
- CORBA_exception_init (&ev);
-
- if (composer->persist_stream_interface != CORBA_OBJECT_NIL) {
- Bonobo_Unknown_unref (composer->persist_stream_interface, &ev);
- CORBA_Object_release (composer->persist_stream_interface, &ev);
- }
-
- if (composer->persist_file_interface != CORBA_OBJECT_NIL) {
- Bonobo_Unknown_unref (composer->persist_file_interface, &ev);
- CORBA_Object_release (composer->persist_file_interface, &ev);
- }
-
- CORBA_exception_free (&ev);
-
- 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
-class_init (EMsgComposerClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- widget_class = GTK_WIDGET_CLASS (klass);
-
- object_class->destroy = destroy;
-
- widget_class->delete_event = delete_event;
-
- parent_class = gtk_type_class (gnome_app_get_type ());
-
- signals[SEND] =
- gtk_signal_new ("send",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EMsgComposerClass, send),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- signals[POSTPONE] =
- gtk_signal_new ("postpone",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EMsgComposerClass, postpone),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (EMsgComposer *composer)
-{
- composer->uih = NULL;
-
- composer->hdrs = NULL;
- composer->extra_hdr_names = g_ptr_array_new ();
- composer->extra_hdr_values = g_ptr_array_new ();
-
- composer->editor = NULL;
-
- composer->address_dialog = NULL;
-
- composer->attachment_bar = NULL;
- composer->attachment_scroll_frame = NULL;
-
- composer->persist_file_interface = CORBA_OBJECT_NIL;
- composer->persist_stream_interface = CORBA_OBJECT_NIL;
-
- composer->attachment_bar_visible = FALSE;
- composer->send_html = FALSE;
-}
-
-
-GtkType
-e_msg_composer_get_type (void)
-{
- static GtkType type = 0;
-
- if (type == 0) {
- static const GtkTypeInfo info = {
- "EMsgComposer",
- sizeof (EMsgComposer),
- sizeof (EMsgComposerClass),
- (GtkClassInitFunc) class_init,
- (GtkObjectInitFunc) init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (gnome_app_get_type (), &info);
- }
-
- return type;
-}
-
-/**
- * e_msg_composer_construct:
- * @composer: A message composer widget
- *
- * Construct @composer.
- **/
-void
-e_msg_composer_construct (EMsgComposer *composer)
-{
- GtkWidget *vbox;
- BonoboObject *editor_server;
-
- g_return_if_fail (gtk_main_level () > 0);
-
- gtk_window_set_default_size (GTK_WINDOW (composer),
- DEFAULT_WIDTH, DEFAULT_HEIGHT);
-
- gnome_app_construct (GNOME_APP (composer), "e-msg-composer",
- _("Compose a message"));
-
- composer->uih = bonobo_ui_handler_new ();
- bonobo_ui_handler_set_app (composer->uih, GNOME_APP (composer));
-
- vbox = gtk_vbox_new (FALSE, 0);
-
- composer->hdrs = e_msg_composer_hdrs_new ();
- gtk_box_pack_start (GTK_BOX (vbox), composer->hdrs, FALSE, FALSE, 0);
- gtk_widget_show (composer->hdrs);
-
- /* Editor component. */
-
- create_menubar (composer);
- create_toolbar (composer);
- composer->editor = create_editor (composer);
-
- editor_server = BONOBO_OBJECT (bonobo_widget_get_server (BONOBO_WIDGET (composer->editor)));
-
- composer->persist_file_interface
- = bonobo_object_query_interface (editor_server, "IDL:Bonobo/PersistFile:1.0");
- composer->persist_stream_interface
- = bonobo_object_query_interface (editor_server, "IDL:Bonobo/PersistStream:1.0");
-
- gtk_widget_show (composer->editor);
- gtk_box_pack_start (GTK_BOX (vbox), composer->editor, TRUE, TRUE, 0);
- gtk_widget_show (composer->editor);
-
- /* Attachment editor, wrapped into an EScrollFrame. We don't
- show it for now. */
-
- composer->attachment_scroll_frame = e_scroll_frame_new (NULL, NULL);
- e_scroll_frame_set_shadow_type (E_SCROLL_FRAME (composer->attachment_scroll_frame),
- GTK_SHADOW_IN);
- e_scroll_frame_set_policy (E_SCROLL_FRAME (composer->attachment_scroll_frame),
- 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_scroll_frame),
- composer->attachment_bar);
- gtk_box_pack_start (GTK_BOX (vbox),
- composer->attachment_scroll_frame,
- FALSE, FALSE, GNOME_PAD_SMALL);
-
- gtk_signal_connect (GTK_OBJECT (composer->attachment_bar), "changed",
- GTK_SIGNAL_FUNC (attachment_bar_changed_cb), composer);
-
- gnome_app_set_contents (GNOME_APP (composer), vbox);
- gtk_widget_show (vbox);
-
- e_msg_composer_show_attachments (composer, FALSE);
-
- /* Set focus on the `To:' field. */
-
- gtk_widget_grab_focus (e_msg_composer_hdrs_get_to_entry (E_MSG_COMPOSER_HDRS (composer->hdrs)));
-}
-
-/**
- * e_msg_composer_new:
- *
- * Create a new message composer widget. This function must be called
- * within the GTK+ main loop, or it will fail.
- *
- * Return value: A pointer to the newly created widget
- **/
-GtkWidget *
-e_msg_composer_new (void)
-{
- GtkWidget *new;
-
- g_return_val_if_fail (gtk_main_level () > 0, NULL);
-
- new = gtk_type_new (e_msg_composer_get_type ());
- e_msg_composer_construct (E_MSG_COMPOSER (new));
-
- /* Load the signature, if any. */
- set_editor_text (BONOBO_WIDGET (E_MSG_COMPOSER (new)->editor),
- NULL, "");
-
- return new;
-}
-
-/**
- * e_msg_composer_new_with_sig_file:
- *
- * Create a new message composer widget. This function must be called
- * within the GTK+ main loop, or it will fail. Sets the signature
- * file.
- *
- * Return value: A pointer to the newly created widget
- **/
-GtkWidget *
-e_msg_composer_new_with_sig_file (const char *sig_file)
-{
- GtkWidget *new;
-
- g_return_val_if_fail (gtk_main_level () > 0, NULL);
-
- new = gtk_type_new (e_msg_composer_get_type ());
- e_msg_composer_construct (E_MSG_COMPOSER (new));
-
- /* Load the signature, if any. */
- set_editor_text (BONOBO_WIDGET (E_MSG_COMPOSER (new)->editor),
- sig_file, "");
-
- return new;
-}
-
-/**
- * e_msg_composer_new_with_message:
- *
- * Create a new message composer widget. This function must be called
- * within the GTK+ main loop, or it will fail.
- *
- * Return value: A pointer to the newly created widget
- **/
-GtkWidget *
-e_msg_composer_new_with_message (CamelMimeMessage *msg)
-{
- const CamelInternetAddress *to, *cc, *bcc;
- GList *To = NULL, *Cc = NULL, *Bcc = NULL;
- gboolean want_plain, is_html;
- CamelDataWrapper *contents;
- const gchar *subject;
- GtkWidget *new;
- char *text, *final_text;
- guint len, i;
-
- g_return_val_if_fail (gtk_main_level () > 0, NULL);
-
- new = gtk_type_new (e_msg_composer_get_type ());
- e_msg_composer_construct (E_MSG_COMPOSER (new));
-
- subject = camel_mime_message_get_subject (msg);
-
- to = camel_mime_message_get_recipients (msg, CAMEL_RECIPIENT_TYPE_TO);
- cc = camel_mime_message_get_recipients (msg, CAMEL_RECIPIENT_TYPE_CC);
- bcc = camel_mime_message_get_recipients (msg, CAMEL_RECIPIENT_TYPE_BCC);
-
- len = CAMEL_ADDRESS (to)->addresses->len;
- for (i = 0; i < len; i++) {
- const char *addr;
-
- if (camel_internet_address_get (to, i, NULL, &addr))
- To = g_list_append (To, g_strdup (addr));
- }
-
- len = CAMEL_ADDRESS (cc)->addresses->len;
- for (i = 0; i < len; i++) {
- const char *addr;
-
- if (camel_internet_address_get (cc, i, NULL, &addr))
- Cc = g_list_append (Cc, g_strdup (addr));
- }
-
- len = CAMEL_ADDRESS (bcc)->addresses->len;
- for (i = 0; i < len; i++) {
- const char *addr;
-
- if (camel_internet_address_get (bcc, i, NULL, &addr))
- Bcc = g_list_append (Bcc, g_strdup (addr));
- }
-
- e_msg_composer_set_headers (E_MSG_COMPOSER (new), To, Cc, Bcc, subject);
-
- free_recipients (To);
- free_recipients (Cc);
- free_recipients (Bcc);
-
- want_plain = !mail_config_send_html ();
-
- contents = camel_medium_get_content_object (CAMEL_MEDIUM (msg));
- text = mail_get_message_body (contents, want_plain, &is_html);
- if (is_html)
- final_text = g_strdup (text);
- else
- final_text = e_text_to_html (text, E_TEXT_TO_HTML_CONVERT_NL |
- E_TEXT_TO_HTML_CONVERT_SPACES);
- g_free (text);
-
- e_msg_composer_set_body_text (E_MSG_COMPOSER (new), final_text);
-
- /*set_editor_text (BONOBO_WIDGET (E_MSG_COMPOSER (new)->editor),
- NULL, "FIXME: like, uh... put the message here and stuff\n");*/
-
- return new;
-}
-
-static GList *
-add_recipients (GList *list, const char *recips, gboolean decode)
-{
- int len;
- char *addr;
-
- while (*recips) {
- len = strcspn (recips, ",");
- if (len) {
- addr = g_strndup (recips, len);
- if (decode)
- camel_url_decode (addr);
- list = g_list_append (list, addr);
- }
- recips += len;
- if (*recips == ',')
- recips++;
- }
-
- return list;
-}
-
-static void
-free_recipients (GList *list)
-{
- GList *l;
-
- for (l = list; l; l = l->next)
- g_free (l->data);
- g_list_free (list);
-}
-
-/**
- * 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.
- **/
-GtkWidget *
-e_msg_composer_new_from_url (const char *url)
-{
- EMsgComposer *composer;
- EMsgComposerHdrs *hdrs;
- GList *to = NULL, *cc = NULL, *bcc = NULL;
- char *subject = NULL, *body = NULL;
- const char *p, *header;
- int len, clen;
- char *content;
-
- g_return_val_if_fail (g_strncasecmp (url, "mailto:", 7) == 0, NULL);
-
- /* Parse recipients (everything after ':' until '?' or eos. */
- p = url + 7;
- len = strcspn (p, "?,");
- if (len) {
- content = g_strndup (p, len);
- to = add_recipients (to, content, TRUE);
- g_free (content);
- }
-
- p += len;
- if (*p == '?') {
- p++;
-
- while (*p) {
- len = strcspn (p, "=&");
-
- /* If it's malformed, give up. */
- if (p[len] != '=')
- break;
-
- header = p;
- p += len + 1;
-
- clen = strcspn (p, "&");
- content = g_strndup (p, clen);
- camel_url_decode (content);
-
- if (!g_strncasecmp (header, "to", len))
- to = add_recipients (to, content, FALSE);
- else if (!g_strncasecmp (header, "cc", len))
- cc = add_recipients (cc, content, FALSE);
- else if (!g_strncasecmp (header, "bcc", len))
- bcc = add_recipients (bcc, content, FALSE);
- else if (!g_strncasecmp (header, "subject", len))
- subject = g_strdup (content);
- else if (!g_strncasecmp (header, "body", len))
- body = g_strdup (content);
-
- g_free (content);
- p += clen;
- if (*p == '&') {
- p++;
- if (!strcmp (p, "amp;"))
- p += 4;
- }
- }
- }
-
- composer = E_MSG_COMPOSER (e_msg_composer_new ());
- hdrs = E_MSG_COMPOSER_HDRS (composer->hdrs);
- e_msg_composer_hdrs_set_to (hdrs, to);
- free_recipients (to);
- e_msg_composer_hdrs_set_cc (hdrs, cc);
- free_recipients (cc);
- e_msg_composer_hdrs_set_bcc (hdrs, bcc);
- free_recipients (bcc);
- if (subject) {
- e_msg_composer_hdrs_set_subject (hdrs, subject);
- g_free (subject);
- }
-
- if (body) {
- char *htmlbody = e_text_to_html (body, E_TEXT_TO_HTML_PRE);
- set_editor_text (BONOBO_WIDGET (composer->editor),
- NULL, htmlbody);
- g_free (htmlbody);
- }
-
- return GTK_WIDGET (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 (composer != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- show_attachments (composer, show);
-}
-
-/**
- * e_msg_composer_set_headers:
- * @composer: a composer object
- * @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 GList *to,
- const GList *cc, const GList *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_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)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- set_editor_text (BONOBO_WIDGET (composer->editor),
- composer->sig_file, text);
-}
-
-
-/**
- * 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_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)
-{
- g_return_val_if_fail (composer != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
- return build_message (composer);
-}
-
-
-
-/**
- * e_msg_composer_set_sig:
- * @composer: A message composer widget
- * @path: Signature file
- *
- * Set a signature
- **/
-void
-e_msg_composer_set_sig_file (EMsgComposer *composer, const char *sig_file)
-{
- g_return_if_fail (composer != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- composer->sig_file = g_strdup (sig_file);
-}
-
-/**
- * e_msg_composer_get_sig_file:
- * @composer: A message composer widget
- *
- * Get the signature file
- *
- * Return value: The signature file.
- **/
-char *
-e_msg_composer_get_sig_file (EMsgComposer *composer)
-{
- g_return_val_if_fail (composer != NULL, NULL);
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
- return composer->sig_file;
-}
-
-
-/**
- * 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)
-{
- g_return_if_fail (composer != NULL);
- 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;
- bonobo_ui_handler_menu_set_toggle_state (composer->uih, "/Format/HTML", send_html);
-}
-
-/**
- * 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 (composer != NULL, FALSE);
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->send_html;
-}
diff --git a/composer/e-msg-composer.h b/composer/e-msg-composer.h
deleted file mode 100644
index 3e9be58891..0000000000
--- a/composer/e-msg-composer.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer.h
- *
- * Copyright (C) 1999 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef ___E_MSG_COMPOSER_H__
-#define ___E_MSG_COMPOSER_H__
-
-#include <gnome.h>
-#include <bonobo.h>
-
-#include "e-msg-composer-attachment-bar.h"
-#include "e-msg-composer-hdrs.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-
-#define E_TYPE_MSG_COMPOSER (e_msg_composer_get_type ())
-#define E_MSG_COMPOSER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER, EMsgComposer))
-#define E_MSG_COMPOSER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER, EMsgComposerClass))
-#define E_IS_MSG_COMPOSER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER))
-#define E_IS_MSG_COMPOSER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER))
-
-
-typedef struct _EMsgComposer EMsgComposer;
-typedef struct _EMsgComposerClass EMsgComposerClass;
-
-struct _EMsgComposer {
- GnomeApp parent;
-
- BonoboUIHandler *uih;
-
- GtkWidget *hdrs;
- GPtrArray *extra_hdr_names, *extra_hdr_values;
-
- GtkWidget *editor;
-
- GtkWidget *attachment_bar;
- GtkWidget *attachment_scroll_frame;
-
- GtkWidget *address_dialog;
-
- Bonobo_PersistFile persist_file_interface;
- Bonobo_PersistStream persist_stream_interface;
-
- char *sig_file;
-
- gboolean attachment_bar_visible : 1;
- gboolean send_html : 1;
-};
-
-struct _EMsgComposerClass {
- GnomeAppClass parent_class;
-
- void (* send) (EMsgComposer *composer);
- void (* postpone) (EMsgComposer *composer);
-};
-
-
-GtkType e_msg_composer_get_type (void);
-
-void e_msg_composer_construct (EMsgComposer *composer);
-GtkWidget *e_msg_composer_new (void);
-GtkWidget *e_msg_composer_new_with_sig_file (const char *sig_file);
-GtkWidget *e_msg_composer_new_with_message (CamelMimeMessage *msg);
-GtkWidget *e_msg_composer_new_from_url (const char *url);
-void e_msg_composer_show_attachments (EMsgComposer *composer,
- gboolean show);
-
-void e_msg_composer_set_headers (EMsgComposer *composer,
- const GList *to,
- const GList *cc,
- const GList *bcc,
- const char *subject);
-void e_msg_composer_set_body_text (EMsgComposer *composer,
- const char *text);
-void e_msg_composer_add_header (EMsgComposer *composer,
- const char *name,
- const char *value);
-void e_msg_composer_attach (EMsgComposer *composer,
- CamelMimePart *attachment);
-
-CamelMimeMessage *e_msg_composer_get_message (EMsgComposer *composer);
-
-void e_msg_composer_set_sig_file (EMsgComposer *composer,
- const char *sig_file);
-char *e_msg_composer_get_sig_file (EMsgComposer *composer);
-
-void e_msg_composer_set_send_html (EMsgComposer *composer,
- gboolean send_html);
-gboolean e_msg_composer_get_send_html (EMsgComposer *composer);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* ___E_MSG_COMPOSER_H__ */
diff --git a/composer/main.c b/composer/main.c
deleted file mode 100644
index 383504d30d..0000000000
--- a/composer/main.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-
-#include <gnome.h>
-#include <libgnorba/gnorba.h>
-#include <bonobo.h>
-
-#include <glade/glade.h>
-
-#include <camel/camel-data-wrapper.h>
-#include <camel/camel-stream-fs.h>
-#include <camel/camel-stream.h>
-
-#include "e-msg-composer.h"
-
-static void
-send_cb (EMsgComposer *composer,
- gpointer data)
-{
- CamelMimeMessage *message;
- CamelStream *stream;
- gint stdout_dup;
-
- message = e_msg_composer_get_message (composer);
-
- stdout_dup = dup (1);
- stream = camel_stream_fs_new_with_fd (stdout_dup);
- camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message),
- stream);
- camel_stream_close (stream);
-
- camel_object_unref (CAMEL_OBJECT (message));
-
-#if 0
- gtk_widget_destroy (GTK_WIDGET (composer));
- gtk_main_quit ();
-#endif
-}
-
-static guint
-create_composer (void)
-{
- GtkWidget *composer;
-
- composer = e_msg_composer_new ();
- gtk_widget_show (composer);
-
- gtk_signal_connect (GTK_OBJECT (composer), "send", GTK_SIGNAL_FUNC (send_cb), NULL);
-
- return FALSE;
-}
-
-int
-main (int argc, char **argv)
-{
- CORBA_Environment ev;
- CORBA_ORB orb;
-
- CORBA_exception_init (&ev);
- gnome_CORBA_init ("evolution-test-msg-composer", "0.0", &argc, argv, 0, &ev);
- CORBA_exception_free (&ev);
-
- orb = gnome_CORBA_ORB ();
-
- glade_gnome_init ();
-
- if (bonobo_init (orb, NULL, NULL) == FALSE)
- g_error ("Could not initialize Bonobo\n");
-
- /* We can't make any CORBA calls unless we're in the main loop. So we
- delay creating the container here. */
- gtk_idle_add ((GtkFunction) create_composer, NULL);
-
- bonobo_main ();
-
- return 0;
-}
diff --git a/configure.in b/configure.in
deleted file mode 100644
index 8e2beb49fb..0000000000
--- a/configure.in
+++ /dev/null
@@ -1,612 +0,0 @@
-# Process this file with autoconf to produce a configure script.
-AC_INIT(camel)
-AM_CONFIG_HEADER(config.h)
-
-cflags_set=${CFLAGS+set}
-
-EVOLUTION_MAJOR_VERSION=0
-EVOLUTION_MINOR_VERSION=0
-EVOLUTION_MICRO_VERSION=4
-VERSION=$EVOLUTION_MINOR_VERSION.$EVOLUTION_MICRO_VERSION
-PACKAGE=evolution
-
-AM_INIT_AUTOMAKE($PACKAGE, $VERSION)
-AC_SUBST(VERSION)
-
-
-dnl Initialize libtool
-AM_PROG_LIBTOOL
-
-dnl Initialize maintainer mode
-AM_MAINTAINER_MODE
-
-AC_CANONICAL_HOST
-
-AM_ACLOCAL_INCLUDE(macros)
-GNOME_INIT(capplet)
-GNOME_COMPILE_WARNINGS
-AC_ISC_POSIX
-AC_PROG_CC
-AC_PROG_CPP
-AM_PROG_LEX
-AC_PROG_YACC
-AC_STDC_HEADERS
-AC_ARG_PROGRAM
-AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_PROG_MAKE_SET
-
-AC_PATH_PROG(SENDMAIL, sendmail, /usr/sbin/sendmail, /usr/sbin:/usr/lib)
-AC_DEFINE_UNQUOTED(SENDMAIL_PATH, "$SENDMAIL")
-
-AC_MSG_CHECKING(system mail directory)
-if test -d /var/mail; then
- system_mail_dir=/var/mail
-else
- system_mail_dir=/var/spool/mail
-fi
-AC_MSG_RESULT($system_mail_dir)
-AC_DEFINE_UNQUOTED(SYSTEM_MAIL_DIR, "$system_mail_dir")
-
-dnl Check for new enough gnome-libs
-CFLAGS_save=$CFLAGS
-LIBS_save=$LIBS
-CFLAGS=`gnome-config --cflags gnomeui`
-LIBS=`gnome-config --libs gnomeui`
-
-AC_CHECK_LIB(gnomeui, gnome_window_icon_set_default_from_file, ,[
-AC_MSG_ERROR(gnome-libs 1.0.59 or higher is required.)])
-
-CFLAGS=$CFLAGS_save
-LIBS=$LIBS_save
-
-ALL_LINGUAS="da de el fr ga gl hu it ja ko nl no ru sl sv tr uk es pl"
-
-AM_GNOME_GETTEXT
-
-GNOME_X_CHECKS
-
-dnl
-dnl Purify support
-dnl
-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"
-
-dnl * Time zone stuff
-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)
-else
- 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)
- else
- AC_ERROR(unable to find a way to determine timezone)
- fi
-fi
-
-AC_CHECK_FUNCS(mkstemp mkdtemp)
-
-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)
-fi
-
-dnl **************************************************
-dnl * pas-backend-file stuff.
-dnl * check for db_185.h. if it's there, we use it.
-dnl * otherwise, we use db.h (since it'll be 185).
-dnl * Except on RH7.0, which puts db in yet another place
-dnl **************************************************
-AC_CHECK_HEADERS(db_185.h)
-AC_CHECK_HEADERS(db1/db.h)
-
-dnl **************************************************
-dnl * ldap related stuff.
-dnl **************************************************
-AC_CHECK_LIB(lber, ber_get_tag, LDAP_LIBS="-llber")
-if test x$ac_cv_lib_lber_ber_get_tag = xyes; then
-AC_CHECK_LIB(ldap, ldap_open, LDAP_LIBS="-lldap $LDAP_LIBS", ,-llber)
-fi
-if test x$ac_cv_lib_ldap_ldap_open = xyes; then
- AC_DEFINE(HAVE_LDAP)
- AC_SUBST(LDAP_LIBS)
-else
- AC_MSG_WARN(no ldap support present)
-fi
-AM_CONDITIONAL(ENABLE_LDAP, test x$ac_cv_lib_ldap_ldap_open = xyes)
-
-dnl **************************************************
-dnl * Posix thread support
-dnl **************************************************
-
-dnl Hah! Threads are no longer an option
-dnl AC_ARG_WITH(threads, [ --with-threads Include thread support],[
-dnl FIXME: support more thread types, pth at least
-
-GNOME_PTHREAD_CHECK
-
-if test "x$PTHREAD_LIB" = "x" ; then
- AC_MSG_ERROR([POSIX threads are currently required for Evolution])
-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
-
-THREADS_LIBS="$PTHREAD_LIB `glib-config --libs gthread`"
-THREADS_CFLAGS="`glib-config --cflags gthread`"
-
-AC_SUBST(THREADS_LIBS)
-AC_SUBST(THREADS_CFLAGS)
-
-dnl **************************************************
-dnl * Print check
-dnl **************************************************
-AC_MSG_CHECKING(for GnomePrint libraries version 0.20)
-if gnome-config --libs print > /dev/null 2>&1; then
- vers=`gnome-config --modversion print | sed -e "s/gnome-print-//"`
- if test "$vers" = "0.20"; then
- AC_MSG_RESULT(found)
- else
- AC_MSG_ERROR(Please make sure you are using the released version of gnome-print-0.20. Please note that CVS HEAD versions will not work.)
- fi
-else
- AC_MSG_ERROR(Did not find GnomePrint installed. Please make sure you are using the released version of gnome-print-0.20. Please note that CVS HEAD versions will not work.)
-fi
-GNOME_PRINT_LIBS=`gnome-config --libs print`
-GNOME_PRINT_CFLAGS=`gnome-config --cflags print`
-AC_SUBST(GNOME_PRINT_LIBS)
-AC_SUBST(GNOME_PRINT_CFLAGS)
-
-dnl **************************************************
-dnl * ORBit support
-dnl **************************************************
-dnl GNOMEGNORBA_LIBS="$GNOMEGNORBA_LIBS"
-dnl AC_SUBST(GNOMEGNORBA_LIBS)
-
-
-dnl ******************************
-dnl Check for Bonobo
-dnl ******************************
-AC_MSG_CHECKING(for Bonobo >= 0.17)
-if gnome-config --libs bonobox > /dev/null 2>&1; then
- vers=`gnome-config --modversion bonobo | sed -e "s/bonobo-//" | \
- awk 'BEGIN { FS = "."; } { printf "%d", $1 * 1000 + $2;}'`
- if test "$vers" -ge 17; then
- bonobo_ok=true
- else
- bonobo_ok=false
- fi
-else
- bonobo_ok=false
-fi
-
-if $bonobo_ok; then
- AC_MSG_RESULT($vers found)
-else
- AC_MSG_ERROR(Bonobo newer than 0.16 is required to compile Evolution)
-fi
-
-dnl ******************************
-dnl LibGlade checking
-dnl ******************************
-AC_MSG_CHECKING(for Glade libraries)
-if gnome-config --libs libglade > /dev/null 2>&1; then
- AC_MSG_RESULT(found)
-else
- AC_MSG_ERROR(Did not find libGlade installed)
-fi
-
-dnl ******************************
-dnl libunicode checking
-dnl ******************************
-AC_MSG_CHECKING(for libunicode)
-if unicode-config --libs > /dev/null 2>&1; then
- UNICODE_LIBS=`unicode-config --libs`
- UNICODE_CFLAGS=`unicode-config --cflags`
- AC_SUBST(UNICODE_LIBS)
- AC_SUBST(UNICODE_CFLAGS)
- AC_MSG_RESULT(found)
-else
- AC_MSG_ERROR(libunicode not found)
-fi
-
-dnl ******************************
-dnl GdkPixbuf checking
-dnl ******************************
-AC_MSG_CHECKING(for Gdkpixbuf libraries)
-if gnome-config --libs gdk_pixbuf gnomecanvaspixbuf > /dev/null 2>&1; then
- AC_MSG_RESULT(found)
-else
- AC_MSG_ERROR(Did not find gdkpixbuf installed)
-fi
-
-GLIB_CFLAGS="`glib-config --cflags`"
-GLIB_LIBS="`glib-config --libs`"
-
-AC_SUBST(GLIB_CFLAGS)
-AC_SUBST(GLIB_LIBS)
-
-
-EXTRA_GNOME_LIBS="`gnome-config --libs libglade gdk_pixbuf gnomecanvaspixbuf gnomeui ` $THREADS_LIBS `unicode-config --libs`"
-EXTRA_GNOME_CFLAGS="`gnome-config --cflags libglade gdk_pixbuf gnomecanvaspixbuf gnomeui ` $THREADS_CFLAGS `unicode-config --cflags`"
-
-AC_SUBST(EXTRA_GNOME_LIBS)
-AC_SUBST(EXTRA_GNOME_CFLAGS)
-
-
-BONOBO_GNOME_LIBS="`gnome-config --libs bonobox libglade gdk_pixbuf gnomecanvaspixbuf gnomeui`"
-BONOBO_GNOME_CFLAGS="`gnome-config --cflags bonobox libglade gdk_pixbuf gnomecanvaspixbuf gnomeui `"
-AC_SUBST(BONOBO_GNOME_LIBS)
-AC_SUBST(BONOBO_GNOME_CFLAGS)
-
-BONOBO_HTML_GNOME_LIBS="`gnome-config --libs bonobox libglade gdk_pixbuf gtkhtml gnomecanvaspixbuf gnomeui ` $THREAD_LIBS"
-BONOBO_HTML_GNOME_CFLAGS="`gnome-config --cflags bonobox libglade gdk_pixbuf gtkhtml gnomecanvaspixbuf gnomeui ` $THREAD_CFLAGS"
-AC_SUBST(BONOBO_HTML_GNOME_LIBS)
-AC_SUBST(BONOBO_HTML_GNOME_CFLAGS)
-
-dnl ******************************
-dnl GtkHTML checking
-dnl ******************************
-
-AC_MSG_CHECKING(for GtkHTML)
-if gnome-config --libs gtkhtml > /dev/null 2>&1; then
- vers=`gnome-config --modversion gtkhtml`
- case $vers
- in
- gtkhtml-0.[01234]) gtkhtml_ok=false ;;
- *) gtkhtml_ok=true ;;
- esac
-else
- gtkhtml_ok=false
-fi
-
-if $gtkhtml_ok; then
- AC_MSG_RESULT($vers found)
-else
- AC_MSG_ERROR(GtkHTML 0.5 or later is required to compile Evolution)
-fi
-
-GTKHTML_CFLAGS="`gnome-config --cflags gtkhtml`"
-GTKHTML_LIBS="`gnome-config --libs gtkhtml`"
-
-AC_SUBST(GTKHTML_CFLAGS)
-AC_SUBST(GTKHTML_LIBS)
-
-dnl ******************************
-dnl Gnome-VFS checking
-dnl ******************************
-AC_MSG_CHECKING(for GNOME-VFS)
-if gnome-config --libs vfs > /dev/null 2>&1; then
- vers=`gnome-config --modversion vfs`
- case $vers
- in
- gnome-vfs-0.[012]) vfs_ok=false ;;
- *) vfs_ok=true ;;
- esac
-else
- vfs_ok=false
-fi
-
-if $vfs_ok; then
- AC_MSG_RESULT($vers)
-else
- AC_MSG_ERROR(GNOME-VFS 0.3 or newer is required to compile Evolution)
-fi
-
-GNOME_VFS_LIBS="`gnome-config --libs vfs`"
-GNOME_VFS_CFLAGS="`gnome-config --cflags vfs`"
-AC_SUBST(GNOME_VFS_LIBS)
-AC_SUBST(GNOME_VFS_CFLAGS)
-
-save_CFLAGS="$CFLAGS"
-save_LIBS="$LIBS"
-CFLAGS="$GNOME_VFS_CFLAGS"
-LIBS="$GNOME_VFS_LIBS"
-AC_CHECK_LIB(gnomevfs, gnome_vfs_mime_get_default_action_without_fallback,[],
-[
- AC_MSG_ERROR([You need a newer Gnome VFS. Try the CVS version])
-])
-CFLAGS="$save_CFLAGS"
-LIBS="$save_LIBS"
-
-BONOBO_VFS_GNOME_LIBS="`gnome-config --libs bonobox libglade gdk_pixbuf gnomecanvaspixbuf vfs gnomeui `"
-BONOBO_VFS_GNOME_CFLAGS="`gnome-config --cflags bonobox libglade gdk_pixbuf gnomecanvaspixbuf vfs gnomeui `"
-AC_SUBST(BONOBO_VFS_GNOME_LIBS)
-AC_SUBST(BONOBO_VFS_GNOME_CFLAGS)
-
-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
-GNOME_PILOT_CHECK
-fi
-AM_CONDITIONAL(ENABLE_PILOT_CONDUITS, test "x$enable_pilot_conduits" = "xyes")
-
-dnl ******
-dnl XML
-dnl ******
-GNOME_XML_CHECK
-xmlversion=`xml-config --version | sed 's/^libxml//'`
-xmlmajor=`echo $xmlversion | awk -F. '{print $1;}'`
-xmlminor=`echo $xmlversion | awk -F. '{print $2;}'`
-xmlpatch=`echo $xmlversion | awk -F. '{print $3;}'`
-if test "$xmlmajor" -ne 1 -o "$xmlminor" -ne 8 -o "$xmlpatch" -lt 7; then
- AC_MSG_ERROR(gnome-xml 1.8.7 (or later, but not 2.0) is required to compile Evolution)
-fi
-
-AC_SUBST(CAPPLET_LIBS)
-
-dnl ******************************
-dnl Whether to use OAF
-dnl ******************************
-
-AC_MSG_CHECKING(if Bonobo uses OAF)
-if ( gnome-config --libs bonobo | grep oaf ) > /dev/null 2>&1 ; then
- enable_oaf="yes"
-else
- enable_oaf="no"
-fi
-
-AC_MSG_RESULT("$enable_oaf")
-
-if test "x$enable_oaf" = "xyes"; then
- AC_PATH_PROG(OAF_CONFIG,oaf-config,no)
- if test x$OAF_CONFIG = xno; then
- AC_MSG_ERROR("You enabled OAF support but oaf-config was not found")
- else
- OAF_LIBS=`$OAF_CONFIG --libs`
- OAF_CFLAGS=`$OAF_CONFIG --cflags`
- GNORBA_LIBNAME=
- fi
-else
- OAF_LIBS=
- OAF_CFLAGS=
- GNORBA_LIBNAME=gnorba
-fi
-
-AC_SUBST(OAF_LIBS)
-AC_SUBST(OAF_CFLAGS)
-
-AM_CONDITIONAL(USING_OAF, test "x$enable_oaf" = "xyes")
-
-if test "x$enable_oaf" = "xyes"; then
- AC_DEFINE(USING_OAF)
- BONOBO_GNOME_LIBS="`oaf-config --libs` $BONOBO_GNOME_LIBS"
- BONOBO_GNOME_CFLAGS="`oaf-config --cflags ` $BONOBO_GNOME_CFLAGS"
-fi
-
-dnl ********
-dnl Kerberos
-dnl ********
-AC_ARG_WITH(krb5, [ --with-krb5=PREFIX Location of Kerberos 5 libs/includes])
-AC_ARG_WITH(krb4, [ --with-krb4=PREFIX Location of Kerberos 4 libs/includes])
-AC_MSG_CHECKING(for Kerberos 5)
-AC_MSG_RESULT(${with_krb5:=no})
-if test x$with_krb5 != xno; then
- KRB5_CFLAGS="-I$with_krb5/include/krb5"
- KRB5_LDFLAGS="-L$with_krb5/lib -lkrb5 -lk5crypto -lcom_err"
- AC_DEFINE(HAVE_KRB5)
-fi
-AC_MSG_CHECKING(for Kerberos 4)
-AC_MSG_RESULT(${with_krb4:=no})
-if test x$with_krb4 != xno; then
- KRB4_CFLAGS="-I$with_krb4/include -I$with_krb4/include/kerberosIV $KRB5_CFLAGS"
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -L$with_krb4/lib"
- AC_CHECK_LIB(krb, krb_mk_req,
- [KRB4_LDFLAGS="-L$with_krb4/lib -lkrb -ldes"],
- [KRB4_LDFLAGS="-L$with_krb4/lib -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err"],
- -ldes)
- LDFLAGS="$save_LDFLAGS"
- AC_DEFINE(HAVE_KRB4)
-fi
-AC_SUBST(KRB5_CFLAGS)
-AC_SUBST(KRB5_LDFLAGS)
-AC_SUBST(KRB4_CFLAGS)
-AC_SUBST(KRB4_LDFLAGS)
-
-
-dnl ******************************
-dnl gtk-doc
-dnl ******************************
-
-AC_CHECK_PROG(GTKDOC, gtkdoc-mkdb, true, false)
-AM_CONDITIONAL(HAVE_GTK_DOC, $GTKDOC)
-AC_SUBST(HAVE_GTK_DOC)
-
-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
-
-dnl NOTE: We need to use a separate automake conditional for this
-dnl to make this work with the tarballs.
-AM_CONDITIONAL(ENABLE_GTK_DOC, test x$enable_gtk_doc = xyes)
-
-dnl ********
-dnl movemail
-dnl ********
-AC_ARG_WITH(movemail, [ --with-movemail=PATH Path to a movemail binary])
-AC_MSG_CHECKING(for movemail)
-if test x$with_movemail = xyes -o x$with_movemail = x; then
- with_movemail=no
-fi
-if test x$with_movemail != xno; then
- AC_DEFINE_UNQUOTED(MOVEMAIL_PATH, "$with_movemail")
- AC_MSG_RESULT($with_movemail)
-else
- emacs_exec_dir=`emacs --batch --eval '(message exec-directory)' 2>&1`
- case $emacs_exec_dir in
- /*) if test -x $emacs_exec_dir/movemail; then
- if test -u $emacs_exec_dir/movemail -o -g $emacs_exec_dir/movemail; then
- AC_MSG_RESULT($emacs_exec_dir/movemail)
- AC_DEFINE_UNQUOTED(MOVEMAIL_PATH, "$emacs_exec_dir/movemail")
- else
- AC_MSG_RESULT($emacs_exec_dir/movemail... not set-id: ignored)
- fi
- else
- AC_MSG_RESULT(no)
- fi
- ;;
- *)
- AC_MSG_RESULT(no)
- ;;
- esac
-fi
-
-dnl **********
-dnl GPGPGPGPGP
-dnl **********
-AC_PATH_PROG(GPG, gpg)
-if test -n "$GPG"; then
- AC_DEFINE_UNQUOTED(GPG_PATH, "$GPG")
- AC_DEFINE(PGP_PROGRAM, "GPG")
-else
- AC_PATH_PROG(PGP5, pgpv)
- if test -n "$PGP5"; then
- AC_DEFINE_UNQUOTED(PGP5_PATH, "$PGP5")
- AC_DEFINE(PGP_PROGRAM, "PGP")
- else
- AC_PATH_PROG(PGP, pgp)
- if test -n "$PGP"; then
- AC_DEFINE_UNQUOTED(PGP_PATH, "$PGP")
- AC_DEFINE(PGP_PROGRAM, "PGP")
- fi
- fi
-fi
-
-dnl ******************************
-dnl Makefiles
-dnl ******************************
-
-AC_CONFIG_SUBDIRS(libical)
-
-EVOLUTION_DIR=`(cd $srcdir; pwd)`
-AC_SUBST(EVOLUTION_DIR)
-
-AC_OUTPUT([
-Makefile
-evolution.spec
-macros/Makefile
-intl/Makefile
-po/Makefile.in
-e-util/Makefile
-libibex/Makefile
-camel/Makefile
-camel/providers/Makefile
-camel/providers/mbox/Makefile
-camel/providers/pop3/Makefile
-camel/providers/sendmail/Makefile
-camel/providers/smtp/Makefile
-camel/providers/vee/Makefile
-camel/providers/imap/Makefile
-camel/providers/mh/Makefile
-camel/providers/nntp/Makefile
-composer/Makefile
-widgets/Makefile
-widgets/e-paned/Makefile
-widgets/e-table/Makefile
-widgets/e-text/Makefile
-widgets/meeting-time-sel/Makefile
-widgets/misc/Makefile
-widgets/shortcut-bar/Makefile
-addressbook/Makefile
-addressbook/ename/Makefile
-addressbook/conduit/Makefile
-addressbook/contact-editor/Makefile
-addressbook/printing/Makefile
-addressbook/backend/Makefile
-addressbook/backend/idl/Makefile
-addressbook/backend/pas/Makefile
-addressbook/backend/ebook/Makefile
-addressbook/gui/Makefile
-addressbook/gui/minicard/Makefile
-addressbook/gui/search/Makefile
-addressbook/gui/component/Makefile
-addressbook/gui/component/select-names/Makefile
-shell/Makefile
-shell/glade/Makefile
-mail/Makefile
-data/Makefile
-libversit/Makefile
-libibex/Makefile
-calendar/Makefile
-calendar/idl/Makefile
-calendar/cal-util/Makefile
-calendar/cal-client/Makefile
-calendar/pcs/Makefile
-calendar/gui/Makefile
-calendar/gui/dialogs/Makefile
-executive-summary/Makefile
-filter/Makefile
-notes/Makefile
-wombat/Makefile
-art/Makefile
-default_user/Makefile
-default_user/local/Makefile
-default_user/local/Calendar/Makefile
-default_user/local/Contacts/Makefile
-default_user/local/Drafts/Makefile
-default_user/local/Inbox/Makefile
-default_user/local/Outbox/Makefile
-default_user/local/Trash/Makefile
-tools/Makefile
-doc/Makefile
-doc/C/Makefile
-doc/devel/Makefile
-doc/devel/calendar/Makefile
-doc/devel/calendar/cal-client/Makefile
-doc/devel/calendar/cal-util/Makefile
-])
diff --git a/data/.cvsignore b/data/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/data/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/data/Makefile.am b/data/Makefile.am
deleted file mode 100644
index 1748709438..0000000000
--- a/data/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-mimedir = $(datadir)/mime-info
-mime_DATA = evolution.keys
-
-EXTRA_DIST = \
- evolution.desktop \
- $(mime_DATA) \ No newline at end of file
diff --git a/data/evolution.desktop b/data/evolution.desktop
deleted file mode 100644
index 48e0fe2d32..0000000000
--- a/data/evolution.desktop
+++ /dev/null
@@ -1,20 +0,0 @@
-[Desktop Entry]
-Name=Evolution
-Name[sl]=Evolucija
-Name[da]=Evolution
-Name[hu]=Evolúció
-Name[lt]=Evolution
-Name[no]=Evolution
-Name[ru]=ü×ÏÌÀÃÉÑ
-Name[tr]=Evolution
-Comment=Mail, Contacts and Task.
-Comment[sl]=Po¹ta, stiki in naloge.
-Comment[da]=E-post, kontakter og opgaver.
-Comment[hu]=E-mail, névjegyek, munkák.
-Comment[lt]=El. paðtas, adresai ir uþduotys
-Comment[no]=E-post, kontakter og oppgaver.
-Comment[ru]=üÌ.ÐÏÞÔÁ, ËÏÎÔÁËÔÙ É ÚÁÄÁÎÉÑ.
-Comment[tr]=ePosta, tanýk ve görevler
-Exec=evolution
-Terminal=0
-Type=Application
diff --git a/data/evolution.keys b/data/evolution.keys
deleted file mode 100644
index 91d5372ac0..0000000000
--- a/data/evolution.keys
+++ /dev/null
@@ -1,7 +0,0 @@
-text/x-vcard
- description=address card
- default_action_type=component
- default_component_iid=OAFIID:control:e_minicard:f9542709-fb31-4c6a-bc00-d462ba41e4b9
- short_list_component_iids_for_novice_user_level=OAFIID:control:e_minicard:f9542709-fb31-4c6a-bc00-d462ba41e4b9
- short_list_component_iids_for_intermediate_user_level=OAFIID:control:e_minicard:f9542709-fb31-4c6a-bc00-d462ba41e4b9
- short_list_component_iids_for_hacker_user_level=OAFIID:control:e_minicard:f9542709-fb31-4c6a-bc00-d462ba41e4b9
diff --git a/default_user/.cvsignore b/default_user/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/default_user/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/default_user/ChangeLog b/default_user/ChangeLog
deleted file mode 100644
index 69427ff050..0000000000
--- a/default_user/ChangeLog
+++ /dev/null
@@ -1,69 +0,0 @@
-2000-07-12 Chris Toshok <toshok@helixcode.com>
-
- (install-data-hook): ignore error on mkdir.
-
-2000-07-12 Chris Toshok <toshok@helixcode.com>
-
- * Makefile.am (install-data-hook): create an empty news directory
- in $(defaultdir).
-
-2000-07-06 Chris Toshok <toshok@helixcode.com>
-
- * ldapservers.xml: break up the uri into it's component pieces. -
- don't store the uri in this file.
-
-2000-07-05 Chris Toshok <toshok@helixcode.com>
-
- * shortcuts.xml: remove the Internet Directories group.
-
- * Makefile.am (default_DATA): add ldapservers.xml.
-
- * local/Makefile.am (SUBDIRS): remove Directories.
-
- * ldapservers.xml: new ldap metadata.
-
- * local/Directories/*: remove directories.
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * local/Inbox/mbox: Removed `<blockquote>' from the main text so
- that the welcome mail is all visible when loaded into Evolution at
- startup.
-
-2000-05-10 Matt Loper <matt@helixcode.com>
-
- * local/Inbox/mbox: Commented out currently unimplemented shortcut
- items.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am, local/Calendar/Makefile.am,
- local/Contacts/Makefile.am, local/Directories/Makefile.am,
- local/Directories/subfolders/Bigfoot/Makefile.am,
- local/Directories/subfolders/Netcenter/Makefile.am,
- local/Drafts/Makefile.am, local/Inbox/Makefile.am,
- local/Outbox/Makefile.am, local/Trash/Makefile.am: Created a
- proper EXTRA_DIST section.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * local/Directories/subfolders/Bigfoot/.cvsignore: New .cvsignore
- file.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * local/Contacts/Makefile.am, local/Contacts/addressbook.db:
- Removed addressbook.db since this is now handled by the pas.
-
-2000-05-08 Matt Loper <matt@helixcode.com>
-
- * shortcuts.xml: Removed unused shortcuts which point to
- unimplemented folders.
-
-2000-05-08 Christopher James Lahey <clahey@helixcode.com>
-
- * local/Contacts/Makefile.am: Install `addressbook.db'.
-
-000-05-06 Ettore Perazzoli <ettore@helixcode.com>
-
- * default_user/local/Inbox/Makefile.am: Install `mbox'.
diff --git a/default_user/Makefile.am b/default_user/Makefile.am
deleted file mode 100644
index 2cff4d1435..0000000000
--- a/default_user/Makefile.am
+++ /dev/null
@@ -1,9 +0,0 @@
-SUBDIRS = local
-
-defaultdir = $(prefix)/share/evolution/default_user
-default_DATA = ldapservers.xml shortcuts.xml
-
-EXTRA_DIST = $(default_DATA)
-
-install-data-hook:
- -mkdir $(defaultdir)/news
diff --git a/default_user/ldapservers.xml b/default_user/ldapservers.xml
deleted file mode 100644
index 5469fecc52..0000000000
--- a/default_user/ldapservers.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0"?>
-<contactservers>
- <contactserver>
- <name>Bigfoot</name>
- <description>Bigfoot</description>
- <host>ldap.bigfoot.com</host>
- <port>389</port>
- <rootdn></rootdn>
- <scope>one</scope>
- </contactserver>
- <contactserver>
- <name>Netcenter</name>
- <description>Netcenter Member Directory</description>
- <host>memberdir.netscape.com</host>
- <port>389</port>
- <rootdn>ou=member_directory,o=netcenter.com</rootdn>
- <scope>one</scope>
- </contactserver>
-</contactservers>
diff --git a/default_user/local/.cvsignore b/default_user/local/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/default_user/local/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/default_user/local/Calendar/.cvsignore b/default_user/local/Calendar/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/default_user/local/Calendar/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/default_user/local/Calendar/Makefile.am b/default_user/local/Calendar/Makefile.am
deleted file mode 100644
index 9117ae6373..0000000000
--- a/default_user/local/Calendar/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-defaultcalendardir = $(datadir)/evolution/default_user/local/Calendar
-defaultcalendar_DATA = folder-metadata.xml
-EXTRA_DIST = $(defaultcalendar_DATA)
diff --git a/default_user/local/Calendar/folder-metadata.xml b/default_user/local/Calendar/folder-metadata.xml
deleted file mode 100644
index 9313cb5f50..0000000000
--- a/default_user/local/Calendar/folder-metadata.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<efolder>
- <type>calendar</type>
- <description>Calendar items</description>
-</efolder>
diff --git a/default_user/local/Contacts/.cvsignore b/default_user/local/Contacts/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/default_user/local/Contacts/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/default_user/local/Contacts/Makefile.am b/default_user/local/Contacts/Makefile.am
deleted file mode 100644
index 6c0407f9e4..0000000000
--- a/default_user/local/Contacts/Makefile.am
+++ /dev/null
@@ -1,4 +0,0 @@
-defaultcalendardir = $(datadir)/evolution/default_user/local/Contacts
-defaultcalendar_DATA = \
- folder-metadata.xml
-EXTRA_DIST = $(defaultcalendar_DATA)
diff --git a/default_user/local/Contacts/folder-metadata.xml b/default_user/local/Contacts/folder-metadata.xml
deleted file mode 100644
index dcee1ec826..0000000000
--- a/default_user/local/Contacts/folder-metadata.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<efolder>
- <type>contacts</type>
- <description>Contacts</description>
-</efolder>
diff --git a/default_user/local/Drafts/.cvsignore b/default_user/local/Drafts/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/default_user/local/Drafts/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/default_user/local/Drafts/Makefile.am b/default_user/local/Drafts/Makefile.am
deleted file mode 100644
index 144b8bb834..0000000000
--- a/default_user/local/Drafts/Makefile.am
+++ /dev/null
@@ -1,4 +0,0 @@
-defaultcalendardir = $(datadir)/evolution/default_user/local/Drafts
-defaultcalendar_DATA = folder-metadata.xml
-
-EXTRA_DIST = $(defaultcalendar_DATA)
diff --git a/default_user/local/Drafts/folder-metadata.xml b/default_user/local/Drafts/folder-metadata.xml
deleted file mode 100644
index ee9cafe3b2..0000000000
--- a/default_user/local/Drafts/folder-metadata.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<efolder>
- <type>mail</type>
- <description>Drafts</description>
-</efolder>
diff --git a/default_user/local/Inbox/.cvsignore b/default_user/local/Inbox/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/default_user/local/Inbox/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/default_user/local/Inbox/Makefile.am b/default_user/local/Inbox/Makefile.am
deleted file mode 100644
index ed3ecd58d4..0000000000
--- a/default_user/local/Inbox/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-defaultcalendardir = $(datadir)/evolution/default_user/local/Inbox
-
-defaultcalendar_DATA = \
- folder-metadata.xml \
- mbox
-
-EXTRA_DIST = $(defaultcalendar_DATA)
diff --git a/default_user/local/Inbox/folder-metadata.xml b/default_user/local/Inbox/folder-metadata.xml
deleted file mode 100644
index 64cfbadfc3..0000000000
--- a/default_user/local/Inbox/folder-metadata.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<efolder>
- <type>mail</type>
- <description>Inbox folder</description>
-</efolder>
diff --git a/default_user/local/Inbox/mbox b/default_user/local/Inbox/mbox
deleted file mode 100644
index 9b3910df46..0000000000
--- a/default_user/local/Inbox/mbox
+++ /dev/null
@@ -1,2225 +0,0 @@
-From -
-Return-Path: danw@helixcode.com
-Delivery-Date: Tue May 9 11:16:21 2000
-Received: from trna.helixcode.com (IDENT:root@trna.helixcode.com [140.239.238.2])
- by twelve-monkeys.helixcode.com (8.9.3/8.9.3) with ESMTP id LAA26395
- for <danw@twelve-monkeys.helixcode.com>; Tue, 9 May 2000 11:16:21 -0400 (EDT)
-Received: from twelve-monkeys.helixcode.com (twelve-monkeys.helixcode.com [140.239.238.12])
- by trna.helixcode.com (8.9.3/8.9.3) with ESMTP id LAA02867
- for <danw@helixcode.com>; Tue, 9 May 2000 11:14:49 -0400
-Received: (from danw@localhost)
- by twelve-monkeys.helixcode.com (8.9.3/8.9.3) id LAA26391;
- Tue, 9 May 2000 11:16:21 -0400 (EDT)
-Message-Id: <200005091516.LAA26391@twelve-monkeys.helixcode.com>
-To: Eva Lucy Ann Tester <eltester@helixcode.com>
-MIME-Version: 1.0
-Content-Type: multipart/related; boundary="----- =_aaaaaaaaaa0"
-Content-ID: <26389.957885364.0@twelve-monkeys.helixcode.com>
-Date: Tue, 09 May 2000 11:16:21 -0400
-From: "Helix Code, Inc." <hello@helixcode.com>
-Subject: Welcome to Evolution!
-
-------- =_aaaaaaaaaa0
-Content-Type: text/html; charset="us-ascii"
-Content-ID: <26389.957885364.1@twelve-monkeys.helixcode.com>
-Content-Transfer-Encoding: quoted-printable
-
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
- <head>
- <title>Welcome to Evolution Pre-Release!</title>
- </head>
-
- <body background=3D"cid:26389.957885364.2@twelve-monkeys.helixcode.com">
- <img src=3D"cid:26389.957885364.3@twelve-monkeys.helixcode.com" align=3Dcenter><br>
- =
-
- <blockquote>
- =
-
- <p>A warm welcome from the whole Evolution development
- team. Thank you for helping us test Evolution; with
- your feedback we can make it the best groupware suite
- available today.</p>
- =
-
- </blockquote> =
-
-
- <h4>Getting Started</h4>
-
- <blockquote>
-
- <p>On the left of the Evolution window is the Shortcut Bar, with
- icons labelled Inbox, Calendar, and Contacts. You can click on those icons to jump from one tool to
- another.</p>
- =
-
- <dl> <!-- <dt><b><font color=3D"#993366">Today</font></b></dt> =
-
- <dd>This tool offers a summary of new messages and the tasks
- and appointments you have lined up for today.</dd>-->
- =
-
- <img src=3D"cid:26389.957885364.4@twelve-monkeys.helixcode.com" align=3Dright>
-
- <dt><b><font color=3D"#993366">Inbox</font></b></dt> =
-
- <dd>Click on this icon to see your email - all of it. Your
- Inbox is also where you can access Evolution's powerful tools
- to sort, filter, organize, and search your mail.
- </dd>
- =
-
- <dt><b><font
- color=3D"#993366">Calendar</font></b></dt> <dd>Network
- and share your calendar to keep your whole
- organization on schedule and up to date. </dd>
- =
-
- <dt><b><font color=3D"#993366">Contacts</font></b></dt> =
-
- <dd>The Contact manager holds your addresses, phone numbers, and
- contact information. Like calendar information, contact data
- can be synchronized with hand-held devices and shared over a
- network.</dd>
- =
-
- <!-- <dt><b><font color=3D"#993366">Tasks</font></b></dt>
- <dd>The Tasks tool combines a "to do" list with
- alarms and reminders to help you keep track of
- daily events.
- </dd> -->
- =
-
- <!--<dt><b><font color=3D"#993366">Notes</font></b></dt> =
-
- <dd> Write poems, take down messages from phone conversations,
- or keep small things organized: Notes is your catch-all
- notepad.</dd> -->
-
- </dl>
- =
-
- </blockquote>
- =
-
- </body>
-</html>
-
-
-------- =_aaaaaaaaaa0
-Content-Type: image/png
-Content-ID: <26389.957885364.2@twelve-monkeys.helixcode.com>
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9AFAhEcJQyUsSkAACAASURB
-VHjabL3ZcuRIkiyqAByOLSJIZlZN95z//6Hzch5G5J5lZrqWriQZG/btPpiruYHZKVLSXZVkBBZ3
-czM1VbXkr7/+c++6Fnmew/sCSZJg2zY45zDPM/7885/4+9//hiRJsCwLsixDkiRwLsM0zUiSBGma
-Yl1XpGmKtn2iqmqkaYp933G73dE0NZxzWNcV27Yizz32fce2bfq7+75hXTcURQHvc+w7kKUJrrc7
-8jxHlmXI8xzrumJZFgDAy+WMfQfGaULfd3AuR5qm2LYNAJCmKbquQ13XAIBt28K1O2zbpj93u93Q
-NA2SJNHfA4Asy9C2LZqmwb7vh89YlgVJkiDPc4zjgCRJkWUZvM9xvd7gfY6iKPHx8YG3tzds24b7
-/Y6Xlxf9rHVd9fklSYJ931FVJR6PB+Z5Rl03uN1uOJ1OODUNxmnCMAzw3qPwOQBgmhc4l2GeF0zT
-hDRN4ZzD4/GAcw7TNOF0OgEA5nnGvu8oy1LvbxgGZFmGrutQVRWausK8rGjbFmVZYhgGNE2D3GWY
-lxXbtmGeJyRJqp+fZRmcc3AuQ+E9lnXFMIxYlgWPxwOnUwPncuR5jnmesW0b8jzXZ5BlGbIsxTTN
-KAsPX1Ro2ye2bcPtdsMvv3zHum7h9xy6rkOSpMjzXJ/bvu/o+x7OZfC+0Pt9PB749ddfkSTAum6Y
-5zk8dyDPPfLcYV1lHS7LgjRNkWUp+l6ey+12w+vrK/Z9R5IkuN2u8L5AXdfIsiysaVkT67qCf5xz
-KIsCv//xB15fX8NzTnE+n+F9gc/PT2RZhsLncC7Hf/7nf6E5NZjnGWVZoChK7PuO6/WKt7c3fXdN
-XSFNM3R9jyRJMAyDfFdZoqpqDEOHdd10bX1+fuJ8PqOpK+R5jmGcdP8kSQI3zxPSNEOeeziXYVlW
-fXh84Fxs27bp/+dGybJMN5M3P1dVJaZp1oeR5w5pmmKe5d+fzyecc7oQk8Rhmlp0XYd5zrFtG+q6
-hssyDTphfyJNU6RpinGadBHxpUtg2jQATdOMpkl0ocpmk2vs+14XYha+x75E+f1JAwg3Lu+Jf/Lc
-h8Uni0muN0XuMgDAOI5I0xRVVcmzcA7DOKLrOhRFoQFgHAc8nyucy5EkKcqywLLUsnGWBfM8I89z
-5LnDs23hfQGfO92wSQINvlVVwXtZ4HVVYl5Wvb91XQ/P3jmHl5cXDVrz46FBQn4mRZKm2Pcl3Hse
-3uWMJJFnwWc9z4v+ngS3DFVVY1kW3fhZKv9921Z9H/zzeLYY3z/0+vnMs0w2pssc8tzr5x/fiaxj
-e4gBcpBs+66HFJ+DHD6brneuJR5IaZojy5weVgBQFCXKssQpbFZ+zrIs2Pdd11HuMizrgvv9JuvY
-OQlYSND3na7pddsxdh3KqkSe56iqSp6TyzCFZynXI4HbFwX6fsC6ruH5J7qGPz8/UJYlpmk6HCzO
-yRqRZybPbZ5neffruoUIUmCaZkzTiDz3WJYZSZJKVpCm+Py8Is9zbOFFcyMuy3J4mN4XaJoaRVGi
-74fwIFPsu2y6fd+RpQmqqkKSJOi6Ds45VFWJNE1DJJPgkaYpun5AnQB8z2ma4vl8Is9zvFzO2MJf
-JGYV8cYl0u260HmyM8jJZsrx8vIiGyWcuM45XbDjOGGaRl30/HwGkKqqkKYpvPdo6jqckDOKosAw
-ThiGEUmSoK4rZFmGZVlQFrJIJdvx8D5H23YhCDsU3uPZtti3DdM4hcxMNhoXmHMSJJM0xTRJICuK
-Iiws6CIch10XUpqmaOoaaZZiWzcNoAzi0zTrBuA9TtOMYRj13m1Ak8zMI8vSsIkWzQ64OadJMgFm
-CO/vH6jrWt8XN2vMroCyLPSkkw2wIctkffX9U7PBLE303mQjePOOFw0Az7ZFkqQagJjJSrayYFlW
-zUTWdQ17QLILCVapHijOORSFx75t+m6TJNHf5Trb9h3zvMB7CRi5y7Bushb5nJkV8x3UVYmyOmEc
-O+R5gXG6Azh+/vPZ6gHrvdxvlib6/Ppe1hGzWhvE123XYMLrdNyIcmFTSNWc3gwXAX9OFuCmF87/
-pidFkqBtO11EXAgMFAAwLyucy7CuG8qyRJIk8CED4SmUpRmmeQoLzZuMQ05Gpr88mXkPf/z+J5pT
-oxuTfyQFv8E52Sh5nuvJJRt+xTTKC73fb2FDlchzp6eKDTRMsfZ9R+7kOd3ud5RleThpm6bBt2+v
-ckJlDl3fY5wmOc2cQ+4yZGGh8zrXTZ79vKzYwulzu900YMzzrCcwF1Lf9/C5g3M5+pDWT/OC2/2B
-t7dM31E/DPqu5B1IOfR4PPS5LMt8CHh1VWKaFz0lsyxFmsbP5OaX8iPH8/nUbIf/bNuGYVg0SOUu
-w2hKyHme9ZTMXQxwfL/Lsup75rNfwvsYx1GvhYGbz0WCc6Hvimuav8PgxQ3BNVuWBfYdmOYZdSgx
-sizTTKdfh8P65jriRmd5XFUl6qpEmjl8fn7qu2Pg4J+iKNB2fcjUUixLxzz0EGT6vsM8zxiGFE3T
-IEsTJGmK57PVbLSpa+z7Du9zTOOoQZSlii3nHdPKBEnYFBIZh2HUl/31j6YPYRNz4S4hzdz3HZJZ
-ZADkAbVtGzd3+EwGiaLwmgauqyxGbiBZjE7xgmGQ07gsPOZlxTgO8TRMElS1RNyyKND1fXhxKbZN
-rsX7HE1daTSU615wu91Q1xWcE/whz+VklvLIwWUO4zTpy2bq7HNn0tENXddpRsDNmmUZHo8H0jTU
-ypnDskrK2HY9siyWJ/u+YxhGXcBMLcuy0JrVPud5XkKpsGDddmyznOqs2SV1zvS04QKUZ9shTTPF
-XQDA5043HlPFYZx0bazrphux8B7DOGKaZnif4/F4AgBOpxOqqtRyIUnketouXpsvKozhJDyWDKmU
-NF2v2RQPjySB3jt/j5vWOafZhJSEHmVZoO+9btKi8JrN2FOZ98M1lGUZfO4PWBKzV/4s/2Hw4j76
-vF5DEJVrABLZ2CF48vM/Pz+1zLEBK2Yly6H0mKYxZFYpiqLU4DZOsx6wDLbLItciWXSm1/n1z/P5
-gPvx4x0vLxeM4xguHJjnTqOUTauZDXChzvNyqMM0mCSJPtxtk438uN/x7ft3FN5jnCaN4ltIpfZ9
-1xSO0UletDyAYRg0SEhNLJu/KCTCDuMUUqMahc/hiwqDiX5JkuByueByOSPLCoxDq9fgnMPpdJJT
-30u2UZUlXO4xjiP6fkCe59j3XR8kXwyBMZuplGWBfdswTnPAOuRE46kzLwu6rgsvPQOQ/UtQ0G4K
-1vvO5Zim9lDSAID3XmvreR4wTjHaO+eQpQmWZT+8TwZOYijysznybdc6VDZ9zOb4Xpdl0Wzifr+j
-rmMpxAzNZRnWkGJv26Z177ysGKf7IXMj0Et8hnWt9zFbk39HWCvukEr73CFNMwxhHe/7DpdlGEcp
-QYqiwLZtmp00daW4wRjWyTgOWFfBnt4/PjSoSMaTKvBrMaLn84ksk3JIsJc6lHepPsOIc8VUndlW
-4b1mbBL8FozjqBkF9x1BZv5cWXgkIfiMYwR/y8JrZriuK4ZxwOl8OoCVfd9j3zc4l8Odzyf88v27
-qZUSfTFyyuCQikmaNcP7QlFkbgBe4LIsGMYppGdyar6+veHlcoEvCjzbVoG0ZVm0ls7zXGuYeONA
-13Wa3shLiXVr7jIkAUhq21ZPjbaTurjrOpxOJ3jvw80PSJIBfT/ooiL6630OXxQYpwnbtioSzbQy
-or6rvhAJYIOcKAFR3sMC3sJL5LOqqhIuy9D1QwDsKgFHkwRdP+jG5POX551odH88W33RfB/7vuP3
-3/9A0zRYQ/DlZzCAyDUnh4XIf6T7w+7KimmeQrDYMC/xxCJAzLRdAr6UjHVdCfZTV5LKh3sc90mz
-CHZTyrJUFJplpr0XBlnnMs1CuYmmeYkZV5oiyyLwPM0LlmXQ7GxZZs1KmZFIyVlI/VxUeDzuWnbI
-ppSs5dQ0GMYxnNqJBhqu2b7vw6b3GkirqsRvv/2uHZfL5YxlWUNGuR9K2GVZUdc1cucE1BuGQ2a2
-batmPty07KBwDX58XjUYMOPJc4d9h64lCaqyx5Zl0cOZ2EHfd3Cvry/IfQEgh58nuMzpySmnw89R
-j6eZbSexRcfOAVO1ovABIKuwY8e27boIuYHKsghYADDPqYIvy7LpTRIUWtYlpKGyOFnnykbzWk91
-XafdiWVZNCUlyPP5eUOSJHh9vSBJUkzTqBnOtm0YJ6K+PrysTE/8adr1dCCYJxtWntk///oMi+Ci
-z0zR5dwhyySNK8KLWLfVBNCITMvvxv/PwMtsSzbXhDQAVWXhD6DY7XY7gJjDMGCaRtR1rZ/De5aU
-8BmyqErxkRiMwvOeRq3/pTySANL3A5L0jHWbMHX9YVNL8KsEH0kTDGEx8n3Zzc8/LDW2bcUwTnoq
-Lt5r+cNgl4fui63lidsQUPRFhWWWwyhNEiyhVGIwimUE4HKPItTeW+jqxJ/JEBIf5CEYFT5Hnhea
-CXifYxylrOv6DkVZYN93PcjKshTAbhjweD4PKTrBTJsNz/OE57ONXaTcYVkyDVzTNGLfQ4u07zVj
-A+RQBHZpP4aOEbOVLDsj+d//+3/tdV3h+WyxLHOoqTIAe2gnpOELF6235FQSpHvfgWHo0dQ15kXa
-J0mShv8l8CIpaB96lkz7y7LQk7UJrbau75E7SXXvj4cGlKqskPscHyE1S9MMfd/rjTLQrOsKn3s8
-no+QLo9wzuF8PqFteyzLjLaVWvV8vuB8PmEYRuUrJEkaIq3cqwCj8v3crI/HU/vWPvRxiWssoV03
-jiPO57MAb/2AovAovA/YwxI2GMKGYneB4NikCDjATZhi2+REKbzH/fFAbur1pm7gco/H4w5gD4j8
-LFlHyLTWdcU4jmiaE/Z9U6zma7Cpqgr7LgHHlgwA0HU9yrIIte8SShjJ0oQvIFiJPTTk/yfa7dh3
-CTLrKmBcURT6/ZIBBMAynLTe+5AF5aGrk2gLERAQkF/nQ4CQz0PoFMza/ZFywOsaZwAiCMnP5Pr9
-+PiQ9dk0ep3DINdcVQU+P69aoo3jiLoqUdVnDEOLMWQRzNj4TLLMBUxhC1mCZDvbtuJ8voR3Ks+B
-e7Pve5xOTdjcUlrxsxjgvc9xu93R9x2a5oSiiDgG12/btQdgPvnx4792/gderHMOwyAtvOezxa+/
-/orH46Fts0iYyFCVJT6v14B+p/rQCU6QyGD751yIZSmtP+IPrMN4wuz7jo+PD/z66696MhJMKYpC
-ywWmPkmCkOJLRK2rCu/v77i8vKCqavR9h2URwkxZljifX5AkGdZ1wPV60xbP89lqjfTx8YHv37/r
-M4mdkUlblvu2KQZhEd7L5YL39w8NJnKCRsBPUjz2/ZMDQMPP+Pz8xMvLiy7UsvBS2vSDPhP20omU
-82fZqvzbv/0bukCSWZYV5/MZfd8pnhPRfTlV6rrGPE3o+h73+/1AhGEaSsIS+/nO5TifGiRpisfj
-qTjO7XbT989Fx9//+PgIQarWGp3P5vF46Lv69ddf9fRNwuZvu16zL7YlWVJwjZKItK0bmpNs4HVd
-NRW2YCezRa47tpp/+8fv+Pf/8Xf88v27Es6kPe51vTKl5+exXBBQeMAvv3zTLIt7Zllm3SMsd7uu
-w/l81g5Jmqa43e44n09I0xSn0wnrsqALHZ9hnDDPsxLDhnHS766qEmmS4P3jE29vrwo8E7dj9uey
-LNN+KlNKvqiiKFB4j3/+85/Ytx3fvn+THqipUduAegvjrJFI9i9ALNvrJamhCiUEA4psoECkyF04
-YaS1QiLHNE3aA04S2URVWSpCz0CSJInUccty6JNy0VRliW2b8f7+Z+ixh99DoimaBKPUoPEbkkR6
-8WVZhgXvsK0LxlCGcONKytdiW1fkudNsRTYqF56kqoXPw/1tyrRzTtpx87wc0t15WTGHvjUDDhev
-dBAGTa8jHtJhnidsm3zm4xE3ex5qWoJSbAnak5vvzmIPxGQkBZdDwAYulnnPkOI2TaP1ts8dXJYp
-wHdqhCn44/1d61OSYoZ+QOE95mUJPJVJDyKCeNuWK4bD7hNLvW3bcL6c4b3HqanR9YMwTbcN03wE
-RW3qXJYFvC/w/ZfveHt7Re5rTIHjwEyFwHVRRH7INI0YBimzqqrGOE7wucc0zXp49AE3syVPkiQ4
-n884nSQ7e7YtnMv1pF/XFY/Hw3QfsuO1h64Wn5/PPdIsRZokmOcFfT8oDmBxIMeTna2ibZPTqq5r
-TNOEddsDcFLjcjnracFFSYCKNS4/r6oq9H2P5/OJl5cXZf7xu9Z11TYdb1BeZiAoZE5TNgJPSZLg
-/f0D57OASfxettQ+Pj5wPp+VSEQgqOsH/QyeQG3XGcDJacCZA/AipYcH0OK///sf8D7H29ubAn3T
-NIVuxnBgmFmG4Lpu6IceRVlocKirUjc7f29eVmGOhWfKHjxbaFw4Nl3lhrSdAAZAkotut5vWuNys
-XKQEJplKp2kqLahlDjjHFFLpCCbyVJW2VCTHrJt8b1l45SEQnS/LCk3TaPpKIJHlonMCvO4Be7D3
-VVcV5vCc9y+EL6Lzuwl+PGF3fX855nmVNmfukLkc29YpuDgMg8kkc91UQkWXtmHTVFiWFX13MyxP
-6Tps+64Z7+3+EKwol/KiaQRn+fHjHffHQ1vB5L1YYJB09Dp0JoSjkRvsZ1EMiP898jkyDYQ8LJM0
-xe1+l0MgrKlpGjHPcqjbbNYRuWfqI+kR9N/7fsDLy0tI8Uu0bYdhGDRKc2FL6yUCX2VRoG2fUv8H
-cMs5Sf3IxGPqbxl62hoMpBzb7tq2DW9vr3h9fUFdN7her6EF5LGuUmeTLdf3Nz0p2BbiRuILIK8+
-z11AjldlSvHnkyTBr7/+gqIo0DSNdhpI+2XrzmokyNbi9zJtZpdhWzfcB8kYqCN4PEYFE4m6p4nT
-mn+cJkzTFAJYeih92DPm7+Yu03dDlucwjApkEjiKYF7M2NjWfDweaJpG+8jHGjYzVOBEg2WSpsjC
-Pe27dAmyLMXp1EiNPPS68Xi93qeGny/Pz4UaeZwm3O4PfA8AM4HJ2H9fvnRMoGAhsYXcZfC5Q9v1
-uN7uShcmPySu41wziGEYQ8a04Xq94+0tVSajtsS1I7ZgMUGL7eoECdZlASDvRJ5FYDBmKeZ5N5ia
-4C5VVSs+Ro2JpRezfOEfliNt22JdSyV/2T9sgRdFibqOnJYlXK9j7V54j7br8ecff8IXHlVVaY06
-zwv+/PM/Q4TLlXxDUIQvhH3SsijgCxE0nE47TqeTElKKokTXtVq72jYQe8pFUQSAcdceMmub0+mE
-wnuJwuGF9cMQePUlTk2NJBWQ0PsC+xbTO5bZTJ1tWvvx8QHvC21TsWVjazqi76xHheyR670wiEnw
-3A7tNv7d4/HUFy+YSxQ68Tn2fWcWdqTsWk6AZb7xDwUnz2WGn5dwLysys4lZ6qWpUE/ZzmNWwe8p
-AtawrdsBVyAhiO1etummeVfaMIFj5xy6bsAYKNG2FZYkkYGXpbHlx3SVB5AtKyzvnRnl17KL77oo
-5F2yJczsk6Sqvh8CMSuDz4Uy64sK7+8/VHB2OuVBaDWHzGkzQTDVg4zXxeyS19h2nWZQ6yoZTtPU
-AFKs61OvlZhW7qRDdAvfF2nQobMROBjEuvZdshV+X1WW6Ppen+u6SmZpWYzM+ngfjkgwF1nd1HAu
-w+nUoO8H7eOfTiejqltRVTXqWoA1exLu+45xmvBsW72J5/Op7ZdpHPXBuXDDBPd4WtmUlui1jYTP
-tgPQaUfBplPLumJoO6XkkvwhAKU3GgGz2L03hJNMyxirDnw+BdiiUjGyH/GTipBlDhFsZiUA8P7+
-Hlti4fqE3lxiGgXN/fz8RF3HrIxZBBcauegsaxggmRnY5yGAmQQUKwhyzmGaF5RFEeraCEaNo5QI
-VVX+lDFxE/FkoaCF74tkoNxJm1DqUXfQI5DPkTuHHXvAJR4a+C0piKkt01YudoJ/3nvt1BA74SZ0
-gWbNYOW9V/xBxTjrhonah73T35W2aoHb7aZZgsVaJsOH+CoqExJZjmfbout6NE2jJLlt3fD+8UMz
-NB42SZKowk/S9CxQ0Qfd2PO86SHAcrMoPBIk2LEjzVLtiKgyNrQf+Tz7XoIGW4LOLjCypC7nC4qy
-CqdZxASaptH0TjYlDmQhLrwpBBMGi2mSE+Ya2hWsQ6xIiIANU/ay8Pi8XnXzE3VlXz/PhXPO9ImY
-gDMABwAs64I0TUz/NJJPCJQJ9Tc36r5c+7n237lgSPf9ypYk1TbiHJtmMNwcTdMcGGBrAAmlRz8j
-CboLLgLbossy+VwBlNKfWm15LpRg8tgFcFwUp7GnFkFKboxpmhRniF0KwXReX18VYRe6ao4xoNrc
-FJYtSLCWp81kGKPK46c6MFCWlUUYiDH8OX4HM0gLKgufIdeUX07qTDcWAFxvN3z//i1QaVleThG/
-CCfw9fqJqqo1YOfOhe6GU9BZuBSjZsZ57nVtc42s64p+GLD3MevgZxIE5ua3JWkkvsk1tu2odT9B
-Q3vIxKx71extGEYjFoskO5EgR6FUmsQunYtgD4LwRaSnw+2K6/WKruuNcq/VL5GA8TjwstmO4Yti
-QODNVlWlCDNPWda99CMg33wYJxRFiaapUVXloUZnPcbAwBNx3XaVMUcCjjC8hKJaKl+dbcjC5wc9
-t6X9WoGOBRBPp5O2bSzPnp97bC1FZFnr3twhDzx6BlDZ7HPcrGlyUIpRT28ZcrZ9ZaXZfT9ocCPI
-6ZwwDu1GZNCzKkc+V5Kx+LMx3ZbT5Wutyc1vWYgSrISIdL890Jwa1EGown9Enz7rKc3ft5tz33fc
-7w8jtXWqg5d03wfQrjhQghk4ZPMJRbcqS8WXuOmkz3/Ssu09dCOsepOfGQVxWShxxEujaWokSJRN
-S6qyc5IRJAk0y1aKcZpg/cLaJEef3hjEPfi+vBeOP/8b1bQ2A/ntt98AAG9vbyoNJ/W564ewTybh
-IEhNAqgsuCjgco/n8xEkslK3jON0ZFoFfjvJOxaRPPLUowFH7jLk395QljVOpxHjOKlAwzlJS3xR
-4Y8/fkfX9Xh5uRiBxBo2BZREI+24ImQDbaghY50mJcSMNG1EELRuh5qN1ziG048LPUkSXK+fmKZa
-a1XNBFymqDXBwCxN9Hu5OEiRXgK3m1TOJAHartcTlKkvF5yeotse0rnk0AkYhlgSMWjZzc97Jxst
-4h+iBbC1Mr8vS5PIyjNGKXJ/sUPEhON6u2pXwX5eZF7OyHOvmw8ALi9nZT92oSUahTUpytIHZucE
-73MlMvHaRdwyYtskcyL7jTJ0fg/bpwfNe9Bb7DvgcockaFH4rtSnIMs0QHGd9GFtD+OoWg4CeTE7
-9MjzAsMQO0up4RlwfU3ThI+PTxV2jdOmhwp/lp9ZVTnqqgL0cIgdDitIIpfG+1zlySQtff/2DX+G
-5zdOk3IAZB2mqCoPlyYiJ0xVpDFhWYXhVdcNHo8n8lxAk64btaX0z78+0TSNRhZeoFBTi6j9z1Ij
-TpAbTZMEZVUjSzO4oFqa51nbQ1mW4eVFhDt//fWOv368B7Q+V+CLG2dZVgzDgPv9Hii/lVKUmbKn
-aYr7/diCIVouRJb5IL4AgKY5aXbDjcZSyaaQEtj84YUwIq/rGngAudaR9pTs+14XHx2Y+DnMHsho
-4wJi6cJ692sb0LZVy6LQAIwv0lkLvq7brqn4uu6HFHNdoypN3uVyUCVaujAXM4VFs9KSpRPAVls/
-DIcM0foF+NwHSngsTYpgDOKcQ1PX6AMWQAbmPC8q5OmzKP+NJUnEqO73x0/CK1u+jIHVum1bbAkb
-jQIPiVml6Ahq1+ehKzIvUGMYObh2pSZXVa2OWsxA+BxIBS7LArn3mOYJ5RrNWabQ+bCZqZWU7/uO
-19dXnE5nOFejLB8KrlrtBUtiR8KBBZzIxmNt9fHxI8h4s/AiMhXvUCdOCjBBv7qu0bZP9H1vNgV7
-7Su6jw89hVjDcGOQFVYUNcrioVROy42mDRJTIql7C2Wj8eGyxScLdA7uPV0gWayH+o01mqTkTk9E
-vnxGT4Kgqi0PVlx8bsQH6tBJYSDxPkcaEPgu1IhFUSihaFnuuoDi5lj1ngl++dwZwk2q7EdKTKuq
-CifQCmA/gI3blh+YiAxq879webL4EHUI8QSRUoaZDDdUFF/lyjQkbkHg0rZG7SlGfsbXMmKcJs2i
-mCFEUll0JErTTU9nbnoi9rv2wyeT0UQO/v1+x+VyCSB2zCCIwpPJR5zCOjQx+3HO4ePjA+Mw4Nv3
-76EMW1UYJ98p+BYADNt4MDexRh3TNCt5x5aoNlPghp5m4cpwrQmT8o51/UTbtni5/F1BeWbjxPDS
-57PVupm+Y87l0Zwhd6rhtzVTXddClKgrVbzJgi7Vvkkinbj9WCMNe2rQt4/ZAhf2NE24Xj+CR1qp
-9S83QlVVKLxHlmYqA67rGmVVI8+LQ0RlUCmKEufz6eCe4wLYw2uTzseovz+ZhRpPqtgh+Pz8xDgO
-B5MMnhRdIEJt24a//vqBHz9+hJclC3rbNpV19n13wAoIaJVlob5x9DlIzAZJDVeiacQIpa4qTPMS
-ar0l0H4nNe0Yx0Flsgzy9iSyGvTPj6tufouLLMui4F1E93MFL6WXPh8wBmvYYSnT2hpE8pM3wDiO
-+Pz81ExJXIGGw+flAWMiuJpqCbipIjBmMcF0xljbSXu6ONiFRaOYBX/99QPjOBpzkxW5yapYio7j
-iLbt4IsCL5cLTk19AIopCLrdH3i2nQkK8TpyFyXR5ATwmVlcxNrYuX8hOY7PfVdNB1vPlrLsiBA2
-Ta09ajHv8OJk8pMtE9l+/qCk8j5XhJk/fz41+PHjB1LVGgh6um1pJOcEezBp0Xi0c6engvc5ltlk
-J4Fwwo1N7MGCYY/HQ1+2JbBwQQl4lCuHWmpvYR7OATWVk3INJJhUAxo30MVu8gAAIABJREFUQFWV
-8ME2TbIbOdmfz6ec6OcTPj7E146p1+VyRl3XOJ1OISgEvCFNNdLbAKn2UqFEs+41wzBqS4wLgr3v
-fZd2EF/0V8cbZhV5Huvz9tni8iI+CQR5WU+fLydcLqKlmOdRuxpW2mr78Lzmqixxf9wPBjJ2kfIk
-svRwptX0tGOwvVzOxoh2O6S/Sch0+FlDIAJF78LsIDPm2pyDToLt2PtdSkpmbTGjS1EUhfhIBJeq
-aV7QdXc1IJVW84BlmfH9+zf8/e9/R55fMM/PQ0s28iicZr7btuGf//wL3uc4nU7BF7INOpNKRW5s
-RTP7tGYoq8G2bGlFOT5l5F+9IPd9h2PKtK1iO3W5XA6KKqtoWgJ9kzUgXxi982xaxowiSVJMc+T6
-F0WJtm21sxB9AyJoxii8LLKQ81ADrtuukVuygcimsuSe2D5ag/Bo0F63DQT7Lh6GQu3tNbWk4y1d
-YIvC43Q6oSyEWkm9+bqJzLLwHi7PjaXWeshabCoqBCVxRiqKAknQ+0fAMtOSpCg8tnVVLoYYps5a
-L1vHIEuc6XvxJ4jsulzTTMpBq6pU7gHReTHvXPV9sJwRk5TNuETFQ+GrMSWNPeXkS/V05s9pmRHk
-3l9bmRTh8H5ut0/UdYlT04hrlYvlifoOzssBS7Agme2+0FKLh5pz2UFNSsCVz/e3337HNI0oy78J
-dyDQnOMBkx9wInatksRhnu+4hjb2UUrvDu1dcScq1Pm57TpUlVjllWURCTuO/IRC3bDkvmIwbNun
-4ixRFu00gNhDUa9HPc76QXvUzmWSChsFk233WbOQrwwyopgAsG7Sa57nFxUKRdUZKbtDQHjl1Kuq
-UqWokmYuX4AxKPhiRTSWiMRNzgVMjIM37XOHpGm0TKFgZVlWTQXLosCOHS8vL1JaFB5dP2hrkWk6
-PfTGadKIneeFtpxsCryuW2jxrAY1Xw/GnFJvjtphGacJuY+eiGS45U5MNyzKb/0ZyTMg9pEkCZL8
-qFOY51lBJZFn1+b5RV3DNVhh2xadXfg8RK7Xm5ZWLK/atkMV3GgpGrN1rGUZCjU4PxwwcoJDn4X8
-vQseiaUCzyQXxSxqC2Yc8XSkY1KkvMt1p6FtV5YFXF7h+f6hmdztJmy6W8gQRKknG7SuxKWXrWU+
-k8/PH5rB0Udhnme1Xmd5RUD9crlIlqTu2bVK03k/47hr5uBcXPepOfFJZiPJx7oCiy16XCe0fU/+
-z//5X/vj8VRTDrFRzvDb77/Be4/z+aInBxcrRSqsU6lbV5useQl24tHuyAcbL0kbl3BaSruRCy5L
-E/iixDQO6PohGC4kwe64Umvxr6mOJSzdbleUZa1mDYJnSPvEuRxd3wWXlFm9BdVBxWWY5lk12tSm
-F97DF+K0ynsjKMNFFlmLW6DB5iqPZtB1mTDfqImnr0Gkli7hpe8hUOWqracfAGWh+77hdrsbYJY+
-+8vBaisq9/ID/kLd+7atSqwqiiKAXfvhpJ/nGVVZBTOWFV0XsyWdCZA5vH98BE/7AmnIPKg/T5JU
-/e5YTt505kOqPA8KYaRd2GlGJn4Ondaz4zgdNlN0SkpC5id6ezo08+/2fQte+ZfA7pNSj07ARVHg
-+XzGtmySoKrPWGZx7dkCZsJ16PP84DfA05228FxbDERlWQWMZNDNSeyJfgrX201LTV6zDZgHe7V5
-0QxBOgJO1znXEvckM14+w6IokDwf/9yfbXsQeJAAQSeY86nRejsi8YKGF0V5kCHaVlXuMvz2+x/4
-29/+FvTjz58svK0mO9Y0q/aTu65Hnjs0zUlRZ56eLBektSWnOb322Wa53x94e3tV9RNLA74knrxM
-+cn7Jjg5DAMulwvSNMXH+wfKqlTbpwhMrYeoTiBUvl/QZZJDxARjCItuOqTPdpAJlXX//Y9/KJOL
-15bn4u5jdd/zsqIqS01Ref8fHx/45ZdfVL02m3KMmQjNPE5NLR2BgOVs24YfP97xyy/f9dqp+rSq
-Tm4IMSapdLCHVWgKVhJZjGkipBnKodkdsG1SKcHu6qqcJgl+hNOZFm9lUWAYRziXmRIpV0n3+/s7
-/v73vx06Knz+r68vanfPNVuVJdquk9Q59/jt99/x9vamknNiTdZUg+vADpShnPx2e+DXX+PzL8sS
-27ppt4OHxLIsaOoamXN4f/+h4qR//vMvvL6+Hmp8i39IK3nV098CtWma4uPjAy8vLxo0qrLEsi64
-XsU23M1m2o8VyBQ+x7rt+Py8Kjpv/dFlkZUB/ZwOZYC2Gjbp0d7vN0VRrYjEAiRRMLOYm5VT6uXl
-BT73yAJ/XUC67QAokesstEtyvRcF7yLivx0AM0tisRzrLE2Auj448J4vZxRFoToJy9GnSIc22uu6
-YUljej+OA7quDfxur4gy68+27XS4CkuLx/V6QOd5HZYOHU8Ah3Vbf6rz+L5GM8uBz4/PnaIuOvHa
-dxy177HWJMvQmrRqgNt2TGN/mPyUqTlndgD95KSnD+N8GNwicxKE/EMtvQuALSfqDKNIhX3ucLs/
-sG2rHhTX2101AkUInrynqpIAKwq52tC3U8F2QqYkLj3Cv7BlmzUesd2mWILCeChk2jYUyvHtUEJZ
-KvBvv/+u8ykKnyvXwe5N+25YEpJfIG3t5QCME5inj8Lj+dSuR547uLLwaNdVQTu+XDHNzAPqWKqW
-2+IA3PzcfOmX6MQBBnXdBAOOVfXJtu6z3upH89EFbfvE9+/f0HbdwZU1puDRY0BkwZtaP9t+McEz
-a39t6Z1WJcg2IO+rKkvMQQjkMqfKu7Z9hsk3cYoNBUkE7uJCyBWM25RFKKdWXVXB2nsF4IKcOlqK
-83eYLsahHBEITBIcHJv54lnL871xQVufO/otZlkalHOZtg/7IFDJUvHhZwAh9iOjukY11ByV3vyz
-1Xbhc8Uc+N7HadbgxO4Hs7/oiZAoBnA6iWNOUVaaDUYwrURdVUgzh6oKa3mVcoB6BF2bQQtRFF7p
-xTtk07NWJzGMAY7ZrTWIjYKy3HR0oujJ57OuKYKhEoCTn1qEbKM3tZiPtF2vhiA2cFqbcn3WSEJn
-KrY8qYBlV83yP1juu2fbHSSVdN+hqWKahtosTX5KL8jg2/ddI7IVLTBSSstKuOj00+P0IerNLYNN
-DSqKQk/VwucHQs7XwSPP5xNzAPCinXN2GLzAkob//f64BxpqqSAV/e1Yy4oD66c+wL5/6mfWdY00
-zXBqGmzbiq6nuWZ7iNqWrlsWcXYeAcW261D4XFNHEpS8z9VPcZ7jadF1UgtXVS3OSOHZTkZAY3EA
-uuNwM1G9xtQR8Ni2SCSZZ+GKc9ITg7fy94dYAxOUEtJMeujKsEZlyUCyCjeWBaW+/pERXEK5tqWh
-dIOkJRZZmpYgBfzzn38Gfn+NcVx+AlqtgetkRE3TNGHfN6WXF4XH45EdAFob3OK8xU0di59PwdP4
-rOdlVRJOtON2gcUaO17EKpqmhssLNfzg95D5GklPqWJHXdehbZ8KilJEtCzrof1HA1XiD9u2wZHg
-ot7+ppfvc/rJL5jDTdtBopS72oXOGXk8EZ/PFt+/vyl4xtSXRpfWStwqtBh5mdo45w/e9NY7UNP2
-ID4Rn7kquAItZrGm6uM2z5nRoyeHsUkMPIWmuokuYqbtzDDUAjt4JBzNQdxPPAWWOPM8qf8A0+D7
-/aHZCp/pNI3qf2c7Mnw+lOLOYTNwQCafrZxm5ZfTn3MKRXhFZNu6GXkvzyBLU7jc4+Pjh3RedPxY
-Ehh0j8NwUOF6bEZvkGqKvavjkWzU5/MRvufoDmx9Irp+gDMDWMVIc/mJ+MKMTIZqbsjzMmycO5Lk
-fMCb7vc75nnG+Xw6TCBi4KFxCgfTMNuhyQj3DD0AmCEQeSe4TJZsFGVlcK7UzJL2e5ansa4r7vfr
-IRummQj3mkwGGqL0OrgQsZQjmLzv80//3ZL+qqqMcmCbhrOunWYREVTBB4C9Ti5CRk9uRiKnZFtx
-Qq0M+XQKjLEWt1N2483flffPDcPJK4pIV5XxoxMDxSi3TELP1B3kuNYEkmnxvmeK2M9BvMMa1078
-4aIvC49/BD1/HfCBZVnx+fmB0+mMuorDSPjCv7ZI44y5aCBB1p7NWqxAxWoUWNfaIRDWMo0cAuli
-IFC0oQM67YDSNE2xJLOq+5ittW0r/g9ViS5NMQzRzpoppDgWJeofIBbU8RSyAYveksu6oG07FTcJ
-0OXD1KD+wLiMWov1MHTFUpG/KhmZNYisHZrm0gaNa4bZ3fl8xr5t4hZ0veosvc3o/RnU6bdg260M
-pmUpXQ+xz5MyxBcF1q0NqkAxkBVVqhwayyqEHlrhUfzE+6P/AWcLAFI6SJm7aqbLbIs8D87cELFP
-DZfJxOUxrBuLKRXeSwZghw/ak8tO5rEIJwGKOJ7pOKpJUvwCRTEjzwdtfz2CYo9ur7yJ+/2O0+kU
-ZqmJFr4sCh2QwEkq0gVwurn/+udfeHl90YxCRi6neDEuwEztv9ajDBSSom4HCbE13+TzmecZHYCm
-adD3vZqjrOuqQNKO/RBsyHug5j62GpeD3Rmzh+fzib4flDUozkepMbxcD2CmGKPgCzAbx3R3/aBW
-U8J3eChAKhbRnOE4HdxphHX20K6OqMhSnS67mwGxLK8o2aYzDTnwwzDi5UV8GVzmtHTM89gpkpbp
-dKAMW/amLRGpg7DdIt53kiRwmWSf9PkT1eCupSb9A6g1WZcRWTYFsZJXVV1sN0Ml7MyM6qpS/Uca
-XJApNOPkp2Vd1IVaMKJcB4MO26iuS1maHMBEAYK9Blw793DfYbo8TjsVTOmjI3CNcRxxv9/Epm+V
-ISWWX0JMxUU0/YjK26mjFH7M4UPkBJgP4hFbbwtfuzNUz1WBHh3mkOd6StrZdEmSoKkrLCutnyMI
-s267zg+YMKEMi04MNUYVKPncY56mA4JvdfBc2HYTWgziK4JuT18rG+ULFsrpFowtS0VjbZvIcrm/
-ljwRb0nRNLVKUtkqskxLzoS30lFeM7kNbdsFzoK0UUWVuCjmcAt95qY5HWbqEVS6XC7wuUNZ1ehV
-p5EpRZyGI/xeDryoKxn+4nKHx2PQuY4kxHBsFzEIps1MnS1Zy2akYpDRKknLIuzRH284UITr+hTY
-jZVmqUAJn8dx34/HzVhylcrQpLeE7RiRmSdZ36yZK9cvW6CPZ6sHHFN/Aujx72fZzKFcdm4+6EBs
-MGc2/XxOB/NSUoDHfVJmKolFuTE0mYMIiwe1Have94OYgtJg0Tq8pGmKwURYPhB+uaC/ndEKrNoi
-2znUMRAg7LSao6trFlhYucpI7/c7bvdHHEAZggNLjjYstnmehFvfNMi9vBjq59MsVcdh27n4V4w5
-K3CyFFNrN0ZugRhOiuqRtTX76lkm4GldlBiUwJKEfjUOBhlfTzkGChmdVaAsT1jXOSi6loMpqr12
-Bs15jtx3y70/nYRI4s3EGLLgmFLbGtbKTOdlRTIO8IU3bU7RjGRB0huNZIKyUh2DZzPhJvjc3W5B
-3GTLCHdI563PgXWfPnY+Uvz2j3/g8nJBVdWHZ8N1FAeNCPGGpZHFZOigy4wsy1IdypqGMkRS8EUy
-ylLGiQEdXCjbmOWtq2zuLJQLfO+BH4c6eG4suv5SpMGDgXiIHXrKjg/dnKjPoOCOGfBR1hwVjmz1
-Ub3piwrz8tTMl4d5lmVwBDwW4zTKhcQXbJFlKyqxP8eXer3efjL6/Ooqa80srIEHiTTclCQbUQBj
-qb6kWI5hgEUU8WxqxiG/12OeG62NbTtN56av28EnkKgp/05SdKemqJx+MwVuAyXE4lt/PURjCoq4
-2G1bz3ZL7Kiptr0JLdlTtSiim65rcb8/0TQiKvK5xxpMW63Dzel0kv5zWQv7q6gwzY8DiEjnYLrU
-dF0ceMET6PF44H5/4JdffjlYvTVNfWjZRVPT4xhqMtDEjrpUghbfoxirLgeWGzf75+c1DMTIzKCa
-kKG8XHA6nYPg6BFnHIR3Q2+9aewDntHo7EIC3eu6HrgREXBbDP8+zkHo+h73x/0AhNrOyjjN2Pb2
-gE3Qk5HXbYMPZw9wFgU9FrnxibEQBCTGVpUyanwYuoP4LkrpvR5cbfvE89mpgI7ZcBtGtznn4Gxq
-LvVHbIGwjcAW3mpcX+wUFT5AOrlYE08yx65hehAjo3NORx6rXvyLVzrTRdbSVsOtJhvG/825HKem
-DhqFBbfbVfvDtNY+1lS7ahFsGWDTzCxL0TQnNLWUF7f7Q+o2M6xExyzxZMkjJ+B2u6LvC3z//k3b
-ilmaIEszXYiWzLQHq7E8F5fmYRhwPp/Vnef19UVFRxwqaVtcVio6jT2ez1YBR56gbN9mUxQWMbOL
-I87W4OoTx8AT5I3gbzSgZKvR+yIE40xLS3GpifMI6dXQhyEd9DMgW3MMzL5tWwMOkuicClkDQivO
-fYEs6/Dx8SEDRk4nsd4KaD0PEQse2vVu02GrarRTrLwvFNGnJJolHAE6OmUzSBLbmqZJcJi6Pvgh
-cu3ZQ+2r1Prj4xOXywXDMOJ0avSz2ZngoWIPWnkHkQtS1w3u96cGWjt1W0lvX6m5bdvicrkgSzMs
-WNX+2k4EspxkBg4aFPJl78FJhVkCnXoo8iDCas00Se+0rMOmbnBqGk05rU8eBySw9cWUmGVCUZSY
-5zVYhcvoZdsP5axCm3pZVFlqwE3Te6Zdn9cr6rr5Msl3AxCxAo6/8l6kpJfzWX3hSEBidNdTZJwU
-E6DvwbFcgEpWfVGogpILiKXKvm/qmWcHX349haLqcvkC/K4/ZW9U4bGDMBvzCVqjM5hzTFZZeDyf
-Lqj8WizLTdtods3Z2RTkV+z7jrqq8HhGHMR7r0GiHwY821Z9JOiDMAacJnpTxpNc2nITpinqA74a
-sHxVJxK/ii1NYbayBRjbu6sCmwwezHL4nCzQbFV+5ITweqRjIKA37cNs2m8zFErgl2VGXddY1/Rw
-MDdNoyPv7RwFgusuKoUInlQKKpDkw8XJ3qMl29hgEF2BZ6NDFzSVclqmytw8TN9sLWjT43GaAnjk
-dGCEZTqRw02fwGfbKWmiLEv5Dpcr8KW1PY7ZxsfHhwzwLMpDNOYDn6YZS7oeWnP3+01bWWpH7QzZ
-JFB7ZQJzhXnq8fHxGYZvbqpXt0YU7GmTCJXnk7LwGDCHcQy2WO4w8MQOA2HvvQ+KQctKjIHr2KK0
-ZhGWebauGxbTIua74nPwuUe/DgfTFNGxFxrg2cmJcxWcptwsH1iPW3/7aRxwPn07UMlfXy5IUoe2
-FTLQ29s3aZGF0e7WvYmnLDcvn6G1GrdtywjMuS/PYDVdokwp3WxFE4xOA8vQOl2xlJTuyXiYibCu
-ycGUl5uU05dFtOS0I1cEl6F1YwkFXevi6fE4ZDbTNOLzehU5tap1ncrPXRF8x3ijy7KiqlIRdHS9
-Ejv4EC2d1d5YtBnaDwDaMIxomgbbtuF2f6hwiGpCuuW8vr7gfGrweLYH+THrabE/jsi5pMnRI57y
-XY635uKcpgn3e7Ta4mZpAwMyuu+kSlm2Mw2ou2edH1NK4HJ5CdOIZVAjwVJr7En8gkIUmTnnfzLT
-oOEpuyZ5LqaQXdcpSj6Og/jFBW65tTi3nP4sTZCE+QXkpdODkNRpzjRg/e9CO46dBCvKoRkFZzpa
-4I3OR1ZbwEPA1qj0ILBrh2Ufy7J1XRV4Y6AhxmNVoMu6wmfybmVq7in8vASf2+2mwVAA5DRYsaWh
-k+PVZanvOwCZli1fN//XrIDu1nT6FX/IDPPcSkCZJlU2fi0voklJbG3yGfJgsfMGHs9n8M4o9NAc
-Qxlg236abYTsS8q1aAqbJKkGDHnmQjWf0hTu/eNDp7vyNBZGX6dRjeDUsmRqkUxZ59eJqJbqKewt
-eWjP5wPzPON0OisDijdaFPlhjJcFFY+TdZaDbtz7IqrcluWn4Rl5XiBNrwe2FcVB6ZcBpmLIIDTM
-OXDr2RmhH53lsPNF0aCELZo8EDUYfQlqMSUvilKBnLZ9aokVDR7CGKfA3ovjtOtgcLoq2ePrZGG2
-GDlrsAv++lE8FUdcdd1oHH8z5RtQhZYqsy3Tz0jTTE1R4lTiI8BrQT3LMOWCFSxC/Bzv94duVH4W
-dfZrqOH3QAbb9x1//vEHXoIybhhGtOE5iH+DD+amTvX159MpmKPU2NZFyU5t22JZCni/KlIuGMNo
-3IWPQzvshkuSRGcXLMuMJffKKIzlUHIwIrEqQjuQl+tShsFU2hK2Za5kzdMBRLZdm7ZtFWvRATpp
-prZvljkJzCHQBvLYf/zH/9zJCnq2XTCzLJGkaVBkOYzBu31ZFjyfbZjNJ4YFfGjHgYeZzoK3qd/z
-+cDb2zekaYr39x8oy0qdWOqqRuYyfH5eg4KqDAi1zIMH9p+UbtShcwIwR2ZbNSFtzGKdK/W6kFHc
-oY63TjfWEVc0/rmiul812naSLt11qVGvgmVY27UHFtbRxyB6KkRHn0KNGy2ZiTpz61tAHX80Zt1V
-F09jlHEcMU2jYjFxuEkWho44FScxq4qU0k215uwc0DCTwYPfSbELNw9PJ7LTxKNOUnFq8H2eH2bt
-cYaBOEB5tF2r0tbX19fgDdDj8bijLCu8vb0iTTPcblf1aEAgbbVtq9dvS1SWunxuLJmaug4uVTCO
-zOu/sCHbAvV6EHelIjr3tl2r921r7iRJ9UA8qmGz8P0OhS8wjIMBLhd9nsw+hbGYHHwoxDG5wbLM
-QTi3qmAvDg1JA3gYuTHJ/fb7Ps0LmrrCQO//VNoa8zyhbTvVv7NOfH2RyUGcMW8jPNM9ors/fvzA
-v//7v2uq8/r6im1b8f7+gZfLBTuEVca5Z5Z3fTqd8OPHD7y9vR3qTpmyKiafFnuIPvAxIH18fODt
-7e2gNZehHq3R4cvvcNKQ5btfr1e8vr5qGTAbW2YL7nifqzXz7X5Xrf7j/sTr24si3ZRZ22zGLk67
-CaZpQtu2+B///u/aY2fJMZsJP01dhdRwO2AkaZrier3qwNY4tiyWbtbZ12o6uEg/Pz/x+vqqGoz5
-C6/CeuuL+5P0zdlqbZ9PNGGQyr9C34ntfIZBrza4SxfljtOp0RKhrioU5QW321+YphGnpkFZSe1L
-7MTOd3w+Hqib5qdMRNx8Kjyfj58Gb9ANel5WvL+/4+3t7XCiM2vj763riqaptZVq5fVcf2Iykisu
-EudPxmy38DnKqsb//b//N6D4NZ7PFr/88t1QyKU9OIzTAU/hcyR2wvfZPp/4/v07HsHkxLItAcBx
-019vd/R9j8vlgqpqtLaxeu+mkQsqqxpJkmNdn0aS6w5tNEveIFghqqUWZZBg7thRFDWAzgB61mcN
-yDKnUU5ntgVvdXuyW/Se+nAGAmuX/NU+yfoTML0qy0LrU9u3JYuObTi+ONkoV508a0lO27YGiSj1
-DKL1Xr9oA76OgiYaPk2TTGoKYFUenJWI/pZlcQCcrFTbBjcdpx3UkFys/8qWiwGNs+UZvNc1+6nP
-zZ9nK64Jm43ZDi247iEoCkchgpTTNGPCrNjEV0LSui4HO++u77FjVwu3cZoxzXcN/oIHedyCPoE4
-TDxRJySJUL27/tN45MvQl74f8N///Q98+/YGH6ZG0TSF+EC0hJsUCCQFl0GRJZec+onyQpq6wrPt
-NEiQkSr1/Yx5eQQMK8WpaVREx5JsDwmxlOLpoQMnEn6nWAeDOPUp0s1xOm59WRa4ZRGkVFh8p9A/
-HrXG5A9S5kqnk33rvgyOHA+tl9QM4WSUJEj18Sn9+T///CdOp5M5lVbtzSdJIgNEQokg6WyhqSRP
-Qp4iTNO34D3PDe0NpkAlldV45+GkEuIMlXlVCEobgOTgN0jEldr2SCIRk8g4508AmH4Y4IsiIMeB
-wmkWJUFIKzeldJQb1g5ykA0sL14ARZkqy2m5dMLhzHmO3SKISRrxviPMTJTgbN8le9oSXNLDyDfr
-BG1baBRInU4NtnXDSkPWaURVVwrM2qGvFuylLiBJU4zj9FOrkP9Okhclu3zOUfItxibXzyvSLP1J
-iGVPR7FHn0JWuil99/v3N1wuL6Ek6oO2JcrRrW+ilX1XVam28tFMZdN1Iy7Qlo2YHcrPyGcRK/2q
-PqF8tjrAVP0qtk07LV9NR9mVmCbBBshDIAZh5xns+47UuRxVVemH5yYSk8nGqb0+tCM4yotDEtkf
-jidanGCyrit+/Pihc/SskolZgzi2LD+9rHXblanG1Imbre97dKFWTpVVOGtWUJbiJGv5z5aTr2aL
-4fNpMrpuO+732yHVt78XhRjHBcFpuhy3TsdZAm08GcST3usmsK1QO4SUcwycy3TAictcSHVHdSDy
-uYNjOyr44lPnbqWuNAGNWU4Z3umR32GHoc7zopkXXY6tmIpqTQYZMu0oMrLybG7Qy/mMsizUsZlE
-H7oJP5/toWWZZe4g/Y1DYJ3Kzu1kITG47VFWJS6XC87n02HoDdczr+lyueAcphaJv3+JtzBZpyxP
-B/SfTDy7RtmKnOcFj8dTXajpv2cZtELr7UwJhIMk/Xa7KmYhdnI3Q2mfD9dCDEls2rYwtLaVwzaU
-mKRuq3Q87I0D5Vi90KpSFWRWz82UegjOP/SAiyOSJv3/Nn3nQtp3hCmuhf4u7YjeXl+lregLVTnZ
-aE8vAm7651NYgefzSWiiiTDq7gG85EnlvUcXzCj7QRaDdXJhGkgMQLKODkVRqt++de3liWxxEEsb
-js4swGJGZ5VljarsjCXWgmVxGJbxsKj7vg8TZzgBGZqyZwEg6rpZTzzy0ykl7vpPdYO1p54IdyrD
-ghwOarA0zOKL2vdFmYw0WWXwJ9hlTTyHYQwjuoWyPAYBFrM4S0JSv4hhQO4yvL2+qkks3wH5IGzJ
-FUER+vXk9XkQugQSVVmKi461KONAzMezC6rPWTMcOuJeLi9Sjrochd/02uZlxXj9PIC1KqAJOEMc
-1gE1rOGhR9qz+GA+NPOUCUtOMQprVz+rCUqpvn1t2xnLt/wgmLKIIQQ/AAAgAElEQVR4lJWYW5KQ
-cw5rIPHFtYqgkhWeibNtnS5QM6mhZw02TrNuDGqsWdvbIYxpYHxZiiLNOkkCUmPCRcwnkzTFNvQH
-YOJ+vyNNE1wuL4YZmOn8+JfLBS73WOZJnVNInIlEByiTTySZpTnhIoFjmhedAc/R5SRv2GBkCUCU
-cHbGQoyL4n6/4f39E7/88h3ruuF6u+EtjZZVVVXjzz9/N6YqcR79uu2aonPB3R8PpGkSXGbojJyh
-rkr8eP84gJbrtusJamcjdIEpyWyEpJiPz4eeelmW4f3HO85BisyNnOe56v6ZEdgOCPEQGagxw+fi
-28gTh6egdZwi14ODab+ebJRaU436k8OREabxfpZlhi+qQzdnnKZg+W4UroYdKAM2Ntzvd7TtU+t1
-uvyI4/OucxKsiSxxrrquUVcVXO5Vb8H1b6duxdFz0V4tdlicSuHrqkLmHLpbr2uZA3TjcJT5y3DV
-JI4tK2XWRB+MU+QZtJoVs81Mta+bl1VPbhJWvv6Jtd4WZIZH8QwNIiUCDQe0lYYR1hEndxk+Pq+h
-fXUcmWz9y05Ng+v1qoYj7BFnrkCSpDryymoEnMvgMheYhwXW14u2lZYvDD8uJC7i86kJ46qXw89b
-U1GaKwzjdFgU0Ywkx7dvb3h9ufw0YRcAlnlSvkBReIxjNPgovNex6V+ppKfT+dCNyVyOl8tZjTQi
-kWs5DJs8Wqdnx5FaYXY9vR3Pl7NYUmVRpbcsC+gaXfhcrcI42IXZwPpF8h2lyz22bQmj5Eql1RI3
-spwMrgWxPj8DODrwWkm3tFkzJfm0Xa9DZqws3QaQ2+0WMosytJ+Bx6PVE1b+zh9k21zH5N5b3j6D
-yrIuat9u/962rSMommrLU4KX18Om7wc81ShHMj7sEPXhNB02vR1uyoAu+M10yAasJJ9+Cl0vGFVd
-13BVWcq4o/BiCBZZ6aytvXixkdQh9eLj8QzqrdTYHe8HGir/d17WcMrEmXN22qzM/ZPSgHRZPnwx
-wegOhA2e5sIN90rEkDSqx7/9WsMXFcbpfhBlsPVjh5lw0wzjpOIKG/Gvt7ueDl+n8/KlNk0NXxQA
-UhSFpPbDOClXn0w0EZFMCgSu66pRuiwKLOuCLHM4n0+H2rM3zLt/Vbp9FTTZhWlprczGXO4xTbOK
-fXLvkWiqu+q0InYV6rrWqUKbWXT2e2zwaZoTTqdG7dPiXAh3UA9yw0lZ1B0cc21ZKsSXJJCUNqxf
-5gla5uo4jihLH8qy4ECUO2Uq8hmxBZjnhd6PrPXEyIkz5REcDpI1Suitd581+7SAuFX90XGZcSta
-z8XBMMyYvlJ8efgQ2CZdmlgN9THcuyyT9qAGzLIMjm6y0TNu+3r+ayq4GwYYgRXKItfgviqLesQ0
-7Tqa2XriU1giixZK4eUpxUXzbFs82xbrGhaLc8o+/Ko92PddjCXmWeWa8cWsIgJZngeMIU5ZcQf5
-8VcxkGVY8WXyeUT6K6KWPHgr9P1V0+stUJelD5yrMEUox+wDzz9ZQAu4swRvvB5+oXFnqtF83SQo
-2uDMICwL4XhCsFQhAj+MI6bHXYNZ3w+hbo0W3Uyzh6AHkXJvPIyqlhN8PDDZiA1RSTmNoxKQWFqk
-LsO84IC9kKdAMJNmnbxG3cihazAZS3H6G1rXIg67VbPZQHrj5ieLU+7hph0Vmqx8HWpqdSuWLajO
-VcGaXuYULIqtUPdveRq2nqcG56se46DgC/6VLH+s8jJyKLKg+BSXLJbu0zypjL6qKpk98fF5/ekD
-rMSXbQxKP7/SaDnvj+lYEVDZyATLdKqrcgpCe4wofNd1OvSQDz8izvLgWOvboZI2ABCJJw14DESJ
-rutRFE/UdXMYXfbV430YBqX13m43DRDkBezbdrC05sx3RnGyBC2VOXcZljm2WWmR3ratlgZ2s+d5
-PMHuj7t6GpIYxQ2mIpyiwhJ0HF+djARLueF2u+P19eUnBqV122HtG0uJo1GKXYzqyhPKEw61kNM7
-6icoJSe28Xg8Dy43DOg0FbVINYMVA7C8n/mghiODkuPPLD5gefwqSksTAHJKcohrBChrBbvHaVab
-9yKoD5n96cDW8HwpE7aMPz19DUEqBpP1X1p8W3MPBl57D1ZQtaWpll3cyJI5FsZ+3R8wHOJWQ9AG
-HAxXN2O7bKOSrf95obYXTdujiLx6rR01SucOQ1F8+Txo7cfNS4loFQZasl2278D4BRSLfey4gezD
-J388erhF1Jt1lF3YNnqTK872EtV0CRIs27FfO5o00Fp7FYUXEGYYMM1iJMHJQmlwVeYz4kkiL3c1
-qjVxc73fHgoECdaRq2Js2zZ8fn4cQC978oq8ukBdN8ocpKbBPjPBZ1Y1lVzCc7QlBKmkXDz25LXp
-PrGM1KwZtmEZJHT2Y0C5o6TYh9kGo9bb9hmdz+fAJfHhdFswTbNmGZKZpOrFYLM4vlu2ZkkW2oxQ
-x7kMvigwBExGSEDWNCY1gjinY92SZD1I4ilEIo/Cbr77/X7g+8soufUwlUr9+l0GIAvDUrPQEnZ6
-PxYYratScIIgGV+COzefa+FzpYMTMKZxjqP5pDilLEr0+Vrfkk+dJgm6kAbKB63GA/3o7rIZ1xid
-XrNu6gnHKMb6yhcFpo931HWDsqxxv9/QDwPqudEHZlFWLn47yGNZZvx///gNLy8Xcc3xPoy3LkVd
-Nk5mfLQ7ePbzZKLayxcF2rY9eNLbMsECRbE2mw+tLVuHczQXxVHW1ryuG5RFgWfb6si1b9+/YZ7E
-/5+Lfd9z9Sakew/rwK/XU1UVsjQT5uY4HOjUUpJ4SQ2nCW37RJ/GzWgnEX2doDSMIoIpitKkwrNS
-s9nGpFCFhqH2uRFXitOHEXreErQj2p0dCFtZmqHwCQbTiv461coOkLHmFyxH+S5cRixgPhDQqBHg
-qc9yhMxFBm3bV4+j46vg8e/Vx3Hddnifo66rMGZ9PkzAsi5ADLBUgJZlgaY5oa4qXG/XgxFIDOCb
-OmNL2TNrpruEUW/rOgV+wq5dljzPxRIsTVNMs+jOHw9pGdR1dhikwDRx3fYDsYXkkyFciF0wP368
-o++Hwyw9PsijJJbqrmhH1rZPba9ZR2I7hYUtL2vaCQAvLxd8+/amc9+psXeZE+KME0FLbiIqh2Sy
-ZfT+8R4EK7OmmdZdxgKQthzhNVg+uD2JYpsJ2nlY1y0AfvRZyHWw6rqJoefRtckfamXnMq31nHPK
-5HPOYZon/PjxV+iXi5lnlprNV/g4Cs10R7iJisBPkAWWHdyCbPBMEqcDLOycBp6W1obNTlb+66+/
-cD6fo/ErnY8zh2EbA4hawOUe+zCo3ZcFGdkCoyqw0yG1s25YUqfZ8RGcZoiDaQ1VnFmWXG+C//zP
-/8L53KiQzaLr0zSpHwXfjfxTqAU6SzySxWgCop4YaYItWJ/TacrqTcqiQBaGfjKLY1bFk57j4PmH
-bFViZkLlP4lJTe71ObphnJBMs3moW4g69aFlFDe9oLCcpEpSECM7qajjOISBlssh3WHQYB1DW24h
-7qS6MLkZ0jQaN6rrbdfjX/2xTLXCe7i8Qtf9P1wu5+AkLKc39Q92SAcdXSJYlunJOhlPdW4yCwAy
-Rf6qKrTp8dfWUVmWuJzPYlZy/1DHlji2LFU5sLRsKh3RTR9HjqIizZpuQQw0tIKqqko/b1mWsNjy
-AzI9jgsu5zNcXmCZR6WzzssS/O4FB/m8XsO7Lw8Zx3FaUjQ44ffwmc3zruOp60ARJo/gGdaVdWdK
-0wzvH++hW7R9acdtP7np0hAkalGkbKX9WFmWmpLHISWJthOnedESRk72Dedzg5eXV5zPZyX28DsY
-eIgfqGah61BXJZ7PXDGxRTPs8UDbJm5Bl2RmSHyPNMXh5m/qSvkFTdNoJ4gDZJQvMC9o2xYvoSWt
-hKwtEpucbfVxuAL924QxlGgH4I8//tTU5uXlErzinBmuGMEdaRcVyNIMp1ODNnjYc8Fdr0+NxgTw
-LOuMwxGmaTRz3Y6DGQofhTEEPFh7fXxekSTXgxuvTIzxPw0kYfAgFVhaRyGCLueDSQTR3Nhf3dTD
-7XSq1SSEABk3iBXakEBDEY1kH6sGv2ledNiHc5mMjc5zlIFtt64kxcQN6L3gD1k4ebMs1TmG1Pwf
-OR170IWPuoHarsM8X7+Uf8kB1CWxh3oEdnU43TfLsiAnd8FT4lgujeMQgq1T34N9B1xeAGg1UJSG
-5861QQovS0gmAHnoJLAEsziUjrbLMqRprmzLaV4MczRXgG7fd8WCJBjnaE4nscnLaqzrVe+bjEK2
-7fh7zJznedVTnpZ3mZp2rIf3YEtFrk/ibLZU+Aoaei/Y27puuF4/dUYjcTW6ekn5uCneRGOf5D/+
-43/utoYVf/3yMCJ8DPpo6RUH80Uk8IUPwzgyM1v+OOtexRDeBwnrri9K2nsZfrz/QJ4XMqopc0FP
-nYeFRc88KDjGceDn0xld3+kJ6DKHx/OhrS+2mpI0RYIE4zT+Cx+8yOsW9HTGvCzB9y6CQOy1x0GP
-KR6PO7Is14m+7HdTVsw2DdtxxFEsEkwuRTxNUwUEI9MrDSYiSTAI2VVbz+zEAntfSSixZ7789P30
-AyBoaGfZcwNMhvrMkquuKnQaqI89am7A6K+wajuOugHOPHQux/3xOMy453VFVuoaAlyB2+0WNwPv
-Lxiu/PjxgaapzKjsaGlGZ6c0SXALRiQEWKO+JTvY3H0Fwu0fu1fEO2HVTpmMVEvQBsUls8CXkIkm
-gV+hMzPC/uI6oTv2um4KJEpHaNYSmV4K7LwAO7qu17mEfNf8b3aYbgSvMyQ/fvzXblsOjFSsg263
-m6oEqVLKshLbNqmX3uPx0BnwtBVnUPntt9/x/fs39eez6KVMRsnweb0qgYYnEk/59/cP/I9//zum
-ecLj8VRzEdqAaS0TrKCSBKjrRk+Sru1QlIUirBKIlujQE059m3bZCUe///4nvn//pq1C7h/v43BH
-GUfVBopyjvv9rn/3xx9/4m9/+zf1R7CgFFNwK/ckxZcn2O12w8vLy0/26+y7d12POohwSHG2JceP
-H+/4/v2b6hm+moNajoPlNvRhtsE4TrhcLgdFpPoKpFGXTuDQPkPrp0DpLO/VuRyf16ueVn3fKwIe
-uewZ/vzzL7y+vpiW2ao4kJSDYlpzu91U2ccMripL/PHnn7hcLrpGCJYyo0gSwOdebeB4QHATPp8t
-zufzQaU5jkOwiPdo6hpp5vB8PnC9XlUVyUPmfr/j27dvOjglScS3kid8UcgsjKqqBA8KdHCWyl3b
-4du318Po9ljiRT9PAs40jO26Fi5z+O333/H29qYkJckmI+nOsX3Di+dY5qostSalNZjPfRB5DPrF
-cvpEmyO2ffiyCPhVpTj8ECSS8U1DHP6RO+R51OHbFlTX92jb50HDLzW+B1QttejmPzV1GNG9YhgH
-mVYThkAImShGQk40tu1BBgdiFbF+FkSem5mZUlFI4OIkH3YlODuOo8snM8PP3h9fBkk+dqbdV9KI
-BSJFyRnq7nCyMfWLQyLlc3789QMuz1AUL3qv1kuBPXfrceB9gX07jnG3GQQzJGGDugPgxABqrcYI
-3o7jFMo6KNbCYMxOibSpFjwedz1lLeloC179fH5FIRyLl5cXbNsaWozC5LMgrCUcRfWoZb3CuPck
-hs7tjGV5tKMbpwnbNpiBsT7U49FxiQGXlGrrhDyOowaNoqzw8fFxsFTvhx7jVB+CKoVrhc/xeLZ6
-P/QMnAPethhLtyiq20NmKjMgHSMtraKyTFpOO3Y1FhiGAbfbqJpuSw4Rk4czzqcGmSvU54xAFVMv
-C7qx3pZZ9O4wJ94SfexC5hRZpukERiyPoa4bNHWNzOV4tp3KI+u61lFX0zii7wdM06iDLKn4s044
-rMNsKl0UpbCnnAQAOhz3/cdhkfEk4RwA7/PAaoy6d8EahpDmleY714NvnO0kWEqspTL73CPNUhTF
-pLyHvh8MGSbD+XIOLdGL4CohGFlC1DAMSpDJc2Gz9eaebDr8r6zD7WzBI9FlPbSq7Jw9BvN1lVmC
-3ueHNJyuy9a5yA7wiMh9rhOIpmmSCUah5CCBinoW62PJFjSZnNuWHTo4VBuShcfZlefzGdu64Lf/
-91+oagk+0lLPkWbuYBdv+R42i+IamedZW6HExCwoTMpyFCJlBx6LzSitqzFlxGRfns9npTsnSYem
-acQVWOoWr5NLpUVVHF4onVwIbhHp54iprh9Q+CjcICDC0+7H+7v2fkVWWhhTxPRAjrFGEcBuXFPT
-MBSz1ZrVLqhlWXC73w+8dbIR123H0HfaAfC+UAMJIut86WxbSls0MywtYbVNfa8RWrKBFc8wjoky
-1I/Pq57MWRoZYZSF0i0nTTM9+azd1DzPWEL9b0EqOxiTp9YzcOOpMS+81ynMPNG99zg1tbDn+uEQ
-VGjGYvUMz+cTt9uIeV5Q1dWhNPpKoRXAeDBDXqFya1KZv+IBVqBDkdft/jjoQ+hsRL2CFfvwfXz1
-epD5hXkAA29hzeYGxM3DzMAaWdYFt+AMaTofAkr8nkWNWTZDiZ+mEeM4oTk1KIoCTV2j7bqQwYz6
-WdSSMBMehgHX6w1NU2u2xnUo/pqRRflVy6EGqMHLIUszJMmg4HucaJXpXoqEpBxNcwrDYsxId6ZR
-BPs+g922Pc2kxeTDF8pmZ83JsUUSwccDWEL3Fj4w8VLP8Xy2ivjKaZIc0zsTobl4+bJ5vYzMlopL
-IwXWR2VZYgumE23Xo+8jy4zqu23bcLu94/+n6017JLuSLDF7++pLRCTJUo8awuj//xBBgDCD+TCt
-akDVXWSxmJmREeHL29f5YHbs2vWgCBSqm5UZ4f7eXcyOnWUcJ3p6etJxECcDh5ohh01r8+tsICX4
-1kWea/mHCQpsrVHmvn9cVPGIMhHhnZg/47B9DHTAYnAhILvXN0Nzb9OeccDd5bnb0tYKcdjjP6ZA
-DoWyLGiefFILtw6zlPaRVgrzPNPhUEuoB3l++48Vo61icHuBploUpQLOeIbjNKlxC6pIjMRQPblo
-d1Za1lWpXA8c1kg3iuOI9m3Ri8uOEm0lh8+ITYzRI1B4cC7KsqQkLWi53eTvLB5LFFOZ799fKY5j
-quuSXp5fuFURNec8z5RmGd1u90+HkMXOwPJ0GQaRZ5HPAC63u23bKv+AcyrYGRl7cds2xgAAKuGF
-ATCzXu/Q+btRhEN2YYVsyRFWVIMSnvnwpQKF/ABHT42HGCoHBCVqSx4abzVgEs6vblWFHpKEYIF0
-lYcK9RSAP1QS4B/YHtUp5za1/rIjyGEY3LjQlHHcQ05qUnEzNzV/TtIbD1TU0Yx6gAxvW0j7HilB
-ybeJ3kVYlOrzxZx+HBdtNZqm0cWyPQiBHg1IAUrNcyyEmZROpxP1wahmp3bmDxwHseU/Xl/p5cuL
-5hUCcCUKPD+9R899a/2Oag1jO1irPTozqfdfnuuftyNDbKhhGGmSMRhKfLD59njzRER4Nvg8bgMG
-nv+ha00iWY/8Xseh9VqHbduoae4uMi5iXX9ZVkIN5ynFuu2UZ3xBQdAGNSHGgG3b0O16o/PTk6Yu
-oRLAZWdjxwIxDQWYjz0FvMuOeUN7+uOWYsAs9k5DVf+JSw8UgDY6ygJP8F/nYMjMZKRvklePfjrW
-F4+IJStZtbpuSHRxKzats9oehSiBPgkeB3aUk+qYb/Xam7Is6enpTHlR6xzVDHx0AfaSsGv1CrDR
-jiWOuesHdyhuK72+/vhUrsK8I01STybtnl/4SbzTto0GZEJ3AFUlPtMoM3B8ToREoBR1nIDYEEbi
-T/+pqordcvJcrNd6BdBwuINB2vcDh7/UtRhskNjIL+I2tHsXh3VDBu9DGW9ym4PXjyzJNIm9DESk
-UAcB6eEE23o1E92cchM4D9o9ti3rPU79o/QYzxSjRJ9uHOmhClUdzEgsc9UlNbGZKTIheDryRvf7
-1YTgoqUWu7Ys9QxssfmxrqEsZStxfkbWh8NVnCkfyqtLz3b4EjERyMk5wY5KdS5uOdzoq/edRz9F
-kchJtdKvv/5Gz89PdDgcnGyxquh+v+tm6/tBYrVLjdp69Eez1F6UNDbk0c6o2TQhdTLPLGNTDenH
-+ecE+hKsGuty+eDgR3OLDMMHDRK4WRSF52nvwjFCKXnZ+gktR5rE9OPtneq6VrIGK/xcKrCfmjsr
-ucbX0G/euAxceFRYPH/vFWdBdYLfta6JuPNyjPftduP3GAaK2o+jy3Lo+14JWbj5DnWl+MQw9FQU
-+Se9/rz4Go+npyeqqoqWedbUXOslADegYVw9EBEtRJqk6ksBezXwPvjvD2rn1vedSr25l49M5Fek
-LlBWIIaEXPzvqBLw387ZylWKVmNhS/FhGBUwTaW9tNmaUE3y2kDlxJVWPwx0vd1k7p+KeCiW0XWi
-I1g18RSS3aGu2adBWs9hGNUSDWvDqhUxmt3Exuz97Z2KMtcLbt34z8Q24NOJc5hDHppwDZiEoFyd
-55nKMlBWXFWVVFUV1XXNltNSMtVVpRRKXkSJztJxG9jTj0u40AthsMIUoJ3WhBSLMMt4NGhzAdjq
-/ED7HgnpJhUPu1yps4NxLHKRUu52dvHMuaK1QGbTNGE1VlJQ1rRK5QXACc4/A3muzLSsRNs2WZtp
-LtlWSVRiYVOSZhQLddkiyxg3RlFEr68/XF7AyNFaVVno1AXPEN+VGZ+VVnZfv7K5S1VVn7j8uP1s
-6AvGZ7fbTTc/gEsXsMGx1DgM7G0LHYh9lzxSZlLUXay1kHmPYBEGDJ1lmU3KgQVa1/VUVZU3vcLa
-wvjSUrgt4BxHsbL3bAuC8ttWUuu2G6ffSP/3QWTvmG7ZdGsIthhELDSQZNsSz/U5inh83d8Gz7vC
-+idYF6OyKCQIN9KLtaxKOh6ZqwNW7rLMXAFALqqGEjKWA23Qesjjxq6qWmWGc8AmlezAmtO63jXJ
-ZBgGOk4TWxEJWJHnB3p9/eGJfJg8FGoaikV2MZKzBpOgLStoJ30ebmQAPxwRxqQVlL+7IPJ1VVGS
-ZjRI64A+D6KSpu0U57BhpT7wlsi/I32RYRTTNN/VVUZLQnWB2fRmt+iu9TLwcgMjFz5p1Wm2ekN2
-orVqw8+DswxQ+vvtTmVVSlkcCjgbu8joOKGThIlcw0jjvOxoytqsYzGCm2B9BNG+aWSVMY191Njr
-xGbdNGAThJjHDIWiyCkg8eIb+0/WZ1pFmXeKdhIGnlDPYWrAEvRdBTnLunhkLbRTuCiS2OUesNkH
-H0zcEmS0yCQMpqw46DlGnVu4XQD2e9PS5XKhWsRhPLp2PXxAgcqnQZMvC/bhcLJlaYdWHl9/+/am
-nApWfbKnwjRNVJUFY2YWFLKMIi6LHOEEDx9iiFQAM5sW3LYdJfHonZT4QNM00/VyofPTkzyYUD3+
-0dep2WY/fJoxwzXHEmkQnzWKpBMKtT+LcYpCB3Au0n92fU/RNH0yV1zXVcs6FrPMOo77M+ONeV5U
-3YUJyWNYB8JBITRCVQDHG5SvURh9sunGs1/Xjdq28VBiHnulOp6Kooiens6SmJsb7n/EPonSV4OJ
-Cfnyvjsch8vmlfKiVFoyAipwOIOQhYw7bFx4Ntgb9zGVJwgCent7U+6JdbIJg4BmM3K0Y1M8f3bU
-nSQHcfFGlJZYlmaZsWeP1O3KWtYz/2HTdOkgcN8H4zhMZ6zNF/NjNrXEWwyAh1g9WKph6mPXA3/m
-SKpf5trUNVfLACxhggNpsjugY5XPL/NC96al97c3Op6OdDyeVGTH4DQnDg0S77euK1VlIXTk2caD
-r+rIC4VWFEU0a0+2M3ouNEdIZYlmz6hxniPvg76/f6gO+/z0RE/nM2V5TenoYpuxYcZxUsNELPCu
-42gynLpZmqhL8b7vMn/n8RHm7HYzY9FhdAbPABvkaVl21tgCB2El0cq8qF2pCTEJbnTYRyEM9HHs
-ZUUd1iFGzU1k5PXIuLPUXme1xZtFHV+i0EPL7/cbJUmn8/pty9XwM05iut8bShLmsEPnsK7Gv35Z
-aF5WdUq2cmFr+LpFkdrGXy4XjVjHJWG9Ie0/rDitqCxy+d2rHpKP8mkr58X0yB4+jyPSbWOHa1fF
-bjpWXB48Kyw+AeDQsjTtQQ9cQenIIujCz4TZBgOTzr7Nkna4Xa6pKguK4kRFX2VZUp5llGY834dd
-u429w82PgxucgjAM6XQ+i5aBlE7PMfQ73ZuW+r6n0+kknIqYFolKjyFdBNpYloUKdYZhYL+5xCHq
-oMiCLMO+Z7OO2VDK2jRavHCYjsTrpC9q2zYq8px2CY20RCCrBNMTXiSe0xRqqq81C7HeadyHB+qE
-Yo0imKji7MNtxWL7rL7nHhLhEdYQApuhbRnYZOBnFGDLEU8sjRYLxjowoWfGi7bfR0G3eZIDsZVF
-m1M/uUUSGlcaO9JCZFUurVDb9XR7ffWo2vem9cprlM5JHKmkeDativU84PZiFpyiorqqOCrtcqFt
-K/WAfSTwFAUb0URxQuvaakKuu3xCORBcm2DNaiFr/jOCEhKEwLWADgHvDJcGbOLgKYnDE7kRuJQ4
-+8A3ScHzGUyKEUJQnJR4NxeHs6GPIha50TR51eo4TZo7gPh06zGBwx7Sc2BQbozNGFHb3j0rOXaV
-5vTry/WmJjd1XXMwyLpuWjbxuIzHLBjpIe3GOqDiIdpNhVEP/PJmKaVAPwR6Cq69IuKS7msViI5n
-EDlLo2lib75pVgBHqbuU0zCOak6yLLvh7+dqKwVr7wWL/954uXEWiQWJAj3o/d7oHN0RUTLtB2GI
-ChDL8d1DVe3BRu1xpr6uGy2ipGO76kYO2eDB+CLTWwqVA3j5+Ls296BpGpUYs4lKo+0Tekho6K3s
-F6Dd6+t3+stf/jdKkoQulwtVVaVpPI8j1jzPKM9LmqfR+/eWyIIKM8s4DIaFYKFiHAzM5jSo07Dj
-kljji0f5rL2tNUJrHLSFdc9sV0q7HfnZywNrAG0SDD9ADS44tBgAACAASURBVEdFCaotDjN7efG4
-fDe+EL4f4GOVYcNt/Ti00DOizbOUZllbGP2hxYGBjPVphEdDVZUUJzUliQ+KxnmW0rLkSnPFh0BE
-NXL4lA4pHxzKOB6phGoPxZxvP4657wdx79lMFHLisZvWlRRjOB6PWkUEQUA/3t6V+LEZthb3nO7W
-zNKE4iSmuWkUZXeuRUwSYjNSuM3OejtAYmsXEwxPApEUAzHGyBG3P8tjjxRGzshjk81sc/+s95tN
-G3bx0YExFY30lsahwWlDMjcPI7rdV73FASihVePQTP5O4NEjpBR02CRJNJ/Bthd/+9t/0NPTmY7H
-I6VprpLmw+Gg4JETuzjef9t2+p6LoqRKAkbsP9j8uRwAkHJjMsMhGxktbWc8GGcVnvH8mpF2TKDc
-JGVUdio89ebZ+R0mMYNxGP3ypdR9unRsiIkLVyXPCIQlyplMcnzffzBMg2DxDiisdeskhX8PKvlj
-e9i2DZUyvoP6UpWrxn0LICY0HVEU0fV6pWEY6Xw+C67wrnR8BPUE//Zv/23nUUzPMVJZqtrxvh9U
-LAEtNXpUNjishCjBaLstw4PA6ead86wtoSLV+9tZeNf1Okvn2zSSyoF7GKgN4Q4Dog4YfTzHDTRX
-blU7Lf6zNmiCgZJUrMNuhJzEKAyoaTvxpou1BOUDZ/N6TjX4SFOaZMOnwoBzn5E/bxQhv07syGT2
-z71zTmVZsNAj5ANn3zZKs5wul4vmNUCzzmVm7GkQVskRYDux3pTHzmeOM/k2Oh4OtG6rjupQ1ez7
-Tt+/fafnl2d6enqmtm01k34YXGTX7Xb7JP1FeT+Ok8S3Z1LCL14/i2fFvoR843Os+l0Ulq7CcWrJ
-jaqylEO8Nx6QbmL08X6hOOH2om1bqusDlUVOmRCaLIBrDw5L0OJLzmER8BLAGuKIt1meN6qwx4M9
-kGlEqLyBVC4gHMD8sxdtSZCcXBYlTfOkVl8Ig8W6t/6cFh8C5wVMUvg8gBAGxi32tAK6f/zxtx2n
-TmYcdFFSdl1P//Ivf6FpHMV4YfS0xXnOL7ksOR8dckv0RE3T0NPTk3qtgc47TrM6+jw65B4PBwqj
-mG63K91udzqdjtLvH2ieR5UR294Lm82GlURRSF+/fqPz+axWTdZIcxiYx82kHDa1RGpREHCgxf1+
-p6ens45GYZFuLZ2AYwxi3f329kHPz0+U5zldrzc6Hg8eeGT9BjjWuZcwU+avY9QGujFixvDnrTJu
-nieqq0qz7h/xhcvlQs/Pz0JeWqjrWsoytiNDkCfaorvwGLZto+fnZ4qiiv7jP/6NzuczlQWPN+/3
-m3dgO8do/vlod+AK/e37Kz09PX3itKNHh/szSmt85kK087fbnc7nM+37TufTkdZ1Ewnupq2k1Wlw
-5t+B/vrXf6fT6UQBEb28MO/e9uuPiUOggWNtwevvcrnwzzGWeUnC8vbZMg8fxFTwH2zbjsoyV84H
-ql9MGUD3LYqCDgcevf71r/8vVVVJp9OZrtcbvbzw+4P2xFYpbduoYvLj40OEQrnuqff3D/o//+v/
-oepYVDRpmnJbWhQ5xVFsnGzdogCFchgGen//UHYcCCBZmggxo1PjSgsO8WkYarbZvhONs4uGQh8z
-L/7Du95uOtrCIs8yNhvJs1T7b9zO6IWxmKDkA0vOllzwh3PjLtePFbKhh36g0/lEeZZR2zQs+zU9
-L9BeZK0jgy2XEvx8PrHaK03F8stlzC/LzJFMJrmX3YtiiuKEZnH8wecbx8m41TJOsxnSB9oNou0T
-X9+OjhzCLoESEoQJsorlwIPGncSjYhBd3+vh+jiVAOFkUADLn9/bRYv/RqYeI/a9xmEVRak26ojn
-htYCASjWBt4CxhCtBUFIX758kcM9UH28NfS0ZCRIkYEtOD0+9+Bu08aa2hRFITXtSGWRU57l1EjL
-gmeYpgkVRU7bumkSVBg6NijnUUZ6kRQyDr3fb+LzV0jLuamfpj2YbCAosKi6rihNM3p7e9Pnge+W
-55l6X0LDEUUhxRwbPXyyPbJpqvO8SBwUu8pCibbtO41D79kcY0MhIGTfN817v16vciq2Gr6ASuNR
-bAMgbhxHprXK7XdvWrMBgcKG3gjOBoPgZwJlR6w0QDLm7rMTLysde0ozTktOs4wm+W6QmQLVj6JQ
-Z9D22SHngIHTzJOYgr8Nj3ubhMQ92vZJRcYONJyInOeZx09w72qh2+2VAdMs101s2W2WiIMAyWEc
-xSU59lxi8OwHY2NmPRAtecd+D3gJ4KYbH9Shj8KzcXJJQwDZ7LqDmAgtShiG9Pb2ptqSSfr5oshp
-F508/8xRE6+n6UbbFnt8fgvAPY5nUb0MGo0207alypC9XK5a6gNcddZxkQayZFnO1d0wUBRHNE5E
-Ybjqd4BzLyrSYRxpE83F8Xiksigoywv6449venldLh8COLp0KYD3KsxLYvr555+ZqVsUFAgIOE+T
-5FaEVBY5tzZRzGpAO3d/fCAAxuyCA8NsmmZaHh4sIqxb435igbOicF8a82O7+R2hg1QJCOApinix
-PfL6LUKLUd3tdpODIlbAMo4T+n555flzWdI///lVQcDz05kWyeura/Ym3LbdmKVmHiXWmjRgJDOo
-IIkty7ftTtfrVQ+7oijper0KXTilvr95kmsGeVaPmxBFPK758vJCYRTS5XLVgA3ekKCz5hqEwoxI
-8PEXwVZaNVWxmXib2ZQYB3M71+t78bEdFxwShYEnFsPvv1yu1DYtVaIpsBsNPwMx59ZaHsExcRTT
-7X6jy3URQ43FM2hBiq5zXprFVyBjc8yPD5mLMw/l559/ojiOhUcQ6SHeto3yQexYNIkj2uTz4LBB
-hB2qDtjA2XxJZC1gcjQMA/V9T09PZ+8ZpGnKY7n6wK4/faffEVXGMI7UCfgKWrV6WAjBSG3ml5W2
-bfY0GjDo2fadZjNexOUexyxTj29ioIE5uS0heZHsugCmadcXFlDgzUF//PihC71tG0aBq5IWYT+h
-auCHV9I8j5Smmc5FIZ9EP4MNjnBQlInbtlHfd56Xu1WKJXFMd4kXY4vqiIjcDBsjkHmeaZy4uvjy
-5QulSaq5bGEY0sfloj6GznHGjXdUqy4JwRYstXpr5laUFMc8U8YGLWRGbduTefGDPcCpOJ/Ya3Db
-dhWgpEmqL3XfiV5ff1BdlzqHfwx2KYrSMArdGOt+7xWo7dqODseDgF7ynaWFsso5R7vdTAUzeIYf
-h+OBnp/OdLnevb9jPQDAaGPJ9WQ4EKswL1MtY3HA1HXF9O60oHH8pocHVzF8w23bSufTUcEuXE6M
-/Keqf+ASPPFyAOAkHMcOsASbsB8GHXdySzp4HBI8bxzOWcZkp6qqaRg65ZCg/YmihNr2qsw9x+u3
-sWC7trS4eJMko8vlu5cibR2rMcK93b7xaHddvHezritt4k8ZQwmWZ6kktzrnUYQbWmtrJNNaRxrX
-x7IKbdtWqquKivJIbdOpwi5JEvrjj6/Kzw+C1ltcLLhJlavNwNlC80MIhHP6ib2ydBf+Nh5MEsfU
-zA2VknGAW4ZpooW+rDw/0b7PFMU8QnTKw53SJFEGYZqmNEspDXkwV0Shjk6x2dBy5HmmVtR3ibTm
-1KHC87B/XEg2F6BpW+rkhTn14qyHD8u02bI7jEIPII2imD4+PqiuueqJo1h56VikGJOdn87c0xYl
-HY+zKA8nnj3L7YvPaA1SWWCVKlsOlV6cFER01/bndrvrGAqbGov/sVXAtCUKI2Xc4XexOUmjbrc7
-cdoN7M/r+kBFeXSyceFCoNcOArA4RVabpEr1jeOIdtr1MOr6gacI66AVkq854GeH9wOfCvhY8ufe
-6H5vjBFpwBJrmbDMM6+vv/3tP+h8PtHpdDLeAhH7PAgjF+NrjE5tWrFNh8LIdZkX/X4WZ1PujuNN
-F5rdjpMaaDoQdDU9lLmxTWc5Hk8irinEjiqhdR2p7Vqd65dFLgakH1RVtRed7ND7WHrvRRhdo04W
-7LgGbYINoYTwBe7BLN4ZKcszPcHRO217R2XBh8A8NXIDLR7bMU1i6kXAhN/P4E2oJeD5fNToaxxC
-EBwVeU5d19HH5aK3jXW4scEh6DGXZSVUZSj/VgGSQIgZNBAz1ISl0/lE5xN71wdBZzznF6nMMnW/
-xUaxSbVJzDcjTxc6BYDHoaM8izyPP4xdy7L0xlGsbst13HS/36lpWpkC8YIE2OryGmcdK+OdQZAU
-xxGNJkqMmXS78ueLgidP6InRe/N7ejehNqHn0TAMo0e4+bhcVB8BUZXDbpiC7Pz/mYoLfkYcx7TK
-n8WGhFw7TTOa55aGYaC2aelwPFCSxNKiTR6IGYYhvbw80fF4ouPxQB8fF70AWeuyfMqBDEWF+Aiw
-Wl0EuB/zPCnhD4D/tm0sB56XVeOzrYXUvDh/fZhbIu5o38lbEIgXg/mlzYDjh5FSIAkqT0/PdDw+
-0Tz1CgTt+y4WX6v8jkB6+ljLa+s6y+Vro23FrkGPpFwAa+v0iG9wRmGj828LYKkl2cZJM8fTSQ1S
-lI8tgOC6rhQLoGWzCpHvB7IIxqVR6DICMVK83e50PB4oSWqVOvNCy7SFKPJckXhlm0XOxjrGRGK9
-6vtANNb5fGYcJcko7Hu63+/eoYZEHWu5lefM3Bynkaa58IxIeWSaqUEqLM/++fvvdDqf9Ta21RoO
-rbLIKRG2JsDU9/cPxW8slsROyy2tG2TIuZdXqMlG2+7x8fOMWXnrtguj80R1lepNahOuUXh0XWsc
-rlLdIK+vb/Tzzy+UJAcVS0VhpBZpvinqJozAxatW0ySlsuKWGF4YaCXg3RjHkW7+JDlQHDee8xbz
-SBINVmEAPdQcT8vGtYcBxp/c+uxaRbA+YmIMAHNObASAQ0kceUGOaZJSHw5KNbTRUChHrTedRVuR
-L4DRW9/dKM0KmudWudbQds9yM12vV8eii2Lqupvq662oxpbsMJnI84ySBxoqbug0Tb1NYA8R++dx
-6loKKDZgmjFn/eNyUYMJ8NY5bTeVm4epzLHwyjEuto48dV3qpoGdV1nkukE53ZbHjKoajGBiMnoO
-StfrldZ1U7oryExdP9DatJ5BJWsqbJjLqhOBgHw/OuugpJJf0LPlcDg/PdHpeFCm4ONtFIYhzctK
-0/2us3s++DNxiSpp31jdZpF/UHHtAWUTeYOAqJTw1ziOaFlXRebzvJBoNHdIW+MQKAKR28eKQBf1
-VhQZnU5nwbMW6oeBBlHvYSTq2Y7LwYZSe9tWakSxaY1RkyThRJ9I2iqZnDRNS0HQ6UWAvwMeAV8o
-u4d9Oa3E7rXEeGZ4jrzPEs8aLj4ej1SVzD4CIIX+LpHeAYfAKDPIKAwozjOaJidw+PXX3+n5+Uwv
-Ly8qUcUH1MguKdG3MFQbcABzQMnHoVf7IhVghIEEdHJJBk9BHWtlqb7wr1+/0eFQKzX1cdyD74je
-N8v4MHDCCWaSWVooNhhwh3meqW0bA9iwdHYYRn1JccyHVtM0VIkbL8pb9Go4gPI8p6qqiCikJBl0
-AQ3mluHFOmnpZ6O5bVmIMSBKcSTwEDlyEErXPC9pXRsRwCyetwA2AH6HndSoW42M7bDY4G0fBBEN
-w7sGftj0Ziy+6+VKlQiswLbbt4X++PqNHW+NYSpuSCT48PoYVBeBagr05rbtdA0hUi2RQBh3qK9a
-zSUJz+yLolSNCw61w+Hg3JSHxhzwifd9HoNWHL8k8BKH4XgEjwYrQkOli4sA2JmlXMP/IkkSGnQM
-uxhNyfogjuLL+fX1h2phbEx6DDcXlN9M6kiVNGNBAywE+L4BuY7jiM6nIz0/c2kPzKAscs+aKQwj
-ipOYprmlv//9V6qrio6ng2xm3kzzsupMvxQueWjklUmSSO9JanYwTpv2gXCySdNEXYh8S7OQbjcm
-YRRFLj4BbtTJ1NGC7ve7N7rC34WFVlWVKkyal5XCcfwUCNp1HU3jLL1XrgYh07TrDYcTHONB25uy
-jmD95A4LZ1eblWil0GnK5pOL6BAu15vOna1as+87xSzQtuCgQmlpfQRtS9U0dy+zD8+5aRp1rgUK
-DgNUa2SSZqk6Mn1/fVUAFcaxaJXYIHWjvp89z4Msy2kcB280iU3DrarLIJiXhQZ5PxZ0Bv6EZz5P
-k1rdp6lTD0ItiQvg9fWV6rqiJMmNtVnySfbN686xJVFl2cpOcw4WRzfHpZtLOE+R54IjcTW0GPUi
-BHxcPTREtKsnACq7OGbuyZP4Co5DT4us0xg3O3zUVHUlriZJ4ju5Wulk0zRCbsno/HSmuj6oh1+W
-JpTlBRF9qCNK1/cUDOxDV5YljdNIcfxMXdfRumZaksFdh3UAPd2bRi2WMIpj0kOqnvhN2yqXnzX8
-pYwKmeWIWC6X/BvSPC/ag3FPXyoHHTNiaxoJUVQQBDSNIxOhZGGhpGWzilH7ycOxFjVWLVRdF1SJ
-hCE7R7cR64+cdZsKxMBg9GlMhr66bVu63a40TSOVZa6It3XogUMRRnjwebSVBMaJ1rwUHHlbEVjf
-PMzq8yylRXrxJI5p3x1xiqPkMsryQsdiO0kWgAhVfry90TRN9PHxIUS0XL0cMc6FpBseCfBiVFGW
-CUeBwhN4jy/IIbo3jZi1xMZKfqCyLHSsu22biqLmZZXnW2r75RKlXAXjqNPkYRcWi7AsRPzvuK2R
-G2jJb05n4zwtEOGHjAJoa8Iw0EsTkw0FW/HBnN2xYzhBkgm2luWY49RLEnYk5ZK70eivTZR9TdOq
-AgzlTJqm9NNPTCs+HL7Q8djwBg0Dz/1l0T6O1UuwpgrDSAMlEQGNh4YSt2laNpvoeq+KgXCGbc1K
-vXnGaVbXFEQ/8YEzeQ49TMZIKY6YReiiythqvOtaHddFYSA360bT2Ht6ACC0sIECD+NR1w6zj8Vw
-BELPiSn6VAZmqZM7c3lb6nO8XK46YrN5eNxycR/ciyNTmqbq3gTcx2EiqxfmAg/FZZnp9fUH5XlO
-379/pzhOaF4+h7hAwbZvjToqo+K4G4INiFnMSGR9RpIkmr+w76T2bbCuS1NHF0+S2Ku2sEFh5mL5
-I70AbUybhvAplcQfPhDwXMIwoqoqHKlrcI6+IBlxhPriJUM/KgLt2sI7dSYljKVxliDvi8C4HuH9
-QxPBNnclxUlGsRCtAKKDIDdNF70I13VlSzBrKAjJJcQmcI7N80wYYqP235jZJ0lCX799174CD2wY
-7jQMvVoyQz9twyX7/kOz5rO0oCiaPzm2JJKOCmsquxl6IQghJISlyZmQPtjaClZPrqzetLREKo87
-dRNvo2UyHrKl3TTN1Eyt01RLfkF7u3GSb1FQUeRs13Rv9PklMSlmgp8HEw2EQljOOnzpoQVAmbmu
-q6bybNtGt9tVuAcp9X0nJp+uf87SVDMQnBOvT4/FXBnWaVpJdK3yKGz+H8IxLQcfbeH5fPLCZp6f
-n9XCCwYyWMDItAfmwdmUkTEPDelQ17QTj9XWdWMNg5T8qDhiLxnHaejhXCVwkq4nO0IGfwQmIEkc
-Udv19P7+zuK3B+UdEdHtftPDBlZb8MeoyoI2MWHp+14NRrDpHyu6x39vJzM43BF7DkKXvSjwfeM4
-Vum8f1E4Q5JNKNaoImIIC97f3ukgqrVF0FYcDkDveVOP+pDGadMse3DB67qmKAwUrT8cDlq+8d9N
-9DScF6J1nXRWafPP0A6gh7NqKzffjZSiG4UBrWb8Mc+LlPiT58Xm8tdinXZAa76uHPEFVxpYSyWy
-enBQIvONKFKRD8p+pY1uG/XDQOfzmTMH8hO17bsCVuDbY56+zIuna3c+jJvnn7Cuq5qrghtQ1weP
-qg2hET5vI4QTmzEPpx9kOtiWo+97nSLYVGxLIWYLNufahCTdIAjpdDpRnpcym2+oLJ9pGP7wSlmb
-sPRoFxbKuBhMOFQq8C9s2laVi5Y9xzLlK5VlpQcI3j2byKTqUYkLBa0gJiD7vtP1dtd3CSrz99dX
-rWIwckZBAzCb13foCdng7WCtxXChqIGOfAZ4DYIubPMKwLko8lxDb1j9l6mzUSLCIlxq1i4cno4M
-fjrBWfA//+f/s0N7fDqdtaRwHzLxONr35q7jPqa8ZoqEHuoDZXlJb2+vWqpD2x5HkbzISAkTzu4o
-0NMJixwPmeWXiSLa7IAaeJpojAn7oVeNNrLTUe46SnCgZT40+k7EtGqPyLr92XM9ciqyUOXHiTix
-4KQF43CWMnnfdyqLkuIkptvtRsMwip99objL8VAroIp3gXEsq8FWSpKYirygfuBgU4y39m1lAVOa
-6jOG0eY0zd7nw7vkDL1GFrhL0B3k+fGtnipCD6OJvu+1+rIWZtDptyI3xWhu34nBUjG8gDMyyCto
-X5xuI1JPB8dY3L2UHoCfWBOYzUOVCZ57XZU0i/oRnwXZCGzGOnlyZtva4sDNBAMjCunbt2+MBYh/
-IrQlaZro4d91HZUlqxnZrPOuVQ94/LYlcIYnC7Vtp/sJa8ONZ5HiHInZyEqTcDy2baPz6aQ8DgC5
-8ITAhV1X/I6m2VUVcRxT8Ntv/74jHYets0L6+PjQ3rC53+nl5UXTYRySftNy34JVkP6iJ/727Ru9
-vLx8isTWubA6EHHPBbACt823b9/py5cXT4hjI8vQH1tVHhBUIqLX11f66aefPN5C17UaKIGSG/23
-zl1FKdg0DbMTjTWYLdUsCw6gntWZv76+KnsS2gKIZrC5eBy3UtPcpaS/aU7h6+sPOp/P+mwhRLJj
-MXtzPvItmvudyqrSdgr9ohW+MJjluPjMemPA9f3tnZ6ezmqwacFGLHr0vU5xGKqt+cfHhb58eaZh
-GCnPMwoltgoa/CRJnONTlmpcGn7e5XLR7w8dhR1z7kJks34CeZZSLqYgX79+o5NMmvB+LdBqzWJx
-mTVNwwaaRU7/+Mfvyp47HA5ijXZVQRAmYsiPgDcDaMBd21JRlp78/M+8EfB+IM8Hn+B2Y3mwrR7s
-gaVmLX2nWRR930sAT0Ft29H5zN8FY3FU/dfrlWI2ImBziHVZqB86RZb3fafL9UqJIP0ujSeh8/ns
-5qsmqhuo+ob8NBO8aDnqlt5rxyjWk856srmgicBzVekECIJHgUZzp5xR5zL5Vh2VQfsAk8xHOS9b
-eTFrjTMREw3OnGaWBgNYsfLYcdw/ZcjxSy3U/ALe7lEU6Tx/HC/6GYDmpmlC+4PhpWWfocUB6Kl2
-VIYsNAwLNW1HhZCM+CbcDLYSCe26dWQv4cYjzXleFqVl2zRh3KhbntM4jlTXtWIMuHXatpEIuU05
-/2jlkiTRZCPLKmy77k/dkAEawrcRt5/dFPjPME5qOIMx2CMGZHEWFVhJpQMrOGxu7qnZoWkSMxjE
-2KElZD7EJpuw1/U7LysVOkrld/JnbSzG5hwtvtE+DJRK1biuC0e1Gb4LJhJoGdhladFWPI5jyU5w
-JL45ddOF243HzjFnrLFPu5XvwqWG+2GXzw76K8qNfSdlWLkQRVJOteXvo7xn1iB581Cc/iix7KHx
-aKYI92G475xORzVQsAQWe1MBgYYTCrAL5xIbKa9eXV+xSQzYOc3OcYgNK0BySbWlwVwcn5Utn1PN
-UUB5DtcYTky+a5XB8dwt4d20bavjJpsN/2gVjsUExVgr6DFuxlmsoLGJQcays/44ioUUFunzwkaD
-ExK+XxTG5jm5Vsqaa0LPgCgrYAZgpimBRWLXbQ4CDsVHIZhda0ppNTN9RIxbXwW7luBGhH7e2biR
-FxiayXrAcwgEh8DPseM8HCSxtLJoVbitXBU8tu7LFmyGccc8t17aELdRNR3qihoxi/GDQF0ep90r
-PO0qqe9Hj6wFVeE9CCnPE4q3ddNbySKw+GJFXqibCUwOcZKOQoKxL+hx1uoLGIi+fftOWZZQXR+U
-2TSOA3XdpjmDeEn4HChPsWjcKC2k47Gm56cnvsnGkaJo+VMvfXuAIJXlQ7z4MLu3VstxnFDTdhIT
-HuhtZeezbC6SqHaCN6KLLgOnAOagvhw2pKEflAyDFuVy+dADBsYWSFdmh5vF8wuw1GvQsSGiAjsP
-FYEVToUPnoaO579oOOfhcKCm6bxDFFRhpPdoXNu6iFR6U3ltnuc0jpN+FyDh1gXKXgwqioojFcDY
-1o7jsGO9ZIZhlFCORVWIoM0CfLNVhw0OQfkOh2lElDkKLzsVgaTmFICh8gyYrn7RUWvfdxRFBy+J
-ehwnquvNc1PC2gB5Ca0wJMpY98gfPNQ1xUlBYTjogeVcl1J9n5PR3swze2K0LbczsAfHJYYWOZ7m
-Sfqeu4RlZp5rTpxEgvJP3ukFD0H4qLnFHenJj5eKFzBNIxVFTnXNJ9o88wHy22+/U55n9PPPP6tZ
-hKNjhh5aisWItJOqqinNCtp3dl+xfSjz3AMPVbfThLo+6NhwWRY6HGrtk/AQUTJbrwRk753PJy3f
-bO8KgopdCPb3opw9ng6sJJRxJQNPTzqXZrv0iPKajUGPx4P4KIaf+Pk6z5bNiR7f3hbAZ3Bj/tno
-CVRX+NldLhf6y19+8aiuYRDQMM+0bZGW5DbV2ZJw1nXR8Sa/h9hzn0bVBo9Gm7dnnZTtAYTEHfSx
-4JhgI6MyYFXe5lUSqFjcDbzohYBoeBsQ49ylGZgE/dkeXkXBPgyaCRAG3mfFfmCQclJbL0u15kMh
-1LVLRHS9XPnvLAuNtw/FWyyWoOtp9h2IofVI5PlZpiK3k3yRxtZsgJHkWOmnURTROOwUJK6PVvQ1
-gcVWZII0Ji1RMWu1o5h9J938cZLR5Xqjfd/o5eWJwjCil5cXJRIFAbPzlnnx6JsIYEwSN+rouruO
-UfCy7bjS2n3f73d2lBEz0DDM2KFXyvXD4UTrMtJibiS0D5BwVhWPh07HI0tmp9njUmAkxDeS34pY
-LITn2itNo/HRT2JhUPKsue1aeilenJd7GGklYstHtUNLU8VEQPLClMRm9D0q2XC7sgox1568aVpl
-CoJcsytiH+jkw/LgsXn48AmVnoy/g4sBjEIcRHme5FpWKAAAIABJREFUi2tPbA6SwBvfxjHbXe87
-qU0diE5oQ7q+p7/+9d/p+flZrdwRQIs26/ff/6C6LlWWjv758fPjc0CLsZuqh3UsNdUVr2c3f2fq
-Oq8pUgcnduSNlcsAFaOjCkdeNmdZMTjMLseNCSQlWtdAAFzycg1A4cZn3kzlhINuFjpyHMcUwwkH
-2eWryAcd0DFTRpmHQmqCyrJ6pBYr+Hh7f/NUe5ZcMs+zJtWu60rH44ktjKKKsnTUsM5hnLS0nGeH
-9Pf9QH3v2E+h8d3Dza1l7ea7+QDXsO44KHud/ffqiTzY8XbWzVYUpXi2HWmZG413srfVtq1ezDPM
-TUE0cvHPDOaxXj+mQG61R1cfVo9FFCcFRSIi4dZiUpBr2zb1DETFxEywWIg2o/bosEKD8zCAI1QY
-19tdA2GQa4fodzjUAky0vIZ13YxpCVt64eAEDhKQ890Hgs+HV0J7XcscO1YMyU5+5plHujAd6XtS
-ang/DFSI3uGXX36m5+dnbSOwWUEXrqqS+RNC+rHEKKDkTIN3KUU4ANXKLI5oXVlluG7OZanre10v
-1kMCGxXveVtmT5X6qEgty5LaptHoPs2/EDs+EKDs38GaQcs3z7NWDexjuXpVUNwJ8BIEgRIM1Bbr
-44PatqVM7KuwgTGjtOIQoKJsybRJL5NSEs8eR31dN+qlp8cHA3V1vH9X1pW3cZbVA740/ktJQ7vn
-VOMird3IZ1kWWuWWwYwbefHWDBPtECcPR577kbVPX9aFxtsPL90XLwK3AJewzoqab5HxE4inBpvb
-Tn1717bhdrvSOM7yLt4FrOq0HE7T1MNKbFqPE6YEqjeA3h74CeKp45h9FwGyjWP7YP21iDakoG1d
-NAjD4hCwP1NvCKmKPL77ttMyjS7uTA1JVrrdOgEwM6N+XD9Roy3ZKssLFWMBzOyHgW63m9iDH+l6
-HWnfezEInZkwlKbUioFHlpXqTu1s3wdlUSaqzttUlqyYlnx/aBWsn4GNtstz9nvM0oIPB+Ph52zy
-Mj3wMAmbponePz4oSRPFNaZpdH4VIn7Cbf7Yoj9WzZjEWKBaydlW/cVkm5gqmR8fDwfq+p6maaRl
-iT7Ngq09tFVaZWlC85R4p3gQBHS9XClOHMr88fEuIEpPbdvSTz990Vz00Bwc+G/0exbdxYNgnvdg
-TB3WTwEQiN+Gnx7MSPCQ8LNRYsdRrP09NmqWptRMrRcGikPJBkfixEdSkCVO4SWBfejahI2iCIm/
-KG0d9oH05GWZ6XplC/VCqNCP1lo8D849JqG15cqyVJNmb7c7NU0jZXVBVVnSKFMVBkHvn1yLAcxa
-Gnkgt52VYIN7YcVDzm47obpO1A8CakdOm+o/4Rtw0b1LzJmND09ip/XoupYulx/05csXGsdJk4NQ
-lvf94MlzHR0+UbLT7bZ7ORR936nrUCTtD+LhwOjDJYRDsihKniDMk1bVIDM1TSOOzzlN090bT377
-9p3WdVGvCHbXTj5NWyz3AgeItZez3hF2jcZxxFqAx/GKTgDEZCGKY4mljtSY4JEEg9Nu2zb69dff
-NBij63s6CV96GEa+cRIm/Dydz14PmKYpVVVFT0/PagzBJJX5UwCD7SUBcljHWjALLUCGG0UrAqN/
-YIAGrjK5ovqsflwUnEQ5frlePBqstXbyTUgWNT7F5ofRJObInKnHXnXfv78y4SSOGOBMJ8ryQj0T
-8qI004hEZKmxuuzY94ES3WovLF7BtN9Bqo07LcvMEeJSqi/LTMM4UCySU9trWnBRc+klRBQ5i4xQ
-Rx4LEbFluM1A8Nl3FtUEAem42QrVJpOabB1vnK8go+hLltO+b5SmufbMqCbRKoXG7o7Hzr0aveL9
-RRHP/Yehp7IsTFSdc2tGPFocu2zIeXaJwLD0CgLSCDkYctjRISjKTsLLysXz+UR9P1BVHajvGomp
-I60QIU+OY35/j4ehtXHDgWGxmnXdKIYDzSNXGXZJ0zTR169/KNca5iH4Qkyumbz59PPzE/3ll18o
-lkBJgEFcWbB/YJomYhrZU11VtG6rxiJHUUKbnjG798DwxZWp9v5OWZZ7Xv8IIEUFY28oy8SyCkfb
-xqA8xedumkb75G1zSbXWqgyKQCDJVhuulYD0lujpmAHGC3OeZ8qzVIVEccwg5+XSUxS9O9uzeaY0
-ibVvZZJRSUEQeSCcxVwY/InVHRY3xroGynpECZ9nGecrzjNdb3cxP2FfRyteAT3aJunaQBJsFLw7
-y0/AAVCWld6e93vjuRW7g3qmOD44LCR2IKh1FsbmBVkGhxuSd6yNGkCwUWzcsXZaoVFbzAEXlJ2U
-YWKAuT7GxBhtYpSXxDGNwyAu2IuyXdFaJhITxz4WR48gtO9Ex+NRXKASBWGhU2GjmUoMTifPSWoU
-fOB2u3nYla3Omf9yZ1PQPMuoaVtdOL49OB8EmBuuwpfHTQu9gG0Ljscj+8+FmXdrnE5n5o0nCQ19
-R8vc0zBOCoRgg18ub96MGskziPAKQ9yemzcLxwLlcoo3YZok3me1SL1F0T+PD6H849FllmXiNPRQ
-AstILIp8lR8onnZkZLX3LMDZ5GDcRP3FmXNxFFMYxTR3HW3bquMfJPqgTcBn/vh4/9SWIdATbcG2
-rWwiaUpztCLT7A4NCIeGYdCRKIeEJlQWBScwZ6mHhlsFI2ba+r1Dh+kMw0jfvn3XiYANDsElgsVp
-rdHx/eHpD9DVchf00AtDKvJEfCJIDyLrZGQj8Hzk35mLvL+/0/F4VMt0TMqSJKHr7a5tI1yFbEYE
-ngmb1Ux0v9+05Lbcl3VNhPe/0jT2oiuYFMjOMg7i+e23/4+enp6UKszipVlThZqm1YCULMtp3Vqf
-F2Hi02xYTJIkFHM4Zuj1Cz6QtFGeVxrgOJkSEmXlME5eJHMYRnS9fuj4xYJJoyTdfn/9oaMtkCTw
-8lEeO7CMVL+Nw0aDJrNcEWH0PjgEioITUayLsL2VLCcct+diUGm9VTR7PaV1WajtOjWiAECJGxGo
-7N///isdjwePFYhbhohoMGUaMgZRIs7LQhachRIMGxaHLnrmdY08Q1PnhBtr1QG5LfIZLA4B1pp9
-/2VZSvZ8QOfzmcZx0OonkrK+ae56i6dJSpMw/Wx68ibP+TEdOE1irz/FRsV7xgFmDVHCIFCji8dW
-B3x+dwCyyQyqVExCuq6jSezYcRtDvNV1LftJiiCnLHKaxGRjE5ffWDAGeBmCA8OCn0RbM3uQOfwp
-VLMRNsFZ9WdleSHxaqNiNHEc0UfPictZltHpeNC2No65fbFjWGBbOOSzLCPayeQixN60LklSiqdp
-pmEbvVNSraIxKhDyBiKSWSk3qlGIdbMBDmCJQXZzYCECUc3ShJqGD4e6rqSc2fSkAmmBVU6hlvmY
-oeJnvr7+8Bbe29sbFQWbRMSGsw+9OCidjwvJKapCIXaQ/rvb7WYUYwuPqzb6k6iuic7nIz09PQvw
-FOtsnoMiSp31gsEHlt84+r0uqh4G0NzBjPEnxjrgmrvv5XvAb2rbXSjvvRVqKdo3x6EY1JqLK6ld
-Y7/TNFPCVZrys2Yl5qDrxo4h1W5rnr2KLi9KWrddfSLtpAV+AzhYITaydvH2UsEzUUNbY3y6rZtO
-FTCCnufFE0yNk09RhlrTOgS7Km4VxyO+bbFhq6oSxmZKrbhUWSNaVG2sZ3AZjSBn3e93qsrCrLtd
-cJGEfv75Jzodj5TlFV2vXO0dDgf2RFjmT9FrPPdHtTTRNE9aBaNiUkMZ9CAooXFb4L+xoewXWZZF
-F6S15oaABYsSH4bzzZlws9NOAXE5hISVouDeCP8eOmYAFXya5SpCsQIenyTkePFlyV74aAXA9gPt
-F85EdtE6xlmiJR3m3KPhgMN/3uoNsOj4c0tOQl3T9cqZiFVVq5hqXTfK5f8Pw5zGaWKHWJlwWAo1
-MyETPUQtE3CaHVUWh7Fl0E3TqIvJJS3FXo48U5HZsy8MArreOq/Cu9/vpjKIKE1iPXyBgTyO6hzn
-fjRp0aT6knXd6PX1lcZxlNSk2BPocF5hyZwUuWF7sURno9FOJwhoRwFegg+Adq7rOwqj0POZKIqC
-zucTLfOixh54Zqk4OE8zV2FQBq7rplgCeP3QczCL9KA9uJ3DW8svtHs8mRLAUVqSdduVIIRnye3Z
-TMfTSTCbWeXFibTRgRk/932noLQLy3VAb2SegwL4//2//187fP2c0QSPnUBJdL02RkyBnpTct/m2
-VOBMMyrKJ1RVMtAHAYizRYo01z7PUmq7TvXvDhCKPI09TvnHTHS2ZCpU157IKfj99btIKiMr4tWN
-ge+JF2V16Sg9p3nWEFIOLK0oSzMaJe3n0afAIuMIutyEoQiR0ThxDnyaZjQMvZSDpIflsi5a5dgo
-MEd3XT3qq0V4NY8hST6l+kAYxOSeWpJsOj0kNG4riWgaJ5nXb57uQNVu86KVoUPnQy/Hvm1but9b
-Oh4P9PL8zADdwCPfw+GgNz3Sk/Ocw2DB5kR7h3YM2AQfzuzpwK7CLu8wFCXj9XqRiUDmuQcdDgea
-xonarpUq0gppXKsFfUCeZ67yCiU9WTQPyG9klD6kIpdDPY7ofm+klXLPBM8ROMhjgjIo8PYfNqNN
-RQk56t+/Xm+6Z6EOdUrPlC6Xm4494WPhuU798cff9r7vFeVFSY3b7e3tnb58eVFgCDenl62epRRJ
-ft8jAeE///M/6V//9V+pLPJPjCvQGlG22oBGxHu/v7/T8/Oz56cH1p6jRgYPoSa8eaZppre3d47r
-Lpm+u5gYc5hzYAwDtRr+f+aa3+hwqLUi+vjgmPTnpzNFMd+QMGq0ACPUdD9+vNPpdPQio7IspYAC
-ZYyxWxK7Ij2dOUgyzTh56OPjg56enlxak7EU8/3nN514uJYhoKZp6Hg86uJlK7FUf15dV7Stm/bW
-SCjC3PlyudLpdPSixi2aDHaaJQXhImFA90JlyWarX16eKQhj2tZFhDYuJ7LvB5mfR0rtBRD5yy8/
-iWx6YM69HNp5zrZruBTazlUJaNW+f3+lX375mer6QG3beMQ1cPJt2q6Vd3Pm5Rudzyet8FDN8HdM
-lftQlDWNQ0/DOHqt2MfHB728vKgxrdKtRWWJ0a19n5Y+3zQNPT8/e5JvFaxFMV1vNw0ZGcdJsBW3
-zv/5zz/oy5cvlGepRz1WjgsUY2VR0JZlNIoQByMOBF7aiCVrEQ1+vUVw7S21LFzWbjLuscm+ViyE
-UYxFXG1U2cOH/rQgLcEE5TJO8zznEjegXcCXTUt7/r/Jo1FaBiAcXFR3LcYe67rRvbk82DuzTRhK
-xGWZ9cQfhlHos5s3ZcmyjArJrONo8oKGodNbLnhgRgLNtac4Ji0XsY6G4+4kijocnKDM2jTltu1E
-LxFotYHsenYXbqgs809ho/jzwQMN24FuiZqXgAYcxQlNknoLrsEwdMr+LApWnuZFqZoAtCt8MaQa
-WDMvKzVN60V1A8G30xz2N4hFPTiYFKlF7bPASHyU6QK5B/IOqy1E31n/zHm56ibd90h8M1JvkoFn
-EQQkzk6TN5GCLB0THwCFePeIq5vmRdykRgVUeTTYfnKYRvWOww1eGtpC4yaG0Qd6NvxCBEuM66p9
-Beya3Dgp+kSFBXHmeDzQ0/lMWV5R216NGm76pBVAKAM+MIwvYCphR4WIV+Y/M5qgjJne3j7oeKyl
-vdiMNoA599b9B301Tk2EVIyjawUs6YRvjNQD43AAJQkrsEJjp6YKMSlzcVBaIAsmGBgHPXoiwFIL
-VFmrR7dRYgD4MFPGxse7uTetSZpx0uu26z/lEazrSKfTyfPpx5z7UacPIdjHx1VSjio1oYxjxobg
-Es0VT8ZxdPOgFSF8AOdlpbVtVbizCBEMG2pdN4rTlLZtVg6CpcOCFGQPqnXj5wf+BTZZkecUJymt
-W+cRzOwIEoc38JpJuAMYsa7GoQdTDEs62o11fFEUsglJKyfbtqmfQ8ouSQC1szRx41LjlqT4jxig
-2CmIdcy2l5od2a/rygcAUysnyRBzUl7cxriJQZ3th+HTLwIRAQcAa/x7Hb9sm/MwA7j2mMWHFwi2
-mA02iGPyRDT8Yjo2sJhmb+pwONRiDBkrCQibNQoDb7GHYahGJEuPvL7J9NGbHlJxHGlvqdFK4vLi
-WIBEs1G74VDl3mtjuXWc0eXCsWds8uFm6NO8PBBCdu1BYUkOJPoxXtyVs5xGa//hwwCgLnm8cwv6
-hmFI5/MT7ftOpxOHvODAwy2CcSYf8EdF3w+HWiTLfIDNhjk3G/JOGAS0mwMYhyNuYi7jcwHEVp0C
-QWsAuywl3Ch127V1wAiALfB3nlW6y3ySkC6XD/1ctj2wuArezyLVICoHiOYspoWRo5vQOOdohNde
-LleliuNZotJOJU8DRjHLPFOaZcKOjPTn2kwOy8lomrva3cEty7YW1jBU1LyhxxEOw5A3SRjLzDHy
-yr3HwM3g4QQEis9OOIVQFHmEhlPcZ/aFylpipmFBaZZpeIFNsmEUM/xki2U/D6LGDoeaoiijj4+L
-Y/7JYWbHkhjtsPXS6rEhUfaD2+2Hi646irMpLOj9oKt3N07lsheiWNKYMqqrSu2f8Vwu15seki63
-nunDURjRsIw6J4fEMwwj+vH2RvOcUGKIMhYw1YgtMcpoJSkY38WCoOzKu1FAgWfTBc/7ICCJzapo
-l9aKe9GSoiihvev1GfB7mhRQtvwD67VowUu47bZtq1RcKDoxkXFe/7wxAo/KGykJCQy6snTeejb3
-Am1PkrAU2h6GtvVkMtokB4+jZCMwFZgAi+JSkQ874HWaZnUjqqvSi86zUl2oSNXXsWl19AyuDW5z
-jBHxObBfsVcgHtI2WcaLSoO3gQT4g4u5OdqupSgO9SS3fHyrSbckA/Th/MUyeWB+RBI2rhNMFLoQ
-GgmGsGNHqLRQWuFFwL/QHkz4GVE06Je1L9UCWYgKQ3TZYwaAPT0hRrFzV5TPMKnAYdm2rUhsEynj
-WE03jT1FUUhlWWl6Erceq2klEuVIgNCDg+p+f9cACqU+j5Mi5G7CMH8ShsBqDJsHXnjWxRcUVVSE
-wzhQWZXqNsT8jUQPa/T1ThTVmXe7PojFEkoSH+yFohFrCOaarHzklge5CfM8K9KPgwuiIttKqGuV
-VEp5nrG9GvEtjgsHMXMw1kTOJMbMlsDkvAEirZijKBKswll/b9tGl8tFCU+P9mGq3JSfdbvfnPN2
-GNK2zd6lNw4DRVXlqS/DMBLBVq4/Gwd4URSUJjGlGac7l2VJVVlyRPiy0v3eaKXCjkCmv7JlsS9V
-jR587gI1H8AXt4GINjIcI7osTU16rqOxWsUYEnfQiozj6Pno44R1lmGp0iutqSZ6X1+L75tIQr0F
-bAF6fFhW4zs1TUtVValT0jT1XpWAzwOhBlSMEO9E8mdZBrp4Jfe8rNT+ePV84C3HnUtiUvsxHKr2
-s1umHTTqaVbo7WRRbfvuEhH4QMQyjBPlWUo/3t6V9g38AswzO3VIhdx0uVxUyAV3H7QbkBxjc6K1
-hCsyxo3WQQitI1cTPB3Z9p2mcVRRlZUJjybzDxJauPgg1i7Lck07hrEHwOGqqllEtCxUFLmuZ6s8
-tAnJ4JQkhrWaJKm2rUxiEhJREnsgsc3J3LeNhmmm+70RR+5CVYfQL+z7rrZrLs5898h30DvYKorl
-0Y1iWF3ff6reoSqNcaL41lLuhrbyYJvdbjMDbNADNkae59R1XMp8/fZd6a5WFWdJNOiNgCADIR/H
-UUcYjxyCJIn5wNhGT+Ti+OXzJzkwHhw00fxzUhWqcH7fogYXoBVDaz4Mg2coYinDQOnBmNu2jSO6
-zGFoDyYbNmpvbStSwYv9/Z//pDzPvPSaaV29mTzK5tEzrlzVbINzFxJnbyXGqOC2z3Ou/TxorfDV
-t2zDfd/VxNOCWIxNrEoMs+QX50rsDGeRS3m9XulwOLAhzbrS8ZioXfrteuVJRZJ4GYz2AIbP4KZu
-R5FMijbzXCbFgXBQ26mGDQiBM1YYuBg33pSjtiIIq8HFkWaZmrHgEkBV6arYjYIg0haEx7C1BOoc
-tPS3lQJo8PbWBpV5HLmaQhIXPpO1Gm9bTqfG1AOfK80KxjBs78/o96Qnny2B7MjHGiNi7vjx8aGl
-qUMgEwGTjnqqslmkWGGZhYpeDKMOq6xKM8e5tlHMEAj5VMj1kzsRPgs+K/fmkffzLperByjB622a
-ZrVkQmIORmxOMeZAOYyM0oRjmvp+oPPpSOu2i2nm7lVaeZ6Jz3+iyD8+R5omYnTKJV9V1RrBNRt/
-Ai/vXaYSkM+inYAXv0PtrUou9CTDKNfv90Y8IJzO3CoYbavnnItS40rsoraZtHKVg9G9I4C07Dkw
-6eHGE5SRun6gU5oog46fG6+r9/d3LYXnhSnVAPp43EyeWeqj8y8R0TT2wgyFAUgsbYIzGdGqJ810
-CrQKvoPN3PWDYhr8/Ec9NJYlV5s7tG33pqWmaaiua3kfo4av4LJk8U+mzw/jWwugq6/gungzfrSN
-VVWpaAhhsNw2MZAa+x9680I+HHuIVKjCxgrOAut6u0uZlUkr4ayckiQh2olOpyda5pHiJKGua5lq
-aR4uNhFOct6ks5B+errfG7k5+dCAUAXjSJyIlsRke3mYJdh+/fEws2g6ytUoDKiNhbgiijSAN9wn
-r0Ztt3mGpRBtZFlGeVHSm/js2w2r3gMJP/eyyLXMZSCWNQ/cy1VU15WGV8KVxzrI4HZzB0KoPARr
-mAn3WTXxiDL1ll+WWRc0m7CGHtDLWMSmZb+d3uCSAIEIC9Zt9kli2Uvqulbp0Tic06yg2+3KNOXr
-zZiZ5qr/QJWFLD6MgsdxkF6+9sI6VPQiz8aCooinsy3IMI5eSKtVTkZRRIVJXbIXD7/rXKcsuByt
-sSnCOjdZX5wazQG1sIFn1eRgJMqj5jVkaUqt8l9CDRBBK/DYSmqisJDQoAkAEHy/37kFeEytfQTA
-YBm+rolurvv9rtbKmKuO4ygpN45x9fXbH7Sss4wrWG+P8k8VWaEjs6zbTm3X6Ak9ygvB/88hoMxZ
-uDeN3ngQF2ER2lmpi1mKvAhmKyayNmLjuAvowzfIP//4g3vSLKUgjGleBg+QtNVGFIXi7y5gTky0
-iQsuzEzx56E/j2M+yNDqoJS/Ny2N40hHyWxs205vM1sm8uGUeWUyqinITRUdDwOP+w7J7jQvagln
-gWGuPDi7EJRi+AZwLkSiP/ftetFN4HrV2ESPsxnr4XCQg8JZVa/bLtOFwFu8g3ymeSFFtruON9+X
-L1+oLCvaNibnIFsijlhzgiAVvGdUtnj/jwGpTkkZeTN1uxc+LhevB7cXzmPZju9v9SqonKEELMtK
-R3uROZSLIqdQhFb2vdoJmHWpst8HI0BwIuZ58QJOIevPsoxiBHdCGWb9xhDZVRS5arhdFnvsWW4V
-BfcZyzxJ+ugoZVOu5ReflAtLXmWmvO87zYajbZ1LeAEWKsfFOEpjpKSXLsvSlI2zUimxKR/993j0
-GBn/uumTl55tTRBXFoaR3lAYZ6KCcEDRpm6w/Fxb5ivEkVpJ4bay2AkOJFtB2V53fwD71EdwhZ14
-rrRqHGhwv8nzTM1TZiljo4i95Fk3H3pqQIiW2JWHbxcbSooDy7oJw3QTIS/cH7vAEGx0zPaxWI/H
-k1JrrZrSElbwnoBLwcMwL0qaxpHehZ4dxwnd7neK4/WTFBeVGlKVgebb5CieraeeshPrAWNq1dHH
-Mb29/WAHZbnQ7O9Be7SuLnMC4C2k7tu20f1+9yoS7C2wGPuhp/pQa8uG9wKOg12naA8gMXcZHpM3
-qge5Kk1TivkkafVUVNqo9GWJKWP4w0W66ZqmUSILegomS7iQEAgvypK1+Z2o5SzZx86hH+2q7dzf
-2jst66rABzz0t3n6NMbzBUCkAg93E4ceW85ODfCPeqynKQXCOkuTmP7+91/pcDzqSM6aVPBL3YSJ
-uKi7bBgEtG2peNbx7LyuSmraTqsqTGSsbdU4Tao5fxwtFUXhHT62FZrmWeyoE6qqWkddXT/Qalic
-lv9uWYyowDC35/4/Fhpxq9VfHHPvfr3dJQCWpz7jNFFRFnozIWBFb655olRIMY54E0moRUtdxwnL
-iaGf6yx/HGkUPn+SxHS5XhzBJY49p2e0AOMYeeEbWF/7vuvkpqpKvRCxD6Bcxe/Os5SyLFcAbhhH
-xVSwZvKcHbSsC+/j2M6u70UOC7hPwasATEsAjDjA5znwvBXtd2Uad0ePIL+djAVBQHEvybKWxw0O
-NBscyuklmwz6Z6TY8sI60L6vEv9kgQjEZ3X0/ft3DQnlQyZSlqDlB3Rdp9MFHEaLQTfVilrGKPjf
-HxOAMCXgqPL9k4+hs5lePGNFpxvHLRRrybXvnaP+hiEVZSlpsCcVmqB/5BN6JiInsNl3okHAORhL
-4BmgnUIbgnn9tq2qAkQ/i8PTkVISzxQDIh33LmO9OZkOu2kL46jBiReXfb1elYCDRV+WpVYxcKxx
-tmirI6pME1VVSfd740lQH8MsOMePbeC/f3+lqio02vt4PFJd19T3Pctxl9k7oGFCg0qo65xEGFgK
-+x5kXpDG7Xanl5dnvYnxmbmKzYWkFX7KWygKDs/d1k1FXPYQsZ/FS1paV0ozdgVG1Jfl6sNmTG3C
-pLqoZJTYSIUA7wWbiMzrdxI+R6IXbxxHdLlc9RmfjgdJT169DI+u6yk+Hg98KwmCjh5o312cV2xy
-3/Z9p7cfb5RmKYtOspSINnp7++EBRviANp4KqkE2jyDPpwxEGixKFw+1fqoKuFfzVVt2YTHifKG6
-5i+eLYsnnHFxy6Hnhgyw835vlHoKvTtOWuu+cj6f5UXlFEWd2TilZuqxLRnzC5AvADRdDRwDx26D
-SMYJqxy4pjyHDQeh40VwtcVmq6FYmdmDEQfNPC+6MR9dhHDrzPMiugJ2lGHb9kUTcrBYcWgDhGIf
-vk7BQVcGr9qSPbZXzgO/4JCNuqK27XQMHIY7C+wxAAAgAElEQVQJBUFG6zo+yMD9gE3cjucT29HN
-tyu1bUPD0FMcv9A4rnLLl4qKo7XBGsANfvnjD8rzXCda1nMBIrl1c7023rnlOeBz8hRpV6djJF1Z
-qjguq1lyJ6MoVMtxhLtq8Okw0LbFXmBJGG68h4kPmF0uQLUBM5mGsR4e4p78P/7H/72XZSF66F09
-/fmHG+5zltH9fpc+igkL59OJdtrpcrnqCQp9fxCE9PXrN6prdsCJopiqqqRtW1WjjC/AizFSRZ1b
-1L3aKDmtPT+Ir1+/URSGVB9qwRRmr42Atvx4POnDdm4piSDqkYA1sTFqCLT/KgtmUKHf5Wpj1c3D
-v6dXPTaeDasrc/r++oPKsqDD4Ui9xqs7TwVQP/nfBQqSoi0JglB9AxwYxZvuer3pDb2uK7Vtq2zK
-NEnp67evPDkQqjHeZxAEdL1eKM9L9jjcNq0wHklgEB85XYENXWXde9u1WnF1Mgev61oouy5ODlZk
-lsjj/ByY5lpXFWV5rvx8pE0z/yHwEHmeFLFlHacwpTKGzmiZufUYxb+wF1o5vAzTJKGirFQgxIdI
-rDyTprkznVwuEHx3pEKnYsUFP4ZlWagq2fob/HtcnhbH4VaQgUG8C76MuGphOT1X17YaxDsfx5Fu
-txsdj0eqyor6offEeNh3WMfDMFJdV+pnEQkF3Zm7JhT89tu/70mSUF1V1EhPB9FM2/V0v9/p6enJ
-c/6dpkmCF04SXsGsvKos6Xq70ffv3+nLly80zzNN00T/+3/5L3S733WOC2mpFVvglm3bRm7eWMCX
-O3358qybGn+3bRua54V+/umLloThn7qjBFTXpZao+OxOZrqphTg83aMo1Jz3f/zjH3Q6HT2LLksn
-xtwWwCYWaF3X9Pb2g4Zhon/5l78ok80uYjgowcACOgWrO7jdbnQ6ncyGIW0RDnWtB7DaoWvQ5UDH
-44HutzslwrbDxuNpDbPg+P2NniejJWddr1c6nU4PzE4HRoLGiylQWeSU5YV6J97vDX15eaKuHyjP
-MzZRFRqtcwsKjF1bpBl668o8eC7ZI88PAgefksbSRJ8vLLGSJKWhHzRiC9jHo2TdthGYPhR5Tkma
-0X/+53/Q+XxWVR8AaMu03LaNjocDhRFXjzZC/XK50OFwUGAQCcIY26GV4PW4KbbC76eky8eVDsda
-n9s4jpojcL83WjlM06QHrNXttG1LX768aAAwFLPgbIRlWdLxcKAsL7ScXpaFrre7h0DjRsBCHMeB
-+q7R0ximCix+YLbfX/7yCx0ONSUpl13M8d/cLNL0TDb6Gz2zs5neRNEVKmGpLCs6n89UlEfK8sJz
-H8JUgu2QepWVso8d++EFFOiGHcXeyQkzMlq3nW63K20bW2f9/vvv1DR3Q6VMdeHnGZND8HmnaaLb
-7eYi1LfNU/mh/B3HiZq2pUnYeNCrw97adzziZzAMg1s8y6LZjEgZDgLSNJtpmumPr1/per2ogAQY
-CttRLd6hNk0jTdMoWMhKXdd6h9rjWIw/S69ZkGAIrstCt/td7NnZ+RktFg5wfGbMqTGyss7JwBgw
-A3dWaaFnTAM7dn8kG4lib1DX6VRQfFt+W0oxDuUkjiR05UJt66TCeMZpVqhFGX5e1/eeAhOKTfu8
-cIixYnHzMhPDwM9ARKJy07Yc6iGYhyWqYW/YfAQQuex0w1ZcqGJRNYTTNNH1dqPffvvVc7RBqQNb
-bRdeEDp+tRgY4gO9vb9TEIT0l7/8QqfTM0VRSU3T0u32rl+WTR9SBQvxHzDX4MaK/gv216g+7Jdf
-loVutw9aZYTGVcFEmfDMeU5PGkCBh962Hf362z+o73ulTeJ2wSJ8TDnifptbBwYC3ahpNi/Ijvf4
-mQXqVGN7Xvd5kKwT6mLf5MCwQSMOBU7Vq6/vO3r/uCgpiNlgqybzgO785csXenn54iXWruuqiksQ
-q9ifLzH+eHxbff3jD2qa5pN1FdYIbhTcPqP8XnAcsGgXORjgb6CbLnHkFWz+OGYLbABeILxYm/VK
-/ATDMBIAejYblSsRYAn4u9ZZ2bY7OFCgKpzEMg3JwwD5+ELoTPJv/IkrMI6D+gK8v7/r2BemLdYI
-pOtYVg1c5zHJFz27HWVPoiGwOEqeZ3Jp+JgYsi5cUK6zN6+qkmLLjAPXG2YYCFGACeaj4GYcdy19
-p9lZUfMIpqEk4ZuXS/dYbsuMYuPT/2cuLMx+G4yxyKgYAQAlVBpwdcVCxox01JhvTjCeyDdMqOuK
-DoeDsN8WZSEuS6LKO0uw+OmnL3Q6nSgIMuq7D9WuP7IQH2O7M+Mqa5lxAEAdASlWJySevbPlFBOw
-VqWq8lhoVdAry1L69u27nOiZ8yCU2/X56ZnKsqIgcFXXanLkraAJASe4fe53rgK//PSToutIdMaB
-bCPNiiLX6QVKXn6H9ImPgU0JdxwnMBvF4DPTiQJuOcflZ9fnw+HgIfyW4LNuu4p8oEOIQPeVCjSO
-Yrrf7zqyg4JwHMUePM8pywY6HQ/a81spsqVOO/SfPE8BVgWy+UjTtkwllpAUBhQj3XdgaFrmYVmU
-VJWFslh3dUT6PNqeTUQ4qkmIklgj4rwtxpFb3RgbuKpK2reNk1s0nGARcUclrC9H0AF5Zl0Den9/
-5yy5qvIoiu/v758UbOM0qV+Zj+rP6mhqkVSAHLZdKIrck+VaL7pK3XbdzLPr3Tw4ikK631mTzQSf
-iKKoUwoy+tBEWYWhGjx0XUth0KlCyx5eWGh2MpHEEe0CrKrRp/RnbdsyndlMWKKQOeIuXSb+dDjj
-lj8ej1QWBcVJRlXFYF8nFY3t1+/NnaIfoRKX2N12VOdjJuUkNM+OjISDAQErp+OR4iSRQ8S5BtuZ
-diwV4rJcneLNLEyX0BSqwzPGlvYW1s2ZxPT9+yv1fa/P1DIUj8ej5hG4sJTdKO5Yl9+2DR0OB6Y4
-x7NXjjssh8vycRzkorPxcYuwM1e1qbOS+M1wDGzZn6bJA/lpMyYurCto204zLSxD1E43pnmirh+0
-9dl3Ukr0n01UnFWcY/BaHYizKueJUIyyCzNWgGl2rgm+OGyhQHOE0cK+7bTvG5VFTk3bef00qKQB
-CZff6N4tE8t6C1i7JBvhlaaJOMWG3szd9Wi5ptKweeYuhhSzfqemuaszzjTxIYUZ67IM4g9wU2GT
-OgaHIU3Se9uHyYrBUumv3mx4d0YZ9juCYFOWJeVZpsaQsHVyz2XzWH/TNJuDzE0H9p038vF40Mg2
-FpZ0MiaKHjz7IwX+WAdBEoqRyI2Vyviq4FszSeh6vXqyYtxwuIFvt6sHVHLuAGtDijxXZBoAmfWF
-xM/QNRcEtK2bVhiI+8KmwO2WJinFSUa7HHwuUIO578vSOz8GvXF5fQ3DpjiEnb8jhQqsTFd1ur3x
-mIn4OPrDWBQXgTWMHcdBvCGdBoYPn8mzlMPPhO7BXZSOqmwrTbQk+B2agxhGn0bk+O8gCJgJ6Nh8
-s76QaRo94GhZFiKxLELfjzLzdD7xg08KCsNBNziXH+yzjkRbi/pbv7wwTBQVX8SNx94ODNRMCmJY
-/gBKLpghZHmh0kpUMZBGghGXxDG9f3xISMRBe29sDGyEMIy8l2ldYhCOweVxobFl4zRpyq1FuwE6
-xXFMu8yR2f2o90gyllE4z7MyBFGhPAacJknKISPbrrl1GGllWarVHfIaLPqMAwuHYJrwjDlLU2ra
-ltqupfAt9A49/H44EbmDaFcTjEgISjGyIIS0gsAPnnmnnh8jfvY4zdQJe7HImRCDBCYchn3fC425
-88pebOhpniTgttAbl3kmTOdm5Jxt0QsBT8HJCMQW3MqJH0NksMYfDVdwiDklauRNGsKwNsKr5U8D
-O2cvmSryDhbbxlpQ1FYEeK6wc0flCysyAOZRFFEMBBU9L6in7HSS0Lruao7A46VFfyBKjbqupKxY
-PHJNGIbUDwP9/s8/ZGademWIjTm27sKuhPdvzUcvv0cCEKSZ69Zp/BLK3ixzVNiqLIQZtTCZp2JO
-OXo2RHrHJv7a9ay+FRWz41JOUO46WtfBq0ogYAIfH6Yop/NJlWU2LvrRcBPAKKfOZJqmCxNUT60m
-oh4smG/fvjHLLIyoE8vozSjF+PsyIaYoWLIaRxE1bacMOcs0tLbh+84LrOvuXl8NYQs894gCveW6
-rqdlWaUkX9T0ZF0nD0SzPgvzsmheobXFtrLz6/WqrRvWn036YVu1xuPLp2lGdR1oa8ZU3tEztLEB
-Gn9Wmbpsgl3xHR5huvj6t7cftG0rnU4nozSNH+jukby7XaY9redubNmY8EcEI5Nl0R8SmNKrE9Em
-CceoGn1Ha5Yd13VNMVszj57NNNR2DLrwS53kh0BMYQMiUM51XatlZ5qGRldfaN/Xtp32+zgpnbMu
-f1nQOuua551pEnvpwEB7bdinXRxA8rmkSrQyQCkPJPVwONDxeCSikMapURlmKiEebddLZVGqDhyG
-lHw772o/FsejZ1XuEn7A/CLPCp2BqpXCzWEP9lZx4Gyo0eF5XtI09nS5XD0ZM0hAqxwgEIx8+fKF
-Fol33/edPi4XsZPKvcguAJNc+q66mC+Xi8SVjXo5wIeBQWDkKhRKs31EseEJyC6/HP9eFLnXRtgb
-znpNYo4dhoFUDqFWf056nVJd19p2hFLFgGtgzWGAt4BBycS1xJsygAOAjAuLc1i9hwO7B8VNMKHB
-Jsf7AV4BWj1vyk3p9rxmV8/aHCQwXLw2DAYmK6g+sGZxSYFIBI0KPAiaho1FijynWUxt4v1PLLym
-2amKMC5yo5LME+VYdHddmZXFfVtGy8qmnfzia5rGnufUMj7CIn5M+AXzsK4qIZpERDSrDNl6uGG8
-gUQYfE5YibdtQ6fTUd1i4C4D6W3XtSqrtKcu+m+rIAQNNgqDTziG5fPzgnsEORcaR8e5R1ruOLq4
-KTundzeEA3z6nisbHMD4/XVd6xRjFM96Dd6cZ6HTBgqyYnEyM7LTQ8qmO0HkE4YstoFFFfIF5tm5
-OyFcBC3JY+w6Do2iyDmGTMhX07z/6XjUfxaxoRWHn8ao4zRRWRQ0LwtlaUrfX19pnmeqqlp4Ef70
-wX5P+EzYSnJdVzUm4X8deGW6BZhd8nWolvkq+eWxAxVFQcfjgaIo84I7scYcFXtWARaL7XJKZUN3
-XasXATNtV88EN01TsTiPaRpHyrITjeMk7MhYR4lWvp7nOedETOJegwf0qHF+f/+gX375WRVw96b1
-eng7GrQOp1EUUj841VPbNp6FEmb0nXiaPXLD66qiCJRgA1LCm9+WwY+x3MsyCz00cyaOMicGmQmO
-Q3aRKtiYpNQtvRk3hqKT4Ipg+f9x4rEpxha5HobBux1sLoJdeKo8M4fnJI7BqAzw+xAG0fWDZvul
-WaHpS1i0rKq7yu/dVL56vzfKr3i0BYf5SVWxkebhUFPbdlQWDLKCIVrXPF5klplzXirE0QbVkvV+
-CMKY2ubuWaOB+WjXEcRYaZrRWTAmbhObTwcFvBbv8yygX67tg9UNWD0LMgXsO2GSWqAXBV+Mdn04
-sZqVy9d1TcfjicIwoHWZqWk7+vF2dZOYe0P7fvd6eBc6u3l5lLgg2a17UD9GPFtbZeIyCuS7Yhpy
-vV7peDzqJY4pDNZNLJOTcV0p3raNo6xPR9VJ84J1eWY8jyy8fh0fBMGGGL9gdJTEkZB7SMtvAHFb
-UVI4Lx7l1N6kithfr4qWv/14o7IqVfqJZNaPjw8tER3LMKGy9EeHZZHToGWsr/u3hCTObV89CypM
-PGwJaAkldq7PsdmONDNNoyTJZp5e/zEXwSOSKHff0WPtzYdDj6W3Ia2yMObZgUo2UQa23Hifg8kY
-tMQlvN88z/VQ6YeemqZVvT50CnXNo0e0kHbujwh4+1xxKWzr8imMFWNJP6GalEOwLMzGTI2lvJ2q
-2DId8txYPPUt+m0rFGxiGxOGn7l7DL5Qb20brIH3AH/IeR69PImiEGatOczsev8z0NeRqxicvd3u
-tCwMVMKuTEHGkAV867bT/L/oeq8dybLkStSOlu7hkaK7SV5gZv7/W+ZlLgZzQRIg2dUlMiPC5dHy
-Ppgt27Y9ahIgmlWVGel+zhZmy5aQNYvLlrU9pLiW8wWYaZDLT63xoyiiLM+pLCuqypJaI9pYFr4x
-D3VFUZxIgEGspbB1XLEgEcILsyyjtm01TgkPniOzSF/uNI0yiXAPFl75ePhFmevYrB8Gul6vmg/I
-6bCVij7caITjl3nenlA4O+8AO5Gw45QkST2PePRb1oQSC8neKhYcAhJdliX34CCiRBEFwWJCJCJ9
-js+bwo1hI9UqIKHWxoRBAGTHh2ypnXrVHBYuiESDfC7cgLYCQjvF0tjAO7BADQYIBYq1neHj1rO+
-BOCVAJSCFR2sy9DKrduuF4dLJSZN433eMBYHwia9XK9q/IlnDDIaLhBMaUCqwUQkzzMKKDD5AqEn
-6LHR55bWbseAOHByER8BP7AeEzaMxClw+bvD2Zip75Hy/e1ocl4+U3yhhwgCppKnWfanPoG2Koq3
-bRNWXE1xXFIvwQVRGBBlKd1uD+r6gZrmTft/SD9hJ/0sy03TTMcQruxZPFfgLOUyJE13LxDymQSE
-8ho9XZK6/MJlkamFmDOA4ACHmX1PBfQqOeRCbqfnktc5BPMMuCwZtMzSlGaTioQbyVUzrZe7zlbm
-fBpXVUVVVdH7+ztVNYs59m2jnz/fqChyAa548//6669UVZXaSQPD4KkJ8wOsFTbchgBuJkkiiz40
-zk27VkMQmoRhqKGp1uhV3YNkkrBgw9HszbvhsY+Dv2lb/fkIl9n3SIlP1hLMklvczD3W952YTWQN
-NHFBoJWzGZIKpsr6A/0ZgCZ0GYggh19jGEbaNuBnaDW4bbSb9Yc21+JdAEAt8cs6NeG53u4Pejwe
-9P37d09G7ZyvQnVSfqa5R1EqorfOO2TxHm1UueIJcmBO06ijVJ+lCD+BmAbsLeZK8ygoCkc5qWda
-xPQDHxROJC6qOPMIQ0BgEZdkuc27AczwwqZ5olKCDXAAzHK7jeMgUsbaM9zs+p7IsN1sHJQtvzAL
-hRjlfr/pLQbQCw+v7zvP4Rcegtu2UZywE08hmw8Cn7IsXZ6d3Chc4YQyqps96y81MRGM4Hg80PH4
-QsPQ6Uirrms6Hg7ax0EUBTEQFocKaIwl2yBmm3i2l8tFJyiIJLOAFfgKwCCwwdjEZHsqrVflRgC4
-xC2EGzaOYoqi5VNFhGg5e9BgFBkqil/ooYwIOhfHRcpUxKFox3NIasboFu8efTl4HBbFB2/Btp5o
-2Syt2B02n7n4wJmAKVl7NtvO8npI9WaeplGt22wrAK5AmiZ0Pj/YFOUpbMTmNtpcSxx6zDdxvoNJ
-QnoBONk5STS70yYE//Wf/2ffQPSRhccz91BQ/Z6mcabXLyeqSo63ut1vOpsGkARQDn8WCwisrK7v
-1AocJTn05VhUGAWiPISTCUon9Ib7vtF//Md/0ffvX+l0OsnDjj89LLQweChY7IyoZrSumzobwVVl
-mmb1ucOf5T/PNycz2woaZTFCLHUX5xag/EkcixHDJBhEwcSatqWvX79Snh/px49/yO2z0evrScRT
-F0+jjkBLEiYlemVo4e3CxILBdyrLwmtVGNEOleJspzA8u2bfBRiYWnT82Y/BzfnJW8iM7s/eRrAl
-up2hI94Mz2wWPYnFOjrhwNvQDrb2GtW4hKvJ3szKJzocai/RZ1NyTaTP14Ggu0aF48BlVN7ZyKNN
-y7LU+055ltNOO+0bR6zbCoX5J8wzGA3HwOpHrL/CPM/09vZGr6+vVJn8Qn5uoefpgM9pfQDsWJcN
-XRKt9mxwDVc1MhW4Xn/bkaDr+jz3F//xxw/OV68qCgJOkrU3LUqaZVnocrno3BPA2f1+13x7S/2E
-+g8nOqSdP3++0eFQ08uRJcq//fabkhsQuYWe7tu3b3Q4HCTOOvRGbtiMt9uN/p9/+WfVA+DfYyyJ
-FCLYPU3zJA4vnCP38fFBX758Mc62uc7j4W1n2Yp2FJTEEf32+x+GBMIbqK4ryrKczuezAmR2k1hE
-/Hq9qh4dSjkg4hYwtSSaJIll1p/Q77//phULeA7PYZqoMGz8NW7sj48P+vr1q2fpZclHz2vBjkb3
-fafb7U5fv37xHIJA0GKwi2/Ipm01DgzkpH3f6MePn/TXv/6FyrKk8/kieE+tEWZJklAUZ/R43DyU
-H1OkX375hb59+6o9tG1Vn1OJizz3Lhx2lrrT4VB7gKwFIDHxcJVb4LkstW1Hr68n7x09j4cRjwbg
-+euXr5RmGd3vd41J37ZV1+RzeKmdntgRYZrE9PPtg5mgJi0JeFyaJhT/8fsPqupKuey//fY7ZVlK
-r6+vyvoax5FOpy8ikug8Zl5ZFPLQJgnNyJVpt22rF+SBRWXde/Cw4CfAvnCs6uu6jpqm1QWfJLEu
-GvaErymKKgqCu5bb/N8iBTHnmccyqDBcpFKnQNO2bTSNoyquwLiz9EssgGVZ6XI56wMFCOU4BBFn
-0C2jsvKsJBU3Og4yEFj6fv0UxmLj1qwfAyzGcCBi9IpDfN+JLpcrH6rk1JTou8FWs+QW5fAnqQHb
-yJtwWPvsZ4rss20b5tlI98V7B6sySRI61BU1bScWaNyboy3ELw56PSihC2KaaWJq87rtROOk7x+t
-E+KwiAKdItjDE4cR5NzbttHH+SzMu/STug9gdJ45TQx8AJ4pvTat2Y0TdyWIKX5mPpNmNYr5LJ5p
-07R0PNYyvs0kKHSj6/VOdV2xFse0yZZqDx8G4B9d16rnIiqluKor1YOP40RFkYvSjIU9ccyimPP5
-XdNdLPI8L3AjybUaCKOY9n1Saa7NWbMuptYJaN3gmJJr8gpuLEhl52XVGyOOWcqZZaNHckAfzH8H
-+w8UOZdpNl3VGmJO00TzHEh4ZqMLDZUQx127GCyc2Fb/jdASjNFsUhEzsXj6YEMt0Zviz2GEiA1t
-Kc+KbcQuLwF6cR4RRaqtsEDqMA5UxaUab+AgfTxYj5+mibI052X1jEt4DQbaEqFkBYfBhqy6sacD
-p9CD8vPhgwkbP80KCgUf+P33C9V1pUSleVm9PEGMtNgss5SNcdafz6PNUdZa5NmJP0uQ2Q0pexpD
-TiZB+Wldrs6JuG0bejweGolu9SjAssBUxESjbRvNdXh23IYy0nkgROqIbL0K0pQFdUmSURzze4eG
-oSwKut6uehkREX18fOi0Dqa0vJYjBQEfTcP2eyzjLZkOO0708vJCdV1TGOYUBL0ackRRpKWQJSWg
-fEe/cblctDoACgymHfvR3dQbAIcO2gX8PbYMswmreEnny9UtpDRTkRBSb4CUcv4533Jd39NNgitQ
-ygGF5e9IQmtNdAoyyEa6XK9qMQZ6JZulxCK84U2EbAR2P2o07z2KWBYMIo8FRO1iQ0UCu67Hg0tA
-VFYcfRV5IJUzLEloVSkxZ84fj0dh+SXqSmyfK4AvtqLmw9WnhDMNeJln5WDg9gpNFPefzbP9xOld
-M+u3baM0K2hbF2qaXtbVwR0g8+IpURXNh6RYvP7SNFMyUpKkaspZ5DlNs4u3W8RNmLMlElVoWotv
-jEJBmeV3ihbVmcJUVc3tY1lIr+2APBvOiUPMui8h0s1WTlmWm2kNqxvvj4f3XJNEHIKjSByqNo1D
-CyigJC0ojlvd5OAgANM6n6+UZamavha5MAybhtcGEakHOr7M5XLxuOg4JR+Pho6HA00S/gGzBqDD
-IEYURU77tsn4atGpAd82mR4YUGfBZ9DJXifNn8szSQA2fQ5O+LbrvTEkZuPYqEFA1DQL3e53AZJK
-lYau66oBmU46GcrNTpRmmeQWBKqWrMqCgjCkvh9EMhzrPBxe8UscaWiDvVGeyU7Pv6wTEUxSQd8F
-MwyGlTjE4AMHujZcedldt6Y8S6k3YN7tdqNpmuhwOJg46ZKSOFZjUFs98MKOJR2ZDyV2XZqVUPX8
-nWxCEgOMbk0kScYmHfNEnQCVdhNWVUWPx8MzEIWjjSVcuQBTpsAGAXtCwpwDUttFbOzBF8EhkiT8
-5643NzrFwY2EX6zJ9/ezOgRjVBwnGQVhrCU26x2I9j3+xGjV1lCmES7FKfVjxdKUwij2Mv9uN97w
-m8SRO+4AiaX5LKK2WcaxqRvBhgHlRU2Pe0O7HKhtKweFfFep7CIZIYyfiAUOuAo0R34VcQfLOWNv
-JmlJBmlWmNGDK33gvsJAIJRKszFPiNUoAn1MWZVavqu5hqgWp3kiokSrDPi3p2km1cAq38FVHXya
-PtS7H5RQvDCmTg56A/R9R0VRahINV0CxItjo64ZxUq06iC1JHH3qoe20wsqtYT02zwt13UPxAf6M
-AXVdT1mW0+n0wrkIcqNkaUr3x13MSA8MgEUhLesqxCvHgDscDnR6OdKyrtQ0rQZ4ctJy7JFZoCdn
-AlbqJLOGBu58EXpPJMY8DHY75pj0iLaVtQebuX2BuA/DQFHIoBqMWzEGtF6P4GLMxpQzzQpa2o5W
-STqy7V2aJhIbx447uCBGaVux5tHuWZo7nKPQIvOUa9Gb2I7lrKEpKs08z71wFYS8IutwnGbPdsy5
-WO1GmRoI5XjwxqOY3tiUbnx2tMvT/Upt11IiVShCZWyoa2xzw56BjHVd6Xq9KukkikLJI581hdVq
-nfGl2IRx1IWEW5B780mpqM9BneB17/tGeV5RkefSUnwOa8SiBkWZjUIi9exHxgFRoGKXKAxc0IkZ
-P+HE//j4ULeZREAre0O/v7/paAfEpFgcX+D7Dy84INXjNFFlCE72JsOhCOwECa6Yiz+P4k6nkxB/
-Mi2LucUIVYTFFuzsK983LXV9p3wK0GSjOKN17Z+is1Z6PBpqm5aOLwcvPhsL+M906Ou60eVy1o2O
-9+QCMbmf74dBSFLbJz1EkqQUBItiEM76zM3ILeAI9Sk7B69EBlBFxWrp6mmaiB1YIsSwTN+FdQpO
-00QdhqBKZRDyhYg2nY7Y3r/veyrLwuYt0FsAACAASURBVPEbJEQEcXaWyo2KDlULkrFgpmonK2hb
-7veHYkb4OZjaIbsClxeqd45YPyogjACRJEnVOPbRCItxXVcaJ6fEs2glKKUgcPAIcJPEn0RHDWx6
-OSvPfBwHqirn2mojqPnPOqou996bh4rDRinUPxMLj34yRqF8YHV9T9M0eo6qTYPbfZWXWCr6jI2I
-AyESLQP2QlEUVNeVxnLbA6wsS6OTZ3szBGryz4vEZiygqixpmifjbLx6Cr4oipSwA6EQbzL6BKzF
-cUJZmlBelHS/32nbO9G4r95tURQ5RSHr+d1t4Vx7mBCy0P3xQycmz242QeguAz4Ad2Wq4TDA4W0X
-dZ7ndKgr9jMU8VMYhrStKyVxTP/4x6+UCwMyzzKaxfrbXgIKcE6zR1Z53tCWMfqs1AOuAhsuJZ5N
-rsrEpGYWPUXXdfT6+kpxFKuRiObsrSsNfUOTjBFtddy2DRHt0pIl2mqi145MIKnVXjRSisOCnsvx
-Tn+vzZGEliPPc2qaxsPEwI607xDahLquNEUa3xkEPOazcLUdWw88e+Oh1CjLkl6OR3kwm+fistNO
-AcEgI/IAlbquKI4iuih/3r2wxKSTgPPP1NeESiEbAfl1Cb+r2eSpviB2Q0kUGErk4XE5zWYJmA7Y
-OfYufRU2JnrLuq4oDBOal05vIHvzgEc+S4CHZb31IqLad6IojilcnGmHS/oJ9TZlM5FM9Q3gy4ON
-aWPEOVPvLoSO3KMyIwYcVlM47X1XZbYo43BTrlC6rv3kD/D6+qrKNkivIcxJn0apeJ7suhNT1w/q
-qwfeQdt1lKSpkxiL0pEnPInmMwA4szHnwBCe0fZnZybo6i2vZF4cym+5DrfbTcwzOmW3vry8iCPU
-qmo/ENpcOtOgoaZ29FlVNVVVrRbr+IytCTt1lPbI009gLVvjGJfo4zIGWOqbmkxB8i7G9/cPIf6k
-ymnJspKicDRs3VAdj1BBb9tGMW76zniOo6RlM85YRnKjUj95bjp76C8WonK9jc+7TT3F3PX5sKmq
-Wkk2P3/+8NBllMs21RZe8rsAXxDGbLLZgG3kOfsKwJ3IevbZ8RuwCm57ziJdTnU6cb3yXJ03Tqdo
-q69g23UBYvPYX1aYoU5BWUZxktIuoBhaAjxTHNCY9yuqLGnJ4IdbhmCaZnqjWx75MIxit80WZvjs
-VVlqBef5DsSRtFDkvQ+MNWFC+uxUw+X9qDN56/OfZgUN96uX/GPZhM/CqmfVnB0zPh4P8YUoTby3
-09XbfhqXQJ5nMhV5UYNZTKKWZdXpAE9xCmfxJu8mTWJ1KMoyVk2GYUBtP2mlDI6GVU8iG3AxEmUL
-LDqTkpKCoFPlYxSF1LQt7XujVetmDEAhPgO+1feDxMjztKQVJ2LwZ/7r77/Ty8tR1LMrawGsVXQY
-htR2vTd6243PWRzF1PeN28wmhhu3PBMkBo/E8owOW+GDqs2CgLZ1UXIDQAvbF9l0H4z7+CTPdDM1
-zUODH3XUFoUq4oB0+LPHn5GeykPDCzydTkJ8yo2GO1KePZDxHz9+0rYudHp91enB82K2JqH9MNAu
-4Rp4NpbhRRRou4SWjJ2Oe681AsEHv3ddA2HKxZ+ixCXky7x314/inWI9EDmQad12BTzZ5mtQiykc
-/PAfdLNzpseeXk+C16zqP4FS/XZ/6EjWjnOrqvZGi7bkT5JYx6NFwaxKtEvO2nww34MoCgMF4NIs
-o2VeKM3YnReTKhyMZVlSnmfU0+iHoYwT7Ttpa8wWdK1ueADfIFsp1dpkXH6WMjuhF7cVRN3S6xQJ
-E4nAxLnbSgQ5CGinYxPJnucFt5nCASkKVtXW9YEejzvFQLSxmKz5JW/SXa2q3Q2TGlBuo20LPD80
-oP0WbMMLAI6A0gdaaZhBgoiSS9bbc2Q4b1b3RTkUk8eFO+00DJ1Hpd33XXuu6/UqAhGrhXc2U1DS
-HQ4HLbNwkyJNKIozSpJJQj9TWoJZudUw4cyyA3398oXGaaKP9zMlSawMrOfvY/tauziMNYv2sPDm
-n2f3nPDZtfSV5z8MA61mNm11Csg/BMHpcr1SmmaepNtFV9s0IHd4fXx8mDATly7dNK1OBLhVDBXf
-iCJJIzIgIg5/vgk3nfLAr3AypiLOcJOrQAZNI6k0rDMu/3dshMlIy2Htfbs/mBikSlC+vXdiKnQc
-x3IhrbSu/iGOUfL9/tB/tqQiUL6TxBHh+n7wQkTsYcsWfKlJpHbOvVh/uVCO953X2DMdeBgnbREw
-jcB6qeuKiDiKHWzDMJQ4NowYbDgETheUgG3bUlVVKvFFTwGQyfKkUVE822WB1QfjQvQ6UOZZ4QIs
-smezuC35xQkoDEAkxgi4HVg/PnrcaHDwq6qiq5B78MBtJh2kybuIk1j622kbge9mxR/YyF+/fpWZ
-94HC6EH1gXtE9PnAIqBu8+2lt0+2YFyCB1rCzfNMwSdTDCdFZbAv9iYcKI0BGsHf8P64K/BUls5/
-Ds/6/f2Duq6n4/GgwaexAHp1VdHrty9UFrlWjGiXVFOywHyyUt4G2HJcfWy0GKeaJEnodn9QEscU
-SfApAEw7ckRbE4imv+3OHtMRLs78eUhUkX47gfeG2bjKhbOUxnHgKVKaUtu1dEpPXrUbx9x6ck7f
-gaqy9LQAcZw6x6h5oTiKJfjV5T5aQpVrlUbKMnqKy1s9N6yqKikVlaq1xcdoj4F3J4KaZbqDy5bF
-fA+1oI8ZLY09iyvLVtt3RhYPdcVzcJHE4iXoyY7MPAk/DAjpsJEXIoGyLUtTleZawAW9m81tw2GB
-Htq2K+Dtg7mHeCeYe2CchfFMHEe0StoO2GkudnnTFGQbZsKLdvHENwDa8OecRJMPO4SB8uEYUZKm
-9NvvrLMoilKdaa17z/5EdsKNbq3UbE9qqwX+PQzALuuiWE4qzxE0W91EK9teg9m470RVVapPHrIL
-932jPGOL8K7rqCxL+vLllV5eXuh0+ivNc/vEhNsoTXPFCcAVAXGItQbtJw9AVH+w8goCop9vb9Q0
-HX3//u1PAzBw6MEU1YKm8JHAJsF4FRcXbtiqqnRjA7tBiZ/nGT0ewSfLuHXdqJ8mzrwoS4qTjLau
-M9FdTtY+jjMV4vMAQ5bRmLpglBhFEdV1LSBeSY/H3RMuWTARmAvovnYigp/7HKaCaVaSBOqLEIQh
-ewJaRhZSgJEEZEMuNqPxd+UO+O6uv2Tb4UH57JYVlWcZbdtKNzlIMDVAP2/HLNaEAX0hDpw0zTVH
-gBfP/km4YufWuO3neVa+P0YhlmOAMAoFXNQfYPXCSTCfxonOlVRnXG6ci8zj0dA0zSLeKJWogQMD
-1Y/1nHs2n0SLtO+Tbm6k2UK8EgaOCQduP3gIalohfzdKaE7BTYWh53sz1jWPPYvySMM4CcmqlP44
-F975u5b4YOgh4NPansF6e547r0e2mgKLC8VRLNLVm1YXocmitOsEmx9TCqzZosglX5B1GKhccaCr
-wCdnEA2VAzgBcRQpr8AeuHakPc0TrXJL2/wHbjcOFEW9176MsmesCQueW56l6lptLcnsFAS8gDRN
-6X6/e9W0bYGex4NWIevWQkTBv/3b/9qZYtooZ1wZRcY6Gmkybn6/C5jnct7x0MDXfiZw8I0j1NWu
-V7oq00Ij9h6QPHhGsl3AJb5IlnHENOKRkC0PsA46d5h3wFKJhSixzlURBmFTg/A99n1Te7S+H6gs
-SyLaJXGWtedd12ugJvrpYRxUw2+NTqFyW7jnojCKROoJg5Fa/QmWxaUDwYIrlpt8mmc1L2E682ZI
-IKsuvOfIqGfVHlRy8Dx0I7ZAmZ84BHg0W9LQ97TJZtnWnTqZvLgc+0S16mCJ2tYNKc0+m3AR/In/
-rLXvxq11uVzoy5evaoltAzJRsmNtVGVF/dDre0cJDYDZovkQOHFbtMlG3w23gSdA8ICAlR3WmPb5
-wq1gnj8JIJ24+O0woG3bqWkeFEUs63UXlPs70yShNMupF14LLkS0TBB9Kb6SZdQ0jVa48FV8fk5Y
-NxbbwUQpzwsKfvnlX/ckSejt5086vb7S4VB7LqK3211CPRJ9kTj9vcy6hfPXh3HyaKKPB9ty42bO
-80xpnIiMatpWZ/vw0sNt/v7+Tt++ffP018vi8IFFmIMYUeJhIUL7fL7Q9+/fPPBoENWja1OcwScA
-mSxN6NG09Mcfv9N/+2//3SvzQe+c51lyBchDteM4EZQ+ovf3D3p9fVWRybKsn1yJcCjiMxciiZ3n
-hW63G72+vmqVwDRpbmcsEARDC4wsUeHcbjc6nU5edWdDSq1yDjiBVbrdbndVs9lRIByTUS4ji8/Z
-wjH77h+//kqn04mWZdbPbOPAcGmAjWe/CxHRP/7xD/of/+O/U1keqOseYi7TezJyjJXjOFaeAbIL
-LpeL+lFYnwIrakPLaydW+PXz5xt9//7N4xpgfQP3QptmA0MxVYGfAg5KvPtcQ2EWLwnq2W8A2Qwv
-L0f9XGWR6xrLs0xGhZ0HHLrq80Ffv7yqOOnZhDZmU82YTq+vdDq98MvoOu0Zt22l6+VKlWiPUTbO
-UsLB7z6KIhqeeAG86VftU5yIhP/yZYU5BN/SWcoIbSJxUvZBYFxk+QNg9m2b/J3KugM5Z9VsuUE0
-43GcqJTXJsBYKzHWPPDtdzy+qOEoMhTBvOM5bqSLDYSd2/2hZhrTNFNVTbRtsUF/QzWNhD06lGLI
-xmN2YmBcfgbdOEweSkUMMutoMUtTmgVnQfbB3fSQ7obYlINuzVEhKbXEq2ka6X7f9WdyDuBdJxsg
-hcECHEy2fduoHUa1JgeTsixyCbskYzk2uUxHmSokSazrkO3fHxLCsXpVQpIkMhePdU3N86Kg87Pv
-v93kGJGO4yi2YEyXvl6vKoACeSc0VdHz5sfm7rqW1jVTlicAVqRegYNgR602adn28mixl2Wlqip0
-BN20rfr9hWFIl+tVhVP8fGbKMlaOAl+D1RoOfcW2ImECxlFMh0NNURiJ5RZ5RodFUaggpGk7mpdF
-mYPPQAVONEYlZ01Cga+c/SAIrkSJdrs/vNsUNxx8z3ADq6uJoa1icuBe9CpBDIs+YHvKos0BNmBH
-M+62dic+0mwmMzaCXrws2EkGZSnonYdDLa2Ocyy24BVoodYsdds2bW/meda4KrtwoTFAJaU25eui
-hwRs1/6sHQB2AdYiosgta4z1FYPLXBReRNO0SjypylLLbDwnPlSIGgmz4BaHY+E4NXpSZSJYiNap
-KBbgkINESmrbThe2tQ536cetJ5+174BlzpOuU48GLsQfTCR41JZRUZQyass0um3fd2UpWmIRkHbn
-fszvpxY7L9iZ5Xkm68YF0jB/gygMnRQZlZlzhuJ38Xo68bNJWGDHbUfogeUAHsuypEK4GWhZLJ4G
-3Ot8YXel2MYiIfgCNwxTZU0OWxR7Pms+FdWVXPgizNKKdeYLP/M4z6iX8EeAaOPkACH8TCLetL//
-/ju9vLxIpBgvpDlY6NG0XriGG2WuOv5p205jnvIspTDk6iXPUpkBJ4bItOimxKGBRQXTURxy1tdt
-ngUDEGdctCNFntO+kWYYWP4BqgUsbNhRW9deq7C0s3lEOz8n2nh6dFFs2pGZy5LnEM04YmT88Wgk
-vgoLZ5VNmEmfztoMBH7CiZlluKN+J5vyiyonimJl16VZQTt1NAyLylez1NnNV2Wh9ufruqpZp+Nn
-HFWObMVkIGTZGDAm6iQUSMm8bs4Sjd+fA3JByy4lphuuy1GUfELgIWj7M3tykJKimAHMuqpoGDeK
-xZ0qz3NJ1x6Ut4CWBe/w58+fdDgc6HA4qPgozTKaxlHbVXcIrJ77EGK/LGEqjie9rKwSkNu3jWJX
-Ho/GmCLQMlZPwHmmnz9/6ikPkMSimPu+UyW021SopGEYeGOobd9pltIQc3dUAzbwEQBREIRUVSUd
-DgdOVF0X1iCI44yV48Kh1kYoA+gDBoFblkvOxRMq2VIZBwp82h067OjIOMnnZRVMYvUW5DT11PUd
-Xa9Xj9Jsx3Ef7x90fDl6VFa3eRj881mHm6q7rOz12VJ9N5Ro9Mm4OTkZ6KGLuCxLQcxLOp/Pn7zr
-4jii//P//St9//5NMQ8bBrIsi44T1RXKuOSwHRVPcLI08aSxSZJRnvOBZHt5/Pemab1wTLRfFmAE
-2w6tnHVb6vqBvn9PiCTvEs8Ehyy3GYkg+osahuBngsoM89YwjOQzJtKy+mKlaZqVCTlOPHHKs1fJ
-wkRQba4EtGVdVLm67zudTi9UVTUdDgea54k6AaKtRN4e9GjHqqpWleGjaQ2uwM7M6+pT1uEvGC8y
-p57n0HN5sf+LB4vMPkdbTdQqCeMoiFt2khe0OQIGSmrcnogQx/+PjYYZJ3/HnV5eTsLOi2nr7nqj
-Kqde8uND8YIDkAcqZVWxDBYv9dE0tK6RF09lfzl6sCuXY/EpaJqGDoeDSJFzCsJQwjojb6Fa4onl
-9zfNw5NwHl+OdDy+UFmy0m/fSeKsuTyHvfowjOoKzOUhfepr7cjTjuAsDXX3HKADmfowuQT+BwDI
-wOmfppleX0/05csrFaJItHNmXADADuzocppmKktHDgK2wfTWmS7i7hQEJBdGqK1dGJY0jhPVdc0+
-AuuilwZixnEQWeCLJzwgoPV0fzwU79i2jcIgVht7bb8Ef+LyP/feI96/i0DnSikwOJdv4R15btKw
-yge+48bfkzI58a7AkQkCNrAZx0mswkKP22AvXOtSNIyO/IYWcjIBrzgY4bcQ3+8Ple2CPmjlspP8
-N6DISZKKvpwU9WWaa6w3QycLQI0qTUoN3Fng+gK7JBs8sa6rKu7wq20d33oYr2okse87LfLZ9z1R
-BDxN+eQGH7vrB0WmrTIM0w2O8GLbKyjGgqBQJRximSwZqWlbdRlCUiwSaCDwsJlyXDq7LARYU2Vp
-quWok25uurj2fafr5UpFmWuqshqYxBEN46qVAwhPSLm9yThMy35ZQNzHZ5RlJbXtg1q5odHHWjJJ
-EATsE1my8Ibo/hQ+4oNYDvz1tfw44LEZ8Bxikc3O4kBkQ0fgorNtG3VLb9qw9UnItXnYCrAMGIpm
-4vqDfh5O0mVZUlWW1LStWoE75p0jDKEtRXXAaH8kbY+j3oJgY63VQPbBhcr5BuQZ0mDqsa4r3R8P
-2ve7THW4BcVkKAw4uMUd4NKOhTENox+jHoahOk9jNG15AMMwshbA+tKhX0TySdd3lOWZzjXZGuzx
-xBHgQM1QLLYs1RLltJMvBiq9hfBi21Z15F2WVVODMGXAaWZvU8x6ne7dKezKsqSqKukuIhM82Lad
-tT1Bmi9Gfj/f3lXjgEyAXPL8wJyL45hOpxMdjy+0b4JBxDFt0u7gEMDBp+GVs4u/wk3CbjGLZgEy
-7hB6M3jr9R+EgWTaH2gae1qMys4SabyWYHNAkIt7W+h+v9PhcGBXob75lMIEEA4TC6yPtm2JqPW0
-+RBoobpK4kgDO5JELhGZUbvwVaeYcyavPNZyPgfMqDx/XDwgkmPGMxW32LWFQwtVCzz53YjTgZxA
-5IuCPQSHYWDTmzCgcVxMS+ZuW8STgWPvR6/Fyhe4XK+0LDOVZSXitVFB11Auq2dDHJurYZWvmAbg
-n62JiDOlnXSK5KL5XBYhJmzTvKgXQxTKCN99CKO0iv1ZoiWQYPNYamwQBOr4AlQfY7+u7ygXBN2p
-n7hE32mnKIzo59ub9vNsKDIajr0b0VmKMkYxcFfFGKiqKuq6TpFQHDh29IMbZFlWKoqYsrygl5cX
-OhyOFIaB2j/HSaoVADYHm1wsLo9eNgfMLKuyoLyoaZlHzxAEtN8kjulyvXJvKH1zFAa0PGED+PmJ
-ADh1XVNdV+LE7KPZhQpFds/Gehg2L9kGtxhGXM9pPIqwBwENoj4DvdiOS6391DOmMU4iy4Zl1rJQ
-ludqyMIyYTeLZlAvURmxL0QjejkdaZeRbCYsUgvOPhuSRhHEQUiCGjToBJccV66haDYSEf9wG5Bm
-GbVd72VB5lmq4itMw7K8oFXYhJbotkWbVmiFjBH18JOxrt1n8CC0fhm4iGdZUzjcbPYm9pm1MnNj
-2MTsVwZ7kzSlaX7Qx/lDHLz5GcQ2ywyl0zhtZtzyORrJqrMsOMPosU9dtBZNasQxjDIWiuj946xj
-M/TjQH2xCWx8ts2Tgy6fS3W3QFFaVWVBj8fDW6TzvND5fNYbha2+3vWGYCCF0fhff/tNBS7jOOmt
-ABtmHCQWgGra1psioM1pmodyENqmpbIqneXW00J2GAxRP/QUxVy17NtG8zR6i9NOFhhoS5QdZt+p
-9SPAlIcP18Wb6GA6YYU3lvyCxYsAT7Q0ALjAVGNEvKQougquMyjXAOuGXY5n2Yyh+ik6diE7LB2P
-B6qqg1fa80a9Gusxd2vDGCPPMrpuNy+OGy0LvAiAJaVpRuu2qxYCLVYYsiGtbV83aRmxJmy68az5
-h0w/tjoNJuMsyq8AGOrckzfvGSsHQSjQVjNjMQmbRA3qMLCENE1op53GoRfODnshHg4HbgGArEOj
-z4y0XsEdINvPiiwk0GCOjLEOIsMxorBiBSwwlIcMeMUUBAzURWHE6cTSR80zM98Oh8Mn+2nwmrlc
-T8UHcNGbgogoF89C9L3IJ+DcuEzn85aLD4sv0JXZRCM2oNb0yZ7KVkJMmR6oKBI9FOEspOEgL0TH
-w5FSER75FF3XLyPXD4ku88I5gJbK+mljy4u/y8+1hpqWf992vlmGPUDtXB4tEOLabGCGFXrhz9oJ
-wPl8Nhs6UWfmYeA8xmVZqa4PVBY5ZXmhh8xDQDuOSmv49g4CyotSN8q+D588LJ2eRSTRYlKC7wHc
-YFlcXBgOEBuTZnMo9t2ZlvBkizUN+Fncpq4ajwcW7SJKSJf8tKnoDKnPDmid1JnY4hqh2W/AkIqi
-pL7vtN3atthcCIkn18cB9Hg8lAF6OByoqkqKYXcH5pSlQt7vD8pEj2+jquwiRYmyKCNw1ROLU0p3
-ORyc/DfwEFCXvxbHMQXECD6TJmaa50HHh9bFh5FfFzaZQX8g5ZP1JLhcr8KmWtRfvyoLojwXbfqm
-PTsbfKZqWR0EAX379pWWZaG6/kLjcFcpMFEoICGpHmIyPIayZEPTMAzpcrnq3+0wj43iJFYHInsL
-WLYZJgJqQybvZxydlxyio60jLNx0gyD0WjVMWDaRsgYBefRce/sCT3BuTJnacAOgA6kEQhuLmHMv
-7SSzECJtst7GcZRcP2YSrsuik4/D4cDjSvFuWBa2PR9Mn2uRc1wy9iCwrSJEY3YCYinQAHXBEMUt
-/9xeWJ69TW1iZyeeRAFsxTpnPkwp4buBGU/7BqsWI8P3G8ZVR9xwE2bPST7MIMNWz0f5XzsV4e/F
-QbvWkux65Si1uChKmqabd3IeDrXEW9d0vV692xf8ZqSyYgpgT02AOJawYckabla7Kz+6l1sCYx2U
-UcgTiMKIpnliMY25eS311rYO6IUsZRS32jSzX7z1QRjGkTaT/oNxUt/1RDTz4SDEFBsTHkWhLmhO
-nXEtRLgFtCwzHY8HPcS6vtcTHCM7WEut624qHB75pWJT/scfP+h4rEVKnAqwx3bbuHUgqx0nhyyz
-x6FTiKFCwvvADe/Hu6fKZ7BjUsdTCDzlJbghyPxDBZGmGc0ilGLzWUddZmv3WME/Ta6VEebhcKAg
-jJWJiug44B/2wLRtihspj/qcnEM0eQeDOyxICU92fm5BcRCoLOiM5+aPCDNtefadqOt6ejwanVZZ
-FiMqHhtZbpmYMNwBRZ2IaJ4mut8fahy677uQgkiNci6XCy3LSi/CL4GtOcamODSLoqR4390tiEVa
-VZWUM6OW9IjucsQRvtFghBlHES3rSlnKpddzyR4GAS1PjDQXLpqowMb63sWinurFXgw9vAUmHQKb
-eOyoICC6Xnl8ZEEyK2JClDTAONt/60sfB/r4ePcimcFR4E0/eGlDFhmHeKqqqiewzAKLbj5u5/pd
-11NZEk3zTOEwUFHkVNcHlSPHkjeA8i4ShSH6b8tJgLwWbR7iy6ZxFHceFh1hpoxyeBxXD5Tb952m
-eaGua7Uys+w7TUaWf49Al34YtE2x5qiYHtgDhcEtxjsej7v+/dO8UJaltO+Lp3vHxrYpS2AiwlAF
-Gw3PHBMutHNg0eHPgyi0LLNOV6xHhPVuUA8IqU4sxsAj7uETtf0iNFyujCPBXBbT/s3aVttAXR5B
-rgafcD4Hl8tZNjq7FdV1omsLvz8gZ86jrNz//I//ojRL9cOgpIX/P/cqEa3bYkofSfSR3ngYNm9T
-gi/gSYrlFH5GjkErhlVREHJpDjMNa5zw3Cc/TwMsWAPTRqLJyDhZ/ZfEEbXd5L1IbCzEVmNDo3zy
-DTvJAzntC8Ehpmq1LOMQ0zBQ15gsy3T0Bd86bBoAskgdgq9+XddUVQcVDjnvQDdeRGAK2qimaeh2
-u2tVggWPDYt0Y9jCwbUXxhnc58ZPphKRUJ2N2YbhJAA4AxjWNC2t66ImKBYQ5ViyQUdWEALBaszm
-FHLbMn1yiLKb344zbTDLs7W4c6xCHL0TYvH7nzUkNo65dMdnK/KcWgGfgXvgtkfJ70xIIs03YPdj
-h12hXQTd167tHz9+Upom9PpaihhqMhkKibYbMGaFaApeE1vB1vSHQ61/N2siFsPQZF1G8L//9//c
-Uc4v80zDOHg9BPeyEfVDr7pt9PtQG6G3+L9FX+HG5EARUHwDBXyiiN1awzBSLjN03TjlsanYwTX8
-FJxp9fxEboFAZ81mi4GqoJxuPKQiLyiMIjUTxW1VFLmIPZzO2nIQwJo71AdaxbsAFQ0y7J+foQv5
-RK7gqOBhFAY0GSk1rL2GcdKF1Ha+A8/z8+XZdkGtxG1DKu209pHq2XmzoHVbqMgZB0HUNvwA8XuB
-2MNXARp5X1MvClJRqWlVKRLv6+1Gy7LQ4XCQvMORoihWTMK3fMMhH3qfHeIj56AUyAE+iKcCVwt8
-wPZeBQOgD6AwKwd72tadXr+cfFNg4wAAIABJREFUtDJhjCUxh88oB3eqAi42rQ2FkOYYkTwJiWkc
-Jx07g4I9ClOPqcQpXa5XXftEDAj2fU/H45GOxyMt80I/335SURR0PBz082Mtwfu/yHMetw6DXjTQ
-pAQU0CD6A7ynLOUxfHC9/rbzTDhUR1Jrqdy2Lb2+vnpaY4w14ohPIKCfzrfcvZzL5Upfv35RR16r
-94f3Gs9WmaCAvgsLgPPdvwn1k11mYcKICgEMszRNdTzFoaEjXa83+utf/6LEERvZ7URHpA7CTjLJ
-KsmPjw96Ob2IocTsudMi0ATjqkXn847Jd71e9flZTTyQ9XXdRLLM9GnccvaARFqxteC2ikRL/rH9
-7bZt9PHxQf/yL//8FCWWKFZj7drxc8C8y/Ocrter6PkXRZizlA+lZ7q4jYgDsWYcRjocOA14mSe6
-3e9SFR0ku7Hx9Cb2AICsFvbrim4bVyC0K89W5CjV398/6Pv3b58cpqwDERSex+ORpmnUGK4kien9
-/YNeXl68KghzeOt9uSwLVWVB67arurLrWur7gf72t7+yBiBNtT3G50D7neeZ4l+4vcMwob///T8p
-TVN6fT1Rntc0Dq2XVI22CjF5wLWwNrB+0HrhUtI2ezGmgX8W8ogYL2uhFEpAJm4fFr5MCijZ/t+W
-YPjv6NGDIKSyzETw0CtHGbxlB4bFGlcOA8k4ThSVRw/HmgZuP1LRk6s4x3i14wbAYmvbRok6jnS0
-6k2PHEGUp9a8U/UMBtu4Xm+eYalz/42EUryqFTYTUcZP7RFGQ3Y8a7n3znjCf28YVcZxTD9/vum8
-OstSTzZt26f4iebs3k9gpkCOM4/Fb3PqbOQ2V4Q5lUUhaTQLjdNd6eHbtnFOoIxcoU5LEt4IaD/h
-XKTsTEn3hUsvfPfQQizLSnmeGEk3UndjejStmtsCI0Hluq4r1VVJYZhQHC3eyNpKqJPYGZdYVisO
-z9msGd4vm7I+r9ebJ5+38lzGu3i0u20bVVUlNPaGbrcb/e1vf5PPOdPlevWi2q3pK/NwEgWp8Wyf
-nb7R8u47UYzACyugsH/AUUI/9952ZvlsZYy+ahI67zxPuuGdFJetmGc5rZ8XOv8dibIP4UNvc+xB
-c83gP1jwuAk88iAglb3aXD6L3qK3ShNOh7WEinGaqCxzk1w8GyLLqA8zjhOVsuKf+VncVeuAeGuX
-K+DrwwEQWp6B671jb5KCEty+CzviYv7+gcYxpaosqGk7baWgJEQFgPeGv5P/PEtVM9GCANMJJBIN
-iDvoyPvuwjlwGHZ9LxHetQeiQt/P2vtdD3/Wb4xKIc9SkSHLRGgTOq497IAl2EhxuAXjUJilTEbQ
-J6PznTMU2TZq2o7yfNUNjTVs21oO6CDFq6BezGWs7KqwWEd3WGPPFZoKkwx/AdbfaOkwieK4+kiD
-XG2VhJ9h8wJ4vzmMKo5jxaaAbQFgj7H5izzXcYzlE/PJsijDix1MQ8qyXDc1HgL72Tl98rNkM0ki
-DbgIlezCi+9Q15SkKf38+VNMPzMNrcDGQB+GDEPLCrRU5ChiZLUoCr5daP9To1CuSEhSWZDWOhmz
-ylTZa1kK0Gr0sv5A8bQbG1z1JGGtexRG+nmjMKBhXPXADcOIpnlUKTNKROX3h5Z8Rd53t4nO27bR
-7XbVeLUgCOjleKDrbZcw0Men719XlQJawDhsWTtOE23mgGmahi4XvnGzLBOW5CbMzkTJLPj89vYE
-Y47fD6+fKAyoaXqn4ZCpkoLD267qQVSZaDF8c5OI9i2g1QiT2rYTYBVZA7xJy7KibduNOYh7N/B8
-eHZmtll8qEC3fRc+hlPqDcOolSXo7kGw0jIvTz4XRMtijFyWhR6z02wgD2FZdmOiMyuIiwwPyNkx
-8rYVm1WnPrd6XdfR4/6goswp/vL6ymypNKW1abQUwwwVABgefF3XKsGF/591Ju06jtK2HxaUWNcf
-jp6QKM9z6oeBmrZVB5R13eh2v6vJ4v3xkEqFo5wgsHgGiywPIBWVXUCBZ4pgS22g7mw1NQnbLTIm
-IbNHj8VNaQkvm2S5T9Oko7RpXqjrB/rx44eSSzB+QfnOzL5RbpuN/vj4QWVVugBLUUTWRuGGPtm6
-x6CUzbJcVX7jONEshI84jhR7SKQ8t2V+lqUclilTCYwuq6rU3t+BjZkGp3DWPY8nWSG6ebcaDgOb
-6YjFiT8L8RZATqtBeQ5JsUo9EG4ADLsenehyuXr6DbQ4TDC7SUI1E5SemYGW7QmzU0zF7Awfwp00
-DZ8qkljbPahY0erZMbb1bZhnNmXBeL1pWu9ZLMtCI2jIZiqGdguf345+wX6cppHmOfcSsIKA6HA8
-MB8EdNTp8dAHDORy30kYXYOGdzB1eFXutDWNqKpSwQ7ndU86OoGtMT4gjEXyLKVOT1pGx7OkoFRe
-8jCMetAgdxCeeqPc4taIAuQcjCxRsj7bgS3L+icTi0gByUxcZaCkmk3OHghMIGhwWkzGTEMTdJnn
-hSz0jMYxMJ57jD2AQ7DvO6VZSl3b0ddvXw3Is3lKTRCesjRVQhbKWICJSZrqAsXYLgoDmmdnuAGp
-NDaQUy+uHIldV9piWJIYx39V6lMYhiGVRc6W6CbPDiWsLX2de02i3vRxnFAYhbStm1agFodCBWSl
-xsCKnvt0l1MR6cju9sSz53fvrN93E8P2PG6eZ0bkQRLChgSYyvLxRLgFjqWIdi0UFqIFVqFG9UG8
-RMfFRcEuVhaHsJs9oFjBcl5HgQfg4rtaPQ4mQeAsoKLN8oJi8LXxcBxXmU/waZ4pldub+7pB0O/O
-e1hYDEEQ0Cr5b9fbnemu2+opCJ2LbKiKP3uTsyCDZae//fY7/eUv3+h0OlEtuXM/39505omeHKXQ
-c5KspXsCRbb0ZjvPxcm+RpuqFu2N5Fucr9L+sLgCCy5OOGV2mltpJWKRHSdykE1edWVBoePxSPM8
-08vLKy3zSDcx3rD4SBzH9Hg8TERV5hFxur4n6nuv2nHJQ6tuEOQYnk4vlGWZUqgRplqUR9q2+VPF
-hMkExoPzPNMoVGhLB7csOugQLPKOtOIgIPrx44coSDfloyhbTsDR/YnjYct/HGC2J87ShGIRHmGG
-bpF8XDxsmjF5JC4ckGyAk6qGBL/OH2et1JaFD7u7TDfsRCaKInp7e6O//OUvOjlTebcp1zkct6I8
-S4nI187Y5KlWQHCAxFADguGpTlXm2bNGITMSbF5D277T4/Gg+M9UaFzGF15wJ060WVJxLPCHzVJX
-FWe7S8ACf9hAGUhA7HHyz3OnsmFnhLh7G7euK3p95SSadZnpLA4ySeLYic+RzZv5jHbkw5sxp7u4
-C6NEdDbRkbodzfNC48ToKlDz55EbQEqmsPZ0uZyV8IJSCyUmlGNAiLlfntVs83x+UJYJjXgeKYxi
-vf0x+nrOa3g5Msc+lQ1sLd3wTJxOfvdMK+ZlVTlsWRR6gADNH4ZGbyJbgtseX63TolgPTeYjLNp3
-4nDFyPNwONDlclZuAjZ+kpBKlCHhhevP7XaT5NzC8EEGHb09x9GN40ht11Pb9TpFieOIzueL4kvz
-PFMrAKSdellefpLEVOQFpUlK/epk6ofjQd2xGRjcNdcBgDUOPaT3WBeeRTz9JtMOBEGgMmRfq0B+
-cG/bqsLU3vwgFWEyAno52rJ5WbW1wXi8rkuKyyL35J/YFGVR0DS7P9A0s46f8OIReoi0nk3ah/P5
-orNrRnGdGy425jjN3uYFicZaWQGlZYluQl3/cKw32UDYJM8P1NqD42e9v7/r54de3AIkuHWswaRF
-aZ3sefEkmUREx+OB5rnwXF05y+/mWXbBkzBNE4mCDmjfNnNwMKDphFATe7qZWxAtRRxFdL3d6SFO
-vaAHA/EFcHW73eR9hPr954U9Bg51RXFSUJoOSr9GBqI94HGr2LEXwEc1qxThiv3vMG1BLDkYjmhl
-tm2jl5cXsQNjGjmj6pFyN7Duipzdl13oBk8BoC/ArY3LC8xFrInD4UC321VDZ4IgURwBTlTLsn6q
-VOCWhCp2XVdW1CUZRdGgNzXMRJ3lN+NSnEdZ0zyPhnPCFxi8/myLgT/PeMLiWe6B6m3zFTDpUnMe
-KfctM9bZ3ieCVTHLMM6LksaJFylLL/mk/e3337TEQEmC01fniQZouVwuKkApioLquqJlWalpWgmF
-jHX0Za2J8OVC4zjr22CH9Gga7Q9dEMksXmuJHihAOPn0TilNA6LdCUcQ+nmoK5qXVeiZIc1zoGVe
-aOzAYYuNHs56sD0Hn+57qkEnnEDLfm/TNFPbtlSWpUdjHYZRHWLiOKFoWVnJZyTEvAH5u9lQ0Xl2
-OnZUMAAyrZYBCwhzb4Sl4vlCznq93XUzwt/fsi0di85VQM8HLvj1zj1n0moKBw9GhIdDra67bftg
-3cE0U5L4FSBjLqTtVSrYjP27mral+/0muY+x9sr7TpI/2WubGYYhHY8vdDy+0LYuNM1MC7c6DNu2
-rOtG/dBTLpUS1iys087nd71t3QYe1CEaZDd2MUqIOTcPAYknFYW5qnM2OYqBmuJycvOm75q1CpzP
-gPW4rptGk4GvgurT4l5cAfFBUtcHillM4qyS8LC7LlHBArLXqqqmZZ4UuV5Xl3IKameepUK3jbT0
-fzautKorINdAM3Gzv3/ctNQBCQRknsejMXr1QF5i6CHkUG/dHw/a9tVTwRVlTdQ16gEAHjyMN1nd
-luttiSrGmqNYRRrSWGfhgaMsZmJKJr5zhUY4Wzk1FHx8szgsBhsIcVvbttHbzzcqypzKsvKANetS
-bDXlibEfY3DzqLc1+l1rMZUmMafzJgntu6tuAHbisN+2TceD2OxYsLjhbJDmbDQHkMxaPX3fd9Q0
-HZ1OLxL5HYt5hfNmaNqWoqdAF1Rvx+OLTlaCMKSAAiUZsZ+ePwKe55GyzGUaoA216Dp+b98PVNez
-SbMOdCScpSk1piXDBWRxqaqqtLobhlFve9zYaLsCCigMZw/byASzmqZRvSO5wpvUdr8ocvXPVEu3
-OJL8hVmNbXGgn88XHgHXXJHE1i6blUQZpVlGQcCGinG8UJZyeQ+qsKVC2sWaZynFSUnDOClYaH8B
-qXcediERsaY8TlIahruKKbBhl9mN4dIkplVuJxtEast1tB1YuKzIyqmqSr15r9eLWn7j5+D2xBwf
-6sKu68XsJBPwKFEWpANxOEw1Eedg9KE6KhSlZBQGtJmQSXtbA0fB3wPOhZ1H50Wu0muU+ejrrFIR
-G8RGVi/LKvHTmVqlO5s0wXhkRm/BUVexDFp6WuDWEltgYuH35Bt9vH9QWZXahgC4jGPmFvBtxKGj
-SRzr52aDi/apolm9cBBsyDQriGij+/2hmgjIaS3TkAlcHOJifxaqPDhFuZY49KTR+87chKFpNQQE
-z3NeVi9u/rlNxMibvf0mul459i0KI2W1ooJBrgNXcKX4ZnbKU4GxTZ6XtG9sZw5wnSvQ2Sf1CTkK
-7VSa8LOM7UwSHG42oeCF3ncdhWFNaRJTOwzad1nZJA6Crh9oE+DIctKfNycMQFGy9MNAJLFbAIyy
-LGdmnjEVBdUSVN9AXqY1M8HvY81BRUmc0On0Stu6eAva6haso00UJRrZBYqlzaJ7PB50udzo9fVF
-gSwQlkah70IyDUzFKsSAh9hEGfeiYvPyJ201YEtWVRVPQsQw02bbWxqzM5OcvYMG7U23bcpxwAJB
-u4J3aw84xErneaYzZ/uOtcSUmwh8BXx+PrhY7zFIpiK/4y9ejHsSx5TllaQsufeKVqlpW33/9u8f
-xkkXvJ2uwNTU8kVcCb+baO7QgN2xV7EiZSlNUq1skC6MFhGAn2VTgikI0BezfbBJ53mmL1++0On0
-QknKBChUNfhszzyIzISOam7F2Hu5f6hA7MQDTshYj6kcmE3zoBjKPCvssJziaZ4pk54YAFaepbTt
-uyb0WNqq3Yhc1vogxjg5yiZuArDMAAyhZOKxY0epsQ23Udno1VHyw2oc5qKQPM7zqGPKZwELXFMt
-t98FfWxebwj67Zcvr3QQemsjqKzln+/SFs3zTHEUq804LKQtB9+Kr+xhiY04TZNEj3EZ2na9Jt+g
-/bAecjCStLLf5wMZ3x2BrDZRyaLpduKBhftsDmoP0EfjIuFxC2ZpSmVVUV0fNB4bybh9PwjZiMeH
-DxEG2QgvZAPy4dvQ4VBrOc63diubNPO48W6s5yTfWZbqd7BVBaom9S2MI+r6WZ2ueMMuT8k67lC1
-uBEOvdv9oXiN5UDgWUIAlGWlRoDZz41n+vb2oSEpVwlqFTdflc4PIiBzhqiBF9b6bOjD7sZsix6j
-lLOjBqtoc1ZXIT0eiGXipNKP84eWjUTxJ9dY3CxlWaqvnY29gp1Uon27z36K88zjN0OYZC2sYeoB
-22WLogKYwfzU3kqWPAJN9rOqzi380Qsw4Zw2jn62Jfq277TK98ONBNkxj4EyfSmuCog8x2MrbrGU
-VhY8RTq+ZForcyHSrKDH4y7fcfEYjmq5JuMntGu+mMkdAE3TeNiLnaLAtAUH3vPY1s7r9ZCV38OC
-q8RT+hVFTlmWayDKvm/qI4DvjyqMiOjr169UlQWFcqg6DwG2cGeZLvMzYPHFfg6rEp7sAWbfsTWN
-WbedyiKnKY5Vrm1JRnZUCBs2Vw2FmnLV972hsu/eCBcGnaBzW4GRnT5VVUFfvrxKmlPDIaXbRjdZ
-07x2ZvVntGNB29ZaU1f8vn3fKfj3f/9/d7tx7cw3FLtviG2ut5uaemJxBgGJq04hC3xRFRfIItAf
-R1GoKjjLhLIe+GzQaUUYgWao//jjB72cTlRVlQI4uMHiOFHWGHT2WZZJf9UTUaA68s+eBYGWgnyD
-BXIqx4Z+G3l6ajL6AhxQ1idh21Z17kG8WZZl+sysRZXrN2NBuEM1jYS2nFuSVRiObt4chpFKQdMk
-pbZzYZnI+MN3hyEEpwFFNAwua36XcR407Ha6YDfMIunDaOGs/h6XAbcCiwacwNYKzxWbUBmKhm6M
-nwFjmqZp9fDMcx7vLfNM4zTq2liWhcqylIPe4kOboucMRs5eGMk4jjKhqYQMNevzhFEu3jdjLrGO
-Nnken3r8GWBB7qBwBwuCW5+9NRljspcTee5BcRxRVZYUJzndbmcqi5LCKKDb7a7rzrFgI90ruFSm
-aXbKv9glC8G7Ifj113/fIdN8TvolIrpcLvTlyxeKolBBpKIoVc6JGxkGC2AI4qa9Xq/07Rvnqz8e
-Dz0dYcbgypKJ47bKUllL27bR+Xym0+lEQRDQ+Xym4/FIr6+vqiN3kdKJGB+MnhHk+8eFXl9PHksM
-bEf4GNge7tkI8uPjg+pakFwBqKwJiWenLQpHRdjHkbquo7/97a+0w9BTKgObHPOMl3C/x9pxfn5f
-lcCEXxgrAYXHiMqSoTiKjIM/fYIQSYzaoJMRtEi4PaD1uF6vwv0PlCRm+Qzcd/pluEWdf/vtd3p9
-fVXQ1YpnULEBVFXbMeN7//PnG/3lL9917LjvO/3xxw86HGqq61q9ALHpt23TidG2bdQ8HvT161eN
-oge4CL5E23b0/fs3Korc+OVFqnK8Xm/0/fs3D1vBZ8YzR1WG6s3exOfzmf75n/6mVvGImEOLDRfu
-sixoWfx9uO873aTst2vStjqwCs+ynF2C910BP/aDONP3798U+wCXQr0b2cW21EVhbZh2b9Qza4nI
-Wee5fnkXOlkqBx8v0aHxkXAABkUln9F7fHkAFpauSyRyziKnMEw8vCGREeI//vErvbwcqSgKncNi
-zGONLc/nC9V1SWn64hGg7KiR8wI+aJpGp8+WktSyB11O4ua5F+OfU9EuXB4PtQ+zTrT4TCAluZbC
-PgNSQ0rrAGR15Tagwv67+/0uY8BYOepN03qtS9/P3ndZxH4cd4G9jVB58Kw90pucJasBvX+ctapA
-fDrIWn//+y/0ejrR129fNdHmeVIE+ioTnZiNl0i4BrgeLy9HqqpKPSIw+gpCvqTAEGUPQwZxATbi
-cFoWXj9fv36h0+mk3pOBxsxtytFPUTGJ8atNLE4MO/J6vevBhICbeV5oEuKP8vnlkEmSRDgMBZ1e
-TrRuzJthKjNfAAjpseAkTETQpmF0CpLUYFijTBdnj8VFzG9ddTBSjOSTZV1lbr+YkyXyNiGALXt6
-ObnvSn3fUVWWNMptjnhoeOWjl4WgAgvL4wjEsTrj2MMB6Oe67XS/X7yHwWwqLrOPx4NYfg0eGAmO
-N6cHlVRVNZVlJf3n7s3EUQIfDjVNU0qvpxNN82Ty+py5pg1VccEni3IS5mWh6+2uiDLKUAuUgdxh
-xUlt12u5bEvHyfgaWDooblSYWaIKw0gzy1IVVVlWG4BYkEdQlQGfgGkqemgEu2J23fW9jtoSIUKF
-oYuXz/NMq6fv37/R6+srHY+vdL1+KKaDw89uvtmwU6F1d8BgqmsGz6LrB6+qeh5j2jwJVGgYOxKF
-tIvuwbUJiY5HufKYNXkJxpvP7k1lWXDMeFlqC7ptu/osYi0DEM7SVPkmYRSKZd5Mh7qmnZimfH80
-9D13eZLLQkrk4fcVqJLSHv54lsPQU9t2niU6S/cXVCQ8o4aWOZIsc/izaa9gEGSM4FzMkkOCp3nS
-TZGlCfWit86yXHnm+05emW/FPIOwvOxt9vb2psYIll8OMhDmq0FAVJYHZ/P9JJ20iarcv4WekYal
-ECdxRKfTC/fEaSE5e74MGBMNu7ieNzb7EPKIL01cfl1R5Fr6ohTGz2jbht7ePuj7969aRdk2AUo1
-LFLYZmHECI5GEsNaPVVffAsMwmFH8xyj2COxLMLEAwqN6ZBNRLKpO8M4cpLP4ag5djAV7fqeTqeT
-kFtSfXeoSpYlNO69kaEcs+9BnmdC4d0U/bc2XM9GoTbS3bIV7eZwY+PHp8kGRmo3YUliTWYZawBC
-eVa25YI+wEqRJwkn4Qsw9eLqpnkSnCqgbd2o7XrlCQALyLKUysLlFNzvdyXmcUDMoGNq247i0mua
-htI0lTWffbKai/O8pJ8/f+jsHZs+CAI2tZDeHcgwgw5u/l0UuSdYwIFgFWjolfp+4BjjdaVtIwVb
-XEILtyGb9LXn80VkwKDYxt6MEyUp05fZ13DoG6Uew+DRvlT06X0/eDJYp6iK1MaKU1Ua9cKDOSQb
-jey6CS1KbmfoGA2qVFN8AfkwzKUn9XPu+IbI6XR6oS9fvtD7+4eU8ZnOtXGgYgwIWTV/9sGEg+6a
-DIM/a6WoYRhRHLrE22eXZUjD88w5Mlk6KjzsIPBidmDuouFFjm1DTPthoEfzi7Y9yDZYV9dTszmq
-m7mjciyLXEBkF76SpCmNQ0+jSflJ4kis0PzqrO87TU4GVmFLZxfCkSsL0V4yqMTshrMHB4fp9jRe
-r7I3Cg1+5cM61vBT3kuk5jWjTNvshYwxKqs8B3XPxt/XmkkAWjc7ZWGNylGp+drai+3Yoa4o3jcX
-eng4HBRI0/GBQX0R/vA8KdgEebRCGJRlYPXxghmo7XrxulufmGo+9sAHUkpZltLXr1+ZyprXtO83
-vfHwEh+Ph24+lPrOGYXBDsR/o+R1c303ejmfz+oZB00BEGwcEGqpPY0eG9FWGja0YjOfMRV/gXVd
-6Xw+s3dCFunGBc02iiIB/moqik5vj+dKIFFPeRL0O6M4HvU53MSBF+0T4tjQ+1vqclmWVBa5LjTL
-CUCmnTtUZ81q2DbrDUEmoXfWDeaoyRFtu0+1xWjueV6tkwdlj/r2dLxRFhqbSTeUbVvB/cfF5WTd
-bGbTSvu6rIsXoYbSGoKaRRKLrGrV+hJY0ByVLycuFTptgf6e3ZPJu6k5A6JTS3F+j4boI99L2bZ5
-zpOLwmVRBAEp5mUrRK44YEOeEdFGTdNqgAkRUdy0nQaBZBlbEeFWnJdQNzWPYbgEhyXSvpNyu7ll
-SP7UFhzCiqIoVOFl46XtL9wW4zhpRFRVVTSOA63rzOWSWFelCRN9wB9I00QNPLHowOirqloXnuUD
-uLLaZys6FyTDIgsDGmUhlWWli3qQReymKe4gwmZDpYJFxfTiUBeXsinl4GHzlItz5xEn5X4Y1JwS
-txLMQ3/77VfdzOq01Pu8Aoz5rOlEkqTMyjQJuu5wDD01GZKY3UEbUZalHN/Vdfr7bWp0fTh47ss4
-TLFUbDTdsiw0S+la17WWvrOkOdlJFYd7DvpssYFddZFp2c9+Cy9UFDlFcUJRNHmViXMA4mczjiMd
-j0dti9iRulXxja0q3Y1uqLZpoocJREtFUXqaA0fISnSyAhIPKsJxHKnrB9r3je73Vh25AIjatWwr
-WHhO6KRpWyQEJvBwphj215gB+84poT6UYRh1pgi3G7Cinum+z1lzAOnSNPMSVNgfb/IeJjThKC2n
-aab7/a48fizwJGE64yBppwiYBKnHqp9AOsH4cpSRputnF01EIiL+OfOiggxLybR+d0z+CbXNgUrN
-ft9pmtR9BrgH+v5UTnrQqcGTRxkLy7Vt26gfBiqkP+z6gZqmobIsqK4qCYmIVD+Pfn3bNjoeDnLI
-bNq3Q7f+HIgyTrNyOVDWJybzYVCZcurbdIl3oevVc12YzDqbNJHHLlIrabU2XLi53RTBxz/wOYCk
-53nmefIx94HX17qstMarp4mIo1kUnJtnU4aLwFZz87LoJAb8E57bO40EgMFWEHyMFB+Ph2YjctKS
-W3OomC3jkttYoih07RWIWVVVKeaT5xmFsoca4ZWgesShgMuGzWgYswNPgttfXqsxynx7EqrkNww8
-zznf5JNvhevlSseXAx0PR20ZbP4fSqXUKJtgwrk/AYCWAQU0H6CUPbk0mnt2yOq2cwQyPnuR5/T2
-/kb3+52+ffvGnn/TpASPbVuJyJf1ogybplFtwcZpEpxj/1NP+VRUcuM4UV3X2vvxLR952gN7uO47
-aaoL97n+QbM9CXKsuAfejIy4RzTPg3IB0oTps/vW07rynymrUm3ZbLURRaycQ5u2yiRIS+pl1RYG
-VHDb4jgLKtL+FIdxJ20vxTDQAAAgAElEQVRJmiZqeoIwWBzoOLB6cTBiTkJsIr6dAg+HNP+zLway
-/A0LUI7T7FHJnSMxWJLpp1IerUuec4T2NI26WfWmlooLzsKwlC8rngDgmSKbEs8OlnpN23nMPKwP
-XLD/+V9/pzRN6OXlhXv1w8Gb1CVpSrfbjeZl1SRtu09sqCvHii+0rp0qUK0GJU6TVIUIdhyHUhSn
-sL3p7aZha6RUFU4QSji02Uknd3KBncw8m0UrnSnIhl4LJSb3Mi4WGv29M01wiadBECg+gPSVNM3o
-UFe0bruCPfhvlh9g+28nS2YtgwItoc2940nAuq1K8uGTOKI0ccw89GN2mvIsjcYzBcJrLdqsIatV
-r4GIs9Oull4YWU3zwxzWfn4eDjIwBVF+owdmwCr2jEDA6YCS0LoXW/086xJCGmRcaE011bQ0TWk/
-HMSLv9J3AiCTLb5WLfu5FD94IC6X2rlGXmGaYgU/zzoIKATxbDXOzPhA2A2kwTXzqpMcG+pZFo46
-jLaWQ0xTCqNYHYVQ2SnF3bxDtAi+m/BKVVVQWVZ0ONSslhTeB3gKFoQ8X660bZuk/8ZGHr/rQfnc
-lmP9hmFI8TRPlKYJNSJvdKSPWHPMLWnFzmfZCkncaZKMfv3td2EKFk/ZbZHHDQgC8kIUAPJgfIO+
-qOtaatuODoeDdwPbcQ02Pl4e/AvyLKNGvNnzoqRxHGgYFk8E4ma+sfegmqah0TDr9ObXOT9LYymO
-aRTJMfp3nOJZllO/DtQL264oMo9/b2W8SvkUABKcAAfgcTkbhdxCIGGJNyinvF4uZ4+rDtSbc+MS
-VS7ag9byxsdxoLKsFOEHFdf6FzgX2+WTmxMswtB6WFPTeV70ZgURpapKSrNCDVSyjH0T1mXx0ngx
-igTOUBQ5zfMis+9VZ+O4oHBA4JbD5wGzEN/Boeb0KS9CjU23jYZxoDIqPdPNcdpUnAWpOtYJG8F0
-ymzlVqAxwi8/eCQ0akrEwJclYz5RxBVp1/caP2a9NKy6DzF2NreCKffhJz8OG8Yas4fbatDV2DPQ
-zIXv7CyWIw1vwAcBPgCABKQT5sfPCvygLLHiI8RE53kuCKULT1zXjOZ51QkC2hH4zgGHuN1uLu5Y
-Dq4kTSkSrjrGYLZ6sVMH9Ob4edqHpr40FvFnz8oubOCuW3WMhxgzzhgsPFEN2F1AladppG1LFBiL
-woimbVZ+ubV+RvWDZ8SbsdH35tuigwSUmxSkVp2CbTWCUVeWcmgLmGgIIIXYCgeTiklkk2+b8wBA
-eCU0H6g4gHbDg98i19u20WjyGgFqMXOOQeGPjw8JPDlqNdkqvZfX5o8//qDjy1EBa/THuHjefr5R
-nER0PL4YRtykwN08L3Q+nynPMwWO0Y7Ad89dhi501qUWbR6tmxV/2adIczt29LgjoHC3LW2Phx4s
-POWKdI0AG0GOQJJkNE2Nrg0bL24vOrw7BT7n2U8ndTpmPv3vjwd9NdFbz6GcFhdAr7ebnDjravpn
-aD+P8xzVlfEBdr5FOZMkGaXprGAMWgx8dk5gwQvkl9pJ4AXRrtRcWwrZlxSEIUWEG5UMbTYRAcvu
-jz6fkmid8CZRn/t9hxtNrv6KaDmGcdU+lzPhnIkGL7DNa0/QFtnSMctYP29HtmxiwkxKPG+Occ8/
-ORnhPY3T5vHjd3le1sDFWWGxqclCfmmJwwS3qs0dhFYBOBCYiFYOjctgnDavveSNG+vfjfdcVxVt
-20rdOHmJ1Pue0un1Vb53KUk6rn3r+oHSLKW6rj1WJiTVURTR9XoT6/Paq4hh0PGcyOPG5auW+vy9
-N6bGT7Pv27f4TFuMZlEtPKsrQQQDY7AoSlrmiebZ+mfMSkrCQe6b67pD3O6BbdsoRt+LHhjuoRas
-Qs8AooH7M5Hm5OF0RwmPkxeJvG5UGCufOs9zytJEhRJW0BEL/3uZZ7rfb+pahL7Gxj3j0AgtoScM
-aNucIurPpKrYUG9v7yp4sQxE9KdWP25/RhDQ0yyeb5l1WdRUMxaiyf1+Y4OSJFbU/5k4FYUBLSJk
-WleUqBv98suvlKYJHY9HXahoAyzFE+lN9kWD1BSok1LMstKw9uynbZxbbERPziMfM3A35oP/AlKg
-pmnWwA8+zCbPMMYdJqEe5FzZhd47sV4Ny+L8D+HDn+UVDUOjaDdMQGDEgtbSti7zwj/3cDhQXZUU
-xQkN4sk3yN8JIDLPc6qqyk16TIw8U6JHHc8CE+LyezJy7Yj6vqP740F5kcuFOn4i6li7cWdZNikZ
-DyNujKe3ddF22iUu+e0ksA3Gd0JPh+BAbM2QjL2eDbeNih2S+FMAg3U+wcaCkxD+OxMVEnp/f9eR
-GxY5UNayKChOYkoNmQXZ8RiVOeeWzsyPAw/wQT8/yMnLJ7YP6FgPOfsz7M/Ms0zNR20JZUt+mxOw
-LCvTbI3Ec1036tfBePqtkmKTa4+njC/1xxOyVRjrRnLfL6bjkU/+4/FAbdt5GgqU9tDM29Qg9Oe4
-6Yoi10N8WZZPibTcVsSew+zzd8e/04RowW9QGjP+kSmyzfiDk+fiZ7j4q0XB3izLtSQHY9Fy/lEy
-r+vFe+Z2LItJztA3VFUl/fz5RvM8eRfMo2m1VC6K3LtQMB57PB56mWGT2TbueDxSLhJoG9iJzQ/n
-K0b+E801fKYbWwZf27aaLsXy6pCapnHkpm2nUSY5fzaVspUpAkO8oFNTUSrP49/+7X/ttlwA+GMf
-CuvaY5NJv3txzsAB6rqiLE2p6wflpWNBY7HwREFy7CUSjMEcLl8fzUM2JGvukQ67rove8vdHo6AJ
-3GWg/OM2Bv3Y6gGWIBjlYjRCtNP5zF7+X15fKYojOp/PT38/qZ7ejv+sjPdZOYnMeD8JNlLgatLS
-0znWMOjZ6+ltF8myLHQ8HChOCuq7uwCo/GwYCXeR01nKzLdH81DvvudxJPwJYqGu+od7LFTcWemm
-wGk4ZTjT5xxF7DoMwo2jGyeaSY9NwSXq5t3K0MzjgMLBAQMWPHOYsbDPIpxuQ61M+r4XvCNWXTzU
-lPadYN26yyvSTEQ3/eqVVOZcsCNPeosqKc8zattenYdLSYVCL98ZAPhyuSoxDWnUzrI80F6dbcQz
-xb3Q2o2iRIQewnomILAUtGabe8nfLTA+FqTfIwwjCn755V93WBKDJgo2ExHRx8eZ6rpSIosl7tg0
-2WmaqCoLJucMnc5U7/c7vby8aBjFx8eHot2WL+DP+WMxILnT7XYTP4JIZ7CX61VBv/v9Rn030OF4
-MCYZDLSN00wfHx90Op20UgD5Asq5UXzoUflAOsu5arPq4a3pJgt2Wu35rY2VjYDuupbGcRK56fbJ
-Yssh0pEcnP2TQUhEl8uVqqr0BEaWdo0+1TrbIMyEiOj33/+gf/qnvyk5CDe7fX//t18sxHqnv/71
-L+wJKTRui5jbNbAYBB+f53K50svLUW91O33Bn4Nyzh7YuDXf3z/om8iH7Qx7WRbK0kTjuoFBOQLS
-pH4Ir6+vHrHKkqAcxrJ4YR51XdEyL/T2/i6tl2+ECvu1rmuV+4AwXWRewOru+7dvOl5FVHmSJJKS
-PX/y/cuLkqZxpPvjrn4FqLAsC9G+BxixgGiHdXq5XOh0OnmXlTuAYm4B3t/eKJVsMpgPnM9nDeZU
-FNU47VgzyEI28zjNCgA1TcOMJQmGWDfedDDXKIpcdelAOVEKssVX5M3OcWv0MoLD5ACuNLDHGqXf
-n4wVNT6nFeugFMd/R6Amxk3W/NKmxthN+8wBf+7DbAyU7W/tBkGVNCBqPHGjJSxQbHQAs70cFGma
-0uPxEKZjIfTOzpt02IWCgxZqzqaZvLLRMvXsYYyk4yRZFPNwN3ggZi+Ntna+B97uTQKQP1GWpU4V
-bArvuq4qJbbAMdolbII0TSmQdgSbKQjZtg4VFRyb933X1B0cCNy2MrYAsRUSqaMoomVetIKyORWP
-x0P8MwKT75ApKw/Vm+3xB3GIRvoP9Aicc7B6beXt/lDTXBw41mkZbTSLh2LVWwAMZiWvc3aGR6TF
-sKyALc7znL58/cre9dWBiDZajC8++i78n0tkHfXh32XMZvsQ2IxjxIhEFR7VMZj07MNuqaY46TC/
-tlruPwtCqKoDrctIwzip1TQCRz7eP+hwPEhkM4/Ftn2XwMxNOeiVGKPA1WjfN42WglYeNwRukQQ+
-+ZvLEwSinmUZ0U5UlaWSrWxLYvkVuqDGSauSHz9+Utu29PJy/GS2CtLJLIAbBFT25bqqKRHGIGMt
-7x9npVNjjo7ZOHAfkHBmUarhpmq7XoVVfBjsEn02UF0fKEtTuj/unruwxWJ4Zl1oRj1u3kZav+Ph
-SHGS6iSq7wfVAABvQBmMCDEr+0Zcl6sUZv09aZrS4VBrIrLNt0QQqnIdloXu95uyF/HvwVYEs5Kt
-uXNaVk6XxgHlftbmAdb7zlHlaK8sxsEuz0RxnAtBaeU2a3N4x/1+k4kXsxE/Pj480NIBfrFHlLOV
-GQ75LE15CoBZYhAkdLn80MXDXyb20mDwC+msz+aSDFqEyuqKQj/zD+O+KBo/AYvY3FEYSHTS6s1N
-8zzTRYwFA9FD1z0kGvqiL4lfLttSBwHR8fiiopd5WWkxQNI8T4QoPHcohYpQYzQH0A09L4Ava6Ht
-YsW5F4Wdta0C7Jjv2fMen72qKrVx6vqefvvtd6rEXz/Pc4qTlIhaZSV2XasjOTuHDqTPfXZggqkF
-7N2tao0JNKui93bsicpwmp3xSVXVSu6JpSfGoW1pw5gKAPTVkl+4Cpx/1xhiFwfHcIu6acbDMi/0
-aBoF/lDio8VDqe/nJEbaimZZrmV1XdcKSFv77TTNxHbeYTxZlol/ZGQOBF7nUFzCWSswN7djxybq
-WzgaUBCHI55nmrAOJgr5Gby9vYvsvdQ9ApesJOEwn/ePDzMFIs8l+HkUj2o6hpqKSSutxwfo+oH6
-flQjDKLUEyjAvAAWWrAnUinjNFM/9BSEpB/kuVKwozfoD9j+adITEwsJBhcoj+a5p9MpE9YbHyzI
-u0NQBFEgJ2RJeV47Zx4htDg+PRMtkJVo6bjOHHN1dtdSCdn+EZsLzycIAjVOGcUsA9gATnGM7jC2
-tO1FXVe0rRuPvcZRb8+qLPjzz5PncXg8vnDUej945T9AWCu44sOWFziosGg9tm1S8wt2tEm118Yh
-CAdi5zocSLXX6SjQGlDY4A3NOxB+AFKA1pW1DHbW3os8GRHy8OnD76nrWhOQ4BC975v6BfgGLrNx
-Nx682PplXWgRoBlhsDrVkedptfjLslBdVdQPg1Yibvw5e20rcx9mNWqBzThGt5As88GaCTYwqRgJ
-lQq8GlGxMIuXHZHjJFOw0K5FZhDuSmAbx0Gt6ZZlodiaOdhMus3w3bGpAayhtMHCg9oNp2cQhhSF
-cNoJVOgCAOhZhWYR6mkalVQDFSK0zbOUmvgCnKle0Y8fP9iBtSgEe8gpLwJ6PFyJd7lc//+2vmxH
-jmvZLnIeq6q7SUp6uv//M36zDRgwYPvcI4pkT1WZlfPkh4gVO3bxChDOla7YXZW5h4gVa6CiYLWa
-jcdS8EyCOuE954DJwJhjpHpz7UIzBtvvEbxTmujMCyNNE+1tgfSmSayhIWgHcCAhn2EYB3p7+0lx
-HNP5fKaqLKgoaxo/P9Trzoq3WOmXePx4NjKZvYUB5yEs1Edxihv9kurRgSTjszmMgAFMeD+iAovC
-QP87fsaFRs/Ny2w2g3M3Yg67s3pXcs1+KNJ9u900VDQKA4oTdt5xNGa+9eFOBX0IqqxQvAOtbwR6
-fRsaY29S7AEen+YSP55QKBZtiDiDrgXPDyxUvqkTbSXBh0EliA3JHICAShnZYv05HIi9CcfJCeH6
-YWCZuOyZSnIo122lt9c3yvNchWogBKE1iANx4HlkN4HvPS8LVVIRpFlG08yxzXmeUZqk9CY9SJIk
-HNUchmo6wBv7cEi3mZnD8++RocalUORSgLNU883tBIKVZCERceAjSmWo7sahlxBNdlzFS8GNbTct
-qJywKHMhEZFWIIhHRyAKTxCcb2Ep7i+WXFPkOX1+fjrLL6FWJ0mibMFfr28q6+VEnENJVnyzOGQ9
-TfkQpP6uQJrlqC8r0XGsv4FBeCY+0SrWlm6SpBqAojjsl5VkbLkKsWVSMg7Ay2EYtZSGxRqAMPA5
-8P6tjySAVsSfoQTO85LmadDbVunMKYvWMLas65pOpzMNQy95FbNcDCkVRazSb0R3p2mqACaqLoyR
-IfwBaGsNVNM00/gvHIZII5pNCMs8M4CM4A4w84qioNPpRJczq2UboffisM2yTIxuI/XpgxsRWlhc
-ytu2USu8AJuP+Gimcr3x5GpZVqpPJzqdTlQWObVisQ5S377vFA/DQNM0id449man9odO86J9jQVY
-EAi6H4dok39XH63rotxlawTBikOfugiDC8Q1P7rGQtEFO7FhYGJEIT0xAJo0y9Q0Y5pGXbgBBVp+
-WcYVnGQdKBd64zKb84by7DH7zbrKsCPtrJ83DDez+FeaRo504lsx09ElUaojHQipoPzDAl4kbAUm
-LZimuECI1cv9c24zkUegQdUXBAG9vb3Tly/PVNcV38rr7x72PO7iXvnnz1+q259nh4TjZum6nsZo
-0mw9EMBg5x5FvtstiGdddzc3XqiGl9j4jq3HDjcuLcrP4mvbRpV+HDsWSas3eGI3IO0WPMWNjtKd
-jU8Pz5cAVQW4C5huVdWFjmNVv0z9XXFMi5CycLjhUA7CkA46TCsc6Wd/NM6F+IczKHn+//iejoPE
-xi9XA9x5GtTOzhqhxDChYPeYnsZxUjolHHGwqGyFYI03gjCkPMmIqFfE1sZEn89nimMyllqrOtHY
-AwNmpGAtQW+NESNKniBgZxxWfi16esIOaxhHHb1gYeIEtR6BKDvxO/FSgOTGcaSpRQgOQRvwSDCy
-M3wVf8jPg3iKk5acFTZosHmWURTHdGsax4/30n0iapqeNvkeeA9vb+/0x7evv4V52u+WiveCCqmE
-oDIMvd7YYRjS0xPHZmeZ88e3laCCWduq5TyYdKBaR2GgJqN45nGcKE183ze5jRMJMXHuR0kceQck
-t4srTfNEURxq6cqBLVyNdV2vFFxQxyGUQYXiOC4HHcfsKT+jMKJ9nzwg1ordLA3a5gvadiaKInp9
-fWWuSBjQugyi95+FRu8SltEOaZstrtZdd6eyrLyQGRxMjyxFF6zKgh8kOjvQm9SgpKpKut0a6ro7
-9X1PZcm+EPfdTbbi4yC6nE+UF6Xw7EN1IeXbwW8NsEFsvziOkz60MAzp+/fv9PR0UXUe5tthGNFB
-h3eYzMq35/4S7r74kvCIH4bRpPG6+S9uufu9pePINEyirvnkcyzDSEhKn6r+Au0TM3SXWsz/++vX
-By3LSqVUR2wK4Y9UUDrbxGO40yzmZLa6eZTJQVCoicq96/SgtaSjpmk1tAMvzY1zmJyDTWhRd9wa
-wzgSBSSjxYySJFUJLjQU9iYOgtjLGcD3YUBuoG3jkExgR3EU0RZt+r6gznNBqKsy9IIg8SYC+D3W
-UxFzeDD+cCNic6r3QBhSGB7KzMM7ZTJbSPseeenKj8IjmHuijHbpTqtwK0JRA4Ye3XxZFmGPFtxy
-bquOrcdpVkNa58UXK72aPSAz41SVCVg+6edjNyk3draXDExFrKCL7fU3SpJCVbho/eBIvG2bp46E
-bfy27RRC5z5N3G8WwmhC+YEZqi0zlESgZZQLTCQiulwu9Pz0ROfzxZtHTyIOefQLxGjJOgPjxufo
-p83zKcAhBB4AWFg4kYsi57FUWTg0dz9ongbPYAOsP2u4gb9Z6JIqeISDoipLURt2+kCHoVc6Lls/
-zaaCCvU5OtZW5H33LHWuuwDmEPMM8BATlzhyM+myrDgsRW4P+zMBMMFBBxvUxmRlKWsMMmHojeNI
-TfPp2YBx2d6KsGfyTGHHaabrraFlYaS6aVtPiHS93pRKjBYGEWrTPOsYEO/VypLDB1DVJRhPWl7j
-f9HT42LhXt0J2oBZIJLNHsbOGizWOX6eZ1SWlYC0TjHIDEM2q4Xv4jwvdDqd6Hw+06mu9Oej9QJz
-8v3jXSYdktAklXUcR0KM44wCDRM1hjDOWIQrnziKDY6yUFXVVNcVRUK6G4aB+r5TkhF+zjRNdL01
-1PcDdd2ddTccxcVjB6voAoPKItQWcQbfGL39cTCqPI4TnU41ZXlBYZi7xe85szr6L9/QMZVFQeu6
-sGhCWgTnXLMakUWsPgPguGOysO87lQVbOWVZSlGceL9vWXbtN7M0UXZYUTDwtCxuHAZuxDRx7hw7
-s7CxCXr8ssg1Ex4jnba9C+Ox1s8OH3Z2Oc4VRQedFCWvTY3FYscBDbYXRk7gYrRtS9+//0MvLy/a
-N6JPdovQhXPEiaPiBmHIvaEAVugvozAimri9slz8OGbqc12V9Pr2rmlOiUwz3CTCiaw4GIQR7Vla
-A2s6Yr0Z8J6YGbl5BBqwH3GgYgJlDzwNTJX5d5axYxDkxJZ1aNci+zdEoptI1Kuf28BE3xc8Fooi
-p7KsPE5H13UabedlC+674hCoVrdtU0dmV0nePHPSXYhBu/z5aRo1OgwTBFR1cRxJroCLbUuSRMag
-yYPYyxnmlkVBMQgFlheOB4HFA6ME67RikXu1IpKc9zzPaRoH6voP6rpOiSsOLMMEINY8OSTvuJ5t
-9/ps3KDOwivxePAurWhX4Qq//FhZiy5HkNF0lwPX6yzcGjWGQUA/fnynaRrYrWY/9MYoipLSLKNt
-d/7xbMyQ6CK3C7uuK7XEQqqy9XnHS8mFiuwCPnjisAQO2OO0nkxn+7zouF2a58HDM2ye3cfnp+oa
-MHfn22RRMtQwkOFAREJIKimU70BEFCeZ4kSI3MbixqQIU4tCJkQYQ1r672OOvcVgrPsv9BUYpx77
-Tu298xY1Pzvpj4UghYg1cEQsyDcJRgTq8mFakyAgZT9yRFikF50r1Tttu6y67v39nc7nM9VVRes6
-qd8mgljSjNtZ66tgGaKguccRtzwANyHqgmYCOAT2FVpISwCLBd9yFvkOP2IwN6O4vXeeyyuAKQuO
-hWr8kHr6d3f7Hyr2ONU1pRKJhDKe04UTRZatPhkgCYglruRDT9pT09wUCziO+DdvPTj4zvMikwHe
-lFikAArRq6VpQm3b6s9M00ymCTvd7634zaVizBmKZ35BvTDAmOHHefWsREvF+7+X6qOk4+CoNLDG
-cBLHSaolO0pstFBpyuIQFaRUFW3r5nEl8L2qqqQkySgMRBeQFYzhjKMyAkHlthUXHzopvb290bbt
-dDrVv01hrFVYIoQujBXTNKUoZD386VQrW049BYSIYo1F7Vh4ErbeOB6/aSegILVcen5H3KrlGdNf
-V3FvQvvHMWoHrRtbhY1j77nkgmgF5p016USM3LJuEjYKnUhsotY3r2W1LWnTNAKGsuX96XSSkNDY
-0yLANGRe+FmschHaKZgble4URbz2kpirsn3P5QBhsR1MSvFMxn1SXIt1DqRRcI8GIYgUvzUNxegx
-YJ0FExAswnmedP7+aCxoT2vt07aVhtuovQs70hQUJynduzfjAehYUdDOW8Tz/e2dnp6fKIpilVle
-zidaxfcMC2UcRxNX3eq/54Ua0LatVJYnj/xgJc5wH8JEIsuYNFGWJc0zT0SYaZXQ0feejhtlOHp9
-jpFmk8q+l7wF4/bLQphWUe80K+jYVxWMoLy1Tkr90NNz/uwZVqL3DCjQQxXjM4ww8TzhqrSsDASl
-SUyx3NZ1XVNRcHuDUjPLElVKgq2XZplWhOM4anoO99+9d4PNi2/hbf/q+06TeSzCrTPu9k77vqml
-GqPou7YWy7J4IiEEguJnWYYd9CrL4kxKbrebRKVBP0GaYoSR6zwvRGYM+7jmXfpxJKlVhW72XpKv
-mCjE5ChImq1234agAqex1Glen7AG6ymBlmMNaT96WhaXZN2JfBnVK8aMID3Bmg/mLcBjlpVl18H/
-/t///eBEmEFv8TTlLDmejfsSTGeuseupzV/OIcagI1p+/OfnBxEd4sUWeiIJTBss57zvB/EXyKjr
-O539juMkXOvFhEnC0nuRwBCWiVZVKSmts/RKsVYu3A7EVOQF3Zqb6sjneaJKhDIcShnQz5+vdDpV
-Oi0AQDqOA0URS0cTCQJF69APo/q3z8uitwhcjQCGOTuqWG2roigUjr47tDBKA9sLfx4oOI9fQwX5
-KnFr7rq76sFxOKCsrqqS0jSl6/VKURTRzx8/6fL0RE+Xi1pXQfuPnh5MQ6UFRzEN4uX3//7fv+jp
-6aIb7NEDAii4ajHWxbO9AuBs/xv4HhAd9Pff36mu2SbbEccCr120Gw0tZRhGAq5yqGlVVupDYac0
-TEmePJcjYDVgrfJEIyGiQyLCYzrVJ07nUV0FG5DkWUqf15t6Rtpy/9FvwsfUdk8qjyph21bde/he
-APeOY5d2eudE6jihYRxkJBs7Y1QJlQFuE7y///uwNtzWZ7zIc/r56xfVdU1Z6sQL+BIofzGbtHpu
-nO6fn5/08vKiWMDpdKZlmbxZMxHR6+sbPT2dPX/8p6cLNU1PRJvHwXZe6k55V5WFfr48y6i931Wc
-xL2jC2aEDZl62MumA8BmqZzfv/9DZVnQy8sLVWVBd1EM2Tipqio9x1f0fHmW0q9fr1RIK2JFGdAL
-4LZ/zFxAFfPvf/+bXl5e1JAFno12BAknXPTCoCmv60avr2/0119/eqnEaIlwQKHtQIhFVdV0vX5S
-GIZ0u93o+flZD2YWPpEHAONz3243qutaOfJd19H1eqNv377qhq3KQqWz+MzwGsBzq6uSjoPo1jTU
-ti29vLzQsizUdXe6XJ7odDpT2zb6XaHJtyM/OAsNw0B//vmHrrc0iSkvSmqaxhu5ProeAdv4+fMn
-ffv2TfwFGDDGhAVtSBAEur4zGc1htHi9Xunr169cwaybly6Nzw/WKNOpBy9/4fPzSs/PT1QWuTgO
-bwpiWtWhdXcGc7nZ1KwAACAASURBVHYSP4tv375SHMXawkLAtm3iCWhVYvwhZ411Wk1+nP3A1tQS
-vTMCN5h1l3p9K2f7ZWKSMHsedlEUiRd6SXle0sfHmzin9HS9MtXYWY3vdL8Pehti0YyC9t7vrfbT
-qu2Wf4b+YNtjJajg4X1+fiqFld15enV94Ujrs/jhtbrRQGiJk4zmafCYjeu60n1d6e39nb7KwmG6
-qJsDp2nqub5YeTSAoKqqFRyK40gi3H1cAHHPCBCFwGcSyy0bwwaSkA0kxYK8XCQ6K+LvcL1eNS0K
-ZS8mRpb3gfbkcmGn3Syv6CDnZov3kKapbHQ7n3dlPPwgPj5nLVVZjAP6r/j5RYnO/XEJ2FQquyHa
-tqW6rrXl5Pfe6YUHgI9xmEXFNQcdxpk4Vh4A8iLw+6zEFuNmm8cQBE7gNi+rYim2QsYzsjRyq5jc
-910PSFQFsB2zlzJXgIkGw+J9D8OoLQurHytto2NsbivSYBDDBTrYTYQP6rwAJ47lkrLPkkBshgD6
-7kcLcn2wgpBD8IAS0k0mNp1KQKr5GCqZxBFVVa1l8+12o2EY6du3r96isFhAksQ62y7Lig+pMNID
-AOypfd/oev3wDCtd1l2nZZ0FYngMVqjfPg7bJInV+51LsU3BLGvNFga8KJ+eLpqPCEospi82Bhtz
-cfgJpCnzGDAFwc2Im8tmyjMzsOJsyLWXQ7miMIxkHDorJZfTckiNQbG54Q0ZBJ9iEsMb+eX5mUNE
-s4L2vdG1g3J2Fo99EIZ6b5w1Ul3XrLYTlRwcdaxRS5HntAnibx2pi4J1FiBcIbClbe/0n//5b/rr
-rz91ps8WWruyOhfj5KymKcaAExMNGKnkWUbrZuzm05TWZaVdSEeWcpwmsWesYqPO4CKNyZvv8OuE
-QYGOyRexVgs8+jrwGkzpMEJEZFsYhhSjjED0lE1htWmsTredKUVXUcv9UI+5IIyJiOef4Jnb+CSM
-JWwqDk7Pddvo7f0f7dWRac/jjoziKJKXz1OLqixVgIPPYYGlLMsEJMxVEosMA/egdjE/Sekk8WZt
-29DpVCvXehhH6t479YmzYZko2UFA4hLL6uc5XwC25VmaErIYenE+yjJOk8G4y96czlO/oziKPTah
-deWxwKaaski2H1oaqxm3IyE+tEa9OSx6Tgepdt7y7i27zrYuYMiF8lnb9i5S5ROFIZfK0A/EcUJV
-VeqFA/CZBTKFqulYb8+3aD8MCnRhIjULqciCYxY0PYjn97emoSiK6O3tncIwpK9fv9DLyzMVRSkA
-YaKALo+TU8/W3kXIxXpwWf3BIiAcRuLwqQRmZEeRdjPbS27bNvof/+f/0rdvX9Vnomlu0mrWjigl
-ZimogJhvM6utH8am8PTAGHFZVpVTp2nK2YA4kcbJpfKwtJPdU97f3qkoXR+NRYMHDS963GD2xPrX
-v/6TSF4A3xKx3jqgAXOJn1NAriqwtl4oV4/YF0Z8Xq88AxcKJE48/myL/t9xFNFMi24QOABhfDnP
-E1VVTfd7Sx8fHxTHMV0uF15g0yzxZ4mCKM4Hzy066+uvVE2xbGKLp5nyjDd/1/fqVHscB318fKrL
-kHW5VZWf8CZA0HosdSHDXlaeLgAMi+NE59BZmqpmHNUeo9S7cAkqnVNjbMdt4EBt2/5mjwbQCuNi
-+NGx/VZvWImhHpp933n07eMgYbxFHvfeXkZsgTZCkaaXCP4CWcpSobHxYO46jhNdrze9lc/nM3Mz
-qpLipCaiXScFqAQY0HbBLPf73QPDkbBk2bGgzWOS8RhGg7W877tOS+y/w2Hy/PxEZVnSqa6o70cq
-y1wFRwhmcQ7XqY7Y55mt6kFk4vfBz/gq1nHA62A3HmP0MRn/du7vkVIbS6+fa4QYghb4YezKInyM
-IGLN9pkulycvlcQZZ7SevBQZhCAyYJEDgNn31FuEzkfAtRUw0ET1wWKWXeWtQeCIJSidrC4AhB2U
-lNM8U32qlT8Q2FSgB+WjjYnG3Bf0W+Ark+jfmdXFt+g8zWaaQl4CEJfakTHdWD2gENXHsrpMRatM
-JAoUz/n+zz8S5ZZ7ixeTG0x77XdCdXi9XtXM1foL2nHbSZKIQYW2N1wYMAiGA4CJMsvDBgG4OosT
-b/SbSak6Egkaz6M45mns+2Y8KTt1YrbtZp5nSvqZ5pne3v+lqUfYHCBQsQ/hQHeR0drR6mP7CVGS
-DVnBO7cXosXTgiCgv//+m6qqpPP5os/q69cvEj9fUBT9YjlyGFKWlRTQoCpFG2uGUh8t7LZvimts
-++EpQ5lZuVCWha4CsNn0Lss+pDRLmR4peXe4RZd18ySRlvkGeSj03HzSFtR1NwqDgNaVb6i6Psl4
-r5RxFUkLsj+QL1zv5IwznMsu3GIgcOgEqYdy0Oapg/GHMs2ewkWeUyN+8IUsdOsptywrte1dyzCo
-sIDGW2AH5hDsBFRoIAgQ+HnmCco0TZRLdPnlcqFefN+tTz/EWbFEioGZaf3dePPExjuukUxFJ5nF
-5o/jiMkvpgqxhqO4Ce0ti3/Xi+koi7YC9a2HytEFnbBasRffPBcswpuFw2D4d5wk6Rjy7UdpLlKl
-USlAHTrNzsPgoEPz+o7joPP5TOfTiW5NqwdAksT0+XnVZGKYjsDNB7N7PmRjPYD1XQjoZs1b23un
-XpM2zyI0Phv0QPqxCcvY/OfzRaXtmKiEYauHT57nys3AvlK14upGtbC5By6DyxpEJQi2gLXEWZqq
-h5nNcsOCf3v7oD///EMcf1tPcYZkFOtAa/nMrZgfjNNMwczIdCPZdJaX3baNQeozFchM8mfw4ACc
-PPadLodg15sRC/Z+v3sJP1B0wcTExm9v+6YYx+vbqwKbIGqg14R2wRI80HehysFMFlLcRwkytASB
-tFMQBDHKvAi70bkxz4LkgrOOhB/LeHO/gwG8oshp30yyjABM4Hw8ehRqrqIw51DSMz8+V+IN0pPn
-ZdaWgkfFKYURO/MilmyWePXZyLnB7QcgtawrJWozxu5PLtwycGi6Uck5F6FUpyPWYHXbNn3vbhOu
-GiDrvP1zqsqCcyTENxHOPbYsR+KujQkfxS8Q7S3W4HEQLQbRV6cp46gN23Iea9YURTmta+MxcvE5
-wKS9Na2H0aEqdVqHVQ+sLE1pkfYJdu6oQNEKxXFM8b3rOQVlmqkoc6qqTG9ULi9Db8RidedsP1So
-Xxx6wzzPKQoDGqS04kTXRUgkqY6r1nWjJI7o3rFhBwdScH/TSM8CbQB8/B6ttW3bYTPXCtUe+Hn2
-t+uNcgHr0LOhVEVp23Ud1XVFdVXpuAkvclkWPf0dAzBQsBElOsp+8A7w8tI003y8/TioSF1w5M+f
-P8UpiA+2pmno+9/fKQwDqqpaS3ubCoSFtxrK8DwvYjmW0pTM+jmiiG9+DphIaVlmWpbNG0FadeJm
-WGZRFLJQaxglrjukVWbWPOLlpJ9gD83CJ3E/qigMejURtZmDwG/Azcfmx/dwFuIsOmJZ+K5YCEJY
-u67TC8k5Py0yanZGrnDKzSRDIAhYbMUHX/Ygvd7ZkUret2JKhqOPgA+sH7w7VMTruqiXhJ2+uJ8V
-0/v7B23bq6nmAv3v1f4uLyh7YOQis9BWyzCKiZOY7pJdgRE4522GCgofx8FjwDAM6cvXL5TnmeAB
-s56A+MJMtV29OeRxHPTr9ZWCIFRDBDjg4sTHl3h9fZOk1Fxvma7r9RRPZMM8BiU4RVuifaTVjj+C
-KBo2Mc80DL1SMQE8FmVO5/NFFYC+c5FT4IUhU3WzDJmGkRp8MMtq1AMHBwhKNCua6rqBKiECoSVA
-BXIc7FNvxRoA9MZJTC9PJ7pcLuq79xjOmogRxjx3npoOXnFt29LlcvHsp5kSmlJVltRJfDgOkTAM
-qWlbYQCGgmG4DMh1XTQDwKYmb1vvJf5Yq+1xcJvfG3mJm667JSMdxYHIggWLtYl3A54A/qqqSvGf
-2bQGOMzwrgA+jtMsAHEsz3VRth8OaMV2draQt5gTnhUqMvAiQLCxawBGJgBMyyLXKQ0qA6xxPGdU
-vVmWeWG3CBMdhl7Hm0gl9rUlm+4zGwuG548DMt73XdlfUZTQtt00rRQvGKVmmqZKmOGRREzrmggS
-mSqohmRdAA77tip9E4w7ZNLB2PIxFcdyyW2K774vv3HM7WGg8+QopjVJKY5nz2gCNymHLDqXWGd0
-QvT8/Ex1VVIQRDQOHdWnkyrK4jhWXzccFhAMZWnKvahQQoG2OpZbRGlSUdcPdD6dRHU2a2mapqmG
-cIxCX07ihKrqhY5jou4Nt0QmLsK70JVD7VPRCwKQGganlbDPF0Bdoc7Om1Y4cNjBrW5BTlilJXFE
-b+8fSpu1QhMLjMExynrtIXVp2zaD7PPIUHMnZheznSQxRWFE09SqToDjy2c1kMUF8ei4M4ycCAz1
-XFUWmrwzjKMe5FEU0e12U3csSyleloXWh5GvDVyxQp7HDEUVI4mwat83HRVy67poS5gmKW3R5mlT
-+BKGocimDk1Jknp5g6pHMBHsblK16J9xsWF8WMfcw3Be2aNDadM0NE2zoLspWfswmGAi4y+MYrq+
-vzunmNipCT+vVzqfznTvOkkLcg8NFMpH73L7gK1zrn3Qj2myTnTSC6U3+y0O3IomfG8D598Odl4Q
-DDQLZmAz6LEQkB+Pg22R8YxllzkwkgHIQ1qkMIoV9MH3QDUx6UtNaJo6Wpe7OM3wYQtlG9RmeZ7R
-7XYTzkTuRWjZeG8sTotgYxSIhQljFZT2i6Qrw7sBBwBwF7xvkFpsdegyFObfbMtsJeMqIMeCRKIN
-8KIwWKRS5IkHfr8TE+00iM14ksSerZfFOIIwZLMMQ1IDSQp/g86L99Y0N61EoaWAyhOHnwWn7azf
-AtlN2+h48DcG7rLoJcgYD8lId5e15Axxrb3XGm5egjGP8Fm+Po4j9eJQhAtcSWbIWuQxXKakGw0B
-kd6BU2gcyy/Pc93w7+//iOX0pLfdtm207Qct40jjOEpUU0VpOomRwayBFDiFoOizmxi0XBf66eiR
-PK2IdIPbzWytxJIkYWab4cGP0gNDQ7+oNn3WcSfKNxxgNgIrNESj1LjfwoYZAhIAjuM40eVCHtDH
-VNre24w4LDCPtmM/yF3RBycJb7jX1zeqqsJ4GMaatoNnWFWlptgCFIM4ZTMAIdB3KP76vpf+daTL
-5aKlN54L9+aFWlAfx+IRXbDZVzMGw/uGMo2RdTY6wVQGRi2w39YQTYTBhiEROUdirDvngRjLtGDR
-NsNiRiA04bPa9hDlcpYXRvLOJh8go7H3AZuClobJiXVqI7vt2NDlMkZqeMttNa99+xmxYXtxXLbt
-G+T68DqwbTqeR1mWdD6dNLELFQ00I7gUyrKkkG/WneYH/7FRMvieLhcqS+YOY7w2zTO1baObua5r
-BXuqqhRE1821QdYpxbffzolh713KQ3BEGNKe2lIvnSGj89W3KDj+7yzL1BHlkXBhbblA+LBmFBDy
-pEmqYy/9TMame5xmuned/v329qalNzYa+/AlSm758fOnRIJvnmgKwJiN7LKkKjybdd20pShLphl3
-Hcdd11VJiQA8YRjSx8cn3W4NzctKt6ZR5B+3jD0Um6bRCPF5npSeDWYfgDT+m3vusiwpjBhsslbX
-EKV0Xady3kdTCjz/QZKi7EjLXir7vqkFO+zW/Ci21XvH87JqWxmGoSL39nc/Ol7j+cNSbltXyjLH
-OeFJQakHBFSNZVlSWZ689kixjQeG377vwlfIlZugbEsjifbt2zdlkjofwFRp5KnoSiwvA8rIdV3o
-fDqpjV1iplFoFe/3lnMBxnFUauZirKynaaT7vaeyKr2SBh+0rkt6eXmhPD9RnjlXnXmZxdEkliSa
-TBxYXW9WFM59lo0qd40Lt0QX6/6DTYh+moUxTqtgnVt5PDjQMA6UZqmhJKfqcrNvu5bA1oxyWVZq
-hWwBJPfR2PMxf4+pwKUSpiDA4JIylZAKlrdipIkcQ/ToOtcPA0ozDh3BgrdTGJvwU+Q5hV++MMAW
-J/T+/v5bv2+/OyK00Kei7dDKYuJ5++V8oqKsaVs3ipNYgGEXd87Pg2hZJq+qAE9CDV5ltLl4QBb3
-7GVZ6cFjW4RlWagsCzqdamrbuyf4sfbctr2xUnW0cEVRGAntpvN4IPgWNINRa9+ztyHwK7zbeZlp
-7hbvUEjThLZ1ol+/XqmqCsUnAjMxAhHLXkKoWC1ZKhGbL0w2fv78pYdMILd3lmV0v7dU1yfFN/DM
-hmH0pij7cQiYuysZCOsAI+yyLCn417/+15Ek7BCDU69tG0nKCYWbnWrmuu3PX1/f6evXF7pcLnS7
-3Uw806ia8eMg8a/nLHXOd2NjgqZphGKZiNhlorZtqKpqtbsiCrS0wkz+cXEHAWff4UDRYE6jpsLN
-1zQ3Ksta/PxWQeo75eq7oIhZDCAzqXBSvdFA6EEmve/LHghANWoJj1IbpV9VVpSkCTUNG2py+Emq
-oaaYEwNxxjODdh757vaw4/FPTU3zqRr+deXnUFU1NQ0TYNIkoRmegPJ7cEilWU77tlF7b6nIcwl5
-uaumH4SsRIhEvrEHa/YXcWcCVlAUBc3TSF3fayISPCbyPJOJQqTto7thU9UD3JrWodmHSdK9XSlN
-cy2h4S+wCKclw+zbBNlaXwQ4RrvJT6imouw+RZqpaKPD4f2AdYNqDCW9k65v+iwcOBd5uAc4+phw
-MKmOE5Q5s7Ck9t6KYW/heR9iogReCE9ddiXrgcrs2mheEywVF2zn8/P7gRIJuWNdP2jKz48fP+k/
-/uM/NFrZlXo8f0UsN+yQbeABEdHb2xsbVsYs5BmGgZ1yhEuNOXuepdLr7mqc2TQ36ntW8zHldPRK
-MDv2A9KJHh4n7sfHB10uF42tmqZRxoC58sOBjMJCjBVlk3rZ/fXnH3pyW8qtFYqAATYb26l5nqhp
-eAyH/xbuNhy1PmvcM1tntapmBIjVNA09PT1pZWJRZ8ufh5/gXbzy8S5ut4b++vMPmTYsKnXGiAit
-B4g/ViQ0zzO1bUtfvnzxVJCWc28Ze9aunAFe5pg8PT0p2ImLoet6VRAOQ69aCw2Jjfnz/f39Hzqf
-z55IB2sQm6quKlrWVTUJSBbO0pT+/fffVNeV9t7o1+GrYFWrNhUpzRgX++fHLzqfT78Fg1i8pq5K
-imTk+ePHP1QUpZOE3zv649sXJePY32ezFp2IyJHTTnVFTesCUKE2ZE5/rp4GzpfAjbJxob2+vqmf
-gyOEOVfhGKDDtm3iRNqzt5wxO5jnSUt4II1gE+VZSqtBP7XHDgPVJH9+fmjceJLE5kEsiiK7Pp8d
-V9/eXtX5BP0Reqwsi7zejcMeJ0XpwYDbBDzkci5TeWhpAEeUkTi1Me4rCgbPgiD6zc4coKELkti9
-eKvjIKXtwixUrZxl/AjGm4vmmtmL0JCMLLMSI7txmoQWmygzEtyD/uH9oEpg2u9ivPVJKx+n/yBv
-kdhxlhMcpeoUZPv2x7+4QuKQ0Ka5sW+CMDzBOrXPEm2eNRuZ5oX6YdQpkfWMHMdR3nNBeZZRmhU0
-zTe9TNBeMfGHAUJu59xoGxx9zPOtFn+cZrXB27ZVy2goLnGQvb6+0bdvX6VVaVVDY4NPEK2G9ovb
-7FUt0raNS3Ec2EWeS/IUsLY7PT1dZD1t4ma16uewADUuB7gRpVlGkdjIW+k0fCvWdaGYxRS5IrZK
-4BDTS5TDdryBnhlc6I/3DyHYnHS+30pc1TTNdLmcdU7e97364eG2BEkkFals0zR0HJwvMM+Lx9G2
-OXF6cOEWE0okZJIs2ZzUGAN8b/TjCHkMQy5pkZSst91x0DyNNE2jotZWZrptm0ZeYTHhVoLs1UWr
-zXqADkOvpaNjDvIGgGssDlOmj6Z0HKmWlFFU6gFrWyELbOG2tMAn6/idKevpdBIKdqKzZ2vLZkdV
-mHIAL3I5DoHSU53VO0tp6zoiokC56VB46uUh2BC0/mlWqBORH0Weqi4jSVJFtaFpgBgNhwm48Tjc
-mVCT6yGGQJD7/a6HE2c7zFTXleIN+77T9XpVroPTMvBGf3l5Fk2EH93FRrWzZhOg1ZpnoihiIPbX
-r1dKU/YnZKl7LI4/LseBD7xdyVbWkGdZFnp/e6eqrkT2PnkYwxiGdO86iQPLdbRvI+yDIKQ4z1Iv
-IsnO8ZmVF/w2RwfqiNOnrEpB+nMta/p+01OaUfuEEjGo2I+Djn3VPtrO0tMkpXvXyedIdT6KUmdd
-V1oE9MFLh/Amz1IKVEu/6yQCaKol/Gh+fBjqGApjtjRJJXpsUStw0FanaVZGGyih+76YYNNUk3z3
-faddyBu2XOeflXuGGnjh29Z7ElN4FeLQ6aWXtgeVA4L4YMHz4MpnNWm3iW5wtFMuU3FURR4qhyzL
-qOs6SuJIS1iLIjtptRv1ITUHLLYiL5Q6vK0rdX3vjT4P0y7O0+BVPCBmuUM6UFEViDMcStLpGPQx
-Is2G027bpoYdcKPidRLpGLGuKmXWRVEkk61Kq595nsWVueZItyikMMyJqDEOVNb9OvRuYBzYdc3K
-SvbIJJrGQWXCMESB8aodo1oOTFGygS0o9NYZyI2TI2370HJhUpFlKcUs1Fm8mK5RblfL8LJkh0dZ
-LysCU6V8Wgrv/d5JuRsryLWuG8XRrlRRxgImRZaxAcZpoo+PD3p+ftYHCPEDFg1CK5OEI84XOQkR
-OFLkuUSUiY7fjpyW2SOj4AXdmkZNFqMw0N8JNSRuwONIaJwm+v79u9hhEX18XOmPP75x3yiA0uPt
-zOUwp/ygekDqjHU6enSASWJmN1pCE8pAjMPYhShXXMP6KIL8YQkyy7oqAcWCV0CxEc2N6gcHTxxH
-FEeR59IL5B1KQbgKv76+6RqxvTZm4zbfAd/NBliyUO3wLOqDIFDKMucCxppuZCvVR3n6OK66NmEY
-EwSk+QBpVtC6zDTPg4yTU91UCCvZ953WZaaDDrreGoqiTg9o6zcB3MNpN3iKhTDeQhylYWNncQZM
-SpgIxZWP88JcJWviJNoRomluFKhkqjRPupZ50e9grflB3Irt6cSoZqxEFKi2ONEmMydMpP2W08Bv
-enBkqQMymJQReSAZTDjSNPPUc2CfoZSE/TUWSRAEFAqwBztrTBSQ/ooTU4lMyyoz5UxPSvTnuIUt
-pRNtSZKACbfR+XwWgDTUchKfdV2Z5lzXtTxo0pIMOXNPT096wFpLbYij8NmtmxECSGwGAqYhRMR+
-DCYmzfrEp1lG8zRpm+EmIpFx3s31fWh0m4nItmIe4AbsYZBoFWQJP4+RcVVVUd93NI4DhWHpaeYt
-M9HejPguavstt7pyBoZBo7tCY6sFzCkMIxr1e84acWc3DVpI8P3RdlZVSW17p667/3ZjL8tC7X1X
-kByA5CjOzS4H0SUWofLcNheuyhLfSMM8EHdu9xVufvBHoMewB5qVFg9D702leHKV6++Ik0jbAxYH
-pT5lGSw5cI6rqqKnp2edq1pyilM4uX7EppyCxpmawwKuuXle0iH9C8c8hR4wUZWFzvZRaXCZnmgS
-LYgiEFDg38ei08ZcFKdgmibU9R1rzfteuOOrAnqQBicmGNJy6sMHggqyBfd9E1xho2XhkpBLuovm
-xF0uz3oT2ufECzDREnieZ+qHUaKkNr0peAOk+hz6vhdmGN+4uHnZ93DQA3IRDGRe/HIbh8ayLHS/
-t8L5X9QYNZW2D7fYJHwATkYelRAFsOu/0m1gEa/rStfrVSOsy7Lk9xuZSYjhqD+yIYeh98gxOLQQ
-7ILRIAhIifhTAOxkGbojYqkhi3j8TUKIAqDIepVdKw/3mfz8SgbO+EJ5e/9Qhqm9RCzBJwzZoj7P
-Uh1Xw94e7wAg9qOxzDTNGvtupxNgZGIq13U93e93r2UBw3IYRnp7+xCrsEPp6RhFSpUcm4z2TBYn
-eaix5sXJKQwars1qs9Fc9oOjOljXXoI6NpdXHwYUpImJP549WaU7sRO1ZkKflWWZhH8ShVFM69oa
-B5ud4jjVXLYkYQusQ4JG8cDxHRe5PVG1gMbJ/7wLn91l8l2vDVVVocSLYRjo169X73lgXux6N1I3
-HeAr+C4wMsEpfsifR99urcOtRgKHHWK6kXZk+2huWWYjMOK+sCxy7wazYirc/FmW0SBEKbxvfB47
-jnx07LE0bphyMmOw8Zx4QYLC4YHPUhSlphp9fn7K2DihfXeUbfT7XdfpM8Dti7WYiogGDj/47BZj
-yfNcM/jc4RTpmBAHHDvz9vrf4L/DLYznjnXUNDdhs85KwsH6jcX4dp5nqqrKk3hzS7wRUexNWqwZ
-L9oMawYTx0wgi9KEp290mPcZelmNDISOTNxD2cimi/ylwdUuipzyLOcbYBh0XssjsszrF1HitG2r
-1cM0TTSOg4pvptkFP5RlSWlW6FgDMmA+/UatPoIg1NOdJwxOPIFRDYNfkcye78pIXCR4g91PYwWV
-0D+jX06k3QFq/PHxqYcElHbor+OYg0Cen57odDpp5XM6nQxhJpCgiEk2ys6eeRJGse2bZzGls2/p
-8+yEgIhfHCTF1hEYYNLlfOIKS54NKgybneduIf6suYw5MRkJ5TC53+/08+cvJ4CKYhPQGooV1eGx
-Am1kvOO9r1qdzcus6wKINhZ/VZVqK4bZOqoVsAWLIqdURqaW7wFpM/wmdjF0OdU1nU8n2YybquhQ
-eSQPZJyqYu8HxVpEigx3pv8qHRttACcrJ14qMkbWvCZcajEOiXXb6HSqmU4tCD0OeTBjXRQ8c2VQ
-mSgNXRizwLjw89HbQxdgE4rBpIUmJMsyHgN2vZ+qYscZhyxAuLKodxv5fGosSkRl3W43ZVVZtR6Y
-TFEU0TwN6tRrx4sQ8uTCfrMIqA1zwIO1M1xNYZX+HV++63pDe3W9JQQ6+P3sU5jTqa5EfrzpiYub
-Ms9zyeILFCzFS0jTlMoiV0IONjQcl+I4oYACPXRYMDTqjb9tm5pqsrxzoLqedKPBv46TgCL1KeSw
-h1SrBoxWkVqoDgAAEPFJREFUXR+feIfs7XbTfjqKQmX2resqHHfWdEzzRFmemeiw3AMg8ZxRNdn8
-gff3d5ombpHs+NQKXtCPL7LxjiNzgjKJ3srzkkE3xXZ4zq523DmHl3IGAIPH2to+AKrLg6MU/ndd
-FzV0gZ4fVZB1XQI+g+/Qdb1n88VTnZAPlbo2TkjO8yCgQOS9s25G9gdwLZ9zH950QmUPIWzsg1w6
-9uP3Qpl/v3N1fD5flHWo6+nz80p1XdH5fFKiBX7gNI2qVoLUFPReOw5Tb7fTibI0pSTN9IF197um
-7yA8JI4LNf94PESs0o7LaZ9+jJkqUHocAPaUQ0rtfozq5Au/OLDAdpnbr+uinwN+fWVZUV6U1Lat
-aPWdkg0HwTj2KrtN4oiOfVX7q3vXa6kKYUaSpGrueJBTsqE8tWM9d1BGakXOz8LlKdpIcfamb70M
-QiQsYz4/yA0CQo0zqiAhnjjM5nSqKc9LJQvB9xE9KEpjZMzZigDeAvf7XUtlTJbwHVEJ7CblFyQX
-JgMluhn2fVOpum0pt23UVoRj6UcFmm2KtA3HdF4JE93vnY6oIewaJeT0x4+flCQxffnyhXYjT8fv
-c+vMHeI4GNDOQZt/v7f0/PyseBIz9RxbFLLnJEn0UgUtGj/LZRDaEWMsPAWOHkO2AbQ9WHvIuzwO
-NjWJwoiOw2UbxKdTLS88p3XtHuSvyW9sLxYJzaqLx0Nl+yUWBNU1c/nzvGTLos0RjLIsknIrpP5h
-TGPjxsbp0I2J8s4l2nArgL6UwTbShwkKJvdOq7LlPj8/6enpSUtN9EZ242ECAjUbOAV2RONIGocS
-mWajwV+WWZxvS9U6YOOkaegh7yokEiEU+liUhGmaeQwygJWg9WICYBWDrn0KKMvm3zIE/JtvfUgf
-3qSEn2iaZp3OsMvS4gFVNm0J1ZAdXfKhkSjzEqYdoxxeltwTBKFa0MHohAG/wHvuoEQ3TaMMQfTH
-eZ5r8GnX9YqEWwoxvifH1NXK/nRis4PqulTl3ufnJ8VJ4jn6qnW93MTANWwoR55l6qVg3YUsp8Za
-6zEnIvJwFtCmY/VLXL1cAjwvjLlBcLJELpT6URhoQAmew77vFBdFIYET4W837TD0ctNE6j2GhT/P
-uz4wVAtcMkU6LrnfW7rfW0rTRFHksmTJqnPT8S2o0ctDXPRYGQAkwuTg1rTUNI06z+KWwBe06DTA
-JA495SRcLFqw1wBgDcMoCcEcojlPE82y8GymnxJMpCTGhKESfjhaFnDAJ3HAARiKiQeYgta7nZHf
-2GTVH+prWFalcsM5jNU/ADTFNvR5+/aZOnmvlRyLJFvGkpymm1JAzvjVahE0YkonB6FWMEmSUJxE
-dGsaAUB32gyRyG4GVAcAqHCQW4k3Dl4o46qyoDDkhY93G8UZte1NCU0Qp8EK3ZmcRlLl7F7MGSLI
-yiKXzAB6CPV0fAmQb+Z5omGQqHWpgtr7XTEwHC7WuMPyHlAhweEaBy1i1zG6DALSypGDcpmEFYWB
-HnqYUqkXpTy/aXJ7Axb9RMQ8gH4YKBBQwXeXTdTT3d6S1tXUUj9RlsAgg2g1RhCbChbYE2BUUMSW
-d+jhcVMjeAN91LpuBgTi0w0lGLjkcMyxvvZW752mmRgkck8GcxJWV4UqqUSwB9tqlbQfPeV5pimz
-KOlAF8WNw5wIF4OG0tACRTachIHPyTsQ0I9P80SlpBzrjF1YZHGSKkbzOErSymzddNph0WTwMECV
-tWKUMAwpNMxJO0nAbeXGmJNeHta7AbHZQz8ohmCrg02rwljf1yhjPOtteBy7JzjCpsGYDeuSk6FD
-WpfJqCNziiLY3Ee0rn5oDRyZgNw74DcQYVrvHXq4reHR50JsWPGH9ClwV9I0oa9fvtDpVMv4dfTE
-RLaNw4gzMJgXEqH2/UVowquCvxZ8v3cdtT9+Up5nHPCS5QoKQpXpyZ5l0hOGIcUowUCxRInBJTYj
-nGmW0bL23swXC8U60uIl30VkYl96HMv0IC+Vsmr19JYxhY1RFgVt26Ea9nFcFWxajFVXXdfCiGI+
-wi6jPHsjop8cx9HzfTv23evFsaj4Vl7087Rto2M/BjtLGkeewYLck+cZ/fz5S01QgoB03Aj7KLyE
-RzUfSjWLqjvDzU0rDp7hFmKgEuipD259QAyCGf6mB6I6wDSiQWK2Us1kdCMmeAH+V/ZWfkmeKJiK
-9ZHEER0Zh2wuy6rOvlVV6o21rg7U3YJAx8tO1bbKZvOpsNaabd831YQQ69oMsYZ06uKMPNff2lY1
-xxSWHrz0Lbcf6x3aj/0hFFXR+zgyGgYGg8d408PBrnOLKTz6KNrvm+eFtk69HMKYkux7oHoWXLoQ
-E4GFaUVdwGgWsb3b952C//k//9uBEdOtaWXkwppxd+I6JRKyxicxreSct9nrkbk/zPTh4/8HF1bW
-yofKOYeSD77mIMJwj76bcSMZn/ZY3F4WJUZYvTjMIhkAnE2oiOOe82J1+fb8gBiZZlvyUOa1wBwS
-z4MAnx0ZCVma0sfnJ0VRSE+Xi2oYNCXpfJHfFXibE/+MKmnbNsrSTMlBFiuII//z+vn2TuttWwH+
-s7HyO+znT1MWfjln2f03r4XjYBsvvtVZX4B/D14DpgEufjw07QBboBUFjyqTJPaqFXgepGmmAbXc
-OsUqeuIqYfa+rwP3QnmWgXoV2EmWNSjFe59FHs0isUInNAj8nOdJKOqL6kAAiFpPBg7smH2qt+wf
-PGOU5D6YuKt/Qp5nXvVh2zLmMyQS6NEJ32FSTAX7hFvjjKIoo6a5Cms08t4LgGHQ8adpoqC5/XMk
-SUL94NRwP378pKLI6Xw+U9M0qidellmRd0wHrCLPykfBF397e9dy3toeWU01Tkz0y9aN5Xq90dPT
-Rf8MXjyCQx5vJmfdzOo/RFq5uSqpOytcgR1t2VFSgcziWYAN+frrlYqSJcu2JyzynC2z7x3leU6n
-04Xa9kafn5/0/PzMscwSh7U8SFAfP7t1kPn8vNKXLy+eE9Mj8QY4BiYH9kbB78dBhAWIYJG65nn0
-uix0vV29Wz0MQ3p//6CyZOpyJeCtrfg0y084IkmSerr519dXtWhjw5VQKyBURnj28PNDBTNNE3Vd
-R9++ffOchLHmbNAIQEFUWZiB//z5k6dTgtuogeviDlc2KdnU8xHxYkREP378pL/++lMdssLQof1Y
-/wCg7YGL6rTrOvUzwJ8DIcziKfYzowrouo6GYaQ//vimzxoEJQSkAnd5fX2jui7Veh4jzKZp6eXl
-yYuCh+tzEEg0GD44wJnL5Syz7VzdZkFNTZNYmU0oOW+3m4JX+FJdd9dNcr1+qr+cLW9sJlySxAak
-iNSJFcaH9nS0c0/w6x+FS6BsWgYVnHlsa2JxDRujbdNh8jyj8+lE67pQVbMXHmb96iA0z0qsYTyh
-lwonEIuwTa3Suq4xVMxEe1BNNVagchNUfvXoprYiABMNt43jtx9Cfd29Del4FaQhsPhzaH+sHwBu
-mDxP1Pbcj20LdNT0GJ/FFvADFXnBpJ+ypDhJaN/ZI8Jy7h2GsT3Yve8ysSEvZ/HRORqakDSJqevd
-eBa4BVqL2+3GlUaRu5aKHEsvDCPatlmnHHmeKZPR6iPQog6yqdVlWXIW0EoAY7AxbtZ3weo/bNQ7
-Ds19PyQF+VCqNwhQ6OW3bddJHlepuwbtWJm/i1xPtPqOl3VTI0aXFMthi0laUBD88l42bi8HRJjZ
-uyH12HDRQE49kBCsKg0fiA0zVol9WoQMlFKSzF4ZhxuAf9ZueuPYsAITpT0uZv5vN75dvFbzjhcH
-80seGfHC7SU3jzMUIiLqdZRmQ0ERZc7g4m6synaa50FP3yjKdPHbkhXP2I72vv/9NxVlyfLPB8PJ
-IGAhV1kWyglHeQivP034kZIa1VaWsYy6MziDM5ZATqOAT+RSbxwY5aq2TJB8N75dWTf/5YWqsqQw
-wucs9Z3gsANJy7dgj9XZGOvKeTE6vwN87txMT+CLB+k0vj+AT8sqBEaRZ6m2rQ6bikSe7gJkwzCk
-qixUQAUZPPYOuzNxCzyFToWJjRcGAXX9aqLfe+f6HEfKUWG9xiQt7qox6gCIrWgO77yqTqpc3dZF
-359/+B8spsoyii0Cb8cSwzjSvMwKEAFAsRvR8qkRLb2uztk0y1Kap4Ri4fNneUHL0picdf5voNNG
-2mnT3AQwzNSJ5fHEn0ygBHp53KjO/40Zi3YsZkdfLn8t8r4HcuitWxL44rxg2t9QXFZTuuDQ6Zip
-73ux1T48U089oEQ9OEWRIeks3ggT3IiiZNLK+XRS11vLTrtcLoq9WK98S2BiDIS8jctBnb0njpnn
-SW2t7GYHpZZ9I1v97wBejtNkvO6g2Uid1Zy4SgNBZ/p5QrPkBDpV4uT1wk3T8u0m5a/FOCxQOYlQ
-yt5w+77R+/u7tGUnja1jiu7mAdr7cSjD0h40MAHBc9j3nd7eP/QQsu2pcwXmsJuu72g/GGCe58PP
-a5D+XJOSkkSqa9KwXLhIAY/Bc7UXGS4enj71orhdPG6HJWBZR+vwcVRmN8e27XRIv29VUlgUls8+
-inoJ831mQXWKyo7TTG9vb3oapUIBdWknO31+fkrZyw8hoECFRTrXNtFS1kl2GEe1y2azzUVptrbc
-hzsQej4LFEE/ADdVTAAGAfOwiSdZ6HYMComtdeFBFQLV32yca1grwFRQeC1CpWUptZ+frEu4XJ7o
-y5evFAstG88OQB5YaaUwxg5DXbYjQmuWYUtX6C9wewBpBsr9CKix8qz0bOB9R6JImW79MNL1dtVA
-VMixp3kRs9BApyWuMkl1wwEUhiLOgZ6ruhy5NjVR6zFL+4V9HcDuz+vVmwQEQaC6B2cMO4nv3uJd
-HDgYIAt3HnurhK2MdGtaGkcmk0Hnkee5KhJx4KBN4RQoNrcZhtHZ7JcMLoM+D/KVnXAp5z+JKZZW
-wkbFAyS0Kc46xbFJsNhU9kUiW9yOriyy/Qh88ElJOtdcl9XjL9ubC8IRhCugVK0qnmUy3z70Nlog
-IyOg/4+MOkhAp2miuq494gbwBsu7hwcf7LVcsOOio0Gks9oZrZNU7jrBQEsD9xiktNZ15bHNbBQX
-fkffd146EhY5CDKMFE90vd40odhVNc70Y9s3KgoetUah8+m33A3779y7SRXQws9j08zYc7DFYke/
-nxclbetCt6ZXNSPGYmzUEWmwCxJ1HxN0sOk4apyJXgjggNEJ+ypGKgBzVGbfaQeH4rq6No+NOyuK
-4oyWe6c9PNYyDphHYxS0DAgnsb6QSZLKBIVTg3n+P5sbl3X/EL4lcUytyHaZyEYauYd9AGyGtQ5M
-Vx8HUro02qN19XkXbetck+GPYBORbHAqHL+gkYj5RfgJwKCZck8/UJ6nnkINQgksKDtmQQ45NhRu
-LCU8CNI7iakmRltw+o0ilqrempbWZdKXZNFtgFwITgT9FiabIBNx6Ejs+bLFMbcjmHyAJgxj0m0j
-Z3qaxNTnBeVZashNZNJgd0MhznTjrNuqYp9Z0oHAzIJwBxsAwFOahtoOjeMklk68+NhsJKe+77SE
-rMqC2nvnTQXiOKZj32mZZ03Rta2O3ZioVLCI+r6jMIwUqG3bVtKaHIiKvl459ctKy9oqgIw1g3KU
-vRldJh0AQsz8eZw2a54kfgaLcjZVf7Ls1/XJdkyZJEzJdaCpu1yYiTfR6XRiMHWZ9MCOTXgH5uez
-gKb2gM6Ez0BEtEWuQuYIOesFYAlYcMrKKZf1Yzn9+GcbR4ZDP8syKotCK8RxGikvck1rOp1qz5vS
-8kcwQXhkfCrOJlqCXTAAIqL/Dyy2Xw3ACWE3AAAAAElFTkSuQmCC
-
-------- =_aaaaaaaaaa0
-Content-Type: image/png
-Content-ID: <26389.957885364.3@twelve-monkeys.helixcode.com>
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAgIAAABaCAYAAADKBz5/AAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9AFAhIaFX5RmFoAACAASURB
-VHja7J13mCVVmf8/Vbdu7tu5p8P05MwwTCQnySAgyYTKKogBMK26JtR1Dav+TKuiYkBRxCVKkKDk
-AWaAgck5h8755lTp98c9ZZ+pud3TAzMEt77PU0+HW7fCOe/7nu95wzkKb0L8+GuXqmvXdzRHaiqm
-R2Paglik5ngjYJxjGlZ9X1+uPxzm7lC4+u/5XOHRn/3sfh0PHjx48ODBw6uC8mZ6mP/92QeUPe3F
-2aZlXdrR1Xtqw/j6k3vjicoqNUzSp2PrClplJY2xGqpqK4zaytbP7F277JYbf3xPwXUp2+taDx48
-ePDg4S1CBG79wfVqfyEVSeWLX0l2FS6dMrFmmuLXAts6u5i/cD6nnvQ+fn3LL3noHw9y9vnn8j/f
-/jn+gJ9Eoi+xddtTnzn11A/eXiyYlnRJyyMEHjx48ODBw8GhvdEPcPP/XDV5oJD9oBnihlBcbfC3
-TmBb7yADXR2sWLWB2Uedw4xZMwlGoxRzBqueXcsd9/+VbCpDJr2tSk/k3vnu8459+s8PvtgrCIAt
-CI7tOjx48ODBgwcPbxaPwF9++mnf7kzHBZVKxafymnXOQHs/6ZzCjd/6KZm+Ns6/4lpMw6Shpopx
-4+pYs34rqUwGza+B6kcv6CiKwZknzUw11FW94ze3Pr5GEAFTHJZ0eGTAgwcPHjx4KAPfG3HT39x0
-Xayts+eT2Xzue4Sb5w11divnnXM+a7YMUNRNdu3p4777HkLVVHr6B+lPZDHMImF/jGAkjF0sEoxE
-sYsFGirDwUg0+OSa9Xvbxfuo4lC87vXgwYMHDx5Gx+seGrjzr1+c276h62taqPI9+oCPlvmTec+7
-r2fqlFmY4alcdPEVhCIRqmsqSefSxCoqSScT+ANhjICNBmihIKpPxQxqFE2D2mjFImA1oANFIC9+
-OmTA8wh48ODBgwcPbyQR+P4Pr1TCmfyivm29Px4cHDzFopJ1Gzbxzve/j6lTZgFw8y9+QSwaxrB1
-0tkMiqqRSKb4wFXvJZu1ePhvj5DPpVAUhUI+T6QiSko3MC2rCagFCkBO8grYDIcGoBQy8ODBgwcP
-HjwIqK/XjQJJ8/RQTfVfO7v7T776w59QF550PjlD47Of+ibvee+VLF6yhGUvrMIXCqHaFr/81U00
-1lWj6yb11TF+9YufMW3aRAzbZsHC+Xzx6zeQzKewDZtxNZXzgXFAPVADVAIRIAj4GQ4VeOECDx48
-ePDg4fUmAnfe/NF5mWzmr6l+Ju7bO+SbdvR5TB4/EfCzY/culi9fTnf/AJZqYxl5wMe7L3sP//Zv
-HyIWsln58mpQCtiWgc8yuejCi/jK576Dr2gR8kNNbWwqMB5oFGSgCqgAwoIIaHh5Ax48ePDgwcMB
-OOLJgjd/5/wZmUzwJ35/8KihREZZt2U3xWySO/5yFytWr8MfjKKpGnWNjXz+E59kzcpVWIUUHT19
-PP/C0wwmB+iPp3ny6cfoau9Az+UJ+KA26uOue+5hfGM9c6dPtB5+etU68T42YIjDyRkwGK4k8HIF
-PHjw4MGDh9eDCDz15/NCvYZ6naoFPrhxd6/W06uTzCvc9/en2blnF7bPR9inYKo+Jk6bws9+8iM2
-bXqeLdvb2Ll9E2kjTyKRR/Gp9HT0ktPzKAE/Q719LF+6lIxRZPa0JmZNG289+PjKnQyvH1AUJKAg
-EQGD4YWGPHjw4MGDBw8c4dBApj9dX+juunLSrOn+n9/8KPPmL2LHll0EbBPFH2D+0VOYNXMShUyc
-LavXsGDOXB5/6HkKuTwP3nMvzzz5LIuPn4dt51mweAENLeOwsEnreQYSOaqCQWJakEBAt4A6SgmD
-clggSCks4JQVeqEBDx48ePDg4fUiAsVqKzzt2BNnnXHWtfhUjRlHLcT0+TBtH6qm8qUbv8bPfvEr
-qhrqiFaG6I8PUDBsLBT+dOfddLR18tGPXUNdrJnb/3g7119zNUP9Q3z4Ix/muJNPYzBnE4oEWbOp
-O00pQbACiEokwO8iAV7CoAcPHjx48CDhiJYPBpXGgekz3/6Az998ybe+/H6eWrGbcChEOBxhKNXH
-I488xMypU0nl8/gNBdWv8Y5LLuelVS/wh1v/wD333o8SMFiwcCE1VXVc97HP84tf385Xb/wmd9//
-Bx5+/CGqI2F6hrJQqhKIACFBAgKSN8AjAB48ePDgwcPrTQSWPbcy9dDybS9rhf+65OGlHRR0hcqK
-KlKpFLbi5667H6KYLwAKpqqwaOFCbvr5TbT37uHUk05iyTGN9Lb1oUp7C158wWI0xcfe3b2EolFC
-1RGUbMEnBv6AiwB4ZYMePHjw4MHDKDiiyYLvXzLJfmZ7ccIrawbO9WmBgKHDzJkz+OY3v8kra18m
-lUljFnQCqkqqWCQUVOkb3McjDzzJ4O6tnHr0eKojQXZu38Vzz68g37aB9dt3oIY0HnziYaZObaWl
-2s+OHR3ZLbu6UpQWE0oBCSApjjSlpEGdUsKgt8qgBw8ePHjw8HoQgYdX9jKtuTYTT6VP9PsDE1vG
-N9OXyPPD73+XbD7Liy88S3NrE4/edzOKFWX9+hWsWv48mf5txDSF6dU6x4YKpLNZJugdrF6/lueX
-beZvTzzG2886jWNmNJPr38PSFbvSvQOpDJAVRGAIiEtEIEepesApIfTgwYMHDx48cOSXGFb29Mbb
-FJ+ybfbsWSfd/8Bj6g2f/gSnnX4KPr9JMWuh+VQaxp/C939wHrNmtHDvL3/CR945kw0bephp5mio
-q+P0TJ5qn8L4cdUEYgHaEgaP3n832aLGF649E9te795y2MLbfdCDBw8ePHh4Yz0CgDI0lFXmHd3o
-69nXc2FXZ2dg1erV7NixjWw2RbBCY8/WfUyc0MSiRcex4Jg57FtzFzVmEX0wS7BCQ0kV0HwKxXFB
-lEyWHXGbSTXVRKsiBEIhzjllPvc8sioVT2ZTYvYfBwbEz4TwEOTYPzTgwYMHDx48eBirR+D66y5W
-Kir0aE1ttKG6oS5ayNvJ7nQqPpCyM7/9zp2jbeSjAEpiKLeUoNJ3+1/+t2LcuEpOPvl4+nt7+fPt
-d/Pv13+U55Yt5+xzL2LX6kdZvjZFdE6AuXMaGdjVjw+bign1ZNIJAiEfiqKQzmXoTVk0VofRLdPW
-DdOZ+RtlDtPzDHjw4MGDBw+v0iPw9a9d5AtXN5w9cdLMT0Qj0a9PGD/3a1WxljMjvrqjx1dOnLNk
-yYmx09+2uOuZZ17Qy5AAFVB7ejMcN6+1LpO3Tjl9yRx+d9vfSA7uZuuWLcycM5tf3/Qr/vdPt7Ls
-idU0BgtUa1Dr0wnWVhJTFXr7hvD5FPZEguhFhUA4RntXksYJTeQNU//70+uTumEmhQdgEOhnOE8g
-RWlbYh1viWEPHjx48ODh0DwCCZ9yZrO/+jeXXXr9pKqKEIXUXlZu2T5/z9aO+XYoihahwyxEV3/l
-y+96oDFQvPPT//VAqgzZ8MWivudnTol88bmXNvG5T1zHlt3b2L7iJcxQmIa6OrSwxofOmcTcap0d
-O3tQ4wV2JeOs2JqjI6UTUX3kSdPYEGFKSxV5RaOpuoJk1jYLhuXsK+AcRfbfY8D2vAEePHjw4MHD
-IXgErr/+NN+ZZxx/cW2o9uYvfeUXkyoilfz59t9x5dUf44n7HuPppS+xdsUGtq3dVNnWsXdmwCie
-P3lC+F3vuvz49PVfOKc32RfLbt2+UxX3CFiaZs6YVtewr3tgbsfO7XR1DhAIRZjWFOWso6rxFZIo
-+QFmNoeIpXW6ckV643n8LY1cMg0qagNs687R2uJnXJ1FVzLFCQtmsLUtnntlzY6E8AbEhTdA9ghk
-GC4f9MiABw8ePHjwMBYicPTR0+c1jW/58UeuvmFORayJvz/5GN/98c+w0iaGrmBpAUL+AKlsBttn
-0tM34Hv6le31mXTvRX39AwuOXZJPNDXW7lu9plcBAn19af+s+U3jDNM6LpU0A7FIiPqqCA3+Ai3V
-Ieo1i/Y+k+lRCzUAG7pzTJs+k0/+5C9kuv9Ojd+iZY6fceMC9MUt+jMqjZPq6EkUs6vX7nLKBAfE
-0cdw+WAWr3TQgwcPHjx4KIuyew386EdX+mMx7VvZgr3Yp1g8/exSvv7VG+nc3U4iXSSezGCYJmYw
-iD8YpqKilmIBND3M6o1J7a47Np1z+517f5nMDPz2CzeeP07cR924uW9964TYroKtY1hFLJ9O1oow
-WNBpmBhkYkzhub0ZwgtbScUC3PFKN0mji5a3Xcnsyy5g3oXX074nRWVtHfG+Aq2tDdhK0CkX1MTM
-3znKhQY8ePDgwYMHDwcjAt3dxhmx6LiLE71DXPWpr/CBaz7InvZuApEIKBaTZ07ny1/8PO+6/BIM
-FDK5InlDozdZ4Jijj+E/PvVR0ml/y66N6nueemzrC28/f+71rZPqa9e90jZAuPaV2rDfyOYM0ski
-scYQBrX05TRCLS34/CpPPt1JciAA6SQnzTifX333V3QmZzO5ZRa5VIiCBS2tMdSiqj/39NI0pWTA
-MKUywaz429mK2PEEeETAgwcPHjx4cOGAZMH/+s9LfF2p3Cc/+aH/UCorwnzz//03mzQTFR+2ZeH3
-+TjqqKP4xCc+XfpCIMhtv/4jiuZH9YeYOH4WanACqYSKpqFYvfq4nu7erze2VCyoqFYee+pvrzx7
-2aULLnzmse3jdNNi1544VqVO+95+zrvgZIr+KjZu3cz8Ga3U1vqwIyHuf7yTh5f+O7oNV5xeT188
-QbUFOT1ndvZm88IDEBJEIO/yCFgeEfDgwYMHDx7K44AcgcmLW49OdiWvnzCxqm7Vhs3c89cnKOTy
-5HI6hlkgncmwfecennjyKf7x6FOsePFlBocG0M0itqWwauUaNmzYhG5bBLQAtgm2AgO9AzMSKWOh
-EtSGNEXr0FRlfjyZZ/z4Fr7ww1+T6OkiVtXIZ3/0fdo2rqN9zx4WTa9k7qwGlkyNYvltckWVaa0B
-YsEQuUSSqbNjxTv+tq2PUi6ACmymlCMwSKls0EkU9MIDHjx48ODBw1g8AheddsXZ0WBt6y//8hvW
-LN9MoWASAiojEdauWsPO9p1cdfVVrN+4htX6y2j+IJYKdTUVnHHWOZgFg2eXP4+d1MkXdFQtREAL
-8/Cjv1e37Nja8vOf3vZJxR7a1NxUu2+gPzcxm8uR7l9F04xGVjz9JDdPvo2GqJ/KmB8jG6K6MkZj
-pMAxxzXSOzFFsF5j1ZZBJk5SyeRTReEFyAkikBVHThAAQ/IGeImCHjx48ODBw2hE4Cc3XaVd+LYL
-JoSqJoX/8exj7Khowx8woGCTzxe48etfJpmLM9AziOozGF83jqF8hlR/mspINd/48udobJrM5798
-Lbf87n4aaqoIBjU6u3vp6Ehz+cWf5PKLr1XOeNviuYWCTUNtFe3tg1xz9VcoFC1Mw6K2QmNC2Mec
-JhszkaKqIUBOt0lU2fh1HVQ/Qb9KVLfsZ1btdnYWLAgi4IQGnPwAOTTgwYMHDx48eBjVIxBo1bRI
-S8C0bVYuX0s6kUcNKBTyFioqf779XoJRH1beIBgNc8edd9A4roWhgQH+/Qs3cNHF7+Gb3/gsG9bu
-RdVsMsUshbxFSINvf+sHnHP25dz6x9/Q2TFIMKKj6CbVVRHyBR9TJlSQjCc4urmCOTPriLZ3QNFm
-3/ZB1JxJbaKIokOxYJFOm0ycBq88mEhLHoHiCN4AjwR48ODBgwcPI2C/qoFw0N/Y1ds226eoGEEd
-Q7VIJQoctegovv/drzF33lSMgg8lEKSY1vnvb30fFYtsNkt3T5LdHTv40DUfZ/XqVdRFI1RofgIh
-qKqJ0tPfTWNzjM994WvE/DGUokVIiwIW2byO369yzFETmNTajGUX6asJEmiq4JLvnMlgUxhfzsRq
-CWHZNr6QRWR8hb11ezolBn9naeGMRAScigEvN8CDBw8ePHgYi0cg27+XwcEeamoaSfSmqYpVkSgO
-8Z9f/A9OO+VsVry8hu0b29FzBuObmli+YgUXXXwhHZ0DpJND+KIBogE/QZ9N0bTwqX60YJBCwSCr
-FxhXXUs0HAFdwSiYFC0DFYWKiEbXYJramI/taZPBwTg9PQOcP6+avuUa0XHVmP095NUIhpUiaVvs
-G8gUbOufA39WeABkEiDnB3jw4MGDBw8eymC/qoHKqoqal9avueTvTz0yZeuWvRTSefApbNy4nhdf
-fIXnnn6SVMGgvrGJv91/N9OmzeC2P92OpvmoigQJaBqa5sO2LUIRDVCxC0WKxQKhgEYqmcdPAFXx
-oft8+GwbVTUIh6A/naMuGqS9L8lVH/0wl7znVDauWEZi807uer6PigqFurog+AwCFXn2Zhha9kp6
-n/AEDAhvwD5KFQQZDlxQyIMHDx48ePAwChFQjjt2VsSXKp7bXB2e1REfwLTzhDQ/A939tO3rIJsq
-ENBUMokhCsUh7rz7AfKpDK11tdiajaqAiU3ADyFVQ8cmns0T0lQqA37i6QyqT8MwdVRVxe9XsJUi
-yUKe6roQuztzXHbpVbz9sg8wuC9D/IV/MPuEZk4PqUxqrcWn2eR2ZJi9JMDdzwzu3bFP7xYkIA90
-Ad2UygazklfACw148ODBgwcPI2C/0EC6dzB54plndFaEwHzuBQzbQjFLJYC1jTWk+uKkMjn8gRC3
-3/ZQiSj4A6SyKVpa67FtnURWh2yWnF4ka+hMn9LIdddeR2NdAx+74dP4ikWyKvhNA9MIUFsbQin6
-8CkqoaCPhx65i5eW3cHaFR3MmVbN4ikt+PUh8v1JNMuHv0WndU6YvEleEACnSiDv8gJYHgnw4MGD
-Bw8eRoeTLKgAylPLNhgnnXlF/gMf/iqf//g1ZFMGuWKA1gkTufeee/nF724mFU+RyaZRDIOa6hpa
-JzSTKmTYsn0PnZ1xUukcaRN0S8VPkAvPfTvv/+B1hKpNFNPADBiEwhBQFbKFPPF0CjWoEA5HGN9a
-z7iaGqZOnEBtUwU1NX5U20IL+gjVVxIcV4NeUFm1Tk9s2mkkGa4YMF1eAG81QQ8ePHjw4OEQiACA
-MpgsYuTTXZFwde708z/M5KkzCUY08IOl5zj15JOINVTjC4Vobm1k69ZtLH/hFZYcdzrRiijjmuqY
-Mq6eaDSMYhoU8ln+dNufmD25iUsv+jCKZjB/RgPXXHYsJy6sozqskMlYZNI5hnrSFAZz2GaOzi37
-uODsKSxZVM9QKkC2pZreXI5cPgOTi7y4PRXv6Sk6ewwUAD+lbYe9nAAPHjx48ODhEOCTPAIqoFWY
-2/NBRTnn2eXP1z79/DIKuQLxoRQvLn+C559fwfatOwkHNQrFHDt27mLnzp08ev/91FTGaKxvoKG5
-jvraBqZPbmF8cxPxwSLJfJG6qiATmmOcf/ZMaptrqauw6e0dpD9hoGkqOV3ByhWIBFWKFqAomDZU
-+WpYsaWNtGFCJEl9pWWua9d6Xl6b6hGDf0I8/z7hFShXOugRAw8ePHjw4KEMFMkz4ANC06fX106Z
-WP1Xf+34RV27EwwmMxh2nrAWIpcYQotWYOYNLAVsw6RY1ImEfdiKn0goiM9nEzRN1HAIyzSpidZR
-KKTpSwxQFbSpqNQ49ZQp1FWGeGZZGys2DBALB6mKRqitrSSR7sLIm6iKTSiiMHdGC3ohy8KjGojW
-J8n3dqeu/0H/BrNodaDQVVet9Q8MGQawXBCDOKWqgTxvrjJCZQz/L/eM9hivbf8LyePB4BE7Dx48
-eDiMHgHHG6ACgcHBrO/tpzRNam2ZcPycJcexafsOIoEAuUSSU885gU985NNs3b6DgaEBPvC+d5JK
-xclkdaqiUWJVEQKBIFUN9Vx3w/WcftKJPPDw45iWRUt9FYZdoD9lsmFbN1t39JJNm4R8KroCM1pb
-mT13EsnuPnL5AnPmzCRQUUGoLkIxn6VnMElYNenNmpmly5M9VVHF/u8v1R/zH5+se1tTvd9q6zJ3
-xRNmmgMTBd8MBMAnDk0cfunQXP93fveJPlFGGPzkflNd574VCYDP1Taa6/C9Rd9R7iffW7yf/i9N
-kP6v95nien/VE4t/XWiujlcAZeve+MNfeMdRn6yacQUdW/fwzOrVWKrFtR+6hjNPv4S2rm5u/f3v
-+NRnPsPKV1YTrTYI+YKotkm2YBKJ6OQGE/TaIdJ6kaKqMLW+idaKKpKpFJpRoLOrwGA6hS8QJRSy
-SZgFdnf0EY5V0xwOsPi0hbTvaSeRjpNImQSDNsFYJc1RK3r+WRWTzj9JC4QrlKZ1G7KcuDjyjunT
-IupPbxm8de26tMH+CYPu6gH7dVYmH3AKMEca7BSXYVFcz+dsknSv8HDIng1ZSWcBpwL9wD/EOW+1
-PAnH2LwTqB3F8FrAKmAtw3tJvNkTQp1+mgycDaSBB0T/6Ly5l8BWXHL6fyXM5vTZROAcSt7Ft0qf
-He42WAwsBPYCz79F7YuHQyQC/zTMS1/s7Puvb9srjp2/8Lieyy7gmdVr0FG46abb6O3Nc/ttf6Kj
-t58zzriA6oZqbMtgIJslFo5SXV+Palrccdd97O3upiqkodsWQ6kcqh6jJ5HDZxrsyxSJaSEaakP0
-pfLEU1kaxtex8MwLiPd08vhjLxHvjtPcWEtlTSXHz6vGsIuEw/7gzKnZ1gGfppLx0ZvIkDZs31mL
-w2//xnWN7Zddl76H4fUDTMlD8EYMGqpo4w8CH3oV339FPH/aZYQVcd1TgJvFeS9SCoc4+y68FZTV
-MThB4FvAtIOc/wNgt9Qe+luACGjAEtFPu4ClUj8V3qSDq0NgjwECwDqhP/8X9u9w+mwh8Gtg51uk
-zw633fID7wBuBO4TMuC0gY1XlfUv7REAsItF9L/e9re7p4x/21H+UKpCKSpUKBGee34pfsXmo9de
-w//7+c84422n8dtf/ZYrrrycjWs3EQwGUPQCuVSOnAKVsUoKhTwUdfa2ddHDIJlihmAgiKabZG2V
-TNFPZX0loYhGZyJPavlKtq/dgWIUqa2K0DuUptgxhJlJc9yiyfQVdKxQgzqU8LNjWyfVDZV0RTT6
-k6p/75DeDEoN2M5A6Mwc34h1BRRJofYBK8XvsqtthvjZRym/QfYGWEAlEJM8As7g7hMGOiju5Qca
-KK2qaLve961gdMOS63FAtIfbS2IJQ1QjDUpv5r0k5P53+snn6qc34zLYDgmYBawQ73CW8MQ4a3X8
-qw6Ecp+FJRv5Zu+zI9EGsn0JizZIiHc38TZz+5clAvsZ3bse69v2qa/PWH3eeaeceuYpr/DCi6sp
-2jbf/+EPmTxxCr+77VY6Ozr5+U2/oKOzi6r6Jux8moJexAyESAz2U8wXMAp5bJ9N0YTmCa3UaY3o
-CtQ0RDj3nPOI+qPcde/dJPoGMXw+lGKQgqET80fIZkyKuUHqmipR0j70gsFL27vxR6qZMXchSs86
-ioTQFJv+3qHss892KmDPYHgXQnngVd4gpfIBfwT+DjRScn9XABHg60LJ1guj6+ybkBGGxwRCHBhO
-cBTVMVYBYJz43NmW2XiLGB2feA+ngmUN8KwwNEXpyFBaTjos+vWtELd195MmZEAVfZR/HfpJkdp5
-LLkziqQzDtGKCEIK//prdDh9FpL6bNzr3GdvBp0MSkQgJIiAzXDJtuNt9fAvRgTkmZe5b293/J2X
-X3H7Cy++2PiJT94wc8+W69H1AK+sW87qVWsI+UN0D3Zz25/+SFEtYOVzKCr4CIGRpzISIDq+ldNO
-WUx1NMJgPMX8o6fQ05ti9XMr0XwKm1/ewMZNG2nv76CmLorPX0lBT+PDRzaTxB8KEjJt4okM2UyA
-1Ip2wg11ZPIakUCMc088w9yya6teUx3UN+ztXnf/Y/E1lNzGC4Ct0gDyRg0YtjRDN8TzFCQFQ2Lc
-FZL3wjnPnRvgdt35pX6sFd9JiXc2JMPNIRhud2zY/S72ETI6qtQWMfYvBXXITdE1IyuXQEkZb4L7
-cw6hTRTXYY+xPf5ZkuvyCNQIYxpnOFmXEd6j3LMeyjs4+RdVwGeA70kzOjlkVq5PeoELRF/0A1Gp
-H5TXSYYUV5+WuxaHUSZH6rM6IXvJV6lbh7s9lCOslw4ZcuxLUNiXvLAvOendD5UUjvYOh8NOjVU3
-D4d+Qfl8r3KT6zc1cdbKkQBhfIsrXl7VdfzipluvueFzV9bXF8fnbX/Nd278f4qBYfpCPiOZydqa
-qioLpk9WjIqIr7WlSZ1SW62Eq+uZPL6evniCdWvbGDSzbNi6k+62NqZMnkBP/y4sxUI1bPqSQ9RF
-QlTYEQYHMyghBUvxU9TzVFWomNEgKd1HwIIKK0CNoVLXZLBhxWO5l9Z2de3c1NUO9ACdQkELQJsw
-XDNEx7S9gURAF4oTlxh1hv3j25Y4Z0gY4CFhdBKC2Mgxf9kroEnGKiaUNCquBfuHFA4W25WzhH2u
-QUoePA63O1513UsRz50SA5C8gmRa/O3MymzXdeTqCdtFGORMcHlmO5IhUw+hPUa6hlwx4vwdEYZ1
-JBKgSt9zv4fcT/Jn1ghkUQPqKSWdAvxW0pHRymude/SKc91VG8pBiN1raTO3LKqu+youWzUW2T5U
-uPssJmSvQtKt4hh1S5YjTXoX5zvGIbaH5pINc4zXeDUeJKcN/JTClI7+FSU91cd474PZl9dqp9xy
-NlLo0G0nLEmeFJd+jWYj3O2kliEnR9JuHnYiILMnuRELQP6VNYPtKz9y4z1TWqtmaeGKCabuq8rk
-c8FsJhdIpzM+y7a13Zt2aSeevCR86VknRkLBCt/GTbtI9g1iVqi09/QRCAYIh2y6BjsJhkwmNtfy
-8totjKutpToYJGcUSRRzWLZJLp+lsT5GTyFJPJVB80OxaKIE/BgGWLaFrRd56omt8e6+TMrVgc7g
-a1BK8tGFAM8BNrzOLj2nPXUx8JvCiCTEMxUloSgIotALtDO8m6IzABbYP/nPPaipwARKCYnzxN8v
-AN8QnpG8azZdTrmcWP3HgauA6eKeK4H/AZZJbsHDHSdVXe2Wk9pjSGoDwiiI+AAAIABJREFUJ3SS
-d7WHYxh+AhxPqYLix5KhsgVBelC4Ob8m3qdc9YE8K5wAfFrMjCeIZ9gK/BX4iyArBYmoWaMYLrmd
-3eEqx6g77/ER4GrgGeC/pQEb4LPAZWJwv9kh7a4ZqvP8TeJZF4t2e0QaPD4ObBFtqrue3RaycLu4
-zueF3I42u3Hu2SDa7GJgqrj2DuBvwK2iX/OjtJljXN8mPBj7gO8AX6CUxR+kFEb7ptBpt0werlCK
-3GdNwPuEp9FPKTn3mwznTRRG8dxpwAnAV8TPqJi03Af8rEx72CPoZj2lhNoLxe89lJIYf8twIt/h
-ShJ2t0EUeI+wLXWCoD8K/FDoqBwusEYh+5XAJ8W1pgrZexn4EaWKoIPZF6c9xwv9OEHIm3sWfhml
-MKLjUUTSL03c70ShP/dI+qWI9pwDfBd4gv3zzOwyz/K8+P064HIhJ41i/PmZ6Oe89CxvyrCaNooL
-Oy8YYNiG3l3tCQUScaC+qqqiNp3Jhi3bDsdqQlVf/vJ7J2jhyf5YTYVSyNkoWpHBoRx2Joxh6vS2
-dZQClKZGciBDVjexfQGskEIxbZNIFzC0IgEzgG3l8BuQ01XMYo7ZE2sI+jUi0QDRsEJDJaBbnHv6
-+Ni9f98Zz6RNdRR3U4rSroRB0fGbKCWiFV+n9rWkgd4QbZoV9/e7iEBKGIUBoWhy9r/MuMu5oarF
-AGEJwzmVUrnaPOASQS5S0izQLmNoYsCd4nuI5wgBp1GqTviEGEiS0rMdLoMjow6YTSku2yp5RHTg
-OfEeZpnB2y+MyQ1Ckf8q+jorzv034GRKO1TukWY47jCDE3Y5A/hf4VZHXCdKqQJgiVD4j1AqrcpI
-XoqDDUbqCC5vOUlrirhHlwgl5MT1bUHQlgjjXyPu7ciQ3B71lMreFoj/RYCjpOdoEQOSXaYN5KoB
-xDON5g1w2myRaPcm8f+80L354vgA8GFBptLivdxt5lxrnCAwk4X8BShVXUwXJGGBkO1dkrv6cJEB
-XIPgvwsd2UuprPBUMYBcKgx+ssz9nTacBzzp8r5OFGRpDvApoffpEQi/kxj8Z+BM8dkg0CxksFJc
-K+my4xxG3ZwjDscWNYmB+AzxDPsk++LuA0UKiT0EHCv+3y9k8mzgdHE9R7+zZeyUIxcnAvdLeinb
-+z5x70bxHEnJ2yC35WwhW1OE7cxKXo65lCpGJorPMuKQ29UhNmGhiwiSO0OMMT7RXr8S9/ubINLZ
-w2Q3j2hoQHZV6ZILOyDFcC2fTzHy+VzOsqzogoUTpl72nrOaTznp9MC6je3s29tB92Ce3r49FHMG
-GcvEyPuIVUSJBgN09w6Ss03GVVegtzbR35+kMlZFfeNEOvq7GewcIBIOkrTyzJvRjOLTsXSDwe4U
-0aBGJBxhdkOYvA3HTAtVvH2xPeGnt+0rvrCpMCTNtHwutyJC0ZYLAZgAbJZmOK8HGbBd7i8fw2U4
-MJwX4BCFnGRY7FHczjIReAV4WBiJIPBVoRBXAb9j/3JKs0w88N+FUvYLpt8t/n+WYPDODEh1eTvs
-w2x0ZomjHN4p3s/t0naMxFIxeDYL78gfGc50/ri4xt9EvFORZtOm9AyaMBAOCVgpZsZOouJCYfyO
-Bn4OfEzMiuwRYpPKIQ4+QdHuCCI2TsivKg3KzgDVIGTJcLWH49L9AnClMLIdghhkRB9nJVd3wRV6
-Ul22IcKBSZqKa5Y1TngpmoR+/VHMWoOCgHxADOq/Fu3XI3l/3OEbOcGyTnhG/iyes1J4uhoEqfgf
-DqyUOZwENSo8D/czXM3yFfG+1wrPU7n7O+3SLN7xj5SSgh2SeQVwriA060YImTiDV5MgAQivQJto
-nwXi+WqkCdzh9NY5bWAI3XpF6NM0qT+/Kg6FA9dtkQffbwgS0CFm5IPi/xeL41tCVtVRrhMUg2sV
-8JSQ5yrxvTliovKEkOuYy0uCNHg7sl0p5MhZjVaVdKdakGmljL1x7ETEpSNfErZAAT4qJh43CA8W
-b+YQgeryCFjSoJQTjZMQndYLdFuW3VEomG0zp9emv/XFd804bsH8yKZN29i7Z4j1G3aQ7eqlkChi
-KAqBokkxD6lsnJ6+OG17d9Ld3UNjfQP9Q3mKpsbMRUdzwXnncsxR86htaaB1/ASax9UQqY4SiPip
-jgV51+WnMG/uRGa0tBAOmdRW+QiGkkxtKVR87MLg5KooMYazXB1D6iS7OATBFgYqLQbHE9+AMIE1
-wmDsjnkeasyvW7BpR1mKwuWGmKU1CKF3x6ZVSaCvFf/7X6FA48SAuUrMhOqFMaoTxsfPkVltLCsM
-bpcweHvErG+HGBhjrvdQXKGS+8R13i1ciOMEmZkl2uUlYTgjDFdjlCNFVeLev5VCTH4xKPxa9MuS
-EdpEeZVG110W6mRrV0mDcUAyPPVSe7g9Y0XRhjmXjOUlElzuWeXBGMlgVoj/+UbwYnxUDHr9wE1C
-zyrFZzuBX4p2nC5ct3XSNVVGrojpEwa+ShhnhdKaGQgvwzjxWVAy4ocTCeBxcV+nkkC+v6NboRFk
-MkVpHZG/iz7xCXKZF9c4WmoLt07JoSQnNHScaOeI0PF7xL0PdyWNfJ3tIozkE/fZLvoEQWYmjaBT
-jkxXCY8cwG1CFp0KqmVCZqaId3Ou4yadTkhgthi4b2c45+p+ce1LhU7I/eGO5wcZToKMSToUlp4f
-8czlZFQZgQjcLf5fI77zrPj/dOF9G8nmvOk8AnJygy4JqjOA5YCMbZMAort2D8Zvuum+EMHoArTq
-xlhFTTAYqwlZ4aBqBmIECjr4w+j2IPHuDCctaiaZ6megb4gn126kp6+HgmXw+IMDPMk/0Px+IrU1
-DA4OEK3wEw7ZoMRY++IWErkUQcvHoklRIpPG0aAZGH6wdGiZMaHqD9/WFl/71eWZwYzuxJAdN5s7
-flsAtonZyKVCEB+T4khvVeiSR8FJRIxLRrxa/J2QPA24ZsBNkmE6Who4ZDmZJ4ygkz1dPAIxr22U
-SgiTIj8gLe6VEuGKcBmDKTPsf4iZYqMgAEsZXszpJWmgUUZwh4fE9xDkKsxwfkdRfH+HOGaI0Mkq
-KXdBf5XuaXkmrkmz/5jUBrb0WVB8Fmc4CY2DxPGdxNW05JovF7f0ScYSYdjCZQZtJON6rvh7mTjP
-krwNDjFZJ1yyp4gZXdb1DLLB9kv2J8z+24zHJUPulu3Dve+G20NaFHJZ7v5Zly1RhJw0CHksiPeZ
-JfVXlRgkBoXMF6R3cGTCEAPNlcD5YnB5QNzT5MjU9duuccEJFSfEO74sCJ2z+NKgK0RjSyG7+YIo
-26L/NZd9ce51DLDRFR6wXCTZOb/Kpce4bIO7EkGVPIc+iWhXSKEdWY+cSq5QGf1yP49jI/0MVzsN
-SMS2SbSP47kuvtkGkHLrCFjSQCHPVJ1krUzQT+3Mqa2R1tkL+9OZ/Cpd97ceNW/q5HA02jw0mFcD
-4Xrad++lvy9JeiBJRs+zdNVmEv1xIuEIA/t6wVaIRmJMbx3PULyP/v40RjpHTUWIQCTMjMnTCFdX
-sW3rLvwBjektk8jGh4iNG0+sejKq9hKmWkVH90zqihuqfvRvcxZ//i/rCgOJ/Wp9DZd73ZYU+U8i
-TPCvAFsYqSHBrnUhkI4gyrNJn8vQOAleDk4awRjkheFzst61I+QRsCXj65CbkcoH5UHPcY0OClfy
-ecDbhSfrBGkmp43gRnXaIiRmAjBcepoW7eq4D6uFF2aGOLdK3DfBcCLjq4Uc0pJnMD6X29/9mXsp
-YJP9kwwtYfCcBZscw10uLq24ZteBMt4AN3mqF/9LSzPhfvFTFW3UJc6pEW045BrA4cBEWMelmpHC
-QhlJtsMc2bUlbKFLcfE+Ben+iku3VBfBdGxpQUw63ivCApbUvmExSIbKzBZl/btFnHOJIAKfopTT
-cxeHt2qgHBkwhez0S/bFIadRoQMxye0ue0ScfA+nvU4bxb5Uu+yL4pLHjPBMzKa06uHz4tkuFNfY
-xXCCsF6GICkuGfZLOqS52t/vsnMjec7kd8lLYQb53ULsXy2k8iZLGhxpHQE3G3TiwcaPvnr2cUtO
-PePDXXuTlZZWMW5dW0bbt71d27StK6SoATq7eglHwrTt2kVQUxhIDGFYFhWaSkV1CAubUDRKnRak
-qqaSxdOaWbOjSG4oQ1ApYBs+zLzCylXriDbUUNNchV6wMRWdoxZNJd25i6MWRkgOhUm0F5g6fQZW
-KkdTvGPc9Wc3z//eA91F3bCLLje7XYaBmsJl+VZeGEUmb1lhVAcYTkx0s1V3qY2jGDnp3D+Kazmz
-fkuSk1SZGOqR8G44RqdXKFZWeqZySVWW9M7O2vDnCoN5lVC8XdJA4lxPzrKWZwxpMXDVivMTYvBM
-SEQiKu5dEEoeOgzhknIJhHIJXbkyqJHq003JIDrGPCXeIS7NgnRGT0Qtdy+ljLFPS4O8k6jVx3B+
-Q1Fy9+ddbeZzzezc7+TUrw9JYUvnPeVNqg4XEXDPJjOSbhUlku3WLbXMQG6KsMmnKSXV/YpS8u53
-xOCpCRKhcWD+hSPbzj3vER6zy4CZlOL0GvBTjuwCW47sOCFiR2ZCkg6EJLKoumbyWek6v2P/NRlk
-L1fC1f/lBt8fAt+nlDD6NldI8VGG86tGypdQRtAv98A+loXoFJfdSgsZTbnGVs0lo2O5nn0I9uI1
-n68dhAXKxMA8dv7kSPPEJR9du7Jv4fq1m1m9rY1Uqki0pgbDgGhlhFR/gh7DpKmpjnwmxfSJk7Hs
-HP2pFJXBavr6+2hoquXUJbPZ3dnLI39/jtraCJe/fTaZlMIr6/aQSiTRjTy7+nuY3NyEVh+lI56n
-89l1bNywk/e+sJd/+0wr1aECe++9lZaTVWqOrdbmqqHpnwsGtO/9Za/J/vW2spI5BsvJEjXeomTA
-dv1eYHhVQkNyP8mDnLtkzTmGhNFuEGGBFey/sp9znRzly80Op+GVZx/dwvg47ja56sIq872C6N8d
-lBIbFzCceLhWvGtWcj0WR5gxrBfxyIUi1leU3t0nPpsrvrOb/ZNUOQzuaV3ST58rXOBzzUiUEZRc
-Tk5FknnHszJa/bdyEIJSbma0Xrh2F4rwjNNmWfF5jXALQyn3wt1mlPFqIHnxcpJrvljm/od7ILRH
-0K1iGd3yjTJrPJnSYk69wJfFYFntIlm+gxAJXSJCO4DfU8q0v4BSLsydEklWD1N4pFwf5CX9P048
-sy5CrWoZT45jX/aJ9otQSupby/5LwDuJhhlXSMA9ITUEoX9AEHyTUuXLbhGq6JE8FfkRbLst6VeA
-/Xc91Tgwr2Cskx6D/VeGzZaxK+ooBEcmIzblq3lGknn30vSM4Xw5iX1EduJOHjQBs6m+3pdNFRcu
-XbaBp1ZvYsbR8/mPGz+HP6yiGwW+8Z+f4qc3fZ9MNo0flVAoTCYTJ5vOMmlCK1e86x1MmTuB9t5u
-nnxpFVs2bqU6pnLKMeNYMG0ypy2ayfHzWgmE/ERiYeqrq7A0H4mhPOmMQayqlauv/ywts1rYs0ph
-3Z1DbFq5j+7nOgkMhGkK1yonTmue9N4T6uZRSqhpEsc44b6qllxYAQ5c2OKNGshHi+uO9RqGyy1W
-rj57pJXNdErJTAg3+mxJsDNidvxuMfiVcycfTviFwXAyf50Yaq342xyh7eSZU5JSqRKSJ6NNfJ4S
-xiI/QpjBopRwaAnX/8WSvAQolTR+X7j5eoSr0hpFCe1XYXx3ib+nM5zkGRYk7bQys/TR9NcxSA2S
-6zZIab0F7RBn0vYo93pQtG+zkBUnySpIKT7+XaF/SUo5IOUWarFHMbJul+9oxOVw66fpegbzILMt
-OaFMLpcLCU9SwGV7RyMTTsnod4UsxIUM75S+O47hBLkjkYzml54xRKl88tPis5Xsn4dllZGNPKVs
-fsR3p7F/vkoNpWTCycLeyPbFHWY5HrhGDP6/EF6SZQznE8VHsVHOtXaLv+cK+QwJ3TiPUuk1jG3r
-Zbf9dcup+7yRSIBP2JVfAZ8TuhMcoS+d86dTSmT+6EHCtc758wWBfH+ZMEVZj4D88DJDx19VoTRM
-nYzx0k6SOYtTzzyND3/o44yfNJkPXfVB/nDrX6mpqEYxTfp7eyjmdKK1EWx/gIrKaqbObmbK7skM
-7O3Glytg5guMn9jA+OoQvnCSUKSK9vYEhVyBQMBCqYphqyqpbBpdU/neD77NwqMXs+eZn7Lijz9n
-+tsnsFgpkOiqIbPDRKsPMn5uk/qubOGoXQOGtWJ7wpJcVDajL/n4eu7WZ48SkrEPcdCQZw7lVsIa
-6dpyLLlIKRnpJKGk54tY5qAwXJXiOy8x8mp0r3XW4cCp0y+HRyiV67mrMOQZQ04YgpeFC7aVUqZ/
-TnKNlwsvyCWRmyhlN39QGIcTxEwsKEiSJgbY2xnOnRnrQksjbYst98cyQTIaKZWqrRHG+ARpNqoy
-8nKmMut/UTxbhbiW0yZrhRF3zjUYeZlXawTZUaQ2a6NUTXGDmAUvEG5sp6baL867neFExbEssjJW
-2T6S+jnaLqYj6a2T+LlX/H0UpRyBXjGbdkJLsyjlV/ygTHhAHjwuohQL3y5kb7b43Ll+hPLJnIfj
-/ecJ8uuQGSenqFt4fxxvXZEDyygd+3Kb0OsWSvH9c8SgHROyiUQmzRH62RTPYAnScJrQy50ML9aW
-4MBEZtv1PA8JsjqZ0u6Km8Q7HSO+F+LAvJuDwXoVMiLLyVcYrtzaIOxXhgNLkp1Q3HcolaB+UNiH
-7WXOl0N3PxKhlPcLve9mOMHZ1sYoGCrgq62fqS1YdBHFmx+kqibCL396E5n+3Tz+1CqKhSJLH3uC
-pilNhEIaOb3I1NlTiad6KORsVr+wgq0bNlMZCePzQc9QnFg0yOrtHazfvoNIUCFp+IlEapgybRpD
-Q0MkU1lMFcZHK1CLWW7+9FVMmuBnMNHDcaEo+qBKW3c12S0DTDpHwdZ8pDf5aRrXHPjSxxcv/O5v
-/sbLW3tUVwxPTkLxlelM63UgAO5FP4wRlOhgA6jbdadzYBaxNUq8zJYGz0FKK7ldLVh3UMzuELHR
-Rykl5xyJZKyxtnlIzB5sDkyQsl3hgUFBHD4oBsNB8R5ydrddZsBxvn+fIA6XiVDAYmlQWCEMoDML
-kaso3EtByzIl95M1woBriGt+h1JdcotQ4DSl0s4pYqB1G5+RBtA+SrXunxDelSrxjtsZ3snRdJEq
-u0xIoVzylbvNHhOG5Z3iORdKz7lWyFAfw5tqpcfYZrpLtk3XZ4ezdr5cPpG8nLDpIp+jxaJVISuP
-i4HvXPG8TmXFZEEKHna5puUYuypI4Z/FADpTukcbpQWcRssXeS3vv04MslPFjNlJrs6L93pS6EiK
-AxcCkol1VrzDtylV9CxkOMkT8dlDUviOEbyZPuFV6hRk9lhxOCvJ3i/CEKN5DXURmvqxIK3jxdFL
-aSXAyyktJsRB7PFIOmJIHiQ51KePIiN+QWgc72VRTL5MSbZM1/nbxPnO2hYxDlxa2Rm7A5QW8Xqb
-kJmQdL4OWGMhAv/shGw6rTXUBqmtUynuM8llkuzaleLyd76LhoYWVq1cxeXvuIhHHnyG7q5utu7Z
-Sm0ojKr4OXnxQsLhED2JFFs291NfXcsPv/efhGJNbN++ll/cfCvptm58/hiB+kn4DYtowSZkmKT6
-OpnVWM1ZZ53K9KNNtOIghb0p0m1tBMIBqhcpGGmDrBWjf3cHr7S1ceJFReV9Z7fO6erp19vjpjxD
-UlwdYrkGZF4HMuAI5CXC0Ackd/VYPBPOQHi/YI5VUhzVMUy3C0WNSbE9owxDdojAkBCS3wulHC/u
-NSgUNTVKHPe1wGmLDwlXfDPDayE4jNWZdceFgjjJfsoIA2lWvM9DDC/ZnBDKnhzFbWgyXGffT6l8
-cCPDteq6uIbz3aw4b1Aa1Kwys4QnKFUwVEsuUZ0Dy6ec2VNGzFJuFIY/SGkhlqJg/w9JcevCKCEO
-pw2XCgM5Q3y+UxjTqBTPVFzfjVMqo3R2tXTnZrjbzKlIeElcv16EcwxhrJwBIifabEDyzIzUZhcI
-sqJLsq2LmeNLEqnJcXiWb5UJ5dOu+2el+z9EaXGdcvcvF676sdBFZ50FJ7lugpCdnWW8PHJ8OiNm
-dHcKd3aTRBizjF4K+mrbwSEsXYIITJDsVK80iDj5PEPiWdybgsn6uIfSsr6Nwu45qwH2CfuiUL6s
-1wmzfEEQWsdrV5BCT7OAL4r++h+pPWTyKpPWZ8XzTBeft4tzfi7ulZH0q5ytcOzWGQzvKCpvlDYg
-yJ9TTeNOTna77u8V3h2nyiTMcM4HHJjg+AfhOXAqm8IMVzW5k3k1SsuvLxf9EMJVFukbAwlwanr9
-c+fOrX7v+67+WHu8g7XrNuIrKHzq3z/Nle9+L1OnT+ahxx5jx+YddPV0o2katmGiKgbTp7dSV19J
-Z18/8fgQvb0JDJ9FfW0dPttkyUknEYxUsXnTBuqbJ2BhEu/vIxIJ01xZQ9Yq0lBXQ0QzWfZCH7kd
-eyh2DqD1FzHT4G+uw2xoIZQpcOfLXdy3ehBfKMTsea3+iRX5yu6+QmEgbbg3+SnnbjzUnfpeDZw2
-lRc6cga5IVd8a1QPjTR7cDJWE+L7ukuhndhZuQ17ygm4IT1PWhp0ZNf6WJfUPVhbOAw3IIWqHGWQ
-Z2Kj1cCPFKt1XIkpyeDEXaRoLF6XnNR+TsKdYwB7GN4caaQlYh2FM1x94X4OdwkdDGciyzsxZsQ1
-+oTBGYncyJuiOEtuO3s3OG3pJFbprlmoI5+WdL94mVlfufaSS6kSUps5a0H0Sm2WP0ib6dL9ndmS
-Lc20RpPtVyOPo/VZiv0TFd3PlnN5N+REtKLUfo4+Of0XZ7j8NOfyVsnbIjsEOSn13aDUnvFDmEyM
-1e47Nf8Z6RllGewVOjAwAhkuJx+6ZF8yUnskXaE7Z2KmCRL9J/H7/1DKzekQM93l4ruzBHG+j+Hy
-43JLHstJeU4VjVyu7Oic0z+pMp4rec0PuWrLKSGWJ50Z9l9rwijj6g9JfeesW1JuXxWfdH5OOj/r
-Ii6W6/pB8bm8Ed4/yYk2BoH45+DT3rbXBDadc9JZR93557/SmRri05//Erf8/ves37ydbHwA/AFm
-zp7JrbfcQsu4Rs458xR27m5jx869aD4/waBGJOLHKir88re/x+8PUhGoJJVLoNh+ahpM0okh6moj
-7OvqMhNpTQ0oAWX15h6eXbWLXO8AlfVhJk+fQmNNgHcvCJDPGKRWtvH7R/bS74uyO7mXx/70Gza/
-8iSzZs2uvGygOO+36T57IG04jSIrvHtXM/0I5wzILNkpZ3NK+JJjIAGySzIluZNMicXKm0clJWNW
-jgS4r2WI6zgJK7LBS4wwgL0Wb4DTFgOiD1KC3fo4cI2ADPsvilTO4Diz6rTExH3STGC0Z7fZfw0G
-R8HkRCykmXZCGgQO1rZOxYrcT0aZ2bDT1v3i3LTUHpbUHg4ZGcn4yySwT7pWUPq9XAmh7M4dFNdW
-GDmj2+1VcoxYJfuv1KZLxl4mQqaLgI/UZk42tkziU9K7HI4BsJw+jPX+OZcr2ZLk0OnLBAfWxzvy
-MET5ZcVNiUT5GS7l0yS9HhJ9dTj1siA9rzNwBxmutMpLBEkmSeU8RnJ7OhUQMYYX5ClKg6Wb0Dl2
-2rFHlniukBSO00WoCymHIceB1QNyn/RJ9jHoyqsxpJyDVBly47bhBclrJj8TDJe6yhVdliuXx5Ds
-vy7JhDtpUnHZTE06Z6QF3mR91qT22C+UqY1BMf6JbbvWG08svWXXth1DR+WSKcY3NtPX28Oqlaux
-TINIOEIym6MiEKKncw9de3czadIE2l/qYsb0KRiWQvuedlRFoaq2Cl0PUCiYFIw8gWgYtQBBzSaq
-QTybpbOjy5wyfQrhqOorWhGu/tCHUI0C9f5ervrct1i/9D7W3/I9zEgF9z3fht0S4TPvv5KBpM74
-BYvp2beRRDHBpEVTKs9V1Vn/+2hHTmp4gwPXCHcnlxypRCSn453V1xTXLPhgyVOWNDMxpEFTFkBn
-9uhj/1LA0VzitqS0YYk0mRJrzx2GmZf73vLWrkPsvziMmwxkJTexNULszpAMc06a2Y20k1i5tnW7
-NeUlbHUp3JJzxf0ZQQkN8V6H0heO0Qyw/x4PptS/uRG8AZb0/rY0k/RLf2dHGNxl+cy45MkYwYsk
-t5kTXnG3WYH9d9Q0xtBmmitPwJJmb7LcH65KFpmMGaL9X839ZflxPCRDHFilZLF/qaW7Lxx5QHoe
-Rx6cz+TZ4OEIj8hk2pEBtz3Qpb7MMfLuprJMyCQrJF3PYOTdRR3vp7Oa4bGUkupWCE9EQbjmnc3S
-NkgkVF4Ey3L1iUx2/Oy/V4K8um5+BIIj60i2TK5XUSLiI+mPm3g7pNIpWR0podkhTqakH4UyZNgu
-I8+a9O7/XPxMOwThsHu70vovbrplu1+pwO/zk8gnyeVyvOOiCznvoou44/bbefTRx1izfgPXfvQG
-0pkChXSKCZMmkstBR1cHmAYWPqxsDl0v0FBVRTJToJhLEonWceVVH+D9V1zBipUrrDPOPCdfURsJ
-G1l8lVVwyfkLyaTTPHrHbbz0wlLW3PoTxleGiLXWULdmL9d9/kssuvSTbF7+QXpfzrD6pa3kMDhh
-YSsnzq6tzw5acx54qQtXwo/hSpZyu8yPxGpdlqTwBUkIx7q3uryroe4aJOTdz3QO3L/dHuF6stsu
-z/41tTJ5OtyrmLnbYrSFVSzXM9gHIVuWK0xijWGwsKVzDMkN6nO1s9weo5UOGlK7uvvJGsVLIhst
-H+XrheXktZG8I25joLruo48yKzfYf292cxTyZbmMYJr9y5lMycCO9swHazOk51YOoV8Plajb0vuX
-u3+xDDmzR5AjSyLl6gj95NatcraiKMmi/Kz6QeTw1ZKBvDTgaS5ybrrkZ7T2l99Bvt5I9mWkScZ3
-KG1etIDhhD4Zm0T+yGiltZaL0GU4sL7erV/WCPkfst3CFWZWJPmJaZ0yAAAQjElEQVRhFP2xysg7
-Lt22D6IfsgxZYzjfdp+vjVEo/tmAg4lMx4JjJ+vx5IC/d3cfFfUxzn77BVx8/oVMaqlh7bptJNMJ
-0ok0s2bPZM/OHbT3thPW/GQSGfyRABYmRrqI6lPo7BskqCpUVtbh92ucftJ8/MEIW7ft1vWCkZtU
-VxXcNrAbVQ9x3Yc+xdGzKjjhhAkkH/suQc1HXs/TEFF4x8njKPT/ifWPp9n04iaeerqf9r0pFi2p
-Z7BziPrx1crRU5XWngy8uKFLjrXLA+dINc0mhxeyJ8JdomIfwgDqXKfcNZQyn9ljfCbDpUhH0kvi
-vu9omc8j7fA32nnmSB6uMT6TKQ067oQ6+xDa1XTJmD3Gvi0y8j4CY7m/fK1yfTrSwF5OPg+lzYsc
-uLjN4WqzQ5XtVyuTr/X+Y5Htcm0zmiwWy3gU7CPQBu5Q0Wu1B/J7HMr1ZOLdQ2k9hXmUSlIrJPf+
-bimXJsPIOURuOS23CNjBSs3HqiPKGGV0JFs+kjzYh3i+WwYPOH8su3WpkntGe8+7Lox95obPHBcO
-azWPP/0iqq2yeeMW+gcGueeBR2nftwe/ohKrquTm3/0Kw9R5bukLHD19Cr5ghP6BARRMFs6bgeYP
-MNSfxBfyEwyFiFTE0CIROnv6uPbqa5KGruemT2+IWpmcVqlAZbBIfdBPtZqhSgVrTz+Gz0dVax2K
-qdG5qo+dS19g1/Y49dWVXDQpwPyjGqit87N1bwqNWizbF22Pp9RcXs+4WJzlYuTlapaPBA6HAtsH
-mR2/mkVtrDLHkV5nYbR7W7wx23faI8wQXusCUK+lPexX2a+vpj/tw/Tc5hFoM/t1ksnDcf/R5PpQ
-+uL11gn34nLWa/QIjiQbI11PTu5zEl8zlDLst1BKFtzLcM6JnOSXPEjIyD6InXk1a7q8Vhk5lHsf
-tvPHUjWwXxmCbgbNz332a8c0VVkzfn/HfSiqxmB/gvWr17Bv1y7yus7gQD+FfJ5N6zexactWpk2a
-xIMPPsTV11zL1j3bMHMmTz61lNPOOIs///F2IlWVKNhYus2mzbv5+z8e1Tv3tcWB3NvOOrair6c/
-4DMVmqpqqQwrmP09TDt+EvrOAaoaYoRDAdL5BGHdplJVmXF0hAXTTeyCSc0MG82qZtm6PsxAmC3d
-Q+pR02dGw9VVRldXrzGCobc5sAzmrbwngQcPHjy8leHeTMvJy3ByJJyKmH6Gq4OyHP7l0P8loR1q
-B6x48cWh1atWLY9o+VMnTp9Q0bmti5b6eizFx1nnnMvRs2dz5113s237Dl5ZuRLLhi/c+FlyVp4V
-y15k98atRGoq2L59J7t278EG0vE09TU1GLZOhaLbu9vbnMzwTCgQMi3VxPZFSBYtgsUCe/p9aM/s
-4oGNORZlLGoTFslckoaojxOXTCazfi8JVKqnQ9sqFV80z9QZLazZmKK7L8WlV10fOFNTpm/Z9CUr
-myu460zl38vlC3hC5cGDBw+vHwGQKw+cBNgw+yejygnNToVLkdd3xdi3LMYSGpA9Airge3HFc0OR
-Kt+Fho+qnq5uUmmDytpKvvaVr3Dm284ibxRZtvwFmsa3Usxn6Oho5+GHHuDWP9zJnvYuUvEh/nrv
-Pdxx931MnNTExRecxfbdu/FHfVAs5HbvboublpUC0osWTavv6yuGE9kiuzuSbNk7QE+2SKS2BcvM
-0Z30MWnhBSw4+Qq27exBCRcJxFMoWKT2KITqKljfb/PEqn5SSoiFJ5zEJz71OQb6uv3r1q2L9vYO
-ZCRhkRM03GECzyvgwYMHD28cIZArNpzywIwgCEmG9xGRFxPybPZhIgIOGcAhAz3d/fqxixcl/usr
-3zi7JhRUVm3aQrw7zspVa3jkiad5+OF/YOl55i1ahF7Q2bGrjYHuAQp2kdrGGvLpHEVbR/MHaJ40
-jllzZ7Fl525aWhuNbes2Dwwm0knRsclZs2a09GQKEX8gyu9v+QMfu+EGJs+cwee++j22tXdx3FlX
-8JkvfJU58xezp7+X1cvWsXhSiFRbmqCiMGQGeOCVHhZdcQU3//YvzJo3j4pojMWLjmPz9i3BXbu2
-h7OZfIYD42CG63ePDHjw4MHDG08GDPZfAMg5nCqqw7nk9P8JjHXvdMvVAbm//+OFp2uqJz235JQz
-qGusxUJh4+bNLF+2jEx8iONPP5bf/OInfPHznyEaCtLUOp7bbrmVe+/6E/XNEwn7Y/gUP+tWbOc3
-N/2ZqU1NpLtTibau/jjDq+QNtYybpGdSGcK+ANlcjq079/Dcc8/y0GNP8Ktb7kXXhxf62rGzk0fX
-7OObTyT54x6DPXWNrPfVUtSqeNel78OnBRhX38TFF13Ecy88RzgYo662uq65tW62ojCO0kIUzk95
-t0L37k6KJzoePHjw8IYSgYLr8EjAEfYIHOAV6Orq+v/tnXtsU+cZxp9zsY/t2LETyI1rGi7hEli4
-3zsuAqH1grZK7daOMaAqaOPSThvStmpbWammru2mQaFF29oBE1QCSjtooTSUGCgtNEBJAiEJiUMS
-27HjS+zj67F99kdymhPj0LJOLYj3J33K8cnxybEU5Xvyfu/3PEmdTteycOGSMn2WIb+65jIiYgJG
-gw5dogi3O4i6a/U4/t67cLm9ePyxR7By5WoUDByMv7+5CwzLQyMI0BsETCgdgoKiwsjBtw/bZVlW
-bCa9AHxTxw4vag+IeaLfh5qGBhz+zwFUVJzC6dPHoGElBMIhjB4xCOc+O4sdO17HhMnfwebnX8T0
-mbOw6/0atHQEcN3hRO2Vy3jsh49AJ5iwY/sO7N69G1drr0LLC0wgENSBQVKSEhH03TKmjpbsL1mK
-IAiC+PbEAf09/gaFgCIGvvBDr6ioCESCvprVK9dMqW+8khuTojBodZAZFojHcK2xEU6nCwmGwfWm
-dhz+4AO8feQIaqtroON5mHRajC8dhJKhQ+JHjla2ezzeTqUSgJ4wF8GSK3GpxIS83Hy89NLLKCos
-QNn4SXht+07U1V/FZ5cv4djRkzh+4kOEwmEUFA/FL9ZvQkfYiz1vHUJjayd++/vnMG/BQjz/h9+h
-4YYN1sozSDIsIKcw+f5y3D9nOtvRYjf7u4JhudchTZ0klW7YQb94BEEQxD0pBG7i3PkLgdOnK6oe
-evC7Yxcsmjdgzdr1nOjzo6G5FRazCZyGRyImIRIN4UbrDXTYHWAYGTISKCrKQknJgMhx64Wmq7X1
-DvR6ZnvQvQWkc/jQbGgY/Vy70wshy4BzZ6xgNUYsXTIP7xx9H87WToRDQYjBCAAOtvpmHHrnEPbt
-OQh3hxMbnl6PDes2wGQ2Y83ap1FXew2JZAo8xyEFGUvnL8YLW15GU6uNvd7cYEzGEmIilUqPk4zj
-Zie524nPJQiCIIi7Xggozkvp1q9oa3OGvG7/5XmzF4WHFRePFYMOTbaRR1FBLlpdPhg0enAA4vEU
-si0ChhQOxIyZEzGkiI8fO1pVU1vd2KaqBHh6xEB3RYBnvWOGFX/f1eWH1foxWmxONNpaYD1Zidoa
-G+JSDCNGl2LL5s2IxmKwd7iQiEbRJYYgSUmEwyF0BQJ4Y9cutNrsyDYZsGHdo5g4aQ4qz5yF0+VG
-ltGIqk/Po8Xepsk1GbhQKCymUrLiFa2sRcXR10uaKgMEQRDEXQ/zP1yvjmDUoruJTgfAKOgEy+y5
-s0dOnDhyyc/Wrps7etT4nE6vTydoBeG9w3txvdWOKdOmg5Eckarzte5/vrm3trHB6cLNMZRKj0AA
-QOSpVfOPNTVJRkP2AHT6PHC5umA2ZcHlDoLRJPHAkgXY+uqr+Msrf8W2nTshxeJYt24NZs2cieUr
-ngTLsMjPNcNgysbFS5dxYP8eLJ6/BBt++Svs378fLCMjEgqAE7SwGLWpiBhuaGvz1KA7i9uB7ix3
-J3odq9TRrbRFhSAIgrgnKgKZBEQfj+hkIinZmmy+T89eqN629bUTtpaWWrMp22k2ZwezLfnto0aM
-axeDYce2bXtO7djxr0+8XtGBbgcoT8/o7BEAXpUQEIsHmZJ5w/JmP/H4A1j10xXYuPEpmPMKUGk9
-A44HXHYH9h04iI8+OglJSmCgxYJhQweD5VhcvFgNKRbDvrf2YO2qn+DkyROwnr2E8kllsFZY0WRr
-gsViRiKVBAMWWk5mhg8qMsejklcMRwIqkZK+ReXrWM0SBEEQxF1ZEVC/T51BoOmpDmjR7fikR/eW
-OwOALNU5oedaJZNb2Qqi7AcV0esKpRhDxMvLC0ZZ8kzbps6aNHbZ936OkvtKEQx24bk/bkGnuxOd
-dheanHbwHAdB0HbPy3IKPMcjGo4iCRbLli3BxPETsOffe+H2dMFsyYbH5UUyJUFv1EOKxcHJKcTj
-EVgMHPJMOQ5rVW0FgHYAbQDsAFw9owt94zKpV4AgCIK4pyoCyFQRQF8DHrUftJIzHeqZ4BUnKH+G
-0YW+DlExny/i0glyu73TM7Kh5fPCG61NiPrcqLM5oGV4TB07CM9sfBLDBw9BW5sdiXgU5dOnYsq0
-6RhXNg55hRZ8ePwYrNZzCPi7wCSTiEsxyHIKMgPIiRQ4gYVOlrBo/nRsffE3GFxSrK+6dDHs94dv
-KJUJ9LpZKbnSJAIIgiCIuxr+a7w3PT5THdqjdn3S9lQBlKFkcqfnWivZ70qTnjLZpmKxFGqrvYfL
-pgiXCkz6Z+ubG8pu1DeM5WMJXo7IGDd5Bh58eAXmzHfA7nfA1erErzdtwtTyaV887JpnVuPKlXpk
-sTyu1jVBjoWhN1kwY9o0BEUfrtka8MKmZ/GDR1cAAOpb/saPLCkcFg5EtC6PGEf/mdsMaGmAIAiC
-uEcrAsDN2dFq9ye1MFAmd2WtPdLPULtEqSdf2eUQxfqr9kqTJqvKoGcv5+rMosyxuSGf1+hsuYaa
-i6fQ3NGKYNAHzsDC7XKg/kodImE3Ovz1mFc+Ew8tnQNnswusTosf/fgJvPKnP2P0qJH45MwpDBie
-g1iXC/94fTvqqs+heNgAQyIWr2lu9VzvqQqEVBUBdaMgCQGCIAjiroT5P98rPbaYVVUAWFUlgM0g
-HNRLC6m0/77V91N2KuiNBr1ZI2gt+XnGonxzdsl9owaPGTpyyLSwK5Yl68F5EyG20+MRomKUc7vD
-zJjSEjy8eDH27T5o8oaCbGnp+Mjy5SukiuPv4mjlx8jR8SmO4aMTp5TJ5hxT4MAb+45eaXR8HpeS
-bnRvbVSWM5RdA3FQIiFBEARBQuCWgqC/oUa9vKAWB+n35HqGeuuigO5GRF3PEAAYdFmCMZFICgWF
-5sIskz6L4WU2EpQ4PsWymqQ8Jid/oODz+tu9ouiPJSQmx2SR9XpWsjU7HNFYUmlcVGddB9Hb4xBB
-7xIGGQsRBEEQJARucW8m7Tj9++rSevpx+v3UVQYevX0Hyo4Fjeorr7pG8T1gM1QnmDRBos4aUPoc
-lGULZadAerMgLQ0QBEEQJARu8+dkEgJftdqgFgScatJPP/4yAZAuBOQMYqC/JkYSAQRBEAQJgW/p
-mdWCgEHfXgQuw8TPpl3f3xJFpp4F9a4G5TgF6g0gCIIgSAjcMYIgkzDIdD59maI/IYC0yT6Z9poq
-AQRBEAQJgTvwMzBfMuEzX+Ezy7cQBennCYIgCIKEwB38eZjbPJ+pUVHO8JogCIIgSAjcAc9OSwME
-QRAE8TX4Lybv2o9oSY6CAAAAAElFTkSuQmCC
-
-------- =_aaaaaaaaaa0
-Content-Type: image/png
-Content-ID: <26389.957885364.4@twelve-monkeys.helixcode.com>
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAFcAAABVCAYAAAA8AHhnAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9AFAhIKIGIgTigAACAASURB
-VHja5b13lGTned75u/neylXdXZ27p2emJw9mgJlBIEAkggkkQXIZlHkoWV6ttVrJKx3t2pZ2Ja7P
-UtJ65bUtyaa8FkVZgZJMUzTFAFAgQBJxBmEiJvZ093QOlcPNYf/oauxFoQeBHJAKdc53qupUd917
-n/u+zxu/twT+4T2Ezoo/wrfqQP8QgRW3APaGAyz+AwNWBKSPv/fmD44WE0lA6qy3RNDEH6D0CN9H
-zXlZYm/emfxfbav9hf2Tg+/uALsJ+t9pcF+WHEDuLOmturCtrnWkQLbVdH5ZkuTTi2vm051j/73Q
-XhFQAB1IdVay815+iy9SBJSizr+9ZTL/BJAHckAaMN6q48s/AKlVAa3zPgLc2HorDIsACH1Jbb+m
-RT+T682/nyvVzc+iznrL7uj3W3rVw5NDRztSk45JjxqjiRvOtZHofWZ8Z+9fPPbM9PNdwL5l4Eo/
-CMkVHfOz+ZR6qG4Hz3W0R+hcZNhZ0Q28mcIt+3v/aTKp3LNWDT9Wb1hx1yu+uNFAS99Hqd0EWN45
-2js+Mtz/j3sKyebSWuNKjCJCILhBFykAwp1Htk2KQvQnyXTmo2fOLy1vcSP/3oArAEI2k5kRIu+H
-7rv/3rvDMHhhYWm9FJOmG6WuIiCMDKS+HIbhf376hfn/FvNK4jcyfKvo4fsJ7uYFCOV6yzQ05Ykw
-9D501523v+vkmZe+5riB3bn4sEuyvusbedfR8X/mum7vc2dXfzHm8kVbUNBbwrvfT3BfAXKlaZer
-1fITVrv1Yx9+6H3Hnj5x8uHolcBG34MUiw/eu+eWRrP1a00z/HC5avpdvnR0g7Xkbw24L1+c6YQl
-WQgvCEg//c773p448eLZZ7ti/rhxe6MAiPsm87oiRX/VaJj//YXpynxXoBLy6pvI3ydwXwa40rBm
-hcg5p+vy/3HHrUevnDx7YbpLfaM3YXAEQEjn+TeiIH/x9MXKN7dw76IucLuTWMKNCtF/kOC+TBGl
-Wnsmk1ZqiiL/GkTfLFXq1S6efiMSLABCcYf8kB+EO69cbv32dcLrrdy96DWAja/o7xK4L3sIi8vV
-k7LombcdO/LP5xaWv2TZjreFBMddOjEGngiImVHGBMJfsWv8rGtHdH2+FZC8DqjX+7u/M+C+LJ1r
-5ebJSml970c++L6Hnnvx7Ne2kJiXfeWtVqqPz4aW8PP1UmR2JYbELdT+FRFc7GbFpV3sWtdzL/9W
-gHs9HntZQust69HK2tJ7//FPfXLHU88+/1wXMJsZNa2T8NE7obNeGBd+KXT5Um2Zuc7nShf4cZCl
-LjDjWTqp879K1/+Jb0CyX3VR3wtI35W6vI7jL2VSemqkv+fPP/DQhz77W//P7z3ZxbubF/8ygNke
-blEMaby0EHxxMzAYG0ru7uspTIgCo57nRK7nlBCks+evVJ6/jo+7lWTHDZ/fFXjEX7OVTRC+C4mL
-q1L3a15Dfa5HCWxxkVImnUzumRj7kwfe8+Cvffr/+u15QJgY7r+nv9jz6YH+gYHZ2ZnLl2cXfj0I
-AyWblz++tup+rtBrHMjlEnf157O3G5KSzOeLeJ6H69p4votpNgjCYNnzo98/eX7lT7sMm7AFN0dd
-QPqA13ntXSfKi94oLcTVKK4u6haqmYg9x1dyi9dGbG1+hxZ7Vh3XE+qN5pOOZf2aphvPVKpVxkcG
-/8D3g+G777kH3/d7dFUOfM+6X1IMc2yi/2d27dr5YFJPbh/o6VdDV0AQdcJgQ/tFUUYUFDLpfDqT
-Tt/bk1XvaFut47YTBZ1jajGNUDvnEqeHbj4WtqC1NyRRAq+uHGweRO06aPfBX+sEXuUlbJFAiTrS
-ABBJMLlrYviTdTv4DUMW/ri/f3RClgxSqSzDw7n2E099J7n/0AH80MfQVcrldYQgQBZErKZNEILv
-efh+QCQI9PX2MTQ8jOfZXLry3MzzZxZ/yg8iNyZsQlcOwo9JrBN7jueh/c45B3Gpl18D2LikajEp
-M7IZY3tCU7fJUpTpyecGdC2RSiRSoq4lBUmSxX37DgpRFAmjoyPMzc0Js7OzeJ7L6Ogonh9U10sl
-q91uoypSJEmSOzUzs6rreuh5XrheKrUXV9dKm+oWQLtUqT5W7Ov5V6qW+urFi5d/7uMf/Un27TtE
-uTGTvMV2WVpeYOfOCRYWZnEsCyOh4vs+ohAiiuCHPpbpEAkS5XKLVNJldHQMb9yaqNfMT12YqfzG
-Fp5BELv5m4CqgMUri5rhFgGPsBW4m8DKMVATyaTWf2DPjk9oonxXykgdzKQzSsJIIqsGAwODyLJG
-b08R07QprVfpzfYRRiHNapPIj0jqSUQjjWf7mG2TlJZACSUK2RyyJHHz7ptIJlNYlokgiEiSjGm2
-Lcv3n3rkW48eP3PxpWt+KJ4ZKEof+PjHP4rjtllenWXm6lnm52a5447buXDhHGarDkKIFGjYtotv
-u0iCSOgEBLaDJCn4tKmurLBzfJSx0THqjbW7G6Z1fHHVOhnT1HhaclMyNzVW6gAMYG7BueH1VFWM
-SawOpI4cO/yz/T29//P+XXvUYrYXvACr2abdtFiut1BUHc/zERAIggjbdogiyOay1BtLGIa+UU+S
-ZVKpFM1mk3Q6TWl9jchyMdttJicnCaOIVCpFFEW4jkMYRezYu5+HPvQQ80vXnJ/7p/9TfdeeyeKl
-qasEIfze7/57PvzgO3nvu97Nr3/q1/nZf/IzSJKI5zmomky72SKwA1zbwzYtPC9AEkQSegJdTzAy
-OszA5ACW2+TE808vPXdm6V9u4c8GMePldMBsd5YJtDrPTowyXvYmpC6pjfuRyWN33Pmr99/7zl/Y
-t/uAtDC9yNzVWVbmlikvr9OoNTADC9tu44cOrtvGD0yiyEVVIyyngaooCIKAqqqk02nCMMQPAkzT
-JJVKIIsufcUsghTQaFaQ5YhafR3Pt1hYnmdprcqpM+fYtWeffM999yeXV9c5dMstnDl7iumZKVKq
-Sn+xn/n5BZrNNn4QYRhpFFnHtnxCL8RxXDzPJ/R8Qj9AEQXEKKLVbCAYEggiuqama7VKrWl69Zhh
-VWOlJykWvARbeBBxV+1lD0Tqklpx01LefPOh+z724R/59J6dezn+5DPMz84hI3ZEWyAioOnX8EML
-P2gThiae38KPWoiKC9iE4QYl+YFDq9XAcS1EMUI3VGRZwA9MvMBBVkRsz6bRbqAYKn39vYxv34Yd
-RFydmeXFU6ept0yCSGRgcIjZa7OIsoIiaRT7B1leXWdhaZ2x8UnyPQOsrdUJULBdC8fzkGQJRZaB
-aOP8xQhZElhYX0U3EoyNb8NsN7Pzy+XLMWCVLaK8sPPsd62t3DJB3qoMA2jjY2O/sGNwnAtnznPt
-8lVSCR1VlRGiAM9z8UKXKIoIgxCCgDDa+F5RijBNB1GUMHQVP9gwxJIkEYRgNmokEgmCMCST66PV
-auM7Er0DO9ANnXK5zErVoXx1iUJPlm07h1lcrDA3t4wgytQaJoqaxrID9u+5iVqtQd/gds5PLTO0
-bS+rqyWM7Ahes0ZoN0nrBrIYYdZqyLqC4LogQCSG+H6AJCmMju6gUW+Pv3hueshyvFrMUG1SgtJF
-E3qHd5WYZHdHbpHUBawCaHfddefeH//Rn/gX5mqdxx/5G3RVRtcU/NDBx8OLXNzQxw80BBREQUWU
-VAI/QpZUfC9EECSCwMVxTaIoQFElwshDkgRUVSKTzeJFvezacytDI7vIFkYp9IwxPLqbsYn9DAyO
-02jNM3ttlkQyh+9L+KFIOpMn39MLosTySolDt9zG7PwymVyRw7fcgZbIUambDI1O0NOfwnJt2mab
-SAjxPRfbMnEcEz/wQVPxg4jdu/YxOraNmZlpc7VcqXRJLF0GLtjCJfM6y9+KFsQYuPonP/mTn/zQ
-hz7ytvmLV7hw7iyI4IUefhjghQFeGOKFIWHQMZCCgCAIRBGI0sZ5SaKMKHqoiowkyng+OE6IJKeQ
-pCSKmmVoaIJSqczs3CKimmRhpULFDEnmRxnduZe2WeWmg7fSrIWUSxbpVB/DY9u4trSIqKpUWz67
-9hxkdWWNZMJgbW2VEyeOoyeSuJ6LbddJpwwUUcB1WkhiROQHRKGAJKoYqoJlmh1qGEdWkJ8/dXY6
-VpGOS+Km1G56D3YHXLsL3E0X7hWSuxkgGJM7d/yK2XIGHn/4YdbWV9ANnZAIUZYJI4EgEogQEAQP
-UQpBjBCECFHaOA9FUdAMHc9uoSgKkqDh+RKCmGR4ZA/JVD+ilCTy6zQaZZZWl1mt1DByPbR8ETmV
-x5cNVM2g1RYpZMfYM3kztXqTQl8vs4uzSAkNxzNYWS1z9ObD7N01ydrSAhcvXUSUJEzbxmu3kSJw
-7CaRbxP6DkIoEIUSBCJy6COLIl4Qsn33DoyUlnj08ScvdIX0USyw8WISa3WAtWLBxCvcMrk7Gtu9
-a3vxnrvuPNyXH+SJICCbTiMS4fkeiBBGIWEQEoYBoti5L9HGs+97G2ogSoiI5HK9BGFEGCkkVINE
-skAun6daM4lCWKmW8Yko9BRJF4aomzb9w8OUKlValsu1+ctkEmn0QKa6eoXJ7aOMjo/zX/768+zK
-7SFCZP7aKs1dLr65zvDIDm4+HKEm0rx4+iyRbdLSgMjHbnt4poMUBkRCRBD5BMHG6Z8/fx4xoXL4
-yMFNbyleHN30BMQtos2teiCI04IYN2THbjnw0PjQyLtPPPk05eUVhDDED3xURSYIA8IwIAx8otBH
-lCQEYeO+CIKArhskkykMI4koSQRBiKwYJFM50pkevEDAdgKaLZMgDIkIcL2QIFJwApGm5bG4UiGR
-ypMtFEkWR7k6s4SeSHPfvfeyd+8ujj//DK5vMzs3RyozhusEhJ7HttExPvbRD/HEky+gJdIMj24n
-l81hGEnS6QypdIowCAhDD8cxcT2byPVAFIgkmXxfD7Im8/zJcxe2yCNvqrsVo4JNn9ftvPe7aOHl
-u/Fysri3p++Ogd5ecB3sdhNJDFHEjbuvSgKaLKLKApIoIEnyhkETZSRRxfcjPC8kCCJEFHKFAUQp
-geOJLK1WcLwQ03bxw5AgjChXmwSRhKqnQFCY2LGHm246yk2HjtJsu7xw7iq7Dx5Dz+R58dxZnLBB
-qVLB9UPCUMZ2I1KpPNlcH6Zt8e9+9w/J5ArISopGyyaTLYKcRNYLaHofg6O7KfSPIicShLKAIIl4
-no8kSWQyWYIgYIvEObGmle7gItziOdqqV0wExPe///0333HsGG6jhqEpaLKEqojoiowqi4iECFGA
-LIKuJpBlDbFjXGVJw9BTKIqB4wTMza1TaziUKy0Gh8YYG9tBIpkmmc6CrLB330G279hNNtfDxI7d
-SJJBrWUxt7jC5alZDu7dT+j7tJs1FhZmmFtYJxIE8j0DVKttjGQSRde4OjtDo2Xz9PFn+aM/+hxI
-IkEUUmpUGRwbx/FFikM78QIdpAyZwiCKnkIUJXRdR1VVYCMyVFVZv04KNYpRQNCVrAnihmwTULm7
-lysIgp0XT59hZe4aLdOGTJYgCtETBoqk4roBhAGqomLbLhEgCiKyKOK6HpZVRdM00pksucIoqWyG
-nr5+5hcWuTa/wMDQCOlsDj8IWF1eQRB9JC1F23SotEzQ0ly+MsP+AzeRSxqceuEUoVnh9AtPc/LZ
-b3L09lspFAfJFYcZGRth9uoljKQGckgyqXHsztt46eJZRsbHMc0W56+cZ7h/iKXVKgNDk6yvyjQa
-DTK5QcRodYO+FA1BENENg4SuJlzXd7fIF4Rdvm8Y42N/qzL9K0oXud58enb2Gj25HDu3bSOh6yQM
-HVEAURAgClFkCUWWIApRVQVRlDaOEAToRoLR0VG2b99OX1+RVDpLEIicOXseP4goDgyhJ5KsrK5y
-4dJlBKQN7yMUmJqeJZFM027b3PG2u1BkhTPHn0B2G1SWZxnpz7Fz+zYM3WDH5BiCYuBHLj29eWy/
-zej4MHfffzerpWUGh3s5efp5EmmNZNpgenaGXL6P9UqLRKqX4ZFJwCAKIQxDyuUyvu8zNjbGyHB/
-pstYRVtIqx9zyfyuisTWLaT5ntzQ+lqJ3t4BevNF8qkUCVVGikJ820ZGQEZCQUYMJdqWhSCJpDMZ
-Cj295PMFZFkhDMAybZbW1/GBsW3b6OkromoaKytLRFGIAoS2hy4bOJaPYWTxvYA7jtzMYEbn2unj
-rM1doVWr4viQKoxgBgb1RkBvYZDJ7btot5r0Dw5SHBrl8adOYIUiiUyB5bUyt9xyhCunXkL2A1Kq
-wOL8ZQYHe/AC0FMDaKkhhGQKJaViGNCfyzFSGGGodygbC3OFLYIINwauF5Pi7j6IV4I7c2nmcqVc
-xnMjMtkijt1GCHz68jkG+nrRZAVJEBEjEUmQ0FNJAgFsd8NIGYkUmWyBldUSzZZJtlBAVFVsz6Nt
-mSwtLeLYNo5lUuzrRRYE5mfnaTZMBCR2ToyjhBZf/NzvUJo5RUqTcByP3QeOUncU1mo+1VbEyrKJ
-02gyuW2CSrnM2nqV4fFJ1GQCPV2gWmuxurJGwciwNDVFSoWkETI9fZZsLoEXCKiJApGewMMnmVLR
-EHBqHpFFbotkf9AVJLgxnvWv15n5qnq+KAluKAgoCaPzaYSiyARBQBB4CAKIokAUBeB7aKpCJp0i
-k0lTqVS5Oj1N/8AgvcUBgiAimUwhywr1eoNsNkcmk8V1fZaWl1iulJnYtZ1MPsHuXaOsLF7h63/9
-59jtNeTIpFKtMTw6xvmLl1FVne07dnL01iNcm76KRMjpF0/QV8igyiJ7d42ytrJGJpmkkM9tREWK
-gCCFrK0t4HsmouAxN3uJTEom8s0NF1KU0DSN+flriKLAof0HCoosq10+bhCrSsTpwLkeJcRdjJej
-kInt26eSPQWWqzXCaCOjFRFg2W0azQaua20AS4AQBUS+S7NZZ2VpmSiKyGTzVOpNHC9EUTRKpQqV
-SvVlUE3TJp8vkMrkGNm+jYZZo6+YZmXxEpfPHSd0SoRuFT9oMbl7D+vlKv0Dg7RMC9NscfbkSW49
-ehO3HTtCWhdZvjbF4b27OPH0Cf67Dz5Au9Wg2WwQhgFIAcmUynppmbn5K7Qaa0hYLF67QH8xRcJI
-ISCjaRql8joXL51n9+494r7JnYWuyCwuofFyz3UpodvNiIDw2uLCybptc9+DD9Jb7EOUwLZNqrUy
-YeghySKCGCGKApIYEbg2oe+iqgqeH7BertJbHEDVE7RaFkQiimzQbFikklkSRpowECCSsOw2hUIG
-s7HO8vwlGpV5KusL6LpMtpAl29NDKCoIkoJhGOSyWVRVxjZtJkaHSMqQlGBssMCB3ROsLS2T0BUG
-+4vIkkgmmyaby9DblycKHFQZQq+NJvk0Sqtk0z3IcgIQUFWZ8+fPkUwmeOd994zFcOnOkG0C676W
-MesGNwSCheXlZ64uziEmk2SyKSyrjSQJJBIa2VyadDqJrqsYuooQeCgSiFGIaZlYlsXQyCjVRoty
-vUUqnUeSVEAklysgCBKCIFEuV8nn8rhmk2tT57l6/hRuvUTkWQwODpAq9JLtG8YNJfoHh/HDiCAI
-MC0TVZaw2y3WluYoL85QXbnG8Sce5+KZUxw9fDP5bAZNlUklk4ShQBBAf98AKSPJ4twcTruFKoAS
-RZgtByKRMIyQJBHd0FleXkURpEFZEpWu0DaIGTG/q+pw3Y6bePZHajQa5dGJnZ84dPiomhPazExd
-Qjd0enp6yefzCKIIkoAkSfj+Rk3M8wNUPUEyncN0fBQ9RU9fP62mhW05KLIKCKytrROGEQMDg6yu
-LJOUQ5Znp8joCookoqo6WroHIz+MQ4KGBaqepGXaqKqK2awzOtjL+GAfa/OzjAxkUEU4dvQIiWSS
-VttmeWUV1/Op1erokopjOfTks1itJilDI7B8EooOASTTBYgsBByEMCCKZDQtjZpQhcXla3al3lyN
-Zb9anVUHmp21mbCJrgduFAfXbFtB7/D4vn17D+wpKg4nXzhBuVxBVjWqtRqlSpkgDBFEEc/1cFwP
-UVZIpXMIooakJcgVilRrLTzHJ5fLE4YR9XqDTDpNb0+Rq1evIokCVmUBQ4KUruGYNj3FIfTsIIFe
-QEwUECQD03aoNVokDR1NFhnsySNHLoFrsjhzjnazzlNPP83ly1e4+977sV0X03FQZA3P9NE0jVaz
-iqEpKIKI2zIRQoF8poe2E+A4NUTBQhbBtkI0Pc3eg3txvJZx7uLUhQ64m8A2gUZnmTFq4PVo4eUa
-/ckXnvn3337i6zR8ifHJw4QkwFdJGwXaTZ9G06fR9onCiJSRIJdOIYtA5JJQRarlRVIJgVRGBhxK
-a0sErkW9tMzK3Euk9TZ++xq2tU42n6TpmLiSgq+k8CSDlh2iqEkC18I1WwiBTyqRxG6b2FaLRn2d
-2269iRdePMHcwgzJlEFxoMju3ROISIQeNOptbMdCkiRCZFQjixNKhFqCtu+zWFmjZyBBOp8gCCPc
-IEIzZBpmhUJvL+9690PZbWODg1sUKoMuro1erxHvFX1SlfX1+vi2vr3vuO/9k7fefg8ri+sszi4R
-edBs2Wh6imQmjyxGGy6PrBCEAa7nIxBu5HaFEC/waTUbDA30Y7daeGadvoKG3VqmUZsDEZqOjYOM
-mMhRGNyOg8rg0DaWlpZJqjKtRpN8poDvBOgyFNIqIwMp/vpLf0YmreH7AYVikR/5kR9DNwpMz8wj
-KwaNehMhcrAdE4Bmq0kkiggiKIaGLwS0rBVuu/VmGvU6rXoTQRLp6SvSUxwile2hXFkTLl6+cqWT
-DYvTQqsj0e7rce5Wzb+i57mXewr9Pzo2Mi7VqzVeOneWZrNJPpchndYRIg9dU4kiCCKwLBcECT8C
-SZKRJIVatY6hG5RWVunrKVDIp2i1qqyuLpFOJ/EjiTCS2L5zH7YLbSdk28QeTNMjmUhit5qk0lks
-y0XXdJIJhXxSIanB7slt9PflmNy1m92799FsOyiqxuy1BTTdYHFxkaSh0W43MdtNrHYLVZHRNAlN
-VVA1Fdts4dkOtx09RiFboFJpUKtZZHJFLNun1ljLvnThwskoijZpYJNv2x3A/TcC7qt6GNbXKs0Q
-0bg6M3PbwYMHufmmQ1y5dBERj75CmkImgSirOI5LGEQb5R1BwXV9JEmGUEAIwXdddu3YgSrD1NWL
-mGYTSRJotduISgJVT1HoHcILRIZHd9A2fRTVYH11DVURaTRa9BcHqFYqGJpEQg0ZHczRm0vw7cce
-pa+3yP4DB3jm2efoHxhhdX2NdCZDrVZFQsD17I0ctL+h0bomE4UBRBFEYDbbVEplDu2/idtvvwtV
-TbJt+14OHDqCIPni2bOnrzWareWOtLaBWgfoTXCjNwJu1A300tLimbbVuvvIkaMDtxw5QuC6VNZX
-8Kw6uioSomDbDoIgIckKCBKOF4AgIgoiKT3BkcOHaTUqTE1doN2qEYQeju2Sy/ci6UkSyRyuL5Ap
-FEmm8hh6mlqtidXhV1VVMbQkltlGEUL68gkCt8HMlfMUsllUWcV2PARBZs++vSwuL5FMGSwtLiKw
-QQNRsIFBFPposkQYbtgg17GRBYFWo8n87CyqmuCBd76Hvv4R8j1FkimdE889W11cWroSM2ib9OC9
-lqfwel2Ogu/7YRC432nWax9VFd146IMPkcukuXLpJaqVUqfo6CHJKkEIYSRS6OmlUq1x8MBBDu3b
-T6te5eyZ5wkjB0naKAHJioZpe+SKQxjJHEEk4gUSkqzTatq4jocoimRSOvVqHT2RJPADdFkgnZQZ
-G8zTm09QWlklQsD1XA4cPEjbNAnY8GRKpTVaLQvHsVEUGU2VCXyXjYTeRjQbBi4EHroq4tkWpXKJ
-5dV1ltdLrJcr9PX18MyzT1kz12ZOdiR10wUzYz7vmwL3Ffu1TNO2SqW1p4IgfF8QCMadd72NWqXM
-mdOnUEQNTdURRIkgjDBtj77iAHfd9XZ27phk6vx5nj/+FI7bRpFDgshDkVUkWSed7SVfHGJ1vUIy
-lSOb78MyPdptC8/xkQSJRELBc31kRdswBr6LoYaUV6bJJjUuX7xM4IfYjotlWViODUJErV5FFCVc
-NyIMQ1RFpl6rQhSgKiKiAIoio6ohlllDlSFpqKQzKZaXV7g0NcXi8hKTu/Zy4eL5mUtXzl/sANqM
-tTJZrxdEiNfbwhSLSOxyrXHm2089+aOPP/X0fCDpfOQTP8U973wvzWYT27bxfY97776HT//mb/KB
-970fWZI49eKLzExd2QhDUwaObaKpCpqhIYoKqVSWcqVOMpWl0Fuk3baxTAtZlJEEEbPVoidfQJZF
-FEnEd2xkReKHP/YRCvk8mUyaXCaLgEC1XAYiBgeLtJo1MukEq6uLGx6M69I2TRKJxEa4FYUEwUZj
-i6IIqJpI26ojiAG208QLTMLIwbQatFsWpmnWu6oSwnVaZN8ULbyi69u0zFLbbD0yNrpt56Fjt0+M
-jGxn4qZD7Dl8lKGJ3Xz0Jz+JIOv81z/7POvLS8xNXUQMWqSTCpbZQJJk2raPbuQZHt9NIGik0lk0
-WaPdsJFFFdsOAAlDT+K6HmrGoFytkUlnUSQRMXQwGxXGR/qZnr5MhIWqSzieyTvecS/5Qpql+Xny
-6RSryyvYgU6j0cSslOhNJ5CjgBCBdhCxVquT11wE38Iya0gKuJ7LWrlKIplBkg3uvfedfPmrf/nc
-ytryakdiNxvvzFiO4bvi3FcBXK1X21/66n/7+vy15WttN5jce/ut+bn1GrfcejsD/UX+47/5DPNX
-LyMFbUTfxPUbRPi4jo+iJDGSBUIpiaRmMJI5FEQKmTy25XF1aobBgRFEFBRZJQgj7MjD9TwIA3RJ
-wGyU6C0k0dQQy2pQayxh2U0kWcB1bXZO7GB5YYFWrQGhSMURMNsmmgAZQ0MkwidEz6QxrRZKfR4V
-GyMhIUgRLcvCC0SSyV727zvM3v373d/87U893lXtjXc2vmYgIb7eDsdYRrZsCwAADsZJREFURLLZ
-CNH847/4wy/8/C//k/f94s//jz/2hb/80z9JpzQWp69x+rln2L1jhIQcktQEVCNDywZBzyDqaQJB
-ZXBgCE0WsVt12o0mYRBimW0md+6E0EdVRKIwwNBVDEVHE2XSRgLHbqMqYCQgwsZxGtz5trdTq7UZ
-HZmgXKoBIg8++H5arTae69CT1YlCl0DRKJkBDgqB3Uaz1uijgtheY7wvw9F9e+lJZ9BklZ7eIoqe
-YGhsnIuXz61fZ9dOd6sTbxbcOMivAhioPf6tR5/xrNbE8twsn//Pn6U3ZzA/9RJeq0xWBy8ICUQV
-HxVf1Mn3DnWaki16UgYiAp7jktQNErqOoalY7TqBbyJEHm6ziRoJRI5FYLWQcGnU11hdvUrbLHHT
-wZtJpfKYpoMkyczPzbNtYoL77ruXSmUV2W+gyj6e71EzLSIiBKeBOXeWYUqMF3QSuIRmi4XpWSRk
-2qZH03KRNI1HHv3qUtc2qXhztMjrjM16o+CGXYU5G2hnc9nBu+6+684D+/dz+tTzHD64m9LKHKMD
-eQwlRPRdCpk06VSG7Tt2IUoqYRAhBAGC55FJpqlVqiiiSOC5pFMGZruBGHmoUkDkNNEiF6dVoTeb
-wDVryILH6to8hd4MFy9eJJ/LMTU1ha6piBJcOH+GIHScYjGL114lMNfQBBPVr9NamSLpVeiJarx9
-/xg37dtBFHhMX5mmXGpgGHmaLYd0tsDEzh088+wT89eLYN/I3uA3M0/mVTQxtmPygUNHjyGqGplC
-ASOZQJQERCGgXl5j32AO3W2SM2Rc08RstZBEiVw6QzaVplVrICORNAwMVWZhfhZdFdF1EUKbpOKS
-0j10wSbymihiyP69k4Sez9rqKtMzU4RiUNk2MYIgBayXF3jq2cfXf/lXf/Hc0aP7qJdmaCyfR6xc
-pNebZ0KtcsdkL2lMArOBqCdxBY1K20fWCjTbIc2WS09vH1dnrlRXVldaXbZJejPewpudzhRvjKA4
-tu1Yy4uo2xZ2EDGxazeFvuJG/1c+w1AyolVqIUg+lVYdAhHfcdELeURBoFKusn3nTkRBxHYd6tUS
-o+NjCGKIIAVUy/Ok+orYQQsCjUppBV3RWV5eI5dLsO2uET71r37r0tuPHT4yOjqsprMC//GP/vzi
-5alrc1/+yp8f3DM5qib9CsO6QMKuoUcht47vpF89zNx6hTPTZeq2RK64A7mgY/oKd997C/fc/w7+
-4r/80bXrbAAUuwTzupuuv5vRV5v530jUjB25gWFqloPpBVyZmaN3YIh0TiXdk2Z3UkAT4exqlSgI
-2TZ+EMsJMPQk6ysr9BZ6yaZzhFGA53tk0imiKMS1bXRdQgib+LaIpsgookyxt4f+4gCFbB+TuydA
-8HE913v0yWefHO7PbPvqN4LqwmpjGnBOnnlhblt/dufhnUPsT4dkTbj60jQ56iwKAr6SYqZUIRBT
-jO/byey5aXKFAvfc+y76+4vh3zzy5Zmua5auA/INoYVXRXITE7u4+dBe6rUmkR/yjUceRlUV1tZX
-ccOA4kAfvTnokVfJWFdoXHgCa+ES1YVpZqdOkWSG5txllHqA3KiSDqeJGk9DbRa1KZKIFLzGCrI1
-g9ieQg/WqazN0bCbVJwWp849j+N6lusHzZnF6vGF1caZTZepWm9dadcWSSVV1GQ/1aCPNb/AtWaK
-P3vkBdpKDtnIIatpREWnVKmy58AeRsaKfPnLn581zbZ3HVqka0vUDaOFV6jI1MXLfPuxE+wZGcJu
-tRkdyBKFPtPTV5m51GJX+gHWV68xmmtz+4EJZubaXJhbxGspFBNraJZLY3WUsV0fwG5dRNWeI5Lq
-VBujZKUikdBk+zaV0Ckz0DfEuYtVxFaDIwcP07djhOX5c2HMizFjqUC7aXFmvb7y3iuKxsmzK5gV
-nz277+E7ixbnyj6jcpr+4hiakeHCSy+Ry6Qo5AzOX3gx/NznPnO5S9WjLaRVeL0BG9/LRDxhfXm+
-NDdzBXN1CVnTqLUs9u8ao/GczUhPnnLZRlWT3P/eO1Bos3e3w95rLU5PneKudx0k9FXWF/v5+lf+
-mOKwwtseGKLQP8nidJavfulbDI7Y/MRP/BDXzr3ASHEPw4UQVU4RrfvsumMXV86daHeiJDuWb20B
-dtsM/TnTWXbM5uDIyDjZPo2db7uVb33nSbRCEV80cD2L2bmNNqoH3nU/B27azTe++bXZer1ubVEy
-32oszGsOuPhuaUEAkCLnxLNPPMbg4ADvePd7KDXbXF1Y5oH3vZ9scZBqpONoOf7669/gyvw0ckHG
-al7jvtt76UsuMjzcYrRvgaMHLN59T4E92wR6jDoT/Q57xgMGB1NIakRPXy/T8wssr5XxbJ+luUW2
-DY2gKIl6xzXcLCDWgApQBWpr7fAE6Sy1KGR4726uldaYXVzmnre/k+q6yZWpJTxf5IMf/giFnhRf
-/OKftv/DZz5zrmunTve22a3Gw9wwyX35TlVX57504MH3/NKxYzcRuD43r93J/OXThH6TXDrDuXKL
-cmkeMahxbrnCkXmfpDDMoJDBcSwCrwGCimFEjOwY48rF59i+bwcyOqlUhnW28Sd/cY5iX5LvfOc0
-ojiOvvoUY4cn8HWLk2fPrccoYbN4uJnMDlbnWg/fvF/5oK7qzMxcpV22MCSFpx75NqlMnluO3kEi
-ZVAc6OXC5RfDL3zpS896nudtsVvd6wI63KJZ74YNsxAAsV5rlraNDLyv2fb6jVSebD5P6LucOnmc
-kICe8UmWGnUagYCU3IbLOKY3xMOPnuexx+ZJZbKEYj96ejsXLy/zB398houXljl89AN85ZtXyOz6
-GH/16ElaJLnzPR/jxKV5Ts1O8wu/+nM89uxX+cM/+MvjjuNtAlqOSW0dsBzTL+2ZGBrLJo3t46Oj
-/MtP/waH9x0ioyX5wHs/yJH77+OmWw7iR63gt/7v33p2ba1U6soIbkak7a5kudVZHq8xwe97AhcQ
-7WZtdmFp7Uci0eDQzUdJJjXOnX6BZr3Ezh376evvwwkEVGOAnoGDVBsyc8tVlFSa+YpAxcriacM8
-/NRL1IOIpbpCqv8QFxY8Pv7T/4zJg0fIDRX59L/+HZxI5Zf+xf/Czbfu5//8zU8tnjs1fb5z4ZUu
-YDcLiEGt2jw3ur3n3vnSQqZcLXPo1tsYHZ1gYHSc2dIKU7MXmr/zu//6WxcuXlqP9YZ5sfb8dhe4
-ccMZvFYd7XsBF0As1RrLupFMOZF8649/4ifQNYWB3hTZhMal46fpzaSwLZN602T37gMEvs1qeQrT
-r2H0HyI9uB8lP8rzl+aoehq21IOUHmOhYmE5Hk898whf/8Z/5R/99D/iQx/8GOPDowiByz//5V89
-4dh+qQNmGSh1AG7EdtqErbZtVertJws7C6NT64tDJ86elsZ27eWRbz+++LWHv3Ly9373t59aWFhs
-bzGwonvvQ7urOOl09YrdsDEsxDepAMl3vffBf3v02O0f37PrIBMjEyQVlSf/6vM89/wTzC1fo394
-iJtuOsyttxykUb1Gs1XiqZNLZHI9vO3Ou5idm6O/fwRdz/Cnf/YF1lYrSHKSj/7Q+/ixT/wojz3+
-GKlUFs9zOPfS87O/8r/979/qALsCLAHLHZBrsQ0gmxvEc0AWKHRWhv9/OLLGK4cTb4Jsxri8Aqx3
-nusdDWl3AXxDBwi94sZcnbrybSFqppqmf6R/9BByapRDRw+TKQ7RckCUda5eneKl8+dYXF5naaXO
-xWtXKNcrVGtV1lYrvHTuMn/zjcepV1scvulmPv7jP8X9DzyA5wv8p8/+vyhaxInnv934/d//T0/Y
-trPJtaXOhdc6F76Za91s3OjOAyi8eqZj3DtwY/vLWrEOm3asAmx31dCiG+3nhl2NwdZ3vvP8b1yd
-XT3p+vzKz/wPvzTcPzrMA4MfZMfeI0hCxNSlC6wszTM7PY1pNikUDSRZBrmPMAwYnxxg3+EMR48c
-ww8Cas0mjdY6mi7xxJOPUCpPt77zxFNP1WvNeqzMXY31E1hd/bNC1wyJ7n1mm4ZLie2aDGPGrBkD
-047tlvS7poJwo2mhe/iF2plfk5Zkqf/DH//hH3773Q99aHRsYlQWZXbt2M7c3DKpRIpsOkvCkJmb
-m+f4c8e58223s7q2wvbt47iuQ6tV42tff5jdu0ZIJFQe+cZXOH78mdWZ6cVnXNevd8BcBxY6dLDW
-AbodA2BTopTOlJMUr5w2neyszanTcXC9rtx1I/b9zS7teEs4t9tz2JxHbnROPgf0jO/cddvR2972
-jg995CMHp67M9OQyvTzwzgcQibh0YZmTL77IsWOHcT2L8W3DPPrNh/E8myuXL2C3lzh96mS93XIu
-Li6sz8bcolIH1CVgtcOF7S7Jjbo2jCdiPJvqGnYUnyG2KdF2F++2YiUet+s4bxm43QBvGpFkx4jk
-Nw2JkUqM79i1a/Ke++4fq1Rq/Yvz1cz2iQlNkhDmFmbYsWNMOHfudNho1Jori8vVVr22ZLadRkyK
-zI4ErXXAXekYsVbMuvtdjr4Qm9VjdE2I0mNTmOLjvePca8ZK6VaMb1+XGm7k7zMIW0wb2VTHTAzo
-bOd9OiY5Wkw1pa52eTcGbKMD5lqHFqodqYobmPgkD6HLs1FjgOpdE0HELbrIvRjXOl0jAAJeZ/bu
-jfwpg6grqRHGJGBTnesdUDddoVTXfDEldk7d4LZiBqzaed3qUtHu5EoYA8zvcrU225HiowaFrr9x
-Y3/nbjVT4Q27U2+RFMfHA2oxMBNd6hmX3nhhNC65ce6Lb8XfasZM9Bpz0iReOetR6RoBQNeGPm+L
-jdOvOzH6rf7ZFoGtJ4eqsaXxykFwUpe7F1fPuGpuNVvmtX4hStjipktbVHTjm6fDrr29b2oa9ff7
-h4deawKoGDMqxNQ5Dp7XtYl5qxHZr6eu3Tv1hS12p0dcf3D8Gx7z/YP4PbQ3MnBzqyz/VkPio+/m
-otl6hm53Nfd63x29mQv9QT+26mh5o/0U0RZtV2/2Jl+3w/M6x+LvErhvBOw30st2I7Tphn7v3/af
-SewGOrpeVeRv4+P/A9Q+PxXM9RiwAAAAAElFTkSuQmCC
-
-------- =_aaaaaaaaaa0--
diff --git a/default_user/local/Makefile.am b/default_user/local/Makefile.am
deleted file mode 100644
index 3c89920d47..0000000000
--- a/default_user/local/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-SUBDIRS = \
- Calendar \
- Contacts \
- Drafts \
- Inbox \
- Outbox \
- Trash
diff --git a/default_user/local/Outbox/.cvsignore b/default_user/local/Outbox/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/default_user/local/Outbox/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/default_user/local/Outbox/Makefile.am b/default_user/local/Outbox/Makefile.am
deleted file mode 100644
index d9ccc4dba4..0000000000
--- a/default_user/local/Outbox/Makefile.am
+++ /dev/null
@@ -1,4 +0,0 @@
-defaultcalendardir = $(datadir)/evolution/default_user/local/Outbox
-defaultcalendar_DATA = folder-metadata.xml
-
-EXTRA_DIST = $(defaultcalendar_DATA)
diff --git a/default_user/local/Outbox/folder-metadata.xml b/default_user/local/Outbox/folder-metadata.xml
deleted file mode 100644
index 4452fb9e0c..0000000000
--- a/default_user/local/Outbox/folder-metadata.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<efolder>
- <type>mail</type>
- <description>Outbox</description>
-</efolder>
diff --git a/default_user/local/Trash/.cvsignore b/default_user/local/Trash/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/default_user/local/Trash/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/default_user/local/Trash/Makefile.am b/default_user/local/Trash/Makefile.am
deleted file mode 100644
index 25def5bfe9..0000000000
--- a/default_user/local/Trash/Makefile.am
+++ /dev/null
@@ -1,4 +0,0 @@
-defaultcalendardir = $(datadir)/evolution/default_user/local/Trash
-defaultcalendar_DATA = folder-metadata.xml
-
-EXTRA_DIST = $(defaultcalendar_DATA)
diff --git a/default_user/local/Trash/folder-metadata.xml b/default_user/local/Trash/folder-metadata.xml
deleted file mode 100644
index 6f1acf7a4a..0000000000
--- a/default_user/local/Trash/folder-metadata.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<efolder>
- <type>mail</type>
- <description>Trash</description>
-</efolder>
diff --git a/default_user/shortcuts.xml b/default_user/shortcuts.xml
deleted file mode 100644
index fadf740c5a..0000000000
--- a/default_user/shortcuts.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0"?>
-<shortcuts>
- <group title="Evolution shortcuts">
- <item>evolution:/local/Inbox</item>
-<!-- <item>evolution:/local/Outbox</item>
- <item>evolution:/local/Trash</item>
- <item>evolution:/local/Drafts</item> -->
- <item>evolution:/local/Calendar</item>
- <item>evolution:/local/Contacts</item>
- </group>
-
-
-<!-- <group title="Personal shortcuts">
- </group>
--->
-</shortcuts>
-
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 276059cf88..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
-
-
-
-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/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/C/.cvsignore b/doc/C/.cvsignore
deleted file mode 100644
index cba1534920..0000000000
--- a/doc/C/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-Makefile.in
-evolution-guide
-evolution-guide.junk
diff --git a/doc/C/Makefile.am b/doc/C/Makefile.am
deleted file mode 100644
index 0d02ac056f..0000000000
--- a/doc/C/Makefile.am
+++ /dev/null
@@ -1,51 +0,0 @@
-evolution_helpdir = $(datadir)/gnome/help/evolution/C
-
-SGML_FILES = \
- apx-authors.sgml \
- apx-bugs.sgml \
- apx-fdl.sgml \
- apx-gloss.sgml \
- config-prefs.sgml \
- config-setupassist.sgml \
- config-sync.sgml \
- evolution-guide.sgml \
- preface.sgml \
- usage-calendar.sgml \
- usage-contact.sgml \
- usage-mail.sgml \
- usage-mainwindow.sgml \
- usage-sync.sgml
-
-
-EXTRA_DIST = \
- $(SGML_FILES)
-
-all: evolution-guide
-
-evolution-guide: $(SGML_FILES)
- -db2html evolution-guide.sgml
-
-dist-hook:
- mkdir $(distdir)/evolution-guide
- -cp evolution-guide/*.html evolution-guide/*.css \
- $(distdir)/evolution-guide
- mkdir $(distdir)/fig
- -cp fig/*.png $(distdir)/fig
-
-install-data-local: evolution-guide
- $(top_srcdir)/mkinstalldirs $(DESTDIR)$(evolution_helpdir)/fig
- -for file in $(srcdir)/evolution-guide/*.html $(srcdir)/evolution-guide/*.css; do \
- basefile=`basename $$file`; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(evolution_helpdir)/$$basefile; \
- done
- -for file in $(srcdir)/fig/*.png; do \
- basefile=`basename $$file`; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(evolution_helpdir)/fig/$$basefile; \
- done
-
-evolution.ps: evolution.sgml
- -db2ps $<
-
-evolution.rtf: evolution.sgml
- -db2rtf $<
-
diff --git a/doc/C/apx-authors.sgml b/doc/C/apx-authors.sgml
deleted file mode 100644
index e064276be3..0000000000
--- a/doc/C/apx-authors.sgml
+++ /dev/null
@@ -1,74 +0,0 @@
-
- <appendix id="authors">
- <title>Authors</title>
- <para>
- <application>Evolution</application> was written by:
-<simplelist>
- <member>Seth Alves: <email>alves@helixcode.com</email></member>
- <member>Anders Carlsson<email>andersca@gnu.org</email></member>
- <member>Damon Chaplin:<email>damon@helixcode.com</email></member>
- <member>Clifford R. Conover <email>rusty@zootweb.com</email></member>
- <member>Miguel De Icaza: <email>miguel@helixcode.com</email></member>
- <member>Arturo Espinoza <email>arturo@nucleu.unam.mx</email></member>
- <member>Larry Ewing: <email>lewing@helixcode.com</email></member>
- <member>Bertrand Guiheneuf: <email>bertrand@helixcode.com</email></member>
- <member>Tuomas Kuosmanen: <email>tigert@gimp.org</email></member>
- <member>Christopher J. Lahey: <email>clahey@helixcode.com</email></member>
- <member>Matthew Loper: <email>matt@helixcode.com</email></member>
- <member> Federico Mena: <email>federico@helixcode.com</email></member>
- <member>Eskil Heyn Olsen<email>deity@eski.dk</email></member>
- <member> Nat Friedman: <email>nat@helixcode.com</email></member>
- <member>Ettore Perazzoli:<email>ettore@helixcode.com</email></member>
- <member>Russell Steinthal: <email>rms39@columbia.edu</email></member>
- <member> Peter Teichman: <email>peter@helixcode.com</email></member>
- <member> Chris Toshok: <email>toshok@helixcode.com</email></member>
- <member> Radek Doulik: <email>rodo@helixcode.com</email></member>
- <member> Dan Winship: <email>danw@helixcode.com</email></member>
- <member> Michael Zucchi: <email>notzed@helixcode.com</email></member>
-</simplelist>
-and other dedicated GNOME programmers.
-</para>
- <para>
- 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.
- </para>
-
- <para>
- For more information please visit the
- <application>Evolution</application> <ulink
- url="http://www.helixcode.com/apps/evolution.php3"
- type="http">Web page</ulink>. Please send all comments,
- suggestions, and bug reports to the <ulink
- url="http://bugs.gnome.org" type="http">GNOME bug tracking
- database</ulink>. Instructions for submitting bug reports can be
- found on-line at <ulink
- url="http://bugs.gnome.org/Reporting.html" type="http">
- http://bugs.gnome.org/Reporting.html</ulink>. You can also use
- command <command>bug-buddy</command> for submitting bug reports.
- </para>
- <para>
- This manual was written by Aaron Weber
- (<email>aaron@helixcode.com</email>) and Kevin Breit
- (<email>battery841@mypad.com</email>) with the help of the
- application programmers and the GNOME Documentation Project.
- Please send all comments and suggestions regarding the manual to
- the GNOME Documentation Project at
- <email>docs@gnome.org</email>. You can also add your comments
- online by using <ulink type="http"
- url="http://www.gnome.org/gdp/doctable/">GNOME Documentation
- Status Table</ulink>.
- </para>
- <!-- For translations: uncomment this: <para> Latin translation
- was done by ME (<email>MYNAME@MYADDRESS</email>). Please send
- all comments and suggestions regarding this translation to
- SOMEWHERE. </para> -->
- </appendix>
-
-
-
-
-
diff --git a/doc/C/apx-bugs.sgml b/doc/C/apx-bugs.sgml
deleted file mode 100644
index e7a501acba..0000000000
--- a/doc/C/apx-bugs.sgml
+++ /dev/null
@@ -1,19 +0,0 @@
- <appendix id="bugs">
-
- <title>Known bugs and limitations</title>
- <abstract>
- <para>
- This appendix describes known bugs and limitations of
- <application>Evolution</application>. Please use the GNOME
- <application>Bug Report Tool</application> (known as
- <command>bug-buddy</command> at the command line) if you find one
- we have not listed.
- </para>
- </abstract>
-
- <para>
- The bugs are many, but the application is young, and this is to
- be expected.
- </para>
- </appendix>
-
diff --git a/doc/C/apx-fdl.sgml b/doc/C/apx-fdl.sgml
deleted file mode 100644
index 8b49729cfc..0000000000
--- a/doc/C/apx-fdl.sgml
+++ /dev/null
@@ -1,678 +0,0 @@
-<appendix id="fdl">
- <title>GNU Free Documentation License</title>
- <para>
- Version 1.1, March 2000
- </para>
-
- <para>
- Copyright &copy; 2000
- <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>
-
- <variablelist>
- <varlistentry id="fdl-preamble">
- <term>0. PREAMBLE</term>
- <listitem>
- <para>
- 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.
- </para>
-
- <para>
- 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.
- </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>
- </listitem>
- </varlistentry>
- <varlistentry id="fdl-section1">
- <term>1. APPLICABILITY AND DEFINITIONS</term>
- <listitem>
- <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 <link
- linkend="fdl-document">"Document" </link>, below, refers to any such
- manual or work. Any member of the public is a licensee, and is
- addressed as "you".
- </para>
-
- <para id="fdl-modified">
- A <link linkend="fdl-modified">"Modified Version"</link> 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 <link linkend="fdl-secondary">"Secondary Section"</link> 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 <link
- linkend="fdl-document"> Document</link> to the <link
- linkend="fdl-document"> Document's</link> overall subject (or to
- related matters) and contains nothing that could fall directly within
- that overall subject. (For example, if the <link
- linkend="fdl-document">Document</link> is in part a textbook of
- mathematics, a <link linkend="fdl-secondary">Secondary Section</link>
- 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 <link linkend="fdl-invariant">"Invariant Sections"</link> are
- certain <link linkend="fdl-secondary"> Secondary Sections</link> whose
- titles are designated, as being those of <link
- linkend="fdl-invariant">Invariant Sections</link>, 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 <link linkend="fdl-cover-texts">"Cover Texts"</link> are certain
- short passages of text that are listed, as <link
- linkend="fdl-cover-texts">Front-Cover Texts</link> or <link
- linkend="fdl-cover-texts">Back-Cover Texts</link>, in the notice that
- says that the <link linkend="fdl-document">Document</link> is released
- under this License.
- </para>
-
- <para id="fdl-transparent">
- A <link linkend="fdl-transparent">"Transparent"</link> 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 <link
- linkend="fdl-transparent"> Transparent</link> file format whose markup
- has been designed to thwart or discourage subsequent modification by
- readers is not <link linkend="fdl-transparent">Transparent</link>. A
- copy that is not <link linkend="fdl-transparent">"Transparent"</link>
- is called "Opaque".
- </para>
-
- <para>
- Examples of suitable formats for <link
- linkend="fdl-transparent">Transparent</link> 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 <link linkend="fdl-title-page">"Title Page"</link> 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, <link linkend="fdl-title-page"> "Title Page"</link>
- means the text near the most prominent appearance of the work's title,
- preceding the beginning of the body of the text.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section2">
- <term>2. VERBATIM COPYING</term>
- <listitem>
- <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 <link linkend="fdl-document">Document</link> 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>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section3">
- <term>3. COPYING IN QUANTITY</term>
- <listitem>
- <para>
- If you publish printed copies of the <link
- linkend="fdl-document">Document</link> numbering more than 100, and
- the <link linkend="fdl-document">Document's</link> 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 <link linkend="fdl-cover-texts">Cover Texts</link>: 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
- <link linkend="fdl-transparent">Opaque</link> copy, or state in or
- with each <link linkend="fdl-transparent">Opaque</link> copy a
- publicly-accessible computer-network location containing a complete
- <link linkend="fdl-transparent"> Transparent</link> copy of the <link
- linkend="fdl-document">Document</link>, 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 <link linkend="fdl-transparent">Opaque</link> copies
- in quantity, to ensure that this <link
- linkend="fdl-transparent">Transparent</link> copy will remain thus
- accessible at the stated location until at least one year after the
- last time you distribute an <link
- linkend="fdl-transparent">Opaque</link> 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 <link
- linkend="fdl-document">Document</link>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section4">
- <term>4. MODIFICATIONS</term>
- <listitem>
- <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 <link linkend="fdl-modified">Modified Version</link> under
- precisely this License, with the <link linkend="fdl-modified">Modified
- Version</link> filling the role of the <link
- linkend="fdl-document">Document</link>, thus licensing distribution
- and modification of the <link linkend="fdl-modified">Modified
- Version</link> to whoever possesses a copy of it. In addition, you
- must do these things in the <link linkend="fdl-modified">Modified
- Version</link>:
- </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 <link
- linkend="fdl-document">Document</link>). 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 "History", 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 "History" in the
- <link linkend="fdl-document">Document</link>, create one stating
- the title, year, authors, and publisher of the <link
- linkend="fdl-document">Document</link> as given on its <link
- linkend="fdl-title-page">Title Page</link>, then add an item
- describing the <link linkend="fdl-modified">Modified
- Version</link> 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
- <link linkend="fdl-document">Document</link>, and likewise the
- network locations given in the <link
- linkend="fdl-document">Document</link> 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 <link
- linkend="fdl-document">Document</link> 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 "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.
- </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 "Endorsements". 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 "Endorsements" 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 <link linkend="fdl-modified">Modified
- Version's</link> license notice. These titles must be distinct from
- any other section titles.
- </para>
-
- <para>
- You may add a section entitled "Endorsements", 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
- <link linkend="fdl-cover-texts">Front-Cover Text</link> and one of
- <link linkend="fdl-cover-texts">Back-Cover Text</link> 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>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section5">
- <term>5. COMBINING DOCUMENTS</term>
- <listitem>
- <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 <link
- linkend="fdl-invariant">Invariant Sections</link> 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 <link linkend="fdl-invariant"> Invariant Sections</link> 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 <link linkend="fdl-invariant">Invariant Sections</link> in the
- license notice of the combined work.
- </para>
-
- <para>
- 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."
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section6">
- <term>6. COLLECTIONS OF DOCUMENTS</term>
- <listitem>
- <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
- 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.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section7">
- <term>7. AGGREGATION WITH INDEPENDENT WORKS</term>
- <listitem>
- <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 <link linkend="fdl-document"> Document</link>,
- 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 <link
- linkend="fdl-document">Document</link> , on account of their being
- thus compiled, if they are not themselves derivative works of the
- <link linkend="fdl-document">Document</link>. 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 <link linkend="fdl-document">Document</link>, then if the <link
- linkend="fdl-document">Document</link> is less than one quarter of the
- entire aggregate, the <link linkend="fdl-document">Document's</link>
- <link linkend="fdl-cover-texts">Cover Texts</link> may be placed on
- covers that surround only the <link
- linkend="fdl-document">Document</link> within the aggregate. Otherwise
- they must appear on covers around the whole aggregate.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section8">
- <term>8. TRANSLATION</term>
- <listitem>
- <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 <link
- linkend="fdl-invariant">Invariant Sections</link> in addition to the
- original versions of these <link linkend="fdl-invariant">Invariant
- Sections</link>. 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>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section9">
- <term>9. TERMINATION</term>
- <listitem>
- <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 <link linkend="fdl-document">Document</link> 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>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section10">
- <term>10. FUTURE REVISIONS OF THIS LICENSE</term>
- <listitem>
- <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 "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 <link linkend="fdl-document">Document</link> 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>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-using">
- <term>Addendum</term>
- <listitem>
- <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>
-
- <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>
-
- <para>
- If you have no <link linkend="fdl-invariant">Invariant
- Sections</link>, write "with no Invariant Sections" instead of saying
- which ones are invariant. If you have no <link
- linkend="fdl-cover-texts">Front-Cover Texts</link>, write "no
- Front-Cover Texts" instead of "Front-Cover Texts being LIST"; 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>
- </listitem>
- </varlistentry>
- </variablelist>
-</appendix> \ No newline at end of file
diff --git a/doc/C/apx-gloss.sgml b/doc/C/apx-gloss.sgml
deleted file mode 100644
index 55ab3ed8a1..0000000000
--- a/doc/C/apx-gloss.sgml
+++ /dev/null
@@ -1,284 +0,0 @@
-<glossary id="glossary">
-
- <title>Glossary</title>
-
- <glossentry id="attachment">
- <glossterm>Attachment</glossterm>
- <glossdef>
- <para>
- Any file sent along with an email. Attachments may be embedded in
- a message or appended to it.
- </para>
- </glossdef>
- </glossentry>
-
-<glossentry id="automatic-indexing">
- <glossterm>Automatic Indexing</glossterm>
- <glossdef>
- <para>
- Pre-sorting procedure that allows
- <application>Evolution</application> to refer to data quickly.
- It enables faster searches and decreases memory usage for
- data displays.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="bcc">
- <glossterm>Bcc (Blind Carbon Copy)</glossterm>
- <glossdef>
- <para>
- A way of addressing a message. Bcc is used to send a group of
- people an e-mail, while hiding their names and addresses from each
- other.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="cc">
- <glossterm>Cc (Carbon Copy)</glossterm>
- <glossdef>
- <para>
- Carbon-copies are used to send a 3rd party a copy of the e-mail,
- so they an keep up to date on a conversation, without being in the
- To: list.
- </para>
- </glossdef>
- </glossentry>
-
-<!-- Removed pending decision on names
- <glossentry id="druid">
- <glossterm>Druid</glossterm>
- <glossdef>
- <para>
- A small program or script used to help configure or set up some
- larger program. The <application>mail setup druid</application>
- helps you ready your email system for use. Druids are the Linux
- equivalent of "Assistants" and "Wizards."
- </para>
- </glossdef>
- </glossentry>
--->
-<glossentry id="emoticon">
- <glossterm>Emoticon</glossterm>
- <glossdef>
- <para>
- Also called smileys, emoticons are the little sideways faces made
- of colons and parentheses which people use to convey emotion in email.
- Examples: :-) or ;( .
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="evolution">
- <glossterm>Evolution</glossterm>
- <glossdef>
- <para>
- <application>Evolution</application> is the <acronym> GNOME
- </acronym> 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. <application>Evolution</application> 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.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="filter">
- <glossterm>Filter</glossterm>
- <glossdef>
- <para>
- Within <application>Evolution</application>, a filter is a method
- of sorting mail automatically. 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>
- the user can send a third party a message
- which was sent to the user originally.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="groupware">
- <glossterm>Groupware</glossterm>
- <glossdef>
- <para>
- Groupware is a term describing an application which helps groups
- of people work together. Typically, a groupware application will
- have several productivity features built into one program.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="haiku">
- <glossterm>Haiku</glossterm>
- <glossdef>
- <para>
- A Japanese form of poetry. Haiku are unrhymed, and
- three lines long. The first and last lines should have five
- syllables, and the second line seven syllables. The subject
- matter is traditionally related to the seasons.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="html">
- <glossterm>HTML</glossterm>
- <glossdef>
- <para>
- Hyper-text Markup Language(<acronym>HTML</acronym>) is the layout
- language which all webpages are written in. HTML can be used
- inside of e-mails to insert images, justfiy text different ways,
- and even include webpages inside the e-mail itself.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="hot-key">
- <glossterm>Hot Key</glossterm>
- <glossdef>
- <para>
- Hot-keys are keyboard combinations used to do actions on a
- computer instead of using the mouse to do the same action.
- Hot-keys can speed up computer usage.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="ical">
- <glossterm>iCal</glossterm>
- <glossdef>
- <para>
- <application>iCal</application> is the program which
- <application>Evolution</application> uses to manage the calendar
- section.
- </para>
- </glossdef>
- </glossentry>
-
-
- <glossentry id="ldap">
- <glossterm>LDAP</glossterm>
- <glossdef>
- <para>
- LDAP is a protocol which allows a client to search through a large database
- of addresses, phone numbers, and people, as an alternative to a physical
- phone book.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="mail-client">
- <glossterm>Mail Client</glossterm>
- <glossdef>
- <para>
- A mail client is 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="nautilus">
- <glossterm>Nautilus</glossterm>
- <glossdef>
- <para>
- <application>Nautilus</application> is the next generation file
- manager for <acronym>GNOME</acronym> being written by Eazel.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="nickname">
- <glossterm>Nickname</glossterm>
- <glossdef>
- <para>
- An alias for an e-mail address.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="script">
- <glossterm>Script</glossterm>
- <glossdef>
- <para>
- A program which is written in an interpreted language, which can
- be executed.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="shortcut-bar">
- <glossterm>Shortcut Bar</glossterm>
- <glossdef>
- <para>
- The <interface>Shortcut Bar</interface> is where the user accesses
- all the components of <application>Evolution</application> from.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="signature">
- <glossterm>Signature</glossterm>
- <glossdef>
- <para>
- Signatures allow a user to specify a message to place at the bottom of
- every email sent. A signature can be anything from a favorite quote to
- a link to a webpage.
- </para>
- </glossdef>
- </glossentry>
-
-
- <glossentry id="spam">
- <glossterm>Spam</glossterm>
- <glossdef>
- <para>
- Spam: useless, unwanted e-mail. Spam normally comes in forms of
- chain-letters and advertisements for unscrupulous websites or
- services. Messages that are merely useless are called
- "opt-in newsletters."
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="vfolder">
- <glossterm>vFolder</glossterm>
- <glossdef>
- <para>
- vFolders allow an e-mail to be shared among multiple folders, so
- it appears that theres a copy of the e-mail in each folder.
- </para>
- </glossdef>
- </glossentry>
-
-</glossary>
diff --git a/doc/C/apx-gpl.sgml b/doc/C/apx-gpl.sgml
deleted file mode 100644
index 7c7e4cd0f7..0000000000
--- a/doc/C/apx-gpl.sgml
+++ /dev/null
@@ -1,414 +0,0 @@
-<appendix id="gpl">
- <title>GNU GENERAL PUBLIC LICENSE</title>
- <subtitle>Version 2, June 1991</subtitle>
-
-
-<para>
-
- 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.
-</para>
-<sect1>
-<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: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-</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>
-<title> GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</title>
-<para>
- 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".
-</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>
-<para>
- 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.
-</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>
-<para>
- 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:
-</para>
-<para>
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-</para>
-<para>
- 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.
-</para>
-<para>
- 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.)
-</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>
-<para>
- 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:
-</para>
-<para>
- 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,
-</para>
-<para>
- 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,
-</para>
-<para>
- 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.)
-</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>
-<para>
- 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.
-</para>
-<para>
- 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.
-</para>
-<para>
- 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.
-</para>
-<para>
- 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.
-</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>
-<para>
- 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.
-</para>
-<para>
- 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.
-</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>
-<para>
- 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.
-</para>
-</sect1>
-<sect1>
-<title>NO WARRANTY</title>
-<para>
- 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.
-</para>
-<para>
- 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.
-</para>
-<para>
- END OF TERMS AND CONDITIONS
-</para>
-</sect1>
- <sect1>
- <title>How to Apply These Terms to Your New Programs</title>
-<para>
- 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.
-</para>
-<para>
- 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.
-</para>
-<para>
- &lt;one line to give the program's name and a brief idea of what it does.&gt;
-Copyright (C) &lt; year&gt; &lt;name of author&gt;
-</para>
-<para>
- 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.
-</para>
-<para>
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-</para>
-<para>
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-</para>
-<para>
-
-Also add information on how to contact you by electronic and paper mail.
-</para>
-<para>
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-</para>
-<para>
- 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.
-</para>
-<para>
-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.
-</para>
-<para>
-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:
-</para>
-<para>
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-</para>
-<para>
- &lt;signature of Ty Coon&gt;, 1 April 1989
- Ty Coon, President of Vice
-</para>
-<para>
-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.
-</para>
-</sect1>
-</appendix>
-
-
-
-
-
-
-
-
-
diff --git a/doc/C/config-prefs.sgml b/doc/C/config-prefs.sgml
deleted file mode 100644
index e0f6dd0297..0000000000
--- a/doc/C/config-prefs.sgml
+++ /dev/null
@@ -1,570 +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, first go to your
- <interface>Inbox</interface>. Then select <guimenuitem>Mail
- Settings</guimenuitem> from the <guimenu>Tools</guimenu> menu.
- 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>Identity</guilabel></term>
- <listitem>
- <para>
- This allows you to set
- your name, email address, and other information. The
- default values are the ones found on your system account.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Sources</guilabel></term>
- <listitem>
- <para>
- Set your mail-checking protocols and servers here.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Sources</guilabel></term>
- <listitem>
- <para>
- Set your mail-checking protocols and servers here.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>News Servers</guilabel></term>
- <listitem>
- <para>
- Specify your News Server preferences here.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
-<!-- THE FOLLOWING MAY BE REINSTATED:
- as well as attachment
- and HTML handling, forwarding behavior, filters, and
- other <application>Evolution</application> behaviors
- specific to email. The default behaviors are those
- approved by Jamie Zawinski.
--->
-
-
- </para>
-
- <!-- ==============Figure===================== -->
- <figure id="config-prefs-mail-fig">
- <title>Preferences Dialog</title>
- <screenshot>
- <screeninfo>Setting mail preferences</screeninfo>
- <graphic fileref="fig/config-mail" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
- <!-- ==============End of Figure================-->
-
-
- <sect2 id="config-prefs-mail-identity">
- <title>Identity Settings</title>
- <para>
- If you have only one email address, or use automatic
- forwarding to funnel multiple addresses to one account, then
- you will only need to configure one identity. You may,
- however, want more that one. To alter an identity, click on
- it in the <guilabel>Identity</guilabel> tab of the
- <interface>Preferences</interface> window, and then click
- <guibutton>Edit</guibutton>. To add a new identity, simply
- click <guibutton>Add</guibutton>.
- </para>
-
- <para>
- In either case, you'll be presented with a dialog box with
- four fields:
- <itemizedlist>
- <listitem>
- <para>
- <guilabel>Full Name:</guilabel> by default, this is the
- same name as the full name described in your user
- account on your computer. You can select another if you
- wish.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Email address:</guilabel> Enter your email
- address in this space.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Organization:</guilabel> If you send email as
- a representative of a company or other organization,
- enter its name here.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Signature file:</guilabel> You may choose a
- small text file to be appended to every message that you
- send. Typically, signature files include address or
- other contact information, or a favorite quotation.
- They should not be more than three lines long.
- </para>
- </listitem>
- </itemizedlist>
-
- </para>
- </sect2>
-
- <sect2 id="config-prefs-mail-network">
- <title>Network Settings</title>
- <para>
- In order to send mail with
- <application>Evolution</application>, you need to connect to
- your network. To do that, you'll need to know your user name
- and password, what sort of mail sending and receiving
- protocols your network uses, and the names of the servers
- you'll be using. If you're switching from another groupware
- or email program, you can almost certainly use the same
- settings as you did with that program. Select the
- <guibutton>Sources</guibutton> tab in the
- <interface>Preferences</interface> window to tell
- <application>Evolution</application> where you want to get
- your mail, and click <guibutton>Transports</guibutton> to
- determine how you want to send your mail.
- </para>
-
- <sect3 id="config-prefs-network-sources">
- <title>Mail Sources</title>
- <para>
- The <interface>Mail Sources</interface> tab allows you to
- edit, add, or delete methods of retrieving mail from
- servers. Clicking on <guibutton>Add</guibutton> or
- <guibutton>Edit</guibutton> will bring up a dialog box to
- offer you the following options:
- <variablelist>
- <varlistentry>
- <term><guilabel>Mail source type:</guilabel></term>
- <listitem>
- <para>
- Select from IMAP, POP or Unix-style
- <filename>mbox</filename> files.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term> <guilabel>Server:</guilabel></term>
- <listitem>
- <para>
- Enter the name of your mail server in this field.
- For example:
- <userinput>mail.mycompany.com</userinput>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Username:</guilabel></term>
- <listitem>
- <para>
- Enter your user name here. Eva Lucianne Tester's
- user name is <userinput>eltester</userinput>.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Authentication:</guilabel></term>
- <listitem>
- <para>
- Your system administrator will know which type of
- authentication your system requires.
- <application>Evolution</application> can also detect
- what sorts of authentication are available once it
- knows where to find the server.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Test values before continuing</guilabel></term>
- <listitem>
- <para>
- If this box is checked,
- <application>Evolution</application> will attempt to
- make sure that all the other entries in the dialog
- window are correct.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect3>
- <sect3 id="config-prefs-mail-network-transports">
- <title>Transports</title>
- <para>
- The <interface>Transports</interface> tab lets you set how
- you will send mail. Evolution currently supports two mail
- transport options: <guilabel>SMTP</guilabel>, which uses a
- remote mail server, and <guilabel>sendmail</guilabel>,
- which uses the <application>sendmail</application> program
- on your local system. <application>Sendmail</application>
- is more difficult to configure, but offers more flexibility
- than plain <systemitem>SMTP</systemitem>.
- </para>
- <para>
- To use <guilabel>SMTP</guilabel>, you'll need to enter the
- name of your SMTP server, which should look like:
- <userinput>smtp.isp.net</userinput>.
- </para>
- <para>
- <application>Evolution</application> can
- attempt to determine if you have entered the right server
- name. To have it do so, check the box labelled
- <guilabel>Test these values before continuing</guilabel>
- before you click <guibutton>OK</guibutton>.
- </para>
- </sect3>
- </sect2>
- <sect2 id="config-prefs-network-news">
-
- <!-- WHY is this in the MAIL config section? WHY is this UI SOOOO bad?-->
-
- <title>News Servers</title>
- <para>
- When you first select the <guilabel>News
- Servers</guilabel> tab, you will see a blank box with
- 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. (FIXME, this needs work).
- </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 configurations that don't have
- too much to do with each other.
- <variablelist>
- <varlistentry>
- <term>
- <guilabel>Send messages in HTML format</guilabel>
- </term>
- <listitem><para>
- If you check this box, you will send
- messages as HTML by default. If you leave it unchecked, your
- messages will be sent without HTML formatting unless you select
- <menuchoice> <guimenu>Format</guimenu> <guimenuitem>HTML</guimenuitem>
- </menuchoice> in the message composer.
- See <xref linkend="usage-mail-getnsend-send-html">
- for more information about HTML mail.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term>
- <guilabel>Folder Format</guilabel>
- </term>
- <listitem> <para> By default,
- <application>Evolution</application> saves its mail
- in the
- <systemitem><filename>mbox</filename></systemitem>
- format. You can switch to the
- <systemitem><filename>mh</filename></systemitem>
- format if you like. Note that this is an advanced
- feature and may cause you to lose some messages, so
- you should probably make a backup of your
- <systemitem><filename>evolution</filename></systemitem>
- directory first. In addition, it will take quite
- some time if you have a large mailbox.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
- </sect1>
-
- <sect1 id="config-prefs-contact">
- <title>Managing the Contact Manager</title>
- <para>
- To set the behavior of your Contact Manager, click on the
- <guibutton>Contact Manager</guibutton> tab in the
- <interface>Preferences</interface> window.
- </para>
- <para>
- You can set the following options: <!--insert variable list
- here-->
- </para>
- </sect1>
-
- <sect1 id="config-prefs-cal">
- <title>Configuring the Calendar</title>
- <para>
- This section discusses calendar-specific preferences. While
- looking at your calendar, select
- <guimenuitem>Preferences</guimenuitem> from the
- <guimenu>Edit</guimenu> menu. This will open up the
- <interface>Preferences</interface> window. It contains four
- tabs: <guilabel>Time display</guilabel>,
- <guilabel>Colors</guilabel>, <guilabel>To Do List</guilabel>
- and <guilabel>Alarms</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>
- <graphic fileref="fig/config-cal" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
- <!-- ==============End of Figure================-->
- </para>
-
- <sect2 id="config-prefs-cal-time">
- <title>Time Display Settings</title>
- <para>
- The <guilabel>Time display</guilabel> tab lets you set the
- following:
- <variablelist>
- <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>Weeks start on</term>
- <listitem>
- <para>You can set weeks to start on Sunday or on Monday.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Day range</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>
- </variablelist>
- </para>
- </sect2>
- <sect2 id="config-prefs-cal-color">
- <title>Calendar Colors</title>
- <para>
- The <interface>colors tab</interface> allows you to decide
- what color your calendar will be. The tab consists of a
- sample calendar on the right and a list of ten items that can
- be colored in different ways. If you click on the color
- button to the right of each item, you will bring up a
- color-selector window where you can choose to alter that
- color. By clicking <guibutton>OK</guibutton> in the color
- selection dialog, you can see the results of the color on the
- sample calendar.
- </para>
- <para>The display elements whose color you can set are:
-
- <itemizedlist>
- <listitem>
- <para>
- <guilabel>Outline:</guilabel> The lines between days
- and at the top of the display.
- </para>
- </listitem>
-
- <listitem>
- <para> <guilabel>Headings:</guilabel> Text color for day
- and month names and other headings.
- </para>
- </listitem>
-
- <listitem>
- <para> <guilabel>Empty days:</guilabel> This is the
- background color for any time slots in which you have no appointments.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <guilabel>Appointments:</guilabel> This is the
- background color for any time slots in which you have appointments.
- </para>
- </listitem>
-
- <listitem>
- <para> <guilabel>Highlighted day:</guilabel> The
- background color for a selected time slot.
- </para>
- </listitem>
-
-
- <listitem>
- <para>
- <guilabel>Day numbers:</guilabel> Text color for date numbers.
- </para>
- </listitem>
-
-
- <listitem>
- <para>
- <guilabel>Current day's number:</guilabel> Text color for today's date.
- </para>
- </listitem>
-
- <listitem>
- <para> <guilabel>To-Do item that is not yet
- due:</guilabel> Text color for To-Do list items that are
- not yet due. (Or maybe background color? find out!)
- </para>
- </listitem>
-
-
- <listitem>
- <para> <guilabel>To-Do item that is due today:</guilabel>
- Text color for today's tasks.
- </para>
- </listitem>
-
- <listitem>
- <para> <guilabel>To-Do item that is overdue:</guilabel>
- Text color for overdue tasks.
- </para>
- </listitem>
-
- </itemizedlist>
- </para>
- </sect2>
-
- <sect2 id="config-prefs-cal-todo">
- <title>To Do List Settings</title>
- <para>
- You can choose what information the To Do list displays and the
- way it is displayed. The two areas of the <interface>To Do
- List</interface> tab offer several options each:
- <variablelist>
- <varlistentry>
- <term>Show on To Do List</term>
- <listitem>
- <para>
- This box contains three items. If you select the
- check boxes next to them, that information will appear
- in the To Do list for each task it contains:
- <itemizedlist>
- <listitem>
- <para><guilabel>Due Date</guilabel></para>
- </listitem>
- <listitem>
- <para><guilabel>Time Until Due</guilabel></para>
- </listitem>
- <listitem>
- <para><guilabel>Priority</guilabel></para>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Style Options</term>
- <listitem>
- <para>
- Select among the following checkboxes to determine
- how your To Do list will look:
- <itemizedlist>
- <listitem>
- <para><guilabel>Highlight overdue items</guilabel></para>
- </listitem>
- <listitem>
- <para><guilabel>Highlight items due today</guilabel></para>
- </listitem>
- <listitem>
- <para><guilabel>Highlight not yet due items</guilabel></para>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
-
- <sect2 id="config-prefs-cal-alarms">
- <title>Alarms Settings</title>
- <para>
- The <interface>alarms tab</interface> enables you to select from three boxes:
- <itemizedlist>
- <listitem>
- <para><guilabel>Beep on display alarms</guilabel>: select
- this box to have <application>Evolution</application> beep
- at you for any alarms you have set. If you leave this box
- unchecked, <application>Evolution</application> will only
- alert you to events by opening a dialog box.
- </para>
- </listitem>
- <listitem>
- <para><guilabel>Audio alarms timeout after: </guilabel>
- Select this button to have the beeping stop automatically
- after a certain number of seconds. </para>
- </listitem>
- <listitem>
- <para><guilabel>Enable snoozing for:</guilabel> If you
- would like to have the option to tell
- <application>Evolution</application> to repeat an alarm in
- a few minutes, select this button and decide how long
- you'd like it to wait.
- </para>
- </listitem>
- </itemizedlist>
- </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/doc/C/config-setupassist.sgml b/doc/C/config-setupassist.sgml
deleted file mode 100644
index 52ca546b9a..0000000000
--- a/doc/C/config-setupassist.sgml
+++ /dev/null
@@ -1,159 +0,0 @@
- <chapter id="config-setupassist">
- <title>Easy Setup with the Setup Assistant</title>
- <para>
- The setup assistant can gather most of the information
- necessary for <application>Evolution</application>'s daily
- operation. If you prefer more detailed or advanced
- configuration, see <xref linkend="config-prefs">.
- </para>
-
- <sect1 id="config-setupassist-mail">
- <title>Mail Setup</title>
- <para>
- The first time you try to send or receive mail with
- <application>Evolution</application>, the <interface>mail
- setup assistant</interface> will pop up to help you with your
- email preferences. If you don't plan to use email, or if
- you'd rather deal with your email preferences later, click
- <guibutton>Cancel</guibutton>.
- </para>
- <para>
- The setup assistant (sometimes called a
- <glossterm>Druid</glossterm>) will guide you through the
- network configuration process. It will ask you for some
- basic information; your system administrator or ISP should
- have the answers you'll need. The mail setup assistant is
- pictured in <xref linkend="usage-setup-fig">.
-
-<!-- ==============Figure=================================== -->
-<!-- druid-pic should eventually become assistant-pic -->
-
- <figure id="usage-setup-fig">
- <title>Mail Setup Assistant</title>
- <screenshot>
- <screeninfo>Evolution Main Window</screeninfo>
- <graphic fileref="fig/mail-druid-pic" format="png" srccredit="Kevin Breit">
- </graphic>
- </screenshot>
- </figure>
-<!-- ==============End of Figure=================================== -->
-
-
-
- The assistant will ask you for the following information:
- <variablelist>
-
- <varlistentry>
- <term> <guilabel>Name:</guilabel> </term>
- <listitem> <para>Your
- full name: eg. Eva Lucianne Tester </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Email address:</guilabel></term>
- <listitem><para>
- Your email address: eg. eltester@helixcode.com
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guilabel>Organization:</guilabel></term>
- <listitem>
- <para>
- <guilabel>Organization:</guilabel> Any organization you
- represent. Leave this blank if you wish.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Signature File:</guilabel></term>
- <listitem>
- <para>
- A text file appended to any email you send. A signature
- file typically consists of your name and email address,
- or a quotation you like. It should be fewer than four
- lines of text.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guilabel>Mail source type:</guilabel></term>
- <listitem>
- <para>
- <application>Evolution</application> supports three mail
- sources: POP servers, the most common email server type;
- IMAP, which stores mail remotely and allows access from
- multiple locations, and UNIX-style
- <filename>mbox</filename> files. Ask your system
- administrator which one you use.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guilabel>Server:</guilabel></term>
- <listitem>
- <para>
- This should be the name of your mail server: it should
- look something like:
- <userinput>mailserver.organization.org</userinput>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Username:</guilabel></term>
- <listitem>
- <para>
- Normally, this is the part of your email address before
- the @ character, and
- <application>Evolution</application> has selected that
- value as the default. If you have a different username,
- you can enter it here.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Authentication:</guilabel></term>
- <listitem>
- <para>
- Select the type of authentication you will use. You can
- click <guibutton>Detect supported types</guibutton> to
- find out which authentication protocols your network
- allows.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Mail Transport:</guilabel></term>
- <listitem>
- <para>
- This is the mail sending protocol you will want to use.
- <application>Evolution</application> supports both SMTP
- and <application>sendmail</application>.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <para>
- To learn how to configure <application>Evolution</application>
- in greater detail, or to change preferences once you have set
- them, see <xref linkend="config-prefs">.
- </para>
- </sect1>
-
-</chapter>
-
-
-
-
-
-
-
-
-
diff --git a/doc/C/config-sync.sgml b/doc/C/config-sync.sgml
deleted file mode 100644
index ae78a6daaf..0000000000
--- a/doc/C/config-sync.sgml
+++ /dev/null
@@ -1,67 +0,0 @@
- <chapter id="config-sync">
-
- <!-- THIS ENTIRE CHAPTER MAY BE DELETED -->
-
- <title>Setting up your synchronization system</title>
- <para>
- Synchronization presents you with two issues you'll need to
- deal with. The first one is pretty simple: you'll need to get
- the data to move among the various devices you're using. If
- you've already got <application>Gnome-Pilot</application>
- working, then all you have to do is tell it to use Evolution
- as a conduit. If you haven't used
- <application>Gnome-Pilot</application> before, you'll need to
- run the GNOME <application>Control Center</application> and go
- through the hand-held device setup assistant. Then you can
- create the Evolution conduit and press the hotsync button.
- </para>
- <para>
- If that doesn't work, jump up and down several times and swear
- loudly. Then make sure you've got
- <application>Gnome-Pilot</application> going to the right
- device (for my serial port, it's /dev/ttys0, not the default
- /dev/pilot) and that you have read and write permission on
- that device. If you don't you'll need to be added to whatever
- group has those permissions (for my system, it's tty).
- Alternately, if you're the only user of your computer and
- don't care too much about security, just use
- <command>su</command> to become root, and then use
- <command>chmod a+rw /dev/[DEVICENAME]</command> to set
- universal read and write permissions on that port&mdash; just
- don't tell your sysadmin I said you could. (Sysadmins, of
- course, would never do such a thing.)
- </para>
- <para>
- Once <application>Evolution</application> knows where to get
- the mail, address, and calendar data, it needs to know what to
- do with it. When you synchronize your local data with the data on
- a server or handheld device, you may run into conflicts:
- perhaps you have ended up with two cards with the same name
- and different addresses, or old mail that has been deleted
- from one device but not the other. What if you want to keep
- only the most recent mail on your hand-held or your laptop,
- but all the mail on the LDAP server or your desktop machine?
- Select the <guibutton>Synchronization</guibutton> tab from the
- <interface>Preferences</interface> window to set up the
- conflict resolution preferences.
- </para>
- <para>
- You can set <application>Evolution</application>'s
- synchronization behavior in the following ways:
- <!-- LIST HERE -->
- </para>
- <para>
- <warning>
- <title>Data Loss Prevention</title>
- <para>
- It's always a good idea to make a backup. If you set your
- synchronization behaviors wrong, you could end up deleting
- the messages and cards you want to keep, and keeping the
- ones you want to delete. Before you change these
- preferences, make a backup of your
- <application>Evolution</application> files. You can do
- this by... <!--DESCRIBE HERE -->
- </para>
- </warning>
- </para>
- </chapter>
diff --git a/doc/C/evolution-guide.sgml b/doc/C/evolution-guide.sgml
deleted file mode 100644
index 59b50120b9..0000000000
--- a/doc/C/evolution-guide.sgml
+++ /dev/null
@@ -1,132 +0,0 @@
-<!DOCTYPE Book PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN"[
-<!ENTITY PREFACE SYSTEM "preface.sgml">
-<!ENTITY USAGE-MAINWINDOW SYSTEM "usage-mainwindow.sgml">
-<!ENTITY USAGE-MAIL SYSTEM "usage-mail.sgml">
-<!ENTITY USAGE-CONTACT SYSTEM "usage-contact.sgml">
-<!ENTITY USAGE-CALENDAR SYSTEM "usage-calendar.sgml">
-<!ENTITY USAGE-NOTES SYSTEM "usage-notes.sgml">
-<!ENTITY USAGE-SYNC SYSTEM "usage-sync.sgml">
-<!ENTITY CONFIG-SETUPASSIST SYSTEM "config-setupassist.sgml">
-<!ENTITY CONFIG-PREFS SYSTEM "config-prefs.sgml">
-<!ENTITY CONFIG-SYNC SYSTEM "config-sync.sgml">
-<!ENTITY APX-GLOSS SYSTEM "apx-gloss.sgml">
-<!ENTITY APX-BUGS SYSTEM "apx-bugs.sgml">
-<!ENTITY APX-AUTHORS SYSTEM "apx-authors.sgml">
-<!ENTITY APX-FDL SYSTEM "apx-fdl.sgml">
-<!ENTITY APX-GPL SYSTEM "apx-gpl.sgml">
-
-]>
-
-
-<!-- Almost every chapter is an entity. Files, Chapter id's, and entity names correspond. APX is for appendix. -->
-<book id="index">
- <bookinfo>
- <title>A User's Guide to Evolution</title>
- <authorgroup>
- <author><firstname>Aaron</firstname><surname>Weber</surname></author>
- <author><firstname>Kevin</firstname><surname>Breit</surname></author>
- </authorgroup>
- <copyright>
- <year>2000</year>
- <holder>Helix Code, Inc., </holder>
- <holder>Kevin Breit</holder>
- </copyright>
-
- <legalnotice>
- <para>
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the <citetitle>GNU Free
- Documentation License</citetitle>, (FDL) 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.
- </para>
- <para>
- The software described by this document falls under the
- <citetitle>GNU General Public License</citetitle>, or GPL.
- </para>
- <para>
- The licenses are included with this document in <xref
- linkend="fdl">, and <xref linkend="gpl">; you may also obtain
- a copy 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>
-
- <releaseinfo>
- This is version 0.4 of the Evolution manual, describing version
- 0.3.1 of Evolution.
- </releaseinfo>
-
- </bookinfo>
-
- &PREFACE;
-
- <part id="usage">
- <title>Using Evolution</title>
- <partintro>
- <para>
- Part one of the <application>Evolution</application> manual
- describes how to use <application>Evolution</application>
- for email, contact management, and appointment and task
- scheduling. You'll find as you go along that, as with most of
- Linux, there's more than one way to do things, and you can
- pick whichever method you like best.
- </para>
- </partintro>
-
- &USAGE-MAINWINDOW;
- &USAGE-MAIL;
- &USAGE-CONTACT;
- &USAGE-CALENDAR;
- &USAGE-NOTES;
- &USAGE-SYNC;
-
- </part>
- <part id="config">
- <title>Configuring and Managing Evolution</title>
- <partintro>
- <para>
- <application>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 hackers to
- "configure" themselves a working system. When we say
- configurable, we mean that although
- <application>Evolution</application> will work perfectly well
- with minimal setup hassle, you can alter its behavior to fit
- your needs with just a little more work.
- </para>
- </partintro>
-
- &CONFIG-SETUPASSIST;
- &CONFIG-PREFS;
- &CONFIG-SYNC;
- </part>
- &APX-GLOSS;
- &APX-BUGS;
- &APX-AUTHORS;
- &APX-FDL;
- &APX-GPL;
-
-</book>
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/C/fig/calendar.png b/doc/C/fig/calendar.png
deleted file mode 100644
index 47354813a2..0000000000
--- a/doc/C/fig/calendar.png
+++ /dev/null
Binary files differ
diff --git a/doc/C/fig/config-cal.png b/doc/C/fig/config-cal.png
deleted file mode 100644
index e124196279..0000000000
--- a/doc/C/fig/config-cal.png
+++ /dev/null
Binary files differ
diff --git a/doc/C/fig/config-mail.png b/doc/C/fig/config-mail.png
deleted file mode 100644
index ef270858f7..0000000000
--- a/doc/C/fig/config-mail.png
+++ /dev/null
Binary files differ
diff --git a/doc/C/fig/contact.png b/doc/C/fig/contact.png
deleted file mode 100644
index 1610e278a4..0000000000
--- a/doc/C/fig/contact.png
+++ /dev/null
Binary files differ
diff --git a/doc/C/fig/filter-new-fig.png b/doc/C/fig/filter-new-fig.png
deleted file mode 100644
index 4c612ce5fc..0000000000
--- a/doc/C/fig/filter-new-fig.png
+++ /dev/null
Binary files differ
diff --git a/doc/C/fig/mail-druid-pic.png b/doc/C/fig/mail-druid-pic.png
deleted file mode 100644
index f29f3e77be..0000000000
--- a/doc/C/fig/mail-druid-pic.png
+++ /dev/null
Binary files differ
diff --git a/doc/C/fig/mainwindow-pic.png b/doc/C/fig/mainwindow-pic.png
deleted file mode 100644
index 0ff712efa5..0000000000
--- a/doc/C/fig/mainwindow-pic.png
+++ /dev/null
Binary files differ
diff --git a/doc/C/fig/vfolder-createrule-fig.png b/doc/C/fig/vfolder-createrule-fig.png
deleted file mode 100644
index 571a487ba4..0000000000
--- a/doc/C/fig/vfolder-createrule-fig.png
+++ /dev/null
Binary files differ
diff --git a/doc/C/preface.sgml b/doc/C/preface.sgml
deleted file mode 100644
index bb6cb4d948..0000000000
--- a/doc/C/preface.sgml
+++ /dev/null
@@ -1,174 +0,0 @@
-<!-- <!DOCTYPE preface PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN"> -->
- <preface id="introduction">
-<!-- =============Introduction ============================= -->
- <title>Introduction</title>
-
- <section id="what">
- <title> What is Evolution, and What Can It Do for Me?</title>
- <para>
- The word "evolution" means "a process of improvement and
- development." The GNOME application
- <application>Evolution</application> is meant to be a more
- evolved <glossterm>groupware</glossterm> program, and an
- integral part of the Internet-connected desktop.
- </para>
- <para>
- As part of the GNOME project,
- <application>Evolution</application> is free software. The
- program and its source code are released under the terms of
- the GNU Public License (GPL), and the documentation falls
- under the Free Documentation License (FDL), which is included
- with this document (<xref linkend="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>
- <note>
- <title>This is a preview release</title>
- <para>
- Please help develop <application>Evolution</application>
- by submitting bug reports when you find bugs. You can do
- so by using the <application>Bug Report
- Tool</application> (known as <command>bug-buddy</command>
- at the command line).
- </para>
- </note>
- </para>
-
- <para>
- <application>Evolution</application> is a suite of tools to
- help you work in a group. You can use it to send, receive,
- and organize email, manage address and other contact
- information, and maintain a calendar. It enables you to do
- those things on one or several computers, connected directly
- or over a network, for one person or for large groups.
- <application>Evolution</application> can handle almost all
- your communications tasks with the power and flexibility of
- the GNOME desktop environment.
- </para>
- <para>
- The developers of <application>Evolution</application> had
- four major goals for their project:
-
- <itemizedlist>
- <listitem>
- <para>
- The application must be <emphasis>both powerful and easy
- to use</emphasis>. That means a familiar and intuitive
- interface that users could customize to their liking, and
- the development of shortcuts for complex tasks.
- </para>
- </listitem>
- <listitem>
- <para>
- <application>Evolution</application> must meet and
- exceed the standards set by other groupware products.
- It must include support for most major network protocols
- so that it can integrate seamlessly with existing
- hardware and network environments.
- </para>
- </listitem>
- <listitem>
- <para>
- The project must support open standards and protocols
- to turn <application>Evolution</application> into an
- advanced development platform. From the simplest
- scripting to the most complex network and component
- programming, <application>Evolution</application>
- needed to offer developers an environment for
- cutting-edge application development.
- </para>
- </listitem>
- <listitem>
- <para>
- Data must be safe: <application>Evolution</application>
- must not lose mail or corrupt mailbox files. It will
- not execute scripts, automatically forward a virus to
- your entire contacts list, or delete files from your
- hard disk.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- <application>Evolution</application> is designed to make most
- 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>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">vFolders</link>, which
- let you save searches as though they were ordinary mail
- folders.
- </para>
-
- </section>
-
- <section id="aboutbook">
- <title>About This Book</title>
- <!-- ************** FOLLOWING PARAGRAPH FOR DRAFT ONLY ************* -->
- <para>
- This version of the <application>Evolution</application>
- User's Guide is a <emphasis>draft</emphasis>. It is missing
- huge chunks of information, and many of the features it
- describes are unimplemented. All the content is subject to
- change, especially if you help. Please send comments on the
- guide to <email>aaron@helixcode.com</email>. If you would like
- to work on the guide please contact me or see the GNOME
- Documentation project <ulink
- url="http://www.gnome.org/gdp">web site</ulink>. This
- paragraph will be removed in later versions of the manual.
- </para>
- <!-- ************* END DRAFT ONLY PARAGRAPH ************** -->
-
- <para>
- This book is divided into two sections. The first section is a
- <link linkend="usage">guided tour</link>&mdash; it will
- explain how to use <application>Evolution</application>. If
- you are new to <application>Evolution</application> or to
- groupware in general, this is the section 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>
- <formalpara>
- <title>Typographical conventions</title>
- <para>
- Some kinds of words are marked off with special typography:
- <simplelist>
- <member><application>Applications</application></member>
- <member><command>Commands</command> typed at the command line</member>
- <member><guilabel>Labels</guilabel> for interface items</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>
-
- </simplelist>
- </para>
- </formalpara>
- </section>
- </preface>
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/C/usage-calendar.sgml b/doc/C/usage-calendar.sgml
deleted file mode 100644
index 9ec3b0f60e..0000000000
--- a/doc/C/usage-calendar.sgml
+++ /dev/null
@@ -1,356 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<chapter id="usage-calendar">
- <title>The Evolution 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 grey and white ruled background. At the upper
- right, there's a monthly calendar you can use to switch days.
- Below that, there's a <guilabel>TaskPad</guilabel>, where you can
- keep a sort of glorified to-do list that's not linked to your
- calendar. The calendar's daily view is shown in <xref
- linkend="usage-calendar-fig">.
-
- <!-- ============== Figure ============================= -->
- <figure id="usage-calendar-fig">
- <title>Evolution Calendar View</title>
- <screenshot>
- <screeninfo>Evolution Contact Manager Window</screeninfo>
- <graphic fileref="fig/calendar" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
- <!-- ============== End of Figure ============================= -->
-
- </para>
- <sect1 id ="usage-calendar-view">
- <title>Ways of Looking at your Calendar</title>
-
- <para>
- You can view your calendar by the day, by the week, by the
- month, or by the year; press the calendar-shaped buttons on the
- right side of the toolbar to switch between views.
- </para>
- <para>
- To view yesterday's appointments, (last week's, if you're in
- the weekly view, and last month's for the monthly view), click
- the <guibutton>Pref</guibutton> button. For tomorrow, next week,
- or next month, click <guibutton>Next</guibutton>, and of course,
- click <guibutton>Today</guibutton> for today.
- </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>
-
-
-<!-- ############### FIXME FIXME FIXME ############
-Feature not yet implemented, and may not be implemented due to
-lack of time, resources, and interest.
- <para>
- In addition, <application>Evolution</application> supports
- Hebrew, Muslim, and other calendar formats. To switch to a
- different calendar format, choose
- <guimenuitem>GUIMENUITEM</guimenuitem> from the
- <guimenu>GUIMENU</guimenu>.
- </para>
-################ END FIXME AREA ################## -->
-
- </sect1>
- <sect1 id="usage-calendar-apts">
- <title>Scheduling With the Evolution Calendar</title>
- <para>
- The <application>Evolution</application> calendar allows you to
- schedule events for yourself or a group of people. It can
- handle events that repeat, event lengths from ten minutes to
- multiple days, and events that have a date but no specific
- time. Of course, you can also set event reminders and alarms
- so that you don't forget about everything you've just put into
- your calendar. Basically, it can handle almost any schedule you
- throw at it.
- </para>
- <sect2 id="usage-calendar-apts-basic">
- <title>Creating events</title>
- <para>
- To create a new calendar event, select
- <menuchoice>
- <guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Appointment</guimenuitem>
- </menuchoice>
- or click the <guibutton>New</guibutton> button on the left end
- of the toolbar. The <interface>New Appointment</interface>
- dialog will pop up with the usual menu bar, tool bar, and
- window full of choices for you.
- </para>
- <para>
- Your event 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>. For the purposes of the calendar, an
- <guilabel>All day event</guilabel> begins at ten in the
- morning, runs until eleven at night, and is displayed at the
- top of a day's event list rather than inside it. That makes
- it easy to have events that overlap and fit inside each other.
- For example, a conference might be an all day event, and the
- meetings at the conference would be timed events. Events with
- starting and ending times can also overlap, however, and when
- they do they're displayed as multiple columns in the day view
- of the calendar.
- </para>
- <note>
- <title>Doing Two Things At Once</title>
- <para>
- If you create two calendar events that overlap,
- <application>Evolution</application> will display them as
- multiple columns in the calendar window. If you manage to
- do both things at once, I'd like to meet you.
- </para>
- </note>
- <para>
- You can have as many as four different
- <guilabel>Alarms</guilabel>, any time prior to the event
- you've scheduled. You can have one alarm of each type:
- <variablelist>
- <varlistentry>
- <term><guilabel>Display</guilabel></term>
- <listitem>
- <para>
- A window will pop up on your screen to remind you of
- your event.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Audio</guilabel></term>
- <listitem>
- <para>
- Choose this to have your deliver a sound alarm.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Program</guilabel></term>
- <listitem>
- <para>
- Select this if you would like some additional application
- to run as a reminder. You can enter its name in the
- text field, or find it with the
- <guibutton>Browse</guibutton> button.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Mail</guilabel></term>
- <listitem>
- <para>
- <application>Evolution</application> will send an
- email reminder to the address you enter into the text
- field.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- </para>
- <para>
- <guilabel>Classification</guilabel> is a little more
- complicated, and only applies to calendars on a
- network. <guilabel>Public</guilabel> is the default category,
- and a public event can be viewed by anyone on the calendar
- sharing network. <guilabel>Private</guilabel> denotes one
- level of security, and <guilabel>Confidential</guilabel> a
- higer level. <!-- FIXME --> Exact determinations and implementations of
- this feature have yet to be determined. <!-- FIXME -->
- </para>
- <para>
- The <guilabel>Recurrence</guilabel> tab lets you describe
- repetition in events ranging from once every day up to once
- every 100 years. You can then choose a time when repetition
- will stop, and, under <guilabel>Exceptions</guilabel>, pick
- individual days when the event will <emphasis>not</emphasis>
- recur.
- </para>
-
- <para>
- Once you're done with all those settings, click on the disk
- icon in the toolbar. That will save the event and close the
- event editor window. If you want, you can alter an event
- summary in the calendar view by clicking on it and typing. You
- can change other settings by right-clicking on the event in
- the and then choosing <guimenuitem>Edit this Appointment</guimenuitem>.
- </para>
- </sect2>
-
-<!-- ############UNIMPLEMENTED FEATURES ###################
-
- <sect2 id="usage-calendar-apts-group">
- <title>Appointments for Groups</title>
- <para>
- If you have your calendar set up to work with other
- calendars over a network, you can see when others are
- available to meet with you.
- </para>
- <note>
- <title>Unimplemented Feature</title>
- <para>This feature is not yet implemented.</para>
- </note>
-
- <para>
- In addition, 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 event</interface> window. Then describe
- the event as you would any other. Before you click
- <guibutton>OK</guibutton>, (INSERT DESCRIPTION HERE...).
- <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 event on your calendar and on
- theirs as tentative, rather than a confirmed, event.
- </para>
- <para>
- To mark a tentative event as confirmed, click once on the
- event in the <interface>calendar view</interface> to select
- it, and then choose <guimenuitem>Event
- Properties</guimenuitem> from the <guimenu>Settings</guimenu>
- menu. In the <interface>Event Properties</interface> dialog
- window, click the "tentative" button to deselect the
- event.
- </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 events. Tasks are colored and sorted by priority and
- due-date (see <xref linkend="config-prefs"> for more
- information), and are included with calendar data during
- synchronization with a hand-held device.
- </para>
- <para>
- To record a new task, click the <guibutton>Add</guibutton>
- button below the list. <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>Priority:</guilabel></term>
- <listitem>
- <para>
- Select a level of importance from 1 (most important) to 9
- (least important).
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term> <guilabel>Item Comments:</guilabel></term>
- <listitem>
- <para>
- If you wish, you can keep a more detailed description of
- the item here.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <para>
- Once you've added a task to your to-do list, its summary
- appears in the <guilabel>Summary</guilabel> section of the
- calendar window. To view or edit a detailed description of an
- item, double-click on it, or select it and click
- <guibutton>Edit</guibutton>. You can delete items by selecting
- them and clicking on the <guibutton>Delete</guibutton> button.
- </para>
- </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>
- Keelyn has one calendar for her own schedule. Next to that
- she maintains one for the conference room, so people know when
- they can schedule meetings. On the local network, she
- maintains a calendar that reflects when consultants are going
- to be on site, and another that keeps track of when the Red
- Sox are playing.
- </para>
- </example>
- <para>
- To create a new calendar, select
- <menuchoice>
- <guimenu>File</guimenu> <guisubmenu>New</guisubmenu>
- <guimenuitem>Calendar</guimenuitem>
- </menuchoice>.
-
- You can place the calendar in any calendar folder and access it
- from the folder view. Alarms, configuration, and display for
- each calendar are seperate from each other.
- </para>
-
- </sect1>
-</chapter>
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/C/usage-contact.sgml b/doc/C/usage-contact.sgml
deleted file mode 100644
index 4f9b9fd058..0000000000
--- a/doc/C/usage-contact.sgml
+++ /dev/null
@@ -1,504 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<chapter id="usage-contact">
- <title>The Evolution Contact Manager</title>
- <abstract>
- <para>
- The <application>Evolution</application> contact manager can
- handle all of the functions of an address book, phone book, or
- Rolodex. Of course, it's a lot easier to update
- <application>Evolution</application> than it is to change an
- actual paper book. <application>Evolution</application> also
- allows easy synchronization with hand-held and remote devices.
- Since <application>Evolution</application> supports most major
- network protocols, including <glossterm>LDAP</glossterm>, it can
- fit into almost any existing network.
- </para>
- <para>
- Another advantage of the <application>Evolution</application>
- address book is its integration with the rest of the
- application. That means that when you look for someone's
- address, you can also see a history of appointments with that
- person. Or, you can get an e-mail with contact information in
- it and create a new address card on the spot. In addition,
- searches and folders and all work in the same way they do in the
- other components, so you don't have to learn another system for
- similar tasks.
- </para>
- <para>
- This chapter will cover using the
- <application>Evolution</application> contact manager 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 contact manager, see <xref
- linkend="config-prefs-contact">.
- </para>
- </abstract>
- <sect1 id="usage-contact-basic">
- <title>Getting Started With the Contact Manager</title>
-
- <para>
- To open up your address book, click on
- <guibutton>Contacts</guibutton> in the shortcut bar. The
- contact manager is illustrated in <xref
- linkend="usage-contact-fig">. By default, the contact manager
- shows all your cards in alphabetical order, in a
- <glossterm>minicard</glossterm> format. You can select other
- views from the <guimenu>View</guimenu> menu, and adjust the
- width of the colums by clicking and dragging the grey column
- dividers.
- </para>
-
-
- <figure id="usage-contact-fig">
- <title>Evolution Contact Manager</title>
- <screenshot>
- <screeninfo>Evolution Contact Manager Window</screeninfo>
- <graphic fileref="fig/contact" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
-
- <para>
- The toolbar for the address book is quite simple:
- <itemizedlist>
- <listitem><para>
- Press <guibutton>New</guibutton> for a new contact.
- </para></listitem>
-
- <listitem><para>
- <guibutton>Find</guibutton> brings up an in-depth search window.
- </para></listitem>
-
- <listitem><para>
- Press <guibutton>Print</guibutton> to print one or more cards.
- </para></listitem>
- <listitem><para>
- <guibutton>Delete</guibutton> deletes a selected card.
- </para></listitem>
- </itemizedlist>
- </para>
- <para>
- The last feature is <guilabel>Quick Search</guilabel>; to use
- it, just type in the name of the person you're looking for and
- hit <keycap>Enter</keycap>.
- <application>Evolution</application> will search through all
- the cards to find one that matches.
- </para>
- <para>
- If there are no matches, the card display will be blank. To
- display <emphasis>all</emphasis> of your contacts, you can
- leave the <guilabel>Quick Search</guilabel> field blank, and
- press enter.
- </para>
- <para>
- The rest of the contact manager is taken up by the display of
- your cards. You can view it as a table or as a list of
- cards&mdash; switch between them in the <guimenu>View</guimenu>
- menu &mdash; and move through them alphabetically alphanumeric
- buttons and the scrollbar at the right of the window.
- </para>
- </sect1>
- <sect1 id="usage-contact-cards">
- <title>Destroy, Create, or Change Cards</title>
-
- <para>
- To delete a card, click on it once to select it, then press the
- <guibutton>Delete Card</guibutton> button. If you have
- multiple cards selected, you'll delete mutliple cards.
- </para>
- <para>
- Adding or changing cards is slightly more complicated. Any
- time you add information to the contact manager, whether it's
- an old card you're editing or a new card you're just adding to
- your address book, you'll use the contact editor. To change a
- card that already exists, just double click it to open the
- contact editor window with all the current information already
- filled in. If you want to create a new one, clicking the
- <guibutton>New Card</guibutton> button will open up that same
- window, but with empty fields instead of full ones. Either
- way, it's the same tool for quite similar tasks, and you'll
- find that it's pretty flexible and can store quite a lot more
- than you'd think would fit onto a file card.
- </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 full
- menu bar, which is still evolving rapidly. <!-- FIXME -->
- </para>
-
- <figure id="usage-contact-editor-fig">
- <title>Evolution Contact Editor</title>
- <screenshot>
- <screeninfo>Evolution Contact Editor</screeninfo>
- <graphic fileref="fig/contact-new" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
-
- <para> The <guilabel>General</guilabel> tab contains no less
- than seven sections, each with an icon: a face, for name and
- company; a telephone for phone numbers; an envelope for email
- address; a house for postal address; a file folder for
- contacts, and a briefcase for categories. You can guess what
- sort of information belongs in fields like <guilabel>Job
- Title</guilabel> and <guilabel>Web page address</guilabel>,
- but there are several parts of the window that are a little
- more interesting.
- </para>
- <para>
- The <guilabel>Categories</guilabel> feature is discussed in
- <xref linkend="usage-contact-organize">, but the remaining
- features are described here:
- <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>
- The person's first, or given, name.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Middle: </guilabel></term>
- <listitem> <para>
- The middle name or initial, if any, goes here.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Last: </guilabel></term>
- <listitem> <para>
- The last name (surname) belongs here.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Suffix: </guilabel></term>
- <listitem> <para>
- Suffixes such as "Jr." or "III" can go here.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </para>
- </listitem>
- <listitem>
- <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:
- <userinput>Eva Lucianne Tester</userinput>.
- You'll notice that the <guilabel>File
- As</guilabel> field also fills up, but in reverse:
- <computeroutput>Tester, Lucianne</computeroutput>.
- You can pick <computeroutput>Eva
- Tester</computeroutput> from the drop-down, or
- type in your own, such as <userinput>Lucianne
- Tester, Eva</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 Eva's information under "F" for
- "Fictitious Helix Code Employees"
- </para>
- </tip>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Multiple Values for Fields</term>
- <listitem>
- <para>
- If you click on the small arrow 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
- remember them all. The arrow buttons next to the
- telephone and postal address fields work in the same
- way.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
-<!--- ############# This section isn't implemented yet either:
- <sect2>
- <title></title>
- <para>
- <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. While looking at a calendar appointment,
- right-click any email address, and choose
- <guimenuitem>Create Card for this Address</guimenuitem>.
- (NOTE that feature may change! unimplemented!)
- </para>
- </tip>
- </para>
- <para>
- You can move cards around just as you would move email
- messages: dragging and dropping works, as does right-clicking
- and choosing <guimenuitem>Move</guimenuitem> from the menu
- that appears.
- </para>
- </sect2>
-############### SHORTCUT SECTION COMMENTED OUT FOR NOW -->
-
- </sect1>
-
- <sect1 id="usage-contact-organize">
- <title>Organizing your Contact Manager</title>
- <para>
- Organizing your contact manager is a lot like organizing your
- mail. You can have folders and searches the same way you can
- with mail, but the contact manager does not allow vFolders. It
- does, however, allow each card to fall under several
- categories, and allow you to create your own categories.
- Categories are discussed <xref
- linkend="usage-contact-organize-group-category">.
- </para>
-
-<!--
- <para>
- Another useful UNIMPLEMENTED
- <application>Evolution</application> feature is its ability to
- recognize when people live or work together. If several people
- in your contact manager 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 that mail folders do. For more
- flexibility, you can also mark contacts as members of
- different categories.
- </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. Note
- that each card must be in one and only one folder, unless
- you want to have duplicate cards.
- </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. The difference between folders
- and categories is that folders contain cards, but category
- membership is a property of each card. 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>
- <para>
- Then, you can refer to all the cards in that category by:
- FEATURE NOT IMPLEMENTED... FIXME
- </para>
- <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>
-
- <tip id="usage-contact-categories-multiple">
- <title>Another way to use Categories</title>
- <para>
- You can categorize contacts by typing the category
- names into the <guilabel>Categories</guilabel>
- field. You can also create new categories that way:
- just type in a category name, and it counts as a
- category.
- </para>
- </tip>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1 id="usage-contact-sharing">
- <title>Sharing your Cards (and keeping them to yourself)</title>
- <para>
- Cards can be shared over a network. 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
- also share your calendars, 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?
- <application>Evolution</application> lets you decide which
- folders you want to make accessible to others.
- </para>
- <para>
- To begin sharing a folder of address cards, wait until
- <application>Evolution</application> supports this
- feature. <!-- FIXME -->
- </para>
- </sect1>
-
- <sect1 id="usage-contact-automate">
- <title>Contact Manager Tools</title>
- <para>
- The contact manager works with
- <application>Evolution</application> mail and the calendar to
- help you add new address cards quickly. However, it can also
- manage mailing lists. There are more tools planned, and when
- they arrive, <!-- FIXME --> they will be described in this
- section.
- </para>
-
- <sect2 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> also adds cards from a
- hand-held device during HotSync operation. For more
- information about that, see <xref linkend="usage-sync">.
- </para>
- </sect2>
-
- <sect2 id="contact-automation-lists">
- <title>Managing a Mailing list</title>
- <para>
- You already know that when you are writing an email, you can
- address it to one or more people, and that
- <application>Evolution</application> will fill in addresses
- from your contact manager's address cards if you let it. In
- addition to that, you can send email to everyone in a
- particular group.
- </para>
- <!-- FIXME this feature not yet implemented -->
- <para>
- 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 postal mailings.
- </para>
- </sect2>
-<!--
- <sect2 id="usage-contact-automation-extra">
- <title>Map It!</title>
- <para>
- Need a map or directions? Click
- <guibutton>MapIt</guibutton> from within the contact
- manager, and <application>Evolution</application> will
- map the address for you online.
- </para>
- </sect2>
--->
-
- </sect1>
- <sect1 id="usage-contact-menubar">
- <title>Contact Manager Menubar Reference</title>
- <para>
- </para>
- </sect1>
-</chapter>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/C/usage-mail.sgml b/doc/C/usage-mail.sgml
deleted file mode 100644
index de2f3b0a23..0000000000
--- a/doc/C/usage-mail.sgml
+++ /dev/null
@@ -1,1132 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<chapter id="usage-mail">
- <title>Evolution Mail</title>
- <abstract>
- <title> An Overview of the Evolution Mailer</title>
- <para>
- <application>Evolution</application> email is like other email
- programs in all the ways you would hope:
- <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
- supports file attachments.
- </para>
- </listitem>
- <listitem>
- <para>
- It supports multiple mail sources, including IMAP, POP3,
- and local <filename>mbox</filename> files.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- However, <application>Evolution</application> has some important
- differences. First, it's built to handle very large amounts of
- mail without slowing down or crashing. 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 gargantuan mail
- volumes. There's also the <application>Evolution</application>
- <link linkend="usage-mail-organize-vFolders">vFolder</link>, an
- advanced organizational feature not found in other 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 that feature
- especially useful.
- </para>
-
- <para>
- You can start reading email by clicking
- <guibutton>Inbox</guibutton> in the shortcut bar. By
- default, the <interface>Inbox</interface> is open when you
- start <application>Evolution</application>, and the first
- time you see your inbox, there's a message in it from Helix
- Code welcoming you to the application.
- </para>
- </abstract>
-
- <sect1 id="usage-mail-getnsend">
- <title>Reading, Getting and Sending Mail</title>
- <sect2 id="usage-mail-getnsend-read">
- <title>Reading a Message</title>
- <para>
- The first time you open your
- <application>Evolution</application>
- <guilabel>Inbox</guilabel>, you will see a window like the one
- in <xref linkend="usage-mail-intro-fig">, with a message from
- Helix Code in the <interface>message list</interface>. The
- message is displayed below that, in the <interface>view
- pane</interface>. If you find the <interface>view
- pane</interface> too small, you can double-click on the
- message in the <interface>message list</interface> to have it
- open in a new window. As is the case with folders, you can
- right-click on messages in the message list and get a menu of
- possible actions:
- <variablelist>
-
- <varlistentry>
- <term><guimenuitem>View Message</guimenuitem> </term>
- <listitem><para>
- Select this item to view the message in
- the view pane of the <application>Evolution</application>
- window.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Edit Message</guimenuitem></term>
- <listitem><para>
- This item is available only for messages and drafts
- that you have written. Select it to open the message
- composer and make changes to the message.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Print Message</guimenuitem> </term>
- <listitem><para>
- Select this item to print a message.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Reply to Sender</guimenuitem></term>
- <listitem><para>
- Use this item to reply only to the author of the message.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Reply to All</guimenuitem></term>
- <listitem><para>
- Send a reply to the author of the message
- and to all others on the recipient list. See <xref
- linkend="usage-mail-getnsend-send-reply"> for more information.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Forward Message</guimenuitem> </term>
- <listitem><para>
- Send the message on to another person.
- See <xref linkend="usage-mail-getnsend-fwd"> for
- information about how to use the Forward feature.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Delete Message</guimenuitem> </term>
- <listitem><para>
- Mark the message for deletion. Choose <menuchoice>
- <guimenu>Actions</guimenu><guimenuitem>Expunge</guimenuitem>
- </menuchoice> to delete marked messages permanently.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Move Message</guimenuitem> </term>
- <listitem><para>
- Select this item to move the message to another folder.
- This will open a dialog to let you choose the destination
- from a folder tree.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </para>
-
- <para>
- You can also select the order in which messages appear in
- that list. To sort by sender, subject, or date, click on the
- bars with those labels at the top of the message list. If
- you click twice, you'll sort them in reverse order.
- </para>
- <para>
- Aside from sorting the messages, you can opt to have the
- messages threaded. Select <menuchoice>
- <guimenu>View</guimenu> <guimenuitem>Threaded Message
- List</guimenuitem> </menuchoice> to turn the threaded view on
- or off. If the option selected,
- <application>Evolution</application> will attempt to
- associate related messages by using the
- <systemitem>References</systemitem>,
- <systemitem>In-Reply-To</systemitem>, and
- <systemitem>Subject</systemitem> message headers. Messages
- which are related are then placed next to each other, so that
- it's easier to follow the thread of a conversation from
- message to message.
- </para>
- <para>
- Go ahead and click on the message in the <interface>message
- list</interface>. That selects the message. Then click on
- the <guibutton>Delete</guibutton> button in the tool bar. The
- message now has a line through it, because you've marked it
- for deletion. If you really want to get rid of it, choose
- <guimenuitem>Expunge</guimenuitem> from the
- <guimenu>Tools</guimenu> menu. That will delete it
- permanently. If you want to keep it, click
- <guibutton>Delete</guibutton> again, and it will no longer be
- marked as deleted. At some point in the future, this feature
- will change to something a little less counter-intuitive.
- </para>
- <!-- ==============Figure=================================== -->
-
- <figure id="usage-mail-intro-fig">
- <title>Evolution Mail</title>
- <screenshot>
- <screeninfo>Inbox</screeninfo>
- <graphic fileref="fig/mail-pic" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
-<!-- ==============End of Figure============================== -->
-
- </sect2>
-
- <sect2 id="usage-mail-getnsend-get">
- <title>Checking Mail</title>
- <para>
- To check your email, just click <guibutton>Get
- mail</guibutton> in the toolbar. If this is the first time
- you've done so, the <interface>mail setup
- assistant</interface> will ask you for the information it
- needs to check your mail (see <xref
- linkend="config-setupassist"> for more information). If
- you're checking mail over a network (instead of from local
- <filename>mbox</filename> files), you'll need to enter your
- email password. Type it in, click <guibutton>OK</guibutton> and
- <application>Evolution</application> will download your mail.
- New mail will appear in your <interface>Inbox</interface>.
- <!-- FIXME: add mention of Today if Today feature appears -->
- </para>
- <para>
- Once you've entered your password,
- <application>Evolution</application> will hold it in memory so
- that you don't have to retype it every time you want to check
- mail. It will only remember the password until you quit the
- application; each time you run
- <application>Evolution</application>, you need to re-enter
- your password. If you'd like
- <application>Evolution</application> to forget your password
- sooner, select
- <menuchoice><guimenu>Actions</guimenu><guimenuitem>Forget
- Passwords</guimenuitem></menuchoice>, and it will do so
- immediately.
- </para>
- <para>
- If you get an error message instead of mail, you probably
- need to change your network settings. To learn how to
- do that, have a look at <xref
- linkend="config-prefs-mail-network">, or ask your system
- administrator.
- </para>
-
- <sect3 id="usage-mail-getnsend-get-attach">
- <title>Attachments, HTML Mail, and Live Documents</title>
- <para>
- If someone sends you a file attached to an email (an
- "attachment"), <application>Evolution</application> will
- display the file at the bottom of the message to which it's
- attached. Text, HTML, and most images will be displayed in
- the message itself. For other files,
- <application>Evolution</application> will provide a link and
- icon at the end of the message. Click on that, and
- <application>Evolution</application> will ask you where you
- want to put the file. Once you've chosen a location and
- saved the file, you can open, move, copy, or execute it just
- like any other, using <application>Nautilus</application> or
- your favorite shell or file manager.
- </para>
-
- <para>
- <application>Evolution</application> can also display
- HTML-formatted mail, complete with graphics. HTML
- formatting will display automatically, although you can
- turn it off if you prefer.
- </para>
-
-<!-- ######## Feature will probably not be implemented ******
- <para>
- It can also display <glossterm>live
- documents</glossterm>, which have scripted or
- executable contents&mdash; for example, a working
- spreadsheet page or a chess game.
- </para>
-
--->
-
- </sect3>
- </sect2>
-
- <sect2 id="usage-mail-getnsend-send">
- <title>Writing and Sending Mail</title>
- <para>
- You can start writing a new email message by selecting
- <menuchoice> <guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu> <guimenuitem>
- Mail</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>
- <graphic fileref="fig/newmsg-pic" format="png" srccredit="Kevin Breit">
- </graphic>
- </screenshot>
- </figure>
-<!-- ==============End of Figure=================================== -->
-
- <!-- Check the alignment of the following paragraph in the PS and
- HTML output: it's indented for no good reason -->
- <para>
- Enter an address in the <guilabel>To:</guilabel> field, a
- subject in the <guilabel>Subject:</guilabel> and a message in
- the big empty box at the bottom of the window, and press
- <guibutton>Send</guibutton>. That's easy. It may even be
- too easy, which is why I like to queue my messages up to be
- sent a few minutes later.
-
- <tip id="usage-mail-getnsend-send-attach-tip">
- <title>Send Now, Send Later</title>
- <para>
- Evolution will send mail immediately unless you tell it to
- do otherwise by selecting <guimenuitem>Send
- Later</guimenuitem> from the <guimenu>MENU</guimenu> in
- the message composition window. Then, when you press
- <guibutton>Send</guibutton>, all your unsent messages will
- go out at once. I like to use "Send Later" because it
- gives me a chance to change my mind about a message before
- it goes out. That way, I don't send anything I'll regret
- the next day.
- </para>
- <para>
- To learn more about how you can specify message queue
- and filter behavior, see <xref linkend="config-prefs-mail">.
- </para>
- </tip>
- </para>
-
- <para>
- You can probably guess the purpose of the buttons labelled
- <guilabel>Cut</guilabel>, <guilabel>Copy</guilabel>,
- <guilabel>Paste</guilabel> and <guilabel>Undo</guilabel>, but
- there's a bit more to sending mail that's less obvious. In
- the next few sections, you'll see how
- <application>Evolution</application> handles additional
- features, including mailing lists, attachments, and
- forwarding.
- </para>
-
-
- <sect3 id="usage-mail-getnsend-send-to">
- <title>Choosing Recipients</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 complete
- the address for you. <!-- (INSERT description of UI for this
- feature, once it is decided upon). --> 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.
- </para>
- <para>
- Alternately, you can click on the
- <guibutton>To:</guibutton>, <guibutton>Cc:</guibutton>, or
- <guibutton>Bcc:</guibutton> buttons to get a list of email
- addresses. Click the check-boxes next to the addresses, then
- click <guibutton>OK</guibutton>, and the address will be
- added to the appropriate form field.
- </para>
- <para>
- For more information about using email together with the
- contact manager and the calendar, see <xref
- linkend="usage-contact-automate"> and <xref
- linkend="usage-calendar-apts">.
- </para>
-
- <sect4 id="usage-mail-getnsend-send-to-mult">
- <title>Multiple Recipients</title>
- <para>
- In addition, you can mark recipients in three different
- ways. The <guilabel>To:</guilabel> field is for the
- primary recipients of the message you are going to send.
- However, it is considered bad form to have more than a few
- email addresses in this section.
- </para>
- <para>
- If you're writing to one person, but want to keep a third
- party up to date, you can use <guilabel>Cc:</guilabel>.
- 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.
- <example>
- <title>Using the Cc: field</title>
- <para>
- When Susan sends an email to a client, she puts her
- co-worker, Tim, in the in the
- <guilabel>Cc:</guilabel> field, so that he know
- what's going on. The client can see that Tim also
- received the message, and knows that he can talk to
- Tim about the message as well.
- </para>
- </example>
- </para>
- <para>
- If you have a large number of recipients, or if you want
- to send mail to several people without sharing the
- recipient list, you should use
- <guilabel>Bcc:</guilabel>. "Bcc" stands for "Blind Carbon
- Copy", and means that people you put in the
- <guilabel>Bcc:</guilabel> field get the message, but
- nobody else sees their email address. They will still see
- the list of addresses from the <guilabel>To:</guilabel>
- and <guilabel>Cc:</guilabel> fields, though.
-
- <example id="ex-mail-bcc">
- <title>Using the Bcc: field</title>
- <para>
- Tim is sending an email announcement to all of his
- company's clients, some of whom are in competition
- with each other, and all of whom value their
- privacy. He needs to use the
- <guilabel>Bcc:</guilabel> field here. If he puts
- every address from his address book's "Clients"
- category into the <guilabel>To:</guilabel> or
- <guilabel>Cc:</guilabel> fields, he'll make the
- company's <emphasis>entire</emphasis> client list
- public. Don't assume it won't happen to you!
- </para>
- </example>
- </para>
- </sect4>
- </sect3>
-
- <sect3 id="usage-mail-getnsend-send-reply">
- <title>Replying to Messages</title>
- <para>
- In order to reply to a message, click on it once in the
- message list to select it. Then press the
- <guibutton>Reply</guibutton> button. A window like the
- <interface>New Message</interface> window will appear, but
- the subject will already be present&mdash; the same subject
- as the message to which you are replying, but with Re:
- before it, to mark it as a reply. In addition, the full
- text of the previous message is inserted into the new
- message, either in italics (for HTML display) or with the
- &gt; character (in plain text mode) before each line. This
- indicates quoting. You can intersperse your message with
- the quoted material as shown in <xref
- linkend="usage-mail-getnsend-reply-fig">
-
-<!-- note that this figure should have a reply mail ready to send,
-with quoted materials and the relevant replies interspersed-->
- <!-- ==============Figure=================================== -->
- <figure id="usage-mail-getnsend-reply-fig">
- <title>Reply Message Window</title>
- <screenshot>
- <screeninfo>Evolution Main Window</screeninfo>
- <graphic fileref="fig/replymsg" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
-<!-- ==============End of Figure=================================== -->
- </para>
-
- <para>
- If a message has several recipients, as in the case of
- mailing lists or messages that have been carbon copied, you
- may wish to click <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. But be careful, and always make sure you
- know who is getting a message: it could be a mailing list
- with thousands of subscribers.
- <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 to all of
- them, 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>.
- </para>
- </example>
- </para>
- </sect3>
-
- <sect3 id="usage-mail-getnsend-send-html">
- <title>Embellish your email with HTML</title>
- <para>
- You can't normally use text treatments or pictures in
- emails, which is why you've probably seen people use
- asterisks for emphasis or use
- <glossterm>emoticons</glossterm> to convey their
- feelings. However, most of the newer email programs can
- include and display images and text treatments as well as
- basic alignment and paragraph formatting.
- </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. <emphasis>Some</emphasis>
- people refer to HTML mail as "the root of all evil" and
- get very angry if you send them HTML mail, which is why
- <application>Evolution</application> sends plain text
- unless you explicitly ask for HTML. To send HTML mail,
- you will need to select <menuchoice> <guimenuitem>
- HTML</guimenuitem></menuchoice> in the mail settings dialog box. See
- <xref linkend="config-prefs-mail-other"> for more information.
- </para>
- <para>
- If you format a message with HTML, but do not have
- <guilabel>Send Messages as HTML</guilabel> enabled in your
- mail settings, the composer will remove your text styles.
- It will, however, preserve indentation and lists. The
- same is true for individuals in your address book whom you
- have not marked as wanting to receive HTML mail.
- </para>
- </note>
- <para>
- HTML formatting tools are located just above the
- composition frame, and in the <guimenu>Insert</guimenu> and
- <guimenu>Format</guimenu> menus. Your message text will
- appear formatted in the composer window, and the message
- will be sent as HTML.
- </para>
- <para>
- The icons in the toolbar are explained in tool-tips, 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>
- Choose <guilabel>Normal</guilabel> for a default
- text style, or <guilabel>Header 1</guilabel> through
- <guilabel>Header 6</guilabel> for varying sizes of
- header. You can also select
- <guilabel>pre</guilabel> for preformatted text
- blocks, and three types of <guilabel>List
- Item</guilabel>.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Text style</term>
- <listitem>
- <para>
- <itemizedlist mark="none">
- <listitem><para><guibutton>B</guibutton> is for bold text</para></listitem>
- <listitem><para><guibutton>I</guibutton> for italics</para></listitem>
- <listitem><para><guibutton>U</guibutton> to underline</para></listitem>
- <listitem><para><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 left-justified,
- the center button, centered, and the right hand
- button, right-justified.
- </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>
- </variablelist>
- </para>
- <para>
- There are three tools that you can find only in the
- <guimenu>Insert</guimenu> menu.
- <variablelist>
- <varlistentry>
- <term><guimenuitem>Insert Link</guimenuitem>:</term>
- <listitem>
- <para>
- Use this tool to
- put hyperlinks in your HTML messages. When you
- select it, <application>Evolution</application> will
- prompt you for the <guilabel>Text</guilabel> that
- will appear, and the <guilabel>Link</guilabel>, where
- you should enter the actual web address (URL).
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term> <guimenuitem>Insert Image</guimenuitem>:</term>
- <listitem>
- <para>
- <guimenuitem>Insert Image</guimenuitem>: Select this item to
- embed an image into your email, as was done in the welcome
- message. Images will appear at the location of the
- cursor.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guimenuitem>Insert Rule</guimenuitem>:</term>
- <listitem><para>
- This will insert a horizontal line, or rule, into your document.
- You'll be presented with a dialog box which gives you
- the choice of size, percentage of screen, shading, and
- alignment; if you leave everything at the default
- values you'll get a thin black rule all the way across
- the screen.</para></listitem>
- </varlistentry>
-
- </variablelist>
- </para>
- <note>
- <title>A Technical note on HTML Tags</title>
- <para>
- The composer is a WYSIWYG (What You See Is What You Get)
- editor for HTML. That means that if you enter HTML
- directly into the composer&mdash; say, <markup
- role="html">&lt;B&gt;Bold Text&lt;/B&gt</markup>, the
- the composer will assume you meant exactly that string
- of characters, and not "make this text bold," as an HTML
- composition tool or text editor would.
- </para>
- </note>
- </sect3>
- <sect3 id="usage-mail-getnsend-send-attach">
- <title>Attachments</title>
- <para>
- If you want to attach a file to your email message, you
- can drag it from your desktop into the message window, or
- click the button in the toolbar with a paper clip on it,
- labelled <guibutton>Attach</guibutton>. If you click the
- <guibutton>Attach</guibutton> button,
- <application>Evolution</application> will open a file
- selection dialog box, to ask you which file you want to
- send. Select the file and click <guilabel>OK</guilabel>.
- </para>
- <para>
- When you send the message, a copy of the file will
- go with it. Be aware that big attachments can take a long
- time to download.
- </para>
- </sect3>
-
-<!-- Function not implemented,
-possibly never will be due to security evil. -->
-<!--
- <sect3 id="usage-mail-getnsend-send-live">
- <title>Live Documents</title>
- <para>
- Later versions of <application>Evolution</application>
- will allow you to enliven your email with almost any
- sort of document, and even with entire
- applications. At this point, however, this feature has not
- yet been implemented.
- </para>
- </sect3>
--->
-
- <sect3 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 mail when you get a letter 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>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>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>
- </sect3>
- <sect3 id="usage-mail-getnsend-ettiquette">
- <title>Seven Tips for Email Usage</title>
- <para>
- I started with ten, but four were "Don't send
- <glossterm>spam</glossterm>."
- <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 email
- quotation symbols (&gt;) indicating multiple layers
- of careless inline 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>
- ALL CAPS MEANS YOU'RE SHOUTING!
- </para>
- </listitem>
-
- <listitem>
- <para>
- Never write anything in email you wouldn't say in
- public. Old messages have a nasty habit of
- resurfacing when you least expect.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Check your spelling and use complete sentences.
- </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>
- </itemizedlist>
- </para>
- <para> Happy mailing! </para>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1 id="usage-mail-organize">
- <title>Organizing Your Mail</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>Evolution</application> has the tools
- to help you do it.
- </para>
-
- <sect2 id="usage-mail-organize-folders">
- <title>Getting Organized with Folders</title>
- <para>
- <application>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>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 create a filter with the <interface>filter
- assistant</interface>, you can have mail moved to your folder
- automatically.
- </para>
- </sect2>
-
- <sect2 id="usage-mail-organize-search">
- <title>Searching for Messages</title>
- <para>
- Most mail clients can search through your messages for you,
- but <application>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>
-
- Then, press <keycap>Enter</keycap>.
- <application>Evolution</application> will show your search
- results in the message list.
-
- </para>
- </sect2>
-
- <sect2 id="usage-mail-organize-filters">
- <title>Staying organized: Mail Filters in Evolution</title>
- <para>
- Filters sort your email for you as it arrives. Most often,
- you'll want to have <application>Evolution</application> put
- mail into different folders, but you can have it do anything
- you like. People who subscribe to multiple mailing lists, or
- who often need to refer to messages they have sent, find
- filters especially helpful to separate personal from
- list-related mail, but they're good for anybody who gets more
- than a few messages a day. To create a filter, select
- <menuchoice>
- <guimenu>Tools</guimenu> <guimenuitem>Filter
- Assistant</guimenuitem> </menuchoice>. This will bring up a
- window which will guide you through filter creation. The
- <interface>filter assistant</interface> is shown in <xref
- linkend="usage-mail-filters-fig-new">
-
- <figure id="usage-mail-filters-fig-new">
- <title>Creating a new Filter</title>
- <screenshot>
- <screeninfo>Creating a new Filter</screeninfo>
- <graphic fileref="fig/filter-new-fig" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
-
- </para>
-
- <para> The <interface>filter assistant</interface> window
- contains a window listing rules, and an option to create a
- new rule. To start filtering your mail, click
- <guibutton>Add</guibutton> to add a filtering rule.
- You'll decide when it should take place:
- <itemizedlist>
- <listitem>
- <para>
- <guilabel>When mail arrives:</guilabel> Select
- this option to have messages filtered as they
- arrive.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>When mail is sent:</guilabel> Select
- this option to filter your outgoing mail. You
- can use this feature to keep your
- <interface>Outbox</interface> as organized as
- your <interface>Inbox</interface>.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-
- <para>
- Then, the filter assistant will ask you which emails it should
- act upon. You can set criteria based on message size, the
- sender, primary addressee or Cc: list, words in the subject or
- body of the message, or any combination of criteria. Check the
- boxes next to each criterion you would like to use.
- </para>
- <para>
- Once you've decided which messages to filter, the assistant
- will ask you the sort of action you wish to take. You can
- file, delete, or forward the message, and you can also have it
- be exempted from other filters which would otherwise have
- acted upon it.
- </para>
-
- <note>
- <title>Two Notable Filter Features</title>
- <para>
- <itemizedlist>
- <listitem><para>Any incoming email that does not meet
- filter action criteria remains in the Inbox. </para>
- </listitem>
-
- <listitem><para>If you move a folder, your filters
- will follow it. </para></listitem>
- </itemizedlist>
- </para>
- </note>
- </sect2>
-
-
-
- <sect2 id="usage-mail-organize-vFolders">
- <title>Getting Really Organized with Virtual Folders</title>
- <para>
- If filters aren't flexible enough for you, or you find
- yourself performing the same search again and again, consider
- a virtual folder. Virtual folders, or vFolders, are an
- advanced way of viewing your email messages within
- <application>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. Once you've set it up, you'll be
- able to open it and read the messages in it as though it were
- a normal mail folder. It's not a folder, though, because when
- you open a vFolder, <application>Evolution</application>
- performs a search for you. It's not a regular search, though,
- because you can build a vFolder with a very complicated set of
- criteria with multiple inclusions and exclusions, as though
- you were setting up a filter.
- </para>
-
-<!-- potentially useful, but doesn't fit at the moment:
- <para>
- An important difference between a folder and a virtual folder
- is that a conventional folder actually contains messages, but
- a vFolder is a view of messages that may be in several
- different folders. This means that while a message may fall
- into several vFolders, it can be in only one conventional
- folder. Also, it means that you cannot remove a message from
- a vFolder unless you delete it, and you cannot add a message
- to a vFolder unless you change the vFolder's search criteria.
- </para>
--->
-
- <para>
- As messages that meet the vFolder criteria arrive or are
- deleted, <application>Evolution</application> will
- automatically place them in and 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 include it.
- </para>
- <para>
- That's pretty complicated, but it can be useful. For example,
- if I have a folder for all the email from one person, and
- another folder for all the email on a given topic, I
- <emphasis>feel</emphasis> organized. But when the person
- sends me mail about the topic, my whole email filing universe
- becomes chaotic, and I need vFolders to save the day for me.
- </para>
- <para>
- That sounds silly, but 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>
-
- <example id="usage-mail-organize-vFolders-ex">
- <title>Using Folders, Searches, and vFolders</title>
- <para>
- To organize my mail box, I can set up a vFolder for emails
- from my friend Vince. Then, whenever I want to see the
- messages Vince has sent me, I open the vFolder, and every
- message he's sent me shows up, no matter where I've
- actually filed it. If I want, I can also create a vFolder
- containing any message from my list of co-workers which
- also has the name of the project in it. That way, when
- Vince sends me mail about the project, I can see that
- message both in the "Vince" vFolder and in the "Project"
- vFolder. That's because when I open up the "Vince" folder,
- I'm really performing a search for all the mail from Vince,
- and when I open the "Project" folder I'm really performing
- a search for all the mail about the project.
-
- <!-- (INSERT SCREENSHOT HERE: vFolders in action) -->
-
- </para>
- </example>
- <para>
- To create a vFolder, select <guimenuitem>VFolder
- Assistant</guimenuitem> from the <guimenu>Tools</guimenu>
- menu in the <interface>main window</interface>. This
- will bring up a dialog box that looks suspiciously like
- the Filter Assistant (for more information on filters, see
- <xref linkend="usage-mail-organize-filters">), and which
- presents you with a list of vFolders you have previously
- created. If you have already created vFolders, you can
- click on them in the frame labelled <guilabel>Select Rule
- Type</guilabel>, and edit or remove them. If you have
- not created any, there will be only one available option:
- click <guibutton>Add</guibutton> to add a new vFolder.
- </para>
- <para>
- You'll be prompted to create a filtering rule. You can build
- your own from the ground up, or select one of several base
- rules to customize. Your options are:
- <variablelist>
- <varlistentry>
- <term><guilabel>For matching messages:</guilabel></term>
- <listitem>
- <para>
- Choose this to create your own set of rules for the
- vFolder. You may select one or more search criteria;
- the vFolder you create will contain messages that
- match all of them.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Messages from a certain person:</guilabel></term>
- <listitem>
- <para>
- The remaining three rules are simpler. Select this
- one to create a vFolder that will contain only
- messages from an address you enter.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Messages to a certain address:</guilabel</term>
- <listitem>
- <para>
- Any messages sent directly to this address will be in
- the vFolder you create. This vFolder is an absolute
- must for people with multiple email addresses.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Messages with a given subject:</guilabel></term>
- <listitem>
- <para>
- Enter a subject, and the vFolder will contain messages
- with that subject.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- The selection window is shown in <xref
- linkend="usage-mail-vfolder-fig-createrule">
-
- <figure id="usage-mail-vfolder-fig-createrule">
- <title>Selecting a vFolder Rule</title>
- <screenshot>
- <screeninfo>Selecting a vFolder Rule</screeninfo>
- <graphic fileref="fig/vfolder-createrule-fig" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
- </para>
- <para>
-
- Once you click <guibutton>Next</guibutton>, you'll customize
- the vFolder rule. The rules for the vFolder you're creating
- will appear as phrases in the bottom pane of the window. You
- can click on the blue underlined text in the phrase to alter
- it to your liking. For example, when I create a vFolder to
- contain all messages from <email>rupert@helixcode.com</email>
- that have the word "evolution" in the message body, the bottom
- frame says: <computeroutput>The From address matches
- rupert@helixcode.com and the body contains
- "evolution".</computeroutput>.
- </para>
- </sect2>
-
- </sect1>
-</chapter>
diff --git a/doc/C/usage-mainwindow.sgml b/doc/C/usage-mainwindow.sgml
deleted file mode 100644
index 8a71f2d4f2..0000000000
--- a/doc/C/usage-mainwindow.sgml
+++ /dev/null
@@ -1,420 +0,0 @@
-<!--
- <!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-<chapter id="usage-mainwindow">
-
- <title>The Main Window: Evolution Basics</title>
- <para>
- Start <application>Evolution</application> by selecting
- <guimenuitem>Evolution</guimenuitem> from the
- <guisubmenu>Applications</guisubmenu> of the <guimenu>Main Panel
- Menu</guimenu>, or by typing <command>evolution</command> at the
- command-line. The first time you run the program, it will create
- a directory called <filename>evolution</filename> in your home
- directory, where it will keep all your
- <application>Evolution</application>-related files.
- </para>
- <para>
- After <application>Evolution</application> starts
- up, you will see the <interface>main window</interface>, with the
- <interface>Inbox</interface> open. It should look a lot like the
- picture in <xref linkend="usage-mainwindow-fig">. On the left of
- the <interface>main window</interface> is the <interface>shortcut
- bar</interface>, with several buttons in it. Just underneath the
- title bar is a series of menus in the <interface>menu
- bar</interface>, and below that, the <interface>tool
- bar</interface> with buttons for different functions. The largest
- part of the <interface>main window</interface> is taken up by the
- actual <interface>Inbox</interface>, where messages are listed
- and displayed. If you're running the program for the first time,
- you'll have just one message: a welcome from Helix Code.
-
-
-<!-- ==============Figure=================================== -->
- <figure id="usage-mainwindow-fig">
- <title>Evolution Main Window and Inbox</title>
- <screenshot>
- <screeninfo>Evolution Main Window</screeninfo>
- <graphic fileref="fig/mainwindow-pic" format="png" srccredit="Kevin Breit">
- </graphic>
- </screenshot>
- </figure>
-<!-- ==============End of Figure=================================== -->
-</para>
-
- <para>
- <note>
- <title>The Way Evolution Looks</title>
- <para>
- The appearance of both <application>Evolution</application>
- and <application>GNOME</application> is very easy to
- customize, so your screen might not look like this picture.
- You might configure <application>Evolution</application> to
- start with a different view, without the <interface>shortcut
- bar</interface>, or with the <link
- linkend="usage-mainwindow-folderbar">folder bar</link>
- instead.
- </para>
- </note>
- </para>
-
- <sect1 id="usage-mainwindow-shortcutbar">
- <title>The Shortcut Bar</title>
- <para>
- <application>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 category buttons.
- </para>
- <para>
- The category buttons are <guibutton>Evolution
- Shortcuts</guibutton> and <guibutton>Internet
- Directories</guibutton>. When you click on them, they'll slide
- up and down to give you access to different sorts of shortcuts.
- When you first start <application>Evolution</application>, you
- are looking at the <guilabel>Evolution Shortcuts</guilabel>
- category. If you click <guilabel>Internet
- Directories</guilabel>, it will slide up and you'll see buttons
- for the <guilabel>Bigfoot</guilabel> and
- <guilabel>Netcenter</guilabel> directories, as well as any
- others you or your system administrator might have added.
- Internet directories behave a lot like the local contact
- manager, which is covered in <xref linkend="usage-contact">.
- </para>
- <para>
- Take a look at the <guilabel>Evolution Shortcuts</guilabel>
- again. They are:
-
- <variablelist>
-
-<!-- NOT IMPLEMENTED!
- <varlistentry>
- <term> <guibutton>Today:</guibutton></term>
- <listitem>
- <para>
- This will bring up a summary of any new messages you've
- received, along with the tasks and appointments you have
- lined up for today.
- </para>
- </listitem>
- </varlistentry>
--->
-
- <varlistentry>
- <term> <guibutton>Inbox:</guibutton></term>
- <listitem>
- <para>
- The Inbox will show you all of your email. Your Inbox
- is also where you can access 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 To do 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>Contacts:</guibutton></term>
- <listitem>
- <para>
- The Contact Manager holds your addresses, phone numbers,
- and contact 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>
- <listitem>
- <para>
- The <guibutton>Tasks:</guibutton> tool combines a "to
- do" list with reminders to help you keep track of
- daily events.
- </para>
- </listitem>
- </varlistentry>
--->
- <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>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>
- <para>
- If you prefer to use a keyboard shortcut, or <glossterm>hot
- key</glossterm>, you can use those instead. They're shown next
- to their equivalent menu items in the menu bar. You can also set
- your own hot keys for functions that don't have any; this is
- covered in <xref linkend="config">. If you're using the
- keyboard shortcuts you may also want to hide the
- <interface>shortcut bar</interface> by selecting
- <menuchoice> <guimenu>View</guimenu> <guimenuitem>Show Shortcut
- Bar</guimenuitem> </menuchoice>.
- </para>
-
- <tip>
- <title>Two Shortcut Bar Tricks</title>
- <para>
- To remove a shortcut from the shortcut bar, right-click on it
- and select <guimenuitem>Remove</guimenuitem>. </para>
- <para>
- To change the way the shortcut bar looks, right-click in an
- empoy space on the shortcut bar. From the menu that appears,
- you can select icon sizes.
- </para>
- </tip>
- </sect1>
-
- <sect1 id="usage-mainwindow-folderbar">
- <title>The Folder Bar</title>
- <para>
- The <interface>folder bar</interface> is a more comprehensive
- way to view the information you've stored with
- <application>Evolution</application>. It displays all your
- appointments, address cards, and email in a tree that's a lot
- like a <glossterm>file tree</glossterm>&mdash; it starts small
- at the top, and branches downwards. On most computers, there
- will be three folders at the base. The first one is
- <guilabel>VFolders</guilabel>, for virtual folders (discussed in
- <xref linkend="usage-mail-organize-vfolders">. The next one is
- <guilabel>External Directories</guilabel>, for contact
- directories stored on a network. The most important one is
- probably <guilabel>Local</guilabel>, which you can use to access
- all the data that's stored on your computer. If you click on
- the plus sign plus sign next to the <guilabel>Local</guilabel>
- folder, you'll see the contents:
- <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>Directories</guilabel>, for Internet contact directories.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Inbox</guilabel>, for incoming mail.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Outbox</guilabel>, which is for drafts of
- messages and mail that's already been sent.
- </para>
- </listitem>
- </itemizedlist>
-
- </para>
-
- <para>
- To create a new folder, select <menuchoice>
- <guimenu>File</guimenu> <guisubmenu>New</guisubmenu>
- <guimenuitem>Folder</guimenuitem></menuchoice>. You'll be asked where you want to
- put it, and what kind of folder it should be. You can choose
- from three types: <guilabel>Mail</guilabel>, for storing mail,
- <guilabel>Calendar</guilabel> for storing calendars, and
- <guilabel>Contacts</guilabel> for storing contacts.
- </para>
-
- <note>
- <title>Folders Have Limits</title>
- <para>
- You can always place a folder inside other folders,
- regardless of folder type. However, calendars,
- contacts, and mail can't go into the same
- folder. Calendars have to 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 GNOME, and <application>Evolution</application> is no
- exception. If you right-click on a folder, you'll have a
- menu with the following options:
- <itemizedlist>
- <listitem><para><guimenuitem>View</guimenuitem>, to view a message.</para></listitem>
- <listitem><para><guimenuitem>Something else</guimenuitem>, for another purpose. </para></listitem>
- <listitem><para><guimenuitem>Something else</guimenuitem>, for another purpose. </para></listitem>
- </itemizedlist>.
- </para>
-
- <tip>
- <title>Context-Sensitive Help</title>
- <para>
- GNOME 2.0 supports context-sensitive help, which means you can
- almost always get help on an item by right-clicking it. If
- you're not sure what something is, or don't know what you can
- do with it, choosing <guimenuitem>Help</guimenuitem> from the
- right-click menu is a good way to find out.
- </para>
- </tip>
-
- <para>
- Any time new information arrives in a folder, that folder label
- is displayed as bold text.
- </para>
- <para>
- To delete a folder, right-click it and select
- <guimenuitem>Delete</guimenuitem> from the menu that pops up.
- To change the order of folders, or put one inside another, use
- <glossterm>drag-and-drop</glossterm>. To move individual
- messages, appointments, and address cards between folders, you
- can do the same thing: drag them where you want them, and
- they'll go.
- </para>
- </sect1>
- <sect1 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. That means that, depending on the context, menu bar items
- will change. If you're looking at your Inbox, most of the menu
- items will relate to mail; some will relate to other components
- of <application>Evolution</application> and some, especially
- those in the <guimenu>File Menu</guimenu> will relate to the
- application as a whole. This section describes those items that
- cover the application as a whole; items specific to mailer are
- discussed in the mail chapter, calendar items in the calendar
- chapter, and so forth.
- </para>
- <para>
- <variablelist>
- <varlistentry>
- <term> <guimenu>File</guimenu> Menu</term>
-
- <listitem><para>
- Anything related to a file falls under this
- menu:
- <itemizedlist>
- <listitem><para>
- <guisubmenu>New... &mdash; </guisubmenu> If you
- want to create a new folder, calendar,
- appointment, address card, or message, this is
- where you should look.
- </para></listitem>
-
- <listitem><para>
- <guimenuitem>Go to Folder &mdash; </guimenuitem>
- Select this item, then choose which folder you'd
- like to view.
- </para></listitem>
- <listitem><para>
- <guimenuitem>Exit &mdash; </guimenuitem> Quits the application.
- </para></listitem>
-
- <listitem><para>
- <guimenuitem>Print... &mdash; </guimenuitem> Opens the printing
- dialog box so you can print items from the view pane of
- <application>Evolution</application>.
- </para></listitem>
- </itemizedlist>
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Edit</guimenu> Menu </term>
- <listitem><para>
- Although it doesn't contain anything at first,
- the <guimenu>Edit</guimenu> menu fills up with
- useful editing tools when you're... editing.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Tools</guimenu> Menu </term>
- <listitem><para> All of your assistants and configuration
- tools go here. For the <interface>Inbox</interface>, that
- means things like <guimenuitem>Mail
- Configuration</guimenuitem> and the <guimenuitem>vFolder
- Editor</guimenuitem>. For the
- <interface>Calendar</interface> and the <interface>Contact
- Manager</interface> </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Actions</guimenu> Menu </term>
- <listitem><para>
- This menu contains a list of actions you can perform on
- the information you've stored with
- <application>Evolution</application>. The contents vary
- depending on the view, but for the
- <interface>Inbox</interface>, it contains items like
- <guimenuitem>Mark All Messages Read</guimenuitem> and
- <guimenuitem>Expunge</guimenuitem>, to erase all the
- messages you've marked for deletion.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Help</guimenu> Menu</term>
- <listitem><para>
- Select among these items to open the
- <application>Help Browser</application> to the appropriate section.
- </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'lql
- start with your email inbox: you've got a letter waiting for you
- already.
- </para>
- </sect1>
-</chapter>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/C/usage-notes.sgml b/doc/C/usage-notes.sgml
deleted file mode 100644
index a4161da810..0000000000
--- a/doc/C/usage-notes.sgml
+++ /dev/null
@@ -1,41 +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 notes.
- Even now, notes are an almost necessary part of our lives. It
- only makes sense that <application> Evolution</application> has
- a Notes feature. <application>Evolution</application> can help
- you take notes in the following ways:
- <itemizedlist>
- <listitem>
- <para>
- You can take down phone numbers, take school notes, take phone
- messages, or even write poetry.
- </para>
- </listitem>
- <listitem>
- <para>
- You can color code each note to help cateogrize each note into
- a topic.
- </para>
- </listitem>
- <listitem>
- <para>
- Something
- </para>
- </listitem>
- <listitem>
- <para>
- Something
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- You can start writing notes by clicking <guibutton>Notes</guibutton> in the
- shortcut bar.
- </para>
- </abstract>
-</chapter>
diff --git a/doc/C/usage-sync.sgml b/doc/C/usage-sync.sgml
deleted file mode 100644
index 07325e1848..0000000000
--- a/doc/C/usage-sync.sgml
+++ /dev/null
@@ -1,22 +0,0 @@
-
- <chapter id="usage-sync">
- <title>Synchronizing with a Hand-held Device</title>
- <para>
- Once you've set up a synchronization system, it pretty much
- takes care of itself. Not only that, it's entirely possible
- that your system administrator has set it up for you. All
- that this chapter covers is how to use that system once it's
- installed and configured. If you need to set it up, consult
- <xref linkend="config-sync">.
- </para>
-
- <para>
- If you've already got Gnome-pilot set up to use
- <application>Evolution</application>, put
- your hand-held device on the cradle and press the HotSync
- button.
- </para>
- <para>
- No, really. That's all there is to it.
- </para>
- </chapter> \ No newline at end of file
diff --git a/doc/Camel-Classes b/doc/Camel-Classes
deleted file mode 100644
index 93aec087dd..0000000000
--- a/doc/Camel-Classes
+++ /dev/null
@@ -1,35 +0,0 @@
-CamelException
-CamelProvider
-CamelThreadProxy
-CamelURL
-GtkObject
- + CamelObject
- + CamelAddress
- | + CamelInternetAddress
- | ` CamelNewsAddress
- + CamelDataWrapper
- | + CamelMedium
- | | ` CamelMimePart
- | | ` CamelMimeMessage
- | ` CamelMultipart
- + CamelFolder
- | ` CamelFolderPtProxy
- + CamelFolderSearch
- + CamelFolderSummary
- + CamelMimeFilter
- | + CamelMimeFilterBasic
- | + CamelMimeFilterCharset
- | + CamelMimeFilterIndex
- | ` CamelMimeFilterSave
- + CamelService
- | + CamelStore
- | ` CamelTransport
- + CamelSession
- + CamelStream
- | + CamelSeekableStream
- | | + CamelSeekableSubstream
- | | + CamelStreamFs
- | | ` CamelStreamMem
- | + CamelStreamBuffer
- | ` CamelStreamFilter
- ` CamelThreadProxy \ No newline at end of file
diff --git a/doc/ChangeLog b/doc/ChangeLog
deleted file mode 100644
index 9aedca8af0..0000000000
--- a/doc/ChangeLog
+++ /dev/null
@@ -1,329 +0,0 @@
-2000-08-09 Aaron Weber <aaron@helixcode.com>
-
- * 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.
-
-
-<<<<<<< ChangeLog
-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.
-
->>>>>>> 1.15
-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.
-
->>>>>>> 1.13
-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.
-
->>>>>>> 1.12
-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/Makefile.am b/doc/Makefile.am
deleted file mode 100644
index 7b5420fee8..0000000000
--- a/doc/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = C devel
diff --git a/doc/devel/.cvsignore b/doc/devel/.cvsignore
deleted file mode 100644
index c24a54fbcc..0000000000
--- a/doc/devel/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-Makefile.in
-html
-evolution-devel-guide.html
diff --git a/doc/devel/ChangeLog b/doc/devel/ChangeLog
deleted file mode 100644
index 7e0c8147ba..0000000000
--- a/doc/devel/ChangeLog
+++ /dev/null
@@ -1,35 +0,0 @@
-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 0d3cec5a1c..0000000000
--- a/doc/devel/Makefile.am
+++ /dev/null
@@ -1,64 +0,0 @@
-SUBDIRS = calendar
-
-# The name of the module.
-DOC_MODULE=evolution-devel-guide
-
-# The top-level SGML file.
-DOC_MAIN_SGML_FILE=evolution-devel-guide.sgml
-
-HTML_DIR=$(datadir)/gnome/html
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-evolution_devel_guidedir = $(HTML_DIR)
-evolution_devel_guide_DATA = \
- evolution-devel-guide.html
-
-content_files = \
- evolution-devel-guide.sgml
-
-EXTRA_DIST = \
- $(evolution_devel_guide_DATA) \
- $(content_files)
-
-if ENABLE_GTK_DOC
-evolution-devel-guide.html: html/book1.html
- -cd $(srcdir) && cp html/book1.html evolution-devel-guide.html
-else
-evolution-devel-guide.html:
-endif
-
-html/book1.html: $(content-files)
- $(MAKE) html
-
-html:
- test -d $(srcdir)/html || mkdir $(srcdir)/html
- -cd $(srcdir)/html && gtkdoc-mkhtml $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
-
-clean-local:
- rm -f *~ *.bak *.signals *-unused.txt
-
-maintainer-clean-local:
- cd $(srcdir) && rm -rf html
-
-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); \
- echo '-- Fixing Crossreferences' ; \
- gtkdoc-fixxref --module=$(DOC_MODULE) --html-dir=$(HTML_DIR)|| true; \
- fi)
-
-dist-hook:
- mkdir $(distdir)/html
- -cp $(srcdir)/html/*.html $(srcdir)/html/*.css $(distdir)/html
-
-.PHONY: html
diff --git a/doc/devel/calendar/.cvsignore b/doc/devel/calendar/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/doc/devel/calendar/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/doc/devel/calendar/Makefile.am b/doc/devel/calendar/Makefile.am
deleted file mode 100644
index 2220e1d59b..0000000000
--- a/doc/devel/calendar/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-SUBDIRS = cal-client cal-util
-
-EXTRA_DIST = \
- architecture.sgml \
- evolution-calendar.sgml \
- reference.sgml
diff --git a/doc/devel/calendar/architecture.sgml b/doc/devel/calendar/architecture.sgml
deleted file mode 100644
index 08e4c82b35..0000000000
--- a/doc/devel/calendar/architecture.sgml
+++ /dev/null
@@ -1,94 +0,0 @@
- <chapter id="calendar-architecture">
- <title>Architecture of the Calendar</title>
-
- <para>
- This chapter gives an overview of the Evolution Calendar
- architecture. It describes the model/view split of the calendar
- into a personal calendar server, or PCS, and the GUI clients
- that appear inside the Evolution shell.
- </para>
-
- <!-- Model/View Separation -->
-
- <sect1 id="calendar-model-view">
- <title>Model/View Separation</title>
-
- <para>
- Like other base components in Evolution, the calendar
- separates the data model from the views or clients. This is
- done so that multiple clients can access the same calendar
- data in an orderly fashion and without clashes. For example,
- the user may be running a graphical calendar client. If he
- then wants to synchronize his calendar with a handheld device,
- then the corresponding synchronization program (e.g. a conduit
- for the <application>gnome-pilot</application> package) will
- also need to access the calendar storage. It is important
- that both the GUI client and the synchronization program keep
- a consistent view of the calendar at all times, otherwise one
- of them will be left in an inconsistent state if the
- calendar's data changes unexpectedly.
- </para>
-
- <para>
- Evolution puts the calendar storage in a daemon called the
- Wombat and completely separates it from clients who wants to
- access calendar data. This part of the Wombat is called the
- personal calendar server, or &PCS;. Clients must contact the
- &PCS; and ask it to open an existing calendar or create a new
- one. When a calendar component object (e.g. an appointment or
- to-do item) changes in the &PCS; it will notify all the
- clients that are using the component's parent calendar.
- </para>
- </sect1>
-
- <!-- Personal Calendar Server -->
-
- <sect1>
- <title>Personal Calendar Server</title>
-
- <para>
- The personal calendar server, or &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>
-
- </para>
- </formalpara>
- </sect1>
- </chapter>
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../evolution-devel-guide.sgml" "book" "part" "")
-End:
--->
diff --git a/doc/devel/calendar/cal-client/.cvsignore b/doc/devel/calendar/cal-client/.cvsignore
deleted file mode 100644
index 0842a93f7a..0000000000
--- a/doc/devel/calendar/cal-client/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-sgml
-Makefile
-Makefile.in
diff --git a/doc/devel/calendar/cal-client/Makefile.am b/doc/devel/calendar/cal-client/Makefile.am
deleted file mode 100644
index 44d43639a8..0000000000
--- a/doc/devel/calendar/cal-client/Makefile.am
+++ /dev/null
@@ -1,76 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-# The name of the module.
-DOC_MODULE=evolution-cal-client
-
-# The top-level SGML file.
-DOC_MAIN_SGML_FILE=evolution-cal-client.sgml
-
-# The directory containing the source code (if it contains documentation).
-DOC_SOURCE_DIR=$(EVOLUTION_DIR)/calendar/cal-client
-
-CFLAGS =" \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I$(top_builddir)/libical/src/libical \
- -I$(top_srcdir)/libical/src/libical \
- $(BONOBO_VFS_GNOME_CFLAGS) \
- "
-
-LDFLAGS=" \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(top_builddir)/calendar/cal-client/.libs/libcal-client.a \
- $(top_builddir)/calendar/cal-util/.libs/libcal-util.a \
- $(top_builddir)/libical/src/libical/libical.a \
- $(top_builddir)/libversit/.libs/libversit.al \
- "
-
-HTML_DIR=$(datadir)/gnome/html
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-tmpl_sources = \
- tmpl/cal-client.sgml \
- tmpl/evolution-cal-client-unused.sgml
-
-evolution_cal_client_docdir = $(HTML_DIR)
-evolution_cal_client_doc_DATA = \
- evolution-cal-client.hierarchy \
- evolution-cal-client.types \
- evolution-cal-client-decl.txt \
- evolution-cal-client-sections.txt
-
-EXTRA_DIST = \
- $(evolution_cal_client_doc_DATA)
-
-sgml/evolution-cal-client-doc.bottom: $(tmpl_sources)
- $(MAKE) sgml
-
-scan:
- -(cd $(srcdir) \
- && env CFLAGS=$(CFLAGS) LDFLAGS=$(LDFLAGS) \
- gtkdoc-scanobj --module=$(DOC_MODULE) \
- && gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="cal-listener.h evolution-calendar.h" )
-
-templates: scan
- cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE)
-
-sgml:
- cd $(srcdir) \
- && gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR)
-
-clean-local:
- rm -f *~ *.bak *.signals *-unused.txt
-
-maintainer-clean-local: clean
- cd $(srcdir) && rm -rf sgml $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
-
-dist-hook:
- mkdir $(distdir)/sgml
- mkdir $(distdir)/tmpl
- -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
- -cp $(srcdir)/sgml/*.sgml $(distdir)/sgml
- -cp $(srcdir)/sgml/*.bottom $(srcdir)/sgml/*.top $(distdir)/sgml
-
-.PHONY : sgml templates scan
diff --git a/doc/devel/calendar/cal-client/evolution-cal-client-decl.txt b/doc/devel/calendar/cal-client/evolution-cal-client-decl.txt
deleted file mode 100644
index 0574d70678..0000000000
--- a/doc/devel/calendar/cal-client/evolution-cal-client-decl.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-<MACRO>
-<NAME>CAL_CLIENT_TYPE</NAME>
-#define CAL_CLIENT_TYPE (cal_client_get_type ())
-</MACRO>
-<MACRO>
-<NAME>CAL_CLIENT</NAME>
-#define CAL_CLIENT(obj) (GTK_CHECK_CAST ((obj), CAL_CLIENT_TYPE, CalClient))
-</MACRO>
-<MACRO>
-<NAME>CAL_CLIENT_CLASS</NAME>
-#define CAL_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_CLIENT_TYPE, CalClientClass))
-</MACRO>
-<MACRO>
-<NAME>IS_CAL_CLIENT</NAME>
-#define IS_CAL_CLIENT(obj) (GTK_CHECK_TYPE ((obj), CAL_CLIENT_TYPE))
-</MACRO>
-<MACRO>
-<NAME>IS_CAL_CLIENT_CLASS</NAME>
-#define IS_CAL_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_CLIENT_TYPE))
-</MACRO>
-<STRUCT>
-<NAME>CalClient</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalClientClass</NAME>
-</STRUCT>
-<ENUM>
-<NAME>CalClientLoadStatus</NAME>
-typedef enum {
- CAL_CLIENT_LOAD_SUCCESS,
- CAL_CLIENT_LOAD_ERROR,
- CAL_CLIENT_LOAD_IN_USE,
- CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED
-} CalClientLoadStatus;
-</ENUM>
-<ENUM>
-<NAME>CalClientGetStatus</NAME>
-typedef enum {
- CAL_CLIENT_GET_SUCCESS,
- CAL_CLIENT_GET_NOT_FOUND,
- CAL_CLIENT_GET_SYNTAX_ERROR
-} CalClientGetStatus;
-</ENUM>
-<STRUCT>
-<NAME>CalClient</NAME>
-struct CalClient {
- GtkObject object;
-
- /* Private data */
- gpointer priv;
-};
-</STRUCT>
-<FUNCTION>
-<NAME>cal_client_get_type</NAME>
-<RETURNS>GtkType </RETURNS>
-void
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_construct</NAME>
-<RETURNS>CalClient *</RETURNS>
-CalClient *client
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_new</NAME>
-<RETURNS>CalClient *</RETURNS>
-void
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_load_calendar</NAME>
-<RETURNS>gboolean </RETURNS>
-CalClient *client, const char *str_uri
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_create_calendar</NAME>
-<RETURNS>gboolean </RETURNS>
-CalClient *client, const char *str_uri
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_n_objects</NAME>
-<RETURNS>int </RETURNS>
-CalClient *client, CalObjType type
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_object</NAME>
-<RETURNS>CalClientGetStatus </RETURNS>
-CalClient *client,const char *uid,CalComponent **comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_uid_by_pilot_id</NAME>
-<RETURNS>CalClientGetStatus </RETURNS>
-CalClient *client,unsigned long pilot_id,char **uid
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_update_pilot_id</NAME>
-<RETURNS>void </RETURNS>
-CalClient *client, char *uid,unsigned long pilot_id,unsigned long pilot_status
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_uids</NAME>
-<RETURNS>GList *</RETURNS>
-CalClient *client, CalObjType type
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_objects_in_range</NAME>
-<RETURNS>GList *</RETURNS>
-CalClient *client, CalObjType type,time_t start, time_t end
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_generate_instances</NAME>
-<RETURNS>void </RETURNS>
-CalClient *client, CalObjType type,time_t start, time_t end,CalRecurInstanceFn cb, gpointer cb_data
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_alarms_in_range</NAME>
-<RETURNS>GList *</RETURNS>
-CalClient *client, time_t start, time_t end
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_alarms_for_object</NAME>
-<RETURNS>gboolean </RETURNS>
-CalClient *client, const char *uid,time_t start, time_t end,GList **alarms
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_update_object</NAME>
-<RETURNS>gboolean </RETURNS>
-CalClient *client, CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_remove_object</NAME>
-<RETURNS>gboolean </RETURNS>
-CalClient *client, const char *uid
-</FUNCTION>
diff --git a/doc/devel/calendar/cal-client/evolution-cal-client-sections.txt b/doc/devel/calendar/cal-client/evolution-cal-client-sections.txt
deleted file mode 100644
index c37b223247..0000000000
--- a/doc/devel/calendar/cal-client/evolution-cal-client-sections.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-<INCLUDE>cal-client/cal-client.h</INCLUDE>
-
-<SECTION>
-<FILE>cal-client</FILE>
-CAL_CLIENT
-<TITLE>CalClient</TITLE>
-
-CalClientLoadStatus
-CalClientGetStatus
-cal_client_new
-cal_client_load_calendar
-cal_client_create_calendar
-cal_client_get_n_objects
-cal_client_get_object
-cal_client_get_objects_in_range
-cal_client_generate_instances
-cal_client_get_uid_by_pilot_id
-cal_client_update_pilot_id
-cal_client_get_uids
-cal_client_get_alarms_in_range
-cal_client_get_alarms_for_object
-cal_client_update_object
-cal_client_remove_object
-
-<SUBSECTION Standard>
-
-CAL_CLIENT_TYPE
-IS_CAL_CLIENT
-CAL_CLIENT_CLASS
-IS_CAL_CLIENT_CLASS
-cal_client_get_type
-cal_client_construct
-
-<SUBSECTION Private>
-CalClient
-
-</SECTION>
diff --git a/doc/devel/calendar/cal-client/evolution-cal-client.args b/doc/devel/calendar/cal-client/evolution-cal-client.args
deleted file mode 100644
index e69de29bb2..0000000000
--- a/doc/devel/calendar/cal-client/evolution-cal-client.args
+++ /dev/null
diff --git a/doc/devel/calendar/cal-client/evolution-cal-client.hierarchy b/doc/devel/calendar/cal-client/evolution-cal-client.hierarchy
deleted file mode 100644
index 88efa3e673..0000000000
--- a/doc/devel/calendar/cal-client/evolution-cal-client.hierarchy
+++ /dev/null
@@ -1,2 +0,0 @@
-GtkObject
- CalClient
diff --git a/doc/devel/calendar/cal-client/evolution-cal-client.signals b/doc/devel/calendar/cal-client/evolution-cal-client.signals
deleted file mode 100644
index 97e360b6a2..0000000000
--- a/doc/devel/calendar/cal-client/evolution-cal-client.signals
+++ /dev/null
@@ -1,21 +0,0 @@
-<SIGNAL>
-<NAME>CalClient::cal-loaded</NAME>
-<RETURNS>void</RETURNS>
-CalClient *calclient
-GtkEnum arg1
-</SIGNAL>
-
-<SIGNAL>
-<NAME>CalClient::obj-updated</NAME>
-<RETURNS>void</RETURNS>
-CalClient *calclient
-GtkString arg1
-</SIGNAL>
-
-<SIGNAL>
-<NAME>CalClient::obj-removed</NAME>
-<RETURNS>void</RETURNS>
-CalClient *calclient
-GtkString arg1
-</SIGNAL>
-
diff --git a/doc/devel/calendar/cal-client/evolution-cal-client.types b/doc/devel/calendar/cal-client/evolution-cal-client.types
deleted file mode 100644
index 84d65a6637..0000000000
--- a/doc/devel/calendar/cal-client/evolution-cal-client.types
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <gnome.h>
-#include <cal-client/cal-client.h>
-
-cal_client_get_type
diff --git a/doc/devel/calendar/cal-client/tmpl/cal-client.sgml b/doc/devel/calendar/cal-client/tmpl/cal-client.sgml
deleted file mode 100644
index a146709b8a..0000000000
--- a/doc/devel/calendar/cal-client/tmpl/cal-client.sgml
+++ /dev/null
@@ -1,291 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CalClient
-
-<!-- ##### SECTION Short_Description ##### -->
-GTK+ object for communication with personal calendar server.
-
-<!-- ##### SECTION Long_Description ##### -->
- <para>
- The #CalClient object provides a nice GTK+ wrapper for the CORBA
- interfaces that are used to communicate between calendar clients
- and the personal calendar server in the user's Wombat daemon.
- </para>
-
- <para>
- After a #CalClient object is created with cal_client_new(), it
- should be asked to send a request to the personal calendar server
- to load or create a calendar based on its URI. The server will
- asynchronously notify the client about completion of the request,
- and will return an appropriate result code; this should be noted
- by the client with the <link
- linkend="CalClient--cal-loaded">cal_loaded</link> signal.
- </para>
-
- <para>
- When a client asks the server to update or delete a calendar
- component from the storage, the server will do so and then notify
- all the clients about the update or removal. This is the core of
- the model/view split between calendar clients and the storage in
- the personal calendar server. Clients should watch the <link
- linkend="calclient-obj-updated">obj_updated</link> and <link
- linkend="calclient-obj-removed">obj_removed</link> signals on the
- CalClient objects they create so that they can be notified about
- changes in the storage.
- </para>
-
-<!-- ##### SECTION See_Also ##### -->
- <para>
-
- </para>
-
-<!-- ##### MACRO CAL_CLIENT ##### -->
- <para>
- Casts a #GtkObject to a #CalClient.
- </para>
-
-@obj: A GTK+ object.
-
-
-<!-- ##### ENUM CalClientLoadStatus ##### -->
- <para>
- These values describe the status of a calendar load or create
- request. After asking a calendar factory to load or create a
- calendar, the provided listener will get notification about the
- result in asynchronous fashion. Such notification is represented
- by one of these enumeration values. For values other than
- #CAL_CLIENT_LOAD_SUCCESS, the #CalClient object will not accept
- any other operations on the calendar and it should just be
- destroyed.
- </para>
-
-@CAL_CLIENT_LOAD_SUCCESS: Indicates a successful load or create
- operation; the corresponding calendar is ready for use.
-@CAL_CLIENT_LOAD_ERROR: Indicates an error while loading or creating
- the calendar.
-@CAL_CLIENT_LOAD_IN_USE: Indicates that a create request failed
- because the specified calendar was already being used by another
- client.
-@CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED: Indicates an error due to
- trying to load a calendar for which a backend type is not present.
-
-<!-- ##### ENUM CalClientGetStatus ##### -->
- <para>
- These values describe the result of the cal_client_get_object()
- function.
- </para>
-
-@CAL_CLIENT_GET_SUCCESS: Indicates a successful get operation.
-@CAL_CLIENT_GET_NOT_FOUND: Indicates that the requested object was
- not found.
-@CAL_CLIENT_GET_SYNTAX_ERROR: Indicates a syntax error when parsing
- the requested object. This could indicate a bug in the calendar
- client libraries or in the Wombat server.
-
-<!-- ##### FUNCTION cal_client_new ##### -->
-<para>
-
-</para>
-
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_load_calendar ##### -->
-<para>
-
-</para>
-
-@client:
-@str_uri:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_create_calendar ##### -->
-<para>
-
-</para>
-
-@client:
-@str_uri:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_get_n_objects ##### -->
-<para>
-
-</para>
-
-@client:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_get_object ##### -->
-<para>
-
-</para>
-
-@client:
-@uid:
-@comp:
-@Returns:
-<!-- # Unused Parameters # -->
-@ico:
-
-
-<!-- ##### FUNCTION cal_client_get_objects_in_range ##### -->
-<para>
-
-</para>
-
-@client:
-@type:
-@start:
-@end:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_generate_instances ##### -->
-<para>
-
-</para>
-
-@client:
-@type:
-@start:
-@end:
-@cb:
-@cb_data:
-
-
-<!-- ##### FUNCTION cal_client_get_uid_by_pilot_id ##### -->
-<para>
-
-</para>
-
-@client:
-@pilot_id:
-@uid:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_update_pilot_id ##### -->
-<para>
-
-</para>
-
-@client:
-@uid:
-@pilot_id:
-@pilot_status:
-
-
-<!-- ##### FUNCTION cal_client_get_uids ##### -->
-<para>
-
-</para>
-
-@client:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_get_alarms_in_range ##### -->
-<para>
-
-</para>
-
-@client:
-@start:
-@end:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_get_alarms_for_object ##### -->
-<para>
-
-</para>
-
-@client:
-@uid:
-@start:
-@end:
-@alarms:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_update_object ##### -->
-<para>
-
-</para>
-
-@client:
-@comp:
-@Returns:
-<!-- # Unused Parameters # -->
-@ico:
-
-
-<!-- ##### FUNCTION cal_client_remove_object ##### -->
-<para>
-
-</para>
-
-@client:
-@uid:
-@Returns:
-
-
-<!-- ##### SIGNAL CalClient::cal-loaded ##### -->
- <para>
- This signal is emitted some time after the calendar clients sends
- a load or create request to the personal calendar server. The
- server will notify the client asynchronously of the completion of
- the request. The @status parameter indicates the status of the
- request.
- </para>
-
-@calclient: the object which received the signal.
-@arg1:
-<!-- # Unused Parameters # -->
-@client: Calendar client which received the notification.
-@status: Status of the request. See the description of
- #CalClientLoadStatus for more details.
-
-<!-- ##### SIGNAL CalClient::obj-updated ##### -->
- <para>
- This signal is emitted when the calendar clients receives
- notification of a calendar component's data being changed in the
- personal calendar server. Graphical clients may want to get the
- new version of the object and update their display, for example.
- </para>
-
-@calclient: the object which received the signal.
-@arg1:
-<!-- # Unused Parameters # -->
-@client: Calendar client which received the notification.
-@uid: Unique identifier of the calendar component that changed in the
- personal calendar server's storage.
-
-<!-- ##### SIGNAL CalClient::obj-removed ##### -->
- <para>
- This signal is emitted when the calendar client receives
- notification for a calendar component being removed from the
- storage in the personal calendar server. Graphical clients may
- want to delete the corresponding object from their display, for
- example.
- </para>
-
-@calclient: the object which received the signal.
-@arg1:
-<!-- # Unused Parameters # -->
-@client: Calendar client which received the notification.
-@uid: Unique identifier of the calendar component that was removed
- from the personal calendar server's storage.
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../../../evolution-devel-guide.sgml" "book" "refsect2" "")
-End:
--->
-
diff --git a/doc/devel/calendar/cal-client/tmpl/evolution-cal-client-unused.sgml b/doc/devel/calendar/cal-client/tmpl/evolution-cal-client-unused.sgml
deleted file mode 100644
index 5576dbd57f..0000000000
--- a/doc/devel/calendar/cal-client/tmpl/evolution-cal-client-unused.sgml
+++ /dev/null
@@ -1,10 +0,0 @@
-<!-- ##### FUNCTION cal_client_get_events_in_range ##### -->
-<para>
-
-</para>
-
-@client:
-@start:
-@end:
-@Returns:
-
diff --git a/doc/devel/calendar/cal-util/.cvsignore b/doc/devel/calendar/cal-util/.cvsignore
deleted file mode 100644
index 0842a93f7a..0000000000
--- a/doc/devel/calendar/cal-util/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-sgml
-Makefile
-Makefile.in
diff --git a/doc/devel/calendar/cal-util/Makefile.am b/doc/devel/calendar/cal-util/Makefile.am
deleted file mode 100644
index 8861aa03cb..0000000000
--- a/doc/devel/calendar/cal-util/Makefile.am
+++ /dev/null
@@ -1,75 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-# The name of the module.
-DOC_MODULE=evolution-cal-util
-
-# The top-level SGML file.
-DOC_MAIN_SGML_FILE=evolution-cal-util.sgml
-
-# The directory containing the source code (if it contains documentation).
-DOC_SOURCE_DIR=$(EVOLUTION_DIR)/calendar/cal-util
-
-CFLAGS =" \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I$(top_builddir)/libical/src/libical \
- -I$(top_srcdir)/libical/src/libical \
- $(BONOBO_VFS_GNOME_CFLAGS) \
- "
-
-LDFLAGS=" \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(top_builddir)/calendar/cal-util/.libs/libcal-util.a \
- $(top_builddir)/libical/src/libical/libical.a \
- $(top_builddir)/libversit/.libs/libversit.al \
- "
-
-HTML_DIR=$(datadir)/gnome/html
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-tmpl_sources = \
- tmpl/cal-util.sgml \
- tmpl/evolution-cal-util-unused.sgml
-
-evolution_cal_util_docdir = $(HTML_DIR)
-evolution_cal_util_doc_DATA = \
- evolution-cal-util.hierarchy \
- evolution-cal-util.types \
- evolution-cal-util-decl.txt \
- evolution-cal-util-sections.txt
-
-EXTRA_DIST = \
- $(evolution_cal_util_doc_DATA)
-
-sgml/evolution-cal-util-doc.bottom: $(tmpl_sources)
- $(MAKE) sgml
-
-scan:
- -(cd $(srcdir) \
- && env CFLAGS=$(CFLAGS) LDFLAGS=$(LDFLAGS) \
- gtkdoc-scanobj --module=$(DOC_MODULE) \
- && gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="calobj.h icalendar-save.h icalendar.h" )
-
-templates: scan
- cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE)
-
-sgml:
- cd $(srcdir) \
- && gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR)
-
-clean-local:
- rm -f *~ *.bak *.signals *-unused.txt
-
-maintainer-clean-local: clean
- cd $(srcdir) && rm -rf sgml $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
-
-dist-hook:
- mkdir $(distdir)/sgml
- mkdir $(distdir)/tmpl
- -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
- -cp $(srcdir)/sgml/*.sgml $(distdir)/sgml
- -cp $(srcdir)/sgml/*.bottom $(srcdir)/sgml/*.top $(distdir)/sgml
-
-.PHONY : sgml templates scan
diff --git a/doc/devel/calendar/cal-util/evolution-cal-util-decl.txt b/doc/devel/calendar/cal-util/evolution-cal-util-decl.txt
deleted file mode 100644
index eb108b868f..0000000000
--- a/doc/devel/calendar/cal-util/evolution-cal-util-decl.txt
+++ /dev/null
@@ -1,852 +0,0 @@
-<MACRO>
-<NAME>CAL_COMPONENT_TYPE</NAME>
-#define CAL_COMPONENT_TYPE (cal_component_get_type ())
-</MACRO>
-<MACRO>
-<NAME>CAL_COMPONENT</NAME>
-#define CAL_COMPONENT(obj) (GTK_CHECK_CAST ((obj), CAL_COMPONENT_TYPE, CalComponent))
-</MACRO>
-<MACRO>
-<NAME>CAL_COMPONENT_CLASS</NAME>
-#define CAL_COMPONENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_COMPONENT_TYPE, \
- CalComponentClass))
-</MACRO>
-<MACRO>
-<NAME>IS_CAL_COMPONENT</NAME>
-#define IS_CAL_COMPONENT(obj) (GTK_CHECK_TYPE ((obj), CAL_COMPONENT_TYPE))
-</MACRO>
-<MACRO>
-<NAME>IS_CAL_COMPONENT_CLASS</NAME>
-#define IS_CAL_COMPONENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_COMPONENT_TYPE))
-</MACRO>
-<ENUM>
-<NAME>CalComponentVType</NAME>
-typedef enum {
- CAL_COMPONENT_NO_TYPE,
- CAL_COMPONENT_EVENT,
- CAL_COMPONENT_TODO,
- CAL_COMPONENT_JOURNAL,
- CAL_COMPONENT_FREEBUSY,
- CAL_COMPONENT_TIMEZONE
-} CalComponentVType;
-</ENUM>
-<ENUM>
-<NAME>CalComponentField</NAME>
-typedef enum {
- CAL_COMPONENT_FIELD_CATEGORIES, /* concatenation of the categories list */
- CAL_COMPONENT_FIELD_CLASSIFICATION,
- CAL_COMPONENT_FIELD_COMPLETED,
- CAL_COMPONENT_FIELD_DTEND,
- CAL_COMPONENT_FIELD_DTSTART,
- CAL_COMPONENT_FIELD_DUE,
- CAL_COMPONENT_FIELD_GEO,
- CAL_COMPONENT_FIELD_PERCENT,
- CAL_COMPONENT_FIELD_PRIORITY,
- CAL_COMPONENT_FIELD_SUMMARY,
- CAL_COMPONENT_FIELD_TRANSPARENCY,
- CAL_COMPONENT_FIELD_URL,
- CAL_COMPONENT_FIELD_HAS_ALARMS, /* not a real field */
- CAL_COMPONENT_FIELD_ICON, /* not a real field */
- CAL_COMPONENT_FIELD_COMPLETE, /* not a real field */
- CAL_COMPONENT_FIELD_RECURRING, /* not a real field */
- CAL_COMPONENT_FIELD_OVERDUE, /* not a real field */
- CAL_COMPONENT_FIELD_COLOR, /* not a real field */
- CAL_COMPONENT_FIELD_NUM_FIELDS
-} CalComponentField;
-</ENUM>
-<ENUM>
-<NAME>CalComponentClassification</NAME>
-typedef enum {
- CAL_COMPONENT_CLASS_NONE,
- CAL_COMPONENT_CLASS_PUBLIC,
- CAL_COMPONENT_CLASS_PRIVATE,
- CAL_COMPONENT_CLASS_CONFIDENTIAL,
- CAL_COMPONENT_CLASS_UNKNOWN
-} CalComponentClassification;
-</ENUM>
-<TYPEDEF>
-<NAME>CalComponentDateTime</NAME>
-typedef struct {
- /* Actual date/time value */
- struct icaltimetype *value;
-
- /* Timezone ID */
- const char *tzid;
-} CalComponentDateTime;
-</TYPEDEF>
-<ENUM>
-<NAME>CalComponentPeriodType</NAME>
-typedef enum {
- CAL_COMPONENT_PERIOD_DATETIME,
- CAL_COMPONENT_PERIOD_DURATION
-} CalComponentPeriodType;
-</ENUM>
-<TYPEDEF>
-<NAME>CalComponentPeriod</NAME>
-typedef struct {
- CalComponentPeriodType type;
-
- struct icaltimetype start;
-
- union {
- struct icaltimetype end;
- struct icaldurationtype duration;
- } u;
-} CalComponentPeriod;
-</TYPEDEF>
-<TYPEDEF>
-<NAME>CalComponentText</NAME>
-typedef struct {
- /* Description string */
- const char *value;
-
- /* Alternate representation URI */
- const char *altrep;
-} CalComponentText;
-</TYPEDEF>
-<ENUM>
-<NAME>CalComponentTransparency</NAME>
-typedef enum {
- CAL_COMPONENT_TRANSP_NONE,
- CAL_COMPONENT_TRANSP_TRANSPARENT,
- CAL_COMPONENT_TRANSP_OPAQUE,
- CAL_COMPONENT_TRANSP_UNKNOWN
-} CalComponentTransparency;
-</ENUM>
-<STRUCT>
-<NAME>CalComponentAlarm</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalComponent</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalComponentClass</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalComponentPrivate</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalComponent</NAME>
-struct CalComponent {
- GtkObject object;
-
- /* Private data */
- CalComponentPrivate *priv;
-};
-</STRUCT>
-<FUNCTION>
-<NAME>cal_component_get_type</NAME>
-<RETURNS>GtkType </RETURNS>
-void
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_gen_uid</NAME>
-<RETURNS>char *</RETURNS>
-void
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_new</NAME>
-<RETURNS>CalComponent *</RETURNS>
-void
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_clone</NAME>
-<RETURNS>CalComponent *</RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_new_vtype</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentVType type
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_icalcomponent</NAME>
-<RETURNS>gboolean </RETURNS>
-CalComponent *comp, icalcomponent *icalcomp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_icalcomponent</NAME>
-<RETURNS>icalcomponent *</RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_vtype</NAME>
-<RETURNS>CalComponentVType </RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_as_string</NAME>
-<RETURNS>char *</RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_commit_sequence</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_uid</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, const char **uid
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_uid</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, const char *uid
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_categories_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **categ_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_categories_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *categ_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_classification</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentClassification *classif
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_classification</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentClassification classif
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_comment_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **text_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_comment_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *text_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_completed</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype **t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_completed</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_created</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype **t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_created</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_description_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **text_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_description_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *text_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_dtend</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_dtend</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_dtstamp</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_dtstamp</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_dtstart</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_dtstart</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_due</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_due</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_exdate_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **exdate_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_exdate_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *exdate_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_exrule_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **recur_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_exrule_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *recur_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_geo</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icalgeotype **geo
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_geo</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icalgeotype *geo
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_last_modified</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype **t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_last_modified</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_percent</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int **percent
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_percent</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int *percent
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_priority</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int **priority
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_priority</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int *priority
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_rdate_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **period_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_rdate_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *period_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_has_rdates</NAME>
-<RETURNS>gboolean </RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_rrule_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **recur_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_rrule_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *recur_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_has_rrules</NAME>
-<RETURNS>gboolean </RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_sequence</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int **sequence
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_sequence</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int *sequence
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_summary</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentText *summary
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_summary</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentText *summary
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_transparency</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentTransparency *transp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_transparency</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentTransparency transp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_url</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, const char **url
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_url</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, const char *url
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_pilot_id</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, unsigned long *pilot_id
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_pilot_id</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, unsigned long pilot_id
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_pilot_status</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, unsigned long *pilot_status
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_pilot_status</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, unsigned long pilot_status
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_categories_list</NAME>
-<RETURNS>void </RETURNS>
-GSList *categ_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_datetime</NAME>
-<RETURNS>void </RETURNS>
-CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_exdate_list</NAME>
-<RETURNS>void </RETURNS>
-GSList *exdate_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_geo</NAME>
-<RETURNS>void </RETURNS>
-struct icalgeotype *geo
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_icaltimetype</NAME>
-<RETURNS>void </RETURNS>
-struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_percent</NAME>
-<RETURNS>void </RETURNS>
-int *percent
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_priority</NAME>
-<RETURNS>void </RETURNS>
-int *priority
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_period_list</NAME>
-<RETURNS>void </RETURNS>
-GSList *period_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_recur_list</NAME>
-<RETURNS>void </RETURNS>
-GSList *recur_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_sequence</NAME>
-<RETURNS>void </RETURNS>
-int *sequence
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_text_list</NAME>
-<RETURNS>void </RETURNS>
-GSList *text_list
-</FUNCTION>
-<ENUM>
-<NAME>CalComponentAlarmAction</NAME>
-typedef enum {
- CAL_COMPONENT_ALARM_NONE,
- CAL_COMPONENT_ALARM_AUDIO,
- CAL_COMPONENT_ALARM_DISPLAY,
- CAL_COMPONENT_ALARM_EMAIL,
- CAL_COMPONENT_ALARM_PROCEDURE,
- CAL_COMPONENT_ALARM_UNKNOWN
-} CalComponentAlarmAction;
-</ENUM>
-<ENUM>
-<NAME>CalComponentAlarmTriggerType</NAME>
-typedef enum {
- CAL_COMPONENT_ALARM_TRIGGER_RELATIVE,
- CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE
-} CalComponentAlarmTriggerType;
-</ENUM>
-<ENUM>
-<NAME>CalComponentAlarmTriggerRelated</NAME>
-typedef enum {
- CAL_COMPONENT_ALARM_TRIGGER_RELATED_START,
- CAL_COMPONENT_ALARM_TRIGGER_RELATED_END
-} CalComponentAlarmTriggerRelated;
-</ENUM>
-<TYPEDEF>
-<NAME>CalComponentAlarmTrigger</NAME>
-typedef struct {
- CalComponentAlarmTriggerType type;
-
- union {
- struct {
- struct icaldurationtype duration;
- CalComponentAlarmTriggerRelated related;
- } relative;
-
- struct icaltimetype absolute;
- } u;
-} CalComponentAlarmTrigger;
-</TYPEDEF>
-<FUNCTION>
-<NAME>cal_component_get_first_alarm</NAME>
-<RETURNS>CalComponentAlarm *</RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_next_alarm</NAME>
-<RETURNS>CalComponentAlarm *</RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_free</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarm *alarm
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_get_action</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarm *alarm, CalComponentAlarmAction *action
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_set_action</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarm *alarm, CalComponentAlarmAction action
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_get_trigger</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarm *alarm, CalComponentAlarmTrigger **trigger
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_set_trigger</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarm *alarm, CalComponentAlarmTrigger *trigger
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_free_trigger</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarmTrigger *trigger
-</FUNCTION>
-<ENUM>
-<NAME>CalRecurType</NAME>
-typedef enum {
- CAL_RECUR_YEARLY,
- CAL_RECUR_MONTHLY,
- CAL_RECUR_WEEKLY,
- CAL_RECUR_DAILY,
- CAL_RECUR_HOURLY,
- CAL_RECUR_MINUTELY,
- CAL_RECUR_SECONDLY
-} CalRecurType;
-</ENUM>
-<TYPEDEF>
-<NAME>CalRecurrence</NAME>
-typedef struct {
- CalRecurType type;
-
- int interval;
-
- /* Specifies the end of the recurrence. No occurrences are generated
- after this date. If it is 0, the event recurs forever. */
- time_t enddate;
-
- /* WKST property - the week start day: 0 = Monday to 6 = Sunday. */
- gint week_start_day;
-
-
- /* NOTE: I've used GList's here, but it doesn't matter if we use
- other data structures like arrays. The code should be easy to
- change. So long as it is easy to see if the modifier is set. */
-
- /* For BYMONTH modifier. A list of GINT_TO_POINTERs, 0-11. */
- GList *bymonth;
-
- /* For BYWEEKNO modifier. A list of GINT_TO_POINTERs, [+-]1-53. */
- GList *byweekno;
-
- /* For BYYEARDAY modifier. A list of GINT_TO_POINTERs, [+-]1-366. */
- GList *byyearday;
-
- /* For BYMONTHDAY modifier. A list of GINT_TO_POINTERs, [+-]1-31. */
- GList *bymonthday;
-
- /* For BYDAY modifier. A list of GINT_TO_POINTERs, in pairs.
- The first of each pair is the weekday, 0 = Monday to 6 = Sunday.
- The second of each pair is the week number [+-]0-53. */
- GList *byday;
-
- /* For BYHOUR modifier. A list of GINT_TO_POINTERs, 0-23. */
- GList *byhour;
-
- /* For BYMINUTE modifier. A list of GINT_TO_POINTERs, 0-59. */
- GList *byminute;
-
- /* For BYSECOND modifier. A list of GINT_TO_POINTERs, 0-60. */
- GList *bysecond;
-
- /* For BYSETPOS modifier. A list of GINT_TO_POINTERs, +ve or -ve. */
- GList *bysetpos;
-} CalRecurrence;
-</TYPEDEF>
-<STRUCT>
-<NAME>CalObjTime</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalObjTime</NAME>
-struct CalObjTime {
- guint16 year;
- guint8 month; /* 0 - 11 */
- guint8 day; /* 1 - 31 */
- guint8 hour; /* 0 - 23 */
- guint8 minute; /* 0 - 59 */
- guint8 second; /* 0 - 59 (maybe 60 for leap second) */
-};
-</STRUCT>
-<USER_FUNCTION>
-<NAME>CalRecurInstanceFn</NAME>
-<RETURNS>gboolean </RETURNS>
-CalComponent *comp,
- time_t instance_start,
- time_t instace_end,
- gpointer data
-</USER_FUNCTION>
-<FUNCTION>
-<NAME>cal_recur_generate_instances</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp,time_t start,time_t end,CalRecurInstanceFn cb,gpointer cb_data
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_recur_from_icalrecurrencetype</NAME>
-<RETURNS>CalRecurrence *</RETURNS>
-struct icalrecurrencetype *ir
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_recur_free</NAME>
-<RETURNS>void </RETURNS>
-CalRecurrence *r
-</FUNCTION>
-<TYPEDEF>
-<NAME>CalObjInstance</NAME>
-typedef struct {
- char *uid; /* UID of the object */
- time_t start; /* Start time of instance */
- time_t end; /* End time of instance */
-} CalObjInstance;
-</TYPEDEF>
-<FUNCTION>
-<NAME>cal_obj_instance_list_free</NAME>
-<RETURNS>void </RETURNS>
-GList *list
-</FUNCTION>
-<TYPEDEF>
-<NAME>CalAlarmInstance</NAME>
-typedef struct {
- char *uid; /* UID of object */
-#if 0
- enum AlarmType type; /* Type of alarm */
-#endif
- time_t trigger; /* Alarm trigger time */
- time_t occur; /* Occurrence time */
-} CalAlarmInstance;
-</TYPEDEF>
-<FUNCTION>
-<NAME>cal_alarm_instance_list_free</NAME>
-<RETURNS>void </RETURNS>
-GList *list
-</FUNCTION>
-<ENUM>
-<NAME>CalObjType</NAME>
-typedef enum {
- CALOBJ_TYPE_EVENT = 1 << 0,
- CALOBJ_TYPE_TODO = 1 << 1,
- CALOBJ_TYPE_JOURNAL = 1 << 2,
- CALOBJ_TYPE_ANY = 0x07
-} CalObjType;
-</ENUM>
-<FUNCTION>
-<NAME>cal_obj_uid_list_free</NAME>
-<RETURNS>void </RETURNS>
-GList *list
-</FUNCTION>
-<FUNCTION>
-<NAME>time_from_icaltimetype</NAME>
-<RETURNS>time_t </RETURNS>
-struct icaltimetype itt
-</FUNCTION>
-<FUNCTION>
-<NAME>time_from_isodate</NAME>
-<RETURNS>time_t </RETURNS>
-char *str
-</FUNCTION>
-<FUNCTION>
-<NAME>time_from_start_duration</NAME>
-<RETURNS>time_t </RETURNS>
-time_t start, char *duration
-</FUNCTION>
-<FUNCTION>
-<NAME>isodate_from_time_t</NAME>
-<RETURNS>char *</RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>get_time_t_hour</NAME>
-<RETURNS>int </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>isodiff_to_secs</NAME>
-<RETURNS>int </RETURNS>
-char *str
-</FUNCTION>
-<FUNCTION>
-<NAME>isodiff_from_secs</NAME>
-<RETURNS>char *</RETURNS>
-int secs
-</FUNCTION>
-<FUNCTION>
-<NAME>time_add_minutes</NAME>
-<RETURNS>time_t </RETURNS>
-time_t time, int minutes
-</FUNCTION>
-<FUNCTION>
-<NAME>time_add_day</NAME>
-<RETURNS>time_t </RETURNS>
-time_t time, int days
-</FUNCTION>
-<FUNCTION>
-<NAME>time_add_week</NAME>
-<RETURNS>time_t </RETURNS>
-time_t time, int weeks
-</FUNCTION>
-<FUNCTION>
-<NAME>time_add_month</NAME>
-<RETURNS>time_t </RETURNS>
-time_t time, int months
-</FUNCTION>
-<FUNCTION>
-<NAME>time_add_year</NAME>
-<RETURNS>time_t </RETURNS>
-time_t time, int years
-</FUNCTION>
-<FUNCTION>
-<NAME>format_simple_hour</NAME>
-<RETURNS>char *</RETURNS>
-int hour, int use_am_pm
-</FUNCTION>
-<FUNCTION>
-<NAME>time_days_in_month</NAME>
-<RETURNS>int </RETURNS>
-int year, int month
-</FUNCTION>
-<FUNCTION>
-<NAME>time_from_day</NAME>
-<RETURNS>time_t </RETURNS>
-int year, int month, int day
-</FUNCTION>
-<FUNCTION>
-<NAME>time_day_hour</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t, int hour
-</FUNCTION>
-<FUNCTION>
-<NAME>time_year_begin</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_year_end</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_month_begin</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_month_end</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_week_begin</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_week_end</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_day_begin</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_day_end</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>parse_date</NAME>
-<RETURNS>time_t </RETURNS>
-char *str
-</FUNCTION>
-<FUNCTION>
-<NAME>print_time_t</NAME>
-<RETURNS>void </RETURNS>
-time_t t
-</FUNCTION>
diff --git a/doc/devel/calendar/cal-util/evolution-cal-util-sections.txt b/doc/devel/calendar/cal-util/evolution-cal-util-sections.txt
deleted file mode 100644
index cd928fc7e3..0000000000
--- a/doc/devel/calendar/cal-util/evolution-cal-util-sections.txt
+++ /dev/null
@@ -1,166 +0,0 @@
-<SECTION>
-<FILE>cal-component</FILE>
-CAL_COMPONENT
-<TITLE>CalComponent</TITLE>
-
-CalComponentVType
-CalComponentField
-CalComponentClassification
-CalComponentDateTime
-CalComponentPeriodType
-CalComponentPeriod
-CalComponentText
-CalComponentTransparency
-CalComponentAlarm
-CalComponentPrivate
-
-cal_component_gen_uid
-cal_component_new
-cal_component_clone
-cal_component_set_new_vtype
-cal_component_set_icalcomponent
-cal_component_get_icalcomponent
-cal_component_get_vtype
-cal_component_get_as_string
-cal_component_commit_sequence
-cal_component_get_uid
-cal_component_set_uid
-cal_component_get_categories_list
-cal_component_set_categories_list
-cal_component_get_classification
-cal_component_set_classification
-cal_component_get_comment_list
-cal_component_set_comment_list
-cal_component_get_completed
-cal_component_set_completed
-cal_component_get_created
-cal_component_set_created
-cal_component_get_description_list
-cal_component_set_description_list
-cal_component_get_dtend
-cal_component_set_dtend
-cal_component_get_dtstamp
-cal_component_set_dtstamp
-cal_component_get_dtstart
-cal_component_set_dtstart
-cal_component_get_due
-cal_component_set_due
-cal_component_get_exdate_list
-cal_component_set_exdate_list
-cal_component_get_exrule_list
-cal_component_set_exrule_list
-cal_component_get_geo
-cal_component_set_geo
-cal_component_get_last_modified
-cal_component_set_last_modified
-cal_component_get_percent
-cal_component_set_percent
-cal_component_get_priority
-cal_component_set_priority
-cal_component_get_rdate_list
-cal_component_set_rdate_list
-cal_component_has_rdates
-cal_component_get_rrule_list
-cal_component_set_rrule_list
-cal_component_has_rrules
-cal_component_get_sequence
-cal_component_set_sequence
-cal_component_get_summary
-cal_component_set_summary
-cal_component_get_transparency
-cal_component_set_transparency
-cal_component_get_url
-cal_component_set_url
-cal_component_get_pilot_id
-cal_component_set_pilot_id
-cal_component_get_pilot_status
-cal_component_set_pilot_status
-
-cal_component_free_categories_list
-cal_component_free_datetime
-cal_component_free_exdate_list
-cal_component_free_geo
-cal_component_free_icaltimetype
-cal_component_free_percent
-cal_component_free_priority
-cal_component_free_period_list
-cal_component_free_recur_list
-cal_component_free_sequence
-cal_component_free_text_list
-
-CalComponentAlarmAction
-CalComponentAlarmTriggerType
-CalComponentAlarmTriggerRelated
-CalComponentAlarmTrigger
-
-cal_component_get_first_alarm
-cal_component_get_next_alarm
-cal_component_alarm_free
-cal_component_alarm_get_action
-cal_component_alarm_set_action
-cal_component_alarm_get_trigger
-cal_component_alarm_set_trigger
-cal_component_alarm_free_trigger
-
-<SUBSECTION Standard>
-CAL_COMPONENT_TYPE
-CAL_COMPONENT_CLASS
-IS_CAL_COMPONENT
-IS_CAL_COMPONENT_CLASS
-cal_component_get_type
-
-<SUBSECTION Private>
-CalComponent
-
-</SECTION>
-
-<SECTION>
-<FILE>cal-recur</FILE>
-CalRecurType
-CalRecurrence
-CalObjTime
-CalRecurInstanceFn
-cal_recur_generate_instances
-cal_recur_from_icalrecurrencetype
-cal_recur_free
-</SECTION>
-
-<SECTION>
-<FILE>cal-util</FILE>
-CalObjInstance
-cal_obj_instance_list_free
-CalAlarmInstance
-cal_alarm_instance_list_free
-CalObjType
-cal_obj_uid_list_free
-</SECTION>
-
-<SECTION>
-<FILE>timeutil</FILE>
-time_from_icaltimetype
-time_from_isodate
-time_from_start_duration
-isodate_from_time_t
-get_time_t_hour
-isodiff_to_secs
-isodiff_from_secs
-time_add_minutes
-time_add_day
-time_add_week
-time_add_month
-time_add_year
-format_simple_hour
-time_days_in_month
-time_from_day
-time_day_hour
-time_year_begin
-time_year_end
-time_month_begin
-time_month_end
-time_week_begin
-time_week_end
-time_day_begin
-time_day_end
-parse_date
-print_time_t
-</SECTION>
diff --git a/doc/devel/calendar/cal-util/evolution-cal-util.args b/doc/devel/calendar/cal-util/evolution-cal-util.args
deleted file mode 100644
index e69de29bb2..0000000000
--- a/doc/devel/calendar/cal-util/evolution-cal-util.args
+++ /dev/null
diff --git a/doc/devel/calendar/cal-util/evolution-cal-util.hierarchy b/doc/devel/calendar/cal-util/evolution-cal-util.hierarchy
deleted file mode 100644
index cc235653f2..0000000000
--- a/doc/devel/calendar/cal-util/evolution-cal-util.hierarchy
+++ /dev/null
@@ -1,2 +0,0 @@
-GtkObject
- CalComponent
diff --git a/doc/devel/calendar/cal-util/evolution-cal-util.signals b/doc/devel/calendar/cal-util/evolution-cal-util.signals
deleted file mode 100644
index e69de29bb2..0000000000
--- a/doc/devel/calendar/cal-util/evolution-cal-util.signals
+++ /dev/null
diff --git a/doc/devel/calendar/cal-util/evolution-cal-util.types b/doc/devel/calendar/cal-util/evolution-cal-util.types
deleted file mode 100644
index 52b2d9bf90..0000000000
--- a/doc/devel/calendar/cal-util/evolution-cal-util.types
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <gnome.h>
-#include <cal-util/cal-component.h>
-
-cal_component_get_type
diff --git a/doc/devel/calendar/cal-util/tmpl/cal-component.sgml b/doc/devel/calendar/cal-util/tmpl/cal-component.sgml
deleted file mode 100644
index 2f800e583f..0000000000
--- a/doc/devel/calendar/cal-util/tmpl/cal-component.sgml
+++ /dev/null
@@ -1,934 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CalComponent
-
-<!-- ##### SECTION Short_Description ##### -->
-RFC 2445 iCalendar component object.
-
-<!-- ##### SECTION Long_Description ##### -->
- <para>
- The #CalComponent object provides a wrapper over the &libical;
- functions for manipulating calendar components. #CalComponent
- presents a GTK+-like interface to calendar components according to
- RFC 2445.
- </para>
-
- <para>
- While &libical; supports almost all of the features of the
- iCalendar RFCs, applications are normally not interested in all
- the mindless gunk that is there. Still, applications should do
- their best not to drop extension fields from calendar components
- or any other extra information they do not support (including
- standard fields they are not interested in). The #CalComponent
- object provides a wrapper over
- <structname>icalcomponent</structname> structures from &libical;
- so that no information in them will be lost even if the
- application is not designed to handle it. Also, #CalComponent
- provides a higher-level API to many of the &libical; operations so
- as to make it less painful to deal with iCalendar components.
- </para>
-
- <para>
- A #CalComponent object starts out empty. It must be initialized
- from an existing <structname>icalcomponent</structname> structure
- by using the cal_component_set_icalcomponent() function, or from a
- completely new data by specifying the desired component type to
- the cal_component_set_new_vtype() function.
- </para>
-
- <para>
- #CalComponent will create an internal map of the properties in the
- <structname>icalcomponent</structname> structure and then allow
- random access to them via the #CalComponent API functions;
- normally the &libical; API would have to be used by creating many
- iterators and other unpleasant constructs. #CalComponent keeps
- handles to the properties it scanned from the
- <structname>icalcomponent</structname> and will let the parent
- application modify them at any time without having to do any
- iteration.
- </para>
-
- <para>
- Eventually a #CalComponent may be turned into the RFC 2445 string
- representation of an iCalendar component by using the
- cal_component_get_as_string() function. Applications can then
- transfer this interoperable
- <footnote>
- <para>
- &ldquo;Interoperable.&rdquo; Heavens, I love that word.
- </para>
- </footnote>
- string to other programs that deal with iCalendar.
- </para>
-
-<!-- ##### SECTION See_Also ##### -->
- <para>
-
- </para>
-
-<!-- ##### MACRO CAL_COMPONENT ##### -->
- <para>
- Casts a #GtkObject to a #CalComponent.
- </para>
-
-@obj: A GTK+ object.
-
-
-<!-- ##### ENUM CalComponentVType ##### -->
- <para>
- Calendar component types as defined by RFC 2445. These values can
- be used to create a new calendar component by passing them to the
- cal_component_set_new_vtype() function. They are also the return
- value of the cal_component_get_vtype() function. The only time
- the @CAL_COMPONENT_NO_TYPE value is used is when querying the
- vtype of an uninitialized #CalComponent.
- </para>
-
-@CAL_COMPONENT_NO_TYPE: Returned from cal_component_get_vtype() to
- indicate an uninitialized #CalComponent object.
-
-@CAL_COMPONENT_EVENT: Indicates a VEVENT component.
-@CAL_COMPONENT_TODO: Indicates a VTODO component.
-@CAL_COMPONENT_JOURNAL: Indicates a VJOURNAL component.
-@CAL_COMPONENT_FREEBUSY: Indicates a VFREEBUSY component.
-@CAL_COMPONENT_TIMEZONE: Indicates a VTIMEZOME component.
-
-<!-- ##### ENUM CalComponentField ##### -->
- <para>
- These values are used as identifiers for #ETable columns. These
- are used by the calendar GUI code in Evolution.
- </para>
-
-@CAL_COMPONENT_FIELD_CATEGORIES: Component's list of categories.
-@CAL_COMPONENT_FIELD_CLASSIFICATION: Component's classification.
-@CAL_COMPONENT_FIELD_COMPLETED: Component's completion date.
-@CAL_COMPONENT_FIELD_DTEND: Component's ending date.
-@CAL_COMPONENT_FIELD_DTSTART: Component's starting date.
-@CAL_COMPONENT_FIELD_DUE: Component's due date.
-@CAL_COMPONENT_FIELD_GEO: Component's geographical position.
-@CAL_COMPONENT_FIELD_PERCENT: Component's percent completed value.
-@CAL_COMPONENT_FIELD_PRIORITY: Component's priority.
-@CAL_COMPONENT_FIELD_SUMMARY: Component's summary.
-@CAL_COMPONENT_FIELD_TRANSPARENCY: Component's transparency value.
-@CAL_COMPONENT_FIELD_URL: Component's URL.
-@CAL_COMPONENT_FIELD_HAS_ALARMS: Whether the component has any alarms.
-@CAL_COMPONENT_FIELD_ICON: Which icon to use for the component.
-@CAL_COMPONENT_FIELD_COMPLETE: Whether the component has been completed.
-@CAL_COMPONENT_FIELD_RECURRING: Whether the component has any recurrences.
-@CAL_COMPONENT_FIELD_OVERDUE: Whether the component is overdue.
-@CAL_COMPONENT_FIELD_COLOR: Which color to use for the component.
-@CAL_COMPONENT_FIELD_NUM_FIELDS: Total number of enumerated fields.
-
-<!-- ##### ENUM CalComponentClassification ##### -->
- <para>
- Values for the access classification property of a calendar
- component.
- </para>
-
-@CAL_COMPONENT_CLASS_NONE: Indicates that no access classification has
- been set for the corresponding component.
-
-@CAL_COMPONENT_CLASS_PUBLIC: Public access.
-@CAL_COMPONENT_CLASS_PRIVATE: Private access.
-@CAL_COMPONENT_CLASS_CONFIDENTIAL: Confidential access.
-
-@CAL_COMPONENT_CLASS_UNKNOWN: Unknown access classification value,
- used when &libical; returns something #CalComponent does not know
- about.
-
-<!-- ##### TYPEDEF CalComponentDateTime ##### -->
- <para>
- This structure defines a date and time value.
- </para>
-
-
-<!-- ##### ENUM CalComponentPeriodType ##### -->
- <para>
- Defines how a period of time is specified.
- </para>
-
-@CAL_COMPONENT_PERIOD_DATETIME: Indicates that the period is specified
- by starting and ending date/time values.
-
-@CAL_COMPONENT_PERIOD_DURATION: Indicates that the period is specified
- as a starding date/time and a duration value.
-
-<!-- ##### TYPEDEF CalComponentPeriod ##### -->
- <para>
- This structure defines a period of time.
- </para>
-
-
-<!-- ##### TYPEDEF CalComponentText ##### -->
- <para>
- This structure defines the value of a text property that may have
- an alternate representation parameter.
- </para>
-
-
-<!-- ##### ENUM CalComponentTransparency ##### -->
-<para>
-
-</para>
-
-@CAL_COMPONENT_TRANSP_NONE:
-@CAL_COMPONENT_TRANSP_TRANSPARENT:
-@CAL_COMPONENT_TRANSP_OPAQUE:
-@CAL_COMPONENT_TRANSP_UNKNOWN:
-
-<!-- ##### STRUCT CalComponentAlarm ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT CalComponentPrivate ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION cal_component_gen_uid ##### -->
-<para>
-
-</para>
-
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_new ##### -->
-<para>
-
-</para>
-
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_clone ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_set_new_vtype ##### -->
-<para>
-
-</para>
-
-@comp:
-@type:
-
-
-<!-- ##### FUNCTION cal_component_set_icalcomponent ##### -->
-<para>
-
-</para>
-
-@comp:
-@icalcomp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_icalcomponent ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_vtype ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_as_string ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_commit_sequence ##### -->
-<para>
-
-</para>
-
-@comp:
-
-
-<!-- ##### FUNCTION cal_component_get_uid ##### -->
-<para>
-
-</para>
-
-@comp:
-@uid:
-
-
-<!-- ##### FUNCTION cal_component_set_uid ##### -->
-<para>
-
-</para>
-
-@comp:
-@uid:
-
-
-<!-- ##### FUNCTION cal_component_get_categories_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@categ_list:
-
-
-<!-- ##### FUNCTION cal_component_set_categories_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@categ_list:
-
-
-<!-- ##### FUNCTION cal_component_get_classification ##### -->
-<para>
-
-</para>
-
-@comp:
-@classif:
-
-
-<!-- ##### FUNCTION cal_component_set_classification ##### -->
-<para>
-
-</para>
-
-@comp:
-@classif:
-
-
-<!-- ##### FUNCTION cal_component_get_comment_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@text_list:
-
-
-<!-- ##### FUNCTION cal_component_set_comment_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@text_list:
-
-
-<!-- ##### FUNCTION cal_component_get_completed ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_set_completed ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_get_created ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_set_created ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_get_description_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@text_list:
-
-
-<!-- ##### FUNCTION cal_component_set_description_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@text_list:
-
-
-<!-- ##### FUNCTION cal_component_get_dtend ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_set_dtend ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_get_dtstamp ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_set_dtstamp ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_get_dtstart ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_set_dtstart ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_get_due ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_set_due ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_get_exdate_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@exdate_list:
-
-
-<!-- ##### FUNCTION cal_component_set_exdate_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@exdate_list:
-
-
-<!-- ##### FUNCTION cal_component_get_exrule_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@recur_list:
-
-
-<!-- ##### FUNCTION cal_component_set_exrule_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@recur_list:
-
-
-<!-- ##### FUNCTION cal_component_get_geo ##### -->
-<para>
-
-</para>
-
-@comp:
-@geo:
-
-
-<!-- ##### FUNCTION cal_component_set_geo ##### -->
-<para>
-
-</para>
-
-@comp:
-@geo:
-
-
-<!-- ##### FUNCTION cal_component_get_last_modified ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_set_last_modified ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_get_percent ##### -->
-<para>
-
-</para>
-
-@comp:
-@percent:
-
-
-<!-- ##### FUNCTION cal_component_set_percent ##### -->
-<para>
-
-</para>
-
-@comp:
-@percent:
-
-
-<!-- ##### FUNCTION cal_component_get_priority ##### -->
-<para>
-
-</para>
-
-@comp:
-@priority:
-
-
-<!-- ##### FUNCTION cal_component_set_priority ##### -->
-<para>
-
-</para>
-
-@comp:
-@priority:
-
-
-<!-- ##### FUNCTION cal_component_get_rdate_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@period_list:
-
-
-<!-- ##### FUNCTION cal_component_set_rdate_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@period_list:
-
-
-<!-- ##### FUNCTION cal_component_has_rdates ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_rrule_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@recur_list:
-
-
-<!-- ##### FUNCTION cal_component_set_rrule_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@recur_list:
-
-
-<!-- ##### FUNCTION cal_component_has_rrules ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_sequence ##### -->
-<para>
-
-</para>
-
-@comp:
-@sequence:
-
-
-<!-- ##### FUNCTION cal_component_set_sequence ##### -->
-<para>
-
-</para>
-
-@comp:
-@sequence:
-
-
-<!-- ##### FUNCTION cal_component_get_summary ##### -->
-<para>
-
-</para>
-
-@comp:
-@summary:
-
-
-<!-- ##### FUNCTION cal_component_set_summary ##### -->
-<para>
-
-</para>
-
-@comp:
-@summary:
-
-
-<!-- ##### FUNCTION cal_component_get_transparency ##### -->
-<para>
-
-</para>
-
-@comp:
-@transp:
-
-
-<!-- ##### FUNCTION cal_component_set_transparency ##### -->
-<para>
-
-</para>
-
-@comp:
-@transp:
-
-
-<!-- ##### FUNCTION cal_component_get_url ##### -->
-<para>
-
-</para>
-
-@comp:
-@url:
-
-
-<!-- ##### FUNCTION cal_component_set_url ##### -->
-<para>
-
-</para>
-
-@comp:
-@url:
-
-
-<!-- ##### FUNCTION cal_component_get_pilot_id ##### -->
-<para>
-
-</para>
-
-@comp:
-@pilot_id:
-
-
-<!-- ##### FUNCTION cal_component_set_pilot_id ##### -->
-<para>
-
-</para>
-
-@comp:
-@pilot_id:
-
-
-<!-- ##### FUNCTION cal_component_get_pilot_status ##### -->
-<para>
-
-</para>
-
-@comp:
-@pilot_status:
-
-
-<!-- ##### FUNCTION cal_component_set_pilot_status ##### -->
-<para>
-
-</para>
-
-@comp:
-@pilot_status:
-
-
-<!-- ##### FUNCTION cal_component_free_categories_list ##### -->
-<para>
-
-</para>
-
-@categ_list:
-
-
-<!-- ##### FUNCTION cal_component_free_datetime ##### -->
-<para>
-
-</para>
-
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_free_exdate_list ##### -->
-<para>
-
-</para>
-
-@exdate_list:
-
-
-<!-- ##### FUNCTION cal_component_free_geo ##### -->
-<para>
-
-</para>
-
-@geo:
-
-
-<!-- ##### FUNCTION cal_component_free_icaltimetype ##### -->
-<para>
-
-</para>
-
-@t:
-
-
-<!-- ##### FUNCTION cal_component_free_percent ##### -->
-<para>
-
-</para>
-
-@percent:
-
-
-<!-- ##### FUNCTION cal_component_free_priority ##### -->
-<para>
-
-</para>
-
-@priority:
-
-
-<!-- ##### FUNCTION cal_component_free_period_list ##### -->
-<para>
-
-</para>
-
-@period_list:
-
-
-<!-- ##### FUNCTION cal_component_free_recur_list ##### -->
-<para>
-
-</para>
-
-@recur_list:
-
-
-<!-- ##### FUNCTION cal_component_free_sequence ##### -->
-<para>
-
-</para>
-
-@sequence:
-
-
-<!-- ##### FUNCTION cal_component_free_text_list ##### -->
-<para>
-
-</para>
-
-@text_list:
-
-
-<!-- ##### ENUM CalComponentAlarmAction ##### -->
-<para>
-
-</para>
-
-@CAL_COMPONENT_ALARM_NONE:
-@CAL_COMPONENT_ALARM_AUDIO:
-@CAL_COMPONENT_ALARM_DISPLAY:
-@CAL_COMPONENT_ALARM_EMAIL:
-@CAL_COMPONENT_ALARM_PROCEDURE:
-@CAL_COMPONENT_ALARM_UNKNOWN:
-
-<!-- ##### ENUM CalComponentAlarmTriggerType ##### -->
-<para>
-
-</para>
-
-@CAL_COMPONENT_ALARM_TRIGGER_RELATIVE:
-@CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE:
-
-<!-- ##### ENUM CalComponentAlarmTriggerRelated ##### -->
-<para>
-
-</para>
-
-@CAL_COMPONENT_ALARM_TRIGGER_RELATED_START:
-@CAL_COMPONENT_ALARM_TRIGGER_RELATED_END:
-
-<!-- ##### TYPEDEF CalComponentAlarmTrigger ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION cal_component_get_first_alarm ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_next_alarm ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_alarm_free ##### -->
-<para>
-
-</para>
-
-@alarm:
-
-
-<!-- ##### FUNCTION cal_component_alarm_get_action ##### -->
-<para>
-
-</para>
-
-@alarm:
-@action:
-
-
-<!-- ##### FUNCTION cal_component_alarm_set_action ##### -->
-<para>
-
-</para>
-
-@alarm:
-@action:
-
-
-<!-- ##### FUNCTION cal_component_alarm_get_trigger ##### -->
-<para>
-
-</para>
-
-@alarm:
-@trigger:
-
-
-<!-- ##### FUNCTION cal_component_alarm_set_trigger ##### -->
-<para>
-
-</para>
-
-@alarm:
-@trigger:
-
-
-<!-- ##### FUNCTION cal_component_alarm_free_trigger ##### -->
-<para>
-
-</para>
-
-@trigger:
-
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../../../evolution-devel-guide.sgml" "book" "refsect2" "")
-End:
--->
diff --git a/doc/devel/calendar/cal-util/tmpl/cal-recur.sgml b/doc/devel/calendar/cal-util/tmpl/cal-recur.sgml
deleted file mode 100644
index 703f8b2b85..0000000000
--- a/doc/devel/calendar/cal-util/tmpl/cal-recur.sgml
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-cal-recur
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### ENUM CalRecurType ##### -->
-<para>
-
-</para>
-
-@CAL_RECUR_YEARLY:
-@CAL_RECUR_MONTHLY:
-@CAL_RECUR_WEEKLY:
-@CAL_RECUR_DAILY:
-@CAL_RECUR_HOURLY:
-@CAL_RECUR_MINUTELY:
-@CAL_RECUR_SECONDLY:
-
-<!-- ##### TYPEDEF CalRecurrence ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT CalObjTime ##### -->
-<para>
-
-</para>
-
-@year:
-@month:
-@day:
-@hour:
-@minute:
-@second:
-
-<!-- ##### USER_FUNCTION CalRecurInstanceFn ##### -->
-<para>
-
-</para>
-
-@comp:
-@instance_start:
-@instace_end:
-@data:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_recur_generate_instances ##### -->
-<para>
-
-</para>
-
-@comp:
-@start:
-@end:
-@cb:
-@cb_data:
-
-
-<!-- ##### FUNCTION cal_recur_from_icalrecurrencetype ##### -->
-<para>
-
-</para>
-
-@ir:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_recur_free ##### -->
-<para>
-
-</para>
-
-@r:
-
-
diff --git a/doc/devel/calendar/cal-util/tmpl/cal-util.sgml b/doc/devel/calendar/cal-util/tmpl/cal-util.sgml
deleted file mode 100644
index 8d4516c2ec..0000000000
--- a/doc/devel/calendar/cal-util/tmpl/cal-util.sgml
+++ /dev/null
@@ -1,62 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-cal-util
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### TYPEDEF CalObjInstance ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION cal_obj_instance_list_free ##### -->
-<para>
-
-</para>
-
-@list:
-
-
-<!-- ##### TYPEDEF CalAlarmInstance ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION cal_alarm_instance_list_free ##### -->
-<para>
-
-</para>
-
-@list:
-
-
-<!-- ##### ENUM CalObjType ##### -->
-<para>
-
-</para>
-
-@CALOBJ_TYPE_EVENT:
-@CALOBJ_TYPE_TODO:
-@CALOBJ_TYPE_JOURNAL:
-@CALOBJ_TYPE_ANY:
-
-<!-- ##### FUNCTION cal_obj_uid_list_free ##### -->
-<para>
-
-</para>
-
-@list:
-
-
diff --git a/doc/devel/calendar/cal-util/tmpl/evolution-cal-util-unused.sgml b/doc/devel/calendar/cal-util/tmpl/evolution-cal-util-unused.sgml
deleted file mode 100644
index e69de29bb2..0000000000
--- a/doc/devel/calendar/cal-util/tmpl/evolution-cal-util-unused.sgml
+++ /dev/null
diff --git a/doc/devel/calendar/cal-util/tmpl/timeutil.sgml b/doc/devel/calendar/cal-util/tmpl/timeutil.sgml
deleted file mode 100644
index 3b62fbba3f..0000000000
--- a/doc/devel/calendar/cal-util/tmpl/timeutil.sgml
+++ /dev/null
@@ -1,260 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-timeutil
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION time_from_icaltimetype ##### -->
-<para>
-
-</para>
-
-@itt:
-@Returns:
-
-
-<!-- ##### FUNCTION time_from_isodate ##### -->
-<para>
-
-</para>
-
-@str:
-@Returns:
-
-
-<!-- ##### FUNCTION time_from_start_duration ##### -->
-<para>
-
-</para>
-
-@start:
-@duration:
-@Returns:
-
-
-<!-- ##### FUNCTION isodate_from_time_t ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION get_time_t_hour ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION isodiff_to_secs ##### -->
-<para>
-
-</para>
-
-@str:
-@Returns:
-
-
-<!-- ##### FUNCTION isodiff_from_secs ##### -->
-<para>
-
-</para>
-
-@secs:
-@Returns:
-
-
-<!-- ##### FUNCTION time_add_minutes ##### -->
-<para>
-
-</para>
-
-@time:
-@minutes:
-@Returns:
-
-
-<!-- ##### FUNCTION time_add_day ##### -->
-<para>
-
-</para>
-
-@time:
-@days:
-@Returns:
-
-
-<!-- ##### FUNCTION time_add_week ##### -->
-<para>
-
-</para>
-
-@time:
-@weeks:
-@Returns:
-
-
-<!-- ##### FUNCTION time_add_month ##### -->
-<para>
-
-</para>
-
-@time:
-@months:
-@Returns:
-
-
-<!-- ##### FUNCTION time_add_year ##### -->
-<para>
-
-</para>
-
-@time:
-@years:
-@Returns:
-
-
-<!-- ##### FUNCTION format_simple_hour ##### -->
-<para>
-
-</para>
-
-@hour:
-@use_am_pm:
-@Returns:
-
-
-<!-- ##### FUNCTION time_days_in_month ##### -->
-<para>
-
-</para>
-
-@year:
-@month:
-@Returns:
-
-
-<!-- ##### FUNCTION time_from_day ##### -->
-<para>
-
-</para>
-
-@year:
-@month:
-@day:
-@Returns:
-
-
-<!-- ##### FUNCTION time_day_hour ##### -->
-<para>
-
-</para>
-
-@t:
-@hour:
-@Returns:
-
-
-<!-- ##### FUNCTION time_year_begin ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_year_end ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_month_begin ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_month_end ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_week_begin ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_week_end ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_day_begin ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_day_end ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION parse_date ##### -->
-<para>
-
-</para>
-
-@str:
-@Returns:
-
-
-<!-- ##### FUNCTION print_time_t ##### -->
-<para>
-
-</para>
-
-@t:
-
-
diff --git a/doc/devel/calendar/evolution-calendar.sgml b/doc/devel/calendar/evolution-calendar.sgml
deleted file mode 100644
index f3936d9bbc..0000000000
--- a/doc/devel/calendar/evolution-calendar.sgml
+++ /dev/null
@@ -1,51 +0,0 @@
- <part>
- <docinfo>
- <authorgroup>
- <author>
- <firstname>Federico</firstname>
- <surname>Mena Quintero</surname>
- <affiliation>
- <address>
- <email>federico@helixcode.com</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
- </docinfo>
-
- <title>Developing Applications for the Evolution Calendar</title>
-
- <partintro>
- <para>
- This part of the Evolution Developer's Guide describes how to
- write applications for the Evolution Calendar by using its
- public interfaces. The Evolution Calendar exports its
- functionality through a number of interfaces, including CORBA,
- GTK+ wrappers for Bonobo objects, and other utility libraries.
- </para>
-
- <para>
- You should read this part of the Evolution Developer's guide
- if you intend to write client applications that use the
- functionality of the Evolution Calendar.
- </para>
-
- <para>
- This part does not describe the internal interfaces of the
- Evolution Calendar; for that you should read the Evolution
- Internals Guide. You should only need to read that guide if
- you are interested in the way the calendar works internally or
- if you want to make changes directly to the Evolution Calendar
- code.
- </para>
- </partintro>
-
- &calendar-architecture;
- </part>
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../evolution-devel-guide.sgml" "book" "book" "")
-End:
--->
diff --git a/doc/devel/calendar/public-reference.sgml b/doc/devel/calendar/public-reference.sgml
deleted file mode 100644
index f8aa6e848d..0000000000
--- a/doc/devel/calendar/public-reference.sgml
+++ /dev/null
@@ -1,24 +0,0 @@
- <reference>
- <title>Calendar 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
- Calendar.
- </para>
- </partintro>
-
- &CalClient;
- &CalComponent;
- &cal-util;
- &cal-recur;
- &timeutil;
- </reference>
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../evolution-devel-guide.sgml" "book" "part" "")
-End:
--->
diff --git a/doc/devel/calendar/reference.sgml b/doc/devel/calendar/reference.sgml
deleted file mode 100644
index f8aa6e848d..0000000000
--- a/doc/devel/calendar/reference.sgml
+++ /dev/null
@@ -1,24 +0,0 @@
- <reference>
- <title>Calendar 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
- Calendar.
- </para>
- </partintro>
-
- &CalClient;
- &CalComponent;
- &cal-util;
- &cal-recur;
- &timeutil;
- </reference>
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../evolution-devel-guide.sgml" "book" "part" "")
-End:
--->
diff --git a/doc/devel/evolution-devel-guide.sgml b/doc/devel/evolution-devel-guide.sgml
deleted file mode 100644
index ca80ec533a..0000000000
--- a/doc/devel/evolution-devel-guide.sgml
+++ /dev/null
@@ -1,50 +0,0 @@
-<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
-<!entity evolution-calendar SYSTEM "calendar/evolution-calendar.sgml">
-<!entity calendar-architecture SYSTEM "calendar/architecture.sgml">
-<!entity calendar-reference SYSTEM "calendar/reference.sgml">
-<!entity CalClient SYSTEM "calendar/cal-client/sgml/cal-client.sgml">
-<!entity CalComponent SYSTEM "calendar/cal-util/sgml/cal-component.sgml">
-<!entity cal-util SYSTEM "calendar/cal-util/sgml/cal-util.sgml">
-<!entity cal-recur SYSTEM "calendar/cal-util/sgml/cal-recur.sgml">
-<!entity timeutil SYSTEM "calendar/cal-util/sgml/timeutil.sgml">
-<!entity PCS "<acronym>PCS</acronym>">
-<!entity libical "<application>libical</application>">
-]>
-
-<book>
- <bookinfo>
- <title>Evolution Developer's Guide</title>
-
- <authorgroup>
- <corpauthor>
- Helix Code, Inc.
- </corpauthor>
- </authorgroup>
-
- <copyright>
- <year>2000</year>
- <holder>Helix Code, Inc.</holder>
- </copyright>
- </bookinfo>
-
- <!-- DocBook parts for each individual component -->
-
- &evolution-calendar;
-
- <!-- API Reference part -->
-
- <part>
- <title>Evolution Public 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>
- </partintro>
-
- &calendar-reference;
- </part>
-</book>
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 a339909f54..0000000000
--- a/doc/white-papers/mail/camel.sgml
+++ /dev/null
@@ -1,339 +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>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</year>
- <holder>Helix Code, 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 a
- <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 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_by_uid</function>. Alternately,
- within a single mail-reading session, messages can be referred
- to by their linear position within the store using
- <function>CamelFolder::get_message_by_number</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 chained together. So a CamelMimePart
- containing base64-encoded data can filter its output through
- a CamelStreamB64. 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 cb49036068..0000000000
--- a/e-util/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-*.lo
-*.la
diff --git a/e-util/ChangeLog b/e-util/ChangeLog
deleted file mode 100644
index 9958171157..0000000000
--- a/e-util/ChangeLog
+++ /dev/null
@@ -1,495 +0,0 @@
-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 6a1dd2cb02..0000000000
--- a/e-util/Makefile.am
+++ /dev/null
@@ -1,48 +0,0 @@
-imagesdir = $(datadir)/images/evolution
-
-INCLUDES = \
- -I$(top_srcdir) \
- $(GNOME_INCLUDEDIR) \
- $(UNICODE_CFLAGS) \
- -DEVOLUTION_IMAGES=\""$(imagesdir)"\" \
- -DG_LOG_DOMAIN=\"e-utils\" \
- $(UNICODE_CFLAGS)
-
-noinst_LTLIBRARIES = libeutil.la libeutil-static.la
-
-libeutil_la_SOURCES = \
- e-canvas.c \
- e-canvas.h \
- e-canvas-utils.c \
- e-canvas-utils.h \
- e-canvas-vbox.c \
- e-canvas-vbox.h \
- e-cursors.c \
- e-cursors.h \
- e-dialog-widgets.c \
- e-dialog-widgets.h \
- e-gui-utils.c \
- e-gui-utils.h \
- e-html-utils.c \
- e-html-utils.h \
- e-iterator.c \
- e-iterator.h \
- e-list.c \
- e-list.h \
- e-list-iterator.c \
- e-list-iterator.h \
- e-popup-menu.c \
- e-popup-menu.h \
- e-printable.c \
- e-printable.h \
- e-sexp.c \
- e-sexp.h \
- e-util.c \
- e-util.h \
- e-xml-utils.c \
- e-xml-utils.h \
- e-font.c \
- e-font.h
-
-libeutil_static_la_SOURCES = $(libeutil_la_SOURCES)
-libeutil_static_la_LDFLAGS = --all-static \ No newline at end of file
diff --git a/e-util/e-canvas-utils.c b/e-util/e-canvas-utils.c
deleted file mode 100644
index ac61545b5f..0000000000
--- a/e-util/e-canvas-utils.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-canvas-utils.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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-canvas-utils.h"
-
-void
-e_canvas_item_move_absolute (GnomeCanvasItem *item, double dx, double dy)
-{
- double translate[6];
-
- g_return_if_fail (item != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- art_affine_translate (translate, dx, dy);
-
- gnome_canvas_item_affine_absolute (item, translate);
-}
-
-void
-e_canvas_item_show_area (GnomeCanvasItem *item, double x1, double y1, double x2, double y2)
-{
- GtkAdjustment *h, *v;
- double dx = 0, dy = 0;
-
- g_return_if_fail (item != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- gnome_canvas_item_i2w(item, &x1, &y1);
- gnome_canvas_item_i2w(item, &x2, &y2);
-
- h = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- v = gtk_layout_get_vadjustment(GTK_LAYOUT(item->canvas));
-
- if (x2 > h->value + h->page_size)
- dx = (x2 - (h->value + h->page_size));
- if (y2 > v->value + v->page_size)
- dy = (y2 - (v->value + v->page_size));
-
- if (x1 < h->value + dx)
- dx = (x1 - h->value);
- if (y1 < v->value + dy)
- dy = (y1 - v->value);
-
- if (dx)
- gtk_adjustment_set_value(h, h->value + dx);
- if (dy)
- gtk_adjustment_set_value(v, v->value + dy);
-}
diff --git a/e-util/e-canvas-utils.h b/e-util/e-canvas-utils.h
deleted file mode 100644
index a940ea393c..0000000000
--- a/e-util/e-canvas-utils.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-canvas-utils.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_CANVAS_UTILS__
-#define __E_CANVAS_UTILS__
-
-#include <gnome.h>
-void e_canvas_item_move_absolute (GnomeCanvasItem *item, double dx, double dy);
-void e_canvas_item_show_area (GnomeCanvasItem *item, double x1, double y1, double x2, double y2);
-
-#endif /* __E_CANVAS_UTILS__ */
diff --git a/e-util/e-canvas-vbox.c b/e-util/e-canvas-vbox.c
deleted file mode 100644
index 2d389a83e6..0000000000
--- a/e-util/e-canvas-vbox.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-canvas-vbox.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <math.h>
-#include "e-canvas-vbox.h"
-#include <e-util/e-canvas-utils.h>
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-
-static void e_canvas_vbox_init (ECanvasVbox *CanvasVbox);
-static void e_canvas_vbox_class_init (ECanvasVboxClass *klass);
-static void e_canvas_vbox_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_canvas_vbox_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_canvas_vbox_destroy (GtkObject *object);
-
-static gint e_canvas_vbox_event (GnomeCanvasItem *item, GdkEvent *event);
-static void e_canvas_vbox_realize (GnomeCanvasItem *item);
-
-static void e_canvas_vbox_reflow (GnomeCanvasItem *item, int flags);
-
-static void e_canvas_vbox_real_add_item(ECanvasVbox *e_canvas_vbox, GnomeCanvasItem *item);
-static void e_canvas_vbox_resize_children (GnomeCanvasItem *item);
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_SPACING,
-};
-
-GtkType
-e_canvas_vbox_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type)
- {
- static const GtkTypeInfo info =
- {
- "ECanvasVbox",
- sizeof (ECanvasVbox),
- sizeof (ECanvasVboxClass),
- (GtkClassInitFunc) e_canvas_vbox_class_init,
- (GtkObjectInitFunc) e_canvas_vbox_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (gnome_canvas_group_get_type (), &info);
- }
-
- return type;
-}
-
-static void
-e_canvas_vbox_class_init (ECanvasVboxClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- gtk_object_add_arg_type ("ECanvasVbox::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ECanvasVbox::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("ECanvasVbox::spacing", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_SPACING);
-
- klass->add_item = e_canvas_vbox_real_add_item;
-
- object_class->set_arg = e_canvas_vbox_set_arg;
- object_class->get_arg = e_canvas_vbox_get_arg;
- object_class->destroy = e_canvas_vbox_destroy;
-
- /* GnomeCanvasItem method overrides */
- item_class->event = e_canvas_vbox_event;
- item_class->realize = e_canvas_vbox_realize;
-}
-
-static void
-e_canvas_vbox_init (ECanvasVbox *vbox)
-{
- vbox->items = NULL;
-
- vbox->width = 10;
- vbox->height = 10;
- vbox->spacing = 0;
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(vbox), e_canvas_vbox_reflow);
-}
-
-static void
-e_canvas_vbox_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ECanvasVbox *e_canvas_vbox;
-
- item = GNOME_CANVAS_ITEM (o);
- e_canvas_vbox = E_CANVAS_VBOX (o);
-
- switch (arg_id){
- case ARG_WIDTH:
- e_canvas_vbox->width = GTK_VALUE_DOUBLE (*arg);
- e_canvas_vbox_resize_children(item);
- e_canvas_item_request_reflow(item);
- break;
- case ARG_SPACING:
- e_canvas_vbox->spacing = GTK_VALUE_DOUBLE (*arg);
- e_canvas_item_request_reflow(item);
- break;
- }
-}
-
-static void
-e_canvas_vbox_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ECanvasVbox *e_canvas_vbox;
-
- e_canvas_vbox = E_CANVAS_VBOX (object);
-
- switch (arg_id) {
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_canvas_vbox->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = e_canvas_vbox->height;
- break;
- case ARG_SPACING:
- GTK_VALUE_DOUBLE (*arg) = e_canvas_vbox->spacing;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_canvas_vbox_destroy (GtkObject *object)
-{
- ECanvasVbox *vbox = E_CANVAS_VBOX(object);
-
- g_list_foreach(vbox->items, (GFunc) gtk_object_unref, NULL);
- g_list_free(vbox->items);
- vbox->items = NULL;
-
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
-}
-
-static gint
-e_canvas_vbox_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- gint return_val = TRUE;
-
- switch (event->type) {
- case GDK_KEY_PRESS:
- switch (event->key.keyval) {
- case GDK_Tab:
- case GDK_KP_Tab:
- case GDK_ISO_Left_Tab:
- case GDK_Left:
- case GDK_KP_Left:
- case GDK_Right:
- case GDK_KP_Right:
- case GDK_Down:
- case GDK_KP_Down:
- case GDK_Up:
- case GDK_KP_Up:
- case GDK_Return:
- case GDK_KP_Enter:
- return_val = TRUE;
- break;
- default:
- return_val = FALSE;
- break;
- }
- break;
- default:
- return_val = FALSE;
- break;
- }
- if (!return_val) {
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS (parent_class)->event (item, event);
- }
- return return_val;
-
-}
-
-static void
-e_canvas_vbox_realize (GnomeCanvasItem *item)
-{
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
-
- e_canvas_vbox_resize_children(item);
- e_canvas_item_request_reflow(item);
-}
-
-static void
-e_canvas_vbox_remove_item (GnomeCanvasItem *item, ECanvasVbox *vbox)
-{
- vbox->items = g_list_remove(vbox->items, item);
- gtk_object_unref(GTK_OBJECT(vbox));
-}
-
-static void
-e_canvas_vbox_real_add_item(ECanvasVbox *e_canvas_vbox, GnomeCanvasItem *item)
-{
- e_canvas_vbox->items = g_list_append(e_canvas_vbox->items, item);
- gtk_object_ref(GTK_OBJECT(item));
- gtk_object_ref(GTK_OBJECT(e_canvas_vbox));
- gtk_signal_connect(GTK_OBJECT(item), "destroy",
- GTK_SIGNAL_FUNC(e_canvas_vbox_remove_item), e_canvas_vbox);
- if ( GTK_OBJECT_FLAGS( e_canvas_vbox ) & GNOME_CANVAS_ITEM_REALIZED ) {
- gnome_canvas_item_set(item,
- "width", (double) e_canvas_vbox->width,
- NULL);
- e_canvas_item_request_reflow(item);
- }
-
-}
-
-static void
-e_canvas_vbox_resize_children (GnomeCanvasItem *item)
-{
- GList *list;
- ECanvasVbox *e_canvas_vbox;
-
- e_canvas_vbox = E_CANVAS_VBOX (item);
- for ( list = e_canvas_vbox->items; list; list = list->next ) {
- GnomeCanvasItem *child = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(child,
- "width", (double) e_canvas_vbox->width,
- NULL);
- }
-}
-
-static void
-e_canvas_vbox_reflow( GnomeCanvasItem *item, int flags )
-{
- ECanvasVbox *e_canvas_vbox = E_CANVAS_VBOX(item);
- if ( GTK_OBJECT_FLAGS( e_canvas_vbox ) & GNOME_CANVAS_ITEM_REALIZED ) {
-
- gdouble old_height;
- gdouble running_height;
-
- old_height = e_canvas_vbox->height;
-
- running_height = 0;
-
- if (e_canvas_vbox->items == NULL) {
- } else {
- GList *list;
- gdouble item_height;
-
- list = e_canvas_vbox->items;
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- e_canvas_item_move_absolute(GNOME_CANVAS_ITEM(list->data),
- (double) 0,
- (double) running_height);
- running_height += item_height;
- list = g_list_next(list);
-
- for( ; list; list = g_list_next(list)) {
- running_height += e_canvas_vbox->spacing;
-
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
-
- e_canvas_item_move_absolute(GNOME_CANVAS_ITEM(list->data),
- (double) 0,
- (double) running_height);
-
- running_height += item_height;
- }
-
- }
- e_canvas_vbox->height = running_height;
- if (old_height != e_canvas_vbox->height)
- e_canvas_item_request_parent_reflow(item);
- }
-}
-
-void
-e_canvas_vbox_add_item(ECanvasVbox *e_canvas_vbox, GnomeCanvasItem *item)
-{
- if (E_CANVAS_VBOX_CLASS(GTK_OBJECT(e_canvas_vbox)->klass)->add_item)
- (E_CANVAS_VBOX_CLASS(GTK_OBJECT(e_canvas_vbox)->klass)->add_item) (e_canvas_vbox, item);
-}
diff --git a/e-util/e-canvas-vbox.h b/e-util/e-canvas-vbox.h
deleted file mode 100644
index c45baa0b0a..0000000000
--- a/e-util/e-canvas-vbox.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-canvas-vbox.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_CANVAS_VBOX_H__
-#define __E_CANVAS_VBOX_H__
-
-#include <gnome.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ECanvasVbox - A canvas item container.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * width double RW width of the CanvasVbox
- * height double R height of the CanvasVbox
- * spacing double RW Spacing between items.
- */
-
-#define E_CANVAS_VBOX_TYPE (e_canvas_vbox_get_type ())
-#define E_CANVAS_VBOX(obj) (GTK_CHECK_CAST ((obj), E_CANVAS_VBOX_TYPE, ECanvasVbox))
-#define E_CANVAS_VBOX_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CANVAS_VBOX_TYPE, ECanvasVboxClass))
-#define E_IS_CANVAS_VBOX(obj) (GTK_CHECK_TYPE ((obj), E_CANVAS_VBOX_TYPE))
-#define E_IS_CANVAS_VBOX_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CANVAS_VBOX_TYPE))
-
-
-typedef struct _ECanvasVbox ECanvasVbox;
-typedef struct _ECanvasVboxClass ECanvasVboxClass;
-
-struct _ECanvasVbox
-{
- GnomeCanvasGroup parent;
-
- /* item specific fields */
- GList *items; /* Of type GnomeCanvasItem */
-
- double width;
- double height;
- double spacing;
-};
-
-struct _ECanvasVboxClass
-{
- GnomeCanvasGroupClass parent_class;
-
- /* Virtual methods. */
- void (* add_item) (ECanvasVbox *CanvasVbox, GnomeCanvasItem *item);
-};
-
-/*
- * To be added to a CanvasVbox, an item must have the argument "width" as
- * a Read/Write argument and "height" as a Read Only argument. It
- * should also do an ECanvas parent CanvasVbox request if its size
- * changes.
- */
-void e_canvas_vbox_add_item(ECanvasVbox *e_canvas_vbox, GnomeCanvasItem *item);
-GtkType e_canvas_vbox_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CANVAS_VBOX_H__ */
diff --git a/e-util/e-canvas.c b/e-util/e-canvas.c
deleted file mode 100644
index fb67bf0379..0000000000
--- a/e-util/e-canvas.c
+++ /dev/null
@@ -1,696 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-canvas.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-canvas.h"
-static void e_canvas_init (ECanvas *card);
-static void e_canvas_destroy (GtkObject *object);
-static void e_canvas_class_init (ECanvasClass *klass);
-static void e_canvas_realize (GtkWidget *widget);
-static void e_canvas_unrealize (GtkWidget *widget);
-static gint e_canvas_key (GtkWidget *widget,
- GdkEventKey *event);
-
-static gint e_canvas_focus_in (GtkWidget *widget,
- GdkEventFocus *event);
-static gint e_canvas_focus_out (GtkWidget *widget,
- GdkEventFocus *event);
-
-static int emit_event (GnomeCanvas *canvas, GdkEvent *event);
-
-static GnomeCanvasClass *parent_class = NULL;
-
-enum {
- REFLOW,
- LAST_SIGNAL
-};
-
-static guint e_canvas_signals [LAST_SIGNAL] = { 0, };
-
-GtkType
-e_canvas_get_type (void)
-{
- static GtkType canvas_type = 0;
-
- if (!canvas_type)
- {
- static const GtkTypeInfo canvas_info =
- {
- "ECanvas",
- sizeof (ECanvas),
- sizeof (ECanvasClass),
- (GtkClassInitFunc) e_canvas_class_init,
- (GtkObjectInitFunc) e_canvas_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- canvas_type = gtk_type_unique (gnome_canvas_get_type (), &canvas_info);
- }
-
- return canvas_type;
-}
-
-static void
-e_canvas_class_init (ECanvasClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasClass *canvas_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass*) klass;
- canvas_class = (GnomeCanvasClass *) klass;
- widget_class = (GtkWidgetClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_get_type ());
-
- object_class->destroy = e_canvas_destroy;
-
- widget_class->key_press_event = e_canvas_key;
- widget_class->key_release_event = e_canvas_key;
- widget_class->focus_in_event = e_canvas_focus_in;
- widget_class->focus_out_event = e_canvas_focus_out;
- widget_class->realize = e_canvas_realize;
- widget_class->unrealize = e_canvas_unrealize;
-
- klass->reflow = NULL;
-
- e_canvas_signals [REFLOW] =
- gtk_signal_new ("reflow",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ECanvasClass, reflow),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_canvas_signals, LAST_SIGNAL);
-}
-
-static void
-e_canvas_init (ECanvas *canvas)
-{
- canvas->selection = NULL;
- canvas->cursor = NULL;
- canvas->ic = NULL;
- canvas->ic_attr = NULL;
-}
-
-static void
-e_canvas_destroy (GtkObject *object)
-{
- ECanvas *canvas = E_CANVAS(object);
- if (canvas->idle_id)
- g_source_remove(canvas->idle_id);
- if ((GTK_OBJECT_CLASS (parent_class))->destroy)
- (*(GTK_OBJECT_CLASS (parent_class))->destroy) (object);
-}
-
-GtkWidget *
-e_canvas_new ()
-{
- return GTK_WIDGET (gtk_type_new (e_canvas_get_type ()));
-}
-
-
-/* Returns whether the item is an inferior of or is equal to the parent. */
-static int
-is_descendant (GnomeCanvasItem *item, GnomeCanvasItem *parent)
-{
- for (; item; item = item->parent)
- if (item == parent)
- return TRUE;
-
- return FALSE;
-}
-
-/* Emits an event for an item in the canvas, be it the current item, grabbed
- * item, or focused item, as appropriate.
- */
-static int
-emit_event (GnomeCanvas *canvas, GdkEvent *event)
-{
- /*GdkEvent ev;*/
- gint finished;
- GnomeCanvasItem *item;
- GnomeCanvasItem *parent;
- guint mask;
-
- /* Perform checks for grabbed items */
-
- if (canvas->grabbed_item && !is_descendant (canvas->current_item, canvas->grabbed_item))
- return FALSE;
-
- if (canvas->grabbed_item) {
- switch (event->type) {
- case GDK_ENTER_NOTIFY:
- mask = GDK_ENTER_NOTIFY_MASK;
- break;
-
- case GDK_LEAVE_NOTIFY:
- mask = GDK_LEAVE_NOTIFY_MASK;
- break;
-
- case GDK_MOTION_NOTIFY:
- mask = GDK_POINTER_MOTION_MASK;
- break;
-
- case GDK_BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- mask = GDK_BUTTON_PRESS_MASK;
- break;
-
- case GDK_BUTTON_RELEASE:
- mask = GDK_BUTTON_RELEASE_MASK;
- break;
-
- case GDK_KEY_PRESS:
- mask = GDK_KEY_PRESS_MASK;
- break;
-
- case GDK_KEY_RELEASE:
- mask = GDK_KEY_RELEASE_MASK;
- break;
-
- default:
- mask = 0;
- break;
- }
-
- if (!(mask & canvas->grabbed_event_mask))
- return FALSE;
- }
-
- /* Convert to world coordinates -- we have two cases because of diferent
- * offsets of the fields in the event structures.
- */
-
- /*ev = *event;*/
-
- switch (event->type) {
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- gnome_canvas_window_to_world (canvas,
- event->crossing.x,
- event->crossing.y,
- &(event->crossing.x),
- &(event->crossing.y));
- break;
-
- case GDK_MOTION_NOTIFY:
- case GDK_BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- gnome_canvas_window_to_world (canvas,
- event->motion.x,
- event->motion.y,
- &(event->motion.x),
- &(event->motion.y));
- break;
-
- default:
- break;
- }
-
- /* Choose where we send the event */
-
- item = canvas->current_item;
-
- if (canvas->focused_item
- && ((event->type == GDK_KEY_PRESS) || (event->type == GDK_KEY_RELEASE) || (event->type == GDK_FOCUS_CHANGE)))
- item = canvas->focused_item;
-
- /* The event is propagated up the hierarchy (for if someone connected to
- * a group instead of a leaf event), and emission is stopped if a
- * handler returns TRUE, just like for GtkWidget events.
- */
-
- finished = FALSE;
-
- while (item && !finished) {
- gtk_object_ref (GTK_OBJECT (item));
-
- gtk_signal_emit_by_name (GTK_OBJECT (item), "event",
- event,
- &finished);
-
- if (GTK_OBJECT_DESTROYED (item))
- finished = TRUE;
-
- parent = item->parent;
- gtk_object_unref (GTK_OBJECT (item));
-
- item = parent;
- }
-
- return finished;
-}
-
-/* Key event handler for the canvas */
-static gint
-e_canvas_key (GtkWidget *widget, GdkEventKey *event)
-{
- GnomeCanvas *canvas;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (GNOME_IS_CANVAS (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- canvas = GNOME_CANVAS (widget);
-
- return emit_event (canvas, (GdkEvent *) event);
-}
-
-
-/**
- * e_canvas_item_grab_focus:
- * @item: A canvas item.
- *
- * Makes the specified item take the keyboard focus, so all keyboard events will
- * be sent to it. If the canvas widget itself did not have the focus, it grabs
- * it as well.
- **/
-void
-e_canvas_item_grab_focus (GnomeCanvasItem *item)
-{
- GnomeCanvasItem *focused_item;
- GdkEvent ev;
-
- g_return_if_fail (item != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
- g_return_if_fail (GTK_WIDGET_CAN_FOCUS (GTK_WIDGET (item->canvas)));
-
- focused_item = item->canvas->focused_item;
-
- if (focused_item) {
- ev.focus_change.type = GDK_FOCUS_CHANGE;
- ev.focus_change.window = GTK_LAYOUT (item->canvas)->bin_window;
- ev.focus_change.send_event = FALSE;
- ev.focus_change.in = FALSE;
-
- emit_event (item->canvas, &ev);
- }
-
- item->canvas->focused_item = item;
-
- if (!GTK_WIDGET_HAS_FOCUS (GTK_WIDGET(item->canvas))) {
- gtk_widget_grab_focus (GTK_WIDGET (item->canvas));
- }
-
- if (focused_item) {
- ev.focus_change.type = GDK_FOCUS_CHANGE;
- ev.focus_change.window = GTK_LAYOUT (item->canvas)->bin_window;
- ev.focus_change.send_event = FALSE;
- ev.focus_change.in = TRUE;
-
- emit_event (item->canvas, &ev);
- }
-}
-
-/* Focus in handler for the canvas */
-static gint
-e_canvas_focus_in (GtkWidget *widget, GdkEventFocus *event)
-{
- GnomeCanvas *canvas;
- ECanvas *ecanvas;
-
- canvas = GNOME_CANVAS (widget);
- ecanvas = E_CANVAS (widget);
-
- GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
-
- if (ecanvas->ic)
- gdk_im_begin (ecanvas->ic, canvas->layout.bin_window);
-
- if (canvas->focused_item)
- return emit_event (canvas, (GdkEvent *) event);
- else
- return FALSE;
-}
-
-/* Focus out handler for the canvas */
-static gint
-e_canvas_focus_out (GtkWidget *widget, GdkEventFocus *event)
-{
- GnomeCanvas *canvas;
- ECanvas *ecanvas;
-
- canvas = GNOME_CANVAS (widget);
- ecanvas = E_CANVAS (widget);
-
- GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
-
- if (ecanvas->ic)
- gdk_im_end ();
-
- if (canvas->focused_item)
- return emit_event (canvas, (GdkEvent *) event);
- else
- return FALSE;
-}
-
-static void
-e_canvas_realize (GtkWidget *widget)
-{
- ECanvas *ecanvas = E_CANVAS (widget);
-
- if (GTK_WIDGET_CLASS (parent_class)->realize)
- (* GTK_WIDGET_CLASS (parent_class)->realize) (widget);
-
- gdk_window_set_back_pixmap (GTK_LAYOUT (widget)->bin_window, NULL, FALSE);
-
- if (gdk_im_ready () && (ecanvas->ic_attr = gdk_ic_attr_new ()) != NULL) {
- GdkEventMask mask;
- GdkICAttr *attr = ecanvas->ic_attr;
- GdkICAttributesType attrmask = GDK_IC_ALL_REQ;
- GdkIMStyle style;
- GdkIMStyle supported_style = GDK_IM_PREEDIT_NONE |
- GDK_IM_PREEDIT_NOTHING |
- GDK_IM_STATUS_NONE |
- GDK_IM_STATUS_NOTHING;
-
- attr->style = style = gdk_im_decide_style (supported_style);
- attr->client_window = ecanvas->parent.layout.bin_window;
-
- ecanvas->ic = gdk_ic_new (attr, attrmask);
- if (ecanvas->ic != NULL) {
- mask = gdk_window_get_events (attr->client_window);
- mask |= gdk_ic_get_events (ecanvas->ic);
- gdk_window_set_events (attr->client_window, mask);
-
- if (GTK_WIDGET_HAS_FOCUS (widget))
- gdk_im_begin (ecanvas->ic, attr->client_window);
- } else
- g_warning ("Can't create input context.");
- }
-
-}
-
-static void
-e_canvas_unrealize (GtkWidget *widget)
-{
- ECanvas * ecanvas = E_CANVAS (widget);
- if (ecanvas->ic) {
- gdk_ic_destroy (ecanvas->ic);
- ecanvas->ic = NULL;
- }
- if (ecanvas->ic_attr) {
- gdk_ic_attr_destroy (ecanvas->ic_attr);
- ecanvas->ic_attr = NULL;
- }
- if (GTK_WIDGET_CLASS (parent_class)->unrealize)
- (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
-}
-
-static void
-e_canvas_item_invoke_reflow (GnomeCanvasItem *item, int flags)
-{
- GnomeCanvasGroup *group;
- GList *list;
- GnomeCanvasItem *child;
-
- if (GNOME_IS_CANVAS_GROUP (item)) {
- group = GNOME_CANVAS_GROUP (item);
- for (list = group->item_list; list; list = list->next) {
- child = GNOME_CANVAS_ITEM (list->data);
- if (child->object.flags & E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW)
- e_canvas_item_invoke_reflow (child, flags);
- }
- }
-
- if (item->object.flags & E_CANVAS_ITEM_NEEDS_REFLOW) {
- ECanvasItemReflowFunc func;
- func = gtk_object_get_data (GTK_OBJECT (item),
- "ECanvasItem::reflow_callback");
- if (func)
- func (item, flags);
- }
-
- item->object.flags &= ~E_CANVAS_ITEM_NEEDS_REFLOW;
- item->object.flags &= ~E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW;
-}
-
-static void
-do_reflow (ECanvas *canvas)
-{
- if (GNOME_CANVAS(canvas)->root->object.flags & E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW)
- e_canvas_item_invoke_reflow (GNOME_CANVAS(canvas)->root, 0);
-}
-
-/* Idle handler for the e-canvas. It deals with pending reflows. */
-static gint
-idle_handler (gpointer data)
-{
- ECanvas *canvas;
-
- GDK_THREADS_ENTER();
-
- canvas = E_CANVAS (data);
- do_reflow (canvas);
-
- /* Reset idle id */
- canvas->idle_id = 0;
-
- gtk_signal_emit (GTK_OBJECT (canvas),
- e_canvas_signals [REFLOW]);
-
- GDK_THREADS_LEAVE();
-
- return FALSE;
-}
-
-/* Convenience function to add an idle handler to a canvas */
-static void
-add_idle (ECanvas *canvas)
-{
- if (canvas->idle_id != 0)
- return;
-
- canvas->idle_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE, idle_handler, (gpointer) canvas, NULL);
-}
-
-static void
-e_canvas_item_descendent_needs_reflow (GnomeCanvasItem *item)
-{
- if (item->object.flags & E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW)
- return;
-
- item->object.flags |= E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW;
- if (item->parent)
- e_canvas_item_descendent_needs_reflow(item->parent);
-}
-
-void
-e_canvas_item_request_reflow (GnomeCanvasItem *item)
-{
- if (item->object.flags & GNOME_CANVAS_ITEM_REALIZED) {
- item->object.flags |= E_CANVAS_ITEM_NEEDS_REFLOW;
- e_canvas_item_descendent_needs_reflow(item);
- add_idle(E_CANVAS(item->canvas));
- }
-}
-
-void
-e_canvas_item_request_parent_reflow (GnomeCanvasItem *item)
-{
- g_return_if_fail(item != NULL);
- g_return_if_fail(GNOME_IS_CANVAS_ITEM(item));
- e_canvas_item_request_reflow(item->parent);
-}
-
-void
-e_canvas_item_set_reflow_callback (GnomeCanvasItem *item, ECanvasItemReflowFunc func)
-{
- gtk_object_set_data(GTK_OBJECT(item), "ECanvasItem::reflow_callback", (gpointer) func);
-}
-
-
-void
-e_canvas_item_set_selection_callback (GnomeCanvasItem *item, ECanvasItemSelectionFunc func)
-{
- gtk_object_set_data(GTK_OBJECT(item), "ECanvasItem::selection_callback", (gpointer) func);
-}
-
-void
-e_canvas_item_set_selection_compare_callback (GnomeCanvasItem *item, ECanvasItemSelectionCompareFunc func)
-{
- gtk_object_set_data(GTK_OBJECT(item), "ECanvasItem::selection_compare_callback", (gpointer) func);
-}
-
-void
-e_canvas_item_set_cursor (GnomeCanvasItem *item, gpointer id)
-{
- GList *list;
- int flags;
- ECanvas *canvas;
- ECanvasSelectionInfo *info;
- ECanvasItemSelectionFunc func;
-
- g_return_if_fail(item != NULL);
- g_return_if_fail(GNOME_IS_CANVAS_ITEM(item));
- g_return_if_fail(item->canvas != NULL);
- g_return_if_fail(E_IS_CANVAS(item->canvas));
-
- canvas = E_CANVAS(item->canvas);
- flags = E_CANVAS_ITEM_SELECTION_DELETE_DATA;
-
- for (list = canvas->selection; list; list = g_list_next(list)) {
- info = list->data;
-
- func = gtk_object_get_data(GTK_OBJECT(info->item), "ECanvasItem::selection_callback");
- if (func)
- func(info->item, flags, info->id);
- g_message ("ECANVAS: free info (2): item %p, id %p",
- info->item, info->id);
- gtk_object_unref (GTK_OBJECT (info->item));
- g_free(info);
- }
- g_list_free(canvas->selection);
-
- canvas->selection = NULL;
-
- gnome_canvas_item_grab_focus(item);
-
- info = g_new(ECanvasSelectionInfo, 1);
- info->item = item;
- gtk_object_ref (GTK_OBJECT (info->item));
- info->id = id;
- g_message ("ECANVAS: new info item %p, id %p", item, id);
-
- flags = E_CANVAS_ITEM_SELECTION_SELECT | E_CANVAS_ITEM_SELECTION_CURSOR;
- func = gtk_object_get_data(GTK_OBJECT(item), "ECanvasItem::selection_callback");
- if (func)
- func(item, flags, id);
-
- canvas->selection = g_list_prepend(canvas->selection, info);
- canvas->cursor = info;
-}
-
-void
-e_canvas_item_set_cursor_end (GnomeCanvasItem *item, gpointer id)
-{
-}
-
-void
-e_canvas_item_add_selection (GnomeCanvasItem *item, gpointer id)
-{
- int flags;
- ECanvas *canvas;
- ECanvasSelectionInfo *info;
- ECanvasItemSelectionFunc func;
- GList *list;
-
- g_return_if_fail(item != NULL);
- g_return_if_fail(GNOME_IS_CANVAS_ITEM(item));
- g_return_if_fail(item->canvas != NULL);
- g_return_if_fail(E_IS_CANVAS(item->canvas));
-
- flags = E_CANVAS_ITEM_SELECTION_SELECT;
- canvas = E_CANVAS(item->canvas);
-
- if (canvas->cursor) {
- func = gtk_object_get_data(GTK_OBJECT(canvas->cursor->item), "ECanvasItem::selection_callback");
- if (func)
- func(canvas->cursor->item, flags, canvas->cursor->id);
- }
-
- gnome_canvas_item_grab_focus(item);
-
- flags = E_CANVAS_ITEM_SELECTION_SELECT | E_CANVAS_ITEM_SELECTION_CURSOR;
-
- for (list = canvas->selection; list; list = g_list_next(list)) {
- ECanvasSelectionInfo *search;
- search = list->data;
-
- if (search->item == item) {
- ECanvasItemSelectionCompareFunc compare_func;
- compare_func = gtk_object_get_data(GTK_OBJECT(search->item), "ECanvasItem::selection_compare_callback");
-
- if (compare_func(search->item, search->id, id, 0) == 0) {
- canvas->cursor = search;
- func = gtk_object_get_data(GTK_OBJECT(item), "ECanvasItem::selection_callback");
- if (func)
- func(item, flags, search->id);
- return;
- }
- }
- }
-
- info = g_new(ECanvasSelectionInfo, 1);
- info->item = item;
- gtk_object_ref (GTK_OBJECT (info->item));
- info->id = id;
- g_message ("ECANVAS: new info (2): item %p, id %p", item, id);
-
- func = gtk_object_get_data(GTK_OBJECT(item), "ECanvasItem::selection_callback");
- if (func)
- func(item, flags, id);
-
- canvas->selection = g_list_prepend(canvas->selection, info);
- canvas->cursor = info;
-}
-
-void
-e_canvas_item_remove_selection (GnomeCanvasItem *item, gpointer id)
-{
- int flags;
- ECanvas *canvas;
- ECanvasSelectionInfo *info;
- GList *list;
-
- g_return_if_fail(item != NULL);
- g_return_if_fail(GNOME_IS_CANVAS_ITEM(item));
- g_return_if_fail(item->canvas != NULL);
- g_return_if_fail(E_IS_CANVAS(item->canvas));
-
- flags = E_CANVAS_ITEM_SELECTION_DELETE_DATA;
- canvas = E_CANVAS(item->canvas);
-
- for (list = canvas->selection; list; list = g_list_next(list)) {
- info = list->data;
-
- if (info->item == item) {
- ECanvasItemSelectionCompareFunc compare_func;
- compare_func = gtk_object_get_data(GTK_OBJECT(info->item), "ECanvasItem::selection_compare_callback");
-
- if (compare_func(info->item, info->id, id, 0) == 0) {
- ECanvasItemSelectionFunc func;
- func = gtk_object_get_data(GTK_OBJECT(info->item), "ECanvasItem::selection_callback");
- if (func)
- func(info->item, flags, info->id);
- canvas->selection = g_list_remove_link(canvas->selection, list);
-
- if (canvas->cursor == info)
- canvas->cursor = NULL;
-
- g_message ("ECANVAS: removing info: item %p, info %p",
- info->item, info->id);
- gtk_object_unref (GTK_OBJECT (info->item));
- g_free(info);
- g_list_free_1(list);
- break;
- }
- }
- }
-}
diff --git a/e-util/e-canvas.h b/e-util/e-canvas.h
deleted file mode 100644
index b13a9dd2ab..0000000000
--- a/e-util/e-canvas.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-canvas.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_CANVAS_H__
-#define __E_CANVAS_H__
-
-#include <gnome.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ECanvas - A class derived from canvas for the purpose of adding
- * evolution specific canvas hacks.
- */
-
-#define E_CANVAS_TYPE (e_canvas_get_type ())
-#define E_CANVAS(obj) (GTK_CHECK_CAST ((obj), E_CANVAS_TYPE, ECanvas))
-#define E_CANVAS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CANVAS_TYPE, ECanvasClass))
-#define E_IS_CANVAS(obj) (GTK_CHECK_TYPE ((obj), E_CANVAS_TYPE))
-#define E_IS_CANVAS_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CANVAS_TYPE))
-
-typedef void (*ECanvasItemReflowFunc) (GnomeCanvasItem *item,
- gint flags);
-
-typedef void (*ECanvasItemSelectionFunc) (GnomeCanvasItem *item,
- gint flags,
- gpointer user_data);
-/* Returns the same as strcmp does. */
-typedef gint (*ECanvasItemSelectionCompareFunc) (GnomeCanvasItem *item,
- gpointer data1,
- gpointer data2,
- gint flags);
-
-
-typedef struct _ECanvas ECanvas;
-typedef struct _ECanvasClass ECanvasClass;
-
-/* Object flags for items */
-enum {
- E_CANVAS_ITEM_NEEDS_REFLOW = 1 << 13,
- E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW = 1 << 14
-};
-
-enum {
- E_CANVAS_ITEM_SELECTION_SELECT = 1 << 0, /* TRUE = select. FALSE = unselect. */
- E_CANVAS_ITEM_SELECTION_CURSOR = 1 << 1, /* TRUE = has become cursor. FALSE = not cursor. */
- E_CANVAS_ITEM_SELECTION_DELETE_DATA = 1 << 2,
-};
-
-typedef struct {
- GnomeCanvasItem *item;
- gpointer id;
-} ECanvasSelectionInfo;
-
-struct _ECanvas
-{
- GnomeCanvas parent;
-
- int idle_id;
- GList *selection;
- ECanvasSelectionInfo *cursor;
-
- /* Input context for dead key support */
- GdkIC *ic;
- GdkICAttr *ic_attr;
-};
-
-struct _ECanvasClass
-{
- GnomeCanvasClass parent_class;
- void (* reflow) (ECanvas *canvas);
-};
-
-
-GtkType e_canvas_get_type (void);
-GtkWidget *e_canvas_new (void);
-
-/* Used to send all of the keystroke events to a specific item as well as
- * GDK_FOCUS_CHANGE events.
- */
-void e_canvas_item_grab_focus (GnomeCanvasItem *item);
-
-void e_canvas_item_request_reflow (GnomeCanvasItem *item);
-void e_canvas_item_request_parent_reflow (GnomeCanvasItem *item);
-void e_canvas_item_set_reflow_callback (GnomeCanvasItem *item, ECanvasItemReflowFunc func);
-
-void e_canvas_item_set_selection_callback (GnomeCanvasItem *item, ECanvasItemSelectionFunc func);
-void e_canvas_item_set_selection_compare_callback (GnomeCanvasItem *item, ECanvasItemSelectionCompareFunc func);
-
-void e_canvas_item_set_cursor (GnomeCanvasItem *item, gpointer id);
-void e_canvas_item_add_selection (GnomeCanvasItem *item, gpointer id);
-void e_canvas_item_remove_selection (GnomeCanvasItem *item, gpointer id);
-
-/* Not implemented yet. */
-void e_canvas_item_set_cursor_end (GnomeCanvasItem *item, gpointer id);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CANVAS_H__ */
diff --git a/e-util/e-cursors.c b/e-util/e-cursors.c
deleted file mode 100644
index 56a5015cbd..0000000000
--- a/e-util/e-cursors.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * cursors.c: cursor handling for Evolution.
- * copied from Gnumeric.
- *
- * Authors:
- * Miguel de Icaza (miguel@gnu.org)
- */
-#include <config.h>
-#include <gnome.h>
-#include "e-cursors.h"
-
-static GdkColor black, white;
-
-#define GDK_INTERNAL_CURSOR -1
-
-typedef struct {
- GdkCursor *cursor;
- int hot_x, hot_y;
- char **xpm;
-} CursorDef;
-
-static CursorDef cursors [] = {
- { NULL, GDK_INTERNAL_CURSOR, GDK_CROSSHAIR, NULL },
- { NULL, GDK_INTERNAL_CURSOR, GDK_LEFT_PTR, NULL },
- { NULL, GDK_INTERNAL_CURSOR, GDK_FLEUR, NULL },
- { NULL, GDK_INTERNAL_CURSOR, GDK_SB_H_DOUBLE_ARROW, NULL },
- { NULL, GDK_INTERNAL_CURSOR, GDK_SB_V_DOUBLE_ARROW, NULL },
- { NULL, 0, 0, NULL }
-};
-
-static int inited = FALSE;
-
-static void
-create_bitmap_and_mask_from_xpm (GdkBitmap **bitmap, GdkBitmap **mask, gchar **xpm)
-{
- int height, width, colors;
- char pixmap_buffer [(32 * 32)/8];
- char mask_buffer [(32 * 32)/8];
- int x, y, pix, yofs;
- int transparent_color, black_color;
-
- sscanf (xpm [0], "%d %d %d %d", &height, &width, &colors, &pix);
-
- g_assert (height == 32);
- g_assert (width == 32);
- g_assert (colors <= 3);
-
- transparent_color = ' ';
- black_color = '.';
-
- yofs = colors + 1;
- for (y = 0; y < 32; y++){
- for (x = 0; x < 32;){
- char value = 0, maskv = 0;
-
- for (pix = 0; pix < 8; pix++, x++){
- if (xpm [y + yofs][x] != transparent_color){
- maskv |= 1 << pix;
-
- /*
- * Invert the colours here because it seems
- * to workaround a bug the Matrox G100 Xserver?
- * We reverse the foreground & background in the next
- * routine to compensate.
- */
- if (xpm [y + yofs][x] == black_color){
- value |= 1 << pix;
- }
- }
- }
- pixmap_buffer [(y * 4 + x/8)-1] = value;
- mask_buffer [(y * 4 + x/8)-1] = maskv;
- }
- }
- *bitmap = gdk_bitmap_create_from_data (NULL, pixmap_buffer, 32, 32);
- *mask = gdk_bitmap_create_from_data (NULL, mask_buffer, 32, 32);
-}
-
-void
-e_cursors_init (void)
-{
- GdkColormap *colormap;
- int i;
-
- colormap = gtk_widget_get_default_colormap ();
- gdk_color_white (colormap, &white);
- gdk_color_black (colormap, &black);
-
- for (i = 0; cursors [i].hot_x; i++){
- GdkBitmap *bitmap, *mask;
-
- if (cursors [i].hot_x < 0)
- cursors [i].cursor = gdk_cursor_new (cursors [i].hot_y);
- else {
- create_bitmap_and_mask_from_xpm (&bitmap, &mask, cursors [i].xpm);
-
- /* The foreground and background colours are reversed.
- * See comment above for explanation.
- */
- cursors [i].cursor =
- gdk_cursor_new_from_pixmap (
- bitmap, mask,
- &black, &white,
- cursors [i].hot_x,
- cursors [i].hot_y);
- }
- }
-
- inited = TRUE;
-
- g_assert (i == E_NUM_CURSORS);
-}
-
-void
-e_cursors_shutdown (void)
-{
- int i;
-
- for (i = 0; cursors [i].hot_x; i++)
- gdk_cursor_destroy (cursors [i].cursor);
-}
-
-
-/* Returns a cursor given its type */
-GdkCursor *
-e_cursor_get (ECursorType type)
-{
- g_return_val_if_fail (type >= 0 && type < E_NUM_CURSORS, NULL);
-
- if (!inited)
- g_warning ("e_cursors_init not called");
-
- return cursors [type].cursor;
-}
diff --git a/e-util/e-cursors.h b/e-util/e-cursors.h
deleted file mode 100644
index 771e5f6d4d..0000000000
--- a/e-util/e-cursors.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef E_CURSORS_H
-#define E_CURSORS_H
-
-/* Copied from Gnumeric */
-
-typedef enum {
- E_CURSOR_THIN_CROSS,
- E_CURSOR_ARROW,
- E_CURSOR_MOVE,
- E_CURSOR_SIZE_X,
- E_CURSOR_SIZE_Y,
- E_NUM_CURSORS
-} ECursorType;
-
-void e_cursors_init (void);
-void e_cursors_shutdown (void);
-
-#define e_cursor_set(win, c) \
-G_STMT_START { \
- if (win) \
- gdk_window_set_cursor (win, e_cursor_get (c)); \
-} G_STMT_END
-
-#define e_cursor_set_widget(w, c) \
-G_STMT_START { \
- if (GTK_WIDGET (w)->window) \
- gdk_window_set_cursor (GTK_WIDGET (w)->window, e_cursor_get (c)); \
-} G_STMT_END
-
-GdkCursor *e_cursor_get (ECursorType type);
-
-#endif /* E_CURSORS_H */
-
diff --git a/e-util/e-dialog-widgets.c b/e-util/e-dialog-widgets.c
deleted file mode 100644
index 19c698af02..0000000000
--- a/e-util/e-dialog-widgets.c
+++ /dev/null
@@ -1,824 +0,0 @@
-/* Evolution internal utilities - Glade dialog widget utilities
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@gimp.org>
- *
- * 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.
- */
-
-#include <config.h>
-#include <math.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 "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 (GtkObject *dialog, gpointer data)
-{
- DialogHooks *hooks;
-
- hooks = data;
-
- g_slist_free (hooks->whooks);
- hooks->whooks = NULL;
-
- g_free (hooks);
- gtk_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 = gtk_object_get_data (GTK_OBJECT (dialog), "dialog-hooks");
- if (!hooks) {
- hooks = g_new0 (DialogHooks, 1);
- gtk_object_set_data (GTK_OBJECT (dialog), "dialog-hooks", hooks);
- gtk_signal_connect (GTK_OBJECT (dialog), "destroy",
- GTK_SIGNAL_FUNC (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)
-{
- GSList *group;
- GSList *l;
- int *value;
- const int *value_map;
-
- group = gtk_radio_button_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)
- gtk_signal_connect (GTK_OBJECT (l->data), "toggled",
- GTK_SIGNAL_FUNC (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)
-{
- int *value;
- const int *value_map;
-
- /* 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)
- gtk_signal_connect (GTK_OBJECT (l->data), "activate",
- GTK_SIGNAL_FUNC (activate_cb), dialog);
- }
-}
-
-/* Gets the value of an option menu */
-static void
-get_option_menu_value (GtkOptionMenu *omenu, gpointer value_var, gpointer info)
-{
- int *value;
- const int *value_map;
-
- 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))
- gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
- GTK_SIGNAL_FUNC (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))
- gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
- GTK_SIGNAL_FUNC (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))
- gtk_signal_connect (GTK_OBJECT (editable), "changed",
- GTK_SIGNAL_FUNC (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, char *value)
-{
- 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) {
- gint pos;
-
- pos = 0;
- 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.
- **/
-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;
- int i;
- GSList *l;
-
- 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_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;
- GSList *l;
- int i;
- int 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_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;
- }
-
- if (!l)
- g_assert_not_reached ();
-
- /* 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;
- gtk_signal_emit_by_name (GTK_OBJECT (adj), "value_changed");
-}
-
-/**
- * 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;
- }
-
- if (!l)
- g_assert_not_reached ();
-
- 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 cbcdd1c8f1..0000000000
--- a/e-util/e-dialog-widgets.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Evolution internal utilities - Glade dialog widget utilities
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Federico Mena-Quintero <federico@gimp.org>
- *
- * 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_DIALOG_WIDGETS_H
-#define E_DIALOG_WIDGETS_H
-
-#include <time.h>
-#include <glade/glade.h>
-#include <libgnomeui/gnome-propertybox.h>
-
-
-
-void e_dialog_editable_set (GtkWidget *widget, 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-font.c b/e-util/e-font.c
deleted file mode 100644
index a13f0b962c..0000000000
--- a/e-util/e-font.c
+++ /dev/null
@@ -1,128 +0,0 @@
-#define _E_FONT_C_
-
-/*
- * e-font
- *
- * Temporary wrappers around GdkFonts to get unicode displaying
- *
- * Author: Lauris Kaplinski <lauris@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- */
-
-#include <unicode.h>
-#include "e-font.h"
-
-struct _EFont {
- GdkFont font;
-};
-
-EFont *
-e_font_from_gdk_name (const gchar *name)
-{
- GdkFont *font;
-
- font = gdk_fontset_load (name);
-
- return (EFont *) font;
-}
-
-EFont *
-e_font_from_gdk_font (GdkFont *font)
-{
- gdk_font_ref (font);
-
- return (EFont *) font;
-}
-
-void
-e_font_ref (EFont *font)
-{
- gdk_font_ref (&font->font);
-}
-
-void
-e_font_unref (EFont *font)
-{
- gdk_font_unref (&font->font);
-}
-
-gint
-e_font_ascent (EFont * font)
-{
- return font->font.ascent;
-}
-
-gint
-e_font_descent (EFont * font)
-{
- return font->font.descent;
-}
-
-void
-e_font_draw_utf8_text (GdkDrawable *drawable, EFont *font, EFontStyle style, GdkGC *gc, gint x, gint y, gchar *text, gint numbytes)
-{
- guchar *iso;
- gchar *p;
- gint uni, len;
-
- g_return_if_fail (drawable != NULL);
- g_return_if_fail (font != NULL);
- g_return_if_fail (gc != NULL);
- g_return_if_fail (text != NULL);
-
- if (numbytes < 1) return;
-
- iso = alloca (numbytes);
-
- for (len = 0, p = text; p != NULL && p < (text + numbytes); len++, p = unicode_next_utf8 (p)) {
- unicode_get_utf8 (p, &uni);
- if ((uni < ' ') || (uni > 255)) uni = ' ';
- iso[len] = uni;
- }
-
- gdk_draw_text (drawable, &font->font, gc, x, y, iso, len);
-
- if (style & E_FONT_BOLD)
- gdk_draw_text (drawable, &font->font, gc, x + 1, y, iso, len);
-}
-
-gint
-e_font_utf8_text_width (EFont *font, EFontStyle style, char *text, int numbytes)
-{
- guchar *iso;
- gchar *p;
- gint uni, len;
-
- iso = alloca (numbytes);
-
- for (len = 0, p = text; p != NULL && p < (text + numbytes); len++, p = unicode_next_utf8 (p)) {
- unicode_get_utf8 (p, &uni);
- if ((uni < ' ') || (uni > 255)) uni = ' ';
- iso[len] = uni;
- }
-
- return gdk_text_width (&font->font, iso, len);
-}
-
-gint
-e_font_utf8_char_width (EFont *font, EFontStyle style, char *text)
-{
- unicode_char_t uni;
- guchar iso;
-
- if (!unicode_get_utf8 (text, &uni)) return 0;
-
- if ((uni < ' ') || (uni > 255)) uni = ' ';
-
- iso = uni;
-
- return gdk_text_width (&font->font, &iso, 1);
-}
-
-
-
-
-
-
diff --git a/e-util/e-font.h b/e-util/e-font.h
deleted file mode 100644
index 9616e9ef4b..0000000000
--- a/e-util/e-font.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef _E_FONT_H_
-#define _E_FONT_H_
-
-/*
- * e-font
- *
- * Temporary wrappers around GdkFonts to get unicode displaying
- *
- * Author: Lauris Kaplinski <lauris@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- */
-
-#include <glib.h>
-#include <gdk/gdk.h>
-#include <libgnome/gnome-defs.h>
-
-BEGIN_GNOME_DECLS
-
-typedef struct _EFont EFont;
-
-/*
- * We use very primitive styling here, enough for marking read/unread lines
- */
-
-typedef enum {
- E_FONT_PLAIN = 0,
- E_FONT_BOLD = (1 << 0),
- E_FONT_ITALIC = (1 << 4)
-} EFontStyle;
-
-EFont * e_font_from_gdk_name (const gchar *name);
-EFont * e_font_from_gdk_font (GdkFont *font);
-
-void e_font_ref (EFont *font);
-void e_font_unref (EFont *font);
-
-gint e_font_ascent (EFont * font);
-gint e_font_descent (EFont * font);
-
-#define e_font_height(f) (e_font_ascent (f) + e_font_descent (f))
-
-/*
- * NB! UTF-8 text widths are given in chars, not bytes
- */
-
-void e_font_draw_utf8_text (GdkDrawable *drawable,
- EFont *font, EFontStyle style,
- GdkGC *gc,
- gint x, gint y,
- gchar *text,
- gint numbytes);
-
-int e_font_utf8_text_width (EFont *font, EFontStyle style,
- char *text,
- int numbytes);
-
-int e_font_utf8_char_width (EFont *font, EFontStyle style,
- char *text);
-
-END_GNOME_DECLS
-
-#endif
diff --git a/e-util/e-gui-utils.c b/e-util/e-gui-utils.c
deleted file mode 100644
index 2e31eb101b..0000000000
--- a/e-util/e-gui-utils.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * GUI utility functions
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- *
- * (C) 1999 Miguel de Icaza
- * (C) 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <libgnomeui/gnome-messagebox.h>
-#include <libgnomeui/gnome-stock.h>
-#include <gnome.h>
-#include "e-gui-utils.h"
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
-
-void
-e_notice (GtkWindow *window, const char *type, const char *format, ...)
-{
- GtkWidget *dialog;
- va_list args;
- char *str;
-
- va_start (args, format);
- str = g_strdup_vprintf (format, args);
- dialog = gnome_message_box_new (str, type, GNOME_STOCK_BUTTON_OK, NULL);
- va_end (args);
- g_free (str);
-
- if (window)
- gnome_dialog_set_parent (GNOME_DIALOG (dialog), window);
-
- gnome_dialog_run (GNOME_DIALOG (dialog));
-}
-
-static void
-kill_popup_menu (GtkWidget *widget, GtkMenu *menu)
-{
- g_return_if_fail (menu != NULL);
- g_return_if_fail (GTK_IS_MENU (menu));
-
- gtk_object_unref (GTK_OBJECT (menu));
-}
-
-void
-e_auto_kill_popup_menu_on_hide (GtkMenu *menu)
-{
- g_return_if_fail (menu != NULL);
- g_return_if_fail (GTK_IS_MENU (menu));
-
- gtk_signal_connect (GTK_OBJECT (menu), "hide",
- GTK_SIGNAL_FUNC (kill_popup_menu), menu);
-}
-
-void
-e_popup_menu (GtkMenu *menu, GdkEventButton *event)
-{
- g_return_if_fail (menu != NULL);
- g_return_if_fail (GTK_IS_MENU (menu));
-
- e_auto_kill_popup_menu_on_hide (menu);
- gtk_menu_popup (menu, NULL, NULL, 0, NULL, event->button, event->time);
-}
-
-GtkWidget *e_create_image_widget(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2)
-{
- char *filename;
- GdkPixbuf *pixbuf;
- double width, height;
- GtkWidget *canvas, *alignment;
- if (string1) {
- if (*string1 == '/')
- filename = g_strdup(string1);
- else
- filename = g_concat_dir_and_file(EVOLUTION_IMAGES, string1);
- pixbuf = gdk_pixbuf_new_from_file(filename);
- width = gdk_pixbuf_get_width(pixbuf);
- height = gdk_pixbuf_get_height(pixbuf);
-
- canvas = gnome_canvas_new_aa();
- GTK_OBJECT_UNSET_FLAGS(GTK_WIDGET(canvas), GTK_CAN_FOCUS);
- gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(canvas)),
- gnome_canvas_pixbuf_get_type(),
-
- "pixbuf", pixbuf,
- NULL);
-
- alignment = gtk_widget_new(gtk_alignment_get_type(),
- "child", canvas,
- "xalign", (double) 0,
- "yalign", (double) 0,
- "xscale", (double) 0,
- "yscale", (double) 0,
- NULL);
-
- gtk_widget_set_usize(canvas, width, height);
-
- gdk_pixbuf_unref(pixbuf);
-
- gtk_widget_show(canvas);
- gtk_widget_show(alignment);
- g_free(filename);
-
- return alignment;
- } else
- return NULL;
-}
-
-typedef struct {
- GtkCallback callback;
- gpointer closure;
-} CallbackClosure;
-
-static void
-e_container_foreach_leaf_callback(GtkWidget *widget, CallbackClosure *callback_closure)
-{
- if (GTK_IS_CONTAINER(widget)) {
- e_container_foreach_leaf(GTK_CONTAINER(widget), callback_closure->callback, callback_closure->closure);
- } else {
- (*callback_closure->callback) (widget, callback_closure->closure);
- }
-}
-
-void
-e_container_foreach_leaf(GtkContainer *container,
- GtkCallback callback,
- gpointer closure)
-{
- CallbackClosure callback_closure;
- callback_closure.callback = callback;
- callback_closure.closure = closure;
- gtk_container_foreach(container, (GtkCallback) e_container_foreach_leaf_callback, &callback_closure);
-}
-
-static void
-e_container_change_tab_order_destroy_notify(gpointer data)
-{
- GList *list = data;
- g_list_foreach(list, (GFunc) gtk_object_unref, NULL);
- g_list_free(list);
-}
-
-
-static gint
-e_container_change_tab_order_callback(GtkContainer *container,
- GtkDirectionType direction,
- GList *children)
-{
- GtkWidget *focus_child;
- GtkWidget *child;
-
- if (direction != GTK_DIR_TAB_FORWARD &&
- direction != GTK_DIR_TAB_BACKWARD)
- return FALSE;
-
- focus_child = container->focus_child;
-
- if (direction == GTK_DIR_TAB_BACKWARD) {
- children = g_list_last(children);
- }
-
- while (children) {
- child = children->data;
- if (direction == GTK_DIR_TAB_FORWARD)
- children = children->next;
- else
- children = children->prev;
-
- if (!child)
- continue;
-
- if (focus_child) {
- if (focus_child == child) {
- focus_child = NULL;
-
- if (GTK_WIDGET_DRAWABLE (child) &&
- GTK_IS_CONTAINER (child) &&
- !GTK_WIDGET_HAS_FOCUS (child))
- if (gtk_container_focus (GTK_CONTAINER (child), direction)) {
- gtk_signal_emit_stop_by_name(GTK_OBJECT(container), "focus");
- return TRUE;
- }
- }
- }
- else if (GTK_WIDGET_DRAWABLE (child)) {
- if (GTK_IS_CONTAINER (child)) {
- if (gtk_container_focus (GTK_CONTAINER (child), direction)) {
- gtk_signal_emit_stop_by_name(GTK_OBJECT(container), "focus");
- return TRUE;
- }
- }
- else if (GTK_WIDGET_CAN_FOCUS (child)) {
- gtk_widget_grab_focus (child);
- gtk_signal_emit_stop_by_name(GTK_OBJECT(container), "focus");
- return TRUE;
- }
- }
- }
-
- return FALSE;
-}
-
-gint
-e_container_change_tab_order(GtkContainer *container, GList *widgets)
-{
- GList *list;
- list = g_list_copy(widgets);
- g_list_foreach(list, (GFunc) gtk_object_ref, NULL);
- return gtk_signal_connect_full(GTK_OBJECT(container), "focus",
- GTK_SIGNAL_FUNC(e_container_change_tab_order_callback),
- NULL, list,
- e_container_change_tab_order_destroy_notify,
- FALSE, FALSE);
-}
diff --git a/e-util/e-gui-utils.h b/e-util/e-gui-utils.h
deleted file mode 100644
index 1d47a7b514..0000000000
--- a/e-util/e-gui-utils.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef E_GUI_UTILS_H
-#define E_GUI_UTILS_H
-
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkwindow.h>
-
-#include <libgnomeui/gnome-messagebox.h>
-
-void e_popup_menu (GtkMenu *menu, GdkEventButton *event);
-void e_auto_kill_popup_menu_on_hide (GtkMenu *menu);
-void e_notice (GtkWindow *window, const char *type, const char *format, ...);
-GtkWidget *e_create_image_widget (gchar *name, gchar *string1, gchar *string2, gint int1, gint int2);
-void e_container_foreach_leaf (GtkContainer *container,
- GtkCallback callback,
- gpointer closure);
-gint e_container_change_tab_order (GtkContainer *container,
- GList *widgets);
-
-#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 91cb00aa4b..0000000000
--- a/e-util/e-html-utils.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-html-utils.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Dan Winship <danw@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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-html-utils.h"
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <glib.h>
-
-static int etth_interesting[] = {
- 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x00 - 0x0f */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */
- 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* sp - / */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 2, 1, 2, /* 0 - ? */
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ - O */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, /* P - _ */
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ` - o */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, /* p - del */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x80 - 0x8f */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x90 - 0x9f */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xa0 - 0xaf */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xb0 - 0xbf */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xc0 - 0xcf */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xd0 - 0xdf */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 /* 0xf0 - 0xff */
-};
-#define ETTH_SPECIAL 1
-#define ETTH_PUNCTUATION 2
-#define ETTH_ESCAPED 3
-#define ETTH_EOF 4
-
-static char *
-check_size (char **buffer, int *buffer_size, char *out, int len)
-{
- if (out + len > *buffer + *buffer_size) {
- int index = out - *buffer;
-
- *buffer_size *= 2;
- *buffer = g_realloc (*buffer, *buffer_size);
- out = *buffer + index;
- }
- return out;
-}
-
-static char *
-url_extract (const unsigned char **text, gboolean check)
-{
- const unsigned char *end = *text, *p;
- char *out;
-
- while (*end && !isspace (*end) && *end != '"')
- end++;
-
- /* Back up if we probably went too far. */
- while (end > *text && strchr (",.!?;:>)", *(end - 1)))
- end--;
-
- if (check) {
- /* Make sure we weren't fooled. */
- p = memchr (*text, ':', end - *text);
- if (!p || end - p < 3)
- return NULL;
- }
-
- out = g_strndup (*text, end - *text);
- *text = end;
- return out;
-}
-
-/**
- * e_text_to_html:
- * @input: a NUL-terminated input buffer
- * @flags: some combination of the E_TEXT_TO_HTML_* flags defined
- * in e-html-utils.h
- *
- * 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.
- **/
-char *
-e_text_to_html (const char *input, unsigned int flags)
-{
- const unsigned char *cur = input, *end;
- char *buffer = NULL;
- char *out = NULL;
- int buffer_size = 0, col;
-
- /* 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>\n");
-
- col = 0;
- while (*cur) {
- if (isalpha (*cur) && (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)) {
- tmpurl = url_extract (&cur, TRUE);
- if (tmpurl) {
- refurl = e_text_to_html (tmpurl, 0);
- dispurl = g_strdup (refurl);
- }
- } else if (!strncasecmp (cur, "www.", 4) &&
- isalnum (*(cur + 4))) {
- tmpurl = url_extract (&cur, FALSE);
- 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);
- }
- }
-
- /* Skip until we need to care. */
- end = cur;
- while (!etth_interesting[*end] ||
- (etth_interesting[*end] == ETTH_PUNCTUATION &&
- !(flags & E_TEXT_TO_HTML_CONVERT_URLS)))
- end++;
-
- out = check_size (&buffer, &buffer_size, out,
- end - cur + 10);
- memcpy (out, cur, end - cur);
- out += end - cur;
- col += end - cur;
-
- if (!*end)
- break;
- cur = end;
-
- switch (*cur) {
- 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;
- 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, 6);
- 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') {
- strcpy (out, "&nbsp;");
- out += 6;
- col++;
- break;
- }
- }
- /* otherwise, FALL THROUGH */
-
- default:
- if ((*cur >= 0x20 && *cur < 0x80) ||
- (*cur == '\r' || *cur == '\t')) {
- /* Default case, just copy. */
- *out++ = *cur;
- } else
- out += g_snprintf(out, 9, "&#%d;", *cur);
- col++;
- break;
- }
-
- cur++;
- }
-
- out = check_size (&buffer, &buffer_size, out, 7);
- if (flags & E_TEXT_TO_HTML_PRE)
- strcpy (out, "</PRE>");
- else
- *out = '\0';
-
- return buffer;
-}
diff --git a/e-util/e-html-utils.h b/e-util/e-html-utils.h
deleted file mode 100644
index a56889f4d9..0000000000
--- a/e-util/e-html-utils.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-html-utils.c */
-/*
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Dan Winship <danw@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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__
-
-#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)
-
-char *e_text_to_html (const char *input, unsigned int flags);
-
-#endif /* __E_HTML_UTILS__ */
diff --git a/e-util/e-iterator.c b/e-util/e-iterator.c
deleted file mode 100644
index 874d05ccea..0000000000
--- a/e-util/e-iterator.c
+++ /dev/null
@@ -1,186 +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 Helix Code, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#include <config.h>
-#include <gtk/gtk.h>
-
-#include "e-iterator.h"
-
-#define ECI_CLASS(object) (E_ITERATOR_CLASS(GTK_OBJECT((object))->klass))
-
-static void e_iterator_init (EIterator *card);
-static void e_iterator_class_init (EIteratorClass *klass);
-
-#define PARENT_TYPE (gtk_object_get_type ())
-
-static GtkObjectClass *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.
- **/
-GtkType
-e_iterator_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type) {
- GtkTypeInfo info = {
- "EIterator",
- sizeof (EIterator),
- sizeof (EIteratorClass),
- (GtkClassInitFunc) e_iterator_class_init,
- (GtkObjectInitFunc) e_iterator_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-static void
-e_iterator_class_init (EIteratorClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- e_iterator_signals [INVALIDATE] =
- gtk_signal_new ("invalidate",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EIteratorClass, invalidate),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_iterator_signals, LAST_SIGNAL);
-
- klass->invalidate = NULL;
- klass->get = NULL;
- klass->reset = NULL;
- klass->last = NULL;
- klass->next = NULL;
- klass->prev = NULL;
- klass->delete = 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 (ECI_CLASS(iterator)->get)
- return ECI_CLASS(iterator)->get(iterator);
- else
- return NULL;
-}
-
-void
-e_iterator_reset (EIterator *iterator)
-{
- if (ECI_CLASS(iterator)->reset)
- ECI_CLASS(iterator)->reset(iterator);
-}
-
-void
-e_iterator_last (EIterator *iterator)
-{
- if (ECI_CLASS(iterator)->last)
- ECI_CLASS(iterator)->last(iterator);
-}
-
-gboolean
-e_iterator_next (EIterator *iterator)
-{
- if (ECI_CLASS(iterator)->next)
- return ECI_CLASS(iterator)->next(iterator);
- else
- return FALSE;
-}
-
-gboolean
-e_iterator_prev (EIterator *iterator)
-{
- if (ECI_CLASS(iterator)->prev)
- return ECI_CLASS(iterator)->prev(iterator);
- else
- return FALSE;
-}
-
-void
-e_iterator_delete (EIterator *iterator)
-{
- if (ECI_CLASS(iterator)->delete)
- ECI_CLASS(iterator)->delete(iterator);
-}
-
-void e_iterator_insert (EIterator *iterator,
- const void *object,
- gboolean before)
-{
- if (ECI_CLASS(iterator)->insert)
- ECI_CLASS(iterator)->insert(iterator, object, before);
-}
-
-void
-e_iterator_set (EIterator *iterator,
- const void *object)
-{
- if (ECI_CLASS(iterator)->set)
- ECI_CLASS(iterator)->set(iterator, object);
-}
-
-gboolean
-e_iterator_is_valid (EIterator *iterator)
-{
- if (ECI_CLASS(iterator)->is_valid)
- return ECI_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));
-
- gtk_signal_emit (GTK_OBJECT (iterator),
- e_iterator_signals [INVALIDATE]);
-}
diff --git a/e-util/e-iterator.h b/e-util/e-iterator.h
deleted file mode 100644
index 84a2db142b..0000000000
--- a/e-util/e-iterator.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#ifndef __E_ITERATOR_H__
-#define __E_ITERATOR_H__
-
-#include <time.h>
-#include <gtk/gtk.h>
-#include <stdio.h>
-
-#define E_TYPE_ITERATOR (e_iterator_get_type ())
-#define E_ITERATOR(obj) (GTK_CHECK_CAST ((obj), E_TYPE_ITERATOR, EIterator))
-#define E_ITERATOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_ITERATOR, EIteratorClass))
-#define E_IS_ITERATOR(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_ITERATOR))
-#define E_IS_ITERATOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_ITERATOR))
-
-typedef struct _EIterator EIterator;
-typedef struct _EIteratorClass EIteratorClass;
-
-struct _EIterator {
- GtkObject object;
-};
-
-struct _EIteratorClass {
- GtkObjectClass 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 (*delete) (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 Gtk function */
-GtkType 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 51480447b4..0000000000
--- a/e-util/e-list-iterator.c
+++ /dev/null
@@ -1,247 +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 Helix Code, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#include <config.h>
-#include <gtk/gtk.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_delete (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_destroy (GtkObject *object);
-
-#define PARENT_TYPE (e_iterator_get_type ())
-
-static GtkObjectClass *parent_class;
-#define PARENT_CLASS (E_LIST_ITERATOR_CLASS(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.
- **/
-GtkType
-e_list_iterator_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type) {
- GtkTypeInfo info = {
- "EListIterator",
- sizeof (EListIterator),
- sizeof (EListIteratorClass),
- (GtkClassInitFunc) e_list_iterator_class_init,
- (GtkObjectInitFunc) e_list_iterator_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-static void
-e_list_iterator_class_init (EListIteratorClass *klass)
-{
- GtkObjectClass *object_class;
- EIteratorClass *iterator_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
- iterator_class = E_ITERATOR_CLASS(klass);
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = e_list_iterator_destroy;
-
- 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->delete = e_list_iterator_delete;
- 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 = gtk_type_new(e_list_iterator_get_type());
-
- iterator->list = list;
- gtk_object_ref(GTK_OBJECT(list));
- iterator->iterator = list->list;
-
- return E_ITERATOR(iterator);
-}
-
-/*
- * Virtual functions:
- */
-static void
-e_list_iterator_destroy (GtkObject *object)
-{
- EListIterator *iterator = E_LIST_ITERATOR(object);
- e_list_remove_iterator(iterator->list, E_ITERATOR(iterator));
- gtk_object_unref(GTK_OBJECT(iterator->list));
-}
-
-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);
- 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);
- 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_delete (EIterator *_iterator)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- if (iterator->iterator) {
- GList *temp = iterator->iterator->next;
- if (iterator->list->free)
- iterator->list->free(iterator->iterator->data, iterator->list->closure);
- iterator->list->list = g_list_remove_link(iterator->list->list, iterator->iterator);
- iterator->iterator = temp;
- e_list_invalidate_iterators(iterator->list, E_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 a2b7d82988..0000000000
--- a/e-util/e-list-iterator.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, 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 <time.h>
-#include <gtk/gtk.h>
-#include <stdio.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) (GTK_CHECK_CAST ((obj), E_TYPE_LIST_ITERATOR, EListIterator))
-#define E_LIST_ITERATOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_LIST_ITERATOR, EListIteratorClass))
-#define E_IS_LIST_ITERATOR(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_LIST_ITERATOR))
-#define E_IS_LIST_ITERATOR_CLASS(klass) (GTK_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 Gtk function */
-GtkType 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 2a6f842888..0000000000
--- a/e-util/e-list.c
+++ /dev/null
@@ -1,158 +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 Helix Code, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#include <config.h>
-#include <gtk/gtk.h>
-
-#include "e-list.h"
-#include "e-list-iterator.h"
-
-#define ECL_CLASS(object) (E_LIST_CLASS(GTK_OBJECT((object))->klass))
-
-static void e_list_init (EList *list);
-static void e_list_class_init (EListClass *klass);
-static void e_list_destroy (GtkObject *object);
-
-#define PARENT_TYPE (gtk_object_get_type ())
-
-static GtkObjectClass *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.
- **/
-GtkType
-e_list_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type) {
- GtkTypeInfo info = {
- "EList",
- sizeof (EList),
- sizeof (EListClass),
- (GtkClassInitFunc) e_list_class_init,
- (GtkObjectInitFunc) e_list_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-static void
-e_list_class_init (EListClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = e_list_destroy;
-}
-
-/**
- * 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 = gtk_type_new(e_list_get_type());
- list->copy = copy;
- list->free = free;
- list->closure = closure;
- return list;
-}
-
-EList *
-e_list_duplicate (EList *old)
-{
- EList *list = gtk_type_new(e_list_get_type());
-
- 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_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));
- }
- }
-}
-
-void
-e_list_remove_iterator (EList *list, EIterator *iterator)
-{
- list->iterators = g_list_remove(list->iterators, iterator);
-}
-
-/*
- * Virtual functions
- */
-static void
-e_list_destroy (GtkObject *object)
-{
- EList *list = E_LIST(object);
- g_list_foreach(list->list, (GFunc) list->free, list->closure);
- g_list_free(list->list);
-}
diff --git a/e-util/e-list.h b/e-util/e-list.h
deleted file mode 100644
index 7a0170970f..0000000000
--- a/e-util/e-list.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, 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 <time.h>
-#include <gtk/gtk.h>
-#include <stdio.h>
-#include <e-util/e-list-iterator.h>
-
-#define E_TYPE_LIST (e_list_get_type ())
-#define E_LIST(obj) (GTK_CHECK_CAST ((obj), E_TYPE_LIST, EList))
-#define E_LIST_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_LIST, EListClass))
-#define E_IS_LIST(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_LIST))
-#define E_IS_LIST_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_LIST))
-
-typedef void *(*EListCopyFunc) (const void *data, void *closure);
-typedef void (*EListFreeFunc) (void *data, void *closure);
-
-struct _EList {
- GtkObject object;
- GList *list;
- GList *iterators;
- EListCopyFunc copy;
- EListFreeFunc free;
- void *closure;
-};
-
-struct _EListClass {
- GtkObjectClass parent_class;
-};
-
-EList *e_list_new (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);
-int e_list_length (EList *list);
-
-/* For iterators to call. */
-void e_list_invalidate_iterators (EList *list,
- EIterator *skip);
-void e_list_remove_iterator (EList *list,
- EIterator *iterator);
-
-/* Standard Gtk function */
-GtkType e_list_get_type (void);
-
-#endif /* ! __E_LIST_H__ */
diff --git a/e-util/e-popup-menu.c b/e-util/e-popup-menu.c
deleted file mode 100644
index 3fb382ae20..0000000000
--- a/e-util/e-popup-menu.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-popup-menu.c: popup menu display
-nnn *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- * Jody Goldberg (jgoldberg@home.com)
- *
- * (C) 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gnome.h>
-#include "e-popup-menu.h"
-#include "e-gui-utils.h"
-
-/*
- * Creates an item with an optional icon
- */
-static GtkWidget *
-make_item (GtkMenu *menu, const char *name, const char *pixname)
-{
- GtkWidget *label, *item;
- guint label_accel;
-
- if (*name == '\0')
- return gtk_menu_item_new ();
-
- /*
- * Ugh. This needs to go into Gtk+
- */
- label = gtk_accel_label_new ("");
- label_accel = gtk_label_parse_uline (GTK_LABEL (label), name);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_widget_show (label);
-
- item = gtk_pixmap_menu_item_new ();
- gtk_container_add (GTK_CONTAINER (item), label);
-
- if (label_accel != GDK_VoidSymbol){
- gtk_widget_add_accelerator (
- item,
- "activate_item",
- gtk_menu_ensure_uline_accel_group (GTK_MENU (menu)),
- label_accel, 0,
- GTK_ACCEL_LOCKED);
- }
-
- if (pixname){
- GtkWidget *pixmap = gnome_stock_pixmap_widget (item, pixname);
-
- gtk_widget_show (pixmap);
- gtk_pixmap_menu_item_set_pixmap (
- GTK_PIXMAP_MENU_ITEM (item), pixmap);
- }
-
- return item;
-}
-
-GtkMenu *
-e_popup_menu_create (EPopupMenu *menu_list, int disable_mask, int hide_mask, void *closure)
-{
- GtkMenu *menu = GTK_MENU (gtk_menu_new ());
- int i;
- gboolean last_item_seperator = TRUE;
- gint last_non_seperator = -1;
-
- for (i = 0; menu_list[i].name; i++) {
- if (strcmp("", menu_list[i].name) && !(menu_list [i].disable_mask & hide_mask)) {
- last_non_seperator = i;
- }
- }
-
- for (i = 0; i <= last_non_seperator; i++) {
- GtkWidget *item;
- gboolean seperator;
-
- seperator = !strcmp("", menu_list[i].name);
-
- if ((!(seperator && last_item_seperator)) && !(menu_list [i].disable_mask & hide_mask)) {
-
- item = make_item (menu, menu_list [i].name,
- menu_list [i].pixname);
-
- if (menu_list [i].fn)
- gtk_signal_connect (
- GTK_OBJECT (item), "activate",
- GTK_SIGNAL_FUNC (menu_list [i].fn),
- closure);
-
- if (menu_list [i].disable_mask & disable_mask)
- gtk_widget_set_sensitive (item, FALSE);
-
- gtk_widget_show (item);
- gtk_menu_append (menu, item);
- }
- last_item_seperator = seperator;
- }
-
- return menu;
-}
-
-void
-e_popup_menu_run (EPopupMenu *menu_list, GdkEventButton *event, int disable_mask, int hide_mask, void *closure)
-{
- GtkMenu *menu;
-
- g_return_if_fail (menu_list != NULL);
- g_return_if_fail (event != NULL);
-
- menu = e_popup_menu_create (menu_list, disable_mask, hide_mask, closure);
-
- e_popup_menu (menu, event);
-}
-
diff --git a/e-util/e-popup-menu.h b/e-util/e-popup-menu.h
deleted file mode 100644
index ed54a632a5..0000000000
--- a/e-util/e-popup-menu.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef E_POPUP_MENU_H
-#define E_POPUP_MENU_H
-
-#include <gtk/gtkwidget.h>
-
-typedef struct {
- char const * const name;
- char const * const pixname;
- void (*fn)(GtkWidget *widget, void *closure);
- int disable_mask;
-} EPopupMenu;
-
-GtkMenu *e_popup_menu_create (EPopupMenu *menu_list,
- int disable_mask,
- int hide_mask,
- void *closure);
-
-void e_popup_menu_run (EPopupMenu *menu_list,
- GdkEventButton *event,
- int disable_mask,
- int hide_mask,
- void *closure);
-
-#endif /* E_POPUP_MENU_H */
diff --git a/e-util/e-printable.c b/e-util/e-printable.c
deleted file mode 100644
index ed982469b8..0000000000
--- a/e-util/e-printable.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-printable.c: an object printer.
- *
- * Author:
- * Christopher James Lahey <clahey@helixcode.com>
- *
- * (C) 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-util.h"
-#include "e-printable.h"
-
-#define EP_CLASS(e) ((EPrintableClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE gtk_object_get_type ()
-
-
-static GtkObjectClass *e_printable_parent_class;
-
-enum {
- PRINT_PAGE,
- DATA_LEFT,
- RESET,
- HEIGHT,
- WILL_FIT,
- LAST_SIGNAL
-};
-
-static guint e_printable_signals [LAST_SIGNAL] = { 0, };
-
-static void
-e_printable_class_init (GtkObjectClass *object_class)
-{
- EPrintableClass *klass = E_PRINTABLE_CLASS(object_class);
- e_printable_parent_class = gtk_type_class (PARENT_TYPE);
-
- e_printable_signals [PRINT_PAGE] =
- gtk_signal_new ("print_page",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EPrintableClass, print_page),
- e_marshal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL,
- GTK_TYPE_NONE, 4, GTK_TYPE_OBJECT, GTK_TYPE_DOUBLE, GTK_TYPE_DOUBLE, GTK_TYPE_BOOL);
-
- e_printable_signals [DATA_LEFT] =
- gtk_signal_new ("data_left",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EPrintableClass, data_left),
- gtk_marshal_BOOL__NONE,
- GTK_TYPE_BOOL, 0, GTK_TYPE_NONE);
-
- e_printable_signals [RESET] =
- gtk_signal_new ("reset",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EPrintableClass, reset),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0, GTK_TYPE_NONE);
-
- e_printable_signals [HEIGHT] =
- gtk_signal_new ("height",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EPrintableClass, height),
- e_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL,
- GTK_TYPE_DOUBLE, 4, GTK_TYPE_OBJECT, GTK_TYPE_DOUBLE, GTK_TYPE_DOUBLE, GTK_TYPE_BOOL);
-
- e_printable_signals [WILL_FIT] =
- gtk_signal_new ("will_fit",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EPrintableClass, will_fit),
- e_marshal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL,
- GTK_TYPE_BOOL, 4, GTK_TYPE_OBJECT, GTK_TYPE_DOUBLE, GTK_TYPE_DOUBLE, GTK_TYPE_BOOL);
-
- gtk_object_class_add_signals (object_class, e_printable_signals, LAST_SIGNAL);
-
- klass->print_page = NULL;
- klass->data_left = NULL;
- klass->reset = NULL;
- klass->height = NULL;
- klass->will_fit = NULL;
-}
-
-
-guint
-e_printable_get_type (void)
-{
- static guint type = 0;
-
- if (!type)
- {
- GtkTypeInfo info =
- {
- "EPrintable",
- sizeof (EPrintable),
- sizeof (EPrintableClass),
- (GtkClassInitFunc) e_printable_class_init,
- NULL,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
-
-EPrintable *
-e_printable_new(void)
-{
- return E_PRINTABLE(gtk_type_new(e_printable_get_type()));
-}
-
-void
-e_printable_print_page (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble height,
- gboolean quantized)
-{
- g_return_if_fail (e_printable != NULL);
- g_return_if_fail (E_IS_PRINTABLE (e_printable));
-
- gtk_signal_emit (GTK_OBJECT (e_printable),
- e_printable_signals [PRINT_PAGE],
- context,
- width,
- height,
- quantized);
-}
-
-gboolean
-e_printable_data_left (EPrintable *e_printable)
-{
- gboolean ret_val;
-
- g_return_val_if_fail (e_printable != NULL, FALSE);
- g_return_val_if_fail (E_IS_PRINTABLE (e_printable), FALSE);
-
- gtk_signal_emit (GTK_OBJECT (e_printable),
- e_printable_signals [DATA_LEFT],
- &ret_val);
-
- return ret_val;
-}
-
-void
-e_printable_reset (EPrintable *e_printable)
-{
- g_return_if_fail (e_printable != NULL);
- g_return_if_fail (E_IS_PRINTABLE (e_printable));
-
- gtk_signal_emit (GTK_OBJECT (e_printable),
- e_printable_signals [RESET]);
-}
-
-gdouble
-e_printable_height (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantized)
-{
- gdouble ret_val;
-
- g_return_val_if_fail (e_printable != NULL, -1);
- g_return_val_if_fail (E_IS_PRINTABLE (e_printable), -1);
-
- gtk_signal_emit (GTK_OBJECT (e_printable),
- e_printable_signals [HEIGHT],
- context,
- width,
- max_height,
- quantized,
- &ret_val);
-
- return ret_val;
-}
-
-gboolean
-e_printable_will_fit (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantized)
-{
- gboolean ret_val;
-
- g_return_val_if_fail (e_printable != NULL, -1);
- g_return_val_if_fail (E_IS_PRINTABLE (e_printable), -1);
-
- gtk_signal_emit (GTK_OBJECT (e_printable),
- e_printable_signals [WILL_FIT],
- context,
- width,
- max_height,
- quantized,
- &ret_val);
-
- return ret_val;
-}
diff --git a/e-util/e-printable.h b/e-util/e-printable.h
deleted file mode 100644
index 18e6ec8472..0000000000
--- a/e-util/e-printable.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-printable.h: an object printer.
- *
- * Author:
- * Christopher James Lahey <clahey@helixcode.com>
- *
- * (C) 2000 Helix Code, Inc.
- */
-#ifndef _E_PRINTABLE_H_
-#define _E_PRINTABLE_H_
-
-#include <gtk/gtkobject.h>
-#include <libgnomeprint/gnome-print.h>
-
-#define E_PRINTABLE_TYPE (e_printable_get_type ())
-#define E_PRINTABLE(o) (GTK_CHECK_CAST ((o), E_PRINTABLE_TYPE, EPrintable))
-#define E_PRINTABLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_PRINTABLE_TYPE, EPrintableClass))
-#define E_IS_PRINTABLE(o) (GTK_CHECK_TYPE ((o), E_PRINTABLE_TYPE))
-#define E_IS_PRINTABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_PRINTABLE_TYPE))
-
-typedef struct {
- GtkObject base;
-} EPrintable;
-
-typedef struct {
- GtkObjectClass parent_class;
-
- /*
- * Signals
- */
-
- void (*print_page) (EPrintable *etm, GnomePrintContext *context, gdouble width, gdouble height, gboolean quantized);
- gboolean (*data_left) (EPrintable *etm);
- void (*reset) (EPrintable *etm);
- gdouble (*height) (EPrintable *etm, GnomePrintContext *context, gdouble width, gdouble max_height, gboolean quantized);
-
- /* e_printable_will_fit (ep, ...) should be equal in value to
- * (e_printable_print_page (ep, ...),
- * !e_printable_data_left(ep)) except that the latter has the
- * side effect of doing the printing and advancing the
- * position of the printable.
- */
-
- gboolean (*will_fit) (EPrintable *etm, GnomePrintContext *context, gdouble width, gdouble max_height, gboolean quantized);
-} EPrintableClass;
-
-GtkType e_printable_get_type (void);
-
-EPrintable *e_printable_new (void);
-
-/*
- * Routines for emitting signals on the e_table */
-void e_printable_print_page (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble height,
- gboolean quantized);
-gboolean e_printable_data_left (EPrintable *e_printable);
-void e_printable_reset (EPrintable *e_printable);
-gdouble e_printable_height (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantized);
-gboolean e_printable_will_fit (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantized);
-
-#endif /* _E_PRINTABLE_H_ */
diff --git a/e-util/e-sexp.c b/e-util/e-sexp.c
deleted file mode 100644
index cc0452b6b2..0000000000
--- a/e-util/e-sexp.c
+++ /dev/null
@@ -1,1163 +0,0 @@
-/*
- * Copyright 2000 HelixCode (http://www.helixcode.com).
- *
- * A simple, extensible s-exp evaluation engine.
- *
- * Author :
- * Michael Zucchi <notzed@helixcode.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
- */
-
-/*
- The following built-in s-exp's are supported:
-
- list = (and list*)
- perform an intersection of a number of lists, and return that.
-
- bool = (and bool*)
- perform a boolean AND of boolean values.
-
- list = (or list*)
- perform a union of a number of lists, returning the new list.
-
- bool = (or bool*)
- perform a boolean OR of boolean values.
-
- int = (+ int*)
- Add integers.
-
- string = (+ string*)
- Concat strings.
-
- int = (- int int*)
- Subtract integers from the first.
-
- Comparison operators:
-
- bool = (< int int)
- bool = (> int int)
- bool = (= int int)
-
- bool = (< string string)
- bool = (> string string)
- bool = (= string string)
- Perform a comparision of 2 integers, or 2 string values.
-
- Function flow:
-
- type = (if bool function)
- type = (if bool function function)
- Choose a flow path based on a boolean value
-
- type = (begin func func func)
- Execute a sequence. The last function return is the return type.
-*/
-
-#include <glib.h>
-#include <stdio.h>
-#include <time.h>
-#include <string.h>
-
-#include "e-sexp.h"
-
-#define p(x) /* parse debug */
-#define r(x) /* run debug */
-#define d(x) /* general debug */
-
-
-static struct _ESExpTerm * parse_list(ESExp *f, int gotbrace);
-static struct _ESExpTerm * parse_value(ESExp *f);
-
-static void parse_dump_term(struct _ESExpTerm *t, int depth);
-
-static GtkObjectClass *parent_class;
-
-
-
-static GScannerConfig scanner_config =
-{
- ( " \t\r\n") /* cset_skip_characters */,
- ( G_CSET_a_2_z
- "_+-<=>"
- G_CSET_A_2_Z) /* cset_identifier_first */,
- ( G_CSET_a_2_z
- "_0123456789-<>"
- G_CSET_A_2_Z
- G_CSET_LATINS
- G_CSET_LATINC ) /* cset_identifier_nth */,
- ( ";\n" ) /* cpair_comment_single */,
-
- FALSE /* case_sensitive */,
-
- TRUE /* skip_comment_multi */,
- TRUE /* skip_comment_single */,
- TRUE /* scan_comment_multi */,
- TRUE /* scan_identifier */,
- TRUE /* scan_identifier_1char */,
- FALSE /* scan_identifier_NULL */,
- TRUE /* scan_symbols */,
- FALSE /* scan_binary */,
- TRUE /* scan_octal */,
- TRUE /* scan_float */,
- TRUE /* scan_hex */,
- FALSE /* scan_hex_dollar */,
- TRUE /* scan_string_sq */,
- TRUE /* scan_string_dq */,
- TRUE /* numbers_2_int */,
- FALSE /* int_2_float */,
- FALSE /* identifier_2_string */,
- TRUE /* char_2_token */,
- FALSE /* symbol_2_token */,
- FALSE /* scope_0_fallback */,
-};
-
-struct _ESExpResult *
-e_sexp_result_new(int type)
-{
- struct _ESExpResult *r = g_malloc0(sizeof(*r));
- r->type = type;
- return r;
-}
-
-void
-e_sexp_result_free(struct _ESExpResult *t)
-{
- if (t == NULL)
- return;
-
- switch(t->type) {
- case ESEXP_RES_ARRAY_PTR:
- g_ptr_array_free(t->value.ptrarray, TRUE);
- break;
- case ESEXP_RES_BOOL:
- case ESEXP_RES_INT:
- break;
- case ESEXP_RES_STRING:
- g_free(t->value.string);
- break;
- case ESEXP_RES_UNDEFINED:
- break;
- }
- g_free(t);
-}
-
-/* implementations for the builtin functions */
-
-/* can you tell, i dont like glib? */
-/* we can only itereate a hashtable from a called function */
-struct _glib_sux_donkeys {
- int count;
- GPtrArray *uids;
-};
-
-/* ok, store any values that are in all sets */
-static void
-g_lib_sux_htand(char *key, int value, struct _glib_sux_donkeys *fuckup)
-{
- if (value == fuckup->count) {
- g_ptr_array_add(fuckup->uids, key);
- }
-}
-
-/* or, store all unique values */
-static void
-g_lib_sux_htor(char *key, int value, struct _glib_sux_donkeys *fuckup)
-{
- g_ptr_array_add(fuckup->uids, key);
-}
-
-static ESExpResult *
-term_eval_and(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
-{
- struct _ESExpResult *r, *r1;
- GHashTable *ht = g_hash_table_new(g_str_hash, g_str_equal);
- struct _glib_sux_donkeys lambdafoo;
- int type=-1;
- int bool = TRUE;
- int i;
-
- r(printf("( and\n"));
-
- r = e_sexp_result_new(ESEXP_RES_UNDEFINED);
-
- for (i=0;bool && i<argc;i++) {
- r1 = e_sexp_term_eval(f, argv[i]);
- if (type == -1)
- type = r1->type;
- if (type != r1->type) {
- printf("invalid types in and operation, all types must be the same\n");
- } else if ( r1->type == ESEXP_RES_ARRAY_PTR ) {
- char **a1;
- int l1, j;
-
- a1 = (char **)r1->value.ptrarray->pdata;
- l1 = r1->value.ptrarray->len;
- for (j=0;j<l1;j++) {
- int n;
- n = (int)g_hash_table_lookup(ht, a1[j]);
- g_hash_table_insert(ht, a1[j], (void *)n+1);
- }
- } else if ( r1->type == ESEXP_RES_BOOL ) {
- bool &= r1->value.bool;
- }
- e_sexp_result_free(r1);
- }
-
- if (type == ESEXP_RES_ARRAY_PTR) {
- lambdafoo.count = argc;
- lambdafoo.uids = g_ptr_array_new();
- g_hash_table_foreach(ht, (GHFunc)g_lib_sux_htand, &lambdafoo);
- r->type = ESEXP_RES_ARRAY_PTR;
- r->value.ptrarray = lambdafoo.uids;
- } else if (type == ESEXP_RES_BOOL) {
- r->type = ESEXP_RES_BOOL;
- r->value.bool = bool;
- }
-
- g_hash_table_destroy(ht);
-
- return r;
-}
-
-static ESExpResult *
-term_eval_or(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
-{
- struct _ESExpResult *r, *r1;
- GHashTable *ht = g_hash_table_new(g_str_hash, g_str_equal);
- struct _glib_sux_donkeys lambdafoo;
- int type = -1;
- int bool = FALSE;
- int i;
-
- r(printf("(or \n"));
-
- r = e_sexp_result_new(ESEXP_RES_UNDEFINED);
-
- for (i=0;!bool && i<argc;i++) {
- r1 = e_sexp_term_eval(f, argv[i]);
- if (type == -1)
- type = r1->type;
- if (r1->type != type) {
- printf("wrong types in or operation\n");
- } else if (r1->type == ESEXP_RES_ARRAY_PTR) {
- char **a1;
- int l1, j;
-
- a1 = (char **)r1->value.ptrarray->pdata;
- l1 = r1->value.ptrarray->len;
- for (j=0;j<l1;j++) {
- g_hash_table_insert(ht, a1[j], (void *)1);
- }
- } else if (r1->type == ESEXP_RES_BOOL) {
- bool |= r1->value.bool;
- }
- e_sexp_result_free(r1);
- }
-
- if (type == ESEXP_RES_ARRAY_PTR) {
- lambdafoo.count = argc;
- lambdafoo.uids = g_ptr_array_new();
- g_hash_table_foreach(ht, (GHFunc)g_lib_sux_htor, &lambdafoo);
- r->type = ESEXP_RES_ARRAY_PTR;
- r->value.ptrarray = lambdafoo.uids;
- } else if (type == ESEXP_RES_BOOL) {
- r->type = ESEXP_RES_BOOL;
- r->value.bool = bool;
- }
- g_hash_table_destroy(ht);
-
- return r;
-}
-
-static ESExpResult *
-term_eval_not(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- int res = TRUE;
- ESExpResult *r;
-
- if (argc>0) {
- if (argv[0]->type == ESEXP_RES_BOOL
- && argv[0]->value.bool)
- res = FALSE;
- }
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = res;
- return r;
-}
-
-/* this should support all arguments ...? */
-static ESExpResult *
-term_eval_lt(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
-{
- struct _ESExpResult *r, *r1, *r2;
-
- r = e_sexp_result_new(ESEXP_RES_UNDEFINED);
-
- if (argc == 2) {
- r1 = e_sexp_term_eval(f, argv[0]);
- r2 = e_sexp_term_eval(f, argv[1]);
- if (r1->type != r2->type) {
- printf("error, invalid types in compare\n");
- } else if (r1->type == ESEXP_RES_INT) {
- r->type = ESEXP_RES_BOOL;
- r->value.bool = r1->value.number < r2->value.number;
- } else if (r1->type == ESEXP_RES_STRING) {
- r->type = ESEXP_RES_BOOL;
- r->value.bool = strcmp(r1->value.string, r2->value.string) < 0;
- }
- }
- return r;
-}
-
-/* this should support all arguments ...? */
-static ESExpResult *
-term_eval_gt(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
-{
- struct _ESExpResult *r, *r1, *r2;
-
- r = e_sexp_result_new(ESEXP_RES_UNDEFINED);
-
- if (argc == 2) {
- r1 = e_sexp_term_eval(f, argv[0]);
- r2 = e_sexp_term_eval(f, argv[1]);
- if (r1->type != r2->type) {
- printf("error, invalid types in compare\n");
- } else if (r1->type == ESEXP_RES_INT) {
- r->type = ESEXP_RES_BOOL;
- r->value.bool = r1->value.number > r2->value.number;
- } else if (r1->type == ESEXP_RES_STRING) {
- r->type = ESEXP_RES_BOOL;
- r->value.bool = strcmp(r1->value.string, r2->value.string) > 0;
- }
- }
- return r;
-}
-
-/* this should support all arguments ...? */
-static ESExpResult *
-term_eval_eq(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
-{
- struct _ESExpResult *r, *r1, *r2;
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
-
- if (argc == 2) {
- r1 = e_sexp_term_eval(f, argv[0]);
- r2 = e_sexp_term_eval(f, argv[1]);
- if (r1->type != r2->type) {
- r->value.bool = FALSE;
- } else if (r1->type == ESEXP_RES_INT) {
- r->value.bool = r1->value.number == r2->value.number;
- } else if (r1->type == ESEXP_RES_BOOL) {
- r->value.bool = r1->value.bool == r2->value.bool;
- } else if (r1->type == ESEXP_RES_STRING) {
- r->value.bool = strcmp(r1->value.string, r2->value.string) == 0;
- }
- }
- return r;
-}
-
-static ESExpResult *
-term_eval_plus(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- struct _ESExpResult *r=NULL;
- int type;
- int i;
-
- if (argc>0) {
- type = argv[0]->type;
- switch(type) {
- case ESEXP_RES_INT: {
- int total = argv[0]->value.number;
- for (i=1;i<argc && argv[i]->type == ESEXP_RES_INT;i++) {
- total += argv[i]->value.number;
- }
- if (i<argc) {
- g_warning("Wrong type trying to add integers: ignored");
- }
- r = e_sexp_result_new(ESEXP_RES_INT);
- r->value.number = total;
- break; }
- case ESEXP_RES_STRING: {
- GString *s = g_string_new(argv[0]->value.string);
- for (i=1;i<argc && argv[i]->type == ESEXP_RES_STRING;i++) {
- g_string_append(s, argv[i]->value.string);
- }
- if (i<argc) {
- g_warning("Wrong type trying to concat strings: ignored");
- }
- r = e_sexp_result_new(ESEXP_RES_STRING);
- r->value.string = s->str;
- g_string_free(s, FALSE);
- break; }
-
- }
- }
-
- if (!r) {
- r = e_sexp_result_new(ESEXP_RES_INT);
- r->value.number = 0;
- }
- return r;
-}
-
-static ESExpResult *
-term_eval_sub(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- struct _ESExpResult *r=NULL;
- int type;
- int i;
-
- if (argc>0) {
- type = argv[0]->type;
- switch(type) {
- case ESEXP_RES_INT: {
- int total = argv[0]->value.number;
- for (i=1;i<argc && argv[i]->type == ESEXP_RES_INT;i++) {
- total -= argv[i]->value.number;
- }
- if (i<argc) {
- g_warning("Wrong type trying to subtract numbers: ignored");
- }
- r = e_sexp_result_new(ESEXP_RES_INT);
- r->value.number = total;
- break; }
- }
- }
-
- if (!r) {
- r = e_sexp_result_new(ESEXP_RES_INT);
- r->value.number = 0;
- }
- return r;
-}
-
-/* implements 'if' function */
-static ESExpResult *
-term_eval_if(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
-{
- struct _ESExpResult *r;
- int doit;
-
- if (argc >=2 && argc<=3) {
- r = e_sexp_term_eval(f, argv[0]);
- doit = (r->type == ESEXP_RES_BOOL && r->value.bool);
- e_sexp_result_free(r);
- if (doit) {
- return e_sexp_term_eval(f, argv[1]);
- } else if (argc>2) {
- return e_sexp_term_eval(f, argv[2]);
- }
- }
- return e_sexp_result_new(ESEXP_RES_UNDEFINED);
-}
-
-/* implements 'begin' statement */
-static ESExpResult *
-term_eval_begin(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
-{
- struct _ESExpResult *r=NULL;
- int i;
-
- for (i=0;i<argc;i++) {
- if (r)
- e_sexp_result_free(r);
- r = e_sexp_term_eval(f, argv[i]);
- }
- if (r)
- return r;
- else
- return e_sexp_result_new(ESEXP_RES_UNDEFINED);
-}
-
-
-struct _ESExpResult *
-e_sexp_term_eval(struct _ESExp *f, struct _ESExpTerm *t)
-{
- struct _ESExpResult *r, *r1;
- int i;
-
- g_return_val_if_fail(t != NULL, NULL);
-
- r(printf("eval term :\n"));
- r(parse_dump_term(t, 0));
-
- r = g_malloc0(sizeof(*r));
- r->type = ESEXP_RES_UNDEFINED;
-
- switch (t->type) {
- case ESEXP_TERM_STRING:
- r(printf(" (string \"%s\")\n", t->value.string));
- r->type = ESEXP_RES_STRING;
- /* erk, this shoul;dn't need to strdup this ... */
- r->value.string = g_strdup(t->value.string);
- break;
- case ESEXP_TERM_INT:
- r(printf(" (int %d)\n", t->value.number));
- r->type = ESEXP_RES_INT;
- r->value.number = t->value.number;
- break;
- case ESEXP_TERM_BOOL:
- r(printf(" (int %d)\n", t->value.number));
- r->type = ESEXP_RES_BOOL;
- r->value.bool = t->value.bool;
- break;
- case ESEXP_TERM_IFUNC: {
- if (t->value.func.sym->f.ifunc) {
- r1 = t->value.func.sym->f.ifunc(f, t->value.func.termcount, t->value.func.terms, t->value.func.sym->data);
- if (r1) {
- e_sexp_result_free(r);
- r = r1;
- }
- }
- break; }
- case ESEXP_TERM_FUNC: {
- struct _ESExpResult **argv;
-
- /* first evaluate all arguments to result types */
- argv = alloca(sizeof(argv[0]) * t->value.func.termcount);
- for (i=0;i<t->value.func.termcount;i++) {
- argv[i] = e_sexp_term_eval(f, t->value.func.terms[i]);
- }
- /* call the function */
- if (t->value.func.sym->f.func) {
- r1 = t->value.func.sym->f.func(f, t->value.func.termcount, argv, t->value.func.sym->data);
- if (r1) {
- e_sexp_result_free(r);
- r = r1;
- }
- }
- for (i=0;i<t->value.func.termcount;i++) {
- e_sexp_result_free(argv[i]);
- }
- break; }
- default:
- printf("Warning: Unknown type encountered in parse tree: %d\n", t->type);
- r->type = ESEXP_RES_UNDEFINED;
- }
-
- return r;
-}
-
-#if 0
-static void
-eval_dump_result(ESExpResult *r, int depth)
-{
- int i;
-
- if (r==NULL) {
- printf("null result???\n");
- return;
- }
-
- for (i=0;i<depth;i++)
- printf(" ");
-
- switch (r->type) {
- case ESEXP_RES_ARRAY_PTR:
- printf("array pointers\n");
- break;
- case ESEXP_RES_INT:
- printf("int: %d\n", r->value.number);
- break;
- case ESEXP_RES_STRING:
- printf("string: '%s'\n", r->value.string);
- break;
- case ESEXP_RES_BOOL:
- printf("bool: %c\n", r->value.bool?'t':'f');
- break;
- case ESEXP_RES_UNDEFINED:
- printf(" <undefined>\n");
- break;
- }
- printf("\n");
-}
-#endif
-
-static void
-parse_dump_term(struct _ESExpTerm *t, int depth)
-{
- int i;
-
- if (t==NULL) {
- printf("null term??\n");
- return;
- }
-
- for (i=0;i<depth;i++)
- printf(" ");
-
- switch (t->type) {
- case ESEXP_TERM_STRING:
- printf(" \"%s\"", t->value.string);
- break;
- case ESEXP_TERM_INT:
- printf(" %d", t->value.number);
- break;
- case ESEXP_TERM_BOOL:
- printf(" #%c", t->value.bool?'t':'f');
- break;
- case ESEXP_TERM_IFUNC:
- case ESEXP_TERM_FUNC:
- printf(" (function %s\n", t->value.func.sym->name);
- /*printf(" [%d] ", t->value.func.termcount);*/
- for (i=0;i<t->value.func.termcount;i++) {
- parse_dump_term(t->value.func.terms[i], depth+1);
- }
- for (i=0;i<depth;i++)
- printf(" ");
- printf(" )");
- break;
- case ESEXP_TERM_VAR:
- printf(" (variable %s )\n", t->value.var->name);
- break;
- default:
- printf("unknown type: %d\n", t->type);
- }
-
- printf("\n");
-}
-
-/*
- PARSER
-*/
-
-static struct _ESExpTerm *
-parse_new_term(int type)
-{
- struct _ESExpTerm *s = g_malloc0(sizeof(*s));
- s->type = type;
- return s;
-}
-
-static void
-parse_term_free(struct _ESExpTerm *t)
-{
- int i;
-
- if (t==NULL) {
- return;
- }
-
- switch (t->type) {
- case ESEXP_TERM_FUNC:
- case ESEXP_TERM_IFUNC:
- for (i=0;i<t->value.func.termcount;i++) {
- parse_term_free(t->value.func.terms[i]);
- }
- g_free(t->value.func.terms);
- break;
- case ESEXP_TERM_VAR:
- break;
- case ESEXP_TERM_STRING:
- g_free(t->value.string);
- break;
- case ESEXP_TERM_INT:
- break;
- default:
- printf("parse_term_free: unknown type: %d\n", t->type);
- }
- g_free(t);
-}
-
-static struct _ESExpTerm **
-parse_values(ESExp *f, int *len)
-{
- int token;
- struct _ESExpTerm **terms;
- int i=0;
- GScanner *gs = f->scanner;
-
- p(printf("parsing values\n"));
-
- /* FIXME: This hardcoded nonsense!!! :) */
- terms = g_malloc0(20*sizeof(*terms));
-
- while ( (token = g_scanner_peek_next_token(gs)) != G_TOKEN_EOF
- && token != ')') {
- terms[i]=parse_value(f);
- i++;
- }
-
- p(printf("found %d subterms\n", i));
- *len = i;
-
- p(printf("dont parsing values\n"));
- return terms;
-}
-
-static struct _ESExpTerm *
-parse_value(ESExp *f)
-{
- int token;
- struct _ESExpTerm *t = NULL;
- GScanner *gs = f->scanner;
- struct _ESExpSymbol *s;
-
- p(printf("parsing value\n"));
-
- token = g_scanner_get_next_token(gs);
- switch(token) {
- case G_TOKEN_LEFT_PAREN:
- p(printf("got brace, its a list!\n"));
- return parse_list(f, TRUE);
- case G_TOKEN_STRING:
- p(printf("got string\n"));
- t = parse_new_term(ESEXP_TERM_STRING);
- t->value.string = g_strdup(g_scanner_cur_value(gs).v_string);
- break;
- case G_TOKEN_INT:
- t = parse_new_term(ESEXP_TERM_INT);
- t->value.number = g_scanner_cur_value(gs).v_int;
- p(printf("got int\n"));
- break;
- case '#':
- printf("got bool?\n");
- token = g_scanner_get_next_token(gs);
- t = parse_new_term(ESEXP_TERM_BOOL);
- t->value.bool = token=='t';
- break;
- case G_TOKEN_SYMBOL:
- s = g_scanner_cur_value(gs).v_symbol;
- switch (s->type) {
- case ESEXP_TERM_FUNC:
- case ESEXP_TERM_IFUNC:
- /* this is basically invalid, since we can't use function
- pointers, but let the runtime catch it ... */
- t = parse_new_term(s->type);
- t->value.func.sym = s;
- t->value.func.terms = parse_values(f, &t->value.func.termcount);
- break;
- case ESEXP_TERM_VAR:
- t = parse_new_term(s->type);
- t->value.var = s;
- break;
- default:
- printf("Invalid symbol type: %d\n", s->type);
- }
- break;
- case G_TOKEN_IDENTIFIER:
- printf("Unknown identifier encountered: %s\n", g_scanner_cur_value(gs).v_identifier);
- break;
- default:
- printf("Innvalid token trying to parse a list of values\n");
- }
- p(printf("done parsing value\n"));
- return t;
-}
-
-/* FIXME: this needs some robustification */
-static struct _ESExpTerm *
-parse_list(ESExp *f, int gotbrace)
-{
- int token;
- struct _ESExpTerm *t = NULL;
- GScanner *gs = f->scanner;
-
- p(printf("parsing list\n"));
- if (gotbrace)
- token = '(';
- else
- token = g_scanner_get_next_token(gs);
- if (token =='(') {
- token = g_scanner_get_next_token(gs);
- switch(token) {
- case G_TOKEN_SYMBOL: {
- struct _ESExpSymbol *s;
-
- s = g_scanner_cur_value(gs).v_symbol;
- p(printf("got funciton: %s\n", s->name));
- t = parse_new_term(s->type);
- p(printf("created new list %p\n", t));
- /* if we have a variable, find out its base type */
- while (s->type == ESEXP_TERM_VAR) {
- s = ((ESExpTerm *)(s->data))->value.var;
- }
- if (s->type == ESEXP_TERM_FUNC
- || s->type == ESEXP_TERM_IFUNC) {
- t->value.func.sym = s;
- t->value.func.terms = parse_values(f, &t->value.func.termcount);
- } else {
- printf("Error, trying to call variable as function\n");
- }
- break; }
- case G_TOKEN_IDENTIFIER:
- printf("Unknown identifier: %s\n", g_scanner_cur_value(gs).v_identifier);
- break;
- default:
- printf("unknown sequence encountered, type = %d\n", token);
- }
- token = g_scanner_get_next_token(gs);
- if (token != ')') {
- printf("Error, expected ')' not found\n");
- }
- } else {
- printf("Error, list term without opening (\n");
- }
-
- p(printf("returning list %p\n", t));
- return t;
-}
-
-#if 0
-GList *
-camel_mbox_folder_search_by_expression(CamelFolder *folder, char *expression, CamelException *ex)
-{
- GScanner *gs;
- int i;
- struct _ESExpTerm *t;
- struct _searchcontext *ctx;
- struct _ESExpResult *r;
- GList *matches = NULL;
-
- gs = g_scanner_new(&scanner_config);
- for(i=0;i<sizeof(symbols)/sizeof(symbols[0]);i++)
- g_scanner_scope_add_symbol(gs, 0, symbols[i].name, &symbols[i]);
-
- g_scanner_input_text(gs, expression, strlen(expression));
- t = parse_list(gs, 0);
-
- if (t) {
- ctx = g_malloc0(sizeof(*ctx));
- ctx->folder = folder;
- ctx->summary = camel_folder_get_summary(folder, ex);
- ctx->message_info = camel_folder_summary_get_message_info_list(ctx->summary);
-#ifdef HAVE_IBEX
- ctx->index = ibex_open(CAMEL_MBOX_FOLDER(folder)->index_file_path, FALSE);
- if (!ctx->index) {
- perror("Cannot open index file, body searches will be ignored\n");
- }
-#endif
- r = term_eval(ctx, t);
-
- /* now create a folder summary to return?? */
- if (r
- && r->type == ESEXP_RES_ARRAY_PTR) {
- d(printf("got result ...\n"));
- for (i=0;i<r->value.ptrarray->len;i++) {
- d(printf("adding match: %s\n", (char *)g_ptr_array_index(r->value.ptrarray, i)));
- matches = g_list_prepend(matches, g_strdup(g_ptr_array_index(r->value.ptrarray, i)));
- }
- e_sexp_result_free(r);
- }
-
- if (ctx->index)
- ibex_close(ctx->index);
-
- gtk_object_unref((GtkObject *)ctx->summary);
- g_free(ctx);
- parse_term_free(t);
- } else {
- printf("Warning, Could not parse expression!\n %s\n", expression);
- }
-
- g_scanner_destroy(gs);
-
- return matches;
-}
-#endif
-
-
-static void e_sexp_finalise(GtkObject *);
-
-static void
-e_sexp_class_init (ESExpClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- object_class->finalize = e_sexp_finalise;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-}
-
-/* 'builtin' functions */
-static struct {
- char *name;
- ESExpFunc *func;
- int type; /* set to 1 if a function can perform shortcut evaluation, or
- doesn't execute everything, 0 otherwise */
-} symbols[] = {
- { "and", (ESExpFunc *)term_eval_and, 1 },
- { "or", (ESExpFunc *)term_eval_or, 1 },
- { "not", (ESExpFunc *)term_eval_not, 0 },
- { "<", (ESExpFunc *)term_eval_lt, 1 },
- { ">", (ESExpFunc *)term_eval_gt, 1 },
- { "=", (ESExpFunc *)term_eval_eq, 1 },
- { "+", (ESExpFunc *)term_eval_plus, 0 },
- { "-", (ESExpFunc *)term_eval_sub, 0 },
- { "if", (ESExpFunc *)term_eval_if, 1 },
- { "begin", (ESExpFunc *)term_eval_begin, 1 },
-};
-
-static void
-free_symbol(void *key, void *value, void *data)
-{
- struct _ESExpSymbol *s = value;
-
- g_free(s->name);
- g_free(s);
-}
-
-static void
-e_sexp_finalise(GtkObject *o)
-{
- ESExp *s = (ESExp *)o;
-
- if (s->tree) {
- parse_term_free(s->tree);
- s->tree = NULL;
- }
-
- g_scanner_scope_foreach_symbol(s->scanner, 0, free_symbol, 0);
- g_scanner_destroy(s->scanner);
-
- ((GtkObjectClass *)(parent_class))->finalize((GtkObject *)o);
-}
-
-static void
-e_sexp_init (ESExp *s)
-{
- int i;
-
- s->scanner = g_scanner_new(&scanner_config);
-
- /* load in builtin symbols? */
- for(i=0;i<sizeof(symbols)/sizeof(symbols[0]);i++) {
- if (symbols[i].type == 1) {
- e_sexp_add_ifunction(s, 0, symbols[i].name, (ESExpIFunc *)symbols[i].func, &symbols[i]);
- } else {
- e_sexp_add_function(s, 0, symbols[i].name, symbols[i].func, &symbols[i]);
- }
- }
-}
-
-guint
-e_sexp_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "ESExp",
- sizeof (ESExp),
- sizeof (ESExpClass),
- (GtkClassInitFunc) e_sexp_class_init,
- (GtkObjectInitFunc) e_sexp_init,
- (GtkArgSetFunc) NULL,
- (GtkArgGetFunc) NULL
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &type_info);
- }
-
- return type;
-}
-
-ESExp *
-e_sexp_new (void)
-{
- ESExp *f = E_SEXP ( gtk_type_new (e_sexp_get_type ()));
-
- return f;
-}
-
-void
-e_sexp_add_function(ESExp *f, int scope, char *name, ESExpFunc *func, void *data)
-{
- struct _ESExpSymbol *s;
-
- g_return_if_fail(FILTER_IS_SEXP(f));
- g_return_if_fail(name != NULL);
-
- s = g_malloc0(sizeof(*s));
- s->name = g_strdup(name);
- s->f.func = func;
- s->type = ESEXP_TERM_FUNC;
- s->data = data;
- g_scanner_scope_add_symbol(f->scanner, scope, s->name, s);
-}
-
-void
-e_sexp_add_ifunction(ESExp *f, int scope, char *name, ESExpIFunc *ifunc, void *data)
-{
- struct _ESExpSymbol *s;
-
- g_return_if_fail(FILTER_IS_SEXP(f));
- g_return_if_fail(name != NULL);
-
- s = g_malloc0(sizeof(*s));
- s->name = g_strdup(name);
- s->f.ifunc = ifunc;
- s->type = ESEXP_TERM_IFUNC;
- s->data = data;
- g_scanner_scope_add_symbol(f->scanner, scope, s->name, s);
-}
-
-void
-e_sexp_add_variable(ESExp *f, int scope, char *name, ESExpTerm *value)
-{
- struct _ESExpSymbol *s;
-
- g_return_if_fail(FILTER_IS_SEXP(f));
- g_return_if_fail(name != NULL);
-
- s = g_malloc0(sizeof(*s));
- s->name = g_strdup(name);
- s->type = ESEXP_TERM_VAR;
- s->data = value;
- g_scanner_scope_add_symbol(f->scanner, scope, s->name, s);
-}
-
-void
-e_sexp_remove_symbol(ESExp *f, int scope, char *name)
-{
- int oldscope;
- struct _ESExpSymbol *s;
-
- g_return_if_fail(FILTER_IS_SEXP(f));
- g_return_if_fail(name != NULL);
-
- oldscope = g_scanner_set_scope(f->scanner, scope);
- s = g_scanner_lookup_symbol(f->scanner, name);
- g_scanner_scope_remove_symbol(f->scanner, scope, name);
- g_scanner_set_scope(f->scanner, oldscope);
- if (s) {
- g_free(s->name);
- g_free(s);
- }
-}
-
-int
-e_sexp_set_scope(ESExp *f, int scope)
-{
- g_return_val_if_fail(FILTER_IS_SEXP(f), 0);
-
- return g_scanner_set_scope(f->scanner, scope);
-}
-
-void
-e_sexp_input_text(ESExp *f, const char *text, int len)
-{
- g_return_if_fail(FILTER_IS_SEXP(f));
- g_return_if_fail(text != NULL);
-
- g_scanner_input_text(f->scanner, text, len);
-}
-
-void
-e_sexp_input_file (ESExp *f, int fd)
-{
- g_return_if_fail(FILTER_IS_SEXP(f));
-
- g_scanner_input_file(f->scanner, fd);
-}
-
-/* needs some error return? */
-void
-e_sexp_parse(ESExp *f)
-{
- g_return_if_fail(FILTER_IS_SEXP(f));
-
- if (f->tree)
- parse_term_free(f->tree);
-
- f->tree = parse_list(f, FALSE);
-}
-
-struct _ESExpResult *
-e_sexp_eval(ESExp *f)
-{
- g_return_val_if_fail(FILTER_IS_SEXP(f), NULL);
- g_return_val_if_fail(f->tree != NULL, NULL);
-
- return e_sexp_term_eval(f, f->tree);
-}
-
-/**
- * e_sexp_encode_bool:
- * @s:
- * @state:
- *
- * Encode a bool into an s-expression @s. Bools are
- * encoded using #t #f syntax.
- **/
-void
-e_sexp_encode_bool(GString *s, gboolean state)
-{
- if (state)
- g_string_append(s, " #t");
- else
- g_string_append(s, " #f");
-}
-
-/**
- * e_sexp_encode_string:
- * @s: Destination string.
- * @string: String expression.
- *
- * Add a c string @string to the s-expression stored in
- * the gstring @s. Quotes are added, and special characters
- * are escaped appropriately.
- **/
-void
-e_sexp_encode_string(GString *s, const char *string)
-{
- char c;
- const char *p;
-
- p = string;
- g_string_append(s, " \"");
- while ( (c = *p++) ) {
- if (c=='\\' || c=='\"' || c=='\'')
- g_string_append_c(s, '\\');
- g_string_append_c(s, c);
- }
- g_string_append(s, "\"");
-}
-
-#ifdef TESTER
-int main(int argc, char **argv)
-{
- ESExp *f;
- char *t = "(+ \"foo\" \"\\\"\" \"bar\" \"\\\\ blah \\x \")";
- ESExpResult *r;
-
- gtk_init(&argc, &argv);
-
- f = e_sexp_new();
-
- e_sexp_add_variable(f, 0, "test", NULL);
-
- e_sexp_input_text(f, t, strlen(t));
- e_sexp_parse(f);
-
- if (f->tree) {
- parse_dump_term(f->tree, 0);
- }
-
- r = e_sexp_eval(f);
- if (r) {
- eval_dump_result(r, 0);
- } else {
- printf("no result?|\n");
- }
-
- return 0;
-}
-#endif
diff --git a/e-util/e-sexp.h b/e-util/e-sexp.h
deleted file mode 100644
index 1030531133..0000000000
--- a/e-util/e-sexp.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- generic s-exp evaluator class
-*/
-#ifndef _E_SEXP_H
-#define _E_SEXP_H
-
-#include <glib.h>
-#include <gtk/gtk.h>
-
-#define E_SEXP(obj) GTK_CHECK_CAST (obj, e_sexp_get_type (), ESExp)
-#define E_SEXP_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_sexp_get_type (), ESExpClass)
-#define FILTER_IS_SEXP(obj) GTK_CHECK_TYPE (obj, e_sexp_get_type ())
-
-typedef struct _ESExp ESExp;
-typedef struct _ESExpClass ESExpClass;
-
-typedef struct _ESExpSymbol ESExpSymbol;
-typedef struct _ESExpResult ESExpResult;
-typedef struct _ESExpTerm ESExpTerm;
-
-typedef struct _ESExpResult *(ESExpFunc)(struct _ESExp *sexp,
- int argc,
- struct _ESExpResult **argv,
- void *data);
-
-typedef struct _ESExpResult *(ESExpIFunc)(struct _ESExp *sexp,
- int argc,
- struct _ESExpTerm **argv,
- void *data);
-enum _ESExpResultType {
- ESEXP_RES_ARRAY_PTR=0, /* type is a ptrarray, what it points to is implementation dependant */
- ESEXP_RES_INT, /* type is a number */
- ESEXP_RES_STRING, /* type is a pointer to a single string */
- ESEXP_RES_BOOL, /* boolean type */
- ESEXP_RES_UNDEFINED /* unknown type */
-};
-
-struct _ESExpResult {
- enum _ESExpResultType type;
- union {
- GPtrArray *ptrarray;
- int number;
- char *string;
- int bool;
- } value;
-};
-
-enum _ESExpTermType {
- ESEXP_TERM_INT = 0, /* integer literal */
- ESEXP_TERM_BOOL, /* boolean literal */
- ESEXP_TERM_STRING, /* string literal */
- ESEXP_TERM_FUNC, /* normal function, arguments are evaluated before calling */
- ESEXP_TERM_IFUNC, /* immediate function, raw terms are arguments */
- ESEXP_TERM_VAR, /* variable reference */
-};
-
-struct _ESExpSymbol {
- int type; /* ESEXP_TERM_FUNC or ESEXP_TERM_VAR */
- char *name;
- void *data;
- union {
- ESExpFunc *func;
- ESExpIFunc *ifunc;
- } f;
-};
-
-struct _ESExpTerm {
- enum _ESExpTermType type;
- union {
- char *string;
- int number;
- int bool;
- struct {
- struct _ESExpSymbol *sym;
- struct _ESExpTerm **terms;
- int termcount;
- } func;
- struct _ESExpSymbol *var;
- } value;
-};
-
-
-
-struct _ESExp {
- GtkObject object;
-
- GScanner *scanner; /* for parsing text version */
- ESExpTerm *tree; /* root of expression tree */
-};
-
-struct _ESExpClass {
- GtkObjectClass parent_class;
-
-};
-
-guint e_sexp_get_type (void);
-ESExp *e_sexp_new (void);
-void e_sexp_add_function (ESExp *f, int scope, char *name, ESExpFunc *func, void *data);
-void e_sexp_add_ifunction (ESExp *f, int scope, char *name, ESExpIFunc *func, void *data);
-void e_sexp_add_variable (ESExp *f, int scope, char *name, ESExpTerm *value);
-void e_sexp_remove_symbol (ESExp *f, int scope, char *name);
-int e_sexp_set_scope (ESExp *f, int scope);
-
-void e_sexp_input_text (ESExp *f, const char *text, int len);
-void e_sexp_input_file (ESExp *f, int fd);
-
-
-void e_sexp_parse (ESExp *f);
-ESExpResult *e_sexp_eval (ESExp *f);
-
-ESExpResult *e_sexp_term_eval (struct _ESExp *f, struct _ESExpTerm *t);
-ESExpResult *e_sexp_result_new (int type);
-void e_sexp_result_free (struct _ESExpResult *t);
-
-/* utility functions for creating s-exp strings. */
-void e_sexp_encode_bool(GString *s, gboolean state);
-void e_sexp_encode_string(GString *s, const char *string);
-
-#endif /* _E_SEXP_H */
diff --git a/e-util/e-text-event-processor-emacs-like.c b/e-util/e-text-event-processor-emacs-like.c
deleted file mode 100644
index be323d028f..0000000000
--- a/e-util/e-text-event-processor-emacs-like.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-text-event-processor-emacs-like.h"
-static void e_text_event_processor_emacs_like_init (ETextEventProcessorEmacsLike *card);
-static void e_text_event_processor_emacs_like_class_init (ETextEventProcessorEmacsLikeClass *klass);
-static gint e_text_event_processor_emacs_like_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event);
-
-static ETextEventProcessorClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0
-};
-
-static const ETextEventProcessorCommand control_keys[26] =
-{
- { E_TEP_START_OF_LINE, E_TEP_MOVE, 0, "" }, /* a */
- { E_TEP_BACKWARD_CHARACTER, E_TEP_MOVE, 0, "" }, /* b */
- { E_TEP_SELECTION, E_TEP_COPY, 0, "" }, /* c */
- { E_TEP_FORWARD_CHARACTER, E_TEP_DELETE, 0, "" }, /* d */
- { E_TEP_END_OF_LINE, E_TEP_MOVE, 0, "" }, /* e */
- { E_TEP_FORWARD_CHARACTER, E_TEP_MOVE, 0, "" }, /* f */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* g */
- { E_TEP_BACKWARD_CHARACTER, E_TEP_DELETE, 0, "" }, /* h */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* i */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* j */
- { E_TEP_END_OF_LINE, E_TEP_DELETE, 0, "" }, /* k */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* l */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* m */
- { E_TEP_FORWARD_LINE, E_TEP_MOVE, 0, "" }, /* n */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* o */
- { E_TEP_BACKWARD_LINE, E_TEP_MOVE, 0, "" }, /* p */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* q */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* r */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* s */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* t */
- { E_TEP_START_OF_LINE, E_TEP_DELETE, 0, "" }, /* u */
- { E_TEP_SELECTION, E_TEP_PASTE, 0, "" }, /* v */
- { E_TEP_SELECTION, E_TEP_DELETE, 0, "" }, /* w */
- { E_TEP_SELECTION, E_TEP_DELETE, 0, "" }, /* x */
- { E_TEP_SELECTION, E_TEP_PASTE, 0, "" }, /* y */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" } /* z */
-};
-
-static const ETextEventProcessorCommand alt_keys[26] =
-{
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* a */
- { E_TEP_BACKWARD_WORD, E_TEP_MOVE, 0, "" }, /* b */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* c */
- { E_TEP_FORWARD_WORD, E_TEP_DELETE, 0, "" }, /* d */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* e */
- { E_TEP_FORWARD_WORD, E_TEP_MOVE, 0, "" }, /* f */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* g */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* h */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* i */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* j */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* k */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* l */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* m */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* n */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* o */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* p */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* q */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* r */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* s */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* t */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* u */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* v */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* w */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* x */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* y */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" } /* z */
-
-};
-
-GtkType
-e_text_event_processor_emacs_like_get_type (void)
-{
- static GtkType text_event_processor_emacs_like_type = 0;
-
- if (!text_event_processor_emacs_like_type)
- {
- static const GtkTypeInfo text_event_processor_emacs_like_info =
- {
- "ETextEventProcessorEmacsLike",
- sizeof (ETextEventProcessorEmacsLike),
- sizeof (ETextEventProcessorEmacsLikeClass),
- (GtkClassInitFunc) e_text_event_processor_emacs_like_class_init,
- (GtkObjectInitFunc) e_text_event_processor_emacs_like_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- text_event_processor_emacs_like_type = gtk_type_unique (e_text_event_processor_get_type (), &text_event_processor_emacs_like_info);
- }
-
- return text_event_processor_emacs_like_type;
-}
-
-static void
-e_text_event_processor_emacs_like_class_init (ETextEventProcessorEmacsLikeClass *klass)
-{
- GtkObjectClass *object_class;
- ETextEventProcessorClass *processor_class;
-
- object_class = (GtkObjectClass*) klass;
- processor_class = (ETextEventProcessorClass*) klass;
-
- parent_class = gtk_type_class (e_text_event_processor_get_type ());
-
- processor_class->event = e_text_event_processor_emacs_like_event;
-}
-
-static void
-e_text_event_processor_emacs_like_init (ETextEventProcessorEmacsLike *tep)
-{
-}
-
-static gint
-e_text_event_processor_emacs_like_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event)
-{
- ETextEventProcessorCommand command;
- ETextEventProcessorEmacsLike *tep_el = E_TEXT_EVENT_PROCESSOR_EMACS_LIKE(tep);
- command.action = E_TEP_NOP;
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- if (event->button.button == 1) {
- command.action = E_TEP_GRAB;
- command.time = event->button.time;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
- if (event->button.state & GDK_SHIFT_MASK)
- command.action = E_TEP_SELECT;
- else
- command.action = E_TEP_MOVE;
- command.position = E_TEP_VALUE;
- command.value = event->button.position;
- command.time = event->button.time;
- tep_el->mouse_down = TRUE;
- }
- break;
- case GDK_2BUTTON_PRESS:
- if (event->button.button == 1) {
- command.action = E_TEP_SELECT;
- command.position = E_TEP_SELECT_WORD;
- command.time = event->button.time;
- }
- break;
- case GDK_3BUTTON_PRESS:
- if (event->button.button == 1) {
- command.action = E_TEP_SELECT;
- command.position = E_TEP_SELECT_ALL;
- command.time = event->button.time;
- }
- break;
- case GDK_BUTTON_RELEASE:
- if (event->button.button == 1) {
- command.action = E_TEP_UNGRAB;
- command.time = event->button.time;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
- command.time = event->button.time;
- tep_el->mouse_down = FALSE;
- command.action = E_TEP_NOP;
- } else if (event->button.button == 2) {
- command.action = E_TEP_MOVE;
- command.position = E_TEP_VALUE;
- command.value = event->button.position;
- command.time = event->button.time;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
-
- command.action = E_TEP_GET_SELECTION;
- command.position = E_TEP_SELECTION;
- command.value = 0;
- command.time = event->button.time;
- }
- break;
- case GDK_MOTION_NOTIFY:
- if (tep_el->mouse_down) {
- command.action = E_TEP_SELECT;
- command.position = E_TEP_VALUE;
- command.time = event->motion.time;
- command.value = event->motion.position;
- }
- break;
- case GDK_KEY_PRESS:
- {
- ETextEventProcessorEventKey key = event->key;
- command.time = event->key.time;
- if (key.state & GDK_SHIFT_MASK)
- command.action = E_TEP_SELECT;
- else
- command.action = E_TEP_MOVE;
- switch(key.keyval) {
- case GDK_Home:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_START_OF_BUFFER;
- else
- command.position = E_TEP_START_OF_LINE;
- break;
- case GDK_End:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_END_OF_BUFFER;
- else
- command.position = E_TEP_END_OF_LINE;
- break;
- case GDK_Page_Up: command.position = E_TEP_BACKWARD_PAGE; break;
- case GDK_Page_Down: command.position = E_TEP_FORWARD_PAGE; break;
- /* CUA has Ctrl-Up/Ctrl-Down as paragraph up down */
- case GDK_Up: command.position = E_TEP_BACKWARD_LINE; break;
- case GDK_Down: command.position = E_TEP_FORWARD_LINE; break;
- case GDK_Left:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_BACKWARD_WORD;
- else
- command.position = E_TEP_BACKWARD_CHARACTER;
- break;
- case GDK_Right:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_FORWARD_WORD;
- else
- command.position = E_TEP_FORWARD_CHARACTER;
- break;
-
- case GDK_BackSpace:
- command.action = E_TEP_DELETE;
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_BACKWARD_WORD;
- else
- command.position = E_TEP_BACKWARD_CHARACTER;
- break;
- case GDK_Clear:
- command.action = E_TEP_DELETE;
- command.position = E_TEP_END_OF_LINE;
- break;
- case GDK_Insert:
- if (key.state & GDK_SHIFT_MASK) {
- command.action = E_TEP_PASTE;
- command.position = E_TEP_SELECTION;
- } else if (key.state & GDK_CONTROL_MASK) {
- command.action = E_TEP_COPY;
- command.position = E_TEP_SELECTION;
- } else {
- /* gtk_toggle_insert(text) -- IMPLEMENT */
- }
- break;
- case GDK_Delete:
- if (key.state & GDK_CONTROL_MASK){
- command.action = E_TEP_DELETE;
- command.position = E_TEP_FORWARD_WORD;
- } else if (key.state & GDK_SHIFT_MASK) {
- command.action = E_TEP_COPY;
- command.position = E_TEP_SELECTION;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
-
- command.action = E_TEP_DELETE;
- command.position = E_TEP_SELECTION;
- } else {
- command.action = E_TEP_DELETE;
- command.position = E_TEP_FORWARD_CHARACTER;
- }
- break;
- case GDK_Tab:
- /* Don't insert literally */
- command.action = E_TEP_NOP;
- command.position = E_TEP_SELECTION;
- break;
- case GDK_Return:
- if (key.state & GDK_CONTROL_MASK) {
- command.action = E_TEP_ACTIVATE;
- command.position = E_TEP_SELECTION;
- } else {
- command.action = E_TEP_INSERT;
- command.position = E_TEP_SELECTION;
- command.value = 1;
- command.string = "\n";
- }
- break;
- case GDK_Escape:
- /* Don't insert literally */
- command.action = E_TEP_NOP;
- command.position = E_TEP_SELECTION;
- break;
-
- default:
- if (key.state & GDK_CONTROL_MASK) {
- if ((key.keyval >= 'A') && (key.keyval <= 'Z'))
- key.keyval -= 'A' - 'a';
-
- if ((key.keyval >= 'a') && (key.keyval <= 'z')) {
- command.position = control_keys[(int) (key.keyval - 'a')].position;
- if (control_keys[(int) (key.keyval - 'a')].action != E_TEP_MOVE)
- command.action = control_keys[(int) (key.keyval - 'a')].action;
- command.value = control_keys[(int) (key.keyval - 'a')].value;
- command.string = control_keys[(int) (key.keyval - 'a')].string;
- }
-
- if (key.keyval == 'x' || key.keyval == 'w') {
- command.action = E_TEP_COPY;
- command.position = E_TEP_SELECTION;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
-
- command.action = E_TEP_DELETE;
- command.position = E_TEP_SELECTION;
- }
-
- break;
- } else if (key.state & GDK_MOD1_MASK) {
- if ((key.keyval >= 'A') && (key.keyval <= 'Z'))
- key.keyval -= 'A' - 'a';
-
- if ((key.keyval >= 'a') && (key.keyval <= 'z')) {
- command.position = alt_keys[(int) (key.keyval - 'a')].position;
- if (alt_keys[(int) (key.keyval - 'a')].action != E_TEP_MOVE)
- command.action = alt_keys[(int) (key.keyval - 'a')].action;
- command.value = alt_keys[(int) (key.keyval - 'a')].value;
- command.string = alt_keys[(int) (key.keyval - 'a')].string;
- }
- } else if (key.length > 0) {
- command.action = E_TEP_INSERT;
- command.position = E_TEP_SELECTION;
- command.value = strlen(key.string);
- command.string = key.string;
-
- } else {
- command.action = E_TEP_NOP;
- }
- }
- break;
- case GDK_KEY_RELEASE:
- command.time = event->key.time;
- command.action = E_TEP_NOP;
- break;
- default:
- command.action = E_TEP_NOP;
- break;
- }
- }
- if (command.action != E_TEP_NOP) {
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
- return 1;
- }
- else
- return 0;
-}
-
-ETextEventProcessor *
-e_text_event_processor_emacs_like_new (void)
-{
- ETextEventProcessorEmacsLike *retval = gtk_type_new (e_text_event_processor_emacs_like_get_type ());
- return E_TEXT_EVENT_PROCESSOR (retval);
-}
-
diff --git a/e-util/e-text-event-processor-emacs-like.h b/e-util/e-text-event-processor-emacs-like.h
deleted file mode 100644
index 651bb552b3..0000000000
--- a/e-util/e-text-event-processor-emacs-like.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor-emacs-like.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_TEXT_EVENT_PROCESSOR_EMACS_LIKE_H__
-#define __E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_H__
-
-#include <gnome.h>
-#include "e-text-event-processor.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETextEventProcessorEmacsLike - Turns events on a text widget into commands. Uses an emacs-ish interface.
- *
- */
-
-#define E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE (e_text_event_processor_emacs_like_get_type ())
-#define E_TEXT_EVENT_PROCESSOR_EMACS_LIKE(obj) (GTK_CHECK_CAST ((obj), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE, ETextEventProcessorEmacsLike))
-#define E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE, ETextEventProcessorEmacsLikeClass))
-#define E_IS_TEXT_EVENT_PROCESSOR_EMACS_LIKE(obj) (GTK_CHECK_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE))
-#define E_IS_TEXT_EVENT_PROCESSOR_EMACS_LIKE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE))
-
-
-typedef struct _ETextEventProcessorEmacsLike ETextEventProcessorEmacsLike;
-typedef struct _ETextEventProcessorEmacsLikeClass ETextEventProcessorEmacsLikeClass;
-
-struct _ETextEventProcessorEmacsLike
-{
- ETextEventProcessor parent;
-
- /* object specific fields */
- gboolean mouse_down;
-};
-
-struct _ETextEventProcessorEmacsLikeClass
-{
- ETextEventProcessorClass parent_class;
-};
-
-
-GtkType e_text_event_processor_emacs_like_get_type (void);
-ETextEventProcessor *e_text_event_processor_emacs_like_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_H__ */
diff --git a/e-util/e-text-event-processor-types.h b/e-util/e-text-event-processor-types.h
deleted file mode 100644
index 8f2ffbaf39..0000000000
--- a/e-util/e-text-event-processor-types.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#ifndef __E_TEXT_EVENT_PROCESSOR_TYPES_H__
-#define __E_TEXT_EVENT_PROCESSOR_TYPES_H__
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#include <gdk/gdktypes.h>
-
-typedef enum _ETextEventProcessorCommandPosition ETextEventProcessorCommandPosition;
-typedef enum _ETextEventProcessorCommandAction ETextEventProcessorCommandAction;
-typedef struct _ETextEventProcessorCommand ETextEventProcessorCommand;
-
-typedef union _ETextEventProcessorEvent ETextEventProcessorEvent;
-typedef struct _ETextEventProcessorEventButton ETextEventProcessorEventButton;
-typedef struct _ETextEventProcessorEventKey ETextEventProcessorEventKey;
-typedef struct _ETextEventProcessorEventMotion ETextEventProcessorEventMotion;
-
-enum _ETextEventProcessorCommandPosition {
- E_TEP_VALUE,
- E_TEP_SELECTION,
-
- E_TEP_START_OF_BUFFER,
- E_TEP_END_OF_BUFFER,
-
- E_TEP_START_OF_LINE,
- E_TEP_END_OF_LINE,
-
- E_TEP_FORWARD_CHARACTER,
- E_TEP_BACKWARD_CHARACTER,
-
- E_TEP_FORWARD_WORD,
- E_TEP_BACKWARD_WORD,
-
- E_TEP_FORWARD_LINE,
- E_TEP_BACKWARD_LINE,
-
- E_TEP_FORWARD_PARAGRAPH,
- E_TEP_BACKWARD_PARAGRAPH,
-
- E_TEP_FORWARD_PAGE,
- E_TEP_BACKWARD_PAGE,
-
- E_TEP_SELECT_WORD,
- E_TEP_SELECT_ALL
-
-};
-
-enum _ETextEventProcessorCommandAction {
- E_TEP_MOVE,
- E_TEP_SELECT,
- E_TEP_DELETE,
- E_TEP_INSERT,
-
- E_TEP_COPY,
- E_TEP_PASTE,
- E_TEP_GET_SELECTION,
- E_TEP_SET_SELECT_BY_WORD,
- E_TEP_ACTIVATE,
-
- E_TEP_GRAB,
- E_TEP_UNGRAB,
-
- E_TEP_NOP
-};
-
-struct _ETextEventProcessorCommand {
- ETextEventProcessorCommandPosition position;
- ETextEventProcessorCommandAction action;
- int value;
- char *string;
- guint32 time;
-};
-
-struct _ETextEventProcessorEventButton {
- GdkEventType type;
- guint32 time;
- guint state;
- guint button;
- gint position;
-};
-
-struct _ETextEventProcessorEventKey {
- GdkEventType type;
- guint32 time;
- guint state;
- guint keyval;
- gint length;
- gchar *string;
-};
-
-struct _ETextEventProcessorEventMotion {
- GdkEventType type;
- guint32 time;
- guint state;
- gint position;
-};
-
-union _ETextEventProcessorEvent {
- GdkEventType type;
- ETextEventProcessorEventButton button;
- ETextEventProcessorEventKey key;
- ETextEventProcessorEventMotion motion;
-};
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TEXT_EVENT_PROCESSOR_TYPES_H__ */
diff --git a/e-util/e-text-event-processor.c b/e-util/e-text-event-processor.c
deleted file mode 100644
index 47f028ca62..0000000000
--- a/e-util/e-text-event-processor.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-text-event-processor.h"
-static void e_text_event_processor_init (ETextEventProcessor *card);
-static void e_text_event_processor_class_init (ETextEventProcessorClass *klass);
-
-static GtkObjectClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0
-};
-
-enum {
- E_TEP_EVENT,
- E_TEP_LAST_SIGNAL
-};
-
-static guint e_tep_signals[E_TEP_LAST_SIGNAL] = { 0 };
-
-GtkType
-e_text_event_processor_get_type (void)
-{
- static GtkType text_event_processor_type = 0;
-
- if (!text_event_processor_type)
- {
- static const GtkTypeInfo text_event_processor_info =
- {
- "ETextEventProcessor",
- sizeof (ETextEventProcessor),
- sizeof (ETextEventProcessorClass),
- (GtkClassInitFunc) e_text_event_processor_class_init,
- (GtkObjectInitFunc) e_text_event_processor_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- text_event_processor_type = gtk_type_unique (gtk_object_get_type (), &text_event_processor_info);
- }
-
- return text_event_processor_type;
-}
-
-static void
-e_text_event_processor_class_init (ETextEventProcessorClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass*) klass;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-
- e_tep_signals[E_TEP_EVENT] =
- gtk_signal_new ("command",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETextEventProcessorClass, command),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (object_class, e_tep_signals, E_TEP_LAST_SIGNAL);
-
- klass->event = NULL;
- klass->command = NULL;
-}
-
-static void
-e_text_event_processor_init (ETextEventProcessor *tep)
-{
-}
-
-gint
-e_text_event_processor_handle_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event)
-{
- if (E_TEXT_EVENT_PROCESSOR_CLASS(GTK_OBJECT(tep)->klass)->event) {
- return E_TEXT_EVENT_PROCESSOR_CLASS(GTK_OBJECT(tep)->klass)->event(tep, event);
- } else {
- return 0;
- }
-}
diff --git a/e-util/e-text-event-processor.h b/e-util/e-text-event-processor.h
deleted file mode 100644
index 1fc79f3f70..0000000000
--- a/e-util/e-text-event-processor.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_TEXT_EVENT_PROCESSOR_H__
-#define __E_TEXT_EVENT_PROCESSOR_H__
-
-#include <gnome.h>
-#include "e-text-event-processor-types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETextEventProcessor - Turns events on a text widget into commands.
- *
- */
-
-#define E_TEXT_EVENT_PROCESSOR_TYPE (e_text_event_processor_get_type ())
-#define E_TEXT_EVENT_PROCESSOR(obj) (GTK_CHECK_CAST ((obj), E_TEXT_EVENT_PROCESSOR_TYPE, ETextEventProcessor))
-#define E_TEXT_EVENT_PROCESSOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TEXT_EVENT_PROCESSOR_TYPE, ETextEventProcessorClass))
-#define E_IS_TEXT_EVENT_PROCESSOR(obj) (GTK_CHECK_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_TYPE))
-#define E_IS_TEXT_EVENT_PROCESSOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_TYPE))
-
-
-typedef struct _ETextEventProcessor ETextEventProcessor;
-typedef struct _ETextEventProcessorClass ETextEventProcessorClass;
-
-struct _ETextEventProcessor
-{
- GtkObject parent;
-
- /* object specific fields */
-
-};
-
-struct _ETextEventProcessorClass
-{
- GtkObjectClass parent_class;
-
- /* signals */
- void (* command) (ETextEventProcessor *tep, ETextEventProcessorCommand *command);
-
- /* virtual functions */
- gint (* event) (ETextEventProcessor *tep, ETextEventProcessorEvent *event);
-};
-
-
-GtkType e_text_event_processor_get_type (void);
-gint e_text_event_processor_handle_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TEXT_EVENT_PROCESSOR_H__ */
diff --git a/e-util/e-util.c b/e-util/e-util.c
deleted file mode 100644
index 90a5697fb0..0000000000
--- a/e-util/e-util.c
+++ /dev/null
@@ -1,475 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-xml-utils.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <glib.h>
-#include <gtk/gtkobject.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <string.h>
-
-#include "e-util.h"
-#if 0
-#include <libgnomevfs/gnome-vfs.h>
-#endif
-
-int
-g_str_compare(const void *x, const void *y)
-{
- return strcmp(x, y);
-}
-
-int
-g_int_compare(const void *x, const void *y)
-{
- if ( GPOINTER_TO_INT(x) < GPOINTER_TO_INT(y) )
- return -1;
- else if ( GPOINTER_TO_INT(x) == GPOINTER_TO_INT(y) )
- return 0;
- else
- return 1;
-}
-
-char *
-e_strdup_strip(char *string)
-{
- int i;
- int length = 0;
- int initial = 0;
- for ( i = 0; string[i]; i++ ) {
- if (initial == i && isspace(string[i])) {
- initial ++;
- }
- if (!isspace(string[i])) {
- length = i - initial + 1;
- }
- }
- return g_strndup(string + initial, length);
-}
-
-void
-e_free_object_list (GList *list)
-{
- GList *p;
-
- for (p = list; p != NULL; p = p->next)
- gtk_object_unref (GTK_OBJECT (p->data));
-
- g_list_free (list);
-}
-
-void
-e_free_string_list (GList *list)
-{
- GList *p;
-
- for (p = list; p != NULL; p = p->next)
- g_free (p->data);
-
- g_list_free (list);
-}
-
-#define BUFF_SIZE 1024
-
-char *
-e_read_file(const char *filename)
-{
- int fd;
- char buffer[BUFF_SIZE];
- GList *list = NULL, *list_iterator;
- GList *lengths = NULL, *lengths_iterator;
- int length = 0;
- int bytes;
- char *ret_val;
-
- fd = open(filename, O_RDONLY);
- if (fd == -1)
- return NULL;
- bytes = read(fd, buffer, BUFF_SIZE);
- while (bytes) {
- if (bytes > 0) {
- char *temp = g_malloc(bytes);
- memcpy (temp, buffer, bytes);
- list = g_list_prepend(list, temp);
- lengths = g_list_prepend(lengths, GINT_TO_POINTER(bytes));
- length += bytes;
- } else {
- if (errno != EINTR) {
- close(fd);
- g_list_foreach(list, (GFunc) g_free, NULL);
- g_list_free(list);
- g_list_free(lengths);
- return NULL;
- }
- }
- bytes = read(fd, buffer, BUFF_SIZE);
- }
- ret_val = g_new(char, length + 1);
- ret_val[length] = 0;
- lengths_iterator = lengths;
- list_iterator = list;
- for ( ; list_iterator; list_iterator = list_iterator->next, lengths_iterator = lengths_iterator->next) {
- int this_length = GPOINTER_TO_INT(lengths_iterator->data);
- length -= this_length;
- memcpy(ret_val + length, list_iterator->data, this_length);
- }
- close(fd);
- g_list_foreach(list, (GFunc) g_free, NULL);
- g_list_free(list);
- g_list_free(lengths);
- return ret_val;
-}
-
-gint
-e_write_file(const char *filename, const char *data, int flags)
-{
- int fd;
- int length = strlen(data);
- int bytes;
- fd = open(filename, flags, 0666);
- if (fd == -1)
- return errno;
- while (length > 0) {
- bytes = write(fd, data, length);
- if (bytes > 0) {
- length -= bytes;
- data += bytes;
- } else {
- if (errno != EINTR && errno != EAGAIN) {
- int save_errno = errno;
- close(fd);
- return save_errno;
- }
- }
- }
- close(fd);
- return 0;
-}
-
-#if 0
-char *
-e_read_uri(const char *uri)
-{
- GnomeVFSHandle *handle;
- GList *list = NULL, *list_iterator;
- GList *lengths = NULL, *lengths_iterator;
- gchar buffer[1025];
- gchar *ret_val;
- int length = 0;
- GnomeVFSFileSize bytes;
-
- gnome_vfs_open(&handle, uri, GNOME_VFS_OPEN_READ);
-
- gnome_vfs_read(handle, buffer, 1024, &bytes);
- while (bytes) {
- if (bytes) {
- char *temp = g_malloc(bytes);
- memcpy (temp, buffer, bytes);
- list = g_list_prepend(list, temp);
- lengths = g_list_prepend(lengths, GINT_TO_POINTER((gint) bytes));
- length += bytes;
- }
- gnome_vfs_read(handle, buffer, 1024, &bytes);
- }
-
- ret_val = g_new(char, length + 1);
- ret_val[length] = 0;
- lengths_iterator = lengths;
- list_iterator = list;
- for ( ; list_iterator; list_iterator = list_iterator->next, lengths_iterator = lengths_iterator->next) {
- int this_length = GPOINTER_TO_INT(lengths_iterator->data);
- length -= this_length;
- memcpy(ret_val + length, list_iterator->data, this_length);
- }
- gnome_vfs_close(handle);
- g_list_foreach(list, (GFunc) g_free, NULL);
- g_list_free(list);
- g_list_free(lengths);
- return ret_val;
-}
-#endif
-
-typedef gint (*GtkSignal_INT__INT_INT_POINTER) (GtkObject * object,
- gint arg1,
- gint arg2,
- gpointer arg3,
- gpointer user_data);
-
-void
-e_marshal_INT__INT_INT_POINTER (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_INT__INT_INT_POINTER rfunc;
- gint *return_val;
- return_val = GTK_RETLOC_INT (args[3]);
- rfunc = (GtkSignal_INT__INT_INT_POINTER) func;
- *return_val = (*rfunc) (object,
- GTK_VALUE_INT (args[0]),
- GTK_VALUE_INT (args[1]),
- GTK_VALUE_POINTER (args[2]),
- func_data);
-}
-
-typedef void (*GtkSignal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL) (GtkObject * object,
- GtkObject *arg1,
- gdouble arg2,
- gdouble arg3,
- gboolean arg4,
- gpointer user_data);
-
-void
-e_marshal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL rfunc;
- rfunc = (GtkSignal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL) func;
- (*rfunc) (object,
- GTK_VALUE_OBJECT (args[0]),
- GTK_VALUE_DOUBLE (args[1]),
- GTK_VALUE_DOUBLE (args[2]),
- GTK_VALUE_BOOL (args[3]),
- func_data);
-}
-
-typedef gdouble (*GtkSignal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL) (GtkObject * object,
- GtkObject *arg1,
- gdouble arg2,
- gdouble arg3,
- gboolean arg4,
- gpointer user_data);
-
-void
-e_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL rfunc;
- gdouble *return_val;
- return_val = GTK_RETLOC_DOUBLE (args[4]);
- rfunc = (GtkSignal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL) func;
- *return_val = (*rfunc) (object,
- GTK_VALUE_OBJECT (args[0]),
- GTK_VALUE_DOUBLE (args[1]),
- GTK_VALUE_DOUBLE (args[2]),
- GTK_VALUE_BOOL (args[3]),
- func_data);
-}
-
-typedef gdouble (*GtkSignal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL) (GtkObject * object,
- GtkObject *arg1,
- gdouble arg2,
- gdouble arg3,
- gboolean arg4,
- gpointer user_data);
-
-void
-e_marshal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL rfunc;
- gboolean *return_val;
- return_val = GTK_RETLOC_BOOL (args[4]);
- rfunc = (GtkSignal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL) func;
- *return_val = (*rfunc) (object,
- GTK_VALUE_OBJECT (args[0]),
- GTK_VALUE_DOUBLE (args[1]),
- GTK_VALUE_DOUBLE (args[2]),
- GTK_VALUE_BOOL (args[3]),
- func_data);
-}
-
-typedef void (*GtkSignal_NONE__INT_INT_POINTER_POINTER_INT_INT) (GtkObject * object,
- gint arg1,
- gint arg2,
- gpointer arg3,
- gpointer arg4,
- gint arg5,
- gint arg6,
- gpointer user_data);
-void
-e_marshal_NONE__INT_INT_POINTER_POINTER_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_NONE__INT_INT_POINTER_POINTER_INT_INT rfunc;
- rfunc = (GtkSignal_NONE__INT_INT_POINTER_POINTER_INT_INT) func;
- (*rfunc) (object,
- GTK_VALUE_INT (args[0]), GTK_VALUE_INT (args[1]),
- GTK_VALUE_POINTER (args[2]),
- GTK_VALUE_POINTER (args[3]),
- GTK_VALUE_INT (args[4]), GTK_VALUE_INT (args[5]), func_data);
-}
-
-typedef void (*GtkSignal_NONE__INT_INT_POINTER_INT) (GtkObject * object,
- gint arg1,
- gint arg2,
- gpointer arg3,
- gint arg4, gpointer user_data);
-void
-e_marshal_NONE__INT_INT_POINTER_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_NONE__INT_INT_POINTER_INT rfunc;
- rfunc = (GtkSignal_NONE__INT_INT_POINTER_INT) func;
- (*rfunc) (object,
- GTK_VALUE_INT (args[0]), GTK_VALUE_INT (args[1]),
- GTK_VALUE_POINTER (args[2]), GTK_VALUE_INT (args[3]), func_data);
-}
-
-typedef gboolean (*GtkSignal_BOOL__INT_INT_POINTER_INT_INT_INT) (GtkObject * object,
- gint arg1,
- gint arg2,
- gpointer arg3,
- gint arg4,
- gint arg5,
- gint arg6,
- gpointer user_data);
-void
-e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_BOOL__INT_INT_POINTER_INT_INT_INT rfunc;
- gboolean *return_val;
- return_val = GTK_RETLOC_BOOL (args[6]);
- rfunc = (GtkSignal_BOOL__INT_INT_POINTER_INT_INT_INT) func;
- *return_val = (*rfunc) (object,
- GTK_VALUE_INT (args[0]),
- GTK_VALUE_INT (args[1]),
- GTK_VALUE_POINTER (args[2]),
- GTK_VALUE_INT (args[3]),
- GTK_VALUE_INT (args[4]),
- GTK_VALUE_INT (args[5]), func_data);
-}
-
-typedef void (*GtkSignal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT) (GtkObject *
- object,
- gint arg1,
- gint arg2,
- gpointer
- arg3,
- gint arg4,
- gint arg5,
- gpointer
- arg6,
- gint arg7,
- gint arg8,
- gpointer
- user_data);
-void
-e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg * args)
-{
- GtkSignal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT rfunc;
- rfunc = (GtkSignal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT) func;
- (*rfunc) (object,
- GTK_VALUE_INT (args[0]), GTK_VALUE_INT (args[1]),
- GTK_VALUE_POINTER (args[2]),
- GTK_VALUE_INT (args[3]),
- GTK_VALUE_INT (args[4]),
- GTK_VALUE_POINTER (args[5]),
- GTK_VALUE_INT (args[6]), GTK_VALUE_INT (args[7]), func_data);
-}
-
-gchar**
-e_strsplit (const gchar *string,
- const gchar *delimiter,
- gint max_tokens)
-{
- GSList *string_list = NULL, *slist;
- gchar **str_array, *s;
- guint i, n = 1;
-
- g_return_val_if_fail (string != NULL, NULL);
- g_return_val_if_fail (delimiter != NULL, NULL);
-
- if (max_tokens < 1)
- max_tokens = G_MAXINT;
-
- s = strstr (string, delimiter);
- if (s)
- {
- guint delimiter_len = strlen (delimiter);
-
- do
- {
- guint len;
- gchar *new_string;
-
- len = s - string;
- new_string = g_new (gchar, len + 1);
- strncpy (new_string, string, len);
- new_string[len] = 0;
- string_list = g_slist_prepend (string_list, new_string);
- n++;
- string = s + delimiter_len;
- s = strstr (string, delimiter);
- }
- while (--max_tokens && s);
- }
-
- n++;
- string_list = g_slist_prepend (string_list, g_strdup (string));
-
- str_array = g_new (gchar*, n);
-
- i = n - 1;
-
- str_array[i--] = NULL;
- for (slist = string_list; slist; slist = slist->next)
- str_array[i--] = slist->data;
-
- g_slist_free (string_list);
-
- return str_array;
-}
-
-const gchar *
-e_strstrcase (const gchar *haystack, const gchar *needle)
-{
- /* find the needle in the haystack neglecting case */
- gchar *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 = (char *)haystack; *(ptr + len - 1) != '\0'; ptr++)
- if (!g_strncasecmp(ptr, needle, len))
- return ptr;
-
- return NULL;
-}
diff --git a/e-util/e-util.c-8611 b/e-util/e-util.c-8611
deleted file mode 100644
index 90a5697fb0..0000000000
--- a/e-util/e-util.c-8611
+++ /dev/null
@@ -1,475 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-xml-utils.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <glib.h>
-#include <gtk/gtkobject.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <string.h>
-
-#include "e-util.h"
-#if 0
-#include <libgnomevfs/gnome-vfs.h>
-#endif
-
-int
-g_str_compare(const void *x, const void *y)
-{
- return strcmp(x, y);
-}
-
-int
-g_int_compare(const void *x, const void *y)
-{
- if ( GPOINTER_TO_INT(x) < GPOINTER_TO_INT(y) )
- return -1;
- else if ( GPOINTER_TO_INT(x) == GPOINTER_TO_INT(y) )
- return 0;
- else
- return 1;
-}
-
-char *
-e_strdup_strip(char *string)
-{
- int i;
- int length = 0;
- int initial = 0;
- for ( i = 0; string[i]; i++ ) {
- if (initial == i && isspace(string[i])) {
- initial ++;
- }
- if (!isspace(string[i])) {
- length = i - initial + 1;
- }
- }
- return g_strndup(string + initial, length);
-}
-
-void
-e_free_object_list (GList *list)
-{
- GList *p;
-
- for (p = list; p != NULL; p = p->next)
- gtk_object_unref (GTK_OBJECT (p->data));
-
- g_list_free (list);
-}
-
-void
-e_free_string_list (GList *list)
-{
- GList *p;
-
- for (p = list; p != NULL; p = p->next)
- g_free (p->data);
-
- g_list_free (list);
-}
-
-#define BUFF_SIZE 1024
-
-char *
-e_read_file(const char *filename)
-{
- int fd;
- char buffer[BUFF_SIZE];
- GList *list = NULL, *list_iterator;
- GList *lengths = NULL, *lengths_iterator;
- int length = 0;
- int bytes;
- char *ret_val;
-
- fd = open(filename, O_RDONLY);
- if (fd == -1)
- return NULL;
- bytes = read(fd, buffer, BUFF_SIZE);
- while (bytes) {
- if (bytes > 0) {
- char *temp = g_malloc(bytes);
- memcpy (temp, buffer, bytes);
- list = g_list_prepend(list, temp);
- lengths = g_list_prepend(lengths, GINT_TO_POINTER(bytes));
- length += bytes;
- } else {
- if (errno != EINTR) {
- close(fd);
- g_list_foreach(list, (GFunc) g_free, NULL);
- g_list_free(list);
- g_list_free(lengths);
- return NULL;
- }
- }
- bytes = read(fd, buffer, BUFF_SIZE);
- }
- ret_val = g_new(char, length + 1);
- ret_val[length] = 0;
- lengths_iterator = lengths;
- list_iterator = list;
- for ( ; list_iterator; list_iterator = list_iterator->next, lengths_iterator = lengths_iterator->next) {
- int this_length = GPOINTER_TO_INT(lengths_iterator->data);
- length -= this_length;
- memcpy(ret_val + length, list_iterator->data, this_length);
- }
- close(fd);
- g_list_foreach(list, (GFunc) g_free, NULL);
- g_list_free(list);
- g_list_free(lengths);
- return ret_val;
-}
-
-gint
-e_write_file(const char *filename, const char *data, int flags)
-{
- int fd;
- int length = strlen(data);
- int bytes;
- fd = open(filename, flags, 0666);
- if (fd == -1)
- return errno;
- while (length > 0) {
- bytes = write(fd, data, length);
- if (bytes > 0) {
- length -= bytes;
- data += bytes;
- } else {
- if (errno != EINTR && errno != EAGAIN) {
- int save_errno = errno;
- close(fd);
- return save_errno;
- }
- }
- }
- close(fd);
- return 0;
-}
-
-#if 0
-char *
-e_read_uri(const char *uri)
-{
- GnomeVFSHandle *handle;
- GList *list = NULL, *list_iterator;
- GList *lengths = NULL, *lengths_iterator;
- gchar buffer[1025];
- gchar *ret_val;
- int length = 0;
- GnomeVFSFileSize bytes;
-
- gnome_vfs_open(&handle, uri, GNOME_VFS_OPEN_READ);
-
- gnome_vfs_read(handle, buffer, 1024, &bytes);
- while (bytes) {
- if (bytes) {
- char *temp = g_malloc(bytes);
- memcpy (temp, buffer, bytes);
- list = g_list_prepend(list, temp);
- lengths = g_list_prepend(lengths, GINT_TO_POINTER((gint) bytes));
- length += bytes;
- }
- gnome_vfs_read(handle, buffer, 1024, &bytes);
- }
-
- ret_val = g_new(char, length + 1);
- ret_val[length] = 0;
- lengths_iterator = lengths;
- list_iterator = list;
- for ( ; list_iterator; list_iterator = list_iterator->next, lengths_iterator = lengths_iterator->next) {
- int this_length = GPOINTER_TO_INT(lengths_iterator->data);
- length -= this_length;
- memcpy(ret_val + length, list_iterator->data, this_length);
- }
- gnome_vfs_close(handle);
- g_list_foreach(list, (GFunc) g_free, NULL);
- g_list_free(list);
- g_list_free(lengths);
- return ret_val;
-}
-#endif
-
-typedef gint (*GtkSignal_INT__INT_INT_POINTER) (GtkObject * object,
- gint arg1,
- gint arg2,
- gpointer arg3,
- gpointer user_data);
-
-void
-e_marshal_INT__INT_INT_POINTER (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_INT__INT_INT_POINTER rfunc;
- gint *return_val;
- return_val = GTK_RETLOC_INT (args[3]);
- rfunc = (GtkSignal_INT__INT_INT_POINTER) func;
- *return_val = (*rfunc) (object,
- GTK_VALUE_INT (args[0]),
- GTK_VALUE_INT (args[1]),
- GTK_VALUE_POINTER (args[2]),
- func_data);
-}
-
-typedef void (*GtkSignal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL) (GtkObject * object,
- GtkObject *arg1,
- gdouble arg2,
- gdouble arg3,
- gboolean arg4,
- gpointer user_data);
-
-void
-e_marshal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL rfunc;
- rfunc = (GtkSignal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL) func;
- (*rfunc) (object,
- GTK_VALUE_OBJECT (args[0]),
- GTK_VALUE_DOUBLE (args[1]),
- GTK_VALUE_DOUBLE (args[2]),
- GTK_VALUE_BOOL (args[3]),
- func_data);
-}
-
-typedef gdouble (*GtkSignal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL) (GtkObject * object,
- GtkObject *arg1,
- gdouble arg2,
- gdouble arg3,
- gboolean arg4,
- gpointer user_data);
-
-void
-e_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL rfunc;
- gdouble *return_val;
- return_val = GTK_RETLOC_DOUBLE (args[4]);
- rfunc = (GtkSignal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL) func;
- *return_val = (*rfunc) (object,
- GTK_VALUE_OBJECT (args[0]),
- GTK_VALUE_DOUBLE (args[1]),
- GTK_VALUE_DOUBLE (args[2]),
- GTK_VALUE_BOOL (args[3]),
- func_data);
-}
-
-typedef gdouble (*GtkSignal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL) (GtkObject * object,
- GtkObject *arg1,
- gdouble arg2,
- gdouble arg3,
- gboolean arg4,
- gpointer user_data);
-
-void
-e_marshal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL rfunc;
- gboolean *return_val;
- return_val = GTK_RETLOC_BOOL (args[4]);
- rfunc = (GtkSignal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL) func;
- *return_val = (*rfunc) (object,
- GTK_VALUE_OBJECT (args[0]),
- GTK_VALUE_DOUBLE (args[1]),
- GTK_VALUE_DOUBLE (args[2]),
- GTK_VALUE_BOOL (args[3]),
- func_data);
-}
-
-typedef void (*GtkSignal_NONE__INT_INT_POINTER_POINTER_INT_INT) (GtkObject * object,
- gint arg1,
- gint arg2,
- gpointer arg3,
- gpointer arg4,
- gint arg5,
- gint arg6,
- gpointer user_data);
-void
-e_marshal_NONE__INT_INT_POINTER_POINTER_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_NONE__INT_INT_POINTER_POINTER_INT_INT rfunc;
- rfunc = (GtkSignal_NONE__INT_INT_POINTER_POINTER_INT_INT) func;
- (*rfunc) (object,
- GTK_VALUE_INT (args[0]), GTK_VALUE_INT (args[1]),
- GTK_VALUE_POINTER (args[2]),
- GTK_VALUE_POINTER (args[3]),
- GTK_VALUE_INT (args[4]), GTK_VALUE_INT (args[5]), func_data);
-}
-
-typedef void (*GtkSignal_NONE__INT_INT_POINTER_INT) (GtkObject * object,
- gint arg1,
- gint arg2,
- gpointer arg3,
- gint arg4, gpointer user_data);
-void
-e_marshal_NONE__INT_INT_POINTER_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_NONE__INT_INT_POINTER_INT rfunc;
- rfunc = (GtkSignal_NONE__INT_INT_POINTER_INT) func;
- (*rfunc) (object,
- GTK_VALUE_INT (args[0]), GTK_VALUE_INT (args[1]),
- GTK_VALUE_POINTER (args[2]), GTK_VALUE_INT (args[3]), func_data);
-}
-
-typedef gboolean (*GtkSignal_BOOL__INT_INT_POINTER_INT_INT_INT) (GtkObject * object,
- gint arg1,
- gint arg2,
- gpointer arg3,
- gint arg4,
- gint arg5,
- gint arg6,
- gpointer user_data);
-void
-e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args)
-{
- GtkSignal_BOOL__INT_INT_POINTER_INT_INT_INT rfunc;
- gboolean *return_val;
- return_val = GTK_RETLOC_BOOL (args[6]);
- rfunc = (GtkSignal_BOOL__INT_INT_POINTER_INT_INT_INT) func;
- *return_val = (*rfunc) (object,
- GTK_VALUE_INT (args[0]),
- GTK_VALUE_INT (args[1]),
- GTK_VALUE_POINTER (args[2]),
- GTK_VALUE_INT (args[3]),
- GTK_VALUE_INT (args[4]),
- GTK_VALUE_INT (args[5]), func_data);
-}
-
-typedef void (*GtkSignal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT) (GtkObject *
- object,
- gint arg1,
- gint arg2,
- gpointer
- arg3,
- gint arg4,
- gint arg5,
- gpointer
- arg6,
- gint arg7,
- gint arg8,
- gpointer
- user_data);
-void
-e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg * args)
-{
- GtkSignal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT rfunc;
- rfunc = (GtkSignal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT) func;
- (*rfunc) (object,
- GTK_VALUE_INT (args[0]), GTK_VALUE_INT (args[1]),
- GTK_VALUE_POINTER (args[2]),
- GTK_VALUE_INT (args[3]),
- GTK_VALUE_INT (args[4]),
- GTK_VALUE_POINTER (args[5]),
- GTK_VALUE_INT (args[6]), GTK_VALUE_INT (args[7]), func_data);
-}
-
-gchar**
-e_strsplit (const gchar *string,
- const gchar *delimiter,
- gint max_tokens)
-{
- GSList *string_list = NULL, *slist;
- gchar **str_array, *s;
- guint i, n = 1;
-
- g_return_val_if_fail (string != NULL, NULL);
- g_return_val_if_fail (delimiter != NULL, NULL);
-
- if (max_tokens < 1)
- max_tokens = G_MAXINT;
-
- s = strstr (string, delimiter);
- if (s)
- {
- guint delimiter_len = strlen (delimiter);
-
- do
- {
- guint len;
- gchar *new_string;
-
- len = s - string;
- new_string = g_new (gchar, len + 1);
- strncpy (new_string, string, len);
- new_string[len] = 0;
- string_list = g_slist_prepend (string_list, new_string);
- n++;
- string = s + delimiter_len;
- s = strstr (string, delimiter);
- }
- while (--max_tokens && s);
- }
-
- n++;
- string_list = g_slist_prepend (string_list, g_strdup (string));
-
- str_array = g_new (gchar*, n);
-
- i = n - 1;
-
- str_array[i--] = NULL;
- for (slist = string_list; slist; slist = slist->next)
- str_array[i--] = slist->data;
-
- g_slist_free (string_list);
-
- return str_array;
-}
-
-const gchar *
-e_strstrcase (const gchar *haystack, const gchar *needle)
-{
- /* find the needle in the haystack neglecting case */
- gchar *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 = (char *)haystack; *(ptr + len - 1) != '\0'; ptr++)
- if (!g_strncasecmp(ptr, needle, len))
- return ptr;
-
- return NULL;
-}
diff --git a/e-util/e-util.h b/e-util/e-util.h
deleted file mode 100644
index 87af6032c2..0000000000
--- a/e-util/e-util.h
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef _E_UTIL_H_
-#define _E_UTIL_H_
-
-#include <glib.h>
-#include <gtk/gtktypeutils.h>
-
-#define E_MAKE_TYPE(l,str,t,ci,i,parent) \
-GtkType l##_get_type(void)\
-{\
- static GtkType type = 0;\
- if (!type){\
- GtkTypeInfo info = {\
- str,\
- sizeof (t),\
- sizeof (t##Class),\
- (GtkClassInitFunc) ci,\
- (GtkObjectInitFunc) i,\
- NULL, /* reserved 1 */\
- NULL, /* reserved 2 */\
- (GtkClassInitFunc) NULL\
- };\
- type = gtk_type_unique (parent, &info);\
- }\
- return type;\
-}
-
-typedef enum {
- E_FOCUS_NONE,
- E_FOCUS_CURRENT,
- E_FOCUS_START,
- E_FOCUS_END
-} EFocus;
-
-int g_str_compare (const void *x, const void *y);
-int g_int_compare (const void *x, const void *y);
-
-char *e_strdup_strip (char *string);
-
-void e_free_object_list (GList *list);
-void e_free_string_list (GList *list);
-
-char *e_read_file (const char *filename);
-gint e_write_file(const char *filename, const char *data, int flags);
-#if 0
-char *e_read_uri (const char *uri);
-#endif
-
-gchar **e_strsplit (const gchar *string,
- const gchar *delimiter,
- gint max_tokens);
-
-const gchar *e_strstrcase (const gchar *haystack,
- const gchar *needle);
-
-void e_marshal_INT__INT_INT_POINTER (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args);
-
-void e_marshal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args);
-
-void e_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args);
-
-void e_marshal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args);
-
-#define e_marshal_NONE__INT_INT_POINTER_POINTER_UINT_UINT e_marshal_NONE__INT_INT_POINTER_POINTER_INT_INT
-void e_marshal_NONE__INT_INT_POINTER_POINTER_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg * args);
-
-#define e_marshal_NONE__INT_INT_POINTER_UINT e_marshal_NONE__INT_INT_POINTER_INT
-void e_marshal_NONE__INT_INT_POINTER_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args);
-
-#define e_marshal_BOOL__INT_INT_POINTER_INT_INT_UINT e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT
-void e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg * args);
-
-#define e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_UINT_UINT e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT
-void e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg * args);
-
-#endif /* _E_UTIL_H_ */
diff --git a/e-util/e-util.h-29002 b/e-util/e-util.h-29002
deleted file mode 100644
index 87af6032c2..0000000000
--- a/e-util/e-util.h-29002
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef _E_UTIL_H_
-#define _E_UTIL_H_
-
-#include <glib.h>
-#include <gtk/gtktypeutils.h>
-
-#define E_MAKE_TYPE(l,str,t,ci,i,parent) \
-GtkType l##_get_type(void)\
-{\
- static GtkType type = 0;\
- if (!type){\
- GtkTypeInfo info = {\
- str,\
- sizeof (t),\
- sizeof (t##Class),\
- (GtkClassInitFunc) ci,\
- (GtkObjectInitFunc) i,\
- NULL, /* reserved 1 */\
- NULL, /* reserved 2 */\
- (GtkClassInitFunc) NULL\
- };\
- type = gtk_type_unique (parent, &info);\
- }\
- return type;\
-}
-
-typedef enum {
- E_FOCUS_NONE,
- E_FOCUS_CURRENT,
- E_FOCUS_START,
- E_FOCUS_END
-} EFocus;
-
-int g_str_compare (const void *x, const void *y);
-int g_int_compare (const void *x, const void *y);
-
-char *e_strdup_strip (char *string);
-
-void e_free_object_list (GList *list);
-void e_free_string_list (GList *list);
-
-char *e_read_file (const char *filename);
-gint e_write_file(const char *filename, const char *data, int flags);
-#if 0
-char *e_read_uri (const char *uri);
-#endif
-
-gchar **e_strsplit (const gchar *string,
- const gchar *delimiter,
- gint max_tokens);
-
-const gchar *e_strstrcase (const gchar *haystack,
- const gchar *needle);
-
-void e_marshal_INT__INT_INT_POINTER (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args);
-
-void e_marshal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args);
-
-void e_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args);
-
-void e_marshal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args);
-
-#define e_marshal_NONE__INT_INT_POINTER_POINTER_UINT_UINT e_marshal_NONE__INT_INT_POINTER_POINTER_INT_INT
-void e_marshal_NONE__INT_INT_POINTER_POINTER_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg * args);
-
-#define e_marshal_NONE__INT_INT_POINTER_UINT e_marshal_NONE__INT_INT_POINTER_INT
-void e_marshal_NONE__INT_INT_POINTER_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data, GtkArg * args);
-
-#define e_marshal_BOOL__INT_INT_POINTER_INT_INT_UINT e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT
-void e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg * args);
-
-#define e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_UINT_UINT e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT
-void e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT (GtkObject * object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg * args);
-
-#endif /* _E_UTIL_H_ */
diff --git a/e-util/e-xml-utils.c b/e-util/e-xml-utils.c
deleted file mode 100644
index 89f8591e8a..0000000000
--- a/e-util/e-xml-utils.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-xml-utils.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <locale.h>
-#include "e-xml-utils.h"
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-
-
-xmlNode *e_xml_get_child_by_name(xmlNode *parent, const xmlChar *child_name)
-{
- xmlNode *child;
-
- g_return_val_if_fail(parent != NULL, NULL);
- g_return_val_if_fail(child_name != NULL, NULL);
-
- for (child = parent->childs; child; child = child->next) {
- if ( !xmlStrcmp( child->name, child_name ) ) {
- return child;
- }
- }
- return NULL;
-}
-
-/* Returns the first child with the name child_name and the "lang"
- * attribute that matches the current LC_MESSAGES, or else, the first
- * child with the name child_name and no "lang" attribute.
- */
-xmlNode *
-e_xml_get_child_by_name_by_lang(xmlNode *parent, const xmlChar *child_name, const char *lang)
-{
- xmlNode *child;
- /* This is the default version of the string. */
- xmlNode *C = NULL;
-
- g_return_val_if_fail(parent != NULL, NULL);
- g_return_val_if_fail(child_name != NULL, NULL);
-
- if (lang == NULL)
- lang = setlocale(LC_MESSAGES, NULL);
-
- for (child = parent->childs; child; child = child->next) {
- if ( !xmlStrcmp( child->name, child_name ) ) {
- char *this_lang = xmlGetProp(child, "lang");
- if ( this_lang == NULL ) {
- C = child;
- }
- else if (!strcmp(this_lang, "lang"))
- return child;
- }
- }
- return C;
-}
-
-int
-e_xml_get_integer_prop_by_name(xmlNode *parent, const xmlChar *prop_name)
-{
- xmlChar *prop;
- int ret_val = 0;
-
- g_return_val_if_fail (parent != NULL, 0);
- g_return_val_if_fail (prop_name != NULL, 0);
-
- prop = xmlGetProp(parent, prop_name);
- if (prop) {
- ret_val = atoi(prop);
- xmlFree(prop);
- }
- return ret_val;
-}
-
-void
-e_xml_set_integer_prop_by_name(xmlNode *parent, const xmlChar *prop_name, int value)
-{
- xmlChar *valuestr;
-
- g_return_if_fail (parent != NULL);
- g_return_if_fail (prop_name != NULL);
-
- valuestr = g_strdup_printf("%d", value);
- xmlSetProp(parent, prop_name, valuestr);
- g_free (valuestr);
-}
-
-
diff --git a/e-util/e-xml-utils.c-56826 b/e-util/e-xml-utils.c-56826
deleted file mode 100644
index 89f8591e8a..0000000000
--- a/e-util/e-xml-utils.c-56826
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-xml-utils.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <locale.h>
-#include "e-xml-utils.h"
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-
-
-xmlNode *e_xml_get_child_by_name(xmlNode *parent, const xmlChar *child_name)
-{
- xmlNode *child;
-
- g_return_val_if_fail(parent != NULL, NULL);
- g_return_val_if_fail(child_name != NULL, NULL);
-
- for (child = parent->childs; child; child = child->next) {
- if ( !xmlStrcmp( child->name, child_name ) ) {
- return child;
- }
- }
- return NULL;
-}
-
-/* Returns the first child with the name child_name and the "lang"
- * attribute that matches the current LC_MESSAGES, or else, the first
- * child with the name child_name and no "lang" attribute.
- */
-xmlNode *
-e_xml_get_child_by_name_by_lang(xmlNode *parent, const xmlChar *child_name, const char *lang)
-{
- xmlNode *child;
- /* This is the default version of the string. */
- xmlNode *C = NULL;
-
- g_return_val_if_fail(parent != NULL, NULL);
- g_return_val_if_fail(child_name != NULL, NULL);
-
- if (lang == NULL)
- lang = setlocale(LC_MESSAGES, NULL);
-
- for (child = parent->childs; child; child = child->next) {
- if ( !xmlStrcmp( child->name, child_name ) ) {
- char *this_lang = xmlGetProp(child, "lang");
- if ( this_lang == NULL ) {
- C = child;
- }
- else if (!strcmp(this_lang, "lang"))
- return child;
- }
- }
- return C;
-}
-
-int
-e_xml_get_integer_prop_by_name(xmlNode *parent, const xmlChar *prop_name)
-{
- xmlChar *prop;
- int ret_val = 0;
-
- g_return_val_if_fail (parent != NULL, 0);
- g_return_val_if_fail (prop_name != NULL, 0);
-
- prop = xmlGetProp(parent, prop_name);
- if (prop) {
- ret_val = atoi(prop);
- xmlFree(prop);
- }
- return ret_val;
-}
-
-void
-e_xml_set_integer_prop_by_name(xmlNode *parent, const xmlChar *prop_name, int value)
-{
- xmlChar *valuestr;
-
- g_return_if_fail (parent != NULL);
- g_return_if_fail (prop_name != NULL);
-
- valuestr = g_strdup_printf("%d", value);
- xmlSetProp(parent, prop_name, valuestr);
- g_free (valuestr);
-}
-
-
diff --git a/e-util/e-xml-utils.h b/e-util/e-xml-utils.h
deleted file mode 100644
index 41b0f0b9d6..0000000000
--- a/e-util/e-xml-utils.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-xml-utils.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_XML_UTILS__
-#define __E_XML_UTILS__
-
-#include <gnome.h>
-#include <gnome-xml/tree.h>
-
-xmlNode *e_xml_get_child_by_name(xmlNode *parent, const xmlChar *child_name);
-/* lang set to NULL means use the current locale. */
-xmlNode *e_xml_get_child_by_name_by_lang(xmlNode *parent, const xmlChar *child_name, const char *lang);
-int e_xml_get_integer_prop_by_name(xmlNode *parent, const xmlChar *prop_name);
-void e_xml_set_integer_prop_by_name(xmlNode *parent, const xmlChar *prop_name, int value);
-
-#endif /* __E_XML_UTILS__ */
diff --git a/e-util/e-xml-utils.h-82548 b/e-util/e-xml-utils.h-82548
deleted file mode 100644
index 41b0f0b9d6..0000000000
--- a/e-util/e-xml-utils.h-82548
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-xml-utils.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_XML_UTILS__
-#define __E_XML_UTILS__
-
-#include <gnome.h>
-#include <gnome-xml/tree.h>
-
-xmlNode *e_xml_get_child_by_name(xmlNode *parent, const xmlChar *child_name);
-/* lang set to NULL means use the current locale. */
-xmlNode *e_xml_get_child_by_name_by_lang(xmlNode *parent, const xmlChar *child_name, const char *lang);
-int e_xml_get_integer_prop_by_name(xmlNode *parent, const xmlChar *prop_name);
-void e_xml_set_integer_prop_by_name(xmlNode *parent, const xmlChar *prop_name, int value);
-
-#endif /* __E_XML_UTILS__ */
diff --git a/e-util/ename/.cvsignore b/e-util/ename/.cvsignore
deleted file mode 100644
index 4f8c173841..0000000000
--- a/e-util/ename/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
-test-ename-western
-test-ename-western-gtk
diff --git a/e-util/ename/Makefile.am b/e-util/ename/Makefile.am
deleted file mode 100644
index 25a67a929c..0000000000
--- a/e-util/ename/Makefile.am
+++ /dev/null
@@ -1,50 +0,0 @@
-INCLUDES = \
- -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
- -DG_LOG_DOMAIN=\"EName\" \
- -I$(srcdir) \
- -I$(srcdir)/.. \
- -I$(top_srcdir) \
- -I. \
- -I.. \
- -I$(top_builddir) \
- -I$(includedir) \
- $(GNOME_INCLUDEDIR)
-
-gnome_libs = \
- $(BONOBO_GNOME_LIBS) \
- $(INTLLIBS)
-
-ename_libs = \
- libename.la \
- $(gnome_libs)
-
-lib_LTLIBRARIES = libename.la
-
-libename_la_SOURCES = \
- e-name-western.c
-
-libenameincludedir = $(includedir)/ename
-
-libenameinclude_HEADERS = \
- e-name-western-tables.h \
- e-name-western.h
-
-
-noinst_LTLIBRARIES = libename-static.la
-libename_static_la_SOURCES = $(libename_la_SOURCES)
-libename_static_la_LDFLAGS = --all-static
-
-
-noinst_PROGRAMS = \
- test-ename-western \
- test-ename-western-gtk
-
-test_ename_western_SOURCES = \
- test-ename-western.c
-
-test_ename_western_LDADD = $(ename_libs)
-
-test_ename_western_gtk_SOURCES = \
- test-ename-western-gtk.c
-
-test_ename_western_gtk_LDADD = $(ename_libs) $(gnome_libs)
diff --git a/e-util/ename/TODO b/e-util/ename/TODO
deleted file mode 100644
index 669661eea7..0000000000
--- a/e-util/ename/TODO
+++ /dev/null
@@ -1,2 +0,0 @@
-* Support other naming systems.
-* Handle misspelled suffixes better.
diff --git a/e-util/ename/e-name-western-tables.h b/e-util/ename/e-name-western-tables.h
deleted file mode 100644
index bb29cc5292..0000000000
--- a/e-util/ename/e-name-western-tables.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef __E_NAME_WESTERN_TABLES_H__
-#define __E_NAME_WESTERN_TABLES_H__
-
-char *e_name_western_pfx_table[] = {
-
- /*
- * English.
- */
- "mister", "miss.", "mr.", "mrs.", "ms.",
- "miss", "mr", "mrs", "ms", "sir",
- "professor", "prof.", "dr", "dr.", "doctor",
- "reverend", "president", "judge", "senator",
- "congressman", "congresswoman", "commander",
- "lieutenant", "colonel", "major", "general",
-
- "the honorable", "the reverend", "his holiness",
- "his eminence",
-
-
- /*
- * French.
- */
- "monsieur", "mr.", "mademoiselle", "melle.",
- "madame", "mme.", "professeur",
-
- /*
- * Spanish.
- */
- "senor", "senora", "senorita",
-
- NULL};
-
-char *e_name_western_sfx_table[] = {
-
- /*
- * English.
- */
- "junior", "senior", "jr", "sr", "I", "II", "III", "IV", "V",
- "phd", "ms", "md", "esq", "esq.", "esquire",
-
- NULL};
-
-char *e_name_western_twopart_sfx_table[] = {
-
- /*
- * English.
- */
- "the first", "the second", "the third",
-
- NULL};
-
-char *e_name_western_complex_last_table[] = {"van", "von", "de", NULL};
-
-#endif /* ! __E_NAME_WESTERN_TABLES_H__ */
diff --git a/e-util/ename/e-name-western.c b/e-util/ename/e-name-western.c
deleted file mode 100644
index 698cceec0b..0000000000
--- a/e-util/ename/e-name-western.c
+++ /dev/null
@@ -1,868 +0,0 @@
-/*
- * A simple Western name parser.
- *
- * <Nat> Jamie, do you know anything about name parsing?
- * <jwz> Are you going down that rat hole? Bring a flashlight.
- *
- * Author:
- * Nat Friedman (nat@helixcode.com)
- *
- * Copyright 1999, Helix Code, Inc.
- */
-
-#include <ctype.h>
-#include <string.h>
-#include <glib.h>
-
-#include <ename/e-name-western.h>
-#include <ename/e-name-western-tables.h>
-
-typedef struct {
- int prefix_idx;
- int first_idx;
- int middle_idx;
- int nick_idx;
- int last_idx;
- int suffix_idx;
-} ENameWesternIdxs;
-
-static int
-e_name_western_str_count_words (char *str)
-{
- int word_count;
- char *p;
-
- word_count = 0;
-
- for (p = str; p != NULL; p = strchr (p, ' ')) {
- word_count ++;
- p ++;
- }
-
- return word_count;
-}
-
-static void
-e_name_western_cleanup_string (char **str)
-{
- char *newstr;
- char *p;
-
- if (*str == NULL)
- return;
-
- /* skip any spaces and commas at the start of the string */
- p = *str;
- while (isspace (*p) || *p == ',')
- p ++;
-
- /* make the copy we're going to return */
- newstr = g_strdup (p);
-
- if ( strlen(newstr) > 0) {
- /* now search from the back, skipping over any spaces and commas */
- p = newstr + strlen (newstr) - 1;
- while (isspace (*p) || *p == ',')
- p --;
- /* advance p to after the character that caused us to exit the
- previous loop, and end the string. */
- if ((! isspace (*p)) && *p != ',')
- p ++;
- *p = '\0';
- }
-
- g_free (*str);
- *str = newstr;
-}
-
-static char *
-e_name_western_get_words_at_idx (char *str, int idx, int num_words)
-{
- char *words;
- char *p;
- int word_count;
- int words_len;
-
- /*
- * Walk to the end of the words.
- */
- word_count = 0;
- p = str + idx;
- while (word_count < num_words && *p != '\0') {
- while (! isspace (*p) && *p != '\0')
- p ++;
-
- while (isspace (*p) && *p != '\0')
- p ++;
-
- word_count ++;
- }
-
- words_len = p - str - idx - 1;
-
- if (*p == '\0')
- words_len ++;
-
- words = g_malloc0 (1 + words_len);
- strncpy (words, str + idx, words_len);
-
- return words;
-}
-
-/*
- * What the fuck is wrong with glib's MAX macro.
- */
-static int
-e_name_western_max (const int a, const int b)
-{
- if (a > b)
- return a;
-
- return b;
-}
-
-static gboolean
-e_name_western_word_is_suffix (char *word)
-{
- int i;
-
- for (i = 0; e_name_western_sfx_table [i] != NULL; i ++) {
- if (g_strcasecmp (word, e_name_western_sfx_table [i]))
- continue;
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static char *
-e_name_western_get_one_prefix_at_str (char *str)
-{
- char *word;
- int i;
-
- /*
- * Check for prefixes from our table.
- */
- for (i = 0; e_name_western_pfx_table [i] != NULL; i ++) {
- int pfx_words;
- char *words;
-
- pfx_words = e_name_western_str_count_words (e_name_western_pfx_table [i]);
- words = e_name_western_get_words_at_idx (str, 0, pfx_words);
-
- if (! g_strcasecmp (words, e_name_western_pfx_table [i]))
- return words;
-
- g_free (words);
- }
-
- /*
- * Check for prefixes we don't know about. These are always a
- * sequence of more than one letters followed by a period.
- */
- word = e_name_western_get_words_at_idx (str, 0, 1);
-
- if (strlen (word) > 2 && isalpha (word [0]) && isalpha (word [1]) &&
- word [strlen (word) - 1] == '.')
- return word;
-
- g_free (word);
-
- return NULL;
-}
-
-static char *
-e_name_western_get_prefix_at_str (char *str)
-{
- char *pfx;
- char *pfx1;
- char *pfx2;
- char *p;
-
- /* Get the first prefix. */
- pfx1 = e_name_western_get_one_prefix_at_str (str);
-
- if (pfx1 == NULL)
- return NULL;
-
- /* Check for a second prefix. */
- p = str + strlen (pfx1);
- while (isspace (*p) && *p != '\0')
- p ++;
-
- pfx2 = e_name_western_get_one_prefix_at_str (p);
-
- if (pfx2 != NULL) {
- int pfx_len;
-
- pfx_len = (p + strlen (pfx2)) - str;
- pfx = g_malloc0 (pfx_len + 1);
- strncpy (pfx, str, pfx_len);
- } else {
- pfx = g_strdup (pfx1);
- }
-
- g_free (pfx1);
- g_free (pfx2);
-
- return pfx;
-}
-
-static void
-e_name_western_extract_prefix (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- char *pfx;
-
- pfx = e_name_western_get_prefix_at_str (name->full);
-
- if (pfx == NULL)
- return;
-
- idxs->prefix_idx = 0;
- name->prefix = pfx;
-}
-
-static gboolean
-e_name_western_is_complex_last_beginning (char *word)
-{
- int i;
-
- for (i = 0; e_name_western_complex_last_table [i] != NULL; i ++) {
-
- if (! g_strcasecmp (
- word, e_name_western_complex_last_table [i]))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-e_name_western_extract_first (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- /*
- * If there's a prefix, then the first name is right after it.
- */
- if (idxs->prefix_idx != -1) {
- int first_idx;
- char *p;
-
- first_idx = idxs->prefix_idx + strlen (name->prefix);
-
- /* Skip past white space. */
- p = name->full + first_idx;
- while (isspace (*p) && *p != '\0')
- p++;
-
- if (*p == '\0')
- return;
-
- idxs->first_idx = p - name->full;
- name->first = e_name_western_get_words_at_idx (
- name->full, idxs->first_idx, 1);
-
- } else {
-
- /*
- * Otherwise, the first name is probably the first string.
- */
- idxs->first_idx = 0;
- name->first = e_name_western_get_words_at_idx (
- name->full, idxs->first_idx, 1);
- }
-
- /*
- * Check that we didn't just assign the beginning of a
- * compound last name to the first name.
- */
- if (name->first != NULL) {
- if (e_name_western_is_complex_last_beginning (name->first)) {
- g_free (name->first);
- name->first = NULL;
- idxs->first_idx = -1;
- }
- }
-}
-
-static void
-e_name_western_extract_middle (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- char *word;
- int middle_idx;
-
- /*
- * Middle names can only exist if you have a first name.
- */
- if (idxs->first_idx == -1)
- return;
-
- middle_idx = idxs->first_idx + strlen (name->first) + 1;
-
- if (middle_idx > strlen (name->full))
- return;
-
- /*
- * Search for the first space (or the terminating \0)
- */
- while (isspace (name->full [middle_idx]) &&
- name->full [middle_idx] != '\0')
- middle_idx ++;
-
- if (name->full [middle_idx] == '\0')
- return;
-
- /*
- * Skip past the nickname, if it's there.
- */
- if (name->full [middle_idx] == '\"') {
- if (idxs->nick_idx == -1)
- return;
-
- middle_idx = idxs->nick_idx + strlen (name->nick) + 1;
-
- while (isspace (name->full [middle_idx]) &&
- name->full [middle_idx] != '\0')
- middle_idx ++;
-
- if (name->full [middle_idx] == '\0')
- return;
- }
-
- /*
- * Make sure this isn't the beginning of a complex last name.
- */
- word = e_name_western_get_words_at_idx (name->full, middle_idx, 1);
- if (e_name_western_is_complex_last_beginning (word)) {
- g_free (word);
- return;
- }
-
- /*
- * Make sure this isn't a suffix.
- */
- e_name_western_cleanup_string (& word);
- if (e_name_western_word_is_suffix (word)) {
- g_free (word);
- return;
- }
-
- /*
- * Make sure we didn't just grab a cute nickname.
- */
- if (word [0] == '\"') {
- g_free (word);
- return;
- }
-
- idxs->middle_idx = middle_idx;
- name->middle = word;
-}
-
-static void
-e_name_western_extract_nickname (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- int idx;
- int start_idx;
- char *str;
-
- if (idxs->first_idx == -1)
- return;
-
- if (idxs->middle_idx > idxs->first_idx)
- idx = idxs->middle_idx + strlen (name->middle);
- else
- idx = idxs->first_idx + strlen (name->first);
-
- while (name->full [idx] != '\"' && name->full [idx] != '\0')
- idx ++;
-
- if (name->full [idx] != '\"')
- return;
-
- start_idx = idx;
-
- /*
- * Advance to the next double quote.
- */
- idx ++;
-
- while (name->full [idx] != '\"' && name->full [idx] != '\0')
- idx ++;
-
- if (name->full [idx] == '\0')
- return;
-
- str = g_malloc0 (idx - start_idx + 2);
- strncpy (str, name->full + start_idx, idx - start_idx + 1);
-
- name->nick = str;
- idxs->nick_idx = start_idx;
-}
-
-static int
-e_name_western_last_get_max_idx (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- int max_idx = -1;
-
- if (name->prefix != NULL)
- max_idx = e_name_western_max (
- max_idx, idxs->prefix_idx + strlen (name->prefix));
-
- if (name->first != NULL)
- max_idx = e_name_western_max (
- max_idx, idxs->first_idx + strlen (name->first));
-
- if (name->middle != NULL)
- max_idx = e_name_western_max (
- max_idx, idxs->middle_idx + strlen (name->middle));
-
- if (name->nick != NULL)
- max_idx = e_name_western_max (
- max_idx, idxs->nick_idx + strlen (name->nick));
-
- return max_idx;
-}
-
-static void
-e_name_western_extract_last (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- char *word;
- int idx = -1;
-
- idx = e_name_western_last_get_max_idx (name, idxs);
-
- /*
- * In the case where there is no preceding name element, the
- * name is either just a first name ("Nat", "John"), is a
- * single-element name ("Cher", which we treat as a first
- * name), or is just a last name. The only time we can
- * differentiate a last name alone from a single-element name
- * or a first name alone is if it's a complex last name ("de
- * Icaza", "van Josephsen"). So if there is no preceding name
- * element, we check to see whether or not the first part of
- * the name is the beginning of a complex name. If it is,
- * we subsume the entire string. If we accidentally subsume
- * the suffix, this will get fixed in the fixup routine.
- */
- if (idx == -1) {
- word = e_name_western_get_words_at_idx (name->full, 0, 1);
- if (! e_name_western_is_complex_last_beginning (word)) {
- g_free (word);
- return;
- }
-
- name->last = g_strdup (name->full);
- idxs->last_idx = 0;
- return;
- }
-
- /* Skip past the white space. */
- while (isspace (name->full [idx]) && name->full [idx] != '\0')
- idx ++;
-
- if (name->full [idx] == '\0')
- return;
-
- word = e_name_western_get_words_at_idx (name->full, idx, 1);
- e_name_western_cleanup_string (& word);
- if (e_name_western_word_is_suffix (word)) {
- g_free (word);
- return;
- }
- g_free (word);
-
- /*
- * Subsume the rest of the string into the last name. If we
- * accidentally include the prefix, it will get fixed later.
- * This is the only way to handle things like "Miguel de Icaza
- * Amozorrutia" without dropping data and forcing the user
- * to retype it.
- */
- name->last = g_strdup (name->full + idx);
- idxs->last_idx = idx;
-}
-
-static char *
-e_name_western_get_preceding_word (char *str, int idx)
-{
- int word_len;
- char *word;
- char *p;
-
- p = str + idx;
-
- while (isspace (*p) && p > str)
- p --;
-
- while (! isspace (*p) && p > str)
- p --;
-
- if (isspace (*p))
- p ++;
-
- word_len = (str + idx) - p;
- word = g_malloc0 (word_len + 1);
- if (word_len > 0)
- strncpy (word, p, word_len);
-
- return word;
-}
-
-static char *
-e_name_western_get_suffix_at_str_end (char *str)
-{
- char *suffix;
- char *p;
-
- /*
- * Walk backwards till we reach the beginning of the
- * (potentially-comma-separated) list of suffixes.
- */
- p = str + strlen (str);
- while (1) {
- char *nextp;
- char *word;
-
- word = e_name_western_get_preceding_word (str, p - str);
- nextp = p - strlen (word) - 1;
-
- e_name_western_cleanup_string (& word);
-
- if (e_name_western_word_is_suffix (word)) {
- p = nextp;
- g_free (word);
- } else {
- g_free (word);
- break;
- }
- }
-
- if (p == (str + strlen (str)))
- return NULL;
-
- suffix = g_strdup (p);
- e_name_western_cleanup_string (& suffix);
-
- if (strlen (suffix) == 0) {
- g_free (suffix);
- return NULL;
- }
-
- return suffix;
-}
-
-static void
-e_name_western_extract_suffix (ENameWestern *name, ENameWesternIdxs *idxs)
-{
-
- name->suffix = e_name_western_get_suffix_at_str_end (name->full);
-
- if (name->suffix == NULL)
- return;
-
- idxs->suffix_idx = strlen (name->full) - strlen (name->suffix);
-}
-
-static gboolean
-e_name_western_detect_backwards (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- char *comma;
- char *word;
-
- comma = strchr (name->full, ',');
-
- if (comma == NULL)
- return FALSE;
-
- /*
- * If there's a comma, we need to detect whether it's
- * separating the last name from the first or just separating
- * suffixes. So we grab the word which comes before the
- * comma and check if it's a suffix.
- */
- word = e_name_western_get_preceding_word (name->full, comma - name->full);
-
- if (e_name_western_word_is_suffix (word)) {
- g_free (word);
- return FALSE;
- }
-
- g_free (word);
- return TRUE;
-}
-
-static void
-e_name_western_reorder_asshole (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- char *prefix;
- char *last;
- char *suffix;
- char *firstmidnick;
- char *newfull;
-
- char *comma;
- char *p;
-
- if (! e_name_western_detect_backwards (name, idxs))
- return;
-
- /*
- * Convert
- * <Prefix> <Last name>, <First name> <Middle[+nick] name> <Suffix>
- * to
- * <Prefix> <First name> <Middle[+nick] name> <Last name> <Suffix>
- */
-
- /*
- * Grab the prefix from the beginning.
- */
- prefix = e_name_western_get_prefix_at_str (name->full);
-
- /*
- * Everything from the end of the prefix to the comma is the
- * last name.
- */
- comma = strchr (name->full, ',');
- if (comma == NULL)
- return;
-
- p = name->full + (prefix == NULL ? 0 : strlen (prefix));
-
- while (isspace (*p) && *p != '\0')
- p ++;
-
- last = g_malloc0 (comma - p + 1);
- strncpy (last, p, comma - p);
-
- /*
- * Get the suffix off the end.
- */
- suffix = e_name_western_get_suffix_at_str_end (name->full);
-
- /*
- * Firstmidnick is everything from the comma to the beginning
- * of the suffix.
- */
- p = comma + 1;
-
- while (isspace (*p) && *p != '\0')
- p ++;
-
- if (suffix != NULL) {
- char *q;
-
- /*
- * Point q at the beginning of the suffix.
- */
- q = name->full + strlen (name->full) - strlen (suffix) - 1;
-
- /*
- * Walk backwards until we hit the space which
- * separates the suffix from firstmidnick.
- */
- while (! isspace (*q) && q > comma)
- q --;
-
- if ((q - p + 1) > 0) {
- firstmidnick = g_malloc0 (q - p + 1);
- strncpy (firstmidnick, p, q - p);
- } else
- firstmidnick = NULL;
- } else {
- firstmidnick = g_strdup (p);
- }
-
- /*
- * Create our new reordered version of the name.
- */
-#define NULLSTR(a) ((a) == NULL ? "" : (a))
- newfull = g_strdup_printf ("%s %s %s %s", NULLSTR (prefix), NULLSTR (firstmidnick),
- NULLSTR (last), NULLSTR (suffix));
- g_strstrip (newfull);
- g_free (name->full);
- name->full = newfull;
-
-
- g_free (prefix);
- g_free (firstmidnick);
- g_free (last);
- g_free (suffix);
-}
-
-static void
-e_name_western_zap_nil (char **str, int *idx)
-{
- if (*str == NULL)
- return;
-
- if (strlen (*str) != 0)
- return;
-
- *idx = -1;
- g_free (*str);
- *str = NULL;
-}
-
-static void
-e_name_western_fixup (ENameWestern *name, ENameWesternIdxs *idxs)
-{
- /*
- * The middle and last names cannot be the same.
- */
- if (idxs->middle_idx != -1 && idxs->middle_idx == idxs->last_idx) {
- idxs->middle_idx = -1;
- g_free (name->middle);
- name->middle = NULL;
- }
-
- /*
- * If we have a middle name and no last name, then we mistook
- * the last name for the middle name.
- */
- if (idxs->last_idx == -1 && idxs->middle_idx != -1) {
- idxs->last_idx = idxs->middle_idx;
- name->last = name->middle;
- name->middle = NULL;
- idxs->middle_idx = -1;
- }
-
- /*
- * Check to see if we accidentally included the suffix in the
- * last name.
- */
- if (idxs->suffix_idx != -1 && idxs->last_idx != -1 &&
- idxs->suffix_idx < (idxs->last_idx + strlen (name->last))) {
- char *sfx;
-
- sfx = name->last + (idxs->suffix_idx - idxs->last_idx);
- if (sfx != NULL) {
- char *newlast;
- char *p;
-
- p = sfx - 1;
- while (isspace (*p) && p > name->last)
- p --;
- p ++;
-
- newlast = g_malloc0 (p - name->last + 1);
- strncpy (newlast, name->last, p - name->last);
- g_free (name->last);
- name->last = newlast;
- }
- }
-
- /*
- * If we have a prefix and a first name, but no last name,
- * then we need to assign the first name to the last name.
- * This way we get things like "Mr Friedman" correctly.
- */
- if (idxs->first_idx != -1 && idxs->prefix_idx != -1 &&
- idxs->last_idx == -1) {
- name->last = name->first;
- idxs->last_idx = idxs->first_idx;
- idxs->first_idx = -1;
- name->first = NULL;
- }
-
- /*
- * Remove stray spaces and commas (although there don't seem
- * to be any in the test cases, they might show up later).
- */
- e_name_western_cleanup_string (& name->prefix);
- e_name_western_cleanup_string (& name->first);
- e_name_western_cleanup_string (& name->middle);
- e_name_western_cleanup_string (& name->nick);
- e_name_western_cleanup_string (& name->last);
- e_name_western_cleanup_string (& name->suffix);
-
- /*
- * Make zero-length strings just NULL.
- */
- e_name_western_zap_nil (& name->prefix, & idxs->prefix_idx);
- e_name_western_zap_nil (& name->first, & idxs->first_idx);
- e_name_western_zap_nil (& name->middle, & idxs->middle_idx);
- e_name_western_zap_nil (& name->nick, & idxs->nick_idx);
- e_name_western_zap_nil (& name->last, & idxs->last_idx);
- e_name_western_zap_nil (& name->suffix, & idxs->suffix_idx);
-}
-
-/**
- * e_name_western_western_parse_fullname:
- * @full_name: A string containing a Western name.
- *
- * Parses @full_name and returns an #ENameWestern object filled with
- * the component parts of the name.
- */
-ENameWestern *
-e_name_western_parse (const char *full_name)
-{
- ENameWesternIdxs *idxs;
- ENameWestern *wname;
-
- wname = g_new0 (ENameWestern, 1);
-
- wname->full = g_strdup (full_name);
-
- idxs = g_new0 (ENameWesternIdxs, 1);
-
- idxs->prefix_idx = -1;
- idxs->first_idx = -1;
- idxs->middle_idx = -1;
- idxs->nick_idx = -1;
- idxs->last_idx = -1;
- idxs->suffix_idx = -1;
-
- /*
- * An extremely simple algorithm.
- *
- * The goal here is to get it right 95% of the time for
- * Western names.
- *
- * First we check to see if this is an ass-backwards name
- * ("Prefix Last, First Middle Suffix"). These names really
- * suck (imagine "Dr von Johnson, Albert Roderick Jr"), so
- * we reorder them first and then parse them.
- *
- * Next, we grab the most obvious assignments for the various
- * parts of the name. Once this is done, we check for stupid
- * errors and fix them up.
- */
- e_name_western_reorder_asshole (wname, idxs);
-
- e_name_western_extract_prefix (wname, idxs);
- e_name_western_extract_first (wname, idxs);
- e_name_western_extract_nickname (wname, idxs);
- e_name_western_extract_middle (wname, idxs);
- e_name_western_extract_last (wname, idxs);
- e_name_western_extract_suffix (wname, idxs);
-
- e_name_western_fixup (wname, idxs);
-
- g_free (idxs);
-
- return wname;
-}
-
-/**
- * e_name_western_free:
- * @name: An ENameWestern object which needs to be freed.
- *
- * Deep-frees @name
- */
-void
-e_name_western_free (ENameWestern *w)
-{
-
- g_free (w->prefix);
- g_free (w->first);
- g_free (w->middle);
- g_free (w->nick);
- g_free (w->last);
- g_free (w->suffix);
-
- g_free (w->full);
-
- g_free (w);
-}
diff --git a/e-util/ename/e-name-western.h b/e-util/ename/e-name-western.h
deleted file mode 100644
index fa5bac494c..0000000000
--- a/e-util/ename/e-name-western.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef __E_NAME_WESTERN_H__
-#define __E_NAME_WESTERN_H__
-
-typedef struct {
-
- /* Public */
- char *prefix;
- char *first;
- char *middle;
- char *nick;
- char *last;
- char *suffix;
-
- /* Private */
- char *full;
-} ENameWestern;
-
-ENameWestern *e_name_western_parse (const char *full_name);
-void e_name_western_free (ENameWestern *w);
-
-#endif /* ! __E_NAME_WESTERN_H__ */
diff --git a/e-util/ename/test-ename-western-gtk.c b/e-util/ename/test-ename-western-gtk.c
deleted file mode 100644
index 17daf42b30..0000000000
--- a/e-util/ename/test-ename-western-gtk.c
+++ /dev/null
@@ -1,148 +0,0 @@
-#include <gnome.h>
-#include <ename/e-name-western.h>
-
-ENameWestern *name;
-GtkWidget *full;
-GtkWidget *prefix;
-GtkWidget *first;
-GtkWidget *middle;
-GtkWidget *nick;
-GtkWidget *last;
-GtkWidget *suffix;
-
-static void
-fill_entries (void)
-{
-
-#define SET(a,b) (gtk_entry_set_text (GTK_ENTRY (a), (b) == NULL ? "" : (b)))
- SET(prefix, name->prefix);
- SET(first, name->first);
- SET(middle, name->middle);
- SET(nick, name->nick);
- SET(last, name->last);
- SET(suffix, name->suffix);
-}
-
-static void
-full_changed_cb (GtkEntry *fulle)
-{
- e_name_western_free (name);
- name = e_name_western_parse (gtk_entry_get_text (fulle));
- fill_entries ();
-}
-
-static void
-create_window (void)
-{
- GtkWidget *app;
- GtkTable *table;
-
- GtkWidget *prefix_label;
- GtkWidget *first_label;
- GtkWidget *middle_label;
- GtkWidget *nick_label;
- GtkWidget *last_label;
- GtkWidget *suffix_label;
-
- app = gnome_app_new ("test", "Evolution Western Name Parser");
-
- table = GTK_TABLE (gtk_table_new (3, 6, FALSE));
-
- full = gtk_entry_new ();
- prefix = gtk_entry_new ();
- first = gtk_entry_new ();
- middle = gtk_entry_new ();
- nick = gtk_entry_new ();
- last = gtk_entry_new ();
- suffix = gtk_entry_new ();
-
- gtk_widget_set_usize (prefix, 100, 0);
- gtk_widget_set_usize (first, 100, 0);
- gtk_widget_set_usize (middle, 100, 0);
- gtk_widget_set_usize (nick, 100, 0);
- gtk_widget_set_usize (last, 100, 0);
- gtk_widget_set_usize (suffix, 100, 0);
-
- gtk_table_attach (table, full, 0, 6, 0, 1,
- GTK_EXPAND | GTK_FILL, 0,
- 0, 0);
-
- gtk_table_attach (table, prefix, 0, 1, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, first, 1, 2, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, middle, 2, 3, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, nick, 3, 4, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, last, 4, 5, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, suffix, 5, 6, 1, 2,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
- 0, 0);
-
- prefix_label = gtk_label_new ("Prefix");
- first_label = gtk_label_new ("First");
- middle_label = gtk_label_new ("Middle");
- nick_label = gtk_label_new ("Nick");
- last_label = gtk_label_new ("Last");
- suffix_label = gtk_label_new ("Suffix");
-
- gtk_table_attach (table, prefix_label, 0, 1, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, first_label, 1, 2, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, middle_label, 2, 3, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, nick_label, 3, 4, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, last_label, 4, 5, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gtk_table_attach (table, suffix_label, 5, 6, 2, 3,
- GTK_SHRINK, 0,
- 0, 0);
-
- gnome_app_set_contents (GNOME_APP (app), GTK_WIDGET (table));
-
- gtk_widget_show_all (app);
-
- gtk_entry_set_text (GTK_ENTRY (full),
- "The Honorable Doctor van Jacobsen, Albert Roderick \"The Clenched Fist\" Jr, MD, PhD, Esquire");
-
- name = e_name_western_parse ("The Honorable Doctor van Jacobsen, Albert Roderick \"The Clenched Fist\" Jr, MD, PhD, Esquire");
- fill_entries ();
-
- gtk_signal_connect (GTK_OBJECT (full), "changed", full_changed_cb, NULL);
-}
-
-int
-main (int argc, char **argv)
-{
- gnome_init ("Test EName", "Test EName", argc, argv);
-
- create_window ();
-
- gtk_main ();
-
- return 0;
-}
diff --git a/e-util/ename/test-ename-western.c b/e-util/ename/test-ename-western.c
deleted file mode 100644
index 6d3beaf16f..0000000000
--- a/e-util/ename/test-ename-western.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <gnome.h>
-#include <ctype.h>
-
-#include <ename/e-name-western.h>
-
-static void
-do_name (char *n)
-{
- ENameWestern *wname;
-
- wname = e_name_western_parse (n);
-
- printf ("Full Name: [%s]\n", n);
-
- printf ("Prefix: [%s]\n", wname->prefix);
- printf ("First: [%s]\n", wname->first);
- printf ("Middle: [%s]\n", wname->middle);
- printf ("Nick: [%s]\n", wname->nick);
- printf ("Last: [%s]\n", wname->last);
- printf ("Suffix: [%s]\n", wname->suffix);
-
- printf ("\n");
-
- e_name_western_free (wname);
-}
-
-int
-main (int argc, char **argv)
-{
- if (argc == 2) {
- while (! feof (stdin)) {
- char s[256];
-
- if (fgets (s, sizeof (s), stdin) == NULL)
- return 0;
-
- g_strstrip (s);
-
- do_name (s);
- }
-
- return 0;
- }
-
- do_name ("Nat");
- do_name ("Karl Anders Carlsson");
- do_name ("Miguel de Icaza Amozorrutia");
- do_name ("The Honorable Doctor de Icaza, Miguel \"Sparky\" Junior, PhD, MD");
- do_name ("Nat Friedman MD, Phd");
- do_name ("Nat Friedman PhD");
- do_name ("Friedman, Nat");
- do_name ("Miguel de Icaza Esquire");
- do_name ("Dr Miguel \"Sparky\" de Icaza");
- do_name ("Robert H.B. Netzer");
- do_name ("W. Richard Stevens");
- do_name ("Nat Friedman");
- do_name ("N. Friedman");
- do_name ("Miguel de Icaza");
- do_name ("Drew Johnson");
- do_name ("President Bill \"Slick Willy\" Clinton");
- do_name ("The Honorable Mark J. Einstein Jr");
- do_name ("Friedman, Nat");
- do_name ("de Icaza, Miguel");
- do_name ("Mr de Icaza, Miguel");
- do_name ("Smith, John Jr");
- do_name ("Nick Glennie-Smith");
- do_name ("Dr von Johnson, Albert Roderick Jr");
-
- return 0;
-}
diff --git a/evolution.desktop b/evolution.desktop
deleted file mode 100644
index 238b50c85d..0000000000
--- a/evolution.desktop
+++ /dev/null
@@ -1,11 +0,0 @@
-[Desktop Entry]
-Name=Evolution
-Name[sl]=Evolucija
-Name[tr]=Evolution
-Comment=The Evolution groupware suite
-Comment[sl]=Programje za delo v skupini Evolucija
-Comment[tr]=Evolution kitlesel iþlemler uygulamasý
-Exec=evolution
-Icon=evolution.png
-Terminal=0
-Type=Application
diff --git a/evolution.png b/evolution.png
deleted file mode 100644
index 3b0f90b292..0000000000
--- a/evolution.png
+++ /dev/null
Binary files differ
diff --git a/evolution.spec.in b/evolution.spec.in
deleted file mode 100644
index 38f8d855f9..0000000000
--- a/evolution.spec.in
+++ /dev/null
@@ -1,124 +0,0 @@
-# Note this is NOT a relocatable thing :)
-%define name evolution
-%define ver @VERSION@
-%define RELEASE 1
-%define rel %{?CUSTOM_RELEASE} %{!?CUSTOM_RELEASE:%RELEASE}
-%define prefix /usr
-%define sysconfdir /etc
-
-Name: %name
-Summary: Integrated GNOME mail client, calendar and address book.
-Version: %ver
-Release: %rel
-Copyright: GPL
-Group: System Environment/Libraries
-Source: %{name}-%{ver}.tar.gz
-URL: http://www.gnome.org/
-BuildRoot: /var/tmp/%{name}-%{ver}-root
-Docdir: %{prefix}/doc
-
-%description
-
-%package devel
-Summary: Libraries and include files for developing Evolution components
-Group: Development/Libraries
-Requires: %name = %{PACKAGE_VERSION}
-Obsoletes: %{name}-devel
-
-%description devel
-This package provides the necessary development libraries and include
-files to allow you to develop evolution components.
-
-%changelog
-* Sun May 21 2000 Ross Golder <rossigee@bigfoot.com>
-- created spec file
-
-%prep
-%setup
-
-%build
-%ifarch alpha
- MYARCH_FLAGS="--host=alpha-redhat-linux"
-%endif
-
-LC_ALL=""
-LINGUAS=""
-LANG=""
-export LC_ALL LINGUAS LANG
-
-CFLAGS="$RPM_OPT_FLAGS" ./configure $MYARCH_FLAGS --prefix=%{prefix} \
- --sysconfdir=%{sysconfdir}
-
-if [ "$SMP" != "" ]; then
- (make "MAKE=make -k -j $SMP"; exit 0)
- make
-else
- make
-fi
-
-%install
-[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf $RPM_BUILD_ROOT
-
-make prefix=$RPM_BUILD_ROOT%{prefix} sysconfdir=$RPM_BUILD_ROOT%{sysconfdir} install
-
-for FILE in "$RPM_BUILD_ROOT/bin/*"; do
- file "$FILE" | grep -q not\ stripped && strip $FILE
-done
-
-%clean
-[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf $RPM_BUILD_ROOT
-
-%post
-if ! grep %{prefix}/lib /etc/ld.so.conf > /dev/null ; then
- echo "%{prefix}/lib" >> /etc/ld.so.conf
-fi
-
-/sbin/ldconfig
-
-%postun -p /sbin/ldconfig
-
-%files
-%defattr(0555, bin, bin)
-
-%doc AUTHORS COPYING ChangeLog NEWS README
-%{prefix}/bin/evolution
-%{prefix}/bin/evolution-mail
-%{prefix}/bin/evolution-addressbook
-%{prefix}/bin/evolution-calendar
-%{prefix}/bin/wombat
-%{prefix}/bin/killev
-%{prefix}/lib/lib*.so.*
-%{prefix}/lib/evolution/camel-providers/*/lib*.so.*
-#%{prefix}/lib/evolution/camel-providers/*/*.url
-%{prefix}/share/evolution/default_user/local/*
-
-%defattr(0644, bin, bin)
-%{prefix}/share/evolution/glade/*.glade
-%{prefix}/share/evolution/filtertypes.xml
-%{prefix}/share/evolution/default_user/shortcuts.xml
-
-%defattr (0444, bin, bin)
-%{prefix}/share/locale/*/LC_MESSAGES/*
-%{prefix}/share/gnome/help/gnomecal/*
-%{prefix}/share/images/evolution/*.png
-%{sysconfdir}/CORBA/servers/*
-
-%files devel
-
-%defattr(0555, bin, bin)
-%{prefix}/lib/*.a
-%{prefix}/lib/*.so
-%{prefix}/lib/*.la
-%{prefix}/lib/evolution/camel-providers/*/*.a
-%{prefix}/lib/evolution/camel-providers/*/*.so
-%{prefix}/lib/evolution/camel-providers/*/*.la
-
-%defattr(0444, bin, bin)
-%{prefix}/include/*.h
-%{prefix}/include/camel/*.h
-%{prefix}/include/composer/*.h
-%{prefix}/include/ename/*.h
-%{prefix}/include/evolution/ebook/*.h
-%{prefix}/include/evolution/cal-util/*.h
-%{prefix}/include/evolution/cal-client/*.h
-%{prefix}/share/idl/*.idl
diff --git a/filter/.cvsignore b/filter/.cvsignore
deleted file mode 100644
index 7c13af9a14..0000000000
--- a/filter/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-*.la
-*.lo
-.libs
-.deps
-.pure
-Makefile
-Makefile.in
-filter-driver
-filter-editor
diff --git a/filter/ChangeLog b/filter/ChangeLog
deleted file mode 100644
index 39ff8bf6f7..0000000000
--- a/filter/ChangeLog
+++ /dev/null
@@ -1,647 +0,0 @@
-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 65927b827a..0000000000
--- a/filter/Makefile.am
+++ /dev/null
@@ -1,72 +0,0 @@
-
-gladedir = $(prefix)/share/evolution/glade
-glade_DATA = filter.glade
-
-INCLUDES = \
- -I $(top_srcdir) \
- -I $(top_srcdir)/libibex \
- -I $(top_srcdir)/camel \
- -I $(top_srcdir)/e-util \
- -I $(top_srcdir)/shell \
- -I $(top_srcdir)/camel/providers/mbox \
- -I $(top_builddir)/shell \
- -I $(GNOME_INCLUDEDIR) \
- $(GTKHTML_CFLAGS) \
- $(UNICODE_CFLAGS) \
- $(BONOBO_GNOME_CFLAGS) \
- -DFILTER_GLADEDIR=\"$(gladedir)\" \
- -DG_LOG_DOMAIN=\"filter\"
-##
-
-noinst_LTLIBRARIES = \
- libfilter.la
-
-libfilter_la_SOURCES = \
- filter-code.c \
- filter-code.h \
- filter-colour.c \
- filter-colour.h \
- filter-context.c \
- filter-context.h \
- filter-datespec.c \
- filter-datespec.h \
- filter-driver.c \
- filter-driver.h \
- filter-editor.c \
- filter-editor.h \
- filter-element.c \
- filter-element.h \
- filter-filter.c \
- filter-filter.h \
- filter-folder.c \
- filter-folder.h \
- filter-input.c \
- filter-input.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 \
- score-context.c \
- score-context.h \
- score-editor.c \
- score-editor.h \
- score-rule.c \
- score-rule.h \
- vfolder-context.c \
- vfolder-context.h \
- vfolder-editor.c \
- vfolder-editor.h \
- vfolder-rule.c \
- vfolder-rule.h
-
-EXTRA_DIST = filtertypes.xml vfoldertypes.xml \
- filter.glade
-
-# basic rules.
-filterdir = $(prefix)/share/evolution
-filter_DATA = filtertypes.xml vfoldertypes.xml
-
diff --git a/filter/filter-code.c b/filter/filter-code.c
deleted file mode 100644
index cbab60359e..0000000000
--- a/filter/filter-code.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#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 *gspaper);
-static void filter_code_finalise (GtkObject *obj);
-
-static FilterInputClass *parent_class;
-
-guint
-filter_code_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterCode",
- sizeof(FilterCode),
- sizeof(FilterCodeClass),
- (GtkClassInitFunc)filter_code_class_init,
- (GtkObjectInitFunc)filter_code_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(filter_input_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_code_class_init (FilterCodeClass *class)
-{
- GtkObjectClass *object_class;
- FilterElementClass *filter_element = (FilterElementClass *)class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(filter_input_get_type ());
-
- filter_element->build_code = build_code;
- filter_element->format_sexp = format_sexp;
-
- object_class->finalize = filter_code_finalise;
- /* override methods */
-
-}
-
-static void
-filter_code_init (FilterCode *o)
-{
- ((FilterInput *)o)->type = g_strdup("code");
-}
-
-static void
-filter_code_finalise(GtkObject *obj)
-{
- FilterCode *o = (FilterCode *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_code_new:
- *
- * Create a new FilterCode object.
- *
- * Return value: A new #FilterCode object.
- **/
-FilterCode *
-filter_code_new(void)
-{
- FilterCode *o = (FilterCode *)gtk_type_new(filter_code_get_type ());
- return o;
-}
-
-/* here, the string IS the code */
-static void build_code(FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- GList *l;
- FilterInput *fi = (FilterInput *)fe;
-
- l = fi->values;
- while (l) {
- g_string_append(out, (char *)l->data);
- l = g_list_next(l);
- }
-}
-
-/* and we have no value */
-static void format_sexp(FilterElement *fe, GString *out)
-{
- return;
-}
diff --git a/filter/filter-code.h b/filter/filter-code.h
deleted file mode 100644
index c4bb04caab..0000000000
--- a/filter/filter-code.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_CODE_H
-#define _FILTER_CODE_H
-
-#include <gtk/gtk.h>
-
-#include "filter-input.h"
-
-#define FILTER_CODE(obj) GTK_CHECK_CAST (obj, filter_code_get_type (), FilterCode)
-#define FILTER_CODE_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_code_get_type (), FilterCodeClass)
-#define IS_FILTER_CODE(obj) GTK_CHECK_TYPE (obj, filter_code_get_type ())
-
-typedef struct _FilterCode FilterCode;
-typedef struct _FilterCodeClass FilterCodeClass;
-
-struct _FilterCode {
- FilterInput parent;
-};
-
-struct _FilterCodeClass {
- FilterInputClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint 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 202908d016..0000000000
--- a/filter/filter-colour.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include "e-util/e-sexp.h"
-#include "filter-colour.h"
-
-#define d(x)
-
-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 *class);
-static void filter_colour_init (FilterColour *gspaper);
-static void filter_colour_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((FilterColour *)(x))->priv)
-
-struct _FilterColourPrivate {
-};
-
-static FilterElementClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-filter_colour_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterColour",
- sizeof(FilterColour),
- sizeof(FilterColourClass),
- (GtkClassInitFunc)filter_colour_class_init,
- (GtkObjectInitFunc)filter_colour_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(filter_element_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_colour_class_init (FilterColourClass *class)
-{
- GtkObjectClass *object_class;
- FilterElementClass *filter_element = (FilterElementClass *)class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(filter_element_get_type ());
-
- object_class->finalize = filter_colour_finalise;
-
- /* override methods */
- filter_element->xml_create = xml_create;
- filter_element->xml_encode = xml_encode;
- filter_element->xml_decode = xml_decode;
- filter_element->get_widget = get_widget;
- filter_element->build_code = build_code;
- filter_element->format_sexp = format_sexp;
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-filter_colour_init (FilterColour *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-filter_colour_finalise(GtkObject *obj)
-{
- FilterColour *o = (FilterColour *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_colour_new:
- *
- * Create a new FilterColour object.
- *
- * Return value: A new #FilterColour object.
- **/
-FilterColour *
-filter_colour_new(void)
-{
- FilterColour *o = (FilterColour *)gtk_type_new(filter_colour_get_type ());
- return o;
-}
-
-static void xml_create(FilterElement *fe, xmlNodePtr node)
-{
- /*FilterColour *fc = (FilterColour *)fe;*/
-
- /* parent implementation */
- ((FilterElementClass *)(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;
-
- 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);
- gtk_signal_connect((GtkObject *)cp, "color_set", 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)
-{
- char *str;
- FilterColour *fc = (FilterColour *)fe;
-
- str =g_strdup_printf("rgb:%04x/%04x/%04x", fc->r, fc->g, fc->b);
- 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 3526dfcfda..0000000000
--- a/filter/filter-colour.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_COLOUR_H
-#define _FILTER_COLOUR_H
-
-#include <gtk/gtk.h>
-#include "filter-element.h"
-
-#define FILTER_COLOUR(obj) GTK_CHECK_CAST (obj, filter_colour_get_type (), FilterColour)
-#define FILTER_COLOUR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_colour_get_type (), FilterColourClass)
-#define IS_FILTER_COLOUR(obj) GTK_CHECK_TYPE (obj, filter_colour_get_type ())
-
-typedef struct _FilterColour FilterColour;
-typedef struct _FilterColourClass FilterColourClass;
-
-struct _FilterColour {
- FilterElement parent;
- struct _FilterColourPrivate *priv;
-
- guint16 r,g,b,a;
-};
-
-struct _FilterColourClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint filter_colour_get_type (void);
-FilterColour *filter_colour_new (void);
-
-/* methods */
-
-#endif /* ! _FILTER_COLOUR_H */
-
diff --git a/filter/filter-context.c b/filter/filter-context.c
deleted file mode 100644
index c31eba205a..0000000000
--- a/filter/filter-context.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#include "filter-context.h"
-#include "filter-filter.h"
-
-#define d(x)
-
-static void filter_context_class_init (FilterContextClass *class);
-static void filter_context_init (FilterContext *gspaper);
-static void filter_context_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((FilterContext *)(x))->priv)
-
-struct _FilterContextPrivate {
-};
-
-static RuleContextClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-filter_context_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterContext",
- sizeof(FilterContext),
- sizeof(FilterContextClass),
- (GtkClassInitFunc)filter_context_class_init,
- (GtkObjectInitFunc)filter_context_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(rule_context_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_context_class_init (FilterContextClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(rule_context_get_type ());
-
- object_class->finalize = filter_context_finalise;
- /* override methods */
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-filter_context_init (FilterContext *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-
- rule_context_add_part_set((RuleContext *)o, "partset", filter_part_get_type(),
- rule_context_add_part, rule_context_next_part);
- rule_context_add_part_set((RuleContext *)o, "actionset", filter_part_get_type(),
- (RCPartFunc)filter_context_add_action,
- (RCNextPartFunc)filter_context_next_action);
-
- rule_context_add_rule_set((RuleContext *)o, "ruleset", filter_filter_get_type(),
- (RCRuleFunc)rule_context_add_rule, rule_context_next_rule);
-}
-
-static void
-filter_context_finalise(GtkObject *obj)
-{
- FilterContext *o = (FilterContext *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_context_new:
- *
- * Create a new FilterContext object.
- *
- * Return value: A new #FilterContext object.
- **/
-FilterContext *
-filter_context_new(void)
-{
- FilterContext *o = (FilterContext *)gtk_type_new(filter_context_get_type ());
- return o;
-}
-
-void filter_context_add_action(FilterContext *f, FilterPart *action)
-{
- d(printf("find action : "));
- f->actions = g_list_append(f->actions, action);
-}
-
-FilterPart *filter_context_find_action(FilterContext *f, const char *name)
-{
- d(printf("find action : "));
- return filter_part_find_list(f->actions, name);
-}
-
-FilterPart *filter_context_create_action(FilterContext *f, const char *name)
-{
- FilterPart *part;
-
- part = filter_context_find_action(f, name);
- if (part)
- part = filter_part_clone(part);
- return part;
-}
-
-FilterPart *filter_context_next_action(FilterContext *f, FilterPart *last)
-{
- return filter_part_next_list(f->actions, last);
-}
diff --git a/filter/filter-context.h b/filter/filter-context.h
deleted file mode 100644
index 1fa0b80af7..0000000000
--- a/filter/filter-context.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_CONTEXT_H
-#define _FILTER_CONTEXT_H
-
-#include <gtk/gtk.h>
-#include "rule-context.h"
-
-#define FILTER_CONTEXT(obj) GTK_CHECK_CAST (obj, filter_context_get_type (), FilterContext)
-#define FILTER_CONTEXT_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_context_get_type (), FilterContextClass)
-#define IS_FILTER_CONTEXT(obj) GTK_CHECK_TYPE (obj, filter_context_get_type ())
-
-typedef struct _FilterContext FilterContext;
-typedef struct _FilterContextClass FilterContextClass;
-
-struct _FilterContext {
- RuleContext parent;
- struct _FilterContextPrivate *priv;
-
- GList *actions;
-};
-
-struct _FilterContextClass {
- RuleContextClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint filter_context_get_type (void);
-FilterContext *filter_context_new (void);
-
-/* methods */
-void filter_context_add_action(FilterContext *f, FilterPart *action);
-FilterPart *filter_context_find_action(FilterContext *f, const char *name);
-FilterPart *filter_context_create_action(FilterContext *f, const char *name);
-FilterPart *filter_context_next_action(FilterContext *f, FilterPart *last);
-
-#endif /* ! _FILTER_CONTEXT_H */
-
diff --git a/filter/filter-datespec.c b/filter/filter-datespec.c
deleted file mode 100644
index c087401ee2..0000000000
--- a/filter/filter-datespec.c
+++ /dev/null
@@ -1,703 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <config.h>
-#include <time.h>
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#include "filter-datespec.h"
-#include "e-util/e-sexp.h"
-
-#define d(x) x
-
-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 *class);
-static void filter_datespec_init (FilterDatespec *gspaper);
-static void filter_datespec_finalise (GtkObject *obj);
-
-static void make_span_editor (FilterDatespec *fds);
-static void adj_value_changed (GtkAdjustment *adj, gpointer user_data);
-static gchar *describe_button (FilterDatespec *fds);
-static gchar *stringify_agoness (FilterDatespec *fds);
-static void set_adjustments (FilterDatespec *fds);
-
-static void cal_day_selected (GtkCalendar *cal, gpointer user_data);
-static void cal_day_selected_double_click (GtkCalendar *cal, gpointer user_data);
-
-#define PRIV(x) (((FilterDatespec *)(x))->priv)
-
-typedef struct _timespan
-{
- guint32 seconds;
- const gchar *singular;
- const gchar *plural;
- gfloat max;
-} timespan;
-
-static const timespan timespans[] = {
- { 31557600, N_("year"), N_("years"), 1000.0 },
- { 2419200, N_("month"), N_("months"), 12.0 },
- { 604800, N_("week"), N_("weeks"), 52.0 },
- { 86400, N_("day"), N_("days"), 31.0 },
- { 3600, N_("hour"), N_("hours"), 23.0 },
- { 60, N_("minute"), N_("minutes"), 59.0 },
- { 1, N_("second"), N_("seconds"), 59.0 }
-};
-
-#define N_TIMECHUNKS 3
-
-static const guint timechunks[N_TIMECHUNKS] = { 2, 2, 3 };
-#define MAX_CHUNK 3
-
-#define N_TIMESPANS (sizeof (timespans) / sizeof (timespans[0]))
-
-struct _FilterDatespecPrivate {
- GnomeDialog *gd;
- GtkWidget *descriptive_label;
- GtkWidget *cur_extra_widget;
- FilterDatespec_type selected_type;
-
- GtkWidget *date_chooser;
- GtkWidget *span_chooser;
- gboolean double_click;
- GtkWidget **spinbuttons;
-};
-
-static FilterElementClass *parent_class;
-
-guint
-filter_datespec_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterDatespec",
- sizeof(FilterDatespec),
- sizeof(FilterDatespecClass),
- (GtkClassInitFunc)filter_datespec_class_init,
- (GtkObjectInitFunc)filter_datespec_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(filter_element_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_datespec_class_init (FilterDatespecClass *class)
-{
- GtkObjectClass *object_class;
- FilterElementClass *filter_element = (FilterElementClass *)class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(filter_element_get_type ());
-
- object_class->finalize = filter_datespec_finalise;
-
- /* override methods */
- filter_element->xml_create = xml_create;
- filter_element->xml_encode = xml_encode;
- filter_element->xml_decode = xml_decode;
- filter_element->get_widget = get_widget;
- filter_element->build_code = build_code;
- filter_element->format_sexp = format_sexp;
-}
-
-static void
-filter_datespec_init (FilterDatespec *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
- o->type = FDST_UNKNOWN;
- PRIV(o)->selected_type = FDST_UNKNOWN;
- PRIV(o)->spinbuttons = g_new (GtkWidget *, N_TIMESPANS );
-}
-
-static void
-filter_datespec_finalise(GtkObject *obj)
-{
- FilterDatespec *o = (FilterDatespec *)obj;
-
- if (o->priv) {
- g_free (PRIV(o)->spinbuttons);
- g_free (o->priv);
- }
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_datespec_new:
- *
- * Create a new FilterDatespec object.
- *
- * Return value: A new #FilterDatespec object.
- **/
-FilterDatespec *
-filter_datespec_new(void)
-{
- FilterDatespec *o = (FilterDatespec *)gtk_type_new(filter_datespec_get_type ());
- return o;
-}
-
-static void xml_create(FilterElement *fe, xmlNodePtr node)
-{
- /* parent implementation */
- ((FilterElementClass *)(parent_class))->xml_create(fe, node);
-}
-
-static xmlNodePtr xml_encode(FilterElement *fe)
-{
- xmlNodePtr value, work;
- FilterDatespec *fds = (FilterDatespec *)fe;
- gchar 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;
- gchar *val;
-
- d(printf("Decoding datespec from xml %p\n", fe));
-
- fe->name = xmlGetProp(node, "name");
-
- n = node->childs;
- while (n) {
- if (!strcmp(n->name, "datespec")) {
- val = xmlGetProp(n, "type");
- fds->type = atoi (val);
- g_free (val);
- val = xmlGetProp(n, "value");
- fds->value = atoi (val);
- g_free (val);
- break;
- }
- n = n->next;
- }
- return 0;
-}
-
-static void activate_now(GtkMenuItem *item, FilterDatespec *fds)
-{
- if (PRIV(fds)->cur_extra_widget) {
- gtk_container_remove (GTK_CONTAINER (PRIV(fds)->gd->vbox),
- PRIV(fds)->cur_extra_widget);
- PRIV (fds)->cur_extra_widget = NULL;
- }
-
-
- gtk_label_set_text (GTK_LABEL (PRIV(fds)->descriptive_label),
- _("The message's date will be compared against\n"
- "whatever the time is when the filter is run\n"
- "or vfolder is opened."));
-
- PRIV(fds)->selected_type = FDST_NOW;
-}
-
-static void activate_specified(GtkMenuItem *item, FilterDatespec *fds)
-{
- struct tm *seltime;
-
- /* Remove other widget if it exists */
-
- if (PRIV(fds)->cur_extra_widget) {
- gtk_container_remove (GTK_CONTAINER (PRIV(fds)->gd->vbox),
- PRIV(fds)->cur_extra_widget);
- PRIV (fds)->cur_extra_widget = NULL;
- }
-
- /* Set description */
-
- gtk_label_set_text (GTK_LABEL (PRIV(fds)->descriptive_label),
- _("The message's date will be compared against\n"
- "the time that you specify here."));
-
- /* Reset if going from one type to another */
- if (PRIV(fds)->selected_type != FDST_SPECIFIED)
- fds->value = 0;
-
- PRIV(fds)->selected_type = FDST_SPECIFIED;
-
- /* Set the calendar's time */
-
- if (fds->value > 0) {
- /* gmtime? */
- seltime = localtime (&(fds->value));
-
- gtk_calendar_select_month (GTK_CALENDAR (PRIV(fds)->date_chooser),
- seltime->tm_mon,
- seltime->tm_year + 1900);
- gtk_calendar_select_day (GTK_CALENDAR (PRIV(fds)->date_chooser),
- seltime->tm_mday);
- /* free seltime?? */
- }
-
- gtk_box_pack_start (GTK_BOX (PRIV(fds)->gd->vbox),
- PRIV(fds)->date_chooser,
- TRUE, TRUE, 3);
- gtk_widget_show (PRIV(fds)->date_chooser);
- PRIV(fds)->cur_extra_widget = PRIV(fds)->date_chooser;
-}
-
-static void activate_x_ago(GtkMenuItem *item, FilterDatespec *fds)
-{
- if (PRIV(fds)->cur_extra_widget) {
- gtk_container_remove (GTK_CONTAINER (PRIV(fds)->gd->vbox),
- PRIV(fds)->cur_extra_widget);
- PRIV (fds)->cur_extra_widget = NULL;
- }
-
- gtk_label_set_text (GTK_LABEL (PRIV(fds)->descriptive_label),
- _("The message's date will be compared against\n"
- "a time relative to when the filter is run;\n"
- "\"a week ago\", for example."));
-
- /* Reset if going from one type to another */
- if (PRIV(fds)->selected_type != FDST_X_AGO)
- fds->value = 0;
-
- PRIV(fds)->selected_type = FDST_X_AGO;
-
- if (fds->value > 0)
- set_adjustments (fds);
-
- gtk_box_pack_start (GTK_BOX (PRIV(fds)->gd->vbox),
- PRIV(fds)->span_chooser,
- TRUE, TRUE, 3);
- gtk_widget_show (PRIV(fds)->span_chooser);
- PRIV(fds)->cur_extra_widget = PRIV(fds)->span_chooser;
-
-}
-
-typedef void (*my_menu_callback) (GtkMenuItem *, FilterDatespec *);
-
-static void button_clicked(GtkButton *button, FilterDatespec *fds)
-{
- GnomeDialog *gd;
- GtkWidget *box;
- GtkWidget *label;
- GtkWidget *menu;
- GtkWidget *selectomatic;
- GtkWidget *sep;
- int i;
- gchar *desc;
-
- /* keep in sync with FilterDatespec_type! */
- const char *items[] = { N_("the current time"), N_("a time you specify"),
- N_("a time relative to the current time"), NULL };
- const my_menu_callback callbacks[]
- = { activate_now, activate_specified, activate_x_ago };
-
- PRIV(fds)->descriptive_label = gtk_label_new("");
- PRIV(fds)->cur_extra_widget = NULL;
- PRIV(fds)->double_click = FALSE;
-
- /* The calendar */
-
- PRIV(fds)->date_chooser = gtk_calendar_new ();
- gtk_object_ref (GTK_OBJECT (PRIV(fds)->date_chooser));
- gtk_signal_connect (GTK_OBJECT (PRIV(fds)->date_chooser), "day_selected",
- cal_day_selected, fds);
- gtk_signal_connect (GTK_OBJECT (PRIV(fds)->date_chooser), "day_selected_double_click",
- cal_day_selected_double_click, fds);
-
- /* The span editor thingie */
-
- make_span_editor (fds);
- gtk_object_ref (GTK_OBJECT (PRIV(fds)->span_chooser));
-
- /* The dialog */
-
- gd = (GnomeDialog *) gnome_dialog_new ("Select a time to compare against",
- GNOME_STOCK_BUTTON_OK,
- GNOME_STOCK_BUTTON_CANCEL,
- NULL);
- PRIV(fds)->gd = gd;
-
- /* The menu */
-
- menu = gtk_menu_new ();
-
- for (i = 0; items[i]; i++) {
- GtkWidget *item;
-
- item = gtk_menu_item_new_with_label (gettext (items[i]));
- gtk_signal_connect (GTK_OBJECT (item), "activate",
- callbacks[i], fds);
- gtk_menu_append (GTK_MENU (menu), item);
- gtk_widget_show (item);
- }
-
- gtk_widget_show (menu);
-
- /* The selector */
-
- selectomatic = gtk_option_menu_new();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (selectomatic), GTK_WIDGET (menu));
- if (fds->type != FDST_UNKNOWN)
- /* Keep in sync with FilterDatespec_type! */
- gtk_option_menu_set_history (GTK_OPTION_MENU (selectomatic), fds->type);
-
- gtk_widget_show ((GtkWidget *)selectomatic);
-
- /* The label */
-
- label = gtk_label_new (_("Compare against"));
- gtk_widget_show (label);
-
- /* The hbox */
-
- box = gtk_hbox_new (FALSE, 3);
- gtk_box_pack_start (GTK_BOX (box), label,
- TRUE, TRUE, 2);
- gtk_box_pack_start (GTK_BOX (box), selectomatic,
- TRUE, TRUE, 2);
- gtk_widget_show (box);
- gtk_box_pack_start ((GtkBox *)gd->vbox, (GtkWidget *)box, TRUE, TRUE, 3);
-
- /* The separator */
-
- sep = gtk_hseparator_new ();
- gtk_widget_show (sep);
- gtk_box_pack_start (GTK_BOX (gd->vbox), sep, TRUE, TRUE, 3);
-
- /* The descriptive label */
-
- gtk_box_pack_start (GTK_BOX (gd->vbox), PRIV(fds)->descriptive_label, TRUE, TRUE, 3);
- gtk_misc_set_alignment (GTK_MISC (PRIV(fds)->descriptive_label), 0.5, 0.5);
- gtk_widget_show (PRIV(fds)->descriptive_label);
-
- /* Set up the current view */
-
- if (fds->type == FDST_UNKNOWN)
- fds->type = FDST_NOW;
-
- (callbacks[fds->type]) (NULL, fds);
-
- /* go go gadget gnomedialog! */
-
- switch (gnome_dialog_run_and_close(gd)) {
- case -1: /*wm close*/
- if (PRIV(fds)->double_click == FALSE)
- break;
- /* else fall */
- case 0:
- fds->type = PRIV(fds)->selected_type;
-
- PRIV(fds)->descriptive_label = NULL;
-
- desc = describe_button (fds);
- gtk_label_set_text (GTK_LABEL (GTK_BIN (button)->child), desc);
- g_free (desc);
- /* falllllll */
- case 1:
- /* cancel */
- break;
- }
-
- gtk_widget_destroy (PRIV(fds)->date_chooser);
- gtk_widget_destroy (PRIV(fds)->span_chooser);
-}
-
-static GtkWidget *
-get_widget(FilterElement *fe)
-{
- FilterDatespec *fds = (FilterDatespec *)fe;
- GtkWidget *button;
- GtkWidget *label;
- gchar *desc;
-
- desc = describe_button (fds);
- label = gtk_label_new (desc);
- gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
- g_free (desc);
-
- button = gtk_button_new();
- gtk_container_add (GTK_CONTAINER (button), label);
- gtk_signal_connect(GTK_OBJECT (button), "clicked", button_clicked, fds);
-
- gtk_widget_show(button);
- gtk_widget_show(label);
- 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_sprintfa (out, "%d", (int) fds->value);
- break;
- case FDST_X_AGO:
- g_string_sprintfa (out, "(- (get-current-date) %d)", (int) fds->value);
- break;
- }
-}
-
-static gchar *
-stringify_agoness (FilterDatespec *fds)
-{
- time_t val;
- GString *str;
- gchar *ret;
-
- str = g_string_new("");
- val = fds->value;
-
- if (val == 0) {
- g_string_append (str, _("now"));
- } else {
- int where;
-
- where = 0;
-
- while (val) {
- int count;
-
- count = 0;
-
- while (timespans[where].seconds <= val) {
- count++;
- val -= timespans[where].seconds;
- }
-
- if (count != 0 ) {
- if (count > 1)
- g_string_sprintfa (str, "%d %s", (int) count, gettext (timespans[where].plural));
- else
- g_string_sprintfa (str, "%d %s", (int) count, gettext (timespans[where].singular));
-
- if (val)
- g_string_append (str, ", ");
- }
-
- where++;
- }
-
- g_string_append (str, " ago");
- }
-
- ret = str->str;
- g_string_free (str, FALSE);
- return ret;
-}
-
-static void
-make_span_editor (FilterDatespec *fds)
-{
- int i;
- int chunk;
- int delta;
- GtkWidget *table;
-
- /*PRIV(fds)->span_chooser = gtk_vbox_new (TRUE, 3);*/
- table = gtk_table_new (N_TIMECHUNKS, MAX_CHUNK * 2, FALSE);
-
- i = 0;
-
- for (chunk = 0; chunk < N_TIMECHUNKS; chunk++ ) {
- /*GtkWidget *hbox;*/
-
- /*hbox = gtk_hbox_new (FALSE, 1);*/
- /*gtk_box_pack_start (GTK_BOX (PRIV(fds)->span_chooser),
- * hbox, TRUE, TRUE, 1);
- */
- /*gtk_table_attach (GTK_TABLE (PRIV(fds)->span_chooser),
- * hbox,
- * 0, 1, chunk, chunk + 1,
- * 0, GTK_EXPAND | GTK_FILL,
- * 3, 3);
- *gtk_widget_show (hbox);
- */
-
- for (delta = 0; delta < timechunks[chunk]; delta++, i++ ) {
- gchar *text;
- GtkObject *adj;
- GtkWidget *sb;
- GtkWidget *label;
-
- adj = gtk_adjustment_new (0.0, 0.0,
- timespans[i].max,
- 1.0, 10.0, 0.0);
-
- sb = gtk_spin_button_new (GTK_ADJUSTMENT (adj),
- 0, 0);
-
- /*gtk_box_pack_start (GTK_BOX (hbox), sb, FALSE, FALSE, 1);*/
- gtk_table_attach (GTK_TABLE (table), sb,
- delta * 2, delta * 2 + 1,
- chunk, chunk + 1,
- 0, GTK_EXPAND | GTK_FILL,
- 2, 4);
- PRIV(fds)->spinbuttons[i] = sb;
-
- gtk_widget_show (GTK_WIDGET (sb));
-
- if (delta + 1 < timechunks[chunk])
- text = g_strdup_printf ("%s, ", gettext (timespans[i].plural));
- else
- text = g_strdup_printf ("%s ago", gettext (timespans[i].plural));
-
- label = gtk_label_new (text);
- g_free (text);
-
- /*gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 3);*/
- gtk_table_attach (GTK_TABLE (table), label,
- delta * 2 + 1, (delta + 1) * 2,
- chunk, chunk + 1,
- 0, GTK_EXPAND | GTK_FILL,
- 2, 4);
- gtk_widget_show (label);
-
- gtk_signal_connect (adj, "value_changed",
- adj_value_changed, fds);
- }
- }
-
- PRIV(fds)->span_chooser = table;
-}
-
-static void
-adj_value_changed (GtkAdjustment *adj, gpointer user_data)
-{
- FilterDatespec *fds = (FilterDatespec *) user_data;
- int i;
-
- fds->value = 0;
-
- for (i = 0; i < N_TIMESPANS; i++)
- fds->value += timespans[i].seconds *
- (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (PRIV(fds)->spinbuttons[i])));
-}
-
-static void
-set_adjustments (FilterDatespec *fds)
-{
- time_t val;
- int where;
-
- val = fds->value;
- where = 0;
-
- while (val) {
- int count;
-
- count = 0;
-
- while (timespans[where].seconds <= val) {
- count++;
- val -= timespans[where].seconds;
- }
-
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (PRIV(fds)->spinbuttons[where]),
- (gfloat) count);
- where++;
- }
-}
-
-static gchar *
-describe_button (FilterDatespec *fds)
-{
- gchar *desc = NULL;
-
- switch (fds->type) {
- case FDST_UNKNOWN:
- desc = g_strdup (_("<click here to select a date>"));
- break;
- case FDST_NOW:
- desc = g_strdup (_("now"));
- break;
- case FDST_SPECIFIED:
- desc = g_strdup (ctime (&(fds->value)));
- break;
- case FDST_X_AGO:
- desc = stringify_agoness (fds);
- break;
- }
-
- return desc;
-}
-
-static void
-cal_day_selected (GtkCalendar *cal, gpointer user_data)
-{
- FilterDatespec *fds = (FilterDatespec *)user_data;
- extern int daylight;
- struct tm seltime;
-
- seltime.tm_sec = 0;
- seltime.tm_min = 0;
- seltime.tm_hour = 0;
- seltime.tm_mday = cal->selected_day;
- seltime.tm_mon = cal->month;
- seltime.tm_year = cal->year - 1900;
- seltime.tm_isdst = daylight;
-
- fds->value = mktime (&seltime);
-}
-
-static void
-cal_day_selected_double_click (GtkCalendar *cal, gpointer user_data)
-{
- FilterDatespec *fds = (FilterDatespec *)user_data;
-
- cal_day_selected (cal, user_data);
- PRIV(fds)->double_click = TRUE;
- gnome_dialog_close (PRIV(fds)->gd);
-}
diff --git a/filter/filter-datespec.h b/filter/filter-datespec.h
deleted file mode 100644
index 1292a94e36..0000000000
--- a/filter/filter-datespec.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_DATESPEC_H
-#define _FILTER_DATESPEC_H
-
-#include <gtk/gtk.h>
-#include "filter-element.h"
-
-#define FILTER_DATESPEC(obj) GTK_CHECK_CAST (obj, filter_datespec_get_type (), FilterDatespec)
-#define FILTER_DATESPEC_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_datespec_get_type (), FilterDatespecClass)
-#define IS_FILTER_DATESPEC(obj) GTK_CHECK_TYPE (obj, filter_datespec_get_type ())
-
-typedef struct _FilterDatespec FilterDatespec;
-typedef struct _FilterDatespecClass FilterDatespecClass;
-
-typedef enum _FilterDatespec_type { FDST_NOW, FDST_SPECIFIED, FDST_X_AGO, FDST_UNKNOWN } 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 */
-};
-
-guint filter_datespec_get_type (void);
-FilterDatespec *filter_datespec_new (void);
-
-/* methods */
-
-#endif /* ! _FILTER_DATESPEC_H */
-
diff --git a/filter/filter-driver.c b/filter/filter-driver.c
deleted file mode 100644
index e3e1c7df5e..0000000000
--- a/filter/filter-driver.c
+++ /dev/null
@@ -1,636 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.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
- */
-
-#include "filter-driver.h"
-
-#include <glib.h>
-#include <gtk/gtk.h>
-#include <gnome.h>
-#include <gtkhtml/gtkhtml.h>
-
-#include <gnome-xml/tree.h>
-#include <gnome-xml/parser.h>
-
-#include <camel/camel.h>
-#include "mail/mail-tools.h" /*mail_tool_camel_lock_up*/
-#include "filter-context.h"
-#include "filter-filter.h"
-#include "e-util/e-sexp.h"
-
-#define d(x)
-
-/* mail-thread filter input data type */
-typedef struct {
- FilterDriver *driver;
- CamelFolder *source;
- CamelFolder *inbox;
- enum _filter_source_t sourcetype;
- gboolean self_destruct;
- gpointer unhook_func;
- gpointer unhook_data;
-} filter_mail_input_t;
-
-/* mail-thread filter functions */
-static gchar *describe_filter_mail (gpointer in_data, gboolean gerund);
-static void setup_filter_mail (gpointer in_data, gpointer op_data, CamelException *ex);
-static void do_filter_mail (gpointer in_data, gpointer op_data, CamelException *ex);
-static void cleanup_filter_mail (gpointer in_data, gpointer op_data, CamelException *ex);
-
-
-struct _FilterDriverPrivate {
- GHashTable *globals; /* global variables */
-
- FilterContext *context;
-
- /* for callback */
- FilterGetFolderFunc get_folder;
- void *data;
-
- /* run-time data */
- GHashTable *folders; /* currently open folders */
- GPtrArray *matches; /* all messages which match current rule */
- GHashTable *terminated; /* messages for which processing is terminated */
- GHashTable *processed; /* all messages that were processed in some way */
- GHashTable *copies; /* lists of folders to copy messages to */
-
- CamelFolder *source; /* temporary input folder */
-
- GList *searches; /* search results */
-
- CamelException *ex;
-
- /* evaluator */
- ESExp *eval;
-};
-
-#define _PRIVATE(o) (((FilterDriver *)(o))->priv)
-
-static void filter_driver_class_init (FilterDriverClass *klass);
-static void filter_driver_init (FilterDriver *obj);
-static void filter_driver_finalise (GtkObject *obj);
-
-static CamelFolder *open_folder (FilterDriver *d, const char *folder_url);
-static int close_folders (FilterDriver *d);
-
-static ESExpResult *do_delete(struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *);
-static ESExpResult *mark_forward(struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *);
-static ESExpResult *mark_copy(struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *);
-static ESExpResult *do_stop(struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *);
-static ESExpResult *do_colour(struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *);
-
-static struct {
- char *name;
- ESExpFunc *func;
- int type; /* set to 1 if a function can perform shortcut evaluation, or
- doesn't execute everything, 0 otherwise */
-} symbols[] = {
- { "delete", (ESExpFunc *)do_delete, 0 },
- { "forward-to", (ESExpFunc *)mark_forward, 0 },
- { "copy-to", (ESExpFunc *)mark_copy, 0 },
- { "stop", (ESExpFunc *)do_stop, 0 },
- { "set-colour", (ESExpFunc *)do_colour, 0 },
-};
-
-static GtkObjectClass *filter_driver_parent;
-
-enum SIGNALS {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-filter_driver_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterDriver",
- sizeof (FilterDriver),
- sizeof (FilterDriverClass),
- (GtkClassInitFunc) filter_driver_class_init,
- (GtkObjectInitFunc) filter_driver_init,
- (GtkArgSetFunc) NULL,
- (GtkArgGetFunc) NULL
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_driver_class_init (FilterDriverClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- filter_driver_parent = gtk_type_class (gtk_object_get_type ());
-
- object_class->finalize = filter_driver_finalise;
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-filter_driver_init (FilterDriver *obj)
-{
- struct _FilterDriverPrivate *p;
- int i;
-
- p = _PRIVATE (obj) = g_malloc0 (sizeof (*p));
-
- p->eval = e_sexp_new ();
- /* Load in builtin symbols */
- for (i = 0; i < sizeof (symbols) / sizeof (symbols[0]); i++) {
- if (symbols[i].type == 1) {
- e_sexp_add_ifunction (p->eval, 0, symbols[i].name, (ESExpIFunc *)symbols[i].func, obj);
- } else {
- e_sexp_add_function (p->eval, 0, symbols[i].name, symbols[i].func, obj);
- }
- }
-
- p->globals = g_hash_table_new (g_str_hash, g_str_equal);
-
- /* Will get set in filter_driver_run */
- p->ex = NULL;
-}
-
-static void
-free_hash_strings (void *key, void *value, void *data)
-{
- g_free (key);
- g_free (value);
-}
-
-static void
-filter_driver_finalise (GtkObject *obj)
-{
- FilterDriver *d = (FilterDriver *) obj;
- struct _FilterDriverPrivate *p = _PRIVATE (d);
-
- g_hash_table_foreach (p->globals, free_hash_strings, d);
- g_hash_table_destroy (p->globals);
-
- gtk_object_unref (GTK_OBJECT (p->eval));
-
- /*Was set to the mail_operation_queue exception,
- * not our responsibility to free it.*/
- /*camel_exception_free (p->ex);*/
-
- g_free (p);
-
- ((GtkObjectClass *)(filter_driver_parent))->finalize (GTK_OBJECT (obj));
-}
-
-/**
- * filter_driver_new:
- * @system: path to system rules
- * @user: path to user rules
- * @get_folder: function to call to fetch folders
- *
- * Create a new FilterDriver object.
- *
- * Return value: A new FilterDriver widget.
- **/
-FilterDriver *
-filter_driver_new (FilterContext *context, FilterGetFolderFunc get_folder, void *data)
-{
- FilterDriver *new;
- struct _FilterDriverPrivate *p;
-
- new = FILTER_DRIVER (gtk_type_new (filter_driver_get_type ()));
- p = _PRIVATE(new);
-
- p->get_folder = get_folder;
- p->data = data;
- p->context = context;
- gtk_object_ref((GtkObject *)context);
-
- return new;
-}
-
-
-#if 0
-void filter_driver_set_global(FilterDriver *d, const char *name, const char *value)
-{
- struct _FilterDriverPrivate *p = _PRIVATE (d);
- char *oldkey, *oldvalue;
-
- if (g_hash_table_lookup_extended (p->globals, name, (void *)&oldkey, (void *)&oldvalue)) {
- g_free (oldvalue);
- g_hash_table_insert (p->globals, oldkey, g_strdup (value));
- } else {
- g_hash_table_insert (p->globals, g_strdup (name), g_strdup (value));
- }
-}
-#endif
-
-static ESExpResult *
-do_delete (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *driver)
-{
- struct _FilterDriverPrivate *p = _PRIVATE (driver);
- char *uid;
- int i;
-
- printf ("doing delete\n");
- for (i = 0; i < p->matches->len; i++) {
- uid = p->matches->pdata[i];
- printf (" %s\n", uid);
-
- mail_tool_camel_lock_up ();
- camel_folder_delete_message (p->source, uid);
- mail_tool_camel_lock_down ();
- }
- return NULL;
-}
-
-static ESExpResult *
-mark_forward (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *driver)
-{
- struct _FilterDriverPrivate *p = _PRIVATE (driver);
- int i;
-
- printf ("marking the following messages for forwarding:\n");
- for (i = 0; i < p->matches->len; i++) {
- printf (" %s\n", (char *)p->matches->pdata[i]);
- }
- return NULL;
-}
-
-static ESExpResult *
-mark_copy (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *driver)
-{
- struct _FilterDriverPrivate *p = _PRIVATE (driver);
- int i, m;
- char *uid;
-
- printf ("marking for copy\n");
- for (i = 0; i < argc; i++) {
- if (argv[i]->type == ESEXP_RES_STRING) {
- char *folder = argv[i]->value.string;
- CamelFolder *outbox;
-
- outbox = open_folder (driver, folder);
- if (outbox == NULL)
- continue;
-
- for (m = 0; m < p->matches->len; m++) {
- gpointer old_key, old_value;
-
- uid = p->matches->pdata[m];
- printf (" %s\n", uid);
-
- if (g_hash_table_lookup_extended (p->copies, uid, &old_key, &old_value))
- g_hash_table_insert (p->copies, old_key, g_list_prepend (old_value, outbox));
- else
- g_hash_table_insert (p->copies, uid, g_list_append (NULL, outbox));
- }
- }
- }
-
- return NULL;
-}
-
-static ESExpResult *
-do_stop (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *driver)
-{
- struct _FilterDriverPrivate *p = _PRIVATE (driver);
- char *uid;
- int i;
-
- printf ("doing stop on the following messages:\n");
- for (i = 0; i < p->matches->len; i++) {
- uid = p->matches->pdata[i];
- printf (" %s\n", uid);
- g_hash_table_insert (p->terminated, uid, GINT_TO_POINTER (1));
- }
- return NULL;
-}
-
-static ESExpResult *
-do_colour(struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *d)
-{
- int i;
- char *uid;
- struct _FilterDriverPrivate *p = _PRIVATE(d);
-
- if (argc>0 && argv[0]->type == ESEXP_RES_STRING) {
- for (i=0 ; i<p->matches->len; i++) {
- uid = p->matches->pdata[i];
- camel_folder_set_message_user_tag(p->source, uid, "colour", argv[0]->value.string);
- }
- }
-
- return NULL;
-}
-
-static CamelFolder *
-open_folder (FilterDriver *driver, const char *folder_url)
-{
- CamelFolder *camelfolder;
- struct _FilterDriverPrivate *p = _PRIVATE (driver);
-
- /* we have a lookup table of currently open folders */
- camelfolder = g_hash_table_lookup (p->folders, folder_url);
- if (camelfolder)
- return camelfolder;
-
- camelfolder = p->get_folder(driver, folder_url, p->data);
-
- if (camelfolder) {
- g_hash_table_insert (p->folders, g_strdup (folder_url), camelfolder);
- mail_tool_camel_lock_up ();
- camel_folder_freeze (camelfolder);
- mail_tool_camel_lock_down ();
- }
-
- return camelfolder;
-}
-
-static void
-close_folder (void *key, void *value, void *data)
-{
- CamelFolder *folder = value;
- FilterDriver *driver = data;
- struct _FilterDriverPrivate *p = _PRIVATE (driver);
-
- g_free (key);
- mail_tool_camel_lock_up ();
- camel_folder_sync (folder, FALSE, p->ex);
- camel_folder_thaw (folder);
- mail_tool_camel_lock_down ();
- camel_object_unref (CAMEL_OBJECT (folder));
-}
-
-/* flush/close all folders */
-static int
-close_folders (FilterDriver *driver)
-{
- struct _FilterDriverPrivate *p = _PRIVATE (driver);
-
- g_hash_table_foreach (p->folders, close_folder, driver);
- g_hash_table_destroy (p->folders);
- p->folders = g_hash_table_new (g_str_hash, g_str_equal);
-
- /* FIXME: status from driver */
- return 0;
-}
-
-#if 0
-static void
-free_key (gpointer key, gpointer value, gpointer user_data)
-{
- g_free (key);
-}
-#endif
-
-static const mail_operation_spec op_filter_mail =
-{
- describe_filter_mail,
- 0,
- setup_filter_mail,
- do_filter_mail,
- cleanup_filter_mail
-};
-
-void
-filter_driver_run (FilterDriver *d, CamelFolder *source, CamelFolder *inbox,
- enum _filter_source_t sourcetype,
- gboolean self_destruct, gpointer unhook_func, gpointer unhook_data)
-{
- filter_mail_input_t *input;
-
- input = g_new (filter_mail_input_t, 1);
- input->driver = d;
- input->source = source;
- input->inbox = inbox;
- input->sourcetype = sourcetype;
- input->self_destruct = self_destruct;
- input->unhook_func = unhook_func;
- input->unhook_data = unhook_data;
-
- mail_operation_queue (&op_filter_mail, input, TRUE);
-}
-
-static gchar *describe_filter_mail (gpointer in_data, gboolean gerund)
-{
- filter_mail_input_t *input = (filter_mail_input_t *) in_data;
-
- if (gerund)
- return g_strdup_printf ("Filtering messages into \"%s\"",
- mail_tool_get_folder_name (input->inbox));
- else
- return g_strdup_printf ("Filter messages into \"%s\"",
- mail_tool_get_folder_name (input->inbox));
-}
-
-static void
-setup_filter_mail (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- filter_mail_input_t *input = (filter_mail_input_t *) in_data;
-
- if (!input->driver) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "Bad filter driver passed to filter_mail");
- return;
- }
-
- if (!CAMEL_IS_FOLDER (input->source)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "Bad source folder passed to filter_mail");
- return;
- }
-
- if (!CAMEL_IS_FOLDER (input->inbox)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "Bad Inbox passed to filter_mail");
- return;
- }
-
- camel_object_ref (CAMEL_OBJECT (input->source));
- camel_object_ref (CAMEL_OBJECT (input->inbox));
-}
-
-static void
-do_filter_mail (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- filter_mail_input_t *input = (filter_mail_input_t *) in_data;
- FilterDriver *d = input->driver;
- CamelFolder *source = input->source;
- CamelFolder *inbox = input->inbox;
- struct _FilterDriverPrivate *p = _PRIVATE (d);
- ESExpResult *r;
- GString *s, *a;
- GPtrArray *all;
- char *uid;
- int i;
- FilterFilter *rule;
- GList *l;
-
- /* FIXME: needs to check all failure cases */
- p->source = source;
-
- /* setup runtime data */
- p->folders = g_hash_table_new(g_str_hash, g_str_equal);
- p->terminated = g_hash_table_new(g_str_hash, g_str_equal);
- p->processed = g_hash_table_new(g_str_hash, g_str_equal);
- p->copies = g_hash_table_new(g_str_hash, g_str_equal);
-
- mail_tool_camel_lock_up ();
- camel_folder_freeze(inbox);
- mail_tool_camel_lock_down ();
-
- s = g_string_new("");
- a = g_string_new("");
-
- rule = NULL;
- while ( (rule = (FilterFilter *)rule_context_next_rule((RuleContext *)p->context, (FilterRule *)rule)) ) {
-
- if (((FilterRule *)rule)->source != input->sourcetype) {
- d(printf("skipping rule %s - wrong source type (%d %d)\n", ((FilterRule *)rule)->name,
- ((FilterRule *)rule)->source, input->sourcetype));
- continue;
- }
-
- g_string_truncate(s, 0);
- g_string_truncate(a, 0);
-
- filter_rule_build_code((FilterRule *)rule, s);
- filter_filter_build_action(rule, a);
-
- d(printf("applying rule %s\n action %s\n", s->str, a->str));
-
- mail_tool_camel_lock_up ();
- p->matches = camel_folder_search_by_expression (p->source, s->str, p->ex);
- mail_tool_camel_lock_down ();
-
- /* remove uid's for which processing is complete ... */
- for (i = 0; i < p->matches->len; i++) {
- uid = p->matches->pdata[i];
-
- /* for all matching id's, so we can work out what to default */
- if (g_hash_table_lookup (p->processed, uid) == NULL) {
- g_hash_table_insert (p->processed, uid, GINT_TO_POINTER (1));
- }
-
- if (g_hash_table_lookup (p->terminated, uid)) {
- g_ptr_array_remove_index_fast (p->matches, i);
- i--;
- }
- }
-
-#ifndef NO_WARNINGS
-#warning "Must check expression parsed and executed properly?"
-#endif
- e_sexp_input_text(p->eval, a->str, strlen(a->str));
- e_sexp_parse(p->eval);
- r = e_sexp_eval(p->eval);
- e_sexp_result_free(r);
-
- p->searches = g_list_append(p->searches, p->matches);
- }
-
- g_string_free(s, TRUE);
- g_string_free(a, TRUE);
-
- /* Do any queued copies, and make sure everything is deleted from
- * the source. If we have an inbox, anything that didn't get
- * processed otherwise goes there.
- */
- mail_tool_camel_lock_up ();
- all = camel_folder_get_uids (p->source);
- mail_tool_camel_lock_down ();
- for (i = 0; i < all->len; i++) {
- char *uid = all->pdata[i], *procuid;
- GList *copies, *tmp;
- CamelMimeMessage *mm;
- const CamelMessageInfo *info;
-
- copies = g_hash_table_lookup (p->copies, uid);
- procuid = g_hash_table_lookup (p->processed, uid);
-
- mail_tool_camel_lock_up ();
- info = camel_folder_get_message_info (p->source, uid);
-
- if (copies || !procuid) {
- mm = camel_folder_get_message (p->source, uid, p->ex);
-
- while (copies) {
- camel_folder_append_message(copies->data, mm, info, p->ex);
- tmp = copies->next;
- g_list_free_1 (copies);
- copies = tmp;
- }
-
- if (!procuid && inbox != source) {
- printf("Applying default rule to message %s\n", uid);
- camel_folder_append_message(inbox, mm, info, p->ex);
- }
-
- camel_object_unref (CAMEL_OBJECT (mm));
- }
-
- if (inbox != source)
- camel_folder_delete_message (p->source, uid);
- mail_tool_camel_lock_down ();
-
- }
- mail_tool_camel_lock_up ();
- camel_folder_free_uids (p->source, all);
- if (input->unhook_func)
- camel_object_unhook_event (CAMEL_OBJECT (input->inbox), "folder_changed",
- input->unhook_func, input->unhook_data);
- mail_tool_camel_lock_down ();
-
- /* now we no longer need our keys */
- l = p->searches;
- while (l) {
- camel_folder_search_free (p->source, l->data);
- l = l->next;
- }
- g_list_free (p->searches);
-
- g_hash_table_destroy (p->copies);
- g_hash_table_destroy (p->processed);
- g_hash_table_destroy (p->terminated);
- close_folders (d);
- g_hash_table_destroy (p->folders);
- mail_tool_camel_lock_up ();
- camel_folder_sync (p->source, TRUE, ex);
- camel_folder_thaw (inbox);
- mail_tool_camel_lock_down ();
-}
-
-static void
-cleanup_filter_mail (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- filter_mail_input_t *input = (filter_mail_input_t *) in_data;
-
- camel_object_unref (CAMEL_OBJECT (input->source));
- camel_object_unref (CAMEL_OBJECT (input->inbox));
-
- if (input->self_destruct)
- gtk_object_unref (GTK_OBJECT (input->driver));
-}
diff --git a/filter/filter-driver.h b/filter/filter-driver.h
deleted file mode 100644
index 1ef62b7118..0000000000
--- a/filter/filter-driver.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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 _FILTER_DRIVER_H
-#define _FILTER_DRIVER_H
-
-#include <gtk/gtk.h>
-#include <camel/camel-session.h>
-#include <camel/camel-folder.h>
-#include <mail/mail-threads.h>
-
-#include "filter-context.h"
-
-#define FILTER_DRIVER(obj) GTK_CHECK_CAST (obj, filter_driver_get_type (), FilterDriver)
-#define FILTER_DRIVER_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_driver_get_type (), FilterDriverClass)
-#define IS_FILTER_DRIVER(obj) GTK_CHECK_TYPE (obj, filter_driver_get_type ())
-
-typedef struct _FilterDriver FilterDriver;
-typedef struct _FilterDriverClass FilterDriverClass;
-
-struct _FilterDriver {
- GtkObject parent;
-
- struct _FilterDriverPrivate *priv;
-};
-
-struct _FilterDriverClass {
- GtkObjectClass parent_class;
-};
-
-typedef CamelFolder * (*FilterGetFolderFunc) (FilterDriver *, const char *uri, void *data);
-
-guint filter_driver_get_type (void);
-FilterDriver *filter_driver_new (FilterContext *ctx, FilterGetFolderFunc fetcher, void *data);
-
-/*
- void filter_driver_set_global(FilterDriver *, const char *name, const char *value);*/
-
-/* apply rules to a folder, unmatched messages goto inbox, if not NULL */
-void filter_driver_run(FilterDriver *d, CamelFolder *source, CamelFolder *inbox,
- enum _filter_source_t sourcetype,
- gboolean self_destruct, gpointer unhook_func, gpointer unhook_data);
-
-#if 0
-/* generate the search query/action string for a filter option */
-void filter_driver_expand_option(FilterDriver *d, GString *s, GString *action, struct filter_option *op);
-
-/* get info about rules (options) */
-int filter_driver_rule_count(FilterDriver *d);
-struct filter_option *filter_driver_rule_get(FilterDriver *d, int n);
-#endif
-
-#endif /* ! _FILTER_DRIVER_H */
diff --git a/filter/filter-editor.c b/filter/filter-editor.c
deleted file mode 100644
index 9f4a0e1872..0000000000
--- a/filter/filter-editor.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-#include <glade/glade.h>
-
-#include "filter-editor.h"
-#include "filter-context.h"
-#include "filter-filter.h"
-
-#define d(x)
-
-#if 0
-static void filter_editor_class_init (FilterEditorClass *class);
-static void filter_editor_init (FilterEditor *gspaper);
-static void filter_editor_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((FilterEditor *)(x))->priv)
-
-struct _FilterEditorPrivate {
-};
-
-static GnomeDialogClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-filter_editor_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterEditor",
- sizeof(FilterEditor),
- sizeof(FilterEditorClass),
- (GtkClassInitFunc)filter_editor_class_init,
- (GtkObjectInitFunc)filter_editor_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(gnome_dialog_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_editor_class_init (FilterEditorClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(gnome_dialog_get_type ());
-
- object_class->finalize = filter_editor_finalise;
- /* override methods */
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-filter_editor_init (FilterEditor *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-filter_editor_finalise(GtkObject *obj)
-{
- FilterEditor *o = (FilterEditor *)obj;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_editor_new:
- *
- * Create a new FilterEditor object.
- *
- * Return value: A new #FilterEditor object.
- **/
-FilterEditor *
-filter_editor_new(void)
-{
- FilterEditor *o = (FilterEditor *)gtk_type_new(filter_editor_get_type ());
- return o;
-}
-
-#endif
-
-
-enum {
- BUTTON_ADD,
- BUTTON_EDIT,
- BUTTON_DELETE,
- BUTTON_UP,
- BUTTON_DOWN,
- BUTTON_LAST
-};
-
-struct _editor_data {
- RuleContext *f;
- FilterRule *current;
- GtkList *list;
- GtkButton *buttons[BUTTON_LAST];
- enum _filter_source_t current_source;
-};
-
-static void set_sensitive(struct _editor_data *data);
-
-static void rule_add(GtkWidget *widget, struct _editor_data *data)
-{
- FilterFilter *rule;
- int result;
- GnomeDialog *gd;
- GtkWidget *w;
- FilterPart *part;
-
- d(printf("add rule\n"));
- /* create a new rule with 1 match and 1 action */
- rule = filter_filter_new();
- ((FilterRule *)rule)->source = data->current_source;
-
- part = rule_context_next_part(data->f, NULL);
- filter_rule_add_part((FilterRule *)rule, filter_part_clone(part));
- part = filter_context_next_action((FilterContext *)data->f, NULL);
- filter_filter_add_action(rule, filter_part_clone(part));
-
- w = filter_rule_get_widget((FilterRule *)rule, data->f);
- gd = (GnomeDialog *)gnome_dialog_new(_("Add Rule"), GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL);
- gtk_box_pack_start((GtkBox *)gd->vbox, w, FALSE, TRUE, 0);
- gtk_widget_show((GtkWidget *)gd);
- result = gnome_dialog_run_and_close(gd);
- if (result == 0) {
- GtkListItem *item = (GtkListItem *)gtk_list_item_new_with_label(((FilterRule *)rule)->name);
- GList *l = NULL;
-
- gtk_object_set_data((GtkObject *)item, "rule", rule);
- gtk_widget_show((GtkWidget *)item);
- l = g_list_append(l, item);
- gtk_list_append_items(data->list, l);
- gtk_list_select_child(data->list, (GtkWidget *)item);
- data->current = (FilterRule *)rule;
- rule_context_add_rule(data->f, (FilterRule *)rule);
- set_sensitive(data);
- } else {
- gtk_object_unref((GtkObject *)rule);
- }
-}
-
-static void rule_edit(GtkWidget *widget, struct _editor_data *data)
-{
- GtkWidget *w;
- int result;
- GnomeDialog *gd;
- FilterRule *rule;
- int pos;
-
- d(printf("edit rule\n"));
- rule = data->current;
- w = filter_rule_get_widget(rule, data->f);
- gd = (GnomeDialog *)gnome_dialog_new(_("Edit Rule"),
- GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL,
- NULL);
- gtk_box_pack_start((GtkBox *)gd->vbox, w, FALSE, TRUE, 0);
- gtk_widget_show((GtkWidget *)gd);
- result = gnome_dialog_run_and_close(gd);
-
- if (result == 0) {
- pos = rule_context_get_rank_rule_with_source (data->f, data->current, data->current_source);
- if (pos != -1) {
- GtkListItem *item = g_list_nth_data(data->list->children, pos);
- gtk_label_set_text((GtkLabel *)(((GtkBin *)item)->child), data->current->name);
- }
- }
-}
-
-static void rule_delete(GtkWidget *widget, struct _editor_data *data)
-{
- int pos;
- GList *l;
- GtkListItem *item;
-
- d(printf("ddelete rule\n"));
- pos = rule_context_get_rank_rule_with_source (data->f, data->current, data->current_source);
- if (pos != -1) {
- rule_context_remove_rule(data->f, data->current);
-
- item = g_list_nth_data(data->list->children, pos);
- l = g_list_append(NULL, item);
- gtk_list_remove_items(data->list, l);
- g_list_free(l);
-
- gtk_object_unref((GtkObject *)data->current);
- data->current = NULL;
- }
- set_sensitive(data);
-}
-
-static void rule_move(struct _editor_data *data, int from, int to)
-{
- GList *l;
- GtkListItem *item;
-
- d(printf("moving %d to %d\n", from, to));
- rule_context_rank_rule(data->f, data->current, to);
-
- item = g_list_nth_data(data->list->children, from);
- l = g_list_append(NULL, item);
- gtk_list_remove_items_no_unref(data->list, l);
- gtk_list_insert_items(data->list, l, to);
- gtk_list_select_child(data->list, (GtkWidget *)item);
- set_sensitive(data);
-}
-
-static void rule_up(GtkWidget *widget, struct _editor_data *data)
-{
- int pos;
-
- d(printf("up rule\n"));
- pos = rule_context_get_rank_rule_with_source(data->f, data->current, data->current_source);
- if (pos>0) {
- rule_move(data, pos, pos-1);
- }
-}
-
-static void rule_down(GtkWidget *widget, struct _editor_data *data)
-{
- int pos;
-
- d(printf("down rule\n"));
- pos = rule_context_get_rank_rule_with_source(data->f, data->current, data->current_source);
- rule_move(data, pos, pos+1);
-}
-
-static struct {
- char *name;
- GtkSignalFunc func;
-} edit_buttons[] = {
- { "rule_add", rule_add },
- { "rule_edit", rule_edit },
- { "rule_delete", rule_delete },
- { "rule_up", rule_up },
- { "rule_down", rule_down },
-};
-
-static void
-set_sensitive(struct _editor_data *data)
-{
- FilterRule *rule = NULL;
- int index=-1, count=0;
-
- while ((rule = rule_context_next_rule(data->f, rule))) {
- if (rule == data->current)
- index=count;
- count++;
- }
- d(printf("index = %d count=%d\n", index, count));
- count--;
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_EDIT], index != -1);
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_DELETE], index != -1);
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_UP], index > 0);
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_DOWN], index >=0 && index<count);
-}
-
-static void
-select_rule(GtkWidget *w, GtkWidget *child, struct _editor_data *data)
-{
- data->current = gtk_object_get_data((GtkObject *)child, "rule");
- if (data->current)
- d(printf("seledct rule: %s\n", data->current->name));
- else
- d(printf("bad data?\n"));
- set_sensitive(data);
-}
-
-/* FIXME: we need a way to change a rule from one source type
- * to a different type. Maybe keep the selected ones?
- */
-
-static void
-select_source (GtkMenuItem *mi, struct _editor_data *data)
-{
- FilterRule *rule = NULL;
- GList *newitems = NULL;
- enum _filter_source_t source;
-
- source = (enum _filter_source_t) GPOINTER_TO_INT (
- gtk_object_get_data (GTK_OBJECT (mi), "number"));
-
- gtk_list_clear_items (GTK_LIST (data->list), 0, -1);
-
- d(printf("Checking for rules that are of type %d\n", source));
- while ((rule = rule_context_next_rule (data->f, rule)) != NULL) {
- GtkWidget *item;
-
- if (rule->source != source) {
- d(printf(" skipping %s: %d != %d\n", rule->name, rule->source, source));
- continue;
- }
-
- d(printf(" hit %s (%d)\n", rule->name, source));
- item = gtk_list_item_new_with_label (rule->name);
- gtk_object_set_data (GTK_OBJECT (item), "rule", rule);
- gtk_widget_show (GTK_WIDGET (item));
- newitems = g_list_append (newitems, item);
- }
-
- gtk_list_append_items (data->list, newitems);
- data->current_source = source;
- data->current = NULL;
- set_sensitive (data);
-}
-
-GtkWidget *filter_editor_construct (struct _FilterContext *f)
-{
- GladeXML *gui;
- GtkWidget *d, *w, *b, *firstitem = NULL;
- GList *l;
- struct _editor_data *data;
- int i;
-
- g_assert(IS_FILTER_CONTEXT(f));
-
- data = g_malloc0(sizeof(*data));
- data->f = (RuleContext *)f;
-
- gui = glade_xml_new(FILTER_GLADEDIR "/filter.glade", "edit_filter");
- d = glade_xml_get_widget (gui, "edit_filter");
- gtk_object_set_data_full((GtkObject *)d, "data", data, g_free);
-
- gtk_window_set_title((GtkWindow *)d, "Edit Filters");
- for (i=0;i<BUTTON_LAST;i++) {
- data->buttons[i] = (GtkButton *)w = glade_xml_get_widget (gui, edit_buttons[i].name);
- gtk_signal_connect((GtkObject *)w, "clicked", edit_buttons[i].func, data);
- }
-
- w = glade_xml_get_widget (gui, "filter_source");
- l = GTK_MENU_SHELL(GTK_OPTION_MENU(w)->menu)->children;
- i = 0;
- while (l) {
- b = GTK_WIDGET (l->data);
-
- if (i == 0)
- firstitem = b;
-
- /* make sure that the glade is in sync with enum _filter_source_t! */
- gtk_object_set_data (GTK_OBJECT (b), "number", GINT_TO_POINTER (i));
- gtk_signal_connect (GTK_OBJECT (b), "activate", select_source, data);
-
- i++;
- l = l->next;
- }
-
- w = glade_xml_get_widget (gui, "rule_list");
- data->list = (GtkList *)w;
- gtk_signal_connect((GtkObject *)w, "select_child", select_rule, data);
- select_source (GTK_MENU_ITEM (firstitem), data);
-
- gtk_object_unref((GtkObject *)gui);
-
- return d;
-}
diff --git a/filter/filter-editor.h b/filter/filter-editor.h
deleted file mode 100644
index 20369a9536..0000000000
--- a/filter/filter-editor.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_EDITOR_H
-#define _FILTER_EDITOR_H
-
-#include <gtk/gtk.h>
-#include <libgnomeui/gnome-dialog.h>
-
-#if 0
-/* NOTE: object stuff not used (yet?), this is just a holder file for a static factory */
-
-#define FILTER_EDITOR(obj) GTK_CHECK_CAST (obj, filter_editor_get_type (), FilterEditor)
-#define FILTER_EDITOR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_editor_get_type (), FilterEditorClass)
-#define IS_FILTER_EDITOR(obj) GTK_CHECK_TYPE (obj, filter_editor_get_type ())
-
-typedef struct _FilterEditor FilterEditor;
-typedef struct _FilterEditorClass FilterEditorClass;
-
-struct _FilterEditor {
- GnomeDialog parent;
- struct _FilterEditorPrivate *priv;
-
-};
-
-struct _FilterEditorClass {
- GnomeDialogClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint filter_editor_get_type (void);
-FilterEditor *filter_editor_new (void);
-#endif
-
-struct _FilterContext;
-
-/* methods */
-GtkWidget *filter_editor_construct (struct _FilterContext *f);
-
-#endif /* ! _FILTER_EDITOR_H */
-
diff --git a/filter/filter-element.c b/filter/filter-element.c
deleted file mode 100644
index e0b896daf2..0000000000
--- a/filter/filter-element.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#include "filter-element.h"
-#include "filter-input.h"
-#include "filter-option.h"
-#include "filter-code.h"
-#include "filter-colour.h"
-#include "filter-datespec.h"
-#include "filter-folder.h"
-
-static void xml_create(FilterElement *fe, xmlNodePtr node);
-static FilterElement *clone(FilterElement *fe);
-
-static void filter_element_class_init (FilterElementClass *class);
-static void filter_element_init (FilterElement *gspaper);
-static void filter_element_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((FilterElement *)(x))->priv)
-struct _FilterElementPrivate {
-};
-
-static GtkObjectClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-filter_element_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterElement",
- sizeof(FilterElement),
- sizeof(FilterElementClass),
- (GtkClassInitFunc)filter_element_class_init,
- (GtkObjectInitFunc)filter_element_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(gtk_object_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_element_class_init (FilterElementClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(gtk_object_get_type ());
-
- object_class->finalize = filter_element_finalise;
-
- /* override methods */
- class->xml_create = xml_create;
- class->clone = clone;
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-filter_element_init (FilterElement *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-filter_element_finalise(GtkObject *obj)
-{
- FilterElement *o = (FilterElement *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_element_new:
- *
- * Create a new FilterElement object.
- *
- * Return value: A new #FilterElement object.
- **/
-FilterElement *
-filter_element_new(void)
-{
- FilterElement *o = (FilterElement *)gtk_type_new(filter_element_get_type ());
- return o;
-}
-
-/**
- * filter_element_xml_create:
- * @fe:
- * @node:
- *
- * Create a new filter element based on an xml definition of
- * that element.
- **/
-void filter_element_xml_create (FilterElement *fe, xmlNodePtr node)
-{
- return ((FilterElementClass *)((GtkObject *)fe)->klass)->xml_create(fe, node);
-}
-
-/**
- * filter_element_xml_encode:
- * @fe:
- *
- * Encode the values of a filter element into xml format.
- *
- * Return value:
- **/
-xmlNodePtr filter_element_xml_encode (FilterElement *fe)
-{
- return ((FilterElementClass *)((GtkObject *)fe)->klass)->xml_encode(fe);
-}
-
-/**
- * filter_element_xml_decode:
- * @fe:
- * @node:
- *
- * Decode the values of a fitler element from xml format.
- *
- * Return value:
- **/
-int filter_element_xml_decode (FilterElement *fe, xmlNodePtr node)
-{
- return ((FilterElementClass *)((GtkObject *)fe)->klass)->xml_decode(fe, node);
-}
-
-/**
- * filter_element_clone:
- * @fe:
- *
- * Clones the FilterElement @fe.
- *
- * Return value:
- **/
-FilterElement *filter_element_clone (FilterElement *fe)
-{
- return ((FilterElementClass *)((GtkObject *)fe)->klass)->clone(fe);
-}
-
-/**
- * filter_element_get_widget:
- * @fe:
- * @node:
- *
- * Create a widget to represent this element.
- *
- * Return value:
- **/
-GtkWidget *filter_element_get_widget (FilterElement *fe)
-{
- return ((FilterElementClass *)((GtkObject *)fe)->klass)->get_widget(fe);
-}
-
-/**
- * filter_element_build_code:
- * @fe:
- * @out:
- * @ff:
- *
- * Add the code representing this element to the output string @out.
- **/
-void filter_element_build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- return ((FilterElementClass *)((GtkObject *)fe)->klass)->build_code(fe, out, ff);
-}
-
-/**
- * filter_element_format_sexp:
- * @fe:
- * @out:
- *
- * 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)
-{
- return ((FilterElementClass *)((GtkObject *)fe)->klass)->format_sexp(fe, out);
-}
-
-/**
- * filter_element_new_type_name:
- * @type:
- *
- * Create a new filter element based on its type name.
- *
- * Return value:
- **/
-FilterElement *filter_element_new_type_name (const char *type)
-{
- if (type == NULL)
- return NULL;
-
- if (!strcmp(type, "string")) {
- return (FilterElement *)filter_input_new();
- } else if (!strcmp(type, "folder")) {
- return (FilterElement *)filter_folder_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 {
- g_warning("Unknown filter type '%s'", type);
- return 0;
- }
-}
-
-/* default implementations */
-static void xml_create(FilterElement *fe, xmlNodePtr node)
-{
- fe->name = xmlGetProp(node, "name");
-}
-
-static FilterElement *clone(FilterElement *fe)
-{
- xmlNodePtr node;
- FilterElement *new;
-
- new = (FilterElement *)gtk_type_new( ((GtkObject *)fe)->klass->type );
- node = filter_element_xml_encode(fe);
- filter_element_xml_decode(new, node);
- xmlFreeNodeList(node);
- return new;
-}
-
-
diff --git a/filter/filter-element.h b/filter/filter-element.h
deleted file mode 100644
index 8fe82402ee..0000000000
--- a/filter/filter-element.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_ELEMENT_H
-#define _FILTER_ELEMENT_H
-
-#include <gtk/gtk.h>
-#include <gnome-xml/parser.h>
-
-#define FILTER_ELEMENT(obj) GTK_CHECK_CAST (obj, filter_element_get_type (), FilterElement)
-#define FILTER_ELEMENT_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_element_get_type (), FilterElementClass)
-#define IS_FILTER_ELEMENT(obj) GTK_CHECK_TYPE (obj, filter_element_get_type ())
-
-typedef struct _FilterElement FilterElement;
-typedef struct _FilterElementClass FilterElementClass;
-
-struct _FilterElement {
- GtkObject parent;
- struct _FilterElementPrivate *priv;
-
- char *name;
-};
-
-struct _FilterPart;
-
-struct _FilterElementClass {
- GtkObjectClass parent_class;
-
- /* virtual methods */
- void (*xml_create)(FilterElement *, xmlNodePtr);
- xmlNodePtr (*xml_encode)(FilterElement *);
- int (*xml_decode)(FilterElement *, xmlNodePtr);
-
- FilterElement *(*clone)(FilterElement *fe);
-
- GtkWidget *(*get_widget)(FilterElement *);
- void (*build_code)(FilterElement *, GString *, struct _FilterPart *ff);
- void (*format_sexp)(FilterElement *, GString *);
-
- /* signals */
-};
-
-guint filter_element_get_type (void);
-FilterElement *filter_element_new (void);
-
-FilterElement *filter_element_new_type_name (const char *type);
-
-/* methods */
-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);
-
-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-filter.c b/filter/filter-filter.c
deleted file mode 100644
index b0699ce827..0000000000
--- a/filter/filter-filter.c
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include "filter-filter.h"
-#include "filter-context.h"
-
-#define d(x)
-
-static xmlNodePtr xml_encode(FilterRule *);
-static int xml_decode(FilterRule *, xmlNodePtr, struct _RuleContext *f);
-/*static void build_code(FilterRule *, GString *out);*/
-static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f);
-
-static void filter_filter_class_init (FilterFilterClass *class);
-static void filter_filter_init (FilterFilter *gspaper);
-static void filter_filter_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((FilterFilter *)(x))->priv)
-
-struct _FilterFilterPrivate {
-};
-
-static FilterRuleClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-filter_filter_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterFilter",
- sizeof(FilterFilter),
- sizeof(FilterFilterClass),
- (GtkClassInitFunc)filter_filter_class_init,
- (GtkObjectInitFunc)filter_filter_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(filter_rule_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_filter_class_init (FilterFilterClass *class)
-{
- GtkObjectClass *object_class;
- FilterRuleClass *filter_rule = (FilterRuleClass *)class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(filter_rule_get_type ());
-
- object_class->finalize = filter_filter_finalise;
-
- /* override methods */
- filter_rule->xml_encode = xml_encode;
- filter_rule->xml_decode = xml_decode;
- /*filter_rule->build_code = build_code;*/
- filter_rule->get_widget = get_widget;
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-filter_filter_init (FilterFilter *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-unref_list(GList *l)
-{
- while (l) {
- gtk_object_unref((GtkObject *)l->data);
- l = g_list_next(l);
- }
-}
-
-static void
-filter_filter_finalise(GtkObject *obj)
-{
- FilterFilter *o = (FilterFilter *)obj;
-
- unref_list(o->actions);
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_filter_new:
- *
- * Create a new FilterFilter object.
- *
- * Return value: A new #FilterFilter object.
- **/
-FilterFilter *
-filter_filter_new(void)
-{
- FilterFilter *o = (FilterFilter *)gtk_type_new(filter_filter_get_type ());
- return o;
-}
-
-void filter_filter_add_action (FilterFilter *fr, FilterPart *fp)
-{
- fr->actions = g_list_append(fr->actions, fp);
-}
-
-void filter_filter_remove_action (FilterFilter *fr, FilterPart *fp)
-{
- fr->actions = g_list_remove(fr->actions, fp);
-}
-
-void filter_filter_replace_action(FilterFilter *fr, FilterPart *fp, FilterPart *new)
-{
- GList *l;
-
- l = g_list_find(fr->actions, fp);
- if (l) {
- l->data = new;
- } else {
- fr->actions = g_list_append(fr->actions, new);
- }
-}
-
-void filter_filter_build_action (FilterFilter *fr, GString *out)
-{
- g_string_append(out, "(begin\n");
- filter_part_build_code_list(fr->actions, out);
- g_string_append(out, ")\n");
-}
-
-static xmlNodePtr xml_encode(FilterRule *fr)
-{
- xmlNodePtr node, set, work;
- GList *l;
- FilterFilter *ff = (FilterFilter *)fr;
-
- node = ((FilterRuleClass *)(parent_class))->xml_encode(fr);
- g_assert(node != NULL);
- set = xmlNewNode(NULL, "actionset");
- xmlAddChild(node, set);
- l = ff->actions;
- while (l) {
- work = filter_part_xml_encode((FilterPart *)l->data);
- xmlAddChild(set, work);
- l = g_list_next(l);
- }
- return node;
-
-}
-
-static void load_set(xmlNodePtr node, FilterFilter *ff, RuleContext *f)
-{
- xmlNodePtr work;
- char *rulename;
- FilterPart *part;
-
- work = node->childs;
- while (work) {
- if (!strcmp(work->name, "part")) {
- rulename = xmlGetProp(work, "name");
- part = filter_context_find_action((FilterContext *)f, rulename);
- if (part) {
- part = filter_part_clone(part);
- filter_part_xml_decode(part, work);
- filter_filter_add_action(ff, part);
- } else {
- g_warning("cannot find rule part '%s'\n", rulename);
- }
- xmlFree(rulename);
- } else {
- g_warning("Unknwon xml node in part: %s", work->name);
- }
- work = work->next;
- }
-}
-
-static int xml_decode(FilterRule *fr, xmlNodePtr node, struct _RuleContext *f)
-{
- xmlNodePtr work;
- FilterFilter *ff = (FilterFilter *)fr;
- int result;
-
- result = ((FilterRuleClass *)(parent_class))->xml_decode(fr, node, f);
- if (result != 0)
- return result;
-
- work = node->childs;
- while (work) {
- if (!strcmp(work->name, "actionset")) {
- load_set(work, ff, f);
- }
- work = work->next;
- }
- return 0;
-}
-
-/*static void build_code(FilterRule *fr, GString *out)
-{
- return ((FilterRuleClass *)(parent_class))->build_code(fr, out);
-}*/
-
-struct _part_data {
- FilterRule *fr;
- FilterContext *f;
- FilterPart *part;
- GtkWidget *partwidget, *container;
-};
-
-static void option_activate(GtkMenuItem *item, struct _part_data *data)
-{
- FilterPart *part = gtk_object_get_data((GtkObject *)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((GtkContainer *)data->container, data->partwidget);
- newpart = filter_part_clone(part);
- filter_filter_replace_action((FilterFilter *)data->fr, data->part, newpart);
- gtk_object_unref((GtkObject *)data->part);
- data->part = newpart;
- data->partwidget = filter_part_get_widget(newpart);
- if (data->partwidget)
- gtk_box_pack_start((GtkBox *)data->container, data->partwidget, FALSE, FALSE, 0);
-}
-
-static GtkWidget *
-get_rule_part_widget(FilterContext *f, FilterPart *newpart, FilterRule *fr)
-{
- FilterPart *part = NULL;
- GtkMenu *menu;
- GtkMenuItem *item;
- GtkOptionMenu *omenu;
- GtkHBox *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 = (GtkHBox *)gtk_hbox_new(FALSE, 0);
- p = filter_part_get_widget(newpart);
-
- data->partwidget = p;
- data->container = (GtkWidget *)hbox;
-
- menu = (GtkMenu *)gtk_menu_new();
- while ((part=filter_context_next_action(f, part))) {
- item = (GtkMenuItem *)gtk_menu_item_new_with_label(part->title);
- gtk_object_set_data((GtkObject *)item, "part", part);
- gtk_signal_connect((GtkObject *)item, "activate", option_activate, data);
- gtk_menu_append(menu, (GtkWidget *)item);
- gtk_widget_show((GtkWidget *)item);
- if (!strcmp(newpart->title, part->title)) {
- current = index;
- }
- index++;
- }
-
- omenu = (GtkOptionMenu *)gtk_option_menu_new();
- gtk_option_menu_set_menu(omenu, (GtkWidget *)menu);
- gtk_option_menu_set_history(omenu, current);
- gtk_widget_show((GtkWidget *)omenu);
-
- gtk_box_pack_start((GtkBox *)hbox, (GtkWidget *)omenu, FALSE, FALSE, 0);
- if (p) {
- gtk_box_pack_start((GtkBox *)hbox, p, FALSE, FALSE, 0);
- }
- gtk_widget_show_all((GtkWidget *)hbox);
-
- return (GtkWidget *)hbox;
-}
-
-struct _rule_data {
- FilterRule *fr;
- FilterContext *f;
- GtkWidget *parts;
-};
-
-static void
-less_parts(GtkWidget *button, struct _rule_data *data)
-{
- GList *l;
- FilterPart *part;
- GtkWidget *w;
-
- l = ((FilterFilter *)data->fr)->actions;
- if (g_list_length(l) < 2)
- return;
-
- /* remove the last one from the list */
- l = g_list_last(l);
- part = l->data;
- filter_filter_remove_action((FilterFilter *)data->fr, part);
- gtk_object_unref((GtkObject *)part);
-
- /* and from the display */
- l = g_list_last(GTK_BOX(data->parts)->children);
- w = ((GtkBoxChild *)l->data)->widget;
- gtk_container_remove((GtkContainer *)data->parts, w);
-}
-
-static void
-more_parts(GtkWidget *button, struct _rule_data *data)
-{
- FilterPart *new;
- GtkWidget *w;
-
- /* create a new rule entry, use the first type of rule */
- new = filter_context_next_action((FilterContext *)data->f, NULL);
- if (new) {
- new = filter_part_clone(new);
- filter_filter_add_action((FilterFilter *)data->fr, new);
- w = get_rule_part_widget(data->f, new, data->fr);
- gtk_box_pack_start((GtkBox *)data->parts, w, FALSE, FALSE, 0);
- }
-}
-
-static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f)
-{
- GtkWidget *widget;
- GtkVBox *parts, *inframe;
- GtkHBox *hbox;
- GtkWidget *w;
- GtkFrame *frame;
- GList *l;
- FilterPart *part;
- struct _rule_data *data;
- FilterFilter *ff = (FilterFilter *)fr;
-
- d(printf("filter filter.get widget\n"));
-
- widget = ((FilterRuleClass *)(parent_class))->get_widget(fr, f);
-
- /* and now for the action area */
- frame = (GtkFrame *)gtk_frame_new("Perform actions");
- inframe = (GtkVBox *)gtk_vbox_new(FALSE, 3);
- gtk_container_add((GtkContainer *)frame, (GtkWidget *)inframe);
-
- parts = (GtkVBox *)gtk_vbox_new(FALSE, 3);
- data = g_malloc0(sizeof(*data));
- data->f = (FilterContext *)f;
- data->fr = fr;
- data->parts = (GtkWidget *)parts;
-
- l = ff->actions;
- while (l) {
- part = l->data;
- d(printf("adding action %s\n", part->title));
- w = get_rule_part_widget((FilterContext *)f, part, fr);
- gtk_box_pack_start((GtkBox *)parts, (GtkWidget *)w, FALSE, FALSE, 3);
- l = g_list_next(l);
- }
- gtk_box_pack_start((GtkBox *)inframe, (GtkWidget *)parts, FALSE, FALSE, 3);
-
- hbox = (GtkHBox *)gtk_hbox_new(FALSE, 3);
- w = gtk_button_new_with_label(_("Less"));
- gtk_signal_connect((GtkObject *)w, "clicked", less_parts, data);
- gtk_box_pack_end((GtkBox *)hbox, (GtkWidget *)w, FALSE, FALSE, 3);
- w = gtk_button_new_with_label(_("More"));
- gtk_signal_connect((GtkObject *)w, "clicked", more_parts, data);
- gtk_box_pack_end((GtkBox *)hbox, (GtkWidget *)w, FALSE, FALSE, 3);
- gtk_box_pack_start((GtkBox *)inframe, (GtkWidget *)hbox, FALSE, FALSE, 3);
-
- gtk_widget_show_all((GtkWidget *)frame);
-
- gtk_box_pack_start((GtkBox *)widget, (GtkWidget *)frame, FALSE, FALSE, 3);
-
- return widget;
-}
-
diff --git a/filter/filter-filter.h b/filter/filter-filter.h
deleted file mode 100644
index 944aba42ae..0000000000
--- a/filter/filter-filter.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_FILTER_H
-#define _FILTER_FILTER_H
-
-#include <gtk/gtk.h>
-#include "filter-rule.h"
-
-#define FILTER_FILTER(obj) GTK_CHECK_CAST (obj, filter_filter_get_type (), FilterFilter)
-#define FILTER_FILTER_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_filter_get_type (), FilterFilterClass)
-#define IS_FILTER_FILTER(obj) GTK_CHECK_TYPE (obj, filter_filter_get_type ())
-
-typedef struct _FilterFilter FilterFilter;
-typedef struct _FilterFilterClass FilterFilterClass;
-
-struct _FilterFilter {
- FilterRule parent;
- struct _FilterFilterPrivate *priv;
-
- GList *actions;
-};
-
-struct _FilterFilterClass {
- FilterRuleClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint filter_filter_get_type (void);
-FilterFilter *filter_filter_new (void);
-
-/* methods */
-void filter_filter_add_action (FilterFilter *fr, FilterPart *fp);
-void filter_filter_remove_action (FilterFilter *fr, FilterPart *fp);
-void filter_filter_replace_action (FilterFilter *fr, FilterPart *fp, FilterPart *new);
-
-void filter_filter_build_action (FilterFilter *fr, GString *out);
-
-#endif /* ! _FILTER_FILTER_H */
-
diff --git a/filter/filter-folder.c b/filter/filter-folder.c
deleted file mode 100644
index 60212086ee..0000000000
--- a/filter/filter-folder.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#define SHELL
-
-#include "filter-folder.h"
-#ifdef SHELL
-#include "shell/evolution-shell-client.h"
-#endif
-#include "e-util/e-sexp.h"
-
-#define d(x)
-
-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 *);
-
-#ifdef SHELL
-extern EvolutionShellClient *global_shell_client;
-#endif
-
-static void filter_folder_class_init (FilterFolderClass *class);
-static void filter_folder_init (FilterFolder *gspaper);
-static void filter_folder_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((FilterFolder *)(x))->priv)
-
-struct _FilterFolderPrivate {
-};
-
-static FilterElementClass *parent_class;
-
-guint
-filter_folder_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterFolder",
- sizeof(FilterFolder),
- sizeof(FilterFolderClass),
- (GtkClassInitFunc)filter_folder_class_init,
- (GtkObjectInitFunc)filter_folder_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(filter_element_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_folder_class_init (FilterFolderClass *class)
-{
- GtkObjectClass *object_class;
- FilterElementClass *filter_element = (FilterElementClass *)class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(filter_element_get_type ());
-
- object_class->finalize = filter_folder_finalise;
-
- /* override methods */
- filter_element->xml_create = xml_create;
- filter_element->xml_encode = xml_encode;
- filter_element->xml_decode = xml_decode;
- filter_element->get_widget = get_widget;
- filter_element->build_code = build_code;
- filter_element->format_sexp = format_sexp;
-}
-
-static void
-filter_folder_init (FilterFolder *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-filter_folder_finalise(GtkObject *obj)
-{
- FilterFolder *o = (FilterFolder *)obj;
-
- g_free(o->uri);
- g_free(o->name);
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_folder_new:
- *
- * Create a new FilterFolder object.
- *
- * Return value: A new #FilterFolder object.
- **/
-FilterFolder *
-filter_folder_new(void)
-{
- FilterFolder *o = (FilterFolder *)gtk_type_new(filter_folder_get_type ());
- return o;
-}
-
-static void xml_create(FilterElement *fe, xmlNodePtr node)
-{
- /* parent implementation */
- ((FilterElementClass *)(parent_class))->xml_create(fe, node);
-}
-
-static xmlNodePtr xml_encode(FilterElement *fe)
-{
- xmlNodePtr value, work;
- FilterFolder *ff = (FilterFolder *)fe;
-
- d(printf("Encoding folder as xml\n"));
-
- value = xmlNewNode(NULL, "value");
- xmlSetProp(value, "name", fe->name);
- xmlSetProp(value, "type", "folder");
-
- work = xmlNewChild(value, NULL, "folder", NULL);
- xmlSetProp(work, "name", ff->name);
- xmlSetProp(work, "uri", ff->uri);
-
- return value;
-}
-
-static int xml_decode(FilterElement *fe, xmlNodePtr node)
-{
- FilterFolder *ff = (FilterFolder *)fe;
- xmlNodePtr n;
-
- d(printf("Decoding folder from xml %p\n", fe));
-
- fe->name = xmlGetProp(node, "name");
-
- n = node->childs;
- while (n) {
- if (!strcmp(n->name, "folder")) {
- ff->name = xmlGetProp(n, "name");
- ff->uri = xmlGetProp(n, "uri");
- break;
- }
- n = n->next;
- }
- return 0;
-}
-
-static void button_clicked(GtkButton *button, FilterFolder *ff)
-{
-#ifdef SHELL
- const char *allowed_types[] = { "mail", NULL };
- char *def, *physical_uri, *evolution_uri;
-
- def = ff->uri ? ff->uri : "";
-
- evolution_shell_client_user_select_folder (global_shell_client,
- _("Select Folder"),
- def, allowed_types,
- &evolution_uri,
- &physical_uri);
-
- if (physical_uri != NULL && physical_uri[0] != '\0') {
- g_free(ff->uri);
- ff->uri = physical_uri;
-
- g_free(ff->name);
- ff->name = g_strdup(g_basename (evolution_uri));
-
- gtk_label_set_text((GtkLabel *)GTK_BIN(button)->child, ff->name);
- } else {
- g_free (physical_uri);
- }
- g_free (evolution_uri);
-#else
- GnomeDialog *gd;
- GtkEntry *entry;
- char *uri, *str;
-
- gd = (GnomeDialog *)gnome_dialog_new(_("Enter folder URI"),
- GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL,
- NULL);
- entry = (GtkEntry *)gtk_entry_new();
- if (ff->uri) {
- gtk_entry_set_text(entry, ff->uri);
- }
- gtk_box_pack_start((GtkBox *)gd->vbox, (GtkWidget *)entry, TRUE, TRUE, 3);
- gtk_widget_show((GtkWidget *)entry);
- switch (gnome_dialog_run(gd)) {
- case 0:
- g_free(ff->uri);
- g_free(ff->name);
- uri = gtk_entry_get_text(entry);
- ff->uri = g_strdup(uri);
- str = strstr(uri, "//");
- if (str)
- str = strchr(str+2, '/');
- if (str)
- str++;
- else
- str = uri;
- ff->name = g_strdup(str);
- gtk_label_set_text((GtkLabel *)GTK_BIN(button)->child, ff->name);
- case 1:
- gnome_dialog_close(gd);
- case -1:
- /* nothing */
- }
-
-#endif
-}
-
-static GtkWidget *get_widget(FilterElement *fe)
-{
- FilterFolder *ff = (FilterFolder *)fe;
- GtkButton *button;
- GtkLabel *label;
-
- if (ff->name && ff->name[0])
- label = (GtkLabel *)gtk_label_new(g_basename (ff->name));
- else
- label = (GtkLabel *)gtk_label_new(_("<click here to select a folder>"));
-
- button = (GtkButton *)gtk_button_new();
- gtk_container_add((GtkContainer *)button, (GtkWidget *)label);
- gtk_widget_show((GtkWidget *)button);
- gtk_widget_show((GtkWidget *)label);
- gtk_signal_connect((GtkObject *)button, "clicked", button_clicked, ff);
- return (GtkWidget *)button;
-}
-
-static void build_code(FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- return;
-}
-
-static void format_sexp(FilterElement *fe, GString *out)
-{
- FilterFolder *ff = (FilterFolder *)fe;
-
- e_sexp_encode_string(out, ff->uri);
-}
diff --git a/filter/filter-folder.h b/filter/filter-folder.h
deleted file mode 100644
index ee52d7037b..0000000000
--- a/filter/filter-folder.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_FOLDER_H
-#define _FILTER_FOLDER_H
-
-#include <gtk/gtk.h>
-#include "filter-element.h"
-
-#define FILTER_FOLDER(obj) GTK_CHECK_CAST (obj, filter_folder_get_type (), FilterFolder)
-#define FILTER_FOLDER_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_folder_get_type (), FilterFolderClass)
-#define IS_FILTER_FOLDER(obj) GTK_CHECK_TYPE (obj, filter_folder_get_type ())
-
-typedef struct _FilterFolder FilterFolder;
-typedef struct _FilterFolderClass FilterFolderClass;
-
-struct _FilterFolder {
- FilterElement parent;
- struct _FilterFolderPrivate *priv;
-
- char *uri;
- char *name; /* name of folder for display? */
-};
-
-struct _FilterFolderClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint filter_folder_get_type (void);
-FilterFolder *filter_folder_new (void);
-
-/* methods */
-
-#endif /* ! _FILTER_FOLDER_H */
-
diff --git a/filter/filter-input.c b/filter/filter-input.c
deleted file mode 100644
index f422a091b1..0000000000
--- a/filter/filter-input.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#include "filter-input.h"
-#include "e-util/e-sexp.h"
-
-#define d(x)
-
-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 *class);
-static void filter_input_init (FilterInput *gspaper);
-static void filter_input_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((FilterInput *)(x))->priv)
-
-struct _FilterInputPrivate {
-};
-
-static FilterElementClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-filter_input_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterInput",
- sizeof(FilterInput),
- sizeof(FilterInputClass),
- (GtkClassInitFunc)filter_input_class_init,
- (GtkObjectInitFunc)filter_input_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(filter_element_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_input_class_init (FilterInputClass *class)
-{
- GtkObjectClass *object_class;
- FilterElementClass *filter_element = (FilterElementClass *)class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(filter_element_get_type ());
-
- object_class->finalize = filter_input_finalise;
-
- /* override methods */
- filter_element->xml_create = xml_create;
- filter_element->xml_encode = xml_encode;
- filter_element->xml_decode = xml_decode;
- filter_element->get_widget = get_widget;
- filter_element->build_code = build_code;
- filter_element->format_sexp = format_sexp;
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-filter_input_init (FilterInput *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-filter_input_finalise(GtkObject *obj)
-{
- FilterInput *o = (FilterInput *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_input_new:
- *
- * Create a new FilterInput object.
- *
- * Return value: A new #FilterInput object.
- **/
-FilterInput *
-filter_input_new(void)
-{
- FilterInput *o = (FilterInput *)gtk_type_new(filter_input_get_type ());
- return o;
-}
-
-FilterInput *filter_input_new_type_name (const char *type)
-{
- FilterInput *o = filter_input_new();
- o->type = g_strdup(type);
-
- d(printf("new type %s = %p\n", type, o));
- return o;
-}
-
-void filter_input_set_value(FilterInput *fi, const char *value)
-{
- GList *l;
-
- 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 void xml_create(FilterElement *fe, xmlNodePtr node)
-{
- /* parent implementation */
- ((FilterElementClass *)(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);
- xmlNodeSetContent(cur, str);
- l = g_list_next(l);
- }
- return value;
-}
-
-static int xml_decode(FilterElement *fe, xmlNodePtr node)
-{
- FilterInput *fi = (FilterInput *)fe;
- char *name, *str, *type;
- xmlNodePtr n;
-
- type = fi->type?fi->type:"string";
-
- d(printf("Decoding %s from xml %p\n", type, fe));
-
- name = xmlGetProp(node, "name");
- d(printf("Name = %s\n", name));
- fe->name = name;
- fi->type = xmlGetProp(node, "type");
- n = node->childs;
- while (n) {
- if (!strcmp(n->name, type)) {
- str = xmlNodeGetContent(n);
- d(printf(" '%s'\n", str));
- fi->values = g_list_append(fi->values, str);
- } else {
- 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)
-{
- char *new;
- FilterInput *fi = (FilterInput *)fe;
- GList *l;
-
- new = gtk_entry_get_text(entry);
-
- /* NOTE: entry only supports a single 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(new));
-}
-
-static GtkWidget *get_widget(FilterElement *fe)
-{
- GtkEntry *entry;
- FilterInput *fi = (FilterInput *)fe;
-
- entry = (GtkEntry *)gtk_entry_new();
- if (fi->values && fi->values->data) {
- gtk_entry_set_text(entry, fi->values->data);
- }
- gtk_signal_connect((GtkObject *)entry, "changed", entry_changed, fe);
- return (GtkWidget *)entry;
-}
-
-static void build_code(FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- return;
-}
-
-static void format_sexp(FilterElement *fe, GString *out)
-{
- GList *l;
- FilterInput *fi = (FilterInput *)fe;
-
- l = fi->values;
- while (l) {
- e_sexp_encode_string(out, l->data);
- l = g_list_next(l);
- }
-}
diff --git a/filter/filter-input.h b/filter/filter-input.h
deleted file mode 100644
index 0ce43d980d..0000000000
--- a/filter/filter-input.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_INPUT_H
-#define _FILTER_INPUT_H
-
-#include <gtk/gtk.h>
-#include "filter-element.h"
-
-#define FILTER_INPUT(obj) GTK_CHECK_CAST (obj, filter_input_get_type (), FilterInput)
-#define FILTER_INPUT_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_input_get_type (), FilterInputClass)
-#define IS_FILTER_INPUT(obj) GTK_CHECK_TYPE (obj, filter_input_get_type ())
-
-typedef struct _FilterInput FilterInput;
-typedef struct _FilterInputClass FilterInputClass;
-
-struct _FilterInput {
- FilterElement parent;
- struct _FilterInputPrivate *priv;
-
- char *type; /* name of type */
- GList *values; /* strings */
-};
-
-struct _FilterInputClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint 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-option.c b/filter/filter-option.c
deleted file mode 100644
index bbf1a8ef90..0000000000
--- a/filter/filter-option.c
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include "filter-option.h"
-#include "filter-part.h"
-#include "e-util/e-sexp.h"
-
-#define d(x)
-
-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 *class);
-static void filter_option_init (FilterOption *gspaper);
-static void filter_option_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((FilterOption *)(x))->priv)
-
-struct _FilterOptionPrivate {
-};
-
-static FilterElementClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-filter_option_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterOption",
- sizeof(FilterOption),
- sizeof(FilterOptionClass),
- (GtkClassInitFunc)filter_option_class_init,
- (GtkObjectInitFunc)filter_option_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(filter_element_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_option_class_init (FilterOptionClass *class)
-{
- GtkObjectClass *object_class;
- FilterElementClass *filter_element = (FilterElementClass *)class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(filter_element_get_type ());
-
- object_class->finalize = filter_option_finalise;
-
- /* override methods */
- filter_element->xml_create = xml_create;
- filter_element->xml_encode = xml_encode;
- filter_element->xml_decode = xml_decode;
- filter_element->clone = clone;
- filter_element->get_widget = get_widget;
- filter_element->build_code = build_code;
- filter_element->format_sexp = format_sexp;
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-filter_option_init (FilterOption *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-filter_option_finalise(GtkObject *obj)
-{
- FilterOption *o = (FilterOption *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_option_new:
- *
- * Create a new FilterOption object.
- *
- * Return value: A new #FilterOption object.
- **/
-FilterOption *
-filter_option_new(void)
-{
- FilterOption *o = (FilterOption *)gtk_type_new(filter_option_get_type ());
- return o;
-}
-
-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);
-}
-
-static void xml_create(FilterElement *fe, xmlNodePtr node)
-{
- FilterOption *fo = (FilterOption *)fe;
- xmlNodePtr n, work;
- struct _filter_option *op;
-
- /* parent implementation */
- ((FilterElementClass *)(parent_class))->xml_create(fe, node);
-
- n = node->childs;
- while (n) {
- if (!strcmp(n->name, "option")) {
- op = g_malloc0(sizeof(*op));
- op->value = xmlGetProp(n, "value");
- work = n->childs;
- while (work) {
- if (!strcmp(work->name, "title")) {
- if (!op->title) {
- op->title = xmlNodeGetContent(work);
- }
- } else if (!strcmp(work->name, "code")) {
- if (!op->code) {
- op->code = xmlNodeGetContent(work);
- }
- }
- work = work->next;
- }
- d(printf("creating new option:\n title %s\n value %s\n code %s\n", op->title, op->value, op->code));
- fo->options = g_list_append(fo->options, op);
- if (fo->current == NULL)
- fo->current = op;
- } else {
- 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", "option");
- 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"));
- 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_activate(GtkMenuItem *item, FilterOption *fo)
-{
- fo->current = gtk_object_get_data((GtkObject *)item, "option");
- d(printf("option changed to %s\n", fo->current->title));
-}
-
-static GtkWidget *get_widget(FilterElement *fe)
-{
- FilterOption *fo = (FilterOption *)fe;
- GtkMenu *menu;
- GtkOptionMenu *omenu;
- GtkMenuItem *item;
- GList *l = fo->options;
- struct _filter_option *op;
- int index = 0, current=0;
-
- menu = (GtkMenu *)gtk_menu_new();
- while (l) {
- op = l->data;
- item = (GtkMenuItem *)gtk_menu_item_new_with_label(op->title);
- gtk_object_set_data((GtkObject *)item, "option", op);
- gtk_signal_connect((GtkObject *)item, "activate", option_activate, fo);
- gtk_menu_append(menu, (GtkWidget *)item);
- gtk_widget_show((GtkWidget *)item);
- if (op == fo->current) {
- current = index;
- }
- l = g_list_next(l);
- index++;
- }
-
- omenu = (GtkOptionMenu *)gtk_option_menu_new();
- gtk_option_menu_set_menu(omenu, (GtkWidget *)menu);
- gtk_option_menu_set_history(omenu, current);
-
- return (GtkWidget *)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) {
- 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 *fn, *op;
-
- d(printf("cloning option\n"));
-
- new = FILTER_OPTION(((FilterElementClass *)(parent_class))->clone(fe));
- l = fo->options;
- while (l) {
- op = l->data;
- fn = g_malloc(sizeof(*fn));
- d(printf(" option %s\n", op->title));
- fn->title = g_strdup(op->title);
- fn->value = g_strdup(op->value);
- fn->code = g_strdup(op->code);
- new->options = g_list_append(new->options, fn);
- l = g_list_next(l);
-
- if (new->current == NULL)
- new->current = fn;
- }
-
- 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 1bbec79d84..0000000000
--- a/filter/filter-option.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_OPTION_H
-#define _FILTER_OPTION_H
-
-#include <gtk/gtk.h>
-
-#include "filter-element.h"
-
-#define FILTER_OPTION(obj) GTK_CHECK_CAST (obj, filter_option_get_type (), FilterOption)
-#define FILTER_OPTION_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_option_get_type (), FilterOptionClass)
-#define IS_FILTER_OPTION(obj) GTK_CHECK_TYPE (obj, filter_option_get_type ())
-
-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;
- struct _FilterOptionPrivate *priv;
-
- GList *options;
- struct _filter_option *current;
-};
-
-struct _FilterOptionClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint filter_option_get_type (void);
-FilterOption *filter_option_new (void);
-
-/* methods */
-void filter_option_set_current(FilterOption *option, const char *name);
-
-#endif /* ! _FILTER_OPTION_H */
-
diff --git a/filter/filter-part.c b/filter/filter-part.c
deleted file mode 100644
index 31394b63fd..0000000000
--- a/filter/filter-part.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#include <gnome-xml/xmlmemory.h>
-
-#include "filter-part.h"
-#include "filter-element.h"
-
-#define d(x)
-
-static void filter_part_class_init (FilterPartClass *class);
-static void filter_part_init (FilterPart *gspaper);
-static void filter_part_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((FilterPart *)(x))->priv)
-
-struct _FilterPartPrivate {
-};
-
-static GtkObjectClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-filter_part_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterPart",
- sizeof(FilterPart),
- sizeof(FilterPartClass),
- (GtkClassInitFunc)filter_part_class_init,
- (GtkObjectInitFunc)filter_part_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(gtk_object_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_part_class_init (FilterPartClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(gtk_object_get_type ());
-
- object_class->finalize = filter_part_finalise;
- /* override methods */
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-filter_part_init (FilterPart *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-filter_part_finalise(GtkObject *obj)
-{
- FilterPart *o = (FilterPart *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_part_new:
- *
- * Create a new FilterPart object.
- *
- * Return value: A new #FilterPart object.
- **/
-FilterPart *
-filter_part_new(void)
-{
- FilterPart *o = (FilterPart *)gtk_type_new(filter_part_get_type ());
- return o;
-}
-
-
-
-int filter_part_xml_create (FilterPart *ff, xmlNodePtr node)
-{
- xmlNodePtr n;
- char *type;
- FilterElement *el;
-
- ff->name = xmlGetProp(node, "name");
- n = node->childs;
- 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 = filter_element_new_type_name(type)) != NULL) {
- filter_element_xml_create(el, n);
- xmlFree(type);
- d(printf("adding element part %p %s\n", 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)
- ff->title = xmlNodeGetContent(n);
- } else if (!strcmp(n->name, "code")) {
- if (!ff->code)
- ff->code = xmlNodeGetContent(n);
- } else {
- g_warning("Unknwon 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->childs;
- 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 *)gtk_type_new( ((GtkObject *)fp)->klass->type );
- 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;
-}
-
-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)
-{
- GtkHBox *hbox;
- GList *l = ff->elements;
- FilterElement *fe;
- GtkWidget *w;
-
- hbox = (GtkHBox *)gtk_hbox_new(FALSE, 3);
-
- while (l) {
- fe = l->data;
- w = filter_element_get_widget(fe);
- if (w) {
- gtk_box_pack_start((GtkBox *)hbox, w, FALSE, FALSE, 3);
- }
- l = g_list_next(l);
- }
- gtk_widget_show_all((GtkWidget *)hbox);
- return (GtkWidget *)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 = g_list_next(l);
- }
-}
-
-/**
- * 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 = g_list_next(l);
- }
-}
-
-/**
- * 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 = g_list_next(l);
- }
- 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 = g_list_next(node);
- }
- 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 ( (newstart = strstr(start, "${"))
- && (end = strstr(newstart+2, "}")) ) {
- len = end-newstart-2;
- if (len+1>namelen) {
- namelen = (len+1)*2;
- name = 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", name, fe));
- if (fe) {
- g_string_sprintfa(out, "%.*s", newstart-start, start);
- filter_element_format_sexp(fe, out);
-#if 0
- } else if ( (val = g_hash_table_lookup(ff->globals, name)) ) {
- g_string_sprintfa(out, "%.*s", newstart-start, start);
- e_sexp_encode_string(out, val);
-#endif
- } else {
- g_string_sprintfa(out, "%.*s", end-start+1, start);
- }
- start = end+1;
- }
- g_string_append(out, start);
-}
-
-#if 0
-int main(int argc, char **argv)
-{
- xmlDocPtr system;
- FilterPart *ff;
- GtkWidget *w;
- GnomeDialog *gd;
- xmlNodePtr node;
- 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);
-
- gd = (GnomeDialog *)gnome_dialog_new(_("Test"), GNOME_STOCK_BUTTON_OK, NULL);
- gtk_box_pack_start((GtkBox *)gd->vbox, w, FALSE, TRUE, 0);
- gtk_widget_show((GtkWidget *)gd);
-
- gnome_dialog_run_and_close(gd);
-
- 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 2995046b20..0000000000
--- a/filter/filter-part.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_PART_H
-#define _FILTER_PART_H
-
-#include <gtk/gtk.h>
-#include "filter-input.h"
-
-#define FILTER_PART(obj) GTK_CHECK_CAST (obj, filter_part_get_type (), FilterPart)
-#define FILTER_PART_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_part_get_type (), FilterPartClass)
-#define IS_FILTER_PART(obj) GTK_CHECK_TYPE (obj, filter_part_get_type ())
-
-typedef struct _FilterPart FilterPart;
-typedef struct _FilterPartClass FilterPartClass;
-
-struct _FilterPart {
- GtkObject parent;
- struct _FilterPartPrivate *priv;
-
- char *name;
- char *title;
- char *code;
- GList *elements;
-};
-
-struct _FilterPartClass {
- GtkObjectClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint filter_part_get_type (void);
-FilterPart *filter_part_new (void);
-
-/* methods */
-int filter_part_xml_create (FilterPart *ff, xmlNodePtr node);
-
-xmlNodePtr filter_part_xml_encode (FilterPart *fe);
-int filter_part_xml_decode (FilterPart *fe, xmlNodePtr node);
-
-FilterPart *filter_part_clone (FilterPart *fp);
-
-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 39012b9e54..0000000000
--- a/filter/filter-rule.c
+++ /dev/null
@@ -1,574 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include "filter-rule.h"
-#include "filter-context.h"
-
-#define d(x)
-
-static xmlNodePtr xml_encode(FilterRule *);
-static int xml_decode(FilterRule *, xmlNodePtr, RuleContext *);
-static void build_code(FilterRule *, GString *out);
-static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f);
-
-static void filter_rule_class_init (FilterRuleClass *class);
-static void filter_rule_init (FilterRule *gspaper);
-static void filter_rule_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((FilterRule *)(x))->priv)
-
-struct _FilterRulePrivate {
- GtkWidget *parts; /* where the parts are stored */
-};
-
-static GtkObjectClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-filter_rule_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "FilterRule",
- sizeof(FilterRule),
- sizeof(FilterRuleClass),
- (GtkClassInitFunc)filter_rule_class_init,
- (GtkObjectInitFunc)filter_rule_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(gtk_object_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-filter_rule_class_init (FilterRuleClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(gtk_object_get_type ());
-
- object_class->finalize = filter_rule_finalise;
-
- /* override methods */
- class->xml_encode = xml_encode;
- class->xml_decode = xml_decode;
- class->build_code = build_code;
- class->get_widget = get_widget;
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-filter_rule_init (FilterRule *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-unref_list(GList *l)
-{
- while (l) {
- gtk_object_unref((GtkObject *)l->data);
- l = g_list_next(l);
- }
-}
-
-static void
-filter_rule_finalise(GtkObject *obj)
-{
- FilterRule *o = (FilterRule *)obj;
-
- g_free(o->name);
- unref_list(o->parts);
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * filter_rule_new:
- *
- * Create a new FilterRule object.
- *
- * Return value: A new #FilterRule object.
- **/
-FilterRule *
-filter_rule_new(void)
-{
- FilterRule *o = (FilterRule *)gtk_type_new(filter_rule_get_type ());
- return o;
-}
-
-void filter_rule_set_name (FilterRule *fr, const char *name)
-{
- g_free(fr->name);
- fr->name = g_strdup(name);
-}
-
-xmlNodePtr filter_rule_xml_encode (FilterRule *fr)
-{
- return ((FilterRuleClass *)((GtkObject *)fr)->klass)->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->source) {
- case FILTER_SOURCE_INCOMING:
- xmlSetProp(node, "source", "incoming");
- break;
- case FILTER_SOURCE_DEMAND:
- xmlSetProp(node, "source", "ondemand");
- break;
- case FILTER_SOURCE_OUTGOING:
- xmlSetProp(node, "source", "outgoing");
- break;
- }
-
- 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 = g_list_next(l);
- }
- return node;
-}
-
-static void load_set(xmlNodePtr node, FilterRule *fr, RuleContext *f)
-{
- xmlNodePtr work;
- char *rulename;
- FilterPart *part;
-
- work = node->childs;
- 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 {
- g_warning("Unknwon xml node in part: %s", work->name);
- }
- work = work->next;
- }
-}
-
-int filter_rule_xml_decode (FilterRule *fr, xmlNodePtr node, RuleContext *f)
-{
- return ((FilterRuleClass *)((GtkObject *)fr)->klass)->xml_decode(fr, node, f);
-}
-
-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;
-
- /* FIXME: free source and grouping? */
- source = xmlGetProp (node, "source");
- if (!source) /*default to incoming*/
- fr->source = FILTER_SOURCE_INCOMING;
- else if (!strcmp (source, "outgoing"))
- fr->source = FILTER_SOURCE_OUTGOING;
- else if (!strcmp (source, "ondemand"))
- fr->source = FILTER_SOURCE_DEMAND;
- else if (!strcmp (source, "incoming"))
- fr->source = FILTER_SOURCE_INCOMING;
- else {
- g_warning ("Unknown filter source type \"%s\"", source);
- fr->source = FILTER_SOURCE_INCOMING;
- }
-
- work = node->childs;
- while (work) {
- if (!strcmp(work->name, "partset")) {
- load_set(work, fr, f);
- } else if (!strcmp(work->name, "title")) {
- if (!fr->name)
- fr->name = xmlNodeGetContent(work);
- }
- work = work->next;
- }
- return 0;
-}
-
-void filter_rule_add_part (FilterRule *fr, FilterPart *fp)
-{
- fr->parts = g_list_append(fr->parts, fp);
-}
-
-void filter_rule_remove_part (FilterRule *fr, FilterPart *fp)
-{
- fr->parts = g_list_remove(fr->parts, fp);
-}
-
-void filter_rule_replace_part(FilterRule *fr, FilterPart *fp, FilterPart *new)
-{
- GList *l;
-
- l = g_list_find(fr->parts, fp);
- if (l) {
- l->data = new;
- } else {
- fr->parts = g_list_append(fr->parts, new);
- }
-}
-
-void filter_rule_build_code (FilterRule *fr, GString *out)
-{
- return ((FilterRuleClass *)((GtkObject *)fr)->klass)->build_code(fr, out);
-}
-
-static void build_code(FilterRule *fr, GString *out)
-{
- 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");
-}
-
-
-static void
-match_all(GtkRadioButton *w, FilterRule *fr)
-{
- if (gtk_toggle_button_get_active((GtkToggleButton *)w))
- fr->grouping = FILTER_GROUP_ALL;
-}
-
-static void
-match_any(GtkRadioButton *w, FilterRule *fr)
-{
- if (gtk_toggle_button_get_active((GtkToggleButton *)w))
- fr->grouping = FILTER_GROUP_ANY;
-}
-
-struct _part_data {
- FilterRule *fr;
- RuleContext *f;
- FilterPart *part;
- GtkWidget *partwidget, *container;
-};
-
-static void option_activate(GtkMenuItem *item, struct _part_data *data)
-{
- FilterPart *part = gtk_object_get_data((GtkObject *)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((GtkContainer *)data->container, data->partwidget);
- newpart = filter_part_clone(part);
- filter_rule_replace_part(data->fr, data->part, newpart);
- gtk_object_unref((GtkObject *)data->part);
- data->part = newpart;
- data->partwidget = filter_part_get_widget(newpart);
- if (data->partwidget)
- gtk_box_pack_start((GtkBox *)data->container, data->partwidget, FALSE, FALSE, 0);
-}
-
-static GtkWidget *
-get_rule_part_widget(RuleContext *f, FilterPart *newpart, FilterRule *fr)
-{
- FilterPart *part = NULL;
- GtkMenu *menu;
- GtkMenuItem *item;
- GtkOptionMenu *omenu;
- GtkHBox *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 = (GtkHBox *)gtk_hbox_new(FALSE, 0);
- /* only set to automatically clean up the memory */
- gtk_object_set_data_full((GtkObject *)hbox, "data", data, g_free);
-
- p = filter_part_get_widget(newpart);
-
- data->partwidget = p;
- data->container = (GtkWidget *)hbox;
-
- menu = (GtkMenu *)gtk_menu_new();
- /* sigh, this is a little ugly */
- while ((part=rule_context_next_part(f, part))) {
- item = (GtkMenuItem *)gtk_menu_item_new_with_label(part->title);
- gtk_object_set_data((GtkObject *)item, "part", part);
- gtk_signal_connect((GtkObject *)item, "activate", option_activate, data);
- gtk_menu_append(menu, (GtkWidget *)item);
- gtk_widget_show((GtkWidget *)item);
- if (!strcmp(newpart->title, part->title)) {
- current = index;
- }
- index++;
- }
-
- omenu = (GtkOptionMenu *)gtk_option_menu_new();
- gtk_option_menu_set_menu(omenu, (GtkWidget *)menu);
- gtk_option_menu_set_history(omenu, current);
- gtk_widget_show((GtkWidget *)omenu);
-
- gtk_box_pack_start((GtkBox *)hbox, (GtkWidget *)omenu, FALSE, FALSE, 0);
- if (p) {
- gtk_box_pack_start((GtkBox *)hbox, p, FALSE, FALSE, 0);
- }
- gtk_widget_show_all((GtkWidget *)hbox);
-
- return (GtkWidget *)hbox;
-}
-
-struct _rule_data {
- FilterRule *fr;
- RuleContext *f;
- GtkWidget *parts;
-};
-
-static void
-less_parts(GtkWidget *button, struct _rule_data *data)
-{
- GList *l;
- FilterPart *part;
- GtkWidget *w;
-
- l = data->fr->parts;
- if (g_list_length(l) < 2)
- return;
-
- /* remove the last one from the list */
- l = g_list_last(l);
- part = l->data;
- filter_rule_remove_part(data->fr, part);
- gtk_object_unref((GtkObject *)part);
-
- /* and from the display */
- l = g_list_last(GTK_BOX(data->parts)->children);
- w = ((GtkBoxChild *)l->data)->widget;
- gtk_container_remove((GtkContainer *)data->parts, w);
-}
-
-static void
-more_parts(GtkWidget *button, struct _rule_data *data)
-{
- FilterPart *new;
- GtkWidget *w;
-
- /* create a new rule entry, use the first type of rule */
- new = rule_context_next_part(data->f, NULL);
- if (new) {
- new = filter_part_clone(new);
- filter_rule_add_part(data->fr, new);
- w = get_rule_part_widget(data->f, new, data->fr);
- gtk_box_pack_start((GtkBox *)data->parts, w, FALSE, FALSE, 0);
- }
-}
-
-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, struct _RuleContext *f)
-{
- return ((FilterRuleClass *)((GtkObject *)fr)->klass)->get_widget(fr, f);
-}
-
-static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f)
-{
- GtkVBox *vbox, *parts, *inframe;
- GtkHBox *hbox;
- GtkWidget *w;
- GtkRadioButton *g0, *g1;
- GtkFrame *frame;
- GtkEntry *name;
- GtkLabel *label;
- GList *l;
- FilterPart *part;
- struct _rule_data *data;
-
- /* this stuff should probably be a table, but the
- rule parts need to be a vbox */
- vbox = (GtkVBox *)gtk_vbox_new(FALSE, 3);
-
- label = (GtkLabel *)gtk_label_new("Name");
- name = (GtkEntry *)gtk_entry_new();
- if (fr->name)
- gtk_entry_set_text(name, fr->name);
- hbox = (GtkHBox *)gtk_hbox_new(FALSE, 3);
- gtk_box_pack_start((GtkBox *)hbox, (GtkWidget *)label, FALSE, FALSE, 0);
- gtk_box_pack_start((GtkBox *)hbox, (GtkWidget *)name, TRUE, TRUE, 0);
- gtk_box_pack_start((GtkBox *)vbox, (GtkWidget *)hbox, FALSE, FALSE, 3);
- gtk_signal_connect((GtkObject *)name, "changed", name_changed, fr);
-
- frame = (GtkFrame *)gtk_frame_new("Messages matching");
- inframe = (GtkVBox *)gtk_vbox_new(FALSE, 3);
- gtk_container_add((GtkContainer *)frame, (GtkWidget *)inframe);
-
- hbox = (GtkHBox *)gtk_hbox_new(FALSE, 3);
- g0 = (GtkRadioButton *)gtk_radio_button_new_with_label(NULL, "Match all parts");
- g1 = (GtkRadioButton *)gtk_radio_button_new_with_label(g0->group, "Match any part");
- if (fr->grouping == FILTER_GROUP_ALL) {
- gtk_toggle_button_set_active((GtkToggleButton *)g0, TRUE);
- } else {
- gtk_toggle_button_set_active((GtkToggleButton *)g1, TRUE);
- }
- gtk_box_pack_start((GtkBox *)hbox, (GtkWidget *)g0, FALSE, FALSE, 0);
- gtk_box_pack_start((GtkBox *)hbox, (GtkWidget *)g1, FALSE, FALSE, 0);
- gtk_box_pack_start((GtkBox *)inframe, (GtkWidget *)hbox, FALSE, FALSE, 3);
-
- gtk_signal_connect((GtkObject *)g0, "toggled", match_all, fr);
- gtk_signal_connect((GtkObject *)g1, "toggled", match_any, fr);
-
- /* this is the parts list, it should probably be inside a scrolling list */
- parts = (GtkVBox *)gtk_vbox_new(FALSE, 3);
-
- /* data for the parts part of the display */
- data = g_malloc0(sizeof(*data));
- data->f = f;
- data->fr = fr;
- data->parts = (GtkWidget *)parts;
-
- /* only set to automatically clean up the memory */
- gtk_object_set_data_full((GtkObject *)vbox, "data", data, g_free);
-
- l = fr->parts;
- while (l) {
- part = l->data;
- w = get_rule_part_widget(f, part, fr);
- gtk_box_pack_start((GtkBox *)parts, (GtkWidget *)w, FALSE, FALSE, 3);
- l = g_list_next(l);
- }
-
- gtk_box_pack_start((GtkBox *)inframe, (GtkWidget *)parts, FALSE, FALSE, 3);
-
- hbox = (GtkHBox *)gtk_hbox_new(FALSE, 3);
- w = gtk_button_new_with_label(_("Less"));
- gtk_signal_connect((GtkObject *)w, "clicked", less_parts, data);
- gtk_box_pack_end((GtkBox *)hbox, (GtkWidget *)w, FALSE, FALSE, 3);
- w = gtk_button_new_with_label(_("More"));
- gtk_signal_connect((GtkObject *)w, "clicked", more_parts, data);
- gtk_box_pack_end((GtkBox *)hbox, (GtkWidget *)w, FALSE, FALSE, 3);
- gtk_box_pack_start((GtkBox *)inframe, (GtkWidget *)hbox, FALSE, FALSE, 3);
-
- gtk_box_pack_start((GtkBox *)vbox, (GtkWidget *)frame, FALSE, FALSE, 3);
-
- gtk_widget_show_all((GtkWidget *)vbox);
- return (GtkWidget *)vbox;
-}
-
-FilterRule *filter_rule_next_list (GList *l, FilterRule *last)
-{
- GList *node = l;
-
- if (last != NULL) {
- node = g_list_find(node, last);
- if (node == NULL)
- node = l;
- else
- node = g_list_next(node);
- }
- if (node)
- return node->data;
- return NULL;
-}
-
-FilterRule *filter_rule_find_list (GList *l, const char *name)
-{
- while (l) {
- FilterRule *rule = l->data;
- if (!strcmp(rule->name, name))
- return rule;
- l = g_list_next(l);
- }
- return NULL;
-}
-
diff --git a/filter/filter-rule.h b/filter/filter-rule.h
deleted file mode 100644
index 425d0ac350..0000000000
--- a/filter/filter-rule.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _FILTER_RULE_H
-#define _FILTER_RULE_H
-
-#include <gtk/gtk.h>
-
-#include "filter-part.h"
-
-#define FILTER_RULE(obj) GTK_CHECK_CAST (obj, filter_rule_get_type (), FilterRule)
-#define FILTER_RULE_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_rule_get_type (), FilterRuleClass)
-#define IS_FILTER_RULE(obj) GTK_CHECK_TYPE (obj, filter_rule_get_type ())
-
-typedef struct _FilterRule FilterRule;
-typedef struct _FilterRuleClass FilterRuleClass;
-
-struct _RuleContext;
-
-enum _filter_grouping_t {
- FILTER_GROUP_ALL, /* all rules must match */
- FILTER_GROUP_ANY /* any rule must match */
-};
-
-enum _filter_source_t {
- FILTER_SOURCE_INCOMING, /* performed on incoming email */
- FILTER_SOURCE_DEMAND, /* performed on the selected folder
- * when the user asks for it */
- FILTER_SOURCE_OUTGOING /* performed on outgoing mail */
-};
-
-struct _FilterRule {
- GtkObject parent;
- struct _FilterRulePrivate *priv;
-
- char *name;
-
- enum _filter_grouping_t grouping;
- enum _filter_source_t source;
- GList *parts;
-};
-
-struct _FilterRuleClass {
- GtkObjectClass parent_class;
-
- /* virtual methods */
- xmlNodePtr (*xml_encode)(FilterRule *);
- int (*xml_decode)(FilterRule *, xmlNodePtr, struct _RuleContext *);
-
- void (*build_code)(FilterRule *, GString *out);
-
- GtkWidget *(*get_widget)(FilterRule *fr, struct _RuleContext *f);
-
- /* signals */
-};
-
-guint filter_rule_get_type (void);
-FilterRule *filter_rule_new (void);
-
-/* methods */
-void filter_rule_set_name (FilterRule *fr, const char *name);
-
-xmlNodePtr filter_rule_xml_encode (FilterRule *fr);
-int filter_rule_xml_decode (FilterRule *fr, xmlNodePtr node, struct _RuleContext *f);
-
-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);
-*/
-
-/* static functions */
-FilterRule *filter_rule_next_list (GList *l, FilterRule *last);
-FilterRule *filter_rule_find_list (GList *l, const char *name);
-
-#endif /* ! _FILTER_RULE_H */
-
diff --git a/filter/filter.glade b/filter/filter.glade
deleted file mode 100644
index 5f8a04d64e..0000000000
--- a/filter/filter.glade
+++ /dev/null
@@ -1,702 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Filter</name>
- <program_name>filter</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>edit_filter</name>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkOptionMenu</class>
- <name>filter_source</name>
- <can_focus>True</can_focus>
- <items>Incoming
-On Demand
-</items>
- <initial_choice>0</initial_choice>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame1</name>
- <label>Filter Rules</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <width>256</width>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkViewport</class>
- <name>viewport1</name>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkList</class>
- <name>rule_list</name>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkVButtonBox</class>
- <name>vbuttonbox1</name>
- <layout_style>GTK_BUTTONBOX_DEFAULT_STYLE</layout_style>
- <spacing>0</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>6</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>rule_add</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Add</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>rule_edit</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Edit</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>rule_delete</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Delete</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>rule_up</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_UP</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>rule_down</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_DOWN</stock_button>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-<widget>
- <class>GnomeDialog</class>
- <name>edit_vfolder</name>
- <title>Edit VFolders</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area2</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button13</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button15</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame2</name>
- <label>Virtual Folders</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow2</name>
- <width>256</width>
- <height>167</height>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkViewport</class>
- <name>viewport2</name>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkList</class>
- <name>rule_list</name>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkVButtonBox</class>
- <name>vbuttonbox2</name>
- <layout_style>GTK_BUTTONBOX_DEFAULT_STYLE</layout_style>
- <spacing>0</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>6</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>rule_add</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Add</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>rule_edit</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Edit</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>rule_delete</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Delete</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>rule_up</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_UP</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>rule_down</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_DOWN</stock_button>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-<widget>
- <class>GnomeDialog</class>
- <name>vfolder_source</name>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox3</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area3</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button16</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button17</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button18</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>vfolder_source_frame</name>
- <label>vFolder Sources</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox3</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow3</name>
- <width>256</width>
- <height>125</height>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkViewport</class>
- <name>viewport3</name>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkList</class>
- <name>source_list</name>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox3</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkVButtonBox</class>
- <name>vbuttonbox3</name>
- <layout_style>GTK_BUTTONBOX_DEFAULT_STYLE</layout_style>
- <spacing>0</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>6</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>source_add</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Add</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>source_remove</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Remove</label>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-<widget>
- <class>GnomeDialog</class>
- <name>vfolder_source</name>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox3</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area3</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button16</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button17</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button18</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>vfolder_source_frame</name>
- <label>vFolder Sources</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox3</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow3</name>
- <width>256</width>
- <height>125</height>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkViewport</class>
- <name>viewport3</name>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkList</class>
- <name>source_list</name>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox3</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkVButtonBox</class>
- <name>vbuttonbox3</name>
- <layout_style>GTK_BUTTONBOX_DEFAULT_STYLE</layout_style>
- <spacing>0</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>6</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>source_add</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Add</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>source_remove</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Remove</label>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/filter/filtertypes.xml b/filter/filtertypes.xml
deleted file mode 100644
index 0c38ce575c..0000000000
--- a/filter/filtertypes.xml
+++ /dev/null
@@ -1,177 +0,0 @@
-<?xml version="1.0"?>
-<filterdescription>
-<partset>
- <part name="sender">
- <title>Sender</title>
- <input type="optionlist" name="sender-type">
- <option value="contains">
- <title>contains</title>
- <code>(match-all (header-contains "From" ${sender}))</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(match-all (not (header-contains "From" ${sender})))</code>
- </option>
- </input>
- <input type="string" name="sender"/>
- </part>
- <part name="to">
- <title>Recipients</title>
- <input type="optionlist" name="recipient-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (or (header-contains "To" ${recipient})
- (header-contains "Cc" ${recipient})))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (or
- (header-contains "To" ${recipient})
- (header-contains "Cc" ${recipient}))))
- </code>
- </option>
- </input>
- <input type="address" name="recipient"/>
- </part>
- <part name="subject">
- <title>Subject</title>
- <input type="optionlist" name="subject-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (header-contains "Subject" ${subject}))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (header-contains "Subject" ${subject})))
- </code>
- </option>
- </input>
- <input type="string" name="subject"/>
- </part>
- <part name="body">
- <title>Message Body</title>
- <input type="optionlist" name="body-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (body-contains ${word})
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (not (body-contains "Subject" ${word}))
- </code>
- </option>
- </input>
- <input type="string" name="word"/>
- </part>
- <part name="sexp">
- <title>Expression</title>
- <input type="code" name="code"/>
- </part>
-
- <part name="sent-date">
- <title>Message was sent</title>
- <input type="optionlist" name="date-spec-type">
- <option value="before">
- <title>before</title>
- <code>
- (match-all (&lt; (get-sent-date) ${versus}))
- </code>
- </option>
- <option value="on-or-before">
- <title>on or before</title>
- <code>
- (match-all (not (&gt; (get-sent-date) ${versus})))
- </code>
- </option>
- <option value="after">
- <title>after</title>
- <code>
- (match-all (&gt; (get-sent-date) ${versus}))
- </code>
- </option>
- <option value="on-or-after">
- <title>on or after</title>
- <code>
- (match-all (not (&lt; (get-sent-date) ${versus})))
- </code>
- </option>
- </input>
- <input type="datespec" name="versus">
- </input>
- </part>
-
- <part name="recv-date">
- <title>Message was received</title>
- <input type="optionlist" name="date-spec-type">
- <option value="before">
- <title>before</title>
- <code>
- (match-all (&lt; (get-received-date) ${versus}))
- </code>
- </option>
- <option value="on-or-before">
- <title>on or before</title>
- <code>
- (match-all (not (&gt; (get-received-date) ${versus})))
- </code>
- </option>
- <option value="after">
- <title>after</title>
- <code>
- (match-all (&gt; (get-received-date) ${versus}))
- </code>
- </option>
- <option value="on-or-after">
- <title>on or after</title>
- <code>
- (match-all (not (&lt; (get-received-date) ${versus})))
- </code>
- </option>
- </input>
- <input type="datespec" name="versus">
- </input>
- </part>
-
-</partset>
-
-
-<actionset>
- <part name="copy-to-folder">
- <title>Copy to Folder</title>
- <code>(copy-to ${folder})</code>
- <input type="folder" name="folder"/>
- </part>
- <part name="forward-to">
- <title>Forward to address</title>
- <code>(forward-to ${address})</code>
- <input type="address" name="address"/>
- </part>
- <part name="delete">
- <title>Delete</title>
- <code>(delete)</code>
- </part>
- <part name="stop">
- <title>Stop processing</title>
- <code>(stop)</code>
- </part>
- <part name="colour">
- <title>Assign Colour</title>
- <code>(set-colour ${colour})</code>
- <input type="colour" name="colour"/>
- </part>
-</actionset>
-</filterdescription>
-
-
-
-
-
diff --git a/filter/rule-context.c b/filter/rule-context.c
deleted file mode 100644
index 653627a550..0000000000
--- a/filter/rule-context.c
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <errno.h>
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#include "rule-context.h"
-
-#define d(x) x
-
-static int load(RuleContext *f, const char *system, const char *user,
- RCRegisterFunc on_demand_cb, gpointer user_data);
-static int save(RuleContext *f, const char *user);
-
-static void rule_context_class_init (RuleContextClass *class);
-static void rule_context_init (RuleContext *gspaper);
-static void rule_context_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((RuleContext *)(x))->priv)
-
-struct _RuleContextPrivate {
-};
-
-static GtkObjectClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-rule_context_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "RuleContext",
- sizeof(RuleContext),
- sizeof(RuleContextClass),
- (GtkClassInitFunc)rule_context_class_init,
- (GtkObjectInitFunc)rule_context_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(gtk_object_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-rule_context_class_init (RuleContextClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(gtk_object_get_type ());
-
- object_class->finalize = rule_context_finalise;
-
- /* override methods */
- class->load = load;
- class->save = save;
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-rule_context_init (RuleContext *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-
- o->part_set_map = g_hash_table_new(g_str_hash, g_str_equal);
- o->rule_set_map = g_hash_table_new(g_str_hash, g_str_equal);
-}
-
-static void
-rule_context_finalise(GtkObject *obj)
-{
- RuleContext *o = (RuleContext *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * rule_context_new:
- *
- * Create a new RuleContext object.
- *
- * Return value: A new #RuleContext object.
- **/
-RuleContext *
-rule_context_new(void)
-{
- RuleContext *o = (RuleContext *)gtk_type_new(rule_context_get_type ());
- return o;
-}
-
-void rule_context_add_part_set(RuleContext *f, const char *setname, int part_type, RCPartFunc append, RCNextPartFunc next)
-{
- struct _part_set_map *map;
-
- map = g_malloc0(sizeof(*map));
- map->type = part_type;
- map->append = append;
- map->next = next;
- map->name = g_strdup(setname);
- g_hash_table_insert(f->part_set_map, map->name, map);
- f->part_set_list = g_list_append(f->part_set_list, map);
- d(printf("adding part set '%s'\n", setname));
-}
-
-void rule_context_add_rule_set(RuleContext *f, const char *setname, int rule_type, RCRuleFunc append, RCNextRuleFunc next)
-{
- struct _rule_set_map *map;
-
- map = g_malloc0(sizeof(*map));
- map->type = rule_type;
- map->append = append;
- map->next = next;
- map->name = g_strdup(setname);
- g_hash_table_insert(f->rule_set_map, map->name, map);
- f->rule_set_list = g_list_append(f->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 *f, char *error)
-{
- g_free(f->error);
- f->error = error;
-}
-
-/**
- * rule_context_load:
- * @f:
- * @system:
- * @user:
- * @on_demand_cb: An optional callback to allow UI registration of on-demand rules
- * @user_data: Extra data for the callback
- *
- * Load a rule context from a system and user description file.
- *
- * Return value:
- **/
-int rule_context_load(RuleContext *f, const char *system, const char *user,
- RCRegisterFunc on_demand_cb, gpointer user_data )
-{
- printf("rule_context: loading %s %s\n", system, user);
-
- return ((RuleContextClass *)((GtkObject *)f)->klass)->load(f, system, user,
- on_demand_cb,
- user_data);
-}
-
-static int load(RuleContext *f, const char *system, const char *user,
- RCRegisterFunc on_demand_cb, gpointer user_data)
-{
- xmlNodePtr set, rule;
- struct _part_set_map *part_map;
- struct _rule_set_map *rule_map;
-
- rule_context_set_error(f, NULL);
-
- d(printf("loading rules %s %s\n", system, user));
-
- f->system = xmlParseFile(system);
- if (f->system == NULL) {
- rule_context_set_error(f, g_strdup_printf("Unable to load system rules '%s': %s",
- system, strerror(errno)));
- return -1;
- }
- if (strcmp(f->system->root->name, "filterdescription")) {
- rule_context_set_error(f, g_strdup_printf("Unable to load system rules '%s': Invalid format",
- system));
- xmlFreeDoc(f->system);
- f->system = NULL;
- return -1;
- }
- /* doesn't matter if this doens't exist */
- f->user = xmlParseFile(user);
-
- /* now parse structure */
- /* get rule parts */
- set = f->system->root->childs;
- while (set) {
- d(printf("set name = %s\n", set->name));
- part_map = g_hash_table_lookup(f->part_set_map, set->name);
- if (part_map) {
- d(printf("loading parts ...\n"));
- rule = set->childs;
- while (rule) {
- if (!strcmp(rule->name, "part")) {
- FilterPart *part = FILTER_PART(gtk_type_new(part_map->type));
- if (filter_part_xml_create(part, rule) == 0) {
- part_map->append(f, part);
- } else {
- gtk_object_unref((GtkObject *)part);
- g_warning("Cannot load filter part");
- }
- }
- rule = rule->next;
- }
- }
- set = set->next;
- }
-
- /* now load actual rules */
- if (f->user) {
- set = f->user->root->childs;
- while (set) {
- d(printf("set name = %s\n", set->name));
- rule_map = g_hash_table_lookup(f->rule_set_map, set->name);
- if (rule_map) {
- d(printf("loading rules ...\n"));
- rule = set->childs;
- while (rule) {
- printf("checking node: %s\n", rule->name);
- if (!strcmp(rule->name, "rule")) {
- FilterRule *part = FILTER_RULE(gtk_type_new(rule_map->type));
- if (filter_rule_xml_decode(part, rule, f) == 0) {
- rule_map->append(f, part);
-
- if (on_demand_cb && part->source == FILTER_SOURCE_DEMAND)
- (on_demand_cb) (f, part, user_data);
- } else {
- gtk_object_unref((GtkObject *)part);
- g_warning("Cannot load filter part");
- }
- }
- rule = rule->next;
- }
- }
- set = set->next;
- }
- }
- return 0;
-}
-
-/**
- * rule_context_save:
- * @f:
- * @user:
- *
- * Save a rule context to disk.
- *
- * Return value:
- **/
-int rule_context_save(RuleContext *f, const char *user)
-{
- return ((RuleContextClass *)((GtkObject *)f)->klass)->save(f, user);
-}
-
-static int save(RuleContext *f, const char *user)
-{
- xmlDocPtr doc;
- xmlNodePtr root, rules, work;
- GList *l;
- FilterRule *rule;
- struct _rule_set_map *map;
-
- doc = xmlNewDoc("1.0");
- root = xmlNewDocNode(doc, NULL, "filteroptions", NULL);
- xmlDocSetRootElement(doc, root);
- l = f->rule_set_list;
- while (l) {
- map = l->data;
- rules = xmlNewDocNode(doc, NULL, map->name, NULL);
- xmlAddChild(root, rules);
- rule = NULL;
- while ( (rule = map->next(f, rule)) ) {
- d(printf("processing rule %s\n", rule->name));
- work = filter_rule_xml_encode(rule);
- xmlAddChild(rules, work);
- }
- l = g_list_next(l);
- }
- xmlSaveFile(user, doc);
- xmlFreeDoc(doc);
- return 0;
-}
-
-FilterPart *rule_context_find_part(RuleContext *f, const char *name)
-{
- d(printf("find part : "));
- return filter_part_find_list(f->parts, name);
-}
-
-FilterPart *rule_context_create_part(RuleContext *f, const char *name)
-{
- FilterPart *part;
-
- part = rule_context_find_part(f, name);
- if (part)
- part = filter_part_clone(part);
- return part;
-}
-
-FilterPart *rule_context_next_part(RuleContext *f, FilterPart *last)
-{
- return filter_part_next_list(f->parts, last);
-}
-
-FilterRule *rule_context_next_rule(RuleContext *f, FilterRule *last)
-{
- return filter_rule_next_list(f->rules, last);
-}
-
-FilterRule *rule_context_find_rule(RuleContext *f, const char *name)
-{
- return filter_rule_find_list(f->rules, name);
-}
-
-void rule_context_add_part(RuleContext *f, FilterPart *part)
-{
- f->parts = g_list_append(f->parts, part);
-}
-
-void rule_context_add_rule(RuleContext *f, FilterRule *new)
-{
- f->rules = g_list_append(f->rules, new);
-}
-
-static void
-new_rule_clicked(GtkWidget *w, int button, RuleContext *context)
-{
-#ifndef NO_WARNINGS
-#warning "Need a changed signal for this to work best"
-#endif
- if (button == 0) {
- FilterRule *rule = gtk_object_get_data((GtkObject *)w, "rule");
- char *user = gtk_object_get_data((GtkObject *)w, "path");
-
- gtk_object_ref((GtkObject *)rule);
- rule_context_add_rule(context, rule);
- if (user) {
- rule_context_save((RuleContext *)context, user);
- }
- }
- if (button != -1) {
- gnome_dialog_close((GnomeDialog *)w);
- }
-}
-
-/* add a rule, with a gui, asking for confirmation first ... optionally save to path */
-void rule_context_add_rule_gui(RuleContext *f, FilterRule *rule, const char *title, const char *path)
-{
- GtkWidget *w;
- GnomeDialog *gd;
-
- w = filter_rule_get_widget(rule, f);
- gd = (GnomeDialog *)gnome_dialog_new(title, GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL);
- gtk_box_pack_start((GtkBox *)gd->vbox, w, FALSE, TRUE, 0);
- gtk_widget_show((GtkWidget *)gd);
- gtk_object_set_data_full((GtkObject *)gd, "rule", rule, (GtkDestroyNotify)gtk_object_unref);
- if (path)
- gtk_object_set_data_full((GtkObject *)gd, "path", g_strdup(path), (GtkDestroyNotify)g_free);
- gtk_signal_connect((GtkObject *)gd, "clicked", new_rule_clicked, f);
- gtk_object_ref((GtkObject *)f);
- gtk_object_set_data_full((GtkObject *)gd, "context", f, (GtkDestroyNotify)gtk_object_unref);
- gtk_widget_show((GtkWidget *)gd);
-}
-
-void rule_context_remove_rule(RuleContext *f, FilterRule *rule)
-{
- f->rules = g_list_remove(f->rules, rule);
-}
-
-void rule_context_rank_rule(RuleContext *f, FilterRule *rule, int rank)
-{
- f->rules = g_list_remove(f->rules, rule);
- f->rules = g_list_insert(f->rules, rule, rank);
-}
-
-int rule_context_get_rank_rule(RuleContext *f, FilterRule *rule)
-{
- return g_list_index(f->rules, rule);
-}
-
-int
-rule_context_get_rank_rule_with_source(RuleContext *f, FilterRule *rule, enum _filter_source_t source)
-{
- int i;
- GList *iter;
-
- i = 0;
- for (iter = f->rules; iter; iter = iter->next) {
- if (iter->data == rule)
- return i;
- if (((FilterRule *)iter->data)->source == source)
- i++;
- }
-
- return -1;
-}
diff --git a/filter/rule-context.h b/filter/rule-context.h
deleted file mode 100644
index 27078adbcf..0000000000
--- a/filter/rule-context.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _RULE_CONTEXT_H
-#define _RULE_CONTEXT_H
-
-#include <gtk/gtk.h>
-#include <gnome-xml/parser.h>
-
-#include "filter-part.h"
-#include "filter-rule.h"
-
-#define RULE_CONTEXT(obj) GTK_CHECK_CAST (obj, rule_context_get_type (), RuleContext)
-#define RULE_CONTEXT_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, rule_context_get_type (), RuleContextClass)
-#define IS_RULE_CONTEXT(obj) GTK_CHECK_TYPE (obj, rule_context_get_type ())
-
-typedef struct _RuleContext RuleContext;
-typedef struct _RuleContextClass RuleContextClass;
-
-struct _RuleContext {
- GtkObject parent;
- struct _RuleContextPrivate *priv;
-
- char *error; /* string version of error */
-
- xmlDocPtr system; /* system rules source */
- xmlDocPtr user; /* user defined rules source */
-
- 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 *f, FilterRule *rule, gpointer data);
-
-struct _RuleContextClass {
- GtkObjectClass parent_class;
-
- /* virtual methods */
- int (*load)(RuleContext *f, const char *system, const char *user,
- RCRegisterFunc on_demand_cb, gpointer user_data);
- int (*save)(RuleContext *f, const char *user);
-
- /* signals */
-};
-
-typedef void (*RCPartFunc)(RuleContext *f, FilterPart *part);
-typedef void (*RCRuleFunc)(RuleContext *f, FilterRule *part);
-typedef FilterPart * (*RCNextPartFunc)(RuleContext *f, FilterPart *part);
-typedef FilterRule * (*RCNextRuleFunc)(RuleContext *f, FilterRule *rule);
-
-struct _part_set_map {
- char *name;
- int type;
- RCPartFunc append;
- RCNextPartFunc next;
-};
-
-struct _rule_set_map {
- char *name;
- int type;
- RCRuleFunc append;
- RCNextRuleFunc next;
-};
-
-guint rule_context_get_type (void);
-RuleContext *rule_context_new (void);
-
-/* methods */
-int rule_context_load(RuleContext *f, const char *system, const char *user,
- RCRegisterFunc on_demand_cb, gpointer user_data);
-int rule_context_save(RuleContext *f, const char *user);
-
-void rule_context_add_part(RuleContext *f, FilterPart *new);
-FilterPart *rule_context_find_part(RuleContext *f, const char *name);
-FilterPart *rule_context_create_part(RuleContext *f, const char *name);
-FilterPart *rule_context_next_part(RuleContext *f, FilterPart *last);
-
-FilterRule *rule_context_next_rule(RuleContext *f, FilterRule *last);
-FilterRule *rule_context_find_rule(RuleContext *f, const char *name);
-void rule_context_add_rule(RuleContext *f, FilterRule *new);
-void rule_context_add_rule_gui(RuleContext *f, FilterRule *rule, const char *title, const char *path);
-void rule_context_remove_rule(RuleContext *f, FilterRule *rule);
-
-/* get/set the rank (position) of a rule */
-void rule_context_rank_rule(RuleContext *f, FilterRule *rule, int rank);
-int rule_context_get_rank_rule(RuleContext *f, FilterRule *rule);
-int rule_context_get_rank_rule_with_source(RuleContext *f, FilterRule *rule, enum _filter_source_t source);
-
-void rule_context_delete_rule(RuleContext *f, FilterRule *rule);
-
-/* setup type for set parts */
-void rule_context_add_part_set(RuleContext *f, const char *setname, int part_type, RCPartFunc append, RCNextPartFunc next);
-void rule_context_add_rule_set(RuleContext *f, const char *setname, int rule_type, RCRuleFunc append, RCNextRuleFunc next);
-
-#endif /* ! _RULE_CONTEXT_H */
-
diff --git a/filter/score-context.c b/filter/score-context.c
deleted file mode 100644
index a171bd1240..0000000000
--- a/filter/score-context.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#include "score-context.h"
-#include "score-rule.h"
-
-static void score_context_class_init (ScoreContextClass *class);
-static void score_context_init (ScoreContext *gspaper);
-static void score_context_finalise (GtkObject *obj);
-
-static RuleContextClass *parent_class;
-
-guint
-score_context_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "ScoreContext",
- sizeof(ScoreContext),
- sizeof(ScoreContextClass),
- (GtkClassInitFunc)score_context_class_init,
- (GtkObjectInitFunc)score_context_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(rule_context_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-score_context_class_init (ScoreContextClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(rule_context_get_type ());
-
- object_class->finalize = score_context_finalise;
- /* override methods */
-
-}
-
-static void
-score_context_init (ScoreContext *o)
-{
- rule_context_add_part_set((RuleContext *)o, "partset", filter_part_get_type(),
- rule_context_add_part, rule_context_next_part);
-
- rule_context_add_rule_set((RuleContext *)o, "ruleset", score_rule_get_type(),
- rule_context_add_rule, rule_context_next_rule);
-}
-
-static void
-score_context_finalise(GtkObject *obj)
-{
- ScoreContext *o = (ScoreContext *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * score_context_new:
- *
- * Create a new ScoreContext object.
- *
- * Return value: A new #ScoreContext object.
- **/
-ScoreContext *
-score_context_new(void)
-{
- ScoreContext *o = (ScoreContext *)gtk_type_new(score_context_get_type ());
- return o;
-}
diff --git a/filter/score-context.h b/filter/score-context.h
deleted file mode 100644
index b89f70c1f8..0000000000
--- a/filter/score-context.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _SCORE_CONTEXT_H
-#define _SCORE_CONTEXT_H
-
-#include <gtk/gtk.h>
-
-#include "rule-context.h"
-
-#define SCORE_CONTEXT(obj) GTK_CHECK_CAST (obj, score_context_get_type (), ScoreContext)
-#define SCORE_CONTEXT_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, score_context_get_type (), ScoreContextClass)
-#define IS_SCORE_CONTEXT(obj) GTK_CHECK_TYPE (obj, score_context_get_type ())
-
-typedef struct _ScoreContext ScoreContext;
-typedef struct _ScoreContextClass ScoreContextClass;
-
-struct _ScoreContext {
- RuleContext parent;
-};
-
-struct _ScoreContextClass {
- RuleContextClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint score_context_get_type (void);
-ScoreContext *score_context_new (void);
-
-/* methods */
-
-#endif /* ! _SCORE_CONTEXT_H */
-
diff --git a/filter/score-editor.c b/filter/score-editor.c
deleted file mode 100644
index 6598cd9e33..0000000000
--- a/filter/score-editor.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-#include <glade/glade.h>
-
-#include "score-editor.h"
-#include "score-context.h"
-#include "score-rule.h"
-
-#define d(x)
-
-#if 0
-static void score_editor_class_init (ScoreEditorClass *class);
-static void score_editor_init (ScoreEditor *gspaper);
-
-static GnomeDialogClass *parent_class;
-
-guint
-score_editor_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "ScoreEditor",
- sizeof(ScoreEditor),
- sizeof(ScoreEditorClass),
- (GtkClassInitFunc)score_editor_class_init,
- (GtkObjectInitFunc)score_editor_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(gnome_dialog_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-score_editor_class_init (ScoreEditorClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(gnome_dialog_get_type ());
-
- /* override methods */
-
-}
-
-static void
-score_editor_init (ScoreEditor *o)
-{
-}
-
-/**
- * score_editor_new:
- *
- * Create a new ScoreEditor object.
- *
- * Return value: A new #ScoreEditor object.
- **/
-ScoreEditor *
-score_editor_new(void)
-{
- ScoreEditor *o = (ScoreEditor *)gtk_type_new(score_editor_get_type ());
- return o;
-}
-#endif
-
-
-enum {
- BUTTON_ADD,
- BUTTON_EDIT,
- BUTTON_DELETE,
- BUTTON_UP,
- BUTTON_DOWN,
- BUTTON_LAST
-};
-
-struct _editor_data {
- RuleContext *f;
- FilterRule *current;
- GtkList *list;
- GtkButton *buttons[BUTTON_LAST];
-};
-
-static void set_sensitive(struct _editor_data *data);
-
-static void rule_add(GtkWidget *widget, struct _editor_data *data)
-{
- ScoreRule *rule;
- int result;
- GnomeDialog *gd;
- GtkWidget *w;
- FilterPart *part;
-
- d(printf("add rule\n"));
- /* create a new rule with 1 match and 1 action */
- rule = score_rule_new();
-
- part = rule_context_next_part(data->f, NULL);
- filter_rule_add_part((FilterRule *)rule, filter_part_clone(part));
-
- w = filter_rule_get_widget((FilterRule *)rule, data->f);
- gd = (GnomeDialog *)gnome_dialog_new(_("Add Rule"),
- GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL,
- NULL);
- gtk_box_pack_start((GtkBox *)gd->vbox, w, FALSE, TRUE, 0);
- gtk_widget_show((GtkWidget *)gd);
- result = gnome_dialog_run_and_close(gd);
- if (result == 0) {
- GtkListItem *item = (GtkListItem *)gtk_list_item_new_with_label(((FilterRule *)rule)->name);
- GList *l = NULL;
-
- gtk_object_set_data((GtkObject *)item, "rule", rule);
- gtk_widget_show((GtkWidget *)item);
- l = g_list_append(l, item);
- gtk_list_append_items(data->list, l);
- gtk_list_select_child(data->list, (GtkWidget *)item);
- data->current = (FilterRule *)rule;
- rule_context_add_rule(data->f, (FilterRule *)rule);
- set_sensitive(data);
- } else {
- gtk_object_unref((GtkObject *)rule);
- }
-}
-
-static void rule_edit(GtkWidget *widget, struct _editor_data *data)
-{
- GtkWidget *w;
- int result;
- GnomeDialog *gd;
- FilterRule *rule;
- int pos;
-
- d(printf("edit rule\n"));
- rule = data->current;
- w = filter_rule_get_widget(rule, data->f);
- gd = (GnomeDialog *)gnome_dialog_new(_("Edit Score Rule"), GNOME_STOCK_BUTTON_OK, NULL);
- gtk_box_pack_start((GtkBox *)gd->vbox, w, FALSE, TRUE, 0);
- gtk_widget_show((GtkWidget *)gd);
- result = gnome_dialog_run_and_close(gd);
-
- if (result == 0) {
- pos = rule_context_get_rank_rule(data->f, data->current);
- if (pos != -1) {
- GtkListItem *item = g_list_nth_data(data->list->children, pos);
- gtk_label_set_text((GtkLabel *)(((GtkBin *)item)->child), data->current->name);
- }
- }
-}
-
-static void rule_delete(GtkWidget *widget, struct _editor_data *data)
-{
- int pos;
- GList *l;
- GtkListItem *item;
-
- d(printf("ddelete rule\n"));
- pos = rule_context_get_rank_rule(data->f, data->current);
- if (pos != -1) {
- rule_context_remove_rule(data->f, data->current);
-
- item = g_list_nth_data(data->list->children, pos);
- l = g_list_append(NULL, item);
- gtk_list_remove_items(data->list, l);
- g_list_free(l);
-
- gtk_object_unref((GtkObject *)data->current);
- data->current = NULL;
- }
- set_sensitive(data);
-}
-
-static void rule_move(struct _editor_data *data, int from, int to)
-{
- GList *l;
- GtkListItem *item;
-
- d(printf("moving %d to %d\n", from, to));
- rule_context_rank_rule(data->f, data->current, to);
-
- item = g_list_nth_data(data->list->children, from);
- l = g_list_append(NULL, item);
- gtk_list_remove_items_no_unref(data->list, l);
- gtk_list_insert_items(data->list, l, to);
- gtk_list_select_child(data->list, (GtkWidget *)item);
- set_sensitive(data);
-}
-
-static void rule_up(GtkWidget *widget, struct _editor_data *data)
-{
- int pos;
-
- d(printf("up rule\n"));
- pos = rule_context_get_rank_rule(data->f, data->current);
- if (pos>0) {
- rule_move(data, pos, pos-1);
- }
-}
-
-static void rule_down(GtkWidget *widget, struct _editor_data *data)
-{
- int pos;
-
- d(printf("down rule\n"));
- pos = rule_context_get_rank_rule(data->f, data->current);
- rule_move(data, pos, pos+1);
-}
-
-static struct {
- char *name;
- GtkSignalFunc func;
-} edit_buttons[] = {
- { "rule_add", rule_add },
- { "rule_edit", rule_edit },
- { "rule_delete", rule_delete },
- { "rule_up", rule_up },
- { "rule_down", rule_down },
-};
-
-static void
-set_sensitive(struct _editor_data *data)
-{
- FilterRule *rule = NULL;
- int index=-1, count=0;
-
- while ((rule = rule_context_next_rule(data->f, rule))) {
- if (rule == data->current)
- index=count;
- count++;
- }
- d(printf("index = %d count=%d\n", index, count));
- count--;
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_EDIT], index != -1);
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_DELETE], index != -1);
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_UP], index > 0);
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_DOWN], index >=0 && index<count);
-}
-
-static void
-select_rule(GtkWidget *w, GtkWidget *child, struct _editor_data *data)
-{
- data->current = gtk_object_get_data((GtkObject *)child, "rule");
- if (data->current)
- d(printf("seledct rule: %s\n", data->current->name));
- else
- d(printf("bad data?\n"));
- set_sensitive(data);
-}
-
-GtkWidget *score_editor_construct (struct _ScoreContext *f)
-{
- GladeXML *gui;
- GtkWidget *d, *w;
- GList *l;
- FilterRule *rule = NULL;
- struct _editor_data *data;
- int i;
-
- g_assert(IS_SCORE_CONTEXT(f));
-
- data = g_malloc0(sizeof(*data));
- data->f = (RuleContext *)f;
-
- gui = glade_xml_new(FILTER_GLADEDIR "/filter.glade", "edit_vfolder");
- d = glade_xml_get_widget (gui, "edit_vfolder");
- gtk_object_set_data_full((GtkObject *)d, "data", data, g_free);
-
- gtk_window_set_title((GtkWindow *)d, "Edit Score List");
- for (i=0;i<BUTTON_LAST;i++) {
- data->buttons[i] = (GtkButton *)w = glade_xml_get_widget (gui, edit_buttons[i].name);
- gtk_signal_connect((GtkObject *)w, "clicked", edit_buttons[i].func, data);
- }
-
- w = glade_xml_get_widget (gui, "rule_list");
- data->list = (GtkList *)w;
- l = NULL;
- while ((rule = rule_context_next_rule((RuleContext *)f, rule))) {
- GtkListItem *item = (GtkListItem *)gtk_list_item_new_with_label(rule->name);
- gtk_object_set_data((GtkObject *)item, "rule", rule);
- gtk_widget_show((GtkWidget *)item);
- l = g_list_append(l, item);
- }
- gtk_list_append_items(data->list, l);
- gtk_signal_connect((GtkObject *)w, "select_child", select_rule, data);
-
- set_sensitive(data);
- gtk_object_unref((GtkObject *)gui);
-
- return d;
-}
diff --git a/filter/score-editor.h b/filter/score-editor.h
deleted file mode 100644
index cb78d465f0..0000000000
--- a/filter/score-editor.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _SCORE_EDITOR_H
-#define _SCORE_EDITOR_H
-
-#include <gtk/gtk.h>
-#include <libgnomeui/gnome-dialog.h>
-
-#if 0
-/* NOTE: object stuff not used (yet?), this is just a holder file for a static factory */
-
-#define SCORE_EDITOR(obj) GTK_CHECK_CAST (obj, score_editor_get_type (), ScoreEditor)
-#define SCORE_EDITOR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, score_editor_get_type (), ScoreEditorClass)
-#define IS_SCORE_EDITOR(obj) GTK_CHECK_TYPE (obj, score_editor_get_type ())
-
-typedef struct _ScoreEditor ScoreEditor;
-typedef struct _ScoreEditorClass ScoreEditorClass;
-
-struct _ScoreEditor {
- GnomeDialog parent;
-};
-
-struct _ScoreEditorClass {
- GnomeDialogClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint score_editor_get_type (void);
-ScoreEditor *score_editor_new (void);
-#endif
-
-struct _ScoreContext;
-
-/* methods */
-GtkWidget *score_editor_construct (struct _ScoreContext *f);
-
-#endif /* ! _SCORE_EDITOR_H */
-
diff --git a/filter/score-rule.c b/filter/score-rule.c
deleted file mode 100644
index 8eb51b6821..0000000000
--- a/filter/score-rule.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#include "score-rule.h"
-
-static xmlNodePtr xml_encode(FilterRule *);
-static int xml_decode(FilterRule *, xmlNodePtr, struct _RuleContext *f);
-/*static void build_code(FilterRule *, GString *out);*/
-static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f);
-
-static void score_rule_class_init (ScoreRuleClass *class);
-static void score_rule_init (ScoreRule *gspaper);
-static void score_rule_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((ScoreRule *)(x))->priv)
-
-struct _ScoreRulePrivate {
-};
-
-static FilterRuleClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-score_rule_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "ScoreRule",
- sizeof(ScoreRule),
- sizeof(ScoreRuleClass),
- (GtkClassInitFunc)score_rule_class_init,
- (GtkObjectInitFunc)score_rule_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(filter_rule_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-score_rule_class_init (ScoreRuleClass *class)
-{
- GtkObjectClass *object_class;
- FilterRuleClass *rule_class = (FilterRuleClass *)class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(filter_rule_get_type ());
-
- object_class->finalize = score_rule_finalise;
-
- /* override methods */
- rule_class->xml_encode = xml_encode;
- rule_class->xml_decode = xml_decode;
-/* rule_class->build_code = build_code;*/
- rule_class->get_widget = get_widget;
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-score_rule_init (ScoreRule *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-score_rule_finalise(GtkObject *obj)
-{
- ScoreRule *o = (ScoreRule *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * score_rule_new:
- *
- * Create a new ScoreRule object.
- *
- * Return value: A new #ScoreRule object.
- **/
-ScoreRule *
-score_rule_new(void)
-{
- ScoreRule *o = (ScoreRule *)gtk_type_new(score_rule_get_type ());
- return o;
-}
-
-static xmlNodePtr xml_encode(FilterRule *fr)
-{
- ScoreRule *sr = (ScoreRule *)fr;
- xmlNodePtr node, value;
- char number[16];
-
- node = ((FilterRuleClass *)(parent_class))->xml_encode(fr);
- sprintf(number, "%d", sr->score);
- value = xmlNewNode(NULL, "score");
- xmlSetProp(value, "value", number);
- xmlAddChild(node, value);
- return node;
-}
-
-static int xml_decode(FilterRule *fr, xmlNodePtr node, struct _RuleContext *f)
-{
- ScoreRule *sr = (ScoreRule *)fr;
- xmlNodePtr value;
- int result;
- char *str;
-
- result = ((FilterRuleClass *)(parent_class))->xml_decode(fr, node, f);
- if (result != 0)
- return result;
- value = node->childs;
- while (value) {
- if (!strcmp(value->name, "score")) {
- str = xmlGetProp(value, "value");
- sscanf(str, "%d", &sr->score);
- }
- value = value->next;
- }
- return 0;
-}
-
-/*static void build_code(FilterRule *fr, GString *out)
-{
-}*/
-
-static void spin_changed(GtkAdjustment *adj, ScoreRule *sr)
-{
- sr->score = adj->value;
-}
-
-static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f)
-{
- GtkWidget *widget;
- GtkFrame *frame;
- GtkLabel *label;
- GtkHBox *hbox;
- GtkAdjustment *adj;
- ScoreRule *sr = (ScoreRule *)fr;
- GtkSpinButton *spin;
-
- widget = ((FilterRuleClass *)(parent_class))->get_widget(fr, f);
- frame = (GtkFrame *)gtk_frame_new("Score");
- hbox = (GtkHBox *)gtk_hbox_new(FALSE, 3);
- label = (GtkLabel *)gtk_label_new("Score");
- gtk_box_pack_start((GtkBox *)hbox, (GtkWidget *)label, FALSE, FALSE, 3);
- adj = (GtkAdjustment *)gtk_adjustment_new((float)sr->score, -100, 100, 1, 10, 10);
- gtk_signal_connect((GtkObject *)adj, "value_changed", spin_changed, sr);
- spin = (GtkSpinButton *)gtk_spin_button_new(adj, 1.0, 0);
- gtk_box_pack_start((GtkBox *)hbox, (GtkWidget *)spin, FALSE, FALSE, 3);
- gtk_container_add((GtkContainer *)frame, (GtkWidget *)hbox);
- gtk_widget_show_all((GtkWidget *)frame);
-
- gtk_box_pack_start((GtkBox *)widget, (GtkWidget *)frame, FALSE, FALSE, 3);
- return widget;
-}
diff --git a/filter/score-rule.h b/filter/score-rule.h
deleted file mode 100644
index 25607fd7c4..0000000000
--- a/filter/score-rule.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _SCORE_RULE_H
-#define _SCORE_RULE_H
-
-#include <gtk/gtk.h>
-
-#include "filter-rule.h"
-
-#define SCORE_RULE(obj) GTK_CHECK_CAST (obj, score_rule_get_type (), ScoreRule)
-#define SCORE_RULE_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, score_rule_get_type (), ScoreRuleClass)
-#define IS_SCORE_RULE(obj) GTK_CHECK_TYPE (obj, score_rule_get_type ())
-
-typedef struct _ScoreRule ScoreRule;
-typedef struct _ScoreRuleClass ScoreRuleClass;
-
-struct _ScoreRule {
- FilterRule parent;
- struct _ScoreRulePrivate *priv;
-
- int score;
-};
-
-struct _ScoreRuleClass {
- FilterRuleClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint score_rule_get_type (void);
-ScoreRule *score_rule_new (void);
-
-/* methods */
-
-#endif /* ! _SCORE_RULE_H */
-
diff --git a/filter/vfolder-context.c b/filter/vfolder-context.c
deleted file mode 100644
index 41453ea310..0000000000
--- a/filter/vfolder-context.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-
-#include "vfolder-context.h"
-#include "vfolder-rule.h"
-
-static void vfolder_context_class_init (VfolderContextClass *class);
-static void vfolder_context_init (VfolderContext *gspaper);
-static void vfolder_context_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((VfolderContext *)(x))->priv)
-
-struct _VfolderContextPrivate {
-};
-
-static RuleContextClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-vfolder_context_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "VfolderContext",
- sizeof(VfolderContext),
- sizeof(VfolderContextClass),
- (GtkClassInitFunc)vfolder_context_class_init,
- (GtkObjectInitFunc)vfolder_context_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(rule_context_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-vfolder_context_class_init (VfolderContextClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(rule_context_get_type ());
-
- object_class->finalize = vfolder_context_finalise;
- /* override methods */
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-vfolder_context_init (VfolderContext *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-
- rule_context_add_part_set((RuleContext *)o, "partset", filter_part_get_type(),
- rule_context_add_part, rule_context_next_part);
-
- rule_context_add_rule_set((RuleContext *)o, "ruleset", vfolder_rule_get_type(),
- rule_context_add_rule, rule_context_next_rule);
-}
-
-static void
-vfolder_context_finalise(GtkObject *obj)
-{
- VfolderContext *o = (VfolderContext *)obj;
-
- o = o;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * vfolder_context_new:
- *
- * Create a new VfolderContext object.
- *
- * Return value: A new #VfolderContext object.
- **/
-VfolderContext *
-vfolder_context_new(void)
-{
- VfolderContext *o = (VfolderContext *)gtk_type_new(vfolder_context_get_type ());
- return o;
-}
diff --git a/filter/vfolder-context.h b/filter/vfolder-context.h
deleted file mode 100644
index 0bf1b5aaf2..0000000000
--- a/filter/vfolder-context.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _VFOLDER_CONTEXT_H
-#define _VFOLDER_CONTEXT_H
-
-#include <gtk/gtk.h>
-
-#include "rule-context.h"
-
-#define VFOLDER_CONTEXT(obj) GTK_CHECK_CAST (obj, vfolder_context_get_type (), VfolderContext)
-#define VFOLDER_CONTEXT_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, vfolder_context_get_type (), VfolderContextClass)
-#define IS_VFOLDER_CONTEXT(obj) GTK_CHECK_TYPE (obj, vfolder_context_get_type ())
-
-typedef struct _VfolderContext VfolderContext;
-typedef struct _VfolderContextClass VfolderContextClass;
-
-struct _VfolderContext {
- RuleContext parent;
- struct _VfolderContextPrivate *priv;
-
-};
-
-struct _VfolderContextClass {
- RuleContextClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint vfolder_context_get_type (void);
-VfolderContext *vfolder_context_new (void);
-
-/* methods */
-
-#endif /* ! _VFOLDER_CONTEXT_H */
-
diff --git a/filter/vfolder-editor.c b/filter/vfolder-editor.c
deleted file mode 100644
index c5bf378625..0000000000
--- a/filter/vfolder-editor.c
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-#include <glade/glade.h>
-
-#include "vfolder-editor.h"
-#include "vfolder-context.h"
-#include "vfolder-rule.h"
-
-#define d(x)
-
-#if 0
-static void vfolder_editor_class_init (VfolderEditorClass *class);
-static void vfolder_editor_init (VfolderEditor *gspaper);
-static void vfolder_editor_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((VfolderEditor *)(x))->priv)
-
-struct _VfolderEditorPrivate {
-};
-
-static GnomeDialogClass *parent_class;
-
-enum {
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-guint
-vfolder_editor_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "VfolderEditor",
- sizeof(VfolderEditor),
- sizeof(VfolderEditorClass),
- (GtkClassInitFunc)vfolder_editor_class_init,
- (GtkObjectInitFunc)vfolder_editor_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(gnome_dialog_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-vfolder_editor_class_init (VfolderEditorClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(gnome_dialog_get_type ());
-
- object_class->finalize = vfolder_editor_finalise;
- /* override methods */
-
- /* signals */
-
- gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
-}
-
-static void
-vfolder_editor_init (VfolderEditor *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-vfolder_editor_finalise(GtkObject *obj)
-{
- VfolderEditor *o = (VfolderEditor *)obj;
-
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * vfolder_editor_new:
- *
- * Create a new VfolderEditor object.
- *
- * Return value: A new #VfolderEditor object.
- **/
-VfolderEditor *
-vfolder_editor_new(void)
-{
- VfolderEditor *o = (VfolderEditor *)gtk_type_new(vfolder_editor_get_type ());
- return o;
-}
-#endif
-
-
-
-enum {
- BUTTON_ADD,
- BUTTON_EDIT,
- BUTTON_DELETE,
- BUTTON_UP,
- BUTTON_DOWN,
- BUTTON_LAST
-};
-
-struct _editor_data {
- RuleContext *f;
- FilterRule *current;
- GtkList *list;
- GtkButton *buttons[BUTTON_LAST];
-};
-
-static void set_sensitive(struct _editor_data *data);
-
-static void rule_add(GtkWidget *widget, struct _editor_data *data)
-{
- FilterRule *rule;
- int result;
- GnomeDialog *gd;
- GtkWidget *w;
- FilterPart *part;
-
- d(printf("add rule\n"));
- /* create a new rule with 1 match and 1 action */
- rule = (FilterRule *) vfolder_rule_new();
-
- part = rule_context_next_part(data->f, NULL);
- filter_rule_add_part(rule, filter_part_clone(part));
-
- w = filter_rule_get_widget(rule, data->f);
- gd = (GnomeDialog *)gnome_dialog_new(_("Add Rule"),
- GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL,
- NULL);
- gtk_box_pack_start((GtkBox *)gd->vbox, w, FALSE, TRUE, 0);
- gtk_widget_show((GtkWidget *)gd);
- result = gnome_dialog_run_and_close(gd);
- if (result == 0) {
- GtkListItem *item = (GtkListItem *)gtk_list_item_new_with_label(rule->name);
- GList *l = NULL;
-
- gtk_object_set_data((GtkObject *)item, "rule", rule);
- gtk_widget_show((GtkWidget *)item);
- l = g_list_append(l, item);
- gtk_list_append_items(data->list, l);
- gtk_list_select_child(data->list, (GtkWidget *)item);
- data->current = rule;
- rule_context_add_rule(data->f, rule);
- set_sensitive(data);
- } else {
- gtk_object_unref((GtkObject *)rule);
- }
-}
-
-static void rule_edit(GtkWidget *widget, struct _editor_data *data)
-{
- GtkWidget *w;
- int result;
- GnomeDialog *gd;
- FilterRule *rule;
- int pos;
-
- d(printf("edit rule\n"));
- rule = data->current;
- w = filter_rule_get_widget(rule, data->f);
- gd = (GnomeDialog *)gnome_dialog_new(_("Edit VFolder Rule"), GNOME_STOCK_BUTTON_OK, NULL);
- gtk_box_pack_start((GtkBox *)gd->vbox, w, FALSE, TRUE, 0);
- gtk_widget_show((GtkWidget *)gd);
- result = gnome_dialog_run_and_close(gd);
-
- if (result == 0) {
- pos = rule_context_get_rank_rule(data->f, data->current);
- if (pos != -1) {
- GtkListItem *item = g_list_nth_data(data->list->children, pos);
- gtk_label_set_text((GtkLabel *)(((GtkBin *)item)->child), data->current->name);
- }
- }
-}
-
-static void rule_delete(GtkWidget *widget, struct _editor_data *data)
-{
- int pos;
- GList *l;
- GtkListItem *item;
-
- d(printf("ddelete rule\n"));
- pos = rule_context_get_rank_rule(data->f, data->current);
- if (pos != -1) {
- rule_context_remove_rule(data->f, data->current);
-
- item = g_list_nth_data(data->list->children, pos);
- l = g_list_append(NULL, item);
- gtk_list_remove_items(data->list, l);
- g_list_free(l);
-
- gtk_object_unref((GtkObject *)data->current);
- data->current = NULL;
- }
- set_sensitive(data);
-}
-
-static void rule_move(struct _editor_data *data, int from, int to)
-{
- GList *l;
- GtkListItem *item;
-
- d(printf("moving %d to %d\n", from, to));
- rule_context_rank_rule(data->f, data->current, to);
-
- item = g_list_nth_data(data->list->children, from);
- l = g_list_append(NULL, item);
- gtk_list_remove_items_no_unref(data->list, l);
- gtk_list_insert_items(data->list, l, to);
- gtk_list_select_child(data->list, (GtkWidget *)item);
- set_sensitive(data);
-}
-
-static void rule_up(GtkWidget *widget, struct _editor_data *data)
-{
- int pos;
-
- d(printf("up rule\n"));
- pos = rule_context_get_rank_rule(data->f, data->current);
- if (pos>0) {
- rule_move(data, pos, pos-1);
- }
-}
-
-static void rule_down(GtkWidget *widget, struct _editor_data *data)
-{
- int pos;
-
- d(printf("down rule\n"));
- pos = rule_context_get_rank_rule(data->f, data->current);
- rule_move(data, pos, pos+1);
-}
-
-static struct {
- char *name;
- GtkSignalFunc func;
-} edit_buttons[] = {
- { "rule_add", rule_add },
- { "rule_edit", rule_edit },
- { "rule_delete", rule_delete },
- { "rule_up", rule_up },
- { "rule_down", rule_down },
-};
-
-static void
-set_sensitive(struct _editor_data *data)
-{
- FilterRule *rule = NULL;
- int index=-1, count=0;
-
- while ((rule = rule_context_next_rule(data->f, rule))) {
- if (rule == data->current)
- index=count;
- count++;
- }
- d(printf("index = %d count=%d\n", index, count));
- count--;
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_EDIT], index != -1);
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_DELETE], index != -1);
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_UP], index > 0);
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_DOWN], index >=0 && index<count);
-}
-
-static void
-select_rule(GtkWidget *w, GtkWidget *child, struct _editor_data *data)
-{
- data->current = gtk_object_get_data((GtkObject *)child, "rule");
- if (data->current)
- d(printf("seledct rule: %s\n", data->current->name));
- else
- d(printf("bad data?\n"));
- set_sensitive(data);
-}
-
-GtkWidget *vfolder_editor_construct (struct _VfolderContext *f)
-{
- GladeXML *gui;
- GtkWidget *d, *w;
- GList *l;
- FilterRule *rule = NULL;
- struct _editor_data *data;
- int i;
-
- g_assert(IS_VFOLDER_CONTEXT(f));
-
- data = g_malloc0(sizeof(*data));
- data->f = (RuleContext *)f;
-
- gui = glade_xml_new(FILTER_GLADEDIR "/filter.glade", "edit_vfolder");
- d = glade_xml_get_widget (gui, "edit_vfolder");
- gtk_object_set_data_full((GtkObject *)d, "data", data, g_free);
-
- gtk_window_set_title((GtkWindow *)d, "Edit VFolders");
- for (i=0;i<BUTTON_LAST;i++) {
- data->buttons[i] = (GtkButton *)w = glade_xml_get_widget (gui, edit_buttons[i].name);
- gtk_signal_connect((GtkObject *)w, "clicked", edit_buttons[i].func, data);
- }
-
- w = glade_xml_get_widget (gui, "rule_list");
- data->list = (GtkList *)w;
- l = NULL;
- while ((rule = rule_context_next_rule((RuleContext *)f, rule))) {
- GtkListItem *item = (GtkListItem *)gtk_list_item_new_with_label(rule->name);
- gtk_object_set_data((GtkObject *)item, "rule", rule);
- gtk_widget_show((GtkWidget *)item);
- l = g_list_append(l, item);
- }
- gtk_list_append_items(data->list, l);
- gtk_signal_connect((GtkObject *)w, "select_child", select_rule, data);
-
- set_sensitive(data);
- gtk_object_unref((GtkObject *)gui);
-
- return d;
-}
diff --git a/filter/vfolder-editor.h b/filter/vfolder-editor.h
deleted file mode 100644
index 2ff2b261dc..0000000000
--- a/filter/vfolder-editor.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _VFOLDER_EDITOR_H
-#define _VFOLDER_EDITOR_H
-
-#include <gtk/gtk.h>
-#include <libgnomeui/gnome-dialog.h>
-
-#if 0
-/* NOTE: object stuff not used (yet?), this is just a holder file for a static factory */
-
-#define VFOLDER_EDITOR(obj) GTK_CHECK_CAST (obj, vfolder_editor_get_type (), VfolderEditor)
-#define VFOLDER_EDITOR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, vfolder_editor_get_type (), VfolderEditorClass)
-#define IS_VFOLDER_EDITOR(obj) GTK_CHECK_TYPE (obj, vfolder_editor_get_type ())
-
-typedef struct _VfolderEditor VfolderEditor;
-typedef struct _VfolderEditorClass VfolderEditorClass;
-
-struct _VfolderEditor {
- GnomeDialog parent;
- struct _VfolderEditorPrivate *priv;
-
-};
-
-struct _VfolderEditorClass {
- GnomeDialogClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint vfolder_editor_get_type (void);
-VfolderEditor *vfolder_editor_new (void);
-#endif
-
-struct _VfolderContext;
-
-/* methods */
-GtkWidget *vfolder_editor_construct (struct _VfolderContext *f);
-
-#endif /* ! _VFOLDER_EDITOR_H */
-
diff --git a/filter/vfolder-rule.c b/filter/vfolder-rule.c
deleted file mode 100644
index d6da471b07..0000000000
--- a/filter/vfolder-rule.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <gtk/gtk.h>
-#include <gnome.h>
-#include <glade/glade.h>
-
-#include "vfolder-context.h"
-#include "vfolder-rule.h"
-#include "shell/evolution-shell-client.h"
-
-#define d(x) x
-
-static xmlNodePtr xml_encode(FilterRule *);
-static int xml_decode(FilterRule *, xmlNodePtr, struct _RuleContext *f);
-/*static void build_code(FilterRule *, GString *out);*/
-static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f);
-
-extern EvolutionShellClient *global_shell_client;
-
-static void vfolder_rule_class_init (VfolderRuleClass *class);
-static void vfolder_rule_init (VfolderRule *gspaper);
-static void vfolder_rule_finalise (GtkObject *obj);
-
-#define _PRIVATE(x) (((VfolderRule *)(x))->priv)
-
-struct _VfolderRulePrivate {
-};
-
-static FilterRuleClass *parent_class;
-
-guint
-vfolder_rule_get_type (void)
-{
- static guint type = 0;
-
- if (!type) {
- GtkTypeInfo type_info = {
- "VfolderRule",
- sizeof(VfolderRule),
- sizeof(VfolderRuleClass),
- (GtkClassInitFunc)vfolder_rule_class_init,
- (GtkObjectInitFunc)vfolder_rule_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL
- };
-
- type = gtk_type_unique(filter_rule_get_type (), &type_info);
- }
-
- return type;
-}
-
-static void
-vfolder_rule_class_init (VfolderRuleClass *class)
-{
- GtkObjectClass *object_class;
- FilterRuleClass *filter_rule = (FilterRuleClass *)class;
-
- object_class = (GtkObjectClass *)class;
- parent_class = gtk_type_class(filter_rule_get_type ());
-
- object_class->finalize = vfolder_rule_finalise;
-
- /* override methods */
- filter_rule->xml_encode = xml_encode;
- filter_rule->xml_decode = xml_decode;
- /*filter_rule->build_code = build_code;*/
- filter_rule->get_widget = get_widget;
-}
-
-static void
-vfolder_rule_init (VfolderRule *o)
-{
- o->priv = g_malloc0(sizeof(*o->priv));
-}
-
-static void
-vfolder_rule_finalise(GtkObject *obj)
-{
- VfolderRule *o = (VfolderRule *)obj;
- o = o;
- ((GtkObjectClass *)(parent_class))->finalize(obj);
-}
-
-/**
- * vfolder_rule_new:
- *
- * Create a new VfolderRule object.
- *
- * Return value: A new #VfolderRule object.
- **/
-VfolderRule *
-vfolder_rule_new(void)
-{
- VfolderRule *o = (VfolderRule *)gtk_type_new(vfolder_rule_get_type ());
- return o;
-}
-
-void vfolder_rule_add_source (VfolderRule *vr, const char *uri)
-{
- g_assert(IS_VFOLDER_RULE(vr));
-
- vr->sources = g_list_append(vr->sources, g_strdup(uri));
-}
-
-const char *vfolder_rule_find_source (VfolderRule *vr, const char *uri)
-{
- GList *l;
-
- g_assert(IS_VFOLDER_RULE(vr));
-
- /* only does a simple string or address comparison, should
- probably do a decoded url comparison */
- l = vr->sources;
- while (l) {
- if (l->data == uri || !strcmp(l->data, uri))
- return l->data;
- l = g_list_next(l);
- }
- return NULL;
-}
-
-void vfolder_rule_remove_source (VfolderRule *vr, const char *uri)
-{
- char *found;
-
- g_assert(IS_VFOLDER_RULE(vr));
-
- found = (char *)vfolder_rule_find_source(vr, uri);
- if (found) {
- vr->sources = g_list_remove(vr->sources, found);
- g_free(found);
- }
-}
-
-const char *vfolder_rule_next_source (VfolderRule *vr, const char *last)
-{
- GList *node;
-
- if (last == NULL) {
- node = vr->sources;
- } else {
- node = g_list_find(vr->sources, (char *)last);
- if (node == NULL)
- node = vr->sources;
- else
- node = g_list_next(node);
- }
- if (node)
- return (const char *)node->data;
- return NULL;
-}
-
-static xmlNodePtr xml_encode(FilterRule *fr)
-{
- xmlNodePtr node, set, work;
- GList *l;
- VfolderRule *vr = (VfolderRule *)fr;
-
- node = ((FilterRuleClass *)(parent_class))->xml_encode(fr);
- g_assert(node != NULL);
- set = xmlNewNode(NULL, "sources");
- xmlAddChild(node, set);
- l = vr->sources;
- while (l) {
- work = xmlNewNode(NULL, "folder");
- xmlSetProp(work, "uri", l->data);
- xmlAddChild(set, work);
- l = g_list_next(l);
- }
- return node;
-}
-
-static int xml_decode(FilterRule *fr, xmlNodePtr node, struct _RuleContext *f)
-{
- xmlNodePtr set, work;
- int result;
- VfolderRule *vr = (VfolderRule *)fr;
- char *uri;
-
- result = ((FilterRuleClass *)(parent_class))->xml_decode(fr, node, f);
- if (result != 0)
- return result;
-
- set = node->childs;
- while (set) {
- if (!strcmp(set->name, "sources")) {
- work = set->childs;
- while (work) {
- if (!strcmp(work->name, "folder")) {
- uri = xmlGetProp(work, "uri");
- if (uri)
- vr->sources = g_list_append(vr->sources, uri);
- }
- work = work->next;
- }
- }
- set = set->next;
- }
- return 0;
-}
-
-enum {
- BUTTON_ADD,
- BUTTON_REMOVE,
- BUTTON_LAST,
-};
-
-struct _source_data {
- RuleContext *f;
- VfolderRule *vr;
- const char *current;
- GtkList *list;
- GtkButton *buttons[BUTTON_LAST];
-};
-
-static void source_add(GtkWidget *widget, struct _source_data *data);
-static void source_remove(GtkWidget *widget, struct _source_data *data);
-
-static struct {
- char *name;
- GtkSignalFunc func;
-} edit_buttons[] = {
- { "source_add", source_add },
- { "source_remove", source_remove },
-};
-
-static void
-set_sensitive(struct _source_data *data)
-{
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_ADD], TRUE);
- gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_REMOVE], data->current != NULL);
-}
-
-static void
-select_source(GtkWidget *w, GtkWidget *child, struct _source_data *data)
-{
- data->current = gtk_object_get_data((GtkObject *)child, "source");
- set_sensitive(data);
-}
-
-static void source_add(GtkWidget *widget, struct _source_data *data)
-{
- const char *allowed_types[] = { "mail", NULL };
- char *def, *uri;
- GtkListItem *item;
- GList *l;
-
- def = "";
- evolution_shell_client_user_select_folder (global_shell_client,
- _("Select Folder"),
- def, allowed_types, NULL, &uri);
-
- if (uri != NULL && uri[0] != '\0') {
- data->vr->sources = g_list_append(data->vr->sources, uri);
-
- l = NULL;
- item = (GtkListItem *)gtk_list_item_new_with_label(uri);
- gtk_object_set_data((GtkObject *)item, "source", uri);
- gtk_widget_show((GtkWidget *)item);
- l = g_list_append(NULL, item);
- gtk_list_append_items(data->list, l);
- gtk_list_select_child(data->list, (GtkWidget *)item);
- data->current = uri;
- } else {
- g_free(uri);
- }
- set_sensitive(data);
-}
-
-static void source_remove(GtkWidget *widget, struct _source_data *data)
-{
- const char *source;
- int index = 0;
- GList *l;
- GtkListItem *item;
-
- source = NULL;
- while ((source = vfolder_rule_next_source(data->vr, source))) {
- if (data->current == source) {
- vfolder_rule_remove_source(data->vr, source);
- item = g_list_nth_data(data->list->children, index);
- l = g_list_append(NULL, item);
- gtk_list_remove_items(data->list, l);
- g_list_free(l);
- data->current = NULL;
- break;
- }
- index++;
- }
- set_sensitive(data);
-}
-
-static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f)
-{
- GtkWidget *widget, *frame, *w;
- GladeXML *gui;
- const char *source;
- VfolderRule *vr = (VfolderRule *)fr;
- struct _source_data *data;
- int i;
- GList *l;
-
- widget = ((FilterRuleClass *)(parent_class))->get_widget(fr, f);
-
- data = g_malloc0(sizeof(*data));
- data->f = f;
- data->vr = vr;
-
- gui = glade_xml_new(FILTER_GLADEDIR "/filter.glade", "vfolder_source_frame");
- frame = glade_xml_get_widget (gui, "vfolder_source_frame");
-
- gtk_object_set_data_full((GtkObject *)frame, "data", data, g_free);
-
- for (i=0;i<BUTTON_LAST;i++) {
- data->buttons[i] = (GtkButton *)w = glade_xml_get_widget (gui, edit_buttons[i].name);
- gtk_signal_connect((GtkObject *)w, "clicked", edit_buttons[i].func, data);
- }
-
- w = glade_xml_get_widget (gui, "source_list");
- data->list = (GtkList *)w;
- l = NULL;
- source = NULL;
- while ((source = vfolder_rule_next_source(vr, source))) {
- GtkListItem *item = (GtkListItem *)gtk_list_item_new_with_label(source);
- gtk_object_set_data((GtkObject *)item, "source", (void *)source);
- gtk_widget_show((GtkWidget *)item);
- l = g_list_append(l, item);
- }
- gtk_list_append_items(data->list, l);
- gtk_signal_connect((GtkObject *)w, "select_child", select_source, data);
- set_sensitive(data);
-
- gtk_box_pack_start(GTK_BOX(widget), frame, TRUE, TRUE, 3);
- return widget;
-}
diff --git a/filter/vfolder-rule.h b/filter/vfolder-rule.h
deleted file mode 100644
index c3fa130c84..0000000000
--- a/filter/vfolder-rule.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- *
- * This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _VFOLDER_RULE_H
-#define _VFOLDER_RULE_H
-
-#include <gtk/gtk.h>
-#include "filter-rule.h"
-
-#define VFOLDER_RULE(obj) GTK_CHECK_CAST (obj, vfolder_rule_get_type (), VfolderRule)
-#define VFOLDER_RULE_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, vfolder_rule_get_type (), VfolderRuleClass)
-#define IS_VFOLDER_RULE(obj) GTK_CHECK_TYPE (obj, vfolder_rule_get_type ())
-
-typedef struct _VfolderRule VfolderRule;
-typedef struct _VfolderRuleClass VfolderRuleClass;
-
-struct _VfolderRule {
- FilterRule parent;
- struct _VfolderRulePrivate *priv;
-
- GList *sources; /* uri's of the source folders */
-};
-
-struct _VfolderRuleClass {
- FilterRuleClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-guint vfolder_rule_get_type (void);
-VfolderRule *vfolder_rule_new (void);
-
-/* methods */
-void vfolder_rule_add_source (VfolderRule *vr, const char *uri);
-void vfolder_rule_remove_source (VfolderRule *vr, const char *uri);
-const char *vfolder_rule_find_source (VfolderRule *vr, const char *uri);
-const char *vfolder_rule_next_source (VfolderRule *vr, const char *last);
-
-#endif /* ! _VFOLDER_RULE_H */
-
diff --git a/filter/vfoldertypes.xml b/filter/vfoldertypes.xml
deleted file mode 100644
index 52c2c0e8ca..0000000000
--- a/filter/vfoldertypes.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0"?>
-<filterdescription>
-<partset>
- <part name="sender">
- <title>Sender</title>
- <input type="optionlist" name="sender-type">
- <option value="contains">
- <title>contains</title>
- <code>(match-all (header-contains "From" ${sender}))</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(match-all (not (header-contains "From" ${sender})))</code>
- </option>
- </input>
- <input type="string" name="sender"/>
- </part>
- <part name="to">
- <title>Recipients</title>
- <input type="optionlist" name="recipient-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (or (header-contains "To" ${recipient})
- (header-contains "Cc" ${recipient})))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (or
- (header-contains "To" ${recipient})
- (header-contains "Cc" ${recipient}))))
- </code>
- </option>
- </input>
- <input type="address" name="recipient"/>
- </part>
- <part name="subject">
- <title>Subject</title>
- <input type="optionlist" name="subject-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (header-contains "Subject" ${subject}))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (header-contains "Subject" ${subject})))
- </code>
- </option>
- </input>
- <input type="string" name="subject"/>
- </part>
- <part name="body">
- <title>Message Body</title>
- <input type="optionlist" name="body-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (body-contains ${word})
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (not (body-contains "Subject" ${word}))
- </code>
- </option>
- </input>
- <input type="string" name="word"/>
- </part>
- <part name="sexp">
- <title>Expression</title>
- <input type="code" name="code"/>
- </part>
-
- <part name="sent-date">
- <title>Message was sent</title>
- <input type="optionlist" name="date-spec-type">
- <option value="before">
- <title>before</title>
- <code>
- (match-all (&lt; (get-sent-date) ${versus}))
- </code>
- </option>
- <option value="on-or-before">
- <title>on or before</title>
- <code>
- (match-all (not (&gt; (get-sent-date) ${versus})))
- </code>
- </option>
- <option value="after">
- <title>after</title>
- <code>
- (match-all (&gt; (get-sent-date) ${versus}))
- </code>
- </option>
- <option value="on-or-after">
- <title>on or after</title>
- <code>
- (match-all (not (&lt; (get-sent-date) ${versus})))
- </code>
- </option>
- </input>
- <input type="datespec" name="versus">
- </input>
- </part>
-
- <part name="recv-date">
- <title>Message was received</title>
- <input type="optionlist" name="date-spec-type">
- <option value="before">
- <title>before</title>
- <code>
- (match-all (&lt; (get-received-date) ${versus}))
- </code>
- </option>
- <option value="on-or-before">
- <title>on or before</title>
- <code>
- (match-all (not (&gt; (get-received-date) ${versus})))
- </code>
- </option>
- <option value="after">
- <title>after</title>
- <code>
- (match-all (&gt; (get-received-date) ${versus}))
- </code>
- </option>
- <option value="on-or-after">
- <title>on or after</title>
- <code>
- (match-all (not (&lt; (get-received-date) ${versus})))
- </code>
- </option>
- </input>
- <input type="datespec" name="versus">
- </input>
- </part>
-</partset>
-</filterdescription>
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 cba1534920..0000000000
--- a/help/C/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-Makefile.in
-evolution-guide
-evolution-guide.junk
diff --git a/help/C/Makefile.am b/help/C/Makefile.am
deleted file mode 100644
index 0d02ac056f..0000000000
--- a/help/C/Makefile.am
+++ /dev/null
@@ -1,51 +0,0 @@
-evolution_helpdir = $(datadir)/gnome/help/evolution/C
-
-SGML_FILES = \
- apx-authors.sgml \
- apx-bugs.sgml \
- apx-fdl.sgml \
- apx-gloss.sgml \
- config-prefs.sgml \
- config-setupassist.sgml \
- config-sync.sgml \
- evolution-guide.sgml \
- preface.sgml \
- usage-calendar.sgml \
- usage-contact.sgml \
- usage-mail.sgml \
- usage-mainwindow.sgml \
- usage-sync.sgml
-
-
-EXTRA_DIST = \
- $(SGML_FILES)
-
-all: evolution-guide
-
-evolution-guide: $(SGML_FILES)
- -db2html evolution-guide.sgml
-
-dist-hook:
- mkdir $(distdir)/evolution-guide
- -cp evolution-guide/*.html evolution-guide/*.css \
- $(distdir)/evolution-guide
- mkdir $(distdir)/fig
- -cp fig/*.png $(distdir)/fig
-
-install-data-local: evolution-guide
- $(top_srcdir)/mkinstalldirs $(DESTDIR)$(evolution_helpdir)/fig
- -for file in $(srcdir)/evolution-guide/*.html $(srcdir)/evolution-guide/*.css; do \
- basefile=`basename $$file`; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(evolution_helpdir)/$$basefile; \
- done
- -for file in $(srcdir)/fig/*.png; do \
- basefile=`basename $$file`; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(evolution_helpdir)/fig/$$basefile; \
- done
-
-evolution.ps: evolution.sgml
- -db2ps $<
-
-evolution.rtf: evolution.sgml
- -db2rtf $<
-
diff --git a/help/C/apx-authors.sgml b/help/C/apx-authors.sgml
deleted file mode 100644
index e064276be3..0000000000
--- a/help/C/apx-authors.sgml
+++ /dev/null
@@ -1,74 +0,0 @@
-
- <appendix id="authors">
- <title>Authors</title>
- <para>
- <application>Evolution</application> was written by:
-<simplelist>
- <member>Seth Alves: <email>alves@helixcode.com</email></member>
- <member>Anders Carlsson<email>andersca@gnu.org</email></member>
- <member>Damon Chaplin:<email>damon@helixcode.com</email></member>
- <member>Clifford R. Conover <email>rusty@zootweb.com</email></member>
- <member>Miguel De Icaza: <email>miguel@helixcode.com</email></member>
- <member>Arturo Espinoza <email>arturo@nucleu.unam.mx</email></member>
- <member>Larry Ewing: <email>lewing@helixcode.com</email></member>
- <member>Bertrand Guiheneuf: <email>bertrand@helixcode.com</email></member>
- <member>Tuomas Kuosmanen: <email>tigert@gimp.org</email></member>
- <member>Christopher J. Lahey: <email>clahey@helixcode.com</email></member>
- <member>Matthew Loper: <email>matt@helixcode.com</email></member>
- <member> Federico Mena: <email>federico@helixcode.com</email></member>
- <member>Eskil Heyn Olsen<email>deity@eski.dk</email></member>
- <member> Nat Friedman: <email>nat@helixcode.com</email></member>
- <member>Ettore Perazzoli:<email>ettore@helixcode.com</email></member>
- <member>Russell Steinthal: <email>rms39@columbia.edu</email></member>
- <member> Peter Teichman: <email>peter@helixcode.com</email></member>
- <member> Chris Toshok: <email>toshok@helixcode.com</email></member>
- <member> Radek Doulik: <email>rodo@helixcode.com</email></member>
- <member> Dan Winship: <email>danw@helixcode.com</email></member>
- <member> Michael Zucchi: <email>notzed@helixcode.com</email></member>
-</simplelist>
-and other dedicated GNOME programmers.
-</para>
- <para>
- 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.
- </para>
-
- <para>
- For more information please visit the
- <application>Evolution</application> <ulink
- url="http://www.helixcode.com/apps/evolution.php3"
- type="http">Web page</ulink>. Please send all comments,
- suggestions, and bug reports to the <ulink
- url="http://bugs.gnome.org" type="http">GNOME bug tracking
- database</ulink>. Instructions for submitting bug reports can be
- found on-line at <ulink
- url="http://bugs.gnome.org/Reporting.html" type="http">
- http://bugs.gnome.org/Reporting.html</ulink>. You can also use
- command <command>bug-buddy</command> for submitting bug reports.
- </para>
- <para>
- This manual was written by Aaron Weber
- (<email>aaron@helixcode.com</email>) and Kevin Breit
- (<email>battery841@mypad.com</email>) with the help of the
- application programmers and the GNOME Documentation Project.
- Please send all comments and suggestions regarding the manual to
- the GNOME Documentation Project at
- <email>docs@gnome.org</email>. You can also add your comments
- online by using <ulink type="http"
- url="http://www.gnome.org/gdp/doctable/">GNOME Documentation
- Status Table</ulink>.
- </para>
- <!-- For translations: uncomment this: <para> Latin translation
- was done by ME (<email>MYNAME@MYADDRESS</email>). Please send
- all comments and suggestions regarding this translation to
- SOMEWHERE. </para> -->
- </appendix>
-
-
-
-
-
diff --git a/help/C/apx-bugs.sgml b/help/C/apx-bugs.sgml
deleted file mode 100644
index e7a501acba..0000000000
--- a/help/C/apx-bugs.sgml
+++ /dev/null
@@ -1,19 +0,0 @@
- <appendix id="bugs">
-
- <title>Known bugs and limitations</title>
- <abstract>
- <para>
- This appendix describes known bugs and limitations of
- <application>Evolution</application>. Please use the GNOME
- <application>Bug Report Tool</application> (known as
- <command>bug-buddy</command> at the command line) if you find one
- we have not listed.
- </para>
- </abstract>
-
- <para>
- The bugs are many, but the application is young, and this is to
- be expected.
- </para>
- </appendix>
-
diff --git a/help/C/apx-fdl.sgml b/help/C/apx-fdl.sgml
deleted file mode 100644
index 8b49729cfc..0000000000
--- a/help/C/apx-fdl.sgml
+++ /dev/null
@@ -1,678 +0,0 @@
-<appendix id="fdl">
- <title>GNU Free Documentation License</title>
- <para>
- Version 1.1, March 2000
- </para>
-
- <para>
- Copyright &copy; 2000
- <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>
-
- <variablelist>
- <varlistentry id="fdl-preamble">
- <term>0. PREAMBLE</term>
- <listitem>
- <para>
- 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.
- </para>
-
- <para>
- 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.
- </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>
- </listitem>
- </varlistentry>
- <varlistentry id="fdl-section1">
- <term>1. APPLICABILITY AND DEFINITIONS</term>
- <listitem>
- <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 <link
- linkend="fdl-document">"Document" </link>, below, refers to any such
- manual or work. Any member of the public is a licensee, and is
- addressed as "you".
- </para>
-
- <para id="fdl-modified">
- A <link linkend="fdl-modified">"Modified Version"</link> 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 <link linkend="fdl-secondary">"Secondary Section"</link> 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 <link
- linkend="fdl-document"> Document</link> to the <link
- linkend="fdl-document"> Document's</link> overall subject (or to
- related matters) and contains nothing that could fall directly within
- that overall subject. (For example, if the <link
- linkend="fdl-document">Document</link> is in part a textbook of
- mathematics, a <link linkend="fdl-secondary">Secondary Section</link>
- 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 <link linkend="fdl-invariant">"Invariant Sections"</link> are
- certain <link linkend="fdl-secondary"> Secondary Sections</link> whose
- titles are designated, as being those of <link
- linkend="fdl-invariant">Invariant Sections</link>, 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 <link linkend="fdl-cover-texts">"Cover Texts"</link> are certain
- short passages of text that are listed, as <link
- linkend="fdl-cover-texts">Front-Cover Texts</link> or <link
- linkend="fdl-cover-texts">Back-Cover Texts</link>, in the notice that
- says that the <link linkend="fdl-document">Document</link> is released
- under this License.
- </para>
-
- <para id="fdl-transparent">
- A <link linkend="fdl-transparent">"Transparent"</link> 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 <link
- linkend="fdl-transparent"> Transparent</link> file format whose markup
- has been designed to thwart or discourage subsequent modification by
- readers is not <link linkend="fdl-transparent">Transparent</link>. A
- copy that is not <link linkend="fdl-transparent">"Transparent"</link>
- is called "Opaque".
- </para>
-
- <para>
- Examples of suitable formats for <link
- linkend="fdl-transparent">Transparent</link> 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 <link linkend="fdl-title-page">"Title Page"</link> 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, <link linkend="fdl-title-page"> "Title Page"</link>
- means the text near the most prominent appearance of the work's title,
- preceding the beginning of the body of the text.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section2">
- <term>2. VERBATIM COPYING</term>
- <listitem>
- <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 <link linkend="fdl-document">Document</link> 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>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section3">
- <term>3. COPYING IN QUANTITY</term>
- <listitem>
- <para>
- If you publish printed copies of the <link
- linkend="fdl-document">Document</link> numbering more than 100, and
- the <link linkend="fdl-document">Document's</link> 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 <link linkend="fdl-cover-texts">Cover Texts</link>: 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
- <link linkend="fdl-transparent">Opaque</link> copy, or state in or
- with each <link linkend="fdl-transparent">Opaque</link> copy a
- publicly-accessible computer-network location containing a complete
- <link linkend="fdl-transparent"> Transparent</link> copy of the <link
- linkend="fdl-document">Document</link>, 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 <link linkend="fdl-transparent">Opaque</link> copies
- in quantity, to ensure that this <link
- linkend="fdl-transparent">Transparent</link> copy will remain thus
- accessible at the stated location until at least one year after the
- last time you distribute an <link
- linkend="fdl-transparent">Opaque</link> 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 <link
- linkend="fdl-document">Document</link>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section4">
- <term>4. MODIFICATIONS</term>
- <listitem>
- <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 <link linkend="fdl-modified">Modified Version</link> under
- precisely this License, with the <link linkend="fdl-modified">Modified
- Version</link> filling the role of the <link
- linkend="fdl-document">Document</link>, thus licensing distribution
- and modification of the <link linkend="fdl-modified">Modified
- Version</link> to whoever possesses a copy of it. In addition, you
- must do these things in the <link linkend="fdl-modified">Modified
- Version</link>:
- </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 <link
- linkend="fdl-document">Document</link>). 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 "History", 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 "History" in the
- <link linkend="fdl-document">Document</link>, create one stating
- the title, year, authors, and publisher of the <link
- linkend="fdl-document">Document</link> as given on its <link
- linkend="fdl-title-page">Title Page</link>, then add an item
- describing the <link linkend="fdl-modified">Modified
- Version</link> 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
- <link linkend="fdl-document">Document</link>, and likewise the
- network locations given in the <link
- linkend="fdl-document">Document</link> 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 <link
- linkend="fdl-document">Document</link> 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 "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.
- </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 "Endorsements". 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 "Endorsements" 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 <link linkend="fdl-modified">Modified
- Version's</link> license notice. These titles must be distinct from
- any other section titles.
- </para>
-
- <para>
- You may add a section entitled "Endorsements", 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
- <link linkend="fdl-cover-texts">Front-Cover Text</link> and one of
- <link linkend="fdl-cover-texts">Back-Cover Text</link> 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>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section5">
- <term>5. COMBINING DOCUMENTS</term>
- <listitem>
- <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 <link
- linkend="fdl-invariant">Invariant Sections</link> 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 <link linkend="fdl-invariant"> Invariant Sections</link> 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 <link linkend="fdl-invariant">Invariant Sections</link> in the
- license notice of the combined work.
- </para>
-
- <para>
- 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."
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section6">
- <term>6. COLLECTIONS OF DOCUMENTS</term>
- <listitem>
- <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
- 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.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section7">
- <term>7. AGGREGATION WITH INDEPENDENT WORKS</term>
- <listitem>
- <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 <link linkend="fdl-document"> Document</link>,
- 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 <link
- linkend="fdl-document">Document</link> , on account of their being
- thus compiled, if they are not themselves derivative works of the
- <link linkend="fdl-document">Document</link>. 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 <link linkend="fdl-document">Document</link>, then if the <link
- linkend="fdl-document">Document</link> is less than one quarter of the
- entire aggregate, the <link linkend="fdl-document">Document's</link>
- <link linkend="fdl-cover-texts">Cover Texts</link> may be placed on
- covers that surround only the <link
- linkend="fdl-document">Document</link> within the aggregate. Otherwise
- they must appear on covers around the whole aggregate.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section8">
- <term>8. TRANSLATION</term>
- <listitem>
- <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 <link
- linkend="fdl-invariant">Invariant Sections</link> in addition to the
- original versions of these <link linkend="fdl-invariant">Invariant
- Sections</link>. 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>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section9">
- <term>9. TERMINATION</term>
- <listitem>
- <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 <link linkend="fdl-document">Document</link> 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>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-section10">
- <term>10. FUTURE REVISIONS OF THIS LICENSE</term>
- <listitem>
- <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 "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 <link linkend="fdl-document">Document</link> 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>
- </listitem>
- </varlistentry>
-
- <varlistentry id="fdl-using">
- <term>Addendum</term>
- <listitem>
- <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>
-
- <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>
-
- <para>
- If you have no <link linkend="fdl-invariant">Invariant
- Sections</link>, write "with no Invariant Sections" instead of saying
- which ones are invariant. If you have no <link
- linkend="fdl-cover-texts">Front-Cover Texts</link>, write "no
- Front-Cover Texts" instead of "Front-Cover Texts being LIST"; 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>
- </listitem>
- </varlistentry>
- </variablelist>
-</appendix> \ No newline at end of file
diff --git a/help/C/apx-gloss.sgml b/help/C/apx-gloss.sgml
deleted file mode 100644
index 55ab3ed8a1..0000000000
--- a/help/C/apx-gloss.sgml
+++ /dev/null
@@ -1,284 +0,0 @@
-<glossary id="glossary">
-
- <title>Glossary</title>
-
- <glossentry id="attachment">
- <glossterm>Attachment</glossterm>
- <glossdef>
- <para>
- Any file sent along with an email. Attachments may be embedded in
- a message or appended to it.
- </para>
- </glossdef>
- </glossentry>
-
-<glossentry id="automatic-indexing">
- <glossterm>Automatic Indexing</glossterm>
- <glossdef>
- <para>
- Pre-sorting procedure that allows
- <application>Evolution</application> to refer to data quickly.
- It enables faster searches and decreases memory usage for
- data displays.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="bcc">
- <glossterm>Bcc (Blind Carbon Copy)</glossterm>
- <glossdef>
- <para>
- A way of addressing a message. Bcc is used to send a group of
- people an e-mail, while hiding their names and addresses from each
- other.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="cc">
- <glossterm>Cc (Carbon Copy)</glossterm>
- <glossdef>
- <para>
- Carbon-copies are used to send a 3rd party a copy of the e-mail,
- so they an keep up to date on a conversation, without being in the
- To: list.
- </para>
- </glossdef>
- </glossentry>
-
-<!-- Removed pending decision on names
- <glossentry id="druid">
- <glossterm>Druid</glossterm>
- <glossdef>
- <para>
- A small program or script used to help configure or set up some
- larger program. The <application>mail setup druid</application>
- helps you ready your email system for use. Druids are the Linux
- equivalent of "Assistants" and "Wizards."
- </para>
- </glossdef>
- </glossentry>
--->
-<glossentry id="emoticon">
- <glossterm>Emoticon</glossterm>
- <glossdef>
- <para>
- Also called smileys, emoticons are the little sideways faces made
- of colons and parentheses which people use to convey emotion in email.
- Examples: :-) or ;( .
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="evolution">
- <glossterm>Evolution</glossterm>
- <glossdef>
- <para>
- <application>Evolution</application> is the <acronym> GNOME
- </acronym> 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. <application>Evolution</application> 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.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="filter">
- <glossterm>Filter</glossterm>
- <glossdef>
- <para>
- Within <application>Evolution</application>, a filter is a method
- of sorting mail automatically. 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>
- the user can send a third party a message
- which was sent to the user originally.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="groupware">
- <glossterm>Groupware</glossterm>
- <glossdef>
- <para>
- Groupware is a term describing an application which helps groups
- of people work together. Typically, a groupware application will
- have several productivity features built into one program.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="haiku">
- <glossterm>Haiku</glossterm>
- <glossdef>
- <para>
- A Japanese form of poetry. Haiku are unrhymed, and
- three lines long. The first and last lines should have five
- syllables, and the second line seven syllables. The subject
- matter is traditionally related to the seasons.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="html">
- <glossterm>HTML</glossterm>
- <glossdef>
- <para>
- Hyper-text Markup Language(<acronym>HTML</acronym>) is the layout
- language which all webpages are written in. HTML can be used
- inside of e-mails to insert images, justfiy text different ways,
- and even include webpages inside the e-mail itself.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="hot-key">
- <glossterm>Hot Key</glossterm>
- <glossdef>
- <para>
- Hot-keys are keyboard combinations used to do actions on a
- computer instead of using the mouse to do the same action.
- Hot-keys can speed up computer usage.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="ical">
- <glossterm>iCal</glossterm>
- <glossdef>
- <para>
- <application>iCal</application> is the program which
- <application>Evolution</application> uses to manage the calendar
- section.
- </para>
- </glossdef>
- </glossentry>
-
-
- <glossentry id="ldap">
- <glossterm>LDAP</glossterm>
- <glossdef>
- <para>
- LDAP is a protocol which allows a client to search through a large database
- of addresses, phone numbers, and people, as an alternative to a physical
- phone book.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="mail-client">
- <glossterm>Mail Client</glossterm>
- <glossdef>
- <para>
- A mail client is 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="nautilus">
- <glossterm>Nautilus</glossterm>
- <glossdef>
- <para>
- <application>Nautilus</application> is the next generation file
- manager for <acronym>GNOME</acronym> being written by Eazel.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="nickname">
- <glossterm>Nickname</glossterm>
- <glossdef>
- <para>
- An alias for an e-mail address.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="script">
- <glossterm>Script</glossterm>
- <glossdef>
- <para>
- A program which is written in an interpreted language, which can
- be executed.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="shortcut-bar">
- <glossterm>Shortcut Bar</glossterm>
- <glossdef>
- <para>
- The <interface>Shortcut Bar</interface> is where the user accesses
- all the components of <application>Evolution</application> from.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="signature">
- <glossterm>Signature</glossterm>
- <glossdef>
- <para>
- Signatures allow a user to specify a message to place at the bottom of
- every email sent. A signature can be anything from a favorite quote to
- a link to a webpage.
- </para>
- </glossdef>
- </glossentry>
-
-
- <glossentry id="spam">
- <glossterm>Spam</glossterm>
- <glossdef>
- <para>
- Spam: useless, unwanted e-mail. Spam normally comes in forms of
- chain-letters and advertisements for unscrupulous websites or
- services. Messages that are merely useless are called
- "opt-in newsletters."
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="vfolder">
- <glossterm>vFolder</glossterm>
- <glossdef>
- <para>
- vFolders allow an e-mail to be shared among multiple folders, so
- it appears that theres a copy of the e-mail in each folder.
- </para>
- </glossdef>
- </glossentry>
-
-</glossary>
diff --git a/help/C/apx-gpl.sgml b/help/C/apx-gpl.sgml
deleted file mode 100644
index 7c7e4cd0f7..0000000000
--- a/help/C/apx-gpl.sgml
+++ /dev/null
@@ -1,414 +0,0 @@
-<appendix id="gpl">
- <title>GNU GENERAL PUBLIC LICENSE</title>
- <subtitle>Version 2, June 1991</subtitle>
-
-
-<para>
-
- 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.
-</para>
-<sect1>
-<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: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-</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>
-<title> GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</title>
-<para>
- 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".
-</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>
-<para>
- 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.
-</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>
-<para>
- 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:
-</para>
-<para>
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-</para>
-<para>
- 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.
-</para>
-<para>
- 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.)
-</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>
-<para>
- 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:
-</para>
-<para>
- 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,
-</para>
-<para>
- 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,
-</para>
-<para>
- 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.)
-</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>
-<para>
- 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.
-</para>
-<para>
- 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.
-</para>
-<para>
- 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.
-</para>
-<para>
- 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.
-</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>
-<para>
- 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.
-</para>
-<para>
- 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.
-</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>
-<para>
- 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.
-</para>
-</sect1>
-<sect1>
-<title>NO WARRANTY</title>
-<para>
- 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.
-</para>
-<para>
- 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.
-</para>
-<para>
- END OF TERMS AND CONDITIONS
-</para>
-</sect1>
- <sect1>
- <title>How to Apply These Terms to Your New Programs</title>
-<para>
- 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.
-</para>
-<para>
- 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.
-</para>
-<para>
- &lt;one line to give the program's name and a brief idea of what it does.&gt;
-Copyright (C) &lt; year&gt; &lt;name of author&gt;
-</para>
-<para>
- 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.
-</para>
-<para>
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-</para>
-<para>
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-</para>
-<para>
-
-Also add information on how to contact you by electronic and paper mail.
-</para>
-<para>
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-</para>
-<para>
- 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.
-</para>
-<para>
-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.
-</para>
-<para>
-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:
-</para>
-<para>
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-</para>
-<para>
- &lt;signature of Ty Coon&gt;, 1 April 1989
- Ty Coon, President of Vice
-</para>
-<para>
-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.
-</para>
-</sect1>
-</appendix>
-
-
-
-
-
-
-
-
-
diff --git a/help/C/config-prefs.sgml b/help/C/config-prefs.sgml
deleted file mode 100644
index e0f6dd0297..0000000000
--- a/help/C/config-prefs.sgml
+++ /dev/null
@@ -1,570 +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, first go to your
- <interface>Inbox</interface>. Then select <guimenuitem>Mail
- Settings</guimenuitem> from the <guimenu>Tools</guimenu> menu.
- 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>Identity</guilabel></term>
- <listitem>
- <para>
- This allows you to set
- your name, email address, and other information. The
- default values are the ones found on your system account.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Sources</guilabel></term>
- <listitem>
- <para>
- Set your mail-checking protocols and servers here.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Sources</guilabel></term>
- <listitem>
- <para>
- Set your mail-checking protocols and servers here.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>News Servers</guilabel></term>
- <listitem>
- <para>
- Specify your News Server preferences here.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
-<!-- THE FOLLOWING MAY BE REINSTATED:
- as well as attachment
- and HTML handling, forwarding behavior, filters, and
- other <application>Evolution</application> behaviors
- specific to email. The default behaviors are those
- approved by Jamie Zawinski.
--->
-
-
- </para>
-
- <!-- ==============Figure===================== -->
- <figure id="config-prefs-mail-fig">
- <title>Preferences Dialog</title>
- <screenshot>
- <screeninfo>Setting mail preferences</screeninfo>
- <graphic fileref="fig/config-mail" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
- <!-- ==============End of Figure================-->
-
-
- <sect2 id="config-prefs-mail-identity">
- <title>Identity Settings</title>
- <para>
- If you have only one email address, or use automatic
- forwarding to funnel multiple addresses to one account, then
- you will only need to configure one identity. You may,
- however, want more that one. To alter an identity, click on
- it in the <guilabel>Identity</guilabel> tab of the
- <interface>Preferences</interface> window, and then click
- <guibutton>Edit</guibutton>. To add a new identity, simply
- click <guibutton>Add</guibutton>.
- </para>
-
- <para>
- In either case, you'll be presented with a dialog box with
- four fields:
- <itemizedlist>
- <listitem>
- <para>
- <guilabel>Full Name:</guilabel> by default, this is the
- same name as the full name described in your user
- account on your computer. You can select another if you
- wish.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Email address:</guilabel> Enter your email
- address in this space.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Organization:</guilabel> If you send email as
- a representative of a company or other organization,
- enter its name here.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Signature file:</guilabel> You may choose a
- small text file to be appended to every message that you
- send. Typically, signature files include address or
- other contact information, or a favorite quotation.
- They should not be more than three lines long.
- </para>
- </listitem>
- </itemizedlist>
-
- </para>
- </sect2>
-
- <sect2 id="config-prefs-mail-network">
- <title>Network Settings</title>
- <para>
- In order to send mail with
- <application>Evolution</application>, you need to connect to
- your network. To do that, you'll need to know your user name
- and password, what sort of mail sending and receiving
- protocols your network uses, and the names of the servers
- you'll be using. If you're switching from another groupware
- or email program, you can almost certainly use the same
- settings as you did with that program. Select the
- <guibutton>Sources</guibutton> tab in the
- <interface>Preferences</interface> window to tell
- <application>Evolution</application> where you want to get
- your mail, and click <guibutton>Transports</guibutton> to
- determine how you want to send your mail.
- </para>
-
- <sect3 id="config-prefs-network-sources">
- <title>Mail Sources</title>
- <para>
- The <interface>Mail Sources</interface> tab allows you to
- edit, add, or delete methods of retrieving mail from
- servers. Clicking on <guibutton>Add</guibutton> or
- <guibutton>Edit</guibutton> will bring up a dialog box to
- offer you the following options:
- <variablelist>
- <varlistentry>
- <term><guilabel>Mail source type:</guilabel></term>
- <listitem>
- <para>
- Select from IMAP, POP or Unix-style
- <filename>mbox</filename> files.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term> <guilabel>Server:</guilabel></term>
- <listitem>
- <para>
- Enter the name of your mail server in this field.
- For example:
- <userinput>mail.mycompany.com</userinput>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Username:</guilabel></term>
- <listitem>
- <para>
- Enter your user name here. Eva Lucianne Tester's
- user name is <userinput>eltester</userinput>.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Authentication:</guilabel></term>
- <listitem>
- <para>
- Your system administrator will know which type of
- authentication your system requires.
- <application>Evolution</application> can also detect
- what sorts of authentication are available once it
- knows where to find the server.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Test values before continuing</guilabel></term>
- <listitem>
- <para>
- If this box is checked,
- <application>Evolution</application> will attempt to
- make sure that all the other entries in the dialog
- window are correct.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect3>
- <sect3 id="config-prefs-mail-network-transports">
- <title>Transports</title>
- <para>
- The <interface>Transports</interface> tab lets you set how
- you will send mail. Evolution currently supports two mail
- transport options: <guilabel>SMTP</guilabel>, which uses a
- remote mail server, and <guilabel>sendmail</guilabel>,
- which uses the <application>sendmail</application> program
- on your local system. <application>Sendmail</application>
- is more difficult to configure, but offers more flexibility
- than plain <systemitem>SMTP</systemitem>.
- </para>
- <para>
- To use <guilabel>SMTP</guilabel>, you'll need to enter the
- name of your SMTP server, which should look like:
- <userinput>smtp.isp.net</userinput>.
- </para>
- <para>
- <application>Evolution</application> can
- attempt to determine if you have entered the right server
- name. To have it do so, check the box labelled
- <guilabel>Test these values before continuing</guilabel>
- before you click <guibutton>OK</guibutton>.
- </para>
- </sect3>
- </sect2>
- <sect2 id="config-prefs-network-news">
-
- <!-- WHY is this in the MAIL config section? WHY is this UI SOOOO bad?-->
-
- <title>News Servers</title>
- <para>
- When you first select the <guilabel>News
- Servers</guilabel> tab, you will see a blank box with
- 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. (FIXME, this needs work).
- </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 configurations that don't have
- too much to do with each other.
- <variablelist>
- <varlistentry>
- <term>
- <guilabel>Send messages in HTML format</guilabel>
- </term>
- <listitem><para>
- If you check this box, you will send
- messages as HTML by default. If you leave it unchecked, your
- messages will be sent without HTML formatting unless you select
- <menuchoice> <guimenu>Format</guimenu> <guimenuitem>HTML</guimenuitem>
- </menuchoice> in the message composer.
- See <xref linkend="usage-mail-getnsend-send-html">
- for more information about HTML mail.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term>
- <guilabel>Folder Format</guilabel>
- </term>
- <listitem> <para> By default,
- <application>Evolution</application> saves its mail
- in the
- <systemitem><filename>mbox</filename></systemitem>
- format. You can switch to the
- <systemitem><filename>mh</filename></systemitem>
- format if you like. Note that this is an advanced
- feature and may cause you to lose some messages, so
- you should probably make a backup of your
- <systemitem><filename>evolution</filename></systemitem>
- directory first. In addition, it will take quite
- some time if you have a large mailbox.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
- </sect1>
-
- <sect1 id="config-prefs-contact">
- <title>Managing the Contact Manager</title>
- <para>
- To set the behavior of your Contact Manager, click on the
- <guibutton>Contact Manager</guibutton> tab in the
- <interface>Preferences</interface> window.
- </para>
- <para>
- You can set the following options: <!--insert variable list
- here-->
- </para>
- </sect1>
-
- <sect1 id="config-prefs-cal">
- <title>Configuring the Calendar</title>
- <para>
- This section discusses calendar-specific preferences. While
- looking at your calendar, select
- <guimenuitem>Preferences</guimenuitem> from the
- <guimenu>Edit</guimenu> menu. This will open up the
- <interface>Preferences</interface> window. It contains four
- tabs: <guilabel>Time display</guilabel>,
- <guilabel>Colors</guilabel>, <guilabel>To Do List</guilabel>
- and <guilabel>Alarms</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>
- <graphic fileref="fig/config-cal" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
- <!-- ==============End of Figure================-->
- </para>
-
- <sect2 id="config-prefs-cal-time">
- <title>Time Display Settings</title>
- <para>
- The <guilabel>Time display</guilabel> tab lets you set the
- following:
- <variablelist>
- <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>Weeks start on</term>
- <listitem>
- <para>You can set weeks to start on Sunday or on Monday.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Day range</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>
- </variablelist>
- </para>
- </sect2>
- <sect2 id="config-prefs-cal-color">
- <title>Calendar Colors</title>
- <para>
- The <interface>colors tab</interface> allows you to decide
- what color your calendar will be. The tab consists of a
- sample calendar on the right and a list of ten items that can
- be colored in different ways. If you click on the color
- button to the right of each item, you will bring up a
- color-selector window where you can choose to alter that
- color. By clicking <guibutton>OK</guibutton> in the color
- selection dialog, you can see the results of the color on the
- sample calendar.
- </para>
- <para>The display elements whose color you can set are:
-
- <itemizedlist>
- <listitem>
- <para>
- <guilabel>Outline:</guilabel> The lines between days
- and at the top of the display.
- </para>
- </listitem>
-
- <listitem>
- <para> <guilabel>Headings:</guilabel> Text color for day
- and month names and other headings.
- </para>
- </listitem>
-
- <listitem>
- <para> <guilabel>Empty days:</guilabel> This is the
- background color for any time slots in which you have no appointments.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <guilabel>Appointments:</guilabel> This is the
- background color for any time slots in which you have appointments.
- </para>
- </listitem>
-
- <listitem>
- <para> <guilabel>Highlighted day:</guilabel> The
- background color for a selected time slot.
- </para>
- </listitem>
-
-
- <listitem>
- <para>
- <guilabel>Day numbers:</guilabel> Text color for date numbers.
- </para>
- </listitem>
-
-
- <listitem>
- <para>
- <guilabel>Current day's number:</guilabel> Text color for today's date.
- </para>
- </listitem>
-
- <listitem>
- <para> <guilabel>To-Do item that is not yet
- due:</guilabel> Text color for To-Do list items that are
- not yet due. (Or maybe background color? find out!)
- </para>
- </listitem>
-
-
- <listitem>
- <para> <guilabel>To-Do item that is due today:</guilabel>
- Text color for today's tasks.
- </para>
- </listitem>
-
- <listitem>
- <para> <guilabel>To-Do item that is overdue:</guilabel>
- Text color for overdue tasks.
- </para>
- </listitem>
-
- </itemizedlist>
- </para>
- </sect2>
-
- <sect2 id="config-prefs-cal-todo">
- <title>To Do List Settings</title>
- <para>
- You can choose what information the To Do list displays and the
- way it is displayed. The two areas of the <interface>To Do
- List</interface> tab offer several options each:
- <variablelist>
- <varlistentry>
- <term>Show on To Do List</term>
- <listitem>
- <para>
- This box contains three items. If you select the
- check boxes next to them, that information will appear
- in the To Do list for each task it contains:
- <itemizedlist>
- <listitem>
- <para><guilabel>Due Date</guilabel></para>
- </listitem>
- <listitem>
- <para><guilabel>Time Until Due</guilabel></para>
- </listitem>
- <listitem>
- <para><guilabel>Priority</guilabel></para>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Style Options</term>
- <listitem>
- <para>
- Select among the following checkboxes to determine
- how your To Do list will look:
- <itemizedlist>
- <listitem>
- <para><guilabel>Highlight overdue items</guilabel></para>
- </listitem>
- <listitem>
- <para><guilabel>Highlight items due today</guilabel></para>
- </listitem>
- <listitem>
- <para><guilabel>Highlight not yet due items</guilabel></para>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
-
- <sect2 id="config-prefs-cal-alarms">
- <title>Alarms Settings</title>
- <para>
- The <interface>alarms tab</interface> enables you to select from three boxes:
- <itemizedlist>
- <listitem>
- <para><guilabel>Beep on display alarms</guilabel>: select
- this box to have <application>Evolution</application> beep
- at you for any alarms you have set. If you leave this box
- unchecked, <application>Evolution</application> will only
- alert you to events by opening a dialog box.
- </para>
- </listitem>
- <listitem>
- <para><guilabel>Audio alarms timeout after: </guilabel>
- Select this button to have the beeping stop automatically
- after a certain number of seconds. </para>
- </listitem>
- <listitem>
- <para><guilabel>Enable snoozing for:</guilabel> If you
- would like to have the option to tell
- <application>Evolution</application> to repeat an alarm in
- a few minutes, select this button and decide how long
- you'd like it to wait.
- </para>
- </listitem>
- </itemizedlist>
- </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/C/config-setupassist.sgml b/help/C/config-setupassist.sgml
deleted file mode 100644
index 52ca546b9a..0000000000
--- a/help/C/config-setupassist.sgml
+++ /dev/null
@@ -1,159 +0,0 @@
- <chapter id="config-setupassist">
- <title>Easy Setup with the Setup Assistant</title>
- <para>
- The setup assistant can gather most of the information
- necessary for <application>Evolution</application>'s daily
- operation. If you prefer more detailed or advanced
- configuration, see <xref linkend="config-prefs">.
- </para>
-
- <sect1 id="config-setupassist-mail">
- <title>Mail Setup</title>
- <para>
- The first time you try to send or receive mail with
- <application>Evolution</application>, the <interface>mail
- setup assistant</interface> will pop up to help you with your
- email preferences. If you don't plan to use email, or if
- you'd rather deal with your email preferences later, click
- <guibutton>Cancel</guibutton>.
- </para>
- <para>
- The setup assistant (sometimes called a
- <glossterm>Druid</glossterm>) will guide you through the
- network configuration process. It will ask you for some
- basic information; your system administrator or ISP should
- have the answers you'll need. The mail setup assistant is
- pictured in <xref linkend="usage-setup-fig">.
-
-<!-- ==============Figure=================================== -->
-<!-- druid-pic should eventually become assistant-pic -->
-
- <figure id="usage-setup-fig">
- <title>Mail Setup Assistant</title>
- <screenshot>
- <screeninfo>Evolution Main Window</screeninfo>
- <graphic fileref="fig/mail-druid-pic" format="png" srccredit="Kevin Breit">
- </graphic>
- </screenshot>
- </figure>
-<!-- ==============End of Figure=================================== -->
-
-
-
- The assistant will ask you for the following information:
- <variablelist>
-
- <varlistentry>
- <term> <guilabel>Name:</guilabel> </term>
- <listitem> <para>Your
- full name: eg. Eva Lucianne Tester </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Email address:</guilabel></term>
- <listitem><para>
- Your email address: eg. eltester@helixcode.com
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guilabel>Organization:</guilabel></term>
- <listitem>
- <para>
- <guilabel>Organization:</guilabel> Any organization you
- represent. Leave this blank if you wish.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Signature File:</guilabel></term>
- <listitem>
- <para>
- A text file appended to any email you send. A signature
- file typically consists of your name and email address,
- or a quotation you like. It should be fewer than four
- lines of text.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guilabel>Mail source type:</guilabel></term>
- <listitem>
- <para>
- <application>Evolution</application> supports three mail
- sources: POP servers, the most common email server type;
- IMAP, which stores mail remotely and allows access from
- multiple locations, and UNIX-style
- <filename>mbox</filename> files. Ask your system
- administrator which one you use.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guilabel>Server:</guilabel></term>
- <listitem>
- <para>
- This should be the name of your mail server: it should
- look something like:
- <userinput>mailserver.organization.org</userinput>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Username:</guilabel></term>
- <listitem>
- <para>
- Normally, this is the part of your email address before
- the @ character, and
- <application>Evolution</application> has selected that
- value as the default. If you have a different username,
- you can enter it here.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Authentication:</guilabel></term>
- <listitem>
- <para>
- Select the type of authentication you will use. You can
- click <guibutton>Detect supported types</guibutton> to
- find out which authentication protocols your network
- allows.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guilabel>Mail Transport:</guilabel></term>
- <listitem>
- <para>
- This is the mail sending protocol you will want to use.
- <application>Evolution</application> supports both SMTP
- and <application>sendmail</application>.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <para>
- To learn how to configure <application>Evolution</application>
- in greater detail, or to change preferences once you have set
- them, see <xref linkend="config-prefs">.
- </para>
- </sect1>
-
-</chapter>
-
-
-
-
-
-
-
-
-
diff --git a/help/C/config-sync.sgml b/help/C/config-sync.sgml
deleted file mode 100644
index ae78a6daaf..0000000000
--- a/help/C/config-sync.sgml
+++ /dev/null
@@ -1,67 +0,0 @@
- <chapter id="config-sync">
-
- <!-- THIS ENTIRE CHAPTER MAY BE DELETED -->
-
- <title>Setting up your synchronization system</title>
- <para>
- Synchronization presents you with two issues you'll need to
- deal with. The first one is pretty simple: you'll need to get
- the data to move among the various devices you're using. If
- you've already got <application>Gnome-Pilot</application>
- working, then all you have to do is tell it to use Evolution
- as a conduit. If you haven't used
- <application>Gnome-Pilot</application> before, you'll need to
- run the GNOME <application>Control Center</application> and go
- through the hand-held device setup assistant. Then you can
- create the Evolution conduit and press the hotsync button.
- </para>
- <para>
- If that doesn't work, jump up and down several times and swear
- loudly. Then make sure you've got
- <application>Gnome-Pilot</application> going to the right
- device (for my serial port, it's /dev/ttys0, not the default
- /dev/pilot) and that you have read and write permission on
- that device. If you don't you'll need to be added to whatever
- group has those permissions (for my system, it's tty).
- Alternately, if you're the only user of your computer and
- don't care too much about security, just use
- <command>su</command> to become root, and then use
- <command>chmod a+rw /dev/[DEVICENAME]</command> to set
- universal read and write permissions on that port&mdash; just
- don't tell your sysadmin I said you could. (Sysadmins, of
- course, would never do such a thing.)
- </para>
- <para>
- Once <application>Evolution</application> knows where to get
- the mail, address, and calendar data, it needs to know what to
- do with it. When you synchronize your local data with the data on
- a server or handheld device, you may run into conflicts:
- perhaps you have ended up with two cards with the same name
- and different addresses, or old mail that has been deleted
- from one device but not the other. What if you want to keep
- only the most recent mail on your hand-held or your laptop,
- but all the mail on the LDAP server or your desktop machine?
- Select the <guibutton>Synchronization</guibutton> tab from the
- <interface>Preferences</interface> window to set up the
- conflict resolution preferences.
- </para>
- <para>
- You can set <application>Evolution</application>'s
- synchronization behavior in the following ways:
- <!-- LIST HERE -->
- </para>
- <para>
- <warning>
- <title>Data Loss Prevention</title>
- <para>
- It's always a good idea to make a backup. If you set your
- synchronization behaviors wrong, you could end up deleting
- the messages and cards you want to keep, and keeping the
- ones you want to delete. Before you change these
- preferences, make a backup of your
- <application>Evolution</application> files. You can do
- this by... <!--DESCRIBE HERE -->
- </para>
- </warning>
- </para>
- </chapter>
diff --git a/help/C/evolution-guide.sgml b/help/C/evolution-guide.sgml
deleted file mode 100644
index 59b50120b9..0000000000
--- a/help/C/evolution-guide.sgml
+++ /dev/null
@@ -1,132 +0,0 @@
-<!DOCTYPE Book PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN"[
-<!ENTITY PREFACE SYSTEM "preface.sgml">
-<!ENTITY USAGE-MAINWINDOW SYSTEM "usage-mainwindow.sgml">
-<!ENTITY USAGE-MAIL SYSTEM "usage-mail.sgml">
-<!ENTITY USAGE-CONTACT SYSTEM "usage-contact.sgml">
-<!ENTITY USAGE-CALENDAR SYSTEM "usage-calendar.sgml">
-<!ENTITY USAGE-NOTES SYSTEM "usage-notes.sgml">
-<!ENTITY USAGE-SYNC SYSTEM "usage-sync.sgml">
-<!ENTITY CONFIG-SETUPASSIST SYSTEM "config-setupassist.sgml">
-<!ENTITY CONFIG-PREFS SYSTEM "config-prefs.sgml">
-<!ENTITY CONFIG-SYNC SYSTEM "config-sync.sgml">
-<!ENTITY APX-GLOSS SYSTEM "apx-gloss.sgml">
-<!ENTITY APX-BUGS SYSTEM "apx-bugs.sgml">
-<!ENTITY APX-AUTHORS SYSTEM "apx-authors.sgml">
-<!ENTITY APX-FDL SYSTEM "apx-fdl.sgml">
-<!ENTITY APX-GPL SYSTEM "apx-gpl.sgml">
-
-]>
-
-
-<!-- Almost every chapter is an entity. Files, Chapter id's, and entity names correspond. APX is for appendix. -->
-<book id="index">
- <bookinfo>
- <title>A User's Guide to Evolution</title>
- <authorgroup>
- <author><firstname>Aaron</firstname><surname>Weber</surname></author>
- <author><firstname>Kevin</firstname><surname>Breit</surname></author>
- </authorgroup>
- <copyright>
- <year>2000</year>
- <holder>Helix Code, Inc., </holder>
- <holder>Kevin Breit</holder>
- </copyright>
-
- <legalnotice>
- <para>
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the <citetitle>GNU Free
- Documentation License</citetitle>, (FDL) 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.
- </para>
- <para>
- The software described by this document falls under the
- <citetitle>GNU General Public License</citetitle>, or GPL.
- </para>
- <para>
- The licenses are included with this document in <xref
- linkend="fdl">, and <xref linkend="gpl">; you may also obtain
- a copy 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>
-
- <releaseinfo>
- This is version 0.4 of the Evolution manual, describing version
- 0.3.1 of Evolution.
- </releaseinfo>
-
- </bookinfo>
-
- &PREFACE;
-
- <part id="usage">
- <title>Using Evolution</title>
- <partintro>
- <para>
- Part one of the <application>Evolution</application> manual
- describes how to use <application>Evolution</application>
- for email, contact management, and appointment and task
- scheduling. You'll find as you go along that, as with most of
- Linux, there's more than one way to do things, and you can
- pick whichever method you like best.
- </para>
- </partintro>
-
- &USAGE-MAINWINDOW;
- &USAGE-MAIL;
- &USAGE-CONTACT;
- &USAGE-CALENDAR;
- &USAGE-NOTES;
- &USAGE-SYNC;
-
- </part>
- <part id="config">
- <title>Configuring and Managing Evolution</title>
- <partintro>
- <para>
- <application>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 hackers to
- "configure" themselves a working system. When we say
- configurable, we mean that although
- <application>Evolution</application> will work perfectly well
- with minimal setup hassle, you can alter its behavior to fit
- your needs with just a little more work.
- </para>
- </partintro>
-
- &CONFIG-SETUPASSIST;
- &CONFIG-PREFS;
- &CONFIG-SYNC;
- </part>
- &APX-GLOSS;
- &APX-BUGS;
- &APX-AUTHORS;
- &APX-FDL;
- &APX-GPL;
-
-</book>
-
-
-
-
-
-
-
-
-
-
-
diff --git a/help/C/fig/calendar.png b/help/C/fig/calendar.png
deleted file mode 100644
index 47354813a2..0000000000
--- a/help/C/fig/calendar.png
+++ /dev/null
Binary files differ
diff --git a/help/C/fig/config-cal.png b/help/C/fig/config-cal.png
deleted file mode 100644
index e124196279..0000000000
--- a/help/C/fig/config-cal.png
+++ /dev/null
Binary files differ
diff --git a/help/C/fig/config-mail.png b/help/C/fig/config-mail.png
deleted file mode 100644
index ef270858f7..0000000000
--- a/help/C/fig/config-mail.png
+++ /dev/null
Binary files differ
diff --git a/help/C/fig/contact.png b/help/C/fig/contact.png
deleted file mode 100644
index 1610e278a4..0000000000
--- a/help/C/fig/contact.png
+++ /dev/null
Binary files differ
diff --git a/help/C/fig/filter-new-fig.png b/help/C/fig/filter-new-fig.png
deleted file mode 100644
index 4c612ce5fc..0000000000
--- a/help/C/fig/filter-new-fig.png
+++ /dev/null
Binary files differ
diff --git a/help/C/fig/mail-druid-pic.png b/help/C/fig/mail-druid-pic.png
deleted file mode 100644
index f29f3e77be..0000000000
--- a/help/C/fig/mail-druid-pic.png
+++ /dev/null
Binary files differ
diff --git a/help/C/fig/mainwindow-pic.png b/help/C/fig/mainwindow-pic.png
deleted file mode 100644
index 0ff712efa5..0000000000
--- a/help/C/fig/mainwindow-pic.png
+++ /dev/null
Binary files differ
diff --git a/help/C/fig/vfolder-createrule-fig.png b/help/C/fig/vfolder-createrule-fig.png
deleted file mode 100644
index 571a487ba4..0000000000
--- a/help/C/fig/vfolder-createrule-fig.png
+++ /dev/null
Binary files differ
diff --git a/help/C/preface.sgml b/help/C/preface.sgml
deleted file mode 100644
index bb6cb4d948..0000000000
--- a/help/C/preface.sgml
+++ /dev/null
@@ -1,174 +0,0 @@
-<!-- <!DOCTYPE preface PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN"> -->
- <preface id="introduction">
-<!-- =============Introduction ============================= -->
- <title>Introduction</title>
-
- <section id="what">
- <title> What is Evolution, and What Can It Do for Me?</title>
- <para>
- The word "evolution" means "a process of improvement and
- development." The GNOME application
- <application>Evolution</application> is meant to be a more
- evolved <glossterm>groupware</glossterm> program, and an
- integral part of the Internet-connected desktop.
- </para>
- <para>
- As part of the GNOME project,
- <application>Evolution</application> is free software. The
- program and its source code are released under the terms of
- the GNU Public License (GPL), and the documentation falls
- under the Free Documentation License (FDL), which is included
- with this document (<xref linkend="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>
- <note>
- <title>This is a preview release</title>
- <para>
- Please help develop <application>Evolution</application>
- by submitting bug reports when you find bugs. You can do
- so by using the <application>Bug Report
- Tool</application> (known as <command>bug-buddy</command>
- at the command line).
- </para>
- </note>
- </para>
-
- <para>
- <application>Evolution</application> is a suite of tools to
- help you work in a group. You can use it to send, receive,
- and organize email, manage address and other contact
- information, and maintain a calendar. It enables you to do
- those things on one or several computers, connected directly
- or over a network, for one person or for large groups.
- <application>Evolution</application> can handle almost all
- your communications tasks with the power and flexibility of
- the GNOME desktop environment.
- </para>
- <para>
- The developers of <application>Evolution</application> had
- four major goals for their project:
-
- <itemizedlist>
- <listitem>
- <para>
- The application must be <emphasis>both powerful and easy
- to use</emphasis>. That means a familiar and intuitive
- interface that users could customize to their liking, and
- the development of shortcuts for complex tasks.
- </para>
- </listitem>
- <listitem>
- <para>
- <application>Evolution</application> must meet and
- exceed the standards set by other groupware products.
- It must include support for most major network protocols
- so that it can integrate seamlessly with existing
- hardware and network environments.
- </para>
- </listitem>
- <listitem>
- <para>
- The project must support open standards and protocols
- to turn <application>Evolution</application> into an
- advanced development platform. From the simplest
- scripting to the most complex network and component
- programming, <application>Evolution</application>
- needed to offer developers an environment for
- cutting-edge application development.
- </para>
- </listitem>
- <listitem>
- <para>
- Data must be safe: <application>Evolution</application>
- must not lose mail or corrupt mailbox files. It will
- not execute scripts, automatically forward a virus to
- your entire contacts list, or delete files from your
- hard disk.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- <application>Evolution</application> is designed to make most
- 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>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">vFolders</link>, which
- let you save searches as though they were ordinary mail
- folders.
- </para>
-
- </section>
-
- <section id="aboutbook">
- <title>About This Book</title>
- <!-- ************** FOLLOWING PARAGRAPH FOR DRAFT ONLY ************* -->
- <para>
- This version of the <application>Evolution</application>
- User's Guide is a <emphasis>draft</emphasis>. It is missing
- huge chunks of information, and many of the features it
- describes are unimplemented. All the content is subject to
- change, especially if you help. Please send comments on the
- guide to <email>aaron@helixcode.com</email>. If you would like
- to work on the guide please contact me or see the GNOME
- Documentation project <ulink
- url="http://www.gnome.org/gdp">web site</ulink>. This
- paragraph will be removed in later versions of the manual.
- </para>
- <!-- ************* END DRAFT ONLY PARAGRAPH ************** -->
-
- <para>
- This book is divided into two sections. The first section is a
- <link linkend="usage">guided tour</link>&mdash; it will
- explain how to use <application>Evolution</application>. If
- you are new to <application>Evolution</application> or to
- groupware in general, this is the section 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>
- <formalpara>
- <title>Typographical conventions</title>
- <para>
- Some kinds of words are marked off with special typography:
- <simplelist>
- <member><application>Applications</application></member>
- <member><command>Commands</command> typed at the command line</member>
- <member><guilabel>Labels</guilabel> for interface items</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>
-
- </simplelist>
- </para>
- </formalpara>
- </section>
- </preface>
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/help/C/usage-calendar.sgml b/help/C/usage-calendar.sgml
deleted file mode 100644
index 9ec3b0f60e..0000000000
--- a/help/C/usage-calendar.sgml
+++ /dev/null
@@ -1,356 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<chapter id="usage-calendar">
- <title>The Evolution 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 grey and white ruled background. At the upper
- right, there's a monthly calendar you can use to switch days.
- Below that, there's a <guilabel>TaskPad</guilabel>, where you can
- keep a sort of glorified to-do list that's not linked to your
- calendar. The calendar's daily view is shown in <xref
- linkend="usage-calendar-fig">.
-
- <!-- ============== Figure ============================= -->
- <figure id="usage-calendar-fig">
- <title>Evolution Calendar View</title>
- <screenshot>
- <screeninfo>Evolution Contact Manager Window</screeninfo>
- <graphic fileref="fig/calendar" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
- <!-- ============== End of Figure ============================= -->
-
- </para>
- <sect1 id ="usage-calendar-view">
- <title>Ways of Looking at your Calendar</title>
-
- <para>
- You can view your calendar by the day, by the week, by the
- month, or by the year; press the calendar-shaped buttons on the
- right side of the toolbar to switch between views.
- </para>
- <para>
- To view yesterday's appointments, (last week's, if you're in
- the weekly view, and last month's for the monthly view), click
- the <guibutton>Pref</guibutton> button. For tomorrow, next week,
- or next month, click <guibutton>Next</guibutton>, and of course,
- click <guibutton>Today</guibutton> for today.
- </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>
-
-
-<!-- ############### FIXME FIXME FIXME ############
-Feature not yet implemented, and may not be implemented due to
-lack of time, resources, and interest.
- <para>
- In addition, <application>Evolution</application> supports
- Hebrew, Muslim, and other calendar formats. To switch to a
- different calendar format, choose
- <guimenuitem>GUIMENUITEM</guimenuitem> from the
- <guimenu>GUIMENU</guimenu>.
- </para>
-################ END FIXME AREA ################## -->
-
- </sect1>
- <sect1 id="usage-calendar-apts">
- <title>Scheduling With the Evolution Calendar</title>
- <para>
- The <application>Evolution</application> calendar allows you to
- schedule events for yourself or a group of people. It can
- handle events that repeat, event lengths from ten minutes to
- multiple days, and events that have a date but no specific
- time. Of course, you can also set event reminders and alarms
- so that you don't forget about everything you've just put into
- your calendar. Basically, it can handle almost any schedule you
- throw at it.
- </para>
- <sect2 id="usage-calendar-apts-basic">
- <title>Creating events</title>
- <para>
- To create a new calendar event, select
- <menuchoice>
- <guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Appointment</guimenuitem>
- </menuchoice>
- or click the <guibutton>New</guibutton> button on the left end
- of the toolbar. The <interface>New Appointment</interface>
- dialog will pop up with the usual menu bar, tool bar, and
- window full of choices for you.
- </para>
- <para>
- Your event 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>. For the purposes of the calendar, an
- <guilabel>All day event</guilabel> begins at ten in the
- morning, runs until eleven at night, and is displayed at the
- top of a day's event list rather than inside it. That makes
- it easy to have events that overlap and fit inside each other.
- For example, a conference might be an all day event, and the
- meetings at the conference would be timed events. Events with
- starting and ending times can also overlap, however, and when
- they do they're displayed as multiple columns in the day view
- of the calendar.
- </para>
- <note>
- <title>Doing Two Things At Once</title>
- <para>
- If you create two calendar events that overlap,
- <application>Evolution</application> will display them as
- multiple columns in the calendar window. If you manage to
- do both things at once, I'd like to meet you.
- </para>
- </note>
- <para>
- You can have as many as four different
- <guilabel>Alarms</guilabel>, any time prior to the event
- you've scheduled. You can have one alarm of each type:
- <variablelist>
- <varlistentry>
- <term><guilabel>Display</guilabel></term>
- <listitem>
- <para>
- A window will pop up on your screen to remind you of
- your event.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Audio</guilabel></term>
- <listitem>
- <para>
- Choose this to have your deliver a sound alarm.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Program</guilabel></term>
- <listitem>
- <para>
- Select this if you would like some additional application
- to run as a reminder. You can enter its name in the
- text field, or find it with the
- <guibutton>Browse</guibutton> button.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Mail</guilabel></term>
- <listitem>
- <para>
- <application>Evolution</application> will send an
- email reminder to the address you enter into the text
- field.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- </para>
- <para>
- <guilabel>Classification</guilabel> is a little more
- complicated, and only applies to calendars on a
- network. <guilabel>Public</guilabel> is the default category,
- and a public event can be viewed by anyone on the calendar
- sharing network. <guilabel>Private</guilabel> denotes one
- level of security, and <guilabel>Confidential</guilabel> a
- higer level. <!-- FIXME --> Exact determinations and implementations of
- this feature have yet to be determined. <!-- FIXME -->
- </para>
- <para>
- The <guilabel>Recurrence</guilabel> tab lets you describe
- repetition in events ranging from once every day up to once
- every 100 years. You can then choose a time when repetition
- will stop, and, under <guilabel>Exceptions</guilabel>, pick
- individual days when the event will <emphasis>not</emphasis>
- recur.
- </para>
-
- <para>
- Once you're done with all those settings, click on the disk
- icon in the toolbar. That will save the event and close the
- event editor window. If you want, you can alter an event
- summary in the calendar view by clicking on it and typing. You
- can change other settings by right-clicking on the event in
- the and then choosing <guimenuitem>Edit this Appointment</guimenuitem>.
- </para>
- </sect2>
-
-<!-- ############UNIMPLEMENTED FEATURES ###################
-
- <sect2 id="usage-calendar-apts-group">
- <title>Appointments for Groups</title>
- <para>
- If you have your calendar set up to work with other
- calendars over a network, you can see when others are
- available to meet with you.
- </para>
- <note>
- <title>Unimplemented Feature</title>
- <para>This feature is not yet implemented.</para>
- </note>
-
- <para>
- In addition, 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 event</interface> window. Then describe
- the event as you would any other. Before you click
- <guibutton>OK</guibutton>, (INSERT DESCRIPTION HERE...).
- <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 event on your calendar and on
- theirs as tentative, rather than a confirmed, event.
- </para>
- <para>
- To mark a tentative event as confirmed, click once on the
- event in the <interface>calendar view</interface> to select
- it, and then choose <guimenuitem>Event
- Properties</guimenuitem> from the <guimenu>Settings</guimenu>
- menu. In the <interface>Event Properties</interface> dialog
- window, click the "tentative" button to deselect the
- event.
- </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 events. Tasks are colored and sorted by priority and
- due-date (see <xref linkend="config-prefs"> for more
- information), and are included with calendar data during
- synchronization with a hand-held device.
- </para>
- <para>
- To record a new task, click the <guibutton>Add</guibutton>
- button below the list. <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>Priority:</guilabel></term>
- <listitem>
- <para>
- Select a level of importance from 1 (most important) to 9
- (least important).
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term> <guilabel>Item Comments:</guilabel></term>
- <listitem>
- <para>
- If you wish, you can keep a more detailed description of
- the item here.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <para>
- Once you've added a task to your to-do list, its summary
- appears in the <guilabel>Summary</guilabel> section of the
- calendar window. To view or edit a detailed description of an
- item, double-click on it, or select it and click
- <guibutton>Edit</guibutton>. You can delete items by selecting
- them and clicking on the <guibutton>Delete</guibutton> button.
- </para>
- </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>
- Keelyn has one calendar for her own schedule. Next to that
- she maintains one for the conference room, so people know when
- they can schedule meetings. On the local network, she
- maintains a calendar that reflects when consultants are going
- to be on site, and another that keeps track of when the Red
- Sox are playing.
- </para>
- </example>
- <para>
- To create a new calendar, select
- <menuchoice>
- <guimenu>File</guimenu> <guisubmenu>New</guisubmenu>
- <guimenuitem>Calendar</guimenuitem>
- </menuchoice>.
-
- You can place the calendar in any calendar folder and access it
- from the folder view. Alarms, configuration, and display for
- each calendar are seperate from each other.
- </para>
-
- </sect1>
-</chapter>
-
-
-
-
-
-
-
-
-
-
diff --git a/help/C/usage-contact.sgml b/help/C/usage-contact.sgml
deleted file mode 100644
index 4f9b9fd058..0000000000
--- a/help/C/usage-contact.sgml
+++ /dev/null
@@ -1,504 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<chapter id="usage-contact">
- <title>The Evolution Contact Manager</title>
- <abstract>
- <para>
- The <application>Evolution</application> contact manager can
- handle all of the functions of an address book, phone book, or
- Rolodex. Of course, it's a lot easier to update
- <application>Evolution</application> than it is to change an
- actual paper book. <application>Evolution</application> also
- allows easy synchronization with hand-held and remote devices.
- Since <application>Evolution</application> supports most major
- network protocols, including <glossterm>LDAP</glossterm>, it can
- fit into almost any existing network.
- </para>
- <para>
- Another advantage of the <application>Evolution</application>
- address book is its integration with the rest of the
- application. That means that when you look for someone's
- address, you can also see a history of appointments with that
- person. Or, you can get an e-mail with contact information in
- it and create a new address card on the spot. In addition,
- searches and folders and all work in the same way they do in the
- other components, so you don't have to learn another system for
- similar tasks.
- </para>
- <para>
- This chapter will cover using the
- <application>Evolution</application> contact manager 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 contact manager, see <xref
- linkend="config-prefs-contact">.
- </para>
- </abstract>
- <sect1 id="usage-contact-basic">
- <title>Getting Started With the Contact Manager</title>
-
- <para>
- To open up your address book, click on
- <guibutton>Contacts</guibutton> in the shortcut bar. The
- contact manager is illustrated in <xref
- linkend="usage-contact-fig">. By default, the contact manager
- shows all your cards in alphabetical order, in a
- <glossterm>minicard</glossterm> format. You can select other
- views from the <guimenu>View</guimenu> menu, and adjust the
- width of the colums by clicking and dragging the grey column
- dividers.
- </para>
-
-
- <figure id="usage-contact-fig">
- <title>Evolution Contact Manager</title>
- <screenshot>
- <screeninfo>Evolution Contact Manager Window</screeninfo>
- <graphic fileref="fig/contact" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
-
- <para>
- The toolbar for the address book is quite simple:
- <itemizedlist>
- <listitem><para>
- Press <guibutton>New</guibutton> for a new contact.
- </para></listitem>
-
- <listitem><para>
- <guibutton>Find</guibutton> brings up an in-depth search window.
- </para></listitem>
-
- <listitem><para>
- Press <guibutton>Print</guibutton> to print one or more cards.
- </para></listitem>
- <listitem><para>
- <guibutton>Delete</guibutton> deletes a selected card.
- </para></listitem>
- </itemizedlist>
- </para>
- <para>
- The last feature is <guilabel>Quick Search</guilabel>; to use
- it, just type in the name of the person you're looking for and
- hit <keycap>Enter</keycap>.
- <application>Evolution</application> will search through all
- the cards to find one that matches.
- </para>
- <para>
- If there are no matches, the card display will be blank. To
- display <emphasis>all</emphasis> of your contacts, you can
- leave the <guilabel>Quick Search</guilabel> field blank, and
- press enter.
- </para>
- <para>
- The rest of the contact manager is taken up by the display of
- your cards. You can view it as a table or as a list of
- cards&mdash; switch between them in the <guimenu>View</guimenu>
- menu &mdash; and move through them alphabetically alphanumeric
- buttons and the scrollbar at the right of the window.
- </para>
- </sect1>
- <sect1 id="usage-contact-cards">
- <title>Destroy, Create, or Change Cards</title>
-
- <para>
- To delete a card, click on it once to select it, then press the
- <guibutton>Delete Card</guibutton> button. If you have
- multiple cards selected, you'll delete mutliple cards.
- </para>
- <para>
- Adding or changing cards is slightly more complicated. Any
- time you add information to the contact manager, whether it's
- an old card you're editing or a new card you're just adding to
- your address book, you'll use the contact editor. To change a
- card that already exists, just double click it to open the
- contact editor window with all the current information already
- filled in. If you want to create a new one, clicking the
- <guibutton>New Card</guibutton> button will open up that same
- window, but with empty fields instead of full ones. Either
- way, it's the same tool for quite similar tasks, and you'll
- find that it's pretty flexible and can store quite a lot more
- than you'd think would fit onto a file card.
- </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 full
- menu bar, which is still evolving rapidly. <!-- FIXME -->
- </para>
-
- <figure id="usage-contact-editor-fig">
- <title>Evolution Contact Editor</title>
- <screenshot>
- <screeninfo>Evolution Contact Editor</screeninfo>
- <graphic fileref="fig/contact-new" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
-
- <para> The <guilabel>General</guilabel> tab contains no less
- than seven sections, each with an icon: a face, for name and
- company; a telephone for phone numbers; an envelope for email
- address; a house for postal address; a file folder for
- contacts, and a briefcase for categories. You can guess what
- sort of information belongs in fields like <guilabel>Job
- Title</guilabel> and <guilabel>Web page address</guilabel>,
- but there are several parts of the window that are a little
- more interesting.
- </para>
- <para>
- The <guilabel>Categories</guilabel> feature is discussed in
- <xref linkend="usage-contact-organize">, but the remaining
- features are described here:
- <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>
- The person's first, or given, name.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Middle: </guilabel></term>
- <listitem> <para>
- The middle name or initial, if any, goes here.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Last: </guilabel></term>
- <listitem> <para>
- The last name (surname) belongs here.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Suffix: </guilabel></term>
- <listitem> <para>
- Suffixes such as "Jr." or "III" can go here.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </para>
- </listitem>
- <listitem>
- <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:
- <userinput>Eva Lucianne Tester</userinput>.
- You'll notice that the <guilabel>File
- As</guilabel> field also fills up, but in reverse:
- <computeroutput>Tester, Lucianne</computeroutput>.
- You can pick <computeroutput>Eva
- Tester</computeroutput> from the drop-down, or
- type in your own, such as <userinput>Lucianne
- Tester, Eva</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 Eva's information under "F" for
- "Fictitious Helix Code Employees"
- </para>
- </tip>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Multiple Values for Fields</term>
- <listitem>
- <para>
- If you click on the small arrow 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
- remember them all. The arrow buttons next to the
- telephone and postal address fields work in the same
- way.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
-<!--- ############# This section isn't implemented yet either:
- <sect2>
- <title></title>
- <para>
- <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. While looking at a calendar appointment,
- right-click any email address, and choose
- <guimenuitem>Create Card for this Address</guimenuitem>.
- (NOTE that feature may change! unimplemented!)
- </para>
- </tip>
- </para>
- <para>
- You can move cards around just as you would move email
- messages: dragging and dropping works, as does right-clicking
- and choosing <guimenuitem>Move</guimenuitem> from the menu
- that appears.
- </para>
- </sect2>
-############### SHORTCUT SECTION COMMENTED OUT FOR NOW -->
-
- </sect1>
-
- <sect1 id="usage-contact-organize">
- <title>Organizing your Contact Manager</title>
- <para>
- Organizing your contact manager is a lot like organizing your
- mail. You can have folders and searches the same way you can
- with mail, but the contact manager does not allow vFolders. It
- does, however, allow each card to fall under several
- categories, and allow you to create your own categories.
- Categories are discussed <xref
- linkend="usage-contact-organize-group-category">.
- </para>
-
-<!--
- <para>
- Another useful UNIMPLEMENTED
- <application>Evolution</application> feature is its ability to
- recognize when people live or work together. If several people
- in your contact manager 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 that mail folders do. For more
- flexibility, you can also mark contacts as members of
- different categories.
- </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. Note
- that each card must be in one and only one folder, unless
- you want to have duplicate cards.
- </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. The difference between folders
- and categories is that folders contain cards, but category
- membership is a property of each card. 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>
- <para>
- Then, you can refer to all the cards in that category by:
- FEATURE NOT IMPLEMENTED... FIXME
- </para>
- <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>
-
- <tip id="usage-contact-categories-multiple">
- <title>Another way to use Categories</title>
- <para>
- You can categorize contacts by typing the category
- names into the <guilabel>Categories</guilabel>
- field. You can also create new categories that way:
- just type in a category name, and it counts as a
- category.
- </para>
- </tip>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1 id="usage-contact-sharing">
- <title>Sharing your Cards (and keeping them to yourself)</title>
- <para>
- Cards can be shared over a network. 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
- also share your calendars, 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?
- <application>Evolution</application> lets you decide which
- folders you want to make accessible to others.
- </para>
- <para>
- To begin sharing a folder of address cards, wait until
- <application>Evolution</application> supports this
- feature. <!-- FIXME -->
- </para>
- </sect1>
-
- <sect1 id="usage-contact-automate">
- <title>Contact Manager Tools</title>
- <para>
- The contact manager works with
- <application>Evolution</application> mail and the calendar to
- help you add new address cards quickly. However, it can also
- manage mailing lists. There are more tools planned, and when
- they arrive, <!-- FIXME --> they will be described in this
- section.
- </para>
-
- <sect2 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> also adds cards from a
- hand-held device during HotSync operation. For more
- information about that, see <xref linkend="usage-sync">.
- </para>
- </sect2>
-
- <sect2 id="contact-automation-lists">
- <title>Managing a Mailing list</title>
- <para>
- You already know that when you are writing an email, you can
- address it to one or more people, and that
- <application>Evolution</application> will fill in addresses
- from your contact manager's address cards if you let it. In
- addition to that, you can send email to everyone in a
- particular group.
- </para>
- <!-- FIXME this feature not yet implemented -->
- <para>
- 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 postal mailings.
- </para>
- </sect2>
-<!--
- <sect2 id="usage-contact-automation-extra">
- <title>Map It!</title>
- <para>
- Need a map or directions? Click
- <guibutton>MapIt</guibutton> from within the contact
- manager, and <application>Evolution</application> will
- map the address for you online.
- </para>
- </sect2>
--->
-
- </sect1>
- <sect1 id="usage-contact-menubar">
- <title>Contact Manager Menubar Reference</title>
- <para>
- </para>
- </sect1>
-</chapter>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/help/C/usage-mail.sgml b/help/C/usage-mail.sgml
deleted file mode 100644
index de2f3b0a23..0000000000
--- a/help/C/usage-mail.sgml
+++ /dev/null
@@ -1,1132 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<chapter id="usage-mail">
- <title>Evolution Mail</title>
- <abstract>
- <title> An Overview of the Evolution Mailer</title>
- <para>
- <application>Evolution</application> email is like other email
- programs in all the ways you would hope:
- <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
- supports file attachments.
- </para>
- </listitem>
- <listitem>
- <para>
- It supports multiple mail sources, including IMAP, POP3,
- and local <filename>mbox</filename> files.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- However, <application>Evolution</application> has some important
- differences. First, it's built to handle very large amounts of
- mail without slowing down or crashing. 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 gargantuan mail
- volumes. There's also the <application>Evolution</application>
- <link linkend="usage-mail-organize-vFolders">vFolder</link>, an
- advanced organizational feature not found in other 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 that feature
- especially useful.
- </para>
-
- <para>
- You can start reading email by clicking
- <guibutton>Inbox</guibutton> in the shortcut bar. By
- default, the <interface>Inbox</interface> is open when you
- start <application>Evolution</application>, and the first
- time you see your inbox, there's a message in it from Helix
- Code welcoming you to the application.
- </para>
- </abstract>
-
- <sect1 id="usage-mail-getnsend">
- <title>Reading, Getting and Sending Mail</title>
- <sect2 id="usage-mail-getnsend-read">
- <title>Reading a Message</title>
- <para>
- The first time you open your
- <application>Evolution</application>
- <guilabel>Inbox</guilabel>, you will see a window like the one
- in <xref linkend="usage-mail-intro-fig">, with a message from
- Helix Code in the <interface>message list</interface>. The
- message is displayed below that, in the <interface>view
- pane</interface>. If you find the <interface>view
- pane</interface> too small, you can double-click on the
- message in the <interface>message list</interface> to have it
- open in a new window. As is the case with folders, you can
- right-click on messages in the message list and get a menu of
- possible actions:
- <variablelist>
-
- <varlistentry>
- <term><guimenuitem>View Message</guimenuitem> </term>
- <listitem><para>
- Select this item to view the message in
- the view pane of the <application>Evolution</application>
- window.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Edit Message</guimenuitem></term>
- <listitem><para>
- This item is available only for messages and drafts
- that you have written. Select it to open the message
- composer and make changes to the message.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Print Message</guimenuitem> </term>
- <listitem><para>
- Select this item to print a message.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Reply to Sender</guimenuitem></term>
- <listitem><para>
- Use this item to reply only to the author of the message.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Reply to All</guimenuitem></term>
- <listitem><para>
- Send a reply to the author of the message
- and to all others on the recipient list. See <xref
- linkend="usage-mail-getnsend-send-reply"> for more information.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Forward Message</guimenuitem> </term>
- <listitem><para>
- Send the message on to another person.
- See <xref linkend="usage-mail-getnsend-fwd"> for
- information about how to use the Forward feature.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Delete Message</guimenuitem> </term>
- <listitem><para>
- Mark the message for deletion. Choose <menuchoice>
- <guimenu>Actions</guimenu><guimenuitem>Expunge</guimenuitem>
- </menuchoice> to delete marked messages permanently.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Move Message</guimenuitem> </term>
- <listitem><para>
- Select this item to move the message to another folder.
- This will open a dialog to let you choose the destination
- from a folder tree.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </para>
-
- <para>
- You can also select the order in which messages appear in
- that list. To sort by sender, subject, or date, click on the
- bars with those labels at the top of the message list. If
- you click twice, you'll sort them in reverse order.
- </para>
- <para>
- Aside from sorting the messages, you can opt to have the
- messages threaded. Select <menuchoice>
- <guimenu>View</guimenu> <guimenuitem>Threaded Message
- List</guimenuitem> </menuchoice> to turn the threaded view on
- or off. If the option selected,
- <application>Evolution</application> will attempt to
- associate related messages by using the
- <systemitem>References</systemitem>,
- <systemitem>In-Reply-To</systemitem>, and
- <systemitem>Subject</systemitem> message headers. Messages
- which are related are then placed next to each other, so that
- it's easier to follow the thread of a conversation from
- message to message.
- </para>
- <para>
- Go ahead and click on the message in the <interface>message
- list</interface>. That selects the message. Then click on
- the <guibutton>Delete</guibutton> button in the tool bar. The
- message now has a line through it, because you've marked it
- for deletion. If you really want to get rid of it, choose
- <guimenuitem>Expunge</guimenuitem> from the
- <guimenu>Tools</guimenu> menu. That will delete it
- permanently. If you want to keep it, click
- <guibutton>Delete</guibutton> again, and it will no longer be
- marked as deleted. At some point in the future, this feature
- will change to something a little less counter-intuitive.
- </para>
- <!-- ==============Figure=================================== -->
-
- <figure id="usage-mail-intro-fig">
- <title>Evolution Mail</title>
- <screenshot>
- <screeninfo>Inbox</screeninfo>
- <graphic fileref="fig/mail-pic" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
-<!-- ==============End of Figure============================== -->
-
- </sect2>
-
- <sect2 id="usage-mail-getnsend-get">
- <title>Checking Mail</title>
- <para>
- To check your email, just click <guibutton>Get
- mail</guibutton> in the toolbar. If this is the first time
- you've done so, the <interface>mail setup
- assistant</interface> will ask you for the information it
- needs to check your mail (see <xref
- linkend="config-setupassist"> for more information). If
- you're checking mail over a network (instead of from local
- <filename>mbox</filename> files), you'll need to enter your
- email password. Type it in, click <guibutton>OK</guibutton> and
- <application>Evolution</application> will download your mail.
- New mail will appear in your <interface>Inbox</interface>.
- <!-- FIXME: add mention of Today if Today feature appears -->
- </para>
- <para>
- Once you've entered your password,
- <application>Evolution</application> will hold it in memory so
- that you don't have to retype it every time you want to check
- mail. It will only remember the password until you quit the
- application; each time you run
- <application>Evolution</application>, you need to re-enter
- your password. If you'd like
- <application>Evolution</application> to forget your password
- sooner, select
- <menuchoice><guimenu>Actions</guimenu><guimenuitem>Forget
- Passwords</guimenuitem></menuchoice>, and it will do so
- immediately.
- </para>
- <para>
- If you get an error message instead of mail, you probably
- need to change your network settings. To learn how to
- do that, have a look at <xref
- linkend="config-prefs-mail-network">, or ask your system
- administrator.
- </para>
-
- <sect3 id="usage-mail-getnsend-get-attach">
- <title>Attachments, HTML Mail, and Live Documents</title>
- <para>
- If someone sends you a file attached to an email (an
- "attachment"), <application>Evolution</application> will
- display the file at the bottom of the message to which it's
- attached. Text, HTML, and most images will be displayed in
- the message itself. For other files,
- <application>Evolution</application> will provide a link and
- icon at the end of the message. Click on that, and
- <application>Evolution</application> will ask you where you
- want to put the file. Once you've chosen a location and
- saved the file, you can open, move, copy, or execute it just
- like any other, using <application>Nautilus</application> or
- your favorite shell or file manager.
- </para>
-
- <para>
- <application>Evolution</application> can also display
- HTML-formatted mail, complete with graphics. HTML
- formatting will display automatically, although you can
- turn it off if you prefer.
- </para>
-
-<!-- ######## Feature will probably not be implemented ******
- <para>
- It can also display <glossterm>live
- documents</glossterm>, which have scripted or
- executable contents&mdash; for example, a working
- spreadsheet page or a chess game.
- </para>
-
--->
-
- </sect3>
- </sect2>
-
- <sect2 id="usage-mail-getnsend-send">
- <title>Writing and Sending Mail</title>
- <para>
- You can start writing a new email message by selecting
- <menuchoice> <guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu> <guimenuitem>
- Mail</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>
- <graphic fileref="fig/newmsg-pic" format="png" srccredit="Kevin Breit">
- </graphic>
- </screenshot>
- </figure>
-<!-- ==============End of Figure=================================== -->
-
- <!-- Check the alignment of the following paragraph in the PS and
- HTML output: it's indented for no good reason -->
- <para>
- Enter an address in the <guilabel>To:</guilabel> field, a
- subject in the <guilabel>Subject:</guilabel> and a message in
- the big empty box at the bottom of the window, and press
- <guibutton>Send</guibutton>. That's easy. It may even be
- too easy, which is why I like to queue my messages up to be
- sent a few minutes later.
-
- <tip id="usage-mail-getnsend-send-attach-tip">
- <title>Send Now, Send Later</title>
- <para>
- Evolution will send mail immediately unless you tell it to
- do otherwise by selecting <guimenuitem>Send
- Later</guimenuitem> from the <guimenu>MENU</guimenu> in
- the message composition window. Then, when you press
- <guibutton>Send</guibutton>, all your unsent messages will
- go out at once. I like to use "Send Later" because it
- gives me a chance to change my mind about a message before
- it goes out. That way, I don't send anything I'll regret
- the next day.
- </para>
- <para>
- To learn more about how you can specify message queue
- and filter behavior, see <xref linkend="config-prefs-mail">.
- </para>
- </tip>
- </para>
-
- <para>
- You can probably guess the purpose of the buttons labelled
- <guilabel>Cut</guilabel>, <guilabel>Copy</guilabel>,
- <guilabel>Paste</guilabel> and <guilabel>Undo</guilabel>, but
- there's a bit more to sending mail that's less obvious. In
- the next few sections, you'll see how
- <application>Evolution</application> handles additional
- features, including mailing lists, attachments, and
- forwarding.
- </para>
-
-
- <sect3 id="usage-mail-getnsend-send-to">
- <title>Choosing Recipients</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 complete
- the address for you. <!-- (INSERT description of UI for this
- feature, once it is decided upon). --> 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.
- </para>
- <para>
- Alternately, you can click on the
- <guibutton>To:</guibutton>, <guibutton>Cc:</guibutton>, or
- <guibutton>Bcc:</guibutton> buttons to get a list of email
- addresses. Click the check-boxes next to the addresses, then
- click <guibutton>OK</guibutton>, and the address will be
- added to the appropriate form field.
- </para>
- <para>
- For more information about using email together with the
- contact manager and the calendar, see <xref
- linkend="usage-contact-automate"> and <xref
- linkend="usage-calendar-apts">.
- </para>
-
- <sect4 id="usage-mail-getnsend-send-to-mult">
- <title>Multiple Recipients</title>
- <para>
- In addition, you can mark recipients in three different
- ways. The <guilabel>To:</guilabel> field is for the
- primary recipients of the message you are going to send.
- However, it is considered bad form to have more than a few
- email addresses in this section.
- </para>
- <para>
- If you're writing to one person, but want to keep a third
- party up to date, you can use <guilabel>Cc:</guilabel>.
- 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.
- <example>
- <title>Using the Cc: field</title>
- <para>
- When Susan sends an email to a client, she puts her
- co-worker, Tim, in the in the
- <guilabel>Cc:</guilabel> field, so that he know
- what's going on. The client can see that Tim also
- received the message, and knows that he can talk to
- Tim about the message as well.
- </para>
- </example>
- </para>
- <para>
- If you have a large number of recipients, or if you want
- to send mail to several people without sharing the
- recipient list, you should use
- <guilabel>Bcc:</guilabel>. "Bcc" stands for "Blind Carbon
- Copy", and means that people you put in the
- <guilabel>Bcc:</guilabel> field get the message, but
- nobody else sees their email address. They will still see
- the list of addresses from the <guilabel>To:</guilabel>
- and <guilabel>Cc:</guilabel> fields, though.
-
- <example id="ex-mail-bcc">
- <title>Using the Bcc: field</title>
- <para>
- Tim is sending an email announcement to all of his
- company's clients, some of whom are in competition
- with each other, and all of whom value their
- privacy. He needs to use the
- <guilabel>Bcc:</guilabel> field here. If he puts
- every address from his address book's "Clients"
- category into the <guilabel>To:</guilabel> or
- <guilabel>Cc:</guilabel> fields, he'll make the
- company's <emphasis>entire</emphasis> client list
- public. Don't assume it won't happen to you!
- </para>
- </example>
- </para>
- </sect4>
- </sect3>
-
- <sect3 id="usage-mail-getnsend-send-reply">
- <title>Replying to Messages</title>
- <para>
- In order to reply to a message, click on it once in the
- message list to select it. Then press the
- <guibutton>Reply</guibutton> button. A window like the
- <interface>New Message</interface> window will appear, but
- the subject will already be present&mdash; the same subject
- as the message to which you are replying, but with Re:
- before it, to mark it as a reply. In addition, the full
- text of the previous message is inserted into the new
- message, either in italics (for HTML display) or with the
- &gt; character (in plain text mode) before each line. This
- indicates quoting. You can intersperse your message with
- the quoted material as shown in <xref
- linkend="usage-mail-getnsend-reply-fig">
-
-<!-- note that this figure should have a reply mail ready to send,
-with quoted materials and the relevant replies interspersed-->
- <!-- ==============Figure=================================== -->
- <figure id="usage-mail-getnsend-reply-fig">
- <title>Reply Message Window</title>
- <screenshot>
- <screeninfo>Evolution Main Window</screeninfo>
- <graphic fileref="fig/replymsg" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
-<!-- ==============End of Figure=================================== -->
- </para>
-
- <para>
- If a message has several recipients, as in the case of
- mailing lists or messages that have been carbon copied, you
- may wish to click <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. But be careful, and always make sure you
- know who is getting a message: it could be a mailing list
- with thousands of subscribers.
- <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 to all of
- them, 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>.
- </para>
- </example>
- </para>
- </sect3>
-
- <sect3 id="usage-mail-getnsend-send-html">
- <title>Embellish your email with HTML</title>
- <para>
- You can't normally use text treatments or pictures in
- emails, which is why you've probably seen people use
- asterisks for emphasis or use
- <glossterm>emoticons</glossterm> to convey their
- feelings. However, most of the newer email programs can
- include and display images and text treatments as well as
- basic alignment and paragraph formatting.
- </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. <emphasis>Some</emphasis>
- people refer to HTML mail as "the root of all evil" and
- get very angry if you send them HTML mail, which is why
- <application>Evolution</application> sends plain text
- unless you explicitly ask for HTML. To send HTML mail,
- you will need to select <menuchoice> <guimenuitem>
- HTML</guimenuitem></menuchoice> in the mail settings dialog box. See
- <xref linkend="config-prefs-mail-other"> for more information.
- </para>
- <para>
- If you format a message with HTML, but do not have
- <guilabel>Send Messages as HTML</guilabel> enabled in your
- mail settings, the composer will remove your text styles.
- It will, however, preserve indentation and lists. The
- same is true for individuals in your address book whom you
- have not marked as wanting to receive HTML mail.
- </para>
- </note>
- <para>
- HTML formatting tools are located just above the
- composition frame, and in the <guimenu>Insert</guimenu> and
- <guimenu>Format</guimenu> menus. Your message text will
- appear formatted in the composer window, and the message
- will be sent as HTML.
- </para>
- <para>
- The icons in the toolbar are explained in tool-tips, 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>
- Choose <guilabel>Normal</guilabel> for a default
- text style, or <guilabel>Header 1</guilabel> through
- <guilabel>Header 6</guilabel> for varying sizes of
- header. You can also select
- <guilabel>pre</guilabel> for preformatted text
- blocks, and three types of <guilabel>List
- Item</guilabel>.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Text style</term>
- <listitem>
- <para>
- <itemizedlist mark="none">
- <listitem><para><guibutton>B</guibutton> is for bold text</para></listitem>
- <listitem><para><guibutton>I</guibutton> for italics</para></listitem>
- <listitem><para><guibutton>U</guibutton> to underline</para></listitem>
- <listitem><para><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 left-justified,
- the center button, centered, and the right hand
- button, right-justified.
- </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>
- </variablelist>
- </para>
- <para>
- There are three tools that you can find only in the
- <guimenu>Insert</guimenu> menu.
- <variablelist>
- <varlistentry>
- <term><guimenuitem>Insert Link</guimenuitem>:</term>
- <listitem>
- <para>
- Use this tool to
- put hyperlinks in your HTML messages. When you
- select it, <application>Evolution</application> will
- prompt you for the <guilabel>Text</guilabel> that
- will appear, and the <guilabel>Link</guilabel>, where
- you should enter the actual web address (URL).
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term> <guimenuitem>Insert Image</guimenuitem>:</term>
- <listitem>
- <para>
- <guimenuitem>Insert Image</guimenuitem>: Select this item to
- embed an image into your email, as was done in the welcome
- message. Images will appear at the location of the
- cursor.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guimenuitem>Insert Rule</guimenuitem>:</term>
- <listitem><para>
- This will insert a horizontal line, or rule, into your document.
- You'll be presented with a dialog box which gives you
- the choice of size, percentage of screen, shading, and
- alignment; if you leave everything at the default
- values you'll get a thin black rule all the way across
- the screen.</para></listitem>
- </varlistentry>
-
- </variablelist>
- </para>
- <note>
- <title>A Technical note on HTML Tags</title>
- <para>
- The composer is a WYSIWYG (What You See Is What You Get)
- editor for HTML. That means that if you enter HTML
- directly into the composer&mdash; say, <markup
- role="html">&lt;B&gt;Bold Text&lt;/B&gt</markup>, the
- the composer will assume you meant exactly that string
- of characters, and not "make this text bold," as an HTML
- composition tool or text editor would.
- </para>
- </note>
- </sect3>
- <sect3 id="usage-mail-getnsend-send-attach">
- <title>Attachments</title>
- <para>
- If you want to attach a file to your email message, you
- can drag it from your desktop into the message window, or
- click the button in the toolbar with a paper clip on it,
- labelled <guibutton>Attach</guibutton>. If you click the
- <guibutton>Attach</guibutton> button,
- <application>Evolution</application> will open a file
- selection dialog box, to ask you which file you want to
- send. Select the file and click <guilabel>OK</guilabel>.
- </para>
- <para>
- When you send the message, a copy of the file will
- go with it. Be aware that big attachments can take a long
- time to download.
- </para>
- </sect3>
-
-<!-- Function not implemented,
-possibly never will be due to security evil. -->
-<!--
- <sect3 id="usage-mail-getnsend-send-live">
- <title>Live Documents</title>
- <para>
- Later versions of <application>Evolution</application>
- will allow you to enliven your email with almost any
- sort of document, and even with entire
- applications. At this point, however, this feature has not
- yet been implemented.
- </para>
- </sect3>
--->
-
- <sect3 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 mail when you get a letter 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>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>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>
- </sect3>
- <sect3 id="usage-mail-getnsend-ettiquette">
- <title>Seven Tips for Email Usage</title>
- <para>
- I started with ten, but four were "Don't send
- <glossterm>spam</glossterm>."
- <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 email
- quotation symbols (&gt;) indicating multiple layers
- of careless inline 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>
- ALL CAPS MEANS YOU'RE SHOUTING!
- </para>
- </listitem>
-
- <listitem>
- <para>
- Never write anything in email you wouldn't say in
- public. Old messages have a nasty habit of
- resurfacing when you least expect.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Check your spelling and use complete sentences.
- </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>
- </itemizedlist>
- </para>
- <para> Happy mailing! </para>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1 id="usage-mail-organize">
- <title>Organizing Your Mail</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>Evolution</application> has the tools
- to help you do it.
- </para>
-
- <sect2 id="usage-mail-organize-folders">
- <title>Getting Organized with Folders</title>
- <para>
- <application>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>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 create a filter with the <interface>filter
- assistant</interface>, you can have mail moved to your folder
- automatically.
- </para>
- </sect2>
-
- <sect2 id="usage-mail-organize-search">
- <title>Searching for Messages</title>
- <para>
- Most mail clients can search through your messages for you,
- but <application>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>
-
- Then, press <keycap>Enter</keycap>.
- <application>Evolution</application> will show your search
- results in the message list.
-
- </para>
- </sect2>
-
- <sect2 id="usage-mail-organize-filters">
- <title>Staying organized: Mail Filters in Evolution</title>
- <para>
- Filters sort your email for you as it arrives. Most often,
- you'll want to have <application>Evolution</application> put
- mail into different folders, but you can have it do anything
- you like. People who subscribe to multiple mailing lists, or
- who often need to refer to messages they have sent, find
- filters especially helpful to separate personal from
- list-related mail, but they're good for anybody who gets more
- than a few messages a day. To create a filter, select
- <menuchoice>
- <guimenu>Tools</guimenu> <guimenuitem>Filter
- Assistant</guimenuitem> </menuchoice>. This will bring up a
- window which will guide you through filter creation. The
- <interface>filter assistant</interface> is shown in <xref
- linkend="usage-mail-filters-fig-new">
-
- <figure id="usage-mail-filters-fig-new">
- <title>Creating a new Filter</title>
- <screenshot>
- <screeninfo>Creating a new Filter</screeninfo>
- <graphic fileref="fig/filter-new-fig" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
-
- </para>
-
- <para> The <interface>filter assistant</interface> window
- contains a window listing rules, and an option to create a
- new rule. To start filtering your mail, click
- <guibutton>Add</guibutton> to add a filtering rule.
- You'll decide when it should take place:
- <itemizedlist>
- <listitem>
- <para>
- <guilabel>When mail arrives:</guilabel> Select
- this option to have messages filtered as they
- arrive.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>When mail is sent:</guilabel> Select
- this option to filter your outgoing mail. You
- can use this feature to keep your
- <interface>Outbox</interface> as organized as
- your <interface>Inbox</interface>.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-
- <para>
- Then, the filter assistant will ask you which emails it should
- act upon. You can set criteria based on message size, the
- sender, primary addressee or Cc: list, words in the subject or
- body of the message, or any combination of criteria. Check the
- boxes next to each criterion you would like to use.
- </para>
- <para>
- Once you've decided which messages to filter, the assistant
- will ask you the sort of action you wish to take. You can
- file, delete, or forward the message, and you can also have it
- be exempted from other filters which would otherwise have
- acted upon it.
- </para>
-
- <note>
- <title>Two Notable Filter Features</title>
- <para>
- <itemizedlist>
- <listitem><para>Any incoming email that does not meet
- filter action criteria remains in the Inbox. </para>
- </listitem>
-
- <listitem><para>If you move a folder, your filters
- will follow it. </para></listitem>
- </itemizedlist>
- </para>
- </note>
- </sect2>
-
-
-
- <sect2 id="usage-mail-organize-vFolders">
- <title>Getting Really Organized with Virtual Folders</title>
- <para>
- If filters aren't flexible enough for you, or you find
- yourself performing the same search again and again, consider
- a virtual folder. Virtual folders, or vFolders, are an
- advanced way of viewing your email messages within
- <application>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. Once you've set it up, you'll be
- able to open it and read the messages in it as though it were
- a normal mail folder. It's not a folder, though, because when
- you open a vFolder, <application>Evolution</application>
- performs a search for you. It's not a regular search, though,
- because you can build a vFolder with a very complicated set of
- criteria with multiple inclusions and exclusions, as though
- you were setting up a filter.
- </para>
-
-<!-- potentially useful, but doesn't fit at the moment:
- <para>
- An important difference between a folder and a virtual folder
- is that a conventional folder actually contains messages, but
- a vFolder is a view of messages that may be in several
- different folders. This means that while a message may fall
- into several vFolders, it can be in only one conventional
- folder. Also, it means that you cannot remove a message from
- a vFolder unless you delete it, and you cannot add a message
- to a vFolder unless you change the vFolder's search criteria.
- </para>
--->
-
- <para>
- As messages that meet the vFolder criteria arrive or are
- deleted, <application>Evolution</application> will
- automatically place them in and 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 include it.
- </para>
- <para>
- That's pretty complicated, but it can be useful. For example,
- if I have a folder for all the email from one person, and
- another folder for all the email on a given topic, I
- <emphasis>feel</emphasis> organized. But when the person
- sends me mail about the topic, my whole email filing universe
- becomes chaotic, and I need vFolders to save the day for me.
- </para>
- <para>
- That sounds silly, but 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>
-
- <example id="usage-mail-organize-vFolders-ex">
- <title>Using Folders, Searches, and vFolders</title>
- <para>
- To organize my mail box, I can set up a vFolder for emails
- from my friend Vince. Then, whenever I want to see the
- messages Vince has sent me, I open the vFolder, and every
- message he's sent me shows up, no matter where I've
- actually filed it. If I want, I can also create a vFolder
- containing any message from my list of co-workers which
- also has the name of the project in it. That way, when
- Vince sends me mail about the project, I can see that
- message both in the "Vince" vFolder and in the "Project"
- vFolder. That's because when I open up the "Vince" folder,
- I'm really performing a search for all the mail from Vince,
- and when I open the "Project" folder I'm really performing
- a search for all the mail about the project.
-
- <!-- (INSERT SCREENSHOT HERE: vFolders in action) -->
-
- </para>
- </example>
- <para>
- To create a vFolder, select <guimenuitem>VFolder
- Assistant</guimenuitem> from the <guimenu>Tools</guimenu>
- menu in the <interface>main window</interface>. This
- will bring up a dialog box that looks suspiciously like
- the Filter Assistant (for more information on filters, see
- <xref linkend="usage-mail-organize-filters">), and which
- presents you with a list of vFolders you have previously
- created. If you have already created vFolders, you can
- click on them in the frame labelled <guilabel>Select Rule
- Type</guilabel>, and edit or remove them. If you have
- not created any, there will be only one available option:
- click <guibutton>Add</guibutton> to add a new vFolder.
- </para>
- <para>
- You'll be prompted to create a filtering rule. You can build
- your own from the ground up, or select one of several base
- rules to customize. Your options are:
- <variablelist>
- <varlistentry>
- <term><guilabel>For matching messages:</guilabel></term>
- <listitem>
- <para>
- Choose this to create your own set of rules for the
- vFolder. You may select one or more search criteria;
- the vFolder you create will contain messages that
- match all of them.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Messages from a certain person:</guilabel></term>
- <listitem>
- <para>
- The remaining three rules are simpler. Select this
- one to create a vFolder that will contain only
- messages from an address you enter.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Messages to a certain address:</guilabel</term>
- <listitem>
- <para>
- Any messages sent directly to this address will be in
- the vFolder you create. This vFolder is an absolute
- must for people with multiple email addresses.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Messages with a given subject:</guilabel></term>
- <listitem>
- <para>
- Enter a subject, and the vFolder will contain messages
- with that subject.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- The selection window is shown in <xref
- linkend="usage-mail-vfolder-fig-createrule">
-
- <figure id="usage-mail-vfolder-fig-createrule">
- <title>Selecting a vFolder Rule</title>
- <screenshot>
- <screeninfo>Selecting a vFolder Rule</screeninfo>
- <graphic fileref="fig/vfolder-createrule-fig" format="png" srccredit="Aaron Weber">
- </graphic>
- </screenshot>
- </figure>
- </para>
- <para>
-
- Once you click <guibutton>Next</guibutton>, you'll customize
- the vFolder rule. The rules for the vFolder you're creating
- will appear as phrases in the bottom pane of the window. You
- can click on the blue underlined text in the phrase to alter
- it to your liking. For example, when I create a vFolder to
- contain all messages from <email>rupert@helixcode.com</email>
- that have the word "evolution" in the message body, the bottom
- frame says: <computeroutput>The From address matches
- rupert@helixcode.com and the body contains
- "evolution".</computeroutput>.
- </para>
- </sect2>
-
- </sect1>
-</chapter>
diff --git a/help/C/usage-mainwindow.sgml b/help/C/usage-mainwindow.sgml
deleted file mode 100644
index 8a71f2d4f2..0000000000
--- a/help/C/usage-mainwindow.sgml
+++ /dev/null
@@ -1,420 +0,0 @@
-<!--
- <!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-<chapter id="usage-mainwindow">
-
- <title>The Main Window: Evolution Basics</title>
- <para>
- Start <application>Evolution</application> by selecting
- <guimenuitem>Evolution</guimenuitem> from the
- <guisubmenu>Applications</guisubmenu> of the <guimenu>Main Panel
- Menu</guimenu>, or by typing <command>evolution</command> at the
- command-line. The first time you run the program, it will create
- a directory called <filename>evolution</filename> in your home
- directory, where it will keep all your
- <application>Evolution</application>-related files.
- </para>
- <para>
- After <application>Evolution</application> starts
- up, you will see the <interface>main window</interface>, with the
- <interface>Inbox</interface> open. It should look a lot like the
- picture in <xref linkend="usage-mainwindow-fig">. On the left of
- the <interface>main window</interface> is the <interface>shortcut
- bar</interface>, with several buttons in it. Just underneath the
- title bar is a series of menus in the <interface>menu
- bar</interface>, and below that, the <interface>tool
- bar</interface> with buttons for different functions. The largest
- part of the <interface>main window</interface> is taken up by the
- actual <interface>Inbox</interface>, where messages are listed
- and displayed. If you're running the program for the first time,
- you'll have just one message: a welcome from Helix Code.
-
-
-<!-- ==============Figure=================================== -->
- <figure id="usage-mainwindow-fig">
- <title>Evolution Main Window and Inbox</title>
- <screenshot>
- <screeninfo>Evolution Main Window</screeninfo>
- <graphic fileref="fig/mainwindow-pic" format="png" srccredit="Kevin Breit">
- </graphic>
- </screenshot>
- </figure>
-<!-- ==============End of Figure=================================== -->
-</para>
-
- <para>
- <note>
- <title>The Way Evolution Looks</title>
- <para>
- The appearance of both <application>Evolution</application>
- and <application>GNOME</application> is very easy to
- customize, so your screen might not look like this picture.
- You might configure <application>Evolution</application> to
- start with a different view, without the <interface>shortcut
- bar</interface>, or with the <link
- linkend="usage-mainwindow-folderbar">folder bar</link>
- instead.
- </para>
- </note>
- </para>
-
- <sect1 id="usage-mainwindow-shortcutbar">
- <title>The Shortcut Bar</title>
- <para>
- <application>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 category buttons.
- </para>
- <para>
- The category buttons are <guibutton>Evolution
- Shortcuts</guibutton> and <guibutton>Internet
- Directories</guibutton>. When you click on them, they'll slide
- up and down to give you access to different sorts of shortcuts.
- When you first start <application>Evolution</application>, you
- are looking at the <guilabel>Evolution Shortcuts</guilabel>
- category. If you click <guilabel>Internet
- Directories</guilabel>, it will slide up and you'll see buttons
- for the <guilabel>Bigfoot</guilabel> and
- <guilabel>Netcenter</guilabel> directories, as well as any
- others you or your system administrator might have added.
- Internet directories behave a lot like the local contact
- manager, which is covered in <xref linkend="usage-contact">.
- </para>
- <para>
- Take a look at the <guilabel>Evolution Shortcuts</guilabel>
- again. They are:
-
- <variablelist>
-
-<!-- NOT IMPLEMENTED!
- <varlistentry>
- <term> <guibutton>Today:</guibutton></term>
- <listitem>
- <para>
- This will bring up a summary of any new messages you've
- received, along with the tasks and appointments you have
- lined up for today.
- </para>
- </listitem>
- </varlistentry>
--->
-
- <varlistentry>
- <term> <guibutton>Inbox:</guibutton></term>
- <listitem>
- <para>
- The Inbox will show you all of your email. Your Inbox
- is also where you can access 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 To do 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>Contacts:</guibutton></term>
- <listitem>
- <para>
- The Contact Manager holds your addresses, phone numbers,
- and contact 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>
- <listitem>
- <para>
- The <guibutton>Tasks:</guibutton> tool combines a "to
- do" list with reminders to help you keep track of
- daily events.
- </para>
- </listitem>
- </varlistentry>
--->
- <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>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>
- <para>
- If you prefer to use a keyboard shortcut, or <glossterm>hot
- key</glossterm>, you can use those instead. They're shown next
- to their equivalent menu items in the menu bar. You can also set
- your own hot keys for functions that don't have any; this is
- covered in <xref linkend="config">. If you're using the
- keyboard shortcuts you may also want to hide the
- <interface>shortcut bar</interface> by selecting
- <menuchoice> <guimenu>View</guimenu> <guimenuitem>Show Shortcut
- Bar</guimenuitem> </menuchoice>.
- </para>
-
- <tip>
- <title>Two Shortcut Bar Tricks</title>
- <para>
- To remove a shortcut from the shortcut bar, right-click on it
- and select <guimenuitem>Remove</guimenuitem>. </para>
- <para>
- To change the way the shortcut bar looks, right-click in an
- empoy space on the shortcut bar. From the menu that appears,
- you can select icon sizes.
- </para>
- </tip>
- </sect1>
-
- <sect1 id="usage-mainwindow-folderbar">
- <title>The Folder Bar</title>
- <para>
- The <interface>folder bar</interface> is a more comprehensive
- way to view the information you've stored with
- <application>Evolution</application>. It displays all your
- appointments, address cards, and email in a tree that's a lot
- like a <glossterm>file tree</glossterm>&mdash; it starts small
- at the top, and branches downwards. On most computers, there
- will be three folders at the base. The first one is
- <guilabel>VFolders</guilabel>, for virtual folders (discussed in
- <xref linkend="usage-mail-organize-vfolders">. The next one is
- <guilabel>External Directories</guilabel>, for contact
- directories stored on a network. The most important one is
- probably <guilabel>Local</guilabel>, which you can use to access
- all the data that's stored on your computer. If you click on
- the plus sign plus sign next to the <guilabel>Local</guilabel>
- folder, you'll see the contents:
- <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>Directories</guilabel>, for Internet contact directories.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Inbox</guilabel>, for incoming mail.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Outbox</guilabel>, which is for drafts of
- messages and mail that's already been sent.
- </para>
- </listitem>
- </itemizedlist>
-
- </para>
-
- <para>
- To create a new folder, select <menuchoice>
- <guimenu>File</guimenu> <guisubmenu>New</guisubmenu>
- <guimenuitem>Folder</guimenuitem></menuchoice>. You'll be asked where you want to
- put it, and what kind of folder it should be. You can choose
- from three types: <guilabel>Mail</guilabel>, for storing mail,
- <guilabel>Calendar</guilabel> for storing calendars, and
- <guilabel>Contacts</guilabel> for storing contacts.
- </para>
-
- <note>
- <title>Folders Have Limits</title>
- <para>
- You can always place a folder inside other folders,
- regardless of folder type. However, calendars,
- contacts, and mail can't go into the same
- folder. Calendars have to 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 GNOME, and <application>Evolution</application> is no
- exception. If you right-click on a folder, you'll have a
- menu with the following options:
- <itemizedlist>
- <listitem><para><guimenuitem>View</guimenuitem>, to view a message.</para></listitem>
- <listitem><para><guimenuitem>Something else</guimenuitem>, for another purpose. </para></listitem>
- <listitem><para><guimenuitem>Something else</guimenuitem>, for another purpose. </para></listitem>
- </itemizedlist>.
- </para>
-
- <tip>
- <title>Context-Sensitive Help</title>
- <para>
- GNOME 2.0 supports context-sensitive help, which means you can
- almost always get help on an item by right-clicking it. If
- you're not sure what something is, or don't know what you can
- do with it, choosing <guimenuitem>Help</guimenuitem> from the
- right-click menu is a good way to find out.
- </para>
- </tip>
-
- <para>
- Any time new information arrives in a folder, that folder label
- is displayed as bold text.
- </para>
- <para>
- To delete a folder, right-click it and select
- <guimenuitem>Delete</guimenuitem> from the menu that pops up.
- To change the order of folders, or put one inside another, use
- <glossterm>drag-and-drop</glossterm>. To move individual
- messages, appointments, and address cards between folders, you
- can do the same thing: drag them where you want them, and
- they'll go.
- </para>
- </sect1>
- <sect1 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. That means that, depending on the context, menu bar items
- will change. If you're looking at your Inbox, most of the menu
- items will relate to mail; some will relate to other components
- of <application>Evolution</application> and some, especially
- those in the <guimenu>File Menu</guimenu> will relate to the
- application as a whole. This section describes those items that
- cover the application as a whole; items specific to mailer are
- discussed in the mail chapter, calendar items in the calendar
- chapter, and so forth.
- </para>
- <para>
- <variablelist>
- <varlistentry>
- <term> <guimenu>File</guimenu> Menu</term>
-
- <listitem><para>
- Anything related to a file falls under this
- menu:
- <itemizedlist>
- <listitem><para>
- <guisubmenu>New... &mdash; </guisubmenu> If you
- want to create a new folder, calendar,
- appointment, address card, or message, this is
- where you should look.
- </para></listitem>
-
- <listitem><para>
- <guimenuitem>Go to Folder &mdash; </guimenuitem>
- Select this item, then choose which folder you'd
- like to view.
- </para></listitem>
- <listitem><para>
- <guimenuitem>Exit &mdash; </guimenuitem> Quits the application.
- </para></listitem>
-
- <listitem><para>
- <guimenuitem>Print... &mdash; </guimenuitem> Opens the printing
- dialog box so you can print items from the view pane of
- <application>Evolution</application>.
- </para></listitem>
- </itemizedlist>
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Edit</guimenu> Menu </term>
- <listitem><para>
- Although it doesn't contain anything at first,
- the <guimenu>Edit</guimenu> menu fills up with
- useful editing tools when you're... editing.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Tools</guimenu> Menu </term>
- <listitem><para> All of your assistants and configuration
- tools go here. For the <interface>Inbox</interface>, that
- means things like <guimenuitem>Mail
- Configuration</guimenuitem> and the <guimenuitem>vFolder
- Editor</guimenuitem>. For the
- <interface>Calendar</interface> and the <interface>Contact
- Manager</interface> </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Actions</guimenu> Menu </term>
- <listitem><para>
- This menu contains a list of actions you can perform on
- the information you've stored with
- <application>Evolution</application>. The contents vary
- depending on the view, but for the
- <interface>Inbox</interface>, it contains items like
- <guimenuitem>Mark All Messages Read</guimenuitem> and
- <guimenuitem>Expunge</guimenuitem>, to erase all the
- messages you've marked for deletion.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Help</guimenu> Menu</term>
- <listitem><para>
- Select among these items to open the
- <application>Help Browser</application> to the appropriate section.
- </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'lql
- start with your email inbox: you've got a letter waiting for you
- already.
- </para>
- </sect1>
-</chapter>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/help/C/usage-notes.sgml b/help/C/usage-notes.sgml
deleted file mode 100644
index a4161da810..0000000000
--- a/help/C/usage-notes.sgml
+++ /dev/null
@@ -1,41 +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 notes.
- Even now, notes are an almost necessary part of our lives. It
- only makes sense that <application> Evolution</application> has
- a Notes feature. <application>Evolution</application> can help
- you take notes in the following ways:
- <itemizedlist>
- <listitem>
- <para>
- You can take down phone numbers, take school notes, take phone
- messages, or even write poetry.
- </para>
- </listitem>
- <listitem>
- <para>
- You can color code each note to help cateogrize each note into
- a topic.
- </para>
- </listitem>
- <listitem>
- <para>
- Something
- </para>
- </listitem>
- <listitem>
- <para>
- Something
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- You can start writing notes by clicking <guibutton>Notes</guibutton> in the
- shortcut bar.
- </para>
- </abstract>
-</chapter>
diff --git a/help/C/usage-sync.sgml b/help/C/usage-sync.sgml
deleted file mode 100644
index 07325e1848..0000000000
--- a/help/C/usage-sync.sgml
+++ /dev/null
@@ -1,22 +0,0 @@
-
- <chapter id="usage-sync">
- <title>Synchronizing with a Hand-held Device</title>
- <para>
- Once you've set up a synchronization system, it pretty much
- takes care of itself. Not only that, it's entirely possible
- that your system administrator has set it up for you. All
- that this chapter covers is how to use that system once it's
- installed and configured. If you need to set it up, consult
- <xref linkend="config-sync">.
- </para>
-
- <para>
- If you've already got Gnome-pilot set up to use
- <application>Evolution</application>, put
- your hand-held device on the cradle and press the HotSync
- button.
- </para>
- <para>
- No, really. That's all there is to it.
- </para>
- </chapter> \ No newline at end of file
diff --git a/help/Camel-Classes b/help/Camel-Classes
deleted file mode 100644
index 93aec087dd..0000000000
--- a/help/Camel-Classes
+++ /dev/null
@@ -1,35 +0,0 @@
-CamelException
-CamelProvider
-CamelThreadProxy
-CamelURL
-GtkObject
- + CamelObject
- + CamelAddress
- | + CamelInternetAddress
- | ` CamelNewsAddress
- + CamelDataWrapper
- | + CamelMedium
- | | ` CamelMimePart
- | | ` CamelMimeMessage
- | ` CamelMultipart
- + CamelFolder
- | ` CamelFolderPtProxy
- + CamelFolderSearch
- + CamelFolderSummary
- + CamelMimeFilter
- | + CamelMimeFilterBasic
- | + CamelMimeFilterCharset
- | + CamelMimeFilterIndex
- | ` CamelMimeFilterSave
- + CamelService
- | + CamelStore
- | ` CamelTransport
- + CamelSession
- + CamelStream
- | + CamelSeekableStream
- | | + CamelSeekableSubstream
- | | + CamelStreamFs
- | | ` CamelStreamMem
- | + CamelStreamBuffer
- | ` CamelStreamFilter
- ` CamelThreadProxy \ No newline at end of file
diff --git a/help/ChangeLog b/help/ChangeLog
deleted file mode 100644
index 9aedca8af0..0000000000
--- a/help/ChangeLog
+++ /dev/null
@@ -1,329 +0,0 @@
-2000-08-09 Aaron Weber <aaron@helixcode.com>
-
- * 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.
-
-
-<<<<<<< ChangeLog
-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.
-
->>>>>>> 1.15
-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.
-
->>>>>>> 1.13
-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.
-
->>>>>>> 1.12
-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/Design b/help/Design
deleted file mode 100644
index 7b7cf6f821..0000000000
--- a/help/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/help/Makefile.am b/help/Makefile.am
deleted file mode 100644
index 7b5420fee8..0000000000
--- a/help/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = C devel
diff --git a/help/devel/.cvsignore b/help/devel/.cvsignore
deleted file mode 100644
index c24a54fbcc..0000000000
--- a/help/devel/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-Makefile.in
-html
-evolution-devel-guide.html
diff --git a/help/devel/ChangeLog b/help/devel/ChangeLog
deleted file mode 100644
index 7e0c8147ba..0000000000
--- a/help/devel/ChangeLog
+++ /dev/null
@@ -1,35 +0,0 @@
-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/help/devel/Makefile.am b/help/devel/Makefile.am
deleted file mode 100644
index 0d3cec5a1c..0000000000
--- a/help/devel/Makefile.am
+++ /dev/null
@@ -1,64 +0,0 @@
-SUBDIRS = calendar
-
-# The name of the module.
-DOC_MODULE=evolution-devel-guide
-
-# The top-level SGML file.
-DOC_MAIN_SGML_FILE=evolution-devel-guide.sgml
-
-HTML_DIR=$(datadir)/gnome/html
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-evolution_devel_guidedir = $(HTML_DIR)
-evolution_devel_guide_DATA = \
- evolution-devel-guide.html
-
-content_files = \
- evolution-devel-guide.sgml
-
-EXTRA_DIST = \
- $(evolution_devel_guide_DATA) \
- $(content_files)
-
-if ENABLE_GTK_DOC
-evolution-devel-guide.html: html/book1.html
- -cd $(srcdir) && cp html/book1.html evolution-devel-guide.html
-else
-evolution-devel-guide.html:
-endif
-
-html/book1.html: $(content-files)
- $(MAKE) html
-
-html:
- test -d $(srcdir)/html || mkdir $(srcdir)/html
- -cd $(srcdir)/html && gtkdoc-mkhtml $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
-
-clean-local:
- rm -f *~ *.bak *.signals *-unused.txt
-
-maintainer-clean-local:
- cd $(srcdir) && rm -rf html
-
-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); \
- echo '-- Fixing Crossreferences' ; \
- gtkdoc-fixxref --module=$(DOC_MODULE) --html-dir=$(HTML_DIR)|| true; \
- fi)
-
-dist-hook:
- mkdir $(distdir)/html
- -cp $(srcdir)/html/*.html $(srcdir)/html/*.css $(distdir)/html
-
-.PHONY: html
diff --git a/help/devel/calendar/.cvsignore b/help/devel/calendar/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/help/devel/calendar/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/help/devel/calendar/Makefile.am b/help/devel/calendar/Makefile.am
deleted file mode 100644
index 2220e1d59b..0000000000
--- a/help/devel/calendar/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-SUBDIRS = cal-client cal-util
-
-EXTRA_DIST = \
- architecture.sgml \
- evolution-calendar.sgml \
- reference.sgml
diff --git a/help/devel/calendar/architecture.sgml b/help/devel/calendar/architecture.sgml
deleted file mode 100644
index 08e4c82b35..0000000000
--- a/help/devel/calendar/architecture.sgml
+++ /dev/null
@@ -1,94 +0,0 @@
- <chapter id="calendar-architecture">
- <title>Architecture of the Calendar</title>
-
- <para>
- This chapter gives an overview of the Evolution Calendar
- architecture. It describes the model/view split of the calendar
- into a personal calendar server, or PCS, and the GUI clients
- that appear inside the Evolution shell.
- </para>
-
- <!-- Model/View Separation -->
-
- <sect1 id="calendar-model-view">
- <title>Model/View Separation</title>
-
- <para>
- Like other base components in Evolution, the calendar
- separates the data model from the views or clients. This is
- done so that multiple clients can access the same calendar
- data in an orderly fashion and without clashes. For example,
- the user may be running a graphical calendar client. If he
- then wants to synchronize his calendar with a handheld device,
- then the corresponding synchronization program (e.g. a conduit
- for the <application>gnome-pilot</application> package) will
- also need to access the calendar storage. It is important
- that both the GUI client and the synchronization program keep
- a consistent view of the calendar at all times, otherwise one
- of them will be left in an inconsistent state if the
- calendar's data changes unexpectedly.
- </para>
-
- <para>
- Evolution puts the calendar storage in a daemon called the
- Wombat and completely separates it from clients who wants to
- access calendar data. This part of the Wombat is called the
- personal calendar server, or &PCS;. Clients must contact the
- &PCS; and ask it to open an existing calendar or create a new
- one. When a calendar component object (e.g. an appointment or
- to-do item) changes in the &PCS; it will notify all the
- clients that are using the component's parent calendar.
- </para>
- </sect1>
-
- <!-- Personal Calendar Server -->
-
- <sect1>
- <title>Personal Calendar Server</title>
-
- <para>
- The personal calendar server, or &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>
-
- </para>
- </formalpara>
- </sect1>
- </chapter>
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../evolution-devel-guide.sgml" "book" "part" "")
-End:
--->
diff --git a/help/devel/calendar/cal-client/.cvsignore b/help/devel/calendar/cal-client/.cvsignore
deleted file mode 100644
index 0842a93f7a..0000000000
--- a/help/devel/calendar/cal-client/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-sgml
-Makefile
-Makefile.in
diff --git a/help/devel/calendar/cal-client/Makefile.am b/help/devel/calendar/cal-client/Makefile.am
deleted file mode 100644
index 44d43639a8..0000000000
--- a/help/devel/calendar/cal-client/Makefile.am
+++ /dev/null
@@ -1,76 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-# The name of the module.
-DOC_MODULE=evolution-cal-client
-
-# The top-level SGML file.
-DOC_MAIN_SGML_FILE=evolution-cal-client.sgml
-
-# The directory containing the source code (if it contains documentation).
-DOC_SOURCE_DIR=$(EVOLUTION_DIR)/calendar/cal-client
-
-CFLAGS =" \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I$(top_builddir)/libical/src/libical \
- -I$(top_srcdir)/libical/src/libical \
- $(BONOBO_VFS_GNOME_CFLAGS) \
- "
-
-LDFLAGS=" \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(top_builddir)/calendar/cal-client/.libs/libcal-client.a \
- $(top_builddir)/calendar/cal-util/.libs/libcal-util.a \
- $(top_builddir)/libical/src/libical/libical.a \
- $(top_builddir)/libversit/.libs/libversit.al \
- "
-
-HTML_DIR=$(datadir)/gnome/html
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-tmpl_sources = \
- tmpl/cal-client.sgml \
- tmpl/evolution-cal-client-unused.sgml
-
-evolution_cal_client_docdir = $(HTML_DIR)
-evolution_cal_client_doc_DATA = \
- evolution-cal-client.hierarchy \
- evolution-cal-client.types \
- evolution-cal-client-decl.txt \
- evolution-cal-client-sections.txt
-
-EXTRA_DIST = \
- $(evolution_cal_client_doc_DATA)
-
-sgml/evolution-cal-client-doc.bottom: $(tmpl_sources)
- $(MAKE) sgml
-
-scan:
- -(cd $(srcdir) \
- && env CFLAGS=$(CFLAGS) LDFLAGS=$(LDFLAGS) \
- gtkdoc-scanobj --module=$(DOC_MODULE) \
- && gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="cal-listener.h evolution-calendar.h" )
-
-templates: scan
- cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE)
-
-sgml:
- cd $(srcdir) \
- && gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR)
-
-clean-local:
- rm -f *~ *.bak *.signals *-unused.txt
-
-maintainer-clean-local: clean
- cd $(srcdir) && rm -rf sgml $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
-
-dist-hook:
- mkdir $(distdir)/sgml
- mkdir $(distdir)/tmpl
- -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
- -cp $(srcdir)/sgml/*.sgml $(distdir)/sgml
- -cp $(srcdir)/sgml/*.bottom $(srcdir)/sgml/*.top $(distdir)/sgml
-
-.PHONY : sgml templates scan
diff --git a/help/devel/calendar/cal-client/evolution-cal-client-decl.txt b/help/devel/calendar/cal-client/evolution-cal-client-decl.txt
deleted file mode 100644
index 0574d70678..0000000000
--- a/help/devel/calendar/cal-client/evolution-cal-client-decl.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-<MACRO>
-<NAME>CAL_CLIENT_TYPE</NAME>
-#define CAL_CLIENT_TYPE (cal_client_get_type ())
-</MACRO>
-<MACRO>
-<NAME>CAL_CLIENT</NAME>
-#define CAL_CLIENT(obj) (GTK_CHECK_CAST ((obj), CAL_CLIENT_TYPE, CalClient))
-</MACRO>
-<MACRO>
-<NAME>CAL_CLIENT_CLASS</NAME>
-#define CAL_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_CLIENT_TYPE, CalClientClass))
-</MACRO>
-<MACRO>
-<NAME>IS_CAL_CLIENT</NAME>
-#define IS_CAL_CLIENT(obj) (GTK_CHECK_TYPE ((obj), CAL_CLIENT_TYPE))
-</MACRO>
-<MACRO>
-<NAME>IS_CAL_CLIENT_CLASS</NAME>
-#define IS_CAL_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_CLIENT_TYPE))
-</MACRO>
-<STRUCT>
-<NAME>CalClient</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalClientClass</NAME>
-</STRUCT>
-<ENUM>
-<NAME>CalClientLoadStatus</NAME>
-typedef enum {
- CAL_CLIENT_LOAD_SUCCESS,
- CAL_CLIENT_LOAD_ERROR,
- CAL_CLIENT_LOAD_IN_USE,
- CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED
-} CalClientLoadStatus;
-</ENUM>
-<ENUM>
-<NAME>CalClientGetStatus</NAME>
-typedef enum {
- CAL_CLIENT_GET_SUCCESS,
- CAL_CLIENT_GET_NOT_FOUND,
- CAL_CLIENT_GET_SYNTAX_ERROR
-} CalClientGetStatus;
-</ENUM>
-<STRUCT>
-<NAME>CalClient</NAME>
-struct CalClient {
- GtkObject object;
-
- /* Private data */
- gpointer priv;
-};
-</STRUCT>
-<FUNCTION>
-<NAME>cal_client_get_type</NAME>
-<RETURNS>GtkType </RETURNS>
-void
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_construct</NAME>
-<RETURNS>CalClient *</RETURNS>
-CalClient *client
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_new</NAME>
-<RETURNS>CalClient *</RETURNS>
-void
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_load_calendar</NAME>
-<RETURNS>gboolean </RETURNS>
-CalClient *client, const char *str_uri
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_create_calendar</NAME>
-<RETURNS>gboolean </RETURNS>
-CalClient *client, const char *str_uri
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_n_objects</NAME>
-<RETURNS>int </RETURNS>
-CalClient *client, CalObjType type
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_object</NAME>
-<RETURNS>CalClientGetStatus </RETURNS>
-CalClient *client,const char *uid,CalComponent **comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_uid_by_pilot_id</NAME>
-<RETURNS>CalClientGetStatus </RETURNS>
-CalClient *client,unsigned long pilot_id,char **uid
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_update_pilot_id</NAME>
-<RETURNS>void </RETURNS>
-CalClient *client, char *uid,unsigned long pilot_id,unsigned long pilot_status
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_uids</NAME>
-<RETURNS>GList *</RETURNS>
-CalClient *client, CalObjType type
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_objects_in_range</NAME>
-<RETURNS>GList *</RETURNS>
-CalClient *client, CalObjType type,time_t start, time_t end
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_generate_instances</NAME>
-<RETURNS>void </RETURNS>
-CalClient *client, CalObjType type,time_t start, time_t end,CalRecurInstanceFn cb, gpointer cb_data
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_alarms_in_range</NAME>
-<RETURNS>GList *</RETURNS>
-CalClient *client, time_t start, time_t end
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_get_alarms_for_object</NAME>
-<RETURNS>gboolean </RETURNS>
-CalClient *client, const char *uid,time_t start, time_t end,GList **alarms
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_update_object</NAME>
-<RETURNS>gboolean </RETURNS>
-CalClient *client, CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_client_remove_object</NAME>
-<RETURNS>gboolean </RETURNS>
-CalClient *client, const char *uid
-</FUNCTION>
diff --git a/help/devel/calendar/cal-client/evolution-cal-client-sections.txt b/help/devel/calendar/cal-client/evolution-cal-client-sections.txt
deleted file mode 100644
index c37b223247..0000000000
--- a/help/devel/calendar/cal-client/evolution-cal-client-sections.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-<INCLUDE>cal-client/cal-client.h</INCLUDE>
-
-<SECTION>
-<FILE>cal-client</FILE>
-CAL_CLIENT
-<TITLE>CalClient</TITLE>
-
-CalClientLoadStatus
-CalClientGetStatus
-cal_client_new
-cal_client_load_calendar
-cal_client_create_calendar
-cal_client_get_n_objects
-cal_client_get_object
-cal_client_get_objects_in_range
-cal_client_generate_instances
-cal_client_get_uid_by_pilot_id
-cal_client_update_pilot_id
-cal_client_get_uids
-cal_client_get_alarms_in_range
-cal_client_get_alarms_for_object
-cal_client_update_object
-cal_client_remove_object
-
-<SUBSECTION Standard>
-
-CAL_CLIENT_TYPE
-IS_CAL_CLIENT
-CAL_CLIENT_CLASS
-IS_CAL_CLIENT_CLASS
-cal_client_get_type
-cal_client_construct
-
-<SUBSECTION Private>
-CalClient
-
-</SECTION>
diff --git a/help/devel/calendar/cal-client/evolution-cal-client.args b/help/devel/calendar/cal-client/evolution-cal-client.args
deleted file mode 100644
index e69de29bb2..0000000000
--- a/help/devel/calendar/cal-client/evolution-cal-client.args
+++ /dev/null
diff --git a/help/devel/calendar/cal-client/evolution-cal-client.hierarchy b/help/devel/calendar/cal-client/evolution-cal-client.hierarchy
deleted file mode 100644
index 88efa3e673..0000000000
--- a/help/devel/calendar/cal-client/evolution-cal-client.hierarchy
+++ /dev/null
@@ -1,2 +0,0 @@
-GtkObject
- CalClient
diff --git a/help/devel/calendar/cal-client/evolution-cal-client.signals b/help/devel/calendar/cal-client/evolution-cal-client.signals
deleted file mode 100644
index 97e360b6a2..0000000000
--- a/help/devel/calendar/cal-client/evolution-cal-client.signals
+++ /dev/null
@@ -1,21 +0,0 @@
-<SIGNAL>
-<NAME>CalClient::cal-loaded</NAME>
-<RETURNS>void</RETURNS>
-CalClient *calclient
-GtkEnum arg1
-</SIGNAL>
-
-<SIGNAL>
-<NAME>CalClient::obj-updated</NAME>
-<RETURNS>void</RETURNS>
-CalClient *calclient
-GtkString arg1
-</SIGNAL>
-
-<SIGNAL>
-<NAME>CalClient::obj-removed</NAME>
-<RETURNS>void</RETURNS>
-CalClient *calclient
-GtkString arg1
-</SIGNAL>
-
diff --git a/help/devel/calendar/cal-client/evolution-cal-client.types b/help/devel/calendar/cal-client/evolution-cal-client.types
deleted file mode 100644
index 84d65a6637..0000000000
--- a/help/devel/calendar/cal-client/evolution-cal-client.types
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <gnome.h>
-#include <cal-client/cal-client.h>
-
-cal_client_get_type
diff --git a/help/devel/calendar/cal-client/tmpl/cal-client.sgml b/help/devel/calendar/cal-client/tmpl/cal-client.sgml
deleted file mode 100644
index a146709b8a..0000000000
--- a/help/devel/calendar/cal-client/tmpl/cal-client.sgml
+++ /dev/null
@@ -1,291 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CalClient
-
-<!-- ##### SECTION Short_Description ##### -->
-GTK+ object for communication with personal calendar server.
-
-<!-- ##### SECTION Long_Description ##### -->
- <para>
- The #CalClient object provides a nice GTK+ wrapper for the CORBA
- interfaces that are used to communicate between calendar clients
- and the personal calendar server in the user's Wombat daemon.
- </para>
-
- <para>
- After a #CalClient object is created with cal_client_new(), it
- should be asked to send a request to the personal calendar server
- to load or create a calendar based on its URI. The server will
- asynchronously notify the client about completion of the request,
- and will return an appropriate result code; this should be noted
- by the client with the <link
- linkend="CalClient--cal-loaded">cal_loaded</link> signal.
- </para>
-
- <para>
- When a client asks the server to update or delete a calendar
- component from the storage, the server will do so and then notify
- all the clients about the update or removal. This is the core of
- the model/view split between calendar clients and the storage in
- the personal calendar server. Clients should watch the <link
- linkend="calclient-obj-updated">obj_updated</link> and <link
- linkend="calclient-obj-removed">obj_removed</link> signals on the
- CalClient objects they create so that they can be notified about
- changes in the storage.
- </para>
-
-<!-- ##### SECTION See_Also ##### -->
- <para>
-
- </para>
-
-<!-- ##### MACRO CAL_CLIENT ##### -->
- <para>
- Casts a #GtkObject to a #CalClient.
- </para>
-
-@obj: A GTK+ object.
-
-
-<!-- ##### ENUM CalClientLoadStatus ##### -->
- <para>
- These values describe the status of a calendar load or create
- request. After asking a calendar factory to load or create a
- calendar, the provided listener will get notification about the
- result in asynchronous fashion. Such notification is represented
- by one of these enumeration values. For values other than
- #CAL_CLIENT_LOAD_SUCCESS, the #CalClient object will not accept
- any other operations on the calendar and it should just be
- destroyed.
- </para>
-
-@CAL_CLIENT_LOAD_SUCCESS: Indicates a successful load or create
- operation; the corresponding calendar is ready for use.
-@CAL_CLIENT_LOAD_ERROR: Indicates an error while loading or creating
- the calendar.
-@CAL_CLIENT_LOAD_IN_USE: Indicates that a create request failed
- because the specified calendar was already being used by another
- client.
-@CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED: Indicates an error due to
- trying to load a calendar for which a backend type is not present.
-
-<!-- ##### ENUM CalClientGetStatus ##### -->
- <para>
- These values describe the result of the cal_client_get_object()
- function.
- </para>
-
-@CAL_CLIENT_GET_SUCCESS: Indicates a successful get operation.
-@CAL_CLIENT_GET_NOT_FOUND: Indicates that the requested object was
- not found.
-@CAL_CLIENT_GET_SYNTAX_ERROR: Indicates a syntax error when parsing
- the requested object. This could indicate a bug in the calendar
- client libraries or in the Wombat server.
-
-<!-- ##### FUNCTION cal_client_new ##### -->
-<para>
-
-</para>
-
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_load_calendar ##### -->
-<para>
-
-</para>
-
-@client:
-@str_uri:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_create_calendar ##### -->
-<para>
-
-</para>
-
-@client:
-@str_uri:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_get_n_objects ##### -->
-<para>
-
-</para>
-
-@client:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_get_object ##### -->
-<para>
-
-</para>
-
-@client:
-@uid:
-@comp:
-@Returns:
-<!-- # Unused Parameters # -->
-@ico:
-
-
-<!-- ##### FUNCTION cal_client_get_objects_in_range ##### -->
-<para>
-
-</para>
-
-@client:
-@type:
-@start:
-@end:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_generate_instances ##### -->
-<para>
-
-</para>
-
-@client:
-@type:
-@start:
-@end:
-@cb:
-@cb_data:
-
-
-<!-- ##### FUNCTION cal_client_get_uid_by_pilot_id ##### -->
-<para>
-
-</para>
-
-@client:
-@pilot_id:
-@uid:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_update_pilot_id ##### -->
-<para>
-
-</para>
-
-@client:
-@uid:
-@pilot_id:
-@pilot_status:
-
-
-<!-- ##### FUNCTION cal_client_get_uids ##### -->
-<para>
-
-</para>
-
-@client:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_get_alarms_in_range ##### -->
-<para>
-
-</para>
-
-@client:
-@start:
-@end:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_get_alarms_for_object ##### -->
-<para>
-
-</para>
-
-@client:
-@uid:
-@start:
-@end:
-@alarms:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_client_update_object ##### -->
-<para>
-
-</para>
-
-@client:
-@comp:
-@Returns:
-<!-- # Unused Parameters # -->
-@ico:
-
-
-<!-- ##### FUNCTION cal_client_remove_object ##### -->
-<para>
-
-</para>
-
-@client:
-@uid:
-@Returns:
-
-
-<!-- ##### SIGNAL CalClient::cal-loaded ##### -->
- <para>
- This signal is emitted some time after the calendar clients sends
- a load or create request to the personal calendar server. The
- server will notify the client asynchronously of the completion of
- the request. The @status parameter indicates the status of the
- request.
- </para>
-
-@calclient: the object which received the signal.
-@arg1:
-<!-- # Unused Parameters # -->
-@client: Calendar client which received the notification.
-@status: Status of the request. See the description of
- #CalClientLoadStatus for more details.
-
-<!-- ##### SIGNAL CalClient::obj-updated ##### -->
- <para>
- This signal is emitted when the calendar clients receives
- notification of a calendar component's data being changed in the
- personal calendar server. Graphical clients may want to get the
- new version of the object and update their display, for example.
- </para>
-
-@calclient: the object which received the signal.
-@arg1:
-<!-- # Unused Parameters # -->
-@client: Calendar client which received the notification.
-@uid: Unique identifier of the calendar component that changed in the
- personal calendar server's storage.
-
-<!-- ##### SIGNAL CalClient::obj-removed ##### -->
- <para>
- This signal is emitted when the calendar client receives
- notification for a calendar component being removed from the
- storage in the personal calendar server. Graphical clients may
- want to delete the corresponding object from their display, for
- example.
- </para>
-
-@calclient: the object which received the signal.
-@arg1:
-<!-- # Unused Parameters # -->
-@client: Calendar client which received the notification.
-@uid: Unique identifier of the calendar component that was removed
- from the personal calendar server's storage.
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../../../evolution-devel-guide.sgml" "book" "refsect2" "")
-End:
--->
-
diff --git a/help/devel/calendar/cal-client/tmpl/evolution-cal-client-unused.sgml b/help/devel/calendar/cal-client/tmpl/evolution-cal-client-unused.sgml
deleted file mode 100644
index 5576dbd57f..0000000000
--- a/help/devel/calendar/cal-client/tmpl/evolution-cal-client-unused.sgml
+++ /dev/null
@@ -1,10 +0,0 @@
-<!-- ##### FUNCTION cal_client_get_events_in_range ##### -->
-<para>
-
-</para>
-
-@client:
-@start:
-@end:
-@Returns:
-
diff --git a/help/devel/calendar/cal-util/.cvsignore b/help/devel/calendar/cal-util/.cvsignore
deleted file mode 100644
index 0842a93f7a..0000000000
--- a/help/devel/calendar/cal-util/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-sgml
-Makefile
-Makefile.in
diff --git a/help/devel/calendar/cal-util/Makefile.am b/help/devel/calendar/cal-util/Makefile.am
deleted file mode 100644
index 8861aa03cb..0000000000
--- a/help/devel/calendar/cal-util/Makefile.am
+++ /dev/null
@@ -1,75 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-# The name of the module.
-DOC_MODULE=evolution-cal-util
-
-# The top-level SGML file.
-DOC_MAIN_SGML_FILE=evolution-cal-util.sgml
-
-# The directory containing the source code (if it contains documentation).
-DOC_SOURCE_DIR=$(EVOLUTION_DIR)/calendar/cal-util
-
-CFLAGS =" \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I$(top_builddir)/libical/src/libical \
- -I$(top_srcdir)/libical/src/libical \
- $(BONOBO_VFS_GNOME_CFLAGS) \
- "
-
-LDFLAGS=" \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(top_builddir)/calendar/cal-util/.libs/libcal-util.a \
- $(top_builddir)/libical/src/libical/libical.a \
- $(top_builddir)/libversit/.libs/libversit.al \
- "
-
-HTML_DIR=$(datadir)/gnome/html
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-tmpl_sources = \
- tmpl/cal-util.sgml \
- tmpl/evolution-cal-util-unused.sgml
-
-evolution_cal_util_docdir = $(HTML_DIR)
-evolution_cal_util_doc_DATA = \
- evolution-cal-util.hierarchy \
- evolution-cal-util.types \
- evolution-cal-util-decl.txt \
- evolution-cal-util-sections.txt
-
-EXTRA_DIST = \
- $(evolution_cal_util_doc_DATA)
-
-sgml/evolution-cal-util-doc.bottom: $(tmpl_sources)
- $(MAKE) sgml
-
-scan:
- -(cd $(srcdir) \
- && env CFLAGS=$(CFLAGS) LDFLAGS=$(LDFLAGS) \
- gtkdoc-scanobj --module=$(DOC_MODULE) \
- && gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="calobj.h icalendar-save.h icalendar.h" )
-
-templates: scan
- cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE)
-
-sgml:
- cd $(srcdir) \
- && gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR)
-
-clean-local:
- rm -f *~ *.bak *.signals *-unused.txt
-
-maintainer-clean-local: clean
- cd $(srcdir) && rm -rf sgml $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
-
-dist-hook:
- mkdir $(distdir)/sgml
- mkdir $(distdir)/tmpl
- -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
- -cp $(srcdir)/sgml/*.sgml $(distdir)/sgml
- -cp $(srcdir)/sgml/*.bottom $(srcdir)/sgml/*.top $(distdir)/sgml
-
-.PHONY : sgml templates scan
diff --git a/help/devel/calendar/cal-util/evolution-cal-util-decl.txt b/help/devel/calendar/cal-util/evolution-cal-util-decl.txt
deleted file mode 100644
index eb108b868f..0000000000
--- a/help/devel/calendar/cal-util/evolution-cal-util-decl.txt
+++ /dev/null
@@ -1,852 +0,0 @@
-<MACRO>
-<NAME>CAL_COMPONENT_TYPE</NAME>
-#define CAL_COMPONENT_TYPE (cal_component_get_type ())
-</MACRO>
-<MACRO>
-<NAME>CAL_COMPONENT</NAME>
-#define CAL_COMPONENT(obj) (GTK_CHECK_CAST ((obj), CAL_COMPONENT_TYPE, CalComponent))
-</MACRO>
-<MACRO>
-<NAME>CAL_COMPONENT_CLASS</NAME>
-#define CAL_COMPONENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CAL_COMPONENT_TYPE, \
- CalComponentClass))
-</MACRO>
-<MACRO>
-<NAME>IS_CAL_COMPONENT</NAME>
-#define IS_CAL_COMPONENT(obj) (GTK_CHECK_TYPE ((obj), CAL_COMPONENT_TYPE))
-</MACRO>
-<MACRO>
-<NAME>IS_CAL_COMPONENT_CLASS</NAME>
-#define IS_CAL_COMPONENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), CAL_COMPONENT_TYPE))
-</MACRO>
-<ENUM>
-<NAME>CalComponentVType</NAME>
-typedef enum {
- CAL_COMPONENT_NO_TYPE,
- CAL_COMPONENT_EVENT,
- CAL_COMPONENT_TODO,
- CAL_COMPONENT_JOURNAL,
- CAL_COMPONENT_FREEBUSY,
- CAL_COMPONENT_TIMEZONE
-} CalComponentVType;
-</ENUM>
-<ENUM>
-<NAME>CalComponentField</NAME>
-typedef enum {
- CAL_COMPONENT_FIELD_CATEGORIES, /* concatenation of the categories list */
- CAL_COMPONENT_FIELD_CLASSIFICATION,
- CAL_COMPONENT_FIELD_COMPLETED,
- CAL_COMPONENT_FIELD_DTEND,
- CAL_COMPONENT_FIELD_DTSTART,
- CAL_COMPONENT_FIELD_DUE,
- CAL_COMPONENT_FIELD_GEO,
- CAL_COMPONENT_FIELD_PERCENT,
- CAL_COMPONENT_FIELD_PRIORITY,
- CAL_COMPONENT_FIELD_SUMMARY,
- CAL_COMPONENT_FIELD_TRANSPARENCY,
- CAL_COMPONENT_FIELD_URL,
- CAL_COMPONENT_FIELD_HAS_ALARMS, /* not a real field */
- CAL_COMPONENT_FIELD_ICON, /* not a real field */
- CAL_COMPONENT_FIELD_COMPLETE, /* not a real field */
- CAL_COMPONENT_FIELD_RECURRING, /* not a real field */
- CAL_COMPONENT_FIELD_OVERDUE, /* not a real field */
- CAL_COMPONENT_FIELD_COLOR, /* not a real field */
- CAL_COMPONENT_FIELD_NUM_FIELDS
-} CalComponentField;
-</ENUM>
-<ENUM>
-<NAME>CalComponentClassification</NAME>
-typedef enum {
- CAL_COMPONENT_CLASS_NONE,
- CAL_COMPONENT_CLASS_PUBLIC,
- CAL_COMPONENT_CLASS_PRIVATE,
- CAL_COMPONENT_CLASS_CONFIDENTIAL,
- CAL_COMPONENT_CLASS_UNKNOWN
-} CalComponentClassification;
-</ENUM>
-<TYPEDEF>
-<NAME>CalComponentDateTime</NAME>
-typedef struct {
- /* Actual date/time value */
- struct icaltimetype *value;
-
- /* Timezone ID */
- const char *tzid;
-} CalComponentDateTime;
-</TYPEDEF>
-<ENUM>
-<NAME>CalComponentPeriodType</NAME>
-typedef enum {
- CAL_COMPONENT_PERIOD_DATETIME,
- CAL_COMPONENT_PERIOD_DURATION
-} CalComponentPeriodType;
-</ENUM>
-<TYPEDEF>
-<NAME>CalComponentPeriod</NAME>
-typedef struct {
- CalComponentPeriodType type;
-
- struct icaltimetype start;
-
- union {
- struct icaltimetype end;
- struct icaldurationtype duration;
- } u;
-} CalComponentPeriod;
-</TYPEDEF>
-<TYPEDEF>
-<NAME>CalComponentText</NAME>
-typedef struct {
- /* Description string */
- const char *value;
-
- /* Alternate representation URI */
- const char *altrep;
-} CalComponentText;
-</TYPEDEF>
-<ENUM>
-<NAME>CalComponentTransparency</NAME>
-typedef enum {
- CAL_COMPONENT_TRANSP_NONE,
- CAL_COMPONENT_TRANSP_TRANSPARENT,
- CAL_COMPONENT_TRANSP_OPAQUE,
- CAL_COMPONENT_TRANSP_UNKNOWN
-} CalComponentTransparency;
-</ENUM>
-<STRUCT>
-<NAME>CalComponentAlarm</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalComponent</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalComponentClass</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalComponentPrivate</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalComponent</NAME>
-struct CalComponent {
- GtkObject object;
-
- /* Private data */
- CalComponentPrivate *priv;
-};
-</STRUCT>
-<FUNCTION>
-<NAME>cal_component_get_type</NAME>
-<RETURNS>GtkType </RETURNS>
-void
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_gen_uid</NAME>
-<RETURNS>char *</RETURNS>
-void
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_new</NAME>
-<RETURNS>CalComponent *</RETURNS>
-void
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_clone</NAME>
-<RETURNS>CalComponent *</RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_new_vtype</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentVType type
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_icalcomponent</NAME>
-<RETURNS>gboolean </RETURNS>
-CalComponent *comp, icalcomponent *icalcomp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_icalcomponent</NAME>
-<RETURNS>icalcomponent *</RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_vtype</NAME>
-<RETURNS>CalComponentVType </RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_as_string</NAME>
-<RETURNS>char *</RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_commit_sequence</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_uid</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, const char **uid
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_uid</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, const char *uid
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_categories_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **categ_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_categories_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *categ_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_classification</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentClassification *classif
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_classification</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentClassification classif
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_comment_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **text_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_comment_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *text_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_completed</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype **t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_completed</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_created</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype **t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_created</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_description_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **text_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_description_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *text_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_dtend</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_dtend</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_dtstamp</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_dtstamp</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_dtstart</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_dtstart</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_due</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_due</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_exdate_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **exdate_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_exdate_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *exdate_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_exrule_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **recur_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_exrule_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *recur_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_geo</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icalgeotype **geo
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_geo</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icalgeotype *geo
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_last_modified</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype **t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_last_modified</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_percent</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int **percent
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_percent</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int *percent
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_priority</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int **priority
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_priority</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int *priority
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_rdate_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **period_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_rdate_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *period_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_has_rdates</NAME>
-<RETURNS>gboolean </RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_rrule_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList **recur_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_rrule_list</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, GSList *recur_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_has_rrules</NAME>
-<RETURNS>gboolean </RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_sequence</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int **sequence
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_sequence</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, int *sequence
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_summary</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentText *summary
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_summary</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentText *summary
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_transparency</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentTransparency *transp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_transparency</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, CalComponentTransparency transp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_url</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, const char **url
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_url</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, const char *url
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_pilot_id</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, unsigned long *pilot_id
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_pilot_id</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, unsigned long pilot_id
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_pilot_status</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, unsigned long *pilot_status
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_set_pilot_status</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp, unsigned long pilot_status
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_categories_list</NAME>
-<RETURNS>void </RETURNS>
-GSList *categ_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_datetime</NAME>
-<RETURNS>void </RETURNS>
-CalComponentDateTime *dt
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_exdate_list</NAME>
-<RETURNS>void </RETURNS>
-GSList *exdate_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_geo</NAME>
-<RETURNS>void </RETURNS>
-struct icalgeotype *geo
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_icaltimetype</NAME>
-<RETURNS>void </RETURNS>
-struct icaltimetype *t
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_percent</NAME>
-<RETURNS>void </RETURNS>
-int *percent
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_priority</NAME>
-<RETURNS>void </RETURNS>
-int *priority
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_period_list</NAME>
-<RETURNS>void </RETURNS>
-GSList *period_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_recur_list</NAME>
-<RETURNS>void </RETURNS>
-GSList *recur_list
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_sequence</NAME>
-<RETURNS>void </RETURNS>
-int *sequence
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_free_text_list</NAME>
-<RETURNS>void </RETURNS>
-GSList *text_list
-</FUNCTION>
-<ENUM>
-<NAME>CalComponentAlarmAction</NAME>
-typedef enum {
- CAL_COMPONENT_ALARM_NONE,
- CAL_COMPONENT_ALARM_AUDIO,
- CAL_COMPONENT_ALARM_DISPLAY,
- CAL_COMPONENT_ALARM_EMAIL,
- CAL_COMPONENT_ALARM_PROCEDURE,
- CAL_COMPONENT_ALARM_UNKNOWN
-} CalComponentAlarmAction;
-</ENUM>
-<ENUM>
-<NAME>CalComponentAlarmTriggerType</NAME>
-typedef enum {
- CAL_COMPONENT_ALARM_TRIGGER_RELATIVE,
- CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE
-} CalComponentAlarmTriggerType;
-</ENUM>
-<ENUM>
-<NAME>CalComponentAlarmTriggerRelated</NAME>
-typedef enum {
- CAL_COMPONENT_ALARM_TRIGGER_RELATED_START,
- CAL_COMPONENT_ALARM_TRIGGER_RELATED_END
-} CalComponentAlarmTriggerRelated;
-</ENUM>
-<TYPEDEF>
-<NAME>CalComponentAlarmTrigger</NAME>
-typedef struct {
- CalComponentAlarmTriggerType type;
-
- union {
- struct {
- struct icaldurationtype duration;
- CalComponentAlarmTriggerRelated related;
- } relative;
-
- struct icaltimetype absolute;
- } u;
-} CalComponentAlarmTrigger;
-</TYPEDEF>
-<FUNCTION>
-<NAME>cal_component_get_first_alarm</NAME>
-<RETURNS>CalComponentAlarm *</RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_get_next_alarm</NAME>
-<RETURNS>CalComponentAlarm *</RETURNS>
-CalComponent *comp
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_free</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarm *alarm
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_get_action</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarm *alarm, CalComponentAlarmAction *action
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_set_action</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarm *alarm, CalComponentAlarmAction action
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_get_trigger</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarm *alarm, CalComponentAlarmTrigger **trigger
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_set_trigger</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarm *alarm, CalComponentAlarmTrigger *trigger
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_component_alarm_free_trigger</NAME>
-<RETURNS>void </RETURNS>
-CalComponentAlarmTrigger *trigger
-</FUNCTION>
-<ENUM>
-<NAME>CalRecurType</NAME>
-typedef enum {
- CAL_RECUR_YEARLY,
- CAL_RECUR_MONTHLY,
- CAL_RECUR_WEEKLY,
- CAL_RECUR_DAILY,
- CAL_RECUR_HOURLY,
- CAL_RECUR_MINUTELY,
- CAL_RECUR_SECONDLY
-} CalRecurType;
-</ENUM>
-<TYPEDEF>
-<NAME>CalRecurrence</NAME>
-typedef struct {
- CalRecurType type;
-
- int interval;
-
- /* Specifies the end of the recurrence. No occurrences are generated
- after this date. If it is 0, the event recurs forever. */
- time_t enddate;
-
- /* WKST property - the week start day: 0 = Monday to 6 = Sunday. */
- gint week_start_day;
-
-
- /* NOTE: I've used GList's here, but it doesn't matter if we use
- other data structures like arrays. The code should be easy to
- change. So long as it is easy to see if the modifier is set. */
-
- /* For BYMONTH modifier. A list of GINT_TO_POINTERs, 0-11. */
- GList *bymonth;
-
- /* For BYWEEKNO modifier. A list of GINT_TO_POINTERs, [+-]1-53. */
- GList *byweekno;
-
- /* For BYYEARDAY modifier. A list of GINT_TO_POINTERs, [+-]1-366. */
- GList *byyearday;
-
- /* For BYMONTHDAY modifier. A list of GINT_TO_POINTERs, [+-]1-31. */
- GList *bymonthday;
-
- /* For BYDAY modifier. A list of GINT_TO_POINTERs, in pairs.
- The first of each pair is the weekday, 0 = Monday to 6 = Sunday.
- The second of each pair is the week number [+-]0-53. */
- GList *byday;
-
- /* For BYHOUR modifier. A list of GINT_TO_POINTERs, 0-23. */
- GList *byhour;
-
- /* For BYMINUTE modifier. A list of GINT_TO_POINTERs, 0-59. */
- GList *byminute;
-
- /* For BYSECOND modifier. A list of GINT_TO_POINTERs, 0-60. */
- GList *bysecond;
-
- /* For BYSETPOS modifier. A list of GINT_TO_POINTERs, +ve or -ve. */
- GList *bysetpos;
-} CalRecurrence;
-</TYPEDEF>
-<STRUCT>
-<NAME>CalObjTime</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>CalObjTime</NAME>
-struct CalObjTime {
- guint16 year;
- guint8 month; /* 0 - 11 */
- guint8 day; /* 1 - 31 */
- guint8 hour; /* 0 - 23 */
- guint8 minute; /* 0 - 59 */
- guint8 second; /* 0 - 59 (maybe 60 for leap second) */
-};
-</STRUCT>
-<USER_FUNCTION>
-<NAME>CalRecurInstanceFn</NAME>
-<RETURNS>gboolean </RETURNS>
-CalComponent *comp,
- time_t instance_start,
- time_t instace_end,
- gpointer data
-</USER_FUNCTION>
-<FUNCTION>
-<NAME>cal_recur_generate_instances</NAME>
-<RETURNS>void </RETURNS>
-CalComponent *comp,time_t start,time_t end,CalRecurInstanceFn cb,gpointer cb_data
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_recur_from_icalrecurrencetype</NAME>
-<RETURNS>CalRecurrence *</RETURNS>
-struct icalrecurrencetype *ir
-</FUNCTION>
-<FUNCTION>
-<NAME>cal_recur_free</NAME>
-<RETURNS>void </RETURNS>
-CalRecurrence *r
-</FUNCTION>
-<TYPEDEF>
-<NAME>CalObjInstance</NAME>
-typedef struct {
- char *uid; /* UID of the object */
- time_t start; /* Start time of instance */
- time_t end; /* End time of instance */
-} CalObjInstance;
-</TYPEDEF>
-<FUNCTION>
-<NAME>cal_obj_instance_list_free</NAME>
-<RETURNS>void </RETURNS>
-GList *list
-</FUNCTION>
-<TYPEDEF>
-<NAME>CalAlarmInstance</NAME>
-typedef struct {
- char *uid; /* UID of object */
-#if 0
- enum AlarmType type; /* Type of alarm */
-#endif
- time_t trigger; /* Alarm trigger time */
- time_t occur; /* Occurrence time */
-} CalAlarmInstance;
-</TYPEDEF>
-<FUNCTION>
-<NAME>cal_alarm_instance_list_free</NAME>
-<RETURNS>void </RETURNS>
-GList *list
-</FUNCTION>
-<ENUM>
-<NAME>CalObjType</NAME>
-typedef enum {
- CALOBJ_TYPE_EVENT = 1 << 0,
- CALOBJ_TYPE_TODO = 1 << 1,
- CALOBJ_TYPE_JOURNAL = 1 << 2,
- CALOBJ_TYPE_ANY = 0x07
-} CalObjType;
-</ENUM>
-<FUNCTION>
-<NAME>cal_obj_uid_list_free</NAME>
-<RETURNS>void </RETURNS>
-GList *list
-</FUNCTION>
-<FUNCTION>
-<NAME>time_from_icaltimetype</NAME>
-<RETURNS>time_t </RETURNS>
-struct icaltimetype itt
-</FUNCTION>
-<FUNCTION>
-<NAME>time_from_isodate</NAME>
-<RETURNS>time_t </RETURNS>
-char *str
-</FUNCTION>
-<FUNCTION>
-<NAME>time_from_start_duration</NAME>
-<RETURNS>time_t </RETURNS>
-time_t start, char *duration
-</FUNCTION>
-<FUNCTION>
-<NAME>isodate_from_time_t</NAME>
-<RETURNS>char *</RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>get_time_t_hour</NAME>
-<RETURNS>int </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>isodiff_to_secs</NAME>
-<RETURNS>int </RETURNS>
-char *str
-</FUNCTION>
-<FUNCTION>
-<NAME>isodiff_from_secs</NAME>
-<RETURNS>char *</RETURNS>
-int secs
-</FUNCTION>
-<FUNCTION>
-<NAME>time_add_minutes</NAME>
-<RETURNS>time_t </RETURNS>
-time_t time, int minutes
-</FUNCTION>
-<FUNCTION>
-<NAME>time_add_day</NAME>
-<RETURNS>time_t </RETURNS>
-time_t time, int days
-</FUNCTION>
-<FUNCTION>
-<NAME>time_add_week</NAME>
-<RETURNS>time_t </RETURNS>
-time_t time, int weeks
-</FUNCTION>
-<FUNCTION>
-<NAME>time_add_month</NAME>
-<RETURNS>time_t </RETURNS>
-time_t time, int months
-</FUNCTION>
-<FUNCTION>
-<NAME>time_add_year</NAME>
-<RETURNS>time_t </RETURNS>
-time_t time, int years
-</FUNCTION>
-<FUNCTION>
-<NAME>format_simple_hour</NAME>
-<RETURNS>char *</RETURNS>
-int hour, int use_am_pm
-</FUNCTION>
-<FUNCTION>
-<NAME>time_days_in_month</NAME>
-<RETURNS>int </RETURNS>
-int year, int month
-</FUNCTION>
-<FUNCTION>
-<NAME>time_from_day</NAME>
-<RETURNS>time_t </RETURNS>
-int year, int month, int day
-</FUNCTION>
-<FUNCTION>
-<NAME>time_day_hour</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t, int hour
-</FUNCTION>
-<FUNCTION>
-<NAME>time_year_begin</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_year_end</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_month_begin</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_month_end</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_week_begin</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_week_end</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_day_begin</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>time_day_end</NAME>
-<RETURNS>time_t </RETURNS>
-time_t t
-</FUNCTION>
-<FUNCTION>
-<NAME>parse_date</NAME>
-<RETURNS>time_t </RETURNS>
-char *str
-</FUNCTION>
-<FUNCTION>
-<NAME>print_time_t</NAME>
-<RETURNS>void </RETURNS>
-time_t t
-</FUNCTION>
diff --git a/help/devel/calendar/cal-util/evolution-cal-util-sections.txt b/help/devel/calendar/cal-util/evolution-cal-util-sections.txt
deleted file mode 100644
index cd928fc7e3..0000000000
--- a/help/devel/calendar/cal-util/evolution-cal-util-sections.txt
+++ /dev/null
@@ -1,166 +0,0 @@
-<SECTION>
-<FILE>cal-component</FILE>
-CAL_COMPONENT
-<TITLE>CalComponent</TITLE>
-
-CalComponentVType
-CalComponentField
-CalComponentClassification
-CalComponentDateTime
-CalComponentPeriodType
-CalComponentPeriod
-CalComponentText
-CalComponentTransparency
-CalComponentAlarm
-CalComponentPrivate
-
-cal_component_gen_uid
-cal_component_new
-cal_component_clone
-cal_component_set_new_vtype
-cal_component_set_icalcomponent
-cal_component_get_icalcomponent
-cal_component_get_vtype
-cal_component_get_as_string
-cal_component_commit_sequence
-cal_component_get_uid
-cal_component_set_uid
-cal_component_get_categories_list
-cal_component_set_categories_list
-cal_component_get_classification
-cal_component_set_classification
-cal_component_get_comment_list
-cal_component_set_comment_list
-cal_component_get_completed
-cal_component_set_completed
-cal_component_get_created
-cal_component_set_created
-cal_component_get_description_list
-cal_component_set_description_list
-cal_component_get_dtend
-cal_component_set_dtend
-cal_component_get_dtstamp
-cal_component_set_dtstamp
-cal_component_get_dtstart
-cal_component_set_dtstart
-cal_component_get_due
-cal_component_set_due
-cal_component_get_exdate_list
-cal_component_set_exdate_list
-cal_component_get_exrule_list
-cal_component_set_exrule_list
-cal_component_get_geo
-cal_component_set_geo
-cal_component_get_last_modified
-cal_component_set_last_modified
-cal_component_get_percent
-cal_component_set_percent
-cal_component_get_priority
-cal_component_set_priority
-cal_component_get_rdate_list
-cal_component_set_rdate_list
-cal_component_has_rdates
-cal_component_get_rrule_list
-cal_component_set_rrule_list
-cal_component_has_rrules
-cal_component_get_sequence
-cal_component_set_sequence
-cal_component_get_summary
-cal_component_set_summary
-cal_component_get_transparency
-cal_component_set_transparency
-cal_component_get_url
-cal_component_set_url
-cal_component_get_pilot_id
-cal_component_set_pilot_id
-cal_component_get_pilot_status
-cal_component_set_pilot_status
-
-cal_component_free_categories_list
-cal_component_free_datetime
-cal_component_free_exdate_list
-cal_component_free_geo
-cal_component_free_icaltimetype
-cal_component_free_percent
-cal_component_free_priority
-cal_component_free_period_list
-cal_component_free_recur_list
-cal_component_free_sequence
-cal_component_free_text_list
-
-CalComponentAlarmAction
-CalComponentAlarmTriggerType
-CalComponentAlarmTriggerRelated
-CalComponentAlarmTrigger
-
-cal_component_get_first_alarm
-cal_component_get_next_alarm
-cal_component_alarm_free
-cal_component_alarm_get_action
-cal_component_alarm_set_action
-cal_component_alarm_get_trigger
-cal_component_alarm_set_trigger
-cal_component_alarm_free_trigger
-
-<SUBSECTION Standard>
-CAL_COMPONENT_TYPE
-CAL_COMPONENT_CLASS
-IS_CAL_COMPONENT
-IS_CAL_COMPONENT_CLASS
-cal_component_get_type
-
-<SUBSECTION Private>
-CalComponent
-
-</SECTION>
-
-<SECTION>
-<FILE>cal-recur</FILE>
-CalRecurType
-CalRecurrence
-CalObjTime
-CalRecurInstanceFn
-cal_recur_generate_instances
-cal_recur_from_icalrecurrencetype
-cal_recur_free
-</SECTION>
-
-<SECTION>
-<FILE>cal-util</FILE>
-CalObjInstance
-cal_obj_instance_list_free
-CalAlarmInstance
-cal_alarm_instance_list_free
-CalObjType
-cal_obj_uid_list_free
-</SECTION>
-
-<SECTION>
-<FILE>timeutil</FILE>
-time_from_icaltimetype
-time_from_isodate
-time_from_start_duration
-isodate_from_time_t
-get_time_t_hour
-isodiff_to_secs
-isodiff_from_secs
-time_add_minutes
-time_add_day
-time_add_week
-time_add_month
-time_add_year
-format_simple_hour
-time_days_in_month
-time_from_day
-time_day_hour
-time_year_begin
-time_year_end
-time_month_begin
-time_month_end
-time_week_begin
-time_week_end
-time_day_begin
-time_day_end
-parse_date
-print_time_t
-</SECTION>
diff --git a/help/devel/calendar/cal-util/evolution-cal-util.args b/help/devel/calendar/cal-util/evolution-cal-util.args
deleted file mode 100644
index e69de29bb2..0000000000
--- a/help/devel/calendar/cal-util/evolution-cal-util.args
+++ /dev/null
diff --git a/help/devel/calendar/cal-util/evolution-cal-util.hierarchy b/help/devel/calendar/cal-util/evolution-cal-util.hierarchy
deleted file mode 100644
index cc235653f2..0000000000
--- a/help/devel/calendar/cal-util/evolution-cal-util.hierarchy
+++ /dev/null
@@ -1,2 +0,0 @@
-GtkObject
- CalComponent
diff --git a/help/devel/calendar/cal-util/evolution-cal-util.signals b/help/devel/calendar/cal-util/evolution-cal-util.signals
deleted file mode 100644
index e69de29bb2..0000000000
--- a/help/devel/calendar/cal-util/evolution-cal-util.signals
+++ /dev/null
diff --git a/help/devel/calendar/cal-util/evolution-cal-util.types b/help/devel/calendar/cal-util/evolution-cal-util.types
deleted file mode 100644
index 52b2d9bf90..0000000000
--- a/help/devel/calendar/cal-util/evolution-cal-util.types
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <gnome.h>
-#include <cal-util/cal-component.h>
-
-cal_component_get_type
diff --git a/help/devel/calendar/cal-util/tmpl/cal-component.sgml b/help/devel/calendar/cal-util/tmpl/cal-component.sgml
deleted file mode 100644
index 2f800e583f..0000000000
--- a/help/devel/calendar/cal-util/tmpl/cal-component.sgml
+++ /dev/null
@@ -1,934 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CalComponent
-
-<!-- ##### SECTION Short_Description ##### -->
-RFC 2445 iCalendar component object.
-
-<!-- ##### SECTION Long_Description ##### -->
- <para>
- The #CalComponent object provides a wrapper over the &libical;
- functions for manipulating calendar components. #CalComponent
- presents a GTK+-like interface to calendar components according to
- RFC 2445.
- </para>
-
- <para>
- While &libical; supports almost all of the features of the
- iCalendar RFCs, applications are normally not interested in all
- the mindless gunk that is there. Still, applications should do
- their best not to drop extension fields from calendar components
- or any other extra information they do not support (including
- standard fields they are not interested in). The #CalComponent
- object provides a wrapper over
- <structname>icalcomponent</structname> structures from &libical;
- so that no information in them will be lost even if the
- application is not designed to handle it. Also, #CalComponent
- provides a higher-level API to many of the &libical; operations so
- as to make it less painful to deal with iCalendar components.
- </para>
-
- <para>
- A #CalComponent object starts out empty. It must be initialized
- from an existing <structname>icalcomponent</structname> structure
- by using the cal_component_set_icalcomponent() function, or from a
- completely new data by specifying the desired component type to
- the cal_component_set_new_vtype() function.
- </para>
-
- <para>
- #CalComponent will create an internal map of the properties in the
- <structname>icalcomponent</structname> structure and then allow
- random access to them via the #CalComponent API functions;
- normally the &libical; API would have to be used by creating many
- iterators and other unpleasant constructs. #CalComponent keeps
- handles to the properties it scanned from the
- <structname>icalcomponent</structname> and will let the parent
- application modify them at any time without having to do any
- iteration.
- </para>
-
- <para>
- Eventually a #CalComponent may be turned into the RFC 2445 string
- representation of an iCalendar component by using the
- cal_component_get_as_string() function. Applications can then
- transfer this interoperable
- <footnote>
- <para>
- &ldquo;Interoperable.&rdquo; Heavens, I love that word.
- </para>
- </footnote>
- string to other programs that deal with iCalendar.
- </para>
-
-<!-- ##### SECTION See_Also ##### -->
- <para>
-
- </para>
-
-<!-- ##### MACRO CAL_COMPONENT ##### -->
- <para>
- Casts a #GtkObject to a #CalComponent.
- </para>
-
-@obj: A GTK+ object.
-
-
-<!-- ##### ENUM CalComponentVType ##### -->
- <para>
- Calendar component types as defined by RFC 2445. These values can
- be used to create a new calendar component by passing them to the
- cal_component_set_new_vtype() function. They are also the return
- value of the cal_component_get_vtype() function. The only time
- the @CAL_COMPONENT_NO_TYPE value is used is when querying the
- vtype of an uninitialized #CalComponent.
- </para>
-
-@CAL_COMPONENT_NO_TYPE: Returned from cal_component_get_vtype() to
- indicate an uninitialized #CalComponent object.
-
-@CAL_COMPONENT_EVENT: Indicates a VEVENT component.
-@CAL_COMPONENT_TODO: Indicates a VTODO component.
-@CAL_COMPONENT_JOURNAL: Indicates a VJOURNAL component.
-@CAL_COMPONENT_FREEBUSY: Indicates a VFREEBUSY component.
-@CAL_COMPONENT_TIMEZONE: Indicates a VTIMEZOME component.
-
-<!-- ##### ENUM CalComponentField ##### -->
- <para>
- These values are used as identifiers for #ETable columns. These
- are used by the calendar GUI code in Evolution.
- </para>
-
-@CAL_COMPONENT_FIELD_CATEGORIES: Component's list of categories.
-@CAL_COMPONENT_FIELD_CLASSIFICATION: Component's classification.
-@CAL_COMPONENT_FIELD_COMPLETED: Component's completion date.
-@CAL_COMPONENT_FIELD_DTEND: Component's ending date.
-@CAL_COMPONENT_FIELD_DTSTART: Component's starting date.
-@CAL_COMPONENT_FIELD_DUE: Component's due date.
-@CAL_COMPONENT_FIELD_GEO: Component's geographical position.
-@CAL_COMPONENT_FIELD_PERCENT: Component's percent completed value.
-@CAL_COMPONENT_FIELD_PRIORITY: Component's priority.
-@CAL_COMPONENT_FIELD_SUMMARY: Component's summary.
-@CAL_COMPONENT_FIELD_TRANSPARENCY: Component's transparency value.
-@CAL_COMPONENT_FIELD_URL: Component's URL.
-@CAL_COMPONENT_FIELD_HAS_ALARMS: Whether the component has any alarms.
-@CAL_COMPONENT_FIELD_ICON: Which icon to use for the component.
-@CAL_COMPONENT_FIELD_COMPLETE: Whether the component has been completed.
-@CAL_COMPONENT_FIELD_RECURRING: Whether the component has any recurrences.
-@CAL_COMPONENT_FIELD_OVERDUE: Whether the component is overdue.
-@CAL_COMPONENT_FIELD_COLOR: Which color to use for the component.
-@CAL_COMPONENT_FIELD_NUM_FIELDS: Total number of enumerated fields.
-
-<!-- ##### ENUM CalComponentClassification ##### -->
- <para>
- Values for the access classification property of a calendar
- component.
- </para>
-
-@CAL_COMPONENT_CLASS_NONE: Indicates that no access classification has
- been set for the corresponding component.
-
-@CAL_COMPONENT_CLASS_PUBLIC: Public access.
-@CAL_COMPONENT_CLASS_PRIVATE: Private access.
-@CAL_COMPONENT_CLASS_CONFIDENTIAL: Confidential access.
-
-@CAL_COMPONENT_CLASS_UNKNOWN: Unknown access classification value,
- used when &libical; returns something #CalComponent does not know
- about.
-
-<!-- ##### TYPEDEF CalComponentDateTime ##### -->
- <para>
- This structure defines a date and time value.
- </para>
-
-
-<!-- ##### ENUM CalComponentPeriodType ##### -->
- <para>
- Defines how a period of time is specified.
- </para>
-
-@CAL_COMPONENT_PERIOD_DATETIME: Indicates that the period is specified
- by starting and ending date/time values.
-
-@CAL_COMPONENT_PERIOD_DURATION: Indicates that the period is specified
- as a starding date/time and a duration value.
-
-<!-- ##### TYPEDEF CalComponentPeriod ##### -->
- <para>
- This structure defines a period of time.
- </para>
-
-
-<!-- ##### TYPEDEF CalComponentText ##### -->
- <para>
- This structure defines the value of a text property that may have
- an alternate representation parameter.
- </para>
-
-
-<!-- ##### ENUM CalComponentTransparency ##### -->
-<para>
-
-</para>
-
-@CAL_COMPONENT_TRANSP_NONE:
-@CAL_COMPONENT_TRANSP_TRANSPARENT:
-@CAL_COMPONENT_TRANSP_OPAQUE:
-@CAL_COMPONENT_TRANSP_UNKNOWN:
-
-<!-- ##### STRUCT CalComponentAlarm ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT CalComponentPrivate ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION cal_component_gen_uid ##### -->
-<para>
-
-</para>
-
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_new ##### -->
-<para>
-
-</para>
-
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_clone ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_set_new_vtype ##### -->
-<para>
-
-</para>
-
-@comp:
-@type:
-
-
-<!-- ##### FUNCTION cal_component_set_icalcomponent ##### -->
-<para>
-
-</para>
-
-@comp:
-@icalcomp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_icalcomponent ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_vtype ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_as_string ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_commit_sequence ##### -->
-<para>
-
-</para>
-
-@comp:
-
-
-<!-- ##### FUNCTION cal_component_get_uid ##### -->
-<para>
-
-</para>
-
-@comp:
-@uid:
-
-
-<!-- ##### FUNCTION cal_component_set_uid ##### -->
-<para>
-
-</para>
-
-@comp:
-@uid:
-
-
-<!-- ##### FUNCTION cal_component_get_categories_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@categ_list:
-
-
-<!-- ##### FUNCTION cal_component_set_categories_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@categ_list:
-
-
-<!-- ##### FUNCTION cal_component_get_classification ##### -->
-<para>
-
-</para>
-
-@comp:
-@classif:
-
-
-<!-- ##### FUNCTION cal_component_set_classification ##### -->
-<para>
-
-</para>
-
-@comp:
-@classif:
-
-
-<!-- ##### FUNCTION cal_component_get_comment_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@text_list:
-
-
-<!-- ##### FUNCTION cal_component_set_comment_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@text_list:
-
-
-<!-- ##### FUNCTION cal_component_get_completed ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_set_completed ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_get_created ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_set_created ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_get_description_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@text_list:
-
-
-<!-- ##### FUNCTION cal_component_set_description_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@text_list:
-
-
-<!-- ##### FUNCTION cal_component_get_dtend ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_set_dtend ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_get_dtstamp ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_set_dtstamp ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_get_dtstart ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_set_dtstart ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_get_due ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_set_due ##### -->
-<para>
-
-</para>
-
-@comp:
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_get_exdate_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@exdate_list:
-
-
-<!-- ##### FUNCTION cal_component_set_exdate_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@exdate_list:
-
-
-<!-- ##### FUNCTION cal_component_get_exrule_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@recur_list:
-
-
-<!-- ##### FUNCTION cal_component_set_exrule_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@recur_list:
-
-
-<!-- ##### FUNCTION cal_component_get_geo ##### -->
-<para>
-
-</para>
-
-@comp:
-@geo:
-
-
-<!-- ##### FUNCTION cal_component_set_geo ##### -->
-<para>
-
-</para>
-
-@comp:
-@geo:
-
-
-<!-- ##### FUNCTION cal_component_get_last_modified ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_set_last_modified ##### -->
-<para>
-
-</para>
-
-@comp:
-@t:
-
-
-<!-- ##### FUNCTION cal_component_get_percent ##### -->
-<para>
-
-</para>
-
-@comp:
-@percent:
-
-
-<!-- ##### FUNCTION cal_component_set_percent ##### -->
-<para>
-
-</para>
-
-@comp:
-@percent:
-
-
-<!-- ##### FUNCTION cal_component_get_priority ##### -->
-<para>
-
-</para>
-
-@comp:
-@priority:
-
-
-<!-- ##### FUNCTION cal_component_set_priority ##### -->
-<para>
-
-</para>
-
-@comp:
-@priority:
-
-
-<!-- ##### FUNCTION cal_component_get_rdate_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@period_list:
-
-
-<!-- ##### FUNCTION cal_component_set_rdate_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@period_list:
-
-
-<!-- ##### FUNCTION cal_component_has_rdates ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_rrule_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@recur_list:
-
-
-<!-- ##### FUNCTION cal_component_set_rrule_list ##### -->
-<para>
-
-</para>
-
-@comp:
-@recur_list:
-
-
-<!-- ##### FUNCTION cal_component_has_rrules ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_sequence ##### -->
-<para>
-
-</para>
-
-@comp:
-@sequence:
-
-
-<!-- ##### FUNCTION cal_component_set_sequence ##### -->
-<para>
-
-</para>
-
-@comp:
-@sequence:
-
-
-<!-- ##### FUNCTION cal_component_get_summary ##### -->
-<para>
-
-</para>
-
-@comp:
-@summary:
-
-
-<!-- ##### FUNCTION cal_component_set_summary ##### -->
-<para>
-
-</para>
-
-@comp:
-@summary:
-
-
-<!-- ##### FUNCTION cal_component_get_transparency ##### -->
-<para>
-
-</para>
-
-@comp:
-@transp:
-
-
-<!-- ##### FUNCTION cal_component_set_transparency ##### -->
-<para>
-
-</para>
-
-@comp:
-@transp:
-
-
-<!-- ##### FUNCTION cal_component_get_url ##### -->
-<para>
-
-</para>
-
-@comp:
-@url:
-
-
-<!-- ##### FUNCTION cal_component_set_url ##### -->
-<para>
-
-</para>
-
-@comp:
-@url:
-
-
-<!-- ##### FUNCTION cal_component_get_pilot_id ##### -->
-<para>
-
-</para>
-
-@comp:
-@pilot_id:
-
-
-<!-- ##### FUNCTION cal_component_set_pilot_id ##### -->
-<para>
-
-</para>
-
-@comp:
-@pilot_id:
-
-
-<!-- ##### FUNCTION cal_component_get_pilot_status ##### -->
-<para>
-
-</para>
-
-@comp:
-@pilot_status:
-
-
-<!-- ##### FUNCTION cal_component_set_pilot_status ##### -->
-<para>
-
-</para>
-
-@comp:
-@pilot_status:
-
-
-<!-- ##### FUNCTION cal_component_free_categories_list ##### -->
-<para>
-
-</para>
-
-@categ_list:
-
-
-<!-- ##### FUNCTION cal_component_free_datetime ##### -->
-<para>
-
-</para>
-
-@dt:
-
-
-<!-- ##### FUNCTION cal_component_free_exdate_list ##### -->
-<para>
-
-</para>
-
-@exdate_list:
-
-
-<!-- ##### FUNCTION cal_component_free_geo ##### -->
-<para>
-
-</para>
-
-@geo:
-
-
-<!-- ##### FUNCTION cal_component_free_icaltimetype ##### -->
-<para>
-
-</para>
-
-@t:
-
-
-<!-- ##### FUNCTION cal_component_free_percent ##### -->
-<para>
-
-</para>
-
-@percent:
-
-
-<!-- ##### FUNCTION cal_component_free_priority ##### -->
-<para>
-
-</para>
-
-@priority:
-
-
-<!-- ##### FUNCTION cal_component_free_period_list ##### -->
-<para>
-
-</para>
-
-@period_list:
-
-
-<!-- ##### FUNCTION cal_component_free_recur_list ##### -->
-<para>
-
-</para>
-
-@recur_list:
-
-
-<!-- ##### FUNCTION cal_component_free_sequence ##### -->
-<para>
-
-</para>
-
-@sequence:
-
-
-<!-- ##### FUNCTION cal_component_free_text_list ##### -->
-<para>
-
-</para>
-
-@text_list:
-
-
-<!-- ##### ENUM CalComponentAlarmAction ##### -->
-<para>
-
-</para>
-
-@CAL_COMPONENT_ALARM_NONE:
-@CAL_COMPONENT_ALARM_AUDIO:
-@CAL_COMPONENT_ALARM_DISPLAY:
-@CAL_COMPONENT_ALARM_EMAIL:
-@CAL_COMPONENT_ALARM_PROCEDURE:
-@CAL_COMPONENT_ALARM_UNKNOWN:
-
-<!-- ##### ENUM CalComponentAlarmTriggerType ##### -->
-<para>
-
-</para>
-
-@CAL_COMPONENT_ALARM_TRIGGER_RELATIVE:
-@CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE:
-
-<!-- ##### ENUM CalComponentAlarmTriggerRelated ##### -->
-<para>
-
-</para>
-
-@CAL_COMPONENT_ALARM_TRIGGER_RELATED_START:
-@CAL_COMPONENT_ALARM_TRIGGER_RELATED_END:
-
-<!-- ##### TYPEDEF CalComponentAlarmTrigger ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION cal_component_get_first_alarm ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_get_next_alarm ##### -->
-<para>
-
-</para>
-
-@comp:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_component_alarm_free ##### -->
-<para>
-
-</para>
-
-@alarm:
-
-
-<!-- ##### FUNCTION cal_component_alarm_get_action ##### -->
-<para>
-
-</para>
-
-@alarm:
-@action:
-
-
-<!-- ##### FUNCTION cal_component_alarm_set_action ##### -->
-<para>
-
-</para>
-
-@alarm:
-@action:
-
-
-<!-- ##### FUNCTION cal_component_alarm_get_trigger ##### -->
-<para>
-
-</para>
-
-@alarm:
-@trigger:
-
-
-<!-- ##### FUNCTION cal_component_alarm_set_trigger ##### -->
-<para>
-
-</para>
-
-@alarm:
-@trigger:
-
-
-<!-- ##### FUNCTION cal_component_alarm_free_trigger ##### -->
-<para>
-
-</para>
-
-@trigger:
-
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../../../evolution-devel-guide.sgml" "book" "refsect2" "")
-End:
--->
diff --git a/help/devel/calendar/cal-util/tmpl/cal-recur.sgml b/help/devel/calendar/cal-util/tmpl/cal-recur.sgml
deleted file mode 100644
index 703f8b2b85..0000000000
--- a/help/devel/calendar/cal-util/tmpl/cal-recur.sgml
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-cal-recur
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### ENUM CalRecurType ##### -->
-<para>
-
-</para>
-
-@CAL_RECUR_YEARLY:
-@CAL_RECUR_MONTHLY:
-@CAL_RECUR_WEEKLY:
-@CAL_RECUR_DAILY:
-@CAL_RECUR_HOURLY:
-@CAL_RECUR_MINUTELY:
-@CAL_RECUR_SECONDLY:
-
-<!-- ##### TYPEDEF CalRecurrence ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT CalObjTime ##### -->
-<para>
-
-</para>
-
-@year:
-@month:
-@day:
-@hour:
-@minute:
-@second:
-
-<!-- ##### USER_FUNCTION CalRecurInstanceFn ##### -->
-<para>
-
-</para>
-
-@comp:
-@instance_start:
-@instace_end:
-@data:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_recur_generate_instances ##### -->
-<para>
-
-</para>
-
-@comp:
-@start:
-@end:
-@cb:
-@cb_data:
-
-
-<!-- ##### FUNCTION cal_recur_from_icalrecurrencetype ##### -->
-<para>
-
-</para>
-
-@ir:
-@Returns:
-
-
-<!-- ##### FUNCTION cal_recur_free ##### -->
-<para>
-
-</para>
-
-@r:
-
-
diff --git a/help/devel/calendar/cal-util/tmpl/cal-util.sgml b/help/devel/calendar/cal-util/tmpl/cal-util.sgml
deleted file mode 100644
index 8d4516c2ec..0000000000
--- a/help/devel/calendar/cal-util/tmpl/cal-util.sgml
+++ /dev/null
@@ -1,62 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-cal-util
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### TYPEDEF CalObjInstance ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION cal_obj_instance_list_free ##### -->
-<para>
-
-</para>
-
-@list:
-
-
-<!-- ##### TYPEDEF CalAlarmInstance ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION cal_alarm_instance_list_free ##### -->
-<para>
-
-</para>
-
-@list:
-
-
-<!-- ##### ENUM CalObjType ##### -->
-<para>
-
-</para>
-
-@CALOBJ_TYPE_EVENT:
-@CALOBJ_TYPE_TODO:
-@CALOBJ_TYPE_JOURNAL:
-@CALOBJ_TYPE_ANY:
-
-<!-- ##### FUNCTION cal_obj_uid_list_free ##### -->
-<para>
-
-</para>
-
-@list:
-
-
diff --git a/help/devel/calendar/cal-util/tmpl/evolution-cal-util-unused.sgml b/help/devel/calendar/cal-util/tmpl/evolution-cal-util-unused.sgml
deleted file mode 100644
index e69de29bb2..0000000000
--- a/help/devel/calendar/cal-util/tmpl/evolution-cal-util-unused.sgml
+++ /dev/null
diff --git a/help/devel/calendar/cal-util/tmpl/timeutil.sgml b/help/devel/calendar/cal-util/tmpl/timeutil.sgml
deleted file mode 100644
index 3b62fbba3f..0000000000
--- a/help/devel/calendar/cal-util/tmpl/timeutil.sgml
+++ /dev/null
@@ -1,260 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-timeutil
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION time_from_icaltimetype ##### -->
-<para>
-
-</para>
-
-@itt:
-@Returns:
-
-
-<!-- ##### FUNCTION time_from_isodate ##### -->
-<para>
-
-</para>
-
-@str:
-@Returns:
-
-
-<!-- ##### FUNCTION time_from_start_duration ##### -->
-<para>
-
-</para>
-
-@start:
-@duration:
-@Returns:
-
-
-<!-- ##### FUNCTION isodate_from_time_t ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION get_time_t_hour ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION isodiff_to_secs ##### -->
-<para>
-
-</para>
-
-@str:
-@Returns:
-
-
-<!-- ##### FUNCTION isodiff_from_secs ##### -->
-<para>
-
-</para>
-
-@secs:
-@Returns:
-
-
-<!-- ##### FUNCTION time_add_minutes ##### -->
-<para>
-
-</para>
-
-@time:
-@minutes:
-@Returns:
-
-
-<!-- ##### FUNCTION time_add_day ##### -->
-<para>
-
-</para>
-
-@time:
-@days:
-@Returns:
-
-
-<!-- ##### FUNCTION time_add_week ##### -->
-<para>
-
-</para>
-
-@time:
-@weeks:
-@Returns:
-
-
-<!-- ##### FUNCTION time_add_month ##### -->
-<para>
-
-</para>
-
-@time:
-@months:
-@Returns:
-
-
-<!-- ##### FUNCTION time_add_year ##### -->
-<para>
-
-</para>
-
-@time:
-@years:
-@Returns:
-
-
-<!-- ##### FUNCTION format_simple_hour ##### -->
-<para>
-
-</para>
-
-@hour:
-@use_am_pm:
-@Returns:
-
-
-<!-- ##### FUNCTION time_days_in_month ##### -->
-<para>
-
-</para>
-
-@year:
-@month:
-@Returns:
-
-
-<!-- ##### FUNCTION time_from_day ##### -->
-<para>
-
-</para>
-
-@year:
-@month:
-@day:
-@Returns:
-
-
-<!-- ##### FUNCTION time_day_hour ##### -->
-<para>
-
-</para>
-
-@t:
-@hour:
-@Returns:
-
-
-<!-- ##### FUNCTION time_year_begin ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_year_end ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_month_begin ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_month_end ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_week_begin ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_week_end ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_day_begin ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION time_day_end ##### -->
-<para>
-
-</para>
-
-@t:
-@Returns:
-
-
-<!-- ##### FUNCTION parse_date ##### -->
-<para>
-
-</para>
-
-@str:
-@Returns:
-
-
-<!-- ##### FUNCTION print_time_t ##### -->
-<para>
-
-</para>
-
-@t:
-
-
diff --git a/help/devel/calendar/evolution-calendar.sgml b/help/devel/calendar/evolution-calendar.sgml
deleted file mode 100644
index f3936d9bbc..0000000000
--- a/help/devel/calendar/evolution-calendar.sgml
+++ /dev/null
@@ -1,51 +0,0 @@
- <part>
- <docinfo>
- <authorgroup>
- <author>
- <firstname>Federico</firstname>
- <surname>Mena Quintero</surname>
- <affiliation>
- <address>
- <email>federico@helixcode.com</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
- </docinfo>
-
- <title>Developing Applications for the Evolution Calendar</title>
-
- <partintro>
- <para>
- This part of the Evolution Developer's Guide describes how to
- write applications for the Evolution Calendar by using its
- public interfaces. The Evolution Calendar exports its
- functionality through a number of interfaces, including CORBA,
- GTK+ wrappers for Bonobo objects, and other utility libraries.
- </para>
-
- <para>
- You should read this part of the Evolution Developer's guide
- if you intend to write client applications that use the
- functionality of the Evolution Calendar.
- </para>
-
- <para>
- This part does not describe the internal interfaces of the
- Evolution Calendar; for that you should read the Evolution
- Internals Guide. You should only need to read that guide if
- you are interested in the way the calendar works internally or
- if you want to make changes directly to the Evolution Calendar
- code.
- </para>
- </partintro>
-
- &calendar-architecture;
- </part>
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../evolution-devel-guide.sgml" "book" "book" "")
-End:
--->
diff --git a/help/devel/calendar/public-reference.sgml b/help/devel/calendar/public-reference.sgml
deleted file mode 100644
index f8aa6e848d..0000000000
--- a/help/devel/calendar/public-reference.sgml
+++ /dev/null
@@ -1,24 +0,0 @@
- <reference>
- <title>Calendar 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
- Calendar.
- </para>
- </partintro>
-
- &CalClient;
- &CalComponent;
- &cal-util;
- &cal-recur;
- &timeutil;
- </reference>
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../evolution-devel-guide.sgml" "book" "part" "")
-End:
--->
diff --git a/help/devel/calendar/reference.sgml b/help/devel/calendar/reference.sgml
deleted file mode 100644
index f8aa6e848d..0000000000
--- a/help/devel/calendar/reference.sgml
+++ /dev/null
@@ -1,24 +0,0 @@
- <reference>
- <title>Calendar 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
- Calendar.
- </para>
- </partintro>
-
- &CalClient;
- &CalComponent;
- &cal-util;
- &cal-recur;
- &timeutil;
- </reference>
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("../evolution-devel-guide.sgml" "book" "part" "")
-End:
--->
diff --git a/help/devel/evolution-devel-guide.sgml b/help/devel/evolution-devel-guide.sgml
deleted file mode 100644
index ca80ec533a..0000000000
--- a/help/devel/evolution-devel-guide.sgml
+++ /dev/null
@@ -1,50 +0,0 @@
-<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
-<!entity evolution-calendar SYSTEM "calendar/evolution-calendar.sgml">
-<!entity calendar-architecture SYSTEM "calendar/architecture.sgml">
-<!entity calendar-reference SYSTEM "calendar/reference.sgml">
-<!entity CalClient SYSTEM "calendar/cal-client/sgml/cal-client.sgml">
-<!entity CalComponent SYSTEM "calendar/cal-util/sgml/cal-component.sgml">
-<!entity cal-util SYSTEM "calendar/cal-util/sgml/cal-util.sgml">
-<!entity cal-recur SYSTEM "calendar/cal-util/sgml/cal-recur.sgml">
-<!entity timeutil SYSTEM "calendar/cal-util/sgml/timeutil.sgml">
-<!entity PCS "<acronym>PCS</acronym>">
-<!entity libical "<application>libical</application>">
-]>
-
-<book>
- <bookinfo>
- <title>Evolution Developer's Guide</title>
-
- <authorgroup>
- <corpauthor>
- Helix Code, Inc.
- </corpauthor>
- </authorgroup>
-
- <copyright>
- <year>2000</year>
- <holder>Helix Code, Inc.</holder>
- </copyright>
- </bookinfo>
-
- <!-- DocBook parts for each individual component -->
-
- &evolution-calendar;
-
- <!-- API Reference part -->
-
- <part>
- <title>Evolution Public 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>
- </partintro>
-
- &calendar-reference;
- </part>
-</book>
diff --git a/help/white-papers/calendar/calendar.sgml b/help/white-papers/calendar/calendar.sgml
deleted file mode 100644
index 2cb3132e2b..0000000000
--- a/help/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/help/white-papers/mail/camel.sgml b/help/white-papers/mail/camel.sgml
deleted file mode 100644
index a339909f54..0000000000
--- a/help/white-papers/mail/camel.sgml
+++ /dev/null
@@ -1,339 +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>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</year>
- <holder>Helix Code, 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 a
- <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 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_by_uid</function>. Alternately,
- within a single mail-reading session, messages can be referred
- to by their linear position within the store using
- <function>CamelFolder::get_message_by_number</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 chained together. So a CamelMimePart
- containing base64-encoded data can filter its output through
- a CamelStreamB64. 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/help/white-papers/mail/ibex.sgml b/help/white-papers/mail/ibex.sgml
deleted file mode 100644
index dcb8f5ca4b..0000000000
--- a/help/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/help/white-papers/widgets/e-table.sgml b/help/white-papers/widgets/e-table.sgml
deleted file mode 100644
index 5ff4faf2ae..0000000000
--- a/help/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/libibex/.cvsignore b/libibex/.cvsignore
deleted file mode 100644
index 9a14585748..0000000000
--- a/libibex/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-.deps
-*.lo
-*.la
-lookup
-mkindex
diff --git a/libibex/COPYING.LIB b/libibex/COPYING.LIB
deleted file mode 100644
index eb685a5ec9..0000000000
--- a/libibex/COPYING.LIB
+++ /dev/null
@@ -1,481 +0,0 @@
- GNU LIBRARY GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1991 Free Software Foundation, Inc.
- 675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the library GPL. It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Library General Public License, applies to some
-specially designated Free Software Foundation software, and to any
-other libraries whose authors decide to use it. You can use it for
-your libraries, 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 library, or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link a program with the library, you must provide
-complete object files to the recipients so that they can relink them
-with the library, after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- Our method of protecting your rights has two steps: (1) copyright
-the library, and (2) offer you this license which gives you legal
-permission to copy, distribute and/or modify the library.
-
- Also, for each distributor's protection, we want to make certain
-that everyone understands that there is no warranty for this free
-library. If the library is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original
-version, 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 companies distributing free
-software will individually obtain patent licenses, thus in effect
-transforming the program into proprietary software. To prevent this,
-we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
- Most GNU software, including some libraries, is covered by the ordinary
-GNU General Public License, which was designed for utility programs. This
-license, the GNU Library General Public License, applies to certain
-designated libraries. This license is quite different from the ordinary
-one; be sure to read it in full, and don't assume that anything in it is
-the same as in the ordinary license.
-
- The reason we have a separate public license for some libraries is that
-they blur the distinction we usually make between modifying or adding to a
-program and simply using it. Linking a program with a library, without
-changing the library, is in some sense simply using the library, and is
-analogous to running a utility program or application program. However, in
-a textual and legal sense, the linked executable is a combined work, a
-derivative of the original library, and the ordinary General Public License
-treats it as such.
-
- Because of this blurred distinction, using the ordinary General
-Public License for libraries did not effectively promote software
-sharing, because most developers did not use the libraries. We
-concluded that weaker conditions might promote sharing better.
-
- However, unrestricted linking of non-free programs would deprive the
-users of those programs of all benefit from the free status of the
-libraries themselves. This Library General Public License is intended to
-permit developers of non-free programs to use free libraries, while
-preserving your freedom as a user of such programs to change the free
-libraries that are incorporated in them. (We have not seen how to achieve
-this as regards changes in header files, but we have achieved it as regards
-changes in the actual functions of the Library.) The hope is that this
-will lead to faster development of free libraries.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, while the latter only
-works together with the library.
-
- Note that it is possible for a library to be covered by the ordinary
-General Public License rather than by this special one.
-
- GNU LIBRARY GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library which
-contains a notice placed by the copyright holder or other authorized
-party saying it may be distributed under the terms of this Library
-General Public License (also called "this License"). Each licensee is
-addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, 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 library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete 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 distribute a copy of this License along with the
-Library.
-
- 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 Library or any portion
-of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-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 Library, 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 Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you 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.
-
- If distribution of 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 satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also compile or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- c) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- d) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. 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.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library 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.
-
- 9. 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 Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-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.
-
- 11. 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 Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library 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 Library.
-
-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.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library 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.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Library 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 Library
-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 Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-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
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "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
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. 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 LIBRARY 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
-LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- Appendix: How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. 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 library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
diff --git a/libibex/ChangeLog b/libibex/ChangeLog
deleted file mode 100644
index a74f697308..0000000000
--- a/libibex/ChangeLog
+++ /dev/null
@@ -1,99 +0,0 @@
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * file.c, find.c: Fixed some warnings.
-
-2000-05-11 NotZed <NotZed@HelixCode.com>
-
- * index.c (ibex_unindex): Make sure we mark the ibex as dirty.
-
-2000-05-07 NotZed <NotZed@HelixCode.com>
-
- * file.c (ibex_save): New function, only write out the ibex if it
- has changed.
-
-2000-05-07 <notzed@helixcode.com>
-
- * file.c (ibex_open): Also close the fd after we're done.
-
- * find.c (ibex_contains_name): New function to find out if a file
- is indexed.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: set G_LOG_DOMAIN.
-
-2000-04-12 NotZed <NotZed@HelixCode.com>
-
- * find.c (ibex_dump_all): Debug function to dump the whole index
- to stdout.
-
- * words.c (get_ibex_file): Use g_strdup(), not strdup().
-
-2000-04-11 NotZed <NotZed@HelixCode.com>
-
- * file.c (write_word): Always write out all words we have (even if
- its 0 ... the file expects it). No longer check for removed files.
- (store_word): Check for removed files here, and only add to the
- ordered tree if we have references left to this word.
- (ibex_write): First insert into the tree, to determine the
- wordcount to be saved in the output file, and then write that.
- (ibex_open): Remove some debug.
-
- * words.c (ibex_index_buffer): Always set 'unread', if it is a
- valid pointer (dont rely on caller to initialise it).
-
-2000-03-26 NotZed <NotZed@HelixCode.com>
-
- * lookup.c (main): Fixed call to ibex_open.
-
- * mkindex.c (main): Fixed call to ibex_open.
-
- * file.c (ibex_open): Changed to accept flags and mode equivalent
- to open(2).
-
-2000-02-25 Dan Winship <danw@helixcode.com>
-
- * *.c: add gtk-doc-style comments
-
-2000-02-21 Matt Loper <matt@helixcode.com>
-
- * .cvsignore: Added mkindex.
-
-2000-02-21 NotZed <NotZed@HelixCode.com>
-
- * Makefile.am: change noinst_LIBRARIES to noinst_LTLIBRARIES, and
- supply -static to LDFLAGS. Duh, and changed LDADD back to
- libibex.la.
-
-2000-02-20 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: changed mkindex_LDADD to libibex.a instead of
- libibex.la.
-
-2000-02-19 Matt Loper <matt@helixcode.com>
-
- * .cvsignore: added lookup.
-
-2000-02-18 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * Makefile.am (lookup_LDADD): For now. make a libibex.a library so
- we can link it with the camel provider. I hate libtool
-
-2000-02-16 Dan Winship <danw@helixcode.com>
-
- * Makefile.am: automakify
-
-2000-02-16 NotZed <NotZed@HelixCode.com>
-
- * find.[ch] (ibex_find_name): Finds if a word is indexed under a
- given name.
-
-2000-02-14 NotZed <notzed@zedzone.helixcode.com>
-
- * Makefile: Hack together a build using libtool. This should all
- be auto*'d at some point I guess.
-
-2000-02-13 NotZed <notzed@zedzone.helixcode.com>
-
- * Added ChangeLog file.
-
diff --git a/libibex/Makefile.am b/libibex/Makefile.am
deleted file mode 100644
index c9e8165987..0000000000
--- a/libibex/Makefile.am
+++ /dev/null
@@ -1,21 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-noinst_LTLIBRARIES = libibex.la
-
-libibex_la_SOURCES = file.c index.c find.c words.c ibex.h
-libibex_la_LDFLAGS = -static
-
-noinst_HEADERS = ibex_internal.h
-
-INCLUDES = -I$(srcdir) $(GLIB_CFLAGS) $(UNICODE_CFLAGS) \
- -DG_LOG_DOMAIN=\"libibex\"
-
-
-noinst_PROGRAMS = mkindex lookup
-
-mkindex_SOURCES = mkindex.c
-mkindex_LDADD = libibex.la $(GLIB_LIBS) $(UNICODE_LIBS)
-
-lookup_SOURCES = lookup.c
-lookup_LDADD = libibex.la $(GLIB_LIBS) $(UNICODE_LIBS)
-
diff --git a/libibex/TODO b/libibex/TODO
deleted file mode 100644
index a087c8d1f3..0000000000
--- a/libibex/TODO
+++ /dev/null
@@ -1,61 +0,0 @@
-Stability
----------
-* ibex_open should never crash, and should never return NULL without
-errno being set. Should check for errors when reading.
-
-
-Performance
------------
-* Profiling, keep thinking about data structures, etc.
-
-* Check memory usage
-
-* See if writing the "inverse image" of long ref streams helps
-compression without hurting performance now. (ie, if a word appears in
-more than half of the files, write out the list of files it _doesn't_
-appear in). (I tried this before, and it wasn't working well, but the
-file format and data structures have changed a lot.)
-
-* We could save a noticeable chunk of time if normalize_word computed
-the hash of the word and then we could pass that into
-g_hash_table_insert somehow.
-
-* Make a copy of the buffer to be indexed (or provide interface for
-caller to say ibex can munge the provided data) and then use that
-rather than constantly copying things. ?
-
-
-Functionality
--------------
-* ibex file locking
-
-* specify file mode in ibex_open
-
-* ibex_find* need to normalize the search words... should this be done
-by the caller or by ibex_find?
-
-* Needs to be some way to do a secondary search after getting results
-back from ibex_find* (ie, for "foo near bar"). This either has to be
-done by ibex, or requires us to export the normalize interface.
-
-* Does there need to be an ibex_find_any, or is that easy enough for the
-caller to do?
-
-* utf8_trans needs to cover at least two more code pages. This is
-tricky because it's not clear whether some of the letters there should
-be translated to ASCII or left as UTF8. This requires some
-investigation.
-
-* ibex_index_* need to ignore HTML tags.
- NAME = [A-Za-z][A-Za-z0-9.-]*
- </?{NAME}(\s*{NAME}(\s*=\s*({NAME}|"[^"]*"|'[^']*')))*>
- <!(--([^-]*|-[^-])--\s*)*>
-
- ugh. ok, simplifying, we get:
- <[^!](([^"'>]*("[^"]*"|'[^']*'))*> or
- <!(--([^-]*|-[^-])--\s*)*>
-
- which is still not simple. sigh.
-
-* ibex_index_* need to recognize and ignore "non-text". Particularly
-BinHex and uuencoding.
diff --git a/libibex/file.c b/libibex/file.c
deleted file mode 100644
index 70b7ed96cb..0000000000
--- a/libibex/file.c
+++ /dev/null
@@ -1,481 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * This program 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 the Gnome 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.
- */
-
-/* file.c: index file read/write ops */
-
-#include <ctype.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "ibex_internal.h"
-
-static unsigned long read_number (FILE *f);
-static void write_number (FILE *f, unsigned long n);
-static char *get_compressed_word (FILE *f, char **lastword);
-
-static gint free_file (gpointer key, gpointer value, gpointer data);
-static void free_word (gpointer key, gpointer value, gpointer data);
-
-/* The file format is:
- *
- * version string (currently "ibex1")
- * file count
- * list of compressed filenames, separated by \0
- * word count
- * list of compressed words, each followed by \0, a count, and that
- * many references.
- *
- * All numbers are stored 7-bit big-endian, with the high bit telling
- * whether or not the number continues to the next byte.
- *
- * compressed text consists of a byte telling how many characters the
- * line has in common with the line before it, followed by the rest of
- * the string. Obviously this only really works if the lists are sorted.
- */
-
-/**
- * ibex_open: open (or possibly create) an ibex index
- * @file: the name of the file
- * @flags: open flags, see open(2).
- * @mode: If O_CREAT is passed in flags, then the file mode
- * to create the new file with. It will be anded with the current
- * umask.
- *
- * Open and/or create the named ibex file and return a handle to it.
- *
- * Return value: an ibex handle, or NULL if an error occurred.
- **/
-ibex *
-ibex_open (char *file, int flags, int mode)
-{
- ibex *ib;
- FILE *f;
- char vbuf[sizeof (IBEX_VERSION) - 1];
- char *word, *lastword;
- unsigned long nfiles, nwords, nrefs, ref;
- ibex_file **ibfs = NULL;
- int i;
- GPtrArray *refs;
- int fd;
- char *modestr;
-
- fd = open(file, flags, mode);
- if (fd == -1) {
- return NULL;
- }
-
- /* yuck, this is because we use FILE * interface
- internally */
- switch (flags & O_ACCMODE) {
- case O_RDONLY:
- modestr = "r";
- break;
- case O_RDWR:
- if (flags & O_APPEND)
- modestr = "a+";
- else
- modestr = "w+";
- break;
- case O_WRONLY:
- if (flags & O_APPEND)
- modestr = "a";
- else
- modestr = "w";
- break;
- default:
- if (flags & O_APPEND)
- modestr = "a+";
- else
- modestr = "r+";
- break;
- }
-
- f = fdopen(fd, modestr);
- if (f == NULL) {
- if (errno == 0)
- errno = ENOMEM;
- close(fd);
- return NULL;
- }
-
- ib = g_malloc (sizeof (ibex));
- ib->dirty = FALSE;
- ib->path = g_strdup (file);
- ib->files = g_tree_new ((GCompareFunc) strcmp);
- ib->words = g_hash_table_new (g_str_hash, g_str_equal);
- ib->oldfiles = g_ptr_array_new ();
-
- if (!f) {
- close(fd);
- return ib;
- }
-
- /* Check version. If its empty, then we have just created it */
- if (fread (vbuf, 1, sizeof (vbuf), f) != sizeof (vbuf)) {
- if (feof (f)) {
- fclose(f);
- close(fd);
- return ib;
- }
- }
- if (strncmp (vbuf, IBEX_VERSION, sizeof (vbuf) != 0)) {
- errno = EINVAL;
- goto errout;
- }
-
- /* Read list of files. */
- nfiles = read_number (f);
- ibfs = g_malloc (nfiles * sizeof (ibex_file *));
- lastword = NULL;
- for (i = 0; i < nfiles; i++) {
- ibfs[i] = g_malloc (sizeof (ibex_file));
- ibfs[i]->name = get_compressed_word (f, &lastword);
- if (!ibfs[i]->name) {
- goto errout;
- }
- ibfs[i]->index = 0;
- g_tree_insert (ib->files, ibfs[i]->name, ibfs[i]);
- }
-
- /* Read list of words. */
- nwords = read_number (f);
- lastword = NULL;
- for (i = 0; i < nwords; i++) {
- word = get_compressed_word (f, &lastword);
- if (!word) {
- goto errout;
- }
-
- nrefs = read_number (f);
- refs = g_ptr_array_new ();
- g_ptr_array_set_size (refs, nrefs);
- while (nrefs--) {
- ref = read_number (f);
- if (ref >= nfiles) {
- goto errout;
- }
- refs->pdata[nrefs] = ibfs[ref];
- }
-
- g_hash_table_insert (ib->words, word, refs);
- }
-
- g_free (ibfs);
- fclose (f);
- close(fd);
- return ib;
-
-errout:
-
- fclose (f);
- close(fd);
- g_tree_traverse (ib->files, free_file, G_IN_ORDER, NULL);
- g_tree_destroy (ib->files);
- g_hash_table_foreach (ib->words, free_word, NULL);
- g_hash_table_destroy (ib->words);
- g_ptr_array_free (ib->oldfiles, TRUE);
- if (ibfs)
- g_free (ibfs);
- g_free (ib->path);
- g_free (ib);
-
- return NULL;
-}
-
-struct ibex_write_data {
- unsigned long index;
- FILE *f;
- char *lastname;
-};
-
-/* This is an internal function to find the longest common initial
- * prefix between the last-written word and the current word.
- */
-static int
-get_prefix (struct ibex_write_data *iwd, char *name)
-{
- int i = 0;
- if (iwd->lastname) {
- while (!strncmp (iwd->lastname, name, i + 1))
- i++;
- }
- iwd->lastname = name;
- return i;
-}
-
-static gint
-write_file (gpointer key, gpointer value, gpointer data)
-{
- char *file = key;
- ibex_file *ibf = value;
- struct ibex_write_data *iwd = data;
- int prefix;
-
- ibf->index = iwd->index++;
- prefix = get_prefix (iwd, file);
- fprintf (iwd->f, "%c%s", prefix, file + prefix);
- fputc (0, iwd->f);
- return FALSE;
-}
-
-/* scans for words which still exist in the index (after
- index removals), and adds them to the ordered tree for
- writing out in order */
-static void
-store_word (gpointer key, gpointer value, gpointer data)
-{
- GTree *wtree = data;
- GPtrArray *refs = value;
- int i;
- ibex_file *ibf;
-
- for (i = 0; i < refs->len; i++) {
- ibf = g_ptr_array_index (refs, i);
- if (ibf->index == -1) {
- g_ptr_array_remove_index_fast (refs, i);
- i--;
- }
- }
-
- if (refs->len > 0) {
- g_tree_insert (wtree, key, value);
- }
-}
-
-/* writes a word out, in order */
-static gint
-write_word (gpointer key, gpointer value, gpointer data)
-{
- char *word = key;
- GPtrArray *refs = value;
- struct ibex_write_data *iwd = data;
- int i, prefix;
- ibex_file *ibf;
-
- prefix = get_prefix (iwd, word);
- fprintf (iwd->f, "%c%s", prefix, word + prefix);
- fputc (0, iwd->f);
-
- write_number (iwd->f, refs->len);
-
- for (i = 0; i < refs->len; i++) {
- ibf = g_ptr_array_index (refs, i);
- write_number (iwd->f, ibf->index);
- }
- return FALSE;
-}
-
-/**
- * ibex_write: Write an ibex out to disk.
- * @ib: the ibex
- *
- * This writes an ibex to disk.
- *
- * Return value: 0 for success, -1 for failure (in which case errno
- * is set).
- **/
-int
-ibex_write (ibex *ib)
-{
- struct ibex_write_data iwd;
- GTree *wtree;
- char *tmpfile;
-
- tmpfile = g_strdup_printf ("%s~", ib->path);
- iwd.f = fopen (tmpfile, "w");
- if (!iwd.f) {
- if (errno == 0)
- errno = ENOMEM;
- g_free (tmpfile);
- return -1;
- }
-
- fputs (IBEX_VERSION, iwd.f);
- if (ferror (iwd.f))
- goto lose;
-
- iwd.index = 0;
- iwd.lastname = NULL;
- write_number (iwd.f, g_tree_nnodes (ib->files));
- if (ferror (iwd.f))
- goto lose;
- g_tree_traverse (ib->files, write_file, G_IN_ORDER, &iwd);
- if (ferror (iwd.f))
- goto lose;
-
- iwd.lastname = NULL;
- wtree = g_tree_new ((GCompareFunc) strcmp);
- g_hash_table_foreach (ib->words, store_word, wtree);
- write_number (iwd.f, g_tree_nnodes(wtree));
- if (ferror (iwd.f))
- goto lose;
- g_tree_traverse (wtree, write_word, G_IN_ORDER, &iwd);
- g_tree_destroy (wtree);
- if (ferror (iwd.f))
- goto lose;
-
- if (fclose (iwd.f) == 0 && rename (tmpfile, ib->path) == 0) {
- g_free (tmpfile);
- ib->dirty = FALSE;
- return 0;
- }
-
-lose:
- unlink (tmpfile);
- g_free (tmpfile);
- return -1;
-}
-
-/**
- * ibex_save:
- * @ib:
- *
- * Only write out an ibex if it is dirty.
- *
- * Return value: Same as ibex_write.
- **/
-int
-ibex_save (ibex *ib)
-{
- if (ib->dirty)
- return ibex_write(ib);
- return 0;
-}
-
-/**
- * ibex_close: Write out the ibex file (if it has changed) and free
- * the data associated with it.
- * @ib: the ibex
- *
- * If this ibex file has been modified since it was opened, this will
- * call ibex_write() to write it out to disk. It will then free all data
- * associated with the ibex. After calling ibex_close(), @ib will no
- * longer be a valid ibex.
- *
- * Return value: 0 on success, -1 on an ibex_write() failure (in which
- * case @ib will not be destroyed).
- **/
-int
-ibex_close (ibex *ib)
-{
- ibex_file *ibf;
-
- if (ib->dirty && ibex_write (ib) == -1)
- return -1;
-
- g_tree_traverse (ib->files, free_file, G_IN_ORDER, NULL);
- g_tree_destroy (ib->files);
- g_hash_table_foreach (ib->words, free_word, NULL);
- g_hash_table_destroy (ib->words);
-
- while (ib->oldfiles->len) {
- ibf = g_ptr_array_remove_index (ib->oldfiles, 0);
- g_free (ibf->name);
- g_free (ibf);
- }
- g_ptr_array_free (ib->oldfiles, TRUE);
- g_free (ib->path);
- g_free (ib);
-
- return 0;
-}
-
-static gint
-free_file (gpointer key, gpointer value, gpointer data)
-{
- ibex_file *ibf = value;
-
- g_free (ibf->name);
- g_free (ibf);
- return FALSE;
-}
-
-static void
-free_word (gpointer key, gpointer value, gpointer data)
-{
- g_free (key);
- g_ptr_array_free (value, TRUE);
-}
-
-static char *
-get_compressed_word (FILE *f, char **lastword)
-{
- char *buf, *p;
- int c, size;
-
- c = getc (f);
- if (c == EOF)
- return NULL;
-
- size = c + 10;
- buf = g_malloc (size);
- if (*lastword)
- strncpy (buf, *lastword, c);
- p = buf + c;
- do {
- c = getc (f);
- if (c == EOF)
- return NULL;
- if (p == buf + size) {
- buf = g_realloc (buf, size + 10);
- p = buf + size;
- size += 10;
- }
- *p++ = c;
- } while (c != 0);
-
- *lastword = buf;
- return buf;
-}
-
-static void
-write_number (FILE *f, unsigned long number)
-{
- int i, flag = 0;
- char buf[4];
-
- i = 4;
- do {
- buf[--i] = (number & 0x7F) | flag;
- number = number >> 7;
- flag = 0x80;
- } while (number != 0);
-
- fwrite (buf + i, 1, 4 - i, f);
-}
-
-static unsigned long
-read_number (FILE *f)
-{
- int byte;
- unsigned long num;
-
- num = 0;
- do {
- byte = getc (f);
- num = num << 7 | (byte & 0x7F);
- } while (byte & 0x80);
-
- return num;
-}
-
diff --git a/libibex/find.c b/libibex/find.c
deleted file mode 100644
index 6b9815f0c0..0000000000
--- a/libibex/find.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * This program 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 the Gnome 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.
- */
-
-/* find.c: index file searching ops */
-
-#include <string.h>
-
-#include "ibex_internal.h"
-
-/**
- * ibex_find: search an ibex for a word
- * @ib: an ibex
- * @word: the word
- *
- * This routine searches an ibex for a word and returns a GPtrArray
- * containing the names of the files in the ibex that contain the word.
- * If no matches are found, it will return an empty array (not NULL).
- * The caller must free the array, but MUST NOT free or alter its
- * elements.
- *
- * Return value: the array of filenames containing @word
- **/
-GPtrArray *
-ibex_find (ibex *ib, char *word)
-{
- GPtrArray *refs, *ret;
- ibex_file *ibf;
- int i;
-
- ret = g_ptr_array_new ();
- refs = g_hash_table_lookup (ib->words, word);
- if (refs) {
- for (i = 0; i < refs->len; i++) {
- ibf = g_ptr_array_index (refs, i);
- g_ptr_array_add (ret, ibf->name);
- }
- }
- return ret;
-}
-
-/**
- * ibex_contains_name:
- * @ib:
- * @name:
- *
- * Returns #TRUE if the ibex @ib has any index entry for
- * the key @name.
- *
- * Return value:
- **/
-gboolean
-ibex_contains_name(ibex *ib, char *name)
-{
- return g_tree_lookup(ib->files, name) != NULL;
-}
-
-/**
- * ibex_find_name: Check if a word occurs in a given file
- * @ib: an ibex
- * @name: a filename
- * @word: a word
- *
- * This checks if the given word occurs in the given file.
- *
- * Return value: TRUE or FALSE
- **/
-gboolean
-ibex_find_name (ibex *ib, char *name, char *word)
-{
- GPtrArray *refs;
- ibex_file *ibf;
- int i;
-
- refs = g_hash_table_lookup (ib->words, word);
- if (refs) {
- for (i = 0; i < refs->len; i++) {
- ibf = g_ptr_array_index (refs, i);
- if (!strcmp (ibf->name, name))
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static gint
-build_array (gpointer key, gpointer value, gpointer data)
-{
- char *name = key;
- unsigned int count = GPOINTER_TO_UINT (value);
- GPtrArray *ret = data;
-
- if (count == 1)
- g_ptr_array_add (ret, name);
- return FALSE;
-}
-
-/**
- * ibex_find_all: Find files containing multiple words
- * @ib: an ibex
- * @words: a GPtrArray of words
- *
- * This works like ibex_find(), but returns an array of filenames
- * which contain all of the words in @words.
- *
- * Return value: an array of matches
- **/
-GPtrArray *
-ibex_find_all (ibex *ib, GPtrArray *words)
-{
- GTree *work;
- GPtrArray *wrefs, *ret;
- int i, j, count;
- char *word;
- ibex_file *ibf;
-
- if (words->len == 0)
- return g_ptr_array_new ();
- else if (words->len == 1)
- return ibex_find (ib, g_ptr_array_index (words, 0));
-
- work = g_tree_new ((GCompareFunc) strcmp);
- for (i = 0; i < words->len; i++) {
- word = g_ptr_array_index (words, i);
- wrefs = g_hash_table_lookup (ib->words, word);
- if (!wrefs) {
- /* One of the words isn't even in the index. */
- g_tree_destroy (work);
- return g_ptr_array_new ();
- }
-
- if (i == 0) {
- /* Copy the references into a tree, using the
- * filenames as keys and the size of words as
- * the value.
- */
- for (j = 0; j < wrefs->len; j++) {
- ibf = g_ptr_array_index (wrefs, j);
- g_tree_insert (work, ibf->name,
- GUINT_TO_POINTER (words->len));
- }
- } else {
- /* Increment the counts in the working tree
- * for the references for this word.
- */
- for (j = 0; j < wrefs->len; j++) {
- ibf = g_ptr_array_index (wrefs, j);
- count = GPOINTER_TO_UINT (g_tree_lookup (work, ibf->name));
- if (count) {
- g_tree_insert (work, ibf->name,
- GUINT_TO_POINTER (count - 1));
- }
- }
- }
- }
-
- /* Build an array with the refs that contain all the words. */
- ret = g_ptr_array_new ();
- g_tree_traverse (work, build_array, G_IN_ORDER, ret);
- g_tree_destroy (work);
- return ret;
-}
-
-static void
-ibex_dump_foo(char *key, GPtrArray *refs, void *data)
-{
- int i;
-
- g_print("%s: ", key);
- for (i=0;i<refs->len;i++) {
- ibex_file *ibf = g_ptr_array_index (refs, i);
- g_print("%c%s", ibf->index==-1?'-':' ', ibf->name);
- }
- g_print("\n");
-}
-
-/* debug function to dump the tree, in key order */
-void
-ibex_dump_all (ibex *ib)
-{
- g_hash_table_foreach(ib->words, (GHFunc) ibex_dump_foo, 0);
-}
diff --git a/libibex/ibex.h b/libibex/ibex.h
deleted file mode 100644
index 03635e275d..0000000000
--- a/libibex/ibex.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * This program 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 the Gnome 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.
- */
-
-#ifndef IBEX_H
-#define IBEX_H
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <glib.h>
-
-struct ibex;
-typedef struct ibex ibex;
-
-/* All functions that can fail set errno and return NULL or -1 on
- * failure.
- */
-
-/* Open the named ibex index file. If CREATE is true, create the file
- * if it doesn't already exist.
- */
-ibex *ibex_open (char *file, int flags, int mode);
-
-/* Write the ibex to disk. */
-int ibex_write (ibex *ib);
-
-/* only save if ibex has changed. */
-int ibex_save (ibex *ib);
-
-/* Write the ibex to disk if it has changed, and free all memory
- * associated with it.
- */
-int ibex_close (ibex *ib);
-
-
-
-/* Index the named file. (If the FILENAME is already in the index,
- * remove the old copy.
- */
-int ibex_index_file (ibex *ib, char *filename);
-
-/* Index LEN bytes off FD, using NAME as the filename in the index.
- * (If NAME already exists in the index, this adds more data to it.)
- */
-int ibex_index_fd (ibex *ib, char *name, int fd, size_t len);
-
-/* Like ibex_index_fd, but with a buffer rather than a file descriptor.
- * The buffer does not need to be '\0'-terminated. If UNREAD is not
- * NULL, then the indexer won't assume that the buffer ends on a word
- * boundary, and will return (in UNREAD) the number of bytes from the
- * end of the buffer that it didn't use, if any.
- */
-int ibex_index_buffer (ibex *ib, char *name, char *buffer,
- size_t len, size_t *unread);
-
-/* Remove entries for a given file from the index. (Most of the removal
- * isn't actually done until the file is written out to disk, so this
- * is very fast.)
- */
-void ibex_unindex (ibex *ib, char *name);
-
-/* Rename a file in the index. (This is also fast.) */
-void ibex_rename (ibex *ib, char *oldfilename, char *newfilename);
-
-
-
-/* Find a word in the index. Returns an array of strings: the caller
- * should free the array, but should not free or modify the strings.
- */
-GPtrArray *ibex_find (ibex *ib, char *word);
-
-/* Find if a word is contained in a specific name reference.
- */
-gboolean ibex_find_name (ibex *ib, char *name, char *word);
-
-/* has a file been indexed?
- */
-gboolean ibex_contains_name(ibex *ib, char *name);
-
-/* Return all the files containing all of the words in the given
- * array. Returned data is like with ibex_find.
- */
-GPtrArray *ibex_find_all (ibex *ib, GPtrArray *words);
-
-/* Debug function, dumps the whole index tree, showing removed files as well */
-void ibex_dump_all (ibex *ib);
-
-#endif /* ! IBEX_H */
-
diff --git a/libibex/ibex_internal.h b/libibex/ibex_internal.h
deleted file mode 100644
index 1647147a3a..0000000000
--- a/libibex/ibex_internal.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * This program 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 the Gnome 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 <glib.h>
-
-#include "ibex.h"
-
-#define IBEX_VERSION "ibex1"
-
-struct ibex {
- char *path;
- GTree *files;
- GHashTable *words;
- GPtrArray *oldfiles;
- gboolean dirty;
-};
-
-struct ibex_file {
- char *name;
- long index;
-};
-typedef struct ibex_file ibex_file;
diff --git a/libibex/index.c b/libibex/index.c
deleted file mode 100644
index 1afedbd251..0000000000
--- a/libibex/index.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * This program 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 the Gnome 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.
- */
-
-/* index.c: high-level indexing ops */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include "ibex_internal.h"
-
-/**
- * ibex_index_file: Index a file by name
- * @ib: an ibex
- * @filename: name of the file to index
- *
- * This indexes the given file into @ib. If @filename is already in
- * the ibex, the existing index entries for it are discarded and the
- * file is indexed anew.
- *
- * Return value: 0 on success, -1 on failure.
- **/
-int
-ibex_index_file (ibex *ib, char *filename)
-{
- int fd;
- int status;
- struct stat st;
-
- fd = open (filename, O_RDONLY);
- if (fd < 0)
- return -1;
-
- if (fstat (fd, &st) == -1) {
- close (fd);
- return -1;
- }
- if (!S_ISREG (st.st_mode)) {
- close (fd);
- errno = EINVAL;
- return -1;
- }
-
- ibex_unindex (ib, filename);
- status = ibex_index_fd (ib, filename, fd, st.st_size);
- close (fd);
- return status;
-}
-
-/**
- * ibex_index_fd: Index a file given a file descriptor
- * @ib: an ibex
- * @name: the name of the file being indexed
- * @fd: a file descriptor, open for reading
- * @len: the number of bytes to read from the file
- *
- * This indexes a file, or a part of a file, given an open file
- * descriptor and a size. There is no requirement that @name
- * actually correspond to @fd in any particular way.
- *
- * If the function returns successfully, the file descriptor offset of
- * @fd will be exactly @len bytes beyond where it was when the
- * function was called. The indexer assumes that this point is a word
- * boundary.
- *
- * The behavior of this function is not defined if it is not
- * possible to read @len bytes off @fd.
- *
- * Return value: 0 on success, -1 on failure.
- **/
-int
-ibex_index_fd (ibex *ib, char *name, int fd, size_t len)
-{
- char *buf;
- int off = 0, nread, status;
-
- buf = g_malloc (len);
- do {
- nread = read (fd, buf + off, len - off);
- if (nread == -1) {
- g_free (buf);
- return -1;
- }
- off += nread;
- } while (off != len);
-
- status = ibex_index_buffer (ib, name, buf, len, NULL);
- g_free (buf);
-
- return status;
-}
-
-/**
- * ibex_unindex: Remove a file from the ibex
- * @ib: an ibex
- * @name: name of the file to remove
- *
- * This removes all references to @name from @ib. No memory is freed
- * right away, but further searches on @ib will never return @name.
- **/
-void
-ibex_unindex (ibex *ib, char *name)
-{
- ibex_file *ibf;
-
- ibf = g_tree_lookup (ib->files, name);
- if (ibf) {
- ibf->index = -1;
- g_tree_remove (ib->files, name);
- g_ptr_array_add (ib->oldfiles, ibf);
- ib->dirty = TRUE;
- }
-}
-
-/**
- * ibex_rename: Rename a file in the ibex
- * @ib: an ibex
- * @oldname: the old name of the file
- * @newname: the new name of the file
- *
- * This renames a file in the ibex.
- **/
-void
-ibex_rename (ibex *ib, char *oldname, char *newname)
-{
- ibex_file *ibf;
-
- ibf = g_tree_lookup (ib->files, oldname);
- if (ibf) {
- g_tree_remove (ib->files, oldname);
- g_free (ibf->name);
- ibf->name = g_strdup (newname);
- g_tree_insert (ib->files, ibf->name, ibf);
- }
-}
diff --git a/libibex/lookup.c b/libibex/lookup.c
deleted file mode 100644
index 2d01dbf850..0000000000
--- a/libibex/lookup.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * 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
- */
-
-/* lookup.c: a simple client, part 2 */
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "ibex.h"
-
-extern int optind;
-extern char *optarg;
-
-static void
-usage (void)
-{
- fprintf (stderr, "Usage: lookup [-f indexfile] word ...\n");
- exit (1);
-}
-
-int
-main (int argc, char **argv)
-{
- ibex *ib;
- GPtrArray *ans, *words;
- int opt, i;
- char *file = "INDEX";
-
- while ((opt = getopt (argc, argv, "f:")) != -1) {
- switch (opt) {
- case 'f':
- file = optarg;
- break;
-
- default:
- usage ();
- break;
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc == 0)
- usage ();
-
- ib = ibex_open (file, O_RDWR|O_CREAT, 0600);
- if (!ib) {
- printf ("Couldn't open %s: %s\n", file, strerror (errno));
- exit (1);
- }
-
- words = g_ptr_array_new ();
- while (argc--)
- g_ptr_array_add (words, argv[argc]);
-
- ans = ibex_find_all (ib, words);
- if (ans) {
- for (i = 0; i < ans->len; i++)
- printf ("%s\n", (char *)g_ptr_array_index (ans, i));
- exit (0);
- } else {
- printf ("Nope.\n");
- exit (1);
- }
-}
diff --git a/libibex/mkindex.c b/libibex/mkindex.c
deleted file mode 100644
index 151dcecb2d..0000000000
--- a/libibex/mkindex.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * 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
- */
-
-/* mkindex.c: a simple client, part 1 */
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "ibex.h"
-
-extern int optind;
-extern char *optarg;
-
-static void
-usage (void)
-{
- fprintf (stderr, "Usage: mkindex [-f indexfile] file ...\n");
- exit (1);
-}
-
-int
-main (int argc, char **argv)
-{
- ibex *ib;
- int opt;
- char *file = "INDEX";
-
- while ((opt = getopt (argc, argv, "f:")) != -1) {
- switch (opt) {
- case 'f':
- file = optarg;
- break;
-
- default:
- usage ();
- break;
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc == 0)
- usage ();
-
- ib = ibex_open (file, O_CREAT|O_RDWR, 0600);
- if (!ib) {
- fprintf (stderr, "Couldn't open index file %s: %s\n",
- file, strerror (errno));
- exit (1);
- }
-
- while (argc--) {
- if (ibex_index_file (ib, argv[argc]) == -1) {
- fprintf (stderr, "Couldn't index %s: %s\n",
- argv[argc], strerror (errno));
- exit (1);
- }
- }
-
- if (ibex_close (ib) != 0) {
- fprintf (stderr, "Failed to write index file %s: %s\n",
- file, strerror (errno));
- exit (1);
- }
- exit (0);
-}
diff --git a/libibex/words.c b/libibex/words.c
deleted file mode 100644
index 7642b0a305..0000000000
--- a/libibex/words.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * This program 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 the Gnome 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.
- */
-
-/* words.c: low-level indexing ops */
-
-#include <ctype.h>
-#include <errno.h>
-#include <string.h>
-
-#include <unicode.h>
-
-#include "ibex_internal.h"
-
-static signed char utf8_trans[] = {
- 'A', 'A', 'A', 'A', 'A', 'A', -1, 'C', 'E', 'E', 'E', 'E', 'I', 'I',
- 'I', 'I', -2, 'N', 'O', 'O', 'O', 'O', 'O', '*', 'O', 'U', 'U', 'U',
- 'U', 'Y', -3, -4, 'a', 'a', 'a', 'a', 'a', 'a', -5, 'c', 'e', 'e',
- 'e', 'e', 'i', 'i', 'i', 'i', -6, 'n', 'o', 'o', 'o', 'o', 'o', '/',
- 'o', 'u', 'u', 'u', 'u', 'y', -7, 'y', 'A', 'a', 'A', 'a', 'A', 'a',
- 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e',
- 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
- 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
- 'I', 'i', -8, -9, 'J', 'j', 'K', 'k', 'k', 'L', 'l', 'L', 'l', 'L',
- 'l', 'L', 'l', 'L', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', -10, -11,
- 'O', 'o', 'O', 'o', 'O', 'o', -12, -13, 'R', 'r', 'R', 'r', 'R', 'r',
- 'S', 'r', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't',
- 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w',
- 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's'
-};
-
-static char *utf8_long_trans[] = {
- "AE", "TH", "TH", "ss", "ae", "th", "th", "IJ", "ij",
- "NG", "ng", "OE", "oe"
-};
-
-/* This is a bit weird. It takes pointers to the start and end (actually
- * just past the end) of a UTF-8-encoded word, and a buffer at least 1
- * byte longer than the length of the word. It copies the word into the
- * buffer in all lowercase without accents, and splits up ligatures.
- * (Since any ligature would be a multi-byte character in UTF-8, splitting
- * them into two US-ASCII characters won't overrun the buffer.)
- *
- * It is not safe to call this routine with bad UTF-8.
- */
-static void
-normalize_word (char *start, char *end, char *buf)
-{
- unsigned char *s, *d;
- unicode_char_t uc;
-
- s = (unsigned char *)start;
- d = (unsigned char *)buf;
- while (s < (unsigned char *)end) {
- if (*s < 0x80) {
- /* US-ASCII character: copy unless it's
- * an apostrophe.
- */
- if (*s != '\'')
- *d++ = tolower (*s);
- s++;
- } else {
- char *next = unicode_get_utf8 (s, &uc);
- if (uc >= 0xc0 && uc < 0xc0 + sizeof (utf8_trans)) {
- signed char ch = utf8_trans[uc - 0xc0];
- if (ch > 0)
- *d++ = tolower (ch);
- else {
- *d++ = tolower (utf8_long_trans[-ch - 1][0]);
- *d++ = tolower (utf8_long_trans[-ch - 1][1]);
- }
- s = next;
- } else {
- while (s < (unsigned char *)next)
- *d++ = *s++;
- }
- }
- }
- *d = '\0';
-}
-
-enum { IBEX_ALPHA, IBEX_NONALPHA, IBEX_INVALID, IBEX_INCOMPLETE };
-
-/* This incorporates parts of libunicode, because there's no way to
- * force libunicode to not read past a certain point.
- */
-static int
-utf8_category (char *sp, char **snp, char *send)
-{
- unsigned char *p = (unsigned char *)sp, **np = (unsigned char **)snp;
- unsigned char *end = (unsigned char *)send;
-
- if (isascii (*p)) {
- *np = p + 1;
- if (isalpha (*p) || *p == '\'')
- return IBEX_ALPHA;
- return IBEX_NONALPHA;
- } else {
- unicode_char_t uc;
- int more;
-
- if ((*p & 0xe0) == 0xc0) {
- more = 1;
- uc = *p & 0x1f;
- } else if ((*p & 0xf0) == 0xe0) {
- more = 2;
- uc = *p & 0x0f;
- } else if ((*p & 0xf8) == 0xf0) {
- more = 3;
- uc = *p & 0x07;
- } else if ((*p & 0xfc) == 0xf8) {
- more = 4;
- uc = *p & 0x03;
- } else if ((*p & 0xfe) == 0xfc) {
- more = 5;
- uc = *p & 0x01;
- } else
- return IBEX_INVALID;
-
- if (p + more > end)
- return IBEX_INCOMPLETE;
-
- while (more--) {
- if ((*++p & 0xc0) != 0x80)
- return IBEX_INVALID;
- uc <<= 6;
- uc |= *p & 0x3f;
- }
-
- *np = p + 1;
- if (unicode_isalpha (uc))
- return IBEX_ALPHA;
- else
- return IBEX_NONALPHA;
- }
-}
-
-static ibex_file *
-get_ibex_file (ibex *ib, char *name)
-{
- ibex_file *ibf;
-
- ibf = g_tree_lookup (ib->files, name);
- if (!ibf) {
- ibf = g_malloc (sizeof (ibex_file));
- ibf->name = g_strdup (name);
- ibf->index = 0;
- g_tree_insert (ib->files, ibf->name, ibf);
- ib->dirty = TRUE;
- }
- return ibf;
-}
-
-static void
-ref_word (ibex *ib, ibex_file *ibf, char *word)
-{
- GPtrArray *refs;
-
- refs = g_hash_table_lookup (ib->words, word);
- if (!refs) {
- refs = g_ptr_array_new ();
- g_hash_table_insert (ib->words, g_strdup (word), refs);
- g_ptr_array_add (refs, ibf);
- ib->dirty = TRUE;
- } else if (g_ptr_array_index (refs, refs->len - 1) != ibf) {
- g_ptr_array_add (refs, ibf);
- ib->dirty = TRUE;
- }
-}
-
-/**
- * ibex_index_buffer: the lowest-level ibex indexing interface
- * @ib: an ibex
- * @name: the name of the file being indexed
- * @buffer: a buffer containing data from the file
- * @len: the length of @buffer
- * @unread: an output argument containing the number of unread bytes
- *
- * This routine indexes up to @len bytes from @buffer into @ib.
- * If @unread is NULL, the indexer assumes that the buffer ends on a
- * word boundary, and will index all the way to the end of the
- * buffer. If @unread is not NULL, and the buffer ends with an
- * alphabetic character, the indexer will assume that the buffer has
- * been cut off in the middle of a word, and return the number of
- * un-indexed bytes at the end of the buffer in *@unread. The caller
- * should then read in more data through whatever means it has
- * and pass in the unread bytes from the original buffer, followed
- * by the new data, on its next call.
- *
- * Return value: 0 on success, -1 on failure.
- **/
-int
-ibex_index_buffer (ibex *ib, char *name, char *buffer,
- size_t len, size_t *unread)
-{
- char *p, *q, *nq, *end, *word;
- ibex_file *ibf = get_ibex_file (ib, name);
- int wordsiz, cat;
-
- if (unread)
- *unread = 0;
-
- end = buffer + len;
- wordsiz = 20;
- word = g_malloc (wordsiz);
-
- p = buffer;
- while (p < end) {
- while (p < end) {
- cat = utf8_category (p, &q, end);
- if (cat != IBEX_NONALPHA)
- break;
- p = q;
- }
- if (p == end) {
- g_free (word);
- return 0;
- } else if (cat == IBEX_INVALID) {
- errno = EINVAL;
- g_free (word);
- return -1;
- } else if (cat == IBEX_INCOMPLETE)
- q = end;
-
- while (q < end) {
- cat = utf8_category (q, &nq, end);
- if (cat != IBEX_ALPHA)
- break;
- q = nq;
- }
- if (cat == IBEX_INVALID ||
- (cat == IBEX_INCOMPLETE && !unread)) {
- errno = EINVAL;
- g_free (word);
- return -1;
- } else if (cat == IBEX_INCOMPLETE || (q == end && unread)) {
- *unread = end - p;
- g_free (word);
- return 0;
- }
-
- if (wordsiz < q - p + 1) {
- wordsiz = q - p + 1;
- word = g_realloc (word, wordsiz);
- }
- normalize_word (p, q, word);
- ref_word (ib, ibf, word);
- p = q;
- }
-
- g_free (word);
- return 0;
-}
diff --git a/libical/.cvsignore b/libical/.cvsignore
deleted file mode 100644
index 41f3513f40..0000000000
--- a/libical/.cvsignore
+++ /dev/null
@@ -1,19 +0,0 @@
-*.la
-*.lo
-.libs
-Makefile
-Makefile.in
-aclocal.m4
-config.cache
-config.guess
-config.h
-config.h.in
-config.log
-config.status
-config.sub
-configure
-libtool
-ltconfig
-ltmain.sh
-stamp-h
-stamp-h.in
diff --git a/libical/AUTHORS b/libical/AUTHORS
deleted file mode 100644
index e69de29bb2..0000000000
--- a/libical/AUTHORS
+++ /dev/null
diff --git a/libical/CHANGES b/libical/CHANGES
deleted file mode 100644
index 953514a9e4..0000000000
--- a/libical/CHANGES
+++ /dev/null
@@ -1,222 +0,0 @@
-
-Version 0.15
-------------
-
-Split the storage classess ( icalstore, icalcluster, icalcalendar )
-into a seperate library, libicalss
-
-Implemented restriction checking in file icalrestrictions.c. The
-checking is not complete, but can handle the bulk of the restrictions
-described in RFC 2446.
-
-Created a new value type, METHOD. Changed METHOD property to use the
-new value. The METHOD value uses an enumeration.
-
-
-Version 0.14b
--------------
-
-Implemented parsing of RECUR values, although it does not handle BYDAY
-specs with numbers.
-
-Fixed error in icalparser_next_line that mangled lines longer than the
-temp buffer (1024 chars.) The temp buffer is now 80 chars, and it can
-handle (apparently) arbitrary length lines
-
-Fixed severe brokenness in a value, but I forgot which one.
-
-Cleaned cruft out of the distribution, so the tarfile is smaller.
-
-
-Version 0.14a 14 Jan 00
------------------------
-
-Fixed bug in ROLE parameter -- missing '-' in the text of allowed values
-
-Fixed bug in X-parameters
-
-Version 0.14 11 Jan 00
-----------------------
-
-Fixed wrong value type for TRIGGER property
-
-Added Calendar object. Calendar is an aggregate of two stores and two
-clusters, and can store all of the inforamation associated with a
-calendar.
-
-icalcomponent_add_property and icalcomponent_add_component will
-complain if you try to add a component or property that is already
-part of an other component. The *_free routines wil complain if you try
-to free a linked component or property.
-
-More improvements to error handling.
-
-Parser is much more robust.
-
-Minor memory enhancements.
-
-Regression test runs without memory leaks.
-
-Version 0.13d 21Dec99
----------------------
-
-Seperated perl interface and library
-
-Added autoconf support
-
-Scripts that generate derived properties, values and parameters now
-change source and header files inline.
-
-Changed icalstore to cluster all components with DTSTART in a month
-into a single file. This should reduce number of file accesses by a
-factor of 60.
-
-Ran code through Purify and fixed memory leaks.
-
-
-Version 0.13 16Nov99
----------------------
-
-Yet more bug fixes! Yeah!
-
-Added better error handling. The Parser inserts X-LIC-*ERROR
-properties to warn of parsing errors.
-
-The imip source/sink programs in /src/imip is demonstrably functional.
-
-Version 0.12b 17Oct99
----------------------
-
-More bug fixes, particularily in parse from string routines
-
-ICal::Store is mostly functional
-
-This is version is a checkpoint, not a release.
-
-Version 0.12a 10Oct99
----------------------
-
-Expanded perl interface:
- Added 1/2 of Store module
- Fixed bugs
- Implemeted get_{first,next}_property
-
-Extended C interface
- Made get_{first,next}_property work properly
- Fixed bugs
-
-
-This is version is a checkpoint, not a release.
-
-Version 0.12 27Aug99
---------------------
-
-Added a rudimentatry perl interface
-
-This is version is a checkpoint, not a release.
-
-
-Version 0.11 11Aug99
---------------------
-
-Eliminated most use of flex/bison -- all parsing, except for the
-values, is done in C.
-
-Cleaned up memory leaks. Purify claims that I got them all.
-
-Moved all derived component/prop/param/value code ( in .inc / .h
-files) into main files ( icalcomponent.{c,h}, icalproperty.{c,h}, etc/
-)
-
-Implemented *_clone routines.
-
-Fixed a lot of bugs.
-
-Implemented more value types. Still unimplemeneted are BINARY and RECUR
-
-Included MacOS/Code Warior files from Graham Davison
-
-
-Version 0.10 8Jul99
--------------------
-
-Eliminated shift/reduce and reduce/reduce conflicts in the parser.
-This version is almost feature complete -- it has the basic structure
-for all of the library's functionality, and it will only require
-implementing procedure shells and fixing bugs. I think that all of the
-hard work is done...
-
-Version 0.09a,b 3,7 Jul99
--------------------------
-
-Various improvements to the parser, added some functionality. The parser code
-is mostly complete, and should be fully functional, except for a horde of
-bugs. Also added support for X-Properties.
-
-Version 0.09 25Jun99
---------------------
-
-Added a parser in files src/comp/icalitip.{y,l} The lexer is mostly
-functional, but the parser is not.
-
-
-Version 0.08 2Jun99
---------------------
-
-All files now have MPL licensing
-
-Implement enough of the code to perform some rudimentary testing
-
-
-Version 0.07 14May99
---------------------
-
-Remove all interfaces that construct object from a string
-
-Moved most code back into comp directory
-
-Implemented C files for most headers -- usecases.c now links.
-
-Many improvements to generation scripts.
-
-
-
-Version 0.06 25Apr99
---------------------
-
-Expanded distribution to include:
- Directory structure that can accomodate future expansion
- Several levels of Makefiles
- This CHANGES file
-
-Added headers for irip and parse modules
-
-Added several files with design information
-
-Added scripts that I had used to generate much of the ical header code.
-
-Split C headers from CC headers
-
-Added data for iTIP and iCAL component restrictions in restrictions.csv
-
-Version 0.05 11Apr99
-----------------------
-
-Changes to ical headers
-
- Added derived Property classes.
-
- Improved the interface to the derived property and parameter classes
-
- Added derived component classes.
-
- Created usecases.c and ccusecases.cc to demonstrate use
-
- C++ interface compile
-
-
-Version 0.04 5Apr99
--------------------
-
-Version 0.02 30Mar99
--------------------- \ No newline at end of file
diff --git a/libical/COPYING b/libical/COPYING
deleted file mode 100644
index e69de29bb2..0000000000
--- a/libical/COPYING
+++ /dev/null
diff --git a/libical/ChangeLog b/libical/ChangeLog
deleted file mode 100644
index baf8b5a41c..0000000000
--- a/libical/ChangeLog
+++ /dev/null
@@ -1,27 +0,0 @@
-2000-06-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * src/test/Makefile.am (INCLUDES): Likewise.
-
- * src/libicalss/Makefile.am (INCLUDES): Use $(srcdir) to allow
- builddir != srcdir.
-
-2000-03-17 Eric Busboom <eric@agony.qualcomm.com>
-
- * icalstore.c Vastly improved icalstore_test.
-
-2000-03-16 Eric Busboom <eric@agony.qualcomm.com>
-
- * icalcluster.c Added compile flag (ICAL_SAFESAVES) to switch how
- icalcluster saves files during commits. When the flag is define,
- it will write the data to a temorar file and rename the file to
- the target file.
-
- * storage.c Added seterate test suite for sotage components
-
- * icalparser.c Created parser object, implemented line-oriented
- parsering, and made message oriented parsing work in terms f line
- oriented parsing.
-
- * icalparser.c Fixed icalparser_get_line to remove \r in input.
-
-
diff --git a/libical/INSTALL b/libical/INSTALL
deleted file mode 100644
index 88e2a5e7d6..0000000000
--- a/libical/INSTALL
+++ /dev/null
@@ -1,24 +0,0 @@
-Building the library
---------------------
-
-This distribution is developed on Red Hat Linux 6.0 and usually
-compiles on SunOS 5.6 and FreeBSD 2.27. I have reports of success of
-previous version on MacOS ( with CodeWarrior ) but I don't know about
-any other systems.
-
-The library is configured with automake. From the root directory, run
-
- ./configure
-
-To build all of the Makefiles for your system. If you will be installing the library, you may want to use the --prefix flag to set the directory where the library and header files will be installed.
-
- ./configure --prefix=/proj/local/
-
-If configure runs fine, run "make" to build the library and
-"make install" to install it.
-
-The current version of libical focuses on creating and
-manipulating iCal objects. With it, you can parse text representations
-of iCal components, add and remove sub-components, properties,
-parameters and values, and print the components back out as strings.
-
diff --git a/libical/MacOS/errno.h b/libical/MacOS/errno.h
deleted file mode 100644
index 4be3479b50..0000000000
--- a/libical/MacOS/errno.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)errno.h 7.13 (Berkeley) 2/19/91
- */
-
-#ifdef macintosh
-#include <errno.h>
-#else
-#ifndef KERNEL
-extern int errno; /* global error number */
-#endif
-#endif
-
-
-#define EPERM 1 /* Operation not permitted */
-/* MSL defines ENOMEM, EACCES, ENOENT, ENOSYS. We give in. */
-#ifndef ENOENT
-#define ENOENT 2 /* No such file or directory */
-#endif
-#define ESRCH 3 /* No such process */
-#define EINTR 4 /* Interrupted system call */
-#define EIO 5 /* Input/output error */
-#define ENXIO 6 /* Device not configured */
-#define E2BIG 7 /* Argument list too long */
-#define ENOEXEC 8 /* Exec format error */
-#define EBADF 9 /* Bad file descriptor */
-#define ECHILD 10 /* No child processes */
-#define EDEADLK 11 /* Resource deadlock avoided */
- /* 11 was EAGAIN */
-#ifndef ENOMEM
-#define ENOMEM 12 /* Cannot allocate memory */
-#define EACCES 13 /* Permission denied */
-#endif
-#define EFAULT 14 /* Bad address */
-#ifndef _POSIX_SOURCE
-#define ENOTBLK 15 /* Block device required */
-#define EBUSY 16 /* Device busy */
-#endif
-#define EEXIST 17 /* File exists */
-#define EXDEV 18 /* Cross-device link */
-#define ENODEV 19 /* Operation not supported by device */
-#define ENOTDIR 20 /* Not a directory */
-#define EISDIR 21 /* Is a directory */
-#define EINVAL 22 /* Invalid argument */
-#define ENFILE 23 /* Too many open files in system */
-#define EMFILE 24 /* Too many open files */
-#define ENOTTY 25 /* Inappropriate ioctl for device */
-#ifndef _POSIX_SOURCE
-#define ETXTBSY 26 /* Text file busy */
-#endif
-#define EFBIG 27 /* File too large */
-#define ENOSPC 28 /* No space left on device */
-#define ESPIPE 29 /* Illegal seek */
-#define EROFS 30 /* Read-only file system */
-#define EMLINK 31 /* Too many links */
-#define EPIPE 32 /* Broken pipe */
-
-#ifndef __MWERKS__
-/* math software */
-#define EDOM 33 /* Numerical argument out of domain */
-#define ERANGE 34 /* Result too large */
-#endif
-
-/* non-blocking and interrupt i/o */
-#if defined(macintosh)
-#ifndef EAGAIN
-#define EAGAIN 11
-#endif
-#else
-#define EAGAIN 35 /* Resource temporarily unavailable */
-#endif
-#define EWOULDBLOCK EAGAIN /* Operation would block */
-#ifndef _POSIX_SOURCE
-/* Did I tell that MSL also occupies errnos 33-40? We give in. */
-#if ENOMEM==37
-#define EINPROGRESS 136 /* Operation now in progress */
-#define EALREADY 137 /* Operation already in progress */
-
-/* ipc/network software -- argument errors */
-#define ENOTSOCK 138 /* Socket operation on non-socket */
-#define EDESTADDRREQ 139 /* Destination address required */
-#define EMSGSIZE 140 /* Message too long */
-#else
-#define EINPROGRESS 36 /* Operation now in progress */
-#define EALREADY 37 /* Operation already in progress */
-
-/* ipc/network software -- argument errors */
-#define ENOTSOCK 38 /* Socket operation on non-socket */
-#define EDESTADDRREQ 39 /* Destination address required */
-#define EMSGSIZE 40 /* Message too long */
-#endif
-#define EPROTOTYPE 41 /* Protocol wrong type for socket */
-#define ENOPROTOOPT 42 /* Protocol not available */
-#define EPROTONOSUPPORT 43 /* Protocol not supported */
-#define ESOCKTNOSUPPORT 44 /* Socket type not supported */
-#define EOPNOTSUPP 45 /* Operation not supported on socket */
-#define EPFNOSUPPORT 46 /* Protocol family not supported */
-#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */
-#define EADDRINUSE 48 /* Address already in use */
-#define EADDRNOTAVAIL 49 /* Can't assign requested address */
-
-/* ipc/network software -- operational errors */
-#define ENETDOWN 50 /* Network is down */
-#define ENETUNREACH 51 /* Network is unreachable */
-#define ENETRESET 52 /* Network dropped connection on reset */
-#define ECONNABORTED 53 /* Software caused connection abort */
-#define ECONNRESET 54 /* Connection reset by peer */
-#define ENOBUFS 55 /* No buffer space available */
-#define EISCONN 56 /* Socket is already connected */
-#define ENOTCONN 57 /* Socket is not connected */
-#define ESHUTDOWN 58 /* Can't send after socket shutdown */
-#define ETOOMANYREFS 59 /* Too many references: can't splice */
-#define ETIMEDOUT 60 /* Connection timed out */
-#define ECONNREFUSED 61 /* Connection refused */
-
-#define ELOOP 62 /* Too many levels of symbolic links */
-#endif /* _POSIX_SOURCE */
-#define ENAMETOOLONG 63 /* File name too long */
-
-/* should be rearranged */
-#ifndef _POSIX_SOURCE
-#define EHOSTDOWN 64 /* Host is down */
-#define EHOSTUNREACH 65 /* No route to host */
-#endif /* _POSIX_SOURCE */
-#define ENOTEMPTY 66 /* Directory not empty */
-
-/* quotas & mush */
-#ifndef _POSIX_SOURCE
-#define EPROCLIM 67 /* Too many processes */
-#define EUSERS 68 /* Too many users */
-#define EDQUOT 69 /* Disc quota exceeded */
-
-/* Network File System */
-#define ESTALE 70 /* Stale NFS file handle */
-#define EREMOTE 71 /* Too many levels of remote in path */
-#define EBADRPC 72 /* RPC struct is bad */
-#define ERPCMISMATCH 73 /* RPC version wrong */
-#define EPROGUNAVAIL 74 /* RPC prog. not avail */
-#define EPROGMISMATCH 75 /* Program version wrong */
-#define EPROCUNAVAIL 76 /* Bad procedure for program */
-#endif /* _POSIX_SOURCE */
-
-#define ENOLCK 77 /* No locks available */
-
-#ifndef ENOSYS
-#define ENOSYS 78 /* Function not implemented */
-#endif
-
-#define EFTYPE 79 /* Inappropriate file type or format */
-
-#ifdef KERNEL
-/* pseudo-errors returned inside kernel to modify return to process */
-#define ERESTART -1 /* restart syscall */
-#define EJUSTRETURN -2 /* don't modify regs, just return */
-#endif
diff --git a/libical/MacOS/libical.mcp b/libical/MacOS/libical.mcp
deleted file mode 100644
index 1c0ec4a35b..0000000000
--- a/libical/MacOS/libical.mcp
+++ /dev/null
Binary files differ
diff --git a/libical/MacOS/libical.mcp.exp b/libical/MacOS/libical.mcp.exp
deleted file mode 100644
index 07c84e0efc..0000000000
--- a/libical/MacOS/libical.mcp.exp
+++ /dev/null
@@ -1 +0,0 @@
-icalvalue_get_utcoffset icalvalue_set_utcoffset icalvalue_new_utcoffset icalvalue_get_uri icalvalue_set_uri icalvalue_new_uri icalvalue_get_trigger icalvalue_set_trigger icalvalue_new_trigger icalvalue_get_time icalvalue_set_time icalvalue_new_time icalvalue_get_text icalvalue_set_text icalvalue_new_text icalvalue_get_recur icalvalue_set_recur icalvalue_new_recur icalvalue_get_period icalvalue_set_period icalvalue_new_period icalvalue_get_integer icalvalue_set_integer icalvalue_new_integer icalvalue_get_geo icalvalue_set_geo icalvalue_new_geo icalvalue_get_float icalvalue_set_float icalvalue_new_float icalvalue_get_duration icalvalue_set_duration icalvalue_new_duration icalvalue_get_datetimeperiod icalvalue_set_datetimeperiod icalvalue_new_datetimeperiod icalvalue_get_datetimedate icalvalue_set_datetimedate icalvalue_new_datetimedate icalvalue_get_datetime icalvalue_set_datetime icalvalue_new_datetime icalvalue_get_date icalvalue_set_date icalvalue_new_date icalvalue_get_caladdress icalvalue_set_caladdress icalvalue_new_caladdress icalvalue_get_boolean icalvalue_set_boolean icalvalue_new_boolean icalvalue_get_binary icalvalue_set_binary icalvalue_new_binary icalvalue_get_attach icalvalue_set_attach icalvalue_new_attach icalvalue_isa_value icalvalue_isa icalvalue_as_ical_string icalvalue_trigger_as_ical_string icalvalue_period_as_ical_string icalvalue_datetimeperiod_as_ical_string icalvalue_recur_as_ical_string icalvalue_geo_as_ical_string icalvalue_float_as_ical_string icalvalue_datetimedate_as_ical_string icalvalue_datetime_as_ical_string icalvalue_date_as_ical_string icalvalue_time_as_ical_string icalvalue_duration_as_ical_string icalvalue_attach_as_ical_string icalvalue_string_as_ical_string icalvalue_int_as_ical_string icalvalue_binary_as_ical_string icalvalue_is_valid icalvalue_free icalvalue_new icalvalue_new_impl icalproperty_get_action icalproperty_set_action icalproperty_vanew_action icalproperty_new_action icalproperty_get_due icalproperty_set_due icalproperty_vanew_due icalproperty_new_due icalproperty_get_dtstamp icalproperty_set_dtstamp icalproperty_vanew_dtstamp icalproperty_new_dtstamp icalproperty_get_completed icalproperty_set_completed icalproperty_vanew_completed icalproperty_new_completed icalproperty_get_geo icalproperty_set_geo icalproperty_vanew_geo icalproperty_new_geo icalproperty_get_created icalproperty_set_created icalproperty_vanew_created icalproperty_new_created icalproperty_get_calscale icalproperty_set_calscale icalproperty_vanew_calscale icalproperty_new_calscale icalproperty_get_percentcomplete icalproperty_set_percentcomplete icalproperty_vanew_percentcomplete icalproperty_new_percentcomplete icalproperty_get_exrule icalproperty_set_exrule icalproperty_vanew_exrule icalproperty_new_exrule icalproperty_get_attach icalproperty_set_attach icalproperty_vanew_attach icalproperty_new_attach icalproperty_get_url icalproperty_set_url icalproperty_vanew_url icalproperty_new_url icalproperty_get_rdate icalproperty_set_rdate icalproperty_vanew_rdate icalproperty_new_rdate icalproperty_get_tzname icalproperty_set_tzname icalproperty_vanew_tzname icalproperty_new_tzname icalproperty_get_dtend icalproperty_set_dtend icalproperty_vanew_dtend icalproperty_new_dtend icalproperty_get_summary icalproperty_set_summary icalproperty_vanew_summary icalproperty_new_summary icalproperty_get_recurrenceid icalproperty_set_recurrenceid icalproperty_vanew_recurrenceid icalproperty_new_recurrenceid icalproperty_get_dtstart icalproperty_set_dtstart icalproperty_vanew_dtstart icalproperty_new_dtstart icalproperty_get_freebusy icalproperty_set_freebusy icalproperty_vanew_freebusy icalproperty_new_freebusy icalproperty_get_priority icalproperty_set_priority icalproperty_vanew_priority icalproperty_new_priority icalproperty_get_repeat icalproperty_set_repeat icalproperty_vanew_repeat icalproperty_new_repeat icalproperty_get_tzurl icalproperty_set_tzurl icalproperty_vanew_tzurl icalproperty_new_tzurl icalproperty_get_resources icalproperty_set_resources icalproperty_vanew_resources icalproperty_new_resources icalproperty_get_tzid icalproperty_set_tzid icalproperty_vanew_tzid icalproperty_new_tzid icalproperty_get_exdate icalproperty_set_exdate icalproperty_vanew_exdate icalproperty_new_exdate icalproperty_get_requeststatus icalproperty_set_requeststatus icalproperty_vanew_requeststatus icalproperty_new_requeststatus icalproperty_get_location icalproperty_set_location icalproperty_vanew_location icalproperty_new_location icalproperty_get_sequence icalproperty_set_sequence icalproperty_vanew_sequence icalproperty_new_sequence icalproperty_get_transp icalproperty_set_transp icalproperty_vanew_transp icalproperty_new_transp icalproperty_get_tzoffsetto icalproperty_set_tzoffsetto icalproperty_vanew_tzoffsetto icalproperty_new_tzoffsetto icalproperty_get_x_name icalproperty_get_x icalproperty_set_x_name icalproperty_set_x icalproperty_vanew_x icalproperty_new_x icalproperty_get_class icalproperty_set_class icalproperty_vanew_class icalproperty_new_class icalproperty_get_trigger icalproperty_set_trigger icalproperty_vanew_trigger icalproperty_new_trigger icalproperty_get_comment icalproperty_set_comment icalproperty_vanew_comment icalproperty_new_comment icalproperty_get_organizer icalproperty_set_organizer icalproperty_vanew_organizer icalproperty_new_organizer icalproperty_get_relatedto icalproperty_set_relatedto icalproperty_vanew_relatedto icalproperty_new_relatedto icalproperty_get_contact icalproperty_set_contact icalproperty_vanew_contact icalproperty_new_contact icalproperty_get_attendee icalproperty_set_attendee icalproperty_vanew_attendee icalproperty_new_attendee icalproperty_get_rrule icalproperty_set_rrule icalproperty_vanew_rrule icalproperty_new_rrule icalproperty_get_tzoffsetfrom icalproperty_set_tzoffsetfrom icalproperty_vanew_tzoffsetfrom icalproperty_new_tzoffsetfrom icalproperty_get_version icalproperty_set_version icalproperty_vanew_version icalproperty_new_version icalproperty_get_categories icalproperty_set_categories icalproperty_vanew_categories icalproperty_new_categories icalproperty_get_description icalproperty_set_description icalproperty_vanew_description icalproperty_new_description icalproperty_get_status icalproperty_set_status icalproperty_vanew_status icalproperty_new_status icalproperty_get_prodid icalproperty_set_prodid icalproperty_vanew_prodid icalproperty_new_prodid icalproperty_get_uid icalproperty_set_uid icalproperty_vanew_uid icalproperty_new_uid icalproperty_get_lastmodified icalproperty_set_lastmodified icalproperty_vanew_lastmodified icalproperty_new_lastmodified icalproperty_get_method icalproperty_set_method icalproperty_vanew_method icalproperty_new_method icalproperty_get_value icalproperty_set_value icalproperty_get_next_parameter icalproperty_get_first_parameter icalproperty_count_parameters icalproperty_remove_parameter icalproperty_add_parameter icalproperty_isa_property icalproperty_isa icalproperty_as_ical_string icalproperty_free icalproperty_new icalproperty_new_impl icalproperty_add_parameters icalparameter_set_x icalparameter_get_x icalparameter_new_x icalparameter_set_value icalparameter_get_value icalparameter_new_value icalparameter_set_tzid icalparameter_get_tzid icalparameter_new_tzid icalparameter_set_sentby icalparameter_get_sentby icalparameter_new_sentby icalparameter_set_rsvp icalparameter_get_rsvp icalparameter_new_rsvp icalparameter_set_role icalparameter_get_role icalparameter_new_role icalparameter_set_reltype icalparameter_get_reltype icalparameter_new_reltype icalparameter_set_related icalparameter_get_related icalparameter_new_related icalparameter_set_range icalparameter_get_range icalparameter_new_range icalparameter_set_partstat icalparameter_get_partstat icalparameter_new_partstat icalparameter_set_member icalparameter_get_member icalparameter_new_member icalparameter_set_language icalparameter_get_language icalparameter_new_language icalparameter_set_fmttype icalparameter_get_fmttype icalparameter_new_fmttype icalparameter_set_fbtype icalparameter_get_fbtype icalparameter_new_fbtype icalparameter_set_encoding icalparameter_get_encoding icalparameter_new_encoding icalparameter_set_dir icalparameter_get_dir icalparameter_new_dir icalparameter_set_delegatedto icalparameter_get_delegatedto icalparameter_new_delegatedto icalparameter_set_delegatedfrom icalparameter_get_delegatedfrom icalparameter_new_delegatedfrom icalparameter_set_cutype icalparameter_get_cutype icalparameter_new_cutype icalparameter_set_cn icalparameter_get_cn icalparameter_new_cn icalparameter_set_altrep icalparameter_get_altrep icalparameter_new_altrep icalparameter_get_xname icalparameterset_xname icalparameter_isa_parameter icalparameter_isa icalparameter_is_valid icalparameter_as_ical_string icalparameter_free icalparameter_new icalparameter_new_impl icalenum_string_to_component_kind icalenum_component_kind_to_string icalenum_value_kind_by_prop icalenum_string_to_parameter_kind icalenum_parameter_kind_to_string icalenum_string_to_property_kind icalenum_property_kind_to_string icalcomponent_get_component icalcomponent_get_next_component icalcomponent_get_first_component icalcomponent_count_components icalcomponent_remove_component icalcomponent_add_component icalcomponent_get_properties icalcomponent_get_next_property icalcomponent_get_first_property icalcomponent_count_properties icalcomponent_remove_property icalcomponent_add_property icalcomponent_isa_component icalcomponent_isa icalcomponent_is_valid icalcomponent_as_ical_string icalcomponent_free icalcomponent_vanew icalcomponent_new icalcomponent_new_impl icalcomponent_add_children #pvl_list_count #pvl_elem_count #pvl_apply #pvl_data #pvl_tail #pvl_head #pvl_prior #pvl_next #pvl_count #pvl_clear #pvl_find_next #pvl_find #pvl_remove #pvl_insert_before #pvl_insert_after #pvl_insert_ordered #pvl_pop #pvl_push #pvl_shift #pvl_unshift #pvl_new_element #pvl_newlist #strdup icalrestriction_records icalrestriction_is_parameter_allowed icalrestriction_get_component_restriction icalrestriction_get_property_restriction icalerrno icalerror_set_errno icalerror_clear_errno buffer_ring initialized buffer_pos icalmemory_append_string icalmemory_free_buffer icalmemory_resize_buffer icalmemory_new_buffer icalmemory_free_tmp_buffer icalmemory_resize_tmp_buffer icalmemory_new_tmp_buffer #__msipl_rd__3std # std::__msipl_rd #__dt__Q23std18__random_generatorFv # std::__random_generator::~__random_generator() #seed__Q23std18__random_generatorFUl # std::__random_generator::seed(unsigned long) #setfill__3stdFi # std::setfill(int) #setbase__3stdFi # std::setbase(int) #setiosflags__3stdFl # std::setiosflags(long) #resetiosflags__3stdFl # std::resetiosflags(long) #ffill__3stdFRQ23std35basic_ios<w,Q23std14char_traits<w>>w # std::ffill(std::basic_ios<wchar_t, std::char_traits<wchar_t>>&,wchar_t) #ffill__3stdFRQ23std35basic_ios<c,Q23std14char_traits<c>>i # std::ffill(std::basic_ios<char, std::char_traits<char>>&,int) #setw__3stdFi # std::setw(int) #setprecision__3stdFi # std::setprecision(int) #__vt__Q23std39basic_istream<c,Q23std14char_traits<c>> # std::basic_istream<char, std::char_traits<char>>::__vt #__vt__Q23std35basic_ios<c,Q23std14char_traits<c>> # std::basic_ios<char, std::char_traits<char>>::__vt #__vt__Q23std39basic_ostream<c,Q23std14char_traits<c>> # std::basic_ostream<char, std::char_traits<char>>::__vt #__vt__Q23std39basic_filebuf<c,Q23std14char_traits<c>> # std::basic_filebuf<char, std::char_traits<char>>::__vt #__vt__Q23std41basic_streambuf<c,Q23std14char_traits<c>> # std::basic_streambuf<char, std::char_traits<char>>::__vt #__vt__Q23std8bad_cast # std::bad_cast::__vt #__vt__Q23std9exception # std::exception::__vt #cerr__3std # std::cerr #clog__3std # std::clog #cout__3std # std::cout #cin__3std # std::cin #index__Q23std8ios_base # std::ios_base::index #heap_size__Q23std14base_allocator # std::base_allocator::heap_size #end_free__Q23std14base_allocator # std::base_allocator::end_free #start_free__Q23std14base_allocator # std::base_allocator::start_free #free_list__Q23std14base_allocator # std::base_allocator::free_list #init_cnt__Q33std8ios_base4Init # std::ios_base::Init::init_cnt #use_facet<Q23std8ctype<c>>__3stdFRCQ23std6locale # std::use_facet<Q23std8ctype<c>>(const std::locale&) #what__Q23std9exceptionCFv # std::exception::what() const #what__Q23std8bad_castCFv # std::bad_cast::what() const #__dt__Q23std9exceptionFv # std::exception::~exception() #use_facet<Q23std14codecvt<c,c,i>>__3stdFRCQ23std6locale # std::use_facet<Q23std14codecvt<c,c,i>>(const std::locale&) #__dt__Q23std8bad_castFv # std::bad_cast::~bad_cast() #init__Q23std35basic_ios<c,Q23std14char_traits<c>>FPQ23std41basic_streambuf<c,Q23std14char_traits<c>> # std::basic_ios<char, std::char_traits<char>>::init(std::basic_streambuf<char, std::char_traits<char>>*) #always_noconv__Q23std23_Generic_codecvt<c,c,i>CFv # std::_Generic_codecvt<char, char, int>::always_noconv() const #out__Q23std23_Generic_codecvt<c,c,i>CFRiPCcPCcRPCcPcPcRPc # std::_Generic_codecvt<char, char, int>::out(int&,const char*,const char*,const char*&,char*,char*,char*&) const #__ct__Q23std39basic_ostream<c,Q23std14char_traits<c>>FPQ23std41basic_streambuf<c,Q23std14char_traits<c>> # std::basic_ostream<char, std::char_traits<char>>::basic_ostream(std::basic_streambuf<char, std::char_traits<char>>*) #__ct__Q23std39basic_istream<c,Q23std14char_traits<c>>FPQ23std41basic_streambuf<c,Q23std14char_traits<c>> # std::basic_istream<char, std::char_traits<char>>::basic_istream(std::basic_streambuf<char, std::char_traits<char>>*) #__dt__Q33std39basic_ostream<c,Q23std14char_traits<c>>6sentryFv # std::basic_ostream<char, std::char_traits<char>>::sentry::~sentry() #flush__Q23std39basic_ostream<c,Q23std14char_traits<c>>Fv # std::basic_ostream<char, std::char_traits<char>>::flush() #close__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::close() #overflow__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fi # std::basic_streambuf<char, std::char_traits<char>>::overflow(int) #xsputn__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FPCci # std::basic_streambuf<char, std::char_traits<char>>::xsputn(const char*,int) #pbackfail__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fi # std::basic_streambuf<char, std::char_traits<char>>::pbackfail(int) #uflow__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fv # std::basic_streambuf<char, std::char_traits<char>>::uflow() #underflow__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fv # std::basic_streambuf<char, std::char_traits<char>>::underflow() #xsgetn__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FPci # std::basic_streambuf<char, std::char_traits<char>>::xsgetn(char*,int) #showmanyc__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fv # std::basic_streambuf<char, std::char_traits<char>>::showmanyc() #sync__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fv # std::basic_streambuf<char, std::char_traits<char>>::sync() #seekpos__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FQ23std7fpos<i>s # std::basic_streambuf<char, std::char_traits<char>>::seekpos(std::fpos<int>,short) #seekoff__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FlQ33std8ios_base7seekdirs # std::basic_streambuf<char, std::char_traits<char>>::seekoff(long,std::ios_base::seekdir,short) #setbuf__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FPci # std::basic_streambuf<char, std::char_traits<char>>::setbuf(char*,int) #imbue__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FRCQ23std6locale # std::basic_streambuf<char, std::char_traits<char>>::imbue(const std::locale&) #xsputn__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FPCci # std::basic_filebuf<char, std::char_traits<char>>::xsputn(const char*,int) #xsgetn__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FPci # std::basic_filebuf<char, std::char_traits<char>>::xsgetn(char*,int) #showmanyc__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::showmanyc() #imbue__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FRCQ23std6locale # std::basic_filebuf<char, std::char_traits<char>>::imbue(const std::locale&) #uflow__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::uflow() #sync__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::sync() #setbuf__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FPci # std::basic_filebuf<char, std::char_traits<char>>::setbuf(char*,int) #seekpos__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FQ23std7fpos<i>s # std::basic_filebuf<char, std::char_traits<char>>::seekpos(std::fpos<int>,short) #seekoff__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FlQ33std8ios_base7seekdirs # std::basic_filebuf<char, std::char_traits<char>>::seekoff(long,std::ios_base::seekdir,short) #underflow__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::underflow() #pbackfail__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fi # std::basic_filebuf<char, std::char_traits<char>>::pbackfail(int) #overflow__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fi # std::basic_filebuf<char, std::char_traits<char>>::overflow(int) #@8@68@__dt__Q23std39basic_ostream<c,Q23std14char_traits<c>>Fv #__dt__Q23std35basic_ios<c,Q23std14char_traits<c>>Fv # std::basic_ios<char, std::char_traits<char>>::~basic_ios() #@12@68@__dt__Q23std39basic_istream<c,Q23std14char_traits<c>>Fv #__dt__Q23std39basic_istream<c,Q23std14char_traits<c>>Fv # std::basic_istream<char, std::char_traits<char>>::~basic_istream() #__dt__Q23std39basic_ostream<c,Q23std14char_traits<c>>Fv # std::basic_ostream<char, std::char_traits<char>>::~basic_ostream() #__dt__Q33std8ios_base4InitFv # std::ios_base::Init::~Init() #__dt__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fv # std::basic_streambuf<char, std::char_traits<char>>::~basic_streambuf() #__ct__Q33std8ios_base4InitFv # std::ios_base::Init::Init() #__dt__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::~basic_filebuf() #__mask_map__3std # std::__mask_map #__vt__Q23std15moneypunct<w,1> # std::moneypunct<wchar_t, 1>::__vt #__vt__Q23std15moneypunct<w,0> # std::moneypunct<wchar_t, 0>::__vt #__vt__Q23std15moneypunct<c,1> # std::moneypunct<char, 1>::__vt #__vt__Q23std15moneypunct<c,0> # std::moneypunct<char, 0>::__vt #__vt__Q23std12timepunct<w> # std::timepunct<wchar_t>::__vt #__vt__Q23std12timepunct<c> # std::timepunct<char>::__vt #__vt__Q23std11numpunct<w> # std::numpunct<wchar_t>::__vt #__vt__Q23std11numpunct<c> # std::numpunct<char>::__vt #__vt__Q23std14codecvt<w,c,i> # std::codecvt<wchar_t, char, int>::__vt #__vt__Q23std14codecvt<c,c,i> # std::codecvt<char, char, int>::__vt #__vt__Q23std15ctype_byname<c> # std::ctype_byname<char>::__vt #__vt__Q23std8ctype<c> # std::ctype<char>::__vt #__vt__Q23std8ctype<w> # std::ctype<wchar_t>::__vt #__vt__Q33std6locale5facet # std::locale::facet::__vt #__vt__Q23std13runtime_error # std::runtime_error::__vt #__vt__Q23std12out_of_range # std::out_of_range::__vt #__vt__Q23std12length_error # std::length_error::__vt #__vt__Q23std11logic_error # std::logic_error::__vt #__vt__Q23std9bad_alloc # std::bad_alloc::__vt #__vt__Q23std23_Generic_codecvt<c,c,i> # std::_Generic_codecvt<char, char, int>::__vt #__vt__Q23std23_Generic_codecvt<w,c,i> # std::_Generic_codecvt<wchar_t, char, int>::__vt #__vt__Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::num_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std20_Generic_numpunct<c> # std::_Generic_numpunct<char>::__vt #__vt__Q23std20_Generic_numpunct<w> # std::_Generic_numpunct<wchar_t>::__vt #__vt__Q23std10collate<c> # std::collate<char>::__vt #__vt__Q23std10collate<w> # std::collate<wchar_t>::__vt #__vt__Q23std21_Generic_timepunct<c> # std::_Generic_timepunct<char>::__vt #__vt__Q23std21_Generic_timepunct<w> # std::_Generic_timepunct<wchar_t>::__vt #__vt__Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::time_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::money_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std24_Generic_moneypunct<c,0> # std::_Generic_moneypunct<char, 0>::__vt #__vt__Q23std24_Generic_moneypunct<c,1> # std::_Generic_moneypunct<char, 1>::__vt #__vt__Q23std24_Generic_moneypunct<w,0> # std::_Generic_moneypunct<wchar_t, 0>::__vt #__vt__Q23std24_Generic_moneypunct<w,1> # std::_Generic_moneypunct<wchar_t, 1>::__vt #id__Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::num_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std10collate<c> # std::collate<char>::id #__init__id__Q23std10collate<c> #id__Q23std10collate<w> # std::collate<wchar_t>::id #__init__id__Q23std10collate<w> #id__Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::time_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::money_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std15moneypunct<w,1> # std::moneypunct<wchar_t, 1>::id #__init__id__Q23std15moneypunct<w,1> #id__Q23std15moneypunct<w,0> # std::moneypunct<wchar_t, 0>::id #__init__id__Q23std15moneypunct<w,0> #id__Q23std15moneypunct<c,1> # std::moneypunct<char, 1>::id #__init__id__Q23std15moneypunct<c,1> #id__Q23std15moneypunct<c,0> # std::moneypunct<char, 0>::id #__init__id__Q23std15moneypunct<c,0> #id__Q23std12timepunct<w> # std::timepunct<wchar_t>::id #__init__id__Q23std12timepunct<w> #id__Q23std12timepunct<c> # std::timepunct<char>::id #__init__id__Q23std12timepunct<c> #id__Q23std11numpunct<w> # std::numpunct<wchar_t>::id #__init__id__Q23std11numpunct<w> #id__Q23std11numpunct<c> # std::numpunct<char>::id #__init__id__Q23std11numpunct<c> #id__Q23std14codecvt<w,c,i> # std::codecvt<wchar_t, char, int>::id #__init__id__Q23std14codecvt<w,c,i> #id__Q23std14codecvt<c,c,i> # std::codecvt<char, char, int>::id #__init__id__Q23std14codecvt<c,c,i> #id__Q23std8ctype<c> # std::ctype<char>::id #__init__id__Q23std8ctype<c> #id__Q23std8ctype<w> # std::ctype<wchar_t>::id #__init__id__Q23std8ctype<w> #global_s__Q23std6locale # std::locale::global_s #id_count_s__Q33std6locale2id # std::locale::id::id_count_s #insert__Q23std32vector<Pv,Q23std13allocator<Pv>>FPPvUlRCPv # std::vector<void*, std::allocator<void*>>::insert(void**,unsigned long,void*const&) #erase__Q23std32vector<Pv,Q23std13allocator<Pv>>FPPvPPv # std::vector<void*, std::allocator<void*>>::erase(void**,void**) #do_assign<PCPv>__Q23std32vector<Pv,Q23std13allocator<Pv>>FPCPvPCPvQ23std20forward_iterator_tag # std::vector<void*, std::allocator<void*>>::do_assign<PCPv>(void*const*,void*const*,std::forward_iterator_tag) #resize__Q23std32vector<Pv,Q23std13allocator<Pv>>FUlPv # std::vector<void*, std::allocator<void*>>::resize(unsigned long,void*) #compare__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>CFUlUlPCcUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::compare(unsigned long,unsigned long,const char*,unsigned long) const #max_size__Q23std13allocator<Pv>CFv # std::allocator<void*>::max_size() const #max_size__Q23std12allocator<w>CFv # std::allocator<wchar_t>::max_size() const #max_size__Q23std12allocator<c>CFv # std::allocator<char>::max_size() const #init__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FPCcPCcRCQ23std12allocator<c>Q23std26random_access_iterator_tag # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::init(const char*,const char*,const std::allocator<char>&,std::random_access_iterator_tag) #append__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>UlUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::append(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&,unsigned long,unsigned long) #init__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FPCwPCwRCQ23std12allocator<w>Q23std26random_access_iterator_tag # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::init(const wchar_t*,const wchar_t*,const std::allocator<wchar_t>&,std::random_access_iterator_tag) #__dt__Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~money_put() #__dt__Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::~money_put() #__dt__Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::money_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~money_get() #__dt__Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::~money_get() #__dt__Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~time_put() #__dt__Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::~time_put() #__dt__Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::time_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~time_get() #__dt__Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::~time_get() #__dt__Q23std10collate<w>Fv # std::collate<wchar_t>::~collate() #__dt__Q23std10collate<c>Fv # std::collate<char>::~collate() #__dt__Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~num_put() #__dt__Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::~num_put() #__dt__Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::num_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~num_get() #__dt__Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::~num_get() #what__Q23std9bad_allocCFv # std::bad_alloc::what() const #what__Q23std11logic_errorCFv # std::logic_error::what() const #replace<Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::time_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std12timepunct<w>>__Q33std6locale3impFRCQ23std12timepunct<w> # std::locale::imp::replace<Q23std12timepunct<w>>(const std::timepunct<wchar_t>&) #replace<Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std12timepunct<c>>__Q33std6locale3impFRCQ23std12timepunct<c> # std::locale::imp::replace<Q23std12timepunct<c>>(const std::timepunct<char>&) #replace<Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::num_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std11numpunct<w>>__Q33std6locale3impFRCQ23std11numpunct<w> # std::locale::imp::replace<Q23std11numpunct<w>>(const std::numpunct<wchar_t>&) #replace<Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std11numpunct<c>>__Q33std6locale3impFRCQ23std11numpunct<c> # std::locale::imp::replace<Q23std11numpunct<c>>(const std::numpunct<char>&) #replace<Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::money_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std15moneypunct<w,1>>__Q33std6locale3impFRCQ23std15moneypunct<w,1> # std::locale::imp::replace<Q23std15moneypunct<w,1>>(const std::moneypunct<wchar_t, 1>&) #replace<Q23std15moneypunct<w,0>>__Q33std6locale3impFRCQ23std15moneypunct<w,0> # std::locale::imp::replace<Q23std15moneypunct<w,0>>(const std::moneypunct<wchar_t, 0>&) #replace<Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std15moneypunct<c,1>>__Q33std6locale3impFRCQ23std15moneypunct<c,1> # std::locale::imp::replace<Q23std15moneypunct<c,1>>(const std::moneypunct<char, 1>&) #replace<Q23std15moneypunct<c,0>>__Q33std6locale3impFRCQ23std15moneypunct<c,0> # std::locale::imp::replace<Q23std15moneypunct<c,0>>(const std::moneypunct<char, 0>&) #replace<Q23std14codecvt<w,c,i>>__Q33std6locale3impFRCQ23std14codecvt<w,c,i> # std::locale::imp::replace<Q23std14codecvt<w,c,i>>(const std::codecvt<wchar_t, char, int>&) #replace<Q23std8ctype<w>>__Q33std6locale3impFRCQ23std8ctype<w> # std::locale::imp::replace<Q23std8ctype<w>>(const std::ctype<wchar_t>&) #replace<Q23std14codecvt<c,c,i>>__Q33std6locale3impFRCQ23std14codecvt<c,c,i> # std::locale::imp::replace<Q23std14codecvt<c,c,i>>(const std::codecvt<char, char, int>&) #replace<Q23std8ctype<c>>__Q33std6locale3impFRCQ23std8ctype<c> # std::locale::imp::replace<Q23std8ctype<c>>(const std::ctype<char>&) #replace<Q23std10collate<w>>__Q33std6locale3impFRCQ23std10collate<w> # std::locale::imp::replace<Q23std10collate<w>>(const std::collate<wchar_t>&) #replace<Q23std10collate<c>>__Q33std6locale3impFRCQ23std10collate<c> # std::locale::imp::replace<Q23std10collate<c>>(const std::collate<char>&) #use_facet<Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std12timepunct<w>>__3stdFRCQ23std6locale # std::use_facet<Q23std12timepunct<w>>(const std::locale&) #use_facet<Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std12timepunct<c>>__3stdFRCQ23std6locale # std::use_facet<Q23std12timepunct<c>>(const std::locale&) #use_facet<Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std11numpunct<w>>__3stdFRCQ23std6locale # std::use_facet<Q23std11numpunct<w>>(const std::locale&) #use_facet<Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std11numpunct<c>>__3stdFRCQ23std6locale # std::use_facet<Q23std11numpunct<c>>(const std::locale&) #use_facet<Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std15moneypunct<w,1>>__3stdFRCQ23std6locale # std::use_facet<Q23std15moneypunct<w,1>>(const std::locale&) #use_facet<Q23std15moneypunct<w,0>>__3stdFRCQ23std6locale # std::use_facet<Q23std15moneypunct<w,0>>(const std::locale&) #use_facet<Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std15moneypunct<c,1>>__3stdFRCQ23std6locale # std::use_facet<Q23std15moneypunct<c,1>>(const std::locale&) #use_facet<Q23std15moneypunct<c,0>>__3stdFRCQ23std6locale # std::use_facet<Q23std15moneypunct<c,0>>(const std::locale&) #use_facet<Q23std14codecvt<w,c,i>>__3stdFRCQ23std6locale # std::use_facet<Q23std14codecvt<w,c,i>>(const std::locale&) #use_facet<Q23std8ctype<w>>__3stdFRCQ23std6locale # std::use_facet<Q23std8ctype<w>>(const std::locale&) #use_facet<Q23std10collate<w>>__3stdFRCQ23std6locale # std::use_facet<Q23std10collate<w>>(const std::locale&) #use_facet<Q23std10collate<c>>__3stdFRCQ23std6locale # std::use_facet<Q23std10collate<c>>(const std::locale&) #__ct__Q23std32vector<Pv,Q23std13allocator<Pv>>FRCQ23std32vector<Pv,Q23std13allocator<Pv>> # std::vector<void*, std::allocator<void*>>::vector(const std::vector<void*, std::allocator<void*>>&) #__as__Q23std32vector<Pv,Q23std13allocator<Pv>>FRCQ23std32vector<Pv,Q23std13allocator<Pv>> # std::vector<void*, std::allocator<void*>>::operator =(const std::vector<void*, std::allocator<void*>>&) #init__Q23std32vector<Pv,Q23std13allocator<Pv>>FUlRCPv # std::vector<void*, std::allocator<void*>>::init(unsigned long,void*const&) #__ne<c,Q23std14char_traits<c>,Q23std12allocator<c>>__3stdFRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>PCc # std::operator !=<char, std::char_traits<char>, std::allocator<char>>(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&,const char*) #__pl<c,Q23std14char_traits<c>,Q23std12allocator<c>>__3stdFRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>RCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>> # std::operator +<char, std::char_traits<char>, std::allocator<char>>(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&,const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&) #__ct__Q33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArrayFRCQ23std12allocator<w>Ul # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray::CharArray(const std::allocator<wchar_t>&,unsigned long) #__dt__Q23std40_EmptyMemberOpt<Q23std12allocator<w>,Ul>Fv # std::_EmptyMemberOpt<std::allocator<wchar_t>, unsigned long>::~_EmptyMemberOpt() #__ct__Q33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArrayFRCQ33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArray # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray::CharArray(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray&) #get_allocator__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>CFv # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::get_allocator() const #__ct__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FRCQ23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>UlUl # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::basic_string(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>&,unsigned long,unsigned long) #__ct__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FPCwRCQ23std12allocator<w> # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::basic_string(const wchar_t*,const std::allocator<wchar_t>&) #init__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FUlwRCQ23std12allocator<w> # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::init(unsigned long,wchar_t,const std::allocator<wchar_t>&) #change_size__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FUlb # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::change_size(unsigned long,bool) #__ct__Q33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArrayFRCQ23std12allocator<c>Ul # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray::CharArray(const std::allocator<char>&,unsigned long) #get_allocator__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>CFv # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::get_allocator() const #__ct__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>UlUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&,unsigned long,unsigned long) #__ct__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FPCcRCQ23std12allocator<c> # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string(const char*,const std::allocator<char>&) #__dt__Q23std40_EmptyMemberOpt<Q23std12allocator<c>,Ul>Fv # std::_EmptyMemberOpt<std::allocator<char>, unsigned long>::~_EmptyMemberOpt() #__ct__Q33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArrayFRCQ33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArray # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray::CharArray(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray&) #assign__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>UlUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::assign(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&,unsigned long,unsigned long) #replace__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUlUlUlc # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::replace(unsigned long,unsigned long,unsigned long,char) #__dt__Q23std12out_of_rangeFv # std::out_of_range::~out_of_range() #init__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUlcRCQ23std12allocator<c> # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::init(unsigned long,char,const std::allocator<char>&) #__dt__Q23std11logic_errorFv # std::logic_error::~logic_error() #change_size__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUlb # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::change_size(unsigned long,bool) #__dt__Q23std12length_errorFv # std::length_error::~length_error() #__ct__62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>>FPQ33std6locale3imp # _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>::_RefCountedPtr(std::locale::imp*) #__as__62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>>FRC62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>> # _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>::operator =(const _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>&) #__dt__28_RefCountedPtr<c,9_Array<c>>Fv # _RefCountedPtr<char, _Array<char>>::~_RefCountedPtr() #__ct__62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>>FRC62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>> # _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>::_RefCountedPtr(const _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>&) #assign__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FPCcUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::assign(const char*,unsigned long) #__vc__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::operator [](unsigned long) #resize__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUlc # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::resize(unsigned long,char) #end__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>Fv # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::end() #begin__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>Fv # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::begin() #__ct__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FRCQ23std12allocator<c> # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string(const std::allocator<char>&) #__vc__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FUl # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::operator [](unsigned long) #resize__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FUlw # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::resize(unsigned long,wchar_t) #__ct__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FRCQ23std12allocator<w> # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::basic_string(const std::allocator<wchar_t>&) #__dt__Q23std9bad_allocFv # std::bad_alloc::~bad_alloc() #__dt__Q23std23_Generic_codecvt<c,c,i>Fv # std::_Generic_codecvt<char, char, int>::~_Generic_codecvt() #__ct__Q23std23_Generic_codecvt<c,c,i>FUl # std::_Generic_codecvt<char, char, int>::_Generic_codecvt(unsigned long) #__dt__Q23std23_Generic_codecvt<w,c,i>Fv # std::_Generic_codecvt<wchar_t, char, int>::~_Generic_codecvt() #__ct__Q23std23_Generic_codecvt<w,c,i>FUl # std::_Generic_codecvt<wchar_t, char, int>::_Generic_codecvt(unsigned long) #__ct__Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::num_get(unsigned long) #__ct__Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::num_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::num_get(unsigned long) #__ct__Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::num_put(unsigned long) #__ct__Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::num_put(unsigned long) #__dt__Q23std20_Generic_numpunct<c>Fv # std::_Generic_numpunct<char>::~_Generic_numpunct() #__ct__Q23std20_Generic_numpunct<c>FUl # std::_Generic_numpunct<char>::_Generic_numpunct(unsigned long) #__dt__Q23std20_Generic_numpunct<w>Fv # std::_Generic_numpunct<wchar_t>::~_Generic_numpunct() #__ct__Q23std20_Generic_numpunct<w>FUl # std::_Generic_numpunct<wchar_t>::_Generic_numpunct(unsigned long) #__ct__Q23std10collate<c>FUl # std::collate<char>::collate(unsigned long) #__ct__Q23std10collate<w>FUl # std::collate<wchar_t>::collate(unsigned long) #__dt__Q23std21_Generic_timepunct<c>Fv # std::_Generic_timepunct<char>::~_Generic_timepunct() #__ct__Q23std21_Generic_timepunct<c>FUl # std::_Generic_timepunct<char>::_Generic_timepunct(unsigned long) #__dt__Q23std21_Generic_timepunct<w>Fv # std::_Generic_timepunct<wchar_t>::~_Generic_timepunct() #__ct__Q23std21_Generic_timepunct<w>FUl # std::_Generic_timepunct<wchar_t>::_Generic_timepunct(unsigned long) #__ct__Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::time_get(unsigned long) #__ct__Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::time_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::time_get(unsigned long) #__ct__Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::time_put(unsigned long) #__ct__Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::time_put(unsigned long) #__ct__Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::money_get(unsigned long) #__ct__Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::money_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::money_get(unsigned long) #__ct__Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::money_put(unsigned long) #__ct__Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::money_put(unsigned long) #__dt__Q23std24_Generic_moneypunct<c,0>Fv # std::_Generic_moneypunct<char, 0>::~_Generic_moneypunct() #__ct__Q23std24_Generic_moneypunct<c,0>FUl # std::_Generic_moneypunct<char, 0>::_Generic_moneypunct(unsigned long) #__dt__Q23std24_Generic_moneypunct<c,1>Fv # std::_Generic_moneypunct<char, 1>::~_Generic_moneypunct() #__ct__Q23std24_Generic_moneypunct<c,1>FUl # std::_Generic_moneypunct<char, 1>::_Generic_moneypunct(unsigned long) #__dt__Q23std24_Generic_moneypunct<w,0>Fv # std::_Generic_moneypunct<wchar_t, 0>::~_Generic_moneypunct() #__ct__Q23std24_Generic_moneypunct<w,0>FUl # std::_Generic_moneypunct<wchar_t, 0>::_Generic_moneypunct(unsigned long) #__dt__Q23std24_Generic_moneypunct<w,1>Fv # std::_Generic_moneypunct<wchar_t, 1>::~_Generic_moneypunct() #__ct__Q23std24_Generic_moneypunct<w,1>FUl # std::_Generic_moneypunct<wchar_t, 1>::_Generic_moneypunct(unsigned long) #__ct<PQ33std6locale5facet>__Q23std13allocator<Pv>FRCQ23std31allocator<PQ33std6locale5facet> # std::allocator<void*>::!<std::locale::facet*>(const std::allocator<std::locale::facet*>&) #__ct<c>__Q23std88allocator<Q33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArray>FRCQ23std12allocator<c> # std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray>::!<char>(const std::allocator<char>&) #__ct<w>__Q23std88allocator<Q33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArray>FRCQ23std12allocator<w> # std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray>::!<wchar_t>(const std::allocator<wchar_t>&) #what__Q23std13runtime_errorCFv # std::runtime_error::what() const #__dt__Q23std8ctype<w>Fv # std::ctype<wchar_t>::~ctype() #__dt__Q23std15ctype_byname<c>Fv # std::ctype_byname<char>::~ctype_byname() #__dt__Q23std14codecvt<c,c,i>Fv # std::codecvt<char, char, int>::~codecvt() #__dt__Q23std14codecvt<w,c,i>Fv # std::codecvt<wchar_t, char, int>::~codecvt() #do_falsename__Q23std11numpunct<c>CFv # std::numpunct<char>::do_falsename() const #do_truename__Q23std11numpunct<c>CFv # std::numpunct<char>::do_truename() const #do_grouping__Q23std11numpunct<c>CFv # std::numpunct<char>::do_grouping() const #do_thousands_sep__Q23std11numpunct<c>CFv # std::numpunct<char>::do_thousands_sep() const #do_decimal_point__Q23std11numpunct<c>CFv # std::numpunct<char>::do_decimal_point() const #__dt__Q23std11numpunct<c>Fv # std::numpunct<char>::~numpunct() #do_falsename__Q23std11numpunct<w>CFv # std::numpunct<wchar_t>::do_falsename() const #do_truename__Q23std11numpunct<w>CFv # std::numpunct<wchar_t>::do_truename() const #do_grouping__Q23std11numpunct<w>CFv # std::numpunct<wchar_t>::do_grouping() const #do_thousands_sep__Q23std11numpunct<w>CFv # std::numpunct<wchar_t>::do_thousands_sep() const #do_decimal_point__Q23std11numpunct<w>CFv # std::numpunct<wchar_t>::do_decimal_point() const #__dt__Q23std11numpunct<w>Fv # std::numpunct<wchar_t>::~numpunct() #__dt__Q23std12timepunct<c>Fv # std::timepunct<char>::~timepunct() #__dt__Q23std12timepunct<w>Fv # std::timepunct<wchar_t>::~timepunct() #do_neg_format__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_neg_format() const #do_pos_format__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_pos_format() const #do_frac_digits__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_frac_digits() const #do_negative_sign__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_negative_sign() const #do_positive_sign__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_positive_sign() const #do_curr_symbol__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_curr_symbol() const #do_grouping__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_grouping() const #do_thousands_sep__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_thousands_sep() const #do_decimal_point__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_decimal_point() const #__dt__Q23std15moneypunct<c,0>Fv # std::moneypunct<char, 0>::~moneypunct() #do_neg_format__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_neg_format() const #do_pos_format__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_pos_format() const #do_frac_digits__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_frac_digits() const #do_negative_sign__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_negative_sign() const #do_positive_sign__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_positive_sign() const #do_curr_symbol__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_curr_symbol() const #do_grouping__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_grouping() const #do_thousands_sep__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_thousands_sep() const #do_decimal_point__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_decimal_point() const #__dt__Q23std15moneypunct<c,1>Fv # std::moneypunct<char, 1>::~moneypunct() #__dt__Q23std88allocator<Q33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArray>Fv # std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray>::~allocator() #__dt__Q23std192_EmptyMemberOpt<Q23std88allocator<Q33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArray>,PQ33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArray>Fv # std::_EmptyMemberOpt<std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray>, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray*>::~_EmptyMemberOpt() #__ct__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FUlwRCQ23std12allocator<w> # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::basic_string(unsigned long,wchar_t,const std::allocator<wchar_t>&) #do_neg_format__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_neg_format() const #do_pos_format__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_pos_format() const #do_frac_digits__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_frac_digits() const #do_negative_sign__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_negative_sign() const #do_positive_sign__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_positive_sign() const #do_curr_symbol__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_curr_symbol() const #do_grouping__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_grouping() const #do_thousands_sep__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_thousands_sep() const #do_decimal_point__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_decimal_point() const #__dt__Q23std15moneypunct<w,0>Fv # std::moneypunct<wchar_t, 0>::~moneypunct() #__dt__Q23std88allocator<Q33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArray>Fv # std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray>::~allocator() #__dt__Q23std192_EmptyMemberOpt<Q23std88allocator<Q33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArray>,PQ33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArray>Fv # std::_EmptyMemberOpt<std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray>, std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray*>::~_EmptyMemberOpt() #__ct__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUlcRCQ23std12allocator<c> # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string(unsigned long,char,const std::allocator<char>&) #do_neg_format__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_neg_format() const #do_pos_format__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_pos_format() const #do_frac_digits__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_frac_digits() const #do_negative_sign__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_negative_sign() const #do_positive_sign__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_positive_sign() const #do_curr_symbol__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_curr_symbol() const #do_grouping__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_grouping() const #do_thousands_sep__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_thousands_sep() const #do_decimal_point__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_decimal_point() const #__dt__Q23std15moneypunct<w,1>Fv # std::moneypunct<wchar_t, 1>::~moneypunct() #__two_exp__3stdFs # std::__two_exp(short) #__amu__Q23std4_BCDFQ23std4_BCD # std::_BCD::operator *=(std::_BCD) #__apl__Q23std4_BCDFQ23std4_BCD # std::_BCD::operator +=(std::_BCD) #__ct__Q23std4_BCDFPCci # std::_BCD::_BCD(const char*,int) #to_string__Q23std4_BCDCFiRi # std::_BCD::to_string(int,int&) const #__ct__Q23std4_BCDFri # std::_BCD::_BCD(long double,int) #__dt__Q23std4_BCDFv # std::_BCD::~_BCD() #__ct__Q23std15moneypunct<w,1>FUl # std::moneypunct<wchar_t, 1>::moneypunct(unsigned long) #__ct__Q23std15moneypunct<w,0>FUl # std::moneypunct<wchar_t, 0>::moneypunct(unsigned long) #__ct__Q23std15moneypunct<c,1>FUl # std::moneypunct<char, 1>::moneypunct(unsigned long) #__ct__Q23std15moneypunct<c,0>FUl # std::moneypunct<char, 0>::moneypunct(unsigned long) #do_am_pm__Q23std12timepunct<w>CFi # std::timepunct<wchar_t>::do_am_pm(int) const #do_month_name__Q23std12timepunct<w>CFUl # std::timepunct<wchar_t>::do_month_name(unsigned long) const #do_weekday_name__Q23std12timepunct<w>CFUl # std::timepunct<wchar_t>::do_weekday_name(unsigned long) const #__ct__Q23std12timepunct<w>FUl # std::timepunct<wchar_t>::timepunct(unsigned long) #do_am_pm__Q23std12timepunct<c>CFi # std::timepunct<char>::do_am_pm(int) const #do_month_name__Q23std12timepunct<c>CFUl # std::timepunct<char>::do_month_name(unsigned long) const #do_weekday_name__Q23std12timepunct<c>CFUl # std::timepunct<char>::do_weekday_name(unsigned long) const #__ct__Q23std12timepunct<c>FUl # std::timepunct<char>::timepunct(unsigned long) #__ct__Q23std11numpunct<w>FUl # std::numpunct<wchar_t>::numpunct(unsigned long) #__ct__Q23std11numpunct<c>FUl # std::numpunct<char>::numpunct(unsigned long) #do_in__Q23std14codecvt<w,c,i>CFRiPCcPCcRPCcPwPwRPw # std::codecvt<wchar_t, char, int>::do_in(int&,const char*,const char*,const char*&,wchar_t*,wchar_t*,wchar_t*&) const #do_out__Q23std14codecvt<w,c,i>CFRiPCwPCwRPCwPcPcRPc # std::codecvt<wchar_t, char, int>::do_out(int&,const wchar_t*,const wchar_t*,const wchar_t*&,char*,char*,char*&) const #__ct__Q23std14codecvt<w,c,i>FUl # std::codecvt<wchar_t, char, int>::codecvt(unsigned long) #do_nothing__Q23std14codecvt<c,c,i>CFPCcPCcRPCcPcPcRPc # std::codecvt<char, char, int>::do_nothing(const char*,const char*,const char*&,char*,char*,char*&) const #__ct__Q23std14codecvt<c,c,i>FUl # std::codecvt<char, char, int>::codecvt(unsigned long) #__ct__Q23std15ctype_byname<c>FPCcUl # std::ctype_byname<char>::ctype_byname(const char*,unsigned long) #do_tolower__Q23std8ctype<c>CFPcPCc # std::ctype<char>::do_tolower(char*,const char*) const #do_toupper__Q23std8ctype<c>CFPcPCc # std::ctype<char>::do_toupper(char*,const char*) const #scan_not__Q23std8ctype<c>CFQ33std10ctype_base4maskPCcPCc # std::ctype<char>::scan_not(std::ctype_base::mask,const char*,const char*) const #scan_is__Q23std8ctype<c>CFQ33std10ctype_base4maskPCcPCc # std::ctype<char>::scan_is(std::ctype_base::mask,const char*,const char*) const #is__Q23std8ctype<c>CFPCcPCcPQ33std10ctype_base4mask # std::ctype<char>::is(const char*,const char*,std::ctype_base::mask*) const #__dt__Q23std8ctype<c>Fv # std::ctype<char>::~ctype() #__ct__Q23std8ctype<c>FPCQ33std10ctype_base4maskbUl # std::ctype<char>::ctype(const std::ctype_base::mask*,bool,unsigned long) #__dt__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>Fv # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::~basic_string() #__dt__Q23std12allocator<w>Fv # std::allocator<wchar_t>::~allocator() #widen__Q23std8ctype<w>CFRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>> # std::ctype<wchar_t>::widen(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&) const #classify__Q23std8ctype<w>CFw # std::ctype<wchar_t>::classify(wchar_t) const #do_narrow__Q23std8ctype<w>CFPCwPCwcPc # std::ctype<wchar_t>::do_narrow(const wchar_t*,const wchar_t*,char,char*) const #do_widen__Q23std8ctype<w>CFPCcPCcPw # std::ctype<wchar_t>::do_widen(const char*,const char*,wchar_t*) const #do_tolower__Q23std8ctype<w>CFPwPCw # std::ctype<wchar_t>::do_tolower(wchar_t*,const wchar_t*) const #do_toupper__Q23std8ctype<w>CFPwPCw # std::ctype<wchar_t>::do_toupper(wchar_t*,const wchar_t*) const #do_scan_not__Q23std8ctype<w>CFQ33std10ctype_base4maskPCwPCw # std::ctype<wchar_t>::do_scan_not(std::ctype_base::mask,const wchar_t*,const wchar_t*) const #do_scan_is__Q23std8ctype<w>CFQ33std10ctype_base4maskPCwPCw # std::ctype<wchar_t>::do_scan_is(std::ctype_base::mask,const wchar_t*,const wchar_t*) const #do_is__Q23std8ctype<w>CFPCwPCwPQ33std10ctype_base4mask # std::ctype<wchar_t>::do_is(const wchar_t*,const wchar_t*,std::ctype_base::mask*) const #__as__Q33std6locale3impFRCQ33std6locale3imp # std::locale::imp::operator =(const std::locale::imp&) #__dt__Q33std6locale3impFv # std::locale::imp::~imp() #__ct__Q33std6locale3impFRCQ33std6locale3imp # std::locale::imp::imp(const std::locale::imp&) #__dt__Q23std32vector<Pv,Q23std13allocator<Pv>>Fv # std::vector<void*, std::allocator<void*>>::~vector() #__dt__Q23std68vector<PQ33std6locale5facet,Q23std31allocator<PQ33std6locale5facet>>Fv # std::vector<std::locale::facet*, std::allocator<std::locale::facet*>>::~vector() #__dt__Q23std31allocator<PQ33std6locale5facet>Fv # std::allocator<std::locale::facet*>::~allocator() #__dt__Q23std13allocator<Pv>Fv # std::allocator<void*>::~allocator() #__dt__Q23std41_EmptyMemberOpt<Q23std13allocator<Pv>,Ul>Fv # std::_EmptyMemberOpt<std::allocator<void*>, unsigned long>::~_EmptyMemberOpt() #__ct__Q33std6locale3impFUl # std::locale::imp::imp(unsigned long) #__dt__Q33std6locale5facetFv # std::locale::facet::~facet() #make_classic__Q23std6localeFv # std::locale::make_classic() #__ct__Q23std6localeFRC62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>> # std::locale::locale(const _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>&) #classic__Q23std6localeFv # std::locale::classic() #global__Q23std6localeFRCQ23std6locale # std::locale::global(const std::locale&) #name__Q23std6localeCFv # std::locale::name() const #__as__Q23std6localeFRCQ23std6locale # std::locale::operator =(const std::locale&) #__ct__Q23std6localeFRCQ23std6localeRCQ23std6localei # std::locale::locale(const std::locale&,const std::locale&,int) #__dt__Q23std6localeFv # std::locale::~locale() #__ct__Q23std6localeFRCQ23std6localePCci # std::locale::locale(const std::locale&,const char*,int) #__dt__Q23std10_MSLstringFv # std::_MSLstring::~_MSLstring() #__dt__Q23std12allocator<c>Fv # std::allocator<char>::~allocator() #__dt__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>Fv # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string() #__ct__Q23std6localeFPCc # std::locale::locale(const char*) #__dt__Q23std13runtime_errorFv # std::runtime_error::~runtime_error() #__ct__Q23std6localeFRCQ23std6locale # std::locale::locale(const std::locale&) #__dt__62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>>Fv # _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>::~_RefCountedPtr() #__ct__Q23std6localeFv # std::locale::locale() #__ct__28_RefCountedPtr<c,9_Array<c>>FPc # _RefCountedPtr<char, _Array<char>>::_RefCountedPtr(char*) #__as__28_RefCountedPtr<c,9_Array<c>>FRC28_RefCountedPtr<c,9_Array<c>> # _RefCountedPtr<char, _Array<char>>::operator =(const _RefCountedPtr<char, _Array<char>>&) #__ct__Q23std10_MSLstringFRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>> # std::_MSLstring::_MSLstring(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&) #__vt__Q33std8ios_base7failure # std::ios_base::failure::__vt #__vt__Q23std8ios_base # std::ios_base::__vt #what__Q33std8ios_base7failureCFv # std::ios_base::failure::what() const #throwfailure__Q23std8ios_baseFv # std::ios_base::throwfailure() #__dt__Q33std8ios_base7failureFv # std::ios_base::failure::~failure() #__dt__Q23std8ios_baseFv # std::ios_base::~ios_base() #__ct__Q23std8ios_baseFv # std::ios_base::ios_base() #register_callback__Q23std8ios_baseFPFQ33std8ios_base5eventRQ23std8ios_basei_vi # std::ios_base::register_callback(void (*)(std::ios_base::event, std::ios_base&, int),int) #__ct__Q23std50pair<PFQ33std8ios_base5eventRQ23std8ios_basei_v,i>Fv # std::pair<void (*)(std::ios_base::event, std::ios_base&, int), int>::pair() #pword__Q23std8ios_baseFi # std::ios_base::pword(int) #iword__Q23std8ios_baseFi # std::ios_base::iword(int) #getloc__Q23std8ios_baseCFv # std::ios_base::getloc() const #imbue__Q23std8ios_baseFRCQ23std6locale # std::ios_base::imbue(const std::locale&) #__vt__Q23std12strstreambuf # std::strstreambuf::__vt #init__Q23std12strstreambufFPciPc # std::strstreambuf::init(char*,int,char*) #setbuf__Q23std12strstreambufFPci # std::strstreambuf::setbuf(char*,int) #seekpos__Q23std12strstreambufFQ23std7fpos<i>s # std::strstreambuf::seekpos(std::fpos<int>,short) #seekoff__Q23std12strstreambufFlQ33std8ios_base7seekdirs # std::strstreambuf::seekoff(long,std::ios_base::seekdir,short) #underflow__Q23std12strstreambufFv # std::strstreambuf::underflow() #pbackfail__Q23std12strstreambufFi # std::strstreambuf::pbackfail(int) #overflow__Q23std12strstreambufFi # std::strstreambuf::overflow(int) #freeze__Q23std12strstreambufFb # std::strstreambuf::freeze(bool) #__dt__Q23std12strstreambufFv # std::strstreambuf::~strstreambuf() #__console_exit #__stdio_exit #__aborting #__exit #exit #__atexit #atexit #abort #__malloc_pool #free #realloc #calloc #malloc #__files #__num_to_file #__file_to_num #__flush_line_buffered_output_files #__flush_all #__close_all #__init_file #__find_unopened_file #__llmod #__lmod #__mod #__lldiv #__ldiv #__div #__llmul #__lmul #__mul #__lladd #__ladd #__add #lldiv #ldiv #div #llabs #labs #abs #__assertion_failed #bsearch #setbuf #setvbuf #__flush_buffer #__load_buffer #__prep_buffer #__convert_to_newlines #__convert_from_newlines #puts #fputs #putchar #putc #fputc #__put_char #__ungotten #ungetc #gets #fgets #getchar #getc #fgetc #__get_char #__ctype_map #__lower_map #__upper_map #toupper #tolower #isxdigit #isupper #isspace #ispunct #isprint #islower #isgraph #isdigit #iscntrl #isalpha #isalnum #fwrite #fread #errno #__temp_file_mode #__set_idle_proc #__get_file_modes #__handle_reopen #__handle_open #freopen #fopen #fflush #fclose #tmpfile #tmpnam #rename #remove #rewind #fsetpos #fseek #_fseek #fgetpos #ftell #_ftell #__float_nan #__float_huge #__double_min #__double_max #__double_epsilon #__double_tiny #__double_huge #__double_nan #__extended_min #__extended_max #__extended_epsilon #__extended_tiny #__extended_huge #__extended_nan #__lconv #localeconv #setlocale #wcstombs #mbstowcs #wctomb #mbtowc #mblen #memcmp #__memrchr #memchr #memset #memmove #memcpy #__fill_mem #__copy_longs_rev_unaligned #__copy_longs_unaligned #__copy_longs_rev_aligned #__copy_longs_aligned #__move_mem #__copy_mem #__stdio_atexit #perror #ferror #feof #clearerr #__pool_free_all #__pool_free #__pool_realloc #__pool_alloc_clear #__pool_alloc #__pool_preassign #__pool_preallocate #__init_pool_obj #sprintf #snprintf #vsprintf #vsnprintf #printf #vprintf #fprintf #vfprintf #qsort #srand #rand #sscanf #__vsscanf #scanf #fscanf #__vfscanf #raise #signal #__strerror #strerror #strstr #strtok #strcspn #strspn #strpbrk #strrchr #strxfrm #strcoll #strchr #strncmp #strcmp #strncat #strcat #strncpy #strcpy #strlen #__close_string #__write_string #__read_string #__open_string_file #atof #strtod #__strtold #strtoumax #strtoimax #atol #atoi #strtoll #strtol #strtoull #strtoul #__strtoull #__strtoul #system #getenv #__month_to_days #strftime #localtime #gmtime #ctime #asctime #time #mktime #difftime #clock #__leap_year #ccommand #clrscr #__close_console #__write_console #__read_console #__end_critical_region #__begin_critical_region #__kill_critical_regions #__init_critical_regions #fcntl #creat #open #__rename_file #__delete_file #__temp_file_name #__close_file #__position_file #__write_file #__read_file #__open_temp_file #__open_file #__path2fss #__sys_free #__sys_alloc #mkdir #fstat #stat #__to_gm_time #__get_time #__get_clock #write #unlink #ttyname #sleep #rmdir #read #lseek #isatty #getlogin #getcwd #exec #cuserid #close #chdir #_ftype #_fcreator #tell #fdopen #fileno #__gettype #__getcreator #__ctopstring #__system7present #__myraise #utimes #utime #uname #fwide #fgetws #fputws #ungetwc #fgetwc #getwchar #getwc #fputwc #putwchar #putwc #watof #wcstod #__wcstold #wcstoumax #wcstoimax #watol #watoi #wcstoll #wcstol #wcstoull #wcstoul #__wcstoull #__wcstoul #wctrans #towctrans #__wctype_map #__wlower_map #__wupper_map #iswctype #wctype #wctob #towupper #towlower #iswxdigit #iswupper #iswspace #iswpunct #iswprint #iswlower #iswgraph #iswdigit #iswcntrl #iswalpha #iswalnum #wmemcmp #wmemchr #wmemset #wmemmove #wmemcpy #swprintf #vwprintf #vswprintf #wprintf #fwprintf #vfwprintf #swscanf #__vswscanf #vwscanf #wscanf #fwscanf #__vfwscanf #wcsstr #wcstok #wcscspn #wcsspn #wcspbrk #wcsrchr #wcsxfrm #wcscoll #wcschr #wcsncmp #wcscmp #wcsncat #wcscat #wcsncpy #wcscpy #wcslen #wcsftime #wctime #wasctime #ValidateMallocHeap #GetNextMallocHeapRegistration #GetFirstMallocHeapRegistration #UnregisterMallocHeap #RegisterMallocHeap #__fminl #__fmaxl #__fdiml #__nextafterl #__remquol #__copysignl #__remainderl #__fmodl #__modfl #__truncl #llroundl #lroundl #__roundl #llrintl #lrintl #__rintl #__nearbyintl #__floorl #__ceill #__lgammal #__gammal #__erfcl #__erfl #__hypotl #__sqrtl #__powl #__fabsl #scalblnl #scalbnl #__logbl #__log2l #__log1pl #__expm1l #__exp2l #__log10l #__logl #__ldexpl #__frexpl #__expl #__atanhl #__asinhl #__acoshl #__tanhl #__sinhl #__coshl #__tanl #__sinl #__cosl #__atan2l #__atanl #__asinl #__acosl #fminf #fmaxf #fdimf #remquof #copysignf #remainderf #fmodf #truncf #llroundf #lroundf #roundf #llrintf #lrintf #rintf #nearbyintf #floorf #ceilf #lgammaf #gammaf #erfcf #erff #hypotf #sqrtf #powf #fabsf #scalblnf #scalbnf #logbf #log2f #log1pf #expm1f #exp2f #log10f #logf #ldexpf #frexpf #expf #atanhf #asinhf #acoshf #tanhf #sinhf #coshf #tanf #sinf #cosf #atan2f #atanf #asinf #acosf #nextafter #llround #lround #llrint #lrint #scalbln #scalbn #__dc_arr #__del_arr #__new_arr #__init_arr #__copy #__som_check_ev #__som_check_new #__vt__Q23std13bad_exception # std::bad_exception::__vt #what__Q23std13bad_exceptionCFv # std::bad_exception::what() const #__end__catch #__throw #__ct__Q23std9exceptionFv # std::exception::exception() #__unexpected #__dt__Q23std13bad_exceptionFv # std::bad_exception::~bad_exception() #__unregister_fragment #__register_fragment #__global_destructor_chain #__destroy_global_chain #__register_global_object #__destroy_new_array2 #__destroy_new_array #__destroy_arr #__construct_array #__dt__26__partial_array_destructorFv # __partial_array_destructor::~__partial_array_destructor() #__construct_new_array #__throw_catch_compare #unexpected__3stdFv # std::unexpected() #set_unexpected__3stdFPFv_v # std::set_unexpected(void (*)(void)) #terminate__3stdFv # std::terminate() #set_terminate__3stdFPFv_v # std::set_terminate(void (*)(void)) #__vt__Q23std10bad_typeid # std::bad_typeid::__vt #what__Q23std10bad_typeidCFv # std::bad_typeid::what() const #__dynamic_cast #__get_typeid #__dt__Q23std10bad_typeidFv # std::bad_typeid::~bad_typeid() #nothrow__3std # std::nothrow #__dla__FPv # operator delete[](void*) #__nwa__FUlRCQ23std9nothrow_t # operator new[](unsigned long,const std::nothrow_t&) #__nwa__FUl # operator new[](unsigned long) #__dl__FPv # operator delete(void*) #__nw__FUlRCQ23std9nothrow_t # operator new(unsigned long,const std::nothrow_t&) #__nw__FUl # operator new(unsigned long) #_prealloc_newpool__3stdFUl # std::_prealloc_newpool(unsigned long) #_set_newnonptrmax__3stdFUl # std::_set_newnonptrmax(unsigned long) #_set_newpoolsize__3stdFUl # std::_set_newpoolsize(unsigned long) #__throws_bad_alloc__3std # std::__throws_bad_alloc #__new_handler__3std # std::__new_handler #__del_hdl #__new_hdl #set_new_handler__3stdFPFv_v # std::set_new_handler(void (*)(void)) #__throw_bad_alloc__3stdFv # std::__throw_bad_alloc() #qd #__terminate #__initialize #__start #__ptmf_null \ No newline at end of file
diff --git a/libical/MacOS/libical_prefix.h b/libical/MacOS/libical_prefix.h
deleted file mode 100644
index 0810563119..0000000000
--- a/libical/MacOS/libical_prefix.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/* libical_prefix.h */
-
-#include <stdlib.h>
-#define _TIME_T
-#include "errno.h" \ No newline at end of file
diff --git a/libical/MacOS/restrictions.make b/libical/MacOS/restrictions.make
deleted file mode 100644
index dd146f5ed3..0000000000
--- a/libical/MacOS/restrictions.make
+++ /dev/null
@@ -1 +0,0 @@
-#pseudo target all Ä {libical_c_src}parameterrestrictions.inc {libical_c_src}restrictionrecords.inc # Generate source file {libical_c_src}parameterrestrictions.inc Ä ¶ {libical_scripts}mkparameterrestrictions.pl ¶ {libical_data}params-in-prop.txt ¶ {libical_project}restrictions.make perl {libical_scripts}mkparameterrestrictions.pl {libical_data}params-in-prop.txt ¶ > {libical_c_src}parameterrestrictions.inc # Set file creator to CodeWarrior setfile {libical_c_src}parameterrestrictions.inc -c CWIE # Generate source file {libical_c_src}restrictionrecords.inc Ä ¶ {libical_scripts}mkrestrictionrecords.pl ¶ {libical_data}restrictions.csv ¶ {libical_project}restrictions.make perl {libical_scripts}mkrestrictionrecords.pl {libical_data}restrictions.csv ¶ > {libical_c_src}restrictionrecords.inc # Set file creator to CodeWarrior setfile {libical_c_src}restrictionrecords.inc -c CWIE \ No newline at end of file
diff --git a/libical/MacOS/restrictions.script b/libical/MacOS/restrictions.script
deleted file mode 100644
index ab719b87d5..0000000000
--- a/libical/MacOS/restrictions.script
+++ /dev/null
@@ -1 +0,0 @@
-directory {libical_project} # Generate source files make all -f restrictions.make > make.out make.out \ No newline at end of file
diff --git a/libical/MacOS/strdup.c b/libical/MacOS/strdup.c
deleted file mode 100644
index ae60fee3df..0000000000
--- a/libical/MacOS/strdup.c
+++ /dev/null
@@ -1,17 +0,0 @@
-
-#include "strdup.h"
-#include <string.h>
-#include <stdlib.h>
-
-
-char *strdup(const char *s )
-{
- char *p;
-
- if ( (p = (char *) malloc( strlen( s ) + 1 )) == NULL )
- return( NULL );
-
- strcpy( p, s );
-
- return( p );
-}
diff --git a/libical/MacOS/strdup.h b/libical/MacOS/strdup.h
deleted file mode 100644
index 1bb73aa535..0000000000
--- a/libical/MacOS/strdup.h
+++ /dev/null
@@ -1,3 +0,0 @@
-/* strdup.h */
-
-char * strdup(const char *str);
diff --git a/libical/Makefile.am b/libical/Makefile.am
deleted file mode 100644
index 66b37da052..0000000000
--- a/libical/Makefile.am
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-EXTRA_DIST = \
- ChangeLog \
- README \
- TEST \
- TODO
-
-SUBDIRS = design-data doc scripts test-data src
-
-
diff --git a/libical/NEWS b/libical/NEWS
deleted file mode 100644
index 71f18ff45b..0000000000
--- a/libical/NEWS
+++ /dev/null
@@ -1,269 +0,0 @@
-Version 0.17 15 May 00 (cvs tag libical-0-17 )
----------------------------------------------
-
-Fixed two bugs that added extraneous '/' to test values
-
-Fixed type in internal string for the COUNTER method
-
-Eliminated a mempry leak in icalparser.c
-
-
-Version 0.16a 29 April 00
-----------------------------------------------
-
-Fixed bug in icalvalue_new_from_string that caused METHOD value to
-choke on non standard input.
-
-Fixed a memory leak in icalparser_add_line -- failed to free 'line'
-
-
-Version 0.16 5 April 00 ( cvs tag libical-0-16)
-----------------------------------------------
-
-Now using automake.
-
-Substantial changes to the parser. New interfaces let you parser
-multiple components from a single stream by feading the parser object
-one line at a time.
-
-Added a STRING value type. this type is like TEXT, but does not
-backslash magic characters. It is used in PRODID and REQUEST-STATUS,
-where the '/' and ';' are literal.
-
-Added several convience functions for REQUEST-STATUS to icalenums.c
-
-Addedd a routine to icalcomponent to convert X-LIC errors to
-REQUEST-STATUS return values.
-
-Version 0.15a 5 Mar 00 (cvs tag libical-0-15a)
----------------------
-
-Experimented with CVS
-
-Fixed icalvalue_set_text to convert escaped characters into the proper
-values.
-
-Other minor code tweaks.
-
-
-Version 0.15 7 Feb 00
----------------------
-
-Split the storage classess ( icalstore, icalcluster, icalcalendar )
-into a seperate library, libicalss
-
-Implemented restriction checking in file icalrestrictions.c. The
-checking is not complete, but can handle the bulk of the restrictions
-described in RFC 2446.
-
-Created a new value type, METHOD. Changed METHOD property to use the
-new value. The METHOD value uses an enumeration.
-
-
-Version 0.14b
--------------
-
-Implemented parsing of RECUR values, although it does not handle BYDAY
-specs with numbers.
-
-Fixed error in icalparser_next_line that mangled lines longer than the
-temp buffer (1024 chars.) The temp buffer is now 80 chars, and it can
-handle (apparently) arbitrary length lines
-
-Fixed severe brokenness in a value, but I forgot which one.
-
-Cleaned cruft out of the distribution, so the tarfile is smaller.
-
-
-Version 0.14a 14 Jan 00
------------------------
-
-Fixed bug in ROLE parameter -- missing '-' in the text of allowed values
-
-Fixed bug in X-parameters
-
-Version 0.14 11 Jan 00
-----------------------
-
-Fixed wrong value type for TRIGGER property
-
-Added Calendar object. Calendar is an aggregate of two stores and two
-clusters, and can store all of the inforamation associated with a
-calendar.
-
-icalcomponent_add_property and icalcomponent_add_component will
-complain if you try to add a component or property that is already
-part of an other component. The *_free routines wil complain if you try
-to free a linked component or property.
-
-More improvements to error handling.
-
-Parser is much more robust.
-
-Minor memory enhancements.
-
-Regression test runs without memory leaks.
-
-Version 0.13d 21Dec99
----------------------
-
-Seperated perl interface and library
-
-Added autoconf support
-
-Scripts that generate derived properties, values and parameters now
-change source and header files inline.
-
-Changed icalstore to cluster all components with DTSTART in a month
-into a single file. This should reduce number of file accesses by a
-factor of 60.
-
-Ran code through Purify and fixed memory leaks.
-
-
-Version 0.13 16Nov99
----------------------
-
-Yet more bug fixes! Yeah!
-
-Added better error handling. The Parser inserts X-LIC-*ERROR
-properties to warn of parsing errors.
-
-The imip source/sink programs in /src/imip is demonstrably functional.
-
-Version 0.12b 17Oct99
----------------------
-
-More bug fixes, particularily in parse from string routines
-
-ICal::Store is mostly functional
-
-This is version is a checkpoint, not a release.
-
-Version 0.12a 10Oct99
----------------------
-
-Expanded perl interface:
- Added 1/2 of Store module
- Fixed bugs
- Implemeted get_{first,next}_property
-
-Extended C interface
- Made get_{first,next}_property work properly
- Fixed bugs
-
-
-This is version is a checkpoint, not a release.
-
-Version 0.12 27Aug99
---------------------
-
-Added a rudimentatry perl interface
-
-This is version is a checkpoint, not a release.
-
-
-Version 0.11 11Aug99
---------------------
-
-Eliminated most use of flex/bison -- all parsing, except for the
-values, is done in C.
-
-Cleaned up memory leaks. Purify claims that I got them all.
-
-Moved all derived component/prop/param/value code ( in .inc / .h
-files) into main files ( icalcomponent.{c,h}, icalproperty.{c,h}, etc/
-)
-
-Implemented *_clone routines.
-
-Fixed a lot of bugs.
-
-Implemented more value types. Still unimplemeneted are BINARY and RECUR
-
-Included MacOS/Code Warior files from Graham Davison
-
-
-Version 0.10 8Jul99
--------------------
-
-Eliminated shift/reduce and reduce/reduce conflicts in the parser.
-This version is almost feature complete -- it has the basic structure
-for all of the library's functionality, and it will only require
-implementing procedure shells and fixing bugs. I think that all of the
-hard work is done...
-
-Version 0.09a,b 3,7 Jul99
--------------------------
-
-Various improvements to the parser, added some functionality. The parser code
-is mostly complete, and should be fully functional, except for a horde of
-bugs. Also added support for X-Properties.
-
-Version 0.09 25Jun99
---------------------
-
-Added a parser in files src/comp/icalitip.{y,l} The lexer is mostly
-functional, but the parser is not.
-
-
-Version 0.08 2Jun99
---------------------
-
-All files now have MPL licensing
-
-Implement enough of the code to perform some rudimentary testing
-
-
-Version 0.07 14May99
---------------------
-
-Remove all interfaces that construct object from a string
-
-Moved most code back into comp directory
-
-Implemented C files for most headers -- usecases.c now links.
-
-Many improvements to generation scripts.
-
-
-
-Version 0.06 25Apr99
---------------------
-
-Expanded distribution to include:
- Directory structure that can accomodate future expansion
- Several levels of Makefiles
- This CHANGES file
-
-Added headers for irip and parse modules
-
-Added several files with design information
-
-Added scripts that I had used to generate much of the ical header code.
-
-Split C headers from CC headers
-
-Added data for iTIP and iCAL component restrictions in restrictions.csv
-
-Version 0.05 11Apr99
-----------------------
-
-Changes to ical headers
-
- Added derived Property classes.
-
- Improved the interface to the derived property and parameter classes
-
- Added derived component classes.
-
- Created usecases.c and ccusecases.cc to demonstrate use
-
- C++ interface compile
-
-
-Version 0.04 5Apr99
--------------------
-
-Version 0.02 30Mar99
---------------------
diff --git a/libical/README b/libical/README
deleted file mode 100644
index e0f7641e1e..0000000000
--- a/libical/README
+++ /dev/null
@@ -1,96 +0,0 @@
-
-LIBICAL -- An implementation of basic iCAL protocols
-
-The code and datafiles in this distribution are licensed under the
-Mozilla Public License. See http://www.mozilla.org/NPL/MPL-1.0.html
-for a copy of the license. Alternately, you may use libical under the
-terms of the GNU Library General Public License. See
-http://www.fsf.org/copyleft/lesser.html for a copy of the LGPL.
-
-This dual license ensures that the library can be incorporated into
-both proprietary code and GPL'd programs, and will benefit from
-improvements made by programmers in both realms. I will only accept
-changes into my version of the library if they are similarly
-dual-licensed.
-
-The code in this distribution implements the iCal protocols as
-described in RFC2445 and RFC2446. The code is in very early stages of
-development.
-
-This code is under active development. If you would like to contribute
-to the project, you can contact me, Eric Busboom, at
-eric@softwarestudio.org. The project has a webpage at
-
- http://softwarestudio.org/libical/index.html
-
-and a mailing list that you can join by sending the following mail:
-
- ------------
- To: minimalist@softwarestudio.org
- Subject: subscribe libical
- ------------
-
-
-Building the library
---------------------
-
-This distribution is developed on Red Hat Linux 6.0 and usually
-compiles on SunOS 5.6 and FreeBSD 2.27. I have reports of success of
-previous version on MacOS ( with CodeWarrior ) but I don't know about
-any other systems.
-
-The library is configured with automake. From the root directory, run
-
- ./configure
-
-To build all of the Makefiles for your system. If you will be installing the library, you may want to use the --prefix flag to set the directory where the library and header files will be installed.
-
- ./configure --prefix=/proj/local/
-
-If configure runs fine, run "make" to build the library and
-"make install" to install it.
-
-The current version of libical focuses on creating and
-manipulating iCal objects. With it, you can parse text representations
-of iCal components, add and remove sub-components, properties,
-parameters and values, and print the components back out as strings.
-
-
-Notes for Libical Developers
--------------------
-
-If you don't want to use gcc as the compiler, and you got the sources
-from CVS, you should set the CC variable to the path to the compiler
-and run "automake --include-deps" to keep automake from using
-gcc-specific automatic dependancy tracking.
-
- > CC=/pkg/SUNWspro/bin/cc; export CC
- > automake --include-deps
- > ./configure --prefix=/proj/local/
- > make
-
-You will not need to re-run automake unless you got the sources from CVS.
-
-
-Perl Library
-------------
-
-There is a perl language binding of this library, LIBICAL.
-It is available from http://www.softwarestudio.org/libical
-
-Parser
-------
-
-The parser is a test program that will convert a text representation
-of an iCal object to the internal representation and print it back out
-as text. It is primarily a test tool, but it is also a good
-demonstration of how the library works.
-
-To use it, cat one of the test components into the parser
-executable. For example, from the root of the distribution:
-
- src/test/icalparser < test-data/1.1
-
-
-Eric Busboom
-eric@softwarestudio.org
diff --git a/libical/TEST b/libical/TEST
deleted file mode 100644
index 90c3473b31..0000000000
--- a/libical/TEST
+++ /dev/null
@@ -1,4 +0,0 @@
-
-Parser Tests
-------------
-Use iCAL keywords as first words of unquoted strings \ No newline at end of file
diff --git a/libical/THANKS b/libical/THANKS
deleted file mode 100644
index 6a51d866fa..0000000000
--- a/libical/THANKS
+++ /dev/null
@@ -1,10 +0,0 @@
-Thanks to:
-
-
-Graham Davison <g.m.davison@computer.org> for MacOS support and
-miscelaneous code bits
-
-Seth Alves <alves@hungry.com> for the first cut at the Makefile.am
-files and various utility functions.
-
-Russ Steinthal <rms39@columbia.edu> for several utility functions and comments. \ No newline at end of file
diff --git a/libical/TODO b/libical/TODO
deleted file mode 100644
index b27e505b35..0000000000
--- a/libical/TODO
+++ /dev/null
@@ -1,32 +0,0 @@
-
-TODOs for libical-0.16
----------------------
-
-libical treats properties with multiple values incorrecty -- it always
-seperates multiple values into multiple properties. This is not
-acceptable for CATEGORIES and RESOURCES.
-
-Some TEXT valued properties, like METHOD, have a limited set of valid
-values. The code should check that the values of these properites are
-valid. ( Although METHOD now uses enums, and is not really TEXT valued )
-
-Finish implementing values
- ATTACH/BINARY
- content_type
- language
-
-Check for buffer overflow on external input.
-
-Error Handling
-
- Dates and times: the parser will accept many illegal date time
- values
-
-RECUR values ignore integers in BYDAY clauses, ie 'FREQ=MONTHLY;BYDAY=-1SU'
-
-Restrictions code does not catch lack of DTEND or DURATION
-
-For some value types, if there illegal characters in the value ( like
-4.56 in an integer value), the parser will output the characters to
-stdout.
-
diff --git a/libical/acconfig.h b/libical/acconfig.h
deleted file mode 100644
index e9383f73a4..0000000000
--- a/libical/acconfig.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Define to make icalerror_* calls abort instead of internally
- signalling an error */
-#undef ICAL_ERRORS_ARE_FATAL
-
-/* Define to make icalcluster_commit() save to a temp file and mv to
- the original file instead of writing to the orig file directly */
-#undef ICAL_SAFESAVES
diff --git a/libical/autogen.sh b/libical/autogen.sh
deleted file mode 100755
index e15e4e33a8..0000000000
--- a/libical/autogen.sh
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/sh
-# Run this to generate all the initial makefiles, etc.
-
-srcdir=`dirname $0`
-test -z "$srcdir" && srcdir=.
-
-ORIGDIR=`pwd`
-cd $srcdir
-PROJECT=libical
-TEST_TYPE=-d
-FILE=src
-
-DIE=0
-
-(autoconf --version) < /dev/null > /dev/null 2>&1 || {
- echo
- echo "You must have autoconf installed to compile $PROJECT."
- echo "Download the appropriate package for your distribution,"
- echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
- DIE=1
-}
-
-(automake --version) < /dev/null > /dev/null 2>&1 || {
- echo
- echo "You must have automake installed to compile $PROJECT."
- echo "Get ftp://ftp.cygnus.com/pub/home/tromey/automake-1.2d.tar.gz"
- echo "(or a newer version if it is available)"
- DIE=1
-}
-
-if test "$DIE" -eq 1; then
- exit 1
-fi
-
-test $TEST_TYPE $FILE || {
- echo "You must run this script in the top-level $PROJECT directory"
- exit 1
-}
-
-if test -z "$*"; then
- echo "I am going to run ./configure with no arguments - if you wish "
- echo "to pass any to it, please specify them on the $0 command line."
-fi
-
-case $CC in
-*xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;;
-esac
-
-if test -z "$ACLOCAL_FLAGS"; then
-
- acdir=`aclocal --print-ac-dir`
- m4list="glib.m4"
-
- for file in $m4list
- do
- if [ ! -f "$acdir/$file" ]; then
- echo "WARNING: aclocal's directory is $acdir, but..."
- echo " no file $acdir/$file"
- echo " You may see fatal macro warnings below."
- echo " If these files are installed in /some/dir, set the ACLOCAL_FLAGS "
- echo " environment variable to \"-I /some/dir\", or install"
- echo " $acdir/$file."
- echo ""
- fi
- done
-fi
-
-aclocal $ACLOCAL_FLAGS
-
-# optionally feature autoheader
-(autoheader --version) < /dev/null > /dev/null 2>&1 && autoheader
-
-automake -a $am_opt
-autoconf
-cd $ORIGDIR
-
-$srcdir/configure "$@"
-
-echo
-echo "Now type 'make' to compile $PROJECT."
diff --git a/libical/configure.in b/libical/configure.in
deleted file mode 100644
index c722c0fee1..0000000000
--- a/libical/configure.in
+++ /dev/null
@@ -1,52 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-AC_INIT(src/libical/ical.h)
-AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(libical,0.17)
-
-dnl Checks for programs.
-AC_PROG_YACC
-AC_PROG_CC
-AM_PROG_LEX
-AC_PROG_LN_S
-AC_PROG_RANLIB
-AC_PROG_INSTALL
-
-dnl Initialize libtool
-AM_PROG_LIBTOOL
-
-
-AC_SUBST(AR)
-AC_CHECK_PROGS(AR, ar aal, ar)
-
-AC_DEFINE(ICAL_ERRORS_ARE_FATAL,1)
-AC_DEFINE(ICAL_SAFESAVES,1)
-
-dnl Checks for libraries.
-dnl Replace `main' with a function in -lical:
-dnl AC_CHECK_LIB(ical, main)
-
-dnl Checks for header files.
-AC_HEADER_STDC
-AC_CHECK_HEADERS(time.h sys/types.h assert.h)
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_TYPE_SIZE_T
-AC_STRUCT_TM
-
-dnl Checks for library functions.
-AC_CHECK_FUNCS(strdup)
-
-AC_OUTPUT([
-Makefile
-config.h
-design-data/Makefile
-doc/Makefile
-scripts/Makefile
-src/Makefile
-src/libical/Makefile
-src/libical/icalversion.h
-src/libicalss/Makefile
-src/test/Makefile
-test-data/Makefile
-] )
diff --git a/libical/configure.scan b/libical/configure.scan
deleted file mode 100644
index c07a9f6bf8..0000000000
--- a/libical/configure.scan
+++ /dev/null
@@ -1,30 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-AC_INIT(src/comp-cc/usecases.cc)
-
-dnl Checks for programs.
-AC_PROG_YACC
-AC_PROG_CC
-AC_PROG_LEX
-AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_PROG_RANLIB
-
-dnl Checks for libraries.
-dnl Replace `main' with a function in -lical:
-AC_CHECK_LIB(ical, main)
-
-dnl Checks for header files.
-AC_HEADER_DIRENT
-AC_HEADER_STDC
-AC_CHECK_HEADERS(fcntl.h limits.h malloc.h unistd.h)
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_TYPE_OFF_T
-AC_TYPE_SIZE_T
-AC_STRUCT_TM
-
-dnl Checks for library functions.
-AC_CHECK_FUNCS(mkdir strdup uname)
-
-AC_OUTPUT(src/libicalss/Makefile src/test/Makefile src/libical/Makefile src/Makefile src/pvl/Makefile src/comp-cc/Makefile Makefile)
diff --git a/libical/design-data/.cvsignore b/libical/design-data/.cvsignore
deleted file mode 100644
index 3dda72986f..0000000000
--- a/libical/design-data/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile.in
-Makefile
diff --git a/libical/design-data/Makefile.am b/libical/design-data/Makefile.am
deleted file mode 100644
index 0548974160..0000000000
--- a/libical/design-data/Makefile.am
+++ /dev/null
@@ -1,10 +0,0 @@
-EXTRA_DIST =\
- components.txt \
- param-c-types.txt \
- params-in-prop.txt \
- prop-to-value.txt \
- property-tokens.txt \
- restrictions.csv \
- status.txt \
- value-c-types.txt \
- value-mem-semantics.txt \
diff --git a/libical/design-data/components.txt b/libical/design-data/components.txt
deleted file mode 100644
index 15417eaf2f..0000000000
--- a/libical/design-data/components.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-VCALENDAR
-VEVENT
-VTODO
-VJOURNAL
-VFREEBUSY
-VTIMEZONE
-XSTANDARDTIME
-XDAYLIGHTSAVINGSTIME
-VALARM
-XAUDIOALARM
-XDISPLAYALARM
-XEMAILALARM
-XPROCEDUREALARM
-X
-VSCHEDULE
-VQUERY
-VCAR
-VCOMMAND
-XLICINVALID
-ANY
-
diff --git a/libical/design-data/param-c-types.txt b/libical/design-data/param-c-types.txt
deleted file mode 100644
index d2f28e688a..0000000000
--- a/libical/design-data/param-c-types.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-ALTREP char*
-CN char*
-CUTYPE icalparameter_cutype
-DELEGATED-FROM char*
-DELEGATED-TO char*
-DIR char*
-ENCODING icalparameter_encoding
-FBTYPE icalparameter_fbtype
-FMTTYPE char*
-LANGUAGE char*
-MEMBER char*
-PARTSTAT icalparameter_partstat
-RANGE icalparameter_range
-RELATED icalparameter_related
-RELTYPE icalparameter_reltype
-ROLE icalparameter_role
-RSVP int
-SENT-BY char*
-TZID char*
-VALUE icalparameter_value
-X char*
-X-LIC-ERRORTYPE icalparameter_xlicerrortype
-X-LIC-COMPARETYPE icalparameter_xliccomparetype
diff --git a/libical/design-data/params-in-prop.txt b/libical/design-data/params-in-prop.txt
deleted file mode 100644
index 4d4e133fc3..0000000000
--- a/libical/design-data/params-in-prop.txt
+++ /dev/null
@@ -1,55 +0,0 @@
-ACTION VALUE X
-ATTACH FMTTYPE ENCODING VALUE X
-ATTENDEE CN CUTYPE DELEGATED-FROM DELEGATED-TO DIR LANGUAGE MEMBER PARTSTAT ROLE RSVP SENT-BY X
-CALSCALE X
-CATEGORIES LANGUAGE X
-CLASS X
-COMMENT ALTREP LANGUAGE X
-COMPLETED X
-CONTACT ALTREP LANGUAGE X
-CREATED X
-DESCRIPTION ALTREP LANGUAGE X
-DTEND VALUE TZID X
-DTSTAMP X
-DTSTART VALUE TZID X
-DUE VALUE TZID X
-DURATION X
-EXDATE VALUE TZID X
-EXRULE X
-FREEBUSY FBTYPE X
-GEO X
-LAST-MODIFIED X
-LOCATION ALTREP LANGUAGE X
-METHOD X
-ORGANIZER CN DIR LANGUAGE SENT-BY X
-PERCENT-COMPLETE X
-PRIORITY X
-PRODID X
-RDATE VALUE TZID X
-RECURRENCE-ID VALUE RANGE TZID X
-RELATED-TO RELTYPE X
-REPEAT X
-REQUEST-STATUS LANGUAGE X
-RESOURCES ALTREP LANGUAGE X
-RRULE X
-SEQUENCE X
-STATUS X
-SUMMARY ALTREP LANGUAGE X
-TRANSP X
-TRIGGER VALUE RELATED X
-TZID X
-TZNAME LANGUAGE X
-TZOFFSETFROM X
-TZOFFSETTO X
-TZURL X
-UID X
-URL X
-VERSION X
-XPROP LANGUAGE X
-X-LIC-ERROR XLICEERRORTYPE X
-SCOPE X
-MAXRESULTS X
-MAXRESULTSSIZE X
-QUERY X
-QUERYNAME X
-TARGET X \ No newline at end of file
diff --git a/libical/design-data/prop-to-value.txt b/libical/design-data/prop-to-value.txt
deleted file mode 100644
index a06bdc31f1..0000000000
--- a/libical/design-data/prop-to-value.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-CALSCALE TEXT
-METHOD METHOD # Non-std. RFC2445 specifies TEXT
-PRODID TEXT
-VERSION TEXT
-CATEGORIES TEXT
-CLASS TEXT
-COMMENT TEXT
-DESCRIPTION TEXT
-LOCATION TEXT
-PERCENT-COMPLETE INTEGER
-PRIORITY INTEGER
-RESOURCES TEXT
-STATUS TEXT
-SUMMARY TEXT
-COMPLETED DATE-TIME
-FREEBUSY PERIOD
-TRANSP TEXT
-TZNAME TEXT
-TZOFFSETFROM UTC-OFFSET
-TZOFFSETTO UTC-OFFSET
-TZURL URI
-TZID TEXT
-ATTENDEE CAL-ADDRESS
-CONTACT TEXT
-ORGANIZER CAL-ADDRESS
-RELATED-TO TEXT
-URL URI
-UID TEXT
-EXRULE RECUR
-RRULE RECUR
-ACTION TEXT
-REPEAT INTEGER
-CREATED DATE-TIME
-DTSTAMP DATE-TIME
-LAST-MODIFIED DATE-TIME
-SEQUENCE INTEGER
-X-LIC-ERROR TEXT
-X-LIC-CLUSTERCOUNT INTEGER
-REQUEST-STATUS STRING
-ATTACH ATTACH # Non-std: URI or BINARY
-GEO GEO # Non-std: Two FLOATS
-DTEND DATE-TIME-DATE # Non-std: DATE-TIME or DATE
-DUE DATE-TIME-DATE # Non-std: DATE-TIME or DATE
-DTSTART DATE-TIME-DATE # Non-std: DATE-TIME or DATE
-RECURRENCE-ID DATE-TIME-DATE # Non-std: DATE-TIME or DATE
-EXDATE DATE-TIME-DATE # Non-std: DATE-TIME or DATE
-RDATE DATE-TIME-PERIOD # Non-std: DATE-TIME or DATE or PERIOD
-TRIGGER TRIGGER # Non-std: DURATION or DATE-TIME
-DURATION DURATION
-QUERY QUERY
diff --git a/libical/design-data/property-tokens.txt b/libical/design-data/property-tokens.txt
deleted file mode 100644
index f8a95861c4..0000000000
--- a/libical/design-data/property-tokens.txt
+++ /dev/null
@@ -1,65 +0,0 @@
-8BIT
-ACCEPTED
-ADD
-AUDIO
-BASE64
-BINARY
-BOOLEAN
-BUSY
-BUSY-TENTATIVE
-BUSY-UNAVAILABLE
-CAL-ADDRESS
-CANCEL
-CANCELLED
-CHAIR
-CHILD
-COMPLETED
-CONFIDENTIAL
-CONFIRMED
-COUNTER
-DATE
-DATE-TIME
-DECLINECOUNTER
-DECLINED
-DELEGATED
-DISPLAY
-DRAFT
-DURATION
-EMAIL
-END
-FINAL
-FLOAT
-FREE
-GREGORIAN
-GROUP
-INDIVIDUAL
-IN-PROCESS
-INTEGER
-NEEDS-ACTION
-NON-PARTICIPANT
-OPAQUE
-OPT-PARTICIPANT
-PARENT
-PERIOD
-PRIVATE
-PROCEDURE
-PUBLIC
-PUBLISH
-RECUR
-REFRESH
-REPLY
-REQ-PARTICIPANT
-REQUEST
-RESOURCE
-ROOM
-SIBLING
-START
-TENTATIVE
-TEXT
-THISANDFUTURE
-THISANDPRIOR
-TIME
-TRANSPAENT
-UNKNOWN
-UTCOFFSET
-XNAME
diff --git a/libical/design-data/restrictions.csv b/libical/design-data/restrictions.csv
deleted file mode 100644
index bf71d96327..0000000000
--- a/libical/design-data/restrictions.csv
+++ /dev/null
@@ -1,1348 +0,0 @@
-# Method, Target component, Property, Sub-component, Restriction
-PUBLISH,VEVENT,NONE,NONE,ONEPLUS
-PUBLISH,VEVENT,DTSTAMP,NONE,ONE
-PUBLISH,VEVENT,DTSTART,NONE,ONE
-PUBLISH,VEVENT,ORGANIZER,NONE,ONE
-PUBLISH,VEVENT,SUMMARY,NONE,ONE
-PUBLISH,VEVENT,UID,NONE,ONE
-PUBLISH,VEVENT,RECURRENCEID,NONE,ZEROORONE
-PUBLISH,VEVENT,SEQUENCE,NONE,ZEROORONE
-PUBLISH,VEVENT,ATTACH,NONE,ZEROPLUS
-PUBLISH,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
-PUBLISH,VEVENT,CLASS,NONE,ZEROORONE
-PUBLISH,VEVENT,COMMENT,NONE,ZEROORONE
-PUBLISH,VEVENT,CONTACT,NONE,ZEROPLUS
-PUBLISH,VEVENT,CREATED,NONE,ZEROORONE
-PUBLISH,VEVENT,DESCRIPTION,NONE,ZEROORONE
-PUBLISH,VEVENT,DTEND,NONE,ZEROORONE
-PUBLISH,VEVENT,DURATION,NONE,ZEROORONE
-PUBLISH,VEVENT,EXDATE,NONE,ZEROPLUS
-PUBLISH,VEVENT,EXRULE,NONE,ZEROPLUS
-PUBLISH,VEVENT,GEO,NONE,ZEROORONE
-PUBLISH,VEVENT,LASTMODIFIED,NONE,ZEROORONE
-PUBLISH,VEVENT,LOCATION,NONE,ZEROORONE
-PUBLISH,VEVENT,PRIORITY,NONE,ZEROORONE
-PUBLISH,VEVENT,RDATE,NONE,ZEROPLUS
-PUBLISH,VEVENT,RELATEDTO,NONE,ZEROPLUS
-PUBLISH,VEVENT,RESOURCES,NONE,ZEROORONE
-PUBLISH,VEVENT,RRULE,NONE,ZEROPLUS
-PUBLISH,VEVENT,STATUS,NONE,ZEROORONE
-PUBLISH,VEVENT,TRANSP,NONE,ZEROORONE
-PUBLISH,VEVENT,URL,NONE,ZEROORONE
-PUBLISH,VEVENT,X,NONE,ZEROPLUS
-PUBLISH,VEVENT,ATTENDEE,NONE,ZERO
-PUBLISH,VEVENT,REQUESTSTATUS,NONE,ZERO
-PUBLISH,VEVENT,NONE,VALARM,ZEROPLUS
-PUBLISH,VEVENT,NONE,VFREEBUSY,ZERO
-PUBLISH,VEVENT,NONE,VJOURNAL,ZERO
-PUBLISH,VEVENT,NONE,VTODO,ZERO
-PUBLISH,VEVENT,NONE,VTIMEZONE,ZEROPLUS
-PUBLISH,VEVENT,NONE,X,ZEROPLUS
-REQUEST,VEVENT,NONE,NONE,ONEPLUS
-REQUEST,VEVENT,ATTENDEE,NONE,ONEPLUS
-REQUEST,VEVENT,DTSTAMP,NONE,ONE
-REQUEST,VEVENT,DTSTART,NONE,ONE
-REQUEST,VEVENT,ORGANIZER,NONE,ONE
-REQUEST,VEVENT,SEQUENCE,NONE,ZEROORONE
-REQUEST,VEVENT,SUMMARY,NONE,ONE
-REQUEST,VEVENT,UID,NONE,ONE
-REQUEST,VEVENT,ATTACH,NONE,ZEROPLUS
-REQUEST,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
-REQUEST,VEVENT,CLASS,NONE,ZEROORONE
-REQUEST,VEVENT,COMMENT,NONE,ZEROORONE
-REQUEST,VEVENT,CONTACT,NONE,ZEROPLUS
-REQUEST,VEVENT,CREATED,NONE,ZEROORONE
-REQUEST,VEVENT,DESCRIPTION,NONE,ZEROORONE
-REQUEST,VEVENT,DTEND,NONE,ONEEXCLUSIVE,icalrestriction_check_exclusive
-REQUEST,VEVENT,DURATION,NONE,ONEEXCLUSIVE,icalrestriction_check_exclusive
-REQUEST,VEVENT,EXDATE,NONE,ZEROPLUS
-REQUEST,VEVENT,EXRULE,NONE,ZEROPLUS
-REQUEST,VEVENT,GEO,NONE,ZEROORONE
-REQUEST,VEVENT,LASTMODIFIED,NONE,ZEROORONE
-REQUEST,VEVENT,LOCATION,NONE,ZEROORONE
-REQUEST,VEVENT,PRIORITY,NONE,ZEROORONE
-REQUEST,VEVENT,RDATE,NONE,ZEROPLUS
-REQUEST,VEVENT,RECURRENCEID,NONE,ZEROORONE
-REQUEST,VEVENT,RELATEDTO,NONE,ZEROPLUS
-REQUEST,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
-REQUEST,VEVENT,RESOURCES,NONE,ZEROORONE
-REQUEST,VEVENT,RRULE,NONE,ZEROPLUS
-REQUEST,VEVENT,STATUS,NONE,ZEROORONE
-REQUEST,VEVENT,TRANSP,NONE,ZEROORONE
-REQUEST,VEVENT,URL,NONE,ZEROORONE
-REQUEST,VEVENT,X,NONE,ZEROPLUS
-REQUEST,VEVENT,NONE,VALARM,ZEROPLUS
-REQUEST,VEVENT,NONE,VTIMEZONE,ZEROPLUS
-REQUEST,VEVENT,NONE,X,ZEROPLUS
-REQUEST,VEVENT,NONE,VFREEBUSY,ZERO
-REQUEST,VEVENT,NONE,VJOURNAL,ZERO
-REQUEST,VEVENT,NONE,VTODO,ZERO
-REPLY,VEVENT,NONE,NONE,ONEPLUS
-REPLY,VEVENT,ATTENDEE,NONE,ONE
-REPLY,VEVENT,DTSTAMP,NONE,ONE
-REPLY,VEVENT,ORGANIZER,NONE,ONE
-REPLY,VEVENT,RECURRENCEID,NONE,ZEROORONE
-REPLY,VEVENT,UID,NONE,ONE
-REPLY,VEVENT,SEQUENCE,NONE,ZEROORONE
-REPLY,VEVENT,ATTACH,NONE,ZEROPLUS
-REPLY,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
-REPLY,VEVENT,CLASS,NONE,ZEROORONE
-REPLY,VEVENT,COMMENT,NONE,ZEROORONE
-REPLY,VEVENT,CONTACT,NONE,ZEROPLUS
-REPLY,VEVENT,CREATED,NONE,ZEROORONE
-REPLY,VEVENT,DESCRIPTION,NONE,ZEROORONE
-REPLY,VEVENT,DTEND,NONE,ONEEXCLUSIVE,icalrestriction_check_exclusive
-REPLY,VEVENT,DTSTART,NONE,ZEROORONE
-REPLY,VEVENT,DURATION,NONE,ONEEXCLUSIVE,icalrestriction_check_exclusive
-REPLY,VEVENT,EXDATE,NONE,ZEROPLUS
-REPLY,VEVENT,EXRULE,NONE,ZEROPLUS
-REPLY,VEVENT,GEO,NONE,ZEROORONE
-REPLY,VEVENT,LASTMODIFIED,NONE,ZEROORONE
-REPLY,VEVENT,LOCATION,NONE,ZEROORONE
-REPLY,VEVENT,PRIORITY,NONE,ZEROORONE
-REPLY,VEVENT,RDATE,NONE,ZEROPLUS
-REPLY,VEVENT,RELATEDTO,NONE,ZEROPLUS
-REPLY,VEVENT,RESOURCES,NONE,ZEROORONE
-REPLY,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
-REPLY,VEVENT,RRULE,NONE,ZEROPLUS
-REPLY,VEVENT,STATUS,NONE,ZEROORONE
-REPLY,VEVENT,SUMMARY,NONE,ZEROORONE
-REPLY,VEVENT,TRANSP,NONE,ZEROORONE
-REPLY,VEVENT,URL,NONE,ZEROORONE
-REPLY,VEVENT,X,NONE,ZEROPLUS
-REPLY,VEVENT,NONE,VTIMEZONE,ZEROORONE
-REPLY,VEVENT,NONE,X,ZEROPLUS
-REPLY,VEVENT,NONE,VALARM,ZERO
-REPLY,VEVENT,NONE,VFREEBUSY,ZERO
-REPLY,VEVENT,NONE,VJOURNAL,ZERO
-REPLY,VEVENT,NONE,VTODO,ZERO
-ADD,VEVENT,NONE,NONE,ONE
-ADD,VEVENT,DTSTAMP,NONE,ONE
-ADD,VEVENT,DTSTART,NONE,ONE
-ADD,VEVENT,ORGANIZER,NONE,ONE
-ADD,VEVENT,SEQUENCE,NONE,ONE
-ADD,VEVENT,SUMMARY,NONE,ONE
-ADD,VEVENT,UID,NONE,ONE
-ADD,VEVENT,ATTACH,NONE,ZEROPLUS
-ADD,VEVENT,ATTENDEE,NONE,ZEROPLUS
-ADD,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
-ADD,VEVENT,CLASS,NONE,ZEROORONE
-ADD,VEVENT,COMMENT,NONE,ZEROORONE
-ADD,VEVENT,CONTACT,NONE,ZEROPLUS
-ADD,VEVENT,CREATED,NONE,ZEROORONE
-ADD,VEVENT,DESCRIPTION,NONE,ZEROORONE
-ADD,VEVENT,DTEND,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
-ADD,VEVENT,DURATION,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
-ADD,VEVENT,EXDATE,NONE,ZEROPLUS
-ADD,VEVENT,EXRULE,NONE,ZEROPLUS
-ADD,VEVENT,GEO,NONE,ZEROORONE
-ADD,VEVENT,LASTMODIFIED,NONE,ZEROORONE
-ADD,VEVENT,LOCATION,NONE,ZEROORONE
-ADD,VEVENT,PRIORITY,NONE,ZEROORONE
-ADD,VEVENT,RDATE,NONE,ZEROPLUS
-ADD,VEVENT,RELATEDTO,NONE,ZEROPLUS
-ADD,VEVENT,RESOURCES,NONE,ZEROORONE
-ADD,VEVENT,RRULE,NONE,ZEROPLUS
-ADD,VEVENT,STATUS,NONE,ZEROORONE
-ADD,VEVENT,TRANSP,NONE,ZEROORONE
-ADD,VEVENT,URL,NONE,ZEROORONE
-ADD,VEVENT,X,NONE,ZEROPLUS
-ADD,VEVENT,RECURRENCEID,NONE,ZERO
-ADD,VEVENT,REQUESTSTATUS,NONE,ZERO
-ADD,VEVENT,NONE,VALARM,ZEROPLUS
-ADD,VEVENT,NONE,VTIMEZONE,ZEROPLUS
-ADD,VEVENT,NONE,X,ZEROPLUS
-ADD,VEVENT,NONE,VFREEBUSY,ZERO
-ADD,VEVENT,NONE,VTODO,ZERO
-ADD,VEVENT,NONE,VJOURNAL,ZERO
-CANCEL,VEVENT,NONE,NONE,ONEPLUS
-CANCEL,VEVENT,ATTENDEE,NONE,ZEROPLUS
-CANCEL,VEVENT,DTSTAMP,NONE,ONE
-CANCEL,VEVENT,ORGANIZER,NONE,ONE
-CANCEL,VEVENT,SEQUENCE,NONE,ONE
-CANCEL,VEVENT,UID,NONE,ONE
-CANCEL,VEVENT,COMMENT,NONE,ZEROORONE
-CANCEL,VEVENT,ATTACH,NONE,ZEROPLUS
-CANCEL,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
-CANCEL,VEVENT,CLASS,NONE,ZEROORONE
-CANCEL,VEVENT,CONTACT,NONE,ZEROPLUS
-CANCEL,VEVENT,CREATED,NONE,ZEROORONE
-CANCEL,VEVENT,DESCRIPTION,NONE,ZEROORONE
-CANCEL,VEVENT,DTEND,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
-CANCEL,VEVENT,DTSTART,NONE,ZEROORONE
-CANCEL,VEVENT,DURATION,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
-CANCEL,VEVENT,EXDATE,NONE,ZEROPLUS
-CANCEL,VEVENT,EXRULE,NONE,ZEROPLUS
-CANCEL,VEVENT,GEO,NONE,ZEROORONE
-CANCEL,VEVENT,LASTMODIFIED,NONE,ZEROORONE
-CANCEL,VEVENT,LOCATION,NONE,ZEROORONE
-CANCEL,VEVENT,PRIORITY,NONE,ZEROORONE
-CANCEL,VEVENT,RDATE,NONE,ZEROPLUS
-CANCEL,VEVENT,RECURRENCEID,NONE,ZEROORONE
-CANCEL,VEVENT,RELATEDTO,NONE,ZEROPLUS
-CANCEL,VEVENT,RESOURCES,NONE,ZEROORONE
-CANCEL,VEVENT,RRULE,NONE,ZEROPLUS
-CANCEL,VEVENT,STATUS,NONE,ZEROORONE
-CANCEL,VEVENT,SUMMARY,NONE,ZEROORONE
-CANCEL,VEVENT,TRANSP,NONE,ZEROORONE
-CANCEL,VEVENT,URL,NONE,ZEROORONE
-CANCEL,VEVENT,X,NONE,ZEROPLUS
-CANCEL,VEVENT,REQUESTSTATUS,NONE,ZERO
-CANCEL,VEVENT,NONE,VTIMEZONE,ZEROPLUS
-CANCEL,VEVENT,NONE,X,ZEROPLUS
-CANCEL,VEVENT,NONE,VTODO,ZERO
-CANCEL,VEVENT,NONE,VJOURNAL,ZERO
-CANCEL,VEVENT,NONE,VFREEBUSY,ZERO
-CANCEL,VEVENT,NONE,VALARM,ZERO
-REFRESH,VEVENT,NONE,NONE,ONE
-REFRESH,VEVENT,ATTENDEE,NONE,ONE
-REFRESH,VEVENT,DTSTAMP,NONE,ONE
-REFRESH,VEVENT,ORGANIZER,NONE,ONE
-REFRESH,VEVENT,UID,NONE,ONE
-REFRESH,VEVENT,COMMENT,NONE,ZEROORONE
-REFRESH,VEVENT,RECURRENCEID,NONE,ZEROORONE
-REFRESH,VEVENT,X,NONE,ZEROPLUS
-REFRESH,VEVENT,ATTACH,NONE,ZERO
-REFRESH,VEVENT,CATEGORIES,NONE,ZERO
-REFRESH,VEVENT,CLASS,NONE,ZERO
-REFRESH,VEVENT,CONTACT,NONE,ZERO
-REFRESH,VEVENT,CREATED,NONE,ZERO
-REFRESH,VEVENT,DESCRIPTION,NONE,ZERO
-REFRESH,VEVENT,DTEND,NONE,ZERO
-REFRESH,VEVENT,DTSTART,NONE,ZERO
-REFRESH,VEVENT,DURATION,NONE,ZERO
-REFRESH,VEVENT,EXDATE,NONE,ZERO
-REFRESH,VEVENT,EXRULE,NONE,ZERO
-REFRESH,VEVENT,GEO,NONE,ZERO
-REFRESH,VEVENT,LASTMODIFIED,NONE,ZERO
-REFRESH,VEVENT,LOCATION,NONE,ZERO
-REFRESH,VEVENT,PRIORITY,NONE,ZERO
-REFRESH,VEVENT,RDATE,NONE,ZERO
-REFRESH,VEVENT,RELATEDTO,NONE,ZERO
-REFRESH,VEVENT,REQUESTSTATUS,NONE,ZERO
-REFRESH,VEVENT,RESOURCES,NONE,ZERO
-REFRESH,VEVENT,RRULE,NONE,ZERO
-REFRESH,VEVENT,SEQUENCE,NONE,ZERO
-REFRESH,VEVENT,STATUS,NONE,ZERO
-REFRESH,VEVENT,SUMMARY,NONE,ZERO
-REFRESH,VEVENT,TRANSP,NONE,ZERO
-REFRESH,VEVENT,URL,NONE,ZERO
-REFRESH,VEVENT,NONE,X,ZEROPLUS
-REFRESH,VEVENT,NONE,VTODO,ZERO
-REFRESH,VEVENT,NONE,VJOURNAL,ZERO
-REFRESH,VEVENT,NONE,VFREEBUSY,ZERO
-REFRESH,VEVENT,NONE,VTIMEZONE,ZERO
-REFRESH,VEVENT,NONE,VALARM,ZERO
-COUNTER,VEVENT,NONE,NONE,ONE
-COUNTER,VEVENT,DTSTAMP,NONE,ONE
-COUNTER,VEVENT,DTSTART,NONE,ONE
-COUNTER,VEVENT,ORGANIZER,NONE,ONE
-COUNTER,VEVENT,SEQUENCE,NONE,ONE
-COUNTER,VEVENT,SUMMARY,NONE,ONE
-COUNTER,VEVENT,UID,NONE,ONE
-COUNTER,VEVENT,ATTACH,NONE,ZEROPLUS
-COUNTER,VEVENT,ATTENDEE,NONE,ZEROPLUS
-COUNTER,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
-COUNTER,VEVENT,CLASS,NONE,ZEROORONE
-COUNTER,VEVENT,COMMENT,NONE,ZEROORONE
-COUNTER,VEVENT,CONTACT,NONE,ZEROPLUS
-COUNTER,VEVENT,CREATED,NONE,ZEROORONE
-COUNTER,VEVENT,DESCRIPTION,NONE,ZEROORONE
-COUNTER,VEVENT,DTEND,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
-COUNTER,VEVENT,DURATION,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
-COUNTER,VEVENT,EXDATE,NONE,ZEROPLUS
-COUNTER,VEVENT,EXRULE,NONE,ZEROPLUS
-COUNTER,VEVENT,GEO,NONE,ZEROORONE
-COUNTER,VEVENT,LASTMODIFIED,NONE,ZEROORONE
-COUNTER,VEVENT,LOCATION,NONE,ZEROORONE
-COUNTER,VEVENT,PRIORITY,NONE,ZEROORONE
-COUNTER,VEVENT,RDATE,NONE,ZEROPLUS
-COUNTER,VEVENT,RECURRENCEID,NONE,ZEROORONE
-COUNTER,VEVENT,RELATEDTO,NONE,ZEROPLUS
-COUNTER,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
-COUNTER,VEVENT,RESOURCES,NONE,ZEROORONE
-COUNTER,VEVENT,RRULE,NONE,ZEROPLUS
-COUNTER,VEVENT,STATUS,NONE,ZEROORONE
-COUNTER,VEVENT,TRANSP,NONE,ZEROORONE
-COUNTER,VEVENT,URL,NONE,ZEROORONE
-COUNTER,VEVENT,X,NONE,ZEROPLUS
-COUNTER,VEVENT,NONE,VALARM,ZEROPLUS
-COUNTER,VEVENT,NONE,VTIMEZONE,ZEROPLUS
-COUNTER,VEVENT,NONE,X,ZEROPLUS
-COUNTER,VEVENT,NONE,VTODO,ZERO
-COUNTER,VEVENT,NONE,VJOURNAL,ZERO
-COUNTER,VEVENT,NONE,VFREEBUSY,ZERO
-DECLINECOUNTER,VEVENT,NONE,NONE,ONE
-DECLINECOUNTER,VEVENT,DTSTAMP,NONE,ONE
-DECLINECOUNTER,VEVENT,ORGANIZER,NONE,ONE
-DECLINECOUNTER,VEVENT,UID,NONE,ONE
-DECLINECOUNTER,VEVENT,COMMENT,NONE,ZEROORONE
-DECLINECOUNTER,VEVENT,RECURRENCEID,NONE,ZEROORONE
-DECLINECOUNTER,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
-DECLINECOUNTER,VEVENT,SEQUENCE,NONE,ZERO
-DECLINECOUNTER,VEVENT,X,NONE,ZEROPLUS
-DECLINECOUNTER,VEVENT,ATTACH,NONE,ZERO
-DECLINECOUNTER,VEVENT,ATTENDEE,NONE,ZERO
-DECLINECOUNTER,VEVENT,CATEGORIES,NONE,ZERO
-DECLINECOUNTER,VEVENT,CLASS,NONE,ZERO
-DECLINECOUNTER,VEVENT,CONTACT,NONE,ZERO
-DECLINECOUNTER,VEVENT,CREATED,NONE,ZERO
-DECLINECOUNTER,VEVENT,DESCRIPTION,NONE,ZERO
-DECLINECOUNTER,VEVENT,DTEND,NONE,ZERO
-DECLINECOUNTER,VEVENT,DTSTART,NONE,ZERO
-DECLINECOUNTER,VEVENT,DURATION,NONE,ZERO
-DECLINECOUNTER,VEVENT,EXDATE,NONE,ZERO
-DECLINECOUNTER,VEVENT,EXRULE,NONE,ZERO
-DECLINECOUNTER,VEVENT,GEO,NONE,ZERO
-DECLINECOUNTER,VEVENT,LASTMODIFIED,NONE,ZERO
-DECLINECOUNTER,VEVENT,LOCATION,NONE,ZERO
-DECLINECOUNTER,VEVENT,PRIORITY,NONE,ZERO
-DECLINECOUNTER,VEVENT,RDATE,NONE,ZERO
-DECLINECOUNTER,VEVENT,RELATEDTO,NONE,ZERO
-DECLINECOUNTER,VEVENT,RESOURCES,NONE,ZERO
-DECLINECOUNTER,VEVENT,RRULE,NONE,ZERO
-DECLINECOUNTER,VEVENT,STATUS,NONE,ZERO
-DECLINECOUNTER,VEVENT,SUMMARY,NONE,ZERO
-DECLINECOUNTER,VEVENT,TRANSP,NONE,ZERO
-DECLINECOUNTER,VEVENT,URL,NONE,ZERO
-DECLINECOUNTER,VEVENT,NONE,X,ZEROPLUS
-DECLINECOUNTER,VEVENT,NONE,VTODO,ZERO
-DECLINECOUNTER,VEVENT,NONE,VJOURNAL,ZERO
-DECLINECOUNTER,VEVENT,NONE,VFREEBUSY,ZERO
-DECLINECOUNTER,VEVENT,NONE,VTIMEZONE,ZERO
-DECLINECOUNTER,VEVENT,NONE,VALARM,ZERO
-PUBLISH,VFREEBUSY,NONE,NONE,ONEPLUS
-PUBLISH,VFREEBUSY,DTSTAMP,NONE,ONE
-PUBLISH,VFREEBUSY,DTSTART,NONE,ONE
-PUBLISH,VFREEBUSY,DTEND,NONE,ONE
-PUBLISH,VFREEBUSY,FREEBUSY,NONE,ONEPLUS
-PUBLISH,VFREEBUSY,ORGANIZER,NONE,ONE
-PUBLISH,VFREEBUSY,COMMENT,NONE,ZEROORONE
-PUBLISH,VFREEBUSY,CONTACT,NONE,ZEROPLUS
-PUBLISH,VFREEBUSY,X,NONE,ZEROPLUS
-PUBLISH,VFREEBUSY,URL,NONE,ZEROORONE
-PUBLISH,VFREEBUSY,ATTENDEE,NONE,ZERO
-PUBLISH,VFREEBUSY,DURATION,NONE,ZERO
-PUBLISH,VFREEBUSY,REQUESTSTATUS,NONE,ZERO
-PUBLISH,VFREEBUSY,UID,NONE,ZERO
-PUBLISH,VFREEBUSY,NONE,X,ZEROPLUS
-PUBLISH,VFREEBUSY,NONE,VEVENT,ZERO
-PUBLISH,VFREEBUSY,NONE,VTODO,ZERO
-PUBLISH,VFREEBUSY,NONE,VJOURNAL,ZERO
-PUBLISH,VFREEBUSY,NONE,VTIMEZONE,ZERO
-PUBLISH,VFREEBUSY,NONE,VALARM,ZERO
-REQUEST,VFREEBUSY,NONE,NONE,ONE
-REQUEST,VFREEBUSY,ATTENDEE,NONE,ONEPLUS
-REQUEST,VFREEBUSY,DTEND,NONE,ONE
-REQUEST,VFREEBUSY,DTSTAMP,NONE,ONE
-REQUEST,VFREEBUSY,DTSTART,NONE,ONE
-REQUEST,VFREEBUSY,ORGANIZER,NONE,ONE
-REQUEST,VFREEBUSY,UID,NONE,ONE
-REQUEST,VFREEBUSY,COMMENT,NONE,ZEROORONE
-REQUEST,VFREEBUSY,CONTACT,NONE,ZEROPLUS
-REQUEST,VFREEBUSY,X,NONE,ZEROPLUS
-REQUEST,VFREEBUSY,FREEBUSY,NONE,ZERO
-REQUEST,VFREEBUSY,DURATION,NONE,ZERO
-REQUEST,VFREEBUSY,REQUESTSTATUS,NONE,ZERO
-REQUEST,VFREEBUSY,URL,NONE,ZERO
-REQUEST,VFREEBUSY,NONE,X,ZEROPLUS
-REQUEST,VFREEBUSY,NONE,VALARM,ZERO
-REQUEST,VFREEBUSY,NONE,VEVENT,ZERO
-REQUEST,VFREEBUSY,NONE,VTODO,ZERO
-REQUEST,VFREEBUSY,NONE,VJOURNAL,ZERO
-REQUEST,VFREEBUSY,NONE,VTIMEZONE,ZERO
-REPLY,VFREEBUSY,NONE,NONE,ONE
-REPLY,VFREEBUSY,ATTENDEE,NONE,ONE
-REPLY,VFREEBUSY,DTSTAMP,NONE,ONE
-REPLY,VFREEBUSY,DTEND,NONE,ONE
-REPLY,VFREEBUSY,DTSTART,NONE,ONE
-REPLY,VFREEBUSY,FREEBUSY,NONE,ONEPLUS
-REPLY,VFREEBUSY,ORGANIZER,NONE,ONE
-REPLY,VFREEBUSY,UID,NONE,ONE
-REPLY,VFREEBUSY,COMMENT,NONE,ZEROORONE
-REPLY,VFREEBUSY,CONTACT,NONE,ZEROPLUS
-REPLY,VFREEBUSY,REQUESTSTATUS,NONE,ZEROPLUS
-REPLY,VFREEBUSY,URL,NONE,ZEROORONE
-REPLY,VFREEBUSY,X,NONE,ZEROPLUS
-REPLY,VFREEBUSY,DURATION,NONE,ZERO
-REPLY,VFREEBUSY,SEQUENCE,NONE,ZERO
-REPLY,VFREEBUSY,NONE,X,ZEROPLUS
-REPLY,VFREEBUSY,NONE,VALARM,ZERO
-REPLY,VFREEBUSY,NONE,VEVENT,ZERO
-REPLY,VFREEBUSY,NONE,VTODO,ZERO
-REPLY,VFREEBUSY,NONE,VJOURNAL,ZERO
-REPLY,VFREEBUSY,NONE,VTIMEZONE,ZERO
-PUBLISH,VTODO,NONE,NONE,ONEPLUS
-PUBLISH,VTODO,DTSTAMP,NONE,ONE
-PUBLISH,VTODO,DTSTART,NONE,ONE
-PUBLISH,VTODO,ORGANIZER,NONE,ONE
-PUBLISH,VTODO,PRIORITY,NONE,ONE
-PUBLISH,VTODO,SEQUENCE,NONE,ZEROORONE
-PUBLISH,VTODO,SUMMARY,NONE,ONE
-PUBLISH,VTODO,UID,NONE,ONE
-PUBLISH,VTODO,ATTACH,NONE,ZEROPLUS
-PUBLISH,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard
-PUBLISH,VTODO,CLASS,NONE,ZEROORONE
-PUBLISH,VTODO,COMMENT,NONE,ZEROORONE
-PUBLISH,VTODO,CONTACT,NONE,ZEROPLUS
-PUBLISH,VTODO,CREATED,NONE,ZEROORONE
-PUBLISH,VTODO,DESCRIPTION,NONE,ZEROORONE
-PUBLISH,VTODO,DUE,NONE,ZEROORONE
-PUBLISH,VTODO,DURATION,NONE,ZEROORONE
-PUBLISH,VTODO,EXDATE,NONE,ZEROPLUS
-PUBLISH,VTODO,EXRULE,NONE,ZEROPLUS
-PUBLISH,VTODO,GEO,NONE,ZEROORONE
-PUBLISH,VTODO,LASTMODIFIED,NONE,ZEROORONE
-PUBLISH,VTODO,LOCATION,NONE,ZEROORONE
-PUBLISH,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
-PUBLISH,VTODO,RDATE,NONE,ZEROPLUS
-PUBLISH,VTODO,RECURRENCEID,NONE,ZEROORONE
-PUBLISH,VTODO,RELATEDTO,NONE,ZEROPLUS
-PUBLISH,VTODO,RESOURCES,NONE,ZEROORONE
-PUBLISH,VTODO,RRULE,NONE,ZEROPLUS
-PUBLISH,VTODO,STATUS,NONE,ZEROORONE
-PUBLISH,VTODO,URL,NONE,ZEROORONE
-PUBLISH,VTODO,X,NONE,ZEROPLUS
-PUBLISH,VTODO,ATTENDEE,NONE,ZERO
-PUBLISH,VTODO,REQUESTSTATUS,NONE,ZERO
-PUBLISH,VTODO,NONE,VTIMEZONE,ZEROPLUS
-PUBLISH,VTODO,NONE,VALARM,ZEROPLUS
-PUBLISH,VTODO,NONE,X,ZEROPLUS
-PUBLISH,VTODO,NONE,VFREEBUSY,ZERO
-PUBLISH,VTODO,NONE,VEVENT,ZERO
-PUBLISH,VTODO,NONE,VJOURNAL,ZERO
-REQUEST,VTODO,NONE,NONE,ONEPLUS
-REQUEST,VTODO,ATTENDEE,NONE,ONEPLUS
-REQUEST,VTODO,DTSTAMP,NONE,ONE
-REQUEST,VTODO,DTSTART,NONE,ONE
-REQUEST,VTODO,ORGANIZER,NONE,ONE
-REQUEST,VTODO,PRIORITY,NONE,ONE
-REQUEST,VTODO,SEQUENCE,NONE,ZEROORONE
-REQUEST,VTODO,SUMMARY,NONE,ONE
-REQUEST,VTODO,UID,NONE,ONE
-REQUEST,VTODO,ATTACH,NONE,ZEROPLUS
-REQUEST,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard
-REQUEST,VTODO,CLASS,NONE,ZEROORONE
-REQUEST,VTODO,COMMENT,NONE,ZEROORONE
-REQUEST,VTODO,CONTACT,NONE,ZEROPLUS
-REQUEST,VTODO,CREATED,NONE,ZEROORONE
-REQUEST,VTODO,DESCRIPTION,NONE,ZEROORONE
-REQUEST,VTODO,DUE,NONE,ZEROORONE
-REQUEST,VTODO,DURATION,NONE,ZEROORONE
-REQUEST,VTODO,EXDATE,NONE,ZEROPLUS
-REQUEST,VTODO,EXRULE,NONE,ZEROPLUS
-REQUEST,VTODO,GEO,NONE,ZEROORONE
-REQUEST,VTODO,LASTMODIFIED,NONE,ZEROORONE
-REQUEST,VTODO,LOCATION,NONE,ZEROORONE
-REQUEST,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
-REQUEST,VTODO,RDATE,NONE,ZEROPLUS
-REQUEST,VTODO,RECURRENCEID,NONE,ZEROORONE
-REQUEST,VTODO,RELATEDTO,NONE,ZEROPLUS
-REQUEST,VTODO,RESOURCES,NONE,ZEROORONE
-REQUEST,VTODO,RRULE,NONE,ZEROPLUS
-REQUEST,VTODO,STATUS,NONE,ZEROORONE
-REQUEST,VTODO,URL,NONE,ZEROORONE
-REQUEST,VTODO,X,NONE,ZEROPLUS
-REQUEST,VTODO,REQUESTSTATUS,NONE,ZERO
-REQUEST,VTODO,NONE,VALARM,ZEROPLUS
-REQUEST,VTODO,NONE,VTIMEZONE,ZEROPLUS
-REQUEST,VTODO,NONE,X,ZEROPLUS
-REQUEST,VTODO,NONE,VEVENT,ZERO
-REQUEST,VTODO,NONE,VFREEBUSY,ZERO
-REQUEST,VTODO,NONE,VJOURNAL,ZERO
-REPLY,VTODO,NONE,NONE,ONEPLUS
-REPLY,VTODO,ATTENDEE,NONE,ONEPLUS
-REPLY,VTODO,DTSTAMP,NONE,ONE
-REPLY,VTODO,ORGANIZER,NONE,ONE
-REPLY,VTODO,REQUESTSTATUS,NONE,ONEPLUS
-REPLY,VTODO,UID,NONE,ONE
-REPLY,VTODO,ATTACH,NONE,ZEROPLUS
-REPLY,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard
-REPLY,VTODO,CLASS,NONE,ZEROORONE
-REPLY,VTODO,COMMENT,NONE,ZEROORONE
-REPLY,VTODO,CONTACT,NONE,ZEROPLUS
-REPLY,VTODO,CREATED,NONE,ZEROORONE
-REPLY,VTODO,DESCRIPTION,NONE,ZEROORONE
-REPLY,VTODO,DTSTART,NONE,ZEROORONE
-REPLY,VTODO,DUE,NONE,ZEROORONE
-REPLY,VTODO,DURATION,NONE,ZEROORONE
-REPLY,VTODO,EXDATE,NONE,ZEROPLUS
-REPLY,VTODO,EXRULE,NONE,ZEROPLUS
-REPLY,VTODO,GEO,NONE,ZEROORONE
-REPLY,VTODO,LASTMODIFIED,NONE,ZEROORONE
-REPLY,VTODO,LOCATION,NONE,ZEROORONE
-REPLY,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
-REPLY,VTODO,PRIORITY,NONE,ZEROORONE
-REPLY,VTODO,RDATE,NONE,ZEROPLUS
-REPLY,VTODO,RELATEDTO,NONE,ZEROPLUS
-REPLY,VTODO,RESOURCES,NONE,ZEROORONE
-REPLY,VTODO,RRULE,NONE,ZEROPLUS
-REPLY,VTODO,RECURRENCEID,NONE,ZEROORONE
-REPLY,VTODO,SEQUENCE,NONE,ZEROORONE
-REPLY,VTODO,STATUS,NONE,ZEROORONE
-REPLY,VTODO,SUMMARY,NONE,ZEROORONE
-REPLY,VTODO,URL,NONE,ZEROORONE
-REPLY,VTODO,X,NONE,ZEROPLUS
-REPLY,VTODO,NONE,VTIMEZONE,ZEROORONE
-REPLY,VTODO,NONE,X,ZEROPLUS
-REPLY,VTODO,NONE,VALARM,ZERO
-REPLY,VTODO,NONE,VEVENT,ZERO
-REPLY,VTODO,NONE,VFREEBUSY,ZERO
-ADD,VTODO,NONE,NONE,ONE
-ADD,VTODO,DTSTAMP,NONE,ONE
-ADD,VTODO,ORGANIZER,NONE,ONE
-ADD,VTODO,PRIORITY,NONE,ONE
-ADD,VTODO,SEQUENCE,NONE,ONE
-ADD,VTODO,SUMMARY,NONE,ONE
-ADD,VTODO,UID,NONE,ONE
-ADD,VTODO,ATTACH,NONE,ZEROPLUS
-ADD,VTODO,ATTENDEE,NONE,ZEROPLUS
-ADD,VTODO,CATEGORIES,NONE,ZEROPLUS
-ADD,VTODO,CLASS,NONE,ZEROORONE
-ADD,VTODO,COMMENT,NONE,ZEROORONE
-ADD,VTODO,CONTACT,NONE,ZEROPLUS
-ADD,VTODO,CREATED,NONE,ZEROORONE
-ADD,VTODO,DESCRIPTION,NONE,ZEROORONE
-ADD,VTODO,DTSTART,NONE,ZEROORONE
-ADD,VTODO,DUE,NONE,ZEROORONE
-ADD,VTODO,DURATION,NONE,ZEROORONE
-ADD,VTODO,EXDATE,NONE,ZEROPLUS
-ADD,VTODO,EXRULE,NONE,ZEROPLUS
-ADD,VTODO,GEO,NONE,ZEROORONE
-ADD,VTODO,LASTMODIFIED,NONE,ZEROORONE
-ADD,VTODO,LOCATION,NONE,ZEROORONE
-ADD,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
-ADD,VTODO,RDATE,NONE,ZEROPLUS
-ADD,VTODO,RELATEDTO,NONE,ZEROPLUS
-ADD,VTODO,RESOURCES,NONE,ZEROORONE
-ADD,VTODO,RRULE,NONE,ZEROPLUS
-ADD,VTODO,STATUS,NONE,ZEROORONE
-ADD,VTODO,URL,NONE,ZEROORONE
-ADD,VTODO,X,NONE,ZEROPLUS
-ADD,VTODO,RECURRENCEID,NONE,ZERO
-ADD,VTODO,REQUESTSTATUS,NONE,ZERO
-ADD,VTODO,NONE,VALARM,ZEROPLUS
-ADD,VTODO,NONE,VTIMEZONE,ZEROPLUS
-ADD,VTODO,NONE,X,ZEROPLUS
-ADD,VTODO,NONE,VEVENT,ZERO
-ADD,VTODO,NONE,VJOURNAL,ZERO
-ADD,VTODO,NONE,VFREEBUSY,ZERO
-CANCEL,VTODO,NONE,NONE,ONE
-CANCEL,VTODO,ATTENDEE,NONE,ZEROPLUS
-CANCEL,VTODO,UID,NONE,ONE
-CANCEL,VTODO,DTSTAMP,NONE,ONE
-CANCEL,VTODO,ORGANIZER,NONE,ONE
-CANCEL,VTODO,SEQUENCE,NONE,ONE
-CANCEL,VTODO,ATTACH,NONE,ZEROPLUS
-CANCEL,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard
-CANCEL,VTODO,CLASS,NONE,ZEROORONE
-CANCEL,VTODO,COMMENT,NONE,ZEROORONE
-CANCEL,VTODO,CONTACT,NONE,ZEROPLUS
-CANCEL,VTODO,CREATED,NONE,ZEROORONE
-CANCEL,VTODO,DESCRIPTION,NONE,ZEROORONE
-CANCEL,VTODO,DTSTART,NONE,ZEROORONE
-CANCEL,VTODO,DUE,NONE,ZEROORONE
-CANCEL,VTODO,DURATION,NONE,ZEROORONE
-CANCEL,VTODO,EXDATE,NONE,ZEROPLUS
-CANCEL,VTODO,EXRULE,NONE,ZEROPLUS
-CANCEL,VTODO,GEO,NONE,ZEROORONE
-CANCEL,VTODO,LASTMODIFIED,NONE,ZEROORONE
-CANCEL,VTODO,LOCATION,NONE,ZEROORONE
-CANCEL,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
-CANCEL,VTODO,RDATE,NONE,ZEROPLUS
-CANCEL,VTODO,RECURRENCEID,NONE,ZEROORONE
-CANCEL,VTODO,RELATEDTO,NONE,ZEROPLUS
-CANCEL,VTODO,RESOURCES,NONE,ZEROORONE
-CANCEL,VTODO,RRULE,NONE,ZEROPLUS
-CANCEL,VTODO,PRIORITY,NONE,ZEROORONE
-CANCEL,VTODO,STATUS,NONE,ZEROORONE
-CANCEL,VTODO,URL,NONE,ZEROORONE
-CANCEL,VTODO,X,NONE,ZEROPLUS
-CANCEL,VTODO,REQUESTSTATUS,NONE,ZERO
-CANCEL,VTODO,NONE,VTIMEZONE,ZEROORONE
-CANCEL,VTODO,NONE,X,ZEROPLUS
-CANCEL,VTODO,NONE,VALARM,ZERO
-CANCEL,VTODO,NONE,VEVENT,ZERO
-CANCEL,VTODO,NONE,VFREEBUSY,ZERO
-REFRESH,VTODO,NONE,NONE,ONE
-REFRESH,VTODO,ATTENDEE,NONE,ONE
-REFRESH,VTODO,DTSTAMP,NONE,ONE
-REFRESH,VTODO,UID,NONE,ONE
-REFRESH,VTODO,RECURRENCEID,NONE,ZEROORONE
-REFRESH,VTODO,X,NONE,ZEROPLUS
-REFRESH,VTODO,ATTACH,NONE,ZERO
-REFRESH,VTODO,CATEGORIES,NONE,ZERO
-REFRESH,VTODO,CLASS,NONE,ZERO
-REFRESH,VTODO,COMMENT,NONE,ZERO
-REFRESH,VTODO,CONTACT,NONE,ZERO
-REFRESH,VTODO,CREATED,NONE,ZERO
-REFRESH,VTODO,DESCRIPTION,NONE,ZERO
-REFRESH,VTODO,DTSTART,NONE,ZERO
-REFRESH,VTODO,DUE,NONE,ZERO
-REFRESH,VTODO,DURATION,NONE,ZERO
-REFRESH,VTODO,EXDATE,NONE,ZERO
-REFRESH,VTODO,EXRULE,NONE,ZERO
-REFRESH,VTODO,GEO,NONE,ZERO
-REFRESH,VTODO,LASTMODIFIED,NONE,ZERO
-REFRESH,VTODO,LOCATION,NONE,ZERO
-REFRESH,VTODO,ORGANIZER,NONE,ZERO
-REFRESH,VTODO,PERCENTCOMPLETE,NONE,ZERO
-REFRESH,VTODO,PRIORITY,NONE,ZERO
-REFRESH,VTODO,RDATE,NONE,ZERO
-REFRESH,VTODO,RELATEDTO,NONE,ZERO
-REFRESH,VTODO,REQUESTSTATUS,NONE,ZERO
-REFRESH,VTODO,RESOURCES,NONE,ZERO
-REFRESH,VTODO,RRULE,NONE,ZERO
-REFRESH,VTODO,SEQUENCE,NONE,ZERO
-REFRESH,VTODO,STATUS,NONE,ZERO
-REFRESH,VTODO,URL,NONE,ZERO
-REFRESH,VTODO,NONE,X,ZEROPLUS
-REFRESH,VTODO,NONE,VALARM,ZERO
-REFRESH,VTODO,NONE,VEVENT,ZERO
-REFRESH,VTODO,NONE,VFREEBUSY,ZERO
-REFRESH,VTODO,NONE,VTIMEZONE,ZERO
-COUNTER,VTODO,NONE,NONE,ONE
-COUNTER,VTODO,ATTENDEE,NONE,ONEPLUS
-COUNTER,VTODO,DTSTAMP,NONE,ONE
-COUNTER,VTODO,ORGANIZER,NONE,ONE
-COUNTER,VTODO,PRIORITY,NONE,ONE
-COUNTER,VTODO,SUMMARY,NONE,ONE
-COUNTER,VTODO,UID,NONE,ONE
-COUNTER,VTODO,ATTACH,NONE,ZEROPLUS
-COUNTER,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-standard
-COUNTER,VTODO,CLASS,NONE,ZEROORONE
-COUNTER,VTODO,COMMENT,NONE,ZEROORONE
-COUNTER,VTODO,CONTACT,NONE,ZEROPLUS
-COUNTER,VTODO,CREATED,NONE,ZEROORONE
-COUNTER,VTODO,DESCRIPTION,NONE,ZEROORONE
-COUNTER,VTODO,DTSTART,NONE,ZEROORONE
-COUNTER,VTODO,DUE,NONE,ZEROORONE
-COUNTER,VTODO,DURATION,NONE,ZEROORONE
-COUNTER,VTODO,EXDATE,NONE,ZEROPLUS
-COUNTER,VTODO,EXRULE,NONE,ZEROPLUS
-COUNTER,VTODO,GEO,NONE,ZEROORONE
-COUNTER,VTODO,LASTMODIFIED,NONE,ZEROORONE
-COUNTER,VTODO,LOCATION,NONE,ZEROORONE
-COUNTER,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
-COUNTER,VTODO,RDATE,NONE,ZEROPLUS
-COUNTER,VTODO,RECURRENCEID,NONE,ZEROORONE
-COUNTER,VTODO,RELATEDTO,NONE,ZEROPLUS
-COUNTER,VTODO,REQUESTSTATUS,NONE,ZEROPLUS
-COUNTER,VTODO,RESOURCES,NONE,ZEROORONE
-COUNTER,VTODO,RRULE,NONE,ZEROORONE
-COUNTER,VTODO,SEQUENCE,NONE,ZEROORONE
-COUNTER,VTODO,STATUS,NONE,ZEROORONE
-COUNTER,VTODO,URL,NONE,ZEROORONE
-COUNTER,VTODO,X,NONE,ZEROPLUS
-COUNTER,VTODO,NONE,VALARM,ZEROPLUS
-COUNTER,VTODO,NONE,VTIMEZONE,ZEROORONE
-COUNTER,VTODO,NONE,X,ZEROPLUS
-COUNTER,VTODO,NONE,VEVENT,ZERO
-COUNTER,VTODO,NONE,VFREEBUSY,ZERO
-DECLINECOUNTER,VTODO,NONE,NONE,ONE
-DECLINECOUNTER,VTODO,ATTENDEE,NONE,ONEPLUS
-DECLINECOUNTER,VTODO,DTSTAMP,NONE,ONE
-DECLINECOUNTER,VTODO,ORGANIZER,NONE,ONE
-DECLINECOUNTER,VTODO,SEQUENCE,NONE,ONE
-DECLINECOUNTER,VTODO,UID,NONE,ONE
-DECLINECOUNTER,VTODO,ATTACH,NONE,ZEROPLUS
-DECLINECOUNTER,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-standard
-DECLINECOUNTER,VTODO,CLASS,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,COMMENT,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,CONTACT,NONE,ZEROPLUS
-DECLINECOUNTER,VTODO,CREATED,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,DESCRIPTION,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,DTSTART,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,DUE,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,DURATION,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,EXDATE,NONE,ZEROPLUS
-DECLINECOUNTER,VTODO,EXRULE,NONE,ZEROPLUS
-DECLINECOUNTER,VTODO,GEO,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,LASTMODIFIED,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,LOCATION,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,PRIORITY,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,RDATE,NONE,ZEROPLUS
-DECLINECOUNTER,VTODO,RECURRENCEID,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,RELATEDTO,NONE,ZEROPLUS
-DECLINECOUNTER,VTODO,REQUESTSTATUS,NONE,ZEROPLUS
-DECLINECOUNTER,VTODO,RESOURCES,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,RRULE,NONE,ZEROPLUS
-DECLINECOUNTER,VTODO,STATUS,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,URL,NONE,ZEROORONE
-DECLINECOUNTER,VTODO,X,NONE,ZEROPLUS
-DECLINECOUNTER,VTODO,NONE,VTIMEZONE,ZEROPLUS
-DECLINECOUNTER,VTODO,NONE,X,ZEROPLUS
-DECLINECOUNTER,VTODO,NONE,VALARM,ZERO
-DECLINECOUNTER,VTODO,NONE,VEVENT,ZERO
-DECLINECOUNTER,VTODO,NONE,VFREEBUSY,ZERO
-PUBLISH,VJOURNAL,NONE,NONE,ONEPLUS
-PUBLISH,VJOURNAL,DESCRIPTION,NONE,ONE
-PUBLISH,VJOURNAL,DTSTAMP,NONE,ONE
-PUBLISH,VJOURNAL,DTSTART,NONE,ONE
-PUBLISH,VJOURNAL,ORGANIZER,NONE,ONE
-PUBLISH,VJOURNAL,UID,NONE,ONE
-PUBLISH,VJOURNAL,ATTACH,NONE,ZEROPLUS
-PUBLISH,VJOURNAL,CATEGORIES,NONE,ZEROPLUS #Non-standard
-PUBLISH,VJOURNAL,CLASS,NONE,ZEROORONE
-PUBLISH,VJOURNAL,COMMENT,NONE,ZEROORONE
-PUBLISH,VJOURNAL,CONTACT,NONE,ZEROPLUS
-PUBLISH,VJOURNAL,CREATED,NONE,ZEROORONE
-PUBLISH,VJOURNAL,EXDATE,NONE,ZEROPLUS
-PUBLISH,VJOURNAL,EXRULE,NONE,ZEROPLUS
-PUBLISH,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
-PUBLISH,VJOURNAL,RDATE,NONE,ZEROPLUS
-PUBLISH,VJOURNAL,RECURRENCEID,NONE,ZEROORONE
-PUBLISH,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
-PUBLISH,VJOURNAL,RRULE,NONE,ZEROPLUS
-PUBLISH,VJOURNAL,SEQUENCE,NONE,ZEROORONE
-PUBLISH,VJOURNAL,STATUS,NONE,ZEROORONE
-PUBLISH,VJOURNAL,SUMMARY,NONE,ZEROORONE
-PUBLISH,VJOURNAL,URL,NONE,ZEROORONE
-PUBLISH,VJOURNAL,X,NONE,ZEROPLUS
-PUBLISH,VJOURNAL,ATTENDEE,NONE,ZERO
-PUBLISH,VJOURNAL,NONE,VALARM,ZEROPLUS
-PUBLISH,VJOURNAL,NONE,VTIMEZONE,ZEROPLUS
-PUBLISH,VJOURNAL,NONE,X,ZEROPLUS
-PUBLISH,VJOURNAL,NONE,VEVENT,ZERO
-PUBLISH,VJOURNAL,NONE,VFREEBUSY,ZERO
-PUBLISH,VJOURNAL,NONE,VTODO,ZERO
-ADD,VJOURNAL,NONE,NONE,ONE
-ADD,VJOURNAL,DESCRIPTION,NONE,ONE
-ADD,VJOURNAL,DTSTAMP,NONE,ONE
-ADD,VJOURNAL,DTSTART,NONE,ONE
-ADD,VJOURNAL,ORGANIZER,NONE,ONE
-ADD,VJOURNAL,SEQUENCE,NONE,ONE
-ADD,VJOURNAL,UID,NONE,ONE
-ADD,VJOURNAL,ATTACH,NONE,ZEROPLUS
-ADD,VJOURNAL,CATEGORIES,NONE,ZEROPLUS #Non-standard
-ADD,VJOURNAL,CLASS,NONE,ZEROORONE
-ADD,VJOURNAL,COMMENT,NONE,ZEROORONE
-ADD,VJOURNAL,CONTACT,NONE,ZEROPLUS
-ADD,VJOURNAL,CREATED,NONE,ZEROORONE
-ADD,VJOURNAL,EXDATE,NONE,ZEROPLUS
-ADD,VJOURNAL,EXRULE,NONE,ZEROPLUS
-ADD,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
-ADD,VJOURNAL,RDATE,NONE,ZEROPLUS
-ADD,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
-ADD,VJOURNAL,RRULE,NONE,ZEROPLUS
-ADD,VJOURNAL,STATUS,NONE,ZEROORONE
-ADD,VJOURNAL,SUMMARY,NONE,ZEROORONE
-ADD,VJOURNAL,URL,NONE,ZEROORONE
-ADD,VJOURNAL,X,NONE,ZEROPLUS
-ADD,VJOURNAL,ATTENDEE,NONE,ZERO
-ADD,VJOURNAL,RECURRENCEID,NONE,ZERO
-ADD,VJOURNAL,NONE,VALARM,ZEROPLUS
-ADD,VJOURNAL,NONE,VTIMEZONE,ZEROORONE
-ADD,VJOURNAL,NONE,X,ZEROPLUS
-ADD,VJOURNAL,NONE,VEVENT,ZERO
-ADD,VJOURNAL,NONE,VFREEBUSY,ZERO
-ADD,VJOURNAL,NONE,VTODO,ZERO
-CANCEL,VJOURNAL,NONE,NONE,ONEPLUS
-CANCEL,VJOURNAL,DTSTAMP,NONE,ONE
-CANCEL,VJOURNAL,ORGANIZER,NONE,ONE
-CANCEL,VJOURNAL,SEQUENCE,NONE,ONE
-CANCEL,VJOURNAL,UID,NONE,ONE
-CANCEL,VJOURNAL,ATTACH,NONE,ZEROPLUS
-CANCEL,VJOURNAL,ATTENDEE,NONE,ZEROPLUS
-CANCEL,VJOURNAL,CATEGORIES,NONE,ZEROPLUS #Non-standard
-CANCEL,VJOURNAL,CLASS,NONE,ZEROORONE
-CANCEL,VJOURNAL,COMMENT,NONE,ZEROORONE
-CANCEL,VJOURNAL,CONTACT,NONE,ZEROPLUS
-CANCEL,VJOURNAL,CREATED,NONE,ZEROORONE
-CANCEL,VJOURNAL,DESCRIPTION,NONE,ZEROORONE
-CANCEL,VJOURNAL,DTSTART,NONE,ZEROORONE
-CANCEL,VJOURNAL,EXDATE,NONE,ZEROPLUS
-CANCEL,VJOURNAL,EXRULE,NONE,ZEROPLUS
-CANCEL,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
-CANCEL,VJOURNAL,RDATE,NONE,ZEROPLUS
-CANCEL,VJOURNAL,RECURRENCEID,NONE,ZEROORONE
-CANCEL,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
-CANCEL,VJOURNAL,RRULE,NONE,ZEROPLUS
-CANCEL,VJOURNAL,STATUS,NONE,ZEROORONE
-CANCEL,VJOURNAL,SUMMARY,NONE,ZEROORONE
-CANCEL,VJOURNAL,URL,NONE,ZEROORONE
-CANCEL,VJOURNAL,X,NONE,ZEROPLUS
-CANCEL,VJOURNAL,REQUESTSTATUS,NONE,ZERO
-CANCEL,VJOURNAL,NONE,VTIMEZONE,ZEROPLUS
-CANCEL,VJOURNAL,NONE,X,ZEROPLUS
-CANCEL,VJOURNAL,NONE,VALARM,ZERO
-CANCEL,VJOURNAL,NONE,VEVENT,ZERO
-CANCEL,VJOURNAL,NONE,VFREEBUSY,ZERO
-CANCEL,VJOURNAL,NONE,VTODO,ZERO
-NONE,VCALENDAR,ACTION,NONE,ZERO
-NONE,VCALENDAR,ATTACH,NONE,ZERO
-NONE,VCALENDAR,ATTENDEE,NONE,ZERO
-NONE,VCALENDAR,CALSCALE,NONE,ZEROORONE
-NONE,VCALENDAR,CATEGORIES,NONE,ZERO
-NONE,VCALENDAR,CLASS,NONE,ZERO
-NONE,VCALENDAR,COMMENT,NONE,ZERO
-NONE,VCALENDAR,COMPLETED,NONE,ZERO
-NONE,VCALENDAR,CONTACT,NONE,ZERO
-NONE,VCALENDAR,CREATED,NONE,ZERO
-NONE,VCALENDAR,DESCRIPTION,NONE,ZERO
-NONE,VCALENDAR,DTEND,NONE,ZERO
-NONE,VCALENDAR,DTSTAMP,NONE,ZERO
-NONE,VCALENDAR,DTSTART,NONE,ZERO
-NONE,VCALENDAR,DUE,NONE,ZERO
-NONE,VCALENDAR,DURATION,NONE,ZERO
-NONE,VCALENDAR,EXDATE,NONE,ZERO
-NONE,VCALENDAR,EXRULE,NONE,ZERO
-NONE,VCALENDAR,FREEBUSY,NONE,ZERO
-NONE,VCALENDAR,GEO,NONE,ZERO
-NONE,VCALENDAR,LASTMODIFIED,NONE,ZERO
-NONE,VCALENDAR,LOCATION,NONE,ZERO
-NONE,VCALENDAR,METHOD,NONE,ZEROORONE
-NONE,VCALENDAR,ORGANIZER,NONE,ZERO
-NONE,VCALENDAR,PERCENTCOMPLETE,NONE,ZERO
-NONE,VCALENDAR,PRIORITY,NONE,ZERO
-NONE,VCALENDAR,PRODID,NONE,ONE
-NONE,VCALENDAR,RDATE,NONE,ZERO
-NONE,VCALENDAR,RECURRENCEID,NONE,ZERO
-NONE,VCALENDAR,RELATEDTO,NONE,ZERO
-NONE,VCALENDAR,REPEAT,NONE,ZERO
-NONE,VCALENDAR,REQUESTSTATUS,NONE,ZERO
-NONE,VCALENDAR,RESOURCES,NONE,ZERO
-NONE,VCALENDAR,RRULE,NONE,ZERO
-NONE,VCALENDAR,SEQUENCE,NONE,ZERO
-NONE,VCALENDAR,STATUS,NONE,ZERO
-NONE,VCALENDAR,SUMMARY,NONE,ZERO
-NONE,VCALENDAR,TRANSP,NONE,ZERO
-NONE,VCALENDAR,TRIGGER,NONE,ZERO
-NONE,VCALENDAR,TZID,NONE,ZERO
-NONE,VCALENDAR,TZNAME,NONE,ZERO
-NONE,VCALENDAR,TZOFFSETFROM,NONE,ZERO
-NONE,VCALENDAR,TZOFFSETTO,NONE,ZERO
-NONE,VCALENDAR,TZURL,NONE,ZERO
-NONE,VCALENDAR,UID,NONE,ZERO
-NONE,VCALENDAR,URL,NONE,ZERO
-NONE,VCALENDAR,VERSION,NONE,ONE
-NONE,VCALENDAR,X,NONE,ZEROPLUS
-NONE,VEVENT,ACTION,NONE,ZERO
-NONE,VEVENT,ATTACH,NONE,ZEROPLUS
-NONE,VEVENT,ATTENDEE,NONE,ZEROPLUS
-NONE,VEVENT,CALSCALE,NONE,ZERO
-NONE,VEVENT,CATEGORIES,NONE,ZEROPLUS
-NONE,VEVENT,CLASS,NONE,ZEROORONE
-NONE,VEVENT,COMMENT,NONE,ZEROPLUS
-NONE,VEVENT,COMPLETED,NONE,ZERO
-NONE,VEVENT,CONTACT,NONE,ZEROPLUS
-NONE,VEVENT,CREATED,NONE,ZEROORONE
-NONE,VEVENT,DESCRIPTION,NONE,ZEROORONE
-NONE,VEVENT,DTEND,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
-NONE,VEVENT,DTSTAMP,NONE,ZEROORONE
-NONE,VEVENT,DTSTART,NONE,ZEROORONE
-NONE,VEVENT,DUE,NONE,ZERO
-NONE,VEVENT,DURATION,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
-NONE,VEVENT,EXDATE,NONE,ZEROPLUS
-NONE,VEVENT,EXRULE,NONE,ZEROPLUS
-NONE,VEVENT,FREEBUSY,NONE,ZERO
-NONE,VEVENT,GEO,NONE,ZEROORONE
-NONE,VEVENT,LASTMODIFIED,NONE,ZEROORONE
-NONE,VEVENT,LOCATION,NONE,ZEROORONE
-NONE,VEVENT,METHOD,NONE,ZERO
-NONE,VEVENT,ORGANIZER,NONE,ZEROORONE
-NONE,VEVENT,PERCENTCOMPLETE,NONE,ZERO
-NONE,VEVENT,PRIORITY,NONE,ZEROORONE
-NONE,VEVENT,PRODID,NONE,ZERO
-NONE,VEVENT,RDATE,NONE,ZEROPLUS
-NONE,VEVENT,RECURRENCEID,NONE,ZEROORONE
-NONE,VEVENT,RELATEDTO,NONE,ZEROPLUS
-NONE,VEVENT,REPEAT,NONE,ZERO
-NONE,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
-NONE,VEVENT,RESOURCES,NONE,ZEROPLUS
-NONE,VEVENT,RRULE,NONE,ZEROPLUS
-NONE,VEVENT,SEQUENCE,NONE,ZEROORONE
-NONE,VEVENT,STATUS,NONE,ZEROORONE
-NONE,VEVENT,SUMMARY,NONE,ZEROORONE
-NONE,VEVENT,TRANSP,NONE,ZEROORONE
-NONE,VEVENT,TRIGGER,NONE,ZERO
-NONE,VEVENT,TZID,NONE,ZERO
-NONE,VEVENT,TZNAME,NONE,ZERO
-NONE,VEVENT,TZOFFSETFROM,NONE,ZERO
-NONE,VEVENT,TZOFFSETTO,NONE,ZERO
-NONE,VEVENT,TZURL,NONE,ZERO
-NONE,VEVENT,UID,NONE,ZEROORONE
-NONE,VEVENT,URL,NONE,ZEROORONE
-NONE,VEVENT,VERSION,NONE,ZERO
-NONE,VEVENT,X,NONE,ZEROPLUS
-NONE,VTODO,ACTION,NONE,ZERO
-NONE,VTODO,ATTACH,NONE,ZEROPLUS
-NONE,VTODO,ATTENDEE,NONE,ZEROPLUS
-NONE,VTODO,CALSCALE,NONE,ZERO
-NONE,VTODO,CATEGORIES,NONE,ZEROPLUS
-NONE,VTODO,CLASS,NONE,ZEROORONE
-NONE,VTODO,COMMENT,NONE,ZEROPLUS
-NONE,VTODO,COMPLETED,NONE,ZEROORONE
-NONE,VTODO,CONTACT,NONE,ZEROPLUS
-NONE,VTODO,CREATED,NONE,ZEROORONE
-NONE,VTODO,DESCRIPTION,NONE,ZEROORONE
-NONE,VTODO,DTEND,NONE,ZERO
-NONE,VTODO,DTSTAMP,NONE,ZEROORONE
-NONE,VTODO,DTSTART,NONE,ZEROORONE
-NONE,VTODO,DUE,NONE,ONEEXCLUSIVE
-NONE,VTODO,DURATION,NONE,ONEEXCLUSIVE
-NONE,VTODO,EXDATE,NONE,ZEROPLUS
-NONE,VTODO,EXRULE,NONE,ZEROPLUS
-NONE,VTODO,FREEBUSY,NONE,ZERO
-NONE,VTODO,GEO,NONE,ZEROORONE
-NONE,VTODO,LASTMODIFIED,NONE,ZEROORONE
-NONE,VTODO,LOCATION,NONE,ZEROORONE
-NONE,VTODO,METHOD,NONE,ZERO
-NONE,VTODO,ORGANIZER,NONE,ZEROORONE
-NONE,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
-NONE,VTODO,PRIORITY,NONE,ZEROORONE
-NONE,VTODO,PRODID,NONE,ZERO
-NONE,VTODO,RDATE,NONE,ZEROPLUS
-NONE,VTODO,RECURRENCEID,NONE,ZEROORONE
-NONE,VTODO,RELATEDTO,NONE,ZEROPLUS
-NONE,VTODO,REPEAT,NONE,ZERO
-NONE,VTODO,REQUESTSTATUS,NONE,ZEROPLUS
-NONE,VTODO,RESOURCES,NONE,ZEROPLUS
-NONE,VTODO,RRULE,NONE,ZEROPLUS
-NONE,VTODO,SEQUENCE,NONE,ZEROORONE
-NONE,VTODO,STATUS,NONE,ZEROORONE
-NONE,VTODO,SUMMARY,NONE,ZEROORONE
-NONE,VTODO,TRANSP,NONE,ZERO
-NONE,VTODO,TRIGGER,NONE,ZERO
-NONE,VTODO,TZID,NONE,ZERO
-NONE,VTODO,TZNAME,NONE,ZERO
-NONE,VTODO,TZOFFSETFROM,NONE,ZERO
-NONE,VTODO,TZOFFSETTO,NONE,ZERO
-NONE,VTODO,TZURL,NONE,ZERO
-NONE,VTODO,UID,NONE,ZEROORONE
-NONE,VTODO,URL,NONE,ZEROORONE
-NONE,VTODO,VERSION,NONE,ZERO
-NONE,VTODO,X,NONE,ZEROPLUS
-NONE,VJOURNAL,ACTION,NONE,ZERO
-NONE,VJOURNAL,ATTACH,NONE,ZEROPLUS
-NONE,VJOURNAL,ATTENDEE,NONE,ZEROPLUS
-NONE,VJOURNAL,CALSCALE,NONE,ZERO
-NONE,VJOURNAL,CATEGORIES,NONE,ZEROPLUS
-NONE,VJOURNAL,CLASS,NONE,ZEROORONE
-NONE,VJOURNAL,COMMENT,NONE,ZEROPLUS
-NONE,VJOURNAL,COMPLETED,NONE,ZERO
-NONE,VJOURNAL,CONTACT,NONE,ZEROPLUS
-NONE,VJOURNAL,CREATED,NONE,ZEROORONE
-NONE,VJOURNAL,DESCRIPTION,NONE,ZEROORONE
-NONE,VJOURNAL,DTEND,NONE,ZERO
-NONE,VJOURNAL,DTSTAMP,NONE,ZEROORONE
-NONE,VJOURNAL,DTSTART,NONE,ZEROORONE
-NONE,VJOURNAL,DUE,NONE,ONEEXCLUSIVE
-NONE,VJOURNAL,DURATION,NONE,ONEEXCLUSIVE
-NONE,VJOURNAL,EXDATE,NONE,ZEROPLUS
-NONE,VJOURNAL,EXRULE,NONE,ZEROPLUS
-NONE,VJOURNAL,FREEBUSY,NONE,ZERO
-NONE,VJOURNAL,GEO,NONE,ZERO
-NONE,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
-NONE,VJOURNAL,LOCATION,NONE,ZERO
-NONE,VJOURNAL,METHOD,NONE,ZERO
-NONE,VJOURNAL,ORGANIZER,NONE,ZEROORONE
-NONE,VJOURNAL,PERCENTCOMPLETE,NONE,ZERO
-NONE,VJOURNAL,PRIORITY,NONE,ZERO
-NONE,VJOURNAL,PRODID,NONE,ZERO
-NONE,VJOURNAL,RDATE,NONE,ZEROPLUS
-NONE,VJOURNAL,RECURRENCEID,NONE,ZEROORONE
-NONE,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
-NONE,VJOURNAL,REPEAT,NONE,ZERO
-NONE,VJOURNAL,REQUESTSTATUS,NONE,ZEROPLUS
-NONE,VJOURNAL,RESOURCES,NONE,ZERO
-NONE,VJOURNAL,RRULE,NONE,ZEROPLUS
-NONE,VJOURNAL,SEQUENCE,NONE,ZEROORONE
-NONE,VJOURNAL,STATUS,NONE,ZEROORONE
-NONE,VJOURNAL,SUMMARY,NONE,ZEROORONE
-NONE,VJOURNAL,TRANSP,NONE,ZERO
-NONE,VJOURNAL,TRIGGER,NONE,ZERO
-NONE,VJOURNAL,TZID,NONE,ZERO
-NONE,VJOURNAL,TZNAME,NONE,ZERO
-NONE,VJOURNAL,TZOFFSETFROM,NONE,ZERO
-NONE,VJOURNAL,TZOFFSETTO,NONE,ZERO
-NONE,VJOURNAL,TZURL,NONE,ZERO
-NONE,VJOURNAL,UID,NONE,ZEROORONE
-NONE,VJOURNAL,URL,NONE,ZEROORONE
-NONE,VJOURNAL,VERSION,NONE,ZERO
-NONE,VJOURNAL,X,NONE,ZEROPLUS
-NONE,VFREEBUSY,ACTION,NONE,ZERO
-NONE,VFREEBUSY,ATTACH,NONE,ZERO
-NONE,VFREEBUSY,ATTENDEE,NONE,ZEROPLUS
-NONE,VFREEBUSY,CALSCALE,NONE,ZERO
-NONE,VFREEBUSY,CATEGORIES,NONE,ZERO
-NONE,VFREEBUSY,CLASS,NONE,ZERO
-NONE,VFREEBUSY,COMMENT,NONE,ZEROPLUS
-NONE,VFREEBUSY,COMPLETED,NONE,ZERO
-NONE,VFREEBUSY,CONTACT,NONE,ZEROORONE
-NONE,VFREEBUSY,CREATED,NONE,ZERO
-NONE,VFREEBUSY,DESCRIPTION,NONE,ZERO
-NONE,VFREEBUSY,DTEND,NONE,ZEROORONE
-NONE,VFREEBUSY,DTSTAMP,NONE,ZERO
-NONE,VFREEBUSY,DTSTART,NONE,ZEROORONE
-NONE,VFREEBUSY,DUE,NONE,ZERO
-NONE,VFREEBUSY,DURATION,NONE,ZEROORONE
-NONE,VFREEBUSY,EXDATE,NONE,ZERO
-NONE,VFREEBUSY,EXRULE,NONE,ZERO
-NONE,VFREEBUSY,FREEBUSY,NONE,ZEROPLUS
-NONE,VFREEBUSY,GEO,NONE,ZERO
-NONE,VFREEBUSY,LASTMODIFIED,NONE,ZERO
-NONE,VFREEBUSY,LOCATION,NONE,ZERO
-NONE,VFREEBUSY,METHOD,NONE,ZERO
-NONE,VFREEBUSY,ORGANIZER,NONE,ZEROORONE
-NONE,VFREEBUSY,PERCENTCOMPLETE,NONE,ZERO
-NONE,VFREEBUSY,PRIORITY,NONE,ZERO
-NONE,VFREEBUSY,PRODID,NONE,ZERO
-NONE,VFREEBUSY,RDATE,NONE,ZERO
-NONE,VFREEBUSY,RECURRENCEID,NONE,ZERO
-NONE,VFREEBUSY,RELATEDTO,NONE,ZERO
-NONE,VFREEBUSY,REPEAT,NONE,ZERO
-NONE,VFREEBUSY,REQUESTSTATUS,NONE,ZEROPLUS
-NONE,VFREEBUSY,RESOURCES,NONE,ZERO
-NONE,VFREEBUSY,RRULE,NONE,ZERO
-NONE,VFREEBUSY,SEQUENCE,NONE,ZERO
-NONE,VFREEBUSY,STATUS,NONE,ZERO
-NONE,VFREEBUSY,SUMMARY,NONE,ZERO
-NONE,VFREEBUSY,TRANSP,NONE,ZERO
-NONE,VFREEBUSY,TRIGGER,NONE,ZERO
-NONE,VFREEBUSY,TZID,NONE,ZERO
-NONE,VFREEBUSY,TZNAME,NONE,ZERO
-NONE,VFREEBUSY,TZOFFSETFROM,NONE,ZERO
-NONE,VFREEBUSY,TZOFFSETTO,NONE,ZERO
-NONE,VFREEBUSY,TZURL,NONE,ZERO
-NONE,VFREEBUSY,UID,NONE,ZEROORONE
-NONE,VFREEBUSY,URL,NONE,ZEROORONE
-NONE,VFREEBUSY,VERSION,NONE,ZERO
-NONE,VFREEBUSY,X,NONE,ZEROPLUS
-NONE,VTIMEZONE,ACTION,NONE,ZERO
-NONE,VTIMEZONE,ATTACH,NONE,ZERO
-NONE,VTIMEZONE,ATTENDEE,NONE,ZERO
-NONE,VTIMEZONE,CALSCALE,NONE,ZERO
-NONE,VTIMEZONE,CATEGORIES,NONE,ZERO
-NONE,VTIMEZONE,CLASS,NONE,ZERO
-NONE,VTIMEZONE,COMMENT,NONE,ZERO
-NONE,VTIMEZONE,COMPLETED,NONE,ZERO
-NONE,VTIMEZONE,CONTACT,NONE,ZERO
-NONE,VTIMEZONE,CREATED,NONE,ZERO
-NONE,VTIMEZONE,DESCRIPTION,NONE,ZERO
-NONE,VTIMEZONE,DTEND,NONE,ZERO
-NONE,VTIMEZONE,DTSTAMP,NONE,ZERO
-NONE,VTIMEZONE,DTSTART,NONE,ZERO
-NONE,VTIMEZONE,DUE,NONE,ZERO
-NONE,VTIMEZONE,DURATION,NONE,ZERO
-NONE,VTIMEZONE,EXDATE,NONE,ZERO
-NONE,VTIMEZONE,EXRULE,NONE,ZERO
-NONE,VTIMEZONE,FREEBUSY,NONE,ZERO
-NONE,VTIMEZONE,GEO,NONE,ZERO
-NONE,VTIMEZONE,LASTMODIFIED,NONE,ZEROORONE
-NONE,VTIMEZONE,LOCATION,NONE,ZERO
-NONE,VTIMEZONE,METHOD,NONE,ZERO
-NONE,VTIMEZONE,ORGANIZER,NONE,ZERO
-NONE,VTIMEZONE,PERCENTCOMPLETE,NONE,ZERO
-NONE,VTIMEZONE,PRIORITY,NONE,ZERO
-NONE,VTIMEZONE,PRODID,NONE,ZERO
-NONE,VTIMEZONE,RDATE,NONE,ZERO
-NONE,VTIMEZONE,RECURRENCEID,NONE,ZERO
-NONE,VTIMEZONE,RELATEDTO,NONE,ZERO
-NONE,VTIMEZONE,REPEAT,NONE,ZERO
-NONE,VTIMEZONE,REQUESTSTATUS,NONE,ZERO
-NONE,VTIMEZONE,RESOURCES,NONE,ZERO
-NONE,VTIMEZONE,RRULE,NONE,ZERO
-NONE,VTIMEZONE,SEQUENCE,NONE,ZERO
-NONE,VTIMEZONE,STATUS,NONE,ZERO
-NONE,VTIMEZONE,SUMMARY,NONE,ZERO
-NONE,VTIMEZONE,TRANSP,NONE,ZERO
-NONE,VTIMEZONE,TRIGGER,NONE,ZERO
-NONE,VTIMEZONE,TZID,NONE,ONE
-NONE,VTIMEZONE,TZNAME,NONE,ZERO
-NONE,VTIMEZONE,TZOFFSETFROM,NONE,ZERO
-NONE,VTIMEZONE,TZOFFSETTO,NONE,ZERO
-NONE,VTIMEZONE,TZURL,NONE,ZEROPLUS
-NONE,VTIMEZONE,UID,NONE,ZERO
-NONE,VTIMEZONE,URL,NONE,ZERO
-NONE,VTIMEZONE,VERSION,NONE,ZERO
-NONE,VTIMEZONE,X,NONE,ZEROORONE
-NONE,XSTANDARD,ACTION,NONE,ZERO
-NONE,XSTANDARD,ATTACH,NONE,ZERO
-NONE,XSTANDARD,ATTENDEE,NONE,ZERO
-NONE,XSTANDARD,CALSCALE,NONE,ZERO
-NONE,XSTANDARD,CATEGORIES,NONE,ZERO
-NONE,XSTANDARD,CLASS,NONE,ZERO
-NONE,XSTANDARD,COMMENT,NONE,ZEROPLUS
-NONE,XSTANDARD,COMPLETED,NONE,ZERO
-NONE,XSTANDARD,CONTACT,NONE,ZERO
-NONE,XSTANDARD,CREATED,NONE,ZERO
-NONE,XSTANDARD,DESCRIPTION,NONE,ZERO
-NONE,XSTANDARD,DTEND,NONE,ZERO
-NONE,XSTANDARD,DTSTAMP,NONE,ZERO
-NONE,XSTANDARD,DTSTART,NONE,ONE
-NONE,XSTANDARD,DUE,NONE,ZERO
-NONE,XSTANDARD,DURATION,NONE,ZERO
-NONE,XSTANDARD,EXDATE,NONE,ZERO
-NONE,XSTANDARD,EXRULE,NONE,ZERO
-NONE,XSTANDARD,FREEBUSY,NONE,ZERO
-NONE,XSTANDARD,GEO,NONE,ZERO
-NONE,XSTANDARD,LASTMODIFIED,NONE,ZERO
-NONE,XSTANDARD,LOCATION,NONE,ZERO
-NONE,XSTANDARD,METHOD,NONE,ZERO
-NONE,XSTANDARD,ORGANIZER,NONE,ZERO
-NONE,XSTANDARD,PERCENTCOMPLETE,NONE,ZERO
-NONE,XSTANDARD,PRIORITY,NONE,ZERO
-NONE,XSTANDARD,PRODID,NONE,ZERO
-NONE,XSTANDARD,RDATE,NONE,ZEROPLUS
-NONE,XSTANDARD,RECURRENCEID,NONE,ZERO
-NONE,XSTANDARD,RELATEDTO,NONE,ZERO
-NONE,XSTANDARD,REPEAT,NONE,ZERO
-NONE,XSTANDARD,REQUESTSTATUS,NONE,ZERO
-NONE,XSTANDARD,RESOURCES,NONE,ZERO
-NONE,XSTANDARD,RRULE,NONE,ZEROPLUS
-NONE,XSTANDARD,SEQUENCE,NONE,ZERO
-NONE,XSTANDARD,STATUS,NONE,ZERO
-NONE,XSTANDARD,SUMMARY,NONE,ZERO
-NONE,XSTANDARD,TRANSP,NONE,ZERO
-NONE,XSTANDARD,TRIGGER,NONE,ZERO
-NONE,XSTANDARD,TZID,NONE,ZERO
-NONE,XSTANDARD,TZNAME,NONE,ZEROPLUS
-NONE,XSTANDARD,TZOFFSETFROM,NONE,ONE
-NONE,XSTANDARD,TZOFFSETTO,NONE,ONE
-NONE,XSTANDARD,TZURL,NONE,ZERO
-NONE,XSTANDARD,UID,NONE,ZERO
-NONE,XSTANDARD,URL,NONE,ZERO
-NONE,XSTANDARD,VERSION,NONE,ZERO
-NONE,XSTANDARD,X,NONE,ZEROPLUS
-NONE,XDAYLIGHT,ACTION,NONE,ZERO
-NONE,XDAYLIGHT,ATTACH,NONE,ZERO
-NONE,XDAYLIGHT,ATTENDEE,NONE,ZERO
-NONE,XDAYLIGHT,CALSCALE,NONE,ZERO
-NONE,XDAYLIGHT,CATEGORIES,NONE,ZERO
-NONE,XDAYLIGHT,CLASS,NONE,ZERO
-NONE,XDAYLIGHT,COMMENT,NONE,ZEROPLUS
-NONE,XDAYLIGHT,COMPLETED,NONE,ZERO
-NONE,XDAYLIGHT,CONTACT,NONE,ZERO
-NONE,XDAYLIGHT,CREATED,NONE,ZERO
-NONE,XDAYLIGHT,DESCRIPTION,NONE,ZERO
-NONE,XDAYLIGHT,DTEND,NONE,ZERO
-NONE,XDAYLIGHT,DTSTAMP,NONE,ZERO
-NONE,XDAYLIGHT,DTSTART,NONE,ONE
-NONE,XDAYLIGHT,DUE,NONE,ZERO
-NONE,XDAYLIGHT,DURATION,NONE,ZERO
-NONE,XDAYLIGHT,EXDATE,NONE,ZERO
-NONE,XDAYLIGHT,EXRULE,NONE,ZERO
-NONE,XDAYLIGHT,FREEBUSY,NONE,ZERO
-NONE,XDAYLIGHT,GEO,NONE,ZERO
-NONE,XDAYLIGHT,LASTMODIFIED,NONE,ZERO
-NONE,XDAYLIGHT,LOCATION,NONE,ZERO
-NONE,XDAYLIGHT,METHOD,NONE,ZERO
-NONE,XDAYLIGHT,ORGANIZER,NONE,ZERO
-NONE,XDAYLIGHT,PERCENTCOMPLETE,NONE,ZERO
-NONE,XDAYLIGHT,PRIORITY,NONE,ZERO
-NONE,XDAYLIGHT,PRODID,NONE,ZERO
-NONE,XDAYLIGHT,RDATE,NONE,ZEROPLUS
-NONE,XDAYLIGHT,RECURRENCEID,NONE,ZERO
-NONE,XDAYLIGHT,RELATEDTO,NONE,ZERO
-NONE,XDAYLIGHT,REPEAT,NONE,ZERO
-NONE,XDAYLIGHT,REQUESTSTATUS,NONE,ZERO
-NONE,XDAYLIGHT,RESOURCES,NONE,ZERO
-NONE,XDAYLIGHT,RRULE,NONE,ZEROPLUS
-NONE,XDAYLIGHT,SEQUENCE,NONE,ZERO
-NONE,XDAYLIGHT,STATUS,NONE,ZERO
-NONE,XDAYLIGHT,SUMMARY,NONE,ZERO
-NONE,XDAYLIGHT,TRANSP,NONE,ZERO
-NONE,XDAYLIGHT,TRIGGER,NONE,ZERO
-NONE,XDAYLIGHT,TZID,NONE,ZERO
-NONE,XDAYLIGHT,TZNAME,NONE,ZEROPLUS
-NONE,XDAYLIGHT,TZOFFSETFROM,NONE,ONE
-NONE,XDAYLIGHT,TZOFFSETTO,NONE,ONE
-NONE,XDAYLIGHT,TZURL,NONE,ZERO
-NONE,XDAYLIGHT,UID,NONE,ZERO
-NONE,XDAYLIGHT,URL,NONE,ZERO
-NONE,XDAYLIGHT,VERSION,NONE,ZERO
-NONE,XDAYLIGHT,X,NONE,ZEROPLUS
-NONE,XAUDIOALARM,ACTION,NONE,ONE
-NONE,XAUDIOALARM,ATTACH,NONE,ZEROORONE
-NONE,XAUDIOALARM,ATTENDEE,NONE,ZERO
-NONE,XAUDIOALARM,CALSCALE,NONE,ZERO
-NONE,XAUDIOALARM,CATEGORIES,NONE,ZERO
-NONE,XAUDIOALARM,CLASS,NONE,ZERO
-NONE,XAUDIOALARM,COMMENT,NONE,ZERO
-NONE,XAUDIOALARM,COMPLETED,NONE,ZERO
-NONE,XAUDIOALARM,CONTACT,NONE,ZERO
-NONE,XAUDIOALARM,CREATED,NONE,ZERO
-NONE,XAUDIOALARM,DESCRIPTION,NONE,ZERO
-NONE,XAUDIOALARM,DTEND,NONE,ZERO
-NONE,XAUDIOALARM,DTSTAMP,NONE,ZERO
-NONE,XAUDIOALARM,DTSTART,NONE,ZERO
-NONE,XAUDIOALARM,DUE,NONE,ZERO
-NONE,XAUDIOALARM,DURATION,NONE,ONEMUTUAL,icalrestriction_check_mutual
-NONE,XAUDIOALARM,REPEAT,NONE,ONEMUTUAL,icalrestriction_check_mutual
-NONE,XAUDIOALARM,EXDATE,NONE,ZERO
-NONE,XAUDIOALARM,EXRULE,NONE,ZERO
-NONE,XAUDIOALARM,FREEBUSY,NONE,ZERO
-NONE,XAUDIOALARM,GEO,NONE,ZERO
-NONE,XAUDIOALARM,LASTMODIFIED,NONE,ZERO
-NONE,XAUDIOALARM,LOCATION,NONE,ZERO
-NONE,XAUDIOALARM,METHOD,NONE,ZERO
-NONE,XAUDIOALARM,ORGANIZER,NONE,ZERO
-NONE,XAUDIOALARM,PERCENTCOMPLETE,NONE,ZERO
-NONE,XAUDIOALARM,PRIORITY,NONE,ZERO
-NONE,XAUDIOALARM,PRODID,NONE,ZERO
-NONE,XAUDIOALARM,RDATE,NONE,ZERO
-NONE,XAUDIOALARM,RECURRENCEID,NONE,ZERO
-NONE,XAUDIOALARM,RELATEDTO,NONE,ZERO
-NONE,XAUDIOALARM,REQUESTSTATUS,NONE,ZERO
-NONE,XAUDIOALARM,RESOURCES,NONE,ZERO
-NONE,XAUDIOALARM,RRULE,NONE,ZERO
-NONE,XAUDIOALARM,SEQUENCE,NONE,ZERO
-NONE,XAUDIOALARM,STATUS,NONE,ZERO
-NONE,XAUDIOALARM,SUMMARY,NONE,ZERO
-NONE,XAUDIOALARM,TRANSP,NONE,ZERO
-NONE,XAUDIOALARM,TRIGGER,NONE,ONE
-NONE,XAUDIOALARM,TZID,NONE,ZERO
-NONE,XAUDIOALARM,TZNAME,NONE,ZERO
-NONE,XAUDIOALARM,TZOFFSETFROM,NONE,ZERO
-NONE,XAUDIOALARM,TZOFFSETTO,NONE,ZERO
-NONE,XAUDIOALARM,TZURL,NONE,ZERO
-NONE,XAUDIOALARM,UID,NONE,ZERO
-NONE,XAUDIOALARM,URL,NONE,ZERO
-NONE,XAUDIOALARM,VERSION,NONE,ZERO
-NONE,XAUDIOALARM,X,NONE,ZEROPLUS
-NONE,XDISPLAYALARM,ACTION,NONE,ONE
-NONE,XDISPLAYALARM,ATTACH,NONE,ZERO
-NONE,XDISPLAYALARM,ATTENDEE,NONE,ZERO
-NONE,XDISPLAYALARM,CALSCALE,NONE,ZERO
-NONE,XDISPLAYALARM,CATEGORIES,NONE,ZERO
-NONE,XDISPLAYALARM,CLASS,NONE,ZERO
-NONE,XDISPLAYALARM,COMMENT,NONE,ZERO
-NONE,XDISPLAYALARM,COMPLETED,NONE,ZERO
-NONE,XDISPLAYALARM,CONTACT,NONE,ZERO
-NONE,XDISPLAYALARM,CREATED,NONE,ZERO
-NONE,XDISPLAYALARM,DESCRIPTION,NONE,ONE
-NONE,XDISPLAYALARM,DTEND,NONE,ZERO
-NONE,XDISPLAYALARM,DTSTAMP,NONE,ZERO
-NONE,XDISPLAYALARM,DTSTART,NONE,ZERO
-NONE,XDISPLAYALARM,DUE,NONE,ZERO
-NONE,XDISPLAYALARM,DURATION,NONE,ONEMUTUAL,icalrestriction_check_mutual
-NONE,XDISPLAYALARM,REPEAT,NONE,ONEMUTUAL,icalrestriction_check_mutual
-NONE,XDISPLAYALARM,EXDATE,NONE,ZERO
-NONE,XDISPLAYALARM,EXRULE,NONE,ZERO
-NONE,XDISPLAYALARM,FREEBUSY,NONE,ZERO
-NONE,XDISPLAYALARM,GEO,NONE,ZERO
-NONE,XDISPLAYALARM,LASTMODIFIED,NONE,ZERO
-NONE,XDISPLAYALARM,LOCATION,NONE,ZERO
-NONE,XDISPLAYALARM,METHOD,NONE,ZERO
-NONE,XDISPLAYALARM,ORGANIZER,NONE,ZERO
-NONE,XDISPLAYALARM,PERCENTCOMPLETE,NONE,ZERO
-NONE,XDISPLAYALARM,PRIORITY,NONE,ZERO
-NONE,XDISPLAYALARM,PRODID,NONE,ZERO
-NONE,XDISPLAYALARM,RDATE,NONE,ZERO
-NONE,XDISPLAYALARM,RECURRENCEID,NONE,ZERO
-NONE,XDISPLAYALARM,RELATEDTO,NONE,ZERO
-NONE,XDISPLAYALARM,REQUESTSTATUS,NONE,ZERO
-NONE,XDISPLAYALARM,RESOURCES,NONE,ZERO
-NONE,XDISPLAYALARM,RRULE,NONE,ZERO
-NONE,XDISPLAYALARM,SEQUENCE,NONE,ZERO
-NONE,XDISPLAYALARM,STATUS,NONE,ZERO
-NONE,XDISPLAYALARM,SUMMARY,NONE,ZERO
-NONE,XDISPLAYALARM,TRANSP,NONE,ZERO
-NONE,XDISPLAYALARM,TRIGGER,NONE,ONE
-NONE,XDISPLAYALARM,TZID,NONE,ZERO
-NONE,XDISPLAYALARM,TZNAME,NONE,ZERO
-NONE,XDISPLAYALARM,TZOFFSETFROM,NONE,ZERO
-NONE,XDISPLAYALARM,TZOFFSETTO,NONE,ZERO
-NONE,XDISPLAYALARM,TZURL,NONE,ZERO
-NONE,XDISPLAYALARM,UID,NONE,ZERO
-NONE,XDISPLAYALARM,URL,NONE,ZERO
-NONE,XDISPLAYALARM,VERSION,NONE,ZERO
-NONE,XDISPLAYALARM,X,NONE,ZEROPLUS
-NONE,XEMAILALARM,ACTION,NONE,ONE
-NONE,XEMAILALARM,ATTACH,NONE,ZEROPLUS
-NONE,XEMAILALARM,ATTENDEE,NONE,ONEPLUS
-NONE,XEMAILALARM,CALSCALE,NONE,ZERO
-NONE,XEMAILALARM,CATEGORIES,NONE,ZERO
-NONE,XEMAILALARM,CLASS,NONE,ZERO
-NONE,XEMAILALARM,COMMENT,NONE,ZERO
-NONE,XEMAILALARM,COMPLETED,NONE,ZERO
-NONE,XEMAILALARM,CONTACT,NONE,ZERO
-NONE,XEMAILALARM,CREATED,NONE,ZERO
-NONE,XEMAILALARM,DESCRIPTION,NONE,ONE
-NONE,XEMAILALARM,DTEND,NONE,ZERO
-NONE,XEMAILALARM,DTSTAMP,NONE,ZERO
-NONE,XEMAILALARM,DTSTART,NONE,ZERO
-NONE,XEMAILALARM,DUE,NONE,ZERO
-NONE,XEMAILALARM,DURATION,NONE,ONEMUTUAL,icalrestriction_check_mutual
-NONE,XEMAILALARM,REPEAT,NONE,ONEMUTUAL,icalrestriction_check_mutual
-NONE,XEMAILALARM,EXDATE,NONE,ZERO
-NONE,XEMAILALARM,EXRULE,NONE,ZERO
-NONE,XEMAILALARM,FREEBUSY,NONE,ZERO
-NONE,XEMAILALARM,GEO,NONE,ZERO
-NONE,XEMAILALARM,LASTMODIFIED,NONE,ZERO
-NONE,XEMAILALARM,LOCATION,NONE,ZERO
-NONE,XEMAILALARM,METHOD,NONE,ZERO
-NONE,XEMAILALARM,ORGANIZER,NONE,ZERO
-NONE,XEMAILALARM,PERCENTCOMPLETE,NONE,ZERO
-NONE,XEMAILALARM,PRIORITY,NONE,ZERO
-NONE,XEMAILALARM,PRODID,NONE,ZERO
-NONE,XEMAILALARM,RDATE,NONE,ZERO
-NONE,XEMAILALARM,RECURRENCEID,NONE,ZERO
-NONE,XEMAILALARM,RELATEDTO,NONE,ZERO
-NONE,XEMAILALARM,REQUESTSTATUS,NONE,ZERO
-NONE,XEMAILALARM,RESOURCES,NONE,ZERO
-NONE,XEMAILALARM,RRULE,NONE,ZERO
-NONE,XEMAILALARM,SEQUENCE,NONE,ZERO
-NONE,XEMAILALARM,STATUS,NONE,ZERO
-NONE,XEMAILALARM,SUMMARY,NONE,ONE
-NONE,XEMAILALARM,TRANSP,NONE,ZERO
-NONE,XEMAILALARM,TRIGGER,NONE,ONE
-NONE,XEMAILALARM,TZID,NONE,ZERO
-NONE,XEMAILALARM,TZNAME,NONE,ZERO
-NONE,XEMAILALARM,TZOFFSETFROM,NONE,ZERO
-NONE,XEMAILALARM,TZOFFSETTO,NONE,ZERO
-NONE,XEMAILALARM,TZURL,NONE,ZERO
-NONE,XEMAILALARM,UID,NONE,ZERO
-NONE,XEMAILALARM,URL,NONE,ZERO
-NONE,XEMAILALARM,VERSION,NONE,ZERO
-NONE,XEMAILALARM,X,NONE,ZEROPLUS
-NONE,XPROCEDUREALARM,ACTION,NONE,ONE
-NONE,XPROCEDUREALARM,ATTACH,NONE,ZEROORONE
-NONE,XPROCEDUREALARM,ATTENDEE,NONE,ZERO
-NONE,XPROCEDUREALARM,CALSCALE,NONE,ZERO
-NONE,XPROCEDUREALARM,CATEGORIES,NONE,ZERO
-NONE,XPROCEDUREALARM,CLASS,NONE,ZERO
-NONE,XPROCEDUREALARM,COMMENT,NONE,ZERO
-NONE,XPROCEDUREALARM,COMPLETED,NONE,ZERO
-NONE,XPROCEDUREALARM,CONTACT,NONE,ZERO
-NONE,XPROCEDUREALARM,CREATED,NONE,ZERO
-NONE,XPROCEDUREALARM,DESCRIPTION,NONE,ZEROORONE
-NONE,XPROCEDUREALARM,DTEND,NONE,ZERO
-NONE,XPROCEDUREALARM,DTSTAMP,NONE,ZERO
-NONE,XPROCEDUREALARM,DTSTART,NONE,ZERO
-NONE,XPROCEDUREALARM,DUE,NONE,ZERO
-NONE,XPROCEDUREALARM,DURATION,NONE,ONEMUTUAL,icalrestriction_check_mutual
-NONE,XPROCEDUREALARM,REPEAT,NONE,ONEMUTUAL,icalrestriction_check_mutual
-NONE,XPROCEDUREALARM,EXDATE,NONE,ZERO
-NONE,XPROCEDUREALARM,EXRULE,NONE,ZERO
-NONE,XPROCEDUREALARM,FREEBUSY,NONE,ZERO
-NONE,XPROCEDUREALARM,GEO,NONE,ZERO
-NONE,XPROCEDUREALARM,LASTMODIFIED,NONE,ZERO
-NONE,XPROCEDUREALARM,LOCATION,NONE,ZERO
-NONE,XPROCEDUREALARM,METHOD,NONE,ZERO
-NONE,XPROCEDUREALARM,ORGANIZER,NONE,ZERO
-NONE,XPROCEDUREALARM,PERCENTCOMPLETE,NONE,ZERO
-NONE,XPROCEDUREALARM,PRIORITY,NONE,ZERO
-NONE,XPROCEDUREALARM,PRODID,NONE,ZERO
-NONE,XPROCEDUREALARM,RDATE,NONE,ZERO
-NONE,XPROCEDUREALARM,RECURRENCEID,NONE,ZERO
-NONE,XPROCEDUREALARM,RELATEDTO,NONE,ZERO
-NONE,XPROCEDUREALARM,REQUESTSTATUS,NONE,ZERO
-NONE,XPROCEDUREALARM,RESOURCES,NONE,ZERO
-NONE,XPROCEDUREALARM,RRULE,NONE,ZERO
-NONE,XPROCEDUREALARM,SEQUENCE,NONE,ZERO
-NONE,XPROCEDUREALARM,STATUS,NONE,ZERO
-NONE,XPROCEDUREALARM,SUMMARY,NONE,ZERO
-NONE,XPROCEDUREALARM,TRANSP,NONE,ZERO
-NONE,XPROCEDUREALARM,TRIGGER,NONE,ONE
-NONE,XPROCEDUREALARM,TZID,NONE,ZERO
-NONE,XPROCEDUREALARM,TZNAME,NONE,ZERO
-NONE,XPROCEDUREALARM,TZOFFSETFROM,NONE,ZERO
-NONE,XPROCEDUREALARM,TZOFFSETTO,NONE,ZERO
-NONE,XPROCEDUREALARM,TZURL,NONE,ZERO
-NONE,XPROCEDUREALARM,UID,NONE,ZERO
-NONE,XPROCEDUREALARM,URL,NONE,ZERO
-NONE,XPROCEDUREALARM,VERSION,NONE,ZERO
-NONE,XPROCEDUREALARM,X,NONE,ZEROPLUS
diff --git a/libical/design-data/status-new.txt b/libical/design-data/status-new.txt
deleted file mode 100644
index 9e7bbf83a7..0000000000
--- a/libical/design-data/status-new.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-2.0 STATOK Operation was successfully performed.
-2.0.1 STARTSENDATA Start ICAL input; end with <CRLF>.<CRLF>
-2.0.11 OKDATAFOLLOWS The request was processed successfully. Reply data follows on the next line and terminates with <CRLF>.<CRLF>
-2.0.2 REPLYPENDING A timeout has occurred. The server is still working on the reply. Use CONTINUE to continue waiting for the reply or ABORT to terminate the command.
-2.0.3 ABORTED The command currently underway was successsfully aborted.
-2.0.4 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway.
-2.0.5 TRUSTEDWILLQUEUE The request or reply will be queued and delivered to the target calendar when its iRIP server contacts this server and issues the SWITCH command.
-2.0.6 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway.
-2.0.7 QUEUED The message has been queued for delivery.
-2.0.8 QUEUEEMPTY There are no more queued messages.
-2.1 FALLBACK Success. Fallback taken on one or more property values.
-2.2 NOCOMMANDINPROGRESS An ABORT or CONTINUE was received when no command was in progress
-2.2 IGPROP Success. Invalid property ignored.
-2.3 IGPARAM Success. invalid property parameter ignored.
-2.4 IGXPROP Success. Unknown non-standard property ignored.
-2.5 IGXPARAM Success. Unknown non standard property value ignored.
-2.6 IGCOMP Success. Invalid calendar component ignored.
-2.7 FORWARD Success. Request forwarded to Calendar User.
-2.8 ONEEVENT Success. Repeating event ignored. Scheduled as a single component.
-2.9 TRUNC Success. Truncated end date time to date boundary.
-2.10 ONETODO Success. Repeating VTODO ignored. Scheduled as a single VTODO.
-2.11 TRUNCRRULE Success. Unbounded RRULE clipped at some finite number of instances
-3.0 INVPROPNAME Invalid property name.
-3.1 INVPROPVAL Invalid property value.
-3.2 INVPARAM Invalid property parameter.
-3.3 INVPARAMVAL Invalid property parameter value.
-3.4 INVCOMP Invalid calendar component sequence.
-3.5 INVTIME Invalid date or time.
-3.6 INVRULE Invalid rule.
-3.7 INVCU Invalid Calendar User.
-3.8 NOAUTH No authority.
-3.9 BADVERSION Unsupported version.
-3.10 TOOBIG Request entity too large.
-3.11 MISSREQCOMP Required component or property missing.
-3.12 UNKCOMP Unknown component or property found.
-3.13 BADCOMP Unsupported component or property found
-3.14 NOCAP Unsupported capability.
-4.0 BUSY Event conflict. Date/time is busy.
-5.0 MAYBE Request MAY supported.
-5.1 UNAVAIL Service unavailable.
-5.2 NOSERVICE Invalid calendar service.
-5.3 NOSCHED No scheduling support for user.
-6.1 AUTHENTICATEFAILURE Unsupported authentication mechanism, credentials rejected
-6.2 AUTHENTICATIONABORTED Sender aborted authentication, authentication exchange cancelled
-8.0 GENERALFAILURE A failure has occurred in the Receiver that prevents the operation from succeeding.
-8.1 SERVERTOOBUSY The iRIP Receiver is too busy.
-8.2 ICALOBJECTTOOBIG Object has exceeded the server's size limit.
-8.3 DATETOOLARGE A DATETIME value was too far in the future to be represented on this Calendar.
-8.4 DATETOOSMALL A DATETIME value was too far in the past to be represented on this Calendar.
-9.0 INVALIDIRIPCOMMAND An unrecongnized command was received.
-9.1 UNEXPECTEDCOMMAND The command is not allowed for the server's current state.
-10.1 REFERRAL Accompanied by an alternate address.
-10.2 SERVERSHUTDOWN The server is shutting down.
-10.3 SERVERSTOPPING FLOOD 2
-10.4 EXCEEDEDQUOTAS The operation would cause a resource to exceed the allocated quota
-10.5 QUEUEDTOOLONG The ITIP message has been queued too long. Delivery has been aborted.
diff --git a/libical/design-data/status.foo b/libical/design-data/status.foo
deleted file mode 100644
index a2591bd26a..0000000000
--- a/libical/design-data/status.foo
+++ /dev/null
@@ -1,104 +0,0 @@
-2.0 STATOK Operation was successfully performed.
-
-2.0.1 START-SENDATA Start ICAL input; end with
- <CRLF>.<CRLF>
-
-2.0.11 OK-DATAFOLLOWS The request was processed
- successfully. Reply data follows on
- the next line and terminates with
- <CRLF>.<CRLF>
-
-2.0.2 REPLY-PENDING A timeout has occurred. The server is
- still working on the reply. Use
- CONTINUE to continue waiting for the
- reply or ABORT to terminate the
- command.
-
-2.0.3 ABORTED In response to the client issuing an
- ABORT command, this reply code
- indicates that any command currently
- underway was successsfully aborted.
-
-2.0.4 WILL-ATTEMPT The specified Calendar is not here
- but an attempt will be made to deliver
- the request or reply to the Calendar
- anyway. There is a trust relationship
- between this iRIP server and the
- iRIP server for the target calendar.
-
-2.0.5 TRUSTED-WILL-QUEUE The specified Calendar cannot be
- contacted directly and a trust
- relationship exists between this
- server and the server on which the
- Calendar exists. The request or reply
- will be queued and delivered to the
- target calendar when its iRIP server
- contacts this server and issues the
- SWITCH command.
-
-2.0.6 WILL-ATTEMPT The specified Calendar is not here
- but an attempt will be made to deliver
- the request or reply to the Calendar
- anyway. There is not a trust
- relationship between the iRIP server
- and the iRIP server for the target
- calendar.
-
-2.0.7 QUEUED The message has been queued for
- delivery.
-
-2.0.8 QUEUE-EMPTY There are no more queued messages.
-
-2.2 NO COMMAND IN PROGRESS An ABORT or CONTINUE was received when
- no command was in progress
-
-6.1 AUTHENTICATE FAILURE Unsupported authentication mechanism,
- credentials rejected
-
-6.2 AUTHENTICATION ABORTED Sender aborted authentication,
- authentication exchange cancelled
-
-8.0 GENERAL FAILURE A failure has occurred in the Receiver
- that prevents the operation from
- succeeding.
-
-8.1 SERVER TOO BUSY Sent when a session cannot be
- established because the iRIP
- Receiver is too busy.
-
-8.2 ICAL OBJECT TOO BIG Used to signal that an ICAL object has
- exceeded the server's size limit.
-
-8.3 DATE TOO LARGE A DATETIME value was too far in the
- future to be represented on this
- Calendar.
-
-8.4 DATE TOO SMALL A DATETIME value was too far in the
- past to be represented on this
- Calendar.
-
-9.0 INVALID iRIP COMMAND An unrecongnized command was received.
-
-9.1 UNEXPECTED COMMAND A command was issued in a manner
- inconsistent with the state diagram.
- For example, issuing the SENDATA
- command without having specified any
- RECIPIENTs will cause this error.
-10.1 REFERRAL Accompanied by an alternate address.
- The RECIPIENT specified should be
- contacted at the given alternate
- address. The referral address MUST
- follow the reply code.
-
-10.2 SERVER SHUT DOWN The server is shutting down.
-
-10.3 SERVER STOPPING FLOOD 2
-
-
-10.4 EXCEEDED QUOTAS The operation has not be performed
- because it would cause the resources
- (memory, disk, CPU, etc) to exceed the
- allocated quota
-
-10.5 QUEUED TOO LONG The ITIP message has been queued too
- long. Delivery has been aborted. \ No newline at end of file
diff --git a/libical/design-data/status.txt b/libical/design-data/status.txt
deleted file mode 100644
index 9e7bbf83a7..0000000000
--- a/libical/design-data/status.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-2.0 STATOK Operation was successfully performed.
-2.0.1 STARTSENDATA Start ICAL input; end with <CRLF>.<CRLF>
-2.0.11 OKDATAFOLLOWS The request was processed successfully. Reply data follows on the next line and terminates with <CRLF>.<CRLF>
-2.0.2 REPLYPENDING A timeout has occurred. The server is still working on the reply. Use CONTINUE to continue waiting for the reply or ABORT to terminate the command.
-2.0.3 ABORTED The command currently underway was successsfully aborted.
-2.0.4 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway.
-2.0.5 TRUSTEDWILLQUEUE The request or reply will be queued and delivered to the target calendar when its iRIP server contacts this server and issues the SWITCH command.
-2.0.6 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway.
-2.0.7 QUEUED The message has been queued for delivery.
-2.0.8 QUEUEEMPTY There are no more queued messages.
-2.1 FALLBACK Success. Fallback taken on one or more property values.
-2.2 NOCOMMANDINPROGRESS An ABORT or CONTINUE was received when no command was in progress
-2.2 IGPROP Success. Invalid property ignored.
-2.3 IGPARAM Success. invalid property parameter ignored.
-2.4 IGXPROP Success. Unknown non-standard property ignored.
-2.5 IGXPARAM Success. Unknown non standard property value ignored.
-2.6 IGCOMP Success. Invalid calendar component ignored.
-2.7 FORWARD Success. Request forwarded to Calendar User.
-2.8 ONEEVENT Success. Repeating event ignored. Scheduled as a single component.
-2.9 TRUNC Success. Truncated end date time to date boundary.
-2.10 ONETODO Success. Repeating VTODO ignored. Scheduled as a single VTODO.
-2.11 TRUNCRRULE Success. Unbounded RRULE clipped at some finite number of instances
-3.0 INVPROPNAME Invalid property name.
-3.1 INVPROPVAL Invalid property value.
-3.2 INVPARAM Invalid property parameter.
-3.3 INVPARAMVAL Invalid property parameter value.
-3.4 INVCOMP Invalid calendar component sequence.
-3.5 INVTIME Invalid date or time.
-3.6 INVRULE Invalid rule.
-3.7 INVCU Invalid Calendar User.
-3.8 NOAUTH No authority.
-3.9 BADVERSION Unsupported version.
-3.10 TOOBIG Request entity too large.
-3.11 MISSREQCOMP Required component or property missing.
-3.12 UNKCOMP Unknown component or property found.
-3.13 BADCOMP Unsupported component or property found
-3.14 NOCAP Unsupported capability.
-4.0 BUSY Event conflict. Date/time is busy.
-5.0 MAYBE Request MAY supported.
-5.1 UNAVAIL Service unavailable.
-5.2 NOSERVICE Invalid calendar service.
-5.3 NOSCHED No scheduling support for user.
-6.1 AUTHENTICATEFAILURE Unsupported authentication mechanism, credentials rejected
-6.2 AUTHENTICATIONABORTED Sender aborted authentication, authentication exchange cancelled
-8.0 GENERALFAILURE A failure has occurred in the Receiver that prevents the operation from succeeding.
-8.1 SERVERTOOBUSY The iRIP Receiver is too busy.
-8.2 ICALOBJECTTOOBIG Object has exceeded the server's size limit.
-8.3 DATETOOLARGE A DATETIME value was too far in the future to be represented on this Calendar.
-8.4 DATETOOSMALL A DATETIME value was too far in the past to be represented on this Calendar.
-9.0 INVALIDIRIPCOMMAND An unrecongnized command was received.
-9.1 UNEXPECTEDCOMMAND The command is not allowed for the server's current state.
-10.1 REFERRAL Accompanied by an alternate address.
-10.2 SERVERSHUTDOWN The server is shutting down.
-10.3 SERVERSTOPPING FLOOD 2
-10.4 EXCEEDEDQUOTAS The operation would cause a resource to exceed the allocated quota
-10.5 QUEUEDTOOLONG The ITIP message has been queued too long. Delivery has been aborted.
diff --git a/libical/design-data/value-c-types.txt b/libical/design-data/value-c-types.txt
deleted file mode 100644
index c7dd26034f..0000000000
--- a/libical/design-data/value-c-types.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-ATTACH struct icalattachtype # Non-std
-BINARY char*
-BOOLEAN int
-CAL-ADDRESS char*
-DATE struct icaltimetype
-DATE-TIME struct icaltimetype
-DATE-TIME-DATE struct icaltimetype # Non-std
-DATE-TIME-PERIOD struct icalperiodtype # Non-std
-DURATION struct icaldurationtype
-FLOAT float
-GEO struct icalgeotype # Non-std
-INTEGER int
-METHOD icalproperty_method # Non-std
-PERIOD struct icalperiodtype
-RECUR struct icalrecurrencetype
-STRING char* # Non-std
-TEXT char*
-TIME struct icaltimetype
-TRIGGER union icaltriggertype # Non-std
-URI char*
-UTC-OFFSET int
-QUERY char*
diff --git a/libical/design-data/value-mem-semantics.txt b/libical/design-data/value-mem-semantics.txt
deleted file mode 100644
index 5948e244f6..0000000000
--- a/libical/design-data/value-mem-semantics.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-ATTACH struct icalattachtype
-BINARY char*
-BOOLEAN int
-CAL-ADDRESS char*
-DATE time_t
-DATE-TIME time_t
-DATE-TIME-DATE time_t
-DATE-TIME-PERIOD struct icalperiodtype
-DURATION struct icaldurationtype
-FLOAT float
-GEO struct icalgeotype
-INTEGER int
-PERIOD struct icalperiodtype
-RECUR struct icalrecurrencetype
-TEXT char*
-TIME time_t
-TRIGGER struct icaltriggertimetype
-URI char*
-UTC-OFFSET int
diff --git a/libical/doc/.cvsignore b/libical/doc/.cvsignore
deleted file mode 100644
index 3dda72986f..0000000000
--- a/libical/doc/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile.in
-Makefile
diff --git a/libical/doc/Makefile.am b/libical/doc/Makefile.am
deleted file mode 100644
index 0df4f3f42d..0000000000
--- a/libical/doc/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-EXTRA_DIST = UsingLibical.lyx UsingLibical.ps
diff --git a/libical/doc/UsingLibical.lyx b/libical/doc/UsingLibical.lyx
deleted file mode 100644
index 1742e3af00..0000000000
--- a/libical/doc/UsingLibical.lyx
+++ /dev/null
@@ -1,2256 +0,0 @@
-#This file was created by <eric> Sat Feb 19 10:33:21 2000
-#LyX 1.0 (C) 1995-1999 Matthias Ettrich and the LyX Team
-\lyxformat 2.15
-\textclass linuxdoc
-\language default
-\inputencoding default
-\fontscheme default
-\graphics default
-\paperfontsize default
-\spacing single
-\papersize Default
-\paperpackage a4
-\use_geometry 0
-\use_amsmath 0
-\paperorientation portrait
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\defskip medskip
-\quotes_language english
-\quotes_times 2
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-
-\layout Title
-
-Using Libical
-\layout Author
-
-Eric Busboom (eric@softwarestudio.org)
-\layout Date
-
-January 2000
-\layout Section
-
-Introduction
-\layout Standard
-
-Libical is an Open Source implementation of the iCalendar protocols and
- protocol data units.
- The iCalendar specification describes how calendar clients can communicate
- with calendar servers for users can store their calendar data and arrange
- meetings with other users.
-
-\layout Standard
-
-Libical implements the following specifications and protocols
-\layout Standard
-\added_space_top 0.3cm \added_space_bottom 0.3cm \LyXTable
-multicol5
-5 2 0 0 -1 -1 -1 -1
-1 0 0 0
-1 0 0 0
-1 0 0 0
-1 0 0 0
-1 1 0 0
-8 1 0 "" ""
-8 1 1 "" ""
-0 8 1 0 0 0 0 "" ""
-0 8 1 0 0 0 0 "" ""
-0 8 1 0 0 0 0 "" ""
-0 8 1 0 0 0 0 "" ""
-0 8 1 0 0 0 0 "" ""
-0 8 1 0 0 0 0 "" ""
-0 8 1 0 0 0 0 "" ""
-0 8 1 0 0 0 0 "" ""
-0 8 1 0 0 0 0 "" ""
-0 8 1 0 0 0 0 "" ""
-
-iCal Core
-\newline
-2445
-\newline
-iTIP
-\newline
-2446
-\newline
-iMIP
-\newline
-2447
-\newline
-iRIP
-\newline
-draft
-\newline
-CAP
-\newline
-draft
-\layout Standard
-
-(The current version, 0.15, does not implement iRip or CAP.
- )
-\layout Standard
-
-This documentation assumes that you are familiar with the iCalendar standards
- RFC2445 and RFC2446.
- these specifications are online on the CALSCH webpage at:
-\layout Verbatim
-
-http://www.imc.org/ietf-calendar/
-\layout Subsection
-
-The libical project
-\layout Standard
-
-This code is under active development.
- If you would like to contribute to the project, you can contact me, Eric
- Busboom, at eric@softwarestudio.org.
- The project has a webpage at
-\layout Verbatim
-
-http://softwarestudio.org/libical/index.html
-\layout Standard
-
-and a mailing list that you can join by sending the following mail:
-\layout Verbatim
-
-To: minimalist@softwarestudio.org
-\layout Verbatim
-
-Subject: subscribe libical
-\layout Subsection
-
-License
-\layout Standard
-
-The code and datafiles in this distribution are licensed under the Mozilla
- Public License.
- See http://www.mozilla.org/NPL/MPL-1.0.html for a copy of the license.
- Alternately, you may use libical under the terms of the GNU Library General
- Public License.
- See http://www.fsf.org/copyleft/lesser.html for a copy of the LGPL.
-\layout Standard
-
-This dual license ensures that the library can be incorporated into both
- proprietary code and GPL'd programs, and will benefit from improvements
- made by programmers in both realms.
- I will only accept changes into my version of the library if they are similarly
- dual-licensed.
-\layout Subsection
-
-Purpose & Goals
-\layout Subsection
-
-Document version
-\layout Verbatim
-
-$Id: UsingLibical.lyx,v 1.5 2000/06/06 22:48:07 alves Exp $
-\layout Section
-
-Building the Library
-\layout Standard
-
-Libical uses autoconf to generate makefiles, although it uses none of the
- autoconf flags to influence the compilation.
- It should built with no adjustments on Linux, FreeBSD and Solaris.
-
-\layout Section
-
-Structure
-\layout Standard
-
-The iCal calendar model is based on four types of objects: components, propertie
-s, values and parameters.
-
-\layout Standard
-
-Properties are the fundamental unit of information in iCal, and they work
- a bit like a hash entry, with a constant key and a variable value.
- Properties may also have modifiers, called parameters.
- In the iCal content line
-\layout Verbatim
-
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
-\layout Standard
-
-The property name is
-\begin_inset Quotes eld
-\end_inset
-
-ORGANIZER,
-\begin_inset Quotes erd
-\end_inset
-
- the value of the property is
-\begin_inset Quotes eld
-\end_inset
-
-mrbig@host.com
-\begin_inset Quotes erd
-\end_inset
-
- and the
-\begin_inset Quotes eld
-\end_inset
-
-ROLE
-\begin_inset Quotes erd
-\end_inset
-
- parameter specifies that Mr Big is the chair of the meetings associated
- with this property.
-
-\layout Standard
-
-Components are groups of properties that represent the core objects of a
- calendar system, such as events or timezones.
-
-\layout Standard
-
-The central goal of libical is to parse iTIP data into an internal representatio
-n of Components, Properties, Parameters an Values, and to allow the user
- to manipulate the data in various ways
-\layout Standard
-\added_space_bottom 0.3cm
-\begin_float fig
-\layout Standard
-
-
-\begin_inset Figure size 180 147
-file icaluml.eps
-flags 13
-
-\end_inset
-
-
-\end_float
-When a component is send across a network, if it is un-encrypted, it will
- look something like:
-\layout Code
-
-BEGIN:VEVENT
-\layout Code
-
-DTSTAMP:19980309T231000Z
-\layout Code
-
-UID:guid-1.host1.com
-\layout Code
-
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
-\layout Code
-
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
-\layout Code
-
-
-\protected_separator
- MAILTO:employee-A@host.com
-\layout Code
-
-DESCRIPTION:Project XYZ Review Meeting
-\layout Code
-
-CATEGORIES:MEETING
-\layout Code
-
-CLASS:PUBLIC
-\layout Code
-
-CREATED:19980309T130000Z
-\layout Code
-
-SUMMARY:XYZ Project Review
-\layout Code
-
-DTSTART;TZID=US-Eastern:19980312T083000
-\layout Code
-
-DTEND;TZID=US-Eastern:19980312T093000
-\layout Code
-
-LOCATION:1CP Conference Room 4350
-\layout Code
-
-END:VEVENT
-\layout Subsection
-
-Core iCal classes
-\layout Subsubsection
-
-Components
-\layout Subsubsection
-
-Properties
-\layout Subsubsection
-
-Values
-\layout Subsubsection
-
-Parameters
-\layout Subsection
-
-Other elements of libical
-\layout Standard
-
-In addition to the core iCal classes, libical has many other types, structures,
- classes that aid in creating and using iCal components.
-
-\layout Subsubsection
-
-Enumerations
-\layout Subsubsection
-
-Types
-\layout Subsubsection
-
-The Parser
-\layout Subsubsection
-
-Restrictions
-\layout Subsubsection
-
-Error objects
-\layout Subsubsection
-
-Memory Management
-\layout Subsubsection
-
-Storage classes
-\layout Section
-
-Differences From RFCs
-\layout Standard
-
-Libical has been designed to follow the standards as closely as possible,
- so that the key objects in the standards are also keey objects in the library.
- However, there are a few areas where the specifications are (arguably)
- irregular, and following them exactly would result in an unfriendly interface.
- These deviations make libical easier to use by maintaining a self-similar
- interface.
-
-\layout Subsection
-
-Pseudo Components
-\layout Standard
-
-Libical defines components for groups of properties that look and act like
- components, but are not defined as components in the specification.
- XDAYLIGHT and XSTANDARD are notable examples.
- These pseudo components group properties within the VTIMEZONE components.
- For instanace, the timezone properties associated with daylight savings
- time starts with
-\begin_inset Quotes eld
-\end_inset
-
-BEGIN:DAYLIGHT
-\begin_inset Quotes erd
-\end_inset
-
- and ends with
-\begin_inset Quotes eld
-\end_inset
-
-END:DAYLIGHT, just like other components, but is not defined as a component
- in RFC2445.
- ( See RFC2445, page 61 ) In Libical,this grouping is represented by the
- XDAYLIGHT component.
- Standard iCAL components all start with the letter
-\begin_inset Quotes eld
-\end_inset
-
-V,
-\begin_inset Quotes erd
-\end_inset
-
- while pseudo components start with
-\begin_inset Quotes erd
-\end_inset
-
-X.
-\begin_inset Quotes erd
-\end_inset
-
-
-\layout Standard
-
-There are also pseudo components that are conceptually derived classess
- of VALARM.
- RFC2446 defines what properties may be included in each component, and
- for VALARM, the set of properties it may have depends on the value of the
- ACTION property.
-
-\layout Standard
-
-For instance, if a VALARM component has an ACTION property with the value
- of
-\begin_inset Quotes eld
-\end_inset
-
-AUDIO,
-\begin_inset Quotes erd
-\end_inset
-
- the component must also have an
-\begin_inset Quotes eld
-\end_inset
-
-ATTACH
-\begin_inset Quotes erd
-\end_inset
-
- property.
- However, if the ACTION value is
-\begin_inset Quotes eld
-\end_inset
-
-DISPLAY,
-\begin_inset Quotes erd
-\end_inset
-
- the component must have a DESCRIPTION property.
-
-\layout Standard
-
-To handle these various, complex restrictions, libical has pseudo components
- for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and XPROCEDUREA
-LARM.
-
-\layout Subsection
-
-Combined Values
-\layout Standard
-
-Many values can take more than one type.
- TRIGGER, for instance, can have a value type of with DURATION or of DATE-TIME.
- These multiple types make it difficult to create routines to return the
- value associated with a property.
-
-\layout Standard
-
-It is natural to have interfaces that would return the value of a property,
- but it is cumbersone for a single routine to return multiple types.
- So, in libical, properties that can have multiple types are given a single
- type that is the union of their RFC2445 types.
- For instance, in libical, the value of the TRIGGER property resolves to
-
-\noun on
-struct icaltriggertype
-\noun default
-.
- This type is a union of a DURATION and a DATE-TIME.
-
-\layout Subsection
-
-Multi-Valued Properties
-\layout Standard
-
-Some properties, such as CATEGORIES have only one value type, but each CATEGORIE
-S property can have multiple value instances.
- This also results in a cumbersome interface -- CATEGORIES accessors would
- have to return a list while all other accessors returned a single value.
- In libical, all properties have a single value, and multi-valued properties
- are broken down into multiple single valued properties during parsing.
- That is, an input line like,
-\layout Verbatim
-
-CATEGORIES: work, home
-\layout Standard
-
-becomes in libical's internal representation
-\layout Verbatim
-
-CATEGORIES: work
-\layout Verbatim
-
-CATEGORIES: home
-\layout Standard
-
-Oddly, RFC2445 allows some multi-valued properties ( like FREEBUSY ) to
- exist as both a multi-values property and as multiple single value properties,
- while others ( like CATEGORIES ) can only exist as single multi-valued
- properties.
- This makes the internal representation for CATEGORIES illegal.
- However when you convert a component to a string, the library will collect
- all of the CATEGORIES properties into one.
-
-\layout Section
-
-Implementation Limitations
-\layout Section
-
-Using libical
-\layout Subsection
-
-Creating Components
-\layout Standard
-
-There are three ways to create components in Libical: creating individual
- objects and assembling them, building entire objects in massive vaargs
- calls, and parsing a text file containing iCalendar data.
-
-\layout Subsubsection
-
-Constructor Interfaces
-\layout Standard
-
-Using constructor interfaces, you create each of the objects seperately
- and them assemble them in to components:
-\layout Code
-
-icalcomponent *event;
-\layout Code
-
-icalproperty *prop;
-\layout Code
-
-icalparameter *param;
-\layout Code
-
-struct icaltimetype atime;
-\layout Code
-
-event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
-\layout Code
-
-prop = icalproperty_new_dtstamp(atime) ;
-\layout Code
-
-icalcomponent_add_property(event, prop);
-\layout Code
-
-prop = icalproperty_new_uid(strdup("guid-1.host1.com")) );
-\layout Code
-
-icalcomponent_add_property(event,prop);
-\layout Code
-
-prop=icalproperty_new_organizer(strdup("mrbig@host.com"));
-\layout Code
-
-param = icalparameter_new_role(ICAL_ROLE_CHAIR)
-\layout Code
-
-icalproperty_add_parameter(prop, param);
-\layout Code
-
-icalcomponent_add_property(event,prop);
-\layout Standard
-
-While we are on this example, you should notice that libical uses a semi-object-
-oriented style of interface.
- Most things you work with are objects, that are instantiated with a constructor
- that has
-\begin_inset Quotes eld
-\end_inset
-
-new
-\begin_inset Quotes erd
-\end_inset
-
- in the name.
- Also note that, other than the object reference, most structure data is
- passed in to libical routines by value.
- Strings, of course, are passed in by reference, but libical will take ownership
- of the memory, so you had beter strdup() the data unless you want a core
- dump when the memory is freed for the second time.
- Libical has some complex bu very regular memory handling rules.
- These are detailed in section
-\begin_inset LatexCommand \ref{sec:memory}
-
-\end_inset
-
-.
-\layout Standard
-
-If any of the constructors fail, they will return 0.
- If you try to insert 0 into a property or component, or use a zero-valued
- object reference, libical will either silently ignore the error or will
- abort with an error message.
- This behavior is controlled by a compile time flag (ICAL_ERRORS_ARE_FATAL),
- and will abort by default.
-
-\layout Subsubsection
-
-vaargs Constructors
-\layout Standard
-
-There is another way to create complex components, which is arguable more
- elegant, if you are not horrified by vaargs.
- The vaargs constructor interface all you to create intricate components
- in a single block of text.
-
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- calendar =
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalcomponent_vanew(
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- ICAL_VCALENDAR_COMPONENT,
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- icalproperty_new_version(strdup("2.0")),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- icalproperty_new_prodid(strdup("-//RDU Software//NONSGML HandCal//EN")),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- icalcomponent_vanew(
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-ICAL_VEVENT_COMPONENT,
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty_new_dtstamp(atime),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty_new_uid(strdup("guid-1.host1.com")),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty_vanew_organizer(
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- strdup("mrbig@host.com"),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- icalparameter_new_role(ICAL_ROLE_CHAIR),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 0
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty_vanew_attendee(
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- strdup("employee-A@host.com"),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- icalparameter_new_rsvp(1),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 0
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- ),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty_new_location(strdup("1CP Conference Room 4350")),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-0
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-),
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 0
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- );
-\layout Standard
-
-This form is similar to the regular constructor, except that they have
-\begin_inset Quotes eld
-\end_inset
-
-vanew
-\begin_inset Quotes erd
-\end_inset
-
- instead of
-\begin_inset Quotes eld
-\end_inset
-
-new
-\begin_inset Quotes erd
-\end_inset
-
- in the name.
- The arguments are similar too, except that the component contstructor can
- have a list of properties, and the property constructor can have a list
- or parameters.
- Be sure to terminate every list with a '0', or your code will crash, if
- you are lucky.
-
-\layout Subsubsection
-
-Parsing Text Files
-\layout Standard
-
-The final way to create components will probably be the most common; you
- can create components from RFC2445 compliant text.
- If you have the string in memory, use
-\layout Verbatim
-
-icalcomponent* icalparser_parse_string(char* str);
-\layout Standard
-
-This may seem wasteful if you want to pull a large component off of the
- network; you may prefer to parse the component line by line.
- This is possible too, with
-\layout Verbatim
-
-icalcomponent* icalparser_parse(char*(*line_gen_func)(char *s, size_t size,
- void *d));
-\layout Standard
-
-This routine takes a pointer to a function that copies 'size' characters
- to 's'.
- The routine returns 's', similar to fgets().
- See string_line_generator in icalparser.c for an example.
-
-\layout Subsection
-
-Accessing Components
-\layout Standard
-
-Given a reference to a component, you probably will want to access the propertie
-s, parameters and values inside.
-
-\layout Subsubsection
-
-Finding Components
-\layout Standard
-
-To find a sub-component of a component, use:
-\layout Verbatim
-
-icalproperty* icalcomponent_get_first_component(
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalcomponent* component,
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalcomponent_kind kind);
-\layout Standard
-
-This routine will return a reference to the first component of the type
- 'kind.' The key kind values, listed in icalenums.h are:
-\layout Code
-
-ICAL_ANY_COMPONENT
-\layout Code
-
-ICAL_VEVENT_COMPONENT
-\layout Code
-
-ICAL_VTODO_COMPONENT
-\layout Code
-
-ICAL_VJOURNAL_COMPONENT
-\layout Code
-
-ICAL_VCALENDAR_COMPONENT
-\layout Code
-
-ICAL_VFREEBUSY_COMPONENT
-\layout Code
-
-ICAL_VALARM_COMPONENT
-\layout Standard
-
-These are only the most common components; there are many more listed in
- icalenums.h.
-\layout Standard
-
-As you might guess, if there is more than one subcomponent of the type you
- have chosen, this routine will return only the first.
- to get at the others, you need to iterate through the component.
-
-\layout Subsubsection
-
-Interating Through Components
-\layout Standard
-
-Iteration requires a second routine to get the next subcomponent after the
- first:
-\layout Verbatim
-
-icalcomponent* icalcomponent_get_next_component(icalcomponent* component,
-
-\layout Verbatim
-
-icalcomponent_kind kind);
-\layout Standard
-
-With the 'first' and 'next' routines, you can create a for loop to iterate
- through all of a components subcomponents
-\layout Code
-
-
-\protected_separator
- for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-c != 0;
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT))
-\layout Code
-
-{
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- do_something(c);
-\layout Code
-
-}
-\layout Standard
-
-This code bit wil iterate through all of the subcomponents in 'comp' but
- you can select a specific type of component by changing ICAL_ANY_COMPONENT
- to another component type.
-\layout Subsubsection
-
-Removing Components
-\layout Standard
-
-Libical component have internal iterators, so you can only have one iteration
- over a component at a time.
- Removing an element from a list while iterating through the list can cause
- problems, since you will probably be removing the element that the internal
- iterator points to.
- This will result in the iteration loop terminating immediately after removing
- the element.
- To avoid the problem, you will need to step the iterator ahead of the element
- you are going to remove, like this:
-\layout Code
-
-for(c = icalcomponent_get_first_component(parent_comp,ICAL_ANY_COMPONENT);
-
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-c != 0;
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-c = next
-\layout Code
-
-{
-\protected_separator
-
-\protected_separator
-
-\layout Code
-
-
-\protected_separator
-next = icalcomponent_get_next_component(parent_comp,ICAL_ANY_COMPONENT);
-\layout Code
-
-
-\protected_separator
-
-\protected_separator
- icalcomponent_remove_component(parent_comp,c);
-\layout Code
-
-}
-\layout Subsubsection
-
-Working with properties and parameters
-\layout Standard
-
-Finding, iterating and removing properties works the same as it does for
- components, using the property-specific or parameter-specific interfaces:
-
-\layout Verbatim
-
-icalproperty* icalcomponent_get_first_property(
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalcomponent* component,
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty_kind kind);
-\layout Verbatim
-
-icalproperty* icalcomponent_get_next_property(
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalcomponent* component,
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty_kind kind);
-\layout Verbatim
-
-void icalcomponent_add_property(
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalcomponent* component,
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty* property);
-\layout Verbatim
-
-void icalcomponent_remove_property(
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalcomponent* component,
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty* property);
-\layout Verbatim
-
-icalparameter* icalproperty_get_first_parameter(
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty* prop,
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalparameter_kind kind);
-\layout Verbatim
-
-icalparameter* icalproperty_get_next_parameter(
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty* prop,
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalparameter_kind kind);
-\layout Verbatim
-
-void icalproperty_add_parameter(
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty* prop,
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalparameter* parameter);
-\layout Verbatim
-
-void icalproperty_remove_parameter(
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalproperty* prop,
-\layout Verbatim
-
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-icalparameter_kind kind);
-\layout Subsubsection
-
-Getting Values
-\layout Subsubsection
-
-Setting Values
-\layout Subsubsection
-
-Getting Parameters
-\layout Subsubsection
-
-Setting Parameters
-\layout Subsubsection
-
-Removing Parameters
-\layout Subsubsection
-
-Checking Component Validity
-\layout Subsection
-
-Storing Objects
-\layout Standard
-
-The libical distribution inclues a seperate library, libicalss, that allows
- you to store iCal component data to disk in a variety of ways.
- This library is documented seperately.
-
-\layout Subsection
-
-
-\begin_inset LatexCommand \label{sec:memory}
-
-\end_inset
-
-Memory Management
-\layout Standard
-
-Libical relies heavily on dynamic allocation for both the core objects and
- for the strings used to hold values.
- Some of this memory the library caller owns and must free, and some of
- the memory is managed by the library.
- Here is a summary of the memory rules.
-
-\layout Description
-
-1) If the function name has "new" in it, the caller gets control of the
- memory.
- ( such as icalcomponent_new(), or icalproperty_new_clone() )
-\layout Description
-
-2) If you got the memory from a routine with new in it, you must call the
- corresponding *_free routine to free the memory.
- ( Use icalcomponent_free() to free objects created with icalcomponent_new())
-
-\layout Description
-
-3) If the function name has "add" in it, the caller is transfering control
- of the memory to the routine.
- ( icalproperty_add_parameter() )
-\layout Description
-
-4) If the function name has "remove" in it, the caller passes in a pointer
- to an object and after the call returns, the caller owns the object.
- So, before you call icalcomponent_remove_property(comp,foo), you do not
- own "foo" and after the call returns, you do.
-
-\layout Description
-
-5) If the routine returns a string, libical owns the memory and will put
- it on a ring buffer to reclaim later.
- You'd better strdup() it if you want to keep it, and you don't have to
- delete it.
-
-\layout Subsection
-
-Error Handling
-\layout Standard
-
-icalerror_errno.
- Return values.
- #defines.
- icalerror_stop_here.
- X-LIC-ERROR
-\layout Subsubsection
-
-Return values
-\layout Subsubsection
-
-icalerrno
-\layout Subsubsection
-
-Component errors
-\layout Subsubsection
-
-icalerror_stop_here
-\layout Subsubsection
-
-X-LIC-ERROR
-\layout Subsection
-
-Naming Standard
-\layout Standard
-
-Structures that you access with the
-\begin_inset Quotes eld
-\end_inset
-
-struct
-\begin_inset Quotes erd
-\end_inset
-
- keyword, such as
-\begin_inset Quotes eld
-\end_inset
-
-struct icaltimetype
-\begin_inset Quotes erd
-\end_inset
-
- are things that you are allowed to see inside and poke at.
-
-\layout Standard
-
-Structures that you access though a typedef, such as
-\begin_inset Quotes eld
-\end_inset
-
-icalcomponent
-\begin_inset Quotes erd
-\end_inset
-
- are things where all of the data is hidden.
-
-\layout Standard
-
-Component names that start with
-\begin_inset Quotes eld
-\end_inset
-
-V
-\begin_inset Quotes erd
-\end_inset
-
- are part of RFC 2445 or another iCal standard.
- Component names that start with
-\begin_inset Quotes eld
-\end_inset
-
-X
-\begin_inset Quotes erd
-\end_inset
-
- are also part of the spec, but they are not actually components in the
- spec.
- However, they look and act like components, so they are components in libical.
- Names that start with
-\begin_inset Quotes eld
-\end_inset
-
-XLIC
-\begin_inset Quotes erd
-\end_inset
-
- or
-\begin_inset Quotes eld
-\end_inset
-
-X-LIC
-\begin_inset Quotes erd
-\end_inset
-
- are not part of any iCal spec.
- They are used internally by libical.
-
-\layout Standard
-
-Enums that identify a component, property, value or parameter end with
-\begin_inset Quotes eld
-\end_inset
-
-_COMPONENT,
-\begin_inset Quotes erd
-\end_inset
-
-
-\begin_inset Quotes eld
-\end_inset
-
-_PROPERTY,
-\begin_inset Quotes erd
-\end_inset
-
-
-\begin_inset Quotes eld
-\end_inset
-
-_VALUE,
-\begin_inset Quotes erd
-\end_inset
-
- or
-\begin_inset Quotes eld
-\end_inset
-
-_PARAMETER
-\begin_inset Quotes erd
-\end_inset
-
-s
-\layout Standard
-
-Enums that identify a parameter value have the name of the parameter as
- the second word.
- For instance: ICAL_ROLE_REQPARTICIPANT or ICAL_PARTSTAT_ACCEPTED.
-\layout Standard
-
-The enums for the parts of a recurarance rule and request statuses are irregular.
-
-\layout Section
-
-Useful Recipies
-\layout Standard
-
-Iteration
-\layout Standard
-
-Copying components.
- Remember that you must clone or remove an object before putting in on another
- list.
-
-\layout Standard
-
-Finding compliance errors
-\layout Section
-
-Performance
-\layout Standard
-
-Checking restrictions is computationally expensive
-\layout Section
-
-Hacks and Bugs
-\the_end
diff --git a/libical/doc/UsingLibical.ps b/libical/doc/UsingLibical.ps
deleted file mode 100644
index 0417ded6a5..0000000000
--- a/libical/doc/UsingLibical.ps
+++ /dev/null
@@ -1,1308 +0,0 @@
-%!PS-Adobe-2.0
-%%Creator: dvips(k) 5.85 Copyright 1999 Radical Eye Software
-%%Title: UsingLibical.dvi
-%%Pages: 6
-%%PageOrder: Ascend
-%%BoundingBox: 0 0 612 792
-%%EndComments
-%DVIPSWebPage: (www.radicaleye.com)
-%DVIPSCommandLine: dvips -t letter -o
-%+ /usr/local/home/eric/proj/FreeAssociation/libical/doc/UsingLibical.ps
-%+ UsingLibical.dvi
-%DVIPSParameters: dpi=600, compressed
-%DVIPSSource: TeX output 2000.02.18:1517
-%%BeginProcSet: texc.pro
-%!
-/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
-N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
-mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
-0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
-landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
-mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
-matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
-exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
-statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
-N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
-/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
-/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
-array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
-df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
-definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
-}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
-B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
-1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
-1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
-0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
-sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
-rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
-gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
-/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
-/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
-A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
-get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
-ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
-fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
-{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
-chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
-1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
-forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
-/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
-}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
-bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
-mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
-SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
-userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
-1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
-index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
-/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
-/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
-(LaserWriter 16/600)]{A length product length le{A length product exch 0
-exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
-end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
-grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
-imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
-exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
-fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
-delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
-B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
-p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
-rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
-
-%%EndProcSet
-TeXDict begin 40258431 52099146 1000 600 600 (UsingLibical.dvi)
-@start
-%DVIPSBitmapFont: Fa ecbx1000 10 47
-/Fa 47 122 df<913A03FF8007FE027F9039F07FFF800103B500FDB512E0010F903A00FF
-FE0FF0D93FF8ECF81F90267FE0019038F03FF849485A4816E014804816C00200ED1FF081
-F007C06F91C7FCA8B912E0A4000390C701C0C7FCB3ABB5D8FC3FEBFF80A43D3A7EB938>
-27 D<12E07E127C7E7E7F6C7E6C7E12037F6C7E7F12007F137E137FA2EB3F80A214C013
-1F14E0A2130F14F0A4EB07F8A514FCB114F8A5EB0FF0A414E0131FA214C0133F1480A2EB
-7F00A2137E13FE5B12015B485A5B1207485A485A90C7FC123E5A12F05A16537BBD25>41
-D<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F800D0D798C1B>46
-D<49B4FC011F13F0017F13FC9038FF83FE4848C67E4848EB7F804848EB3FC04848EB1FE0
-A2001F15F0A24848EB0FF8A3007F15FCA400FF15FEB3007F15FCA5003F15F86D131FA200
-1F15F0A26C6CEB3FE0000715C06C6CEB7F806C6CEBFF003900FF83FE6DB45A011F13F001
-0190C7FC27377CB530>48 D<141E143E14FE1307137FB5FCA3138FEA000FB3B3A5007FB6
-1280A4213679B530>I<EB0FFE90387FFFC048B512F0000714FC390FE03FFF261F800F13
-80263F000313C0D87F8014E0EBE00100FF6D13F07FA2ED7FF8A46C5A6C5A0006C7FCC8FC
-EDFFF0A216E05C16C04A138016004A5A4A5AEC1FF05D4A5A4AC7FC14FE495AD903F01378
-495A495A495A49C712F8017C14F05B49130148B6FC5A5A5A5A5A4815E0B7FCA425367BB5
-30>I<EB03FF011F13F0017F13FC3901FC07FF2603F003138048486C13C0496C13E0EA0F
-F86D14F0487EA66C4814E06C5A6C485AC714C04A138016004A5A4A5AEC3FF090380FFFC0
-5D15F090380007FE913801FF806E13C016E0ED7FF016F8ED3FFCA216FEEA1FC0487E487E
-487EA416FCA249137F007F15F801C0EBFFF06C5A6C6C4813E0260FFC0713806CB6120000
-0114FC6C6C13F0010790C7FC27377CB530>I<ED07C0150FA2151F153F157F15FF5CA25C
-5C5C5C143E143C5C5C1301495A5C495A495A5B133E5B13785B485A1203485A5B48C7FC12
-1E5A127C5AB81280A4C70001EBC000AA0103B61280A429367DB530>I<001C15C0D81F80
-130701F8137F90B61280A216005D5D15F05D15804AC7FC14F090C9FCA7EB03FE90381FFF
-E0017F13F89038FE07FC9038F003FFD9C0011380496C13C090C7FC000E15E0C8127F16F0
-A216F8A3121FEA3FC0487E12FF7FA316F05B15FFD87F8014E0007EC713C0003E5B003F49
-13806C6C481300390FF01FFE6CB512F8000114E06C6C1380D90FF8C7FC25377BB530>I<
-EC0FF8ECFFFE0103EBFF8090390FF80FC090393FE003E090397F8001F09038FF000F48EC
-1FF84848133F485A120F5B121FA2003FEC1FF0ED0FE0484890C7FCA31408EC7FF039FFF1
-FFFC01F313FFD9F78013809039FF007FC049EB3FE04914F0ED1FF85B16FCA34914FEA412
-7FA5123F16FCA26C7E16F8000F143F6D14F0000715E06C6CEB7FC03A01FF81FF806C90B5
-1200013F13FC010F13F00101138027377CB530>I<123C123EEA3FE090B71280A4170048
-5D5E5E5E5EA2007CC7EA0FC000784A5A4BC7FC00F8147E485C5D14014A5AC7485A4A5AA2
-4A5A143F4AC8FCA214FEA213015C1303A21307A2130F5CA2131FA5133FA96D5A6D5A6D5A
-29397BB730>I<49B47E010F13F0013F13FC9038FE01FF3A01F8007F804848EB3FC04848
-EB1FE0150F484814F01507121FA27F7F7F6D130F01FF14E014C09138E01FC06CEBF83F91
-38FE7F806C9038FFFE005D6C14F06C14FC6C14FF6D14806D14C090B612E0D803FD14F026
-07F07F13F848487E261FC00F13FC383F8003007F010013FE90C7127F151F00FE14071503
-1501A21500A216FC7E6C14016D14F86C6C13036DEB07F06C6CEB0FE0D80FFEEB7FC00003
-B61200C614FC013F13F00103138027377CB530>I<EB03FF011F13E0017F13F83901FF01
-FE48486C7E4848EB7F80484814C0001FEC3FE0485AED1FF0127F16F8A212FF16FCA416FE
-A5007F143FA3123F157F6C7E000F14FF6C6C5A3903FE03DF6CB5129F6C6C131FD91FFC13
-FCEB00201400A3D80FE0EB3FF8487E486C14F0A216E0157F16C0EDFF80495A6C48481300
-90388007FE390FE01FF86CB55A6C14C0C691C7FCEB1FF027377CB530>I<DB3FFCEB01C0
-0203B5EAC003021FECF00791B6EAFC0F01039039FC00FF3F4901C0EB1FFFD91FFEC77E49
-481403D97FF080494880485B48177F4849153F4890C9FC181F485A180F123F5B1807127F
-A24993C7FC12FFAD127F7FF003C0123FA27F001F1707A26C6C1780180F6C6D16006C6D5D
-6C173E6C6D157ED97FF85D6D6C4A5A6DB44A5A010701C0EB0FE06D01FCEBFF80010090B5
-48C7FC021F14F8020314E09126003FFEC8FC3A3B7BB945>67 D<B87E17F817FF18C02800
-7FF8000713F09338007FF8EF1FFE717E050313807113C0A27113E0F07FF0A2F03FF8A219
-FC181FA219FEA419FFAC19FEA419FC183FA219F8187F19F0F0FFE0A24D13C04D13804D13
-00EF1FFEEF7FFC933807FFF0B912C095C7FC17FC178040397DB849>I<B912C0A43A007F
-F800039338007FE0171F170F1707A21703A21701A318F0EE7800A41800A216F8A2150115
-0791B5FCA4ECF80715011500A21678A693C8FCADB7FCA434397DB83C>70
-D<DB3FFCEB01C00203B5EAC003021FECF00791B6EAFC0F01039039FC00FF3F4901C0EB1F
-FFD91FFEC77E49481403D97FF080494880485B48177F4849153F4890C9FC181F485A180F
-123F5B1807127FA24993C8FC12FFAB043FB61280A2127F7FDC0003EBC000123FA27F121F
-A26C7EA26C7F6C7F6C7F7ED97FF85C6D7E6DB45C010701C05B6D01FCEBFF3F010090B5EA
-FE0F021FECF8030203ECE0009126003FFEC9FC413B7BB94B>I<B612FCA439007FF800B3
-B3ADB612FCA41E397DB824>73 D<B7FCA426007FF8C9FCB3ACEF0780A5170F1800A35FA2
-5FA25F5F5E5EEE0FFE167FB8FCA431397DB839>76 D<B8FC17F017FEEFFF8028007FF800
-0F13C0040113E07013F0EF7FF8EF3FFCA2EF1FFEA218FFA818FEA2EF3FFCA2EF7FF8EFFF
-F04C13E0040F13C091B7120017FC17E002F8C9FCB3A4B612FCA438397DB841>80
-D<B712FCEEFFE017FC17FF28007FF8000F13C004017F707F717E717EA2717EA284A760A2
-4D5A604D5A4D5A04035B041F90C8FC91B612FC17E0839139F8003FFCEE0FFF707F707F82
-84A2707FA584A51A601AF084177F1901DD3FFE13E0B600FC011F130394390FFF87C071EB
-FF8005011400CBEA1FFC443A7DB848>82 D<D907FF130E013FEBE01E90B5EAF83E0003EC
-FE7E3A07FC01FFFE390FF0001F4848130F48481303491301007F140090C8FC167E5A163E
-A27F161E7F7F6D91C7FC13FC387FFFE014FEECFFF06C14FE6F7E6C816C15F06C816C81C6
-81133F010F801301D9000F1480EC007F030F13C01503818100F0157FA3163FA27E17807E
-167F6C16007E6D14FE01E0495A01F813039039FF801FF800FC90B512E0D8F83F5CD8F007
-49C7FC39E0007FF02A3B7BB935>I<003FB91280A4D9F800EBF003D87FC09238007FC049
-161F007EC7150FA2007C1707A200781703A400F818E0481701A4C892C7FCB3AE010FB7FC
-A43B387DB742>I<B600FC011FB512C0A426007FF8C8381FC000725AB3B3181F013F94C7
-FC8060011F163E6D6C157E187C6D6C15FC6D6D495A6D6DEB07F06D01F0EB1FE0DA7FFEEB
-FFC0021FB6C8FC02075C020014F0030F1380423A7DB849>I<B600F00103B512E0A4C601
-F0C83807F0006E5E017F5F6E150FA2013F5F6E151F011F94C7FC6E5D6D163E6F147E6D16
-7CA26F14FC6D5E6F13016D5E6F13036D5E811707027F5D6F130F023F5D6F131F021F92C8
-FC815F6E143EEE807E6E147CEEC0FC6E5C16E016E16E5C16F36E5C16FF6F5BA36F5BA26F
-90C9FCA26F5AA36F5AA26F5AA26F5A433A7EB848>I<EB3FFE0003B512E0000F14F8391F
-F00FFE003FEB03FF6D6C7F6E7FA26F7EA26C5A6C5AEA0380C8FCA2EC3FFF010FB5FC137F
-3901FFF87F00071380380FFE00EA3FF85B485A12FF5BA415FF6D5A127F263FF00713F83B
-1FFC1FBFFFC0390FFFFE1F0003EBF80F39003FE0032A257DA42E>97
-D<13FFB5FCA412077EAF4AB47E020F13F0023F13FC9138FE03FFDAF00013804AEB7FC002
-80EB3FE091C713F0EE1FF8A217FC160FA217FEAA17FCA3EE1FF8A217F06E133F6EEB7FE0
-6E14C0903AFDF001FF80903AF8FC07FE009039F03FFFF8D9E00F13E0D9C00390C7FC2F3A
-7EB935>I<903801FFC0010F13FC017F13FFD9FF8013802603FE0013C048485AEA0FF812
-1F13F0123F6E13804848EB7F00151C92C7FC12FFA9127FA27F123FED01E06C7E15036C6C
-EB07C06C6C14806C6C131FC69038C07E006DB45A010F13F00101138023257DA42A>I<EE
-7F80ED7FFFA4150381AF903801FF81010F13F1013F13FD9038FFC07F0003EB001FD807FC
-1307000F8048487F5B123FA2485AA312FFAA127FA27F123FA26C6C5B000F5C6C6C5B6C6C
-4913C02701FF80FD13FE39007FFFF9011F13E1010113012F3A7DB935>I<903803FF8001
-1F13F0017F13FC3901FF83FE3A03FE007F804848133F484814C0001FEC1FE05B003FEC0F
-F0A2485A16F8150712FFA290B6FCA301E0C8FCA4127FA36C7E1678121F6C6C14F86D14F0
-00071403D801FFEB0FE06C9038C07FC06DB51200010F13FC010113E025257DA42C>I<EC
-1FF0903801FFFC010713FF90391FF87F8090383FE0FFD9FFC113C0A2481381A24813016E
-1380A2ED3E0092C7FCA8B6FCA4000390C8FCB3ABB512FEA4223A7DB91D>I<161FD907FE
-EBFFC090387FFFE348B6EAEFE02607FE07138F260FF801131F48486C138F003F15CF4990
-387FC7C0EEC000007F81A6003F5DA26D13FF001F5D6C6C4890C7FC3907FE07FE48B512F8
-6D13E0261E07FEC8FC90CAFCA2123E123F7F6C7E90B512F8EDFF8016E06C15F86C816C81
-5A001F81393FC0000F48C8138048157F5A163FA36C157F6C16006D5C6C6C495AD81FF0EB
-07FCD807FEEB3FF00001B612C06C6C91C7FC010713F02B377DA530>I<13FFB5FCA41207
-7EAFED7FC0913803FFF8020F13FE91381F03FFDA3C01138014784A7E4A14C05CA25CA291
-C7FCB3A3B5D8FC3F13FFA4303A7DB935>I<EA01F0EA07FC487EA2487EA56C5AA26C5AEA
-01F0C8FCA913FF127FA412077EB3A9B512F8A4153B7DBA1B>I<13FFB5FCA412077EAF92
-380FFFE0A4923803FC0016F0ED0FE0ED1F804BC7FC157E5DEC03F8EC07E04A5A141FEC7F
-E04A7E8181A2ECCFFEEC0FFF496C7F806E7F6E7F82157F6F7E6F7E82150F82B5D8F83F13
-F8A42D3A7EB932>107 D<13FFB5FCA412077EB3B3ACB512FCA4163A7DB91B>I<01FED97F
-E0EB0FFC00FF902601FFFC90383FFF80020701FF90B512E0DA1F81903983F03FF0DA3C00
-903887801F000749DACF007F00034914DE6D48D97FFC6D7E4A5CA24A5CA291C75BB3A3B5
-D8FC1FB50083B512F0A44C257DA451>I<01FEEB7FC000FF903803FFF8020F13FE91381F
-03FFDA3C011380000713780003497E6D4814C05CA25CA291C7FCB3A3B5D8FC3F13FFA430
-257DA435>I<903801FFC0010F13F8017F13FFD9FF807F3A03FE003FE048486D7E48486D
-7E48486D7EA2003F81491303007F81A300FF1680A9007F1600A3003F5D6D1307001F5DA2
-6C6C495A6C6C495A6C6C495A6C6C6CB45A6C6CB5C7FC011F13FC010113C029257DA430>
-I<9039FF01FF80B5000F13F0023F13FC9138FE07FFDAF00113800003496C13C00280EB7F
-E091C713F0EE3FF8A2EE1FFCA3EE0FFEAA17FC161FA217F8163F17F06E137F6E14E06EEB
-FFC0DAF00313809139FC07FE0091383FFFF8020F13E0020390C7FC91C9FCACB512FCA42F
-357EA435>I<9038FE03F000FFEB0FFEEC3FFF91387C7F809138F8FFC000075B6C6C5A5C
-A29138807F80ED3F00150C92C7FC91C8FCB3A2B512FEA422257EA427>114
-D<90383FF0383903FFFEF8000F13FF381FC00F383F0003007E1301007C130012FC15787E
-7E6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F81203C614FC131F9038007FFE
-140700F0130114007E157E7E157C6C14FC6C14F8EB80019038F007F090B512C000F81400
-38E01FF81F257DA426>I<130FA55BA45BA25B5BA25A1207001FEBFFE0B6FCA3000390C7
-FCB21578A815F86CEB80F014816CEBC3E090383FFFC06D1380903803FE001D357EB425>
-I<01FFEC3FC0B5EB3FFFA4000714016C80B3A35DA25DA26C5C6E4813E06CD9C03E13FF90
-387FFFFC011F13F00103138030257DA435>I<B539F001FFF8A4000390C7EA1F00161E6E
-133E6C153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5C
-ECFE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA22D
-257EA432>I<B539F01FFFF0A4000390398003F8006C01C013E06C1407D97FE05B6D6C48
-5A6E48C7FC90381FFC3E010F5B903807FEFC6D6C5A5D6D5B6D5B6E7E6E7E814A7EA24A7E
-903801F3FFD903E37FD907C17FEB0FC049486C7E4A6C7E013E80496D7E49130F00016E7E
-B590383FFFF8A42D257EA432>120 D<B539F001FFF8A4000390C7EA1F00161E6E133E6C
-153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5CECFE0F
-010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA292C8FCA2
-5C141E003F133E387F803C38FFC07C147814F8EBC1F0EBC3E06C485A387D1F80D83FFFC9
-FCEA1FFCEA07F02D357EA432>I E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fb ecbx1200 12 47
-/Fb 47 122 df<157F913803FFC0020F7F4A7F91383FE1F891387F80789138FF007C4914
-3C495A163E4948131EA3130FA3163E163C167C16786E13F84B5A4B5A15075E6D6C485A4B
-C70003B512E0153E15FC6D5B5D4B91390007C0004B5E6D6D150F4FC7FC6D6D151E49173E
-496D5D491778496D15F890261FBFFE4A5AD93F3F5E9026FE1FFF1403D801FC6E495A0003
-6D5E48486C6D130F000F6F49C8FC001F6D6D133E48486C6D133C187C007F6D6D5B6F6C48
-5A00FF6E6C485A6FEB87C06F13CFEFFF806F91C9FC6D6D5B6F49EC01E06F7F6C6CEC3FFF
-706D13036C6C4A6DEB07C06C6C91B500F0130FDA800702FCEB1F806C9026E03FF89039FF
-80FF00000390B5D8F03FEBFFFE6CDBC00F5C6C6CDA00035C011F01F8D9007F13E0010301
-80020790C7FC4B477BC557>38 D<B612F8A91D097F9A25>45 D<EA07C0EA1FF0EA3FF8EA
-7FFCEAFFFEA7EA7FFCEA3FF8EA1FF0EA07C00F0F788E1F>I<EC03C01407141F147FEB03
-FF133FB6FCA413C3EA0003B3B3ADB712FCA5264177C038>49 D<ECFFE0010F13FE013F6D
-7E90B612E0000315F82607FC0313FE3A0FE0007FFFD81F806D138048C7000F13C0488001
-C015E001F07F00FF6E13F07F17F881A46C5A6C5A6C5AC9FC17F05DA217E05D17C04B1380
-4B1300A2ED1FFC4B5A5E4B5A4B5A4A90C7FC4A5A4A5AEC0FF04A5AEC3F804AC7127814FE
-495A494814F8D907E014F0495A495A49C8FC017C140149140348B7FC4816E05A5A5A5A5A
-B8FC17C0A42D417BC038>I<ECFFF0010713FF011F14C0017F14F049C66C7ED803F8EB3F
-FED807E06D7E81D80FF86D138013FE001F16C07FA66C5A6C4815806C485BC814005D5E4B
-5A4B5A4B5A4A5B020F1380902607FFFEC7FC15F815FF16C090C713F0ED3FFCED0FFEEEFF
-80816F13C017E0A26F13F0A217F8A3EA0FC0EA3FF0487EA2487EA217F0A25D17E06C5A49
-4913C05BD83F80491380D81FF0491300D80FFEEBFFFE6CB612F800015D6C6C14C0011F49
-C7FC010113E02D427BC038>I<163FA25E5E5D5DA25D5D5D5DA25D92B5FCEC01F7EC03E7
-140715C7EC0F87EC1F07143E147E147C14F8EB01F0EB03E0130714C0EB0F80EB1F00133E
-5BA25B485A485A485A120F5B48C7FC123E5A12FCB91280A5C8000F90C7FCAC027FB61280
-A531417DC038>I<0007150301E0143F01FFEB07FF91B6FC5E5E5E5E5E16804BC7FC5D15
-E092C8FC01C0C9FCAAEC3FF001C1B5FC01C714C001DF14F09039FFE03FFC9138000FFE01
-FC6D7E01F06D13804915C0497F6C4815E0C8FC6F13F0A317F8A4EA0F80EA3FE0487E12FF
-7FA317F05B5D6C4815E05B007EC74813C0123E003F4A1380D81FC0491300D80FF0495AD8
-07FEEBFFFC6CB612F0C65D013F1480010F01FCC7FC010113C02D427BC038>I<4AB47E02
-1F13F0027F13FC49B6FC01079038807F8090390FFC001FD93FF014C04948137F4948EBFF
-E048495A5A1400485A120FA248486D13C0EE7F80EE1E00003F92C7FCA25B127FA2EC07FC
-91381FFF8000FF017F13E091B512F89039F9F01FFC9039FBC007FE9039FF8003FF17804A
-6C13C05B6F13E0A24915F0A317F85BA4127FA5123FA217F07F121FA2000F4A13E0A26C6C
-15C06D4913806C018014006C6D485A6C9038E01FFC6DB55A011F5C010714C0010191C7FC
-9038003FF02D427BC038>I<121E121F13FC90B712FEA45A17FC17F817F017E017C0A248
-1680007EC8EA3F00007C157E5E00785D15014B5A00F84A5A484A5A5E151FC848C7FC157E
-5DA24A5A14035D14074A5AA2141F5D143FA2147F5D14FFA25BA35B92C8FCA35BA55BAA6D
-5A6D5A6D5A2F447AC238>I<EC7FF00103B5FC010F14C0013F14F090397F801FFC3A01FC
-0003FE48486D7E497F4848EC7F80163F484815C0A2001F151FA27FA27F7F01FE143F6D15
-8002C0137F02F014006C01FC5B6E485A6C9038FF83FCEDE7F86CECFFE06C5D6C92C7FC6D
-14C06D80010F14F882013F8090B7FC48013F14802607FC0F14C0260FF80314E04848C6FC
-496D13F0003F141F48481307496D13F8150000FF157F90C8123F161F160FA21607A36D15
-F0127F160F6D15E06C6C141F6DEC3FC06C6CEC7F80D80FFE903801FF003A07FFC00FFE6C
-90B55AC615F0013F14C0010F91C7FC010013F02D427BC038>I<EC7FF0903807FFFE011F
-6D7E017F14E09039FFE03FF0489038800FF848496C7E48488048486D7E001F80003F1680
-A2484815C08117E0A212FF17F0A617F8A45D127FA3003F5CA26C7E5D6C6C5B12076C6C13
-1E6CEBC07C6CEBFFF8013F5B010F01C013F00101130090C8FCA217E05DA2EA03C0D80FF0
-15C0487E486C491380A217004B5A150F5E49495A6C48495A01C0EBFFE0260FF0035B6CB6
-5A6C4AC7FC6C14F86C6C13E0D907FEC8FC2D427BC038>I<EE1F80A24C7EA24C7EA34C7E
-A24B7FA34B7FA24B7FA34B7F169F031F80161F82033F80ED3E07037E80157C8203FC804B
-7E02018115F0820203814B137F0207815D173F020F814B7F021F8292C77EA24A82023E80
-027E82027FB7FCA291B87EA2498302F0C8FCA20103834A157F0107834A153FA249488284
-011F8491C97E4984133E017E82B6020FB612F0A54C457CC455>65
-D<DCFFF01470031F01FF14F04AB6EAE0010207EDF803023FEDFE0791B539E001FF0F4949
-C7EA3F9F010701F0EC0FFF4901C0804990C87E4948814948814948167F4849163F484916
-1F5A4A160F485B19074890CAFC19035A5BA2007F1801A34994C7FC12FFAE127F7F1AF0A2
-123FA27F6C18011AE06C7F19036C6D17C06E16077E6C6DEE0F806C6DEE1F006D6C5E6D6C
-167E6D6C6C5D6D6D4A5A6D01F0EC07F0010101FEEC1FE06D903AFFF001FF80023F90B6C7
-FC020715FC020115F0DA001F1480030001F8C8FC44467AC451>67
-D<B9FC18F018FE727E19E026003FFEC7001F13F805017F9438003FFF060F7F727F727F72
-7F84737E737EA2737EA2737EA21B80A2851BC0A51BE0AD1BC0A51B8061A21B006162193F
-624F5A19FF624E5B06075B4E5B063F90C7FC4DB45A050F13F8BA5A19C04EC8FC18F095C9
-FC4B447CC356>I<BA12F8A485D8001F90C71201EF003F180F180318011800A2197E193E
-A3191EA21778A285A405F890C7FCA316011603161F92B5FCA5ED001F160316011600A2F1
-01E01778A2F103C0A494C7FC1907A21A80A2190FA2191FA2193FF17F0061601807181F4D
-B5FCBBFC61A443447DC34A>I<DCFFF01470031F01FF14F04AB6EAE0010207EDF803023F
-EDFE0791B539E001FF0F4949C7EA3F9F010701F0EC0FFF4901C0804990C87E4948814948
-814948167F4849163F4849161F5A4A160F485B19074890CAFC19035A5BA2007F1801A349
-94C8FC12FFAD057FB612F0127F7FA3003FDC0001EBF000A27F7EA26C7FA26C7F807E6C7F
-6C7F6D7E6D6C5D6D6C7E6D6D5C6D01F05C010101FE143F6D903AFFF001FF9F023F90B612
-0F0207EDFC030201EDF000DA001F02C01330030001FCC9FC4C467AC458>71
-D<B7D88003B612FEA526003FFEC9EBF800B3A791B9FCA54AC9FCB3AAB7D88003B612FEA5
-4F447CC358>I<B712F0A526003FFECAFCB3B1F00780A4180F1900A460A360A2187EA218
-FE170117031707171F177FEE03FFB95AA539447CC343>76 D<B500FE067FB512806E95B6
-FCA26F5EA2D8003F50C7FC013D6DEE03DFA2013C6DEE079FA26E6CEE0F1FA26E6C161EA2
-6E6C163CA36E6C1678A26E6C16F0A26E6DEC01E0A26E6DEC03C0A36E6DEC0780A26F6CEC
-0F00A26F6C141EA26F6C5CA36F6C5CA26F6C5CA26F6D485AA26F6D485AA26F6D485AA370
-6C48C7FCA293383FF81EA2706C5AA2706C5AA3706C5AA2705BA2705BA2705BA2B6057FB6
-128071C7FCA2173E171C61447CC36A>I<B64BB512FE8181A281D8003F6D91C7EA780081
-013D7F81133C6E7E6E7F6E7F6E7F6E7F82806E7F6E7F6F7E6F7F83816F7F6F7F6F7F6F7F
-6F7F8382707F707F707F707F8482707F707F717E7113807113C019E0837113F07113F871
-13FC7113FE19FF847213F884848484A28484197F193F191FA2190F1907B6160319011900
-1A78A24F447CC358>I<923807FFC092B512FE0207ECFFC0021F15F091267FFE0013FC90
-2601FFF0EB1FFF01070180010313C04990C76C7FD91FFC6E6C7E49486F7E49486F7E01FF
-8348496F7E48496F1380A248496F13C0A24890C96C13E0A24819F04982003F19F8A3007F
-19FC49177FA400FF19FEAD007F19FC6D17FFA3003F19F8A26D5E6C19F0A26E5D6C19E0A2
-6C6D4B13C06C19806E5D6C6D4B13006C6D4B5A6D6C4B5A6D6C4B5A6D6C4A5B6D01C00107
-5B6D01F0011F5B010101FE90B5C7FC6D90B65A023F15F8020715C002004AC8FC030713C0
-47467AC454>I<B9FC18F018FE727E19E0D8001F90C7000F7F05017F716C7E727E727E72
-1380A21AC084A21AE0A91AC0A24E1380A21A00604E5A4E5A4D485A050F5B92B712C096C7
-FC18FC18C092CBFCB3A7B712E0A543447DC34D>I<B812F8EFFFC018F818FE727ED8001F
-90C7003F13E005037F05007F727E727E727EA28684A286A762A24E90C7FCA24E5A61187F
-943801FFF005075B053F138092B7C8FC18F818E018F892C77FEF3FFF050F7F717F717FA2
-717FA2717FA785A61B0F85A2187F73131F72141EB700E06DEB803E72EBE0FC72EBFFF806
-0114F0726C13E0CC0007138050457DC354>82 D<DAFFE0131C010701FE133C013F9038FF
-807C90B6EAE0FC4815F9489038801FFF3907FC00014848EB007F4848143F4848140F4914
-07007F15035B1601160012FF177CA27FA26D153C7F7F6D92C7FC6C7EEBFFE014FE6CEBFF
-F015FF6C15E016FC6C816C6F7E6C826C826C6C81011F810107811300020F80140003077F
-ED007F82040F1380828212F082A282A27EA218007EA26C5D6C5E6D14036D5D6D140701F8
-4A5A01FFEC3FF002F8EBFFE0486CB65AD8FC1F92C7FCD8F80714FC48C614F04801071380
-31467AC43E>I<003FBA12E0A59026FE000FEB8003D87FE09338003FF049171F90C71607
-A2007E1803007C1801A300781800A400F819F8481978A5C81700B3B3A20107B8FCA54543
-7CC24E>I<B792B6FCA526003FFECAEAFC00806D606F15016D608119036D606F15076D60
-6F150F6D6081191F6D6D93C7FC61027F163E6F157E023F167C8119FC6E6D5C18016E5E70
-13036E5E8218076E6D5C180F6E5E70131F6E93C8FC705B037F143E82187E033F147C7013
-FC6F5C17816F5C17C117C36F5C17E76F5C17FF6F5CA36F91C9FCA2705AA2705AA3705AA2
-705AA2705AA250457EC355>86 D<903801FFE0011F13FE017F6D7E48B612E03A03FE007F
-F84848EB1FFC6D6D7E486C6D7EA26F7FA36F7F6C5A6C5AEA00F090C7FCA40203B5FC91B6
-FC1307013F13F19038FFFC01000313E0481380381FFE00485A5B127F5B12FF5BA35DA26D
-5B6C6C5B4B13F0D83FFE013EEBFFC03A1FFF80FC7F0007EBFFF86CECE01FC66CEB8007D9
-0FFCC9FC322F7DAD36>97 D<EB7FC0B5FCA512037EB1ED0FF892B57E02C314E002CF14F8
-9139DFC03FFC9139FF000FFE02FCEB03FF4A6D13804A15C04A6D13E05CEF7FF0A218F817
-3FA318FCAC18F8A2177F18F0A3EFFFE06E15C06E5B6E491380027C491300496C495A903A
-FC1FC07FFC496CB512F0D9F00314C049C691C7FCC8EA1FF036467DC43E>I<EC3FFC49B5
-12C0010F14F0013F14FC90397FF003FE9039FFC001FF0003495A48494813805B120F485A
-A2485A6F1300007F6E5AED00784991C7FCA212FFAC6C7EA3123F6DEC03C0A26C6C140700
-0F16806D140F6C6DEB1F006C6D133E6C01F05B3A007FFC03F86DB55A010F14C0010391C7
-FC9038003FF82A2F7CAD32>I<EE03FEED07FFA5ED001F160FB1EC3FE0903803FFFC010F
-EBFF8F013F14CF9039FFF807FF48EBC00148903880007F4890C7123F4848141F49140F12
-1F485AA3127F5BA212FFAC127FA37F123FA26C6C141FA26C6C143F0007157F6C6C91B5FC
-6CD9C00314FC6C9038F01FEF6DB5128F011FEBFE0F010713F89026007FC0EBF80036467C
-C43E>I<EC3FF80103B57E010F14E0013F8090397FF83FF89039FFC007FC48496C7E4849
-6C7E48486D1380485A001FED7FC05B003FED3FE0A2127F5B17F0161F12FFA290B7FCA401
-F0C9FCA5127FA27FA2123F17F06C7E16016C6C15E06C6C14036C6DEB07C06C6DEB0F806C
-01F0EB3F0090397FFE01FE011FB55A010714F0010114C09026001FFEC7FC2C2F7DAD33>
-I<DAFFE0137E010F9039FE03FF80013FEBFF8F90B812C048D9C07F133F489038001FF848
-48EB0FFC4848903907FE1F80001F9238FF0F00496D90C7FCA2003F82A8001F93C7FCA26D
-5B000F5D6C6C495A6C6C495A6C9038C07FF04890B55A1680D8078F49C8FC018013E0000F
-90CAFCA47F7F7F90B612C016FC6CEDFF8017E06C826C16FC7E000382000F82D81FF0C77E
-D83FC014074848020113808248C9FC177FA46D15FF007F17006D5C6C6C4A5A6C6C4A5AD8
-0FFEEC3FF83B07FFC001FFF0000190B612C06C6C92C7FC010F14F8D9007F90C8FC32427D
-AC38>103 D<EB7FC0B5FCA512037EB1ED07FE92383FFF8092B512E002C114F89139C7F0
-3FFC9138CF801F9139DF000FFE14DE14FC4A6D7E5CA25CA35CB3A7B60083B512FEA53745
-7CC43E>I<137C48B4FC4813804813C0A24813E0A56C13C0A26C13806C1300EA007C90C7
-FCAAEB7FC0EA7FFFA512037EB3AFB6FCA518467CC520>I<EC03E0EC0FF8EC1FFCEC3FFE
-A2EC7FFFA5EC3FFEA2EC1FFCEC0FF8EC03E091C7FCAAEC01FF0103B5FCA5EB000F80B3B3
-A7EA1F80EA3FC0EA7FE0EAFFF0EC0FFEA215FC141F01E013F8007FEB3FF0393FC0FFE06C
-B512806C1400000313FCC613C0205A86C522>I<EB7FC0B5FCA512037EB3B3B3A3B61280
-A519457CC420>108 D<90277F8007FEEC0FFCB590263FFFC090387FFF8092B5D8F001B5
-12E002816E4880913D87F01FFC0FE03FF8913D8FC00FFE1F801FFC0003D99F009026FF3E
-007F6C019E6D013C130F02BC5D02F86D496D7EA24A5D4A5DA34A5DB3A7B60081B60003B5
-12FEA5572D7CAC5E>I<90397F8007FEB590383FFF8092B512E0028114F8913987F03FFC
-91388F801F000390399F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083B512FEA5
-372D7CAC3E>I<EC1FFC49B512C0010714F0011F14FC90397FF80FFF9026FFC0017F4849
-6C7F4848C7EA3FE000078248486E7E49140F001F82A2003F82491407007F82A400FF1780
-AA007F1700A46C6C4A5AA2001F5E6D141F000F5E6C6C4A5AA26C6C6CEBFFE06C6D485B27
-007FF80F90C7FC6DB55A010F14F8010114C09026001FFCC8FC312F7DAD38>I<90397FC0
-0FF8B590B57E02C314E002CF14F89139DFC03FFC9139FF001FFE000301FCEB07FF6C496D
-13804A15C04A6D13E05C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FFA24C13E06E15
-C06E5B6E4913806E4913006E495A9139DFC07FFC02CFB512F002C314C002C091C7FCED1F
-F092C9FCADB67EA536407DAC3E>I<90387F807FB53881FFE0028313F0028F13F8ED8FFC
-91389F1FFE000313BE6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7FCA35CB3A5B6
-12E0A5272D7DAC2E>114 D<90391FFC038090B51287000314FF120F381FF003383FC000
-49133F48C7121F127E00FE140FA215077EA27F01E090C7FC13FE387FFFF014FF6C14C015
-F06C14FC6C800003806C15806C7E010F14C0EB003F020313E0140000F0143FA26C141F15
-0FA27EA26C15C06C141FA26DEB3F8001E0EB7F009038F803FE90B55A00FC5CD8F03F13E0
-26E007FEC7FC232F7CAD2C>I<EB01E0A51303A41307A2130FA2131FA2133F137F13FF12
-03000F90B51280B7FCA4C601E0C7FCB3A3ED01E0A9150302F013C0137F150790393FF80F
-8090391FFC1F006DB5FC6D13FC01015B9038003FE023407EBE2C>I<D97FC049B4FCB501
-03B5FCA50003EC000F6C81B3A85EA25EA25E7E6E491380017FD901F713FE9138F807E76D
-B512C7010F1407010313FE9026007FF0EBFC00372E7CAC3E>I<B6903803FFFCA5000101
-E09038003E006C163C80017F5D8017F8013F5D6E1301011F5D6E1303010F5D6E13076D5D
-ED800F6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8F8023F5B15FD021F
-5B15FF6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578362C7EAB3B>I<B6903803FFFCA5
-000101E09038003E006C163C80017F5D8017F8013F5D6E1301011F5D6E1303010F5D6E13
-076D5DED800F6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8F8023F5B15
-FD021F5B15FF6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578A215F85D14015D001F1303
-D83F805B387FC007D8FFE05B140F92C9FC5C143E495A387FC1F8EB07F06CB45A6C5B0007
-90CAFCEA01FC36407EAB3B>121 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fc ectt1000 10 59
-/Fc 59 126 df<121FEA3F80EA7FC0EAFFE0B0EA7FC0AEEA1F00C7FCA7121FEA3F80EA7F
-C0EAFFE0A5EA7FC0EA3F80EA1F000B3470B32C>33 D<003C131E007F137F481480A66C14
-00A6007E7FA6003E133EA3003C131E001C131C191977B32C>I<143814FC13011303EB07
-F8EB0FF0EB1FC0EB3F80EB7F0013FE485A485A5B12075B120F5B485AA2123F90C7FCA25A
-127EA312FE5AAC7E127EA3127F7EA27F121FA26C7E7F12077F12037F6C7E6C7E137FEB3F
-80EB1FC0EB0FF0EB07F8EB03FC130113001438164272B92C>40 D<127012FC7E7E6C7E6C
-7EEA0FE06C7E6C7E6C7E6C7E137F7F1480131F14C0130FEB07E0A214F01303A214F81301
-A314FC1300AC130114F8A3130314F0A2130714E0A2EB0FC0131F1480133F14005B13FE48
-5A485A485A485AEA3FC0485A48C7FC5A5A1270164279B92C>I<EA0F80EA1FE0EA3FF0EA
-7FF8A213FCA3123F121F120F120013F8A21201EA03F01207EA1FE0EA7FC0EAFF80130012
-FC12700E17718A2C>44 D<007FB512F0B612F8A36C14F01D0579942C>I<121FEA3F80EA
-7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B708A2C>I<1507ED0F80A2151F16005D153E15
-7E157CA215FC5D14015D14035D14075D140F5D141F92C7FC5C143EA2147E147C14FC5C13
-015C13035C13075C130F5C131F91C8FC5B133EA2137E137C13FC5B12015B12035B12075B
-120F5B121F90C9FCA25A123E127E127C12FC5AA2127021417BB92C>I<EB03F8EB0FFE90
-383FFF80497F90B57E3901FE0FF03903F803F848486C7EEBE0004848137EA248487FA248
-C7EA1F80A2003E140F007E15C0A3007C140700FC15E0AC6C140F007E15C0A46CEC1F80A3
-6C6CEB3F00A26C6C137E6D13FE00075CEBF0016C6C485A3901FE0FF06CB55A6D5B6D5BD9
-0FFEC7FCEB03F823357CB32C>I<1307497EA2131FA2133F137F13FF5A1207127FB5FC13
-DF139FEA7C1F1200B3AE007FB512E0B612F0A36C14E01C3477B32C>I<121FEA3F80EA7F
-C0EAFFE0A5EA7FC0EA3F80EA1F00C7FCAE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA
-1F000B2470A32C>58 D<EA0F80EA1FC0EA3FE0EA7FF0A5EA3FE0EA1FC0EA0F80C7FCAEEA
-0F80EA1FE0EA3FF0EA7FF8A213FCA3123F121F120F120013F8A21201EA03F01207EA1FE0
-EA7FC0EAFF80130012FC12700E3071A32C>I<007FB612F0B712F8A36C15F0CAFCA8007F
-B612F0B712F8A36C15F025127DA12C>61 D<EC7F80903803FFE0010F7F013F7F497F9038
-FFC0FE3901FE007FD803F87F4848EB1F809038E00FCF390FC03FFF48484813C091B5FCEA
-3F01393E03F87F903907F03FE0007EEBE01F397C0FC00FEC8007A2EAFC1F00F8EB0003A9
-00FCEB8007D87C0F14C0A2ECC00F3A7E07E01F80003EEBF03F903903F87F00393F01FFFE
-D81F805B6E5A6C6C6C5A3907E00FC09039F00007C06C6CEB0FE0D801FE131F3900FFC0FF
-6DB512C06D1480010FEBFE00010313F89038007FC023337CB22C>64
-D<14FE497EA4497FA214EFA2130781A214C7A2010F7FA314C390381F83F0A590383F01F8
-A490387E00FCA549137E90B512FEA34880A29038F8003FA34848EB1F80A4000715C04913
-0FD87FFEEBFFFC6D5AB514FE6C15FC497E27347EB32C>I<02FF13700107EBE0F84913F9
-013F13FD4913FFEBFF813901FE007F4848131FD807F0130F1507485A491303485A150148
-C7FCA25A007EEC00F01600A212FE5AAB7E127EA3007F15F06CEC01F8A26C7EA26C6C1303
-6D14F06C6C130716E0D803FC131F6C6CEB3FC03A00FF81FF806DB512006D5B010F5B6D13
-F00100138025357DB32C>67 D<007FB612F0B712F8A37E3903F00001A7ED00F01600A4EC
-01E04A7EA490B5FCA5EBF003A46E5A91C8FCA5163C167EA8007FB612FEB7FCA36C15FC27
-337EB22C>69 D<903901FC038090390FFF87C04913EF017F13FF90B6FC4813073803FC01
-497E4848137F4848133F49131F121F5B003F140F90C7FCA2127EED078092C7FCA212FE5A
-A8913803FFF84A13FCA27E007E6D13F89138000FC0A36C141FA27F121F6D133F120F6D13
-7F6C7E6C6C13FF6D5A3801FF076C90B5FC6D13EF011F13CF6DEB0780D901FCC7FC26357D
-B32C>71 D<D87FFEEBFFFCB54813FEA36C486C13FCD807E0EB0FC0B190B6FCA59038E000
-0FB3D87FFEEBFFFCB54813FEA36C486C13FC27337EB22C>I<007FB512F8B612FCA36C14
-F839000FC000B3B3A5007FB512F8B612FCA36C14F81E3379B22C>I<387FFFE0B57EA36C
-5BD803F0C8FCB3AE16F0ED01F8A8007FB6FCB7FCA36C15F025337DB22C>76
-D<D87FE0EB0FFC486CEB1FFEA26D133F007F15FC000F15E001BC137BA4019E13F3A3EB9F
-01A2018F13E3A21483A2018713C314C7A201831383A214EFA201811303A214FFEB80FEA3
-147C14381400ACD87FF0EB1FFC486CEB3FFEA36C48EB1FFC27337EB22C>I<D87FF0EB7F
-FC486CEBFFFEA27F007FEC7FFCD807FEEB07C013DEA213DF13CFA2148013C714C0A213C3
-14E0A213C114F0A213C014F8A2147CA3143EA2141E141FA2140F1587A2140715C7A21403
-15E71401A215F71400A215FFD87FFC137F487E153FA26C48EB1F8027337EB22C>I<EB7F
-FF0003B512E0000F14F848804880EBE003EB800048C7127FA2007E80A300FE158048141F
-B3A86C143FA2007E1500A3007F5CA26C6C13FEEBF00790B5FC6C5C6C5C000314E0C66C90
-C7FC21357BB32C>I<007FB512C0B612F88115FF6C15802603F00013C0153FED0FE0ED07
-F0A2150316F81501A6150316F01507A2ED0FE0ED3FC015FF90B61280160015FC5D15C001
-F0C8FCB0387FFF80B57EA36C5B25337EB22C>I<387FFFFCB67E15E015F86C803907E007
-FE1401EC007F6F7E151FA26F7EA64B5AA2153F4BC7FCEC01FE140790B55A5D15E0818190
-38E007FCEC01FE1400157F81A8160FEE1F80A5D87FFEEB1FBFB5ECFF00815E6C486D5AC8
-EA01F029347EB22C>82 D<90381FF80790B5EA0F804814CF000714FF5A381FF01F383FC0
-03497E48C7FC007E147F00FE143F5A151FA46CEC0F00007E91C7FC127F7FEA3FE0EA1FFC
-EBFFC06C13FC0003EBFFC06C14F06C6C7F01077F9038007FFEEC07FF02001380153FED1F
-C0A2ED0FE0A20078140712FCA56CEC0FC0A26CEC1F806D133F01E0EB7F009038FE01FF90
-B55A5D00F914F0D8F83F13C0D8700790C7FC23357CB32C>I<007FB612FCB712FEA43AFC
-007E007EA70078153CC71400B3AF90383FFFFCA2497F6D5BA227337EB22C>I<D87FFCEB
-7FFC486CEBFFFEA36C48EB7FFCD80FC0EB07E06D130F000715C0A36D131F00031580A36D
-133F00011500A36D5B0000147EA4017E5BA46D485AA490381F83F0A4010F5B14C7A30107
-5BA214EFA201035BA214FFA26D90C7FCA46D5A27347EB22C>86 D<D87FFCEB7FFC486CEB
-FFFEA36C48EB7FFCD807F0EB0FC0151F000315806D133F12016DEB7F0012006D137E017E
-13FE017F5BEB3F01EC81F8131FEC83F0EB0FC314C7903807E7E0A201035B14EF6DB45AA2
-92C7FC7F5C147EB0903807FFE0497FA36D5B27337EB22C>89 D<003FB612C04815E0A400
-7EC7EA1FC0ED3F80A2ED7F00157E15FE4A5A003C5CC712034A5AA24A5A4A5AA24A5A4AC7
-FCA214FE495AA2495A495AA2495A495AA2495A49C8FCA213FE485AA24848EB03C049EB07
-E01207485A5B121F485AA248C7FCB7FCA46C15C023337CB22C>I<007FB6FCB71280A46C
-150021067B7D2C>95 D<3801FFF0000713FE001F6D7E15E048809038C01FF81407EC01FC
-381F80000006C77EC8127EA3ECFFFE131F90B5FC1203120F48EB807E383FF800EA7FC090
-C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001EBFE1F3A003F
-F007FC27247CA32C>97 D<EA7FF0487EA3127F1201AAEC1FE0ECFFF801FB13FE90B6FC16
-809138F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE167EA816FE6D
-14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B51280160001FB5B01F8
-13F83900F03FC027337FB22C>I<903803FFE0011F13F8017F13FE48B5FC48804848C6FC
-EA0FF0485A49137E4848131890C9FC5A127EA25AA8127EA2127F6C140F6DEB1F806C7E6D
-133F6C6CEB7F003907FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC21247AA32C>I<
-EC0FFE4A7EA380EC003FAAEB07F8EB3FFE90B512BF4814FF5A3807FC0F380FF00348487E
-497E48487F90C7FC007E80A212FE5AA87E007E5CA2007F5C6C7E5C6C6C5A380FF0073807
-FC1F6CB612FC6CECBFFE6C143FEB3FFC90390FF01FFC27337DB22C>I<EB03FE90381FFF
-C0017F13F048B57E48803907FE03FE390FF800FFD81FE0EB3F805B4848EB1FC090C7120F
-5A007E15E015075AB7FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0
-130F6C6CEB3FC001FF13FF000190B512806C1500013F13FC010F13F00101138023247CA3
-2C>I<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE03F0014C092C7FCA600
-7FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB22C>I<ED03
-F8903907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003133E3A
-0FE001FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC0FF048
-B5FC5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF804815E0
-4815F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48153EA46C157E007E15
-FCD87F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13F80107
-13C028387EA42C>I<EA7FF0487EA3127F1201AAEC1FE0EC7FFC9038F9FFFE01FB7F90B6
-FC9138F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E014
-0029337FB22C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC7E
-A2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>I<140EEC3F80A2EC7FC0A3EC
-3F80A2EC0E0091C7FCA748B512804814C0A37EC7120FB3B3A2141F003C1480007E133FB4
-14005CEB01FEEBFFFC6C5B5C001F5B000790C7FC1A467CB32C>I<EA7FE0487EA3127F12
-01AA91381FFFF04A13F8A36E13F0913800FE004A5A4A5A4A5A4A5A4A5A4A5A4AC7FC14FE
-EBF1FC13F3EBF7FE90B5FCA2EC9F80EC0FC001FE7FEBFC07496C7E496C7E811400157E81
-1680151F3A7FFFC0FFFCB500E113FEA36C01C013FC27337EB22C>I<387FFFE0B57EA37E
-EA0003B3B3A5007FB61280B712C0A36C158022337BB22C>I<3A7F83F007E09039CFFC1F
-F83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01F013E001E0
-13C0A301C01380B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0023F137F2D
-2481A32C>I<397FF01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038F03F80ECC0
-1F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029247FA32C>I<
-EB07FCEB1FFF017F13C048B512F048803907FC07FC390FF001FE48486C7E0180133F003F
-158090C7121F007EEC0FC0A348EC07E0A76C140F007E15C0A2007F141F6C15806D133F6C
-6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07FC23247CA3
-2C>I<397FF01FE039FFF8FFF801FB13FE90B6FC6C158000019038F07FC09138801FE091
-380007F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036DEB07
-F0150F9138801FE09138E07FC091B51280160001FB5B01F813F8EC3FC091C8FCAD387FFF
-E0B57EA36C5B27367FA32C>I<D87FFEEB3FC0B53801FFF0020713F8021F13FC6C5B3900
-3F7FE1ECFF019138FC00F84A13704A13005CA25C5CA391C8FCAF007FB512E0B67EA36C5C
-26247EA32C>114 D<90387FF8700003B512F8120F5A5A387FC00F387E00034813015AA3
-6CEB00F0007F140013F0383FFFC06C13FE6CEBFF80000314E0C66C13F8010113FCEB0007
-EC00FE0078147F00FC143F151F7EA26C143F6D133E6D13FE9038F007FC90B5FC15F815E0
-00F8148039701FFC0020247AA32C>I<131E133FA9007FB6FCB71280A36C1500D8003FC8
-FCB1ED03C0ED07E0A5EC800F011FEB1FC0ECE07F6DB51280160001035B6D13F89038003F
-E0232E7EAD2C>I<3A7FF003FF80486C487FA3007F7F0001EB000FB3A3151FA2153F6D13
-7F3900FE03FF90B7FC6D15807F6D13CF902603FE07130029247FA32C>I<3A7FFF01FFFC
-B514FE148314016C15FC3A03E0000F80A26D131F00011500A26D5B0000143EA26D137E01
-7C137CA2017E13FC013E5BA2EB3F01011F5BA21483010F5BA214C701075BA214EF01035B
-A214FF6D90C7FCA26D5A147C27247EA32C>I<D87FFFEB7FFF6EB5FCB515806C16004A7E
-D807C0EB01F0A66C6C495AA3143E147FA2D801F0495AECFF87A214F7A201F113C700005D
-9038F9E3CFA201FB13EFA3D97BC190C7FC017F13FFA21480A2013F5B90381F007C29247F
-A32C>I<3A3FFF03FFF048018713F8A36C010313F03A00FC007E005D90387E01F8013F5B
-EB1F83EC87E090380FCFC0903807EF80EB03FF6D90C7FC5C6D5A147C14FE130180903803
-EF80903807CFC0EB0FC7EC83E090381F01F0013F7FEB7E00017C137C49137E0001803A7F
-FF01FFFC1483B514FE6C15FC140127247EA32C>I<3A7FFF01FFFCB5008113FE14831481
-6C010113FC3A03E0000F806C7E151F6D140012005D6D133E137C017E137E013E137CA201
-3F13FC6D5BA2EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB00FFA292C7FC
-80A2143EA2147E147CA214FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F495A387FFF806C
-90C8FC6C5A6C5AEA07E027367EA32C>I<003FB612E04815F0A4007EC7EA1FE0ED3FC0ED
-7F80EDFF004A5A003C495AC7485A4A5A4A5A4A5A4A5A4AC7FCEB01FC495AEB0FF0495A49
-5A495A49C8FC4848EB01E04848EB03F0485A485A485A485A485AB7FCA46C15E024247DA3
-2C>I<15FF02071380141F147F91B512004913C04AC7FCEB03F85CB31307EB1FE013FF00
-7F5BB55A49C8FC6D7E6C7FC67F131FEB07F01303B380EB01FEECFFC06D13FF6E1380141F
-14070200130021417BB92C>I<EA7FC0EAFFF813FE6D7E6C7FC67F131FEB07F01303B380
-EB01FEECFFC06D13FF6E1380141F147F91B512004913C04AC7FCEB03F85CB31307EB1FE0
-13FF007F5BB55A49C8FC13F8EA7FC021417BB92C>125 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fd ecbx1440 14.4 41
-/Fd 41 122 df<DC7FFEECFFC0031FB5D8801F13F092B6D8E07F13FC020703F9B57E021F
-D9C007B5EAC1FF91277FFE000102071380DAFFF8010713FC010301E049494813C0495B49
-494913F04990C7FC19E0495A741380017F17C04A6E6E130071EC00FC98C7FCAEBB12FEA5
-26007FFCC7000701C0C8FCB3B3A7007FB5D8FC07B612F0A552547DD34D>27
-D<151E153E15FE1403140F147FEB07FF0003B5FCB6FCA3EBF87FEAFC00C7FCB3B3B3A600
-7FB712FCA52E4E76CD42>49 D<EC1FFE49B512F0010F14FC013FECFF804915E02701FF80
-3F7F2703FC000713FCD807F001017F48486D7FD81F806E138048C87E7013C0D87FE016E0
-01F8806D16F000FF817F7013F8A56C5AA26C5A6C5AEA0380C914F05EA218E05E18C05E18
-804C13005F4C5A4C5A5F4B5B4B5B4B5B94C7FCED0FFC4B5A4B5AED7FC04B5A4A90C8FCEC
-03FC4A5A4A4814F84A5A4A5A4AC8FC02FEEC01F0495A495A495A5CD90F80140349C8FC01
-3E1507017FB7FC90B812E05A5A5A5A5A5A5AB9FC18C0A4354E7ACD42>I<913807FFC002
-7F13FC0103B67E010F15E090261FF80313F890267FC0007F01FEC7EA3FFE48488148486E
-138013FE486C6C6D13C0804817E080A66C5B18C06C5B6C90C75AD80038168090C8FC4C13
-00A24C5A5F4C5A4B5B4B13C0030F5BDB7FFEC7FC91387FFFF816C016FCEEFF80DA000313
-E09238007FF8EE3FFE707E70138018C07013E018F07013F8A218FC82A218FEA3EA03C0EA
-0FF0EA3FFC487EA2B5FCA218FCA25E18F8A26C4816F0495C4916E0D83FE04A13C06C485C
-D80FF04A1380D807FE91387FFE003B03FFE003FFFC6C90B65A6C6C15E0010F92C7FC0101
-14FCD9001F1380374F7BCD42>I<17FC1601A216031607160FA2161F163F167FA216FF5D
-5DA25D5D5D167F153E157E15FC15F8EC01F01403EC07E015C0EC0F80141FEC3F00143E5C
-14FC495A5C495A1307495A5C49C7FC5B137E137C5B1201485A5B485A120F485A90C8FC12
-3E127E5ABA1280A5C901FCC7FCAF021FB71280A5394F7CCE42>I<486C150601F0153E01
-FEEC01FED9FFF0133F91B65A5F5F5F5F5F94C7FC16FC5E16E093C8FC15FC01F0138091CA
-FCAC913807FF80023F13F891B512FE01F36E7E9026FFFC0113E09139E0007FF891C76C7E
-496E7E01F86E7E5B7013804916C0C9FC18E08218F0A418F8A31203EA0FE0EA3FF8487EA2
-12FF7FA218F0A25B5E6C4816E05B01C016C06CC85A18806C6C4A13007FD80FF04A5A6C6C
-ECFFFCD803FE4913F02701FFE00F5B6C6CB612806D92C7FC010F14F8010114C09026003F
-FCC8FC354F7ACD42>I<ED07FE92B512C0020314F0021F14FC91397FFC01FE9139FFE000
-7F01030180EB3F804990C7121F4948EC7FC0494814FF4948010313E0495A49485B5A485B
-A2485BA2486F13C091C7FC4803001300177E94C7FC5AA25B127FA2ED3FF04AB5FC020714
-C000FF4914F091391F807FF891393E001FFE02786D7E4A6D13807013C06D5A4A6D13E018
-F05C7013F8A291C813FCA44916FEA3127FA6123FA37F6C17FCA36C17F85E7E6E15F06C17
-E06C6D5B6E15C06C4B13806D6C491300D93FFC495A6DB4EBFFFC010790B512F06D5D0100
-1580021F01FCC7FC020313C0374F7BCD42>I<121F7F7FEBFF8091B8FCA45A18FE18FC18
-F818F0A218E018C018804817000180C8123E007EC9127E5F007C4B5A4C5A5F16074C5A48
-4B5A4CC7FC167E167CC912FC4B5A4B5AA24B5A150F4B5AA24B5AA24BC8FC5DA25C5D1403
-A214075D140FA3141FA2143FA34A5AA414FFA65BAB6D5B6E5A6E5A6E5A385279D042>I<
-913803FFC0023F13FC49B67E010715E090260FFC0013F8D93FE0EB1FFCD97F80EB07FE49
-C76C7E496E1380484880000317C049157F120718E0173F120FA27FA27F7F6E147F02E015
-C08002FC14FF6C01FF15806F481300EDE0036C9138F807FE6F485A6C9138FF1FF06CEDFF
-E017806D4AC7FC7F010F6E7E6D81010115F06D81010315FE010F81D93FF71580D97FC115
-C02701FF807F14E048EB001F48486D14F04848010314F848481300496E13FC003F151F49
-1407007F6F13FE491400177F00FF163F49151F170F1707A21703A218FCA27F127F6DED07
-F8A26C6CED0FF07F6C6CED1FE06C6CED3FC06C6CEDFF806C01C0010313006C01FCEB3FFE
-6C6CB612F8011F15E001071580010002FCC7FC020F13C0374F7BCD42>I<913807FF8002
-7F13F849B512FE01076E7E90261FFE0113E0903A7FF8003FF049486D7E48496D7E48496D
-7E484980486F138091C7FC486F13C05A18E0485A18F0A27013F812FFA318FCA618FEA35E
-127FA4003F5DA26C7E5E7E6C6D5B161E6C7F6C6D5B6C6C6C13F890393FFC03F06DB55A01
-074A13FC01001400EC1FF891C8FCA218F85EA301FC16F0487E2607FF8015E05E486D15C0
-A24C1380A24C13005F4A131F6C4B5A49C7485A494A5A6C48495B6D01075B2701FF803F90
-C7FC6C90B512FC013F5C6D14C0010791C8FC9038007FF0374F7BCD42>I<B912FEF0FFF0
-19FE737E1AE0D8000F01C0C7001F7F06037F727F726C7E867313807313C0A27313E0A373
-13F0A94F13E0A34F13C01B80614F1300624F5A06035B4E13E0063F5B92B8C7FC19F8A2F1
-FF8003C0C7001F13E0060113F89538007FFE737E070F13C01BE07313F0851BF87313FCA2
-7313FEA31BFFA91BFEA2611BFCA2614F13F81BF0614F13E0077F13C04EB51280060FEBFE
-00BB5A1AF01AC04FC7FC19C050527BD15D>66 D<932603FFF01407047F01FF140F0307B6
-00E0131F033F03F8133F92B700FE137F02039126C003FF13FF020F01F8C7EA3FC1023F01
-C0EC0FE391B5C80003B5FC4901FC814949814901E082011F498249498292CA7E49488349
-48835A4A83485B4885A24849187FA2485B1B3FA2485B1B1FA25AA21B0091CDFCA2B5FCAE
-7EA280A36C1A1FA36C7FA21B3F6C7F1B3E6C7F1B7E6C6D187C6C1AFC6E18F86C19016D6C
-EF03F06D7E6FEE07E06D6DEE0FC001076DEE1F806D01F8EE3F006D6D16FE6D01FF4B5A02
-3F01C0EC07F8020F01FCEC3FF00203903AFFC001FFC0020091B6C7FC033F15FC030715F0
-DB007F1480040301F0C8FC505479D25F>I<BAFC19F819FF1AE01AF8D8000701F0C7001F
-13FE06017FDE003F13C0070F7F07037F737F737F747E747E747F86747F8886888688A274
-7FA3881B7FA288A51D80AF1D00A564A21BFF64A3505BA2505BA2505BA2505B505B99C7FC
-505A1A7F4F485A4F13F0070F5B073F5B4EB55A061F49C8FCBB12F81AE097C9FC19F896CA
-FC59527CD165>I<BB12FCA5D8000701F0C7000F7F1800191F190F19071903190119001A
-7E1A7F86A386A51B80DD03E0130FA497C7FCA31707A3170F171F173FEE01FF92B6FCA5ED
-F001EE003F171F170F1707A31703A794CAFCB3A2B812F0A549527CD153>70
-D<B8D88007B712FCA5D8000701F0C9003FEB8000B3AE92BAFCA503F0C9123FB3B1B8D880
-07B712FCA55E527CD167>72 D<B81280A5D8000701F0C7FCB3B3B3B2B81280A529527DD1
-30>I<B812E0A5D8000F01E0CAFCB3B3A91AF8A419011AF0A51903A31907A2190F1AE019
-1FA2193F197F19FF60180760187F0503B5FCBB12C0A545527CD14F>76
-D<B912FCF0FFE019FE737E1AE0D8000F01E0C7003F7F060313FC06007F737E7313807313
-C07313E0851BF0A21BF885A21BFCA91BF8A3611BF0A21BE04F13C0614F13804F13004F5A
-060713F8063F5B92B812C097C7FC19F8198003E0CBFCB3AEB712FEA54E527CD15A>80
-D<B912E018FF19F019FE737ED8000701F0C714E0060F7F060313FC06007F737E737F8587
-737FA28785A287A863A261636361634F90C8FC4F5A4F5A06035B060F13E095B5128092B7
-48C9FC19F019C019F09226F0000713FC050013FF063F7F727F727F727F727FA2727FA284
-86A886A71D707513F8A2851C017301C013F0A273EBE003B86C6D9038F007E0739038FC1F
-C0070190B51280736C1400080F5BCE13F85D537CD162>82 D<DA0FFE141C91B500F0133C
-010702FC137C011F02FF13FC017F15C19026FFF00113E148903980001FFB4890C7EA07FF
-D807FC14014848804848153F171F4848150FA2007F1607491503A2170112FFA217007FA2
-6D167CA27F7F6D93C7FC6C7E14C014F8ECFF806C14F8EDFFC06C15FC6CEDFF8017F06C16
-FC6C826C707E6C836D82011F8201078213016D6C81020781EC007F030380ED003F040314
-801600173F837113C0838312F883A3837EA319807EA26C5E19007F6D4B5A7F6D4B5A01FC
-4B5A6D151FD9FFC04A5AD97FF8ECFFE028FE1FFF80075B010790B6C7FCD8FC0115FC486C
-6C14F048010F14C0489026007FFCC8FC3A5479D249>I<B700FE4AB612F0A5D8000F01E0
-CA387FC000091FC7FCB3B3B26D611B3E811B7E6D197CA26D6D17FC636D6D1601027F4D5A
-6F4C5A023F170F6E6C4C5A6E6D4B5A6E01E003FFC8FC6E01F8EC03FE020001FEEC1FFC92
-3B7FFFE001FFF8031F90B612E00307168003004BC9FC041F14F0040091CAFC5C537CD165
->85 D<EC3FFE0107B512E0011F14FC017F14FF2701FFC00F13C02703FE00037F486C0100
-7F6E6D7E486D80707EA2707EA3707F6C5B6C90C7FC6C5AC9FCA60307B5FC0203B6FC147F
-0103B7FC011FEBF00F017F1300EBFFFC000313F04813C0485B4890C7FC5A5B485AF081F0
-12FF5BA35EA26D5C127F6D5C003F03F713C36DD901E314E06CD9C00714FF00079026F01F
-8114C06C90B5C61480C602FC6D1300011F01F0EB3FFC01010180EB07F03C387CB642>97
-D<EB3FF8B5FCA51203C6FCB3A4EE7FF00307B5FC031F14C0037F14F0913AF9FF007FFCDA
-FFF8EB1FFF03E001077F03806D7F92C76C7F4A6E7F5C4A6F7E85183F85A38584A31A80AD
-1A00A36061A261187F616E15FF616E4A5B6E4A5B6F495BDACFE04990C7FCDA87F0EB3FFE
-913A01FE01FFF8496CB65A49013F14C049010749C8FC90C813E041547DD249>I<913803
-FFE0023F13FE91B67E010315E0010F9038003FF8D93FFCEB07FC4948497E4948131F4849
-497E485B485BA24890C7FC5A5B003F6F5A705A705A007F92C8FC5BA312FFAD127F7FA312
-3F7F6CEE0F80A26C6D141F18006C6D5C6C6D143E6C6D147E6C6D5C6D6C495A6DB4EB07F0
-010F9038C01FE06D90B5128001014AC7FCD9003F13F80203138031387CB63A>I<943803
-FF80040FB5FCA5EE003F170FB3A4913803FF80023F13F849B512FE0107ECFF8F011F9038
-C03FEF90273FFE0007B5FCD97FF8130149487F484980484980484980488291C8FC5A5B12
-3FA2127F5BA312FFAD127FA37F123FA3121F7F6C5E6C6D5C5F6C6D91B5FC6C6D5B6C6D49
-14E0D97FFCD90FEFEBFF80D91FFFEB7F8F010790B5120F010114FC6D6C13E00207010049
-C7FC41547CD249>I<913807FF80027F13F849B512FE01076E7E011F010313E0903A3FFC
-007FF0D97FF06D7E49486D7E4849130F48496D7E48824890C77E1880485A82003F17C0A3
-485A18E082A212FFA290B8FCA401FCCAFCA6127FA37F123FA2EF03E06C7E17076C17C06C
-6D140F18806C6D141F6C6DEC3F006C6D147ED97FFC495AD91FFFEB07F86D9038E03FF001
-0390B512C001005D023F01FCC7FC020113E033387CB63C>I<ED1FF8913803FFFE020FEB
-FF80023F14C09139FFF83FE001039038E0FFF049138049010113F85BEB3FFEA2EB7FFCA2
-6F13F0495AEE7FE0EE1F8093C7FCAEB712C0A5C601F8C8FCB3B3A7B612FEA52D547CD328
->I<DA1FFE14FE49B539E007FF80010FDAFC1F13C0013FDAFF7F13E090267FF807EBFF07
-2701FFE001EBF07F48497E484990387FF83F91C7003F14C048EEFC1F489338FE07004902
-1F90C7FCA2003F82A9001F5EA26D143F6C5E6C5E6E137F6C6D495A6C6D485B6CD9F80713
-804890B6C8FCD803EF14FC01C114E02707C01FFEC9FC49CBFCA2487EA37FA27F13FC90B6
-12FE6CEDFFF017FCEFFF806C8318F06C836C837F48B87E1207D80FFCC700037F4848EC00
-3F4848150F48486F138083485A83A56D5D007F18006D5D003F5F6C6C4B5A01FE153FD807
-FFED7FF06C01C049485AC601FC011F1380013FB648C7FC010F15F8010115C0D9000F01F8
-C8FC3B4F7CB542>I<EB3FF8B5FCA51203C6FCB3A4EE1FFC93B57E030314E0030F14F892
-391FC07FFC92397E003FFE03F86D7EECF9F04B6D7FECFBC0ECFF8092C76C7FA25CA25CA4
-5CB3ACB6D8F807B612C0A542537CD249>I<133FEBFFC0487F487FA2487FA66C5BA26C5B
-6C5B013FC7FC90C8FCAEEB1FF8B5FCA512017EB3B3A6B612F0A51C547CD324>I<EB3FF8
-B5FCA51203C6FCB3A50407B512F0A59339007FF000EF3FC04D5A4DC7FCEE01FC4C5AEE0F
-F04C5A4C5A4CC8FC16FEED03FC4B5A4B5A4B5A4B7E4B7EECF9FF02FB7F91B57EA28203BF
-7F031F7F14FE4A6C7FDAF0077F6F7FA26F7F6F7F167F83707F707FA2707F707F707FA270
-7F707F84B6D8F00F14FEA53F537DD245>107 D<EB3FF8B5FCA51203C6FCB3B3B3B1B612
-F8A51D537CD224>I<D93FF0D91FF84AB47EB591B56C010F13F8030302E0013F13FE030F
-6E90B6FCDB3F809027F803F80F7F922A7E007FFC07E0077F000302F890283FFE0F80037F
-C6D9F1F0011F49487EDAF3E0DAFF3E814B153CDAF7805D92C76C496D7F14FF4A5EA24A5E
-A34A5EB3ADB6D8F80FB66CB612F8A565367BB56E>I<D93FF0EB1FFCB591B57E030314E0
-030F14F892391FC07FFC92397E003FFE000302F86D7EC6EBF1F04B6D7FECF3C0ECF78092
-C76C7F14FF5CA25CA45CB3ACB6D8F807B612C0A542367CB549>I<913801FFC0023F13FE
-91B67E010315E0010F018013F8903A3FFC001FFED97FF0EB07FF49486D7F48496D7F4849
-6D7F91C8127F4883488349153F001F83A2003F8349151FA2007F83A400FF1880AC007F18
-00A3003F5F6D153FA2001F5FA26C6C4B5AA26C6D4A5A6C5F6C6D495B6C6D495B6D6C4990
-C7FCD93FFCEB1FFE6DB46CB45A010790B512F0010115C0D9003F49C8FC020313E039387C
-B642>I<D93FF8EB7FF0B50107B5FC031F14C0037F14F09126F9FF0013FCDAFFF8EB3FFF
-000302E0010F7FC602806D7F92C76C7F4A824A804A6E7F85187F85A2183F85A4721380AD
-4E1300A44E5AA26118FF616E5C616E4A5B6E4A5B6F495B03E04990C7FC6FEB7FFE913AF9
-FE01FFF802F8B65A033F14C0030749C8FC030013E093CAFCB1B612F8A5414D7DB549>I<
-90393FF001FCB590380FFF804B13E0037F13F09238FE1FF89138F1F83F00019138F07FFC
-6CEBF3E015C0ECF780A2ECFF00EE3FF84AEB1FF0EE0FE093C7FC5CA45CB3ABB612FEA52E
-367DB535>114 D<903903FFC00E011FEBFC1E90B6127E000315FE3907FE003FD80FF013
-0F4848130348481301491300127F90C8127EA248153EA27FA27F01F091C7FC13FCEBFF80
-6C13FEECFFF06C14FE6F7E6C15E06C816C15FC6C81C681133F010F15801301D9000F14C0
-EC003F030713E0150100F880167F6C153FA2161F7EA217C07E6D143F17807F6DEC7F0001
-F85C6DEB03FE9039FF801FFC486CB512F0D8F81F14C0D8F00791C7FC39E0007FF02B387C
-B634>I<147CA614FCA41301A31303A21307A2130F131F133F137F13FF1203000F90B512
-FEB7FCA426007FFCC8FCB3A9EE0F80ABEE1F006D7EA2011F143E806D6D5A6DEBC1F86DEB
-FFF001005C023F1380DA03FEC7FC294D7ECB33>I<D93FF8913801FFC0B50207B5FCA500
-03ED001FC61607B3AE5FA35FA25F137F5F6D6C14F7DC01E713F06D6CD907C7EBFFC0903A
-0FFF801F876D90B51207010114FC6D6C13F0020701C091C7FC42377CB549>I<B600E090
-381FFFFCA5000101F8C7000113006CEE007C6E15FC017F5E6E1401013F5E8017036D6D5C
-17076D5E6F130F6D5E6F131F6D93C7FC815F6D6D133E177E6D157C6F13FC027F5C811601
-DA3FFF5B16036E5C16876E5C16CF6E5C16EF16FF6E91C8FCA26E5BA26E5BA26F5AA36F5A
-A26F5AA26F5AA35E151F93C9FC5D153E157ED81FC0137C487E486C13FC486C5B14015D4A
-5A14074A5A6C48485A4948CAFC495A383F81FC6CB45A6C5B000313C0C648CBFC3E4D7DB4
-45>121 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fe ecss2074 20.74 10
-/Fe 10 116 df<EAFFC0B3B3B3B3B3B390B912FCA83E7570F456>76
-D<D8FFC0F03FF0B3B3B3B3AD6C6CF07FE0A46C6CF0FFC0A36D5F001F1A80A26C6C4D1300
-A26C6C4D5A6D170F6C616E161F6C6D4C5A6C6D4C5A6E16FF6D6C4B5B6D6C4B5B6D6C4B5B
-6D6C6C021F90C7FC6D01E0EC7FFE6D01F849485A6D9026FF801F5B6D91B65A6E5E021F16
-8002074BC8FC020115F86E6C14E0030F91C9FC030013F04C7770F46D>85
-D<91380FFF8049B512F0010F14FC017F14FF48B712C0000782001F824882DAE0007F49C7
-EA3FFE01F8140FD81FC06E7E90C86C1380121E00186F13C0001081CAFCEF7FE0A318F017
-3FAD93B5FC157F0207B6FC143F49B7FC1307011F153F017FEBF80090B512804801F8C7FC
-4813C04890C8FCEA0FFC485A485A5B485A5BA248C9FCA5177FA26D15FFA26C6C5C6D5C6D
-140F6C6C5C01FF91B5FC6CEBE00791B612BF6CEDFE3F16FC6C15F06C15C06CECFE006C6C
-13F0D91FFCC9FC344C77CA4C>97 D<EAFFC0B3B3ADED0FFC92B57E020714E0021F80027F
-14FC91B67E01C38101C7829026CFFE0080D9DFF0131FD9FFC001037F4A6D7F49C86C7E49
-153F496F7E170F496F7E5B717E4981A2711380A2187FA219C0183FA419E0181FAD183F19
-C0A3187FA2198018FFA24D1300A25F6D5E17076D4B5A6D151F4D5A6D4B5A6D15FF6D0203
-5B6E495BD9DFE0013F5B9026CFFC01B5C7FC01C7B65A01C35D01C15D01C05D023F14C002
-0F5C020301FCC8FCC8EA3FE03B7C72FA52>I<ED3FFF4AB512F8020F14FF023F15C04A15
-F049B712FC4916FF49178049EBE0004990C7120FD93FFC02011300D97FF06E7E4948151F
-0280814890C912034894C7FC5B485A5B120F5B121F5B123F5BA3485AA548CCFCAD6C7EA4
-7F123FA27F121F7FA26C7EA26C6C17806D1601000317036C6C160F6E151F6C01E0ED7FC0
-6D6CEC01FFD93FFC14076DB4143F6DD9E003B512806D90B6EAFE006D5E6D16F06D6C5D6E
-1580020F02FCC7FC020114E09126003FFCC8FC3A4C78CA47>I<DB1FE04AB4FC912601FF
-FE143F02079026FF8003B5FC4AECC01F023F02F0B6FC4A02FB158091BAFC49EBE01F49D9
-000302FCC7FC49486D01F8C8FC02F89038007F8049486E7E49486E7E4A140F013F824A14
-07A249C86C7EA401FE6F7EAA017F4B5AA46D6C4A5AA26E140F011F5E6E141F6D6C4A5A6D
-6C4A5A02FEEB01FF496C4990C9FC499038E01FFE92B55A495D02BF5C020F14C0496C5CD9
-7E0149CAFC9138001FE001FE90CCFCA67FA27F8080EB3FF091B612FE6DEDFFF818FF6D17
-C019F0013F17FC498390BA7E48854801E0C71203480180DA001F7F4848C900037F484816
-0049EF3FF84848171F49717E127F4917078648481703A76D1707007F616D170F003F616D
-171FD81FFCEF7FF06C6C4D5A6D5E6C01C003075B6C01F8033F5BC601FF4AB448C7FC6D01
-F0011F5B6D90B75A010F17E00103178001004CC8FC021F15F002031580DA000F01E0C9FC
-496D7CC950>103 D<EAFFE0ABC7FCB3A9EA7FE0B3B3B3B30B6F74EE25>105
-D<EAFFC0B3B3B3B3B3B3AF0A7B73FA25>108 D<ED1FF826FFC001B57E020714E0021F14
-F8027F8091B67E01C18101C316809038C7FE00D9CFF0011F13C0D9DFE0010713E0D9FF80
-130191C8FC18F049157F5B173F4916F8A249151FA35BA45BB3B3AC354A72C952>110
-D<91380FFFC091B512FE0107ECFFC0011F15F8017F15FE90B812804817C05A489038F000
-3F4890C70003138049EC007FD81FF8151F491507003F16014992C7FCA2485AA77FA26C7E
-7F7F6CB4FC6C13C014F86CEBFF806C14FC6CECFFE06C15FC6D14FF6D15C0010F81010315
-F8010081020F80DA007F7F03071480DB003F13C0160F040313E01600EF7FF0173FA2EF1F
-F8A2170FA7EF1FF0A20070163F127C007FEE7FE001C015FF01F0020313C0B5020F138002
-F0137F91B712006C5E001F5E000716F0C65E011F1580010302FCC7FCD9000F13C0354C7C
-CA3D>115 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Ff ecrm0700 7 1
-/Ff 1 66 df<140EA2141FA34A7EA3EC6FC0A2ECEFE014C7A290380183F0A390380301F8
-A201067F1400A249137EA2011C137F01187FA24980013FB5FCA2903960000FC0A201E080
-491307A248486D7EA200038115011207D81FC0497ED8FFF890383FFFE0A22B2A7EA931>
-65 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fg ecrm1000 10 78
-/Fg 78 123 df<B81280A2290280962A>21 D<DA0FF813FC91397FFF07FF903B01F807DF
-83C0903A07E001FF0F903B1F8007FE1FE090393F000FFC137E16F85B9338F00780484801
-0790C7FC1503ACB812F8A32801F80003F0C7FCB3AB486C497E267FFFE0B512F0A3333B7F
-BA30>27 D<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090383F0007017E
-497EA25BA2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F1503B3AA486C497E26
-7FFFE0B512C0A32A3B7FBA2E>I<EC0FFC91387FFF70903901F803F0903807E00790381F
-800FEB3F00137EA25B150748481303ADB7FCA33901F80003B3AB486C497E267FFFE0B512
-C0A32A3B7FBA2E>I<DA0FF0EB1FF0DA7FFEEBFFFC903B01F80F83F00F903C07E001CFC0
-0380903C1F8000FF0001C090273F0007FE130F017E4948497EA2495CA248485C03076E5A
-03030203C7FC95C8FCA9F007E0BAFCA33C01F80003F0001F1807B3AA486C496C497E267F
-FFE0B500C1B51280A3413B7FBA45>I<007C137C00FE13FEEAFF01A3EAFE00A7007E13FC
-007C137CA8003C137800381338A700181330171E77BA2A>34 D<030C497EA2031C130303
-1891C7FCA303385B03301306A30370130E0360130CA303E0131C4B1318A3020114384B13
-30A30203147092C71260A34A14E0007FB91280BA12C0C7270C000180C7FCA2021C130302
-1891C8FCA402385B02301306A50270130E0260130CA2BA12C06C1880280001C00038C8FC
-4A1330A30103147091C71260A34914E001065CA3010E1301010C5CA3011C1303011891C9
-FCA301385B01301306A30170130E0160130CA23A4A7BB945>I<EB0380A3EB0FF0EB7FFE
-48B512803903F38FC03907C381E0390F8380F0D81F031338123E003C141C007C140C150E
-0078143E00F814FE1481A400FCEB80FC157800FE140012FF127F13C313E3EA3FFF6C7F14
-F86C13FE6CEBFF80000114C06C14E0013F13F01303ECBFF8148FEC83FC1481A2EC80FE15
-7E123C12FF153EA412FE00F8143C00E0147C12600070147815F8003814F0003C1381001E
-EB83E0000FEB87C03907E39F803901FFFE006C5BEB1FE0EB0380A41F437BBD2A>I<121C
-127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A5A5A12600A
-1979B917>39 D<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485AA2485AA21207
-5B120F90C7FCA25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA27F12077F1203
-A26C7EA26C7E1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20>I<12C07E12
-707E7E7E120F6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA2131F7FA21480A3EB
-07C0A6EB03E0B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C1378A25BA2485A48
-5AA2485A48C7FC120E5A5A5A5A5A13527CBD20>I<EB0380497EA7397803803C00FC147E
-00FE14FE397F8383FC393FC387F8390FE38FE03903FBBF803900FFFE00EB3FF8EB0FE0A2
-EB3FF8EBFFFE3903FBBF80390FE38FE0393FC387F8397F8383FC39FE0380FE00FC147E00
-78143C390007C000A76D5A1F247BBD2A>I<121C127FEAFF80A213C0A3127F121C1200A4
-12011380A2120313005A1206120E5A5A5A12600A19798817>44 D<B512FCA516057F941C
->I<121C127FEAFF80A5EA7F00121C0909798817>I<1506A2150E150CA2151C1518153815
-30A215701560A215E015C0A214011580A2140315005C1406A2140E140CA2141C1418A214
-381430A21470146014E05CA213015CA2130391C7FCA25B1306A2130E130C131C1318A213
-381330A213701360A213E05BA212015B120390C8FCA25A1206A2120E120CA2121C1218A2
-1238123012701260A212E05AA21F537BBD2A>I<EB03F8EB1FFF90387E0FC09038F803E0
-3901E000F0484813780007147C48487FA248C77EA2481580A3007EEC0FC0A500FE15E0B3
-007E15C0A4007F141F6C1580A36C1500A26C6C133EA26C6C5B6C6C5BEBF0013900F803E0
-90387E0FC0D91FFFC7FCEB03F823397DB62A>I<EB01C013031307131F13FFB5FCA2131F
-1200B3B3A7497E007FB512F0A31C3779B62A>I<EB0FF0EB7FFE48B57E3903E03FE0390F
-000FF0001E6D7E001C6D7E486D7E5A6E7E126012FE6CEC7F807FA56CC7FC121CC8FCEDFF
-00A25D14015D14035D4A5A4A5A5D4A5A4AC7FC147E5C495A14E0495A495A49C8FC011EEB
-01805B5B49130348481400485A485A90C75A48B6FC5A5A485CB6FCA321377CB62A>I<EB
-07F8EB3FFF90B512C03901F80FF03903C007F848486C7E390E0001FEEA0F80391FE000FF
-7FA56C5A6C5AC7485AA25D14035D4A5A5DEC0F80027FC7FCEB1FFCECFF809038000FE06E
-7EEC01FC816E7EED7F80A216C0A2153F16E0A2121EEA7F80A2487EA316C0157F49148000
-7EC7FC0070ECFF006C495A121E390F8003F83907F00FF00001B512C06C6C90C7FCEB0FF8
-23397DB62A>I<1538A2157815F8A2140114031407A2140F141F141B14331473146314C3
-13011483EB030313071306130C131C131813301370136013C01201EA038013005A120E12
-0C5A123812305A12E0B712F8A3C73803F800AA4A7E0103B512F8A325387EB72A>I<0006
-140CD80780133C9038F003F890B5FC5D5D158092C7FC14FC38067FE090C9FCAAEB07F8EB
-1FFE9038780F809038E007E03907C003F0496C7E130000066D7E81C8FC8181A21680A412
-1C127F5A7FA390C713005D12FC00605C12704A5A6C5C6C1303001E495A6C6C485A3907E0
-3F800001B5C7FC38007FFCEB1FE021397CB62A>I<EC3FC0903801FFF0010713FC90380F
-E03E90383F800790387E001F49EB3F804848137F485A12075B000FEC3F0049131E001F91
-C7FC5B123FA3127F90C9FCEB01FC903807FF8039FF1E07E090383801F0496C7E01607F01
-E0137E497F16805BED1FC0A390C713E0A57EA47F123F16C0A2001FEC3F807F000F15006D
-5B000714FE6C6C5B6C6C485A3900FE07F090387FFFC0011F90C7FCEB03FC23397DB62A>
-I<12301238123E003FB612E0A316C05A168016000070C712060060140E5D5D00E0143048
-14705D5DC712014A5A4AC7FC1406140E5CA25C1478147014F05C1301A213035C1307A213
-0FA3131F5CA2133FA5137FA96DC8FC131E233A7BB72A>I<EB03F8EB1FFF017F13C09038
-FC07F03901E001F83903C0007C4848133C90C7123E48141E000E141F001E80A3121FA26D
-5B6D131E7FD80FF85B6D137C01FF13786C6D5A6CEBE3E0ECF780C601FFC7FC6D5A6D6C7E
-010F13E0013F7F01F97F3901E07FFE48486C7E380F800F48486C1380001E010113C0487F
-007C143F0078EC1FE0150F00F81407481403A21501A36C15C0A200781403007C15806C14
-076CEC0F006C6C131ED807E0137C3903F803F0C6B55A013F1380D907FCC7FC23397DB62A
->I<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317>
-58 D<EC03FF021F13E09138FC00FCD901E0131ED90780EB0780011EC7EA01E00138EC00
-704981498148488148488190C97E48D901FC1480000ED907FFEB01C0000C90391F03C000
-001C90267E00E013E000184901701360263801F86D13700030496D13300103EC0FE02670
-07E00107133800601718495AA200E0171C484848150CAA6C6C7E1260A26D6C151C007017
-18263003F0130F0101141F00386D013F1338261800FC01771330001C017E9038E3F07000
-0C90261F03C113E0000E903A07FF00FFC06CD901FCEB3F006C90CAFC7F6C7E6C7E13706D
-167C011EED03FCD90780EC1FF0D901E0ECFF80D900FC90383FFC00021FB51280020301E0
-C7FC363C7BBA41>64 D<1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA2020E7F
-EC0C1FA2021C7FEC180FA202387FEC3007A202707FEC6003A202C07F1501A2D901807F81
-A249C77F167FA20106810107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7EA213
-E0707E1201486C81D80FFC02071380B56C90B512FEA3373C7DBB3E>I<B712E016FC16FF
-0001903980007FC06C90C7EA1FE0707E707E707EA2707EA283A75F16035F4C5A4C5A4C5A
-4C5AEEFF8091B500FCC7FCA291C7EA7F80EE1FE0EE07F0707E707E83707EA21880177F18
-C0A7188017FFA24C13005F16034C5AEE1FF8486DEB7FF0B812C094C7FC16F832397DB83B
->I<913A01FF800180020FEBE003027F13F8903A01FF807E07903A03FC000F0FD90FF0EB
-039F4948EB01DFD93F80EB00FF49C8127F01FE153F12014848151F4848150FA248481507
-A2485A1703123F5B007F1601A35B00FF93C7FCAD127F6DED0180A3123F7F001F16031800
-6C7E5F6C7E17066C6C150E6C6C5D00001618017F15386D6C5CD91FE05C6D6CEB03C0D903
-FCEB0F80902701FF803FC7FC9039007FFFFC020F13F002011380313D7BBA3C>I<B712C0
-16F816FE000190398001FF806C90C7EA3FE0EE0FF0EE03F8707E707E177FA2EF3F8018C0
-171F18E0170F18F0A3EF07F8A418FCAC18F8A4EF0FF0A218E0A2171F18C0EF3F80A2EF7F
-0017FE4C5A4C5AEE0FF0EE3FE0486DEBFF80B8C7FC16F816C036397DB83F>I<B812FEA3
-000190388000076C90C8FC173F838383A383A31880170116C0A394C7FCA31501A2150315
-0F91B5FCA3EC000F15031501A21500A21860A318E093C712C0A41701A3EF0380A21707A2
-170F173F177F486D903807FF00B9FCA333397EB838>I<B812F8A30001903880001F6C90
-C71201EE00FC177C173C171CA2170CA4170E1706A2ED0180A21700A41503A21507151F91
-B5FCA3EC001F15071503A21501A692C8FCAD4813C0B612C0A32F397DB836>I<DBFF8013
-C0020FEBF001023F13FC9139FF803F03903A03FC000787D90FF0EB03CF4948EB00EF4948
-147F4948143F49C8121F485A4848150F48481507A248481503A2485A1701123F5B007F16
-00A448481600AB93B6FCA26C7E9338007FE0EF3FC0A2123F7F121FA26C7EA26C7EA26C7E
-6C7E6C6C157F6D7E6D6C14FF6D6C14EFD90FF8EB03C7D903FEEB0783903A00FFC03F0191
-393FFFFC00020F01F0130002001380383D7CBA41>I<B648B512FEA30001902680000313
-006C90C76C5AB3A491B6FCA391C71201B3A6486D497EB648B512FEA337397DB83E>I<B6
-12C0A3C6EBC0006D5AB3B3AD497EB612C0A31A397EB81E>I<013FB512E0A39039001FFC
-00EC07F8B3B3A3123FEA7F80EAFFC0A44A5A1380D87F005B0070131F6C5C6C495A6C49C7
-FC380781FC3801FFF038007F80233B7DB82B>I<B612E0A3000101C0C8FC6C90C9FCB3AD
-1718A517381730A31770A317F0A216011603160FEE1FE0486D13FFB8FCA32D397DB834>
-76 D<B5933807FFF86E5DA20001F0FC002600DFC0ED1BF8A2D9CFE01533A3D9C7F01563
-A3D9C3F815C3A2D9C1FCEC0183A3D9C0FEEC0303A2027F1406A36E6C130CA36E6C1318A2
-6E6C1330A36E6C1360A26E6C13C0A3913901FC0180A3913900FE0300A2ED7F06A3ED3F8C
-A2ED1FD8A3ED0FF0A3486C6D5A487ED80FFC6D48497EB500C00203B512F8A2ED01804539
-7DB84C>I<B5913807FFFE8080C69238007FE06EEC1F80D9DFF0EC0F001706EBCFF8EBC7
-FCA2EBC3FEEBC1FFA201C07F6E7EA26E7E6E7E81140F6E7E8114036E7E168080ED7FC016
-E0153FED1FF0ED0FF8A2ED07FCED03FEA2ED01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE0F
-FEA216071603A216011600A2177E486C153E487ED80FFC151EB500C0140EA2170637397D
-B83E>I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F8049486D7ED93F80EB
-07F049C76C7E01FE6E7E48486E7E49157E0003167F4848ED3F80A24848ED1FC0A2001F17
-E049150F003F17F0A3007F17F8491507A300FF17FCAC007F17F86D150FA3003F17F0A26C
-6CED1FE0A36C6CED3FC0000717806D157F000317006C6C15FEA26C6C4A5A017F4A5A6D6C
-495A6D6C495AD907E0EB1F80D903F8017FC7FC903900FE01FC91381FFFE0020390C8FC36
-3D7BBA41>I<B712C016FC16FF0001D9800013C06C90C7EA1FE0707EEE03F883707EA270
-7EA21880A71800A24C5AA24C5A5FEE0FF04C5AEEFF8091B548C7FC16F091CAFCB3A5487F
-B6FCA331397EB838>I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F804948
-6D7ED93F80EB07F049C76C7E01FE6E7E48486E7EA24848157F0007178049153F000F17C0
-49151F001F17E0A24848ED0FF0A3007F17F8A2491507A200FF17FCAC007F17F8A26D150F
-A2003F17F0A26C6CED1FE0A36C6CED3FC00007027C14804AB4FC3C03F80383807F003B01
-FC0701C0FEEC0E002600FE0CEBE1FC017FEC63F8D93F8CEB77F0D91FCCEB3FE0D907EE14
-806DB449C7FC0100D981FC130CEC1FFF0203131C91C7001E131C161F183CEF807CEFC0F8
-EE0FFFA318F08218E07013C07013809338007E00364B7BBA41>I<B612FEEDFFE016F800
-0190388007FE6C90C76C7EEE3FC0707E707E707EA2707EA283A65FA24C5AA24C5A4C5AEE
-3F8004FFC8FCED07FC91B512E05E9138000FF0ED03F8ED00FE82707E707EA2161F83A583
-A6F00180A217F8160F1803486D01071400B66D6C5A04011306933800FE0ECAEA3FFCEF07
-F0393B7DB83D>I<D90FF813C090383FFE0190B512813903F807E33907E000F74848137F
-4848133F48C7121F003E140F007E1407A2007C140312FC1501A36C1400A37E6D14006C7E
-7F13F86CB47E6C13F8ECFF806C14E06C14F86C14FEC680013F1480010714C0EB007F0207
-13E0EC007FED3FF0151F150FED07F8A200C01403A21501A37EA216F07E15036C15E06C14
-076C15C06C140F6DEB1F80D8FBF0EB3F00D8F0FE13FE39E03FFFF8010F13E0D8C00190C7
-FC253D7CBA2E>I<003FB812E0A3D9C003EB001F273E0001FE130348EE01F00078160000
-701770A300601730A400E01738481718A4C71600B3B0913807FF80011FB612E0A335397D
-B83C>I<B6903807FFFEA3000101809038007FE06C90C8EA1F80EF0F001706B3B2170E6D
-150C80171C133F17186D6C14385F6D6C14F06D6C5C6D6C495A6D6CEB07806D6C49C7FC91
-387F807E91381FFFF8020713E09138007F80373B7DB83E>I<B500FC91387FFF80A30003
-018091380FFC006C90C8EA07E0715A6C705A6E1403017F93C7FCA280013F1506A26E140E
-011F150C80010F5DA28001075DA26E147001031560A26D6C5CA2806D4A5AA2ED8003027F
-91C8FCA291383FC006A215E0021F5BA2EDF01C020F1318A26E6C5AA215FC02035BA2EDFE
-E002015BA26E6C5AA36FC9FCA3153EA2151CA3393B7EB83E>I<007FB590383FFFFCA3C6
-01F801071380D97FE0D903FCC7FC013FEC01F06D6C5C5F6D6C5C6D6C13034CC8FC6D6C13
-06160E6D6C5B6DEB8018163891387FC0306E6C5A16E06E6C5A91380FF18015FB6EB4C9FC
-5D14036E7EA26E7F6F7EA24B7E15DF9138019FF09138038FF8150F91380607FC91380E03
-FE140C4A6C7EEC38000230804A6D7E14E04A6D7E49486D7E130391C76C7E01066E7E130E
-010C6E7E011C1401013C8101FE822607FF80010713E0B500E0013FEBFF80A339397EB83E
->88 D<B500FE91383FFFE0A3000301E0913807FE00C649EC03F0017F6F5A606D6C5D6D6C
-140395C7FC6D6C1406A26D6C5C6D6C141C17186D6C143817306D6D5B6E6C13E05F91383F
-E0015F91381FF003DA0FF890C8FC1606913807FC0E160C913803FE1C913801FF185E6E13
-B016E0157F6F5AB3A24B7E023FB512C0A33B397FB83E>I<003FB7FCA39039FC0001FE01
-C0130349495A003EC7FC003C4A5A5E0038141F00784A5A12704B5A5E006014FF4A90C7FC
-A24A5A5DC712074A5AA24A5A5D143F4A5AA24A5A92C8FC5B495AA2495A5C130F4948EB01
-80A2495A5C137F495A16034890C7FC5B1203485AEE0700485A495C001F5D48485C5E4848
-495A49130FB8FCA329397BB833>I<007FB81280B912C0A26C17803204797041>95
-D<EB1FE0EBFFFC3803E03F3907000F80390F8007E0486C6C7E13E06E7EA26E7E6C5A6C5A
-C8FCA4147FEB07FFEB3FE0EBFE00EA03F8EA0FF0EA1FC0123F485A90C7FC160C12FEA314
-01A26C13036CEB077C903980063E18383FC01E3A0FE0781FF03A03FFF00FE03A007F8007
-C026277DA52A>97 D<EA03F012FFA3120F1203B0EC1FE0EC7FF89038F1E03E9039F3801F
-809039F7000FC001FEEB07E049EB03F049EB01F85BED00FCA216FEA2167E167FAA167E16
-FEA216FC15016D14F8ED03F07F01EEEB07E001C6EB0FC09039C7801F00903881E07E9038
-00FFF8C7EA1FC0283B7EB92E>I<EB03FC90381FFF8090387E03E03901F80070484813F8
-3907E001FC380FC003A2EA1F80123F90380001F848EB00F01500A2127E12FEAA127E127F
-A26C14067F001F140E6D130C000F141C6C6C13386C6C13706C6C13E039007C07C090381F
-FF00EB07F81F277DA525>I<ED0FC0EC03FFA3EC003F150FB0EB03F8EB1FFF90387E078F
-9038F801EF3903F0007F4848133F4848131FA24848130F123F90C7FC5AA2127E12FEAA12
-7E127FA27EA26C6C131FA26C6C133F6C6C137F6C6CEBEFF03A01F801CFFF39007C078F90
-381FFE0FD907F813C0283B7DB92E>I<EB07F8EB1FFF90387C0FC03901F803E03903F001
-F0D807E013F8380FC0004848137CA248C7127E153E5A153F127E12FEA3B7FCA248C8FCA5
-127EA2127FA26C14037F001F14076C6C13060007140E6D131CD801F013386C6C13709038
-7E03E090381FFF80903803FC0020277EA525>I<147E903803FF8090380FC1E0EB1F8790
-383F0FF0137EA213FCA23901F803C091C7FCADB512FCA3D801F8C7FCB3AB487E387FFFF8
-A31C3B7FBA19>I<ED03F090390FF00FF890393FFC3C3C9039F81F707C3901F00FE03903
-E007C03A07C003E010000FECF000A248486C7EA86C6C485AA200075C6C6C485A6D485A6D
-48C7FC38073FFC38060FF0000EC9FCA4120FA213C06CB512C015F86C14FE6CECFF804815
-C03A0F80007FE048C7EA0FF0003E140348140116F8481400A56C1401007C15F06CEC03E0
-003F1407D80F80EB0F80D807E0EB3F003901FC01FC39007FFFF0010790C7FC26387EA52A
->I<EA03F012FFA3120F1203B0EC0FF0EC3FFCECF03F9039F1C01F809039F3800FC0EBF7
-0013FE496D7EA25BA35BB3A3486C497EB500C1B51280A3293A7EB92E>I<EA0380EA0FE0
-487EA56C5AEA0380C8FCAAEA03F012FFA312071203B3AA487EB512C0A312387EB717>I<
-EB01C0EB07F0EB0FF8A5EB07F0EB01C090C7FCAAEB01F813FFA313071301B3B3A2123C12
-7E00FF13F01303A214E038FE07C0127C383C0F00EA0FFEEA03F8154984B719>I<EA03F0
-12FFA3120F1203B1913801FFFCA39138007FC01600157C15705D4A5A4A5A4AC7FC141E14
-38147814FC13F1EBF3FEEBF73F01FE7FEBF81F496C7E8114076E7E6E7E811400157E157F
-811680ED1FC0486CEB3FF0B500C0B5FCA3283A7EB92C>I<EA03F012FFA3120F1203B3B3
-AD487EB512C0A3123A7EB917>I<2703F00FF0EB1FE000FFD93FFCEB7FF8913AF03F01E0
-7E903BF1C01F83803F3D0FF3800FC7001F802603F70013CE01FE14DC49D907F8EB0FC0A2
-495CA3495CB3A3486C496CEB1FE0B500C1B50083B5FCA340257EA445>I<3903F00FF000
-FFEB3FFCECF03F9039F1C01F803A0FF3800FC03803F70013FE496D7EA25BA35BB3A3486C
-497EB500C1B51280A329257EA42E>I<EB03FE90380FFF8090383E03E09038F800F84848
-137C48487F48487F4848EB0F80001F15C090C712074815E0A2007EEC03F0A400FE15F8A9
-007E15F0A2007F14076C15E0A26C6CEB0FC0000F15806D131F6C6CEB3F006C6C137EC66C
-13F890387E03F090381FFFC0D903FEC7FC25277EA52A>I<3903F01FE000FFEB7FF89038
-F1E07E9039F3801F803A07F7000FC0D803FEEB07E049EB03F04914F849130116FC150016
-FEA3167FAA16FEA3ED01FCA26DEB03F816F06D13076DEB0FE001F614C09039F7803F0090
-38F1E07E9038F0FFF8EC1FC091C8FCAB487EB512C0A328357EA42E>I<D903F813C09038
-1FFE0190387E07819038FC01C33903F000E3000714774848133749133F001F141F485A15
-0F48C7FCA312FEAA127FA37E6D131F121F6D133F120F6C6C137F6C6C13EF3901F801CF39
-007E078F90381FFE0FEB07F890C7FCABED1FE00203B5FCA328357DA42C>I<3807E01F00
-FFEB7FC09038E1E3E09038E387F0380FE707EA03E613EE9038EC03E09038FC0080491300
-A45BB3A2487EB512F0A31C257EA421>I<EBFF03000313E7380F80FF381E003F487F487F
-00707F12F0A2807EA27EB490C7FCEA7FE013FF6C13E06C13F86C7F00037FC67F01071380
-EB007F141F00C0EB0FC01407A26C1303A37E15806C13077EEC0F00B4131E38F3C07C38E1
-FFF038C03F801A277DA521>I<1318A51338A31378A313F8120112031207001FB5FCB6FC
-A2D801F8C7FCB215C0A93800FC011580EB7C03017E13006D5AEB0FFEEB01F81A347FB220
->I<D803F0EB07E000FFEB01FFA3000FEB001F00031407B3A4150FA3151F12016D133F00
-00EC77F86D9038E7FF8090383F03C790381FFF87903A03FC07E00029267EA42E>I<B538
-803FFEA33A0FF8000FF06C48EB07E00003EC03C06D148000011500A26C6C1306A26D130E
-017E130CA26D5BA2EC8038011F1330A26D6C5AA214E001075BA2903803F180A3D901FBC7
-FCA214FF6D5AA2147CA31438A227257EA32C>I<B53A1FFFE03FFEA3260FF8009038000F
-F86C48017EEB03E018C00003023EEB0180A26C6C013FEB0300A36C6CEC8006156FA2017E
-9038EFC00C15C7171CD93F01EBE01815830281EBF038D91F831430150102C3EBF8709026
-0FC6001360A2D907E66D5A02EC137CA2D903FCEB7F804A133FA2010192C7FC4A7FA20100
-141E4A130E0260130C37257EA33C>I<B538807FFFA33A03FE003FF00001EC1F80000092
-C7FC017E131C6D13186D6C5AECC070010F5B6D6C5AECF180EB03FB6DB4C8FC6D5AA2147F
-804A7E8114CF903801C7E090380383F090380703F8EB0601496C7E011C137E49137F0178
-7F496D7E486C80000FEC3FF0D8FFFE90B51280A329247FA32C>I<B538803FFEA33A0FF8
-000FF06C48EB07C00003EC03806C7E16007F00001406A2017E5BA2137F6D5BA26D6C5AA2
-ECC070010F1360A26D6C5AA214F101035BA2D901FBC7FCA214FF6D5AA2147CA31438A214
-30A214701460A25CA2EA7C0100FE5B130391C8FC1306EAFC0EEA701C6C5AEA1FF0EA0FC0
-27357EA32C>I<003FB512FCA2EB8003D83E0013F8003CEB07F00038EB0FE012300070EB
-1FC0EC3F800060137F150014FE495AA2C6485A495AA2495A495A495AA290387F000613FE
-A2485A485A0007140E5B4848130C4848131CA24848133C48C7127C48EB03FC90B5FCA21F
-247EA325>I E
-%EndDVIPSBitmapFont
-end
-%%EndProlog
-%%BeginSetup
-%%Feature: *Resolution 600dpi
-TeXDict begin
-%%BeginPaperSize: Letter
-letter
-%%EndPaperSize
-
-%%EndSetup
-%%Page: 1 1
-1 0 bop 0 162 a Fg(11)17 b(11)h(T)249 180 y(E)295 162
-y(X)h(L)398 145 y Ff(A)435 162 y Fg(T)481 180 y(E)527
-162 y(X)0 353 y Fe(Using)54 b(Libical)p 0 467 3900 24
-v 0 580 a Fg(Eric)28 b(Busb)r(o)r(om)f(\(eric@soft)n(w)n
-(arestudio.org\))1921 b(Jan)n(uary)25 b(2000)0 1217 y
-Fd(1)131 b(In)l(tro)t(duction)0 1456 y Fg(Libical)23
-b(is)f(an)h(Op)r(en)g(Source)f(implemen)n(tation)h(of)g(the)g
-(iCalendar)f(proto)r(cols)f(and)i(proto)r(col)e(data)i(units.)35
-b(The)23 b(iCalendar)0 1570 y(sp)r(eci\034cation)k(describ)r(es)g(ho)n
-(w)f(calendar)g(clien)n(ts)i(can)f(comm)n(unicate)f(with)i(calendar)e
-(serv)n(ers)f(for)i(users)g(can)g(store)f(their)0 1683
-y(calendar)g(data)h(and)h(arrange)d(meetings)i(with)h(other)f(users.)0
-1840 y(Libical)g(implemen)n(ts)h(the)g(follo)n(wing)e(sp)r
-(eci\034cations)h(and)h(proto)r(cols)0 1996 y(iCal)f(Core)g(2445)e
-(iTIP)k(2446)c(iMIP)j(2447)e(iRIP)i(draft)g(CAP)g(draft)0
-2153 y(\(The)g(curren)n(t)f(v)n(ersion,)f(0.15,)g(do)r(es)h(not)h
-(implemen)n(t)g(iRip)g(or)e(CAP)-7 b(.)29 b(\))0 2309
-y(This)j(do)r(cumen)n(tation)g(assumes)g(that)g(y)n(ou)g(are)f
-(familiar)h(with)h(the)f(iCalendar)f(standards)g(RF)n(C2445)g(and)h(RF)
-n(C2446.)0 2423 y(these)c(sp)r(eci\034cations)e(are)h(online)g(on)h
-(the)g(CALSCH)g(w)n(ebpage)e(at:)p 0 2475 3900 4 v 0
-2617 a Fc(http://www.imc.o)o(rg)o(/ie)o(tf)o(-c)o(ale)o(nd)o(ar)o(/)p
-0 2776 V 0 2996 a Fb(1.1)112 b(The)38 b(libical)c(pro)6
-b(ject)0 3207 y Fg(This)29 b(co)r(de)g(is)g(under)g(activ)n(e)f(dev)n
-(elopmen)n(t.)40 b(If)30 b(y)n(ou)e(w)n(ould)h(lik)n(e)f(to)h(con)n
-(tribute)g(to)g(the)g(pro)5 b(ject,)29 b(y)n(ou)f(can)h(con)n(tact)f
-(me,)0 3320 y(Eric)g(Busb)r(o)r(om,)f(at)g(eric@soft)n(w)n
-(arestudio.org.)33 b(The)27 b(pro)5 b(ject)27 b(has)g(a)g(w)n(ebpage)g
-(at)332 3518 y(h)n(ttp://soft)n(w)n(arestudio.org/libical/index.h)n
-(tml)0 3716 y(and)g(a)h(mailing)f(list)g(that)h(y)n(ou)f(can)g(join)h
-(b)n(y)f(sending)g(the)h(follo)n(wing)f(mail:)p 0 3769
-V 0 3904 a Fc(To:)42 b(minimalist@softwa)o(re)o(st)o(udi)o(o.)o(or)o(g)
-0 4017 y(Subject:)e(subscribe)g(libical)p 0 4176 V 0
-4396 a Fb(1.2)112 b(License)0 4607 y Fg(The)60 b(co)r(de)f(and)h
-(data\034les)f(in)h(this)g(distribution)g(are)e(licensed)i(under)g(the)
-g(Mozilla)f(Public)h(License.)133 b(See)0 4720 y(h)n
-(ttp://www.mozilla.org/NPL/MPL-1.0.h)n(tml)37 b(for)j(a)h(cop)n(y)f(of)
-g(the)i(license.)76 b(Alternately)-7 b(,)44 b(y)n(ou)c(ma)n(y)g(use)g
-(libical)0 4834 y(under)32 b(the)g(terms)g(of)g(the)g(GNU)h(Library)d
-(General)h(Public)i(License.)50 b(See)32 b(h)n(ttp://www.fsf.org/cop)n
-(yleft/lesser.h)n(tml)0 4947 y(for)27 b(a)g(cop)n(y)g(of)g(the)h(LGPL.)
-0 5104 y(This)j(dual)g(license)f(ensures)h(that)g(the)g(library)f(can)g
-(b)r(e)i(incorp)r(orated)d(in)n(to)i(b)r(oth)g(proprietary)e(co)r(de)i
-(and)f(GPL'd)i(pro-)0 5217 y(grams,)23 b(and)h(will)h(b)r(ene\034t)g
-(from)f(impro)n(v)n(emen)n(ts)e(made)i(b)n(y)g(programmers)e(in)i(b)r
-(oth)h(realms.)34 b(I)25 b(will)f(only)g(accept)g(c)n(hanges)0
-5331 y(in)n(to)j(m)n(y)h(v)n(ersion)e(of)h(the)h(library)e(if)i(they)g
-(are)f(similarly)f(dual-licensed.)0 5615 y Fb(1.3)112
-b(Purp)s(ose)38 b(&)f(Goals)0 5844 y(1.4)112 b(Do)s(cumen)m(t)37
-b(v)m(ersion)0 6054 y Fg($Id:)g(UsingLibical.lyx,v)26
-b(1.4)h(2000/02/18)22 b(23:06:04)j(eric)i(Exp)h(eric)f($)0
-6386 y Fd(2)131 b(Building)46 b(the)e(Library)0 6624
-y Fg(Libical)37 b(uses)g(auto)r(conf)h(to)f(generate)f(mak)n(e\034les,)
-k(although)c(it)i(uses)g(none)f(of)h(the)g(auto)r(conf)f(\035ags)f(to)i
-(in\035uence)g(the)0 6738 y(compilation.)e(It)28 b(should)f(built)i
-(with)f(no)f(adjustmen)n(ts)h(on)f(Lin)n(ux,)g(F)-7 b(reeBSD)28
-b(and)f(Solaris.)0 7069 y Fd(3)131 b(Structure)0 7308
-y Fg(The)28 b(iCal)f(calendar)f(mo)r(del)i(is)f(based)g(on)h(four)f(t)n
-(yp)r(es)g(of)h(ob)5 b(jects:)36 b(comp)r(onen)n(ts,)27
-b(prop)r(erties,)g(v)-5 b(alues)27 b(and)g(parameters.)0
-7464 y(Prop)r(erties)32 b(are)f(the)i(fundamen)n(tal)f(unit)i(of)e
-(information)g(in)g(iCal,)i(and)e(they)g(w)n(ork)f(a)h(bit)h(lik)n(e)f
-(a)g(hash)g(en)n(try)-7 b(,)34 b(with)e(a)0 7578 y(constan)n(t)21
-b(k)n(ey)h(and)g(a)f(v)-5 b(ariable)21 b(v)-5 b(alue.)35
-b(Prop)r(erties)21 b(ma)n(y)h(also)f(ha)n(v)n(e)g(mo)r(di\034ers,)h
-(called)g(parameters.)33 b(In)22 b(the)h(iCal)f(con)n(ten)n(t)0
-7691 y(line)p 0 7728 V 0 7863 a Fc(ORGANIZER;ROLE=C)o(HA)o(IR:)o(MA)o
-(IL)o(TO:)o(mr)o(bi)o(g@h)o(os)o(t.)o(com)p eop
-%%Page: 2 2
-2 1 bop 0 -167 3900 5 v 0 -200 a Fa(4.)73 b(Di\033erences)31
-b(F)-8 b(rom)31 b(RF)m(Cs)2732 b Fg(2)p 0 162 3900 4
-v 0 312 a(The)34 b(prop)r(ert)n(y)f(name)h(is)g("OR)n(GANIZER,")g(the)g
-(v)-5 b(alue)34 b(of)h(the)f(prop)r(ert)n(y)f(is)h("mrbig@host.com")e
-(and)i(the)g("R)n(OLE")0 425 y(parameter)26 b(sp)r(eci\034es)h(that)h
-(Mr)g(Big)f(is)g(the)h(c)n(hair)e(of)i(the)g(meetings)f(asso)r(ciated)f
-(with)i(this)g(prop)r(ert)n(y)-7 b(.)0 582 y(Comp)r(onen)n(ts)26
-b(are)f(groups)g(of)h(prop)r(erties)f(that)i(represen)n(t)e(the)i(core)
-e(ob)5 b(jects)26 b(of)g(a)g(calendar)f(system,)h(suc)n(h)g(as)g(ev)n
-(en)n(ts)f(or)0 695 y(timezones.)0 852 y(The)k(cen)n(tral)f(goal)g(of)h
-(libical)g(is)g(to)g(parse)f(iTIP)i(data)e(in)n(to)h(an)g(in)n(ternal)f
-(represen)n(tation)g(of)h(Comp)r(onen)n(ts,)g(Prop)r(erties,)0
-965 y(P)n(arameters)d(an)h(V)-7 b(alues,)27 b(and)h(to)f(allo)n(w)g
-(the)h(user)f(to)g(manipulate)g(the)h(data)g(in)f(v)-5
-b(arious)27 b(w)n(a)n(ys)0 1257 y Fb(3.1)112 b(Comp)s(onen)m(ts)0
-1486 y(3.2)g(Prop)s(erties)0 1715 y(3.3)g(V)-9 b(alues)0
-1944 y(3.4)112 b(P)m(arameters)0 2173 y(3.5)g(En)m(umerations)0
-2402 y(3.6)g(T)m(yp)s(es)0 2631 y(3.7)g(The)38 b(P)m(arser)0
-2860 y(3.8)112 b(Restrictions)0 3089 y(3.9)g(Memory)37
-b(Managemen)m(t)0 3356 y Fd(4)131 b(Di\033erences)44
-b(F)-11 b(rom)43 b(RF)l(Cs)0 3594 y Fg(Libical)c(has)f(b)r(een)h
-(designed)g(to)f(follo)n(w)h(the)g(standards)e(as)i(closely)f(as)g(p)r
-(ossible,)j(so)e(that)g(the)g(k)n(ey)f(ob)5 b(jects)39
-b(in)g(the)0 3708 y(standards)30 b(are)g(also)g(k)n(eey)g(ob)5
-b(jects)31 b(in)h(the)f(library)-7 b(.)47 b(Ho)n(w)n(ev)n(er,)30
-b(there)h(are)f(a)h(few)g(areas)e(where)i(the)h(sp)r(eci\034cations)e
-(are)0 3821 y(\(arguably\))g(irregular,)h(and)g(follo)n(wing)g(them)h
-(exactly)f(w)n(ould)g(result)h(in)g(an)f(unfriendly)h(in)n(terface.)49
-b(These)31 b(deviations)0 3935 y(mak)n(e)c(libical)g(easier)f(to)i(use)
-f(b)n(y)h(main)n(taining)e(a)h(self-similar)g(in)n(terface.)0
-4227 y Fb(4.1)112 b(Pseudo)38 b(Comp)s(onen)m(ts)0 4437
-y Fg(Libical)g(de\034nes)g(comp)r(onen)n(ts)g(for)g(groups)f(of)i(prop)
-r(erties)e(that)i(lo)r(ok)e(and)i(act)f(lik)n(e)g(comp)r(onen)n(ts,)i
-(but)f(are)f(not)g(de-)0 4550 y(\034ned)c(as)f(comp)r(onen)n(ts)g(in)h
-(the)g(sp)r(eci\034cation.)54 b(XD)n(A)-7 b(YLIGHT)35
-b(and)e(XST)-7 b(AND)n(ARD)36 b(are)c(notable)h(examples.)54
-b(These)0 4664 y(pseudo)23 b(comp)r(onen)n(ts)g(group)g(prop)r(erties)g
-(within)h(the)g(VTIMEZONE)h(comp)r(onen)n(ts.)35 b(XD)n(A)-7
-b(YLIGHT)25 b(starts)d(with)j("BE-)0 4777 y(GIN:D)n(A)-7
-b(YLIGHT")35 b(and)f(ends)g(with)g("END:D)n(A)-7 b(YLIGHT,)36
-b(just)e(lik)n(e)g(other)f(comp)r(onen)n(ts,)i(but)g(is)f(not)g
-(de\034ned)g(as)f(a)0 4891 y(comp)r(onen)n(t)27 b(in)h(RF)n(C2445.)35
-b(\()28 b(See)f(RF)n(C2445,)f(page)h(61)f(\))i(In)g(Libical,)f(it)h(is)
-g(a)f(comp)r(onen)n(t.)0 5047 y(There)35 b(are)g(also)g(pseudo)h(comp)r
-(onen)n(ts)f(that)i(are)e(conceptually)g(deriv)n(ed)g(classess)f(of)i
-(V)-9 b(ALARM.)37 b(RF)n(C2446)d(de\034nes)0 5161 y(what)d(prop)r
-(erties)f(ma)n(y)g(b)r(e)h(included)g(in)g(eac)n(h)f(comp)r(onen)n(t,)i
-(and)e(for)h(V)-9 b(ALARM,)31 b(the)g(set)g(of)g(prop)r(erties)f(it)h
-(ma)n(y)f(ha)n(v)n(e)0 5275 y(dep)r(ends)e(on)f(the)h(v)-5
-b(alue)28 b(of)f(the)h(A)n(CTION)f(prop)r(ert)n(y)-7
-b(.)0 5431 y(F)g(or)19 b(instance,)j(if)e(a)g(V)-9 b(ALARM)20
-b(comp)r(onen)n(t)g(has)f(an)h(A)n(CTION)g(prop)r(ert)n(y)e(with)j(the)
-f(v)-5 b(alue)20 b(of)g("A)n(UDIO,")f(the)h(comp)r(onen)n(t)0
-5545 y(m)n(ust)h(also)g(ha)n(v)n(e)f(an)h("A)-7 b(TT)g(A)n(CH")21
-b(prop)r(ert)n(y)-7 b(.)34 b(Ho)n(w)n(ev)n(er,)20 b(if)i(the)g(A)n
-(CTION)f(v)-5 b(alue)21 b(is)g("DISPLA)-7 b(Y,")22 b(the)g(comp)r(onen)
-n(t)f(m)n(ust)0 5658 y(ha)n(v)n(e)26 b(a)i(DESCRIPTION)g(prop)r(ert)n
-(y)-7 b(.)p eop
-%%Page: 3 3
-3 2 bop 0 -167 3900 5 v 0 -200 a Fa(5.)73 b(Implemen)m(tation)29
-b(Limitations)2539 b Fg(3)0 162 y(T)-7 b(o)28 b(handle)g(these)g(v)-5
-b(arious,)27 b(complex)h(restrictions,)f(libical)h(has)g(pseudo)g(comp)
-r(onen)n(ts)f(for)h(eac)n(h)f(t)n(yp)r(e)i(of)f(alarm:)37
-b(XA)n(U-)0 275 y(DIO)n(ALARM,)28 b(XDISPLA)-7 b(Y)g(ALARM,)30
-b(XEMAILALARM)f(and)f(XPR)n(OCEDUREALARM.)0 567 y Fb(4.2)112
-b(Com)m(bined)37 b(V)-9 b(alues)0 777 y Fg(Man)n(y)34
-b(v)-5 b(alues)34 b(can)g(tak)n(e)g(more)g(than)g(one)h(t)n(yp)r(e.)58
-b(TRIGGER,)35 b(for)f(instance,)i(can)e(ha)n(v)n(e)g(a)g(v)-5
-b(alue)34 b(t)n(yp)r(e)h(of)g(with)g(DU-)0 890 y(RA)-7
-b(TION)32 b(or)f(of)h(D)n(A)-7 b(TE-TIME.)33 b(These)f(m)n(ultiple)g(t)
-n(yp)r(es)g(mak)n(e)f(it)i(di\036cult)g(to)e(create)g(routines)h(to)f
-(return)h(the)g(v)-5 b(alue)0 1004 y(asso)r(ciated)26
-b(with)i(a)f(prop)r(ert)n(y)-7 b(.)0 1161 y(It)30 b(is)g(natural)g(to)f
-(ha)n(v)n(e)g(in)n(terfaces)g(that)i(w)n(ould)e(return)h(the)g(v)-5
-b(alue)30 b(of)g(a)g(prop)r(ert)n(y)-7 b(,)29 b(but)i(it)f(is)g(cum)n
-(b)r(ersone)f(for)h(a)g(single)0 1274 y(routine)i(to)g(return)g(m)n
-(ultiple)h(t)n(yp)r(es.)51 b(So,)33 b(in)g(libical,)g(prop)r(erties)e
-(that)i(can)f(ha)n(v)n(e)f(m)n(ultiple)i(t)n(yp)r(es)f(are)f(giv)n(en)h
-(a)g(single)0 1388 y(t)n(yp)r(e)26 b(that)g(is)g(the)g(union)g(of)g
-(their)g(RF)n(C2445)e(t)n(yp)r(es.)36 b(F)-7 b(or)26
-b(instance,)g(in)g(libical,)g(the)g(v)-5 b(alue)26 b(of)g(the)g
-(TRIGGER)h(prop)r(ert)n(y)0 1501 y(resolv)n(es)e(to)j(struct)f
-(icaltriggert)n(yp)r(e.)35 b(This)28 b(t)n(yp)r(e)f(is)h(a)f(union)h
-(of)f(a)g(DURA)-7 b(TION)29 b(and)e(a)g(D)n(A)-7 b(TE-TIME.)0
-1793 y Fb(4.3)112 b(Multi-V)-9 b(alued)36 b(Prop)s(erties)0
-2003 y Fg(Some)31 b(prop)r(erties,)h(suc)n(h)f(as)g(CA)-7
-b(TEGORIES)33 b(ha)n(v)n(e)d(only)h(one)g(v)-5 b(alue)32
-b(t)n(yp)r(e,)h(but)f(eac)n(h)e(CA)-7 b(TEGORIES)33 b(prop)r(ert)n(y)d
-(can)0 2116 y(ha)n(v)n(e)24 b(m)n(ultiple)h(v)-5 b(alue)25
-b(instances.)35 b(This)25 b(also)f(results)g(in)h(a)g(cum)n(b)r(ersome)
-f(in)n(terface)g(\025)g(CA)-7 b(TEGORIES)26 b(accessors)d(w)n(ould)0
-2230 y(ha)n(v)n(e)k(to)i(return)f(a)g(list)g(while)h(all)f(other)g
-(accessors)e(returned)i(a)g(single)g(v)-5 b(alue.)39
-b(In)29 b(libical,)g(all)f(prop)r(erties)f(ha)n(v)n(e)h(a)g(single)0
-2344 y(v)-5 b(alue,)35 b(and)e(m)n(ulti-v)-5 b(alued)33
-b(prop)r(erties)f(are)h(brok)n(en)f(do)n(wn)g(in)n(to)h(m)n(ultiple)h
-(single)f(v)-5 b(alued)33 b(prop)r(erties)g(during)f(parsing.)0
-2457 y(That)c(is,)f(an)g(input)i(line)e(lik)n(e,)p 0
-2526 3900 4 v 0 2703 a Fc(CATEGORIES:)39 b(work,)i(home)p
-0 2903 V 0 3053 a Fg(b)r(ecomes)27 b(in)h(libical's)f(in)n(ternal)g
-(represen)n(tation)p 0 3122 V 0 3299 a Fc(CATEGORIES:)39
-b(work)0 3412 y(CATEGORIES:)g(home)p 0 3612 V 0 3767
-a Fg(Oddly)-7 b(,)34 b(RF)n(C2445)d(allo)n(ws)g(some)h(m)n(ulti-v)-5
-b(alued)33 b(prop)r(erties)f(\()h(lik)n(e)g(FREEBUSY)h(\))f(to)g(exist)
-g(as)f(b)r(oth)h(a)f(m)n(ulti-v)-5 b(alues)0 3881 y(prop)r(ert)n(y)24
-b(and)h(as)f(m)n(ultiple)h(single)g(v)-5 b(alue)24 b(prop)r(erties,)h
-(while)g(others)f(\()i(lik)n(e)e(CA)-7 b(TEGORIES)26
-b(\))f(can)g(only)g(exist)f(as)h(single)0 3994 y(m)n(ulti-v)-5
-b(alued)32 b(prop)r(erties.)48 b(This)31 b(mak)n(es)g(the)h(in)n
-(ternal)f(represen)n(tation)e(for)i(CA)-7 b(TEGORIES)33
-b(illegal.)48 b(Ho)n(w)n(ev)n(er)30 b(when)0 4108 y(y)n(ou)d(con)n(v)n
-(ert)f(a)h(comp)r(onen)n(t)g(to)h(a)f(string,)g(the)h(library)e(will)i
-(collect)f(all)g(of)h(the)g(CA)-7 b(TEGORIES)28 b(prop)r(erties)f(in)n
-(to)g(one.)0 4446 y Fd(5)131 b(Implemen)l(tation)44 b(Limitations)0
-4742 y(6)131 b(Using)44 b(libical)0 4999 y Fb(6.1)112
-b(Creating)37 b(Comp)s(onen)m(ts)0 5209 y Fg(There)e(are)g(three)h(w)n
-(a)n(ys)e(to)i(create)e(comp)r(onen)n(ts)i(in)g(Libical:)53
-b(creating)34 b(individual)i(ob)5 b(jects)35 b(and)h(assem)n(bling)e
-(them,)0 5323 y(building)28 b(en)n(tire)f(ob)5 b(jects)27
-b(in)h(massiv)n(e)e(v)-5 b(aargs)26 b(calls,)h(and)g(parsing)f(a)h
-(text)h(\034le)g(con)n(taining)e(iCalendar)h(data.)p
-eop
-%%Page: 4 4
-4 3 bop 0 -167 3900 5 v 0 -200 a Fa(6.)73 b(Using)32
-b(libical)3190 b Fg(4)0 162 y Fa(6.1.1)94 b(Constructor)32
-b(In)m(terfaces)0 372 y Fg(Using)d(constructor)f(in)n(terfaces,)h(y)n
-(ou)f(create)h(eac)n(h)f(of)i(the)f(ob)5 b(jects)29 b(sep)r(erately)g
-(and)g(them)h(assem)n(ble)e(them)i(in)g(to)f(com-)0 485
-y(p)r(onen)n(ts:)p 0 555 3900 4 v 0 738 a Fc(event)41
-b(=)j(icalcomponent_n)o(ew)o(\(IC)o(AL)o(_V)o(EVE)o(NT)o(_C)o(OMP)o(ON)
-o(EN)o(T\);)0 852 y(icalcomponent_ad)o(d_)o(pro)o(pe)o(rt)o(y\(e)o(ve)o
-(nt)o(,)38 b(icalproperty_ne)o(w_)o(dts)o(ta)o(mp)o(\(at)o(im)o(e\))f
-(\);)0 965 y(icalcomponent_ad)o(d_)o(pro)o(pe)o(rt)o(y\(e)o(ve)o(nt)o
-(,ic)o(al)o(pr)o(ope)o(rt)o(y_)o(new)o(_u)o(id\()o(st)o(rd)o(up\()o("g)
-o(ui)o(d-1)o(.h)o(os)o(t1.)o(co)o(m")o(\)\))g(\);)0 1079
-y(property=icalpro)o(pe)o(rty)o(_n)o(ew)o(_or)o(ga)o(ni)o(zer)o(\(s)o
-(tr)o(dup)o(\(")o(mr)o(big)o(@h)o(ost)o(.c)o(om)o("\)\))o(;)0
-1192 y(icalproperty_add)o(_p)o(ara)o(me)o(te)o(r\(p)o(ro)o(pe)o(rty)o
-(,i)o(ca)o(lpa)o(ra)o(me)o(ter)o(_n)o(ew_)o(ro)o(le)o(\(IC)o(AL)o(_R)o
-(OLE)o(_C)o(HA)o(IR\))g(\);)0 1306 y(icalcomponent_ad)o(d_)o(pro)o(pe)o
-(rt)o(y\(e)o(ve)o(nt)o(,pr)o(op)o(er)o(ty\))o(;)p 0 1506
-V 0 1722 a Fa(6.1.2)94 b(v)-5 b(aargs)32 b(Constructors)0
-1932 y(6.1.3)94 b(P)m(arsing)32 b(T)-8 b(ext)32 b(Files)0
-2161 y Fb(6.2)112 b(A)m(ccessing)37 b(Comp)s(onen)m(ts)0
-2371 y Fa(6.2.1)94 b(Finding)30 b(Comp)s(onen)m(ts)0
-2582 y(6.2.2)94 b(Remo)m(ving)29 b(Comp)s(onen)m(ts)0
-2792 y Fg(Remo)n(ving)23 b(an)h(elemen)n(t)h(from)f(a)g(list)g(while)h
-(iterating)e(through)h(the)h(list)f(can)g(cause)g(problems,)g(since)g
-(y)n(ou)g(will)g(probably)0 2905 y(b)r(e)e(remo)n(ving)e(the)i(elemen)n
-(t)g(that)g(the)g(in)n(ternal)f(iterator)f(p)r(oin)n(ts)i(to.)34
-b(This)22 b(will)g(result)f(in)h(the)g(iteration)f(lo)r(op)h
-(terminating)0 3019 y(immediately)29 b(after)f(remo)n(ving)g(the)h
-(elemen)n(t.)41 b(T)-7 b(o)28 b(a)n(v)n(oid)g(the)h(problem,)f(y)n(ou)h
-(will)g(need)g(to)f(step)h(the)h(iterator)d(ahead)h(of)0
-3132 y(the)g(elemen)n(t)g(y)n(ou)e(are)h(going)f(to)i(remo)n(v)n(e,)e
-(lik)n(e)h(this:)p 0 3202 V 0 3385 a Fc(for\(c)41 b(=)j
-(icalcomponent_g)o(et)o(_fi)o(rs)o(t_)o(com)o(po)o(ne)o(nt\()o(pa)o(re)
-o(nt_)o(co)o(mp,)o(IC)o(AL)o(_AN)o(Y_)o(CO)o(MPO)o(NE)o(NT)o(\);)305
-3499 y(c)f(!=)g(0;)305 3612 y(c)g(=)g(next)0 3726 y({)174
-3839 y(next)f(=)h(icalcomponent_get)o(_n)o(ex)o(t_c)o(om)o(po)o(nen)o
-(t\()o(pa)o(ren)o(t_)o(com)o(p,)o(IC)o(AL_)o(AN)o(Y_)o(COM)o(PO)o(NE)o
-(NT\))o(;)174 3953 y(icalcomponent_rem)o(ov)o(e_)o(com)o(po)o(ne)o
-(nt\()o(pa)o(re)o(nt_)o(co)o(mp)o(,c\))o(;)0 4067 y(})p
-0 4267 V eop
-%%Page: 5 5
-5 4 bop 0 -167 3900 5 v 0 -200 a Fa(6.)73 b(Using)32
-b(libical)3190 b Fg(5)0 162 y Fa(6.2.3)94 b(Finding)30
-b(Prop)s(erties)0 372 y(6.2.4)94 b(Remo)m(ving)29 b(Prop)s(erties)0
-582 y(6.2.5)94 b(Getting)31 b(V)-8 b(alues)0 792 y(6.2.6)94
-b(Setting)31 b(V)-8 b(alues)0 1002 y(6.2.7)94 b(Getting)31
-b(P)m(arameters)0 1212 y(6.2.8)94 b(Setting)31 b(P)m(arameters)0
-1422 y(6.2.9)94 b(Remo)m(ving)29 b(P)m(arameters)0 1632
-y(6.2.10)93 b(Chec)m(king)32 b(Comp)s(onen)m(t)e(V)-8
-b(alidit)m(y)0 1861 y Fb(6.3)112 b(Storing)37 b(Ob)6
-b(jects)0 2071 y Fg(The)27 b(libical)g(distribution)h(inclues)f(a)g
-(sep)r(erate)f(library)-7 b(,)26 b(libicalss,)h(that)g(allo)n(ws)f(y)n
-(ou)g(to)i(store)e(iCal)h(comp)r(onen)n(t)g(data)f(to)0
-2185 y(disk)h(in)h(a)f(v)-5 b(ariet)n(y)27 b(of)h(w)n(a)n(ys.)35
-b(This)27 b(library)g(is)g(do)r(cumen)n(ted)h(sep)r(erately)-7
-b(.)0 2476 y Fb(6.4)112 b(Memory)37 b(Managemen)m(t)0
-2686 y Fg(Libical)25 b(relies)f(hea)n(vily)g(on)h(dynamic)g(allo)r
-(cation)f(for)h(b)r(oth)h(the)f(core)f(ob)5 b(jects)25
-b(and)g(for)f(the)i(strings)e(used)h(to)g(hold)g(v)-5
-b(alues.)0 2800 y(Some)34 b(of)f(this)h(memory)f(the)h(library)f
-(caller)g(o)n(wns)g(and)g(m)n(ust)h(free,)h(and)f(some)f(of)h(the)g
-(memory)f(is)h(managed)e(b)n(y)i(the)0 2914 y(library)-7
-b(.)36 b(Here)27 b(is)g(a)g(summary)g(of)h(the)g(memory)e(rules.)0
-3153 y Fa(1\))208 3300 y Fg(If)k(the)g(function)g(name)g(has)f
-Fc(")p Fg(new)p Fc(")g Fg(in)h(it,)h(the)f(caller)f(gets)g(con)n(trol)g
-(of)h(the)g(memory)-7 b(.)42 b(\()31 b(suc)n(h)e(as)g(icalcomp)r(onen-)
-208 3413 y(t_new\(\),)f(or)e(icalprop)r(ert)n(y_new_clone\(\))f(\))0
-3593 y Fa(2\))208 3740 y Fg(If)j(y)n(ou)g(got)g(the)h(memory)f(from)g
-(a)g(routine)g(with)h(new)f(in)h(it,)g(y)n(ou)f(m)n(ust)h(call)f(the)h
-(corresp)r(onding)d(*_free)i(routine)208 3854 y(to)f(free)g(the)h
-(memory)-7 b(.)36 b(\()28 b(Use)g(icalcomp)r(onen)n(t_free\(\))e(to)i
-(free)f(ob)5 b(jects)27 b(created)g(with)h(icalcomp)r(onen)n
-(t_new\(\)\))0 4034 y Fa(3\))208 4181 y Fg(If)h(the)g(function)g(name)f
-(has)g Fc(")p Fg(add)p Fc(")g Fg(in)h(it,)g(the)g(caller)e(is)i
-(transfering)e(con)n(trol)g(of)i(the)g(memory)f(to)g(the)h(routine.)40
-b(\()208 4294 y(icalprop)r(ert)n(y_add_parameter\(\))23
-b(\))0 4474 y Fa(4\))208 4621 y Fg(If)29 b(the)h(function)g(name)f(has)
-g Fc(")p Fg(remo)n(v)n(e)p Fc(")e Fg(in)j(it,)g(the)g(caller)f(passes)f
-(in)i(a)f(p)r(oin)n(ter)g(to)g(an)g(ob)5 b(ject)29 b(and)h(after)f(the)
-g(call)208 4735 y(returns,)j(the)h(caller)e(o)n(wns)g(the)h(ob)5
-b(ject.)50 b(So,)33 b(b)r(efore)f(y)n(ou)f(call)h(icalcomp)r(onen)n
-(t_remo)n(v)n(e_prop)r(ert)n(y\(comp,fo)r(o\),)208 4848
-y(y)n(ou)26 b(do)i(not)f(o)n(wn)g Fc(")p Fg(fo)r(o)p
-Fc(")g Fg(and)g(after)g(the)h(call)f(returns,)g(y)n(ou)g(do.)0
-5028 y Fa(5\))208 5175 y Fg(If)d(the)g(routine)f(returns)g(a)g(string,)
-h(libical)g(o)n(wns)f(the)h(memory)f(and)g(will)h(put)g(it)h(on)e(a)g
-(ring)g(bu\033er)h(to)g(reclaim)f(later.)208 5288 y(Y)-7
-b(ou'd)27 b(b)r(etter)h(strdup\(\))g(it)g(if)g(y)n(ou)f(w)n(an)n(t)g
-(to)h(k)n(eep)f(it,)h(and)f(y)n(ou)g(don't)h(ha)n(v)n(e)e(to)h(delete)h
-(it.)0 5580 y Fb(6.5)112 b(Error)36 b(Handling)0 5790
-y Fg(icalerror_errno.)c(Return)c(v)-5 b(alues.)37 b(#de\034nes.)g
-(icalerror_stop_here)p eop
-%%Page: 6 6
-6 5 bop 0 -167 3900 5 v 0 -200 a Fa(7.)73 b(Useful)32
-b(Recipies)3067 b Fg(6)0 162 y Fa(6.5.1)94 b(Return)31
-b(v)-5 b(alues)0 372 y(6.5.2)94 b(icalerrno)0 582 y(6.5.3)g(Comp)s
-(onen)m(t)29 b(errors)0 811 y Fb(6.6)112 b(Naming)36
-b(Standard)0 1021 y Fg(Structures)26 b(that)i(y)n(ou)e(access)f(with)j
-(the)f("struct")f(k)n(eyw)n(ord,)f(suc)n(h)h(as)h("struct)f(icaltimet)n
-(yp)r(e")g(are)g(things)h(that)g(y)n(ou)f(are)0 1134
-y(allo)n(w)n(ed)g(to)i(see)f(inside)g(and)h(p)r(ok)n(e)f(at.)0
-1291 y(Structures)33 b(that)h(y)n(ou)e(access)g(though)i(a)f(t)n(yp)r
-(edef,)i(suc)n(h)e(as)g("icalcomp)r(onen)n(t")e(are)i(things)g(where)g
-(all)g(of)h(the)f(data)g(is)0 1405 y(hidden.)0 1561 y(Comp)r(onen)n(t)
-28 b(names)g(that)h(start)f(with)h("V")f(are)f(part)h(of)h(RF)n(C)f
-(2445)f(or)g(another)h(iCal)g(standard.)38 b(Comp)r(onen)n(t)29
-b(names)0 1675 y(that)h(start)f(with)i("X")e(are)g(also)g(part)g(of)h
-(the)g(sp)r(ec,)g(but)h(they)f(are)f(not)h(actually)f(comp)r(onen)n(ts)
-g(in)h(the)g(sp)r(ec.)44 b(Ho)n(w)n(ev)n(er,)0 1788 y(they)34
-b(lo)r(ok)f(and)g(act)h(lik)n(e)f(comp)r(onen)n(ts,)h(so)f(they)h(are)f
-(comp)r(onen)n(ts)g(in)h(libical.)55 b(Names)33 b(that)h(start)f(with)h
-("XLIC")f(or)0 1902 y("X-LIC")26 b(are)h(not)h(part)f(of)g(an)n(y)g
-(iCal)g(sp)r(ec.)37 b(They)27 b(are)g(used)h(in)n(ternally)e(b)n(y)i
-(libical.)0 2058 y(En)n(ums)d(that)f(iden)n(tify)h(a)f(comp)r(onen)n
-(t,)h(prop)r(ert)n(y)-7 b(,)24 b(v)-5 b(alue)24 b(or)g(parameter)e(end)
-j(with)g("_COMPONENT,")e("_PR)n(OPER-)0 2172 y(TY,")k("_V)-9
-b(ALUE,")28 b(or)e("_P)-7 b(AAMETER"s)0 2328 y(En)n(ums)31
-b(that)f(iden)n(tify)h(a)f(parameter)f(v)-5 b(alue)30
-b(ha)n(v)n(e)f(the)i(name)f(of)h(the)f(parameter)f(as)h(the)h(second)e
-(w)n(ord.)45 b(F)-7 b(or)29 b(instance:)0 2442 y(ICAL_R)n(OLE_REQP)-7
-b(AR)g(TICIP)g(ANT)29 b(or)d(ICAL_P)-7 b(AR)g(TST)g(A)g(T_A)n(CCEPTED.)
-0 2598 y(The)28 b(en)n(ums)f(for)g(the)h(parts)f(of)g(a)g(recurarance)e
-(rule)j(and)f(request)g(statuses)g(are)f(irregular.)0
-2937 y Fd(7)131 b(Useful)44 b(Recipies)0 3175 y Fg(Iteration)0
-3332 y(Cop)n(ying)26 b(comp)r(onen)n(ts.)37 b(Remem)n(b)r(er)27
-b(that)h(y)n(ou)f(m)n(ust)g(clone)g(or)g(remo)n(v)n(e)f(an)h(ob)5
-b(ject)28 b(b)r(efore)f(putting)h(in)g(on)f(anothr)g(list.)0
-3488 y(Finding)h(compliance)f(errors)0 3827 y Fd(8)131
-b(P)l(erformance)0 4065 y Fg(Chec)n(king)27 b(restrictions)f(is)h
-(computationally)g(exp)r(ensiv)n(e)0 4404 y Fd(9)131
-b(Hac)l(ks)45 b(and)e(Bugs)p eop
-%%Trailer
-end
-userdict /end-hook known{end-hook}if
-%%EOF
diff --git a/libical/doc/UsingLibical.sgml b/libical/doc/UsingLibical.sgml
deleted file mode 100644
index d967bd860c..0000000000
--- a/libical/doc/UsingLibical.sgml
+++ /dev/null
@@ -1,318 +0,0 @@
-<!doctype linuxdoc system>
-
-<!-- LinuxDoc file was created by LyX 1.0 (C) 1995-1999 by <eric> Wed Jan 5 22:30:06 2000
- -->
- <article>
- <title>
-Using Libical
- </title>
- <author>
-Eric Busboom (eric@softwarestudio.org)
- </author>
- <date>
-January 2000
- </date>
- <sect>
-Introduction
- <p>
-Libical is an Open Source implementation of the iCalendar protocols and
- protocol data units. The iCalendar specification describes how calendar clients
- can communicate with calendar servers for users can store their calendar data
- and arrange meetings with other users.
- </p>
- <p>
-Libical implements the following specifications and protocols
- </p>
- <p>
-iCal Core
-2445
-iTIP
-2446
-iMIP
-2447
-iRIP
-draft
-CAP
-draft
- </p>
- <p>
-(The current version, 0.14, does not implement iRip or CAP. )
- </p>
- <p>
-This code is under active development. If you would like to contribute
- to the project, you can contact me, Eric Busboom, at eric@softwarestudio.org.
- The project has a webpage at
- </p>
- <p>
- <quote>
-http://softwarestudio.org/libical/index.html
- </quote>
-</p> <p>
-and a mailing list that you can join by sending the following mail:
- </p>
- <p>
- <code>
-------------
-To: minimalist@softwarestudio.org
-Subject: subscribe libical
-------------
- </code>
-</p> <p>
-&dollar;Id: UsingLibical.lyx,v 1.3 2000/01/06 06:20:06 eric Exp eric &dollar;
- </p>
- <sect1>
-License
- <p>
-The code and datafiles in this distribution are licensed under the Mozilla
- Public License. See http://www.mozilla.org/NPL/MPL-1.0.html for a copy of the
- license. Alternately, you may use libical under the terms of the GNU Library
- General Public License. See http://www.fsf.org/copyleft/lesser.html for a copy
- of the LGPL.
- </p>
- <p>
-This dual license ensures that the library can be incorporated into both
- proprietary code and GPL'd programs, and will benefit from improvements made
- by programmers in both realms. I will only accept changes into my version of
- the library if they are similarly dual-licensed.
- </p>
- <sect1>
-Purpose &amp; Goals
- <sect>
-Building the Library
- <sect>
-Structure
- <p>
-The iCal calendar model is based on four types of objects: components,
- properties, values and parameters.
- </p>
- <p>
-Components are the fundamental grouping of calendar information
- </p>
- <p>
-Properties are the fundamental unit of information. Each property is composed
- of a type, a value and collection of parameters.
- </p>
- <sect1>
-Components
- <p>
-Components are named clusters of properties
- </p>
- <sect1>
-Properties
- <sect1>
-Values
- <sect1>
-Parameters
- <sect1>
-Storage
- <sect2>
-Cluster
- <sect2>
-Store
- <sect2>
-Calendar
- <sect1>
-Other bits
- <p>
-Restrictions
- </p>
- <p>
-Types
- </p>
- <sect>
-Differences From RFCs
- <p>
-Although libical has been design to follow the standards as closely as
- possible, there are a few areas where the specifications are irregular, and
- following them exactly would result in an unfriendly interface.
- </p>
- <sect1>
-Pseudo Components
- <p>
-Libical defines pseudo components for groups of properties that look and
- act like components, but are not defined as components in the specification.
- XDAYLIGHT and XSTANDARD are notable examples. These pseudo components group
- properties within the VTIMEZONE components. XDAYLIGHT starts with "BEGIN:DAYLIGHT"
- and ends with "END:DAYLIGHT, just like other components, but is not defined
- as a component in RFC2445. ( See RFC2445, page 61 ) In Libical, it is a component.
-
- </p>
- <p>
-There are also pseudo componentsthat are conceptually derived classess
- of VALARM. RFC2446 defines what properties may be included in each component,
- and for VALARM, the set of properties it may have depends on the value of the
- ACTION property.
- </p>
- <p>
-For instance, if a VALARM component has an ACTION property with the value
- of "AUDIO," the component must also have an "ATTACH" property. However, if the
- ACTION value is "DISPLAY," the component must have a DESCRIPTION property.
- </p>
- <p>
-To handle these various, complex restrictions, libical has pseudo components
- for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and XPROCEDUREALARM.
-
- </p>
- <sect1>
-Combined Values
- <p>
-Many values can take more than one type. TRIGGER, for instance, can have
- a value type of with DURATION or of DATE-TIME. It is natural to have interfaces
- that would return the value of a property, but it is cumbersone for a single
- routine to return multiple types. So, in libical, properties that can have
- multiple types are given a single type that is the union of their RFC2445 types.
- In libical, the value of the TRIGGER property resolves to
- </p>
- <p>
-struct icaltriggertype
- </p>
- <p>
-This type is a union of a DURATION and a DATE-TIME.
- </p>
- <sect1>
-Multi-Valued Properties
- <p>
-Some properties, such as CATEGORIES, have a single value type, but may
- have multiple values in a single instance. This also results in a cumbersome
- interface -- CATEGORIES accessors would have to return a list which all other
- accessors returned a single value. In libical, all properties have a single
- value, and multi-valued properties are broken down into multiple single valued
- properties during parsing. The is,
- </p>
- <p>
- <code>
-CATEGORIES: work, home
- </code>
-</p> <p>
-becomes in libical's internal representation
- </p>
- <p>
- <code>
-CATEGORIES: work
-CATEGORIES: home
- </code>
-</p> <p>
-Oddly, RFC2445 allows some multi-valued properties ( like FREEBUSY ) to
- exist as both a multi-values property and as multiple single value properties,
- while others ( like CATEGORIES ) can only exist as single multi-valued properties.
- This makes the internal representation for CATEGORIES illegal. However when
- you convert a component to a string, the library will collect all of the CATEGORIES
- properties into one.
- </p>
- <sect>
-Implementation Limitations
- <sect>
-Using libical
- <sect1>
-Creating Components
- <sect2>
-Constructor interfaces
- <sect2>
-vaargs Constructors
- <sect2>
-Parsing Text Files
- <sect1>
-Accessing Components
- <sect2>
-Finding Components
- <sect2>
-Removing Components
- <p>
-Removing an element from a list while iterating through the list can cause
- problems, since you will probably be removing the element that the internal
- iterator points to. This will result in the iteration loop terminating immediately
- after removing the element. To avoid the problem, you will need to step the
- iterator ahead of the element you are going to remove, like this:
- </p>
- <p>
- <code>
-for(c = icalcomponent_get_first_component(s);
- c != 0;
- c = next)
-&lcub;
- next = icalcomponent_get_next_component(s);
- icalcomponent_remove_component(s,c);
-&rcub;
- </code>
-</p> <sect2>
-Finding Properties
- <sect2>
-Removing Properties
- <sect2>
-Getting Values
- <sect2>
-Setting Values
- <sect2>
-Getting Parameters
- <sect2>
-Setting Parameters
- <sect2>
-Removing Parameters
- <sect1>
-Storing Objects
- <p>
-When you store a component to the database with icalstore_add_component,
- you give the library takes the memory, so the caller does not own the component
- anymore. If you want to keep ownership, use clone to make a copy. ( See "Memory
- Management" and "Naming Starndard for more about routines with "add" in the name.
- )
- </p>
- <sect1>
-Memory Management
- <p>
-Here are the memory rules for the C library:
- </p>
- <p>
- <descrip>
- <tag>
-1)</tag>If the function name has &quot;new&quot; in it, the caller gets
- control of the memory. ( such as icalcomponent_new(), or icalproperty_new_clone()
- )
- <tag>
-2)</tag>If you got the memory from a routine with new in it, you must
- call the corresponding *_free routine to free the memory. ( Use icalcomponent_free()
- to free objects created with icalcomponent_new())
- <tag>
-3)</tag>If the function name has &quot;add&quot; in it, the caller is
- transfering control of the memory to the routine. ( icalproperty_add_parameter()
- )
- <tag>
-4)</tag>If the function name has &quot;remove&quot; in it, the caller
- passes in a pointer to an object and after the call returns, the caller owns
- the object. So, before you call icalcomponent_remove_property(comp,foo), you
- do not own &quot;foo&quot; and after the call returns, you do.
- <tag>
-5)</tag>If the routine returns a string, libical owns the memory and will
- put it on a ring buffer to reclaim later. You'd better strdup it if you want
- to keep it, and you don't have to delete it.
- </descrip>
-</p> <sect1>
-Error Handling
- <sect2>
-Return values
- <sect2>
-icalerrno
- <sect2>
-Component errors
- <sect1>
-Naming Standard
- <p>
-Structures that you access with the "struct" keyword, such as "struct icaltimetype"
- are things that you are allowed to see inside and poke at.
- </p>
- <p>
-Structures that you access though a typedef, such as "icalcomponent" are
- things where all of the data is hidden.
- </p>
- <p>
-Component names that start with "V" are part of RFC 2445 or another iCal
- standard. Component names that start with "X" are also part of the spec, but
- they are not actually components in the spec. However, they look and act like
- components, so they are components in libical. Names that start with "XLIC" or
- "X-LIC" are not part of any iCal spec. They are used internally by libical.
- </p>
- <sect>
-Hacks and Bugs
-
-
- </article>
diff --git a/libical/doc/UsingLibical.txt b/libical/doc/UsingLibical.txt
deleted file mode 100644
index f80ea31121..0000000000
--- a/libical/doc/UsingLibical.txt
+++ /dev/null
@@ -1,302 +0,0 @@
-
-
-Using Libical
-
-Eric Busboom (eric@softwarestudio.org)
-
-January 2000
-
-1 Introduction
-
-Libical is an Open Source implementation of the iCalendar protocols
-and protocol data units. The iCalendar specification describes how
-calendar clients can communicate with calendar servers for users can
-store their calendar data and arrange meetings with other users.
-
-Libical implements the following specifications and protocols
-
-+----------+-------+
-|iCal Core | 2445 |
-+----------+-------+
-+----------+-------+
-| iTIP | 2446 |
-+----------+-------+
-+----------+-------+
-| iMIP | 2447 |
-+----------+-------+
-+----------+-------+
-| iRIP | draft |
-+----------+-------+
-+----------+-------+
-| CAP | draft |
-+----------+-------+
-
-
-(The current version, 0.14, does not implement iRip or CAP. )
-
-This documentation assumes that you are familiar with the iCalendar
-standards RFC2445 and RFC2446.
-
-1.1 The libical project
-
-This code is under active development. If you would like to contribute
-to the project, you can contact me, Eric Busboom, at eric@softwarestudio.org.
-The project has a webpage at
-
-http://softwarestudio.org/libical/index.html
-
-and a mailing list that you can join by sending the following mail:
-
-------------
-
-To: minimalist@softwarestudio.org
-
-Subject: subscribe libical
-
-------------
-
-1.2 License
-
-The code and datafiles in this distribution are licensed under the
-Mozilla Public License. See http://www.mozilla.org/NPL/MPL-1.0.html
-for a copy of the license. Alternately, you may use libical under
-the terms of the GNU Library General Public License. See http://www.fsf.org/copyleft/lesser.html
-for a copy of the LGPL.
-
-This dual license ensures that the library can be incorporated into
-both proprietary code and GPL'd programs, and will benefit from improvements
-made by programmers in both realms. I will only accept changes into
-my version of the library if they are similarly dual-licensed.
-
-1.3 Purpose & Goals
-
-1.4 Document version
-
-$Id$
-
-2 Building the Library
-
-3 Structure
-
-The iCal calendar model is based on four types of objects: components,
-properties, values and parameters.
-
-Properties are the fundamental unit of information in iCal, and they
-work a bit like a hash entry, with a constant key and a variable value.
-Properties may also have modifiers, called parameters. In the iCal
-content line
-
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
-
-The property name is ``ORGANIZER,'' the value of the property is ``mrbig@host.com''
-and the ``ROLE'' parameter specifies that Mr Big is the chair of the
-meetings associated with this property.
-
-Components are groups of properties that represent the core objects
-of a calendar system, such as events or timezones.
-
-The central goal of libical is to parse iTIP data into an internal
-representation of Components, Properties, Parameters an Values, and
-to allow the user to manipulate the data in various ways
-
-3.1 Components
-
-3.2 Properties
-
-3.3 Values
-
-3.4 Parameters
-
-3.5 Enumerations
-
-3.6 Types
-
-3.7 The Parser
-
-3.8 Restrictions
-
-3.9 Memory Management
-
-4 Differences From RFCs
-
-Libical has been designed to follow the standards as closely as possible,
-so that the key objects in the standards are also keey objects in
-the library. However, there are a few areas where the specifications
-are (arguably) irregular, and following them exactly would result
-in an unfriendly interface. These deviations make libical easier to
-use by maintaining a self-similar interface.
-
-4.1 Pseudo Components
-
-Libical defines components for groups of properties that look and act
-like components, but are not defined as components in the specification.
-XDAYLIGHT and XSTANDARD are notable examples. These pseudo components
-group properties within the VTIMEZONE components. XDAYLIGHT starts
-with ``BEGIN:DAYLIGHT'' and ends with ``END:DAYLIGHT, just like other
-components, but is not defined as a component in RFC2445. ( See RFC2445,
-page 61 ) In Libical, it is a component.
-
-There are also pseudo components that are conceptually derived classess
-of VALARM. RFC2446 defines what properties may be included in each
-component, and for VALARM, the set of properties it may have depends
-on the value of the ACTION property.
-
-For instance, if a VALARM component has an ACTION property with the
-value of ``AUDIO,'' the component must also have an ``ATTACH'' property.
-However, if the ACTION value is ``DISPLAY,'' the component must have
-a DESCRIPTION property.
-
-To handle these various, complex restrictions, libical has pseudo components
-for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and
-XPROCEDUREALARM.
-
-4.2 Combined Values
-
-Many values can take more than one type. TRIGGER, for instance, can
-have a value type of with DURATION or of DATE-TIME. These multiple
-types make it difficult to create routines to return the value associated
-with a property.
-
-It is natural to have interfaces that would return the value of a property,
-but it is cumbersone for a single routine to return multiple types.
-So, in libical, properties that can have multiple types are given
-a single type that is the union of their RFC2445 types. For instance,
-in libical, the value of the TRIGGER property resolves to struct icaltriggertype.
-This type is a union of a DURATION and a DATE-TIME.
-
-4.3 Multi-Valued Properties
-
-Some properties, such as CATEGORIES have only one value type, but each
-CATEGORIES property can have multiple value instances. This also results
-in a cumbersome interface -- CATEGORIES accessors would have to return
-a list while all other accessors returned a single value. In libical,
-all properties have a single value, and multi-valued properties are
-broken down into multiple single valued properties during parsing.
-That is, an input line like,
-
-CATEGORIES: work, home
-
-becomes in libical's internal representation
-
-CATEGORIES: work
-
-CATEGORIES: home
-
-Oddly, RFC2445 allows some multi-valued properties ( like FREEBUSY
-) to exist as both a multi-values property and as multiple single
-value properties, while others ( like CATEGORIES ) can only exist
-as single multi-valued properties. This makes the internal representation
-for CATEGORIES illegal. However when you convert a component to a
-string, the library will collect all of the CATEGORIES properties
-into one.
-
-5 Implementation Limitations
-
-6 Using libical
-
-6.1 Creating Components
-
-6.1.1 Constructor Interfaces
-
-6.1.2 vaargs Constructors
-
-6.1.3 Parsing Text Files
-
-6.2 Accessing Components
-
-6.2.1 Finding Components
-
-6.2.2 Removing Components
-
-Removing an element from a list while iterating through the list can
-cause problems, since you will probably be removing the element that
-the internal iterator points to. This will result in the iteration
-loop terminating immediately after removing the element. To avoid
-the problem, you will need to step the iterator ahead of the element
-you are going to remove, like this:
-
-for(c = icalcomponent_get_first_component(s);
-
- c != 0;
-
- c = next)
-
-{
-
- next = icalcomponent_get_next_component(s);
-
- icalcomponent_remove_component(s,c);
-
-}
-
-6.2.3 Finding Properties
-
-6.2.4 Removing Properties
-
-6.2.5 Getting Values
-
-6.2.6 Setting Values
-
-6.2.7 Getting Parameters
-
-6.2.8 Setting Parameters
-
-6.2.9 Removing Parameters
-
-6.2.10 Checking Component Validity
-
-6.3 Storing Objects
-
-The libical distribution inclues a seperate library, libicalss, that
-allows you to store iCal component data to disk in a variety of ways.
-This library is documented seperately.
-
-6.4 Memory Management
-
-Here are the memory rules for the library:
-
-1) If the function name has "new" in it, the caller gets control
- of the memory. ( such as icalcomponent_new(), or icalproperty_new_clone()
- )
-
-2) If you got the memory from a routine with new in it, you must
- call the corresponding *_free routine to free the memory. ( Use
- icalcomponent_free() to free objects created with icalcomponent_new())
-
-3) If the function name has "add" in it, the caller is transfering
- control of the memory to the routine. ( icalproperty_add_parameter() )
-
-4) If the function name has "remove" in it, the caller passes in
- a pointer to an object and after the call returns, the caller owns
- the object. So, before you call icalcomponent_remove_property(comp,foo),
- you do not own "foo" and after the call returns, you do.
-
-5) If the routine returns a string, libical owns the memory and will
- put it on a ring buffer to reclaim later. You'd better strdup it
- if you want to keep it, and you don't have to delete it.
-
-6.5 Error Handling
-
-6.5.1 Return values
-
-6.5.2 icalerrno
-
-6.5.3 Component errors
-
-6.6 Naming Standard
-
-Structures that you access with the ``struct'' keyword, such as ``struct
-icaltimetype'' are things that you are allowed to see inside and poke
-at.
-
-Structures that you access though a typedef, such as ``icalcomponent''
-are things where all of the data is hidden.
-
-Component names that start with ``V'' are part of RFC 2445 or another
-iCal standard. Component names that start with ``X'' are also part
-of the spec, but they are not actually components in the spec. However,
-they look and act like components, so they are components in libical.
-Names that start with ``XLIC'' or ``X-LIC'' are not part of any iCal
-spec. They are used internally by libical.
-
-7 Hacks and Bugs
diff --git a/libical/install-sh b/libical/install-sh
deleted file mode 100755
index 0ff4b6a08e..0000000000
--- a/libical/install-sh
+++ /dev/null
@@ -1,119 +0,0 @@
-#!/bin/sh
-
-#
-# install - install a program, script, or datafile
-# This comes from X11R5; it is not part of GNU.
-#
-# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-#
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-
-instcmd="$mvprog"
-chmodcmd=""
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-
-while [ x"$1" != x ]; do
- case $1 in
- -c) instcmd="$cpprog"
- shift
- continue;;
-
- -m) chmodcmd="$chmodprog $2"
- shift
- shift
- continue;;
-
- -o) chowncmd="$chownprog $2"
- shift
- shift
- continue;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift
- shift
- continue;;
-
- -s) stripcmd="$stripprog"
- shift
- continue;;
-
- *) if [ x"$src" = x ]
- then
- src=$1
- else
- dst=$1
- fi
- shift
- continue;;
- esac
-done
-
-if [ x"$src" = x ]
-then
- echo "install: no input file specified"
- exit 1
-fi
-
-if [ x"$dst" = x ]
-then
- echo "install: no destination specified"
- exit 1
-fi
-
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-if [ -d $dst ]
-then
- dst="$dst"/`basename $src`
-fi
-
-# Make a temp file name in the proper directory.
-
-dstdir=`dirname $dst`
-dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
-$doit $instcmd $src $dsttmp
-
-# and set any options; do chmod last to preserve setuid bits
-
-if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi
-if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi
-if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi
-if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi
-
-# Now rename the file to the real destination.
-
-$doit $rmcmd $dst
-$doit $mvcmd $dsttmp $dst
-
-
-exit 0
diff --git a/libical/missing b/libical/missing
deleted file mode 100755
index 7789652e87..0000000000
--- a/libical/missing
+++ /dev/null
@@ -1,190 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
-# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# 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, 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.
-
-if test $# -eq 0; then
- echo 1>&2 "Try \`$0 --help' for more information"
- exit 1
-fi
-
-case "$1" in
-
- -h|--h|--he|--hel|--help)
- echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
- -h, --help display this help and exit
- -v, --version output version information and exit
-
-Supported PROGRAM values:
- aclocal touch file \`aclocal.m4'
- autoconf touch file \`configure'
- autoheader touch file \`config.h.in'
- automake touch all \`Makefile.in' files
- bison create \`y.tab.[ch]', if possible, from existing .[ch]
- flex create \`lex.yy.c', if possible, from existing .c
- lex create \`lex.yy.c', if possible, from existing .c
- makeinfo touch the output file
- yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
- ;;
-
- -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
- echo "missing - GNU libit 0.0"
- ;;
-
- -*)
- echo 1>&2 "$0: Unknown \`$1' option"
- echo 1>&2 "Try \`$0 --help' for more information"
- exit 1
- ;;
-
- aclocal)
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified \`acinclude.m4' or \`configure.in'. You might want
- to install the \`Automake' and \`Perl' packages. Grab them from
- any GNU archive site."
- touch aclocal.m4
- ;;
-
- autoconf)
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified \`configure.in'. You might want to install the
- \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
- archive site."
- touch configure
- ;;
-
- autoheader)
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified \`acconfig.h' or \`configure.in'. You might want
- to install the \`Autoconf' and \`GNU m4' packages. Grab them
- from any GNU archive site."
- files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in`
- test -z "$files" && files="config.h"
- touch_files=
- for f in $files; do
- case "$f" in
- *:*) touch_files="$touch_files "`echo "$f" |
- sed -e 's/^[^:]*://' -e 's/:.*//'`;;
- *) touch_files="$touch_files $f.in";;
- esac
- done
- touch $touch_files
- ;;
-
- automake)
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
- You might want to install the \`Automake' and \`Perl' packages.
- Grab them from any GNU archive site."
- find . -type f -name Makefile.am -print |
- sed 's/\.am$/.in/' |
- while read f; do touch "$f"; done
- ;;
-
- bison|yacc)
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified a \`.y' file. You may need the \`Bison' package
- in order for those modifications to take effect. You can get
- \`Bison' from any GNU archive site."
- rm -f y.tab.c y.tab.h
- if [ $# -ne 1 ]; then
- eval LASTARG="\${$#}"
- case "$LASTARG" in
- *.y)
- SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
- if [ -f "$SRCFILE" ]; then
- cp "$SRCFILE" y.tab.c
- fi
- SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
- if [ -f "$SRCFILE" ]; then
- cp "$SRCFILE" y.tab.h
- fi
- ;;
- esac
- fi
- if [ ! -f y.tab.h ]; then
- echo >y.tab.h
- fi
- if [ ! -f y.tab.c ]; then
- echo 'main() { return 0; }' >y.tab.c
- fi
- ;;
-
- lex|flex)
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified a \`.l' file. You may need the \`Flex' package
- in order for those modifications to take effect. You can get
- \`Flex' from any GNU archive site."
- rm -f lex.yy.c
- if [ $# -ne 1 ]; then
- eval LASTARG="\${$#}"
- case "$LASTARG" in
- *.l)
- SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
- if [ -f "$SRCFILE" ]; then
- cp "$SRCFILE" lex.yy.c
- fi
- ;;
- esac
- fi
- if [ ! -f lex.yy.c ]; then
- echo 'main() { return 0; }' >lex.yy.c
- fi
- ;;
-
- makeinfo)
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified a \`.texi' or \`.texinfo' file, or any other file
- indirectly affecting the aspect of the manual. The spurious
- call might also be the consequence of using a buggy \`make' (AIX,
- DU, IRIX). You might want to install the \`Texinfo' package or
- the \`GNU make' package. Grab either from any GNU archive site."
- file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
- if test -z "$file"; then
- file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
- file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
- fi
- touch $file
- ;;
-
- *)
- echo 1>&2 "\
-WARNING: \`$1' is needed, and you do not seem to have it handy on your
- system. You might have modified some files without having the
- proper tools for further handling them. Check the \`README' file,
- it often tells you about the needed prerequirements for installing
- this package. You may also peek at any GNU archive site, in case
- some other package would contain this missing \`$1' program."
- exit 1
- ;;
-esac
-
-exit 0
diff --git a/libical/mkinstalldirs b/libical/mkinstalldirs
deleted file mode 100644
index e61d682697..0000000000
--- a/libical/mkinstalldirs
+++ /dev/null
@@ -1,40 +0,0 @@
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-# Author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain
-
-# $Id: mkinstalldirs,v 1.4 2000/06/06 22:48:06 alves Exp $
-
-errstatus=0
-
-for file
-do
- set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
- shift
-
- pathcomp=
- for d
- do
- pathcomp="$pathcomp$d"
- case "$pathcomp" in
- -* ) pathcomp=./$pathcomp ;;
- esac
-
- if test ! -d "$pathcomp"; then
- echo "mkdir $pathcomp" 1>&2
-
- mkdir "$pathcomp" || lasterr=$?
-
- if test ! -d "$pathcomp"; then
- errstatus=$lasterr
- fi
- fi
-
- pathcomp="$pathcomp/"
- done
-done
-
-exit $errstatus
-
-# mkinstalldirs ends here \ No newline at end of file
diff --git a/libical/scripts/.cvsignore b/libical/scripts/.cvsignore
deleted file mode 100644
index b840c21800..0000000000
--- a/libical/scripts/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile.in
-Makefile \ No newline at end of file
diff --git a/libical/scripts/Makefile.am b/libical/scripts/Makefile.am
deleted file mode 100644
index fd1b053cb6..0000000000
--- a/libical/scripts/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-EXTRA_DIST = \
-mkderivedcomponents.pl \
-mkderivedparameters.pl \
-mkderivedproperties.pl \
-mkderivedvalues.pl \
-mkparameterrestrictions.pl \
-mkrestrictionrecords.pl \
-mkrestrictiontable.pl
diff --git a/libical/scripts/mkderivedcomponents.pl b/libical/scripts/mkderivedcomponents.pl
deleted file mode 100755
index ac4e472250..0000000000
--- a/libical/scripts/mkderivedcomponents.pl
+++ /dev/null
@@ -1,170 +0,0 @@
-#!/usr/local/bin/perl
-
-use Getopt::Std;
-getopts('chspi:');
-
-
-# ARG 0 is components.txt
-open(PV,"$ARGV[0]") || die "Can't open components file $ARGV[0]:$!";
-
-my @components;
-
-while (<PV>){
-
- s/#.*//;
-
- chop;
-
- push(@components,$_);
-
-}
-
-close PV;
-
-# Write the file inline by copying everything before a demarcation
-# line, and putting the generated data after the demarcation
-
-if ($opt_i) {
-
- open(IN,$opt_i) || die "Can't open input file \"$opt_i\"";
-
- while(<IN>){
-
- if (/Do not edit/){
- last;
- }
-
- print;
-
- }
-
- if($opt_i){
- print "# Everything below this line is machine generated. Do not edit. \n";
- } else {
- print "/* Everything below this line is machine generated. Do not edit. */\n";
- }
-
-}
-
-if ($opt_c or $opt_h and !$opt_i){
-
-print <<EOM;
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalderivedproperties.{c,h}
- CREATOR: eric 09 May 1999
-
- \044Id:\044
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
-
- ======================================================================*/
-
-/*
- * THIS FILE IS MACHINE GENERATED DO NOT EDIT
- */
-
-#include <stdarg.h> /* for va_arg functions */
-
-EOM
-
-}
-
-if ($opt_p and !$opt_i){
-
-print <<EOM;
-
-EOM
-
-}
-
-
-foreach $comp (@components) {
-
- next if !$comp;
-
- my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$comp));
- my $lc = lc($ucf);
- my $uc = uc($lc);
-
- if($opt_c) { # Make C source
- print<<EOM;
-
-/* $comp */
-
-icalcomponent* icalcomponent_new_${lc}()
-{
- return (icalcomponent*)icalcomponent_new_impl(ICAL_${uc}_COMPONENT);
-}
-
-icalcomponent* icalcomponent_vanew_${lc}(...)
-{
- va_list args;
- struct icalcomponent_impl *impl = icalcomponent_new_impl(ICAL_${uc}_component);
-
- va_start(args,v);
- icalcomponent_add_properties(impl, args);
- va_end(args);
-
- return (icalcomponent*)impl;
-}
-
-EOM
-
-
- } elsif ($opt_h) { # Make a C header
- print<<EOM;
-
-/* $comp */
-icalcomponent* icalcomponent_new_${lc}();
-icalcomponent* icalcomponent_vanew_${lc}(...);
-EOM
-
-} elsif ($opt_s) { # Make something for a switch statement
-
-print <<EOM;
-case ICAL_${uc}_PROPERTY:
-EOM
-
-} elsif ($opt_p) { # make perl source
-
-print <<EOM;
-
-# $comp
-package Net::ICal::Component::${ucf};
-\@ISA=qw(Net::ICal::Component);
-
-sub new
-{
- my \$package = shift;
- my \$c = Net::ICal::icalcomponent_new(\$Net::ICal::ICAL_${uc}_COMPONENT);
-
- my \$self = Net::ICal::Component::new_from_ref(\$c);
- Net::ICal::Component::_add_elements(\$self,\\\@_);
-
- # Self is blessed in new_from_ref
-
- return \$self;
-
-}
-EOM
-
-}
-
-
-
-}
-
-
diff --git a/libical/scripts/mkderivedparameters.pl b/libical/scripts/mkderivedparameters.pl
deleted file mode 100755
index 2b505c878a..0000000000
--- a/libical/scripts/mkderivedparameters.pl
+++ /dev/null
@@ -1,277 +0,0 @@
-#!/usr/local/bin/perl
-
-use Getopt::Std;
-getopts('chspi:');
-
-%no_xname = (RELATED=>1,RANGE=>1,RSVP=>1,XLICERRORTYPE=>1,XLICCOMPARETYPE=>1);
-
-# Usually, open param-c-types.txt
-open(F,"$ARGV[0]") || die "Can't open C parameter types file $ARGV[0]:$!";
-
-# Write the file inline by copying everything before a demarcation
-# line, and putting the generated data after the demarcation
-
-if ($opt_i) {
-
- open(IN,$opt_i) || die "Can't open input file $opt_i";
-
- while(<IN>){
-
- if (/Do not edit/){
- last;
- }
-
- print;
-
- }
-
- if($opt_p){
- print "# Everything below this line is machine generated. Do not edit. \n";
- } else {
- print "/* Everything below this line is machine generated. Do not edit. */\n";
- }
-
-}
-
-
-
-if (($opt_c or $opt_h) and !$opt_i) {
-
-print <<EOM;
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalderivedparameters.{c,h}
- CREATOR: eric 09 May 1999
-
- \044Id: mkderivedparameters.pl,v 1.1 1999/05/14 07:04:31 eric Exp eric \044
- \044Locker: eric \044
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
-
- ======================================================================*/
-
-/*
- * THIS FILE IS MACHINE GENERATED DO NOT EDIT
- */
-
-
-EOM
-
-}
-
-if ($opt_p and !$opt_i){
-
-print <<EOM;
-# -*- Mode: Perl -*-
-# ======================================================================
-# \044Id:\044
-#
-# (C) COPYRIGHT 1999 Eric Busboom
-# http://www.softwarestudio.org
-#
-# The contents of this file are subject to the Mozilla Public License
-# Version 1.0 (the "License"); you may not use this file except in
-# compliance with the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and
-# limitations under the License.
-#
-# The original author is Eric Busboom
-# The original code is derivedparams.h
-#
-# ======================================================================*/
-
-EOM
-
-}
-
-
-while(<F>){
-
- chop;
- my ($param,$type) = split(/\s{2,}/,$_);
-
- my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$param));
-
- my $lc = lc($ucf);
- my $uc = uc($lc);
-
- my $lctype = lc($type);
-
-
- my $charorenum;
- my $set_code;
- my $pointer_check;
- my $new_pointer_check;
- my $new_pointer_check_v;
- my $xrange;
-
- if ($type=~/char/){
- $new_pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");";
- $new_pointer_check_v = "icalerror_check_arg_rv( (v!=0),\"v\");";
- }
-
-
- if ($type=~/char/ ) {
-
- $charorenum = " icalerror_check_arg_rz( (param!=0), \"param\");\n return ((struct icalparameter_impl*)param)->string;";
-
- $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");";
-
- $set_code = "((struct icalparameter_impl*)param)->string = strdup(v);"
-
- } else {
-
- $xrange =" if ( ((struct icalparameter_impl*)param)->string != 0){\n return ICAL_${uc}_XNAME;\n }\n" if !exists $no_xname{$uc};
-
- $charorenum=<<EOM;
- icalerror_check_arg( (param!=0), \"param\");
-$xrange
- return ((struct icalparameter_impl*)param)->data.v_${lc};
-EOM
-
- $pointer_check = "icalerror_check_arg( (v!=0),\"v\");";
-
- $set_code = "((struct icalparameter_impl*)param)->data.v_${lc} = v;";
-
- $print_code = "switch (impl->data.v_${lc}) {\ncase ICAL_${uc}_: {\n}\ncase ICAL_${uc}_XNAME: /* Fall Through */\n}\n";
-
- }
-
-
-
- if ($opt_c) {
-
- print <<EOM;
-/* $param */
-icalparameter* icalparameter_new_${lc}($type v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- $new_pointer_check
- impl = icalparameter_new_impl(ICAL_${uc}_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_${lc}((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-${type} icalparameter_get_${lc}(icalparameter* param)
-{
- icalerror_clear_errno();
-$charorenum
-}
-
-void icalparameter_set_${lc}(icalparameter* param, ${type} v)
-{
- $new_pointer_check_v
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- $set_code
-}
-
-EOM
-
- } elsif( $opt_h) {
-
- print <<EOM;
-/* $param */
-icalparameter* icalparameter_new_${lc}($type v);
-${type} icalparameter_get_${lc}(icalparameter* value);
-void icalparameter_set_${lc}(icalparameter* value, ${type} v);
-
-EOM
-
-} elsif ($opt_s) {
-
-next if $type =~ /char/;
-
-print<<EOM;
-case ICAL_${uc}_PARAMETER:
-{
- $print_code
-}
-EOM
-
-}
-
- if ($opt_p) {
-
- print <<EOM;
-
-# $param
-
-package Net::ICal::Parameter::${ucf};
-\@ISA=qw(Net::ICal::Parameter);
-
-sub new
-{
- my \$self = [];
- my \$package = shift;
- my \$value = shift;
-
- bless \$self, \$package;
-
- my \$p;
-
- if (\$value) {
- \$p = Net::ICal::icalparameter_new_from_string(\$Net::ICal::ICAL_${uc}_PARAMETER,\$value);
- } else {
- \$p = Net::ICal::icalparameter_new(\$Net::ICal::ICAL_${uc}_PARAMETER);
- }
-
- \$self->[0] = \$p;
-
- return \$self;
-}
-
-sub get
-{
- my \$self = shift;
- my \$impl = \$self->_impl();
-
- return Net::ICal::icalparameter_as_ical_string(\$impl);
-
-}
-
-sub set
-{
- # This is hard to implement, so I've punted for now.
- die "Set is not implemented";
-}
-
-EOM
-
-}
-
-}
-
-if ($opt_h){
-
-print <<EOM;
-#endif ICALPARAMETER_H
-EOM
-}
diff --git a/libical/scripts/mkderivedproperties.pl b/libical/scripts/mkderivedproperties.pl
deleted file mode 100755
index 010e35d178..0000000000
--- a/libical/scripts/mkderivedproperties.pl
+++ /dev/null
@@ -1,290 +0,0 @@
-#!/usr/local/bin/perl
-
-use Getopt::Std;
-getopts('chsypmi:');
-
-# ARG 0 is prop-to-value
-open(PV,"$ARGV[0]") || die "Can't open prop to value file $ARGV[0]:$!";
-
-
-while (<PV>){
-
- chop;
- my @v = split(/\s+/,$_);
-
- my $prop = shift @v;
- my $value = shift @v;
- my $comment = join(" ",@v);
-
- $propmap{$prop} = $value;
-}
-
-close PV;
-
-# ARG 1 is value-c-types.txt
-open(F,"$ARGV[1]") || die "Can't open C parameter types file $ARGV[1 ]:$!";
-
-while (<F>){
-
- chop;
- my @v = split(/\t+/,$_);
-
- my $value = shift @v;
- my $type = shift @v;
- my $comment = join(" ",@v);
-
- $valuemap{$value} = $type;
-
-}
-
-close F;
-
-# Write the file inline by copying everything before a demarcation
-# line, and putting the generated data after the demarcation
-
-if ($opt_i) {
-
- open(IN,$opt_i) || die "Can't open input file $opt_i";
-
- while(<IN>){
-
- if (/Do not edit/){
- last;
- }
-
- print;
-
- }
-
- if($opt_p){
- print "# Everything below this line is machine generated. Do not edit. \n";
- } else {
- print "/* Everything below this line is machine generated. Do not edit. */\n";
- }
-
-}
-
-
-if ( ($opt_h or $opt_s) and !$opt_i ){
-
-print <<EOM;
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalderivedproperties.{c,h}
- CREATOR: eric 09 May 1999
-
- \044Id:\044
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
-
- ======================================================================*/
-
-/*
- * THIS FILE IS MACHINE GENERATED. DO NOT EDIT
- */
-
-
-EOM
-
-}
-
-
-if ($opt_p and !$opt_i){
-
-print <<EOM;
-
-EOM
-
-}
-
-foreach $prop (keys %propmap) {
-
- next if !$prop;
-
- my $value = $propmap{$prop};
-
- if (!$value){
- die "Can't find value for property \"$prop\"\n";
- }
-
- my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$prop));
- my $lc = lc($ucf);
- my $uc = uc($lc);
-
- my $ucfvalue = join("",map {ucfirst(lc($_));} split(/-/,$value));
- my $lcvalue = lc($ucfvalue);
- my $ucvalue = uc($lcvalue);
-
- my $type = $valuemap{$value};
-
- my $pointer_check;
- if ($type =~ /\*/){
- $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");\n" if $type =~ /\*/;
- } elsif ( $type eq "void" ){
- $pointer_check = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/;
-
- }
-
- my $set_pointer_check = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/;
-
- if($opt_c) { # Generate C source
- print<<EOM;
-
-/* $prop */
-
-icalproperty* icalproperty_new_${lc}($type v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_${uc}_PROPERTY);
- $pointer_check
-
- icalproperty_set_${lc}((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_${lc}($type v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_${uc}_PROPERTY);
- $pointer_check
-
- icalproperty_set_${lc}((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_${lc}(icalproperty* prop, $type v)
-{
- icalvalue *value;
-
- $set_pointer_check
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_${lcvalue}(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-$type icalproperty_get_${lc}(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_${lcvalue}(value);
-}
-EOM
-
-
- } elsif ($opt_h) { # Generate C Header file
- print<<EOM;
-
-/* $prop */
-icalproperty* icalproperty_new_${lc}($type v);
-icalproperty* icalproperty_vanew_${lc}($type v, ...);
-void icalproperty_set_${lc}(icalproperty* prop, $type v);
-$type icalproperty_get_${lc}(icalproperty* prop);
-EOM
-
-} elsif ($opt_s) { # Generate case in a switch statement
-
-print <<EOM;
-case ICAL_${uc}_PROPERTY:
-EOM
-
-
-} elsif ($opt_p) { # Generate perl code
-
-print <<EOM;
-
-package Net::ICal::Property::${ucf};
-use Net::ICal::Property;
-\@ISA=qw(Net::ICal::Property);
-sub new
-{
- my \$package = shift;
-
- my \$p = Net::ICal::icalproperty_new(\$Net::ICal::ICAL_${uc}_PROPERTY);
- my \$self = Net::ICal::Property::new_from_ref(\$p);
-
- \$self->_add_elements(\\\@_);
-
- return bless \$self, \$package;
-}
-
-sub set_value
-{
- my \$self = shift;
- my \$v = shift;
-
- my \$impl = \$self->_impl();
-
-
- if ( ref \$v && Net::ICal::icalvalue_isa_value(\$v->_impl())){
- Net::ICal::icalproperty_set_value(\$impl,\$v->_impl);
- } else {
- my \$value = Net::ICal::icalvalue_new_from_string(\$Net::ICal::ICAL_${ucvalue}_VALUE,\$v);
- die if !\$impl;
- Net::ICal::icalproperty_set_value(\$impl,\$value) unless !\$value;
- }
-
-}
-
-sub get_value
-{
- my \$self = shift;
- my \$impl = \$self->_impl();
-
- if (defined \$impl){
- my \$value = Net::ICal::icalproperty_get_value(\$impl);
- return "" if !\$value;
- return Net::ICal::icalvalue_as_ical_string(\$value);
- } else {
- return "";
- }
-}
-
-EOM
-
-} elsif ($opt_m) { # Generate a map
-
-print "\'${uc}\' => \'Net::ICal::Property::${ucf},\'\n";
-
-}
-
-} # This brace terminates the main loop
-
-
-
-# Add things to the end of the output.
-
-if ($opt_p)
-{
- print "1;\n";
-}
-
-if ($opt_h){
-
-print <<EOM;
-#endif ICALPROPERTY_H
-EOM
-}
-
diff --git a/libical/scripts/mkderivedvalues.pl b/libical/scripts/mkderivedvalues.pl
deleted file mode 100755
index ca2ee4b3a1..0000000000
--- a/libical/scripts/mkderivedvalues.pl
+++ /dev/null
@@ -1,307 +0,0 @@
-#!/usr/bin/perl
-
-
-use Getopt::Std;
-getopts('chspi:');
-
-#Options
-# c -> generate c code file
-# h-> generate header file
-# s -> generate switch statement
-
-# Open with value-c-types.txt
-
-
-open(F,"$ARGV[0]") || die "Can't open values data file $ARGV[0]:$!";
-
-
-# Write the file inline by copying everything before a demarcation
-# line, and putting the generated data after the demarcation
-
-if ($opt_i) {
-
- open(IN,$opt_i) || die "Can't open input file $opt_i";
-
- while(<IN>){
-
- if (/Do not edit/){
- last;
- }
-
- print;
-
- }
-
- if($opt_p){
- print "# Everything below this line is machine generated. Do not edit. \n";
- } else {
- print "/* Everything below this line is machine generated. Do not edit. */\n";
- }
-
-}
-
-
-if (($opt_c || $opt_h) and !$opt_i) {
-print <<EOM;
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalderivedvalues.{c,h}
- CREATOR: eric 09 May 1999
-
- \044Id:\044
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- ======================================================================*/
-
-/*
- * THIS FILE IS MACHINE GENERATED DO NOT EDIT
- */
-
-
-
-EOM
-}
-
-if ($opt_p and !$opt_i){
-
-print <<EOM;
-# -*- Mode: Perl -*-
-# ======================================================================
-# \044Id:\044
-#
-# (C) COPYRIGHT 1999 Eric Busboom
-# http://www.softwarestudio.org
-#
-# The contents of this file are subject to the Mozilla Public License
-# Version 1.0 (the "License"); you may not use this file except in
-# compliance with the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and
-# limitations under the License.
-#
-# The original author is Eric Busboom
-# The original code is derivedvalues.h
-#
-# ======================================================================*/
-
-EOM
-
-}
-
-# Map type names to the value in the icalvalue_impl data union */
-
-%union_map = (
- BOOLEAN => 'int',
- CALADDRESS=>'string',
- DATE=>'time',
- DATETIME=>'time',
- DATETIMEDATE=>'time',
- DATETIMEPERIOD=>'period',
- DURATION=>'duration',
- INTEGER=>'int',
- TEXT=>'string',
- URI=>'string',
- UTCOFFSET=>'int',
- QUERY=>'string',
- BINARY=>'string'
- );
-
-while(<F>)
-{
-
- chop;
- my @v = split(/\t+/,$_);
-
- my $value = shift @v;
- my $type = shift @v;
- my $comment = join(" ",@v);
-
- my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$value));
-
- my $lc = lc($ucf);
- my $uc = uc($lc);
-
- my $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");\n" if $type =~ /\*/;
- my $pointer_check_rv = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/;
-
- my $assign;
-
- if ($type =~ /char/){
- $assign = "strdup(v);\n\n if (impl->data.v_string == 0){\n errno = ENOMEM;\n }\n";
- } else {
- $assign = "v;";
- }
-
- my $union_data;
-
- if (exists $union_map{$uc} ){
- $union_data=$union_map{$uc};
- } else {
- $union_data = $lc;
- }
-
- if ($opt_c) {
-print <<EOM;
-
-icalvalue*
-icalvalue_new_${lc} ($type v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_${uc}_VALUE);
-
- $pointer_check
- icalvalue_set_${lc}((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_${lc}(icalvalue* value, $type v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
- $pointer_check_rv
- icalerror_check_value_type(value, ICAL_${uc}_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_${union_data} = $assign
-}
-
-$type
-icalvalue_get_${lc}(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_${uc}_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_${union_data};
-}
-
-EOM
-
-} elsif($opt_h) {
-
- print <<EOM;
-/* $value $comment */
-icalvalue* icalvalue_new_${lc}($type v);
-$type icalvalue_get_${lc}(icalvalue* value);
-void icalvalue_set_${lc}(icalvalue* value, ${type} v);
-
-EOM
-
-} elsif ($opt_s) {
-
-if ( $ud{$union_data}++ == 0) {
-
-print<<EOM;
-char* icalvalue_${union_data}_as_ical_string(icalvalue* value) {
-
- $type data;
- char temp[1024];
- char *str;
- icalerror_check_arg( (value!=0),"value");
- data = ((struct icalvalue_impl*)value)->data.v_${union_data}
-
- str = strdup(temp);
-
- return str;
-}
-
-EOM
-
-}
-} elsif ($opt_p) { # Generate perl code
-
-print <<EOM;
-
-package Net::ICal::Value::${ucf};
-use Net::ICal::Value;
-\@ISA=qw(Net::ICal::Value);
-sub new
-{
- my \$self = [];
- my \$package = shift;
- my \$value = shift;
-
- bless \$self, \$package;
-
- my \$p;
-
- if (\$value){
- \$p = Net::ICal::icalvalue_new_from_string(\$Net::ICal::ICAL_${uc}_VALUE,\$value);
- } else {
- \$p = Net::ICal::icalvalue_new(\$Net::ICal::ICAL_${uc}_VALUE);
- }
-
- \$self->[0] = \$p;
-
- return \$self;
-}
-
-sub set
-{
- my \$self = shift;
- my \$v = shift;
-
- my \$impl = \$self->_impl();
-
- if (\$v) {
- my \$new_value = Net::ICal::icalvalue_new_from_string(\$Net::ICal::ICAL_${uc}_VALUE,\$v);
- if (\$new_value){
- Net::ICal::icalvalue_free(\$self->[0]);
- \$self->[0] = \$new_value;
- }
-
- }
-
-}
-
-sub get
-{
- my \$self = shift;
- my \$impl = \$self->[0];
-
- if (defined \$impl){
-
- return Net::ICal::icalvalue_as_ical_string(\$impl);
-
- }
-}
-
-EOM
-}
-
-
-
-}
-
-if ($opt_p)
-{
- print "1;\n";
-}
-
-
-if ($opt_h){
-
-print <<EOM;
-#endif ICALVALUE_H
-EOM
-}
-
-
-__END__
-
diff --git a/libical/scripts/mkparameterrestrictions.pl b/libical/scripts/mkparameterrestrictions.pl
deleted file mode 100755
index 2c57eb4ca5..0000000000
--- a/libical/scripts/mkparameterrestrictions.pl
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/perl
-
-# Version: 1.0
-# Script last updated: 30May1999 GMD
-# Change log:
-# <none>
-
-
-# usually open params-in-prop.txt
-open(F,"$ARGV[0]") || die "Can't open restriction file $ARGV[0]:$!";
-
-print <<EOM;
-/*
- ======================================================================
- File: parameterrestrictions.c
-
- (C) COPYRIGHT 1999 Graham Davison
- mailto:g.m.davison\@computer.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
-
- ======================================================================*/
-
-/*
- * THIS FILE IS MACHINE GENERATED DO NOT EDIT
- */
-
-
-int icalrestriction_is_parameter_allowed(icalproperty_kind prop,icalparameter_kind param)
-{
- switch (prop)
- {
-EOM
-
-while(<F>)
-{
- chop;
-
- # split line by whitespace
- my @v = split(/\s+/,$_);
- # property is first item on line
- my $prop = shift @v;
- my $prop_name = $prop;
- if (substr($prop,0,1) eq "X") { $prop = "X"; }
- $prop = join("",split(/-/,$prop));
-
-print <<EOM;
-
- /* ${prop_name} */
- case ICAL_${prop}_PROPERTY:
- switch (param)
- {
-EOM
-
- foreach $param (@v)
- {
- $param = join("",split(/-/,$param));
- print "\t\t\t\tcase ICAL_${param}_PARAMETER:\n";
- }
-
-print <<EOM;
- return 1;
- default:
- return 0;
- }
-
-EOM
-
-}
-
-print <<EOM;
- }
-
- return 0;
-}
-EOM
diff --git a/libical/scripts/mkrestrictionrecords.pl b/libical/scripts/mkrestrictionrecords.pl
deleted file mode 100755
index e2c62ae748..0000000000
--- a/libical/scripts/mkrestrictionrecords.pl
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/usr/bin/perl
-
-# Version: 1.0
-# Script last updated: 30May1999 GMD
-# Change log:
-# <none>
-
-# usually open restrictions.csv
-open(F,"$ARGV[0]") || die "Can't open restriction file $ARGV[0]:$!";
-
-print <<EOM;
-/*
- ======================================================================
- File: restrictionrecords.c
-
- (C) COPYRIGHT 1999 Graham Davison
- mailto:g.m.davison\@computer.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
-
- ======================================================================*/
-
-
-/*
- * THIS FILE IS MACHINE GENERATED DO NOT EDIT
- */
-
-
-typedef struct icalrestriction_record {
- icalproperty_method method;
- icalcomponent_kind component;
- icalproperty_kind property;
- icalcomponent_kind subcomponent;
- icalrestriction_kind restriction;
-} icalrestriction_record;
-
-
-icalrestriction_record icalrestriction_records[] =
-{
-EOM
-
-my $last_method = "";
-my $last_component = "";
-my $last_property = "";
-my $need_header = 0;
-
-while(<F>)
-{
- chop;
-
- # split line at commas
- my ($method,$component,$property,$subcomponent,$restriction)=split(/\,/,$_);
-
- #
- #put in code to generate comments here!
- #
- if ($method ne $last_method)
- {
- $need_header = 1;
- $last_method = $method;
- }
- if ($component ne $last_component)
- {
- $need_header = 1;
- $last_component = $component;
- }
-
- if ($need_header)
- {
- print "\n\t/* METHOD: ${method}, COMPONENT: ${component} */\n";
- $need_header = 0;
- }
-
- foreach $item ($component,$property,$subcomponent,$restriction)
- {
- # handle special cases.
- if ($item eq "NONE")
- { $item = "NO"; }
- else { if (substr($item,0,1) eq "X")
- { $item = "X"; }}
-
- # strip out dashes
- $item = join("",split(/-/,$item));
- }
- # strip leading V from component names
- $component =~ s/^(V?)(\w+?)((SAVINGS)?)((TIME)?)$/$2/;
- $subcomponent =~ s/^V(\w+)/$1/;
-
- print "\t\{ICAL_METHOD_${method},ICAL_${component}_COMPONENT,";
- print "ICAL_${property}_PROPERTY,ICAL_${subcomponent}_COMPONENT,";
- print "ICAL_RESTRICTION_${restriction}\},\n";
-
-}
-
-print <<EOM;
-
- /* END */
- {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE}
-};
-EOM
diff --git a/libical/scripts/mkrestrictiontable.pl b/libical/scripts/mkrestrictiontable.pl
deleted file mode 100755
index 1dab5709b9..0000000000
--- a/libical/scripts/mkrestrictiontable.pl
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/usr/bin/perl
-
-use Getopt::Std;
-getopts('i:');
-
-# the argument should be the path to the restriction datafile, usually
-# design-data/restrictions.csv
-open(F,"$ARGV[0]") || die "Can't open restriction data file $ARGV[0]:$!";
-
-# Write the file inline by copying everything before a demarcation
-# line, and putting the generated data after the demarcation
-
-if ($opt_i) {
-
- open(IN,$opt_i) || die "Can't open input file $opt_i";
-
- while(<IN>){
-
- if (/Do not edit/){
- last;
- }
-
- print;
-
- }
-
- print "/* Everything below this line is machine generated. Do not edit. */\n";
-
-
- close IN;
-}
-
-# First build the property restriction table
-print "icalrestriction_property_record icalrestriction_property_records[] = {\n";
-
-while(<F>)
-{
-
- chop;
-
- s/\#.*$//;
-
- my($method,$targetcomp,$prop,$subcomp,$restr,$sub) = split(/,/,$_);
-
- next if !$method;
-
- if(!$sub) {
- $sub = "0";
- }
-
- if($prop ne "NONE"){
- print(" \{ICAL_METHOD_${method},ICAL_${targetcomp}_COMPONENT,ICAL_${prop}_PROPERTY,ICAL_RESTRICTION_${restr},$sub\},\n");
- }
-
-}
-
-
-# Print the terminating line
-print " {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_NONE}\n";
-
-print "};\n";
-
-print "icalrestriction_component_record icalrestriction_component_records[] = {\n";
-
-
-# Go back through the entire file and build the component restriction table
-close(F);
-open(F,"$ARGV[0]") || die "Can't open restriction data file $ARGV[0]:$!";
-
-while(<F>)
-{
-
- chop;
-
- s/\#.*$//;
-
- my($method,$targetcomp,$prop,$subcomp,$restr,$sub) = split(/,/,$_);
-
- next if !$method;
-
- if(!$sub) {
- $sub = "0";
- }
-
-
- if($subcomp ne "NONE"){
- print(" \{ICAL_METHOD_${method},ICAL_${targetcomp}_COMPONENT,ICAL_${subcomp}_COMPONENT,ICAL_RESTRICTION_${restr},$sub\},\n");
- }
-
-}
-
-# print the terminating line
-print " {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE}\n";
-print "};\n";
diff --git a/libical/src/.cvsignore b/libical/src/.cvsignore
deleted file mode 100644
index c038ed7864..0000000000
--- a/libical/src/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in \ No newline at end of file
diff --git a/libical/src/Makefile.am b/libical/src/Makefile.am
deleted file mode 100644
index 37dc5e39cb..0000000000
--- a/libical/src/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = libical libicalss test
diff --git a/libical/src/libical/.cvsignore b/libical/src/libical/.cvsignore
deleted file mode 100644
index 708af857d7..0000000000
--- a/libical/src/libical/.cvsignore
+++ /dev/null
@@ -1,14 +0,0 @@
-Makefile
-Makefile.in
-icalitipy.c
-icalitipy.h
-icalitipl.c
-icallexer.c
-icalyacc.c
-icalyacc.h
-y.output
-*.lo
-*.la
-.libs
-.deps
-icalversion.h
diff --git a/libical/src/libical/.gdb_history b/libical/src/libical/.gdb_history
deleted file mode 100644
index 55362e9165..0000000000
--- a/libical/src/libical/.gdb_history
+++ /dev/null
@@ -1,457 +0,0 @@
-run
-ptype E
-graph display E
-quit
-run
-print E
-graph display E
-up
-print p
-graph display p
-ptype p
-info line 'p'
-graph display p
-print parameter_iterator
-break icalproperty.c:182
-run
-next
-print p
-graph display p
-quit
-run
-up
-graph display p
-print parameter_iterator
-graph display p
-print *(p)
-quit
-show directories
-run
-run
-y
-list usecases.c
-list test_parameters
-info line 'main'
-info line 'test_parameters'
-info line 'icalproperty_vanew_comment'
-ptype icalproperty_add_parameters
-info line 'icalproperty_add_parameters'
-run
-up
-info line 'icalproperty_vanew_comment'
-info line 'icalproperty_add_parameters'
-break icalproperty.c:51
-run
-step
-next
-nexti
-info line 'icalproperty_vanew_comment'
-info line 'icalproperty_add_parameters'
-break icalproperty.c:53
-run
-next
-graph display vp
-break icalparameter_isa_parameter
-cont
-run
-step
-next
-quit
-run
-break icalcomponent_get_first_property
-break icalcomponent_get_next_property
-break icalcomponent_new
-run
-next
-step
-next
-step
-next
-graph display impl
-up
-down
-next
-graph display *(impl)
-next
-cont
-next
-graph display c
-next
-graph display *(prop)
-next
-step
-quit
-run
-up
-graph display p
-down
-print E
-up
-print *(prop)
-graph display *(prop)
-down
-up
-print prop
-print param
-down
-up
-print p
-up
-break usecases.c:522
-run
-step
-next
-up
-run
-step
-next
-step
-next
-quit
-run
-up
-quit
-info line 'test_memory'
-break b1
-break usecases.c:558
-run
-graph display *(f)
-graph display *(p)
-next
-run
-next
-step
-next
-print pos
-print *(pos)
-graph display string
-graph display *(pos)
-next
-set variable *pos = 0x8053520
-next
-step
-next
-print buf_size
-print *(buf_size)
-print *(string)
-ptype string
-next
-run
-print f
-graph display f
-graph display p
-next
-step
-next
-run
-next
-graph display bufsize
-next
-quit
-graph display test_memory
-info line 'test_memory'
-break usecases.c:560
-run
-graph display f
-next
-graph display p
-print p -f
-print strlen(S1)
-next
-print p - f
-print strlen(S1) + strlen(S2)
-next
-break usecases.c:572
-run
-cont
-step
-graph display *(pos)
-next
-step
-quit
-info line 'test_memory'
-break usecases.c:560
-set args
-run
-next
-graph display f
-graph display p
-next
-graph display bufsize
-run
-next
-set args
-run
-quit
-info line 'test_memory'
-break usecases.c:560
-graph display f
-graph display p
-run
-graph display f
-graph display p
-graph display bufsize
-next
-down
-up
-quit
-run
-where
-frame 2
-break icalmemory.c:79
-run
-next
-run
-graph display buffer_ring
-run
-ont(box, font) = font(box, font);
-_fontfix(box) = fontfix(box);
-ont(box, font) = font(box, font);
-#pragma override font
-font(box, font) = _fontfix(_font(box, string(font)));
-ont(box, font) = font(box, font);
-ist
-list
-print buffer_ring[buffer_pos]
-break icalmemory.c:77
-run
-cont
-quit
-run
-up
-break icalmemory.c:77
-break icalmemory.c:78
-run
-graph display buffer_ring
-next
-cont
-quit
-run
-up
-break icalmemory.c:77
-run
-break icalmemory.c:78
-cont
-graph display buffer_ring[buffer_pos]
-quit
-break usecases.c:560
-run
-step
-break icalmemory.c:129
-disable 2
-next
-info line 'icalmemory_resize_buffer'
-break icalmemory.c:79
-cont
-run
-cont
-next
-run
-cont
-graph display buffer_ring[buffer_pos]
-graph display buffer_ring
-break icalmemory.c:78
-run
-graph display buffer_pos
-cont
-run
-cont
-quit
-info line 'test_memory'
-info line 'icalmemory_append_string'
-break icalmemory.c:78
-break icalmemory.c:79
-run
-graph display buffer_ring
-graph display buffer_ring[buffer_pos]
-graph display buffer_pos
-cont
-next
-free( buffer_ring[2]
-free( buffer_ring[2] )
-call free(buffer_ring[2] )
-call free(buffer_ring[1] )
-free(buffer_ring[1])
-run
-cont
-set variable buffer_pos = 2
-next
-run
-cont
-run
-cont
-run
-cont
-next
-quit
-info line 'test_memory'
-info line 'icalmemory_append_string'
-break icalmemory.c:78
-break icalmemory.c:79
-run
-graph display buffer_ring
-graph display buffer_pos
-graph display buffer_ring[buffer_pos]
-cont
-run
-cont
-set variable buffer_pos = 2
-next
-cont
-next
-cont
-run
-next
-run
-quit
-info line 'test_memory'
-info line 'icalmemory_append_string'
-break icalmemory.c:76
-break icalmemory.c:77
-run
-graph display buffer_ring
-graph display buffer_pos
-graph display buffer_ring[buffer_pos]
-cont
-next
-cont
-next
-cont
-run
-cont
-next
-cont
-run
-cont
-next
-graph display rtrn
-next
-run
-next
-cont
-next
-run
-step
-run
-next
-quit
-run
-up
-print pos
-graph display string
-run
-up
-break usecases.c:572
-run
-print bufsize
-step
-next
-step
-quit
-run
-up
-graph display buf_size
-graph display *(buf_size)
-break icalmemory.c:136
-run
-next
-run
-graph display *(new_buf)
-quit
-run
-up
-down
-break icalmemory.c:136
-run
-graph display *(new_buf)
-quit
-run
-up
-break icalmemory.c:136
-run
-print *(new_buf)
-next
-print *buf_size
-print *bu
-print *buf
-next
-print new_buf
-quit
-run
-up
-break icalmemory.c:136
-run
-print *(new_buf)
-graph display *(new_buf)
-graph display new_pos
-graph display *(buf)
-next
-graph display new_buf
-run
-next
-run
-graph display *(pos)
-next
-quit
-info line 'test_memory'
-info line 'icalmemory_append_string'
-break icalmemory.c:136
-run
-graph display *(buf_size)
-next
-quit
-info line 'test_memory'
-break usecases.c:570
-run
-step
-next
-delete 1
-until usecases.c:572
-step
-next
-graph display *(buf_size)
-next
-graph display *(pos)
-graph display *(buf)
-graph display *(new_buf)
-graph display new_buf
-next
-graph display string
-print *pos - *buf
-run
-break icalmemory.c:136
-run
-next
-set variable *pos = 0x8054993
-next
-run
-next
-set variable *pos = 0x8054980
-set variable *pos = 0x8054700
-next
-run
-next
-down
-up
-down
-quit
-run < ../../test-data/1.1
-up
-break icalproperty.c:165
-run
-next
-run
-info line 'icalvalue_as_ical_string'
-break icalvalue.c:424
-cont
-next
-print value
-next
-run
-up
-cont
-up
-print *(prop)
-graph display *(icalproperty_impl*)prop
-quit
-
diff --git a/libical/src/libical/.gdbinit b/libical/src/libical/.gdbinit
deleted file mode 100644
index 19de9b8209..0000000000
--- a/libical/src/libical/.gdbinit
+++ /dev/null
@@ -1,3 +0,0 @@
-directory /home/eric/proj/FreeAssociation/libical/src/pvl/
-path /home/eric/proj/FreeAssociation/libical/src/pvl/
-
diff --git a/libical/src/libical/Makefile.am b/libical/src/libical/Makefile.am
deleted file mode 100644
index d9af51bccd..0000000000
--- a/libical/src/libical/Makefile.am
+++ /dev/null
@@ -1,96 +0,0 @@
-
-#AUTOMAKE_OPTIONS = no-dependencies
-
-#noinst_LTLIBRARIES = libical.la
-lib_LIBRARIES = libical.a
-
-YFLAGS =-d -v -t
-
-libical_a_SOURCES = \
- ical.h \
- icalcomponent.c \
- icalcomponent.h \
- icalenums.c \
- icalenums.h \
- icalerror.c \
- icalerror.h \
- icalyacc.y \
- icallexer.l \
- icalmemory.c \
- icalmemory.h \
- icalparameter.c \
- icalparameter.h \
- icalparser.c \
- icalparser.h \
- icalproperty.c \
- icalproperty.h \
- icalrestriction.c \
- icalrestriction.h \
- icaltypes.c \
- icaltypes.h \
- icalvalue.c \
- icalvalue.h \
- icalvcal.h \
- pvl.c \
- pvl.h
-
-include_HEADERS=\
- ical.h \
- icalcomponent.h \
- icalenums.h \
- icalerror.h \
- icalmemory.h \
- icalparameter.h \
- icalparser.h \
- icalproperty.h \
- icalrestriction.h \
- icaltypes.h \
- icalvalue.h \
- icalvcal.h \
- icalversion.h \
- pvl.h
-
-
-#
-# static convenience library for use in conduits
-#
-
-noinst_LTLIBRARIES = libical-static.la
-libical_static_la_SOURCES = $(libical_a_SOURCES)
-libical_static_la_LDFLAGS = --all-static
-
-EXTRA_DIST = icallexer.c icalyacc.c icalyacc.h
-
-CONFIG_CLEAN_FILES = y.output *~
-
-DESIGNDATA = ../../design-data
-ICALSCRIPTS = ../../scripts
-derived: icalproperty icalparameter icalvalue icalrestriction
-
-icalproperty:
- $(ICALSCRIPTS)/mkderivedproperties.pl -i icalproperty.h -h $(DESIGNDATA)/prop-to-value.txt ${DESIGNDATA}/value-c-types.txt > icalproperty.newh
- mv icalproperty.newh icalproperty.h
-
- $(ICALSCRIPTS)/mkderivedproperties.pl -i icalproperty.c -c $(DESIGNDATA)/prop-to-value.txt ${DESIGNDATA}/value-c-types.txt > icalproperty.newc
- mv icalproperty.newc icalproperty.c
-
-
-icalparameter:
- $(ICALSCRIPTS)/mkderivedparameters.pl -i icalparameter.h -h $(DESIGNDATA)/param-c-types.txt > icalparameter.newh
- mv icalparameter.newh icalparameter.h
-
- $(ICALSCRIPTS)/mkderivedparameters.pl -i icalparameter.c -c $(DESIGNDATA)/param-c-types.txt > icalparameter.newc
- mv icalparameter.newc icalparameter.c
-
-icalvalue:
- $(ICALSCRIPTS)/mkderivedvalues.pl -i icalvalue.h -h $(DESIGNDATA)/value-c-types.txt > icalvalue.newh
- mv icalvalue.newh icalvalue.h
-
- $(ICALSCRIPTS)/mkderivedvalues.pl -i icalvalue.c -c $(DESIGNDATA)/value-c-types.txt > icalvalue.newc
- mv icalvalue.newc icalvalue.c
-
-icalrestriction:
- $(ICALSCRIPTS)/mkrestrictiontable.pl -i icalrestriction.c $(DESIGNDATA)/restrictions.csv > icalrestriction.newc
- mv icalrestriction.newc icalrestriction.c
-
-
diff --git a/libical/src/libical/base64.c b/libical/src/libical/base64.c
deleted file mode 100644
index 5925f977ac..0000000000
--- a/libical/src/libical/base64.c
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
-
- Encode or decode file as MIME base64 (RFC 1341)
-
- by John Walker
- http://www.fourmilab.ch/
-
- This program is in the public domain.
-
-*/
-
-#define REVDATE "11th August 1997"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-
-#define TRUE 1
-#define FALSE 0
-
-#define LINELEN 72 /* Encoded line length (max 76) */
-
-typedef unsigned char byte; /* Byte type */
-
-static FILE *fi = stdin; /* Input file */
-static FILE *fo = stdout; /* Output file */
-static byte iobuf[256]; /* I/O buffer */
-static int iolen = 0; /* Bytes left in I/O buffer */
-static int iocp = 256; /* Character removal pointer */
-static int ateof = FALSE; /* EOF encountered */
-static byte dtable[256]; /* Encode / decode table */
-static int linelength = 0; /* Length of encoded output line */
-static char eol[] = "\r\n"; /* End of line sequence */
-static int errcheck = TRUE; /* Check decode input for errors ? */
-
-/* INBUF -- Fill input buffer with data */
-
-static int inbuf(void)
-{
- int l;
-
- if (ateof) {
- return FALSE;
- }
- l = fread(iobuf, 1, 256, fi); /* Read input buffer */
- if (l <= 0) {
- if (ferror(fi)) {
- exit(1);
- }
- ateof = TRUE;
- return FALSE;
- }
- iolen = l;
- iocp = 0;
- return TRUE;
-}
-
-/* INCHAR -- Return next character from input */
-
-static int inchar(void)
-{
- if (iocp >= iolen) {
- if (!inbuf()) {
- return EOF;
- }
- }
-
- return iobuf[iocp++];
-}
-
-/* OCHAR -- Output an encoded character, inserting line breaks
- where required. */
-
-static void ochar(int c)
-{
- if (linelength >= LINELEN) {
- if (fputs(eol, fo) == EOF) {
- exit(1);
- }
- linelength = 0;
- }
- if (putc(((byte) c), fo) == EOF) {
- exit(1);
- }
- linelength++;
-}
-
-/* ENCODE -- Encode binary file into base64. */
-
-static void encode(void)
-{
- int i, hiteof = FALSE;
-
- /* Fill dtable with character encodings. */
-
- for (i = 0; i < 26; i++) {
- dtable[i] = 'A' + i;
- dtable[26 + i] = 'a' + i;
- }
- for (i = 0; i < 10; i++) {
- dtable[52 + i] = '0' + i;
- }
- dtable[62] = '+';
- dtable[63] = '/';
-
- while (!hiteof) {
- byte igroup[3], ogroup[4];
- int c, n;
-
- igroup[0] = igroup[1] = igroup[2] = 0;
- for (n = 0; n < 3; n++) {
- c = inchar();
- if (c == EOF) {
- hiteof = TRUE;
- break;
- }
- igroup[n] = (byte) c;
- }
- if (n > 0) {
- ogroup[0] = dtable[igroup[0] >> 2];
- ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
- ogroup[2] = dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
- ogroup[3] = dtable[igroup[2] & 0x3F];
-
- /* Replace characters in output stream with "=" pad
- characters if fewer than three characters were
- read from the end of the input stream. */
-
- if (n < 3) {
- ogroup[3] = '=';
- if (n < 2) {
- ogroup[2] = '=';
- }
- }
- for (i = 0; i < 4; i++) {
- ochar(ogroup[i]);
- }
- }
- }
- if (fputs(eol, fo) == EOF) {
- exit(1);
- }
-}
-
-/* INSIG -- Return next significant input */
-
-static int insig(void)
-{
- int c;
-
- /*CONSTANTCONDITION*/
- while (TRUE) {
- c = inchar();
- if (c == EOF || (c > ' ')) {
- return c;
- }
- }
- /*NOTREACHED*/
-}
-
-/* DECODE -- Decode base64. */
-
-static void decode(void)
-{
- int i;
-
- for (i = 0; i < 255; i++) {
- dtable[i] = 0x80;
- }
- for (i = 'A'; i <= 'Z'; i++) {
- dtable[i] = 0 + (i - 'A');
- }
- for (i = 'a'; i <= 'z'; i++) {
- dtable[i] = 26 + (i - 'a');
- }
- for (i = '0'; i <= '9'; i++) {
- dtable[i] = 52 + (i - '0');
- }
- dtable['+'] = 62;
- dtable['/'] = 63;
- dtable['='] = 0;
-
- /*CONSTANTCONDITION*/
- while (TRUE) {
- byte a[4], b[4], o[3];
-
- for (i = 0; i < 4; i++) {
- int c = insig();
-
- if (c == EOF) {
- if (errcheck && (i > 0)) {
- fprintf(stderr, "Input file incomplete.\n");
- exit(1);
- }
- return;
- }
- if (dtable[c] & 0x80) {
- if (errcheck) {
- fprintf(stderr, "Illegal character '%c' in input file.\n", c);
- exit(1);
- }
- /* Ignoring errors: discard invalid character. */
- i--;
- continue;
- }
- a[i] = (byte) c;
- b[i] = (byte) dtable[c];
- }
- o[0] = (b[0] << 2) | (b[1] >> 4);
- o[1] = (b[1] << 4) | (b[2] >> 2);
- o[2] = (b[2] << 6) | b[3];
- i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3);
- if (fwrite(o, i, 1, fo) == EOF) {
- exit(1);
- }
- if (i < 3) {
- return;
- }
- }
-}
-
-/* USAGE -- Print how-to-call information. */
-
-static void usage(char *pname)
-{
- fprintf(stderr, "%s -- Encode/decode file as base64. Call:\n", pname);
- fprintf(stderr,
- " %s [-e[ncode] / -d[ecode]] [-n] [infile] [outfile]\n", pname);
- fprintf(stderr, "\n");
- fprintf(stderr, "Options:\n");
- fprintf(stderr, " -D Decode base64 encoded file\n");
- fprintf(stderr, " -E Encode file into base64\n");
- fprintf(stderr, " -N Ignore errors when decoding\n");
- fprintf(stderr, " -U Print this message\n");
- fprintf(stderr, "\n");
- fprintf(stderr, "by John Walker\n");
- fprintf(stderr, " WWW: http://www.fourmilab.ch/\n");
-}
-
-/* Main program */
-
-int main(int argc, char *argv[])
-{
- int i, f = 0, decoding = FALSE;
- char *cp, opt;
-
- for (i = 1; i < argc; i++) {
- cp = argv[i];
- if (*cp == '-') {
- opt = *(++cp);
- if (islower(opt)) {
- opt = toupper(opt);
- }
- switch (opt) {
-
- case 'D': /* -D Decode */
- decoding = TRUE;
- break;
-
- case 'E': /* -E Encode */
- decoding = FALSE;
- break;
-
- case 'N': /* -N Suppress error checking */
- errcheck = FALSE;
- break;
-
- case 'U': /* -U Print how-to-call information */
- case '?':
- usage(argv[0]);
- return 0;
- }
- } else {
- switch (f) {
-
- /** Warning! On systems which distinguish text mode and
- binary I/O (MS-DOS, Macintosh, etc.) the modes in these
- open statements will have to be made conditional based
- upon whether an encode or decode is being done, which
- will have to be specified earlier. But it's worse: if
- input or output is from standard input or output, the
- mode will have to be changed on the fly, which is
- generally system and compiler dependent. 'Twasn't me
- who couldn't conform to Unix CR/LF convention, so
- don't ask me to write the code to work around
- Apple and Microsoft's incompatible standards. **/
-
- case 0:
- if (strcmp(cp, "-") != 0) {
- if ((fi = fopen(cp, "r")) == NULL) {
- fprintf(stderr, "Cannot open input file %s\n", cp);
- return 2;
- }
- }
- f++;
- break;
-
- case 1:
- if (strcmp(cp, "-") != 0) {
- if ((fo = fopen(cp, "w")) == NULL) {
- fprintf(stderr, "Cannot open output file %s\n", cp);
- return 2;
- }
- }
- f++;
- break;
-
- default:
- fprintf(stderr, "Too many file names specified.\n");
- usage(argv[0]);
- return 2;
- }
- }
- }
-
- if (decoding) {
- decode();
- } else {
- encode();
- }
- return 0;
-}
diff --git a/libical/src/libical/filelock.c b/libical/src/libical/filelock.c
deleted file mode 100644
index 0376bc2bec..0000000000
--- a/libical/src/libical/filelock.c
+++ /dev/null
@@ -1,143 +0,0 @@
-
-/*
- I Stole this from:
- http://www.cis.temple.edu/~ingargio/old/cis307s96/readings/rwlockexample.html
-
- CIS 307: An example using Read/Write File Locks
- [fcntl.h], [fcntl.c], [fcntlmain.c]
-
-In Stevens "Advanced Programming in the Unix Environment" we see ways to use
-the Unix service fcntl to lock portions of a file for reading and writing in
-the manner stated in the Reader and Writer problem [any number of readers at
-a time, but writers must operate alone]. Here we have three files that adapt
-and use the code from Stevens:
-
-*fcntl.h: Specification of the locking functions.
-*fcntl.c: Implementation of the locking functions.
-*fcntlmain.c: Driver that does a simple test of the locking functions.
-
-WARNING: A file lock request which is blocked can be interrupted by a
-signal. In this case the lock operation returns EINTR. Thus we may think we
-got a lock when we really don't. A solution is to block signals when
-locking. Another solution is to test the value returned by the lock
-operation and relock if the value is EINTR. Another solution, which we adopt
-here, is to do nothing about it.
-
-/* fcntl.c -- Defines mutexes in terms of read/write locks on files.
- * (code is mostly from Stevens: Advanced Programming in the
- * Unix environment. See from page 367 on.
- * filerwlock, filerwlockCreate, filerwlockDelete,
- * filerwreadlock, filerwlongreadlock, filerwlongunlock,
- * filerwlockUnlock
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-int lock_reg(int, int, int, off_t, int, off_t);
-
-#define read_lock(fd, offset, whence, len) \
- lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)
-
-#define readw_lock(fd, offset, whence, len) \
- lock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, len)
-
-#define write_lock(fd, offset, whence, len) \
- lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)
-
-#define writew_lock(fd, offset, whence, len) \
- lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)
-
-#define un_lock(fd, offset, whence, len) \
- lock_reg(fd, F_SETLK, F_UNLCK, offset, whence, len)
-
-pid_t lock_test(int, int , off_t , int , off_t );
-
-#define is_readlock(fd, offset, whence, len) \
- lock_test(fd, F_RDLCK, offset, whence, len)
-
-#define is_writelock(fd, offset, whence, len) \
- lock_test(fd, F_WRLCK, offset, whence, len)
-
-int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)
-{
- struct flock lock;
- lock.l_type = type; /* F_RDLCK, F_WRLCK, F_UNLCK */
- lock.l_start = offset; /* byte offset relative to l_whence */
- lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
- lock.l_len = len; /* #bytes (0 means to EOF) */
- return (fcntl(fd, cmd, &lock));
-}
-
-pid_t lock_test(int fd, int type, off_t offset, int whence, off_t len)
-{
- struct flock lock;
- lock.l_type = type; /* F_RDLCK or F_WRLCK */
- lock.l_start = offset; /* byte offset relative to l_whence */
- lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
- lock.l_len = len; /* #bytes (0 means to EOF) */
- if (fcntl(fd,F_GETLK,&lock) < 0){
- perror("fcntl"); exit(1);}
- if (lock.l_type == F_UNLCK)
- return (0); /* false, region is not locked by another process */
- return (lock.l_pid); /* true, return pid of lock owner */
-}
-
-typedef struct {
- int fd;
- int n;} filerwlock;
-
-/* Create N read/write locks and returns the id of this cluster of locks. */
-filerwlock * filerwlockCreate(char *filename, int n) {
- filerwlock *fl = (filerwlock *)malloc(sizeof(filerwlock));
- if (((fl->fd) = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IWUSR)) < 0) {
- perror("open");
- exit(1);}
- fl->n = n;
- return fl;
- }
-
-/* Delete the cluster of read/write locks associated with fl. */
-int filerwlockDelete(filerwlock *fl) {
- if (close(fl->fd) < 0) {
- perror("close");
- exit(1);}
- return free(fl);
- }
-
-/* Given the read/write lock cluster fl, lock its ith element */
-int filerwreadlock(filerwlock *fl, int i) {
- if ((i < 0) | (i >= fl->n)) {
- printf("filerwlockLock needs i in range 0 .. %d\n", (fl->n)-1);
- exit(0);}
- readw_lock(fl->fd, i, SEEK_SET, 1);
- }
-
-int filerwwritelock(filerwlock *fl, int i) {
- if ((i < 0) | (i >= fl->n)) {
- printf("filerwlockLock needs i in range 0 .. %d\n", (fl->n)-1);
- exit(0);}
- writew_lock(fl->fd, i, SEEK_SET, 1);
- }
-
-/* Given the lock cluster fl, unlock its ith element */
-int filerwunlock(filerwlock *fl, int i){
-
- if ((i < 0) | (i >= fl->n)) {
- printf("filerwlockUnlock needs i in range 0 .. %d\n", (fl->n)-1);
- exit(0);}
- un_lock(fl->fd, i, SEEK_SET, 1);
- }
-
-/* Given the lock cluster fl, it read locks all its elements */
-int filerwlongreadlock(filerwlock *fl) {
- readw_lock(fl->fd, 0, SEEK_SET, fl->n);
-}
-
-/* Given the lock cluster fl, it unlocks all its elements */
-int filerwlongunlock(filerwlock *fl) {
- un_lock(fl->fd, 0, SEEK_SET, fl->n);
-}
-
diff --git a/libical/src/libical/filelock.h b/libical/src/libical/filelock.h
deleted file mode 100644
index dbe0715cc6..0000000000
--- a/libical/src/libical/filelock.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- I Stole this from:
- http://www.cis.temple.edu/~ingargio/old/cis307s96/readings/rwlockexample.html
-
- CIS 307: An example using Read/Write File Locks
- [fcntl.h], [fcntl.c], [fcntlmain.c]
-
-In Stevens "Advanced Programming in the Unix Environment" we see ways to use
-the Unix service fcntl to lock portions of a file for reading and writing in
-the manner stated in the Reader and Writer problem [any number of readers at
-a time, but writers must operate alone]. Here we have three files that adapt
-and use the code from Stevens:
-
-*fcntl.h: Specification of the locking functions.
-*fcntl.c: Implementation of the locking functions.
-*fcntlmain.c: Driver that does a simple test of the locking functions.
-
-WARNING: A file lock request which is blocked can be interrupted by a
-signal. In this case the lock operation returns EINTR. Thus we may think we
-got a lock when we really don't. A solution is to block signals when
-locking. Another solution is to test the value returned by the lock
-operation and relock if the value is EINTR. Another solution, which we adopt
-here, is to do nothing about it.
-
-fcntl.h
-
-*/
-
-/* fcntl.h -- Defines mutexes in terms of read/write locks on files.
- * filerwlock, filerwlockCreate, filerwlockDelete,
- * filerwreadlock, filerwlockUnlock
- */
-
-typedef struct {
- int fd;
- int n;
-} filerwlock;
-
-/* Create N read/write locks and returns the id of this cluster of locks. */
-filerwlock * filerwlockCreate(char *filename, int n);
-
-/* Delete the cluster of read/write locks associated with fl. */
-int filerwlockDelete(filerwlock *fl);
-
-/* Given the read/write lock cluster fl, lock its ith element */
-int filerwreadlock(filerwlock *fl, int i);
-
-int filerwwritelock(filerwlock *fl, int i);
-
-/* Given the lock cluster fl, unlock its ith element */
-int filerwunlock(filerwlock *fl, int i);
-
-/* Given the lock cluster fl, it read locks all its elements */
-int filerwlongreadlock(filerwlock *fl);
-
-/* Given the lock cluster fl, it unlocks all its elements */
-int filerwlongunlock(filerwlock *fl);
diff --git a/libical/src/libical/ical.h b/libical/src/libical/ical.h
deleted file mode 100644
index d0f33cd1a1..0000000000
--- a/libical/src/libical/ical.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: ical.h
- CREATOR: eric 20 March 1999
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is ical.h
-
-======================================================================*/
-
-#ifndef ICAL_H
-#define ICAL_H
-
-#include "icalversion.h"
-#include "icalenums.h"
-#include "icalvalue.h"
-#include "icalparameter.h"
-#include "icalproperty.h"
-#include "icalcomponent.h"
-#include "icaltypes.h"
-#include "icalparser.h"
-#include "icalmemory.h"
-#include "icalerror.h"
-#include "icalrestriction.h"
-
-#endif /* !ICAL_H */
-
-
-
diff --git a/libical/src/libical/icalcomponent.c b/libical/src/libical/icalcomponent.c
deleted file mode 100644
index bd2b13189c..0000000000
--- a/libical/src/libical/icalcomponent.c
+++ /dev/null
@@ -1,782 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalcomponent.c
- CREATOR: eric 28 April 1999
-
- $Id$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalcomponent.c
-
-======================================================================*/
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "ical.h"
-#include "pvl.h" /* "Pointer-to-void list" */
-#include <stdlib.h> /* for malloc */
-#include <stdarg.h> /* for va_list, etc */
-#include <errno.h>
-#include "icalerror.h"
-#include <assert.h>
-#include <stdio.h> /* for fprintf */
-#include "icalmemory.h"
-#include "icalenums.h"
-
-#define MAX_TMP 1024
-
-
-/* icalproperty functions that only components get to use */
-void icalproperty_set_parent(icalproperty* property,
- icalcomponent* component);
-
-icalcomponent* icalproperty_get_parent(icalproperty* property);
-
-
-
-struct icalcomponent_impl
-{
- char id[5];
- icalcomponent_kind kind;
- char* x_name;
- pvl_list properties;
- pvl_elem property_iterator;
- pvl_list components;
- pvl_elem component_iterator;
- icalcomponent* parent;
-};
-
-void icalcomponent_add_children(struct icalcomponent_impl *impl,va_list args)
-{
- void* vp;
-
- while((vp = va_arg(args, void*)) != 0) {
-
- assert (icalcomponent_isa_component(vp) != 0 ||
- icalproperty_isa_property(vp) != 0 ) ;
-
- if (icalcomponent_isa_component(vp) != 0 ){
-
- icalcomponent_add_component((icalcomponent*)impl,
- (icalcomponent*)vp);
-
- } else if (icalproperty_isa_property(vp) != 0 ){
-
- icalcomponent_add_property((icalcomponent*)impl,
- (icalproperty*)vp);
- }
- }
-}
-
-icalcomponent*
-icalcomponent_new_impl (icalcomponent_kind kind)
-{
- struct icalcomponent_impl* comp;
-
- if ( ( comp = (struct icalcomponent_impl*)
- malloc(sizeof(struct icalcomponent_impl))) == 0) {
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
- }
-
- strcpy(comp->id,"comp");
-
- comp->kind = kind;
- comp->properties = pvl_newlist();
- comp->property_iterator = 0;
- comp->components = pvl_newlist();
- comp->component_iterator = 0;
- comp->x_name = 0;
- comp->parent = 0;
-
- return comp;
-}
-
-icalcomponent*
-icalcomponent_new (icalcomponent_kind kind)
-{
- return (icalcomponent*)icalcomponent_new_impl(kind);
-}
-
-icalcomponent*
-icalcomponent_vanew (icalcomponent_kind kind, ...)
-{
- va_list args;
-
- struct icalcomponent_impl *impl = icalcomponent_new_impl(kind);
-
- if (impl == 0){
- return 0;
- }
-
- va_start(args,kind);
- icalcomponent_add_children(impl, args);
- va_end(args);
-
- return (icalcomponent*) impl;
-}
-
-icalcomponent* icalcomponent_new_from_string(char* str)
-{
- icalcomponent_kind kind;
-
- icalerror_check_arg_rz( (str!=0), "str");
-
- kind = icalenum_string_to_component_kind(str);
-
- if (kind == ICAL_NO_COMPONENT){
- return 0;
- }
-
- return icalcomponent_new(kind);
-}
-
-icalcomponent* icalcomponent_new_clone(icalcomponent* component)
-{
- struct icalcomponent_impl *old = (struct icalcomponent_impl*)component;
- struct icalcomponent_impl *new;
- icalproperty *p;
- icalcomponent *c;
-
- icalerror_check_arg_rv( (component!=0), "component");
-
- new = icalcomponent_new_impl(old->kind);
-
- if (new == 0){
- return 0;
- }
-
-
- for(p = icalcomponent_get_first_property(old,ICAL_ANY_PROPERTY);
- p != 0;
- p = icalcomponent_get_next_property(old,ICAL_ANY_PROPERTY)){
-
- icalcomponent_add_property(new,icalproperty_new_clone(p));
- }
-
-
- for(c = icalcomponent_get_first_component(old,ICAL_ANY_COMPONENT);
- c != 0;
- c = icalcomponent_get_next_component(old,ICAL_ANY_COMPONENT)){
-
- icalcomponent_add_component(new,icalcomponent_new_clone(c));
- }
-
- return new;
-
-}
-
-
-void
-icalcomponent_free (icalcomponent* component)
-{
- icalproperty* prop;
- icalcomponent* comp;
- struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
-
- icalerror_check_arg_rv( (component!=0), "component");
-
-#ifdef ICAL_FREE_ON_LIST_IS_ERROR
- icalerror_assert( (c->parent ==0),"Tried to free a component that is still attached to a parent component");
-#else
- if(c->parent != 0){
- return;
- }
-#endif
-
- if(component != 0 ){
-
- while( (prop=pvl_pop(c->properties)) != 0){
- assert(prop != 0);
- icalproperty_set_parent(prop,0);
- icalproperty_free(prop);
- }
-
- pvl_free(c->properties);
-
- while( (comp=pvl_data(pvl_head(c->components))) != 0){
- assert(comp!=0);
- icalcomponent_remove_component(component,comp);
- icalcomponent_free(comp);
- }
-
- pvl_free(c->components);
-
- if (c->x_name != 0) {
- free(c->x_name);
- }
-
- c->kind = ICAL_NO_COMPONENT;
- c->properties = 0;
- c->property_iterator = 0;
- c->components = 0;
- c->component_iterator = 0;
- c->x_name = 0;
- c->id[0] = 'X';
-
- free(c);
- }
-}
-
-char*
-icalcomponent_as_ical_string (icalcomponent* component)
-{
- char* buf, *out_buf;
- char* tmp_buf;
- size_t buf_size = 1024;
- char* buf_ptr = 0;
-
-#ifdef ICAL_UNIX_NEWLINE
- char newline[] = "\n";
-#else
- char newline[] = "\r\n";
-#endif
-
- icalcomponent *c;
- icalproperty *p;
- icalcomponent_kind kind = icalcomponent_isa(component);
-
- char* kind_string;
-
- buf = icalmemory_new_buffer(buf_size);
- buf_ptr = buf;
-
- icalerror_check_arg_rz( (component!=0), "component");
- icalerror_check_arg_rz( (kind!=ICAL_NO_COMPONENT), "component kind is ICAL_NO_COMPONENT");
-
- kind_string = icalenum_component_kind_to_string(kind);
-
- icalerror_check_arg_rz( (kind_string!=0),"Unknown kind of component");
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, "BEGIN:");
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
-
-
- for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY);
- p != 0;
- p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY)){
-
- tmp_buf = icalproperty_as_ical_string(p);
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf);
- }
-
-
- for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT);
- c != 0;
- c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){
-
- tmp_buf = icalcomponent_as_ical_string(c);
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf);
-
- }
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, "END:");
- icalmemory_append_string(&buf, &buf_ptr, &buf_size,
- icalenum_component_kind_to_string(kind));
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
-
- out_buf = icalmemory_tmp_copy(buf);
- free(buf);
-
- return out_buf;
-}
-
-
-int
-icalcomponent_is_valid (icalcomponent* component)
-{
- struct icalcomponent_impl *impl = (struct icalcomponent_impl *)component;
-
-
- if ( (strcmp(impl->id,"comp") == 0) &&
- impl->kind != ICAL_NO_COMPONENT){
- return 1;
- } else {
- return 0;
- }
-
-}
-
-
-icalcomponent_kind
-icalcomponent_isa (icalcomponent* component)
-{
- struct icalcomponent_impl *impl = (struct icalcomponent_impl *)component;
- icalerror_check_arg_rz( (component!=0), "component");
-
- if(component != 0)
- {
- return impl->kind;
- }
-
- return ICAL_NO_COMPONENT;
-}
-
-
-int
-icalcomponent_isa_component (void* component)
-{
- struct icalcomponent_impl *impl = (struct icalcomponent_impl *)component;
-
- icalerror_check_arg_rz( (component!=0), "component");
-
- if (strcmp(impl->id,"comp") == 0) {
- return 1;
- } else {
- return 0;
- }
-
-}
-
-int icalcomponent_property_sorter(void *a, void *b)
-{
- icalproperty_kind kinda, kindb;
- char *ksa, *ksb;
-
- kinda = icalproperty_isa((icalproperty*)a);
- kindb = icalproperty_isa((icalproperty*)b);
-
- ksa = icalenum_property_kind_to_string(kinda);
- ksb = icalenum_property_kind_to_string(kindb);
-
- return strcmp(ksa,ksb);
-}
-
-
-void
-icalcomponent_add_property (icalcomponent* component, icalproperty* property)
-{
- struct icalcomponent_impl *impl;
-
- icalerror_check_arg_rv( (component!=0), "component");
- icalerror_check_arg_rv( (property!=0), "property");
-
- impl = (struct icalcomponent_impl*)component;
-
- icalerror_assert( (!icalproperty_get_parent(property)),"The property has already been added to a component. Remove the property with icalcomponent_remove_property before calling icalcomponent_add_property");
-
- icalproperty_set_parent(property,component);
-
-#ifdef ICAL_INSERT_ORDERED
- pvl_insert_ordered(impl->properties,
- icalcomponent_property_sorter,property);
-#else
- pvl_push(impl->properties,property);
-#endif
-
-}
-
-
-void
-icalcomponent_remove_property (icalcomponent* component, icalproperty* property)
-{
- struct icalcomponent_impl *impl;
- pvl_elem itr, next_itr;
- struct icalproperty_impl *pimpl;
-
- icalerror_check_arg_rv( (component!=0), "component");
- icalerror_check_arg_rv( (property!=0), "property");
-
- impl = (struct icalcomponent_impl*)component;
-
- pimpl = (struct icalproperty_impl*)property;
-
- icalerror_assert( (icalproperty_get_parent(property)),"The property is not a member of a component");
-
-
- for( itr = pvl_head(impl->properties);
- itr != 0;
- itr = next_itr)
- {
- next_itr = pvl_next(itr);
-
- if( pvl_data(itr) == (void*)property ){
-
- if (impl->property_iterator == itr){
- impl->property_iterator = pvl_next(itr);
- }
-
- pvl_remove( impl->properties, itr);
- icalproperty_set_parent(property,0);
- }
- }
-}
-
-int
-icalcomponent_count_properties (icalcomponent* component, icalproperty_kind kind)
-{
- int count=0;
- icalproperty *p;
- icalerror_check_arg_rz( (component!=0), "component");
-
- for(p = icalcomponent_get_first_property(component,kind);
- p != 0;
- p = icalcomponent_get_next_property(component,kind)){
-
- count++;
- }
-
-
- return count;
-
-}
-
-icalproperty* icalcomponent_get_current_property (icalcomponent* component)
-{
-
- struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
- icalerror_check_arg_rz( (component!=0),"component");
-
- if ((c->property_iterator==0)){
- return 0;
- }
-
- return (icalproperty*) pvl_data(c->property_iterator);
-
-}
-
-icalproperty*
-icalcomponent_get_first_property (icalcomponent* component, icalproperty_kind kind)
-{
- struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
- icalerror_check_arg_rz( (component!=0),"component");
-
- for( c->property_iterator = pvl_head(c->properties);
- c->property_iterator != 0;
- c->property_iterator = pvl_next(c->property_iterator)) {
-
- icalproperty *p = (icalproperty*) pvl_data(c->property_iterator);
-
- if (icalproperty_isa(p) == kind || kind == ICAL_ANY_PROPERTY) {
-
- return p;
- }
- }
- return 0;
-}
-
-icalproperty*
-icalcomponent_get_next_property (icalcomponent* component, icalproperty_kind kind)
-{
- struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
- icalerror_check_arg_rz( (component!=0),"component");
-
- if (c->property_iterator == 0){
- return 0;
- }
-
- for( c->property_iterator = pvl_next(c->property_iterator);
- c->property_iterator != 0;
- c->property_iterator = pvl_next(c->property_iterator)) {
-
- icalproperty *p = (icalproperty*) pvl_data(c->property_iterator);
-
- if (icalproperty_isa(p) == kind || kind == ICAL_ANY_PROPERTY) {
-
- return p;
- }
- }
-
- return 0;
-}
-
-
-icalproperty**
-icalcomponent_get_properties (icalcomponent* component, icalproperty_kind kind);
-
-
-void
-icalcomponent_add_component (icalcomponent* parent, icalcomponent* child)
-{
- struct icalcomponent_impl *impl, *cimpl;
-
- icalerror_check_arg_rv( (parent!=0), "parent");
- icalerror_check_arg_rv( (child!=0), "child");
-
- impl = (struct icalcomponent_impl*)parent;
- cimpl = (struct icalcomponent_impl*)child;
-
- icalerror_assert( (cimpl->parent ==0),"The child component has already been added to a parent component. Remove the component with icalcomponent_remove_componenet before calling icalcomponent_add_component");
-
- cimpl->parent = parent;
-
- pvl_push(impl->components,child);
-}
-
-
-void
-icalcomponent_remove_component (icalcomponent* parent, icalcomponent* child)
-{
- struct icalcomponent_impl *impl,*cimpl;
- pvl_elem itr, next_itr;
-
- icalerror_check_arg_rv( (parent!=0), "parent");
- icalerror_check_arg_rv( (child!=0), "child");
-
- impl = (struct icalcomponent_impl*)parent;
- cimpl = (struct icalcomponent_impl*)child;
-
- for( itr = pvl_head(impl->components);
- itr != 0;
- itr = next_itr)
- {
- next_itr = pvl_next(itr);
-
- if( pvl_data(itr) == (void*)child ){
-
- if (impl->component_iterator == itr){
- /* impl->component_iterator = pvl_next(itr);*/
- }
- pvl_remove( impl->components, itr);
- cimpl->parent = 0;
- }
- }
-}
-
-
-int
-icalcomponent_count_components (icalcomponent* component, icalcomponent_kind kind)
-{
- int count=0;
- icalcomponent *c;
- icalerror_check_arg_rz( (component!=0), "component");
-
- for(c = icalcomponent_get_first_component(component,kind);
- c != 0;
- c = icalcomponent_get_next_component(component,kind)){
-
- count++;
- }
-
-
- return count;
-}
-
-icalcomponent*
-icalcomponent_get_current_component(icalcomponent* component)
-{
- struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
-
- icalerror_check_arg_rz( (component!=0),"component");
-
- if (c->component_iterator == 0){
- return 0;
- }
-
- return (icalcomponent*) pvl_data(c->component_iterator);
-}
-
-icalcomponent*
-icalcomponent_get_first_component (icalcomponent* component,
- icalcomponent_kind kind)
-{
- struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
-
- icalerror_check_arg_rz( (component!=0),"component");
-
- for( c->component_iterator = pvl_head(c->components);
- c->component_iterator != 0;
- c->component_iterator = pvl_next(c->component_iterator)) {
-
- icalcomponent *p = (icalcomponent*) pvl_data(c->component_iterator);
-
- if (icalcomponent_isa(p) == kind || kind == ICAL_ANY_COMPONENT) {
-
- return p;
- }
- }
-
- return 0;
-}
-
-
-icalcomponent*
-icalcomponent_get_next_component (icalcomponent* component, icalcomponent_kind kind)
-{
- struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
-
- icalerror_check_arg_rz( (component!=0),"component");
-
- if (c->component_iterator == 0){
- return 0;
- }
-
- for( c->component_iterator = pvl_next(c->component_iterator);
- c->component_iterator != 0;
- c->component_iterator = pvl_next(c->component_iterator)) {
-
- icalcomponent *p = (icalcomponent*) pvl_data(c->component_iterator);
-
- if (icalcomponent_isa(p) == kind || kind == ICAL_ANY_COMPONENT) {
-
- return p;
- }
- }
-
- return 0;
-}
-
-
-icalproperty**
-icalcomponent_get_component (icalcomponent* component, icalproperty_kind kind);
-
-
-int icalcomponent_count_errors(icalcomponent* component)
-{
- int errors = 0;
- icalproperty *p;
- icalcomponent *c;
-
- for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY);
- p != 0;
- p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY)){
-
- if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY)
- {
- errors++;
- }
- }
-
- for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT);
- c != 0;
- c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){
-
- errors += icalcomponent_count_errors(c);
-
- }
-
- return errors;
-}
-
-
-void icalcomponent_strip_errors(icalcomponent* component)
-{
- icalproperty *p, *next_p;
- icalcomponent *c;
-
- for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY);
- p != 0;
- p = next_p){
-
- next_p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY);
-
- if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY)
- {
- icalcomponent_remove_property(component,p);
- }
- }
-
- for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT);
- c != 0;
- c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){
-
- icalcomponent_strip_errors(c);
- }
-}
-
-
-void icalcomponent_convert_errors(icalcomponent* component)
-{
- icalproperty *p, *next_p;
- icalcomponent *c;
-
- for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY);
- p != 0;
- p = next_p){
-
- next_p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY);
-
- if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY)
- {
- struct icalreqstattype rst;
- char tmp[MAX_TMP];
- icalparameter *param = icalproperty_get_first_parameter
- (p,ICAL_XLICERRORTYPE_PARAMETER);
-
- rst.code = ICAL_UNKNOWN_STATUS;
- rst.desc = 0;
-
- switch(icalparameter_get_xlicerrortype(param)){
-
- case ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR: {
- rst.code = ICAL_3_2_INVPARAM_STATUS;
- break;
- }
- case ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR: {
- rst.code = ICAL_3_3_INVPARAMVAL_STATUS;
- break;
- }
- case ICAL_XLICERRORTYPE_PROPERTYPARSEERROR: {
- rst.code = ICAL_3_0_INVPROPNAME_STATUS;
- break;
- }
- case ICAL_XLICERRORTYPE_VALUEPARSEERROR: {
- rst.code = ICAL_3_1_INVPROPVAL_STATUS;
- break;
- }
- case ICAL_XLICERRORTYPE_COMPONENTPARSEERROR: {
- rst.code = ICAL_3_4_INVCOMP_STATUS;
- break;
- }
-
- default: {
- }
- }
- if (rst.code != ICAL_UNKNOWN_STATUS){
-
- rst.debug = icalproperty_get_xlicerror(p);
- icalcomponent_add_property(component,
- icalproperty_new_requeststatus(
- icalreqstattype_as_string(rst)
- )
- );
-
- icalcomponent_remove_property(component,p);
- }
- }
- }
-
- for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT);
- c != 0;
- c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){
-
- icalcomponent_convert_errors(c);
- }
-}
-
-
-icalcomponent* icalcomponent_get_parent(icalcomponent* component)
-{
- struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
-
- return c->parent;
-}
-
-void icalcomponent_set_parent(icalcomponent* component, icalcomponent* parent)
-{
- struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
-
- c->parent = parent;
-}
-
-
diff --git a/libical/src/libical/icalcomponent.h b/libical/src/libical/icalcomponent.h
deleted file mode 100644
index 8d9f22ca76..0000000000
--- a/libical/src/libical/icalcomponent.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalcomponent.h
- CREATOR: eric 20 March 1999
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalcomponent.h
-
-======================================================================*/
-
-#ifndef ICALCOMPONENT_H
-#define ICALCOMPONENT_H
-
-#include "icalproperty.h"
-#include "icalvalue.h"
-#include "icalenums.h" /* defines icalcomponent_kind */
-
-typedef void icalcomponent;
-
-icalcomponent* icalcomponent_new(icalcomponent_kind kind);
-icalcomponent* icalcomponent_new_clone(icalcomponent* component);
-icalcomponent* icalcomponent_new_from_string(char* str);
-icalcomponent* icalcomponent_vanew(icalcomponent_kind kind, ...);
-void icalcomponent_free(icalcomponent* component);
-
-char* icalcomponent_as_ical_string(icalcomponent* component);
-
-int icalcomponent_is_valid(icalcomponent* component);
-
-icalcomponent_kind icalcomponent_isa(icalcomponent* component);
-
-int icalcomponent_isa_component (void* component);
-
-/*
- * Working with properties
- */
-
-void icalcomponent_add_property(icalcomponent* component,
- icalproperty* property);
-
-void icalcomponent_remove_property(icalcomponent* component,
- icalproperty* property);
-
-int icalcomponent_count_properties(icalcomponent* component,
- icalproperty_kind kind);
-
-/* Iterate through the properties */
-icalproperty* icalcomponent_get_current_property(icalcomponent* component);
-
-icalproperty* icalcomponent_get_first_property(icalcomponent* component,
- icalproperty_kind kind);
-icalproperty* icalcomponent_get_next_property(icalcomponent* component,
- icalproperty_kind kind);
-
-/* Return a null-terminated array of icalproperties*/
-
-icalproperty** icalcomponent_get_properties(icalcomponent* component,
- icalproperty_kind kind);
-
-
-/*
- * Working with components
- */
-
-
-void icalcomponent_add_component(icalcomponent* parent,
- icalcomponent* child);
-
-void icalcomponent_remove_component(icalcomponent* parent,
- icalcomponent* child);
-
-int icalcomponent_count_components(icalcomponent* component,
- icalcomponent_kind kind);
-
-/* Iterate through components */
-icalcomponent* icalcomponent_get_current_component (icalcomponent* component);
-
-icalcomponent* icalcomponent_get_first_component(icalcomponent* component,
- icalcomponent_kind kind);
-icalcomponent* icalcomponent_get_next_component(icalcomponent* component,
- icalcomponent_kind kind);
-
-/* Return a null-terminated array of icalproperties*/
-icalproperty** icalcomponent_get_component(icalcomponent* component,
- icalproperty_kind kind);
-
-/* Working with embedded error properties */
-
-int icalcomponent_count_errors(icalcomponent* component);
-
-/* Remove all X-LIC-ERROR properties*/
-void icalcomponent_strip_errors(icalcomponent* component);
-
-/* Convert some X-LIC-ERROR properties into RETURN-STATUS properties*/
-void icalcomponent_convert_errors(icalcomponent* component);
-
-/* Internal operations. You don't see these... */
-icalcomponent* icalcomponent_get_parent(icalcomponent* component);
-void icalcomponent_set_parent(icalcomponent* component,
- icalcomponent* parent);
-
-#endif /* !ICALCOMPONENT_H */
-
-
-
diff --git a/libical/src/libical/icalenums.c b/libical/src/libical/icalenums.c
deleted file mode 100644
index 7f0aae6a0e..0000000000
--- a/libical/src/libical/icalenums.c
+++ /dev/null
@@ -1,615 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalenum.c
- CREATOR: eric 29 April 1999
-
- $Id$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalenum.c
-
- ======================================================================*/
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "icalenums.h"
-
-struct icalproperty_kind_map {
- icalproperty_kind kind;
- char name[20];
-};
-
-static struct icalproperty_kind_map property_map[] =
-{
- { ICAL_ACTION_PROPERTY, "ACTION"},
- { ICAL_ATTACH_PROPERTY, "ATTACH"},
- { ICAL_ATTENDEE_PROPERTY, "ATTENDEE"},
- { ICAL_CALSCALE_PROPERTY, "CALSCALE"},
- { ICAL_CATEGORIES_PROPERTY, "CATEGORIES"},
- { ICAL_CLASS_PROPERTY, "CLASS"},
- { ICAL_COMMENT_PROPERTY, "COMMENT"},
- { ICAL_COMPLETED_PROPERTY, "COMPLETED"},
- { ICAL_CONTACT_PROPERTY, "CONTACT"},
- { ICAL_CREATED_PROPERTY, "CREATED"},
- { ICAL_DESCRIPTION_PROPERTY, "DESCRIPTION"},
- { ICAL_DTEND_PROPERTY, "DTEND"},
- { ICAL_DTSTAMP_PROPERTY, "DTSTAMP"},
- { ICAL_DTSTART_PROPERTY, "DTSTART"},
- { ICAL_DUE_PROPERTY, "DUE"},
- { ICAL_DURATION_PROPERTY, "DURATION"},
- { ICAL_EXDATE_PROPERTY, "EXDATE"},
- { ICAL_EXRULE_PROPERTY, "EXRULE"},
- { ICAL_FREEBUSY_PROPERTY, "FREEBUSY"},
- { ICAL_GEO_PROPERTY, "GEO"},
- { ICAL_LASTMODIFIED_PROPERTY, "LAST-MODIFIED"},
- { ICAL_LOCATION_PROPERTY, "LOCATION"},
- { ICAL_METHOD_PROPERTY, "METHOD"},
- { ICAL_ORGANIZER_PROPERTY, "ORGANIZER"},
- { ICAL_PERCENTCOMPLETE_PROPERTY, "PERCENT-COMPLETE"},
- { ICAL_PRIORITY_PROPERTY, "PRIORITY"},
- { ICAL_PRODID_PROPERTY, "PRODID"},
- { ICAL_RDATE_PROPERTY, "RDATE"},
- { ICAL_RECURRENCEID_PROPERTY, "RECURRENCE-ID"},
- { ICAL_RELATEDTO_PROPERTY, "RELATED-TO"},
- { ICAL_REPEAT_PROPERTY, "REPEAT"},
- { ICAL_REQUESTSTATUS_PROPERTY, "REQUEST-STATUS"},
- { ICAL_RESOURCES_PROPERTY, "RESOURCES"},
- { ICAL_RRULE_PROPERTY, "RRULE"},
- { ICAL_SEQUENCE_PROPERTY, "SEQUENCE"},
- { ICAL_STATUS_PROPERTY, "STATUS"},
- { ICAL_SUMMARY_PROPERTY, "SUMMARY"},
- { ICAL_TRANSP_PROPERTY, "TRANSP"},
- { ICAL_TRIGGER_PROPERTY, "TRIGGER"},
- { ICAL_TZID_PROPERTY, "TZID"},
- { ICAL_TZNAME_PROPERTY, "TZNAME"},
- { ICAL_TZOFFSETFROM_PROPERTY, "TZOFFSETFROM"},
- { ICAL_TZOFFSETTO_PROPERTY, "TZOFFSETTO"},
- { ICAL_TZURL_PROPERTY, "TZURL"},
- { ICAL_UID_PROPERTY, "UID"},
- { ICAL_URL_PROPERTY, "URL"},
- { ICAL_VERSION_PROPERTY, "VERSION"},
- { ICAL_X_PROPERTY,"X_PROPERTY"},
-
- /* CAP Object Properties */
-
- { ICAL_SCOPE_PROPERTY, "SCOPE"},
- { ICAL_MAXRESULTS_PROPERTY, "MAXRESULTS"},
- { ICAL_MAXRESULTSSIZE_PROPERTY, "MAXRESULTSSIZE"},
- { ICAL_QUERY_PROPERTY, "QUERY" },
- { ICAL_QUERYNAME_PROPERTY, "QUERYNAME" },
- { ICAL_TARGET_PROPERTY, "TARGET"},
-
- /* libical private properties */
- { ICAL_XLICERROR_PROPERTY,"X-LIC-ERROR"},
- { ICAL_XLICCLUSTERCOUNT_PROPERTY,"X-LIC-CLUSTERCOUNT"},
-
- /* End of the list */
- { ICAL_NO_PROPERTY, ""}
-};
-
-
-char* icalenum_property_kind_to_string(icalproperty_kind kind)
-{
- int i;
-
- for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) {
- if (property_map[i].kind == kind) {
- return property_map[i].name;
- }
- }
-
- return 0;
-
-}
-
-icalproperty_kind icalenum_string_to_property_kind(char* string)
-{
- int i;
-
- if (string ==0 ) {
- return ICAL_NO_PROPERTY;
- }
-
- for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) {
- if (strcmp(property_map[i].name, string) == 0) {
- return property_map[i].kind;
- }
- }
-
- return ICAL_NO_PROPERTY;
-}
-
-
-
-
-struct icalparameter_kind_map {
- icalparameter_kind kind;
- char name[20];
-};
-
-static struct icalparameter_kind_map parameter_map[] =
-{
- { ICAL_ALTREP_PARAMETER, "ALTREP"},
- { ICAL_CN_PARAMETER, "CN"},
- { ICAL_CUTYPE_PARAMETER, "CUTYPE"},
- { ICAL_DELEGATEDFROM_PARAMETER, "DELEGATED-FROM"},
- { ICAL_DELEGATEDTO_PARAMETER, "DELEGATED-TO"},
- { ICAL_DIR_PARAMETER, "DIR"},
- { ICAL_ENCODING_PARAMETER, "ENCODING"},
- { ICAL_FBTYPE_PARAMETER, "FBTYPE"},
- { ICAL_FMTTYPE_PARAMETER, "FMTTYPE"},
- { ICAL_LANGUAGE_PARAMETER, "LANGUAGE"},
- { ICAL_MEMBER_PARAMETER, "MEMBER"},
- { ICAL_PARTSTAT_PARAMETER, "PARTSTAT"},
- { ICAL_RANGE_PARAMETER, "RANGE"},
- { ICAL_RELATED_PARAMETER, "RELATED"},
- { ICAL_RELTYPE_PARAMETER, "RELTYPE"},
- { ICAL_ROLE_PARAMETER, "ROLE"},
- { ICAL_RSVP_PARAMETER, "RSVP"},
- { ICAL_SENTBY_PARAMETER, "SENT-BY"},
- { ICAL_TZID_PARAMETER, "TZID"},
- { ICAL_VALUE_PARAMETER, "VALUE"},
-
- /* CAP parameters */
-
- /* libical private parameters */
- { ICAL_XLICERRORTYPE_PARAMETER, "X-LIC-ERRORTYPE"},
- { ICAL_XLICCOMPARETYPE_PARAMETER, "X-LIC-COMPARETYPE"},
-
- /* End of list */
- { ICAL_NO_PARAMETER, ""}
-};
-
-char* icalenum_parameter_kind_to_string(icalparameter_kind kind)
-{
- int i;
-
- for (i=0; parameter_map[i].kind != ICAL_NO_PARAMETER; i++) {
- if (parameter_map[i].kind == kind) {
- return parameter_map[i].name;
- }
- }
-
- return 0;
-
-}
-
-icalparameter_kind icalenum_string_to_parameter_kind(char* string)
-{
- int i;
-
- if (string ==0 ) {
- return ICAL_NO_PARAMETER;
- }
-
- for (i=0; parameter_map[i].kind != ICAL_NO_PARAMETER; i++) {
- if (strcmp(parameter_map[i].name, string) == 0) {
- return parameter_map[i].kind;
- }
- }
-
- return ICAL_NO_PARAMETER;
-}
-
-struct icalvalue_kind_map {
- icalvalue_kind kind;
- char name[20];
-};
-
-static struct icalvalue_kind_map value_map[] =
-{
- { ICAL_BINARY_VALUE, "BINARY"},
- { ICAL_BOOLEAN_VALUE, "BOOLEAN"},
- { ICAL_CALADDRESS_VALUE, "CAL-ADDRESS"},
- { ICAL_DATE_VALUE, "DATE"},
- { ICAL_DATETIME_VALUE, "DATE-TIME"},
- { ICAL_DURATION_VALUE, "DURATION"},
- { ICAL_FLOAT_VALUE, "FLOAT"},
- { ICAL_INTEGER_VALUE, "INTEGER"},
- { ICAL_PERIOD_VALUE, "PERIOD"},
- { ICAL_RECUR_VALUE, "RECUR"},
- { ICAL_TEXT_VALUE, "TEXT"},
- { ICAL_TIME_VALUE, "TIME"},
- { ICAL_URI_VALUE, "URI"},
- { ICAL_UTCOFFSET_VALUE, "UTC-OFFSET"},
- { ICAL_METHOD_VALUE, "METHOD"}, /* Not an RFC2445 type */
- { ICAL_GEO_VALUE, "FLOAT"}, /* Not an RFC2445 type */
- { ICAL_ATTACH_VALUE, "XATTACH"}, /* Not an RFC2445 type */
- { ICAL_DATETIMEDATE_VALUE, "XDATETIMEDATE"}, /* Not an RFC2445 type */
- { ICAL_DATETIMEPERIOD_VALUE, "XDATETIMEPERIOD"}, /* Not an RFC2445 type */
- { ICAL_QUERY_VALUE, "QUERY"},
- { ICAL_NO_VALUE, ""},
-};
-
-char* icalenum_value_kind_to_string(icalvalue_kind kind)
-{
- int i;
-
- for (i=0; value_map[i].kind != ICAL_NO_VALUE; i++) {
- if (value_map[i].kind == kind) {
- return value_map[i].name;
- }
- }
-
- return 0;
-
-}
-
-icalvalue_kind icalenum_value_kind_by_prop(icalproperty_kind kind)
-{
-
- return ICAL_NO_VALUE;
-}
-
-
-struct icalcomponent_kind_map {
- icalcomponent_kind kind;
- char name[20];
-};
-
-
-
-static struct icalcomponent_kind_map component_map[] =
-{
- { ICAL_VEVENT_COMPONENT, "VEVENT" },
- { ICAL_VTODO_COMPONENT, "VTODO" },
- { ICAL_VJOURNAL_COMPONENT, "VJOURNAL" },
- { ICAL_VCALENDAR_COMPONENT, "VCALENDAR" },
- { ICAL_VFREEBUSY_COMPONENT, "VFREEBUSY" },
- { ICAL_VTIMEZONE_COMPONENT, "VTIMEZONE" },
- { ICAL_VALARM_COMPONENT, "VALARM" },
- { ICAL_XSTANDARD_COMPONENT, "STANDARD" }, /*These are part of RFC2445 */
- { ICAL_XDAYLIGHT_COMPONENT, "DAYLIGHT" }, /*but are not really components*/
- { ICAL_X_COMPONENT, "X" },
- { ICAL_VSCHEDULE_COMPONENT, "SCHEDULE" },
-
- /* CAP components */
- { ICAL_VQUERY_COMPONENT, "VQUERY" },
- { ICAL_VCAR_COMPONENT, "VCAR" },
- { ICAL_VCOMMAND_COMPONENT, "VCOMMAND" },
-
- /* libical private components */
- { ICAL_XLICINVALID_COMPONENT, "X-LIC-UNKNOWN" },
- { ICAL_ANY_COMPONENT, "ANY" },
- { ICAL_XROOT_COMPONENT, "XROOT" },
-
- /* End of list */
- { ICAL_NO_COMPONENT, "" },
-};
-
-char* icalenum_component_kind_to_string(icalcomponent_kind kind)
-{
- int i;
-
- for (i=0; component_map[i].kind != ICAL_NO_COMPONENT; i++) {
- if (component_map[i].kind == kind) {
- return component_map[i].name;
- }
- }
-
- return 0;
-
-}
-
-icalcomponent_kind icalenum_string_to_component_kind(char* string)
-{
- int i;
-
- if (string ==0 ) {
- return ICAL_NO_COMPONENT;
- }
-
- for (i=0; component_map[i].kind != ICAL_NO_COMPONENT; i++) {
- if (strcmp(component_map[i].name, string) == 0) {
- return component_map[i].kind;
- }
- }
-
- return ICAL_NO_COMPONENT;
-}
-
-struct icalproperty_kind_value_map {
- icalproperty_kind prop;
- icalvalue_kind value;
-};
-
-static struct icalproperty_kind_value_map propval_map[] =
-{
- { ICAL_CALSCALE_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_METHOD_PROPERTY, ICAL_METHOD_VALUE },
- { ICAL_PRODID_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_VERSION_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_CATEGORIES_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_CLASS_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_COMMENT_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_DESCRIPTION_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_LOCATION_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_PERCENTCOMPLETE_PROPERTY, ICAL_INTEGER_VALUE },
- { ICAL_PRIORITY_PROPERTY, ICAL_INTEGER_VALUE },
- { ICAL_RESOURCES_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_STATUS_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_SUMMARY_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_COMPLETED_PROPERTY, ICAL_DATETIME_VALUE },
- { ICAL_FREEBUSY_PROPERTY, ICAL_PERIOD_VALUE },
- { ICAL_TRANSP_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_TZNAME_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_TZOFFSETFROM_PROPERTY, ICAL_UTCOFFSET_VALUE },
- { ICAL_TZOFFSETTO_PROPERTY, ICAL_UTCOFFSET_VALUE },
- { ICAL_TZURL_PROPERTY, ICAL_URI_VALUE },
- { ICAL_TZID_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_ATTENDEE_PROPERTY, ICAL_CALADDRESS_VALUE },
- { ICAL_CONTACT_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_ORGANIZER_PROPERTY, ICAL_CALADDRESS_VALUE },
- { ICAL_RELATEDTO_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_URL_PROPERTY, ICAL_URI_VALUE },
- { ICAL_UID_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_EXRULE_PROPERTY, ICAL_RECUR_VALUE },
- { ICAL_RRULE_PROPERTY, ICAL_RECUR_VALUE },
- { ICAL_ACTION_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_REPEAT_PROPERTY, ICAL_INTEGER_VALUE },
- { ICAL_CREATED_PROPERTY, ICAL_DATETIME_VALUE },
- { ICAL_DTSTAMP_PROPERTY, ICAL_DATETIME_VALUE },
- { ICAL_LASTMODIFIED_PROPERTY, ICAL_DATETIME_VALUE },
- { ICAL_SEQUENCE_PROPERTY, ICAL_INTEGER_VALUE },
- { ICAL_X_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_REQUESTSTATUS_PROPERTY, ICAL_STRING_VALUE },
- { ICAL_ATTACH_PROPERTY, ICAL_URI_VALUE },
- { ICAL_GEO_PROPERTY, ICAL_GEO_VALUE },
- { ICAL_DTEND_PROPERTY, ICAL_DATETIME_VALUE },
- { ICAL_DUE_PROPERTY, ICAL_DATETIME_VALUE },
- { ICAL_DTSTART_PROPERTY, ICAL_DATETIME_VALUE },
- { ICAL_RECURRENCEID_PROPERTY, ICAL_DATETIME_VALUE },
- { ICAL_EXDATE_PROPERTY, ICAL_DATETIME_VALUE },
- { ICAL_RDATE_PROPERTY, ICAL_DATETIME_VALUE },
- { ICAL_TRIGGER_PROPERTY, ICAL_DURATION_VALUE },
- { ICAL_DURATION_PROPERTY, ICAL_DURATION_VALUE },
-
- /* CAP properties */
- { ICAL_SCOPE_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_MAXRESULTS_PROPERTY, ICAL_INTEGER_VALUE},
- { ICAL_MAXRESULTSSIZE_PROPERTY, ICAL_INTEGER_VALUE},
- { ICAL_QUERY_PROPERTY, ICAL_QUERY_VALUE },
- { ICAL_QUERYNAME_PROPERTY, ICAL_TEXT_VALUE },
- { ICAL_TARGET_PROPERTY, ICAL_CALADDRESS_VALUE },
-
-
- /* libical private properties */
- { ICAL_XLICERROR_PROPERTY,ICAL_TEXT_VALUE},
- { ICAL_XLICCLUSTERCOUNT_PROPERTY,ICAL_INTEGER_VALUE},
-
-
- /* End of list */
- { ICAL_NO_PROPERTY, ICAL_NO_PROPERTY}
-};
-
-
-icalvalue_kind icalenum_property_kind_to_value_kind(icalproperty_kind kind)
-{
- int i;
-
- for (i=0; propval_map[i].value != ICAL_NO_VALUE; i++) {
- if ( propval_map[i].prop == kind ) {
- return propval_map[i].value;
- }
- }
-
- return ICAL_NO_VALUE;
-}
-
-struct {icalrecurrencetype_weekday wd; char * str; }
-wd_map[] = {
- {ICAL_SUNDAY_WEEKDAY,"SU"},
- {ICAL_MONDAY_WEEKDAY,"MO"},
- {ICAL_TUESDAY_WEEKDAY,"TU"},
- {ICAL_WEDNESDAY_WEEKDAY,"WE"},
- {ICAL_THURSDAY_WEEKDAY,"TH"},
- {ICAL_FRIDAY_WEEKDAY,"FR"},
- {ICAL_SATURDAY_WEEKDAY,"SA"},
- {ICAL_NO_WEEKDAY,0}
-};
-
-char* icalenum_weekday_to_string(icalrecurrencetype_weekday kind)
-{
- int i;
-
- for (i=0; wd_map[i].wd != ICAL_NO_WEEKDAY; i++) {
- if ( wd_map[i].wd == kind) {
- return wd_map[i].str;
- }
- }
-
- return 0;
-}
-
-
-struct {
- icalrecurrencetype_frequency kind;
- char* str;
-} freq_map[] = {
- {ICAL_SECONDLY_RECURRENCE,"SECONDLY"},
- {ICAL_MINUTELY_RECURRENCE,"MINUTELY"},
- {ICAL_HOURLY_RECURRENCE,"HOURLY"},
- {ICAL_DAILY_RECURRENCE,"DAILY"},
- {ICAL_WEEKLY_RECURRENCE,"WEEKLY"},
- {ICAL_MONTHLY_RECURRENCE,"MONTHLY"},
- {ICAL_YEARLY_RECURRENCE,"YEARLY"},
- {ICAL_NO_RECURRENCE,0}
-};
-
-char* icalenum_recurrence_to_string(icalrecurrencetype_frequency kind)
-{
- int i;
-
- for (i=0; freq_map[i].kind != ICAL_NO_RECURRENCE ; i++) {
- if ( freq_map[i].kind == kind ) {
- return freq_map[i].str;
- }
- }
- return 0;
-}
-
-
-struct {
- icalrecurrencetype_frequency kind;
- int major;
- int minor;
- char* str;
-} status_map[] = {
- {ICAL_2_0_SUCCESS_STATUS, 2,0,"Success."},
- {ICAL_2_1_FALLBACK_STATUS, 2,1,"Success but fallback taken on one or more property values."},
- {ICAL_2_2_IGPROP_STATUS, 2,2,"Success, invalid property ignored."},
- {ICAL_2_3_IGPARAM_STATUS, 2,3,"Success, invalid property parameter ignored."},
- {ICAL_2_4_IGXPROP_STATUS, 2,4,"Success, unknown non-standard property ignored."},
- {ICAL_2_5_IGXPARAM_STATUS, 2,5,"Success, unknown non standard property value ignored."},
- {ICAL_2_6_IGCOMP_STATUS, 2,6,"Success, invalid calendar component ignored."},
- {ICAL_2_7_FORWARD_STATUS, 2,7,"Success, request forwarded to Calendar User."},
- {ICAL_2_8_ONEEVENT_STATUS, 2,8,"Success, repeating event ignored. Scheduled as a single component."},
- {ICAL_2_9_TRUNC_STATUS, 2,9,"Success, truncated end date time to date boundary."},
- {ICAL_2_10_ONETODO_STATUS, 2,10,"Success, repeating VTODO ignored. Scheduled as a single VTODO."},
- {ICAL_2_11_TRUNCRRULE_STATUS, 2,11,"Success, unbounded RRULE clipped at some finite number of instances "},
- {ICAL_3_0_INVPROPNAME_STATUS, 3,0,"Invalid property name."},
- {ICAL_3_1_INVPROPVAL_STATUS, 3,1,"Invalid property value."},
- {ICAL_3_2_INVPARAM_STATUS, 3,2,"Invalid property parameter."},
- {ICAL_3_3_INVPARAMVAL_STATUS, 3,3,"Invalid property parameter value."},
- {ICAL_3_4_INVCOMP_STATUS, 3,4,"Invalid calendar component."},
- {ICAL_3_5_INVTIME_STATUS, 3,5,"Invalid date or time."},
- {ICAL_3_6_INVRULE_STATUS, 3,6,"Invalid rule."},
- {ICAL_3_7_INVCU_STATUS, 3,7,"Invalid Calendar User."},
- {ICAL_3_8_NOAUTH_STATUS, 3,8,"No authority."},
- {ICAL_3_9_BADVERSION_STATUS, 3,9,"Unsupported version."},
- {ICAL_3_10_TOOBIG_STATUS, 3,10,"Request entity too large."},
- {ICAL_3_11_MISSREQCOMP_STATUS, 3,11,"Required component or property missing."},
- {ICAL_3_12_UNKCOMP_STATUS, 3,12,"Unknown component or property found."},
- {ICAL_3_13_BADCOMP_STATUS, 3,13,"Unsupported component or property found"},
- {ICAL_3_14_NOCAP_STATUS, 3,14,"Unsupported capability."},
- {ICAL_4_0_BUSY_STATUS, 4,0,"Event conflict. Date/time is busy."},
- {ICAL_5_0_MAYBE_STATUS, 5,0,"Request MAY supported."},
- {ICAL_5_1_UNAVAIL_STATUS, 5,1,"Service unavailable."},
- {ICAL_5_2_NOSERVICE_STATUS, 5,2,"Invalid calendar service."},
- {ICAL_5_3_NOSCHED_STATUS, 5,3,"No scheduling support for user."},
- {ICAL_UNKNOWN_STATUS, 0,0,"Error: Unknown request status"}
-};
-
-
-char* icalenum_reqstat_desc(icalrequeststatus stat)
-{
-
- int i;
-
- for (i=0; status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
- if ( status_map[i].kind == stat) {
- return status_map[i].str;
- }
- }
-
- return 0;
-}
-
-
-short icalenum_reqstat_major(icalrequeststatus stat)
-{
- int i;
-
- for (i=0; status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
- if ( status_map[i].kind == stat) {
- return status_map[i].major;
- }
- }
- return -1;
-}
-
-short icalenum_reqstat_minor(icalrequeststatus stat)
-{
- int i;
-
- for (i=0; status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
- if ( status_map[i].kind == stat) {
- return status_map[i].minor;
- }
- }
- return -1;
-}
-
-
-icalrequeststatus icalenum_num_to_reqstat(short major, short minor)
-{
- int i;
-
- for (i=0; status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
- if ( status_map[i].major == major && status_map[i].minor == minor) {
- return status_map[i].kind;
- }
- }
- return 0;
-}
-
-
-
-struct {icalproperty_method method; char* str;} method_map[] = {
- {ICAL_METHOD_PUBLISH,"PUBLISH"},
- {ICAL_METHOD_REQUEST,"REQUEST"},
- {ICAL_METHOD_REPLY,"REPLY"},
- {ICAL_METHOD_ADD,"ADD"},
- {ICAL_METHOD_CANCEL,"CANCEL"},
- {ICAL_METHOD_REFRESH,"REFRESH"},
- {ICAL_METHOD_COUNTER,"COUNTER"},
- {ICAL_METHOD_DECLINECOUNTER,"DECLINECOUNTER"},
- /* CAP Methods */
- {ICAL_METHOD_CREATE,"CREATE"},
- {ICAL_METHOD_READ,"READ"},
- {ICAL_METHOD_RESPONSE,"RESPONSE"},
- {ICAL_METHOD_MOVE,"MOVE"},
- {ICAL_METHOD_MODIFY,"MODIFY"},
- {ICAL_METHOD_GENERATEUID,"GENERATEUID"},
- {ICAL_METHOD_DELETE,"DELETE"},
- {ICAL_METHOD_NONE,"NONE"}
-};
-
-
-char* icalenum_method_to_string(icalproperty_method method)
-{
- int i;
-
- for (i=0; method_map[i].method != ICAL_METHOD_NONE; i++) {
- if ( method_map[i].method == method) {
- return method_map[i].str;
- }
- }
-
- return method_map[i].str; /* should be ICAL_METHOD_NONE */
-}
-
-icalproperty_method icalenum_string_to_method(char* str)
-{
- int i;
-
- while(*str == ' '){
- str++;
- }
-
-
- for (i=0; method_map[i].method != ICAL_METHOD_NONE; i++) {
- if ( strcmp(method_map[i].str, str) == 0) {
- return method_map[i].method;
- }
- }
-
- return ICAL_METHOD_NONE;
-}
diff --git a/libical/src/libical/icalenums.h b/libical/src/libical/icalenums.h
deleted file mode 100644
index ff7cee486e..0000000000
--- a/libical/src/libical/icalenums.h
+++ /dev/null
@@ -1,466 +0,0 @@
-/* -*- Mode: C -*-*/
-/*======================================================================
- FILE: icalenums.h
-
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalenums.h
-
- Contributions from:
- Graham Davison (g.m.davison@computer.org)
-
-======================================================================*/
-
-#ifndef ICALENUMS_H
-#define ICALENUMS_H
-
-
-
-/***********************************************************************
- * Component enumerations
-**********************************************************************/
-
-typedef enum icalcomponent_kind {
- ICAL_NO_COMPONENT,
- ICAL_ANY_COMPONENT, /* Used to select all components*/
- ICAL_XROOT_COMPONENT,
- ICAL_XATTACH_COMPONENT, /* MIME attached data, returned by parser. */
- ICAL_VEVENT_COMPONENT,
- ICAL_VTODO_COMPONENT,
- ICAL_VJOURNAL_COMPONENT,
- ICAL_VCALENDAR_COMPONENT,
- ICAL_VFREEBUSY_COMPONENT,
- ICAL_VALARM_COMPONENT,
- ICAL_XAUDIOALARM_COMPONENT,
- ICAL_XDISPLAYALARM_COMPONENT,
- ICAL_XEMAILALARM_COMPONENT,
- ICAL_XPROCEDUREALARM_COMPONENT,
- ICAL_VTIMEZONE_COMPONENT,
- ICAL_XSTANDARD_COMPONENT,
- ICAL_XDAYLIGHT_COMPONENT,
- ICAL_X_COMPONENT,
- ICAL_VSCHEDULE_COMPONENT,
- ICAL_VQUERY_COMPONENT,
- ICAL_VCAR_COMPONENT,
- ICAL_VCOMMAND_COMPONENT,
- ICAL_XLICINVALID_COMPONENT
-} icalcomponent_kind;
-
-/***********************************************************************
- * Property Enumerations
-**********************************************************************/
-
-typedef enum icalproperty_kind {
- ICAL_ANY_PROPERTY = 0, /* This must be the first enum, for iteration */
- ICAL_CALSCALE_PROPERTY,
- ICAL_METHOD_PROPERTY,
- ICAL_PRODID_PROPERTY,
- ICAL_VERSION_PROPERTY,
- ICAL_ATTACH_PROPERTY,
- ICAL_CATEGORIES_PROPERTY,
- ICAL_CLASS_PROPERTY,
- ICAL_COMMENT_PROPERTY,
- ICAL_DESCRIPTION_PROPERTY,
- ICAL_GEO_PROPERTY,
- ICAL_LOCATION_PROPERTY,
- ICAL_PERCENTCOMPLETE_PROPERTY,
- ICAL_PRIORITY_PROPERTY,
- ICAL_RESOURCES_PROPERTY,
- ICAL_STATUS_PROPERTY,
- ICAL_SUMMARY_PROPERTY,
- ICAL_COMPLETED_PROPERTY,
- ICAL_DTEND_PROPERTY,
- ICAL_DUE_PROPERTY,
- ICAL_DTSTART_PROPERTY,
- ICAL_DURATION_PROPERTY,
- ICAL_FREEBUSY_PROPERTY,
- ICAL_TRANSP_PROPERTY,
- ICAL_TZID_PROPERTY,
- ICAL_TZNAME_PROPERTY,
- ICAL_TZOFFSETFROM_PROPERTY,
- ICAL_TZOFFSETTO_PROPERTY,
- ICAL_TZURL_PROPERTY,
- ICAL_ATTENDEE_PROPERTY,
- ICAL_CONTACT_PROPERTY,
- ICAL_ORGANIZER_PROPERTY,
- ICAL_RECURRENCEID_PROPERTY,
- ICAL_RELATEDTO_PROPERTY,
- ICAL_URL_PROPERTY,
- ICAL_UID_PROPERTY,
- ICAL_EXDATE_PROPERTY,
- ICAL_EXRULE_PROPERTY,
- ICAL_RDATE_PROPERTY,
- ICAL_RRULE_PROPERTY,
- ICAL_ACTION_PROPERTY,
- ICAL_REPEAT_PROPERTY,
- ICAL_TRIGGER_PROPERTY,
- ICAL_CREATED_PROPERTY,
- ICAL_DTSTAMP_PROPERTY,
- ICAL_LASTMODIFIED_PROPERTY,
- ICAL_SEQUENCE_PROPERTY,
- ICAL_REQUESTSTATUS_PROPERTY,
- ICAL_X_PROPERTY,
-
- /* CAP Properties */
- ICAL_SCOPE_PROPERTY,
- ICAL_MAXRESULTS_PROPERTY,
- ICAL_MAXRESULTSSIZE_PROPERTY,
- ICAL_QUERY_PROPERTY,
- ICAL_QUERYNAME_PROPERTY,
- ICAL_TARGET_PROPERTY,
-
- /* libical private properties */
- ICAL_XLICERROR_PROPERTY,
- ICAL_XLICCLUSTERCOUNT_PROPERTY,
-
- ICAL_NO_PROPERTY /* This must be the last enum, for iteration */
-
-} icalproperty_kind;
-
-/***********************************************************************
- * Enumerations for the values of properties
- ***********************************************************************/
-
-typedef enum icalproperty_method {
- ICAL_METHOD_PUBLISH,
- ICAL_METHOD_REQUEST,
- ICAL_METHOD_REPLY,
- ICAL_METHOD_ADD,
- ICAL_METHOD_CANCEL,
- ICAL_METHOD_REFRESH,
- ICAL_METHOD_COUNTER,
- ICAL_METHOD_DECLINECOUNTER,
- /* CAP Methods */
- ICAL_METHOD_CREATE,
- ICAL_METHOD_READ,
- ICAL_METHOD_RESPONSE,
- ICAL_METHOD_MOVE,
- ICAL_METHOD_MODIFY,
- ICAL_METHOD_GENERATEUID,
- ICAL_METHOD_DELETE,
- ICAL_METHOD_NONE
-} icalproperty_method ;
-
-typedef enum icalproperty_transp {
- ICAL_TRANSP_OPAQUE,
- ICAL_TRANS_TRANSPARENT
-} icalproperty_trans;
-
-typedef enum icalproperty_calscale {
- ICAL_CALSCALE_GREGORIAN
-} icalproperty_calscale ;
-
-
-typedef enum icalproperty_class {
- ICAL_CLASS_PUBLIC,
- ICAL_CLASS_PRIVATE,
- ICAL_CLASS_CONFIDENTIAL,
- ICAL_CLASS_XNAME
-} icalproperty_class;
-
-
-typedef enum icalproperty_status {
- ICAL_STATUS_TENTATIVE,
- ICAL_STATUS_CONFIRMED,
- ICAL_STATUS_CANCELLED, /* CANCELED? SIC */
- ICAL_STATUS_NEEDSACTION,
- ICAL_STATUS_COMPLETED,
- ICAL_STATUS_INPROCESS,
- ICAL_STATUS_DRAFT,
- ICAL_STATUS_FINAL
-} icalproperty_status;
-
-typedef enum icalproperty_action {
- ICAL_ACTION_AUDIO,
- ICAL_ACTION_DISPLAY,
- ICAL_ACTION_EMAIL,
- ICAL_ACTION_PROCEDURE,
- ICAL_ACTION_XNAME
-} icalproperty_action;
-
-/***********************************************************************
- * Value enumerations
-**********************************************************************/
-
-typedef enum icalvalue_kind {
- ICAL_NO_VALUE,
- ICAL_ATTACH_VALUE, /* Non-Standard*/
- ICAL_BINARY_VALUE,
- ICAL_BOOLEAN_VALUE,
- ICAL_CALADDRESS_VALUE,
- ICAL_DATE_VALUE,
- ICAL_DATETIME_VALUE,
- ICAL_DATETIMEDATE_VALUE, /* Non-Standard */
- ICAL_DATETIMEPERIOD_VALUE, /* Non-Standard */
- ICAL_DURATION_VALUE,
- ICAL_FLOAT_VALUE,
- ICAL_GEO_VALUE, /* Non-Standard */
- ICAL_INTEGER_VALUE,
- ICAL_METHOD_VALUE, /* Non-Standard */
- ICAL_PERIOD_VALUE,
- ICAL_RECUR_VALUE,
- ICAL_STRING_VALUE, /* Non-Standard */
- ICAL_TEXT_VALUE,
- ICAL_TIME_VALUE,
- ICAL_TRIGGER_VALUE, /* Non-Standard */
- ICAL_URI_VALUE,
- ICAL_UTCOFFSET_VALUE,
- ICAL_QUERY_VALUE,
- ICAL_XNAME_VALUE
-} icalvalue_kind;
-
-
-/***********************************************************************
- * Parameter Enumerations
- **********************************************************************/
-
-
-typedef enum icalparameter_kind {
- ICAL_NO_PARAMETER,
- ICAL_ANY_PARAMETER,
- ICAL_ALTREP_PARAMETER, /* DQUOTE uri DQUOTE */
- ICAL_CN_PARAMETER, /* text */
- ICAL_CUTYPE_PARAMETER, /*INDIVIDUAL, GROUP, RESOURCE,ROOM,UNKNOWN, x-name*/
- ICAL_DELEGATEDFROM_PARAMETER, /* *("," DQUOTE cal-address DQUOTE) */
- ICAL_DELEGATEDTO_PARAMETER, /* *("," DQUOTE cal-address DQUOTE) */
- ICAL_DIR_PARAMETER, /* DQUOTE uri DQUOTE */
- ICAL_ENCODING_PARAMETER, /* *BIT, BASE64, x-name */
- ICAL_FMTTYPE_PARAMETER, /* registered MINE content type */
- ICAL_FBTYPE_PARAMETER, /* FREE, BUSY, BUSY-UNAVAILABLE, BUSY-TENTATIVE,x-name */
- ICAL_LANGUAGE_PARAMETER, /* text from RFC 1766 */
- ICAL_MEMBER_PARAMETER, /* DQUOTE cal-address DQUOTE */
- ICAL_PARTSTAT_PARAMETER, /* NEEDS-ACTION, ACCEPTED, DECLINED, TENTATIVE, DELEGATED, x-name */
- ICAL_RANGE_PARAMETER, /* THISANDPRIOR, THISANDFUTURE */
- ICAL_RELATED_PARAMETER, /* START, END */
- ICAL_RELTYPE_PARAMETER, /* PARENT, CHILD, SIBLING,x-name */
- ICAL_ROLE_PARAMETER, /* CHAIR, REQ_PARTICIPANT, OPT_PARTICIPANT, NON_PARTICIPANT, x-name */
- ICAL_RSVP_PARAMETER, /* TRUE. FALSE */
- ICAL_SENTBY_PARAMETER, /* DQUOTE uri DQUOTE */
- ICAL_TZID_PARAMETER, /* [tzidprefix] paramtext CRLF */
- ICAL_VALUE_PARAMETER, /* BINARY, BOOLEAN, CAL_ADDRESS, DATE, DATE-TIME, DURATION, FLOAT, INTEGER, PERIOD, RECUR, TEXT, TIME, UTC_OFFSET, x-name */
- ICAL_XLICERRORTYPE_PARAMETER, /*ICAL_XLICERROR_PARSE_ERROR,ICAL_XLICERROR_INVALID_ITIP*/
- ICAL_XLICCOMPARETYPE_PARAMETER, /**/
- ICAL_X_PARAMETER /* text */
-} icalparameter_kind;
-
-typedef enum icalparameter_cutype {
- ICAL_CUTYPE_INDIVIDUAL,
- ICAL_CUTYPE_GROUP,
- ICAL_CUTYPE_RESOURCE,
- ICAL_CUTYPE_ROOM,
- ICAL_CUTYPE_UNKNOWN,
- ICAL_CUTYPE_XNAME
-} icalparameter_cutype;
-
-
-typedef enum icalparameter_encoding {
- ICAL_ENCODING_8BIT,
- ICAL_ENCODING_BASE64,
- ICAL_ENCODING_XNAME
-} icalparameter_encoding;
-
-typedef enum icalparameter_fbtype {
- ICAL_FBTYPE_FREE,
- ICAL_FBTYPE_BUSY,
- ICAL_FBTYPE_BUSYUNAVAILABLE,
- ICAL_FBTYPE_BUSYTENTATIVE,
- ICAL_FBTYPE_XNAME
-} icalparameter_fbtype;
-
-typedef enum icalparameter_partstat {
- ICAL_PARTSTAT_NEEDSACTION,
- ICAL_PARTSTAT_ACCEPTED,
- ICAL_PARTSTAT_DECLINED,
- ICAL_PARTSTAT_TENTATIVE,
- ICAL_PARTSTAT_DELEGATED,
- ICAL_PARTSTAT_COMPLETED,
- ICAL_PARTSTAT_INPROCESS,
- ICAL_PARTSTAT_XNAME
-} icalparameter_partstat;
-
-typedef enum icalparameter_range {
- ICAL_RANGE_THISANDPRIOR,
- ICAL_RANGE_THISANDFUTURE
-} icalparameter_range;
-
-typedef enum icalparameter_related {
- ICAL_RELATED_START,
- ICAL_RELATED_END
-} icalparameter_related;
-
-typedef enum icalparameter_reltype {
- ICAL_RELTYPE_PARENT,
- ICAL_RELTYPE_CHILD,
- ICAL_RELTYPE_SIBLING,
- ICAL_RELTYPE_XNAME
-} icalparameter_reltype;
-
-typedef enum icalparameter_role {
- ICAL_ROLE_CHAIR,
- ICAL_ROLE_REQPARTICIPANT,
- ICAL_ROLE_OPTPARTICIPANT,
- ICAL_ROLE_NONPARTICIPANT,
- ICAL_ROLE_XNAME
-} icalparameter_role;
-
-typedef enum icalparameter_xlicerrortype {
- ICAL_XLICERRORTYPE_COMPONENTPARSEERROR,
- ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR,
- ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR,
- ICAL_XLICERRORTYPE_PROPERTYPARSEERROR,
- ICAL_XLICERRORTYPE_VALUEPARSEERROR,
- ICAL_XLICERRORTYPE_INVALIDITIP
-} icalparameter_xlicerrortype;
-
-typedef enum icalparameter_xliccomparetype {
- ICAL_XLICCOMPARETYPE_EQUAL=0,
- ICAL_XLICCOMPARETYPE_LESS=-1,
- ICAL_XLICCOMPARETYPE_LESSEQUAL=2,
- ICAL_XLICCOMPARETYPE_GREATER=1,
- ICAL_XLICCOMPARETYPE_GREATEREQUAL=3,
- ICAL_XLICCOMPARETYPE_NOTEQUAL=4,
- ICAL_XLICCOMPARETYPE_REGEX=5
-} icalparameter_xliccomparetype;
-
-typedef enum icalparameter_value {
- ICAL_VALUE_XNAME = ICAL_XNAME_VALUE,
- ICAL_VALUE_BINARY = ICAL_BINARY_VALUE,
- ICAL_VALUE_BOOLEAN = ICAL_BOOLEAN_VALUE,
- ICAL_VALUE_CALADDRESS = ICAL_CALADDRESS_VALUE,
- ICAL_VALUE_DATE = ICAL_DATE_VALUE,
- ICAL_VALUE_DATETIME = ICAL_DATETIME_VALUE,
- ICAL_VALUE_DURATION = ICAL_DURATION_VALUE,
- ICAL_VALUE_FLOAT = ICAL_FLOAT_VALUE,
- ICAL_VALUE_INTEGER = ICAL_INTEGER_VALUE,
- ICAL_VALUE_PERIOD = ICAL_PERIOD_VALUE,
- ICAL_VALUE_RECUR = ICAL_RECUR_VALUE,
- ICAL_VALUE_TEXT = ICAL_TEXT_VALUE,
- ICAL_VALUE_TIME = ICAL_TIME_VALUE,
- ICAL_VALUE_UTCOFFSET = ICAL_UTCOFFSET_VALUE,
- ICAL_VALUE_URI = ICAL_URI_VALUE,
- ICAL_VALUE_ERROR = ICAL_NO_VALUE
-} icalparameter_value;
-
-/***********************************************************************
- * Recurrances
-**********************************************************************/
-
-
-typedef enum icalrecurrencetype_frequency
-{
- ICAL_NO_RECURRENCE,
- ICAL_SECONDLY_RECURRENCE,
- ICAL_MINUTELY_RECURRENCE,
- ICAL_HOURLY_RECURRENCE,
- ICAL_DAILY_RECURRENCE,
- ICAL_WEEKLY_RECURRENCE,
- ICAL_MONTHLY_RECURRENCE,
- ICAL_YEARLY_RECURRENCE
-} icalrecurrencetype_frequency;
-
-typedef enum icalrecurrencetype_weekday
-{
- ICAL_NO_WEEKDAY,
- ICAL_SUNDAY_WEEKDAY,
- ICAL_MONDAY_WEEKDAY,
- ICAL_TUESDAY_WEEKDAY,
- ICAL_WEDNESDAY_WEEKDAY,
- ICAL_THURSDAY_WEEKDAY,
- ICAL_FRIDAY_WEEKDAY,
- ICAL_SATURDAY_WEEKDAY
-} icalrecurrencetype_weekday;
-
-enum {
- ICAL_RECURRENCE_ARRAY_MAX = 0x7f7f,
- ICAL_RECURRENCE_ARRAY_MAX_BYTE = 0x7f
-};
-
-
-char* icalenum_recurrence_to_string(icalrecurrencetype_frequency kind);
-char* icalenum_weekday_to_string(icalrecurrencetype_weekday kind);
-
-/***********************************************************************
- * Request Status codes
- **********************************************************************/
-
-typedef enum icalrequeststatus {
- ICAL_UNKNOWN_STATUS,
- ICAL_2_0_SUCCESS_STATUS,
- ICAL_2_1_FALLBACK_STATUS,
- ICAL_2_2_IGPROP_STATUS,
- ICAL_2_3_IGPARAM_STATUS,
- ICAL_2_4_IGXPROP_STATUS,
- ICAL_2_5_IGXPARAM_STATUS,
- ICAL_2_6_IGCOMP_STATUS,
- ICAL_2_7_FORWARD_STATUS,
- ICAL_2_8_ONEEVENT_STATUS,
- ICAL_2_9_TRUNC_STATUS,
- ICAL_2_10_ONETODO_STATUS,
- ICAL_2_11_TRUNCRRULE_STATUS,
- ICAL_3_0_INVPROPNAME_STATUS,
- ICAL_3_1_INVPROPVAL_STATUS,
- ICAL_3_2_INVPARAM_STATUS,
- ICAL_3_3_INVPARAMVAL_STATUS,
- ICAL_3_4_INVCOMP_STATUS,
- ICAL_3_5_INVTIME_STATUS,
- ICAL_3_6_INVRULE_STATUS,
- ICAL_3_7_INVCU_STATUS,
- ICAL_3_8_NOAUTH_STATUS,
- ICAL_3_9_BADVERSION_STATUS,
- ICAL_3_10_TOOBIG_STATUS,
- ICAL_3_11_MISSREQCOMP_STATUS,
- ICAL_3_12_UNKCOMP_STATUS,
- ICAL_3_13_BADCOMP_STATUS,
- ICAL_3_14_NOCAP_STATUS,
- ICAL_4_0_BUSY_STATUS,
- ICAL_5_0_MAYBE_STATUS,
- ICAL_5_1_UNAVAIL_STATUS,
- ICAL_5_2_NOSERVICE_STATUS,
- ICAL_5_3_NOSCHED_STATUS
-} icalrequeststatus;
-
-
-char* icalenum_reqstat_desc(icalrequeststatus stat);
-short icalenum_reqstat_major(icalrequeststatus stat);
-short icalenum_reqstat_minor(icalrequeststatus stat);
-icalrequeststatus icalenum_num_to_reqstat(short major, short minor);
-
-/***********************************************************************
- * Conversion functions
-**********************************************************************/
-
-char* icalenum_property_kind_to_string(icalproperty_kind kind);
-icalproperty_kind icalenum_string_to_property_kind(char* string);
-
-char* icalenum_value_kind_to_string(icalvalue_kind kind);
-icalvalue_kind icalenum_value_kind_by_prop(icalproperty_kind kind);
-
-char* icalenum_parameter_kind_to_string(icalparameter_kind kind);
-icalparameter_kind icalenum_string_to_parameter_kind(char* string);
-
-char* icalenum_component_kind_to_string(icalcomponent_kind kind);
-icalcomponent_kind icalenum_string_to_component_kind(char* string);
-
-icalvalue_kind icalenum_property_kind_to_value_kind(icalproperty_kind kind);
-
-char* icalenum_method_to_string(icalproperty_method);
-icalproperty_method icalenum_string_to_method(char* string);
-
-#endif /* !ICALENUMS_H */
-
-
-
diff --git a/libical/src/libical/icalerror.c b/libical/src/libical/icalerror.c
deleted file mode 100644
index fb9e152b16..0000000000
--- a/libical/src/libical/icalerror.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalerror.c
- CREATOR: eric 16 May 1999
-
- $Id$
- $Locker$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalerror.c
-
- ======================================================================*/
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "icalerror.h"
-
-icalerrorenum icalerrno;
-
-int foo;
-void icalerror_stop_here(void)
-{
- foo++; /* Keep optimizers from removing routine */
-}
-
-void icalerror_crash_here(void)
-{
- int *p=0;
- *p = 1;
-
- assert( *p);
-}
-
-
-void icalerror_clear_errno() {
-
- icalerrno = ICAL_NO_ERROR;
-}
-
-void icalerror_set_errno(icalerrorenum e) {
-
- icalerror_stop_here();
- icalerrno = e;
-}
-
-
-struct icalerror_string_map {
- icalerrorenum error;
- char name[160];
-};
-
-static struct icalerror_string_map string_map[] =
-{
- {ICAL_BADARG_ERROR,"Bad argumnet to function"},
- {ICAL_NEWFAILED_ERROR,"Failed to create a new object via a *_new() routine"},
- {ICAL_MALFORMEDDATA_ERROR,"An input string was not correctly formed"},
- {ICAL_PARSE_ERROR,"Failed to parse a part of an iCal componet"},
- {ICAL_INTERNAL_ERROR,"Random internal error. This indicates an error in the library code, not an error in use"},
- {ICAL_FILE_ERROR,"An operation on a file failed. Check errno for more detail."},
- {ICAL_ALLOCATION_ERROR,"Failed to allocate memory"},
- {ICAL_USAGE_ERROR,"The caller failed to properly sequence called to an object's interface"},
- {ICAL_NO_ERROR,"No error"},
- {ICAL_UNKNOWN_ERROR,"Unknown error type -- icalerror_strerror() was probably given bad input"}
-};
-
-
-char* icalerror_strerror(icalerrorenum e) {
-
- int i;
-
- for (i=0; string_map[i].error != ICAL_UNKNOWN_ERROR; i++) {
- if (string_map[i].error == e) {
- return string_map[i].name;
- }
- }
-
- return string_map[i].name; /* Return string for ICAL_UNKNOWN_ERROR*/
-
-}
-
-
-
diff --git a/libical/src/libical/icalerror.h b/libical/src/libical/icalerror.h
deleted file mode 100644
index 124699c21b..0000000000
--- a/libical/src/libical/icalerror.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalerror.h
- CREATOR: eric 09 May 1999
-
- $Id$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalerror.h
-
-======================================================================*/
-
-
-#ifndef ICALERROR_H
-#define ICALERROR_H
-
-#include <assert.h>
-#include <stdio.h> /* For icalerror_warn() */
-
-/* This routine is called before any error is triggered. It is called
- by icalerror_set_errno, so it does not appear in all of the macros
- below */
-void icalerror_stop_here(void);
-
-void icalerror_crash_here(void);
-
-#ifdef ICAL_ERRORS_ARE_FATAL
-#undef NDEBUG
-#endif
-
-#define icalerror_check_value_type(value,type);
-#define icalerror_check_property_type(value,type);
-#define icalerror_check_parameter_type(value,type);
-#define icalerror_check_component_type(value,type);
-
-/* Assert with a message */
-#ifdef ICAL_ERRORS_ARE_FATAL
-
-#ifdef __GNUC__
-#define icalerror_assert(test,message) if(!(test)){fprintf(stderr,"%s(), %s:%d: %s\n",__FUNCTION__,__FILE__,__LINE__,message);icalerror_stop_here(); abort();}
-#else /*__GNUC__*/
-#define icalerror_assert(test,message) if(!(test)){fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,message);icalerror_stop_here(); abort();}
-#endif /*__GNUC__*/
-#else
-#define icalerror_assert(test,message)
-#endif
-
-
-/* Check & abort if check fails */
-#ifdef ICAL_ERRORS_ARE_FATAL
-#define icalerror_check_arg(test,arg) icalerror_stop_here();assert(test)
-#else
-#define icalerror_check_arg(test,arg)
-#endif
-/* Check & return void if check failes*/
-
-#ifdef ICAL_ERRORS_ARE_FATAL
-#define icalerror_check_arg_rv(test,arg) icalerror_stop_here();assert(test);
-#else
-#define icalerror_check_arg_rv(test,arg) if(!(test)) { icalerror_set_errno(ICAL_BADARG_ERROR); return; }
-#endif
-
-/* Check & return 0 if check failes*/
-#ifdef ICAL_ERRORS_ARE_FATAL
-#define icalerror_check_arg_rz(test,arg) icalerror_stop_here();assert(test);
-#else
-#define icalerror_check_arg_rz(test,arg) if(!(test)) {icalerror_set_errno(ICAL_BADARG_ERROR); return 0;}
-#endif
-
-
-/* Check & return an error if check failes*/
-#ifdef ICAL_ERRORS_ARE_FATAL
-#define icalerror_check_arg_re(test,arg,error) icalerror_stop_here();assert(test);
-#else
-#define icalerror_check_arg_re(test,arg,error) if(!(test)) {icalerror_stop_here(); return error;}
-#endif
-
-
-/* Warning messages */
-
-#ifdef ICAL_ERRORS_ARE_FATAL
-
-#ifdef __GNUC__
-#define icalerror_warn(message) {fprintf(stderr,"%s(), %s:%d: %s\n",__FUNCTION__,__FILE__,__LINE__,message); abort();}
-#else /* __GNU_C__ */
-#define icalerror_warn(message) {fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,message); abort();}
-#endif /* __GNU_C__ */
-
-#else /*ICAL_ERRORS_ARE_FATAL */
-
-#ifdef __GNUC__
-#define icalerror_warn(message) {fprintf(stderr,"%s(), %s:%d: %s\n",__FUNCTION__,__FILE__,__LINE__,message);}
-#else /* __GNU_C__ */
-#define icalerror_warn(message) {fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,message);}
-#endif /* __GNU_C__ */
-
-#endif /*ICAL_ERRORS_ARE_FATAL*/
-
-typedef enum icalerrorenum {
-
- ICAL_BADARG_ERROR,
- ICAL_NEWFAILED_ERROR,
- ICAL_MALFORMEDDATA_ERROR,
- ICAL_PARSE_ERROR,
- ICAL_INTERNAL_ERROR, /* Like assert --internal consist. prob */
- ICAL_FILE_ERROR,
- ICAL_ALLOCATION_ERROR,
- ICAL_USAGE_ERROR,
- ICAL_NO_ERROR,
- ICAL_MULTIPLEINCLUSION_ERROR,
- ICAL_UNKNOWN_ERROR /* Used for problems in input to icalerror_strerror()*/
-
-} icalerrorenum;
-
-extern icalerrorenum icalerrno;
-
-
-void icalerror_clear_errno();
-void icalerror_set_errno(icalerrorenum);
-
-char* icalerror_strerror(icalerrorenum e);
-
-
-#endif /* !ICALERROR_H */
-
-
-
diff --git a/libical/src/libical/icalirip.h b/libical/src/libical/icalirip.h
deleted file mode 100644
index eefbca35c5..0000000000
--- a/libical/src/libical/icalirip.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalirip.h
- CREATOR: eric 20 April 1999
-
- $Id$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalirip.h
-
-======================================================================*/
-
-
-#ifndef ICALIRIP_H
-#define ICALIRIP_H
-
-#include "ical.h"
-
-typedef void* icalirip;
-
-/********************** Server (Reciever) Interfaces *************************/
-
-icalirip* icalirip_new();
-void* icalirip_free();
-
-/* Protocol functions */
-char* icalirip_process_request(icalirip* irip, char* string);
-
-/* iRIP server stubs */
-typedef struct icalirip_response {
- char code[6];
- char caluid[1024];
- void* result;
-} icalirip_response;
-
-icalirip_response icalirip_timedout_stub(icalirip* irip);
-icalirip_response icalirip_authenticate_stub(icalirip* irip, char* mechanism, char* data);
-icalirip_response icalirip_sendata_stub(icalirip* irip, unsigned int time);
-icalirip_response icalirip_dequeue_stub(icalirip* irip, char* caluid,unsigned int time);
-icalirip_response icalirip_recipient_stub(icalirip* irip, char* address, unsigned int time);
-icalirip_response icalirip_switch_stub(icalirip* irip);
-icalirip_response icalirip_disconnect_stub(icalirip* irip);
-icalirip_response icalirip_unknown_stub(icalirip* irip, char* command);
-
-/* icalirip_set_stubs makes the module use function pointers to
-instead of the above stubs. The set_stubs procedure will requires the
-user to link another library with defined the above stubs and
-re-directs the call to the appropriate pointer to function. */
-
-typedef struct icalirip_stubs {
-
- void(*authenticate_stub)(icalirip* irip, char* mechanism, char* data);
- void (*sendata_stub)(icalirip* irip, unsigned int time);
- void (*dequeue_stub)(icalirip* irip, char* caluid, unsigned int time);
- void (*recipient_stub)(icalirip* irip, char* address, unsigned int time);
- void (*switch_stub)(icalirip* irip);
- void (*disconnect_stub)();
- void (*unknown_stub)(icalirip* irip, char* command, char** data);
-
-} icalirip_stubs;
-
-void icalirip_set_stubs(icalirip* irip, icalirip_stubs* stubs);
-
-/********************** Client (Sender) Interfaces **************************/
-
-/* Client API */
-icalirip_response icalirip_abort(icalirip* irip);
-icalirip_response icalirip_authenticate(icalirip* irip, char* mechanism, char* data);
-icalirip_response icalirip_capability(icalirip* irip);
-icalirip_response icalirip_continue(icalirip* irip, unsigned int time);
-icalirip_response icalirip_sendata(icalirip* irip, icalcomponent* comp, unsigned int time);
-icalirip_response icalirip_recipient(icalirip* irip, char* address, unsigned int time);
-icalirip_response icalirip_dequeue(icalirip* irip, char* address, unsigned int time);
-icalirip_response icalirip_switch(icalirip* irip);
-icalirip_response icalirip_disconnect();
-icalirip_response icalirip_unknown(icalirip* irip, char* command);
-
-/* client stubs */
-void icalirip_send_request(icalirip* irip,char* request);
-char* icalirip_get_response(icalirip* irip);
-
-/********************** Configuration Interfaces **************************/
-
-/* Configure capabilities */
-void icalirip_add_auth_mechanism(icalirip* irip, char* auth);
-void icalirip_set_max_object_size(icalirip* irip, unsigned int size);
-void icalirip_set_max_date(icalirip* irip, time_t time);
-void icalirip_set_min_date(icalirip* irip, time_t time);
-
-
-#endif /* !ICALIRIP_H */
-
-
-
diff --git a/libical/src/libical/icalitip.output b/libical/src/libical/icalitip.output
deleted file mode 100644
index 1218f89c74..0000000000
--- a/libical/src/libical/icalitip.output
+++ /dev/null
@@ -1,1698 +0,0 @@
-
-
-Terminals which are not used:
-
- FLOATNUMBER
- STRING
- EOL
- CHARACTER
- COLON
- TIMESEPERATOR
- BIT8
- ACCEPTED
- ADD
- AUDIO
- BASE64
- BINARY
- BOOLEAN
- BUSY
- BUSYTENTATIVE
- BUSYUNAVAILABLE
- CALADDRESS
- CANCEL
- CANCELLED
- CHAIR
- CHILD
- COMPLETED
- CONFIDENTIAL
- CONFIRMED
- COUNTER
- DATE
- DATETIME
- DECLINECOUNTER
- DECLINED
- DELEGATED
- DISPLAY
- DRAFT
- DURATION
- EMAIL
- END
- FINAL
- FLOAT
- FREE
- GREGORIAN
- GROUP
- INDIVIDUAL
- INPROCESS
- INTEGER
- NEEDSACTION
- NONPARTICIPANT
- OPAQUE
- OPTPARTICIPANT
- PARENT
- PERIOD
- PRIVATE
- PROCEDURE
- PUBLIC
- PUBLISH
- RECUR
- REFRESH
- REPLY
- REQPARTICIPANT
- REQUEST
- RESOURCE
- ROOM
- SIBLING
- START
- TENTATIVE
- TEXT
- THISANDFUTURE
- THISANDPRIOR
- TIME
- TRANSPAENT
- UNKNOWN
- UTCOFFSET
- XNAME
- ALTREP
- CN
- CUTYPE
- DAYLIGHT
- DIR
- ENCODING
- EVENT
- FBTYPE
- FMTTYPE
- LANGUAGE
- MEMBER
- PARTSTAT
- RANGE
- RELATED
- RELTYPE
- ROLE
- RSVP
- SENTBY
- STANDARD
- URI
-
-
-
-Grammar
-rule 1 value -> binary_value
-rule 2 value -> boolean_value
-rule 3 value -> date_value
-rule 4 value -> datetime_value
-rule 5 value -> duration_value
-rule 6 value -> period_value
-rule 7 value -> recur_value
-rule 8 value -> utcoffset_value
-rule 9 value -> error
-rule 10 binary_value -> "unimplemented2"
-rule 11 boolean_value -> TRUE
-rule 12 boolean_value -> FALSE
-rule 13 date_value -> DIGITS
-rule 14 utc_char -> /* empty */
-rule 15 utc_char -> UTC_CHAR
-rule 16 utc_char_b -> /* empty */
-rule 17 utc_char_b -> UTC_CHAR
-rule 18 datetime_value -> DIGITS TIME_CHAR DIGITS utc_char
-rule 19 dur_date -> dur_day
-rule 20 dur_date -> dur_day dur_time
-rule 21 dur_week -> DIGITS 'W'
-rule 22 dur_time -> TIME_CHAR dur_hour
-rule 23 dur_time -> TIME_CHAR dur_minute
-rule 24 dur_time -> TIME_CHAR dur_second
-rule 25 dur_hour -> DIGITS 'H'
-rule 26 dur_hour -> DIGITS 'H' dur_minute
-rule 27 dur_minute -> DIGITS 'M'
-rule 28 dur_minute -> DIGITS 'M' dur_second
-rule 29 dur_second -> DIGITS 'S'
-rule 30 dur_day -> DIGITS 'D'
-rule 31 dur_prefix -> /* empty */
-rule 32 dur_prefix -> '+'
-rule 33 dur_prefix -> '-'
-rule 34 duration_value -> dur_prefix 'P' dur_date
-rule 35 duration_value -> dur_prefix 'P' dur_time
-rule 36 duration_value -> dur_prefix 'P' dur_week
-rule 37 period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b
-rule 38 period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' duration_value
-rule 39 recur_start -> FREQ EQUALS SECONDLY
-rule 40 recur_start -> FREQ EQUALS MINUTELY
-rule 41 recur_start -> FREQ EQUALS HOURLY
-rule 42 recur_start -> FREQ EQUALS DAILY
-rule 43 recur_start -> FREQ EQUALS WEEKLY
-rule 44 recur_start -> FREQ EQUALS MONTHLY
-rule 45 recur_start -> FREQ EQUALS YEARLY
-rule 46 weekday -> SU
-rule 47 weekday -> MO
-rule 48 weekday -> TU
-rule 49 weekday -> WE
-rule 50 weekday -> TH
-rule 51 weekday -> FR
-rule 52 weekday -> SA
-rule 53 weekday_list -> weekday
-rule 54 weekday_list -> DIGITS weekday
-rule 55 weekday_list -> weekday_list COMMA weekday
-rule 56 recur_list -> DIGITS
-rule 57 recur_list -> recur_list COMMA DIGITS
-rule 58 recur_skip -> INTERVAL EQUALS DIGITS
-rule 59 recur_skip -> WKST EQUALS SU
-rule 60 recur_skip -> WKST EQUALS MO
-rule 61 recur_skip -> WKST EQUALS TU
-rule 62 recur_skip -> WKST EQUALS WE
-rule 63 recur_skip -> WKST EQUALS TH
-rule 64 recur_skip -> WKST EQUALS FR
-rule 65 recur_skip -> WKST EQUALS SA
-rule 66 recur_skip -> BYSECOND EQUALS recur_list
-rule 67 recur_skip -> BYMINUTE EQUALS recur_list
-rule 68 recur_skip -> BYHOUR EQUALS recur_list
-rule 69 recur_skip -> BYDAY EQUALS weekday_list
-rule 70 recur_skip -> BYMONTH EQUALS recur_list
-rule 71 recur_skip -> BYMONTHDAY EQUALS recur_list
-rule 72 recur_skip -> BYYEARDAY EQUALS recur_list
-rule 73 recur_skip -> BYWEEKNO EQUALS recur_list
-rule 74 recur_skip -> BYSETPOS EQUALS recur_list
-rule 75 recur_skip -> UNTIL EQUALS datetime_value
-rule 76 recur_skip -> UNTIL EQUALS date_value
-rule 77 recur_skip -> COUNT EQUALS DIGITS
-rule 78 recur_skip_list -> /* empty */
-rule 79 recur_skip_list -> recur_skip_list SEMICOLON recur_skip
-rule 80 recur_value -> recur_start recur_skip_list
-rule 81 plusminus -> '+'
-rule 82 plusminus -> '-'
-rule 83 utcoffset_value -> plusminus INTNUMBER INTNUMBER
-rule 84 utcoffset_value -> plusminus INTNUMBER INTNUMBER INTNUMBER
-
-Terminals, with rules where they appear
-
-$ (-1)
-'+' (43) 32 81
-'-' (45) 33 82
-'/' (47) 37 38
-'D' (68) 30
-'H' (72) 25 26
-'M' (77) 27 28
-'P' (80) 34 35 36
-'S' (83) 29
-'W' (87) 21
-error (256) 9
-DIGITS (257) 13 18 21 25 26 27 28 29 30 37 38 54 56 57 58 77
-INTNUMBER (258) 83 84
-FLOATNUMBER (259)
-STRING (260)
-EOL (261)
-EQUALS (262) 39 40 41 42 43 44 45 58 59 60 61 62 63 64 65 66 67 68
- 69 70 71 72 73 74 75 76 77
-CHARACTER (263)
-COLON (264)
-COMMA (265) 55 57
-SEMICOLON (266) 79
-TIMESEPERATOR (267)
-TRUE (268) 11
-FALSE (269) 12
-FREQ (270) 39 40 41 42 43 44 45
-BYDAY (271) 69
-BYHOUR (272) 68
-BYMINUTE (273) 67
-BYMONTH (274) 70
-BYMONTHDAY (275) 71
-BYSECOND (276) 66
-BYSETPOS (277) 74
-BYWEEKNO (278) 73
-BYYEARDAY (279) 72
-DAILY (280) 42
-MINUTELY (281) 40
-MONTHLY (282) 44
-SECONDLY (283) 39
-WEEKLY (284) 43
-HOURLY (285) 41
-YEARLY (286) 45
-INTERVAL (287) 58
-COUNT (288) 77
-UNTIL (289) 75 76
-WKST (290) 59 60 61 62 63 64 65
-MO (291) 47 60
-SA (292) 52 65
-SU (293) 46 59
-TU (294) 48 61
-WE (295) 49 62
-TH (296) 50 63
-FR (297) 51 64
-BIT8 (298)
-ACCEPTED (299)
-ADD (300)
-AUDIO (301)
-BASE64 (302)
-BINARY (303)
-BOOLEAN (304)
-BUSY (305)
-BUSYTENTATIVE (306)
-BUSYUNAVAILABLE (307)
-CALADDRESS (308)
-CANCEL (309)
-CANCELLED (310)
-CHAIR (311)
-CHILD (312)
-COMPLETED (313)
-CONFIDENTIAL (314)
-CONFIRMED (315)
-COUNTER (316)
-DATE (317)
-DATETIME (318)
-DECLINECOUNTER (319)
-DECLINED (320)
-DELEGATED (321)
-DISPLAY (322)
-DRAFT (323)
-DURATION (324)
-EMAIL (325)
-END (326)
-FINAL (327)
-FLOAT (328)
-FREE (329)
-GREGORIAN (330)
-GROUP (331)
-INDIVIDUAL (332)
-INPROCESS (333)
-INTEGER (334)
-NEEDSACTION (335)
-NONPARTICIPANT (336)
-OPAQUE (337)
-OPTPARTICIPANT (338)
-PARENT (339)
-PERIOD (340)
-PRIVATE (341)
-PROCEDURE (342)
-PUBLIC (343)
-PUBLISH (344)
-RECUR (345)
-REFRESH (346)
-REPLY (347)
-REQPARTICIPANT (348)
-REQUEST (349)
-RESOURCE (350)
-ROOM (351)
-SIBLING (352)
-START (353)
-TENTATIVE (354)
-TEXT (355)
-THISANDFUTURE (356)
-THISANDPRIOR (357)
-TIME (358)
-TRANSPAENT (359)
-UNKNOWN (360)
-UTCOFFSET (361)
-XNAME (362)
-ALTREP (363)
-CN (364)
-CUTYPE (365)
-DAYLIGHT (366)
-DIR (367)
-ENCODING (368)
-EVENT (369)
-FBTYPE (370)
-FMTTYPE (371)
-LANGUAGE (372)
-MEMBER (373)
-PARTSTAT (374)
-RANGE (375)
-RELATED (376)
-RELTYPE (377)
-ROLE (378)
-RSVP (379)
-SENTBY (380)
-STANDARD (381)
-URI (382)
-TIME_CHAR (383) 18 22 23 24 37 38
-UTC_CHAR (384) 15 17
-"unimplemented2" (385) 10
-
-Nonterminals, with rules where they appear
-
-value (141)
- on left: 1 2 3 4 5 6 7 8 9
-binary_value (142)
- on left: 10, on right: 1
-boolean_value (143)
- on left: 11 12, on right: 2
-date_value (144)
- on left: 13, on right: 3 76
-utc_char (145)
- on left: 14 15, on right: 18 37 38
-utc_char_b (146)
- on left: 16 17, on right: 37
-datetime_value (147)
- on left: 18, on right: 4 75
-dur_date (148)
- on left: 19 20, on right: 34
-dur_week (149)
- on left: 21, on right: 36
-dur_time (150)
- on left: 22 23 24, on right: 20 35
-dur_hour (151)
- on left: 25 26, on right: 22
-dur_minute (152)
- on left: 27 28, on right: 23 26
-dur_second (153)
- on left: 29, on right: 24 28
-dur_day (154)
- on left: 30, on right: 19 20
-dur_prefix (155)
- on left: 31 32 33, on right: 34 35 36
-duration_value (156)
- on left: 34 35 36, on right: 5 38
-period_value (157)
- on left: 37 38, on right: 6
-recur_start (158)
- on left: 39 40 41 42 43 44 45, on right: 80
-weekday (159)
- on left: 46 47 48 49 50 51 52, on right: 53 54 55
-weekday_list (160)
- on left: 53 54 55, on right: 55 69
-recur_list (161)
- on left: 56 57, on right: 57 66 67 68 70 71 72 73 74
-recur_skip (162)
- on left: 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
- 76 77, on right: 79
-recur_skip_list (163)
- on left: 78 79, on right: 79 80
-recur_value (164)
- on left: 80, on right: 7
-plusminus (165)
- on left: 81 82, on right: 83 84
-utcoffset_value (166)
- on left: 83 84, on right: 8
-
-
-state 0
-
- error shift, and go to state 1
- DIGITS shift, and go to state 2
- TRUE shift, and go to state 3
- FALSE shift, and go to state 4
- FREQ shift, and go to state 5
- "unimplemented2" shift, and go to state 6
- '+' shift, and go to state 7
- '-' shift, and go to state 8
-
- 'P' reduce using rule 31 (dur_prefix)
-
- value go to state 133
- binary_value go to state 9
- boolean_value go to state 10
- date_value go to state 11
- datetime_value go to state 12
- dur_prefix go to state 13
- duration_value go to state 14
- period_value go to state 15
- recur_start go to state 16
- recur_value go to state 17
- plusminus go to state 18
- utcoffset_value go to state 19
-
-
-
-state 1
-
- value -> error . (rule 9)
-
- $default reduce using rule 9 (value)
-
-
-
-state 2
-
- date_value -> DIGITS . (rule 13)
- datetime_value -> DIGITS . TIME_CHAR DIGITS utc_char (rule 18)
- period_value -> DIGITS . TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b (rule 37)
- period_value -> DIGITS . TIME_CHAR DIGITS utc_char '/' duration_value (rule 38)
-
- TIME_CHAR shift, and go to state 20
-
- $default reduce using rule 13 (date_value)
-
-
-
-state 3
-
- boolean_value -> TRUE . (rule 11)
-
- $default reduce using rule 11 (boolean_value)
-
-
-
-state 4
-
- boolean_value -> FALSE . (rule 12)
-
- $default reduce using rule 12 (boolean_value)
-
-
-
-state 5
-
- recur_start -> FREQ . EQUALS SECONDLY (rule 39)
- recur_start -> FREQ . EQUALS MINUTELY (rule 40)
- recur_start -> FREQ . EQUALS HOURLY (rule 41)
- recur_start -> FREQ . EQUALS DAILY (rule 42)
- recur_start -> FREQ . EQUALS WEEKLY (rule 43)
- recur_start -> FREQ . EQUALS MONTHLY (rule 44)
- recur_start -> FREQ . EQUALS YEARLY (rule 45)
-
- EQUALS shift, and go to state 21
-
-
-
-state 6
-
- binary_value -> "unimplemented2" . (rule 10)
-
- $default reduce using rule 10 (binary_value)
-
-
-
-state 7
-
- dur_prefix -> '+' . (rule 32)
- plusminus -> '+' . (rule 81)
-
- INTNUMBER reduce using rule 81 (plusminus)
- $default reduce using rule 32 (dur_prefix)
-
-
-
-state 8
-
- dur_prefix -> '-' . (rule 33)
- plusminus -> '-' . (rule 82)
-
- INTNUMBER reduce using rule 82 (plusminus)
- $default reduce using rule 33 (dur_prefix)
-
-
-
-state 9
-
- value -> binary_value . (rule 1)
-
- $default reduce using rule 1 (value)
-
-
-
-state 10
-
- value -> boolean_value . (rule 2)
-
- $default reduce using rule 2 (value)
-
-
-
-state 11
-
- value -> date_value . (rule 3)
-
- $default reduce using rule 3 (value)
-
-
-
-state 12
-
- value -> datetime_value . (rule 4)
-
- $default reduce using rule 4 (value)
-
-
-
-state 13
-
- duration_value -> dur_prefix . 'P' dur_date (rule 34)
- duration_value -> dur_prefix . 'P' dur_time (rule 35)
- duration_value -> dur_prefix . 'P' dur_week (rule 36)
-
- 'P' shift, and go to state 22
-
-
-
-state 14
-
- value -> duration_value . (rule 5)
-
- $default reduce using rule 5 (value)
-
-
-
-state 15
-
- value -> period_value . (rule 6)
-
- $default reduce using rule 6 (value)
-
-
-
-state 16
-
- recur_value -> recur_start . recur_skip_list (rule 80)
-
- $default reduce using rule 78 (recur_skip_list)
-
- recur_skip_list go to state 23
-
-
-
-state 17
-
- value -> recur_value . (rule 7)
-
- $default reduce using rule 7 (value)
-
-
-
-state 18
-
- utcoffset_value -> plusminus . INTNUMBER INTNUMBER (rule 83)
- utcoffset_value -> plusminus . INTNUMBER INTNUMBER INTNUMBER (rule 84)
-
- INTNUMBER shift, and go to state 24
-
-
-
-state 19
-
- value -> utcoffset_value . (rule 8)
-
- $default reduce using rule 8 (value)
-
-
-
-state 20
-
- datetime_value -> DIGITS TIME_CHAR . DIGITS utc_char (rule 18)
- period_value -> DIGITS TIME_CHAR . DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b (rule 37)
- period_value -> DIGITS TIME_CHAR . DIGITS utc_char '/' duration_value (rule 38)
-
- DIGITS shift, and go to state 25
-
-
-
-state 21
-
- recur_start -> FREQ EQUALS . SECONDLY (rule 39)
- recur_start -> FREQ EQUALS . MINUTELY (rule 40)
- recur_start -> FREQ EQUALS . HOURLY (rule 41)
- recur_start -> FREQ EQUALS . DAILY (rule 42)
- recur_start -> FREQ EQUALS . WEEKLY (rule 43)
- recur_start -> FREQ EQUALS . MONTHLY (rule 44)
- recur_start -> FREQ EQUALS . YEARLY (rule 45)
-
- DAILY shift, and go to state 26
- MINUTELY shift, and go to state 27
- MONTHLY shift, and go to state 28
- SECONDLY shift, and go to state 29
- WEEKLY shift, and go to state 30
- HOURLY shift, and go to state 31
- YEARLY shift, and go to state 32
-
-
-
-state 22
-
- duration_value -> dur_prefix 'P' . dur_date (rule 34)
- duration_value -> dur_prefix 'P' . dur_time (rule 35)
- duration_value -> dur_prefix 'P' . dur_week (rule 36)
-
- DIGITS shift, and go to state 33
- TIME_CHAR shift, and go to state 34
-
- dur_date go to state 35
- dur_week go to state 36
- dur_time go to state 37
- dur_day go to state 38
-
-
-
-state 23
-
- recur_skip_list -> recur_skip_list . SEMICOLON recur_skip (rule 79)
- recur_value -> recur_start recur_skip_list . (rule 80)
-
- SEMICOLON shift, and go to state 39
-
- $default reduce using rule 80 (recur_value)
-
-
-
-state 24
-
- utcoffset_value -> plusminus INTNUMBER . INTNUMBER (rule 83)
- utcoffset_value -> plusminus INTNUMBER . INTNUMBER INTNUMBER (rule 84)
-
- INTNUMBER shift, and go to state 40
-
-
-
-state 25
-
- datetime_value -> DIGITS TIME_CHAR DIGITS . utc_char (rule 18)
- period_value -> DIGITS TIME_CHAR DIGITS . utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b (rule 37)
- period_value -> DIGITS TIME_CHAR DIGITS . utc_char '/' duration_value (rule 38)
-
- UTC_CHAR shift, and go to state 41
-
- $default reduce using rule 14 (utc_char)
-
- utc_char go to state 42
-
-
-
-state 26
-
- recur_start -> FREQ EQUALS DAILY . (rule 42)
-
- $default reduce using rule 42 (recur_start)
-
-
-
-state 27
-
- recur_start -> FREQ EQUALS MINUTELY . (rule 40)
-
- $default reduce using rule 40 (recur_start)
-
-
-
-state 28
-
- recur_start -> FREQ EQUALS MONTHLY . (rule 44)
-
- $default reduce using rule 44 (recur_start)
-
-
-
-state 29
-
- recur_start -> FREQ EQUALS SECONDLY . (rule 39)
-
- $default reduce using rule 39 (recur_start)
-
-
-
-state 30
-
- recur_start -> FREQ EQUALS WEEKLY . (rule 43)
-
- $default reduce using rule 43 (recur_start)
-
-
-
-state 31
-
- recur_start -> FREQ EQUALS HOURLY . (rule 41)
-
- $default reduce using rule 41 (recur_start)
-
-
-
-state 32
-
- recur_start -> FREQ EQUALS YEARLY . (rule 45)
-
- $default reduce using rule 45 (recur_start)
-
-
-
-state 33
-
- dur_week -> DIGITS . 'W' (rule 21)
- dur_day -> DIGITS . 'D' (rule 30)
-
- 'W' shift, and go to state 43
- 'D' shift, and go to state 44
-
-
-
-state 34
-
- dur_time -> TIME_CHAR . dur_hour (rule 22)
- dur_time -> TIME_CHAR . dur_minute (rule 23)
- dur_time -> TIME_CHAR . dur_second (rule 24)
-
- DIGITS shift, and go to state 45
-
- dur_hour go to state 46
- dur_minute go to state 47
- dur_second go to state 48
-
-
-
-state 35
-
- duration_value -> dur_prefix 'P' dur_date . (rule 34)
-
- $default reduce using rule 34 (duration_value)
-
-
-
-state 36
-
- duration_value -> dur_prefix 'P' dur_week . (rule 36)
-
- $default reduce using rule 36 (duration_value)
-
-
-
-state 37
-
- duration_value -> dur_prefix 'P' dur_time . (rule 35)
-
- $default reduce using rule 35 (duration_value)
-
-
-
-state 38
-
- dur_date -> dur_day . (rule 19)
- dur_date -> dur_day . dur_time (rule 20)
-
- TIME_CHAR shift, and go to state 34
-
- $default reduce using rule 19 (dur_date)
-
- dur_time go to state 49
-
-
-
-state 39
-
- recur_skip_list -> recur_skip_list SEMICOLON . recur_skip (rule 79)
-
- BYDAY shift, and go to state 50
- BYHOUR shift, and go to state 51
- BYMINUTE shift, and go to state 52
- BYMONTH shift, and go to state 53
- BYMONTHDAY shift, and go to state 54
- BYSECOND shift, and go to state 55
- BYSETPOS shift, and go to state 56
- BYWEEKNO shift, and go to state 57
- BYYEARDAY shift, and go to state 58
- INTERVAL shift, and go to state 59
- COUNT shift, and go to state 60
- UNTIL shift, and go to state 61
- WKST shift, and go to state 62
-
- recur_skip go to state 63
-
-
-
-state 40
-
- utcoffset_value -> plusminus INTNUMBER INTNUMBER . (rule 83)
- utcoffset_value -> plusminus INTNUMBER INTNUMBER . INTNUMBER (rule 84)
-
- INTNUMBER shift, and go to state 64
-
- $default reduce using rule 83 (utcoffset_value)
-
-
-
-state 41
-
- utc_char -> UTC_CHAR . (rule 15)
-
- $default reduce using rule 15 (utc_char)
-
-
-
-state 42
-
- datetime_value -> DIGITS TIME_CHAR DIGITS utc_char . (rule 18)
- period_value -> DIGITS TIME_CHAR DIGITS utc_char . '/' DIGITS TIME_CHAR DIGITS utc_char_b (rule 37)
- period_value -> DIGITS TIME_CHAR DIGITS utc_char . '/' duration_value (rule 38)
-
- '/' shift, and go to state 65
-
- $default reduce using rule 18 (datetime_value)
-
-
-
-state 43
-
- dur_week -> DIGITS 'W' . (rule 21)
-
- $default reduce using rule 21 (dur_week)
-
-
-
-state 44
-
- dur_day -> DIGITS 'D' . (rule 30)
-
- $default reduce using rule 30 (dur_day)
-
-
-
-state 45
-
- dur_hour -> DIGITS . 'H' (rule 25)
- dur_hour -> DIGITS . 'H' dur_minute (rule 26)
- dur_minute -> DIGITS . 'M' (rule 27)
- dur_minute -> DIGITS . 'M' dur_second (rule 28)
- dur_second -> DIGITS . 'S' (rule 29)
-
- 'H' shift, and go to state 66
- 'M' shift, and go to state 67
- 'S' shift, and go to state 68
-
-
-
-state 46
-
- dur_time -> TIME_CHAR dur_hour . (rule 22)
-
- $default reduce using rule 22 (dur_time)
-
-
-
-state 47
-
- dur_time -> TIME_CHAR dur_minute . (rule 23)
-
- $default reduce using rule 23 (dur_time)
-
-
-
-state 48
-
- dur_time -> TIME_CHAR dur_second . (rule 24)
-
- $default reduce using rule 24 (dur_time)
-
-
-
-state 49
-
- dur_date -> dur_day dur_time . (rule 20)
-
- $default reduce using rule 20 (dur_date)
-
-
-
-state 50
-
- recur_skip -> BYDAY . EQUALS weekday_list (rule 69)
-
- EQUALS shift, and go to state 69
-
-
-
-state 51
-
- recur_skip -> BYHOUR . EQUALS recur_list (rule 68)
-
- EQUALS shift, and go to state 70
-
-
-
-state 52
-
- recur_skip -> BYMINUTE . EQUALS recur_list (rule 67)
-
- EQUALS shift, and go to state 71
-
-
-
-state 53
-
- recur_skip -> BYMONTH . EQUALS recur_list (rule 70)
-
- EQUALS shift, and go to state 72
-
-
-
-state 54
-
- recur_skip -> BYMONTHDAY . EQUALS recur_list (rule 71)
-
- EQUALS shift, and go to state 73
-
-
-
-state 55
-
- recur_skip -> BYSECOND . EQUALS recur_list (rule 66)
-
- EQUALS shift, and go to state 74
-
-
-
-state 56
-
- recur_skip -> BYSETPOS . EQUALS recur_list (rule 74)
-
- EQUALS shift, and go to state 75
-
-
-
-state 57
-
- recur_skip -> BYWEEKNO . EQUALS recur_list (rule 73)
-
- EQUALS shift, and go to state 76
-
-
-
-state 58
-
- recur_skip -> BYYEARDAY . EQUALS recur_list (rule 72)
-
- EQUALS shift, and go to state 77
-
-
-
-state 59
-
- recur_skip -> INTERVAL . EQUALS DIGITS (rule 58)
-
- EQUALS shift, and go to state 78
-
-
-
-state 60
-
- recur_skip -> COUNT . EQUALS DIGITS (rule 77)
-
- EQUALS shift, and go to state 79
-
-
-
-state 61
-
- recur_skip -> UNTIL . EQUALS datetime_value (rule 75)
- recur_skip -> UNTIL . EQUALS date_value (rule 76)
-
- EQUALS shift, and go to state 80
-
-
-
-state 62
-
- recur_skip -> WKST . EQUALS SU (rule 59)
- recur_skip -> WKST . EQUALS MO (rule 60)
- recur_skip -> WKST . EQUALS TU (rule 61)
- recur_skip -> WKST . EQUALS WE (rule 62)
- recur_skip -> WKST . EQUALS TH (rule 63)
- recur_skip -> WKST . EQUALS FR (rule 64)
- recur_skip -> WKST . EQUALS SA (rule 65)
-
- EQUALS shift, and go to state 81
-
-
-
-state 63
-
- recur_skip_list -> recur_skip_list SEMICOLON recur_skip . (rule 79)
-
- $default reduce using rule 79 (recur_skip_list)
-
-
-
-state 64
-
- utcoffset_value -> plusminus INTNUMBER INTNUMBER INTNUMBER . (rule 84)
-
- $default reduce using rule 84 (utcoffset_value)
-
-
-
-state 65
-
- period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' . DIGITS TIME_CHAR DIGITS utc_char_b (rule 37)
- period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' . duration_value (rule 38)
-
- DIGITS shift, and go to state 82
- '+' shift, and go to state 83
- '-' shift, and go to state 84
-
- $default reduce using rule 31 (dur_prefix)
-
- dur_prefix go to state 13
- duration_value go to state 85
-
-
-
-state 66
-
- dur_hour -> DIGITS 'H' . (rule 25)
- dur_hour -> DIGITS 'H' . dur_minute (rule 26)
-
- DIGITS shift, and go to state 86
-
- $default reduce using rule 25 (dur_hour)
-
- dur_minute go to state 87
-
-
-
-state 67
-
- dur_minute -> DIGITS 'M' . (rule 27)
- dur_minute -> DIGITS 'M' . dur_second (rule 28)
-
- DIGITS shift, and go to state 88
-
- $default reduce using rule 27 (dur_minute)
-
- dur_second go to state 89
-
-
-
-state 68
-
- dur_second -> DIGITS 'S' . (rule 29)
-
- $default reduce using rule 29 (dur_second)
-
-
-
-state 69
-
- recur_skip -> BYDAY EQUALS . weekday_list (rule 69)
-
- DIGITS shift, and go to state 90
- MO shift, and go to state 91
- SA shift, and go to state 92
- SU shift, and go to state 93
- TU shift, and go to state 94
- WE shift, and go to state 95
- TH shift, and go to state 96
- FR shift, and go to state 97
-
- weekday go to state 98
- weekday_list go to state 99
-
-
-
-state 70
-
- recur_skip -> BYHOUR EQUALS . recur_list (rule 68)
-
- DIGITS shift, and go to state 100
-
- recur_list go to state 101
-
-
-
-state 71
-
- recur_skip -> BYMINUTE EQUALS . recur_list (rule 67)
-
- DIGITS shift, and go to state 100
-
- recur_list go to state 102
-
-
-
-state 72
-
- recur_skip -> BYMONTH EQUALS . recur_list (rule 70)
-
- DIGITS shift, and go to state 100
-
- recur_list go to state 103
-
-
-
-state 73
-
- recur_skip -> BYMONTHDAY EQUALS . recur_list (rule 71)
-
- DIGITS shift, and go to state 100
-
- recur_list go to state 104
-
-
-
-state 74
-
- recur_skip -> BYSECOND EQUALS . recur_list (rule 66)
-
- DIGITS shift, and go to state 100
-
- recur_list go to state 105
-
-
-
-state 75
-
- recur_skip -> BYSETPOS EQUALS . recur_list (rule 74)
-
- DIGITS shift, and go to state 100
-
- recur_list go to state 106
-
-
-
-state 76
-
- recur_skip -> BYWEEKNO EQUALS . recur_list (rule 73)
-
- DIGITS shift, and go to state 100
-
- recur_list go to state 107
-
-
-
-state 77
-
- recur_skip -> BYYEARDAY EQUALS . recur_list (rule 72)
-
- DIGITS shift, and go to state 100
-
- recur_list go to state 108
-
-
-
-state 78
-
- recur_skip -> INTERVAL EQUALS . DIGITS (rule 58)
-
- DIGITS shift, and go to state 109
-
-
-
-state 79
-
- recur_skip -> COUNT EQUALS . DIGITS (rule 77)
-
- DIGITS shift, and go to state 110
-
-
-
-state 80
-
- recur_skip -> UNTIL EQUALS . datetime_value (rule 75)
- recur_skip -> UNTIL EQUALS . date_value (rule 76)
-
- DIGITS shift, and go to state 111
-
- date_value go to state 112
- datetime_value go to state 113
-
-
-
-state 81
-
- recur_skip -> WKST EQUALS . SU (rule 59)
- recur_skip -> WKST EQUALS . MO (rule 60)
- recur_skip -> WKST EQUALS . TU (rule 61)
- recur_skip -> WKST EQUALS . WE (rule 62)
- recur_skip -> WKST EQUALS . TH (rule 63)
- recur_skip -> WKST EQUALS . FR (rule 64)
- recur_skip -> WKST EQUALS . SA (rule 65)
-
- MO shift, and go to state 114
- SA shift, and go to state 115
- SU shift, and go to state 116
- TU shift, and go to state 117
- WE shift, and go to state 118
- TH shift, and go to state 119
- FR shift, and go to state 120
-
-
-
-state 82
-
- period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS . TIME_CHAR DIGITS utc_char_b (rule 37)
-
- TIME_CHAR shift, and go to state 121
-
-
-
-state 83
-
- dur_prefix -> '+' . (rule 32)
-
- $default reduce using rule 32 (dur_prefix)
-
-
-
-state 84
-
- dur_prefix -> '-' . (rule 33)
-
- $default reduce using rule 33 (dur_prefix)
-
-
-
-state 85
-
- period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' duration_value . (rule 38)
-
- $default reduce using rule 38 (period_value)
-
-
-
-state 86
-
- dur_minute -> DIGITS . 'M' (rule 27)
- dur_minute -> DIGITS . 'M' dur_second (rule 28)
-
- 'M' shift, and go to state 67
-
-
-
-state 87
-
- dur_hour -> DIGITS 'H' dur_minute . (rule 26)
-
- $default reduce using rule 26 (dur_hour)
-
-
-
-state 88
-
- dur_second -> DIGITS . 'S' (rule 29)
-
- 'S' shift, and go to state 68
-
-
-
-state 89
-
- dur_minute -> DIGITS 'M' dur_second . (rule 28)
-
- $default reduce using rule 28 (dur_minute)
-
-
-
-state 90
-
- weekday_list -> DIGITS . weekday (rule 54)
-
- MO shift, and go to state 91
- SA shift, and go to state 92
- SU shift, and go to state 93
- TU shift, and go to state 94
- WE shift, and go to state 95
- TH shift, and go to state 96
- FR shift, and go to state 97
-
- weekday go to state 122
-
-
-
-state 91
-
- weekday -> MO . (rule 47)
-
- $default reduce using rule 47 (weekday)
-
-
-
-state 92
-
- weekday -> SA . (rule 52)
-
- $default reduce using rule 52 (weekday)
-
-
-
-state 93
-
- weekday -> SU . (rule 46)
-
- $default reduce using rule 46 (weekday)
-
-
-
-state 94
-
- weekday -> TU . (rule 48)
-
- $default reduce using rule 48 (weekday)
-
-
-
-state 95
-
- weekday -> WE . (rule 49)
-
- $default reduce using rule 49 (weekday)
-
-
-
-state 96
-
- weekday -> TH . (rule 50)
-
- $default reduce using rule 50 (weekday)
-
-
-
-state 97
-
- weekday -> FR . (rule 51)
-
- $default reduce using rule 51 (weekday)
-
-
-
-state 98
-
- weekday_list -> weekday . (rule 53)
-
- $default reduce using rule 53 (weekday_list)
-
-
-
-state 99
-
- weekday_list -> weekday_list . COMMA weekday (rule 55)
- recur_skip -> BYDAY EQUALS weekday_list . (rule 69)
-
- COMMA shift, and go to state 123
-
- $default reduce using rule 69 (recur_skip)
-
-
-
-state 100
-
- recur_list -> DIGITS . (rule 56)
-
- $default reduce using rule 56 (recur_list)
-
-
-
-state 101
-
- recur_list -> recur_list . COMMA DIGITS (rule 57)
- recur_skip -> BYHOUR EQUALS recur_list . (rule 68)
-
- COMMA shift, and go to state 124
-
- $default reduce using rule 68 (recur_skip)
-
-
-
-state 102
-
- recur_list -> recur_list . COMMA DIGITS (rule 57)
- recur_skip -> BYMINUTE EQUALS recur_list . (rule 67)
-
- COMMA shift, and go to state 124
-
- $default reduce using rule 67 (recur_skip)
-
-
-
-state 103
-
- recur_list -> recur_list . COMMA DIGITS (rule 57)
- recur_skip -> BYMONTH EQUALS recur_list . (rule 70)
-
- COMMA shift, and go to state 124
-
- $default reduce using rule 70 (recur_skip)
-
-
-
-state 104
-
- recur_list -> recur_list . COMMA DIGITS (rule 57)
- recur_skip -> BYMONTHDAY EQUALS recur_list . (rule 71)
-
- COMMA shift, and go to state 124
-
- $default reduce using rule 71 (recur_skip)
-
-
-
-state 105
-
- recur_list -> recur_list . COMMA DIGITS (rule 57)
- recur_skip -> BYSECOND EQUALS recur_list . (rule 66)
-
- COMMA shift, and go to state 124
-
- $default reduce using rule 66 (recur_skip)
-
-
-
-state 106
-
- recur_list -> recur_list . COMMA DIGITS (rule 57)
- recur_skip -> BYSETPOS EQUALS recur_list . (rule 74)
-
- COMMA shift, and go to state 124
-
- $default reduce using rule 74 (recur_skip)
-
-
-
-state 107
-
- recur_list -> recur_list . COMMA DIGITS (rule 57)
- recur_skip -> BYWEEKNO EQUALS recur_list . (rule 73)
-
- COMMA shift, and go to state 124
-
- $default reduce using rule 73 (recur_skip)
-
-
-
-state 108
-
- recur_list -> recur_list . COMMA DIGITS (rule 57)
- recur_skip -> BYYEARDAY EQUALS recur_list . (rule 72)
-
- COMMA shift, and go to state 124
-
- $default reduce using rule 72 (recur_skip)
-
-
-
-state 109
-
- recur_skip -> INTERVAL EQUALS DIGITS . (rule 58)
-
- $default reduce using rule 58 (recur_skip)
-
-
-
-state 110
-
- recur_skip -> COUNT EQUALS DIGITS . (rule 77)
-
- $default reduce using rule 77 (recur_skip)
-
-
-
-state 111
-
- date_value -> DIGITS . (rule 13)
- datetime_value -> DIGITS . TIME_CHAR DIGITS utc_char (rule 18)
-
- TIME_CHAR shift, and go to state 125
-
- $default reduce using rule 13 (date_value)
-
-
-
-state 112
-
- recur_skip -> UNTIL EQUALS date_value . (rule 76)
-
- $default reduce using rule 76 (recur_skip)
-
-
-
-state 113
-
- recur_skip -> UNTIL EQUALS datetime_value . (rule 75)
-
- $default reduce using rule 75 (recur_skip)
-
-
-
-state 114
-
- recur_skip -> WKST EQUALS MO . (rule 60)
-
- $default reduce using rule 60 (recur_skip)
-
-
-
-state 115
-
- recur_skip -> WKST EQUALS SA . (rule 65)
-
- $default reduce using rule 65 (recur_skip)
-
-
-
-state 116
-
- recur_skip -> WKST EQUALS SU . (rule 59)
-
- $default reduce using rule 59 (recur_skip)
-
-
-
-state 117
-
- recur_skip -> WKST EQUALS TU . (rule 61)
-
- $default reduce using rule 61 (recur_skip)
-
-
-
-state 118
-
- recur_skip -> WKST EQUALS WE . (rule 62)
-
- $default reduce using rule 62 (recur_skip)
-
-
-
-state 119
-
- recur_skip -> WKST EQUALS TH . (rule 63)
-
- $default reduce using rule 63 (recur_skip)
-
-
-
-state 120
-
- recur_skip -> WKST EQUALS FR . (rule 64)
-
- $default reduce using rule 64 (recur_skip)
-
-
-
-state 121
-
- period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR . DIGITS utc_char_b (rule 37)
-
- DIGITS shift, and go to state 126
-
-
-
-state 122
-
- weekday_list -> DIGITS weekday . (rule 54)
-
- $default reduce using rule 54 (weekday_list)
-
-
-
-state 123
-
- weekday_list -> weekday_list COMMA . weekday (rule 55)
-
- MO shift, and go to state 91
- SA shift, and go to state 92
- SU shift, and go to state 93
- TU shift, and go to state 94
- WE shift, and go to state 95
- TH shift, and go to state 96
- FR shift, and go to state 97
-
- weekday go to state 127
-
-
-
-state 124
-
- recur_list -> recur_list COMMA . DIGITS (rule 57)
-
- DIGITS shift, and go to state 128
-
-
-
-state 125
-
- datetime_value -> DIGITS TIME_CHAR . DIGITS utc_char (rule 18)
-
- DIGITS shift, and go to state 129
-
-
-
-state 126
-
- period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS . utc_char_b (rule 37)
-
- UTC_CHAR shift, and go to state 130
-
- $default reduce using rule 16 (utc_char_b)
-
- utc_char_b go to state 131
-
-
-
-state 127
-
- weekday_list -> weekday_list COMMA weekday . (rule 55)
-
- $default reduce using rule 55 (weekday_list)
-
-
-
-state 128
-
- recur_list -> recur_list COMMA DIGITS . (rule 57)
-
- $default reduce using rule 57 (recur_list)
-
-
-
-state 129
-
- datetime_value -> DIGITS TIME_CHAR DIGITS . utc_char (rule 18)
-
- UTC_CHAR shift, and go to state 41
-
- $default reduce using rule 14 (utc_char)
-
- utc_char go to state 132
-
-
-
-state 130
-
- utc_char_b -> UTC_CHAR . (rule 17)
-
- $default reduce using rule 17 (utc_char_b)
-
-
-
-state 131
-
- period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b . (rule 37)
-
- $default reduce using rule 37 (period_value)
-
-
-
-state 132
-
- datetime_value -> DIGITS TIME_CHAR DIGITS utc_char . (rule 18)
-
- $default reduce using rule 18 (datetime_value)
-
-
-
-state 133
-
- $ go to state 134
-
-
-
-state 134
-
- $ go to state 135
-
-
-
-state 135
-
- $default accept
diff --git a/libical/src/libical/icalitip.tab.c b/libical/src/libical/icalitip.tab.c
deleted file mode 100644
index 82536647e3..0000000000
--- a/libical/src/libical/icalitip.tab.c
+++ /dev/null
@@ -1,1663 +0,0 @@
-
-/* A Bison parser, made from icalitip.y
- by GNU Bison version 1.28 */
-
-#define YYBISON 1 /* Identify Bison output. */
-
-#define yyparse icalparser_yyparse
-#define yylex icalparser_yylex
-#define yyerror icalparser_yyerror
-#define yylval icalparser_yylval
-#define yychar icalparser_yychar
-#define yydebug icalparser_yydebug
-#define yynerrs icalparser_yynerrs
-#define DIGITS 257
-#define INTNUMBER 258
-#define FLOATNUMBER 259
-#define STRING 260
-#define EOL 261
-#define EQUALS 262
-#define CHARACTER 263
-#define COLON 264
-#define COMMA 265
-#define SEMICOLON 266
-#define TIMESEPERATOR 267
-#define TRUE 268
-#define FALSE 269
-#define FREQ 270
-#define BYDAY 271
-#define BYHOUR 272
-#define BYMINUTE 273
-#define BYMONTH 274
-#define BYMONTHDAY 275
-#define BYSECOND 276
-#define BYSETPOS 277
-#define BYWEEKNO 278
-#define BYYEARDAY 279
-#define DAILY 280
-#define MINUTELY 281
-#define MONTHLY 282
-#define SECONDLY 283
-#define WEEKLY 284
-#define HOURLY 285
-#define YEARLY 286
-#define INTERVAL 287
-#define COUNT 288
-#define UNTIL 289
-#define WKST 290
-#define MO 291
-#define SA 292
-#define SU 293
-#define TU 294
-#define WE 295
-#define TH 296
-#define FR 297
-#define BIT8 298
-#define ACCEPTED 299
-#define ADD 300
-#define AUDIO 301
-#define BASE64 302
-#define BINARY 303
-#define BOOLEAN 304
-#define BUSY 305
-#define BUSYTENTATIVE 306
-#define BUSYUNAVAILABLE 307
-#define CALADDRESS 308
-#define CANCEL 309
-#define CANCELLED 310
-#define CHAIR 311
-#define CHILD 312
-#define COMPLETED 313
-#define CONFIDENTIAL 314
-#define CONFIRMED 315
-#define COUNTER 316
-#define DATE 317
-#define DATETIME 318
-#define DECLINECOUNTER 319
-#define DECLINED 320
-#define DELEGATED 321
-#define DISPLAY 322
-#define DRAFT 323
-#define DURATION 324
-#define EMAIL 325
-#define END 326
-#define FINAL 327
-#define FLOAT 328
-#define FREE 329
-#define GREGORIAN 330
-#define GROUP 331
-#define INDIVIDUAL 332
-#define INPROCESS 333
-#define INTEGER 334
-#define NEEDSACTION 335
-#define NONPARTICIPANT 336
-#define OPAQUE 337
-#define OPTPARTICIPANT 338
-#define PARENT 339
-#define PERIOD 340
-#define PRIVATE 341
-#define PROCEDURE 342
-#define PUBLIC 343
-#define PUBLISH 344
-#define RECUR 345
-#define REFRESH 346
-#define REPLY 347
-#define REQPARTICIPANT 348
-#define REQUEST 349
-#define RESOURCE 350
-#define ROOM 351
-#define SIBLING 352
-#define START 353
-#define TENTATIVE 354
-#define TEXT 355
-#define THISANDFUTURE 356
-#define THISANDPRIOR 357
-#define TIME 358
-#define TRANSPAENT 359
-#define UNKNOWN 360
-#define UTCOFFSET 361
-#define XNAME 362
-#define ALTREP 363
-#define CN 364
-#define CUTYPE 365
-#define DAYLIGHT 366
-#define DIR 367
-#define ENCODING 368
-#define EVENT 369
-#define FBTYPE 370
-#define FMTTYPE 371
-#define LANGUAGE 372
-#define MEMBER 373
-#define PARTSTAT 374
-#define RANGE 375
-#define RELATED 376
-#define RELTYPE 377
-#define ROLE 378
-#define RSVP 379
-#define SENTBY 380
-#define STANDARD 381
-#define URI 382
-#define TIME_CHAR 383
-#define UTC_CHAR 384
-
-#line 1 "icalitip.y"
-
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalitip.y
- CREATOR: eric 10 June 1999
-
- DESCRIPTION:
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalitip.y
-
-
-
- ================================b======================================*/
-
-#include <stdlib.h>
-#include <string.h> /* for strdup() */
-#include <limits.h> /* for SHRT_MAX*/
-#include "icalparser.h"
-#include "ical.h"
-#include "pvl.h"
-
-#define YYERROR_VERBOSE
-#define YYDEBUG 1
-
-icalvalue *icalparser_yy_value; /* Current Value */
-
-/* Globals for UTCOFFSET values */
-int utc;
-int utc_b;
-int utcsign;
-
-/* Globals for DURATION values */
-struct icaldurationtype duration;
-
-/* Globals for RECUR values */
-struct icalrecurrencetype recur;
-short skiplist[367];
-short skippos;
-
-void copy_list(short* array, size_t size);
-void clear_recur();
-void add_prop(icalproperty_kind);
-void icalparser_fill_date(struct tm* t, char* dstr);
-void icalparser_fill_time(struct tm* t, char* tstr);
-void set_value_type(icalvalue_kind kind);
-void yyerror(char *s); /* Don't know why I need this.... */
-int yylex(void); /* Or this. */
-void set_parser_value_state();
-struct icaltimetype fill_datetime(char* d, char* t);
-
-
-
-/* Set the state of the lexer so it will interpret values ( iCAL
- VALUEs, that is, ) correctly. */
-
-
-#line 75 "icalitip.y"
-typedef union {
- float v_float;
- int v_int;
- char* v_string;
-
-} YYSTYPE;
-#include <stdio.h>
-
-#ifndef __cplusplus
-#ifndef __STDC__
-#define const
-#endif
-#endif
-
-
-
-#define YYFINAL 135
-#define YYFLAG -32768
-#define YYNTBASE 141
-
-#define YYTRANSLATE(x) ((unsigned)(x) <= 385 ? yytranslate[x] : 167)
-
-static const short yytranslate[] = { 0,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 137, 2, 138, 2, 140, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 136, 2, 2,
- 2, 133, 2, 2, 2, 2, 134, 2, 2, 139,
- 2, 2, 135, 2, 2, 2, 132, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, 23, 24, 25, 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, 52, 53, 54, 55, 56,
- 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
- 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
- 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
- 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
- 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
- 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
- 127, 128, 129, 130, 131
-};
-
-#if YYDEBUG != 0
-static const short yyprhs[] = { 0,
- 0, 2, 4, 6, 8, 10, 12, 14, 16, 18,
- 20, 22, 24, 26, 27, 29, 30, 32, 37, 39,
- 42, 45, 48, 51, 54, 57, 61, 64, 68, 71,
- 74, 75, 77, 79, 83, 87, 91, 101, 108, 112,
- 116, 120, 124, 128, 132, 136, 138, 140, 142, 144,
- 146, 148, 150, 152, 155, 159, 161, 165, 169, 173,
- 177, 181, 185, 189, 193, 197, 201, 205, 209, 213,
- 217, 221, 225, 229, 233, 237, 241, 245, 246, 250,
- 253, 255, 257, 261
-};
-
-static const short yyrhs[] = { 142,
- 0, 143, 0, 144, 0, 147, 0, 156, 0, 157,
- 0, 164, 0, 166, 0, 1, 0, 131, 0, 14,
- 0, 15, 0, 3, 0, 0, 130, 0, 0, 130,
- 0, 3, 129, 3, 145, 0, 154, 0, 154, 150,
- 0, 3, 132, 0, 129, 151, 0, 129, 152, 0,
- 129, 153, 0, 3, 133, 0, 3, 133, 152, 0,
- 3, 134, 0, 3, 134, 153, 0, 3, 135, 0,
- 3, 136, 0, 0, 137, 0, 138, 0, 155, 139,
- 148, 0, 155, 139, 150, 0, 155, 139, 149, 0,
- 3, 129, 3, 145, 140, 3, 129, 3, 146, 0,
- 3, 129, 3, 145, 140, 156, 0, 16, 8, 29,
- 0, 16, 8, 27, 0, 16, 8, 31, 0, 16,
- 8, 26, 0, 16, 8, 30, 0, 16, 8, 28,
- 0, 16, 8, 32, 0, 39, 0, 37, 0, 40,
- 0, 41, 0, 42, 0, 43, 0, 38, 0, 159,
- 0, 3, 159, 0, 160, 11, 159, 0, 3, 0,
- 161, 11, 3, 0, 33, 8, 3, 0, 36, 8,
- 39, 0, 36, 8, 37, 0, 36, 8, 40, 0,
- 36, 8, 41, 0, 36, 8, 42, 0, 36, 8,
- 43, 0, 36, 8, 38, 0, 22, 8, 161, 0,
- 19, 8, 161, 0, 18, 8, 161, 0, 17, 8,
- 160, 0, 20, 8, 161, 0, 21, 8, 161, 0,
- 25, 8, 161, 0, 24, 8, 161, 0, 23, 8,
- 161, 0, 35, 8, 147, 0, 35, 8, 144, 0,
- 34, 8, 3, 0, 0, 163, 12, 162, 0, 158,
- 163, 0, 137, 0, 138, 0, 165, 4, 4, 0,
- 165, 4, 4, 4, 0
-};
-
-#endif
-
-#if YYDEBUG != 0
-static const short yyrline[] = { 0,
- 112, 114, 115, 116, 117, 118, 119, 120, 121, 127,
- 129, 132, 135, 150, 152, 155, 157, 159, 175, 176,
- 178, 183, 186, 189, 193, 197, 202, 206, 211, 216,
- 221, 224, 227, 231, 236, 241, 250, 271, 303, 305,
- 306, 307, 308, 309, 310, 314, 316, 317, 318, 319,
- 320, 321, 325, 327, 328, 331, 333, 336, 338, 339,
- 340, 341, 342, 343, 344, 345, 346, 347, 348, 349,
- 350, 351, 352, 353, 354, 357, 360, 364, 366, 368,
- 376, 377, 379, 385
-};
-#endif
-
-
-#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
-
-static const char * const yytname[] = { "$","error","$undefined.","DIGITS",
-"INTNUMBER","FLOATNUMBER","STRING","EOL","EQUALS","CHARACTER","COLON","COMMA",
-"SEMICOLON","TIMESEPERATOR","TRUE","FALSE","FREQ","BYDAY","BYHOUR","BYMINUTE",
-"BYMONTH","BYMONTHDAY","BYSECOND","BYSETPOS","BYWEEKNO","BYYEARDAY","DAILY",
-"MINUTELY","MONTHLY","SECONDLY","WEEKLY","HOURLY","YEARLY","INTERVAL","COUNT",
-"UNTIL","WKST","MO","SA","SU","TU","WE","TH","FR","BIT8","ACCEPTED","ADD","AUDIO",
-"BASE64","BINARY","BOOLEAN","BUSY","BUSYTENTATIVE","BUSYUNAVAILABLE","CALADDRESS",
-"CANCEL","CANCELLED","CHAIR","CHILD","COMPLETED","CONFIDENTIAL","CONFIRMED",
-"COUNTER","DATE","DATETIME","DECLINECOUNTER","DECLINED","DELEGATED","DISPLAY",
-"DRAFT","DURATION","EMAIL","END","FINAL","FLOAT","FREE","GREGORIAN","GROUP",
-"INDIVIDUAL","INPROCESS","INTEGER","NEEDSACTION","NONPARTICIPANT","OPAQUE","OPTPARTICIPANT",
-"PARENT","PERIOD","PRIVATE","PROCEDURE","PUBLIC","PUBLISH","RECUR","REFRESH",
-"REPLY","REQPARTICIPANT","REQUEST","RESOURCE","ROOM","SIBLING","START","TENTATIVE",
-"TEXT","THISANDFUTURE","THISANDPRIOR","TIME","TRANSPAENT","UNKNOWN","UTCOFFSET",
-"XNAME","ALTREP","CN","CUTYPE","DAYLIGHT","DIR","ENCODING","EVENT","FBTYPE",
-"FMTTYPE","LANGUAGE","MEMBER","PARTSTAT","RANGE","RELATED","RELTYPE","ROLE",
-"RSVP","SENTBY","STANDARD","URI","TIME_CHAR","UTC_CHAR","\"unimplemented2\"",
-"'W'","'H'","'M'","'S'","'D'","'+'","'-'","'P'","'/'","value","binary_value",
-"boolean_value","date_value","utc_char","utc_char_b","datetime_value","dur_date",
-"dur_week","dur_time","dur_hour","dur_minute","dur_second","dur_day","dur_prefix",
-"duration_value","period_value","recur_start","weekday","weekday_list","recur_list",
-"recur_skip","recur_skip_list","recur_value","plusminus","utcoffset_value", NULL
-};
-#endif
-
-static const short yyr1[] = { 0,
- 141, 141, 141, 141, 141, 141, 141, 141, 141, 142,
- 143, 143, 144, 145, 145, 146, 146, 147, 148, 148,
- 149, 150, 150, 150, 151, 151, 152, 152, 153, 154,
- 155, 155, 155, 156, 156, 156, 157, 157, 158, 158,
- 158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
- 159, 159, 160, 160, 160, 161, 161, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 163, 163, 164,
- 165, 165, 166, 166
-};
-
-static const short yyr2[] = { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 0, 1, 0, 1, 4, 1, 2,
- 2, 2, 2, 2, 2, 3, 2, 3, 2, 2,
- 0, 1, 1, 3, 3, 3, 9, 6, 3, 3,
- 3, 3, 3, 3, 3, 1, 1, 1, 1, 1,
- 1, 1, 1, 2, 3, 1, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 0, 3, 2,
- 1, 1, 3, 4
-};
-
-static const short yydefact[] = { 0,
- 9, 13, 11, 12, 0, 10, 32, 33, 1, 2,
- 3, 4, 0, 5, 6, 78, 7, 0, 8, 0,
- 0, 0, 80, 0, 14, 42, 40, 44, 39, 43,
- 41, 45, 0, 0, 34, 36, 35, 19, 0, 83,
- 15, 18, 21, 30, 0, 22, 23, 24, 20, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 79, 84, 31, 25, 27, 29, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 32, 33, 38, 0, 26, 0, 28, 0,
- 47, 52, 46, 48, 49, 50, 51, 53, 69, 56,
- 68, 67, 70, 71, 66, 74, 73, 72, 58, 77,
- 13, 76, 75, 60, 65, 59, 61, 62, 63, 64,
- 0, 54, 0, 0, 0, 16, 55, 57, 14, 17,
- 37, 18, 0, 0, 0
-};
-
-static const short yydefgoto[] = { 133,
- 9, 10, 11, 42, 131, 12, 35, 36, 37, 46,
- 47, 48, 38, 13, 14, 15, 16, 98, 99, 101,
- 63, 23, 17, 18, 19
-};
-
-static const short yypact[] = { -1,
--32768, -123,-32768,-32768, 1,-32768, 3, 6,-32768,-32768,
--32768,-32768, -127,-32768,-32768,-32768,-32768, 64,-32768, 66,
- -10, -2, 58, 67, -58,-32768,-32768,-32768,-32768,-32768,
--32768,-32768, -128, 70,-32768,-32768,-32768, -55, 28, 71,
--32768, -64,-32768,-32768, -68,-32768,-32768,-32768,-32768, 69,
- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
- 82, 83,-32768,-32768, 2, 89, 90,-32768, 0, 91,
- 91, 91, 91, 91, 91, 91, 91, 92, 93, 94,
- -14, -51,-32768,-32768,-32768, -36,-32768, -56,-32768, -7,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 88,-32768,
- 95, 95, 95, 95, 95, 95, 95, 95,-32768,-32768,
- -29,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
- 98,-32768, -7, 99, 100, -26,-32768,-32768, -58,-32768,
--32768,-32768, 105, 107,-32768
-};
-
-static const short yypgoto[] = {-32768,
--32768,-32768, 29, -21,-32768, 30,-32768,-32768, 84,-32768,
- 45, 46,-32768,-32768, 47,-32768,-32768, -79,-32768, -17,
--32768,-32768,-32768,-32768,-32768
-};
-
-
-#define YYLAST 140
-
-
-static const short yytable[] = { 1,
- 33, 2, 90, 43, 82, 20, -81, 44, 21, -82,
- 122, 22, 3, 4, 5, 26, 27, 28, 29, 30,
- 31, 32, 114, 115, 116, 117, 118, 119, 120, 91,
- 92, 93, 94, 95, 96, 97, 91, 92, 93, 94,
- 95, 96, 97, 127, 50, 51, 52, 53, 54, 55,
- 56, 57, 58, 102, 103, 104, 105, 106, 107, 108,
- 59, 60, 61, 62, 66, 67, 68, 24, 25, 39,
- 40, 41, 45, 34, 64, 65, 69, 121, 68, 70,
- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
- 81, 86, 88, 100, 109, 110, 111, 67, 123, 125,
- 126, 128, 129, 130, 134, 124, 135, 132, 112, 113,
- 87, 85, 89, 0, 0, 0, 0, 0, 0, 0,
- 0, 49, 0, 0, 0, 0, 34, 0, 0, 6,
- 0, 0, 0, 0, 0, 7, 8, -31, 83, 84
-};
-
-static const short yycheck[] = { 1,
- 3, 3, 3, 132, 3, 129, 4, 136, 8, 4,
- 90, 139, 14, 15, 16, 26, 27, 28, 29, 30,
- 31, 32, 37, 38, 39, 40, 41, 42, 43, 37,
- 38, 39, 40, 41, 42, 43, 37, 38, 39, 40,
- 41, 42, 43, 123, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 71, 72, 73, 74, 75, 76, 77,
- 33, 34, 35, 36, 133, 134, 135, 4, 3, 12,
- 4, 130, 3, 129, 4, 140, 8, 129, 135, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 3, 3, 3, 3, 3, 3, 134, 11, 129,
- 3, 3, 3, 130, 0, 11, 0, 129, 80, 80,
- 66, 65, 67, -1, -1, -1, -1, -1, -1, -1,
- -1, 38, -1, -1, -1, -1, 129, -1, -1, 131,
- -1, -1, -1, -1, -1, 137, 138, 139, 137, 138
-};
-/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
-#line 3 "/usr/lib/bison.simple"
-/* This file comes from bison-1.28. */
-
-/* Skeleton output parser for bison,
- Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
-
- 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, 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. */
-
-/* As a special exception, when this file is copied by Bison into a
- Bison output file, you may use that output file without restriction.
- This special exception was added by the Free Software Foundation
- in version 1.24 of Bison. */
-
-/* This is the parser code that is written into each bison parser
- when the %semantic_parser declaration is not specified in the grammar.
- It was written by Richard Stallman by simplifying the hairy parser
- used when %semantic_parser is specified. */
-
-#ifndef YYSTACK_USE_ALLOCA
-#ifdef alloca
-#define YYSTACK_USE_ALLOCA
-#else /* alloca not defined */
-#ifdef __GNUC__
-#define YYSTACK_USE_ALLOCA
-#define alloca __builtin_alloca
-#else /* not GNU C. */
-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
-#define YYSTACK_USE_ALLOCA
-#include <alloca.h>
-#else /* not sparc */
-/* We think this test detects Watcom and Microsoft C. */
-/* This used to test MSDOS, but that is a bad idea
- since that symbol is in the user namespace. */
-#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
-#if 0 /* No need for malloc.h, which pollutes the namespace;
- instead, just don't use alloca. */
-#include <malloc.h>
-#endif
-#else /* not MSDOS, or __TURBOC__ */
-#if defined(_AIX)
-/* I don't know what this was needed for, but it pollutes the namespace.
- So I turned it off. rms, 2 May 1997. */
-/* #include <malloc.h> */
- #pragma alloca
-#define YYSTACK_USE_ALLOCA
-#else /* not MSDOS, or __TURBOC__, or _AIX */
-#if 0
-#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
- and on HPUX 10. Eventually we can turn this on. */
-#define YYSTACK_USE_ALLOCA
-#define alloca __builtin_alloca
-#endif /* __hpux */
-#endif
-#endif /* not _AIX */
-#endif /* not MSDOS, or __TURBOC__ */
-#endif /* not sparc */
-#endif /* not GNU C */
-#endif /* alloca not defined */
-#endif /* YYSTACK_USE_ALLOCA not defined */
-
-#ifdef YYSTACK_USE_ALLOCA
-#define YYSTACK_ALLOC alloca
-#else
-#define YYSTACK_ALLOC malloc
-#endif
-
-/* Note: there must be only one dollar sign in this file.
- It is replaced by the list of actions, each action
- as one case of the switch. */
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY -2
-#define YYEOF 0
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrlab1
-/* Like YYERROR except do call yyerror.
- This remains here temporarily to ease the
- transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-#define YYFAIL goto yyerrlab
-#define YYRECOVERING() (!!yyerrstatus)
-#define YYBACKUP(token, value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { yychar = (token), yylval = (value); \
- yychar1 = YYTRANSLATE (yychar); \
- YYPOPSTACK; \
- goto yybackup; \
- } \
- else \
- { yyerror ("syntax error: cannot back up"); YYERROR; } \
-while (0)
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-#ifndef YYPURE
-#define YYLEX yylex()
-#endif
-
-#ifdef YYPURE
-#ifdef YYLSP_NEEDED
-#ifdef YYLEX_PARAM
-#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
-#else
-#define YYLEX yylex(&yylval, &yylloc)
-#endif
-#else /* not YYLSP_NEEDED */
-#ifdef YYLEX_PARAM
-#define YYLEX yylex(&yylval, YYLEX_PARAM)
-#else
-#define YYLEX yylex(&yylval)
-#endif
-#endif /* not YYLSP_NEEDED */
-#endif
-
-/* If nonreentrant, generate the variables here */
-
-#ifndef YYPURE
-
-int yychar; /* the lookahead symbol */
-YYSTYPE yylval; /* the semantic value of the */
- /* lookahead symbol */
-
-#ifdef YYLSP_NEEDED
-YYLTYPE yylloc; /* location data for the lookahead */
- /* symbol */
-#endif
-
-int yynerrs; /* number of parse errors so far */
-#endif /* not YYPURE */
-
-#if YYDEBUG != 0
-int yydebug; /* nonzero means print parse trace */
-/* Since this is uninitialized, it does not stop multiple parsers
- from coexisting. */
-#endif
-
-/* YYINITDEPTH indicates the initial size of the parser's stacks */
-
-#ifndef YYINITDEPTH
-#define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH is the maximum size the stacks can grow to
- (effective only if the built-in stack extension method is used). */
-
-#if YYMAXDEPTH == 0
-#undef YYMAXDEPTH
-#endif
-
-#ifndef YYMAXDEPTH
-#define YYMAXDEPTH 10000
-#endif
-
-/* Define __yy_memcpy. Note that the size argument
- should be passed with type unsigned int, because that is what the non-GCC
- definitions require. With GCC, __builtin_memcpy takes an arg
- of type size_t, but it can handle unsigned int. */
-
-#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
-#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
-#else /* not GNU C or C++ */
-#ifndef __cplusplus
-
-/* This is the most reliable way to avoid incompatibilities
- in available built-in functions on various systems. */
-static void
-__yy_memcpy (to, from, count)
- char *to;
- char *from;
- unsigned int count;
-{
- register char *f = from;
- register char *t = to;
- register int i = count;
-
- while (i-- > 0)
- *t++ = *f++;
-}
-
-#else /* __cplusplus */
-
-/* This is the most reliable way to avoid incompatibilities
- in available built-in functions on various systems. */
-static void
-__yy_memcpy (char *to, char *from, unsigned int count)
-{
- register char *t = to;
- register char *f = from;
- register int i = count;
-
- while (i-- > 0)
- *t++ = *f++;
-}
-
-#endif
-#endif
-
-#line 217 "/usr/lib/bison.simple"
-
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
- into yyparse. The argument should have type void *.
- It should actually point to an object.
- Grammar actions can access the variable by casting it
- to the proper pointer type. */
-
-#ifdef YYPARSE_PARAM
-#ifdef __cplusplus
-#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-#define YYPARSE_PARAM_DECL
-#else /* not __cplusplus */
-#define YYPARSE_PARAM_ARG YYPARSE_PARAM
-#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
-#endif /* not __cplusplus */
-#else /* not YYPARSE_PARAM */
-#define YYPARSE_PARAM_ARG
-#define YYPARSE_PARAM_DECL
-#endif /* not YYPARSE_PARAM */
-
-/* Prevent warning if -Wstrict-prototypes. */
-#ifdef __GNUC__
-#ifdef YYPARSE_PARAM
-int yyparse (void *);
-#else
-int yyparse (void);
-#endif
-#endif
-
-int
-yyparse(YYPARSE_PARAM_ARG)
- YYPARSE_PARAM_DECL
-{
- register int yystate;
- register int yyn;
- register short *yyssp;
- register YYSTYPE *yyvsp;
- int yyerrstatus; /* number of tokens to shift before error messages enabled */
- int yychar1 = 0; /* lookahead token as an internal (translated) token number */
-
- short yyssa[YYINITDEPTH]; /* the state stack */
- YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
-
- short *yyss = yyssa; /* refer to the stacks thru separate pointers */
- YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
-
-#ifdef YYLSP_NEEDED
- YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
- YYLTYPE *yyls = yylsa;
- YYLTYPE *yylsp;
-
-#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
-#else
-#define YYPOPSTACK (yyvsp--, yyssp--)
-#endif
-
- int yystacksize = YYINITDEPTH;
- int yyfree_stacks = 0;
-
-#ifdef YYPURE
- int yychar;
- YYSTYPE yylval;
- int yynerrs;
-#ifdef YYLSP_NEEDED
- YYLTYPE yylloc;
-#endif
-#endif
-
- YYSTYPE yyval; /* the variable used to return */
- /* semantic values from the action */
- /* routines */
-
- int yylen;
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Starting parse\n");
-#endif
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss - 1;
- yyvsp = yyvs;
-#ifdef YYLSP_NEEDED
- yylsp = yyls;
-#endif
-
-/* Push a new state, which is found in yystate . */
-/* In all cases, when you get here, the value and location stacks
- have just been pushed. so pushing a state here evens the stacks. */
-yynewstate:
-
- *++yyssp = yystate;
-
- if (yyssp >= yyss + yystacksize - 1)
- {
- /* Give user a chance to reallocate the stack */
- /* Use copies of these so that the &'s don't force the real ones into memory. */
- YYSTYPE *yyvs1 = yyvs;
- short *yyss1 = yyss;
-#ifdef YYLSP_NEEDED
- YYLTYPE *yyls1 = yyls;
-#endif
-
- /* Get the current used size of the three stacks, in elements. */
- int size = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- /* Each stack pointer address is followed by the size of
- the data in use in that stack, in bytes. */
-#ifdef YYLSP_NEEDED
- /* This used to be a conditional around just the two extra args,
- but that might be undefined if yyoverflow is a macro. */
- yyoverflow("parser stack overflow",
- &yyss1, size * sizeof (*yyssp),
- &yyvs1, size * sizeof (*yyvsp),
- &yyls1, size * sizeof (*yylsp),
- &yystacksize);
-#else
- yyoverflow("parser stack overflow",
- &yyss1, size * sizeof (*yyssp),
- &yyvs1, size * sizeof (*yyvsp),
- &yystacksize);
-#endif
-
- yyss = yyss1; yyvs = yyvs1;
-#ifdef YYLSP_NEEDED
- yyls = yyls1;
-#endif
-#else /* no yyoverflow */
- /* Extend the stack our own way. */
- if (yystacksize >= YYMAXDEPTH)
- {
- yyerror("parser stack overflow");
- if (yyfree_stacks)
- {
- free (yyss);
- free (yyvs);
-#ifdef YYLSP_NEEDED
- free (yyls);
-#endif
- }
- return 2;
- }
- yystacksize *= 2;
- if (yystacksize > YYMAXDEPTH)
- yystacksize = YYMAXDEPTH;
-#ifndef YYSTACK_USE_ALLOCA
- yyfree_stacks = 1;
-#endif
- yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
- __yy_memcpy ((char *)yyss, (char *)yyss1,
- size * (unsigned int) sizeof (*yyssp));
- yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
- __yy_memcpy ((char *)yyvs, (char *)yyvs1,
- size * (unsigned int) sizeof (*yyvsp));
-#ifdef YYLSP_NEEDED
- yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
- __yy_memcpy ((char *)yyls, (char *)yyls1,
- size * (unsigned int) sizeof (*yylsp));
-#endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + size - 1;
- yyvsp = yyvs + size - 1;
-#ifdef YYLSP_NEEDED
- yylsp = yyls + size - 1;
-#endif
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Stack size increased to %d\n", yystacksize);
-#endif
-
- if (yyssp >= yyss + yystacksize - 1)
- YYABORT;
- }
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Entering state %d\n", yystate);
-#endif
-
- goto yybackup;
- yybackup:
-
-/* Do appropriate processing given the current state. */
-/* Read a lookahead token if we need one and don't already have one. */
-/* yyresume: */
-
- /* First try to decide what to do without reference to lookahead token. */
-
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yydefault;
-
- /* Not known => get a lookahead token if don't already have one. */
-
- /* yychar is either YYEMPTY or YYEOF
- or a valid token in external form. */
-
- if (yychar == YYEMPTY)
- {
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Reading a token: ");
-#endif
- yychar = YYLEX;
- }
-
- /* Convert token to internal form (in yychar1) for indexing tables with */
-
- if (yychar <= 0) /* This means end of input. */
- {
- yychar1 = 0;
- yychar = YYEOF; /* Don't call YYLEX any more */
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Now at end of input.\n");
-#endif
- }
- else
- {
- yychar1 = YYTRANSLATE(yychar);
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
- /* Give the individual parser a way to print the precise meaning
- of a token, for further debugging info. */
-#ifdef YYPRINT
- YYPRINT (stderr, yychar, yylval);
-#endif
- fprintf (stderr, ")\n");
- }
-#endif
- }
-
- yyn += yychar1;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
- goto yydefault;
-
- yyn = yytable[yyn];
-
- /* yyn is what to do for this token type in this state.
- Negative => reduce, -yyn is rule number.
- Positive => shift, yyn is new state.
- New state is final state => don't bother to shift,
- just return success.
- 0, or most negative number => error. */
-
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
- else if (yyn == 0)
- goto yyerrlab;
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Shift the lookahead token. */
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
-#endif
-
- /* Discard the token being shifted unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- *++yyvsp = yylval;
-#ifdef YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
-
- /* count tokens shifted since error; after three, turn off error status. */
- if (yyerrstatus) yyerrstatus--;
-
- yystate = yyn;
- goto yynewstate;
-
-/* Do the default action for the current state. */
-yydefault:
-
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
-
-/* Do a reduction. yyn is the number of a rule to reduce with. */
-yyreduce:
- yylen = yyr2[yyn];
- if (yylen > 0)
- yyval = yyvsp[1-yylen]; /* implement default value of the action */
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- int i;
-
- fprintf (stderr, "Reducing via rule %d (line %d), ",
- yyn, yyrline[yyn]);
-
- /* Print the symbols being reduced, and their result. */
- for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
- fprintf (stderr, "%s ", yytname[yyrhs[i]]);
- fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
- }
-#endif
-
-
- switch (yyn) {
-
-case 9:
-#line 121 "icalitip.y"
-{
- icalparser_yy_value = 0;
- icalparser_clear_flex_input();
- yyclearin;
- ;
- break;}
-case 11:
-#line 131 "icalitip.y"
-{ icalparser_yy_value = icalvalue_new_boolean(1); ;
- break;}
-case 12:
-#line 133 "icalitip.y"
-{ icalparser_yy_value = icalvalue_new_boolean(0); ;
- break;}
-case 13:
-#line 136 "icalitip.y"
-{
- struct icaltimetype stm;
-
- stm = fill_datetime(yyvsp[0].v_string,0);
-
- stm.hour = -1;
- stm.minute = -1;
- stm.second = -1;
- stm.is_utc = 0;
- stm.is_date = 1;
-
- icalparser_yy_value = icalvalue_new_date(stm);
- ;
- break;}
-case 14:
-#line 151 "icalitip.y"
-{utc = 0;;
- break;}
-case 15:
-#line 152 "icalitip.y"
-{utc = 1;;
- break;}
-case 16:
-#line 156 "icalitip.y"
-{utc_b = 0;;
- break;}
-case 17:
-#line 157 "icalitip.y"
-{utc_b = 1;;
- break;}
-case 18:
-#line 161 "icalitip.y"
-{
- struct icaltimetype stm;
- stm = fill_datetime(yyvsp[-3].v_string, yyvsp[-1].v_string);
- stm.is_utc = utc;
- stm.is_date = 0;
-
- icalparser_yy_value =
- icalvalue_new_datetime(stm);
- ;
- break;}
-case 21:
-#line 179 "icalitip.y"
-{
- duration.weeks = atoi(yyvsp[-1].v_string);
- ;
- break;}
-case 22:
-#line 184 "icalitip.y"
-{
- ;
- break;}
-case 23:
-#line 187 "icalitip.y"
-{
- ;
- break;}
-case 24:
-#line 190 "icalitip.y"
-{
- ;
- break;}
-case 25:
-#line 194 "icalitip.y"
-{
- duration.hours = atoi(yyvsp[-1].v_string);
- ;
- break;}
-case 26:
-#line 198 "icalitip.y"
-{
- duration.hours = atoi(yyvsp[-2].v_string);
- ;
- break;}
-case 27:
-#line 203 "icalitip.y"
-{
- duration.minutes = atoi(yyvsp[-1].v_string);
- ;
- break;}
-case 28:
-#line 207 "icalitip.y"
-{
- duration.minutes = atoi(yyvsp[-2].v_string);
- ;
- break;}
-case 29:
-#line 212 "icalitip.y"
-{
- duration.seconds = atoi(yyvsp[-1].v_string);
- ;
- break;}
-case 30:
-#line 217 "icalitip.y"
-{
- duration.days = atoi(yyvsp[-1].v_string);
- ;
- break;}
-case 31:
-#line 222 "icalitip.y"
-{
- ;
- break;}
-case 32:
-#line 225 "icalitip.y"
-{
- ;
- break;}
-case 33:
-#line 228 "icalitip.y"
-{
- ;
- break;}
-case 34:
-#line 232 "icalitip.y"
-{
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- ;
- break;}
-case 35:
-#line 237 "icalitip.y"
-{
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- ;
- break;}
-case 36:
-#line 242 "icalitip.y"
-{
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- ;
- break;}
-case 37:
-#line 251 "icalitip.y"
-{
- struct icalperiodtype p;
-
- p.start = fill_datetime(yyvsp[-8].v_string,yyvsp[-6].v_string);
- p.start.is_utc = utc;
- p.start.is_date = 0;
-
-
- p.end = fill_datetime(yyvsp[-3].v_string,yyvsp[-1].v_string);
- p.end.is_utc = utc_b;
- p.end.is_date = 0;
-
- p.duration.days = -1;
- p.duration.weeks = -1;
- p.duration.hours = -1;
- p.duration.minutes = -1;
- p.duration.seconds = -1;
-
- icalparser_yy_value = icalvalue_new_period(p);
- ;
- break;}
-case 38:
-#line 272 "icalitip.y"
-{
- struct icalperiodtype p;
-
- p.start = fill_datetime(yyvsp[-5].v_string,yyvsp[-3].v_string);
- p.start.is_utc = utc;
- p.start.is_date = 0;
-
- p.end.year = -1;
- p.end.month = -1;
- p.end.day = -1;
- p.end.hour = -1;
- p.end.minute = -1;
- p.end.second = -1;
-
- /* The duration_value rule setes the global 'duration'
- variable, but it also creates a new value in
- icalparser_yy_value. So, free that, then copy
- 'duration' into the icalperiodtype struct. */
-
- p.duration = icalvalue_get_duration(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value);
- icalparser_yy_value = 0;
-
- icalparser_yy_value = icalvalue_new_period(p);
-
- ;
- break;}
-case 39:
-#line 304 "icalitip.y"
-{clear_recur();recur.freq = ICAL_SECONDLY_RECURRENCE;;
- break;}
-case 40:
-#line 305 "icalitip.y"
-{clear_recur();recur.freq = ICAL_MINUTELY_RECURRENCE;;
- break;}
-case 41:
-#line 306 "icalitip.y"
-{clear_recur();recur.freq = ICAL_HOURLY_RECURRENCE;;
- break;}
-case 42:
-#line 307 "icalitip.y"
-{clear_recur();recur.freq = ICAL_DAILY_RECURRENCE;;
- break;}
-case 43:
-#line 308 "icalitip.y"
-{clear_recur();recur.freq = ICAL_WEEKLY_RECURRENCE;;
- break;}
-case 44:
-#line 309 "icalitip.y"
-{clear_recur();recur.freq = ICAL_MONTHLY_RECURRENCE;;
- break;}
-case 45:
-#line 310 "icalitip.y"
-{clear_recur();recur.freq = ICAL_YEARLY_RECURRENCE;;
- break;}
-case 46:
-#line 315 "icalitip.y"
-{ skiplist[skippos]=ICAL_SUNDAY_WEEKDAY; if( skippos<8) skippos++;;
- break;}
-case 47:
-#line 316 "icalitip.y"
-{ skiplist[skippos]=ICAL_MONDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 48:
-#line 317 "icalitip.y"
-{ skiplist[skippos]=ICAL_TUESDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 49:
-#line 318 "icalitip.y"
-{ skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 50:
-#line 319 "icalitip.y"
-{ skiplist[skippos]=ICAL_THURSDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 51:
-#line 320 "icalitip.y"
-{ skiplist[skippos]=ICAL_FRIDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 52:
-#line 321 "icalitip.y"
-{ skiplist[skippos]=ICAL_SATURDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 54:
-#line 327 "icalitip.y"
-{ ;
- break;}
-case 56:
-#line 332 "icalitip.y"
-{ skiplist[skippos] = atoi(yyvsp[0].v_string); skippos++;;
- break;}
-case 57:
-#line 333 "icalitip.y"
-{ skiplist[skippos] = atoi(yyvsp[0].v_string); if (skippos<367) skippos++;;
- break;}
-case 58:
-#line 337 "icalitip.y"
-{recur.interval = atoi(yyvsp[0].v_string);;
- break;}
-case 59:
-#line 338 "icalitip.y"
-{recur.week_start = ICAL_SUNDAY_WEEKDAY;;
- break;}
-case 60:
-#line 339 "icalitip.y"
-{recur.week_start = ICAL_MONDAY_WEEKDAY;;
- break;}
-case 61:
-#line 340 "icalitip.y"
-{recur.week_start = ICAL_TUESDAY_WEEKDAY;;
- break;}
-case 62:
-#line 341 "icalitip.y"
-{recur.week_start = ICAL_WEDNESDAY_WEEKDAY;;
- break;}
-case 63:
-#line 342 "icalitip.y"
-{recur.week_start = ICAL_THURSDAY_WEEKDAY;;
- break;}
-case 64:
-#line 343 "icalitip.y"
-{recur.week_start = ICAL_FRIDAY_WEEKDAY;;
- break;}
-case 65:
-#line 344 "icalitip.y"
-{recur.week_start = ICAL_SATURDAY_WEEKDAY;;
- break;}
-case 66:
-#line 345 "icalitip.y"
-{copy_list(recur.by_second,60);;
- break;}
-case 67:
-#line 346 "icalitip.y"
-{copy_list(recur.by_minute,60);;
- break;}
-case 68:
-#line 347 "icalitip.y"
-{copy_list(recur.by_hour,24);;
- break;}
-case 69:
-#line 348 "icalitip.y"
-{copy_list(recur.by_day,7);;
- break;}
-case 70:
-#line 349 "icalitip.y"
-{copy_list(recur.by_month,12);;
- break;}
-case 71:
-#line 350 "icalitip.y"
-{copy_list(recur.by_month_day,31);;
- break;}
-case 72:
-#line 351 "icalitip.y"
-{copy_list(recur.by_year_day,366);;
- break;}
-case 73:
-#line 352 "icalitip.y"
-{copy_list(recur.by_week_no,53);;
- break;}
-case 74:
-#line 353 "icalitip.y"
-{copy_list(recur.by_set_pos,366);;
- break;}
-case 75:
-#line 355 "icalitip.y"
-{ recur.until = icalvalue_get_datetime(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;;
- break;}
-case 76:
-#line 358 "icalitip.y"
-{ recur.until = icalvalue_get_date(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;;
- break;}
-case 77:
-#line 361 "icalitip.y"
-{ recur.count = atoi(yyvsp[0].v_string); ;
- break;}
-case 80:
-#line 370 "icalitip.y"
-{ icalparser_yy_value = icalvalue_new_recur(recur); ;
- break;}
-case 81:
-#line 376 "icalitip.y"
-{ utcsign = 1; ;
- break;}
-case 82:
-#line 377 "icalitip.y"
-{ utcsign = -1; ;
- break;}
-case 83:
-#line 381 "icalitip.y"
-{
- icalparser_yy_value = icalvalue_new_utcoffset( utcsign * (yyvsp[-1].v_int*3600) + (yyvsp[0].v_int*60) );
- ;
- break;}
-case 84:
-#line 386 "icalitip.y"
-{
- icalparser_yy_value = icalvalue_new_utcoffset(utcsign * (yyvsp[-2].v_int*3600) + (yyvsp[-1].v_int*60) +(yyvsp[0].v_int));
- ;
- break;}
-}
- /* the action file gets copied in in place of this dollarsign */
-#line 543 "/usr/lib/bison.simple"
-
- yyvsp -= yylen;
- yyssp -= yylen;
-#ifdef YYLSP_NEEDED
- yylsp -= yylen;
-#endif
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- short *ssp1 = yyss - 1;
- fprintf (stderr, "state stack now");
- while (ssp1 != yyssp)
- fprintf (stderr, " %d", *++ssp1);
- fprintf (stderr, "\n");
- }
-#endif
-
- *++yyvsp = yyval;
-
-#ifdef YYLSP_NEEDED
- yylsp++;
- if (yylen == 0)
- {
- yylsp->first_line = yylloc.first_line;
- yylsp->first_column = yylloc.first_column;
- yylsp->last_line = (yylsp-1)->last_line;
- yylsp->last_column = (yylsp-1)->last_column;
- yylsp->text = 0;
- }
- else
- {
- yylsp->last_line = (yylsp+yylen-1)->last_line;
- yylsp->last_column = (yylsp+yylen-1)->last_column;
- }
-#endif
-
- /* Now "shift" the result of the reduction.
- Determine what state that goes to,
- based on the state we popped back to
- and the rule number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
- if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTBASE];
-
- goto yynewstate;
-
-yyerrlab: /* here on detecting error */
-
- if (! yyerrstatus)
- /* If not already recovering from an error, report this error. */
- {
- ++yynerrs;
-
-#ifdef YYERROR_VERBOSE
- yyn = yypact[yystate];
-
- if (yyn > YYFLAG && yyn < YYLAST)
- {
- int size = 0;
- char *msg;
- int x, count;
-
- count = 0;
- /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
- for (x = (yyn < 0 ? -yyn : 0);
- x < (sizeof(yytname) / sizeof(char *)); x++)
- if (yycheck[x + yyn] == x)
- size += strlen(yytname[x]) + 15, count++;
- msg = (char *) malloc(size + 15);
- if (msg != 0)
- {
- strcpy(msg, "parse error");
-
- if (count < 5)
- {
- count = 0;
- for (x = (yyn < 0 ? -yyn : 0);
- x < (sizeof(yytname) / sizeof(char *)); x++)
- if (yycheck[x + yyn] == x)
- {
- strcat(msg, count == 0 ? ", expecting `" : " or `");
- strcat(msg, yytname[x]);
- strcat(msg, "'");
- count++;
- }
- }
- yyerror(msg);
- free(msg);
- }
- else
- yyerror ("parse error; also virtual memory exceeded");
- }
- else
-#endif /* YYERROR_VERBOSE */
- yyerror("parse error");
- }
-
- goto yyerrlab1;
-yyerrlab1: /* here on error raised explicitly by an action */
-
- if (yyerrstatus == 3)
- {
- /* if just tried and failed to reuse lookahead token after an error, discard it. */
-
- /* return failure if at end of input */
- if (yychar == YYEOF)
- YYABORT;
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
-#endif
-
- yychar = YYEMPTY;
- }
-
- /* Else will try to reuse lookahead token
- after shifting the error token. */
-
- yyerrstatus = 3; /* Each real token shifted decrements this */
-
- goto yyerrhandle;
-
-yyerrdefault: /* current state does not do anything special for the error token. */
-
-#if 0
- /* This is wrong; only states that explicitly want error tokens
- should shift them. */
- yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
- if (yyn) goto yydefault;
-#endif
-
-yyerrpop: /* pop the current state because it cannot handle the error token */
-
- if (yyssp == yyss) YYABORT;
- yyvsp--;
- yystate = *--yyssp;
-#ifdef YYLSP_NEEDED
- yylsp--;
-#endif
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- short *ssp1 = yyss - 1;
- fprintf (stderr, "Error: state stack now");
- while (ssp1 != yyssp)
- fprintf (stderr, " %d", *++ssp1);
- fprintf (stderr, "\n");
- }
-#endif
-
-yyerrhandle:
-
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yyerrdefault;
-
- yyn += YYTERROR;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
- goto yyerrdefault;
-
- yyn = yytable[yyn];
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrpop;
- yyn = -yyn;
- goto yyreduce;
- }
- else if (yyn == 0)
- goto yyerrpop;
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Shifting error token, ");
-#endif
-
- *++yyvsp = yylval;
-#ifdef YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
-
- yystate = yyn;
- goto yynewstate;
-
- yyacceptlab:
- /* YYACCEPT comes here. */
- if (yyfree_stacks)
- {
- free (yyss);
- free (yyvs);
-#ifdef YYLSP_NEEDED
- free (yyls);
-#endif
- }
- return 0;
-
- yyabortlab:
- /* YYABORT comes here. */
- if (yyfree_stacks)
- {
- free (yyss);
- free (yyvs);
-#ifdef YYLSP_NEEDED
- free (yyls);
-#endif
- }
- return 1;
-}
-#line 392 "icalitip.y"
-
-
-
-void clear_recur()
-{
- memset(&skiplist, ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
- skippos = 0;
-
- icalrecurrencetype_clear(&recur);
-}
-
-void copy_list(short* array, size_t size)
-{
- memcpy(array, skiplist, size*sizeof(short));
- memset(&skiplist,ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
- skippos = 0;
-}
-
-struct icaltimetype fill_datetime(char* datestr, char* timestr)
-{
- struct icaltimetype stm;
-
- memset(&stm,0,sizeof(stm));
-
- if (datestr != 0){
- sscanf(datestr,"%4d%2d%2d",&(stm.year), &(stm.month),
- &(stm.day));
- }
-
- if (timestr != 0){
- sscanf(timestr,"%2d%2d%2d", &(stm.hour), &(stm.minute),
- &(stm.second));
- }
-
- return stm;
-
-}
-
-void yyerror(char* s)
-{
- /*fprintf(stderr,"Parse error \'%s\'\n", s);*/
-}
-
diff --git a/libical/src/libical/icalitip.tab.h b/libical/src/libical/icalitip.tab.h
deleted file mode 100644
index 197bd1c292..0000000000
--- a/libical/src/libical/icalitip.tab.h
+++ /dev/null
@@ -1,137 +0,0 @@
-typedef union {
- float v_float;
- int v_int;
- char* v_string;
-
-} YYSTYPE;
-#define DIGITS 257
-#define INTNUMBER 258
-#define FLOATNUMBER 259
-#define STRING 260
-#define EOL 261
-#define EQUALS 262
-#define CHARACTER 263
-#define COLON 264
-#define COMMA 265
-#define SEMICOLON 266
-#define TIMESEPERATOR 267
-#define TRUE 268
-#define FALSE 269
-#define FREQ 270
-#define BYDAY 271
-#define BYHOUR 272
-#define BYMINUTE 273
-#define BYMONTH 274
-#define BYMONTHDAY 275
-#define BYSECOND 276
-#define BYSETPOS 277
-#define BYWEEKNO 278
-#define BYYEARDAY 279
-#define DAILY 280
-#define MINUTELY 281
-#define MONTHLY 282
-#define SECONDLY 283
-#define WEEKLY 284
-#define HOURLY 285
-#define YEARLY 286
-#define INTERVAL 287
-#define COUNT 288
-#define UNTIL 289
-#define WKST 290
-#define MO 291
-#define SA 292
-#define SU 293
-#define TU 294
-#define WE 295
-#define TH 296
-#define FR 297
-#define BIT8 298
-#define ACCEPTED 299
-#define ADD 300
-#define AUDIO 301
-#define BASE64 302
-#define BINARY 303
-#define BOOLEAN 304
-#define BUSY 305
-#define BUSYTENTATIVE 306
-#define BUSYUNAVAILABLE 307
-#define CALADDRESS 308
-#define CANCEL 309
-#define CANCELLED 310
-#define CHAIR 311
-#define CHILD 312
-#define COMPLETED 313
-#define CONFIDENTIAL 314
-#define CONFIRMED 315
-#define COUNTER 316
-#define DATE 317
-#define DATETIME 318
-#define DECLINECOUNTER 319
-#define DECLINED 320
-#define DELEGATED 321
-#define DISPLAY 322
-#define DRAFT 323
-#define DURATION 324
-#define EMAIL 325
-#define END 326
-#define FINAL 327
-#define FLOAT 328
-#define FREE 329
-#define GREGORIAN 330
-#define GROUP 331
-#define INDIVIDUAL 332
-#define INPROCESS 333
-#define INTEGER 334
-#define NEEDSACTION 335
-#define NONPARTICIPANT 336
-#define OPAQUE 337
-#define OPTPARTICIPANT 338
-#define PARENT 339
-#define PERIOD 340
-#define PRIVATE 341
-#define PROCEDURE 342
-#define PUBLIC 343
-#define PUBLISH 344
-#define RECUR 345
-#define REFRESH 346
-#define REPLY 347
-#define REQPARTICIPANT 348
-#define REQUEST 349
-#define RESOURCE 350
-#define ROOM 351
-#define SIBLING 352
-#define START 353
-#define TENTATIVE 354
-#define TEXT 355
-#define THISANDFUTURE 356
-#define THISANDPRIOR 357
-#define TIME 358
-#define TRANSPAENT 359
-#define UNKNOWN 360
-#define UTCOFFSET 361
-#define XNAME 362
-#define ALTREP 363
-#define CN 364
-#define CUTYPE 365
-#define DAYLIGHT 366
-#define DIR 367
-#define ENCODING 368
-#define EVENT 369
-#define FBTYPE 370
-#define FMTTYPE 371
-#define LANGUAGE 372
-#define MEMBER 373
-#define PARTSTAT 374
-#define RANGE 375
-#define RELATED 376
-#define RELTYPE 377
-#define ROLE 378
-#define RSVP 379
-#define SENTBY 380
-#define STANDARD 381
-#define URI 382
-#define TIME_CHAR 383
-#define UTC_CHAR 384
-
-
-extern YYSTYPE icalparser_yylval;
diff --git a/libical/src/libical/icalitipl.l b/libical/src/libical/icalitipl.l
deleted file mode 100644
index 9abe9538c9..0000000000
--- a/libical/src/libical/icalitipl.l
+++ /dev/null
@@ -1,283 +0,0 @@
-%{
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalitip.y
- CREATOR: eric 10 June 1999
-
- DESCRIPTION:
-
- $Id: icalitipl.l,v 1.3 2000/05/15 06:18:17 ericb Exp $
- $Locker: $
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalitip.y
-
-
-
- ======================================================================*/
-#include "icalitipy.h"
-#include "icalparser.h"
-#include "icalenums.h"
-#include "icalmemory.h"
-#include "assert.h"
-
-#include <string.h> /* For strdup() */
-
-#define ICAL_MAX_STR_CONST 1024
-
-#undef YY_INPUT
-#define YY_INPUT(b,r,ms) ( r= icalparser_flex_input(b,ms))
-#undef yywrap
-
-#undef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) icalparser_yyerror(msg)
-
-icalvalue_kind value_kind=ICAL_NO_VALUE;
-void set_parser_value_state();
-extern enum icalparser_state_enum icalparser_state;
-extern int yydebug;
-
-void icalparser_yyerror(char *s);
-
-void init_str_buf();
-
-int last_state;
-
-char *str_buf;
-char *str_buf_p;
-size_t buf_sz; /* = ICAL_MAX_STR_CONST;*/
-
-
-%}
-
-crlf \x0D\x0A
-nl \n
-lbreak \x0D\x0A\x20
-ulbreak \x0A\x20
-space [ ]
-qsafechar [^\x00-\x1F\"]
-safechar [^\x00-\x1F\"\:\;\,]
-tsafechar [\x20-\x21\x23-\x2B\x2D-\x39\x3C-\x5B\x5D-\x7E]
-valuechar [^\x00-\x08\x10-\x1F]
-xname X-[a-zA-Z0-9\-]+
-xname2 [a-zA-Z0-9\-\ ]
-paramtext {safechar}+
-value {valuechar}+
-quotedstring \"{qsafechar}+\"
-digit [0-9]
-
-%array /* Make yytext an array. Slow, but handy. HACK */
-
-%option caseless
-
-
-%s quoted_string
-%s binary_value boolean_value uri_value time_value duration_value number_value period_value recur_value text_value utcoffset_value
-%s enum_param_value string_param_value stringlist_param_value keyword line_start component seperator parameter end_of_value paramtext
-
-
-
-%%
-
-%{
-%}
-
-
-<binary_value>{
-.* { icalparser_yylval.v_string= icalmemory_tmp_copy(yytext);
- return STRING;}
-{crlf}|\n { return EOL;}
-
-}
-
-<boolean_value>{
-. { return CHARACTER; }
-{crlf}|\n { return EOL;}
-
-}
-
-<uri_value>{
-.* { icalparser_yylval.v_string= icalmemory_tmp_copy(yytext);
- return STRING;}
-{crlf}|\n { return EOL;}
-
-}
-
-
-<time_value>{
-{digit}* { icalparser_yylval.v_string= icalmemory_tmp_copy(yytext);
- return DIGITS; }
-T { return TIME_CHAR; }
-Z { return UTC_CHAR; }
-{crlf}|\n { return EOL;}
-}
-
-<duration_value>{
-{digit}+ { icalparser_yylval.v_string =icalmemory_tmp_copy(yytext);
- return DIGITS; }
-T { return TIME_CHAR; }
-[\+\-PTWHMSD] { return yytext[0]; }
-{crlf}|\n { return EOL;}
-
-}
-
-<number_value>{
-[\+\-\.0-9]+ { icalparser_yylval.v_int=atoi(yytext); return INTNUMBER; }
-{crlf}|\n { return EOL;}
-}
-
-<period_value>{
-{digit}+ { icalparser_yylval.v_string =icalmemory_tmp_copy(yytext) ;
- return DIGITS; }
-T { return TIME_CHAR; }
-Z { return UTC_CHAR; }
-[\/\+\-PWHMSD] { return yytext[0]; }
-{crlf}|\n { return EOL;}
-
-}
-
-<recur_value>{
-INTERVAL { return INTERVAL; }
-COUNT { return COUNT; }
-UNTIL { return UNTIL; }
-FREQ { return FREQ; }
-BYDAY { return BYDAY; }
-BYHOUR { return BYHOUR; }
-BYMINUTE { return BYMINUTE; }
-BYMONTH { return BYMONTH; }
-BYMONTHDAY { return BYMONTHDAY; }
-BYSECOND { return BYSECOND; }
-BYSETPOS { return BYSETPOS; }
-BYWEEKNO { return BYWEEKNO; }
-BYYEARDAY { return BYYEARDAY; }
-DAILY { return DAILY; }
-SECONDLY { return SECONDLY; }
-MINUTELY { return MINUTELY; }
-HOURLY { return HOURLY; }
-MONTHLY { return MONTHLY; }
-WEEKLY { return WEEKLY; }
-YEARLY { return YEARLY; }
-WKST { return WKST; }
-MO { return MO; }
-SA { return SA; }
-SU { return SU; }
-TU { return TU; }
-WE { return WE; }
-TH { return TH; }
-FR { return FR; }
-= { return EQUALS; }
-, { return COMMA; }
-; { return SEMICOLON; }
-[\-\+0-9]+ { icalparser_yylval.v_string= icalmemory_tmp_copy(yytext);
- return DIGITS; }
-T { return TIME_CHAR; }
-Z { return UTC_CHAR; }
-{crlf}|\n { return EOL;}
-}
-
-<utcoffset_value>{
-{crlf}|\n { return EOL;}
-\-|\+ { return yytext[0]; }
-{digit}{digit} { icalparser_yylval.v_int=atoi(yytext); return INTNUMBER; }
-
-}
-
-<enum_param_value>{
-. { return CHARACTER; }
-{crlf}|\n { return EOL;}
-
-}
-
-<seperator>{
-, { BEGIN(last_state); return COMMA; }
-}
-
-
-%%
-
-int yywrap()
-{
- return 1;
-}
-
-
-void set_parser_value_state(icalvalue_kind kind)
-{
-
- switch (kind){
-
- case ICAL_ATTACH_VALUE:
- case ICAL_BINARY_VALUE:
- {BEGIN(binary_value);break;}
-
- case ICAL_BOOLEAN_VALUE:
- case ICAL_INTEGER_VALUE:
- case ICAL_FLOAT_VALUE:
- {BEGIN(number_value);break;}
-
- case ICAL_UTCOFFSET_VALUE:
- {BEGIN(utcoffset_value);break;}
-
- case ICAL_TEXT_VALUE:
- {BEGIN(text_value);
- init_str_buf();
- break;}
-
- case ICAL_CALADDRESS_VALUE:
- case ICAL_URI_VALUE:
- {BEGIN(uri_value);break;}
-
- case ICAL_DATE_VALUE:
- case ICAL_DATETIME_VALUE:
- case ICAL_DATETIMEDATE_VALUE:
- case ICAL_DATETIMEPERIOD_VALUE:
- case ICAL_TIME_VALUE:
- {BEGIN(time_value);break;}
-
- case ICAL_DURATION_VALUE:
- {BEGIN(duration_value);break;}
-
- case ICAL_PERIOD_VALUE:
- {BEGIN(period_value);break;}
-
- case ICAL_GEO_VALUE:
- case ICAL_QUERY_VALUE:
- {BEGIN(text_value);break;}
-
- case ICAL_RECUR_VALUE:
- {BEGIN(recur_value);break;}
-
- case ICAL_NO_VALUE:
- {
- /* The value is probably actually a component name */
- {BEGIN(component); break;}
- }
- default:
- {
- assert(1==0);
- }
- }
-}
-
-void init_str_buf()
-{
- str_buf = icalmemory_tmp_buffer(ICAL_MAX_STR_CONST);
- str_buf_p = str_buf;
- buf_sz = ICAL_MAX_STR_CONST;
-
-
-}
-
diff --git a/libical/src/libical/icalitipy.y b/libical/src/libical/icalitipy.y
deleted file mode 100644
index 07573d62cd..0000000000
--- a/libical/src/libical/icalitipy.y
+++ /dev/null
@@ -1,434 +0,0 @@
-%{
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalitip.y
- CREATOR: eric 10 June 1999
-
- DESCRIPTION:
-
- $Id: icalitipy.y,v 1.3 2000/05/15 06:18:17 ericb Exp $
- $Locker: $
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalitip.y
-
-
-
- ================================b======================================*/
-
-#include <stdlib.h>
-#include <string.h> /* for strdup() */
-#include <limits.h> /* for SHRT_MAX*/
-#include "icalparser.h"
-#include "ical.h"
-#include "pvl.h"
-
-#define YYERROR_VERBOSE
-#define YYDEBUG 1
-
-icalvalue *icalparser_yy_value; /* Current Value */
-
-/* Globals for UTCOFFSET values */
-int utc;
-int utc_b;
-int utcsign;
-
-/* Globals for DURATION values */
-struct icaldurationtype duration;
-
-/* Globals for RECUR values */
-struct icalrecurrencetype recur;
-short skiplist[367];
-short skippos;
-
-void copy_list(short* array, size_t size);
-void clear_recur();
-void add_prop(icalproperty_kind);
-void icalparser_fill_date(struct tm* t, char* dstr);
-void icalparser_fill_time(struct tm* t, char* tstr);
-void set_value_type(icalvalue_kind kind);
-void yyerror(char *s); /* Don't know why I need this.... */
-int yylex(void); /* Or this. */
-void set_parser_value_state();
-struct icaltimetype fill_datetime(char* d, char* t);
-
-
-
-/* Set the state of the lexer so it will interpret values ( iCAL
- VALUEs, that is, ) correctly. */
-
-%}
-
-%union {
- float v_float;
- int v_int;
- char* v_string;
-
-}
-
-%token <v_string> DIGITS
-%token <v_int> INTNUMBER
-%token <v_float> FLOATNUMBER
-%token <v_string> STRING
-%token EOL EQUALS CHARACTER COLON COMMA SEMICOLON TIMESEPERATOR
-
-%token TRUE FALSE
-
-%token FREQ BYDAY BYHOUR BYMINUTE BYMONTH BYMONTHDAY BYSECOND BYSETPOS BYWEEKNO
-%token BYYEARDAY DAILY MINUTELY MONTHLY SECONDLY WEEKLY HOURLY YEARLY
-%token INTERVAL COUNT UNTIL WKST MO SA SU TU WE TH FR
-
-%token BIT8 ACCEPTED ADD AUDIO BASE64 BINARY BOOLEAN BUSY BUSYTENTATIVE
-%token BUSYUNAVAILABLE CALADDRESS CANCEL CANCELLED CHAIR CHILD COMPLETED
-%token CONFIDENTIAL CONFIRMED COUNTER DATE DATETIME DECLINECOUNTER DECLINED
-%token DELEGATED DISPLAY DRAFT DURATION EMAIL END FINAL FLOAT FREE GREGORIAN
-%token GROUP INDIVIDUAL INPROCESS INTEGER NEEDSACTION NONPARTICIPANT
-%token OPAQUE OPTPARTICIPANT PARENT PERIOD PRIVATE PROCEDURE PUBLIC PUBLISH
-%token RECUR REFRESH REPLY REQPARTICIPANT REQUEST RESOURCE ROOM SIBLING
-%token START TENTATIVE TEXT THISANDFUTURE THISANDPRIOR TIME TRANSPAENT
-%token UNKNOWN UTCOFFSET XNAME
-
-%token ALTREP CN CUTYPE DAYLIGHT DIR ENCODING EVENT FBTYPE FMTTYPE LANGUAGE
-%token MEMBER PARTSTAT RANGE RELATED RELTYPE ROLE RSVP SENTBY STANDARD URI
-
-%token TIME_CHAR UTC_CHAR
-
-
-%%
-
-value:
- binary_value
- | boolean_value
- | date_value
- | datetime_value
- | duration_value
- | period_value
- | recur_value
- | utcoffset_value
- | error {
- icalparser_yy_value = 0;
- icalparser_clear_flex_input();
- yyclearin;
- }
-
-binary_value: "unimplemented2"
-
-boolean_value:
- TRUE
- { icalparser_yy_value = icalvalue_new_boolean(1); }
- | FALSE
- { icalparser_yy_value = icalvalue_new_boolean(0); }
-
-date_value: DIGITS
- {
- struct icaltimetype stm;
-
- stm = fill_datetime($1,0);
-
- stm.hour = -1;
- stm.minute = -1;
- stm.second = -1;
- stm.is_utc = 0;
- stm.is_date = 1;
-
- icalparser_yy_value = icalvalue_new_date(stm);
- }
-
-utc_char:
- /*empty*/ {utc = 0;}
- | UTC_CHAR {utc = 1;}
-
-/* This is used in the period_value, where there may be two utc characters per rule. */
-utc_char_b:
- /*empty*/ {utc_b = 0;}
- | UTC_CHAR {utc_b = 1;}
-
-datetime_value:
- DIGITS TIME_CHAR DIGITS utc_char
- {
- struct icaltimetype stm;
- stm = fill_datetime($1, $3);
- stm.is_utc = utc;
- stm.is_date = 0;
-
- icalparser_yy_value =
- icalvalue_new_datetime(stm);
- }
-
-
-/* Duration */
-
-
-dur_date: dur_day
- | dur_day dur_time
-
-dur_week: DIGITS 'W'
- {
- duration.weeks = atoi($1);
- }
-
-dur_time: TIME_CHAR dur_hour
- {
- }
- | TIME_CHAR dur_minute
- {
- }
- | TIME_CHAR dur_second
- {
- }
-
-dur_hour: DIGITS 'H'
- {
- duration.hours = atoi($1);
- }
- | DIGITS 'H' dur_minute
- {
- duration.hours = atoi($1);
- }
-
-dur_minute: DIGITS 'M'
- {
- duration.minutes = atoi($1);
- }
- | DIGITS 'M' dur_second
- {
- duration.minutes = atoi($1);
- }
-
-dur_second: DIGITS 'S'
- {
- duration.seconds = atoi($1);
- }
-
-dur_day: DIGITS 'D'
- {
- duration.days = atoi($1);
- }
-
-dur_prefix: /* empty */
- {
- }
- | '+'
- {
- }
- | '-'
- {
- }
-
-duration_value: dur_prefix 'P' dur_date
- {
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- }
- | dur_prefix 'P' dur_time
- {
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- }
- | dur_prefix 'P' dur_week
- {
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- }
-
-
-/* Period */
-
-period_value: DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b
- {
- struct icalperiodtype p;
-
- p.start = fill_datetime($1,$3);
- p.start.is_utc = utc;
- p.start.is_date = 0;
-
-
- p.end = fill_datetime($6,$8);
- p.end.is_utc = utc_b;
- p.end.is_date = 0;
-
- p.duration.days = -1;
- p.duration.weeks = -1;
- p.duration.hours = -1;
- p.duration.minutes = -1;
- p.duration.seconds = -1;
-
- icalparser_yy_value = icalvalue_new_period(p);
- }
- | DIGITS TIME_CHAR DIGITS utc_char '/' duration_value
- {
- struct icalperiodtype p;
-
- p.start = fill_datetime($1,$3);
- p.start.is_utc = utc;
- p.start.is_date = 0;
-
- p.end.year = -1;
- p.end.month = -1;
- p.end.day = -1;
- p.end.hour = -1;
- p.end.minute = -1;
- p.end.second = -1;
-
- /* The duration_value rule setes the global 'duration'
- variable, but it also creates a new value in
- icalparser_yy_value. So, free that, then copy
- 'duration' into the icalperiodtype struct. */
-
- p.duration = icalvalue_get_duration(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value);
- icalparser_yy_value = 0;
-
- icalparser_yy_value = icalvalue_new_period(p);
-
- }
-
-
-
-/* Recur */
-
-recur_start:
- FREQ EQUALS SECONDLY {clear_recur();recur.freq = ICAL_SECONDLY_RECURRENCE;}
- | FREQ EQUALS MINUTELY {clear_recur();recur.freq = ICAL_MINUTELY_RECURRENCE;}
- | FREQ EQUALS HOURLY {clear_recur();recur.freq = ICAL_HOURLY_RECURRENCE;}
- | FREQ EQUALS DAILY {clear_recur();recur.freq = ICAL_DAILY_RECURRENCE;}
- | FREQ EQUALS WEEKLY {clear_recur();recur.freq = ICAL_WEEKLY_RECURRENCE;}
- | FREQ EQUALS MONTHLY {clear_recur();recur.freq = ICAL_MONTHLY_RECURRENCE;}
- | FREQ EQUALS YEARLY {clear_recur();recur.freq = ICAL_YEARLY_RECURRENCE;}
- ;
-
-
-weekday:
- SU { skiplist[skippos]=ICAL_SUNDAY_WEEKDAY; if( skippos<8) skippos++;}
- | MO { skiplist[skippos]=ICAL_MONDAY_WEEKDAY;if( skippos<8) skippos++;}
- | TU { skiplist[skippos]=ICAL_TUESDAY_WEEKDAY;if( skippos<8) skippos++;}
- | WE { skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY;if( skippos<8) skippos++;}
- | TH { skiplist[skippos]=ICAL_THURSDAY_WEEKDAY;if( skippos<8) skippos++;}
- | FR { skiplist[skippos]=ICAL_FRIDAY_WEEKDAY;if( skippos<8) skippos++;}
- | SA { skiplist[skippos]=ICAL_SATURDAY_WEEKDAY;if( skippos<8) skippos++;}
- ;
-
-
-weekday_list:
- weekday
- | DIGITS weekday { } /* HACK Incorectly handles int in BYDAY */
- | weekday_list COMMA weekday
-
-
-recur_list:
- DIGITS { skiplist[skippos] = atoi($1); skippos++;}
- | recur_list COMMA DIGITS { skiplist[skippos] = atoi($3); if (skippos<367) skippos++;}
- ;
-
-recur_skip:
- INTERVAL EQUALS DIGITS {recur.interval = atoi($3);}
- | WKST EQUALS SU {recur.week_start = ICAL_SUNDAY_WEEKDAY;}
- | WKST EQUALS MO {recur.week_start = ICAL_MONDAY_WEEKDAY;}
- | WKST EQUALS TU {recur.week_start = ICAL_TUESDAY_WEEKDAY;}
- | WKST EQUALS WE {recur.week_start = ICAL_WEDNESDAY_WEEKDAY;}
- | WKST EQUALS TH {recur.week_start = ICAL_THURSDAY_WEEKDAY;}
- | WKST EQUALS FR {recur.week_start = ICAL_FRIDAY_WEEKDAY;}
- | WKST EQUALS SA {recur.week_start = ICAL_SATURDAY_WEEKDAY;}
- | BYSECOND EQUALS recur_list{copy_list(recur.by_second,60);}
- | BYMINUTE EQUALS recur_list{copy_list(recur.by_minute,60);}
- | BYHOUR EQUALS recur_list{copy_list(recur.by_hour,24);}
- | BYDAY EQUALS weekday_list{copy_list(recur.by_day,7);}
- | BYMONTH EQUALS recur_list{copy_list(recur.by_month,12);}
- | BYMONTHDAY EQUALS recur_list{copy_list(recur.by_month_day,31);}
- | BYYEARDAY EQUALS recur_list{copy_list(recur.by_year_day,366);}
- | BYWEEKNO EQUALS recur_list{copy_list(recur.by_week_no,53);}
- | BYSETPOS EQUALS recur_list{copy_list(recur.by_set_pos,366);}
- | UNTIL EQUALS datetime_value
- { recur.until = icalvalue_get_datetime(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;}
- | UNTIL EQUALS date_value
- { recur.until = icalvalue_get_date(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;}
- | COUNT EQUALS DIGITS
- { recur.count = atoi($3); }
- ;
-
-recur_skip_list:
- /* empty */
- | recur_skip_list SEMICOLON recur_skip
-
-recur_value:
- recur_start recur_skip_list
- { icalparser_yy_value = icalvalue_new_recur(recur); }
-
-
-
-/* UTC Offset */
-
-plusminus: '+' { utcsign = 1; }
- | '-' { utcsign = -1; }
-
-utcoffset_value:
- plusminus INTNUMBER INTNUMBER
- {
- icalparser_yy_value = icalvalue_new_utcoffset( utcsign * ($2*3600) + ($3*60) );
- }
-
- | plusminus INTNUMBER INTNUMBER INTNUMBER
- {
- icalparser_yy_value = icalvalue_new_utcoffset(utcsign * ($2*3600) + ($3*60) +($4));
- }
-
-
-
-%%
-
-
-void clear_recur()
-{
- memset(&skiplist, ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
- skippos = 0;
-
- icalrecurrencetype_clear(&recur);
-}
-
-void copy_list(short* array, size_t size)
-{
- memcpy(array, skiplist, size*sizeof(short));
- memset(&skiplist,ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
- skippos = 0;
-}
-
-struct icaltimetype fill_datetime(char* datestr, char* timestr)
-{
- struct icaltimetype stm;
-
- memset(&stm,0,sizeof(stm));
-
- if (datestr != 0){
- sscanf(datestr,"%4d%2d%2d",&(stm.year), &(stm.month),
- &(stm.day));
- }
-
- if (timestr != 0){
- sscanf(timestr,"%2d%2d%2d", &(stm.hour), &(stm.minute),
- &(stm.second));
- }
-
- return stm;
-
-}
-
-void yyerror(char* s)
-{
- /*fprintf(stderr,"Parse error \'%s\'\n", s);*/
-}
-
diff --git a/libical/src/libical/icallexer.l b/libical/src/libical/icallexer.l
deleted file mode 100644
index 8a6db2f93b..0000000000
--- a/libical/src/libical/icallexer.l
+++ /dev/null
@@ -1,286 +0,0 @@
-%{
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icallexer.l
- CREATOR: eric 10 June 1999
-
- DESCRIPTION:
-
- $Id: icallexer.l,v 1.4 2000/06/06 22:48:09 alves Exp $
- $Locker: $
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalitip.y
-
-
-
- ======================================================================*/
-#include "icalyacc.h"
-#include "icalparser.h"
-#include "icalenums.h"
-#include "icalmemory.h"
-#include "assert.h"
-
-#include <string.h> /* For strdup() */
-
-int icalparser_flex_input(char* buf, int max_size);
-void icalparser_clear_flex_input();
-
-
-#define ICAL_MAX_STR_CONST 1024
-
-#undef YY_INPUT
-#define YY_INPUT(b,r,ms) ( r= icalparser_flex_input(b,ms))
-#undef yywrap
-
-#undef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yyerror(msg)
-
-icalvalue_kind value_kind=ICAL_NO_VALUE;
-void set_parser_value_state();
-extern int yydebug;
-
-void yyerror(char *s);
-
-void init_str_buf();
-
-int last_state;
-
-char *str_buf;
-char *str_buf_p;
-size_t buf_sz; /* = ICAL_MAX_STR_CONST;*/
-
-
-%}
-
-crlf \x0D?\x0A
-space [ ]
-qsafechar [^\x00-\x1F\"]
-safechar [^\x00-\x1F\"\:\;\,]
-tsafechar [\x20-\x21\x23-\x2B\x2D-\x39\x3C-\x5B\x5D-\x7E]
-valuechar [^\x00-\x08\x10-\x1F]
-xname X-[a-zA-Z0-9\-]+
-xname2 [a-zA-Z0-9\-\ ]
-paramtext {safechar}+
-value {valuechar}+
-quotedstring \"{qsafechar}+\"
-digit [0-9]
-
-%array /* Make yytext an array. Slow, but handy. HACK */
-
-%option caseless
-
-%s quoted_string
-%s binary_value boolean_value uri_value time_value duration_value number_value period_value recur_value text_value utcoffset_value
-%s enum_param_value string_param_value stringlist_param_value keyword line_start component seperator parameter end_of_value paramtext
-
-
-
-%%
-
-%{
-%}
-
-
-<binary_value>{
-.* { yylval.v_string= icalmemory_tmp_copy(yytext);
- return STRING;}
-{crlf} { return EOL;}
-
-}
-
-<boolean_value>{
-. { return CHARACTER; }
-{crlf} { return EOL;}
-
-}
-
-<uri_value>{
-.* { yylval.v_string= icalmemory_tmp_copy(yytext);
- return STRING;}
-{crlf} { return EOL;}
-
-}
-
-
-<time_value>{
-{digit}* { yylval.v_string= icalmemory_tmp_copy(yytext);
- return DIGITS; }
-T { return TIME_CHAR; }
-Z { return UTC_CHAR; }
-{crlf} { return EOL;}
-. { return CHARACTER; }
-
-}
-
-<duration_value>{
-{digit}+ { yylval.v_string =icalmemory_tmp_copy(yytext);
- return DIGITS; }
-T { return TIME_CHAR; }
-[\+\-PTWHMSD] { return yytext[0]; }
-{crlf} { return EOL;}
-
-}
-
-<number_value>{
-[\+\-\.0-9]+ { yylval.v_int=atoi(yytext); return INTNUMBER; }
-{crlf} { return EOL;}
-. { return CHARACTER; }
-
-}
-
-<period_value>{
-{digit}+ { yylval.v_string =icalmemory_tmp_copy(yytext) ;
- return DIGITS; }
-T { return TIME_CHAR; }
-Z { return UTC_CHAR; }
-[\/\+\-PWHMSD] { return yytext[0]; }
-{crlf} { return EOL;}
-
-}
-
-<recur_value>{
-INTERVAL { return INTERVAL; }
-COUNT { return COUNT; }
-UNTIL { return UNTIL; }
-FREQ { return FREQ; }
-BYDAY { return BYDAY; }
-BYHOUR { return BYHOUR; }
-BYMINUTE { return BYMINUTE; }
-BYMONTH { return BYMONTH; }
-BYMONTHDAY { return BYMONTHDAY; }
-BYSECOND { return BYSECOND; }
-BYSETPOS { return BYSETPOS; }
-BYWEEKNO { return BYWEEKNO; }
-BYYEARDAY { return BYYEARDAY; }
-DAILY { return DAILY; }
-SECONDLY { return SECONDLY; }
-MINUTELY { return MINUTELY; }
-HOURLY { return HOURLY; }
-MONTHLY { return MONTHLY; }
-WEEKLY { return WEEKLY; }
-YEARLY { return YEARLY; }
-WKST { return WKST; }
-MO { return MO; }
-SA { return SA; }
-SU { return SU; }
-TU { return TU; }
-WE { return WE; }
-TH { return TH; }
-FR { return FR; }
-= { return EQUALS; }
-, { return COMMA; }
-; { return SEMICOLON; }
-[\-\+0-9]+ { yylval.v_string= icalmemory_tmp_copy(yytext);
- return DIGITS; }
-T { return TIME_CHAR; }
-Z { return UTC_CHAR; }
-{crlf} { return EOL;}
-}
-
-<utcoffset_value>{
-{crlf} { return EOL;}
-\-|\+ { return yytext[0]; }
-{digit}{digit} { yylval.v_int=atoi(yytext); return INTNUMBER; }
-
-}
-
-<enum_param_value>{
-. { return CHARACTER; }
-{crlf} { return EOL;}
-
-}
-
-<seperator>{
-, { BEGIN(last_state); return COMMA; }
-}
-
-
-%%
-
-int yywrap()
-{
- return 1;
-}
-
-
-void set_parser_value_state(icalvalue_kind kind)
-{
-
- switch (kind){
-
- case ICAL_ATTACH_VALUE:
- case ICAL_BINARY_VALUE:
- {BEGIN(binary_value);break;}
-
- case ICAL_BOOLEAN_VALUE:
- case ICAL_INTEGER_VALUE:
- case ICAL_FLOAT_VALUE:
- {BEGIN(number_value);break;}
-
- case ICAL_UTCOFFSET_VALUE:
- {BEGIN(utcoffset_value);break;}
-
- case ICAL_TEXT_VALUE:
- {BEGIN(text_value);
- init_str_buf();
- break;}
-
- case ICAL_CALADDRESS_VALUE:
- case ICAL_URI_VALUE:
- {BEGIN(uri_value);break;}
-
- case ICAL_DATE_VALUE:
- case ICAL_DATETIME_VALUE:
- case ICAL_DATETIMEDATE_VALUE:
- case ICAL_DATETIMEPERIOD_VALUE:
- case ICAL_TIME_VALUE:
- {BEGIN(time_value);break;}
-
- case ICAL_DURATION_VALUE:
- {BEGIN(duration_value);break;}
-
- case ICAL_PERIOD_VALUE:
- {BEGIN(period_value);break;}
-
- case ICAL_GEO_VALUE:
- case ICAL_QUERY_VALUE:
- {BEGIN(text_value);break;}
-
- case ICAL_RECUR_VALUE:
- {BEGIN(recur_value);break;}
-
- case ICAL_NO_VALUE:
- {
- /* The value is probably actually a component name */
- {BEGIN(component); break;}
- }
- default:
- {
- assert(1==0);
- }
- }
-}
-
-void init_str_buf()
-{
- str_buf = icalmemory_tmp_buffer(ICAL_MAX_STR_CONST);
- str_buf_p = str_buf;
- buf_sz = ICAL_MAX_STR_CONST;
-
-
-}
-
diff --git a/libical/src/libical/icalmemory.c b/libical/src/libical/icalmemory.c
deleted file mode 100644
index 35544b14ee..0000000000
--- a/libical/src/libical/icalmemory.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalmemory.c
- CREATOR: eric 30 June 1999
-
- $Id$
- $Locker$
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is icalmemory.h
- The Initial Developer of the Original Code is Eric Busboom
-
- (C) COPYRIGHT 1999 The Software Studio.
- http://www.softwarestudio.org
-
- ======================================================================*/
-
-/* libical often passes strings back to the caller. To make these
- * interfaces simple, I did not want the caller to have to pass in a
- * memory buffer, but having libical pass out newly allocated memory
- * makes it difficult to de-allocate the memory.
- *
- * The ring buffer in this scheme makes it possible for libical to pass
- * out references to memory which the caller does not own, and be able
- * to de-allocate the memory later. The ring allows libical to have
- * several buffers active simultaneously, which is handy when creating
- * string representations of components. */
-
-#define ICALMEMORY_C
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-
-#include "icalmemory.h"
-#include "icalerror.h"
-
-#include <stdio.h> /* for printf (debugging) */
-#include <stdlib.h> /* for malloc, realloc */
-#include <string.h> /* for memset() */
-
-#define BUFFER_RING_SIZE 25
-#define MIN_BUFFER_SIZE 200
-
-void* buffer_ring[BUFFER_RING_SIZE+1];
-int buffer_pos = 0;
-int initialized = 0;
-
-/* Create a new temporary buffer on the ring. Libical owns these and wil deallocate them. */
-void*
-icalmemory_tmp_buffer (size_t size)
-{
- void *rtrn;
- /* I don't think I need this -- I think static arrays are
- initialized to 0 as a standard part of C, but I am not sure. */
-
- if (initialized == 0){
- int i;
- for(i=0; i<BUFFER_RING_SIZE; i++){
- buffer_ring[i] = 0;
- }
- initialized = 1;
- }
-
- /* Ideally, this routine would re-use an existing buffer if it is
- larger than the requested buffer. Maybe later.... */
-
- if (size < MIN_BUFFER_SIZE){
- size = MIN_BUFFER_SIZE;
- }
-
- if ( buffer_ring[buffer_pos] != 0){
- /*sprintf(buffer_ring[buffer_pos], "***DEALLOCATED MEMORY***: %d",buffer_pos);*/
- free( buffer_ring[buffer_pos]);
- buffer_ring[buffer_pos] = 0;
- }
-
-
- rtrn = buffer_ring[buffer_pos] = (void*)malloc(size);
-
- memset(rtrn,0,size);
-
- if(++buffer_pos > BUFFER_RING_SIZE){
- buffer_pos = 0;
- }
-
- return rtrn;
-}
-
-void icalmemory_free_ring()
-{
-
- int i;
- for(i=0; i<BUFFER_RING_SIZE; i++){
- if ( buffer_ring[i] != 0){
- free( buffer_ring[i]);
- }
- buffer_ring[i] = 0;
- }
-
- initialized = 1;
-
-}
-
-/* Like strdup, but the buffer is on the ring. */
-char*
-icalmemory_tmp_copy(char* str)
-{
- char* b = icalmemory_tmp_buffer(strlen(str)+1);
-
- strcpy(b,str);
-
- return b;
-}
-
-
-
-void
-icalmemory_free_tmp_buffer (void* buf)
-{
- if(buf == 0)
- {
- return;
- }
-
- free(buf);
-}
-
-
-/* These buffer routines create memory the old fashioned way -- so the caller will have to delocate the new memory */
-
-void* icalmemory_new_buffer(size_t size)
-{
- /* HACK. need to handle out of memory case */
- void *b = malloc(size);
-
- memset(b,0,size);
-
- return b;
-}
-
-void* icalmemory_resize_buffer(void* buf, size_t size)
-{
- /* HACK. need to handle out of memory case */
-
- return realloc(buf, size);
-}
-
-void icalmemory_free_buffer(void* buf)
-{
- free(buf);
-}
-
-void
-icalmemory_append_string(char** buf, char** pos, size_t* buf_size,
- char* string)
-{
- char *new_buf;
- char *new_pos;
-
- size_t data_length, final_length, string_length;
-
-#ifndef ICAL_NO_INTERNAL_DEBUG
- icalerror_check_arg_rv( (buf!=0),"buf");
- icalerror_check_arg_rv( (*buf!=0),"*buf");
- icalerror_check_arg_rv( (pos!=0),"pos");
- icalerror_check_arg_rv( (*pos!=0),"*pos");
- icalerror_check_arg_rv( (buf_size!=0),"buf_size");
- icalerror_check_arg_rv( (*buf_size!=0),"*buf_size");
- icalerror_check_arg_rv( (string!=0),"string");
-#endif
-
- string_length = strlen(string);
- data_length = (size_t)*pos - (size_t)*buf;
- final_length = data_length + string_length;
-
- if ( final_length >= (size_t) *buf_size) {
-
-
- *buf_size = (*buf_size) * 2 + final_length;
-
- new_buf = realloc(*buf,*buf_size);
-
- new_pos = (void*)((size_t)new_buf + data_length);
-
- *pos = new_pos;
- *buf = new_buf;
- }
-
- strcpy(*pos, string);
-
- *pos += string_length;
-}
-
-
-void
-icalmemory_append_char(char** buf, char** pos, size_t* buf_size,
- char ch)
-{
- char *new_buf;
- char *new_pos;
-
- size_t data_length, final_length;
-
-#ifndef ICAL_NO_INTERNAL_DEBUG
- icalerror_check_arg_rv( (buf!=0),"buf");
- icalerror_check_arg_rv( (*buf!=0),"*buf");
- icalerror_check_arg_rv( (pos!=0),"pos");
- icalerror_check_arg_rv( (*pos!=0),"*pos");
- icalerror_check_arg_rv( (buf_size!=0),"buf_size");
- icalerror_check_arg_rv( (*buf_size!=0),"*buf_size");
-#endif
-
- data_length = (size_t)*pos - (size_t)*buf;
-
- final_length = data_length + 2;
-
- if ( final_length > (size_t) *buf_size ) {
-
-
- *buf_size = (*buf_size) * 2 + final_length +1;
-
- new_buf = realloc(*buf,*buf_size);
-
- new_pos = (void*)((size_t)new_buf + data_length);
-
- *pos = new_pos;
- *buf = new_buf;
- }
-
- **pos = ch;
- *pos += 1;
-
-}
diff --git a/libical/src/libical/icalmemory.h b/libical/src/libical/icalmemory.h
deleted file mode 100644
index 26d22b7316..0000000000
--- a/libical/src/libical/icalmemory.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalmemory.h
- CREATOR: eric 30 June 1999
-
-
- $Id$
- $Locker$
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is icalmemory.h
- The Initial Developer of the Original Code is Eric Busboom
-
- (C) COPYRIGHT 1999 The Software Studio.
- http://www.softwarestudio.org
-
-======================================================================*/
-
-#ifndef ICALMEMORY_H
-#define ICALMEMORY_H
-
-#include <sys/types.h> /* for size_t */
-
-/* Tmp buffers are managed by ical. References can be returned to the caller, although the caller will not own the memory. */
-
-void* icalmemory_tmp_buffer(size_t size);
-char* icalmemory_tmp_copy(char* str);
-
-/* Add an externally allocated buffer to the ring. */
-void icalmemory_add_tmp_buffer(void*);
-
-
-/* Free all memory used in the ring */
-void icalmemory_free_ring();
-
-/* Non-tmp buffers must be freed. These are mostly wrappers around
- * malloc, etc, but are used so the caller can change the memory
- * allocators in a future version of the library */
-
-void* icalmemory_new_buffer(size_t size);
-void* icalmemory_resize_buffer(void* buf, size_t size);
-void icalmemory_free_buffer(void* buf);
-
-/* icalmemory_append_string will copy the string 'string' to the
- buffer 'buf' starting at position 'pos', reallocing 'buf' if it is
- too small. 'buf_size' is the size of 'buf' and will be changed if
- 'buf' is reallocated. 'pos' will point to the last byte of the new
- string in 'buf', usually a '\0' */
-
-/* THESE ROUTINES CAN NOT BE USED ON TMP BUFFERS. Only use them on
- normally allocated memory, or on buffers created from
- icalmemory_new_buffer, never with buffers created by
- icalmemory_tmp_buffer. If icalmemory_append_string has to resize a
- buffer on the ring, the ring will loose track of it an you will
- have memory problems. */
-
-void icalmemory_append_string(char** buf, char** pos, size_t* buf_size,
- char* string);
-
-/* icalmemory_append_char is similar, but is appends a character instead of a string */
-void icalmemory_append_char(char** buf, char** pos, size_t* buf_size,
- char ch);
-
-#endif /* !ICALMEMORY_H */
-
-
-
diff --git a/libical/src/libical/icalparameter.c b/libical/src/libical/icalparameter.c
deleted file mode 100644
index cf37eb07b2..0000000000
--- a/libical/src/libical/icalparameter.c
+++ /dev/null
@@ -1,1913 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalderivedparameters.{c,h}
- CREATOR: eric 09 May 1999
-
- $Id$
- $Locker$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalderivedparameters.{c,h}
-
- Contributions from:
- Graham Davison (g.m.davison@computer.org)
-
- ======================================================================*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "ical.h"
-#include "icalerror.h"
-#include <stdlib.h> /* for malloc() */
-#include <errno.h>
-#include <string.h> /* for memset() */
-#include "icalmemory.h"
-
-struct icalparameter_impl
-{
- icalparameter_kind kind;
- char id[5];
- int size;
- char* string;
- char* x_name;
- icalproperty* parent;
-
- union data {
- int v_int;
- int v_rsvp;
- icalparameter_cutype v_cutype;
- icalparameter_encoding v_encoding;
- icalparameter_fbtype v_fbtype;
- icalparameter_partstat v_partstat;
- icalparameter_range v_range;
- icalparameter_related v_related;
- icalparameter_reltype v_reltype;
- icalparameter_role v_role;
- icalparameter_value v_value;
- icalparameter_xlicerrortype v_xlicerrortype;
- icalparameter_xliccomparetype v_xliccomparetype;
- } data;
-};
-
-struct icalparameter_impl* icalparameter_new_impl(icalparameter_kind kind)
-{
- struct icalparameter_impl* v;
-
- if ( ( v = (struct icalparameter_impl*)
- malloc(sizeof(struct icalparameter_impl))) == 0) {
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
- }
-
- strcpy(v->id,"para");
-
- v->kind = kind;
- v->size = 0;
- v->string = 0;
- v->x_name = 0;
- v->parent = 0;
- memset(&(v->data),0,sizeof(v->data));
-
- return v;
-}
-
-icalparameter*
-icalparameter_new (icalparameter_kind kind)
-{
- struct icalparameter_impl* v = icalparameter_new_impl(kind);
-
- return (icalparameter*) v;
-
-}
-
-icalparameter*
-icalparameter_new_clone(icalparameter* param)
-{
- struct icalparameter_impl *old;
- struct icalparameter_impl *new;
-
- old = (struct icalparameter_impl *)param;
- new = icalparameter_new_impl(old->kind);
-
- icalerror_check_arg_rz((param!=0),"param");
-
- if (new == 0){
- return 0;
- }
-
- memcpy(new,old,sizeof(struct icalparameter_impl));
-
- if (old->string != 0){
- new->string = strdup(old->string);
- if (new->string == 0){
- icalparameter_free(new);
- return 0;
- }
- }
-
- if (old->x_name != 0){
- new->x_name = strdup(old->x_name);
- if (new->x_name == 0){
- icalparameter_free(new);
- return 0;
- }
- }
-
- return new;
-}
-
-
-icalparameter* icalparameter_new_from_string(icalparameter_kind kind, char* val)
-{
-
- icalparameter* param=0;
-
- icalerror_check_arg_rz((val!=0),"val");
-
- switch (kind) {
- case ICAL_ALTREP_PARAMETER:
- {
- param = icalparameter_new_altrep(val);
-
- break;
- }
- case ICAL_CN_PARAMETER:
- {
- param = icalparameter_new_cn(val);
-
- break;
- }
- case ICAL_CUTYPE_PARAMETER:
- {
- if(strcmp(val,"INDIVIDUAL") == 0){
- param = icalparameter_new_cutype(ICAL_CUTYPE_INDIVIDUAL);
- }
- else if(strcmp(val,"GROUP") == 0){
- param = icalparameter_new_cutype(ICAL_CUTYPE_GROUP);
- }
- else if(strcmp(val,"RESOURCE") == 0){
- param = icalparameter_new_cutype(ICAL_CUTYPE_RESOURCE);
- }
- else if(strcmp(val,"ROOM") == 0){
- param = icalparameter_new_cutype(ICAL_CUTYPE_ROOM);
- }
- else if(strcmp(val,"UNKNOWN") == 0){
- param = icalparameter_new_cutype(ICAL_CUTYPE_UNKNOWN);
- }
- else {
- param = icalparameter_new_cutype(ICAL_CUTYPE_XNAME);
- icalparameter_set_xvalue(param,val);
- }
- break;
- }
-
- case ICAL_DELEGATEDFROM_PARAMETER:
- {
- param = icalparameter_new_delegatedfrom(val);
-
- break;
- }
- case ICAL_DELEGATEDTO_PARAMETER:
- {
- param = icalparameter_new_delegatedto(val);
-
- break;
- }
- case ICAL_DIR_PARAMETER:
- {
- param = icalparameter_new_dir(val);
-
- break;
- }
- case ICAL_ENCODING_PARAMETER:
- {
- if(strcmp(val,"BIT8") == 0){
- param = icalparameter_new_encoding(ICAL_ENCODING_8BIT);
- }
- else if(strcmp(val,"BASE64") == 0){
- param = icalparameter_new_encoding(ICAL_ENCODING_BASE64);
- }
- else {
- param = icalparameter_new_encoding(ICAL_ENCODING_XNAME);
- icalparameter_set_xvalue(param,val);
- }
- break;
- }
- case ICAL_FBTYPE_PARAMETER:
- {
- if(strcmp(val,"FREE") == 0){
- param = icalparameter_new_fbtype(ICAL_FBTYPE_FREE);
- }
- else if(strcmp(val,"BUSY") == 0){
- param = icalparameter_new_fbtype(ICAL_FBTYPE_BUSY);
- }
- else if(strcmp(val,"BUSYUNAVAILABLE") == 0){
- param = icalparameter_new_fbtype(ICAL_FBTYPE_BUSYUNAVAILABLE);
- }
- else if(strcmp(val,"BUSYTENTATIVE") == 0){
- param = icalparameter_new_fbtype(ICAL_FBTYPE_BUSYTENTATIVE);
- }
- else {
- param = icalparameter_new_fbtype(ICAL_FBTYPE_XNAME);
- icalparameter_set_xvalue(param,val);
- }
- break;
- }
- case ICAL_FMTTYPE_PARAMETER:
- {
- param = icalparameter_new_fmttype(val);
- break;
- }
- case ICAL_LANGUAGE_PARAMETER:
- {
- param = icalparameter_new_language(val);
-
- break;
- }
- case ICAL_MEMBER_PARAMETER:
- {
- param = icalparameter_new_member(val);
-
- break;
- }
- case ICAL_PARTSTAT_PARAMETER:
- {
- if(strcmp(val,"NEEDSACTION") == 0){
- param = icalparameter_new_partstat(ICAL_PARTSTAT_NEEDSACTION);
- }
- else if(strcmp(val,"ACCEPTED") == 0){
- param = icalparameter_new_partstat(ICAL_PARTSTAT_ACCEPTED);
- }
- else if(strcmp(val,"DECLINED") == 0){
- param = icalparameter_new_partstat(ICAL_PARTSTAT_DECLINED);
- }
- else if(strcmp(val,"TENTATIVE") == 0){
- param = icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE);
- }
- else if(strcmp(val,"DELEGATED") == 0){
- param = icalparameter_new_partstat(ICAL_PARTSTAT_DELEGATED);
- }
- else if(strcmp(val,"COMPLETED") == 0){
- param = icalparameter_new_partstat(ICAL_PARTSTAT_COMPLETED);
- }
- else if(strcmp(val,"INPROCESS") == 0){
- param = icalparameter_new_partstat(ICAL_PARTSTAT_INPROCESS);
- }
- else {
- param = icalparameter_new_partstat(ICAL_PARTSTAT_XNAME);
- icalparameter_set_xvalue(param,val);
- }
- break;
- }
- case ICAL_RANGE_PARAMETER:
- {
- if(strcmp(val,"THISANDFUTURE") == 0){
- param = icalparameter_new_range(ICAL_RANGE_THISANDFUTURE);
- }
- else if(strcmp(val,"THISANDPRIOR") == 0){
- param = icalparameter_new_range(ICAL_RANGE_THISANDPRIOR);
- }
-
- break;
- }
- case ICAL_RELATED_PARAMETER:
- {
- if(strcmp(val,"START") == 0){
- param = icalparameter_new_related(ICAL_RELATED_START);
- }
- else if(strcmp(val,"END") == 0){
- param = icalparameter_new_related(ICAL_RELATED_END);
- }
-
- break;
- }
- case ICAL_RELTYPE_PARAMETER:
- {
- if(strcmp(val,"PARENT") == 0){
- param = icalparameter_new_reltype(ICAL_RELTYPE_PARENT);
- }
- else if(strcmp(val,"CHILD") == 0){
- param = icalparameter_new_reltype(ICAL_RELTYPE_CHILD);
- }
- else if(strcmp(val,"SIBLING") == 0){
- param = icalparameter_new_reltype(ICAL_RELTYPE_SIBLING);
- }
- else {
- param = icalparameter_new_reltype(ICAL_RELTYPE_XNAME);
- icalparameter_set_xvalue(param,val);
- }
- break;
- }
- case ICAL_ROLE_PARAMETER:
- {
- if(strcmp(val,"CHAIR") == 0){
- param = icalparameter_new_role(ICAL_ROLE_CHAIR);
- }
- else if(strcmp(val,"REQ-PARTICIPANT") == 0){
- param = icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT);
- }
- else if(strcmp(val,"OPT-PARTICIPANT") == 0){
- param = icalparameter_new_role(ICAL_ROLE_OPTPARTICIPANT);
- }
- else if(strcmp(val,"NON-PARTICIPANT") == 0){
- param = icalparameter_new_role(ICAL_ROLE_NONPARTICIPANT);
- }
- else {
- param = icalparameter_new_role(ICAL_ROLE_XNAME);
- icalparameter_set_xvalue(param,val);
- }
- break;
- }
- case ICAL_RSVP_PARAMETER:
- {
- if(strcmp(val,"TRUE") == 0){
- param = icalparameter_new_rsvp(1);
- }
- else if(strcmp(val,"FALSE") == 0){
- param = icalparameter_new_rsvp(0);
- }
-
- break;
- }
- case ICAL_SENTBY_PARAMETER:
- {
- param = icalparameter_new_sentby(val);
-
- break;
- }
- case ICAL_TZID_PARAMETER:
- {
- param = icalparameter_new_tzid(val);
-
- break;
- }
- case ICAL_VALUE_PARAMETER:
- {
- if(strcmp(val,"BINARY") == 0){
- param = icalparameter_new_value(ICAL_VALUE_BINARY);
- }
- else if(strcmp(val,"BOOLEAN") == 0){
- param = icalparameter_new_value(ICAL_VALUE_BOOLEAN);
- }
- else if(strcmp(val,"CAL-ADDRESS") == 0){
- param = icalparameter_new_value(ICAL_VALUE_CALADDRESS);
- }
- else if(strcmp(val,"DATE") == 0){
- param = icalparameter_new_value(ICAL_VALUE_DATE);
- }
- else if(strcmp(val,"DATE-TIME") == 0){
- param = icalparameter_new_value(ICAL_VALUE_DATETIME);
- }
- else if(strcmp(val,"DURATION") == 0){
- param = icalparameter_new_value(ICAL_VALUE_DURATION);
- }
- else if(strcmp(val,"FLOAT") == 0){
- param = icalparameter_new_value(ICAL_VALUE_FLOAT);
- }
- else if(strcmp(val,"INTEGER") == 0){
- param = icalparameter_new_value(ICAL_VALUE_INTEGER);
- }
- else if(strcmp(val,"PERIOD") == 0){
- param = icalparameter_new_value(ICAL_VALUE_PERIOD);
- }
- else if(strcmp(val,"RECUR") == 0){
- param = icalparameter_new_value(ICAL_VALUE_RECUR);
- }
- else if(strcmp(val,"TEXT") == 0){
- param = icalparameter_new_value(ICAL_VALUE_TEXT);
- }
- else if(strcmp(val,"TIME") == 0){
- param = icalparameter_new_value(ICAL_VALUE_TIME);
- }
- else if(strcmp(val,"URI") == 0){
- param = icalparameter_new_value(ICAL_VALUE_URI);
- }
- else if(strcmp(val,"UTC-OFFSET") == 0){
- param = icalparameter_new_value(ICAL_VALUE_UTCOFFSET);
- }
- else {
- param = 0;
- }
- break;
- }
- case ICAL_XLICERRORTYPE_PARAMETER:
- {
-
- if(strcmp(val,"COMPONENT_PARSE_ERROR") == 0){
- param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
- }
- else if(strcmp(val,"PROPERTY_PARSE_ERROR") == 0){
- param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_PROPERTYPARSEERROR);
- }
- else if(strcmp(val,"PARAMETER_NAME_PARSE_ERROR") == 0){
- param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR);
- }
- else if(strcmp(val,"PARAMETER_VALUE_PARSE_ERROR") == 0){
- param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR);
- }
- else if(strcmp(val,"VALUE_PARSE_ERROR") == 0){
- param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_VALUEPARSEERROR);
- }
- else if(strcmp(val,"INVALID_ITIP") == 0){
- param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP);
- }
- break;
- }
-
- case ICAL_XLICCOMPARETYPE_PARAMETER:
- {
-
- if(strcmp(val,"EQUAL") == 0){
- param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL);
- }
- else if(strcmp(val,"NOTEQUAL") == 0){
- param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_NOTEQUAL);
- }
- else if(strcmp(val,"LESS") == 0){
- param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_LESS);
- }
- else if(strcmp(val,"GREATER") == 0){
- param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_GREATER);
- }
- else if(strcmp(val,"LESSEQUAL") == 0){
- param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_LESSEQUAL);
- }
- else if(strcmp(val,"GREATEREQUAL") == 0){
- param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_GREATEREQUAL);
- }
- else if(strcmp(val,"REGEX") == 0){
- param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_REGEX);
- } else {
- param = 0;
- }
- break;
- }
-
-
- case ICAL_X_PARAMETER:
- {
- param = icalparameter_new(ICAL_FBTYPE_PARAMETER);
- icalparameter_set_xvalue(param,val);
- break;
- }
-
- case ICAL_NO_PARAMETER:
- default:
- {
- return 0;
- }
-
-
- }
-
- return param;
-}
-
-void
-icalparameter_free (icalparameter* parameter)
-{
- struct icalparameter_impl * impl;
-
- impl = (struct icalparameter_impl*)parameter;
-
-/* HACK. This always triggers, even when parameter is non-zero
- icalerror_check_arg_rv((parameter==0),"parameter");*/
-
-
-#ifdef ICAL_FREE_ON_LIST_IS_ERROR
- icalerror_assert( (impl->parent ==0),"Tried to free a parameter that is still attached to a component. ");
-
-#else
- if(impl->parent !=0){
- return;
- }
-#endif
-
-
- if (impl->string != 0){
- free (impl->string);
- }
-
- if (impl->x_name != 0){
- free (impl->x_name);
- }
-
- memset(impl,0,sizeof(impl));
-
- impl->parent = 0;
- impl->id[0] = 'X';
- free(impl);
-}
-
-
-char no_parameter[]="Error: No Parameter";
-char*
-icalparameter_as_ical_string (icalparameter* parameter)
-{
- struct icalparameter_impl* impl;
- size_t buf_size = 1024;
- char* buf;
- char* buf_ptr;
- char *out_buf;
- char *kind_string;
-
- char tend[1024]; /* HACK . Should be using memory buffer ring */
-
- icalerror_check_arg_rz( (parameter!=0), "parameter");
-
- /* Create new buffer that we can append names, parameters and a
- value to, and reallocate as needed. Later, this buffer will be
- copied to a icalmemory_tmp_buffer, which is managed internally
- by libical, so it can be given to the caller without fear of
- the caller forgetting to free it */
-
- buf = icalmemory_new_buffer(buf_size);
- buf_ptr = buf;
- impl = (struct icalparameter_impl*)parameter;
-
- kind_string = icalenum_parameter_kind_to_string(impl->kind);
-
- if (impl->kind == ICAL_NO_PARAMETER ||
- impl->kind == ICAL_ANY_PARAMETER ||
- kind_string == 0)
- {
- icalerror_set_errno(ICAL_BADARG_ERROR);
- return 0;
- }
-
- /* Put the parameter name into the string */
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, "=");
-
- switch (impl->kind) {
- case ICAL_CUTYPE_PARAMETER:
- {
- switch (impl->data.v_cutype) {
- case ICAL_CUTYPE_INDIVIDUAL: {
- strcpy(tend,"INDIVIDUAL");break;
- }
- case ICAL_CUTYPE_GROUP:{
- strcpy(tend,"GROUP");break;
- }
- case ICAL_CUTYPE_RESOURCE: {
- strcpy(tend,"RESOURCE");break;
- }
- case ICAL_CUTYPE_ROOM:{
- strcpy(tend,"ROOM");break;
- }
- case ICAL_CUTYPE_UNKNOWN:{
- strcpy(tend,"UNKNOWN");break;
- }
- case ICAL_CUTYPE_XNAME:{
- if (impl->string == 0){ return no_parameter;}
- strcpy(tend,impl->string);break;
- }
- default:{
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- }
- break;
-
- }
- case ICAL_ENCODING_PARAMETER:
- {
- switch (impl->data.v_encoding) {
- case ICAL_ENCODING_8BIT: {
- strcpy(tend,"8BIT");break;
- }
- case ICAL_ENCODING_BASE64:{
- strcpy(tend,"BASE64");break;
- }
- default:{
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- }
- break;
- }
-
- case ICAL_FBTYPE_PARAMETER:
- {
- switch (impl->data.v_fbtype) {
- case ICAL_FBTYPE_FREE:{
- strcpy(tend,"FREE");break;
- }
- case ICAL_FBTYPE_BUSY: {
- strcpy(tend,"BUSY");break;
- }
- case ICAL_FBTYPE_BUSYUNAVAILABLE:{
- strcpy(tend,"BUSYUNAVAILABLE");break;
- }
- case ICAL_FBTYPE_BUSYTENTATIVE:{
- strcpy(tend,"BUSYTENTATIVE");break;
- }
- case ICAL_FBTYPE_XNAME:{
- if (impl->string == 0){ return no_parameter;}
- strcpy(tend,impl->string);break;
- }
- default:{
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- }
- break;
-
- }
- case ICAL_PARTSTAT_PARAMETER:
- {
- switch (impl->data.v_partstat) {
- case ICAL_PARTSTAT_NEEDSACTION: {
- strcpy(tend,"NEEDSACTION");break;
- }
- case ICAL_PARTSTAT_ACCEPTED: {
- strcpy(tend,"ACCEPTED");break;
- }
- case ICAL_PARTSTAT_DECLINED:{
- strcpy(tend,"DECLINED");break;
- }
- case ICAL_PARTSTAT_TENTATIVE:{
- strcpy(tend,"TENTATIVE");break;
- }
- case ICAL_PARTSTAT_DELEGATED:{
- strcpy(tend,"DELEGATED");break;
- }
- case ICAL_PARTSTAT_COMPLETED:{
- strcpy(tend,"COMPLETED");break;
- }
- case ICAL_PARTSTAT_INPROCESS:{
- strcpy(tend,"INPROCESS");break;
- }
- case ICAL_PARTSTAT_XNAME:{
- if (impl->string == 0){ return no_parameter;}
- strcpy(tend,impl->string);break;
- }
- default:{
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- }
- break;
-
- }
- case ICAL_RANGE_PARAMETER:
- {
- switch (impl->data.v_range) {
- case ICAL_RANGE_THISANDPRIOR: {
- strcpy(tend,"THISANDPRIOR");break;
- }
- case ICAL_RANGE_THISANDFUTURE: {
- strcpy(tend,"THISANDFUTURE");break;
- }
- default:{
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- }
- break;
- }
- case ICAL_RELATED_PARAMETER:
- {
- switch (impl->data.v_related) {
- case ICAL_RELATED_START: {
- strcpy(tend,"START");break;
- }
- case ICAL_RELATED_END: {
- strcpy(tend,"END");break;
- }
- default:{
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- }
- break;
- }
- case ICAL_RELTYPE_PARAMETER:
- {
- switch (impl->data.v_reltype) {
- case ICAL_RELTYPE_PARENT: {
- strcpy(tend,"PARENT");break;
- }
- case ICAL_RELTYPE_CHILD:{
- strcpy(tend,"CHILD");break;
- }
- case ICAL_RELTYPE_SIBLING:{
- strcpy(tend,"SIBLING");break;
- }
- case ICAL_RELTYPE_XNAME:{
- if (impl->string == 0){ return no_parameter;}
- strcpy(tend,impl->string);break;
- }
- default:{
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- }
- break;
- }
- case ICAL_ROLE_PARAMETER:
- {
- switch (impl->data.v_role) {
- case ICAL_ROLE_CHAIR: {
- strcpy(tend,"CHAIR");break;
- }
- case ICAL_ROLE_REQPARTICIPANT: {
- strcpy(tend,"REQ-PARTICIPANT");break;
- }
- case ICAL_ROLE_OPTPARTICIPANT: {
- strcpy(tend,"OPT-PARTICIPANT");break;
- }
- case ICAL_ROLE_NONPARTICIPANT: {
- strcpy(tend,"NON-PARTICIPANT");break;
- }
- case ICAL_ROLE_XNAME:{
- if (impl->string == 0){ return no_parameter;}
- strcpy(tend,impl->string);break;
- }
- default:{
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- }
- break;
- }
- case ICAL_RSVP_PARAMETER:
- {
- switch (impl->data.v_rsvp) {
- case 1: {
- strcpy(tend,"TRUE");break;
- }
- case 0: {
- strcpy(tend,"FALSE");break;
- }
- default:{
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- }
- break;
- }
- case ICAL_VALUE_PARAMETER:
- {
- switch (impl->data.v_value) {
- case ICAL_VALUE_BINARY: {
- strcpy(tend,"BINARY");break;
- }
- case ICAL_VALUE_BOOLEAN: {
- strcpy(tend,"BOOLEAN");break;
- }
- case ICAL_VALUE_CALADDRESS: {
- strcpy(tend,"CAL-ADDRESS");break;
- }
- case ICAL_VALUE_DATE: {
- strcpy(tend,"DATE");break;
- }
- case ICAL_VALUE_DATETIME: {
- strcpy(tend,"DATE-TIME");break;
- }
- case ICAL_VALUE_DURATION: {
- strcpy(tend,"DURATION");break;
- }
- case ICAL_VALUE_FLOAT: {
- strcpy(tend,"FLOAT");break;
- }
- case ICAL_VALUE_INTEGER: {
- strcpy(tend,"INTEGER");break;
- }
- case ICAL_VALUE_PERIOD: {
- strcpy(tend,"PERIOD");break;
- }
- case ICAL_VALUE_RECUR: {
- strcpy(tend,"RECUR");break;
- }
- case ICAL_VALUE_TEXT: {
- strcpy(tend,"TEXT");break;
- }
- case ICAL_VALUE_TIME: {
- strcpy(tend,"TIME");break;
- }
- case ICAL_VALUE_URI: {
- strcpy(tend,"URI");break;
- }
- case ICAL_VALUE_UTCOFFSET: {
- strcpy(tend,"UTC-OFFSET");break;
- }
- case ICAL_VALUE_XNAME: {
- if (impl->string == 0){ return no_parameter;}
- strcpy(tend,impl->string);break;
- }
- default:{
- strcpy(tend,"ERROR");
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- }
- break;
- }
-
-
- case ICAL_XLICERRORTYPE_PARAMETER:
- {
- switch (impl->data.v_xlicerrortype) {
- case ICAL_XLICERRORTYPE_COMPONENTPARSEERROR:
- {
- strcpy(tend,"COMPONENT_PARSE_ERROR");break;
- }
- case ICAL_XLICERRORTYPE_PROPERTYPARSEERROR:
- {
- strcpy(tend,"PROPERTY_PARSE_ERROR");break;
- }
- case ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR:
- {
- strcpy(tend,"PARAMETER_NAME_PARSE_ERROR");break;
- }
- case ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR:
- {
- strcpy(tend,"PARAMETER_VALUE_PARSE_ERROR");break;
- }
- case ICAL_XLICERRORTYPE_VALUEPARSEERROR:
- {
- strcpy(tend,"VALUE_PARSE_ERROR");break;
- }
- case ICAL_XLICERRORTYPE_INVALIDITIP:
- {
- strcpy(tend,"INVALID_ITIP");break;
- }
- }
- break;
- }
-
- case ICAL_XLICCOMPARETYPE_PARAMETER:
- {
- switch (impl->data.v_xliccomparetype) {
- case ICAL_XLICCOMPARETYPE_EQUAL:
- {
- strcpy(tend,"EQUAL");break;
- }
- case ICAL_XLICCOMPARETYPE_NOTEQUAL:
- {
- strcpy(tend,"NOTEQUAL");break;
- }
- case ICAL_XLICCOMPARETYPE_LESS:
- {
- strcpy(tend,"LESS");break;
- }
- case ICAL_XLICCOMPARETYPE_GREATER:
- {
- strcpy(tend,"GREATER");break;
- }
- case ICAL_XLICCOMPARETYPE_LESSEQUAL:
- {
- strcpy(tend,"LESSEQUAL");break;
- }
- case ICAL_XLICCOMPARETYPE_GREATEREQUAL:
- {
- strcpy(tend,"GREATEREQUAL");break;
- }
- case ICAL_XLICCOMPARETYPE_REGEX:
- {
- strcpy(tend,"REGEX");break;
- }
- break;
- }
-
- default:{
- icalerror_set_errno(ICAL_BADARG_ERROR);break;
- }
- break;
- }
-
-
- case ICAL_SENTBY_PARAMETER:
- case ICAL_TZID_PARAMETER:
- case ICAL_X_PARAMETER:
- case ICAL_FMTTYPE_PARAMETER:
- case ICAL_LANGUAGE_PARAMETER:
- case ICAL_MEMBER_PARAMETER:
- case ICAL_DELEGATEDFROM_PARAMETER:
- case ICAL_DELEGATEDTO_PARAMETER:
- case ICAL_DIR_PARAMETER:
- case ICAL_ALTREP_PARAMETER:
- case ICAL_CN_PARAMETER:
- {
- if (impl->string == 0){ return no_parameter;}
- strcpy(tend,impl->string);break;
- break;
- }
-
- case ICAL_NO_PARAMETER:
- case ICAL_ANY_PARAMETER:
- {
- /* These are actually handled before the case/switch
- clause */
- }
-
- }
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, tend);
-
- /* Now, copy the buffer to a tmp_buffer, which is safe to give to
- the caller without worring about de-allocating it. */
-
-
- out_buf = icalmemory_tmp_buffer(strlen(buf));
- strcpy(out_buf, buf);
-
- icalmemory_free_buffer(buf);
-
- return out_buf;
-
-}
-
-
-int
-icalparameter_is_valid (icalparameter* parameter);
-
-
-icalparameter_kind
-icalparameter_isa (icalparameter* parameter)
-{
- if(parameter == 0){
- return ICAL_NO_PARAMETER;
- }
-
- return ((struct icalparameter_impl *)parameter)->kind;
-}
-
-
-int
-icalparameter_isa_parameter (void* parameter)
-{
- struct icalparameter_impl *impl = (struct icalparameter_impl *)parameter;
-
- if (parameter == 0){
- return 0;
- }
-
- if (strcmp(impl->id,"para") == 0) {
- return 1;
- } else {
- return 0;
- }
-}
-
-
-void
-icalparameter_set_xname (icalparameter* param, char* v)
-{
- struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
- icalerror_check_arg_rv( (param!=0),"param");
- icalerror_check_arg_rv( (v!=0),"v");
-
- if (impl->x_name != 0){
- free(impl->x_name);
- }
-
- impl->x_name = strdup(v);
-
- if (impl->x_name == 0){
- errno = ENOMEM;
- }
-
-}
-
-char*
-icalparameter_get_xname (icalparameter* param)
-{
- struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
- icalerror_check_arg_rz( (param!=0),"param");
-
- return impl->x_name;
-}
-
-void
-icalparameter_set_xvalue (icalparameter* param, char* v)
-{
- struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
-
- icalerror_check_arg_rv( (param!=0),"param");
- icalerror_check_arg_rv( (v!=0),"v");
-
- if (impl->string != 0){
- free(impl->string);
- }
-
- impl->string = strdup(v);
-
- if (impl->string == 0){
- errno = ENOMEM;
- }
-
-}
-
-char*
-icalparameter_get_xvalue (icalparameter* param)
-{
- struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
-
- icalerror_check_arg_rz( (param!=0),"param");
-
- return impl->string;
-
-}
-
-void icalparameter_set_parent(icalparameter* param,
- icalproperty* property)
-{
- struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
-
- icalerror_check_arg_rv( (param!=0),"param");
-
- impl->parent = property;
-}
-
-icalproperty* icalparameter_get_parent(icalparameter* param)
-{
- struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
-
- icalerror_check_arg_rv( (param!=0),"param");
-
- return impl->parent;
-}
-
-
-/* Everything below this line is machine generated. Do not edit. */
-/* ALTREP */
-icalparameter* icalparameter_new_altrep(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_ALTREP_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_altrep((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_altrep(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_altrep(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* CN */
-icalparameter* icalparameter_new_cn(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_CN_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_cn((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_cn(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_cn(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* CUTYPE */
-icalparameter* icalparameter_new_cutype(icalparameter_cutype v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_CUTYPE_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_cutype((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_cutype icalparameter_get_cutype(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
- if ( ((struct icalparameter_impl*)param)->string != 0){
- return ICAL_CUTYPE_XNAME;
- }
-
- return ((struct icalparameter_impl*)param)->data.v_cutype;
-
-}
-
-void icalparameter_set_cutype(icalparameter* param, icalparameter_cutype v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_cutype = v;
-}
-
-/* DELEGATED-FROM */
-icalparameter* icalparameter_new_delegatedfrom(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_DELEGATEDFROM_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_delegatedfrom((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_delegatedfrom(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_delegatedfrom(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* DELEGATED-TO */
-icalparameter* icalparameter_new_delegatedto(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_DELEGATEDTO_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_delegatedto((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_delegatedto(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_delegatedto(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* DIR */
-icalparameter* icalparameter_new_dir(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_DIR_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_dir((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_dir(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_dir(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* ENCODING */
-icalparameter* icalparameter_new_encoding(icalparameter_encoding v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_ENCODING_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_encoding((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_encoding icalparameter_get_encoding(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
- if ( ((struct icalparameter_impl*)param)->string != 0){
- return ICAL_ENCODING_XNAME;
- }
-
- return ((struct icalparameter_impl*)param)->data.v_encoding;
-
-}
-
-void icalparameter_set_encoding(icalparameter* param, icalparameter_encoding v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_encoding = v;
-}
-
-/* FBTYPE */
-icalparameter* icalparameter_new_fbtype(icalparameter_fbtype v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_FBTYPE_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_fbtype((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_fbtype icalparameter_get_fbtype(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
- if ( ((struct icalparameter_impl*)param)->string != 0){
- return ICAL_FBTYPE_XNAME;
- }
-
- return ((struct icalparameter_impl*)param)->data.v_fbtype;
-
-}
-
-void icalparameter_set_fbtype(icalparameter* param, icalparameter_fbtype v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_fbtype = v;
-}
-
-/* FMTTYPE */
-icalparameter* icalparameter_new_fmttype(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_FMTTYPE_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_fmttype((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_fmttype(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_fmttype(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* LANGUAGE */
-icalparameter* icalparameter_new_language(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_LANGUAGE_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_language((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_language(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_language(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* MEMBER */
-icalparameter* icalparameter_new_member(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_MEMBER_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_member((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_member(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_member(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* PARTSTAT */
-icalparameter* icalparameter_new_partstat(icalparameter_partstat v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_PARTSTAT_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_partstat((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_partstat icalparameter_get_partstat(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
- if ( ((struct icalparameter_impl*)param)->string != 0){
- return ICAL_PARTSTAT_XNAME;
- }
-
- return ((struct icalparameter_impl*)param)->data.v_partstat;
-
-}
-
-void icalparameter_set_partstat(icalparameter* param, icalparameter_partstat v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_partstat = v;
-}
-
-/* RANGE */
-icalparameter* icalparameter_new_range(icalparameter_range v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_RANGE_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_range((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_range icalparameter_get_range(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
-
- return ((struct icalparameter_impl*)param)->data.v_range;
-
-}
-
-void icalparameter_set_range(icalparameter* param, icalparameter_range v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_range = v;
-}
-
-/* RELATED */
-icalparameter* icalparameter_new_related(icalparameter_related v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_RELATED_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_related((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_related icalparameter_get_related(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
-
- return ((struct icalparameter_impl*)param)->data.v_related;
-
-}
-
-void icalparameter_set_related(icalparameter* param, icalparameter_related v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_related = v;
-}
-
-/* RELTYPE */
-icalparameter* icalparameter_new_reltype(icalparameter_reltype v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_RELTYPE_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_reltype((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_reltype icalparameter_get_reltype(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
- if ( ((struct icalparameter_impl*)param)->string != 0){
- return ICAL_RELTYPE_XNAME;
- }
-
- return ((struct icalparameter_impl*)param)->data.v_reltype;
-
-}
-
-void icalparameter_set_reltype(icalparameter* param, icalparameter_reltype v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_reltype = v;
-}
-
-/* ROLE */
-icalparameter* icalparameter_new_role(icalparameter_role v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_ROLE_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_role((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_role icalparameter_get_role(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
- if ( ((struct icalparameter_impl*)param)->string != 0){
- return ICAL_ROLE_XNAME;
- }
-
- return ((struct icalparameter_impl*)param)->data.v_role;
-
-}
-
-void icalparameter_set_role(icalparameter* param, icalparameter_role v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_role = v;
-}
-
-/* RSVP */
-icalparameter* icalparameter_new_rsvp(int v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_RSVP_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_rsvp((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-int icalparameter_get_rsvp(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
-
- return ((struct icalparameter_impl*)param)->data.v_rsvp;
-
-}
-
-void icalparameter_set_rsvp(icalparameter* param, int v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_rsvp = v;
-}
-
-/* SENT-BY */
-icalparameter* icalparameter_new_sentby(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_SENTBY_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_sentby((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_sentby(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_sentby(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* TZID */
-icalparameter* icalparameter_new_tzid(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_TZID_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_tzid((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_tzid(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_tzid(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* VALUE */
-icalparameter* icalparameter_new_value(icalparameter_value v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_VALUE_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_value((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_value icalparameter_get_value(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
- if ( ((struct icalparameter_impl*)param)->string != 0){
- return ICAL_VALUE_XNAME;
- }
-
- return ((struct icalparameter_impl*)param)->data.v_value;
-
-}
-
-void icalparameter_set_value(icalparameter* param, icalparameter_value v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_value = v;
-}
-
-/* X */
-icalparameter* icalparameter_new_x(char* v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
- icalerror_check_arg_rz( (v!=0),"v");
- impl = icalparameter_new_impl(ICAL_X_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_x((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-char* icalparameter_get_x(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg_rz( (param!=0), "param");
- return ((struct icalparameter_impl*)param)->string;
-}
-
-void icalparameter_set_x(icalparameter* param, char* v)
-{
- icalerror_check_arg_rv( (v!=0),"v");
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->string = strdup(v);
-}
-
-/* X-LIC-ERRORTYPE */
-icalparameter* icalparameter_new_xlicerrortype(icalparameter_xlicerrortype v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_XLICERRORTYPE_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_xlicerrortype((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_xlicerrortype icalparameter_get_xlicerrortype(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
-
- return ((struct icalparameter_impl*)param)->data.v_xlicerrortype;
-
-}
-
-void icalparameter_set_xlicerrortype(icalparameter* param, icalparameter_xlicerrortype v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_xlicerrortype = v;
-}
-
-/* X-LIC-COMPARETYPE */
-icalparameter* icalparameter_new_xliccomparetype(icalparameter_xliccomparetype v)
-{
- struct icalparameter_impl *impl;
- icalerror_clear_errno();
-
- impl = icalparameter_new_impl(ICAL_XLICCOMPARETYPE_PARAMETER);
- if (impl == 0) {
- return 0;
- }
-
- icalparameter_set_xliccomparetype((icalparameter*) impl,v);
- if (icalerrno != ICAL_NO_ERROR) {
- icalparameter_free((icalparameter*) impl);
- return 0;
- }
-
- return (icalparameter*) impl;
-}
-
-icalparameter_xliccomparetype icalparameter_get_xliccomparetype(icalparameter* param)
-{
- icalerror_clear_errno();
- icalerror_check_arg( (param!=0), "param");
-
- return ((struct icalparameter_impl*)param)->data.v_xliccomparetype;
-
-}
-
-void icalparameter_set_xliccomparetype(icalparameter* param, icalparameter_xliccomparetype v)
-{
-
- icalerror_check_arg_rv( (param!=0), "param");
- icalerror_clear_errno();
-
- ((struct icalparameter_impl*)param)->data.v_xliccomparetype = v;
-}
-
diff --git a/libical/src/libical/icalparameter.h b/libical/src/libical/icalparameter.h
deleted file mode 100644
index 174cae6f3f..0000000000
--- a/libical/src/libical/icalparameter.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalparam.h
- CREATOR: eric 20 March 1999
-
-
- $Id$
- $Locker$
-
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalparam.h
-
- ======================================================================*/
-
-#ifndef ICALPARAM_H
-#define ICALPARAM_H
-
-#include "icalenums.h" /* defined icalparameter_kind and other enums */
-
-typedef void icalparameter;
-
-icalparameter* icalparameter_new(icalparameter_kind kind);
-icalparameter* icalparameter_new_clone(icalparameter* p);
-icalparameter* icalparameter_new_from_string(icalparameter_kind kind, char* value);
-
-void icalparameter_free(icalparameter* parameter);
-
-char* icalparameter_as_ical_string(icalparameter* parameter);
-
-int icalparameter_is_valid(icalparameter* parameter);
-
-icalparameter_kind icalparameter_isa(icalparameter* parameter);
-
-int icalparameter_isa_parameter(void* param);
-
-/* Acess the name of an X parameer */
-void icalparameter_set_xname (icalparameter* param, char* v);
-char* icalparameter_get_xname(icalparameter* param);
-void icalparameter_set_xvalue (icalparameter* param, char* v);
-char* icalparameter_get_xvalue(icalparameter* param);
-
-
-/* Everything below this line is machine generated. Do not edit. */
-/* ALTREP */
-icalparameter* icalparameter_new_altrep(char* v);
-char* icalparameter_get_altrep(icalparameter* value);
-void icalparameter_set_altrep(icalparameter* value, char* v);
-
-/* CN */
-icalparameter* icalparameter_new_cn(char* v);
-char* icalparameter_get_cn(icalparameter* value);
-void icalparameter_set_cn(icalparameter* value, char* v);
-
-/* CUTYPE */
-icalparameter* icalparameter_new_cutype(icalparameter_cutype v);
-icalparameter_cutype icalparameter_get_cutype(icalparameter* value);
-void icalparameter_set_cutype(icalparameter* value, icalparameter_cutype v);
-
-/* DELEGATED-FROM */
-icalparameter* icalparameter_new_delegatedfrom(char* v);
-char* icalparameter_get_delegatedfrom(icalparameter* value);
-void icalparameter_set_delegatedfrom(icalparameter* value, char* v);
-
-/* DELEGATED-TO */
-icalparameter* icalparameter_new_delegatedto(char* v);
-char* icalparameter_get_delegatedto(icalparameter* value);
-void icalparameter_set_delegatedto(icalparameter* value, char* v);
-
-/* DIR */
-icalparameter* icalparameter_new_dir(char* v);
-char* icalparameter_get_dir(icalparameter* value);
-void icalparameter_set_dir(icalparameter* value, char* v);
-
-/* ENCODING */
-icalparameter* icalparameter_new_encoding(icalparameter_encoding v);
-icalparameter_encoding icalparameter_get_encoding(icalparameter* value);
-void icalparameter_set_encoding(icalparameter* value, icalparameter_encoding v);
-
-/* FBTYPE */
-icalparameter* icalparameter_new_fbtype(icalparameter_fbtype v);
-icalparameter_fbtype icalparameter_get_fbtype(icalparameter* value);
-void icalparameter_set_fbtype(icalparameter* value, icalparameter_fbtype v);
-
-/* FMTTYPE */
-icalparameter* icalparameter_new_fmttype(char* v);
-char* icalparameter_get_fmttype(icalparameter* value);
-void icalparameter_set_fmttype(icalparameter* value, char* v);
-
-/* LANGUAGE */
-icalparameter* icalparameter_new_language(char* v);
-char* icalparameter_get_language(icalparameter* value);
-void icalparameter_set_language(icalparameter* value, char* v);
-
-/* MEMBER */
-icalparameter* icalparameter_new_member(char* v);
-char* icalparameter_get_member(icalparameter* value);
-void icalparameter_set_member(icalparameter* value, char* v);
-
-/* PARTSTAT */
-icalparameter* icalparameter_new_partstat(icalparameter_partstat v);
-icalparameter_partstat icalparameter_get_partstat(icalparameter* value);
-void icalparameter_set_partstat(icalparameter* value, icalparameter_partstat v);
-
-/* RANGE */
-icalparameter* icalparameter_new_range(icalparameter_range v);
-icalparameter_range icalparameter_get_range(icalparameter* value);
-void icalparameter_set_range(icalparameter* value, icalparameter_range v);
-
-/* RELATED */
-icalparameter* icalparameter_new_related(icalparameter_related v);
-icalparameter_related icalparameter_get_related(icalparameter* value);
-void icalparameter_set_related(icalparameter* value, icalparameter_related v);
-
-/* RELTYPE */
-icalparameter* icalparameter_new_reltype(icalparameter_reltype v);
-icalparameter_reltype icalparameter_get_reltype(icalparameter* value);
-void icalparameter_set_reltype(icalparameter* value, icalparameter_reltype v);
-
-/* ROLE */
-icalparameter* icalparameter_new_role(icalparameter_role v);
-icalparameter_role icalparameter_get_role(icalparameter* value);
-void icalparameter_set_role(icalparameter* value, icalparameter_role v);
-
-/* RSVP */
-icalparameter* icalparameter_new_rsvp(int v);
-int icalparameter_get_rsvp(icalparameter* value);
-void icalparameter_set_rsvp(icalparameter* value, int v);
-
-/* SENT-BY */
-icalparameter* icalparameter_new_sentby(char* v);
-char* icalparameter_get_sentby(icalparameter* value);
-void icalparameter_set_sentby(icalparameter* value, char* v);
-
-/* TZID */
-icalparameter* icalparameter_new_tzid(char* v);
-char* icalparameter_get_tzid(icalparameter* value);
-void icalparameter_set_tzid(icalparameter* value, char* v);
-
-/* VALUE */
-icalparameter* icalparameter_new_value(icalparameter_value v);
-icalparameter_value icalparameter_get_value(icalparameter* value);
-void icalparameter_set_value(icalparameter* value, icalparameter_value v);
-
-/* X */
-icalparameter* icalparameter_new_x(char* v);
-char* icalparameter_get_x(icalparameter* value);
-void icalparameter_set_x(icalparameter* value, char* v);
-
-/* X-LIC-ERRORTYPE */
-icalparameter* icalparameter_new_xlicerrortype(icalparameter_xlicerrortype v);
-icalparameter_xlicerrortype icalparameter_get_xlicerrortype(icalparameter* value);
-void icalparameter_set_xlicerrortype(icalparameter* value, icalparameter_xlicerrortype v);
-
-/* X-LIC-COMPARETYPE */
-icalparameter* icalparameter_new_xliccomparetype(icalparameter_xliccomparetype v);
-icalparameter_xliccomparetype icalparameter_get_xliccomparetype(icalparameter* value);
-void icalparameter_set_xliccomparetype(icalparameter* value, icalparameter_xliccomparetype v);
-
-#endif ICALPARAMETER_H
diff --git a/libical/src/libical/icalparser.c b/libical/src/libical/icalparser.c
deleted file mode 100644
index 3be754036a..0000000000
--- a/libical/src/libical/icalparser.c
+++ /dev/null
@@ -1,990 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalparser.c
- CREATOR: eric 04 August 1999
-
- $Id$
- $Locker$
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Initial Developer of the Original Code is Eric Busboom
-
- (C) COPYRIGHT 1999 The Software Studio.
- http://www.softwarestudio.org
-
- ======================================================================*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-
-#include "ical.h"
-#include "pvl.h"
-#include "icalparser.h"
-#include "icalmemory.h"
-#include <string.h> /* For strncpy & size_t */
-#include <stdio.h> /* For FILE and fgets and sprintf */
-#include <stdlib.h> /* for free */
-
-
-extern icalvalue* icalparser_yy_value;
-void set_parser_value_state(icalvalue_kind kind);
-int ical_yy_parse(void);
-
-char* icalparser_get_next_char(char c, char *str);
-char* icalparser_get_next_parameter(char* line,char** end);
-char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind);
-char* icalparser_get_prop_name(char* line, char** end);
-char* icalparser_get_param_name(char* line, char **end);
-
-#define TMP_BUF_SIZE 80
-
-struct icalparser_impl
-{
- int buffer_full;
- size_t tmp_buf_size;
- char temp[TMP_BUF_SIZE];
- icalcomponent *root_component;
- icalcomponent *tail;
- int version;
- int level;
- int lineno;
- icalparser_state state;
- pvl_list components;
-
- void *line_gen_data;
-
-};
-
-
-icalparser* icalparser_new()
-{
- struct icalparser_impl* impl = 0;
-
- if ( ( impl = (struct icalparser_impl*)
- malloc(sizeof(struct icalparser_impl))) == 0) {
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
- }
-
- impl->root_component = 0;
- impl->components = pvl_newlist();
- impl->level = 0;
- impl->state = ICALPARSER_SUCCESS;
-
- impl->tmp_buf_size = TMP_BUF_SIZE;
- impl->buffer_full = 0;
- impl->lineno = 0;
-
- memset(impl->temp,0, TMP_BUF_SIZE);
-
- return (icalparser*)impl;
-}
-
-void icalparser_free(icalparser* parser)
-{
- struct icalparser_impl* impl = (struct icalparser_impl*)parser;
- icalcomponent *c;
-
- if (impl->root_component != 0){
- icalcomponent_free(impl->root_component);
- }
-
- while( (c=pvl_pop(impl->components)) != 0){
- icalcomponent_free(c);
- }
-
- pvl_free(impl->components);
-}
-
-void icalparser_set_gen_data(icalparser* parser, void* data)
-{
- struct icalparser_impl* impl = (struct icalparser_impl*)parser;
-
- impl->line_gen_data = data;
-}
-
-
-icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,
- char* str,
- icalproperty **error);
-
-
-
-char* icalparser_get_next_char(char c, char *str)
-{
- int quote_mode = 0;
- char* p;
-
-
- for(p=str; *p!=0; p++){
-
- if ( quote_mode == 0 && *p=='"' && *(p-1) != '\\' ){
- quote_mode =1;
- continue;
- }
-
- if ( quote_mode == 1 && *p=='"' && *(p-1) != '\\' ){
- quote_mode =0;
- continue;
- }
-
- if (quote_mode == 0 && *p== c && *(p-1) != '\\' ){
- return p;
- }
-
- }
-
- return 0;
-}
-
-/* make a new tmp buffer out of a substring */
-char* make_segment(char* start, char* end)
-{
- char *buf;
- size_t size = (size_t)end - (size_t)start;
-
- buf = icalmemory_tmp_buffer(size+1);
-
-
- strncpy(buf,start,size);
- *(buf+size) = 0;
-
- return buf;
-
-}
-
-char* input_buffer;
-char* input_buffer_p;
-#define min(a,b) ((a) < (b) ? (a) : (b))
-
-int icalparser_flex_input(char* buf, int max_size)
-{
- int n = min(max_size,strlen(input_buffer_p));
-
- if (n > 0){
- memcpy(buf, input_buffer_p, n);
- input_buffer_p += n;
- return n;
- } else {
- return 0;
- }
-}
-
-void icalparser_clear_flex_input()
-{
- input_buffer_p = input_buffer+strlen(input_buffer);
-}
-
-/* Cal the flex parser to parse a complex value */
-
-icalvalue* icalparser_parse_value(icalvalue_kind kind,
- char* str, icalproperty** error)
-{
- int r;
- input_buffer_p = input_buffer = str;
-
- set_parser_value_state(kind);
- icalparser_yy_value = 0;
-
- r = ical_yy_parse();
-
- /* Error. Parse failed */
- if( icalparser_yy_value == 0 || r != 0){
-
- if(icalparser_yy_value !=0){
- icalvalue_free(icalparser_yy_value);
- icalparser_yy_value = 0;
- }
-
- return 0;
- }
-
- if (error != 0){
- *error = 0;
- }
-
- return icalparser_yy_value;
-}
-
-char* icalparser_get_prop_name(char* line, char** end)
-{
- char* p;
- char* v;
- char *str;
-
- p = icalparser_get_next_char(';',line);
- v = icalparser_get_next_char(':',line);
- if (p== 0 && v == 0) {
- return 0;
- }
-
- /* There is no ';' or, it is after the ';' that marks the beginning of
- the value */
- if (v!=0 && ( p == 0 || p > v)){
- str = make_segment(line,v);
- *end = v+1;
- } else {
- str = make_segment(line,p);
- *end = p+1;
- }
-
- return str;
-}
-
-char* icalparser_get_param_name(char* line, char **end)
-{
-
- char* next;
- char *str;
-
- next = icalparser_get_next_char('=',line);
-
- if (next == 0) {
- return 0;
- }
-
- str = make_segment(line,next);
- *end = next+1;
- return str;
-
-}
-
-char* icalparser_get_next_paramvalue(char* line, char **end)
-{
-
- char* next;
- char *str;
-
- next = icalparser_get_next_char(',',line);
-
- if (next == 0){
- next = (char*)(size_t)line+(size_t)strlen(line);\
- }
-
- if (next == line){
- return 0;
- } else {
- str = make_segment(line,next);
- *end = next+1;
- return str;
- }
-
-}
-
-/* A property may have multiple values, if the values are seperated by
- commas in the content line. This routine will look for the next
- comma after line and will set the next place to start searching in
- end. */
-
-char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind)
-{
-
- char* next;
- char *p;
- char *str;
- size_t length = strlen(line);
-
- p = line;
- while(1){
-
- next = icalparser_get_next_char(',',p);
-
- /* Unforunately, RFC2445 says that for the RECUR value, COMMA
- can both seperate digits in a list, and it can seperate
- multiple recurrence specifications. This is not a friendly
- part of the spec. This weirdness tries to
- distinguish the two uses. it is probably a HACK*/
-
- if( kind == ICAL_RECUR_VALUE ) {
- if ( next != 0 &&
- (*end+length) > next+5 &&
- strncmp(next,"FREQ",4) == 0
- ) {
- /* The COMMA was followed by 'FREQ', is it a real seperator*/
- /* Fall through */
- printf("%s\n",next);
- } else if (next != 0){
- /* Not real, get the next COMMA */
- p = next+1;
- next = 0;
- continue;
- }
- }
-
- /* If the comma is preceeded by a '\', then it is a literal and
- not a value seperator*/
-
- if ( (next!=0 && *(next-1) == '\\') ||
- (next!=0 && *(next-3) == '\\')
- )
- /*second clause for '/' is on prev line. HACK may be out of bounds */
- {
- p = next+1;
- } else {
- break;
- }
-
- }
-
- if (next == 0){
- next = (char*)(size_t)line+length;
- *end = next;
- } else {
- *end = next+1;
- }
-
- if (next == line){
- return 0;
- }
-
-
- str = make_segment(line,next);
- return str;
-
-}
-
-char* icalparser_get_next_parameter(char* line,char** end)
-{
- char *next;
- char *v;
- char *str;
-
- v = icalparser_get_next_char(':',line);
- next = icalparser_get_next_char(';', line);
-
- /* There is no ';' or, it is after the ':' that marks the beginning of
- the value */
-
- if (next == 0 || next > v) {
- next = icalparser_get_next_char(':', line);
- }
-
- if (next != 0) {
- str = make_segment(line,next);
- *end = next+1;
- return str;
- } else {
- *end = line;
- return 0;
- }
-}
-
-/* Get a single property line, from the property name through the
- final new line, and include any continuation lines */
-
-char* icalparser_get_line(icalparser *parser,
- char* (*line_gen_func)(char *s, size_t size, void *d))
-{
- char *line;
- char *line_p;
- struct icalparser_impl* impl = (struct icalparser_impl*)parser;
- size_t buf_size = impl->tmp_buf_size;
-
-
- line_p = line = icalmemory_new_buffer(buf_size);
- line[0] = '\0';
-
- while(1) {
-
- /* The buffer is not clear, so transfer the data in it to the
- output. This may be left over from a previous call */
- if (impl->temp[0] != '\0' ) {
-
- /* If the last position in the temp buffer is occupied,
- mark the buffer as full. The means we will do another
- read later, because the line is not finished */
- if (impl->temp[impl->tmp_buf_size-1] == 0){
- impl->buffer_full = 1;
- } else {
- impl->buffer_full = 0;
- }
-
- /* Copy the temp to the output and clear the temp buffer. */
- icalmemory_append_string(&line,&line_p,&buf_size,impl->temp);
- impl->temp[0] = '\0' ;
- }
-
- impl->temp[impl->tmp_buf_size-1] = 1; /* Mark end of buffer */
-
- if ((*line_gen_func)(impl->temp,impl->tmp_buf_size,impl->line_gen_data)
- ==0){/* Get more data */
-
- /* If the first position is clear, it means we didn't get
- any more data from the last call to line_ge_func*/
- if (impl->temp[0] == '\0'){
-
- if(line[0] != '\0'){
- /* There is data in the output, so fall trhough and process it*/
- break;
- } else {
- /* No data in output; return and signal that there
- is no more input*/
- free(line);
- return 0;
- }
- }
- }
-
-
- /* If the output line ends in a '\n' and the temp buffer
- begins with a ' ', then the buffer holds a continuation
- line, so keep reading. */
-
- if ( line_p > line+1 && *(line_p-1) == '\n' && impl->temp[0] == ' ') {
-
- /* back up the pointer to erase the continuation characters */
- line_p--;
-
- if ( *(line_p-1) == '\r'){
- line_p--;
- }
-
- /* shift the temp buffer down to eliminate the leading space*/
- memmove(&(impl->temp[0]),&(impl->temp[1]),impl->tmp_buf_size);
-
- impl->temp[impl->tmp_buf_size-1] = impl->temp[impl->tmp_buf_size-2];
-
- } else if ( impl->buffer_full == 1 ) {
-
- /* The buffer was filled on the last read, so read again */
-
- } else {
-
- /* Looks like the end of this content line, so break */
- break;
- }
-
-
- }
-
- /* Erase the final newline and/or carriage return*/
- if ( line_p > line+1 && *(line_p-1) == '\n') {
- *(line_p-1) = '\0';
- if ( *(line_p-2) == '\r'){
- *(line_p-2) = '\0';
- }
-
- } else {
- *(line_p) = '\0';
- }
-
- return line;
-
-}
-
-void insert_error(icalcomponent* comp, char* text,
- char* message, icalparameter_xlicerrortype type)
-{
- char temp[1024];
-
- if (text == 0){
- snprintf(temp,1024,"%s:",message);
- } else {
- snprintf(temp,1024,"%s: \'%s\'",message,text);
- }
-
- icalcomponent_add_property
- (comp,
- icalproperty_vanew_xlicerror(
- temp,
- icalparameter_new_xlicerrortype(type),
- 0));
-}
-
-icalcomponent* icalparser_parse(icalparser *parser,
- char* (*line_gen_func)(char *s, size_t size,
- void* d))
-{
-
- char* line;
- icalcomponent *c=0;
- icalcomponent *root_component=0;
-
- icalerror_check_arg_rz((parser !=0),"parser");
-
- do{
- line = icalparser_get_line(parser, line_gen_func);
-
- if ((c = icalparser_add_line(parser,line)) != 0){
- if (root_component == 0){
- /* Just one component */
- icalparser_claim(parser);
- root_component = c;
- } else if(icalcomponent_isa(root_component)
- != ICAL_XROOT_COMPONENT) {
- /*Got a second component, so move the two components under
- an XROOT container */
- icalcomponent *tempc;
- tempc = icalcomponent_new(ICAL_XROOT_COMPONENT);
- icalcomponent_add_component(tempc, root_component);
- icalparser_claim(parser);
- icalcomponent_add_component(tempc, c);
- root_component = tempc;
- } else {
- /* Already have an XROOT container, so add the component
- to it*/
- icalcomponent_add_component(root_component, c);
- icalparser_claim(parser);
- }
- }
- } while ( line != 0);
-
- return root_component;
-
-}
-
-icalcomponent* icalparser_add_line(icalparser* parser,
- char* line)
-{
- char *p;
- char *str;
- char *end;
- int vcount = 0;
- icalproperty *prop;
- icalvalue *value;
- icalvalue_kind value_kind = ICAL_NO_VALUE;
-
-
- struct icalparser_impl *impl = (struct icalparser_impl*)parser;
- icalerror_check_arg_rz((parser != 0),"parser");
-
-
- if (line == 0)
- {
- impl->state = ICALPARSER_ERROR;
- return 0;
- }
-
- /* Begin by getting the property name at the start of the line. The
- property name may end up being "BEGIN" or "END" in which case it
- is not really a property, but the market for the start or end of
- a component */
-
- end = 0;
- str = icalparser_get_prop_name(line, &end);
-
- if (str == 0){
- /* Could not get a property name */
- icalcomponent *tail = pvl_data(pvl_tail(impl->components));
-
- if (tail){
- insert_error(tail,line,
- "Got a data line, but could not find a property name or component begin tag",
- ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
- }
- tail = 0;
- impl->state = ICALPARSER_ERROR;
- return 0;
- }
-
- /**********************************************************************
- * Handle begin and end of components
- **********************************************************************/
-
-
- /* If the property name is BEGIN or END, we are actually
- starting or ending a new component */
-
- if(strcmp(str,"BEGIN") == 0){
- icalcomponent *c;
-
- impl->level++;
- str = icalparser_get_next_value(end,&end, value_kind);
-
- c = icalcomponent_new_from_string(str);
-
- if (c == 0){
- c = icalcomponent_new(ICAL_XLICINVALID_COMPONENT);
- insert_error(c,str,"Parse error in component name",
- ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
- }
-
- pvl_push(impl->components,c);
-
- impl->state = ICALPARSER_BEGIN_COMP;
- return 0;
-
- } else if (strcmp(str,"END") == 0 ) {
- icalcomponent* tail;
-
- impl->level--;
- str = icalparser_get_next_value(end,&end, value_kind);
-
- impl->root_component = pvl_pop(impl->components);
-
- tail = pvl_data(pvl_tail(impl->components));
-
- if(tail != 0){
- icalcomponent_add_component(tail,impl->root_component);
- }
-
- tail = 0;
-
- /* Return the component if we are back to the 0th level */
- if (impl->level == 0){
- impl->state = ICALPARSER_SUCCESS;
- return impl->root_component;
- } else {
- impl->state = ICALPARSER_END_COMP;
- return 0;
- }
- }
-
-
- /* There is no point in continuing if we have not seen a
- component yet */
-
- if(pvl_data(pvl_tail(impl->components)) == 0){
- impl->state = ICALPARSER_ERROR;
- return 0;
- }
-
-
- /**********************************************************************
- * Handle property names
- **********************************************************************/
- /* At this point, the property name really is a property name,
- (Not a component name) so make a new property and add it to
- the component */
-
- prop = icalproperty_new_from_string(str);
-
- if (prop != 0){
- icalcomponent *tail = pvl_data(pvl_tail(impl->components));
-
- icalcomponent_add_property(tail, prop);
-
- /* Set the value kind for the default for this type of
- property. This may be re-set by a VALUE parameter */
- value_kind =
- icalenum_property_kind_to_value_kind(
- icalproperty_isa(prop));
-
- } else {
- icalcomponent* tail = pvl_data(pvl_tail(impl->components));
-
- insert_error(tail,str,"Parse error in property name",
- ICAL_XLICERRORTYPE_PROPERTYPARSEERROR);
-
- tail = 0;
- impl->state = ICALPARSER_ERROR;
- return 0;
- }
-
- /**********************************************************************
- * Handle parameter values
- **********************************************************************/
-
- /* Now, add any parameters to the last property */
-
- p = 0;
- while(1) {
-
- if (*(end-1) == ':'){
- /* if the last seperator was a ":" and the value is a
- URL, icalparser_get_next_parameter will find the
- ':' in the URL, so better break now. */
- break;
- }
-
- str = icalparser_get_next_parameter(end,&end);
-
- if (str != 0){
- char* name;
- char* pvalue;
-
- icalparameter *param = 0;
- icalparameter_kind kind;
- icalcomponent *tail = pvl_data(pvl_tail(impl->components));
-
- name = icalparser_get_param_name(str,&pvalue);
-
- if (name == 0){
- /* 'tail' defined above */
- insert_error(tail, str, "Can't parse parameter name",
- ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR);
- tail = 0;
- break;
- }
-
- kind = icalenum_string_to_parameter_kind(name);
-
- if (kind != ICAL_NO_PARAMETER){
- param = icalparameter_new_from_string(kind,pvalue);
- } else {
- /* Error. Failed to parse the parameter*/
- /* 'tail' defined above */
- insert_error(tail, str, "Can't parse parameter name",
- ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR);
- tail = 0;
- impl->state = ICALPARSER_ERROR;
- return 0;
- }
-
- if (param == 0){
- /* 'tail' defined above */
- insert_error(tail,str,"Can't parse parameter value",
- ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR);
-
- tail = 0;
- impl->state = ICALPARSER_ERROR;
- continue;
- }
-
- /* If it is a VALUE parameter, set the kind of value*/
- if (icalparameter_isa(param)==ICAL_VALUE_PARAMETER){
-
- value_kind = (icalvalue_kind)
- icalparameter_get_value(param);
-
- if (value_kind == ICAL_NO_VALUE){
-
- /* Ooops, could not parse the value of the
- parameter ( it was not one of the defined
- values ), so reset the value_kind */
-
- insert_error(
- tail, str,
- "Got a VALUE parameter with an unknown type",
- ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR);
- icalparameter_free(param);
-
- value_kind =
- icalenum_property_kind_to_value_kind(
- icalproperty_isa(prop));
-
- icalparameter_free(param);
- tail = 0;
- impl->state = ICALPARSER_ERROR;
- return 0;
- }
- }
-
- /* Everything is OK, so add the parameter */
- icalproperty_add_parameter(prop,param);
- tail = 0;
-
- } else { /* if ( str != 0) */
- /* If we did not get a param string, go on to looking
- for a value */
- break;
- } /* if ( str != 0) */
-
- } /* while(1) */
-
- /**********************************************************************
- * Handle values
- **********************************************************************/
-
- /* Look for values. If there are ',' characters in the values,
- then there are multiple values, so clone the current
- parameter and add one part of the value to each clone */
-
- vcount=0;
- while(1) {
- str = icalparser_get_next_value(end,&end, value_kind);
-
- if (str != 0){
-
- if (vcount > 0){
- /* Actually, only clone after the second value */
- icalproperty* clone = icalproperty_new_clone(prop);
- icalcomponent* tail = pvl_data(pvl_tail(impl->components));
-
- icalcomponent_add_property(tail, clone);
- prop = clone;
- tail = 0;
- }
-
- value = icalvalue_new_from_string(value_kind, str);
-
- /* Don't add properties without value */
- if (value == 0){
- char temp[200]; /* HACK */
-
- icalproperty_kind prop_kind = icalproperty_isa(prop);
- icalcomponent* tail = pvl_data(pvl_tail(impl->components));
-
- sprintf(temp,"Can't parse as %s value in %s property. Removing entire property",
- icalenum_value_kind_to_string(value_kind),
- icalenum_property_kind_to_string(prop_kind));
-
- insert_error(tail, str, temp,
- ICAL_XLICERRORTYPE_VALUEPARSEERROR);
-
- /* Remove the troublesome property */
- icalcomponent_remove_property(tail,prop);
- icalproperty_free(prop);
- prop = 0;
- tail = 0;
- impl->state = ICALPARSER_ERROR;
- return 0;
-
- } else {
- vcount++;
- icalproperty_set_value(prop, value);
- }
-
-
- } else {
- if (vcount == 0){
- char temp[200]; /* HACK */
-
- icalproperty_kind prop_kind = icalproperty_isa(prop);
- icalcomponent *tail = pvl_data(pvl_tail(impl->components));
-
- sprintf(temp,"No value for %s property. Removing entire property",
- icalenum_property_kind_to_string(prop_kind));
-
- insert_error(tail, str, temp,
- ICAL_XLICERRORTYPE_VALUEPARSEERROR);
-
- /* Remove the troublesome property */
- icalcomponent_remove_property(tail,prop);
- icalproperty_free(prop);
- prop = 0;
- tail = 0;
- impl->state = ICALPARSER_ERROR;
- return 0;
- } else {
-
- break;
- }
- }
- }
-
- /****************************************************************
- * End of component parsing.
- *****************************************************************/
-
- if (pvl_data(pvl_tail(impl->components)) == 0 &&
- impl->level == 0){
- impl->state = ICALPARSER_SUCCESS;
- return impl->root_component;
- } else {
- impl->state = ICALPARSER_IN_PROGRESS;
- return 0;
- }
-
-}
-
-icalparser_state icalparser_get_state(icalparser* parser)
-{
- struct icalparser_impl* impl = (struct icalparser_impl*) parser;
- return impl->state;
-
-}
-
-icalcomponent* icalparser_claim(icalparser* parser)
-{
- struct icalparser_impl* impl = (struct icalparser_impl*) parser;
- icalcomponent *c = impl->root_component;
-
- impl->root_component = 0;
-
- return c;
-
-}
-
-
-icalcomponent* icalparser_clean(icalparser* parser)
-{
- struct icalparser_impl* impl = (struct icalparser_impl*) parser;
- icalcomponent *tail = pvl_data(pvl_tail(impl->components));
-
- icalerror_check_arg_rz((parser != 0 ),"parser");
-
- /* We won't get a clean exit if some components did not have an
- "END" tag. Clear off any component that may be left in the list */
-
-
- while((tail=pvl_data(pvl_tail(impl->components))) != 0){
-
- insert_error(tail," ",
- "Missing END tag for this component. Closing component at end of input.",
- ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
-
-
- impl->root_component = pvl_pop(impl->components);
- tail=pvl_data(pvl_tail(impl->components));
-
- if(tail != 0){
- icalcomponent_add_component(tail,impl->root_component);
- }
- }
-
- return impl->root_component;
-
-}
-
-struct slg_data {
- char* pos;
- char* str;
-};
-
-char* string_line_generator(char *out, size_t buf_size, void *d)
-{
- char *n;
- size_t size;
- struct slg_data* data = (struct slg_data*)d;
-
- if(data->pos==0){
- data->pos=data->str;
- }
-
- /* If the pointer is at the end of the string, we are done */
- if (*(data->pos)==0){
- return 0;
- }
-
- n = strchr(data->pos,'\n');
-
- if (n == 0){
- size = strlen(data->pos);
- } else {
- n++; /* include newline in output */
- size = (n-data->pos);
- }
-
- if (size > buf_size-1){
- size = buf_size-1;
- }
-
-
- strncpy(out,data->pos,size);
-
- *(out+size) = '\0';
-
- data->pos += size;
-
- return out;
-}
-
-icalcomponent* icalparser_parse_string(char* str)
-{
- icalcomponent *c;
- struct slg_data d;
- icalparser *p;
-
- d.pos = 0;
- d.str = str;
-
- p = icalparser_new();
- icalparser_set_gen_data(p,&d);
- c = icalparser_parse(p,string_line_generator);
- icalparser_free(p);
-
- return c;
-
-}
diff --git a/libical/src/libical/icalparser.h b/libical/src/libical/icalparser.h
deleted file mode 100644
index 25c07eca9f..0000000000
--- a/libical/src/libical/icalparser.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalparser.h
- CREATOR: eric 20 April 1999
-
- $Id$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalparser.h
-
-======================================================================*/
-
-
-#ifndef ICALPARSER_H
-#define ICALPARSER_H
-
-#include "ical.h"
-#include <stdio.h> /* For FILE* */
-
-typedef void* icalparser;
-typedef enum icalparser_state {
- ICALPARSER_ERROR,
- ICALPARSER_SUCCESS,
- ICALPARSER_BEGIN_COMP,
- ICALPARSER_END_COMP,
- ICALPARSER_IN_PROGRESS
-} icalparser_state;
-
-
-/***********************************************************************
- * Message oriented parsing. icalparser_parse takes a string that
- * holds the text ( in RFC 2445 format ) and returns a pointer to an
- * icalcomponent. The caller owns the memory. line_gen_func is a
- * pointer to a function that returns one content line per invocation
- **********************************************************************/
-
-icalcomponent* icalparser_parse(icalparser *parser,
- char* (*line_gen_func)(char *s, size_t size, void *d));
-
-/* A simple, and incorrect interface - can only return one component*/
-icalcomponent* icalparser_parse_string(char* str);
-
-
-/***********************************************************************
- * Line-oriented parsing.
- *
- * Create a new parser via icalparse_new_parser, then add ines one at
- * a time with icalparse_add_line(). icalparser_add_line() will return
- * non-zero when it has finished with a component.
- ***********************************************************************/
-
-icalparser* icalparser_new();
-void icalparser_set_gen_data(icalparser* parser, void* data);
-icalcomponent* icalparser_add_line(icalparser* parser, char* str );
-icalcomponent* icalparser_claim(icalparser* parser);
-icalcomponent* icalparser_clean(icalparser* parser);
-icalparser_state icalparser_get_state(icalparser* parser);
-void icalparser_free(icalparser* parser);
-
-/***********************************************************************
- * Parser support functions
- ***********************************************************************/
-
-/* Use the flex/bison parser to turn a string into a value type */
-icalvalue* icalparser_parse_value(icalvalue_kind kind, char* str, icalcomponent** errors);
-
-/* Given a line generator function, return a single iCal content line.*/
-char* icalparser_get_line(icalparser* parser, char* (*line_gen_func)(char *s, size_t size, void *d));
-
-
-/* a line_gen_function that returns lines from a string. To use it,
- set string_line_generator_str to point to the input string, and set
- string_line_generator_pos to 0. These globals make the routine not
- thead-safe. */
-
-extern char* string_line_generator_str;
-extern char* string_line_generator_pos;
-char* string_line_generator(char *out, size_t buf_size, void *d);
-
-#endif /* !ICALPARSE_H */
diff --git a/libical/src/libical/icalproperty.c b/libical/src/libical/icalproperty.c
deleted file mode 100644
index c3fe7c9073..0000000000
--- a/libical/src/libical/icalproperty.c
+++ /dev/null
@@ -1,3095 +0,0 @@
-/* -*- Mode: C -*- */
-
-/*======================================================================
- FILE: icalproperty.c
- CREATOR: eric 28 April 1999
-
- $Id$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalproperty.c
-
-======================================================================*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h> /* For strdup, rindex */
-#include <assert.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <stdio.h> /* for printf */
-#include <stdarg.h> /* for va_list, va_start, etc. */
-
-#include "ical.h"
-#include "pvl.h"
-#include "icalenums.h"
-#include "icalerror.h"
-#include "icalmemory.h"
-
-#define TMP_BUF_SIZE 1024
-
-/* Private routines for icalproperty */
-void icalvalue_set_parent(icalvalue* value,
- icalproperty* property);
-icalproperty* icalvalue_get_parent(icalvalue* value);
-
-void icalparameter_set_parent(icalparameter* param,
- icalproperty* property);
-icalproperty* icalparameter_get_parent(icalparameter* value);
-
-
-void icalproperty_set_x_name(icalproperty* prop, char* name);
-
-struct icalproperty_impl
-{
- char id[5];
- icalproperty_kind kind;
- char* x_name;
- pvl_list parameters;
- pvl_elem parameter_iterator;
- icalvalue* value;
- icalcomponent *parent;
-};
-
-void icalproperty_add_parameters(struct icalproperty_impl *impl,va_list args)
-{
-
- void* vp;
-
- while((vp = va_arg(args, void*)) != 0) {
-
- if (icalvalue_isa_value(vp) != 0 ){
- } else if (icalparameter_isa_parameter(vp) != 0 ){
-
- icalproperty_add_parameter((icalproperty*)impl,
- (icalparameter*)vp);
- } else {
- abort();
- }
-
- }
-
-
-}
-
-struct icalproperty_impl*
-icalproperty_new_impl (icalproperty_kind kind)
-{
- struct icalproperty_impl* prop;
-
- if ( ( prop = (struct icalproperty_impl*)
- malloc(sizeof(struct icalproperty_impl))) == 0) {
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
- }
-
- strcpy(prop->id,"prop");
-
- prop->kind = kind;
- prop->parameters = pvl_newlist();
- prop->parameter_iterator = 0;
- prop->value = 0;
- prop->x_name = 0;
- prop->parent = 0;
-
- return prop;
-}
-
-
-icalproperty*
-icalproperty_new (icalproperty_kind kind)
-{
- icalproperty *prop = (icalproperty*)icalproperty_new_impl(kind);
-
- return prop;
-}
-
-
-icalproperty*
-icalproperty_new_clone(icalproperty* prop)
-{
- struct icalproperty_impl *old = (struct icalproperty_impl*)prop;
- struct icalproperty_impl *new = icalproperty_new_impl(old->kind);
- pvl_elem p;
-
- icalerror_check_arg_rz((prop!=0),"Prop");
- icalerror_check_arg_rz((old!=0),"old");
- icalerror_check_arg_rz((new!=0),"new");
-
- if (old->value !=0) {
- new->value = icalvalue_new_clone(old->value);
- }
-
- if (old->x_name != 0) {
-
- new->x_name = strdup(old->x_name);
-
- if (new->x_name == 0) {
- icalproperty_free(new);
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
- }
- }
-
- for(p=pvl_head(old->parameters);p != 0; p = pvl_next(p)){
- icalparameter *param = icalparameter_new_clone(pvl_data(p));
-
- if (param == 0){
- icalproperty_free(new);
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
- }
-
- pvl_push(new->parameters,param);
-
- }
-
- return new;
-
-}
-
-/* This one works a little differently from the other *_from_string
- routines; the string input is the name of the property, not the
- data associated with the property, as it is in
- icalvalue_from_string. All of the parsing associated with
- properties is driven by routines in icalparse.c */
-
-icalproperty* icalproperty_new_from_string(char* str)
-{
- icalproperty_kind kind;
-
- icalerror_check_arg_rz( (str!=0),"str");
-
- kind = icalenum_string_to_property_kind(str);
-
- if (kind == ICAL_NO_PROPERTY){
-
- if( str[0] == 'X' && str[1] == '-'){
- icalproperty *p = icalproperty_new(ICAL_X_PROPERTY);
- icalproperty_set_x_name(p,str);
- return p;
- } else {
- icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
- return 0;
- }
-
- } else {
- return icalproperty_new(kind);
- }
-}
-
-void
-icalproperty_free (icalproperty* prop)
-{
- struct icalproperty_impl *p;
-
- icalparameter* param;
-
- icalerror_check_arg_rv((prop!=0),"prop");
-
- p = (struct icalproperty_impl*)prop;
-
-#ifdef ICAL_FREE_ON_LIST_IS_ERROR
- icalerror_assert( (p->parent ==0),"Tried to free a property that is still attached to a component. ");
-
-#else
- if(p->parent !=0){
- return;
- }
-#endif
-
- if (p->value != 0){
- icalvalue_set_parent(p->value,0);
- icalvalue_free(p->value);
- }
-
- while( (param = pvl_pop(p->parameters)) != 0){
- icalparameter_free(param);
- }
-
- pvl_free(p->parameters);
-
- if (p->x_name != 0) {
- free(p->x_name);
- }
-
- p->kind = ICAL_NO_PROPERTY;
- p->parameters = 0;
- p->parameter_iterator = 0;
- p->value = 0;
- p->x_name = 0;
- p->id[0] = 'X';
-
- free(p);
-
-}
-
-
-char*
-icalproperty_as_ical_string (icalproperty* prop)
-{
- icalparameter *param;
-
- /* Create new buffer that we can append names, parameters and a
- value to, and reallocate as needed. Later, this buffer will be
- copied to a icalmemory_tmp_buffer, which is managed internally
- by libical, so it can be given to the caller without fear of
- the caller forgetting to free it */
-
- char* property_name = 0;
- size_t buf_size = 1024;
- char* buf = icalmemory_new_buffer(buf_size);
- char* buf_ptr = buf;
- icalvalue* value;
- char *out_buf;
-
-#ifdef ICAL_UNIX_NEWLINE
- char newline[] = "\n";
-#else
- char newline[] = "\r\n";
-#endif
-
- struct icalproperty_impl *impl = (struct icalproperty_impl*)prop;
-
- icalerror_check_arg_rz( (prop!=0),"prop");
-
- /* Append property name */
-
- if (impl->kind == ICAL_X_PROPERTY && impl->x_name != 0){
- property_name = impl->x_name;
- } else {
- property_name = icalenum_property_kind_to_string(impl->kind);
- }
-
- if (property_name == 0 ) {
- icalerror_warn("Got a property of an unknown kind.");
- icalmemory_free_buffer(buf);
- return 0;
-
- }
-
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, property_name);
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
-
- /* Append parameters */
- for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER);
- param != 0;
- param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) {
-
- char* kind_string = icalparameter_as_ical_string(param);
-
- if (kind_string == 0 ) {
- char temp[TMP_BUF_SIZE];
- snprintf(temp, TMP_BUF_SIZE,"Got a parameter of unknown kind in %s property",property_name);
- icalerror_warn(temp);
- continue;
- }
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, " ;");
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
-
- }
-
- /* Append value */
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, " :");
-
- value = icalproperty_get_value(prop);
-
- if (value != 0){
- icalmemory_append_string(&buf, &buf_ptr, &buf_size,
- icalvalue_as_ical_string(icalproperty_get_value(prop)));
- } else {
- icalmemory_append_string(&buf, &buf_ptr, &buf_size,"ERROR: No Value");
-
- }
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
-
- /* Now, copy the buffer to a tmp_buffer, which is safe to give to
- the caller without worring about de-allocating it. */
-
-
- out_buf = icalmemory_tmp_buffer(strlen(buf)+1);
- strcpy(out_buf, buf);
-
- icalmemory_free_buffer(buf);
-
- return out_buf;
-}
-
-
-
-icalproperty_kind
-icalproperty_isa (icalproperty* property)
-{
- struct icalproperty_impl *p = (struct icalproperty_impl*)property;
-
- if(property != 0){
- return p->kind;
- }
-
- return ICAL_NO_PROPERTY;
-}
-
-int
-icalproperty_isa_property (void* property)
-{
- struct icalproperty_impl *impl = (struct icalproperty_impl*)property;
-
- icalerror_check_arg_rz( (property!=0), "property");
-
- if (strcmp(impl->id,"prop") == 0) {
- return 1;
- } else {
- return 0;
- }
-}
-
-
-void
-icalproperty_add_parameter (icalproperty* prop,icalparameter* parameter)
-{
- struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
-
- icalerror_check_arg_rv( (prop!=0),"prop");
- icalerror_check_arg_rv( (parameter!=0),"parameter");
-
- pvl_push(p->parameters, parameter);
-
-}
-
-
-void
-icalproperty_remove_parameter (icalproperty* prop, icalparameter_kind kind)
-{
- icalerror_check_arg_rv((prop!=0),"prop");
-
- assert(0); /* This routine is not implemented */
-}
-
-
-int
-icalproperty_count_parameters (icalproperty* prop)
-{
- struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
-
- if(prop != 0){
- return pvl_count(p->parameters);
- }
-
- icalerror_set_errno(ICAL_USAGE_ERROR);
- return -1;
-}
-
-
-icalparameter*
-icalproperty_get_first_parameter (icalproperty* prop, icalparameter_kind kind)
-{
- struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
-
- icalerror_check_arg_rz( (prop!=0),"prop");
-
- p->parameter_iterator = pvl_head(p->parameters);
-
- if (p->parameter_iterator == 0) {
- return 0;
- }
-
- return (icalparameter*) pvl_data(p->parameter_iterator);
-}
-
-
-icalparameter*
-icalproperty_get_next_parameter (icalproperty* prop, icalparameter_kind kind)
-{
- struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
- icalerror_check_arg_rz( (prop!=0),"prop");
-
- if (p->parameter_iterator == 0 ) {
- return 0;
- }
-
- p->parameter_iterator = pvl_next(p->parameter_iterator);
-
- if (p->parameter_iterator == 0 ) {
- return 0;
- }
-
- return (icalparameter*) pvl_data(p->parameter_iterator);
-}
-
-void
-icalproperty_set_value (icalproperty* prop, icalvalue* value)
-{
- struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
-
- icalerror_check_arg_rv((prop !=0),"prop");
- icalerror_check_arg_rv((value !=0),"value");
-
- if (p->value != 0){
- icalvalue_set_parent(p->value,0);
- icalvalue_free(p->value);
- p->value = 0;
- }
-
- p->value = value;
-
- icalvalue_set_parent(value,prop);
-}
-
-
-icalvalue*
-icalproperty_get_value (icalproperty* prop)
-{
- struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
-
- icalerror_check_arg_rz( (prop!=0),"prop");
-
- return p->value;
-}
-
-
-void icalproperty_set_x_name(icalproperty* prop, char* name)
-{
- struct icalproperty_impl *impl = (struct icalproperty_impl*)prop;
-
- icalerror_check_arg_rv( (name!=0),"name");
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- if (impl->x_name != 0) {
- free(impl->x_name);
- }
-
- impl->x_name = strdup(name);
-
- if(impl->x_name == 0){
- icalerror_set_errno(ICAL_ALLOCATION_ERROR);
- }
-
-}
-
-char* icalproperty_get_x_name(icalproperty* prop){
-
- struct icalproperty_impl *impl = (struct icalproperty_impl*)prop;
-
- icalerror_check_arg_rz( (prop!=0),"prop");
-
- return impl->x_name;
-}
-
-
-void icalproperty_set_parent(icalproperty* property,
- icalcomponent* component)
-{
- struct icalproperty_impl *impl = (struct icalproperty_impl*)property;
-
- icalerror_check_arg_rv( (property!=0),"property");
-
- impl->parent = component;
-}
-
-icalcomponent* icalproperty_get_parent(icalproperty* property)
-{
- struct icalproperty_impl *impl = (struct icalproperty_impl*)property;
-
- icalerror_check_arg_rv( (property!=0),"property");
-
- return impl->parent;
-}
-
-
-/* Everything below this line is machine generated. Do not edit. */
-
-/* METHOD */
-
-icalproperty* icalproperty_new_method(icalproperty_method v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_METHOD_PROPERTY);
-
-
- icalproperty_set_method((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_method(icalproperty_method v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_METHOD_PROPERTY);
-
-
- icalproperty_set_method((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_method(icalproperty* prop, icalproperty_method v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_method(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-icalproperty_method icalproperty_get_method(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_method(value);
-}
-
-/* LAST-MODIFIED */
-
-icalproperty* icalproperty_new_lastmodified(struct icaltimetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_LASTMODIFIED_PROPERTY);
-
-
- icalproperty_set_lastmodified((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_lastmodified(struct icaltimetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_LASTMODIFIED_PROPERTY);
-
-
- icalproperty_set_lastmodified((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_lastmodified(icalproperty* prop, struct icaltimetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_datetime(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icaltimetype icalproperty_get_lastmodified(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_datetime(value);
-}
-
-/* UID */
-
-icalproperty* icalproperty_new_uid(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_UID_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_uid((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_uid(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_UID_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_uid((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_uid(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_uid(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* PRODID */
-
-icalproperty* icalproperty_new_prodid(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PRODID_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_prodid((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_prodid(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PRODID_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_prodid((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_prodid(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_prodid(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* STATUS */
-
-icalproperty* icalproperty_new_status(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_STATUS_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_status((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_status(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_STATUS_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_status((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_status(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_status(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* DESCRIPTION */
-
-icalproperty* icalproperty_new_description(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DESCRIPTION_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_description((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_description(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DESCRIPTION_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_description((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_description(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_description(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* DURATION */
-
-icalproperty* icalproperty_new_duration(struct icaldurationtype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DURATION_PROPERTY);
-
-
- icalproperty_set_duration((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_duration(struct icaldurationtype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DURATION_PROPERTY);
-
-
- icalproperty_set_duration((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_duration(icalproperty* prop, struct icaldurationtype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_duration(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icaldurationtype icalproperty_get_duration(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_duration(value);
-}
-
-/* CATEGORIES */
-
-icalproperty* icalproperty_new_categories(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CATEGORIES_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_categories((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_categories(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CATEGORIES_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_categories((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_categories(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_categories(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* VERSION */
-
-icalproperty* icalproperty_new_version(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_VERSION_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_version((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_version(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_VERSION_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_version((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_version(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_version(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* TZOFFSETFROM */
-
-icalproperty* icalproperty_new_tzoffsetfrom(int v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZOFFSETFROM_PROPERTY);
-
-
- icalproperty_set_tzoffsetfrom((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_tzoffsetfrom(int v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZOFFSETFROM_PROPERTY);
-
-
- icalproperty_set_tzoffsetfrom((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_tzoffsetfrom(icalproperty* prop, int v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_utcoffset(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-int icalproperty_get_tzoffsetfrom(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_utcoffset(value);
-}
-
-/* RRULE */
-
-icalproperty* icalproperty_new_rrule(struct icalrecurrencetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RRULE_PROPERTY);
-
-
- icalproperty_set_rrule((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_rrule(struct icalrecurrencetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RRULE_PROPERTY);
-
-
- icalproperty_set_rrule((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_rrule(icalproperty* prop, struct icalrecurrencetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_recur(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icalrecurrencetype icalproperty_get_rrule(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_recur(value);
-}
-
-/* ATTENDEE */
-
-icalproperty* icalproperty_new_attendee(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTENDEE_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_attendee((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_attendee(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTENDEE_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_attendee((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_attendee(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_caladdress(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_attendee(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_caladdress(value);
-}
-
-/* CONTACT */
-
-icalproperty* icalproperty_new_contact(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CONTACT_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_contact((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_contact(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CONTACT_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_contact((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_contact(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_contact(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* RELATED-TO */
-
-icalproperty* icalproperty_new_relatedto(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RELATEDTO_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_relatedto((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_relatedto(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RELATEDTO_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_relatedto((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_relatedto(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_relatedto(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* ORGANIZER */
-
-icalproperty* icalproperty_new_organizer(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ORGANIZER_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_organizer((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_organizer(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ORGANIZER_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_organizer((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_organizer(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_caladdress(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_organizer(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_caladdress(value);
-}
-
-/* COMMENT */
-
-icalproperty* icalproperty_new_comment(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_COMMENT_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_comment((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_comment(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_COMMENT_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_comment((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_comment(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_comment(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* TRIGGER */
-
-icalproperty* icalproperty_new_trigger(union icaltriggertype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TRIGGER_PROPERTY);
-
-
- icalproperty_set_trigger((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_trigger(union icaltriggertype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TRIGGER_PROPERTY);
-
-
- icalproperty_set_trigger((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_trigger(icalproperty* prop, union icaltriggertype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_trigger(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-union icaltriggertype icalproperty_get_trigger(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_trigger(value);
-}
-
-/* X-LIC-ERROR */
-
-icalproperty* icalproperty_new_xlicerror(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICERROR_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_xlicerror((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_xlicerror(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICERROR_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_xlicerror((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_xlicerror(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_xlicerror(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* CLASS */
-
-icalproperty* icalproperty_new_class(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CLASS_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_class((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_class(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CLASS_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_class((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_class(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_class(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* TZOFFSETTO */
-
-icalproperty* icalproperty_new_tzoffsetto(int v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZOFFSETTO_PROPERTY);
-
-
- icalproperty_set_tzoffsetto((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_tzoffsetto(int v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZOFFSETTO_PROPERTY);
-
-
- icalproperty_set_tzoffsetto((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_tzoffsetto(icalproperty* prop, int v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_utcoffset(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-int icalproperty_get_tzoffsetto(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_utcoffset(value);
-}
-
-/* TRANSP */
-
-icalproperty* icalproperty_new_transp(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TRANSP_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_transp((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_transp(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TRANSP_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_transp((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_transp(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_transp(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* SEQUENCE */
-
-icalproperty* icalproperty_new_sequence(int v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_SEQUENCE_PROPERTY);
-
-
- icalproperty_set_sequence((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_sequence(int v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_SEQUENCE_PROPERTY);
-
-
- icalproperty_set_sequence((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_sequence(icalproperty* prop, int v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_integer(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-int icalproperty_get_sequence(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_integer(value);
-}
-
-/* LOCATION */
-
-icalproperty* icalproperty_new_location(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_LOCATION_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_location((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_location(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_LOCATION_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_location((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_location(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_location(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* REQUEST-STATUS */
-
-icalproperty* icalproperty_new_requeststatus(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_REQUESTSTATUS_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_requeststatus((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_requeststatus(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_REQUESTSTATUS_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_requeststatus((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_requeststatus(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_string(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_requeststatus(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_string(value);
-}
-
-/* EXDATE */
-
-icalproperty* icalproperty_new_exdate(struct icaltimetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_EXDATE_PROPERTY);
-
-
- icalproperty_set_exdate((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_exdate(struct icaltimetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_EXDATE_PROPERTY);
-
-
- icalproperty_set_exdate((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_exdate(icalproperty* prop, struct icaltimetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_datetimedate(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icaltimetype icalproperty_get_exdate(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_datetimedate(value);
-}
-
-/* TZID */
-
-icalproperty* icalproperty_new_tzid(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZID_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_tzid((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_tzid(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZID_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_tzid((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_tzid(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_tzid(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* RESOURCES */
-
-icalproperty* icalproperty_new_resources(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RESOURCES_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_resources((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_resources(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RESOURCES_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_resources((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_resources(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_resources(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* TZURL */
-
-icalproperty* icalproperty_new_tzurl(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZURL_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_tzurl((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_tzurl(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZURL_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_tzurl((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_tzurl(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_uri(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_tzurl(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_uri(value);
-}
-
-/* REPEAT */
-
-icalproperty* icalproperty_new_repeat(int v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_REPEAT_PROPERTY);
-
-
- icalproperty_set_repeat((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_repeat(int v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_REPEAT_PROPERTY);
-
-
- icalproperty_set_repeat((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_repeat(icalproperty* prop, int v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_integer(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-int icalproperty_get_repeat(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_integer(value);
-}
-
-/* PRIORITY */
-
-icalproperty* icalproperty_new_priority(int v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PRIORITY_PROPERTY);
-
-
- icalproperty_set_priority((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_priority(int v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PRIORITY_PROPERTY);
-
-
- icalproperty_set_priority((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_priority(icalproperty* prop, int v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_integer(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-int icalproperty_get_priority(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_integer(value);
-}
-
-/* FREEBUSY */
-
-icalproperty* icalproperty_new_freebusy(struct icalperiodtype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_FREEBUSY_PROPERTY);
-
-
- icalproperty_set_freebusy((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_freebusy(struct icalperiodtype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_FREEBUSY_PROPERTY);
-
-
- icalproperty_set_freebusy((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_freebusy(icalproperty* prop, struct icalperiodtype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_period(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icalperiodtype icalproperty_get_freebusy(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_period(value);
-}
-
-/* DTSTART */
-
-icalproperty* icalproperty_new_dtstart(struct icaltimetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTSTART_PROPERTY);
-
-
- icalproperty_set_dtstart((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_dtstart(struct icaltimetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTSTART_PROPERTY);
-
-
- icalproperty_set_dtstart((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_dtstart(icalproperty* prop, struct icaltimetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_datetimedate(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icaltimetype icalproperty_get_dtstart(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_datetimedate(value);
-}
-
-/* RECURRENCE-ID */
-
-icalproperty* icalproperty_new_recurrenceid(struct icaltimetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RECURRENCEID_PROPERTY);
-
-
- icalproperty_set_recurrenceid((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_recurrenceid(struct icaltimetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RECURRENCEID_PROPERTY);
-
-
- icalproperty_set_recurrenceid((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_recurrenceid(icalproperty* prop, struct icaltimetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_datetimedate(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icaltimetype icalproperty_get_recurrenceid(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_datetimedate(value);
-}
-
-/* SUMMARY */
-
-icalproperty* icalproperty_new_summary(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_SUMMARY_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_summary((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_summary(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_SUMMARY_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_summary((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_summary(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_summary(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* DTEND */
-
-icalproperty* icalproperty_new_dtend(struct icaltimetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTEND_PROPERTY);
-
-
- icalproperty_set_dtend((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_dtend(struct icaltimetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTEND_PROPERTY);
-
-
- icalproperty_set_dtend((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_dtend(icalproperty* prop, struct icaltimetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_datetimedate(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icaltimetype icalproperty_get_dtend(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_datetimedate(value);
-}
-
-/* TZNAME */
-
-icalproperty* icalproperty_new_tzname(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZNAME_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_tzname((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_tzname(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZNAME_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_tzname((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_tzname(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_tzname(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* RDATE */
-
-icalproperty* icalproperty_new_rdate(struct icalperiodtype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RDATE_PROPERTY);
-
-
- icalproperty_set_rdate((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_rdate(struct icalperiodtype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RDATE_PROPERTY);
-
-
- icalproperty_set_rdate((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_rdate(icalproperty* prop, struct icalperiodtype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_datetimeperiod(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icalperiodtype icalproperty_get_rdate(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_datetimeperiod(value);
-}
-
-/* URL */
-
-icalproperty* icalproperty_new_url(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_URL_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_url((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_url(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_URL_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_url((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_url(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_uri(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_url(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_uri(value);
-}
-
-/* ATTACH */
-
-icalproperty* icalproperty_new_attach(struct icalattachtype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTACH_PROPERTY);
-
-
- icalproperty_set_attach((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_attach(struct icalattachtype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTACH_PROPERTY);
-
-
- icalproperty_set_attach((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_attach(icalproperty* prop, struct icalattachtype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_attach(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icalattachtype icalproperty_get_attach(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_attach(value);
-}
-
-/* X-LIC-CLUSTERCOUNT */
-
-icalproperty* icalproperty_new_xlicclustercount(int v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICCLUSTERCOUNT_PROPERTY);
-
-
- icalproperty_set_xlicclustercount((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_xlicclustercount(int v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICCLUSTERCOUNT_PROPERTY);
-
-
- icalproperty_set_xlicclustercount((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_xlicclustercount(icalproperty* prop, int v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_integer(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-int icalproperty_get_xlicclustercount(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_integer(value);
-}
-
-/* EXRULE */
-
-icalproperty* icalproperty_new_exrule(struct icalrecurrencetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_EXRULE_PROPERTY);
-
-
- icalproperty_set_exrule((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_exrule(struct icalrecurrencetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_EXRULE_PROPERTY);
-
-
- icalproperty_set_exrule((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_exrule(icalproperty* prop, struct icalrecurrencetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_recur(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icalrecurrencetype icalproperty_get_exrule(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_recur(value);
-}
-
-/* QUERY */
-
-icalproperty* icalproperty_new_query(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_QUERY_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_query((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_query(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_QUERY_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_query((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_query(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_query(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_query(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_query(value);
-}
-
-/* PERCENT-COMPLETE */
-
-icalproperty* icalproperty_new_percentcomplete(int v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PERCENTCOMPLETE_PROPERTY);
-
-
- icalproperty_set_percentcomplete((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_percentcomplete(int v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PERCENTCOMPLETE_PROPERTY);
-
-
- icalproperty_set_percentcomplete((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_percentcomplete(icalproperty* prop, int v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_integer(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-int icalproperty_get_percentcomplete(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_integer(value);
-}
-
-/* CALSCALE */
-
-icalproperty* icalproperty_new_calscale(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CALSCALE_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_calscale((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_calscale(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CALSCALE_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_calscale((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_calscale(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_calscale(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
-
-/* CREATED */
-
-icalproperty* icalproperty_new_created(struct icaltimetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CREATED_PROPERTY);
-
-
- icalproperty_set_created((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_created(struct icaltimetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CREATED_PROPERTY);
-
-
- icalproperty_set_created((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_created(icalproperty* prop, struct icaltimetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_datetime(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icaltimetype icalproperty_get_created(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_datetime(value);
-}
-
-/* GEO */
-
-icalproperty* icalproperty_new_geo(struct icalgeotype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_GEO_PROPERTY);
-
-
- icalproperty_set_geo((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_geo(struct icalgeotype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_GEO_PROPERTY);
-
-
- icalproperty_set_geo((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_geo(icalproperty* prop, struct icalgeotype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_geo(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icalgeotype icalproperty_get_geo(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_geo(value);
-}
-
-/* COMPLETED */
-
-icalproperty* icalproperty_new_completed(struct icaltimetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_COMPLETED_PROPERTY);
-
-
- icalproperty_set_completed((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_completed(struct icaltimetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_COMPLETED_PROPERTY);
-
-
- icalproperty_set_completed((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_completed(icalproperty* prop, struct icaltimetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_datetime(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icaltimetype icalproperty_get_completed(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_datetime(value);
-}
-
-/* DTSTAMP */
-
-icalproperty* icalproperty_new_dtstamp(struct icaltimetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTSTAMP_PROPERTY);
-
-
- icalproperty_set_dtstamp((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_dtstamp(struct icaltimetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTSTAMP_PROPERTY);
-
-
- icalproperty_set_dtstamp((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_dtstamp(icalproperty* prop, struct icaltimetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_datetime(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icaltimetype icalproperty_get_dtstamp(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_datetime(value);
-}
-
-/* DUE */
-
-icalproperty* icalproperty_new_due(struct icaltimetype v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DUE_PROPERTY);
-
-
- icalproperty_set_due((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_due(struct icaltimetype v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DUE_PROPERTY);
-
-
- icalproperty_set_due((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_due(icalproperty* prop, struct icaltimetype v)
-{
- icalvalue *value;
-
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_datetimedate(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-struct icaltimetype icalproperty_get_due(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_datetimedate(value);
-}
-
-/* ACTION */
-
-icalproperty* icalproperty_new_action(char* v)
-{
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ACTION_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_action((icalproperty*)impl,v);
-
- return (icalproperty*)impl;
-}
-
-icalproperty* icalproperty_vanew_action(char* v, ...)
-{
- va_list args;
- struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ACTION_PROPERTY);
- icalerror_check_arg_rz( (v!=0),"v");
-
-
- icalproperty_set_action((icalproperty*)impl,v);
-
- va_start(args,v);
- icalproperty_add_parameters(impl, args);
- va_end(args);
-
- return (icalproperty*)impl;
-}
-
-void icalproperty_set_action(icalproperty* prop, char* v)
-{
- icalvalue *value;
-
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_arg_rv( (prop!=0),"prop");
-
- value = icalvalue_new_text(v);
-
- icalproperty_set_value(prop,value);
-
-}
-
-char* icalproperty_get_action(icalproperty* prop)
-{
- icalvalue *value;
- icalerror_check_arg( (prop!=0),"prop");
-
- value = icalproperty_get_value(prop);
-
- return icalvalue_get_text(value);
-}
diff --git a/libical/src/libical/icalproperty.h b/libical/src/libical/icalproperty.h
deleted file mode 100644
index 2cd28fe179..0000000000
--- a/libical/src/libical/icalproperty.h
+++ /dev/null
@@ -1,368 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalderivedproperties.{c,h}
- CREATOR: eric 09 May 1999
-
- $Id$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
-
- ======================================================================*/
-
-
-#ifndef ICALPROPERTY_H
-#define ICALPROPERTY_H
-
-#include <time.h>
-
-typedef void icalproperty;
-
-icalproperty* icalproperty_new(icalproperty_kind kind);
-
-icalproperty* icalproperty_new_clone(icalproperty * prop);
-
-icalproperty* icalproperty_new_from_string(char* str);
-
-char* icalproperty_as_ical_string(icalproperty* prop);
-
-void icalproperty_free(icalproperty* prop);
-
-icalproperty_kind icalproperty_isa(icalproperty* property);
-int icalproperty_isa_property(void* property);
-
-void icalproperty_add_parameter(icalproperty* prop,icalparameter* parameter);
-
-void icalproperty_remove_parameter(icalproperty* prop,
- icalparameter_kind kind);
-
-int icalproperty_count_parameters(icalproperty* prop);
-
-/* Iterate through the parameters */
-icalparameter* icalproperty_get_first_parameter(icalproperty* prop,
- icalparameter_kind kind);
-icalparameter* icalproperty_get_next_parameter(icalproperty* prop,
- icalparameter_kind kind);
-/* Access the value of the property */
-void icalproperty_set_value(icalproperty* prop, icalvalue* value);
-icalvalue* icalproperty_get_value(icalproperty* prop);
-
-/* Deal with X properties */
-
-void icalproperty_set_x_name(icalproperty* prop, char* name);
-char* icalproperty_get_x_name(icalproperty* prop);
-
-
-/* Everything below this line is machine generated. Do not edit. */
-
-/* METHOD */
-icalproperty* icalproperty_new_method(icalproperty_method v);
-icalproperty* icalproperty_vanew_method(icalproperty_method v, ...);
-void icalproperty_set_method(icalproperty* prop, icalproperty_method v);
-icalproperty_method icalproperty_get_method(icalproperty* prop);
-
-/* LAST-MODIFIED */
-icalproperty* icalproperty_new_lastmodified(struct icaltimetype v);
-icalproperty* icalproperty_vanew_lastmodified(struct icaltimetype v, ...);
-void icalproperty_set_lastmodified(icalproperty* prop, struct icaltimetype v);
-struct icaltimetype icalproperty_get_lastmodified(icalproperty* prop);
-
-/* UID */
-icalproperty* icalproperty_new_uid(char* v);
-icalproperty* icalproperty_vanew_uid(char* v, ...);
-void icalproperty_set_uid(icalproperty* prop, char* v);
-char* icalproperty_get_uid(icalproperty* prop);
-
-/* PRODID */
-icalproperty* icalproperty_new_prodid(char* v);
-icalproperty* icalproperty_vanew_prodid(char* v, ...);
-void icalproperty_set_prodid(icalproperty* prop, char* v);
-char* icalproperty_get_prodid(icalproperty* prop);
-
-/* STATUS */
-icalproperty* icalproperty_new_status(char* v);
-icalproperty* icalproperty_vanew_status(char* v, ...);
-void icalproperty_set_status(icalproperty* prop, char* v);
-char* icalproperty_get_status(icalproperty* prop);
-
-/* DESCRIPTION */
-icalproperty* icalproperty_new_description(char* v);
-icalproperty* icalproperty_vanew_description(char* v, ...);
-void icalproperty_set_description(icalproperty* prop, char* v);
-char* icalproperty_get_description(icalproperty* prop);
-
-/* DURATION */
-icalproperty* icalproperty_new_duration(struct icaldurationtype v);
-icalproperty* icalproperty_vanew_duration(struct icaldurationtype v, ...);
-void icalproperty_set_duration(icalproperty* prop, struct icaldurationtype v);
-struct icaldurationtype icalproperty_get_duration(icalproperty* prop);
-
-/* CATEGORIES */
-icalproperty* icalproperty_new_categories(char* v);
-icalproperty* icalproperty_vanew_categories(char* v, ...);
-void icalproperty_set_categories(icalproperty* prop, char* v);
-char* icalproperty_get_categories(icalproperty* prop);
-
-/* VERSION */
-icalproperty* icalproperty_new_version(char* v);
-icalproperty* icalproperty_vanew_version(char* v, ...);
-void icalproperty_set_version(icalproperty* prop, char* v);
-char* icalproperty_get_version(icalproperty* prop);
-
-/* TZOFFSETFROM */
-icalproperty* icalproperty_new_tzoffsetfrom(int v);
-icalproperty* icalproperty_vanew_tzoffsetfrom(int v, ...);
-void icalproperty_set_tzoffsetfrom(icalproperty* prop, int v);
-int icalproperty_get_tzoffsetfrom(icalproperty* prop);
-
-/* RRULE */
-icalproperty* icalproperty_new_rrule(struct icalrecurrencetype v);
-icalproperty* icalproperty_vanew_rrule(struct icalrecurrencetype v, ...);
-void icalproperty_set_rrule(icalproperty* prop, struct icalrecurrencetype v);
-struct icalrecurrencetype icalproperty_get_rrule(icalproperty* prop);
-
-/* ATTENDEE */
-icalproperty* icalproperty_new_attendee(char* v);
-icalproperty* icalproperty_vanew_attendee(char* v, ...);
-void icalproperty_set_attendee(icalproperty* prop, char* v);
-char* icalproperty_get_attendee(icalproperty* prop);
-
-/* CONTACT */
-icalproperty* icalproperty_new_contact(char* v);
-icalproperty* icalproperty_vanew_contact(char* v, ...);
-void icalproperty_set_contact(icalproperty* prop, char* v);
-char* icalproperty_get_contact(icalproperty* prop);
-
-/* RELATED-TO */
-icalproperty* icalproperty_new_relatedto(char* v);
-icalproperty* icalproperty_vanew_relatedto(char* v, ...);
-void icalproperty_set_relatedto(icalproperty* prop, char* v);
-char* icalproperty_get_relatedto(icalproperty* prop);
-
-/* ORGANIZER */
-icalproperty* icalproperty_new_organizer(char* v);
-icalproperty* icalproperty_vanew_organizer(char* v, ...);
-void icalproperty_set_organizer(icalproperty* prop, char* v);
-char* icalproperty_get_organizer(icalproperty* prop);
-
-/* COMMENT */
-icalproperty* icalproperty_new_comment(char* v);
-icalproperty* icalproperty_vanew_comment(char* v, ...);
-void icalproperty_set_comment(icalproperty* prop, char* v);
-char* icalproperty_get_comment(icalproperty* prop);
-
-/* TRIGGER */
-icalproperty* icalproperty_new_trigger(union icaltriggertype v);
-icalproperty* icalproperty_vanew_trigger(union icaltriggertype v, ...);
-void icalproperty_set_trigger(icalproperty* prop, union icaltriggertype v);
-union icaltriggertype icalproperty_get_trigger(icalproperty* prop);
-
-/* X-LIC-ERROR */
-icalproperty* icalproperty_new_xlicerror(char* v);
-icalproperty* icalproperty_vanew_xlicerror(char* v, ...);
-void icalproperty_set_xlicerror(icalproperty* prop, char* v);
-char* icalproperty_get_xlicerror(icalproperty* prop);
-
-/* CLASS */
-icalproperty* icalproperty_new_class(char* v);
-icalproperty* icalproperty_vanew_class(char* v, ...);
-void icalproperty_set_class(icalproperty* prop, char* v);
-char* icalproperty_get_class(icalproperty* prop);
-
-/* TZOFFSETTO */
-icalproperty* icalproperty_new_tzoffsetto(int v);
-icalproperty* icalproperty_vanew_tzoffsetto(int v, ...);
-void icalproperty_set_tzoffsetto(icalproperty* prop, int v);
-int icalproperty_get_tzoffsetto(icalproperty* prop);
-
-/* TRANSP */
-icalproperty* icalproperty_new_transp(char* v);
-icalproperty* icalproperty_vanew_transp(char* v, ...);
-void icalproperty_set_transp(icalproperty* prop, char* v);
-char* icalproperty_get_transp(icalproperty* prop);
-
-/* SEQUENCE */
-icalproperty* icalproperty_new_sequence(int v);
-icalproperty* icalproperty_vanew_sequence(int v, ...);
-void icalproperty_set_sequence(icalproperty* prop, int v);
-int icalproperty_get_sequence(icalproperty* prop);
-
-/* LOCATION */
-icalproperty* icalproperty_new_location(char* v);
-icalproperty* icalproperty_vanew_location(char* v, ...);
-void icalproperty_set_location(icalproperty* prop, char* v);
-char* icalproperty_get_location(icalproperty* prop);
-
-/* REQUEST-STATUS */
-icalproperty* icalproperty_new_requeststatus(char* v);
-icalproperty* icalproperty_vanew_requeststatus(char* v, ...);
-void icalproperty_set_requeststatus(icalproperty* prop, char* v);
-char* icalproperty_get_requeststatus(icalproperty* prop);
-
-/* EXDATE */
-icalproperty* icalproperty_new_exdate(struct icaltimetype v);
-icalproperty* icalproperty_vanew_exdate(struct icaltimetype v, ...);
-void icalproperty_set_exdate(icalproperty* prop, struct icaltimetype v);
-struct icaltimetype icalproperty_get_exdate(icalproperty* prop);
-
-/* TZID */
-icalproperty* icalproperty_new_tzid(char* v);
-icalproperty* icalproperty_vanew_tzid(char* v, ...);
-void icalproperty_set_tzid(icalproperty* prop, char* v);
-char* icalproperty_get_tzid(icalproperty* prop);
-
-/* RESOURCES */
-icalproperty* icalproperty_new_resources(char* v);
-icalproperty* icalproperty_vanew_resources(char* v, ...);
-void icalproperty_set_resources(icalproperty* prop, char* v);
-char* icalproperty_get_resources(icalproperty* prop);
-
-/* TZURL */
-icalproperty* icalproperty_new_tzurl(char* v);
-icalproperty* icalproperty_vanew_tzurl(char* v, ...);
-void icalproperty_set_tzurl(icalproperty* prop, char* v);
-char* icalproperty_get_tzurl(icalproperty* prop);
-
-/* REPEAT */
-icalproperty* icalproperty_new_repeat(int v);
-icalproperty* icalproperty_vanew_repeat(int v, ...);
-void icalproperty_set_repeat(icalproperty* prop, int v);
-int icalproperty_get_repeat(icalproperty* prop);
-
-/* PRIORITY */
-icalproperty* icalproperty_new_priority(int v);
-icalproperty* icalproperty_vanew_priority(int v, ...);
-void icalproperty_set_priority(icalproperty* prop, int v);
-int icalproperty_get_priority(icalproperty* prop);
-
-/* FREEBUSY */
-icalproperty* icalproperty_new_freebusy(struct icalperiodtype v);
-icalproperty* icalproperty_vanew_freebusy(struct icalperiodtype v, ...);
-void icalproperty_set_freebusy(icalproperty* prop, struct icalperiodtype v);
-struct icalperiodtype icalproperty_get_freebusy(icalproperty* prop);
-
-/* DTSTART */
-icalproperty* icalproperty_new_dtstart(struct icaltimetype v);
-icalproperty* icalproperty_vanew_dtstart(struct icaltimetype v, ...);
-void icalproperty_set_dtstart(icalproperty* prop, struct icaltimetype v);
-struct icaltimetype icalproperty_get_dtstart(icalproperty* prop);
-
-/* RECURRENCE-ID */
-icalproperty* icalproperty_new_recurrenceid(struct icaltimetype v);
-icalproperty* icalproperty_vanew_recurrenceid(struct icaltimetype v, ...);
-void icalproperty_set_recurrenceid(icalproperty* prop, struct icaltimetype v);
-struct icaltimetype icalproperty_get_recurrenceid(icalproperty* prop);
-
-/* SUMMARY */
-icalproperty* icalproperty_new_summary(char* v);
-icalproperty* icalproperty_vanew_summary(char* v, ...);
-void icalproperty_set_summary(icalproperty* prop, char* v);
-char* icalproperty_get_summary(icalproperty* prop);
-
-/* DTEND */
-icalproperty* icalproperty_new_dtend(struct icaltimetype v);
-icalproperty* icalproperty_vanew_dtend(struct icaltimetype v, ...);
-void icalproperty_set_dtend(icalproperty* prop, struct icaltimetype v);
-struct icaltimetype icalproperty_get_dtend(icalproperty* prop);
-
-/* TZNAME */
-icalproperty* icalproperty_new_tzname(char* v);
-icalproperty* icalproperty_vanew_tzname(char* v, ...);
-void icalproperty_set_tzname(icalproperty* prop, char* v);
-char* icalproperty_get_tzname(icalproperty* prop);
-
-/* RDATE */
-icalproperty* icalproperty_new_rdate(struct icalperiodtype v);
-icalproperty* icalproperty_vanew_rdate(struct icalperiodtype v, ...);
-void icalproperty_set_rdate(icalproperty* prop, struct icalperiodtype v);
-struct icalperiodtype icalproperty_get_rdate(icalproperty* prop);
-
-/* URL */
-icalproperty* icalproperty_new_url(char* v);
-icalproperty* icalproperty_vanew_url(char* v, ...);
-void icalproperty_set_url(icalproperty* prop, char* v);
-char* icalproperty_get_url(icalproperty* prop);
-
-/* ATTACH */
-icalproperty* icalproperty_new_attach(struct icalattachtype v);
-icalproperty* icalproperty_vanew_attach(struct icalattachtype v, ...);
-void icalproperty_set_attach(icalproperty* prop, struct icalattachtype v);
-struct icalattachtype icalproperty_get_attach(icalproperty* prop);
-
-/* X-LIC-CLUSTERCOUNT */
-icalproperty* icalproperty_new_xlicclustercount(int v);
-icalproperty* icalproperty_vanew_xlicclustercount(int v, ...);
-void icalproperty_set_xlicclustercount(icalproperty* prop, int v);
-int icalproperty_get_xlicclustercount(icalproperty* prop);
-
-/* EXRULE */
-icalproperty* icalproperty_new_exrule(struct icalrecurrencetype v);
-icalproperty* icalproperty_vanew_exrule(struct icalrecurrencetype v, ...);
-void icalproperty_set_exrule(icalproperty* prop, struct icalrecurrencetype v);
-struct icalrecurrencetype icalproperty_get_exrule(icalproperty* prop);
-
-/* QUERY */
-icalproperty* icalproperty_new_query(char* v);
-icalproperty* icalproperty_vanew_query(char* v, ...);
-void icalproperty_set_query(icalproperty* prop, char* v);
-char* icalproperty_get_query(icalproperty* prop);
-
-/* PERCENT-COMPLETE */
-icalproperty* icalproperty_new_percentcomplete(int v);
-icalproperty* icalproperty_vanew_percentcomplete(int v, ...);
-void icalproperty_set_percentcomplete(icalproperty* prop, int v);
-int icalproperty_get_percentcomplete(icalproperty* prop);
-
-/* CALSCALE */
-icalproperty* icalproperty_new_calscale(char* v);
-icalproperty* icalproperty_vanew_calscale(char* v, ...);
-void icalproperty_set_calscale(icalproperty* prop, char* v);
-char* icalproperty_get_calscale(icalproperty* prop);
-
-/* CREATED */
-icalproperty* icalproperty_new_created(struct icaltimetype v);
-icalproperty* icalproperty_vanew_created(struct icaltimetype v, ...);
-void icalproperty_set_created(icalproperty* prop, struct icaltimetype v);
-struct icaltimetype icalproperty_get_created(icalproperty* prop);
-
-/* GEO */
-icalproperty* icalproperty_new_geo(struct icalgeotype v);
-icalproperty* icalproperty_vanew_geo(struct icalgeotype v, ...);
-void icalproperty_set_geo(icalproperty* prop, struct icalgeotype v);
-struct icalgeotype icalproperty_get_geo(icalproperty* prop);
-
-/* COMPLETED */
-icalproperty* icalproperty_new_completed(struct icaltimetype v);
-icalproperty* icalproperty_vanew_completed(struct icaltimetype v, ...);
-void icalproperty_set_completed(icalproperty* prop, struct icaltimetype v);
-struct icaltimetype icalproperty_get_completed(icalproperty* prop);
-
-/* DTSTAMP */
-icalproperty* icalproperty_new_dtstamp(struct icaltimetype v);
-icalproperty* icalproperty_vanew_dtstamp(struct icaltimetype v, ...);
-void icalproperty_set_dtstamp(icalproperty* prop, struct icaltimetype v);
-struct icaltimetype icalproperty_get_dtstamp(icalproperty* prop);
-
-/* DUE */
-icalproperty* icalproperty_new_due(struct icaltimetype v);
-icalproperty* icalproperty_vanew_due(struct icaltimetype v, ...);
-void icalproperty_set_due(icalproperty* prop, struct icaltimetype v);
-struct icaltimetype icalproperty_get_due(icalproperty* prop);
-
-/* ACTION */
-icalproperty* icalproperty_new_action(char* v);
-icalproperty* icalproperty_vanew_action(char* v, ...);
-void icalproperty_set_action(icalproperty* prop, char* v);
-char* icalproperty_get_action(icalproperty* prop);
-#endif ICALPROPERTY_H
diff --git a/libical/src/libical/icalrestriction.c b/libical/src/libical/icalrestriction.c
deleted file mode 100644
index 8371e87545..0000000000
--- a/libical/src/libical/icalrestriction.c
+++ /dev/null
@@ -1,1600 +0,0 @@
-/* -*- Mode: C -*- */
-/* ======================================================================
- File: icalrestriction.c
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
-
- ======================================================================*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "icalenums.h"
-#include "icalrestriction.h"
-
-#define TMP_BUF_SIZE 1024
-
-/* Define the structs for the restrictions. these data are filled out
-in machine generated code below */
-
-typedef int (*restriction_func)(icalcomponent* comp);
-
-typedef struct icalrestriction_property_record {
- icalproperty_method method;
- icalcomponent_kind component;
- icalproperty_kind property;
- icalrestriction_kind restriction;
- restriction_func function;
-} icalrestriction_property_record;
-
-
-typedef struct icalrestriction_component_record {
- icalproperty_method method;
- icalcomponent_kind component;
- icalcomponent_kind subcomponent;
- icalrestriction_kind restriction;
- restriction_func function;
-} icalrestriction_component_record;
-
-icalrestriction_component_record icalrestriction_component_records[];
-icalrestriction_property_record icalrestriction_property_records[];
-
-/* The each row gives the result of comparing a restriction against a
- count. The columns in each row represent 0,1,2+. '-1' indicates
- 'invalid, 'don't care' or 'needs more analysis' So, for
- ICAL_RESTRICTION_ONE, if there is 1 of a property with that
- restriction, it passes, but if there are 0 or 2+, it fails. */
-
-char compare_map[ICAL_RESTRICTION_UNKNOWN+1][3] = {
- { 1, 1, 1},/*ICAL_RESTRICTION_NONE*/
- { 1, 0, 0},/*ICAL_RESTRICTION_ZERO*/
- { 0, 1, 0},/*ICAL_RESTRICTION_ONE*/
- { 1, 1, 1},/*ICAL_RESTRICTION_ZEROPLUS*/
- { 0, 1, 1},/*ICAL_RESTRICTION_ONEPLUS*/
- { 1, 1, 0},/*ICAL_RESTRICTION_ZEROORONE*/
- { 1, 1, 0},/*ICAL_RESTRICTION_ONEEXCLUSIVE*/
- { 1, 1, 0},/*ICAL_RESTRICTION_ONEMUTUAL*/
- { 1, 1, 1} /*ICAL_RESTRICTION_UNKNOWN*/
-};
-
-char restr_string_map[ICAL_RESTRICTION_UNKNOWN+1][60] = {
- "unknown number",/*ICAL_RESTRICTION_NONE*/
- "0",/*ICAL_RESTRICTION_ZERO*/
- "1",/*ICAL_RESTRICTION_ONE*/
- "zero or more",/*ICAL_RESTRICTION_ZEROPLUS*/
- "one or more" ,/*ICAL_RESTRICTION_ONEPLUS*/
- "zero or one",/*ICAL_RESTRICTION_ZEROORONE*/
- "zero or one, exclusive with another property",/*ICAL_RESTRICTION_ONEEXCLUSIVE*/
- "zero or one, mutual with another property",/*ICAL_RESTRICTION_ONEMUTUAL*/
- "unknown number" /*ICAL_RESTRICTION_UNKNOWN*/
-};
-
-
-int
-icalrestriction_compare(icalrestriction_kind restr, int count){
-
- if ( restr < ICAL_RESTRICTION_NONE || restr > ICAL_RESTRICTION_UNKNOWN
- || count < 0){
- return -1;
- }
-
- if (count > 2) {
- count = 2;
- }
-
- return compare_map[restr][count];
-
-}
-
-int icalrestriction_check_mutual(icalcomponent *comp){
- /* HACK. This function does nothing */
- return 1;
-}
-
-int icalrestriction_check_exclusive(icalcomponent *comp){
- /* HACK. This function does nothing */
- return 1;
-}
-
-int icalrestriction_check_component(icalproperty_method method,
- icalcomponent* comp)
-{
- icalproperty_kind kind;
- icalcomponent_kind comp_kind;
- icalrestriction_kind restr;
- int count;
- int compare;
- int valid = 1;
-
- comp_kind = icalcomponent_isa(comp);
-
- /* Check all of the properties in this component */
-
- for(kind = ICAL_ANY_PROPERTY+1; kind != ICAL_NO_PROPERTY; kind++){
- count = icalcomponent_count_properties(comp, kind);
-
- restr = icalrestriction_get_property_restriction(method,
- comp_kind,
- kind);
-
-
- if(restr == ICAL_RESTRICTION_ONEEXCLUSIVE ) {
- /* HACK. Treat this as a 0/1 restriction */
- restr = ICAL_RESTRICTION_ZEROORONE;
- compare = icalrestriction_compare(restr,count);
- } else if (restr == ICAL_RESTRICTION_ONEMUTUAL ) {
- /* HACK. Treat this as a 0/1 restriction */
- restr = ICAL_RESTRICTION_ZEROORONE;
- compare = icalrestriction_compare(restr,count);
- } else {
- compare = icalrestriction_compare(restr,count);
- }
-
- assert(compare != -1);
-
-
- if (compare == 0){
- char temp[TMP_BUF_SIZE];
-
- snprintf(temp, TMP_BUF_SIZE,"Failed iTIP restrictions for property %s. Expected %s instances of the property and got %d",
- icalenum_property_kind_to_string(kind),
- restr_string_map[restr], count);
-
- icalcomponent_add_property
- (comp,
- icalproperty_vanew_xlicerror(
- temp,
- icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP),
- 0));
- }
-
-
- valid = valid && compare;
- }
-
-
-
- return valid;
-
-
-}
-
-int icalrestriction_check(icalcomponent* outer_comp)
-{
- icalcomponent_kind comp_kind;
- icalproperty_method method;
- icalcomponent* inner_comp;
- icalproperty *method_prop;
- int valid;
-
- icalerror_check_arg_rz( (outer_comp!=0), "outer comp");
-
-
- /* Get the Method value from the outer component */
-
- comp_kind = icalcomponent_isa(outer_comp);
-
- if (comp_kind != ICAL_VCALENDAR_COMPONENT){
- icalerror_set_errno(ICAL_BADARG_ERROR);
- return 0;
- }
-
- method_prop = icalcomponent_get_first_property(outer_comp,
- ICAL_METHOD_PROPERTY);
-
- if (method_prop == 0){
- method = ICAL_METHOD_NONE;
- } else {
- method = icalproperty_get_method(method_prop);
- }
-
-
- /* Check the VCALENDAR wrapper */
- valid = icalrestriction_check_component(ICAL_METHOD_NONE,outer_comp);
-
-
- /* Now check the inner components */
-
- for(inner_comp= icalcomponent_get_first_component(outer_comp,
- ICAL_ANY_COMPONENT);
- inner_comp != 0;
- inner_comp= icalcomponent_get_next_component(outer_comp,
- ICAL_ANY_COMPONENT)){
-
- valid = valid && icalrestriction_check_component(method,inner_comp);
-
- }
-
-
- return valid;
-
-}
-
-icalrestriction_kind
-icalrestriction_get_property_restriction(icalproperty_method method,
- icalcomponent_kind component,
- icalproperty_kind property)
-{
- int i;
-
- for(i = 0;
- icalrestriction_property_records[i].restriction != ICAL_RESTRICTION_NONE;
- i++){
-
- if (method == icalrestriction_property_records[i].method &&
- component == icalrestriction_property_records[i].component &&
- property == icalrestriction_property_records[i].property ){
- return icalrestriction_property_records[i].restriction;
- }
- }
-
- return ICAL_RESTRICTION_UNKNOWN;
-}
-
-icalrestriction_kind
-icalrestriction_get_component_restriction(icalproperty_method method,
- icalcomponent_kind component,
- icalcomponent_kind subcomponent)
-{
-
- int i;
-
- for(i = 0;
- icalrestriction_component_records[i].restriction != ICAL_RESTRICTION_NONE;
- i++){
-
- if (method == icalrestriction_component_records[i].method &&
- component == icalrestriction_component_records[i].component &&
- subcomponent == icalrestriction_component_records[i].subcomponent ){
- return icalrestriction_component_records[i].restriction;
- }
- }
-
- return ICAL_RESTRICTION_UNKNOWN;
-}
-
-/* Everything below this line is machine generated. Do not edit. */
-icalrestriction_property_record icalrestriction_property_records[] = {
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,icalrestriction_check_exclusive},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,icalrestriction_check_exclusive},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,icalrestriction_check_exclusive},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,icalrestriction_check_exclusive},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS ,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_NONE}
-};
-icalrestriction_component_record icalrestriction_component_records[] = {
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0},
- {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE}
-};
diff --git a/libical/src/libical/icalrestriction.h b/libical/src/libical/icalrestriction.h
deleted file mode 100644
index ca4beeea7b..0000000000
--- a/libical/src/libical/icalrestriction.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalrestriction.h
- CREATOR: eric 24 April 1999
-
- $Id$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalrestriction.h
-
- Contributions from:
- Graham Davison (g.m.davison@computer.org)
-
-
-======================================================================*/
-
-#include "ical.h"
-
-#ifndef ICALRESTRICTION_H
-#define ICALRESTRICTION_H
-
-/* These must stay in this order for icalrestriction_compare to work */
-typedef enum icalrestriction_kind {
- ICAL_RESTRICTION_NONE=0, /* 0 */
- ICAL_RESTRICTION_ZERO, /* 1 */
- ICAL_RESTRICTION_ONE, /* 2 */
- ICAL_RESTRICTION_ZEROPLUS, /* 3 */
- ICAL_RESTRICTION_ONEPLUS, /* 4 */
- ICAL_RESTRICTION_ZEROORONE, /* 5 */
- ICAL_RESTRICTION_ONEEXCLUSIVE, /* 6 */
- ICAL_RESTRICTION_ONEMUTUAL, /* 7 */
- ICAL_RESTRICTION_UNKNOWN /* 8 */
-} icalrestriction_kind;
-
-int
-icalrestriction_compare(icalrestriction_kind restr, int count);
-
-icalrestriction_kind
-icalrestriction_get_property_restriction(icalproperty_method method,
- icalcomponent_kind component,
- icalproperty_kind property);
-
-icalrestriction_kind
-icalrestriction_get_component_restriction(icalproperty_method method,
- icalcomponent_kind component,
- icalcomponent_kind subcomponent);
-
-int
-icalrestriction_is_parameter_allowed(icalproperty_kind property,
- icalparameter_kind parameter);
-
-int icalrestriction_check(icalcomponent* comp);
-
-
-#endif /* !ICALRESTRICTION_H */
-
-
-
diff --git a/libical/src/libical/icaltypes.c b/libical/src/libical/icaltypes.c
deleted file mode 100644
index b60333887e..0000000000
--- a/libical/src/libical/icaltypes.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icaltypes.c
- CREATOR: eric 16 May 1999
-
- $Id$
- $Locker$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icaltypes.c
-
- ======================================================================*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "icaltypes.h"
-#include "icalerror.h"
-#include "icalmemory.h"
-#include <stdlib.h> /* for malloc */
-#include <errno.h> /* for errno */
-#include <string.h> /* for strdup */
-#include <assert.h>
-#include <limits.h> /* for SHRT_MAX */
-
-#define TEMP_MAX 1024
-
-void*
-icalattachtype_get_data (struct icalattachtype* type);
-
-struct icalattachtype*
-icalattachtype_new()
-{
- struct icalattachtype* v;
-
- if ( ( v = (struct icalattachtype*)
- malloc(sizeof(struct icalattachtype))) == 0) {
- errno = ENOMEM;
- return 0;
- }
-
- v->refcount = 1;
-
- v->binary = 0;
- v->owns_binary = 0;
-
- v->base64 = 0;
- v->owns_base64 = 0;
-
- v->url = 0;
-
- return v;
-}
-
-
-void
-icalattachtype_free(struct icalattachtype* v)
-{
- icalerror_check_arg( (v!=0),"v");
-
- v->refcount--;
-
- if (v->refcount <= 0){
-
- if (v->base64 != 0 && v->owns_base64 != 0){
- free(v->base64);
- }
-
- if (v->binary != 0 && v->owns_binary != 0){
- free(v->binary);
- }
-
- if (v->url != 0){
- free(v->url);
- }
-
- free(v);
- }
-}
-
-void icalattachtype_add_reference(struct icalattachtype* v)
-{
- icalerror_check_arg( (v!=0),"v");
- v->refcount++;
-}
-
-void icalattachtype_set_url(struct icalattachtype* v, char* url)
-{
- icalerror_check_arg( (v!=0),"v");
-
- if (v->url != 0){
- free (v->url);
- }
-
- v->url = strdup(url);
-
- /* HACK This routine should do something if strdup returns NULL */
-
-}
-
-char* icalattachtype_get_url(struct icalattachtype* v)
-{
- icalerror_check_arg( (v!=0),"v");
- return v->url;
-}
-
-void icalattachtype_set_base64(struct icalattachtype* v, char* base64,
- int owns)
-{
- icalerror_check_arg( (v!=0),"v");
-
- v->base64 = base64;
- v->owns_base64 = !(owns != 0 );
-
-}
-
-char* icalattachtype_get_base64(struct icalattachtype* v)
-{
- icalerror_check_arg( (v!=0),"v");
- return v->base64;
-}
-
-void icalattachtype_set_binary(struct icalattachtype* v, char* binary,
- int owns)
-{
- icalerror_check_arg( (v!=0),"v");
-
- v->binary = binary;
- v->owns_binary = !(owns != 0 );
-
-}
-
-void* icalattachtype_get_binary(struct icalattachtype* v)
-{
- icalerror_check_arg( (v!=0),"v");
- return v->binary;
-}
-
-
-
-time_t
-icalperiodtype_duration (struct icalperiodtype period);
-
-
-time_t
-icalperiodtype_end (struct icalperiodtype period);
-
-struct icaltimetype
-icaltimetype_from_timet(time_t v, int date)
-{
- struct icaltimetype tt;
- struct tm t;
- time_t tm = time(&v);
-
-/* HACK Does not properly consider timezone */
- t = *(gmtime(&tm));
-
- tt.second = t.tm_sec;
- tt.minute = t.tm_min;
- tt.hour = t.tm_hour;
- tt.day = t.tm_mday;
- tt.month = t.tm_mon + 1;
- tt.year = t.tm_year+ 1900;
-
- tt.is_utc = 1;
- tt.is_date = date;
-
- return tt;
-}
-
-/* From Russel Steinthal */
-time_t icaldurationtype_as_timet(struct icaldurationtype dur)
-{
- return (time_t) (dur.seconds +
- (60 * dur.minutes) +
- (60 * 60 * dur.hours) +
- (60 * 60 * 24 * dur.days) +
- (60 * 60 * 24 * 7 * dur.weeks));
-}
-
-/* From Seth Alves, <alves@hungry.com> */
-struct icaldurationtype icaldurationtype_from_timet(time_t t)
-{
- struct icaldurationtype dur;
- time_t used = 0;
-
- dur.weeks = (t - used) / (60 * 60 * 24 * 7);
- used += dur.weeks * (60 * 60 * 24 * 7);
- dur.days = (t - used) / (60 * 60 * 24);
- used += dur.days * (60 * 60 * 24);
- dur.hours = (t - used) / (60 * 60);
- used += dur.hours * (60 * 60);
- dur.minutes = (t - used) / (60);
- used += dur.minutes * (60);
- dur.seconds = (t - used);
-
- return dur;
-}
-
-void icalrecurrencetype_clear(struct icalrecurrencetype *recur)
-{
- memset(recur,ICAL_RECURRENCE_ARRAY_MAX_BYTE,
- sizeof(struct icalrecurrencetype));
-
- recur->week_start = ICAL_NO_WEEKDAY;
- recur->freq = ICAL_NO_RECURRENCE;
- recur->interval = 0;
- recur->until.year = 0;
- recur->count = 0;
-}
-
-
-struct icalreqstattype icalreqstattype_from_string(char* str)
-{
- char *p1,*p2;
- size_t len;
- struct icalreqstattype stat;
- int major, minor;
-
- icalerror_check_arg((str != 0),"str");
-
- stat.code = ICAL_UNKNOWN_STATUS;
- stat.debug = 0;
-
- stat.desc = 0;
-
- /* Get the status numbers */
-
- sscanf(str, "%d.%d",&major, &minor);
-
- if (major <= 0 || minor < 0){
- icalerror_set_errno(ICAL_BADARG_ERROR);
- return stat;
- }
-
- stat.code = icalenum_num_to_reqstat(major, minor);
-
- if (stat.code == ICAL_UNKNOWN_STATUS){
- icalerror_set_errno(ICAL_BADARG_ERROR);
- return stat;
- }
-
-
- p1 = strchr(str,';');
-
- if (p1 == 0){
- icalerror_set_errno(ICAL_BADARG_ERROR);
- return stat;
- }
-
- /* Just ignore the second clause; it will be taken from inside the library
- */
-
-
-
- p2 = strchr(p1+1,';');
- if (p2 != 0 && *p2 != 0){
- stat.debug = p2+1;
- }
-
- return stat;
-
-}
-
-char* icalreqstattype_as_string(struct icalreqstattype stat)
-{
- char format[20];
- char *temp;
-
- temp = (char*)icalmemory_tmp_buffer(TEMP_MAX);
-
- icalerror_check_arg_rz((stat.code != ICAL_UNKNOWN_STATUS),"Status");
-
- if (stat.desc == 0){
- stat.desc = icalenum_reqstat_desc(stat.code);
- }
-
- if(stat.debug != 0){
- snprintf(temp,TEMP_MAX,"%d.%d;%s;%s", icalenum_reqstat_major(stat.code),
- icalenum_reqstat_minor(stat.code),
- stat.desc, stat.debug);
-
- } else {
- snprintf(temp,TEMP_MAX,"%d.%d;%s", icalenum_reqstat_major(stat.code),
- icalenum_reqstat_minor(stat.code),
- stat.desc);
- }
-
- return temp;
-}
diff --git a/libical/src/libical/icaltypes.h b/libical/src/libical/icaltypes.h
deleted file mode 100644
index 77a67fae80..0000000000
--- a/libical/src/libical/icaltypes.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icaltypes.h
- CREATOR: eric 20 March 1999
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icaltypes.h
-
-======================================================================*/
-
-#ifndef ICALTYPES_H
-#define ICALTYPES_H
-
-#include <time.h>
-#include "icalenums.h" /* for recurrence enums */
-
-/* This type type should probably be an opaque type... */
-struct icalattachtype
-{
- void* binary;
- int owns_binary;
-
- char* base64;
- int owns_base64;
-
- char* url;
-
- int refcount;
-
-};
-
-/* converts base64 to binary, fetches url and stores as binary, or
- just returns data */
-
-struct icalattachtype* icalattachtype_new();
-void icalattachtype_add_reference(struct icalattachtype* v);
-void icalattachtype_free(struct icalattachtype* v);
-
-void icalattachtype_set_url(struct icalattachtype* v, char* url);
-char* icalattachtype_get_url(struct icalattachtype* v);
-
-void icalattachtype_set_base64(struct icalattachtype* v, char* base64,
- int owns);
-char* icalattachtype_get_base64(struct icalattachtype* v);
-
-void icalattachtype_set_binary(struct icalattachtype* v, char* binary,
- int owns);
-void* icalattachtype_get_binary(struct icalattachtype* v);
-
-struct icalgeotype
-{
- float lat;
- float lon;
-};
-
-struct icaltimetype
-{
- int year;
- int month;
- int day;
- int hour;
- int minute;
- int second;
-
- int is_utc; /* 1-> time is in UTC timezone */
-
- int is_date; /* 1 -> interpret this as date. */
-};
-
-struct icaltimetype icaltimetype_from_timet(time_t v, int is_date);
-
-
-/* See RFC 2445 Section 4.3.10, RECUR Value, for an explaination of
- the values and fields in struct icalrecurrencetype */
-
-
-struct icalrecurrencetype
-{
- icalrecurrencetype_frequency freq;
-
-
- /* until and count are mutually exclusive. */
- struct icaltimetype until;
- int count;
-
- short interval;
-
- icalrecurrencetype_weekday week_start;
-
- /* The BY* parameters can each take a list of values. Here I
- * assume that the list of values will not be larger than the
- * range of the value -- that is, the client will not name a
- * value more than once.
-
- * Each of the lists is terminated with the value SHRT_MAX
- * unless the the list is full. */
-
- short by_second[61];
- short by_minute[61];
- short by_hour[25];
- short by_day[8];
- short by_month_day[32];
- short by_year_day[367];
- short by_week_no[54];
- short by_month[13];
- short by_set_pos[367];
-};
-
-
-void icalrecurrencetype_clear(struct icalrecurrencetype *r);
-
-struct icaldurationtype
-{
- unsigned int days;
- unsigned int weeks;
- unsigned int hours;
- unsigned int minutes;
- unsigned int seconds;
-};
-
-struct icaldurationtype icaldurationtype_from_timet(time_t t);
-time_t icaldurationtype_as_timet(struct icaldurationtype duration);
-
-/* Return the next occurance of 'r' after the time specified by 'after' */
-struct icaltimetype icalrecurrencetype_next_occurance(
- struct icalrecurrencetype *r,
- struct icaltimetype *after);
-
-
-struct icalperiodtype
-{
- struct icaltimetype start; /* Must be absolute */
- struct icaltimetype end; /* Must be absolute */
- struct icaldurationtype duration;
-};
-
-time_t icalperiodtype_duration(struct icalperiodtype period);
-time_t icalperiodtype_end(struct icalperiodtype period);
-
-union icaltriggertype
-{
- struct icaltimetype time;
- struct icaldurationtype duration;
-};
-
-
-/* struct icalreqstattype. This struct contains two string pointers,
-but don't try to free either of them. The "desc" string is a pointer
-to a static table inside the library. Don't try to free it. The
-"debug" string is a pointer into the string that the called passed
-into to icalreqstattype_from_string. Don't try to free it either, and
-don't use it after the original string has been freed.
-
-BTW, you would get that original string from
-*icalproperty_get_requeststatus() or icalvalue_get_text(), when
-operating on a the value of a request_status property. */
-
-struct icalreqstattype {
-
- icalrequeststatus code;
- char* desc;
- char* debug;
-};
-
-struct icalreqstattype icalreqstattype_from_string(char* str);
-char* icalreqstattype_as_string(struct icalreqstattype);
-
-#endif /* !ICALTYPES_H */
diff --git a/libical/src/libical/icalvalue.c b/libical/src/libical/icalvalue.c
deleted file mode 100644
index 79eb8d827a..0000000000
--- a/libical/src/libical/icalvalue.c
+++ /dev/null
@@ -1,2104 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalvalue.c
- CREATOR: eric 02 May 1999
-
- $Id$
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalvalue.c
-
- Contributions from:
- Graham Davison (g.m.davison@computer.org)
-
-
-======================================================================*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-
-#include "ical.h"
-#include "icalerror.h"
-#include "icalmemory.h"
-#include "icalparser.h"
-#include "icalenums.h"
-
-#include <stdlib.h> /* for malloc */
-#include <stdio.h> /* for sprintf */
-#include <string.h> /* For memset, others */
-#include <stddef.h> /* For offsetof() macro */
-#include <errno.h>
-#include <time.h> /* for mktime */
-#include <stdlib.h> /* for atoi and atof */
-#include <limits.h> /* for SHRT_MAX */
-
-#if _MAC_OS_
-#include "strdup.h"
-#endif
-
-#define TMP_BUF_SIZE 1024
-
-void print_datetime_to_string(char* str, struct icaltimetype *data);
-void print_date_to_string(char* str, struct icaltimetype *data);
-void print_time_to_string(char* str, struct icaltimetype *data);
-void print_recur_to_string(char* str, struct icaltimetype *data);
-
-struct icalvalue_impl {
- icalvalue_kind kind;
- char id[5];
- int size;
- icalproperty* parent;
-
- union data {
- struct icalattachtype v_attach;
- /* void *v_binary; */ /* use v_attach */
- char *v_string;
- /*char *v_text;*/
- /*char *v_caladdress;*/
- /*char *v_uri;*/
- float v_float;
- int v_int;
- /*int v_boolean;*/
- /*int v_integer;*/
- struct icaldurationtype v_duration;
- /*int v_utcoffset;*/
-
- struct icalperiodtype v_period;
- /*struct icalperiodtype v_datetimeperiod;*/
- struct icalgeotype v_geo;
- /*time_t v_time;*/
- struct icaltimetype v_time;
- /*struct icaltimetype v_date;*/
- /*struct icaltimetype v_datetime;*/
- /*struct icaltimetype v_datetimedate;*/
-
- /* struct icalrecurrencetype was once a value in this
- union, but it contributes 2000 bytes to every*/
-
- struct icalrecurrencetype *v_recur;
- union icaltriggertype v_trigger;
- icalproperty_method v_method;
-
- } data;
-};
-
-struct icalvalue_impl* icalvalue_new_impl(icalvalue_kind kind){
-
- struct icalvalue_impl* v;
-
- if ( ( v = (struct icalvalue_impl*)
- malloc(sizeof(struct icalvalue_impl))) == 0) {
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
- }
-
- strcpy(v->id,"val");
-
- v->kind = kind;
- v->size = 0;
- v->parent = 0;
- memset(&(v->data),0,sizeof(v->data));
-
- return v;
-
-}
-
-
-
-icalvalue*
-icalvalue_new (icalvalue_kind kind)
-{
- return (icalvalue*)icalvalue_new_impl(kind);
-}
-
-icalvalue* icalvalue_new_clone(icalvalue* value){
-
- struct icalvalue_impl* new;
- struct icalvalue_impl* old = (struct icalvalue_impl*)value;
-
- new = icalvalue_new_impl(old->kind);
-
- if (new == 0){
- return 0;
- }
-
-
- strcpy(new->id, old->id);
- new->kind = old->kind;
- new->size = old->size;
-
- switch (new->kind){
-
- /* The contents of the attach value may or may not be owned by the
- * library. */
- case ICAL_ATTACH_VALUE:
- case ICAL_BINARY_VALUE:
- {
- /* HACK ugh. I don't feel like impleenting this */
- }
-
- case ICAL_STRING_VALUE:
- case ICAL_TEXT_VALUE:
- case ICAL_CALADDRESS_VALUE:
- case ICAL_URI_VALUE:
- {
- if (old->data.v_string != 0) {
- new->data.v_string=strdup(old->data.v_string);
-
- if ( new->data.v_string == 0 ) {
- return 0;
- }
-
- }
- break;
- }
- case ICAL_RECUR_VALUE:
- {
- if(old->data.v_recur != 0){
- new->data.v_recur = malloc(sizeof(struct icalrecurrencetype));
-
- if(new->data.v_recur == 0){
- return 0;
- }
-
- memcpy( new->data.v_recur, old->data.v_recur,
- sizeof(struct icalrecurrencetype));
- }
- break;
- }
-
- default:
- {
- /* all of the other types are stored as values, not
- pointers, so we can just copy the whole structure. */
-
- new->data = old->data;
- }
- }
-
- return new;
-}
-
-char* strdup_and_dequote(char* str)
-{
- char* p;
- char* out = (char*)malloc(sizeof(char) * strlen(str) +1);
- char* pout;
-
- if (out == 0){
- return 0;
- }
-
- pout = out;
-
- for (p = str; *p!=0; p++){
-
- if( *p == '\\')
- {
- p++;
- switch(*p){
- case 0:
- {
- break;
- *pout = '\0';
- }
- case 'n':
- {
- *pout = '\n';
- break;
- }
- case 'N':
- {
- *pout = '\n';
- break;
- }
- case '\\':
- case ',':
- case ';':
- {
- *pout = *p;
- break;
- }
- default:
- {
- *pout = ' ';
- }
- }
- } else {
- *pout = *p;
- }
-
- pout++;
-
- }
-
- *pout = '\0';
-
- return out;
-}
-
-icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,char* str,icalproperty** error)
-{
-
- icalvalue *value = 0;
-
- icalerror_check_arg_rz(str!=0,"str");
-
- if (error != 0){
- *error = 0;
- }
-
- switch (kind){
-
- case ICAL_ATTACH_VALUE:
- {
- /* HACK */
- value = 0;
-
- if (error != 0){
- char temp[TMP_BUF_SIZE];
- sprintf(temp,"ATTACH Values are not implemented");
- *error = icalproperty_vanew_xlicerror(
- temp,
- icalparameter_new_xlicerrortype(
- ICAL_XLICERRORTYPE_VALUEPARSEERROR),
- 0);
- }
-
- icalerror_warn("Parsing ATTACH properties is unimplmeneted");
- break;
- }
-
- case ICAL_BINARY_VALUE:
- {
- /* HACK */
- value = 0;
-
- if (error != 0){
- char temp[TMP_BUF_SIZE];
- sprintf(temp,"BINARY Values are not implemented");
- *error = icalproperty_vanew_xlicerror(
- temp,
- icalparameter_new_xlicerrortype(
- ICAL_XLICERRORTYPE_VALUEPARSEERROR),
- 0);
- }
-
- icalerror_warn("Parsing BINARY values is unimplmeneted");
- break;
- }
-
- case ICAL_BOOLEAN_VALUE:
- {
- /* HACK */
- value = 0;
-
- if (error != 0){
- char temp[TMP_BUF_SIZE];
- sprintf(temp,"BOOLEAN Values are not implemented");
- *error = icalproperty_vanew_xlicerror(
- temp,
- icalparameter_new_xlicerrortype(
- ICAL_XLICERRORTYPE_VALUEPARSEERROR),
- 0);
- }
-
- icalerror_warn("Parsing BOOLEAN values is unimplmeneted");
- break;
- }
-
- case ICAL_INTEGER_VALUE:
- {
- value = icalvalue_new_integer(atoi(str));
- break;
- }
-
- case ICAL_FLOAT_VALUE:
- {
- value = icalvalue_new_float(atof(str));
- break;
- }
-
- case ICAL_UTCOFFSET_VALUE:
- {
- value = icalparser_parse_value(kind,str,(icalcomponent*)0);
- break;
- }
-
- case ICAL_TEXT_VALUE:
- {
- char* dequoted_str = strdup_and_dequote(str);
- value = icalvalue_new_text(dequoted_str);
- free(dequoted_str);
- break;
- }
-
-
- case ICAL_STRING_VALUE:
- {
- value = icalvalue_new_string(str);
- break;
- }
-
- case ICAL_CALADDRESS_VALUE:
- {
- value = icalvalue_new_caladdress(str);
- break;
- }
-
- case ICAL_URI_VALUE:
- {
- value = icalvalue_new_uri(str);
- break;
- }
-
- case ICAL_METHOD_VALUE:
- {
- icalproperty_method method = icalenum_string_to_method(str);
-
- if(method == ICAL_METHOD_NONE){
- value = 0;
- } else {
- value = icalvalue_new_method(method);
- }
-
- break;
-
- }
- case ICAL_GEO_VALUE:
- {
- value = 0;
- /* HACK */
-
- if (error != 0){
- char temp[TMP_BUF_SIZE];
- sprintf(temp,"GEO Values are not implemented");
- *error = icalproperty_vanew_xlicerror(
- temp,
- icalparameter_new_xlicerrortype(
- ICAL_XLICERRORTYPE_VALUEPARSEERROR),
- 0);
- }
-
- /*icalerror_warn("Parsing GEO properties is unimplmeneted");*/
-
- break;
- }
-
- case ICAL_RECUR_VALUE:
- case ICAL_DATE_VALUE:
- case ICAL_DATETIME_VALUE:
- case ICAL_DATETIMEDATE_VALUE:
- case ICAL_DATETIMEPERIOD_VALUE:
- case ICAL_TIME_VALUE:
- case ICAL_DURATION_VALUE:
- case ICAL_PERIOD_VALUE:
- case ICAL_TRIGGER_VALUE:
- {
- value = icalparser_parse_value(kind,str,error);
- break;
- }
-
- default:
- {
-
- if (error != 0 ){
- char temp[TMP_BUF_SIZE];
-
- snprintf(temp,TMP_BUF_SIZE,"Unknown type for \'%s\'",str);
-
- *error = icalproperty_vanew_xlicerror(
- temp,
- icalparameter_new_xlicerrortype(
- ICAL_XLICERRORTYPE_VALUEPARSEERROR),
- 0);
- }
-
- icalerror_warn("icalvalue_new_from_string got an unknown value type");
- value=0;
- }
- }
-
-
- if (error != 0 && *error == 0 && value == 0){
- char temp[TMP_BUF_SIZE];
-
- snprintf(temp,TMP_BUF_SIZE,"Failed to parse value: \'%s\'",str);
-
- *error = icalproperty_vanew_xlicerror(
- temp,
- icalparameter_new_xlicerrortype(
- ICAL_XLICERRORTYPE_VALUEPARSEERROR),
- 0);
- }
-
-
- return value;
-
-}
-
-icalvalue* icalvalue_new_from_string(icalvalue_kind kind,char* str)
-{
- return icalvalue_new_from_string_with_error(kind,str,(icalproperty*)0);
-}
-
-
-
-void
-icalvalue_free (icalvalue* value)
-{
- struct icalvalue_impl* v = (struct icalvalue_impl*)value;
-
- icalerror_check_arg_rv((value != 0),"value");
-
-#ifdef ICAL_FREE_ON_LIST_IS_ERROR
- icalerror_assert( (v->parent ==0),"This value is still attached to a property");
-
-#else
- if(v->parent !=0){
- return;
- }
-#endif
-
-
- switch (v->kind){
- case ICAL_BINARY_VALUE:
- case ICAL_ATTACH_VALUE: {
- /* HACK ugh. This will be tough to implement */
- }
- case ICAL_TEXT_VALUE:
- case ICAL_CALADDRESS_VALUE:
- case ICAL_URI_VALUE:
- {
- if (v->data.v_string != 0) {
- free(v->data.v_string);
- v->data.v_string = 0;
- }
- break;
- }
- case ICAL_RECUR_VALUE:
- {
- if(v->data.v_recur != 0){
- free(v->data.v_recur);
- v->data.v_recur = 0;
- }
- break;
- }
-
- default:
- {
- /* Nothing to do */
- }
- }
-
- v->kind = ICAL_NO_VALUE;
- v->size = 0;
- v->parent = 0;
- memset(&(v->data),0,sizeof(v->data));
- v->id[0] = 'X';
- free(v);
-}
-
-int
-icalvalue_is_valid (icalvalue* value)
-{
- /*struct icalvalue_impl* v = (struct icalvalue_impl*)value;*/
-
- if(value == 0){
- return 0;
- }
-
- return 1;
-}
-
-char* icalvalue_binary_as_ical_string(icalvalue* value) {
-
- char* data;
- char* str;
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_binary(value);
-
- str = (char*)icalmemory_tmp_buffer(60);
- sprintf(str,"icalvalue_binary_as_ical_string is not implemented yet");
-
- return str;
-}
-
-
-char* icalvalue_int_as_ical_string(icalvalue* value) {
-
- int data;
- char* str = (char*)icalmemory_tmp_buffer(2);
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_integer(value);
-
- sprintf(str,"%d",data);
-
- return str;
-}
-
-char* icalvalue_utcoffset_as_ical_string(icalvalue* value)
-{
- int data,h,m,s;
- char sign;
- char* str = (char*)icalmemory_tmp_buffer(9);
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_utcoffset(value);
-
- if (abs(data) == data){
- sign = '+';
- } else {
- sign = '-';
- }
-
- h = data/3600;
- m = (data - (h*3600))/ 60;
- s = (data - (h*3600) - (m*60));
-
- sprintf(str,"%c%02d%02d%02d",sign,abs(h),abs(m),abs(s));
-
- return str;
-}
-
-char* icalvalue_string_as_ical_string(icalvalue* value) {
-
- char* data;
- char* str = 0;
- icalerror_check_arg_rz( (value!=0),"value");
- data = ((struct icalvalue_impl*)value)->data.v_string;
-
- str = (char*)icalmemory_tmp_buffer(strlen(data)+1);
-
- strcpy(str,data);
-
- return str;
-}
-
-
-char* icalvalue_recur_as_ical_string(icalvalue* value)
-{
- char* str;
- char *str_p;
- size_t buf_sz = 200;
- char temp[20];
- int i,j;
- struct icalvalue_impl *impl = (struct icalvalue_impl*)value;
- struct icalrecurrencetype *recur = impl->data.v_recur;
-
- struct { char* str;size_t offset; short limit; } recurmap[] =
- {
- {";BYSECOND=",offsetof(struct icalrecurrencetype,by_second),60},
- {";BYMINUTE=",offsetof(struct icalrecurrencetype,by_minute),60},
- {";BYHOUR=",offsetof(struct icalrecurrencetype,by_hour),24},
- {";BYDAY=",offsetof(struct icalrecurrencetype,by_day),7},
- {";BYMONTHDAY=",offsetof(struct icalrecurrencetype,by_month_day),31},
- {";BYYEARDAY=",offsetof(struct icalrecurrencetype,by_year_day),366},
- {";BYWEEKNO=",offsetof(struct icalrecurrencetype,by_week_no),52},
- {";BYMONTH=",offsetof(struct icalrecurrencetype,by_month),12},
- {";BYSETPOS=",offsetof(struct icalrecurrencetype,by_set_pos),366},
- {0,0,0},
- };
-
-
-
- icalerror_check_arg_rz((value != 0),"value");
-
- if(recur->freq == ICAL_NO_RECURRENCE){
- return 0;
- }
-
- str = (char*)icalmemory_tmp_buffer(buf_sz);
- str_p = str;
-
- icalmemory_append_string(&str,&str_p,&buf_sz,"FREQ=");
- icalmemory_append_string(&str,&str_p,&buf_sz,
- icalenum_recurrence_to_string(recur->freq));
-
- if(recur->until.year != 0){
-
- temp[0] = 0;
- print_datetime_to_string(temp,&(recur->until));
-
- icalmemory_append_string(&str,&str_p,&buf_sz,";UNTIL=");
- icalmemory_append_string(&str,&str_p,&buf_sz, temp);
- }
-
- if(recur->count != 0){
- sprintf(temp,"%d",recur->count);
- icalmemory_append_string(&str,&str_p,&buf_sz,";COUNT=");
- icalmemory_append_string(&str,&str_p,&buf_sz, temp);
- }
-
- if(recur->interval != 0){
- sprintf(temp,"%d",recur->interval);
- icalmemory_append_string(&str,&str_p,&buf_sz,";INTERVAL=");
- icalmemory_append_string(&str,&str_p,&buf_sz, temp);
- }
-
- for(j =0; recurmap[j].str != 0; j++){
- short* array = (short*)(recurmap[j].offset+ (size_t)recur);
- short limit = recurmap[j].limit;
-
- /* Skip unused arrays */
- if( array[0] != ICAL_RECURRENCE_ARRAY_MAX ) {
-
- icalmemory_append_string(&str,&str_p,&buf_sz,recurmap[j].str);
-
- for(i=0; i< limit && array[i] != ICAL_RECURRENCE_ARRAY_MAX;
- i++){
- if (j == 3) { /* BYDAY */
- icalmemory_append_string(&str,&str_p,&buf_sz,
- icalenum_weekday_to_string(array[i]));
- } else {
- sprintf(temp,"%d",array[i]);
- icalmemory_append_string(&str,&str_p,&buf_sz, temp);
- }
-
- if( (i+1)<limit &&array[i+1]
- != ICAL_RECURRENCE_ARRAY_MAX){
- icalmemory_append_char(&str,&str_p,&buf_sz,',');
- }
- }
- }
- }
-
- return str;
-}
-
-char* icalvalue_text_as_ical_string(icalvalue* value) {
-
- char *str;
- char *str_p;
- char *rtrn;
- char *p;
- size_t buf_sz;
- int line_length;
-
- line_length = 0;
-
- buf_sz = strlen(((struct icalvalue_impl*)value)->data.v_string)+1;
-
- str_p = str = (char*)icalmemory_new_buffer(buf_sz);
-
- if (str_p == 0){
- return 0;
- }
-
- for(p=((struct icalvalue_impl*)value)->data.v_string; *p!=0; p++){
-
- switch(*p){
- case '\n': {
- icalmemory_append_string(&str,&str_p,&buf_sz,"\\n");
- line_length+=3;
- break;
- }
-
- case '\t': {
- icalmemory_append_string(&str,&str_p,&buf_sz,"\\t");
- line_length+=3;
- break;
- }
- case '\r': {
- icalmemory_append_string(&str,&str_p,&buf_sz,"\\r");
- line_length+=3;
- break;
- }
- case '\b': {
- icalmemory_append_string(&str,&str_p,&buf_sz,"\\b");
- line_length+=3;
- break;
- }
- case '\f': {
- icalmemory_append_string(&str,&str_p,&buf_sz,"\\f");
- line_length+=3;
- break;
- }
-
- case ';':
- case ',':{
- icalmemory_append_char(&str,&str_p,&buf_sz,'\\');
- icalmemory_append_char(&str,&str_p,&buf_sz,*p);
- line_length+=3;
- break;
- }
-
- case '"':{
- icalmemory_append_char(&str,&str_p,&buf_sz,'\\');
- icalmemory_append_char(&str,&str_p,&buf_sz,*p);
- line_length+=3;
- break;
- }
-
- default: {
- icalmemory_append_char(&str,&str_p,&buf_sz,*p);
- line_length++;
- }
- }
-
- if (line_length > 65 && *p == ' '){
- icalmemory_append_string(&str,&str_p,&buf_sz,"\n ");
- line_length=0;
- }
-
-
- if (line_length > 75){
- icalmemory_append_string(&str,&str_p,&buf_sz,"\n ");
- line_length=0;
- }
-
- }
-
- /* Assume the last character is not a '\0' and add one. We could
- check *str_p != 0, but that would be an uninitialized memory
- read. */
-
-
- icalmemory_append_char(&str,&str_p,&buf_sz,'\0');
-
- rtrn = icalmemory_tmp_copy(str);
-
- icalmemory_free_buffer(str);
-
- return rtrn;
-}
-
-
-char* icalvalue_attach_as_ical_string(icalvalue* value) {
-
- struct icalattachtype a;
- char * str;
-
- icalerror_check_arg_rz( (value!=0),"value");
-
- a = icalvalue_get_attach(value);
-
- if (a.binary != 0) {
- return icalvalue_binary_as_ical_string(value);
- } else if (a.base64 != 0) {
- str = (char*)icalmemory_tmp_buffer(strlen(a.base64)+1);
- strcpy(str,a.base64);
- return str;
- } else if (a.url != 0){
- return icalvalue_string_as_ical_string(value);
- } else {
- icalerrno = ICAL_MALFORMEDDATA_ERROR;
- return 0;
- }
-}
-
-void append_duration_segment(char** buf, char** buf_ptr, size_t* buf_size,
- char* sep, unsigned int value) {
-
- char temp[TMP_BUF_SIZE];
-
- sprintf(temp,"%d",value);
-
- icalmemory_append_string(buf, buf_ptr, buf_size, temp);
- icalmemory_append_string(buf, buf_ptr, buf_size, sep);
-
-}
-
-char* icalvalue_duration_as_ical_string(icalvalue* value) {
-
- struct icaldurationtype data;
- char *buf, *output_line;
- size_t buf_size = 256;
- char* buf_ptr = 0;
-
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_duration(value);
-
- buf = (char*)icalmemory_new_buffer(buf_size);
- buf_ptr = buf;
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, "P");
-
-
- if (data.weeks != 0 ) {
- append_duration_segment(&buf, &buf_ptr, &buf_size, "W", data.weeks);
- }
-
- if (data.days != 0 ) {
- append_duration_segment(&buf, &buf_ptr, &buf_size, "D", data.days);
- }
-
- if (data.hours != 0 || data.minutes != 0 || data.seconds != 0) {
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, "T");
-
- if (data.hours != 0 ) {
- append_duration_segment(&buf, &buf_ptr, &buf_size, "H", data.hours);
- }
- if (data.minutes != 0 ) {
- append_duration_segment(&buf, &buf_ptr, &buf_size, "M", data.minutes);
- }
- if (data.seconds != 0 ) {
- append_duration_segment(&buf, &buf_ptr, &buf_size, "S", data.seconds);
- }
-
- }
-
- output_line = icalmemory_tmp_copy(buf);
- icalmemory_free_buffer(buf);
-
- return output_line;
-
-
-}
-
-void print_time_to_string(char* str, struct icaltimetype *data)
-{
- char temp[20];
-
- if (data->is_utc == 1){
- sprintf(temp,"%02d%02d%02dZ",data->hour,data->minute,data->second);
- } else {
- sprintf(temp,"%02d%02d%02d",data->hour,data->minute,data->second);
- }
-
- strcat(str,temp);
-}
-
-
-char* icalvalue_time_as_ical_string(icalvalue* value) {
-
- struct icaltimetype data;
- char* str;
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_time(value);
-
- str = (char*)icalmemory_tmp_buffer(8);
-
- str[0] = 0;
- print_time_to_string(str,&data);
-
- return str;
-}
-
-void print_date_to_string(char* str, struct icaltimetype *data)
-{
- char temp[20];
-
- sprintf(temp,"%04d%02d%02d",data->year,data->month,data->day);
-
- strcat(str,temp);
-}
-
-char* icalvalue_date_as_ical_string(icalvalue* value) {
-
- struct icaltimetype data;
- char* str;
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_date(value);
-
- str = (char*)icalmemory_tmp_buffer(9);
-
- str[0] = 0;
- print_date_to_string(str,&data);
-
- return str;
-}
-
-void print_datetime_to_string(char* str, struct icaltimetype *data)
-{
- print_date_to_string(str,data);
- strcat(str,"T");
- print_time_to_string(str,data);
-
-}
-
-char* icalvalue_datetime_as_ical_string(icalvalue* value) {
-
- struct icaltimetype data;
- char* str;
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_date(value);
-
- str = (char*)icalmemory_tmp_buffer(20);
-
- str[0] = 0;
-
- print_datetime_to_string(str,&data);
-
- return str;
-
-}
-
-
-char* icalvalue_datetimedate_as_ical_string(icalvalue* value) {
-
- struct icaltimetype data;
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_datetime(value);
-
- if (data.is_date == 1){
- return icalvalue_date_as_ical_string(value);
- } else {
- return icalvalue_datetime_as_ical_string(value);
- }
-}
-
-
-char* icalvalue_float_as_ical_string(icalvalue* value) {
-
- float data;
- char* str;
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_float(value);
-
- str = (char*)icalmemory_tmp_buffer(15);
-
- sprintf(str,"%f",data);
-
- return str;
-}
-
-char* icalvalue_geo_as_ical_string(icalvalue* value) {
-
- struct icalgeotype data;
- char* str;
- icalerror_check_arg_rz( (value!=0),"value");
-
- data = icalvalue_get_geo(value);
-
- str = (char*)icalmemory_tmp_buffer(25);
-
- sprintf(str,"%f;%f",data.lat,data.lon);
-
- return str;
-}
-
-char* icalvalue_datetimeperiod_as_ical_string(icalvalue* value) {
-
- struct icalperiodtype data;
- char* str;
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_datetimeperiod(value);
-
- str = (char*)icalmemory_tmp_buffer(60);
-
- if( data.end.second == -1){
- /* This is a DATE-TIME value, since there is no end value */
- icalvalue *v= icalvalue_new_datetime(data.start);
-
- strcpy(str,icalvalue_datetime_as_ical_string(v));
-
- free(v);
-
- } else {
- icalvalue *v1 = icalvalue_new_datetime(data.start);
- icalvalue *v2 = icalvalue_new_datetime(data.end);
-
- sprintf(str,"%s/%s",
- icalvalue_datetime_as_ical_string(v1),
- icalvalue_datetime_as_ical_string(v2)
- );
-
- free(v1);
- free(v2);
-
- }
-
- return str;
-}
-
-char* icalvalue_period_as_ical_string(icalvalue* value) {
-
- struct icalperiodtype data;
- char* str;
- icalvalue *s,*e;
-
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_period(value);
-
- str = (char*)icalmemory_tmp_buffer(60);
-
- s = icalvalue_new_datetime(data.start);
-
- if (data.end.second != -1){
- /* use the end date */
- e = icalvalue_new_datetime(data.end);
-
- sprintf(str,"%s/%s",
- icalvalue_datetime_as_ical_string(s),
- icalvalue_datetime_as_ical_string(e)
- );
-
-
- } else {
- /* use the duration */
- e = icalvalue_new_duration(data.duration);
-
- sprintf(str,"%s/%s",
- icalvalue_datetime_as_ical_string(s),
- icalvalue_duration_as_ical_string(e)
- );
-
- }
-
- icalvalue_free(e);
- icalvalue_free(s);
- return str;
-}
-
-char* icalvalue_trigger_as_ical_string(icalvalue* value) {
-
- union icaltriggertype data;
- char* str;
- icalerror_check_arg_rz( (value!=0),"value");
- data = icalvalue_get_trigger(value);
-
- str = (char*)icalmemory_tmp_buffer(60);
- sprintf(str,"icalvalue_trigger_as_ical_string is not implemented yet");
-
- return str;
-}
-
-char*
-icalvalue_as_ical_string (icalvalue* value)
-{
- struct icalvalue_impl* v = (struct icalvalue_impl*)value;
-
- v=v;
-
- if(value == 0){
- return 0;
- }
-
- switch (v->kind){
-
- case ICAL_ATTACH_VALUE:
- return icalvalue_attach_as_ical_string(value);
-
- case ICAL_BINARY_VALUE:
- return icalvalue_binary_as_ical_string(value);
-
- case ICAL_BOOLEAN_VALUE:
- case ICAL_INTEGER_VALUE:
- return icalvalue_int_as_ical_string(value);
-
- case ICAL_UTCOFFSET_VALUE:
- return icalvalue_utcoffset_as_ical_string(value);
-
- case ICAL_TEXT_VALUE:
- return icalvalue_text_as_ical_string(value);
-
- case ICAL_STRING_VALUE:
- case ICAL_URI_VALUE:
- case ICAL_CALADDRESS_VALUE:
- return icalvalue_string_as_ical_string(value);
-
- case ICAL_DATE_VALUE:
- return icalvalue_date_as_ical_string(value);
- case ICAL_DATETIME_VALUE:
- return icalvalue_datetime_as_ical_string(value);
- case ICAL_DATETIMEDATE_VALUE:
- return icalvalue_datetimedate_as_ical_string(value);
- case ICAL_DURATION_VALUE:
- return icalvalue_duration_as_ical_string(value);
- case ICAL_TIME_VALUE:
- return icalvalue_time_as_ical_string(value);
-
- case ICAL_PERIOD_VALUE:
- return icalvalue_period_as_ical_string(value);
- case ICAL_DATETIMEPERIOD_VALUE:
- return icalvalue_datetimeperiod_as_ical_string(value);
-
- case ICAL_FLOAT_VALUE:
- return icalvalue_float_as_ical_string(value);
-
- case ICAL_GEO_VALUE:
- return icalvalue_geo_as_ical_string(value);
-
- case ICAL_RECUR_VALUE:
- return icalvalue_recur_as_ical_string(value);
-
- case ICAL_TRIGGER_VALUE:
- return icalvalue_trigger_as_ical_string(value);
-
- case ICAL_METHOD_VALUE:
- return icalenum_method_to_string(v->data.v_method);
-
- case ICAL_NO_VALUE:
- default:
- {
- return 0;
- }
- }
-}
-
-
-icalvalue_kind
-icalvalue_isa (icalvalue* value)
-{
- struct icalvalue_impl* v = (struct icalvalue_impl*)value;
-
- if(value == 0){
- return ICAL_NO_VALUE;
- }
-
- return v->kind;
-}
-
-
-int
-icalvalue_isa_value (void* value)
-{
- struct icalvalue_impl *impl = (struct icalvalue_impl *)value;
-
- icalerror_check_arg_rz( (value!=0), "value");
-
- if (strcmp(impl->id,"val") == 0) {
- return 1;
- } else {
- return 0;
- }
-}
-
-
-icalparameter_xliccomparetype
-icalvalue_compare(icalvalue* a, icalvalue *b)
-{
- struct icalvalue_impl *impla = (struct icalvalue_impl *)a;
- struct icalvalue_impl *implb = (struct icalvalue_impl *)b;
-
- icalerror_check_arg_rz( (a!=0), "a");
- icalerror_check_arg_rz( (b!=0), "b");
-
- /* Not the same type; they can only be unequal */
- if (icalvalue_isa(a) != icalvalue_isa(b)){
- return ICAL_XLICCOMPARETYPE_NOTEQUAL;
- }
-
- switch (icalvalue_isa(a)){
-
- case ICAL_ATTACH_VALUE:
- case ICAL_BINARY_VALUE:
-
- case ICAL_BOOLEAN_VALUE:
- {
- if (icalvalue_get_boolean(a) == icalvalue_get_boolean(b)){
- return ICAL_XLICCOMPARETYPE_EQUAL;
- } else {
- return ICAL_XLICCOMPARETYPE_NOTEQUAL;
- }
- }
-
- case ICAL_FLOAT_VALUE:
- {
- if (impla->data.v_float > implb->data.v_float){
- return ICAL_XLICCOMPARETYPE_GREATER;
- } else if (impla->data.v_float < implb->data.v_float){
- return ICAL_XLICCOMPARETYPE_LESS;
- } else {
- return ICAL_XLICCOMPARETYPE_EQUAL;
- }
- }
-
- case ICAL_INTEGER_VALUE:
- case ICAL_UTCOFFSET_VALUE:
- {
- if (impla->data.v_int > implb->data.v_int){
- return ICAL_XLICCOMPARETYPE_GREATER;
- } else if (impla->data.v_int < implb->data.v_int){
- return ICAL_XLICCOMPARETYPE_LESS;
- } else {
- return ICAL_XLICCOMPARETYPE_EQUAL;
- }
- }
-
- case ICAL_TEXT_VALUE:
- case ICAL_URI_VALUE:
- case ICAL_CALADDRESS_VALUE:
- case ICAL_TRIGGER_VALUE:
- case ICAL_DATE_VALUE:
- case ICAL_DATETIME_VALUE:
- case ICAL_DATETIMEDATE_VALUE:
- case ICAL_DURATION_VALUE: /* HACK. Not correct for DURATION */
- case ICAL_TIME_VALUE:
- case ICAL_DATETIMEPERIOD_VALUE:
- {
- int r;
-
- r = strcmp(icalvalue_as_ical_string(a),
- icalvalue_as_ical_string(b));
-
- if (r > 0) {
- return ICAL_XLICCOMPARETYPE_GREATER;
- } else if (r < 0){
- return ICAL_XLICCOMPARETYPE_LESS;
- } else {
- return 0;
- }
-
-
- }
-
- case ICAL_METHOD_VALUE:
- {
- if (icalvalue_get_method(a) == icalvalue_get_method(b)){
- return ICAL_XLICCOMPARETYPE_EQUAL;
- } else {
- return ICAL_XLICCOMPARETYPE_NOTEQUAL;
- }
-
- }
- case ICAL_PERIOD_VALUE:
- case ICAL_GEO_VALUE:
- case ICAL_RECUR_VALUE:
- case ICAL_NO_VALUE:
- default:
- {
- icalerror_warn("Comparison not implemented for value type");
- return ICAL_XLICCOMPARETYPE_REGEX+1; /* HACK */
- }
- }
-
-}
-
-void icalvalue_set_parent(icalvalue* value,
- icalproperty* property)
-{
- struct icalvalue_impl* v = (struct icalvalue_impl*)value;
-
- v->parent = property;
-
-}
-
-icalproperty* icalvalue_get_parent(icalvalue* value)
-{
- struct icalvalue_impl* v = (struct icalvalue_impl*)value;
-
-
- return v->parent;
-}
-
-
-
-/* Recur is a special case, so it is not auto generated. Well,
- actually, it is auto-generated, but you will have to manually
- remove the auto-generated version after each generation. */
-icalvalue*
-icalvalue_new_recur (struct icalrecurrencetype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_RECUR_VALUE);
-
- icalvalue_set_recur((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_recur(icalvalue* value, struct icalrecurrencetype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_RECUR_VALUE);
-
- impl = (struct icalvalue_impl*)value;
-
- if (impl->data.v_recur != 0){
- free(impl->data.v_recur);
- impl->data.v_recur = 0;
- }
-
- impl->data.v_recur = malloc(sizeof(struct icalrecurrencetype));
-
- if (impl->data.v_recur == 0){
- icalerror_set_errno(ICAL_ALLOCATION_ERROR);
- return;
- } else {
- memcpy(impl->data.v_recur, &v, sizeof(struct icalrecurrencetype));
- }
-
-}
-
-struct icalrecurrencetype
-icalvalue_get_recur(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_RECUR_VALUE);
-
- return *(((struct icalvalue_impl*)value)->data.v_recur);
-}
-
-
-
-
-/* The remaining interfaces are 'new', 'set' and 'get' for each of the value
- types */
-
-
-/* Everything below this line is machine generated. Do not edit. */
-
-icalvalue*
-icalvalue_new_attach (struct icalattachtype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_ATTACH_VALUE);
-
-
- icalvalue_set_attach((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_attach(icalvalue* value, struct icalattachtype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_ATTACH_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_attach = v;
-}
-
-struct icalattachtype
-icalvalue_get_attach(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_ATTACH_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_attach;
-}
-
-
-icalvalue*
-icalvalue_new_binary (char* v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_BINARY_VALUE);
-
- icalerror_check_arg_rz( (v!=0),"v");
-
- icalvalue_set_binary((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_binary(icalvalue* value, char* v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_value_type(value, ICAL_BINARY_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_string = strdup(v);
-
- if (impl->data.v_string == 0){
- errno = ENOMEM;
- }
-
-}
-
-char*
-icalvalue_get_binary(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_BINARY_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_string;
-}
-
-
-icalvalue*
-icalvalue_new_boolean (int v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_BOOLEAN_VALUE);
-
-
- icalvalue_set_boolean((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_boolean(icalvalue* value, int v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_BOOLEAN_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_int = v;
-}
-
-int
-icalvalue_get_boolean(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_BOOLEAN_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_int;
-}
-
-
-icalvalue*
-icalvalue_new_caladdress (char* v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_CALADDRESS_VALUE);
-
- icalerror_check_arg_rz( (v!=0),"v");
-
- icalvalue_set_caladdress((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_caladdress(icalvalue* value, char* v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_value_type(value, ICAL_CALADDRESS_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_string = strdup(v);
-
- if (impl->data.v_string == 0){
- errno = ENOMEM;
- }
-
-}
-
-char*
-icalvalue_get_caladdress(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_CALADDRESS_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_string;
-}
-
-
-icalvalue*
-icalvalue_new_date (struct icaltimetype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATE_VALUE);
-
-
- icalvalue_set_date((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_date(icalvalue* value, struct icaltimetype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_DATE_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_time = v;
-}
-
-struct icaltimetype
-icalvalue_get_date(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_DATE_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_time;
-}
-
-
-icalvalue*
-icalvalue_new_datetime (struct icaltimetype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATETIME_VALUE);
-
-
- icalvalue_set_datetime((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_datetime(icalvalue* value, struct icaltimetype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_DATETIME_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_time = v;
-}
-
-struct icaltimetype
-icalvalue_get_datetime(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_DATETIME_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_time;
-}
-
-
-icalvalue*
-icalvalue_new_datetimedate (struct icaltimetype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATETIMEDATE_VALUE);
-
-
- icalvalue_set_datetimedate((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_datetimedate(icalvalue* value, struct icaltimetype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_DATETIMEDATE_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_time = v;
-}
-
-struct icaltimetype
-icalvalue_get_datetimedate(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_DATETIMEDATE_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_time;
-}
-
-
-icalvalue*
-icalvalue_new_datetimeperiod (struct icalperiodtype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATETIMEPERIOD_VALUE);
-
-
- icalvalue_set_datetimeperiod((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_datetimeperiod(icalvalue* value, struct icalperiodtype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_period = v;
-}
-
-struct icalperiodtype
-icalvalue_get_datetimeperiod(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_period;
-}
-
-
-icalvalue*
-icalvalue_new_duration (struct icaldurationtype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DURATION_VALUE);
-
-
- icalvalue_set_duration((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_duration(icalvalue* value, struct icaldurationtype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_DURATION_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_duration = v;
-}
-
-struct icaldurationtype
-icalvalue_get_duration(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_DURATION_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_duration;
-}
-
-
-icalvalue*
-icalvalue_new_float (float v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_FLOAT_VALUE);
-
-
- icalvalue_set_float((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_float(icalvalue* value, float v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_FLOAT_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_float = v;
-}
-
-float
-icalvalue_get_float(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_FLOAT_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_float;
-}
-
-
-icalvalue*
-icalvalue_new_geo (struct icalgeotype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_GEO_VALUE);
-
-
- icalvalue_set_geo((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_geo(icalvalue* value, struct icalgeotype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_GEO_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_geo = v;
-}
-
-struct icalgeotype
-icalvalue_get_geo(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_GEO_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_geo;
-}
-
-
-icalvalue*
-icalvalue_new_integer (int v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_INTEGER_VALUE);
-
-
- icalvalue_set_integer((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_integer(icalvalue* value, int v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_INTEGER_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_int = v;
-}
-
-int
-icalvalue_get_integer(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_INTEGER_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_int;
-}
-
-
-icalvalue*
-icalvalue_new_method (icalproperty_method v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_METHOD_VALUE);
-
-
- icalvalue_set_method((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_method(icalvalue* value, icalproperty_method v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_METHOD_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_method = v;
-}
-
-icalproperty_method
-icalvalue_get_method(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_METHOD_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_method;
-}
-
-
-icalvalue*
-icalvalue_new_period (struct icalperiodtype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_PERIOD_VALUE);
-
-
- icalvalue_set_period((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_period(icalvalue* value, struct icalperiodtype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_PERIOD_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_period = v;
-}
-
-struct icalperiodtype
-icalvalue_get_period(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_PERIOD_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_period;
-}
-
-
-icalvalue*
-icalvalue_new_string (char* v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_STRING_VALUE);
-
- icalerror_check_arg_rz( (v!=0),"v");
-
- icalvalue_set_string((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_string(icalvalue* value, char* v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_value_type(value, ICAL_STRING_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_string = strdup(v);
-
- if (impl->data.v_string == 0){
- errno = ENOMEM;
- }
-
-}
-
-char*
-icalvalue_get_string(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_STRING_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_string;
-}
-
-icalvalue*
-icalvalue_new_text (char* v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_TEXT_VALUE);
-
- icalerror_check_arg_rz( (v!=0),"v");
-
- icalvalue_set_text((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_text(icalvalue* value, char* v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_value_type(value, ICAL_TEXT_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_string = strdup(v);
-
- if (impl->data.v_string == 0){
- errno = ENOMEM;
- }
-
-}
-
-char*
-icalvalue_get_text(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_TEXT_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_string;
-}
-
-
-icalvalue*
-icalvalue_new_time (struct icaltimetype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_TIME_VALUE);
-
-
- icalvalue_set_time((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_time(icalvalue* value, struct icaltimetype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_TIME_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_time = v;
-}
-
-struct icaltimetype
-icalvalue_get_time(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_TIME_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_time;
-}
-
-
-icalvalue*
-icalvalue_new_trigger (union icaltriggertype v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_TRIGGER_VALUE);
-
-
- icalvalue_set_trigger((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_trigger(icalvalue* value, union icaltriggertype v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_TRIGGER_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_trigger = v;
-}
-
-union icaltriggertype
-icalvalue_get_trigger(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_TRIGGER_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_trigger;
-}
-
-
-icalvalue*
-icalvalue_new_uri (char* v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_URI_VALUE);
-
- icalerror_check_arg_rz( (v!=0),"v");
-
- icalvalue_set_uri((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_uri(icalvalue* value, char* v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_value_type(value, ICAL_URI_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_string = strdup(v);
-
- if (impl->data.v_string == 0){
- errno = ENOMEM;
- }
-
-}
-
-char*
-icalvalue_get_uri(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_URI_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_string;
-}
-
-
-icalvalue*
-icalvalue_new_utcoffset (int v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_UTCOFFSET_VALUE);
-
-
- icalvalue_set_utcoffset((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_utcoffset(icalvalue* value, int v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
-
- icalerror_check_value_type(value, ICAL_UTCOFFSET_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_int = v;
-}
-
-int
-icalvalue_get_utcoffset(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_UTCOFFSET_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_int;
-}
-
-
-icalvalue*
-icalvalue_new_query (char* v)
-{
- struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_QUERY_VALUE);
-
- icalerror_check_arg_rz( (v!=0),"v");
-
- icalvalue_set_query((icalvalue*)impl,v);
-
- return (icalvalue*)impl;
-}
-
-void
-icalvalue_set_query(icalvalue* value, char* v)
-{
- struct icalvalue_impl* impl;
-
- icalerror_check_arg_rv( (value!=0),"value");
- icalerror_check_arg_rv( (v!=0),"v");
-
- icalerror_check_value_type(value, ICAL_QUERY_VALUE);
-
- impl = (struct icalvalue_impl*)value;
- impl->data.v_string = strdup(v);
-
- if (impl->data.v_string == 0){
- errno = ENOMEM;
- }
-
-}
-
-char*
-icalvalue_get_query(icalvalue* value)
-{
- icalerror_check_arg( (value!=0),"value");
- icalerror_check_value_type(value, ICAL_QUERY_VALUE);
-
- return ((struct icalvalue_impl*)value)->data.v_string;
-}
-
diff --git a/libical/src/libical/icalvalue.h b/libical/src/libical/icalvalue.h
deleted file mode 100644
index ec7457d6aa..0000000000
--- a/libical/src/libical/icalvalue.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalvalue.h
- CREATOR: eric 20 March 1999
-
-
- $Id$
- $Locker$
-
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalvalue.h
-
- ======================================================================*/
-
-#ifndef ICALVALUE_H
-#define ICALVALUE_H
-
-#include <time.h>
-#include "icalenums.h"
-#include "icaltypes.h"
-
-typedef void icalvalue;
-
-icalvalue* icalvalue_new(icalvalue_kind kind);
-
-icalvalue* icalvalue_new_clone(icalvalue* value);
-
-icalvalue* icalvalue_new_from_string(icalvalue_kind kind, char* str);
-
-void icalvalue_free(icalvalue* value);
-
-int icalvalue_is_valid(icalvalue* value);
-
-char* icalvalue_as_ical_string(icalvalue* value);
-
-icalvalue_kind icalvalue_isa(icalvalue* value);
-
-int icalvalue_isa_value(void*);
-
-icalparameter_xliccomparetype
-icalvalue_compare(icalvalue* a, icalvalue *b);
-
-/* Everything below this line is machine generated. Do not edit. */
-/* ATTACH # Non-std */
-icalvalue* icalvalue_new_attach(struct icalattachtype v);
-struct icalattachtype icalvalue_get_attach(icalvalue* value);
-void icalvalue_set_attach(icalvalue* value, struct icalattachtype v);
-
-/* BINARY */
-icalvalue* icalvalue_new_binary(char* v);
-char* icalvalue_get_binary(icalvalue* value);
-void icalvalue_set_binary(icalvalue* value, char* v);
-
-/* BOOLEAN */
-icalvalue* icalvalue_new_boolean(int v);
-int icalvalue_get_boolean(icalvalue* value);
-void icalvalue_set_boolean(icalvalue* value, int v);
-
-/* CAL-ADDRESS */
-icalvalue* icalvalue_new_caladdress(char* v);
-char* icalvalue_get_caladdress(icalvalue* value);
-void icalvalue_set_caladdress(icalvalue* value, char* v);
-
-/* DATE */
-icalvalue* icalvalue_new_date(struct icaltimetype v);
-struct icaltimetype icalvalue_get_date(icalvalue* value);
-void icalvalue_set_date(icalvalue* value, struct icaltimetype v);
-
-/* DATE-TIME */
-icalvalue* icalvalue_new_datetime(struct icaltimetype v);
-struct icaltimetype icalvalue_get_datetime(icalvalue* value);
-void icalvalue_set_datetime(icalvalue* value, struct icaltimetype v);
-
-/* DATE-TIME-DATE # Non-std */
-icalvalue* icalvalue_new_datetimedate(struct icaltimetype v);
-struct icaltimetype icalvalue_get_datetimedate(icalvalue* value);
-void icalvalue_set_datetimedate(icalvalue* value, struct icaltimetype v);
-
-/* DATE-TIME-PERIOD # Non-std */
-icalvalue* icalvalue_new_datetimeperiod(struct icalperiodtype v);
-struct icalperiodtype icalvalue_get_datetimeperiod(icalvalue* value);
-void icalvalue_set_datetimeperiod(icalvalue* value, struct icalperiodtype v);
-
-/* DURATION */
-icalvalue* icalvalue_new_duration(struct icaldurationtype v);
-struct icaldurationtype icalvalue_get_duration(icalvalue* value);
-void icalvalue_set_duration(icalvalue* value, struct icaldurationtype v);
-
-/* FLOAT */
-icalvalue* icalvalue_new_float(float v);
-float icalvalue_get_float(icalvalue* value);
-void icalvalue_set_float(icalvalue* value, float v);
-
-/* GEO # Non-std */
-icalvalue* icalvalue_new_geo(struct icalgeotype v);
-struct icalgeotype icalvalue_get_geo(icalvalue* value);
-void icalvalue_set_geo(icalvalue* value, struct icalgeotype v);
-
-/* INTEGER */
-icalvalue* icalvalue_new_integer(int v);
-int icalvalue_get_integer(icalvalue* value);
-void icalvalue_set_integer(icalvalue* value, int v);
-
-/* METHOD # Non-std */
-icalvalue* icalvalue_new_method(icalproperty_method v);
-icalproperty_method icalvalue_get_method(icalvalue* value);
-void icalvalue_set_method(icalvalue* value, icalproperty_method v);
-
-/* PERIOD */
-icalvalue* icalvalue_new_period(struct icalperiodtype v);
-struct icalperiodtype icalvalue_get_period(icalvalue* value);
-void icalvalue_set_period(icalvalue* value, struct icalperiodtype v);
-
-/* RECUR */
-icalvalue* icalvalue_new_recur(struct icalrecurrencetype v);
-struct icalrecurrencetype icalvalue_get_recur(icalvalue* value);
-void icalvalue_set_recur(icalvalue* value, struct icalrecurrencetype v);
-
-/* STRING # Non-std */
-icalvalue* icalvalue_new_string(char* v);
-char* icalvalue_get_string(icalvalue* value);
-void icalvalue_set_string(icalvalue* value, char* v);
-
-/* TEXT */
-icalvalue* icalvalue_new_text(char* v);
-char* icalvalue_get_text(icalvalue* value);
-void icalvalue_set_text(icalvalue* value, char* v);
-
-/* TIME */
-icalvalue* icalvalue_new_time(struct icaltimetype v);
-struct icaltimetype icalvalue_get_time(icalvalue* value);
-void icalvalue_set_time(icalvalue* value, struct icaltimetype v);
-
-/* TRIGGER # Non-std */
-icalvalue* icalvalue_new_trigger(union icaltriggertype v);
-union icaltriggertype icalvalue_get_trigger(icalvalue* value);
-void icalvalue_set_trigger(icalvalue* value, union icaltriggertype v);
-
-/* URI */
-icalvalue* icalvalue_new_uri(char* v);
-char* icalvalue_get_uri(icalvalue* value);
-void icalvalue_set_uri(icalvalue* value, char* v);
-
-/* UTC-OFFSET */
-icalvalue* icalvalue_new_utcoffset(int v);
-int icalvalue_get_utcoffset(icalvalue* value);
-void icalvalue_set_utcoffset(icalvalue* value, int v);
-
-/* QUERY */
-icalvalue* icalvalue_new_query(char* v);
-char* icalvalue_get_query(icalvalue* value);
-void icalvalue_set_query(icalvalue* value, char* v);
-
-#endif ICALVALUE_H
diff --git a/libical/src/libical/icalvcal.h b/libical/src/libical/icalvcal.h
deleted file mode 100644
index 3a1098e6c2..0000000000
--- a/libical/src/libical/icalvcal.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalvcal.h
- CREATOR: eric 13 January 2000
-
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 2000 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is eric. The Initial Developer of the Original
- Code is Eric Busboom
-
-
-======================================================================*/
-
-#ifndef ICALVCAL_H
-#define ICALVCAL_H
-
-VCalObject* icalvcal_new_vcal_from_ical(icalcomponent* component);
-icalcomponent* icalvcal_new_ical_from_vcal(VCalObject* vcal);
-
-
-#endif /* !ICALVCAL_H */
-
-
-
diff --git a/libical/src/libical/icalversion.h.in b/libical/src/libical/icalversion.h.in
deleted file mode 100644
index aaeeed6666..0000000000
--- a/libical/src/libical/icalversion.h.in
+++ /dev/null
@@ -1,3 +0,0 @@
-
-#define ICAL_PACKAGE "@PACKAGE@"
-#define ICAL_VERSION "@VERSION@"
diff --git a/libical/src/libical/icalyacc.c b/libical/src/libical/icalyacc.c
deleted file mode 100644
index 46de31370d..0000000000
--- a/libical/src/libical/icalyacc.c
+++ /dev/null
@@ -1,1706 +0,0 @@
-
-/* A Bison parser, made from icalyacc.y
- by GNU Bison version 1.28 */
-
-#define YYBISON 1 /* Identify Bison output. */
-
-#define DIGITS 257
-#define INTNUMBER 258
-#define FLOATNUMBER 259
-#define STRING 260
-#define EOL 261
-#define EQUALS 262
-#define CHARACTER 263
-#define COLON 264
-#define COMMA 265
-#define SEMICOLON 266
-#define TIMESEPERATOR 267
-#define TRUE 268
-#define FALSE 269
-#define FREQ 270
-#define BYDAY 271
-#define BYHOUR 272
-#define BYMINUTE 273
-#define BYMONTH 274
-#define BYMONTHDAY 275
-#define BYSECOND 276
-#define BYSETPOS 277
-#define BYWEEKNO 278
-#define BYYEARDAY 279
-#define DAILY 280
-#define MINUTELY 281
-#define MONTHLY 282
-#define SECONDLY 283
-#define WEEKLY 284
-#define HOURLY 285
-#define YEARLY 286
-#define INTERVAL 287
-#define COUNT 288
-#define UNTIL 289
-#define WKST 290
-#define MO 291
-#define SA 292
-#define SU 293
-#define TU 294
-#define WE 295
-#define TH 296
-#define FR 297
-#define BIT8 298
-#define ACCEPTED 299
-#define ADD 300
-#define AUDIO 301
-#define BASE64 302
-#define BINARY 303
-#define BOOLEAN 304
-#define BUSY 305
-#define BUSYTENTATIVE 306
-#define BUSYUNAVAILABLE 307
-#define CALADDRESS 308
-#define CANCEL 309
-#define CANCELLED 310
-#define CHAIR 311
-#define CHILD 312
-#define COMPLETED 313
-#define CONFIDENTIAL 314
-#define CONFIRMED 315
-#define COUNTER 316
-#define DATE 317
-#define DATETIME 318
-#define DECLINECOUNTER 319
-#define DECLINED 320
-#define DELEGATED 321
-#define DISPLAY 322
-#define DRAFT 323
-#define DURATION 324
-#define EMAIL 325
-#define END 326
-#define FINAL 327
-#define FLOAT 328
-#define FREE 329
-#define GREGORIAN 330
-#define GROUP 331
-#define INDIVIDUAL 332
-#define INPROCESS 333
-#define INTEGER 334
-#define NEEDSACTION 335
-#define NONPARTICIPANT 336
-#define OPAQUE 337
-#define OPTPARTICIPANT 338
-#define PARENT 339
-#define PERIOD 340
-#define PRIVATE 341
-#define PROCEDURE 342
-#define PUBLIC 343
-#define PUBLISH 344
-#define RECUR 345
-#define REFRESH 346
-#define REPLY 347
-#define REQPARTICIPANT 348
-#define REQUEST 349
-#define RESOURCE 350
-#define ROOM 351
-#define SIBLING 352
-#define START 353
-#define TENTATIVE 354
-#define TEXT 355
-#define THISANDFUTURE 356
-#define THISANDPRIOR 357
-#define TIME 358
-#define TRANSPAENT 359
-#define UNKNOWN 360
-#define UTCOFFSET 361
-#define XNAME 362
-#define ALTREP 363
-#define CN 364
-#define CUTYPE 365
-#define DAYLIGHT 366
-#define DIR 367
-#define ENCODING 368
-#define EVENT 369
-#define FBTYPE 370
-#define FMTTYPE 371
-#define LANGUAGE 372
-#define MEMBER 373
-#define PARTSTAT 374
-#define RANGE 375
-#define RELATED 376
-#define RELTYPE 377
-#define ROLE 378
-#define RSVP 379
-#define SENTBY 380
-#define STANDARD 381
-#define URI 382
-#define TIME_CHAR 383
-#define UTC_CHAR 384
-
-#line 1 "icalyacc.y"
-
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalitip.y
- CREATOR: eric 10 June 1999
-
- DESCRIPTION:
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalitip.y
-
-
-
- ================================b======================================*/
-
-#include <stdlib.h>
-#include <string.h> /* for strdup() */
-#include <limits.h> /* for SHRT_MAX*/
-#include "icalparser.h"
-#include "ical.h"
-#include "pvl.h"
-#define YYERROR_VERBOSE
-#define YYDEBUG 1
-
-
-icalvalue *icalparser_yy_value; /* Current Value */
-
-/* Globals for UTCOFFSET values */
-int utc;
-int utc_b;
-int utcsign;
-
-/* Globals for DURATION values */
-struct icaldurationtype duration;
-
-/* Globals for RECUR values */
-struct icalrecurrencetype recur;
-short skiplist[367];
-short skippos;
-
-void copy_list(short* array, size_t size);
-void clear_recur();
-void add_prop(icalproperty_kind);
-void icalparser_fill_date(struct tm* t, char* dstr);
-void icalparser_fill_time(struct tm* t, char* tstr);
-void set_value_type(icalvalue_kind kind);
-void set_parser_value_state();
-struct icaltimetype fill_datetime(char* d, char* t);
-void ical_yy_error(char *s); /* Don't know why I need this.... */
-/*int yylex(void); /* Or this. */
-
-
-
-/* Set the state of the lexer so it will interpret values ( iCAL
- VALUEs, that is, ) correctly. */
-
-
-#line 75 "icalyacc.y"
-typedef union {
- float v_float;
- int v_int;
- char* v_string;
-
- /* Renaming hack */
-#define yymaxdepth ical_yy_maxdepth
-#define yyparse ical_yy_parse
-#define yylex ical_yy_lex
-#define yyerror ical_yy_error
-#define yylval ical_yy_lval
-#define yychar ical_yy_char
-#define yydebug ical_yy_debug
-#define yypact ical_yy_pact
-#define yyr1 ical_yy_r1
-#define yyr2 ical_yy_r2
-#define yydef ical_yy_def
-#define yychk ical_yy_chk
-#define yypgo ical_yy_pgo
-#define yyact ical_yy_act
-#define yyexca ical_yy_exca
-#define yyerrflag ical_yy_errflag
-#define yynerrs ical_yy_nerrs
-#define yyps ical_yy_ps
-#define yypv ical_yy_pv
-#define yys ical_yy_s
-#define yy_yys ical_yy_yys
-#define yystate ical_yy_state
-#define yytmp ical_yy_tmp
-#define yyv ical_yy_v
-#define yy_yyv ical_yy_yyv
-#define yyval ical_yy_val
-#define yylloc ical_yy_lloc
-#define yyreds ical_yy_reds
-#define yytoks ical_yy_toks
-#define yylhs ical_yy_yylhs
-#define yylen ical_yy_yylen
-#define yydefred ical_yy_yydefred
-#define yydgoto ical_yy_yydgoto
-#define yydefred ical_yy_yydefred
-#define yydgoto ical_yy_yydgoto
-#define yysindex ical_yy_yysindex
-#define yyrindex ical_yy_yyrindex
-#define yygindex ical_yy_yygindex
-#define yytable ical_yy_yytable
-#define yycheck ical_yy_yycheck
-#define yyname ical_yy_yyname
-#define yyrule ical_yy_yyrule
-
-
-
-} YYSTYPE;
-#ifndef YYDEBUG
-#define YYDEBUG 1
-#endif
-
-#include <stdio.h>
-
-#ifndef __cplusplus
-#ifndef __STDC__
-#define const
-#endif
-#endif
-
-
-
-#define YYFINAL 135
-#define YYFLAG -32768
-#define YYNTBASE 141
-
-#define YYTRANSLATE(x) ((unsigned)(x) <= 385 ? yytranslate[x] : 167)
-
-static const short yytranslate[] = { 0,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 137, 2, 138, 2, 140, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 136, 2, 2,
- 2, 133, 2, 2, 2, 2, 134, 2, 2, 139,
- 2, 2, 135, 2, 2, 2, 132, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, 23, 24, 25, 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, 52, 53, 54, 55, 56,
- 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
- 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
- 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
- 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
- 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
- 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
- 127, 128, 129, 130, 131
-};
-
-#if YYDEBUG != 0
-static const short yyprhs[] = { 0,
- 0, 2, 4, 6, 8, 10, 12, 14, 16, 18,
- 20, 22, 24, 26, 27, 29, 30, 32, 37, 39,
- 42, 45, 48, 51, 54, 57, 61, 64, 68, 71,
- 74, 75, 77, 79, 83, 87, 91, 101, 108, 112,
- 116, 120, 124, 128, 132, 136, 138, 140, 142, 144,
- 146, 148, 150, 152, 155, 159, 161, 165, 169, 173,
- 177, 181, 185, 189, 193, 197, 201, 205, 209, 213,
- 217, 221, 225, 229, 233, 237, 241, 245, 246, 250,
- 253, 255, 257, 261
-};
-
-static const short yyrhs[] = { 142,
- 0, 143, 0, 144, 0, 147, 0, 156, 0, 157,
- 0, 164, 0, 166, 0, 1, 0, 131, 0, 14,
- 0, 15, 0, 3, 0, 0, 130, 0, 0, 130,
- 0, 3, 129, 3, 145, 0, 154, 0, 154, 150,
- 0, 3, 132, 0, 129, 151, 0, 129, 152, 0,
- 129, 153, 0, 3, 133, 0, 3, 133, 152, 0,
- 3, 134, 0, 3, 134, 153, 0, 3, 135, 0,
- 3, 136, 0, 0, 137, 0, 138, 0, 155, 139,
- 148, 0, 155, 139, 150, 0, 155, 139, 149, 0,
- 3, 129, 3, 145, 140, 3, 129, 3, 146, 0,
- 3, 129, 3, 145, 140, 156, 0, 16, 8, 29,
- 0, 16, 8, 27, 0, 16, 8, 31, 0, 16,
- 8, 26, 0, 16, 8, 30, 0, 16, 8, 28,
- 0, 16, 8, 32, 0, 39, 0, 37, 0, 40,
- 0, 41, 0, 42, 0, 43, 0, 38, 0, 159,
- 0, 3, 159, 0, 160, 11, 159, 0, 3, 0,
- 161, 11, 3, 0, 33, 8, 3, 0, 36, 8,
- 39, 0, 36, 8, 37, 0, 36, 8, 40, 0,
- 36, 8, 41, 0, 36, 8, 42, 0, 36, 8,
- 43, 0, 36, 8, 38, 0, 22, 8, 161, 0,
- 19, 8, 161, 0, 18, 8, 161, 0, 17, 8,
- 160, 0, 20, 8, 161, 0, 21, 8, 161, 0,
- 25, 8, 161, 0, 24, 8, 161, 0, 23, 8,
- 161, 0, 35, 8, 147, 0, 35, 8, 144, 0,
- 34, 8, 3, 0, 0, 163, 12, 162, 0, 158,
- 163, 0, 137, 0, 138, 0, 165, 4, 4, 0,
- 165, 4, 4, 4, 0
-};
-
-#endif
-
-#if YYDEBUG != 0
-static const short yyrline[] = { 0,
- 158, 160, 161, 162, 163, 164, 165, 166, 167, 173,
- 175, 178, 181, 196, 198, 201, 203, 205, 221, 222,
- 224, 229, 232, 235, 239, 243, 248, 252, 257, 262,
- 267, 270, 273, 277, 282, 287, 296, 317, 349, 351,
- 352, 353, 354, 355, 356, 360, 362, 363, 364, 365,
- 366, 367, 371, 373, 374, 377, 379, 382, 384, 385,
- 386, 387, 388, 389, 390, 391, 392, 393, 394, 395,
- 396, 397, 398, 399, 400, 403, 406, 410, 412, 414,
- 422, 423, 425, 431
-};
-#endif
-
-
-#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
-
-static const char * const yytname[] = { "$","error","$undefined.","DIGITS",
-"INTNUMBER","FLOATNUMBER","STRING","EOL","EQUALS","CHARACTER","COLON","COMMA",
-"SEMICOLON","TIMESEPERATOR","TRUE","FALSE","FREQ","BYDAY","BYHOUR","BYMINUTE",
-"BYMONTH","BYMONTHDAY","BYSECOND","BYSETPOS","BYWEEKNO","BYYEARDAY","DAILY",
-"MINUTELY","MONTHLY","SECONDLY","WEEKLY","HOURLY","YEARLY","INTERVAL","COUNT",
-"UNTIL","WKST","MO","SA","SU","TU","WE","TH","FR","BIT8","ACCEPTED","ADD","AUDIO",
-"BASE64","BINARY","BOOLEAN","BUSY","BUSYTENTATIVE","BUSYUNAVAILABLE","CALADDRESS",
-"CANCEL","CANCELLED","CHAIR","CHILD","COMPLETED","CONFIDENTIAL","CONFIRMED",
-"COUNTER","DATE","DATETIME","DECLINECOUNTER","DECLINED","DELEGATED","DISPLAY",
-"DRAFT","DURATION","EMAIL","END","FINAL","FLOAT","FREE","GREGORIAN","GROUP",
-"INDIVIDUAL","INPROCESS","INTEGER","NEEDSACTION","NONPARTICIPANT","OPAQUE","OPTPARTICIPANT",
-"PARENT","PERIOD","PRIVATE","PROCEDURE","PUBLIC","PUBLISH","RECUR","REFRESH",
-"REPLY","REQPARTICIPANT","REQUEST","RESOURCE","ROOM","SIBLING","START","TENTATIVE",
-"TEXT","THISANDFUTURE","THISANDPRIOR","TIME","TRANSPAENT","UNKNOWN","UTCOFFSET",
-"XNAME","ALTREP","CN","CUTYPE","DAYLIGHT","DIR","ENCODING","EVENT","FBTYPE",
-"FMTTYPE","LANGUAGE","MEMBER","PARTSTAT","RANGE","RELATED","RELTYPE","ROLE",
-"RSVP","SENTBY","STANDARD","URI","TIME_CHAR","UTC_CHAR","\"unimplemented2\"",
-"'W'","'H'","'M'","'S'","'D'","'+'","'-'","'P'","'/'","value","binary_value",
-"boolean_value","date_value","utc_char","utc_char_b","datetime_value","dur_date",
-"dur_week","dur_time","dur_hour","dur_minute","dur_second","dur_day","dur_prefix",
-"duration_value","period_value","recur_start","weekday","weekday_list","recur_list",
-"recur_skip","recur_skip_list","recur_value","plusminus","utcoffset_value", NULL
-};
-#endif
-
-static const short yyr1[] = { 0,
- 141, 141, 141, 141, 141, 141, 141, 141, 141, 142,
- 143, 143, 144, 145, 145, 146, 146, 147, 148, 148,
- 149, 150, 150, 150, 151, 151, 152, 152, 153, 154,
- 155, 155, 155, 156, 156, 156, 157, 157, 158, 158,
- 158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
- 159, 159, 160, 160, 160, 161, 161, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 163, 163, 164,
- 165, 165, 166, 166
-};
-
-static const short yyr2[] = { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 0, 1, 0, 1, 4, 1, 2,
- 2, 2, 2, 2, 2, 3, 2, 3, 2, 2,
- 0, 1, 1, 3, 3, 3, 9, 6, 3, 3,
- 3, 3, 3, 3, 3, 1, 1, 1, 1, 1,
- 1, 1, 1, 2, 3, 1, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 0, 3, 2,
- 1, 1, 3, 4
-};
-
-static const short yydefact[] = { 0,
- 9, 13, 11, 12, 0, 10, 32, 33, 1, 2,
- 3, 4, 0, 5, 6, 78, 7, 0, 8, 0,
- 0, 0, 80, 0, 14, 42, 40, 44, 39, 43,
- 41, 45, 0, 0, 34, 36, 35, 19, 0, 83,
- 15, 18, 21, 30, 0, 22, 23, 24, 20, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 79, 84, 31, 25, 27, 29, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 32, 33, 38, 0, 26, 0, 28, 0,
- 47, 52, 46, 48, 49, 50, 51, 53, 69, 56,
- 68, 67, 70, 71, 66, 74, 73, 72, 58, 77,
- 13, 76, 75, 60, 65, 59, 61, 62, 63, 64,
- 0, 54, 0, 0, 0, 16, 55, 57, 14, 17,
- 37, 18, 0, 0, 0
-};
-
-static const short yydefgoto[] = { 133,
- 9, 10, 11, 42, 131, 12, 35, 36, 37, 46,
- 47, 48, 38, 13, 14, 15, 16, 98, 99, 101,
- 63, 23, 17, 18, 19
-};
-
-static const short yypact[] = { -1,
--32768, -123,-32768,-32768, 1,-32768, 3, 6,-32768,-32768,
--32768,-32768, -127,-32768,-32768,-32768,-32768, 64,-32768, 66,
- -10, -2, 58, 67, -58,-32768,-32768,-32768,-32768,-32768,
--32768,-32768, -128, 70,-32768,-32768,-32768, -55, 28, 71,
--32768, -64,-32768,-32768, -68,-32768,-32768,-32768,-32768, 69,
- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
- 82, 83,-32768,-32768, 2, 89, 90,-32768, 0, 91,
- 91, 91, 91, 91, 91, 91, 91, 92, 93, 94,
- -14, -51,-32768,-32768,-32768, -36,-32768, -56,-32768, -7,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 88,-32768,
- 95, 95, 95, 95, 95, 95, 95, 95,-32768,-32768,
- -29,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
- 98,-32768, -7, 99, 100, -26,-32768,-32768, -58,-32768,
--32768,-32768, 105, 107,-32768
-};
-
-static const short yypgoto[] = {-32768,
--32768,-32768, 29, -21,-32768, 30,-32768,-32768, 84,-32768,
- 45, 46,-32768,-32768, 47,-32768,-32768, -79,-32768, -17,
--32768,-32768,-32768,-32768,-32768
-};
-
-
-#define YYLAST 140
-
-
-static const short yytable[] = { 1,
- 33, 2, 90, 43, 82, 20, -81, 44, 21, -82,
- 122, 22, 3, 4, 5, 26, 27, 28, 29, 30,
- 31, 32, 114, 115, 116, 117, 118, 119, 120, 91,
- 92, 93, 94, 95, 96, 97, 91, 92, 93, 94,
- 95, 96, 97, 127, 50, 51, 52, 53, 54, 55,
- 56, 57, 58, 102, 103, 104, 105, 106, 107, 108,
- 59, 60, 61, 62, 66, 67, 68, 24, 25, 39,
- 40, 41, 45, 34, 64, 65, 69, 121, 68, 70,
- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
- 81, 86, 88, 100, 109, 110, 111, 67, 123, 125,
- 126, 128, 129, 130, 134, 124, 135, 132, 112, 113,
- 87, 85, 89, 0, 0, 0, 0, 0, 0, 0,
- 0, 49, 0, 0, 0, 0, 34, 0, 0, 6,
- 0, 0, 0, 0, 0, 7, 8, -31, 83, 84
-};
-
-static const short yycheck[] = { 1,
- 3, 3, 3, 132, 3, 129, 4, 136, 8, 4,
- 90, 139, 14, 15, 16, 26, 27, 28, 29, 30,
- 31, 32, 37, 38, 39, 40, 41, 42, 43, 37,
- 38, 39, 40, 41, 42, 43, 37, 38, 39, 40,
- 41, 42, 43, 123, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 71, 72, 73, 74, 75, 76, 77,
- 33, 34, 35, 36, 133, 134, 135, 4, 3, 12,
- 4, 130, 3, 129, 4, 140, 8, 129, 135, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 3, 3, 3, 3, 3, 3, 134, 11, 129,
- 3, 3, 3, 130, 0, 11, 0, 129, 80, 80,
- 66, 65, 67, -1, -1, -1, -1, -1, -1, -1,
- -1, 38, -1, -1, -1, -1, 129, -1, -1, 131,
- -1, -1, -1, -1, -1, 137, 138, 139, 137, 138
-};
-/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
-#line 3 "/usr/lib/bison.simple"
-/* This file comes from bison-1.28. */
-
-/* Skeleton output parser for bison,
- Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
-
- 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, 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. */
-
-/* As a special exception, when this file is copied by Bison into a
- Bison output file, you may use that output file without restriction.
- This special exception was added by the Free Software Foundation
- in version 1.24 of Bison. */
-
-/* This is the parser code that is written into each bison parser
- when the %semantic_parser declaration is not specified in the grammar.
- It was written by Richard Stallman by simplifying the hairy parser
- used when %semantic_parser is specified. */
-
-#ifndef YYSTACK_USE_ALLOCA
-#ifdef alloca
-#define YYSTACK_USE_ALLOCA
-#else /* alloca not defined */
-#ifdef __GNUC__
-#define YYSTACK_USE_ALLOCA
-#define alloca __builtin_alloca
-#else /* not GNU C. */
-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
-#define YYSTACK_USE_ALLOCA
-#include <alloca.h>
-#else /* not sparc */
-/* We think this test detects Watcom and Microsoft C. */
-/* This used to test MSDOS, but that is a bad idea
- since that symbol is in the user namespace. */
-#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
-#if 0 /* No need for malloc.h, which pollutes the namespace;
- instead, just don't use alloca. */
-#include <malloc.h>
-#endif
-#else /* not MSDOS, or __TURBOC__ */
-#if defined(_AIX)
-/* I don't know what this was needed for, but it pollutes the namespace.
- So I turned it off. rms, 2 May 1997. */
-/* #include <malloc.h> */
- #pragma alloca
-#define YYSTACK_USE_ALLOCA
-#else /* not MSDOS, or __TURBOC__, or _AIX */
-#if 0
-#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
- and on HPUX 10. Eventually we can turn this on. */
-#define YYSTACK_USE_ALLOCA
-#define alloca __builtin_alloca
-#endif /* __hpux */
-#endif
-#endif /* not _AIX */
-#endif /* not MSDOS, or __TURBOC__ */
-#endif /* not sparc */
-#endif /* not GNU C */
-#endif /* alloca not defined */
-#endif /* YYSTACK_USE_ALLOCA not defined */
-
-#ifdef YYSTACK_USE_ALLOCA
-#define YYSTACK_ALLOC alloca
-#else
-#define YYSTACK_ALLOC malloc
-#endif
-
-/* Note: there must be only one dollar sign in this file.
- It is replaced by the list of actions, each action
- as one case of the switch. */
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY -2
-#define YYEOF 0
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrlab1
-/* Like YYERROR except do call yyerror.
- This remains here temporarily to ease the
- transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-#define YYFAIL goto yyerrlab
-#define YYRECOVERING() (!!yyerrstatus)
-#define YYBACKUP(token, value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { yychar = (token), yylval = (value); \
- yychar1 = YYTRANSLATE (yychar); \
- YYPOPSTACK; \
- goto yybackup; \
- } \
- else \
- { yyerror ("syntax error: cannot back up"); YYERROR; } \
-while (0)
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-#ifndef YYPURE
-#define YYLEX yylex()
-#endif
-
-#ifdef YYPURE
-#ifdef YYLSP_NEEDED
-#ifdef YYLEX_PARAM
-#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
-#else
-#define YYLEX yylex(&yylval, &yylloc)
-#endif
-#else /* not YYLSP_NEEDED */
-#ifdef YYLEX_PARAM
-#define YYLEX yylex(&yylval, YYLEX_PARAM)
-#else
-#define YYLEX yylex(&yylval)
-#endif
-#endif /* not YYLSP_NEEDED */
-#endif
-
-/* If nonreentrant, generate the variables here */
-
-#ifndef YYPURE
-
-int yychar; /* the lookahead symbol */
-YYSTYPE yylval; /* the semantic value of the */
- /* lookahead symbol */
-
-#ifdef YYLSP_NEEDED
-YYLTYPE yylloc; /* location data for the lookahead */
- /* symbol */
-#endif
-
-int yynerrs; /* number of parse errors so far */
-#endif /* not YYPURE */
-
-#if YYDEBUG != 0
-int yydebug; /* nonzero means print parse trace */
-/* Since this is uninitialized, it does not stop multiple parsers
- from coexisting. */
-#endif
-
-/* YYINITDEPTH indicates the initial size of the parser's stacks */
-
-#ifndef YYINITDEPTH
-#define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH is the maximum size the stacks can grow to
- (effective only if the built-in stack extension method is used). */
-
-#if YYMAXDEPTH == 0
-#undef YYMAXDEPTH
-#endif
-
-#ifndef YYMAXDEPTH
-#define YYMAXDEPTH 10000
-#endif
-
-/* Define __yy_memcpy. Note that the size argument
- should be passed with type unsigned int, because that is what the non-GCC
- definitions require. With GCC, __builtin_memcpy takes an arg
- of type size_t, but it can handle unsigned int. */
-
-#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
-#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
-#else /* not GNU C or C++ */
-#ifndef __cplusplus
-
-/* This is the most reliable way to avoid incompatibilities
- in available built-in functions on various systems. */
-static void
-__yy_memcpy (to, from, count)
- char *to;
- char *from;
- unsigned int count;
-{
- register char *f = from;
- register char *t = to;
- register int i = count;
-
- while (i-- > 0)
- *t++ = *f++;
-}
-
-#else /* __cplusplus */
-
-/* This is the most reliable way to avoid incompatibilities
- in available built-in functions on various systems. */
-static void
-__yy_memcpy (char *to, char *from, unsigned int count)
-{
- register char *t = to;
- register char *f = from;
- register int i = count;
-
- while (i-- > 0)
- *t++ = *f++;
-}
-
-#endif
-#endif
-
-#line 217 "/usr/lib/bison.simple"
-
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
- into yyparse. The argument should have type void *.
- It should actually point to an object.
- Grammar actions can access the variable by casting it
- to the proper pointer type. */
-
-#ifdef YYPARSE_PARAM
-#ifdef __cplusplus
-#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-#define YYPARSE_PARAM_DECL
-#else /* not __cplusplus */
-#define YYPARSE_PARAM_ARG YYPARSE_PARAM
-#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
-#endif /* not __cplusplus */
-#else /* not YYPARSE_PARAM */
-#define YYPARSE_PARAM_ARG
-#define YYPARSE_PARAM_DECL
-#endif /* not YYPARSE_PARAM */
-
-/* Prevent warning if -Wstrict-prototypes. */
-#ifdef __GNUC__
-#ifdef YYPARSE_PARAM
-int yyparse (void *);
-#else
-int yyparse (void);
-#endif
-#endif
-
-int
-yyparse(YYPARSE_PARAM_ARG)
- YYPARSE_PARAM_DECL
-{
- register int yystate;
- register int yyn;
- register short *yyssp;
- register YYSTYPE *yyvsp;
- int yyerrstatus; /* number of tokens to shift before error messages enabled */
- int yychar1 = 0; /* lookahead token as an internal (translated) token number */
-
- short yyssa[YYINITDEPTH]; /* the state stack */
- YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
-
- short *yyss = yyssa; /* refer to the stacks thru separate pointers */
- YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
-
-#ifdef YYLSP_NEEDED
- YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
- YYLTYPE *yyls = yylsa;
- YYLTYPE *yylsp;
-
-#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
-#else
-#define YYPOPSTACK (yyvsp--, yyssp--)
-#endif
-
- int yystacksize = YYINITDEPTH;
- int yyfree_stacks = 0;
-
-#ifdef YYPURE
- int yychar;
- YYSTYPE yylval;
- int yynerrs;
-#ifdef YYLSP_NEEDED
- YYLTYPE yylloc;
-#endif
-#endif
-
- YYSTYPE yyval; /* the variable used to return */
- /* semantic values from the action */
- /* routines */
-
- int yylen;
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Starting parse\n");
-#endif
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss - 1;
- yyvsp = yyvs;
-#ifdef YYLSP_NEEDED
- yylsp = yyls;
-#endif
-
-/* Push a new state, which is found in yystate . */
-/* In all cases, when you get here, the value and location stacks
- have just been pushed. so pushing a state here evens the stacks. */
-yynewstate:
-
- *++yyssp = yystate;
-
- if (yyssp >= yyss + yystacksize - 1)
- {
- /* Give user a chance to reallocate the stack */
- /* Use copies of these so that the &'s don't force the real ones into memory. */
- YYSTYPE *yyvs1 = yyvs;
- short *yyss1 = yyss;
-#ifdef YYLSP_NEEDED
- YYLTYPE *yyls1 = yyls;
-#endif
-
- /* Get the current used size of the three stacks, in elements. */
- int size = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- /* Each stack pointer address is followed by the size of
- the data in use in that stack, in bytes. */
-#ifdef YYLSP_NEEDED
- /* This used to be a conditional around just the two extra args,
- but that might be undefined if yyoverflow is a macro. */
- yyoverflow("parser stack overflow",
- &yyss1, size * sizeof (*yyssp),
- &yyvs1, size * sizeof (*yyvsp),
- &yyls1, size * sizeof (*yylsp),
- &yystacksize);
-#else
- yyoverflow("parser stack overflow",
- &yyss1, size * sizeof (*yyssp),
- &yyvs1, size * sizeof (*yyvsp),
- &yystacksize);
-#endif
-
- yyss = yyss1; yyvs = yyvs1;
-#ifdef YYLSP_NEEDED
- yyls = yyls1;
-#endif
-#else /* no yyoverflow */
- /* Extend the stack our own way. */
- if (yystacksize >= YYMAXDEPTH)
- {
- yyerror("parser stack overflow");
- if (yyfree_stacks)
- {
- free (yyss);
- free (yyvs);
-#ifdef YYLSP_NEEDED
- free (yyls);
-#endif
- }
- return 2;
- }
- yystacksize *= 2;
- if (yystacksize > YYMAXDEPTH)
- yystacksize = YYMAXDEPTH;
-#ifndef YYSTACK_USE_ALLOCA
- yyfree_stacks = 1;
-#endif
- yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
- __yy_memcpy ((char *)yyss, (char *)yyss1,
- size * (unsigned int) sizeof (*yyssp));
- yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
- __yy_memcpy ((char *)yyvs, (char *)yyvs1,
- size * (unsigned int) sizeof (*yyvsp));
-#ifdef YYLSP_NEEDED
- yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
- __yy_memcpy ((char *)yyls, (char *)yyls1,
- size * (unsigned int) sizeof (*yylsp));
-#endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + size - 1;
- yyvsp = yyvs + size - 1;
-#ifdef YYLSP_NEEDED
- yylsp = yyls + size - 1;
-#endif
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Stack size increased to %d\n", yystacksize);
-#endif
-
- if (yyssp >= yyss + yystacksize - 1)
- YYABORT;
- }
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Entering state %d\n", yystate);
-#endif
-
- goto yybackup;
- yybackup:
-
-/* Do appropriate processing given the current state. */
-/* Read a lookahead token if we need one and don't already have one. */
-/* yyresume: */
-
- /* First try to decide what to do without reference to lookahead token. */
-
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yydefault;
-
- /* Not known => get a lookahead token if don't already have one. */
-
- /* yychar is either YYEMPTY or YYEOF
- or a valid token in external form. */
-
- if (yychar == YYEMPTY)
- {
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Reading a token: ");
-#endif
- yychar = YYLEX;
- }
-
- /* Convert token to internal form (in yychar1) for indexing tables with */
-
- if (yychar <= 0) /* This means end of input. */
- {
- yychar1 = 0;
- yychar = YYEOF; /* Don't call YYLEX any more */
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Now at end of input.\n");
-#endif
- }
- else
- {
- yychar1 = YYTRANSLATE(yychar);
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
- /* Give the individual parser a way to print the precise meaning
- of a token, for further debugging info. */
-#ifdef YYPRINT
- YYPRINT (stderr, yychar, yylval);
-#endif
- fprintf (stderr, ")\n");
- }
-#endif
- }
-
- yyn += yychar1;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
- goto yydefault;
-
- yyn = yytable[yyn];
-
- /* yyn is what to do for this token type in this state.
- Negative => reduce, -yyn is rule number.
- Positive => shift, yyn is new state.
- New state is final state => don't bother to shift,
- just return success.
- 0, or most negative number => error. */
-
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
- else if (yyn == 0)
- goto yyerrlab;
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Shift the lookahead token. */
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
-#endif
-
- /* Discard the token being shifted unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- *++yyvsp = yylval;
-#ifdef YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
-
- /* count tokens shifted since error; after three, turn off error status. */
- if (yyerrstatus) yyerrstatus--;
-
- yystate = yyn;
- goto yynewstate;
-
-/* Do the default action for the current state. */
-yydefault:
-
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
-
-/* Do a reduction. yyn is the number of a rule to reduce with. */
-yyreduce:
- yylen = yyr2[yyn];
- if (yylen > 0)
- yyval = yyvsp[1-yylen]; /* implement default value of the action */
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- int i;
-
- fprintf (stderr, "Reducing via rule %d (line %d), ",
- yyn, yyrline[yyn]);
-
- /* Print the symbols being reduced, and their result. */
- for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
- fprintf (stderr, "%s ", yytname[yyrhs[i]]);
- fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
- }
-#endif
-
-
- switch (yyn) {
-
-case 9:
-#line 167 "icalyacc.y"
-{
- icalparser_yy_value = 0;
- icalparser_clear_flex_input();
- yyclearin;
- ;
- break;}
-case 11:
-#line 177 "icalyacc.y"
-{ icalparser_yy_value = icalvalue_new_boolean(1); ;
- break;}
-case 12:
-#line 179 "icalyacc.y"
-{ icalparser_yy_value = icalvalue_new_boolean(0); ;
- break;}
-case 13:
-#line 182 "icalyacc.y"
-{
- struct icaltimetype stm;
-
- stm = fill_datetime(yyvsp[0].v_string,0);
-
- stm.hour = -1;
- stm.minute = -1;
- stm.second = -1;
- stm.is_utc = 0;
- stm.is_date = 1;
-
- icalparser_yy_value = icalvalue_new_date(stm);
- ;
- break;}
-case 14:
-#line 197 "icalyacc.y"
-{utc = 0;;
- break;}
-case 15:
-#line 198 "icalyacc.y"
-{utc = 1;;
- break;}
-case 16:
-#line 202 "icalyacc.y"
-{utc_b = 0;;
- break;}
-case 17:
-#line 203 "icalyacc.y"
-{utc_b = 1;;
- break;}
-case 18:
-#line 207 "icalyacc.y"
-{
- struct icaltimetype stm;
- stm = fill_datetime(yyvsp[-3].v_string, yyvsp[-1].v_string);
- stm.is_utc = utc;
- stm.is_date = 0;
-
- icalparser_yy_value =
- icalvalue_new_datetime(stm);
- ;
- break;}
-case 21:
-#line 225 "icalyacc.y"
-{
- duration.weeks = atoi(yyvsp[-1].v_string);
- ;
- break;}
-case 22:
-#line 230 "icalyacc.y"
-{
- ;
- break;}
-case 23:
-#line 233 "icalyacc.y"
-{
- ;
- break;}
-case 24:
-#line 236 "icalyacc.y"
-{
- ;
- break;}
-case 25:
-#line 240 "icalyacc.y"
-{
- duration.hours = atoi(yyvsp[-1].v_string);
- ;
- break;}
-case 26:
-#line 244 "icalyacc.y"
-{
- duration.hours = atoi(yyvsp[-2].v_string);
- ;
- break;}
-case 27:
-#line 249 "icalyacc.y"
-{
- duration.minutes = atoi(yyvsp[-1].v_string);
- ;
- break;}
-case 28:
-#line 253 "icalyacc.y"
-{
- duration.minutes = atoi(yyvsp[-2].v_string);
- ;
- break;}
-case 29:
-#line 258 "icalyacc.y"
-{
- duration.seconds = atoi(yyvsp[-1].v_string);
- ;
- break;}
-case 30:
-#line 263 "icalyacc.y"
-{
- duration.days = atoi(yyvsp[-1].v_string);
- ;
- break;}
-case 31:
-#line 268 "icalyacc.y"
-{
- ;
- break;}
-case 32:
-#line 271 "icalyacc.y"
-{
- ;
- break;}
-case 33:
-#line 274 "icalyacc.y"
-{
- ;
- break;}
-case 34:
-#line 278 "icalyacc.y"
-{
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- ;
- break;}
-case 35:
-#line 283 "icalyacc.y"
-{
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- ;
- break;}
-case 36:
-#line 288 "icalyacc.y"
-{
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- ;
- break;}
-case 37:
-#line 297 "icalyacc.y"
-{
- struct icalperiodtype p;
-
- p.start = fill_datetime(yyvsp[-8].v_string,yyvsp[-6].v_string);
- p.start.is_utc = utc;
- p.start.is_date = 0;
-
-
- p.end = fill_datetime(yyvsp[-3].v_string,yyvsp[-1].v_string);
- p.end.is_utc = utc_b;
- p.end.is_date = 0;
-
- p.duration.days = -1;
- p.duration.weeks = -1;
- p.duration.hours = -1;
- p.duration.minutes = -1;
- p.duration.seconds = -1;
-
- icalparser_yy_value = icalvalue_new_period(p);
- ;
- break;}
-case 38:
-#line 318 "icalyacc.y"
-{
- struct icalperiodtype p;
-
- p.start = fill_datetime(yyvsp[-5].v_string,yyvsp[-3].v_string);
- p.start.is_utc = utc;
- p.start.is_date = 0;
-
- p.end.year = -1;
- p.end.month = -1;
- p.end.day = -1;
- p.end.hour = -1;
- p.end.minute = -1;
- p.end.second = -1;
-
- /* The duration_value rule setes the global 'duration'
- variable, but it also creates a new value in
- icalparser_yy_value. So, free that, then copy
- 'duration' into the icalperiodtype struct. */
-
- p.duration = icalvalue_get_duration(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value);
- icalparser_yy_value = 0;
-
- icalparser_yy_value = icalvalue_new_period(p);
-
- ;
- break;}
-case 39:
-#line 350 "icalyacc.y"
-{clear_recur();recur.freq = ICAL_SECONDLY_RECURRENCE;;
- break;}
-case 40:
-#line 351 "icalyacc.y"
-{clear_recur();recur.freq = ICAL_MINUTELY_RECURRENCE;;
- break;}
-case 41:
-#line 352 "icalyacc.y"
-{clear_recur();recur.freq = ICAL_HOURLY_RECURRENCE;;
- break;}
-case 42:
-#line 353 "icalyacc.y"
-{clear_recur();recur.freq = ICAL_DAILY_RECURRENCE;;
- break;}
-case 43:
-#line 354 "icalyacc.y"
-{clear_recur();recur.freq = ICAL_WEEKLY_RECURRENCE;;
- break;}
-case 44:
-#line 355 "icalyacc.y"
-{clear_recur();recur.freq = ICAL_MONTHLY_RECURRENCE;;
- break;}
-case 45:
-#line 356 "icalyacc.y"
-{clear_recur();recur.freq = ICAL_YEARLY_RECURRENCE;;
- break;}
-case 46:
-#line 361 "icalyacc.y"
-{ skiplist[skippos]=ICAL_SUNDAY_WEEKDAY; if( skippos<8) skippos++;;
- break;}
-case 47:
-#line 362 "icalyacc.y"
-{ skiplist[skippos]=ICAL_MONDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 48:
-#line 363 "icalyacc.y"
-{ skiplist[skippos]=ICAL_TUESDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 49:
-#line 364 "icalyacc.y"
-{ skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 50:
-#line 365 "icalyacc.y"
-{ skiplist[skippos]=ICAL_THURSDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 51:
-#line 366 "icalyacc.y"
-{ skiplist[skippos]=ICAL_FRIDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 52:
-#line 367 "icalyacc.y"
-{ skiplist[skippos]=ICAL_SATURDAY_WEEKDAY;if( skippos<8) skippos++;;
- break;}
-case 54:
-#line 373 "icalyacc.y"
-{ ;
- break;}
-case 56:
-#line 378 "icalyacc.y"
-{ skiplist[skippos] = atoi(yyvsp[0].v_string); skippos++;;
- break;}
-case 57:
-#line 379 "icalyacc.y"
-{ skiplist[skippos] = atoi(yyvsp[0].v_string); if (skippos<367) skippos++;;
- break;}
-case 58:
-#line 383 "icalyacc.y"
-{recur.interval = atoi(yyvsp[0].v_string);;
- break;}
-case 59:
-#line 384 "icalyacc.y"
-{recur.week_start = ICAL_SUNDAY_WEEKDAY;;
- break;}
-case 60:
-#line 385 "icalyacc.y"
-{recur.week_start = ICAL_MONDAY_WEEKDAY;;
- break;}
-case 61:
-#line 386 "icalyacc.y"
-{recur.week_start = ICAL_TUESDAY_WEEKDAY;;
- break;}
-case 62:
-#line 387 "icalyacc.y"
-{recur.week_start = ICAL_WEDNESDAY_WEEKDAY;;
- break;}
-case 63:
-#line 388 "icalyacc.y"
-{recur.week_start = ICAL_THURSDAY_WEEKDAY;;
- break;}
-case 64:
-#line 389 "icalyacc.y"
-{recur.week_start = ICAL_FRIDAY_WEEKDAY;;
- break;}
-case 65:
-#line 390 "icalyacc.y"
-{recur.week_start = ICAL_SATURDAY_WEEKDAY;;
- break;}
-case 66:
-#line 391 "icalyacc.y"
-{copy_list(recur.by_second,60);;
- break;}
-case 67:
-#line 392 "icalyacc.y"
-{copy_list(recur.by_minute,60);;
- break;}
-case 68:
-#line 393 "icalyacc.y"
-{copy_list(recur.by_hour,24);;
- break;}
-case 69:
-#line 394 "icalyacc.y"
-{copy_list(recur.by_day,7);;
- break;}
-case 70:
-#line 395 "icalyacc.y"
-{copy_list(recur.by_month,12);;
- break;}
-case 71:
-#line 396 "icalyacc.y"
-{copy_list(recur.by_month_day,31);;
- break;}
-case 72:
-#line 397 "icalyacc.y"
-{copy_list(recur.by_year_day,366);;
- break;}
-case 73:
-#line 398 "icalyacc.y"
-{copy_list(recur.by_week_no,53);;
- break;}
-case 74:
-#line 399 "icalyacc.y"
-{copy_list(recur.by_set_pos,366);;
- break;}
-case 75:
-#line 401 "icalyacc.y"
-{ recur.until = icalvalue_get_datetime(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;;
- break;}
-case 76:
-#line 404 "icalyacc.y"
-{ recur.until = icalvalue_get_date(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;;
- break;}
-case 77:
-#line 407 "icalyacc.y"
-{ recur.count = atoi(yyvsp[0].v_string); ;
- break;}
-case 80:
-#line 416 "icalyacc.y"
-{ icalparser_yy_value = icalvalue_new_recur(recur); ;
- break;}
-case 81:
-#line 422 "icalyacc.y"
-{ utcsign = 1; ;
- break;}
-case 82:
-#line 423 "icalyacc.y"
-{ utcsign = -1; ;
- break;}
-case 83:
-#line 427 "icalyacc.y"
-{
- icalparser_yy_value = icalvalue_new_utcoffset( utcsign * (yyvsp[-1].v_int*3600) + (yyvsp[0].v_int*60) );
- ;
- break;}
-case 84:
-#line 432 "icalyacc.y"
-{
- icalparser_yy_value = icalvalue_new_utcoffset(utcsign * (yyvsp[-2].v_int*3600) + (yyvsp[-1].v_int*60) +(yyvsp[0].v_int));
- ;
- break;}
-}
- /* the action file gets copied in in place of this dollarsign */
-#line 543 "/usr/lib/bison.simple"
-
- yyvsp -= yylen;
- yyssp -= yylen;
-#ifdef YYLSP_NEEDED
- yylsp -= yylen;
-#endif
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- short *ssp1 = yyss - 1;
- fprintf (stderr, "state stack now");
- while (ssp1 != yyssp)
- fprintf (stderr, " %d", *++ssp1);
- fprintf (stderr, "\n");
- }
-#endif
-
- *++yyvsp = yyval;
-
-#ifdef YYLSP_NEEDED
- yylsp++;
- if (yylen == 0)
- {
- yylsp->first_line = yylloc.first_line;
- yylsp->first_column = yylloc.first_column;
- yylsp->last_line = (yylsp-1)->last_line;
- yylsp->last_column = (yylsp-1)->last_column;
- yylsp->text = 0;
- }
- else
- {
- yylsp->last_line = (yylsp+yylen-1)->last_line;
- yylsp->last_column = (yylsp+yylen-1)->last_column;
- }
-#endif
-
- /* Now "shift" the result of the reduction.
- Determine what state that goes to,
- based on the state we popped back to
- and the rule number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
- if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTBASE];
-
- goto yynewstate;
-
-yyerrlab: /* here on detecting error */
-
- if (! yyerrstatus)
- /* If not already recovering from an error, report this error. */
- {
- ++yynerrs;
-
-#ifdef YYERROR_VERBOSE
- yyn = yypact[yystate];
-
- if (yyn > YYFLAG && yyn < YYLAST)
- {
- int size = 0;
- char *msg;
- int x, count;
-
- count = 0;
- /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
- for (x = (yyn < 0 ? -yyn : 0);
- x < (sizeof(yytname) / sizeof(char *)); x++)
- if (yycheck[x + yyn] == x)
- size += strlen(yytname[x]) + 15, count++;
- msg = (char *) malloc(size + 15);
- if (msg != 0)
- {
- strcpy(msg, "parse error");
-
- if (count < 5)
- {
- count = 0;
- for (x = (yyn < 0 ? -yyn : 0);
- x < (sizeof(yytname) / sizeof(char *)); x++)
- if (yycheck[x + yyn] == x)
- {
- strcat(msg, count == 0 ? ", expecting `" : " or `");
- strcat(msg, yytname[x]);
- strcat(msg, "'");
- count++;
- }
- }
- yyerror(msg);
- free(msg);
- }
- else
- yyerror ("parse error; also virtual memory exceeded");
- }
- else
-#endif /* YYERROR_VERBOSE */
- yyerror("parse error");
- }
-
- goto yyerrlab1;
-yyerrlab1: /* here on error raised explicitly by an action */
-
- if (yyerrstatus == 3)
- {
- /* if just tried and failed to reuse lookahead token after an error, discard it. */
-
- /* return failure if at end of input */
- if (yychar == YYEOF)
- YYABORT;
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
-#endif
-
- yychar = YYEMPTY;
- }
-
- /* Else will try to reuse lookahead token
- after shifting the error token. */
-
- yyerrstatus = 3; /* Each real token shifted decrements this */
-
- goto yyerrhandle;
-
-yyerrdefault: /* current state does not do anything special for the error token. */
-
-#if 0
- /* This is wrong; only states that explicitly want error tokens
- should shift them. */
- yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
- if (yyn) goto yydefault;
-#endif
-
-yyerrpop: /* pop the current state because it cannot handle the error token */
-
- if (yyssp == yyss) YYABORT;
- yyvsp--;
- yystate = *--yyssp;
-#ifdef YYLSP_NEEDED
- yylsp--;
-#endif
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- short *ssp1 = yyss - 1;
- fprintf (stderr, "Error: state stack now");
- while (ssp1 != yyssp)
- fprintf (stderr, " %d", *++ssp1);
- fprintf (stderr, "\n");
- }
-#endif
-
-yyerrhandle:
-
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yyerrdefault;
-
- yyn += YYTERROR;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
- goto yyerrdefault;
-
- yyn = yytable[yyn];
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrpop;
- yyn = -yyn;
- goto yyreduce;
- }
- else if (yyn == 0)
- goto yyerrpop;
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Shifting error token, ");
-#endif
-
- *++yyvsp = yylval;
-#ifdef YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
-
- yystate = yyn;
- goto yynewstate;
-
- yyacceptlab:
- /* YYACCEPT comes here. */
- if (yyfree_stacks)
- {
- free (yyss);
- free (yyvs);
-#ifdef YYLSP_NEEDED
- free (yyls);
-#endif
- }
- return 0;
-
- yyabortlab:
- /* YYABORT comes here. */
- if (yyfree_stacks)
- {
- free (yyss);
- free (yyvs);
-#ifdef YYLSP_NEEDED
- free (yyls);
-#endif
- }
- return 1;
-}
-#line 438 "icalyacc.y"
-
-
-
-void clear_recur()
-{
- memset(&skiplist, ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
- skippos = 0;
-
- icalrecurrencetype_clear(&recur);
-}
-
-void copy_list(short* array, size_t size)
-{
- memcpy(array, skiplist, size*sizeof(short));
- memset(&skiplist,ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
- skippos = 0;
-}
-
-struct icaltimetype fill_datetime(char* datestr, char* timestr)
-{
- struct icaltimetype stm;
-
- memset(&stm,0,sizeof(stm));
-
- if (datestr != 0){
- sscanf(datestr,"%4d%2d%2d",&(stm.year), &(stm.month),
- &(stm.day));
- }
-
- if (timestr != 0){
- sscanf(timestr,"%2d%2d%2d", &(stm.hour), &(stm.minute),
- &(stm.second));
- }
-
- return stm;
-
-}
-
-void yyerror(char* s)
-{
- /*fprintf(stderr,"Parse error \'%s\'\n", s);*/
-}
-
diff --git a/libical/src/libical/icalyacc.y b/libical/src/libical/icalyacc.y
deleted file mode 100644
index 1fe2a737e9..0000000000
--- a/libical/src/libical/icalyacc.y
+++ /dev/null
@@ -1,480 +0,0 @@
-%{
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalitip.y
- CREATOR: eric 10 June 1999
-
- DESCRIPTION:
-
- $Id: icalyacc.y,v 1.4 2000/06/06 22:48:09 alves Exp $
- $Locker: $
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalitip.y
-
-
-
- ================================b======================================*/
-
-#include <stdlib.h>
-#include <string.h> /* for strdup() */
-#include <limits.h> /* for SHRT_MAX*/
-#include "icalparser.h"
-#include "ical.h"
-#include "pvl.h"
-#define YYERROR_VERBOSE
-#define YYDEBUG 1
-
-
-icalvalue *icalparser_yy_value; /* Current Value */
-
-/* Globals for UTCOFFSET values */
-int utc;
-int utc_b;
-int utcsign;
-
-/* Globals for DURATION values */
-struct icaldurationtype duration;
-
-/* Globals for RECUR values */
-struct icalrecurrencetype recur;
-short skiplist[367];
-short skippos;
-
-void copy_list(short* array, size_t size);
-void clear_recur();
-void add_prop(icalproperty_kind);
-void icalparser_fill_date(struct tm* t, char* dstr);
-void icalparser_fill_time(struct tm* t, char* tstr);
-void set_value_type(icalvalue_kind kind);
-void set_parser_value_state();
-struct icaltimetype fill_datetime(char* d, char* t);
-void ical_yy_error(char *s); /* Don't know why I need this.... */
-/*int yylex(void); /* Or this. */
-
-
-
-/* Set the state of the lexer so it will interpret values ( iCAL
- VALUEs, that is, ) correctly. */
-
-%}
-
-%union {
- float v_float;
- int v_int;
- char* v_string;
-
- /* Renaming hack */
-#define yymaxdepth ical_yy_maxdepth
-#define yyparse ical_yy_parse
-#define yylex ical_yy_lex
-#define yyerror ical_yy_error
-#define yylval ical_yy_lval
-#define yychar ical_yy_char
-#define yydebug ical_yy_debug
-#define yypact ical_yy_pact
-#define yyr1 ical_yy_r1
-#define yyr2 ical_yy_r2
-#define yydef ical_yy_def
-#define yychk ical_yy_chk
-#define yypgo ical_yy_pgo
-#define yyact ical_yy_act
-#define yyexca ical_yy_exca
-#define yyerrflag ical_yy_errflag
-#define yynerrs ical_yy_nerrs
-#define yyps ical_yy_ps
-#define yypv ical_yy_pv
-#define yys ical_yy_s
-#define yy_yys ical_yy_yys
-#define yystate ical_yy_state
-#define yytmp ical_yy_tmp
-#define yyv ical_yy_v
-#define yy_yyv ical_yy_yyv
-#define yyval ical_yy_val
-#define yylloc ical_yy_lloc
-#define yyreds ical_yy_reds
-#define yytoks ical_yy_toks
-#define yylhs ical_yy_yylhs
-#define yylen ical_yy_yylen
-#define yydefred ical_yy_yydefred
-#define yydgoto ical_yy_yydgoto
-#define yydefred ical_yy_yydefred
-#define yydgoto ical_yy_yydgoto
-#define yysindex ical_yy_yysindex
-#define yyrindex ical_yy_yyrindex
-#define yygindex ical_yy_yygindex
-#define yytable ical_yy_yytable
-#define yycheck ical_yy_yycheck
-#define yyname ical_yy_yyname
-#define yyrule ical_yy_yyrule
-
-
-
-}
-
-%token <v_string> DIGITS
-%token <v_int> INTNUMBER
-%token <v_float> FLOATNUMBER
-%token <v_string> STRING
-%token EOL EQUALS CHARACTER COLON COMMA SEMICOLON TIMESEPERATOR
-
-%token TRUE FALSE
-
-%token FREQ BYDAY BYHOUR BYMINUTE BYMONTH BYMONTHDAY BYSECOND BYSETPOS BYWEEKNO
-%token BYYEARDAY DAILY MINUTELY MONTHLY SECONDLY WEEKLY HOURLY YEARLY
-%token INTERVAL COUNT UNTIL WKST MO SA SU TU WE TH FR
-
-%token BIT8 ACCEPTED ADD AUDIO BASE64 BINARY BOOLEAN BUSY BUSYTENTATIVE
-%token BUSYUNAVAILABLE CALADDRESS CANCEL CANCELLED CHAIR CHILD COMPLETED
-%token CONFIDENTIAL CONFIRMED COUNTER DATE DATETIME DECLINECOUNTER DECLINED
-%token DELEGATED DISPLAY DRAFT DURATION EMAIL END FINAL FLOAT FREE GREGORIAN
-%token GROUP INDIVIDUAL INPROCESS INTEGER NEEDSACTION NONPARTICIPANT
-%token OPAQUE OPTPARTICIPANT PARENT PERIOD PRIVATE PROCEDURE PUBLIC PUBLISH
-%token RECUR REFRESH REPLY REQPARTICIPANT REQUEST RESOURCE ROOM SIBLING
-%token START TENTATIVE TEXT THISANDFUTURE THISANDPRIOR TIME TRANSPAENT
-%token UNKNOWN UTCOFFSET XNAME
-
-%token ALTREP CN CUTYPE DAYLIGHT DIR ENCODING EVENT FBTYPE FMTTYPE LANGUAGE
-%token MEMBER PARTSTAT RANGE RELATED RELTYPE ROLE RSVP SENTBY STANDARD URI
-
-%token TIME_CHAR UTC_CHAR
-
-
-%%
-
-value:
- binary_value
- | boolean_value
- | date_value
- | datetime_value
- | duration_value
- | period_value
- | recur_value
- | utcoffset_value
- | error {
- icalparser_yy_value = 0;
- icalparser_clear_flex_input();
- yyclearin;
- }
-
-binary_value: "unimplemented2"
-
-boolean_value:
- TRUE
- { icalparser_yy_value = icalvalue_new_boolean(1); }
- | FALSE
- { icalparser_yy_value = icalvalue_new_boolean(0); }
-
-date_value: DIGITS
- {
- struct icaltimetype stm;
-
- stm = fill_datetime($1,0);
-
- stm.hour = -1;
- stm.minute = -1;
- stm.second = -1;
- stm.is_utc = 0;
- stm.is_date = 1;
-
- icalparser_yy_value = icalvalue_new_date(stm);
- }
-
-utc_char:
- /*empty*/ {utc = 0;}
- | UTC_CHAR {utc = 1;}
-
-/* This is used in the period_value, where there may be two utc characters per rule. */
-utc_char_b:
- /*empty*/ {utc_b = 0;}
- | UTC_CHAR {utc_b = 1;}
-
-datetime_value:
- DIGITS TIME_CHAR DIGITS utc_char
- {
- struct icaltimetype stm;
- stm = fill_datetime($1, $3);
- stm.is_utc = utc;
- stm.is_date = 0;
-
- icalparser_yy_value =
- icalvalue_new_datetime(stm);
- }
-
-
-/* Duration */
-
-
-dur_date: dur_day
- | dur_day dur_time
-
-dur_week: DIGITS 'W'
- {
- duration.weeks = atoi($1);
- }
-
-dur_time: TIME_CHAR dur_hour
- {
- }
- | TIME_CHAR dur_minute
- {
- }
- | TIME_CHAR dur_second
- {
- }
-
-dur_hour: DIGITS 'H'
- {
- duration.hours = atoi($1);
- }
- | DIGITS 'H' dur_minute
- {
- duration.hours = atoi($1);
- }
-
-dur_minute: DIGITS 'M'
- {
- duration.minutes = atoi($1);
- }
- | DIGITS 'M' dur_second
- {
- duration.minutes = atoi($1);
- }
-
-dur_second: DIGITS 'S'
- {
- duration.seconds = atoi($1);
- }
-
-dur_day: DIGITS 'D'
- {
- duration.days = atoi($1);
- }
-
-dur_prefix: /* empty */
- {
- }
- | '+'
- {
- }
- | '-'
- {
- }
-
-duration_value: dur_prefix 'P' dur_date
- {
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- }
- | dur_prefix 'P' dur_time
- {
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- }
- | dur_prefix 'P' dur_week
- {
- icalparser_yy_value = icalvalue_new_duration(duration);
- memset(&duration,0, sizeof(duration));
- }
-
-
-/* Period */
-
-period_value: DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b
- {
- struct icalperiodtype p;
-
- p.start = fill_datetime($1,$3);
- p.start.is_utc = utc;
- p.start.is_date = 0;
-
-
- p.end = fill_datetime($6,$8);
- p.end.is_utc = utc_b;
- p.end.is_date = 0;
-
- p.duration.days = -1;
- p.duration.weeks = -1;
- p.duration.hours = -1;
- p.duration.minutes = -1;
- p.duration.seconds = -1;
-
- icalparser_yy_value = icalvalue_new_period(p);
- }
- | DIGITS TIME_CHAR DIGITS utc_char '/' duration_value
- {
- struct icalperiodtype p;
-
- p.start = fill_datetime($1,$3);
- p.start.is_utc = utc;
- p.start.is_date = 0;
-
- p.end.year = -1;
- p.end.month = -1;
- p.end.day = -1;
- p.end.hour = -1;
- p.end.minute = -1;
- p.end.second = -1;
-
- /* The duration_value rule setes the global 'duration'
- variable, but it also creates a new value in
- icalparser_yy_value. So, free that, then copy
- 'duration' into the icalperiodtype struct. */
-
- p.duration = icalvalue_get_duration(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value);
- icalparser_yy_value = 0;
-
- icalparser_yy_value = icalvalue_new_period(p);
-
- }
-
-
-
-/* Recur */
-
-recur_start:
- FREQ EQUALS SECONDLY {clear_recur();recur.freq = ICAL_SECONDLY_RECURRENCE;}
- | FREQ EQUALS MINUTELY {clear_recur();recur.freq = ICAL_MINUTELY_RECURRENCE;}
- | FREQ EQUALS HOURLY {clear_recur();recur.freq = ICAL_HOURLY_RECURRENCE;}
- | FREQ EQUALS DAILY {clear_recur();recur.freq = ICAL_DAILY_RECURRENCE;}
- | FREQ EQUALS WEEKLY {clear_recur();recur.freq = ICAL_WEEKLY_RECURRENCE;}
- | FREQ EQUALS MONTHLY {clear_recur();recur.freq = ICAL_MONTHLY_RECURRENCE;}
- | FREQ EQUALS YEARLY {clear_recur();recur.freq = ICAL_YEARLY_RECURRENCE;}
- ;
-
-
-weekday:
- SU { skiplist[skippos]=ICAL_SUNDAY_WEEKDAY; if( skippos<8) skippos++;}
- | MO { skiplist[skippos]=ICAL_MONDAY_WEEKDAY;if( skippos<8) skippos++;}
- | TU { skiplist[skippos]=ICAL_TUESDAY_WEEKDAY;if( skippos<8) skippos++;}
- | WE { skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY;if( skippos<8) skippos++;}
- | TH { skiplist[skippos]=ICAL_THURSDAY_WEEKDAY;if( skippos<8) skippos++;}
- | FR { skiplist[skippos]=ICAL_FRIDAY_WEEKDAY;if( skippos<8) skippos++;}
- | SA { skiplist[skippos]=ICAL_SATURDAY_WEEKDAY;if( skippos<8) skippos++;}
- ;
-
-
-weekday_list:
- weekday
- | DIGITS weekday { } /* HACK Incorectly handles int in BYDAY */
- | weekday_list COMMA weekday
-
-
-recur_list:
- DIGITS { skiplist[skippos] = atoi($1); skippos++;}
- | recur_list COMMA DIGITS { skiplist[skippos] = atoi($3); if (skippos<367) skippos++;}
- ;
-
-recur_skip:
- INTERVAL EQUALS DIGITS {recur.interval = atoi($3);}
- | WKST EQUALS SU {recur.week_start = ICAL_SUNDAY_WEEKDAY;}
- | WKST EQUALS MO {recur.week_start = ICAL_MONDAY_WEEKDAY;}
- | WKST EQUALS TU {recur.week_start = ICAL_TUESDAY_WEEKDAY;}
- | WKST EQUALS WE {recur.week_start = ICAL_WEDNESDAY_WEEKDAY;}
- | WKST EQUALS TH {recur.week_start = ICAL_THURSDAY_WEEKDAY;}
- | WKST EQUALS FR {recur.week_start = ICAL_FRIDAY_WEEKDAY;}
- | WKST EQUALS SA {recur.week_start = ICAL_SATURDAY_WEEKDAY;}
- | BYSECOND EQUALS recur_list{copy_list(recur.by_second,60);}
- | BYMINUTE EQUALS recur_list{copy_list(recur.by_minute,60);}
- | BYHOUR EQUALS recur_list{copy_list(recur.by_hour,24);}
- | BYDAY EQUALS weekday_list{copy_list(recur.by_day,7);}
- | BYMONTH EQUALS recur_list{copy_list(recur.by_month,12);}
- | BYMONTHDAY EQUALS recur_list{copy_list(recur.by_month_day,31);}
- | BYYEARDAY EQUALS recur_list{copy_list(recur.by_year_day,366);}
- | BYWEEKNO EQUALS recur_list{copy_list(recur.by_week_no,53);}
- | BYSETPOS EQUALS recur_list{copy_list(recur.by_set_pos,366);}
- | UNTIL EQUALS datetime_value
- { recur.until = icalvalue_get_datetime(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;}
- | UNTIL EQUALS date_value
- { recur.until = icalvalue_get_date(icalparser_yy_value);
- icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;}
- | COUNT EQUALS DIGITS
- { recur.count = atoi($3); }
- ;
-
-recur_skip_list:
- /* empty */
- | recur_skip_list SEMICOLON recur_skip
-
-recur_value:
- recur_start recur_skip_list
- { icalparser_yy_value = icalvalue_new_recur(recur); }
-
-
-
-/* UTC Offset */
-
-plusminus: '+' { utcsign = 1; }
- | '-' { utcsign = -1; }
-
-utcoffset_value:
- plusminus INTNUMBER INTNUMBER
- {
- icalparser_yy_value = icalvalue_new_utcoffset( utcsign * ($2*3600) + ($3*60) );
- }
-
- | plusminus INTNUMBER INTNUMBER INTNUMBER
- {
- icalparser_yy_value = icalvalue_new_utcoffset(utcsign * ($2*3600) + ($3*60) +($4));
- }
-
-
-
-%%
-
-
-void clear_recur()
-{
- memset(&skiplist, ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
- skippos = 0;
-
- icalrecurrencetype_clear(&recur);
-}
-
-void copy_list(short* array, size_t size)
-{
- memcpy(array, skiplist, size*sizeof(short));
- memset(&skiplist,ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
- skippos = 0;
-}
-
-struct icaltimetype fill_datetime(char* datestr, char* timestr)
-{
- struct icaltimetype stm;
-
- memset(&stm,0,sizeof(stm));
-
- if (datestr != 0){
- sscanf(datestr,"%4d%2d%2d",&(stm.year), &(stm.month),
- &(stm.day));
- }
-
- if (timestr != 0){
- sscanf(timestr,"%2d%2d%2d", &(stm.hour), &(stm.minute),
- &(stm.second));
- }
-
- return stm;
-
-}
-
-void yyerror(char* s)
-{
- /*fprintf(stderr,"Parse error \'%s\'\n", s);*/
-}
-
diff --git a/libical/src/libical/locking.c b/libical/src/libical/locking.c
deleted file mode 100644
index 0376bc2bec..0000000000
--- a/libical/src/libical/locking.c
+++ /dev/null
@@ -1,143 +0,0 @@
-
-/*
- I Stole this from:
- http://www.cis.temple.edu/~ingargio/old/cis307s96/readings/rwlockexample.html
-
- CIS 307: An example using Read/Write File Locks
- [fcntl.h], [fcntl.c], [fcntlmain.c]
-
-In Stevens "Advanced Programming in the Unix Environment" we see ways to use
-the Unix service fcntl to lock portions of a file for reading and writing in
-the manner stated in the Reader and Writer problem [any number of readers at
-a time, but writers must operate alone]. Here we have three files that adapt
-and use the code from Stevens:
-
-*fcntl.h: Specification of the locking functions.
-*fcntl.c: Implementation of the locking functions.
-*fcntlmain.c: Driver that does a simple test of the locking functions.
-
-WARNING: A file lock request which is blocked can be interrupted by a
-signal. In this case the lock operation returns EINTR. Thus we may think we
-got a lock when we really don't. A solution is to block signals when
-locking. Another solution is to test the value returned by the lock
-operation and relock if the value is EINTR. Another solution, which we adopt
-here, is to do nothing about it.
-
-/* fcntl.c -- Defines mutexes in terms of read/write locks on files.
- * (code is mostly from Stevens: Advanced Programming in the
- * Unix environment. See from page 367 on.
- * filerwlock, filerwlockCreate, filerwlockDelete,
- * filerwreadlock, filerwlongreadlock, filerwlongunlock,
- * filerwlockUnlock
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-int lock_reg(int, int, int, off_t, int, off_t);
-
-#define read_lock(fd, offset, whence, len) \
- lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)
-
-#define readw_lock(fd, offset, whence, len) \
- lock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, len)
-
-#define write_lock(fd, offset, whence, len) \
- lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)
-
-#define writew_lock(fd, offset, whence, len) \
- lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)
-
-#define un_lock(fd, offset, whence, len) \
- lock_reg(fd, F_SETLK, F_UNLCK, offset, whence, len)
-
-pid_t lock_test(int, int , off_t , int , off_t );
-
-#define is_readlock(fd, offset, whence, len) \
- lock_test(fd, F_RDLCK, offset, whence, len)
-
-#define is_writelock(fd, offset, whence, len) \
- lock_test(fd, F_WRLCK, offset, whence, len)
-
-int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)
-{
- struct flock lock;
- lock.l_type = type; /* F_RDLCK, F_WRLCK, F_UNLCK */
- lock.l_start = offset; /* byte offset relative to l_whence */
- lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
- lock.l_len = len; /* #bytes (0 means to EOF) */
- return (fcntl(fd, cmd, &lock));
-}
-
-pid_t lock_test(int fd, int type, off_t offset, int whence, off_t len)
-{
- struct flock lock;
- lock.l_type = type; /* F_RDLCK or F_WRLCK */
- lock.l_start = offset; /* byte offset relative to l_whence */
- lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
- lock.l_len = len; /* #bytes (0 means to EOF) */
- if (fcntl(fd,F_GETLK,&lock) < 0){
- perror("fcntl"); exit(1);}
- if (lock.l_type == F_UNLCK)
- return (0); /* false, region is not locked by another process */
- return (lock.l_pid); /* true, return pid of lock owner */
-}
-
-typedef struct {
- int fd;
- int n;} filerwlock;
-
-/* Create N read/write locks and returns the id of this cluster of locks. */
-filerwlock * filerwlockCreate(char *filename, int n) {
- filerwlock *fl = (filerwlock *)malloc(sizeof(filerwlock));
- if (((fl->fd) = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IWUSR)) < 0) {
- perror("open");
- exit(1);}
- fl->n = n;
- return fl;
- }
-
-/* Delete the cluster of read/write locks associated with fl. */
-int filerwlockDelete(filerwlock *fl) {
- if (close(fl->fd) < 0) {
- perror("close");
- exit(1);}
- return free(fl);
- }
-
-/* Given the read/write lock cluster fl, lock its ith element */
-int filerwreadlock(filerwlock *fl, int i) {
- if ((i < 0) | (i >= fl->n)) {
- printf("filerwlockLock needs i in range 0 .. %d\n", (fl->n)-1);
- exit(0);}
- readw_lock(fl->fd, i, SEEK_SET, 1);
- }
-
-int filerwwritelock(filerwlock *fl, int i) {
- if ((i < 0) | (i >= fl->n)) {
- printf("filerwlockLock needs i in range 0 .. %d\n", (fl->n)-1);
- exit(0);}
- writew_lock(fl->fd, i, SEEK_SET, 1);
- }
-
-/* Given the lock cluster fl, unlock its ith element */
-int filerwunlock(filerwlock *fl, int i){
-
- if ((i < 0) | (i >= fl->n)) {
- printf("filerwlockUnlock needs i in range 0 .. %d\n", (fl->n)-1);
- exit(0);}
- un_lock(fl->fd, i, SEEK_SET, 1);
- }
-
-/* Given the lock cluster fl, it read locks all its elements */
-int filerwlongreadlock(filerwlock *fl) {
- readw_lock(fl->fd, 0, SEEK_SET, fl->n);
-}
-
-/* Given the lock cluster fl, it unlocks all its elements */
-int filerwlongunlock(filerwlock *fl) {
- un_lock(fl->fd, 0, SEEK_SET, fl->n);
-}
-
diff --git a/libical/src/libical/pvl.c b/libical/src/libical/pvl.c
deleted file mode 100644
index d5225a541e..0000000000
--- a/libical/src/libical/pvl.c
+++ /dev/null
@@ -1,768 +0,0 @@
-/*======================================================================
- FILE: pvl.c
- CREATOR: eric November, 1995
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-======================================================================*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pvl.h"
-#include <errno.h>
-#include <assert.h>
-#include <stdlib.h>
-
-
-
-/*
- struct pvl_list_t
-
- The list structure. This is the hanlde for the entire list
-
- This type is also private. Use pvl_list instead
-
- */
-
-typedef struct pvl_list_t
-{
- int MAGIC; /* Magic Identifier */
- struct pvl_elem_t *head; /* Head of list */
- struct pvl_elem_t *tail; /* Tail of list */
- int count; /* Number of items in the list */
- struct pvl_elem_t *p; /* Pointer used for iterators */
-} pvl_list_t;
-
-
-
-
-/* This global is incremented for each call to pvl_new_element(); it gives each
- * list a unique identifer */
-
-int pvl_elem_count = 0;
-int pvl_list_count = 0;
-
-
-/*----------------------------------------------------------------------
- Function: pvl_list pvl_newlist()
-
- Purpose:
-
- Creates a new list, clears the pointers and assigns a magic number
-
- Returns:
-
- Pointer to the new list
- 0 if there is no available memory.
- *----------------------------------------------------------------------*/
-
-pvl_list
-pvl_newlist()
-{
- struct pvl_list_t *L;
-
- if ( ( L = (struct pvl_list_t*)malloc(sizeof(struct pvl_list_t))) == 0)
- {
- errno = ENOMEM;
- return 0;
- }
-
- L->MAGIC = pvl_list_count;
- pvl_list_count++;
- L->head = 0;
- L->tail = 0;
- L->count = 0;
- L->p = 0;
-
- return L;
-}
-
-void
-pvl_free(pvl_list l)
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
-
- pvl_clear(l);
-
- free(L);
-}
-
-/*----------------------------------------------------------------------
- Function: pvl_new_element(void *d, struct pvl_elem_t *next,struct pvl_elem_t *prior)
-
- Purpose:
- Creates a new list element, assigns a magic number, and assigns
- the next and previous pointers.
-
- Passing in the next and previous points may seem odd, but it allos the user
- to set them while keeping the internal data hidden. In nearly all cases,
- the user is the pvl library itself.
-
- Parameters:
-
- d The data item to be stored in the list
- next Pointer value to assign to the member "next"
- prior Pointer value to assign to the member "prior"
-
- Returns:
-
- A pointer to the new element.
- 0 if there is no memory available.
-
- *----------------------------------------------------------------------*/
-
-pvl_elem
-pvl_new_element(void *d, pvl_elem next,pvl_elem prior)
-{
- struct pvl_elem_t *E;
-
- if ( ( E = (struct pvl_elem_t*)malloc(sizeof(struct pvl_elem_t))) == 0)
- {
- errno = ENOMEM;
- return 0;
- }
-
- E->MAGIC = pvl_elem_count++;
- E->d = d;
- E->next = next;
- E->prior = prior;
-
- return (pvl_elem)E;
-}
-
-/*----------------------------------------------------------------------
- Function: pvl_unshift(pvl_list l,void *d)
-
- Purpose:
-
- Add a new element to the from of the list
-
- Parameters:
-
- l The list to add the item to
- d Pointer to the item to add
-
- Returns:
- *----------------------------------------------------------------------*/
-
-void
-pvl_unshift(pvl_list l,void *d)
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
- struct pvl_elem_t *E = pvl_new_element(d,L->head,0);
-
- if (E->next != 0)
- {
- /* Link the head node to it */
- E->next->prior = E;
- }
-
- /* move the head */
- L->head = E;
-
- /* maybe move the tail */
-
- if (L->tail == 0)
- {
- L->tail = E;
- }
-
- L->count++;
-}
-
-/*----------------------------------------------------------------------
- Function: pvl_shift(pvl_list l)
-
- Purpose:
-
- Remove an element from the front of the list
-
- Parameters:
-
- l The list to operate on
-
- Returns:
- *----------------------------------------------------------------------*/
-
-void*
-pvl_shift(pvl_list l)
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
-
- if (L->head == 0)
- {
- return 0;
- }
-
- return pvl_remove(l,(void*)L->head);
-
-}
-
-/*----------------------------------------------------------------------
- Function: void pvl_push(pvl_list l,void *d)
-
- Purpose:
-
- Add a new item to the tail of the list
-
- Paramters:
-
- l The list to operate on
- d Pointer to the item to add
-
- Returns:
- *----------------------------------------------------------------------*/
-
-void
-pvl_push(pvl_list l,void *d)
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
- struct pvl_elem_t *E = pvl_new_element(d,0,L->tail);
-
- /* These are done in pvl_new_element
- E->next = 0;
- E->prior = L->tail;
- */
-
- if (L->tail != 0)
- {
- L->tail->next = E;
- }
-
- if (L->head == 0)
- {
- L->head = E;
- }
-
- L->tail = E;
-
- L->count++;
-
-}
-
-/*----------------------------------------------------------------------
- Function: void* pvl_pop(pvl_list l)
-
- Purpose:
-
- Remove an element from the tail of the list
-
- Paramters:
-
- l The list to operate on
-
- Returns:
- *----------------------------------------------------------------------*/
-
-void*
-pvl_pop(pvl_list l)
-{
-
- struct pvl_list_t *L = (struct pvl_list_t *)l;
-
- if ( L->tail == 0)
- {
- return 0;
- }
-
- return pvl_remove(l,(void*) L->tail);;
-
-}
-
-
-/*----------------------------------------------------------------------
- Function: void pvl_insert_ordered(pvl_list l,pvl_comparef f,void *d)
-
- Purpose:
-
- Add a new item to a list that is ordered by a comparison function.
- This routine assumes that the list is properly ordered.
-
- l The list to operate on
- f Pointer to a comparison function
- d Pointer to data to pass to the comparison function
-
- Returns:
-
- void
-
- *----------------------------------------------------------------------*/
-
-void
-pvl_insert_ordered(pvl_list l,pvl_comparef f,void *d)
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
-
- struct pvl_elem_t *P;
-
- L->count++;
-
- /* Empty list, add to head */
-
- if(L->head == 0)
- {
- pvl_unshift(l,d);
- return;
- }
-
- /* smaller than head, add to head */
-
- if ( ((*f)(d,L->head->d)) < 0)
- {
- pvl_unshift(l,d);
- return;
- }
-
- /* larger than tail, add to tail */
- if ( (*f)(d,L->tail->d) > 0)
- {
- pvl_push(l,d);
- return;
- }
-
-
- /* Search for the first element that is smaller, and add before it */
-
- for (P=L->head; P != 0; P = P->next)
- {
- if ( (*f)(P->d,d) > 0)
- {
- pvl_insert_before(l,P,d);
- return;
- }
- }
-
- /* badness, choke */
-
- assert(0);
-
-}
-
-/*----------------------------------------------------------------------
- Function: void pvl_insert_after(pvl_list l,pvl_elem p,void *d)
-
- Purpose:
-
- Add a new item after the referenced element.
-
- Parameters:
-
- l The list to operate on
- p The list element to add the item after
- d Pointer to the item to add.
-
- Returns:
-
- void
-
- *----------------------------------------------------------------------*/
-
-void
-pvl_insert_after(pvl_list l,pvl_elem p,void *d)
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
- struct pvl_elem_t *P = (struct pvl_elem_t *)p;
- struct pvl_elem_t *E = 0;
-
- L->count++;
-
- if (P == 0)
- {
- pvl_unshift(l,d);
- return;
- }
-
- if ( P == L->tail)
- {
- E = pvl_new_element(d,0,P);
- L->tail = E;
- E->prior->next = E;
- }
- else
- {
- E = pvl_new_element(d,P->next,P);
- E->next->prior = E;
- E->prior->next = E;
- }
-}
-
-/*----------------------------------------------------------------------
- Function: void pvl_insert_before(pvl_list l,pvl_elem p,void *d)
-
- Purpose:
-
- Add an item after a referenced item
-
- Parameters:
-
- l The list to operate on
- p The list element to add the item before
- d Pointer to the data to be added.
-
- Returns:
- *----------------------------------------------------------------------*/
-
-void
-pvl_insert_before(pvl_list l,pvl_elem p,void *d)
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
- struct pvl_elem_t *P = (struct pvl_elem_t *)p;
- struct pvl_elem_t *E = 0;
-
- L->count++;
-
- if (P == 0)
- {
- pvl_unshift(l,d);
- return;
- }
-
- if ( P == L->head)
- {
- E = pvl_new_element(d,P,0);
- E->next->prior = E;
- L->head = E;
- }
- else
- {
- E = pvl_new_element(d,P,P->prior);
- E->prior->next = E;
- E->next->prior = E;
- }
-}
-
-/*----------------------------------------------------------------------
- Function: void pvl_remove(pvl_list l,pvl_elem e)
-
- Purpose:
-
- Remove the referenced item from the list
-
- This routine will free the element, but not the data item that the
- element contains.
-
- Parameters:
-
- l The list to operate on
- e The element to remove.
-
- Returns:
- *----------------------------------------------------------------------*/
-
-void*
-pvl_remove(pvl_list l,pvl_elem e)
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
- struct pvl_elem_t *E = (struct pvl_elem_t *)e;
- void* data;
-
- if (E == L->head)
- {
- if (E->next != 0)
- {
- E->next->prior = 0;
- L->head = E->next;
- } else {
- /* E Also points to tail -> only one element in list */
- L->tail = 0;
- L->head = 0;
- }
- }
- else if (E == L->tail)
- {
- if (E->prior != 0)
- {
- E->prior->next = 0;
- L->tail = E->prior;
- } else {
- /* E points to the head, so it was the last element */
- /* This case should be taken care of in the previous clause */
- L->head = 0;
- L->tail = 0;
- }
- }
- else
- {
- E->prior->next = E->next;
- E->next->prior = E->prior;
- }
-
-
- L->count--;
-
- data = E->d;
-
- free(E);
-
- return data;
-
-}
-
-/*----------------------------------------------------------------------
- Function: pvl_elem pvl_find(pvl_list l,pvl_findf f,void* v)
-
- Purpose:
-
- Return a pointer to data that satisfies a function
-
- This routine will interate through the entire list and call the
- find function for each item. It will break and return a pointer to the
- data that causes the find function to return 1.
-
- Parameters:
-
- l The list to operate on
- f Pointer to the find function
- v Pointer to constant data to pass into the function
-
- Returns:
-
- Pointer to the element that the find function found.
-
- *----------------------------------------------------------------------*/
-
-pvl_elem
-pvl_find(pvl_list l,pvl_findf f,void* v)
-{
- pvl_elem e;
-
- for (e=pvl_head(l); e!= 0; e = pvl_next(e))
- {
- if ( (*f)(((struct pvl_elem_t *)e)->d,v) == 1)
- {
- /* Save this elem for a call to find_next */
- ((struct pvl_list_t *)l)->p = e;
- return e;
- }
- }
-
- return 0;
-
-}
-/*----------------------------------------------------------------------
- Function: void* pvl_find_next(pvl_list l,pvl_findf f,void* v)
-
- Purpose:
-
- Like pvl_find(), but continues the search where the last find() or
- find_next() left off
-
- Parameters:
-
- l The list to operate on
- f Pointer to the find function
- v Pointer to constant data to pass into the function
-
- Returns:
-
- Pointer to the element that the find function found.
-
- *----------------------------------------------------------------------*/
-
-pvl_elem
-pvl_find_next(pvl_list l,pvl_findf f,void* v)
-{
-
- pvl_elem e;
-
- for (e=pvl_head(l); e!= 0; e = pvl_next(e))
- {
- if ( (*f)(((struct pvl_elem_t *)e)->d,v) == 1)
- {
- /* Save this elem for a call to find_next */
- ((struct pvl_list_t *)l)->p = e;
- return e;
- }
- }
-
- return 0;
-
-}
-
-/*----------------------------------------------------------------------
- Function: void pvl_clear(pvl_list l)
-
- Purpose:
-
- Remove the all the elements in the list. The does not free the data items
- the elements hold.
-
-
- Returns:
- *----------------------------------------------------------------------*/
-
-void
-pvl_clear(pvl_list l)
-{
- pvl_elem e = pvl_head(l);
- pvl_elem next;
-
- if (e == 0) {
- return;
- }
-
- while(e != 0)
- {
- next = pvl_next(e);
- pvl_remove(l,e);
- e = next;
- }
-}
-
-/*----------------------------------------------------------------------
- Function: int pvl_count(pvl_list l)
-
- Purpose:
-
- Returns the number of items in the list.
-
- Returns:
- *----------------------------------------------------------------------*/
-
-int
-pvl_count(pvl_list l)
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
-
- return L->count;
-}
-
-
-/*----------------------------------------------------------------------
- Function: pvl_elem pvl_next(pvl_elem e)
-
- Purpose:
- Returns a pointer to the given element
-
- Returns:
- *----------------------------------------------------------------------*/
-
-pvl_elem
-pvl_next(pvl_elem e)
-{
- struct pvl_elem_t *E = (struct pvl_elem_t *)e;
-
- if (E == 0){
- return 0;
- }
-
- return (pvl_elem)E->next;
-}
-
-/*----------------------------------------------------------------------
- Function: pvl_elem pvl_prior(pvl_elem e)
-
- Purpose:
-
- Returns a pointer to the element previous to the element given.
-
- Returns:
- *----------------------------------------------------------------------*/
-
-pvl_elem
-pvl_prior(pvl_elem e)
-{
- struct pvl_elem_t *E = (struct pvl_elem_t *)e;
-
- return (pvl_elem)E->prior;
-}
-
-/*----------------------------------------------------------------------
- Function: pvl_elem pvl_head(pvl_list l )
-
- Purpose:
-
- Returns a pointer to the first item in the list.
-
- Returns:
- *----------------------------------------------------------------------*/
-pvl_elem
-pvl_head(pvl_list l )
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
-
- return (pvl_elem)L->head;
-}
-
-/*----------------------------------------------------------------------
- Function: pvl_elem pvl_tail(pvl_list l)
-
- Purpose:
-
- Returns a pointer to the last item in the list.
-
- Returns:
- *----------------------------------------------------------------------*/
-pvl_elem
-pvl_tail(pvl_list l)
-{
- struct pvl_list_t *L = (struct pvl_list_t *)l;
- return (pvl_elem)L->tail;
-}
-
-/*----------------------------------------------------------------------
- Function:
-
-
- Purpose:
-
-
- Returns:
- *----------------------------------------------------------------------*/
-
-#ifndef PVL_USE_MACROS
-void*
-pvl_data(pvl_elem e)
-{
- struct pvl_elem_t *E = (struct pvl_elem_t *)e;
-
- if ( e == 0){
- return 0;
- }
-
- return E->d;
-}
-#endif
-
-/*----------------------------------------------------------------------
- Function: void pvl_apply(pvl_list l,pvl_applyf f, void *v)
-
- Purpose:
-
- Call a function for every item in the list.
-
- Paramters:
-
- l The list to operate on
- f Pointer to the function to call
- v Data to pass to the function on every iteration
-
- Returns:
-
- void
- *----------------------------------------------------------------------*/
-
-void
-pvl_apply(pvl_list l,pvl_applyf f, void *v)
-{
- pvl_elem e;
-
- for (e=pvl_head(l); e!= 0; e = pvl_next(e))
- {
- (*f)(((struct pvl_elem_t *)e)->d,v);
- }
-
-}
diff --git a/libical/src/libical/pvl.h b/libical/src/libical/pvl.h
deleted file mode 100644
index 8113f7495a..0000000000
--- a/libical/src/libical/pvl.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*======================================================================
- FILE: pvl.h
- CREATOR: eric November, 1995
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
-======================================================================*/
-
-/*
- struct pvl_elem_t
-
- This type is private. Always use pvl_elem instead
-
- */
-
-#ifndef __PVL_H__
-#define __PVL_H__
-
-typedef void* pvl_list;
-typedef void* pvl_elem;
-
-typedef struct pvl_elem_t
-{
- int MAGIC; /* Magic Identifier */
- void *d; /* Pointer to data user is storing */
- struct pvl_elem_t *next; /* Next element */
- struct pvl_elem_t *prior; /* prior element */
-} pvl_elem_t;
-
-
-
-/* This global is incremented for each call to pvl_new_element(); it gives each
- * list a unique identifer */
-
-extern int pvl_elem_count;
-extern int pvl_list_count;
-
-/* Create new lists or elements */
-pvl_elem pvl_new_element(void* d, pvl_elem next,pvl_elem prior);
-pvl_list pvl_newlist();
-void pvl_free(pvl_list);
-
-/* Add, remove, or get the head of the list */
-void pvl_unshift(pvl_list l,void *d);
-void* pvl_shift(pvl_list l);
-pvl_elem pvl_head(pvl_list);
-
-/* Add, remove or get the tail of the list */
-void pvl_push(pvl_list l,void *d);
-void* pvl_pop(pvl_list l);
-pvl_elem pvl_tail(pvl_list);
-
-/* Insert elements in random places */
-typedef int (*pvl_comparef)(void* a, void* b); /* a, b are of the data type*/
-void pvl_insert_ordered(pvl_list l,pvl_comparef f,void *d);
-void pvl_insert_after(pvl_list l,pvl_elem e,void *d);
-void pvl_insert_before(pvl_list l,pvl_elem e,void *d);
-
-/* Remove an element, or clear the entire list */
-void* pvl_remove(pvl_list,pvl_elem); /* Remove element, return data */
-void pvl_clear(pvl_list); /* Remove all elements, de-allocate all data */
-
-int pvl_count(pvl_list);
-
-/* Navagate the list */
-pvl_elem pvl_next(pvl_elem e);
-pvl_elem pvl_prior(pvl_elem e);
-
-/* get the data in the list */
-#ifndef PVL_USE_MACROS
-void* pvl_data(pvl_elem);
-#else
-#define pvl_data(x) x==0 ? 0 : ((struct pvl_elem_t *)x)->d;
-#endif
-
-
-/* Find an element for which a function returns true */
-typedef int (*pvl_findf)(void* a, void* b); /*a is list elem, b is other data*/
-pvl_elem pvl_find(pvl_list l,pvl_findf f,void* v);
-pvl_elem pvl_find_next(pvl_list l,pvl_findf f,void* v);
-
-/* Pass each element in the list to a function */
-typedef void (*pvl_applyf)(void* a, void* b); /*a is list elem, b is other data*/
-void pvl_apply(pvl_list l,pvl_applyf f, void *v);
-
-
-#endif /* __PVL_H__ */
-
-
-
-
-
diff --git a/libical/src/libical/testlocks.c b/libical/src/libical/testlocks.c
deleted file mode 100644
index d3e9e55cec..0000000000
--- a/libical/src/libical/testlocks.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* This is just a driver to test the filerwlock objects defined in fcntl.c */
-/* MAXCHILD processes are forked. They take turns in using LOCKSSIZE locks.*/
-/* I compiled the program as follows */
-/* cc fcntlmain.c fcntl.c -o fcntlmain */
-/* and then run the image fcntlmain. */
-/* Notice that after the program has run I find the file "mylock" in my */
-/* directory. Not very desirable. Perhaps there is a way to avoid that? */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include "fcntl.h"
-
-#define LOCKFILE "mylock"
-#define LOCKSSIZE 5
-#define MAXCHILD 4
-
-void child (int self);
-
-pid_t cldrn[4];
-filerwlock *fl;
-
-int
-main(void){
- int i;
-
- fl = filerwlockCreate(LOCKFILE, LOCKSSIZE);
-
- for (i=0;i < MAXCHILD; i++) {
- if ((cldrn[i]=fork()) < 0) {
- perror("fork");
- exit(1);}
- if (cldrn[i]==0)
- child(i);
- }
- for (i=0; i < MAXCHILD; i++)
- wait();
-
- filerwlockDelete(fl);
- exit(0);
-}
-
-void child (int self) {
- int i, j;
- char s[256];
- for (j=0; j<8; j++) {
-
- if (self == 0) {
- filerwwritelock(fl,1);
- } else if (self == (MAXCHILD-1)) {
- filerwlongreadlock(fl);
- } else {
- filerwreadlock(fl,1);
- }
-
- printf("Child %d starts to sleep on lock %d\n", self, 1);
-
- sleep(3);
-
- printf("Child %d ends sleep on lock %d\n", self, 1);
-
- if (self == (MAXCHILD-1)) {
- filerwlongunlock(fl);
- } else {
- filerwunlock(fl,1);
- }
-
- sleep(1);
- }
- exit(0);
-}
diff --git a/libical/src/libicalss/.cvsignore b/libical/src/libicalss/.cvsignore
deleted file mode 100644
index 732c1577b6..0000000000
--- a/libical/src/libicalss/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-Makefile
-.deps
-Makefile.in
-*.lo
-*.la
-.libs \ No newline at end of file
diff --git a/libical/src/libicalss/Makefile.am b/libical/src/libicalss/Makefile.am
deleted file mode 100644
index 01a7fa4d9c..0000000000
--- a/libical/src/libicalss/Makefile.am
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-#noinst_LTLIBRARIES = libicalss.la
-lib_LIBRARIES = libicalss.a
-
-libicalss_a_SOURCES =\
- icalcalendar.c \
- icalcalendar.h \
- icalcluster.c \
- icalcluster.h \
- icalstore.c \
- icalstore.h
-
-include_HEADERS =\
- icalcalendar.h \
- icalcluster.h \
- icalstore.h
-
-
-INCLUDES = \
- -I ../libical/ \
- -I $(srcdir)/../libical/ \
- -I .. \
- -I$(srcdir)/..
-
diff --git a/libical/src/libicalss/icalcalendar.c b/libical/src/libicalss/icalcalendar.c
deleted file mode 100644
index 0f2231b1d7..0000000000
--- a/libical/src/libicalss/icalcalendar.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalcalendar.c
- CREATOR: eric 23 December 1999
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is eric. The Initial Developer of the Original
- Code is Eric Busboom
-
-
- ======================================================================*/
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-
-#include "icalcalendar.h"
-#include "icalcluster.h"
-#include <limits.h>
-#include <sys/stat.h> /* For mkdir, stat */
-#include <sys/types.h> /* For mkdir */
-#include <fcntl.h> /* For mkdir */
-#include <unistd.h> /* For mkdir, stat */
-#include <stdlib.h> /* for malloc */
-#include <string.h> /* for strcat */
-#include <errno.h>
-
-#define BOOKED_DIR "booked"
-#define INCOMING_FILE "incoming.ics"
-#define PROP_FILE "properties.ics"
-#define FBLIST_FILE "freebusy.ics"
-
-struct icalcalendar_impl
-{
- char* dir;
- icalcomponent* freebusy;
- icalcomponent* properties;
- icalstore* booked;
- icalstore* incoming;
-};
-
-struct icalcalendar_impl* icalcalendar_new_impl()
-{
- struct icalcalendar_impl* impl;
-
- if ( ( impl = (struct icalcalendar_impl*)
- malloc(sizeof(struct icalcalendar_impl))) == 0) {
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
- }
-
- return impl;
-}
-
-
-icalerrorenum icalcalendar_create(struct icalcalendar_impl* impl)
-{
- char path[PATH_MAX];
- struct stat sbuf;
- int r;
-
- icalerror_check_arg_re((impl != 0),"impl",ICAL_BADARG_ERROR);
-
- path[0] = '\0';
- strcpy(path,impl->dir);
- strcat(path,"/");
- strcat(path,BOOKED_DIR);
-
- r = stat(path,&sbuf);
-
- if( r != 0 && errno == ENOENT){
-
- if(mkdir(path,0777)!=0){
- icalerror_set_errno(ICAL_FILE_ERROR);
- return ICAL_FILE_ERROR;
- }
- }
-
- return ICAL_NO_ERROR;
-}
-
-icalcalendar* icalcalendar_new(char* dir)
-{
- struct icalcalendar_impl* impl;
-
- icalerror_check_arg_rz((dir != 0),"dir");
-
- impl = icalcalendar_new_impl();
-
- if (impl == 0){
- return 0;
- }
-
- impl->dir = (char*)strdup(dir);
- impl->freebusy = 0;
- impl->properties = 0;
- impl->booked = 0;
- impl->incoming = 0;
-
- if (icalcalendar_create(impl) != ICAL_NO_ERROR){
- free(impl);
- return 0;
- }
-
- return impl;
-}
-
-void icalcalendar_free(icalcalendar* calendar)
-{
-
- struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
-
- if (impl->dir !=0){
- free(impl->dir);
- }
-
- if (impl->freebusy !=0){
- icalcluster_free(impl->freebusy);
- }
-
- if (impl->properties !=0){
- icalcluster_free(impl->properties);
- }
-
- if (impl->booked !=0){
- icalstore_free(impl->booked);
- }
-
- if (impl->incoming !=0){
- icalstore_free(impl->incoming);
- }
-
- impl->dir = 0;
- impl->freebusy = 0;
- impl->properties = 0;
- impl->booked = 0;
- impl->incoming = 0;
-
-
- free(impl);
-}
-
-
-int icalcalendar_lock(icalcalendar* calendar)
-{
- struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
- icalerror_check_arg_rz((impl != 0),"impl");
- return 0;
-}
-
-int icalcalendar_unlock(icalcalendar* calendar)
-{
- struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
- icalerror_check_arg_rz((impl != 0),"impl");
- return 0;
-}
-
-int icalcalendar_islocked(icalcalendar* calendar)
-{
- struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
- icalerror_check_arg_rz((impl != 0),"impl");
- return 0;
-}
-
-int icalcalendar_ownlock(icalcalendar* calendar)
-{
- struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
- icalerror_check_arg_rz((impl != 0),"impl");
- return 0;
-}
-
-icalstore* icalcalendar_get_booked(icalcalendar* calendar)
-{
- struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
- char dir[PATH_MAX];
-
- icalerror_check_arg_rz((impl != 0),"impl");
-
- dir[0] = '\0';
- strcpy(dir,impl->dir);
- strcat(dir,"/");
- strcat(dir,BOOKED_DIR);
-
- if (impl->booked == 0){
- icalerror_clear_errno();
- impl->booked = icalstore_new(dir);
- assert(icalerrno == ICAL_NO_ERROR);
- }
-
- return impl->booked;
-
-}
-
-icalcluster* icalcalendar_get_incoming(icalcalendar* calendar)
-{
- char path[PATH_MAX];
- struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
- icalerror_check_arg_rz((impl != 0),"impl");
-
- path[0] = '\0';
- strcpy(path,impl->dir);
- strcat(path,"/");
- strcat(path,INCOMING_FILE);
-
- if (impl->properties == 0){
- impl->properties = icalcluster_new(path);
- }
-
- return impl->properties;
-}
-
-icalcluster* icalcalendar_get_properties(icalcalendar* calendar)
-{
- char path[PATH_MAX];
- struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
- icalerror_check_arg_rz((impl != 0),"impl");
-
- path[0] = '\0';
- strcpy(path,impl->dir);
- strcat(path,"/");
- strcat(path,PROP_FILE);
-
- if (impl->properties == 0){
- impl->properties = icalcluster_new(path);
- }
-
- return impl->properties;
-}
-
-icalcluster* icalcalendar_get_freebusy(icalcalendar* calendar)
-{
- char path[PATH_MAX];
- struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
- icalerror_check_arg_rz((impl != 0),"impl");
-
- path[0] = '\0';
- strcpy(path,impl->dir);
- strcat(path,"/");
- strcat(path,FBLIST_FILE);
-
-
- if (impl->freebusy == 0){
- impl->freebusy = icalcluster_new(path);
- }
-
- return impl->freebusy;
-}
-
-
-
-
diff --git a/libical/src/libicalss/icalcalendar.h b/libical/src/libicalss/icalcalendar.h
deleted file mode 100644
index 90e7b33c22..0000000000
--- a/libical/src/libicalss/icalcalendar.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalcalendar.h
- CREATOR: eric 23 December 1999
-
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is eric. The Initial Developer of the Original
- Code is Eric Busboom
-
-
-======================================================================*/
-
-#ifndef ICALCALENDAR_H
-#define ICALCALENDAR_H
-
-#include "ical.h"
-#include "icalstore.h"
-#include "icalcluster.h"
-
-/* icalcalendar
- * Routines for storing calendar data in a file system. The calendar
- * has two icalstores, one for incoming components and one for booked
- * components. It also has interfaces to access the free/busy list
- * and a list of calendar properties */
-
-typedef void icalcalendar;
-
-icalcalendar* icalcalendar_new(char* dir);
-
-void icalcalendar_free(icalcalendar* calendar);
-
-int icalcalendar_lock(icalcalendar* calendar);
-
-int icalcalendar_unlock(icalcalendar* calendar);
-
-int icalcalendar_islocked(icalcalendar* calendar);
-
-int icalcalendar_ownlock(icalcalendar* calendar);
-
-icalstore* icalcalendar_get_booked(icalcalendar* calendar);
-
-icalcluster* icalcalendar_get_incoming(icalcalendar* calendar);
-
-icalcluster* icalcalendar_get_properties(icalcalendar* calendar);
-
-icalcluster* icalcalendar_get_freebusy(icalcalendar* calendar);
-
-
-#endif /* !ICALCALENDAR_H */
-
-
-
diff --git a/libical/src/libicalss/icalcluster.c b/libical/src/libicalss/icalcluster.c
deleted file mode 100644
index 36bdccc743..0000000000
--- a/libical/src/libicalss/icalcluster.c
+++ /dev/null
@@ -1,423 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalcluster.c
- CREATOR: eric 23 December 1999
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is eric. The Initial Developer of the Original
- Code is Eric Busboom
-
-
- ======================================================================*/
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-
-#include "icalcluster.h"
-#include <errno.h>
-#include <limits.h> /* For PATH_MAX */
-#include <sys/stat.h> /* for stat */
-#include <unistd.h> /* for stat, getpid */
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h> /* for fcntl */
-#include <unistd.h> /* for fcntl */
-
-icalerrorenum icalcluster_create_cluster(char *path);
-
-struct icalcluster_impl {
- char *path;
- icalcomponent* cluster;
- int changed;
- FILE* stream;
-};
-
-icalcluster* icalcluster_new_impl()
-{
- struct icalcluster_impl* comp;
-
- if ( ( comp = (struct icalcluster_impl*)
- malloc(sizeof(struct icalcluster_impl))) == 0) {
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- errno = ENOMEM;
- return 0;
- }
-
- return comp;
-}
-
-char* read_from_file(char *s, size_t size, void *d)
-{
- char *c = fgets(s,size, (FILE*)d);
- return c;
-}
-
-icalcluster* icalcluster_new(char* path)
-{
- struct icalcluster_impl *impl = icalcluster_new_impl();
- struct stat sbuf;
- int createclusterfile = 0;
- icalerrorenum error = ICAL_NO_ERROR;
- icalparser *parser;
- struct icaltimetype tt;
- off_t cluster_file_size;
-
- memset(&tt,0,sizeof(struct icaltimetype));
-
- icalerror_clear_errno();
- icalerror_check_arg_rz( (path!=0), "path");
-
- if (impl == 0){
- return 0;
- }
-
- /*impl->path = strdup(path); icalcluster_load does this */
- impl->changed = 0;
-
- impl->cluster = 0;
-
- impl->path = 0;
- impl->stream = 0;
-
- /* Check if the path already exists and if it is a regular file*/
- if (stat(path,&sbuf) != 0){
-
- /* A file by the given name does not exist, or there was
- another error */
- cluster_file_size = 0;
- if (errno == ENOENT) {
- /* It was because the file does not exist */
- createclusterfile = 1;
- } else {
- /* It was because of another error */
- icalerror_set_errno(ICAL_FILE_ERROR);
- return 0;
- }
- } else {
- /* A file by the given name exists, but is it a regular file */
-
- if (!S_ISREG(sbuf.st_mode)){
- /* Nope, not a directory */
- icalerror_set_errno(ICAL_FILE_ERROR);
- return 0;
- } else {
- /* Lets assume that it is a file of the right type */
- cluster_file_size = sbuf.st_size;
- createclusterfile = 0;
- }
- }
-
- /* if cluster does not already exist, create it */
-
- if (createclusterfile == 1) {
- error = icalcluster_create_cluster(path);
-
- if (error != ICAL_NO_ERROR){
- icalerror_set_errno(error);
- return 0;
- }
- }
-
- impl->path = (char*)strdup(path);
-
- errno = 0;
- impl->stream = fopen(impl->path,"r");
-
- if (impl->stream ==0 || errno != 0){
- impl->cluster = 0;
- icalerror_set_errno(ICAL_FILE_ERROR); /* Redundant, actually */
- return 0;
- }
-
- icalcluster_lock(impl);
-
- if(cluster_file_size > 0){
- parser = icalparser_new();
- icalparser_set_gen_data(parser,impl->stream);
- impl->cluster = icalparser_parse(parser,read_from_file);
- icalparser_free(parser);
-
- if (icalcomponent_isa(impl->cluster) != ICAL_XROOT_COMPONENT){
- /* The parser got a single component, so it did not put it in
- an XROOT. */
- icalcomponent *cl = impl->cluster;
- impl->cluster = icalcomponent_new(ICAL_XROOT_COMPONENT);
- icalcomponent_add_component(impl->cluster,cl);
- }
-
- } else {
-
- impl->cluster = icalcomponent_new(ICAL_XROOT_COMPONENT);
- }
-
- if (impl->cluster == 0){
- icalerror_set_errno(ICAL_PARSE_ERROR);
- return 0;
- }
-
- if (error != ICAL_NO_ERROR){
- return 0;
- }
-
- return impl;
-}
-
-void icalcluster_free(icalcluster* cluster)
-{
- struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
-
- icalerror_check_arg_rv((cluster!=0),"cluster");
-
- if (impl->cluster != 0){
- icalcluster_commit(cluster);
- icalcomponent_free(impl->cluster);
- impl->cluster=0;
- }
-
- if(impl->path != 0){
- free(impl->path);
- impl->path = 0;
- }
-
- if(impl->stream != 0){
- icalcluster_unlock(impl);
- fclose(impl->stream);
- impl->stream = 0;
- }
-
- free(impl);
-}
-
-char* icalcluster_path(icalcluster* cluster)
-{
- struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
- icalerror_check_arg_rz((cluster!=0),"cluster");
-
- return impl->path;
-}
-
-
-int icalcluster_lock(icalcluster *cluster)
-{
- struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
- struct flock lock;
- int fd;
-
- icalerror_check_arg_rz((impl->stream!=0),"impl->stream");
-
- fd = fileno(impl->stream);
-
- lock.l_type = F_WRLCK; /* F_RDLCK, F_WRLCK, F_UNLCK */
- lock.l_start = 0; /* byte offset relative to l_whence */
- lock.l_whence = SEEK_SET; /* SEEK_SET, SEEK_CUR, SEEK_END */
- lock.l_len = 0; /* #bytes (0 means to EOF) */
-
- return (fcntl(fd, F_SETLKW, &lock));
-}
-
-int icalcluster_unlock(icalcluster *cluster)
-{
- struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
- int fd;
- struct flock lock;
- icalerror_check_arg_rz((impl->stream!=0),"impl->stream");
-
- fd = fileno(impl->stream);
-
- lock.l_type = F_WRLCK; /* F_RDLCK, F_WRLCK, F_UNLCK */
- lock.l_start = 0; /* byte offset relative to l_whence */
- lock.l_whence = SEEK_SET; /* SEEK_SET, SEEK_CUR, SEEK_END */
- lock.l_len = 0; /* #bytes (0 means to EOF) */
-
- return (fcntl(fd, F_UNLCK, &lock));
-
-}
-
-icalerrorenum icalcluster_create_cluster(char *path)
-{
-
- FILE* f;
- int r;
- icalcomponent *c;
-
- icalerror_clear_errno();
-
- f = fopen(path,"w");
-
- if (f == 0){
- icalerror_set_errno(ICAL_FILE_ERROR);
- return ICAL_FILE_ERROR;
- }
-
-
- /* This used to write data to the file... */
-
-
- fclose(f);
-
- return ICAL_NO_ERROR;
-}
-
-icalerrorenum icalcluster_commit(icalcluster* cluster)
-{
- FILE *f;
- char tmp[PATH_MAX]; /* HACK Buffer overflow potential */
- char *str;
- icalparser *parser;
- icalcomponent *c;
-
- struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
-
- icalerror_check_arg_re((impl!=0),"cluster",ICAL_BADARG_ERROR);
-
- if (impl->changed == 0 ){
- return ICAL_NO_ERROR;
- }
-
-#ifdef ICAL_SAFESAVES
- snprintf(tmp,PATH_MAX,"%s-tmp",impl->path);
-#else
- strcpy(tmp,impl->path);
-#endif
-
- if ( (f = fopen(tmp,"w")) < 0 ){
- icalerror_set_errno(ICAL_FILE_ERROR);
- return ICAL_FILE_ERROR;
- }
-
- for(c = icalcomponent_get_first_component(impl->cluster,ICAL_ANY_COMPONENT);
- c != 0;
- c = icalcomponent_get_next_component(impl->cluster,ICAL_ANY_COMPONENT)){
-
- str = icalcomponent_as_ical_string(c);
-
- if ( fwrite(str,sizeof(char),strlen(str),f) < strlen(str)){
- fclose(f);
- return ICAL_FILE_ERROR;
- }
- }
-
- fclose(f);
- impl->changed = 0;
-
-#ifdef ICAL_SAFESAVES
- rename(tmp,impl->path); /* HACK, should check for error here */
-#endif
-
- return ICAL_NO_ERROR;
-
-}
-
-void icalcluster_mark(icalcluster* cluster){
-
- struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
-
- icalerror_check_arg_rv((impl!=0),"cluster");
-
- impl->changed = 1;
-
-}
-
-icalcomponent* icalcluster_get_component(icalcluster* cluster){
- struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
-
- icalerror_check_arg_re((impl!=0),"cluster",ICAL_BADARG_ERROR);
-
- return impl->cluster;
-}
-
-
-/* manipulate the components in the cluster */
-
-icalerrorenum icalcluster_add_component(icalcluster *cluster,
- icalcomponent* child)
-{
- struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
-
- icalerror_check_arg_rv((cluster!=0),"cluster");
- icalerror_check_arg_rv((child!=0),"child");
-
- icalcomponent_add_component(impl->cluster,child);
-
- icalcluster_mark(cluster);
-
- return ICAL_NO_ERROR;
-
-}
-
-icalerrorenum icalcluster_remove_component(icalcluster *cluster,
- icalcomponent* child)
-{
- struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
-
- icalerror_check_arg_rv((cluster!=0),"cluster");
- icalerror_check_arg_rv((child!=0),"child");
-
- icalcomponent_remove_component(impl->cluster,child);
-
- icalcluster_mark(cluster);
-
- return ICAL_NO_ERROR;
-}
-
-int icalcluster_count_components(icalcluster *cluster,
- icalcomponent_kind kind)
-{
- struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
-
- if(cluster == 0){
- icalerror_set_errno(ICAL_BADARG_ERROR);
- return -1;
- }
-
- return icalcomponent_count_components(impl->cluster,kind);
-}
-
-/* Iterate through components */
-icalcomponent* icalcluster_get_current_component (icalcluster* cluster)
-{
- struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
-
- icalerror_check_arg_rz((cluster!=0),"cluster");
-
- return icalcomponent_get_current_component(impl->cluster);
-}
-
-icalcomponent* icalcluster_get_first_component(icalcluster* cluster,
- icalcomponent_kind kind)
-{
- struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
-
- icalerror_check_arg_rz((cluster!=0),"cluster");
-
- return icalcomponent_get_first_component(impl->cluster,kind);
-}
-
-icalcomponent* icalcluster_get_next_component(icalcluster* cluster,
- icalcomponent_kind kind)
-{
- struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
-
- icalerror_check_arg_rz((cluster!=0),"cluster");
-
- return icalcomponent_get_next_component(impl->cluster,kind);
-}
-
diff --git a/libical/src/libicalss/icalcluster.h b/libical/src/libicalss/icalcluster.h
deleted file mode 100644
index 39fe542027..0000000000
--- a/libical/src/libicalss/icalcluster.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalcluster.h
- CREATOR: eric 23 December 1999
-
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is eric. The Initial Developer of the Original
- Code is Eric Busboom
-
-
-======================================================================*/
-
-#ifndef ICALCLUSTER_H
-#define ICALCLUSTER_H
-
-#include "ical.h"
-
-typedef void icalcluster;
-
-
-icalcluster* icalcluster_new(char* path);
-void icalcluster_free(icalcluster* cluster);
-
-char* icalcluster_path(icalcluster* cluster);
-
-/* Return a reference to the internal component. */
-icalcomponent* icalcluster_get_component(icalcluster* cluster);
-
-/* Mark the cluster as changed, so it will be written to disk when it
- is freed*/
-void icalcluster_mark(icalcluster* cluster);
-
-/* Write the cluster data back to disk */
-icalerrorenum icalcluster_commit(icalcluster* cluster);
-
-/* manipulate the components in the cluster */
-icalerrorenum icalcluster_add_component(icalcomponent* parent,
- icalcomponent* child);
-
-icalerrorenum icalcluster_remove_component(icalcomponent* parent,
- icalcomponent* child);
-
-int icalcluster_count_components(icalcomponent* component,
- icalcomponent_kind kind);
-
-/* Iterate through components */
-icalcomponent* icalcluster_get_current_component (icalcomponent* component);
-
-icalcomponent* icalcluster_get_first_component(icalcomponent* component,
- icalcomponent_kind kind);
-icalcomponent* icalcluster_get_next_component(icalcomponent* component,
- icalcomponent_kind kind);
-
-#endif /* !ICALCLUSTER_H */
-
-
-
diff --git a/libical/src/libicalss/icalcomponent.h b/libical/src/libicalss/icalcomponent.h
deleted file mode 100644
index 9e0e9f5a9f..0000000000
--- a/libical/src/libicalss/icalcomponent.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalcomponent.h
- CREATOR: eric 20 March 1999
-
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icalcomponent.h
-
-======================================================================*/
-
-#ifndef ICALCOMPONENT_H
-#define ICALCOMPONENT_H
-
-#include "icalproperty.h"
-#include "icalvalue.h"
-#include "icalenums.h" /* defines icalcomponent_kind */
-
-typedef void icalcomponent;
-
-icalcomponent* icalcomponent_new(icalcomponent_kind kind);
-icalcomponent* icalcomponent_new_clone(icalcomponent* component);
-icalcomponent* icalcomponent_new_from_string(char* str);
-icalcomponent* icalcomponent_vanew(icalcomponent_kind kind, ...);
-void icalcomponent_free(icalcomponent* component);
-
-char* icalcomponent_as_ical_string(icalcomponent* component);
-
-int icalcomponent_is_valid(icalcomponent* component);
-
-icalcomponent_kind icalcomponent_isa(icalcomponent* component);
-
-int icalcomponent_isa_component (void* component);
-
-/*
- * Working with properties
- */
-
-void icalcomponent_add_property(icalcomponent* component,
- icalproperty* property);
-
-void icalcomponent_remove_property(icalcomponent* component,
- icalproperty* property);
-
-int icalcomponent_count_properties(icalcomponent* component,
- icalproperty_kind kind);
-
-/* Iterate through the properties */
-icalproperty* icalcomponent_get_current_property(icalcomponent* component);
-
-icalproperty* icalcomponent_get_first_property(icalcomponent* component,
- icalproperty_kind kind);
-icalproperty* icalcomponent_get_next_property(icalcomponent* component,
- icalproperty_kind kind);
-
-/* Return a null-terminated array of icalproperties*/
-
-icalproperty** icalcomponent_get_properties(icalcomponent* component,
- icalproperty_kind kind);
-
-
-/*
- * Working with components
- */
-
-
-void icalcomponent_add_component(icalcomponent* parent,
- icalcomponent* child);
-
-void icalcomponent_remove_component(icalcomponent* parent,
- icalcomponent* child);
-
-int icalcomponent_count_components(icalcomponent* component,
- icalcomponent_kind kind);
-
-/* Iterate through components */
-icalcomponent* icalcomponent_get_current_component (icalcomponent* component);
-
-icalcomponent* icalcomponent_get_first_component(icalcomponent* component,
- icalcomponent_kind kind);
-icalcomponent* icalcomponent_get_next_component(icalcomponent* component,
- icalcomponent_kind kind);
-
-/* Return a null-terminated array of icalproperties*/
-icalproperty** icalcomponent_get_component(icalcomponent* component,
- icalproperty_kind kind);
-
-/* Working with embedded error properties */
-
-int icalcomponent_count_errors(icalcomponent* component);
-void icalcomponent_strip_errors(icalcomponent* component);
-
-
-/* Internal operations. You don't see these... */
-icalcomponent* icalcomponent_get_parent(icalcomponent* component);
-void icalcomponent_set_parent(icalcomponent* component,
- icalcomponent* parent);
-
-#endif /* !ICALCOMPONENT_H */
-
-
-
diff --git a/libical/src/libicalss/icalstore.c b/libical/src/libicalss/icalstore.c
deleted file mode 100644
index 382464e476..0000000000
--- a/libical/src/libicalss/icalstore.c
+++ /dev/null
@@ -1,858 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icalstore.c
- CREATOR: eric 28 November 1999
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is eric. The Initial Developer of the Original
- Code is Eric Busboom
-
-
- ======================================================================*/
-
-
-/*
-
- icalstore manages a database of ical components and offers
- interfaces for reading, writting and searching for components.
-
- icalstore groups components in to clusters based on their DTSTART
- time -- all components that start in the same month are grouped
- together in a single file. All files in a sotre are kept in a single
- directory. ( If a component does not have DTSTART, the store uses
- DTSTAMP or CREATE )
-
- The primary interfaces are icalstore_first and icalstore_next. These
- routine iterate through all of the components in the store, subject
- to the current gauge. A gauge is an icalcomponent that is tested
- against other componets for a match. If a gauge has been set with
- icalstore_select, icalstore_first and icalstore_next will only
- return componentes that match the gauge.
-
- The Store generated UIDs for all objects that are stored if they do
- not already have a UID. The UID is the name of the cluster (month &
- year as MMYYYY) plus a unique serial number. The serial number is
- stored as a property of the cluster.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-
-#include "ical.h"
-#include "icalstore.h"
-#include "pvl.h"
-#include "icalerror.h"
-#include "icalparser.h"
-#include "icalcluster.h"
-
-#include <limits.h>
-#include <dirent.h> /* for opendir() */
-#include <errno.h>
-#include <sys/types.h> /* for opendir() */
-#include <sys/stat.h> /* for stat */
-#include <unistd.h> /* for stat, getpid */
-#include <time.h> /* for clock() */
-#include <stdlib.h> /* for rand(), srand() */
-#include <sys/utsname.h> /* for uname */
-#include <string.h> /* for strdup */
-
-
-struct icalstore_impl
-{
- char* dir;
- icalcomponent* gauge;
- icalcluster* cluster;
- int first_component;
- pvl_list directory;
- pvl_elem directory_iterator;
-};
-
-struct icalstore_impl* icalstore_new_impl()
-{
- struct icalstore_impl* comp;
-
- if ( ( comp = (struct icalstore_impl*)
- malloc(sizeof(struct icalstore_impl))) == 0) {
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
- }
-
- return comp;
-}
-
-void icalstore_lock(char* dir)
-{
-}
-
-
-void icalstore_unlock(char* dir)
-{
-}
-
-/* Load the contents of the store directory into the store's internal directory list*/
-icalerrorenum icalstore_read_directory(struct icalstore_impl* impl)
-{
- struct dirent *de;
- DIR* dp;
- char *str;
-
- dp = opendir(impl->dir);
-
- if ( dp == 0) {
- icalerror_set_errno(ICAL_FILE_ERROR);
- return ICAL_FILE_ERROR;
- }
-
- /* clear contents of directory list */
- while((str = pvl_pop(impl->directory))){
- free(str);
- }
-
- /* load all of the cluster names in the directory list */
- for(de = readdir(dp);
- de != 0;
- de = readdir(dp)){
-
- /* Remove known directory names '.' and '..'*/
- if (strcmp(de->d_name,".") == 0 ||
- strcmp(de->d_name,"..") == 0 ){
- continue;
- }
-
- pvl_push(impl->directory, (void*)strdup(de->d_name));
- }
-
- closedir(dp);
-
- return ICAL_NO_ERROR;
-}
-
-icalstore* icalstore_new(char* dir)
-{
- struct icalstore_impl *impl = icalstore_new_impl();
- struct stat sbuf;
-
- if (impl == 0){
- return 0;
- }
-
- icalerror_check_arg_rz( (dir!=0), "dir");
-
- if (stat(dir,&sbuf) != 0){
- icalerror_set_errno(ICAL_FILE_ERROR);
- return 0;
- }
-
- /* dir is not the name of a direectory*/
- if (!S_ISDIR(sbuf.st_mode)){
- icalerror_set_errno(ICAL_USAGE_ERROR);
- return 0;
- }
-
- icalstore_lock(dir);
-
- impl = icalstore_new_impl();
-
- if (impl ==0){
- icalerror_set_errno(ICAL_ALLOCATION_ERROR);
- return 0;
- }
-
- impl->directory = pvl_newlist();
- impl->directory_iterator = 0;
- impl->dir = (char*)strdup(dir);
- impl->gauge = 0;
- impl->first_component = 0;
- impl->cluster = 0;
-
- icalstore_read_directory(impl);
-
- return (icalstore*) impl;
-}
-
-void icalstore_free(icalstore* s)
-{
- struct icalstore_impl *impl = (struct icalstore_impl*)s;
- char* str;
-
- icalstore_unlock(impl->dir);
-
- if(impl->dir !=0){
- free(impl->dir);
- }
-
- if(impl->gauge !=0){
- icalcomponent_free(impl->gauge);
- }
-
- if(impl->cluster !=0){
- icalcluster_free(impl->cluster);
- }
-
- while(impl->directory !=0 && (str=pvl_pop(impl->directory)) != 0){
- free(str);
- }
-
- if(impl->directory != 0){
- pvl_free(impl->directory);
- }
-
- impl->directory = 0;
- impl->directory_iterator = 0;
- impl->dir = 0;
- impl->gauge = 0;
- impl->first_component = 0;
-
- free(impl);
-
-}
-
-/* icalstore_next_uid_number updates a serial number in the Store
- directory in a file called SEQUENCE */
-
-int icalstore_next_uid_number(icalstore* store)
-{
- struct icalstore_impl *impl = (struct icalstore_impl*)store;
- char sequence = 0;
- char temp[128];
- char filename[PATH_MAX];
- char *r;
- FILE *f;
- struct stat sbuf;
-
- icalerror_check_arg_rz( (store!=0), "store");
-
- sprintf(filename,"%s/%s",impl->dir,"SEQUENCE");
-
- /* Create the file if it does not exist.*/
- if (stat(filename,&sbuf) == -1 || !S_ISREG(sbuf.st_mode)){
-
- f = fopen(filename,"w");
- if (f != 0){
- fprintf(f,"0");
- fclose(f);
- } else {
- icalerror_warn("Can't create SEQUENCE file in icalstore_next_uid_number");
- return 0;
- }
-
- }
-
- if ( (f = fopen(filename,"r+")) != 0){
-
- rewind(f);
- r = fgets(temp,128,f);
-
- if (r == 0){
- sequence = 1;
- } else {
- sequence = atoi(temp)+1;
- }
-
- rewind(f);
-
- fprintf(f,"%d",sequence);
-
- fclose(f);
-
- return sequence;
-
- } else {
- icalerror_warn("Can't create SEQUENCE file in icalstore_next_uid_number");
- return 0;
- }
-
-}
-
-icalerrorenum icalstore_next_cluster(icalstore* store)
-{
- struct icalstore_impl *impl = (struct icalstore_impl*)store;
- char path[PATH_MAX];
-
- if (impl->directory_iterator == 0){
- icalerror_set_errno(ICAL_INTERNAL_ERROR);
- return ICAL_INTERNAL_ERROR;
- }
- impl->directory_iterator = pvl_next(impl->directory_iterator);
-
- if (impl->directory_iterator == 0){
- /* There are no more clusters */
- impl->cluster = 0;
- return ICAL_NO_ERROR;
- }
-
- sprintf(path,"%s/%s",impl->dir,(char*)pvl_data(impl->directory_iterator));
-
- icalcluster_free(impl->cluster);
-
- impl->cluster = icalcluster_new(path);
-
- return icalerrno;
-}
-
-void icalstore_add_uid(icalstore* store, icalstore* comp)
-{
- char uidstring[PATH_MAX];
- icalproperty *uid;
- struct utsname unamebuf;
-
- icalerror_check_arg_rv( (store!=0), "store");
- icalerror_check_arg_rv( (comp!=0), "comp");
-
- uid = icalcomponent_get_first_property(comp,ICAL_UID_PROPERTY);
-
- if (uid == 0) {
-
- uname(&unamebuf);
-
- sprintf(uidstring,"%d-%s",(int)getpid(),unamebuf.nodename);
-
- uid = icalproperty_new_uid(uidstring);
- icalcomponent_add_property(comp,uid);
- } else {
-
- strcpy(uidstring,icalproperty_get_uid(uid));
- }
-}
-
-
-/* This assumes that the top level component is a VCALENDAR, and there
- is an inner component of type VEVENT, VTODO or VJOURNAL. The inner
- component must have a DTSTART property */
-
-icalerrorenum icalstore_add_component(icalstore* store, icalstore* comp)
-{
- struct icalstore_impl *impl;
- char clustername[PATH_MAX];
- icalproperty *dt, *count;
- icalvalue *v;
- struct icaltimetype tm;
- icalerrorenum error = ICAL_NO_ERROR;
- icalcomponent *inner;
-
- impl = (struct icalstore_impl*)store;
- icalerror_check_arg_rz( (store!=0), "store");
- icalerror_check_arg_rz( (comp!=0), "comp");
-
- errno = 0;
-
- icalstore_add_uid(store,comp);
-
- /* Determine which cluster this object belongs in. This is a HACK */
-
- for(inner = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
- inner != 0;
- inner = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)){
-
- dt = icalcomponent_get_first_property(inner,ICAL_DTSTART_PROPERTY);
-
- if (dt != 0){
- break;
- }
- }
-
- if (dt == 0){
- icalerror_warn("The component does not have a DTSTART property, so it cannot be added to the store");
- icalerror_set_errno(ICAL_BADARG_ERROR);
- return ICAL_BADARG_ERROR;
- }
-
- v = icalproperty_get_value(dt);
-
- tm = icalvalue_get_datetime(v);
-
- snprintf(clustername,PATH_MAX,"%s/%04d%02d",impl->dir,tm.year,tm.month);
-
- /* Load the cluster and insert the object */
-
- if(impl->cluster != 0 &&
- strcmp(clustername,icalcluster_path(impl->cluster)) != 0 ){
- icalcluster_free(impl->cluster);
- impl->cluster = 0;
- }
-
- if (impl->cluster == 0){
- impl->cluster = icalcluster_new(clustername);
-
- if (impl->cluster == 0){
- error = icalerrno;
- }
- }
-
- if (error != ICAL_NO_ERROR){
- icalerror_set_errno(error);
- return error;
- }
-
- /* Add the component to the cluster */
-
- icalcluster_add_component(impl->cluster,comp);
-
-
- /* Increment the clusters count value */
- count = icalcomponent_get_first_property(
- icalcluster_get_component(impl->cluster),
- ICAL_XLICCLUSTERCOUNT_PROPERTY);
-
- if (count == 0){
- icalerror_set_errno(ICAL_INTERNAL_ERROR);
- return ICAL_INTERNAL_ERROR;
- }
-
- icalproperty_set_xlicclustercount(count,
- icalproperty_get_xlicclustercount(count)+1);
-
-
- icalcluster_mark(impl->cluster);
-
- return ICAL_NO_ERROR;
-}
-
-/* Remove a component in the current cluster */
-icalerrorenum icalstore_remove_component(icalstore* store, icalstore* comp)
-{
- struct icalstore_impl *impl = (struct icalstore_impl*)store;
- icalproperty *count;
-
- icalerror_check_arg_re((store!=0),"store",ICAL_BADARG_ERROR);
- icalerror_check_arg_re((comp!=0),"comp",ICAL_BADARG_ERROR);
- icalerror_check_arg_re((impl->cluster!=0),"Cluster pointer",ICAL_USAGE_ERROR);
-
-/* HACK The following code should be used to ensure that the component
- the caller is trying to remove is actually in the cluster, but it
- resets the internal iterators, which immediately ends any loops over
- the cluster the caller may have in progress
-
- for(c = icalcluster_get_first_component(
- impl->cluster,
- ICAL_ANY_COMPONENT);
- c != 0;
- c = icalcluster_get_next_component(
- impl->cluster,
- ICAL_ANY_COMPONENT)){
-
- if (c == comp){
- found = 1;
- }
-
- }
-
- if (found != 1){
- icalerror_warn("icalstore_remove_component: component is not part of current cluster");
- icalerror_set_errno(ICAL_USAGE_ERROR);
- return ICAL_USAGE_ERROR;
- }
-
-*/
-
- icalcluster_remove_component(impl->cluster,
- comp);
-
- icalcluster_mark(impl->cluster);
-
- /* Decrement the clusters count value */
- count = icalcomponent_get_first_property(
- icalcluster_get_component(impl->cluster),
- ICAL_XLICCLUSTERCOUNT_PROPERTY);
-
- if (count == 0){
- icalerror_set_errno(ICAL_INTERNAL_ERROR);
- return ICAL_INTERNAL_ERROR;
- }
-
- icalproperty_set_xlicclustercount(count,
- icalproperty_get_xlicclustercount(count)-1);
-
- return ICAL_NO_ERROR;
-}
-
-/* Convert a VQUERY component into a gauge */
-icalcomponent* icalstore_make_gauge(icalcomponent* query);
-
-/* icalstore_test compares a component against a gauge, and returns
- true if the component passes the test
-
- The gauge is a VCALENDAR component that specifies how to test the
- target components. The guage holds a collection of VEVENT, VTODO or
- VJOURNAL sub-components. Each of the sub-components has a
- collection of properties that are compared to corresponding
- properties in the target component, according to the
- X-LIC-COMPARETYPE parameters to the gauge's properties.
-
- When a gauge has several sub-components, the results of testing the
- target against each of them is ORed together - the target
- component will pass if it matches any of the sub-components in the
- gauge. However, the results of matching the proeprties in a
- sub-component are ANDed -- the target must match every property in
- a gauge sub-component to match the sub-component.
-
- Here is an example:
-
- BEGIN:XROOT
- BEGIN:VCOMPONENT
- BEGIN:VEVENT
- DTSTART;X-LIC-COMPARETYPE=LESS:19981025T020000
- ORGANIZER;X-LIC-COMPARETYPE=EQUAL:mrbig@host.com
- END:VEVENT
- BEGIN:VEVENT
- LOCATION;X-LIC-COMPARETYPE=EQUAL:McNary's Pub
- END:VEVENT
- END:VCALENDAR
- END:XROOT
-
- This gauge has two sub-components; one which will match a VEVENT
- based on start time, and organizer, and another that matches based
- on LOCATION. A target component will pass the test if it matched
- either of the sub-components.
-
- */
-
-
-int icalstore_test_recurse(icalcomponent* comp, icalcomponent* gauge)
-{
- int pass = 1,localpass = 0;
- icalproperty *p;
- icalcomponent *child,*subgauge;
- icalcomponent_kind gaugekind, compkind;
-
- icalerror_check_arg_rz( (comp!=0), "comp");
- icalerror_check_arg_rz( (gauge!=0), "gauge");
-
- gaugekind = icalcomponent_isa(gauge);
- compkind = icalcomponent_isa(comp);
-
- if( ! (gaugekind == compkind || gaugekind == ICAL_ANY_COMPONENT) ){
- return 0;
- }
-
- /* Test properties. For each property in the gauge, search through
- the component for a similar property. If one is found, compare
- the two properties value with the comparison specified in the
- gauge with the X-LIC-COMPARETYPE parameter */
-
- for(p = icalcomponent_get_first_property(gauge,ICAL_ANY_PROPERTY);
- p != 0;
- p = icalcomponent_get_next_property(gauge,ICAL_ANY_PROPERTY)){
-
- icalproperty* targetprop;
- icalparameter* compareparam;
- icalparameter_xliccomparetype compare;
- int rel; /* The relationship between the gauge and target values.*/
-
- /* Extract the comparison type from the gauge. If there is no
- comparison type, assume that it is "EQUAL" */
-
- compareparam = icalproperty_get_first_parameter(
- p,
- ICAL_XLICCOMPARETYPE_PARAMETER);
-
- if (compareparam!=0){
- compare = icalparameter_get_xliccomparetype(compareparam);
- } else {
- compare = ICAL_XLICCOMPARETYPE_EQUAL;
- }
-
- /* Find a property in the component that has the same type
- as the gauge property. HACK -- multiples of a single
- property type in the gauge will match only the first
- instance in the component */
-
- targetprop = icalcomponent_get_first_property(comp,
- icalproperty_isa(p));
-
- if(targetprop != 0){
-
- /* Compare the values of the gauge property and the target
- property */
-
- rel = icalvalue_compare(icalproperty_get_value(p),
- icalproperty_get_value(targetprop));
-
- /* Now see if the comparison is equavalent to the comparison
- specified in the gauge */
-
- if (rel == compare){
- localpass++;
- } else if (compare == ICAL_XLICCOMPARETYPE_LESSEQUAL &&
- ( rel == ICAL_XLICCOMPARETYPE_LESS ||
- rel == ICAL_XLICCOMPARETYPE_EQUAL)) {
- localpass++;
- } else if (compare == ICAL_XLICCOMPARETYPE_GREATEREQUAL &&
- ( rel == ICAL_XLICCOMPARETYPE_GREATER ||
- rel == ICAL_XLICCOMPARETYPE_EQUAL)) {
- localpass++;
- } else if (compare == ICAL_XLICCOMPARETYPE_NOTEQUAL &&
- ( rel == ICAL_XLICCOMPARETYPE_GREATER ||
- rel == ICAL_XLICCOMPARETYPE_LESS)) {
- localpass++;
- } else {
- localpass = 0;
- }
-
- pass = pass && (localpass>0);
- }
- }
-
- /* Test subcomponents. Look for a child component that has a
- counterpart in the gauge. If one is found, recursively call
- icalstore_test */
-
- for(subgauge = icalcomponent_get_first_component(gauge,ICAL_ANY_COMPONENT);
- subgauge != 0;
- subgauge = icalcomponent_get_next_component(gauge,ICAL_ANY_COMPONENT)){
-
- gaugekind = icalcomponent_isa(subgauge);
-
- if (gaugekind == ICAL_ANY_COMPONENT){
- child = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
- } else {
- child = icalcomponent_get_first_component(comp,gaugekind);
- }
-
- if(child !=0){
- localpass = icalstore_test_recurse(child,subgauge);
- pass = pass && localpass;
- } else {
- pass = 0;
- }
- }
-
- return pass;
-}
-
-/* guagecontainer is an XROOT component that holds several gauges. The
- results of comparing against these gauges are ORed together in this
- routine */
-int icalstore_test(icalcomponent* comp, icalcomponent* gaugecontainer)
-{
- int pass = 0;
- icalcomponent *gauge;
-
- icalerror_check_arg_rz( (comp!=0), "comp");
- icalerror_check_arg_rz( (gauge!=0), "gauge");
-
- for(gauge = icalcomponent_get_first_component(gaugecontainer,ICAL_ANY_COMPONENT);
- gauge != 0;
- gauge = icalcomponent_get_next_component(gaugecontainer,ICAL_ANY_COMPONENT)){
-
- pass += icalstore_test_recurse(comp, gauge);
- }
-
- return pass>0;
-
-}
-
-icalcomponent* icalstore_query(icalstore* store, icalstore* query);
-
-
-icalcomponent* icalstore_fetch(icalstore* store, char* uid)
-{
- icalcomponent *gauge;
- icalcomponent *old_gauge;
- icalcomponent *c;
- struct icalstore_impl *impl = (struct icalstore_impl*)store;
-
- icalerror_check_arg_rz( (store!=0), "store");
- icalerror_check_arg_rz( (uid!=0), "uid");
-
- gauge =
- icalcomponent_vanew(
- ICAL_VCALENDAR_COMPONENT,
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_uid(
- uid,
- icalparameter_new_xliccomparetype(
- ICAL_XLICCOMPARETYPE_EQUAL),
- 0),
- 0),
- 0);
-
- old_gauge = impl->gauge;
- impl->gauge = gauge;
-
- c= icalstore_get_first_component(store);
-
- impl->gauge = old_gauge;
-
- icalcomponent_free(gauge);
-
- return c;
-}
-
-
-int icalstore_has_uid(icalstore* store, char* uid)
-{
- icalcomponent *c;
-
- icalerror_check_arg_rz( (store!=0), "store");
- icalerror_check_arg_rz( (uid!=0), "uid");
-
- /* HACK. This is a temporary implementation. _has_uid should use a
- database, and _fetch should use _has_uid, not the other way
- around */
- c = icalstore_fetch(store,uid);
-
- return c!=0;
-
-}
-
-
-icalerrorenum icalstore_select(icalstore* store, icalcomponent* gauge)
-{
- struct icalstore_impl *impl = (struct icalstore_impl*)store;
-
- icalerror_check_arg_re( (store!=0), "store",ICAL_BADARG_ERROR);
- icalerror_check_arg_re( (gauge!=0), "gauge",ICAL_BADARG_ERROR);
-
- if (!icalcomponent_is_valid(gauge)){
- return ICAL_BADARG_ERROR;
- }
-
- impl->gauge = gauge;
-
- return ICAL_NO_ERROR;
-}
-
-
-
-icalcomponent* icalstore_get_first_component(icalstore* store)
-{
- struct icalstore_impl *impl = (struct icalstore_impl*)store;
- icalerrorenum error;
- char path[PATH_MAX];
-
- error = icalstore_read_directory(impl);
-
- if (error != ICAL_NO_ERROR){
- icalerror_set_errno(error);
- return 0;
- }
-
- impl->directory_iterator = pvl_head(impl->directory);
-
- if (impl->directory_iterator == 0){
- icalerror_set_errno(error);
- return 0;
- }
-
- sprintf(path,"%s/%s",impl->dir,(char*)pvl_data(impl->directory_iterator));
-
- /* If the next cluster we need is different than the current cluster,
- delete the current one and get a new one */
-
- if(impl->cluster != 0 && strcmp(path,icalcluster_path(impl->cluster)) != 0 ){
- icalcluster_free(impl->cluster);
- impl->cluster = 0;
- }
-
- if (impl->cluster == 0){
- impl->cluster = icalcluster_new(path);
-
- if (impl->cluster == 0){
- error = icalerrno;
- }
- }
-
- if (error != ICAL_NO_ERROR){
- icalerror_set_errno(error);
- return 0;
- }
-
- impl->first_component = 1;
-
- return icalstore_get_next_component(store);
-}
-
-icalcomponent* icalstore_get_next_component(icalstore* store)
-{
- struct icalstore_impl *impl;
- icalcomponent *c;
- icalerrorenum error;
-
- icalerror_check_arg_rz( (store!=0), "store");
-
- impl = (struct icalstore_impl*)store;
-
- if(impl->cluster == 0){
-
- icalerror_warn("icalstore_get_next_component called with a NULL cluster (Caller must call icalstore_get_first_component first");
- icalerror_set_errno(ICAL_USAGE_ERROR);
- return 0;
-
- }
-
- /* Set the component iterator for the following for loop */
- if (impl->first_component == 1){
- icalcluster_get_first_component(
- impl->cluster,
- ICAL_ANY_COMPONENT);
- impl->first_component = 0;
- } else {
- icalcluster_get_next_component(
- impl->cluster,
- ICAL_ANY_COMPONENT);
- }
-
-
- while(1){
- /* Iterate through all of the objects in the cluster*/
- for( c = icalcluster_get_current_component(
- impl->cluster);
- c != 0;
- c = icalcluster_get_next_component(
- impl->cluster,
- ICAL_ANY_COMPONENT)){
-
- /* If there is a gauge defined and the component does not
- pass the gauge, skip the rest of the loop */
- if (impl->gauge != 0 && icalstore_test(c,impl->gauge) == 0){
- continue;
- }
-
- /* Either there is no gauge, or the component passed the
- gauge, so return it*/
-
- return c;
- }
-
- /* Fell through the loop, so the component we want is not
- in this cluster. Load a new cluster and try again.*/
-
- error = icalstore_next_cluster(store);
-
- if(impl->cluster == 0 || error != ICAL_NO_ERROR){
- /* No more clusters */
- return 0;
- } else {
- c = icalcluster_get_first_component(
- impl->cluster,
- ICAL_ANY_COMPONENT);
- }
- }
-}
-
-
-
-
-
-
-
diff --git a/libical/src/libicalss/icalstore.h b/libical/src/libicalss/icalstore.h
deleted file mode 100644
index 13e0a182b5..0000000000
--- a/libical/src/libicalss/icalstore.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -*- Mode: C -*- */
-/*======================================================================
- FILE: icalstore.h
- CREATOR: eric 28 November 1999
-
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is eric. The Initial Developer of the Original
- Code is Eric Busboom
-
-
-======================================================================*/
-
-#ifndef ICALSTORE_H
-#define ICALSTORE_H
-
-#include "ical.h"
-#include "icalerror.h"
-typedef void icalstore;
-
-/* icalstore Routines for storing, fetching, and searching for ical
- * objects in a database */
-
-icalstore* icalstore_new(char* dir);
-
-void icalstore_free(icalstore* store);
-
-/* Add a new component to the store */
-icalerrorenum icalstore_add_component(icalstore* store, icalstore* comp);
-
-/* Remove a component from the store */
-icalerrorenum icalstore_remove_component(icalstore* store, icalstore* comp);
-
-/* Restrict the component returned by icalstore_first, _next to those
- that pass the gauge */
-icalerrorenum icalstore_select(icalstore* store, icalcomponent* gauge);
-
-/* Return true if a component passes the gauge */
-int icalstore_test(icalcomponent* comp, icalcomponent* gauge);
-
-/* Clear the restrictions set by icalstore_select */
-void icalstore_clear(icalstore* store);
-
-/* Get a single component by uid */
-icalcomponent* icalstore_fetch(icalstore* store, char* uid);
-
-/* Return true of the store has an object with the given UID */
-int icalstore_has_uid(icalstore* store, char* uid);
-
-/* Return the first component in the store, or first that passes the gauge.*/
-icalcomponent* icalstore_get_first_component(icalstore* store);
-
-/* Return the next component in the store, or next that passes the gauge.*/
-icalcomponent* icalstore_get_next_component(icalstore* store);
-
-
-int icalstore_next_uid_number(icalstore* store);
-
-
-#endif /* !ICALSTORE_H */
-
-
-
diff --git a/libical/src/pvl/Makefile b/libical/src/pvl/Makefile
deleted file mode 100644
index e69de29bb2..0000000000
--- a/libical/src/pvl/Makefile
+++ /dev/null
diff --git a/libical/src/test/.cvsignore b/libical/src/test/.cvsignore
deleted file mode 100644
index 75f6fc03a2..0000000000
--- a/libical/src/test/.cvsignore
+++ /dev/null
@@ -1,12 +0,0 @@
-Makefile
-usecases
-copycluster
-regression
-icalparser
-findobj
-.deps
-.libs
-parser
-storage
-Makefile.in
-stow \ No newline at end of file
diff --git a/libical/src/test/Makefile.am b/libical/src/test/Makefile.am
deleted file mode 100644
index 81ffff8c39..0000000000
--- a/libical/src/test/Makefile.am
+++ /dev/null
@@ -1,19 +0,0 @@
-
-noinst_PROGRAMS = usecases copycluster regression parser findobj storage stow
-
-LDADD = ../libical/libical.a ../libicalss/libicalss.a
-INCLUDES = \
- -I . \
- -I $(srcdir) \
- -I../libical \
- -I $(srcdir)/../libical \
- -I../libicalss \
- -I $(srcdir)/../libicalss
-
-findobj_SOURCES = findobj.c
-usecases_SOURCES = usecases.c
-copycluster_SOURCES = copycluster.c
-regression_SOURCES = regression.c
-parser_SOURCES = icaltestparser.c
-storage_SOURCES = storage.c
-stow_SOURCES = stow.c \ No newline at end of file
diff --git a/libical/src/test/Makefile.in b/libical/src/test/Makefile.in
deleted file mode 100644
index 8a7cf257c3..0000000000
--- a/libical/src/test/Makefile.in
+++ /dev/null
@@ -1,385 +0,0 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
-
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-
-top_builddir = ../..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-AR = @AR@
-AS = @AS@
-CC = @CC@
-DLLTOOL = @DLLTOOL@
-LEX = @LEX@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-MAKEINFO = @MAKEINFO@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-VERSION = @VERSION@
-YACC = @YACC@
-
-noinst_PROGRAMS = usecases copycluster regression parser findobj storage stow
-
-LDADD = ../libical/libical.a ../libicalss/libicalss.a
-INCLUDES = -I . -I $(srcdir) -I../libical -I $(srcdir)/../libical -I../libicalss -I $(srcdir)/../libicalss
-
-
-findobj_SOURCES = findobj.c
-usecases_SOURCES = usecases.c
-copycluster_SOURCES = copycluster.c
-regression_SOURCES = regression.c
-parser_SOURCES = icaltestparser.c
-storage_SOURCES = storage.c
-stow_SOURCES = stow.c
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I../..
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-usecases_OBJECTS = usecases.o
-usecases_LDADD = $(LDADD)
-usecases_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a
-usecases_LDFLAGS =
-copycluster_OBJECTS = copycluster.o
-copycluster_LDADD = $(LDADD)
-copycluster_DEPENDENCIES = ../libical/libical.a \
-../libicalss/libicalss.a
-copycluster_LDFLAGS =
-regression_OBJECTS = regression.o
-regression_LDADD = $(LDADD)
-regression_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a
-regression_LDFLAGS =
-parser_OBJECTS = icaltestparser.o
-parser_LDADD = $(LDADD)
-parser_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a
-parser_LDFLAGS =
-findobj_OBJECTS = findobj.o
-findobj_LDADD = $(LDADD)
-findobj_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a
-findobj_LDFLAGS =
-storage_OBJECTS = storage.o
-storage_LDADD = $(LDADD)
-storage_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a
-storage_LDFLAGS =
-stow_OBJECTS = stow.o
-stow_LDADD = $(LDADD)
-stow_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a
-stow_LDFLAGS =
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DIST_COMMON = Makefile.am Makefile.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = gtar
-GZIP_ENV = --best
-DEP_FILES = .deps/copycluster.P .deps/findobj.P .deps/icaltestparser.P \
-.deps/regression.P .deps/storage.P .deps/stow.P .deps/usecases.P
-SOURCES = $(usecases_SOURCES) $(copycluster_SOURCES) $(regression_SOURCES) $(parser_SOURCES) $(findobj_SOURCES) $(storage_SOURCES) $(stow_SOURCES)
-OBJECTS = $(usecases_OBJECTS) $(copycluster_OBJECTS) $(regression_OBJECTS) $(parser_OBJECTS) $(findobj_OBJECTS) $(storage_OBJECTS) $(stow_OBJECTS)
-
-all: all-redirect
-.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .s
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu src/test/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-
-mostlyclean-noinstPROGRAMS:
-
-clean-noinstPROGRAMS:
- -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-
-distclean-noinstPROGRAMS:
-
-maintainer-clean-noinstPROGRAMS:
-
-.s.o:
- $(COMPILE) -c $<
-
-.S.o:
- $(COMPILE) -c $<
-
-mostlyclean-compile:
- -rm -f *.o core *.core
-
-clean-compile:
-
-distclean-compile:
- -rm -f *.tab.c
-
-maintainer-clean-compile:
-
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
-
-maintainer-clean-libtool:
-
-usecases: $(usecases_OBJECTS) $(usecases_DEPENDENCIES)
- @rm -f usecases
- $(LINK) $(usecases_LDFLAGS) $(usecases_OBJECTS) $(usecases_LDADD) $(LIBS)
-
-copycluster: $(copycluster_OBJECTS) $(copycluster_DEPENDENCIES)
- @rm -f copycluster
- $(LINK) $(copycluster_LDFLAGS) $(copycluster_OBJECTS) $(copycluster_LDADD) $(LIBS)
-
-regression: $(regression_OBJECTS) $(regression_DEPENDENCIES)
- @rm -f regression
- $(LINK) $(regression_LDFLAGS) $(regression_OBJECTS) $(regression_LDADD) $(LIBS)
-
-parser: $(parser_OBJECTS) $(parser_DEPENDENCIES)
- @rm -f parser
- $(LINK) $(parser_LDFLAGS) $(parser_OBJECTS) $(parser_LDADD) $(LIBS)
-
-findobj: $(findobj_OBJECTS) $(findobj_DEPENDENCIES)
- @rm -f findobj
- $(LINK) $(findobj_LDFLAGS) $(findobj_OBJECTS) $(findobj_LDADD) $(LIBS)
-
-storage: $(storage_OBJECTS) $(storage_DEPENDENCIES)
- @rm -f storage
- $(LINK) $(storage_LDFLAGS) $(storage_OBJECTS) $(storage_LDADD) $(LIBS)
-
-stow: $(stow_OBJECTS) $(stow_DEPENDENCIES)
- @rm -f stow
- $(LINK) $(stow_LDFLAGS) $(stow_OBJECTS) $(stow_LDADD) $(LIBS)
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
-
-clean-tags:
-
-distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src/test
-
-distdir: $(DISTFILES)
- here=`cd $(top_builddir) && pwd`; \
- top_distdir=`cd $(top_distdir) && pwd`; \
- distdir=`cd $(distdir) && pwd`; \
- cd $(top_srcdir) \
- && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu src/test/Makefile
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
- if test -d $$d/$$file; then \
- cp -pr $$d/$$file $(distdir)/$$file; \
- else \
- test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
- fi; \
- done
-
-DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
-
--include $(DEP_FILES)
-
-mostlyclean-depend:
-
-clean-depend:
-
-distclean-depend:
- -rm -rf .deps
-
-maintainer-clean-depend:
-
-%.o: %.c
- @echo '$(COMPILE) -c $<'; \
- $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
- @-cp .deps/$(*F).pp .deps/$(*F).P; \
- tr ' ' '\012' < .deps/$(*F).pp \
- | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
- >> .deps/$(*F).P; \
- rm .deps/$(*F).pp
-
-%.lo: %.c
- @echo '$(LTCOMPILE) -c $<'; \
- $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
- @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
- < .deps/$(*F).pp > .deps/$(*F).P; \
- tr ' ' '\012' < .deps/$(*F).pp \
- | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
- >> .deps/$(*F).P; \
- rm -f .deps/$(*F).pp
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
-check-am: all-am
-check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am:
-install-exec: install-exec-am
-
-install-data-am:
-install-data: install-data-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am:
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS)
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
-
-
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
-
-maintainer-clean-generic:
-mostlyclean-am: mostlyclean-noinstPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
- mostlyclean-generic
-
-mostlyclean: mostlyclean-am
-
-clean-am: clean-noinstPROGRAMS clean-compile clean-libtool clean-tags \
- clean-depend clean-generic mostlyclean-am
-
-clean: clean-am
-
-distclean-am: distclean-noinstPROGRAMS distclean-compile \
- distclean-libtool distclean-tags distclean-depend \
- distclean-generic clean-am
- -rm -f libtool
-
-distclean: distclean-am
-
-maintainer-clean-am: maintainer-clean-noinstPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-depend \
- maintainer-clean-generic distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-am
-
-.PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
-clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir \
-mostlyclean-depend distclean-depend clean-depend \
-maintainer-clean-depend info-am info dvi-am dvi check check-am \
-installcheck-am installcheck install-exec-am install-exec \
-install-data-am install-data install-am install uninstall-am uninstall \
-all-redirect all-am all installdirs mostlyclean-generic \
-distclean-generic clean-generic maintainer-clean-generic clean \
-mostlyclean distclean maintainer-clean
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libical/src/test/alice/booked/199706 b/libical/src/test/alice/booked/199706
deleted file mode 100644
index 8ad5c7d8b1..0000000000
--- a/libical/src/test/alice/booked/199706
+++ /dev/null
@@ -1,317 +0,0 @@
-BEGIN:VCALENDAR
-X-LIC-CLUSTERCOUNT
- :13
-DTSTART
- :00000000T000000
-DTEND
- :00000000T000000
-BEGIN:VEVENT
-ORGANIZER
- :mailto:a@example.com
-COMMENT
- :DUKES forfeit the game
-SEQUENCE
- :2
-UID
- :0981234-1234234-23@example.com
-DTSTAMP
- :19970613T190000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ATTENDEE
- ;PARTSTAT=ACCEPTED
- :Mailto:B@example.com
-ORGANIZER
- :MAILTO:A@example.com
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-REQUEST-STATUS
- :2.0\;Success
-DTSTAMP
- :19970612T190000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-COMMENT
- :Sorry
-COMMENT
- : I cannot change this meeting time
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-DTSTAMP
- :19970614T190000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :MAILTO:A@Example.com
-ATTENDEE
- ;PARTSTAT=DELEGATED
- ;DELEGATED-TO="Mailto:E@example.com"
- :Mailto:C@example.com
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-REQUEST-STATUS
- :2.0\;Success
-DTSTAMP
- :19970611T190000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :MAILTO:A@Example.com
-ATTENDEE
- ;PARTSTAT=ACCEPTED
- ;DELEGATED-FROM="Mailto:C@example.com"
- :Mailto:E@example.com
-ATTENDEE
- ;PARTSTAT=DELEGATED
- ;DELEGATED-TO="Mailto:E@example.com"
- :Mailto:C@example.com
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-REQUEST-STATUS
- :2.0\;Success
-DTSTAMP
- :19970614T190000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :MAILTO:A@Example.com
-ATTENDEE
- ;PARTSTAT=DELEGATED
- ;DELEGATED-TO="Mailto:E@example.com"
- :Mailto:C@example.com
-ATTENDEE
- ;PARTSTAT=DECLINED
- ;DELEGATED-FROM="Mailto:C@example.com"
- :Mailto:E@example.com
-COMMENT
- :Sorry
-COMMENT
- : I will be out of town at that time.
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-REQUEST-STATUS
- :2.0\;Success
-DTSTAMP
- :19970614T190000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- :A@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'Mailto'
-ATTENDEE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-COMMENT
- :Mr. B cannot attend. It's raining. Lets cancel.
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :1
-STATUS
- :CANCELLED
-DTSTAMP
- :19970613T190000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- :mailto:B@example.com
-COMMENT
- :You're off the hook for this meeting
-UID
- :calsrv.example.com-873970198738777@example.com
-DTSTAMP
- :19970613T193000Z
-SEQUENCE
- :1
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-SEQUENCE
- :0
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=MONTHLY\;BYMONTHDAY=1\;UNTIL=19980901T210000Z'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-ATTENDEE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970601T210000Z
-DTEND
- :19970601T220000Z
-LOCATION
- :Conference Call
-DTSTAMP
- :19970526T083000Z
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-SEQUENCE
- :0
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=MONTHLY\;BYMONTHDAY=1'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970601T210000Z
-DTEND
- :19970601T220000Z
-DTSTAMP
- :19970602T094000Z
-LOCATION
- :Conference Call
-STATUS
- :CONFIRMED
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PROPERTY_PARSE_ERROR
- :Parse error in property name: 'FOO'
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-REQUEST-STATUS
- :2.8\;Repeating event ignored. Scheduled as a single event\;RRULE
-REQUEST-STATUS
- :3.0\;Invalid Property Name\;FOO
-UID
- :guid-1@host1.com
-SEQUENCE
- :0
-DTSTAMP
- :19970603T094000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-ATTENDEE
- :Mailto:D@example.com
-UID
- : guid-1-12345@host1.com
-DTSTAMP
- :19970603T094000
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-UID
- :acme-12345@host1.com
-DTSTAMP
- :19970603T094000
-LAST-MODIFIED
- :20000209T060028Z
-END:VEVENT
-END:VCALENDAR
diff --git a/libical/src/test/alice/booked/199707 b/libical/src/test/alice/booked/199707
deleted file mode 100644
index c52d27aa91..0000000000
--- a/libical/src/test/alice/booked/199707
+++ /dev/null
@@ -1,701 +0,0 @@
-BEGIN:VCALENDAR
-X-LIC-CLUSTERCOUNT
- :19
-DTSTART
- :00000000T000000
-DTEND
- :00000000T000000
-BEGIN:VEVENT
-ORGANIZER
- :mailto:a@example.com
-DTSTART
- :19970701T200000Z
-DTSTAMP
- :19970611T190000Z
-SUMMARY
- :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-UID
- :0981234-1234234-23@example.com
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :mailto:a@example.com
-DTSTAMP
- :19970612T190000Z
-DTSTART
- :19970701T210000Z
-DTEND
- :19970701T230000Z
-SEQUENCE
- :1
-UID
- :0981234-1234234-23@example.com
-SUMMARY
- :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :mailto:a@example.com
-ATTACH
- :http://www.dukes.com/
-CATEGORIES
- :SPORTS EVENT
-CATEGORIES
- :ENTERTAINMENT
-CLASS
- :PRIVATE
-DESCRIPTION
- :MIDWAY STADIUM\nBig time game. MUST see.\nExpected duration:2 hours\n
-DTEND
- ;TZID=America-Chicago
- :19970701T180000
-DTSTART
- ;TZID=America-Chicago
- :19970702T160000
-DTSTAMP
- :19970614T190000Z
-STATUS
- :CONFIRMED
-LOCATION
- :http://www.midwaystadium.com/
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter value: 'VALUE=America-Chicago'
-PRIORITY
- :2
-RESOURCES
- :SCOREBOARD
-SEQUENCE
- :3
-SUMMARY
- :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-UID
- :0981234-1234234-23@example.com
-RELATED-TO
- :0981234-1234234-14@example.com
-LAST-MODIFIED
- :20000209T060027Z
-BEGIN:VALARM
-TRIGGER
- :PT2H
-ACTION
- :DISPLAY
-DESCRIPTION
- :You should be leaving for the game now.
-END:VALARM
-BEGIN:VALARM
-TRIGGER
- :PT30M
-ACTION
- :AUDIO
-END:VALARM
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :mailto:a@example.com
-DTSTAMP
- :19970614T190000Z
-UID
- :0981234-1234234-23@example.com
-DTSTART
- ;VALUE=DATE
- :19970714
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=YEARLY\;INTERVAL=1'
-SUMMARY
- : Bastille Day
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- ;CN=BIG A
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- ;CN=B
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- ;CN=C
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- ;CN=Hal
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=FALSE
- :conf_Big@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=ROOM'
-ATTENDEE
- ;ROLE=NON-PARTICIPANT
- ;RSVP=FALSE
- :Mailto:E@example.com
-DTSTAMP
- :19970611T190000Z
-DTSTART
- :19970701T200000Z
-DTEND
- :19970701T200000Z
-SUMMARY
- :Conference
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- ;CN=Hal
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;ROLE=NON-PARTICIPANT
- ;RSVP=FALSE
- ;CUTYPE=ROOM
- :Mailto:Conf@example.com
-ATTENDEE
- ;ROLE=NON-PARTICIPANT
- ;RSVP=FALSE
- :Mailto:E@example.com
-DTSTART
- :19970701T180000Z
-DTEND
- :19970701T190000Z
-SUMMARY
- :Phone Conference
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :1
-DTSTAMP
- :19970613T190000Z
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTART
- :19970701T190000Z
-DTEND
- :19970701T200000Z
-SUMMARY
- :Discuss the Merits of the election results
-LOCATION
- :Green Conference Room
-UID
- :calsrv.example.com-873970198738777a@example.com
-SEQUENCE
- :0
-DTSTAMP
- :19970611T190000Z
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTART
- :19970701T160000Z
-DTEND
- :19970701T190000Z
-DTSTAMP
- :19970612T190000Z
-SUMMARY
- :Discuss the Merits of the election results
-LOCATION
- :Green Conference Room
-COMMENT
- :This time works much better and I think the big conference room is
- too big
-UID
- :calsrv.example.com-873970198738777a@example.com
-SEQUENCE
- :0
-DTSTAMP
- :19970611T190000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTAMP
- :19970613T190000Z
-DTSTART
- :19970701T160000Z
-DTEND
- :19970701T190000Z
-SUMMARY
- :Discuss the Merits of the election results - changed to meet B's schedule
-LOCATION
- :Green Conference Room
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :1
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;PARTSTAT=DELEGATED
- ;DELEGATED-TO="Mailto:E@example.com"
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- ;DELEGATED-FROM="Mailto:C@example.com"
- :Mailto:E@example.com
-DTSTART
- :19970701T180000Z
-DTEND
- :19970701T200000Z
-SUMMARY
- :Phone Conference
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-STATUS
- :CONFIRMED
-DTSTAMP
- :19970611T190000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :MAILTO:A@Example.com
-ATTENDEE
- ;PARTSTAT=DECLINED
- ;DELEGATED-FROM="Mailto:C@example.com"
- :Mailto:E@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-SUMMARY
- :Phone Conference
-DTSTART
- :19970701T180000Z
-DTEND
- :19970701T200000Z
-DTSTAMP
- :19970614T200000Z
-COMMENT
- :DELEGATE (ATTENDEE Mailto:E@example.com) DECLINED YOURINVITATION
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- :CR_Big@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=ROOM'
-ATTENDEE
- ;ROLE=NON-PARTICIPANT
- ;RSVP=FALSE
- :Mailto:E@example.com
-DTSTAMP
- :19970611T190000Z
-DTSTART
- :19970701T200000Z
-DTEND
- :19970701T203000Z
-SUMMARY
- :Phone Conference
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :2
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:B@example.com
-ATTENDEE
- ;ROLE=CHAIR
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'STATUS=ACCEPTED'
-ATTENDEE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTAMP
- :19970611T190000Z
-DTSTART
- :19970701T200000Z
-DTEND
- :19970701T203000Z
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=WEEKLY'
-SUMMARY
- :Phone Conference
-UID
- :123456@example.com
-SEQUENCE
- :1
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :A@example.COM
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :B@example.fr
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :c@example.jp
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTAMP
- :19970613T190030Z
-DTSTART
- ;TZID=America-SanJose
- :19970701T140000
-DTEND
- ;TZID=America-SanJose
- :19970701T150000
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=WEEKLY\;INTERVAL=20\;WKST=SU\;BYDAY=TU'
-RDATE
- ;TZID=America-SanJose
- :19970910T140000
-EXDATE
- ;TZID=America-SanJose
- :19970909T140000
-EXDATE
- ;TZID=America-SanJose
- :19971028T140000
-SUMMARY
- :Weekly Phone Conference
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :guid-1@host1com
-RECURRENCE-ID
- :19970701T210000Z
-SEQUENCE
- :1
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-ATTENDEE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970703T210000Z
-DTEND
- :19970703T220000Z
-LOCATION
- :Conference Call
-DTSTAMP
- :19970626T093000Z
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-ATTENDEE
- :Mailto:D@example.com
-RECURRENCE-ID
- :19970801T210000Z
-SEQUENCE
- :2
-STATUS
- :CANCELLED
-DTSTAMP
- :19970721T093000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-ATTENDEE
- :Mailto:D@example.com
-DTSTAMP
- :19970721T103000Z
-STATUS
- :CANCELLED
-SEQUENCE
- :3
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :4
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970715T210000Z
-DTEND
- :19970715T220000Z
-LOCATION
- :Conference Call
-DTSTAMP
- :19970629T093000Z
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-RECURRENCE-ID
- :19970715T210000Z
-SEQUENCE
- :4
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;RSVP=TRUE
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970715T220000Z
-DTEND
- :19970715T230000Z
-LOCATION
- :Conference Call
-COMMENT
- :May we bump this by an hour? I have a conflict
-DTSTAMP
- :19970629T094000Z
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-END:VCALENDAR
diff --git a/libical/src/test/alice/booked/199708 b/libical/src/test/alice/booked/199708
deleted file mode 100644
index 2db95cabcf..0000000000
--- a/libical/src/test/alice/booked/199708
+++ /dev/null
@@ -1,45 +0,0 @@
-BEGIN:VCALENDAR
-X-LIC-CLUSTERCOUNT
- :1
-DTSTART
- :00000000T000000
-DTEND
- :00000000T000000
-BEGIN:VEVENT
-UID
- :acme-12345@host1.com
-SEQUENCE
- :3
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=WEEKLY'
-RDATE
- ;VALUE=PERIOD
- :19970819T210000Z/19970081T220000Z
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970801T210000Z
-DTEND
- :19970801T220000Z
-RECURRENCE-ID
- :19970809T210000Z
-DTSTAMP
- :19970726T083000
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060028Z
-END:VEVENT
-END:VCALENDAR
diff --git a/libical/src/test/alice/booked/199709 b/libical/src/test/alice/booked/199709
deleted file mode 100644
index 30a4471bde..0000000000
--- a/libical/src/test/alice/booked/199709
+++ /dev/null
@@ -1,58 +0,0 @@
-BEGIN:VCALENDAR
-X-LIC-CLUSTERCOUNT
- :1
-DTSTART
- :00000000T000000
-DTEND
- :00000000T000000
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-RECURRENCE-ID
- :19970901T210000Z
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'THISANDFUTURE'
-SEQUENCE
- :3
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Discussion
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970901T210000Z
-DTEND
- :19970901T220000Z
-LOCATION
- :Building 32
-LOCATION
- : Microsoft
-LOCATION
- : Seattle
-LOCATION
- : WA
-DTSTAMP
- :19970526T083000Z
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-END:VCALENDAR
diff --git a/libical/src/test/alice/booked/199803 b/libical/src/test/alice/booked/199803
deleted file mode 100644
index 4b673d7ccc..0000000000
--- a/libical/src/test/alice/booked/199803
+++ /dev/null
@@ -1,241 +0,0 @@
-BEGIN:VCALENDAR
-X-LIC-CLUSTERCOUNT
- :7
-DTSTART
- :00000000T000000
-DTEND
- :00000000T000000
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :0
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'WKST=SU\;BYDAY=TU\;FREQ=WEEKLY'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980303T210000Z
-DTEND
- :19980303T220000Z
-LOCATION
- :The White Room
-DTSTAMP
- :19980301T093000Z
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :7
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'WKST=SU\;BYDAY=TH\;FREQ=WEEKLY'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980303T210000Z
-DTEND
- :19980303T220000Z
-DTSTAMP
- :19980303T193000Z
-LOCATION
- :The Usual conference room
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :7
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'WKST=SU\;BYDAY=TU'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980303T210000Z
-DTEND
- :19980303T220000Z
-DTSTAMP
- :19980303T193000Z
-LOCATION
- :The White Room
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :0
-RDATE
- :19980304T180000Z
-RDATE
- :19980311T180000Z
-RDATE
- :19980318T180000Z
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980304T180000Z
-DTEND
- :19980304T200000Z
-DTSTAMP
- :19980303T193000Z
-LOCATION
- :Conference Room A
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :1
-RECURRENCE-ID
- :19980311T180000Z
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980311T160000Z
-DTEND
- :19980311T180000Z
-DTSTAMP
- :19980306T193000Z
-LOCATION
- :The Small conference room
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :2
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980315T180000Z
-DTEND
- :19980315T200000Z
-DTSTAMP
- :19980307T193000Z
-LOCATION
- :Conference Room A
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :2
-RDATE
- :19980304T180000Z
-RDATE
- :19980311T160000Z
-RDATE
- :19980315T180000Z
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=COMPONENT_PARSE_ERROR
- :Got a data line\, but could not find a property name or component
- begin tag: 'Error! Bookmark not defined.'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980304T180000Z
-DTEND
- :19980304T200000Z
-DTSTAMP
- :19980303T193000Z
-LOCATION
- :Conference Room A
-STATUS
- :CONFIRMED
-LAST-MODIFIED
- :20000209T060027Z
-END:VEVENT
-END:VCALENDAR
diff --git a/libical/src/test/alice/incoming.ics b/libical/src/test/alice/incoming.ics
deleted file mode 100644
index c25b6b11c3..0000000000
--- a/libical/src/test/alice/incoming.ics
+++ /dev/null
@@ -1,2164 +0,0 @@
-BEGIN:VCALENDAR
-X-LIC-CLUSTERCOUNT
- :0
-DTSTART
- :00000000T000000
-DTEND
- :00000000T000000
-BEGIN:VCALENDAR
-METHOD
- :PUBLISH
-PRODID
- :-//ACME/DesktopCalendar//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :mailto:a@example.com
-DTSTART
- :19970701T200000Z
-DTSTAMP
- :19970611T190000Z
-SUMMARY
- :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-UID
- :0981234-1234234-23@example.com
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :PUBLISH
-VERSION
- :2.0
-PRODID
- :-//ACME/DesktopCalendar//EN
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :mailto:a@example.com
-DTSTAMP
- :19970612T190000Z
-DTSTART
- :19970701T210000Z
-DTEND
- :19970701T230000Z
-SEQUENCE
- :1
-UID
- :0981234-1234234-23@example.com
-SUMMARY
- :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :CANCEL
-VERSION
- :2.0
-PRODID
- :-//ACME/DesktopCalendar//EN
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :mailto:a@example.com
-COMMENT
- :DUKES forfeit the game
-SEQUENCE
- :2
-UID
- :0981234-1234234-23@example.com
-DTSTAMP
- :19970613T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :PUBLISH
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PROPERTY_PARSE_ERROR
- :Parse error in property name: 'SCALE'
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VTIMEZONE
-TZID
- :America-Chicago
-TZURL
- :http://zones.stds_r_us.net/tz/America-Chicago
-BEGIN:STANDARD
-DTSTART
- :19671029T020000
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=YEARLY\;BYDAY=-1SU\;BYMONTH=10'
-TZOFFSETFROM
- :-050000
-TZOFFSETTO
- :-060000
-TZNAME
- :CST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART
- :19870405T020000
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=YEARLY\;BYDAY=1SU\;BYMONTH=4'
-TZOFFSETFROM
- :-060000
-TZOFFSETTO
- :-050000
-TZNAME
- :CDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-ORGANIZER
- :mailto:a@example.com
-ATTACH
- :http://www.dukes.com/
-CATEGORIES
- :SPORTS EVENT
-CATEGORIES
- :ENTERTAINMENT
-CLASS
- :PRIVATE
-DESCRIPTION
- :MIDWAY STADIUM\nBig time game. MUST see.\nExpected duration:2 hours\n
-DTEND
- ;TZID=America-Chicago
- :19970701T180000
-DTSTART
- ;TZID=America-Chicago
- :19970702T160000
-DTSTAMP
- :19970614T190000Z
-STATUS
- :CONFIRMED
-LOCATION
- :http://www.midwaystadium.com/
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter value: 'VALUE=America-Chicago'
-PRIORITY
- :2
-RESOURCES
- :SCOREBOARD
-SEQUENCE
- :3
-SUMMARY
- :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-UID
- :0981234-1234234-23@example.com
-RELATED-TO
- :0981234-1234234-14@example.com
-BEGIN:VALARM
-TRIGGER
- :PT2H
-ACTION
- :DISPLAY
-DESCRIPTION
- :You should be leaving for the game now.
-END:VALARM
-BEGIN:VALARM
-TRIGGER
- :PT30M
-ACTION
- :AUDIO
-END:VALARM
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :PUBLISH
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :mailto:a@example.com
-DTSTAMP
- :19970614T190000Z
-UID
- :0981234-1234234-23@example.com
-DTSTART
- ;VALUE=DATE
- :19970714
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=YEARLY\;INTERVAL=1'
-SUMMARY
- : Bastille Day
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- ;CN=BIG A
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- ;CN=B
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- ;CN=C
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- ;CN=Hal
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=FALSE
- :conf_Big@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=ROOM'
-ATTENDEE
- ;ROLE=NON-PARTICIPANT
- ;RSVP=FALSE
- :Mailto:E@example.com
-DTSTAMP
- :19970611T190000Z
-DTSTART
- :19970701T200000Z
-DTEND
- :19970701T200000Z
-SUMMARY
- :Conference
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REPLY
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ATTENDEE
- ;PARTSTAT=ACCEPTED
- :Mailto:B@example.com
-ORGANIZER
- :MAILTO:A@example.com
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-REQUEST-STATUS
- :2.0\;Success
-DTSTAMP
- :19970612T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- ;CN=Hal
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;ROLE=NON-PARTICIPANT
- ;RSVP=FALSE
- ;CUTYPE=ROOM
- :Mailto:Conf@example.com
-ATTENDEE
- ;ROLE=NON-PARTICIPANT
- ;RSVP=FALSE
- :Mailto:E@example.com
-DTSTART
- :19970701T180000Z
-DTEND
- :19970701T190000Z
-SUMMARY
- :Phone Conference
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :1
-DTSTAMP
- :19970613T190000Z
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTART
- :19970701T190000Z
-DTEND
- :19970701T200000Z
-SUMMARY
- :Discuss the Merits of the election results
-LOCATION
- :Green Conference Room
-UID
- :calsrv.example.com-873970198738777a@example.com
-SEQUENCE
- :0
-DTSTAMP
- :19970611T190000Z
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :COUNTER
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTART
- :19970701T160000Z
-DTEND
- :19970701T190000Z
-DTSTAMP
- :19970612T190000Z
-SUMMARY
- :Discuss the Merits of the election results
-LOCATION
- :Green Conference Room
-COMMENT
- :This time works much better and I think the big conference room is
- too big
-UID
- :calsrv.example.com-873970198738777a@example.com
-SEQUENCE
- :0
-DTSTAMP
- :19970611T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTAMP
- :19970613T190000Z
-DTSTART
- :19970701T160000Z
-DTEND
- :19970701T190000Z
-SUMMARY
- :Discuss the Merits of the election results - changed to meet B's schedule
-LOCATION
- :Green Conference Room
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :1
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :DECLINECOUNTER
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-COMMENT
- :Sorry
-COMMENT
- : I cannot change this meeting time
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-DTSTAMP
- :19970614T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REPLY
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :MAILTO:A@Example.com
-ATTENDEE
- ;PARTSTAT=DELEGATED
- ;DELEGATED-TO="Mailto:E@example.com"
- :Mailto:C@example.com
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-REQUEST-STATUS
- :2.0\;Success
-DTSTAMP
- :19970611T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;PARTSTAT=DELEGATED
- ;DELEGATED-TO="Mailto:E@example.com"
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- ;DELEGATED-FROM="Mailto:C@example.com"
- :Mailto:E@example.com
-DTSTART
- :19970701T180000Z
-DTEND
- :19970701T200000Z
-SUMMARY
- :Phone Conference
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-STATUS
- :CONFIRMED
-DTSTAMP
- :19970611T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REPLY
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :MAILTO:A@Example.com
-ATTENDEE
- ;PARTSTAT=ACCEPTED
- ;DELEGATED-FROM="Mailto:C@example.com"
- :Mailto:E@example.com
-ATTENDEE
- ;PARTSTAT=DELEGATED
- ;DELEGATED-TO="Mailto:E@example.com"
- :Mailto:C@example.com
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-REQUEST-STATUS
- :2.0\;Success
-DTSTAMP
- :19970614T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REPLY
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :MAILTO:A@Example.com
-ATTENDEE
- ;PARTSTAT=DELEGATED
- ;DELEGATED-TO="Mailto:E@example.com"
- :Mailto:C@example.com
-ATTENDEE
- ;PARTSTAT=DECLINED
- ;DELEGATED-FROM="Mailto:C@example.com"
- :Mailto:E@example.com
-COMMENT
- :Sorry
-COMMENT
- : I will be out of town at that time.
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-REQUEST-STATUS
- :2.0\;Success
-DTSTAMP
- :19970614T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :MAILTO:A@Example.com
-ATTENDEE
- ;PARTSTAT=DECLINED
- ;DELEGATED-FROM="Mailto:C@example.com"
- :Mailto:E@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-SUMMARY
- :Phone Conference
-DTSTART
- :19970701T180000Z
-DTEND
- :19970701T200000Z
-DTSTAMP
- :19970614T200000Z
-COMMENT
- :DELEGATE (ATTENDEE Mailto:E@example.com) DECLINED YOURINVITATION
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :CANCEL
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- :A@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'Mailto'
-ATTENDEE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-COMMENT
- :Mr. B cannot attend. It's raining. Lets cancel.
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :1
-STATUS
- :CANCELLED
-DTSTAMP
- :19970613T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :CANCEL
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- :mailto:B@example.com
-COMMENT
- :You're off the hook for this meeting
-UID
- :calsrv.example.com-873970198738777@example.com
-DTSTAMP
- :19970613T193000Z
-SEQUENCE
- :1
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- :CR_Big@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=ROOM'
-ATTENDEE
- ;ROLE=NON-PARTICIPANT
- ;RSVP=FALSE
- :Mailto:E@example.com
-DTSTAMP
- :19970611T190000Z
-DTSTART
- :19970701T200000Z
-DTEND
- :19970701T203000Z
-SUMMARY
- :Phone Conference
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :2
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:B@example.com
-ATTENDEE
- ;ROLE=CHAIR
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'STATUS=ACCEPTED'
-ATTENDEE
- :Mailto:C@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTAMP
- :19970611T190000Z
-DTSTART
- :19970701T200000Z
-DTEND
- :19970701T203000Z
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=WEEKLY'
-SUMMARY
- :Phone Conference
-UID
- :123456@example.com
-SEQUENCE
- :1
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-VERSION
- :2.0
-METHOD
- :PUBLISH
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VFREEBUSY
-DTSTAMP
- :19980101T124100Z
-ORGANIZER
- :MAILTO:A@Example.com
-DTSTART
- :19980101T124200Z
-DTEND
- :19980107T124200Z
-FREEBUSY
- :19980101T180000Z/19980101T190000Z
-FREEBUSY
- :19980103T020000Z/19980103T050000Z
-FREEBUSY
- :19980107T020000Z/19980107T050000Z
-FREEBUSY
- :19980113T000000Z/19980113T010000Z
-FREEBUSY
- :19980115T190000Z/19980115T200000Z
-FREEBUSY
- :19980115T220000Z/19980115T230000Z
-FREEBUSY
- :19980116T013000Z/19980116T043000Z
-END:VFREEBUSY
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VFREEBUSY
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-DTSTAMP
- :19970613T190000Z
-DTSTART
- :19970701T080000Z
-DTEND
- :19970701T200000
-UID
- :calsrv.example.com-873970198738777@example.com
-END:VFREEBUSY
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REPLY
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VFREEBUSY
-ORGANIZER
- :MAILTO:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-DTSTART
- :19970701T080000Z
-DTEND
- :19970701T200000Z
-UID
- :calsrv.example.com-873970198738777@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as PERIOD value in FREEBUSY property. Removing entire
- property: '19970701T090000Z/PT1H'
-DTSTAMP
- :19970613T190030Z
-END:VFREEBUSY
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VTIMEZONE
-TZID
- :America-SanJose
-TZURL
- :http://zones.stds_r_us.net/tz/America-SanJose
-BEGIN:STANDARD
-DTSTART
- :19671029T020000
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=YEARLY\;BYDAY=-1SU\;BYMONTH=10'
-TZOFFSETFROM
- :-070000
-TZOFFSETTO
- :-080000
-TZNAME
- :PST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART
- :19870405T020000
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=YEARLY\;BYDAY=1SU\;BYMONTH=4'
-TZOFFSETFROM
- :-080000
-TZOFFSETTO
- :-070000
-TZNAME
- :PDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :A@example.COM
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :B@example.fr
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :c@example.jp
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTAMP
- :19970613T190030Z
-DTSTART
- ;TZID=America-SanJose
- :19970701T140000
-DTEND
- ;TZID=America-SanJose
- :19970701T150000
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=WEEKLY\;INTERVAL=20\;WKST=SU\;BYDAY=TU'
-RDATE
- ;TZID=America-SanJose
- :19970910T140000
-EXDATE
- ;TZID=America-SanJose
- :19970909T140000
-EXDATE
- ;TZID=America-SanJose
- :19971028T140000
-SUMMARY
- :Weekly Phone Conference
-UID
- :calsrv.example.com-873970198738777@example.com
-SEQUENCE
- :0
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :REQUEST
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-SEQUENCE
- :0
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=MONTHLY\;BYMONTHDAY=1\;UNTIL=19980901T210000Z'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-ATTENDEE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970601T210000Z
-DTEND
- :19970601T220000Z
-LOCATION
- :Conference Call
-DTSTAMP
- :19970526T083000Z
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :REQUEST
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :guid-1@host1com
-RECURRENCE-ID
- :19970701T210000Z
-SEQUENCE
- :1
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-ATTENDEE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970703T210000Z
-DTEND
- :19970703T220000Z
-LOCATION
- :Conference Call
-DTSTAMP
- :19970626T093000Z
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :CANCEL
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-ATTENDEE
- :Mailto:D@example.com
-RECURRENCE-ID
- :19970801T210000Z
-SEQUENCE
- :2
-STATUS
- :CANCELLED
-DTSTAMP
- :19970721T093000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :CANCEL
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-ATTENDEE
- :Mailto:D@example.com
-DTSTAMP
- :19970721T103000Z
-STATUS
- :CANCELLED
-SEQUENCE
- :3
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :REQUEST
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-RECURRENCE-ID
- :19970901T210000Z
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'THISANDFUTURE'
-SEQUENCE
- :3
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Discussion
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970901T210000Z
-DTEND
- :19970901T220000Z
-LOCATION
- :Building 32
-LOCATION
- : Microsoft
-LOCATION
- : Seattle
-LOCATION
- : WA
-DTSTAMP
- :19970526T083000Z
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :ADD
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :4
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970715T210000Z
-DTEND
- :19970715T220000Z
-LOCATION
- :Conference Call
-DTSTAMP
- :19970629T093000Z
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :REQUEST
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :0
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'WKST=SU\;BYDAY=TU\;FREQ=WEEKLY'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980303T210000Z
-DTEND
- :19980303T220000Z
-LOCATION
- :The White Room
-DTSTAMP
- :19980301T093000Z
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :ADD
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :7
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'WKST=SU\;BYDAY=TH\;FREQ=WEEKLY'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980303T210000Z
-DTEND
- :19980303T220000Z
-DTSTAMP
- :19980303T193000Z
-LOCATION
- :The Usual conference room
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :REQUEST
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :7
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'WKST=SU\;BYDAY=TU'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980303T210000Z
-DTEND
- :19980303T220000Z
-DTSTAMP
- :19980303T193000Z
-LOCATION
- :The White Room
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :REQUEST
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :0
-RDATE
- :19980304T180000Z
-RDATE
- :19980311T180000Z
-RDATE
- :19980318T180000Z
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980304T180000Z
-DTEND
- :19980304T200000Z
-DTSTAMP
- :19980303T193000Z
-LOCATION
- :Conference Room A
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :REQUEST
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :1
-RECURRENCE-ID
- :19980311T180000Z
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980311T160000Z
-DTEND
- :19980311T180000Z
-DTSTAMP
- :19980306T193000Z
-LOCATION
- :The Small conference room
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :ADD
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :2
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980315T180000Z
-DTEND
- :19980315T200000Z
-DTSTAMP
- :19980307T193000Z
-LOCATION
- :Conference Room A
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :REQUEST
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :123456789@host1.com
-SEQUENCE
- :2
-RDATE
- :19980304T180000Z
-RDATE
- :19980311T160000Z
-RDATE
- :19980315T180000Z
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=COMPONENT_PARSE_ERROR
- :Got a data line\, but could not find a property name or component
- begin tag: 'Error! Bookmark not defined.'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-SUMMARY
- :Review Accounts
-DTSTART
- :19980304T180000Z
-DTEND
- :19980304T200000Z
-DTSTAMP
- :19980303T193000Z
-LOCATION
- :Conference Room A
-STATUS
- :CONFIRMED
-END:VEVENT
-BEGIN:VEVENT
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=COMPONENT_PARSE_ERROR
- :Got a data line\, but could not find a property name or component
- begin tag: 'Error! Bookmark not defined.'
-SEQUENCE
- :2
-RECURRENCE-ID
- :19980311T160000Z
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=COMPONENT_PARSE_ERROR
- :Got a data line\, but could not find a property name or component
- begin tag: 'Error! Bookmark not defined.'
-ATTENDEE
- :ROLE=CHAIR;Error! Bookmark not defined.
-ATTENDEE
- :Error! Bookmark not defined.
-SUMMARY
- :Review Accounts
-DTSTART
- :19980311T160000Z
-DTEND
- :19980304T180000Z
-DTSTAMP
- :19980306T193000Z
-LOCATION
- :The Small conference room
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :COUNTER
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-RECURRENCE-ID
- :19970715T210000Z
-SEQUENCE
- :4
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;RSVP=TRUE
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970715T220000Z
-DTEND
- :19970715T230000Z
-LOCATION
- :Conference Call
-COMMENT
- :May we bump this by an hour? I have a conflict
-DTSTAMP
- :19970629T094000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :REQUEST
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :guid-1@host1.com
-SEQUENCE
- :0
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=MONTHLY\;BYMONTHDAY=1'
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-CLASS
- :PUBLIC
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970601T210000Z
-DTEND
- :19970601T220000Z
-DTSTAMP
- :19970602T094000Z
-LOCATION
- :Conference Call
-STATUS
- :CONFIRMED
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PROPERTY_PARSE_ERROR
- :Parse error in property name: 'FOO'
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-METHOD
- :REPLY
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-REQUEST-STATUS
- :2.8\;Repeating event ignored. Scheduled as a single event\;RRULE
-REQUEST-STATUS
- :3.0\;Invalid Property Name\;FOO
-UID
- :guid-1@host1.com
-SEQUENCE
- :0
-DTSTAMP
- :19970603T094000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VTODO
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:C@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-DTSTART
- :19970701T170000Z
-DUE
- :19970722T170000Z
-PRIORITY
- :1
-SUMMARY
- :Create the requirements document
-UID
- :calsrv.example.com-873970198738777-00@example.com
-SEQUENCE
- :0
-DTSTAMP
- :19970717T200000Z
-STATUS
- :Needs Action
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REPLY
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VTODO
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;PARTSTAT=ACCEPTED
- :Mailto:B@example.com
-UID
- :calsrv.example.com-873970198738777-00@example.com
-COMMENT
- :I'll send you my input by e-mail
-SEQUENCE
- :0
-DTSTAMP
- :19970717T203000Z
-REQUEST-STATUS
- :2.0\;Success
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VTODO
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-UID
- :calsrv.example.com-873970198738777-00@example.com
-SUMMARY
- :Create the requirements document
-PRIORITY
- :1
-SEQUENCE
- :0
-STATUS
- :IN-PROCESS
-DTSTART
- :19970701T170000Z
-DTSTAMP
- :19970717T230000Z
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REPLY
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VTODO
-ORGANIZER
- :MAILTO:A@example.com
-ATTENDEE
- ;PARTSTAT=IN-PROCESS
- :Mailto:B@example.com
-PERCENT-COMPLETE
- :75
-UID
- :calsrv.example.com-873970198738777-00@example.com
-DTSTAMP
- :19970717T233000Z
-SEQUENCE
- :0
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REPLY
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VTODO
-ORGANIZER
- :MAILTO:A@example.com
-ATTENDEE
- ;PARTSTAT=COMPLETED
- :Mailto:D@example.com
-UID
- :calsrv.example.com-873970198738777-00@example.com
-DTSTAMP
- :19970717T233000Z
-SEQUENCE
- :0
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VTODO
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- ;PARTSTAT=ACCEPTED
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;PARTSTAT=IN-PROCESS
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-DTSTART
- :19970701T170000Z
-DUE
- :19970722T170000Z
-PRIORITY
- :1
-SUMMARY
- :Create the requirements document
-UID
- :calsrv.example.com-873970198738777-00@example.com
-SEQUENCE
- :1
-DTSTAMP
- :19970718T100000Z
-STATUS
- :IN-PROGRESS
-PERCENT-COMPLETE
- :40
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REQUEST
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VTODO
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- :Mailto:A@example.com
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:B@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-ATTENDEE
- ;RSVP=TRUE
- :Mailto:D@example.com
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
- :Can't parse parameter name: 'TYPE=INDIVIDUAL'
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=MONTHLY\;COUNT=10\;BYDAY=1FR'
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as DATE-TIME value in DTSTART property. Removing entire
- property: '19980101T100000-0700'
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as DATE-TIME value in DUE property. Removing entire property:
- '19980103T100000-0700'
-SUMMARY
- :Send Status Reports to Area Managers
-UID
- :calsrv.example.com-873970198738777-00@example.com
-SEQUENCE
- :0
-DTSTAMP
- :19970717T200000Z
-STATUS
- :NEEDS ACTION
-PRIORITY
- :1
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//ACME/DesktopCalendar//EN
-METHOD
- :REPLY
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VTODO
-ATTENDEE
- ;PARTSTAT=IN-PROCESS
- :Mailto:B@example.com
-PERCENT-COMPLETE
- :75
-UID
- :calsrv.example.com-873970198738777-00@example.com
-DTSTAMP
- :19970717T233000Z
-RECURRENCE-ID
- :19980101T170000Z
-SEQUENCE
- :1
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :PUBLISH
-PRODID
- :-//ACME/DesktopCalendar//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VJOURNAL
-DTSTART
- :19971002T200000Z
-ORGANIZER
- :MAILTO:A@Example.com
-SUMMARY
- :Phone conference minutes
-DESCRIPTION
- :The editors meeting was held on October 1
-DESCRIPTION
- : 1997. Details are in the attached document.
-UID
- :0981234-1234234-2410@example.com
-RELATED-TO
- :0981234-1234234-2402-35@example.com
-ATTACH
- :ftp://ftp.example.com/pub/ed/minutes100197.txt
-END:VJOURNAL
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-METHOD
- :REFRESH
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-ATTENDEE
- :Mailto:C@example.com
-ATTENDEE
- :Mailto:D@example.com
-UID
- : guid-1-12345@host1.com
-DTSTAMP
- :19970603T094000
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD
- :REQUEST
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-UID
- :acme-12345@host1.com
-SEQUENCE
- :3
-X-LIC-ERROR
- ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
- :Can't parse as RECUR value in RRULE property. Removing entire property:
- 'FREQ=WEEKLY'
-RDATE
- ;VALUE=PERIOD
- :19970819T210000Z/19970081T220000Z
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- ;ROLE=CHAIR
- ;PARTSTAT=ACCEPTED
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-DESCRIPTION
- :IETF-C&S Conference Call
-SUMMARY
- :IETF Calendaring Working Group Meeting
-DTSTART
- :19970801T210000Z
-DTEND
- :19970801T220000Z
-RECURRENCE-ID
- :19970809T210000Z
-DTSTAMP
- :19970726T083000
-STATUS
- :CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID
- :-//RDU Software//NONSGML HandCal//EN
-METHOD
- :REFRESH
-VERSION
- :2.0
-X-LIC-SENDER
- :eric@busboom.org
-BEGIN:VEVENT
-ORGANIZER
- :Mailto:A@example.com
-ATTENDEE
- :Mailto:B@example.com
-UID
- :acme-12345@host1.com
-DTSTAMP
- :19970603T094000
-END:VEVENT
-END:VCALENDAR
-END:VCALENDAR
diff --git a/libical/src/test/copycluster.c b/libical/src/test/copycluster.c
deleted file mode 100644
index b059130c13..0000000000
--- a/libical/src/test/copycluster.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: copycluster.c
- CREATOR: eric 15 January 2000
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 2000 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is eric. The Initial Developer of the Original
- Code is Eric Busboom
-
-
- ======================================================================*/
-
-#include <stdio.h> /* for printf */
-#include "ical.h"
-#include "icalcluster.h"
-#include <errno.h>
-#include <string.h> /* For strerror */
-#include "icalrestriction.h"
-
-/* This program copies a file that holds iCal components to an other file. */
-
-
-void usage(char* arg0) {
- printf("usage: %s cluster-file1 cluster-file2\n",arg0);
-}
-
-int main(int c, char *argv[]){
-
- icalcluster *clusterin, *clusterout;
- icalcomponent *itr;
- int count=0;
- int tostdout = 0;
-
- if(c < 2 || c > 3){
- usage(argv[0]);
- exit(1);
- }
-
- if (c == 2){
- tostdout = 1;
- }
-
- clusterin = icalcluster_new(argv[1]);
-
- if (clusterin == 0){
- printf("Could not open input cluster \"%s\"",argv[1]);
-
- exit(1);
- }
-
- if (!tostdout){
- clusterout = icalcluster_new(argv[2]);
- if (clusterout == 0){
- printf("Could not open output cluster \"%s\"\n",argv[2]);
- exit(1);
- }
- }
-
-
- for (itr = icalcluster_get_first_component(clusterin,
- ICAL_ANY_COMPONENT);
- itr != 0;
- itr = icalcluster_get_next_component(clusterin,
- ICAL_ANY_COMPONENT)){
-
- icalrestriction_check(itr);
-
- if (itr != 0){
-
- if(tostdout){
-
- printf("--------------\n%s\n",icalcomponent_as_ical_string(itr));
- } else {
-
- icalcluster_add_component(clusterout,
- icalcomponent_new_clone(itr));
- }
-
- count++;
-
- } else {
- printf("Got NULL component");
- }
- }
-
-
- printf("Transfered %d components\n",count);
-
- icalcluster_free(clusterin);
-
- if (!tostdout){
- icalcluster_mark(clusterout);
- icalcluster_free(clusterout);
- }
-
- return 0;
-}
-
diff --git a/libical/src/test/findobj.c b/libical/src/test/findobj.c
deleted file mode 100644
index e7ec59169a..0000000000
--- a/libical/src/test/findobj.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: findobj.c
- CREATOR: eric 11 February 2000
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 2000 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Original Code is eric. The Initial Developer of the Original
- Code is Eric Busboom
-
-
- ======================================================================*/
-
-#include <stdio.h> /* for printf */
-#include "ical.h"
-#include "icalcalendar.h"
-#include <errno.h>
-#include <string.h> /* For strerror */
-#include "icalrestriction.h"
-
-/* This program finds an object stored in a calendar */
-
-void usage(char* arg0) {
- printf("usage: %s calendar-dir uid\n",arg0);
-}
-
-int main(int c, char *argv[]){
-
- icalcalendar *cal;
- icalstore *booked;
- icalcomponent *itr;
-
- if(c < 2 || c > 3){
- usage(argv[0]);
- exit(1);
- }
-
- cal = icalcalendar_new(argv[1]);
-
- if(cal == 0){
- fprintf(stderr,"%s: error in opening calendar \"%s\": %s. errno is \"%s\"\n",
- argv[0],argv[1],icalerror_strerror(icalerrno),
- strerror(errno));
- }
-
- booked = icalcalendar_get_booked(cal);
-
- itr = icalstore_fetch(booked,argv[2]);
-
-
- if(itr != 0){
- printf("%s",icalcomponent_as_ical_string(itr));
- }
-
- return 0;
-}
-
diff --git a/libical/src/test/icaltestparser.c b/libical/src/test/icaltestparser.c
deleted file mode 100644
index 98dbcff94f..0000000000
--- a/libical/src/test/icaltestparser.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: icaltestparser.c
- CREATOR: eric 20 June 1999
-
- $Id$
- $Locker$
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is icaltestparser.c
-
-
- (C) COPYRIGHT 1999 The Software Studio.
- http://www.softwarestudio.org
-
- ======================================================================*/
-
-#include <stdio.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include "ical.h"
-
-#include <stdlib.h>
-
-char str[] = "BEGIN:VCALENDAR\
-PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\
-VERSION:2.0\
-BEGIN:VTIMEZONE\
-TZID:US-Eastern\
-BEGIN:STANDARD\
-DTSTART:19990404T020000\
-RDATE:19990u404xT020000\
-TZOFFSETFROM:-0500\
-TZOFFSETTO:-0400\
-END:STANDARD\
-BEGIN:DAYLIGHT\
-DTSTART:19990404T020000\
-RDATE:19990404T020000\
-TZOFFSETFROM:-0500\
-TZOFFSETTO:-0400\
-TZNAME:EDT\
-Dkjhgri:derhvnv;\
-BEGIN:dfkjh\
-END:dfdfkjh\
-END:DAYLIGHT\
-END:VTIMEZONE\
-BEGIN:VEVENT\
-GEO:Bongo\
-DTSTAMP:19980309T231000Z\
-UID:guid-1.host1.com\
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP\
- :MAILTO:employee-A@host.com\
-DESCRIPTION:Project XYZ Review Meeting\
-CATEGORIES:MEETING\
-CLASS:PUBLIC\
-CREATED:19980309T130000Z\
-SUMMARY:XYZ Project Review\
-DTSTART;TZID=US-Eastern:19980312T083000\
-DTEND;TZID=US-Eastern:19980312T093000\
-LOCATION:1CP Conference Room 4350\
-END:VEVENT\
-END:VCALENDAR\
-";
-
-extern int yydebug;
-
-/* Have the parser fetch data from stdin */
-
-char* read_stream(char *s, size_t size, void *d)
-{
- char *c = fgets(s,size, (FILE*)d);
-
- return c;
-
-}
-
-
-
-int main(int argc, char* argv[])
-{
-
- int lineno = 0;
- char* line;
- FILE* stream;
- icalcomponent *c;
- icalparser *parser = icalparser_new();
-
- stream = fopen(argv[1],"r");
-
- assert(stream != 0);
-
- icalparser_set_gen_data(parser,stream);
-
- do{
-
- line = icalparser_get_line(parser,read_stream);
-
- c = icalparser_add_line(parser,line);
-
-
- if (c != 0){
- /*icalcomponent_convert_errors(c);*/
- printf("%s",icalcomponent_as_ical_string(c));
- icalparser_claim(parser);
- printf("\n---------------\n");
- icalcomponent_free(c);
- }
-
- } while ( line != 0);
-
-
-}
diff --git a/libical/src/test/regression.c b/libical/src/test/regression.c
deleted file mode 100644
index 7b1606d432..0000000000
--- a/libical/src/test/regression.c
+++ /dev/null
@@ -1,1334 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: usecases.c
- CREATOR: eric 03 April 1999
-
- DESCRIPTION:
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is usecases.c
-
-
- ======================================================================*/
-
-#include "ical.h"
-#include <assert.h>
-#include <string.h> /* for strdup */
-#include <stdlib.h> /* for malloc */
-#include <stdio.h> /* for printf */
-#include <time.h> /* for time() */
-#include "icalmemory.h"
-#include "icalstore.h"
-#include "icalcluster.h"
-#include "icalerror.h"
-#include "icalrestriction.h"
-#include "icalcalendar.h"
-
-/* This example creates and minipulates the ical object that appears
- * in rfc 2445, page 137 */
-
-char str[] = "BEGIN:VCALENDAR\
-PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\
-VERSION:2.0\
-BEGIN:VTIMEZONE\
-TZID:US-Eastern\
-BEGIN:STANDARD\
-DTSTART:19981025T020000\
-RDATE:19981025T020000\
-TZOFFSETFROM:-0400\
-TZOFFSETTO:-0500\
-TZNAME:EST\
-END:STANDARD\
-BEGIN:DAYLIGHT\
-DTSTART:19990404T020000\
-RDATE:19990404T020000\
-TZOFFSETFROM:-0500\
-TZOFFSETTO:-0400\
-TZNAME:EDT\
-END:DAYLIGHT\
-END:VTIMEZONE\
-BEGIN:VEVENT\
-DTSTAMP:19980309T231000Z\
-UID:guid-1.host1.com\
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\
-DESCRIPTION:Project XYZ Review Meeting\
-CATEGORIES:MEETING\
-CLASS:PUBLIC\
-CREATED:19980309T130000Z\
-SUMMARY:XYZ Project Review\
-DTSTART;TZID=US-Eastern:19980312T083000\
-DTEND;TZID=US-Eastern:19980312T093000\
-LOCATION:1CP Conference Room 4350\
-END:VEVENT\
-BEGIN:BOOGA\
-DTSTAMP:19980309T231000Z\
-X-LIC-FOO:Booga\
-DTSTOMP:19980309T231000Z\
-UID:guid-1.host1.com\
-END:BOOGA\
-END:VCALENDAR";
-
-
-icalcomponent* create_simple_component()
-{
-
- icalcomponent* calendar;
- struct icalperiodtype rtime;
-
- rtime.start = icaltimetype_from_timet( time(0),0);
- rtime.end = icaltimetype_from_timet( time(0),0);
-
- rtime.end.hour++;
-
-
-
- /* Create calendar and add properties */
- calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
-
-
- icalcomponent_add_property(
- calendar,
- icalproperty_new_version("2.0")
- );
-
- printf("%s\n",icalcomponent_as_ical_string(calendar));
-
- return calendar;
-
-}
-
-/* Create a new component */
-icalcomponent* create_new_component()
-{
-
- icalcomponent* calendar;
- icalcomponent* timezone;
- icalcomponent* tzc;
- icalcomponent* event;
- struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
- struct icalperiodtype rtime;
- icalproperty* property;
-
- rtime.start = icaltimetype_from_timet( time(0),0);
- rtime.end = icaltimetype_from_timet( time(0),0);
-
- rtime.end.hour++;
-
-
-
- /* Create calendar and add properties */
- calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
-
-
- icalcomponent_add_property(
- calendar,
- icalproperty_new_version("2.0")
- );
-
- icalcomponent_add_property(
- calendar,
- icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN")
- );
-
- /* Create a timezone object and add it to the calendar */
-
- timezone = icalcomponent_new(ICAL_VTIMEZONE_COMPONENT);
-
- icalcomponent_add_property(
- timezone,
- icalproperty_new_tzid("US_Eastern")
- );
-
- /* Add a sub-component of the timezone */
- tzc = icalcomponent_new(ICAL_XDAYLIGHT_COMPONENT);
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_dtstart(atime)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_rdate(rtime)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzoffsetfrom(-4.0)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzoffsetto(-5.0)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzname("EST")
- );
-
- icalcomponent_add_component(timezone,tzc);
-
- icalcomponent_add_component(calendar,timezone);
-
- /* Add a second subcomponent */
- tzc = icalcomponent_new(ICAL_XSTANDARD_COMPONENT);
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_dtstart(atime)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_rdate(rtime)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzoffsetfrom(-4.0)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzoffsetto(-5.0)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzname("EST")
- );
-
- icalcomponent_add_component(timezone,tzc);
-
- /* Add an event */
-
- event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
-
- icalcomponent_add_property(
- event,
- icalproperty_new_dtstamp(atime)
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_uid("guid-1.host1.com")
- );
-
- /* add a property that has parameters */
- property = icalproperty_new_organizer("mrbig@host.com");
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_role(ICAL_ROLE_CHAIR)
- );
-
- icalcomponent_add_property(event,property);
-
- /* add another property that has parameters */
- property = icalproperty_new_attendee("employee-A@host.com");
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT)
- );
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_rsvp(1)
- );
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_cutype(ICAL_CUTYPE_GROUP)
- );
-
- icalcomponent_add_property(event,property);
-
-
- /* more properties */
-
- icalcomponent_add_property(
- event,
- icalproperty_new_description("Project XYZ Review Meeting")
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_categories("MEETING")
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_class("PUBLIC")
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_created(atime)
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_summary("XYZ Project Review")
- );
-
-
- property = icalproperty_new_dtstart(atime);
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_tzid("US-Eastern")
- );
-
- icalcomponent_add_property(event,property);
-
-
- property = icalproperty_new_dtend(atime);
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_tzid("US-Eastern")
- );
-
- icalcomponent_add_property(event,property);
-
- icalcomponent_add_property(
- event,
- icalproperty_new_location("1CP Conference Room 4350")
- );
-
- icalcomponent_add_component(calendar,event);
-
- printf("%s\n",icalcomponent_as_ical_string(calendar));
-
- icalcomponent_free(calendar);
-
- return 0;
-}
-
-
-/* Create a new component, using the va_args list */
-
-icalcomponent* create_new_component_with_va_args()
-{
-
- icalcomponent* calendar;
- struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
- struct icalperiodtype rtime;
-
- rtime.start = icaltimetype_from_timet( time(0),0);
- rtime.end = icaltimetype_from_timet( time(0),0);
-
- rtime.end.hour++;
-
- calendar =
- icalcomponent_vanew(
- ICAL_VCALENDAR_COMPONENT,
- icalproperty_new_version("2.0"),
- icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"),
- icalcomponent_vanew(
- ICAL_VTIMEZONE_COMPONENT,
- icalproperty_new_tzid("US_Eastern"),
- icalcomponent_vanew(
- ICAL_XDAYLIGHT_COMPONENT,
- icalproperty_new_dtstart(atime),
- icalproperty_new_rdate(rtime),
- icalproperty_new_tzoffsetfrom(-4.0),
- icalproperty_new_tzoffsetto(-5.0),
- icalproperty_new_tzname("EST"),
- 0
- ),
- icalcomponent_vanew(
- ICAL_XSTANDARD_COMPONENT,
- icalproperty_new_dtstart(atime),
- icalproperty_new_rdate(rtime),
- icalproperty_new_tzoffsetfrom(-5.0),
- icalproperty_new_tzoffsetto(-4.0),
- icalproperty_new_tzname("EST"),
- 0
- ),
- 0
- ),
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_new_dtstamp(atime),
- icalproperty_new_uid("guid-1.host1.com"),
- icalproperty_vanew_organizer(
- "mrbig@host.com",
- icalparameter_new_role(ICAL_ROLE_CHAIR),
- 0
- ),
- icalproperty_vanew_attendee(
- "employee-A@host.com",
- icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
- icalparameter_new_rsvp(1),
- icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
- 0
- ),
- icalproperty_new_description("Project XYZ Review Meeting"),
- icalproperty_new_categories("MEETING"),
- icalproperty_new_class("PUBLIC"),
- icalproperty_new_created(atime),
- icalproperty_new_summary("XYZ Project Review"),
- icalproperty_vanew_dtstart(
- atime,
- icalparameter_new_tzid("US-Eastern"),
- 0
- ),
- icalproperty_vanew_dtend(
- atime,
- icalparameter_new_tzid("US-Eastern"),
- 0
- ),
- icalproperty_new_location("1CP Conference Room 4350"),
- 0
- ),
- 0
- );
-
- printf("%s\n",icalcomponent_as_ical_string(calendar));
-
-
- icalcomponent_free(calendar);
-
- return 0;
-}
-
-
-/* Return a list of all attendees who are required. */
-
-char** get_required_attendees(icalproperty* event)
-{
- icalproperty* p;
- icalparameter* parameter;
-
- char **attendees;
- int max = 10;
- int c = 0;
-
- attendees = malloc(max * (sizeof (char *)));
-
- assert(event != 0);
- assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
-
- for(
- p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
- p != 0;
- p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
- ) {
-
- parameter = icalproperty_get_first_parameter(p,ICAL_ROLE_PARAMETER);
-
- if ( icalparameter_get_role(parameter) == ICAL_ROLE_REQPARTICIPANT)
- {
- attendees[c++] = strdup(icalproperty_get_attendee(p));
-
- if (c >= max) {
- max *= 2;
- attendees = realloc(attendees, max * (sizeof (char *)));
- }
-
- }
- }
-
- return attendees;
-}
-
-/* If an attendee has a PARTSTAT of NEEDSACTION or has no PARTSTAT
- parameter, change it to TENTATIVE. */
-
-void update_attendees(icalproperty* event)
-{
- icalproperty* p;
- icalparameter* parameter;
-
-
- assert(event != 0);
- assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
-
- for(
- p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
- p != 0;
- p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
- ) {
-
- parameter = icalproperty_get_first_parameter(p,ICAL_PARTSTAT_PARAMETER);
-
- if (parameter == 0) {
-
- icalproperty_add_parameter(
- p,
- icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
- );
-
- } else if (icalparameter_get_partstat(parameter) == ICAL_PARTSTAT_NEEDSACTION) {
-
- icalproperty_remove_parameter(p,ICAL_PARTSTAT_PARAMETER);
-
- icalparameter_free(parameter);
-
- icalproperty_add_parameter(
- p,
- icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
- );
- }
-
- }
-}
-
-
-void test_values()
-{
- icalvalue *v;
- icalvalue *copy;
-
- v = icalvalue_new_caladdress("cap://value/1");
- printf("caladdress 1: %s\n",icalvalue_get_caladdress(v));
- icalvalue_set_caladdress(v,"cap://value/2");
- printf("caladdress 2: %s\n",icalvalue_get_caladdress(v));
- printf("String: %s\n",icalvalue_as_ical_string(v));
-
- copy = icalvalue_new_clone(v);
- printf("Clone: %s\n",icalvalue_as_ical_string(v));
- icalvalue_free(v);
- icalvalue_free(copy);
-
-
- v = icalvalue_new_boolean(1);
- printf("caladdress 1: %d\n",icalvalue_get_boolean(v));
- icalvalue_set_boolean(v,2);
- printf("caladdress 2: %d\n",icalvalue_get_boolean(v));
- printf("String: %s\n",icalvalue_as_ical_string(v));
-
- copy = icalvalue_new_clone(v);
- printf("Clone: %s\n",icalvalue_as_ical_string(v));
- icalvalue_free(v);
- icalvalue_free(copy);
-
-
- v = icalvalue_new_date(icaltimetype_from_timet( time(0),0));
- printf("date 1: %s\n",icalvalue_as_ical_string(v));
- icalvalue_set_date(v,icaltimetype_from_timet( time(0)+3600,0));
- printf("date 2: %s\n",icalvalue_as_ical_string(v));
-
- copy = icalvalue_new_clone(v);
- printf("Clone: %s\n",icalvalue_as_ical_string(v));
- icalvalue_free(v);
- icalvalue_free(copy);
-
-
- v = icalvalue_new(-1);
-
- printf("Invalid type: %p\n",v);
-
- if (v!=0) icalvalue_free(v);
-
-
- /* v = icalvalue_new_caladdress(0);
-
- printf("Bad string: %p\n",v);
-
- if (v!=0) icalvalue_free(v); */
-
-}
-
-void test_properties()
-{
- icalproperty *prop;
- icalparameter *param;
-
- icalproperty *clone;
-
- prop = icalproperty_vanew_comment(
- "Another Comment",
- icalparameter_new_cn("A Common Name 1"),
- icalparameter_new_cn("A Common Name 2"),
- icalparameter_new_cn("A Common Name 3"),
- icalparameter_new_cn("A Common Name 4"),
- 0);
-
- for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER);
- param != 0;
- param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) {
-
- printf("Prop parameter: %s\n",icalparameter_get_cn(param));
- }
-
- printf("Prop value: %s\n",icalproperty_get_comment(prop));
-
-
- printf("As iCAL string:\n %s\n",icalproperty_as_ical_string(prop));
-
- clone = icalproperty_new_clone(prop);
-
- printf("Clone:\n %s\n",icalproperty_as_ical_string(prop));
-
- icalproperty_free(clone);
- icalproperty_free(prop);
-
- prop = icalproperty_new(-1);
-
- printf("Invalid type: %p\n",prop);
-
- if (prop!=0) icalproperty_free(prop);
-
- /*
- prop = icalproperty_new_method(0);
-
- printf("Bad string: %p\n",prop);
-
-
- if (prop!=0) icalproperty_free(prop);
- */
-}
-
-void test_parameters()
-{
- icalparameter *p;
-
- p = icalparameter_new_cn("A Common Name");
-
- printf("Common Name: %s\n",icalparameter_get_cn(p));
-
- printf("As String: %s\n",icalparameter_as_ical_string(p));
-
- icalparameter_free(p);
-}
-
-
-void test_components()
-{
-
- icalcomponent* c;
- icalcomponent* child;
-
- c = icalcomponent_vanew(
- ICAL_VCALENDAR_COMPONENT,
- icalproperty_new_version("2.0"),
- icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"),
- icalproperty_vanew_comment(
- "A Comment",
- icalparameter_new_cn("A Common Name 1"),
- 0),
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_new_version("2.0"),
- icalproperty_new_description("This is an event"),
- icalproperty_vanew_comment(
- "Another Comment",
- icalparameter_new_cn("A Common Name 1"),
- icalparameter_new_cn("A Common Name 2"),
- icalparameter_new_cn("A Common Name 3"),
- icalparameter_new_cn("A Common Name 4"),
- 0),
- icalproperty_vanew_xlicerror(
- "This is only a test",
- icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR),
- 0),
-
- 0
- ),
- 0
- );
-
- printf("Original Component:\n%s\n\n",icalcomponent_as_ical_string(c));
-
- child = icalcomponent_get_first_component(c,ICAL_VEVENT_COMPONENT);
-
- printf("Child Component:\n%s\n\n",icalcomponent_as_ical_string(child));
-
- icalcomponent_free(c);
-
-}
-
-void test_memory()
-{
- size_t bufsize = 256;
- char *p;
-
- char S1[] = "1) When in the Course of human events, ";
- char S2[] = "2) it becomes necessary for one people to dissolve the political bands which have connected them with another, ";
- char S3[] = "3) and to assume among the powers of the earth, ";
- char S4[] = "4) the separate and equal station to which the Laws of Nature and of Nature's God entitle them, ";
- char S5[] = "5) a decent respect to the opinions of mankind requires that they ";
- char S6[] = "6) should declare the causes which impel them to the separation. ";
- char S7[] = "7) We hold these truths to be self-evident, ";
- char S8[] = "8) that all men are created equal, ";
-
-/* char S9[] = "9) that they are endowed by their Creator with certain unalienable Rights, ";
- char S10[] = "10) that among these are Life, Liberty, and the pursuit of Happiness. ";
- char S11[] = "11) That to secure these rights, Governments are instituted among Men, ";
- char S12[] = "12) deriving their just powers from the consent of the governed. ";
-*/
-
-
- char *f, *b1, *b2, *b3, *b4, *b5, *b6, *b7, *b8;
-
- #define BUFSIZE 1024
-
-
- f = icalmemory_new_buffer(bufsize);
- p = f;
- b1 = icalmemory_tmp_buffer(BUFSIZE);
- strcpy(b1, S1);
- icalmemory_append_string(&f, &p, &bufsize, b1);
-
- b2 = icalmemory_tmp_buffer(BUFSIZE);
- strcpy(b2, S2);
- icalmemory_append_string(&f, &p, &bufsize, b2);
-
- b3 = icalmemory_tmp_buffer(BUFSIZE);
- strcpy(b3, S3);
- icalmemory_append_string(&f, &p, &bufsize, b3);
-
- b4 = icalmemory_tmp_buffer(BUFSIZE);
- strcpy(b4, S4);
- icalmemory_append_string(&f, &p, &bufsize, b4);
-
- b5 = icalmemory_tmp_buffer(BUFSIZE);
- strcpy(b5, S5);
- icalmemory_append_string(&f, &p, &bufsize, b5);
-
- b6 = icalmemory_tmp_buffer(BUFSIZE);
- strcpy(b6, S6);
- icalmemory_append_string(&f, &p, &bufsize, b6);
-
- b7 = icalmemory_tmp_buffer(BUFSIZE);
- strcpy(b7, S7);
- icalmemory_append_string(&f, &p, &bufsize, b7);
-
- b8 = icalmemory_tmp_buffer(BUFSIZE);
- strcpy(b8, S8);
- icalmemory_append_string(&f, &p, &bufsize, b8);
-
-
- printf("1: %p %s \n",b1,b1);
- printf("2: %p %s\n",b2,b2);
- printf("3: %p %s\n",b3,b3);
- printf("4: %p %s\n",b4,b4);
- printf("5: %p %s\n",b5,b5);
- printf("6: %p %s\n",b6,b6);
- printf("7: %p %s\n",b7,b7);
- printf("8: %p %s\n",b8,b8);
-
-
- printf("Final: %s\n", f);
-
- printf("Final buffer size: %d\n",bufsize);
-
- free(f);
-
- bufsize = 4;
- f = icalmemory_new_buffer(bufsize);
- p = f;
-
- icalmemory_append_char(&f, &p, &bufsize, 'a');
- icalmemory_append_char(&f, &p, &bufsize, 'b');
- icalmemory_append_char(&f, &p, &bufsize, 'c');
- icalmemory_append_char(&f, &p, &bufsize, 'd');
- icalmemory_append_char(&f, &p, &bufsize, 'e');
- icalmemory_append_char(&f, &p, &bufsize, 'f');
- icalmemory_append_char(&f, &p, &bufsize, 'g');
- icalmemory_append_char(&f, &p, &bufsize, 'h');
- icalmemory_append_char(&f, &p, &bufsize, 'i');
- icalmemory_append_char(&f, &p, &bufsize, 'j');
- icalmemory_append_char(&f, &p, &bufsize, 'a');
- icalmemory_append_char(&f, &p, &bufsize, 'b');
- icalmemory_append_char(&f, &p, &bufsize, 'c');
- icalmemory_append_char(&f, &p, &bufsize, 'd');
- icalmemory_append_char(&f, &p, &bufsize, 'e');
- icalmemory_append_char(&f, &p, &bufsize, 'f');
- icalmemory_append_char(&f, &p, &bufsize, 'g');
- icalmemory_append_char(&f, &p, &bufsize, 'h');
- icalmemory_append_char(&f, &p, &bufsize, 'i');
- icalmemory_append_char(&f, &p, &bufsize, 'j');
-
- printf("Char-by-Char buffer: %s\n", f);
-
-}
-
-
-int test_store()
-{
-
- icalcomponent *c, *gauge;
- icalerrorenum error;
- icalcomponent *next, *itr;
- icalcluster* cluster;
- struct icalperiodtype rtime;
- icalstore *s = icalstore_new("store");
- int i;
-
- rtime.start = icaltimetype_from_timet( time(0),0);
-
- cluster = icalcluster_new("clusterin.vcd");
-
- if (cluster == 0){
- printf("Failed to create cluster: %s\n",icalerror_strerror(icalerrno));
- return 0;
- }
-
-#define NUMCOMP 4
-
- /* Duplicate every component in the cluster NUMCOMP times */
-
- icalerror_clear_errno();
-
- for (i = 1; i<NUMCOMP+1; i++){
-
- /*rtime.start.month = i%12;*/
- rtime.start.month = i;
- rtime.end = rtime.start;
- rtime.end.hour++;
-
- for (itr = icalcluster_get_first_component(cluster,
- ICAL_ANY_COMPONENT);
- itr != 0;
- itr = icalcluster_get_next_component(cluster,
- ICAL_ANY_COMPONENT)){
- icalcomponent *clone;
- icalproperty *p;
-
-
- if(icalcomponent_isa(itr) != ICAL_VEVENT_COMPONENT){
- continue;
- }
-
- assert(itr != 0);
-
- /* Change the dtstart and dtend times in the component
- pointed to by Itr*/
-
- clone = icalcomponent_new_clone(itr);
- assert(icalerrno == ICAL_NO_ERROR);
- assert(clone !=0);
-
- /* DTSTART*/
- p = icalcomponent_get_first_property(clone,ICAL_DTSTART_PROPERTY);
- assert(icalerrno == ICAL_NO_ERROR);
-
- if (p == 0){
- p = icalproperty_new_dtstart(rtime.start);
- icalcomponent_add_property(clone,p);
- } else {
- icalproperty_set_dtstart(p,rtime.start);
- }
- assert(icalerrno == ICAL_NO_ERROR);
-
- /* DTEND*/
- p = icalcomponent_get_first_property(clone,ICAL_DTEND_PROPERTY);
- assert(icalerrno == ICAL_NO_ERROR);
-
- if (p == 0){
- p = icalproperty_new_dtstart(rtime.end);
- icalcomponent_add_property(clone,p);
- } else {
- icalproperty_set_dtstart(p,rtime.end);
- }
- assert(icalerrno == ICAL_NO_ERROR);
-
- printf("\n----------\n%s\n---------\n",icalcomponent_as_ical_string(clone));
-
- error = icalstore_add_component(s,clone);
-
- assert(icalerrno == ICAL_NO_ERROR);
-
- }
-
- }
-
- gauge =
- icalcomponent_vanew(
- ICAL_VCALENDAR_COMPONENT,
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_summary(
- "Submit Income Taxes",
- icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
- 0),
- 0),
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_summary(
- "Bastille Day Party",
- icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
- 0),
- 0),
- 0);
-
-#if 0
-
-
- icalstore_select(s,gauge);
-
- for(c = icalstore_first(s); c != 0; c = icalstore_next(s)){
-
- printf("Got one! (%d)\n", count++);
-
- if (c != 0){
- printf("%s", icalcomponent_as_ical_string(c));;
- if (icalstore_store(s2,c) == 0){
- printf("Failed to write!\n");
- }
- icalcomponent_free(c);
- } else {
- printf("Failed to get component\n");
- }
- }
-
-
- icalstore_free(s2);
-#endif
-
-
- for(c = icalstore_get_first_component(s);
- c != 0;
- c = next){
-
- next = icalstore_get_next_component(s);
-
- if (c != 0){
- /*icalstore_remove_component(s,c);*/
- printf("%s", icalcomponent_as_ical_string(c));;
- } else {
- printf("Failed to get component\n");
- }
-
-
- }
-
- icalstore_free(s);
- return 0;
-}
-
-int test_compare()
-{
- icalvalue *v1, *v2;
- icalcomponent *c, *gauge;
-
- v1 = icalvalue_new_caladdress("cap://value/1");
- v2 = icalvalue_new_clone(v1);
-
- printf("%d\n",icalvalue_compare(v1,v2));
-
- v1 = icalvalue_new_caladdress("A");
- v2 = icalvalue_new_caladdress("B");
-
- printf("%d\n",icalvalue_compare(v1,v2));
-
- v1 = icalvalue_new_caladdress("B");
- v2 = icalvalue_new_caladdress("A");
-
- printf("%d\n",icalvalue_compare(v1,v2));
-
- v1 = icalvalue_new_integer(5);
- v2 = icalvalue_new_integer(5);
-
- printf("%d\n",icalvalue_compare(v1,v2));
-
- v1 = icalvalue_new_integer(5);
- v2 = icalvalue_new_integer(10);
-
- printf("%d\n",icalvalue_compare(v1,v2));
-
- v1 = icalvalue_new_integer(10);
- v2 = icalvalue_new_integer(5);
-
- printf("%d\n",icalvalue_compare(v1,v2));
-
-
- gauge =
- icalcomponent_vanew(
- ICAL_VCALENDAR_COMPONENT,
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_comment(
- "Comment",
- icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
- 0),
- 0),
- 0);
-
- c = icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_comment(
- "Comment",
- 0),
- 0);
-
- printf("%s",icalcomponent_as_ical_string(gauge));
-
- printf("%d\n",icalstore_test(c,gauge));
-
- return 0;
-}
-
-void test_restriction()
-{
- icalcomponent *comp;
- struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
- int valid;
-
- struct icalperiodtype rtime;
-
- rtime.start = icaltimetype_from_timet( time(0),0);
- rtime.end = icaltimetype_from_timet( time(0),0);
-
- rtime.end.hour++;
-
-
- /* Property restrictions */
- assert(icalrestriction_get_property_restriction(
- ICAL_METHOD_PUBLISH,
- ICAL_VEVENT_COMPONENT,
- ICAL_SEQUENCE_PROPERTY) == 5); /* ZEROORONE -> 5 */
-
- assert(icalrestriction_get_property_restriction(
- ICAL_METHOD_PUBLISH,
- ICAL_VEVENT_COMPONENT,
- ICAL_ATTACH_PROPERTY)==3); /* ZEROPLUS -> 3 */
-
- assert(icalrestriction_get_property_restriction(
- ICAL_METHOD_DECLINECOUNTER,
- ICAL_VEVENT_COMPONENT,
- ICAL_SEQUENCE_PROPERTY)==1); /* ZERO -> 1 */
-
- /* Component restrictions */
- assert(icalrestriction_get_component_restriction(
- ICAL_METHOD_PUBLISH,
- ICAL_VJOURNAL_COMPONENT,
- ICAL_X_COMPONENT) == 3); /* ZEROPLUS */
-
- assert(icalrestriction_get_component_restriction(
- ICAL_METHOD_CANCEL,
- ICAL_VJOURNAL_COMPONENT,
- ICAL_VEVENT_COMPONENT) == 1); /* ZERO */
-
- comp =
- icalcomponent_vanew(
- ICAL_VCALENDAR_COMPONENT,
- icalproperty_new_version("2.0"),
- icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"),
- icalproperty_new_method(ICAL_METHOD_REQUEST),
- icalcomponent_vanew(
- ICAL_VTIMEZONE_COMPONENT,
- icalproperty_new_tzid("US_Eastern"),
- icalcomponent_vanew(
- ICAL_XDAYLIGHT_COMPONENT,
- icalproperty_new_dtstart(atime),
- icalproperty_new_rdate(rtime),
- icalproperty_new_tzoffsetfrom(-4.0),
- icalproperty_new_tzoffsetto(-5.0),
- icalproperty_new_tzname("EST"),
- 0
- ),
- icalcomponent_vanew(
- ICAL_XSTANDARD_COMPONENT,
- icalproperty_new_dtstart(atime),
- icalproperty_new_rdate(rtime),
- icalproperty_new_tzoffsetfrom(-5.0),
- icalproperty_new_tzoffsetto(-4.0),
- icalproperty_new_tzname("EST"),
- 0
- ),
- 0
- ),
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_new_dtstamp(atime),
- icalproperty_new_uid("guid-1.host1.com"),
- icalproperty_vanew_organizer(
- "mrbig@host.com",
- icalparameter_new_role(ICAL_ROLE_CHAIR),
- 0
- ),
- icalproperty_vanew_attendee(
- "employee-A@host.com",
- icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
- icalparameter_new_rsvp(1),
- icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
- 0
- ),
- icalproperty_new_description("Project XYZ Review Meeting"),
- icalproperty_new_categories("MEETING"),
- icalproperty_new_class("PUBLIC"),
- icalproperty_new_created(atime),
- icalproperty_new_summary("XYZ Project Review"),
-/* icalproperty_vanew_dtstart(
- atime,
- icalparameter_new_tzid("US-Eastern"),
- 0
- ),*/
- icalproperty_vanew_dtend(
- atime,
- icalparameter_new_tzid("US-Eastern"),
- 0
- ),
- icalproperty_new_location("1CP Conference Room 4350"),
- 0
- ),
- 0
- );
-
- valid = icalrestriction_check(comp);
-
- printf("#### %d ####\n%s\n",valid, icalcomponent_as_ical_string(comp));
-
-}
-
-void test_calendar()
-{
- icalcomponent *comp;
- icalcluster *c;
- icalstore *s;
- icalcalendar* calendar = icalcalendar_new("calendar");
- icalerrorenum error;
- struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
-
- comp = icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_new_version("2.0"),
- icalproperty_new_description("This is an event"),
- icalproperty_new_dtstart(atime),
- icalproperty_vanew_comment(
- "Another Comment",
- icalparameter_new_cn("A Common Name 1"),
- icalparameter_new_cn("A Common Name 2"),
- icalparameter_new_cn("A Common Name 3"),
- icalparameter_new_cn("A Common Name 4"),
- 0),
- icalproperty_vanew_xlicerror(
- "This is only a test",
- icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR),
- 0),
-
- 0);
-
-
- s = icalcalendar_get_booked(calendar);
-
- error = icalstore_add_component(s,comp);
-
- assert(error == ICAL_NO_ERROR);
-
- c = icalcalendar_get_properties(calendar);
-
- error = icalcluster_add_component(c,icalcomponent_new_clone(comp));
-
- assert(error == ICAL_NO_ERROR);
-
- icalcalendar_free(calendar);
-
-}
-
-void test_recur()
-{
- icalvalue *v;
-
- v = icalvalue_new_from_string(ICAL_RECUR_VALUE,
- "FREQ=DAILY;COUNT=5;BYDAY=MO,TU,WE,TH,FR");
-
- printf("%s\n",icalvalue_as_ical_string(v));
-
- v = icalvalue_new_from_string(ICAL_RECUR_VALUE,
- "FREQ=YEARLY;UNTIL=123456T123456;BYSETPOS=-1,2");
-
- printf("%s\n",icalvalue_as_ical_string(v));
-
- v = icalvalue_new_from_string(ICAL_RECUR_VALUE,
- "FREQ=YEARLY;UNTIL=123456T123456;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;BYMINUTE=30");
-
- printf("%s\n",icalvalue_as_ical_string(v));
-
- v = icalvalue_new_from_string(ICAL_RECUR_VALUE,
- "FREQ=MONTHLY;BYDAY=-1MO,TU,WE,TH,FR");
-
- printf("%s\n",icalvalue_as_ical_string(v));
-
- v = icalvalue_new_from_string(ICAL_RECUR_VALUE,
- "FREQ=WEEKLY;INTERVAL=20;WKST=SU;BYDAY=TU");
-
- printf("%s\n",icalvalue_as_ical_string(v));
-
-}
-
-void test_duration()
-{
-
- icalvalue *v;
-
- v = icalvalue_new_from_string(ICAL_DURATION_VALUE,
- "PT8H30M");
-
- printf("%s\n",icalvalue_as_ical_string(v));
-
- icalvalue_free(v);
- v = icalvalue_new_from_string(ICAL_PERIOD_VALUE,
- "19971015T050000Z/PT8H30M");
-
- printf("%s\n",icalvalue_as_ical_string(v));
-
- icalvalue_free(v);
- v = icalvalue_new_from_string(ICAL_PERIOD_VALUE,
- "19971015T050000Z/19971015T060000Z");
-
- printf("%s\n",icalvalue_as_ical_string(v));
- icalvalue_free(v);
-
-
-}
-
-
-void test_strings(){
-
- icalvalue *v;
-
- v = icalvalue_new_text("foo;bar;bats");
-
- printf("%s\n",icalvalue_as_ical_string(v));
-
- icalvalue_free(v);
-
- v = icalvalue_new_text("foo\\;b\nar\\;ba\tts");
-
- printf("%s\n",icalvalue_as_ical_string(v));
-
- icalvalue_free(v);
-
-
-}
-
-void test_requeststat()
-{
- icalrequeststatus s;
- struct icalreqstattype st, st2;
- char temp[1024];
-
- s = icalenum_num_to_reqstat(2,1);
-
- assert(s == ICAL_2_1_FALLBACK_STATUS);
-
- assert(icalenum_reqstat_major(s) == 2);
- assert(icalenum_reqstat_minor(s) == 1);
-
- printf("2.1: %s\n",icalenum_reqstat_desc(s));
-
- st.code = s;
- st.debug = "booga";
- st.desc = 0;
-
- printf("%s\n",icalreqstattype_as_string(st));
-
- st.desc = " A non-standard description";
-
- printf("%s\n",icalreqstattype_as_string(st));
-
-
- st.desc = 0;
-
- sprintf(temp,"%s\n",icalreqstattype_as_string(st));
-
-
- st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;booga");
-
- printf("%d -- %d -- %s -- %s\n",icalenum_reqstat_major(st2.code),
- icalenum_reqstat_minor(st2.code),
- icalenum_reqstat_desc(st2.code),
- st2.debug);
-
- st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;booga");
- printf("%s\n",icalreqstattype_as_string(st2));
-
- st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;");
- printf("%s\n",icalreqstattype_as_string(st2));
-
- st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.");
- printf("%s\n",icalreqstattype_as_string(st2));
-
- st2 = icalreqstattype_from_string("2.1;");
- printf("%s\n",icalreqstattype_as_string(st2));
-
- st2 = icalreqstattype_from_string("2.1");
- printf("%s\n",icalreqstattype_as_string(st2));
-
- st2 = icalreqstattype_from_string("16.4");
- assert(st2.code == ICAL_UNKNOWN_STATUS);
-
- st2 = icalreqstattype_from_string("1.");
- assert(st2.code == ICAL_UNKNOWN_STATUS);
-
-}
-
-
-int main(int argc, char *argv[])
-{
-
-
- printf("\n------------Test Restriction---------------\n");
- test_restriction();
-
- exit(0);
-
- printf("\n------------Test request status-------\n");
- test_requeststat();
-
-
- printf("\n------------Test strings---------------\n");
- test_strings();
-
- printf("\n------------Test recur---------------\n");
- test_recur();
-
- printf("\n------------Test duration---------------\n");
- test_duration();
-
- printf("\n------------Test Compare---------------\n");
- test_compare();
-
- printf("\n------------Test Memory---------------\n");
- test_memory();
-
- printf("\n------------Test Values---------------\n");
- test_values();
-
- printf("\n------------Test Parameters-----------\n");
- test_parameters();
-
- printf("\n------------Test Properties-----------\n");
- test_properties();
-
- printf("\n------------Test Components ----------\n");
- test_components();
-
- printf("\n------------Create Components --------\n");
- create_new_component();
-
- printf("\n----- Create Components with vaargs ---\n");
- create_new_component_with_va_args();
-
-
-
-
- return 0;
-}
-
-
-
diff --git a/libical/src/test/storage.c b/libical/src/test/storage.c
deleted file mode 100644
index f6d0dd69e5..0000000000
--- a/libical/src/test/storage.c
+++ /dev/null
@@ -1,460 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: usecases.c
- CREATOR: eric 03 April 1999
-
- DESCRIPTION:
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is usecases.c
-
-
- ======================================================================*/
-
-#include "ical.h"
-#include <assert.h>
-#include <string.h> /* for strdup */
-#include <stdlib.h> /* for malloc */
-#include <stdio.h> /* for printf */
-#include <time.h> /* for time() */
-#include "icalmemory.h"
-#include "icalstore.h"
-#include "icalcluster.h"
-#include "icalerror.h"
-#include "icalrestriction.h"
-#include "icalcalendar.h"
-
-/* This example creates and minipulates the ical object that appears
- * in rfc 2445, page 137 */
-
-char str[] = "BEGIN:VCALENDAR\n\
-PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\
-VERSION:2.0\n\
-BEGIN:VTIMEZONE\n\
-TZID:US-Eastern\n\
-BEGIN:STANDARD\n\
-DTSTART:19981025T020000\n\
-RDATE:19981025T020000\n\
-TZOFFSETFROM:-0400\n\
-TZOFFSETTO:-0500\n\
-TZNAME:EST\n\
-END:STANDARD\n\
-BEGIN:DAYLIGHT\n\
-DTSTART:19990404T020000\n\
-RDATE:19990404T020000\n\
-TZOFFSETFROM:-0500\n\
-TZOFFSETTO:-0400\n\
-TZNAME:EDT\n\
-END:DAYLIGHT\n\
-END:VTIMEZONE\n\
-BEGIN:VEVENT\n\
-DTSTAMP:19980309T231000Z\n\
-UID:guid-1.host1.com\n\
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\n\
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n\
-DESCRIPTION:Project XYZ Review Meeting\n\
-CATEGORIES:MEETING\n\
-CLASS:PUBLIC\n\
-CREATED:19980309T130000Z\n\
-SUMMARY:XYZ Project Review\n\
-DTSTART;TZID=US-Eastern:19980312T083000\n\
-DTEND;TZID=US-Eastern:19980312T093000\n\
-LOCATION:1CP Conference Room 4350\n\
-END:VEVENT\n\
-BEGIN:BOOGA\n\
-DTSTAMP:19980309T231000Z\n\
-X-LIC-FOO:Booga\n\
-DTSTOMP:19980309T231000Z\n\
-UID:guid-1.host1.com\n\
-END:BOOGA\n\
-END:VCALENDAR";
-
-char str2[] = "BEGIN:VCALENDAR\n\
-PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\
-VERSION:2.0\n\
-BEGIN:VEVENT\n\
-DTSTAMP:19980309T231000Z\n\
-UID:guid-1.host1.com\n\
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\n\
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n\
-DESCRIPTION:Project XYZ Review Meeting\n\
-CATEGORIES:MEETING\n\
-CLASS:PUBLIC\n\
-CREATED:19980309T130000Z\n\
-SUMMARY:XYZ Project Review\n\
-DTSTART;TZID=US-Eastern:19980312T083000\n\
-DTEND;TZID=US-Eastern:19980312T093000\n\
-LOCATION:1CP Conference Room 4350\n\
-END:VEVENT\n\
-END:VCALENDAR\n\
-";
-
-
-void test_cluster()
-{
- icalcluster *cin, *cout;
- int month = 0;
- int count=0;
- struct icaltimetype start, end;
- icalcomponent *c,*clone, *itr;
-
- start = icaltimetype_from_timet( time(0),0);
- end = start;
- end.hour++;
-
- cout = icalcluster_new("clusterout.ics");
- assert(cout != 0);
-
- c = icalparser_parse_string(str2);
- assert(c != 0);
-
- for(month = 1; month < 2; month++){
- icalcomponent *event;
- icalproperty *dtstart, *dtend;
-
- cout = icalcluster_new("clusterout.ics");
- assert(cout != 0);
-
- start.month = month;
- end.month = month;
-
- clone = icalcomponent_new_clone(c);
- assert(clone !=0);
- event = icalcomponent_get_first_component(clone,ICAL_VEVENT_COMPONENT);
- assert(event != 0);
-
- dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
- assert(dtstart!=0);
- icalproperty_set_dtstart(dtstart,start);
-
- dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
- assert(dtend!=0);
- icalproperty_set_dtend(dtend,end);
-
- icalcluster_add_component(cout,clone);
- icalcluster_commit(cout);
-
- icalcluster_free(cout);
-
- }
-
-
- /* Print them out */
-
-
- cout = icalcluster_new("clusterout.ics");
- assert(cout != 0);
-
- for (itr = icalcluster_get_first_component(cout,
- ICAL_ANY_COMPONENT);
- itr != 0;
- itr = icalcluster_get_next_component(cout,
- ICAL_ANY_COMPONENT)){
-
- icalcomponent *event;
- icalproperty *dtstart, *dtend;
-
- count++;
-
- event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
-
- dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
- dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
-
- printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart),
- icalproperty_as_ical_string(dtend));
-
- }
-
- /* Remove all of them */
-
- icalcluster_free(cout);
-
- cout = icalcluster_new("clusterout.ics");
- assert(cout != 0);
-
- for (itr = icalcluster_get_first_component(cout,
- ICAL_ANY_COMPONENT);
- itr != 0;
- itr = icalcluster_get_next_component(cout,
- ICAL_ANY_COMPONENT)){
-
-
- icalcluster_remove_component(cout, itr);
- }
-
- icalcluster_free(cout);
-
-
- /* Print them out again */
-
- cout = icalcluster_new("clusterout.ics");
- assert(cout != 0);
- count =0;
-
- for (itr = icalcluster_get_first_component(cout,
- ICAL_ANY_COMPONENT);
- itr != 0;
- itr = icalcluster_get_next_component(cout,
- ICAL_ANY_COMPONENT)){
-
- icalcomponent *event;
- icalproperty *dtstart, *dtend;
-
- count++;
-
- event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
-
- dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
- dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
-
- printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart),
- icalproperty_as_ical_string(dtend));
-
- }
-
- icalcluster_free(cout);
-
-
-}
-
-
-
-int test_store()
-{
-
- icalcomponent *c, *gauge;
- icalerrorenum error;
- icalcomponent *next, *itr;
- icalcluster* cluster;
- struct icalperiodtype rtime;
- icalstore *s = icalstore_new("store");
- int i;
-
- assert(s != 0);
-
- rtime.start = icaltimetype_from_timet( time(0),0);
-
- cluster = icalcluster_new("clusterout.ics");
-
- assert(cluster != 0);
-
-#define NUMCOMP 4
-
- /* Duplicate every component in the cluster NUMCOMP times */
-
- icalerror_clear_errno();
-
- for (i = 1; i<NUMCOMP+1; i++){
-
- /*rtime.start.month = i%12;*/
- rtime.start.month = i;
- rtime.end = rtime.start;
- rtime.end.hour++;
-
- for (itr = icalcluster_get_first_component(cluster,
- ICAL_ANY_COMPONENT);
- itr != 0;
- itr = icalcluster_get_next_component(cluster,
- ICAL_ANY_COMPONENT)){
- icalcomponent *clone, *inner;
- icalproperty *p;
-
- inner = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
- if (inner == 0){
- continue;
- }
-
- /* Change the dtstart and dtend times in the component
- pointed to by Itr*/
-
- clone = icalcomponent_new_clone(itr);
- inner = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
-
- assert(icalerrno == ICAL_NO_ERROR);
- assert(inner !=0);
-
- /* DTSTART*/
- p = icalcomponent_get_first_property(inner,ICAL_DTSTART_PROPERTY);
- assert(icalerrno == ICAL_NO_ERROR);
-
- if (p == 0){
- p = icalproperty_new_dtstart(rtime.start);
- icalcomponent_add_property(inner,p);
- } else {
- icalproperty_set_dtstart(p,rtime.start);
- }
- assert(icalerrno == ICAL_NO_ERROR);
-
- /* DTEND*/
- p = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY);
- assert(icalerrno == ICAL_NO_ERROR);
-
- if (p == 0){
- p = icalproperty_new_dtstart(rtime.end);
- icalcomponent_add_property(inner,p);
- } else {
- icalproperty_set_dtstart(p,rtime.end);
- }
- assert(icalerrno == ICAL_NO_ERROR);
-
- printf("\n----------\n%s\n---------\n",icalcomponent_as_ical_string(inner));
-
- error = icalstore_add_component(s,inner);
-
- assert(icalerrno == ICAL_NO_ERROR);
-
- }
-
- }
-
- gauge =
- icalcomponent_vanew(
- ICAL_VCALENDAR_COMPONENT,
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_summary(
- "Submit Income Taxes",
- icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
- 0),
- 0),
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_summary(
- "Bastille Day Party",
- icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
- 0),
- 0),
- 0);
-
-#if 0
-
-
- icalstore_select(s,gauge);
-
- for(c = icalstore_first(s); c != 0; c = icalstore_next(s)){
-
- printf("Got one! (%d)\n", count++);
-
- if (c != 0){
- printf("%s", icalcomponent_as_ical_string(c));;
- if (icalstore_store(s2,c) == 0){
- printf("Failed to write!\n");
- }
- icalcomponent_free(c);
- } else {
- printf("Failed to get component\n");
- }
- }
-
-
- icalstore_free(s2);
-#endif
-
-
- for(c = icalstore_get_first_component(s);
- c != 0;
- c = next){
-
- next = icalstore_get_next_component(s);
-
- if (c != 0){
- /*icalstore_remove_component(s,c);*/
- printf("%s", icalcomponent_as_ical_string(c));;
- } else {
- printf("Failed to get component\n");
- }
-
-
- }
-
- icalstore_free(s);
- return 0;
-}
-
-void test_calendar()
-{
- icalcomponent *comp;
- icalcluster *c;
- icalstore *s;
- icalcalendar* calendar = icalcalendar_new("calendar");
- icalerrorenum error;
- struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
-
- comp = icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_new_version("2.0"),
- icalproperty_new_description("This is an event"),
- icalproperty_new_dtstart(atime),
- icalproperty_vanew_comment(
- "Another Comment",
- icalparameter_new_cn("A Common Name 1"),
- icalparameter_new_cn("A Common Name 2"),
- icalparameter_new_cn("A Common Name 3"),
- icalparameter_new_cn("A Common Name 4"),
- 0),
- icalproperty_vanew_xlicerror(
- "This is only a test",
- icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR),
- 0),
-
- 0);
-
-
- s = icalcalendar_get_booked(calendar);
-
- error = icalstore_add_component(s,comp);
-
- assert(error == ICAL_NO_ERROR);
-
- c = icalcalendar_get_properties(calendar);
-
- error = icalcluster_add_component(c,icalcomponent_new_clone(comp));
-
- assert(error == ICAL_NO_ERROR);
-
- icalcalendar_free(calendar);
-
-}
-
-
-int main(int argc, char *argv[])
-{
-
-
- printf("\n------------Test Cluster---------------\n");
- test_cluster();
-
-#if 0
-
- printf("\n------------Test Store---------------\n");
- test_store();
-
-
-
- printf("\n------------Test Calendar---------------\n");
- test_calendar();
-
-#endif
-
- return 0;
-}
-
-
-
diff --git a/libical/src/test/stow.c b/libical/src/test/stow.c
deleted file mode 100644
index d7629855c5..0000000000
--- a/libical/src/test/stow.c
+++ /dev/null
@@ -1,533 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: stow.c
- CREATOR: eric 29 April 2000
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 2000 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The Initial Developer of the Original Code is Eric Busboom
-
- ======================================================================*/
-
-
-#include <stdio.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <limits.h> /* for PATH_MAX */
-#include <assert.h>
-#include <stdlib.h>
-#include <sys/utsname.h> /* for uname */
-#include <sys/stat.h> /* for stat */
-#include <unistd.h> /* for stat, getpid */
-
-#include "ical.h"
-#include "icalcalendar.h"
-
-
-char* program_name;
-#define TMPSIZE 2048
-
-enum options {
- STORE_IN_DIR,
- STORE_IN_DB,
- INPUT_IS_EMAIL,
- INPUT_IS_ICAL,
- INPUT_FROM_STDIN,
- INPUT_FROM_FILE
-};
-
-struct options_struct
-{
- enum options storage;
- enum options input_type;
- char* input_file;
- char* input_text;
- char* calid;
- char* caldir;
-};
-
-
-
-char* lowercase(char* str)
-{
- char* p = 0;
- char* new = strdup(str);
-
- if(str ==0){
- return 0;
- }
-
- for(p = new; *p!=0; p++){
- *p = tolower(*p);
- }
-
- return new;
-}
-
-char* get_local_attendee(struct options_struct *opt)
-{
- char attendee[PATH_MAX];
- char* user = getenv("USER");
-
- struct utsname uts;
-
- uname(&uts);
-
- /* HACK nodename may not be a fully qualified domain name */
- snprintf(attendee,PATH_MAX,"%s@%s",user,uts.nodename);
-
- return lowercase(attendee);
-}
-
-void usage(char *message)
-{
-}
-
-icalcomponent* get_first_real_component(icalcomponent *comp)
-{
- icalcomponent *c;
-
- for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
- c != 0;
- c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)){
- if (icalcomponent_isa(c) == ICAL_VEVENT_COMPONENT ||
- icalcomponent_isa(c) == ICAL_VTODO_COMPONENT ||
- icalcomponent_isa(c) == ICAL_VJOURNAL_COMPONENT )
- {
- return c;
- }
- }
-
- return 0;
-}
-
-
-
-char* make_mime(char* to, char* from, char* subject,
- char* text_message, char* method, char* ical_message)
-{
- size_t size = strlen(to)+strlen(from)+strlen(subject)+
- strlen(text_message)+ strlen(ical_message)+TMPSIZE;
-
- char mime_part_1[TMPSIZE];
- char mime_part_2[TMPSIZE];
- char content_id[TMPSIZE];
- char boundary[TMPSIZE];
- struct utsname uts;
- char* m;
-
-
- if ((m = malloc(sizeof(char)*size)) == 0){
- fprintf(stderr,"%s: Can't allocate memory: %s\n",program_name,strerror(errno));
- exit(1);
- }
-
- uname(&uts);
-
- srand(time(0)<<getpid());
- sprintf(content_id,"%d-%d@%s",time(0),rand(),uts.nodename);
- sprintf(boundary,"%d-%d-%s",time(0),rand(),uts.nodename);
-
- sprintf(mime_part_1,"Content-ID: %s\n\
-Content-type: text/plain\n\
-Content-Description: Text description of error message\n\n\
-%s\n\n%s",
- content_id,text_message,boundary);
-
- if(ical_message != 0 && method != 0){
- sprintf(mime_part_2,"\nContent-ID: %s\n\
-Content-type: text/calendar; method=%s\n\
-Content-Description: ICal component reply\n\n\
-%s\n\n%s--\n",
- content_id,method,ical_message,boundary);
- }
-
- sprintf(m,"To: %s\n\
-From: %s\n\
-Subject: %s\n\
-MIME-Version: 1.0\n\
-Content-ID: %s\n\
-Content-Type: multipart/mixed; boundary=\"%s\"\n\
-\n\
- This is a multimedia message in MIME format\n\
-\n\
-%s
-",
- to,from,subject,content_id,boundary,boundary,
- mime_part_1);
-
- if(ical_message != 0 && method != 0){
- strcat(m, mime_part_2);
- } else {
- strcat(m,"--\n");
- }
-
- return m;
-}
-
-/* The incoming component had fatal errors */
-void return_failure(icalcomponent* comp, char* message, struct options_struct *opt)
-{
-
-
- fputs(make_mime("Dest", "Source", "iMIP error",
- message, "reply",
- icalcomponent_as_ical_string(comp)),stdout);
-
-}
-
-/* The program had a fatal error and could not process the incoming component*/
-void return_error(icalcomponent* comp, char* message, struct options_struct *opt)
-{
-
-
- fputs(make_mime("Dest", "Source", "iMIP system failure",
- message, 0,0),stdout);
-
-}
-
-char* check_component(icalcomponent* comp, struct options_struct *opt)
-{
- static char static_component_error_str[PATH_MAX];
- char* component_error_str=0;
- icalcomponent* inner;
- int errors = 0;
- icalproperty *p;
- int found_attendee = 0;
-
- /* This do/while loop only executes once because it is being used
- to fake exceptions */
-
- do {
-
- /* Check that the root component is a VCALENDAR */
- if(icalcomponent_isa(comp) != ICAL_VCALENDAR_COMPONENT){
- strcpy(static_component_error_str,
- "Root component is not a VCALENDAR");
- component_error_str = static_component_error_str;
- break;
- }
-
- /* Check that the component passes iTIP restrictions */
-
- errors = icalcomponent_count_errors(comp);
- icalrestriction_check(comp);
-
- if(errors != icalcomponent_count_errors(comp)){
- strcpy(static_component_error_str,
- "The component does not conform to iTIP restrictions");
- component_error_str = static_component_error_str;
- break;
- }
-
- /* Check that the component has a METHOD */
-
- if (!icalcomponent_get_first_property(comp,ICAL_METHOD_PROPERTY) == 0)
- {
- strcpy(static_component_error_str,
- "Component does not have a METHOD property");
- component_error_str = static_component_error_str;
- break;
- }
-
- /* Check for this user as an attendee */
-
-
- inner = get_first_real_component(comp);
-
- for(p = icalcomponent_get_first_property(inner,ICAL_ATTENDEE_PROPERTY);
- p != 0;
- p = icalcomponent_get_next_property(inner,ICAL_ATTENDEE_PROPERTY)){
-
- char* s = icalproperty_get_attendee(p);
- char* lower_attendee = lowercase(s);
- char* local_attendee = get_local_attendee(opt);
-
- /* Check that attendee begins with "mailto:" */
- if (strncmp(lower_attendee,"mailto:",7) == 0){
- /* skip over the mailto: part */
- lower_attendee += 7;
-
- if(strcmp(lower_attendee,local_attendee) == 0){
- found_attendee = 1;
- }
-
- lower_attendee -= 7;
-
- free(local_attendee);
- free(lower_attendee);
-
- }
- }
-
- if (found_attendee == 0){
- char* local_attendee = get_local_attendee(opt);
- snprintf(static_component_error_str,PATH_MAX,
- "This target user (%s) is not listed as an attendee",
- local_attendee );
- component_error_str = static_component_error_str;
- free(local_attendee);
-
- break;
- }
-
- } while(0);
-
- return component_error_str;
-}
-
-void get_options(int argc, char* argv[], struct options_struct *opt)
-{
- opt->storage = STORE_IN_DIR;
- opt->input_type = INPUT_FROM_STDIN;
- opt->input_file = 0;
- opt->input_text = 0;
- opt->calid = 0;
- opt->caldir = 0;
-}
-
-char* check_options(struct options_struct *opt)
-{
- return 0;
-}
-
-void store_component(icalcomponent *comp, icalcalendar* cal,
- struct options_struct *opt)
-{
-
- icalcluster *incoming = 0;
- icalerrorenum error;
-
- incoming = icalcalendar_get_incoming(cal);
-
- if (incoming == 0){
- fprintf(stderr,"%s: Failed to get incoming component directory: %s\n",
- program_name, icalerror_strerror(icalerrno));
- exit(1);
- }
-
- error = icalcluster_add_component(incoming,comp);
-
- if (error != ICAL_NO_ERROR){
- fprintf(stderr,"%s: Failed to write incoming component: %s\n",
- program_name, icalerror_strerror(icalerrno));
- exit(1);
- }
-
- error = icalcluster_commit(incoming);
-
- if (error != ICAL_NO_ERROR){
- fprintf(stderr,"%s: Failed to commit incoming cluster: %s\n",
- program_name, icalerror_strerror(icalerrno));
- exit(1);
- }
-
- return;
-}
-
-enum file_type
-{
- ERROR,
- NO_FILE,
- DIRECTORY,
- REGULAR,
- OTHER
-};
-
-enum file_type test_file(char *path)
-{
- struct stat sbuf;
- enum file_type type;
-
- errno = 0;
-
- /* Check if the path already exists and if it is a directory*/
- if (stat(path,&sbuf) != 0){
-
- /* A file by the given name does not exist, or there was
- another error */
- if(errno == ENOENT)
- {
- type = NO_FILE;
- } else {
- type = ERROR;
- }
-
- } else {
- /* A file by the given name exists, but is it a directory? */
-
- if (S_ISDIR(sbuf.st_mode)){
- type = DIRECTORY;
- } else if(S_ISREG(sbuf.st_mode)){
- type = REGULAR;
- } else {
- type = OTHER;
- }
- }
-
- return type;
-}
-
-icalcalendar* get_calendar(icalcomponent* comp, struct options_struct *opt)
-{
-
- struct stat sbuf;
- char calpath[PATH_MAX];
- char facspath[PATH_MAX];
- char* home = getenv("HOME");
- char* user = getenv("USER");
- enum file_type type;
- icalcalendar* cal;
-
- snprintf(facspath,PATH_MAX,"%s/.facs",home);
-
- type = test_file(facspath);
-
- errno = 0;
- if (type == NO_FILE){
-
- if(mkdir(facspath,0775) != 0){
- fprintf(stderr,"%s: Failed to create calendar store directory %s: %s\n",
- program_name,facspath, strerror(errno));
- exit(1);
- } else {
- printf("%s: Creating calendar store directory %s\n",program_name,facspath);
- }
-
- } else if(type==REGULAR || type == ERROR){
- fprintf(stderr,"%s: Cannot create calendar store directory %s\n",
- program_name,facspath);
- exit(1);
- }
-
-
-
- snprintf(calpath,PATH_MAX,"%s/%s",facspath,user);
-
- type = test_file(calpath);
-
- errno = 0;
-
- if (type == NO_FILE){
-
- if(mkdir(calpath,0775) != 0){
- fprintf(stderr,"%s: Failed to create calendar directory %s: %s\n",
- program_name,calpath, strerror(errno));
- } else {
- printf("%s: Creating calendar store directory %s\n",program_name,facspath);
- }
- } else if(type==REGULAR || type == ERROR){
- fprintf(stderr,"%s: Cannot create calendar directory %s\n",
- program_name,calpath);
- exit(1);
- }
-
- cal = icalcalendar_new(calpath);
-
- if(cal == 0){
- fprintf(stderr,"%s: Failed to open calendar at %s: %s",
- program_name,calpath,icalerror_strerror(icalerrno));
- exit(1);
- }
-
- return cal;
-
-}
-
-char* read_stream(char *s, size_t size, void *d)
-{
- char *c = fgets(s,size, (FILE*)d);
-
- return c;
-}
-
-icalcomponent* read_component(struct options_struct *opt)
-{
- FILE *stream;
- icalcomponent *comp;
- icalparser* parser = icalparser_new();
- char* line;
-
- if(opt->input_type == INPUT_FROM_FILE){
- stream = fopen(opt->input_file,"r");
-
- if (stream == 0){
- perror("Can't open input file");
- exit(1);
- }
-
- } else {
- stream = stdin;
- }
-
- assert(stream != 0);
- icalparser_set_gen_data(parser,stream);
-
- do {
- line = icalparser_get_line(parser,read_stream);
-
- comp = icalparser_add_line(parser,line);
-
- if (comp != 0){
- icalparser_claim(parser);
- return comp;
- }
-
- } while ( line != 0);
-
- if(opt->input_type == INPUT_FROM_FILE){
- fclose(stream);
- }
-
- return comp;
- }
-
-int main(int argc, char* argv[] )
-{
- char* options_error_str;
- char* component_error_str;
- icalcalendar* cal;
- icalcomponent* comp, *reply;
- struct options_struct opt;
-
- program_name = argv[0];
-
- get_options(argc, argv, &opt);
-
- if ( (options_error_str = check_options(&opt)) != 0 ){
- usage(options_error_str);
- exit(1);
- }
-
- comp = read_component(&opt);
-
- if ( (component_error_str = check_component(comp,&opt)) != 0){
- return_failure(comp, component_error_str, &opt);
- exit(1);
- }
-
- cal = get_calendar(comp,&opt);
-
- store_component(comp,cal, &opt);
-
- icalcomponent_free(comp);
- icalcalendar_free(cal);
-
- exit(0);
-}
-
diff --git a/libical/src/test/test-component.icd b/libical/src/test/test-component.icd
deleted file mode 100644
index 3fe2995a83..0000000000
--- a/libical/src/test/test-component.icd
+++ /dev/null
@@ -1,23 +0,0 @@
-BEGIN:VCALENDAR
-X-LIC-CLUSTERCOUNT
- :0
-DTSTART
- :00000000T000000
-DTEND
- :00000000T000000
-BEGIN:VCALENDAR
-PRODID:-//RDU Software//NONSGML HandCal//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-REQUEST-STATUS:2.8;Repeating event ignored. Scheduled as a single
- event;RRULE
-REQUEST-STATUS:3.0;Invalid Property Name;FOO
-UID:guid-1@host1.com
-SEQUENCE:0
-DTSTAMP:19970603T094000Z
-END:VEVENT
-END:VCALENDAR
-END:VCALENDAR
diff --git a/libical/src/test/usecases.c b/libical/src/test/usecases.c
deleted file mode 100644
index 6c27454ae3..0000000000
--- a/libical/src/test/usecases.c
+++ /dev/null
@@ -1,553 +0,0 @@
-/* -*- Mode: C -*-
- ======================================================================
- FILE: usecases.c
- CREATOR: eric 03 April 1999
-
- DESCRIPTION:
-
- $Id$
- $Locker$
-
- (C) COPYRIGHT 1999 Eric Busboom
- http://www.softwarestudio.org
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
- The original author is Eric Busboom
- The original code is usecases.c
-
-
- ======================================================================*/
-
-#include "ical.h"
-#include <assert.h>
-#include <string.h> /* for strdup */
-#include <stdlib.h> /* for malloc */
-#include <stdio.h> /* for printf */
-#include <time.h> /* for time() */
-#include "icalmemory.h"
-
-/*
-
- Here is the example iCal object that the examples routines in this
- file will use:
-
- BEGIN:VCALENDAR
- PRODID:-//RDU Software//NONSGML HandCal//EN
- VERSION:2.0
- BEGIN:VTIMEZONE
- BEGIN:VEVENT
- DTSTAMP:19980309T231000Z
- UID:guid-1.host1.com
- ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
- ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
- MAILTO:employee-A@host.com
- DESCRIPTION:Project XYZ Review Meeting
- CREATED:19980309T130000Z
- SUMMARY:XYZ Project Review
- DTSTART;TZID=US-Eastern:19980312T083000
- DTEND;TZID=US-Eastern:19980312T093000
- END:VEVENT
- END:VCALENDAR
-
-*/
-
-char str[] = "BEGIN:VCALENDAR\
-PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\
-VERSION:2.0\
-BEGIN:VEVENT\
-DTSTAMP:19980309T231000Z\
-UID:guid-1.host1.com\
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\
-DESCRIPTION:Project XYZ Review Meeting\
-CATEGORIES:MEETING\
-CREATED:19980309T130000Z\
-SUMMARY:XYZ Project Review\
-DTSTART;TZID=US-Eastern:19980312T083000\
-DTEND;TZID=US-Eastern:19980312T093000\
-END:VEVENT\
-END:VCALENDAR";
-
-/* Creating iCal Components
-
- There are two ways to create new component in libical. You can
- build the component from primitive parts, or you can create it
- from a string.
-
- There are two variations of the API for building the component from
- primitive parts. In the first variation, you add each parameter and
- value to a property, and then add each property to a
- component. This results in a long series of function calls. This
- style is show in create_new_component()
-
- The second variation uses vargs lists to nest many primitive part
- constructors, resulting in a compact, neatly formated way to create
- components. This style is shown in create_new_component_with_va_args()
-
-
-
-*/
-
-icalcomponent* create_new_component()
-{
-
- /* variable definitions */
- icalcomponent* calendar;
- icalcomponent* event;
- struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
- struct icalperiodtype rtime;
- icalproperty* property;
-
- /* Define a time type that will use as data later. */
- rtime.start = icaltimetype_from_timet( time(0),0);
- rtime.end = icaltimetype_from_timet( time(0),0);
- rtime.end.hour++;
-
- /* Create calendar and add properties */
-
- calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
-
- /* Nearly every libical function call has the same general
- form. The first part of the name defines the 'class' for the
- function, and the first argument will be a pointer to a struct
- of that class. So, icalcomponent_ functions will all take
- icalcomponent* as their first argument. */
-
- /* The next call creates a new proeprty and immediately adds it to the
- 'calendar' component. */
-
- icalcomponent_add_property(
- calendar,
- icalproperty_new_version(strdup("2.0"))
- );
-
- /* Note the use of strdup() in the previous and next call. All
- properties constructors for properties with value types of
- TEXT will take control of the string you pass into them. Since
- the string '2.0' is a static string, we need to duplicate it in
- new memory before giving it to the property */
-
- /* Here is the short version of the memory rules:
-
- If the routine name has "new" in it:
- Caller owns the returned memory.
- If you pass in a string, the routine takes the memory.
-
- If the routine name has "add" in it:
- The routine takes control of the component, property,
- parameter or value memory.
-
- If the routine returns a string ( "get" and "as_ical_string" )
- The library owns the returned memory.
-
- There are more rules, so refer to the documentation for more
- details.
-
- */
-
- icalcomponent_add_property(
- calendar,
- icalproperty_new_prodid(strdup("-//RDU Software//NONSGML HandCal//EN"))
- );
-
- /* Add an event */
-
- event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
-
- icalcomponent_add_property(
- event,
- icalproperty_new_dtstamp(atime)
- );
-
- /* In the previous call, atime is a struct, and it is passed in by value.
- This is how all compound types of values are handled. */
-
- icalcomponent_add_property(
- event,
- icalproperty_new_uid(strdup("guid-1.host1.com"))
- );
-
- /* add a property that has parameters */
- property = icalproperty_new_organizer(strdup("mailto:mrbig@host.com"));
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_role(ICAL_ROLE_CHAIR)
- );
-
- icalcomponent_add_property(event,property);
-
- /* In this style of component creation, you need to use an extra
- call to add parameters to properties, but the form of this
- operation is the same as adding a property to a component */
-
- /* add another property that has parameters */
- property = icalproperty_new_attendee(strdup("mailto:employee-A@host.com"));
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT)
- );
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_rsvp(1)
- );
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_cutype(ICAL_CUTYPE_GROUP)
- );
-
- icalcomponent_add_property(event,property);
-
-
- /* more properties */
-
- icalcomponent_add_property(
- event,
- icalproperty_new_description(strdup("Project XYZ Review Meeting"))
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_categories(strdup("MEETING"))
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_class(strdup("PUBLIC"))
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_created(atime)
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_summary(strdup("XYZ Project Review"))
- );
-
- property = icalproperty_new_dtstart(atime);
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_tzid(strdup("US-Eastern"))
- );
-
- icalcomponent_add_property(event,property);
-
-
- property = icalproperty_new_dtend(atime);
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_tzid(strdup("US-Eastern"))
- );
-
- icalcomponent_add_property(event,property);
-
- icalcomponent_add_property(
- event,
- icalproperty_new_location(strdup("1CP Conference Room 4350"))
- );
-
- icalcomponent_add_component(calendar,event);
-
- return calendar;
-}
-
-
-/* Now, create the same component as in the previous routine, but use
-the constructor style. */
-
-icalcomponent* create_new_component_with_va_args()
-{
-
- /* This is a similar set up to the last routine */
- icalcomponent* calendar;
- struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
- struct icalperiodtype rtime;
-
- rtime.start = icaltimetype_from_timet( time(0),0);
- rtime.end = icaltimetype_from_timet( time(0),0);
- rtime.end.hour++;
-
- /* Some of these routines are the same as those in the previous
- routine, but we've also added several 'vanew' routines. These
- 'vanew' routines take a list of properties, parameters or
- values and add each of them to the parent property or
- component. */
-
- calendar =
- icalcomponent_vanew(
- ICAL_VCALENDAR_COMPONENT,
- icalproperty_new_version(strdup("2.0")),
- icalproperty_new_prodid(strdup("-//RDU Software//NONSGML HandCal//EN")),
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_new_dtstamp(atime),
- icalproperty_new_uid(strdup("guid-1.host1.com")),
- icalproperty_vanew_organizer(
- strdup("mailto:mrbig@host.com"),
- icalparameter_new_role(ICAL_ROLE_CHAIR),
- 0
- ),
- icalproperty_vanew_attendee(
- strdup("mailto:employee-A@host.com"),
- icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
- icalparameter_new_rsvp(1),
- icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
- 0
- ),
- icalproperty_new_description(strdup("Project XYZ Review Meeting")),
- icalproperty_new_categories(strdup("MEETING")),
- icalproperty_new_class(strdup("PUBLIC")),
- icalproperty_new_created(atime),
- icalproperty_new_summary(strdup("XYZ Project Review")),
- icalproperty_vanew_dtstart(
- atime,
- icalparameter_new_tzid(strdup("US-Eastern")),
- 0
- ),
- icalproperty_vanew_dtend(
- atime,
- icalparameter_new_tzid(strdup("US-Eastern")),
- 0
- ),
- icalproperty_new_location(strdup("1CP Conference Room 4350")),
- 0
- ),
- 0
- );
-
-
- /* Note that properties with no parameters can use the regular
- 'new' constructor, while those with parameters use the 'vanew'
- constructor. And, be sure that the last argument in the 'vanew'
- call is a zero. Without, your program will probably crash. */
-
- return calendar;
-}
-
-
-/* Now, lets try to get a particular parameter out of a
- component. This routine will return a list of strings of all
- attendees who are required. Note that this routine assumes that the
- component that we pass in is a VEVENT; the top level component we
- created in the above two routines is a VCALENDAR */
-
-char *attendees[10];
-#define MAX_ATTENDEES 10;
-
-char** get_required_attendees(icalcomponent* event)
-{
- icalproperty* p;
- icalparameter* parameter;
- int c=0;
-
- assert(event != 0);
- assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
-
- /* This loop iterates over all of the ATTENDEE properties in the
- event */
-
- /* Yes, the iteration routines save their state in the event
- struct, so the are not thread safe unless you lock the whole
- event. */
-
- for(
- p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
- p != 0;
- p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
- ) {
-
- /* Get the first ROLE parameter in the property. There should
- only be one, so we wont bother to iterate over them. */
-
- parameter = icalproperty_get_first_parameter(p,ICAL_ROLE_PARAMETER);
-
- /* If the parameter indicates the participant is required, get
- the attendees name and stick a copy of it into the output
- array */
-
- if ( icalparameter_get_role(parameter) == ICAL_ROLE_REQPARTICIPANT)
- {
- attendees[c++] = strdup(icalproperty_get_attendee(p));
- }
- }
-
- return attendees;
-}
-
-/* Here is a similar example. If an attendee has a PARTSTAT of
- NEEDSACTION or has no PARTSTAT parameter, change it to
- TENTATIVE. */
-
-void update_attendees(icalcomponent* event)
-{
- icalproperty* p;
- icalparameter* parameter;
-
- assert(event != 0);
- assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
-
- for(
- p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
- p != 0;
- p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
- ) {
-
- parameter = icalproperty_get_first_parameter(p,ICAL_PARTSTAT_PARAMETER);
-
- if (parameter == 0) {
-
- /* There was no PARTSTAT parameter, so add one. */
- icalproperty_add_parameter(
- p,
- icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
- );
-
- } else if (icalparameter_get_partstat(parameter) == ICAL_PARTSTAT_NEEDSACTION) {
- /* Remove the NEEDSACTION parameter and replace it with
- TENTATIVE */
-
- icalproperty_remove_parameter(p,ICAL_PARTSTAT_PARAMETER);
-
- /* Don't forget to free it */
- icalparameter_free(parameter);
-
- /* Add a new one */
- icalproperty_add_parameter(
- p,
- icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
- );
- }
-
- }
-}
-
-/* Here are some examples of manipulating properties */
-
-void test_properties()
-{
- icalproperty *prop;
- icalparameter *param;
- icalvalue *value;
-
- icalproperty *clone;
-
- /* Create a new property */
- prop = icalproperty_vanew_comment(
- strdup("Another Comment"),
- icalparameter_new_cn("A Common Name 1"),
- icalparameter_new_cn("A Common Name 2"),
- icalparameter_new_cn("A Common Name 3"),
- icalparameter_new_cn("A Common Name 4"),
- 0);
-
- /* Iterate through all of the parameters in the property */
- for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PROPERTY);
- param != 0;
- param = icalproperty_get_next_parameter(prop,ICAL_ANY_PROPERTY)) {
-
- printf("Prop parameter: %s\n",icalparameter_get_cn(param));
- }
-
- /* Get a string representation of the property's value */
- printf("Prop value: %s\n",icalproperty_get_comment(prop));
-
- /* Spit out the property in its RFC 2445 representation */
- printf("As iCAL string:\n %s\n",icalproperty_as_ical_string(prop));
-
- /* Make a copy of the property. Caller owns the memory */
- clone = icalproperty_new_clone(prop);
-
- /* Get a reference to the value within the clone property */
- value = icalproperty_get_value(clone);
-
- printf("Value: %s",icalvalue_as_ical_string(value));
-
- /* Free the original and the clone */
- icalproperty_free(clone);
- icalproperty_free(prop);
-
-}
-
-
-
-/* Here are some ways to work with values. */
-void test_values()
-{
- icalvalue *v;
- icalvalue *copy;
-
- v = icalvalue_new_caladdress(strdup("cap://value/1"));
- printf("caladdress 1: %s\n",icalvalue_get_caladdress(v));
-
- icalvalue_set_caladdress(v,strdup("cap://value/2"));
- printf("caladdress 2: %s\n",icalvalue_get_caladdress(v));
- printf("String: %s\n",icalvalue_as_ical_string(v));
-
- copy = icalvalue_new_clone(v);
- printf("Clone: %s\n",icalvalue_as_ical_string(v));
- icalvalue_free(v);
- icalvalue_free(copy);
-
-
-}
-
-void test_parameters()
-{
- icalparameter *p;
-
- p = icalparameter_new_cn("A Common Name");
-
- printf("Common Name: %s\n",icalparameter_get_cn(p));
-
- printf("As String: %s\n",icalparameter_as_ical_string(p));
-}
-
-
-int main(int argc, char *argv[])
-{
- icalcomponent *c1;
- icalcomponent *c2;
- icalcomponent *vevent;
- char **attendees;
-
- c1 = create_new_component();
- c2 = create_new_component_with_va_args();
-
- /* Extract the VEVENT component from the component */
-
- vevent = icalcomponent_get_first_component(c1,ICAL_VEVENT_COMPONENT);
-
- attendees = get_required_attendees(vevent);
-
- printf("Attendees: %s\n",attendees[0]);
-
- /* Now print out the component as a string. Remember that the
- library retains control of the memory returned by
- icalcomponent_as_ical_string. Do not sotre references to it or
- try to free it. It is stored on an internal ring buffer,and the
- library will eventuall reclaim it. */
-
- printf("%s\n",icalcomponent_as_ical_string(c1));
-
- return 0;
-
-}
-
-
-
diff --git a/libical/test-data/.cvsignore b/libical/test-data/.cvsignore
deleted file mode 100644
index b840c21800..0000000000
--- a/libical/test-data/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile.in
-Makefile \ No newline at end of file
diff --git a/libical/test-data/0 b/libical/test-data/0
deleted file mode 100644
index 3d7fb999cb..0000000000
--- a/libical/test-data/0
+++ /dev/null
@@ -1,9 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//hacksw/handcal//NONSGML v1.0//EN
-BEGIN:VEVENT
-DTSTART:19970714T170000Z
-DTEND:19970715T035959Z
-SUMMARY:Bastille Day Party
-END:VEVENT
-END:VCALENDAR
diff --git a/libical/test-data/1 b/libical/test-data/1
deleted file mode 100644
index 6a368d9997..0000000000
--- a/libical/test-data/1
+++ /dev/null
@@ -1,39 +0,0 @@
-BEGIN:VCALENDAR
-PRODID:"-//RDU Software//NONSGML HandCal//EN"
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-BEGIN:STANDARD
-DTSTART:19981025T020000
-RDATE:19981025T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19990404T020000
-RDATE:19990404T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTAMP:19980309T231000Z
-UID:guid-1.host1.com
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:mailto:Employee-B@HOST.com
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MailTo:Eric@Agony.Qualcomm.com
-DESCRIPTION:Project XYZ Review Meeting
-CATEGORIES:MEETING
-CLASS:PUBLIC
-CREATED:19980309T130000Z
-SUMMARY:XYZ Project Review
-DTSTAR;TZID=US-Eastern:19980312T083000
-DTEND;TZID=US-Eastern:19980312T093000
-LOCATION:1CP Conference
-Room 4350
-END:VEVENT
-END:VCALENDAR
-
diff --git a/libical/test-data/1.1 b/libical/test-data/1.1
deleted file mode 100644
index a7c92c33bd..0000000000
--- a/libical/test-data/1.1
+++ /dev/null
@@ -1,13 +0,0 @@
-BEGIN:VCALENDAR
-DURATION:P15DT5H0M20S
-DURATION:P7W
-URL;CN=John Smith:http://example.com/urivalue.html
-X-SKI-TITLE;RSVP=TRUE: This is an extension property
-SUMMARY:"No Property"
-SUMMARY;RSVP=TRUE;RSVP=FALSE:Calendaring Interoperability Planning Meeting
-SUMMARY;ALTREP=This is an xname:altrep
-SUMMARY;CUTYPE=DESCRIPTION is a keyword:Xname parameter
-DTEND:19990605
-DTSTART:19990605T103012
-CATEGORIES;RSVP=TRUE;RSVP=FALSE:one,two
-END:VCALENDAR
diff --git a/libical/test-data/2 b/libical/test-data/2
deleted file mode 100644
index 50ba609ab3..0000000000
--- a/libical/test-data/2
+++ /dev/null
@@ -1,22 +0,0 @@
-BEGIN:VCALENDAR
-METHOD:xyz
-VERSION:2.0
-PRODID:-//ABC Corporation//NONSGML
- My Product//EN
-BEGIN:VEVENT
-DTSTAMP:19970324T1200Z
-SEQUENCE:0
-UID:uid3@host1.com
-ORGANIZER:MAILTO:jdoe@host1.com
-ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host1.com
-DTSTART:19970324T123000Z
-DTEND:19970324T210000Z
-CATEGORIES:MEETING,PROJECT
-CLASS:PUBLIC
-SUMMARY:Calendaring Interoperability Planning Meeting
-DESCRIPTION:Discuss how we can test c&s interoperability\n
- using iCalendar and other IETF standards.
-LOCATION:LDB Lobby
-ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/conf/bkgrnd.ps
-END:VEVENT
-END:VCALENDAR
diff --git a/libical/test-data/2445.ics b/libical/test-data/2445.ics
deleted file mode 100644
index f225f26331..0000000000
--- a/libical/test-data/2445.ics
+++ /dev/null
@@ -1,321 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//hacksw/handcal//NONSGML v1.0//EN
-BEGIN:VEVENT
-DTSTART:19970714T170000Z
-DTEND:19970715T035959Z
-SUMMARY:Bastille Day Party
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123401@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970903T163000Z
-DTEND:19970903T190000Z
-SUMMARY:Annual Employee Review
-CLASS:PRIVATE
-CATEGORIES:BUSINESS,HUMAN RESOURCES
-END:VEVENT
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123402@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970401T163000Z
-DTEND:19970402T010000Z
-SUMMARY:Laurel is in sensitivity awareness class.
-CLASS:PUBLIC
-CATEGORIES:BUSINESS,HUMAN RESOURCES
-TRANSP:TRANSPARENT
-END:VEVENT
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123403@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19971102
-SUMMARY:Our Blissful Anniversary
-CLASS:CONFIDENTIAL
-CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
-RRULE:FREQ=YEARLY
-END:VEVENT
-
-BEGIN:VTODO
-UID:19970901T130000Z-123404@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970415T133000Z
-DUE:19970416T045959Z
-SUMMARY:1996 Income Tax Preparation
-CLASS:CONFIDENTIAL
-CATEGORIES:FAMILY,FINANCE
-PRIORITY:1
-STATUS:NEEDS-ACTION
-END:VTODO
-BEGIN:VJOURNAL
-UID:19970901T130000Z-123405@host.com
-DTSTAMP:19970901T1300Z
-DTSTART;VALUE=DATE:19970317
-SUMMARY:Staff meeting minutes
-DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa
- and Bob. Aurora project plans were reviewed. There is currently
- no budget reserves for this project. Lisa will escalate to
- management. Next meeting on Tuesday.\n
- 2. Telephone Conference: ABC Corp. sales representative called
- to discuss new printer. Promised to get us a demo by Friday.\n
- 3. Henry Miller (Handsoff Insurance): Car was totaled by tree.
- Is looking into a loaner car. 654-2323 (tel).
-END:VJOURNAL
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jane_doe@host1.com
-ATTENDEE:MAILTO:john_public@host2.com
-DTSTART:19971015T050000Z
-DTEND:19971016T050000Z
-DTSTAMP:19970901T083000Z
-END:VFREEBUSY
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jane_doe@host1.com
-ATTENDEE:MAILTO:john_public@host2.com
-DTSTAMP:19970901T100000Z
-FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
- 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
-URL:http://host2.com/pub/busy/jpublic-01.ifb
-COMMENT:This iCalendar file contains busy time information for
- the next three months.
-END:VFREEBUSY
-BEGIN:VFREEBUSY
-ORGANIZER:jsmith@host.com
-DTSTART:19980313T141711Z
-DTEND:19980410T141711Z
-FREEBUSY:19980314T233000Z/19980315T003000Z
-FREEBUSY:19980316T153000Z/19980316T163000Z
-FREEBUSY:19980318T030000Z/19980318T040000Z
-URL:http://www.host.com/calendar/busytime/jsmith.ifb
-END:VFREEBUSY
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19971026T020000
-RDATE:19971026T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19971026T020000
-RDATE:19970406T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-LAST-MODIFIED:19870101T000000Z
-TZURL:http://zones.stds_r_us.net/tz/US-Eastern
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID:US--Fictitious-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID:US--Fictitious-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19990424T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VALARM
-TRIGGER;VALUE=DATE-TIME:19970317T133000Z
-REPEAT:4
-DURATION:PT15M
-ACTION:AUDIO
-ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud
-END:VALARM
-BEGIN:VALARM
-TRIGGER:-PT30M
-REPEAT:2
-DURATION:PT15M
-ACTION:DISPLAY
-DESCRIPTION:Breakfast meeting with executive\n
- team at 8:30 AM EST.
-END:VALARM
-BEGIN:VALARM
-TRIGGER:-P2D
-ACTION:EMAIL
-ATTENDEE:MAILTO:john_doe@host.com
-SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
-DESCRIPTION:A draft agenda needs to be sent out to the attendees
- to the weekly managers meeting (MGR-LIST). Attached is a
- pointer the document template for the agenda file.
-ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen
- da.doc
-END:VALARM
-BEGIN:VALARM
-TRIGGER;VALUE=DATE-TIME:19980101T050000Z
-REPEAT:23
-DURATION:PT1H
-ACTION:PROCEDURE
-ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-
- procs/felizano.exe
-END:VALARM
-BEGIN:VCALENDAR
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-BEGIN:STANDARD
-DTSTART:19981025T020000
-RDATE:19981025T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19990404T020000
-RDATE:19990404T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTAMP:19980309T231000Z
-UID:guid-1.host1.com
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
- MAILTO:employee-A@host.com
-DESCRIPTION:Project XYZ Review Meeting
-CATEGORIES:MEETING
-CLASS:PUBLIC
-CREATED:19980309T130000Z
-SUMMARY:XYZ Project Review
-DTSTART;TZID=US-Eastern:19980312T083000
-DTEND;TZID=US-Eastern:19980312T093000
-LOCATION:1CP Conference Room 4350
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:PUBLISH
-VERSION:2.0
-PRODID:-//ABC Corporation//NONSGML My Product//EN
-BEGIN:VEVENT
-DTSTAMP:19970324T1200Z
-SEQUENCE:0
-UID:uid3@host1.com
-ORGANIZER:MAILTO:jdoe@host1.com
-DTSTART:19970324T123000Z
-DTEND:19970324T210000Z
-CATEGORIES:MEETING,PROJECT
-CLASS:PUBLIC
-SUMMARY:Calendaring Interoperability Planning Meeting
-DESCRIPTION:Discuss how we can test c&s interoperability\n
- using iCalendar and other IETF standards.
-LOCATION:LDB Lobby
-ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/
- conf/bkgrnd.ps
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//ABC Corporation//NONSGML My Product//EN
-BEGIN:VTODO
-DTSTAMP:19980130T134500Z
-SEQUENCE:2
-UID:uid4@host1.com
-ORGANIZER:MAILTO:unclesam@us.gov
-ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
-DUE:19980415T235959
-STATUS:NEEDS-ACTION
-SUMMARY:Submit Income Taxes
-BEGIN:VALARM
-ACTION:AUDIO
-TRIGGER:19980403T120000
-ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-
- files/ssbanner.aud
-REPEAT:4
-DURATION:PT1H
-END:VALARM
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//ABC Corporation//NONSGML My Product//EN
-BEGIN:VJOURNAL
-DTSTAMP:19970324T120000Z
-UID:uid5@host1.com
-ORGANIZER:MAILTO:jsmith@host.com
-STATUS:DRAFT
-CLASS:PUBLIC
-CATEGORIES:Project Report, XYZ, Weekly Meeting
-DESCRIPTION:Project xyz Review Meeting Minutes\n
- Agenda\n1. Review of project version 1.0 requirements.\n2.
- Definition
- of project processes.\n3. Review of project schedule.\n
- Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was
- decided that the requirements need to be signed off by
- product marketing.\n-Project processes were accepted.\n
- -Project schedule needs to account for scheduled holidays
- and employee vacation time. Check with HR for specific
- dates.\n-New schedule will be distributed by Friday.\n-
- Next weeks meeting is cancelled. No meeting until 3/23.
-END:VJOURNAL
-END:VCALENDAR
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//RDU Software//NONSGML HandCal//EN
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jsmith@host.com
-DTSTART:19980313T141711Z
-DTEND:19980410T141711Z
-FREEBUSY:19980314T233000Z/19980315T003000Z
-FREEBUSY:19980316T153000Z/19980316T163000Z
-FREEBUSY:19980318T030000Z/19980318T040000Z
-URL:http://www.host.com/calendar/busytime/jsmith.ifb
-END:VFREEBUSY
-END:VCALENDAR
diff --git a/libical/test-data/2445.vcd b/libical/test-data/2445.vcd
deleted file mode 100644
index 1168324d88..0000000000
--- a/libical/test-data/2445.vcd
+++ /dev/null
@@ -1,329 +0,0 @@
-BEGIN:VCALENDAR
-X-LIC-CLUSTERCOUNT
- :0
-DTSTART
- :00000000T000000
-DTEND
- :00000000T000000
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//hacksw/handcal//NONSGML v1.0//EN
-BEGIN:VEVENT
-DTSTART:19970714T170000Z
-DTEND:19970715T035959Z
-SUMMARY:Bastille Day Party
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123401@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970903T163000Z
-DTEND:19970903T190000Z
-SUMMARY:Annual Employee Review
-CLASS:PRIVATE
-CATEGORIES:BUSINESS,HUMAN RESOURCES
-END:VEVENT
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123402@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970401T163000Z
-DTEND:19970402T010000Z
-SUMMARY:Laurel is in sensitivity awareness class.
-CLASS:PUBLIC
-CATEGORIES:BUSINESS,HUMAN RESOURCES
-TRANSP:TRANSPARENT
-END:VEVENT
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123403@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19971102
-SUMMARY:Our Blissful Anniversary
-CLASS:CONFIDENTIAL
-CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
-RRULE:FREQ=YEARLY
-END:VEVENT
-
-BEGIN:VTODO
-UID:19970901T130000Z-123404@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970415T133000Z
-DUE:19970416T045959Z
-SUMMARY:1996 Income Tax Preparation
-CLASS:CONFIDENTIAL
-CATEGORIES:FAMILY,FINANCE
-PRIORITY:1
-STATUS:NEEDS-ACTION
-END:VTODO
-BEGIN:VJOURNAL
-UID:19970901T130000Z-123405@host.com
-DTSTAMP:19970901T1300Z
-DTSTART;VALUE=DATE:19970317
-SUMMARY:Staff meeting minutes
-DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa
- and Bob. Aurora project plans were reviewed. There is currently
- no budget reserves for this project. Lisa will escalate to
- management. Next meeting on Tuesday.\n
- 2. Telephone Conference: ABC Corp. sales representative called
- to discuss new printer. Promised to get us a demo by Friday.\n
- 3. Henry Miller (Handsoff Insurance): Car was totaled by tree.
- Is looking into a loaner car. 654-2323 (tel).
-END:VJOURNAL
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jane_doe@host1.com
-ATTENDEE:MAILTO:john_public@host2.com
-DTSTART:19971015T050000Z
-DTEND:19971016T050000Z
-DTSTAMP:19970901T083000Z
-END:VFREEBUSY
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jane_doe@host1.com
-ATTENDEE:MAILTO:john_public@host2.com
-DTSTAMP:19970901T100000Z
-FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
- 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
-URL:http://host2.com/pub/busy/jpublic-01.ifb
-COMMENT:This iCalendar file contains busy time information for
- the next three months.
-END:VFREEBUSY
-BEGIN:VFREEBUSY
-ORGANIZER:jsmith@host.com
-DTSTART:19980313T141711Z
-DTEND:19980410T141711Z
-FREEBUSY:19980314T233000Z/19980315T003000Z
-FREEBUSY:19980316T153000Z/19980316T163000Z
-FREEBUSY:19980318T030000Z/19980318T040000Z
-URL:http://www.host.com/calendar/busytime/jsmith.ifb
-END:VFREEBUSY
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19971026T020000
-RDATE:19971026T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19971026T020000
-RDATE:19970406T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-LAST-MODIFIED:19870101T000000Z
-TZURL:http://zones.stds_r_us.net/tz/US-Eastern
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID:US--Fictitious-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID:US--Fictitious-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19990424T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VALARM
-TRIGGER;VALUE=DATE-TIME:19970317T133000Z
-REPEAT:4
-DURATION:PT15M
-ACTION:AUDIO
-ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud
-END:VALARM
-BEGIN:VALARM
-TRIGGER:-PT30M
-REPEAT:2
-DURATION:PT15M
-ACTION:DISPLAY
-DESCRIPTION:Breakfast meeting with executive\n
- team at 8:30 AM EST.
-END:VALARM
-BEGIN:VALARM
-TRIGGER:-P2D
-ACTION:EMAIL
-ATTENDEE:MAILTO:john_doe@host.com
-SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
-DESCRIPTION:A draft agenda needs to be sent out to the attendees
- to the weekly managers meeting (MGR-LIST). Attached is a
- pointer the document template for the agenda file.
-ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen
- da.doc
-END:VALARM
-BEGIN:VALARM
-TRIGGER;VALUE=DATE-TIME:19980101T050000Z
-REPEAT:23
-DURATION:PT1H
-ACTION:PROCEDURE
-ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-
- procs/felizano.exe
-END:VALARM
-BEGIN:VCALENDAR
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-BEGIN:STANDARD
-DTSTART:19981025T020000
-RDATE:19981025T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19990404T020000
-RDATE:19990404T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTAMP:19980309T231000Z
-UID:guid-1.host1.com
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
- MAILTO:employee-A@host.com
-DESCRIPTION:Project XYZ Review Meeting
-CATEGORIES:MEETING
-CLASS:PUBLIC
-CREATED:19980309T130000Z
-SUMMARY:XYZ Project Review
-DTSTART;TZID=US-Eastern:19980312T083000
-DTEND;TZID=US-Eastern:19980312T093000
-LOCATION:1CP Conference Room 4350
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:xyz
-VERSION:2.0
-PRODID:-//ABC Corporation//NONSGML My Product//EN
-BEGIN:VEVENT
-DTSTAMP:19970324T1200Z
-SEQUENCE:0
-UID:uid3@host1.com
-ORGANIZER:MAILTO:jdoe@host1.com
-ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host1.com
-DTSTART:19970324T123000Z
-DTEND:19970324T210000Z
-CATEGORIES:MEETING,PROJECT
-CLASS:PUBLIC
-SUMMARY:Calendaring Interoperability Planning Meeting
-DESCRIPTION:Discuss how we can test c&s interoperability\n
- using iCalendar and other IETF standards.
-LOCATION:LDB Lobby
-ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/
- conf/bkgrnd.ps
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//ABC Corporation//NONSGML My Product//EN
-BEGIN:VTODO
-DTSTAMP:19980130T134500Z
-SEQUENCE:2
-UID:uid4@host1.com
-ORGANIZER:MAILTO:unclesam@us.gov
-ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
-DUE:19980415T235959
-STATUS:NEEDS-ACTION
-SUMMARY:Submit Income Taxes
-BEGIN:VALARM
-ACTION:AUDIO
-TRIGGER;VALUE=DATE-TIME:19980403T120000Z
-ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-
- files/ssbanner.aud
-REPEAT:4
-DURATION:PT1H
-END:VALARM
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//ABC Corporation//NONSGML My Product//EN
-BEGIN:VJOURNAL
-DTSTAMP:19970324T120000Z
-UID:uid5@host1.com
-ORGANIZER:MAILTO:jsmith@host.com
-STATUS:DRAFT
-CLASS:PUBLIC
-CATEGORIES:Project Report, XYZ, Weekly Meeting
-DESCRIPTION:Project xyz Review Meeting Minutes\n
- Agenda\n1. Review of project version 1.0 requirements.\n2.
- Definition of project processes.\n3. Review of project schedule.\n
- Participants: John Smith, Jane Doe, Jim Dandy\n-It was
- decided that the requirements need to be signed off by
- product marketing.\n-Project processes were accepted.\n
- -Project schedule needs to account for scheduled holidays
- and employee vacation time. Check with HR for specific
- dates.\n-New schedule will be distributed by Friday.\n-
- Next weeks meeting is cancelled. No meeting until 3/23.
-END:VJOURNAL
-END:VCALENDAR
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//RDU Software//NONSGML HandCal//EN
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jsmith@host.com
-DTSTART:19980313T141711Z
-DTEND:19980410T141711Z
-FREEBUSY:19980314T233000Z/19980315T003000Z
-FREEBUSY:19980316T153000Z/19980316T163000Z
-FREEBUSY:19980318T030000Z/19980318T040000Z
-URL:http://www.host.com/calendar/busytime/jsmith.ifb
-END:VFREEBUSY
-END:VCALENDAR
-END:VCALENDAR \ No newline at end of file
diff --git a/libical/test-data/2446.ics b/libical/test-data/2446.ics
deleted file mode 100644
index 0f816efeba..0000000000
--- a/libical/test-data/2446.ics
+++ /dev/null
@@ -1,998 +0,0 @@
-
-BEGIN:VCALENDAR
-METHOD:PUBLISH
-PRODID:-//ACME/DesktopCalendar//EN
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-DTSTART:19970701T200000Z
-DTSTAMP:19970611T190000Z
-SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-UID:0981234-1234234-23@example.com
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-METHOD:PUBLISH
-VERSION:2.0
-PRODID:-//ACME/DesktopCalendar//EN
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-DTSTAMP:19970612T190000Z
-DTSTART:19970701T210000Z
-DTEND:19970701T230000Z
-SEQUENCE:1
-UID:0981234-1234234-23@example.com
-SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:CANCEL
-VERSION:2.0
-PRODID:-//ACME/DesktopCalendar//EN
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-COMMENT:DUKES forfeit the game
-SEQUENCE:2
-UID:0981234-1234234-23@example.com
-DTSTAMP:19970613T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:PUBLISH
-CALSCALE:GREGORIAN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:America-Chicago
-TZURL:http://zones.stds_r_us.net/tz/America-Chicago
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0600
-TZNAME:CST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
-TZOFFSETFROM:-0600
-TZOFFSETTO:-0500
-TZNAME:CDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-ATTACH:http://www.dukes.com/
-CATEGORIES:SPORTS EVENT,ENTERTAINMENT
-CLASS:PRIVATE
-DESCRIPTION:MIDWAY STADIUM\n
- Big time game. MUST see.\n
- Expected duration:2 hours\n
-DTEND;TZID=America-Chicago:19970701T180000
-DTSTART;TZID=America-Chicago:19970702T160000
-DTSTAMP:19970614T190000Z
-STATUS:CONFIRMED
-LOCATION;VALUE=URI:http://www.midwaystadium.com/
-PRIORITY:2
-RESOURCES:SCOREBOARD
-SEQUENCE:3
-SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-UID:0981234-1234234-23@example.com
-RELATED-TO:0981234-1234234-14@example.com
-BEGIN:VALARM
-TRIGGER:-PT2H
-ACTION:DISPLAY
-DESCRIPTION:You should be leaving for the game now.
-END:VALARM
-BEGIN:VALARM
-TRIGGER:-PT30M
-ACTION:AUDIO
-END:VALARM
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:PUBLISH
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-DTSTAMP:19970614T190000Z
-UID:0981234-1234234-23@example.com
-DTSTART;VALUE=DATE:19970714
-RRULE:FREQ=YEARLY;INTERVAL=1
-SUMMARY: Bastille Day
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com
-ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com
-DTSTAMP:19970611T190000Z
-DTSTART:19970701T200000Z
-DTEND:19970701T2000000Z
-SUMMARY:Conference
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com
-ORGANIZER:MAILTO:A@example.com
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970612T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;
- CUTYPE=ROOM:Mailto:Conf@example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com
-DTSTART:19970701T180000Z
-DTEND:19970701T190000Z
-SUMMARY:Phone Conference
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:1
-DTSTAMP:19970613T190000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-DTSTART:19970701T190000Z
-DTEND:19970701T200000Z
-SUMMARY:Discuss the Merits of the election results
-LOCATION:Green Conference Room
-UID:calsrv.example.com-873970198738777a@example.com
-SEQUENCE:0
-DTSTAMP:19970611T190000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:COUNTER
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-DTSTART:19970701T160000Z
-DTEND:19970701T190000Z
-DTSTAMP:19970612T190000Z
-SUMMARY:Discuss the Merits of the election results
-LOCATION:Green Conference Room
-COMMENT:This time works much better and I think the big conference
- room is too big
-UID:calsrv.example.com-873970198738777a@example.com
-SEQUENCE:0
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-DTSTAMP:19970613T190000Z
-DTSTART:19970701T160000Z
-DTEND:19970701T190000Z
-SUMMARY:Discuss the Merits of the election results - changed to
- meet B's schedule
-LOCATION:Green Conference Room
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:1
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:DECLINECOUNTER
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-COMMENT:Sorry\, I cannot change this meeting time
-UID:calsrv.example.com-873970198738777@example.com
-DTSTAMP:19970614T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:MAILTO:A@Example.com
-ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
- TO="Mailto:E@example.com":Mailto:C@example.com
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970611T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
- TO="Mailto:E@example.com":Mailto:C@example.com
-ATTENDEE;RSVP=TRUE;
- DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
-DTSTART:19970701T180000Z
-DTEND:19970701T200000Z
-SUMMARY:Phone Conference
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-STATUS:CONFIRMED
-DTSTAMP:19970611T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:MAILTO:A@Example.com
-ATTENDEE;PARTSTAT=ACCEPTED;DELEGATED-
- FROM="Mailto:C@example.com":Mailto:E@example.com
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970614T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:MAILTO:A@Example.com
-ATTENDEE;PARTSTAT=DELEGATED;
- DELEGATED-TO="Mailto:E@example.com":Mailto:C@example.com
-COMMENT:Sorry\, I will be out of town at that time.
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970614T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:MAILTO:A@Example.com
-ATTENDEE;PARTSTAT=DECLINED;
- DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-SUMMARY:Phone Conference
-DTSTART:19970701T180000Z
-DTEND:19970701T200000Z
-DTSTAMP:19970614T200000Z
-COMMENT:DELEGATE (ATTENDEE Mailto:E@example.com) DECLINED YOUR
- INVITATION
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:CANCEL
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:A@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-COMMENT:Mr. B cannot attend. It's raining. Lets cancel.
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:1
-STATUS:CANCELLED
-DTSTAMP:19970613T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:CANCEL
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE:mailto:B@example.com
-COMMENT:You're off the hook for this meeting
-UID:calsrv.example.com-873970198738777@example.com
-DTSTAMP:19970613T193000Z
-SEQUENCE:1
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-ATTENDEE;CUTYPE=ROOM:CR_Big@example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;
- RSVP=FALSE:Mailto:E@example.com
-DTSTAMP:19970611T190000Z
-DTSTART:19970701T200000Z
-DTEND:19970701T203000Z
-SUMMARY:Phone Conference
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:2
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:B@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:B@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-DTSTAMP:19970611T190000Z
-DTSTART:19970701T200000Z
-DTEND:19970701T203000Z
-RRULE:FREQ=WEEKLY
-SUMMARY:Phone Conference
-UID:123456@example.com
-SEQUENCE:1
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VFREEBUSY
-DTSTAMP:19980101T124100Z
-ORGANIZER:MAILTO:A@Example.com
-DTSTART:19980101T124200Z
-DTEND:19980107T124200Z
-FREEBUSY:19980101T180000Z/19980101T190000Z
-FREEBUSY:19980103T020000Z/19980103T050000Z
-FREEBUSY:19980107T020000Z/19980107T050000Z
-FREEBUSY:19980113T000000Z/19980113T010000Z
-FREEBUSY:19980115T190000Z/19980115T200000Z
-FREEBUSY:19980115T220000Z/19980115T230000Z
-FREEBUSY:19980116T013000Z/19980116T043000Z
-END:VFREEBUSY
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VFREEBUSY
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-DTSTAMP:19970613T190000Z
-DTSTART:19970701T080000Z
-DTEND:19970701T200000
-UID:calsrv.example.com-873970198738777@example.com
-END:VFREEBUSY
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:A@example.com
-ATTENDEE:Mailto:B@example.com
-DTSTART:19970701T080000Z
-DTEND:19970701T200000Z
-UID:calsrv.example.com-873970198738777@example.com
-FREEBUSY:19970701T090000Z/PT1H,19970701T140000Z/PT30M
-DTSTAMP:19970613T190030Z
-END:VFREEBUSY
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:America-SanJose
-TZURL:http://zones.stds_r_us.net/tz/America-SanJose
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-TZNAME:PST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-TZNAME:PDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:A@example.COM
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:B@example.fr
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:c@example.jp
-DTSTAMP:19970613T190030Z
-DTSTART;TZID=America-SanJose:19970701T140000
-DTEND;TZID=America-SanJose:19970701T150000
-RRULE:FREQ=WEEKLY;INTERVAL=20;WKST=SU;BYDAY=TU
-RDATE;TZID=America-SanJose:19970910T140000
-EXDATE;TZID=America-SanJose:19970909T140000
-EXDATE;TZID=America-SanJose:19971028T140000
-SUMMARY:Weekly Phone Conference
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-SEQUENCE:0
-RRULE:FREQ=MONTHLY;BYMONTHDAY=1;UNTIL=19980901T210000Z
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-ATTENDEE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Conference Call
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970601T210000Z
-DTEND:19970601T220000Z
-LOCATION:Conference Call
-DTSTAMP:19970526T083000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1com
-RECURRENCE-ID:19970701T210000Z
-SEQUENCE:1
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-ATTENDEE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Conference Call
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970703T210000Z
-DTEND:19970703T220000Z
-LOCATION:Conference Call
-DTSTAMP:19970626T093000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:CANCEL
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-ATTENDEE:Mailto:D@example.com
-RECURRENCE-ID:19970801T210000Z
-SEQUENCE:2
-STATUS:CANCELLED
-DTSTAMP:19970721T093000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:CANCEL
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-ATTENDEE:Mailto:D@example.com
-DTSTAMP:19970721T103000Z
-STATUS:CANCELLED
-SEQUENCE:3
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-RECURRENCE-ID;RANGE=THISANDFUTURE:19970901T210000Z
-SEQUENCE:3
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Discussion
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970901T210000Z
-DTEND:19970901T220000Z
-LOCATION:Building 32\, Microsoft\, Seattle\, WA
-DTSTAMP:19970526T083000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:ADD
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:4
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Conference Call
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970715T210000Z
-DTEND:19970715T220000Z
-LOCATION:Conference Call
-DTSTAMP:19970629T093000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:0
-RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=TU
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980303T210000Z
-DTEND:19980303T220000Z
-LOCATION:The White Room
-DTSTAMP:19980301T093000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:ADD
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:7
-RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=TH
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980303T210000Z
-DTEND:19980303T220000Z
-DTSTAMP:19980303T193000Z
-LOCATION:The Usual conference room
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:7
-RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=TU,TH
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980303T210000Z
-DTEND:19980303T220000Z
-DTSTAMP:19980303T193000Z
-LOCATION:The White Room
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:0
-RDATE:19980304T180000Z
-RDATE:19980311T180000Z
-RDATE:19980318T180000Z
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980304T180000Z
-DTEND:19980304T200000Z
-DTSTAMP:19980303T193000Z
-LOCATION:Conference Room A
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:1
-RECURRENCE-ID:19980311T180000Z
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980311T160000Z
-DTEND:19980311T180000Z
-DTSTAMP:19980306T193000Z
-LOCATION:The Small conference room
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:ADD
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:2
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980315T180000Z
-DTEND:19980315T200000Z
-DTSTAMP:19980307T193000Z
-LOCATION:Conference Room A
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:2
-RDATE:19980304T180000Z
-RDATE:19980311T160000Z
-RDATE:19980315T180000Z
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980304T180000Z
-DTEND:19980304T200000Z
-DTSTAMP:19980303T193000Z
-LOCATION:Conference Room A
-STATUS:CONFIRMED
-END:VEVENT
-BEGIN:VEVENT
-SEQUENCE:2
-RECURRENCE-ID:19980311T160000Z
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980311T160000Z
-DTEND:19980304T180000Z
-DTSTAMP:19980306T193000Z
-ORGANIZER:Mailto:A@example.com
-LOCATION:The Small conference room
-UID:guid-1@host1.com
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:COUNTER
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-RECURRENCE-ID:19970715T210000Z
-SEQUENCE:4
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;RSVP=TRUE:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Conference Call
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970715T220000Z
-DTEND:19970715T230000Z
-LOCATION:Conference Call
-COMMENT:May we bump this by an hour? I have a conflict
-DTSTAMP:19970629T094000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-SEQUENCE:0
-RRULE:FREQ=MONTHLY;BYMONTHDAY=1
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Conference Call
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970601T210000Z
-DTEND:19970601T220000Z
-DTSTAMP:19970602T094000Z
-LOCATION:Conference Call
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//RDU Software//NONSGML HandCal//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-REQUEST-STATUS:2.8;Repeating event ignored. Scheduled as a single
- event;RRULE
-REQUEST-STATUS:3.0;Invalid Property Name;FOO
-UID:guid-1@host1.com
-SEQUENCE:0
-DTSTAMP:19970603T094000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE:Mailto:D@example.com
-DTSTART:19970701T170000Z
-DUE:19970722T170000Z
-PRIORITY:1
-SUMMARY:Create the requirements document
-UID:calsrv.example.com-873970198738777-00@example.com
-SEQUENCE:0
-DTSTAMP:19970717T200000Z
-STATUS:Needs Action
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com
-UID:calsrv.example.com-873970198738777-00@example.com
-COMMENT:I'll send you my input by e-mail
-SEQUENCE:0
-DTSTAMP:19970717T203000Z
-REQUEST-STATUS:2.0;Success
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-UID:calsrv.example.com-873970198738777-00@example.com
-SUMMARY:Create the requirements document
-PRIORITY:1
-SEQUENCE:0
-STATUS:IN-PROCESS
-DTSTART:19970701T170000Z
-DTSTAMP:19970717T230000Z
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:MAILTO:A@example.com
-ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com
-PERCENT-COMPLETE:75
-REQUEST-STATUS:2.0
-UID:calsrv.example.com-873970198738777-00@example.com
-DTSTAMP:19970717T233000Z
-SEQUENCE:0
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:MAILTO:A@example.com
-ATTENDEE;PARTSTAT=COMPLETED:Mailto:D@example.com
-UID:calsrv.example.com-873970198738777-00@example.com
-REQUEST-STATUS:2.0
-DTSTAMP:19970717T233000Z
-SEQUENCE:0
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;PARTSTAT=IN-PROCESS;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-DTSTART:19970701T170000Z
-DUE:19970722T170000Z
-PRIORITY:1
-SUMMARY:Create the requirements document
-UID:calsrv.example.com-873970198738777-00@example.com
-SEQUENCE:1
-DTSTAMP:19970718T100000Z
-STATUS:IN-PROGRESS
-PERCENT-COMPLETE:40
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
-DTSTART:19980101T100000
-DUE:19980103T100000
-SUMMARY:Send Status Reports to Area Managers
-UID:calsrv.example.com-873970198738777-00@example.com
-SEQUENCE:0
-DTSTAMP:19970717T200000Z
-STATUS:NEEDS-ACTION
-PRIORITY:1
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VTODO
-ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com
-PERCENT-COMPLETE:75
-UID:calsrv.example.com-873970198738777-00@example.com
-DTSTAMP:19970717T233000Z
-RECURRENCE-ID:19980101T170000Z
-SEQUENCE:1
-ORGANIZER:MAILTO:A@Example.com
-REQUEST-STATUS:2.0
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:PUBLISH
-PRODID:-//ACME/DesktopCalendar//EN
-VERSION:2.0
-BEGIN:VJOURNAL
-DTSTART:19971002T200000Z
-DTSTAMP:19971002T200000Z
-ORGANIZER:MAILTO:A@Example.com
-SUMMARY:Phone conference minutes
-DESCRIPTION:The editors meeting was held on October 1\, 1997.
- Details are in the attached document.
-UID:0981234-1234234-2410@example.com
-RELATED-TO:0981234-1234234-2402-35@example.com
-ATTACH:ftp://ftp.example.com/pub/ed/minutes100197.txt
-END:VJOURNAL
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//RDU Software//NONSGML HandCal//EN
-METHOD:REFRESH
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-UID: guid-1-12345@host1.com
-DTSTAMP:19970603T094000
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:acme-12345@host1.com
-SEQUENCE:3
-RRULE:FREQ=WEEKLY
-RDATE;VALUE=PERIOD:19970819T210000Z/199700819T220000Z
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-DESCRIPTION:IETF-C&S Conference Call
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970801T210000Z
-DTEND:19970801T220000Z
-RECURRENCE-ID:19970809T210000Z
-DTSTAMP:19970726T083000
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//RDU Software//NONSGML HandCal//EN
-METHOD:REFRESH
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-UID:acme-12345@host1.com
-DTSTAMP:19970603T094000
-END:VEVENT
-END:VCALENDAR
diff --git a/libical/test-data/2446.vcd b/libical/test-data/2446.vcd
deleted file mode 100644
index 679f6c7920..0000000000
--- a/libical/test-data/2446.vcd
+++ /dev/null
@@ -1,1007 +0,0 @@
-BEGIN:VCALENDAR
-X-LIC-CLUSTERCOUNT
- :0
-DTSTART
- :00000000T000000
-DTEND
- :00000000T000000
-BEGIN:VCALENDAR
-METHOD:PUBLISH
-PRODID:-//ACME/DesktopCalendar//EN
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-DTSTART:19970701T200000Z
-DTSTAMP:19970611T190000Z
-SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-UID:0981234-1234234-23@example.com
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:PUBLISH
-VERSION:2.0
-PRODID:-//ACME/DesktopCalendar//EN
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-DTSTAMP:19970612T190000Z
-DTSTART:19970701T210000Z
-DTEND:19970701T230000Z
-SEQUENCE:1
-UID:0981234-1234234-23@example.com
-SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:CANCEL
-VERSION:2.0
-PRODID:-//ACME/DesktopCalendar//EN
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-COMMENT:DUKES forfeit the game
-SEQUENCE:2
-UID:0981234-1234234-23@example.com
-DTSTAMP:19970613T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:PUBLISH
-SCALE:GREGORIAN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:America-Chicago
-TZURL:http://zones.stds_r_us.net/tz/America-Chicago
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0600
-TZNAME:CST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
-TZOFFSETFROM:-0600
-TZOFFSETTO:-0500
-TZNAME:CDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-ATTACH:http://www.dukes.com/
-CATEGORIES:SPORTS EVENT,ENTERTAINMENT
-CLASS:PRIVATE
-DESCRIPTION:MIDWAY STADIUM\n
- Big time game. MUST see.\n
- Expected duration:2 hours\n
-DTEND;TZID=America-Chicago:19970701T180000
-DTSTART;TZID=America-Chicago:19970702T160000
-DTSTAMP:19970614T190000Z
-STATUS:CONFIRMED
-LOCATION;VALUE=URI:http://www.midwaystadium.com/
-PRIORITY:2
-RESOURCES:SCOREBOARD
-SEQUENCE:3
-SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-UID:0981234-1234234-23@example.com
-RELATED-TO:0981234-1234234-14@example.com
-BEGIN:VALARM
-TRIGGER:-PT2H
-ACTION:DISPLAY
-DESCRIPTION:You should be leaving for the game now.
-END:VALARM
-BEGIN:VALARM
-TRIGGER:-PT30M
-ACTION:AUDIO
-END:VALARM
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:PUBLISH
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-DTSTAMP:19970614T190000Z
-UID:0981234-1234234-23@example.com
-DTSTART;VALUE=DATE:19970714
-RRULE:FREQ=YEARLY;INTERVAL=1
-SUMMARY: Bastille Day
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com
-ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com
-DTSTAMP:19970611T190000Z
-DTSTART:19970701T200000Z
-DTEND:19970701T2000000Z
-SUMMARY:Conference
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com
-ORGANIZER:MAILTO:A@example.com
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970612T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;
- CUTYPE=ROOM:Mailto:Conf@example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com
-DTSTART:19970701T180000Z
-DTEND:19970701T190000Z
-SUMMARY:Phone Conference
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:1
-DTSTAMP:19970613T190000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-DTSTART:19970701T190000Z
-DTEND:19970701T200000Z
-SUMMARY:Discuss the Merits of the election results
-LOCATION:Green Conference Room
-UID:calsrv.example.com-873970198738777a@example.com
-SEQUENCE:0
-DTSTAMP:19970611T190000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:COUNTER
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-DTSTART:19970701T160000Z
-DTEND:19970701T190000Z
-DTSTAMP:19970612T190000Z
-SUMMARY:Discuss the Merits of the election results
-LOCATION:Green Conference Room
-COMMENT:This time works much better and I think the big conference
- room is too big
-UID:calsrv.example.com-873970198738777a@example.com
-SEQUENCE:0
-DTSTAMP:19970611T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-DTSTAMP:19970613T190000Z
-DTSTART:19970701T160000Z
-DTEND:19970701T190000Z
-SUMMARY:Discuss the Merits of the election results - changed to
- meet B's schedule
-LOCATION:Green Conference Room
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:1
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:DECLINECOUNTER
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-COMMENT:Sorry, I cannot change this meeting time
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-DTSTAMP:19970614T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:MAILTO:A@Example.com
-ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
- TO="Mailto:E@example.com":Mailto:C@example.com
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970611T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
- TO="Mailto:E@example.com":Mailto:C@example.com
-ATTENDEE;RSVP=TRUE;
- DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
-DTSTART:19970701T180000Z
-DTEND:19970701T200000Z
-SUMMARY:Phone Conference
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-STATUS:CONFIRMED
-DTSTAMP:19970611T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:MAILTO:A@Example.com
-ATTENDEE;PARTSTAT=ACCEPTED;DELEGATED-
- FROM="Mailto:C@example.com":Mailto:E@example.com
-ATTENDEE;PARTSTAT=DELEGATED;
- DELEGATED-TO="Mailto:E@example.com":Mailto:C@example.com
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970614T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:MAILTO:A@Example.com
-ATTENDEE;PARTSTAT=DELEGATED;
- DELEGATED-TO="Mailto:E@example.com":Mailto:C@example.com
-ATTENDEE;PARTSTAT=DECLINED;
- DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
-COMMENT:Sorry, I will be out of town at that time.
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970614T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:MAILTO:A@Example.com
-ATTENDEE;PARTSTAT=DECLINED;
- DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-SUMMARY:Phone Conference
-DTSTART:19970701T180000Z
-DTEND:19970701T200000Z
-DTSTAMP:19970614T200000Z
-COMMENT:DELEGATE (ATTENDEE Mailto:E@example.com) DECLINED YOUR
- INVITATION
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:CANCEL
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:A@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-COMMENT:Mr. B cannot attend. It's raining. Lets cancel.
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:1
-STATUS:CANCELLED
-DTSTAMP:19970613T190000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:CANCEL
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE:mailto:B@example.com
-COMMENT:You're off the hook for this meeting
-UID:calsrv.example.com-873970198738777@example.com
-DTSTAMP:19970613T193000Z
-SEQUENCE:1
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-ATTENDEE;CUTYPE=ROOM:CR_Big@example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;
- RSVP=FALSE:Mailto:E@example.com
-DTSTAMP:19970611T190000Z
-DTSTART:19970701T200000Z
-DTEND:19970701T203000Z
-SUMMARY:Phone Conference
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:2
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:B@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:B@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-DTSTAMP:19970611T190000Z
-DTSTART:19970701T200000Z
-DTEND:19970701T203000Z
-RRULE:FREQ=WEEKLY
-SUMMARY:Phone Conference
-UID:123456@example.com
-SEQUENCE:1
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VFREEBUSY
-DTSTAMP:19980101T124100Z
-ORGANIZER:MAILTO:A@Example.com
-DTSTART:19980101T124200Z
-DTEND:19980107T124200Z
-FREEBUSY:19980101T180000Z/19980101T190000Z
-FREEBUSY:19980103T020000Z/19980103T050000Z
-FREEBUSY:19980107T020000Z/19980107T050000Z
-FREEBUSY:19980113T000000Z/19980113T010000Z
-FREEBUSY:19980115T190000Z/19980115T200000Z
-FREEBUSY:19980115T220000Z/19980115T230000Z
-FREEBUSY:19980116T013000Z/19980116T043000Z
-END:VFREEBUSY
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VFREEBUSY
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-DTSTAMP:19970613T190000Z
-DTSTART:19970701T080000Z
-DTEND:19970701T200000
-UID:calsrv.example.com-873970198738777@example.com
-END:VFREEBUSY
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:A@example.com
-ATTENDEE:Mailto:B@example.com
-DTSTART:19970701T080000Z
-DTEND:19970701T200000Z
-UID:calsrv.example.com-873970198738777@example.com
-FREEBUSY:19970701T090000Z/PT1H,19970701T140000Z/PT30M
-DTSTAMP:19970613T190030Z
-END:VFREEBUSY
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:America-SanJose
-TZURL:http://zones.stds_r_us.net/tz/America-SanJose
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-TZNAME:PST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-TZNAME:PDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:A@example.COM
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:B@example.fr
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:c@example.jp
-DTSTAMP:19970613T190030Z
-DTSTART;TZID=America-SanJose:19970701T140000
-DTEND;TZID=America-SanJose:19970701T150000
-RRULE:FREQ=WEEKLY;INTERVAL=20;WKST=SU;BYDAY=TU
-RDATE;TZID=America-SanJose:19970910T140000
-EXDATE;TZID=America-SanJose:19970909T140000
-EXDATE;TZID=America-SanJose:19971028T140000
-SUMMARY:Weekly Phone Conference
-UID:calsrv.example.com-873970198738777@example.com
-SEQUENCE:0
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-SEQUENCE:0
-RRULE:FREQ=MONTHLY;BYMONTHDAY=1;UNTIL=19980901T210000Z
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-ATTENDEE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Conference Call
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970601T210000Z
-DTEND:19970601T220000Z
-LOCATION:Conference Call
-DTSTAMP:19970526T083000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1com
-RECURRENCE-ID:19970701T210000Z
-SEQUENCE:1
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-ATTENDEE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Conference Call
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970703T210000Z
-DTEND:19970703T220000Z
-LOCATION:Conference Call
-DTSTAMP:19970626T093000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:CANCEL
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-ATTENDEE:Mailto:D@example.com
-RECURRENCE-ID:19970801T210000Z
-SEQUENCE:2
-STATUS:CANCELLED
-DTSTAMP:19970721T093000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:CANCEL
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-ATTENDEE:Mailto:D@example.com
-DTSTAMP:19970721T103000Z
-STATUS:CANCELLED
-SEQUENCE:3
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-RECURRENCE-ID;RANGE=THISANDFUTURE:19970901T210000Z
-SEQUENCE:3
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Discussion
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970901T210000Z
-DTEND:19970901T220000Z
-LOCATION:Building 32, Microsoft, Seattle, WA
-DTSTAMP:19970526T083000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:ADD
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:4
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Conference Call
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970715T210000Z
-DTEND:19970715T220000Z
-LOCATION:Conference Call
-DTSTAMP:19970629T093000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:0
-RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=TU
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980303T210000Z
-DTEND:19980303T220000Z
-LOCATION:The White Room
-DTSTAMP:19980301T093000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:ADD
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:7
-RRULE:WKST=SU;BYDAY=TH;FREQ=WEEKLY
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980303T210000Z
-DTEND:19980303T220000Z
-DTSTAMP:19980303T193000Z
-LOCATION:The Usual conference room
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:7
-RRULE:WKST=SU;BYDAY=TU,TH;FREQ=WEEKLY
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980303T210000Z
-DTEND:19980303T220000Z
-DTSTAMP:19980303T193000Z
-LOCATION:The White Room
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:0
-RDATE:19980304T180000Z
-RDATE:19980311T180000Z
-RDATE:19980318T180000Z
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980304T180000Z
-DTEND:19980304T200000Z
-DTSTAMP:19980303T193000Z
-LOCATION:Conference Room A
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:1
-RECURRENCE-ID:19980311T180000Z
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980311T160000Z
-DTEND:19980311T180000Z
-DTSTAMP:19980306T193000Z
-LOCATION:The Small conference room
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:ADD
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:2
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980315T180000Z
-DTEND:19980315T200000Z
-DTSTAMP:19980307T193000Z
-LOCATION:Conference Room A
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:123456789@host1.com
-SEQUENCE:2
-RDATE:19980304T180000Z
-RDATE:19980311T160000Z
-RDATE:19980315T180000Z
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980304T180000Z
-DTEND:19980304T200000Z
-DTSTAMP:19980303T193000Z
-LOCATION:Conference Room A
-STATUS:CONFIRMED
-END:VEVENT
-BEGIN:VEVENT
-SEQUENCE:2
-RECURRENCE-ID:19980311T160000Z
-ATTENDEE;ROLE=CHAIR;RSVP=TRUE:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-SUMMARY:Review Accounts
-DTSTART:19980311T160000Z
-DTEND:19980304T180000Z
-DTSTAMP:19980306T193000Z
-LOCATION:The Small conference room
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:COUNTER
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-RECURRENCE-ID:19970715T210000Z
-SEQUENCE:4
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;RSVP=TRUE:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Conference Call
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970715T220000Z
-DTEND:19970715T230000Z
-LOCATION:Conference Call
-COMMENT:May we bump this by an hour? I have a conflict
-DTSTAMP:19970629T094000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:guid-1@host1.com
-SEQUENCE:0
-RRULE:FREQ=MONTHLY;BYMONTHDAY=1
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE:Mailto:D@example.com
-DESCRIPTION:IETF-C&S Conference Call
-CLASS:PUBLIC
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970601T210000Z
-DTEND:19970601T220000Z
-DTSTAMP:19970602T094000Z
-LOCATION:Conference Call
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//RDU Software//NONSGML HandCal//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-REQUEST-STATUS:2.8;Repeating event ignored. Scheduled as a single
- event;RRULE
-REQUEST-STATUS:3.0;Invalid Property Name;FOO
-UID:guid-1@host1.com
-SEQUENCE:0
-DTSTAMP:19970603T094000Z
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE:Mailto:C@example.com
-ATTENDEE;RSVP=TRUE:Mailto:D@example.com
-DTSTART:19970701T170000Z
-DUE:19970722T170000Z
-PRIORITY:1
-SUMMARY:Create the requirements document
-UID:calsrv.example.com-873970198738777-00@example.com
-SEQUENCE:0
-DTSTAMP:19970717T200000Z
-STATUS:Needs Action
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com
-UID:calsrv.example.com-873970198738777-00@example.com
-COMMENT:I'll send you my input by e-mail
-SEQUENCE:0
-DTSTAMP:19970717T203000Z
-REQUEST-STATUS:2.0;Success
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-UID:calsrv.example.com-873970198738777-00@example.com
-SUMMARY:Create the requirements document
-PRIORITY:1
-SEQUENCE:0
-STATUS:IN-PROCESS
-DTSTART:19970701T170000Z
-DTSTAMP:19970717T230000Z
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:MAILTO:A@example.com
-ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com
-PERCENT-COMPLETE:75
-UID:calsrv.example.com-873970198738777-00@example.com
-DTSTAMP:19970717T233000Z
-SEQUENCE:0
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:MAILTO:A@example.com
-ATTENDEE;PARTSTAT=COMPLETED:Mailto:D@example.com
-UID:calsrv.example.com-873970198738777-00@example.com
-DTSTAMP:19970717T233000Z
-SEQUENCE:0
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;PARTSTAT=IN-PROCESS;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-DTSTART:19970701T170000Z
-DUE:19970722T170000Z
-PRIORITY:1
-SUMMARY:Create the requirements document
-UID:calsrv.example.com-873970198738777-00@example.com
-SEQUENCE:1
-DTSTAMP:19970718T100000Z
-STATUS:IN-PROGRESS
-PERCENT-COMPLETE:40
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-VERSION:2.0
-BEGIN:VTODO
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
-RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
-DTSTART:19980101T100000
-DUE:19980103T100000
-SUMMARY:Send Status Reports to Area Managers
-UID:calsrv.example.com-873970198738777-00@example.com
-SEQUENCE:0
-DTSTAMP:19970717T200000Z
-STATUS:NEEDS ACTION
-PRIORITY:1
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-VERSION:2.0
-BEGIN:VTODO
-ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com
-PERCENT-COMPLETE:75
-UID:calsrv.example.com-873970198738777-00@example.com
-DTSTAMP:19970717T233000Z
-RECURRENCE-ID:19980101T170000Z
-SEQUENCE:1
-END:VTODO
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:PUBLISH
-PRODID:-//ACME/DesktopCalendar//EN
-VERSION:2.0
-BEGIN:VJOURNAL
-DTSTART:19971002T200000Z
-ORGANIZER:MAILTO:A@Example.com
-SUMMARY:Phone conference minutes
-DESCRIPTION:The editors meeting was held on October 1, 1997.
- Details are in the attached document.
-UID:0981234-1234234-2410@example.com
-RELATED-TO:0981234-1234234-2402-35@example.com
-ATTACH:ftp://ftp.example.com/pub/ed/minutes100197.txt
-END:VJOURNAL
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//RDU Software//NONSGML HandCal//EN
-METHOD:REFRESH
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-ATTENDEE:Mailto:C@example.com
-ATTENDEE:Mailto:D@example.com
-UID: guid-1-12345@host1.com
-DTSTAMP:19970603T094000
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//RDU Software//NONSGML HandCal//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:acme-12345@host1.com
-SEQUENCE:3
-RRULE:FREQ=WEEKLY
-RDATE;VALUE=PERIOD:19970819T210000Z/199700819T220000Z
-ORGANIZER:Mailto:A@example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-DESCRIPTION:IETF-C&S Conference Call
-SUMMARY:IETF Calendaring Working Group Meeting
-DTSTART:19970801T210000Z
-DTEND:19970801T220000Z
-RECURRENCE-ID:19970809T210000Z
-DTSTAMP:19970726T083000
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//RDU Software//NONSGML HandCal//EN
-METHOD:REFRESH
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:A@example.com
-ATTENDEE:Mailto:B@example.com
-UID:acme-12345@host1.com
-DTSTAMP:19970603T094000
-END:VEVENT
-END:VCALENDAR
-END:VCALENDAR \ No newline at end of file
diff --git a/libical/test-data/3 b/libical/test-data/3
deleted file mode 100644
index 008373ebfa..0000000000
--- a/libical/test-data/3
+++ /dev/null
@@ -1,21 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//ABC Corporation//NONSGML My Product//EN
-BEGIN:VTODO
-DTSTAMP:19980130T134500Z
-SEQUENCE:2
-UID:uid4@host1.com
-ORGANIZER:MAILTO:unclesam@us.gov
-ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
-DUE:19980415T235959
-STATUS:NEEDS-ACTION
-SUMMARY:Submit Income Taxes
-BEGIN:VALARM
-ACTION:AUDIO
-TRIGGER;VALUE=DATE-TIME:19980403T120000
-ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-files/ssbanner.aud
-REPEAT:4
-DURATION:PT1H
-END:VALARM
-END:VTODO
-END:VCALENDAR
diff --git a/libical/test-data/4 b/libical/test-data/4
deleted file mode 100644
index 59c3d6917b..0000000000
--- a/libical/test-data/4
+++ /dev/null
@@ -1,23 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//ABC Corporation//NONSGML My Product//EN
-BEGIN:VJOURNAL
-DTSTAMP:19970324T120000Z
-UID:uid5@host1.com
-ORGANIZER:MAILTO:jsmith@host.com
-STATUS:DRAFT
-CLASS:PUBLIC
-CATEGORIES:Project Report, XYZ: Weekly Meeting
-DESCRIPTION:Project xyz Review Meeting Minutes\n
- Agenda\n1. Review of project version 1.0 requirements.\n2.
- Definition
- of project processes.\n3. Review of project schedule.\n
- Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was
- decided that the requirements need to be signed off by
- product marketing.\n-Project processes were accepted.\n
- -Project schedule needs to account for scheduled holidays
- and employee vacation time. Check with HR for specific
- dates.\n-New schedule will be distributed by Friday.\n-
- Next weeks meeting is cancelled. No meeting until 3/23.
-END:VJOURNAL
-END:VCALENDAR
diff --git a/libical/test-data/5 b/libical/test-data/5
deleted file mode 100644
index ba1fd09f7f..0000000000
--- a/libical/test-data/5
+++ /dev/null
@@ -1,16 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//RDU Software//NONSGML HandCal//EN
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jsmith@host.com
-DTSTART:19980313T141711Z
-DTEND:19980410T141711
-FREEBUSY:19980314T233000Z/19980315T003000Z
-FREEBUSY:19980316T153000Z/19980316T163000Z
-FREEBUSY:19980318T030000/19980318T040000,19980318T030000/19980318T040000
-URL:http://www.host.com/calendar/busytime/jsmith.ifb
-END:VFREEBUSY
-END:VCALENDAR
-
-
-
diff --git a/libical/test-data/6 b/libical/test-data/6
deleted file mode 100644
index 753bd2b66c..0000000000
--- a/libical/test-data/6
+++ /dev/null
@@ -1,12 +0,0 @@
-BEGIN:VCALENDAR
-METHOD:PUBLISH
-PRODID:-//ACME/DesktopCalendar//EN
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-DTSTART:19970701T200000Z
-DTSTAMP:19970611T190000Z
-SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-UID:0981234-1234234-23@example.com
-END:VEVENT
-END:VCALENDAR
diff --git a/libical/test-data/7 b/libical/test-data/7
deleted file mode 100644
index 0a255fc514..0000000000
--- a/libical/test-data/7
+++ /dev/null
@@ -1,14 +0,0 @@
-BEGIN:VCALENDAR
-METHOD:PUBLISH
-VERSION:2.0
-PRODID:-//ACME/DesktopCalendar//EN
-BEGIN:VEVENT
-ORGANIZER:mailto:a@example.com
-DTSTAMP:19970612T190000Z
-DTSTART:19970701T210000Z
-DTEND:19970701T230000Z
-SEQUENCE:1
-UID:0981234-1234234-23@example.com
-SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
-END:VEVENT
-END:VCALENDAR
diff --git a/libical/test-data/Makefile.am b/libical/test-data/Makefile.am
deleted file mode 100644
index bf2079606c..0000000000
--- a/libical/test-data/Makefile.am
+++ /dev/null
@@ -1,13 +0,0 @@
-EXTRA_DIST = \
-0 \
-1 \
-1.1 \
-2 \
-2445.ics \
-2446.ics \
-3 \
-4 \
-5 \
-6 \
-7 \
-smallcluster.ics \ No newline at end of file
diff --git a/libical/test-data/smallcluster.ics b/libical/test-data/smallcluster.ics
deleted file mode 100644
index 2902136bab..0000000000
--- a/libical/test-data/smallcluster.ics
+++ /dev/null
@@ -1,13 +0,0 @@
-BEGIN:VCALENDAR
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//hacksw/handcal//NONSGML v1.0//EN
-BEGIN:VEVENT
-DTSTART
- :19970714T170000Z
-DTEND:19970715T035959Z
-SUMMARY:Bastille Day Party
-RRULE:FREQ=YEARLY;UNTIL=123456T123456;BYSETPOS=-1,2,-3,4,-5,6,-7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,4,25,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,52,53,54;BYSECOND=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,4,25,26
-END:VEVENT
-END:VCALENDAR
-END:VCALENDAR
diff --git a/libical/test-data/smallcluster.vcd b/libical/test-data/smallcluster.vcd
deleted file mode 100644
index c4e2dbae50..0000000000
--- a/libical/test-data/smallcluster.vcd
+++ /dev/null
@@ -1,18 +0,0 @@
-BEGIN:VCALENDAR
-X-LIC-CLUSTERCOUNT
- :0
-DTSTART
- :00000000T000000
-DTEND
- :00000000T000000
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//hacksw/handcal//NONSGML v1.0//EN
-BEGIN:VEVENT
-DTSTART:19970714T170000Z
-DTEND:19970715T035959Z
-SUMMARY:Bastille Day Party
-RRULE:FREQ=YEARLY;UNTIL=123456T123456;BYSETPOS=-1,2,-3,4,-5,6,-7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,4,25,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,52,53,54;BYSECOND=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,4,25,26
-END:VEVENT
-END:VCALENDAR
-END:VCALENDAR
diff --git a/libversit/.cvsignore b/libversit/.cvsignore
deleted file mode 100644
index 36a99050c8..0000000000
--- a/libversit/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-vcc.c
-vcc.lo
-vobject.lo
-vcaltmp.lo
-libversit.la \ No newline at end of file
diff --git a/libversit/Makefile.am b/libversit/Makefile.am
deleted file mode 100644
index 5d42636c1c..0000000000
--- a/libversit/Makefile.am
+++ /dev/null
@@ -1,15 +0,0 @@
-
-noinst_LTLIBRARIES = libversit.la
-
-libversit_la_SOURCES = \
- vcc.y \
- vcc.h \
- vobject.c \
- vobject.h \
- port.h \
- vcaltmp.c \
- vcaltmp.h
-
-EXTRA_DIST = README.TXT vcaltest.c vctest.c
-
-YFLAGS=-pversit_
diff --git a/libversit/README.TXT b/libversit/README.TXT
deleted file mode 100644
index c8ce8b0979..0000000000
--- a/libversit/README.TXT
+++ /dev/null
@@ -1,951 +0,0 @@
-NOTE: If you used the earlier APIs released by Versit
-then you will want to look at the document "migrate.doc"
-included with this package. It contains a discussion of
-the differences between the old API and this one.
-
-----------------------------------------------------------------
-
-The vCard/vCalendar C interface is implemented in the set
-of files as follows:
-
-vcc.y, yacc source, and vcc.c, the yacc output you will use
-implements the core parser
-
-vobject.c implements an API that insulates the caller from
-the parser and changes in the vCard/vCalendar BNF
-
-port.h defines compilation environment dependent stuff
-
-vcc.h and vobject.h are header files for their .c counterparts
-
-vcaltmp.h and vcaltmp.c implement vCalendar "macro" functions
-which you may find useful.
-
-test.c is a standalone test driver that exercises some of
-the features of the APIs provided. Invoke test.exe on a
-VCARD/VCALENDAR input text file and you will see the pretty
-print output of the internal representation (this pretty print
-output should give you a good idea of how the internal
-representation looks like -- there is one such output in the
-following too). Also, a file with the .out suffix is generated
-to show that the internal representation can be written back
-in the original text format.
-
------------------------------------------------------------------
-
-
- VObject for VCard/VCalendar
-
-Table of Contents
-=================
-1. VObject
-2. Internal Representations of VCard/VCalendar
-3. Iterating Through VObject's Properties or Values
-4. Pretty Printing a VObject Tree
-5. Building A VObject Representation of A VCard/VCalendar
-6. Converting A VObject Representation Into Its Textual Representation
-7. Miscellaneous Notes On VObject APIs usages
-8. Brief descriptions of each APIs
-9. Additional Programming Notes.
-
-This document is mainly about the VObject and its APIs. The main
-use of a VObject is to represent a VCard or a VCalendar inside
-a program. However, its use is not limited to aforemention as it
-can represent an arbitrary information that makes up of a tree or
-forest of properties/values.
-
-1. VObject
- =======
-A VObject can have a name (id) and a list of associated properties and
-a value. Each property is itself a VObject.
-
-2. Internal Representations of VCard/VCalendar
- ===========================================
-A list of VCard or a VCalendar is represented by a list of VObjects.
-The name (id) of the VObjects in the list is either VCCardProp or
-VCCalProp. Each of these VObjects can have a list of properties.
-Since a property is represented as a VObject, each of these properties
-can have a name, a list of properties, and a value.
-
-For example, the input file "vobject.vcf":
-
-BEGIN:VCARD
-N:Alden;Roland
-FN:Roland H. Alden
-ORG:AT&T;Versit Project Office
-TITLE:Consultant
-EMAIL;WORK;PREF;INTERNET:sf!rincon!ralden@alden.attmail.com
-EMAIL;INTERNET:ralden@sfgate.com
-EMAIL;MCIMail:242-2200
-LABEL;DOM;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-Suite 2208=0A=
-One Pine Street=0A=
-San Francisco, CA 94111
-LABEL;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-Suite 2208=0A=
-One Pine Street=0A=
-San Francisco, CA 94111=0A=
-U.S.A.
-TEL;WORK;PREF;MSG:+1 415 296 9106
-TEL;WORK;FAX:+1 415 296 9016
-TEL;MSG;CELL:+1 415 608 5981
-ADR:;Suite 2208;One Pine Street;San Francisco;CA;94111;U.S.A.
-SOUND:ROW-LAND H ALL-DIN
-LOGO;GIF;BASE64:
- R0lGODdhpgBOAMQAAP///+/v797e3s7Ozr29va2trZycnIyMjHt7e2NjY1JSUkJC
- QjExMSEhIRAQEO///87v9973/73n95zW71K13jGl1nvG50Kt3iGc1gCMzq3e94zO
- 7xCU1nO952O15wAAACwAAAAApgBOAAAF/yAgjmRpnmiqrmzrvnAsz3Rt33iu73zv
- /8CgcEj8QTaeywWTyWCUno2kSK0KI5tLc8vtNi+WiHVMlj0mFK96nalsxOW4fPSw
- cNj4tQc+7xcjGh4WExJTJYUTFkp3eU0eEH6RkpOUlTARhRoWm5ydFpCWoS0QEqAu
- ARKaHRcVjV0borEoFl0cSre4Sq67FA+yvwAeTU8XHZ7HmxS6u2wVfMCVpAE3pJoW
- ylrMptDcOqSF4OHg3eQ5pInInb7lcc86mNbLzBXsZbRfUOn6ucyNHvVWJHCpQFDf
- MWwEEzLqx2YCQCqF3OnItClJNmYcJD7cSAKTuI/gtnEcOQKkyVIk6/+ds5CkFcMM
- 61LiENikwi1jBnNyuvUSjwWZOS5uIZarqNFcNl32XMMB6I06GgoJ+bZp1ZKeDl8E
- +MC1K1cBIhZ4HUu2LAsCZdOWRQDt20lxIlccSHsgrNq7Xc/ixcsWmNu34WKyYJCW
- gQjCe9XqTZy2L4pv04gg2sSKSc8OLgTcBSuWsdkVaD2TdXyiQxebFyjo1Gnx6tJm
- LuaqrdtZtNfFtruSNmF5IKujwIsmJbjwtRqNJhrcNVw79wcRAgogmE4ArIjQzj/s
- JvHAGCFDQR4UqigPK4sBe62XwO51OwADiMcqUG+iOdcFAL+hW20BfAoEexlwAnu6
- mZDAXQ1EVh//WfhxJB5gIbHgwFgOTOiVAgOuVQKAfKFg3weGwSBYFZMp4hpDGKyA
- 3lgJKECWgiMQyBVpW+0V4oJjNfhCNkR1IgWEb21QlRK9GdfFCgeOZYBsXgm4noYj
- GEBhAQHYh0J8XenoQnFGdrkUciJY6FUAK15ogozakcBhliKsyZWHDMZQ0wWC/Aim
- DB6h01KRr/lXQgFxAqDcWDACgCZpUnrVQJtjwTnWjS6MWAYqqfDnSaEkJOlVXQBo
- 2pWTMUJ53WgAuPncCR9q6VQMAYjZlXWJmknCoSUM2p4BC+SaKwG88hoZlvfFMM4f
- hQh5TXkv+RklWYtC91mopJIAKFkJlDAW/wF25ShnLbeo5gmQ+1FGkJdrKCuCi2OR
- BuwHBcwqKgABrMtVAgpem61XkLbAJ7n8uiIpvGVhO4KpH1QLbbpqLheZvQCkGoNL
- thSzSTg2UGVBBzbtaxwKsYrmgLvRAlCmWgwMAADD66rKAgR3XlGspcdkZYK8ibU7
- asgEl+XAyB8I7PCqMWiWncGGimpfAgO4ypXSPpOVLwsRCDJxRD2AoyeRRv5kApO5
- fXwzwvfOKLKtaTWtbQxccmGLTZy8xYlVSvXbhbk0M2YzrYfJJ0K8m+V9NgxpyC04
- UycI/aiuiH9Y8NftDUwWp1Wm5UABnAUKwwRsPFGBt4Oc9PZvGvNLwf8JOZt8Arpe
- eY23yDovwIDiBX74NAsPVLDJj3Hh4JEExsKcjrlKf9DsCVx3ZfLqAKBuG1s/A90C
- z2KjYHjjyPOdG1spz6BBUr+BcUxUb1nDCTa/VZD2Uv+YkLPAKJC9dNEh7628WgqI
- ybzlaA+ufxMa6bxC6ciLUQLcx5UGIAAsAkDA6wQkOxrcY39yo4cQMNWCAPTKV1R4
- wPkgaBxzOc8FtMiF1NoGoXBRJjgoPApmPsjCFlbMdzCM4TFy50IXxI2DPcHAv2rY
- gghsEIeu8CAPW6ABIPYEFkOsAeaMyIz0JfGJUExBBGRIRX0IMYovWCIT1eBELNpA
- i1vcgta8iANPCIQOghzQABl30J0tXqBla4wjFLFQxZzAUY42CIAd5OYBCuKxB2c4
- I0b28EcrQKADgmSKB9RYyDhA4BqCxIBqrtjIMTwoFeCjYSU3KZMQAAA7
-
-BEGIN:VCALENDAR
-DCREATED:19960523T100522
-PRODID:-//Alden Roland/Hand Crafted In North Carolina//NONSGML Made By Hand//EN
-VERSION:0.3
-BEGIN:VEVENT
-START:19960523T120000
-END:19960523T130000
-SUBTYPE:PHONE CALL
-SUMMARY:VERSIT PDI PR Teleconference/Interview
-DESCRIPTION:VERSIT PDI PR Teleconference/Interview With Tom Streeter and Alden Roland
-END:VEVENT
-BEGIN:VEVENT
-START:19960523T113000
-END:19960523T115500
-SUBTYPE:LUNCH
-SUMMARY:Eat in the cafeteria today
-END:VEVENT
-END:VCALENDAR
-
-END:VCARD
-
-
-will conceptually be be represented as
- vcard
- VCNameProp
- VCFamilyNameProp=Alden
- VCGivenNameProp=Roland
- VCFullNameProp=Roland H.Alden
- ....
-
-note that
- EMAIL;WORK;PREF;INTERNET:sf!rincon!ralden@alden.attmail.com
-will be represented as:
- VCEmailAddress=sf!rincon!ralden@alden.attmail.com
- VCWork
- VCPreferred
- VCInternet
-where the lower level properties are properties of the property
-VCEmailAddress.
-
-Groupings are flattened out in the VObject representation such
-that:
- a.b:blah
- a.c:blahblah
-are represented as:
- b=blah
- VCGrouping=a
- c=blahblah
- VCGrouping=a
-i.e. one can read the above as:
- the property "b" has value "blah" and property "VCGrouping"
- with the value "a".
- the property "c" has value "blahblah" and property "VCGrouping"
- with the value "a".
-likewise, multi-level groupings are flatten similarly. e.g.
- a.b.c:blah
- a.b.e:blahblah
--->
- c=blah
- VCGrouping=b
- VCGrouping=a
- e=blahblah
- VCGrouping=b
- VCGrouping=a
-which read:
- the property "c" has value "blah" and property "VCGrouping"
- with the value "b" which has property "VCGrouping"
- with value "a".
- the property "e" has value "blahblah" and property "VCGrouping"
- with the value "b" which has property "VCGrouping"
- with value "a".
-
-3. Iterating Through VObject's Properties or Values
- ================================================
-The following is a skeletal form of iterating through
-all properties of a vobject, o:
-
- // assume the object of interest, o, is of type VObject
- VObjectIterator i;
- initPropIterator(&i,o);
- while (moreIteration(&i)) {
- VObject *each = nextVObject(&i);
- // ... do something with "each" property
- }
-
-Use the API vObjectName() to access a VObject's name.
-Use the API vObjectValueType() to determine if a VObject has
- a value. For VCard/VCalendar application, you
- should not need this function as practically
- all values are either of type VCVT_USTRINGZ or
- VCVT_RAW (i.e set by setVObjectUStringZValue and
- setVObjectAnyValue APIs respectively), and the
- value returned by calls to vObjectUStringZValue
- and vObjectAnyValue are 0 if a VObject has no
- value. (There is a minor exception where VObject with
- VCDataSizeProp has value that is set by
- setVObjectLongValue).
-Use the APIs vObject???Value() to access a VObject's value.
- where ??? is the expected type.
-Use the APIs setvObject???Value() to set or modify a VObject's value.
- where ??? is the expected type.
-Use the API isAPropertyOf() to query if a name match the name of
- a property of a VObject. Since isAPropertyOf() return
- the matching property, we can use that to retrieve
- a property and subsequently the value of the property.
-
-4. Pretty Printing a VObject Tree
- ==============================
-VObject tree can be pretty printed with the printVObject() function.
-The output of pretty printing a VObject representation of the input
-test file "vobject.vcf" is shown below. Note that the indentation
-indicates the tree hirerarchy where the immediate children nodes
-of a parent node is all at the same indentation level and the
-immediate children nodes are the immediate properties of the
-associated parent nodes. In the following, {N,FN,ORG,TITLE,...}
-are immediate properties of VCARD. {F and G} are properties of N
-with value {"Alden" and "Roland"} respectively; FN has no property
-but has the value "Roland H. Alden"; EMAIL has value and
-the properties WORK, PREF, and INTERNET.
-
-
-VCARD
- N
- F="Alden"
- G="Roland"
- FN="Roland H. Alden"
- ORG
- ORGNAME="AT&T"
- OUN="Versit Project Office"
- TITLE="Consultant"
- EMAIL="sf!rincon!ralden@alden.attmail.com"
- WORK
- PREF
- INTERNET
- EMAIL="ralden@sfgate.com"
- INTERNET
- EMAIL="242-2200"
- MCIMail
- LABEL="Roland H. Alden
- Suite 2208
- One Pine Street
- San Francisco, CA 94111"
- DOM
- POSTAL
- PARCEL
- HOME
- WORK
- QP
- LABEL="Roland H. Alden
- Suite 2208
- One Pine Street
- San Francisco, CA 94111
- U.S.A."
- POSTAL
- PARCEL
- HOME
- WORK
- QP
- TEL="+1 415 296 9106"
- WORK
- PREF
- MSG
- TEL="+1 415 296 9016"
- WORK
- FAX
- TEL="+1 415 608 5981"
- MSG
- CELL
- ADR
- EXT ADD="Suite 2208"
- STREET="One Pine Street"
- L="San Francisco"
- R="CA"
- PC="94111"
- C="U.S.A."
- SOUND="ROW-LAND H ALL-DIN"
- LOGO=[raw data]
- GIF
- BASE64
- DataSize=1482
-VCALENDAR
- DCREATED="19960523T100522"
- PRODID="-//Alden Roland/Hand Crafted In North Carolina//NONSGML Made By Hand//EN"
- VERSION="0.3"
- VEVENT
- START="19960523T120000"
- END="19960523T130000"
- SUBTYPE="PHONE CALL"
- SUMMARY="VERSIT PDI PR Teleconference/Interview"
- DESCRIPTION="VERSIT PDI PR Teleconference/Interview With Tom Streeter and Alden Roland"
- VEVENT
- START="19960523T113000"
- END="19960523T115500"
- SUBTYPE="LUNCH"
- SUMMARY="Eat in the cafeteria today"
-
-5. Building A VObject Representation of A VCard/VCalendar
- ======================================================
-The parser in vcc.y converts an input file with one or more
-VCard/VCalendar that is in their textual representation
-into their corresponding VObject representation.
-
-VObject representation of a VCard/VCalendar can also be built
-directly with calls to the VObject building APIs. e.g.
-
- VObject *prop;
- VObject *vcard = newVObject(VCCardProp);
- prop = addProp(vcard,VCNameProp);
- addPropValue(prop,VCFamilyNameProp,"Alden");
- addPropValue(prop,VCGivenNameProp,"Roland");
- addPropValue(vcard,VCFullNameProp,"Roland H. Alden");
- ....
-
-6. Converting A VObject Representation Into Its Textual Representation
- ===================================================================
-The VObject representation can be converted back to its textual
-representation via the call to writeVObject() or writeMemVObject()
-API. e.g.
- a. to write to a file:
- // assume vcard is of type VObject
- FILE *fp = fopen("alden.vcf","w");
- writeVObject(fp,vcard);
- a. to write to memory, and let the API allocate the required memory.
- char* clipboard = writeVObject(0,0,vcard);
- ... do something to clipboard
- free(clipboard);
- b. to write to a user allocated buffer:
- char clipboard[16384];
- int len = 16384;
- char *buf = writeVObject(clipboard,&len,vcard);
- ... buf will be equal to clipboard if the write
- is successful otherwise 0.
-
-In the case of writing to memory, the memory buffer can be either
-allocated by the API or the user. If the user allocate the
-memory for the buffer, then the length of the buffer needs to be
-communicated to the API via a variable. The variable passed as
-the length argument will be overwritten with the actual size
-of the text output. A 0 return value from writeMemVObject()
-indicates an error which could be caused by overflowing the
-size of the buffer or lack of heap memory.
-
-7. Miscellaneous Notes On VObject APIs usages
- ==========================================
-a. vcc.h -- contains basic interfaces to the parser:
- VObject* Parse_MIME(const char *input, unsigned long len);
- VObject* Parse_MIME_FromFile(FILE *file);
- -- both of this return a null-terminated list of
- VObject that is either a VCARD or VCALENDAR.
- To iterate through this list, do
- VObject *t, *v;
- v = Parse_Mime_FromFile(fp);
- while (v) {
- // ... do something to v.
- t = v;
- v = nextVObjectInList(v);
- cleanVObject(t);
- }
- note that call to cleanVObject will release
- resource used to represent the VObject.
-
-b. vobject.h -- contains basic interfaces to the VObject APIs.
- see the header for more details.
- The structure of VObject is purposely (hiddened) not exposed
- to the user. Every access has to be done via
- the APIs. This way, if we need to change the
- structure or implementation, the client need not
- recompile as long as the interfaces remain the
- same.
-
-c. values of a property is determined by the property definition
- itself. The vobject APIs does not attempt to enforce
- any of such definition. It is the consumer responsibility
- to know what value is expected from a property. e.g
- most properties have unicode string value, so to access
- the value of these type of properties, you will use
- the vObjectUStringZValue() to read the value and
- setVObjectUStringZValue() to set or modify the value.
- Refer to the VCard and VCalendar specifications for
- the definition of each property.
-
-d. properties name (id) are case incensitive.
-
-8. Brief descriptions of each APIs
- ===============================
- * the predefined properties' names (id) are listed under vobject.h
- each is of the form VC*Prop. e.g.
- #define VC7bitProp "7BIT"
- #define VCAAlarmProp "AALARM"
- ....
-
- * consumer of a VObject can only define pointers to VObject.
-
- * a variable of type VObjectIterator, say "i", can be used to iterate
- through a VObject's properties, say "o". The APIs related to
- VObjectIterator are:
- void initPropIterator(VObjectIterator *i, VObject *o);
- -- e.g. usage
- initPropIterator(&i,o);
- int moreIteration(VObjectIterator *i);
- -- e.g. usage
- while (moreIteration(&i)) { ... }
- VObject* nextVObject(VObjectIterator *i);
- -- e.g. usage
- while (moreIteration(&i)) {
- VObject *each = nextVObject(&i);
- }
-
- * VObject can be chained together to form a list. e.g. of such
- use is in the parser where the return value of the parser is
- a link list of VObject. A link list of VObject can be
- built by:
- void addList(VObject **o, VObject *p);
- and iterated by
- VObject* nextVObjectInList(VObject *o);
- -- next VObjectInList return 0 if the list
- is exhausted.
-
- * the following APIs are mainly used to construct a VObject tree:
- VObject* newVObject(const char *id);
- -- used extensively internally by VObject APIs but when
- used externally, its use is mainly limited to the
- construction of top level object (e.g. an object
- with VCCardProp or VCCalendarProp id).
-
- void deleteVObject(VObject *p);
- -- to deallocate single VObject, for most user, use
- cleanVObject(VObject *o) instead for freeing all
- resources associated with the VObject.
-
- char* dupStr(const char *s, unsigned int size);
- -- duplicate a string s. If size is 0, the string is
- assume to be a null-terminated.
-
- void deleteStr(const char *p);
- -- used to deallocate a string allocated by dupStr();
-
- void setVObjectName(VObject *o, const char* id);
- -- set the id of VObject o. This function is not
- normally used by the user. The setting of id
- is normally done as part of other APIs (e.g.
- addProp()).
-
- void setVObjectStringZValue(VObject *o, const char *s);
- -- set a string value of a VObject.
-
- void setVObjectUStringZValue(VObject *o, const wchar_t *s);
- -- set a Unicode string value of a VObject.
-
- void setVObjectIntegerValue(VObject *o, unsigned int i);
- -- set an integer value of a VObject.
-
- void setVObjectLongValue(VObject *o, unsigned long l);
- -- set an long integer value of a VObject.
-
- void setVObjectAnyValue(VObject *o, void *t);
- -- set any value of a VObject. The value type is
- unspecified.
-
- VObject* setValueWithSize(VObject *prop, void *val, unsigned int size);
- -- set a raw data (stream of bytes) value of a VObject
- whose size is size. The internal VObject representation
- is
- this object = val
- VCDataSizeProp=size
- i.e. the value val will be attached to the VObject prop
- and a property of VCDataSize whose value is size
- is also added to the object.
-
- void setVObjectVObjectValue(VObject *o, VObject *p);
- -- set a VObject as the value of another VObject.
-
- const char* vObjectName(VObject *o);
- -- retrieve the VObject's Name (i.e. id).
-
- const char* vObjectStringZValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- null-terminated string.
-
- const wchar_t* vObjectUStringZValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- null-terminated unicode string.
-
- unsigned int vObjectIntegerValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- integer.
-
- unsigned long vObjectLongValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- long integer.
-
- void* vObjectAnyValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- any value.
-
- VObject* vObjectVObjectValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- a VObject.
-
- VObject* addVObjectProp(VObject *o, VObject *p);
- -- add a VObject p as a property of VObject o.
- (not normally used externally for building a
- VObject).
-
- VObject* addProp(VObject *o, const char *id);
- -- add a property whose name is id to VObject o.
-
- VObject* addPropValue(VObject *o, const char *id, const char *v);
- -- add a property whose name is id and whose value
- is a null-terminated string to VObject o.
-
- VObject* addPropSizedValue(VObject *o, const char *id,
- const char *v, unsigned int size);
- -- add a property whose name is id and whose value
- is a stream of bytes of size size, to VObject o.
-
- VObject* addGroup(VObject *o, const char *g);
- -- add a group g to VObject o.
- e.g. if g is a.b.c, you will have
- o
- c
- VCGroupingProp=b
- VCGroupingProp=a
- and the object c is returned.
-
- VObject* isAPropertyOf(VObject *o, const char *id);
- -- query if a property by the name id is in o and
- return the VObject that represent that property.
-
- void printVObject(VObject *o);
- -- pretty print VObject o to stdout (for debugging use).
-
- void writeVObject(FILE *fp, VObject *o);
- -- convert VObject o to its textual representation and
- write it to file.
-
- char* writeMemVObject(char *s, int *len, VObject *o);
- -- convert VObject o to its textual representation and
- write it to memory. If s is 0, then memory required
- to hold the textual representation will be allocated
- by this API. If a variable len is passed, len will
- be overwriten with the byte size of the textual
- representation. If s is non-zero, then s has to
- be a user allocated buffer whose size has be passed
- in len as a variable. Memory allocated by the API
- has to be freed with call to free. The return value
- of this API is either the user supplied buffer,
- the memory allocated by the API, or 0 (in case of
- failure).
-
- void cleanStrTbl();
- -- this function has to be called when all
- VObject has been destroyed.
-
- void cleanVObject(VObject *o);
- -- release all resources used by VObject o.
-
- wchar_t* fakeUnicode(const char *ps, int *bytes);
- -- convert char* to wchar_t*.
-
- extern int uStrLen(const wchar_t *u);
- -- length of unicode u.
-
- char *fakeCString(const wchar_t *u);
- -- convert wchar_t to CString (blindly assumes that
- this could be done).
-
-9. Additional Programming Notes
- ============================
-In the following notes, please refers to the listing
-of Example.vcf and its VObject Representation
-(shown at the end of this section).
-
-* Handling the Return Value of the VCard/VCalendar Parser
- The example input text file contains two root VObjects
- (a VCalendar and a VCard). The output of the VCard/VCalendar
- parser is a null-terminated list of VObjects. For this
- particular input file, the list will have two VObjects.
- The following shows a template for iterating through the
- output of the Parser:
-
- VObject *t, *v;
- v = Parse_Mime_fromFileName("example.vcf");
- while (v) {
- // currently, v will either be a VCard or a VCalendar
- // do whatever your application need to do to
- // v here ...
- t = v;
- v = nextVObjectInList(v);
- cleanVObject(t);
- }
-
-* Iterating Through a VCard/VCalendar VObject
- From the VObject APIs point of view, a VCard VObject
- is the same as a VCalendar VObject. However, the application
- needs to know what are in a VCard or a VCalendar.
- For example, A VCalendar VObject can have VCDCreatedProp,
- a VCGEOLocationProp, etc, and one or more VCEventProp and
- or VCTodoProp. The VCEventProp and VCTodoProp can have
- many properties of their own, which in turn could have
- more properties (e.g. VCDAlarmProp can be a VCEventProp
- VObject's property, and VCRunTimeProp can be a
- VCDAlarmProp VObject's property. Because a VObject tree
- can be arbitrarily complex, in general, to process all
- properties and values of a VObject tree, a recursive walk
- is desirable. An example recursive VObject tree walk
- can be found in the vobject.c source lines for printVObject*
- and writeVObject* APIs. Depending on what the application need
- to do with a VCard or a VCalendar, a recursive walk
- of the VObject tree may or may not be desirable. An example
- template of a non-recursive walk is shown below:
-
- void processVCardVCalendar(char *inputFile)
- {
- VObject *t, *v;
- v = Parse_Mime_fromFileName(inputFile);
- while (v) {
- char *n = vObjectName(v);
- if (strcmp(n,VCCardProp) == 0) {
- do_VCard(v);
- }
- else if (strcmp(n,VCCalendarProp) == 0) {
- do_VCalendar(v);
- }
- else {
- // don't know how to handle anything else!
- }
- t = v;
- v = nextVObjectInList(v);
- cleanVObject(t);
- }
- }
-
- void do_VCard(VObject *vcard)
- {
- VObjectIterator t;
- initPropIterator(&t,vcard);
- while (moreIteration(&t)) {
- VObject *eachProp = nextVObject(&t);
- // The primarly purpose of this example is to
- // show how to iterate through a VCard VObject,
- // it is not meant to be efficient at all.
- char *n = vObjectName(eachProp);
- if (strcmp(n,VCNameProp)==0) {
- do_name(eachProp);
- }
- else if (strcmp(n,VCEmailProp)==0) {
- do_email(eachProp);
- }
- else if (strcmp(n,VCLabelProp)==0) {
- do_label(eachProp);
- }
- else if ....
- }
- }
-
- void do_VCalendar(VObject *vcal)
- {
- VObjectIterator t;
- initPropIterator(&t,vcard);
- while (moreIteration(&t)) {
- VObject *eachProp = nextVObject(&t);
- // The primarly purpose of this example is to
- // show how to iterate through a VCalendar VObject,
- // it is not meant to be efficient at all.
- char *n = vObjectName(eachProp);
- if (strcmp(n,VCDCreatedProp)==0) {
- do_DCreated(eachProp);
- }
- else if (strcmp(n,VCVersionProp)==0) {
- do_Version(eachProp);
- }
- else if (strcmp(n,VCTodoProp)==0) {
- do_Todo(eachProp);
- }
- else if (strcmp(n,VCEventProp)==0) {
- do_Event(eachProp);
- }
- else if ....
- }
- }
-
- void do_Todo(VObject *vtodo) { ... }
-
- void do_Event(VObject *vevent) { ... }
-
- ...
-
-* Property's Values and Properties
- The VObject APIs do not attempt to check for the
- correctness of the values of a property. Nor do they
- will prevent the user from attaching a non-VCard/VCalendar
- standard property to a VCard/VCalendar property. Take
- the example of line [11] of the example, "O.K" is not
- a valid value of VCStatusProp. It is up to the application
- to accept or reject the value of a property.
-
-* Output of printVObject
- PrintVObject pretty prints a VObject tree in human
- readable form. See the listing at the end of the file
- for an example output of printVObject on the example
- input file "Example.vcf".
-
- Note that binary data are not shown in the output of
- printVObject. Instead, a note is made ([raw data]) to
- indicate that there exists such a binary data.
-
-* Note on Binary Data
- When the value of a property is a binary data, it is only
- useful to know the size of the binary data.
-
- In the case of the VCard/VCalendar parser, it chooses
- to represent the size information as a separate property
- called VCDataSizeProp whose value is the size of the binary
- data. The APIs sequence to construct the VObject subtree
- of line [44] of Example.vcf is
-
- // VObject *vcard;
- VObject *p1 = addProp(vcard,VCLogoProp);
- (void) addProp(p1,VCGIFProp);
- (void) addProp(p1,VCBASE64Prop);
- VObject *p2 = addProp(p1,VCDataSizeProp);
- (void) setVObjectLongValue(p2,1482);
- setVObjectAnyValue(vcard,...pointer to binary data);
-
- Note the presence of VCBase64Prop will cause the
- writeVObject API to output the binary data as BASE64 text.
- For VCard/VCalendar application, having the VCBase64Prop
- property is pratically always neccessary for property with
- binary data as its value.
-
-* Note on Quoted-Printable String
- String value with embedded newline are written out as
- quoted-prinatable string. It is therefore important
- to mark a property with a string value that has
- one or more embedded newlines, with the VCQutedPrintableProp
- property. e.g.
-
- // VObject *root;
- char *msg="To be\nor\nnot to be";
- VObject *p = addPropValue(root,VCDescriptionProp,msg);
- // the following is how you mark a property with
- // a property. In this case, the marker is
- // VCQuotedPrintableProp
- addProp(p,VCQuotedPrintableProp);
-
-* Note on Unicode
- Although, the current parser takes ASCII text file only,
- string values are all stored as Unicode in the VObject tree.
- For now, when using the VObject APIs to construct a
- VObject tree, one should always convert ASCII string value
- to a Unicode string value:
-
- // VObject *root;
- VObject *p = addProp(root,VCSomeProp);
- setVObjectUStringZValue(p,fakeUnicode(someASCIIStringZvalue));
-
- An API is provided to simplify the above process:
-
- addPropValue(root,VCSomeProp,someASCIIStringZValue);
-
- Note that someASCIISTringZValue is automatically converted to
- Unicode by addPropValue API, where as, the former code
- sequence do an explicit call to fakeUnicode.
-
- To read back the value, one should use the vObjectUStringZValue
- API not vObjectStringZValue API. The value returned by the
- vObjectUStringZValue API is a Unicode string. If the application
- do not know how to handle Unicode string, it can use the
- fakeCString API to convert it back to ASCII string (as long
- as the conversion is meaningful).
-
- Note that fakeCString return a heap allocated memory. It is
- important to call deleteStr on fakeCString return value if
- it is not longer required (or there will be memory leak).
-
- NOTE: Unfortunately, at the point when this document is written,
- there is still no consensus on how Unicode is to be handled
- in the textual representation of VCard/VCalendar. So, there
- is no version of writeVObject and the parser to output and
- input Unicode textual representation of VCard/VCalendar.
-
-
-Example.vcf
------------
-line
-number Input Text (example.vcf)
------- ----------
-1 BEGIN:VCALENDAR
-2 DCREATED:19961102T100522
-3 GEO:0,0
-4 VERSION:1.0
-5 BEGIN:VEVENT
-6 DTSTART:19961103T000000
-7 DTEND:20000101T000000
-8 DESCRIPTION;QUOTED-PRINTABLE:To be =0A=
-9 or =0A=
-10 not to be
-11 STATUS:O.K.
-12 X-ACTION:No action required
-13 DALARM:19961103T114500;5;3;Enjoy
-14 MALARM:19970101T120000;;;johny@nowhere.com;Call Mom.
-15 END:VEVENT
-16
-17 BEGIN:VTODO
-18 DUE:19960614T0173000
-19 DESCRIPTION:Relex.
-20 END:VTODO
-21
-22 END:VCALENDAR
-23
-24 BEGIN:VCARD
-25 N:Alden;Roland
-26 FN:Roland H. Alden
-27 ORG:AT&T;Versit Project Office
-28 TITLE:Consultant
-29 EMAIL;WORK;PREF;INTERNET:ralden@ralden.com
-30 LABEL;DOM;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-31 Suite 2208=0A=
-32 One Pine Street=0A=
-33 San Francisco, CA 94111
-34 LABEL;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-35 Suite 2208=0A=
-36 One Pine Street=0A=
-37 San Francisco, CA 94111=0A=
-38 U.S.A.
-39 TEL;WORK;PREF;MSG:+1 415 296 9106
-40 TEL;WORK;FAX:+1 415 296 9016
-41 TEL;MSG;CELL:+1 415 608 5981
-42 ADR:;Suite 2208;One Pine Street;San Francisco;CA;94111;U.S.A.
-43 SOUND:ROW-LAND H ALL-DIN
-44 LOGO;GIF;BASE64:
-45 R0lGODdhpgBOAMQAAP///+/v797e3s7Ozr29va2trZycnIyMjHt7e2NjY1JSUkJC
- ... 30 lines of BASE64 data not shown here.
-76 END:VCARD
-
-
-VObject Representation of Example.vcf:
--------------------------------------
-line
-in
-text
-file VObject Tree as Printed by printVObject API
----- -------------------------------------------
-1 VCALENDAR
-2 DCREATED="19961102T100522"
-3 GEO="0,0"
-4 VERSION="1.0"
-5 VEVENT
-6 DTSTART="19961103T000000"
-7 DTEND="20000101T000000"
-8 DESCRIPTION="To be
-9 or
-10 not to be"
-8 QUOTED-PRINTABLE
-11 STATUS="O.K."
-12 X-ACTION="No action required"
-13 DALARM
-13 RUNTIME="19961103T114500"
-13 SNOOZETIME="5"
-13 REPEATCOUNT="3"
-13 DISPLAYSTRING="Enjoy"
-14 MALARM
-14 RUNTIME="19970101T120000"
-14 EMAIL="johny@nowhere.com"
-14 NOTE="Call Mom"
-17 VTODO
-18 DUE="19960614T0173000"
-19 DESCRIPTION="Relex."
-24 VCARD
-25 N
-25 F="Alden"
-25 G="Roland"
-26 FN="Roland H. Alden"
-27 ORG
-27 ORGNAME="AT&T"
-27 OUN="Versit Project Office"
-28 TITLE="Consultant"
-29 EMAIL="ralden@alden.com"
-29 WORK
-29 PREF
-29 INTERNET
-30 LABEL="Roland H. Alden
-31 Suite 2208
-32 One Pine Street
-33 San Francisco, CA 94111"
-30 DOM
-30 POSTAL
-30 PARCEL
-30 HOME
-30 WORK
-30 QUOTED-PRINTABLE
-34 LABEL="Roland H. Alden
-35 Suite 2208
-36 One Pine Street
-37 San Francisco, CA 94111
-38 U.S.A."
-34 POSTAL
-34 PARCEL
-34 HOME
-34 WORK
-34 QUOTED-PRINTABLE
-39 TEL="+1 415 296 9106"
-39 WORK
-39 PREF
-39 MSG
-40 TEL="+1 415 296 9016"
-40 WORK
-40 FAX
-41 TEL="+1 415 608 5981"
-41 MSG
-41 CELL
-42 ADR
-42 EXT ADD="Suite 2208"
-42 STREET="One Pine Street"
-42 L="San Francisco"
-42 R="CA"
-42 PC="94111"
-42 C="U.S.A."
-43 SOUND="ROW-LAND H ALL-DIN"
-44 LOGO=[raw data]
-44 GIF
-44 BASE64
-44 DATASIZE=1482
-
diff --git a/libversit/port.h b/libversit/port.h
deleted file mode 100644
index 1768beebd8..0000000000
--- a/libversit/port.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
-
-The software is provided with RESTRICTED RIGHTS. Use, duplication, or
-disclosure by the government are subject to restrictions set forth in
-DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
-
-***************************************************************************/
-
-#ifndef __PORT_H__
-#define __PORT_H__ 1
-
-
-#if defined(__CPLUSPLUS__) || defined(__cplusplus)
-extern "C" {
-#endif
-
-/* some of these #defines are commented out because */
-/* Visual C++ sets them on the compiler command line instead */
-
-/* #define _DEBUG */
-/* #define WIN32 */
-/* #define WIN16 */
-/* #define _WINDOWS */
-/* #define __MWERKS__ */
-/* #define INCLUDEMFC */
-
-#define vCardClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCard"
-#define vCalendarClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCalendar"
-
-/* The above strings vCardClipboardFormat and vCalendarClipboardFormat
-are globally unique IDs which can be used to generate clipboard format
-ID's as per the requirements of a specific platform. For example, in
-Windows they are used as the parameter in a call to RegisterClipboardFormat.
-For example:
-
- CLIPFORMAT foo = RegisterClipboardFormat(vCardClipboardFormat);
-
-*/
-
-#define vCardMimeType "text/x-vCard"
-#define vCalendarMimeType "text/x-vCalendar"
-
-#define DLLEXPORT(t) t
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#define stricmp strcasecmp
-
-#if defined(__CPLUSPLUS__) || defined(__cplusplus)
-}
-#endif
-
-#endif /* __PORT_H__ */
diff --git a/libversit/vcaltest.c b/libversit/vcaltest.c
deleted file mode 100644
index 5528aab1d1..0000000000
--- a/libversit/vcaltest.c
+++ /dev/null
@@ -1,118 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include "vcaltmp.h"
-
-#if 0
-This testcase would generate a file call "frankcal.vcf" with
-the following content:
-
-BEGIN:VCALENDAR
-DCREATED:19960523T100522
-GEO:37.24,-17.87
-PRODID:-//Frank Dawson/Hand Crafted In North Carolina//NONSGML Made By Hand//EN
-VERSION:0.3
-BEGIN:VEVENT
-DTSTART:19960523T120000
-DTEND:19960523T130000
-DESCRIPTION;QUOTED-PRINTABLE:VERSIT PDI PR Teleconference/Interview =0A=
-With Tom Streeter and Frank Dawson - Discuss VERSIT PDI project and vCard and vCalendar=0A=
-activities with European Press representatives.
-SUMMARY:VERSIT PDI PR Teleconference/Interview
-SUBTYPE:PHONE CALL
-STATUS:CONFIRMED
-TRANSP:19960523T100522-4000F100582713-009251
-UID:http://www.ibm.com/raleigh/fdawson/~c:\or2\orgfiles\versit.or2
-DALARM:19960523T114500;5;3;Your Telecon Starts At Noon!!!;
-MALARM:19960522T120000;;;fdawson@raleigh.ibm.com;Remember 05/23 Noon Telecon!!!;
-PALARM:19960523T115500;;;c:\or2\organize.exe c:\or2\orgfiles\versit.or2;
-X-LDC-OR2-OLE:c:\temp\agenda.doc
-END:VEVENT
-
-BEGIN:VTODO
-DUE:19960614T0173000
-DESCRIPTION:Review VCalendar helper API.
-END:VTODO
-
-END:VCALENDAR
-
-#endif
-
-FILE *cfp;
-
-void testVcalAPIs() {
- FILE *fp;
- VObject *vcal, *vevent;
-#if _CONSOLE
- cfp = stdout;
-#else
- cfp = fopen("vcaltest.out","w");
-#endif
- if (cfp == 0) return;
- vcal = vcsCreateVCal(
- "19960523T100522",
- "37.24,-17.87",
- "-//Frank Dawson/Hand Crafted In North Carolina//NONSGML Made By Hand//EN",
- 0,
- "0.3"
- );
-
- vevent = vcsAddEvent(
- vcal,
- "19960523T120000",
- "19960523T130000",
- "VERSIT PDI PR Teleconference/Interview \nWith Tom Streeter and Frank Dawson - Discuss VERSIT PDI project and vCard and vCalendar\nactivities with European Press representatives.",
- "VERSIT PDI PR Teleconference/Interview",
- "PHONE CALL",
- 0,
- "CONFIRMED",
- "19960523T100522-4000F100582713-009251",
- "http://www.ibm.com/raleigh/fdawson/~c:\\or2\\orgfiles\\versit.or2",
- 0
- );
-
- vcsAddDAlarm(vevent, "19960523T114500", "5", "3",
- "Your Telecon Starts At Noon!!!");
- vcsAddMAlarm(vevent, "19960522T120000", 0, 0, "fdawson@raleigh.ibm.com",
- "Remember 05/23 Noon Telecon!!!");
- vcsAddPAlarm(vevent, "19960523T115500", 0 ,0,
- "c:\\or2\\organize.exe c:\\or2\\orgfiles\\versit.or2");
-
- addPropValue(vevent, "X-LDC-OR2-OLE", "c:\\temp\\agenda.doc");
-
- vcsAddTodo(
- vcal,
- 0,
- "19960614T0173000",
- 0,
- "Review VCalendar helper API.",
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- );
-
- /* now do something to the resulting VObject */
- /* pretty print on stdout for fun */
- printVObject(cfp,vcal);
- /* open the output text file */
-
-#define OUTFILE "frankcal.vcf"
-
- fp = fopen(OUTFILE, "w");
- if (fp) {
- /* write it in text form */
- writeVObject(fp,vcal);
- fclose(fp);
- }
- else {
- fprintf(cfp,"open output file '%s' failed\n", OUTFILE);
- }
- if (cfp != stdout) fclose(cfp);
- }
-
-void main() {
- testVcalAPIs();
- }
-
diff --git a/libversit/vcaltmp.c b/libversit/vcaltmp.c
deleted file mode 100644
index ccb21a649a..0000000000
--- a/libversit/vcaltmp.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
-This module provides some helper APIs for creating
-a VCalendar object.
-
-Note on APIs:
- 1. The APIs does not attempt to verify if the arguments
- passed are correct.
- 2. Where the argument to an API is not applicable, pass
- the value 0.
- 3. See the test program at the bottom of this file as an
- example of usage.
- 4. This code calls APIs in vobject.c.
-
-*/
-
-/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
-
-The software is provided with RESTRICTED RIGHTS. Use, duplication, or
-disclosure by the government are subject to restrictions set forth in
-DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
-
-***************************************************************************/
-
-
-#include <stdio.h>
-#include <string.h>
-#include "vcaltmp.h"
-
-
-DLLEXPORT(VObject*) vcsCreateVCal(
- char *date_created,
- char *location,
- char *product_id,
- char *time_zone,
- char *version
- )
- {
- VObject *vcal = newVObject(VCCalProp);
-#define Z(p,v) if (v) addPropValue(vcal,p,v);
- Z(VCDCreatedProp, date_created);
- Z(VCLocationProp, location)
- Z(VCProdIdProp, product_id)
- Z(VCTimeZoneProp, time_zone)
- Z(VCVersionProp, version)
-#undef Z
- return vcal;
- }
-
-
-DLLEXPORT(VObject*) vcsAddEvent(
- VObject *vcal,
- char *start_date_time,
- char *end_date_time,
- char *description,
- char *summary,
- char *categories,
- char *classification,
- char *status,
- char *transparency,
- char *uid,
- char *url
- )
- {
- VObject *vevent = addProp(vcal,VCEventProp);
-#define Z(p,v) if (v) addPropValue(vevent,p,v);
- Z(VCDTstartProp,start_date_time);
- Z(VCDTendProp,end_date_time);
- if (description) {
- VObject *p = addPropValue(vevent,VCDescriptionProp,description);
- if (strchr(description,'\n'))
- addProp(p,VCQuotedPrintableProp);
- }
- Z(VCSummaryProp,summary);
- Z(VCCategoriesProp,categories);
- Z(VCClassProp,classification);
- Z(VCStatusProp,status);
- Z(VCTranspProp,transparency);
- Z(VCUniqueStringProp,uid);
- Z(VCURLProp,url);
-#undef Z
- return vevent;
- }
-
-
-DLLEXPORT(VObject*) vcsAddTodo(
- VObject *vcal,
- char *start_date_time,
- char *due_date_time,
- char *date_time_complete,
- char *description,
- char *summary,
- char *priority,
- char *classification,
- char *status,
- char *uid,
- char *url
- )
- {
- VObject *vtodo = addProp(vcal,VCTodoProp);
-#define Z(p,v) if (v) addPropValue(vtodo,p,v);
- Z(VCDTstartProp,start_date_time);
- Z(VCDueProp,due_date_time);
- Z(VCCompletedProp,date_time_complete);
- if (description) {
- VObject *p = addPropValue(vtodo,VCDescriptionProp,description);
- if (strchr(description,'\n'))
- addProp(p,VCQuotedPrintableProp);
- }
- Z(VCSummaryProp,summary);
- Z(VCPriorityProp,priority);
- Z(VCClassProp,classification);
- Z(VCStatusProp,status);
- Z(VCUniqueStringProp,uid);
- Z(VCURLProp,url);
-#undef Z
- return vtodo;
- }
-
-
-DLLEXPORT(VObject*) vcsAddAAlarm(
- VObject *vevent,
- char *run_time,
- char *snooze_time,
- char *repeat_count,
- char *audio_content
- )
- {
- VObject *aalarm= addProp(vevent,VCAAlarmProp);
-#define Z(p,v) if (v) addPropValue(aalarm,p,v);
- Z(VCRunTimeProp,run_time);
- Z(VCSnoozeTimeProp,snooze_time);
- Z(VCRepeatCountProp,repeat_count);
- Z(VCAudioContentProp,audio_content);
-#undef Z
- return aalarm;
- }
-
-
-DLLEXPORT(VObject*) vcsAddMAlarm(
- VObject *vevent,
- char *run_time,
- char *snooze_time,
- char *repeat_count,
- char *email_address,
- char *note
- )
- {
- VObject *malarm= addProp(vevent,VCMAlarmProp);
-#define Z(p,v) if (v) addPropValue(malarm,p,v);
- Z(VCRunTimeProp,run_time);
- Z(VCSnoozeTimeProp,snooze_time);
- Z(VCRepeatCountProp,repeat_count);
- Z(VCEmailAddressProp,email_address);
- Z(VCNoteProp,note);
-#undef Z
- return malarm;
- }
-
-
-DLLEXPORT(VObject*) vcsAddDAlarm(
- VObject *vevent,
- char *run_time,
- char *snooze_time,
- char *repeat_count,
- char *display_string
- )
- {
- VObject *dalarm= addProp(vevent,VCDAlarmProp);
-#define Z(p,v) if (v) addPropValue(dalarm,p,v);
- Z(VCRunTimeProp,run_time);
- Z(VCSnoozeTimeProp,snooze_time);
- Z(VCRepeatCountProp,repeat_count);
- Z(VCDisplayStringProp,display_string);
-#undef Z
- return dalarm;
- }
-
-
-DLLEXPORT(VObject*) vcsAddPAlarm(
- VObject *vevent,
- char *run_time,
- char *snooze_time,
- char *repeat_count,
- char *procedure_name
- )
- {
- VObject *palarm= addProp(vevent,VCPAlarmProp);
-#define Z(p,v) if (v) addPropValue(palarm,p,v);
- Z(VCRunTimeProp,run_time);
- Z(VCSnoozeTimeProp,snooze_time);
- Z(VCRepeatCountProp,repeat_count);
- Z(VCProcedureNameProp,procedure_name);
-#undef Z
- return palarm;
- }
-
-
-#ifdef _TEST
-
-#if 0
-This testcase would generate a file call "frankcal.vcf" with
-the following content:
-
-BEGIN:VCALENDAR
-DCREATED:19960523T100522
-GEO:37.24,-17.87
-PRODID:-//Frank Dawson/Hand Crafted In North Carolina//NONSGML Made By Hand//EN
-VERSION:0.3
-BEGIN:VEVENT
-DTSTART:19960523T120000
-DTEND:19960523T130000
-DESCRIPTION;QUOTED-PRINTABLE:VERSIT PDI PR Teleconference/Interview =0A=
-With Tom Streeter and Frank Dawson - Discuss VERSIT PDI project and vCard and vCalendar=0A=
-activities with European Press representatives.
-SUMMARY:VERSIT PDI PR Teleconference/Interview
-CATEGORIES:PHONE CALL
-STATUS:CONFIRMED
-TRANSP:19960523T100522-4000F100582713-009251
-UID:http://www.ibm.com/raleigh/fdawson/~c:\or2\orgfiles\versit.or2
-DALARM:19960523T114500;5;3;Your Telecon Starts At Noon!!!;
-MALARM:19960522T120000;;;fdawson@raleigh.ibm.com;Remember 05/23 Noon Telecon!!!;
-PALARM:19960523T115500;;;c:\or2\organize.exe c:\or2\orgfiles\versit.or2;
-X-LDC-OR2-OLE:c:\temp\agenda.doc
-END:VEVENT
-
-BEGIN:VTODO
-DUE:19960614T0173000
-DESCRIPTION:Review VCalendar helper API.
-END:VTODO
-
-END:VCALENDAR
-
-#endif
-
-void testVcalAPIs() {
- FILE *fp;
- VObject *vcal = vcsCreateVCal(
- "19960523T100522",
- "37.24,-17.87",
- "-//Frank Dawson/Hand Crafted In North Carolina//NONSGML Made By Hand//EN",
- 0,
- "0.3"
- );
-
- VObject *vevent = vcsAddEvent(
- vcal,
- "19960523T120000",
- "19960523T130000",
- "VERSIT PDI PR Teleconference/Interview \nWith Tom Streeter and Frank Dawson - Discuss VERSIT PDI project and vCard and vCalendar\nactivities with European Press representatives.",
- "VERSIT PDI PR Teleconference/Interview",
- "PHONE CALL",
- 0,
- "CONFIRMED",
- "19960523T100522-4000F100582713-009251",
- "http://www.ibm.com/raleigh/fdawson/~c:\\or2\\orgfiles\\versit.or2",
- 0
- );
-
- vcsAddDAlarm(vevent, "19960523T114500", "5", "3",
- "Your Telecon Starts At Noon!!!");
- vcsAddMAlarm(vevent, "19960522T120000", 0, 0, "fdawson@raleigh.ibm.com",
- "Remember 05/23 Noon Telecon!!!");
- vcsAddPAlarm(vevent, "19960523T115500", 0 ,0,
- "c:\\or2\\organize.exe c:\\or2\\orgfiles\\versit.or2");
-
- addPropValue(vevent, "X-LDC-OR2-OLE", "c:\\temp\\agenda.doc");
-
- vcsAddTodo(
- vcal,
- 0,
- "19960614T0173000",
- 0,
- "Review VCalendar helper API.",
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- );
-
- /* now do something to the resulting VObject */
- /* pretty print on stdout for fun */
- printVObject(vcal);
- /* open the output text file */
-
-#define OUTFILE "frankcal.vcf"
-
- fp = fopen(OUTFILE, "w");
- if (fp) {
- /* write it in text form */
- writeVObject(fp,vcal);
- fclose(fp);
- }
- else {
- printf("open output file '%s' failed\n", OUTFILE);
- }
- }
-
-void main() {
- testVcalAPIs();
- }
-
-#endif
-
-
-/* end of source file vcaltmp.c */
diff --git a/libversit/vcaltmp.h b/libversit/vcaltmp.h
deleted file mode 100644
index 4c4afde963..0000000000
--- a/libversit/vcaltmp.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
-
-The software is provided with RESTRICTED RIGHTS. Use, duplication, or
-disclosure by the government are subject to restrictions set forth in
-DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
-
-***************************************************************************/
-
-#include "vcc.h"
-
-#ifndef __VCALTMP_H__
-#define __VCALTMP_H__
-
-#if defined(__CPLUSPLUS__) || defined(__cplusplus)
-extern "C" {
-#endif
-
-extern DLLEXPORT(VObject*) vcsCreateVCal(
- char *date_created,
- char *location,
- char *product_id,
- char *time_zone,
- char *version
- );
-
-extern DLLEXPORT(VObject*) vcsAddEvent(
- VObject *vcal,
- char *start_date_time,
- char *end_date_time,
- char *description,
- char *summary,
- char *categories,
- char *classification,
- char *status,
- char *transparency,
- char *uid,
- char *url
- );
-
-
-extern DLLEXPORT(VObject*) vcsAddTodo(
- VObject *vcal,
- char *start_date_time,
- char *due_date_time,
- char *date_time_complete,
- char *description,
- char *summary,
- char *priority,
- char *classification,
- char *status,
- char *uid,
- char *url
- );
-
-
-extern DLLEXPORT(VObject*) vcsAddAAlarm(
- VObject *vevent,
- char *run_time,
- char *snooze_time,
- char *repeat_count,
- char *audio_content
- );
-
-
-extern DLLEXPORT(VObject*) vcsAddMAlarm(
- VObject *vevent,
- char *run_time,
- char *snooze_time,
- char *repeat_count,
- char *email_address,
- char *note
- );
-
-
-extern DLLEXPORT(VObject*) vcsAddDAlarm(
- VObject *vevent,
- char *run_time,
- char *snooze_time,
- char *repeat_count,
- char *display_string
- );
-
-
-extern DLLEXPORT(VObject*) vcsAddPAlarm(
- VObject *vevent,
- char *run_time,
- char *snooze_time,
- char *repeat_count,
- char *procedure_name
- );
-
-#if defined(__CPLUSPLUS__) || defined(__cplusplus)
-}
-#endif
-
-#endif /* __VCALTMP_H__ */
-
-
diff --git a/libversit/vcc.h b/libversit/vcc.h
deleted file mode 100644
index 0e52034710..0000000000
--- a/libversit/vcc.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
-
-The software is provided with RESTRICTED RIGHTS. Use, duplication, or
-disclosure by the government are subject to restrictions set forth in
-DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
-
-***************************************************************************/
-
-#ifndef __VCC_H__
-#define __VCC_H__ 1
-
-#include "vobject.h"
-
-
-#if defined(__CPLUSPLUS__) || defined(__cplusplus)
-extern "C" {
-#endif
-
-typedef void (*MimeErrorHandler)(char *);
-
-extern DLLEXPORT(void) registerMimeErrorHandler(MimeErrorHandler);
-
-extern DLLEXPORT(VObject*) Parse_MIME(const char *input, unsigned long len);
-extern DLLEXPORT(VObject*) Parse_MIME_FromFileName(char* fname);
-
-
-/* NOTE regarding Parse_MIME_FromFile
-The function above, Parse_MIME_FromFile, comes in two flavors,
-neither of which is exported from the DLL. Each version takes
-a CFile or FILE* as a parameter, neither of which can be
-passed across a DLL interface (at least that is my experience).
-If you are linking this code into your build directly then
-you may find them a more convenient API that the other flavors
-that take a file name. If you use them with the DLL LIB you
-will get a link error.
-*/
-
-
-#if INCLUDEMFC
-extern VObject* Parse_MIME_FromFile(CFile *file);
-#else
-extern VObject* Parse_MIME_FromFile(FILE *file);
-#endif
-
-#if defined(__CPLUSPLUS__) || defined(__cplusplus)
-}
-#endif
-
-#endif /* __VCC_H__ */
-
diff --git a/libversit/vcc.y b/libversit/vcc.y
deleted file mode 100644
index f8eb9e6556..0000000000
--- a/libversit/vcc.y
+++ /dev/null
@@ -1,1257 +0,0 @@
-%{
-
-/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
-
-The software is provided with RESTRICTED RIGHTS. Use, duplication, or
-disclosure by the government are subject to restrictions set forth in
-DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
-
-***************************************************************************/
-
-/*
- * src: vcc.c
- * doc: Parser for vCard and vCalendar. Note that this code is
- * generated by a yacc parser generator. Generally it should not
- * be edited by hand. The real source is vcc.y. The #line directives
- * can be commented out here to make it easier to trace through
- * in a debugger. However, if a bug is found it should
- * be fixed in vcc.y and this file regenerated.
- */
-
-
-/* debugging utilities */
-#if __DEBUG
-#define DBG_(x) printf x
-#else
-#define DBG_(x)
-#endif
-
-/**** External Functions ****/
-
-/* assign local name to parser variables and functions so that
- we can use more than one yacc based parser.
-*/
-
-#define yyparse mime_parse
-#define yylex mime_lex
-#define yyerror mime_error
-#define yychar mime_char
-/* #define p_yyval p_mime_val */
-#undef yyval
-#define yyval mime_yyval
-/* #define p_yylval p_mime_lval */
-#undef yylval
-#define yylval mime_yylval
-#define yydebug mime_debug
-#define yynerrs mime_nerrs
-#define yyerrflag mime_errflag
-#define yyss mime_ss
-#define yyssp mime_ssp
-#define yyvs mime_vs
-#define yyvsp mime_vsp
-#define yylhs mime_lhs
-#define yylen mime_len
-#define yydefred mime_defred
-#define yydgoto mime_dgoto
-#define yysindex mime_sindex
-#define yyrindex mime_rindex
-#define yygindex mime_gindex
-#define yytable mime_table
-#define yycheck mime_check
-#define yyname mime_name
-#define yyrule mime_rule
-#define YYPREFIX "mime_"
-
-
-#ifndef _NO_LINE_FOLDING
-#define _SUPPORT_LINE_FOLDING 1
-#endif
-
-/* undef below if compile with MFC */
-/* #define INCLUDEMFC 1 */
-
-#if defined(WIN32) || defined(_WIN32)
-#ifdef INCLUDEMFC
-#include <afx.h>
-#endif
-#endif
-
-#include <string.h>
-#ifndef __MWERKS__
-#include <malloc.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include "vcc.h"
-
-/**** Types, Constants ****/
-
-#define YYDEBUG 1 /* 1 to compile in some debugging code */
-#define MAXTOKEN 256 /* maximum token (line) length */
-#define YYSTACKSIZE 50 /* ~unref ? */
-#define MAXLEVEL 10 /* max # of nested objects parseable */
- /* (includes outermost) */
-
-
-/**** Global Variables ****/
-int mime_lineNum, mime_numErrors; /* yyerror() can use these */
-static VObject* vObjList;
-static VObject *curProp;
-static VObject *curObj;
-static VObject* ObjStack[MAXLEVEL];
-static int ObjStackTop;
-
-
-/* A helpful utility for the rest of the app. */
-#if __CPLUSPLUS__
-extern "C" {
-#endif
-
- extern void Parse_Debug(const char *s);
- extern void yyerror(char *s);
-
-#if __CPLUSPLUS__
- };
-#endif
-
-int yyparse();
-
-enum LexMode {
- L_NORMAL,
- L_VCARD,
- L_VCAL,
- L_VEVENT,
- L_VTODO,
- L_VALUES,
- L_BASE64,
- L_QUOTED_PRINTABLE
- };
-
-/**** Private Forward Declarations ****/
-static int pushVObject(const char *prop);
-static VObject* popVObject();
-static char* lexDataFromBase64();
-static void lexPopMode(int top);
-static int lexWithinMode(enum LexMode mode);
-static void lexPushMode(enum LexMode mode);
-static void enterProps(const char *s);
-static void enterAttr(const char *s1, const char *s2);
-static void enterValues(const char *value);
-static void mime_error_(char *s);
- static void appendValue(const char *value);
-
-%}
-
-/***************************************************************************/
-/*** The grammar ****/
-/***************************************************************************/
-
-%union {
- char *str;
- VObject *vobj;
- }
-
-%token
- EQ COLON DOT SEMICOLON SPACE HTAB LINESEP NEWLINE
- BEGIN_VCARD END_VCARD BEGIN_VCAL END_VCAL
- BEGIN_VEVENT END_VEVENT BEGIN_VTODO END_VTODO
- ID
-
-/*
- * NEWLINE is the token that would occur outside a vCard,
- * while LINESEP is the token that would occur inside a vCard.
- */
-
-%token <str>
- STRING ID
-
-%type <str> name value
-
-%type <vobj> vcard vcal vobject
-
-%start mime
-
-%%
-
-
-mime: vobjects
- ;
-
-vobjects: vobject
- { addList(&vObjList, $1); curObj = 0; }
- vobjects
- | vobject
- { addList(&vObjList, $1); curObj = 0; }
- ;
-
-vobject: vcard
- | vcal
- ;
-
-vcard:
- BEGIN_VCARD
- {
- lexPushMode(L_VCARD);
- if (!pushVObject(VCCardProp)) YYERROR;
- }
- items END_VCARD
- {
- lexPopMode(0);
- $$ = popVObject();
- }
- | BEGIN_VCARD
- {
- lexPushMode(L_VCARD);
- if (!pushVObject(VCCardProp)) YYERROR;
- }
- END_VCARD
- {
- lexPopMode(0);
- $$ = popVObject();
- }
- ;
-
-items: item items
- | item
- ;
-
-item: prop COLON
- {
- lexPushMode(L_VALUES);
- }
- values LINESEP
- {
- if (lexWithinMode(L_BASE64) || lexWithinMode(L_QUOTED_PRINTABLE))
- lexPopMode(0);
- lexPopMode(0);
- }
- | error
- ;
-
-prop: name
- {
- enterProps($1);
- }
- attr_params
- | name
- {
- enterProps($1);
- }
- ;
-
-attr_params: attr_param attr_params
- | attr_param
- ;
-
-attr_param: SEMICOLON attr
- ;
-
-attr: name
- {
- enterAttr($1,0);
- }
- | name EQ name
- {
- enterAttr($1,$3);
-
- }
- ;
-
-name: ID
- ;
-
-values: value SEMICOLON { appendValue($1); } values
- | value
- { appendValue($1); }
- ;
-
-value: STRING
- | { $$ = 0; }
- ;
-
-vcal:
- BEGIN_VCAL
- { if (!pushVObject(VCCalProp)) YYERROR; }
- calitems
- END_VCAL
- { $$ = popVObject(); }
- | BEGIN_VCAL
- { if (!pushVObject(VCCalProp)) YYERROR; }
- END_VCAL
- { $$ = popVObject(); }
- ;
-
-calitems: calitem calitems
- | calitem
- ;
-
-calitem:
- eventitem
- | todoitem
- | items
- ;
-
-eventitem:
- BEGIN_VEVENT
- {
- lexPushMode(L_VEVENT);
- if (!pushVObject(VCEventProp)) YYERROR;
- }
- items
- END_VEVENT
- {
- lexPopMode(0);
- popVObject();
- }
- | BEGIN_VEVENT
- {
- lexPushMode(L_VEVENT);
- if (!pushVObject(VCEventProp)) YYERROR;
- }
- END_VEVENT
- {
- lexPopMode(0);
- popVObject();
- }
- ;
-
-todoitem:
- BEGIN_VTODO
- {
- lexPushMode(L_VTODO);
- if (!pushVObject(VCTodoProp)) YYERROR;
- }
- items
- END_VTODO
- {
- lexPopMode(0);
- popVObject();
- }
- | BEGIN_VTODO
- {
- lexPushMode(L_VTODO);
- if (!pushVObject(VCTodoProp)) YYERROR;
- }
- END_VTODO
- {
- lexPopMode(0);
- popVObject();
- }
- ;
-
-%%
-/*/////////////////////////////////////////////////////////////////////////*/
-static int pushVObject(const char *prop)
- {
- VObject *newObj;
- if (ObjStackTop == MAXLEVEL)
- return FALSE;
-
- ObjStack[++ObjStackTop] = curObj;
-
- if (curObj) {
- newObj = addProp(curObj,prop);
- curObj = newObj;
- }
- else
- curObj = newVObject(prop);
-
- return TRUE;
- }
-
-
-/*/////////////////////////////////////////////////////////////////////////*/
-/* This pops the recently built vCard off the stack and returns it. */
-static VObject* popVObject()
- {
- VObject *oldObj;
- if (ObjStackTop < 0) {
- yyerror("pop on empty Object Stack\n");
- return 0;
- }
- oldObj = curObj;
- curObj = ObjStack[ObjStackTop--];
-
- return oldObj;
- }
-
-static void appendValue(const char *value)
-{
- char *p1, *p2;
- wchar_t *p3;
- int i;
-
- if (fieldedProp && *fieldedProp) {
- if (value) {
- addPropValue(curProp, *fieldedProp, value);
- }
- /* else this field is empty, advance to next field */
- fieldedProp++;
- } else {
- if (value) {
- if (vObjectUStringZValue(curProp)) {
- p1 = fakeCString(vObjectUStringZValue(curProp));
- p2 = malloc(sizeof(char *) * (strlen(p1)+strlen(value)+1));
- strcpy(p2, p1);
- deleteStr(p1);
-
- i = strlen(p2);
- p2[i] = ';';
- p2[i+1] = '\0';
- p2 = strcat(p2, value);
- p3 = (wchar_t *) vObjectUStringZValue(curProp);
- free(p3);
- setVObjectUStringZValue_(curProp,fakeUnicode(p2,0));
- deleteStr(p2);
- } else {
- setVObjectUStringZValue_(curProp,fakeUnicode(value,0));
- }
- }
- }
- deleteStr(value);
-}
-
-static void enterValues(const char *value)
- {
- if (fieldedProp && *fieldedProp) {
- if (value) {
- addPropValue(curProp,*fieldedProp,value);
- }
- /* else this field is empty, advance to next field */
- fieldedProp++;
- }
- else {
- if (value) {
- setVObjectUStringZValue_(curProp,fakeUnicode(value,0));
- }
- }
- deleteStr(value);
- }
-
-static void enterProps(const char *s)
- {
- curProp = addGroup(curObj,s);
- deleteStr(s);
- }
-
-static void enterAttr(const char *s1, const char *s2)
- {
- const char *p1, *p2;
- p1 = lookupProp_(s1);
- if (s2) {
- VObject *a;
- p2 = lookupProp_(s2);
- a = addProp(curProp,p1);
- setVObjectStringZValue(a,p2);
- }
- else
- addProp(curProp,p1);
- if (stricmp(p1,VCBase64Prop) == 0 || (s2 && stricmp(p2,VCBase64Prop)==0))
- lexPushMode(L_BASE64);
- else if (stricmp(p1,VCQuotedPrintableProp) == 0
- || (s2 && stricmp(p2,VCQuotedPrintableProp)==0))
- lexPushMode(L_QUOTED_PRINTABLE);
- deleteStr(s1); deleteStr(s2);
- }
-
-
-#define MAX_LEX_LOOKAHEAD_0 32
-#define MAX_LEX_LOOKAHEAD 64
-#define MAX_LEX_MODE_STACK_SIZE 10
-#define LEXMODE() (lexBuf.lexModeStack[lexBuf.lexModeStackTop])
-
-struct LexBuf {
- /* input */
-#ifdef INCLUDEMFC
- CFile *inputFile;
-#else
- FILE *inputFile;
-#endif
- char *inputString;
- unsigned long curPos;
- unsigned long inputLen;
- /* lookahead buffer */
- /* -- lookahead buffer is short instead of char so that EOF
- / can be represented correctly.
- */
- unsigned long len;
- short buf[MAX_LEX_LOOKAHEAD];
- unsigned long getPtr;
- /* context stack */
- unsigned long lexModeStackTop;
- enum LexMode lexModeStack[MAX_LEX_MODE_STACK_SIZE];
- /* token buffer */
- unsigned long maxToken;
- char *strs;
- unsigned long strsLen;
- } lexBuf;
-
-static void lexPushMode(enum LexMode mode)
- {
- if (lexBuf.lexModeStackTop == (MAX_LEX_MODE_STACK_SIZE-1))
- yyerror("lexical context stack overflow");
- else {
- lexBuf.lexModeStack[++lexBuf.lexModeStackTop] = mode;
- }
- }
-
-static void lexPopMode(int top)
- {
- /* special case of pop for ease of error recovery -- this
- version will never underflow */
- if (top)
- lexBuf.lexModeStackTop = 0;
- else
- if (lexBuf.lexModeStackTop > 0) lexBuf.lexModeStackTop--;
- }
-
-static int lexWithinMode(enum LexMode mode) {
- unsigned long i;
- for (i=0;i<lexBuf.lexModeStackTop;i++)
- if (mode == lexBuf.lexModeStack[i]) return 1;
- return 0;
- }
-
-static char lexGetc_()
- {
- /* get next char from input, no buffering. */
- if (lexBuf.curPos == lexBuf.inputLen)
- return EOF;
- else if (lexBuf.inputString)
- return *(lexBuf.inputString + lexBuf.curPos++);
- else {
-#ifdef INCLUDEMFC
- char result;
- return lexBuf.inputFile->Read(&result, 1) == 1 ? result : EOF;
-#else
- return fgetc(lexBuf.inputFile);
-#endif
- }
- }
-
-static int lexGeta()
- {
- ++lexBuf.len;
- return (lexBuf.buf[lexBuf.getPtr] = lexGetc_());
- }
-
-static int lexGeta_(int i)
- {
- ++lexBuf.len;
- return (lexBuf.buf[(lexBuf.getPtr+i)%MAX_LEX_LOOKAHEAD] = lexGetc_());
- }
-
-static void lexSkipLookahead() {
- if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
- /* don't skip EOF. */
- lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
- lexBuf.len--;
- }
- }
-
-static int lexLookahead() {
- int c = (lexBuf.len)?
- lexBuf.buf[lexBuf.getPtr]:
- lexGeta();
- /* do the \r\n -> \n or \r -> \n translation here */
- if (c == '\r') {
- int a = (lexBuf.len>1)?
- lexBuf.buf[(lexBuf.getPtr+1)%MAX_LEX_LOOKAHEAD]:
- lexGeta_(1);
- if (a == '\n') {
- lexSkipLookahead();
- }
- lexBuf.buf[lexBuf.getPtr] = c = '\n';
- }
- else if (c == '\n') {
- int a = (lexBuf.len>1)?
- lexBuf.buf[lexBuf.getPtr+1]:
- lexGeta_(1);
- if (a == '\r') {
- lexSkipLookahead();
- }
- lexBuf.buf[lexBuf.getPtr] = '\n';
- }
- return c;
- }
-
-static int lexGetc() {
- int c = lexLookahead();
- if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
- /* EOF will remain in lookahead buffer */
- lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
- lexBuf.len--;
- }
- return c;
- }
-
-static void lexSkipLookaheadWord() {
- if (lexBuf.strsLen <= lexBuf.len) {
- lexBuf.len -= lexBuf.strsLen;
- lexBuf.getPtr = (lexBuf.getPtr + lexBuf.strsLen) % MAX_LEX_LOOKAHEAD;
- }
- }
-
-static void lexClearToken()
- {
- lexBuf.strsLen = 0;
- }
-
-static void lexAppendc(int c)
- {
- lexBuf.strs[lexBuf.strsLen] = c;
- /* append up to zero termination */
- if (c == 0) return;
- lexBuf.strsLen++;
- if (lexBuf.strsLen >= lexBuf.maxToken) {
- /* double the token string size */
- lexBuf.maxToken <<= 1;
- lexBuf.strs = (char*) realloc(lexBuf.strs,(size_t)lexBuf.maxToken);
- }
- }
-
-static char* lexStr() {
- return dupStr(lexBuf.strs,(size_t)lexBuf.strsLen+1);
- }
-
-static void lexSkipWhite() {
- int c = lexLookahead();
- while (c == ' ' || c == '\t') {
- lexSkipLookahead();
- c = lexLookahead();
- }
- }
-
-static char* lexGetWord() {
- int c;
- lexSkipWhite();
- lexClearToken();
- c = lexLookahead();
- while (c != EOF && !strchr("\t\n ;:=",c)) {
- lexAppendc(c);
- lexSkipLookahead();
- c = lexLookahead();
- }
- lexAppendc(0);
- return lexStr();
- }
-
-static void lexPushLookahead(char *s, int len) {
- int putptr;
- if (len == 0) len = strlen(s);
- putptr = (int)lexBuf.getPtr - len;
- /* this function assumes that length of word to push back
- / is not greater than MAX_LEX_LOOKAHEAD.
- */
- if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD;
- lexBuf.getPtr = putptr;
- while (*s) {
- lexBuf.buf[putptr] = *s++;
- putptr = (putptr + 1) % MAX_LEX_LOOKAHEAD;
- }
- lexBuf.len += len;
- }
-
-static void lexPushLookaheadc(int c) {
- int putptr;
- /* can't putback EOF, because it never leaves lookahead buffer */
- if (c == EOF) return;
- putptr = (int)lexBuf.getPtr - 1;
- if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD;
- lexBuf.getPtr = putptr;
- lexBuf.buf[putptr] = c;
- lexBuf.len += 1;
- }
-
-static char* lexLookaheadWord() {
- /* this function can lookahead word with max size of MAX_LEX_LOOKAHEAD_0
- / and thing bigger than that will stop the lookahead and return 0;
- / leading white spaces are not recoverable.
- */
- int c;
- int len = 0;
- int curgetptr = 0;
- lexSkipWhite();
- lexClearToken();
- curgetptr = (int)lexBuf.getPtr; /* remember! */
- while (len < (MAX_LEX_LOOKAHEAD_0)) {
- c = lexGetc();
- len++;
- if (c == EOF || strchr("\t\n ;:=", c)) {
- lexAppendc(0);
- /* restore lookahead buf. */
- lexBuf.len += len;
- lexBuf.getPtr = curgetptr;
- return lexStr();
- }
- else
- lexAppendc(c);
- }
- lexBuf.len += len; /* char that has been moved to lookahead buffer */
- lexBuf.getPtr = curgetptr;
- return 0;
- }
-
-#ifdef _SUPPORT_LINE_FOLDING
-static void handleMoreRFC822LineBreak(int c) {
- /* suport RFC 822 line break in cases like
- * ADR: foo;
- * morefoo;
- * more foo;
- */
- if (c == ';') {
- int a;
- lexSkipLookahead();
- /* skip white spaces */
- a = lexLookahead();
- while (a == ' ' || a == '\t') {
- lexSkipLookahead();
- a = lexLookahead();
- }
- if (a == '\n') {
- lexSkipLookahead();
- a = lexLookahead();
- if (a == ' ' || a == '\t') {
- /* continuation, throw away all the \n and spaces read so
- * far
- */
- lexSkipWhite();
- lexPushLookaheadc(';');
- }
- else {
- lexPushLookaheadc('\n');
- lexPushLookaheadc(';');
- }
- }
- else {
- lexPushLookaheadc(';');
- }
- }
- }
-
-static char* lexGet1Value() {
- int size = 0;
- int c;
- lexSkipWhite();
- c = lexLookahead();
- lexClearToken();
- while (c != EOF && c != ';') {
- if (c == '\n') {
- int a;
- lexSkipLookahead();
- a = lexLookahead();
- if (a == ' ' || a == '\t') {
- lexAppendc(' ');
- lexSkipLookahead();
- }
- else {
- lexPushLookaheadc('\n');
- break;
- }
- }
- else {
- lexAppendc(c);
- lexSkipLookahead();
- }
- c = lexLookahead();
- }
- lexAppendc(0);
- handleMoreRFC822LineBreak(c);
- return c==EOF?0:lexStr();
- }
-#endif
-
-static char* lexGetStrUntil(char *termset) {
- int size = 0;
- int c = lexLookahead();
- lexClearToken();
- while (c != EOF && !strchr(termset,c)) {
- lexAppendc(c);
- lexSkipLookahead();
- c = lexLookahead();
- }
- lexAppendc(0);
- return c==EOF?0:lexStr();
- }
-
-static int match_begin_name(int end) {
- char *n = lexLookaheadWord();
- int token = ID;
- if (n) {
- if (!stricmp(n,"vcard")) token = end?END_VCARD:BEGIN_VCARD;
- else if (!stricmp(n,"vcalendar")) token = end?END_VCAL:BEGIN_VCAL;
- else if (!stricmp(n,"vevent")) token = end?END_VEVENT:BEGIN_VEVENT;
- else if (!stricmp(n,"vtodo")) token = end?END_VTODO:BEGIN_VTODO;
- deleteStr(n);
- return token;
- }
- return 0;
- }
-
-
-#ifdef INCLUDEMFC
-void initLex(const char *inputstring, unsigned long inputlen, CFile *inputfile)
-#else
-void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile)
-#endif
- {
- /* initialize lex mode stack */
- lexBuf.lexModeStack[lexBuf.lexModeStackTop=0] = L_NORMAL;
-
- /* iniatialize lex buffer. */
- lexBuf.inputString = (char*) inputstring;
- lexBuf.inputLen = inputlen;
- lexBuf.curPos = 0;
- lexBuf.inputFile = inputfile;
-
- lexBuf.len = 0;
- lexBuf.getPtr = 0;
-
- lexBuf.maxToken = MAXTOKEN;
- lexBuf.strs = (char*)malloc(MAXTOKEN);
- lexBuf.strsLen = 0;
-
- }
-
-static void finiLex() {
- free(lexBuf.strs);
- }
-
-
-/*/////////////////////////////////////////////////////////////////////////*/
-/* This parses and converts the base64 format for binary encoding into
- * a decoded buffer (allocated with new). See RFC 1521.
- */
-static char * lexGetDataFromBase64()
- {
- unsigned long bytesLen = 0, bytesMax = 0;
- int quadIx = 0, pad = 0;
- unsigned long trip = 0;
- unsigned char b;
- int c;
- unsigned char *bytes = NULL;
- unsigned char *oldBytes = NULL;
-
- DBG_(("db: lexGetDataFromBase64\n"));
- while (1) {
- c = lexGetc();
- if (c == '\n') {
- ++mime_lineNum;
- if (lexLookahead() == '\n') {
- /* a '\n' character by itself means end of data */
- break;
- }
- else continue; /* ignore '\n' */
- }
- else {
- if ((c >= 'A') && (c <= 'Z'))
- b = (unsigned char)(c - 'A');
- else if ((c >= 'a') && (c <= 'z'))
- b = (unsigned char)(c - 'a') + 26;
- else if ((c >= '0') && (c <= '9'))
- b = (unsigned char)(c - '0') + 52;
- else if (c == '+')
- b = 62;
- else if (c == '/')
- b = 63;
- else if (c == '=') {
- b = 0;
- pad++;
- } else if ((c == ' ') || (c == '\t')) {
- continue;
- } else { /* error condition */
- if (bytes) free(bytes);
- else if (oldBytes) free(oldBytes);
- /* error recovery: skip until 2 adjacent newlines. */
- DBG_(("db: invalid character 0x%x '%c'\n", c,c));
- if (c != EOF) {
- c = lexGetc();
- while (c != EOF) {
- if (c == '\n' && lexLookahead() == '\n') {
- ++mime_lineNum;
- break;
- }
- c = lexGetc();
- }
- }
- return NULL;
- }
- trip = (trip << 6) | b;
- if (++quadIx == 4) {
- unsigned char outBytes[3];
- int numOut;
- int i;
- for (i = 0; i < 3; i++) {
- outBytes[2-i] = (unsigned char)(trip & 0xFF);
- trip >>= 8;
- }
- numOut = 3 - pad;
- if (bytesLen + numOut > bytesMax) {
- if (!bytes) {
- bytesMax = 1024;
- bytes = (unsigned char*)malloc((size_t)bytesMax);
- }
- else {
- bytesMax <<= 2;
- oldBytes = bytes;
- bytes = (unsigned char*)realloc(bytes,(size_t)bytesMax);
- }
- if (bytes == 0) {
- mime_error("out of memory while processing BASE64 data\n");
- }
- }
- if (bytes) {
- memcpy(bytes + bytesLen, outBytes, numOut);
- bytesLen += numOut;
- }
- trip = 0;
- quadIx = 0;
- }
- }
- } /* while */
- DBG_(("db: bytesLen = %d\n", bytesLen));
- /* kludge: all this won't be necessary if we have tree form
- representation */
- if (bytes) {
- setValueWithSize(curProp,bytes,(unsigned int)bytesLen);
- free(bytes);
- }
- else if (oldBytes) {
- setValueWithSize(curProp,oldBytes,(unsigned int)bytesLen);
- free(oldBytes);
- }
- return 0;
- }
-
-static int match_begin_end_name(int end) {
- int token;
- lexSkipWhite();
- if (lexLookahead() != ':') return ID;
- lexSkipLookahead();
- lexSkipWhite();
- token = match_begin_name(end);
- if (token == ID) {
- lexPushLookaheadc(':');
- DBG_(("db: ID '%s'\n", yylval.str));
- return ID;
- }
- else if (token != 0) {
- lexSkipLookaheadWord();
- deleteStr(yylval.str);
- DBG_(("db: begin/end %d\n", token));
- return token;
- }
- return 0;
- }
-
-static char* lexGetQuotedPrintable()
- {
- char cur;
- unsigned long len = 0;
-
- lexClearToken();
- do {
- cur = lexGetc();
- switch (cur) {
- case '=': {
- int c = 0;
- int next[2];
- int i;
- for (i = 0; i < 2; i++) {
- next[i] = lexGetc();
- if (next[i] >= '0' && next[i] <= '9')
- c = c * 16 + next[i] - '0';
- else if (next[i] >= 'A' && next[i] <= 'F')
- c = c * 16 + next[i] - 'A' + 10;
- else
- break;
- }
- if (i == 0) {
- /* single '=' follow by LINESEP is continuation sign? */
- if (next[0] == '\n') {
- ++mime_lineNum;
- }
- else {
- lexPushLookaheadc('=');
- goto EndString;
- }
- }
- else if (i == 1) {
- lexPushLookaheadc(next[1]);
- lexPushLookaheadc(next[0]);
- lexAppendc('=');
- } else {
- lexAppendc(c);
- }
- break;
- } /* '=' */
- case '\n': {
- lexPushLookaheadc('\n');
- goto EndString;
- }
- case (char)EOF:
- break;
- default:
- lexAppendc(cur);
- break;
- } /* switch */
- } while (cur != (char)EOF);
-
-EndString:
- lexAppendc(0);
- return lexStr();
- } /* LexQuotedPrintable */
-
-static int yylex() {
- int token = 0;
-
- int lexmode = LEXMODE();
- if (lexmode == L_VALUES) {
- int c = lexGetc();
- if (c == ';') {
- DBG_(("db: SEMICOLON\n"));
- lexPushLookaheadc(c);
-#ifdef _SUPPORT_LINE_FOLDING
- handleMoreRFC822LineBreak(c);
-#endif
- lexSkipLookahead();
- return SEMICOLON;
- }
- else if (strchr("\n",c)) {
- ++mime_lineNum;
- /* consume all line separator(s) adjacent to each other */
- c = lexLookahead();
- while (strchr("\n",c)) {
- lexSkipLookahead();
- c = lexLookahead();
- ++mime_lineNum;
- }
- DBG_(("db: LINESEP\n"));
- return LINESEP;
- }
- else {
- char *p = 0;
- lexPushLookaheadc(c);
- if (lexWithinMode(L_BASE64)) {
- /* get each char and convert to bin on the fly... */
- p = lexGetDataFromBase64();
- yylval.str = p;
- return STRING;
- }
- else if (lexWithinMode(L_QUOTED_PRINTABLE)) {
- p = lexGetQuotedPrintable();
- }
- else {
-#ifdef _SUPPORT_LINE_FOLDING
- p = lexGet1Value();
-#else
- p = lexGetStrUntil(";\n");
-#endif
- }
- if (p) {
- DBG_(("db: STRING: '%s'\n", p));
- yylval.str = p;
- return STRING;
- }
- else return 0;
- }
- }
- else {
- /* normal mode */
- while (1) {
- int c = lexGetc();
- switch(c) {
- case ':': {
- /* consume all line separator(s) adjacent to each other */
- /* ignoring linesep immediately after colon. */
-/* c = lexLookahead();
- while (strchr("\n",c)) {
- lexSkipLookahead();
- c = lexLookahead();
- ++mime_lineNum;
- }*/
- DBG_(("db: COLON\n"));
- return COLON;
- }
- case ';':
- DBG_(("db: SEMICOLON\n"));
- return SEMICOLON;
- case '=':
- DBG_(("db: EQ\n"));
- return EQ;
- /* ignore whitespace in this mode */
- case '\t':
- case ' ': continue;
- case '\n': {
- ++mime_lineNum;
- continue;
- }
- case EOF: return 0;
- break;
- default: {
- lexPushLookaheadc(c);
- if (isalpha(c)) {
- char *t = lexGetWord();
- yylval.str = t;
- if (!stricmp(t, "begin")) {
- return match_begin_end_name(0);
- }
- else if (!stricmp(t,"end")) {
- return match_begin_end_name(1);
- }
- else {
- DBG_(("db: ID '%s'\n", t));
- return ID;
- }
- }
- else {
- /* unknow token */
- return 0;
- }
- break;
- }
- }
- }
- }
- return 0;
- }
-
-
-/***************************************************************************/
-/*** Public Functions ****/
-/***************************************************************************/
-
-static VObject* Parse_MIMEHelper()
- {
- ObjStackTop = -1;
- mime_numErrors = 0;
- mime_lineNum = 1;
- vObjList = 0;
- curObj = 0;
-
- if (yyparse() != 0) {
- finiLex();
- return 0;
- }
-
- finiLex();
- return vObjList;
- }
-
-/*/////////////////////////////////////////////////////////////////////////*/
-DLLEXPORT(VObject*) Parse_MIME(const char *input, unsigned long len)
- {
- initLex(input, len, 0);
- return Parse_MIMEHelper();
- }
-
-
-#if INCLUDEMFC
-
-DLLEXPORT(VObject*) Parse_MIME_FromFile(CFile *file)
- {
- unsigned long startPos;
- VObject *result;
-
- initLex(0,-1,file);
- startPos = file->GetPosition();
- if (!(result = Parse_MIMEHelper()))
- file->Seek(startPos, CFile::begin);
- return result;
- }
-
-#else
-
-VObject* Parse_MIME_FromFile(FILE *file)
- {
- VObject *result;
- long startPos;
-
- initLex(0,(unsigned long)-1,file);
- startPos = ftell(file);
- if (!(result = Parse_MIMEHelper())) {
- fseek(file,startPos,SEEK_SET);
- }
- return result;
- }
-
-DLLEXPORT(VObject*) Parse_MIME_FromFileName(char *fname)
- {
- FILE *fp = fopen(fname,"r");
- if (fp) {
- VObject* o = Parse_MIME_FromFile(fp);
- fclose(fp);
- return o;
- }
- else {
- char msg[256];
- snprintf(msg, sizeof(msg), "can't open file '%s' for reading\n", fname);
- mime_error_(msg);
- return 0;
- }
- }
-
-#endif
-
-/*/////////////////////////////////////////////////////////////////////////*/
-static void YYDebug(const char *s)
-{
-/* Parse_Debug(s); */
-}
-
-
-static MimeErrorHandler mimeErrorHandler;
-
-DLLEXPORT(void) registerMimeErrorHandler(MimeErrorHandler me)
- {
- mimeErrorHandler = me;
- }
-
-static void mime_error(char *s)
- {
- char msg[256];
- if (mimeErrorHandler) {
- sprintf(msg,"%s at line %d", s, mime_lineNum);
- mimeErrorHandler(msg);
- }
- }
-
-static void mime_error_(char *s)
- {
- if (mimeErrorHandler) {
- mimeErrorHandler(s);
- }
- }
-
-
diff --git a/libversit/vctest.c b/libversit/vctest.c
deleted file mode 100644
index 7975d1e200..0000000000
--- a/libversit/vctest.c
+++ /dev/null
@@ -1,95 +0,0 @@
-
-#include <stdio.h>
-#include <string.h>
-#include "vcc.h"
-
-FILE *cfp;
-
-void myMimeErrorHandler(char *s)
-{
- printf("%s\n", s);
-}
-
-void main(int argc, char **argv)
-{
- int testmem = 0;
-
- char * foo[2] = {"foo","alden.vcf"};
-
-argc = 2;
-argv = foo;
-
-#ifdef _CONSOLE
- cfp = stdout;
- registerMimeErrorHandler(myMimeErrorHandler);
-#else
- cfp = fopen("vctest.out", "w");
- if (!cfp) return;
-#endif
- ++argv;
- while (--argc) {
- FILE *fp;
- if (strcmp(*argv,"-testmem") == 0) {
- testmem = 1;
- argv++;
- continue;
- }
- fprintf(cfp,"processing %s\n",*argv);
- fp = fopen(*argv,"r");
- if (!fp) {
- fprintf(cfp,"error opening file\n");
- }
- else {
- VObject *v, *t;
- FILE *ofp;
- char buf[256];
- char *p;
- strcpy(buf,*argv);
- p = strchr(buf,'.');
- if (p) *p = 0;
- strcat(buf,".out");
- fprintf(cfp,"reading text input from '%s'...\n", *argv);
- /*v = Parse_MIME_FromFile(fp); */
- v = Parse_MIME_FromFileName(*argv);
- writeVObjectToFile(buf,v);
- cleanVObject(v);
-
- /*
- fprintf(cfp,"pretty print internal format of '%s'...\n", *argv);
- ofp = fopen(buf,"w");
- while (v) {
- printVObject(cfp,v);
- if (testmem) {
- char *s, *p;
- fprintf(cfp,"test writing to mem...\n");
- p = s = writeMemVObject(0,0,v);
- if (s) {
- while (*s) {
- fputc(*s,ofp);
- s++;
- }
- free(p);
- }
- }
- else {
- writeVObject(ofp,v);
- }
- t = v;
- v = nextVObjectInList(v);
- cleanVObject(t);
- }
-
- fclose(ofp);
- fclose(fp);
- */
- }
-
- cleanStrTbl();
- argv++;
-
- }
-
- if (cfp != stdout) fclose(cfp);
-
-}
-
diff --git a/libversit/vobject.c b/libversit/vobject.c
deleted file mode 100644
index d685b04278..0000000000
--- a/libversit/vobject.c
+++ /dev/null
@@ -1,1452 +0,0 @@
-/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
-
-The software is provided with RESTRICTED RIGHTS. Use, duplication, or
-disclosure by the government are subject to restrictions set forth in
-DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
-
-***************************************************************************/
-
-/*
- * src: vobject.c
- * doc: vobject and APIs to construct vobject, APIs pretty print
- * vobject, and convert a vobject into its textual representation.
- */
-
-#ifndef MWERKS
-#include <malloc.h>
-#endif
-
-#include "vobject.h"
-#include <string.h>
-#include <stdio.h>
-#include <fcntl.h>
-
-
-#define NAME_OF(o) o->id
-#define VALUE_TYPE(o) o->valType
-#define STRINGZ_VALUE_OF(o) o->val.strs
-#define USTRINGZ_VALUE_OF(o) o->val.ustrs
-#define INTEGER_VALUE_OF(o) o->val.i
-#define LONG_VALUE_OF(o) o->val.l
-#define ANY_VALUE_OF(o) o->val.any
-#define VOBJECT_VALUE_OF(o) o->val.vobj
-
-typedef union ValueItem {
- const char *strs;
- const wchar_t *ustrs;
- unsigned int i;
- unsigned long l;
- void *any;
- VObject *vobj;
- } ValueItem;
-
-struct VObject {
- VObject *next;
- const char *id;
- VObject *prop;
- unsigned short valType;
- ValueItem val;
- };
-
-typedef struct StrItem StrItem;
-
-struct StrItem {
- StrItem *next;
- const char *s;
- unsigned int refCnt;
- };
-
-const char** fieldedProp;
-
-
-
-/*----------------------------------------------------------------------
- The following functions involve with memory allocation:
- newVObject
- deleteVObject
- dupStr
- deleteStr
- newStrItem
- deleteStrItem
- ----------------------------------------------------------------------*/
-
-DLLEXPORT(VObject*) newVObject_(const char *id)
-{
- VObject *p = (VObject*)malloc(sizeof(VObject));
- p->next = 0;
- p->id = id;
- p->prop = 0;
- VALUE_TYPE(p) = 0;
- ANY_VALUE_OF(p) = 0;
- return p;
-}
-
-DLLEXPORT(VObject*) newVObject(const char *id)
-{
- return newVObject_(lookupStr(id));
-}
-
-DLLEXPORT(void) deleteVObject(VObject *p)
-{
- unUseStr(p->id);
- free(p);
-}
-
-DLLEXPORT(char*) dupStr(const char *s, unsigned int size)
-{
- char *t;
- if (size == 0) {
- size = strlen(s);
- }
- t = (char*)malloc(size+1);
- if (t) {
- memcpy(t,s,size);
- t[size] = 0;
- return t;
- }
- else {
- return (char*)0;
- }
-}
-
-DLLEXPORT(void) deleteStr(const char *p)
-{
- if (p) free((void*)p);
-}
-
-
-static StrItem* newStrItem(const char *s, StrItem *next)
-{
- StrItem *p = (StrItem*)malloc(sizeof(StrItem));
- p->next = next;
- p->s = s;
- p->refCnt = 1;
- return p;
-}
-
-static void deleteStrItem(StrItem *p)
-{
- free((void*)p);
-}
-
-
-/*----------------------------------------------------------------------
- The following function provide accesses to VObject's value.
- ----------------------------------------------------------------------*/
-
-DLLEXPORT(const char*) vObjectName(VObject *o)
-{
- return NAME_OF(o);
-}
-
-DLLEXPORT(void) setVObjectName(VObject *o, const char* id)
-{
- NAME_OF(o) = id;
-}
-
-DLLEXPORT(const char*) vObjectStringZValue(VObject *o)
-{
- return STRINGZ_VALUE_OF(o);
-}
-
-DLLEXPORT(void) setVObjectStringZValue(VObject *o, const char *s)
-{
- STRINGZ_VALUE_OF(o) = dupStr(s,0);
- VALUE_TYPE(o) = VCVT_STRINGZ;
-}
-
-DLLEXPORT(void) setVObjectStringZValue_(VObject *o, const char *s)
-{
- STRINGZ_VALUE_OF(o) = s;
- VALUE_TYPE(o) = VCVT_STRINGZ;
-}
-
-DLLEXPORT(const wchar_t*) vObjectUStringZValue(VObject *o)
-{
- return USTRINGZ_VALUE_OF(o);
-}
-
-DLLEXPORT(void) setVObjectUStringZValue(VObject *o, const wchar_t *s)
-{
- USTRINGZ_VALUE_OF(o) = (wchar_t*) dupStr((char*)s,(uStrLen(s)+1)*2);
- VALUE_TYPE(o) = VCVT_USTRINGZ;
-}
-
-DLLEXPORT(void) setVObjectUStringZValue_(VObject *o, const wchar_t *s)
-{
- USTRINGZ_VALUE_OF(o) = s;
- VALUE_TYPE(o) = VCVT_USTRINGZ;
-}
-
-DLLEXPORT(unsigned int) vObjectIntegerValue(VObject *o)
-{
- return INTEGER_VALUE_OF(o);
-}
-
-DLLEXPORT(void) setVObjectIntegerValue(VObject *o, unsigned int i)
-{
- INTEGER_VALUE_OF(o) = i;
- VALUE_TYPE(o) = VCVT_UINT;
-}
-
-DLLEXPORT(unsigned long) vObjectLongValue(VObject *o)
-{
- return LONG_VALUE_OF(o);
-}
-
-DLLEXPORT(void) setVObjectLongValue(VObject *o, unsigned long l)
-{
- LONG_VALUE_OF(o) = l;
- VALUE_TYPE(o) = VCVT_ULONG;
-}
-
-DLLEXPORT(void*) vObjectAnyValue(VObject *o)
-{
- return ANY_VALUE_OF(o);
-}
-
-DLLEXPORT(void) setVObjectAnyValue(VObject *o, void *t)
-{
- ANY_VALUE_OF(o) = t;
- VALUE_TYPE(o) = VCVT_RAW;
-}
-
-DLLEXPORT(VObject*) vObjectVObjectValue(VObject *o)
-{
- return VOBJECT_VALUE_OF(o);
-}
-
-DLLEXPORT(void) setVObjectVObjectValue(VObject *o, VObject *p)
-{
- VOBJECT_VALUE_OF(o) = p;
- VALUE_TYPE(o) = VCVT_VOBJECT;
-}
-
-DLLEXPORT(int) vObjectValueType(VObject *o)
-{
- return VALUE_TYPE(o);
-}
-
-
-/*----------------------------------------------------------------------
- The following functions can be used to build VObject.
- ----------------------------------------------------------------------*/
-
-DLLEXPORT(VObject*) addVObjectProp(VObject *o, VObject *p)
-{
- /* circular link list pointed to tail */
- /*
- o {next,id,prop,val}
- V
- pn {next,id,prop,val}
- V
- ...
- p1 {next,id,prop,val}
- V
- pn
- -->
- o {next,id,prop,val}
- V
- pn {next,id,prop,val}
- V
- p {next,id,prop,val}
- ...
- p1 {next,id,prop,val}
- V
- pn
- */
-
- VObject *tail = o->prop;
- if (tail) {
- p->next = tail->next;
- o->prop = tail->next = p;
- }
- else {
- o->prop = p->next = p;
- }
- return p;
-}
-
-DLLEXPORT(VObject*) addProp(VObject *o, const char *id)
-{
- return addVObjectProp(o,newVObject(id));
-}
-
-DLLEXPORT(VObject*) addProp_(VObject *o, const char *id)
-{
- return addVObjectProp(o,newVObject_(id));
-}
-
-DLLEXPORT(void) addList(VObject **o, VObject *p)
-{
- p->next = 0;
- if (*o == 0) {
- *o = p;
- }
- else {
- VObject *t = *o;
- while (t->next) {
- t = t->next;
- }
- t->next = p;
- }
-}
-
-DLLEXPORT(VObject*) nextVObjectInList(VObject *o)
-{
- return o->next;
-}
-
-DLLEXPORT(VObject*) setValueWithSize_(VObject *prop, void *val, unsigned int size)
-{
- VObject *sizeProp;
- setVObjectAnyValue(prop, val);
- sizeProp = addProp(prop,VCDataSizeProp);
- setVObjectLongValue(sizeProp, size);
- return prop;
-}
-
-DLLEXPORT(VObject*) setValueWithSize(VObject *prop, void *val, unsigned int size)
-{
- void *p = dupStr((const char *)val,size);
- return setValueWithSize_(prop,p,p?size:0);
-}
-
-DLLEXPORT(void) initPropIterator(VObjectIterator *i, VObject *o)
-{
- i->start = o->prop;
- i->next = 0;
-}
-
-DLLEXPORT(void) initVObjectIterator(VObjectIterator *i, VObject *o)
-{
- i->start = o->next;
- i->next = 0;
-}
-
-DLLEXPORT(int) moreIteration(VObjectIterator *i)
-{
- return (i->start && (i->next==0 || i->next!=i->start));
-}
-
-DLLEXPORT(VObject*) nextVObject(VObjectIterator *i)
-{
- if (i->start && i->next != i->start) {
- if (i->next == 0) {
- i->next = i->start->next;
- return i->next;
- }
- else {
- i->next = i->next->next;
- return i->next;
- }
- }
- else return (VObject*)0;
-}
-
-DLLEXPORT(VObject*) isAPropertyOf(VObject *o, const char *id)
-{
- VObjectIterator i;
- initPropIterator(&i,o);
- while (moreIteration(&i)) {
- VObject *each = nextVObject(&i);
- if (!stricmp(id,each->id))
- return each;
- }
- return (VObject*)0;
-}
-
-DLLEXPORT(VObject*) addGroup(VObject *o, const char *g)
-{
- /*
- a.b.c
- -->
- prop(c)
- prop(VCGrouping=b)
- prop(VCGrouping=a)
- */
- char *dot = strrchr(g,'.');
- if (dot) {
- VObject *p, *t;
- char *gs, *n = dot+1;
- gs = dupStr(g,0); /* so we can write to it. */
- /* used to be
- * t = p = addProp_(o,lookupProp_(n));
- */
- t = p = addProp_(o,lookupProp(n));
- dot = strrchr(gs,'.');
- *dot = 0;
- do {
- dot = strrchr(gs,'.');
- if (dot) {
- n = dot+1;
- *dot=0;
- }
- else
- n = gs;
- /* property(VCGroupingProp=n);
- * and the value may have VCGrouping property
- */
- t = addProp(t,VCGroupingProp);
- setVObjectStringZValue(t,lookupProp_(n));
- } while (n != gs);
- deleteStr(gs);
- return p;
- }
- else
- return addProp_(o,lookupProp(g));
-}
-
-DLLEXPORT(VObject*) addPropValue(VObject *o, const char *p, const char *v)
-{
- VObject *prop;
- prop = addProp(o,p);
- setVObjectUStringZValue_(prop, fakeUnicode(v,0));
- return prop;
-}
-
-DLLEXPORT(VObject*) addPropSizedValue_(VObject *o, const char *p, const char *v,
- unsigned int size)
-{
- VObject *prop;
- prop = addProp(o,p);
- setValueWithSize_(prop, (void*)v, size);
- return prop;
-}
-
-DLLEXPORT(VObject*) addPropSizedValue(VObject *o, const char *p, const char *v,
- unsigned int size)
-{
- return addPropSizedValue_(o,p,dupStr(v,size),size);
-}
-
-
-
-/*----------------------------------------------------------------------
- The following pretty print a VObject
- ----------------------------------------------------------------------*/
-
-static void printVObject_(FILE *fp, VObject *o, int level);
-
-static void indent(FILE *fp, int level)
-{
- int i;
- for (i=0;i<level*4;i++) {
- fputc(' ', fp);
- }
-}
-
-static void printValue(FILE *fp, VObject *o, int level)
-{
- switch (VALUE_TYPE(o)) {
- case VCVT_USTRINGZ: {
- char c;
- char *t,*s;
- s = t = fakeCString(USTRINGZ_VALUE_OF(o));
- fputc('"',fp);
- while (c=*t,c) {
- fputc(c,fp);
- if (c == '\n') indent(fp,level+2);
- t++;
- }
- fputc('"',fp);
- deleteStr(s);
- break;
- }
- case VCVT_STRINGZ: {
- char c;
- const char *s = STRINGZ_VALUE_OF(o);
- fputc('"',fp);
- while (c=*s,c) {
- fputc(c,fp);
- if (c == '\n') indent(fp,level+2);
- s++;
- }
- fputc('"',fp);
- break;
- }
- case VCVT_UINT:
- fprintf(fp,"%d", INTEGER_VALUE_OF(o)); break;
- case VCVT_ULONG:
- fprintf(fp,"%ld", LONG_VALUE_OF(o)); break;
- case VCVT_RAW:
- fprintf(fp,"[raw data]"); break;
- case VCVT_VOBJECT:
- fprintf(fp,"[vobject]\n");
- printVObject_(fp,VOBJECT_VALUE_OF(o),level+1);
- break;
- case 0:
- fprintf(fp,"[none]"); break;
- default:
- fprintf(fp,"[unknown]"); break;
- }
-}
-
-static void printNameValue(FILE *fp,VObject *o, int level)
-{
- indent(fp,level);
- if (NAME_OF(o)) {
- fprintf(fp,"%s", NAME_OF(o));
- }
- if (VALUE_TYPE(o)) {
- fputc('=',fp);
- printValue(fp,o, level);
- }
- fprintf(fp,"\n");
-}
-
-static void printVObject_(FILE *fp, VObject *o, int level)
- {
- VObjectIterator t;
- if (o == 0) {
- fprintf(fp,"[NULL]\n");
- return;
- }
- printNameValue(fp,o,level);
- initPropIterator(&t,o);
- while (moreIteration(&t)) {
- VObject *eachProp = nextVObject(&t);
- printVObject_(fp,eachProp,level+1);
- }
- }
-
-void printVObject(FILE *fp,VObject *o)
-{
- printVObject_(fp,o,0);
-}
-
-DLLEXPORT(void) printVObjectToFile(char *fname,VObject *o)
-{
- FILE *fp = fopen(fname,"w");
- if (fp) {
- printVObject(fp,o);
- fclose(fp);
- }
-}
-
-DLLEXPORT(void) printVObjectsToFile(char *fname,VObject *list)
-{
- FILE *fp = fopen(fname,"w");
- if (fp) {
- while (list) {
- printVObject(fp,list);
- list = nextVObjectInList(list);
- }
- fclose(fp);
- }
-}
-
-DLLEXPORT(void) cleanVObject(VObject *o)
-{
- if (o == 0) return;
- if (o->prop) {
- /* destroy time: cannot use the iterator here.
- Have to break the cycle in the circular link
- list and turns it into regular NULL-terminated
- list -- since at some point of destruction,
- the reference entry for the iterator to work
- will not longer be valid.
- */
- VObject *p;
- p = o->prop->next;
- o->prop->next = 0;
- do {
- VObject *t = p->next;
- cleanVObject(p);
- p = t;
- } while (p);
- }
- switch (VALUE_TYPE(o)) {
- case VCVT_USTRINGZ:
- case VCVT_STRINGZ:
- case VCVT_RAW:
- /* assume they are all allocated by malloc. */
- free((char*)STRINGZ_VALUE_OF(o));
- break;
- case VCVT_VOBJECT:
- cleanVObject(VOBJECT_VALUE_OF(o));
- break;
- }
- deleteVObject(o);
-}
-
-DLLEXPORT(void) cleanVObjects(VObject *list)
-{
- while (list) {
- VObject *t = list;
- list = nextVObjectInList(list);
- cleanVObject(t);
- }
-}
-
-/*----------------------------------------------------------------------
- The following is a String Table Facilities.
- ----------------------------------------------------------------------*/
-
-#define STRTBLSIZE 255
-
-static StrItem *strTbl[STRTBLSIZE];
-
-static unsigned int hashStr(const char *s)
-{
- unsigned int h = 0;
- int i;
- for (i=0;s[i];i++) {
- h += s[i]*i;
- }
- return h % STRTBLSIZE;
-}
-
-DLLEXPORT(const char*) lookupStr(const char *s)
-{
- StrItem *t;
- unsigned int h = hashStr(s);
- if ((t = strTbl[h]) != 0) {
- do {
- if (stricmp(t->s,s) == 0) {
- t->refCnt++;
- return t->s;
- }
- t = t->next;
- } while (t);
- }
- s = dupStr(s,0);
- strTbl[h] = newStrItem(s,strTbl[h]);
- return s;
-}
-
-DLLEXPORT(void) unUseStr(const char *s)
-{
- StrItem *t, *p;
- unsigned int h = hashStr(s);
- if ((t = strTbl[h]) != 0) {
- p = t;
- do {
- if (stricmp(t->s,s) == 0) {
- t->refCnt--;
- if (t->refCnt == 0) {
- if (p == strTbl[h]) {
- strTbl[h] = t->next;
- }
- else {
- p->next = t->next;
- }
- deleteStr(t->s);
- deleteStrItem(t);
- return;
- }
- }
- p = t;
- t = t->next;
- } while (t);
- }
-}
-
-DLLEXPORT(void) cleanStrTbl()
-{
- int i;
- for (i=0; i<STRTBLSIZE;i++) {
- StrItem *t = strTbl[i];
- while (t) {
- StrItem *p;
- deleteStr(t->s);
- p = t;
- t = t->next;
- deleteStrItem(p);
- } while (t);
- strTbl[i] = 0;
- }
-}
-
-
-struct PreDefProp {
- const char *name;
- const char *alias;
- const char** fields;
- unsigned int flags;
- };
-
-/* flags in PreDefProp */
-#define PD_BEGIN 0x1
-#define PD_INTERNAL 0x2
-
-static const char *adrFields[] = {
- VCPostalBoxProp,
- VCExtAddressProp,
- VCStreetAddressProp,
- VCCityProp,
- VCRegionProp,
- VCPostalCodeProp,
- VCCountryNameProp,
- 0
-};
-
-static const char *nameFields[] = {
- VCFamilyNameProp,
- VCGivenNameProp,
- VCAdditionalNamesProp,
- VCNamePrefixesProp,
- VCNameSuffixesProp,
- NULL
- };
-
-static const char *orgFields[] = {
- VCOrgNameProp,
- VCOrgUnitProp,
- VCOrgUnit2Prop,
- VCOrgUnit3Prop,
- VCOrgUnit4Prop,
- NULL
- };
-
-static const char *AAlarmFields[] = {
- VCRunTimeProp,
- VCSnoozeTimeProp,
- VCRepeatCountProp,
- VCAudioContentProp,
- 0
- };
-
-/* ExDate -- has unamed fields */
-/* RDate -- has unamed fields */
-
-static const char *DAlarmFields[] = {
- VCRunTimeProp,
- VCSnoozeTimeProp,
- VCRepeatCountProp,
- VCDisplayStringProp,
- 0
- };
-
-static const char *MAlarmFields[] = {
- VCRunTimeProp,
- VCSnoozeTimeProp,
- VCRepeatCountProp,
- VCEmailAddressProp,
- VCNoteProp,
- 0
- };
-
-static const char *PAlarmFields[] = {
- VCRunTimeProp,
- VCSnoozeTimeProp,
- VCRepeatCountProp,
- VCProcedureNameProp,
- 0
- };
-
-static struct PreDefProp propNames[] = {
- { VC7bitProp, 0, 0, 0 },
- { VC8bitProp, 0, 0, 0 },
- { VCAAlarmProp, 0, AAlarmFields, 0 },
- { VCAdditionalNamesProp, 0, 0, 0 },
- { VCAdrProp, 0, adrFields, 0 },
- { VCAgentProp, 0, 0, 0 },
- { VCAIFFProp, 0, 0, 0 },
- { VCAOLProp, 0, 0, 0 },
- { VCAppleLinkProp, 0, 0, 0 },
- { VCAttachProp, 0, 0, 0 },
- { VCAttendeeProp, 0, 0, 0 },
- { VCATTMailProp, 0, 0, 0 },
- { VCAudioContentProp, 0, 0, 0 },
- { VCAVIProp, 0, 0, 0 },
- { VCBase64Prop, 0, 0, 0 },
- { VCBBSProp, 0, 0, 0 },
- { VCBirthDateProp, 0, 0, 0 },
- { VCBMPProp, 0, 0, 0 },
- { VCBodyProp, 0, 0, 0 },
- { VCBusinessRoleProp, 0, 0, 0 },
- { VCCalProp, 0, 0, PD_BEGIN },
- { VCCaptionProp, 0, 0, 0 },
- { VCCardProp, 0, 0, PD_BEGIN },
- { VCCarProp, 0, 0, 0 },
- { VCCategoriesProp, 0, 0, 0 },
- { VCCellularProp, 0, 0, 0 },
- { VCCGMProp, 0, 0, 0 },
- { VCCharSetProp, 0, 0, 0 },
- { VCCIDProp, VCContentIDProp, 0, 0 },
- { VCCISProp, 0, 0, 0 },
- { VCCityProp, 0, 0, 0 },
- { VCClassProp, 0, 0, 0 },
- { VCCommentProp, 0, 0, 0 },
- { VCCompletedProp, 0, 0, 0 },
- { VCContentIDProp, 0, 0, 0 },
- { VCCountryNameProp, 0, 0, 0 },
- { VCDAlarmProp, 0, DAlarmFields, 0 },
- { VCDataSizeProp, 0, 0, PD_INTERNAL },
- { VCDayLightProp, 0, 0, 0 },
- { VCDCreatedProp, 0, 0, 0 },
- { VCDeliveryLabelProp, 0, 0, 0 },
- { VCDescriptionProp, 0, 0, 0 },
- { VCDIBProp, 0, 0, 0 },
- { VCDisplayStringProp, 0, 0, 0 },
- { VCDomesticProp, 0, 0, 0 },
- { VCDTendProp, 0, 0, 0 },
- { VCDTstartProp, 0, 0, 0 },
- { VCDueProp, 0, 0, 0 },
- { VCEmailAddressProp, 0, 0, 0 },
- { VCEncodingProp, 0, 0, 0 },
- { VCEndProp, 0, 0, 0 },
- { VCEventProp, 0, 0, PD_BEGIN },
- { VCEWorldProp, 0, 0, 0 },
- { VCExNumProp, 0, 0, 0 },
- { VCExpDateProp, 0, 0, 0 },
- { VCExpectProp, 0, 0, 0 },
- { VCExtAddressProp, 0, 0, 0 },
- { VCFamilyNameProp, 0, 0, 0 },
- { VCFaxProp, 0, 0, 0 },
- { VCFullNameProp, 0, 0, 0 },
- { VCGeoLocationProp, 0, 0, 0 },
- { VCGeoProp, 0, 0, 0 },
- { VCGIFProp, 0, 0, 0 },
- { VCGivenNameProp, 0, 0, 0 },
- { VCGroupingProp, 0, 0, 0 },
- { VCHomeProp, 0, 0, 0 },
- { VCIBMMailProp, 0, 0, 0 },
- { VCInlineProp, 0, 0, 0 },
- { VCInternationalProp, 0, 0, 0 },
- { VCInternetProp, 0, 0, 0 },
- { VCISDNProp, 0, 0, 0 },
- { VCJPEGProp, 0, 0, 0 },
- { VCLanguageProp, 0, 0, 0 },
- { VCLastModifiedProp, 0, 0, 0 },
- { VCLastRevisedProp, 0, 0, 0 },
- { VCLocationProp, 0, 0, 0 },
- { VCLogoProp, 0, 0, 0 },
- { VCMailerProp, 0, 0, 0 },
- { VCMAlarmProp, 0, MAlarmFields, 0 },
- { VCMCIMailProp, 0, 0, 0 },
- { VCMessageProp, 0, 0, 0 },
- { VCMETProp, 0, 0, 0 },
- { VCModemProp, 0, 0, 0 },
- { VCMPEG2Prop, 0, 0, 0 },
- { VCMPEGProp, 0, 0, 0 },
- { VCMSNProp, 0, 0, 0 },
- { VCNamePrefixesProp, 0, 0, 0 },
- { VCNameProp, 0, nameFields, 0 },
- { VCNameSuffixesProp, 0, 0, 0 },
- { VCNoteProp, 0, 0, 0 },
- { VCOrgNameProp, 0, 0, 0 },
- { VCOrgProp, 0, orgFields, 0 },
- { VCOrgUnit2Prop, 0, 0, 0 },
- { VCOrgUnit3Prop, 0, 0, 0 },
- { VCOrgUnit4Prop, 0, 0, 0 },
- { VCOrgUnitProp, 0, 0, 0 },
- { VCPagerProp, 0, 0, 0 },
- { VCPAlarmProp, 0, PAlarmFields, 0 },
- { VCParcelProp, 0, 0, 0 },
- { VCPartProp, 0, 0, 0 },
- { VCPCMProp, 0, 0, 0 },
- { VCPDFProp, 0, 0, 0 },
- { VCPGPProp, 0, 0, 0 },
- { VCPhotoProp, 0, 0, 0 },
- { VCPICTProp, 0, 0, 0 },
- { VCPMBProp, 0, 0, 0 },
- { VCPostalBoxProp, 0, 0, 0 },
- { VCPostalCodeProp, 0, 0, 0 },
- { VCPostalProp, 0, 0, 0 },
- { VCPowerShareProp, 0, 0, 0 },
- { VCPreferredProp, 0, 0, 0 },
- { VCPriorityProp, 0, 0, 0 },
- { VCProcedureNameProp, 0, 0, 0 },
- { VCProdIdProp, 0, 0, 0 },
- { VCProdigyProp, 0, 0, 0 },
- { VCPronunciationProp, 0, 0, 0 },
- { VCPSProp, 0, 0, 0 },
- { VCPublicKeyProp, 0, 0, 0 },
- { VCQPProp, VCQuotedPrintableProp, 0, 0 },
- { VCQuickTimeProp, 0, 0, 0 },
- { VCQuotedPrintableProp, 0, 0, 0 },
- { VCRDateProp, 0, 0, 0 },
- { VCRegionProp, 0, 0, 0 },
- { VCRelatedToProp, 0, 0, 0 },
- { VCRepeatCountProp, 0, 0, 0 },
- { VCResourcesProp, 0, 0, 0 },
- { VCRNumProp, 0, 0, 0 },
- { VCRoleProp, 0, 0, 0 },
- { VCRRuleProp, 0, 0, 0 },
- { VCRSVPProp, 0, 0, 0 },
- { VCRunTimeProp, 0, 0, 0 },
- { VCSequenceProp, 0, 0, 0 },
- { VCSnoozeTimeProp, 0, 0, 0 },
- { VCStartProp, 0, 0, 0 },
- { VCStatusProp, 0, 0, 0 },
- { VCStreetAddressProp, 0, 0, 0 },
- { VCSubTypeProp, 0, 0, 0 },
- { VCSummaryProp, 0, 0, 0 },
- { VCTelephoneProp, 0, 0, 0 },
- { VCTIFFProp, 0, 0, 0 },
- { VCTimeZoneProp, 0, 0, 0 },
- { VCTitleProp, 0, 0, 0 },
- { VCTLXProp, 0, 0, 0 },
- { VCTodoProp, 0, 0, PD_BEGIN },
- { VCTranspProp, 0, 0, 0 },
- { VCUniqueStringProp, 0, 0, 0 },
- { VCURLProp, 0, 0, 0 },
- { VCURLValueProp, 0, 0, 0 },
- { VCValueProp, 0, 0, 0 },
- { VCVersionProp, 0, 0, 0 },
- { VCVideoProp, 0, 0, 0 },
- { VCVoiceProp, 0, 0, 0 },
- { VCWAVEProp, 0, 0, 0 },
- { VCWMFProp, 0, 0, 0 },
- { VCWorkProp, 0, 0, 0 },
- { VCX400Prop, 0, 0, 0 },
- { VCX509Prop, 0, 0, 0 },
- { VCXRuleProp, 0, 0, 0 },
- { 0,0,0,0 }
- };
-
-
-static struct PreDefProp* lookupPropInfo(const char* str)
-{
- /* brute force for now, could use a hash table here. */
- int i;
-
- for (i = 0; propNames[i].name; i++)
- if (stricmp(str, propNames[i].name) == 0) {
- return &propNames[i];
- }
-
- return 0;
-}
-
-
-DLLEXPORT(const char*) lookupProp_(const char* str)
-{
- int i;
-
- for (i = 0; propNames[i].name; i++)
- if (stricmp(str, propNames[i].name) == 0) {
- const char* s;
- s = propNames[i].alias?propNames[i].alias:propNames[i].name;
- return lookupStr(s);
- }
- return lookupStr(str);
-}
-
-
-DLLEXPORT(const char*) lookupProp(const char* str)
-{
- int i;
-
- for (i = 0; propNames[i].name; i++)
- if (stricmp(str, propNames[i].name) == 0) {
- const char *s;
- fieldedProp = propNames[i].fields;
- s = propNames[i].alias?propNames[i].alias:propNames[i].name;
- return lookupStr(s);
- }
- fieldedProp = 0;
- return lookupStr(str);
-}
-
-
-/*----------------------------------------------------------------------
- APIs to Output text form.
- ----------------------------------------------------------------------*/
-#define OFILE_REALLOC_SIZE 256
-typedef struct OFile {
- FILE *fp;
- char *s;
- int len;
- int limit;
- int alloc:1;
- int fail:1;
- } OFile;
-
-#if 0
-static void appendsOFile(OFile *fp, const char *s)
-{
- int slen;
- if (fp->fail) return;
- slen = strlen(s);
- if (fp->fp) {
- fwrite(s,1,slen,fp->fp);
- }
- else {
-stuff:
- if (fp->len + slen < fp->limit) {
- memcpy(fp->s+fp->len,s,slen);
- fp->len += slen;
- return;
- }
- else if (fp->alloc) {
- fp->limit = fp->limit + OFILE_REALLOC_SIZE;
- if (OFILE_REALLOC_SIZE <= slen) fp->limit += slen;
- fp->s = (char *) realloc(fp->s,fp->limit);
- if (fp->s) goto stuff;
- }
- if (fp->alloc)
- free(fp->s);
- fp->s = 0;
- fp->fail = 1;
- }
-}
-
-static void appendcOFile(OFile *fp, char c)
-{
- if (fp->fail) return;
- if (fp->fp) {
- fputc(c,fp->fp);
- }
- else {
-stuff:
- if (fp->len+1 < fp->limit) {
- fp->s[fp->len] = c;
- fp->len++;
- return;
- }
- else if (fp->alloc) {
- fp->limit = fp->limit + OFILE_REALLOC_SIZE;
- fp->s = (char *) realloc(fp->s,fp->limit);
- if (fp->s) goto stuff;
- }
- if (fp->alloc)
- free(fp->s);
- fp->s = 0;
- fp->fail = 1;
- }
-}
-#else
-static void appendcOFile_(OFile *fp, char c)
-{
- if (fp->fail) return;
- if (fp->fp) {
- fputc(c,fp->fp);
- }
- else {
-stuff:
- if (fp->len+1 < fp->limit) {
- fp->s[fp->len] = c;
- fp->len++;
- return;
- }
- else if (fp->alloc) {
- fp->limit = fp->limit + OFILE_REALLOC_SIZE;
- fp->s = realloc(fp->s,fp->limit);
- if (fp->s) goto stuff;
- }
- if (fp->alloc)
- free(fp->s);
- fp->s = 0;
- fp->fail = 1;
- }
-}
-
-static void appendcOFile(OFile *fp, char c)
-{
- if (c == '\n') {
- /* write out as <CR><LF> */
- appendcOFile_(fp,0xd);
- appendcOFile_(fp,0xa);
- }
- else
- appendcOFile_(fp,c);
-}
-
-static void appendsOFile(OFile *fp, const char *s)
-{
- int i, slen;
- slen = strlen(s);
- for (i=0; i<slen; i++) {
- appendcOFile(fp,s[i]);
- }
-}
-
-#endif
-
-static void initOFile(OFile *fp, FILE *ofp)
-{
- fp->fp = ofp;
- fp->s = 0;
- fp->len = 0;
- fp->limit = 0;
- fp->alloc = 0;
- fp->fail = 0;
-}
-
-static void initMemOFile(OFile *fp, char *s, int len)
-{
- fp->fp = 0;
- fp->s = s;
- fp->len = 0;
- fp->limit = s?len:0;
- fp->alloc = s?0:1;
- fp->fail = 0;
-}
-
-
-static int writeBase64(OFile *fp, unsigned char *s, long len)
-{
- long cur = 0;
- int i, numQuads = 0;
- unsigned long trip;
- unsigned char b;
- char quad[5];
-#define MAXQUADS 16
-
- quad[4] = 0;
-
- while (cur < len) {
- /* collect the triplet of bytes into 'trip' */
- trip = 0;
- for (i = 0; i < 3; i++) {
- b = (cur < len) ? *(s + cur) : 0;
- cur++;
- trip = trip << 8 | b;
- }
- /* fill in 'quad' with the appropriate four characters */
- for (i = 3; i >= 0; i--) {
- b = (unsigned char)(trip & 0x3F);
- trip = trip >> 6;
- if ((3 - i) < (cur - len))
- quad[i] = '='; /* pad char */
- else if (b < 26) quad[i] = (char)b + 'A';
- else if (b < 52) quad[i] = (char)(b - 26) + 'a';
- else if (b < 62) quad[i] = (char)(b - 52) + '0';
- else if (b == 62) quad[i] = '+';
- else quad[i] = '/';
- }
- /* now output 'quad' with appropriate whitespace and line ending */
- appendsOFile(fp, (numQuads == 0 ? " " : ""));
- appendsOFile(fp, quad);
- appendsOFile(fp, ((cur >= len)?"\n" :(numQuads==MAXQUADS-1?"\n" : "")));
- numQuads = (numQuads + 1) % MAXQUADS;
- }
- appendcOFile(fp,'\n');
-
- return 1;
-}
-
-static void writeString(OFile *fp, const char *s)
-{
- appendsOFile(fp,s);
-}
-
-static void writeQPString(OFile *fp, const char *s)
-{
- char buf[4];
- int count=0;
- const char *p = s;
-
- while (*p) {
- /* break up lines biggger than 75 chars */
- if(count >=74){
- count=0;
- appendsOFile(fp,"=\n");
- }
-
- /* escape any non ASCII characters and '=' as per rfc1521 */
- if (*p<= 0x1f || *p >=0x7f || *p == '=' ) {
- sprintf(buf,"=%02X",(unsigned char)*p);
- appendsOFile(fp,buf);
- count+=3;
- } else {
- appendcOFile(fp,*p);
- count++;
- }
- p++;
- }
-}
-
-
-
-static void writeVObject_(OFile *fp, VObject *o);
-
-static void writeValue(OFile *fp, VObject *o, unsigned long size,int quote)
-{
- if (o == 0) return;
- switch (VALUE_TYPE(o)) {
- case VCVT_USTRINGZ: {
- char *s = fakeCString(USTRINGZ_VALUE_OF(o));
- if(quote) writeQPString(fp, s);
- else writeString(fp,s);
- deleteStr(s);
- break;
- }
- case VCVT_STRINGZ: {
- if(quote) writeQPString(fp, STRINGZ_VALUE_OF(o));
- else writeString(fp,STRINGZ_VALUE_OF(o));
- break;
- }
- case VCVT_UINT: {
- char buf[16];
- sprintf(buf,"%u", INTEGER_VALUE_OF(o));
- appendsOFile(fp,buf);
- break;
- }
- case VCVT_ULONG: {
- char buf[16];
- sprintf(buf,"%lu", LONG_VALUE_OF(o));
- appendsOFile(fp,buf);
- break;
- }
- case VCVT_RAW: {
- appendcOFile(fp,'\n');
- writeBase64(fp,(unsigned char*)(ANY_VALUE_OF(o)),size);
- break;
- }
- case VCVT_VOBJECT:
- appendcOFile(fp,'\n');
- writeVObject_(fp,VOBJECT_VALUE_OF(o));
- break;
- }
-}
-
-static void writeAttrValue(OFile *fp, VObject *o)
-{
- if (NAME_OF(o)) {
- struct PreDefProp *pi;
- pi = lookupPropInfo(NAME_OF(o));
- if (pi && ((pi->flags & PD_INTERNAL) != 0)) return;
- appendcOFile(fp,';');
- appendsOFile(fp,NAME_OF(o));
- }
- else
- appendcOFile(fp,';');
- if (VALUE_TYPE(o)) {
- appendcOFile(fp,'=');
- writeValue(fp,o,0,0);
- }
-}
-
-static void writeGroup(OFile *fp, VObject *o)
-{
- char buf1[256];
- char buf2[256];
- strcpy(buf1,NAME_OF(o));
- while ((o=isAPropertyOf(o,VCGroupingProp)) != 0) {
- strcpy(buf2,STRINGZ_VALUE_OF(o));
- strcat(buf2,".");
- strcat(buf2,buf1);
- strcpy(buf1,buf2);
- }
- appendsOFile(fp,buf1);
-}
-
-static int inList(const char **list, const char *s)
-{
- if (list == 0) return 0;
- while (*list) {
- if (stricmp(*list,s) == 0) return 1;
- list++;
- }
- return 0;
-}
-
-static void writeProp(OFile *fp, VObject *o)
-{
- int isQuoted=0;
- if (NAME_OF(o)) {
- struct PreDefProp *pi;
- VObjectIterator t;
- const char **fields_ = 0;
- pi = lookupPropInfo(NAME_OF(o));
- if (pi && ((pi->flags & PD_BEGIN) != 0)) {
- writeVObject_(fp,o);
- return;
- }
- if (isAPropertyOf(o,VCGroupingProp))
- writeGroup(fp,o);
- else
- appendsOFile(fp,NAME_OF(o));
- if (pi) fields_ = pi->fields;
- initPropIterator(&t,o);
- while (moreIteration(&t)) {
- const char *s;
- VObject *eachProp = nextVObject(&t);
- s = NAME_OF(eachProp);
- if (stricmp(VCGroupingProp,s) && !inList(fields_,s))
- writeAttrValue(fp,eachProp);
- if (stricmp(VCQPProp,s)==0 || stricmp(VCQuotedPrintableProp,s)==0)
- isQuoted=1;
- }
- if (fields_) {
- int i = 0, n = 0;
- const char** fields = fields_;
- /* output prop as fields */
- appendcOFile(fp,':');
- while (*fields) {
- VObject *t = isAPropertyOf(o,*fields);
- i++;
- if (t) n = i;
- fields++;
- }
- fields = fields_;
- for (i=0;i<n;i++) {
- writeValue(fp,isAPropertyOf(o,*fields),0,isQuoted);
- fields++;
- if (i<(n-1)) appendcOFile(fp,';');
- }
- }
- }
-
- if (VALUE_TYPE(o)) {
- unsigned long size = 0;
- VObject *p = isAPropertyOf(o,VCDataSizeProp);
- if (p) size = LONG_VALUE_OF(p);
- appendcOFile(fp,':');
- writeValue(fp,o,size,isQuoted);
- }
-
- appendcOFile(fp,'\n');
-}
-
-static void writeVObject_(OFile *fp, VObject *o)
-{
- if (NAME_OF(o)) {
- struct PreDefProp *pi;
- pi = lookupPropInfo(NAME_OF(o));
-
- if (pi && ((pi->flags & PD_BEGIN) != 0)) {
- VObjectIterator t;
- const char *begin = NAME_OF(o);
- appendsOFile(fp,"BEGIN:");
- appendsOFile(fp,begin);
- appendcOFile(fp,'\n');
- initPropIterator(&t,o);
- while (moreIteration(&t)) {
- VObject *eachProp = nextVObject(&t);
- writeProp(fp, eachProp);
- }
- appendsOFile(fp,"END:");
- appendsOFile(fp,begin);
- appendsOFile(fp,"\n\n");
- }
- }
-}
-
-void writeVObject(FILE *fp, VObject *o)
-{
- OFile ofp;
- initOFile(&ofp,fp);
- writeVObject_(&ofp,o);
-}
-
-DLLEXPORT(void) writeVObjectToFile(char *fname, VObject *o)
-{
- FILE *fp = fopen(fname,"w");
- if (fp) {
- writeVObject(fp,o);
- fclose(fp);
- }
-}
-
-DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list)
-{
- FILE *fp = fopen(fname,"w");
- if (fp) {
- while (list) {
- writeVObject(fp,list);
- list = nextVObjectInList(list);
- }
- fclose(fp);
- }
-}
-
-DLLEXPORT(char*) writeMemVObject(char *s, int *len, VObject *o)
-{
- OFile ofp;
- initMemOFile(&ofp,s,len?*len:0);
- writeVObject_(&ofp,o);
- if (len) *len = ofp.len;
- appendcOFile(&ofp,0);
- return ofp.s;
-}
-
-DLLEXPORT(char*) writeMemVObjects(char *s, int *len, VObject *list)
-{
- OFile ofp;
- initMemOFile(&ofp,s,len?*len:0);
- while (list) {
- writeVObject_(&ofp,list);
- list = nextVObjectInList(list);
- }
- if (len) *len = ofp.len;
- appendcOFile(&ofp,0);
- return ofp.s;
-}
-
-/*----------------------------------------------------------------------
- APIs to do fake Unicode stuff.
- ----------------------------------------------------------------------*/
-DLLEXPORT(wchar_t*) fakeUnicode(const char *ps, int *bytes)
-{
- wchar_t *r, *pw;
- int len = strlen(ps)+1;
-
- pw = r = (wchar_t*)malloc(sizeof(wchar_t)*len);
- if (bytes)
- *bytes = len * sizeof(wchar_t);
-
- while (*ps) {
- if (*ps == '\n')
- *pw = (wchar_t)0x2028;
- else if (*ps == '\r')
- *pw = (wchar_t)0x2029;
- else
- *pw = (wchar_t)(unsigned char)*ps;
- ps++; pw++;
- }
- *pw = (wchar_t)0;
-
- return r;
-}
-
-DLLEXPORT(int) uStrLen(const wchar_t *u)
-{
- int i = 0;
- while (*u != (wchar_t)0) { u++; i++; }
- return i;
-}
-
-DLLEXPORT(char*) fakeCString(const wchar_t *u)
-{
- char *s, *t;
- int len = uStrLen(u) + 1;
- t = s = (char*)malloc(len);
- while (*u) {
- if (*u == (wchar_t)0x2028)
- *t = '\n';
- else if (*u == (wchar_t)0x2029)
- *t = '\r';
- else
- *t = (char)*u;
- u++; t++;
- }
- *t = 0;
- return s;
-}
-
-/* end of source file vobject.c */
diff --git a/libversit/vobject.h b/libversit/vobject.h
deleted file mode 100644
index bc31dc8297..0000000000
--- a/libversit/vobject.h
+++ /dev/null
@@ -1,366 +0,0 @@
-/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
-
-The software is provided with RESTRICTED RIGHTS. Use, duplication, or
-disclosure by the government are subject to restrictions set forth in
-DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
-
-***************************************************************************/
-
-/*
-
-The vCard/vCalendar C interface is implemented in the set
-of files as follows:
-
-vcc.y, yacc source, and vcc.c, the yacc output you will use
-implements the core parser
-
-vobject.c implements an API that insulates the caller from
-the parser and changes in the vCard/vCalendar BNF
-
-port.h defines compilation environment dependent stuff
-
-vcc.h and vobject.h are header files for their .c counterparts
-
-vcaltmp.h and vcaltmp.c implement vCalendar "macro" functions
-which you may find useful.
-
-test.c is a standalone test driver that exercises some of
-the features of the APIs provided. Invoke test.exe on a
-VCARD/VCALENDAR input text file and you will see the pretty
-print output of the internal representation (this pretty print
-output should give you a good idea of how the internal
-representation looks like -- there is one such output in the
-following too). Also, a file with the .out suffix is generated
-to show that the internal representation can be written back
-in the original text format.
-
-For more information on this API see the readme.txt file
-which accompanied this distribution.
-
- Also visit:
-
- http://www.versit.com
- http://www.ralden.com
-
-*/
-
-
-#ifndef __VOBJECT_H__
-#define __VOBJECT_H__ 1
-
-
-#include "port.h"
-#include <stdlib.h>
-#include <stdio.h>
-
-#if defined(__CPLUSPLUS__) || defined(__cplusplus)
-extern "C" {
-#endif
-
-
-#define VC7bitProp "7BIT"
-#define VC8bitProp "8BIT"
-#define VCAAlarmProp "AALARM"
-#define VCAdditionalNamesProp "ADDN"
-#define VCAdrProp "ADR"
-#define VCAgentProp "AGENT"
-#define VCAIFFProp "AIFF"
-#define VCAOLProp "AOL"
-#define VCAppleLinkProp "APPLELINK"
-#define VCAttachProp "ATTACH"
-#define VCAttendeeProp "ATTENDEE"
-#define VCATTMailProp "ATTMAIL"
-#define VCAudioContentProp "AUDIOCONTENT"
-#define VCAVIProp "AVI"
-#define VCBase64Prop "BASE64"
-#define VCBBSProp "BBS"
-#define VCBirthDateProp "BDAY"
-#define VCBMPProp "BMP"
-#define VCBodyProp "BODY"
-#define VCBusinessRoleProp "ROLE"
-#define VCCalProp "VCALENDAR"
-#define VCCaptionProp "CAP"
-#define VCCardProp "VCARD"
-#define VCCarProp "CAR"
-#define VCCategoriesProp "CATEGORIES"
-#define VCCellularProp "CELL"
-#define VCCGMProp "CGM"
-#define VCCharSetProp "CS"
-#define VCCIDProp "CID"
-#define VCCISProp "CIS"
-#define VCCityProp "L"
-#define VCClassProp "CLASS"
-#define VCCommentProp "NOTE"
-#define VCCompletedProp "COMPLETED"
-#define VCContentIDProp "CONTENT-ID"
-#define VCCountryNameProp "C"
-#define VCDAlarmProp "DALARM"
-#define VCDataSizeProp "DATASIZE"
-#define VCDayLightProp "DAYLIGHT"
-#define VCDCreatedProp "DCREATED"
-#define VCDeliveryLabelProp "LABEL"
-#define VCDescriptionProp "DESCRIPTION"
-#define VCDIBProp "DIB"
-#define VCDisplayStringProp "DISPLAYSTRING"
-#define VCDomesticProp "DOM"
-#define VCDTendProp "DTEND"
-#define VCDTstartProp "DTSTART"
-#define VCDueProp "DUE"
-#define VCEmailAddressProp "EMAIL"
-#define VCEncodingProp "ENCODING"
-#define VCEndProp "END"
-#define VCEventProp "VEVENT"
-#define VCEWorldProp "EWORLD"
-#define VCExNumProp "EXNUM"
-#define VCExpDateProp "EXDATE"
-#define VCExpectProp "EXPECT"
-#define VCExtAddressProp "EXT ADD"
-#define VCFamilyNameProp "F"
-#define VCFaxProp "FAX"
-#define VCFullNameProp "FN"
-#define VCGeoProp "GEO"
-#define VCGeoLocationProp "GEO"
-#define VCGIFProp "GIF"
-#define VCGivenNameProp "G"
-#define VCGroupingProp "Grouping"
-#define VCHomeProp "HOME"
-#define VCIBMMailProp "IBMMail"
-#define VCInlineProp "INLINE"
-#define VCInternationalProp "INTL"
-#define VCInternetProp "INTERNET"
-#define VCISDNProp "ISDN"
-#define VCJPEGProp "JPEG"
-#define VCLanguageProp "LANG"
-#define VCLastModifiedProp "LAST-MODIFIED"
-#define VCLastRevisedProp "REV"
-#define VCLocationProp "LOCATION"
-#define VCLogoProp "LOGO"
-#define VCMailerProp "MAILER"
-#define VCMAlarmProp "MALARM"
-#define VCMCIMailProp "MCIMAIL"
-#define VCMessageProp "MSG"
-#define VCMETProp "MET"
-#define VCModemProp "MODEM"
-#define VCMPEG2Prop "MPEG2"
-#define VCMPEGProp "MPEG"
-#define VCMSNProp "MSN"
-#define VCNamePrefixesProp "NPRE"
-#define VCNameProp "N"
-#define VCNameSuffixesProp "NSUF"
-#define VCNoteProp "NOTE"
-#define VCOrgNameProp "ORGNAME"
-#define VCOrgProp "ORG"
-#define VCOrgUnit2Prop "OUN2"
-#define VCOrgUnit3Prop "OUN3"
-#define VCOrgUnit4Prop "OUN4"
-#define VCOrgUnitProp "OUN"
-#define VCPagerProp "PAGER"
-#define VCPAlarmProp "PALARM"
-#define VCParcelProp "PARCEL"
-#define VCPartProp "PART"
-#define VCPCMProp "PCM"
-#define VCPDFProp "PDF"
-#define VCPGPProp "PGP"
-#define VCPhotoProp "PHOTO"
-#define VCPICTProp "PICT"
-#define VCPMBProp "PMB"
-#define VCPostalBoxProp "BOX"
-#define VCPostalCodeProp "PC"
-#define VCPostalProp "POSTAL"
-#define VCPowerShareProp "POWERSHARE"
-#define VCPreferredProp "PREF"
-#define VCPriorityProp "PRIORITY"
-#define VCProcedureNameProp "PROCEDURENAME"
-#define VCProdIdProp "PRODID"
-#define VCProdigyProp "PRODIGY"
-#define VCPronunciationProp "SOUND"
-#define VCPSProp "PS"
-#define VCPublicKeyProp "KEY"
-#define VCQPProp "QP"
-#define VCQuickTimeProp "QTIME"
-#define VCQuotedPrintableProp "QUOTED-PRINTABLE"
-#define VCRDateProp "RDATE"
-#define VCRegionProp "R"
-#define VCRelatedToProp "RELATED-TO"
-#define VCRepeatCountProp "REPEATCOUNT"
-#define VCResourcesProp "RESOURCES"
-#define VCRNumProp "RNUM"
-#define VCRoleProp "ROLE"
-#define VCRRuleProp "RRULE"
-#define VCRSVPProp "RSVP"
-#define VCRunTimeProp "RUNTIME"
-#define VCSequenceProp "SEQUENCE"
-#define VCSnoozeTimeProp "SNOOZETIME"
-#define VCStartProp "START"
-#define VCStatusProp "STATUS"
-#define VCStreetAddressProp "STREET"
-#define VCSubTypeProp "SUBTYPE"
-#define VCSummaryProp "SUMMARY"
-#define VCTelephoneProp "TEL"
-#define VCTIFFProp "TIFF"
-#define VCTimeZoneProp "TZ"
-#define VCTitleProp "TITLE"
-#define VCTLXProp "TLX"
-#define VCTodoProp "VTODO"
-#define VCTranspProp "TRANSP"
-#define VCUniqueStringProp "UID"
-#define VCURLProp "URL"
-#define VCURLValueProp "URLVAL"
-#define VCValueProp "VALUE"
-#define VCVersionProp "VERSION"
-#define VCVideoProp "VIDEO"
-#define VCVoiceProp "VOICE"
-#define VCWAVEProp "WAVE"
-#define VCWMFProp "WMF"
-#define VCWorkProp "WORK"
-#define VCX400Prop "X400"
-#define VCX509Prop "X509"
-#define VCXRuleProp "XRULE"
-
-/* Extensions */
-
-#define XPilotIdProp "X-PILOTID"
-#define XPilotStatusProp "X-PILOTSTAT"
-
-typedef struct VObject VObject;
-
-typedef struct VObjectIterator {
- VObject* start;
- VObject* next;
- } VObjectIterator;
-
-extern DLLEXPORT(VObject*) newVObject(const char *id);
-extern DLLEXPORT(void) deleteVObject(VObject *p);
-extern DLLEXPORT(char*) dupStr(const char *s, unsigned int size);
-extern DLLEXPORT(void) deleteStr(const char *p);
-extern DLLEXPORT(void) unUseStr(const char *s);
-
-extern DLLEXPORT(void) setVObjectName(VObject *o, const char* id);
-extern DLLEXPORT(void) setVObjectStringZValue(VObject *o, const char *s);
-extern DLLEXPORT(void) setVObjectStringZValue_(VObject *o, const char *s);
-extern DLLEXPORT(void) setVObjectUStringZValue(VObject *o, const wchar_t *s);
-extern DLLEXPORT(void) setVObjectUStringZValue_(VObject *o, const wchar_t *s);
-extern DLLEXPORT(void) setVObjectIntegerValue(VObject *o, unsigned int i);
-extern DLLEXPORT(void) setVObjectLongValue(VObject *o, unsigned long l);
-extern DLLEXPORT(void) setVObjectAnyValue(VObject *o, void *t);
-extern DLLEXPORT(VObject*) setValueWithSize(VObject *prop, void *val, unsigned int size);
-extern DLLEXPORT(VObject*) setValueWithSize_(VObject *prop, void *val, unsigned int size);
-
-extern DLLEXPORT(const char*) vObjectName(VObject *o);
-extern DLLEXPORT(const char*) vObjectStringZValue(VObject *o);
-extern DLLEXPORT(const wchar_t*) vObjectUStringZValue(VObject *o);
-extern DLLEXPORT(unsigned int) vObjectIntegerValue(VObject *o);
-extern DLLEXPORT(unsigned long) vObjectLongValue(VObject *o);
-extern DLLEXPORT(void*) vObjectAnyValue(VObject *o);
-extern DLLEXPORT(VObject*) vObjectVObjectValue(VObject *o);
-extern DLLEXPORT(void) setVObjectVObjectValue(VObject *o, VObject *p);
-
-extern DLLEXPORT(VObject*) addVObjectProp(VObject *o, VObject *p);
-extern DLLEXPORT(VObject*) addProp(VObject *o, const char *id);
-extern DLLEXPORT(VObject*) addProp_(VObject *o, const char *id);
-extern DLLEXPORT(VObject*) addPropValue(VObject *o, const char *p, const char *v);
-extern DLLEXPORT(VObject*) addPropSizedValue_(VObject *o, const char *p, const char *v, unsigned int size);
-extern DLLEXPORT(VObject*) addPropSizedValue(VObject *o, const char *p, const char *v, unsigned int size);
-extern DLLEXPORT(VObject*) addGroup(VObject *o, const char *g);
-extern DLLEXPORT(void) addList(VObject **o, VObject *p);
-
-extern DLLEXPORT(VObject*) isAPropertyOf(VObject *o, const char *id);
-
-extern DLLEXPORT(VObject*) nextVObjectInList(VObject *o);
-extern DLLEXPORT(void) initPropIterator(VObjectIterator *i, VObject *o);
-extern DLLEXPORT(int) moreIteration(VObjectIterator *i);
-extern DLLEXPORT(VObject*) nextVObject(VObjectIterator *i);
-
-extern DLLEXPORT(char*) writeMemVObject(char *s, int *len, VObject *o);
-extern DLLEXPORT(char*) writeMemVObjects(char *s, int *len, VObject *list);
-
-extern DLLEXPORT(const char*) lookupStr(const char *s);
-extern DLLEXPORT(void) cleanStrTbl();
-
-extern DLLEXPORT(void) cleanVObject(VObject *o);
-extern DLLEXPORT(void) cleanVObjects(VObject *list);
-
-extern DLLEXPORT(const char*) lookupProp(const char* str);
-extern DLLEXPORT(const char*) lookupProp_(const char* str);
-
-extern DLLEXPORT(wchar_t*) fakeUnicode(const char *ps, int *bytes);
-extern DLLEXPORT(int) uStrLen(const wchar_t *u);
-extern DLLEXPORT(char*) fakeCString(const wchar_t *u);
-
-extern DLLEXPORT(void) printVObjectToFile(char *fname,VObject *o);
-extern DLLEXPORT(void) printVObjectsToFile(char *fname,VObject *list);
-extern DLLEXPORT(void) writeVObjectToFile(char *fname, VObject *o);
-extern DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list);
-
-extern DLLEXPORT(int) vObjectValueType(VObject *o);
-
-/* return type of vObjectValueType: */
-#define VCVT_NOVALUE 0
- /* if the VObject has no value associated with it. */
-#define VCVT_STRINGZ 1
- /* if the VObject has value set by setVObjectStringZValue. */
-#define VCVT_USTRINGZ 2
- /* if the VObject has value set by setVObjectUStringZValue. */
-#define VCVT_UINT 3
- /* if the VObject has value set by setVObjectIntegerValue. */
-#define VCVT_ULONG 4
- /* if the VObject has value set by setVObjectLongValue. */
-#define VCVT_RAW 5
- /* if the VObject has value set by setVObjectAnyValue. */
-#define VCVT_VOBJECT 6
- /* if the VObject has value set by setVObjectVObjectValue. */
-
-extern const char** fieldedProp;
-
-/* NOTE regarding printVObject and writeVObject
-
-The functions below are not exported from the DLL because they
-take a FILE* as a parameter, which cannot be passed across a DLL
-interface (at least that is my experience). Instead you can use
-their companion functions which take file names or pointers
-to memory. However, if you are linking this code into
-your build directly then you may find them a more convenient API
-and you can go ahead and use them. If you try to use them with
-the DLL LIB you will get a link error.
-*/
-extern void printVObject(FILE *fp,VObject *o);
-extern void writeVObject(FILE *fp, VObject *o);
-
-
-#if defined(__CPLUSPLUS__) || defined(__cplusplus)
-}
-#endif
-
-#endif /* __VOBJECT_H__ */
-
-
diff --git a/mail/.cvsignore b/mail/.cvsignore
deleted file mode 100644
index 63d45eccce..0000000000
--- a/mail/.cvsignore
+++ /dev/null
@@ -1,14 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-Mail-stubs.c
-Mail-skels.c
-Mail-common.c
-Mail.h
-evolution-mail
-evolution-mail.pure
-test-mail
-test-sources
-test-thread \ No newline at end of file
diff --git a/mail/ChangeLog b/mail/ChangeLog
deleted file mode 100644
index e05e83f780..0000000000
--- a/mail/ChangeLog
+++ /dev/null
@@ -1,3693 +0,0 @@
-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-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.oaf.in b/mail/GNOME_Evolution_Mail.oaf.in
deleted file mode 100644
index 2be622f3f6..0000000000
--- a/mail/GNOME_Evolution_Mail.oaf.in
+++ /dev/null
@@ -1,54 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:evolution-mail:25902062-543b-4f44-8702-d90145fcdbf2"
- type="exe"
- location="evolution-mail">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution mail folder factory component."/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:evolution-mail:833d5a71-a201-4a0e-b7e6-5475c5c4cb45"
- type="factory"
- location="OAFIID:control-factory:evolution-mail:25902062-543b-4f44-8702-d90145fcdbf2">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/evolution-mail:1.0"/>
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution mail folder display component."/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-mail:0ea887d5-622b-4b8c-b525-18aa1cbe18a6"
- type="exe"
- location="evolution-mail">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution mail component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-mail:d3cb3ed6-a654-4337-8aa0-f443751d6d1b"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-mail:0ea887d5-622b-4b8c-b525-18aa1cbe18a6">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling mail."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/mail/GNOME_Evolution_Mail.oafinfo b/mail/GNOME_Evolution_Mail.oafinfo
deleted file mode 100644
index 2be622f3f6..0000000000
--- a/mail/GNOME_Evolution_Mail.oafinfo
+++ /dev/null
@@ -1,54 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:evolution-mail:25902062-543b-4f44-8702-d90145fcdbf2"
- type="exe"
- location="evolution-mail">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution mail folder factory component."/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:evolution-mail:833d5a71-a201-4a0e-b7e6-5475c5c4cb45"
- type="factory"
- location="OAFIID:control-factory:evolution-mail:25902062-543b-4f44-8702-d90145fcdbf2">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/evolution-mail:1.0"/>
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution mail folder display component."/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-mail:0ea887d5-622b-4b8c-b525-18aa1cbe18a6"
- type="exe"
- location="evolution-mail">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution mail component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-mail:d3cb3ed6-a654-4337-8aa0-f443751d6d1b"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-mail:0ea887d5-622b-4b8c-b525-18aa1cbe18a6">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling mail."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/mail/Mail.idl b/mail/Mail.idl
deleted file mode 100644
index 1d12a39c5c..0000000000
--- a/mail/Mail.idl
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * mail.idl: Mail interfaces for Evolution
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- *
- * (C) 2000 Helix Code, Inc.
- */
-
-#include <Bonobo.idl>
-
-module Evolution {
-
- interface MessageList : Bonobo::Unknown {
-
- void select_message (in long message_number);
- void open_message (in long message_number);
- };
-
- /*
- * FolderBrowser object.
- *
- * configuration of this widget is done trough
- * Bonobo Properties
- */
- interface FolderBrowser : Bonobo::Unknown {
- MessageList get_message_list ();
- };
-};
-
diff --git a/mail/Makefile.am b/mail/Makefile.am
deleted file mode 100644
index cf13d00c54..0000000000
--- a/mail/Makefile.am
+++ /dev/null
@@ -1,145 +0,0 @@
-bin_PROGRAMS = evolution-mail
-
-noinst_PROGRAMS = test-mail #test-thread
-
-providerdir = $(libdir)/evolution/camel-providers/$(VERSION)
-
-INCLUDES = \
- -I$(top_srcdir)/widgets \
- -I$(top_srcdir)/widgets/e-text \
- -I$(top_srcdir) \
- -I$(top_srcdir)/camel \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- $(BONOBO_HTML_GNOME_CFLAGS) \
- $(GNOME_VFS_CFLAGS) \
- $(UNICODE_CFLAGS) \
- $(GTKHTML_CFLAGS) \
- -DEVOLUTION_VERSION=\""$(VERSION)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \
- -DEVOLUTION_LOCALEDIR=\""$(datadir)/locale"\" \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DCAMEL_PROVIDERDIR=\""$(providerdir)"\" \
- -DG_LOG_DOMAIN=\"evolution-mail\" \
- $(THREADS_CFLAGS)
-
-EVOLUTION_MAIL_CORBA_GENERATED = \
- Mail.h \
- Mail-common.c \
- Mail-skels.c \
- Mail-stubs.c
-
-# FIXME Is there any way around having to do this?
-CAMEL_OBJS_EXTRA = \
- $(top_builddir)/camel/providers/vee/libcamelvee.la
-
-evolution_mail_SOURCES = \
- $(EVOLUTION_MAIL_CORBA_GENERATED) \
- component-factory.c \
- component-factory.h \
- folder-browser.c \
- folder-browser.h \
- folder-browser-factory.c \
- folder-browser-factory.h \
- mail-autofilter.c \
- mail-autofilter.h \
- mail-callbacks.c \
- mail-config.c \
- mail-config.h \
- mail-config-gui.c \
- mail-config-gui.h \
- mail-crypto.c \
- mail-display.c \
- mail-display.h \
- mail-format.c \
- mail-identify.c \
- mail-local.c \
- mail-local.h \
- mail-ops.c \
- mail-ops.h \
- mail-threads.c \
- mail-threads.h \
- mail-tools.c \
- mail-tools.h \
- mail-types.h \
- mail-vfolder.c \
- mail-vfolder.h \
- mail-view.c \
- main.c \
- message-list.c \
- message-list.h \
- message-thread.c \
- message-thread.h \
- session.c \
- mail.h
-
-evolution_mail_LDADD = \
- $(top_builddir)/shell/libeshell.a \
- $(top_builddir)/composer/libcomposer.la \
- $(top_builddir)/widgets/e-paned/libepaned.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(CAMEL_OBJS_EXTRA) \
- $(top_builddir)/camel/libcamel.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libibex/libibex.la \
- $(top_builddir)/filter/libfilter.la \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(GTKHTML_LIBS) \
- $(THREADS_LIBS) \
- $(UNICODE_LIBS)
-
-test_mail_SOURCES = \
- test-mail.c
-
-test_mail_LDADD = \
- $(BONOBO_HTML_GNOME_LIBS)
-
-#test_thread_SOURCES = \
-# mail-threads.c \
-# mail-threads.h \
-# test-thread.c
-#
-#test_thread_LDADD = \
-# $(top_builddir)/camel/libcamel.la \
-# $(top_builddir)/e-util/libeutil.la \
-# $(top_builddir)/libibex/libibex.la \
-# $(BONOBO_HTML_GNOME_LIBS) \
-# $(UNICODE_LIBS) \
-# $(THREADS_LIBS)
-#
-#test_thread_CFLAGS = -g $(THREADS_CFLAGS)
-
-GOAD_FILES = evolution-mail.gnorba
-OAF_FILES = evolution-mail.oafinfo
-
-if USING_OAF
-oafdir = $(datadir)/oaf
-oaf_DATA = $(OAF_FILES)
-else
-gnorbadir = $(sysconfdir)/CORBA/servers
-gnorba_DATA = $(GOAD_FILES)
-endif
-
-gladedir = $(datadir)/evolution/glade
-glade_DATA = mail-config.glade mail-config-druid.glade local-config.glade
-
-iconsdir = $(datadir)/images/evolution
-
-$(EVOLUTION_MAIL_CORBA_GENERATED): Mail.idl
- $(ORBIT_IDL) -I$(datadir)/idl -I`$(GNOME_CONFIG) --cflags idl` -I`$(GNOME_CONFIG) --datadir`/idl -I$(srcdir) $(srcdir)/Mail.idl
-
-EXTRA_DIST = Mail.idl $(glade_DATA) $(GOAD_FILES) $(OAF_FILES)
-
-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
diff --git a/mail/README.async b/mail/README.async
deleted file mode 100644
index 238fafcedb..0000000000
--- a/mail/README.async
+++ /dev/null
@@ -1,360 +0,0 @@
-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/component-factory.c b/mail/component-factory.c
deleted file mode 100644
index eaabce8e38..0000000000
--- a/mail/component-factory.c
+++ /dev/null
@@ -1,276 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* component-factory.c
- *
- * Authors: Ettore Perazzoli <ettore@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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 <bonobo.h>
-
-#include "camel.h"
-
-#include "Evolution.h"
-#include "evolution-storage.h"
-
-#include "folder-browser-factory.h"
-#include "evolution-shell-component.h"
-#include "folder-browser.h"
-#include "mail.h" /* YUCK FIXME */
-#include "mail-tools.h"
-#include "mail-ops.h"
-#include "e-util/e-gui-utils.h"
-
-#include "component-factory.h"
-
-CamelFolder *drafts_folder = NULL;
-char *evolution_dir;
-
-static void create_vfolder_storage (EvolutionShellComponent *shell_component);
-static void create_imap_storage (EvolutionShellComponent *shell_component,
- const char *source);
-static void create_news_storage (EvolutionShellComponent *shell_component);
-
-#define COMPONENT_FACTORY_ID "OAFIID:evolution-shell-component-factory:evolution-mail:0ea887d5-622b-4b8c-b525-18aa1cbe18a6"
-
-static BonoboGenericFactory *factory = NULL;
-static gint running_objects = 0;
-
-static const EvolutionShellComponentFolderType folder_types[] = {
- { "mail", "evolution-inbox.png" },
- { NULL, NULL }
-};
-
-/* EvolutionShellComponent methods and signals. */
-
-static EvolutionShellComponentResult
-create_view (EvolutionShellComponent *shell_component,
- const char *physical_uri,
- const char *folder_type,
- BonoboControl **control_return,
- void *closure)
-{
- BonoboControl *control;
- GtkWidget *folder_browser_widget;
-
- if (g_strcasecmp (folder_type, "mail") != 0)
- return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE;
-
- control = folder_browser_factory_new_control (physical_uri);
- if (!control)
- return EVOLUTION_SHELL_COMPONENT_NOTFOUND;
-
- folder_browser_widget = bonobo_control_get_widget (control);
-
- g_assert (folder_browser_widget != NULL);
- g_assert (IS_FOLDER_BROWSER (folder_browser_widget));
-
- *control_return = control;
-
- return EVOLUTION_SHELL_COMPONENT_OK;
-}
-
-static void
-create_folder (EvolutionShellComponent *shell_component,
- const char *physical_uri,
- const char *type,
- const Evolution_ShellComponentListener listener,
- void *closure)
-{
- mail_do_create_folder (listener, physical_uri, type);
-}
-
-static void
-owner_set_cb (EvolutionShellComponent *shell_component,
- EvolutionShellClient *shell_client,
- const char *evolution_homedir,
- gpointer user_data)
-{
- GSList *sources;
- MailConfigService *s;
-
- g_print ("evolution-mail: Yeeeh! We have an owner!\n"); /* FIXME */
-
- evolution_dir = g_strdup (evolution_homedir);
-
- mail_config_init ();
- mail_do_setup_draftbox ();
- create_vfolder_storage (shell_component);
- create_news_storage (shell_component);
-
- sources = mail_config_get_sources ();
- while (sources) {
- s = sources->data;
- if (!g_strncasecmp (s->url, "imap:", 5))
- create_imap_storage (shell_component, s->url);
- sources = sources->next;
- }
-}
-
-static void
-owner_unset_cb (EvolutionShellComponent *shell_component, gpointer user_data)
-{
- mail_operations_terminate ();
- gtk_main_quit ();
-}
-
-static void
-factory_destroy (BonoboEmbeddable *embeddable,
- gpointer dummy)
-{
- running_objects--;
- if (running_objects > 0)
- return;
-
- if (factory)
- bonobo_object_unref (BONOBO_OBJECT (factory));
- else
- g_warning ("Serious ref counting error");
- factory = NULL;
-
- gtk_main_quit ();
-}
-
-static BonoboObject *
-factory_fn (BonoboGenericFactory *factory, void *closure)
-{
- EvolutionShellComponent *shell_component;
-
- running_objects++;
-
- shell_component = evolution_shell_component_new (folder_types,
- create_view,
- create_folder,
- NULL,
- NULL,
- NULL);
-
- gtk_signal_connect (GTK_OBJECT (shell_component), "destroy",
- GTK_SIGNAL_FUNC (factory_destroy), NULL);
- gtk_signal_connect (GTK_OBJECT (shell_component), "owner_set",
- GTK_SIGNAL_FUNC (owner_set_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (shell_component), "owner_unset",
- GTK_SIGNAL_FUNC (owner_unset_cb), NULL);
-
- return BONOBO_OBJECT (shell_component);
-}
-
-void
-component_factory_init (void)
-{
- if (factory != NULL)
- return;
-
- factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, factory_fn, NULL);
-
- if (factory == NULL) {
- e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
- _("Cannot initialize Evolution's mail component."));
- exit (1);
- }
-}
-
-/* FIXME: remove */
-static void
-create_vfolder_storage (EvolutionShellComponent *shell_component)
-{
- void vfolder_create_storage(EvolutionShellComponent *shell_component);
-
- vfolder_create_storage(shell_component);
-}
-
-static void
-create_imap_storage (EvolutionShellComponent *shell_component,
- const char *source)
-{
- EvolutionShellClient *shell_client;
- Evolution_Shell corba_shell;
- EvolutionStorage *storage;
- char *server, *p;
-
- shell_client = evolution_shell_component_get_owner (shell_component);
- if (shell_client == NULL) {
- g_warning ("We have no shell!?");
- return;
- }
-
- corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client));
-
- if (!(server = strchr (source, '@')))
- return;
-
- server++;
- for (p = server; *p && *p != '/'; p++);
-
- server = g_strndup (server, (gint)(p - server));
-
- storage = evolution_storage_new (server);
- g_free (server);
-
- if (evolution_storage_register_on_shell (storage, corba_shell) != EVOLUTION_STORAGE_OK) {
- g_warning ("Cannot register storage");
- return;
- }
-
- mail_do_scan_subfolders (source, storage);
-}
-
-static void
-create_news_storage (EvolutionShellComponent *shell_component)
-{
- const MailConfigService *s;
- EvolutionShellClient *shell_client;
- Evolution_Shell corba_shell;
- EvolutionStorage *storage;
- char *source = NULL, *server, *p;
-
- s = mail_config_get_default_news ();
- if (s)
- source = s->url;
-
- if (!source || g_strncasecmp (source, "news://", 7))
- return;
-
- shell_client = evolution_shell_component_get_owner (shell_component);
- if (shell_client == NULL) {
- g_warning ("We have no shell!?");
- return;
- }
-
- corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client));
-
- server = source + 7;
- for (p = server; *p && *p != '/'; p++);
-
- server = g_strndup (server, (gint)(p - server));
-
- storage = evolution_storage_new (server);
- g_free (server);
-
- if (evolution_storage_register_on_shell (storage, corba_shell) != EVOLUTION_STORAGE_OK) {
- g_warning ("Cannot register storage");
- return;
- }
-
- mail_do_scan_subfolders (source, storage);
-}
-
diff --git a/mail/component-factory.h b/mail/component-factory.h
deleted file mode 100644
index 1f5a33f407..0000000000
--- a/mail/component-factory.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* component-factory.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef COMPONENT_FACTORY_H
-#define COMPONENT_FACTORY_H
-
-void component_factory_init (void);
-
-#endif
diff --git a/mail/e-attchmt.png b/mail/e-attchmt.png
deleted file mode 100644
index b4bac8db67..0000000000
--- a/mail/e-attchmt.png
+++ /dev/null
Binary files differ
diff --git a/mail/evolution-mail.gnorba b/mail/evolution-mail.gnorba
deleted file mode 100644
index b799a57aa2..0000000000
--- a/mail/evolution-mail.gnorba
+++ /dev/null
@@ -1,23 +0,0 @@
-[control-factory:evolution-mail]
-type=exe
-repo_id=IDL:GNOME/GenericFactory:1.0
-description=Evolution mail folder factory component.
-location_info=evolution-mail
-
-[control:evolution-mail]
-type=factory
-repo_id=IDL:BonoboControl/evolution-mail:1.0 IDL:GNOME/Control:1.0
-description=Evolution mail folder display component.
-location_info=control-factory:evolution-mail
-
-[evolution-shell-component-factory:evolution-mail]
-type=exe
-repo_id=IDL:GNOME/GenericFactory:1.0
-description=Factory for the Evolution mail component.
-location_info=evolution-mail
-
-[evolution-shell-component:evolution-mail]
-type=factory
-repo_id=IDL:Evolution/ShellComponent:1.0
-description=Evolution component for handling mail.
-location_info=evolution-shell-component-factory:evolution-mail
diff --git a/mail/evolution-mail.oafinfo b/mail/evolution-mail.oafinfo
deleted file mode 100644
index 2be622f3f6..0000000000
--- a/mail/evolution-mail.oafinfo
+++ /dev/null
@@ -1,54 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:evolution-mail:25902062-543b-4f44-8702-d90145fcdbf2"
- type="exe"
- location="evolution-mail">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution mail folder factory component."/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:evolution-mail:833d5a71-a201-4a0e-b7e6-5475c5c4cb45"
- type="factory"
- location="OAFIID:control-factory:evolution-mail:25902062-543b-4f44-8702-d90145fcdbf2">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/evolution-mail:1.0"/>
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution mail folder display component."/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-mail:0ea887d5-622b-4b8c-b525-18aa1cbe18a6"
- type="exe"
- location="evolution-mail">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution mail component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-mail:d3cb3ed6-a654-4337-8aa0-f443751d6d1b"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-mail:0ea887d5-622b-4b8c-b525-18aa1cbe18a6">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling mail."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/mail/folder-browser-factory.c b/mail/folder-browser-factory.c
deleted file mode 100644
index fcb1242286..0000000000
--- a/mail/folder-browser-factory.c
+++ /dev/null
@@ -1,349 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * folder-browser-factory.c: A Bonobo Control factory for Folder Browsers
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- *
- * (C) 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-
-#include <gnome.h>
-#include <bonobo/bonobo-main.h>
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-generic-factory.h>
-#include <bonobo/bonobo-control.h>
-
-#include "e-util/e-util.h"
-#include "e-util/e-gui-utils.h"
-
-#include "folder-browser-factory.h"
-
-#include "folder-browser.h"
-#include "mail.h"
-#include "shell/Evolution.h"
-#include "mail-config.h"
-
-/* The FolderBrowser BonoboControls we have. */
-static GList *control_list = NULL;
-
-static GnomeUIInfo gnome_toolbar [] = {
- GNOMEUIINFO_ITEM_STOCK (N_("Get mail"), N_("Check for new mail"), fetch_mail, GNOME_STOCK_PIXMAP_MAIL_RCV),
- GNOMEUIINFO_ITEM_STOCK (N_("Compose"), N_("Compose a new message"), compose_msg, GNOME_STOCK_PIXMAP_MAIL_NEW),
-
- GNOMEUIINFO_SEPARATOR,
-
- GNOMEUIINFO_ITEM_STOCK (N_("Reply"), N_("Reply to the sender of this message"), reply_to_sender, GNOME_STOCK_PIXMAP_MAIL_RPL),
- GNOMEUIINFO_ITEM_STOCK (N_("Reply to All"), N_("Reply to all recipients of this message"), reply_to_all, GNOME_STOCK_PIXMAP_MAIL_RPL),
-
- GNOMEUIINFO_ITEM_STOCK (N_("Forward"), N_("Forward this message"), forward_msg, GNOME_STOCK_PIXMAP_MAIL_FWD),
-
- GNOMEUIINFO_SEPARATOR,
-
- GNOMEUIINFO_ITEM_STOCK (N_("Move"), N_("Move message to a new folder"), move_msg, GNOME_STOCK_PIXMAP_MAIL_SND),
- GNOMEUIINFO_ITEM_STOCK (N_("Copy"), N_("Copy message to a new folder"), copy_msg, GNOME_STOCK_PIXMAP_MAIL_SND),
-
- GNOMEUIINFO_ITEM_STOCK (N_("Print"), N_("Print the selected message"), print_msg, GNOME_STOCK_PIXMAP_PRINT),
-
- GNOMEUIINFO_ITEM_STOCK (N_("Delete"), N_("Delete this message"), delete_msg, GNOME_STOCK_PIXMAP_TRASH),
-
- GNOMEUIINFO_END
-};
-
-static void
-register_ondemand (RuleContext *f, FilterRule *rule, gpointer data)
-{
- FolderBrowser *fb = FOLDER_BROWSER (data);
- BonoboUIHandler *uih = gtk_object_get_data (GTK_OBJECT (fb), "uih");
- gchar *text;
- struct fb_ondemand_closure *oc;
-
- oc = g_new (struct fb_ondemand_closure, 1);
- oc->rule = rule;
- oc->fb = fb;
- oc->path = g_strdup_printf ("/<Component Placeholder>/Folder/Filter-%s", rule->name);
-
- if (fb->filter_menu_paths == NULL)
- bonobo_ui_handler_menu_new_separator (uih, "/<Component Placeholder>/Folder/separator1", -1);
-
- text = g_strdup_printf (_("Run filter \"%s\""), rule->name);
- fb->filter_menu_paths = g_slist_prepend (fb->filter_menu_paths, oc);
-
- bonobo_ui_handler_menu_new_item (uih, oc->path, text,
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE,
- 0,
- 0, 0, run_filter_ondemand, oc);
- g_free (text);
-}
-
-static void
-create_ondemand_hooks (FolderBrowser *fb, BonoboUIHandler *uih)
-{
- gchar *system, *user;
-
- user = g_strdup_printf ("%s/filters.xml", evolution_dir);
- system = EVOLUTION_DATADIR "/evolution/filtertypes.xml";
- fb->filter_context = filter_context_new();
- gtk_object_set_data (GTK_OBJECT (fb), "uih", uih);
- rule_context_load ((RuleContext *) fb->filter_context, system, user,
- register_ondemand, fb);
- gtk_object_remove_data (GTK_OBJECT (fb), "uih");
- g_free (user);
-}
-
-static void
-remove_ondemand_hooks (FolderBrowser *fb, BonoboUIHandler *uih)
-{
- GSList *iter;
- struct fb_ondemand_closure *oc;
-
- for (iter = fb->filter_menu_paths; iter; iter = iter->next) {
- oc = (struct fb_ondemand_closure *) iter->data;
-
- bonobo_ui_handler_menu_remove (uih, oc->path);
- }
-}
-
-static void
-control_activate (BonoboControl *control, BonoboUIHandler *uih,
- FolderBrowser *fb)
-{
- Bonobo_UIHandler remote_uih;
- BonoboControl *toolbar_control;
- GnomeDockItemBehavior behavior;
- GtkWidget *toolbar, *toolbar_frame, *folder_browser;
- char *toolbar_name = g_strdup_printf ("/Toolbar%d", fb->serial);
-
- remote_uih = bonobo_control_get_remote_ui_handler (control);
- bonobo_ui_handler_set_container (uih, remote_uih);
- bonobo_object_release_unref (remote_uih, NULL);
-
- folder_browser = bonobo_control_get_widget (control);
-
- bonobo_ui_handler_menu_new_toggleitem (uih, "/View/Threaded",
- _("_Threaded Message List"),
- NULL, -1, 0, 0, NULL, NULL);
- bonobo_ui_handler_menu_set_toggle_state (uih, "/View/Threaded",
- mail_config_thread_list());
- bonobo_ui_handler_menu_set_callback (uih, "/View/Threaded",
- message_list_toggle_threads,
- FOLDER_BROWSER (folder_browser)->message_list,
- NULL);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/<Print Placeholder>/Print message...",
- _("_Print Message"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_PRINT,
- 0, 0, (void *) print_msg, folder_browser);
-
- bonobo_ui_handler_menu_new_separator (uih, "/File/<Print Placeholder>/separator1", -1);
-
- bonobo_ui_handler_menu_new_subtree (uih, "/<Component Placeholder>/Folder",
- _("F_older"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-
- bonobo_ui_handler_menu_new_item (uih, "/<Component Placeholder>/Folder/Mark all as Read",
- _("_Mark all as Read"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0, mark_all_seen, folder_browser);
-
- bonobo_ui_handler_menu_new_item (uih, "/<Component Placeholder>/Folder/Expunge",
- _("_Expunge"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_TRASH,
- 0, 0, expunge_folder, folder_browser);
-
- bonobo_ui_handler_menu_new_item (uih, "/<Component Placeholder>/Folder/Configure Folder",
- _("_Configure Folder"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE,
- 0,
- 0, 0, configure_folder, folder_browser);
-
- bonobo_ui_handler_menu_new_subtree (uih, "/<Component Placeholder>/Message",
- _("_Message"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-
- bonobo_ui_handler_menu_new_item (uih, "/<Component Placeholder>/Message/Edit",
- _("E_dit"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_MAIL,
- 0, 0, edit_message, folder_browser);
-
- bonobo_ui_handler_menu_new_item (uih, "/<Component Placeholder>/Message/View",
- _("_View"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_MAIL,
- 0, 0, view_message, folder_browser);
-
- bonobo_ui_handler_menu_new_item (uih, "/Settings/Mail Filters ...",
- _("Mail _Filters ..."),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE,
- 0,
- 0, 0, filter_edit, folder_browser);
-
- bonobo_ui_handler_menu_new_item (uih, "/Settings/vFolder Editor ...",
- _("_vFolder Editor ..."),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE,
- 0,
- 0, 0, vfolder_edit_vfolders, folder_browser);
-
- bonobo_ui_handler_menu_new_item (uih, "/Settings/Mail Configuration ...",
- _("_Mail Configuration ..."),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE,
- 0,
- 0, 0, (void *) mail_config, NULL);
-
- bonobo_ui_handler_menu_new_item (uih, "/Settings/Forget Passwords",
- _("Forget _Passwords"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE,
- 0,
- 0, 0, forget_passwords, NULL);
-
- create_ondemand_hooks (fb, uih);
-
- toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL,
- GTK_TOOLBAR_BOTH);
-
- gnome_app_fill_toolbar_with_data (GTK_TOOLBAR (toolbar),
- gnome_toolbar,
- NULL, folder_browser);
-
- gtk_widget_show_all (toolbar);
-
- behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE |
- GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL;
- if (!gnome_preferences_get_toolbar_detachable ())
- behavior |= GNOME_DOCK_ITEM_BEH_LOCKED;
-
- toolbar_frame = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (GTK_FRAME (toolbar_frame), GTK_SHADOW_OUT);
- gtk_container_add (GTK_CONTAINER (toolbar_frame), toolbar);
- gtk_widget_show (toolbar_frame);
-
- gtk_widget_show_all (toolbar_frame);
-
- toolbar_control = bonobo_control_new (toolbar_frame);
- bonobo_ui_handler_dock_add (uih, toolbar_name,
- bonobo_object_corba_objref (BONOBO_OBJECT (toolbar_control)),
- behavior,
- GNOME_DOCK_TOP,
- 1, 1, 0);
- g_free (toolbar_name);
-}
-
-static void
-control_deactivate (BonoboControl *control,
- BonoboUIHandler *uih,
- FolderBrowser *fb)
-{
- char *toolbar_name = g_strdup_printf ("/Toolbar%d", fb->serial);
-
- bonobo_ui_handler_menu_remove (uih, "/File/<Print Placeholder>/separator1");
- bonobo_ui_handler_menu_remove (uih, "/File/<Print Placeholder>/Print message...");
-
- bonobo_ui_handler_menu_remove (uih, "/View/Threaded");
-
- bonobo_ui_handler_menu_remove (uih, "/<Component Placeholder>/Folder");
- bonobo_ui_handler_menu_remove (uih, "/<Component Placeholder>/Folder/Mark all as Read");
- bonobo_ui_handler_menu_remove (uih, "/<Component Placeholder>/Folder/Expunge");
- bonobo_ui_handler_menu_remove (uih, "/<Component Placeholder>/Folder/Configure Folder");
-
- bonobo_ui_handler_menu_remove (uih, "/<Component Placeholder>/Message");
- bonobo_ui_handler_menu_remove (uih, "/<Component Placeholder>/Message/Edit");
- bonobo_ui_handler_menu_remove (uih, "/<Component Placeholder>/Message/View");
-
- bonobo_ui_handler_menu_remove (uih, "/Settings/Mail Filters ...");
- bonobo_ui_handler_menu_remove (uih, "/Settings/vFolder Editor ...");
- bonobo_ui_handler_menu_remove (uih, "/Settings/Mail Configuration ...");
- bonobo_ui_handler_menu_remove (uih, "/Settings/Forget Passwords");
-
- bonobo_ui_handler_dock_remove (uih, toolbar_name);
- g_free (toolbar_name);
-
- remove_ondemand_hooks (fb, uih);
-}
-
-static void
-control_activate_cb (BonoboControl *control,
- gboolean activate,
- gpointer user_data)
-{
- BonoboUIHandler *uih;
-
- uih = bonobo_control_get_ui_handler (control);
- g_assert (uih);
-
- if (activate)
- control_activate (control, uih, user_data);
- else
- control_deactivate (control, uih, user_data);
-}
-
-static void
-control_destroy_cb (BonoboControl *control,
- gpointer user_data)
-{
- GtkWidget *folder_browser = user_data;
-
- control_list = g_list_remove (control_list, control);
-
- gtk_object_destroy (GTK_OBJECT (folder_browser));
-}
-
-BonoboControl *
-folder_browser_factory_new_control (const char *uri)
-{
- BonoboControl *control;
- GtkWidget *folder_browser;
-
- folder_browser = folder_browser_new ();
- if (folder_browser == NULL)
- return NULL;
-
- if (!folder_browser_set_uri (FOLDER_BROWSER (folder_browser), uri)) {
- gtk_object_sink (GTK_OBJECT (folder_browser));
- return NULL;
- }
-
- gtk_widget_show (folder_browser);
-
- control = bonobo_control_new (folder_browser);
-
- if (control == NULL) {
- gtk_object_destroy (GTK_OBJECT (folder_browser));
- return NULL;
- }
-
- gtk_signal_connect (GTK_OBJECT (control), "activate",
- control_activate_cb, folder_browser);
-
- gtk_signal_connect (GTK_OBJECT (control), "destroy",
- control_destroy_cb, folder_browser);
-
- control_list = g_list_prepend (control_list, control);
-
- return control;
-}
-
-GList *
-folder_browser_factory_get_control_list (void)
-{
- return control_list;
-}
diff --git a/mail/folder-browser-factory.h b/mail/folder-browser-factory.h
deleted file mode 100644
index 7af5028ada..0000000000
--- a/mail/folder-browser-factory.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * folder-browser-factory.c: A Bonobo Control factory for Folder Browsers
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- *
- * (C) 2000 Helix Code, Inc.
- */
-
-#ifndef _FOLDER_BROWSER_FACTORY_H
-#define _FOLDER_BROWSER_FACTORY_H
-
-#include <bonobo.h>
-
-BonoboControl *folder_browser_factory_new_control (const char *uri);
-GList *folder_browser_factory_get_control_list (void);
-
-#endif /* _FOLDER_BROWSER_FACTORY_H */
diff --git a/mail/folder-browser.c b/mail/folder-browser.c
deleted file mode 100644
index 44da49e0e4..0000000000
--- a/mail/folder-browser.c
+++ /dev/null
@@ -1,451 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * folder-browser.c: Folder browser top level component
- *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- *
- * (C) 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <ctype.h>
-#include <gnome.h>
-#include "e-util/e-util.h"
-#include "e-util/e-sexp.h"
-#include "folder-browser.h"
-#include "mail.h"
-#include "mail-tools.h"
-#include "message-list.h"
-#include "mail-threads.h"
-#include "mail-ops.h"
-#include <widgets/e-paned/e-vpaned.h>
-
-#include "mail-vfolder.h"
-#include "filter/vfolder-rule.h"
-#include "filter/vfolder-context.h"
-#include "filter/filter-option.h"
-#include "filter/filter-input.h"
-
-#include "mail-local.h"
-#include "mail-config.h"
-
-#define PARENT_TYPE (gtk_table_get_type ())
-
-static void fb_resize_cb (GtkWidget *w, GtkAllocation *a);
-
-static GtkObjectClass *folder_browser_parent_class;
-
-static void oc_destroy (gpointer obj, gpointer user)
-{
- struct fb_ondemand_closure *oc = (struct fb_ondemand_closure *) obj;
-
- g_free (oc->path);
- g_free (oc);
-}
-
-static void
-folder_browser_destroy (GtkObject *object)
-{
- FolderBrowser *folder_browser = FOLDER_BROWSER (object);
-
- if (folder_browser->shell) {
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- Bonobo_Unknown_unref (folder_browser->shell, &ev);
- CORBA_exception_free (&ev);
- }
-
- if (folder_browser->uri)
- g_free (folder_browser->uri);
-
- if (folder_browser->folder) {
- mail_do_sync_folder (folder_browser->folder);
- camel_object_unref (CAMEL_OBJECT (folder_browser->folder));
- }
-
- if (folder_browser->message_list)
- bonobo_object_unref (BONOBO_OBJECT (folder_browser->message_list));
-
- if (folder_browser->mail_display)
- gtk_widget_destroy (GTK_WIDGET (folder_browser->mail_display));
-
- if (folder_browser->filter_context)
- gtk_object_unref (GTK_OBJECT (folder_browser->filter_context));
-
- if (folder_browser->filter_menu_paths) {
- g_slist_foreach (folder_browser->filter_menu_paths, oc_destroy, NULL);
- g_slist_free (folder_browser->filter_menu_paths);
- }
-
- folder_browser_parent_class->destroy (object);
-}
-
-static void
-folder_browser_class_init (GtkObjectClass *object_class)
-{
- object_class->destroy = folder_browser_destroy;
-
- folder_browser_parent_class = gtk_type_class (PARENT_TYPE);
-}
-
-/*
- * static gboolean
- * folder_browser_load_folder (FolderBrowser *fb, const char *name)
- * {
- * CamelFolder *new_folder;
- *
- * new_folder = mail_tool_uri_to_folder_noex (name);
- *
- * if (!new_folder)
- * return FALSE;
- *
- * if (fb->folder)
- * camel_object_unref (CAMEL_OBJECT (fb->folder));
- * fb->folder = new_folder;
- * message_list_set_folder (fb->message_list, new_folder);
- * return TRUE;
- * }
- */
-
-#define EQUAL(a,b) (strcmp (a,b) == 0)
-
-gboolean folder_browser_set_uri (FolderBrowser *folder_browser, const char *uri)
-{
- mail_do_load_folder (folder_browser, uri);
- return TRUE;
-}
-
-void
-folder_browser_set_message_preview (FolderBrowser *folder_browser, gboolean show_message_preview)
-{
- if (folder_browser->preview_shown == show_message_preview)
- return;
-
- g_warning ("FIXME: implement me");
-}
-
-static char * search_options[] = {
- "Body or subject contains",
- "Body contains",
- "Subject contains",
- "Body does not contain",
- "Subject does not contain",
- NULL
-};
-
-/* NOTE: If this is changed, then change the search_save() function to match! */
-/* %s is replaced by the whole search string in quotes ...
- possibly could split the search string into words as well ? */
-static char * search_string[] = {
- "(or (body-contains %s) (match-all (header-contains \"Subject\" %s)))",
- "(body-contains %s)",
- "(match-all (header-contains \"Subject\" %s)",
- "(match-all (not (body-contains %s)))",
- "(match-all (not (header-contains \"Subject\" %s)))"
-};
-
-static void
-search_set(FolderBrowser *fb)
-{
- GtkWidget *widget;
- GString *out;
- char *str;
- int index;
- char *text;
-
- text = gtk_entry_get_text((GtkEntry *)fb->search_entry);
-
- if (text == NULL || text[0] == 0) {
- mail_do_regenerate_messagelist (fb->message_list, NULL);
- return;
- }
-
- widget = gtk_menu_get_active (GTK_MENU(GTK_OPTION_MENU(fb->search_menu)->menu));
- index = (int)gtk_object_get_data((GtkObject *)widget, "search_option");
- if (index > sizeof(search_string)/sizeof(search_string[0]))
- index = 0;
- str = search_string[index];
-
- out = g_string_new("");
- while (*str) {
- if (str[0] == '%' && str[1]=='s') {
- str+=2;
- e_sexp_encode_string(out, text);
- } else {
- g_string_append_c(out, *str);
- str++;
- }
- }
- mail_do_regenerate_messagelist (fb->message_list, out->str);
- g_string_free(out, TRUE);
-}
-
-static void
-search_menu_deactivate(GtkWidget *menu, FolderBrowser *fb)
-{
- search_set(fb);
-}
-
-static GtkWidget *
-create_option_menu (char **menu_list, int item, void *data)
-{
- GtkWidget *omenu;
- GtkWidget *menu;
- int i = 0;
-
- omenu = gtk_option_menu_new ();
- menu = gtk_menu_new ();
- while (*menu_list){
- GtkWidget *entry;
-
- entry = gtk_menu_item_new_with_label (*menu_list);
- gtk_widget_show (entry);
- gtk_object_set_data((GtkObject *)entry, "search_option", (void *)i);
- gtk_menu_append (GTK_MENU (menu), entry);
- menu_list++;
- i++;
- }
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), item);
- gtk_widget_show (omenu);
-
- gtk_signal_connect (GTK_OBJECT (menu),
- "deactivate",
- GTK_SIGNAL_FUNC (search_menu_deactivate), data);
-
- return omenu;
-}
-
-static void
-search_activate(GtkEntry *entry, FolderBrowser *fb)
-{
- search_set(fb);
-}
-
-static void
-search_save(GtkWidget *w, FolderBrowser *fb)
-{
- GtkWidget *widget;
- int index;
- char *text;
- FilterElement *element;
- VfolderRule *rule;
- FilterPart *part;
-
- text = gtk_entry_get_text((GtkEntry *)fb->search_entry);
-
- if (text == NULL || text[0] == 0) {
- return;
- }
-
- widget = gtk_menu_get_active (GTK_MENU(GTK_OPTION_MENU(fb->search_menu)->menu));
- index = (int)gtk_object_get_data((GtkObject *)widget, "search_option");
- rule = vfolder_rule_new();
- ((FilterRule *)rule)->grouping = FILTER_GROUP_ANY;
- vfolder_rule_add_source(rule, fb->uri);
- filter_rule_set_name((FilterRule *)rule, text);
- switch(index) {
- default: /* header or body contains */
- index = 0;
- case 1: case 2:
- if (index == 0 || index == 1) { /* body-contains */
- part = vfolder_create_part("body");
- filter_rule_add_part((FilterRule *)rule, part);
- element = filter_part_find_element(part, "body-type");
- filter_option_set_current((FilterOption *)element, "contains");
- element = filter_part_find_element(part, "word");
- filter_input_set_value((FilterInput *)element, text);
- }
- if (index == 0 || index == 2) { /* subject contains */
- part = vfolder_create_part("subject");
- filter_rule_add_part((FilterRule *)rule, part);
- element = filter_part_find_element(part, "subject-type");
- filter_option_set_current((FilterOption *)element, "contains");
- element = filter_part_find_element(part, "subject");
- filter_input_set_value((FilterInput *)element, text);
- }
- break;
- case 3: /* not body contains */
- part = vfolder_create_part("body");
- filter_rule_add_part((FilterRule *)rule, part);
- element = filter_part_find_element(part, "body-type");
- filter_option_set_current((FilterOption *)element, "not contains");
- element = filter_part_find_element(part, "word");
- filter_input_set_value((FilterInput *)element, text);
- break;
- case 4: /* not header contains */
- part = vfolder_create_part("subject");
- filter_rule_add_part((FilterRule *)rule, part);
- element = filter_part_find_element(part, "subject-type");
- filter_option_set_current((FilterOption *)element, "not contains");
- element = filter_part_find_element(part, "subject");
- filter_input_set_value((FilterInput *)element, text);
- break;
- }
-
- vfolder_gui_add_rule(rule);
-}
-
-void
-folder_browser_clear_search (FolderBrowser *fb)
-{
- gtk_entry_set_text (GTK_ENTRY (fb->search_entry), "");
- gtk_option_menu_set_history (GTK_OPTION_MENU (fb->search_menu), 0);
- mail_do_regenerate_messagelist (fb->message_list, NULL);
-}
-
-static int
-etable_key (ETable *table, int row, int col, GdkEvent *ev, FolderBrowser *fb)
-{
- if ((ev->key.state & !(GDK_SHIFT_MASK | GDK_LOCK_MASK)) != 0)
- return FALSE;
-
- if (ev->key.keyval == GDK_space || ev->key.keyval == GDK_BackSpace) {
- GtkAdjustment *vadj;
- gfloat page_size;
-
- vadj = e_scroll_frame_get_vadjustment (fb->mail_display->scroll);
- page_size = vadj->page_size - vadj->step_increment;
-
- if (ev->key.keyval == GDK_BackSpace) {
- if (vadj->value > vadj->lower + page_size)
- vadj->value -= page_size;
- else
- vadj->value = vadj->lower;
- } else {
- if (vadj->value < vadj->upper - vadj->page_size - page_size)
- vadj->value += page_size;
- else
- vadj->value = vadj->upper - vadj->page_size;
- }
-
- gtk_adjustment_value_changed (vadj);
- return TRUE;
- } else if (ev->key.keyval == GDK_Delete ||
- ev->key.keyval == GDK_KP_Delete) {
- delete_msg (NULL, fb);
- message_list_select (fb->message_list, row,
- MESSAGE_LIST_SELECT_NEXT,
- 0, CAMEL_MESSAGE_DELETED);
- return TRUE;
- } else if (ev->key.keyval == 'n' || ev->key.keyval == 'N' ||
- ev->key.keyval == 'p' || ev->key.keyval == 'P') {
- message_list_select (fb->message_list, row,
- tolower (ev->key.keyval) == 'p' ?
- MESSAGE_LIST_SELECT_PREVIOUS :
- MESSAGE_LIST_SELECT_NEXT,
- 0, CAMEL_MESSAGE_SEEN);
- }
-
- return FALSE;
-}
-
-static void
-folder_browser_gui_init (FolderBrowser *fb)
-{
- GtkWidget *hbox, *label;
- GtkButton *button;
-
- /*
- * The panned container
- */
- fb->vpaned = e_vpaned_new ();
- gtk_widget_show (fb->vpaned);
-
- gtk_table_attach (
- GTK_TABLE (fb), fb->vpaned,
- 0, 1, 1, 3,
- GTK_FILL | GTK_EXPAND,
- GTK_FILL | GTK_EXPAND,
- 0, 0);
-
- /* quick-search entry */
- hbox = gtk_hbox_new(FALSE, 3);
- gtk_widget_show(hbox);
- fb->search_entry = gtk_entry_new();
- gtk_widget_show(fb->search_entry);
- gtk_signal_connect(GTK_OBJECT (fb->search_entry), "activate", search_activate, fb);
- /* gtk_signal_connect(fb->search_entry, "changed", search_activate, fb); */
- label = gtk_label_new(_("Search"));
- gtk_widget_show(label);
- fb->search_menu = create_option_menu(search_options, 0, fb);
- button = (GtkButton *)gtk_button_new_with_label(_("Save"));
- gtk_widget_show((GtkWidget *)button);
- gtk_signal_connect((GtkObject *)button, "clicked", search_save, fb);
- gtk_box_pack_end((GtkBox *)hbox, (GtkWidget *)button, FALSE, FALSE, 3);
- gtk_box_pack_end((GtkBox *)hbox, fb->search_entry, FALSE, FALSE, 3);
- gtk_box_pack_end((GtkBox *)hbox, fb->search_menu, FALSE, FALSE, 3);
- gtk_box_pack_end((GtkBox *)hbox, label, FALSE, FALSE, 3);
- gtk_table_attach (
- GTK_TABLE (fb), hbox,
- 0, 1, 0, 1,
- GTK_FILL | GTK_EXPAND,
- 0,
- 0, 0);
-
- fb->message_list_w = message_list_get_widget (fb->message_list);
- e_paned_add1 (E_PANED (fb->vpaned), fb->message_list_w);
- gtk_widget_show (fb->message_list_w);
-
- /* (jwise) <-- for searching purposes :) */
- gtk_signal_connect (GTK_OBJECT (fb->message_list_w), "size_allocate",
- GTK_SIGNAL_FUNC (fb_resize_cb), NULL);
-
- e_paned_add2 (E_PANED (fb->vpaned), GTK_WIDGET (fb->mail_display));
- e_paned_set_position (E_PANED (fb->vpaned), mail_config_paned_size());
- gtk_widget_show (GTK_WIDGET (fb->mail_display));
- gtk_widget_show (GTK_WIDGET (fb));
-}
-
-static void
-folder_browser_init (GtkObject *object)
-{
-}
-
-static void
-my_folder_browser_init (GtkObject *object)
-{
- FolderBrowser *fb = FOLDER_BROWSER (object);
-
- /*
- * Setup parent class fields.
- */
- GTK_TABLE (fb)->homogeneous = FALSE;
- gtk_table_resize (GTK_TABLE (fb), 1, 2);
-
- /*
- * Our instance data
- */
- fb->message_list = MESSAGE_LIST (message_list_new (fb));
- fb->mail_display = MAIL_DISPLAY (mail_display_new ());
-
- gtk_signal_connect (GTK_OBJECT (fb->message_list->etable),
- "key_press", GTK_SIGNAL_FUNC (etable_key), fb);
-
- fb->filter_menu_paths = NULL;
- fb->filter_context = NULL;
-
- folder_browser_gui_init (fb);
-}
-
-GtkWidget *
-folder_browser_new (void)
-{
- static int serial;
- FolderBrowser *folder_browser = gtk_type_new (folder_browser_get_type ());
-
- my_folder_browser_init (GTK_OBJECT (folder_browser));
- folder_browser->uri = NULL;
- folder_browser->serial = serial++;
-
- return GTK_WIDGET (folder_browser);
-}
-
-
-E_MAKE_TYPE (folder_browser, "FolderBrowser", FolderBrowser, folder_browser_class_init, folder_browser_init, PARENT_TYPE);
-
-static void fb_resize_cb (GtkWidget *w, GtkAllocation *a)
-{
- mail_config_set_paned_size (a->height + 90);
-}
diff --git a/mail/folder-browser.h b/mail/folder-browser.h
deleted file mode 100644
index 86c1c6f149..0000000000
--- a/mail/folder-browser.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-
-#ifndef _FOLDER_BROWSER_H_
-#define _FOLDER_BROWSER_H_
-
-#include "mail-types.h"
-#include <gtk/gtktable.h>
-#include "camel/camel-stream.h"
-#include <bonobo/bonobo-property-bag.h>
-#include "filter/filter-rule.h"
-#include "filter/filter-context.h" /*eek*/
-#include "message-list.h"
-#include "mail-display.h"
-#include "shell/Evolution.h"
-
-
-#define FOLDER_BROWSER_TYPE (folder_browser_get_type ())
-#define FOLDER_BROWSER(o) (GTK_CHECK_CAST ((o), FOLDER_BROWSER_TYPE, FolderBrowser))
-#define FOLDER_BROWSER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), FOLDER_BROWSER_TYPE, FolderBrowserClass))
-#define IS_FOLDER_BROWSER(o) (GTK_CHECK_TYPE ((o), FOLDER_BROWSER_TYPE))
-#define IS_FOLDER_BROWSER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), FOLDER_BROWSER_TYPE))
-
-struct _FolderBrowser {
- GtkTable parent;
-
- BonoboPropertyBag *properties;
-
- Evolution_Shell shell;
-
- /* This is a kludge for the toolbar problem. */
- int serial;
-
- /*
- * The current URI being displayed by the FolderBrowser
- */
- char *uri;
- CamelFolder *folder;
-
- MessageList *message_list;
- GtkWidget *message_list_w;
- MailDisplay *mail_display;
- GtkWidget *vpaned;
- GtkWidget *search_menu;
- GtkWidget *search_entry;
-
- gboolean preview_shown;
-
- /* Stuff to allow on-demand filtering */
- GSList *filter_menu_paths;
- FilterContext *filter_context;
-};
-
-
-typedef struct {
- GtkTableClass parent_class;
-} FolderBrowserClass;
-
-struct fb_ondemand_closure {
- FilterRule *rule;
- FolderBrowser *fb;
- gchar *path;
-};
-
-GtkType folder_browser_get_type (void);
-GtkWidget *folder_browser_new (void);
-gboolean folder_browser_set_uri (FolderBrowser *folder_browser,
- const char *uri);
-void folder_browser_set_message_preview (FolderBrowser *folder_browser,
- gboolean show_message_preview);
-void folder_browser_clear_search (FolderBrowser *fb);
-
-#endif /* _FOLDER_BROWSER_H_ */
diff --git a/mail/local-config.glade b/mail/local-config.glade
deleted file mode 100644
index 8f3a1a4cda..0000000000
--- a/mail/local-config.glade
+++ /dev/null
@@ -1,220 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Mail</name>
- <program_name>mail</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog_format</name>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>apply_format</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>cancel_format</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame_format</name>
- <label>Mailbox Format</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table1</name>
- <border_width>2</border_width>
- <rows>2</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>2</column_spacing>
-
- <widget>
- <class>GtkLabel</class>
- <name>label2</name>
- <label>New store format:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label1</name>
- <label>Current store format:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label_format</name>
- <label>mbox</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>7.45058e-09</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkOptionMenu</class>
- <name>option_format</name>
- <can_focus>True</can_focus>
- <items>mh
-mbox
-</items>
- <initial_choice>0</initial_choice>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label4</name>
- <label>Note: When converting between mailbox formats, a failure
-(such as lack of disk space) may not be automatically
-recoverable. Please use this feature with care.</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/mail/mail-autofilter.c b/mail/mail-autofilter.c
deleted file mode 100644
index 2de013a448..0000000000
--- a/mail/mail-autofilter.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- code for autogenerating rules or filters from a message
-*/
-
-#include <ctype.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <bonobo.h>
-
-#include <libgnomeui/gnome-app-helper.h>
-#include <libgnomeui/gnome-popup-menu.h>
-
-#include "Evolution.h"
-#include "evolution-storage.h"
-
-#include "evolution-shell-component.h"
-#include "folder-browser.h"
-#include "mail-vfolder.h"
-#include "mail-autofilter.h"
-
-#include "camel/camel.h"
-
-#include "filter/vfolder-context.h"
-#include "filter/vfolder-rule.h"
-#include "filter/vfolder-editor.h"
-
-#include "filter/filter-context.h"
-#include "filter/filter-filter.h"
-#include "filter/filter-editor.h"
-#include "filter/filter-option.h"
-
-static void
-rule_match_recipients(RuleContext *context, FilterRule *rule, CamelInternetAddress *iaddr)
-{
- FilterPart *part;
- FilterElement *element;
- int i;
- const char *real, *addr;
- char *namestr;
-
- /* address types etc should handle multiple values */
- for (i=0;camel_internet_address_get(iaddr, i, &real, &addr);i++) {
- part = rule_context_create_part(context, "to");
- filter_rule_add_part((FilterRule *)rule, part);
- element = filter_part_find_element(part, "recipient-type");
- filter_option_set_current((FilterOption *)element, "contains");
- element = filter_part_find_element(part, "recipient");
- filter_input_set_value((FilterInput *)element, addr);
-
- namestr = g_strdup_printf("Mail to %s", real&&real[0]?real:addr);
- filter_rule_set_name(rule, namestr);
- g_free(namestr);
- }
-}
-
-
-/* remove 're' part of a subject */
-static const char *
-strip_re(const char *s)
-{
- const char *p;
-
- while (*s) {
- while (isspace(*s))
- s++;
- if (s[0] == 0)
- break;
- if ((s[0] == 'r' || s[0]=='R')
- && (s[1] == 'e' || s[1]=='E')) {
- p = s+2;
- while (isdigit(*p) || (ispunct(*p) && (*p != ':')))
- p++;
- if (*p==':') {
- s = p+1;
- } else
- break;
- } else
- break;
- }
- return s;
-}
-
-#if 0
-int
-reg_match(char *str, char *regstr)
-{
- regex_t reg;
- int error;
- int ret;
-
- error = regcomp(&reg, regstr, REG_EXTENDED|REG_ICASE|REG_NOSUB);
- if (error != 0) {
- return 0;
- }
- error = regexec(&reg, str, 0, NULL, 0);
- regfree(&reg);
- return (error == 0);
-}
-#endif
-
-static void
-rule_add_subject(RuleContext *context, FilterRule *rule, const char *text)
-{
- FilterPart *part;
- FilterElement *element;
-
- /* dont match on empty strings ever */
- if (*text == 0)
- return;
- part = rule_context_create_part(context, "subject");
- filter_rule_add_part((FilterRule *)rule, part);
- element = filter_part_find_element(part, "subject-type");
- filter_option_set_current((FilterOption *)element, "contains");
- element = filter_part_find_element(part, "subject");
- filter_input_set_value((FilterInput *)element, text);
-}
-
-static void
-rule_add_sender(RuleContext *context, FilterRule *rule, const char *text)
-{
- FilterPart *part;
- FilterElement *element;
-
- /* dont match on empty strings ever */
- if (*text == 0)
- return;
- part = rule_context_create_part(context, "sender");
- filter_rule_add_part((FilterRule *)rule, part);
- element = filter_part_find_element(part, "sender-type");
- filter_option_set_current((FilterOption *)element, "contains");
- element = filter_part_find_element(part, "sender");
- filter_input_set_value((FilterInput *)element, text);
-}
-
-/* do a bunch of things on the subject to try and detect mailing lists, remove
- unneeded stuff, etc */
-static void
-rule_match_subject(RuleContext *context, FilterRule *rule, const char *subject)
-{
- const char *s;
- const char *s1, *s2;
- char *tmp;
-
- s = strip_re(subject);
- /* dont match on empty subject */
- if (*s == 0)
- return;
-
- /* [blahblah] is probably a mailing list, match on it separately */
- s1 = strchr(s, '[');
- s2 = strchr(s, ']');
- if (s1 && s2 && s1<s2) {
- /* probably a mailing list, match on the mailing list name */
- tmp = alloca(s2-s1+2);
- memcpy(tmp, s1, s2-s1+1);
- tmp[s2-s1+1] = 0;
- g_strstrip(tmp);
- rule_add_subject(context, rule, tmp);
- s = s2+1;
- }
- /* Froblah: at the start is probably something important (e.g. bug number) */
- s1 = strchr(s, ':');
- if (s1) {
- tmp = alloca(s1-s+1);
- memcpy(tmp, s, s1-s);
- tmp[s1-s] = 0;
- g_strstrip(tmp);
- rule_add_subject(context, rule, tmp);
- s = s1+1;
- }
-
- /* just lump the rest together */
- tmp = alloca(strlen(s)+1);
- strcpy(tmp, s);
- g_strstrip(tmp);
- rule_add_subject(context, rule, tmp);
-}
-
-static void
-rule_from_message(FilterRule *rule, RuleContext *context, CamelMimeMessage *msg, int flags)
-{
- CamelInternetAddress *addr;
-
- rule->grouping = FILTER_GROUP_ANY;
-
- if (flags & AUTO_SUBJECT) {
- rule_match_subject(context, rule, msg->subject);
- filter_rule_set_name(rule, strip_re(msg->subject));
- }
- /* should parse the from address into an internet address? */
- if (flags & AUTO_FROM) {
- struct _header_address *haddr, *scan;
- char *name, *namestr;
-
- haddr = header_address_decode(msg->from);
- scan = haddr;
- while (scan) {
- if (scan->type == HEADER_ADDRESS_NAME) {
- rule_add_sender(context, rule, scan->v.addr);
- if (scan->name)
- name = scan->name;
- else
- name = scan->v.addr;
- namestr = g_strdup_printf("Mail from %s", name);
- filter_rule_set_name(rule, namestr);
- g_free(namestr);
- }
- scan = scan->next;
- }
- header_address_unref(haddr);
- }
- if (flags & AUTO_TO) {
- addr = (CamelInternetAddress *)camel_mime_message_get_recipients(msg, CAMEL_RECIPIENT_TYPE_TO);
- rule_match_recipients(context, rule, addr);
- addr = (CamelInternetAddress *)camel_mime_message_get_recipients(msg, CAMEL_RECIPIENT_TYPE_CC);
- rule_match_recipients(context, rule, addr);
- }
-}
-
-FilterRule *
-vfolder_rule_from_message(VfolderContext *context, CamelMimeMessage *msg, int flags, const char *source)
-{
- VfolderRule *rule;
-
- rule = vfolder_rule_new();
- vfolder_rule_add_source(rule, source);
- rule_from_message((FilterRule *)rule, (RuleContext *)context, msg, flags);
-
- return (FilterRule *)rule;
-}
-
-FilterRule *
-filter_rule_from_message(FilterContext *context, CamelMimeMessage *msg, int flags)
-{
- FilterFilter *rule;
-
- rule = filter_filter_new();
- rule_from_message((FilterRule *)rule, (RuleContext *)context, msg, flags);
-
- /* should we define the default action? */
-
- return (FilterRule *)rule;
-}
-
-void
-filter_gui_add_from_message(CamelMimeMessage *msg, int flags)
-{
- FilterContext *fc;
- char *userrules, *systemrules;
- FilterRule *rule;
- extern char *evolution_dir;
-
- fc = filter_context_new();
- userrules = g_strdup_printf("%s/filters.xml", evolution_dir);
- systemrules = g_strdup_printf("%s/evolution/filtertypes.xml", EVOLUTION_DATADIR);
- rule_context_load((RuleContext *)fc, systemrules, userrules, NULL, NULL);
- rule = filter_rule_from_message(fc, msg, flags);
- rule_context_add_rule_gui((RuleContext *)fc, rule, "Add Filter Rule", userrules);
- g_free (userrules);
- g_free (systemrules);
- gtk_object_unref((GtkObject *)fc);
-}
-
diff --git a/mail/mail-autofilter.h b/mail/mail-autofilter.h
deleted file mode 100644
index 61df9273fd..0000000000
--- a/mail/mail-autofilter.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef _MAIL_AUTOFILTER_H
-#define _MAIL_AUTOFILTER_H
-
-#include "filter/filter-rule.h"
-#include "filter/filter-context.h"
-#include "filter/vfolder-context.h"
-#include "camel/camel-mime-message.h"
-
-enum {
- AUTO_SUBJECT = 1,
- AUTO_FROM = 2,
- AUTO_TO = 4
-};
-
-FilterRule *vfolder_rule_from_message(VfolderContext *context, CamelMimeMessage *msg, int flags, const char *source);
-FilterRule *filter_rule_from_message(FilterContext *context, CamelMimeMessage *msg, int flags);
-
-/* easiest place to put this */
-void filter_gui_add_from_message(CamelMimeMessage *msg, int flags);
-
-#endif
diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c
deleted file mode 100644
index 33b44c1c6c..0000000000
--- a/mail/mail-callbacks.c
+++ /dev/null
@@ -1,654 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* mail-ops.c: callbacks for the mail toolbar/menus */
-
-/*
- * Author :
- * Dan Winship <danw@helixcode.com>
- * Peter Williams <peterw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include <errno.h>
-#include <gnome.h>
-#include <libgnomeprint/gnome-print-master.h>
-#include <libgnomeprint/gnome-print-master-preview.h>
-#include "mail.h"
-#include "mail-config.h"
-#include "mail-threads.h"
-#include "mail-tools.h"
-#include "mail-ops.h"
-#include "mail-local.h"
-#include "folder-browser.h"
-#include "filter/filter-editor.h"
-#include "filter/filter-driver.h"
-#include "widgets/e-table/e-table.h"
-
-/* FIXME: is there another way to do this? */
-#include "Evolution.h"
-#include "evolution-storage.h"
-
-#include "evolution-shell-client.h"
-
-#ifndef HAVE_MKSTEMP
-#include <fcntl.h>
-#include <sys/stat.h>
-#endif
-
-struct post_send_data {
- CamelFolder *folder;
- gchar *uid;
- guint32 flags;
-};
-
-static gboolean
-check_configured (void)
-{
- if (mail_config_is_configured ())
- return TRUE;
-
- mail_config_druid ();
-
- return mail_config_is_configured ();
-}
-
-static void
-main_select_first_unread (CamelObject *object, gpointer event_data, gpointer data)
-{
- FolderBrowser *fb = FOLDER_BROWSER (data);
- /*ETable *table = E_TABLE_SCROLLED (fb->message_list->etable)->table;*/
-
- message_list_select (fb->message_list, -1, MESSAGE_LIST_SELECT_NEXT,
- 0, CAMEL_MESSAGE_SEEN);
-}
-
-static void
-select_first_unread (CamelObject *object, gpointer event_data, gpointer data)
-{
- mail_op_forward_event (main_select_first_unread, object, event_data, data);
-}
-
-void
-fetch_mail (GtkWidget *button, gpointer user_data)
-{
- GSList *sources;
-
- if (!check_configured ()) {
- GtkWidget *win = gtk_widget_get_ancestor (GTK_WIDGET (user_data),
- GTK_TYPE_WINDOW);
-
- gnome_error_dialog_parented ("You have no mail sources "
- "configured", GTK_WINDOW (win));
- return;
- }
-
- sources = mail_config_get_sources ();
-
- if (!sources || !sources->data) {
- GtkWidget *win = gtk_widget_get_ancestor (GTK_WIDGET (user_data),
- GTK_TYPE_WINDOW);
-
- gnome_error_dialog_parented ("You have no mail sources "
- "configured", GTK_WINDOW (win));
- return;
- }
-
- while (sources) {
- MailConfigService *source;
-
- source = (MailConfigService *) sources->data;
- sources = sources->next;
-
- if (!source || !source->url) {
- g_warning ("Bad source in fetch_mail??");
- continue;
- }
-
- mail_do_fetch_mail (source->url, source->keep_on_server,
- NULL, select_first_unread, user_data);
- }
-}
-
-static gboolean
-ask_confirm_for_empty_subject (EMsgComposer *composer)
-{
- GtkWidget *message_box;
- int button;
-
- message_box = gnome_message_box_new (_("This message has no subject.\nReally send?"),
- GNOME_MESSAGE_BOX_QUESTION,
- GNOME_STOCK_BUTTON_YES, GNOME_STOCK_BUTTON_NO,
- NULL);
-
- GDK_THREADS_ENTER ();
- button = gnome_dialog_run_and_close (GNOME_DIALOG (message_box));
- GDK_THREADS_LEAVE ();
-
- if (button == 0)
- return TRUE;
- else
- return FALSE;
-}
-
-void
-composer_send_cb (EMsgComposer *composer, gpointer data)
-{
- gchar *from = NULL;
- const MailConfigIdentity *id = NULL;
- MailConfigService *xport = NULL;
- CamelMimeMessage *message;
- const char *subject;
-
- struct post_send_data *psd = data;
-
- /* Check for an identity */
-
- id = mail_config_get_default_identity ();
- if (!check_configured () || !id) {
- GtkWidget *message;
-
- message = gnome_warning_dialog_parented (_("You need to configure an identity\n"
- "before you can send mail."),
- GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (composer),
- GTK_TYPE_WINDOW)));
- GDK_THREADS_ENTER ();
- gnome_dialog_run_and_close (GNOME_DIALOG (message));
- GDK_THREADS_LEAVE ();
- return;
- }
-
- /* Check for a transport */
-
- xport = mail_config_get_transport ();
- if (!xport || !xport->url) {
- GtkWidget *message;
-
- message = gnome_warning_dialog_parented (_("You need to configure a mail transport\n"
- "before you can send mail."),
- GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (composer),
- GTK_TYPE_WINDOW)));
- GDK_THREADS_ENTER ();
- gnome_dialog_run_and_close (GNOME_DIALOG (message));
- GDK_THREADS_LEAVE ();
- return;
- }
-
- /* Generate our from address */
-
- from = g_strdup (e_msg_composer_hdrs_get_from (E_MSG_COMPOSER_HDRS (composer->hdrs)));
- if (!from) {
- CamelInternetAddress *ciaddr;
-
- ciaddr = camel_internet_address_new ();
- camel_internet_address_add (ciaddr, id->name, id->address);
- from = camel_address_encode (CAMEL_ADDRESS (ciaddr));
- camel_object_unref (CAMEL_OBJECT (ciaddr));
- }
-
- /* Get the message */
-
- message = e_msg_composer_get_message (composer);
-
- /* Check for no subject */
-
- subject = camel_mime_message_get_subject (message);
- if (subject == NULL || subject[0] == '\0') {
- if (! ask_confirm_for_empty_subject (composer)) {
- camel_object_unref (CAMEL_OBJECT (message));
- return;
- }
- }
-
- if (psd) {
- mail_do_send_mail (xport->url, message, from,
- psd->folder, psd->uid, psd->flags,
- GTK_WIDGET (composer));
- g_free (psd->uid);
- } else {
- mail_do_send_mail (xport->url, message, from,
- NULL, NULL, 0,
- GTK_WIDGET (composer));
- }
-}
-
-static void
-free_psd (GtkWidget *composer, gpointer user_data)
-{
- struct post_send_data *psd = user_data;
-
- camel_object_unref (CAMEL_OBJECT (psd->folder));
- g_free (psd);
-}
-
-
-static GtkWidget *
-create_msg_composer (const char *url)
-{
- MailConfigIdentity *id;
- gboolean send_html;
- gchar *sig_file = NULL;
- GtkWidget *composer_widget;
-
- id = mail_config_get_default_identity ();
- send_html = mail_config_send_html ();
-
- if (id)
- sig_file = id->sig;
-
- if (url != NULL)
- composer_widget = e_msg_composer_new_from_url (url);
- else
- composer_widget = e_msg_composer_new_with_sig_file (sig_file);
-
- e_msg_composer_set_send_html (E_MSG_COMPOSER (composer_widget),
- send_html);
-
- return composer_widget;
-}
-
-void
-compose_msg (GtkWidget *widget, gpointer user_data)
-{
- GtkWidget *composer;
-
- if (!check_configured ())
- return;
-
- composer = create_msg_composer (NULL);
-
- gtk_signal_connect (GTK_OBJECT (composer), "send",
- GTK_SIGNAL_FUNC (composer_send_cb), NULL);
- gtk_widget_show (composer);
-}
-
-/* Send according to a mailto (RFC 2368) URL. */
-void
-send_to_url (const char *url)
-{
- GtkWidget *composer;
-
- if (!check_configured ())
- return;
-
- composer = create_msg_composer (url);
-
- gtk_signal_connect (GTK_OBJECT (composer), "send",
- GTK_SIGNAL_FUNC (composer_send_cb), NULL);
- gtk_widget_show (composer);
-}
-
-void
-mail_reply (CamelFolder *folder, CamelMimeMessage *msg, const char *uid, gboolean to_all)
-{
- EMsgComposer *composer;
- struct post_send_data *psd;
-
- if (!check_configured () || !folder ||
- !msg || !uid)
- return;
-
- psd = g_new (struct post_send_data, 1);
- psd->folder = folder;
- camel_object_ref (CAMEL_OBJECT (psd->folder));
- psd->uid = g_strdup (uid);
- psd->flags = CAMEL_MESSAGE_ANSWERED;
-
- composer = mail_generate_reply (msg, to_all);
-
- gtk_signal_connect (GTK_OBJECT (composer), "send",
- GTK_SIGNAL_FUNC (composer_send_cb), psd);
- gtk_signal_connect (GTK_OBJECT (composer), "destroy",
- GTK_SIGNAL_FUNC (free_psd), psd);
-
- gtk_widget_show (GTK_WIDGET (composer));
-}
-
-void
-reply_to_sender (GtkWidget *widget, gpointer user_data)
-{
- FolderBrowser *fb = FOLDER_BROWSER (user_data);
-
- mail_reply (fb->folder, fb->mail_display->current_message,
- fb->message_list->cursor_uid, FALSE);
-}
-
-void
-reply_to_all (GtkWidget *widget, gpointer user_data)
-{
- FolderBrowser *fb = FOLDER_BROWSER (user_data);
-
- mail_reply (fb->folder, fb->mail_display->current_message,
- fb->message_list->cursor_uid, TRUE);
-}
-
-static void
-enumerate_msg (MessageList *ml, const char *uid, gpointer data)
-{
- g_ptr_array_add ((GPtrArray *) data, g_strdup (uid));
-}
-
-
-void
-forward_msg (GtkWidget *widget, gpointer user_data)
-{
- FolderBrowser *fb = FOLDER_BROWSER (user_data);
- EMsgComposer *composer;
- CamelMimeMessage *cursor_msg;
- GPtrArray *uids;
-
- cursor_msg = fb->mail_display->current_message;
- if (!check_configured () || !cursor_msg)
- return;
-
- composer = E_MSG_COMPOSER (e_msg_composer_new ());
-
- uids = g_ptr_array_new();
- message_list_foreach (fb->message_list, enumerate_msg, uids);
-
- gtk_signal_connect (GTK_OBJECT (composer), "send",
- GTK_SIGNAL_FUNC (composer_send_cb), NULL);
-
- mail_do_forward_message (cursor_msg,
- fb->message_list->folder,
- uids,
- composer);
-}
-
-static void
-transfer_msg (GtkWidget *widget, gpointer user_data, gboolean delete_from_source)
-{
- FolderBrowser *fb = user_data;
- MessageList *ml = fb->message_list;
- GPtrArray *uids;
- char *uri, *physical, *path;
- char *desc;
- const char *allowed_types[] = { "mail", NULL };
- extern EvolutionShellClient *global_shell_client;
- static char *last = NULL;
-
- if (last == NULL)
- last = g_strdup ("");
-
- if (delete_from_source)
- desc = _("Move message(s) to");
- else
- desc = _("Copy message(s) to");
-
- evolution_shell_client_user_select_folder (global_shell_client,
- desc,
- last, allowed_types, &uri, &physical);
- if (!uri)
- return;
-
- path = strchr (uri, '/');
- if (path && strcmp (last, path) != 0) {
- g_free (last);
- last = g_strdup (path);
- }
- g_free (uri);
-
- uids = g_ptr_array_new ();
- message_list_foreach (ml, enumerate_msg, uids);
- mail_do_transfer_messages (ml->folder, uids, delete_from_source, physical);
-}
-
-void
-move_msg (GtkWidget *widget, gpointer user_data)
-{
- transfer_msg (widget, user_data, TRUE);
-}
-
-void
-copy_msg (GtkWidget *widget, gpointer user_data)
-{
- transfer_msg (widget, user_data, FALSE);
-}
-
-void
-mark_all_seen (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- FolderBrowser *fb = FOLDER_BROWSER(user_data);
- MessageList *ml = fb->message_list;
- GPtrArray *uids;
-
- if (ml->folder == NULL)
- return;
-
- uids = camel_folder_get_uids (ml->folder);
- mail_do_flag_messages (ml->folder, uids, FALSE,
- CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
-}
-
-void
-edit_msg (GtkWidget *widget, gpointer user_data)
-{
- FolderBrowser *fb = FOLDER_BROWSER (user_data);
- GPtrArray *uids;
- extern CamelFolder *drafts_folder;
-
- if (fb->folder != drafts_folder) {
- GtkWidget *message;
-
- message = gnome_warning_dialog (_("You may only edit messages saved\n"
- "in the Drafts folder."));
- GDK_THREADS_ENTER ();
- gnome_dialog_run_and_close (GNOME_DIALOG (message));
- GDK_THREADS_LEAVE ();
- return;
- }
-
- uids = g_ptr_array_new();
- message_list_foreach (fb->message_list, enumerate_msg, uids);
- mail_do_edit_messages (fb->folder, uids, (GtkSignalFunc) composer_send_cb);
-}
-
-void
-delete_msg (GtkWidget *button, gpointer user_data)
-{
- FolderBrowser *fb = user_data;
- MessageList *ml = fb->message_list;
- GPtrArray *uids;
-
- uids = g_ptr_array_new ();
- message_list_foreach (ml, enumerate_msg, uids);
- if (uids->len == 1) {
- guint32 flags;
- char *uid = uids->pdata[0];
-
- mail_tool_camel_lock_up ();
- flags = camel_folder_get_message_flags (ml->folder, uid);
- camel_folder_set_message_flags (ml->folder, uid,
- CAMEL_MESSAGE_DELETED,
- ~flags);
- mail_tool_camel_lock_down ();
- } else {
- mail_do_flag_messages (ml->folder, uids, TRUE,
- CAMEL_MESSAGE_DELETED,
- CAMEL_MESSAGE_DELETED);
- }
-}
-
-void
-expunge_folder (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- FolderBrowser *fb = FOLDER_BROWSER(user_data);
-
- e_table_model_pre_change (fb->message_list->table_model);
-
- if (fb->message_list->folder)
- mail_do_expunge_folder (fb->message_list->folder);
-}
-
-static void
-filter_druid_clicked (GtkWidget *w, int button, FolderBrowser *fb)
-{
- FilterContext *fc;
-
- if (button == 0) {
- char *user;
-
- fc = gtk_object_get_data (GTK_OBJECT (w), "context");
- user = g_strdup_printf ("%s/filters.xml", evolution_dir);
- rule_context_save ((RuleContext *)fc, user);
- g_free (user);
- }
-
- if (button != -1) {
- gnome_dialog_close (GNOME_DIALOG (w));
- }
-}
-
-void
-filter_edit (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- FolderBrowser *fb = FOLDER_BROWSER (user_data);
- FilterContext *fc;
- char *user, *system;
- GtkWidget *w;
-
- fc = filter_context_new();
- user = g_strdup_printf ("%s/filters.xml", evolution_dir);
- system = g_strdup_printf ("%s/evolution/filtertypes.xml", EVOLUTION_DATADIR);
- rule_context_load ((RuleContext *)fc, system, user, NULL, NULL);
- g_free (user);
- g_free (system);
-
- if (((RuleContext *)fc)->error) {
- GtkWidget *dialog;
- gchar *err;
-
- err = g_strdup_printf (_("Error loading filter information:\n"
- "%s"), ((RuleContext *)fc)->error);
- dialog = gnome_warning_dialog (err);
- g_free (err);
-
- /* These are necessary because gtk_main, called by
- * g_d_r_a_c, does a LEAVE/ENTER pair when running
- * a main loop recursively. I don't know why the threads
- * lock isn't being held at this point, as we're in a
- * callback, but I don't ask questions. It works, and
- * threads are enabled so we know that it works.
- */
- GDK_THREADS_ENTER();
- gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
- GDK_THREADS_LEAVE();
- return;
- }
-
- w = filter_editor_construct (fc);
- gtk_object_set_data_full (GTK_OBJECT (w), "context", fc, (GtkDestroyNotify)gtk_object_unref);
- gtk_signal_connect (GTK_OBJECT (w), "clicked", filter_druid_clicked, fb);
- gtk_widget_show (GTK_WIDGET (w));
-}
-
-void
-vfolder_edit_vfolders (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- void vfolder_edit(void);
-
- vfolder_edit();
-}
-
-/*
- *void
- *providers_config (BonoboUIHandler *uih, void *user_data, const char *path)
- *{
- * mail_config();
- *}
- */
-
-void
-mail_print_msg (MailDisplay *md)
-{
- GnomePrintMaster *print_master;
- GnomePrintContext *print_context;
- GtkWidget *preview;
-
- print_master = gnome_print_master_new ();
-
- print_context = gnome_print_master_get_context (print_master);
- gtk_html_print (md->html, print_context);
-
- preview = GTK_WIDGET (gnome_print_master_preview_new (
- print_master, "Mail Print Preview"));
- gtk_widget_show (preview);
-
- gtk_object_unref (GTK_OBJECT (print_master));
-}
-
-void
-print_msg (GtkWidget *button, gpointer user_data)
-{
- FolderBrowser *fb = user_data;
-
- mail_print_msg (fb->mail_display);
-}
-
-void
-configure_folder(BonoboUIHandler *uih, void *user_data, const char *path)
-{
- FolderBrowser *fb = FOLDER_BROWSER(user_data);
-
- local_reconfigure_folder(fb);
-}
-
-void
-view_msg (GtkWidget *widget, gpointer user_data)
-{
- FolderBrowser *fb = user_data;
- GPtrArray *uids;
-
- if (!fb->folder)
- return;
-
- uids = g_ptr_array_new ();
- message_list_foreach (fb->message_list, enumerate_msg, uids);
- mail_do_view_messages (fb->folder, uids, fb);
-}
-
-void
-view_message (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- view_msg (NULL, user_data);
-}
-
-void
-edit_message (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- edit_msg (NULL, user_data);
-}
-
-void
-run_filter_ondemand (BonoboUIHandler *uih, gpointer user_data, const char *path)
-{
- struct fb_ondemand_closure *oc = (struct fb_ondemand_closure *) user_data;
- FilterDriver *d;
-
- if (oc->fb->folder == NULL)
- return;
-
- printf ("Running filter \"%s\"\n", oc->rule->name);
-
- d = filter_driver_new (oc->fb->filter_context,
- mail_tool_filter_get_folder_func,
- NULL);
- filter_driver_run (d, oc->fb->folder, oc->fb->folder,
- FILTER_SOURCE_DEMAND, TRUE,
- NULL, NULL);
-}
diff --git a/mail/mail-config-druid.glade b/mail/mail-config-druid.glade
deleted file mode 100644
index 98849aadf4..0000000000
--- a/mail/mail-config-druid.glade
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Project1</name>
- <program_name>project1</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>mail-config-druid.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GtkWindow</class>
- <name>dialog</name>
- <title>Mail Configuration</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>True</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
-
- <widget>
- <class>GnomeDruid</class>
- <name>druid</name>
-
- <widget>
- <class>GnomeDruidPageStart</class>
- <name>startpage</name>
- <title>Mail Configuration</title>
- <text>Welcome to the Evolution Mail configuration wizard!
-By filling in some information about your email
-settings, you can start sending and receiving email
-right away. Click Next to continue.</text>
- <title_color>255,255,255</title_color>
- <text_color>0,0,0</text_color>
- <background_color>25,25,112</background_color>
- <logo_background_color>25,25,112</logo_background_color>
- <textbox_color>255,255,255</textbox_color>
- </widget>
-
- <widget>
- <class>GnomeDruidPageStandard</class>
- <name>standardpage1</name>
- <title>Identity</title>
- <title_color>255,255,255</title_color>
- <background_color>25,25,112</background_color>
- <logo_background_color>25,25,112</logo_background_color>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDruidPageStandard:vbox</child_name>
- <name>pagevbox1</name>
- <border_width>8</border_width>
- <homogeneous>False</homogeneous>
- <spacing>5</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GnomeDruidPageStandard</class>
- <name>standardpage2</name>
- <title>Mail Source</title>
- <title_color>255,255,255</title_color>
- <background_color>25,25,112</background_color>
- <logo_background_color>25,25,112</logo_background_color>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDruidPageStandard:vbox</child_name>
- <name>pagevbox2</name>
- <border_width>8</border_width>
- <homogeneous>False</homogeneous>
- <spacing>5</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GnomeDruidPageStandard</class>
- <name>standardpage3</name>
- <title>Mail Transport</title>
- <title_color>255,255,255</title_color>
- <background_color>25,25,112</background_color>
- <logo_background_color>25,25,112</logo_background_color>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDruidPageStandard:vbox</child_name>
- <name>pagevbox3</name>
- <border_width>8</border_width>
- <homogeneous>False</homogeneous>
- <spacing>5</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GnomeDruidPageFinish</class>
- <name>finishpage</name>
- <title>Mail Configuration</title>
- <text>Your email configuration is now complete.
-Click &quot;Finish&quot; to save your new settings</text>
- <background_color>25,25,112</background_color>
- <logo_background_color>25,25,112</logo_background_color>
- <textbox_color>255,255,255</textbox_color>
- <text_color>0,0,0</text_color>
- <title_color>255,255,255</title_color>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/mail/mail-config-druid.glade.h b/mail/mail-config-druid.glade.h
deleted file mode 100644
index 7c48ce6ea1..0000000000
--- a/mail/mail-config-druid.glade.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Mail Configuration");
-gchar *s = N_("Mail Configuration");
-gchar *s = N_("Welcome to the Evolution Mail configuration wizard!\n"
- "By filling in some information about your email\n"
- "settings, you can start sending and receiving email\n"
- "right away. Click Next to continue.");
-gchar *s = N_("Identity");
-gchar *s = N_("Mail Source");
-gchar *s = N_("Mail Transport");
-gchar *s = N_("Mail Configuration");
-gchar *s = N_("Your email configuration is now complete.\n"
- "Click \"Finish\" to save your new settings");
diff --git a/mail/mail-config-gui.c b/mail/mail-config-gui.c
deleted file mode 100644
index 955c457e7c..0000000000
--- a/mail/mail-config-gui.c
+++ /dev/null
@@ -1,2268 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* mail-config.c: Mail configuration dialogs/wizard. */
-
-/*
- * Authors:
- * Dan Winship <danw@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- * JP Rosevear <jpr@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include <pwd.h>
-
-#include <gnome.h>
-#include <gtkhtml/gtkhtml.h>
-#include <glade/glade.h>
-
-#include "e-util/e-html-utils.h"
-#include "mail.h"
-#include "mail-threads.h"
-#include "mail-config.h"
-#include "mail-config-gui.h"
-
-typedef struct _MailDialogIdentityPage MailDialogIdentityPage;
-typedef struct _MailDialogServicePage MailDialogServicePage;
-
-typedef void (*IdentityPageCallback) (MailDialogIdentityPage *, gpointer);
-typedef void (*ServicePageCallback) (MailDialogServicePage *, gpointer);
-
-typedef struct
-{
- CamelProvider *provider;
- CamelService *service;
- CamelProviderType type;
- GList *authtypes;
-} MailService;
-
-struct _MailDialogIdentityPage
-{
- GtkWidget *vbox;
- GtkWidget *name;
- GtkWidget *address;
- GtkWidget *org;
- GtkWidget *sig;
- IdentityPageCallback undonecb;
- gpointer undonedata;
- IdentityPageCallback donecb;
- gpointer donedata;
-};
-
-typedef struct
-{
- GtkWidget *item;
- GtkWidget *vbox;
- CamelProviderType type;
- gchar *protocol;
- GtkWidget *user;
- gboolean userneed;
- GtkWidget *host;
- gboolean hostneed;
- GtkWidget *path;
- gboolean pathneed;
- GtkWidget *auth_optionmenu;
- GList *auth_items;
- GtkWidget *auth_html;
- GtkWidget *auth_detect;
- GtkWidget *keep_on_server;
- gint pnum;
-} MailDialogServicePageItem;
-
-struct _MailDialogServicePage
-{
- GtkWidget *vbox;
- GtkWidget *optionmenu;
- GList *items;
- GtkWidget *notebook;
- MailDialogServicePageItem *spitem;
- ServicePageCallback changedcb;
- gpointer changeddata;
- ServicePageCallback undonecb;
- gpointer undonedata;
- ServicePageCallback donecb;
- gpointer donedata;
-};
-
-typedef struct
-{
- GtkWidget *vbox;
- MailDialogServicePage *page;
-} MailDialogSourcePage;
-
-typedef struct
-{
- GtkWidget *vbox;
- MailDialogServicePage *page;
-} MailDialogNewsPage;
-
-typedef struct
-{
- GtkWidget *vbox;
- MailDialogServicePage *page;
-} MailDialogTransportPage;
-
-typedef struct
-{
- GtkWidget *dialog;
- MailDialogIdentityPage *page;
- MailConfigIdentity *id;
-} MailDialogIdentity;
-
-typedef struct
-{
- GtkWidget *dialog;
- MailDialogSourcePage *page;
- MailConfigService *source;
-} MailDialogSource;
-
-typedef struct
-{
- GtkWidget *dialog;
- MailDialogNewsPage *page;
- MailConfigService *source;
-} MailDialogNews;
-
-typedef struct
-{
- GladeXML *gui;
- GtkWidget *dialog;
- GtkWidget *druid;
- MailDialogIdentityPage *idpage;
- gboolean iddone;
- MailDialogSourcePage *spage;
- gboolean sdone;
- MailDialogTransportPage *tpage;
- gboolean tdone;
-} MailDruidDialog;
-
-typedef struct
-{
- GladeXML *gui;
- GtkWidget *dialog;
- GtkWidget *notebook;
- GtkWidget *clistIdentities;
- gint idrow;
- gint maxidrow;
- GtkWidget *clistSources;
- gint srow;
- gint maxsrow;
- GtkWidget *clistNews;
- gint nrow;
- gint maxnrow;
- MailDialogTransportPage *page;
- gboolean tpagedone;
- GtkWidget *chkFormat;
- GtkWidget *spinTimeout;
-} MailDialog;
-
-/* private prototypes - these are ugly, rename some of them? */
-static void config_do_test_service (const char *url, CamelProviderType type);
-
-static void html_size_req (GtkWidget *widget, GtkRequisition *requisition);
-static GtkWidget *html_new (gboolean white);
-static void put_html (GtkHTML *html, char *text);
-static void error_dialog (GtkWidget *parent_finder, const char *fmt, ...);
-static GdkImlibImage *load_image (const char *name);
-static void service_page_menuitem_activate (GtkWidget *item,
- MailDialogServicePage *page);
-static void service_page_item_changed (GtkWidget *item,
- MailDialogServicePage *page);
-static void service_page_item_auth_activate (GtkWidget *menuitem,
- MailDialogServicePageItem *spitem);
-
-
-/* HTML Helpers */
-static void
-html_size_req (GtkWidget *widget, GtkRequisition *requisition)
-{
- requisition->height = GTK_LAYOUT (widget)->height;
-}
-
-/* Returns a GtkHTML which is already inside a GtkScrolledWindow. If
- * @white is TRUE, the GtkScrolledWindow will be inside a GtkFrame.
- */
-static GtkWidget *
-html_new (gboolean white)
-{
- GtkWidget *html, *scrolled, *frame;
- GtkStyle *style;
-
- html = gtk_html_new ();
- GTK_LAYOUT (html)->height = 0;
- gtk_signal_connect (GTK_OBJECT (html), "size_request",
- GTK_SIGNAL_FUNC (html_size_req), NULL);
- gtk_html_set_editable (GTK_HTML (html), FALSE);
- style = gtk_rc_get_style (html);
- if (style) {
- gtk_html_set_default_background_color (GTK_HTML (html),
- white ? &style->white :
- &style->bg[0]);
- }
- gtk_widget_set_sensitive (html, FALSE);
- scrolled = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
- GTK_POLICY_NEVER,
- GTK_POLICY_NEVER);
- gtk_container_add (GTK_CONTAINER (scrolled), html);
-
- if (white) {
- frame = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (GTK_FRAME (frame),
- GTK_SHADOW_ETCHED_IN);
- gtk_container_add (GTK_CONTAINER (frame), scrolled);
- gtk_widget_show_all (frame);
- } else
- gtk_widget_show_all (scrolled);
-
- return html;
-}
-
-static void
-put_html (GtkHTML *html, char *text)
-{
- GtkHTMLStream *handle;
-
- text = e_text_to_html (text, E_TEXT_TO_HTML_CONVERT_NL);
- handle = gtk_html_begin (html);
- gtk_html_write (html, handle, "<HTML><BODY>", 12);
- gtk_html_write (html, handle, text, strlen (text));
- gtk_html_write (html, handle, "</BODY></HTML>", 14);
- g_free (text);
- gtk_html_end (html, handle, GTK_HTML_STREAM_OK);
-}
-
-
-/* Standard Dialog Helpers */
-static void
-error_dialog (GtkWidget *parent_finder, const char *fmt, ...)
-{
- GtkWidget *parent, *dialog;
- char *msg;
- va_list ap;
-
- parent = gtk_widget_get_ancestor (parent_finder, GTK_TYPE_WINDOW);
-
- va_start (ap, fmt);
- msg = g_strdup_vprintf (fmt, ap);
- va_end (ap);
-
- dialog = gnome_error_dialog_parented (msg, GTK_WINDOW (parent));
- gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
- g_free (msg);
-}
-
-#if 0
-static void
-info_dialog (GtkWidget *parent_finder, const char *fmt, ...)
-{
- GtkWidget *parent, *dialog;
- char *msg;
- va_list ap;
-
- parent = gtk_widget_get_ancestor (parent_finder, GTK_TYPE_WINDOW);
-
- va_start (ap, fmt);
- msg = g_strdup_vprintf (fmt, ap);
- va_end (ap);
-
- dialog = gnome_ok_dialog_parented (msg, GTK_WINDOW (parent));
- gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
- g_free (msg);
-}
-#endif
-
-/* Provider List */
-static GSList *
-provider_list_add (GSList *services, CamelProviderType type,
- CamelProvider *prov)
-{
- MailService *mcs;
- CamelService *service;
- CamelException *ex;
- char *url;
-
- ex = camel_exception_new ();
-
- url = g_strdup_printf ("%s:", prov->protocol);
- service = camel_session_get_service (session, url, type, ex);
- g_free (url);
- if (!service) {
- camel_exception_free (ex);
- return services;
- }
-
- mcs = g_new (MailService, 1);
- mcs->provider = prov;
- mcs->service = service;
- mcs->type = type;
- mcs->authtypes = camel_service_query_auth_types (mcs->service, ex);
- camel_exception_free (ex);
-
- return g_slist_prepend (services, mcs);
-}
-
-static void
-provider_list (GSList **sources, GSList **news, GSList **transports)
-{
- GList *providers, *p;
-
- /* Fetch list of all providers. */
- providers = camel_session_list_providers (session, TRUE);
- *sources = *transports = *news = NULL;
- for (p = providers; p; p = p->next) {
- CamelProvider *prov = p->data;
-
- if (!strcmp (prov->domain, "news")) {
- if (prov->object_types[CAMEL_PROVIDER_STORE]) {
- *news = provider_list_add (*news,
- CAMEL_PROVIDER_STORE,
- prov);
- }
- }
-
- if (strcmp (prov->domain, "mail"))
- continue;
-
- if (prov->object_types[CAMEL_PROVIDER_STORE] &&
- prov->flags & CAMEL_PROVIDER_IS_SOURCE) {
- *sources = provider_list_add (*sources,
- CAMEL_PROVIDER_STORE,
- prov);
- } else if (prov->object_types[CAMEL_PROVIDER_TRANSPORT]) {
- *transports = provider_list_add (*transports,
- CAMEL_PROVIDER_TRANSPORT,
- prov);
- }
- }
-}
-
-/* Utility routines */
-static GdkImlibImage *
-load_image (const char *name)
-{
- char *path;
- GdkImlibImage *image;
-
- path = g_strdup_printf (EVOLUTION_ICONSDIR "/%s", name);
- image = gdk_imlib_load_image (path);
- g_free (path);
-
- return image;
-}
-
-/* Identity Page */
-static void
-identity_page_changed (GtkWidget *widget, MailDialogIdentityPage *page)
-{
- gchar *name, *addr;
-
- name = gtk_editable_get_chars (GTK_EDITABLE (page->name), 0, -1);
- addr = gtk_editable_get_chars (GTK_EDITABLE (page->address), 0, -1);
-
- if (addr && *addr && name && *name && page->donecb)
- page->donecb (page, page->donedata);
- else if (page->undonecb)
- page->undonecb (page, page->undonedata);
-
- g_free (name);
- g_free (addr);
-}
-
-static MailConfigIdentity *
-identity_page_extract (MailDialogIdentityPage *page)
-{
- MailConfigIdentity *id = g_new0 (MailConfigIdentity, 1);
-
- id->name = gtk_editable_get_chars (GTK_EDITABLE (page->name), 0, -1);
- id->address =
- gtk_editable_get_chars (GTK_EDITABLE (page->address), 0, -1);
- id->org = gtk_editable_get_chars (GTK_EDITABLE (page->org), 0, -1);
- id->sig = gtk_editable_get_chars (GTK_EDITABLE (page->sig), 0, -1);
-
- return id;
-}
-
-static void
-identity_page_set_undone_cb (MailDialogIdentityPage *page,
- IdentityPageCallback cb, gpointer data)
-{
- page->undonecb = cb;
- page->undonedata = data;
-}
-
-static void
-identity_page_set_done_cb (MailDialogIdentityPage *page,
- IdentityPageCallback cb, gpointer data)
-{
- page->donecb = cb;
- page->donedata = data;
-}
-
-static MailDialogIdentityPage *
-identity_page_new (const MailConfigIdentity *id)
-{
- MailDialogIdentityPage *page = g_new0 (MailDialogIdentityPage, 1);
- GtkWidget *html, *table;
- GtkWidget *label, *fentry, *hsep;
- gchar *user = NULL;
- gboolean new = !id;
-
- page->vbox = gtk_vbox_new (FALSE, 5);
-
- html = html_new (FALSE);
- put_html (GTK_HTML (html),
- _("Enter your name and email address to be used in "
- "outgoing mail. You may also, optionally, enter the "
- "name of your organization, and the name of a file "
- "to read your signature from."));
- gtk_box_pack_start (GTK_BOX (page->vbox), html->parent,
- FALSE, TRUE, 0);
-
- table = gtk_table_new (5, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 10);
- gtk_table_set_col_spacings (GTK_TABLE (table), 6);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_box_pack_start (GTK_BOX (page->vbox), table, FALSE, FALSE, 0);
-
- label = gtk_label_new (_("Full name:"));
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
- GTK_FILL, 0, 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
-
- page->name = gtk_entry_new ();
- gtk_table_attach (GTK_TABLE (table), page->name, 1, 2, 0, 1,
- GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
- if (!id || !id->name)
- user = g_get_real_name ();
-
- if ((id && id->name) || user) {
- char *name;
-
- if (id && id->name)
- name = g_strdup (id->name);
- else
- name = g_strdup (user);
-
- gtk_entry_set_text (GTK_ENTRY (page->name), name);
- g_free (name);
- }
-
- label = gtk_label_new (_("Email address:"));
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
- GTK_FILL, 0, 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
-
- page->address = gtk_entry_new ();
- if (id && id->address)
- gtk_entry_set_text (GTK_ENTRY (page->address), id->address);
- gtk_table_attach (GTK_TABLE (table), page->address, 1, 2, 1, 2,
- GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
- hsep = gtk_hseparator_new ();
- gtk_table_attach (GTK_TABLE (table), hsep, 0, 2, 2, 3,
- GTK_FILL, 0, 0, 8);
-
- label = gtk_label_new (_("Organization:"));
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4,
- GTK_FILL, 0, 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
-
- page->org = gtk_entry_new ();
- if (id && id->org)
- gtk_entry_set_text (GTK_ENTRY (page->org), id->org);
- gtk_table_attach (GTK_TABLE (table), page->org, 1, 2, 3, 4,
- GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
- label = gtk_label_new (_("Signature file:"));
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, 4, 5,
- GTK_FILL, GTK_FILL, 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0);
-
- fentry = gnome_file_entry_new (NULL, _("Signature File"));
- page->sig = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (fentry));
- if (id && id->sig) {
- gtk_entry_set_text (GTK_ENTRY (page->sig), id->sig);
- } else {
- gchar *default_sig;
-
- default_sig = g_strconcat (g_get_home_dir (),
- G_DIR_SEPARATOR_S,
- ".signature", NULL);
- if (g_file_exists (default_sig))
- gtk_entry_set_text (GTK_ENTRY (page->sig), default_sig);
- g_free (default_sig);
- }
-
- gtk_table_attach (GTK_TABLE (table), fentry, 1, 2, 4, 5,
- GTK_FILL, 0, 0, 0);
- gnome_file_entry_set_default_path (GNOME_FILE_ENTRY (fentry),
- g_get_home_dir ());
-
- gtk_signal_connect (GTK_OBJECT (page->name), "changed",
- GTK_SIGNAL_FUNC (identity_page_changed), page);
- gtk_signal_connect (GTK_OBJECT (page->address), "changed",
- GTK_SIGNAL_FUNC (identity_page_changed), page);
- if (!new) {
- gtk_signal_connect (GTK_OBJECT (page->org), "changed",
- GTK_SIGNAL_FUNC (identity_page_changed),
- page);
- gtk_signal_connect (GTK_OBJECT (page->sig), "changed",
- GTK_SIGNAL_FUNC (identity_page_changed),
- page);
- }
-
- gtk_widget_show_all (table);
-
- return page;
-}
-
-/* Service page */
-static MailDialogServicePageItem *
-service_page_item_by_protocol (MailDialogServicePage *page, gchar *protocol)
-{
- MailDialogServicePageItem *spitem;
- gint len, i;
-
- len = g_list_length (page->items);
- for (i = 0; i < len; i++) {
- spitem = (MailDialogServicePageItem *)
- g_list_nth_data (page->items, i);
- if (!g_strcasecmp (spitem->protocol, protocol))
- return spitem;
- }
-
- return NULL;
-}
-
-static MailDialogServicePageItem *
-service_page_item_by_menuitem (MailDialogServicePage *page,
- GtkWidget *menuitem)
-{
- MailDialogServicePageItem *spitem;
- gint len, i;
-
- len = g_list_length (page->items);
- for (i = 0; i < len; i++) {
- spitem = (MailDialogServicePageItem *)
- g_list_nth_data (page->items, i);
- if (spitem->item == menuitem)
- return spitem;
- }
-
- return NULL;
-}
-
-static char *
-service_page_get_url (MailDialogServicePage *page)
-{
- MailDialogServicePageItem *spitem;
- CamelURL *url;
- char *url_str;
-
- spitem = page->spitem;
-
- url = g_new0 (CamelURL, 1);
- url->protocol = g_strdup (spitem->protocol);
-
- if (spitem->user)
- url->user = gtk_editable_get_chars (GTK_EDITABLE (spitem->user), 0, -1);
- if (spitem->host)
- url->host = gtk_editable_get_chars (GTK_EDITABLE (spitem->host), 0, -1);
- if (spitem->path) {
- gchar *path;
- path = gtk_editable_get_chars (GTK_EDITABLE (spitem->path),
- 0, -1);
- url->path = g_strdup_printf ("%s%s", url->host ? "/" : "",
- path);
- g_free (path);
- }
-
- if (spitem->auth_optionmenu) {
- GtkWidget *menu, *item;
- CamelServiceAuthType *authtype;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (spitem->auth_optionmenu));
- if (menu) {
- item = gtk_menu_get_active (GTK_MENU (menu));
- authtype = gtk_object_get_data (GTK_OBJECT (item),
- "authtype");
- if (*authtype->authproto)
- url->authmech = g_strdup (authtype->authproto);
- }
- }
-
- url_str = camel_url_to_string (url, FALSE);
- camel_url_free (url);
-
- return url_str;
-}
-
-static void
-service_page_set_url (MailDialogServicePage *page, MailConfigService *service)
-{
- CamelURL *url;
- CamelException *ex;
- MailDialogServicePageItem *spitem = NULL;
-
- if (!service || !service->url)
- return;
-
- ex = camel_exception_new ();
-
- url = camel_url_new (service->url, ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- camel_exception_free (ex);
- return;
- }
-
- /* Find the right protocol */
- spitem = service_page_item_by_protocol (page, url->protocol);
- service_page_menuitem_activate (spitem->item, page);
- gtk_option_menu_set_history (GTK_OPTION_MENU (page->optionmenu),
- spitem->pnum);
-
- if (spitem->user && url && url->user)
- gtk_entry_set_text (GTK_ENTRY (spitem->user), url->user);
-
- if (spitem->host && url && url->host)
- gtk_entry_set_text (GTK_ENTRY (spitem->host), url->host);
-
- if (spitem->path && url && url->path) {
- if (url->host && *url->path)
- gtk_entry_set_text (GTK_ENTRY (spitem->path),
- url->path + 1);
- else
- gtk_entry_set_text (GTK_ENTRY (spitem->path),
- url->path);
- }
-
- /* Set the auth menu */
- if (spitem->auth_optionmenu) {
- GtkWidget *menu, *item;
- CamelServiceAuthType *authtype;
- gint len, i;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (spitem->auth_optionmenu));
- len = g_list_length (spitem->auth_items);
- for (i = 0; i < len; i++) {
- item = g_list_nth_data (spitem->auth_items, i);
- authtype = gtk_object_get_data (GTK_OBJECT (item),
- "authtype");
-
- if ((!url->authmech && !*authtype->authproto) ||
- (url->authmech &&
- !strcmp (authtype->authproto, url->authmech))) {
-
- service_page_item_auth_activate (item, spitem);
- gtk_option_menu_set_history (GTK_OPTION_MENU (spitem->auth_optionmenu), i);
- }
- }
- }
-
- if (spitem->keep_on_server)
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (spitem->keep_on_server), service->keep_on_server);
-
- camel_exception_free (ex);
- camel_url_free (url);
-}
-
-static void
-service_page_item_auth_activate (GtkWidget *menuitem,
- MailDialogServicePageItem *spitem)
-{
- CamelServiceAuthType *authtype;
-
- authtype = gtk_object_get_data (GTK_OBJECT (menuitem), "authtype");
- put_html (GTK_HTML (spitem->auth_html),
- authtype->description);
-}
-
-static void
-service_page_item_auth_fill (MailDialogServicePage *page,
- MailDialogServicePageItem *spitem,
- GList *authtypes)
-{
- CamelServiceAuthType *authtype;
- GtkWidget *menu, *item, *firstitem = NULL;
-
- menu = gtk_menu_new ();
- for (; authtypes; authtypes = authtypes->next) {
- authtype = authtypes->data;
-
- item = gtk_menu_item_new_with_label (_(authtype->name));
- if (!firstitem)
- firstitem = item;
- spitem->auth_items = g_list_append (spitem->auth_items, item);
-
- gtk_menu_append (GTK_MENU (menu), item);
- gtk_object_set_data (GTK_OBJECT (item), "authtype", authtype);
-
- gtk_signal_connect (GTK_OBJECT (item), "activate",
- GTK_SIGNAL_FUNC (service_page_item_auth_activate),
- spitem);
- gtk_signal_connect (GTK_OBJECT (item), "activate",
- GTK_SIGNAL_FUNC (service_page_item_changed),
- page);
- }
- gtk_widget_show_all (menu);
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (spitem->auth_optionmenu),
- menu);
- gtk_option_menu_set_history (GTK_OPTION_MENU (spitem->auth_optionmenu), 0);
- if (firstitem)
- service_page_item_auth_activate (firstitem, spitem);
-}
-
-static void
-service_acceptable (MailDialogServicePage *page)
-{
- char *url;
-
- url = service_page_get_url (page);
- config_do_test_service (url, page->spitem->type);
- g_free (url);
-}
-
-static MailConfigService *
-service_page_extract (MailDialogServicePage *page)
-{
- MailConfigService *source = g_new0 (MailConfigService, 1);
- MailDialogServicePageItem *spitem = page->spitem;
-
- source->url = service_page_get_url (page);
- if (spitem->keep_on_server) {
- source->keep_on_server = gtk_toggle_button_get_active (
- GTK_TOGGLE_BUTTON (spitem->keep_on_server));
- }
-
- return source;
-}
-
-static void
-service_page_item_changed (GtkWidget *item, MailDialogServicePage *page)
-{
- MailDialogServicePageItem *spitem;
- char *data;
- gboolean complete = TRUE;
-
- spitem = page->spitem;
-
- if (complete && page->changedcb) {
- page->changedcb (page, page->changeddata);
- }
-
- if (spitem->host && spitem->hostneed) {
- data = gtk_editable_get_chars (GTK_EDITABLE (spitem->host), 0, -1);
- if (!data || !*data)
- complete = FALSE;
- g_free (data);
- }
-
- if (complete) {
- if (spitem->user && spitem->userneed) {
- data = gtk_editable_get_chars (GTK_EDITABLE (spitem->user), 0, -1);
- if (!data || !*data)
- complete = FALSE;
- g_free (data);
- }
- }
-
- if (complete) {
- if (spitem->path && spitem->pathneed) {
- data = gtk_editable_get_chars (GTK_EDITABLE (spitem->path), 0, -1);
- if (!data || !*data)
- complete = FALSE;
- }
- }
-
- if (spitem->auth_detect)
- gtk_widget_set_sensitive (spitem->auth_detect, complete);
-
- if (complete && page->donecb) {
- page->donecb (page, page->donedata);
- } else if (!complete && page->undonecb) {
- page->undonecb (page, page->undonedata);
- }
-}
-
-static void
-service_page_detect (GtkWidget *button, MailDialogServicePage *page)
-{
- MailDialogServicePageItem *spitem;
- char *url = NULL;
- CamelException *ex;
- CamelService *service;
- GList *authtypes;
-
- spitem = page->spitem;
- url = service_page_get_url (page);
-
- ex = camel_exception_new ();
- service = camel_session_get_service (session, url, spitem->type, ex);
- g_free (url);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE)
- goto error;
-
- authtypes = camel_service_query_auth_types (service, ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE)
- goto error;
-
- service_page_item_auth_fill (page, spitem, authtypes);
-
- camel_exception_free (ex);
-
- return;
-
- error:
- error_dialog (button, "Could not detect supported authentication "
- "types:\n%s", camel_exception_get_description (ex));
- camel_exception_free (ex);
-}
-
-static void
-service_page_item_test (GtkWidget *button, MailDialogServicePage *page)
-{
- service_acceptable (page);
-}
-
-static GtkWidget *
-service_page_add_elem (MailDialogServicePage *page, GtkWidget *table,
- int row, const char *label_text)
-{
- GtkWidget *label, *entry;
-
- label = gtk_label_new (label_text);
- gtk_table_attach (GTK_TABLE (table), label, 0, 1,
- row, row + 1, GTK_FILL, 0, 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
-
- entry = gtk_entry_new ();
- gtk_table_attach (GTK_TABLE (table), entry, 1, 3, row, row + 1,
- GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
- gtk_signal_connect (GTK_OBJECT (entry), "changed",
- GTK_SIGNAL_FUNC (service_page_item_changed), page);
-
- return entry;
-}
-
-static MailDialogServicePageItem *
-service_page_item_new (MailDialogServicePage *page, MailService *mcs)
-{
- MailDialogServicePageItem *item;
- GtkWidget *table, *description;
- int row, service_flags;
-
- item = g_new0 (MailDialogServicePageItem, 1);
-
- item->vbox = gtk_vbox_new (FALSE, 0);
-
- /* Description */
- description = html_new (TRUE);
- put_html (GTK_HTML (description), mcs->provider->description);
- gtk_box_pack_start (GTK_BOX (item->vbox),
- description->parent->parent,
- TRUE, TRUE, 0);
-
- table = gtk_table_new (6, 3, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 2);
- gtk_table_set_col_spacings (GTK_TABLE (table), 10);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_box_pack_start (GTK_BOX (item->vbox), table, TRUE, TRUE, 0);
-
- item->protocol = g_strdup (mcs->provider->protocol);
- item->type = mcs->type;
-
- row = 0;
- service_flags = mcs->service->url_flags & ~CAMEL_SERVICE_URL_NEED_AUTH;
-
- if (service_flags & CAMEL_SERVICE_URL_ALLOW_HOST) {
- item->host = service_page_add_elem (page, table, row++, _("Server:"));
- item->hostneed = ((service_flags & CAMEL_SERVICE_URL_NEED_HOST)
- == CAMEL_SERVICE_URL_NEED_HOST);
- }
-
- if (service_flags & CAMEL_SERVICE_URL_ALLOW_USER) {
- item->user = service_page_add_elem (page, table, row++, _("Username:"));
- item->userneed = ((service_flags & CAMEL_SERVICE_URL_NEED_USER)
- == CAMEL_SERVICE_URL_NEED_USER);
- }
-
- if (service_flags & CAMEL_SERVICE_URL_ALLOW_PATH) {
- item->path = service_page_add_elem (page, table, row++, _("Path:"));
- item->pathneed = ((service_flags & CAMEL_SERVICE_URL_NEED_PATH)
- == CAMEL_SERVICE_URL_NEED_PATH);
- }
-
- if (mcs->authtypes) {
- GtkWidget *label;
-
- label = gtk_label_new (_("Authentication:"));
- gtk_table_attach (GTK_TABLE (table), label, 0, 1,
- row, row + 1, GTK_FILL, 0, 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
-
- item->auth_optionmenu = gtk_option_menu_new ();
- gtk_table_attach (GTK_TABLE (table),
- item->auth_optionmenu,
- 1, 2, row, row + 1,
- GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
- 0, 0);
-
- item->auth_detect = gtk_button_new_with_label (_("Detect supported types..."));
- gtk_table_attach (GTK_TABLE (table), item->auth_detect,
- 2, 3, row, row + 1,
- GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
- 0, 0);
- gtk_widget_set_sensitive (item->auth_detect, FALSE);
- gtk_signal_connect (GTK_OBJECT (item->auth_detect),
- "clicked",
- GTK_SIGNAL_FUNC (service_page_detect),
- page);
-
- item->auth_html = html_new (TRUE);
- gtk_table_attach (GTK_TABLE (table),
- item->auth_html->parent->parent,
- 0, 3, row + 1, row + 2,
- GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
-
- service_page_item_auth_fill (page, item, mcs->authtypes);
-
- row += 2;
- }
-
- if ((mcs->provider->flags & CAMEL_PROVIDER_IS_REMOTE) &&
- !(mcs->provider->flags & CAMEL_PROVIDER_IS_STORAGE)) {
- item->keep_on_server = gtk_check_button_new_with_label (
- _("Don't delete messages from server"));
- gtk_signal_connect (GTK_OBJECT (item->keep_on_server), "toggled",
- GTK_SIGNAL_FUNC (service_page_item_changed),
- page);
- gtk_table_attach (GTK_TABLE (table), item->keep_on_server,
- 0, 3, row, row + 1, GTK_FILL, 0, 0, 0);
- row++;
- }
-
- if (row != 0) {
- GtkWidget *btn;
-
- btn = gtk_button_new_with_label (_("Test Settings"));
-
- gtk_table_attach (GTK_TABLE (table), btn, 2, 3,
- row, row + 1, GTK_FILL, GTK_FILL, 0, 0);
-
- gtk_signal_connect (GTK_OBJECT (btn), "clicked",
- GTK_SIGNAL_FUNC (service_page_item_test),
- page);
- row += 1;
- }
-
- gtk_table_resize (GTK_TABLE (table), row, 3);
- gtk_widget_show_all (table);
-
- return item;
-}
-
-static void
-service_page_menuitem_activate (GtkWidget *item, MailDialogServicePage *page)
-{
- MailDialogServicePageItem *spitem;
-
- spitem = service_page_item_by_menuitem (page, item);
-
- g_return_if_fail (spitem);
-
- gtk_notebook_set_page (GTK_NOTEBOOK (page->notebook), spitem->pnum);
- page->spitem = spitem;
-
- service_page_item_changed (item, page);
-}
-
-static void
-service_page_set_changed_cb (MailDialogServicePage *page,
- ServicePageCallback cb, gpointer data)
-{
- page->changedcb = cb;
- page->changeddata = data;
-}
-
-static void
-service_page_set_undone_cb (MailDialogServicePage *page,
- ServicePageCallback cb, gpointer data)
-{
- page->undonecb = cb;
- page->undonedata = data;
-}
-
-static void
-service_page_set_done_cb (MailDialogServicePage *page,
- ServicePageCallback cb, gpointer data)
-{
- page->donecb = cb;
- page->donedata = data;
-}
-
-static MailDialogServicePage *
-service_page_new (const char *label_text, GSList *services)
-{
- MailDialogServicePage *page;
- GtkWidget *hbox, *label, *menu;
- GtkWidget *first_item = NULL;
- int pnum;
- GSList *s;
-
- page = g_new0 (MailDialogServicePage, 1);
-
- page->vbox = gtk_vbox_new (FALSE, 5);
-
- hbox = gtk_hbox_new (FALSE, 8);
- gtk_box_pack_start (GTK_BOX (page->vbox), hbox, FALSE, TRUE, 0);
-
- label = gtk_label_new (label_text);
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
- gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
-
- page->optionmenu = gtk_option_menu_new ();
- menu = gtk_menu_new ();
- gtk_box_pack_start (GTK_BOX (hbox), page->optionmenu, TRUE, TRUE, 0);
-
- /* Notebook */
- page->notebook = gtk_notebook_new ();
- gtk_notebook_set_show_tabs (GTK_NOTEBOOK (page->notebook), FALSE);
- gtk_box_pack_start (GTK_BOX (page->vbox), page->notebook,
- TRUE, TRUE, 0);
-
- /* Build the list of services and the service item pages */
- for (s = services, pnum = 0; s; s = s->next, pnum++) {
- MailService *mcs = s->data;
- MailDialogServicePageItem *spitem;
-
- spitem = service_page_item_new (page, mcs);
- spitem->pnum = pnum;
-
- gtk_notebook_append_page (GTK_NOTEBOOK (page->notebook),
- spitem->vbox, NULL);
-
- spitem->item = gtk_menu_item_new_with_label (_(mcs->provider->name));
- if (!first_item)
- first_item = spitem->item;
-
- gtk_signal_connect (GTK_OBJECT (spitem->item), "activate",
- GTK_SIGNAL_FUNC (service_page_menuitem_activate),
- page);
-
- gtk_menu_append (GTK_MENU (menu), spitem->item);
- page->items = g_list_append (page->items, spitem);
-
- gtk_widget_show (spitem->item);
- }
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (page->optionmenu), menu);
- service_page_menuitem_activate (first_item, page);
- gtk_option_menu_set_history (GTK_OPTION_MENU (page->optionmenu), 0);
-
- gtk_widget_show_all (page->vbox);
-
- return page;
-}
-
-/* Source Page */
-static MailDialogSourcePage *
-source_page_new (GSList *sources)
-{
- MailDialogSourcePage *page = g_new0 (MailDialogSourcePage, 1);
- GtkWidget *html;
-
- page->page = service_page_new ("Mail source type:", sources);
- page->vbox = page->page->vbox;
-
- html = html_new (FALSE);
- put_html (GTK_HTML (html),
- _("Select the kind of mail server you have, and enter "
- "the relevant information about it.\n\nIf the server "
- "requires authentication, you can click the "
- "\"Detect supported types...\" button after entering "
- "the other information."));
- gtk_box_pack_start (GTK_BOX (page->vbox), html->parent,
- FALSE, TRUE, 0);
- gtk_box_reorder_child (GTK_BOX (page->vbox), html->parent, 0);
-
- return page;
-}
-
-/* News Page */
-static MailDialogNewsPage *
-news_page_new (GSList *sources)
-{
- MailDialogNewsPage *page = g_new0 (MailDialogNewsPage, 1);
- GtkWidget *html;
-
- page->page = service_page_new ("News source type:", sources);
- page->vbox = page->page->vbox;
-
- html = html_new (FALSE);
- put_html (GTK_HTML (html),
- _("Select the kind of news server you have, and enter "
- "the relevant information about it.\n\nIf the server "
- "requires authentication, you can click the "
- "\"Detect supported types...\" button after entering "
- "the other information."));
- gtk_box_pack_start (GTK_BOX (page->vbox), html->parent,
- FALSE, TRUE, 0);
- gtk_box_reorder_child (GTK_BOX (page->vbox), html->parent, 0);
-
- return page;
-}
-
-/* Transport page */
-static MailDialogTransportPage *
-transport_page_new (GSList *transports)
-{
- MailDialogTransportPage *page = g_new0 (MailDialogTransportPage, 1);
- GtkWidget *html;
-
- page->page = service_page_new (_("Mail transport type:"), transports);
- page->vbox = page->page->vbox;
-
- html = html_new (FALSE);
- put_html (GTK_HTML (html),
- _("Select the kind of mail server you have, and enter "
- "the relevant information about it.\n\nIf the server "
- "requires authentication, you can click the "
- "\"Detect supported types...\" button after entering "
- "the other information."));
- gtk_box_pack_start (GTK_BOX (page->vbox), html->parent,
- FALSE, TRUE, 0);
- gtk_box_reorder_child (GTK_BOX (page->vbox), html->parent, 0);
-
- return page;
-}
-
-/* Identity dialog */
-static void
-iddialog_page_undone (MailDialogIdentityPage *page, gpointer data)
-{
- MailDialogIdentity *iddialog = (MailDialogIdentity *)data;
-
- gnome_dialog_set_sensitive (GNOME_DIALOG (iddialog->dialog), 0, FALSE);
-}
-
-static void
-iddialog_page_done (MailDialogIdentityPage *page, gpointer data)
-{
- MailDialogIdentity *iddialog = (MailDialogIdentity *)data;
-
- gnome_dialog_set_sensitive (GNOME_DIALOG (iddialog->dialog), 0, TRUE);
-}
-
-static void
-iddialog_ok_clicked (GtkWidget *dialog, MailDialogIdentity *iddialog)
-{
- g_return_if_fail (iddialog);
-
- iddialog->id = identity_page_extract (iddialog->page);
-}
-
-static MailConfigIdentity *
-identity_dialog (const MailConfigIdentity *id, GtkWidget *parent)
-
-{
- MailDialogIdentity *iddialog;
- MailConfigIdentity *returnid;
- GtkWidget *dialog_vbox;
- GtkWidget *area;
- gboolean new = !id;
-
- iddialog = g_new0 (MailDialogIdentity, 1);
-
- if (new)
- iddialog->dialog = gnome_dialog_new (_("Edit Identity"), NULL);
- else
- iddialog->dialog = gnome_dialog_new (_("Add Identity"), NULL);
-
- gtk_window_set_modal (GTK_WINDOW (iddialog->dialog), TRUE);
- gtk_window_set_policy (GTK_WINDOW (iddialog->dialog),
- FALSE, TRUE, FALSE);
- gnome_dialog_set_parent (GNOME_DIALOG (iddialog->dialog),
- GTK_WINDOW (parent));
-
- /* Create the vbox that we will pack the identity widget into */
- dialog_vbox = GNOME_DIALOG (iddialog->dialog)->vbox;
- gtk_widget_show (dialog_vbox);
-
- /* Get the identity widget */
- iddialog->page = identity_page_new (id);
- gtk_box_pack_start (GTK_BOX (dialog_vbox),
- iddialog->page->vbox, TRUE, TRUE, 0);
-
- identity_page_set_undone_cb (iddialog->page,
- iddialog_page_undone,
- iddialog);
- identity_page_set_done_cb (iddialog->page,
- iddialog_page_done,
- iddialog);
- gtk_widget_show (iddialog->page->vbox);
-
- /* Buttons */
- area = GNOME_DIALOG (iddialog->dialog)->action_area;
- gtk_widget_show (area);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (area), GTK_BUTTONBOX_END);
- gtk_button_box_set_spacing (GTK_BUTTON_BOX (area), 8);
-
- gnome_dialog_append_button (GNOME_DIALOG (iddialog->dialog),
- GNOME_STOCK_BUTTON_OK);
- gnome_dialog_append_button (GNOME_DIALOG (iddialog->dialog),
- GNOME_STOCK_BUTTON_CANCEL);
-
- gnome_dialog_set_default (GNOME_DIALOG (iddialog->dialog), 0);
- gnome_dialog_set_default (GNOME_DIALOG (iddialog->dialog), 1);
-
- gnome_dialog_set_sensitive (GNOME_DIALOG (iddialog->dialog), 0, FALSE);
-
- gnome_dialog_button_connect( GNOME_DIALOG (iddialog->dialog), 0,
- GTK_SIGNAL_FUNC (iddialog_ok_clicked),
- iddialog);
-
- /*GDK_THREADS_ENTER ();*/
- gnome_dialog_run_and_close (GNOME_DIALOG (iddialog->dialog));
- /*GDK_THREADS_LEAVE ();*/
-
- returnid = iddialog->id;
- g_free (iddialog);
-
- return returnid;
-}
-
-/* Source Dialog */
-static void
-sdialog_page_undone (MailDialogServicePage *page, gpointer data)
-{
- MailDialogSource *sdialog = (MailDialogSource *)data;
-
- gnome_dialog_set_sensitive (GNOME_DIALOG (sdialog->dialog), 0, FALSE);
-}
-
-static void
-sdialog_page_done (MailDialogServicePage *page, gpointer data)
-{
- MailDialogSource *sdialog = (MailDialogSource *)data;
-
- gnome_dialog_set_sensitive (GNOME_DIALOG (sdialog->dialog), 0, TRUE);
-}
-
-static void
-sdialog_ok_clicked (GtkWidget *widget, MailDialogSource *sdialog)
-{
- g_return_if_fail (sdialog);
-
- sdialog->source = service_page_extract (sdialog->page->page);
-}
-
-static MailConfigService *
-source_dialog (MailConfigService *source, GtkWidget *parent)
-{
- MailDialogSource *sdialog;
- MailConfigService *returnsource;
- GtkWidget *dialog_vbox, *area;
- GSList *sources, *news, *transports;
- gboolean new = !source;
-
- sdialog = g_new0 (MailDialogSource, 1);
-
- provider_list (&sources, &news, &transports);
-
- if (new)
- sdialog->dialog = gnome_dialog_new (_("Edit Source"), NULL);
- else
- sdialog->dialog = gnome_dialog_new (_("Add Source"), NULL);
-
- gtk_window_set_modal (GTK_WINDOW (sdialog->dialog), TRUE);
- gtk_window_set_policy (GTK_WINDOW (sdialog->dialog),
- FALSE, TRUE, FALSE);
- gtk_window_set_default_size (GTK_WINDOW (sdialog->dialog), 380, 450);
- gnome_dialog_set_parent (GNOME_DIALOG (sdialog->dialog),
- GTK_WINDOW (parent));
-
- /* Create the vbox that we will pack the identity widget into */
- dialog_vbox = GNOME_DIALOG (sdialog->dialog)->vbox;
- gtk_widget_show (dialog_vbox);
-
- /* Get the identity widget */
- sdialog->page = source_page_new (sources);
- if (!new)
- service_page_set_url (sdialog->page->page, source);
- gtk_box_pack_start (GTK_BOX (dialog_vbox), sdialog->page->vbox,
- TRUE, TRUE, 0);
-
- service_page_set_undone_cb (sdialog->page->page,
- sdialog_page_undone,
- sdialog);
- service_page_set_done_cb (sdialog->page->page,
- sdialog_page_done,
- sdialog);
- gtk_widget_show (sdialog->page->vbox);
-
- /* Buttons */
- area = GNOME_DIALOG (sdialog->dialog)->action_area;
- gtk_widget_show (area);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (area), GTK_BUTTONBOX_END);
- gtk_button_box_set_spacing (GTK_BUTTON_BOX (area), 8);
-
- gnome_dialog_append_button (GNOME_DIALOG (sdialog->dialog),
- GNOME_STOCK_BUTTON_OK);
- gnome_dialog_append_button (GNOME_DIALOG (sdialog->dialog),
- GNOME_STOCK_BUTTON_CANCEL);
-
- gnome_dialog_set_default (GNOME_DIALOG (sdialog->dialog), 0);
- gnome_dialog_set_default (GNOME_DIALOG (sdialog->dialog), 1);
-
- gnome_dialog_set_sensitive (GNOME_DIALOG (sdialog->dialog), 0, FALSE);
-
- gnome_dialog_button_connect(GNOME_DIALOG (sdialog->dialog), 0,
- GTK_SIGNAL_FUNC (sdialog_ok_clicked),
- sdialog);
-
- /*GDK_THREADS_ENTER ();*/
- gnome_dialog_run_and_close (GNOME_DIALOG (sdialog->dialog));
- /*GDK_THREADS_LEAVE ();*/
-
- returnsource = sdialog->source;
- g_free (sdialog);
-
- return returnsource;
-}
-
-/* News Dialog */
-static void
-ndialog_page_undone (MailDialogServicePage *page, gpointer data)
-{
- MailDialogNews *ndialog = (MailDialogNews *)data;
-
- gnome_dialog_set_sensitive (GNOME_DIALOG (ndialog->dialog), 0, FALSE);
-}
-
-static void
-ndialog_page_done (MailDialogServicePage *page, gpointer data)
-{
- MailDialogNews *ndialog = (MailDialogNews *)data;
-
- gnome_dialog_set_sensitive (GNOME_DIALOG (ndialog->dialog), 0, TRUE);
-}
-
-static void
-ndialog_ok_clicked (GtkWidget *widget, MailDialogNews *ndialog)
-{
- g_return_if_fail (ndialog);
-
- ndialog->source = service_page_extract (ndialog->page->page);
-}
-
-static MailConfigService *
-news_dialog (MailConfigService *source, GtkWidget *parent)
-{
- MailDialogNews *ndialog;
- MailConfigService *returnsource;
- GtkWidget *dialog_vbox, *area;
- GSList *sources, *news, *transports;
- gboolean new = !source;
-
- ndialog = g_new0 (MailDialogNews, 1);
-
- provider_list (&sources, &news, &transports);
-
- if (new)
- ndialog->dialog = gnome_dialog_new (_("Edit News Server"), NULL);
- else
- ndialog->dialog = gnome_dialog_new (_("Add News Server"), NULL);
-
- gtk_window_set_modal (GTK_WINDOW (ndialog->dialog), TRUE);
- gtk_window_set_policy (GTK_WINDOW (ndialog->dialog),
- FALSE, TRUE, FALSE);
- gtk_window_set_default_size (GTK_WINDOW (ndialog->dialog), 380, 450);
- gnome_dialog_set_parent (GNOME_DIALOG (ndialog->dialog),
- GTK_WINDOW (parent));
-
- /* Create the vbox that we will pack the identity widget into */
- dialog_vbox = GNOME_DIALOG (ndialog->dialog)->vbox;
- gtk_widget_show (dialog_vbox);
-
- /* Get the identity widget */
- ndialog->page = news_page_new (news);
- service_page_set_url (ndialog->page->page, source);
- gtk_box_pack_start (GTK_BOX (dialog_vbox), ndialog->page->vbox,
- TRUE, TRUE, 0);
-
- service_page_set_undone_cb (ndialog->page->page,
- ndialog_page_undone,
- ndialog);
- service_page_set_done_cb (ndialog->page->page,
- ndialog_page_done,
- ndialog);
- gtk_widget_show (ndialog->page->vbox);
-
- /* Buttons */
- area = GNOME_DIALOG (ndialog->dialog)->action_area;
- gtk_widget_show (area);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (area), GTK_BUTTONBOX_END);
- gtk_button_box_set_spacing (GTK_BUTTON_BOX (area), 8);
-
- gnome_dialog_append_button (GNOME_DIALOG (ndialog->dialog),
- GNOME_STOCK_BUTTON_OK);
- gnome_dialog_append_button (GNOME_DIALOG (ndialog->dialog),
- GNOME_STOCK_BUTTON_CANCEL);
-
- gnome_dialog_set_default (GNOME_DIALOG (ndialog->dialog), 0);
- gnome_dialog_set_default (GNOME_DIALOG (ndialog->dialog), 1);
-
- gnome_dialog_set_sensitive (GNOME_DIALOG (ndialog->dialog), 0, FALSE);
-
- gnome_dialog_button_connect(GNOME_DIALOG (ndialog->dialog), 0,
- GTK_SIGNAL_FUNC (ndialog_ok_clicked),
- ndialog);
-
- /*GDK_THREADS_ENTER ();*/
- gnome_dialog_run_and_close (GNOME_DIALOG (ndialog->dialog));
- /*GDK_THREADS_LEAVE ();*/
-
- returnsource = ndialog->source;
- g_free (ndialog);
-
- return returnsource;
-}
-
-/* Mail configuration druid */
-static gboolean
-mail_druid_prepare (GnomeDruidPage *page, GnomeDruid *druid, gboolean *active)
-{
- gnome_druid_set_buttons_sensitive (druid, TRUE, *active, TRUE);
-
- return FALSE;
-}
-
-static void
-mail_druid_identity_undone (MailDialogIdentityPage *page, gpointer data)
-{
- MailDruidDialog *dialog = (MailDruidDialog *) data;
-
- dialog->iddone = FALSE;
- gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid),
- TRUE, FALSE, TRUE);
-}
-
-static void
-mail_druid_identity_done (MailDialogIdentityPage *page, gpointer data)
-{
- MailDruidDialog *dialog = (MailDruidDialog *) data;
-
- dialog->iddone = TRUE;
- gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid),
- TRUE, TRUE, TRUE);
-}
-
-static void
-mail_druid_source_undone (MailDialogServicePage *page, gpointer data)
-{
- MailDruidDialog *dialog = (MailDruidDialog *) data;
-
- dialog->sdone = FALSE;
- gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid),
- TRUE, FALSE, TRUE);
-}
-
-static void
-mail_druid_source_done (MailDialogServicePage *page, gpointer data)
-{
- MailDruidDialog *dialog = (MailDruidDialog *) data;
-
- dialog->sdone = TRUE;
- gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid),
- TRUE, TRUE, TRUE);
-}
-
-static void
-mail_druid_transport_undone (MailDialogServicePage *page, gpointer data)
-{
- MailDruidDialog *dialog = (MailDruidDialog *) data;
-
- dialog->tdone = FALSE;
- gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid),
- TRUE, FALSE, TRUE);
-}
-
-static void
-mail_druid_transport_done (MailDialogServicePage *page, gpointer data)
-{
- MailDruidDialog *dialog = (MailDruidDialog *) data;
-
- dialog->tdone = TRUE;
- gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid),
- TRUE, TRUE, TRUE);
-}
-
-static void
-mail_druid_cancel (GnomeDruid *druid, GtkWindow *window)
-{
- gtk_window_set_modal (window, FALSE);
- gtk_widget_destroy (GTK_WIDGET (window));
- gtk_main_quit ();
-}
-
-static void
-mail_druid_finish (GnomeDruidPage *page, GnomeDruid *druid,
- MailDruidDialog *dialog)
-{
- MailConfigIdentity *id;
- MailConfigService *source;
- MailConfigService *transport;
-
- mail_config_clear ();
-
- /* Identity */
- id = identity_page_extract (dialog->idpage);
- mail_config_add_identity (id);
-
- /* Source */
- source = service_page_extract (dialog->spage->page);
- mail_config_add_source (source);
-
- /* Transport */
- transport = service_page_extract (dialog->tpage->page);
- mail_config_set_transport (transport);
-
- mail_config_write ();
-
- mail_druid_cancel (druid, GTK_WINDOW (dialog->dialog));
-}
-
-void
-mail_config_druid (void)
-{
- MailDruidDialog *dialog;
- GnomeDruidPageStart *spage;
- GnomeDruidPageFinish *fpage;
- GnomeDruidPageStandard *dpage;
- GSList *sources, *news, *transports;
- GdkImlibImage *mail_logo, *identity_logo;
- GdkImlibImage *source_logo, *transport_logo;
-
- provider_list (&sources, &news, &transports);
-
- mail_logo = load_image ("evolution-inbox.png");
- identity_logo = load_image ("malehead.png");
- source_logo = mail_logo;
- transport_logo = load_image ("envelope.png");
-
- dialog = g_new0 (MailDruidDialog, 1);
- dialog->gui = glade_xml_new (EVOLUTION_GLADEDIR
- "/mail-config-druid.glade", NULL);
- dialog->dialog = glade_xml_get_widget (dialog->gui, "dialog");
- dialog->druid = glade_xml_get_widget (dialog->gui, "druid");
-
- /* Cancel button */
- gtk_signal_connect (GTK_OBJECT (dialog->druid), "cancel",
- GTK_SIGNAL_FUNC (mail_druid_cancel),
- dialog->dialog);
-
- /* Start page */
- spage = GNOME_DRUID_PAGE_START (glade_xml_get_widget (dialog->gui, "startpage"));
- gnome_druid_page_start_set_logo (spage, mail_logo);
-
- /* Identity page */
- dpage = GNOME_DRUID_PAGE_STANDARD (glade_xml_get_widget (dialog->gui, "standardpage1"));
- gnome_druid_page_standard_set_logo (dpage, identity_logo);
-
- dialog->idpage = identity_page_new (NULL);
- gtk_box_pack_start (GTK_BOX (dpage->vbox),
- dialog->idpage->vbox,
- TRUE, TRUE, 0);
-
- identity_page_set_undone_cb (dialog->idpage,
- mail_druid_identity_undone,
- dialog);
- identity_page_set_done_cb (dialog->idpage,
- mail_druid_identity_done,
- dialog);
- gtk_signal_connect (GTK_OBJECT (dpage), "prepare",
- GTK_SIGNAL_FUNC (mail_druid_prepare),
- &dialog->iddone);
- gtk_widget_show (dialog->idpage->vbox);
-
- /* Source page */
- dpage = GNOME_DRUID_PAGE_STANDARD (glade_xml_get_widget (dialog->gui, "standardpage2"));
- gnome_druid_page_standard_set_logo (dpage, source_logo);
-
- dialog->spage = source_page_new (sources);
- gtk_box_pack_start (GTK_BOX (dpage->vbox),
- dialog->spage->vbox,
- TRUE, TRUE, 0);
-
- service_page_set_done_cb (dialog->spage->page,
- mail_druid_source_done,
- dialog);
- service_page_set_undone_cb (dialog->spage->page,
- mail_druid_source_undone,
- dialog);
- gtk_signal_connect (GTK_OBJECT (dpage), "prepare",
- GTK_SIGNAL_FUNC (mail_druid_prepare),
- &dialog->sdone);
-
- /* In case its already done */
- service_page_item_changed (dialog->spage->page->spitem->item,
- dialog->spage->page);
-
- gtk_widget_show (dialog->spage->vbox);
-
- /* Transport page */
- dpage = GNOME_DRUID_PAGE_STANDARD (glade_xml_get_widget (dialog->gui, "standardpage3"));
- gnome_druid_page_standard_set_logo (dpage, transport_logo);
-
- dialog->tpage = transport_page_new (transports);
- gtk_box_pack_start (GTK_BOX (dpage->vbox),
- dialog->tpage->vbox,
- TRUE, TRUE, 0);
-
- service_page_set_undone_cb (dialog->tpage->page,
- mail_druid_transport_undone,
- dialog);
- service_page_set_done_cb (dialog->tpage->page,
- mail_druid_transport_done,
- dialog);
- gtk_signal_connect (GTK_OBJECT (dpage), "prepare",
- GTK_SIGNAL_FUNC (mail_druid_prepare),
- &dialog->tdone);
-
- /* In case its already as done as it needs to be */
- service_page_item_changed (dialog->tpage->page->spitem->item,
- dialog->tpage->page);
-
- gtk_widget_show (dialog->tpage->vbox);
-
-
- /* Finish page */
- fpage = GNOME_DRUID_PAGE_FINISH (glade_xml_get_widget (dialog->gui, "finishpage"));
- gnome_druid_page_finish_set_logo (fpage, mail_logo);
-
- gtk_signal_connect (GTK_OBJECT (fpage), "finish",
- GTK_SIGNAL_FUNC (mail_druid_finish),
- dialog);
-
- /* GDK_THREADS_ENTER (); */
- gtk_main ();
- /* GDK_THREADS_LEAVE (); */
-}
-
-/* Main configuration dialog */
-static void
-identities_select_row (GtkWidget *widget, gint row, gint column,
- GdkEventButton *event, MailDialog *dialog)
-{
- dialog->idrow = row;
-}
-
-static void
-identities_add_clicked (GtkWidget *widget, MailDialog *dialog)
-{
- MailConfigIdentity *id;
-
- id = identity_dialog (NULL, dialog->dialog);
- if (id) {
- GtkWidget *clist = dialog->clistIdentities;
- gchar *text[4];
- gint row = 0;
-
- text[0] = id->name;
- text[1] = id->address;
- text[2] = id->org;
- text[3] = id->sig;
-
- row = gtk_clist_append (GTK_CLIST (clist), text);
- gtk_clist_set_row_data (GTK_CLIST (clist), row, id);
- gtk_clist_select_row (GTK_CLIST (clist), row, 0);
- dialog->maxidrow++;
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
- }
-}
-
-static void
-identities_edit_clicked (GtkWidget *widget, MailDialog *dialog)
-{
- MailConfigIdentity *id, *id2;
-
- if (dialog->idrow < 0)
- return;
-
- id = gtk_clist_get_row_data (GTK_CLIST (dialog->clistIdentities),
- dialog->idrow);
-
- id2 = identity_dialog (id, dialog->dialog);
- if (id2) {
- GtkCList *clist = GTK_CLIST (dialog->clistIdentities);
-
- gtk_clist_set_text (clist, dialog->idrow, 0, id2->name);
- gtk_clist_set_text (clist, dialog->idrow, 1, id2->address);
- gtk_clist_set_text (clist, dialog->idrow, 2, id2->org);
- gtk_clist_set_text (clist, dialog->idrow, 3, id2->sig);
-
- gtk_clist_set_row_data (clist, dialog->idrow, id2);
- identity_destroy (id);
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
- }
-}
-
-static void
-identities_delete_clicked (GtkWidget *widget, MailDialog *dialog)
-{
- GtkCList *clist;
-
- if (dialog->idrow == -1)
- return;
-
- clist = GTK_CLIST (dialog->clistIdentities);
-
- gtk_clist_remove (clist, dialog->idrow);
- dialog->maxidrow--;
-
- if (dialog->idrow > dialog->maxidrow)
- gtk_clist_select_row (clist, dialog->maxidrow, 0);
- else
- gtk_clist_select_row (clist, dialog->idrow, 0);
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
-}
-
-static void
-sources_select_row (GtkWidget *widget, gint row, gint column,
- GdkEventButton *event, MailDialog *dialog)
-{
- dialog->srow = row;
-}
-
-static void
-sources_add_clicked (GtkWidget *widget, MailDialog *dialog)
-{
- MailConfigService *source;
-
- source = source_dialog (NULL, dialog->dialog);
- if (source) {
- GtkCList *clist = GTK_CLIST (dialog->clistSources);
- gchar *text[1];
- gint row = 0;
-
- text[0] = source->url;
-
- row = gtk_clist_append (clist, text);
- gtk_clist_set_row_data (clist, row, source);
- gtk_clist_select_row (clist, row, 0);
- dialog->maxsrow++;
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
- }
-}
-
-static void
-sources_edit_clicked (GtkWidget *widget, MailDialog *dialog)
-{
- MailConfigService *source, *source2;
-
- if (dialog->srow < 0)
- return;
-
- source = gtk_clist_get_row_data (GTK_CLIST (dialog->clistSources),
- dialog->srow);
-
- source2 = source_dialog (source, dialog->dialog);
- if (source2) {
- GtkCList *clist = GTK_CLIST (dialog->clistSources);
-
- gtk_clist_set_text (clist, dialog->srow, 0, source2->url);
- gtk_clist_set_row_data (clist, dialog->srow, source2);
- service_destroy (source);
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
- }
-}
-
-static void
-sources_delete_clicked (GtkWidget *widget, MailDialog *dialog)
-{
- GtkCList *clist;
-
- if (dialog->srow == -1)
- return;
-
- clist = GTK_CLIST (dialog->clistSources);
-
- gtk_clist_remove (clist, dialog->srow);
- dialog->maxsrow--;
-
- if (dialog->srow > dialog->maxsrow)
- gtk_clist_select_row (clist, dialog->maxsrow, 0);
- else
- gtk_clist_select_row (clist, dialog->srow, 0);
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
-}
-
-static void
-news_select_row (GtkWidget *widget, gint row, gint column,
- GdkEventButton *event, MailDialog *dialog)
-{
- dialog->nrow = row;
-}
-
-static void
-news_add_clicked (GtkWidget *widget, MailDialog *dialog)
-{
- MailConfigService *news;
-
- news = news_dialog (NULL, dialog->dialog);
- if (news) {
- GtkCList *clist = GTK_CLIST (dialog->clistNews);
- gchar *text[1];
- gint row = 0;
-
- text[0] = news->url;
-
- row = gtk_clist_append (clist, text);
- gtk_clist_set_row_data (clist, row, news);
- gtk_clist_select_row (clist, row, 0);
- dialog->maxnrow++;
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
- }
-}
-
-static void
-news_edit_clicked (GtkWidget *widget, MailDialog *dialog)
-{
- MailConfigService *news, *news2;
-
- if (dialog->nrow < 0)
- return;
-
- news = gtk_clist_get_row_data (GTK_CLIST (dialog->clistNews),
- dialog->nrow);
-
- news2 = news_dialog (news, dialog->dialog);
- if (news2) {
- GtkCList *clist = GTK_CLIST (dialog->clistNews);
-
- gtk_clist_set_text (clist, dialog->nrow, 0, news2->url);
- gtk_clist_set_row_data (clist, dialog->nrow, news2);
- service_destroy (news);
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
- }
-}
-
-static void
-news_delete_clicked (GtkWidget *widget, MailDialog *dialog)
-{
- GtkCList *clist;
-
- if (dialog->nrow == -1)
- return;
-
- clist = GTK_CLIST (dialog->clistNews);
-
- gtk_clist_remove (clist, dialog->nrow);
- dialog->maxnrow--;
-
- if (dialog->nrow > dialog->maxnrow)
- gtk_clist_select_row (clist, dialog->maxnrow, 0);
- else
- gtk_clist_select_row (clist, dialog->nrow, 0);
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
-}
-
-static void
-mail_config_tpage_changed (MailDialogServicePage *page, gpointer data)
-{
- MailDialog *dialog = (MailDialog *)data;
-
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
-}
-
-static void
-mail_config_tpage_done (MailDialogServicePage *page, gpointer data)
-{
- MailDialog *dialog = (MailDialog *)data;
-
- dialog->tpagedone = TRUE;
-}
-
-static void
-format_toggled (GtkWidget *widget, MailDialog *dialog)
-{
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
-}
-
-static void
-timeout_changed (GtkWidget *widget, MailDialog *dialog)
-{
- gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog));
-}
-
-static void
-mail_config_apply_clicked (GnomePropertyBox *property_box,
- gint page_num,
- MailDialog *dialog)
-{
- GtkCList *clist;
- GtkToggleButton *chk;
- GtkSpinButton *spin;
- MailConfigService *t;
- gboolean send_html;
- gpointer data;
- glong seen_timeout;
- int i;
-
- if (page_num != -1)
- return;
-
- mail_config_clear ();
-
- /* Identities */
- for (i = 0; i <= dialog->maxidrow; i++) {
- clist = GTK_CLIST (dialog->clistIdentities);
-
- data = gtk_clist_get_row_data (clist, i);
- mail_config_add_identity ((MailConfigIdentity *) data);
- }
-
- /* Sources */
- for (i = 0; i <= dialog->maxsrow; i++) {
- clist = GTK_CLIST (dialog->clistSources);
-
- data = gtk_clist_get_row_data (clist, i);
- mail_config_add_source ((MailConfigService *) data);
- }
-
- /* Transport */
- t = service_page_extract (dialog->page->page);
- mail_config_set_transport (t);
-
- /* News */
- for (i = 0; i <= dialog->maxnrow; i++) {
- clist = GTK_CLIST (dialog->clistNews);
-
- data = gtk_clist_get_row_data (clist, i);
- mail_config_add_news ((MailConfigService *) data);
- }
-
- /* Format */
- chk = GTK_TOGGLE_BUTTON (dialog->chkFormat);
- send_html = gtk_toggle_button_get_active (chk);
- mail_config_set_send_html (send_html);
-
- /* Mark as seen timeout */
- spin = GTK_SPIN_BUTTON (dialog->spinTimeout);
- seen_timeout = gtk_spin_button_get_value_as_int (spin);
- mail_config_set_mark_as_seen_timeout (seen_timeout);
-
- mail_config_write ();
-}
-
-void
-mail_config (void)
-{
- MailDialog *dialog;
- GladeXML *gui;
- MailConfigService *transport;
- GtkCList *clist;
- GtkWidget *button, *tvbox;
- GSList *l, *sources, *news, *transports;
-
- provider_list (&sources, &news, &transports);
-
- dialog = g_new0 (MailDialog, 1);
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/mail-config.glade", NULL);
-
- dialog->dialog = glade_xml_get_widget (gui, "dialog");
- dialog->notebook = glade_xml_get_widget (gui, "notebook");
-
- /* Identities Page */
- dialog->clistIdentities =
- glade_xml_get_widget (gui, "clistIdentities");
- clist = GTK_CLIST (dialog->clistIdentities);
- gtk_clist_set_column_width (clist, 0, 80);
-
- l = mail_config_get_identities ();
-
- dialog->maxidrow = g_slist_length (l) - 1;
- dialog->idrow = -1;
-
- for (; l != NULL; l = l->next) {
- MailConfigIdentity *id;
- gint row;
- gchar *text[4];
-
- id = identity_copy ((MailConfigIdentity *)l->data);
-
- text[0] = id->name;
- text[1] = id->address;
- text[2] = id->org;
- text[3] = id->sig;
-
- row = gtk_clist_append (clist, text);
- gtk_clist_set_row_data (clist, row, id);
- }
-
- gtk_signal_connect (GTK_OBJECT (clist), "select_row",
- GTK_SIGNAL_FUNC (identities_select_row),
- dialog);
-
- button = glade_xml_get_widget (gui, "cmdIdentitiesAdd");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (identities_add_clicked),
- dialog);
- button = glade_xml_get_widget (gui, "cmdIdentitiesEdit");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (identities_edit_clicked),
- dialog);
- button = glade_xml_get_widget (gui, "cmdIdentitiesDelete");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (identities_delete_clicked),
- dialog);
-
- /* Sources Page */
- dialog->clistSources = glade_xml_get_widget (gui, "clistSources");
- clist = GTK_CLIST (dialog->clistSources);
- gtk_clist_set_column_width (clist, 0, 80);
-
- l = mail_config_get_sources ();
-
- dialog->maxsrow = g_slist_length (l) - 1;
- dialog->srow = -1;
-
- for (; l != NULL; l = l->next) {
- MailConfigService *source;
- gint row;
- gchar *text[1];
-
- source = service_copy ((MailConfigService *)l->data);
-
- text[0] = source->url;
-
- row = gtk_clist_append (clist, text);
- gtk_clist_set_row_data (clist, row, source);
- }
-
- gtk_signal_connect (GTK_OBJECT (clist), "select_row",
- GTK_SIGNAL_FUNC (sources_select_row),
- dialog);
-
- button = glade_xml_get_widget (gui, "cmdSourcesAdd");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (sources_add_clicked),
- dialog);
- button = glade_xml_get_widget (gui, "cmdSourcesEdit");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (sources_edit_clicked),
- dialog);
- button = glade_xml_get_widget (gui, "cmdSourcesDelete");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (sources_delete_clicked),
- dialog);
-
- /* News Page */
- dialog->clistNews = glade_xml_get_widget (gui, "clistNews");
- clist = GTK_CLIST (dialog->clistNews);
- gtk_clist_set_column_width (clist, 0, 80);
-
- l = mail_config_get_news ();
-
- dialog->maxnrow = g_slist_length (l) - 1;
- dialog->nrow = -1;
-
- for (; l != NULL; l = l->next) {
- MailConfigService *news;
- gint row;
- gchar *text[1];
-
- news = service_copy ((MailConfigService *)l->data);
-
- text[0] = news->url;
-
- row = gtk_clist_append (clist, text);
- gtk_clist_set_row_data (clist, row, news);
- }
-
- gtk_signal_connect (GTK_OBJECT (clist), "select_row",
- GTK_SIGNAL_FUNC (news_select_row),
- dialog);
-
- button = glade_xml_get_widget (gui, "cmdNewsServersAdd");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (news_add_clicked),
- dialog);
- button = glade_xml_get_widget (gui, "cmdNewsServersEdit");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (news_edit_clicked),
- dialog);
- button = glade_xml_get_widget (gui, "cmdNewsServersDelete");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (news_delete_clicked),
- dialog);
-
- /* Transport Page */
- tvbox = glade_xml_get_widget (gui, "transport_vbox");
- dialog->page = transport_page_new (transports);
- transport = mail_config_get_transport ();
- service_page_set_url (dialog->page->page, transport);
- service_page_set_changed_cb (dialog->page->page,
- mail_config_tpage_changed, dialog);
- service_page_set_done_cb (dialog->page->page,
- mail_config_tpage_done, dialog);
- gtk_box_pack_start (GTK_BOX (tvbox),
- dialog->page->vbox, TRUE, TRUE, 0);
- gtk_widget_show (dialog->page->vbox);
-
- /* Other Page */
- dialog->chkFormat = glade_xml_get_widget (gui, "chkFormat");
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->chkFormat),
- mail_config_send_html ());
- gtk_signal_connect (GTK_OBJECT (dialog->chkFormat), "toggled",
- GTK_SIGNAL_FUNC (format_toggled),
- dialog);
-
- dialog->spinTimeout = glade_xml_get_widget (gui, "spinTimeout");
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->spinTimeout),
- mail_config_mark_as_seen_timeout ());
-
- gtk_signal_connect (GTK_OBJECT (dialog->spinTimeout), "changed",
- GTK_SIGNAL_FUNC (timeout_changed),
- dialog);
-
- /* Listen for apply signal */
- gtk_signal_connect (GTK_OBJECT (dialog->dialog), "apply",
- GTK_SIGNAL_FUNC (mail_config_apply_clicked),
- dialog);
-
- GDK_THREADS_ENTER ();
- gnome_dialog_run (GNOME_DIALOG (dialog->dialog));
- GDK_THREADS_LEAVE ();
-
- /* Clean up */
- gtk_object_unref (GTK_OBJECT (gui));
- g_free (dialog);
-}
-
-/* ************************************************************************ */
-
-typedef struct test_service_input_s {
- gchar *url;
- CamelProviderType type;
-} test_service_input_t;
-
-typedef struct test_service_data_s {
- gboolean success;
-} test_service_data_t;
-
-static gchar *describe_test_service (gpointer in_data, gboolean gerund);
-static void setup_test_service (gpointer in_data, gpointer op_data, CamelException *ex);
-static void do_test_service (gpointer in_data, gpointer op_data, CamelException *ex);
-static void cleanup_test_service (gpointer in_data, gpointer op_data, CamelException *ex);
-
-static gchar *describe_test_service (gpointer in_data, gboolean gerund)
-{
- test_service_input_t *input = (test_service_input_t *) in_data;
-
- if (gerund) {
- return g_strdup_printf ("Testing \"%s\"", input->url);
- } else {
- return g_strdup_printf ("Test connection to \"%s\"", input->url);
- }
-}
-
-static void setup_test_service (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- test_service_input_t *input = (test_service_input_t *) in_data;
- test_service_data_t *data = (test_service_data_t *) op_data;
-
- if (!input->url) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No URL was provided to test");
- return;
- }
-
- data->success = FALSE;
-}
-
-static void do_test_service (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- test_service_input_t *input = (test_service_input_t *) in_data;
- test_service_data_t *data = (test_service_data_t *) op_data;
-
- CamelService *service;
-
- service = camel_session_get_service (session, input->url,
- input->type, ex);
-
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- data->success = FALSE;
- } else if (camel_service_connect (service, ex)) {
- camel_service_disconnect (service, ex);
- data->success = TRUE;
- } else {
- data->success = FALSE;
- }
-
- camel_object_unref (CAMEL_OBJECT (service));
-}
-
-static void cleanup_test_service (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- test_service_input_t *input = (test_service_input_t *) in_data;
- test_service_data_t *data = (test_service_data_t *) op_data;
-
- GtkWidget *dlg;
-
- if (data->success) {
- dlg = gnome_ok_dialog (_("The connection was successful!"));
- gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
- }
-
- g_free (input->url);
-}
-
-static const mail_operation_spec op_test_service = {
- describe_test_service,
- sizeof (test_service_data_t),
- setup_test_service,
- do_test_service,
- cleanup_test_service
-};
-
-static void
-config_do_test_service (const char *url, CamelProviderType type)
-{
- test_service_input_t *input;
-
- input = g_new (test_service_input_t, 1);
- input->url = g_strdup (url);
- input->type = type;
-
- mail_operation_queue (&op_test_service, input, TRUE);
-}
diff --git a/mail/mail-config-gui.h b/mail/mail-config-gui.h
deleted file mode 100644
index be122966fc..0000000000
--- a/mail/mail-config-gui.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Copyright 2000, Helix Code, Inc. (http://www.helixcode.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 _MAIL_CONFIG_GUI_H
-#define _MAIL_CONFIG_GUI_H
-
-#include <glib.h>
-
-void mail_config (void);
-void mail_config_druid (void);
-
-#endif
diff --git a/mail/mail-config.c b/mail/mail-config.c
deleted file mode 100644
index da9629488e..0000000000
--- a/mail/mail-config.c
+++ /dev/null
@@ -1,549 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* mail-config.c: Mail configuration dialogs/wizard. */
-
-/*
- * Authors:
- * Dan Winship <danw@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- * JP Rosevear <jpr@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include <pwd.h>
-
-#include <gnome.h>
-#include <gtkhtml/gtkhtml.h>
-#include <glade/glade.h>
-
-#include "e-util/e-html-utils.h"
-#include "mail.h"
-#include "mail-config.h"
-
-typedef struct
-{
- gboolean configured;
- GSList *ids;
- GSList *sources;
- GSList *news;
- MailConfigService *transport;
-
- gboolean thread_list;
- gint paned_size;
- gboolean send_html;
- gint seen_timeout;
-} MailConfig;
-
-static const char GCONFPATH[] = "/apps/Evolution/Mail";
-static MailConfig *config = NULL;
-
-/* Prototypes */
-static void config_read (void);
-
-/* Identity struct */
-MailConfigIdentity *
-identity_copy (MailConfigIdentity *id)
-{
- MailConfigIdentity *newid;
-
- g_return_val_if_fail (id, NULL);
-
- newid = g_new0 (MailConfigIdentity, 1);
- newid->name = g_strdup (id->name);
- newid->address = g_strdup (id->address);
- newid->org = g_strdup (id->org);
- newid->sig = g_strdup (id->sig);
-
- return newid;
-}
-
-void
-identity_destroy (MailConfigIdentity *id)
-{
- if (!id)
- return;
-
- g_free (id->name);
- g_free (id->address);
- g_free (id->org);
- g_free (id->sig);
-
- g_free (id);
-}
-
-void
-identity_destroy_each (gpointer item, gpointer data)
-{
- identity_destroy ((MailConfigIdentity *)item);
-}
-
-/* Service struct */
-MailConfigService *
-service_copy (MailConfigService *source)
-{
- MailConfigService *newsource;
-
- g_return_val_if_fail (source, NULL);
-
- newsource = g_new0 (MailConfigService, 1);
- newsource->url = g_strdup (source->url);
- newsource->keep_on_server = source->keep_on_server;
-
- return newsource;
-}
-
-void
-service_destroy (MailConfigService *source)
-{
- if (!source)
- return;
-
- g_free (source->url);
-
- g_free (source);
-}
-
-void
-service_destroy_each (gpointer item, gpointer data)
-{
- service_destroy ((MailConfigService *)item);
-}
-
-/* Config struct routines */
-void
-mail_config_init (void)
-{
- if (config)
- return;
-
- config = g_new0 (MailConfig, 1);
-
- config->ids = NULL;
- config->sources = NULL;
- config->transport = NULL;
-
- config_read ();
-}
-
-void
-mail_config_clear (void)
-{
- if (!config)
- return;
-
- if (config->ids) {
- g_slist_foreach (config->ids, identity_destroy_each, NULL);
- g_slist_free (config->ids);
- config->ids = NULL;
- }
-
- if (config->sources) {
- g_slist_foreach (config->sources, service_destroy_each, NULL);
- g_slist_free (config->sources);
- config->sources = NULL;
- }
-
- service_destroy (config->transport);
- config->transport = NULL;
-
- if (config->news) {
- g_slist_foreach (config->news, service_destroy_each, NULL);
- g_slist_free (config->news);
- config->news = NULL;
- }
-}
-
-static void
-config_read (void)
-{
- gchar *str;
- gint len, i;
-
- mail_config_clear ();
-
- /* Configured */
- str = g_strdup_printf ("=%s/config/General=/General/configured", evolution_dir);
- config->configured = gnome_config_get_bool (str);
- g_free (str);
-
- /* Identities */
- str = g_strdup_printf ("=%s/config/Mail=/Identities/", evolution_dir);
- gnome_config_push_prefix (str);
- g_free (str);
-
- len = gnome_config_get_int ("num");
- for (i = 0; i < len; i++) {
- MailConfigIdentity *id;
- gchar *path;
-
- id = g_new0 (MailConfigIdentity, 1);
-
- path = g_strdup_printf ("name_%d", i);
- id->name = gnome_config_get_string (path);
- g_free (path);
- path = g_strdup_printf ("address_%d", i);
- id->address = gnome_config_get_string (path);
- g_free (path);
- path = g_strdup_printf ("org_%d", i);
- id->org = gnome_config_get_string (path);
- g_free (path);
- path = g_strdup_printf ("sig_%d", i);
- id->sig = gnome_config_get_string (path);
- g_free (path);
-
- config->ids = g_slist_append (config->ids, id);
- }
- gnome_config_pop_prefix ();
-
- /* Sources */
- str = g_strdup_printf ("=%s/config/Mail=/Sources/", evolution_dir);
- gnome_config_push_prefix (str);
- g_free (str);
-
- len = gnome_config_get_int ("num");
- for (i = 0; i < len; i++) {
- MailConfigService *s;
- gchar *path;
-
- s = g_new0 (MailConfigService, 1);
-
- path = g_strdup_printf ("url_%d", i);
- s->url = gnome_config_get_string (path);
- g_free (path);
- path = g_strdup_printf ("keep_on_server_%d", i);
- s->keep_on_server = gnome_config_get_bool (path);
- g_free (path);
-
- config->sources = g_slist_append (config->sources, s);
- }
- gnome_config_pop_prefix ();
-
- /* News */
- str = g_strdup_printf ("=%s/config/News=/Sources/", evolution_dir);
- gnome_config_push_prefix (str);
- g_free (str);
-
- len = gnome_config_get_int ("num");
- for (i = 0; i < len; i++) {
- MailConfigService *n;
- gchar *path;
-
- n = g_new0 (MailConfigService, 1);
-
- path = g_strdup_printf ("url_%d", i);
- n->url = gnome_config_get_string (path);
- g_free (path);
-
- config->news = g_slist_append (config->news, n);
- }
- gnome_config_pop_prefix ();
-
- /* Transport */
- config->transport = g_new0 (MailConfigService, 1);
- str = g_strdup_printf ("=%s/config/Mail=/Transport/url",
- evolution_dir);
- config->transport->url = gnome_config_get_string (str);
- g_free (str);
-
- /* Format */
- str = g_strdup_printf ("=%s/config/Mail=/Format/send_html",
- evolution_dir);
- config->send_html = gnome_config_get_bool (str);
- g_free (str);
-
- /* Mark as seen timeout */
- str = g_strdup_printf ("=%s/config/Mail=/Display/seen_timeout=1500",
- evolution_dir);
- config->seen_timeout = gnome_config_get_int (str);
- g_free (str);
-
- /* Show Messages Threaded */
- str = g_strdup_printf ("=%s/config/Mail=/Display/thread_list",
- evolution_dir);
- config->thread_list = gnome_config_get_bool (str);
- g_free (str);
-
- /* Size of vpaned in mail view */
- str = g_strdup_printf ("=%s/config/Mail=/Display/paned_size=200",
- evolution_dir);
- config->paned_size = gnome_config_get_int (str);
- g_free (str);
-
- gnome_config_sync ();
-}
-
-void
-mail_config_write (void)
-{
- gchar *str;
- gint len, i;
-
- /* Configured switch */
- str = g_strdup_printf ("=%s/config/General=/General/configured",
- evolution_dir);
- config->configured = TRUE;
- gnome_config_set_bool (str, config->configured);
- g_free (str);
-
- /* Identities */
- str = g_strdup_printf ("=%s/config/Mail=/Identities/", evolution_dir);
- gnome_config_push_prefix (str);
- g_free (str);
-
- len = g_slist_length (config->ids);
- gnome_config_set_int ("num", len);
- for (i = 0; i < len; i++) {
- MailConfigIdentity *id;
- gchar *path;
-
- id = (MailConfigIdentity *)g_slist_nth_data (config->ids, i);
-
- path = g_strdup_printf ("name_%d", i);
- gnome_config_set_string (path, id->name);
- g_free (path);
- path = g_strdup_printf ("address_%d", i);
- gnome_config_set_string (path, id->address);
- g_free (path);
- path = g_strdup_printf ("org_%d", i);
- gnome_config_set_string (path, id->org);
- g_free (path);
- path = g_strdup_printf ("sig_%d", i);
- gnome_config_set_string (path, id->sig);
- g_free (path);
- }
- gnome_config_pop_prefix ();
-
- /* Sources */
- str = g_strdup_printf ("=%s/config/Mail=/Sources/", evolution_dir);
- gnome_config_push_prefix (str);
- g_free (str);
-
- len = g_slist_length (config->sources);
- gnome_config_set_int ("num", len);
- for (i=0; i<len; i++) {
- MailConfigService *s;
- gchar *path;
-
- s = (MailConfigService *)g_slist_nth_data (config->sources, i);
-
- path = g_strdup_printf ("url_%d", i);
- gnome_config_set_string (path, s->url);
- g_free (path);
- path = g_strdup_printf ("keep_on_server_%d", i);
- gnome_config_set_bool (path, s->keep_on_server);
- g_free (path);
- }
- gnome_config_pop_prefix ();
-
- /* News */
- str = g_strdup_printf ("=%s/config/News=/Sources/", evolution_dir);
- gnome_config_push_prefix (str);
- g_free (str);
-
- len = g_slist_length (config->news);
- gnome_config_set_int ("num", len);
- for (i=0; i<len; i++) {
- MailConfigService *n;
- gchar *path;
-
- n = (MailConfigService *)g_slist_nth_data (config->news, i);
-
- path = g_strdup_printf ("url_%d", i);
- gnome_config_set_string (path, n->url);
- g_free (path);
- }
- gnome_config_pop_prefix ();
-
- /* Transport */
- str = g_strdup_printf ("=%s/config/Mail=/Transport/url",
- evolution_dir);
- gnome_config_set_string (str, config->transport->url);
- g_free (str);
-
- /* Mark as seen timeout */
- str = g_strdup_printf ("=%s/config/Mail=/Display/seen_timeout",
- evolution_dir);
- gnome_config_set_int (str, config->seen_timeout);
- g_free (str);
-
- /* Format */
- str = g_strdup_printf ("=%s/config/Mail=/Format/send_html",
- evolution_dir);
- gnome_config_set_bool (str, config->send_html);
- g_free (str);
-
- gnome_config_sync ();
-}
-
-void
-mail_config_write_on_exit (void)
-{
- gchar *str;
-
- /* Show Messages Threaded */
- str = g_strdup_printf ("=%s/config/Mail=/Display/thread_list",
- evolution_dir);
- gnome_config_set_bool (str, config->thread_list);
- g_free (str);
-
- /* Size of vpaned in mail view */
- str = g_strdup_printf ("=%s/config/Mail=/Display/paned_size",
- evolution_dir);
- gnome_config_set_int (str, config->paned_size);
- g_free (str);
-
- gnome_config_sync ();
-}
-
-/* Accessor functions */
-gboolean
-mail_config_is_configured (void)
-{
- return config->configured;
-}
-
-gboolean
-mail_config_thread_list (void)
-{
- return config->thread_list;
-}
-
-void
-mail_config_set_thread_list (gboolean value)
-{
- config->thread_list = value;
-}
-
-gint
-mail_config_paned_size (void)
-{
- return config->paned_size;
-}
-
-void
-mail_config_set_paned_size (gint value)
-{
- config->paned_size = value;
-}
-
-gboolean
-mail_config_send_html (void)
-{
- return config->send_html;
-}
-
-void
-mail_config_set_send_html (gboolean send_html)
-{
- config->send_html = send_html;
-}
-
-gint
-mail_config_mark_as_seen_timeout (void)
-{
- return config->seen_timeout;
-}
-
-void
-mail_config_set_mark_as_seen_timeout (gint timeout)
-{
- config->seen_timeout = timeout;
-}
-
-MailConfigIdentity *
-mail_config_get_default_identity (void)
-{
- if (!config->ids)
- return NULL;
-
- return (MailConfigIdentity *)config->ids->data;
-}
-
-GSList *
-mail_config_get_identities (void)
-{
- return config->ids;
-}
-
-void
-mail_config_add_identity (MailConfigIdentity *id)
-{
- config->ids = g_slist_append (config->ids, id);
-}
-
-MailConfigService *
-mail_config_get_default_source (void)
-{
- if (!config->sources)
- return NULL;
-
- return (MailConfigService *)config->sources->data;
-}
-
-GSList *
-mail_config_get_sources (void)
-{
- return config->sources;
-}
-
-void
-mail_config_add_source (MailConfigService *source)
-{
- config->sources = g_slist_append (config->sources, source);
-}
-
-MailConfigService *
-mail_config_get_transport (void)
-{
- return config->transport;
-}
-
-void
-mail_config_set_transport (MailConfigService *transport)
-{
- if (config->transport)
- service_destroy (config->transport);
-
- config->transport = transport;
-}
-
-MailConfigService *
-mail_config_get_default_news (void)
-{
- if (!config->news)
- return NULL;
-
- return (MailConfigService *)config->news->data;
-}
-
-GSList *
-mail_config_get_news (void)
-{
- return config->news;
-}
-
-void
-mail_config_add_news (MailConfigService *news)
-{
- config->news = g_slist_append (config->news, news);
-}
-
-
-
-
diff --git a/mail/mail-config.glade b/mail/mail-config.glade
deleted file mode 100644
index f3f797a3b5..0000000000
--- a/mail/mail-config.glade
+++ /dev/null
@@ -1,496 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>config</name>
- <program_name>config</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>mail-config.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomePropertyBox</class>
- <name>dialog</name>
- <width>460</width>
- <height>360</height>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
-
- <widget>
- <class>GtkNotebook</class>
- <child_name>GnomePropertyBox:notebook</child_name>
- <name>notebook</name>
- <can_focus>True</can_focus>
- <show_tabs>True</show_tabs>
- <show_border>True</show_border>
- <tab_pos>GTK_POS_TOP</tab_pos>
- <scrollable>False</scrollable>
- <tab_hborder>2</tab_hborder>
- <tab_vborder>2</tab_vborder>
- <popup_enable>False</popup_enable>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox4</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow4</name>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>clistIdentities</name>
- <can_focus>True</can_focus>
- <columns>4</columns>
- <column_widths>80,80,80,80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>True</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label27</name>
- <label>Identities</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label28</name>
- <label>Address</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label29</name>
- <label>Organization</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label30</name>
- <label>Signature File</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVButtonBox</class>
- <name>vbuttonbox4</name>
- <layout_style>GTK_BUTTONBOX_START</layout_style>
- <spacing>5</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>cmdIdentitiesAdd</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Add</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>cmdIdentitiesEdit</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Edit</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>cmdIdentitiesDelete</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Delete</label>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label1</name>
- <label>Identities</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox5</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow5</name>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>clistSources</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>True</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label31</name>
- <label>Sources</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVButtonBox</class>
- <name>vbuttonbox5</name>
- <layout_style>GTK_BUTTONBOX_START</layout_style>
- <spacing>5</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>cmdSourcesAdd</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Add</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>cmdSourcesEdit</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Edit</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>cmdSourcesDelete</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Delete</label>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label2</name>
- <label>Mail Sources</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>transport_vbox</name>
- <border_width>8</border_width>
- <homogeneous>False</homogeneous>
- <spacing>5</spacing>
-
- <widget>
- <class>Placeholder</class>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label25</name>
- <label>Mail Transport</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox6</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow6</name>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkCList</class>
- <name>clistNews</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>True</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label33</name>
- <label>News Servers</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVButtonBox</class>
- <name>vbuttonbox6</name>
- <layout_style>GTK_BUTTONBOX_START</layout_style>
- <spacing>5</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>cmdNewsServersAdd</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Add</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>cmdNewsServersEdit</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Edit</label>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>cmdNewsServersDelete</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <label>Delete</label>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label26</name>
- <label>News Sources</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox3</name>
- <border_width>8</border_width>
- <homogeneous>False</homogeneous>
- <spacing>5</spacing>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>chkFormat</name>
- <can_focus>True</can_focus>
- <label>Send messages in HTML format</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkHBox</class>
- <name>hbox7</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>labelTimeout</name>
- <label>Mark message as seen [ms]: </label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkSpinButton</class>
- <name>spinTimeout</name>
- <can_focus>True</can_focus>
- <climb_rate>1</climb_rate>
- <digits>0</digits>
- <numeric>True</numeric>
- <update_policy>GTK_UPDATE_ALWAYS</update_policy>
- <snap>False</snap>
- <wrap>False</wrap>
- <value>1500</value>
- <lower>0</lower>
- <upper>10000</upper>
- <step>100</step>
- <page>1000</page>
- <page_size>1000</page_size>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>Notebook:tab</child_name>
- <name>label32</name>
- <label>Other</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/mail/mail-config.glade.h b/mail/mail-config.glade.h
deleted file mode 100644
index f1daaa4cbc..0000000000
--- a/mail/mail-config.glade.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Identities");
-gchar *s = N_("Address");
-gchar *s = N_("Organization");
-gchar *s = N_("Signature File");
-gchar *s = N_("Add");
-gchar *s = N_("Edit");
-gchar *s = N_("Delete");
-gchar *s = N_("Identities");
-gchar *s = N_("Sources");
-gchar *s = N_("Add");
-gchar *s = N_("Edit");
-gchar *s = N_("Delete");
-gchar *s = N_("Mail Sources");
-gchar *s = N_("Mail Transport");
-gchar *s = N_("News Servers");
-gchar *s = N_("Add");
-gchar *s = N_("Edit");
-gchar *s = N_("Delete");
-gchar *s = N_("News Sources");
-gchar *s = N_("Send messages in HTML format");
-gchar *s = N_("Mark message as seen [ms]: ");
-gchar *s = N_("Other");
diff --git a/mail/mail-config.h b/mail/mail-config.h
deleted file mode 100644
index f716373dce..0000000000
--- a/mail/mail-config.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Copyright 2000, Helix Code, Inc. (http://www.helixcode.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 _MAIL_CONFIG_H
-#define _MAIL_CONFIG_H
-
-
-
-#include <glib.h>
-
-typedef struct
-{
- gchar *name;
- gchar *address;
- gchar *org;
- gchar *sig;
-} MailConfigIdentity;
-
-typedef struct
-{
- gchar *url;
- gboolean keep_on_server;
-} MailConfigService;
-
-/* Identities */
-MailConfigIdentity *identity_copy (MailConfigIdentity *id);
-void identity_destroy (MailConfigIdentity *id);
-void identity_destroy_each (gpointer item, gpointer data);
-
-/* Services */
-MailConfigService *service_copy (MailConfigService *source);
-void service_destroy (MailConfigService *source);
-void service_destroy_each (gpointer item, gpointer data);
-
-/* Configuration */
-void mail_config_init (void);
-void mail_config_clear (void);
-void mail_config_write (void);
-void mail_config_write_on_exit (void);
-
-/* General Accessor functions */
-gboolean mail_config_is_configured (void);
-gboolean mail_config_thread_list (void);
-gint mail_config_paned_size (void);
-void mail_config_set_thread_list (gboolean value);
-void mail_config_set_paned_size (gint size);
-gboolean mail_config_send_html (void);
-void mail_config_set_send_html (gboolean send_html);
-gint mail_config_mark_as_seen_timeout (void);
-void mail_config_set_mark_as_seen_timeout (gint timeout);
-
-/* Identity Accessor functions */
-MailConfigIdentity *mail_config_get_default_identity (void);
-void mail_config_add_identity (MailConfigIdentity *id);
-GSList *mail_config_get_identities (void);
-
-/* Service Accessor functions */
-MailConfigService *mail_config_get_default_source (void);
-GSList *mail_config_get_sources (void);
-void mail_config_add_source (MailConfigService *source);
-
-MailConfigService *mail_config_get_transport (void);
-void mail_config_set_transport (MailConfigService *transport);
-
-MailConfigService *mail_config_get_default_news (void);
-GSList *mail_config_get_news (void);
-void mail_config_add_news (MailConfigService *source);
-
-#endif
-
-
diff --git a/mail/mail-crypto.c b/mail/mail-crypto.c
deleted file mode 100644
index 71a2573eeb..0000000000
--- a/mail/mail-crypto.c
+++ /dev/null
@@ -1,529 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * mail-crypto.h: OpenPGP en/decryption & signature code
- *
- * FIXME FIXME FIXME: This should be in its own library or component
- */
-
-/*
- * Authors:
- * Nathan Thompson-Amato <ndt@jps.net>
- * Dan Winship <danw@helixcode.com>
- * Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc. (http://www.helixcode.com)
- * Copyright 2000, Nathan Thompson-Amato
- * Copyright 1999, 2000, Anthony Mulcahy
- *
- * 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.
- *
- */
-
-#include "config.h"
-
-#ifdef PGP_PROGRAM
-#include <stdlib.h>
-#include <string.h>
-#include <glib.h>
-#include <gnome.h>
-
-#include "mail.h"
-
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <signal.h>
-#include <stdio.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <termios.h>
-#include <unistd.h>
-#include <signal.h>
-
-static int
-cleanup_child (pid_t child)
-{
- int status;
- pid_t wait_result;
- sigset_t mask, omask;
-
- /* PGP5 closes fds before exiting, meaning this might be called
- * too early. So wait a bit for the result.
- */
- sigemptyset (&mask);
- sigaddset (&mask, SIGALRM);
- sigprocmask (SIG_BLOCK, &mask, &omask);
- alarm (1);
- wait_result = waitpid (child, &status, 0);
- alarm (0);
- sigprocmask (SIG_SETMASK, &omask, NULL);
-
- if (wait_result == -1 && errno == EINTR) {
- /* The child is hanging: send a friendly reminder. */
- kill (child, SIGTERM);
- sleep (1);
- wait_result = waitpid (child, &status, WNOHANG);
- if (wait_result == 0) {
- /* Still hanging; use brute force. */
- kill (child, SIGKILL);
- sleep (1);
- wait_result = waitpid (child, &status, WNOHANG);
- }
- }
-
- if (wait_result != -1 && WIFEXITED (status))
- return WEXITSTATUS (status);
- else
- return -1;
-}
-
-static void
-cleanup_before_exec (int fd)
-{
- int maxfd, i;
-
- maxfd = sysconf (_SC_OPEN_MAX);
- if (maxfd < 0)
- return;
-
- /* Loop over all fds. */
- for (i = 0; i < maxfd; i++) {
- if ((STDIN_FILENO != i) &&
- (STDOUT_FILENO != i) &&
- (STDERR_FILENO != i) &&
- (fd != i))
- close (i);
- }
-}
-
-static int
-crypto_exec_with_passwd (char *path, char *argv[], const char *input,
- int passwd_fds[], const char *passphrase,
- char **output, char **diagnostics)
-{
- fd_set fdset, write_fdset;
- int ip_fds[2], op_fds[2], diag_fds[2];
- int select_result, read_len, write_len;
- size_t tmp_len;
- pid_t child;
- char *buf, *diag_buf;
- const char *passwd_next, *input_next;
- size_t size, alloc_size, diag_size, diag_alloc_size;
- gboolean eof_seen, diag_eof_seen, passwd_eof_seen, input_eof_seen;
- size_t passwd_remaining, passwd_incr, input_remaining, input_incr;
- struct timeval timeout;
-
- if ((pipe (ip_fds) < 0 ) ||
- (pipe (op_fds) < 0 ) ||
- (pipe (diag_fds) < 0 )) {
- *diagnostics = g_strdup_printf ("Couldn't create pipe to %s: "
- "%s", PGP_PROGRAM,
- g_strerror (errno));
- return 0;
- }
-
- if (!(child = fork ())) {
- /* In child */
-
- if ((dup2 (ip_fds[0], STDIN_FILENO) < 0 ) ||
- (dup2 (op_fds[1], STDOUT_FILENO) < 0 ) ||
- (dup2 (diag_fds[1], STDERR_FILENO) < 0 )) {
- _exit (255);
- }
-
- /* Dissociate from evolution-mail's controlling
- * terminal so that pgp/gpg won't be able to read from
- * it: PGP 2 will fall back to asking for the password
- * on /dev/tty if the passed-in password is incorrect.
- * This will make that fail rather than hanging.
- */
- setsid ();
-
- /* Close excess fds */
- cleanup_before_exec(passwd_fds[0]);
-
- execvp (path, argv);
- fprintf (stderr, "Could not execute %s: %s\n", argv[0],
- g_strerror (errno));
- _exit (255);
- } else if (child < 0) {
- *diagnostics = g_strdup_printf ("Cannot fork %s: %s",
- argv[0], g_strerror (errno));
- return 0;
- }
-
- /* Parent */
- close (ip_fds[0]);
- close (op_fds[1]);
- close (diag_fds[1]);
- close (passwd_fds[0]);
-
- timeout.tv_sec = 10; /* timeout in seconds */
- timeout.tv_usec = 0;
-
- size = diag_size = 0;
- alloc_size = 4096;
- diag_alloc_size = 1024;
- eof_seen = diag_eof_seen = FALSE;
-
- buf = g_malloc (alloc_size);
- diag_buf = g_malloc (diag_alloc_size);
-
- passwd_next = passphrase;
- passwd_remaining = strlen (passphrase);
- passwd_incr = fpathconf (passwd_fds[1], _PC_PIPE_BUF);
- /* Use a reasonable default value on error. */
- if (passwd_incr <= 0)
- passwd_incr = 1024;
- passwd_eof_seen = FALSE;
-
- input_next = input;
- input_remaining = strlen (input);
- input_incr = fpathconf (ip_fds[1], _PC_PIPE_BUF);
- if (input_incr <= 0)
- input_incr = 1024;
- input_eof_seen = FALSE;
-
- while (!(eof_seen && diag_eof_seen)) {
- FD_ZERO (&fdset);
- if (!eof_seen)
- FD_SET (op_fds[0], &fdset);
- if (!diag_eof_seen)
- FD_SET (diag_fds[0], &fdset);
-
- FD_ZERO (&write_fdset);
- if (!passwd_eof_seen)
- FD_SET (passwd_fds[1], &write_fdset);
- if (!input_eof_seen)
- FD_SET (ip_fds[1], &write_fdset);
-
- select_result = select (FD_SETSIZE, &fdset, &write_fdset,
- NULL, &timeout);
- if (select_result < 0) {
- if (errno == EINTR)
- continue;
- break;
- }
- if (select_result == 0) {
- /* timeout */
- break;
- }
-
- if (FD_ISSET (op_fds[0], &fdset)) {
- /* More output is available. */
-
- if (size + 4096 > alloc_size) {
- alloc_size += 4096;
- buf = g_realloc (buf , alloc_size);
- }
- read_len = read (op_fds[0], &buf[size],
- alloc_size - size - 1);
- if (read_len < 0) {
- if (errno == EINTR)
- continue;
- break;
- }
- if (read_len == 0)
- eof_seen = TRUE;
- size += read_len;
- }
-
- if (FD_ISSET(diag_fds[0], &fdset) ) {
- /* More stderr is available. */
-
- if (diag_size + 1024 > diag_alloc_size) {
- diag_alloc_size += 1024;
- diag_buf = g_realloc (diag_buf,
- diag_alloc_size);
- }
-
- read_len = read (diag_fds[0], &diag_buf[diag_size],
- diag_alloc_size - diag_size - 1);
- if (read_len < 0) {
- if (errno == EINTR)
- continue;
- break;
- }
- if (read_len == 0)
- diag_eof_seen = TRUE;
- diag_size += read_len;
- }
-
- if (FD_ISSET(passwd_fds[1], &write_fdset)) {
- /* Ready for more password input. */
-
- tmp_len = passwd_incr;
- if (tmp_len > passwd_remaining)
- tmp_len = passwd_remaining;
- write_len = write (passwd_fds[1], passwd_next,
- tmp_len);
- if (write_len < 0) {
- if (errno == EINTR)
- continue;
- break;
- }
- passwd_next += write_len;
- passwd_remaining -= write_len;
- if (passwd_remaining == 0) {
- close (passwd_fds[1]);
- passwd_eof_seen = TRUE;
- }
- }
-
- if (FD_ISSET(ip_fds[1], &write_fdset)) {
- /* Ready for more ciphertext input. */
-
- tmp_len = input_incr;
- if (tmp_len > input_remaining)
- tmp_len = input_remaining;
- write_len = write (ip_fds[1], input_next, tmp_len);
- if (write_len < 0) {
- if (errno == EINTR)
- continue;
- break;
- }
- input_next += write_len;
- input_remaining -= write_len;
- if (input_remaining == 0 ) {
- close (ip_fds[1]);
- input_eof_seen = TRUE;
- }
- }
- }
-
- buf[size] = 0;
- diag_buf[diag_size] = 0;
- close (op_fds[0]);
- close (diag_fds[0]);
-
- *output = buf;
- *diagnostics = diag_buf;
-
- return cleanup_child (child);
-}
-
-/*----------------------------------------------------------------------*
- * Public crypto functions
- *----------------------------------------------------------------------*/
-
-
-char *
-mail_crypto_openpgp_decrypt (const char *ciphertext, CamelException *ex)
-{
- int retval, i;
- char *path, *argv[12];
- char *passphrase, *plaintext = NULL, *diagnostics = NULL;
- int passwd_fds[2];
- char passwd_fd[32];
-
- passphrase = mail_request_dialog (
- _("Please enter your PGP/GPG passphrase."),
- TRUE, "pgp", FALSE);
- if (!passphrase) {
- camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM,
- _("No password provided."));
- return NULL;
- }
-
- if (pipe (passwd_fds) < 0) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Couldn't create pipe to GPG/PGP: %s"),
- g_strerror (errno));
- return NULL;
- }
-
- i = 0;
-#if defined(GPG_PATH)
- path = GPG_PATH;
-
- argv[i++] = "gpg";
- argv[i++] = "--verbose";
- argv[i++] = "--yes";
- argv[i++] = "--batch";
-
- argv[i++] = "--output";
- argv[i++] = "-"; /* output to stdout */
-
- argv[i++] = "--decrypt";
-
- argv[i++] = "--passphrase-fd";
- sprintf (passwd_fd, "%d", passwd_fds[0]);
- argv[i++] = passwd_fd;
-#elif defined(PGP5_PATH)
- path = PGP5_PATH;
-
- argv[i++] = "pgpv";
- argv[i++] = "-f";
- argv[i++] = "+batchmode=1";
-
- sprintf (passwd_fd, "PGPPASSFD=%d", passwd_fds[0]);
- putenv (passwd_fd);
-#else
- path = PGP_PATH;
-
- argv[i++] = "pgp";
- argv[i++] = "-f";
-
- sprintf (passwd_fd, "PGPPASSFD=%d", passwd_fds[0]);
- putenv (passwd_fd);
-#endif
- argv[i++] = NULL;
-
- retval = crypto_exec_with_passwd (path, argv, ciphertext, passwd_fds,
- passphrase, &plaintext,
- &diagnostics);
- if (retval != 0 || !*plaintext) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "%s", diagnostics);
- g_free (plaintext);
- g_free (diagnostics);
- return NULL;
- }
-
- g_free (diagnostics);
- return plaintext;
-}
-
-char *
-mail_crypto_openpgp_encrypt (const char *plaintext,
- const GPtrArray *recipients,
- gboolean sign, CamelException *ex)
-{
- GPtrArray *recipient_list = NULL;
- int retval, i, r;
- char *path, *argv[12];
- char *passphrase, *ciphertext = NULL, *diagnostics = NULL;
- int passwd_fds[2];
- char passwd_fd[32];
-
- passphrase = mail_request_dialog (
- _("Please enter your PGP/GPG passphrase."),
- TRUE, "pgp", FALSE);
- if (!passphrase) {
- camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM,
- _("No password provided."));
- return NULL;
- }
-
- if (pipe (passwd_fds) < 0) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Couldn't create pipe to GPG/PGP: %s"),
- g_strerror (errno));
- return NULL;
- }
-
- i = 0;
-#if defined(GPG_PATH)
- path = GPG_PATH;
-
- recipient_list = g_ptr_array_new ();
- for (r = 0; r < recipients->len; r++) {
- char *buf, *recipient;
-
- recipient = recipients->pdata[i];
- buf = g_strdup_printf ("-r %s", recipient);
- g_ptr_array_add (recipient_list, buf);
- }
-
- argv[i++] = "gpg";
- argv[i++] = "--verbose";
- argv[i++] = "--yes";
- argv[i++] = "--batch";
-
- argv[i++] = "--armor";
-
- for (r = 0; r < recipient_list->len; r++)
- argv[i++] = recipient_list->pdata[r];
-
- argv[i++] = "--output";
- argv[i++] = "-"; /* output to stdout */
-
- argv[i++] = "--encrypt";
-
- if (sign) {
- argv[i++] = "--sign";
-
- argv[i++] = "--passphrase-fd";
- sprintf (passwd_fd, "%d", passwd_fds[0]);
- argv[i++] = passwd_fd;
- }
-#elif defined(PGP5_PATH)
- path = PGP5_PATH;
-
- recipient_list = g_ptr_array_new ();
- for (r = 0; r < recipients->len; r++) {
- char *buf, *recipient;
-
- recipient = recipients->pdata[i];
- buf = g_strdup_printf ("-r %s", recipient);
- g_ptr_array_add (recipient_list, buf);
- }
-
- argv[i++] = "pgpe";
-
- for (r = 0; r < recipient_list->len; r++)
- argv[i++] = recipient_list->pdata[r];
-
- argv[i++] = "-f";
- argv[i++] = "-z";
- argv[i++] = "-a";
- argv[i++] = "-o";
- argv[i++] = "-"; /* output to stdout */
-
- if (sign) {
- argv[i++] = "-s";
-
- sprintf (passwd_fd, "PGPPASSFD=%d", passwd_fds[0]);
- putenv (passwd_fd);
- }
-#else /* We still gotta get pgp 2.6.3 workin here ;-) */
- path = PGP_PATH;
-
- argv[i++] = "pgp";
- argv[i++] = "-f";
-
- sprintf (passwd_fd, "PGPPASSFD=%d", passwd_fds[0]);
- putenv (passwd_fd);
-#endif
- argv[i++] = NULL;
-
- retval = crypto_exec_with_passwd (path, argv, plaintext, passwd_fds,
- passphrase, &ciphertext,
- &diagnostics);
-
- if (retval != 0 || !*ciphertext) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- "%s", diagnostics);
- g_free (ciphertext);
- ciphertext = NULL;
- }
-
- if (recipient_list) {
- for (r = 0; r < recipient_list->len; r++)
- g_free (recipient_list->pdata[r]);
- g_ptr_array_free (recipient_list, TRUE);
- }
-
- g_free (diagnostics);
- return ciphertext;
-}
-
-#endif /* PGP_PROGRAM */
diff --git a/mail/mail-display.c b/mail/mail-display.c
deleted file mode 100644
index 760c45c92e..0000000000
--- a/mail/mail-display.c
+++ /dev/null
@@ -1,564 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * mail-display.c: Mail display widget
- *
- * Author:
- * Miguel de Icaza
- * Bertrand Guiheneuf (bg@aful.org)
- *
- * (C) 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <sys/stat.h>
-#include <ctype.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <gnome.h>
-#include "e-util/e-util.h"
-#include "e-util/e-html-utils.h"
-#include "mail-display.h"
-#include "mail.h"
-
-#include <bonobo.h>
-#include <libgnorba/gnorba.h>
-#include <bonobo/bonobo-stream-memory.h>
-#include <libgnomevfs/gnome-vfs-mime-info.h>
-#include <libgnomevfs/gnome-vfs-mime-handlers.h>
-
-#define PARENT_TYPE (gtk_vbox_get_type ())
-
-static GtkObjectClass *mail_display_parent_class;
-
-static void redisplay (MailDisplay *md);
-
-/*----------------------------------------------------------------------*
- * Callbacks
- *----------------------------------------------------------------------*/
-
-static void
-save_data_eexist_cb (int reply, gpointer user_data)
-{
- gboolean *ok = user_data;
-
- *ok = reply == 0;
- gtk_main_quit ();
-}
-
-static gboolean
-write_data_to_file (CamelMimePart *part, const char *name, gboolean unique)
-{
- CamelDataWrapper *data;
- CamelStream *stream_fs;
- int fd;
-
- g_return_val_if_fail (CAMEL_IS_MIME_PART (part), FALSE);
- data = camel_medium_get_content_object (CAMEL_MEDIUM (part));
-
- fd = open (name, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
- if (fd == -1 && errno == EEXIST && !unique) {
- gboolean ok = FALSE;
-
- gnome_ok_cancel_dialog_modal (
- "A file by that name already exists.\nOverwrite it?",
- save_data_eexist_cb, &ok);
- GDK_THREADS_ENTER();
- gtk_main ();
- GDK_THREADS_LEAVE();
- if (!ok)
- return FALSE;
- fd = open (name, O_WRONLY | O_TRUNC);
- }
-
- if (fd == -1) {
- char *msg;
-
- msg = g_strdup_printf ("Could not open file %s:\n%s",
- name, g_strerror (errno));
- gnome_error_dialog (msg);
- g_free (msg);
- return FALSE;
- }
-
- stream_fs = camel_stream_fs_new_with_fd (fd);
- if (camel_data_wrapper_write_to_stream (data, stream_fs) == -1
- || camel_stream_flush (stream_fs) == -1) {
- char *msg;
-
- msg = g_strdup_printf ("Could not write data: %s",
- strerror (errno));
- gnome_error_dialog (msg);
- g_free (msg);
- camel_object_unref (CAMEL_OBJECT (stream_fs));
- return FALSE;
- }
- camel_object_unref (CAMEL_OBJECT (stream_fs));
- return TRUE;
-}
-
-static char *
-make_safe_filename (const char *prefix, CamelMimePart *part)
-{
- GMimeContentField *type;
- const char *name = NULL;
- char *safe, *p;
-
- type = camel_mime_part_get_content_type (part);
- if (type)
- name = gmime_content_field_get_parameter (type, "name");
- if (!name)
- name = camel_mime_part_get_filename (part);
- if (!name)
- name = "attachment";
-
- p = strrchr (name, '/');
- if (p)
- safe = g_strdup_printf ("%s%s", prefix, p);
- else
- safe = g_strdup_printf ("%s/%s", prefix, name);
-
- for (p = strrchr (safe, '/') + 1; *p; p++) {
- if (!isascii ((unsigned char)*p) ||
- strchr (" /'\"`&();|<>${}!", *p))
- *p = '_';
- }
-
- return safe;
-}
-
-static CamelMimePart *
-part_for_url (const char *url, MailDisplay *md)
-{
- GHashTable *urls;
-
- urls = g_datalist_get_data (md->data, "urls");
- g_return_val_if_fail (urls != NULL, NULL);
- return g_hash_table_lookup (urls, url);
-}
-
-static void
-launch_external (const char *url, MailDisplay *md)
-{
- const char *command = url + 21;
- char *tmpl, *tmpdir, *filename, *argv[2];
- CamelMimePart *part = part_for_url (url, md);
-
- tmpl = g_strdup ("/tmp/evolution.XXXXXX");
-#ifdef HAVE_MKDTEMP
- tmpdir = mkdtemp (tmpl);
-#else
- tmpdir = mktemp (tmpl);
- if (tmpdir) {
- if (mkdir (tmpdir, S_IRWXU) == -1)
- tmpdir = NULL;
- }
-#endif
- if (!tmpdir) {
- char *msg = g_strdup_printf ("Could not create temporary "
- "directory: %s",
- g_strerror (errno));
- gnome_error_dialog (msg);
- g_free (msg);
- return;
- }
-
- filename = make_safe_filename (tmpdir, part);
-
- if (!write_data_to_file (part, filename, TRUE)) {
- g_free (tmpl);
- g_free (filename);
- return;
- }
-
- argv[0] = (char *)command;
- argv[1] = filename;
-
- gnome_execute_async (tmpdir, 2, argv);
- g_free (tmpdir);
- g_free (filename);
-}
-
-static void
-save_data_cb (GtkWidget *widget, gpointer user_data)
-{
- GtkFileSelection *file_select = (GtkFileSelection *)
- gtk_widget_get_ancestor (widget, GTK_TYPE_FILE_SELECTION);
-
- write_data_to_file (user_data,
- gtk_file_selection_get_filename (file_select),
- FALSE);
- gtk_widget_destroy (GTK_WIDGET (file_select));
-}
-
-static void
-save_data (const char *cid, MailDisplay *md)
-{
- GtkFileSelection *file_select;
- char *filename;
- CamelMimePart *part;
-
- part = part_for_url (cid, md);
- g_return_if_fail (part != NULL);
- filename = make_safe_filename (g_get_home_dir (), part);
-
- file_select = GTK_FILE_SELECTION (gtk_file_selection_new ("Save Attachment"));
- gtk_file_selection_set_filename (file_select, filename);
- g_free (filename);
-
- gtk_signal_connect (GTK_OBJECT (file_select->ok_button), "clicked",
- GTK_SIGNAL_FUNC (save_data_cb), part);
- gtk_signal_connect_object (GTK_OBJECT (file_select->cancel_button),
- "clicked",
- GTK_SIGNAL_FUNC (gtk_widget_destroy),
- GTK_OBJECT (file_select));
-
- gtk_widget_show (GTK_WIDGET (file_select));
-}
-
-static gboolean
-idle_redisplay (gpointer data)
-{
- MailDisplay *md = data;
-
- md->idle_id = 0;
- redisplay (md);
- return FALSE;
-}
-
-static void
-queue_redisplay (MailDisplay *md)
-{
- if (!md->idle_id) {
- md->idle_id = g_idle_add_full (G_PRIORITY_LOW, idle_redisplay,
- md, NULL);
- }
-}
-
-static void
-on_link_clicked (GtkHTML *html, const char *url, gpointer user_data)
-{
- MailDisplay *md = user_data;
-
- if (!g_strncasecmp (url, "news:", 5) ||
- !g_strncasecmp (url, "nntp:", 5))
- g_warning ("Can't handle news URLs yet.");
- else if (!g_strncasecmp (url, "mailto:", 7))
- send_to_url (url);
- else if (!strncmp (url, "cid:", 4))
- save_data (url, md);
- else if (!strncmp (url, "x-evolution-external:", 21))
- launch_external (url, md);
- else if (!strcmp (url, "x-evolution-decode-pgp:")) {
- g_datalist_set_data (md->data, "show_pgp",
- GINT_TO_POINTER (1));
- queue_redisplay (md);
- } else
- gnome_url_show (url);
-}
-
-static gboolean
-on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data)
-{
- MailDisplay *md = data;
- GHashTable *urls;
- CamelMedium *medium;
- CamelDataWrapper *wrapper;
- OAF_ServerInfo *component;
- GtkWidget *embedded;
- BonoboObjectClient *server;
- Bonobo_PersistStream persist;
- CORBA_Environment ev;
- GByteArray *ba;
- CamelStream *cstream;
- BonoboStream *bstream;
-
- if (strncmp (eb->classid, "cid:", 4) != 0)
- return FALSE;
- urls = g_datalist_get_data (md->data, "urls");
- g_return_val_if_fail (urls != NULL, FALSE);
-
- medium = g_hash_table_lookup (urls, eb->classid);
- g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), FALSE);
- wrapper = camel_medium_get_content_object (medium);
-
- component = gnome_vfs_mime_get_default_component (eb->type);
- if (!component)
- return FALSE;
-
- embedded = bonobo_widget_new_subdoc (component->iid, NULL);
- if (!embedded)
- embedded = bonobo_widget_new_control (component->iid, NULL);
- CORBA_free (component);
- if (!embedded)
- return FALSE;
- server = bonobo_widget_get_server (BONOBO_WIDGET (embedded));
-
- persist = (Bonobo_PersistStream) bonobo_object_client_query_interface (
- server, "IDL:Bonobo/PersistStream:1.0", NULL);
- if (persist == CORBA_OBJECT_NIL) {
- gtk_object_sink (GTK_OBJECT (embedded));
- return FALSE;
- }
-
- /* Write the data to a CamelStreamMem... */
- ba = g_byte_array_new ();
- cstream = camel_stream_mem_new_with_byte_array (ba);
- camel_data_wrapper_write_to_stream (wrapper, cstream);
-
- /* ...convert the CamelStreamMem to a BonoboStreamMem... */
- bstream = bonobo_stream_mem_create (ba->data, ba->len, TRUE, FALSE);
- camel_object_unref (CAMEL_OBJECT (cstream));
-
- /* ...and hydrate the PersistStream from the BonoboStream. */
- CORBA_exception_init (&ev);
- Bonobo_PersistStream_load (persist,
- bonobo_object_corba_objref (
- BONOBO_OBJECT (bstream)),
- eb->type, &ev);
- bonobo_object_unref (BONOBO_OBJECT (bstream));
- Bonobo_Unknown_unref (persist, &ev);
- CORBA_Object_release (persist, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- gtk_object_sink (GTK_OBJECT (embedded));
- CORBA_exception_free (&ev);
- return FALSE;
- }
- CORBA_exception_free (&ev);
-
- gtk_widget_show (embedded);
- gtk_container_add (GTK_CONTAINER (eb), embedded);
-
- return TRUE;
-}
-
-static void
-on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle,
- gpointer user_data)
-{
- MailDisplay *md = user_data;
- GHashTable *urls;
-
- urls = g_datalist_get_data (md->data, "urls");
- g_return_if_fail (urls != NULL);
-
- user_data = g_hash_table_lookup (urls, url);
- if (user_data == NULL)
- return;
-
- if (strncmp (url, "cid:", 4) == 0) {
- CamelMedium *medium = user_data;
- CamelDataWrapper *data;
- CamelStream *stream_mem;
- GByteArray *ba;
-
- g_return_if_fail (CAMEL_IS_MEDIUM (medium));
- data = camel_medium_get_content_object (medium);
-
- ba = g_byte_array_new ();
- stream_mem = camel_stream_mem_new_with_byte_array (ba);
- camel_data_wrapper_write_to_stream (data, stream_mem);
- gtk_html_write (html, handle, ba->data, ba->len);
- camel_object_unref (CAMEL_OBJECT (stream_mem));
- } else if (strncmp (url, "x-evolution-data:", 17) == 0) {
- GByteArray *ba = user_data;
-
- g_return_if_fail (ba != NULL);
- gtk_html_write (html, handle, ba->data, ba->len);
- }
-}
-
-void
-mail_html_write (GtkHTML *html, GtkHTMLStream *stream,
- const char *format, ...)
-{
- char *buf;
- va_list ap;
-
- va_start (ap, format);
- buf = g_strdup_vprintf (format, ap);
- va_end (ap);
- gtk_html_write (html, stream, buf, strlen (buf));
- g_free (buf);
-}
-
-void
-mail_text_write (GtkHTML *html, GtkHTMLStream *stream,
- const char *format, ...)
-{
- char *buf, *htmltext;
- va_list ap;
-
- va_start (ap, format);
- buf = g_strdup_vprintf (format, ap);
- va_end (ap);
-
- htmltext = e_text_to_html (buf,
- E_TEXT_TO_HTML_CONVERT_URLS |
- E_TEXT_TO_HTML_CONVERT_NL |
- E_TEXT_TO_HTML_CONVERT_SPACES);
- gtk_html_write (html, stream, "<tt>", 4);
- gtk_html_write (html, stream, htmltext, strlen (htmltext));
- gtk_html_write (html, stream, "</tt>", 5);
- g_free (htmltext);
- g_free (buf);
-}
-
-void
-mail_error_write (GtkHTML *html, GtkHTMLStream *stream,
- const char *format, ...)
-{
- char *buf, *htmltext;
- va_list ap;
-
- va_start (ap, format);
- buf = g_strdup_vprintf (format, ap);
- va_end (ap);
-
- htmltext = e_text_to_html (buf, E_TEXT_TO_HTML_CONVERT_NL);
- gtk_html_write (html, stream, "<em><font color=red>", 20);
- gtk_html_write (html, stream, htmltext, strlen (htmltext));
- gtk_html_write (html, stream, "</font></em><br>", 16);
- g_free (htmltext);
- g_free (buf);
-}
-
-static void
-clear_data (CamelObject *object, gpointer event_data, gpointer user_data)
-{
- GData *data = user_data;
-
- g_datalist_clear (&data);
-}
-
-static void
-redisplay (MailDisplay *md)
-{
- GtkAdjustment *adj;
-
- md->stream = gtk_html_begin (md->html);
- mail_html_write (md->html, md->stream, "%s%s", HTML_HEADER,
- "<BODY TEXT=\"#000000\" BGCOLOR=\"#FFFFFF\">\n");
-
- if (md->current_message) {
- camel_object_ref (CAMEL_OBJECT (md->current_message));
- mail_format_mime_message (md->current_message, md);
- }
-
- mail_html_write (md->html, md->stream, "</BODY></HTML>\n");
- gtk_html_end (md->html, md->stream, GTK_HTML_STREAM_OK);
- md->stream = NULL;
-
- adj = e_scroll_frame_get_vadjustment (md->scroll);
- gtk_adjustment_set_value (adj, 0);
- e_scroll_frame_set_vadjustment (md->scroll, adj);
-
- adj = e_scroll_frame_get_hadjustment (md->scroll);
- gtk_adjustment_set_value (adj, 0);
- e_scroll_frame_set_hadjustment (md->scroll, adj);
-}
-
-/**
- * mail_display_set_message:
- * @mail_display: the mail display object
- * @medium: the input camel medium, or %NULL
- *
- * Makes the mail_display object show the contents of the medium
- * param.
- **/
-void
-mail_display_set_message (MailDisplay *md, CamelMedium *medium)
-{
- /* For the moment, we deal only with CamelMimeMessage, but in
- * the future, we should be able to deal with any medium.
- */
- if (medium && !CAMEL_IS_MIME_MESSAGE (medium))
- return;
-
- /* Clean up from previous message. */
- if (md->current_message)
- camel_object_unref (CAMEL_OBJECT (md->current_message));
-
- md->current_message = (CamelMimeMessage*)medium;
-
- g_datalist_init (md->data);
- redisplay (md);
- if (medium) {
- camel_object_hook_event (CAMEL_OBJECT (medium), "finalize",
- clear_data, *(md->data));
- }
-}
-
-
-/*----------------------------------------------------------------------*
- * Standard Gtk+ Class functions
- *----------------------------------------------------------------------*/
-
-static void
-mail_display_init (GtkObject *object)
-{
- MailDisplay *mail_display = MAIL_DISPLAY (object);
-
- /* various other initializations */
- mail_display->current_message = NULL;
-}
-
-static void
-mail_display_destroy (GtkObject *object)
-{
- MailDisplay *mail_display = MAIL_DISPLAY (object);
-
- g_datalist_clear (mail_display->data);
- g_free (mail_display->data);
-
- mail_display_parent_class->destroy (object);
-}
-
-static void
-mail_display_class_init (GtkObjectClass *object_class)
-{
- object_class->destroy = mail_display_destroy;
- mail_display_parent_class = gtk_type_class (PARENT_TYPE);
-}
-
-GtkWidget *
-mail_display_new (void)
-{
- MailDisplay *mail_display = gtk_type_new (mail_display_get_type ());
- GtkWidget *scroll, *html;
-
- gtk_box_set_homogeneous (GTK_BOX (mail_display), FALSE);
- gtk_widget_show (GTK_WIDGET (mail_display));
-
- scroll = e_scroll_frame_new (NULL, NULL);
- e_scroll_frame_set_policy (E_SCROLL_FRAME (scroll),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- e_scroll_frame_set_shadow_type (E_SCROLL_FRAME (scroll), GTK_SHADOW_IN);
- gtk_box_pack_start_defaults (GTK_BOX (mail_display), GTK_WIDGET (scroll));
- gtk_widget_show (GTK_WIDGET (scroll));
-
- html = gtk_html_new ();
- gtk_html_set_editable (GTK_HTML (html), FALSE);
- gtk_signal_connect (GTK_OBJECT (html), "url_requested",
- GTK_SIGNAL_FUNC (on_url_requested),
- mail_display);
- gtk_signal_connect (GTK_OBJECT (html), "object_requested",
- GTK_SIGNAL_FUNC (on_object_requested),
- mail_display);
- gtk_signal_connect (GTK_OBJECT (html), "link_clicked",
- GTK_SIGNAL_FUNC (on_link_clicked),
- mail_display);
- gtk_container_add (GTK_CONTAINER (scroll), html);
- gtk_widget_show (GTK_WIDGET (html));
-
- mail_display->scroll = E_SCROLL_FRAME (scroll);
- mail_display->html = GTK_HTML (html);
- mail_display->stream = NULL;
- mail_display->data = g_new0 (GData *, 1);
- g_datalist_init (mail_display->data);
-
- return GTK_WIDGET (mail_display);
-}
-
-
-
-E_MAKE_TYPE (mail_display, "MailDisplay", MailDisplay, mail_display_class_init, mail_display_init, PARENT_TYPE);
diff --git a/mail/mail-display.h b/mail/mail-display.h
deleted file mode 100644
index 838921848d..0000000000
--- a/mail/mail-display.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#ifndef _MAIL_DISPLAY_H_
-#define _MAIL_DISPLAY_H_
-
-#include <gtk/gtkvbox.h>
-#include <gtkhtml/gtkhtml.h>
-
-#include "widgets/misc/e-scroll-frame.h"
-
-#include "camel/camel-stream.h"
-#include "camel/camel-mime-message.h"
-#include "folder-browser.h"
-
-
-#define MAIL_DISPLAY_TYPE (mail_display_get_type ())
-#define MAIL_DISPLAY(o) (GTK_CHECK_CAST ((o), MAIL_DISPLAY_TYPE, MailDisplay))
-#define MAIL_DISPLAY_CLASS(k) (GTK_CHECK_CLASS_CAST((k), MAIL_DISPLAY_TYPE, MailDisplayClass))
-#define IS_MAIL_DISPLAY(o) (GTK_CHECK_TYPE ((o), MAIL_DISPLAY_TYPE))
-#define IS_MAIL_DISPLAY_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), MAIL_DISPLAY_TYPE))
-
-struct _MailDisplay {
- GtkVBox parent;
-
- EScrollFrame *scroll;
- GtkHTML *html;
- GtkHTMLStream *stream;
- guint idle_id;
-
- CamelMimeMessage *current_message;
- GData **data;
-};
-
-typedef struct {
- GtkVBoxClass parent_class;
-} MailDisplayClass;
-
-GtkType mail_display_get_type (void);
-GtkWidget * mail_display_new (void);
-
-void mail_display_set_message (MailDisplay *mail_display,
- CamelMedium *medium);
-
-
-#define HTML_HEADER "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\n<HTML>\n<HEAD>\n<META NAME=\"GENERATOR\" CONTENT=\"Evolution Mail Component\">\n</HEAD>\n"
-
-void mail_html_write (GtkHTML *html,
- GtkHTMLStream *stream,
- const char *format, ...);
-void mail_text_write (GtkHTML *html,
- GtkHTMLStream *stream,
- const char *format, ...);
-void mail_error_write (GtkHTML *html,
- GtkHTMLStream *stream,
- const char *format, ...);
-
-#endif /* _MAIL_DISPLAY_H_ */
diff --git a/mail/mail-format.c b/mail/mail-format.c
deleted file mode 100644
index a73d2faf89..0000000000
--- a/mail/mail-format.c
+++ /dev/null
@@ -1,1764 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors:
- * Matt Loper <matt@helixcode.com>
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc. (http://www.helixcode.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.
- *
- */
-
-#include <config.h>
-#include "mail-tools.h"
-#include "mail-display.h"
-#include "mail.h"
-#include "e-util/e-html-utils.h"
-#include <libgnome/libgnome.h>
-#include <libgnomevfs/gnome-vfs-mime-info.h>
-#include <libgnomevfs/gnome-vfs-mime-handlers.h>
-
-#include <ctype.h> /* for isprint */
-#include <string.h> /* for strstr */
-#include <fcntl.h>
-
-static char *try_inline_pgp (char *start, MailDisplay *md);
-static char *try_uudecoding (char *start, MailDisplay *md);
-static char *try_inline_binhex (char *start, MailDisplay *md);
-
-static gboolean handle_text_plain (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_text_plain_flowed (char *text,
- MailDisplay *md);
-static gboolean handle_text_enriched (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_text_html (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_image (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_multipart_mixed (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_multipart_related (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_multipart_alternative (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_multipart_appledouble (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_multipart_encrypted (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_audio (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_message_rfc822 (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_message_external_body (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-
-static gboolean handle_unknown_type (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_via_bonobo (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-static gboolean handle_via_external (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-
-/* writes the header info for a mime message into an html stream */
-static void write_headers (CamelMimeMessage *message, MailDisplay *md);
-
-/* dispatch html printing via mimetype */
-static gboolean call_handler_function (CamelMimePart *part, MailDisplay *md);
-
-
-static void
-free_url (gpointer key, gpointer value, gpointer data)
-{
- g_free (key);
-}
-
-static void
-free_urls (gpointer urls)
-{
- g_hash_table_foreach (urls, free_url, NULL);
- g_hash_table_destroy (urls);
-}
-
-static char *
-add_url (char *url, gpointer data, MailDisplay *md)
-{
- GHashTable *urls;
- gpointer old_key, old_value;
-
- urls = g_datalist_get_data (md->data, "urls");
- g_return_val_if_fail (urls != NULL, NULL);
-
- if (g_hash_table_lookup_extended (urls, url, &old_key, &old_value)) {
- g_free (url);
- url = old_key;
- }
- g_hash_table_insert (urls, url, data);
- return url;
-}
-
-/**
- * mail_format_mime_message:
- * @mime_message: the input mime message
- * @md: the MailDisplay to render into
- *
- * Writes a CamelMimeMessage out into a MailDisplay
- **/
-void
-mail_format_mime_message (CamelMimeMessage *mime_message, MailDisplay *md)
-{
- GHashTable *urls;
-
- g_return_if_fail (CAMEL_IS_MIME_MESSAGE (mime_message));
-
- urls = g_datalist_get_data (md->data, "urls");
- if (!urls) {
- urls = g_hash_table_new (g_str_hash, g_str_equal);
- g_datalist_set_data_full (md->data, "urls", urls,
- free_urls);
- }
-
- write_headers (mime_message, md);
- call_handler_function (CAMEL_MIME_PART (mime_message), md);
-}
-
-static const char *
-get_cid (CamelMimePart *part, MailDisplay *md)
-{
- GHashTable *urls;
- char *cid;
- gpointer orig_name, value;
-
- urls = g_datalist_get_data (md->data, "urls");
-
- /* If we have a real Content-ID, use it. If we don't,
- * make a (syntactically invalid) fake one.
- */
- if (camel_mime_part_get_content_id (part)) {
- cid = g_strdup_printf ("cid:%s",
- camel_mime_part_get_content_id (part));
- } else
- cid = g_strdup_printf ("cid:@@@%p", part);
-
- if (g_hash_table_lookup_extended (urls, cid, &orig_name, &value)) {
- g_free (cid);
- return orig_name;
- } else
- g_hash_table_insert (urls, cid, part);
-
- return cid;
-}
-
-static const char *
-get_url_for_icon (const char *icon_name, MailDisplay *md)
-{
- static GHashTable *icons;
- char *icon_path, buf[1024], *url;
- GByteArray *ba;
-
- if (!icons)
- icons = g_hash_table_new (g_str_hash, g_str_equal);
-
- if (*icon_name == '/')
- icon_path = g_strdup (icon_name);
- else {
- icon_path = gnome_pixmap_file (icon_name);
- if (!icon_path)
- return "file:///dev/null";
- }
-
- ba = g_hash_table_lookup (icons, icon_path);
- if (!ba) {
- int fd, nread;
-
- fd = open (icon_path, O_RDONLY);
- if (fd == -1) {
- g_free (icon_path);
- return "file:///dev/null";
- }
-
- ba = g_byte_array_new ();
-
- while (1) {
- nread = read (fd, buf, sizeof (buf));
- if (nread < 1)
- break;
- g_byte_array_append (ba, buf, nread);
- }
- close (fd);
-
- /* FIXME: these aren't freed. */
- g_hash_table_insert (icons, g_strdup (icon_path), ba);
- }
- g_free (icon_path);
-
- url = g_strdup_printf ("x-evolution-data:%p", ba);
- return add_url (url, ba, md);
-}
-
-
-
-/* We're maintaining a hashtable of mimetypes -> functions;
- * Those functions have the following signature...
- */
-typedef gboolean (*mime_handler_fn) (CamelMimePart *part,
- const char *mime_type,
- MailDisplay *md);
-
-static GHashTable *mime_function_table, *mime_fallback_table;
-
-static void
-setup_function_table (void)
-{
- mime_function_table = g_hash_table_new (g_str_hash, g_str_equal);
- mime_fallback_table = g_hash_table_new (g_str_hash, g_str_equal);
-
- g_hash_table_insert (mime_function_table, "text/plain",
- handle_text_plain);
- g_hash_table_insert (mime_function_table, "text/richtext",
- handle_text_enriched);
- g_hash_table_insert (mime_function_table, "text/enriched",
- handle_text_enriched);
- g_hash_table_insert (mime_function_table, "text/html",
- handle_text_html);
-
- g_hash_table_insert (mime_function_table, "image/*",
- handle_image);
-
- g_hash_table_insert (mime_function_table, "audio/*",
- handle_audio);
-
- g_hash_table_insert (mime_function_table, "message/rfc822",
- handle_message_rfc822);
- g_hash_table_insert (mime_function_table, "message/news",
- handle_message_rfc822);
- g_hash_table_insert (mime_function_table, "message/external-body",
- handle_message_external_body);
-
- g_hash_table_insert (mime_function_table, "multipart/alternative",
- handle_multipart_alternative);
- g_hash_table_insert (mime_function_table, "multipart/related",
- handle_multipart_related);
- g_hash_table_insert (mime_function_table, "multipart/mixed",
- handle_multipart_mixed);
- g_hash_table_insert (mime_function_table, "multipart/appledouble",
- handle_multipart_appledouble);
- g_hash_table_insert (mime_function_table, "multipart/encrypted",
- handle_multipart_encrypted);
-
- /* RFC 2046 says unrecognized text subtypes can be treated
- * as text/plain (as long as you recognize the character set),
- * and unrecognized multipart subtypes as multipart/mixed.
- */
- g_hash_table_insert (mime_fallback_table, "text/*",
- handle_text_plain);
- g_hash_table_insert (mime_function_table, "multipart/*",
- handle_multipart_mixed);
-}
-
-static mime_handler_fn
-lookup_handler (const char *mime_type, gboolean *generic)
-{
- mime_handler_fn handler_function;
- char *mime_type_main;
- GnomeVFSMimeAction *action;
-
- if (mime_function_table == NULL)
- setup_function_table ();
-
- mime_type_main = g_strdup_printf ("%.*s/*",
- (int)strcspn (mime_type, "/"),
- mime_type);
-
- /* OK. There are 6 possibilities, which we try in this order:
- * 1) full match in the main table
- * 2) partial match in the main table
- * 3) full match in gnome_vfs_mime_*
- * 4) full match in the fallback table
- * 5) partial match in the fallback table
- * 6) partial match in gnome_vfs_mime_*
- *
- * Of these, 1-4 are considered exact matches, and 5 and 6 are
- * considered generic.
- */
-
- /* Check for full match in mime_function_table. */
- handler_function = g_hash_table_lookup (mime_function_table,
- mime_type);
- if (!handler_function) {
- handler_function = g_hash_table_lookup (mime_function_table,
- mime_type_main);
- if (handler_function) {
- /* Optimize this for the next time through. */
- g_hash_table_insert (mime_function_table,
- g_strdup (mime_type),
- handler_function);
- }
- }
-
- if (handler_function) {
- g_free (mime_type_main);
- *generic = FALSE;
- return handler_function;
- }
-
- action = gnome_vfs_mime_get_default_action_without_fallback (mime_type);
- if (action) {
- if (action->action_type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT)
- handler_function = handle_via_bonobo;
- else
- handler_function = handle_via_external;
-
- /* Optimize this for the next time through. */
- g_hash_table_insert (mime_function_table,
- g_strdup (mime_type), handler_function);
- g_free (mime_type_main);
- gnome_vfs_mime_action_free (action);
- *generic = FALSE;
- return handler_function;
- }
-
- handler_function = g_hash_table_lookup (mime_fallback_table,
- mime_type);
- if (handler_function)
- *generic = FALSE;
- else {
- handler_function = g_hash_table_lookup (mime_fallback_table,
- mime_type_main);
- if (!handler_function) {
- action = gnome_vfs_mime_get_default_action (mime_type_main);
- if (action) {
- if (action->action_type ==
- GNOME_VFS_MIME_ACTION_TYPE_COMPONENT)
- handler_function = handle_via_bonobo;
- else
- handler_function = handle_via_external;
- gnome_vfs_mime_action_free (action);
- }
- }
- *generic = TRUE;
- }
-
- g_free (mime_type_main);
- return handler_function;
-}
-
-static gboolean
-call_handler_function (CamelMimePart *part, MailDisplay *md)
-{
- CamelDataWrapper *wrapper;
- char *mime_type;
- mime_handler_fn handler_function = NULL;
- gboolean generic, output;
-
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- mime_type = camel_data_wrapper_get_mime_type (wrapper);
- g_strdown (mime_type);
-
- handler_function = lookup_handler (mime_type, &generic);
- if (handler_function)
- output = (*handler_function) (part, mime_type, md);
- else
- output = handle_unknown_type (part, mime_type, md);
-
- g_free (mime_type);
- return output;
-}
-
-static void
-write_field_to_stream (const char *description, const char *value,
- gboolean bold, GtkHTML *html,
- GtkHTMLStream *stream)
-{
- char *encoded_value;
-
- if (value) {
- unsigned char *p;
-
- encoded_value = e_text_to_html (value,
- E_TEXT_TO_HTML_CONVERT_NL |
- E_TEXT_TO_HTML_CONVERT_URLS);
- for (p = (unsigned char *)encoded_value; *p; p++) {
- if (!isprint (*p))
- *p = '?';
- }
- } else
- encoded_value = "";
-
- mail_html_write (html, stream,
- "<tr valign=top><%s align=right>%s</%s>"
- "<td>%s</td></tr>", bold ? "th" : "td",
- description, bold ? "th" : "td", encoded_value);
- if (value)
- g_free (encoded_value);
-}
-
-static void
-write_headers (CamelMimeMessage *message, MailDisplay *md)
-{
- const CamelInternetAddress *recipients;
- const char *reply_to;
- char *string;
-
- mail_html_write (md->html, md->stream,
- "<table bgcolor=\"#EEEEEE\" width=\"100%%\" "
- "cellspacing=0 border=1>"
- "<tr><td><table>\n");
-
- write_field_to_stream ("From:",
- camel_mime_message_get_from (message),
- TRUE, md->html, md->stream);
-
- reply_to = camel_mime_message_get_reply_to (message);
- if (reply_to) {
- write_field_to_stream ("Reply-To:", reply_to, FALSE,
- md->html, md->stream);
- }
-
- recipients = camel_mime_message_get_recipients (
- message, CAMEL_RECIPIENT_TYPE_TO);
- string = camel_address_encode (CAMEL_ADDRESS (recipients));
- write_field_to_stream ("To:", string ? string : "", TRUE,
- md->html, md->stream);
- g_free (string);
-
- recipients = camel_mime_message_get_recipients (
- message, CAMEL_RECIPIENT_TYPE_CC);
- string = camel_address_encode (CAMEL_ADDRESS (recipients));
- if (string) {
- write_field_to_stream ("Cc:", string, TRUE,
- md->html, md->stream);
- }
- g_free (string);
-
- write_field_to_stream ("Subject:",
- camel_mime_message_get_subject (message),
- TRUE, md->html, md->stream);
-
- mail_html_write (md->html, md->stream,
- "</table></td></tr></table></center><p>");
-}
-
-
-/* Return the contents of a text-based data wrapper, or NULL if it
- * contains only whitespace.
- */
-static char *
-get_data_wrapper_text (CamelDataWrapper *data)
-{
- CamelStream *memstream;
- GByteArray *ba;
- char *text, *end;
-
- ba = g_byte_array_new ();
- memstream = camel_stream_mem_new_with_byte_array (ba);
-
- camel_data_wrapper_write_to_stream (data, memstream);
-
- for (text = ba->data, end = ba->data + ba->len; text < end; text++) {
- if (!isspace ((unsigned char)*text))
- break;
- }
-
- if (text < end) {
- text = g_malloc (ba->len + 1);
- memcpy (text, ba->data, ba->len);
- text[ba->len] = '\0';
- } else
- text = NULL;
-
- camel_object_unref (CAMEL_OBJECT (memstream));
- return text;
-}
-
-/*----------------------------------------------------------------------*
- * Mime handling functions
- *----------------------------------------------------------------------*/
-
-struct {
- char *start;
- char * (*handler) (char *start, MailDisplay *md);
-} text_specials[] = {
- { "-----BEGIN PGP MESSAGE-----\n", try_inline_pgp },
- { "begin ", try_uudecoding },
- { "(This file must be converted with BinHex 4.0)\n", try_inline_binhex }
-};
-#define NSPECIALS (sizeof (text_specials) / sizeof (*text_specials))
-
-static gboolean
-handle_text_plain (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- CamelDataWrapper *wrapper =
- camel_medium_get_content_object (CAMEL_MEDIUM (part));
- char *text, *p, *start, *subtext;
- GMimeContentField *type;
- const char *format;
- int i;
-
- text = get_data_wrapper_text (wrapper);
- if (!text)
- return FALSE;
-
- /* Check for RFC 2646 flowed text. */
- type = camel_mime_part_get_content_type (part);
- format = gmime_content_field_get_parameter (type, "format");
- if (format && !g_strcasecmp (format, "flowed"))
- return handle_text_plain_flowed (text, md);
-
- mail_html_write (md->html, md->stream, "\n<!-- text/plain -->\n");
-
- p = text;
- while (p) {
- /* Look for special cases. */
- for (i = 0; i < NSPECIALS; i++) {
- start = strstr (p, text_specials[i].start);
- if (start && (start == p || start[-1] == '\n'))
- break;
- }
- if (!start)
- break;
-
- /* Deal with special case */
- if (start != p) {
- subtext = g_strndup (p, start - p);
- mail_text_write (md->html, md->stream,
- "%s", subtext);
- g_free (subtext);
- }
- p = text_specials[i].handler (start, md);
- if (p == start) {
- /* Oops. That failed. Output this line normally and
- * skip over it.
- */
- p = strchr (start, '\n');
- if (!p++)
- break;
- subtext = g_strndup (start, p - start);
- mail_text_write (md->html, md->stream,
- "%s", subtext);
- g_free (subtext);
- } else if (p)
- mail_html_write (md->html, md->stream, "<hr>");
- }
- /* Finish up (or do the whole thing if there were no specials). */
- if (p)
- mail_text_write (md->html, md->stream, "%s", p);
-
- g_free (text);
- return TRUE;
-}
-
-static gboolean
-handle_text_plain_flowed (char *buf, MailDisplay *md)
-{
- char *text, *line, *eol, *p;
- int prevquoting = 0, quoting, len;
- gboolean br_pending = FALSE;
-
- mail_html_write (md->html, md->stream,
- "\n<!-- text/plain, flowed -->\n<tt>\n");
-
- for (line = buf; *line; line = eol + 1) {
- /* Process next line */
- eol = strchr (line, '\n');
- if (eol)
- *eol = '\0';
-
- quoting = 0;
- for (p = line; *p == '>'; p++)
- quoting++;
- if (quoting != prevquoting) {
- mail_html_write (md->html, md->stream, "%s\n",
- prevquoting == 0 ? "<i>\n" : "");
- while (quoting > prevquoting) {
- mail_html_write (md->html, md->stream,
- "<blockquote>");
- prevquoting++;
- }
- while (quoting < prevquoting) {
- mail_html_write (md->html, md->stream,
- "</blockquote>");
- prevquoting--;
- }
- mail_html_write (md->html, md->stream, "%s\n",
- prevquoting == 0 ? "</i>\n" : "");
- } else if (br_pending) {
- mail_html_write (md->html, md->stream, "<br>\n");
- br_pending = FALSE;
- }
-
- if (*p == ' ')
- p++;
-
- /* replace '<' with '&lt;', etc. */
- text = e_text_to_html (p, E_TEXT_TO_HTML_CONVERT_SPACES |
- E_TEXT_TO_HTML_CONVERT_URLS);
- if (text && *text)
- mail_html_write (md->html, md->stream, "%s", text);
- g_free (text);
-
- len = strlen (p);
- if (len == 0 || p[len - 1] != ' ' || !strcmp (p, "-- "))
- br_pending = TRUE;
-
- if (!eol)
- break;
- }
- g_free (buf);
-
- mail_html_write (md->html, md->stream, "</tt>\n");
- return TRUE;
-}
-
-static CamelMimePart *
-fake_mime_part_from_data (const char *data, int len, const char *type)
-{
- CamelStream *memstream;
- CamelDataWrapper *wrapper;
- CamelMimePart *part;
-
- memstream = camel_stream_mem_new_with_buffer (data, len);
- wrapper = camel_data_wrapper_new ();
- camel_data_wrapper_construct_from_stream (wrapper, memstream);
- camel_data_wrapper_set_mime_type (wrapper, type);
- camel_object_unref (CAMEL_OBJECT (memstream));
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper);
- camel_object_unref (CAMEL_OBJECT (wrapper));
- return part;
-}
-
-static void
-destroy_part (CamelObject *root, gpointer event_data, gpointer user_data)
-{
- camel_object_unref (user_data);
-}
-
-static char *
-decode_pgp (const char *ciphertext, MailDisplay *md)
-{
- CamelException ex;
- char *plaintext;
-
- camel_exception_init (&ex);
-#ifdef PGP_PROGRAM
- /* FIXME: multipart parts */
- if (g_datalist_get_data (md->data, "show_pgp")) {
- plaintext = mail_crypto_openpgp_decrypt (ciphertext, &ex);
- if (plaintext)
- return plaintext;
- }
-#else
- camel_exception_set (&ex, CAMEL_EXCEPTION_SYSTEM,
- "No GPG/PGP support available in this copy "
- "of Evolution.");
-#endif
-
- mail_html_write (md->html, md->stream,
- "<table><tr valign=top><td>"
- "<a href=\"x-evolution-decode-pgp:\">"
- "<img src=\"%s\"></a></td><td>",
- get_url_for_icon ("gnome-lockscreen.png", md));
-
- if (camel_exception_is_set (&ex)) {
- mail_html_write (md->html, md->stream,
- "Encrypted message not displayed<br><br>\n");
- mail_error_write (md->html, md->stream,
- camel_exception_get_description (&ex));
- camel_exception_clear (&ex);
- } else {
- mail_html_write (md->html, md->stream,
- "Encrypted message<br><br>\n"
- "Click icon to decrypt.");
- }
-
- mail_html_write (md->html, md->stream, "</td></tr></table>");
- return NULL;
-}
-
-static char *
-try_inline_pgp (char *start, MailDisplay *md)
-{
- char *end, *ciphertext, *plaintext;
-
- /* FIXME: This should deal with signed data as well. */
-
- end = strstr (start, "-----END PGP MESSAGE-----");
- if (!end)
- return start;
-
- end += sizeof ("-----END PGP MESSAGE-----") - 1;
-
- mail_html_write (md->html, md->stream, "<hr>");
-
- ciphertext = g_strndup (start, end - start);
- plaintext = decode_pgp (ciphertext, md);
- g_free (ciphertext);
- if (plaintext) {
- mail_html_write (md->html, md->stream,
- "<table width=\"100%%\" border=2 "
- "cellpadding=4><tr><td>");
- mail_text_write (md->html, md->stream, "%s", plaintext);
- mail_html_write (md->html, md->stream, "</td></tr></table>");
- g_free (plaintext);
- }
-
- return end;
-}
-
-static char *
-try_uudecoding (char *start, MailDisplay *md)
-{
- int mode, len, state = 0;
- char *filename, *estart, *p, *out, uulen = 0;
- guint32 save = 0;
- CamelMimePart *part;
-
- /* Make sure it's a real uudecode begin line:
- * begin [0-7]+ .*
- */
- mode = strtoul (start + 6, &p, 8);
- if (p == start + 6 || *p != ' ')
- return start;
- estart = strchr (start, '\n');
- if (!estart)
- return start;
-
- while (isspace ((unsigned char)*p))
- p++;
- filename = g_strndup (p, estart++ - p);
-
- /* Make sure there's an end line. */
- p = strstr (p, "\nend\n");
- if (!p) {
- g_free (filename);
- return start;
- }
-
- out = g_malloc (p - estart);
- len = uudecode_step (estart, p - estart, out, &state, &save, &uulen);
-
- part = fake_mime_part_from_data (out, len, "application/octet-stream");
- g_free (out);
- camel_mime_part_set_filename (part, filename);
- g_free (filename);
- camel_object_hook_event (CAMEL_OBJECT (md->current_message),
- "finalize", destroy_part, part);
-
- mail_html_write (md->html, md->stream, "<hr>");
- call_handler_function (part, md);
-
- return p + 4;
-}
-
-static char *
-try_inline_binhex (char *start, MailDisplay *md)
-{
- char *p;
- CamelMimePart *part;
-
- /* Find data start. */
- p = strstr (start, "\n:");
- if (!p)
- return start;
-
- /* And data end. */
- p = strchr (p + 2, ':');
- if (!p || (*(p + 1) != '\n' && *(p + 1) != '\0'))
- return start;
- p += 2;
-
- part = fake_mime_part_from_data (start, p - start,
- "application/mac-binhex40");
- camel_object_hook_event (CAMEL_OBJECT (md->current_message),
- "finalize", destroy_part, part);
-
- mail_html_write (md->html, md->stream, "<hr>");
- call_handler_function (part, md);
-
- return p;
-}
-
-static void
-free_byte_array (CamelObject *obj, gpointer event_data, gpointer user_data)
-{
- /* We don't have to do a forward event here right now */
- g_byte_array_free (user_data, TRUE);
-}
-
-/* text/enriched (RFC 1896) or text/richtext (included in RFC 1341) */
-static gboolean
-handle_text_enriched (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- static GHashTable *translations = NULL;
- CamelDataWrapper *wrapper =
- camel_medium_get_content_object (CAMEL_MEDIUM (part));
- GString *string;
- GByteArray *ba;
- char *text, *p, *xed;
- int len, nofill = 0;
- gboolean enriched;
-
- if (!translations) {
- translations = g_hash_table_new (g_strcase_hash,
- g_strcase_equal);
- g_hash_table_insert (translations, "bold", "<b>");
- g_hash_table_insert (translations, "/bold", "</b>");
- g_hash_table_insert (translations, "italic", "<i>");
- g_hash_table_insert (translations, "/italic", "</i>");
- g_hash_table_insert (translations, "fixed", "<tt>");
- g_hash_table_insert (translations, "/fixed", "</tt>");
- g_hash_table_insert (translations, "smaller", "<font size=-1>");
- g_hash_table_insert (translations, "/smaller", "</font>");
- g_hash_table_insert (translations, "bigger", "<font size=+1>");
- g_hash_table_insert (translations, "/bigger", "</font>");
- g_hash_table_insert (translations, "underline", "<u>");
- g_hash_table_insert (translations, "/underline", "</u>");
- g_hash_table_insert (translations, "center", "<p align=center>");
- g_hash_table_insert (translations, "/center", "</p>");
- g_hash_table_insert (translations, "flushleft", "<p align=left>");
- g_hash_table_insert (translations, "/flushleft", "</p>");
- g_hash_table_insert (translations, "flushright", "<p align=right>");
- g_hash_table_insert (translations, "/flushright", "</p>");
- g_hash_table_insert (translations, "excerpt", "<blockquote>");
- g_hash_table_insert (translations, "/excerpt", "</blockquote>");
- g_hash_table_insert (translations, "paragraph", "<p>");
- g_hash_table_insert (translations, "signature", "<address>");
- g_hash_table_insert (translations, "/signature", "</address>");
- g_hash_table_insert (translations, "comment", "<!-- ");
- g_hash_table_insert (translations, "/comment", " -->");
- g_hash_table_insert (translations, "param", "<!-- ");
- g_hash_table_insert (translations, "/param", " -->");
- g_hash_table_insert (translations, "np", "<hr>");
- }
-
- text = get_data_wrapper_text (wrapper);
- if (!text)
- return FALSE;
-
- if (!g_strcasecmp (mime_type, "text/richtext")) {
- enriched = FALSE;
- mail_html_write (md->html, md->stream,
- "\n<!-- text/richtext -->\n");
- } else {
- enriched = TRUE;
- mail_html_write (md->html, md->stream,
- "\n<!-- text/enriched -->\n");
- }
-
- /* This is not great code, but I don't feel like fixing it right
- * now. I mean, it's just text/enriched...
- */
- p = text;
- string = g_string_sized_new (2 * strlen (p));
-
- while (p) {
- len = strcspn (p, " <>&\n");
- if (len)
- g_string_sprintfa (string, "%.*s", len, p);
-
- p += len;
- if (!*p)
- break;
-
- switch (*p++) {
- case ' ':
- while (*p == ' ') {
- g_string_append (string, "&nbsp;");
- p++;
- }
- g_string_append (string, " ");
- break;
-
- case '\n':
- g_string_append (string, " ");
- if (enriched && nofill <= 0) {
- while (*p == '\n') {
- g_string_append (string, "<br>");
- p++;
- }
- }
- break;
-
- case '>':
- g_string_append (string, "&gt;");
- break;
-
- case '&':
- g_string_append (string, "&amp;");
- break;
-
- case '<':
- if (enriched) {
- if (*p == '<') {
- g_string_append (string, "&lt;");
- p++;
- break;
- }
- } else {
- if (strncmp (p, "lt>", 3) == 0) {
- g_string_append (string, "&lt;");
- p += 3;
- break;
- } else if (strncmp (p, "nl>", 3) == 0) {
- g_string_append (string, "<br>");
- p += 3;
- break;
- }
- }
-
- if (strncmp (p, "nofill>", 7) == 0) {
- nofill++;
- g_string_append (string, "<pre>");
- } else if (strncmp (p, "/nofill>", 8) == 0) {
- nofill--;
- g_string_append (string, "</pre>");
- } else {
- char *copy, *match;
-
- len = strcspn (p, ">");
- copy = g_strndup (p, len);
- match = g_hash_table_lookup (translations,
- copy);
- g_free (copy);
- if (match)
- g_string_append (string, match);
- }
-
- p = strchr (p, '>');
- if (p)
- p++;
- }
- }
- g_free (text);
-
- ba = g_byte_array_new ();
- g_byte_array_append (ba, (const guint8 *)string->str,
- strlen (string->str));
- g_string_free (string, TRUE);
-
- xed = g_strdup_printf ("x-evolution-data:%p", part);
- mail_html_write (md->html, md->stream,
- "<iframe src=\"%s\" frameborder=0 scrolling=no>"
- "</iframe>", xed);
- add_url (xed, ba, md);
- camel_object_hook_event (CAMEL_OBJECT (md->current_message),
- "finalize", free_byte_array, ba);
-
- return TRUE;
-}
-
-static gboolean
-handle_text_html (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- mail_html_write (md->html, md->stream, "\n<!-- text/html -->\n");
- mail_html_write (md->html, md->stream,
- "<iframe src=\"%s\" frameborder=0 scrolling=no>"
- "</iframe>", get_cid (part, md));
- return TRUE;
-}
-
-static gboolean
-handle_image (CamelMimePart *part, const char *mime_type, MailDisplay *md)
-{
- mail_html_write (md->html, md->stream, "<img src=\"%s\">",
- get_cid (part, md));
- return TRUE;
-}
-
-static gboolean
-handle_multipart_mixed (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- CamelDataWrapper *wrapper =
- camel_medium_get_content_object (CAMEL_MEDIUM (part));
- CamelMultipart *mp;
- int i, nparts;
- gboolean output = FALSE;
-
- g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE);
- mp = CAMEL_MULTIPART (wrapper);
-
- nparts = camel_multipart_get_number (mp);
- for (i = 0; i < nparts; i++) {
- if (i != 0 && output)
- mail_html_write (md->html, md->stream, "<hr>\n");
-
- part = camel_multipart_get_part (mp, i);
-
- output = call_handler_function (part, md);
- }
-
- return TRUE;
-}
-
-static gboolean
-is_rfc2015 (CamelMimePart *part)
-{
- int nparts;
- char *text;
- CamelDataWrapper *wrapper;
- CamelMultipart *mp;
- GMimeContentField *type;
-
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- mp = CAMEL_MULTIPART (wrapper);
- nparts = camel_multipart_get_number (mp);
- if (nparts != 2)
- return FALSE;
-
- /* Check for application/pgp-encrypted in the first part. */
- part = camel_multipart_get_part (mp, 0);
- type = camel_mime_part_get_content_type (part);
- if (!gmime_content_field_is_type (type, "application", "pgp-encrypted"))
- return FALSE;
-
- /* Check version. */
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- text = get_data_wrapper_text (wrapper);
- if (!text || !strstr(text, "Version: 1")) {
- g_free(text);
- return FALSE;
- }
- g_free(text);
-
- /* Check for application/octet-stream in the second part. */
- part = camel_multipart_get_part(mp, 1);
- type = camel_mime_part_get_content_type (part);
- if (!gmime_content_field_is_type (type, "application", "octet-stream"))
- return FALSE;
-
- return TRUE;
-}
-
-static gboolean
-handle_multipart_encrypted (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- CamelDataWrapper *wrapper =
- camel_medium_get_content_object (CAMEL_MEDIUM (part));
- CamelMultipart *mp;
- char *ciphertext, *plaintext;
-
- g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE);
- mp = CAMEL_MULTIPART (wrapper);
-
- /* Currently we only handle RFC2015-style PGP encryption. */
- if (!is_rfc2015 (part))
- return handle_multipart_mixed (part, mime_type, md);
-
- part = camel_multipart_get_part (mp, 1);
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- ciphertext = get_data_wrapper_text (wrapper);
- if (!ciphertext)
- return FALSE;
-
- plaintext = decode_pgp (ciphertext, md);
- if (plaintext) {
- CamelStream *memstream;
-
- memstream = camel_stream_mem_new_with_buffer (plaintext,
- strlen (plaintext));
- part = camel_mime_part_new ();
- camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (part),
- memstream);
- camel_object_unref (CAMEL_OBJECT (memstream));
-
- mail_html_write (md->html, md->stream,
- "<table width=\"100%%\" border=2 "
- "cellpadding=4><tr><td>");
- call_handler_function (part, md);
- mail_html_write (md->html, md->stream, "</td></tr></table>");
- camel_object_hook_event (CAMEL_OBJECT (md->current_message),
- "finalize", destroy_part, part);
- g_free (plaintext);
- }
-
- return TRUE;
-}
-
-/* As seen in RFC 2387! */
-static gboolean
-handle_multipart_related (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- CamelDataWrapper *wrapper =
- camel_medium_get_content_object (CAMEL_MEDIUM (part));
- CamelMultipart *mp;
- CamelMimePart *body_part, *display_part = NULL;
- GMimeContentField *content_type;
- const char *start;
- int i, nparts;
-
- g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE);
- mp = CAMEL_MULTIPART (wrapper);
- nparts = camel_multipart_get_number (mp);
-
- content_type = camel_mime_part_get_content_type (part);
- start = gmime_content_field_get_parameter (content_type, "start");
- if (start) {
- int len;
-
- /* The "start" parameter includes <>s, which Content-Id
- * does not.
- */
- len = strlen (start) - 2;
-
- for (i = 0; i < nparts; i++) {
- const char *cid;
-
- body_part = camel_multipart_get_part (mp, i);
- cid = camel_mime_part_get_content_id (body_part);
-
- if (!strncmp (cid, start + 1, len) &&
- strlen (cid) == len) {
- display_part = body_part;
- break;
- }
- }
-
- if (!display_part) {
- /* Oops. Hrmph. */
- return handle_multipart_mixed (part, mime_type, md);
- }
- } else {
- /* No start parameter, so it defaults to the first part. */
- display_part = camel_multipart_get_part (mp, 0);
- }
-
- /* Record the Content-IDs of any non-displayed parts. */
- for (i = 0; i < nparts; i++) {
- body_part = camel_multipart_get_part (mp, i);
- if (body_part == display_part)
- continue;
-
- get_cid (body_part, md);
- }
-
- /* Now, display the displayed part. */
- return call_handler_function (display_part, md);
-}
-
-/* RFC 2046 says "display the last part that you are able to display". */
-static CamelMimePart *
-find_preferred_alternative (CamelMultipart *multipart, gboolean want_plain)
-{
- int i, nparts;
- CamelMimePart *preferred_part = NULL;
- gboolean generic;
-
- nparts = camel_multipart_get_number (multipart);
- for (i = 0; i < nparts; i++) {
- CamelMimePart *part = camel_multipart_get_part (multipart, i);
- char *mime_type = gmime_content_field_get_mime_type (
- camel_mime_part_get_content_type (part));
-
- g_strdown (mime_type);
- if (want_plain && !strcmp (mime_type, "text/plain"))
- return part;
- if (lookup_handler (mime_type, &generic) &&
- (!preferred_part || !generic))
- preferred_part = part;
- g_free (mime_type);
- }
-
- return preferred_part;
-}
-
-static gboolean
-handle_multipart_alternative (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- CamelDataWrapper *wrapper =
- camel_medium_get_content_object (CAMEL_MEDIUM (part));
- CamelMultipart *multipart;
- CamelMimePart *mime_part;
-
- g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE);
- multipart = CAMEL_MULTIPART (wrapper);
-
- mime_part = find_preferred_alternative (multipart, FALSE);
- if (mime_part)
- return call_handler_function (mime_part, md);
- else
- return handle_unknown_type (part, mime_type, md);
-}
-
-/* RFC 1740 */
-static gboolean
-handle_multipart_appledouble (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- CamelDataWrapper *wrapper =
- camel_medium_get_content_object (CAMEL_MEDIUM (part));
- CamelMultipart *multipart;
-
- g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE);
- multipart = CAMEL_MULTIPART (wrapper);
-
- /* The first part is application/applefile and is not useful
- * to us. The second part _may_ be displayable data. Most
- * likely it's application/octet-stream though.
- */
- part = camel_multipart_get_part (multipart, 1);
- return call_handler_function (part, md);
-}
-
-static void
-handle_mystery (CamelMimePart *part, MailDisplay *md,
- const char *url, const char *icon_name, const char *id,
- const char *action)
-{
- const char *info;
- char *htmlinfo;
- GMimeContentField *content_type;
-
- mail_html_write (md->html, md->stream, "<table><tr><td>");
-
- /* Draw the icon, surrounded by an <a href> if we have a URL,
- * or a plain inactive border if not.
- */
- if (url) {
- mail_html_write (md->html, md->stream,
- "<a href=\"%s\">", url);
- } else {
- mail_html_write (md->html, md->stream,
- "<table border=2><tr><td>");
- }
- mail_html_write (md->html, md->stream, "<img src=\"%s\">",
- get_url_for_icon (icon_name, md));
-
- if (url)
- mail_html_write (md->html, md->stream, "</a>");
- else
- mail_html_write (md->html, md->stream, "</td></tr></table>");
- mail_html_write (md->html, md->stream, "</td><td>%s<br>", id);
-
- /* Write a description, if we have one. */
- info = camel_mime_part_get_description (part);
- if (info) {
- htmlinfo = e_text_to_html (info, E_TEXT_TO_HTML_CONVERT_URLS);
- mail_html_write (md->html, md->stream, "Description: %s<br>",
- htmlinfo);
- g_free (htmlinfo);
- }
-
- /* Write the name, if we have it. */
- content_type = camel_mime_part_get_content_type (part);
- info = gmime_content_field_get_parameter (content_type, "name");
- if (!info)
- info = camel_mime_part_get_filename (part);
- if (info) {
- htmlinfo = e_text_to_html (info, 0);
- mail_html_write (md->html, md->stream, "Name: %s<br>",
- htmlinfo);
- g_free (htmlinfo);
- }
-
- /* Describe the click action, if any. */
- if (action) {
- mail_html_write (md->html, md->stream,
- "<br>Click on the icon to %s.", action);
- }
-
- mail_html_write (md->html, md->stream, "</td></tr></table>");
-}
-
-static gboolean
-handle_audio (CamelMimePart *part, const char *mime_type, MailDisplay *md)
-{
- char *id;
- const char *desc;
-
- desc = gnome_vfs_mime_get_value (mime_type, "description");
- if (desc)
- id = g_strdup_printf ("%s data", desc);
- else {
- id = g_strdup_printf ("Audio data in \"%s\" format.",
- mime_type);
- }
- handle_mystery (part, md, get_cid (part, md), "gnome-audio2.png",
- id, "play it");
- g_free (id);
-
- return TRUE;
-}
-
-static gboolean
-handle_message_rfc822 (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- CamelDataWrapper *wrapper =
- camel_medium_get_content_object (CAMEL_MEDIUM (part));
-
- g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (wrapper), FALSE);
-
- mail_html_write (md->html, md->stream, "<blockquote>");
- mail_format_mime_message (CAMEL_MIME_MESSAGE (wrapper), md);
- mail_html_write (md->html, md->stream, "</blockquote>");
-
- return TRUE;
-}
-
-static gboolean
-handle_message_external_body (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- GMimeContentField *type;
- const char *access_type;
- char *url = NULL, *desc = NULL;
-
- type = camel_mime_part_get_content_type (part);
- access_type = gmime_content_field_get_parameter (type, "access-type");
- if (!access_type)
- goto fallback;
-
- if (!g_strcasecmp (access_type, "ftp") ||
- !g_strcasecmp (access_type, "anon-ftp")) {
- const char *name, *site, *dir, *mode, *ftype;
- char *path;
-
- name = gmime_content_field_get_parameter (type, "name");
- site = gmime_content_field_get_parameter (type, "site");
- if (name == NULL || site == NULL)
- goto fallback;
- dir = gmime_content_field_get_parameter (type, "directory");
- mode = gmime_content_field_get_parameter (type, "mode");
-
- /* Generate the path. */
- if (dir) {
- const char *p = dir + strlen (dir);
-
- path = g_strdup_printf ("%s%s%s%s",
- *dir == '/' ? "" : "/",
- dir,
- *p == '/' ? "" : "/",
- name);
- } else {
- path = g_strdup_printf ("%s%s",
- *name == '/' ? "" : "/",
- name);
- }
-
- if (mode && *mode == 'A')
- ftype = ";type=A";
- else if (mode && *mode == 'I')
- ftype = ";type=I";
- else
- ftype = "";
-
- url = g_strdup_printf ("ftp://%s%s%s", site, path, ftype);
- g_free (path);
- desc = g_strdup_printf ("Pointer to FTP site (%s)", url);
- } else if (!g_strcasecmp (access_type, "local-file")) {
- const char *name, *site;
-
- name = gmime_content_field_get_parameter (type, "name");
- if (name == NULL)
- goto fallback;
- site = gmime_content_field_get_parameter (type, "site");
-
- url = g_strdup_printf ("file://%s%s", *name == '/' ? "" : "/",
- name);
- desc = g_strdup_printf ("Pointer to local file (%s)%s%s%s",
- name, site ? " valid at site \"" : "",
- site ? site : "", site ? "\"" : "");
- } else if (!g_strcasecmp (access_type, "URL")) {
- const char *urlparam;
- char *s, *d;
-
- /* RFC 2017 */
-
- urlparam = gmime_content_field_get_parameter (type, "url");
- if (urlparam == NULL)
- goto fallback;
-
- /* For obscure MIMEy reasons, the URL may be split into
- * multiple words, and needs to be rejoined. (The URL
- * must have any real whitespace %-encoded, so we just
- * get rid of all of it.
- */
- url = g_strdup (urlparam);
- s = d = url;
-
- while (*s) {
- if (!isspace ((unsigned char)*s))
- *d++ = *s;
- s++;
- }
- *d = *s;
-
- desc = g_strdup_printf ("Pointer to remote data (%s)", url);
- }
-
- fallback:
- if (!desc) {
- if (access_type) {
- desc = g_strdup_printf ("Pointer to unknown external "
- "data (\"%s\" type)",
- access_type);
- } else
- desc = g_strdup ("Malformed external-body part.");
- }
-
- handle_mystery (part, md, url, "gnome-globe.png", desc,
- url ? "open it in a browser" : NULL);
-
- g_free (desc);
- g_free (url);
- return TRUE;
-}
-
-static gboolean
-handle_undisplayable (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- const char *desc;
- char *id;
-
- desc = gnome_vfs_mime_get_value (mime_type, "description");
- if (desc)
- id = g_strdup (desc);
- else
- id = g_strdup_printf ("Data of type \"%s\".", mime_type);
- handle_mystery (part, md, get_cid (part, md), "gnome-question.png",
- id, "save it to disk");
- g_free (id);
-
- return TRUE;
-}
-
-static gboolean
-handle_unknown_type (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- char *type;
-
- /* Don't give up quite yet. */
- type = mail_identify_mime_part (part);
- if (type) {
- mime_handler_fn handler_function;
- gboolean generic, output;
-
- handler_function = lookup_handler (type, &generic);
- if (handler_function &&
- handler_function != handle_unknown_type) {
- output = (*handler_function) (part, type, md);
- g_free (type);
- return output;
- }
- } else
- type = g_strdup (mime_type);
-
- /* OK. Give up. */
- handle_undisplayable (part, type, md);
- g_free (type);
-
- return TRUE;
-}
-
-static gboolean
-handle_via_bonobo (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- mail_html_write (md->html, md->stream,
- "<object classid=\"%s\" type=\"%s\">",
- get_cid (part, md), mime_type);
-
- /* Call handle_undisplayable to output its HTML inside the
- * <object> ... </object>. It will only be displayed if the
- * object loading fails.
- */
- handle_undisplayable (part, mime_type, md);
-
- mail_html_write (md->html, md->stream, "</object>");
-
- return TRUE;
-}
-
-static gboolean
-handle_via_external (CamelMimePart *part, const char *mime_type,
- MailDisplay *md)
-{
- GnomeVFSMimeApplication *app;
- const char *desc, *icon;
- char *action, *url;
-
- app = gnome_vfs_mime_get_default_application (mime_type);
- g_return_val_if_fail (app != NULL, FALSE);
-
- desc = gnome_vfs_mime_get_value (mime_type, "description");
- icon = gnome_vfs_mime_get_value (mime_type, "icon-filename");
- if (!icon)
- icon = "gnome-unknown.png";
- action = g_strdup_printf ("open the file in %s", app->name);
- url = g_strdup_printf ("x-evolution-external:%s", app->command);
- handle_mystery (part, md, url, icon, desc, action);
- add_url (url, part, md);
-
- g_free (action);
-
- return TRUE;
-}
-
-char *
-mail_get_message_body (CamelDataWrapper *data, gboolean want_plain, gboolean *is_html)
-{
- CamelMultipart *mp;
- CamelMimePart *subpart;
- int i, nparts;
- char *subtext, *old;
- const char *boundary, *disp;
- char *text = NULL;
- GMimeContentField *mime_type;
-
- /* We only include text, message, and multipart bodies. */
- mime_type = camel_data_wrapper_get_mime_type_field (data);
-
- /* FIXME: This is wrong. We don't want to include large
- * images. But if we don't do it this way, we don't get
- * the headers...
- */
- if (g_strcasecmp (mime_type->type, "message") == 0) {
- *is_html = FALSE;
- return get_data_wrapper_text (data);
- }
-
- if (g_strcasecmp (mime_type->type, "text") == 0) {
- *is_html = !g_strcasecmp (mime_type->subtype, "html");
- return get_data_wrapper_text (data);
- }
-
- /* If it's not message and it's not text, and it's not
- * multipart, we don't want to deal with it.
- */
- if (g_strcasecmp (mime_type->type, "multipart") != 0)
- return NULL;
-
- mp = CAMEL_MULTIPART (data);
-
- if (g_strcasecmp (mime_type->subtype, "alternative") == 0) {
- /* Pick our favorite alternative and reply to it. */
-
- subpart = find_preferred_alternative (mp, want_plain);
- if (!subpart)
- return NULL;
-
- data = camel_medium_get_content_object (
- CAMEL_MEDIUM (subpart));
- return mail_get_message_body (data, want_plain, is_html);
- }
-
- nparts = camel_multipart_get_number (mp);
-
- /* Otherwise, concatenate all the parts that we can. If we find
- * an HTML part in there though, return just that: We don't want
- * to deal with merging HTML and non-HTML parts.
- */
- boundary = camel_multipart_get_boundary (mp);
- for (i = 0; i < nparts; i++) {
- subpart = camel_multipart_get_part (mp, i);
-
- disp = camel_mime_part_get_disposition (subpart);
- if (disp && g_strcasecmp (disp, "inline") != 0)
- continue;
-
- data = camel_medium_get_content_object (
- CAMEL_MEDIUM (subpart));
- subtext = mail_get_message_body (data, want_plain, is_html);
- if (!subtext)
- continue;
- if (*is_html) {
- g_free (text);
- return subtext;
- }
-
- if (text) {
- old = text;
- text = g_strdup_printf ("%s\n--%s\n%s", text,
- boundary, subtext);
- g_free (subtext);
- g_free (old);
- } else
- text = subtext;
- }
-
- if (!text)
- return NULL;
-
- return text;
-}
-
-EMsgComposer *
-mail_generate_reply (CamelMimeMessage *message, gboolean to_all)
-{
- CamelDataWrapper *contents;
- char *text, *subject;
- EMsgComposer *composer;
- gboolean want_plain, is_html;
- const char *repl_to, *message_id, *references;
- GList *to, *cc;
-
- want_plain = !mail_config_send_html ();
-
- contents = camel_medium_get_content_object (CAMEL_MEDIUM (message));
- text = mail_get_message_body (contents, want_plain, &is_html);
-
- composer = E_MSG_COMPOSER (e_msg_composer_new ());
-
- /* Set the quoted reply text. */
- if (text) {
- char *repl_text;
-
- if (is_html) {
- repl_text = g_strdup_printf ("<blockquote><i>\n%s\n"
- "</i></blockquote>\n",
- text);
- } else {
- char *s, *d, *quoted_text;
- int lines, len;
-
- /* Count the number of lines in the body. If
- * the text ends with a \n, this will be one
- * too high, but that's ok. Allocate enough
- * space for the text and the "> "s.
- */
- for (s = text, lines = 0; s; s = strchr (s + 1, '\n'))
- lines++;
- quoted_text = g_malloc (strlen (text) + lines * 2);
-
- s = text;
- d = quoted_text;
-
- /* Copy text to quoted_text line by line,
- * prepending "> ".
- */
- while (1) {
- len = strcspn (s, "\n");
- if (len == 0 && !*s)
- break;
- sprintf (d, "> %.*s\n", len, s);
- s += len;
- if (!*s++)
- break;
- d += len + 3;
- }
-
- /* Now convert that to HTML. */
- repl_text = e_text_to_html (quoted_text,
- E_TEXT_TO_HTML_PRE);
- g_free (quoted_text);
- }
- e_msg_composer_set_body_text (composer, repl_text);
- g_free (repl_text);
- g_free (text);
- }
-
- /* Set the recipients */
- repl_to = camel_mime_message_get_reply_to (message);
- if (!repl_to)
- repl_to = camel_mime_message_get_from (message);
- to = g_list_append (NULL, (gpointer)repl_to);
-
- if (to_all) {
- const CamelInternetAddress *recip;
- const char *name, *addr;
- char *fulladdr;
- int i;
-
- recip = camel_mime_message_get_recipients (message,
- CAMEL_RECIPIENT_TYPE_TO);
- i = 0;
- cc = NULL;
- while (camel_internet_address_get (recip, i++, &name, &addr)) {
- if (*name) {
- fulladdr = g_strdup_printf ("\"%s\" <%s>",
- name, addr);
- } else
- fulladdr = g_strdup (addr);
- cc = g_list_append (cc, fulladdr);
- }
-
- recip = camel_mime_message_get_recipients (message,
- CAMEL_RECIPIENT_TYPE_CC);
- i = 0;
- while (camel_internet_address_get (recip, i++, &name, &addr)) {
- if (*name) {
- fulladdr = g_strdup_printf ("\"%s\" <%s>",
- name, addr);
- } else
- fulladdr = g_strdup (addr);
- cc = g_list_append (cc, fulladdr);
- }
- } else
- cc = NULL;
-
- /* Set the subject of the new message. */
- subject = (char *)camel_mime_message_get_subject (message);
- if (!subject)
- subject = g_strdup ("");
- else {
- if (!g_strncasecmp (subject, "Re: ", 4))
- subject = g_strdup (subject);
- else
- subject = g_strdup_printf ("Re: %s", subject);
- }
-
- e_msg_composer_set_headers (composer, to, cc, NULL, subject);
- g_list_free (to);
- g_list_free (cc);
- g_free (subject);
-
- /* Add In-Reply-To and References. */
- message_id = camel_medium_get_header (CAMEL_MEDIUM (message),
- "Message-Id");
- references = camel_medium_get_header (CAMEL_MEDIUM (message),
- "References");
- if (message_id) {
- e_msg_composer_add_header (composer, "In-Reply-To",
- message_id);
- if (references) {
- char *reply_refs;
- reply_refs = g_strdup_printf ("%s %s", references,
- message_id);
- e_msg_composer_add_header (composer, "References",
- reply_refs);
- g_free (reply_refs);
- }
- } else if (references)
- e_msg_composer_add_header (composer, "References", references);
-
- return composer;
-}
diff --git a/mail/mail-identify.c b/mail/mail-identify.c
deleted file mode 100644
index e8d82cb8f5..0000000000
--- a/mail/mail-identify.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Dan Winship <danw@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc. (http://www.helixcode.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.
- *
- */
-
-#include <config.h>
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-#include <libgnomevfs/gnome-vfs-mime.h>
-#include <libgnomevfs/gnome-vfs-mime-sniff-buffer.h>
-#include "mail.h"
-
-/**
- * mail_identify_mime_part:
- * @part: a CamelMimePart
- *
- * Try to identify the MIME type of the data in @part (which presumably
- * doesn't have a useful Content-Type).
- **/
-char *
-mail_identify_mime_part (CamelMimePart *part)
-{
- GMimeContentField *content_type;
- const char *filename, *type;
- GnomeVFSMimeSniffBuffer *sniffer;
- CamelStream *memstream;
- CamelDataWrapper *data;
- GByteArray *ba;
-
- content_type = camel_mime_part_get_content_type (part);
-
-
- /* Try identifying based on name in Content-Type or
- * filename in Content-Disposition.
- */
- filename = gmime_content_field_get_parameter (content_type, "name");
- if (filename) {
- type = gnome_vfs_mime_type_from_name_or_default (filename,
- NULL);
- if (type)
- return g_strdup (type);
- }
-
- filename = camel_mime_part_get_filename (part);
- if (filename) {
- type = gnome_vfs_mime_type_from_name_or_default (filename,
- NULL);
- if (type)
- return g_strdup (type);
- }
-
-
- /* Try file magic. */
- data = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- ba = g_byte_array_new ();
- memstream = camel_stream_mem_new_with_byte_array (ba);
- camel_data_wrapper_write_to_stream (data, memstream);
- if (ba->len) {
- sniffer = gnome_vfs_mime_sniff_buffer_new_from_memory (
- ba->data, ba->len);
- type = gnome_vfs_get_mime_type_for_buffer (sniffer);
- gnome_vfs_mime_sniff_buffer_free (sniffer);
- } else
- type = NULL;
- camel_object_unref (CAMEL_OBJECT (memstream));
-
- if (type)
- return g_strdup (type);
-
-
- /* Another possibility to try is the x-mac-type / x-mac-creator
- * parameter to Content-Type used by some Mac email clients. That
- * would require a Mac type to mime type conversion table.
- */
-
-
- /* We give up. */
- return NULL;
-}
diff --git a/mail/mail-local.c b/mail/mail-local.c
deleted file mode 100644
index eb03db0dd4..0000000000
--- a/mail/mail-local.c
+++ /dev/null
@@ -1,504 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* mail-local.c: Local mailbox support. */
-
-/*
- * Author:
- * Michael Zucchi <NotZed@helixcode.com>
- * Peter Williams <peterw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-
-/*
- code for handling local mail boxes
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <bonobo.h>
-#include <gnome.h>
-#include <glade/glade.h>
-
-#include "Evolution.h"
-#include "evolution-storage.h"
-
-#include "evolution-shell-component.h"
-#include "folder-browser.h"
-
-#include "camel/camel.h"
-
-#include "filter/vfolder-context.h"
-#include "filter/vfolder-rule.h"
-#include "filter/vfolder-editor.h"
-
-#include "mail.h"
-#include "mail-local.h"
-#include "mail-tools.h"
-#include "mail-threads.h"
-
-#define d(x)
-
-struct _local_meta {
- char *path; /* path of metainfo file */
-
- char *format; /* format of mailbox */
- char *name; /* name of mbox itself */
-};
-
-static struct _local_meta *
-load_metainfo(const char *path)
-{
- xmlDocPtr doc;
- xmlNodePtr node;
- struct _local_meta *meta;
-
- meta = g_malloc0(sizeof(*meta));
- meta->path = g_strdup(path);
-
- printf("Loading folder metainfo from : %s\n", meta->path);
-
- doc = xmlParseFile(meta->path);
- if (doc == NULL) {
- goto dodefault;
- }
- node = doc->root;
- if (strcmp(node->name, "folderinfo")) {
- goto dodefault;
- }
- node = node->childs;
- while (node) {
- if (!strcmp(node->name, "folder")) {
- meta->format = xmlGetProp(node, "type");
- meta->name = xmlGetProp(node, "name");
- }
- node = node->next;
- }
- xmlFreeDoc(doc);
- return meta;
-
-dodefault:
- meta->format = g_strdup("mbox"); /* defaults */
- meta->name = g_strdup("mbox");
- if (doc)
- xmlFreeDoc(doc);
- return meta;
-}
-
-static void
-free_metainfo(struct _local_meta *meta)
-{
- g_free(meta->path);
- g_free(meta->format);
- g_free(meta->name);
- g_free(meta);
-}
-
-static int
-save_metainfo(struct _local_meta *meta)
-{
- xmlDocPtr doc;
- xmlNodePtr root, node;
- int ret;
-
- printf("Saving folder metainfo to : %s\n", meta->path);
-
- doc = xmlNewDoc("1.0");
- root = xmlNewDocNode(doc, NULL, "folderinfo", NULL);
- xmlDocSetRootElement(doc, root);
-
- node = xmlNewChild(root, NULL, "folder", NULL);
- xmlSetProp(node, "type", meta->format);
- xmlSetProp(node, "name", meta->name);
-
- ret = xmlSaveFile(meta->path, doc);
- xmlFreeDoc(doc);
- return ret;
-}
-
-/* maps a local uri to the real type */
-char *
-mail_local_map_uri(const char *uri)
-{
- CamelURL *url;
- char *metapath;
- char *storename;
- struct _local_meta *meta;
- CamelException *ex;
-
- if (strncmp(uri, "file:", 5)) {
- g_warning("Trying to map non-local uri: %s", uri);
- return g_strdup(uri);
- }
-
- ex = camel_exception_new();
- url = camel_url_new(uri, ex);
- if (camel_exception_is_set(ex)) {
- camel_exception_free(ex);
- return g_strdup(uri);
- }
- camel_exception_free(ex);
-
- metapath = g_strdup_printf("%s/local-metadata.xml", url->path);
- meta = load_metainfo(metapath);
- g_free(metapath);
-
- /* change file: to format: */
- camel_url_set_protocol(url, meta->format);
- storename = camel_url_to_string(url, TRUE);
- camel_url_free(url);
-
- return storename;
-}
-
-CamelFolder *
-mail_tool_local_uri_to_folder(const char *uri, CamelException *ex)
-{
- CamelURL *url;
- char *metapath;
- char *storename;
- CamelFolder *folder = NULL;
- struct _local_meta *meta;
-
- if (strncmp(uri, "file:", 5)) {
- return NULL;
- }
-
- printf("opening local folder %s\n", uri);
-
- /* get the actual location of the mailbox */
- url = camel_url_new(uri, ex);
- if (camel_exception_is_set(ex)) {
- return NULL;
- }
-
- metapath = g_strdup_printf("%s/local-metadata.xml", url->path);
- meta = load_metainfo(metapath);
- g_free(metapath);
-
- /* change file: to format: */
- camel_url_set_protocol(url, meta->format);
- storename = camel_url_to_string(url, TRUE);
-
- printf("store name is %s\n", storename);
-
- folder = mail_tool_get_folder_from_urlname (storename, meta->name, FALSE, ex);
- camel_url_free(url);
- g_free (storename);
- free_metainfo(meta);
-
- return folder;
-}
-
-/*
- open new
- copy old->new
- close old
- rename old oldsave
- rename new old
- open oldsave
- delete oldsave
-
- close old
- rename oldtmp
- open new
- open oldtmp
- copy oldtmp new
- close oldtmp
- close oldnew
-
-*/
-
-static void update_progress(char *fmt, float percent)
-{
- if (fmt)
- mail_op_set_message ("%s", fmt);
- /*mail_op_set_percentage (percent);*/
-}
-
-/* ******************** */
-
-typedef struct reconfigure_folder_input_s {
- FolderBrowser *fb;
- gchar *newtype;
- GtkWidget *frame;
- GtkWidget *apply;
- GtkWidget *cancel;
- GtkOptionMenu *optionlist;
-} reconfigure_folder_input_t;
-
-static gchar *describe_reconfigure_folder (gpointer in_data, gboolean gerund);
-static void setup_reconfigure_folder (gpointer in_data, gpointer op_data, CamelException *ex);
-static void do_reconfigure_folder (gpointer in_data, gpointer op_data, CamelException *ex);
-static void cleanup_reconfigure_folder (gpointer in_data, gpointer op_data, CamelException *ex);
-
-static gchar *
-describe_reconfigure_folder (gpointer in_data, gboolean gerund)
-{
- reconfigure_folder_input_t *input = (reconfigure_folder_input_t *) in_data;
-
- if (gerund)
- return g_strdup_printf (_("Changing folder \"%s\" to \"%s\" format"),
- input->fb->uri,
- input->newtype);
- else
- return g_strdup_printf (_("Change folder \"%s\" to \"%s\" format"),
- input->fb->uri,
- input->newtype);
-}
-
-static void
-setup_reconfigure_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- reconfigure_folder_input_t *input = (reconfigure_folder_input_t *) in_data;
-
- if (!IS_FOLDER_BROWSER (input->fb)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "Input has a bad FolderBrowser in reconfigure_folder");
- return;
- }
-
- if (!input->newtype) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No new folder type in reconfigure_folder");
- return;
- }
-
- gtk_object_ref (GTK_OBJECT (input->fb));
-}
-
-static void
-do_reconfigure_folder(gpointer in_data, gpointer op_data, CamelException *ex)
-{
- reconfigure_folder_input_t *input = (reconfigure_folder_input_t *) in_data;
-
- CamelStore *fromstore = NULL, *tostore = NULL;
- char *fromurl = NULL, *tourl = NULL;
- CamelFolder *fromfolder = NULL, *tofolder = NULL;
-
- char *metapath;
- char *tmpname;
- char *uri;
- CamelURL *url = NULL;
- struct _local_meta *meta;
-
- printf("reconfiguring folder: %s to type %s\n", input->fb->uri, input->newtype);
-
- /* get the actual location of the mailbox */
- url = camel_url_new(input->fb->uri, ex);
- if (camel_exception_is_set(ex)) {
- g_warning("%s is not a workable url!", input->fb->uri);
- goto cleanup;
- }
-
- metapath = g_strdup_printf("%s/local-metadata.xml", url->path);
- meta = load_metainfo(metapath);
- g_free(metapath);
-
- /* first, 'close' the old folder */
- if (input->fb->folder != NULL) {
- update_progress("Closing current folder", 0.0);
-
- mail_tool_camel_lock_up ();
- camel_folder_sync(input->fb->folder, FALSE, ex);
- mail_tool_camel_lock_down ();
- camel_object_unref (CAMEL_OBJECT (input->fb->folder));
- input->fb->folder = NULL;
- }
-
- camel_url_set_protocol(url, meta->format);
- fromurl = camel_url_to_string(url, TRUE);
- camel_url_set_protocol(url, input->newtype);
- tourl = camel_url_to_string(url, TRUE);
-
- printf("opening stores %s and %s\n", fromurl, tourl);
-
- mail_tool_camel_lock_up ();
- fromstore = camel_session_get_store(session, fromurl, ex);
- mail_tool_camel_lock_down ();
-
- if (camel_exception_is_set(ex))
- goto cleanup;
-
- mail_tool_camel_lock_up ();
- tostore = camel_session_get_store(session, tourl, ex);
- mail_tool_camel_lock_down ();
- if (camel_exception_is_set(ex))
- goto cleanup;
-
- /* rename the old mbox and open it again */
- tmpname = g_strdup_printf("%s_reconfig", meta->name);
- printf("renaming %s to %s, and opening it\n", meta->name, tmpname);
- update_progress("Renaming old folder and opening", 0.0);
-
- mail_tool_camel_lock_up ();
- camel_store_rename_folder(fromstore, meta->name, tmpname, ex);
- if (camel_exception_is_set(ex)) {
- mail_tool_camel_lock_down ();
- goto cleanup;
- }
-
- fromfolder = camel_store_get_folder(fromstore, tmpname, TRUE, ex);
- if (fromfolder == NULL || camel_exception_is_set(ex)) {
- /* try and recover ... */
- camel_exception_clear (ex);
- camel_store_rename_folder(fromstore, tmpname, meta->name, ex);
- mail_tool_camel_lock_down ();
- goto cleanup;
- }
-
- /* create a new mbox */
- printf("Creating the destination mbox\n");
- update_progress("Creating new folder", 0.0);
-
- tofolder = camel_store_get_folder(tostore, meta->name, TRUE, ex);
- if (tofolder == NULL || camel_exception_is_set(ex)) {
- printf("cannot open destination folder\n");
- /* try and recover ... */
- camel_exception_clear (ex);
- camel_store_rename_folder(fromstore, tmpname, meta->name, ex);
- mail_tool_camel_lock_down ();
- goto cleanup;
- }
-
- update_progress("Copying messages", 0.0);
- mail_tool_move_folder_contents (fromfolder, tofolder, FALSE, ex);
-
- printf("delete old mbox ...\n");
- camel_store_delete_folder(fromstore, tmpname, ex);
- mail_tool_camel_lock_down ();
-
- /* switch format */
- g_free(meta->format);
- meta->format = g_strdup(input->newtype);
- if (save_metainfo(meta) == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, "Cannot save folder metainfo; "
- "you'll probably find you can't\n"
- "open this folder anymore: %s", tourl);
- }
- free_metainfo(meta);
-
- /* force a reload of the newly formatted folder */
- printf("opening new source\n");
- uri = g_strdup(input->fb->uri);
- folder_browser_set_uri(input->fb, uri);
- g_free(uri);
-
- /* and unref our copy of the new folder ... */
- cleanup:
- if (tofolder)
- camel_object_unref (CAMEL_OBJECT (tofolder));
- if (fromfolder)
- camel_object_unref (CAMEL_OBJECT (fromfolder));
- if (fromstore)
- camel_object_unref (CAMEL_OBJECT (fromstore));
- if (tostore)
- camel_object_unref (CAMEL_OBJECT (tostore));
- g_free(fromurl);
- g_free(tourl);
- if (url)
- camel_url_free (url);
-}
-
-static void
-cleanup_reconfigure_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- reconfigure_folder_input_t *input = (reconfigure_folder_input_t *) in_data;
-
- if (camel_exception_is_set(ex)) {
- GtkWidget *win = gtk_widget_get_ancestor((GtkWidget *)input->frame, GTK_TYPE_WINDOW);
- gnome_error_dialog_parented ("If you can no longer open this mailbox, then\n"
- "you may need to repair it manually.", GTK_WINDOW (win));
- }
-
- gtk_object_unref (GTK_OBJECT (input->fb));
- g_free (input->newtype);
-}
-
-static const mail_operation_spec op_reconfigure_folder =
-{
- describe_reconfigure_folder,
- 0,
- setup_reconfigure_folder,
- do_reconfigure_folder,
- cleanup_reconfigure_folder
-};
-
-static void
-reconfigure_clicked(GnomeDialog *d, int button, reconfigure_folder_input_t *data)
-{
- if (button == 0) {
- GtkMenu *menu;
- int type;
- char *types[] = { "mh", "mbox" };
-
- menu = (GtkMenu *)gtk_option_menu_get_menu(data->optionlist);
- type = g_list_index(GTK_MENU_SHELL(menu)->children, gtk_menu_get_active(menu));
- if (type < 0 || type > 1)
- type = 1;
-
- gtk_widget_set_sensitive(data->frame, FALSE);
- gtk_widget_set_sensitive(data->apply, FALSE);
- gtk_widget_set_sensitive(data->cancel, FALSE);
-
- data->newtype = g_strdup (types[type]);
- mail_operation_queue (&op_reconfigure_folder, data, TRUE);
- }
-
- if (button != -1)
- gnome_dialog_close(d);
-}
-
-void
-local_reconfigure_folder(FolderBrowser *fb)
-{
- CamelStore *store;
- GladeXML *gui;
- GnomeDialog *gd;
- reconfigure_folder_input_t *data;
-
- if (fb->folder == NULL) {
- g_warning("Trying to reconfigure nonexistant folder");
- return;
- }
-
- data = g_new (reconfigure_folder_input_t, 1);
-
- store = camel_folder_get_parent_store(fb->folder);
-
- gui = glade_xml_new(EVOLUTION_GLADEDIR "/local-config.glade", "dialog_format");
- gd = (GnomeDialog *)glade_xml_get_widget (gui, "dialog_format");
-
- data->frame = glade_xml_get_widget (gui, "frame_format");
- data->apply = glade_xml_get_widget (gui, "apply_format");
- data->cancel = glade_xml_get_widget (gui, "cancel_format");
- data->optionlist = (GtkOptionMenu *)glade_xml_get_widget (gui, "option_format");
- data->newtype = NULL;
- data->fb = fb;
-
- gtk_label_set_text((GtkLabel *)glade_xml_get_widget (gui, "label_format"),
- ((CamelService *)store)->url->protocol);
-
- gtk_signal_connect((GtkObject *)gd, "clicked", reconfigure_clicked, data);
- gtk_object_unref((GtkObject *)gui);
-
- GDK_THREADS_ENTER ();
- gnome_dialog_run_and_close (GNOME_DIALOG (gd));
- GDK_THREADS_LEAVE ();
-}
diff --git a/mail/mail-local.h b/mail/mail-local.h
deleted file mode 100644
index c5892d29d9..0000000000
--- a/mail/mail-local.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* mail-local.h: Local mailbox support. */
-
-/*
- * Author:
- * Michael Zucchi <NotZed@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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 _MAIL_LOCAL_H
-#define _MAIL_LOCAL_H
-
-#include "camel/camel-folder.h"
-#include "folder-browser.h"
-
-/* mail-local.c */
-CamelFolder *mail_tool_local_uri_to_folder(const char *uri, CamelException *ex);
-void local_reconfigure_folder(FolderBrowser *fb);
-char *mail_local_map_uri(const char *uri);
-
-#endif
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
deleted file mode 100644
index f90d492dd8..0000000000
--- a/mail/mail-ops.c
+++ /dev/null
@@ -1,1975 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* mail-ops.c: callbacks for the mail toolbar/menus */
-
-/*
- * Author :
- * Dan Winship <danw@helixcode.com>
- * Peter Williams <peterw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include <gnome.h>
-#include "mail.h"
-#include "mail-threads.h"
-#include "mail-tools.h"
-#include "mail-ops.h"
-#include "composer/e-msg-composer.h"
-
-/* ** FETCH MAIL ********************************************************** */
-
-typedef struct fetch_mail_input_s
-{
- gchar *source_url;
- gboolean keep_on_server;
- CamelFolder *destination;
- gpointer hook_func;
- gpointer hook_data;
-}
-fetch_mail_input_t;
-
-typedef struct fetch_mail_data_s {
- gboolean empty;
-} fetch_mail_data_t;
-
-static gchar *describe_fetch_mail (gpointer in_data, gboolean gerund);
-static void setup_fetch_mail (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_fetch_mail (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_fetch_mail (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_fetch_mail (gpointer in_data, gboolean gerund)
-{
- fetch_mail_input_t *input = (fetch_mail_input_t *) in_data;
- CamelStore *source;
- char *name;
-
- source = camel_session_get_store (session, input->source_url, NULL);
- if (source) {
- name = camel_service_get_name (CAMEL_SERVICE (source), FALSE);
- camel_object_unref (CAMEL_OBJECT (source));
- } else
- name = input->source_url;
-
- if (gerund)
- return g_strdup_printf (_("Fetching email from %s"), name);
- else
- return g_strdup_printf (_("Fetch email from %s"), name);
-}
-
-static void
-setup_fetch_mail (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- fetch_mail_input_t *input = (fetch_mail_input_t *) in_data;
- fetch_mail_data_t *data = (fetch_mail_data_t *) op_data;
-
- if (!input->source_url) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- _("You have no remote mail source configured "
- "to fetch mail from."));
- return;
- }
-
- if (input->destination == NULL)
- return;
-
- if (!CAMEL_IS_FOLDER (input->destination)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- _("Bad folder passed to fetch_mail"));
- return;
- }
-
- data->empty = FALSE;
- camel_object_ref (CAMEL_OBJECT (input->destination));
-}
-
-static void
-do_fetch_mail (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- fetch_mail_input_t *input = (fetch_mail_input_t *) in_data;
- fetch_mail_data_t *data = (fetch_mail_data_t *) op_data;
-
- CamelFolder *search_folder = NULL;
-
- /* If using IMAP, don't do anything... */
-
- if (!strncmp (input->source_url, "imap:", 5)) {
- data->empty = FALSE;
- return;
- }
-
- if (input->destination == NULL) {
- input->destination = mail_tool_get_local_inbox (ex);
-
- if (input->destination == NULL)
- return;
- }
-
- search_folder =
- mail_tool_fetch_mail_into_searchable (input->source_url,
- input->keep_on_server, ex);
-
- if (search_folder == NULL) {
- /* This happens with an IMAP source and on error
- * and on "no new mail"
- */
- camel_object_unref (CAMEL_OBJECT (input->destination));
- input->destination = NULL;
- data->empty = TRUE;
- return;
- }
-
- mail_tool_camel_lock_up ();
- if (camel_folder_get_message_count (search_folder) == 0) {
- data->empty = TRUE;
- } else {
- mail_tool_filter_contents_into (search_folder, input->destination,
- TRUE,
- input->hook_func, input->hook_data,
- ex);
- data->empty = FALSE;
- }
- mail_tool_camel_lock_down ();
-
- camel_object_unref (CAMEL_OBJECT (search_folder));
-}
-
-static void
-cleanup_fetch_mail (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- fetch_mail_input_t *input = (fetch_mail_input_t *) in_data;
- fetch_mail_data_t *data = (fetch_mail_data_t *) op_data;
-
- if (data->empty && !camel_exception_is_set (ex)) {
- GtkWidget *dialog;
-
- dialog = gnome_ok_dialog (_("There is no new mail."));
- gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
- }
-
- g_free (input->source_url);
- if (input->destination)
- camel_object_unref (CAMEL_OBJECT (input->destination));
-}
-
-static const mail_operation_spec op_fetch_mail = {
- describe_fetch_mail,
- sizeof (fetch_mail_data_t),
- setup_fetch_mail,
- do_fetch_mail,
- cleanup_fetch_mail
-};
-
-void
-mail_do_fetch_mail (const gchar *source_url, gboolean keep_on_server,
- CamelFolder *destination,
- gpointer hook_func, gpointer hook_data)
-{
- fetch_mail_input_t *input;
-
- input = g_new (fetch_mail_input_t, 1);
- input->source_url = g_strdup (source_url);
- input->keep_on_server = keep_on_server;
- input->destination = destination;
- input->hook_func = hook_func;
- input->hook_data = hook_data;
-
- mail_operation_queue (&op_fetch_mail, input, TRUE);
-}
-
-/* ** SEND MAIL *********************************************************** */
-
-typedef struct send_mail_input_s
-{
- gchar *xport_uri;
- CamelMimeMessage *message;
- gchar *from;
-
- /* If done_folder != NULL, will add done_flags to
- * the flags of the message done_uid in done_folder. */
-
- CamelFolder *done_folder;
- char *done_uid;
- guint32 done_flags;
-
- GtkWidget *composer;
-}
-send_mail_input_t;
-
-static gchar *describe_send_mail (gpointer in_data, gboolean gerund);
-static void setup_send_mail (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_send_mail (gpointer in_data, gpointer op_data,
-
- CamelException *ex);
-static void cleanup_send_mail (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_send_mail (gpointer in_data, gboolean gerund)
-{
- send_mail_input_t *input = (send_mail_input_t *) in_data;
-
- if (gerund) {
- if (input->message->subject && input->message->subject[0])
- return g_strdup_printf (_("Sending \"%s\""),
- input->message->subject);
- else
- return
- g_strdup
- (_("Sending a message without a subject"));
- } else {
- if (input->message->subject && input->message->subject[0])
- return g_strdup_printf (_("Send \"%s\""),
- input->message->subject);
- else
- return g_strdup (_("Send a message without a subject"));
- }
-}
-
-static void
-setup_send_mail (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- send_mail_input_t *input = (send_mail_input_t *) in_data;
-
- if (!input->xport_uri) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't really need i18n */
- "No transport URI specified for send_mail operation.");
- return;
- }
-
- if (!CAMEL_IS_MIME_MESSAGE (input->message)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No message specified for send_mail operation.");
- return;
- }
-
- if (input->from == NULL) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No from address specified for send_mail operation.");
- return;
- }
-
- /* NOTE THE EARLY EXIT!! */
-
- if (input->done_folder == NULL) {
- camel_object_ref (CAMEL_OBJECT (input->message));
- gtk_object_ref (GTK_OBJECT (input->composer));
- gtk_widget_hide (GTK_WIDGET (input->composer));
- return;
- }
-
- if (!CAMEL_IS_FOLDER (input->done_folder)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "Bad done_folder specified for send_mail operation.");
- return;
- }
-
- if (input->done_uid == NULL) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No done_uid specified for send_mail operation.");
- return;
- }
-
- if (!GTK_IS_WIDGET (input->composer)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No composer specified for send_mail operation.");
- return;
- }
-
- camel_object_ref (CAMEL_OBJECT (input->message));
- camel_object_ref (CAMEL_OBJECT (input->done_folder));
- gtk_object_ref (GTK_OBJECT (input->composer));
- gtk_widget_hide (GTK_WIDGET (input->composer));
-}
-
-static void
-do_send_mail (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- send_mail_input_t *input = (send_mail_input_t *) in_data;
- CamelTransport *xport;
-
- mail_tool_camel_lock_up ();
- camel_mime_message_set_from (input->message, input->from);
-
- camel_medium_add_header (CAMEL_MEDIUM (input->message), "X-Mailer",
- "Evolution (Developer Preview)");
- camel_mime_message_set_date (input->message,
- CAMEL_MESSAGE_DATE_CURRENT, 0);
-
- xport = camel_session_get_transport (session, input->xport_uri, ex);
- mail_tool_camel_lock_down ();
- if (camel_exception_is_set (ex))
- return;
-
- mail_tool_send_via_transport (xport, CAMEL_MEDIUM (input->message),
- ex);
- camel_object_unref (CAMEL_OBJECT (xport));
-
- if (camel_exception_is_set (ex))
- return;
-
- if (input->done_folder) {
- guint32 set;
-
- mail_tool_camel_lock_up ();
- set = camel_folder_get_message_flags (input->done_folder,
- input->done_uid);
- camel_folder_set_message_flags (input->done_folder,
- input->done_uid,
- input->done_flags, ~set);
- mail_tool_camel_lock_down ();
- }
-}
-
-static void
-cleanup_send_mail (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- send_mail_input_t *input = (send_mail_input_t *) in_data;
-
- camel_object_unref (CAMEL_OBJECT (input->message));
- if (input->done_folder)
- camel_object_unref (CAMEL_OBJECT (input->done_folder));
-
- g_free (input->from);
- g_free (input->xport_uri);
- g_free (input->done_uid);
-
- if (!camel_exception_is_set (ex))
- gtk_widget_destroy (input->composer);
- else
- gtk_widget_show (input->composer);
-}
-
-static const mail_operation_spec op_send_mail = {
- describe_send_mail,
- 0,
- setup_send_mail,
- do_send_mail,
- cleanup_send_mail
-};
-
-void
-mail_do_send_mail (const char *xport_uri,
- CamelMimeMessage *message,
- const char *from,
- CamelFolder *done_folder,
- const char *done_uid,
- guint32 done_flags, GtkWidget *composer)
-{
- send_mail_input_t *input;
-
- input = g_new (send_mail_input_t, 1);
- input->xport_uri = g_strdup (xport_uri);
- input->message = message;
- input->from = g_strdup (from);
- input->done_folder = done_folder;
- input->done_uid = g_strdup (done_uid);
- input->done_flags = done_flags;
- input->composer = composer;
-
- mail_operation_queue (&op_send_mail, input, TRUE);
-}
-
-/* ** EXPUNGE FOLDER ****************************************************** */
-
-static gchar *describe_expunge_folder (gpointer in_data, gboolean gerund);
-static void setup_expunge_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_expunge_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_expunge_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_expunge_folder (gpointer in_data, gboolean gerund)
-{
- CamelFolder *f = CAMEL_FOLDER (in_data);
-
- if (gerund)
- return g_strdup_printf (_("Expunging \"%s\""), mail_tool_get_folder_name (f));
- else
- return g_strdup_printf (_("Expunge \"%s\""), mail_tool_get_folder_name (f));
-}
-
-static void
-setup_expunge_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- if (!CAMEL_IS_FOLDER (in_data)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "No folder is selected to be expunged");
- return;
- }
-
- camel_object_ref (CAMEL_OBJECT (in_data));
-}
-
-static void
-do_expunge_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- mail_tool_camel_lock_up ();
- camel_folder_expunge (CAMEL_FOLDER (in_data), ex);
- mail_tool_camel_lock_down ();
-}
-
-static void
-cleanup_expunge_folder (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- camel_object_unref (CAMEL_OBJECT (in_data));
-}
-
-static const mail_operation_spec op_expunge_folder = {
- describe_expunge_folder,
- 0,
- setup_expunge_folder,
- do_expunge_folder,
- cleanup_expunge_folder
-};
-
-void
-mail_do_expunge_folder (CamelFolder *folder)
-{
- mail_operation_queue (&op_expunge_folder, folder, FALSE);
-}
-
-/* ** TRANSFER MESSAGES **************************************************** */
-
-typedef struct transfer_messages_input_s
-{
- CamelFolder *source;
- GPtrArray *uids;
- gboolean delete_from_source;
- gchar *dest_uri;
-}
-transfer_messages_input_t;
-
-static gchar *describe_transfer_messages (gpointer in_data, gboolean gerund);
-static void setup_transfer_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_transfer_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_transfer_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_transfer_messages (gpointer in_data, gboolean gerund)
-{
- transfer_messages_input_t *input = (transfer_messages_input_t *) in_data;
- char *format;
-
- if (gerund) {
- if (input->delete_from_source)
- format = _("Moving messages from \"%s\" into \"%s\"");
- else
- format = _("Copying messages from \"%s\" into \"%s\"");
- } else {
- if (input->delete_from_source)
- format = _("Move messages from \"%s\" into \"%s\"");
- else
- format = _("Copy messages from \"%s\" into \"%s\"");
- }
-
- return g_strdup_printf (format,
- mail_tool_get_folder_name (input->source),
- input->dest_uri);
-}
-
-static void
-setup_transfer_messages (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- transfer_messages_input_t *input = (transfer_messages_input_t *) in_data;
- char *verb;
-
- if (input->delete_from_source)
- /* don't need i18n */
- verb = "move";
- else
- verb = "copy";
-
- if (!CAMEL_IS_FOLDER (input->source)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No source folder to %s messages from specified.",
- verb);
- return;
- }
-
- if (input->uids == NULL) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No messages to %s have been specified.",
- verb);
- return;
- }
-
- if (input->dest_uri == NULL) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No URI to %s to has been specified.",
- verb);
- return;
- }
-
- camel_object_ref (CAMEL_OBJECT (input->source));
-}
-
-static void
-do_transfer_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- transfer_messages_input_t *input = (transfer_messages_input_t *) in_data;
- CamelFolder *dest;
- gint i;
- void (*func) (CamelFolder *, const char *,
- CamelFolder *,
- CamelException *);
-
- if (input->delete_from_source)
- func = camel_folder_move_message_to;
- else
- func = camel_folder_copy_message_to;
-
- dest = mail_tool_uri_to_folder (input->dest_uri, ex);
- if (camel_exception_is_set (ex))
- return;
-
- mail_tool_camel_lock_up ();
- camel_folder_freeze (input->source);
- camel_folder_freeze (dest);
-
- for (i = 0; i < input->uids->len; i++) {
- (func) (input->source,
- input->uids->pdata[i], dest,
- ex);
- g_free (input->uids->pdata[i]);
- if (camel_exception_is_set (ex))
- break;
- }
-
- camel_folder_thaw (input->source);
- camel_folder_thaw (dest);
- camel_object_unref (CAMEL_OBJECT (dest));
- mail_tool_camel_lock_down ();
-}
-
-static void
-cleanup_transfer_messages (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- transfer_messages_input_t *input = (transfer_messages_input_t *) in_data;
-
- camel_object_unref (CAMEL_OBJECT (input->source));
- g_free (input->dest_uri);
- g_ptr_array_free (input->uids, TRUE);
-}
-
-static const mail_operation_spec op_transfer_messages = {
- describe_transfer_messages,
- 0,
- setup_transfer_messages,
- do_transfer_messages,
- cleanup_transfer_messages
-};
-
-void
-mail_do_transfer_messages (CamelFolder *source, GPtrArray *uids,
- gboolean delete_from_source,
- gchar *dest_uri)
-{
- transfer_messages_input_t *input;
-
- input = g_new (transfer_messages_input_t, 1);
- input->source = source;
- input->uids = uids;
- input->delete_from_source = delete_from_source;
- input->dest_uri = g_strdup (dest_uri);
-
- mail_operation_queue (&op_transfer_messages, input, TRUE);
-}
-
-/* ** FLAG MESSAGES ******************************************************* */
-
-typedef struct flag_messages_input_s
-{
- CamelFolder *source;
- GPtrArray *uids;
- gboolean invert;
- guint32 mask;
- guint32 set;
-}
-flag_messages_input_t;
-
-static gchar *describe_flag_messages (gpointer in_data, gboolean gerund);
-static void setup_flag_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_flag_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_flag_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_flag_messages (gpointer in_data, gboolean gerund)
-{
- flag_messages_input_t *input = (flag_messages_input_t *) in_data;
-
- /* FIXME: change based on flags being applied? */
-
- if (gerund)
- return g_strdup_printf (_("Marking messages in folder \"%s\""),
- mail_tool_get_folder_name (input->source));
- else
- return g_strdup_printf (_("Mark messages in folder \"%s\""),
- mail_tool_get_folder_name (input->source));
-}
-
-static void
-setup_flag_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- flag_messages_input_t *input = (flag_messages_input_t *) in_data;
-
- if (!CAMEL_IS_FOLDER (input->source)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "No source folder to flag messages from specified.");
- return;
- }
-
- if (input->uids == NULL) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No messages to flag have been specified.");
- return;
- }
-
- camel_object_ref (CAMEL_OBJECT (input->source));
-}
-
-static void
-do_flag_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- flag_messages_input_t *input = (flag_messages_input_t *) in_data;
- gint i;
-
- mail_tool_camel_lock_up ();
- camel_folder_freeze (input->source);
- mail_tool_camel_lock_down ();
-
- for (i = 0; i < input->uids->len; i++) {
- if (input->invert) {
- const CamelMessageInfo *info;
-
- mail_tool_camel_lock_up ();
- info = camel_folder_get_message_info (input->source, input->uids->pdata[i]);
- camel_folder_set_message_flags (input->source, input->uids->pdata[i],
- input->mask, ~info->flags);
- mail_tool_camel_lock_down ();
- } else {
- mail_tool_set_uid_flags (input->source, input->uids->pdata[i],
- input->mask, input->set);
- }
-
- g_free (input->uids->pdata[i]);
- }
-
- mail_tool_camel_lock_up ();
- camel_folder_thaw (input->source);
- mail_tool_camel_lock_down ();
-}
-
-static void
-cleanup_flag_messages (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- flag_messages_input_t *input = (flag_messages_input_t *) in_data;
-
- camel_object_unref (CAMEL_OBJECT (input->source));
- g_ptr_array_free (input->uids, TRUE);
-}
-
-static const mail_operation_spec op_flag_messages = {
- describe_flag_messages,
- 0,
- setup_flag_messages,
- do_flag_messages,
- cleanup_flag_messages
-};
-
-void
-mail_do_flag_messages (CamelFolder *source, GPtrArray *uids,
- gboolean invert,
- guint32 mask, guint32 set)
-{
- flag_messages_input_t *input;
-
- input = g_new (flag_messages_input_t, 1);
- input->source = source;
- input->uids = uids;
- input->invert = invert;
- input->mask = mask;
- input->set = set;
-
- mail_operation_queue (&op_flag_messages, input, TRUE);
-}
-
-/* ** SCAN SUBFOLDERS ***************************************************** */
-
-typedef struct scan_subfolders_input_s
-{
- gchar *source_uri;
- gboolean add_INBOX;
- EvolutionStorage *storage;
-}
-scan_subfolders_input_t;
-
-typedef struct scan_subfolders_folderinfo_s
-{
- char *path;
- char *uri;
-}
-scan_subfolders_folderinfo_t;
-
-typedef struct scan_subfolders_op_s
-{
- GPtrArray *new_folders;
-}
-scan_subfolders_op_t;
-
-static gchar *describe_scan_subfolders (gpointer in_data, gboolean gerund);
-static void setup_scan_subfolders (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_scan_subfolders (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_scan_subfolders (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_scan_subfolders (gpointer in_data, gboolean gerund)
-{
- scan_subfolders_input_t *input = (scan_subfolders_input_t *) in_data;
-
- if (gerund)
- return g_strdup_printf (_("Scanning folders in \"%s\""),
- input->source_uri);
- else
- return g_strdup_printf (_("Scan folders in \"%s\""),
- input->source_uri);
-}
-
-static void
-setup_scan_subfolders (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- scan_subfolders_input_t *input = (scan_subfolders_input_t *) in_data;
- scan_subfolders_op_t *data = (scan_subfolders_op_t *) op_data;
-
- if (!input->source_uri) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "No source uri to scan subfolders from was provided.");
- return;
- }
-
- if (!EVOLUTION_IS_STORAGE (input->storage)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No storage to scan subfolders into was provided.");
- return;
- }
-
- gtk_object_ref (GTK_OBJECT (input->storage));
- data->new_folders = g_ptr_array_new ();
-}
-
-static void
-do_scan_subfolders (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- scan_subfolders_input_t *input = (scan_subfolders_input_t *) in_data;
- scan_subfolders_op_t *data = (scan_subfolders_op_t *) op_data;
- scan_subfolders_folderinfo_t *info;
- GPtrArray *lsub;
- CamelFolder *folder;
- int i;
- char *splice;
-
- if (input->source_uri[strlen (input->source_uri) - 1] == '/')
- splice = "";
- else
- splice = "/";
-
- folder = mail_tool_get_root_of_store (input->source_uri, ex);
- if (camel_exception_is_set (ex))
- return;
-
- mail_tool_camel_lock_up ();
-
- lsub = camel_folder_get_subfolder_names (folder);
-
- mail_tool_camel_lock_down ();
-
- for (i = 0; i < lsub->len; i++) {
- info = g_new (scan_subfolders_folderinfo_t, 1);
- info->path = g_strdup_printf ("/%s", (char *) lsub->pdata[i]);
- info->uri = g_strdup_printf ("%s%s%s", input->source_uri, splice,
- (char *)lsub->pdata[i]);
- g_ptr_array_add (data->new_folders, info);
- }
-
- camel_folder_free_subfolder_names (folder, lsub);
-
- /* FIXME: We intentionally lose a reference to the store here
- * for the benefit of the IMAP provider. Undo this when the
- * namespace situation is fixed.
- */
- camel_object_ref (CAMEL_OBJECT (folder->parent_store));
- camel_object_unref (CAMEL_OBJECT (folder));
-}
-
-static void
-cleanup_scan_subfolders (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- scan_subfolders_input_t *input = (scan_subfolders_input_t *) in_data;
- scan_subfolders_op_t *data = (scan_subfolders_op_t *) op_data;
- int i;
-
- for (i = 0; i < data->new_folders->len; i++) {
- scan_subfolders_folderinfo_t *info;
-
- info = data->new_folders->pdata[i];
- evolution_storage_new_folder (input->storage,
- info->path,
- "mail",
- info->uri, _("(No description)"));
- g_free (info->path);
- g_free (info->uri);
- g_free (info);
- }
-
- g_ptr_array_free (data->new_folders, TRUE);
- gtk_object_unref (GTK_OBJECT (input->storage));
- g_free (input->source_uri);
-}
-
-static const mail_operation_spec op_scan_subfolders = {
- describe_scan_subfolders,
- sizeof (scan_subfolders_op_t),
- setup_scan_subfolders,
- do_scan_subfolders,
- cleanup_scan_subfolders
-};
-
-void
-mail_do_scan_subfolders (const gchar *source_uri, EvolutionStorage *storage)
-{
- scan_subfolders_input_t *input;
-
- input = g_new (scan_subfolders_input_t, 1);
- input->source_uri = g_strdup (source_uri);
- input->storage = storage;
-
- mail_operation_queue (&op_scan_subfolders, input, TRUE);
-}
-
-/* ** ATTACH MESSAGE ****************************************************** */
-
-typedef struct attach_message_input_s
-{
- EMsgComposer *composer;
- CamelFolder *folder;
- gchar *uid;
-}
-attach_message_input_t;
-
-typedef struct attach_message_data_s
-{
- CamelMimePart *part;
-}
-attach_message_data_t;
-
-static gchar *describe_attach_message (gpointer in_data, gboolean gerund);
-static void setup_attach_message (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_attach_message (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_attach_message (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_attach_message (gpointer in_data, gboolean gerund)
-{
- attach_message_input_t *input = (attach_message_input_t *) in_data;
-
- if (gerund)
- return
- g_strdup_printf
- (_("Attaching messages from folder \"%s\""),
- mail_tool_get_folder_name (input->folder));
- else
- return g_strdup_printf (_("Attach messages from \"%s\""),
- mail_tool_get_folder_name (input->folder));
-}
-
-static void
-setup_attach_message (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- attach_message_input_t *input = (attach_message_input_t *) in_data;
-
- if (!input->uid) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "No UID specified to attach.");
- return;
- }
-
- if (!CAMEL_IS_FOLDER (input->folder)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No folder to fetch the message from specified.");
- return;
- }
-
- if (!E_IS_MSG_COMPOSER (input->composer)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No message composer from specified.");
- return;
- }
-
- camel_object_ref (CAMEL_OBJECT (input->folder));
- gtk_object_ref (GTK_OBJECT (input->composer));
-}
-
-static void
-do_attach_message (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- attach_message_input_t *input = (attach_message_input_t *) in_data;
- attach_message_data_t *data = (attach_message_data_t *) op_data;
-
- CamelMimeMessage *message;
- CamelMimePart *part;
-
- mail_tool_camel_lock_up ();
- message = camel_folder_get_message (input->folder, input->uid, ex);
- if (!message) {
- mail_tool_camel_lock_down ();
- return;
- }
-
- part = mail_tool_make_message_attachment (message);
- camel_object_unref (CAMEL_OBJECT (message));
- mail_tool_camel_lock_down ();
- if (!part)
- return;
-
- data->part = part;
-}
-
-static void
-cleanup_attach_message (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- attach_message_input_t *input = (attach_message_input_t *) in_data;
- attach_message_data_t *data = (attach_message_data_t *) op_data;
-
- e_msg_composer_attach (input->composer, data->part);
- camel_object_unref (CAMEL_OBJECT (data->part));
- camel_object_unref (CAMEL_OBJECT (input->folder));
- gtk_object_unref (GTK_OBJECT (input->composer));
- g_free (input->uid);
-}
-
-static const mail_operation_spec op_attach_message = {
- describe_attach_message,
- sizeof (attach_message_data_t),
- setup_attach_message,
- do_attach_message,
- cleanup_attach_message
-};
-
-void
-mail_do_attach_message (CamelFolder *folder, const char *uid,
- EMsgComposer *composer)
-{
- attach_message_input_t *input;
-
- input = g_new (attach_message_input_t, 1);
- input->folder = folder;
- input->uid = g_strdup (uid);
- input->composer = composer;
-
- mail_operation_queue (&op_attach_message, input, TRUE);
-}
-
-/* ** FORWARD MESSAGES **************************************************** */
-
-typedef struct forward_messages_input_s
-{
- CamelMimeMessage *basis;
- CamelFolder *source;
- GPtrArray *uids;
- EMsgComposer *composer;
-}
-forward_messages_input_t;
-
-typedef struct forward_messages_data_s
-{
- gchar *subject;
- GPtrArray *parts;
-}
-forward_messages_data_t;
-
-static gchar *describe_forward_messages (gpointer in_data, gboolean gerund);
-static void setup_forward_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_forward_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_forward_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_forward_messages (gpointer in_data, gboolean gerund)
-{
- forward_messages_input_t *input = (forward_messages_input_t *) in_data;
-
- if (gerund) {
- if (input->basis->subject)
- return g_strdup_printf (_("Forwarding messages \"%s\""),
- input->basis->subject);
- else
- return
- g_strdup_printf
- (_("Forwarding a message without a subject"));
- } else {
- if (input->basis->subject)
- return g_strdup_printf (_("Forward message \"%s\""),
- input->basis->subject);
- else
- return
- g_strdup_printf
- (_("Forward a message without a subject"));
- }
-}
-
-static void
-setup_forward_messages (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- forward_messages_input_t *input = (forward_messages_input_t *) in_data;
-
- if (!input->uids) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "No UIDs specified to attach.");
- return;
- }
-
- if (!CAMEL_IS_MIME_MESSAGE (input->basis)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No basic message to forward was specified.");
- return;
- }
-
- if (!CAMEL_IS_FOLDER (input->source)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No folder to fetch the messages from specified.");
- return;
- }
-
- if (!E_IS_MSG_COMPOSER (input->composer)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No message composer from specified.");
- return;
- }
-
- camel_object_ref (CAMEL_OBJECT (input->basis));
- camel_object_ref (CAMEL_OBJECT (input->source));
- gtk_object_ref (GTK_OBJECT (input->composer));
-}
-
-static void
-do_forward_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- forward_messages_input_t *input = (forward_messages_input_t *) in_data;
- forward_messages_data_t *data = (forward_messages_data_t *) op_data;
-
- CamelMimeMessage *message;
- CamelMimePart *part;
- int i;
-
- data->parts = g_ptr_array_new ();
-
- mail_tool_camel_lock_up ();
- for (i = 0; i < input->uids->len; i++) {
- message =
- camel_folder_get_message (input->source,
- input->uids->pdata[i], ex);
- g_free (input->uids->pdata[i]);
- if (!message) {
- mail_tool_camel_lock_down ();
- return;
- }
- part = mail_tool_make_message_attachment (message);
- if (!part) {
- camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Failed to generate mime part from "
- "message while generating forwarded message."));
- mail_tool_camel_lock_down ();
- return;
- }
- camel_object_unref (CAMEL_OBJECT (message));
- g_ptr_array_add (data->parts, part);
- }
-
- mail_tool_camel_lock_down ();
-
- data->subject = mail_tool_generate_forward_subject (input->basis);
-}
-
-static void
-cleanup_forward_messages (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- forward_messages_input_t *input =
-
- (forward_messages_input_t *) in_data;
- forward_messages_data_t *data = (forward_messages_data_t *) op_data;
-
- int i;
-
- for (i = 0; i < data->parts->len; i++) {
- e_msg_composer_attach (input->composer,
- data->parts->pdata[i]);
- camel_object_unref (CAMEL_OBJECT (data->parts->pdata[i]));
- }
- camel_object_unref (CAMEL_OBJECT (input->source));
-
- e_msg_composer_set_headers (input->composer, NULL, NULL, NULL,
- data->subject);
-
- gtk_object_unref (GTK_OBJECT (input->composer));
- g_free (data->subject);
- g_ptr_array_free (data->parts, TRUE);
- g_ptr_array_free (input->uids, TRUE);
- gtk_widget_show (GTK_WIDGET (input->composer));
-}
-
-static const mail_operation_spec op_forward_messages = {
- describe_forward_messages,
- sizeof (forward_messages_data_t),
- setup_forward_messages,
- do_forward_messages,
- cleanup_forward_messages
-};
-
-void
-mail_do_forward_message (CamelMimeMessage *basis,
- CamelFolder *source,
- GPtrArray *uids, EMsgComposer *composer)
-{
- forward_messages_input_t *input;
-
- input = g_new (forward_messages_input_t, 1);
- input->basis = basis;
- input->source = source;
- input->uids = uids;
- input->composer = composer;
-
- mail_operation_queue (&op_forward_messages, input, TRUE);
-}
-
-/* ** LOAD FOLDER ********************************************************* */
-
-typedef struct load_folder_input_s
-{
- FolderBrowser *fb;
- gchar *url;
-}
-load_folder_input_t;
-
-static gchar *describe_load_folder (gpointer in_data, gboolean gerund);
-static void setup_load_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_load_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_load_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_load_folder (gpointer in_data, gboolean gerund)
-{
- load_folder_input_t *input = (load_folder_input_t *) in_data;
-
- if (gerund) {
- return g_strdup_printf (_("Loading \"%s\""), input->url);
- } else {
- return g_strdup_printf (_("Load \"%s\""), input->url);
- }
-}
-
-static void
-setup_load_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- load_folder_input_t *input = (load_folder_input_t *) in_data;
-
- if (!IS_FOLDER_BROWSER (input->fb)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "No folder browser specified to load into.");
- return;
- }
-
- if (!input->url) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No URL to load was specified.");
- return;
- }
-
- gtk_object_ref (GTK_OBJECT (input->fb));
-
- if (input->fb->uri)
- g_free (input->fb->uri);
-
- input->fb->uri = input->url;
-}
-
-static void
-do_load_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- load_folder_input_t *input = (load_folder_input_t *) in_data;
-
- CamelFolder *folder;
-
- folder = mail_tool_uri_to_folder (input->url, ex);
- if (!folder)
- return;
-
- if (input->fb->folder) {
- mail_tool_camel_lock_up ();
- camel_object_unref (CAMEL_OBJECT (input->fb->folder));
- mail_tool_camel_lock_down ();
- }
-
- input->fb->folder = folder;
-}
-
-static void
-cleanup_load_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- load_folder_input_t *input = (load_folder_input_t *) in_data;
-
- gtk_widget_set_sensitive (GTK_WIDGET (input->fb->search_entry),
- camel_folder_has_search_capability (input->
- fb->
- folder));
- gtk_widget_set_sensitive (GTK_WIDGET (input->fb->search_menu),
- camel_folder_has_search_capability (input->
- fb->
- folder));
-
- message_list_set_folder (input->fb->message_list, input->fb->folder);
-
- /*g_free (input->url); = fb->uri now */
-}
-
-static const mail_operation_spec op_load_folder = {
- describe_load_folder,
- 0,
- setup_load_folder,
- do_load_folder,
- cleanup_load_folder
-};
-
-void
-mail_do_load_folder (FolderBrowser *fb, const char *url)
-{
- load_folder_input_t *input;
-
- input = g_new (load_folder_input_t, 1);
- input->fb = fb;
- input->url = g_strdup (url);
-
- mail_operation_queue (&op_load_folder, input, TRUE);
-}
-
-/* ** CREATE FOLDER ******************************************************* */
-
-typedef struct create_folder_input_s
-{
- Evolution_ShellComponentListener listener;
- char *uri;
- char *type;
-}
-create_folder_input_t;
-
-typedef struct create_folder_data_s
-{
- Evolution_ShellComponentListener_Result result;
-}
-create_folder_data_t;
-
-static gchar *describe_create_folder (gpointer in_data, gboolean gerund);
-static void setup_create_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_create_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_create_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_create_folder (gpointer in_data, gboolean gerund)
-{
- create_folder_input_t *input = (create_folder_input_t *) in_data;
-
- if (gerund) {
- return g_strdup_printf (_("Creating \"%s\""), input->uri);
- } else {
- return g_strdup_printf (_("Create \"%s\""), input->uri);
- }
-}
-
-static void
-setup_create_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- create_folder_input_t *input = (create_folder_input_t *) in_data;
-
- if (input->listener == CORBA_OBJECT_NIL) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "Invalid listener passed to create_folder");
- return;
- }
-
- if (input->uri == NULL) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "Invalid url passed to create_folder");
- return;
- }
-
- if (input->type == NULL) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No type passed to create_folder");
- return;
- }
-}
-
-static void
-do_create_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- create_folder_input_t *input = (create_folder_input_t *) in_data;
- create_folder_data_t *data = (create_folder_data_t *) op_data;
-
- CamelFolder *folder;
- gchar *camel_url;
-
- if (strcmp (input->type, "mail") != 0)
- data->result =
- Evolution_ShellComponentListener_UNSUPPORTED_TYPE;
- else {
- camel_url = g_strdup_printf ("mbox://%s", input->uri);
- folder = mail_tool_get_folder_from_urlname (camel_url,
- "mbox", TRUE, ex);
- g_free (camel_url);
-
- if (!camel_exception_is_set (ex)) {
- camel_object_unref (CAMEL_OBJECT (folder));
- data->result = Evolution_ShellComponentListener_OK;
- } else {
- data->result =
- Evolution_ShellComponentListener_INVALID_URI;
- }
- }
-}
-
-static void
-cleanup_create_folder (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- create_folder_input_t *input = (create_folder_input_t *) in_data;
- create_folder_data_t *data = (create_folder_data_t *) op_data;
-
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- Evolution_ShellComponentListener_report_result (input->listener,
- data->result, &ev);
- if (ev._major != CORBA_NO_EXCEPTION)
- camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Exception while reporting result to shell "
- "component listener."));
- CORBA_Object_release (input->listener, &ev);
-
- g_free (input->uri);
- g_free (input->type);
-
- CORBA_exception_free (&ev);
-}
-
-static const mail_operation_spec op_create_folder = {
- describe_create_folder,
- sizeof (create_folder_data_t),
- setup_create_folder,
- do_create_folder,
- cleanup_create_folder
-};
-
-void
-mail_do_create_folder (const Evolution_ShellComponentListener listener,
- const char *uri, const char *type)
-{
- CORBA_Environment ev;
- create_folder_input_t *input;
-
- CORBA_exception_init (&ev);
-
- input = g_new (create_folder_input_t, 1);
- input->listener = CORBA_Object_duplicate (listener, &ev);
- input->uri = g_strdup (uri);
- input->type = g_strdup (type);
-
- CORBA_exception_free (&ev);
-
- mail_operation_queue (&op_create_folder, input, FALSE);
-}
-
-/* ** SYNC FOLDER ********************************************************* */
-
-static gchar *describe_sync_folder (gpointer in_data, gboolean gerund);
-static void setup_sync_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_sync_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_sync_folder (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_sync_folder (gpointer in_data, gboolean gerund)
-{
- CamelFolder *f = CAMEL_FOLDER (in_data);
-
- if (gerund) {
- return g_strdup_printf (_("Synchronizing \"%s\""), mail_tool_get_folder_name (f));
- } else {
- return g_strdup_printf (_("Synchronize \"%s\""), mail_tool_get_folder_name (f));
- }
-}
-
-static void
-setup_sync_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- if (!CAMEL_IS_FOLDER (in_data)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "No folder is selected to be synced");
- return;
- }
-
- camel_object_ref (CAMEL_OBJECT (in_data));
-}
-
-static void
-do_sync_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- mail_tool_camel_lock_up ();
- camel_folder_sync (CAMEL_FOLDER (in_data), FALSE, ex);
- mail_tool_camel_lock_down ();
-}
-
-static void
-cleanup_sync_folder (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- camel_object_unref (CAMEL_OBJECT (in_data));
-}
-
-static const mail_operation_spec op_sync_folder = {
- describe_sync_folder,
- 0,
- setup_sync_folder,
- do_sync_folder,
- cleanup_sync_folder
-};
-
-void
-mail_do_sync_folder (CamelFolder *folder)
-{
- mail_operation_queue (&op_sync_folder, folder, FALSE);
-}
-
-/* ** DISPLAY MESSAGE ***************************************************** */
-
-typedef struct display_message_input_s
-{
- MessageList *ml;
- gchar *uid;
- gint (*timeout) (gpointer);
-}
-display_message_input_t;
-
-typedef struct display_message_data_s
-{
- CamelMimeMessage *msg;
-}
-display_message_data_t;
-
-static gchar *describe_display_message (gpointer in_data, gboolean gerund);
-static void setup_display_message (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_display_message (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_display_message (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_display_message (gpointer in_data, gboolean gerund)
-{
- display_message_input_t *input = (display_message_input_t *) in_data;
-
- if (gerund) {
- if (input->uid)
- return g_strdup_printf (_("Displaying message UID \"%s\""),
- input->uid);
- else
- return g_strdup (_("Clearing message display"));
- } else {
- if (input->uid)
- return g_strdup_printf (_("Display message UID \"%s\""),
- input->uid);
- else
- return g_strdup (_("Clear message display"));
- }
-}
-
-static void
-setup_display_message (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- display_message_input_t *input = (display_message_input_t *) in_data;
- display_message_data_t *data = (display_message_data_t *) op_data;
-
- if (!IS_MESSAGE_LIST (input->ml)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "Invalid message list passed to display_message");
- return;
- }
-
- if (!input->timeout) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No timeout callback passed to display_message");
- return;
- }
-
- data->msg = NULL;
- gtk_object_ref (GTK_OBJECT (input->ml));
-}
-
-static void
-do_display_message (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- display_message_input_t *input = (display_message_input_t *) in_data;
- display_message_data_t *data = (display_message_data_t *) op_data;
-
- if (input->uid == NULL) {
- data->msg = NULL;
- return;
- }
-
- data->msg = camel_folder_get_message (input->ml->folder,
- input->uid, ex);
-}
-
-static void
-cleanup_display_message (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- display_message_input_t *input = (display_message_input_t *) in_data;
- display_message_data_t *data = (display_message_data_t *) op_data;
-
- MailDisplay *md = input->ml->parent_folder_browser->mail_display;
-
- if (data->msg == NULL) {
- mail_display_set_message (md, NULL);
- } else {
- gint timeout = mail_config_mark_as_seen_timeout ();
-
- if (input->ml->seen_id)
- gtk_timeout_remove (input->ml->seen_id);
-
- mail_display_set_message (md, CAMEL_MEDIUM (data->msg));
- camel_object_unref (CAMEL_OBJECT (data->msg));
-
- if (timeout > 0) {
- input->ml->seen_id = gtk_timeout_add (timeout,
- input->timeout,
- input->ml);
- } else {
- input->ml->seen_id = 0;
- input->timeout (input->ml);
- }
- }
-
- if (input->uid)
- g_free (input->uid);
- gtk_object_unref (GTK_OBJECT (input->ml));
-}
-
-static const mail_operation_spec op_display_message = {
- describe_display_message,
- sizeof (display_message_data_t),
- setup_display_message,
- do_display_message,
- cleanup_display_message
-};
-
-void
-mail_do_display_message (MessageList *ml, const char *uid,
- gint (*timeout) (gpointer))
-{
- display_message_input_t *input;
-
- input = g_new (display_message_input_t, 1);
- input->ml = ml;
- input->uid = g_strdup (uid);
- input->timeout = timeout;
-
- mail_operation_queue (&op_display_message, input, TRUE);
-}
-
-/* ** EDIT MESSAGES ******************************************************* */
-
-typedef struct edit_messages_input_s {
- CamelFolder *folder;
- GPtrArray *uids;
- GtkSignalFunc signal;
-} edit_messages_input_t;
-
-typedef struct edit_messages_data_s {
- GPtrArray *messages;
-} edit_messages_data_t;
-
-static gchar *describe_edit_messages (gpointer in_data, gboolean gerund);
-static void setup_edit_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_edit_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_edit_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_edit_messages (gpointer in_data, gboolean gerund)
-{
- edit_messages_input_t *input = (edit_messages_input_t *) in_data;
-
- if (gerund)
- return g_strdup_printf
- (_("Opening messages from folder \"%s\""),
- mail_tool_get_folder_name (input->folder));
- else
- return g_strdup_printf (_("Open messages from \"%s\""),
- mail_tool_get_folder_name (input->folder));
-}
-
-static void
-setup_edit_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- edit_messages_input_t *input = (edit_messages_input_t *) in_data;
-
- if (!input->uids) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "No UIDs specified to edit.");
- return;
- }
-
- if (!CAMEL_IS_FOLDER (input->folder)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No folder to fetch the messages from specified.");
- return;
- }
-
- camel_object_ref (CAMEL_OBJECT (input->folder));
-}
-
-static void
-do_edit_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- edit_messages_input_t *input = (edit_messages_input_t *) in_data;
- edit_messages_data_t *data = (edit_messages_data_t *) op_data;
-
- int i;
-
- data->messages = g_ptr_array_new ();
-
- for (i = 0; i < input->uids->len; i++) {
- CamelMimeMessage *message;
-
- mail_tool_camel_lock_up ();
- message = camel_folder_get_message (input->folder, input->uids->pdata[i], ex);
- mail_tool_camel_lock_down ();
-
- if (message)
- g_ptr_array_add (data->messages, message);
-
- g_free (input->uids->pdata[i]);
- }
-}
-
-static void
-cleanup_edit_messages (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- edit_messages_input_t *input = (edit_messages_input_t *) in_data;
- edit_messages_data_t *data = (edit_messages_data_t *) op_data;
-
- int i;
-
- for (i = 0; i < data->messages->len; i++) {
- GtkWidget *composer;
-
- composer = e_msg_composer_new_with_message (data->messages->pdata[i]);
-
- if (input->signal)
- gtk_signal_connect (GTK_OBJECT (composer), "send",
- input->signal, NULL);
-
- gtk_widget_show (composer);
-
- camel_object_unref (CAMEL_OBJECT (data->messages->pdata[i]));
- }
-
- g_ptr_array_free (input->uids, TRUE);
- g_ptr_array_free (data->messages, TRUE);
- camel_object_unref (CAMEL_OBJECT (input->folder));
-
-}
-
-static const mail_operation_spec op_edit_messages = {
- describe_edit_messages,
- sizeof (edit_messages_data_t),
- setup_edit_messages,
- do_edit_messages,
- cleanup_edit_messages
-};
-
-void
-mail_do_edit_messages (CamelFolder *folder, GPtrArray *uids,
- GtkSignalFunc signal)
-{
- edit_messages_input_t *input;
-
- input = g_new (edit_messages_input_t, 1);
- input->folder = folder;
- input->uids = uids;
- input->signal = signal;
-
- mail_operation_queue (&op_edit_messages, input, TRUE);
-}
-
-/* ** SETUP DRAFTBOX ****************************************************** */
-
-static gchar *describe_setup_draftbox (gpointer in_data, gboolean gerund);
-static void noop_setup_draftbox (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_setup_draftbox (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_setup_draftbox (gpointer in_data, gboolean gerund)
-{
- if (gerund)
- return g_strdup_printf (_("Loading Draftbox"));
- else
- return g_strdup_printf (_("Load Draftbox"));
-}
-
-static void
-noop_setup_draftbox (gpointer in_data, gpointer op_data, CamelException *ex)
-{
-}
-
-static void
-do_setup_draftbox (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- extern CamelFolder *drafts_folder;
- gchar *url;
-
- url = g_strdup_printf ("mbox://%s/local/Drafts", evolution_dir);
- drafts_folder = mail_tool_get_folder_from_urlname (url, "mbox", TRUE, ex);
- g_free (url);
-}
-
-/*
- *static void
- *cleanup_setup_draftbox (gpointer in_data, gpointer op_data,
- * CamelException *ex)
- *{
- *}
- */
-
-static const mail_operation_spec op_setup_draftbox = {
- describe_setup_draftbox,
- 0,
- noop_setup_draftbox,
- do_setup_draftbox,
- noop_setup_draftbox
-};
-
-void
-mail_do_setup_draftbox (void)
-{
- mail_operation_queue (&op_setup_draftbox, NULL, FALSE);
-}
-
-/* ** VIEW MESSAGES ******************************************************* */
-
-typedef struct view_messages_input_s {
- CamelFolder *folder;
- GPtrArray *uids;
- FolderBrowser *fb;
-} view_messages_input_t;
-
-typedef struct view_messages_data_s {
- GPtrArray *messages;
-} view_messages_data_t;
-
-static gchar *describe_view_messages (gpointer in_data, gboolean gerund);
-static void setup_view_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void do_view_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-static void cleanup_view_messages (gpointer in_data, gpointer op_data,
- CamelException *ex);
-
-static gchar *
-describe_view_messages (gpointer in_data, gboolean gerund)
-{
- view_messages_input_t *input = (view_messages_input_t *) in_data;
-
- if (gerund)
- return g_strdup_printf
- (_("Viewing messages from folder \"%s\""),
- mail_tool_get_folder_name (input->folder));
- else
- return g_strdup_printf (_("View messages from \"%s\""),
- mail_tool_get_folder_name (input->folder));
-}
-
-static void
-setup_view_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- view_messages_input_t *input = (view_messages_input_t *) in_data;
-
- if (!input->uids) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- /* doesn't need i18n */
- "No UIDs specified to view.");
- return;
- }
-
- if (!CAMEL_IS_FOLDER (input->folder)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No folder to fetch the messages from specified.");
- return;
- }
-
- if (!IS_FOLDER_BROWSER (input->fb)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No folder browser was specified.");
- return;
- }
-
-
- camel_object_ref (CAMEL_OBJECT (input->folder));
- gtk_object_ref (GTK_OBJECT (input->fb));
-}
-
-static void
-do_view_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- view_messages_input_t *input = (view_messages_input_t *) in_data;
- view_messages_data_t *data = (view_messages_data_t *) op_data;
-
- int i;
-
- data->messages = g_ptr_array_new ();
-
- for (i = 0; i < input->uids->len; i++) {
- CamelMimeMessage *message;
-
- mail_tool_camel_lock_up ();
- message = camel_folder_get_message (input->folder, input->uids->pdata[i], ex);
- mail_tool_camel_lock_down ();
-
- g_ptr_array_add (data->messages, message);
- }
-}
-
-static void
-cleanup_view_messages (gpointer in_data, gpointer op_data,
- CamelException *ex)
-{
- view_messages_input_t *input = (view_messages_input_t *) in_data;
- view_messages_data_t *data = (view_messages_data_t *) op_data;
-
- int i;
-
- for (i = 0; i < data->messages->len; i++) {
- CamelMimeMessage *msg;
- gchar *uid;
- GtkWidget *view;
-
- if (data->messages->pdata[i] == NULL)
- continue;
-
- msg = data->messages->pdata[i];
- uid = input->uids->pdata[i];
-
- view = mail_view_create (input->folder, uid, msg);
- gtk_widget_show (view);
-
- /*Owned by the mail_display now*/
- camel_object_unref (CAMEL_OBJECT (data->messages->pdata[i]));
- g_free (uid);
- }
-
- g_ptr_array_free (input->uids, TRUE);
- g_ptr_array_free (data->messages, TRUE);
- camel_object_unref (CAMEL_OBJECT (input->folder));
- gtk_object_unref (GTK_OBJECT (input->fb));
-}
-
-static const mail_operation_spec op_view_messages = {
- describe_view_messages,
- sizeof (view_messages_data_t),
- setup_view_messages,
- do_view_messages,
- cleanup_view_messages
-};
-
-void
-mail_do_view_messages (CamelFolder *folder, GPtrArray *uids,
- FolderBrowser *fb)
-{
- view_messages_input_t *input;
-
- input = g_new (view_messages_input_t, 1);
- input->folder = folder;
- input->uids = uids;
- input->fb = fb;
-
- mail_operation_queue (&op_view_messages, input, TRUE);
-}
diff --git a/mail/mail-ops.h b/mail/mail-ops.h
deleted file mode 100644
index 3566c40116..0000000000
--- a/mail/mail-ops.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Peter Williams <peterw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <camel/camel.h>
-#include "mail-threads.h"
-#include "evolution-storage.h" /*EvolutionStorage */
-#include "composer/e-msg-composer.h" /*EMsgComposer */
-#include "message-list.h" /*MessageList */
-
-void mail_do_fetch_mail (const gchar *source_url, gboolean keep_on_server,
- CamelFolder *destination,
- gpointer hook_func, gpointer hook_data);
-void mail_do_send_mail (const char *xport_uri,
- CamelMimeMessage *message,
- const char *from,
- CamelFolder *done_folder,
- const char *done_uid,
-
- guint32 done_flags, GtkWidget *composer);
-void mail_do_expunge_folder (CamelFolder *folder);
-void mail_do_transfer_messages (CamelFolder *source, GPtrArray *uids,
- gboolean delete_from_source,
- gchar *dest_uri);
-void mail_do_flag_messages (CamelFolder *source, GPtrArray *uids,
- gboolean invert,
- guint32 mask, guint32 set);
-void mail_do_scan_subfolders (const gchar *source_uri, EvolutionStorage *storage);
-void mail_do_attach_message (CamelFolder *folder, const char *uid,
- EMsgComposer *composer);
-void mail_do_forward_message (CamelMimeMessage *basis, CamelFolder *source,
- GPtrArray *uids, /*array of allocated gchar *, will all be freed */
- EMsgComposer *composer);
-void mail_do_load_folder (FolderBrowser *fb, const char *url);
-void mail_do_create_folder (const Evolution_ShellComponentListener listener,
- const char *uri, const char *type);
-void mail_do_sync_folder (CamelFolder *folder);
-void mail_do_display_message (MessageList *ml, const char *uid,
- gint (*timeout) (gpointer));
-void mail_do_edit_messages (CamelFolder *folder, GPtrArray *uids,
- GtkSignalFunc signal);
-void mail_do_setup_draftbox (void);
-void mail_do_view_messages (CamelFolder *folder, GPtrArray *uids,
- FolderBrowser *fb);
-
-/* This actually lives in message-list.c */
-void mail_do_regenerate_messagelist (MessageList *list,
- const gchar *search);
diff --git a/mail/mail-threads.c b/mail/mail-threads.c
deleted file mode 100644
index 8fe170eea2..0000000000
--- a/mail/mail-threads.c
+++ /dev/null
@@ -1,1096 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Peter Williams (peterw@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc. (http://www.helixcode.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.
- *
- */
-
-#include <config.h>
-
-#include <string.h>
-#include <glib.h>
-
-#include "folder-browser-factory.h"
-
-#include "camel/camel-object.h"
-#include "mail.h"
-#include "mail-threads.h"
-
-#define DEBUG(p) g_print p
-
-/**
- * A function and its userdata
- **/
-
-typedef struct closure_s
-{
- gpointer in_data;
- gboolean free_in_data;
- gpointer op_data;
- const mail_operation_spec *spec;
- CamelException *ex;
- gchar *infinitive;
- gchar *gerund;
-}
-closure_t;
-
-/**
- * A command issued through the compipe
- **/
-
-typedef struct com_msg_s
-{
- enum com_msg_type_e {
- STARTING,
-
-#if 0
- PERCENTAGE,
- HIDE_PBAR,
- SHOW_PBAR,
-#endif
-
- MESSAGE,
- PASSWORD,
- ERROR,
- FORWARD_EVENT,
- FINISHED
- } type;
-
- gfloat percentage;
- gchar *message;
-
- closure_t *clur;
-
- /* Password stuff */
- gchar **reply;
- gboolean secret;
- gboolean *success;
-
- /* Event stuff */
- CamelObjectEventHookFunc event_hook;
- CamelObject *event_obj;
- gpointer event_event_data;
- gpointer event_user_data;
-}
-com_msg_t;
-
-/**
- * Stuff needed for blocking
- **/
-
-typedef struct block_info_s {
- GMutex *mutex;
- GCond *cond;
- gboolean val;
-} block_info_t;
-
-#define BLOCK_INFO_INIT { NULL, NULL, FALSE }
-
-/**
- * @dispatch_thread_started: gboolean that tells us whether
- * the dispatch thread has been launched.
- **/
-
-static gboolean dispatch_thread_started = FALSE;
-
-/**
- * @queue_len : the number of operations pending
- * and being executed.
- *
- * Because camel is not thread-safe we work
- * with the restriction that more than one mailbox
- * cannot be accessed at once. Thus we cannot
- * concurrently check mail and move messages, etc.
- **/
-
-static gint queue_len = 0;
-
-/**
- * @main_compipe: The pipe through which the dispatcher communicates
- * with the main thread for GTK+ calls
- *
- * @chan_reader: the GIOChannel that reads our pipe
- *
- * @MAIN_READER: the fd in our main pipe that.... reads!
- * @MAIN_WRITER: the fd in our main pipe that.... writes!
- */
-
-#define MAIN_READER main_compipe[0]
-#define MAIN_WRITER main_compipe[1]
-#define DISPATCH_READER dispatch_compipe[0]
-#define DISPATCH_WRITER dispatch_compipe[1]
-
-static int main_compipe[2] = { -1, -1 };
-static int dispatch_compipe[2] = { -1, -1 };
-
-GIOChannel *chan_reader = NULL;
-
-/**
- * @modal_block: a condition maintained so that the
- * calling thread (the dispatch thread) blocks correctly
- * until the user has responded to some kind of modal
- * dialog boxy thing.
- */
-
-static block_info_t modal_block = BLOCK_INFO_INIT;
-
-/**
- * @finish_block: A condition so that the dispatch thread
- * blocks until the main thread has finished the cleanup.
- **/
-
-static block_info_t finish_block = BLOCK_INFO_INIT;
-
-/**
- * @current_message: The current message for the status bar.
- * @busy_status: Whether we are currently busy doing some async operation,
- * for status bar purposes.
- */
-
-static char *current_message = NULL;
-static gboolean busy = FALSE;
-
-/**
- * Static prototypes
- **/
-
-static void ui_set_busy (void);
-static void ui_unset_busy (void);
-static void ui_set_message (const char *message);
-static void ui_unset_message (void);
-
-static void block_prepare (block_info_t *info);
-static void block_wait (block_info_t *info);
-static void block_hold (block_info_t *info);
-static void block_release (block_info_t *info);
-
-static void *dispatch (void * data);
-static void check_dispatcher (void);
-static void check_compipes (void);
-static gboolean read_msg (GIOChannel * source, GIOCondition condition,
- gpointer userdata);
-
-static void show_error (com_msg_t * msg);
-
-static void get_password (com_msg_t * msg);
-static void get_password_cb (gchar * string, gpointer data);
-
-static void cleanup_op (com_msg_t * msg);
-
-static closure_t *new_closure (const mail_operation_spec * spec, gpointer input,
- gboolean free_in_data);
-static void free_closure (closure_t *clur);
-
-/* Pthread code */
-/* FIXME: support other thread types!!!! */
-
-#ifdef G_THREADS_IMPL_POSIX
-
-#include <pthread.h>
-
-/**
- * @dispatch_thread: the pthread_t (when using pthreads, of
- * course) representing our dispatcher routine. Never used
- * except to make pthread_create happy
- **/
-
-static pthread_t dispatch_thread;
-
-/* FIXME: do we need to set any attributes for our thread?
- * If so, we need to create a pthread_attr structure and
- * fill it in somewhere. But the defaults should be good
- * enough.
- */
-
-#elif defined( G_THREADS_IMPL_SOLARIS )
-
-#include <thread.h>
-
-static thread_t dispatch_thread;
-
-#else /* no supported thread impl */
-void
-f (void)
-{
- Error_No_supported_thread_implementation_recognized ();
- choke on this;
-}
-#endif
-
-/**
- * mail_operation_queue:
- * @spec: describes the operation to be performed
- * @input: input data for the operation.
- *
- * Runs a mail operation asynchronously. If no other operation is running,
- * we start another thread and call the callback in that thread. The function
- * can then use the mail_op_ functions to perform limited UI returns, while
- * the main UI is completely unlocked.
- *
- * If an async operation is going on when this function is called again,
- * it waits for the currently executing operation to finish, then
- * executes the callback function in another thread.
- *
- * Returns TRUE on success, FALSE on some sort of queueing error.
- **/
-
-gboolean
-mail_operation_queue (const mail_operation_spec * spec, gpointer input,
- gboolean free_in_data)
-{
- closure_t *clur;
-
- g_assert (spec);
-
- clur = new_closure (spec, input, free_in_data);
-
- if (spec->setup)
- (spec->setup) (clur->in_data, clur->op_data, clur->ex);
-
- if (camel_exception_is_set (clur->ex)) {
- if (clur->ex->id != CAMEL_EXCEPTION_USER_CANCEL) {
- GtkWidget *err_dialog;
- gchar *msg;
-
- msg =
- g_strdup_printf
- (_("Error while preparing to %s:\n" "%s"),
- clur->infinitive,
- camel_exception_get_description (clur->ex));
- err_dialog = gnome_error_dialog (msg);
- g_free (msg);
- gnome_dialog_set_close (GNOME_DIALOG (err_dialog),
- TRUE);
- GDK_THREADS_ENTER ();
- gnome_dialog_run_and_close (GNOME_DIALOG (err_dialog));
- GDK_THREADS_LEAVE ();
- /*gtk_widget_destroy (err_dialog); */
- /*gtk_widget_show (GTK_WIDGET (err_dialog));*/
-
- g_warning ("Setup failed for `%s': %s",
- clur->infinitive,
- camel_exception_get_description (clur->
- ex));
- }
-
- free_closure (clur);
- return FALSE;
- }
-
- if (queue_len == 0) {
- check_compipes ();
- check_dispatcher ();
- } /* else add self to queue */
-
- write (DISPATCH_WRITER, clur, sizeof (closure_t));
- /* dispatch allocates a separate buffer
- * to hold the closure; it's in the pipe and
- * can safely be freed
- */
- g_free (clur);
- queue_len++;
- return TRUE;
-}
-
-#if 0
-/**
- * mail_op_set_percentage:
- * @percentage: the percentage that will be displayed in the progress bar
- *
- * Set the percentage of the progress bar for the currently executing operation.
- * Threadsafe for, nay, intended to be called by, the dispatching thread.
- **/
-
-void
-mail_op_set_percentage (gfloat percentage)
-{
- com_msg_t msg;
-
- msg.type = PERCENTAGE;
- msg.percentage = percentage;
- write (MAIN_WRITER, &msg, sizeof (msg));
-}
-
-/**
- * mail_op_hide_progressbar:
- *
- * Hide the progress bar in the status box
- * Threadsafe for, nay, intended to be called by, the dispatching thread.
- **/
-
-void
-mail_op_hide_progressbar (void)
-{
- com_msg_t msg;
-
- msg.type = HIDE_PBAR;
- write (MAIN_WRITER, &msg, sizeof (msg));
-}
-
-/**
- * mail_op_show_progressbar:
- *
- * Show the progress bar in the status box
- * Threadsafe for, nay, intended to be called by, the dispatching thread.
- **/
-
-void
-mail_op_show_progressbar (void)
-{
- com_msg_t msg;
-
- msg.type = SHOW_PBAR;
- write (MAIN_WRITER, &msg, sizeof (msg));
-}
-
-#endif
-
-/**
- * mail_op_set_message:
- * @fmt: printf-style format string for the message
- * @...: arguments to the format string
- *
- * Set the message displayed above the progress bar for the currently
- * executing operation.
- * Threadsafe for, nay, intended to be called by, the dispatching thread.
- **/
-
-void
-mail_op_set_message (gchar * fmt, ...)
-{
- com_msg_t msg;
- va_list val;
-
- va_start (val, fmt);
- msg.type = MESSAGE;
- msg.message = g_strdup_vprintf (fmt, val);
- va_end (val);
-
- write (MAIN_WRITER, &msg, sizeof (msg));
-}
-
-/**
- * mail_op_get_password:
- * @prompt: the question put to the user
- * @secret: whether the dialog box shold print stars when the user types
- * @dest: where to store the reply
- *
- * Asks the user for a password (or string entry in general). Waits for
- * the user's response. On success, returns TRUE and @dest contains the
- * response. On failure, returns FALSE and @dest contains the error
- * message.
- **/
-
-gboolean
-mail_op_get_password (gchar * prompt, gboolean secret, gchar ** dest)
-{
- com_msg_t msg;
- gboolean result;
-
- msg.type = PASSWORD;
- msg.secret = secret;
- msg.message = prompt;
- msg.reply = dest;
- msg.success = &result;
-
- (*dest) = NULL;
-
- block_prepare (&modal_block);
- write (MAIN_WRITER, &msg, sizeof (msg));
- block_wait (&modal_block);
-
- return result;
-}
-
-/**
- * mail_op_error:
- * @fmt: printf-style format string for the error
- * @...: arguments to the format string
- *
- * Opens an error dialog for the currently executing operation.
- * Threadsafe for, nay, intended to be called by, the dispatching thread.
- **/
-
-void
-mail_op_error (gchar * fmt, ...)
-{
- com_msg_t msg;
- va_list val;
-
- va_start (val, fmt);
- msg.type = ERROR;
- msg.message = g_strdup_vprintf (fmt, val);
- va_end (val);
-
- block_prepare (&modal_block);
- write (MAIN_WRITER, &msg, sizeof (msg));
- block_wait (&modal_block);
-}
-
-/**
- * mail_op_forward_event:
- *
- * Communicate a camel event over to the main thread.
- **/
-
-void
-mail_op_forward_event (CamelObjectEventHookFunc func, CamelObject *o,
- gpointer event_data, gpointer user_data)
-{
- com_msg_t msg;
-
- msg.type = FORWARD_EVENT;
- msg.event_hook = func;
- msg.event_obj = o;
- msg.event_event_data = event_data;
- msg.event_user_data = user_data;
- write (MAIN_WRITER, &msg, sizeof (msg));
-}
-/**
- * mail_operation_wait_for_finish:
- *
- * Waits for the currently executing async operations
- * to finish executing
- */
-
-void
-mail_operation_wait_for_finish (void)
-{
- while (queue_len)
- gtk_main_iteration ();
- /* Sigh. Otherwise we deadlock upon exit. */
- GDK_THREADS_LEAVE ();
-}
-
-/**
- * mail_operations_are_executing:
- *
- * Returns TRUE if operations are being executed asynchronously
- * when called, FALSE if not.
- **/
-
-gboolean
-mail_operations_are_executing (void)
-{
- return (queue_len > 0);
-}
-
-/**
- * mail_operations_terminate:
- *
- * Let the operations finish then terminate the dispatch thread
- **/
-
-void
-mail_operations_terminate (void)
-{
- closure_t clur;
-
- mail_operation_wait_for_finish();
-
- memset (&clur, 0, sizeof (closure_t));
- clur.spec = NULL;
-
- write (DISPATCH_WRITER, &clur, sizeof (closure_t));
-
- close (DISPATCH_WRITER);
- close (MAIN_READER);
-}
-
-void
-mail_operations_get_status (int *busy_return,
- const char **message_return)
-{
- *busy_return = busy;
- *message_return = current_message;
-}
-
-/* ** Static functions **************************************************** */
-
-static void check_dispatcher (void)
-{
- int res;
-
- if (dispatch_thread_started)
- return;
-
-#if defined( G_THREADS_IMPL_POSIX )
- res = pthread_create (&dispatch_thread, NULL,
- (void *) &dispatch, NULL);
-#elif defined( G_THREADS_IMPL_SOLARIS )
- res = thr_create (NULL, 0, (void *) &dispatch, NULL, 0, &dispatch_thread);
-#else /* no known impl */
- Error_No_thread_create_implementation ();
- choke on this;
-#endif
- if (res != 0) {
- g_warning ("Error launching dispatch thread!");
- /* FIXME: more error handling */
- } else
- dispatch_thread_started = TRUE;
-}
-
-/**
- * check_compipes:
- *
- * Check and see if our pipe has been opened and open
- * it if necessary.
- **/
-
-static void
-check_compipes (void)
-{
- if (MAIN_READER < 0) {
- if (pipe (main_compipe) < 0) {
- g_warning ("Call to pipe(2) failed!");
-
- /* FIXME: better error handling. How do we react? */
- return;
- }
-
- chan_reader = g_io_channel_unix_new (MAIN_READER);
- g_io_add_watch (chan_reader, G_IO_IN, read_msg, NULL);
- }
-
- if (DISPATCH_READER < 0) {
- if (pipe (dispatch_compipe) < 0) {
- g_warning ("Call to pipe(2) failed!");
-
- /* FIXME: better error handling. How do we react? */
- return;
- }
- }
-}
-
-/**
- * dispatch:
- * @clur: The operation to execute and its parameters
- *
- * Start a thread that executes the closure and exit
- * it when done.
- */
-
-static void *
-dispatch (void *unused)
-{
- size_t len;
- closure_t *clur;
- com_msg_t msg;
-
- /* Let the compipes be created */
- sleep (1);
-
- while (1) {
- clur = g_new (closure_t, 1);
- len = read (DISPATCH_READER, clur, sizeof (closure_t));
-
- if (len <= 0)
- break;
-
- if (len != sizeof (closure_t)) {
- g_warning ("dispatcher: Didn't read full message!");
- continue;
- }
-
- if (clur->spec == NULL)
- break;
-
- msg.type = STARTING;
- msg.message = g_strdup (clur->gerund);
- write (MAIN_WRITER, &msg, sizeof (msg));
-
- (clur->spec->callback) (clur->in_data, clur->op_data, clur->ex);
-
- if (camel_exception_is_set (clur->ex)) {
- if (clur->ex->id != CAMEL_EXCEPTION_USER_CANCEL) {
- g_warning ("Callback failed for `%s': %s",
- clur->infinitive,
- camel_exception_get_description (clur->
- ex));
- mail_op_error (_("Error while `%s':\n%s"),
- clur->gerund,
- camel_exception_get_description (clur->
- ex));
- }
- }
-
- msg.type = FINISHED;
- msg.clur = clur;
-
- /* Wait for the cleanup to finish before starting our next op */
- block_prepare (&finish_block);
- write (MAIN_WRITER, &msg, sizeof (msg));
- block_wait (&finish_block);
- }
-
- close (DISPATCH_READER);
- close (MAIN_WRITER);
-
-#ifdef G_THREADS_IMPL_POSIX
- pthread_exit (0);
-#elif defined( G_THREADS_IMPL_SOLARIS )
- thr_exit (NULL);
-#else /* no known impl */
- Error_No_thread_exit_implemented ();
- choke on this;
-#endif
- return NULL;
- /*NOTREACHED*/
-}
-
-/**
- * read_msg:
- * @source: the channel that has data to read
- * @condition: the reason we were called
- * @userdata: unused
- *
- * A message has been recieved on our pipe; perform the appropriate
- * action.
- **/
-
-static gboolean
-read_msg (GIOChannel * source, GIOCondition condition, gpointer userdata)
-{
- com_msg_t *msg;
- guint size;
-
- msg = g_new0 (com_msg_t, 1);
-
- g_io_channel_read (source, (gchar *) msg,
- sizeof (com_msg_t) / sizeof (gchar), &size);
-
- if (size != sizeof (com_msg_t)) {
- g_warning (_("Incomplete message written on pipe!"));
- msg->type = ERROR;
- msg->message =
- g_strdup (_
- ("Error reading commands from dispatching thread."));
- }
-
- /* This is very important, though I'm not quite sure why
- * it is as we are in the main thread right now.
- */
-
- GDK_THREADS_ENTER ();
-
- switch (msg->type) {
- case STARTING:
- DEBUG (("*** Message -- STARTING %s\n", msg->message));
- ui_set_message (msg->message);
- ui_set_busy ();
- g_free (msg->message);
- break;
-#if 0
- case PERCENTAGE:
- DEBUG (("*** Message -- PERCENTAGE\n"));
- g_warning ("PERCENTAGE operation unsupported");
- break;
- case HIDE_PBAR:
- DEBUG (("*** Message -- HIDE_PBAR\n"));
- g_warning ("HIDE_PBAR operation unsupported");
- break;
- case SHOW_PBAR:
- DEBUG (("*** Message -- SHOW_PBAR\n"));
- g_warning ("HIDE_PBAR operation unsupported");
- break;
-#endif
-
- case MESSAGE:
- DEBUG (("*** Message -- MESSAGE\n"));
- ui_set_message (msg->message);
- g_free (msg->message);
- break;
-
- case PASSWORD:
- DEBUG (("*** Message -- PASSWORD\n"));
- g_assert (msg->reply);
- g_assert (msg->success);
- get_password (msg);
- break;
-
- case ERROR:
- DEBUG (("*** Message -- ERROR\n"));
- show_error (msg);
- break;
-
- /* Don't fall through; dispatch_func does the FINISHED
- * call for us
- */
-
- case FORWARD_EVENT:
- DEBUG (("*** Message -- FORWARD_EVENT %p\n", msg->event_hook));
- g_assert (msg->event_hook);
- (msg->event_hook) (msg->event_obj, msg->event_event_data, msg->event_user_data);
- break;
-
- case FINISHED:
- DEBUG (("*** Message -- FINISH %s\n", msg->clur->gerund));
- cleanup_op (msg);
- break;
-
- default:
- g_warning (_("Corrupted message from dispatching thread?"));
- break;
- }
-
- GDK_THREADS_LEAVE ();
- g_free (msg);
- return TRUE;
-}
-
-/**
- * cleanup_op:
- *
- * Cleanup after a finished operation
- **/
-
-static void
-cleanup_op (com_msg_t * msg)
-{
- block_hold (&finish_block);
-
- /* Run the cleanup */
-
- if (msg->clur->spec->cleanup)
- (msg->clur->spec->cleanup) (msg->clur->in_data,
- msg->clur->op_data,
- msg->clur->ex);
-
- /* Tell the dispatch thread that it can start
- * the next operation */
-
- block_release (&finish_block);
-
- /* Print an exception if the cleanup caused one */
-
- if (camel_exception_is_set (msg->clur->ex) &&
- msg->clur->ex->id != CAMEL_EXCEPTION_USER_CANCEL) {
- g_warning ("Error on cleanup of `%s': %s",
- msg->clur->infinitive,
- camel_exception_get_description (msg->clur->ex));
- }
-
- free_closure (msg->clur);
- queue_len--;
-
- ui_unset_busy ();
- ui_unset_message ();
-}
-
-/**
- * show_error:
- *
- * Show the error dialog and wait for user OK
- **/
-
-static void
-show_error (com_msg_t * msg)
-{
- GtkWidget *err_dialog;
-
- /* Create the dialog */
-
- err_dialog = gnome_error_dialog (msg->message);
- g_free (msg->message);
-
- /* Stop the other thread until the user reacts */
-
- ui_unset_busy ();
- block_hold (&modal_block);
-
- /* Show the dialog. */
-
- /* Do not GDK_THREADS_ENTER; we're inside the read_msg
- * handler which takes care of this for us. Oh, if
- * only GDK_THREADS_ENTER were recursive...
- */
-
- /*GDK_THREADS_ENTER ();*/
- gnome_dialog_run_and_close (GNOME_DIALOG (err_dialog));
- /*GDK_THREADS_LEAVE ();*/
-
- /* Allow the other thread to proceed */
-
- block_release (&modal_block);
- ui_set_busy ();
-}
-
-/**
- * get_password:
- *
- * Ask for a password and put the answer in *(msg->reply)
- **/
-
-static void
-get_password (com_msg_t * msg)
-{
- GtkWidget *dialog;
- int button;
-
- /* Create the dialog */
-
- dialog = gnome_request_dialog (msg->secret, msg->message, NULL,
- 0, get_password_cb, msg, NULL);
-
- /* Stop the other thread */
-
- ui_unset_busy ();
- block_hold (&modal_block);
-
- /* Show the dialog (or report an error) */
-
- if (dialog == NULL) {
- *(msg->success) = FALSE;
- *(msg->reply) = g_strdup (_("Could not create dialog box."));
- button = -1;
- } else {
- *(msg->reply) = NULL;
- /*GDK_THREADS_ENTER ();*/
- button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
- /*GDK_THREADS_LEAVE ();*/
- }
-
- if (button == 1 || *(msg->reply) == NULL) {
- *(msg->success) = FALSE;
- *(msg->reply) = g_strdup (_("User cancelled query."));
- } else if (button >= 0) {
- *(msg->success) = TRUE;
- }
-
- /* Allow the other thread to proceed */
-
- block_release (&modal_block);
- ui_set_busy ();
-}
-
-static void
-get_password_cb (gchar * string, gpointer data)
-{
- com_msg_t *msg = (com_msg_t *) data;
-
- if (string)
- *(msg->reply) = g_strdup (string);
- else
- *(msg->reply) = NULL;
-}
-
-static closure_t *
-new_closure (const mail_operation_spec * spec, gpointer input,
- gboolean free_in_data)
-{
- closure_t *clur;
-
- clur = g_new0 (closure_t, 1);
- clur->spec = spec;
- clur->in_data = input;
- clur->free_in_data = free_in_data;
- clur->ex = camel_exception_new ();
-
- clur->op_data = g_malloc (spec->datasize);
-
- camel_exception_init (clur->ex);
-
- clur->infinitive = (spec->describe) (input, FALSE);
- clur->gerund = (spec->describe) (input, TRUE);
-
- return clur;
-}
-
-static void
-free_closure (closure_t *clur)
-{
- clur->spec = NULL;
-
- if (clur->free_in_data)
- g_free (clur->in_data);
- clur->in_data = NULL;
-
- g_free (clur->op_data);
- clur->op_data = NULL;
-
- camel_exception_free (clur->ex);
- clur->ex = NULL;
-
- g_free (clur->infinitive);
- g_free (clur->gerund);
-
- g_free (clur);
-}
-
-/* ******************** */
-
-/**
- *
- * Thread A calls block_prepare
- * Thread A causes thread B to do something
- * Thread A calls block_wait
- * Thread A continues when thread B calls block_release
- *
- * Thread B gets thread A's message
- * Thread B calls block_hold
- * Thread B does something
- * Thread B calls block_release
- *
- **/
-
-static void
-block_prepare (block_info_t *info)
-{
- if (info->cond == NULL) {
- info->cond = g_cond_new ();
- info->mutex = g_mutex_new ();
- }
-
- g_mutex_lock (info->mutex);
- info->val = FALSE;
-}
-
-static void
-block_wait (block_info_t *info)
-{
- g_assert (info->cond);
-
- while (info->val == FALSE)
- g_cond_wait (info->cond, info->mutex);
-
- g_mutex_unlock (info->mutex);
-}
-static void
-block_hold (block_info_t *info)
-{
- g_assert (info->cond);
-
- g_mutex_lock (info->mutex);
- info->val = FALSE;
-}
-
-static void
-block_release (block_info_t *info)
-{
- g_assert (info->cond);
-
- info->val = TRUE;
- g_cond_signal (info->cond);
- g_mutex_unlock (info->mutex);
-}
-
-/* ******************** */
-
-/* FIXME FIXME FIXME This is a totally evil hack. */
-
-static Evolution_ShellView
-retrieve_shell_view_interface_from_control (BonoboControl *control)
-{
- Bonobo_ControlFrame control_frame;
- Evolution_ShellView shell_view_interface;
- CORBA_Environment ev;
-
- control_frame = bonobo_control_get_control_frame (control);
-
- if (control_frame == NULL)
- return CORBA_OBJECT_NIL;
-
- CORBA_exception_init (&ev);
- shell_view_interface = Bonobo_Unknown_query_interface (control_frame,
- "IDL:Evolution/ShellView:1.0",
- &ev);
- CORBA_exception_free (&ev);
-
- if (shell_view_interface != CORBA_OBJECT_NIL)
- gtk_object_set_data (GTK_OBJECT (control),
- "mail_threads_shell_view_interface",
- shell_view_interface);
- else
- g_warning ("Control frame doesn't have Evolution/ShellView.");
-
- return shell_view_interface;
-}
-
-static void
-update_active_views (void)
-{
- GList *controls;
- GList *p;
-
- controls = folder_browser_factory_get_control_list ();
- for (p = controls; p != NULL; p = p->next) {
- BonoboControl *control;
- Evolution_ShellView shell_view_interface;
- CORBA_Environment ev;
-
- control = BONOBO_CONTROL (p->data);
-
- shell_view_interface = gtk_object_get_data (GTK_OBJECT (control), "mail_threads_shell_view_interface");
-
- if (shell_view_interface == CORBA_OBJECT_NIL)
- shell_view_interface = retrieve_shell_view_interface_from_control (control);
-
- CORBA_exception_init (&ev);
-
- if (shell_view_interface != CORBA_OBJECT_NIL) {
- if (current_message == NULL && ! busy) {
- Evolution_ShellView_unset_message (shell_view_interface, &ev);
- } else {
- if (current_message == NULL)
- Evolution_ShellView_set_message (shell_view_interface,
- "",
- busy,
- &ev);
- else
- Evolution_ShellView_set_message (shell_view_interface,
- current_message,
- busy,
- &ev);
- }
- }
-
- CORBA_exception_free (&ev);
- }
-}
-
-static void
-ui_set_busy (void)
-{
- busy = TRUE;
- update_active_views ();
-}
-
-static void
-ui_unset_busy (void)
-{
- busy = FALSE;
- update_active_views ();
-}
-
-static void
-ui_set_message (const char *message)
-{
- g_free (current_message);
- current_message = g_strdup (message);
- update_active_views ();
-}
-
-static void
-ui_unset_message (void)
-{
- g_free (current_message);
- current_message = NULL;
- update_active_views ();
-}
diff --git a/mail/mail-threads.h b/mail/mail-threads.h
deleted file mode 100644
index e27f07d789..0000000000
--- a/mail/mail-threads.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Peter Williams (peterw@helixcode.com)
- *
- * Copyright 2000, Helix Code, Inc. (http://www.helixcode.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 _MAIL_THREADS_H_
-#define _MAIL_THREADS_H_
-
-#include <camel/camel-exception.h>
-#include <camel/camel-object.h>
-#include <stdlib.h> /*size_t */
-
-/* Returns a g_strdup'ed string that describes what's going to happen,
- * tersely but specifically.
- */
-typedef gchar *(*mail_op_describe_func) (gpointer /*input_data*/, gboolean /*gerund*/);
-typedef void (*mail_op_func) (gpointer, gpointer, CamelException *);
-
-typedef struct _mail_operation_spec
-{
- mail_op_describe_func describe;
- size_t datasize;
- mail_op_func setup;
- mail_op_func callback;
- mail_op_func cleanup;
-}
-mail_operation_spec;
-
-/* Schedule to operation to happen eventually */
-
-gboolean mail_operation_queue (const mail_operation_spec * spec,
- gpointer input, gboolean free_in_data);
-
-/* User interface hooks for the other thread */
-
-#if 0
-void mail_op_set_percentage (gfloat percentage);
-void mail_op_hide_progressbar (void);
-void mail_op_show_progressbar (void);
-#endif
-
-void mail_op_set_message (gchar * fmt, ...) G_GNUC_PRINTF (1, 2);
-void mail_op_error (gchar * fmt, ...) G_GNUC_PRINTF (1, 2);
-gboolean mail_op_get_password (gchar * prompt, gboolean secret,
- gchar ** dest);
-void mail_op_forward_event (CamelObjectEventHookFunc func, CamelObject *o,
- gpointer event_data, gpointer user_data);
-/* Wait for the async operations to finish */
-void mail_operation_wait_for_finish (void);
-gboolean mail_operations_are_executing (void);
-void mail_operations_terminate (void);
-
-void mail_operations_get_status (int *busy_return, const char **message_return);
-void mail_operations_update_status (void);
-
-#endif /* defined _MAIL_THREADS_H_ */
diff --git a/mail/mail-tools.c b/mail/mail-tools.c
deleted file mode 100644
index 2d10411f91..0000000000
--- a/mail/mail-tools.c
+++ /dev/null
@@ -1,676 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* mail-ops.c: callbacks for the mail toolbar/menus */
-
-/*
- * Author :
- * Dan Winship <danw@helixcode.com>
- * Peter Williams <peterw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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
- */
-
-#include <config.h>
-#include <ctype.h>
-#include <errno.h>
-#include "camel/camel.h"
-#include "camel/providers/vee/camel-vee-folder.h"
-#include "mail-vfolder.h"
-#include "filter/vfolder-rule.h"
-#include "filter/vfolder-context.h"
-#include "filter/filter-option.h"
-#include "filter/filter-input.h"
-#include "filter/filter-driver.h"
-#include "mail.h" /*session*/
-#include "mail-tools.h"
-#include "mail-local.h"
-
-/* **************************************** */
-
-G_LOCK_DEFINE_STATIC (camel);
-G_LOCK_DEFINE_STATIC (camel_locklevel);
-static GPrivate *camel_locklevel = NULL;
-
-#define LOCK_VAL (GPOINTER_TO_INT (g_private_get (camel_locklevel)))
-#define LOCK_SET(val) g_private_set (camel_locklevel, (GINT_TO_POINTER (val)))
-
-void mail_tool_camel_lock_up (void)
-{
- G_LOCK (camel_locklevel);
-
- if (camel_locklevel == NULL)
- camel_locklevel = g_private_new (GINT_TO_POINTER (0));
-
- if (LOCK_VAL == 0) {
- G_UNLOCK (camel_locklevel);
- G_LOCK (camel);
- G_LOCK (camel_locklevel);
- }
-
- LOCK_SET (LOCK_VAL + 1);
-
- G_UNLOCK (camel_locklevel);
-}
-
-void mail_tool_camel_lock_down (void)
-{
- G_LOCK (camel_locklevel);
-
- if (camel_locklevel == NULL) {
- g_warning ("mail_tool_camel_lock_down: lock down before a lock up?");
- camel_locklevel = g_private_new (GINT_TO_POINTER (0));
- return;
- }
-
- LOCK_SET (LOCK_VAL - 1);
-
- if (LOCK_VAL == 0)
- G_UNLOCK (camel);
-
- G_UNLOCK (camel_locklevel);
-}
-
-/* **************************************** */
-
-CamelFolder *
-mail_tool_get_folder_from_urlname (const gchar *url, const gchar *name,
- gboolean create, CamelException *ex)
-{
- CamelStore *store;
- CamelFolder *folder;
-
- mail_tool_camel_lock_up();
-
- store = camel_session_get_store (session, url, ex);
- if (!store) {
- mail_tool_camel_lock_down();
- return NULL;
- }
-
- camel_service_connect (CAMEL_SERVICE (store), ex);
- if (camel_exception_is_set (ex)) {
- camel_object_unref (CAMEL_OBJECT (store));
- mail_tool_camel_lock_down();
- return NULL;
- }
-
- folder = camel_store_get_folder (store, name, create, ex);
- camel_object_unref (CAMEL_OBJECT (store));
- mail_tool_camel_lock_down();
-
- return folder;
-}
-
-const gchar *
-mail_tool_get_folder_name (CamelFolder *folder)
-{
- const char *name = camel_folder_get_full_name (folder);
- char *path;
-
- /* This is a kludge. */
-
- if (strcmp (name, "//mbox") && strcmp (name, "//mh"))
- return name;
-
- /* For mbox/mh, return the parent store's final path component. */
- path = CAMEL_SERVICE (folder->parent_store)->url->path;
- if (strchr (path, '/'))
- return strrchr (path, '/') + 1;
- else
- return path;
-}
-
-gchar *
-mail_tool_get_local_inbox_url (void)
-{
- char *uri, *new;
-
- uri = g_strdup_printf("file://%s/local/Inbox", evolution_dir);
- new = mail_local_map_uri(uri);
- g_free(uri);
- return new;
-}
-
-gchar *
-mail_tool_get_local_movemail_url (void)
-{
- return g_strdup_printf ("mbox://%s/local/Inbox", evolution_dir);
-}
-
-gchar *
-mail_tool_get_local_movemail_path (void)
-{
- return g_strdup_printf ("%s/local/Inbox/movemail", evolution_dir);
-}
-
-CamelFolder *
-mail_tool_get_local_inbox (CamelException *ex)
-{
- gchar *url;
- CamelFolder *folder;
-
- url = mail_tool_get_local_inbox_url();
- folder = mail_tool_get_folder_from_urlname (url, "mbox", TRUE, ex);
- g_free (url);
- return folder;
-}
-
-CamelFolder *
-mail_tool_get_inbox (const gchar *url, CamelException *ex)
-{
- /* FIXME: should be smarter? get_default_folder, etc */
- return mail_tool_get_folder_from_urlname (url, "inbox", FALSE, ex);
-}
-
-
-CamelFolder *
-mail_tool_do_movemail (const gchar *source_url, CamelException *ex)
-{
- gchar *dest_url;
- gchar *dest_path;
- const gchar *source;
- CamelFolder *ret;
- struct stat sb;
-#ifndef MOVEMAIL_PATH
- int tmpfd;
-#endif
- g_return_val_if_fail (strncmp (source_url, "mbox:", 5) == 0, NULL);
-
- /* Set up our destination. */
-
- dest_url = mail_tool_get_local_movemail_url();
- dest_path = mail_tool_get_local_movemail_path();
-
- /* Create a new movemail mailbox file of 0 size */
-
-#ifndef MOVEMAIL_PATH
- tmpfd = open (dest_path, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
-
- if (tmpfd == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Couldn't create temporary "
- "mbox `%s': %s"), dest_path, g_strerror (errno));
- g_free (dest_path);
- g_free (dest_url);
- return NULL;
- }
-
- close (tmpfd);
-#endif
-
- /* Skip over "mbox:" plus host part (if any) of url. */
-
- source = source_url + 5;
- if (!strncmp (source, "//", 2))
- source = strchr (source + 2, '/');
-
-
- /* Movemail from source (source_url) to dest_path */
-
- mail_tool_camel_lock_up();
- camel_movemail (source, dest_path, ex);
- mail_tool_camel_lock_down();
-
- if (stat (dest_path, &sb) < 0 || sb.st_size == 0) {
- g_free (dest_path);
- g_free (dest_url);
- return NULL;
- }
-
- g_free (dest_path);
-
- if (camel_exception_is_set (ex)) {
- g_free (dest_url);
- return NULL;
- }
-
- /* Get the CamelFolder for our dest_path. */
-
- ret = mail_tool_get_folder_from_urlname (dest_url, "movemail", TRUE, ex);
- g_free (dest_url);
- return ret;
-}
-
-void
-mail_tool_move_folder_contents (CamelFolder *source, CamelFolder *dest, gboolean use_cache, CamelException *ex)
-{
- CamelUIDCache *cache;
- GPtrArray *uids;
- int i;
-
- mail_tool_camel_lock_up();
-
- camel_object_ref (CAMEL_OBJECT (source));
- camel_object_ref (CAMEL_OBJECT (dest));
-
- /* Get all uids of source */
-
- uids = camel_folder_get_uids (source);
- printf ("mail_tool_move_folder: got %d messages in source\n", uids->len);
-
- /* If we're using the cache, ... use it */
-
- if (use_cache) {
- GPtrArray *new_uids;
- char *url, *p, *filename;
-
- url = camel_url_to_string (
- CAMEL_SERVICE (source->parent_store)->url, FALSE);
- for (p = url; *p; p++) {
- if (!isascii ((unsigned char)*p) ||
- strchr (" /'\"`&();|<>${}!", *p))
- *p = '_';
- }
- filename = g_strdup_printf ("%s/config/cache-%s",
- evolution_dir, url);
- g_free (url);
-
- cache = camel_uid_cache_new (filename);
-
- if (cache) {
- new_uids = camel_uid_cache_get_new_uids (cache, uids);
- camel_folder_free_uids (source, uids);
- uids = new_uids;
- } else {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Could not read UID "
- "cache file \"%s\". You may "
- "receive duplicate "
- "messages."), filename);
- }
-
- g_free (filename);
- } else
- cache = NULL;
-
- printf ("mail_tool_move_folder: %d of those messages are new\n", uids->len);
-
- /* Copy the messages */
-
- for (i = 0; i < uids->len; i++) {
- CamelMimeMessage *msg;
- const CamelMessageInfo *info;
- /* Get the message */
-
- msg = camel_folder_get_message (source, uids->pdata[i], ex);
- if (camel_exception_is_set (ex)) {
- camel_object_unref (CAMEL_OBJECT (msg));
- goto cleanup;
- }
-
- /* Append it to dest */
-
- info = camel_folder_get_message_info (source, uids->pdata[i]);
- camel_folder_append_message (dest, msg, info, ex);
- if (camel_exception_is_set (ex)) {
- camel_object_unref (CAMEL_OBJECT (msg));
- goto cleanup;
- }
-
- /* (Maybe) get rid of the message */
-
- camel_object_unref (CAMEL_OBJECT (msg));
- if (!use_cache)
- camel_folder_delete_message (source, uids->pdata[i]);
- }
-
- /* All done. Sync n' free. */
-
- if (cache) {
- camel_uid_cache_free_uids (uids);
-
- if (!camel_exception_is_set (ex))
- camel_uid_cache_save (cache);
- camel_uid_cache_destroy (cache);
- } else
- camel_folder_free_uids (source, uids);
-
- camel_folder_sync (source, TRUE, ex);
-
- cleanup:
- camel_object_unref (CAMEL_OBJECT (source));
- camel_object_unref (CAMEL_OBJECT (dest));
- mail_tool_camel_lock_down();
-}
-
-void
-mail_tool_set_uid_flags (CamelFolder *folder, const char *uid, guint32 mask, guint32 set)
-{
- mail_tool_camel_lock_up();
- camel_folder_set_message_flags (folder, uid,
- mask, set);
- mail_tool_camel_lock_down();
-}
-
-gchar *
-mail_tool_generate_forward_subject (CamelMimeMessage *msg)
-{
- const gchar *from;
- const gchar *subject;
- gchar *fwd_subj;
-
- mail_tool_camel_lock_up();
- from = camel_mime_message_get_from (msg);
- subject = camel_mime_message_get_subject (msg);
- mail_tool_camel_lock_down();
-
- if (from) {
- if (subject && *subject) {
- fwd_subj = g_strdup_printf (_("[%s] %s"), from, subject);
- } else {
- fwd_subj = g_strdup_printf (_("[%s] (forwarded message)"),
- from);
- }
- } else {
- if (subject && *subject) {
- if (strncmp (subject, "Fwd: ", 5) == 0)
- subject += 4;
- fwd_subj = g_strdup_printf ("Fwd: %s", subject);
- } else
- fwd_subj = g_strdup (_("Fwd: (no subject)"));
- }
-
- return fwd_subj;
-}
-
-void
-mail_tool_send_via_transport (CamelTransport *transport, CamelMedium *medium, CamelException *ex)
-{
- mail_tool_camel_lock_up();
-
- camel_service_connect (CAMEL_SERVICE (transport), ex);
- if (camel_exception_is_set (ex))
- goto cleanup;
-
- camel_transport_send (transport, medium, ex);
-
- camel_service_disconnect (CAMEL_SERVICE (transport),
- camel_exception_is_set (ex) ? NULL : ex);
- cleanup:
- mail_tool_camel_lock_down();
-}
-
-CamelMimePart *
-mail_tool_make_message_attachment (CamelMimeMessage *message)
-{
- CamelMimePart *part;
- const char *subject;
- gchar *desc;
-
- mail_tool_camel_lock_up();
- /*camel_object_ref (CAMEL_OBJECT (message));*/
-
- subject = camel_mime_message_get_subject (message);
- if (subject)
- desc = g_strdup_printf (_("Forwarded message - %s"), subject);
- else
- desc = g_strdup (_("Forwarded message (no subject)"));
-
- part = camel_mime_part_new ();
- camel_mime_part_set_disposition (part, "inline");
- camel_mime_part_set_description (part, desc);
- camel_medium_set_content_object (CAMEL_MEDIUM (part),
- CAMEL_DATA_WRAPPER (message));
- camel_mime_part_set_content_type (part, "message/rfc822");
- /*camel_object_unref (CAMEL_OBJECT (message));*/
- mail_tool_camel_lock_down();
- return part;
-}
-
-CamelFolder *
-mail_tool_fetch_mail_into_searchable (const char *source_url, gboolean keep_on_server, CamelException *ex)
-{
- CamelFolder *search_folder = NULL;
- CamelFolder *spool_folder = NULL;
-
- /* If fetching mail from an mbox store, safely copy it to a
- * temporary store first.
- */
-
- if (!strncmp (source_url, "mbox:", 5))
- spool_folder = mail_tool_do_movemail (source_url, ex);
- else
- spool_folder = mail_tool_get_inbox (source_url, ex);
-
- /* No new mail */
- if (spool_folder == NULL)
- return NULL;
-
- if (camel_exception_is_set (ex))
- goto cleanup;
-
- /* can we perform filtering on this source? */
-
- if (!(spool_folder->has_summary_capability
- && spool_folder->has_search_capability)) {
-
- /* no :-(. Copy the messages to a local tempbox
- * so that the folder browser can search it. */
- gchar *url;
-
- url = mail_tool_get_local_movemail_url();
- search_folder = mail_tool_get_folder_from_urlname (url, "movemail", TRUE, ex);
- g_free (url);
- if (camel_exception_is_set (ex))
- goto cleanup;
-
- mail_tool_move_folder_contents (spool_folder, search_folder, keep_on_server, ex);
- if (camel_exception_is_set (ex))
- goto cleanup;
-
- } else {
- /* we can search! don't bother movemailing */
- search_folder = spool_folder;
- mail_tool_camel_lock_up();
- camel_object_ref (CAMEL_OBJECT (search_folder));
- mail_tool_camel_lock_down();
- }
-
- cleanup:
- mail_tool_camel_lock_up();
- camel_object_unref (CAMEL_OBJECT (spool_folder));
- mail_tool_camel_lock_down();
- return search_folder;
-}
-
-CamelFolder *
-mail_tool_filter_get_folder_func (FilterDriver *d, const char *uri, void *data)
-{
- return mail_tool_uri_to_folder_noex (uri);
-}
-
-void
-mail_tool_filter_contents_into (CamelFolder *source, CamelFolder *dest,
- gboolean delete_source,
- gpointer hook_func, gpointer hook_data,
- CamelException *ex)
-{
- gchar *userrules;
- gchar *systemrules;
- FilterContext *fc;
- FilterDriver *filter;
-
- userrules = g_strdup_printf ("%s/filters.xml", evolution_dir);
- systemrules = g_strdup_printf ("%s/evolution/filtertypes.xml", EVOLUTION_DATADIR);
- fc = filter_context_new();
- rule_context_load ((RuleContext *)fc, systemrules, userrules, NULL, NULL);
- g_free (userrules);
- g_free (systemrules);
-
- filter = filter_driver_new (fc, mail_tool_filter_get_folder_func, 0);
-
- if (hook_func)
- camel_object_hook_event (CAMEL_OBJECT (dest), "folder_changed",
- hook_func, hook_data);
-
- filter_driver_run (filter, source, dest, FILTER_SOURCE_INCOMING,
- TRUE, hook_func, hook_data);
-
- camel_folder_sync (CAMEL_FOLDER (source), TRUE, ex);
- camel_folder_sync (CAMEL_FOLDER (dest), TRUE, ex);
-
- if (delete_source) {
- gchar *path = mail_tool_get_local_movemail_path();
- struct stat sb;
-
- if (stat (path, &sb) < 0) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Couldn't stat(2) movemail folder %s"),
- path);
- g_free (path);
- return;
- }
-
- if (sb.st_size == 0)
- unlink (path);
-
- g_free (path);
- }
-}
-
-CamelFolder *
-mail_tool_get_root_of_store (const char *source_uri, CamelException *ex)
-{
- CamelStore *store;
- CamelFolder *folder;
-
- mail_tool_camel_lock_up();
-
- store = camel_session_get_store (session, source_uri, ex);
- if (!store) {
- mail_tool_camel_lock_down();
- return NULL;
- }
-
- camel_service_connect (CAMEL_SERVICE (store), ex);
- if (camel_exception_is_set (ex)) {
- camel_object_unref (CAMEL_OBJECT (store));
- mail_tool_camel_lock_down();
- return NULL;
- }
-
- folder = camel_store_get_root_folder (store, ex);
- camel_object_unref (CAMEL_OBJECT (store));
- mail_tool_camel_lock_down();
-
- return folder;
-}
-
-CamelFolder *
-mail_tool_uri_to_folder (const char *uri, CamelException *ex)
-{
- CamelStore *store = NULL;
- CamelFolder *folder = NULL;
-
- if (!strncmp (uri, "vfolder:", 8)) {
- folder = vfolder_uri_to_folder (uri, ex);
- } else if (!strncmp (uri, "imap:", 5)) {
- char *service, *ptr;
-
- service = g_strdup_printf ("%s/", uri);
- for (ptr = service + 7; *ptr && *ptr != '/'; ptr++);
- ptr++;
- *ptr = '\0';
-
- mail_tool_camel_lock_up ();
- store = camel_session_get_store (session, service, ex);
- g_free (service);
- if (store) {
- CamelURL *url = CAMEL_SERVICE (store)->url;
- char *folder_uri;
-
- for (ptr = (char *)(uri + 7); *ptr && *ptr != '/'; ptr++);
- if (*ptr == '/') {
- if (url && url->path) {
- ptr += strlen (url->path);
- printf ("ptr = %s\n", ptr);
- if (*ptr == '/')
- ptr++;
- }
-
- if (*ptr == '/')
- ptr++;
- /*for ( ; *ptr && *ptr == '/'; ptr++);*/
-
- folder_uri = g_strdup (ptr);
- folder = camel_store_get_folder (store, folder_uri, TRUE, ex);
- g_free (folder_uri);
- }
- }
-
- mail_tool_camel_lock_down ();
-
- } else if (!strncmp (uri, "news:", 5)) {
- mail_tool_camel_lock_up();
- store = camel_session_get_store (session, uri, ex);
- if (store) {
- const char *folder_path;
-
- folder_path = uri + 5;
- folder = camel_store_get_folder (store, folder_path, FALSE, ex);
- }
-
- mail_tool_camel_lock_down();
-
- } else if (!strncmp (uri, "file:", 5)) {
- folder = mail_tool_local_uri_to_folder (uri, ex);
- } else {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Don't know protocol to open URI `%s'"), uri);
- }
-
- if (camel_exception_is_set (ex)) {
- if (folder) {
- camel_object_unref (CAMEL_OBJECT (folder));
- folder = NULL;
- }
- }
-
- if (store)
- camel_object_unref (CAMEL_OBJECT (store));
-
- return folder;
-}
-
-CamelFolder *
-mail_tool_uri_to_folder_noex (const char *uri)
-{
- CamelException ex;
- CamelFolder *result;
-
- camel_exception_init (&ex);
- result = mail_tool_uri_to_folder (uri, &ex);
-
- if (camel_exception_is_set (&ex)) {
- gchar *msg;
- GtkWidget *dialog;
-
- msg = g_strdup_printf (_("Cannot open location `%s':\n"
- "%s"),
- uri,
- camel_exception_get_description (&ex));
- dialog = gnome_error_dialog (msg);
- g_free (msg);
- GDK_THREADS_ENTER ();
- gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
- GDK_THREADS_LEAVE ();
- gtk_widget_destroy (dialog);
- }
-
- return result;
-}
-
diff --git a/mail/mail-tools.h b/mail/mail-tools.h
deleted file mode 100644
index 3aba7dde2c..0000000000
--- a/mail/mail-tools.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Peter Williams <peterw@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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 MAIL_TOOLS_H
-#define MAIL_TOOLS_H
-
-#include <camel/camel.h>
-#include <filter/filter-driver.h> /*eek*/
-
-/* A global recursive lock on Camel */
-void mail_tool_camel_lock_up (void);
-void mail_tool_camel_lock_down (void);
-
-/* Get a CamelFolder from a root url and a foldername (uses the global session)*/
-CamelFolder *
-mail_tool_get_folder_from_urlname (const gchar *url, const gchar *name,
- gboolean create, CamelException *ex);
-
-/* Get a useful name for a given CamelFolder (ie, not "mbox") */
-const gchar *mail_tool_get_folder_name (CamelFolder *folder);
-
-/* Get the url for the local inbox */
-gchar *mail_tool_get_local_inbox_url (void);
-
-/* Get the filename for our movemail folder or storage */
-gchar *mail_tool_get_local_movemail_path (void);
-gchar *mail_tool_get_local_movemail_url (void);
-
-/* Get the CamelFolder for the local inbox */
-CamelFolder *mail_tool_get_local_inbox (CamelException *ex);
-
-/* Get the "inbox" for a url (uses global session) */
-CamelFolder *mail_tool_get_inbox (const gchar *url, CamelException *ex);
-
-/* Does a camel_movemail into the local movemail folder
- * and returns the movemail folder that was created. */
-CamelFolder *
-mail_tool_do_movemail (const gchar *source_url, CamelException *ex);
-
-/* Transfers all the messages from source into dest;
- * source is emptied and synced. */
-void
-mail_tool_move_folder_contents (CamelFolder *source, CamelFolder *dest, gboolean use_cache, CamelException *ex);
-
-/* Sets the flags on a message represented by a UID in a folder. */
-void
-mail_tool_set_uid_flags (CamelFolder *folder, const char *uid, guint32 mask, guint32 set);
-
-/* Generates the subject for a message forwarding @msg */
-gchar *
-mail_tool_generate_forward_subject (CamelMimeMessage *msg);
-
-/* Sends the medium over transport */
-void
-mail_tool_send_via_transport (CamelTransport *transport, CamelMedium *medium, CamelException *ex);
-
-/* Make a message into an attachment */
-CamelMimePart *
-mail_tool_make_message_attachment (CamelMimeMessage *message);
-
-/* Fetch mail from the source URL's inbox into a searchable folder.
- * (not guaranteed to be local). Returns the searchable folder. */
-CamelFolder *
-mail_tool_fetch_mail_into_searchable (const char *source_url, gboolean keep_on_server, CamelException *ex);
-
-/* Filter source into dest using the default filters. */
-void
-mail_tool_filter_contents_into (CamelFolder *source, CamelFolder *dest,
- gboolean delete_source,
- gpointer hook_func, gpointer hook_data,
- CamelException *ex);
-
-/* Get the root folder of the store specified by @source_uri */
-CamelFolder *
-mail_tool_get_root_of_store (const char *source_uri, CamelException *ex);
-
-/* Parse the ui into a real CamelFolder any way we know how. */
-CamelFolder *
-mail_tool_uri_to_folder (const char *uri, CamelException *ex);
-
-/* Same as above taking no exceptions, popping up a GnomeErrorDialog
- * if any problems occur. */
-CamelFolder *
-mail_tool_uri_to_folder_noex (const char *uri);
-
-GHashTable *
-mail_lookup_url_table (CamelMimeMessage *mime_message);
-
-/* Appropriate for filter_driver_run */
-CamelFolder *
-mail_tool_filter_get_folder_func (FilterDriver *d, const char *uri, void *data);
-
-
-#endif
diff --git a/mail/mail-types.h b/mail/mail-types.h
deleted file mode 100644
index c5b690563d..0000000000
--- a/mail/mail-types.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Copyright 2000 Helix Code, Inc. (http://www.helixcode.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 MAIL_TYPES_H
-#define MAIL_TYPES_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-
-typedef struct _FolderBrowser FolderBrowser;
-typedef struct _MessageList MessageList;
-typedef struct _MailDisplay MailDisplay;
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* MAIL_TYPES_H */
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c
deleted file mode 100644
index b425fe7bec..0000000000
--- a/mail/mail-vfolder.c
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- Copyright 2000 Helix Code Inc.
-
- Author: Michael Zucchi <notzed@helixcode.com>
-
- code for managing vfolders
-
- NOTE: dont run this through fucking indent.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <bonobo.h>
-
-#include "Evolution.h"
-#include "evolution-storage.h"
-
-#include "evolution-shell-component.h"
-#include "folder-browser.h"
-#include "mail-vfolder.h"
-#include "mail-tools.h"
-#include "mail-autofilter.h"
-
-#include "camel/camel.h"
-
-#include "filter/vfolder-context.h"
-#include "filter/vfolder-editor.h"
-
-#define d(x) x
-
-struct _vfolder_info {
- char *name;
- char *query;
-};
-
-/* list of vfolders available */
-static GList *available_vfolders = NULL;
-static VfolderContext *context;
-static EvolutionStorage *vfolder_storage;
-
-/* GROSS HACK: for passing to other parts of the program */
-EvolutionShellClient *global_shell_client = NULL;
-
-/* more globals ... */
-extern char *evolution_dir;
-extern CamelSession *session;
-
-static struct _vfolder_info *
-vfolder_find(const char *name)
-{
- GList *l = available_vfolders;
- struct _vfolder_info *info;
-
- while (l) {
- info = l->data;
- if (!strcmp(info->name, name))
- return info;
- l = g_list_next(l);
- }
- return NULL;
-}
-
-/* go through the list of what we have, what we want, and make
- them match, deleting/reconfiguring as required */
-static void
-vfolder_refresh(void)
-{
- GList *l;
- GList *head = NULL; /* processed list */
- struct _vfolder_info *info;
- FilterRule *rule;
- GString *expr = g_string_new("");
- char *uri, *path;
-
- rule = NULL;
- while ( (rule = rule_context_next_rule((RuleContext *)context, rule)) ) {
- info = vfolder_find(rule->name);
- g_string_truncate(expr, 0);
- filter_rule_build_code(rule, expr);
- if (info) {
- available_vfolders = g_list_remove(available_vfolders, info);
-
- /* check if the rule has changed ... otherwise, leave it */
- if (strcmp(expr->str, info->query)) {
- d(printf("Must reconfigure vfolder with new rule?\n"));
- g_free(info->query);
- info->query = g_strdup(expr->str);
-
- /*uri = g_strdup_printf("vfolder:%s/vfolder/%s?%s", evolution_dir, info->name, info->query);*/
- uri = g_strdup_printf("vfolder:%s", info->name);
- path = g_strdup_printf("/%s", info->name);
- evolution_storage_removed_folder(vfolder_storage, path);
- evolution_storage_new_folder (vfolder_storage, path,
- "mail",
- uri,
- info->name);
- g_free(uri);
- g_free(path);
- }
- } else {
- info = g_malloc(sizeof(*info));
- info->name = g_strdup(rule->name);
- info->query = g_strdup(expr->str);
- d(printf("Adding new vfolder: %s %s\n", rule->name, expr->str));
-
- /*uri = g_strdup_printf("vfolder:%s/vfolder/%s?%s", evolution_dir, info->name, info->query);*/
- uri = g_strdup_printf("vfolder:%s", info->name);
- path = g_strdup_printf("/%s", info->name);
- evolution_storage_new_folder (vfolder_storage, path,
- "mail",
- uri,
- info->name);
- g_free(uri);
- g_free(path);
- }
- head = g_list_append(head, info);
- }
- /* everything in available_vfolders are to be removed ... */
- l = available_vfolders;
- while (l) {
- info = l->data;
- d(printf("removing vfolders %s %s\n", info->name, info->query));
- path = g_strdup_printf("/%s", info->name);
- evolution_storage_removed_folder(vfolder_storage, path);
- g_free(path);
- g_free(info->name);
- g_free(info->query);
- l = g_list_next(l);
- }
- g_list_free(available_vfolders);
- available_vfolders = head;
- g_string_free(expr, TRUE);
-}
-
-void
-vfolder_create_storage(EvolutionShellComponent *shell_component)
-{
- EvolutionShellClient *shell_client;
- Evolution_Shell corba_shell;
- EvolutionStorage *storage;
- char *user, *system;
-
- shell_client = evolution_shell_component_get_owner (shell_component);
- if (shell_client == NULL) {
- g_warning ("We have no shell!?");
- return;
- }
- global_shell_client = shell_client;
-
- corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client));
-
- storage = evolution_storage_new ("VFolders");
- if (evolution_storage_register_on_shell (storage, corba_shell) != EVOLUTION_STORAGE_OK) {
- g_warning ("Cannot register storage");
- return;
- }
-
- vfolder_storage = storage;
-
- user = g_strdup_printf ("%s/vfolders.xml", evolution_dir);
- system = g_strdup_printf("%s/evolution/vfoldertypes.xml", EVOLUTION_DATADIR);
-
- context = vfolder_context_new();
- printf("loading rules %s %s\n", system, user);
- if (rule_context_load((RuleContext *)context, system, user, NULL, NULL) != 0) {
- g_warning("cannot load vfolders: %s\n", ((RuleContext *)context)->error);
- }
- g_free(user);
- g_free(system);
- vfolder_refresh();
-}
-
-/* THIS IS ANALOGOUS TO mail_tool_uri_to_folder. IT IS NOT ASYNCHRONOUS */
-/* maps the shell's uri to the real vfolder uri and open the folder */
-CamelFolder *
-vfolder_uri_to_folder(const char *uri, CamelException *ex)
-{
- void camel_vee_folder_add_folder(CamelFolder *, CamelFolder *);
-
- struct _vfolder_info *info;
- char *storeuri, *foldername;
- VfolderRule *rule;
- CamelFolder *folder = NULL, *sourcefolder;
- const char *sourceuri;
- int sources;
-
- if (strncmp (uri, "vfolder:", 8))
- return NULL;
-
- info = vfolder_find(uri+8);
- if (info == NULL) {
- g_warning("Shell trying to open unknown vFolder: %s", uri);
- return NULL;
- }
-
- d(printf("Opening vfolder: %s\n", uri));
-
- rule = (VfolderRule *)rule_context_find_rule((RuleContext *)context, info->name);
-
- storeuri = g_strdup_printf("vfolder:%s/vfolder/%s", evolution_dir, info->name);
- foldername = g_strdup_printf("mbox?%s", info->query);
-
- folder = mail_tool_get_folder_from_urlname (storeuri, foldername, TRUE, ex);
-
- sourceuri = NULL;
- sources = 0;
- while ( (sourceuri = vfolder_rule_next_source(rule, sourceuri)) ) {
- d(printf("adding vfolder source: %s\n", sourceuri));
- sourcefolder = mail_tool_uri_to_folder (sourceuri, ex);
- if (sourcefolder) {
- sources++;
- mail_tool_camel_lock_up ();
- camel_vee_folder_add_folder(folder, sourcefolder);
- mail_tool_camel_lock_down ();
- }
- }
- /* if we didn't have any sources, just use Inbox as the default */
- if (sources == 0) {
- char *defaulturi;
-
- defaulturi = g_strdup_printf("file://%s/local/Inbox", evolution_dir);
- d(printf("No sources configured/found, using default: %s\n", defaulturi));
- sourcefolder = mail_tool_uri_to_folder (defaulturi, ex);
- g_free(defaulturi);
- if (sourcefolder) {
- mail_tool_camel_lock_up ();
- camel_vee_folder_add_folder(folder, sourcefolder);
- mail_tool_camel_lock_down ();
- }
- }
-
- g_free(foldername);
- g_free(storeuri);
-
- return folder;
-}
-
-static void
-vfolder_editor_clicked(GtkWidget *w, int button, void *data)
-{
- if (button == 0) {
- char *user;
-
- user = g_strdup_printf("%s/vfolders.xml", evolution_dir);
- rule_context_save((RuleContext *)context, user);
- g_free(user);
- vfolder_refresh();
- }
- if (button != -1) {
- gnome_dialog_close((GnomeDialog *)w);
- }
-}
-
-void
-vfolder_edit(void)
-{
- GtkWidget *w;
-
- w = vfolder_editor_construct(context);
- gtk_signal_connect((GtkObject *)w, "clicked", vfolder_editor_clicked, NULL);
- gtk_widget_show(w);
-}
-
-static void
-new_rule_clicked(GtkWidget *w, int button, void *data)
-{
- if (button == 0) {
- char *user;
- FilterRule *rule = gtk_object_get_data((GtkObject *)w, "rule");
-
- gtk_object_ref((GtkObject *)rule);
- rule_context_add_rule((RuleContext *)context, rule);
- user = g_strdup_printf("%s/vfolders.xml", evolution_dir);
- rule_context_save((RuleContext *)context, user);
- g_free(user);
- vfolder_refresh();
- }
- if (button != -1) {
- gnome_dialog_close((GnomeDialog *)w);
- }
-}
-
-FilterPart *
-vfolder_create_part(const char *name)
-{
- return rule_context_create_part((RuleContext *)context, name);
-}
-
-/* adds a rule with a gui */
-void
-vfolder_gui_add_rule(VfolderRule *rule)
-{
- GtkWidget *w;
- GnomeDialog *gd;
-
- w = filter_rule_get_widget((FilterRule *)rule, (RuleContext *)context);
- gd = (GnomeDialog *)gnome_dialog_new(_("New VFolder"),
- GNOME_STOCK_BUTTON_OK,
- GNOME_STOCK_BUTTON_CANCEL,
- NULL);
- gtk_box_pack_start((GtkBox *)gd->vbox, w, FALSE, TRUE, 0);
- gtk_widget_show((GtkWidget *)gd);
- gtk_object_set_data_full((GtkObject *)gd, "rule", rule, (GtkDestroyNotify)gtk_object_unref);
- gtk_signal_connect((GtkObject *)gd, "clicked", new_rule_clicked, NULL);
- gtk_widget_show((GtkWidget *)gd);
-}
-
-void
-vfolder_gui_add_from_message(CamelMimeMessage *msg, int flags, const char *source)
-{
- VfolderRule *rule;
-
- rule = (VfolderRule*)vfolder_rule_from_message(context, msg, flags, source);
- vfolder_gui_add_rule(rule);
-}
-
diff --git a/mail/mail-vfolder.h b/mail/mail-vfolder.h
deleted file mode 100644
index 2ff19cc3ea..0000000000
--- a/mail/mail-vfolder.h
+++ /dev/null
@@ -1,24 +0,0 @@
-
-#ifndef _MAIL_VFOLDER_H
-#define _MAIL_VFOLDER_H
-
-#include <bonobo.h>
-
-#include "Evolution.h"
-#include "evolution-storage.h"
-#include "evolution-shell-component.h"
-
-#include "camel/camel-folder.h"
-#include "camel/camel-mime-message.h"
-#include "filter/vfolder-rule.h"
-#include "filter/filter-part.h"
-
-void vfolder_create_storage(EvolutionShellComponent *shell_component);
-
-CamelFolder *vfolder_uri_to_folder(const char *uri, CamelException *ex);
-void vfolder_edit(void);
-FilterPart *vfolder_create_part(const char *name);
-void vfolder_gui_add_rule(VfolderRule *rule);
-void vfolder_gui_add_from_message(CamelMimeMessage *msg, int flags, const char *source);
-
-#endif
diff --git a/mail/mail-view.c b/mail/mail-view.c
deleted file mode 100644
index 6c336a47f8..0000000000
--- a/mail/mail-view.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@helixcode.com>
- *
- * Copyright 2000 Helix Code, Inc. (www.helixcode.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.
- *
- */
-
-#include <config.h>
-#include "mail.h"
-#include "mail-ops.h"
-#include "camel/camel.h"
-
-typedef struct mail_view_data_s {
- CamelFolder *source;
- gchar *uid;
- CamelMimeMessage *msg;
- MailDisplay *md;
-} mail_view_data;
-
-static void
-mail_view_data_free (gpointer mvd)
-{
- mail_view_data *data = (mail_view_data *) mvd;
-
- if (data->uid)
- g_free (data->uid);
- if (data->msg)
- camel_object_unref (CAMEL_OBJECT (data->msg));
- if (data->source)
- camel_object_unref (CAMEL_OBJECT (data->source));
-
- g_free (data);
-}
-
-static mail_view_data *
-mail_view_data_new (CamelFolder *source, const gchar *uid, CamelMimeMessage *msg)
-{
- mail_view_data *data;
-
- data = g_new (mail_view_data, 1);
- data->source = source;
- camel_object_ref (CAMEL_OBJECT (data->source));
- data->msg = msg;
- camel_object_ref (CAMEL_OBJECT (data->msg));
- data->uid = g_strdup (uid);
-
- return data;
-}
-
-static void
-on_close (GtkWidget *menuitem, gpointer user_data)
-{
- GtkWidget *view_window;
-
- view_window = gtk_object_get_data (GTK_OBJECT (menuitem), "view-window");
- g_return_if_fail (view_window);
- gtk_widget_destroy (GTK_WIDGET (view_window));
-}
-
-static void
-view_reply_to_sender (GtkWidget *widget, gpointer user_data)
-{
- mail_view_data *data = (mail_view_data *) user_data;
-
- mail_reply (data->source, data->msg, data->uid, FALSE);
-}
-
-static void
-view_reply_to_all (GtkWidget *widget, gpointer user_data)
-{
- mail_view_data *data = (mail_view_data *) user_data;
-
- mail_reply (data->source, data->msg, data->uid, TRUE);
-}
-
-static void
-view_forward_msg (GtkWidget *widget, gpointer user_data)
-{
- mail_view_data *data = (mail_view_data *) user_data;
-
- GPtrArray *uids;
- EMsgComposer *composer;
-
- uids = g_ptr_array_new();
- g_ptr_array_add (uids, g_strdup (data->uid));
-
- composer = E_MSG_COMPOSER (e_msg_composer_new ());
- gtk_signal_connect (GTK_OBJECT (composer), "send",
- GTK_SIGNAL_FUNC (composer_send_cb), NULL);
-
- mail_do_forward_message (data->msg, data->source, uids, composer);
-}
-
-static void
-view_print_msg (GtkWidget *widget, gpointer user_data)
-{
- mail_view_data *data = (mail_view_data *) user_data;
-
- mail_print_msg (data->md);
-}
-
-static void
-view_delete_msg (GtkWidget *button, gpointer user_data)
-{
- mail_view_data *data = (mail_view_data *) user_data;
-
- GPtrArray *uids;
-
- uids = g_ptr_array_new();
- g_ptr_array_add (uids, g_strdup (data->uid));
- mail_do_flag_messages (data->source, uids, TRUE,
- CAMEL_MESSAGE_DELETED, CAMEL_MESSAGE_DELETED);
-}
-
-static GnomeUIInfo mail_view_toolbar [] = {
-
- /*GNOMEUIINFO_ITEM_STOCK (N_("Save"), N_("Save this message"),
- save_msg, GNOME_STOCK_PIXMAP_SAVE),*/
-
- GNOMEUIINFO_ITEM_STOCK (N_("Reply"), N_("Reply to the sender of this message"),
- view_reply_to_sender, GNOME_STOCK_PIXMAP_MAIL_RPL),
-
- GNOMEUIINFO_ITEM_STOCK (N_("Reply to All"), N_("Reply to all recipients of this message"),
- view_reply_to_all, GNOME_STOCK_PIXMAP_MAIL_RPL),
-
- GNOMEUIINFO_ITEM_STOCK (N_("Forward"), N_("Forward this message"), view_forward_msg, GNOME_STOCK_PIXMAP_MAIL_FWD),
-
- GNOMEUIINFO_SEPARATOR,
-
- GNOMEUIINFO_ITEM_STOCK (N_("Print"), N_("Print the selected message"), view_print_msg, GNOME_STOCK_PIXMAP_PRINT),
-
- GNOMEUIINFO_ITEM_STOCK (N_("Delete"), N_("Delete this message"), view_delete_msg, GNOME_STOCK_PIXMAP_TRASH),
-
- /*GNOMEUIINFO_SEPARATOR,*/
-
- /*GNOMEUIINFO_ITEM_STOCK (N_("Next"), N_("Next message"), mail_view_next_msg, GNOME_STOCK_PIXMAP_NEXT),
-
- GNOMEUIINFO_ITEM_STOCK (N_("Previous"), N_("Previous message"), mail_view_prev_msg, GNOME_STOCK_PIXMAP_PREVIOUS),*/
-
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo file_menu[] = {
- /*GNOMEUIINFO_MENU_SAVE_ITEM (save, NULL),*/
- /*GNOMEUIINFO_MENU_SAVE_AS_ITEM (save_as, NULL),*/
- /*GNOMEUIINFO_SEPARATOR,*/
- GNOMEUIINFO_MENU_CLOSE_ITEM (on_close, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo view_menu[] =
-{
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo mail_view_menubar[] =
-{
- GNOMEUIINFO_MENU_FILE_TREE (file_menu),
- GNOMEUIINFO_MENU_VIEW_TREE (view_menu),
- GNOMEUIINFO_END
-};
-
-GtkWidget *
-mail_view_create (CamelFolder *source, const char *uid, CamelMimeMessage *msg)
-{
- GtkWidget *window;
- GtkWidget *toolbar;
- GtkWidget *mail_display;
- GnomeDockItemBehavior behavior;
- char *subject;
- mail_view_data *data;
-
- data = mail_view_data_new (source, uid, msg);
-
- subject = (char *) camel_mime_message_get_subject (msg);
- if (!subject)
- subject = "";
-
- window = gnome_app_new ("Evolution", subject);
-
- toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH);
-
- gnome_app_fill_toolbar_with_data (GTK_TOOLBAR (toolbar),
- mail_view_toolbar,
- NULL, data);
-
- behavior = GNOME_DOCK_ITEM_BEH_NORMAL;
- if (!gnome_preferences_get_toolbar_detachable ())
- behavior |= GNOME_DOCK_ITEM_BEH_LOCKED;
-
- gnome_app_add_toolbar (GNOME_APP (window),
- GTK_TOOLBAR (toolbar),
- GNOME_APP_TOOLBAR_NAME,
- behavior,
- GNOME_DOCK_TOP, 1, 0, 0);
-
- gnome_app_create_menus (GNOME_APP (window), mail_view_menubar);
-
- gtk_object_set_data_full (GTK_OBJECT (window), "mvd", data,
- mail_view_data_free);
-
- gtk_widget_ref (mail_view_menubar[0].widget);
- gtk_object_set_data_full (GTK_OBJECT (window), "file",
- mail_view_menubar[0].widget,
- (GtkDestroyNotify) gtk_widget_unref);
-
- gtk_widget_ref (file_menu[0].widget);
- gtk_object_set_data (GTK_OBJECT (file_menu[0].widget), "view-window", window);
- gtk_object_set_data_full (GTK_OBJECT (window), "close",
- file_menu[0].widget,
- (GtkDestroyNotify) gtk_widget_unref);
-
- gtk_widget_ref (mail_view_menubar[1].widget);
- gtk_object_set_data_full (GTK_OBJECT (window), "view",
- mail_view_menubar[1].widget,
- (GtkDestroyNotify) gtk_widget_unref);
-
- mail_display = mail_display_new ();
- mail_display_set_message (MAIL_DISPLAY (mail_display), CAMEL_MEDIUM (msg));
- gtk_widget_set_usize (mail_display, 600, 600);
- data->md = MAIL_DISPLAY (mail_display);
- gnome_app_set_contents (GNOME_APP (window), mail_display);
-
- return window;
-}
-
-
-
diff --git a/mail/mail.h b/mail/mail.h
deleted file mode 100644
index 8a67d745fb..0000000000
--- a/mail/mail.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright 2000, Helix Code, Inc. (http://www.helixcode.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.
- */
-
-#include <gtkhtml/gtkhtml.h>
-#include "camel/camel.h"
-#include "composer/e-msg-composer.h"
-#include "mail-config.h"
-#include "mail-config-gui.h"
-#include "folder-browser.h"
-
-extern char *evolution_dir;
-
-/* mail-config */
-void mail_config_druid (void);
-
-/* mail-crypto */
-char *mail_crypto_openpgp_decrypt (const char *ciphertext,
- CamelException *ex);
-
-char *mail_crypto_openpgp_encrypt (const char *plaintext,
- const GPtrArray *recipients,
- gboolean sign,
- CamelException *ex);
-/* FIXME: add encryption & signing functions */
-
-/* mail-format */
-void mail_format_mime_message (CamelMimeMessage *mime_message,
- MailDisplay *md);
-
-EMsgComposer *mail_generate_reply (CamelMimeMessage *mime_message,
- gboolean to_all);
-
-char *mail_get_message_body (CamelDataWrapper *data, gboolean want_plain,
- gboolean *is_html);
-
-/* mail-identify */
-char *mail_identify_mime_part (CamelMimePart *part);
-
-/* mail-callbacks */
-void fetch_mail (GtkWidget *widget, gpointer user_data);
-void compose_msg (GtkWidget *widget, gpointer user_data);
-void send_to_url (const char *url);
-void forward_msg (GtkWidget *widget, gpointer user_data);
-void reply_to_sender (GtkWidget *widget, gpointer user_data);
-void reply_to_all (GtkWidget *widget, gpointer user_data);
-void delete_msg (GtkWidget *widget, gpointer user_data);
-void move_msg (GtkWidget *widget, gpointer user_data);
-void copy_msg (GtkWidget *widget, gpointer user_data);
-void print_msg (GtkWidget *widget, gpointer user_data);
-void edit_msg (GtkWidget *widget, gpointer user_data);
-void view_msg (GtkWidget *widget, gpointer user_data);
-
-void mark_all_seen (BonoboUIHandler *uih, void *user_data, const char *path);
-void edit_message (BonoboUIHandler *uih, void *user_data, const char *path);
-void view_message (BonoboUIHandler *uih, void *user_data, const char *path);
-void expunge_folder (BonoboUIHandler *uih, void *user_data, const char *path);
-void filter_edit (BonoboUIHandler *uih, void *user_data, const char *path);
-void vfolder_edit_vfolders (BonoboUIHandler *uih, void *user_data, const char *path);
-void providers_config (BonoboUIHandler *uih, void *user_data, const char *path);
-
-void configure_folder(BonoboUIHandler *uih, void *user_data, const char *path);
-
-void mail_reply (CamelFolder *folder, CamelMimeMessage *msg, const char *uid, gboolean to_all);
-void composer_send_cb (EMsgComposer *composer, gpointer data);
-void mail_print_msg (MailDisplay *md);
-
-void run_filter_ondemand (BonoboUIHandler *uih, gpointer user_data, const char *path);
-
-/* mail view */
-GtkWidget *mail_view_create (CamelFolder *source, const char *uid, CamelMimeMessage *msg);
-
-/* session */
-void session_init (void);
-char *mail_request_dialog (const char *prompt, gboolean secret,
- const char *key, gboolean async);
-void forget_passwords (BonoboUIHandler *uih, void *user_data,
- const char *path);
-extern CamelSession *session;
diff --git a/mail/main.c b/mail/main.c
deleted file mode 100644
index a88117b2c3..0000000000
--- a/mail/main.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * main.c: The core of the mail component
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- *
- * (C) 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-
-#include <signal.h>
-
-#include <gnome.h>
-#include <bonobo/bonobo-main.h>
-#include <bonobo/bonobo-object-directory.h>
-#include <glade/glade.h>
-#include <liboaf/liboaf.h>
-
-#ifdef GTKHTML_HAVE_GCONF
-#include <gconf/gconf.h>
-#endif
-
-#include "e-util/e-gui-utils.h"
-#include "e-util/e-cursors.h"
-
-#include "component-factory.h"
-#include "mail.h"
-
-int
-main (int argc, char *argv [])
-{
- CORBA_ORB orb;
-
- /* free (malloc (10));*/
-
- bindtextdomain (PACKAGE, EVOLUTION_LOCALEDIR);
- textdomain (PACKAGE);
-
- g_thread_init( NULL );
-
- gnome_init_with_popt_table ("evolution-mail-component", VERSION,
- argc, argv, oaf_popt_options, 0, NULL);
- orb = oaf_init (argc, argv);
-
- if (bonobo_init (orb, CORBA_OBJECT_NIL,
- CORBA_OBJECT_NIL) == FALSE) {
- g_error ("Mail component could not initialize Bonobo.\n"
- "If there was a warning message about the "
- "RootPOA, it probably means\nyou compiled "
- "Bonobo against GOAD instead of OAF.");
- }
-
-#ifdef GTKHTML_HAVE_GCONF
- gconf_init (argc, argv, NULL);
-#endif
-
- glade_gnome_init ();
-
- session_init ();
- e_cursors_init ();
-
- component_factory_init ();
-
- signal (SIGSEGV, SIG_DFL);
- signal (SIGBUS, SIG_DFL);
-
- GDK_THREADS_ENTER ();
- bonobo_main ();
- GDK_THREADS_LEAVE ();
-
- mail_config_write_on_exit ();
-
- return 0;
-}
diff --git a/mail/message-list.c b/mail/message-list.c
deleted file mode 100644
index 7499cbb651..0000000000
--- a/mail/message-list.c
+++ /dev/null
@@ -1,1267 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * message-list.c: Displays the messages.
- * Implements CORBA's Evolution::MessageList
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- * Bertrand Guiheneuf (bg@aful.org)
- *
- * (C) 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <bonobo/bonobo-main.h>
-#include <e-util/e-util.h>
-#include <e-util/e-gui-utils.h>
-#include <e-util/e-popup-menu.h>
-#include <camel/camel-exception.h>
-#include <camel/camel-folder.h>
-#include "message-list.h"
-#include "message-thread.h"
-#include "mail-threads.h"
-#include "mail-tools.h"
-#include "mail-ops.h"
-#include "mail-config.h"
-#include "mail-vfolder.h"
-#include "mail-autofilter.h"
-#include "mail.h"
-#include "Mail.h"
-#include "widgets/e-table/e-table-header-item.h"
-#include "widgets/e-table/e-table-item.h"
-
-#include "art/mail-new.xpm"
-#include "art/mail-read.xpm"
-#include "art/mail-replied.xpm"
-#include "art/attachment.xpm"
-#include "art/empty.xpm"
-#include "art/tree-expanded.xpm"
-#include "art/tree-unexpanded.xpm"
-
-/*
- * Default sizes for the ETable display
- *
- */
-#define N_CHARS(x) (CHAR_WIDTH * (x))
-
-#define COL_ICON_WIDTH (16)
-#define COL_CHECK_BOX_WIDTH (16)
-#define COL_FROM_EXPANSION (24.0)
-#define COL_FROM_WIDTH_MIN (32)
-#define COL_SUBJECT_EXPANSION (30.0)
-#define COL_SUBJECT_WIDTH_MIN (32)
-#define COL_SENT_EXPANSION (24.0)
-#define COL_SENT_WIDTH_MIN (32)
-#define COL_RECEIVED_EXPANSION (20.0)
-#define COL_RECEIVED_WIDTH_MIN (32)
-#define COL_TO_EXPANSION (24.0)
-#define COL_TO_WIDTH_MIN (32)
-#define COL_SIZE_EXPANSION (6.0)
-#define COL_SIZE_WIDTH_MIN (32)
-
-#define PARENT_TYPE (bonobo_object_get_type ())
-
-static BonoboObjectClass *message_list_parent_class;
-static POA_Evolution_MessageList__vepv evolution_message_list_vepv;
-
-static void on_cursor_change_cmd (ETableScrolled *table, int row, gpointer user_data);
-static void select_row (ETableScrolled *table, gpointer user_data);
-static gint on_right_click (ETableScrolled *table, gint row, gint col, GdkEvent *event, MessageList *list);
-static void on_double_click (ETableScrolled *table, gint row, MessageList *list);
-static void select_msg (MessageList *message_list, gint row);
-static char *filter_date (const void *data);
-static void nuke_uids (GtkObject *o);
-
-static struct {
- char **image_base;
- GdkPixbuf *pixbuf;
-} states_pixmaps [] = {
- { mail_new_xpm, NULL },
- { mail_read_xpm, NULL },
- { mail_replied_xpm, NULL },
- { empty_xpm, NULL },
- { attachment_xpm, NULL },
- { tree_expanded_xpm, NULL },
- { tree_unexpanded_xpm, NULL },
- { NULL, NULL }
-};
-
-/* Gets the CamelMessageInfo for the message displayed at the given
- * view row.
- */
-static const CamelMessageInfo *
-get_message_info (MessageList *message_list, int row)
-{
- ETreeModel *model = (ETreeModel *)message_list->table_model;
- ETreePath *node;
- char *uid;
-
- if (row >= e_table_model_row_count (message_list->table_model))
- return NULL;
-
- node = e_tree_model_node_at_row (model, row);
- g_return_val_if_fail (node != NULL, NULL);
- uid = e_tree_model_node_get_data (model, node);
-
- if (strncmp (uid, "uid:", 4) != 0)
- return NULL;
- uid += 4;
-
- return camel_folder_get_message_info (message_list->folder, uid);
-}
-
-/* Gets the uid of the message displayed at a given view row */
-static const char *
-get_message_uid (MessageList *message_list, int row)
-{
- ETreeModel *model = (ETreeModel *)message_list->table_model;
- ETreePath *node;
- const char *uid;
-
- if (row >= e_table_model_row_count (message_list->table_model))
- return NULL;
-
- node = e_tree_model_node_at_row (model, row);
- g_return_val_if_fail (node != NULL, NULL);
- uid = e_tree_model_node_get_data (model, node);
-
- if (strncmp (uid, "uid:", 4) != 0)
- return NULL;
- uid += 4;
-
- return uid;
-}
-
-static gint
-mark_msg_seen (gpointer data)
-{
- MessageList *ml = data;
- GPtrArray *uids;
-
- if (!ml->cursor_uid)
- return FALSE;
-
- uids = g_ptr_array_new ();
- g_ptr_array_add (uids, g_strdup (ml->cursor_uid));
- mail_do_flag_messages (ml->folder, uids, FALSE,
- CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
- return FALSE;
-}
-
-/**
- * message_list_select:
- * @message_list: a MessageList
- * @base_row: the (model) row to start from
- * @direction: the direction to search in
- * @flags: a set of flag values
- * @mask: a mask for comparing against @flags
- *
- * This moves the message list selection to a suitable row. @base_row
- * lists the first (model) row to try, but as a special case, model
- * row -1 is mapped to view row 0. @flags and @mask combine to specify
- * what constitutes a suitable row. @direction is
- * %MESSAGE_LIST_SELECT_NEXT if it should find the next matching
- * message, or %MESSAGE_LIST_SELECT_PREVIOUS if it should find the
- * previous. If no suitable row is found, the selection will be
- * unchanged but the message display will be cleared.
- **/
-void
-message_list_select (MessageList *message_list, int base_row,
- MessageListSelectDirection direction,
- guint32 flags, guint32 mask)
-{
- const CamelMessageInfo *info;
- int vrow, mrow, last;
- ETableScrolled *ets = E_TABLE_SCROLLED (message_list->etable);
-
- if (direction == MESSAGE_LIST_SELECT_PREVIOUS)
- last = 0;
- else
- last = e_table_model_row_count (message_list->table_model);
-
- if (base_row == -1)
- vrow = 0;
- else
- vrow = e_table_model_to_view_row (ets->table, base_row);
-
- /* We don't know whether to use < or > due to "direction" */
- while (vrow != last) {
- mrow = e_table_view_to_model_row (ets->table, vrow);
- info = get_message_info (message_list, mrow);
- if (info && (info->flags & mask) == flags) {
- e_table_scrolled_set_cursor_row (ets, mrow);
- mail_do_display_message (message_list, info->uid, mark_msg_seen);
- return;
- }
- vrow += direction;
- }
-
- mail_display_set_message (message_list->parent_folder_browser->mail_display, NULL);
-}
-
-/* select a message and display it */
-static void
-select_msg (MessageList *message_list, gint row)
-{
- const char *uid;
-
- uid = get_message_uid (message_list, row);
- mail_do_display_message (message_list, uid, mark_msg_seen);
-}
-
-
-static GdkPixbuf *
-ml_tree_icon_at (ETreeModel *etm, ETreePath *path, void *model_data)
-{
- /* we dont really need an icon ... */
- return NULL;
-}
-
-static void *
-ml_tree_value_at (ETreeModel *etm, ETreePath *path, int col, void *model_data)
-{
- MessageList *message_list = model_data;
- const CamelMessageInfo *msg_info;
- static char buffer [10];
- char *uid;
-
- /* retrieve the message information array */
- uid = e_tree_model_node_get_data (etm, path);
- if (strncmp (uid, "uid:", 4) != 0)
- goto fake;
- uid += 4;
-
- msg_info = camel_folder_get_message_info (message_list->folder, uid);
- g_return_val_if_fail (msg_info != NULL, NULL);
-
- switch (col){
- case COL_ONLINE_STATUS:
- return GINT_TO_POINTER (0);
-
- case COL_MESSAGE_STATUS:
- if (msg_info->flags & CAMEL_MESSAGE_ANSWERED)
- return GINT_TO_POINTER (2);
- else if (msg_info->flags & CAMEL_MESSAGE_SEEN)
- return GINT_TO_POINTER (1);
- else
- return GINT_TO_POINTER (0);
-
- case COL_PRIORITY:
- return GINT_TO_POINTER (1);
-
- case COL_ATTACHMENT:
- return GINT_TO_POINTER (0);
-
- case COL_FROM:
- if (msg_info->from)
- return msg_info->from;
- else
- return "";
-
- case COL_SUBJECT:
- if (msg_info->subject)
- return msg_info->subject;
- else
- return "";
-
- case COL_SENT:
- return GINT_TO_POINTER (msg_info->date_sent);
-
- case COL_RECEIVED:
- return GINT_TO_POINTER (msg_info->date_received);
-
- case COL_TO:
- if (msg_info->to)
- return msg_info->to;
- else
- return "";
-
- case COL_SIZE:
- sprintf (buffer, "%d", msg_info->size);
- return buffer;
-
- case COL_DELETED:
- return GINT_TO_POINTER(!!(msg_info->flags & CAMEL_MESSAGE_DELETED));
-
- case COL_UNREAD:
- return GINT_TO_POINTER(!(msg_info->flags & CAMEL_MESSAGE_SEEN));
-
- case COL_COLOUR:
- return (void *) camel_tag_get((CamelTag **) &msg_info->user_tags, "colour");
- }
-
- g_assert_not_reached ();
-
- fake:
- /* This is a fake tree parent */
- switch (col){
- case COL_ONLINE_STATUS:
- case COL_MESSAGE_STATUS:
- case COL_PRIORITY:
- case COL_ATTACHMENT:
- case COL_DELETED:
- case COL_COLOUR:
- case COL_UNREAD:
- case COL_SENT:
- case COL_RECEIVED:
- return (void *) 0;
-
- case COL_SUBJECT:
- return strchr (uid, ':') + 1;
-
- case COL_FROM:
- case COL_TO:
- case COL_SIZE:
- return "?";
- }
- g_assert_not_reached ();
-
- return NULL;
-}
-
-static void
-ml_tree_set_value_at (ETreeModel *etm, ETreePath *path, int col,
- const void *val, void *model_data)
-{
- MessageList *message_list = model_data;
- const CamelMessageInfo *msg_info;
- char *uid;
- GPtrArray *uids;
-
- if (col != COL_MESSAGE_STATUS)
- return;
-
- uid = e_tree_model_node_get_data (etm, path);
- if (strncmp (uid, "uid:", 4) != 0)
- return;
- uid += 4;
-
- msg_info = camel_folder_get_message_info (message_list->folder, uid);
- if (!msg_info)
- return;
-
- uids = g_ptr_array_new ();
- g_ptr_array_add (uids, g_strdup (uid));
- mail_do_flag_messages (message_list->folder, uids, TRUE,
- CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
-
- if (message_list->seen_id) {
- gtk_timeout_remove (message_list->seen_id);
- message_list->seen_id = 0;
- }
-}
-
-static gboolean
-ml_tree_is_cell_editable (ETreeModel *etm, ETreePath *path, int col, void *model_data)
-{
- return col == COL_MESSAGE_STATUS;
-}
-
-static void
-message_list_init_images (void)
-{
- int i;
-
- /*
- * Only load once, and share
- */
- if (states_pixmaps [0].pixbuf)
- return;
-
- for (i = 0; states_pixmaps [i].image_base; i++){
- states_pixmaps [i].pixbuf = gdk_pixbuf_new_from_xpm_data (
- (const char **) states_pixmaps [i].image_base);
- }
-}
-
-static char *
-filter_date (const void *data)
-{
- time_t date = GPOINTER_TO_INT (data);
- char buf[26], *p;
-
- if (date == 0)
- return g_strdup ("?");
-
-#ifdef CTIME_R_THREE_ARGS
- ctime_r (&date, buf, 26);
-#else
- ctime_r (&date, buf);
-#endif
-
- p = strchr (buf, '\n');
- if (p)
- *p = '\0';
-
- return g_strdup (buf);
-}
-
-static void
-message_list_init_renderers (MessageList *message_list)
-{
- GdkPixbuf *images [3];
-
- g_assert (message_list);
- g_assert (message_list->table_model);
-
- message_list->render_text = e_cell_text_new (
- message_list->table_model,
- NULL, GTK_JUSTIFY_LEFT);
-
- gtk_object_set(GTK_OBJECT(message_list->render_text),
- "strikeout_column", COL_DELETED,
- NULL);
- gtk_object_set(GTK_OBJECT(message_list->render_text),
- "bold_column", COL_UNREAD,
- NULL);
- gtk_object_set(GTK_OBJECT(message_list->render_text),
- "color_column", COL_COLOUR,
- NULL);
-
- message_list->render_date = e_cell_text_new (
- message_list->table_model,
- NULL, GTK_JUSTIFY_LEFT);
-
- gtk_object_set(GTK_OBJECT(message_list->render_date),
- "text_filter", filter_date,
- NULL);
- gtk_object_set(GTK_OBJECT(message_list->render_date),
- "strikeout_column", COL_DELETED,
- NULL);
- gtk_object_set(GTK_OBJECT(message_list->render_date),
- "bold_column", COL_UNREAD,
- NULL);
- gtk_object_set(GTK_OBJECT(message_list->render_date),
- "color_column", COL_COLOUR,
- NULL);
-
- message_list->render_online_status = e_cell_checkbox_new ();
-
- /*
- * Message status
- */
- images [0] = states_pixmaps [0].pixbuf;
- images [1] = states_pixmaps [1].pixbuf;
- images [2] = states_pixmaps [2].pixbuf;
-
- message_list->render_message_status = e_cell_toggle_new (0, 3, images);
-
- /*
- * Attachment
- */
- images [0] = states_pixmaps [3].pixbuf;
- images [1] = states_pixmaps [4].pixbuf;
-
- message_list->render_attachment = e_cell_toggle_new (0, 2, images);
-
- /*
- * FIXME: We need a real renderer here
- */
- message_list->render_priority = e_cell_checkbox_new ();
-
- /*
- * for tree view
- */
- message_list->render_tree =
- e_cell_tree_new (message_list->table_model,
- states_pixmaps[5].pixbuf,
- states_pixmaps[6].pixbuf,
- TRUE, message_list->render_text);
-}
-
-static void
-message_list_init_header (MessageList *message_list)
-{
- int i;
-
- /*
- * FIXME:
- *
- * Use the font metric to compute this.
- */
-
- message_list->header_model = e_table_header_new ();
- gtk_object_ref (GTK_OBJECT (message_list->header_model));
- gtk_object_sink (GTK_OBJECT (message_list->header_model));
-
- message_list->table_cols [COL_ONLINE_STATUS] =
- e_table_col_new (
- COL_ONLINE_STATUS, _("Online Status"),
- 0.0, COL_CHECK_BOX_WIDTH,
- message_list->render_online_status,
- g_int_compare, FALSE);
-
- message_list->table_cols [COL_MESSAGE_STATUS] =
- e_table_col_new_with_pixbuf (
- COL_MESSAGE_STATUS, states_pixmaps [0].pixbuf,
- 0.0, COL_CHECK_BOX_WIDTH,
- message_list->render_message_status,
- g_int_compare, FALSE);
-
- gtk_object_set(GTK_OBJECT(message_list->table_cols[COL_MESSAGE_STATUS]),
- "sortable", FALSE,
- NULL);
-
- message_list->table_cols [COL_PRIORITY] =
- e_table_col_new (
- COL_PRIORITY, _("Priority"),
- 0.0, COL_CHECK_BOX_WIDTH,
- message_list->render_priority,
- g_int_compare, FALSE);
-
- message_list->table_cols [COL_ATTACHMENT] =
- e_table_col_new_with_pixbuf (
- COL_ATTACHMENT, states_pixmaps [4].pixbuf,
- 0.0, COL_ICON_WIDTH,
- message_list->render_attachment,
- g_int_compare, FALSE);
-
- gtk_object_set(GTK_OBJECT(message_list->table_cols[COL_ATTACHMENT]),
- "sortable", FALSE,
- NULL);
-
- message_list->table_cols [COL_FROM] =
- e_table_col_new (
- COL_FROM, _("From"),
- COL_FROM_EXPANSION, COL_FROM_WIDTH_MIN,
- message_list->render_text,
- g_str_compare, TRUE);
-
- message_list->table_cols [COL_SUBJECT] =
- e_table_col_new (
- COL_SUBJECT, _("Subject"),
- COL_SUBJECT_EXPANSION, COL_SUBJECT_WIDTH_MIN,
- message_list->render_tree,
- g_str_compare, TRUE);
-
- message_list->table_cols [COL_SENT] =
- e_table_col_new (
- COL_SENT, _("Date"),
- COL_SENT_EXPANSION, COL_SENT_WIDTH_MIN,
- message_list->render_date,
- g_int_compare, TRUE);
-
- message_list->table_cols [COL_RECEIVED] =
- e_table_col_new (
- COL_RECEIVED, _("Received"),
- COL_RECEIVED_EXPANSION, COL_RECEIVED_WIDTH_MIN,
- message_list->render_date,
- g_int_compare, TRUE);
-
- message_list->table_cols [COL_TO] =
- e_table_col_new (
- COL_TO, _("To"),
- COL_TO_EXPANSION, COL_TO_WIDTH_MIN,
- message_list->render_text,
- g_str_compare, TRUE);
-
- message_list->table_cols [COL_SIZE] =
- e_table_col_new (
- COL_SIZE, _("Size"),
- COL_SIZE_EXPANSION, COL_SIZE_WIDTH_MIN,
- message_list->render_text,
- g_str_compare, TRUE);
-
- for (i = 0; i < COL_LAST; i++) {
- gtk_object_ref (GTK_OBJECT (message_list->table_cols [i]));
- e_table_header_add_column (message_list->header_model,
- message_list->table_cols [i], i);
- }
-}
-
-static char *
-message_list_get_layout (MessageList *message_list)
-{
- /* Message status, From, Subject, Sent Date */
- return g_strdup ("<ETableSpecification> <columns-shown> <column> 1 </column> <column> 4 </column> <column> 5 </column> <column> 6 </column> </columns-shown> <grouping> </grouping> </ETableSpecification>");
-}
-
-/*
- * GtkObject::init
- */
-static void
-message_list_init (GtkObject *object)
-{
- MessageList *message_list = MESSAGE_LIST (object);
- char *spec;
-
- message_list->table_model = (ETableModel *)
- e_tree_simple_new (ml_tree_icon_at, ml_tree_value_at,
- ml_tree_set_value_at,
- ml_tree_is_cell_editable,
- message_list);
- e_tree_model_root_node_set_visible ((ETreeModel *)message_list->table_model, FALSE);
- gtk_signal_connect (GTK_OBJECT (message_list->table_model), "destroy",
- (GtkSignalFunc) nuke_uids, NULL);
-
- message_list_init_renderers (message_list);
- message_list_init_header (message_list);
-
- /*
- * The etable
- */
-
- spec = message_list_get_layout (message_list);
- message_list->etable = e_table_scrolled_new (
- message_list->header_model, message_list->table_model, spec);
- g_free (spec);
-
- gtk_object_set(GTK_OBJECT(message_list->etable),
- "cursor_mode", E_TABLE_CURSOR_LINE,
- "drawfocus", FALSE,
- "drawgrid", FALSE,
- NULL);
-
- /*
- *gtk_signal_connect (GTK_OBJECT (message_list->etable), "realize",
- * GTK_SIGNAL_FUNC (select_row), message_list);
- */
-
- gtk_signal_connect (GTK_OBJECT (message_list->etable), "cursor_change",
- GTK_SIGNAL_FUNC (on_cursor_change_cmd), message_list);
-
- gtk_signal_connect (GTK_OBJECT (message_list->etable), "right_click",
- GTK_SIGNAL_FUNC (on_right_click), message_list);
-
- gtk_signal_connect (GTK_OBJECT (message_list->etable), "double_click",
- GTK_SIGNAL_FUNC (on_double_click), message_list);
-
- gtk_widget_show (message_list->etable);
-
- gtk_object_ref (GTK_OBJECT (message_list->table_model));
- gtk_object_sink (GTK_OBJECT (message_list->table_model));
-
- /*
- * We do own the Etable, not some widget container
- */
- gtk_object_ref (GTK_OBJECT (message_list->etable));
- gtk_object_sink (GTK_OBJECT (message_list->etable));
-}
-
-static void
-free_key (gpointer key, gpointer value, gpointer data)
-{
- g_free (key);
-}
-
-static void
-message_list_destroy (GtkObject *object)
-{
- MessageList *message_list = MESSAGE_LIST (object);
- int i;
-
-
- gtk_object_unref (GTK_OBJECT (message_list->table_model));
- gtk_object_unref (GTK_OBJECT (message_list->header_model));
-
- /*
- * Renderers
- */
- gtk_object_unref (GTK_OBJECT (message_list->render_text));
- gtk_object_unref (GTK_OBJECT (message_list->render_online_status));
- gtk_object_unref (GTK_OBJECT (message_list->render_message_status));
- gtk_object_unref (GTK_OBJECT (message_list->render_priority));
- gtk_object_unref (GTK_OBJECT (message_list->render_attachment));
- gtk_object_unref (GTK_OBJECT (message_list->render_tree));
-
- gtk_object_unref (GTK_OBJECT (message_list->etable));
-
- if (message_list->uid_rowmap) {
- g_hash_table_foreach (message_list->uid_rowmap,
- free_key, NULL);
- g_hash_table_destroy (message_list->uid_rowmap);
- }
-
- for (i = 0; i < COL_LAST; i++)
- gtk_object_unref (GTK_OBJECT (message_list->table_cols [i]));
-
- if (message_list->idle_id != 0)
- g_source_remove(message_list->idle_id);
-
- if (message_list->seen_id)
- gtk_timeout_remove (message_list->seen_id);
-
- if (message_list->folder)
- camel_object_unref (CAMEL_OBJECT (message_list->folder));
-
- GTK_OBJECT_CLASS (message_list_parent_class)->destroy (object);
-}
-
-/*
- * CORBA method: Evolution::MessageList::select_message
- */
-static void
-MessageList_select_message (PortableServer_Servant _servant,
- const CORBA_long message_number,
- CORBA_Environment *ev)
-{
- printf ("FIXME: select message method\n");
-}
-
-/*
- * CORBA method: Evolution::MessageList::open_message
- */
-static void
-MessageList_open_message (PortableServer_Servant _servant,
- const CORBA_long message_number,
- CORBA_Environment *ev)
-{
- printf ("FIXME: open message method\n");
-}
-
-static POA_Evolution_MessageList__epv *
-evolution_message_list_get_epv (void)
-{
- POA_Evolution_MessageList__epv *epv;
-
- epv = g_new0 (POA_Evolution_MessageList__epv, 1);
-
- epv->select_message = MessageList_select_message;
- epv->open_message = MessageList_open_message;
-
- return epv;
-}
-
-static void
-message_list_corba_class_init (void)
-{
- evolution_message_list_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
- evolution_message_list_vepv.Evolution_MessageList_epv = evolution_message_list_get_epv ();
-}
-
-/*
- * GtkObjectClass::init
- */
-static void
-message_list_class_init (GtkObjectClass *object_class)
-{
- message_list_parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = message_list_destroy;
-
- message_list_corba_class_init ();
-
- message_list_init_images ();
-}
-
-static void
-message_list_construct (MessageList *message_list, Evolution_MessageList corba_message_list)
-{
- bonobo_object_construct (BONOBO_OBJECT (message_list), corba_message_list);
-}
-
-static Evolution_MessageList
-create_corba_message_list (BonoboObject *object)
-{
- POA_Evolution_MessageList *servant;
- CORBA_Environment ev;
-
- servant = (POA_Evolution_MessageList *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &evolution_message_list_vepv;
-
- CORBA_exception_init (&ev);
- POA_Evolution_MessageList__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION){
- g_free (servant);
- CORBA_exception_free (&ev);
- return CORBA_OBJECT_NIL;
- }
-
- CORBA_exception_free (&ev);
- return (Evolution_MessageList) bonobo_object_activate_servant (object, servant);
-}
-
-BonoboObject *
-message_list_new (FolderBrowser *parent_folder_browser)
-{
- Evolution_MessageList corba_object;
- MessageList *message_list;
-
- g_assert (parent_folder_browser);
-
- message_list = gtk_type_new (message_list_get_type ());
-
- corba_object = create_corba_message_list (BONOBO_OBJECT (message_list));
- if (corba_object == CORBA_OBJECT_NIL){
- gtk_object_destroy (GTK_OBJECT (message_list));
- return NULL;
- }
-
- message_list->parent_folder_browser = parent_folder_browser;
-
- message_list->idle_id = 0;
-
- message_list_construct (message_list, corba_object);
-
- return BONOBO_OBJECT (message_list);
-}
-
-static void
-clear_tree (MessageList *ml)
-{
- ETreeModel *etm = E_TREE_MODEL (ml->table_model);
-
- if (ml->tree_root)
- e_tree_model_node_remove (etm, ml->tree_root);
- ml->tree_root =
- e_tree_model_node_insert (etm, NULL, 0, ml);
- e_tree_model_node_set_expanded (etm, ml->tree_root, TRUE);
-}
-
-/* only call if we have a tree model */
-/* builds the tree structure */
-static void build_subtree (MessageList *ml, ETreePath *parent,
- struct _container *c, int *row);
-
-static void
-build_tree (MessageList *ml, struct _container *c)
-{
- int row = 0;
-
- clear_tree (ml);
- build_subtree (ml, ml->tree_root, c, &row);
-}
-
-static void
-build_subtree (MessageList *ml, ETreePath *parent,
- struct _container *c, int *row)
-{
- ETreeModel *tree = E_TREE_MODEL (ml->table_model);
- ETreePath *node;
- char *id;
-
- while (c) {
- if (c->message) {
- id = g_strdup_printf ("uid:%s", c->message->uid);
- g_hash_table_insert (ml->uid_rowmap,
- g_strdup (c->message->uid),
- GINT_TO_POINTER ((*row)++));
- } else
- id = g_strdup_printf ("subject:%s", c->root_subject);
- node = e_tree_model_node_insert (tree, parent, 0, id);
- if (c->child) {
- /* by default, open all trees */
- e_tree_model_node_set_expanded (tree, node, TRUE);
- build_subtree (ml, node, c->child, row);
- }
- c = c->next;
- }
-}
-
-static gboolean
-nuke_uids_cb (GNode *node, gpointer data)
-{
- g_free (e_tree_model_node_get_data (E_TREE_MODEL (data), node));
- return FALSE;
-}
-
-static void
-nuke_uids (GtkObject *o)
-{
- ETreeModel *etm = E_TREE_MODEL (o);
-
- g_node_traverse (etm->root, G_IN_ORDER,
- G_TRAVERSE_ALL, 0,
- nuke_uids_cb, etm);
-}
-
-static void
-build_flat (MessageList *ml, GPtrArray *uids)
-{
- ETreeModel *tree = E_TREE_MODEL (ml->table_model);
- ETreePath *node;
- char *uid;
- int i;
-
- clear_tree (ml);
- for (i = 0; i < uids->len; i++) {
- uid = g_strdup_printf ("uid:%s", (char *)uids->pdata[i]);
- node = e_tree_model_node_insert (tree, ml->tree_root, i, uid);
- g_hash_table_insert (ml->uid_rowmap, g_strdup (uids->pdata[i]),
- GINT_TO_POINTER (i));
- }
-}
-
-static void
-main_folder_changed (CamelObject *o, gpointer event_data, gpointer user_data)
-{
- MessageList *message_list = MESSAGE_LIST (user_data);
-
- mail_do_regenerate_messagelist (message_list, message_list->search);
-}
-
-static void
-folder_changed (CamelObject *o, gpointer event_data, gpointer user_data)
-{
- mail_op_forward_event (main_folder_changed, o, event_data, user_data);
-}
-
-static void
-main_message_changed (CamelObject *o, gpointer uid, gpointer user_data)
-{
- MessageList *message_list = MESSAGE_LIST (user_data);
- int row;
-
- row = GPOINTER_TO_INT (g_hash_table_lookup (message_list->uid_rowmap,
- uid));
- if (row != -1)
- e_table_model_row_changed (message_list->table_model, row);
-
- g_free (uid);
-}
-
-static void
-message_changed (CamelObject *o, gpointer event_data, gpointer user_data)
-{
- /* Here we copy the data because our thread may free the copy that we would reference.
- * The other thread would be passed a uid parameter that pointed to freed data.
- * We copy it and free it in the handler.
- */
- mail_op_forward_event (main_message_changed, o, g_strdup ((gchar *)event_data), user_data);
-}
-
-void
-message_list_set_folder (MessageList *message_list, CamelFolder *camel_folder)
-{
- CamelException ex;
-
- g_return_if_fail (message_list != NULL);
- g_return_if_fail (camel_folder != NULL);
- g_return_if_fail (IS_MESSAGE_LIST (message_list));
- g_return_if_fail (CAMEL_IS_FOLDER (camel_folder));
- g_return_if_fail (camel_folder_has_summary_capability (camel_folder));
-
- camel_exception_init (&ex);
-
- if (message_list->folder)
- camel_object_unref (CAMEL_OBJECT (message_list->folder));
-
- message_list->folder = camel_folder;
-
- camel_object_hook_event(CAMEL_OBJECT (camel_folder), "folder_changed",
- folder_changed, message_list);
- camel_object_hook_event(CAMEL_OBJECT (camel_folder), "message_changed",
- message_changed, message_list);
-
- camel_object_ref (CAMEL_OBJECT (camel_folder));
-
- /*gtk_idle_add (regen_message_list, message_list);*/
- /*folder_changed (CAMEL_OBJECT (camel_folder), 0, message_list);*/
- mail_do_regenerate_messagelist (message_list, message_list->search);
-}
-
-GtkWidget *
-message_list_get_widget (MessageList *message_list)
-{
- return message_list->etable;
-}
-
-E_MAKE_TYPE (message_list, "MessageList", MessageList, message_list_class_init, message_list_init, PARENT_TYPE);
-
-static gboolean
-on_cursor_change_idle (gpointer data)
-{
- MessageList *message_list = data;
-
- select_msg (message_list, message_list->cursor_row);
-
- message_list->idle_id = 0;
- return FALSE;
-}
-
-static void
-on_cursor_change_cmd (ETableScrolled *table, int row, gpointer user_data)
-{
- MessageList *message_list;
- const char *uid;
-
- message_list = MESSAGE_LIST (user_data);
-
- message_list->cursor_row = row;
- uid = get_message_uid (message_list, row);
- message_list->cursor_uid = uid; /*NULL ok*/
-
- if (!message_list->idle_id) {
- message_list->idle_id =
- g_idle_add_full (G_PRIORITY_LOW, on_cursor_change_idle,
- message_list, NULL);
- }
-}
-
-/* FIXME: this is all a kludge. */
-static gint
-idle_select_row (gpointer user_data)
-{
- MessageList *ml = MESSAGE_LIST (user_data);
-
- message_list_select (ml, -1, MESSAGE_LIST_SELECT_NEXT,
- 0, CAMEL_MESSAGE_SEEN);
- return FALSE;
-}
-
-static void
-select_row (ETableScrolled *table, gpointer user_data)
-{
- MessageList *message_list = user_data;
-
- gtk_idle_add (idle_select_row, message_list);
-}
-
-static void
-vfolder_subject(GtkWidget *w, FolderBrowser *fb)
-{
- vfolder_gui_add_from_message(fb->mail_display->current_message, AUTO_SUBJECT,
- fb->uri);
-}
-
-static void
-vfolder_sender(GtkWidget *w, FolderBrowser *fb)
-{
- vfolder_gui_add_from_message(fb->mail_display->current_message, AUTO_FROM,
- fb->uri);
-}
-
-static void
-vfolder_recipient(GtkWidget *w, FolderBrowser *fb)
-{
- vfolder_gui_add_from_message(fb->mail_display->current_message, AUTO_TO,
- fb->uri);
-}
-
-static void
-filter_subject(GtkWidget *w, FolderBrowser *fb)
-{
- filter_gui_add_from_message(fb->mail_display->current_message, AUTO_SUBJECT);
-}
-
-static void
-filter_sender(GtkWidget *w, FolderBrowser *fb)
-{
- filter_gui_add_from_message(fb->mail_display->current_message, AUTO_FROM);
-}
-
-static void
-filter_recipient(GtkWidget *w, FolderBrowser *fb)
-{
- filter_gui_add_from_message(fb->mail_display->current_message, AUTO_TO);
-}
-
-static gint
-on_right_click (ETableScrolled *table, gint row, gint col, GdkEvent *event, MessageList *list)
-{
- FolderBrowser *fb = list->parent_folder_browser;
- extern CamelFolder *drafts_folder;
- int enable_mask = 0;
- EPopupMenu menu[] = {
- { "Open in New Window", NULL, GTK_SIGNAL_FUNC (view_msg), 0 },
- { "Edit Message", NULL, GTK_SIGNAL_FUNC (edit_msg), 1 },
- { "Print Message", NULL, GTK_SIGNAL_FUNC (print_msg), 0 },
- { "", NULL, GTK_SIGNAL_FUNC (NULL), 0 },
- { "Reply to Sender", NULL, GTK_SIGNAL_FUNC (reply_to_sender), 0 },
- { "Reply to All", NULL, GTK_SIGNAL_FUNC (reply_to_all), 0 },
- { "Forward Message", NULL, GTK_SIGNAL_FUNC (forward_msg), 0 },
- { "", NULL, GTK_SIGNAL_FUNC (NULL), 0 },
- { "Delete Message", NULL, GTK_SIGNAL_FUNC (delete_msg), 0 },
- { "Move Message", NULL, GTK_SIGNAL_FUNC (move_msg), 0 },
- { "Copy Message", NULL, GTK_SIGNAL_FUNC (copy_msg), 0 },
- { "", NULL, GTK_SIGNAL_FUNC (NULL), 0 },
- { "VFolder on Subject", NULL, GTK_SIGNAL_FUNC (vfolder_subject), 2 },
- { "VFolder on Sender", NULL, GTK_SIGNAL_FUNC (vfolder_sender), 2 },
- { "VFolder on Recipients", NULL, GTK_SIGNAL_FUNC (vfolder_recipient), 2 },
- { "", NULL, GTK_SIGNAL_FUNC (NULL), 0 },
- { "Filter on Subject", NULL, GTK_SIGNAL_FUNC (filter_subject), 2 },
- { "Filter on Sender", NULL, GTK_SIGNAL_FUNC (filter_sender), 2 },
- { "Filter on Recipients", NULL, GTK_SIGNAL_FUNC (filter_recipient), 2 },
- { NULL, NULL, NULL, 0 }
- };
-
- if (fb->folder != drafts_folder)
- enable_mask |= 1;
- if (fb->mail_display->current_message == NULL)
- enable_mask |= 2;
-
- e_popup_menu_run (menu, (GdkEventButton *)event, enable_mask, 0, fb);
-
- return TRUE;
-}
-
-static void
-on_double_click (ETableScrolled *table, gint row, MessageList *list)
-{
- FolderBrowser *fb = list->parent_folder_browser;
-
- view_msg (NULL, fb);
-}
-
-struct message_list_foreach_data {
- MessageList *message_list;
- MessageListForeachFunc callback;
- gpointer user_data;
-};
-
-static void
-mlfe_callback (int row, gpointer user_data)
-{
- struct message_list_foreach_data *mlfe_data = user_data;
- const char *uid;
-
- uid = get_message_uid (mlfe_data->message_list, row);
- if (uid) {
- mlfe_data->callback (mlfe_data->message_list,
- uid,
- mlfe_data->user_data);
- }
-}
-
-void
-message_list_foreach (MessageList *message_list,
- MessageListForeachFunc callback,
- gpointer user_data)
-{
- struct message_list_foreach_data mlfe_data;
-
- mlfe_data.message_list = message_list;
- mlfe_data.callback = callback;
- mlfe_data.user_data = user_data;
- e_table_scrolled_selected_row_foreach (E_TABLE_SCROLLED (message_list->etable),
- mlfe_callback, &mlfe_data);
-}
-
-void
-message_list_toggle_threads (BonoboUIHandler *uih, void *user_data,
- const char *path)
-{
- MessageList *ml = user_data;
-
- mail_config_set_thread_list (bonobo_ui_handler_menu_get_toggle_state (uih, path));
- mail_do_regenerate_messagelist (ml, ml->search);
-}
-
-/* ** REGENERATE MESSAGELIST ********************************************** */
-
-typedef struct regenerate_messagelist_input_s {
- MessageList *ml;
- char *search;
-} regenerate_messagelist_input_t;
-
-typedef struct regenerate_messagelist_data_s {
- GPtrArray *uids;
-} regenerate_messagelist_data_t;
-
-static gchar *describe_regenerate_messagelist (gpointer in_data, gboolean gerund);
-static void setup_regenerate_messagelist (gpointer in_data, gpointer op_data, CamelException *ex);
-static void do_regenerate_messagelist (gpointer in_data, gpointer op_data, CamelException *ex);
-static void cleanup_regenerate_messagelist (gpointer in_data, gpointer op_data, CamelException *ex);
-
-static gchar *describe_regenerate_messagelist (gpointer in_data, gboolean gerund)
-{
- if (gerund)
- return g_strdup ("Rebuilding message view");
- else
- return g_strdup ("Rebuild message view");
-}
-
-static void setup_regenerate_messagelist (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- regenerate_messagelist_input_t *input = (regenerate_messagelist_input_t *) in_data;
-
- if (!IS_MESSAGE_LIST (input->ml)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No messagelist specified to regenerate");
- return;
- }
-
- gtk_object_ref (GTK_OBJECT (input->ml));
- e_table_model_pre_change (input->ml->table_model);
-}
-
-static void do_regenerate_messagelist (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- regenerate_messagelist_input_t *input = (regenerate_messagelist_input_t *) in_data;
- regenerate_messagelist_data_t *data = (regenerate_messagelist_data_t *) op_data;
-
- if (input->ml->search) {
- g_free (input->ml->search);
- input->ml->search = NULL;
- }
-
- if (input->ml->uid_rowmap) {
- g_hash_table_foreach (input->ml->uid_rowmap,
- free_key, NULL);
- g_hash_table_destroy (input->ml->uid_rowmap);
- }
- input->ml->uid_rowmap = g_hash_table_new (g_str_hash, g_str_equal);
-
- mail_tool_camel_lock_up();
-
- if (input->search) {
- data->uids = camel_folder_search_by_expression (input->ml->folder,
- input->search, ex);
- if (camel_exception_is_set (ex)) {
- mail_tool_camel_lock_down();
- return;
- }
-
- input->ml->search = g_strdup (input->search);
- } else
- data->uids = camel_folder_get_uids (input->ml->folder);
-
- mail_tool_camel_lock_down();
-}
-
-static void cleanup_regenerate_messagelist (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- regenerate_messagelist_input_t *input = (regenerate_messagelist_input_t *) in_data;
- regenerate_messagelist_data_t *data = (regenerate_messagelist_data_t *) op_data;
-
- ETreeModel *etm;
-
- etm = E_TREE_MODEL (input->ml->table_model);
-
- /* FIXME: free the old tree data */
-
- if (data->uids == NULL) { /*exception*/
- gtk_object_unref (GTK_OBJECT (input->ml));
- return;
- }
-
- if (mail_config_thread_list()) {
- mail_do_thread_messages (input->ml, data->uids,
- (gboolean) !(input->search),
- build_tree);
- } else {
- build_flat (input->ml, data->uids);
-
- if (input->search) {
- camel_folder_search_free (input->ml->folder, data->uids);
- } else {
- camel_folder_free_uids (input->ml->folder, data->uids);
- }
- }
-
- e_table_model_changed (input->ml->table_model);
- select_row (NULL, input->ml);
- g_free (input->search);
- gtk_object_unref (GTK_OBJECT (input->ml));
-}
-
-static const mail_operation_spec op_regenerate_messagelist =
-{
- describe_regenerate_messagelist,
- sizeof (regenerate_messagelist_data_t),
- setup_regenerate_messagelist,
- do_regenerate_messagelist,
- cleanup_regenerate_messagelist
-};
-
-void mail_do_regenerate_messagelist (MessageList *list, const gchar *search)
-{
- regenerate_messagelist_input_t *input;
-
- input = g_new (regenerate_messagelist_input_t, 1);
- input->ml = list;
- input->search = g_strdup (search);
-
- mail_operation_queue (&op_regenerate_messagelist, input, TRUE);
-}
diff --git a/mail/message-list.h b/mail/message-list.h
deleted file mode 100644
index 4f9719f30b..0000000000
--- a/mail/message-list.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _MESSAGE_LIST_H_
-#define _MESSAGE_LIST_H_
-
-#include <gnome.h>
-#include "mail-types.h"
-#include <bonobo/bonobo-main.h>
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-ui-handler.h>
-#include "e-table/e-table-scrolled.h"
-#include "e-table/e-table-simple.h"
-#include "e-table/e-tree-simple.h"
-#include "e-table/e-cell-text.h"
-#include "e-table/e-cell-toggle.h"
-#include "e-table/e-cell-checkbox.h"
-#include "e-table/e-cell-tree.h"
-#include "folder-browser.h"
-
-
-#define MESSAGE_LIST_TYPE (message_list_get_type ())
-#define MESSAGE_LIST(o) (GTK_CHECK_CAST ((o), MESSAGE_LIST_TYPE, MessageList))
-#define MESSAGE_LIST_CLASS(k) (GTK_CHECK_CLASS_CAST((k), MESSAGE_LIST_TYPE, MessageListClass))
-#define IS_MESSAGE_LIST(o) (GTK_CHECK_TYPE ((o), MESSAGE_LIST_TYPE))
-#define IS_MESSAGE_LIST_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), MESSAGE_LIST_TYPE))
-
-typedef struct _Renderer Renderer;
-
-
-enum {
- COL_ONLINE_STATUS,
- COL_MESSAGE_STATUS,
- COL_PRIORITY,
- COL_ATTACHMENT,
- COL_FROM,
- COL_SUBJECT,
- COL_SENT,
- COL_RECEIVED,
- COL_TO,
- COL_SIZE,
-
- COL_LAST,
-
- /* Invisible columns */
- COL_DELETED,
- COL_UNREAD,
- COL_COLOUR,
-};
-
-struct _MessageList {
- BonoboObject parent;
-
- /* the folder browser that contains the
- * this message list */
- FolderBrowser *parent_folder_browser;
-
- ETableModel *table_model;
- ETableHeader *header_model;
- ETableCol *table_cols [COL_LAST];
-
- ECell *render_text;
- ECell *render_date;
- ECell *render_online_status;
- ECell *render_message_status;
- ECell *render_priority;
- ECell *render_attachment;
- ECell *render_tree;
-
- ETreePath *tree_root; /* for tree view */
-
- GtkWidget *etable;
-
- CamelFolder *folder;
-
- GHashTable *uid_rowmap;
-
- char *search; /* search string */
-
- int cursor_row;
- const char *cursor_uid;
-
- /* row-selection and seen-marking timers */
- guint idle_id, seen_id;
-};
-
-typedef struct {
- BonoboObjectClass parent_class;
-} MessageListClass;
-
-typedef void (*MessageListForeachFunc) (MessageList *message_list,
- const char *uid,
- gpointer user_data);
-
-typedef enum {
- MESSAGE_LIST_SELECT_NEXT = 1,
- MESSAGE_LIST_SELECT_PREVIOUS = -1
-} MessageListSelectDirection;
-
-GtkType message_list_get_type (void);
-BonoboObject *message_list_new (FolderBrowser *parent_folder_browser);
-void message_list_set_folder (MessageList *message_list,
- CamelFolder *camel_folder);
-GtkWidget *message_list_get_widget (MessageList *message_list);
-
-void message_list_foreach (MessageList *message_list,
- MessageListForeachFunc callback,
- gpointer user_data);
-
-void message_list_select (MessageList *message_list,
- int base_row,
- MessageListSelectDirection direction,
- guint32 flags, guint32 mask);
-
-extern gboolean threaded_view;
-void message_list_toggle_threads (BonoboUIHandler *uih,
- void *user_data,
- const char *path);
-
-#endif /* _MESSAGE_LIST_H_ */
diff --git a/mail/message-thread.c b/mail/message-thread.c
deleted file mode 100644
index c8ed152e71..0000000000
--- a/mail/message-thread.c
+++ /dev/null
@@ -1,942 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.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
- */
-
-#include "camel/camel.h"
-#include <sys/types.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <glib.h>
-#include <ctype.h>
-
-#include "message-thread.h"
-#include "mail-tools.h"
-#include "mail-threads.h"
-
-#define d(x)
-/*#define LEAKDEBUG*/
-
-/* **************************************** */
-/* mem leak debug stuff */
-
-#ifdef LEAKDEBUG
-
-static GHashTable *allocedht = NULL;
-
-#define EXISTS (1 << 0)
-#define WALKED (1 << 1)
-#define FREED (1 << 2)
-#define AL_401 (1 << 3)
-#define AL_541 (1 << 4)
-#define AL_546 (1 << 5)
-#define AL_569 (1 << 6)
-#define LINKED (1 << 7)
-#define EXCUSED (1 << 8)
-
-#define GITP(x) GINT_TO_POINTER(x)
-#define GPTI(x) GPOINTER_TO_INT(x)
-
-static struct _container *
-alloc_container (int where)
-{
- struct _container *c;
-
- c = g_new0 (struct _container, 1);
-
- if (!allocedht)
- allocedht = g_hash_table_new (g_direct_hash, g_direct_equal);
-
- g_hash_table_insert (allocedht, c, GITP(EXISTS|where));
- return c;
-}
-
-static void
-free_container (struct _container **c)
-{
- gpointer flags;
-
- memset ((*c), 0, sizeof (struct _container));
- if ((flags = g_hash_table_lookup (allocedht, (*c))) == NULL)
- printf ("** threading mem debug: freeing unalloced entry %p?\n", (*c));
- g_hash_table_insert (allocedht, (*c), GITP(GPTI(flags)|FREED));
- g_free ((*c));
- (*c) = NULL;
-}
-
-static void
-cont_print (gpointer key, gpointer value, gpointer user)
-{
- struct _container *c = (struct _container *) key;
- char *line;
-
- if (GPTI(value) & FREED)
- return;
-
- if (GPTI(value) & AL_401)
- line = "401";
- else if (GPTI(value) & AL_541)
- line = "541";
- else if (GPTI(value) & AL_546)
- line = "546";
- else if (GPTI(value) & AL_569)
- line = "569";
- else
- line = "???";
-
- printf (" %p : %s %s %s %s %s",
- c,
- GPTI(value) & FREED ? "freed" : "unfrd",
- GPTI(value) & WALKED ? "walked" : "unwlkd",
- line,
- GPTI(value) & LINKED ? "linked" : "unlnkd",
- GPTI(value) & EXCUSED ? "excused" : "unexcsd");
-
- if ((GPTI(value) & FREED) == 0) {
- gpointer oth_flags;
-
- printf (" : %p %p %p : \"%s\" \"%s\" %d %d",
- c->next, c->parent, c->child,
- c->message ? c->message->subject : "(null message)",
- c->root_subject ? c->root_subject : "(null root-subject)",
- c->re, c->order);
-
- if (c->next) {
- oth_flags = g_hash_table_lookup (allocedht, c->next);
-
- printf ("\n next : %p : %s %s %s",
- c->next,
- GPTI(oth_flags) & WALKED ? "walked" : "unwlkd",
- GPTI(oth_flags) & LINKED ? "linked" : "unlnkd",
- GPTI(oth_flags) & EXCUSED ? "excused" : "unexcsd");
- }
-
- if (c->parent) {
- oth_flags = g_hash_table_lookup (allocedht, c->parent);
-
- printf ("\n prnt : %p : %s %s %s",
- c->parent,
- GPTI(oth_flags) & WALKED ? "walked" : "unwlkd",
- GPTI(oth_flags) & LINKED ? "linked" : "unlnkd",
- GPTI(oth_flags) & EXCUSED ? "excused" : "unexcsd");
- }
-
- if (c->child) {
- oth_flags = g_hash_table_lookup (allocedht, c->child);
-
- printf ("\n chld : %p : %s %s %s",
- c->child,
- GPTI(oth_flags) & WALKED ? "walked" : "unwlkd",
- GPTI(oth_flags) & LINKED ? "linked" : "unlnkd",
- GPTI(oth_flags) & EXCUSED ? "excused" : "unexcsd");
- }
-
- }
-
- printf ("\n");
-
-}
-
-static void
-make_excuses (gpointer key, gpointer value, gpointer user)
-{
- struct _container *c;
- gpointer chldflags;
- gpointer nextflags;
-
- if (GPTI(value) & FREED)
- return;
-
- c = (struct _container *) key;
-
- if (c->next) {
- nextflags = g_hash_table_lookup (allocedht, c->next);
-
- if ((GPTI(nextflags) & EXCUSED) == 0) {
- g_hash_table_insert (allocedht, c->next, GITP(GPTI(nextflags)|EXCUSED));
- ((gint *)user) = 1;
- }
- }
-
- if (c->child) {
- chldflags = g_hash_table_lookup (allocedht, c->child);
-
- if ((GPTI(chldflags) & EXCUSED) == 0) {
- g_hash_table_insert (allocedht, c->child, GITP(GPTI(chldflags)|EXCUSED));
- ((gint *)user) = 1;
- }
- }
-}
-
-static void
-print_containers (void)
-{
- gint hit;
-
- do {
- hit = 0;
- g_hash_table_foreach (allocedht, make_excuses, &hit);
- } while (hit);
-
- printf ("List of container stats:\n");
- g_hash_table_foreach (allocedht, cont_print, NULL);
- printf ("End of list.\n");
-}
-
-static void
-walk_containers (struct _container *head)
-{
- gpointer flags;
-
- while (head) {
- if (head->child)
- walk_containers (head->child);
- if ((flags = g_hash_table_lookup (allocedht, head)) == NULL) {
- printf ("*** walk_containers : bad pointer %p\n", head);
- } else {
- g_hash_table_insert (allocedht, head, GITP(GPTI(flags)|WALKED));
- }
-
- head = head->next;
- }
-}
-
-static void
-link_container (struct _container *c)
-{
- gpointer flags;
-
- if ((flags = g_hash_table_lookup (allocedht, c)) == NULL)
- printf ("** threading mem debug: linking unalloced entry %p?\n", c);
- g_hash_table_insert (allocedht, c, GITP(GPTI(flags)|LINKED));
-}
-
-#else
-#define alloc_container(w) (g_new0 (struct _container, 1))
-#define free_container(c) g_free (*(c))
-#define print_containers()
-#define walk_containers(c)
-#define link_container(c)
-#endif
-
-/* **************************************** */
-
-static struct _container *thread_messages(CamelFolder *folder, GPtrArray *uids);
-static void thread_messages_free(struct _container *);
-
-/* for debug only */
-int dump_tree(struct _container *c, int depth);
-
-static void
-container_add_child(struct _container *node, struct _container *child)
-{
- d(printf("\nAdding child %p to parent %p \n", child, node));
- child->next = node->child;
- node->child = child;
- child->parent = node;
-}
-
-#if 0
-static void
-container_unparent_child(struct _container *child)
-{
- struct _container *c, *node;
-
- /* are we unparented? */
- if (child->parent == NULL) {
- return;
- }
-
- /* else remove child from its existing parent, and reparent */
- node = child->parent;
- c = (struct _container *)&node->child;
- d(printf("scanning children:\n"));
- while (c->next) {
- d(printf(" %p\n", c));
- if (c->next==child) {
- d(printf("found node %p\n", child));
- c->next = c->next->next;
- child->parent = NULL;
- return;
- }
- c = c->next;
- }
-
- printf("DAMN, we shouldn't be here!\n");
-}
-#endif
-
-static void
-container_parent_child(struct _container *parent, struct _container *child)
-{
- struct _container *c, *node, **prev;
-
- /* are we already the right parent? */
- if (child->parent == parent)
- return;
-
- /* are we unparented? */
- if (child->parent == NULL) {
- container_add_child(parent, child);
- return;
- }
-
- /* check for trying to make my child my parent */
- for (c = parent; c; c = c->parent) {
- if (c == child) {
- d(printf("AIIE: trying to lop off hunk of nodes!\n"));
- return;
- }
- }
-
- /* else remove child from its existing parent, and reparent */
- node = child->parent;
-
- /* c = (struct _container *)&node->child;
- *d(printf("scanning children:\n"));
- *while (c->next) {
- * d(printf(" %p\n", c));
- * if (c->next==child) {
- * d(printf("found node %p\n", child));
- * c->next = c->next->next;
- * child->parent = NULL;
- * container_add_child(parent, child);
- * return;
- * }
- * c = c->next;
- *}
- */
-
- d(printf("PKGW deparent child"));
- c = node->child;
- prev = &(node->child);
- while (c) {
- d(printf (" %p\n", c));
-
- if (c == child) {
- d(printf (" hit child %p\n", child));
- (*prev) = c->next;
- c->next = NULL;
- c->parent = NULL;
- container_add_child (parent, child);
- return;
- }
-
- prev = &(c->next);
- c = c->next;
- }
-
- printf("DAMN, we shouldn't be here!\n");
-}
-
-static void
-prune_empty(struct _container **cp)
-{
- struct _container *child, *next, *c, *lastc;
-
- /* yes, this is intentional */
- lastc = (struct _container *)cp;
- while (lastc->next) {
- c = lastc->next;
-
- d(printf("checking message %p %p (%s)\n", c,
- c->message, c->message?c->message->message_id:"<empty>"));
- if (c->message == NULL) {
- if (c->child == NULL) {
- d(printf("removing empty node\n"));
- lastc->next = c->next;
- free_container (&c);
- continue;
- }
- if (c->parent || c->child->next==0) {
- d(printf("promoting child\n"));
- lastc->next = c->next; /* remove us */
- child = c->child;
- while (child) {
- next = child->next;
-
- child->parent = c->parent;
- child->next = lastc->next;
- lastc->next = child;
-
- child = next;
- }
- free_container (&c);
- continue;
- }
- }
- prune_empty(&c->child);
- lastc = c;
- }
-}
-
-static void
-hashloop(void *key, void *value, void *data)
-{
- struct _container *c = value;
- struct _container *tail = data;
-
- if (c->parent == NULL) {
- c->next = tail->next;
- tail->next = c;
- link_container(c);
- }
-}
-
-static char *
-get_root_subject(struct _container *c, int *re)
-{
- char *s, *p;
- struct _container *scan;
-
- s = NULL;
- *re = FALSE;
- if (c->message)
- s = c->message->subject;
- else {
- /* one of the children will always have a message */
- scan = c->child;
- while (scan) {
- if (scan->message) {
- s = scan->message->subject;
- break;
- }
- scan = scan->next;
- }
- }
- if (s != NULL) {
- while (*s) {
- while (isspace(*s))
- s++;
- if (s[0] == 0)
- break;
- if ((s[0] == 'r' || s[0]=='R')
- && (s[1] == 'e' || s[1]=='E')) {
- p = s+2;
- while (isdigit(*p) || (ispunct(*p) && (*p != ':')))
- p++;
- if (*p==':') {
- *re = TRUE;
- s = p+1;
- } else
- break;
- } else
- break;
- }
- if (*s)
- return s;
- }
- return NULL;
-}
-
-/* this is pretty slow, but not used often */
-static void
-remove_node(struct _container **list, struct _container *node, struct _container **clast)
-{
- struct _container *c;
-
- /* this is intentional, even if it looks funny */
- c = (struct _container *)list;
- while (c->next) {
- if (c->next == node) {
- if (clast && *clast == c->next)
- *clast = c;
- c->next = c->next->next;
- break;
- }
- c = c->next;
- }
-}
-
-static void
-group_root_set(struct _container **cp)
-{
- GHashTable *subject_table = g_hash_table_new(g_str_hash, g_str_equal);
- struct _container *c, *clast, *scan, *container;
-
- /* gather subject lines */
- d(printf("gathering subject lines\n"));
- clast = (struct _container *)cp;
- c = clast->next;
- while (c) {
- c->root_subject = get_root_subject(c, &c->re);
- if (c->root_subject) {
- container = g_hash_table_lookup(subject_table, c->root_subject);
- if (container == NULL
- || (container->message == NULL && c->message)
- || (container->re == TRUE && !c->re)) {
- g_hash_table_insert(subject_table, c->root_subject, c);
- }
- }
- c = c->next;
- }
-
- /* merge common subjects? */
- clast = (struct _container *)cp;
- while (clast->next) {
- c = clast->next;
- d(printf("checking %p %s\n", c, c->root_subject));
- if (c->root_subject
- && (container = g_hash_table_lookup(subject_table, c->root_subject))
- && (container != c)) {
- d(printf(" matching %p %s\n", container, container->root_subject));
- if (c->message == NULL && container->message == NULL) {
- d(printf("merge containers children\n"));
- /* steal the children from c onto container, and unlink c */
- scan = (struct _container *)&container->child;
- while (scan->next)
- scan = scan->next;
- scan->next = c->child;
- clast->next = c->next;
- continue;
- } if (c->message == NULL && container->message != NULL) {
- d(printf("container is non-empty parent\n"));
- remove_node(cp, container, &clast);
- container_add_child(c, container);
- } else if (c->message != NULL && container->message == NULL) {
- d(printf("container is empty child\n"));
- clast->next = c->next;
- container_add_child(container, c);
- continue;
- } else if (c->re && !container->re) {
- d(printf("container is re\n"));
- clast->next = c->next;
- container_add_child(container, c);
- continue;
- } else if (!c->re && container->re) {
- d(printf("container is not re\n"));
- remove_node(cp, container, &clast);
- container_add_child(c, container);
- } else if (c->re && container->re) {
- d(printf("subjects are common %p and %p\n", c, container));
-
- remove_node(cp, container, &clast);
- remove_node(cp, c, &clast);
-
- scan = alloc_container(AL_401);
- scan->root_subject = c->root_subject;
- scan->re = c->re && container->re;
- scan->next = c->next;
- clast->next = scan;
- container_add_child(scan, c);
- container_add_child(scan, container);
- clast = scan;
- g_hash_table_insert(subject_table, scan->root_subject, scan);
- continue;
- }
- }
- clast = c;
- }
- g_hash_table_destroy(subject_table);
-}
-
-int
-dump_tree(struct _container *c, int depth)
-{
- char *p;
- int count=0;
-
- p = alloca(depth*2+1);
- memset(p, ' ', depth*2);
- p[depth*2] = 0;
-
- while (c) {
- if (c->message) {
- printf("%s %p Subject: %s <%s>\n", p, c, c->message->subject, c->message->message_id);
- count += 1;
- } else {
- printf("%s %p <empty>\n", p, c);
- }
- if (c->child)
- count += dump_tree(c->child, depth+1);
- c = c->next;
- }
- return count;
-}
-
-static void thread_messages_free(struct _container *c)
-{
- struct _container *n;
-
- /* FIXME: ok, for some reason this doesn't work .. investigate later ... */
-
- while (c) {
- n = c->next;
- if (c->child)
- thread_messages_free(c->child); /* free's children first */
- free_container (&c);
- c = n;
- }
-}
-
-static int
-sort_node(const void *a, const void *b)
-{
- const struct _container *a1 = ((struct _container **)a)[0];
- const struct _container *b1 = ((struct _container **)b)[0];
-
- /* if we have no message, it must be a dummy node, which
- also means it must have a child, just use that as the
- sort data (close enough?) */
- if (a1->message == NULL)
- a1 = a1->child;
- if (b1->message == NULL)
- b1 = b1->child;
- if (a1->order == b1->order)
- return 0;
- if (a1->order < b1->order)
- return 1;
- else
- return -1;
-}
-
-static void
-sort_thread(struct _container **cp)
-{
- struct _container *c, *head, **carray;
- int size=0;
-
- c = *cp;
- while (c) {
- /* sort the children while we're at it */
- if (c->child)
- sort_thread(&c->child);
- size++;
- c = c->next;
- }
- if (size<2)
- return;
- carray = alloca(size*sizeof(struct _container *));
- c = *cp;
- size=0;
- while (c) {
- carray[size] = c;
- c = c->next;
- size++;
- }
- qsort(carray, size, sizeof(struct _container *), sort_node);
- size--;
- head = carray[size];
- head->next = NULL;
- size--;
- do {
- c = carray[size];
- c->next = head;
- head = c;
- size--;
- } while (size>=0);
- *cp = head;
-}
-
-static struct _container *
-thread_messages(CamelFolder *folder, GPtrArray *uids)
-{
- GHashTable *id_table, *no_id_table;
- int i;
- struct _container *c, *p, *child, *head, *container;
- struct _header_references *ref;
-
- id_table = g_hash_table_new(g_str_hash, g_str_equal);
- no_id_table = g_hash_table_new(NULL, NULL);
- for (i=0;i<uids->len;i++) {
- const CamelMessageInfo *mi;
- mail_tool_camel_lock_up ();
- mi = camel_folder_get_message_info (folder, uids->pdata[i]);
- mail_tool_camel_lock_down ();
-
- if (mi == NULL) {
- g_warning("Folder doesn't contain uid %s", (char *)uids->pdata[i]);
- continue;
- }
-
- if (mi->message_id) {
- d(printf("doing : %s\n", mi->message_id));
- c = g_hash_table_lookup(id_table, mi->message_id);
- if (!c) {
- c = alloc_container(AL_541);
- g_hash_table_insert(id_table, mi->message_id, c);
- }
- } else {
- d(printf("doing : (no message id)\n"));
- c = alloc_container(AL_546);
- g_hash_table_insert(no_id_table, (void *)mi, c);
- }
-
- c->message = mi;
- c->order = i;
- container = c;
- ref = mi->references;
- p = NULL;
- child = container;
- head = NULL;
- d(printf("references:\n"));
- while (ref) {
- if (ref->id == NULL) {
- printf("ref missing id!?\n");
- ref = ref->next;
- continue;
- }
-
- d(printf("looking up reference: %s\n", ref->id));
- c = g_hash_table_lookup(id_table, ref->id);
- if (c == NULL) {
- d(printf("not found\n"));
- c = alloc_container(AL_569);
- g_hash_table_insert(id_table, ref->id, c);
- }
- if (c!=child)
- container_parent_child(c, child);
- child = c;
- if (head == NULL)
- head = c;
- ref = ref->next;
- }
- }
-
- d(printf("\n\n"));
- /* build a list of root messages (no parent) */
- head = NULL;
- g_hash_table_foreach(id_table, hashloop, &head);
- g_hash_table_foreach(no_id_table, hashloop, &head);
-
- g_hash_table_destroy(id_table);
- g_hash_table_destroy(no_id_table);
-
- /* remove empty parent nodes */
- prune_empty(&head);
-
- /* find any siblings which missed out */
- group_root_set(&head);
-
-#if 0
- printf("finished\n");
- i = dump_tree(head, 0);
- printf("%d count, %d items in tree\n", uids->len, i);
-#endif
-
- sort_thread(&head);
- return head;
-}
-
-/* ** THREAD MESSAGES ***************************************************** */
-
-typedef struct thread_messages_input_s {
- MessageList *ml;
- GPtrArray *uids;
- gboolean use_camel_uidfree;
- void (*build) (MessageList *, struct _container *);
-} thread_messages_input_t;
-
-typedef struct thread_messages_data_s {
- struct _container *container;
-} thread_messages_data_t;
-
-static gchar *describe_thread_messages (gpointer in_data, gboolean gerund);
-static void setup_thread_messages (gpointer in_data, gpointer op_data, CamelException *ex);
-static void do_thread_messages (gpointer in_data, gpointer op_data, CamelException *ex);
-static void cleanup_thread_messages (gpointer in_data, gpointer op_data, CamelException *ex);
-
-static gchar *describe_thread_messages (gpointer in_data, gboolean gerund)
-{
- if (gerund)
- return g_strdup ("Threading message list");
- else
- return g_strdup ("Thread message list");
-}
-
-static void setup_thread_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- thread_messages_input_t *input = (thread_messages_input_t *) in_data;
-
- if (!IS_MESSAGE_LIST (input->ml)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No messagelist to thread was provided to thread_messages");
- return;
- }
-
- if (!input->uids) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No uids were provided to thread_messages");
- return;
- }
-
- if (!input->build) {
- camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
- "No build callback provided to thread_messages");
- return;
- }
-
- gtk_object_ref (GTK_OBJECT (input->ml));
-}
-
-static void do_thread_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- thread_messages_input_t *input = (thread_messages_input_t *) in_data;
- thread_messages_data_t *data = (thread_messages_data_t *) op_data;
-
- data->container = thread_messages (input->ml->folder, input->uids);
-}
-
-static void cleanup_thread_messages (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- thread_messages_input_t *input = (thread_messages_input_t *) in_data;
- thread_messages_data_t *data = (thread_messages_data_t *) op_data;
-
- (input->build) (input->ml, data->container);
- walk_containers (data->container);
- thread_messages_free (data->container);
-
- print_containers();
-
- if (input->use_camel_uidfree) {
- mail_tool_camel_lock_up ();
- camel_folder_free_uids (input->ml->folder, input->uids);
- mail_tool_camel_lock_down ();
- } else {
- g_ptr_array_add (input->uids, NULL);
- g_strfreev ((char **)input->uids->pdata);
- g_ptr_array_free (input->uids, FALSE);
- }
-
- gtk_object_unref (GTK_OBJECT (input->ml));
-}
-
-static const mail_operation_spec op_thread_messages =
-{
- describe_thread_messages,
- sizeof (thread_messages_data_t),
- setup_thread_messages,
- do_thread_messages,
- cleanup_thread_messages
-};
-
-void mail_do_thread_messages (MessageList *ml, GPtrArray *uids,
- gboolean use_camel_uidfree,
- void (*build) (MessageList *,
- struct _container *))
-{
- thread_messages_input_t *input;
-
- input = g_new (thread_messages_input_t, 1);
- input->ml = ml;
- input->uids = uids;
- input->use_camel_uidfree = use_camel_uidfree;
- input->build = build;
-
- mail_operation_queue (&op_thread_messages, input, TRUE);
-}
-
-/* ************************************************************************ */
-
-#ifdef STANDALONE
-
-static char *
-auth_callback(char *prompt, gboolean secret,
- CamelService *service, char *item,
- CamelException *ex)
-{
- printf ("auth_callback called: %s\n", prompt);
- return NULL;
-}
-
-int
-main (int argc, char**argv)
-{
- CamelSession *session;
- CamelException *ex;
- CamelStore *store;
- gchar *store_url = "mbox:///home/notzed/evolution/local/Inbox";
- CamelFolder *folder;
- CamelMimeMessage *message;
- GList *uid_list;
- GPtrArray *summary;
-
- gtk_init (&argc, &argv);
- camel_init ();
- ex = camel_exception_new ();
-
- session = camel_session_new (auth_callback);
- store = camel_session_get_store (session, store_url, ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_session_get_store\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- folder = camel_store_get_folder (store, "mbox", TRUE, ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_store_get_folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
-#if 0
- camel_folder_open (folder, FOLDER_OPEN_RW, ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught when trying to open the folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-#endif
-
- summary = camel_folder_get_summary(folder);
- thread_messages((CamelMessageInfo **)summary->pdata, summary->len);
-
- return 0;
-}
-
-#endif
-
-/*
-
- msgid: d
- references: a b c
-
- msgid: f
- references: c d
-
- msgid: e
- references: c
-
- a
- \
- b
- \
- c
- \
- d
- |\
- e f
- */
-/*
- lookup d
- create new node d
- child = d
- loop on c b a
- lookup node?
- if no node, create node
- add child to node
- child = node
- endloop
-
- */
diff --git a/mail/message-thread.h b/mail/message-thread.h
deleted file mode 100644
index 5c4be91ade..0000000000
--- a/mail/message-thread.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef _MESSAGE_THREAD_H
-#define _MESSAGE_THREAD_H
-
-#include <gnome.h>
-#include "message-list.h"
-
-struct _container {
- struct _container *next,
- *parent,
- *child;
- const CamelMessageInfo *message;
- char *root_subject; /* cached root equivalent subject */
- int re; /* re version of subject? */
- int order; /* the order of this message in the folder */
-};
-
-void mail_do_thread_messages (MessageList *ml, GPtrArray *uids,
- gboolean use_camel_uidfree,
- void (*build) (MessageList *,
- struct _container *));
-
-#endif /* !_MESSAGE_THREAD_H */
-
diff --git a/mail/session.c b/mail/session.c
deleted file mode 100644
index b76e096abb..0000000000
--- a/mail/session.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * session.c: handles the session information and resource manipulation
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 2000 Helix Code, Inc. http://www.helixcode.com
- */
-#include <config.h>
-#include <gnome.h>
-#include "mail.h"
-#include "mail-threads.h"
-
-CamelSession *session;
-GHashTable *passwords;
-
-static void
-request_callback (gchar *string, gpointer data)
-{
- char **ans = data;
-
- if (string)
- *ans = g_strdup(string);
- else
- *ans = NULL;
-}
-
-char *
-mail_request_dialog (const char *prompt, gboolean secret, const char *key,
- gboolean async)
-{
- GtkWidget *dialog;
-
- char *ans;
-
- if (!passwords)
- passwords = g_hash_table_new (g_str_hash, g_str_equal);
-
- ans = g_hash_table_lookup (passwords, key);
- if (ans)
- return g_strdup (ans);
-
- if (!async) {
- dialog = gnome_request_dialog (secret, prompt, NULL, 0,
- request_callback, &ans, NULL);
- if (!dialog)
- return NULL;
- GDK_THREADS_ENTER ();
- if (gnome_dialog_run_and_close (GNOME_DIALOG (dialog)) == -1 ||
- ans == NULL) {
- GDK_THREADS_LEAVE ();
- return NULL;
- }
-
- GDK_THREADS_LEAVE ();
- } else {
- if (!mail_op_get_password ((char *) prompt, secret, &ans))
- return NULL;
- }
-
- g_hash_table_insert (passwords, g_strdup (key), g_strdup (ans));
- return ans;
-}
-
-static char *
-auth_callback (CamelAuthCallbackMode mode, char *data, gboolean secret,
- CamelService *service, char *item, CamelException *ex)
-{
- char *key, *ans, *url;
-
- if (!passwords)
- passwords = g_hash_table_new (g_str_hash, g_str_equal);
-
- url = camel_url_to_string (service->url, FALSE);
- key = g_strdup_printf ("%s:%s", url, item);
- g_free (url);
-
- if (mode == CAMEL_AUTHENTICATOR_TELL) {
- if (!data) {
- g_hash_table_remove (passwords, key);
- g_free (key);
- } else {
- gpointer old_key, old_data;
-
- if (g_hash_table_lookup_extended (passwords, key,
- &old_key,
- &old_data)) {
- g_hash_table_insert (passwords, old_key, data);
- g_free (old_data);
- g_free (key);
- } else
- g_hash_table_insert (passwords, key, data);
- }
-
- return NULL;
- }
-
- ans = mail_request_dialog (data, secret, key, TRUE);
- g_free (key);
-
- if (!ans) {
- camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL,
- "User canceled operation.");
- }
-
- return ans;
-}
-
-/* ******************** */
-
-typedef struct _timeout_data_s {
- CamelTimeoutCallback cb;
- gpointer camel_data;
- gboolean result;
-} timeout_data_t;
-
-static gchar *
-describe_camel_timeout (gpointer in_data, gboolean gerund)
-{
- /* FIXME this is so wrong */
-
- if (gerund)
- return g_strdup ("Keeping connection alive");
- else
- return g_strdup ("Keep connection alive");
-}
-
-static void
-noop_camel_timeout (gpointer in_data, gpointer op_data, CamelException *ex)
-{
-}
-
-static void
-do_camel_timeout (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- timeout_data_t *td = (timeout_data_t *) in_data;
-
- td->result = (td->cb) (td->camel_data);
-}
-
-static const mail_operation_spec spec_camel_timeout =
-{
- describe_camel_timeout,
- 0,
- noop_camel_timeout,
- do_camel_timeout,
- noop_camel_timeout
-};
-
-static gboolean
-camel_timeout (gpointer data)
-{
- timeout_data_t *td = (timeout_data_t *) data;
-
- if (td->result == FALSE) {
- g_free (td);
- return FALSE;
- }
-
- mail_operation_queue (&spec_camel_timeout, td, FALSE);
- return TRUE;
-}
-
-static guint
-register_callback (guint32 interval, CamelTimeoutCallback cb, gpointer camel_data)
-{
- timeout_data_t *td;
-
- /* We do this because otherwise the timeout can get called
- * more often than the dispatch thread can get rid of it,
- * leading to timeout calls piling up, and we don't have a
- * good way to watch the return values. It's not cool.
- */
- g_return_val_if_fail (interval > 1000, 0);
-
- td = g_new (timeout_data_t, 1);
- td->result = TRUE;
- td->cb = cb;
- td->camel_data = camel_data;
-
- return gtk_timeout_add_full (interval, camel_timeout, NULL,
- td, g_free);
-}
-
-static gboolean
-remove_callback (guint handle)
-{
- gtk_timeout_remove (handle);
- return TRUE;
-}
-
-/* ******************** */
-
-void
-session_init (void)
-{
- camel_init ();
- session = camel_session_new (auth_callback, register_callback,
- remove_callback);
-}
-
-static gboolean
-free_entry (gpointer key, gpointer value, gpointer user_data)
-{
- g_free (key);
- memset (value, 0, strlen (value));
- g_free (value);
- return TRUE;
-}
-
-void
-forget_passwords (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- g_hash_table_foreach_remove (passwords, free_entry, NULL);
-}
diff --git a/mail/test-mail.c b/mail/test-mail.c
deleted file mode 100644
index ecf8c5eda5..0000000000
--- a/mail/test-mail.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Tests the mail summary display bonobo component
- *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- *
- * (C) 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-
-#include <gnome.h>
-#include <bonobo.h>
-#include <liboaf/liboaf.h>
-
-static guint
-create_container (void)
-{
- GtkWidget *window, *control;
- BonoboUIHandler *uih;
-
- gdk_rgb_init ();
-
- gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
- gtk_widget_set_default_visual (gdk_rgb_get_visual ());
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_widget_set_usize (GTK_WIDGET (window), 640, 480);
- gtk_widget_show (GTK_WIDGET (window));
-
- uih = bonobo_ui_handler_new ();
-
- control = bonobo_widget_new_control ("OAFIID:control:evolution-mail:833d5a71-a201-4a0e-b7e6-5475c5c4cb45",
- bonobo_object_corba_objref (BONOBO_OBJECT (uih)));
-
- if (control == NULL){
- printf ("Could not launch mail control\n");
- exit (1);
- }
- gtk_container_add (GTK_CONTAINER (window), control);
-
- gtk_widget_show (window);
- gtk_widget_show (control);
-
-
- return FALSE;
-}
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("sample-control-container", "1.0", argc, argv);
- oaf_init (argc, argv);
-
- if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
- g_error ("Could not initialize Bonobo\n");
-
- gtk_idle_add ((GtkFunction) create_container, NULL);
-
- /*
- * Main loop
- */
- bonobo_main ();
-
- return 0;
-}
-
-
-
-
-
diff --git a/mail/test-thread.c b/mail/test-thread.c
deleted file mode 100644
index eddf9dd7c8..0000000000
--- a/mail/test-thread.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/* Tests the multithreaded UI code */
-
-#include "config.h"
-#include <unistd.h>
-#include <glib.h>
-#include <gtk/gtk.h>
-#include <libgnomeui/libgnomeui.h>
-#include <stdio.h>
-#include "mail-threads.h"
-
-static gchar *desc_1 (gpointer in, gboolean gerund);
-static void op_1( gpointer in, gpointer op, CamelException *ex );
-static gchar *desc_2 (gpointer in, gboolean gerund);
-static void op_2( gpointer in, gpointer op, CamelException *ex );
-static gchar *desc_3 (gpointer in, gboolean gerund);
-static void op_3( gpointer in, gpointer op, CamelException *ex );
-static gchar *desc_4 (gpointer in, gboolean gerund);
-static void op_4( gpointer in, gpointer op, CamelException *ex );
-static gchar *desc_5 (gpointer in, gboolean gerund);
-static void op_5( gpointer in, gpointer op, CamelException *ex );
-static gchar *desc_6 (gpointer in, gboolean gerund);
-static gchar *desc_7 (gpointer in, gboolean gerund);
-static gchar *desc_8 (gpointer in, gboolean gerund);
-static void done( gpointer in, gpointer op, CamelException *ex );
-static void exception( gpointer in, gpointer op, CamelException *ex );
-static gboolean queue_ops( void );
-
-const mail_operation_spec spec1 = { desc_1, 0, NULL, op_1, done };
-const mail_operation_spec spec2 = { desc_2, 0, NULL, op_2, done };
-const mail_operation_spec spec3 = { desc_3, 0, NULL, op_3, done };
-const mail_operation_spec spec4 = { desc_4, 0, NULL, op_4, NULL };
-const mail_operation_spec spec5 = { desc_5, 0, NULL, op_5, done };
-const mail_operation_spec spec6 = { desc_6, 0, exception, op_4, NULL };
-const mail_operation_spec spec7 = { desc_7, 0, NULL, exception, NULL };
-const mail_operation_spec spec8 = { desc_8, 0, NULL, op_4, exception };
-
-static gboolean queue_ops( void )
-{
- int i;
-
- g_message( "Top of queue_ops" );
-
- mail_operation_queue( &spec1, "op1 finished", FALSE );
- mail_operation_queue( &spec2, "op2 finished", FALSE );
- mail_operation_queue( &spec3, "op3 finished", FALSE );
-
- for( i = 0; i < 3; i++ ) {
- mail_operation_queue( &spec4, GINT_TO_POINTER( i ), FALSE );
- }
-
- g_message( "Waiting for finish..." );
- mail_operation_wait_for_finish();
-
- g_message( "Ops done -- queue some more!" );
-
- mail_operation_queue( &spec1, "done a second time", FALSE );
-
- g_message( "Waiting for finish again..." );
- mail_operation_wait_for_finish();
-
- g_message( "Ops done -- more, more!" );
-
- mail_operation_queue( &spec5, "passwords stolen", FALSE );
-
- for( i = 0; i < 3; i++ ) {
- mail_operation_queue( &spec4, GINT_TO_POINTER( i ), FALSE );
- }
-
- mail_operation_queue( &spec6, NULL, FALSE );
- mail_operation_queue( &spec7, NULL, FALSE );
- mail_operation_queue( &spec8, NULL, FALSE );
-
- g_message( "Waiting for finish for the last time..." );
- mail_operations_terminate();
- g_message( "Ops done again. Exiting 0" );
- gtk_exit( 0 );
- return FALSE;
-}
-
-static void exception( gpointer in, gpointer op, CamelException *ex )
-{
- camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, "I don't feel like it.");
-}
-
-static void op_1( gpointer in, gpointer op, CamelException *ex )
-{
- gfloat pct;
-
- mail_op_show_progressbar();
- mail_op_set_message( "Watch the progress bar!" );
-
- for( pct = 0.0; pct < 1.0; pct += 0.2 ) {
- sleep( 1 );
- mail_op_set_percentage( pct );
- }
-}
-
-static void op_2( gpointer in, gpointer op, CamelException *ex )
-{
- int i;
-
- mail_op_hide_progressbar();
- for( i = 5; i > 0; i-- ) {
- mail_op_set_message( "%d", i );
- sleep( 1 );
- }
-
- mail_op_set_message( "BOOOM!" );
- sleep( 1 );
-}
-
-static void op_3( gpointer in, gpointer op, CamelException *ex )
-{
- gfloat pct;
-
- mail_op_show_progressbar();
- mail_op_set_message( "Frobulating the foosamatic" );
-
- for( pct = 0.0; pct < 0.3; pct += 0.1 ) {
- mail_op_set_percentage( pct );
- sleep( 1 );
- }
-
- mail_op_error( "Oh no! The foosamatic was booby-trapped!" );
- sleep( 1 );
-}
-
-static void op_4( gpointer in, gpointer op, CamelException *ex )
-{
- mail_op_hide_progressbar();
- mail_op_set_message( "Filler # %d", GPOINTER_TO_INT( in ) );
- sleep( 1 );
-}
-
-static void op_5( gpointer in, gpointer op, CamelException *ex )
-{
- gchar *pass;
- gboolean ret;
-
- mail_op_show_progressbar();
- mail_op_set_percentage( 0.5 );
-
- ret = mail_op_get_password( "What is your super-secret password?", TRUE, &pass );
-
- if( ret == FALSE )
- mail_op_set_message( "Oh no, you cancelled! : %s", pass );
- else
- mail_op_set_message( "\"%s\", you said?", pass );
-
- sleep( 1 );
-}
-
-static void done( gpointer in, gpointer op, CamelException *ex )
-{
- g_message( "Operation done: %s", (gchar *) in );
-}
-
-static gchar *desc_1 (gpointer in, gboolean gerund)
-{
- if (gerund)
- return g_strdup ("Showing the Crawling Progress Bar of Doom");
- else
- return g_strdup ("Progress Bar");
-}
-
-static gchar *desc_2 (gpointer in, gboolean gerund)
-{
- if (gerund)
- return g_strdup ("Exploring the Mysterious Message Setter");
- else
- return g_strdup ("Explore");
-}
-
-static gchar *desc_3 (gpointer in, gboolean gerund)
-{
- if (gerund)
- return g_strdup ("Dare the Error Dialog of No Return");
- else
- return g_strdup ("Dare");
-}
-
-static gchar *desc_4 (gpointer in, gboolean gerund)
-{
- if (gerund)
- return g_strdup_printf ("Filling Queue Space -- %d", GPOINTER_TO_INT (in));
- else
- return g_strdup_printf ("Filler -- %d", GPOINTER_TO_INT (in));
-}
-
-static gchar *desc_5 (gpointer in, gboolean gerund)
-{
- if (gerund)
- return g_strdup ("Stealing your Password");
- else
- return g_strdup ("The Dastardly Password Stealer");
-}
-
-static gchar *desc_6 (gpointer in, gboolean gerund)
-{
- if (gerund)
- return g_strdup ("Setting exception on setup");
- else
- return g_strdup ("Exception on setup");
-}
-
-static gchar *desc_7 (gpointer in, gboolean gerund)
-{
- if (gerund)
- return g_strdup ("Setting exception in process");
- else
- return g_strdup ("Exception coming soon");
-}
-
-static gchar *desc_8 (gpointer in, gboolean gerund)
-{
- if (gerund)
- return g_strdup ("Setting exception in cleanup");
- else
- return g_strdup ("Exception in cleanup");
-}
-
-
-int main( int argc, char **argv )
-{
- g_thread_init( NULL );
- gnome_init( "test-thread", "0.0", argc, argv );
- gtk_idle_add( (GtkFunction) queue_ops, NULL );
- gtk_main();
- return 0;
-}
diff --git a/notes/.cvsignore b/notes/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/notes/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/notes/GNOME_Evolution_Notes.oaf.in b/notes/GNOME_Evolution_Notes.oaf.in
deleted file mode 100644
index 704b4028d8..0000000000
--- a/notes/GNOME_Evolution_Notes.oaf.in
+++ /dev/null
@@ -1,54 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:evolution-notes:e2471f2d-0589-4861-a25d-c21818f531d5"
- type="exe"
- location="evolution-notes">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Notes control"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:evolution-notes:8e3fb723-aada-4112-99db-d51779e35a2a"
- type="factory"
- location="OAFIID:control-factory:evolution-notes:e2471f2d-0589-4861-a25d-c21818f531d5">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="A sample Bonobo control which displays an addressbook."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-notes:f2f0f57f-27d9-4498-b54b-248f223ee772"
- type="exe"
- location="evolution-notes">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution notes component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-notes:92d95b91-3655-4746-ac68-01b21e2c5e44"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-notes:f2f0f57f-27d9-4498-b54b-248f223ee772">
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling mail."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/notes/GNOME_Evolution_Notes.oafinfo b/notes/GNOME_Evolution_Notes.oafinfo
deleted file mode 100644
index 704b4028d8..0000000000
--- a/notes/GNOME_Evolution_Notes.oafinfo
+++ /dev/null
@@ -1,54 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:evolution-notes:e2471f2d-0589-4861-a25d-c21818f531d5"
- type="exe"
- location="evolution-notes">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Notes control"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:evolution-notes:8e3fb723-aada-4112-99db-d51779e35a2a"
- type="factory"
- location="OAFIID:control-factory:evolution-notes:e2471f2d-0589-4861-a25d-c21818f531d5">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="A sample Bonobo control which displays an addressbook."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-notes:f2f0f57f-27d9-4498-b54b-248f223ee772"
- type="exe"
- location="evolution-notes">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution notes component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-notes:92d95b91-3655-4746-ac68-01b21e2c5e44"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-notes:f2f0f57f-27d9-4498-b54b-248f223ee772">
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling mail."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/notes/Makefile.am b/notes/Makefile.am
deleted file mode 100644
index 388e19152a..0000000000
--- a/notes/Makefile.am
+++ /dev/null
@@ -1,46 +0,0 @@
-bin_PROGRAMS = evolution-notes
-
-noinst_PROGRAMS = notes-test
-
-INCLUDES = \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir)/widgets/e-text \
- $(BONOBO_HTML_GNOME_CFLAGS) \
- -DEVOLUTION_VERSION=\""$(VERSION)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \
- -DEVOLUTION_LOCALEDIR=\""$(datadir)/locale"\" \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DG_LOG_DOMAIN=\"evolution-notes\"
-
-evolution_notes_SOURCES = \
- component-factory.c \
- main.c \
- notes.c
-
-notes_test_SOURCES = \
- e-bevel-button.c \
- e-bevel-button.h \
- e-bevel-button-util.c \
- e-bevel-button-util.h \
- e-note.c \
- e-note.h \
- test-notes.c
-
-OAF_FILES = evolution-notes.oafinfo
-
-if USING_OAF
-oafdir = $(datadir)/oaf
-oaf_DATA = $(OAF_FILES)
-endif
-
-notes_test_LDADD = \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/e-util/libeutil.la \
- $(BONOBO_HTML_GNOME_LIBS)
-
-evolution_notes_LDADD = \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/shell/libeshell.a \
- $(BONOBO_HTML_GNOME_LIBS)
diff --git a/notes/component-factory.c b/notes/component-factory.c
deleted file mode 100644
index 3f8176cc9c..0000000000
--- a/notes/component-factory.c
+++ /dev/null
@@ -1,151 +0,0 @@
-#include <config.h>
-
-#include <gnome.h>
-#include <bonobo.h>
-
-#include "Evolution.h"
-#include "evolution-storage.h"
-
-#include "evolution-shell-component.h"
-
-#include "e-util/e-gui-utils.h"
-
-#define COMPONENT_FACTORY_ID "OAFIID:evolution-shell-component-factory:evolution-notes:f2f0f57f-27d9-4498-b54b-248f223ee772"
-
-static const EvolutionShellComponentFolderType folder_types[] = {
- { "notes", "evolution-notes.png" },
- { NULL, NULL }
-};
-
-static void
-new_note_cb (BonoboUIHandler *uih, void *user_data, const char *path)
-{
- g_print ("new note!\n");
-}
-
-static GnomeUIInfo gnome_toolbar [] = {
- GNOMEUIINFO_ITEM_STOCK (N_("New"), N_("Create a new note"), new_note_cb, GNOME_STOCK_PIXMAP_NEW),
- GNOMEUIINFO_END
-};
-
-static void
-control_deactivate (BonoboControl *control, BonoboUIHandler *uih)
-{
- bonobo_ui_handler_dock_remove (uih, "/Toolbar");
-}
-
-static void
-control_activate (BonoboControl *control, BonoboUIHandler *uih)
-{
- Bonobo_UIHandler remote_uih;
- GtkWidget *toolbar, *toolbar_frame;
- BonoboControl *toolbar_control ;
-
- remote_uih = bonobo_control_get_remote_ui_handler (control);
- bonobo_ui_handler_set_container (uih, remote_uih);
- bonobo_object_release_unref (remote_uih, NULL);
-
- toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL,
- GTK_TOOLBAR_BOTH);
-
- gnome_app_fill_toolbar_with_data (GTK_TOOLBAR (toolbar),
- gnome_toolbar,
- NULL, NULL);
-
- toolbar_frame = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (GTK_FRAME (toolbar_frame), GTK_SHADOW_OUT);
- gtk_container_add (GTK_CONTAINER (toolbar_frame), toolbar);
- gtk_widget_show (toolbar_frame);
-
- gtk_widget_show_all (toolbar_frame);
-
- toolbar_control = bonobo_control_new (toolbar_frame);
- bonobo_ui_handler_dock_add (
- uih, "/Toolbar",
- bonobo_object_corba_objref (BONOBO_OBJECT (toolbar_control)),
- GNOME_DOCK_ITEM_BEH_EXCLUSIVE,
- GNOME_DOCK_TOP,
- 1, 1, 0);
-}
-
-
-static void
-control_activate_cb (BonoboControl *control,
- gboolean activate)
-{
- BonoboUIHandler *uih;
-
- uih = bonobo_control_get_ui_handler (control);
- g_assert (uih);
-
- if (activate)
- control_activate (control, uih);
- else
- control_deactivate (control, uih);
-}
-
-
-static BonoboControl *
-create_view (EvolutionShellComponent *shell_component,
- const char *physical_uri,
- void *closure)
-{
- BonoboControl * control;
-
- control = notes_factory_new_control ();
-
- gtk_signal_connect (GTK_OBJECT (control), "activate",
- control_activate_cb, NULL);
-
-
- return control;
-}
-
-static void
-owner_set_cb (EvolutionShellComponent *shell_component,
- EvolutionShellClient shell_client,
- gpointer user_data)
-{
- g_print ("evolution-notes: Yeeeh! We have an owner!\n"); /* FIXME */
-}
-
-static void
-owner_unset_cb (EvolutionShellComponent *shell_component, gpointer user_data)
-{
- g_print ("No owner anymore\n");
-}
-
-/* The factory function */
-static BonoboObject *
-notes_component_factory (BonoboGenericFactory *factory,
- void *closure)
-{
- EvolutionShellComponent *shell_component;
-
- shell_component = evolution_shell_component_new (folder_types, create_view, NULL);
-
- gtk_signal_connect (GTK_OBJECT (shell_component), "owner_set",
- GTK_SIGNAL_FUNC (owner_set_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (shell_component), "owner_unset",
- GTK_SIGNAL_FUNC (owner_unset_cb), NULL);
-
- return BONOBO_OBJECT (shell_component);
-}
-
-
-void
-component_factory_init (void)
-{
- static BonoboGenericFactory *factory = NULL;
-
- if (factory != NULL)
- return;
-
- factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, notes_component_factory, NULL);
-
- if (factory == NULL) {
- e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
- _("Cannot initialize Evolution's notes component."));
- exit (1);
- }
-}
diff --git a/notes/component-factory.h b/notes/component-factory.h
deleted file mode 100644
index 9535ccc4ae..0000000000
--- a/notes/component-factory.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-#ifndef COMPONENT_FACTORY_H
-#define COMPONENT_FACTORY_H
-
-void component_factory_init (void);
-
-#endif
diff --git a/notes/e-bevel-button-util.c b/notes/e-bevel-button-util.c
deleted file mode 100644
index cfa01f71a2..0000000000
--- a/notes/e-bevel-button-util.c
+++ /dev/null
@@ -1,189 +0,0 @@
-#include <gtk/gtk.h>
-#include "e-bevel-button-util.h"
-
-static void rgb_to_hls (gdouble *r, gdouble *g, gdouble *b);
-static void hls_to_rgb (gdouble *h, gdouble *l, gdouble *s);
-
-void
-e_bevel_button_util_shade (GdkColor *a,
- GdkColor *b,
- gdouble k)
-{
- gdouble red;
- gdouble green;
- gdouble blue;
-
- red = (gdouble) a->red / 65535.0;
- green = (gdouble) a->green / 65535.0;
- blue = (gdouble) a->blue / 65535.0;
-
- rgb_to_hls (&red, &green, &blue);
-
- green *= k;
- if (green > 1.0)
- green = 1.0;
- else if (green < 0.0)
- green = 0.0;
-
- blue *= k;
- if (blue > 1.0)
- blue = 1.0;
- else if (blue < 0.0)
- blue = 0.0;
-
- hls_to_rgb (&red, &green, &blue);
-
- b->red = red * 65535.0;
- b->green = green * 65535.0;
- b->blue = blue * 65535.0;
-}
-
-static void
-rgb_to_hls (gdouble *r,
- gdouble *g,
- gdouble *b)
-{
- gdouble min;
- gdouble max;
- gdouble red;
- gdouble green;
- gdouble blue;
- gdouble h, l, s;
- gdouble delta;
-
- red = *r;
- green = *g;
- blue = *b;
-
- if (red > green)
- {
- if (red > blue)
- max = red;
- else
- max = blue;
-
- if (green < blue)
- min = green;
- else
- min = blue;
- }
- else
- {
- if (green > blue)
- max = green;
- else
- max = blue;
-
- if (red < blue)
- min = red;
- else
- min = blue;
- }
-
- l = (max + min) / 2;
- s = 0;
- h = 0;
-
- if (max != min)
- {
- if (l <= 0.5)
- s = (max - min) / (max + min);
- else
- s = (max - min) / (2 - max - min);
-
- delta = max -min;
- if (red == max)
- h = (green - blue) / delta;
- else if (green == max)
- h = 2 + (blue - red) / delta;
- else if (blue == max)
- h = 4 + (red - green) / delta;
-
- h *= 60;
- if (h < 0.0)
- h += 360;
- }
-
- *r = h;
- *g = l;
- *b = s;
-}
-
-static void
-hls_to_rgb (gdouble *h,
- gdouble *l,
- gdouble *s)
-{
- gdouble hue;
- gdouble lightness;
- gdouble saturation;
- gdouble m1, m2;
- gdouble r, g, b;
-
- lightness = *l;
- saturation = *s;
-
- if (lightness <= 0.5)
- m2 = lightness * (1 + saturation);
- else
- m2 = lightness + saturation - lightness * saturation;
- m1 = 2 * lightness - m2;
-
- if (saturation == 0)
- {
- *h = lightness;
- *l = lightness;
- *s = lightness;
- }
- else
- {
- hue = *h + 120;
- while (hue > 360)
- hue -= 360;
- while (hue < 0)
- hue += 360;
-
- if (hue < 60)
- r = m1 + (m2 - m1) * hue / 60;
- else if (hue < 180)
- r = m2;
- else if (hue < 240)
- r = m1 + (m2 - m1) * (240 - hue) / 60;
- else
- r = m1;
-
- hue = *h;
- while (hue > 360)
- hue -= 360;
- while (hue < 0)
- hue += 360;
-
- if (hue < 60)
- g = m1 + (m2 - m1) * hue / 60;
- else if (hue < 180)
- g = m2;
- else if (hue < 240)
- g = m1 + (m2 - m1) * (240 - hue) / 60;
- else
- g = m1;
-
- hue = *h - 120;
- while (hue > 360)
- hue -= 360;
- while (hue < 0)
- hue += 360;
-
- if (hue < 60)
- b = m1 + (m2 - m1) * hue / 60;
- else if (hue < 180)
- b = m2;
- else if (hue < 240)
- b = m1 + (m2 - m1) * (240 - hue) / 60;
- else
- b = m1;
-
- *h = r;
- *l = g;
- *s = b;
- }
-}
diff --git a/notes/e-bevel-button-util.h b/notes/e-bevel-button-util.h
deleted file mode 100644
index 759a9025cc..0000000000
--- a/notes/e-bevel-button-util.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef __E_BEVEL_BUTTON_UTIL_H__
-#define __E_BEVEL_BUTTON_UTIL_H__
-
-#define LIGHTNESS_MULT 1.3
-#define DARKNESS_MULT 0.7
-
-void
-e_bevel_button_util_shade (GdkColor *a,
- GdkColor *b,
- gdouble k);
-
-#endif /* __E_BEVEL_BUTTON_UTIL_H__ */
diff --git a/notes/e-bevel-button.c b/notes/e-bevel-button.c
deleted file mode 100644
index 480a430516..0000000000
--- a/notes/e-bevel-button.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-
-#include <config.h>
-#include <gtk/gtkbutton.h>
-
-#include "e-util/e-util.h"
-
-#include "e-bevel-button.h"
-#include "e-bevel-button-util.h"
-
-#define PARENT_TYPE GTK_TYPE_BUTTON
-
-static GtkButtonClass *parent_class = NULL;
-
-struct _EBevelButtonPrivate {
- GdkColor base_color;
- GdkColor dark_color;
- GdkColor light_color;
- GdkGC *gc;
-};
-
-static void
-e_bevel_button_paint (GtkWidget *widget, GdkRectangle *area)
-{
- EBevelButton *button;
-
- button = E_BEVEL_BUTTON (widget);
-
- if (GTK_WIDGET_DRAWABLE (widget)) {
- gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
- gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height);
-
- gdk_gc_set_foreground (button->priv->gc, &button->priv->base_color);
- gdk_draw_rectangle (widget->window,
- button->priv->gc,
- TRUE,
- 0, 0,
- widget->allocation.width, widget->allocation.height);
-
- if (GTK_BUTTON (button)->in_button) {
- gdk_gc_set_foreground (button->priv->gc,
- GTK_BUTTON (button)->button_down ?
- &button->priv->dark_color :
- &button->priv->light_color);
- gdk_draw_line (widget->window, button->priv->gc,
- 0, 0, 0, widget->allocation.height - 2);
- gdk_draw_line (widget->window, button->priv->gc,
- 0, 0, widget->allocation.width - 2, 0);
-
- gdk_gc_set_foreground (button->priv->gc,
- GTK_BUTTON (button)->button_down ?
- &button->priv->light_color :
- &button->priv->dark_color);
- gdk_draw_line (widget->window, button->priv->gc,
- widget->allocation.width - 1 , 1,
- widget->allocation.width - 1, widget->allocation.height - 1);
- gdk_draw_line (widget->window, button->priv->gc,
- 1, widget->allocation.height - 1,
- widget->allocation.width - 1, widget->allocation.height - 1);
- }
- }
-}
-
-static gint
-e_bevel_button_expose (GtkWidget *widget, GdkEventExpose *event)
-{
- GtkBin *bin;
- GdkEventExpose child_event;
-
- if (GTK_WIDGET_DRAWABLE (widget)) {
- bin = GTK_BIN (widget);
-
- e_bevel_button_paint (widget, &event->area);
-
- child_event = *event;
- if (bin->child && GTK_WIDGET_NO_WINDOW (bin->child) &&
- gtk_widget_intersect (bin->child, &event->area, &child_event.area))
- gtk_widget_event (bin->child, (GdkEvent*) &child_event);
- }
-
- return FALSE;
-}
-
-static void
-e_bevel_button_draw (GtkWidget *widget, GdkRectangle *area)
-{
- GdkRectangle child_area;
- GdkRectangle tmp_area;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_BEVEL_BUTTON (widget));
- g_return_if_fail (area != NULL);
-
- if (GTK_WIDGET_DRAWABLE (widget)) {
- tmp_area = *area;
- tmp_area.x -= GTK_CONTAINER (widget)->border_width;
- tmp_area.y -= GTK_CONTAINER (widget)->border_width;
-
- e_bevel_button_paint (widget, &tmp_area);
-
- if (GTK_BIN (widget)->child && gtk_widget_intersect (GTK_BIN (widget)->child, &tmp_area, &child_area))
- gtk_widget_draw (GTK_BIN (widget)->child, &child_area);
- }
-}
-
-static void
-e_bevel_button_realize (GtkWidget *widget)
-{
- EBevelButton *button = E_BEVEL_BUTTON (widget);
-
- GTK_WIDGET_CLASS (parent_class)->realize (widget);
-
- button->priv->gc = gdk_gc_new (widget->window);
-
- gdk_color_parse ("#d0d888", &button->priv->base_color);
- e_bevel_button_util_shade (&button->priv->base_color,
- &button->priv->light_color,
- LIGHTNESS_MULT);
- e_bevel_button_util_shade (&button->priv->base_color,
- &button->priv->dark_color,
- DARKNESS_MULT);
- gdk_colormap_alloc_color (gdk_rgb_get_cmap (), &button->priv->base_color, FALSE, TRUE);
- gdk_colormap_alloc_color (gdk_rgb_get_cmap (), &button->priv->light_color, FALSE, TRUE);
- gdk_colormap_alloc_color (gdk_rgb_get_cmap (), &button->priv->dark_color, FALSE, TRUE);
-}
-
-static void
-e_bevel_button_class_init (EBevelButtonClass *klass)
-{
- GtkWidgetClass *widget_class;
-
- widget_class = (GtkWidgetClass *)klass;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- widget_class->draw = e_bevel_button_draw;
- widget_class->expose_event = e_bevel_button_expose;
- widget_class->realize = e_bevel_button_realize;
-}
-
-static void
-e_bevel_button_init (EBevelButton *button)
-{
- EBevelButtonPrivate *priv;
-
- GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS);
-
- priv = g_new (EBevelButtonPrivate, 1);
-
- button->priv = priv;
-}
-
-GtkWidget *
-e_bevel_button_new (void)
-{
- EBevelButton *button;
-
- button = gtk_type_new (E_TYPE_BEVEL_BUTTON);
-
- return GTK_WIDGET (button);
-}
-
-E_MAKE_TYPE (e_bevel_button, "EBevelButton", EBevelButton, e_bevel_button_class_init, e_bevel_button_init, PARENT_TYPE);
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/notes/e-bevel-button.h b/notes/e-bevel-button.h
deleted file mode 100644
index 333c317b43..0000000000
--- a/notes/e-bevel-button.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-#ifndef __E_BEVEL_BUTTON_H__
-#define __E_BEVEL_BUTTON_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkbutton.h>
-
-#define E_TYPE_BEVEL_BUTTON (e_bevel_button_get_type ())
-#define E_BEVEL_BUTTON(obj) (GTK_CHECK_CAST ((obj), E_TYPE_BEVEL_BUTTON, EBevelButton))
-#define E_BEVEL_BUTTON_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_BEVEL_BUTTON, EBevelButtonClass))
-#define E_IS_BEVEL_BUTTON(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_BEVEL_BUTTON))
-#define E_IS_BEVEL_BUTTON_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_BEVEL_BUTTON))
-
-typedef struct _EBevelButton EBevelButton;
-typedef struct _EBevelButtonPrivate EBevelButtonPrivate;
-typedef struct _EBevelButtonClass EBevelButtonClass;
-
-struct _EBevelButton {
- GtkButton parent;
-
- EBevelButtonPrivate *priv;
-};
-
-struct _EBevelButtonClass {
- GtkButtonClass parent_class;
-};
-
-GtkType e_bevel_button_get_type (void);
-
-GtkWidget *e_bevel_button_new (void);
-void e_bevel_button_set_base_color (EBevelButton *button, GdkColor *color);
-
-#endif /* __E_BEVEL_BUTTON_H__ */
-
diff --git a/notes/e-note.c b/notes/e-note.c
deleted file mode 100644
index 998acd24f0..0000000000
--- a/notes/e-note.c
+++ /dev/null
@@ -1,381 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-
-#include <config.h>
-#include <gnome.h>
-#include <gdk/gdkx.h>
-
-#include "e-util/e-canvas.h"
-#include "e-util/e-util.h"
-#include "widgets/e-text/e-text.h"
-
-#include "e-note.h"
-#include "e-bevel-button.h"
-#include "e-bevel-button-util.h"
-
-#define PARENT_TYPE GTK_TYPE_WINDOW
-
-enum {
- E_NOTE_TEXT_CHANGED,
- E_NOTE_LAST_SIGNAL
-};
-
-static guint e_note_signals [E_NOTE_LAST_SIGNAL] = { 0 };
-
-static GtkWindowClass *parent_class = NULL;
-
-struct _ENotePrivate {
- GtkWidget *canvas;
-
- GnomeCanvasItem *frame;
- GnomeCanvasItem *rect;
-
- GnomeCanvasItem *text_item;
-
- GnomeCanvasItem *move_button;
- GnomeCanvasItem *close_button;
- GnomeCanvasItem *resize_button;
-
- /* Used for moving and resizing */
- gint press_x, press_y;
- gint resize_width, resize_height;
- gboolean in_drag;
-};
-
-static void
-e_note_text_changed (ETextModel *model, gpointer data)
-{
- gtk_signal_emit (GTK_OBJECT (data),
- e_note_signals [E_NOTE_TEXT_CHANGED]);
-}
-
-static gint
-e_note_resize_button_changed (GtkWidget *widget, GdkEventButton *event, gpointer data)
-{
- ENote *note = E_NOTE (data);
-
- if (event->type == GDK_BUTTON_PRESS) {
- note->priv->press_x = event->x_root;
- note->priv->press_y = event->y_root;
-
- gdk_window_get_geometry (GTK_WIDGET (note)->window, NULL, NULL,
- &note->priv->resize_width, &note->priv->resize_height, NULL);
-
- gdk_pointer_grab (widget->window,
- FALSE,
- (GDK_BUTTON1_MOTION_MASK |
- GDK_POINTER_MOTION_HINT_MASK |
- GDK_BUTTON_RELEASE_MASK),
- NULL,
- NULL,
- GDK_CURRENT_TIME);
- note->priv->in_drag = TRUE;
-
- }
- else {
- if (note->priv->in_drag) {
- if (event->window != widget->window)
- return FALSE;
-
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- note->priv->in_drag = FALSE;
- }
- }
-
- return TRUE;
-}
-
-static gint
-e_note_resize_motion_event (GtkWidget *widget, GdkEventMotion *event, gpointer data)
-{
- GtkWidget *window = GTK_WIDGET (data);
- ENote *note = E_NOTE (data);
- gint new_x, new_y;
- gint width, height;
-
- if (note->priv->in_drag) {
- gdk_window_get_pointer (GDK_ROOT_PARENT (), &new_x, &new_y, NULL);
-
- width = note->priv->resize_width + new_x - note->priv->press_x;
- if (width < 60)
- width = 60;
-
- height = note->priv->resize_height + new_y - note->priv->press_y;
- if (height < 60)
- height = 60;
-
- gdk_window_resize (window->window, width, height);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gint
-e_note_move_button_changed (GtkWidget *widget, GdkEventButton *event, gpointer data)
-{
- ENote *note = E_NOTE (data);
-
- if (event->button != 1)
- return FALSE;
-
- if (event->type == GDK_BUTTON_PRESS) {
- gint root_x, root_y;
-
- gdk_window_get_origin (widget->window, &root_x, &root_y);
- note->priv->press_x = root_x - event->x_root;
- note->priv->press_y = root_y - event->y_root;
-
- gdk_pointer_grab (widget->window,
- FALSE,
- (GDK_BUTTON1_MOTION_MASK |
- GDK_POINTER_MOTION_HINT_MASK |
- GDK_BUTTON_RELEASE_MASK),
- NULL,
- NULL,
- GDK_CURRENT_TIME);
-
- note->priv->in_drag = TRUE;
- }
- else {
- if (note->priv->in_drag) {
- if (event->window != widget->window)
- return FALSE;
-
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- note->priv->in_drag = FALSE;
- }
- }
-
- return TRUE;
-}
-
-static gint
-e_note_move_motion_event (GtkWidget *widget, GdkEventMotion *event, gpointer data)
-{
- gint new_x, new_y;
- ENote *note = E_NOTE (data);
- GtkWidget *window = GTK_WIDGET (data);
-
- if (note->priv->in_drag) {
- gdk_window_get_pointer (GDK_ROOT_PARENT (), &new_x, &new_y, NULL);
-
- new_x += note->priv->press_x;
- new_y += note->priv->press_y;
-
- gdk_window_move (window->window, new_x, new_y);
- }
-
- return TRUE;
-}
-
-static void
-e_note_canvas_size_allocate (GtkWidget *widget, GtkAllocation *allocation, gpointer data)
-{
- ENote *note;
- gdouble height;
-
- note = E_NOTE (data);
-
- gnome_canvas_item_set (note->priv->text_item,
- "width", (gdouble) allocation->width - 10,
- NULL);
- gtk_object_get (GTK_OBJECT (note->priv->text_item),
- "height", &height,
- NULL);
- height = MAX (height, allocation->height);
- gnome_canvas_set_scroll_region (GNOME_CANVAS (note->priv->canvas), 0, 0,
- allocation->width, height);
- gnome_canvas_item_set (note->priv->frame,
- "x2", (gdouble) allocation->width - 1,
- "y2", (gdouble) allocation->height - 1,
- NULL);
- gnome_canvas_item_set (note->priv->rect,
- "x2", (gdouble) allocation->width - 1,
- "y2", (gdouble) allocation->height - 1,
- NULL);
- gnome_canvas_item_set (note->priv->move_button,
- "width", (gdouble) allocation->width - 29,
- NULL);
- gnome_canvas_item_set (note->priv->resize_button,
- "x", (gdouble) allocation->width - 23,
- "y", (gdouble) allocation->height - 23,
- NULL);
- gnome_canvas_item_set (note->priv->close_button,
- "x", (gdouble) allocation->width - 23,
- NULL);
-}
-
-static void
-e_note_realize (GtkWidget *widget)
-{
- GTK_WIDGET_CLASS (parent_class)->realize (widget);
-
- gdk_window_set_decorations (widget->window, 0);
-}
-
-static void
-e_note_class_init (ENoteClass *klass)
-{
- GtkWidgetClass *widget_class;
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *)klass;
- widget_class = (GtkWidgetClass *)klass;
- parent_class = gtk_type_class (PARENT_TYPE);
-
- widget_class->realize = e_note_realize;
-
- e_note_signals [E_NOTE_TEXT_CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ENoteClass, text_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_note_signals, E_NOTE_LAST_SIGNAL);
-}
-
-static void
-e_note_init (ENote *note)
-{
- ENotePrivate *priv;
- GtkWidget *button;
-
- priv = g_new (ENotePrivate, 1);
-
- note->priv = priv;
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- priv->canvas = e_canvas_new ();
-
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
-
- gtk_signal_connect (GTK_OBJECT (priv->canvas), "size_allocate",
- GTK_SIGNAL_FUNC (e_note_canvas_size_allocate), note);
- gtk_widget_show (priv->canvas);
- gtk_container_add (GTK_CONTAINER (note), priv->canvas);
-
- priv->rect = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (priv->canvas)),
- gnome_canvas_rect_get_type (),
- "x1", 0.0,
- "y1", 0.0,
- "x2", 100.0,
- "y2", 100.0,
- "fill_color_rgba", 0xf5ffa0ff,
- NULL);
- priv->frame = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (priv->canvas)),
- gnome_canvas_rect_get_type (),
- "x1", 0.0,
- "y1", 0.0,
- "x2", 100.0,
- "y2", 100.0,
- "outline_color", "black",
- NULL);
-
- priv->text_item = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (priv->canvas)),
- e_text_get_type (),
- "text", "",
- "font_gdk", priv->canvas->style->font,
- "fill_color", "black",
- "anchor", GTK_ANCHOR_NW,
- "clip", TRUE,
- "editable", TRUE,
- "line_wrap", TRUE,
- "width", 150.0,
- NULL);
- e_canvas_item_move_absolute(priv->text_item,
- 5, 25);
-
- gtk_signal_connect (GTK_OBJECT (E_TEXT (priv->text_item)->model), "changed",
- GTK_SIGNAL_FUNC (e_note_text_changed), note);
-
- button = e_bevel_button_new ();
- gtk_signal_connect (GTK_OBJECT (button), "button_press_event",
- GTK_SIGNAL_FUNC (e_note_move_button_changed), note);
- gtk_signal_connect (GTK_OBJECT (button), "button_release_event",
- GTK_SIGNAL_FUNC (e_note_move_button_changed), note);
- gtk_signal_connect (GTK_OBJECT (button), "motion_notify_event",
- GTK_SIGNAL_FUNC (e_note_move_motion_event), note);
- gtk_widget_show (button);
- priv->move_button = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (priv->canvas)),
- gnome_canvas_widget_get_type (),
- "widget", button,
- "x", 3.0,
- "y", 3.0,
- "width", 20.0,
- "height", 20.0,
- NULL);
- button = e_bevel_button_new ();
- gtk_widget_show (button);
- priv->close_button = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (priv->canvas)),
- gnome_canvas_widget_get_type (),
- "widget", button,
- "x", 3.0,
- "y", 3.0,
- "width", 20.0,
- "height", 20.0,
- NULL);
-
- button = e_bevel_button_new ();
- gtk_signal_connect (GTK_OBJECT (button), "button_press_event",
- GTK_SIGNAL_FUNC (e_note_resize_button_changed), note);
- gtk_signal_connect (GTK_OBJECT (button), "button_release_event",
- GTK_SIGNAL_FUNC (e_note_resize_button_changed), note);
- gtk_signal_connect (GTK_OBJECT (button), "motion_notify_event",
- GTK_SIGNAL_FUNC (e_note_resize_motion_event), note);
- gtk_widget_show (button);
- priv->resize_button = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (priv->canvas)),
- gnome_canvas_widget_get_type (),
- "widget", button,
- "x", 3.0,
- "y", 3.0,
- "width", 20.0,
- "height", 20.0,
- NULL);
-}
-
-void
-e_note_set_text (ENote *note, gchar *text)
-{
- g_return_if_fail (note != NULL);
- g_return_if_fail (E_IS_NOTE (note));
- g_return_if_fail (text != NULL);
-
- gnome_canvas_item_set (note->priv->text_item,
- "text", text,
- NULL);
-}
-
-gchar *
-e_note_get_text (ENote *note)
-{
- gchar *text;
-
- g_return_val_if_fail (note != NULL, NULL);
- g_return_val_if_fail (E_IS_NOTE (note), NULL);
- g_return_val_if_fail (text != NULL, NULL);
-
- gtk_object_get (GTK_OBJECT (note->priv->text_item),
- "text", &text,
- NULL);
-
- return text;
-}
-
-
-GtkWidget *
-e_note_new (void)
-{
- ENote *note;
-
- note = gtk_type_new (E_TYPE_NOTE);
-
- return GTK_WIDGET (note);
-}
-
-E_MAKE_TYPE (e_note, "ENote", ENote, e_note_class_init, e_note_init, PARENT_TYPE);
diff --git a/notes/e-note.h b/notes/e-note.h
deleted file mode 100644
index d7d4c63b95..0000000000
--- a/notes/e-note.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-
-#ifndef __E_NOTE_H__
-#define __E_NOTE_H__
-
-#include <config.h>
-#include <gnome.h>
-#include "e-bevel-button.h"
-
-#define E_TYPE_NOTE (e_note_get_type ())
-#define E_NOTE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_NOTE, ENote))
-#define E_NOTE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_NOTE, ENoteClass))
-#define E_IS_NOTE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_NOTE))
-#define E_IS_NOTE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_NOTE))
-
-typedef struct _ENote ENote;
-typedef struct _ENotePrivate ENotePrivate;
-typedef struct _ENoteClass ENoteClass;
-
-struct _ENote {
- GtkWindow parent;
-
- ENotePrivate *priv;
-};
-
-struct _ENoteClass {
- GtkWindowClass parent_class;
-
- void (* text_changed) (ENote *note);
-};
-
-GtkType e_note_get_type (void);
-GtkWidget *e_note_new (void);
-void e_note_set_text (ENote *note, gchar *text);
-gchar *e_note_get_text (ENote *note);
-
-#endif /* __E_NOTE_H__ */
diff --git a/notes/evolution-notes.oafinfo b/notes/evolution-notes.oafinfo
deleted file mode 100644
index 704b4028d8..0000000000
--- a/notes/evolution-notes.oafinfo
+++ /dev/null
@@ -1,54 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:control-factory:evolution-notes:e2471f2d-0589-4861-a25d-c21818f531d5"
- type="exe"
- location="evolution-notes">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Notes control"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:control:evolution-notes:8e3fb723-aada-4112-99db-d51779e35a2a"
- type="factory"
- location="OAFIID:control-factory:evolution-notes:e2471f2d-0589-4861-a25d-c21818f531d5">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="A sample Bonobo control which displays an addressbook."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component-factory:evolution-notes:f2f0f57f-27d9-4498-b54b-248f223ee772"
- type="exe"
- location="evolution-notes">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/GenericFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Factory for the Evolution notes component."/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution-shell-component:evolution-notes:92d95b91-3655-4746-ac68-01b21e2c5e44"
- type="factory"
- location="OAFIID:evolution-shell-component-factory:evolution-notes:f2f0f57f-27d9-4498-b54b-248f223ee772">
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/ShellComponent:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="Evolution component for handling mail."/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/notes/main.c b/notes/main.c
deleted file mode 100644
index f3198c0d63..0000000000
--- a/notes/main.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *
- * Author:
- * Anders Carlsson (andersca@gnu.org)
- *
- * (C) 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <bonobo.h>
-#include <liboaf/liboaf.h>
-
-#include "e-util/e-gui-utils.h"
-#include "component-factory.h"
-
-static void
-init_corba (gint argc, gchar **argv)
-{
- gnome_init_with_popt_table ("evolution-notes-component", VERSION, argc, argv,
- oaf_popt_options, 0, NULL);
- oaf_init (argc, argv);
-}
-
-static void
-init_bonobo (void)
-{
- if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) {
- e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
- _("Notes Component: Could not initialize bonobo"));
- exit (1);
- }
-}
-
-gint
-main (gint argc, gchar **argv)
-{
- bindtextdomain (PACKAGE, EVOLUTION_LOCALEDIR);
- textdomain (PACKAGE);
-
- init_corba (argc, argv);
- init_bonobo ();
-
- e_setup_base_dir ();
-
- notes_factory_init ();
- component_factory_init ();
-
- bonobo_main ();
-
- return 0;
-}
diff --git a/notes/test-notes.c b/notes/test-notes.c
deleted file mode 100644
index 8352ea789f..0000000000
--- a/notes/test-notes.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-
-#include <config.h>
-#include <gnome.h>
-#include <gdk/gdkx.h>
-
-#include "e-util/e-canvas.h"
-#include "widgets/e-text/e-text.h"
-
-#include "e-note.h"
-
-void
-text_changed (GtkWidget *widget, gpointer data)
-{
- g_print ("Text changed!\n");
-}
-
-gint
-main (gint argc, gchar **argv)
-{
- GtkWidget *note;
-
- gnome_init ("NotesTest", "0.0.1", argc, argv);
-
- note = e_note_new ();
- e_note_set_text (E_NOTE (note), "This is a text note widget");
- gtk_signal_connect (GTK_OBJECT (note), "changed",
- GTK_SIGNAL_FUNC (text_changed), NULL);
-
- gtk_widget_show (note);
- gtk_main ();
-
- return 0;
-}
diff --git a/po/.cvsignore b/po/.cvsignore
deleted file mode 100644
index 3d5b22df60..0000000000
--- a/po/.cvsignore
+++ /dev/null
@@ -1,12 +0,0 @@
-*.gmo
-*.mo
-Makefile
-Makefile.in
-Makefile.in.in
-POTFILES
-cat-id-tbl.c
-gnome-objc.pot
-gnome.pot
-stamp-cat-id
-evolution.pot
-
diff --git a/po/ChangeLog b/po/ChangeLog
deleted file mode 100644
index a41d60cc96..0000000000
--- a/po/ChangeLog
+++ /dev/null
@@ -1,539 +0,0 @@
-2000-08-19 Kjartan Maraas <kmaraas@gnome.org>
-
- * no.po: Updated Norwegian translation.
-
-2000-08-19 Matthias Warkus <mawa@iname.com>
-
- * de.po: Updated.
-
-2000-08-19 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
- * POTFILES.in: Added missing files that are in the build.
-
-2000-08-17 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-08-17 Kai Lahmann <kl@linuxfaqs.de>
-
- * de.po: Updated German translation
-
-2000-08-16 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-08-13 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
- * POTFILES.in: Added missing files that are in the build.
-
-2000-08-12 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
- * POTFILES.in: Added missing files that are in the build. Sorted in alphabet order
-
-
-2000-08-11 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-08-10 Akira TAGOH <at@ue-spacy.com>
-
- * ja.po: Updated Japanese translation.
-
-2000-08-08 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-08-07 Kjartan Maraas <kmaraas@gnome.org>
-
- * POTFILES.in: Added missing files that are in the build.
- * no.po: Updated Norwegian translation.
-
-2000-08-07 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-08-05 Fatih Demir <kabalak@gmx.net>
-
- * tr.po: Updated the Turkish translation.
-
-2000-08-04 Szabolcs BAN <shooby@gnome.hu>
-
- * hu.po: Updated Hungarian translations.
-
-2000-08-03 Alastair McKinstry <mckinstry@computer.org>
-
- * ga.po: Add Irish translation.
-
-2000-08-02 Pablo Saratxaga <pablo@mandrakesoft.com>
-
- * es.po,hu.po,it.po,sl.po: various syntax checkings (missing %s, %S
- instead of %s etc)
-
-2000-07-30 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-07-28 Szabolcs BAN <shooby@gnome.hu>
-
- * hu.po: Updated Hungarian translations.
-
-2000-07-27 Fatih Demir <kabalak@gmx.net>
-
- * tr.po: Updated the Turkish translation.
-
-2000-07-27 Fatih Demir <kabalak@gmx.net>
-
- * tr.po: Updated the Turkish translation.
-
-2000-07-26 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-07-24 Matthias Warkus <mawa@iname.com>
-
- * de.po: Updated German translation.
-
-2000-07-24 Fatih Demir <kabalak@gmx.net>
-
- * tr.po: Updated the Turkish translation.
-
-2000-07-24 Szabolcs BAN <shooby@gnome.hu>
-
- * hu.po: updated Hungarian translations...
-
-2000-07-24 Federico Mena Quintero <federico@helixcode.com>
-
- * it.po: Added missing \n.
-
-2000-07-23 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-07-23 Ettore Perazzoli <ettore@helixcode.com>
-
- * it.po: Updated Italian translation from Clara Tattoni
- <clara.tattoni@libero.it>.
-
-2000-07-21 Szabolcs BAN <shooby@gnome.hu>
-
- * hu.po: updated Hungarian translations...
-
-2000-07-21 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Fixed an error.
-
-2000-07-19 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-07-16 Jesus Bravo Alvarez <jba@pobox.com>
-
- * gl.po: Updated Galician translation.
-
-2000-07-16 Kjartan Maraas <kmaraas@gnome.org>
-
- * no.po: Updated Norwegian translation.
-
-2000-07-16 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-07-15 Matthias Warkus <mawa@iname.com>
-
- * de.po: Updated. Should be complete and pretty usable.
-
-2000-07-13 Fatih Demir <kabalak@gmx.net>
-
- * tr.po: Updated the Turkish translation.
-
-2000-07-13 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-07-10 Federico Mena Quintero <federico@helixcode.com>
-
- * POTFILES.in: Removed several calendar/gui files that are no
- longer there.
-
-2000-07-09 Federico Mena Quintero <federico@helixcode.com>
-
- * POTFILES.in: Removed calendar/gui/evolution-calendar-control.c
-
-2000-07-09 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-07-09 Matthias Warkus <mawa@iname.com>
-
- * de.po: Rough cut at a complete German translation. Still needs a
- lot of love.
-
-2000-07-03 Ettore Perazzoli <ettore@helixcode.com>
-
- * POTFILES.in: Removed `e-select-names.c' and
- `select-name.glade.h' which were removed by Chris' commit.
-
-2000-06-30 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-06-29 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-06-28 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-06-28 Kjartan Maraas <kmaraas@gnome.org>
-
- * POTFILES.in: Added a load of missing files.
- * no.po: Updated Norwegian translation.
-
-2000-06-27 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-06-24 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-06-21 Kjartan Maraas <kmaraas@gnome.org>
-
- * no.po: Updated Norwegian translation.
-
-2000-06-20 Jesus Bravo Alvarez <jba@pobox.com>
-
- * pt.po: Updated Portuguese translation from
- Tiago Antao <tiagoantao@bigfoot.com>
-
-2000-06-19 Ettore Perazzoli <ettore@helixcode.com>
-
- * it.po: Italian translation from Clara Tattoni
- <clara.tattoni@libero.it>.
-
-2000-06-17 Jeffrey Stedfast <fejj@helixcode.com>
-
- * POTFILES.in: why the heck was
- camel/providers/imap/imap.c listed? Oh well, 'tis
- removed now...
-
-2000-06-17 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-06-16 Kjartan Maraas <kmaraas@gnome.org>
-
- * no.po: Updated Norwegian translation.
-
-2000-06-13 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-06-11 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-06-11 Fatih Demir <kabalak@gmx.net>
-
- * tr.po: Updated the Turkish translation.
-
-2000-06-10 Zbigniew Chyla <chyla@buy.pl>
-
- * pl.po: Added Polish translation.
-
-2000-06-10 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-06-09 Fatih Demir <kabalak@gmx.net>
-
- * tr.po: Updated the Turkish translation.
-
-2000-06-08 Kjartan Maraas <kmaraas@gnome.org>
-
- * no.po: Updated Norwegian translation.
-
-2000-06-06 Fatih Demir <kabalak@gmx.net>
-
- * tr.po: Finished it [ what about the caveat message?
- Translating it is much fun ;) ].
-
-2000-06-05 Kenneth Christiansen <kenneth@gnu.org>
-
- * README.tools: Added readme file, which explains the
- use of the newly checked in po tools.
-
- hmm, looking forward to tomorrow...viva los compleaños!
- :)
-
-2000-06-05 Fatih Demir <kabalak@gmx.net>
-
- * tr.po: A quick-update ( not fully finished ).
-
-2000-06-04 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-06-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * it.po: New. Just a skeleton.
-
- * de.po: New, from Kai Lahmann <kl@linuxfaqs.de>.
-
- * POTFILES.in: Updated.
-
-2000-06-04 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-06-03 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-06-02 Jesus Bravo Alvarez <jba@pobox.com>
-
- * pt.po: Added Portuguese translation from
- Tiago Antao <tiagoantao@bigfoot.com>
-
-2000-06-01 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-05-28 Fatih Demir <kabalak@gmx.net>
-
- * tr.po: Updated the Turkish translation.
-
-2000-05-28 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-05-27 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-05-26 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-05-23 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-05-23 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-05-22 Yukihiro Nakai <nakai@gnome.gr.jp>
-
- * ja.po: Update from Akira TAGOH.
-
-2000-05-18 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-05-18 Yukihiro Nakai <nakai@gnome.gr.jp>
-
- * ja.po: Update from Akira TAGOH.
-
-2000-05-14 Valek Filippov <frob@df.ru>
-
- * ru.po: updated russian translation.
-
-2000-05-14 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-05-13 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-05-13 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-05-13 Valek Filippov <frob@df.ru>
-
- * POTFILES.in: added *.glade.h and *-strings.h files.
- * ru.po: updated russian translation.
-
-2000-05-12 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-05-12 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * POTFILES.in: Removed mail/mail-component.c.
-
-2000-05-09 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
- * update.sh: Updated.
-
-2000-05-08 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * New update.sh script from Kenneth.
-
-2000-05-08 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-05-08 Héctor García Álvarez <hector@scouts-es.org>
-
- * es.po: added translation to spanish.
-
-2000-05-07 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-05-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * POTFILES.in: Remove `shell/e-shell-shortcut.c'.
-
-2000-05-05 Jesus Bravo Alvarez <jba@pobox.com>
-
- * gl.po: Updated Galician translation.
-
-2000-05-04 Fatih Demir <kabalak@gmx.net>
-
- * tr.po : Updated the Turkish translation .
-
-2000-05-03 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-05-03 Valek Filippov <frob@df.ru>
-
- * ru.po: updated.
-
-2000-05-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * POTFILES.in: Removed `shell/e-service.c'.
-
-2000-05-02 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-05-01 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-04-30 Arjan Scherpenisse <acscherp@wins.uva.nl>
-
- * nl.po: Added Dutch translation
-
-2000-04-25 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-04-21 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-04-20 Fatih Demir <kabalak@gmx.net>
-
- * tr.po : Added the Turkish translation .
-
-2000-04-20 Yukihiro Nakai <nakai@gnome.gr.jp>
-
- * ja.po: Initial Japanese translation from Akira Tagoh
-
-2000-04-19 Pablo Saratxaga <pablo@mandrakesoft.com>
-
- * da.po: Updated Danish file
-
-2000-04-19 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-04-18 Vincent Renardias <vincent@redhat.com>
-
- * fr.po: creation.
-
-2000-04-18 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-04-15 Valek Filippov <frob@df.ru>
-
- * ru.po: Updated russian translation.
-
-2000-04-15 Ettore Perazzoli <ettore@helixcode.com>
-
- * POTFILES.in: Removed `libversit/vcc.c' as its auto-generated and
- breaks.
-
-2000-04-12 Pablo Saratxaga <pablo@mandrakesoft.com>
-
- * da.po: Updated Danish file
-
-2000-04-10 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Updated Norwegian translation.
-
-2000-04-08 Jesus Bravo Alvarez <jba@pobox.com>
-
- * gl.po: Added Galician translation.
-
-2000-04-07 Yuri Syrota <rasta@renome.rovno.ua>
-
- * uk.po: Updated Ukrainian translation.
-
-2000-04-06 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-04-04 Spiros Papadimitriou <spapadim+@cs.cmu.edu>
-
- * el.po: Added Greek translation.
-
-2000-04-04 Kjartan Maraas <kmaraas@online.no>
-
- * da.po: Added Danish translation from Kenneth Christiansen
- <kenneth@ripen.dk>.
- * no.po: Updated Norwegian translation.
- * ru.po: Added Russian translation from Valek Filippov
- <frob@df.ru>.
-
-2000-04-04 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-04-04 Yuri Syrota <rasta@renome.rovno.ua>
-
- * uk.po: Added Ukrainian translation.
-
-2000-04-03 Richard Hult <rhult@hem.passagen.se>
-
- * sv.po: Updated Swedish translation.
-
-2000-04-03 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * sv.po: Added Swedish translation.
-
-2000-04-01 Kjartan Maraas <kmaraas@online.no>
-
- * no.po: Added Norwegian translation.
-
-2000-04-01 Matt Loper <matt@helixcode.com>
-
- * .cvsignore: Added evolution.pot.
-
-2000-03-27 Federico Mena Quintero <federico@helixcode.com>
-
- * POTFILES.in: Removed the calendar files for now.
-
-1998-07-23 Nuno Ferreira <nmrf@rnl.ist.utl.pt>
-
- * pt.po: Added Portuguese translation.
-
-1996-06-12 Tristan Tarrant <ttarrant@suntlc.etnoteam.it>
-
- * it.po : Italian translations added
diff --git a/po/POTFILES.ignore b/po/POTFILES.ignore
deleted file mode 100644
index cc2e73df12..0000000000
--- a/po/POTFILES.ignore
+++ /dev/null
@@ -1 +0,0 @@
-calendar/gui/getdate.c
diff --git a/po/POTFILES.in b/po/POTFILES.in
deleted file mode 100644
index d14fc1c945..0000000000
--- a/po/POTFILES.in
+++ /dev/null
@@ -1,109 +0,0 @@
-addressbook/backend/ebook/load-gnomecard-addressbook.c
-addressbook/backend/ebook/load-pine-addressbook.c
-addressbook/backend/ebook/test-client-list.c
-addressbook/backend/ebook/test-client.c
-addressbook/conduit/address-conduit-control-applet.c
-addressbook/conduit/address-conduit.c
-addressbook/contact-editor/categories-strings.h
-addressbook/contact-editor/e-contact-editor.c
-addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h
-addressbook/contact-editor/e-contact-editor-strings.h
-addressbook/contact-editor/fullname-strings.h
-addressbook/demo/addressbook-factory.c
-addressbook/demo/addressbook.c
-addressbook/gui/component/addressbook-factory.c
-addressbook/gui/component/addressbook.c
-addressbook/gui/component/alphabet.glade.h
-addressbook/gui/component/e-ldap-storage.c
-addressbook/gui/component/ldap-server-dialog.glade.h
-addressbook/gui/component/select-names/select-names.glade.h
-addressbook/gui/minicard/e-minicard-control.c
-addressbook/gui/minicard/e-minicard-view.c
-addressbook/gui/minicard/e-minicard.c
-addressbook/gui/minicard/test-minicard-view.c
-addressbook/gui/search/e-addressbook-search-dialog.c
-addressbook/printing/e-contact-print.glade.h
-calendar/cal-util/timeutil.c
-calendar/conduits/calendar/calendar-conduit-control-applet.c
-calendar/conduits/calendar/calendar-conduit.c
-calendar/conduits/todo/todo-conduit-control-applet.c
-calendar/conduits/todo/todo-conduit.c
-calendar/gui/calendar-commands.c
-calendar/gui/calendar-model.c
-calendar/gui/control-factory.c
-calendar/gui/dialogs/alarm-notify-dialog.c
-calendar/gui/dialogs/alarm-notify.glade.h
-calendar/gui/dialogs/task-editor.c
-calendar/gui/dialogs/task-editor-dialog.glade.h
-calendar/gui/e-calendar-table.c
-calendar/gui/e-day-view-time-item.c
-calendar/gui/e-day-view.c
-calendar/gui/e-week-view.c
-calendar/gui/event-editor.c
-calendar/gui/event-editor-dialog.glade.h
-calendar/gui/getdate.y
-calendar/gui/gncal-todo.c
-calendar/gui/gnome-cal.c
-calendar/gui/gnome-month-item.c
-calendar/gui/goto.c
-calendar/gui/main.c
-calendar/gui/popup-menu.c
-calendar/gui/print.c
-calendar/gui/prop.c
-composer/e-msg-composer-address-dialog.c
-composer/e-msg-composer-address-dialog.glade.h
-composer/e-msg-composer-attachment-bar.c
-composer/e-msg-composer-attachment.c
-composer/e-msg-composer-attachment.glade.h
-composer/e-msg-composer-hdrs.c
-composer/e-msg-composer.c
-filter/filter-datespec.c
-filter/filter-editor.c
-filter/filter-filter.c
-filter/filter-folder.c
-filter/filter-part.c
-filter/filter-rule.c
-filter/score-editor.c
-filter/vfolder-editor.c
-filter/vfolder-rule.c
-libversit/vobject.c
-mail/component-factory.c
-mail/folder-browser-factory.c
-mail/folder-browser.c
-mail/mail-callbacks.c
-mail/mail-config-gui.c
-mail/mail-config.c
-mail/mail-config.glade.h
-mail/mail-config-druid.glade.h
-mail/mail-crypto.c
-mail/mail-local.c
-mail/mail-ops.c
-mail/mail-threads.c
-mail/mail-tools.c
-mail/mail-vfolder.c
-mail/mail-view.c
-mail/main.c
-mail/message-list.c
-notes/component-factory.c
-notes/main.c
-shell/e-setup.c
-shell/e-shell-folder-creation-dialog.c
-shell/e-shell-folder-selection-dialog.c
-shell/e-shell-folder-title-bar.c
-shell/e-shell-view-menu.c
-shell/e-shell-view.c
-shell/e-shell.c
-shell/e-shortcuts-view.c
-shell/e-shortcuts.c
-shell/e-storage.c
-shell/e-storage-set-view.c
-shell/main.c
-tests/ui-tests/message-browser.c
-widgets/e-table/e-table-config.glade.h
-widgets/e-table/e-table-field-chooser.glade.h
-widgets/e-table/e-table-group.glade.h
-widgets/e-table/e-table-header-item.c
-widgets/meeting-time-sel/e-meeting-time-sel.c
-widgets/misc/e-calendar-item.c
-widgets/misc/e-clipped-label.c
-widgets/shortcut-bar/e-group-bar.c
diff --git a/po/README.tools b/po/README.tools
deleted file mode 100644
index 4ec99c1640..0000000000
--- a/po/README.tools
+++ /dev/null
@@ -1,58 +0,0 @@
-The po/ directory includes two perlscripts, which is done to help
-making the translations fully uptodate.
-
-The first script is called update.pl and is supposed to be run like this:
-
- ./update.pl [OPTIONS] ...LANGCODE
-
-This will updates the pot file (the po template, generated from the source code)
-and merge them with the translations po files.
-
-For instance to do this for Danish, type the following
-
- ./update.pl da
-
-
-The update.pl script also supports other options, they are:
-
- -V, --version shows the version
- -H, --help shows this help page
- -P, --pot only generates the potfile
- -M, --maintain search for missing files in POTFILES.in
-
-Especially the --maintain option is very handy for package maintainer, to check
-if you included all the files that have marked strings in the POTFILES.in, so
-they will be in the generated po template, the socalled pot file.
-
-There is though one thing to take notice of with this option, please check the
-configure.in file to make sure that the files you add to POTFILES.in are being
-build, otherwise this can leed to "make dist" throuble.
-
-
-The other utility is the desk.pl script, which will check the cvs module for
-missing translation in files like *.desktop, *.directory, *.soundlist and so on.
-
-Run the script like this:
-
- ./desk.pl [OPTIONS] ...LANGCODE ENTRY
-
-An example use could be.
-
- ./desk.pl da
-
-which will check all the files for missing Name[da] entries, or
-
- ./desk.pl no Comment
-
-which will check all the files for missing Comment[no] entries. "Comment" can
-here be replaced with whatever you like
-
-All scripts support the --help option for further help, though it's not very
-extensive for the moment.
-
-Kenneth Christiansen
-
-kenneth@gnu.org
-kenneth@gnome.org
-
-Both scripts are copyright 2000 The Free Software Foundation and me.
diff --git a/po/da.po b/po/da.po
deleted file mode 100644
index 5a0dd5096f..0000000000
--- a/po/da.po
+++ /dev/null
@@ -1,4813 +0,0 @@
-# Danish translation of evolution
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Kenneth Christiansen <kenneth@gnome.dk>, 2000.
-# Keld Simonsen <keld@dkuug.dk>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution beta\n"
-"POT-Creation-Date: 2000-08-02 16:39+0200\n"
-"PO-Revision-Date: 2000-08-19 00:38+0200\n"
-"Last-Translator: Keld Simonsen <keld@dkuug.dk>\n"
-"Language-Team: Danish <dansk@klid.dk>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: addressbook/backend/ebook/load-gnomecard-addressbook.c:41
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/backend/ebook/test-client-list.c:29
-#: addressbook/backend/ebook/test-client.c:54
-#: addressbook/conduit/address-conduit.c:1215
-#: addressbook/demo/addressbook-factory.c:32
-#: addressbook/gui/component/addressbook-factory.c:59
-#: addressbook/gui/minicard/test-minicard-view.c:45
-#: calendar/conduits/calendar/calendar-conduit.c:1669
-#: calendar/conduits/todo/todo-conduit.c:1298 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Kunne ikke initialisere Bonobo"
-
-#. This array must be in the same order as enumerations
-#. in GnomePilotConduitSyncType as they are used as index.
-#. Custom type implies Disabled state.
-#.
-#: addressbook/conduit/address-conduit-control-applet.c:54
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:55
-#: calendar/conduits/todo/todo-conduit-control-applet.c:55
-msgid "Disabled"
-msgstr "Deaktiveret"
-
-#: addressbook/conduit/address-conduit-control-applet.c:55
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:56
-#: calendar/conduits/todo/todo-conduit-control-applet.c:56
-msgid "Synchronize"
-msgstr "Synkronisér"
-
-#: addressbook/conduit/address-conduit-control-applet.c:56
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:57
-#: calendar/conduits/todo/todo-conduit-control-applet.c:57
-msgid "Copy From Pilot"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:57
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:58
-#: calendar/conduits/todo/todo-conduit-control-applet.c:58
-msgid "Copy To Pilot"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:58
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:59
-#: calendar/conduits/todo/todo-conduit-control-applet.c:59
-msgid "Merge From Pilot"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:59
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:60
-#: calendar/conduits/todo/todo-conduit-control-applet.c:60
-msgid "Merge To Pilot"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:143
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:144
-#: calendar/conduits/todo/todo-conduit-control-applet.c:144
-msgid "Eskil Heyn Olsen <deity@eskil.dk>"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:145
-msgid "Gpilotd address conduit"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:146
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:147
-#: calendar/conduits/todo/todo-conduit-control-applet.c:147
-msgid "(C) 1998 the Free Software Foundation"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:148
-msgid "Configuration utility for the address conduit.\n"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:149
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:150
-#: calendar/conduits/todo/todo-conduit-control-applet.c:150
-msgid "gnome-unknown.xpm"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:190
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:191
-#: calendar/conduits/todo/todo-conduit-control-applet.c:191
-msgid "Synchronize Action"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:261
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:262
-#: calendar/conduits/todo/todo-conduit-control-applet.c:262
-msgid "Conduit state"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:315
-#: addressbook/conduit/address-conduit-control-applet.c:328
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:316
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:329
-#: calendar/conduits/todo/todo-conduit-control-applet.c:316
-#: calendar/conduits/todo/todo-conduit-control-applet.c:329
-msgid ""
-"No pilot configured, please choose the\n"
-"'Pilot Link Properties' capplet first."
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:334
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:335
-#: calendar/conduits/todo/todo-conduit-control-applet.c:335
-msgid "Not connected to the gnome-pilot daemon"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:339
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:340
-#: calendar/conduits/todo/todo-conduit-control-applet.c:340
-msgid ""
-"An error occured when trying to fetch\n"
-"pilot list from the gnome-pilot daemon"
-msgstr ""
-
-#: addressbook/conduit/address-conduit.c:127
-#: addressbook/conduit/address-conduit.c:141
-msgid "BLARG\n"
-msgstr ""
-
-#: addressbook/conduit/address-conduit.c:471
-#, c-format
-msgid "Address holds %ld address entries"
-msgstr ""
-
-#: addressbook/conduit/address-conduit.c:497
-#: addressbook/conduit/address-conduit.c:499
-msgid "Could not start addressbook server"
-msgstr ""
-
-#: addressbook/conduit/address-conduit.c:512
-#: addressbook/conduit/address-conduit.c:515
-msgid "Could not read pilot's Address application block"
-msgstr ""
-
-#: addressbook/conduit/address-conduit.c:853
-msgid "Error while communicating with address server"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "kategorier"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "Punkter tilhører disse kategorier:"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "Tilgængelige kategorier:"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/dialogs/task-editor.c:217 calendar/gui/event-editor.c:1179
-msgid "FIXME: _Appointment"
-msgstr "_Aftale"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/dialogs/task-editor.c:218 calendar/gui/event-editor.c:1180
-msgid "FIXME: Meeting Re_quest"
-msgstr "Mødeforesp_ørgsel"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/dialogs/task-editor.c:216 calendar/gui/event-editor.c:1182
-msgid "FIXME: _Mail Message"
-msgstr "E-post _meddelse"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/dialogs/task-editor.c:219 calendar/gui/event-editor.c:1183
-msgid "FIXME: _Contact"
-msgstr "_Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/dialogs/task-editor.c:213
-#: calendar/gui/dialogs/task-editor.c:220 calendar/gui/event-editor.c:1184
-msgid "FIXME: _Task"
-msgstr "_Opgave"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/dialogs/task-editor.c:214
-#: calendar/gui/dialogs/task-editor.c:221 calendar/gui/event-editor.c:1185
-msgid "FIXME: Task _Request"
-msgstr "Opgavefo_respørgsel"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/dialogs/task-editor.c:222 calendar/gui/event-editor.c:1186
-msgid "FIXME: _Journal Entry"
-msgstr "_Journalopføring"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/dialogs/task-editor.c:223 calendar/gui/event-editor.c:1187
-msgid "FIXME: _Note"
-msgstr "_Notat"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/dialogs/task-editor.c:225
-#: calendar/gui/dialogs/task-editor.c:332 calendar/gui/event-editor.c:1189
-#: calendar/gui/event-editor.c:1296
-msgid "FIXME: Ch_oose Form..."
-msgstr "Vælg _formular..."
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/dialogs/task-editor.c:230 calendar/gui/event-editor.c:1194
-msgid "FIXME: _Memo Style"
-msgstr "_Memo stil"
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/dialogs/task-editor.c:232 calendar/gui/event-editor.c:1196
-msgid "FIXME: Define Print _Styles..."
-msgstr "Definér udskrift _stil..."
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/dialogs/task-editor.c:239 calendar/gui/event-editor.c:1203
-msgid "FIXME: S_end"
-msgstr "_Send"
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/dialogs/task-editor.c:243 calendar/gui/event-editor.c:1207
-msgid "FIXME: Save Attac_hments..."
-msgstr "Gem _bilag..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "_Slet"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/dialogs/task-editor.c:246 calendar/gui/event-editor.c:1210
-msgid "FIXME: _Move to Folder..."
-msgstr "_Flyt til folder..."
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/dialogs/task-editor.c:247 calendar/gui/event-editor.c:1211
-msgid "FIXME: Cop_y to Folder..."
-msgstr "_Kopiér til folder..."
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/dialogs/task-editor.c:249 calendar/gui/event-editor.c:1213
-msgid "Page Set_up"
-msgstr "Sideopsætning"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/dialogs/task-editor.c:250 calendar/gui/event-editor.c:1214
-msgid "FIXME: Print Pre_view"
-msgstr "Udskriv for_kig"
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/dialogs/task-editor.c:271 calendar/gui/event-editor.c:1235
-msgid "FIXME: Paste _Special..."
-msgstr "Indsæt _special..."
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/dialogs/task-editor.c:276 calendar/gui/event-editor.c:1240
-msgid "FIXME: Mark as U_nread"
-msgstr "Mærk som _ulæst"
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/dialogs/task-editor.c:280 calendar/gui/event-editor.c:1244
-msgid "_Object"
-msgstr "Emne"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/dialogs/task-editor.c:285
-#: calendar/gui/dialogs/task-editor.c:293 calendar/gui/event-editor.c:1249
-#: calendar/gui/event-editor.c:1256
-msgid "FIXME: _Item"
-msgstr "_ting"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/dialogs/task-editor.c:286
-#: calendar/gui/dialogs/task-editor.c:294 calendar/gui/event-editor.c:1250
-#: calendar/gui/event-editor.c:1257
-msgid "FIXME: _Unread Item"
-msgstr "_Ulæst ting"
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/dialogs/task-editor.c:288 calendar/gui/event-editor.c:1251
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr "_Første ting i folder"
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/dialogs/task-editor.c:296 calendar/gui/event-editor.c:1258
-msgid "FIXME: _Last Item in Folder"
-msgstr "_Sidste ting i folder"
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/dialogs/task-editor.c:301 calendar/gui/event-editor.c:1263
-msgid "FIXME: _Standard"
-msgstr "_Standard"
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/dialogs/task-editor.c:303 calendar/gui/event-editor.c:1265
-msgid "FIXME: __Formatting"
-msgstr "__Formatering"
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/dialogs/task-editor.c:306 calendar/gui/event-editor.c:1268
-msgid "FIXME: _Customize..."
-msgstr "_Tilpas..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/dialogs/task-editor.c:311 calendar/gui/event-editor.c:1273
-msgid "Pre_vious"
-msgstr "Fore_gående"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/dialogs/task-editor.c:312 calendar/gui/event-editor.c:1274
-msgid "Ne_xt"
-msgstr "_Næste"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/dialogs/task-editor.c:314 calendar/gui/event-editor.c:1278
-msgid "_Toolbars"
-msgstr "Værk_tøjsbjælker"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/dialogs/task-editor.c:319 calendar/gui/event-editor.c:1283
-msgid "FIXME: _File..."
-msgstr "_Fil..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/dialogs/task-editor.c:320 calendar/gui/event-editor.c:1284
-msgid "FIXME: It_em..."
-msgstr "Tin_g..."
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/dialogs/task-editor.c:321 calendar/gui/event-editor.c:1285
-msgid "FIXME: _Object..."
-msgstr "_Objekt..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/dialogs/task-editor.c:326 calendar/gui/event-editor.c:1290
-msgid "FIXME: _Font..."
-msgstr "FIXME: Skri_fttype..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/dialogs/task-editor.c:327 calendar/gui/event-editor.c:1291
-msgid "FIXME: _Paragraph..."
-msgstr "_Afsnit..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/dialogs/task-editor.c:334 calendar/gui/event-editor.c:1298
-msgid "FIXME: Desi_gn This Form"
-msgstr "_Design dette skema"
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/dialogs/task-editor.c:335 calendar/gui/event-editor.c:1299
-msgid "FIXME: D_esign a Form..."
-msgstr "_Design et skema"
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/dialogs/task-editor.c:337 calendar/gui/event-editor.c:1301
-msgid "FIXME: Publish _Form..."
-msgstr "Publicér _skema..."
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/dialogs/task-editor.c:338 calendar/gui/event-editor.c:1302
-msgid "FIXME: Pu_blish Form As..."
-msgstr "Publicér skema som..."
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/dialogs/task-editor.c:340 calendar/gui/event-editor.c:1304
-msgid "FIXME: Script _Debugger"
-msgstr "Skript_afluser"
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/dialogs/task-editor.c:345 calendar/gui/event-editor.c:1309
-msgid "FIXME: _Spelling..."
-msgstr "_Stavning..."
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/dialogs/task-editor.c:350 calendar/gui/event-editor.c:1314
-msgid "_Forms"
-msgstr "Sk_emaer"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "_Ny Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr "Ny _kontakt fra samme firma"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr "Nyt _brev til kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr "Ny _meddelse til kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr "Nyt _møde med kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr "_Planlæg et møde..."
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr "Ny _opgave for kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr "Ny _journalopføring for kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr "_Flag for opfølgning"
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr "Vis _kort med adresse"
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr "_Åbn webside"
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr "Videresend et _vCard"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/dialogs/task-editor.c:367 calendar/gui/event-editor.c:1327
-msgid "FIXME: For_ward"
-msgstr "_Videresend"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/dialogs/task-editor.c:380 calendar/gui/event-editor.c:1340
-msgid "_Insert"
-msgstr "_Indsæt"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/dialogs/task-editor.c:381 calendar/gui/event-editor.c:1341
-msgid "F_ormat"
-msgstr "F_ormat"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/dialogs/task-editor.c:382 calendar/gui/event-editor.c:1342
-msgid "_Tools"
-msgstr "_Værktøj"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/dialogs/task-editor.c:383 calendar/gui/event-editor.c:1343
-msgid "Actio_ns"
-msgstr "Ha_ndlinger"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "Gem og luk"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1382
-msgid "Save the appointment and close the dialog box"
-msgstr "Gem aftalen og luk dialogboksen"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:654
-msgid "Print..."
-msgstr "Udskriv..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/dialogs/task-editor.c:415 calendar/gui/event-editor.c:1387
-msgid "Print this item"
-msgstr "Udskriv denne ting"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/dialogs/task-editor.c:416 calendar/gui/event-editor.c:1388
-msgid "FIXME: Insert File..."
-msgstr "Indsæt fil..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/dialogs/task-editor.c:417 calendar/gui/event-editor.c:1389
-msgid "Insert a file as an attachment"
-msgstr "Indsæt en fil som bilag"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/demo/addressbook.c:84
-#: addressbook/gui/component/addressbook.c:443
-#: calendar/gui/e-calendar-table.c:375
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:548
-#: mail/folder-browser-factory.c:50 mail/mail-config.glade.h:13
-#: mail/mail-config.glade.h:18 mail/mail-config.glade.h:24
-#: mail/mail-view.c:147
-msgid "Delete"
-msgstr "Slet"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/dialogs/task-editor.c:426 calendar/gui/event-editor.c:1398
-#: calendar/gui/gncal-todo.c:376
-msgid "Delete this item"
-msgstr "Slet dette punkt"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/dialogs/task-editor.c:428 calendar/gui/event-editor.c:1400
-msgid "FIXME: Previous"
-msgstr "Forrige"
-
-#: addressbook/contact-editor/e-contact-editor.c:858
-#: calendar/gui/dialogs/task-editor.c:429 calendar/gui/event-editor.c:1401
-msgid "Go to the previous item"
-msgstr "Gå til forrige punkt"
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/dialogs/task-editor.c:430 calendar/gui/event-editor.c:1402
-msgid "FIXME: Next"
-msgstr "Næste"
-
-#: addressbook/contact-editor/e-contact-editor.c:861
-#: calendar/gui/dialogs/task-editor.c:431 calendar/gui/event-editor.c:1403
-msgid "Go to the next item"
-msgstr "Gå til næste punkt"
-
-#: addressbook/contact-editor/e-contact-editor.c:864
-#: calendar/gui/dialogs/task-editor.c:432 calendar/gui/event-editor.c:1404
-msgid "FIXME: Help"
-msgstr "Hjælp"
-
-#: addressbook/contact-editor/e-contact-editor.c:865
-#: calendar/gui/dialogs/task-editor.c:433 calendar/gui/event-editor.c:1405
-msgid "See online help"
-msgstr "Se hjælp"
-
-#: addressbook/contact-editor/e-contact-editor.c:1321
-msgid "Assistant"
-msgstr "Sekretær"
-
-#: addressbook/contact-editor/e-contact-editor.c:1322
-#: addressbook/contact-editor/e-contact-editor.c:1426
-msgid "Business"
-msgstr "Arbejde"
-
-#: addressbook/contact-editor/e-contact-editor.c:1323
-msgid "Business 2"
-msgstr "Arbejde 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1324
-msgid "Business Fax"
-msgstr "Firma fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1325
-msgid "Callback"
-msgstr "Tilbagering"
-
-#: addressbook/contact-editor/e-contact-editor.c:1326
-msgid "Car"
-msgstr "Bil"
-
-#: addressbook/contact-editor/e-contact-editor.c:1327
-msgid "Company"
-msgstr "Firma"
-
-#: addressbook/contact-editor/e-contact-editor.c:1328
-#: addressbook/contact-editor/e-contact-editor.c:1427
-msgid "Home"
-msgstr "Hjem"
-
-#: addressbook/contact-editor/e-contact-editor.c:1329
-msgid "Home 2"
-msgstr "Hjem 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1330
-msgid "Home Fax"
-msgstr "Hjemme fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1331
-msgid "ISDN"
-msgstr "Isdn"
-
-#: addressbook/contact-editor/e-contact-editor.c:1332
-msgid "Mobile"
-msgstr "_Mobil"
-
-#: addressbook/contact-editor/e-contact-editor.c:1333
-#: addressbook/contact-editor/e-contact-editor.c:1428
-#: mail/mail-config.glade.h:28
-msgid "Other"
-msgstr "Andet"
-
-#: addressbook/contact-editor/e-contact-editor.c:1334
-msgid "Other Fax"
-msgstr "Anden fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1335
-msgid "Pager"
-msgstr "Kalder"
-
-#: addressbook/contact-editor/e-contact-editor.c:1336
-msgid "Primary"
-msgstr "Primær epost"
-
-#: addressbook/contact-editor/e-contact-editor.c:1337
-msgid "Radio"
-msgstr "Radio"
-
-#: addressbook/contact-editor/e-contact-editor.c:1338
-msgid "Telex"
-msgstr "Telex"
-
-#: addressbook/contact-editor/e-contact-editor.c:1339
-msgid "TTY/TDD"
-msgstr "TTY/TDD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Primary Email"
-msgstr "Primær epost"
-
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Email 2"
-msgstr "Sekundær epost"
-
-#: addressbook/contact-editor/e-contact-editor.c:1385
-msgid "Email 3"
-msgstr "Tertiær epost"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:7
-msgid ""
-"Are you sure you want\n"
-"to delete this contact?"
-msgstr ""
-"Er du sikker på at du\n"
-"vil slette denne kontakt?"
-
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:9
-msgid "Delete Contact?"
-msgstr "Slet kontakt?"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "_Tilføj"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "Telefontyper"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "Ny telefontype"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91 mail/mail-config.glade.h:11
-#: mail/mail-config.glade.h:16 mail/mail-config.glade.h:22
-msgid "Add"
-msgstr "Tilføj"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "Kontaktredigering"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "_Fulde navn..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "Gem som:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Hjemmeside-adresse:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "Vil modtage _HTML e-post"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Adresse:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "_Arbejde"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "_Hjemme"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "_Fax på arbejde"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "_Mobil"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "A_rbejde"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "_Dette er postadressen"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "K_ontakter..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:26
-msgid "Ca_tegories..."
-msgstr "Ka_tegorier..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr "_Job titel:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "_Firma:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:18
-msgid "General"
-msgstr "Generel"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "_Afdeling:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "_Kontor:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "_Profession:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "Kalde_navn:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr "Ægte_fælle:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "_Fødselsdag:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr "Sekretær"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "_Leders navn:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "Br_yllupsdag:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "_Notater:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:33
-msgid "Details"
-msgstr "Detaljer"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "Tjek fulde navn"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "_Titel:"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "_Fornavn:"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "_Mellemnavn:"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "_Efternavn:"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "_Suffiks:"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Hr.\n"
-"Fr.\n"
-"Dr.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-
-#: addressbook/demo/addressbook.c:78
-#: addressbook/gui/component/addressbook.c:437
-#: calendar/gui/calendar-commands.c:511 notes/component-factory.c:27
-msgid "New"
-msgstr "Ny"
-
-#: addressbook/demo/addressbook.c:78
-#: addressbook/gui/component/addressbook.c:437
-msgid "Create a new contact"
-msgstr "Opret en ny kontakt"
-
-#: addressbook/demo/addressbook.c:82
-#: addressbook/gui/component/addressbook.c:441
-msgid "Find"
-msgstr "Find"
-
-#: addressbook/demo/addressbook.c:82
-#: addressbook/gui/component/addressbook.c:441
-msgid "Find a contact"
-msgstr "Find kontaktperson"
-
-#: addressbook/demo/addressbook.c:83
-#: addressbook/gui/component/addressbook.c:442
-#: calendar/gui/calendar-commands.c:516 mail/folder-browser-factory.c:48
-#: mail/mail-view.c:145
-msgid "Print"
-msgstr "Udskriv"
-
-#: addressbook/demo/addressbook.c:83
-#: addressbook/gui/component/addressbook.c:442
-msgid "Print contacts"
-msgstr "Udskriv kontakter"
-
-#: addressbook/demo/addressbook.c:84
-#: addressbook/gui/component/addressbook.c:443
-msgid "Delete a contact"
-msgstr "Fjern kontaktperson"
-
-#: addressbook/demo/addressbook.c:103
-#: addressbook/gui/component/addressbook.c:528
-msgid "_New Contact"
-msgstr "_Ny kontaktperson"
-
-#: addressbook/gui/component/addressbook.c:511
-msgid "_Print Contacts..."
-msgstr "_Udskriv kontakter"
-
-#: addressbook/gui/component/addressbook.c:521
-#: addressbook/gui/component/addressbook.c:1045
-msgid "As _Table"
-msgstr "Som _tabel"
-
-#: addressbook/gui/component/addressbook.c:536
-msgid "N_ew Directory Server"
-msgstr "N_y katalogtjener"
-
-#: addressbook/gui/component/addressbook.c:544
-msgid "_Search for contacts"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:626
-msgid "Unable to open addressbook"
-msgstr "Kunne ikke åbne adressebogen"
-
-#: addressbook/gui/component/addressbook.c:631
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-"Vi kunne ikke åbne denne adressebog. Dette betyder enten\n"
-"at du har angivet en forkert URI, eller ar du har forsøgt\n"
-"at bruge en LDAP tjeneste men ikke har LDAP understøttelse\n"
-"kompileret ind. Hvis du har angivet en URI, tjek om URI-en \n"
-"er korrekt og genindtast. Hvis ikke, så har du nok prøvet\n"
-"at nå en LDAP tjeneste. Hvis du ønsker at kunne bruge LDAP,\n"
-"er det nødvendigt at hente og installere OpenLDAP og\n"
-"rekompilere og installere evolution.\n"
-
-#: addressbook/gui/component/addressbook.c:914
-#: addressbook/gui/minicard/e-minicard.c:332
-msgid "Save as VCard"
-msgstr "Gem som vCard"
-
-#: addressbook/gui/component/addressbook.c:1016
-msgid "* Click here to add a contact *"
-msgstr "* Klik her for at tilføje en kontakt *"
-
-#: addressbook/gui/component/addressbook.c:1052
-msgid "As _Minicards"
-msgstr "Som _minikort"
-
-#: addressbook/gui/component/addressbook.c:1103
-msgid "The URI that the Folder Browser will display"
-msgstr "Uri'en som mappebladreren vil vise"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "vindue2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "k"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#: addressbook/gui/component/e-ldap-storage.c:88
-msgid "External Directories"
-msgstr "Eksterne kataloger"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "Beskrivelse:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "LDAP-tjener:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Portnummer:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr "Rod DN:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Navn:"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/select-names/select-names.glade.h:7
-msgid "Select Names"
-msgstr "Vælg mappe"
-
-#: addressbook/gui/component/select-names/select-names.glade.h:8
-msgid "Find..."
-msgstr "Find..."
-
-#: addressbook/gui/component/select-names/select-names.glade.h:9
-msgid "Select name from List:"
-msgstr ""
-
-#: addressbook/gui/component/select-names/select-names.glade.h:10
-msgid "Message Recipients"
-msgstr "Modtagerliste:"
-
-#: addressbook/gui/minicard/e-minicard-control.c:276
-msgid "Save in addressbook"
-msgstr "Kunne ikke åbne adressebogen"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"Der er ingen punkter at vise i denne visning\n"
-"\n"
-"Dobbelt-klik her for at oprette en ny kontakt."
-
-#: addressbook/gui/minicard/test-minicard-view.c:100
-msgid "Reflow Test"
-msgstr ""
-
-#: addressbook/gui/minicard/test-minicard-view.c:101
-msgid "Copyright (C) 2000, Helix Code, Inc."
-msgstr "Copyright (C) 2000 Helix Code, Inc."
-
-#: addressbook/gui/minicard/test-minicard-view.c:103
-msgid "This should test the reflow canvas item"
-msgstr ""
-
-#. gtk_signal_connect(fb->search_entry, "changed", search_activate, fb);
-#: addressbook/gui/search/e-addressbook-search-dialog.c:127
-#: mail/folder-browser.c:368
-msgid "Search"
-msgstr "Søg..."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "Sideopsætning:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Stilnavn:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "Smugkig:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "Alternativer"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Inkludér:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "Sektioner:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr "Lige efter hinanden"
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr "Bogstavfaner på siden"
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "Toptekst for hvert bogstav"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "Start på en ny side"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Antal kolonner:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "Blanke skemaer ved slutningen:"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "Skrifttyper"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "Skrifttype..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "Toptekster"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "Krop"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "Skyggelægning"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "Udskriv med gråtoner"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "Format"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Papir"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Type:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr "etiket26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Dimensioner:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Bredde:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Højde:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "Papirkilde:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "Marginer"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Top:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Bund:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Venstre:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Højre:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "Side"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Størrelse:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Orientering"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "Portræt"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "Landskab"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "Toptekst"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "Bundtekst:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "Modsat på lige sider"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "Top-/bundtekst"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:596
-msgid "am"
-msgstr " "
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:595
-msgid "pm"
-msgstr " "
-
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:146
-msgid "Gpilotd calendar conduit"
-msgstr ""
-
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:149
-msgid "Configuration utility for the calendar conduit.\n"
-msgstr ""
-
-#: calendar/conduits/calendar/calendar-conduit.c:399
-#: calendar/conduits/calendar/calendar-conduit.c:1109
-#: calendar/conduits/todo/todo-conduit.c:443
-#: calendar/conduits/todo/todo-conduit.c:1025
-msgid "Error while communicating with calendar server"
-msgstr ""
-
-#: calendar/conduits/calendar/calendar-conduit.c:776
-#: calendar/conduits/calendar/calendar-conduit.c:778
-#: calendar/conduits/todo/todo-conduit.c:707
-#: calendar/conduits/todo/todo-conduit.c:709
-msgid "Could not start gnomecal server"
-msgstr ""
-
-#: calendar/conduits/calendar/calendar-conduit.c:806
-#: calendar/conduits/calendar/calendar-conduit.c:809
-msgid "Could not read pilot's DateBook application block"
-msgstr ""
-
-#: calendar/conduits/todo/todo-conduit-control-applet.c:146
-msgid "Gpilotd todo conduit"
-msgstr ""
-
-#: calendar/conduits/todo/todo-conduit-control-applet.c:149
-msgid "Configuration utility for the todo conduit.\n"
-msgstr ""
-
-#: calendar/conduits/todo/todo-conduit.c:737
-#: calendar/conduits/todo/todo-conduit.c:740
-msgid "Could not read pilot's ToDo application block"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Outline:"
-msgstr "Omrids:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Headings:"
-msgstr "Overskrifter:"
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Empty days:"
-msgstr "Tomme dage:"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Appointments:"
-msgstr "Aftaler:"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "Highlighted day:"
-msgstr "Fremhævet dag:"
-
-#: calendar/gui/calendar-commands.c:64
-msgid "Day numbers:"
-msgstr "Dagnumre:"
-
-#: calendar/gui/calendar-commands.c:65
-msgid "Current day's number:"
-msgstr "Nummer for idag:"
-
-#: calendar/gui/calendar-commands.c:66
-msgid "To-Do item that is not yet due:"
-msgstr "Opgave som ikke skal laves endnu:"
-
-#: calendar/gui/calendar-commands.c:67
-msgid "To-Do item that is due today:"
-msgstr "Opgave som skal laves idag:"
-
-#: calendar/gui/calendar-commands.c:68
-msgid "To-Do item that is overdue:"
-msgstr "Opgave som er overskredet:"
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr "GNOME kalender"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "Gnomes personlige kalender og skema administrator."
-
-#: calendar/gui/calendar-commands.c:401 tests/ui-tests/message-browser.c:676
-msgid "File not found"
-msgstr "Fil ikke fundet"
-
-#: calendar/gui/calendar-commands.c:423
-msgid "Open calendar"
-msgstr "Åbn kalender"
-
-#: calendar/gui/calendar-commands.c:462
-msgid "Save calendar"
-msgstr "Gem kalender"
-
-#: calendar/gui/calendar-commands.c:489 calendar/gui/gncal-todo.c:763
-#: calendar/gui/gncal-todo.c:767
-msgid "Day"
-msgstr "Dag"
-
-#: calendar/gui/calendar-commands.c:489
-msgid "Show 1 day"
-msgstr "Vis én dag"
-
-#: calendar/gui/calendar-commands.c:492
-msgid "5 Days"
-msgstr "Fem dage"
-
-#: calendar/gui/calendar-commands.c:492
-msgid "Show the working week"
-msgstr "Vis arbejdsugen"
-
-#: calendar/gui/calendar-commands.c:495 calendar/gui/gncal-todo.c:762
-msgid "Week"
-msgstr "Uge"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Show 1 week"
-msgstr "Vis én uge"
-
-#: calendar/gui/calendar-commands.c:498
-msgid "Month"
-msgstr "Måned"
-
-#: calendar/gui/calendar-commands.c:498
-msgid "Show 1 month"
-msgstr "Vis én måned"
-
-#: calendar/gui/calendar-commands.c:502
-msgid "Year"
-msgstr "År"
-
-#: calendar/gui/calendar-commands.c:502
-msgid "Show 1 year"
-msgstr "Vis ét år"
-
-#: calendar/gui/calendar-commands.c:511 calendar/gui/calendar-commands.c:663
-msgid "Create a new appointment"
-msgstr "Opret en ny aftale"
-
-#: calendar/gui/calendar-commands.c:516 calendar/gui/calendar-commands.c:655
-msgid "Print this calendar"
-msgstr "Print denne kalender"
-
-#: calendar/gui/calendar-commands.c:520
-msgid "Prev"
-msgstr "Forr."
-
-#: calendar/gui/calendar-commands.c:520
-msgid "Go back in time"
-msgstr "Gå tilbage i tid"
-
-#: calendar/gui/calendar-commands.c:521
-msgid "Today"
-msgstr "I dag"
-
-#: calendar/gui/calendar-commands.c:521
-msgid "Go to present time"
-msgstr "Gå til nutiden"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Next"
-msgstr "Næste"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Go forward in time"
-msgstr "Gå frem i tid"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Go to"
-msgstr "Gå til"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Go to a specific date"
-msgstr "Gå til en specifik dato"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:640
-msgid "New Ca_lendar"
-msgstr "Ny ka_lender"
-
-#: calendar/gui/calendar-commands.c:641
-msgid "Create a new calendar"
-msgstr "Opret en ny kalender"
-
-#: calendar/gui/calendar-commands.c:644
-msgid "Open Ca_lendar"
-msgstr "Åbn k_alender"
-
-#: calendar/gui/calendar-commands.c:645
-msgid "Open a calendar"
-msgstr "Åbn en kalender"
-
-#: calendar/gui/calendar-commands.c:649 calendar/gui/calendar-commands.c:650
-msgid "Save Calendar As"
-msgstr "Gem kalender som"
-
-#: calendar/gui/calendar-commands.c:663
-msgid "_New appointment..."
-msgstr "_Ny aftale..."
-
-#: calendar/gui/calendar-commands.c:671 calendar/gui/prop.c:716
-msgid "Preferences"
-msgstr "Opsætning"
-
-#: calendar/gui/calendar-commands.c:678 calendar/gui/calendar-commands.c:679
-msgid "About Calendar"
-msgstr "Om kalenderen"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:721
-#, c-format
-msgid "%s%s"
-msgstr "%s%s"
-
-#: calendar/gui/calendar-commands.c:721
-msgid "'s calendar"
-msgstr "s kalender"
-
-#: calendar/gui/calendar-model.c:323
-msgid "Public"
-msgstr "Of_fentlig"
-
-#: calendar/gui/calendar-model.c:326
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:27
-msgid "Private"
-msgstr "Privat"
-
-#: calendar/gui/calendar-model.c:329
-msgid "Confidential"
-msgstr "_Fortrolig"
-
-#: calendar/gui/calendar-model.c:332 calendar/gui/calendar-model.c:499
-msgid "Unknown"
-msgstr "Ukendt fejl"
-
-#: calendar/gui/calendar-model.c:419
-msgid "N"
-msgstr "N"
-
-#: calendar/gui/calendar-model.c:419
-msgid "S"
-msgstr "søn"
-
-#: calendar/gui/calendar-model.c:421
-msgid "E"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:421
-msgid "W"
-msgstr "ons"
-
-#: calendar/gui/calendar-model.c:493
-msgid "Transparent"
-msgstr "Gennemsigtig"
-
-#: calendar/gui/calendar-model.c:496
-msgid "Opaque"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:747
-#, c-format
-msgid ""
-"The date must be entered in the format: \n"
-"\n"
-"%s"
-msgstr ""
-"Datoen skal skrives ind på formatet: \n"
-"\n"
-"%s"
-
-#: calendar/gui/calendar-model.c:820
-msgid ""
-"The geographical position must be entered in the format: \n"
-"\n"
-"45.436845,125.862501"
-msgstr ""
-"Den geografiske position skal skrives ind på formatet: \n"
-"\n"
-"45.436845,125.862501"
-
-#: calendar/gui/calendar-model.c:865
-msgid "The percent value must be between 0 and 100"
-msgstr "Procentværdien skal være mellem 0 og 100"
-
-#: calendar/gui/calendar-model.c:898
-msgid "The priority must be between 0 and 10"
-msgstr "Prioriteten skal være mellem 0 og 10"
-
-#: calendar/gui/control-factory.c:132
-msgid "The URI that the calendar will display"
-msgstr "URIen som kalenderen skal vise"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:183
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "Alarm på %A %d %b %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:190
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr "Melding om din aftale på %A %d %b %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:201
-msgid "No summary available."
-msgstr "Intet sammendrag"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "Luk"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1086
-msgid "Snooze"
-msgstr "Udsæt"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "Redigér aftale:"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr "Udsæt-tid (minutter)"
-
-#: calendar/gui/dialogs/task-editor.c:245 calendar/gui/event-editor.c:1209
-msgid "FIXME: _Delete"
-msgstr "_Slet"
-
-#: calendar/gui/dialogs/task-editor.c:287
-#: calendar/gui/dialogs/task-editor.c:295
-msgid "FIXME: In_complete Task"
-msgstr "U_komplet opgave"
-
-#: calendar/gui/dialogs/task-editor.c:347 calendar/gui/event-editor.c:1311
-msgid "FIXME: Chec_k Names"
-msgstr "_Tjek navne"
-
-#: calendar/gui/dialogs/task-editor.c:348 calendar/gui/event-editor.c:1312
-msgid "FIXME: Address _Book..."
-msgstr "Adresse_bog..."
-
-#: calendar/gui/dialogs/task-editor.c:355
-msgid "FIXME: _New Task"
-msgstr "_Ny opgave"
-
-#: calendar/gui/dialogs/task-editor.c:357
-msgid "FIXME: S_end Status Report"
-msgstr "S_end statusrapport"
-
-#: calendar/gui/dialogs/task-editor.c:358
-msgid "FIXME: _Mark Complete"
-msgstr "_Markér som fuldført"
-
-#: calendar/gui/dialogs/task-editor.c:360 calendar/gui/event-editor.c:1321
-msgid "FIXME: Rec_urrence..."
-msgstr "Gen_tagelse"
-
-#: calendar/gui/dialogs/task-editor.c:361
-msgid "FIXME: S_kip Occurrence"
-msgstr "Overspring genta_gelse"
-
-#: calendar/gui/dialogs/task-editor.c:363
-msgid "FIXME: Assig_n Task"
-msgstr "Tildel o_pgave"
-
-#: calendar/gui/dialogs/task-editor.c:365
-msgid "FIXME: _Reply"
-msgstr "Sva_r"
-
-#: calendar/gui/dialogs/task-editor.c:366
-msgid "FIXME: Reply to A_ll"
-msgstr "Svar til a_lle"
-
-#: calendar/gui/dialogs/task-editor.c:409 calendar/gui/event-editor.c:1381
-msgid "FIXME: Save and Close"
-msgstr "Gem og luk"
-
-#: calendar/gui/dialogs/task-editor.c:410
-msgid "Save the task and close the dialog box"
-msgstr "Gem opgaven og luk dialogboksen"
-
-#: calendar/gui/dialogs/task-editor.c:414 calendar/gui/event-editor.c:1386
-msgid "FIXME: Print..."
-msgstr "Udskriv"
-
-#: calendar/gui/dialogs/task-editor.c:419 calendar/gui/event-editor.c:1391
-msgid "FIXME: Recurrence..."
-msgstr "Gentagelse..."
-
-#: calendar/gui/dialogs/task-editor.c:420 calendar/gui/event-editor.c:1392
-msgid "Configure recurrence rules"
-msgstr "Konfigurér regler for gentagelser"
-
-#: calendar/gui/dialogs/task-editor.c:422
-msgid "FIXME: Assign Task..."
-msgstr "Tildel opgave..."
-
-#: calendar/gui/dialogs/task-editor.c:423
-msgid "Assign the task to someone"
-msgstr "Tildel opgaven til nogen"
-
-#: calendar/gui/dialogs/task-editor.c:425 calendar/gui/event-editor.c:1397
-msgid "FIXME: Delete"
-msgstr "Slet"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:7
-msgid "S_ubject:"
-msgstr "E_mne:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:8
-msgid "Owner:"
-msgstr "Ejer:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:9
-msgid "Sta_rt Date:"
-msgstr "Sta_rt dato:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:10
-msgid "_Due Date:"
-msgstr "Slut-_dato:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:11
-msgid "_Status:"
-msgstr "_Status:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:12
-msgid ""
-"Not Started\n"
-"In Progress\n"
-"Completed\n"
-"Cancelled\n"
-msgstr ""
-"Ikke påbegyndt\n"
-"Under udførelse\n"
-"Fuldført\n"
-"Fjernet\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:17
-msgid "Not Started"
-msgstr "Ikke startet"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:18
-msgid "_Priority:"
-msgstr "_Prioritet:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:19
-msgid ""
-"High\n"
-"Normal\n"
-"Low\n"
-msgstr ""
-"Høj\n"
-"Normal\n"
-"Lav\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:23
-msgid "High"
-msgstr "Høj"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:24
-msgid "% Comp_lete:"
-msgstr "% færdi_g:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:25
-msgid "_Contacts..."
-msgstr "_Kontakter..."
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:28
-msgid "Task"
-msgstr "Opgave"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:29
-msgid "Date Completed:"
-msgstr "Fuldført dato:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:30
-msgid "Location:"
-msgstr "Placering:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:31
-msgid "URL:"
-msgstr "URL:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:32
-msgid "Resources:"
-msgstr "Resurser:"
-
-#: calendar/gui/e-calendar-table.c:189
-msgid "Comment"
-msgstr "Kommentar"
-
-#: calendar/gui/e-calendar-table.c:194
-msgid "Completed"
-msgstr "Fuldført"
-
-#: calendar/gui/e-calendar-table.c:199
-msgid "Created"
-msgstr "Oprettet"
-
-#: calendar/gui/e-calendar-table.c:204
-msgid "Description"
-msgstr "Beskrivelse"
-
-#: calendar/gui/e-calendar-table.c:209
-msgid "Timestamp"
-msgstr "Tidsmærking"
-
-#: calendar/gui/e-calendar-table.c:214
-msgid "Start Date"
-msgstr "Start-dato"
-
-#: calendar/gui/e-calendar-table.c:219
-msgid "End Date"
-msgstr "Slut-dato"
-
-#: calendar/gui/e-calendar-table.c:224
-msgid "Geographical Position"
-msgstr "Geografisk placering"
-
-#: calendar/gui/e-calendar-table.c:229
-msgid "Last Modification Date"
-msgstr "Dato for sidste ændring"
-
-#: calendar/gui/e-calendar-table.c:234
-msgid "Location"
-msgstr "Placering"
-
-#: calendar/gui/e-calendar-table.c:239
-msgid "Organizer"
-msgstr "Organisstor"
-
-#: calendar/gui/e-calendar-table.c:244
-msgid "% Complete"
-msgstr "% færdig"
-
-#: calendar/gui/e-calendar-table.c:249 calendar/gui/gncal-todo.c:476
-#: calendar/gui/prop.c:609 mail/message-list.c:508
-msgid "Priority"
-msgstr "Prioritet"
-
-#: calendar/gui/e-calendar-table.c:260
-msgid "TaskPad"
-msgstr "Opgaveblok"
-
-#: calendar/gui/e-calendar-table.c:265
-msgid "URL"
-msgstr "URL"
-
-#: calendar/gui/e-calendar-table.c:270
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "Reminder"
-msgstr "Påmindelse"
-
-#: calendar/gui/e-calendar-table.c:369
-msgid "Open..."
-msgstr "Åbn..."
-
-#: calendar/gui/e-calendar-table.c:370
-msgid "Open the task"
-msgstr "Åbn opgaven"
-
-#: calendar/gui/e-calendar-table.c:372
-msgid "Mark Complete"
-msgstr "Markér som fuldført"
-
-#: calendar/gui/e-calendar-table.c:373
-msgid "Mark the task complete"
-msgstr "Markér opgaven som fuldført"
-
-#: calendar/gui/e-calendar-table.c:376
-msgid "Delete the task"
-msgstr "Slet opgaven"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr "%02i minutters opdeling"
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "Ny aftale..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "Redigér denne aftale..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "Slet denne aftale"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "Gør denne aftale flytbar"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr "Slet denne opføring"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr "Slet alle opføringer"
-
-#: calendar/gui/event-editor.c:294
-msgid "Edit Appointment"
-msgstr "Redigér aftale"
-
-#: calendar/gui/event-editor.c:300
-msgid "No summary"
-msgstr "Ingen sammendrag"
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Appointment - %s"
-msgstr "Aftale - %s"
-
-#: calendar/gui/event-editor.c:309
-#, c-format
-msgid "Task - %s"
-msgstr "Opgave - %s"
-
-#: calendar/gui/event-editor.c:312
-#, c-format
-msgid "Journal entry - %s"
-msgstr "Journalpunkt - %s"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:613 calendar/gui/event-editor.c:717
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1276
-msgid "FIXME: Ca_lendar..."
-msgstr "_Kalender..."
-
-#: calendar/gui/event-editor.c:1319
-msgid "FIXME: _New Appointment"
-msgstr "_Ny aftale"
-
-#: calendar/gui/event-editor.c:1323
-msgid "FIXME: Invite _Attendees..."
-msgstr "Invitér _deltagere..."
-
-#: calendar/gui/event-editor.c:1324
-msgid "FIXME: C_ancel Invitation..."
-msgstr "Annullér invitation"
-
-#: calendar/gui/event-editor.c:1326
-msgid "FIXME: Forward as v_Calendar"
-msgstr "Videresend som v_Calendar"
-
-#: calendar/gui/event-editor.c:1394
-msgid "FIXME: Invite Attendees..."
-msgstr "Invitér deltagere..."
-
-#: calendar/gui/event-editor.c:1395
-msgid "Invite attendees to a meeting"
-msgstr "Invitér deltagere til et møde"
-
-#: calendar/gui/event-editor.c:1838
-msgid "%a %b %d %Y"
-msgstr "%a %d %b %Y"
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr "event-editor-dialog"
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr "_Sammendrag:"
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr "_Ejer:"
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr "Tid"
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr "Start-tid:"
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr "Slut-tid:"
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr "Varer he_le dagen"
-
-#: calendar/gui/event-editor-dialog.glade.h:14
-msgid "Classification"
-msgstr "Klassificering"
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-msgid "Pu_blic"
-msgstr "Of_fentlig"
-
-#: calendar/gui/event-editor-dialog.glade.h:16
-msgid "Pri_vate"
-msgstr "Pri_vat"
-
-#: calendar/gui/event-editor-dialog.glade.h:17
-msgid "_Confidential"
-msgstr "_Fortrolig"
-
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-"Minutter\n"
-"Timer\n"
-"Dage\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "_Display"
-msgstr "_Vis"
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Audio"
-msgstr "_Lyd"
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "_Program"
-msgstr "_Program"
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "_Mail"
-msgstr "_E-post"
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-msgid "Mail _to:"
-msgstr "Send _til:"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Run program:"
-msgstr "Kø_r program:"
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr "Regel for gentagelse"
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:877
-msgid "None"
-msgstr "Ingen"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-msgid "Daily"
-msgstr "Daglig"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr "Ugentlig"
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr "Månedlig"
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr "Årlig"
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr "etiket23"
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr "Hver "
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr "dag(e)"
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr "etiket24"
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr "uge(r)"
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "man"
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "tir"
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "ons"
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "tor"
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "fre"
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "lør"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "søn"
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr "etiket25"
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr "Gentag den"
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr ". dag i måneden"
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-"1.\n"
-"2.\n"
-"3.\n"
-"4.\n"
-"5.\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-"mandag\n"
-"tirsdag\n"
-"onsdag\n"
-"torsdag\n"
-"fredag\n"
-"lørdag\n"
-"søndag\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr "Hver"
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-msgid "month(s)"
-msgstr "måned(er)"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr "år"
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr "etiket27"
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr "Slutdato"
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr "Gentag for altid"
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr "Slut den "
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr "Slut efter"
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr "gentagelser"
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-msgid "Exceptions"
-msgstr "Undtagelser"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-msgid "Change"
-msgstr "Ændr"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr "Gentagelse"
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "januar"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "februar"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "marts"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "april"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "maj"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "juni"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "juli"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "august"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "september"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "sept"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "oktober"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "november"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "december"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "søndag"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "mandag"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "tirsdag"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "tirs"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "onsdag"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "ons"
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "torsdag"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "tor"
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "tors"
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "fredag"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "lørdag"
-
-#: calendar/gui/getdate.y:420 filter/filter-datespec.c:61
-msgid "year"
-msgstr "år"
-
-#: calendar/gui/getdate.y:421 filter/filter-datespec.c:62
-msgid "month"
-msgstr "måned"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr "14-dage"
-
-#: calendar/gui/getdate.y:423 filter/filter-datespec.c:63
-msgid "week"
-msgstr "uge"
-
-#: calendar/gui/getdate.y:424 filter/filter-datespec.c:64
-msgid "day"
-msgstr "dag"
-
-#: calendar/gui/getdate.y:425 filter/filter-datespec.c:65
-msgid "hour"
-msgstr "time"
-
-#: calendar/gui/getdate.y:426 filter/filter-datespec.c:66
-msgid "minute"
-msgstr "minut"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "min"
-
-#: calendar/gui/getdate.y:428 filter/filter-datespec.c:67
-msgid "second"
-msgstr "sekund"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "sek"
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "imorgen"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "igår"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "idag"
-
-#: calendar/gui/getdate.y:438 filter/filter-datespec.c:504
-#: filter/filter-datespec.c:664
-msgid "now"
-msgstr "nu"
-
-#: calendar/gui/getdate.y:439
-msgid "last"
-msgstr "forrige"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr "denne"
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr "næste"
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr "første"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr "tredje"
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr "fjerde"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr "femte"
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr "sjette"
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr "syvende"
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr "ottende"
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr "niende"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr "tiende"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr "elvte"
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr "tolvte"
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr "siden"
-
-#: calendar/gui/gncal-todo.c:167
-msgid "Create to-do item"
-msgstr "Opret opgavepunkt"
-
-#: calendar/gui/gncal-todo.c:167
-msgid "Edit to-do item"
-msgstr "Redigér opgavepunkt"
-
-#: calendar/gui/gncal-todo.c:203
-msgid "Summary:"
-msgstr "Sammendrag:"
-
-#: calendar/gui/gncal-todo.c:214
-msgid "Due Date:"
-msgstr "Færdig-dato:"
-
-#: calendar/gui/gncal-todo.c:225
-msgid "Priority:"
-msgstr "Prioritet:"
-
-#: calendar/gui/gncal-todo.c:243
-msgid "Item Comments:"
-msgstr "Kommentarer for punkt:"
-
-#: calendar/gui/gncal-todo.c:374
-msgid "Add to-do item..."
-msgstr "Tilføj opgavepunkt..."
-
-#: calendar/gui/gncal-todo.c:375
-msgid "Edit this item..."
-msgstr "Redigér denne opføring..."
-
-#: calendar/gui/gncal-todo.c:474
-msgid "Summary"
-msgstr "Sammendrag"
-
-#: calendar/gui/gncal-todo.c:475 calendar/gui/prop.c:608
-msgid "Due Date"
-msgstr "Færdig-dato"
-
-#: calendar/gui/gncal-todo.c:477
-msgid "Time Left"
-msgstr "Tid tilbage"
-
-#. Label
-#: calendar/gui/gncal-todo.c:489
-msgid "To-do list"
-msgstr "Opgaveliste"
-
-#. Add
-#: calendar/gui/gncal-todo.c:528
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Tilføj..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:537
-msgid "Edit..."
-msgstr "Redigér..."
-
-#: calendar/gui/gncal-todo.c:762
-msgid "Weeks"
-msgstr "Uger"
-
-#: calendar/gui/gncal-todo.c:763 calendar/gui/gncal-todo.c:767
-msgid "Days"
-msgstr "Dage"
-
-#: calendar/gui/gncal-todo.c:768 calendar/gui/gncal-todo.c:772
-msgid "Hours"
-msgstr "Timer"
-
-#: calendar/gui/gncal-todo.c:768 calendar/gui/gncal-todo.c:772
-msgid "Hour"
-msgstr "Time"
-
-#: calendar/gui/gncal-todo.c:773 calendar/gui/gncal-todo.c:777
-msgid "Minutes"
-msgstr "Minutter"
-
-#: calendar/gui/gncal-todo.c:773 calendar/gui/gncal-todo.c:777
-msgid "Minute"
-msgstr "Minut"
-
-#: calendar/gui/gncal-todo.c:778 calendar/gui/gncal-todo.c:782
-msgid "Seconds"
-msgstr "Sekunder"
-
-#: calendar/gui/gncal-todo.c:778 calendar/gui/gncal-todo.c:782
-msgid "Second"
-msgstr "Sekund"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1094
-#: calendar/gui/gnome-cal.c:1150
-msgid "Reminder of your appointment at "
-msgstr "Påmindelse om din aftale "
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1099 calendar/gui/gnome-cal.c:1154
-msgid "Ok"
-msgstr "Ok"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "År:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "Gå til dato"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-"Venligst vælg datoen du vil gå til.\n"
-"Når du klikker på en dag vil du flytte\n"
-"dig til denne dato."
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "Gå til idag"
-
-#: calendar/gui/print.c:288
-msgid "1st"
-msgstr "1."
-
-#: calendar/gui/print.c:288
-msgid "2nd"
-msgstr "2."
-
-#: calendar/gui/print.c:288
-msgid "3rd"
-msgstr "3."
-
-#: calendar/gui/print.c:288
-msgid "4th"
-msgstr "4."
-
-#: calendar/gui/print.c:288
-msgid "5th"
-msgstr "5."
-
-#: calendar/gui/print.c:289
-msgid "6th"
-msgstr "6."
-
-#: calendar/gui/print.c:289
-msgid "7th"
-msgstr "7."
-
-#: calendar/gui/print.c:289
-msgid "8th"
-msgstr "8."
-
-#: calendar/gui/print.c:289
-msgid "9th"
-msgstr "9."
-
-#: calendar/gui/print.c:289
-msgid "10th"
-msgstr "10."
-
-#: calendar/gui/print.c:290
-msgid "11th"
-msgstr "11."
-
-#: calendar/gui/print.c:290
-msgid "12th"
-msgstr "12."
-
-#: calendar/gui/print.c:290
-msgid "13th"
-msgstr "13."
-
-#: calendar/gui/print.c:290
-msgid "14th"
-msgstr "14."
-
-#: calendar/gui/print.c:290
-msgid "15th"
-msgstr "15."
-
-#: calendar/gui/print.c:291
-msgid "16th"
-msgstr "16."
-
-#: calendar/gui/print.c:291
-msgid "17th"
-msgstr "17."
-
-#: calendar/gui/print.c:291
-msgid "18th"
-msgstr "18."
-
-#: calendar/gui/print.c:291
-msgid "19th"
-msgstr "19."
-
-#: calendar/gui/print.c:291
-msgid "20th"
-msgstr "20."
-
-#: calendar/gui/print.c:292
-msgid "21st"
-msgstr "21."
-
-#: calendar/gui/print.c:292
-msgid "22nd"
-msgstr "22."
-
-#: calendar/gui/print.c:292
-msgid "23rd"
-msgstr "23."
-
-#: calendar/gui/print.c:292
-msgid "24th"
-msgstr "24."
-
-#: calendar/gui/print.c:292
-msgid "25th"
-msgstr "25."
-
-#: calendar/gui/print.c:293
-msgid "26th"
-msgstr "26."
-
-#: calendar/gui/print.c:293
-msgid "27th"
-msgstr "27."
-
-#: calendar/gui/print.c:293
-msgid "28th"
-msgstr "28."
-
-#: calendar/gui/print.c:293
-msgid "29th"
-msgstr "29."
-
-#: calendar/gui/print.c:293
-msgid "30th"
-msgstr "30."
-
-#: calendar/gui/print.c:294
-msgid "31st"
-msgstr "31."
-
-#: calendar/gui/print.c:349
-msgid "Su"
-msgstr "søn"
-
-#: calendar/gui/print.c:349
-msgid "Mo"
-msgstr "man"
-
-#: calendar/gui/print.c:349
-msgid "Tu"
-msgstr "tir"
-
-#: calendar/gui/print.c:349
-msgid "We"
-msgstr "ons"
-
-#: calendar/gui/print.c:349
-msgid "Th"
-msgstr "tor"
-
-#: calendar/gui/print.c:349
-msgid "Fr"
-msgstr "fre"
-
-#: calendar/gui/print.c:349
-msgid "Sa"
-msgstr "lør"
-
-#: calendar/gui/print.c:937
-msgid "TODO Items"
-msgstr "Opgavepunkter"
-
-#. Day
-#: calendar/gui/print.c:1038
-msgid "Current day (%a %b %d %Y)"
-msgstr "I dag (%a %d %b %Y)"
-
-#: calendar/gui/print.c:1058 calendar/gui/print.c:1072
-#: calendar/gui/print.c:1073
-msgid "%a"
-msgstr "%a"
-
-#: calendar/gui/print.c:1059 calendar/gui/print.c:1060
-#: calendar/gui/print.c:1074 calendar/gui/print.c:1075
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1062
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "Denne uge (%s %s %d - %s %d %d)"
-
-#: calendar/gui/print.c:1079
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "Denne uge (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1085
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "Denne uge (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1098
-msgid "Current month (%a %Y)"
-msgstr "Denne måned (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1105
-msgid "Current year (%Y)"
-msgstr "Dette år (%Y)"
-
-#: calendar/gui/print.c:1142
-msgid "Print Calendar"
-msgstr "Udskriv kalender"
-
-#: calendar/gui/print.c:1307
-msgid "Print Preview"
-msgstr "Forhåndsvisning af udskrift"
-
-#: calendar/gui/prop.c:334
-msgid "Time display"
-msgstr "Tidsvisning"
-
-#. Time format
-#: calendar/gui/prop.c:338
-msgid "Time format"
-msgstr "Tidsformat"
-
-#: calendar/gui/prop.c:339
-msgid "12-hour (AM/PM)"
-msgstr "12 timer (AM/PM)"
-
-#: calendar/gui/prop.c:340
-msgid "24-hour"
-msgstr "24 timer"
-
-#. Weeks start on
-#: calendar/gui/prop.c:350
-msgid "Weeks start on"
-msgstr "Ugen starter med"
-
-#: calendar/gui/prop.c:351
-msgid "Sunday"
-msgstr "søndag"
-
-#: calendar/gui/prop.c:352
-msgid "Monday"
-msgstr "mandag"
-
-#. Day range
-#: calendar/gui/prop.c:362
-msgid "Day range"
-msgstr "Tidsspænd"
-
-#: calendar/gui/prop.c:373
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-"Venligst vælg start og slut-tidene du ønsker\n"
-"der skal vises i dagvisningen og ugevisningen.\n"
-"Tider udenfor dette område vil ikke vises\n"
-"som standard."
-
-#: calendar/gui/prop.c:389
-msgid "Day start:"
-msgstr "Dagens start:"
-
-#: calendar/gui/prop.c:400
-msgid "Day end:"
-msgstr "Dagens slutning:"
-
-#: calendar/gui/prop.c:523
-msgid "Colors for display"
-msgstr "Farver i visning"
-
-#: calendar/gui/prop.c:526
-msgid "Colors"
-msgstr "Farver"
-
-#: calendar/gui/prop.c:603
-msgid "Show on TODO List:"
-msgstr "Vis på opgavelisten:"
-
-#: calendar/gui/prop.c:610
-msgid "Time Until Due"
-msgstr "Tid til afslutning"
-
-#: calendar/gui/prop.c:641
-msgid "To Do List style options:"
-msgstr "Alternativer for stil for opgaveliste:"
-
-#: calendar/gui/prop.c:646
-msgid "Highlight overdue items"
-msgstr "Fremhæv overskredne opgaver"
-
-#: calendar/gui/prop.c:649
-msgid "Highlight not yet due items"
-msgstr "Fremhæv opføringer som ikke skal afsluttes endnu"
-
-#: calendar/gui/prop.c:652
-msgid "Highlight items due today"
-msgstr "Fremhæv punkter som skal afsluttes idag"
-
-#: calendar/gui/prop.c:682
-msgid "To Do List Properties"
-msgstr "Egenskaber for opgaveliste"
-
-#: calendar/gui/prop.c:685
-msgid "To Do List"
-msgstr "Opgaveliste"
-
-#: calendar/gui/prop.c:784
-msgid "Alarms"
-msgstr "Alarmer"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:787
-msgid "Alarm Properties"
-msgstr "Egenskaber for alarmer"
-
-#: calendar/gui/prop.c:797
-msgid "Beep on display alarms"
-msgstr "Dyt ved visning af alarmer"
-
-#: calendar/gui/prop.c:807
-msgid "Audio alarms timeout after"
-msgstr "Tidsafbrud for lydalarmer"
-
-#: calendar/gui/prop.c:818 calendar/gui/prop.c:835
-msgid " seconds"
-msgstr " sekunder"
-
-#: calendar/gui/prop.c:824
-msgid "Enable snoozing for "
-msgstr "Slå udsættelse til for "
-
-#. populate default frame/box
-#: calendar/gui/prop.c:840
-msgid "Defaults"
-msgstr "Forvalg"
-
-#: composer/e-msg-composer-address-dialog.c:182
-msgid "Cut"
-msgstr "Klip"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut selected item into clipboard"
-msgstr "Klip valgt punkt ud til klippebordet"
-
-#: composer/e-msg-composer-address-dialog.c:186
-#: mail/folder-browser-factory.c:46
-msgid "Copy"
-msgstr "Kopiér"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy selected item into clipboard"
-msgstr "Kopiér valgt punkt til klippebordet"
-
-#: composer/e-msg-composer-address-dialog.c:190
-#: composer/e-msg-composer-address-dialog.c:198
-msgid "Paste"
-msgstr "Indsæt"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste item from clipboard"
-msgstr "Indsæt fra klippebordet"
-
-#: composer/e-msg-composer-address-dialog.c:525
-msgid "Select recipients' addresses"
-msgstr "Vælg modtagernes adresser"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Modtagerliste:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Søg..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Navn"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-#: mail/mail-config.glade.h:8
-msgid "Address"
-msgstr "Adresse"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Egenskaber..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "Til: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "etiket9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "etiket7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "etiket8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u byte"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fk"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Vedhæft bilag"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Fjern"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Fjern valgte punkter fra bilagslisten"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Vedhæft bilag..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Vedhæft bilag til meddelelsen"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "Egenskaber for bilag"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "MIME-type:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "Filnavn:"
-
-#: composer/e-msg-composer-hdrs.c:137 composer/e-msg-composer-hdrs.c:295
-msgid "From:"
-msgstr "Fra:"
-
-#: composer/e-msg-composer-hdrs.c:243
-msgid "Click here for the address book"
-msgstr "Klik her for adressebogen"
-
-#: composer/e-msg-composer-hdrs.c:296
-msgid "Enter the identitiy you wish to send this message from"
-msgstr "Indtast den identitet som du ønsker at sende denne meddelelse som"
-
-#: composer/e-msg-composer-hdrs.c:300
-msgid "To:"
-msgstr "Til:"
-
-#: composer/e-msg-composer-hdrs.c:301
-msgid "Enter the recipients of the message"
-msgstr "Indtast modtagerne for meddelelsen"
-
-#: composer/e-msg-composer-hdrs.c:305
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:306
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Indtast adresserne som skal modtage en kopi af meddelelsen"
-
-#: composer/e-msg-composer-hdrs.c:311
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:312
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Indtast adresserne som skal modtage en kopi af meddelelsen uden at komme til "
-"syne i meddelelsens modtagerliste."
-
-#: composer/e-msg-composer-hdrs.c:318
-msgid "Subject:"
-msgstr "Emne:"
-
-#: composer/e-msg-composer-hdrs.c:319
-msgid "Enter the subject of the mail"
-msgstr "Indtast emnet for meddelelsen"
-
-#: composer/e-msg-composer.c:451
-msgid "Save as..."
-msgstr "Gem som..."
-
-#: composer/e-msg-composer.c:462
-#, c-format
-msgid "Error saving file: %s"
-msgstr "Fejl ved gemning af fil: %s"
-
-#: composer/e-msg-composer.c:482
-#, c-format
-msgid "Error loading file: %s"
-msgstr "Fejl ved indlæsning af fil: %s"
-
-#: composer/e-msg-composer.c:504
-msgid "Saving changes to message..."
-msgstr "Gem ændringer til meddelelse..."
-
-#: composer/e-msg-composer.c:506
-msgid "About to save changes to message..."
-msgstr "Ved at gemme ændringer til meddelelse..."
-
-#: composer/e-msg-composer.c:590 shell/e-shell-view-menu.c:165
-msgid "Evolution"
-msgstr "Evolution"
-
-#: composer/e-msg-composer.c:596
-msgid ""
-"This message has not been sent.\n"
-"\n"
-"Do you wish to save your changes?"
-msgstr ""
-"Denne meddelelse er ikke sendt.\n"
-"\n"
-"Vil du gemme ændringene?"
-
-#: composer/e-msg-composer.c:618
-msgid "Open file"
-msgstr "Åbn fil"
-
-#: composer/e-msg-composer.c:730
-msgid "That file does not exist."
-msgstr "Den fil eksisterer ikke."
-
-#: composer/e-msg-composer.c:740
-msgid "That is not a regular file."
-msgstr "Dette er ikke en almindelig fil."
-
-#: composer/e-msg-composer.c:750
-msgid "That file exists but is not readable."
-msgstr "Den fil eksisterer men kan ikke læses."
-
-#: composer/e-msg-composer.c:760
-msgid "That file appeared accesible but open(2) failed."
-msgstr "Den fil så ud til at være tilgængelig, men open(2) fejlede."
-
-#: composer/e-msg-composer.c:782
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"Filen er meget stor (mere end 100 k).\n"
-"Er du sikker på at du ønsker at indsætte den?"
-
-#: composer/e-msg-composer.c:803
-msgid "An error occurred while reading the file."
-msgstr "En fejl skete ved læsning af filen."
-
-#: composer/e-msg-composer.c:899 shell/e-shell-view-menu.c:434
-msgid "_File"
-msgstr "_Fil"
-
-#: composer/e-msg-composer.c:905
-msgid "_Open..."
-msgstr "_Åbn..."
-
-#: composer/e-msg-composer.c:906
-msgid "Load a previously saved message"
-msgstr "Indlæs en tidligere gemt meddelse"
-
-#: composer/e-msg-composer.c:914
-msgid "_Save..."
-msgstr "Gem..."
-
-#: composer/e-msg-composer.c:915
-msgid "Save message"
-msgstr "Gem meddelelsen"
-
-#: composer/e-msg-composer.c:923
-msgid "_Save as..."
-msgstr "_Gem som..."
-
-#: composer/e-msg-composer.c:924
-msgid "Save message with a different name"
-msgstr "Gem meddelelse med et andet navn"
-
-#: composer/e-msg-composer.c:932
-msgid "Save in _folder..."
-msgstr "Gem i _mappe..."
-
-#: composer/e-msg-composer.c:933
-msgid "Save the message in a specified folder"
-msgstr "Gem meddelelsen i en specificeret mappe"
-
-#: composer/e-msg-composer.c:942
-msgid "_Insert text file... (FIXME)"
-msgstr "_Indsæt tekstfil..."
-
-#: composer/e-msg-composer.c:943
-msgid "Insert a file as text into the message"
-msgstr "Indsæt en fil som tekst i meddelelsen"
-
-#: composer/e-msg-composer.c:952
-msgid "_Send"
-msgstr "_Send"
-
-#: composer/e-msg-composer.c:953
-msgid "Send the message"
-msgstr "Send meddelelsen"
-
-#: composer/e-msg-composer.c:963
-msgid "_Close..."
-msgstr "_Luk..."
-
-#: composer/e-msg-composer.c:964
-msgid "Quit the message composer"
-msgstr "Afslut meddelsesskriver"
-
-#: composer/e-msg-composer.c:977 shell/e-shell-view-menu.c:478
-msgid "_Edit"
-msgstr "_Redigér"
-
-#: composer/e-msg-composer.c:988
-msgid "_Format"
-msgstr "_Format"
-
-#: composer/e-msg-composer.c:994
-msgid "HTML"
-msgstr "HTML"
-
-#: composer/e-msg-composer.c:995
-msgid "Send the mail in HTML format"
-msgstr "Send brevet i HTML format"
-
-#: composer/e-msg-composer.c:1008 mail/folder-browser-factory.c:185
-#: shell/e-shell-view-menu.c:383 shell/e-shell-view-menu.c:489
-#: shell/e-storage-set-view.c:242
-msgid "_View"
-msgstr "_Vis"
-
-#: composer/e-msg-composer.c:1014
-msgid "Show _attachments"
-msgstr "Vis _bilag"
-
-#: composer/e-msg-composer.c:1015
-msgid "Show/hide attachments"
-msgstr "Vis/skjul bilag"
-
-#: composer/e-msg-composer.c:1048
-msgid "Send"
-msgstr "Send"
-
-#: composer/e-msg-composer.c:1049
-msgid "Send this message"
-msgstr "Send denne meddelelse"
-
-#: composer/e-msg-composer.c:1058
-msgid "Attach"
-msgstr "Vedhæft"
-
-#: composer/e-msg-composer.c:1059
-msgid "Attach a file"
-msgstr "Vedhæft en fil"
-
-#: composer/e-msg-composer.c:1246
-msgid "Compose a message"
-msgstr "Skriv en meddelelse"
-
-#: filter/filter-datespec.c:61
-msgid "years"
-msgstr "år"
-
-#: filter/filter-datespec.c:62
-msgid "months"
-msgstr "måneder"
-
-#: filter/filter-datespec.c:63
-msgid "weeks"
-msgstr "uger"
-
-#: filter/filter-datespec.c:64
-msgid "days"
-msgstr "dage"
-
-#: filter/filter-datespec.c:65
-msgid "hours"
-msgstr "timer"
-
-#: filter/filter-datespec.c:66
-msgid "minutes"
-msgstr "minutter"
-
-#: filter/filter-datespec.c:67
-msgid "seconds"
-msgstr "sekunder"
-
-#: filter/filter-datespec.c:232
-msgid ""
-"The message's date will be compared against\n"
-"whatever the time is when the filter is run\n"
-"or vfolder is opened."
-msgstr ""
-
-#: filter/filter-datespec.c:254
-msgid ""
-"The message's date will be compared against\n"
-"the time that you specify here."
-msgstr ""
-
-#: filter/filter-datespec.c:293
-msgid ""
-"The message's date will be compared against\n"
-"a time relative to when the filter is run;\n"
-"\"a week ago\", for example."
-msgstr ""
-
-#. keep in sync with FilterDatespec_type!
-#: filter/filter-datespec.c:328
-msgid "the current time"
-msgstr "den aktuelle tid"
-
-#: filter/filter-datespec.c:328
-msgid "a time you specify"
-msgstr "et tidspunkt du angiver"
-
-#: filter/filter-datespec.c:329
-msgid "a time relative to the current time"
-msgstr "et tidspunkt relativt til den aktuelle tid"
-
-#. The label
-#: filter/filter-datespec.c:387
-msgid "Compare against"
-msgstr "Sammenlign med"
-
-#: filter/filter-datespec.c:661
-msgid "<click here to select a date>"
-msgstr "<klik her for at vælge en mappe>"
-
-#: filter/filter-editor.c:156 filter/score-editor.c:126
-#: filter/vfolder-editor.c:152
-msgid "Add Rule"
-msgstr "Tilføj regel"
-
-#: filter/filter-editor.c:188
-msgid "Edit Rule"
-msgstr "Redigér regel"
-
-#: filter/filter-filter.c:397 filter/filter-rule.c:534
-msgid "Less"
-msgstr "Mindre"
-
-#: filter/filter-filter.c:400 filter/filter-rule.c:537
-msgid "More"
-msgstr "Mere"
-
-#: filter/filter-folder.c:183 filter/vfolder-rule.c:269
-msgid "Select Folder"
-msgstr "Vælg mappe"
-
-#: filter/filter-folder.c:205
-msgid "Enter folder URI"
-msgstr ""
-
-#: filter/filter-folder.c:247
-msgid "<click here to select a folder>"
-msgstr "<klik her for at vælge en mappe>"
-
-#: filter/filter-part.c:420
-msgid "Test"
-msgstr "Test"
-
-#: filter/score-editor.c:160
-msgid "Edit Score Rule"
-msgstr "Redigér skoringsregel"
-
-#: filter/vfolder-editor.c:186
-msgid "Edit VFolder Rule"
-msgstr ""
-
-#: mail/component-factory.c:187
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Kan ikke initialisere Evolutions e-postkomponent."
-
-#: mail/folder-browser-factory.c:33
-msgid "Get mail"
-msgstr "Hent post"
-
-#: mail/folder-browser-factory.c:33
-msgid "Check for new mail"
-msgstr "Tjek for ny e-post"
-
-#: mail/folder-browser-factory.c:34
-msgid "Compose"
-msgstr "Skriv"
-
-#: mail/folder-browser-factory.c:34
-msgid "Compose a new message"
-msgstr "Skriv en ny meddelelse"
-
-#. GNOMEUIINFO_ITEM_STOCK (N_("Save"), N_("Save this message"),
-#. save_msg, GNOME_STOCK_PIXMAP_SAVE),
-#: mail/folder-browser-factory.c:38 mail/mail-view.c:135
-msgid "Reply"
-msgstr "Svar"
-
-#: mail/folder-browser-factory.c:38 mail/mail-view.c:135
-msgid "Reply to the sender of this message"
-msgstr "Svar til afsenderen af denne meddelelse"
-
-#: mail/folder-browser-factory.c:39 mail/mail-view.c:138
-msgid "Reply to All"
-msgstr "Svar til alle"
-
-#: mail/folder-browser-factory.c:39 mail/mail-view.c:138
-msgid "Reply to all recipients of this message"
-msgstr "Svar til alle modtagere af denne meddelelse"
-
-#: mail/folder-browser-factory.c:41 mail/mail-view.c:141
-msgid "Forward"
-msgstr "Videresend"
-
-#: mail/folder-browser-factory.c:41 mail/mail-view.c:141
-msgid "Forward this message"
-msgstr "Videresend denne meddelelse"
-
-#: mail/folder-browser-factory.c:45
-msgid "Move"
-msgstr "Flyt"
-
-#: mail/folder-browser-factory.c:45
-msgid "Move message to a new folder"
-msgstr "Flyt meddelelsen til en ny mappe"
-
-#: mail/folder-browser-factory.c:46
-msgid "Copy message to a new folder"
-msgstr "Kopiér meddelesen til en ny mappe"
-
-#: mail/folder-browser-factory.c:48 mail/mail-view.c:145
-msgid "Print the selected message"
-msgstr "Udskriv den valgte meddelelse"
-
-#: mail/folder-browser-factory.c:50 mail/mail-view.c:147
-msgid "Delete this message"
-msgstr "Slet denne meddelelse"
-
-#: mail/folder-browser-factory.c:71
-#, c-format
-msgid "Run filter \"%s\""
-msgstr "Kør filter '%s'"
-
-#: mail/folder-browser-factory.c:127
-msgid "_Threaded Message List"
-msgstr "_Trådet meddelelsesliste"
-
-#: mail/folder-browser-factory.c:137
-msgid "_Print Message"
-msgstr "Udskriv meddelelse"
-
-#: mail/folder-browser-factory.c:146
-msgid "F_older"
-msgstr "_Mappe"
-
-#: mail/folder-browser-factory.c:152
-msgid "_Mark all as Read"
-msgstr "_Markér alle meddelelser som læst"
-
-#: mail/folder-browser-factory.c:158
-msgid "_Expunge"
-msgstr "_Udslet"
-
-#: mail/folder-browser-factory.c:165
-msgid "_Configure Folder"
-msgstr "_Konfigurér mappe"
-
-#: mail/folder-browser-factory.c:172
-msgid "_Message"
-msgstr "_Meddelelse"
-
-#: mail/folder-browser-factory.c:178
-msgid "E_dit"
-msgstr "Redigér"
-
-#: mail/folder-browser-factory.c:192
-msgid "Mail _Filters ..."
-msgstr "Post_filtre ..."
-
-#: mail/folder-browser-factory.c:199
-msgid "_vFolder Editor ..."
-msgstr "_VFolder redigering ..."
-
-#: mail/folder-browser-factory.c:206
-msgid "_Mail Configuration ..."
-msgstr "_Post konfiguration ..."
-
-#: mail/folder-browser-factory.c:213
-msgid "Forget _Passwords"
-msgstr "Glem _adgangskoder"
-
-#: mail/folder-browser.c:371
-msgid "Save"
-msgstr "Gem"
-
-#: mail/mail-callbacks.c:134
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-"Denne meddelse har intet emne.\n"
-"Skal den sendes alligevel?"
-
-#: mail/mail-callbacks.c:166
-msgid ""
-"You need to configure an identity\n"
-"before you can send mail."
-msgstr ""
-"Du skal konfigurere en identitet\n"
-"før du kan sende post."
-
-#: mail/mail-callbacks.c:182
-msgid ""
-"You need to configure a mail transport\n"
-"before you can send mail."
-msgstr ""
-"Du skal konfigurere en post-transport\n"
-"før du kan sende e-post."
-
-#: mail/mail-callbacks.c:389
-msgid "Move message(s) to"
-msgstr "Flyt meddelelse(r) til"
-
-#: mail/mail-callbacks.c:391
-msgid "Copy message(s) to"
-msgstr "Kopiér meddelelse(r) til"
-
-#: mail/mail-callbacks.c:448
-msgid ""
-"You may only edit messages saved\n"
-"in the Drafts folder."
-msgstr ""
-
-#: mail/mail-callbacks.c:536
-#, c-format
-msgid ""
-"Error loading filter information:\n"
-"%s"
-msgstr ""
-"Fejl ved indlæsning af filter information:\n"
-"%s"
-
-#: mail/mail-config-gui.c:431
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-"Angiv dit navn og epost-adresse som skal bruges i udgående post. Du kan også "
-"eventuelt angive navnet på din organisation, og navnet på den fil som din "
-"signatur kan læses fra."
-
-#: mail/mail-config-gui.c:444
-msgid "Full name:"
-msgstr "Fulde navn:"
-
-#: mail/mail-config-gui.c:468
-msgid "Email address:"
-msgstr "E-post adresse:"
-
-#: mail/mail-config-gui.c:483
-msgid "Organization:"
-msgstr "Organisation:"
-
-#: mail/mail-config-gui.c:494
-msgid "Signature file:"
-msgstr "Signaturfil:"
-
-#: mail/mail-config-gui.c:499 mail/mail-config.glade.h:10
-msgid "Signature File"
-msgstr "Signaturfil"
-
-#: mail/mail-config-gui.c:898
-msgid "Server:"
-msgstr "Tjener:"
-
-#: mail/mail-config-gui.c:904
-msgid "Username:"
-msgstr "Brugernavn:"
-
-#: mail/mail-config-gui.c:910
-msgid "Path:"
-msgstr "Sti:"
-
-#: mail/mail-config-gui.c:918
-msgid "Authentication:"
-msgstr "Autentisering:"
-
-#: mail/mail-config-gui.c:930
-msgid "Detect supported types..."
-msgstr "Søg efter understøttede typer..."
-
-#: mail/mail-config-gui.c:955
-msgid "Don't delete messages from server"
-msgstr "Slet ikke meddelser fra server"
-
-#: mail/mail-config-gui.c:967
-msgid "Test Settings"
-msgstr "Test-opsætning"
-
-#: mail/mail-config-gui.c:1099 mail/mail-config-gui.c:1147
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"vælg den type postprogram du har, og angiv den relevante information om "
-"det,\n"
-"\n"
-"Hvis tjenesten behøver autentifikation kan du klikke på knappen med 'find "
-"understøttede typer' efter at have angivet de andre informationer."
-
-#: mail/mail-config-gui.c:1123
-msgid ""
-"Select the kind of news server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"Vælg den type postprogram du har, og angiv den relevante information om "
-"det,\n"
-"\n"
-"Hvis tjenesten behøver autentifikation kan du klikke på knappen med 'find "
-"understøttede typer' efter at have angivet de andre informationer."
-
-#: mail/mail-config-gui.c:1142
-msgid "Mail transport type:"
-msgstr "E-post-transport type:"
-
-#: mail/mail-config-gui.c:1197
-msgid "Edit Identity"
-msgstr "Redigér identitet"
-
-#: mail/mail-config-gui.c:1199
-msgid "Add Identity"
-msgstr "Tilføj identitet"
-
-#: mail/mail-config-gui.c:1293
-msgid "Edit Source"
-msgstr "Redigér kilde"
-
-#: mail/mail-config-gui.c:1295
-msgid "Add Source"
-msgstr "Tilføj kilde"
-
-#: mail/mail-config-gui.c:1392
-msgid "Edit News Server"
-msgstr "Redigér nyhedsserver"
-
-#: mail/mail-config-gui.c:1394
-msgid "Add News Server"
-msgstr "Tilføj nyhedsserver"
-
-#: mail/mail-config-gui.c:2243
-msgid "The connection was successful!"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config.glade.h:7 mail/mail-config.glade.h:14
-msgid "Identities"
-msgstr "Identiteter"
-
-#: mail/mail-config.glade.h:9
-msgid "Organization"
-msgstr "Organisation"
-
-#: mail/mail-config.glade.h:12 mail/mail-config.glade.h:17
-#: mail/mail-config.glade.h:23
-msgid "Edit"
-msgstr "Redigér"
-
-#: mail/mail-config.glade.h:15
-msgid "Sources"
-msgstr "Kilder"
-
-#: mail/mail-config.glade.h:19
-msgid "Mail Sources"
-msgstr "E-post-kilder"
-
-#: mail/mail-config-druid.glade.h:15 mail/mail-config.glade.h:20
-msgid "Mail Transport"
-msgstr "E-post-transport"
-
-#: mail/mail-config.glade.h:21
-msgid "News Servers"
-msgstr "News-tjenere"
-
-#: mail/mail-config.glade.h:25
-msgid "News Sources"
-msgstr "News-kilder"
-
-#: mail/mail-config.glade.h:26
-msgid "Send messages in HTML format"
-msgstr "Send meddelser i HTML-format"
-
-#: mail/mail-config.glade.h:27
-msgid "Mark message as seen [ms]: "
-msgstr "_Markér alle meddelser som læst"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config-druid.glade.h:7 mail/mail-config-druid.glade.h:8
-#: mail/mail-config-druid.glade.h:16
-msgid "Mail Configuration"
-msgstr "E-post-konfiguration"
-
-#: mail/mail-config-druid.glade.h:9
-msgid ""
-"Welcome to the Evolution Mail configuration wizard!\n"
-"By filling in some information about your email\n"
-"settings, you can start sending and receiving email\n"
-"right away. Click Next to continue."
-msgstr ""
-"Velkommen til Evolution E-post-konfigurationsdruiden!\n"
-"Ved at udfylde lidt information om dine e-post-\n"
-"indstillinger kan du begynde at sende og modtage e-post\n"
-"med det samme. Klik næste for at fortsætte."
-
-#: mail/mail-config-druid.glade.h:13
-msgid "Identity"
-msgstr "Identitet"
-
-#: mail/mail-config-druid.glade.h:14
-msgid "Mail Source"
-msgstr "E-post-kilde"
-
-#: mail/mail-config-druid.glade.h:17
-msgid ""
-"Your email configuration is now complete.\n"
-"Click \"Finish\" to save your new settings"
-msgstr ""
-"Din e-post-konfiguration er nu komplet.\n"
-"Klik \"Fuldfør\" for at gemme dine nye indstillinger"
-
-#: mail/mail-crypto.c:338 mail/mail-crypto.c:418
-msgid "Please enter your PGP/GPG passphrase."
-msgstr "Venligst indtast din PGP/GPG adgangsfrase"
-
-#: mail/mail-crypto.c:342 mail/mail-crypto.c:422
-msgid "No password provided."
-msgstr "Ingen adgangskode oplyst."
-
-#: mail/mail-crypto.c:348 mail/mail-crypto.c:428
-#, c-format
-msgid "Couldn't create pipe to GPG/PGP: %s"
-msgstr "Kunne ikke oprette rør til GPG/PGP: %s"
-
-#: mail/mail-local.c:257
-#, c-format
-msgid "Changing folder \"%s\" to \"%s\" format"
-msgstr "Ændrer mappe \"%s\" til \"%s\" format"
-
-#: mail/mail-local.c:261
-#, c-format
-msgid "Change folder \"%s\" to \"%s\" format"
-msgstr "Ændr mappe \"%s\" til \"%s\" format"
-
-#: mail/mail-ops.c:74
-#, c-format
-msgid "Fetching email from %s"
-msgstr "Henter e-post fra %s"
-
-#: mail/mail-ops.c:76
-#, c-format
-msgid "Fetch email from %s"
-msgstr "Hent e-post fra %s"
-
-#: mail/mail-ops.c:87
-msgid "You have no remote mail source configured to fetch mail from."
-msgstr ""
-
-#: mail/mail-ops.c:97
-msgid "Bad folder passed to fetch_mail"
-msgstr ""
-
-#: mail/mail-ops.c:165
-msgid "There is no new mail."
-msgstr "Tjek for ny e-post"
-
-#: mail/mail-ops.c:234
-#, c-format
-msgid "Sending \"%s\""
-msgstr "Sender '%s'"
-
-#: mail/mail-ops.c:239
-msgid "Sending a message without a subject"
-msgstr ""
-
-#: mail/mail-ops.c:242
-#, c-format
-msgid "Send \"%s\""
-msgstr "Send '%s'"
-
-#: mail/mail-ops.c:245
-msgid "Send a message without a subject"
-msgstr "Send meddelelsen uden et emne"
-
-#: mail/mail-ops.c:410
-#, c-format
-msgid "Expunging \"%s\""
-msgstr "_Fjerner '%s'"
-
-#: mail/mail-ops.c:412
-#, c-format
-msgid "Expunge \"%s\""
-msgstr "_Fjern '%s'"
-
-#: mail/mail-ops.c:484
-#, c-format
-msgid "Moving messages from \"%s\" into \"%s\""
-msgstr "Flytter meddelelser fra '%s' til '%s'"
-
-#: mail/mail-ops.c:486
-#, c-format
-msgid "Copying messages from \"%s\" into \"%s\""
-msgstr "Kopierer meddelelser fra '%s' til '%s'"
-
-#: mail/mail-ops.c:489
-#, c-format
-msgid "Move messages from \"%s\" into \"%s\""
-msgstr "Flyt meddelelser fra '%s' til '%s'"
-
-#: mail/mail-ops.c:491
-#, c-format
-msgid "Copy messages from \"%s\" into \"%s\""
-msgstr "Kopiér meddelelser fra '%s' til '%s'"
-
-#: mail/mail-ops.c:637
-#, c-format
-msgid "Marking messages in folder \"%s\""
-msgstr "Markerer meddelelser i mappe '%s'"
-
-#: mail/mail-ops.c:640
-#, c-format
-msgid "Mark messages in folder \"%s\""
-msgstr "Markér meddelelser i mappe '%s'"
-
-#: mail/mail-ops.c:769
-#, c-format
-msgid "Scanning folders in \"%s\""
-msgstr "Skanner mapper i '%s'"
-
-#: mail/mail-ops.c:772
-#, c-format
-msgid "Scan folders in \"%s\""
-msgstr "Skan mapper i '%s'"
-
-#: mail/mail-ops.c:859
-msgid "(No description)"
-msgstr "(Ingen beskrivelse)"
-
-#: mail/mail-ops.c:922
-#, c-format
-msgid "Attaching messages from folder \"%s\""
-msgstr "Vedhæfter bilag fra mappe '%s'"
-
-#: mail/mail-ops.c:925
-#, c-format
-msgid "Attach messages from \"%s\""
-msgstr "Vedhæft bilag fra '%s'"
-
-#: mail/mail-ops.c:1051
-#, c-format
-msgid "Forwarding messages \"%s\""
-msgstr "Videresender meddelelser '%s'"
-
-#: mail/mail-ops.c:1056
-msgid "Forwarding a message without a subject"
-msgstr "Videresender en meddelelse uden emne"
-
-#: mail/mail-ops.c:1059
-#, c-format
-msgid "Forward message \"%s\""
-msgstr "Videresend meddelelse '%s'"
-
-#: mail/mail-ops.c:1064
-msgid "Forward a message without a subject"
-msgstr "Videresend en meddelelse uden emne"
-
-#: mail/mail-ops.c:1129
-msgid ""
-"Failed to generate mime part from message while generating forwarded message."
-msgstr ""
-
-#: mail/mail-ops.c:1218
-#, c-format
-msgid "Loading \"%s\""
-msgstr "Indlæser '%s'"
-
-#: mail/mail-ops.c:1220
-#, c-format
-msgid "Load \"%s\""
-msgstr "Indlæs '%s'"
-
-#: mail/mail-ops.c:1339
-#, c-format
-msgid "Creating \"%s\""
-msgstr "Opretter '%s'"
-
-#: mail/mail-ops.c:1341
-#, c-format
-msgid "Create \"%s\""
-msgstr "Opret '%s'"
-
-#: mail/mail-ops.c:1412
-msgid "Exception while reporting result to shell component listener."
-msgstr ""
-
-#: mail/mail-ops.c:1465
-#, c-format
-msgid "Synchronizing \"%s\""
-msgstr ""
-
-#: mail/mail-ops.c:1467
-#, c-format
-msgid "Synchronize \"%s\""
-msgstr ""
-
-#: mail/mail-ops.c:1543
-#, c-format
-msgid "Displaying message UID \"%s\""
-msgstr ""
-
-#: mail/mail-ops.c:1546
-msgid "Clearing message display"
-msgstr ""
-
-#: mail/mail-ops.c:1549
-#, c-format
-msgid "Display message UID \"%s\""
-msgstr ""
-
-#: mail/mail-ops.c:1552
-msgid "Clear message display"
-msgstr ""
-
-#: mail/mail-ops.c:1679
-#, c-format
-msgid "Opening messages from folder \"%s\""
-msgstr ""
-
-#: mail/mail-ops.c:1682
-#, c-format
-msgid "Open messages from \"%s\""
-msgstr ""
-
-#: mail/mail-ops.c:1794
-msgid "Loading Draftbox"
-msgstr ""
-
-#: mail/mail-ops.c:1796
-msgid "Load Draftbox"
-msgstr ""
-
-#: mail/mail-ops.c:1864
-#, c-format
-msgid "Viewing messages from folder \"%s\""
-msgstr ""
-
-#: mail/mail-ops.c:1867
-#, c-format
-msgid "View messages from \"%s\""
-msgstr ""
-
-#: mail/mail-threads.c:274
-#, c-format
-msgid ""
-"Error while preparing to %s:\n"
-"%s"
-msgstr ""
-
-#: mail/mail-threads.c:627
-#, c-format
-msgid ""
-"Error while `%s':\n"
-"%s"
-msgstr ""
-
-#: mail/mail-threads.c:680
-msgid "Incomplete message written on pipe!"
-msgstr "Ufuldstændig meddelse skrevet til rør!"
-
-#: mail/mail-threads.c:684
-msgid "Error reading commands from dispatching thread."
-msgstr "Fejl ved læsning af kommandoer fra indgangstråd"
-
-#: mail/mail-threads.c:749
-msgid "Corrupted message from dispatching thread?"
-msgstr "Beskadiget meddelse fra indgangstråd?"
-
-#: mail/mail-threads.c:861
-msgid "Could not create dialog box."
-msgstr "Kunne ikke oprette dialogboks."
-
-#: mail/mail-threads.c:872
-msgid "User cancelled query."
-msgstr "Bruger annullerede forespørgsel."
-
-#: mail/mail-tools.c:205
-#, c-format
-msgid "Couldn't create temporary mbox `%s': %s"
-msgstr "Kunne ikke oprette midlertidig mbox '%s': %s"
-
-#: mail/mail-tools.c:290
-#, c-format
-msgid ""
-"Could not read UID cache file \"%s\". You may receive duplicate messages."
-msgstr ""
-
-#: mail/mail-tools.c:373
-#, c-format
-msgid "[%s] %s"
-msgstr "[%s] %s"
-
-#: mail/mail-tools.c:375
-#, c-format
-msgid "[%s] (forwarded message)"
-msgstr "[%s] (videresendt meddelelse)"
-
-#: mail/mail-tools.c:384
-msgid "Fwd: (no subject)"
-msgstr ""
-
-#: mail/mail-tools.c:419
-#, c-format
-msgid "Forwarded message - %s"
-msgstr "Videresendt meddelelse - %s"
-
-#: mail/mail-tools.c:421
-msgid "Forwarded message (no subject)"
-msgstr "Videresendt meddelelse (intet emne)"
-
-#: mail/mail-tools.c:532
-#, c-format
-msgid "Couldn't stat(2) movemail folder %s"
-msgstr ""
-
-#: mail/mail-tools.c:633
-#, c-format
-msgid "Don't know protocol to open URI `%s'"
-msgstr ""
-
-#: mail/mail-tools.c:662
-#, c-format
-msgid ""
-"Cannot open location `%s':\n"
-"%s"
-msgstr ""
-
-#: mail/mail-vfolder.c:298
-msgid "New VFolder"
-msgstr "By VFolder"
-
-#: mail/message-list.c:490
-msgid "Online Status"
-msgstr "Opkoblet status"
-
-#: mail/message-list.c:526
-msgid "From"
-msgstr "Fra"
-
-#: mail/message-list.c:533
-msgid "Subject"
-msgstr "Emne"
-
-#: mail/message-list.c:540
-msgid "Date"
-msgstr "Dato"
-
-#: mail/message-list.c:547
-msgid "Received"
-msgstr "Modtaget"
-
-#: mail/message-list.c:554
-msgid "To"
-msgstr "Til"
-
-#: mail/message-list.c:561
-msgid "Size"
-msgstr "Størrelse"
-
-#: notes/component-factory.c:27
-msgid "Create a new note"
-msgstr "Opret en ny note"
-
-#: notes/component-factory.c:148
-msgid "Cannot initialize Evolution's notes component."
-msgstr "Kan ikke initialisere Evolutions note-komponent."
-
-#: notes/main.c:30
-msgid "Notes Component: Could not initialize bonobo"
-msgstr "Note komponent: Kunne ikke initialisere Bonobo"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Evolution installation"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Dette ser ud til at være første gang du kører Evolution."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr "Venligst klik \"OK\" for at installere Evolutions brugerfiler under"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"Kan ikke oprette kataloget\n"
-"%s\n"
-"Fejl: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"Kan ikke kopiere filer til\n"
-"'%s'."
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Evolutions filer blev installeret."
-
-#: shell/e-setup.c:109
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please move it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"Filen '%s' er ikke et katalog.\n"
-"Venligst fjern denne for at tillade installation\n"
-"af Evolution's brugerfiler."
-
-#: shell/e-setup.c:121
-#, c-format
-msgid ""
-"The directory `%s' exists but is not the\n"
-"Evolution directory. Please move it in order\n"
-"to allow installation of the Evolution user files."
-msgstr ""
-"Filen '%s' er ikke et katalog.\n"
-"Venligst fjern denne for at tillade installation\n"
-"af Evolution's brugerfiler."
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"Kan ikke oprette specificeret katalog:\n"
-"%s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr "Det angivne katalognavn er ikke gyldigt."
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "Evolution - opret ny mappe"
-
-#: shell/e-shell-folder-selection-dialog.c:96
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-"Typen på den valgte mappe er ikke gyldig til\n"
-"den ønskede operation."
-
-#: shell/e-shell-folder-selection-dialog.c:272
-msgid "New..."
-msgstr "Ny..."
-
-#: shell/e-shell-folder-title-bar.c:451 shell/e-shell-folder-title-bar.c:452
-msgid "(Untitled)"
-msgstr "(Uden navn)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Bug buddy fandtes ikke i din $PATH"
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "Bug buddy kunne ikke køres"
-
-#: shell/e-shell-view-menu.c:167
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Ophavsrettigheder 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:169
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution er en samling af gruppeorienterede anvendelser\n"
-"til administrering af post, kalender og aftaler\n"
-"indenfor Gnomes skrivebordsmiljø."
-
-#: shell/e-shell-view-menu.c:319
-msgid "Go to folder..."
-msgstr "Gå til mappe..."
-
-#: shell/e-shell-view-menu.c:377
-msgid "_New"
-msgstr "_Ny"
-
-#: shell/e-shell-view-menu.c:389
-msgid "_Folder"
-msgstr "_Mappe"
-
-#: shell/e-shell-view-menu.c:395
-msgid "Evolution bar _shortcut"
-msgstr "Evolution _genvejsbjælke"
-
-#: shell/e-shell-view-menu.c:404
-msgid "_Mail message (FIXME)"
-msgstr "E-post _meddelelse (FIXME)"
-
-#: shell/e-shell-view-menu.c:410
-msgid "_Appointment (FIXME)"
-msgstr "_Aftale (FIXME)"
-
-#: shell/e-shell-view-menu.c:416
-msgid "_Contact (FIXME)"
-msgstr "_Kontakt (FIXME)"
-
-#: shell/e-shell-view-menu.c:422
-msgid "_Task (FIXME)"
-msgstr "_Opgave (FIXME)"
-
-#: shell/e-shell-view-menu.c:444
-msgid "_Go to Folder..."
-msgstr "_Gå til mappe..."
-
-#: shell/e-shell-view-menu.c:445
-msgid "Display a different folder"
-msgstr "Vis en anden mappe"
-
-#: shell/e-shell-view-menu.c:452
-msgid "_Create New Folder..."
-msgstr "_Opret ny mappe..."
-
-#: shell/e-shell-view-menu.c:453 shell/e-shell-view-menu.c:465
-msgid "Create a new folder"
-msgstr "Opret en ny folder"
-
-#: shell/e-shell-view-menu.c:464
-msgid "E_xit..."
-msgstr "_Afslut..."
-
-#: shell/e-shell-view-menu.c:495
-msgid "Show _Shortcut Bar"
-msgstr "Vis _genvejslinje"
-
-#: shell/e-shell-view-menu.c:496
-msgid "Show the shortcut bar"
-msgstr "Vis bjælke med genveje"
-
-#: shell/e-shell-view-menu.c:501
-msgid "Show _Folder Bar"
-msgstr "Vis _folderlinje"
-
-#: shell/e-shell-view-menu.c:502
-msgid "Show the folder bar"
-msgstr "Vis bjælke med foldere"
-
-#: shell/e-shell-view-menu.c:513
-msgid "_Settings"
-msgstr "_Indstillinger"
-
-#: shell/e-shell-view-menu.c:524
-msgid "_Help"
-msgstr "_Hjælp"
-
-#: shell/e-shell-view-menu.c:530
-msgid "Help _Index"
-msgstr "Hjælp _indeks"
-
-#: shell/e-shell-view-menu.c:537
-msgid "Getting _Started"
-msgstr "Kom _igang"
-
-#: shell/e-shell-view-menu.c:544
-msgid "Using the _Mailer"
-msgstr "Brug af _e-postlæseren"
-
-#: shell/e-shell-view-menu.c:551
-msgid "Using the _Calendar"
-msgstr "Brug af _kalenderen"
-
-#: shell/e-shell-view-menu.c:558
-msgid "Using the C_ontact Manager"
-msgstr "Brug af k_ontaktlisten"
-
-#: shell/e-shell-view-menu.c:568
-msgid "_Submit Bug Report"
-msgstr "_Send fejlrapport"
-
-#: shell/e-shell-view-menu.c:569
-msgid "Submit bug report using Bug Buddy"
-msgstr "Indsend fejlrapport via bug-buddy"
-
-#: shell/e-shell-view-menu.c:578
-msgid "_About Evolution..."
-msgstr "_Om Evolution..."
-
-#: shell/e-shell-view-menu.c:579
-msgid "Show information about Evolution"
-msgstr "Vis information om Evolution"
-
-#: shell/e-shell-view.c:122
-msgid "(No folder displayed)"
-msgstr "(Ingen mappe vist)"
-
-#: shell/e-shell-view.c:350
-msgid "Folders"
-msgstr "Mapper"
-
-#: shell/e-shell-view.c:881
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell.c:293
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Kan ikke opsætte lokal lagring -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "_Små ikoner"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "Vis genveje som små ikoner"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "Store i_koner"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Vis genveje som store ikoner"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "Aktivér"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "Aktivér denne genvej"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Fjern denne genvej fra genvejsbjælken"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Fejl under gemning af genveje."
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "(Uden navn)"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "Ingen fejl"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "Almindelig fejl"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "En mappe med samme navn eksisterer allerede"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr "Specificeret mappetype er ikke gyldig"
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "I/U-fejl"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "Ikke nok plads til at oprette mappen"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "Angivet mappe blev ikke fundet"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr "Funktionen ikke implementeret i denne lagring"
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "Adgang nægtet"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "Operationen er ikke understøttet"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr "Den angivne type er ikke understøttet i denne lagring"
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "Ukendt fejl"
-
-#: shell/e-storage-set-view.c:242
-msgid "View the selected folder"
-msgstr "Vis den valgte mappe"
-
-#: shell/main.c:66
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Hejsa. Tak for at du har taget tid til at hente denne smugkigsudgave \n"
-"af gruppevare-samlingen Evolution.\n"
-"\n"
-"I løbet af den sidste måneds tid har vores fokus været på at gøre\n"
-"Evolution brugbar. Mange af Evolutions udviklere bruger nu Evolution\n"
-"til altid at læse deres post. Det kunne du også gøre. (Blot husk\n"
-"at have en sikkerhedskopi.)\n"
-"\n"
-"Men selvom vi har ordnet mange fejl omkring stabilitet og sikkerhed,\n"
-"er der stadig en ansvarsfraskrivelse. Evolution vil: gå ned,\n"
-"tabe din post selv om du ikke ønsker det, nægte at slette din post når\n"
-"du ønsker det, efterlade vildfarne kørende processer, bruge 100 % Cpu,\n"
-"fastlåse, sende Html til tilfældige postlister, og ydmyge dig overfor dine\n"
-"venner og kolleger. Benyt det på eget ansvar.\n"
-"\n"
-"Vi håber du vil nyde resultaterne af vores hårde arbejde, og vi\n"
-"venter ivrigt på dine bidrag!\n"
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Tak\n"
-"Holdet bag Evolution\n"
-
-#: shell/main.c:121
-msgid "Cannot initialize the Evolution shell."
-msgstr "Kan ikke initialisere Evolution-skallen."
-
-#: shell/main.c:156
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Kunne ikke initialisere Bonobo-komponentsystemet."
-
-#: tests/ui-tests/message-browser.c:360
-msgid "The component now claims that it doesn't support PersistStream!"
-msgstr ""
-
-#: tests/ui-tests/message-browser.c:378
-msgid ""
-"An exception occured while trying to load data into the component with "
-"PersistStream"
-msgstr ""
-
-#: tests/ui-tests/message-browser.c:471
-#, c-format
-msgid "The %s component doesn't support PersistStream!\n"
-msgstr ""
-
-#: tests/ui-tests/message-browser.c:710
-msgid "Open Mime Message"
-msgstr "Åbn Mime meddelse"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Felter"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "Gruppering"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Sortér"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Filtrér"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-#: widgets/e-table/e-table-header-item.c:1164
-msgid "Field Chooser"
-msgstr "Felt-vælger"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-"for at tilføje en kolonne til din tabel skal\n"
-"du trække den hen til det sted du ønsker den skal være."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "vindue1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "Tilgængelige felter"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "etiket1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "Vis i denne rækkefølge"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "etiket2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Tilføj >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Fjern"
-
-#: widgets/e-table/e-table-header-item.c:1156
-msgid "Sort Ascending"
-msgstr "Sortér opadgående"
-
-#: widgets/e-table/e-table-header-item.c:1157
-msgid "Sort Descending"
-msgstr "Sortér nedadgående"
-
-#: widgets/e-table/e-table-header-item.c:1158
-msgid "Unsort"
-msgstr "Usorteret"
-
-#: widgets/e-table/e-table-header-item.c:1160
-msgid "Group By This Field"
-msgstr "Gruppér efter dette felt"
-
-#: widgets/e-table/e-table-header-item.c:1161
-msgid "Group By Box"
-msgstr "Gruppér efter boks"
-
-#: widgets/e-table/e-table-header-item.c:1163
-msgid "Remove This Column"
-msgstr "Fjern denne kolonne"
-
-#: widgets/e-table/e-table-header-item.c:1166
-msgid "Alignment"
-msgstr "Tilpasning:"
-
-#: widgets/e-table/e-table-header-item.c:1167
-msgid "Best Fit"
-msgstr "Passer bedst"
-
-#: widgets/e-table/e-table-header-item.c:1168
-msgid "Format Columns..."
-msgstr "Formatér kolonner..."
-
-#: widgets/e-table/e-table-header-item.c:1170
-msgid "Customize Current View..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr "Tentativ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "Optaget"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr "Ude"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "Ingen information"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr "_Invitér andre..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "_Alternativer"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr "Vis k_un arbejdstid"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr "Vis _zoomet ud"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr "_Opdater fri/optaget"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "_<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr "_Autovælg"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ">_>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "_Alle mennesker og resurser"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr "Alle _mennesker og en resurse"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr "_Nødvendige mennesker"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr "Nødvendige mennesker _og en resurse"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "Tid for mødets _start:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "Tid for mødets slutning:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr "Alle deltagere"
-
-#. Translators: These are the first characters of each day of the
-#. week, 'M' for 'Monday', 'T' for Tuesday etc.
-#: widgets/misc/e-calendar-item.c:281
-msgid "MTWTFSS"
-msgstr "mtotfls"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "Gruppe %i"
-
-#~ msgid "New appointment for _today..."
-#~ msgstr "Ny af_tale for idag..."
-
-#~ msgid "Create a new appointment for today"
-#~ msgstr "Opret en ny aftale for idag"
-
-#~ msgid "No GPG/PGP program available."
-#~ msgstr "GPG/PGP-program ikke tilgængelig."
-
-#~ msgid "Currently pending operations:"
-#~ msgstr "Nuværende udestående opgaver:"
-
-#~ msgid "_Actions"
-#~ msgstr "H_andlinger"
diff --git a/po/de.po b/po/de.po
deleted file mode 100644
index 7711438bc8..0000000000
--- a/po/de.po
+++ /dev/null
@@ -1,4837 +0,0 @@
-# German po for Evolution.
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Kai Lahmann <kl@linuxfaqs.de>, 2000.
-# Matthias Warkus <mawa@iname.com>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution 0.4\n"
-"POT-Creation-Date: 2000-08-19 13:40+0200\n"
-"PO-Revision-Date: 2000-08-19 13:54+02:00\n"
-"Last-Translator: Matthias Warkus <mawarkus@gnome.org>\n"
-"Language-Team: German <gnome-de@gnome.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-gnomecard-addressbook.c:41
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/backend/ebook/test-client-list.c:29
-#: addressbook/backend/ebook/test-client.c:54
-#: addressbook/conduit/address-conduit.c:1201
-#: addressbook/demo/addressbook-factory.c:32
-#: addressbook/gui/component/addressbook-factory.c:59
-#: addressbook/gui/minicard/test-minicard-view.c:45
-#: calendar/conduits/calendar/calendar-conduit.c:1669
-#: calendar/conduits/todo/todo-conduit.c:1298 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Konnte Bonobo nicht initialisieren"
-
-#. This array must be in the same order as enumerations
-#. in GnomePilotConduitSyncType as they are used as index.
-#. Custom type implies Disabled state.
-#.
-#: addressbook/conduit/address-conduit-control-applet.c:54
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:55
-#: calendar/conduits/todo/todo-conduit-control-applet.c:55
-msgid "Disabled"
-msgstr "Inaktiv"
-
-#: addressbook/conduit/address-conduit-control-applet.c:55
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:56
-#: calendar/conduits/todo/todo-conduit-control-applet.c:56
-msgid "Synchronize"
-msgstr "Synchronisieren"
-
-#: addressbook/conduit/address-conduit-control-applet.c:56
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:57
-#: calendar/conduits/todo/todo-conduit-control-applet.c:57
-msgid "Copy From Pilot"
-msgstr "Aus Pilot kopieren"
-
-#: addressbook/conduit/address-conduit-control-applet.c:57
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:58
-#: calendar/conduits/todo/todo-conduit-control-applet.c:58
-msgid "Copy To Pilot"
-msgstr "In Pilot kopieren"
-
-#: addressbook/conduit/address-conduit-control-applet.c:58
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:59
-#: calendar/conduits/todo/todo-conduit-control-applet.c:59
-msgid "Merge From Pilot"
-msgstr "Aus Pilot einfließen lassen"
-
-#: addressbook/conduit/address-conduit-control-applet.c:59
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:60
-#: calendar/conduits/todo/todo-conduit-control-applet.c:60
-msgid "Merge To Pilot"
-msgstr "In Pilot einfließen lassen"
-
-#: addressbook/conduit/address-conduit-control-applet.c:143
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:144
-#: calendar/conduits/todo/todo-conduit-control-applet.c:144
-msgid "Eskil Heyn Olsen <deity@eskil.dk>"
-msgstr "Eskil Heyn Olsen <deity@eskil.dk>"
-
-#: addressbook/conduit/address-conduit-control-applet.c:145
-msgid "Gpilotd address conduit"
-msgstr "Gpilot Adressen-Conduit"
-
-#: addressbook/conduit/address-conduit-control-applet.c:146
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:147
-#: calendar/conduits/todo/todo-conduit-control-applet.c:147
-msgid "(C) 1998 the Free Software Foundation"
-msgstr "(C) 1998 the Free Software Foundation"
-
-#: addressbook/conduit/address-conduit-control-applet.c:148
-msgid "Configuration utility for the address conduit.\n"
-msgstr "Konfigurationswerkzeug für den Adressen-Conduit.\n"
-
-#: addressbook/conduit/address-conduit-control-applet.c:149
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:150
-#: calendar/conduits/todo/todo-conduit-control-applet.c:150
-msgid "gnome-unknown.xpm"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:190
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:191
-#: calendar/conduits/todo/todo-conduit-control-applet.c:191
-msgid "Synchronize Action"
-msgstr "Synchronisationsaktion"
-
-#: addressbook/conduit/address-conduit-control-applet.c:261
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:262
-#: calendar/conduits/todo/todo-conduit-control-applet.c:262
-msgid "Conduit state"
-msgstr "Conduit-Zustand"
-
-#: addressbook/conduit/address-conduit-control-applet.c:315
-#: addressbook/conduit/address-conduit-control-applet.c:328
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:316
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:329
-#: calendar/conduits/todo/todo-conduit-control-applet.c:316
-#: calendar/conduits/todo/todo-conduit-control-applet.c:329
-msgid ""
-"No pilot configured, please choose the\n"
-"'Pilot Link Properties' capplet first."
-msgstr ""
-"Kein Pilot konfiguriert, bitte wählen Sie zunächst\n"
-"das Capplet \"Pilot-Verbindungseigenschaften\"."
-
-#: addressbook/conduit/address-conduit-control-applet.c:334
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:335
-#: calendar/conduits/todo/todo-conduit-control-applet.c:335
-msgid "Not connected to the gnome-pilot daemon"
-msgstr "Nicht mit dem gnome-pilot-Dämon verbunden"
-
-#: addressbook/conduit/address-conduit-control-applet.c:339
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:340
-#: calendar/conduits/todo/todo-conduit-control-applet.c:340
-msgid ""
-"An error occured when trying to fetch\n"
-"pilot list from the gnome-pilot daemon"
-msgstr ""
-"Ein Fehler trat beim dem Versuch auf, die Pilot-\n"
-"Liste vom gnome-pilot-Dämon zu lesen"
-
-#: addressbook/conduit/address-conduit.c:128
-#: addressbook/conduit/address-conduit.c:142
-msgid "BLARG\n"
-msgstr "BLARG\n"
-
-#: addressbook/conduit/address-conduit.c:459
-#, c-format
-msgid "Address holds %ld address entries"
-msgstr "Address hat %ld Adresseinträge"
-
-#: addressbook/conduit/address-conduit.c:485
-#: addressbook/conduit/address-conduit.c:487
-msgid "Could not start addressbook server"
-msgstr "Konnte Adressbuchserver nicht starten"
-
-#: addressbook/conduit/address-conduit.c:500
-#: addressbook/conduit/address-conduit.c:503
-msgid "Could not read pilot's Address application block"
-msgstr "Konnte Address-Anwendungsblock des Pilot nicht lesen"
-
-#: addressbook/conduit/address-conduit.c:841
-msgid "Error while communicating with address server"
-msgstr "Fehler beim Kommunizieren mit dem Adressenserver"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "Kategorien"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "Eintrag/Einträge gehört/gehören zu diesen Kategorien:"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "Verfügbare Kategorien:"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/dialogs/task-editor.c:217 calendar/gui/event-editor.c:1179
-msgid "FIXME: _Appointment"
-msgstr "FIXME: Termin"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/dialogs/task-editor.c:218 calendar/gui/event-editor.c:1180
-msgid "FIXME: Meeting Re_quest"
-msgstr "FIXME: Besprechungs-Anfrage"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/dialogs/task-editor.c:216 calendar/gui/event-editor.c:1182
-msgid "FIXME: _Mail Message"
-msgstr "FIXME: Nachricht senden"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/dialogs/task-editor.c:219 calendar/gui/event-editor.c:1183
-msgid "FIXME: _Contact"
-msgstr "FIXME: Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/dialogs/task-editor.c:213
-#: calendar/gui/dialogs/task-editor.c:220 calendar/gui/event-editor.c:1184
-msgid "FIXME: _Task"
-msgstr "FIXME: Auftrag"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/dialogs/task-editor.c:214
-#: calendar/gui/dialogs/task-editor.c:221 calendar/gui/event-editor.c:1185
-msgid "FIXME: Task _Request"
-msgstr "FIXME: Auftrags-Anfrage"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/dialogs/task-editor.c:222 calendar/gui/event-editor.c:1186
-msgid "FIXME: _Journal Entry"
-msgstr "FIXME: Journal-Eintrag"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/dialogs/task-editor.c:223 calendar/gui/event-editor.c:1187
-msgid "FIXME: _Note"
-msgstr "FIXME: Notiz"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/dialogs/task-editor.c:225
-#: calendar/gui/dialogs/task-editor.c:332 calendar/gui/event-editor.c:1189
-#: calendar/gui/event-editor.c:1296
-msgid "FIXME: Ch_oose Form..."
-msgstr "FIXME: Formular wählen..."
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/dialogs/task-editor.c:230 calendar/gui/event-editor.c:1194
-msgid "FIXME: _Memo Style"
-msgstr "FIXME: Memo-Stil"
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/dialogs/task-editor.c:232 calendar/gui/event-editor.c:1196
-msgid "FIXME: Define Print _Styles..."
-msgstr "FIXME: Druckstile definieren..."
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/dialogs/task-editor.c:239 calendar/gui/event-editor.c:1203
-msgid "FIXME: S_end"
-msgstr "FIXME: Senden"
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/dialogs/task-editor.c:243 calendar/gui/event-editor.c:1207
-msgid "FIXME: Save Attac_hments..."
-msgstr "FIXME: Anlagen speichern..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "Löschen"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/dialogs/task-editor.c:246 calendar/gui/event-editor.c:1210
-msgid "FIXME: _Move to Folder..."
-msgstr "FIXME: In Ordner verschieben..."
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/dialogs/task-editor.c:247 calendar/gui/event-editor.c:1211
-msgid "FIXME: Cop_y to Folder..."
-msgstr "FIXME: In Ordner kopieren..."
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/dialogs/task-editor.c:249 calendar/gui/event-editor.c:1213
-msgid "Page Set_up"
-msgstr "Seite einrichten"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/dialogs/task-editor.c:250 calendar/gui/event-editor.c:1214
-msgid "FIXME: Print Pre_view"
-msgstr "FIXME: Druckvorschau"
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/dialogs/task-editor.c:271 calendar/gui/event-editor.c:1235
-msgid "FIXME: Paste _Special..."
-msgstr "FIXME: Besonderes einfügen..."
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/dialogs/task-editor.c:276 calendar/gui/event-editor.c:1240
-msgid "FIXME: Mark as U_nread"
-msgstr "FIXME: Als ungelesen markieren"
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/dialogs/task-editor.c:280 calendar/gui/event-editor.c:1244
-msgid "_Object"
-msgstr "Objekt"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/dialogs/task-editor.c:285
-#: calendar/gui/dialogs/task-editor.c:293 calendar/gui/event-editor.c:1249
-#: calendar/gui/event-editor.c:1256
-msgid "FIXME: _Item"
-msgstr "FIXME: Eintrag"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/dialogs/task-editor.c:286
-#: calendar/gui/dialogs/task-editor.c:294 calendar/gui/event-editor.c:1250
-#: calendar/gui/event-editor.c:1257
-msgid "FIXME: _Unread Item"
-msgstr "FIXME: Ungelesener Eintrag"
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/dialogs/task-editor.c:288 calendar/gui/event-editor.c:1251
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr "FIXME: Erster Eintrag im Ordner"
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/dialogs/task-editor.c:296 calendar/gui/event-editor.c:1258
-msgid "FIXME: _Last Item in Folder"
-msgstr "FIXME: Letzter Eintrag im Ordner"
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/dialogs/task-editor.c:301 calendar/gui/event-editor.c:1263
-msgid "FIXME: _Standard"
-msgstr "FIXME: Standard"
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/dialogs/task-editor.c:303 calendar/gui/event-editor.c:1265
-msgid "FIXME: __Formatting"
-msgstr "FIXME: Formatieren"
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/dialogs/task-editor.c:306 calendar/gui/event-editor.c:1268
-msgid "FIXME: _Customize..."
-msgstr "FIXME: Anpassen..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/dialogs/task-editor.c:311 calendar/gui/event-editor.c:1273
-msgid "Pre_vious"
-msgstr "Voriger"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/dialogs/task-editor.c:312 calendar/gui/event-editor.c:1274
-msgid "Ne_xt"
-msgstr "Nächster"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/dialogs/task-editor.c:314 calendar/gui/event-editor.c:1278
-msgid "_Toolbars"
-msgstr "Werkzeugleisten"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/dialogs/task-editor.c:319 calendar/gui/event-editor.c:1283
-msgid "FIXME: _File..."
-msgstr "FIXME: Datei..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/dialogs/task-editor.c:320 calendar/gui/event-editor.c:1284
-msgid "FIXME: It_em..."
-msgstr "FIXME: Eintrag..."
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/dialogs/task-editor.c:321 calendar/gui/event-editor.c:1285
-msgid "FIXME: _Object..."
-msgstr "FIXME: Objekt..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/dialogs/task-editor.c:326 calendar/gui/event-editor.c:1290
-msgid "FIXME: _Font..."
-msgstr "FIXME: Schriftart..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/dialogs/task-editor.c:327 calendar/gui/event-editor.c:1291
-msgid "FIXME: _Paragraph..."
-msgstr "FIXME: Absatz..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/dialogs/task-editor.c:334 calendar/gui/event-editor.c:1298
-msgid "FIXME: Desi_gn This Form"
-msgstr "FIXME: Dieses Formular entwerfen"
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/dialogs/task-editor.c:335 calendar/gui/event-editor.c:1299
-msgid "FIXME: D_esign a Form..."
-msgstr "FIXME: Ein Formular entwerfen..."
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/dialogs/task-editor.c:337 calendar/gui/event-editor.c:1301
-msgid "FIXME: Publish _Form..."
-msgstr "FIXME: Formular veröffentlichen..."
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/dialogs/task-editor.c:338 calendar/gui/event-editor.c:1302
-msgid "FIXME: Pu_blish Form As..."
-msgstr "FIXME: Formular veröffentlichen als..."
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/dialogs/task-editor.c:340 calendar/gui/event-editor.c:1304
-msgid "FIXME: Script _Debugger"
-msgstr "FIXME: Skriptdebugger"
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/dialogs/task-editor.c:345 calendar/gui/event-editor.c:1309
-msgid "FIXME: _Spelling..."
-msgstr "FIXME: Rechtschreibung..."
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/dialogs/task-editor.c:350 calendar/gui/event-editor.c:1314
-msgid "_Forms"
-msgstr "Formulare"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "FIXME: Neuer Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr "FIXME: Neuer Kontakt aus derselben Firma"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr "FIXME: Neuer Brief an Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr "FIXME: Neue Nachricht an Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr "FIXME: Neue Besprechung mit Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr "FIXME: Besprechung planen..."
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr "FIXME: Neuer Auftrag für Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr "FIXME: Neuer Journaleintrag für Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr "FIXME: Für Antwort markieren..."
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr "FIXME: Karte der Adresse anzeigen"
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr "FIXME: Webseite öffnen"
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr "FIXME: Als vCard weiterleiten"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/dialogs/task-editor.c:367 calendar/gui/event-editor.c:1327
-msgid "FIXME: For_ward"
-msgstr "FIXME: Weiterleiten"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/dialogs/task-editor.c:380 calendar/gui/event-editor.c:1340
-msgid "_Insert"
-msgstr "Einfügen"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/dialogs/task-editor.c:381 calendar/gui/event-editor.c:1341
-msgid "F_ormat"
-msgstr "Format"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/dialogs/task-editor.c:382 calendar/gui/event-editor.c:1342
-msgid "_Tools"
-msgstr "Werkzeuge"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/dialogs/task-editor.c:383 calendar/gui/event-editor.c:1343
-msgid "Actio_ns"
-msgstr "Aktionen"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "Speichern und schließen"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1382
-msgid "Save the appointment and close the dialog box"
-msgstr "Den Termin speichern und das Dialogfenster schließen"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:654
-msgid "Print..."
-msgstr "Drucken..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/dialogs/task-editor.c:415 calendar/gui/event-editor.c:1387
-msgid "Print this item"
-msgstr "Diesen Eintrag drucken"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/dialogs/task-editor.c:416 calendar/gui/event-editor.c:1388
-msgid "FIXME: Insert File..."
-msgstr "FIXME: Datei einfügen..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/dialogs/task-editor.c:417 calendar/gui/event-editor.c:1389
-msgid "Insert a file as an attachment"
-msgstr "Eine Datei als Anlage einfügen"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/demo/addressbook.c:82
-#: addressbook/gui/component/addressbook.c:424
-#: calendar/gui/e-calendar-table.c:375
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:548
-#: mail/folder-browser-factory.c:50 mail/mail-config.glade.h:13
-#: mail/mail-config.glade.h:18 mail/mail-config.glade.h:24
-#: mail/mail-view.c:147
-msgid "Delete"
-msgstr "Löschen"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/dialogs/task-editor.c:426 calendar/gui/event-editor.c:1398
-#: calendar/gui/gncal-todo.c:376
-msgid "Delete this item"
-msgstr "Diesen Eintrag löschen"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/dialogs/task-editor.c:428 calendar/gui/event-editor.c:1400
-msgid "FIXME: Previous"
-msgstr "FIXME: Voriger"
-
-#: addressbook/contact-editor/e-contact-editor.c:858
-#: calendar/gui/dialogs/task-editor.c:429 calendar/gui/event-editor.c:1401
-msgid "Go to the previous item"
-msgstr "Zum vorigen Eintrag gehen"
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/dialogs/task-editor.c:430 calendar/gui/event-editor.c:1402
-msgid "FIXME: Next"
-msgstr "FIXME: Nächster"
-
-#: addressbook/contact-editor/e-contact-editor.c:861
-#: calendar/gui/dialogs/task-editor.c:431 calendar/gui/event-editor.c:1403
-msgid "Go to the next item"
-msgstr "Zum nächsten Eintrag gehen"
-
-#: addressbook/contact-editor/e-contact-editor.c:864
-#: calendar/gui/dialogs/task-editor.c:432 calendar/gui/event-editor.c:1404
-msgid "FIXME: Help"
-msgstr "FIXME: Hilfe"
-
-#: addressbook/contact-editor/e-contact-editor.c:865
-#: calendar/gui/dialogs/task-editor.c:433 calendar/gui/event-editor.c:1405
-msgid "See online help"
-msgstr "Onlinehilfe einsehen"
-
-#: addressbook/contact-editor/e-contact-editor.c:1320
-msgid "Assistant"
-msgstr "Assistent"
-
-#: addressbook/contact-editor/e-contact-editor.c:1321
-#: addressbook/contact-editor/e-contact-editor.c:1425
-msgid "Business"
-msgstr "Geschäftlich"
-
-#: addressbook/contact-editor/e-contact-editor.c:1322
-msgid "Business 2"
-msgstr "Geschäftlich 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1323
-msgid "Business Fax"
-msgstr "Geschäftliches Fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1324
-msgid "Callback"
-msgstr "Rückruf"
-
-#: addressbook/contact-editor/e-contact-editor.c:1325
-msgid "Car"
-msgstr "Auto"
-
-#: addressbook/contact-editor/e-contact-editor.c:1326
-msgid "Company"
-msgstr "Firma"
-
-#: addressbook/contact-editor/e-contact-editor.c:1327
-#: addressbook/contact-editor/e-contact-editor.c:1426
-msgid "Home"
-msgstr "Zu Hause"
-
-#: addressbook/contact-editor/e-contact-editor.c:1328
-msgid "Home 2"
-msgstr "Zu Hause 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1329
-msgid "Home Fax"
-msgstr "Fax zu Hause"
-
-#: addressbook/contact-editor/e-contact-editor.c:1330
-msgid "ISDN"
-msgstr "ISDN"
-
-#: addressbook/contact-editor/e-contact-editor.c:1331
-msgid "Mobile"
-msgstr "Mobil"
-
-#: addressbook/contact-editor/e-contact-editor.c:1332
-#: addressbook/contact-editor/e-contact-editor.c:1427
-#: mail/mail-config.glade.h:28
-msgid "Other"
-msgstr "Andere"
-
-#: addressbook/contact-editor/e-contact-editor.c:1333
-msgid "Other Fax"
-msgstr "Anderes Fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1334
-msgid "Pager"
-msgstr "Pager"
-
-#: addressbook/contact-editor/e-contact-editor.c:1335
-msgid "Primary"
-msgstr "Primär"
-
-#: addressbook/contact-editor/e-contact-editor.c:1336
-msgid "Radio"
-msgstr "Radio"
-
-#: addressbook/contact-editor/e-contact-editor.c:1337
-msgid "Telex"
-msgstr "Telex"
-
-#: addressbook/contact-editor/e-contact-editor.c:1338
-msgid "TTY/TDD"
-msgstr "TTY/TTD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1382
-msgid "Primary Email"
-msgstr "Primäre E-Mail"
-
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Email 2"
-msgstr "E-Mail 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Email 3"
-msgstr "E-Mail 3"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:7
-msgid ""
-"Are you sure you want\n"
-"to delete this contact?"
-msgstr ""
-"Sind Sie sicher, dass Sie\n"
-"diesen Kontakt löschen wollen?"
-
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:9
-msgid "Delete Contact?"
-msgstr "Kontakt löschen?"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "Hinzufügen"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "Telefon-Typen"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "Neuer Telefon-Typ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91 mail/mail-config.glade.h:11
-#: mail/mail-config.glade.h:16 mail/mail-config.glade.h:22
-msgid "Add"
-msgstr "Hinzufügen"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "Kontakteditor"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "Voller Name..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "Einsortieren unter:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Adresse der Webseite:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "Will HTML-Mail erhalten"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Adresse:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "Geschäftlich"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "Zu Hause"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "Geschäftliches Fax"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "Mobil"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "Geschäftlich"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "Dies ist die Postadresse"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "Kontakte..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:26
-msgid "Ca_tegories..."
-msgstr "Kategorien..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr "Stellenbezeichnung:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "Firma:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:18
-msgid "General"
-msgstr "Allgemein"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "Abteilung:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "Büro:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "Beruf:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "Spitzname:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr "Partner:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "Geburtstag:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr "Name des Assistenten:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "Name des Vorgesetzten:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "Jahrestag:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "Notizen:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:33
-msgid "Details"
-msgstr "Details"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "Vollen Namen prüfen"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "Titel:"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "Vorname:"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "Mittelname:"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "Nachname:"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "Suffix:"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Herr\n"
-"Frau\n"
-"Dr.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-
-#: addressbook/demo/addressbook.c:76
-#: addressbook/gui/component/addressbook.c:418
-#: calendar/gui/calendar-commands.c:511 notes/component-factory.c:27
-msgid "New"
-msgstr "Neu"
-
-#: addressbook/demo/addressbook.c:76
-#: addressbook/gui/component/addressbook.c:418
-msgid "Create a new contact"
-msgstr "Einen neuen Kontakt anlegen"
-
-#: addressbook/demo/addressbook.c:80
-#: addressbook/gui/component/addressbook.c:422
-msgid "Find"
-msgstr "Suchen"
-
-#: addressbook/demo/addressbook.c:80
-#: addressbook/gui/component/addressbook.c:422
-msgid "Find a contact"
-msgstr "Einen Kontakt suchen"
-
-#: addressbook/demo/addressbook.c:81
-#: addressbook/gui/component/addressbook.c:423
-#: calendar/gui/calendar-commands.c:516 mail/folder-browser-factory.c:48
-#: mail/mail-view.c:145
-msgid "Print"
-msgstr "Drucken"
-
-#: addressbook/demo/addressbook.c:81
-#: addressbook/gui/component/addressbook.c:423
-msgid "Print contacts"
-msgstr "Kontakte drucken"
-
-#: addressbook/demo/addressbook.c:82
-#: addressbook/gui/component/addressbook.c:424
-msgid "Delete a contact"
-msgstr "Einen Kontakt löschen"
-
-#: addressbook/demo/addressbook.c:101
-#: addressbook/gui/component/addressbook.c:509
-msgid "_New Contact"
-msgstr "Neuer Kontakt"
-
-#: addressbook/gui/component/addressbook.c:492
-msgid "_Print Contacts..."
-msgstr "Kontakte _drucken..."
-
-#: addressbook/gui/component/addressbook.c:502
-#: addressbook/gui/component/addressbook.c:972
-msgid "As _Table"
-msgstr "Als Tabelle"
-
-#: addressbook/gui/component/addressbook.c:517
-msgid "N_ew Directory Server"
-msgstr "Neuer Verzeichnisserver"
-
-#: addressbook/gui/component/addressbook.c:600
-msgid "Unable to open addressbook"
-msgstr "Kann das Adressbuch nicht öffnen"
-
-#: addressbook/gui/component/addressbook.c:605
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-"Wir haben dieses Adressbuch nicht öffnen können. Dies\n"
-"heißt entweder, dass Sie einen ungültigen URI eingegeben\n"
-"haben, oder versucht haben, auf einen LDAP-Server\n"
-"zuzugreifen, ohne LDAP-Unterstützung eincompiliert zu\n"
-"haben. Wenn Sie einen URI eingegeben haben, prüfen Sie\n"
-"ihn auf Richtigkeit und geben Sie ihn noch einmal ein.\n"
-"Wenn nicht, haben Sie wahrscheinlich versucht, auf einen\n"
-"LDAP-Server zuzugreifen. Wenn Sie LDAP verwenden wollen,\n"
-"müssen Sie OpenLDAP herunterladen, installieren, und\n"
-"Evolution neu compilieren und installieren.\n"
-
-#: addressbook/gui/component/addressbook.c:876
-#: addressbook/gui/minicard/e-minicard.c:332
-msgid "Save as VCard"
-msgstr "Als VCard speichern"
-
-#: addressbook/gui/component/addressbook.c:943
-msgid "* Click here to add a contact *"
-msgstr "* Hier klicken, um einen Kontakt hinzuzufügen *"
-
-#: addressbook/gui/component/addressbook.c:979
-msgid "As _Minicards"
-msgstr "Als _Minikarten"
-
-#: addressbook/gui/component/addressbook.c:1030
-msgid "The URI that the Folder Browser will display"
-msgstr "Die URI, die der Suchdienst anzeigen wird"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "windows2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "k"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#: addressbook/gui/component/e-ldap-storage.c:88
-msgid "External Directories"
-msgstr "Externe Verzeichnisse"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "Beschreibung:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "LDAP-Server:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Portnummer:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr "Root-DN:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Name:"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/select-names/select-names.glade.h:7
-msgid "Select Names"
-msgstr "Namen wählen"
-
-#: addressbook/gui/component/select-names/select-names.glade.h:8
-msgid "Find..."
-msgstr "Suchen..."
-
-#: addressbook/gui/component/select-names/select-names.glade.h:9
-msgid "Select name from List:"
-msgstr "Name aus Liste wählen:"
-
-#: addressbook/gui/component/select-names/select-names.glade.h:10
-msgid "Message Recipients"
-msgstr "Nachrichtenempfänger"
-
-#: addressbook/gui/minicard/e-minicard-control.c:276
-msgid "Save in addressbook"
-msgstr "In Adressbuch speichern"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"In dieser Ansicht gibt es keine Einträge zum Anzeigen.\n"
-"\n"
-"Doppelklicken Sie hier, um einen neuen Kontakt anzulegen."
-
-#: addressbook/gui/minicard/test-minicard-view.c:100
-msgid "Reflow Test"
-msgstr "Reflow-Test"
-
-#: addressbook/gui/minicard/test-minicard-view.c:101
-msgid "Copyright (C) 2000, Helix Code, Inc."
-msgstr "Copyright (C) 2000, Helix Code, Inc."
-
-#: addressbook/gui/minicard/test-minicard-view.c:103
-msgid "This should test the reflow canvas item"
-msgstr "Dies sollte das Reflow-Canvasobjekt testen"
-
-#. gtk_signal_connect(fb->search_entry, "changed", search_activate, fb);
-#: addressbook/gui/search/e-addressbook-search-dialog.c:127
-#: mail/folder-browser.c:368
-msgid "Search"
-msgstr "Suchen"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "Seite einrichten:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Stilname:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "Vorschau:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "Optionen"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Dazunehmen:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "Abschnitte:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr "Folgen einander unmittelbar"
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr "Buchstabenreiter an der Seite"
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "Überschriften für jeden Buchstaben"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "Auf einer neuen Seite beginnen"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Anzahl Spalten:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "Leere Formulare am Ende:"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "Schrifarten"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "Schrifart..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "Überschriften"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 Punkt Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "Textkörper"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 Punkt Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "Schattierung"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "Mit grauer Schattierung drucken"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "Format"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Papier"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Typ:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr "label26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Ausmaße:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Breite:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Höhe:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "Papierquelle:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "Ränder"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Oben:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Unten:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Links:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Rechts:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "Seite"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Größe:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Ausrichtung"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "Hochformat"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "Querformat"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "Kopfzeile"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "Fußzeile:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "Auf geraden Seiten umkehren"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "Kopf-/Fußzeile"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:596
-msgid "am"
-msgstr "AM"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:595
-msgid "pm"
-msgstr "PM"
-
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:146
-msgid "Gpilotd calendar conduit"
-msgstr "Gpilotd-Kalender-Verbindung"
-
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:149
-msgid "Configuration utility for the calendar conduit.\n"
-msgstr "Konfigurationstool für die Kalender-Verbindung.\n"
-
-#: calendar/conduits/calendar/calendar-conduit.c:399
-#: calendar/conduits/calendar/calendar-conduit.c:1109
-#: calendar/conduits/todo/todo-conduit.c:443
-#: calendar/conduits/todo/todo-conduit.c:1025
-msgid "Error while communicating with calendar server"
-msgstr "Fehler bei der Kommunikation mit dem Kalender-Server"
-
-#: calendar/conduits/calendar/calendar-conduit.c:776
-#: calendar/conduits/calendar/calendar-conduit.c:778
-#: calendar/conduits/todo/todo-conduit.c:707
-#: calendar/conduits/todo/todo-conduit.c:709
-msgid "Could not start gnomecal server"
-msgstr "Konnte den gnomecal-Server nicht starten"
-
-#: calendar/conduits/calendar/calendar-conduit.c:806
-#: calendar/conduits/calendar/calendar-conduit.c:809
-msgid "Could not read pilot's DateBook application block"
-msgstr "Konnte den DateBook-Anwendungsblock des Pilot nicht lesen"
-
-#: calendar/conduits/todo/todo-conduit-control-applet.c:146
-msgid "Gpilotd todo conduit"
-msgstr "Gpilotd-To-Do-Verbindung"
-
-#: calendar/conduits/todo/todo-conduit-control-applet.c:149
-msgid "Configuration utility for the todo conduit.\n"
-msgstr "Konfigurationstool für die To-Do-Verbindung.\n"
-
-#: calendar/conduits/todo/todo-conduit.c:737
-#: calendar/conduits/todo/todo-conduit.c:740
-msgid "Could not read pilot's ToDo application block"
-msgstr "Konnte den ToDo-Anwendungsblock des Pilot nicht lesen"
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Outline:"
-msgstr "Umrandung:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Headings:"
-msgstr "Überschriften:"
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Empty days:"
-msgstr "Leere Tage:"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Appointments:"
-msgstr "Termine:"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "Highlighted day:"
-msgstr "Markierter Tag:"
-
-#: calendar/gui/calendar-commands.c:64
-msgid "Day numbers:"
-msgstr "Tagesnummern:"
-
-#: calendar/gui/calendar-commands.c:65
-msgid "Current day's number:"
-msgstr "Nummer des aktuellen Tages:"
-
-#: calendar/gui/calendar-commands.c:66
-msgid "To-Do item that is not yet due:"
-msgstr "Noch nicht fälliger To-Do-Eintrag:"
-
-#: calendar/gui/calendar-commands.c:67
-msgid "To-Do item that is due today:"
-msgstr "Heute fälliger To-Do-Eintrag:"
-
-#: calendar/gui/calendar-commands.c:68
-msgid "To-Do item that is overdue:"
-msgstr "Überfälliger To-Do-Eintrag:"
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr "GNOME-Kalender"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "Der persönliche GNOME-Kalender und -Terminplaner."
-
-#: calendar/gui/calendar-commands.c:401 tests/ui-tests/message-browser.c:676
-msgid "File not found"
-msgstr "Datei nicht gefunden"
-
-#: calendar/gui/calendar-commands.c:423
-msgid "Open calendar"
-msgstr "Kalender öffnen"
-
-#: calendar/gui/calendar-commands.c:462
-msgid "Save calendar"
-msgstr "Kalender speichern"
-
-#: calendar/gui/calendar-commands.c:489 calendar/gui/gncal-todo.c:763
-#: calendar/gui/gncal-todo.c:767
-msgid "Day"
-msgstr "Tag"
-
-#: calendar/gui/calendar-commands.c:489
-msgid "Show 1 day"
-msgstr "Einen Tag zeigen"
-
-#: calendar/gui/calendar-commands.c:492
-msgid "5 Days"
-msgstr "5 Tage"
-
-#: calendar/gui/calendar-commands.c:492
-msgid "Show the working week"
-msgstr "Die Arbeitswoche zeigen"
-
-#: calendar/gui/calendar-commands.c:495 calendar/gui/gncal-todo.c:762
-msgid "Week"
-msgstr "Woche"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Show 1 week"
-msgstr "1 Woche zeigen"
-
-#: calendar/gui/calendar-commands.c:498
-msgid "Month"
-msgstr "Monat"
-
-#: calendar/gui/calendar-commands.c:498
-msgid "Show 1 month"
-msgstr "1 Monat zeigen"
-
-#: calendar/gui/calendar-commands.c:502
-msgid "Year"
-msgstr "Jahr"
-
-#: calendar/gui/calendar-commands.c:502
-msgid "Show 1 year"
-msgstr "1 Jahr zeigen"
-
-#: calendar/gui/calendar-commands.c:511 calendar/gui/calendar-commands.c:663
-msgid "Create a new appointment"
-msgstr "Neuen Termin anlegen"
-
-#: calendar/gui/calendar-commands.c:516 calendar/gui/calendar-commands.c:655
-msgid "Print this calendar"
-msgstr "Diesen Kalender drucken"
-
-#: calendar/gui/calendar-commands.c:520
-msgid "Prev"
-msgstr "Zurück"
-
-#: calendar/gui/calendar-commands.c:520
-msgid "Go back in time"
-msgstr "In der Zeit zurückgehen"
-
-#: calendar/gui/calendar-commands.c:521
-msgid "Today"
-msgstr "Heute"
-
-#: calendar/gui/calendar-commands.c:521
-msgid "Go to present time"
-msgstr "Zur Gegenwart springen"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Next"
-msgstr "Vor"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Go forward in time"
-msgstr "In der Zeit vorangehen"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Go to"
-msgstr "Gehe zu"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Go to a specific date"
-msgstr "Zu einem bestimmten Datum gehen"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:640
-msgid "New Ca_lendar"
-msgstr "Neuer Kalender"
-
-#: calendar/gui/calendar-commands.c:641
-msgid "Create a new calendar"
-msgstr "Einen neuen Kalender anlegen"
-
-#: calendar/gui/calendar-commands.c:644
-msgid "Open Ca_lendar"
-msgstr "Kalender öffnen"
-
-#: calendar/gui/calendar-commands.c:645
-msgid "Open a calendar"
-msgstr "Einen Kalender öffnen"
-
-#: calendar/gui/calendar-commands.c:649 calendar/gui/calendar-commands.c:650
-msgid "Save Calendar As"
-msgstr "Kalender speichern unter"
-
-#: calendar/gui/calendar-commands.c:663
-msgid "_New appointment..."
-msgstr "Neuer Termin..."
-
-#: calendar/gui/calendar-commands.c:671 calendar/gui/prop.c:718
-msgid "Preferences"
-msgstr "Einstellungen"
-
-#: calendar/gui/calendar-commands.c:678 calendar/gui/calendar-commands.c:679
-msgid "About Calendar"
-msgstr "Über den Kalender"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:721
-#, c-format
-msgid "%s%s"
-msgstr "%2$s%1$s"
-
-#: calendar/gui/calendar-commands.c:721
-msgid "'s calendar"
-msgstr "Kalender für "
-
-#: calendar/gui/calendar-model.c:323
-msgid "Public"
-msgstr "Öffentlich"
-
-#: calendar/gui/calendar-model.c:326
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:27
-msgid "Private"
-msgstr "Privat"
-
-#: calendar/gui/calendar-model.c:329
-msgid "Confidential"
-msgstr "Vertraulich"
-
-#: calendar/gui/calendar-model.c:332 calendar/gui/calendar-model.c:499
-msgid "Unknown"
-msgstr "Unbekannt"
-
-#: calendar/gui/calendar-model.c:419
-msgid "N"
-msgstr "N"
-
-#: calendar/gui/calendar-model.c:419
-msgid "S"
-msgstr "S"
-
-#: calendar/gui/calendar-model.c:421
-msgid "E"
-msgstr "O"
-
-#: calendar/gui/calendar-model.c:421
-msgid "W"
-msgstr "W"
-
-#: calendar/gui/calendar-model.c:493
-msgid "Transparent"
-msgstr "Transparent"
-
-#: calendar/gui/calendar-model.c:496
-msgid "Opaque"
-msgstr "Opak"
-
-#: calendar/gui/calendar-model.c:747
-#, c-format
-msgid ""
-"The date must be entered in the format: \n"
-"\n"
-"%s"
-msgstr ""
-"Das Datum muss in diesem Format eingegeben werden: \n"
-"\n"
-"%s"
-
-#: calendar/gui/calendar-model.c:820
-msgid ""
-"The geographical position must be entered in the format: \n"
-"\n"
-"45.436845,125.862501"
-msgstr ""
-"Die geographische Position muss in diesem Format eingegeben werden: \n"
-"\n"
-"45.436845,125.862501"
-
-#: calendar/gui/calendar-model.c:865
-msgid "The percent value must be between 0 and 100"
-msgstr "Der Prozentwert muss zwischen 0 und 100 sein"
-
-#: calendar/gui/calendar-model.c:898
-msgid "The priority must be between 0 and 10"
-msgstr "Die Priorität muss zwischen 0 und 10 sein"
-
-#: calendar/gui/control-factory.c:132
-msgid "The URI that the calendar will display"
-msgstr "Der URI, den der Kalender anzeigen wird"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:183
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "Alarm am %A, %d. %b %Y um %H.%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:190
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr "Hinweis auf Ihren Termin am %A, %d. %b %Y um %H.%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:201
-msgid "No summary available."
-msgstr "Keine Zusammenfassung verfügbar."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "Schließen"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1086
-msgid "Snooze"
-msgstr "Weiterschlafen"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "Termin bearbeiten"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr "Weiterschlaf-Zeit (Minuten)"
-
-#: calendar/gui/dialogs/task-editor.c:245 calendar/gui/event-editor.c:1209
-msgid "FIXME: _Delete"
-msgstr "FIXME: Löschen"
-
-#: calendar/gui/dialogs/task-editor.c:287
-#: calendar/gui/dialogs/task-editor.c:295
-msgid "FIXME: In_complete Task"
-msgstr "FIXME: Unvollständiger Auftrag"
-
-#: calendar/gui/dialogs/task-editor.c:347 calendar/gui/event-editor.c:1311
-msgid "FIXME: Chec_k Names"
-msgstr "FIXME: Namen prüfen"
-
-#: calendar/gui/dialogs/task-editor.c:348 calendar/gui/event-editor.c:1312
-msgid "FIXME: Address _Book..."
-msgstr "FIXME Adressbuch..."
-
-#: calendar/gui/dialogs/task-editor.c:355
-msgid "FIXME: _New Task"
-msgstr "FIXME: _Neuer Auftrag"
-
-#: calendar/gui/dialogs/task-editor.c:357
-msgid "FIXME: S_end Status Report"
-msgstr "FIXME: Statusbericht senden"
-
-#: calendar/gui/dialogs/task-editor.c:358
-msgid "FIXME: _Mark Complete"
-msgstr "FIXME: Als abgeschlossen markieren"
-
-#: calendar/gui/dialogs/task-editor.c:360 calendar/gui/event-editor.c:1321
-msgid "FIXME: Rec_urrence..."
-msgstr "FIXME: Wiederholung..."
-
-#: calendar/gui/dialogs/task-editor.c:361
-msgid "FIXME: S_kip Occurrence"
-msgstr "FIXME: Wiederholung überspringen"
-
-#: calendar/gui/dialogs/task-editor.c:363
-msgid "FIXME: Assig_n Task"
-msgstr "FIXME: Auftrag zuweisen"
-
-#: calendar/gui/dialogs/task-editor.c:365
-msgid "FIXME: _Reply"
-msgstr "FIXME: Antworten"
-
-#: calendar/gui/dialogs/task-editor.c:366
-msgid "FIXME: Reply to A_ll"
-msgstr "FIXME: Antwort an alle"
-
-#: calendar/gui/dialogs/task-editor.c:409 calendar/gui/event-editor.c:1381
-msgid "FIXME: Save and Close"
-msgstr "FIXME: Speichern und schließen"
-
-#: calendar/gui/dialogs/task-editor.c:410
-msgid "Save the task and close the dialog box"
-msgstr "Den Auftrag speichern und das Dialogfenster schließen"
-
-#: calendar/gui/dialogs/task-editor.c:414 calendar/gui/event-editor.c:1386
-msgid "FIXME: Print..."
-msgstr "FIXME: Drucken..."
-
-#: calendar/gui/dialogs/task-editor.c:419 calendar/gui/event-editor.c:1391
-msgid "FIXME: Recurrence..."
-msgstr "FIXME: Wiederholung..."
-
-#: calendar/gui/dialogs/task-editor.c:420 calendar/gui/event-editor.c:1392
-msgid "Configure recurrence rules"
-msgstr "Wiederholungsregeln konfigurieren"
-
-#: calendar/gui/dialogs/task-editor.c:422
-msgid "FIXME: Assign Task..."
-msgstr "FIXME: Auftrag zuweisen..."
-
-#: calendar/gui/dialogs/task-editor.c:423
-msgid "Assign the task to someone"
-msgstr "Jemandem den Auftrag zuweisen"
-
-#: calendar/gui/dialogs/task-editor.c:425 calendar/gui/event-editor.c:1397
-msgid "FIXME: Delete"
-msgstr "FIXME: Löschen"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:7
-msgid "S_ubject:"
-msgstr "Betreff:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:8
-msgid "Owner:"
-msgstr "Eigner:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:9
-msgid "Sta_rt Date:"
-msgstr "Anfangsdatum:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:10
-msgid "_Due Date:"
-msgstr "Fällig am:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:11
-msgid "_Status:"
-msgstr "Status:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:12
-msgid ""
-"Not Started\n"
-"In Progress\n"
-"Completed\n"
-"Cancelled\n"
-msgstr ""
-"Nicht begonnen\n"
-"Wird bearbeitet\n"
-"Abgeschlossen\n"
-"Storniert\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:17
-msgid "Not Started"
-msgstr "Nicht begonnen"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:18
-msgid "_Priority:"
-msgstr "_Priorität:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:19
-msgid ""
-"High\n"
-"Normal\n"
-"Low\n"
-msgstr ""
-"Hoch\n"
-"Normal\n"
-"Niedrig\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:23
-msgid "High"
-msgstr "Hoch"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:24
-msgid "% Comp_lete:"
-msgstr "% abgeschlossen:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:25
-msgid "_Contacts..."
-msgstr "Kontakte..."
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:28
-msgid "Task"
-msgstr "Auftrag"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:29
-msgid "Date Completed:"
-msgstr "Abgeschlossen am:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:30
-msgid "Location:"
-msgstr "Ort:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:31
-msgid "URL:"
-msgstr "URL:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:32
-msgid "Resources:"
-msgstr "Ressourcen:"
-
-#: calendar/gui/e-calendar-table.c:189
-msgid "Comment"
-msgstr "Kommentar"
-
-#: calendar/gui/e-calendar-table.c:194
-msgid "Completed"
-msgstr "Abgeschlossen"
-
-#: calendar/gui/e-calendar-table.c:199
-msgid "Created"
-msgstr "Erzeugt"
-
-#: calendar/gui/e-calendar-table.c:204
-msgid "Description"
-msgstr "Beschreibung"
-
-#: calendar/gui/e-calendar-table.c:209
-msgid "Timestamp"
-msgstr "Zeitstempel"
-
-#: calendar/gui/e-calendar-table.c:214
-msgid "Start Date"
-msgstr "Anfangsdatum"
-
-#: calendar/gui/e-calendar-table.c:219
-msgid "End Date"
-msgstr "Enddatum"
-
-#: calendar/gui/e-calendar-table.c:224
-msgid "Geographical Position"
-msgstr "Geographische Position"
-
-#: calendar/gui/e-calendar-table.c:229
-msgid "Last Modification Date"
-msgstr "Letztes Änderungsdatum"
-
-#: calendar/gui/e-calendar-table.c:234
-msgid "Location"
-msgstr "Ort"
-
-#: calendar/gui/e-calendar-table.c:239
-msgid "Organizer"
-msgstr "Organisator"
-
-#: calendar/gui/e-calendar-table.c:244
-msgid "% Complete"
-msgstr "% abgeschlossen"
-
-#: calendar/gui/e-calendar-table.c:249 calendar/gui/gncal-todo.c:476
-#: calendar/gui/prop.c:611 mail/message-list.c:508
-msgid "Priority"
-msgstr "Priorität"
-
-#: calendar/gui/e-calendar-table.c:260
-msgid "TaskPad"
-msgstr "Auftragsblock"
-
-#: calendar/gui/e-calendar-table.c:265
-msgid "URL"
-msgstr "URL"
-
-#: calendar/gui/e-calendar-table.c:270
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "Reminder"
-msgstr "Erinnerung"
-
-#: calendar/gui/e-calendar-table.c:369
-msgid "Open..."
-msgstr "Öffnen..."
-
-#: calendar/gui/e-calendar-table.c:370
-msgid "Open the task"
-msgstr "Den Auftrag öffnen"
-
-#: calendar/gui/e-calendar-table.c:372
-msgid "Mark Complete"
-msgstr "Als abgeschlossen markieren"
-
-#: calendar/gui/e-calendar-table.c:373
-msgid "Mark the task complete"
-msgstr "Den Auftrag als abgeschlossen markieren"
-
-#: calendar/gui/e-calendar-table.c:376
-msgid "Delete the task"
-msgstr "Diesen Auftrag löschen"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr "%02i Minuten-Unterteilungen"
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "Neuer Termin..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "Diesen Termin bearbeiten..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "Diesen Termin löschen"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "Diesen Termin beweglich machen"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr "Dieses Auftreten löschen"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr "Jedes Auftreten löschen"
-
-#: calendar/gui/event-editor.c:294
-msgid "Edit Appointment"
-msgstr "Termin bearbeiten"
-
-#: calendar/gui/event-editor.c:300
-msgid "No summary"
-msgstr "Keine Zusammenfassung"
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Appointment - %s"
-msgstr "Termin - %s"
-
-#: calendar/gui/event-editor.c:309
-#, c-format
-msgid "Task - %s"
-msgstr "Auftrag - %s"
-
-#: calendar/gui/event-editor.c:312
-#, c-format
-msgid "Journal entry - %s"
-msgstr "Journal-Eintrag - %s"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:613 calendar/gui/event-editor.c:717
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1276
-msgid "FIXME: Ca_lendar..."
-msgstr "FIXME: Kalender..."
-
-#: calendar/gui/event-editor.c:1319
-msgid "FIXME: _New Appointment"
-msgstr "FIXME: Neuer Termin"
-
-#: calendar/gui/event-editor.c:1323
-msgid "FIXME: Invite _Attendees..."
-msgstr "FIXME: Teilnehmer einladen..."
-
-#: calendar/gui/event-editor.c:1324
-msgid "FIXME: C_ancel Invitation..."
-msgstr "FIXME: Einladung rückgängig machen..."
-
-#: calendar/gui/event-editor.c:1326
-msgid "FIXME: Forward as v_Calendar"
-msgstr "FIXME: Als vCalendar weiterleiten"
-
-#: calendar/gui/event-editor.c:1394
-msgid "FIXME: Invite Attendees..."
-msgstr "FIXME: Teilnehmer einladen..."
-
-#: calendar/gui/event-editor.c:1395
-msgid "Invite attendees to a meeting"
-msgstr "Teilnehmer zu einer Besprechung einladen"
-
-#: calendar/gui/event-editor.c:1838
-msgid "%a %b %d %Y"
-msgstr "%a, %d. %b %Y"
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr "Zusammenfassung:"
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr "Eigner:"
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr "Zeit"
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr "Anfangszeit:"
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr "Endzeit:"
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr "Ganztägiges Ereignis"
-
-#: calendar/gui/event-editor-dialog.glade.h:14
-msgid "Classification"
-msgstr "Klassifikation"
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-msgid "Pu_blic"
-msgstr "Öffentlich"
-
-#: calendar/gui/event-editor-dialog.glade.h:16
-msgid "Pri_vate"
-msgstr "Privat"
-
-#: calendar/gui/event-editor-dialog.glade.h:17
-msgid "_Confidential"
-msgstr "Vertraulich"
-
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-"Minuten\n"
-"Stunden\n"
-"Tage\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "_Display"
-msgstr "Anzeige"
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Audio"
-msgstr "Audio"
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "_Program"
-msgstr "_Programm"
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "_Mail"
-msgstr "Mail"
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-msgid "Mail _to:"
-msgstr "Mail an:"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Run program:"
-msgstr "Programm aufrufen:"
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr "Wiederholungsregel"
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:875
-msgid "None"
-msgstr "Keine"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-msgid "Daily"
-msgstr "Täglich"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr "Wöchentlich"
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr "Monatlich"
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr "Jährlich"
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr "Alle "
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr "Tag(e)"
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr "Woche(n)"
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "Mo"
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "Di"
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "Mi"
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "Do"
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "Fr"
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "Sa"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "So"
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr "Wiederholen am"
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr ". Tag des Monats"
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-"1.\n"
-"2.\n"
-"3.\n"
-"4.\n"
-"5.\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-"Montag\n"
-"Dienstag\n"
-"Mittwoch\n"
-"Donnerstag\n"
-"Freitag\n"
-"Samstag\n"
-"Sonntag\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr "Alle"
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-msgid "month(s)"
-msgstr "Monat(e)"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr "Jahr(e)"
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr "Enddatum"
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr "Für immer wiederholen"
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr "Ende am "
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr "Ende nach"
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr "Auftreten"
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-msgid "Exceptions"
-msgstr "Ausnahmen"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-msgid "Change"
-msgstr "Ändern"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr "Wiederholung"
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "Januar"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "Februar"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "März"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "April"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "Mai"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "Juni"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "Juli"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "August"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "September"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "Sep"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "Oktober"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "November"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "Dezember"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "Sonntag"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "Montag"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "Dienstag"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "Di"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "Mittwoch"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "Mittw"
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "Donnerstag"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "Don"
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "Donn"
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "Freitag"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "Samstag"
-
-#: calendar/gui/getdate.y:420 filter/filter-datespec.c:61
-msgid "year"
-msgstr "Jahr"
-
-#: calendar/gui/getdate.y:421 filter/filter-datespec.c:62
-msgid "month"
-msgstr "Monat"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr "14 Tage"
-
-#: calendar/gui/getdate.y:423 filter/filter-datespec.c:63
-msgid "week"
-msgstr "Woche"
-
-#: calendar/gui/getdate.y:424 filter/filter-datespec.c:64
-msgid "day"
-msgstr "Tag"
-
-#: calendar/gui/getdate.y:425 filter/filter-datespec.c:65
-msgid "hour"
-msgstr "Stunde"
-
-#: calendar/gui/getdate.y:426 filter/filter-datespec.c:66
-msgid "minute"
-msgstr "Minute"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "min"
-
-#: calendar/gui/getdate.y:428 filter/filter-datespec.c:67
-msgid "second"
-msgstr "Sekunde"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "s"
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "morgen"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "gestern"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "heute"
-
-#: calendar/gui/getdate.y:438 filter/filter-datespec.c:504
-#: filter/filter-datespec.c:664
-msgid "now"
-msgstr "jetzt"
-
-#: calendar/gui/getdate.y:439
-msgid "last"
-msgstr "letzter"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr "dieser"
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr "nächster"
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr "erster"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr "dritter"
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr "vierter"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr "fünfter"
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr "sechster"
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr "siebter"
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr "achter"
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr "neunter"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr "zehnter"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr "elfter"
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr "zwölfter"
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr "her"
-
-#: calendar/gui/gncal-todo.c:167
-msgid "Create to-do item"
-msgstr "To-Do-Eintrag erzeugen"
-
-#: calendar/gui/gncal-todo.c:167
-msgid "Edit to-do item"
-msgstr "To-Do-Eintrag bearbeiten"
-
-#: calendar/gui/gncal-todo.c:203
-msgid "Summary:"
-msgstr "Zusammenfassung:"
-
-#: calendar/gui/gncal-todo.c:214
-msgid "Due Date:"
-msgstr "Fällig am:"
-
-#: calendar/gui/gncal-todo.c:225
-msgid "Priority:"
-msgstr "Priorität:"
-
-#: calendar/gui/gncal-todo.c:243
-msgid "Item Comments:"
-msgstr "Kommentar zum Eintrag:"
-
-#: calendar/gui/gncal-todo.c:374
-msgid "Add to-do item..."
-msgstr "To-Do-Eintrag hinzufügen..."
-
-#: calendar/gui/gncal-todo.c:375
-msgid "Edit this item..."
-msgstr "Diesen Eintrag bearbeiten..."
-
-#: calendar/gui/gncal-todo.c:474
-msgid "Summary"
-msgstr "Zusammenfassung"
-
-#: calendar/gui/gncal-todo.c:475 calendar/gui/prop.c:610
-msgid "Due Date"
-msgstr "Fällig am"
-
-#: calendar/gui/gncal-todo.c:477
-msgid "Time Left"
-msgstr "Verbleibende Zeit"
-
-#. Label
-#: calendar/gui/gncal-todo.c:489
-msgid "To-do list"
-msgstr "To-do-Liste"
-
-#. Add
-#: calendar/gui/gncal-todo.c:528
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Hinzufügen..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:537
-msgid "Edit..."
-msgstr "Bearbeiten..."
-
-#: calendar/gui/gncal-todo.c:762
-msgid "Weeks"
-msgstr "Wochen"
-
-#: calendar/gui/gncal-todo.c:763 calendar/gui/gncal-todo.c:767
-msgid "Days"
-msgstr "Tage"
-
-#: calendar/gui/gncal-todo.c:768 calendar/gui/gncal-todo.c:772
-msgid "Hours"
-msgstr "Stunden"
-
-#: calendar/gui/gncal-todo.c:768 calendar/gui/gncal-todo.c:772
-msgid "Hour"
-msgstr "Stunde"
-
-#: calendar/gui/gncal-todo.c:773 calendar/gui/gncal-todo.c:777
-msgid "Minutes"
-msgstr "Minuten"
-
-#: calendar/gui/gncal-todo.c:773 calendar/gui/gncal-todo.c:777
-msgid "Minute"
-msgstr "Minute"
-
-#: calendar/gui/gncal-todo.c:778 calendar/gui/gncal-todo.c:782
-msgid "Seconds"
-msgstr "Sekunden"
-
-#: calendar/gui/gncal-todo.c:778 calendar/gui/gncal-todo.c:782
-msgid "Second"
-msgstr "Sekunde"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1094
-#: calendar/gui/gnome-cal.c:1150
-msgid "Reminder of your appointment at "
-msgstr "Erinnerung an Ihren Termin am "
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1099 calendar/gui/gnome-cal.c:1154
-msgid "Ok"
-msgstr "OK"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "Jahr:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "Zu Datum gehen"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-"Bitte wählen Sie das Datum, zu dem Sie gehen\n"
-"wollen. Wenn Sie auf einen Tag klicken, werden\n"
-"Sie zu diesem Datum gebracht."
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "Zum heutigen Tag"
-
-#: calendar/gui/print.c:288
-msgid "1st"
-msgstr "1."
-
-#: calendar/gui/print.c:288
-msgid "2nd"
-msgstr "2."
-
-#: calendar/gui/print.c:288
-msgid "3rd"
-msgstr "3."
-
-#: calendar/gui/print.c:288
-msgid "4th"
-msgstr "4."
-
-#: calendar/gui/print.c:288
-msgid "5th"
-msgstr "5."
-
-#: calendar/gui/print.c:289
-msgid "6th"
-msgstr "6."
-
-#: calendar/gui/print.c:289
-msgid "7th"
-msgstr "7."
-
-#: calendar/gui/print.c:289
-msgid "8th"
-msgstr "8."
-
-#: calendar/gui/print.c:289
-msgid "9th"
-msgstr "9."
-
-#: calendar/gui/print.c:289
-msgid "10th"
-msgstr "10."
-
-#: calendar/gui/print.c:290
-msgid "11th"
-msgstr "11."
-
-#: calendar/gui/print.c:290
-msgid "12th"
-msgstr "12."
-
-#: calendar/gui/print.c:290
-msgid "13th"
-msgstr "13."
-
-#: calendar/gui/print.c:290
-msgid "14th"
-msgstr "14."
-
-#: calendar/gui/print.c:290
-msgid "15th"
-msgstr "15."
-
-#: calendar/gui/print.c:291
-msgid "16th"
-msgstr "16."
-
-#: calendar/gui/print.c:291
-msgid "17th"
-msgstr "17."
-
-#: calendar/gui/print.c:291
-msgid "18th"
-msgstr "18."
-
-#: calendar/gui/print.c:291
-msgid "19th"
-msgstr "19."
-
-#: calendar/gui/print.c:291
-msgid "20th"
-msgstr "20."
-
-#: calendar/gui/print.c:292
-msgid "21st"
-msgstr "21."
-
-#: calendar/gui/print.c:292
-msgid "22nd"
-msgstr "22."
-
-#: calendar/gui/print.c:292
-msgid "23rd"
-msgstr "23."
-
-#: calendar/gui/print.c:292
-msgid "24th"
-msgstr "24."
-
-#: calendar/gui/print.c:292
-msgid "25th"
-msgstr "25."
-
-#: calendar/gui/print.c:293
-msgid "26th"
-msgstr "26."
-
-#: calendar/gui/print.c:293
-msgid "27th"
-msgstr "27."
-
-#: calendar/gui/print.c:293
-msgid "28th"
-msgstr "28."
-
-#: calendar/gui/print.c:293
-msgid "29th"
-msgstr "29."
-
-#: calendar/gui/print.c:293
-msgid "30th"
-msgstr "30."
-
-#: calendar/gui/print.c:294
-msgid "31st"
-msgstr "31."
-
-#: calendar/gui/print.c:349
-msgid "Su"
-msgstr "So"
-
-#: calendar/gui/print.c:349
-msgid "Mo"
-msgstr "Mo"
-
-#: calendar/gui/print.c:349
-msgid "Tu"
-msgstr "Di"
-
-#: calendar/gui/print.c:349
-msgid "We"
-msgstr "Mi"
-
-#: calendar/gui/print.c:349
-msgid "Th"
-msgstr "Do"
-
-#: calendar/gui/print.c:349
-msgid "Fr"
-msgstr "Fr"
-
-#: calendar/gui/print.c:349
-msgid "Sa"
-msgstr "Sa"
-
-#: calendar/gui/print.c:943
-msgid "TODO Items"
-msgstr "To-Do-Einträge"
-
-#. Day
-#: calendar/gui/print.c:1049
-msgid "Current day (%a %b %d %Y)"
-msgstr "Aktueller Tag (%a, %d. %b %Y)"
-
-#: calendar/gui/print.c:1069 calendar/gui/print.c:1083
-#: calendar/gui/print.c:1084
-msgid "%a"
-msgstr "%a"
-
-#: calendar/gui/print.c:1070 calendar/gui/print.c:1071
-#: calendar/gui/print.c:1085 calendar/gui/print.c:1086
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1073
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "Aktuelle Woche (%s %s %d - %s %d %d)"
-
-#: calendar/gui/print.c:1090
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "Aktuelle Woche (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1096
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "Aktuelle Woche (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1109
-msgid "Current month (%a %Y)"
-msgstr "Aktueller Monat (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1116
-msgid "Current year (%Y)"
-msgstr "Aktuelles Jahr (%Y)"
-
-#: calendar/gui/print.c:1153
-msgid "Print Calendar"
-msgstr "Kalender drucken"
-
-#: calendar/gui/print.c:1318
-msgid "Print Preview"
-msgstr "Druckvorschau"
-
-#: calendar/gui/prop.c:336
-msgid "Time display"
-msgstr "Zeitanzeige"
-
-#. Time format
-#: calendar/gui/prop.c:340
-msgid "Time format"
-msgstr "Zeitformat"
-
-#: calendar/gui/prop.c:341
-msgid "12-hour (AM/PM)"
-msgstr "12 Stunden (AM/PM)"
-
-#: calendar/gui/prop.c:342
-msgid "24-hour"
-msgstr "24 Stunden"
-
-#. Weeks start on
-#: calendar/gui/prop.c:352
-msgid "Weeks start on"
-msgstr "Wochen beginnen mit"
-
-#: calendar/gui/prop.c:353
-msgid "Sunday"
-msgstr "Sonntag"
-
-#: calendar/gui/prop.c:354
-msgid "Monday"
-msgstr "Montag"
-
-#. Day range
-#: calendar/gui/prop.c:364
-msgid "Day range"
-msgstr "Tagesbereich"
-
-#: calendar/gui/prop.c:375
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-"Bitte wählen Sie den Anfang und das Ende des\n"
-"Stundenbereichs, der in der Tages- und\n"
-"Wochenansicht dargestellt werden soll. Zeiten\n"
-"außerhalb dieses Bereichs werden normalerweise\n"
-"nicht dargestellt."
-
-#: calendar/gui/prop.c:391
-msgid "Day start:"
-msgstr "Tagesbeginn:"
-
-#: calendar/gui/prop.c:402
-msgid "Day end:"
-msgstr "Tagesende:"
-
-#: calendar/gui/prop.c:525
-msgid "Colors for display"
-msgstr "Farben für Anzeige"
-
-#: calendar/gui/prop.c:528
-msgid "Colors"
-msgstr "Farben"
-
-#: calendar/gui/prop.c:605
-msgid "Show on TODO List:"
-msgstr "Auf To-Do-Liste zeigen:"
-
-#: calendar/gui/prop.c:612
-msgid "Time Until Due"
-msgstr "Zeit bis Fälligkeit"
-
-#: calendar/gui/prop.c:643
-msgid "To Do List style options:"
-msgstr "Stiloptionen der To-Do-Liste:"
-
-#: calendar/gui/prop.c:648
-msgid "Highlight overdue items"
-msgstr "Überfällige Einträge markieren"
-
-#: calendar/gui/prop.c:651
-msgid "Highlight not yet due items"
-msgstr "Noch nicht fällige Einträge markieren"
-
-#: calendar/gui/prop.c:654
-msgid "Highlight items due today"
-msgstr "Heute fällig Einträge markieren"
-
-#: calendar/gui/prop.c:684
-msgid "To Do List Properties"
-msgstr "Eigenschaften der To-Do-Liste"
-
-#: calendar/gui/prop.c:687
-msgid "To Do List"
-msgstr "To-Do-Liste"
-
-#: calendar/gui/prop.c:786
-msgid "Alarms"
-msgstr "Alarme"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:789
-msgid "Alarm Properties"
-msgstr "Alarm-Eigenschaften"
-
-#: calendar/gui/prop.c:799
-msgid "Beep on display alarms"
-msgstr "Bei angezeigtem Alarm piepsen"
-
-#: calendar/gui/prop.c:809
-msgid "Audio alarms timeout after"
-msgstr "Audio-Alarme schweigen nach"
-
-#: calendar/gui/prop.c:820 calendar/gui/prop.c:837
-msgid " seconds"
-msgstr " Sekunden"
-
-#: calendar/gui/prop.c:826
-msgid "Enable snoozing for "
-msgstr "Weiterschlafen aktivieren für "
-
-#. populate default frame/box
-#: calendar/gui/prop.c:842
-msgid "Defaults"
-msgstr "Voreinstellungen"
-
-#: composer/e-msg-composer-address-dialog.c:182
-msgid "Cut"
-msgstr "Ausschneiden"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut selected item into clipboard"
-msgstr "Gewähltes Element in die Zwischenablage ausschneiden"
-
-#: composer/e-msg-composer-address-dialog.c:186
-#: mail/folder-browser-factory.c:46
-msgid "Copy"
-msgstr "Kopieren"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy selected item into clipboard"
-msgstr "Gewähltes Element in die Zwischenablage ausschneiden"
-
-#: composer/e-msg-composer-address-dialog.c:190
-#: composer/e-msg-composer-address-dialog.c:198
-msgid "Paste"
-msgstr "Einfügen"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste item from clipboard"
-msgstr "Element aus der Zwischenablage einfügen"
-
-#: composer/e-msg-composer-address-dialog.c:525
-msgid "Select recipients' addresses"
-msgstr "Empfängeradresse auswählen"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Empfängerliste:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Suchen..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Name"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-#: mail/mail-config.glade.h:8
-msgid "Address"
-msgstr "Adresse"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Eigenschaften..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "An: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "label9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "label7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "label8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 Byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u Bytes"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Anhang hinzufügen"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Entfernen"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Entferne das gewählte Element aus der Anhangsliste"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Anhang hinzufügen..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Eine Datei zu der Nachricht hinzufügen"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "Anlagen-Eigenschaften"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "MIME-Typ:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "Dateiname:"
-
-#: composer/e-msg-composer-hdrs.c:137 composer/e-msg-composer-hdrs.c:295
-msgid "From:"
-msgstr "Von:"
-
-#: composer/e-msg-composer-hdrs.c:243
-msgid "Click here for the address book"
-msgstr "Für das Adressbuch hier klicken"
-
-#: composer/e-msg-composer-hdrs.c:296
-msgid "Enter the identitiy you wish to send this message from"
-msgstr ""
-"Geben Sie die Identität ein, von der diese Nachricht gesendet werden soll"
-
-#: composer/e-msg-composer-hdrs.c:300
-msgid "To:"
-msgstr "An:"
-
-#: composer/e-msg-composer-hdrs.c:301
-msgid "Enter the recipients of the message"
-msgstr "Gebe die Empfänger der Nachricht ein"
-
-#: composer/e-msg-composer-hdrs.c:305
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:306
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Gebe die Adressen ein, die eine Kopie der Nachricht erhalten"
-
-#: composer/e-msg-composer-hdrs.c:311
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:312
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Gebe die Adressen ein, die eine Kopie erhalten, dienicht in der "
-"Empfängerliste auftaucht."
-
-#: composer/e-msg-composer-hdrs.c:318
-msgid "Subject:"
-msgstr "Betreff:"
-
-#: composer/e-msg-composer-hdrs.c:319
-msgid "Enter the subject of the mail"
-msgstr "Gebe den Betreff der Nachricht an"
-
-#: composer/e-msg-composer.c:451
-msgid "Save as..."
-msgstr "Speichern unter..."
-
-#: composer/e-msg-composer.c:462
-#, c-format
-msgid "Error saving file: %s"
-msgstr "Fehler beim Speichern der Datei: %s"
-
-#: composer/e-msg-composer.c:482
-#, c-format
-msgid "Error loading file: %s"
-msgstr "Fehler beim Laden der Datei: %s"
-
-#: composer/e-msg-composer.c:504
-msgid "Saving changes to message..."
-msgstr "Speichere Änderungen an Nachricht..."
-
-#: composer/e-msg-composer.c:506
-msgid "About to save changes to message..."
-msgstr "Dabei, Änderungen an Nachricht zu speichern..."
-
-#: composer/e-msg-composer.c:590 shell/e-shell-view-menu.c:165
-msgid "Evolution"
-msgstr "Evolution"
-
-#: composer/e-msg-composer.c:596
-msgid ""
-"This message has not been sent.\n"
-"\n"
-"Do you wish to save your changes?"
-msgstr ""
-"Diese Nachricht wurde nicht versandt.\n"
-"\n"
-"Wollen Sie Ihre Änderungen speichern?"
-
-#: composer/e-msg-composer.c:618
-msgid "Open file"
-msgstr "Datei öffnen"
-
-#: composer/e-msg-composer.c:730
-msgid "That file does not exist."
-msgstr "Diese Datei existiert nicht."
-
-#: composer/e-msg-composer.c:740
-msgid "That is not a regular file."
-msgstr "Diese Datei ist keine normale Datei."
-
-#: composer/e-msg-composer.c:750
-msgid "That file exists but is not readable."
-msgstr "Diese Datei existiert, ist aber nicht lesbar."
-
-#: composer/e-msg-composer.c:760
-msgid "That file appeared accesible but open(2) failed."
-msgstr "Diese Datei scheint lesbar zu sein, aber open(2) schlug fehl."
-
-#: composer/e-msg-composer.c:782
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"Diese Datei ist sehr groß (mehr als 100 kB).\n"
-"Sind Sie sicher, dass Sie sie einfügen wollen?"
-
-#: composer/e-msg-composer.c:803
-msgid "An error occurred while reading the file."
-msgstr "Ein Fehler trat beim Lesen der Datei auf."
-
-#: composer/e-msg-composer.c:899 shell/e-shell-view-menu.c:434
-msgid "_File"
-msgstr "_Datei"
-
-#: composer/e-msg-composer.c:905
-msgid "_Open..."
-msgstr "Ö_ffnen..."
-
-#: composer/e-msg-composer.c:906
-msgid "Load a previously saved message"
-msgstr "Eine vorher gespeicherte Nachricht laden"
-
-#: composer/e-msg-composer.c:914
-msgid "_Save..."
-msgstr "_Speichern..."
-
-#: composer/e-msg-composer.c:915
-msgid "Save message"
-msgstr "Nachricht speichern"
-
-#: composer/e-msg-composer.c:923
-msgid "_Save as..."
-msgstr "Speichern _unter..."
-
-#: composer/e-msg-composer.c:924
-msgid "Save message with a different name"
-msgstr "Speichert die Nachricht unter einem anderen Namen"
-
-#: composer/e-msg-composer.c:932
-msgid "Save in _folder..."
-msgstr "Speichern in _Ordner..."
-
-#: composer/e-msg-composer.c:933
-msgid "Save the message in a specified folder"
-msgstr "Speichere die Nachricht in einem bestimmten Ordner"
-
-#: composer/e-msg-composer.c:942
-msgid "_Insert text file... (FIXME)"
-msgstr "Textdatei einfügen... (FIXME)"
-
-#: composer/e-msg-composer.c:943
-msgid "Insert a file as text into the message"
-msgstr "Diese Datei als Text in die Nachricht einfügen"
-
-#: composer/e-msg-composer.c:952
-msgid "_Send"
-msgstr "_Senden"
-
-#: composer/e-msg-composer.c:953
-msgid "Send the message"
-msgstr "Sendet die Nschricht"
-
-#: composer/e-msg-composer.c:963
-msgid "_Close..."
-msgstr "S_chließen..."
-
-#: composer/e-msg-composer.c:964
-msgid "Quit the message composer"
-msgstr "Den Nachrichteneditor verlassen"
-
-#: composer/e-msg-composer.c:977 shell/e-shell-view-menu.c:478
-msgid "_Edit"
-msgstr "_Bearbeiten"
-
-#: composer/e-msg-composer.c:988
-msgid "_Format"
-msgstr "_Format"
-
-#: composer/e-msg-composer.c:994
-msgid "HTML"
-msgstr "HTML"
-
-#: composer/e-msg-composer.c:995
-msgid "Send the mail in HTML format"
-msgstr "Die Mail in HTML-Format senden"
-
-#: composer/e-msg-composer.c:1008 mail/folder-browser-factory.c:185
-#: shell/e-shell-view-menu.c:383 shell/e-shell-view-menu.c:489
-#: shell/e-storage-set-view.c:242
-msgid "_View"
-msgstr "_Ansicht"
-
-#: composer/e-msg-composer.c:1014
-msgid "Show _attachments"
-msgstr "_Anlagen anzeigen"
-
-#: composer/e-msg-composer.c:1015
-msgid "Show/hide attachments"
-msgstr "Anlagen anzeigen/verbergen"
-
-#: composer/e-msg-composer.c:1048
-msgid "Send"
-msgstr "Senden"
-
-#: composer/e-msg-composer.c:1049
-msgid "Send this message"
-msgstr "Diese Nachricht senden"
-
-#: composer/e-msg-composer.c:1058
-msgid "Attach"
-msgstr "Anhängen"
-
-#: composer/e-msg-composer.c:1059
-msgid "Attach a file"
-msgstr "eine Datei anhängen"
-
-#: composer/e-msg-composer.c:1246
-msgid "Compose a message"
-msgstr "Eine Nachricht erstellen"
-
-#: filter/filter-datespec.c:61
-msgid "years"
-msgstr "Jahre"
-
-#: filter/filter-datespec.c:62
-msgid "months"
-msgstr "Monate"
-
-#: filter/filter-datespec.c:63
-msgid "weeks"
-msgstr "Wochen"
-
-#: filter/filter-datespec.c:64
-msgid "days"
-msgstr "Tage"
-
-#: filter/filter-datespec.c:65
-msgid "hours"
-msgstr "Stunden"
-
-#: filter/filter-datespec.c:66
-msgid "minutes"
-msgstr "Minuten"
-
-#: filter/filter-datespec.c:67
-msgid "seconds"
-msgstr "Sekunden"
-
-#: filter/filter-datespec.c:232
-msgid ""
-"The message's date will be compared against\n"
-"whatever the time is when the filter is run\n"
-"or vfolder is opened."
-msgstr ""
-"Das Datum der Nachricht wird mit der Zeit\n"
-"verglichen, zu der der Filter ausgeführt oder\n"
-"der VFolder geöfnet wird."
-
-#: filter/filter-datespec.c:254
-msgid ""
-"The message's date will be compared against\n"
-"the time that you specify here."
-msgstr ""
-"Das Datum der Nachricht wird mit der hier\n"
-"von Ihnen angegebenen Zeit verglichen."
-
-#: filter/filter-datespec.c:293
-msgid ""
-"The message's date will be compared against\n"
-"a time relative to when the filter is run;\n"
-"\"a week ago\", for example."
-msgstr ""
-"Das Datum der Nachricht wird verglichen mit\n"
-"einer zur Zeit der Filterausführung relativen\n"
-"Zeit, z.B. \"vor einer Woche\"."
-
-#. keep in sync with FilterDatespec_type!
-#: filter/filter-datespec.c:328
-msgid "the current time"
-msgstr "der aktuellen Zeit"
-
-#: filter/filter-datespec.c:328
-msgid "a time you specify"
-msgstr "einer von Ihnen angegebene Zeit"
-
-#: filter/filter-datespec.c:329
-msgid "a time relative to the current time"
-msgstr "einer zur momentanen Zeit relativen Zeit"
-
-#. The label
-#: filter/filter-datespec.c:387
-msgid "Compare against"
-msgstr "Vergleichen mit"
-
-#: filter/filter-datespec.c:661
-msgid "<click here to select a date>"
-msgstr "<hier klicken, um ein Datum zu wählen>"
-
-#: filter/filter-editor.c:156 filter/score-editor.c:126
-#: filter/vfolder-editor.c:152
-msgid "Add Rule"
-msgstr "Regel hinzufügen"
-
-#: filter/filter-editor.c:188
-msgid "Edit Rule"
-msgstr "Regel bearbeiten"
-
-#: filter/filter-filter.c:397 filter/filter-rule.c:534
-msgid "Less"
-msgstr "Weniger"
-
-#: filter/filter-filter.c:400 filter/filter-rule.c:537
-msgid "More"
-msgstr "Mehr"
-
-#: filter/filter-folder.c:183 filter/vfolder-rule.c:269
-msgid "Select Folder"
-msgstr "Ordner wählen"
-
-#: filter/filter-folder.c:205
-msgid "Enter folder URI"
-msgstr "Ordner-URI eingeben"
-
-#: filter/filter-folder.c:247
-msgid "<click here to select a folder>"
-msgstr "<hier klicken, um einen Ordner zu wählen>"
-
-#: filter/filter-part.c:420
-msgid "Test"
-msgstr "Test"
-
-#: filter/score-editor.c:160
-msgid "Edit Score Rule"
-msgstr "Bewertungsregel bearbeiten"
-
-#: filter/vfolder-editor.c:186
-msgid "Edit VFolder Rule"
-msgstr "VFolder-Regel bearbeiten"
-
-#: mail/component-factory.c:187
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Kann die Evolution-Mail-Komponente nicht initialisieren"
-
-#: mail/folder-browser-factory.c:33
-msgid "Get mail"
-msgstr "Mails abrufen"
-
-#: mail/folder-browser-factory.c:33
-msgid "Check for new mail"
-msgstr "Nach neuen Mails suchen"
-
-#: mail/folder-browser-factory.c:34
-msgid "Compose"
-msgstr "Erstellen"
-
-#: mail/folder-browser-factory.c:34
-msgid "Compose a new message"
-msgstr "Eine neue Nachricht erstellen"
-
-#. GNOMEUIINFO_ITEM_STOCK (N_("Save"), N_("Save this message"),
-#. save_msg, GNOME_STOCK_PIXMAP_SAVE),
-#: mail/folder-browser-factory.c:38 mail/mail-view.c:135
-msgid "Reply"
-msgstr "Antworten"
-
-#: mail/folder-browser-factory.c:38 mail/mail-view.c:135
-msgid "Reply to the sender of this message"
-msgstr "An den Sender der Nachricht antworten"
-
-#: mail/folder-browser-factory.c:39 mail/mail-view.c:138
-msgid "Reply to All"
-msgstr "Allen antworten"
-
-#: mail/folder-browser-factory.c:39 mail/mail-view.c:138
-msgid "Reply to all recipients of this message"
-msgstr "allen Empfängern der Nachricht antworten"
-
-#: mail/folder-browser-factory.c:41 mail/mail-view.c:141
-msgid "Forward"
-msgstr "Weiterleiten"
-
-#: mail/folder-browser-factory.c:41 mail/mail-view.c:141
-msgid "Forward this message"
-msgstr "Die Nachricht weiterleiten"
-
-#: mail/folder-browser-factory.c:45
-msgid "Move"
-msgstr "Verschieben"
-
-#: mail/folder-browser-factory.c:45
-msgid "Move message to a new folder"
-msgstr "Die Nachricht in einen neuen Ordner verschieben"
-
-#: mail/folder-browser-factory.c:46
-msgid "Copy message to a new folder"
-msgstr "Nachricht in einen neuen Ordner kopieren"
-
-#: mail/folder-browser-factory.c:48 mail/mail-view.c:145
-msgid "Print the selected message"
-msgstr "Die gewählte Nachricht drucken"
-
-#: mail/folder-browser-factory.c:50 mail/mail-view.c:147
-msgid "Delete this message"
-msgstr "Die Nachricht löschen"
-
-#: mail/folder-browser-factory.c:71
-#, c-format
-msgid "Run filter \"%s\""
-msgstr "Filter \"%s\" ausführen"
-
-#: mail/folder-browser-factory.c:127
-msgid "_Threaded Message List"
-msgstr "Nachrichtenliste mit Threads"
-
-#: mail/folder-browser-factory.c:137
-msgid "_Print Message"
-msgstr "Nachricht _drucken"
-
-#: mail/folder-browser-factory.c:146
-msgid "F_older"
-msgstr "Ordner"
-
-#: mail/folder-browser-factory.c:152
-msgid "_Mark all as Read"
-msgstr "Alle als gelesen _markieren"
-
-#: mail/folder-browser-factory.c:158
-msgid "_Expunge"
-msgstr "Säubern"
-
-#: mail/folder-browser-factory.c:165
-msgid "_Configure Folder"
-msgstr "Ordner konfigurieren"
-
-#: mail/folder-browser-factory.c:172
-msgid "_Message"
-msgstr "Nachricht"
-
-#: mail/folder-browser-factory.c:178
-msgid "E_dit"
-msgstr "Bearbeiten"
-
-#: mail/folder-browser-factory.c:192
-msgid "Mail _Filters ..."
-msgstr "Mail_filter..."
-
-#: mail/folder-browser-factory.c:199
-msgid "_vFolder Editor ..."
-msgstr "_vFolder-Editor..."
-
-#: mail/folder-browser-factory.c:206
-msgid "_Mail Configuration ..."
-msgstr "Mailkonfiguration..."
-
-#: mail/folder-browser-factory.c:213
-msgid "Forget _Passwords"
-msgstr "Passwörter vergessen"
-
-#: mail/folder-browser.c:371
-msgid "Save"
-msgstr "Speichern"
-
-#: mail/mail-callbacks.c:134
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-"Diese Nachricht hat keine Betreffzeile.\n"
-"Wirklich senden?"
-
-#: mail/mail-callbacks.c:166
-msgid ""
-"You need to configure an identity\n"
-"before you can send mail."
-msgstr ""
-"Sie müssen eine Identität einrichten,\n"
-"bevor Sie Mail senden können."
-
-#: mail/mail-callbacks.c:182
-msgid ""
-"You need to configure a mail transport\n"
-"before you can send mail."
-msgstr ""
-"Sie müssen einen Mailtransport einrichten,\n"
-"bevor Sie Mail senden können."
-
-#: mail/mail-callbacks.c:389
-msgid "Move message(s) to"
-msgstr "Machricht(en) verschieben in"
-
-#: mail/mail-callbacks.c:391
-msgid "Copy message(s) to"
-msgstr "Machricht(en) kopieren in"
-
-#: mail/mail-callbacks.c:448
-msgid ""
-"You may only edit messages saved\n"
-"in the Drafts folder."
-msgstr ""
-"Sie können nur im Entwürfe-Ordner\n"
-"abgespeicherte Nachrichten bearbeiten."
-
-#: mail/mail-callbacks.c:536
-#, c-format
-msgid ""
-"Error loading filter information:\n"
-"%s"
-msgstr ""
-"Fehler beim Laden von Filterinformation:\n"
-"%s"
-
-#: mail/mail-config-gui.c:431
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-"Geben Sie den Namen und die E-Mail-Adresse zur Verwendung in Ihrer "
-"ausgehenden Mail ein. Sie können auf Wunsch auch den Namen Ihrer "
-"Organisation erwähnen, und den einer Datei, in der Ihre Signatur steht."
-
-#: mail/mail-config-gui.c:444
-msgid "Full name:"
-msgstr "Voller Name:"
-
-#: mail/mail-config-gui.c:468
-msgid "Email address:"
-msgstr "E-Mail-Adresse:"
-
-#: mail/mail-config-gui.c:483
-msgid "Organization:"
-msgstr "Organisation:"
-
-#: mail/mail-config-gui.c:494
-msgid "Signature file:"
-msgstr "Signaturdatei:"
-
-#: mail/mail-config-gui.c:499 mail/mail-config.glade.h:10
-msgid "Signature File"
-msgstr "Signaturdatei"
-
-#: mail/mail-config-gui.c:898
-msgid "Server:"
-msgstr "Server:"
-
-#: mail/mail-config-gui.c:904
-msgid "Username:"
-msgstr "Benutzername:"
-
-#: mail/mail-config-gui.c:910
-msgid "Path:"
-msgstr "Pfad:"
-
-#: mail/mail-config-gui.c:918
-msgid "Authentication:"
-msgstr "Authentikation:"
-
-#: mail/mail-config-gui.c:930
-msgid "Detect supported types..."
-msgstr "Unterstützte Typen feststellen..."
-
-#: mail/mail-config-gui.c:955
-msgid "Don't delete messages from server"
-msgstr "Nachrichten nicht vom Server löschen"
-
-#: mail/mail-config-gui.c:967
-msgid "Test Settings"
-msgstr "Einstellungen testen"
-
-#: mail/mail-config-gui.c:1099 mail/mail-config-gui.c:1147
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"Wählen Sie, welche Art von Mailserver Sie haben, und geben Sie die relevante "
-"Information dazu ein.\n"
-"\n"
-"Wenn der Server Authentikation erfordert, können Sie auf \"Unterstützte "
-"Typen feststellen...\" klicken, bevor Sie andere Informationen eingeben."
-
-#: mail/mail-config-gui.c:1123
-msgid ""
-"Select the kind of news server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"Wählen Sie, welche Art von Newsserver Sie haben, und geben Sie die relevante "
-"Information dazu ein.\n"
-"\n"
-"Wenn der Server Authentikation erfordert, können Sie auf \"Unterstützte "
-"Typen feststellen...\" klicken, nachdem Sie die anderen Informationen "
-"eingegeben haben."
-
-#: mail/mail-config-gui.c:1142
-msgid "Mail transport type:"
-msgstr "Mailtransport-Typ:"
-
-#: mail/mail-config-gui.c:1197
-msgid "Edit Identity"
-msgstr "Identität bearbeiten"
-
-#: mail/mail-config-gui.c:1199
-msgid "Add Identity"
-msgstr "Identität hinzufügen"
-
-#: mail/mail-config-gui.c:1293
-msgid "Edit Source"
-msgstr "Quelle bearbeiten"
-
-#: mail/mail-config-gui.c:1295
-msgid "Add Source"
-msgstr "Quelle hinzufügen"
-
-#: mail/mail-config-gui.c:1392
-msgid "Edit News Server"
-msgstr "Newsserver bearbeiten"
-
-#: mail/mail-config-gui.c:1394
-msgid "Add News Server"
-msgstr "Newsserver hinzufügen"
-
-#: mail/mail-config-gui.c:2243
-msgid "The connection was successful!"
-msgstr "Die Verbindung war erfolgreich!"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config.glade.h:7 mail/mail-config.glade.h:14
-msgid "Identities"
-msgstr "Identitäten"
-
-#: mail/mail-config.glade.h:9
-msgid "Organization"
-msgstr "Organisation"
-
-#: mail/mail-config.glade.h:12 mail/mail-config.glade.h:17
-#: mail/mail-config.glade.h:23
-msgid "Edit"
-msgstr "Bearbeiten"
-
-#: mail/mail-config.glade.h:15
-msgid "Sources"
-msgstr "Quellen"
-
-#: mail/mail-config.glade.h:19
-msgid "Mail Sources"
-msgstr "Mailquellen"
-
-#: mail/mail-config-druid.glade.h:15 mail/mail-config.glade.h:20
-msgid "Mail Transport"
-msgstr "Mailtransport"
-
-#: mail/mail-config.glade.h:21
-msgid "News Servers"
-msgstr "Newsserver"
-
-#: mail/mail-config.glade.h:25
-msgid "News Sources"
-msgstr "Newsquellen"
-
-#: mail/mail-config.glade.h:26
-msgid "Send messages in HTML format"
-msgstr "Nachrichten in HTML-Format senden"
-
-#: mail/mail-config.glade.h:27
-msgid "Mark message as seen [ms]: "
-msgstr "Nachrichten als gelesen markieren [ms]: "
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config-druid.glade.h:7 mail/mail-config-druid.glade.h:8
-#: mail/mail-config-druid.glade.h:16
-msgid "Mail Configuration"
-msgstr "Mailkonfiguration"
-
-#: mail/mail-config-druid.glade.h:9
-msgid ""
-"Welcome to the Evolution Mail configuration wizard!\n"
-"By filling in some information about your email\n"
-"settings, you can start sending and receiving email\n"
-"right away. Click Next to continue."
-msgstr ""
-"Willkommen zum Evolution-Mailkonfigurationsassistenten!\n"
-"Wenn Sie einige Informationen über Ihre E-Mail-\n"
-"Einstellungen geben, können Sie sofort anfangen, E-Mail\n"
-"zu senden und zu empfangen. Klicken Sie \"Weiter\" zum\n"
-"Fortfahren."
-
-#: mail/mail-config-druid.glade.h:13
-msgid "Identity"
-msgstr "Identität"
-
-#: mail/mail-config-druid.glade.h:14
-msgid "Mail Source"
-msgstr "Mailquelle"
-
-#: mail/mail-config-druid.glade.h:17
-msgid ""
-"Your email configuration is now complete.\n"
-"Click \"Finish\" to save your new settings"
-msgstr ""
-"Ihre E-Mail-Konfiguration ist nun abgeschlossen.\n"
-"Speichern Sie Sie durch Klick auf \"Abschließen\"."
-
-#: mail/mail-crypto.c:338 mail/mail-crypto.c:418
-msgid "Please enter your PGP/GPG passphrase."
-msgstr "Bitte geben Sie Ihre PGP-/GPG-Passphrase ein."
-
-#: mail/mail-crypto.c:342 mail/mail-crypto.c:422
-msgid "No password provided."
-msgstr "Kein Passwort angegeben."
-
-#: mail/mail-crypto.c:348 mail/mail-crypto.c:428
-#, c-format
-msgid "Couldn't create pipe to GPG/PGP: %s"
-msgstr "Konnte Pipe zu GPG/PGP nicht anlegen: %s"
-
-#: mail/mail-local.c:257
-#, c-format
-msgid "Changing folder \"%s\" to \"%s\" format"
-msgstr "Wandle Ordner \"%s\" in \"%s\"-Format um"
-
-#: mail/mail-local.c:261
-#, c-format
-msgid "Change folder \"%s\" to \"%s\" format"
-msgstr "Ordner \"%s\" in \"%s\"-Format umwandeln"
-
-#: mail/mail-ops.c:74
-#, c-format
-msgid "Fetching email from %s"
-msgstr "Rufe E-Mail von %s ab"
-
-#: mail/mail-ops.c:76
-#, c-format
-msgid "Fetch email from %s"
-msgstr "E-Mail von %s abrufen"
-
-#: mail/mail-ops.c:87
-msgid "You have no remote mail source configured to fetch mail from."
-msgstr ""
-"Sie haben keine konfigurierte entfernte Mailquelle, von der Sie Mail abrufen "
-"könnten."
-
-#: mail/mail-ops.c:97
-msgid "Bad folder passed to fetch_mail"
-msgstr "Ungültiger Ordner an fetch_mail übergeben"
-
-#: mail/mail-ops.c:165
-msgid "There is no new mail."
-msgstr "Keine neue Mail."
-
-#: mail/mail-ops.c:234
-#, c-format
-msgid "Sending \"%s\""
-msgstr "Sende \"%s\""
-
-#: mail/mail-ops.c:239
-msgid "Sending a message without a subject"
-msgstr "Sende eine Nachricht ohne eine Betreffzeile"
-
-#: mail/mail-ops.c:242
-#, c-format
-msgid "Send \"%s\""
-msgstr "\"%s\" senden"
-
-#: mail/mail-ops.c:245
-msgid "Send a message without a subject"
-msgstr "Eine Nachricht ohne eine Betreffzeile senden"
-
-#: mail/mail-ops.c:410
-#, c-format
-msgid "Expunging \"%s\""
-msgstr "Säubere \"%s\""
-
-#: mail/mail-ops.c:412
-#, c-format
-msgid "Expunge \"%s\""
-msgstr "\"%s\" säubern"
-
-#: mail/mail-ops.c:484
-#, c-format
-msgid "Moving messages from \"%s\" into \"%s\""
-msgstr "Verschiebe Nachrichten von \"%s\" in \"%s\""
-
-#: mail/mail-ops.c:486
-#, c-format
-msgid "Copying messages from \"%s\" into \"%s\""
-msgstr "Kopiere Nachrichten von \"%s\" in \"%s\""
-
-#: mail/mail-ops.c:489
-#, c-format
-msgid "Move messages from \"%s\" into \"%s\""
-msgstr "Machrichten von \"%s\" in \"%s\" verschieben"
-
-#: mail/mail-ops.c:491
-#, c-format
-msgid "Copy messages from \"%s\" into \"%s\""
-msgstr "Kopiere Nachrichten von \"%s\" in \"%s\""
-
-#: mail/mail-ops.c:637
-#, c-format
-msgid "Marking messages in folder \"%s\""
-msgstr "Markiere Nachrichten in Ordner \"%s\""
-
-#: mail/mail-ops.c:640
-#, c-format
-msgid "Mark messages in folder \"%s\""
-msgstr "Markiere Nachrichten in Ordner \"%s\""
-
-#: mail/mail-ops.c:769
-#, c-format
-msgid "Scanning folders in \"%s\""
-msgstr "Taste Ordner in \"%s\" ab"
-
-#: mail/mail-ops.c:772
-#, c-format
-msgid "Scan folders in \"%s\""
-msgstr "Ordner in \"%s\" abtasten"
-
-#: mail/mail-ops.c:859
-msgid "(No description)"
-msgstr "(Keine Beschreibung)"
-
-#: mail/mail-ops.c:922
-#, c-format
-msgid "Attaching messages from folder \"%s\""
-msgstr "Hänge Nachrichten aus Ordner \"%s\" an"
-
-#: mail/mail-ops.c:925
-#, c-format
-msgid "Attach messages from \"%s\""
-msgstr "Nachrichten aus \"%s\" anhängen"
-
-#: mail/mail-ops.c:1051
-#, c-format
-msgid "Forwarding messages \"%s\""
-msgstr "Leite Nachrichten weiter: \"%s\""
-
-#: mail/mail-ops.c:1056
-msgid "Forwarding a message without a subject"
-msgstr "Leite eine Nachricht ohne eine Betreffzeile weiter"
-
-#: mail/mail-ops.c:1059
-#, c-format
-msgid "Forward message \"%s\""
-msgstr "Nachricht \"%s\" weiterleiten"
-
-#: mail/mail-ops.c:1064
-msgid "Forward a message without a subject"
-msgstr "Eine Nachricht ohne eine Betreffzeile weiterleiten"
-
-#: mail/mail-ops.c:1129
-msgid ""
-"Failed to generate mime part from message while generating forwarded message."
-msgstr ""
-"Konnte beim Erzeugen der weitergeleiteten Nachricht keinen MIME-Part aus der "
-"Nachricht erzeugen."
-
-#: mail/mail-ops.c:1218
-#, c-format
-msgid "Loading \"%s\""
-msgstr "Lade \"%s\""
-
-#: mail/mail-ops.c:1220
-#, c-format
-msgid "Load \"%s\""
-msgstr "\"%s\" laden"
-
-#: mail/mail-ops.c:1339
-#, c-format
-msgid "Creating \"%s\""
-msgstr "Erzeuge \"%s\""
-
-#: mail/mail-ops.c:1341
-#, c-format
-msgid "Create \"%s\""
-msgstr "\"%s\" erzeugen"
-
-#: mail/mail-ops.c:1412
-msgid "Exception while reporting result to shell component listener."
-msgstr ""
-"Ausnahmezustand beim Übermitteln des Ergebnisses an "
-"Shell-Komponenten-Listener."
-
-#: mail/mail-ops.c:1465
-#, c-format
-msgid "Synchronizing \"%s\""
-msgstr "Synchronisiere \"%s\""
-
-#: mail/mail-ops.c:1467
-#, c-format
-msgid "Synchronize \"%s\""
-msgstr "\"%s\" synchronisieren"
-
-#: mail/mail-ops.c:1543
-#, c-format
-msgid "Displaying message UID \"%s\""
-msgstr "Zeige Nachrichten-UID \"%s\" an"
-
-#: mail/mail-ops.c:1546
-msgid "Clearing message display"
-msgstr "Lösche Nachrichtenanzeige"
-
-#: mail/mail-ops.c:1549
-#, c-format
-msgid "Display message UID \"%s\""
-msgstr "Nachrichten-UID \"%s\" anzeigen"
-
-#: mail/mail-ops.c:1552
-msgid "Clear message display"
-msgstr "Nachrichtenanzeige löschen"
-
-#: mail/mail-ops.c:1679
-#, c-format
-msgid "Opening messages from folder \"%s\""
-msgstr "Öffne Nachrichten aus Ordner \"%s\""
-
-#: mail/mail-ops.c:1682
-#, c-format
-msgid "Open messages from \"%s\""
-msgstr "Nachrichten aus \"%s\" öffnen"
-
-#: mail/mail-ops.c:1794
-msgid "Loading Draftbox"
-msgstr "Lade Entwurfsordner"
-
-#: mail/mail-ops.c:1796
-msgid "Load Draftbox"
-msgstr "Entwurfsordner laden"
-
-#: mail/mail-ops.c:1864
-#, c-format
-msgid "Viewing messages from folder \"%s\""
-msgstr "Betrachte Nachrichten aus Ordner \"%s\""
-
-#: mail/mail-ops.c:1867
-#, c-format
-msgid "View messages from \"%s\""
-msgstr "Nachrichten aus Ordner \"%s\" betrachten"
-
-#: mail/mail-threads.c:274
-#, c-format
-msgid ""
-"Error while preparing to %s:\n"
-"%s"
-msgstr ""
-"Fehler beim Vorbereiten auf %s:\n"
-"%s"
-
-#: mail/mail-threads.c:627
-#, c-format
-msgid ""
-"Error while `%s':\n"
-"%s"
-msgstr ""
-"Fehler beim `%s'_\n"
-"%s"
-
-#: mail/mail-threads.c:680
-msgid "Incomplete message written on pipe!"
-msgstr "Unvollständige Nachricht auf Pipe geschrieben!"
-
-#: mail/mail-threads.c:684
-msgid "Error reading commands from dispatching thread."
-msgstr "Fehler beim Lesen von Befehlen vom verwaltenden Thread."
-
-#: mail/mail-threads.c:749
-msgid "Corrupted message from dispatching thread?"
-msgstr "Schadhafte Nachricht von verwaltendem Thread?"
-
-#: mail/mail-threads.c:861
-msgid "Could not create dialog box."
-msgstr "Konnte Dialogfenster nicht erzeugen."
-
-#: mail/mail-threads.c:872
-msgid "User cancelled query."
-msgstr "Benutzer hat Anfrage abgebrochen."
-
-#: mail/mail-tools.c:205
-#, c-format
-msgid "Couldn't create temporary mbox `%s': %s"
-msgstr "Konnte temporäre Mbox `%s' nicht anlegen: %s"
-
-#: mail/mail-tools.c:290
-#, c-format
-msgid ""
-"Could not read UID cache file \"%s\". You may receive duplicate messages."
-msgstr "Konnte UID-Cachedatei \"%s\" nicht lesen. Es ist möglich, dass Sie doppelte Nachrichten erhalten werden."
-
-#: mail/mail-tools.c:373
-#, c-format
-msgid "[%s] %s"
-msgstr "[%s] %s"
-
-#: mail/mail-tools.c:375
-#, c-format
-msgid "[%s] (forwarded message)"
-msgstr "[%s] (weitergeleitete Nachricht)"
-
-#: mail/mail-tools.c:384
-msgid "Fwd: (no subject)"
-msgstr "Fwd: (keine Betreffzeile)"
-
-#: mail/mail-tools.c:419
-#, c-format
-msgid "Forwarded message - %s"
-msgstr "Weitergeleitete Nachricht - %s"
-
-#: mail/mail-tools.c:421
-msgid "Forwarded message (no subject)"
-msgstr "Weitergeleitete Nachricht (keine Betreffzeile)"
-
-#: mail/mail-tools.c:532
-#, c-format
-msgid "Couldn't stat(2) movemail folder %s"
-msgstr "Konnte movemail-Ordner %s nicht mit stat(2) untersuchen"
-
-#: mail/mail-tools.c:633
-#, c-format
-msgid "Don't know protocol to open URI `%s'"
-msgstr "Kenne Protokol zum Öffnen von URI `%s' nicht"
-
-#: mail/mail-tools.c:662
-#, c-format
-msgid ""
-"Cannot open location `%s':\n"
-"%s"
-msgstr ""
-"Kann Ort `%s' nicht öffnen:\n"
-"%s"
-
-#: mail/mail-vfolder.c:298
-msgid "New VFolder"
-msgstr "Neuer VFolder"
-
-#: mail/message-list.c:490
-msgid "Online Status"
-msgstr "Online-Status"
-
-#: mail/message-list.c:526
-msgid "From"
-msgstr "Von"
-
-#: mail/message-list.c:533
-msgid "Subject"
-msgstr "Betreff"
-
-#: mail/message-list.c:540
-msgid "Date"
-msgstr "Datum"
-
-#: mail/message-list.c:547
-msgid "Received"
-msgstr "Empfangen"
-
-#: mail/message-list.c:554
-msgid "To"
-msgstr "An"
-
-#: mail/message-list.c:561
-msgid "Size"
-msgstr "Größe"
-
-#: notes/component-factory.c:27
-msgid "Create a new note"
-msgstr "Eine neue Notiz anlegen"
-
-#: notes/component-factory.c:148
-msgid "Cannot initialize Evolution's notes component."
-msgstr "Kann Evolutions Notizen-Komponente nicht initialisieren."
-
-#: notes/main.c:30
-msgid "Notes Component: Could not initialize bonobo"
-msgstr "Notizen-Komponente: Konnte Bonobo nicht initialisieren"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Installation von Evolution"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Dies scheint das erste Mal zu sein, dass Sie Evolution ausführen."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-"Bitte klicken Sie \"OK\", um Evolutions Benutzerdateien zu installieren "
-"unter:"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"Kann das Verzeichnis\n"
-"%s\n"
-"nicht anlegen.\n"
-"Fehler: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"Kann Dateien nicht in\n"
-"`%s'\n"
-"kopieren."
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Evolutions Dateien erfolgreich installiert."
-
-#: shell/e-setup.c:109
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please move it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"Die Datei `%s' ist kein Verzeichnis.\n"
-"Bitte verschieben Sie es, damit Evolution seine\n"
-"Benutzerdateien installieren kann."
-
-#: shell/e-setup.c:121
-#, c-format
-msgid ""
-"The directory `%s' exists but is not the\n"
-"Evolution directory. Please move it in order\n"
-"to allow installation of the Evolution user files."
-msgstr ""
-"Das Verzeichnis `%s' existiert, ist aber nicht\n"
-"das Evolution-Verzeichnis. Bitte verschieben Sie\n"
-"es, damit Evolution seine Benutzerdateien\n"
-"installieren kann."
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"Kann den angegebenen Ordner nicht erstellen:\n"
-"%s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr "Der angegebene Ordnername ist nicht gültig"
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "Evolution - Neuen Ordner anlegen"
-
-#: shell/e-shell-folder-selection-dialog.c:96
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-"Der Typ des ausgewählten Ordners ist für die \n"
-"gewählte Operation nicht gültig."
-
-#: shell/e-shell-folder-selection-dialog.c:272
-msgid "New..."
-msgstr "Neu..."
-
-#: shell/e-shell-folder-title-bar.c:451 shell/e-shell-folder-title-bar.c:452
-msgid "(Untitled)"
-msgstr "(Namenlos)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Der Fehlermelder kann nicht gefunden werden"
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "Der Fehlermelder kann nicht starten"
-
-#: shell/e-shell-view-menu.c:167
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:169
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution ist eine Mail-, Kalender-\n"
-"und Kontakt-Management Anwendung\n"
-"innerhalt der GNOME-Desktops."
-
-#: shell/e-shell-view-menu.c:319
-msgid "Go to folder..."
-msgstr "Gehe zu Ordner..."
-
-#: shell/e-shell-view-menu.c:377
-msgid "_New"
-msgstr "Neu"
-
-#: shell/e-shell-view-menu.c:389
-msgid "_Folder"
-msgstr "Ordner"
-
-#: shell/e-shell-view-menu.c:395
-msgid "Evolution bar _shortcut"
-msgstr "Evolution-Leistenverknüpfung"
-
-#: shell/e-shell-view-menu.c:404
-msgid "_Mail message (FIXME)"
-msgstr "Nachricht senden (FIXME)"
-
-#: shell/e-shell-view-menu.c:410
-msgid "_Appointment (FIXME)"
-msgstr "Termine (FIXME)"
-
-#: shell/e-shell-view-menu.c:416
-msgid "_Contact (FIXME)"
-msgstr "Kontakt (FIXME)"
-
-#: shell/e-shell-view-menu.c:422
-msgid "_Task (FIXME)"
-msgstr "Auftrag (FIXME)"
-
-#: shell/e-shell-view-menu.c:444
-msgid "_Go to Folder..."
-msgstr "Gehe zu Ordner..."
-
-#: shell/e-shell-view-menu.c:445
-msgid "Display a different folder"
-msgstr "Einen anderen Ordner anzeigen"
-
-#: shell/e-shell-view-menu.c:452
-msgid "_Create New Folder..."
-msgstr "Neuen Ordner anlegen..."
-
-#: shell/e-shell-view-menu.c:453 shell/e-shell-view-menu.c:465
-msgid "Create a new folder"
-msgstr "Einen neuen Ordner anlegen"
-
-#: shell/e-shell-view-menu.c:464
-msgid "E_xit..."
-msgstr "_Beenden..."
-
-#: shell/e-shell-view-menu.c:495
-msgid "Show _Shortcut Bar"
-msgstr "Verknüpfungsleiste anzeigen"
-
-#: shell/e-shell-view-menu.c:496
-msgid "Show the shortcut bar"
-msgstr "Die Verknüpfungsleiste anzeigen"
-
-#: shell/e-shell-view-menu.c:501
-msgid "Show _Folder Bar"
-msgstr "Ordner-Leiste anzeigen"
-
-#: shell/e-shell-view-menu.c:502
-msgid "Show the folder bar"
-msgstr "Die Ordner-Leiste anzeigen"
-
-#: shell/e-shell-view-menu.c:513
-msgid "_Settings"
-msgstr "Einstellungen"
-
-#: shell/e-shell-view-menu.c:524
-msgid "_Help"
-msgstr "_Hilfe"
-
-#: shell/e-shell-view-menu.c:530
-msgid "Help _Index"
-msgstr "Hilfe-_Index"
-
-#: shell/e-shell-view-menu.c:537
-msgid "Getting _Started"
-msgstr "Erste Schritte"
-
-#: shell/e-shell-view-menu.c:544
-msgid "Using the _Mailer"
-msgstr "Den _Mailer benutzen"
-
-#: shell/e-shell-view-menu.c:551
-msgid "Using the _Calendar"
-msgstr "Den Kalender benutzen"
-
-#: shell/e-shell-view-menu.c:558
-msgid "Using the C_ontact Manager"
-msgstr "Die Kontaktverwaltung benutzen"
-
-#: shell/e-shell-view-menu.c:568
-msgid "_Submit Bug Report"
-msgstr "Fehlerbericht einschicken"
-
-#: shell/e-shell-view-menu.c:569
-msgid "Submit bug report using Bug Buddy"
-msgstr "Einen Fehler über dem Fehlermelder melden"
-
-#: shell/e-shell-view-menu.c:578
-msgid "_About Evolution..."
-msgstr "Über Evolution..."
-
-#: shell/e-shell-view-menu.c:579
-msgid "Show information about Evolution"
-msgstr "Information über Evolution anzeigen"
-
-#: shell/e-shell-view.c:122
-msgid "(No folder displayed)"
-msgstr "(Kein Ordner angezeigt)"
-
-#: shell/e-shell-view.c:350
-msgid "Folders"
-msgstr "Ordner"
-
-#: shell/e-shell-view.c:879
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell.c:293
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Kann lokalen Speicher nicht einstellen -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "Kleine Icons"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "Die Verknüpfungen als kleine Icons anzeigen"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "Große Icons"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Die Verknüpfungen als große Icons zeigen"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "Aktivieren"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "Diese Verknüpfung aktivieren"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Diese Verknüpfung aus der Verknüpfungsleiste entfernen"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Fehler beim Speichern von Verknüpfungen."
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "(Kein Name)"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "Kein Fehler"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "Allgemeiner Fehler"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "Ein Ordner mit dem gleichen Namen existiert bereits"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr "Der angegebene Ordnertyp ist ungültig"
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "E-/A-Fehler"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "Nicht genügend Platz, um den Ordner zu erstellen"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "Der angegebene Ordner wurde nicht gefunden"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr "Funktion für diese Speicherweise nicht implementiert"
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "Erlaubnis verweigert"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "Operation nicht unterstützt"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr "Der angegebene Typ wird für diese Speicherweise nicht unterstützt"
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "Unbekannter Fehler"
-
-#: shell/e-storage-set-view.c:242
-msgid "View the selected folder"
-msgstr "Den gewählten Ordner betrachten"
-
-#: shell/main.c:66
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Hallo. Viele Dank dafür, dass Sie sich die Zeit genommen haben, diese\n"
-"Vorschauversion der Evolution-Groupware-Suite herunterzuladen.\n"
-"\n"
-"Über die letzten anderthalb Monate haben wir uns darauf konzentriert,\n"
-"Evolution benutzbar zu machen. Viele der Evolution-Entwickler\n"
-"verwenden inzwischen Evolution, um all ihre Mail zu lesen. Auch Sie\n"
-"könnten das tun. (Machen Sie aber Sicherheitskopien.)\n"
-"\n"
-"Doch obwohl wir viele Fehler ausgemerzt haben, die die Stabilität und\n"
-"Sicherheit beeinträchtigt haben, kriegen Sie trotzdem einen\n"
-"Disclaimer: Evolution wird: abstürzen, Ihre Mail verlieren wenn Sie\n"
-"das nicht wollen, sich weigern, Ihre Mail zu löschen, wenn Sie es\n"
-"wollen, freilaufende Prozesse zurücklassen, 100% CPU verbrauchen, sich\n"
-"verklemmen, sich aufhängen, HTML-Mail an zufällig ausgewählte\n"
-"Mailinglisten verschicken und Sie vor Ihren Freunden und Mitarbeitern\n"
-"lächerlich machen. Zu Risiken und Nebenwirkungen fragen Sie Ihren Arzt\n"
-"oder Apotheker.\n"
-"\n"
-"Wir hoffen, dass Ihnen die Ergebnisse unserer harten Arbeit gefallen\n"
-"werden, und wir hoffen auf Ihre Mitarbeit!\n"
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Danke.\n"
-"das Evolution-Team\n"
-
-#: shell/main.c:126
-msgid "Cannot initialize the Evolution shell."
-msgstr "Kann die Evolution-Shell nicht initialisieren."
-
-#: shell/main.c:161
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Kann das Bonobo-System nicht initialisieren."
-
-#: tests/ui-tests/message-browser.c:360
-msgid "The component now claims that it doesn't support PersistStream!"
-msgstr ""
-"Die Komponente behauptet jetzt, dass sie PersistStream nicht unterstützt!"
-
-#: tests/ui-tests/message-browser.c:378
-msgid ""
-"An exception occured while trying to load data into the component with "
-"PersistStream"
-msgstr ""
-"Ein Ausnahmezustand trat während des Versuchs, Daten mit PersistStream in "
-"die Komponente zu laden, ein"
-
-#: tests/ui-tests/message-browser.c:471
-#, c-format
-msgid "The %s component doesn't support PersistStream!\n"
-msgstr "Die %s-Komponente unterstützt PersistStream nicht!\n"
-
-#: tests/ui-tests/message-browser.c:710
-msgid "Open Mime Message"
-msgstr "MIME-Nachricht öffnen"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Felder"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "Gruppieren"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Sortieren"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Filter"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-#: widgets/e-table/e-table-header-item.c:1164
-msgid "Field Chooser"
-msgstr "Feldwähler"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-"Um Ihrer Tabelle eine Spalte hinzuzufügen, ziehen\n"
-"Sie sie dorthin, wo Sie sie haben wollen."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "window1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "Verfügbare Felder"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "label1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "In dieser Reihenfolge anzeigen"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "label2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Hinzufügen >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Entfernen"
-
-#: widgets/e-table/e-table-header-item.c:1156
-msgid "Sort Ascending"
-msgstr "Aufsteigend sortieren"
-
-#: widgets/e-table/e-table-header-item.c:1157
-msgid "Sort Descending"
-msgstr "Absteigend sortieren"
-
-#: widgets/e-table/e-table-header-item.c:1158
-msgid "Unsort"
-msgstr "Nicht sortieren"
-
-#: widgets/e-table/e-table-header-item.c:1160
-msgid "Group By This Field"
-msgstr "Nach diesem Feld gruppieren"
-
-#: widgets/e-table/e-table-header-item.c:1161
-msgid "Group By Box"
-msgstr "Nach Kasten gruppieren"
-
-#: widgets/e-table/e-table-header-item.c:1163
-msgid "Remove This Column"
-msgstr "Diese Spalte entfernen"
-
-#: widgets/e-table/e-table-header-item.c:1166
-msgid "Alignment"
-msgstr "Ausrichtung"
-
-#: widgets/e-table/e-table-header-item.c:1167
-msgid "Best Fit"
-msgstr "Einpassen"
-
-#: widgets/e-table/e-table-header-item.c:1168
-msgid "Format Columns..."
-msgstr "Spalten formatieren..."
-
-#: widgets/e-table/e-table-header-item.c:1170
-msgid "Customize Current View..."
-msgstr "Aktuelle Ansicht anpassen..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr "Vorläufig"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "Beschäftigt"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr "Außer Haus"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "Keine Information"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr "Andere einladen..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "Optionen"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr "Nur Arbeitszeit anzeigen"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr "Weggezoomt anzeigen"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr "Frei/beschäftigt aktualisieren"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr "AutoWahl"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ">>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "Alle Leute und Ressourcen"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr "Alle Leute und eine Ressource"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr "Benötigte Leute"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr "Benötigte Leute und eine Ressource"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "Anfang der Besprechung:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "Ende der Besprechung:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr "Alle Anwesenden"
-
-#. Translators: These are the first characters of each day of the
-#. week, 'M' for 'Monday', 'T' for Tuesday etc.
-#: widgets/misc/e-calendar-item.c:281
-msgid "MTWTFSS"
-msgstr "MDMDFSS"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "Gruppe %i"
diff --git a/po/desk.pl b/po/desk.pl
deleted file mode 100755
index 08a2a18a56..0000000000
--- a/po/desk.pl
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/perl -w
-
-# GNOME entry finder utility.
-# (C) 2000 The Free Software Foundation
-#
-# Author(s): Kenneth Christiansen
-
-
-$VERSION = "1.0.0 beta 5";
-$LANG = $ARGV[0];
-$OPTION2 = $ARGV[1];
-$SEARCH = "Name";
-
-if (! $LANG){
- print "desk.pl: missing file arguments\n";
- print "Try `desk.pl --help' for more information.\n";
- exit;
-}
-
-if ($OPTION2){
- $SEARCH=$OPTION2;
-}
-
-if ($LANG){
-
-if ($LANG=~/^-(.)*/){
-
- if ("$LANG" eq "--version" || "$LANG" eq "-V"){
- print "GNOME Entry finder $VERSION\n";
- print "Written by Kenneth Christiansen <kenneth\@gnome.org>, 2000.\n\n";
- print "Copyright (C) 2000 Free Software Foundation, Inc.\n";
- print "This is free software; see the source for copying conditions. There is NO\n";
- print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
- exit;
- }
-
- elsif ($LANG eq "--help" || "$LANG" eq "-H"){
- print "Usage: ./desk.pl [OPTIONS] ...LANGCODE ENTRY\n";
- print "Checks .desktop and alike files for missing translations.\n\n";
- print " -V, --version shows the version\n";
- print " -H, --help shows this help page\n";
- print "\nReport bugs to <kenneth\@gnome.org>.\n";
- exit;
- }
-
- else{
- print "desk.pl: invalid option -- $LANG\n";
- print "Try `desk.pl --help' for more information.\n";
- exit;
- }
-}
-
-else{
-
- $a="find ../ -print | egrep '.*\\.(desktop|soundlist"
- ."|directory)' ";
-
- $b="find ../ -print | egrep '.*\\.(desktop|soundlist"
- ."|directory)' ";
-
- print "Searching for missing $SEARCH\[$LANG\] entries...\n";
-
- open(BUF1, "$a|");
- open(BUF2, "$b|");
-
- @buf1 = <BUF1>;
- foreach my $file (@buf1){
- open FILE, "<$file";
- while (<FILE>) {
- if ($_=~/$SEARCH\[$LANG\]\=/o){
- $file = unpack("x2 A*",$file) . "\n";
- push @buff1, $file;
- last;
- }
- }
- }
-
- @buf2 = <BUF2>;
- foreach my $file (@buf2){
- open FILE, "<$file";
- while (<FILE>) {
- if ($_=~/$SEARCH\=/o){
- $file = unpack("x2 A*",$file) . "\n";
- push @buff2, $file;
- last;
- }
- }
- }
-
- @bufff1 = sort (@buff1);
- @bufff2 = sort (@buff2);
-
- my %in2;
- foreach (@bufff1) {
- $in2{$_} = 1;
- }
-
- foreach (@bufff2){
- if (!exists($in2{$_})){
- push @result, $_ }
- }
- }
-
- open(OUT1, ">MISSING.$LANG.$SEARCH");
- print OUT1 @result ;
- close OUT1;
-
-
- stat("MISSING.$LANG.$SEARCH");
- print "\nWell, you need to fix these:\n\n" if -s _;
- print @result if -s _;
- print "\nThe list is saved in MISSING.$LANG.$SEARCH\n" if -s _;
- print "\nWell, it's all perfect! Congratulation!\n" if -z _;
- unlink "MISSING.$LANG.$SEARCH" if -z _;
- exit;
-}
-
-
diff --git a/po/el.po b/po/el.po
deleted file mode 100644
index 4d6aec992f..0000000000
--- a/po/el.po
+++ /dev/null
@@ -1,3771 +0,0 @@
-# Greek translation of evolution.
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Spiros Papadimitriou <spapadim+@cs.cmu.edu>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution 0.1\n"
-"POT-Creation-Date: 2000-07-10 21:51-0400\n"
-"PO-Revision-Date: 2000-04-04 19:42-0500\n"
-"Last-Translator: Spiros Papadimitriou <spapadim+@cs.cmu.edu>\n"
-"Language-Team: Greek <nls@tux.hellug.gr>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-7\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:58
-#: calendar/gui/calendar-pilot-sync.c:138 calendar/gui/main.c:68
-#, fuzzy
-msgid "Could not initialize Bonobo"
-msgstr "ÌïíÜäá Ôá÷/ìåßïõ: Áñ÷éêïðïßçóç ôïõ Bonobo áäýíáôç"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:579
-#: calendar/gui/event-editor.c:1118
-#, fuzzy
-msgid "FIXME: _Appointment"
-msgstr "Ñ_áíôåâïý"
-
-#: addressbook/contact-editor/e-contact-editor.c:580
-#: calendar/gui/event-editor.c:1119
-#, fuzzy
-msgid "FIXME: Meeting Re_quest"
-msgstr "Áß_ôçóç ÓõíÜíôçóçò"
-
-#: addressbook/contact-editor/e-contact-editor.c:582
-#: calendar/gui/event-editor.c:1121
-#, fuzzy
-msgid "FIXME: _Mail Message"
-msgstr "_ÌÞíõìá"
-
-#: addressbook/contact-editor/e-contact-editor.c:583
-#: calendar/gui/event-editor.c:1122
-#, fuzzy
-msgid "FIXME: _Contact"
-msgstr "_Ãíùñéìßá"
-
-#: addressbook/contact-editor/e-contact-editor.c:584
-#: calendar/gui/event-editor.c:1123
-msgid "FIXME: _Task"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:585
-#: calendar/gui/event-editor.c:1124
-#, fuzzy
-msgid "FIXME: Task _Request"
-msgstr "Áßôç_óç Åêêñåìüôçôáò"
-
-#: addressbook/contact-editor/e-contact-editor.c:586
-#: calendar/gui/event-editor.c:1125
-#, fuzzy
-msgid "FIXME: _Journal Entry"
-msgstr "Êáôá÷þñçóç Çìåñï_ëïãßïõ"
-
-#: addressbook/contact-editor/e-contact-editor.c:587
-#: calendar/gui/event-editor.c:1126
-msgid "FIXME: _Note"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:589
-#: addressbook/contact-editor/e-contact-editor.c:694
-#: calendar/gui/event-editor.c:1128 calendar/gui/event-editor.c:1235
-msgid "FIXME: Ch_oose Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:594
-#: calendar/gui/event-editor.c:1133
-msgid "FIXME: _Memo Style"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:596
-#: calendar/gui/event-editor.c:1135
-msgid "FIXME: Define Print _Styles..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:603
-#: calendar/gui/event-editor.c:1142
-msgid "FIXME: S_end"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:607
-#: calendar/gui/event-editor.c:1146
-#, fuzzy
-msgid "FIXME: Save Attac_hments..."
-msgstr "ÍÝá åðéóýíáøç..."
-
-#: addressbook/contact-editor/e-contact-editor.c:609
-#: calendar/gui/event-editor.c:1148
-msgid "FIXME: _Delete"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:610
-#: calendar/gui/event-editor.c:1149
-msgid "FIXME: _Move to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:611
-#: calendar/gui/event-editor.c:1150
-msgid "FIXME: Cop_y to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:613
-#: calendar/gui/event-editor.c:1152
-msgid "Page Set_up"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:614
-#: calendar/gui/event-editor.c:1153
-msgid "FIXME: Print Pre_view"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:635
-#: calendar/gui/event-editor.c:1174
-msgid "FIXME: Paste _Special..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:640
-#: calendar/gui/event-editor.c:1179
-msgid "FIXME: Mark as U_nread"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1183
-#, fuzzy
-msgid "_Object"
-msgstr "ÈÝìá"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: addressbook/contact-editor/e-contact-editor.c:656
-#: calendar/gui/event-editor.c:1188 calendar/gui/event-editor.c:1195
-msgid "FIXME: _Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: addressbook/contact-editor/e-contact-editor.c:657
-#: calendar/gui/event-editor.c:1189 calendar/gui/event-editor.c:1196
-msgid "FIXME: _Unread Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1190
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1197
-msgid "FIXME: _Last Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:663
-#: calendar/gui/event-editor.c:1202
-msgid "FIXME: _Standard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:665
-#: calendar/gui/event-editor.c:1204
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:668
-#: calendar/gui/event-editor.c:1207
-msgid "FIXME: _Customize..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:673
-#: calendar/gui/event-editor.c:1212
-msgid "Pre_vious"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1213
-msgid "Ne_xt"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:676
-#: calendar/gui/event-editor.c:1217
-#, fuzzy
-msgid "_Toolbars"
-msgstr "Å_ñãáëåßá"
-
-#: addressbook/contact-editor/e-contact-editor.c:681
-#: calendar/gui/event-editor.c:1222
-msgid "FIXME: _File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:682
-#: calendar/gui/event-editor.c:1223
-msgid "FIXME: It_em..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:683
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: _Object..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:688
-#: calendar/gui/event-editor.c:1229
-msgid "FIXME: _Font..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:689
-#: calendar/gui/event-editor.c:1230
-msgid "FIXME: _Paragraph..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:696
-#: calendar/gui/event-editor.c:1237
-msgid "FIXME: Desi_gn This Form"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:697
-#: calendar/gui/event-editor.c:1238
-msgid "FIXME: D_esign a Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Publish _Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:700
-#: calendar/gui/event-editor.c:1241
-msgid "FIXME: Pu_blish Form As..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:702
-#: calendar/gui/event-editor.c:1243
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:707
-#: calendar/gui/event-editor.c:1248
-msgid "FIXME: _Spelling..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:709
-#: calendar/gui/event-editor.c:1253
-#, fuzzy
-msgid "_Forms"
-msgstr "Áðü"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-msgid "FIXME: _New Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-msgid "FIXME: New _Contact from Same Company"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:717
-msgid "FIXME: New _Letter to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:718
-msgid "FIXME: New _Message to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:719
-msgid "FIXME: New Meetin_g with Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:720
-msgid "FIXME: _Plan a Meeting..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:721
-msgid "FIXME: New _Task for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:724
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:725
-msgid "FIXME: _Display Map of Address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:726
-msgid "FIXME: _Open Web Page"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:728
-msgid "FIXME: Forward as _vCard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1266
-msgid "FIXME: For_ward"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:741
-#: calendar/gui/event-editor.c:1279
-msgid "_Insert"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:742
-#: calendar/gui/event-editor.c:1280
-#, fuzzy
-msgid "F_ormat"
-msgstr "Áðü"
-
-#. FIXME: add Favorites here
-#: addressbook/contact-editor/e-contact-editor.c:743
-#: calendar/gui/event-editor.c:1281 shell/e-shell-view-menu.c:473
-msgid "_Tools"
-msgstr "Å_ñãáëåßá"
-
-#: addressbook/contact-editor/e-contact-editor.c:744
-#: calendar/gui/event-editor.c:1282
-#, fuzzy
-msgid "Actio_ns"
-msgstr "Å_íÝñãåéåò"
-
-#: addressbook/contact-editor/e-contact-editor.c:775
-msgid "Save and Close"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:776
-#: calendar/gui/event-editor.c:1321
-msgid "Save the appointment and close the dialog box"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:780
-#: calendar/gui/event-editor.c:1325
-msgid "FIXME: Print..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-#: calendar/gui/event-editor.c:1326
-msgid "Print this item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-#: calendar/gui/event-editor.c:1327
-msgid "FIXME: Insert File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-#: calendar/gui/event-editor.c:1328
-msgid "Insert a file as an attachment"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-#: calendar/gui/event-editor.c:1336
-msgid "FIXME: Delete"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-#: calendar/gui/event-editor.c:1337 calendar/gui/gncal-todo.c:326
-#, fuzzy
-msgid "Delete this item"
-msgstr "ÁðïóôïëÞ ðáñüíôïò ìçíýìáôïò"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-#: calendar/gui/event-editor.c:1339
-msgid "FIXME: Previous"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-#: calendar/gui/event-editor.c:1340
-msgid "Go to the previous item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-#: calendar/gui/event-editor.c:1341
-msgid "FIXME: Next"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:791
-#: calendar/gui/event-editor.c:1342
-msgid "Go to the next item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-#: calendar/gui/event-editor.c:1343
-msgid "FIXME: Help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1344
-msgid "See online help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1208
-msgid "Assistant"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1209
-#: addressbook/contact-editor/e-contact-editor.c:1313
-msgid "Business"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1210
-msgid "Business 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1211
-msgid "Business Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1212
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1213
-msgid "Car"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1214
-#, fuzzy
-msgid "Company"
-msgstr "ÁíôéãñáöÞ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1215
-#: addressbook/contact-editor/e-contact-editor.c:1314
-#, fuzzy
-msgid "Home"
-msgstr "Óçìåßù_ìá"
-
-#: addressbook/contact-editor/e-contact-editor.c:1216
-#, fuzzy
-msgid "Home 2"
-msgstr "Óçìåßù_ìá"
-
-#: addressbook/contact-editor/e-contact-editor.c:1217
-#, fuzzy
-msgid "Home Fax"
-msgstr "Óçìåßù_ìá"
-
-#: addressbook/contact-editor/e-contact-editor.c:1218
-msgid "ISDN"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1219
-#, fuzzy
-msgid "Mobile"
-msgstr "_ÌÞíõìá"
-
-#: addressbook/contact-editor/e-contact-editor.c:1220
-#: addressbook/contact-editor/e-contact-editor.c:1315
-msgid "Other"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1221
-msgid "Other Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1222
-#, fuzzy
-msgid "Pager"
-msgstr "Åðéêüëëçóç"
-
-#: addressbook/contact-editor/e-contact-editor.c:1223
-#, fuzzy
-msgid "Primary"
-msgstr "Ðñïôåñáéüôçôá"
-
-#: addressbook/contact-editor/e-contact-editor.c:1224
-msgid "Radio"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1225
-msgid "Telex"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1226
-msgid "TTY/TDD"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1270
-msgid "Primary Email"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1271
-msgid "Email 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1272
-msgid "Email 3"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-msgid "_Delete"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91
-msgid "Add"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-#, fuzzy
-msgid "Contact Editor"
-msgstr "_Ãíùñéìßá"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-#, fuzzy
-msgid "_Home"
-msgstr "Óçìåßù_ìá"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-#, fuzzy
-msgid "_Mobile"
-msgstr "_ÌÞíõìá"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-#, fuzzy
-msgid "C_ontacts..."
-msgstr "_Ãíùñéìßá"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-#, fuzzy
-msgid "_Job title:"
-msgstr "_ÌÞíõìá"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-#, fuzzy
-msgid "_Company:"
-msgstr "ÁíôéãñáöÞ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "General"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-#, fuzzy
-msgid "No_tes:"
-msgstr "Óçìåßù_ìá"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-msgid "Details"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:10
-#, fuzzy
-msgid "_Middle:"
-msgstr "_ÌÞíõìá"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:415
-#: calendar/gui/calendar-commands.c:544
-#, fuzzy
-msgid "New"
-msgstr "_ÍÝï"
-
-#: addressbook/gui/component/addressbook.c:415
-msgid "Create a new contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Find"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Find a contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:420
-#: addressbook/gui/component/addressbook.c:487
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:43
-#, fuzzy
-msgid "Print"
-msgstr "Ðñïôåñáéüôçôá"
-
-#: addressbook/gui/component/addressbook.c:420
-#, fuzzy
-msgid "Print contacts"
-msgstr "Ï êáôÜëïãïò ãíùñéìéþí óáò"
-
-#. Delete
-#: addressbook/gui/component/addressbook.c:421
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:498
-#: mail/folder-browser-factory.c:45
-msgid "Delete"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:421
-#, fuzzy
-msgid "Delete a contact"
-msgstr "ÅðéëÝîôå åðéóýíáøç"
-
-#: addressbook/gui/component/addressbook.c:494
-#: addressbook/gui/component/addressbook.c:1034
-msgid "As _Table"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:501
-#, fuzzy
-msgid "_New Contact"
-msgstr "_Ãíùñéìßá"
-
-#: addressbook/gui/component/addressbook.c:509
-msgid "N_ew Directory Server"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:588
-#, fuzzy
-msgid "Unable to open addressbook"
-msgstr "Êëßê åäþ ãéá ôï äéåõèõíóéïëüãéï"
-
-#: addressbook/gui/component/addressbook.c:593
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:938
-#: addressbook/gui/minicard/e-minicard.c:329
-msgid "Save as VCard"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1005
-msgid "* Click here to add a contact *"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1041
-msgid "As _Minicards"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1092
-msgid "The URI that the Folder Browser will display"
-msgstr "Ôï URI ðïõ èá åìöáíßóåé ï ÅîåñåõíçôÞò ÖáêÝëëùí"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:98
-msgid "h"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:23
-#, fuzzy
-msgid "o"
-msgstr "Ðñïò"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr ""
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:10
-#, fuzzy
-msgid "Options"
-msgstr "Å_íÝñãåéåò"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:12
-#, fuzzy
-msgid "Sections:"
-msgstr "Å_íÝñãåéåò"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:19
-#, fuzzy
-msgid "Fonts"
-msgstr "Ãíùñéìßåò"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:24
-#, fuzzy
-msgid "Body"
-msgstr "ÓÞìåñá"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:28
-#, fuzzy
-msgid "Format"
-msgstr "Áðü"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-#, fuzzy
-msgid "Paper"
-msgstr "Åðéêüëëçóç"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:37
-#, fuzzy
-msgid "Top:"
-msgstr "Ðñïò:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:41
-#, fuzzy
-msgid "Page"
-msgstr "Åðéêüëëçóç"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-#, fuzzy
-msgid "Size:"
-msgstr "ÌÝãåèïò"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:48
-#, fuzzy
-msgid "Portrait"
-msgstr "Ðñïôåñáéüôçôá"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:544
-msgid "am"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:543
-msgid "pm"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:59
-#, fuzzy
-msgid "Appointments:"
-msgstr "Ñ_áíôåâïý"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:175
-#, fuzzy
-msgid "Gnome Calendar"
-msgstr "Çìåñïëüãéï"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:456
-#, fuzzy
-msgid "Open calendar"
-msgstr "Ôï çìåñïëüãéü óáò"
-
-#: calendar/gui/calendar-commands.c:495
-#, fuzzy
-msgid "Save calendar"
-msgstr "Ôï çìåñïëüãéü óáò"
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:712
-#: calendar/gui/gncal-todo.c:716
-msgid "Day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-msgid "Show the working week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:711
-msgid "Week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:531
-#, fuzzy
-msgid "Month"
-msgstr "Ãíùñéìßåò"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:682
-msgid "Create a new appointment"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-#, fuzzy
-msgid "Print this calendar"
-msgstr "Ôï çìåñïëüãéü óáò"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Prev"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:553
-#, fuzzy
-msgid "Today"
-msgstr "ÓÞìåñá"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554 filter/filter-editor.c:210
-msgid "Next"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr ""
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-#, fuzzy
-msgid "New Ca_lendar"
-msgstr "Çìåñïëüãéï"
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:663
-#, fuzzy
-msgid "Open Ca_lendar"
-msgstr "Çìåñïëüãéï"
-
-#: calendar/gui/calendar-commands.c:664
-#, fuzzy
-msgid "Open a calendar"
-msgstr "Ôï çìåñïëüãéü óáò"
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-#, fuzzy
-msgid "Save Calendar As"
-msgstr "Çìåñïëüãéï"
-
-#: calendar/gui/calendar-commands.c:673
-#, fuzzy
-msgid "Print..."
-msgstr "Ðñïôåñáéüôçôá"
-
-#: calendar/gui/calendar-commands.c:682
-#, fuzzy
-msgid "_New appointment..."
-msgstr "Ñ_áíôåâïý"
-
-#: calendar/gui/calendar-commands.c:687
-msgid "New appointment for _today..."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:688
-msgid "Create a new appointment for today"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:696 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/calendar-commands.c:704
-#, fuzzy
-msgid "About Calendar"
-msgstr "Ôï çìåñïëüãéü óáò"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:746
-#, c-format
-msgid "%s%s"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:746
-#, fuzzy
-msgid "'s calendar"
-msgstr "Ôï çìåñïëüãéü óáò"
-
-#: calendar/gui/calendar-pilot-sync.c:68
-msgid "Specifies the port on which the Pilot is"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:68
-msgid "PORT"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:70
-msgid "If you want to debug the attributes on records"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:72
-msgid "Only syncs from desktop to pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:74
-msgid "Only syncs from pilot to desktop"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:97
-msgid "Can not create Pilot socket\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:104
-#, c-format
-msgid "Can not bind to device %s\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:107
-msgid "Failed to get a connection from the Pilot device"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:111
-msgid "pi_accept failed"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:211
-msgid ""
-"\tObject has been modified on desktop and on the pilot, desktop takes "
-"precedence\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:531
-msgid "No description"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:692
-msgid "Could not open DatebookDB on the Pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:693
-msgid "Unable to open DatebookDB"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:728
-msgid "Synced DateBook from Pilot to GnomeCal"
-msgstr ""
-
-#: calendar/gui/control-factory.c:136
-#, fuzzy
-msgid "The URI that the calendar will display"
-msgstr "Ôï URI ðïõ èá åìöáíßóåé ï ÅîåñåõíçôÞò ÖáêÝëëùí"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1056
-#, fuzzy
-msgid "Snooze"
-msgstr "ÌÝãåèïò"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-#, fuzzy
-msgid "Edit appointment"
-msgstr "Ñ_áíôåâïý"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr ""
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-#, fuzzy
-msgid "New appointment..."
-msgstr "Ñ_áíôåâïý"
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-#, fuzzy
-msgid "Delete this appointment"
-msgstr "ÁðïóôïëÞ ðáñüíôïò ìçíýìáôïò"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-#, fuzzy
-msgid "Delete this occurrence"
-msgstr "ÁðïóôïëÞ ðáñüíôïò ìçíýìáôïò"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr ""
-
-#: calendar/gui/event-editor.c:289
-#, fuzzy
-msgid "Edit Appointment"
-msgstr "Ñ_áíôåâïý"
-
-#: calendar/gui/event-editor.c:294
-msgid "No summary"
-msgstr ""
-
-#: calendar/gui/event-editor.c:298
-#, fuzzy, c-format
-msgid "Appointment - %s"
-msgstr "Ñ_áíôåâïý"
-
-#: calendar/gui/event-editor.c:301
-#, fuzzy, c-format
-msgid "Task - %s"
-msgstr "Åêêñåìüôçôåò"
-
-#: calendar/gui/event-editor.c:304
-#, fuzzy, c-format
-msgid "Journal entry - %s"
-msgstr "Êáôá÷þñçóç Çìåñï_ëïãßïõ"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:594 calendar/gui/event-editor.c:688
-msgid "?"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1215
-msgid "FIXME: Ca_lendar..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1250
-msgid "FIXME: Chec_k Names"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1251
-msgid "FIXME: Address _Book..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1258
-#, fuzzy
-msgid "FIXME: _New Appointment"
-msgstr "Ñ_áíôåâïý"
-
-#: calendar/gui/event-editor.c:1260
-msgid "FIXME: Rec_urrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1262
-msgid "FIXME: Intive _Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1263
-msgid "FIXME: C_ancel Invitation..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Forward as v_Calendar"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1320
-msgid "FIXME: Save and Close"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1330
-msgid "FIXME: Recurrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1331
-msgid "Configure recurrence rules"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1333
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1334
-msgid "Invite attendees to a meeting"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1745
-msgid "%a %b %d %Y"
-msgstr ""
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:14 calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid "_Display"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:32
-msgid "_Audio"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:33
-msgid "_Program"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:34
-#, fuzzy
-msgid "_Mail"
-msgstr "_ÌÞíõìá"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "Mail _to:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Run program:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "Classification"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "Pu_blic"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-#, fuzzy
-msgid "Pri_vate"
-msgstr "Åðéêüëëçóç"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Confidential"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:596
-#, fuzzy
-msgid "None"
-msgstr "Óçìåßù_ìá"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-msgid "Daily"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr ""
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-#, fuzzy
-msgid "month(s)"
-msgstr "Ãíùñéìßåò"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-#, fuzzy
-msgid "Exceptions"
-msgstr "Å_íÝñãåéåò"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-#, fuzzy
-msgid "Change"
-msgstr "Åðéêüëëçóç"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr ""
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr ""
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr ""
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr ""
-
-#: calendar/gui/getdate.y:394
-#, fuzzy
-msgid "april"
-msgstr "Åðéêüëëçóç"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr ""
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr ""
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr ""
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr ""
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr ""
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr ""
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr ""
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr ""
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr ""
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr ""
-
-#: calendar/gui/getdate.y:405
-#, fuzzy
-msgid "monday"
-msgstr "ÓÞìåñá"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:407
-#, fuzzy
-msgid "tues"
-msgstr "Óçìåßù_ìá"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr ""
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr ""
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr ""
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr ""
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr ""
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr ""
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr ""
-
-#: calendar/gui/getdate.y:421
-#, fuzzy
-msgid "month"
-msgstr "Ãíùñéìßåò"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr ""
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr ""
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr ""
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr ""
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr ""
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr ""
-
-#: calendar/gui/getdate.y:428
-#, fuzzy
-msgid "second"
-msgstr "ÁðïóôïëÞ"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr ""
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr ""
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr ""
-
-#: calendar/gui/getdate.y:437
-#, fuzzy
-msgid "today"
-msgstr "ÓÞìåñá"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr ""
-
-#: calendar/gui/getdate.y:439
-#, fuzzy
-msgid "last"
-msgstr "Åðéêüëëçóç"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr ""
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr ""
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr ""
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr ""
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr ""
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr ""
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr ""
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr ""
-
-#: calendar/gui/getdate.y:450
-#, fuzzy
-msgid "ninth"
-msgstr "Ðñïôåñáéüôçôá"
-
-#: calendar/gui/getdate.y:451
-#, fuzzy
-msgid "tenth"
-msgstr "ÅóôÜëç"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr ""
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Create to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Edit to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:171
-msgid "Summary:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:181
-msgid "Due Date:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:190
-#, fuzzy
-msgid "Priority:"
-msgstr "Ðñïôåñáéüôçôá"
-
-#: calendar/gui/gncal-todo.c:206
-msgid "Item Comments:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:324
-msgid "Add to-do item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:325
-msgid "Edit this item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:424
-msgid "Summary"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:425 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:426 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr "Ðñïôåñáéüôçôá"
-
-#: calendar/gui/gncal-todo.c:427
-msgid "Time Left"
-msgstr ""
-
-#. Label
-#: calendar/gui/gncal-todo.c:439
-#, fuzzy
-msgid "To-do list"
-msgstr "Å_ñãáëåßá"
-
-#. Add
-#: calendar/gui/gncal-todo.c:478
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr ""
-
-#. Edit
-#: calendar/gui/gncal-todo.c:487
-msgid "Edit..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:711
-msgid "Weeks"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:712 calendar/gui/gncal-todo.c:716
-#, fuzzy
-msgid "Days"
-msgstr "Ðñü÷åéñá"
-
-#: calendar/gui/gncal-todo.c:717 calendar/gui/gncal-todo.c:721
-msgid "Hours"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:717 calendar/gui/gncal-todo.c:721
-msgid "Hour"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Minutes"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Minute"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-#, fuzzy
-msgid "Seconds"
-msgstr "Å_íÝñãåéåò"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-#, fuzzy
-msgid "Second"
-msgstr "ÁðïóôïëÞ"
-
-#: calendar/gui/gnome-cal.c:453 calendar/gui/gnome-cal.c:1064
-#: calendar/gui/gnome-cal.c:1120
-msgid "Reminder of your appointment at "
-msgstr ""
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1069 calendar/gui/gnome-cal.c:1124
-msgid "Ok"
-msgstr ""
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr ""
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr ""
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr ""
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr ""
-
-#: calendar/gui/print.c:326
-#, fuzzy
-msgid "Fr"
-msgstr "Áðü"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr ""
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr ""
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr ""
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr ""
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr ""
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr ""
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1084
-#, fuzzy
-msgid "Print Calendar"
-msgstr "Çìåñïëüãéï"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr ""
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr ""
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr ""
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr ""
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr ""
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr ""
-
-#: calendar/gui/prop.c:347
-#, fuzzy
-msgid "Sunday"
-msgstr "ÁðïóôïëÞ"
-
-#: calendar/gui/prop.c:348
-#, fuzzy
-msgid "Monday"
-msgstr "ÓÞìåñá"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr ""
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr ""
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr ""
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr ""
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr ""
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr ""
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr ""
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr ""
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr ""
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr ""
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr ""
-
-#: calendar/gui/prop.c:678
-msgid "To Do List Properties"
-msgstr ""
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr ""
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-#, fuzzy
-msgid "Alarm Properties"
-msgstr "Åðéóýíáøç"
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr ""
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr ""
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr ""
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-msgid "Defaults"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.c:183 composer/e-msg-composer.c:766
-msgid "Cut"
-msgstr "ÊïðÞ"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "ÊïðÞ åðéëåãìÝíïõ áíôéêåéìÝíïõ óôï ðñü÷åéñï"
-
-#: composer/e-msg-composer-address-dialog.c:187 composer/e-msg-composer.c:767
-msgid "Copy"
-msgstr "ÁíôéãñáöÞ"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "ÁíôéãñáöÞ åðéëåãìÝíïõ áíôéêåéìÝíïõ óôï ðñü÷åéñï"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199 composer/e-msg-composer.c:768
-msgid "Paste"
-msgstr "Åðéêüëëçóç"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Åðéêüëëçóç áíôéêåéìÝíïõ áðï ôï ðñü÷åéñï"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "ÅðéëÝîôå ôç äéåýèõíóç ôïõ ðáñáëÞðôç"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-#, fuzzy
-msgid "Properties..."
-msgstr "Éäéüôçôåò"
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-#, fuzzy
-msgid "To: >>"
-msgstr "Ðñïò:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-#, fuzzy
-msgid "Cc: >>"
-msgstr "Áíôßãñáöï:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-#, fuzzy
-msgid "Bcc: >>"
-msgstr "Êñõöü áíôßãñáöï:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u byte"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Íåá åðéóýíáøç"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:332
-msgid "Remove"
-msgstr "ÄéáãñáöÞ"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "ÄéáãñáöÞ åðéëåãìÝíùí áíôéêåéìÝíùí áðü ôïí êáôÜëïãï åðéóõíÜøåùí"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "ÍÝá åðéóýíáøç..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Åðéóýíáøç áñ÷åßïõ óôï ìÞíõìá"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-#, fuzzy
-msgid "Attachment properties"
-msgstr "Åðéóýíáøç"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr ""
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr "Êëßê åäþ ãéá ôï äéåõèõíóéïëüãéï"
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "Ðñïò:"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr "ÅéóÜãåôå ôïí ðáñáëÞðôç ôïõ ìçíýìáôïò"
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr "Áíôßãñáöï:"
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "ÅéóÜãåôå ôéò äéåõèýíóåéò üðïõ èá óôáëåß áíôßãñáöï ôïõ ìçíýìáôïò"
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr "Êñõöü áíôßãñáöï:"
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"ÅéóÜãåôå ôéò äéåõèýíóåéò üðïõ èá óôáëåß áíôßãñáöï ôïõ ìçíýìáôïò ÷ùñßò áõôÝò "
-"íá åìöáíéóôïýí óôïí êáôÜëïãï ðáñáëçðôþí ôïõ ìçíýìáôïò."
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr "ÈÝìá:"
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr "ÅéóÜãåôå ôï èÝìá ôïõ ìçíýìáôïò"
-
-#: composer/e-msg-composer.c:463
-msgid "Save as..."
-msgstr ""
-
-#: composer/e-msg-composer.c:474
-#, c-format
-msgid "Error saving file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:494
-#, c-format
-msgid "Error loading file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:513
-#, fuzzy
-msgid "Discard this message?"
-msgstr "ÁðïóôïëÞ ðáñüíôïò ìçíýìáôïò"
-
-#: composer/e-msg-composer.c:561
-#, fuzzy
-msgid "Open file"
-msgstr "¶íïéãìá ÖáêÝëëïõ"
-
-#: composer/e-msg-composer.c:718
-msgid "Save in _folder..."
-msgstr "ÁðïèÞêåõóç óôï öÜêåëëï..."
-
-#: composer/e-msg-composer.c:718
-msgid "Save the message in a specified folder"
-msgstr "ÁðïèÞêåõóç ôïõ ìçíýìáôïò óôïí êáèïñéóìÝíï öÜêåëëï"
-
-#: composer/e-msg-composer.c:721 composer/e-msg-composer.c:763
-msgid "Send"
-msgstr "ÁðïóôïëÞ"
-
-#: composer/e-msg-composer.c:721
-msgid "Send the message"
-msgstr "ÁðïóôïëÞ ôïõ ìçíýìáôïò"
-
-#: composer/e-msg-composer.c:733
-msgid "View _attachments"
-msgstr "ÅìöÜíéóç åðéóõíÜ_øåùí"
-
-#: composer/e-msg-composer.c:733
-msgid "View/hide attachments"
-msgstr "ÅìöÜíéóç/áðüêñõøç åðéóõíÜøåùí"
-
-#: composer/e-msg-composer.c:763
-msgid "Send this message"
-msgstr "ÁðïóôïëÞ ðáñüíôïò ìçíýìáôïò"
-
-#: composer/e-msg-composer.c:766
-msgid "Cut selected region into the clipboard"
-msgstr "ÊïðÞ åðéëåãìÝíçò ðåñéï÷Þò óôï ðñü÷åéñï"
-
-#: composer/e-msg-composer.c:767
-msgid "Copy selected region into the clipboard"
-msgstr "ÁíôéãñáöÞ åðéëåãìÝíçò ðåñéï÷Þò óôï ðñü÷åéñï"
-
-#: composer/e-msg-composer.c:768
-msgid "Paste selected region into the clipboard"
-msgstr "Åðéêüëëçóç åðéëåãìÝíçò ðåñéï÷Þò áðü ôï ðñü÷åéñï"
-
-#: composer/e-msg-composer.c:769
-msgid "Undo"
-msgstr "Áêýñùóç"
-
-#: composer/e-msg-composer.c:769
-msgid "Undo last operation"
-msgstr "Áêýñùóç ôåëåõôáßáò ëåéôïõñãßáò"
-
-#: composer/e-msg-composer.c:772
-msgid "Attach"
-msgstr "Åðéóýíáøç"
-
-#: composer/e-msg-composer.c:772
-msgid "Attach a file"
-msgstr "Åðéóýíáøç áñ÷åßïõ"
-
-#: composer/e-msg-composer.c:948
-#, fuzzy
-msgid "Compose a message"
-msgstr "ÓõããñáöÞ íÝïõ ìçíýìáôïò"
-
-#: filter/filter-editor.c:198
-#, fuzzy
-msgid "Edit Filter"
-msgstr "_ÖÜêåëëïò"
-
-#: filter/filter-editor.c:198
-msgid "Create filter"
-msgstr ""
-
-#: filter/filter-editor.c:209
-msgid "Back"
-msgstr ""
-
-#: filter/filter-editor.c:211
-msgid "Finish"
-msgstr ""
-
-#: filter/filter-editor.c:212
-msgid "Cancel"
-msgstr ""
-
-#: filter/filter-editor.c:216
-msgid "Apply"
-msgstr ""
-
-#: filter/filter-editor.c:233
-msgid ""
-"<h2>Create Filtering Rule</h2><p>Select one of the base rules above, then "
-"continue forwards to customise it.</p>"
-msgstr ""
-
-#: mail/component-factory.c:196
-#, fuzzy
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Áñ÷éêïðïßçóçò ôïõ óõóôÞìáôïò ìïíÜäùí Bonobo áíåðéôõ÷Þò"
-
-#: mail/folder-browser-factory.c:29
-msgid "Get mail"
-msgstr ""
-
-#: mail/folder-browser-factory.c:29
-msgid "Check for new mail"
-msgstr ""
-
-#: mail/folder-browser-factory.c:30
-msgid "Compose"
-msgstr ""
-
-#: mail/folder-browser-factory.c:30
-#, fuzzy
-msgid "Compose a new message"
-msgstr "ÓõããñáöÞ íÝïõ ìçíýìáôïò"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply"
-msgstr ""
-
-#: mail/folder-browser-factory.c:34
-#, fuzzy
-msgid "Reply to the sender of this message"
-msgstr "ÅéóÜãåôå ôïí ðáñáëÞðôç ôïõ ìçíýìáôïò"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to All"
-msgstr ""
-
-#: mail/folder-browser-factory.c:35
-#, fuzzy
-msgid "Reply to all recipients of this message"
-msgstr "ÅéóÜãåôå ôïí ðáñáëÞðôç ôïõ ìçíýìáôïò"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward"
-msgstr ""
-
-#: mail/folder-browser-factory.c:37
-#, fuzzy
-msgid "Forward this message"
-msgstr "ÁðïóôïëÞ ðáñüíôïò ìçíýìáôïò"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Refile"
-msgstr "ÅëÞöèç"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Move message to a new folder"
-msgstr "ÁðïèÞêåõóç ôïõ ìçíýìáôïò óôïí êáèïñéóìÝíï öÜêåëëï"
-
-#: mail/folder-browser-factory.c:43
-#, fuzzy
-msgid "Print the selected message"
-msgstr "ÅéóÜãåôå ôïí ðáñáëÞðôç ôïõ ìçíýìáôïò"
-
-#: mail/folder-browser-factory.c:45
-#, fuzzy
-msgid "Delete this message"
-msgstr "ÁðïóôïëÞ ðáñüíôïò ìçíýìáôïò"
-
-#: mail/folder-browser-factory.c:65
-msgid "_Threaded Message List"
-msgstr ""
-
-#: mail/folder-browser-factory.c:77
-msgid "_Expunge"
-msgstr ""
-
-#: mail/folder-browser-factory.c:83
-msgid "_Filter Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:89
-msgid "_Virtual Folder Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:95
-msgid "_Mail Configuration ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:101
-msgid "Forget _Passwords"
-msgstr ""
-
-#: mail/mail-config.c:259
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-
-#: mail/mail-config.c:274
-msgid "Full name:"
-msgstr ""
-
-#: mail/mail-config.c:302
-msgid "Email address:"
-msgstr ""
-
-#: mail/mail-config.c:325
-msgid "Organization:"
-msgstr ""
-
-#: mail/mail-config.c:337
-msgid "Signature file:"
-msgstr ""
-
-#: mail/mail-config.c:342
-msgid "Signature File"
-msgstr ""
-
-#: mail/mail-config.c:699 mail/mail-config.c:790
-msgid "Server:"
-msgstr ""
-
-#: mail/mail-config.c:705
-msgid "Username:"
-msgstr ""
-
-#: mail/mail-config.c:711
-#, fuzzy
-msgid "Path:"
-msgstr "Åðéêüëëçóç"
-
-#: mail/mail-config.c:717 mail/mail-config.c:796
-msgid "Authentication:"
-msgstr ""
-
-#: mail/mail-config.c:729 mail/mail-config.c:808
-msgid "Detect supported types..."
-msgstr ""
-
-#: mail/mail-config.c:755 mail/mail-config.c:830
-msgid "Test these values before continuing"
-msgstr ""
-
-#: mail/mail-config.c:937
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:955
-msgid "Select the method you would like to use to deliver your mail."
-msgstr ""
-
-#: mail/mail-config.c:1129 mail/mail-config.c:1208
-msgid "Mail Configuration"
-msgstr ""
-
-#. Identity page
-#: mail/mail-config.c:1146
-msgid "Identity"
-msgstr ""
-
-#. Source page
-#: mail/mail-config.c:1165
-#, fuzzy
-msgid "Mail Source"
-msgstr "Êõñßùò Óõíôïìåýóåéò"
-
-#. Transport page
-#: mail/mail-config.c:1186
-msgid "Mail Transport"
-msgstr ""
-
-#: mail/mail-config.c:1308
-msgid "Edit Identity"
-msgstr ""
-
-#: mail/mail-config.c:1310
-msgid "Add Identity"
-msgstr ""
-
-#: mail/mail-config.c:1453
-msgid "Edit Source"
-msgstr ""
-
-#: mail/mail-config.c:1455
-#, fuzzy
-msgid "Add Source"
-msgstr "ÍÝá Óõíôüìåõóç"
-
-#: mail/mail-ops.c:372
-msgid "Fetching mail"
-msgstr ""
-
-#: mail/mail-ops.c:384
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-
-#: mail/mail-ops.c:732
-#, fuzzy
-msgid "Refile message(s) to"
-msgstr "ÍÝá ìçíýìáôá"
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr ""
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr ""
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr ""
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr ""
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr ""
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr ""
-
-#: mail/main.c:62
-msgid "Mail Component: I could not initialize Bonobo"
-msgstr "ÌïíÜäá Ôá÷/ìåßïõ: Áñ÷éêïðïßçóç ôïõ Bonobo áäýíáôç"
-
-#: mail/message-list.c:460
-#, fuzzy
-msgid "Online Status"
-msgstr "ÊáôÜóôáóç óýíäåóçò"
-
-#: mail/message-list.c:488
-msgid "From"
-msgstr "Áðü"
-
-#: mail/message-list.c:495
-msgid "Subject"
-msgstr "ÈÝìá"
-
-#: mail/message-list.c:502
-#, fuzzy
-msgid "Date"
-msgstr "Åðéêüëëçóç"
-
-#: mail/message-list.c:509
-#, fuzzy
-msgid "Received"
-msgstr "ÅëÞöèç"
-
-#: mail/message-list.c:516
-msgid "To"
-msgstr "Ðñïò"
-
-#: mail/message-list.c:523
-msgid "Size"
-msgstr "ÌÝãåèïò"
-
-#: shell/e-init.c:25
-msgid "Evolution can not create its local folders"
-msgstr "Ôï Evolution äå ìðïñåß íá äçìéïõñãÞóåé ôïõò ôïðéêïýò öáêÝëëïõò"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr ""
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr ""
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr ""
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, fuzzy, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr "ÁðïèÞêåõóç ôïõ ìçíýìáôïò óôïí êáèïñéóìÝíï öÜêåëëï"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:223
-#, fuzzy
-msgid "Evolution - Create new folder"
-msgstr "Ôï Evolution äå ìðïñåß íá äçìéïõñãÞóåé ôïõò ôïðéêïýò öáêÝëëïõò"
-
-#: shell/e-shell-folder-selection-dialog.c:95
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:236
-#, fuzzy
-msgid "New..."
-msgstr "_ÍÝï"
-
-#: shell/e-shell-folder-title-bar.c:355
-msgid "(Untitled)"
-msgstr ""
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:110
-msgid "Bug buddy was not found in your $PATH."
-msgstr ""
-
-#. same as above
-#: shell/e-shell-view-menu.c:116
-msgid "Bug buddy could not be run."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:159
-msgid "Evolution"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:161
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:163
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:301
-#, fuzzy
-msgid "Go to folder..."
-msgstr "ÁðïèÞêåõóç óôï öÜêåëëï..."
-
-#: shell/e-shell-view-menu.c:365
-msgid "_Folder"
-msgstr "_ÖÜêåëëïò"
-
-#: shell/e-shell-view-menu.c:369
-msgid "Evolution _Bar Shortcut"
-msgstr "Ã_ñáììÞ Óõíôïìåýóåùí ôïõ Evolution"
-
-#: shell/e-shell-view-menu.c:375
-#, fuzzy
-msgid "_Mail message (FIXME)"
-msgstr "_ÌÞíõìá"
-
-#: shell/e-shell-view-menu.c:376 shell/e-shell-view-menu.c:379
-msgid "Composes a new mail message"
-msgstr "ÓõããñáöÞ íÝïõ ìçíýìáôïò"
-
-#: shell/e-shell-view-menu.c:378
-#, fuzzy
-msgid "_Appointment (FIXME)"
-msgstr "Ñ_áíôåâïý"
-
-#: shell/e-shell-view-menu.c:381
-#, fuzzy
-msgid "_Contact (FIXME)"
-msgstr "_Ãíùñéìßá"
-
-#: shell/e-shell-view-menu.c:384
-msgid "_Task (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:387
-#, fuzzy
-msgid "Task _Request (FIXME)"
-msgstr "Áßôç_óç Åêêñåìüôçôáò"
-
-#: shell/e-shell-view-menu.c:390
-#, fuzzy
-msgid "_Journal Entry (FIXME)"
-msgstr "Êáôá÷þñçóç Çìåñï_ëïãßïõ"
-
-#: shell/e-shell-view-menu.c:398
-msgid "_New"
-msgstr "_ÍÝï"
-
-#: shell/e-shell-view-menu.c:402
-#, fuzzy
-msgid "_Go to folder..."
-msgstr "ÁðïèÞêåõóç óôï öÜêåëëï..."
-
-#: shell/e-shell-view-menu.c:402
-msgid "Display a different folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:404
-#, fuzzy
-msgid "_Create new folder..."
-msgstr "ÁðïèÞêåõóç óôï öÜêåëëï..."
-
-#: shell/e-shell-view-menu.c:404
-msgid "Create a new folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:419
-#, fuzzy
-msgid "Show _shortcut bar"
-msgstr "ÄéáãñáöÞ áðü ÃñáììÞ Óõíôïìåýóåùí"
-
-#: shell/e-shell-view-menu.c:420
-#, fuzzy
-msgid "Show the shortcut bar"
-msgstr "ÄéáãñáöÞ áðü ÃñáììÞ Óõíôïìåýóåùí"
-
-#: shell/e-shell-view-menu.c:422
-#, fuzzy
-msgid "Show _folder bar"
-msgstr "ÄéáãñáöÞ áðü ÃñáììÞ Óõíôïìåýóåùí"
-
-#: shell/e-shell-view-menu.c:423
-msgid "Show the folder bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:440
-msgid "Help _Index"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:443
-msgid "Getting _Started"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:446
-msgid "Using the _Mailer"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:449
-msgid "Using the _Calendar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:452
-msgid "Using the Cont_act Manager"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:457
-msgid "_Submit bug report"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:458
-msgid "Submit bug-report via bug-buddy"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:474
-msgid "_Actions"
-msgstr "Å_íÝñãåéåò"
-
-#: shell/e-shell-view.c:113
-msgid "(No folder displayed)"
-msgstr ""
-
-#: shell/e-shell-view.c:208
-#, fuzzy
-msgid "Folders"
-msgstr "_ÖÜêåëëïò"
-
-#: shell/e-shell-view.c:600
-#, c-format
-msgid "Evolution - %s"
-msgstr ""
-
-#: shell/e-shell.c:299
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr ""
-
-#: shell/e-shortcut.c:469
-msgid "New group"
-msgstr "ÍÝá ÏìÜäá"
-
-#: shell/e-shortcuts-view.c:235
-#, fuzzy
-msgid "_Small icons"
-msgstr "ÌéêñÜ Åéêïíßäéá"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:238
-#, fuzzy
-msgid "_Large icons"
-msgstr "ÌåãÜëá Åéêïíßäéá"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate this shortcut"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:332
-msgid "Remove this shortcut from the shortcut bar"
-msgstr ""
-
-#: shell/e-shortcuts.c:358
-#, fuzzy
-msgid "Error saving shortcuts."
-msgstr "Êõñßùò Óõíôïìåýóåéò"
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr ""
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr ""
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr ""
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr ""
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr ""
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr ""
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr ""
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr ""
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr ""
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr ""
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr ""
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr ""
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr ""
-
-#: shell/main.c:99
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-
-#: shell/main.c:126
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-
-#: shell/main.c:172
-msgid "Cannot initialize the Evolution shell."
-msgstr ""
-
-#: shell/main.c:214
-#, fuzzy
-msgid "Cannot initialize the configuration system."
-msgstr "Áñ÷éêïðïßçóçò ôïõ óõóôÞìáôïò ìïíÜäùí Bonobo áíåðéôõ÷Þò"
-
-#: shell/main.c:220
-#, fuzzy
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Áñ÷éêïðïßçóçò ôïõ óõóôÞìáôïò ìïíÜäùí Bonobo áíåðéôõ÷Þò"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr ""
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr ""
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr ""
-
-#: widgets/e-table/e-table-config.glade.h:10
-#, fuzzy
-msgid "Filter"
-msgstr "_ÖÜêåëëïò"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-msgid "Field Chooser"
-msgstr ""
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:13
-#, fuzzy
-msgid "<< Remove"
-msgstr "ÄéáãñáöÞ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-#, fuzzy
-msgid "_Options"
-msgstr "Å_íÝñãåéåò"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-#, fuzzy
-msgid "Meeting _start time:"
-msgstr "Áß_ôçóç ÓõíÜíôçóçò"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-#, fuzzy
-msgid "Meeting _end time:"
-msgstr "Áß_ôçóç ÓõíÜíôçóçò"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr ""
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr ""
-
-#: widgets/shortcut-bar/e-group-bar.c:633
-#, c-format
-msgid "Group %i"
-msgstr ""
-
-#, fuzzy
-#~ msgid "Send a new message"
-#~ msgstr "ÁðïóôïëÞ ôïõ ìçíýìáôïò"
-
-#, fuzzy
-#~ msgid "Find messages"
-#~ msgstr "ÁðåóôáëìÝíá ìçíýìáôá"
-
-#~ msgid "We are sorry, Evolution's Folder Browser can not be initialized."
-#~ msgstr ""
-#~ "Ìáò óõã÷øñåßôå, ç áñ÷éêïðïßçóç ôïõ åîåñåõíçôÞ öáêÝëëùí ôïõ Evolution áðÝôõ÷å."
-
-#~ msgid "Whether a message preview should be shown"
-#~ msgstr "¸áí èÝëåôå Þ ï÷é ðñïåðéóêüðéóç ìçíõìÜôùí"
-
-#~ msgid "_Task"
-#~ msgstr "Åêêñåìü_ôçôá"
-
-#~ msgid "_Selected Items"
-#~ msgstr "Åðéëå_ãìÝíá Áíôéêåßìåíá"
-
-#~ msgid "_New Folder"
-#~ msgstr "_ÍÝïò ÖÜêåëëïò"
-
-#~ msgid "_Open"
-#~ msgstr "¶íïé_ãìá"
-
-#~ msgid "Clos_e All Items"
-#~ msgstr "Êë_åßóéìï ¼ëùí"
-
-#~ msgid "Closes all the open items"
-#~ msgstr "Êëåßóéìï üëùí ôùí áíïé÷ôþí áíôéêåéìÝíùí"
-
-#~ msgid ""
-#~ "Evolution detected that the file `%s' is a not a directory.\n"
-#~ "\n"
-#~ "Evolution can rename the file, delete the file or shutdown and\n"
-#~ "let you fix the problem."
-#~ msgstr ""
-#~ "Ôï Evolution âñÞêå üôé ôï áñ÷åßï \"%s\" äåí åßíáé êáôÜëïãïò.\n"
-#~ "\n"
-#~ "Ôï Evolution ìðïñåß íá ìåôïíïìÜóåé ôï áñ÷åßï, íá ôï äéáãñÜøåé Þ íá\n"
-#~ "ôåñìáôßóåé þóôå íá äéïñèþóåôå ôï ðñüâëçìá."
-
-#~ msgid ""
-#~ "This is a development version of Evolution.\n"
-#~ " Using the mail component on your mail files\n"
-#~ " is extremely hazardous.\n"
-#~ "Please backup all your mails before trying\n"
-#~ " this program. \n"
-#~ " You have been warned\n"
-#~ msgstr ""
-#~ "ÁõôÞ åßíáé ðåéñáìáôéêÞ Ýêäïóç ôïõ Evolution.\n"
-#~ " Ç ÷ñÞóç ôïõ ôìÞìáôïò çë. ôá÷õäñïìåßïõ ãéá ôá áñ÷åßá\n"
-#~ " ìçíõìÜôùí åßíáé éäéáßôåñá åðéêßíäõíç.\n"
-#~ "Ðáñáêáëïýìå êÜíôå áíôßãñáöá ôùí ìçíõìÜôùí óáò ðñßí\n"
-#~ " äïêéìÜóåôå ôï ðáñüí ðñüãñáììá. \n"
-#~ " ¸÷åôå ðñïåéäïðïéçèåß!\n"
-
-#~ msgid ""
-#~ "An exception occured while trying to load data into the component with "
-#~ "PersistStream"
-#~ msgstr ""
-#~ "ÐñïÝêõøå åîáßñåóç êáôÜ ôçí áðüðåéñá áíÜãíùóçò äåäïìÝíùí ìå PersistStream áðü "
-#~ "ôç ìïíÜäá"
-
-#~ msgid "The %s component doesn't support PersistStream!\n"
-#~ msgstr "Ç ìïíÜäá %s äåí õðïóôçñßæåé ôá PersistStream!\n"
-
-#~ msgid "Message status"
-#~ msgstr "ÊáôÜóôáóç ìçíõìÜôùí"
-
-#~ msgid "A folder containing mail items"
-#~ msgstr "ÖÜêåëëïò ðïõ ðåñéÝ÷åé ìçíýìáôá"
-
-#~ msgid "A folder containing contacts"
-#~ msgstr "ÖÜêåëëïò ðïõ ðåñéÝ÷åé ãíùñéìßåò"
-
-#~ msgid "A folder containing calendar entries"
-#~ msgstr "ÖÜêåëëïò ðïõ ðåñéÝ÷åé óôïé÷åßá çìåñïëïãßïõ"
-
-#~ msgid "A folder containing tasks"
-#~ msgstr "ÖÜêåëïò ðïõ ðåñéÝ÷åé åêêñåìüôçôåò"
-
-#~ msgid "A service containing mail items"
-#~ msgstr "Õðçñåóßá ðïõ ðåñéÝ÷åé ìçíýìáôá"
-
-#~ msgid "A service containing contacts"
-#~ msgstr "Õðçñåóßá ðïõ ðåñéÝ÷åé ãíùñéìßåò"
-
-#~ msgid "A service containing calendar entries"
-#~ msgstr "Õðçñåóßá ðïõ ðåñéÝ÷åé óôïé÷åßá çìåñïëïãßïõ"
-
-#~ msgid "A service containing tasks"
-#~ msgstr "Õðçñåóßá ðïõ ðåñéÝ÷åé åêêñåìüôçôåò"
-
-#~ msgid "Add New Group"
-#~ msgstr "ÍÝá ÏìÜäá"
-
-#~ msgid "Remove Group"
-#~ msgstr "ÄéáãñáöÞ ÏìÜäáò"
-
-#~ msgid "Rename Group"
-#~ msgstr "Ìåôïíïìáóßá ÏìÜäáò"
-
-#~ msgid "Open in New Window"
-#~ msgstr "¶íïéãìá óå ÍÝï ÐáñÜèõñï"
-
-#~ msgid "Advanced Find"
-#~ msgstr "ÁíáæÞôçóç ãéá Ðñï÷ùñçìÝíïõò"
-
-#~ msgid "Rename Shortcut"
-#~ msgstr "Ìåôïíïìáóßá Óõíôüìåõóçò"
-
-#~ msgid "Executive Summary"
-#~ msgstr "Ðåñßëçøç"
-
-#~ msgid "Inbox"
-#~ msgstr "Åéóåñ÷üìåíá"
-
-#~ msgid "Sent mail messages"
-#~ msgstr "ÁðåóôáëìÝíá ìçíýìáôá"
-
-#~ msgid "Draft mail messages"
-#~ msgstr "Ðñü÷åéñá ìçíýìáôá"
-
-#~ msgid "Tasks list"
-#~ msgstr "ÊáôÜëïãïò åêêñåìïôÞôùí"
-
-#~ msgid "Other Shortcuts"
-#~ msgstr "ËïéðÝò Óõíôïìåýóåéò"
-
-#~ msgid "Enables some debugging functions"
-#~ msgstr "Åíåñãïðïßçóç ìåñéêþí ëåéôïõñãéþí áðïóöáëìÜôùóçò"
-
-#~ msgid "LEVEL"
-#~ msgstr "ÅÐÉÐÅÄÏ"
diff --git a/po/es.po b/po/es.po
deleted file mode 100644
index c820415c13..0000000000
--- a/po/es.po
+++ /dev/null
@@ -1,3540 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# Héctor García Álvarez <hector@scouts-es.org>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution 0.0.3\n"
-"POT-Creation-Date: 2000-08-02 16:35+0200\n"
-"PO-Revision-Date: 2000-05-03 14:26+0200\n"
-"Last-Translator: Héctor García Alvarez <hector@scouts-es.org>\n"
-"Language-Team: Spanish <es@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:59 calendar/gui/main.c:68
-#, fuzzy
-msgid "Could not initialize Bonobo"
-msgstr "Componenete de correo: No pude inicializar Bonobo"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-#, fuzzy
-msgid "categories"
-msgstr "Ca_tegorias..."
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:9
-#, fuzzy
-msgid "Available Categories:"
-msgstr "Campos disponibles"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/event-editor.c:1168
-#, fuzzy
-msgid "FIXME: _Appointment"
-msgstr "C_ita"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1169
-#, fuzzy
-msgid "FIXME: Meeting Re_quest"
-msgstr "_Petición de reunión"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/event-editor.c:1171
-#, fuzzy
-msgid "FIXME: _Mail Message"
-msgstr "_Mensaje de correo"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/event-editor.c:1172
-#, fuzzy
-msgid "FIXME: _Contact"
-msgstr "C_ontacto"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/event-editor.c:1173
-msgid "FIXME: _Task"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/event-editor.c:1174
-#, fuzzy
-msgid "FIXME: Task _Request"
-msgstr "P_etición de tarea"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/event-editor.c:1175
-msgid "FIXME: _Journal Entry"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1176
-msgid "FIXME: _Note"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/event-editor.c:1178 calendar/gui/event-editor.c:1285
-msgid "FIXME: Ch_oose Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1183
-msgid "FIXME: _Memo Style"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/event-editor.c:1185
-msgid "FIXME: Define Print _Styles..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/event-editor.c:1192
-msgid "FIXME: S_end"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/event-editor.c:1196
-#, fuzzy
-msgid "FIXME: Save Attac_hments..."
-msgstr "Incluir adjunto..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-#, fuzzy
-msgid "_Delete"
-msgstr "Borrar"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1199
-msgid "FIXME: _Move to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/event-editor.c:1200
-msgid "FIXME: Cop_y to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/event-editor.c:1202
-#, fuzzy
-msgid "Page Set_up"
-msgstr "Configuración de la página:"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/event-editor.c:1203
-msgid "FIXME: Print Pre_view"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: Paste _Special..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/event-editor.c:1229
-msgid "FIXME: Mark as U_nread"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/event-editor.c:1233
-#, fuzzy
-msgid "_Object"
-msgstr "Asunto"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/event-editor.c:1238 calendar/gui/event-editor.c:1245
-msgid "FIXME: _Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/event-editor.c:1239 calendar/gui/event-editor.c:1246
-msgid "FIXME: _Unread Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/event-editor.c:1247
-msgid "FIXME: _Last Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/event-editor.c:1252
-msgid "FIXME: _Standard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1254
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/event-editor.c:1257
-msgid "FIXME: _Customize..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/event-editor.c:1262
-msgid "Pre_vious"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/event-editor.c:1263
-msgid "Ne_xt"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/event-editor.c:1267
-#, fuzzy
-msgid "_Toolbars"
-msgstr "_Herramientas"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/event-editor.c:1272
-msgid "FIXME: _File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/event-editor.c:1273
-msgid "FIXME: It_em..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/event-editor.c:1274
-msgid "FIXME: _Object..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/event-editor.c:1279
-#, fuzzy
-msgid "FIXME: _Font..."
-msgstr "Fuente..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/event-editor.c:1280
-msgid "FIXME: _Paragraph..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/event-editor.c:1287
-msgid "FIXME: Desi_gn This Form"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/event-editor.c:1288
-msgid "FIXME: D_esign a Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/event-editor.c:1290
-msgid "FIXME: Publish _Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/event-editor.c:1291
-msgid "FIXME: Pu_blish Form As..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/event-editor.c:1293
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/event-editor.c:1298
-msgid "FIXME: _Spelling..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/event-editor.c:1303
-#, fuzzy
-msgid "_Forms"
-msgstr "Formatear"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1316
-#, fuzzy
-msgid "FIXME: For_ward"
-msgstr "Reenviar"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/event-editor.c:1329
-msgid "_Insert"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/event-editor.c:1330
-#, fuzzy
-msgid "F_ormat"
-msgstr "Formatear"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/event-editor.c:1331 shell/e-shell-view-menu.c:515
-msgid "_Tools"
-msgstr "_Herramientas"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/event-editor.c:1332
-#, fuzzy
-msgid "Actio_ns"
-msgstr "_Acciones"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1371
-msgid "Save the appointment and close the dialog box"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:673
-#, fuzzy
-msgid "Print..."
-msgstr "Imprimir"
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/event-editor.c:1376
-msgid "Print this item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/event-editor.c:1377
-msgid "FIXME: Insert File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/event-editor.c:1378
-msgid "Insert a file as an attachment"
-msgstr ""
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/gui/component/addressbook.c:426 calendar/gui/gncal-todo.c:508
-#: mail/folder-browser-factory.c:39
-msgid "Delete"
-msgstr "Borrar"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/event-editor.c:1387 calendar/gui/gncal-todo.c:336
-#, fuzzy
-msgid "Delete this item"
-msgstr "Borrar este mensaje"
-
-#: addressbook/contact-editor/e-contact-editor.c:856
-#: calendar/gui/event-editor.c:1389
-msgid "FIXME: Previous"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/event-editor.c:1390
-msgid "Go to the previous item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:859
-#: calendar/gui/event-editor.c:1391
-msgid "FIXME: Next"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/event-editor.c:1392
-msgid "Go to the next item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:862
-#: calendar/gui/event-editor.c:1393
-msgid "FIXME: Help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:863
-#: calendar/gui/event-editor.c:1394
-msgid "See online help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1278
-#, fuzzy
-msgid "Assistant"
-msgstr "Nombre del asistente:"
-
-#: addressbook/contact-editor/e-contact-editor.c:1279
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Business"
-msgstr "Trabajo"
-
-#: addressbook/contact-editor/e-contact-editor.c:1280
-#, fuzzy
-msgid "Business 2"
-msgstr "Trabajo"
-
-#: addressbook/contact-editor/e-contact-editor.c:1281
-#, fuzzy
-msgid "Business Fax"
-msgstr "_Fax del trabajo"
-
-#: addressbook/contact-editor/e-contact-editor.c:1282
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1283
-msgid "Car"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1284
-#, fuzzy
-msgid "Company"
-msgstr "Compañia:"
-
-#: addressbook/contact-editor/e-contact-editor.c:1285
-#: addressbook/contact-editor/e-contact-editor.c:1384
-#, fuzzy
-msgid "Home"
-msgstr "_Casa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1286
-#, fuzzy
-msgid "Home 2"
-msgstr "_Casa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1287
-#, fuzzy
-msgid "Home Fax"
-msgstr "_Casa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1288
-msgid "ISDN"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1289
-#, fuzzy
-msgid "Mobile"
-msgstr "_Movil"
-
-#: addressbook/contact-editor/e-contact-editor.c:1290
-#: addressbook/contact-editor/e-contact-editor.c:1385
-msgid "Other"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1291
-msgid "Other Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1292
-#, fuzzy
-msgid "Pager"
-msgstr "Pagina"
-
-#: addressbook/contact-editor/e-contact-editor.c:1293
-#, fuzzy
-msgid "Primary"
-msgstr "Correo electrónico principal"
-
-#: addressbook/contact-editor/e-contact-editor.c:1294
-msgid "Radio"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1295
-msgid "Telex"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1296
-msgid "TTY/TDD"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1340
-msgid "Primary Email"
-msgstr "Correo electrónico principal"
-
-#: addressbook/contact-editor/e-contact-editor.c:1341
-msgid "Email 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1342
-msgid "Email 3"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-#, fuzzy
-msgid "_Add"
-msgstr "Añadir"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "Tipo de teléfono"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "Nuevo tipo de teléfono"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-msgid "Add"
-msgstr "Añadir"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "Editor de contactos"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "_Nombre completo..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "Archivar como:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Dirección de la página web:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "Prefiere recivir el correo como _HTML"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Direccion:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "_Trabajo"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "_Casa"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "_Fax del trabajo"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "_Movil"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-#, fuzzy
-msgid "B_usiness"
-msgstr "Trabajo"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-#, fuzzy
-msgid "_This is the mailing address"
-msgstr "Esta es la direción de _correo"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-#, fuzzy
-msgid "C_ontacts..."
-msgstr "_Contactos..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr "Ca_tegorias..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-#, fuzzy
-msgid "_Job title:"
-msgstr "Puesto"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-#, fuzzy
-msgid "_Company:"
-msgstr "Compañia:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-msgid "General"
-msgstr "General"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-#, fuzzy
-msgid "_Department:"
-msgstr "Departamento:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-#, fuzzy
-msgid "_Office:"
-msgstr "Oficina:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-#, fuzzy
-msgid "_Profession:"
-msgstr "Profesión:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-#, fuzzy
-msgid "_Nickname:"
-msgstr "Nick:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-#, fuzzy
-msgid "_Spouse:"
-msgstr "Conyuge:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-#, fuzzy
-msgid "_Birthday:"
-msgstr "Fecha de nacimiento:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-#, fuzzy
-msgid "_Assistant's name:"
-msgstr "Nombre del asistente:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-#, fuzzy
-msgid "_Manager's Name:"
-msgstr "Nombre del manager:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-#, fuzzy
-msgid "Anni_versary:"
-msgstr "Aniversario:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-#, fuzzy
-msgid "No_tes:"
-msgstr "Notas:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-msgid "Details"
-msgstr "Detalles"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "Comprobar nombre completo"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "_Título:"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "_Primero:"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "_Mediano:"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "_Último:"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "_Sufijo:"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Sr.\n"
-"Sra.\n"
-"Dr.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-
-#: addressbook/gui/component/addressbook.c:420
-#: calendar/gui/calendar-commands.c:544
-#, fuzzy
-msgid "New"
-msgstr "Correo _nuevo"
-
-#: addressbook/gui/component/addressbook.c:420
-msgid "Create a new contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find"
-msgstr "Buscar"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find a contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:425
-#: addressbook/gui/component/addressbook.c:492
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:37
-msgid "Print"
-msgstr "Imprimir"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Print contacts"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:426
-#, fuzzy
-msgid "Delete a contact"
-msgstr "Seleccionar un adjunto"
-
-#: addressbook/gui/component/addressbook.c:499
-#: addressbook/gui/component/addressbook.c:1034
-msgid "As _Table"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:506
-#, fuzzy
-msgid "_New Contact"
-msgstr "C_ontacto"
-
-#: addressbook/gui/component/addressbook.c:514
-msgid "N_ew Directory Server"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:593
-#, fuzzy
-msgid "Unable to open addressbook"
-msgstr "Presione aquí para acceder a la agenda"
-
-#: addressbook/gui/component/addressbook.c:598
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:938
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1005
-msgid "* Click here to add a contact *"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1041
-msgid "As _Minicards"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1092
-msgid "The URI that the Folder Browser will display"
-msgstr "La URI que mostrará el visor de carpetas"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-#, fuzzy
-msgid "window2"
-msgstr "window1"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:23
-#, fuzzy
-msgid "o"
-msgstr "A"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "Descripción:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "Servidor LDAP:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Número de puerto:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Nombre:"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "Configuración de la página:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Nombre del estilo:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "Vista previa:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "Opciones"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Incluye:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "Secciones:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "Cabaceras para cada carta"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "Comenzar en una nueva página"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Número de columnas:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "Fuentes"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "Fuente..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "Cabecera"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "Cuerpo"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "Oscureciendo"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "Imprimir usando un oscurecimiento gris"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "Formatear"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Papel"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Tipo:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-msgid "label26"
-msgstr "label26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Dimensiones:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Ancho:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Alto:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "Fuente del papel:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "Margenes"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Encabezado:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Pie:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Izquierda:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Derecha:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "Pagina"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Tamaño:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Orientación"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "Vertical"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "Horizontal"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "Cabecera"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "Pie:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "Cabecera/Pie"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:544
-#, fuzzy
-msgid "am"
-msgstr "Nombre"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:543
-msgid "pm"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:57
-#, fuzzy
-msgid "Headings:"
-msgstr "Cabecera"
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:59
-#, fuzzy
-msgid "Appointments:"
-msgstr "C_ita"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:456
-msgid "Open calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Save calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:722
-#: calendar/gui/gncal-todo.c:726
-msgid "Day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-msgid "Show the working week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:721
-msgid "Week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:531
-#, fuzzy
-msgid "Month"
-msgstr "Fuentes"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:535
-#, fuzzy
-msgid "Year"
-msgstr "Cabecera"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:682
-msgid "Create a new appointment"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-msgid "Print this calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-#, fuzzy
-msgid "Prev"
-msgstr "Vista previa:"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:553
-#, fuzzy
-msgid "Today"
-msgstr "Cuerpo"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Next"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr ""
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-msgid "New Ca_lendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:663
-msgid "Open Ca_lendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:664
-msgid "Open a calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-msgid "Save Calendar As"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:682
-#, fuzzy
-msgid "_New appointment..."
-msgstr "C_ita"
-
-#: calendar/gui/calendar-commands.c:687
-msgid "New appointment for _today..."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:688
-msgid "Create a new appointment for today"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:696 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/calendar-commands.c:704
-msgid "About Calendar"
-msgstr ""
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:746
-#, c-format
-msgid "%s%s"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:746
-msgid "'s calendar"
-msgstr ""
-
-#: calendar/gui/control-factory.c:136
-#, fuzzy
-msgid "The URI that the calendar will display"
-msgstr "La URI que mostrará el visor de carpetas"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1070
-#, fuzzy
-msgid "Snooze"
-msgstr "Tamaño"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-#, fuzzy
-msgid "Edit appointment"
-msgstr "C_ita"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr ""
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-#, fuzzy
-msgid "New appointment..."
-msgstr "C_ita"
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-#, fuzzy
-msgid "Delete this appointment"
-msgstr "Borrar este mensaje"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-#, fuzzy
-msgid "Delete this occurrence"
-msgstr "Borrar este mensaje"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr ""
-
-#: calendar/gui/event-editor.c:291
-#, fuzzy
-msgid "Edit Appointment"
-msgstr "C_ita"
-
-#: calendar/gui/event-editor.c:296
-msgid "No summary"
-msgstr ""
-
-#: calendar/gui/event-editor.c:300
-#, fuzzy, c-format
-msgid "Appointment - %s"
-msgstr "C_ita"
-
-#: calendar/gui/event-editor.c:303
-#, c-format
-msgid "Task - %s"
-msgstr ""
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Journal entry - %s"
-msgstr ""
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:622 calendar/gui/event-editor.c:718
-msgid "?"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1198
-#, fuzzy
-msgid "FIXME: _Delete"
-msgstr "Borrar"
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Ca_lendar..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1300
-msgid "FIXME: Chec_k Names"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1301
-msgid "FIXME: Address _Book..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1308
-#, fuzzy
-msgid "FIXME: _New Appointment"
-msgstr "C_ita"
-
-#: calendar/gui/event-editor.c:1310
-msgid "FIXME: Rec_urrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1312
-#, fuzzy
-msgid "FIXME: Invite _Attendees..."
-msgstr "Incluir adjunto..."
-
-#: calendar/gui/event-editor.c:1313
-msgid "FIXME: C_ancel Invitation..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1315
-msgid "FIXME: Forward as v_Calendar"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1370
-msgid "FIXME: Save and Close"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1375
-msgid "FIXME: Print..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1380
-msgid "FIXME: Recurrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1381
-msgid "Configure recurrence rules"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1383
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1384
-msgid "Invite attendees to a meeting"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1386
-#, fuzzy
-msgid "FIXME: Delete"
-msgstr "Borrar"
-
-#: calendar/gui/event-editor.c:1828
-msgid "%a %b %d %Y"
-msgstr ""
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr ""
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr ""
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr ""
-
-#: calendar/gui/getdate.y:394
-#, fuzzy
-msgid "april"
-msgstr "Papel"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr ""
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr ""
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr ""
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr ""
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr ""
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr ""
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr ""
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr ""
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr ""
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr ""
-
-#: calendar/gui/getdate.y:405
-#, fuzzy
-msgid "monday"
-msgstr "Cuerpo"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:407
-#, fuzzy
-msgid "tues"
-msgstr "Notas:"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr ""
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr ""
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr ""
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr ""
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr ""
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr ""
-
-#: calendar/gui/getdate.y:420
-#, fuzzy
-msgid "year"
-msgstr "Cabecera"
-
-#: calendar/gui/getdate.y:421
-#, fuzzy
-msgid "month"
-msgstr "Fuentes"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr ""
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr ""
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr ""
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr ""
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr ""
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr ""
-
-#: calendar/gui/getdate.y:428
-#, fuzzy
-msgid "second"
-msgstr "Enviar"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr ""
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr ""
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr ""
-
-#: calendar/gui/getdate.y:437
-#, fuzzy
-msgid "today"
-msgstr "Cuerpo"
-
-#: calendar/gui/getdate.y:438
-#, fuzzy
-msgid "now"
-msgstr "window1"
-
-#: calendar/gui/getdate.y:439
-#, fuzzy
-msgid "last"
-msgstr "Pegar"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr ""
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr ""
-
-#: calendar/gui/getdate.y:442
-#, fuzzy
-msgid "first"
-msgstr "_Primero:"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr ""
-
-#: calendar/gui/getdate.y:445
-#, fuzzy
-msgid "fourth"
-msgstr "Ordenar"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr ""
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr ""
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:449
-#, fuzzy
-msgid "eighth"
-msgstr "Alto:"
-
-#: calendar/gui/getdate.y:450
-#, fuzzy
-msgid "ninth"
-msgstr "Imprimir"
-
-#: calendar/gui/getdate.y:451
-#, fuzzy
-msgid "tenth"
-msgstr "Enviado"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr ""
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Create to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Edit to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:176
-msgid "Summary:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:186
-#, fuzzy
-msgid "Due Date:"
-msgstr "Departamento:"
-
-#: calendar/gui/gncal-todo.c:195
-#, fuzzy
-msgid "Priority:"
-msgstr "Prioridad"
-
-#: calendar/gui/gncal-todo.c:212
-msgid "Item Comments:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:334
-msgid "Add to-do item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:335
-msgid "Edit this item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:434
-msgid "Summary"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:435 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:436 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr "Prioridad"
-
-#: calendar/gui/gncal-todo.c:437
-msgid "Time Left"
-msgstr ""
-
-#. Label
-#: calendar/gui/gncal-todo.c:449
-#, fuzzy
-msgid "To-do list"
-msgstr "_Herramientas"
-
-#. Add
-#: calendar/gui/gncal-todo.c:488
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Añadir..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:497
-#, fuzzy
-msgid "Edit..."
-msgstr "Añadir..."
-
-#: calendar/gui/gncal-todo.c:721
-msgid "Weeks"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Days"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hours"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hour"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minutes"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minute"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-#, fuzzy
-msgid "Seconds"
-msgstr "Secciones:"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-#, fuzzy
-msgid "Second"
-msgstr "Enviar"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1078
-#: calendar/gui/gnome-cal.c:1134
-msgid "Reminder of your appointment at "
-msgstr ""
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1083 calendar/gui/gnome-cal.c:1138
-msgid "Ok"
-msgstr ""
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr ""
-
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr ""
-
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr ""
-
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr ""
-
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr ""
-
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr ""
-
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr ""
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr ""
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr ""
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr ""
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr ""
-
-#: calendar/gui/print.c:326
-#, fuzzy
-msgid "Fr"
-msgstr "De"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr ""
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr ""
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr ""
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr ""
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr ""
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr ""
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr ""
-
-#: calendar/gui/print.c:1249
-#, fuzzy
-msgid "Print Preview"
-msgstr "Vista previa:"
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr ""
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr ""
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr ""
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr ""
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr ""
-
-#: calendar/gui/prop.c:347
-#, fuzzy
-msgid "Sunday"
-msgstr "Enviar"
-
-#: calendar/gui/prop.c:348
-#, fuzzy
-msgid "Monday"
-msgstr "Cuerpo"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr ""
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr ""
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr ""
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr ""
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr ""
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr ""
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr ""
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr ""
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr ""
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr ""
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr ""
-
-#: calendar/gui/prop.c:678
-msgid "To Do List Properties"
-msgstr ""
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr ""
-
-#: calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr ""
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-#, fuzzy
-msgid "Alarm Properties"
-msgstr "Propiedades del adjunto"
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr ""
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr ""
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr ""
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-#, fuzzy
-msgid "Defaults"
-msgstr "Detalles"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut"
-msgstr "Cortar"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "Corta la selección y la coloca en el portapapeles"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy"
-msgstr "Copiar"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "Copia la selección y la coloca en el portapapeles"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste"
-msgstr "Pegar"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Pega desde el portapapeles"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "Seleccione la dirección del destinatario"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Lista de destinatarios:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Buscar..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Nombre"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr "Dirección"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Propiedades..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "A: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "label9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "label7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "label8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bytes"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Incluir adjunto"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Quitar"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Quitar los elementos seleccionados de la lista de adjuntos"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Incluir adjunto..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Adjuntar un fichero al mensaje"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "Propiedades del adjunto"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "Tipo MIME:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "Nombre del fichero:"
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr "Presione aquí para acceder a la agenda"
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "A:"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr "Escriba los destinatarios del mensaje"
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Escriba las direcciones que recivirán una copia del mensaje"
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Escriba las direcciones que recivirán una copia del mensaje sin aparecer en "
-"la lista de destinatarios del mensaje."
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr "Asunto:"
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr "Escriba el asunto del mensaje"
-
-#: composer/e-msg-composer.c:444
-#, fuzzy
-msgid "Save as..."
-msgstr "Buscar..."
-
-#: composer/e-msg-composer.c:455
-#, c-format
-msgid "Error saving file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:475
-#, c-format
-msgid "Error loading file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:494
-#, fuzzy
-msgid "Discard this message?"
-msgstr "Reenviar este mensaje"
-
-#: composer/e-msg-composer.c:511
-msgid "Open file"
-msgstr ""
-
-#: composer/e-msg-composer.c:623
-msgid "That file does not exist."
-msgstr ""
-
-#: composer/e-msg-composer.c:633
-msgid "That is not a regular file."
-msgstr ""
-
-#: composer/e-msg-composer.c:643
-msgid "That file exists but is not readable."
-msgstr ""
-
-#: composer/e-msg-composer.c:653
-msgid "That file appeared accesible but open(2) failed."
-msgstr ""
-
-#: composer/e-msg-composer.c:675
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-
-#: composer/e-msg-composer.c:696
-msgid "An error occurred while reading the file."
-msgstr ""
-
-#: composer/e-msg-composer.c:792 shell/e-shell-view-menu.c:438
-#, fuzzy
-msgid "_File"
-msgstr "Filtro"
-
-#: composer/e-msg-composer.c:798
-#, fuzzy
-msgid "_Open..."
-msgstr "_Abrir"
-
-#: composer/e-msg-composer.c:799
-msgid "Load a previously saved message"
-msgstr ""
-
-#: composer/e-msg-composer.c:807
-#, fuzzy
-msgid "_Save..."
-msgstr "Buscar..."
-
-#: composer/e-msg-composer.c:808
-#, fuzzy
-msgid "Save message"
-msgstr "Enviar un nuevo mensaje"
-
-#: composer/e-msg-composer.c:816
-#, fuzzy
-msgid "_Save as..."
-msgstr "Buscar..."
-
-#: composer/e-msg-composer.c:817
-#, fuzzy
-msgid "Save message with a different name"
-msgstr "Guardar el mensaje en una carpeta especificada"
-
-#: composer/e-msg-composer.c:825
-msgid "Save in _folder..."
-msgstr "Guardar en _carpeta..."
-
-#: composer/e-msg-composer.c:826
-msgid "Save the message in a specified folder"
-msgstr "Guardar el mensaje en una carpeta especificada"
-
-#: composer/e-msg-composer.c:835
-msgid "_Insert text file... (FIXME)"
-msgstr ""
-
-#: composer/e-msg-composer.c:836
-#, fuzzy
-msgid "Insert a file as text into the message"
-msgstr "Adjuntar un fichero al mensaje"
-
-#: composer/e-msg-composer.c:845
-#, fuzzy
-msgid "_Send"
-msgstr "Enviar"
-
-#: composer/e-msg-composer.c:846
-msgid "Send the message"
-msgstr "Enviar el mensaje"
-
-#: composer/e-msg-composer.c:856
-msgid "_Close..."
-msgstr ""
-
-#: composer/e-msg-composer.c:857
-msgid "Quit the message composer"
-msgstr ""
-
-#: composer/e-msg-composer.c:870 shell/e-shell-view-menu.c:480
-#, fuzzy
-msgid "_Edit"
-msgstr "Añadir..."
-
-#: composer/e-msg-composer.c:881
-#, fuzzy
-msgid "_Format"
-msgstr "Formatear"
-
-#: composer/e-msg-composer.c:887
-msgid "HTML"
-msgstr ""
-
-#: composer/e-msg-composer.c:888
-msgid "Send the mail in HTML format"
-msgstr ""
-
-#: composer/e-msg-composer.c:901 shell/e-shell-view-menu.c:387
-#: shell/e-shell-view-menu.c:491
-#, fuzzy
-msgid "_View"
-msgstr "Correo _nuevo"
-
-#: composer/e-msg-composer.c:907
-#, fuzzy
-msgid "Show _attachments"
-msgstr "Ver _adjuntos"
-
-#: composer/e-msg-composer.c:908
-#, fuzzy
-msgid "Show/hide attachments"
-msgstr "Ver/ocultar adjuntos"
-
-#: composer/e-msg-composer.c:941
-msgid "Send"
-msgstr "Enviar"
-
-#: composer/e-msg-composer.c:942
-msgid "Send this message"
-msgstr "Enviar este mensaje"
-
-#: composer/e-msg-composer.c:951
-msgid "Attach"
-msgstr "Adjuntar"
-
-#: composer/e-msg-composer.c:952
-msgid "Attach a file"
-msgstr "Adjuntar un fichero"
-
-#: composer/e-msg-composer.c:1139
-#, fuzzy
-msgid "Compose a message"
-msgstr "Compone un nuevo mensaje de correo"
-
-#: mail/component-factory.c:188
-#, fuzzy
-msgid "Cannot initialize Evolution's mail component."
-msgstr "No pued inicializar la shell de Evolution."
-
-#: mail/folder-browser-factory.c:23
-msgid "Get mail"
-msgstr "Correo nuevo"
-
-#: mail/folder-browser-factory.c:23
-msgid "Check for new mail"
-msgstr "Comprobar correo"
-
-#: mail/folder-browser-factory.c:24
-msgid "Compose"
-msgstr ""
-
-#: mail/folder-browser-factory.c:24
-#, fuzzy
-msgid "Compose a new message"
-msgstr "Compone un nuevo mensaje de correo"
-
-#: mail/folder-browser-factory.c:28
-msgid "Reply"
-msgstr "Responder"
-
-#: mail/folder-browser-factory.c:28
-msgid "Reply to the sender of this message"
-msgstr "Responder al remitente de este mensaje"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to All"
-msgstr "Responder a todos"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to all recipients of this message"
-msgstr "Responder a todos los destinatarios de este mensaje"
-
-#: mail/folder-browser-factory.c:31
-msgid "Forward"
-msgstr "Reenviar"
-
-#: mail/folder-browser-factory.c:31
-msgid "Forward this message"
-msgstr "Reenviar este mensaje"
-
-#: mail/folder-browser-factory.c:35
-#, fuzzy
-msgid "Move"
-msgstr "_Movil"
-
-#: mail/folder-browser-factory.c:35
-#, fuzzy
-msgid "Move message to a new folder"
-msgstr "Guardar el mensaje en una carpeta especificada"
-
-#: mail/folder-browser-factory.c:37
-msgid "Print the selected message"
-msgstr "Imprimir el mensaje seleccionado"
-
-#: mail/folder-browser-factory.c:39
-msgid "Delete this message"
-msgstr "Borrar este mensaje"
-
-#: mail/folder-browser-factory.c:59
-msgid "_Threaded Message List"
-msgstr ""
-
-#: mail/folder-browser-factory.c:72
-msgid "_Mark all messages seen"
-msgstr ""
-
-#: mail/folder-browser-factory.c:78
-msgid "_Expunge"
-msgstr "_Comprimir"
-
-#: mail/folder-browser-factory.c:84
-#, fuzzy
-msgid "Mail _Filters ..."
-msgstr "Asistente para _filtros"
-
-#: mail/folder-browser-factory.c:90
-#, fuzzy
-msgid "_vFolder Editor ..."
-msgstr "Asistente para _filtros"
-
-#: mail/folder-browser-factory.c:96
-msgid "_Mail Configuration ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:102
-msgid "Forget _Passwords"
-msgstr ""
-
-#: mail/mail-config.c:688
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-
-#: mail/mail-config.c:701
-#, fuzzy
-msgid "Full name:"
-msgstr "Nombre del fichero:"
-
-#: mail/mail-config.c:725
-#, fuzzy
-msgid "Email address:"
-msgstr "Dirección de la página web:"
-
-#: mail/mail-config.c:740
-#, fuzzy
-msgid "Organization:"
-msgstr "Orientación"
-
-#: mail/mail-config.c:751
-msgid "Signature file:"
-msgstr ""
-
-#: mail/mail-config.c:756
-msgid "Signature File"
-msgstr ""
-
-#: mail/mail-config.c:1167
-#, fuzzy
-msgid "Server:"
-msgstr "Servidor LDAP:"
-
-#: mail/mail-config.c:1173
-#, fuzzy
-msgid "Username:"
-msgstr "Nombre del fichero:"
-
-#: mail/mail-config.c:1179
-#, fuzzy
-msgid "Path:"
-msgstr "Pegar"
-
-#: mail/mail-config.c:1187
-#, fuzzy
-msgid "Authentication:"
-msgstr "Orientación"
-
-#: mail/mail-config.c:1199
-msgid "Detect supported types..."
-msgstr ""
-
-#: mail/mail-config.c:1222
-msgid "Test Settings"
-msgstr ""
-
-#: mail/mail-config.c:1344 mail/mail-config.c:1392
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:1368
-msgid ""
-"Select the kind of news server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:1434
-msgid "Edit Identity"
-msgstr ""
-
-#: mail/mail-config.c:1436
-msgid "Add Identity"
-msgstr ""
-
-#: mail/mail-config.c:1515
-msgid "Edit Source"
-msgstr ""
-
-#: mail/mail-config.c:1517
-msgid "Add Source"
-msgstr ""
-
-#: mail/mail-config.c:1598
-msgid "Edit News Server"
-msgstr ""
-
-#: mail/mail-config.c:1600
-msgid "Add News Server"
-msgstr ""
-
-#: mail/mail-ops.c:393
-#, fuzzy
-msgid "Fetching mail"
-msgstr "Correo nuevo"
-
-#: mail/mail-ops.c:405
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-
-#: mail/mail-ops.c:791
-#, fuzzy
-msgid "Move message(s) to"
-msgstr "Buscar mensajes"
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr ""
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr ""
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr ""
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr ""
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr ""
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr ""
-
-#: mail/message-list.c:456
-msgid "Online Status"
-msgstr ""
-
-#: mail/message-list.c:492
-msgid "From"
-msgstr "De"
-
-#: mail/message-list.c:499
-msgid "Subject"
-msgstr "Asunto"
-
-#: mail/message-list.c:506
-#, fuzzy
-msgid "Date"
-msgstr "Pegar"
-
-#: mail/message-list.c:513
-#, fuzzy
-msgid "Received"
-msgstr "Recivido"
-
-#: mail/message-list.c:520
-msgid "To"
-msgstr "A"
-
-#: mail/message-list.c:527
-msgid "Size"
-msgstr "Tamaño"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr ""
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr ""
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr ""
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, fuzzy, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr "Guardar el mensaje en una carpeta especificada"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:95
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:236
-#, fuzzy
-msgid "New..."
-msgstr "Correo _nuevo"
-
-#: shell/e-shell-folder-title-bar.c:459 shell/e-shell-folder-title-bar.c:460
-msgid "(Untitled)"
-msgstr ""
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "No se ha encontrado a bug buddy en su $PATH."
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "No se ha podido ejecutar bug buddy"
-
-#: shell/e-shell-view-menu.c:164
-msgid "Evolution"
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:166
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:168
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution es un conjunto de applicaciones de\n"
-"groupware para manejar el correo, el calendario y la\n"
-"lista de contactos en el entorno del escritorio GNOME."
-
-#: shell/e-shell-view-menu.c:324
-#, fuzzy
-msgid "Go to folder..."
-msgstr "Guardar en _carpeta..."
-
-#: shell/e-shell-view-menu.c:381
-msgid "_New"
-msgstr "Correo _nuevo"
-
-#: shell/e-shell-view-menu.c:393
-msgid "_Folder"
-msgstr "_Carpeta"
-
-#: shell/e-shell-view-menu.c:399
-#, fuzzy
-msgid "Evolution bar _shortcut"
-msgstr "_Barra de atajos de Evolution"
-
-#: shell/e-shell-view-menu.c:408
-#, fuzzy
-msgid "_Mail message (FIXME)"
-msgstr "_Mensaje de correo"
-
-#: shell/e-shell-view-menu.c:414
-#, fuzzy
-msgid "_Appointment (FIXME)"
-msgstr "C_ita"
-
-#: shell/e-shell-view-menu.c:420
-#, fuzzy
-msgid "_Contact (FIXME)"
-msgstr "C_ontacto"
-
-#: shell/e-shell-view-menu.c:426
-msgid "_Task (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:448
-#, fuzzy
-msgid "_Go to folder..."
-msgstr "Guardar en _carpeta..."
-
-#: shell/e-shell-view-menu.c:449
-msgid "Display a different folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:456
-#, fuzzy
-msgid "_Create new folder..."
-msgstr "Guardar en _carpeta..."
-
-#: shell/e-shell-view-menu.c:457 shell/e-shell-view-menu.c:467
-msgid "Create a new folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:466
-#, fuzzy
-msgid "E_xit..."
-msgstr "Añadir..."
-
-#: shell/e-shell-view-menu.c:497
-#, fuzzy
-msgid "Show _shortcut bar"
-msgstr "_Ocultar la barra de atajos"
-
-#: shell/e-shell-view-menu.c:498
-#, fuzzy
-msgid "Show the shortcut bar"
-msgstr "Oculta la barra de atajos"
-
-#: shell/e-shell-view-menu.c:503
-#, fuzzy
-msgid "Show _folder bar"
-msgstr "_Ocultar la barra de atajos"
-
-#: shell/e-shell-view-menu.c:504
-#, fuzzy
-msgid "Show the folder bar"
-msgstr "Oculta la barra de atajos"
-
-#: shell/e-shell-view-menu.c:526
-msgid "_Actions"
-msgstr "_Acciones"
-
-#: shell/e-shell-view-menu.c:537
-#, fuzzy
-msgid "_Help"
-msgstr "_Casa"
-
-#: shell/e-shell-view-menu.c:543
-msgid "Help _index"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:550
-#, fuzzy
-msgid "Getting _started"
-msgstr "_Petición de reunión"
-
-#: shell/e-shell-view-menu.c:557
-msgid "Using the _mailer"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:564
-msgid "Using the _calendar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:571
-msgid "Using the c_ontact manager"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:581
-#, fuzzy
-msgid "_Submit bug report"
-msgstr "_Enviar un reporte de error"
-
-#: shell/e-shell-view-menu.c:582
-#, fuzzy
-msgid "Submit bug report using Bug Buddy"
-msgstr "Enviar un reporte de error a traves de bug-buddy"
-
-#: shell/e-shell-view-menu.c:591
-#, fuzzy
-msgid "_About Evolution..."
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:592
-msgid "Show information about Evolution"
-msgstr ""
-
-#: shell/e-shell-view.c:114
-msgid "(No folder displayed)"
-msgstr ""
-
-#: shell/e-shell-view.c:342
-#, fuzzy
-msgid "Folders"
-msgstr "_Carpeta"
-
-#: shell/e-shell-view.c:734
-#, fuzzy
-msgid "None"
-msgstr "_Nota"
-
-#: shell/e-shell-view.c:738
-#, fuzzy, c-format
-msgid "Evolution - %s"
-msgstr "Evolution"
-
-#: shell/e-shell.c:293
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "No puedo configurar una carpeta local -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:236
-#, fuzzy
-msgid "Show the shortcuts as small icons"
-msgstr "Oculta la barra de atajos"
-
-#: shell/e-shortcuts-view.c:238
-#, fuzzy
-msgid "_Large icons"
-msgstr "Margenes"
-
-#: shell/e-shortcuts-view.c:239
-#, fuzzy
-msgid "Show the shortcuts as large icons"
-msgstr "Oculta la barra de atajos"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr ""
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr ""
-
-#: shell/e-storage.c:217
-#, fuzzy
-msgid "(No name)"
-msgstr "Nombre"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr ""
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr ""
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr ""
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr ""
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr ""
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr ""
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr ""
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr ""
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr ""
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr ""
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr ""
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr ""
-
-#: shell/main.c:66
-#, fuzzy
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Hola. Gracias por tomarse la molestia de descargar esta liberación de "
-"prueba\n"
-"de la suit de groupware Evolution.\n"
-"\n"
-"El equipo de Evolution ha trabajado duro para hacer Evolution tan robusto,\n"
-"extensible, bonito, rápido y adecuado para los usuarios de internet como a\n"
-"sido posible. Y estamos muy cansados. Pero no hemos acabado -- todavia "
-"no.\n"
-"\n"
-"Mientras esplora Evolution, por favor comprenda que la mayoria de nuestro\n"
-"trabajo se ha centrado en el motor que maneja todo el sistema y no en la\n"
-"interfaz de usuario. Ahora estamos empezando a coronar la colina, y desde\n"
-"ahora vamos a poner todo nuestro cariño y atención a la interfaz de usuario\n"
-"Por lo menos sabe que no está usando un software de demostración.\n"
-"\n"
-"Asi que, es hora para las escusas. Evolution: se rompera, perderá su "
-"correo\n"
-"dejará procesos corriendo, consumirá el 100% de la CPU, se bloqueará,\n"
-"enviará correo en formato HTML a listas de correo al azar, y le pondrá en\n"
-"situación embarazosa delante de sus amigos y compañeros de trabajo. Uselo\n"
-"asumiendo usted las consecuencias.\n"
-"\n"
-"Esperamos que le gusten los resultados de nuestro duro trabajo, y "
-"¡esperamos\n"
-"contribuciones!\n"
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Gracias\n"
-"El equipo de Evolution\n"
-
-#: shell/main.c:128
-msgid "Cannot initialize the Evolution shell."
-msgstr "No pued inicializar la shell de Evolution."
-
-#: shell/main.c:166
-#, fuzzy
-msgid "Cannot initialize the configuration system."
-msgstr "No pued inicializar la shell de Evolution."
-
-#: shell/main.c:172
-msgid "Cannot initialize the Bonobo component system."
-msgstr "No puedo inicializar el sistema de componentes Bonobo."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Campos"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "Agrupando"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Ordenar"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Filtro"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-#, fuzzy
-msgid "Field Chooser"
-msgstr "Campos"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "window1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "Campos disponibles"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "label1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "Mostrar en este orden"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "label2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Añadir >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Quitar"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-#, fuzzy
-msgid "Tentative"
-msgstr "Orientación"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-#, fuzzy
-msgid "Out of Office"
-msgstr "Oficina:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-#, fuzzy
-msgid "_Options"
-msgstr "Opciones"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-#, fuzzy
-msgid "Meeting _start time:"
-msgstr "_Petición de reunión"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-#, fuzzy
-msgid "Meeting _end time:"
-msgstr "_Petición de reunión"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr ""
-
-#: widgets/misc/e-clipped-label.c:106
-#, fuzzy
-msgid "..."
-msgstr "Añadir..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, fuzzy, c-format
-msgid "Group %i"
-msgstr "Agrupando"
-
-#, fuzzy
-#~ msgid "No description"
-#~ msgstr "Descripción:"
-
-#, fuzzy
-#~ msgid "_Mail"
-#~ msgstr "_Movil"
-
-#, fuzzy
-#~ msgid "Pri_vate"
-#~ msgstr "Pegar"
-
-#, fuzzy
-#~ msgid "Daily"
-#~ msgstr "Detalles"
-
-#, fuzzy
-#~ msgid "label23"
-#~ msgstr "label2"
-
-#, fuzzy
-#~ msgid "label24"
-#~ msgstr "label2"
-
-#, fuzzy
-#~ msgid "label25"
-#~ msgstr "label2"
-
-#, fuzzy
-#~ msgid "month(s)"
-#~ msgstr "Fuentes"
-
-#, fuzzy
-#~ msgid "label27"
-#~ msgstr "label7"
-
-#, fuzzy
-#~ msgid "Exceptions"
-#~ msgstr "Opciones"
-
-#, fuzzy
-#~ msgid "Change"
-#~ msgstr "Oscureciendo"
-
-#~ msgid "Cut selected region into the clipboard"
-#~ msgstr "Corta la región seleccionada y la coloca en el portapapeles"
-
-#~ msgid "Copy selected region into the clipboard"
-#~ msgstr "Copia la región seleccionada y la coloca en el portapapeles"
-
-#~ msgid "Undo"
-#~ msgstr "Deshacer"
-
-#~ msgid "Undo last operation"
-#~ msgstr "Deshacer la ultima operación"
-
-#, fuzzy
-#~ msgid "Edit Filter"
-#~ msgstr "Filtro"
-
-#, fuzzy
-#~ msgid "Finish"
-#~ msgstr "Buscar"
-
-#, fuzzy
-#~ msgid "Apply"
-#~ msgstr "Responder"
-
-#, fuzzy
-#~ msgid "Refile"
-#~ msgstr "Recivido"
-
-#~ msgid "Mail Component: I could not initialize Bonobo"
-#~ msgstr "Componenete de correo: No pude inicializar Bonobo"
-
-#~ msgid "Composes a new mail message"
-#~ msgstr "Compone un nuevo mensaje de correo"
-
-#, fuzzy
-#~ msgid "Task _Request (FIXME)"
-#~ msgstr "P_etición de tarea"
-
-#~ msgid "We are sorry, Evolution's Folder Browser can not be initialized."
-#~ msgstr ""
-#~ "Lo sentimos, el visor de carpetas de Evolution no ha podido ser inicializado"
-
-#~ msgid "Whether a message preview should be shown"
-#~ msgstr "Si debe ser mostrada una vista previa del mensaje"
-
-#~ msgid "_Task"
-#~ msgstr "_Tarea"
-
-#~ msgid "_Selected Items"
-#~ msgstr "_Seleccionar elementos"
-
-#~ msgid "_New Folder"
-#~ msgstr "_Nueva carpeta"
-
-#~ msgid "Clos_e All Items"
-#~ msgstr "_Cerrar todos los elementos"
-
-#~ msgid "Closes all the open items"
-#~ msgstr "Cerrar todos los elementos abiertos"
diff --git a/po/flu-danish b/po/flu-danish
deleted file mode 100644
index 51953e5980..0000000000
--- a/po/flu-danish
+++ /dev/null
@@ -1,114 +0,0 @@
-#~ msgid "A folder containing mail items"
-#~ msgstr "En mappe som indeholder e-post ting"
-
-#~ msgid "A folder containing contacts"
-#~ msgstr "En mappe med kontakter"
-
-#~ msgid "A folder containing calendar entries"
-#~ msgstr "En mappe med kalenderting"
-
-#~ msgid "A folder containing tasks"
-#~ msgstr "En mappe med opgaver"
-
-#~ msgid "Evolution can not create its local folders"
-#~ msgstr "Evolution kan ikke oprette sine lokale mapper"
-
-#~ msgid "Large Icons"
-#~ msgstr "Store ikoner"
-
-#~ msgid "Small Icons"
-#~ msgstr "Små ikoner"
-
-#~ msgid "Add New Group"
-#~ msgstr "Tilføj ny gruppe"
-
-#~ msgid "Remove Group"
-#~ msgstr "Fjern gruppe"
-
-#~ msgid "Rename Group"
-#~ msgstr "Omdøb gruppe"
-
-#~ msgid "Add Shortcut"
-#~ msgstr "Tilføj genvej"
-
-#~ msgid "Open Folder"
-#~ msgstr "Åbn mappe"
-
-#~ msgid "Open in New Window"
-#~ msgstr "Åbn i et nyt vindue"
-
-#~ msgid "Advanced Find"
-#~ msgstr "Avanceret søgning"
-
-#~ msgid "Remove From Shortcut Bar"
-#~ msgstr "Fjern fra genvejslinjen"
-
-#~ msgid "Rename Shortcut"
-#~ msgstr "Omdøb genvej"
-
-#~ msgid "Properties"
-#~ msgstr "Egenskaber"
-
-#~ msgid "Today"
-#~ msgstr "I dag"
-
-#~ msgid "Executive Summary"
-#~ msgstr "Oversigt"
-
-#~ msgid "Inbox"
-#~ msgstr "Indboks"
-
-#~ msgid "New mail messages"
-#~ msgstr "Nye e-post meddelelser"
-
-#~ msgid "Sent messages"
-#~ msgstr "Sendte meddelelser"
-
-#~ msgid "Sent mail messages"
-#~ msgstr "Sendte e-post meddelelser"
-
-#~ msgid "Drafts"
-#~ msgstr "Kladder"
-
-#~ msgid "Draft mail messages"
-#~ msgstr "E-post-kladder"
-
-#~ msgid "Calendar"
-#~ msgstr "Kalender"
-
-#~ msgid "Your calendar"
-#~ msgstr "Din kalender"
-
-#~ msgid "Contacts"
-#~ msgstr "Kontakter"
-
-#~ msgid "Your contacts list"
-#~ msgstr "Din kontaktliste"
-
-#~ msgid "Tasks"
-#~ msgstr "Opgaver"
-
-#~ msgid "Tasks list"
-#~ msgstr "Opgaveliste"
-
-#~ msgid "Main Shortcuts"
-#~ msgstr "Hovedgenveje"
-
-#~ msgid "Other Shortcuts"
-#~ msgstr "Andre genveje"
-
-#~ msgid "New group"
-#~ msgstr "Ny gruppe"
-
-#~ msgid "Enables some debugging functions"
-#~ msgstr "Aktivér fejlsøgningsfunktioner"
-
-#~ msgid "LEVEL"
-#~ msgstr "LEVEL"
-
-#~ msgid ""
-#~ "It was not possible to setup the Evolution startup files. Please\n"
-#~ "fix the problem, and restart Evolution"
-#~ msgstr ""
-#~ "Det var ikke muligt at sætte Evolutions opstartsfiler op. Venligst\n"
-#~ "ret problemet, og genstart Evolution"
diff --git a/po/fr.po b/po/fr.po
deleted file mode 100644
index 198e481b17..0000000000
--- a/po/fr.po
+++ /dev/null
@@ -1,3501 +0,0 @@
-# evolution fr.po
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Vincent Renardias <vincent@debian.org>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution VERSION\n"
-"POT-Creation-Date: 2000-07-10 21:51-0400\n"
-"PO-Revision-Date: 2000-04-18 17:50+0200\n"
-"Last-Translator: Vincent Renardias <vincent@debian.org>\n"
-"Language-Team: GNOME French Team <gnomefr@gnomefr.traduc.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:58
-#: calendar/gui/calendar-pilot-sync.c:138 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Impossible d'initialiser Bonobo"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "catégories"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "Catégories disponibles : "
-
-#: addressbook/contact-editor/e-contact-editor.c:579
-#: calendar/gui/event-editor.c:1118
-msgid "FIXME: _Appointment"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:580
-#: calendar/gui/event-editor.c:1119
-msgid "FIXME: Meeting Re_quest"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:582
-#: calendar/gui/event-editor.c:1121
-msgid "FIXME: _Mail Message"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:583
-#: calendar/gui/event-editor.c:1122
-msgid "FIXME: _Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:584
-#: calendar/gui/event-editor.c:1123
-msgid "FIXME: _Task"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:585
-#: calendar/gui/event-editor.c:1124
-msgid "FIXME: Task _Request"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:586
-#: calendar/gui/event-editor.c:1125
-msgid "FIXME: _Journal Entry"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:587
-#: calendar/gui/event-editor.c:1126
-msgid "FIXME: _Note"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:589
-#: addressbook/contact-editor/e-contact-editor.c:694
-#: calendar/gui/event-editor.c:1128 calendar/gui/event-editor.c:1235
-msgid "FIXME: Ch_oose Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:594
-#: calendar/gui/event-editor.c:1133
-msgid "FIXME: _Memo Style"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:596
-#: calendar/gui/event-editor.c:1135
-msgid "FIXME: Define Print _Styles..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:603
-#: calendar/gui/event-editor.c:1142
-msgid "FIXME: S_end"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:607
-#: calendar/gui/event-editor.c:1146
-#, fuzzy
-msgid "FIXME: Save Attac_hments..."
-msgstr "Ajouter attachement..."
-
-#: addressbook/contact-editor/e-contact-editor.c:609
-#: calendar/gui/event-editor.c:1148
-msgid "FIXME: _Delete"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:610
-#: calendar/gui/event-editor.c:1149
-msgid "FIXME: _Move to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:611
-#: calendar/gui/event-editor.c:1150
-msgid "FIXME: Cop_y to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:613
-#: calendar/gui/event-editor.c:1152
-msgid "Page Set_up"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:614
-#: calendar/gui/event-editor.c:1153
-msgid "FIXME: Print Pre_view"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:635
-#: calendar/gui/event-editor.c:1174
-msgid "FIXME: Paste _Special..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:640
-#: calendar/gui/event-editor.c:1179
-msgid "FIXME: Mark as U_nread"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1183
-msgid "_Object"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: addressbook/contact-editor/e-contact-editor.c:656
-#: calendar/gui/event-editor.c:1188 calendar/gui/event-editor.c:1195
-msgid "FIXME: _Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: addressbook/contact-editor/e-contact-editor.c:657
-#: calendar/gui/event-editor.c:1189 calendar/gui/event-editor.c:1196
-msgid "FIXME: _Unread Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1190
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1197
-msgid "FIXME: _Last Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:663
-#: calendar/gui/event-editor.c:1202
-msgid "FIXME: _Standard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:665
-#: calendar/gui/event-editor.c:1204
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:668
-#: calendar/gui/event-editor.c:1207
-msgid "FIXME: _Customize..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:673
-#: calendar/gui/event-editor.c:1212
-msgid "Pre_vious"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1213
-msgid "Ne_xt"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:676
-#: calendar/gui/event-editor.c:1217
-msgid "_Toolbars"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:681
-#: calendar/gui/event-editor.c:1222
-msgid "FIXME: _File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:682
-#: calendar/gui/event-editor.c:1223
-msgid "FIXME: It_em..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:683
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: _Object..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:688
-#: calendar/gui/event-editor.c:1229
-msgid "FIXME: _Font..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:689
-#: calendar/gui/event-editor.c:1230
-msgid "FIXME: _Paragraph..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:696
-#: calendar/gui/event-editor.c:1237
-msgid "FIXME: Desi_gn This Form"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:697
-#: calendar/gui/event-editor.c:1238
-msgid "FIXME: D_esign a Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Publish _Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:700
-#: calendar/gui/event-editor.c:1241
-msgid "FIXME: Pu_blish Form As..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:702
-#: calendar/gui/event-editor.c:1243
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:707
-#: calendar/gui/event-editor.c:1248
-msgid "FIXME: _Spelling..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:709
-#: calendar/gui/event-editor.c:1253
-msgid "_Forms"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-msgid "FIXME: _New Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-msgid "FIXME: New _Contact from Same Company"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:717
-msgid "FIXME: New _Letter to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:718
-msgid "FIXME: New _Message to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:719
-msgid "FIXME: New Meetin_g with Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:720
-msgid "FIXME: _Plan a Meeting..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:721
-msgid "FIXME: New _Task for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:724
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:725
-msgid "FIXME: _Display Map of Address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:726
-msgid "FIXME: _Open Web Page"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:728
-msgid "FIXME: Forward as _vCard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1266
-msgid "FIXME: For_ward"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:741
-#: calendar/gui/event-editor.c:1279
-msgid "_Insert"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:742
-#: calendar/gui/event-editor.c:1280
-msgid "F_ormat"
-msgstr ""
-
-#. FIXME: add Favorites here
-#: addressbook/contact-editor/e-contact-editor.c:743
-#: calendar/gui/event-editor.c:1281 shell/e-shell-view-menu.c:473
-msgid "_Tools"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:744
-#: calendar/gui/event-editor.c:1282
-msgid "Actio_ns"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:775
-msgid "Save and Close"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:776
-#: calendar/gui/event-editor.c:1321
-msgid "Save the appointment and close the dialog box"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:780
-#: calendar/gui/event-editor.c:1325
-msgid "FIXME: Print..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-#: calendar/gui/event-editor.c:1326
-msgid "Print this item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-#: calendar/gui/event-editor.c:1327
-msgid "FIXME: Insert File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-#: calendar/gui/event-editor.c:1328
-msgid "Insert a file as an attachment"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-#: calendar/gui/event-editor.c:1336
-msgid "FIXME: Delete"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-#: calendar/gui/event-editor.c:1337 calendar/gui/gncal-todo.c:326
-msgid "Delete this item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-#: calendar/gui/event-editor.c:1339
-msgid "FIXME: Previous"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-#: calendar/gui/event-editor.c:1340
-msgid "Go to the previous item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-#: calendar/gui/event-editor.c:1341
-msgid "FIXME: Next"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:791
-#: calendar/gui/event-editor.c:1342
-msgid "Go to the next item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-#: calendar/gui/event-editor.c:1343
-msgid "FIXME: Help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1344
-msgid "See online help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1208
-msgid "Assistant"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1209
-#: addressbook/contact-editor/e-contact-editor.c:1313
-msgid "Business"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1210
-msgid "Business 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1211
-msgid "Business Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1212
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1213
-msgid "Car"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1214
-#, fuzzy
-msgid "Company"
-msgstr "Copier"
-
-#: addressbook/contact-editor/e-contact-editor.c:1215
-#: addressbook/contact-editor/e-contact-editor.c:1314
-msgid "Home"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1216
-msgid "Home 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1217
-msgid "Home Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1218
-msgid "ISDN"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1219
-msgid "Mobile"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1220
-#: addressbook/contact-editor/e-contact-editor.c:1315
-msgid "Other"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1221
-msgid "Other Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1222
-#, fuzzy
-msgid "Pager"
-msgstr "Coller"
-
-#: addressbook/contact-editor/e-contact-editor.c:1223
-msgid "Primary"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1224
-msgid "Radio"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1225
-msgid "Telex"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1226
-msgid "TTY/TDD"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1270
-msgid "Primary Email"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1271
-msgid "Email 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1272
-msgid "Email 3"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-msgid "_Delete"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91
-msgid "Add"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-#, fuzzy
-msgid "_Company:"
-msgstr "Copier"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "General"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-msgid "Details"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:415
-#: calendar/gui/calendar-commands.c:544
-msgid "New"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:415
-msgid "Create a new contact"
-msgstr "Créer un nouveau contact"
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Find"
-msgstr "Rechercher"
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Find a contact"
-msgstr "Rechercher un contact"
-
-#: addressbook/gui/component/addressbook.c:420
-#: addressbook/gui/component/addressbook.c:487
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:43
-msgid "Print"
-msgstr "Imprimer"
-
-#: addressbook/gui/component/addressbook.c:420
-msgid "Print contacts"
-msgstr ""
-
-#. Delete
-#: addressbook/gui/component/addressbook.c:421
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:498
-#: mail/folder-browser-factory.c:45
-msgid "Delete"
-msgstr "Effacer"
-
-#: addressbook/gui/component/addressbook.c:421
-msgid "Delete a contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:494
-#: addressbook/gui/component/addressbook.c:1034
-msgid "As _Table"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:501
-msgid "_New Contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:509
-msgid "N_ew Directory Server"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:588
-msgid "Unable to open addressbook"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:593
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:938
-#: addressbook/gui/minicard/e-minicard.c:329
-msgid "Save as VCard"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1005
-msgid "* Click here to add a contact *"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1041
-msgid "As _Minicards"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1092
-msgid "The URI that the Folder Browser will display"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:98
-msgid "h"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr ""
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-#, fuzzy
-msgid "Paper"
-msgstr "Coller"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:37
-#, fuzzy
-msgid "Top:"
-msgstr "À :"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:41
-#, fuzzy
-msgid "Page"
-msgstr "Coller"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:544
-msgid "am"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:543
-msgid "pm"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Appointments:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:456
-msgid "Open calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Save calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:712
-#: calendar/gui/gncal-todo.c:716
-msgid "Day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-msgid "Show the working week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:711
-msgid "Week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Month"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:682
-msgid "Create a new appointment"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-msgid "Print this calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Prev"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Today"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554 filter/filter-editor.c:210
-msgid "Next"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr ""
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-msgid "New Ca_lendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:663
-msgid "Open Ca_lendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:664
-msgid "Open a calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-msgid "Save Calendar As"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:673
-msgid "Print..."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:682
-msgid "_New appointment..."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:687
-msgid "New appointment for _today..."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:688
-msgid "Create a new appointment for today"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:696 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/calendar-commands.c:704
-msgid "About Calendar"
-msgstr ""
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:746
-#, c-format
-msgid "%s%s"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:746
-msgid "'s calendar"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:68
-msgid "Specifies the port on which the Pilot is"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:68
-msgid "PORT"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:70
-msgid "If you want to debug the attributes on records"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:72
-msgid "Only syncs from desktop to pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:74
-msgid "Only syncs from pilot to desktop"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:97
-msgid "Can not create Pilot socket\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:104
-#, c-format
-msgid "Can not bind to device %s\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:107
-msgid "Failed to get a connection from the Pilot device"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:111
-msgid "pi_accept failed"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:211
-msgid ""
-"\tObject has been modified on desktop and on the pilot, desktop takes "
-"precedence\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:531
-msgid "No description"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:692
-msgid "Could not open DatebookDB on the Pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:693
-msgid "Unable to open DatebookDB"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:728
-msgid "Synced DateBook from Pilot to GnomeCal"
-msgstr ""
-
-#: calendar/gui/control-factory.c:136
-msgid "The URI that the calendar will display"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "Fermer"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1056
-msgid "Snooze"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr ""
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr ""
-
-#: calendar/gui/event-editor.c:289
-msgid "Edit Appointment"
-msgstr ""
-
-#: calendar/gui/event-editor.c:294
-msgid "No summary"
-msgstr ""
-
-#: calendar/gui/event-editor.c:298
-#, c-format
-msgid "Appointment - %s"
-msgstr ""
-
-#: calendar/gui/event-editor.c:301
-#, c-format
-msgid "Task - %s"
-msgstr ""
-
-#: calendar/gui/event-editor.c:304
-#, c-format
-msgid "Journal entry - %s"
-msgstr ""
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:594 calendar/gui/event-editor.c:688
-msgid "?"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1215
-msgid "FIXME: Ca_lendar..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1250
-msgid "FIXME: Chec_k Names"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1251
-msgid "FIXME: Address _Book..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1258
-msgid "FIXME: _New Appointment"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1260
-msgid "FIXME: Rec_urrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1262
-msgid "FIXME: Intive _Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1263
-msgid "FIXME: C_ancel Invitation..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Forward as v_Calendar"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1320
-msgid "FIXME: Save and Close"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1330
-msgid "FIXME: Recurrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1331
-msgid "Configure recurrence rules"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1333
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1334
-msgid "Invite attendees to a meeting"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1745
-msgid "%a %b %d %Y"
-msgstr ""
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:14 calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid "_Display"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:32
-msgid "_Audio"
-msgstr "_Audio"
-
-#: calendar/gui/event-editor-dialog.glade.h:33
-msgid "_Program"
-msgstr "_Programme"
-
-#: calendar/gui/event-editor-dialog.glade.h:34
-msgid "_Mail"
-msgstr "_Mail"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "Mail _to:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Run program:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "Classification"
-msgstr "Classification"
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "Pu_blic"
-msgstr "pu_blic"
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-msgid "Pri_vate"
-msgstr "Pri_vé"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Confidential"
-msgstr "_Confidentiel"
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr "Règle récurrente"
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:596
-msgid "None"
-msgstr "Aucune"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-msgid "Daily"
-msgstr "Journalier"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr "Hebdomadaire"
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr "Mensuel"
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr "Annuel"
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "lun"
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "mar"
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "mer"
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "jeu"
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "ven"
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "sam"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "dim"
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr "ème jour du mois"
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-msgid "month(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-msgid "Exceptions"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-#, fuzzy
-msgid "Change"
-msgstr "Coller"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr ""
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr ""
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr ""
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr ""
-
-#: calendar/gui/getdate.y:394
-#, fuzzy
-msgid "april"
-msgstr "Coller"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr ""
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr ""
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr ""
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr ""
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr ""
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr ""
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr ""
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr ""
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr ""
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr ""
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr ""
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr ""
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr ""
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr ""
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr ""
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr ""
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr ""
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr ""
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr ""
-
-#: calendar/gui/getdate.y:421
-msgid "month"
-msgstr ""
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr ""
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr ""
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr ""
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr ""
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr ""
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr ""
-
-#: calendar/gui/getdate.y:428
-msgid "second"
-msgstr ""
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr ""
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr ""
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr ""
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr ""
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr ""
-
-#: calendar/gui/getdate.y:439
-#, fuzzy
-msgid "last"
-msgstr "Coller"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr ""
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr ""
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr ""
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr ""
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr ""
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr ""
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr ""
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr ""
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr ""
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr ""
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr ""
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Create to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Edit to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:171
-msgid "Summary:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:181
-msgid "Due Date:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:190
-msgid "Priority:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:206
-msgid "Item Comments:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:324
-msgid "Add to-do item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:325
-msgid "Edit this item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:424
-msgid "Summary"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:425 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:426 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:427
-msgid "Time Left"
-msgstr ""
-
-#. Label
-#: calendar/gui/gncal-todo.c:439
-msgid "To-do list"
-msgstr ""
-
-#. Add
-#: calendar/gui/gncal-todo.c:478
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr ""
-
-#. Edit
-#: calendar/gui/gncal-todo.c:487
-msgid "Edit..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:711
-msgid "Weeks"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:712 calendar/gui/gncal-todo.c:716
-msgid "Days"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:717 calendar/gui/gncal-todo.c:721
-msgid "Hours"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:717 calendar/gui/gncal-todo.c:721
-msgid "Hour"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Minutes"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Minute"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Seconds"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Second"
-msgstr ""
-
-#: calendar/gui/gnome-cal.c:453 calendar/gui/gnome-cal.c:1064
-#: calendar/gui/gnome-cal.c:1120
-msgid "Reminder of your appointment at "
-msgstr ""
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1069 calendar/gui/gnome-cal.c:1124
-msgid "Ok"
-msgstr ""
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr ""
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr ""
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr ""
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Fr"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr ""
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr ""
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr ""
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr ""
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr ""
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr ""
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr ""
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr ""
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr ""
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr ""
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr ""
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr ""
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr ""
-
-#: calendar/gui/prop.c:347
-msgid "Sunday"
-msgstr ""
-
-#: calendar/gui/prop.c:348
-msgid "Monday"
-msgstr ""
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr ""
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr ""
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr ""
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr ""
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr ""
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr ""
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr ""
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr ""
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr ""
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr ""
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr ""
-
-#: calendar/gui/prop.c:678
-msgid "To Do List Properties"
-msgstr ""
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr ""
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-msgid "Alarm Properties"
-msgstr ""
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr ""
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr ""
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr ""
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-msgid "Defaults"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.c:183 composer/e-msg-composer.c:766
-msgid "Cut"
-msgstr "Couper"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.c:187 composer/e-msg-composer.c:767
-msgid "Copy"
-msgstr "Copier"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199 composer/e-msg-composer.c:768
-msgid "Paste"
-msgstr "Coller"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-#, fuzzy
-msgid "To: >>"
-msgstr "À :"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-#, fuzzy
-msgid "Cc: >>"
-msgstr "Cc :"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-#, fuzzy
-msgid "Bcc: >>"
-msgstr "Bcc :"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 octet"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u octets"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fKo"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fMo"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fGo"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Ajouter attachement"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:332
-msgid "Remove"
-msgstr "Enlever"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Ajouter attachement..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr ""
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr ""
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "À :"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr "Cc :"
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr "Bcc :"
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr ""
-
-#: composer/e-msg-composer.c:463
-msgid "Save as..."
-msgstr ""
-
-#: composer/e-msg-composer.c:474
-#, c-format
-msgid "Error saving file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:494
-#, c-format
-msgid "Error loading file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:513
-msgid "Discard this message?"
-msgstr ""
-
-#: composer/e-msg-composer.c:561
-msgid "Open file"
-msgstr ""
-
-#: composer/e-msg-composer.c:718
-msgid "Save in _folder..."
-msgstr ""
-
-#: composer/e-msg-composer.c:718
-msgid "Save the message in a specified folder"
-msgstr ""
-
-#: composer/e-msg-composer.c:721 composer/e-msg-composer.c:763
-msgid "Send"
-msgstr ""
-
-#: composer/e-msg-composer.c:721
-msgid "Send the message"
-msgstr ""
-
-#: composer/e-msg-composer.c:733
-msgid "View _attachments"
-msgstr ""
-
-#: composer/e-msg-composer.c:733
-msgid "View/hide attachments"
-msgstr ""
-
-#: composer/e-msg-composer.c:763
-msgid "Send this message"
-msgstr ""
-
-#: composer/e-msg-composer.c:766
-msgid "Cut selected region into the clipboard"
-msgstr ""
-
-#: composer/e-msg-composer.c:767
-msgid "Copy selected region into the clipboard"
-msgstr ""
-
-#: composer/e-msg-composer.c:768
-msgid "Paste selected region into the clipboard"
-msgstr ""
-
-#: composer/e-msg-composer.c:769
-msgid "Undo"
-msgstr ""
-
-#: composer/e-msg-composer.c:769
-msgid "Undo last operation"
-msgstr ""
-
-#: composer/e-msg-composer.c:772
-msgid "Attach"
-msgstr ""
-
-#: composer/e-msg-composer.c:772
-msgid "Attach a file"
-msgstr ""
-
-#: composer/e-msg-composer.c:948
-msgid "Compose a message"
-msgstr ""
-
-#: filter/filter-editor.c:198
-msgid "Edit Filter"
-msgstr ""
-
-#: filter/filter-editor.c:198
-msgid "Create filter"
-msgstr ""
-
-#: filter/filter-editor.c:209
-msgid "Back"
-msgstr ""
-
-#: filter/filter-editor.c:211
-msgid "Finish"
-msgstr ""
-
-#: filter/filter-editor.c:212
-msgid "Cancel"
-msgstr ""
-
-#: filter/filter-editor.c:216
-msgid "Apply"
-msgstr ""
-
-#: filter/filter-editor.c:233
-msgid ""
-"<h2>Create Filtering Rule</h2><p>Select one of the base rules above, then "
-"continue forwards to customise it.</p>"
-msgstr ""
-
-#: mail/component-factory.c:196
-msgid "Cannot initialize Evolution's mail component."
-msgstr ""
-
-#: mail/folder-browser-factory.c:29
-msgid "Get mail"
-msgstr ""
-
-#: mail/folder-browser-factory.c:29
-msgid "Check for new mail"
-msgstr ""
-
-#: mail/folder-browser-factory.c:30
-msgid "Compose"
-msgstr ""
-
-#: mail/folder-browser-factory.c:30
-msgid "Compose a new message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply"
-msgstr ""
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply to the sender of this message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to All"
-msgstr ""
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to all recipients of this message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward"
-msgstr ""
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward this message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:41
-msgid "Refile"
-msgstr ""
-
-#: mail/folder-browser-factory.c:41
-msgid "Move message to a new folder"
-msgstr ""
-
-#: mail/folder-browser-factory.c:43
-msgid "Print the selected message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:45
-msgid "Delete this message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:65
-msgid "_Threaded Message List"
-msgstr ""
-
-#: mail/folder-browser-factory.c:77
-msgid "_Expunge"
-msgstr ""
-
-#: mail/folder-browser-factory.c:83
-msgid "_Filter Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:89
-msgid "_Virtual Folder Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:95
-msgid "_Mail Configuration ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:101
-msgid "Forget _Passwords"
-msgstr ""
-
-#: mail/mail-config.c:259
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-
-#: mail/mail-config.c:274
-msgid "Full name:"
-msgstr ""
-
-#: mail/mail-config.c:302
-msgid "Email address:"
-msgstr ""
-
-#: mail/mail-config.c:325
-msgid "Organization:"
-msgstr ""
-
-#: mail/mail-config.c:337
-msgid "Signature file:"
-msgstr ""
-
-#: mail/mail-config.c:342
-msgid "Signature File"
-msgstr ""
-
-#: mail/mail-config.c:699 mail/mail-config.c:790
-msgid "Server:"
-msgstr "Serveur : "
-
-#: mail/mail-config.c:705
-msgid "Username:"
-msgstr "Nom d'utilisateur : "
-
-#: mail/mail-config.c:711
-msgid "Path:"
-msgstr "Chemin : "
-
-#: mail/mail-config.c:717 mail/mail-config.c:796
-msgid "Authentication:"
-msgstr ""
-
-#: mail/mail-config.c:729 mail/mail-config.c:808
-msgid "Detect supported types..."
-msgstr ""
-
-#: mail/mail-config.c:755 mail/mail-config.c:830
-msgid "Test these values before continuing"
-msgstr ""
-
-#: mail/mail-config.c:937
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:955
-msgid "Select the method you would like to use to deliver your mail."
-msgstr ""
-
-#: mail/mail-config.c:1129 mail/mail-config.c:1208
-msgid "Mail Configuration"
-msgstr ""
-
-#. Identity page
-#: mail/mail-config.c:1146
-msgid "Identity"
-msgstr "Identité"
-
-#. Source page
-#: mail/mail-config.c:1165
-msgid "Mail Source"
-msgstr ""
-
-#. Transport page
-#: mail/mail-config.c:1186
-msgid "Mail Transport"
-msgstr ""
-
-#: mail/mail-config.c:1308
-msgid "Edit Identity"
-msgstr ""
-
-#: mail/mail-config.c:1310
-msgid "Add Identity"
-msgstr ""
-
-#: mail/mail-config.c:1453
-msgid "Edit Source"
-msgstr "Éditer source"
-
-#: mail/mail-config.c:1455
-msgid "Add Source"
-msgstr "Ajouter source"
-
-#: mail/mail-ops.c:372
-msgid "Fetching mail"
-msgstr ""
-
-#: mail/mail-ops.c:384
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-
-#: mail/mail-ops.c:732
-msgid "Refile message(s) to"
-msgstr ""
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr ""
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr ""
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr ""
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr ""
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr ""
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr ""
-
-#: mail/main.c:62
-msgid "Mail Component: I could not initialize Bonobo"
-msgstr ""
-
-#: mail/message-list.c:460
-msgid "Online Status"
-msgstr ""
-
-#: mail/message-list.c:488
-msgid "From"
-msgstr "De"
-
-#: mail/message-list.c:495
-msgid "Subject"
-msgstr "Sujet"
-
-#: mail/message-list.c:502
-msgid "Date"
-msgstr "Date"
-
-#: mail/message-list.c:509
-msgid "Received"
-msgstr "Reçu"
-
-#: mail/message-list.c:516
-msgid "To"
-msgstr "À"
-
-#: mail/message-list.c:523
-msgid "Size"
-msgstr "Taille"
-
-#: shell/e-init.c:25
-msgid "Evolution can not create its local folders"
-msgstr ""
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Installation d'Evolution"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr ""
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr ""
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:95
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:236
-msgid "New..."
-msgstr "Nouveau..."
-
-#: shell/e-shell-folder-title-bar.c:355
-msgid "(Untitled)"
-msgstr "(Sans titre)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:110
-msgid "Bug buddy was not found in your $PATH."
-msgstr ""
-
-#. same as above
-#: shell/e-shell-view-menu.c:116
-msgid "Bug buddy could not be run."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:159
-msgid "Evolution"
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:161
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:163
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:301
-msgid "Go to folder..."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:365
-msgid "_Folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:369
-msgid "Evolution _Bar Shortcut"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:375
-msgid "_Mail message (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:376 shell/e-shell-view-menu.c:379
-msgid "Composes a new mail message"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:378
-msgid "_Appointment (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:381
-msgid "_Contact (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:384
-msgid "_Task (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:387
-msgid "Task _Request (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:390
-msgid "_Journal Entry (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:398
-msgid "_New"
-msgstr "_Nouveau"
-
-#: shell/e-shell-view-menu.c:402
-msgid "_Go to folder..."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:402
-msgid "Display a different folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:404
-msgid "_Create new folder..."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:404
-msgid "Create a new folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:419
-msgid "Show _shortcut bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:420
-msgid "Show the shortcut bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:422
-msgid "Show _folder bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:423
-msgid "Show the folder bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:440
-msgid "Help _Index"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:443
-msgid "Getting _Started"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:446
-msgid "Using the _Mailer"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:449
-msgid "Using the _Calendar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:452
-msgid "Using the Cont_act Manager"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:457
-msgid "_Submit bug report"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:458
-msgid "Submit bug-report via bug-buddy"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:474
-msgid "_Actions"
-msgstr ""
-
-#: shell/e-shell-view.c:113
-msgid "(No folder displayed)"
-msgstr ""
-
-#: shell/e-shell-view.c:208
-msgid "Folders"
-msgstr ""
-
-#: shell/e-shell-view.c:600
-#, c-format
-msgid "Evolution - %s"
-msgstr ""
-
-#: shell/e-shell.c:299
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr ""
-
-#: shell/e-shortcut.c:469
-msgid "New group"
-msgstr "Nouveau groupe"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate"
-msgstr "Activer"
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate this shortcut"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:332
-msgid "Remove this shortcut from the shortcut bar"
-msgstr ""
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr ""
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "(Pas de nom)"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "Pas d'erreur"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "Erreur générique"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr ""
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr ""
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "Erreur d'E/S"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr ""
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr ""
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr ""
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "Permission refusée"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "Opération non supportée"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr ""
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "Erreur inconnue"
-
-#: shell/main.c:99
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-
-#: shell/main.c:126
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-
-#: shell/main.c:172
-msgid "Cannot initialize the Evolution shell."
-msgstr ""
-
-#: shell/main.c:214
-msgid "Cannot initialize the configuration system."
-msgstr ""
-
-#: shell/main.c:220
-msgid "Cannot initialize the Bonobo component system."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Champs"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "Groupage"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Tri"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Filtre"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-msgid "Field Chooser"
-msgstr ""
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Ajouter >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Enlever"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "Occupé"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "Pas d'information"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "_Options"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr ""
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:633
-#, c-format
-msgid "Group %i"
-msgstr "Groupe %i"
diff --git a/po/ga.po b/po/ga.po
deleted file mode 100755
index bc596e35a6..0000000000
--- a/po/ga.po
+++ /dev/null
@@ -1,455 +0,0 @@
-# Irish language translation of evolution
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Alastair McKinstry, <mckinstry@computer.org>, 2000.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution CVS\n"
-"POT-Creation-Date: 2000-05-10 22:19-0400\n"
-"PO-Revision-Date: 2000-08-02 13:00:00-0000\n"
-"Last-Translator: Alastair McKinstry, <mckinstry@computer.org>\n"
-"Language-Team: Irish <ga@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: composer/e-msg-composer-address-dialog.c:183 composer/e-msg-composer.c:462
-msgid "Cut"
-msgstr "Gearr"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.c:187 composer/e-msg-composer.c:463
-msgid "Copy"
-msgstr "Greamaigh"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bytanna"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:307
-msgid "Add attachment"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:364
-msgid "Remove"
-msgstr "Scríos"
-
-#: composer/e-msg-composer-attachment-bar.c:365
-msgid "Remove selected items from the attachment list"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:396
-msgid "Add attachment..."
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:397
-msgid "Attach a file to the message"
-msgstr ""
-
-#: composer/e-msg-composer-attachment.c:259
-msgid "Select attachment"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:89
-msgid "Click here for the address book"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:124
-msgid "To:"
-msgstr "Do:"
-
-#: composer/e-msg-composer-hdrs.c:125
-msgid "Enter the recipients of the message"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:129
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:130
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:135
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:136
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:142
-msgid "Subject:"
-msgstr "Abair:"
-
-#: composer/e-msg-composer-hdrs.c:143
-msgid "Enter the subject of the mail"
-msgstr ""
-
-#: composer/e-msg-composer.c:420
-msgid "Save in _folder..."
-msgstr "Sábháil 'san _fillteán"
-
-#: composer/e-msg-composer.c:420
-msgid "Save the message in a specified folder"
-msgstr ""
-
-#: composer/e-msg-composer.c:423 composer/e-msg-composer.c:460
-#: mail/folder-browser-factory.c:138
-msgid "Send"
-msgstr "Post"
-
-#: composer/e-msg-composer.c:423
-msgid "Send the message"
-msgstr "Post an sceál seo"
-
-#: composer/e-msg-composer.c:431
-msgid "View _attachments"
-msgstr ""
-
-#: composer/e-msg-composer.c:431
-msgid "View/hide attachments"
-msgstr ""
-
-#: composer/e-msg-composer.c:460
-msgid "Send this message"
-msgstr ""
-
-#: composer/e-msg-composer.c:462
-msgid "Cut selected region into the clipboard"
-msgstr ""
-
-#: composer/e-msg-composer.c:463
-msgid "Copy selected region into the clipboard"
-msgstr ""
-
-#: composer/e-msg-composer.c:464
-msgid "Paste selected region into the clipboard"
-msgstr ""
-
-#: composer/e-msg-composer.c:465
-msgid "Undo"
-msgstr "Leasú"
-
-#: composer/e-msg-composer.c:465
-msgid "Undo last operation"
-msgstr ""
-
-#: composer/e-msg-composer.c:467
-msgid "Attach"
-msgstr ""
-
-#: composer/e-msg-composer.c:467
-msgid "Attach a file"
-msgstr ""
-
-#: mail/folder-browser-factory.c:85
-msgid ""
-"Hi. Thanks for taking the time to download this preview release of\n"
-"the Evolution groupware suite.\n"
-"\n"
-"The Evolution team has worked hard to make Evolution as robust,\n"
-"extensible, pretty, fast and well-suited to heavy internet users as\n"
-"possible. And we're very tired. But we're not done -- not yet.\n"
-"\n"
-"As you explore Evolution, please understand that most of our work has\n"
-"been focused on the backend engine which drives the entire system and\n"
-"not on the user interface. We are just cresting the hill now, though,\n"
-"and will be pouring most of our love and attention into the UI from\n"
-"here out. But at least you know that you're not using demoware.\n"
-"\n"
-"So, time for the nerdy disclaimer. Evolution will: crash, lose your\n"
-"mail, leave stray processes running, consume 100% CPU, race, lock,\n"
-"send HTML mail to random mailing lists, and embarass you in front of\n"
-"your friends and co-workers. Use at your own risk.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-
-#: mail/folder-browser-factory.c:113
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Go raibh maith agat\n"
-"An Fhoireann Evolution\n"
-
-#: mail/folder-browser-factory.c:137
-msgid "Get mail"
-msgstr ""
-
-#: mail/folder-browser-factory.c:137
-msgid "Check for new mail"
-msgstr ""
-
-#: mail/folder-browser-factory.c:138
-msgid "Send a new message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:139
-msgid "Find"
-msgstr ""
-
-#: mail/folder-browser-factory.c:139
-msgid "Find messages"
-msgstr ""
-
-#: mail/folder-browser-factory.c:143
-msgid "Reply"
-msgstr "Freagrair"
-
-#: mail/folder-browser-factory.c:143
-msgid "Reply to the sender of this message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:144
-msgid "Reply to All"
-msgstr ""
-
-#: mail/folder-browser-factory.c:144
-msgid "Reply to all recipients of this message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:146
-msgid "Forward"
-msgstr "Sheoladh Chuig duine"
-
-#: mail/folder-browser-factory.c:146
-msgid "Forward this message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:150
-msgid "Print"
-msgstr "Priontáil"
-
-#: mail/folder-browser-factory.c:150
-msgid "Print the selected message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:152
-msgid "Delete"
-msgstr "Scríos"
-
-#: mail/folder-browser-factory.c:152
-msgid "Delete this message"
-msgstr "Scríos an sceal seo"
-
-#: mail/folder-browser-factory.c:169
-msgid "_Expunge"
-msgstr ""
-
-#: mail/folder-browser-factory.c:292
-msgid "We are sorry, Evolution's Folder Browser can not be initialized."
-msgstr ""
-
-#: mail/folder-browser.c:207
-msgid "The URI that the Folder Browser will display"
-msgstr ""
-
-#: mail/folder-browser.c:210
-msgid "Whether a message preview should be shown"
-msgstr ""
-
-#: mail/main.c:54
-msgid "Mail Component: I could not initialize Bonobo"
-msgstr ""
-
-#: mail/message-list.c:421
-msgid "Priority"
-msgstr "Tosaíocht"
-
-#: mail/message-list.c:435
-msgid "From"
-msgstr "Ó:"
-
-#: mail/message-list.c:442
-msgid "Subject"
-msgstr "Abair"
-
-#: mail/message-list.c:449
-msgid "Sent"
-msgstr ""
-
-#: mail/message-list.c:456
-msgid "Receive"
-msgstr ""
-
-#: mail/message-list.c:463
-msgid "To"
-msgstr "Do"
-
-#: mail/message-list.c:470
-msgid "Size"
-msgstr "Méid"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:62
-msgid "Bug buddy was not found in your $PATH."
-msgstr ""
-
-#. same as above
-#: shell/e-shell-view-menu.c:68
-msgid "Bug buddy could not be run."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:110
-msgid "Evolution"
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:112
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:114
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:163 shell/e-shell-view-menu.c:229
-msgid "_Folder"
-msgstr "_Fillteán"
-
-#: shell/e-shell-view-menu.c:167
-msgid "Evolution _Bar Shortcut"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:173
-msgid "_Mail message"
-msgstr "_Post sceál"
-
-#: shell/e-shell-view-menu.c:174 shell/e-shell-view-menu.c:177
-msgid "Composes a new mail message"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:176
-msgid "_Appointment"
-msgstr "_Coinne"
-
-#: shell/e-shell-view-menu.c:179
-msgid "Meeting Re_quest"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:182
-msgid "_Contact"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:185
-msgid "_Task"
-msgstr "_Teacs"
-
-#: shell/e-shell-view-menu.c:188
-msgid "Task _Request"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:191
-msgid "_Journal Entry"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:194
-msgid "_Note"
-msgstr "_Nota"
-
-#: shell/e-shell-view-menu.c:204
-msgid "_Selected Items"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:212
-msgid "_New Folder"
-msgstr "Fillteán _Nua"
-
-#: shell/e-shell-view-menu.c:220
-msgid "_New"
-msgstr "_Nua"
-
-#: shell/e-shell-view-menu.c:221
-msgid "_Open"
-msgstr "_Oscáil"
-
-#: shell/e-shell-view-menu.c:222
-msgid "Clos_e All Items"
-msgstr "_Dún gach rud"
-
-#: shell/e-shell-view-menu.c:222
-msgid "Closes all the open items"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:243
-msgid "_Toggle Shortcut Bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:244
-msgid "Toggles the shortcut bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:246
-msgid "_Toggle Treeview"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:247
-msgid "Toggles the tree view"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:262
-msgid "_Submit bug"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:263
-msgid "Submit bug-report via bug-buddy"
-msgstr ""
-
-#. FIXME: add Favorites here
-#: shell/e-shell-view-menu.c:278
-msgid "_Tools"
-msgstr "_Uirlisí"
-
-#: shell/e-shell-view-menu.c:279
-msgid "_Actions"
-msgstr ""
-
-#: shell/e-shell.c:82
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr ""
-
-#: shell/main.c:111
-msgid "Cannot initialize the Bonobo component system."
-msgstr ""
-
-#: shell/main.c:126
-msgid "Cannot initialize the Evolution shell."
-msgstr ""
diff --git a/po/gl.po b/po/gl.po
deleted file mode 100644
index b4d3873184..0000000000
--- a/po/gl.po
+++ /dev/null
@@ -1,3334 +0,0 @@
-# Galician translation of Evolution.
-# Copyright (C) 2000 Jesús Bravo Álvarez.
-# Jesús Bravo Álvarez <jba@pobox.com>, 2000.
-#
-# Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas
-# colaborar connosco, podes atopar máis información en http://trasno.gpul.org
-#
-# First Version: 2000-04-07 22:14+0200
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Evolution 0.0.2\n"
-"POT-Creation-Date: 2000-08-02 16:39+0200\n"
-"PO-Revision-Date: 2000-07-16 19:19+0200\n"
-"Last-Translator: Jesús Bravo Álvarez <jba@pobox.com>\n"
-"Language-Team: Galician <trasno@ceu.fi.udc.es>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:59 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Non se puido inicializar Bonobo"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "categorías"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "Elemento(s) pertencentes a estas categorías:"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "Categorías Dispoñibles:"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/event-editor.c:1168
-msgid "FIXME: _Appointment"
-msgstr "FIXME: _Cita"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1169
-msgid "FIXME: Meeting Re_quest"
-msgstr "FIXME: _Solicitude de Reunión"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/event-editor.c:1171
-msgid "FIXME: _Mail Message"
-msgstr "FIXME: Enviar _Mensaxe"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/event-editor.c:1172
-msgid "FIXME: _Contact"
-msgstr "FIXME: _Contacto"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/event-editor.c:1173
-msgid "FIXME: _Task"
-msgstr "FIXME: _Tarefa"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/event-editor.c:1174
-msgid "FIXME: Task _Request"
-msgstr "FIXME: Solicitude de _Tarefa"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/event-editor.c:1175
-msgid "FIXME: _Journal Entry"
-msgstr "FIXME: Entrada de _Xornal"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1176
-msgid "FIXME: _Note"
-msgstr "FIXME: _Nota"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/event-editor.c:1178 calendar/gui/event-editor.c:1285
-msgid "FIXME: Ch_oose Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1183
-msgid "FIXME: _Memo Style"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/event-editor.c:1185
-msgid "FIXME: Define Print _Styles..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/event-editor.c:1192
-msgid "FIXME: S_end"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/event-editor.c:1196
-msgid "FIXME: Save Attac_hments..."
-msgstr "FIXME: Gardar Ad_xuntos..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "_Borrar"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1199
-msgid "FIXME: _Move to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/event-editor.c:1200
-msgid "FIXME: Cop_y to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/event-editor.c:1202
-msgid "Page Set_up"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/event-editor.c:1203
-msgid "FIXME: Print Pre_view"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: Paste _Special..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/event-editor.c:1229
-msgid "FIXME: Mark as U_nread"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/event-editor.c:1233
-msgid "_Object"
-msgstr "_Obxecto"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/event-editor.c:1238 calendar/gui/event-editor.c:1245
-msgid "FIXME: _Item"
-msgstr "FIXME: _Elemento"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/event-editor.c:1239 calendar/gui/event-editor.c:1246
-msgid "FIXME: _Unread Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/event-editor.c:1247
-msgid "FIXME: _Last Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/event-editor.c:1252
-msgid "FIXME: _Standard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1254
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/event-editor.c:1257
-msgid "FIXME: _Customize..."
-msgstr "FIXME: _Personalizar..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/event-editor.c:1262
-msgid "Pre_vious"
-msgstr "An_terior"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/event-editor.c:1263
-msgid "Ne_xt"
-msgstr "Se_guinte"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/event-editor.c:1267
-msgid "_Toolbars"
-msgstr "_Barras de ferramentas"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/event-editor.c:1272
-msgid "FIXME: _File..."
-msgstr "FIXME: _Ficheiro..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/event-editor.c:1273
-msgid "FIXME: It_em..."
-msgstr "FIXME: _Elemento..."
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/event-editor.c:1274
-msgid "FIXME: _Object..."
-msgstr "FIXME: _Obxecto..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/event-editor.c:1279
-msgid "FIXME: _Font..."
-msgstr "FIXME: _Fonte..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/event-editor.c:1280
-msgid "FIXME: _Paragraph..."
-msgstr "FIXME: _Parágrafo..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/event-editor.c:1287
-msgid "FIXME: Desi_gn This Form"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/event-editor.c:1288
-msgid "FIXME: D_esign a Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/event-editor.c:1290
-msgid "FIXME: Publish _Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/event-editor.c:1291
-msgid "FIXME: Pu_blish Form As..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/event-editor.c:1293
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/event-editor.c:1298
-msgid "FIXME: _Spelling..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/event-editor.c:1303
-msgid "_Forms"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "FIXME: _Novo Contacto"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1316
-msgid "FIXME: For_ward"
-msgstr "FIXME: _Reenviar"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/event-editor.c:1329
-msgid "_Insert"
-msgstr "_Inserir"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/event-editor.c:1330
-msgid "F_ormat"
-msgstr "_Formatar"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/event-editor.c:1331 shell/e-shell-view-menu.c:515
-msgid "_Tools"
-msgstr "_Utilidades"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/event-editor.c:1332
-msgid "Actio_ns"
-msgstr "Acció_ns"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "Gardar e Pechar"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1371
-msgid "Save the appointment and close the dialog box"
-msgstr "Garda-la cita e pecha-la caixa de diálogo"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:673
-msgid "Print..."
-msgstr "Imprimir..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/event-editor.c:1376
-msgid "Print this item"
-msgstr "Imprimir este elemento"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/event-editor.c:1377
-msgid "FIXME: Insert File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/event-editor.c:1378
-msgid "Insert a file as an attachment"
-msgstr "Inserir un ficheiro como adxunto"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/gui/component/addressbook.c:426 calendar/gui/gncal-todo.c:508
-#: mail/folder-browser-factory.c:39
-msgid "Delete"
-msgstr "Borrar"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/event-editor.c:1387 calendar/gui/gncal-todo.c:336
-msgid "Delete this item"
-msgstr "Borrar este elemento"
-
-#: addressbook/contact-editor/e-contact-editor.c:856
-#: calendar/gui/event-editor.c:1389
-msgid "FIXME: Previous"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/event-editor.c:1390
-msgid "Go to the previous item"
-msgstr "Ir ó elemento anterior"
-
-#: addressbook/contact-editor/e-contact-editor.c:859
-#: calendar/gui/event-editor.c:1391
-msgid "FIXME: Next"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/event-editor.c:1392
-msgid "Go to the next item"
-msgstr "Ir ó elemento seguinte"
-
-#: addressbook/contact-editor/e-contact-editor.c:862
-#: calendar/gui/event-editor.c:1393
-msgid "FIXME: Help"
-msgstr "FIXME: Axuda"
-
-#: addressbook/contact-editor/e-contact-editor.c:863
-#: calendar/gui/event-editor.c:1394
-msgid "See online help"
-msgstr "Ve-la axuda online"
-
-#: addressbook/contact-editor/e-contact-editor.c:1278
-msgid "Assistant"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1279
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Business"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1280
-msgid "Business 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1281
-msgid "Business Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1282
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1283
-msgid "Car"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1284
-msgid "Company"
-msgstr "Compañía"
-
-#: addressbook/contact-editor/e-contact-editor.c:1285
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Home"
-msgstr "Casa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1286
-msgid "Home 2"
-msgstr "Casa 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1287
-msgid "Home Fax"
-msgstr "Fax de Casa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1288
-msgid "ISDN"
-msgstr "RDSI"
-
-#: addressbook/contact-editor/e-contact-editor.c:1289
-msgid "Mobile"
-msgstr "Móbil"
-
-#: addressbook/contact-editor/e-contact-editor.c:1290
-#: addressbook/contact-editor/e-contact-editor.c:1385
-msgid "Other"
-msgstr "Outro"
-
-#: addressbook/contact-editor/e-contact-editor.c:1291
-msgid "Other Fax"
-msgstr "Outro Fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1292
-msgid "Pager"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1293
-msgid "Primary"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1294
-msgid "Radio"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1295
-msgid "Telex"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1296
-msgid "TTY/TDD"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1340
-msgid "Primary Email"
-msgstr "Email Principal"
-
-#: addressbook/contact-editor/e-contact-editor.c:1341
-msgid "Email 2"
-msgstr "Email 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1342
-msgid "Email 3"
-msgstr "Email 3"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "_Engadir"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-msgid "Add"
-msgstr "Engadir"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "Editor de Contactos"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "Nome _Completo..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Enderezo da páxina Web:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "Quere recibir correo _HTML"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Enderezo:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "_Traballo"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "_Casa"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "_Fax do Traballo"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "_Móbil"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "T_raballo"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "C_ontactos..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr "Ca_tegorías..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "_Compañía:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-msgid "General"
-msgstr "Xeral"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "_Departamento:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "_Oficina:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "_Profesión:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "Cu_mpreanos:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "No_tas:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-msgid "Details"
-msgstr "Detalles"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "_Nome:"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "_Outros nomes:"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "_Apelido(s):"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:420
-#: calendar/gui/calendar-commands.c:544
-msgid "New"
-msgstr "Novo"
-
-#: addressbook/gui/component/addressbook.c:420
-msgid "Create a new contact"
-msgstr "Crear un novo contacto"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find"
-msgstr "Buscar"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find a contact"
-msgstr "Buscar un contacto"
-
-#: addressbook/gui/component/addressbook.c:425
-#: addressbook/gui/component/addressbook.c:492
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:37
-msgid "Print"
-msgstr "Imprimir"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Print contacts"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:426
-msgid "Delete a contact"
-msgstr "Borrar un contacto"
-
-#: addressbook/gui/component/addressbook.c:499
-#: addressbook/gui/component/addressbook.c:1034
-msgid "As _Table"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:506
-msgid "_New Contact"
-msgstr "_Novo Contacto"
-
-#: addressbook/gui/component/addressbook.c:514
-msgid "N_ew Directory Server"
-msgstr "N_ovo Servidor de Directorio"
-
-#: addressbook/gui/component/addressbook.c:593
-msgid "Unable to open addressbook"
-msgstr "Non se pode abri-lo libro de enderezos"
-
-#: addressbook/gui/component/addressbook.c:598
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:938
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr "Gardar como VCard"
-
-#: addressbook/gui/component/addressbook.c:1005
-msgid "* Click here to add a contact *"
-msgstr "* Prema aquí para engadir un contacto *"
-
-#: addressbook/gui/component/addressbook.c:1041
-msgid "As _Minicards"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1092
-msgid "The URI that the Folder Browser will display"
-msgstr "O URI que amosará o navegador de carpetas"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "window2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "k"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "Descrición:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "Servidor LDAP:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Número de Porto:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Nome:"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "Opcións"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "Seccións:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Número de columnas:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "Fontes"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "Fonte..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Papel"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Tipo:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-msgid "label26"
-msgstr "label26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Dimensións:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Largura:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Altura:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "Marxes"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Superior:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Inferior:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Esquerda:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Dereita:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "Páxina"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Tamaño:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Orientación"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "Vertical"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "Horizontal"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:544
-msgid "am"
-msgstr "am"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:543
-msgid "pm"
-msgstr "pm"
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Appointments:"
-msgstr "Citas:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr "Axenda de Gnome"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr "Ficheiro non atopado"
-
-#: calendar/gui/calendar-commands.c:456
-msgid "Open calendar"
-msgstr "Abrir axenda"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Save calendar"
-msgstr "Gardar axenda"
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:722
-#: calendar/gui/gncal-todo.c:726
-msgid "Day"
-msgstr "Día"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr "Amosar un día"
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr "5 Días"
-
-#: calendar/gui/calendar-commands.c:525
-msgid "Show the working week"
-msgstr "Amosa-la semana laboral"
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:721
-msgid "Week"
-msgstr "Semana"
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr "Amosar unha semana"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Month"
-msgstr "Mes"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr "Amosar un mes"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Year"
-msgstr "Ano"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr "Amosar un ano"
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:682
-msgid "Create a new appointment"
-msgstr "Crear unha nova cita"
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-msgid "Print this calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Prev"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Today"
-msgstr "Hoxe"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Next"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr ""
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-msgid "New Ca_lendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:663
-msgid "Open Ca_lendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:664
-msgid "Open a calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-msgid "Save Calendar As"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:682
-msgid "_New appointment..."
-msgstr "_Nova cita..."
-
-#: calendar/gui/calendar-commands.c:687
-msgid "New appointment for _today..."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:688
-msgid "Create a new appointment for today"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:696 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/calendar-commands.c:704
-msgid "About Calendar"
-msgstr ""
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:746
-#, c-format
-msgid "%s%s"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:746
-msgid "'s calendar"
-msgstr ""
-
-#: calendar/gui/control-factory.c:136
-msgid "The URI that the calendar will display"
-msgstr "O URI que amosará o calendario"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1070
-msgid "Snooze"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "Editar cita"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr ""
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "Nova cita..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "Editar esta cita..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "Borrar esta cita"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr ""
-
-#: calendar/gui/event-editor.c:291
-msgid "Edit Appointment"
-msgstr "Editar Cita"
-
-#: calendar/gui/event-editor.c:296
-msgid "No summary"
-msgstr ""
-
-#: calendar/gui/event-editor.c:300
-#, c-format
-msgid "Appointment - %s"
-msgstr "Cita - %s"
-
-#: calendar/gui/event-editor.c:303
-#, c-format
-msgid "Task - %s"
-msgstr "Tarefa - %s"
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Journal entry - %s"
-msgstr ""
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:622 calendar/gui/event-editor.c:718
-msgid "?"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1198
-msgid "FIXME: _Delete"
-msgstr "FIXME: _Borrar"
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Ca_lendar..."
-msgstr "FIXME: A_xenda..."
-
-#: calendar/gui/event-editor.c:1300
-msgid "FIXME: Chec_k Names"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1301
-msgid "FIXME: Address _Book..."
-msgstr "FIXME: _Libro de enderezos..."
-
-#: calendar/gui/event-editor.c:1308
-msgid "FIXME: _New Appointment"
-msgstr "FIXME: _Nova Cita"
-
-#: calendar/gui/event-editor.c:1310
-msgid "FIXME: Rec_urrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1312
-#, fuzzy
-msgid "FIXME: Invite _Attendees..."
-msgstr "FIXME: Gardar Ad_xuntos..."
-
-#: calendar/gui/event-editor.c:1313
-msgid "FIXME: C_ancel Invitation..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1315
-msgid "FIXME: Forward as v_Calendar"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1370
-msgid "FIXME: Save and Close"
-msgstr "FIXME: Gardar e Pechar"
-
-#: calendar/gui/event-editor.c:1375
-msgid "FIXME: Print..."
-msgstr "FIXME: Imprimir..."
-
-#: calendar/gui/event-editor.c:1380
-msgid "FIXME: Recurrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1381
-msgid "Configure recurrence rules"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1383
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1384
-msgid "Invite attendees to a meeting"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1386
-msgid "FIXME: Delete"
-msgstr "FIXME: Borrar"
-
-#: calendar/gui/event-editor.c:1828
-msgid "%a %b %d %Y"
-msgstr ""
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "xaneiro"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "febreiro"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "marzo"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "abril"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "maio"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "xuño"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "xullo"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "agosto"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "setembro"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "setem"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "outubro"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "novembro"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "decembro"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "domingo"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "luns"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "martes"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "mart"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "mércores"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "mércor"
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "xoves"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "xov"
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "xoves"
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "venres"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "sábado"
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr "ano"
-
-#: calendar/gui/getdate.y:421
-msgid "month"
-msgstr "mes"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr "quincena"
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr "semana"
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr "día"
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr "hora"
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr "minuto"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "min"
-
-#: calendar/gui/getdate.y:428
-msgid "second"
-msgstr "segundo"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "seg"
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "mañá"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "onte"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "hoxe"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr "agora"
-
-#: calendar/gui/getdate.y:439
-msgid "last"
-msgstr ""
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr ""
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr ""
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr ""
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr ""
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr ""
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr ""
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr ""
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr ""
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr ""
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr ""
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr ""
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Create to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Edit to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:176
-msgid "Summary:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:186
-msgid "Due Date:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:195
-msgid "Priority:"
-msgstr "Prioridade:"
-
-#: calendar/gui/gncal-todo.c:212
-msgid "Item Comments:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:334
-msgid "Add to-do item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:335
-msgid "Edit this item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:434
-msgid "Summary"
-msgstr "Resume"
-
-#: calendar/gui/gncal-todo.c:435 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:436 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr "Prioridade"
-
-#: calendar/gui/gncal-todo.c:437
-msgid "Time Left"
-msgstr ""
-
-#. Label
-#: calendar/gui/gncal-todo.c:449
-msgid "To-do list"
-msgstr ""
-
-#. Add
-#: calendar/gui/gncal-todo.c:488
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Engadir..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:497
-msgid "Edit..."
-msgstr "Editar..."
-
-#: calendar/gui/gncal-todo.c:721
-msgid "Weeks"
-msgstr "Semanas"
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Days"
-msgstr "Días"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hours"
-msgstr "Horas"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hour"
-msgstr "Hora"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minutes"
-msgstr "Minutos"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minute"
-msgstr "Minuto"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Seconds"
-msgstr "Segundos"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Second"
-msgstr "Segundo"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1078
-#: calendar/gui/gnome-cal.c:1134
-msgid "Reminder of your appointment at "
-msgstr ""
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1083 calendar/gui/gnome-cal.c:1138
-msgid "Ok"
-msgstr ""
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "Dom"
-
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "Lun"
-
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "Mar"
-
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "Mér"
-
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "Xov"
-
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "Ven"
-
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "Sáb"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "Ano:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr ""
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr "1"
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr "2"
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr "3"
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr "4"
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr "5"
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr "6"
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr "7"
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr "8"
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr "9"
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr "10"
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr "11"
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr "12"
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr "13"
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr "14"
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr "15"
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr "16"
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr "17"
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr "18"
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr "19"
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr "20"
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr "21"
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr "22"
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr "23"
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr "24"
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr "25"
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr "26"
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr "27"
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr "28"
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr "29"
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr "30"
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr "31"
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr "Do"
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr "Lu"
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr "Ma"
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr "Me"
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr "Xo"
-
-#: calendar/gui/print.c:326
-msgid "Fr"
-msgstr "Ve"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr "Sa"
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr ""
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr ""
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr ""
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr ""
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr "Mes actual (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr "Ano actual (%Y)"
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr "Imprimir axenda"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr "Previsualizar da Impresión"
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr ""
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr "Formato da hora"
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr "12 horas (AM/PM)"
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr "24 horas"
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr "A semana comeza o"
-
-#: calendar/gui/prop.c:347
-msgid "Sunday"
-msgstr "Domingo"
-
-#: calendar/gui/prop.c:348
-msgid "Monday"
-msgstr "Luns"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr ""
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr ""
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr ""
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr ""
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr "Cores"
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr ""
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr ""
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr ""
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr ""
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr ""
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr ""
-
-#: calendar/gui/prop.c:678
-msgid "To Do List Properties"
-msgstr ""
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr ""
-
-#: calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr ""
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-msgid "Alarm Properties"
-msgstr ""
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr ""
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr " segundos"
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr ""
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-msgid "Defaults"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut"
-msgstr "Cortar"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "Borrar e copiar o elemento seleccionado ó cartafol"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy"
-msgstr "Copiar"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "Copiar o elemento seleccionado ó cartafol"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste"
-msgstr "Pegar"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Pegar elemento do cartafol"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "Seleccionar os enderezos dos destinatarios"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Lista de destinatarios:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Buscar..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Nome"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr "Enderezo"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Propiedades..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "A: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "label9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "label7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "label8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bytes"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Engadir adxunto"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Quitar"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Quitar os elementos seleccionados da lista de adxuntos"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Engadir adxunto..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Adxuntar un ficheiro á mensaxe"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr ""
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "Tipo MIME:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "Nome de ficheiro:"
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr "Prema aquí para o libro de enderezos"
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "A:"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr "Introduza os destinatarios da mensaxe"
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Introduza os enderezos que recibirán unha copia da mensaxe"
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Introduza os enderezos que recibirán unha copia da mensaxe sen apareceren na "
-"lista de destinatarios."
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr "Asunto:"
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr "Introduza o asunto da mensaxe"
-
-#: composer/e-msg-composer.c:444
-msgid "Save as..."
-msgstr "Gardar como..."
-
-#: composer/e-msg-composer.c:455
-#, c-format
-msgid "Error saving file: %s"
-msgstr "Erro gardando o ficheiro: %s"
-
-#: composer/e-msg-composer.c:475
-#, c-format
-msgid "Error loading file: %s"
-msgstr "Erro cargando o ficheiro: %s"
-
-#: composer/e-msg-composer.c:494
-msgid "Discard this message?"
-msgstr "¿Descartar esta mensaxe?"
-
-#: composer/e-msg-composer.c:511
-msgid "Open file"
-msgstr "Abrir ficheiro"
-
-#: composer/e-msg-composer.c:623
-msgid "That file does not exist."
-msgstr "O ficheiro non existe."
-
-#: composer/e-msg-composer.c:633
-msgid "That is not a regular file."
-msgstr "Non é un ficheiro normal."
-
-#: composer/e-msg-composer.c:643
-msgid "That file exists but is not readable."
-msgstr "O ficheiro existe pero non se pode ler."
-
-#: composer/e-msg-composer.c:653
-msgid "That file appeared accesible but open(2) failed."
-msgstr "O ficheiro parecía accesible pero a chamada a open(2) fallou."
-
-#: composer/e-msg-composer.c:675
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"O ficheiro é moi longo (máis de 100K).\n"
-"¿Está seguro de querer inserilo?"
-
-#: composer/e-msg-composer.c:696
-msgid "An error occurred while reading the file."
-msgstr "Ocorreu un erro lendo o ficheiro."
-
-#: composer/e-msg-composer.c:792 shell/e-shell-view-menu.c:438
-#, fuzzy
-msgid "_File"
-msgstr "_Móbil"
-
-#: composer/e-msg-composer.c:798
-msgid "_Open..."
-msgstr ""
-
-#: composer/e-msg-composer.c:799
-msgid "Load a previously saved message"
-msgstr ""
-
-#: composer/e-msg-composer.c:807
-#, fuzzy
-msgid "_Save..."
-msgstr "Gardar como..."
-
-#: composer/e-msg-composer.c:808
-#, fuzzy
-msgid "Save message"
-msgstr "Enviar a mensaxe"
-
-#: composer/e-msg-composer.c:816
-#, fuzzy
-msgid "_Save as..."
-msgstr "Gardar como..."
-
-#: composer/e-msg-composer.c:817
-#, fuzzy
-msgid "Save message with a different name"
-msgstr "Garda-la mensaxe na carpeta indicada"
-
-#: composer/e-msg-composer.c:825
-msgid "Save in _folder..."
-msgstr "Gardar en _carpeta..."
-
-#: composer/e-msg-composer.c:826
-msgid "Save the message in a specified folder"
-msgstr "Garda-la mensaxe na carpeta indicada"
-
-#: composer/e-msg-composer.c:835
-#, fuzzy
-msgid "_Insert text file... (FIXME)"
-msgstr "_Inserir Ficheiro de Texto"
-
-#: composer/e-msg-composer.c:836
-msgid "Insert a file as text into the message"
-msgstr "Inserir un ficheiro como texto na mensaxe"
-
-#: composer/e-msg-composer.c:845
-#, fuzzy
-msgid "_Send"
-msgstr "Enviar"
-
-#: composer/e-msg-composer.c:846
-msgid "Send the message"
-msgstr "Enviar a mensaxe"
-
-#: composer/e-msg-composer.c:856
-msgid "_Close..."
-msgstr ""
-
-#: composer/e-msg-composer.c:857
-msgid "Quit the message composer"
-msgstr ""
-
-#: composer/e-msg-composer.c:870 shell/e-shell-view-menu.c:480
-#, fuzzy
-msgid "_Edit"
-msgstr "Editar..."
-
-#: composer/e-msg-composer.c:881
-#, fuzzy
-msgid "_Format"
-msgstr "_Formatar"
-
-#: composer/e-msg-composer.c:887
-msgid "HTML"
-msgstr ""
-
-#: composer/e-msg-composer.c:888
-msgid "Send the mail in HTML format"
-msgstr ""
-
-#: composer/e-msg-composer.c:901 shell/e-shell-view-menu.c:387
-#: shell/e-shell-view-menu.c:491
-#, fuzzy
-msgid "_View"
-msgstr "_Nova"
-
-#: composer/e-msg-composer.c:907
-#, fuzzy
-msgid "Show _attachments"
-msgstr "Mirar _adxuntos"
-
-#: composer/e-msg-composer.c:908
-#, fuzzy
-msgid "Show/hide attachments"
-msgstr "Mirar/ocultar adxuntos"
-
-#: composer/e-msg-composer.c:941
-msgid "Send"
-msgstr "Enviar"
-
-#: composer/e-msg-composer.c:942
-msgid "Send this message"
-msgstr "Enviar esta mensaxe"
-
-#: composer/e-msg-composer.c:951
-msgid "Attach"
-msgstr "Adxuntar"
-
-#: composer/e-msg-composer.c:952
-msgid "Attach a file"
-msgstr "Adxuntar un ficheiro"
-
-#: composer/e-msg-composer.c:1139
-msgid "Compose a message"
-msgstr "Compoñer unha mensaxe"
-
-#: mail/component-factory.c:188
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Non se pode inicializa-lo compoñente de correo de Evolution."
-
-#: mail/folder-browser-factory.c:23
-msgid "Get mail"
-msgstr "Baixar correo"
-
-#: mail/folder-browser-factory.c:23
-msgid "Check for new mail"
-msgstr "Comprobar o novo correo"
-
-#: mail/folder-browser-factory.c:24
-msgid "Compose"
-msgstr "Compoñer"
-
-#: mail/folder-browser-factory.c:24
-msgid "Compose a new message"
-msgstr "Compoñer unha nova mensaxe"
-
-#: mail/folder-browser-factory.c:28
-msgid "Reply"
-msgstr "Responder"
-
-#: mail/folder-browser-factory.c:28
-msgid "Reply to the sender of this message"
-msgstr "Responder ó autor desta mensaxe"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to All"
-msgstr "Responder a Todos"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to all recipients of this message"
-msgstr "Responder a tódolos destinatarios desta mensaxe"
-
-#: mail/folder-browser-factory.c:31
-msgid "Forward"
-msgstr "Re-enviar"
-
-#: mail/folder-browser-factory.c:31
-msgid "Forward this message"
-msgstr "Re-enviar esta mensaxe"
-
-#: mail/folder-browser-factory.c:35
-#, fuzzy
-msgid "Move"
-msgstr "Lu"
-
-#: mail/folder-browser-factory.c:35
-msgid "Move message to a new folder"
-msgstr "Mover mensaxe a unha nova carpeta"
-
-#: mail/folder-browser-factory.c:37
-msgid "Print the selected message"
-msgstr "Imprimir a mensaxe seleccionada"
-
-#: mail/folder-browser-factory.c:39
-msgid "Delete this message"
-msgstr "Borrar esta mensaxe"
-
-#: mail/folder-browser-factory.c:59
-msgid "_Threaded Message List"
-msgstr ""
-
-#: mail/folder-browser-factory.c:72
-msgid "_Mark all messages seen"
-msgstr ""
-
-#: mail/folder-browser-factory.c:78
-msgid "_Expunge"
-msgstr "_Eliminar"
-
-#: mail/folder-browser-factory.c:84
-#, fuzzy
-msgid "Mail _Filters ..."
-msgstr "FIXME: _Ficheiro..."
-
-#: mail/folder-browser-factory.c:90
-msgid "_vFolder Editor ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:96
-msgid "_Mail Configuration ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:102
-msgid "Forget _Passwords"
-msgstr "Esquecer _Contrasinais"
-
-#: mail/mail-config.c:688
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-
-#: mail/mail-config.c:701
-msgid "Full name:"
-msgstr "Nome completo:"
-
-#: mail/mail-config.c:725
-msgid "Email address:"
-msgstr "Enderezo de email:"
-
-#: mail/mail-config.c:740
-msgid "Organization:"
-msgstr "Organización:"
-
-#: mail/mail-config.c:751
-msgid "Signature file:"
-msgstr "Ficheiro de sinatura:"
-
-#: mail/mail-config.c:756
-msgid "Signature File"
-msgstr "Ficheiro de Sinatura"
-
-#: mail/mail-config.c:1167
-msgid "Server:"
-msgstr "Servidor:"
-
-#: mail/mail-config.c:1173
-msgid "Username:"
-msgstr "Nome de usuario:"
-
-#: mail/mail-config.c:1179
-msgid "Path:"
-msgstr "Camiño:"
-
-#: mail/mail-config.c:1187
-msgid "Authentication:"
-msgstr "Autenticación:"
-
-#: mail/mail-config.c:1199
-msgid "Detect supported types..."
-msgstr "Detectar tipos soportados..."
-
-#: mail/mail-config.c:1222
-msgid "Test Settings"
-msgstr ""
-
-#: mail/mail-config.c:1344 mail/mail-config.c:1392
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:1368
-msgid ""
-"Select the kind of news server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:1434
-msgid "Edit Identity"
-msgstr ""
-
-#: mail/mail-config.c:1436
-msgid "Add Identity"
-msgstr ""
-
-#: mail/mail-config.c:1515
-msgid "Edit Source"
-msgstr ""
-
-#: mail/mail-config.c:1517
-msgid "Add Source"
-msgstr ""
-
-#: mail/mail-config.c:1598
-msgid "Edit News Server"
-msgstr "Editar Servidor de News"
-
-#: mail/mail-config.c:1600
-msgid "Add News Server"
-msgstr "Engadir Servidor de News"
-
-#: mail/mail-ops.c:393
-msgid "Fetching mail"
-msgstr "Baixando correo"
-
-#: mail/mail-ops.c:405
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-"Esta mensaxe non ten asunto.\n"
-"¿Enviar realmente?"
-
-#: mail/mail-ops.c:791
-#, fuzzy
-msgid "Move message(s) to"
-msgstr "Mover mensaxe a unha nova carpeta"
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr ""
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr ""
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr ""
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr ""
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr ""
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr ""
-
-#: mail/message-list.c:456
-msgid "Online Status"
-msgstr ""
-
-#: mail/message-list.c:492
-msgid "From"
-msgstr "De"
-
-#: mail/message-list.c:499
-msgid "Subject"
-msgstr "Asunto"
-
-#: mail/message-list.c:506
-msgid "Date"
-msgstr "Data"
-
-#: mail/message-list.c:513
-msgid "Received"
-msgstr "Recibido"
-
-#: mail/message-list.c:520
-msgid "To"
-msgstr "A"
-
-#: mail/message-list.c:527
-msgid "Size"
-msgstr "Tamaño"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Instalación de Evolution"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Semella que é a primeira vez que executa Evolution."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-"Prema \"Aceptar\" para instala-los ficheiros de usuario de Evolution en"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"Non se pode crea-lo directorio\n"
-"%s\n"
-"Erro: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"Non se poden copia-los ficheiros a\n"
-"`%s'."
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Ficheiros de Evolution instalados con éxito."
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"O ficheiro `%s' non é un directorio.\n"
-"Elimíneo para poder instala-los ficheiros de\n"
-"usuario de Evolution."
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"Non se pode crea-la carpeta indicada:\n"
-"%s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "Evolution - Crear unha nova carpeta"
-
-#: shell/e-shell-folder-selection-dialog.c:95
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:236
-msgid "New..."
-msgstr ""
-
-#: shell/e-shell-folder-title-bar.c:459 shell/e-shell-folder-title-bar.c:460
-msgid "(Untitled)"
-msgstr "(Sen_título)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Bug buddy non foi atopado no seu $PATH."
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "Non se puido executar Bug buddy."
-
-#: shell/e-shell-view-menu.c:164
-msgid "Evolution"
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:166
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:168
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:324
-msgid "Go to folder..."
-msgstr "Ir á carpeta..."
-
-#: shell/e-shell-view-menu.c:381
-msgid "_New"
-msgstr "_Nova"
-
-#: shell/e-shell-view-menu.c:393
-msgid "_Folder"
-msgstr "_Carpeta"
-
-#: shell/e-shell-view-menu.c:399
-#, fuzzy
-msgid "Evolution bar _shortcut"
-msgstr "_Barra de Atallos de Evolution"
-
-#: shell/e-shell-view-menu.c:408
-msgid "_Mail message (FIXME)"
-msgstr "Enviar _Mensaxe (FIXME)"
-
-#: shell/e-shell-view-menu.c:414
-msgid "_Appointment (FIXME)"
-msgstr "_Cita (FIXME)"
-
-#: shell/e-shell-view-menu.c:420
-msgid "_Contact (FIXME)"
-msgstr "_Contacto (FIXME)"
-
-#: shell/e-shell-view-menu.c:426
-msgid "_Task (FIXME)"
-msgstr "_Tarefa (FIXME)"
-
-#: shell/e-shell-view-menu.c:448
-msgid "_Go to folder..."
-msgstr "_Ir á carpeta..."
-
-#: shell/e-shell-view-menu.c:449
-msgid "Display a different folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:456
-msgid "_Create new folder..."
-msgstr "_Crear unha nova carpeta..."
-
-#: shell/e-shell-view-menu.c:457 shell/e-shell-view-menu.c:467
-msgid "Create a new folder"
-msgstr "Crear unha nova carpeta"
-
-#: shell/e-shell-view-menu.c:466
-#, fuzzy
-msgid "E_xit..."
-msgstr "Editar..."
-
-#: shell/e-shell-view-menu.c:497
-msgid "Show _shortcut bar"
-msgstr "Amosar barra de _atallos"
-
-#: shell/e-shell-view-menu.c:498
-msgid "Show the shortcut bar"
-msgstr "Amosa-la barra de atallos"
-
-#: shell/e-shell-view-menu.c:503
-msgid "Show _folder bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:504
-msgid "Show the folder bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:526
-msgid "_Actions"
-msgstr "_Accións"
-
-#: shell/e-shell-view-menu.c:537
-#, fuzzy
-msgid "_Help"
-msgstr "_Casa"
-
-#: shell/e-shell-view-menu.c:543
-#, fuzzy
-msgid "Help _index"
-msgstr "_Índice da Axuda"
-
-#: shell/e-shell-view-menu.c:550
-#, fuzzy
-msgid "Getting _started"
-msgstr "Hora de _comezo da reunión:"
-
-#: shell/e-shell-view-menu.c:557
-#, fuzzy
-msgid "Using the _mailer"
-msgstr "Usando o _Lector"
-
-#: shell/e-shell-view-menu.c:564
-#, fuzzy
-msgid "Using the _calendar"
-msgstr "Usando a _Axenda"
-
-#: shell/e-shell-view-menu.c:571
-#, fuzzy
-msgid "Using the c_ontact manager"
-msgstr "Usando o Xestor de _Contactos"
-
-#: shell/e-shell-view-menu.c:581
-msgid "_Submit bug report"
-msgstr "_Enviar informe de erro"
-
-#: shell/e-shell-view-menu.c:582
-#, fuzzy
-msgid "Submit bug report using Bug Buddy"
-msgstr "Enviar un informe de erro con bug-buddy"
-
-#: shell/e-shell-view-menu.c:591
-#, fuzzy
-msgid "_About Evolution..."
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:592
-msgid "Show information about Evolution"
-msgstr ""
-
-#: shell/e-shell-view.c:114
-msgid "(No folder displayed)"
-msgstr ""
-
-#: shell/e-shell-view.c:342
-msgid "Folders"
-msgstr "Carpetas"
-
-#: shell/e-shell-view.c:734
-msgid "None"
-msgstr ""
-
-#: shell/e-shell-view.c:738
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell.c:293
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Non se pode activar o almacenamento local -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "Iconas _Pequenas"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "Amosa-los atallos como iconas pequenas"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "Iconas _Grandes"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Amosa-los atallos como iconas grandes"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "Activar"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "Activar este atallo"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr ""
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Erro gardando atallos."
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr ""
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr ""
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "Erro xenérico"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "Xa existe unha carpeta co mesmo nome"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr ""
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "Erro de E/S"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "Non hai espacio dabondo para crea-la carpeta"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "Non se atopou a carpeta especificada"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr ""
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "Permiso denegado"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "Operación non soportada"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr ""
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "Erro descoñecido"
-
-#: shell/main.c:66
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Graciñas\n"
-"O Equipo de Evolution\n"
-
-#: shell/main.c:128
-msgid "Cannot initialize the Evolution shell."
-msgstr "Non se pode inicializar a shell de Evolution."
-
-#: shell/main.c:166
-msgid "Cannot initialize the configuration system."
-msgstr "Non se pode inicializa-lo sistema de configuración."
-
-#: shell/main.c:172
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Non se pode inicializar o sistema de compoñentes de Bonobo"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr ""
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr ""
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr ""
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-msgid "Field Chooser"
-msgstr ""
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "window1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "label1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "label2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Engadir >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Quitar"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "_Opcións"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "Hora de _comezo da reunión:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "Hora de _remate da reunión:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr ""
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr ""
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "Grupo %i"
-
-#~ msgid "Cut selected region into the clipboard"
-#~ msgstr "Corta-la rexión seleccionada ó cartafol"
-
-#~ msgid "Copy selected region into the clipboard"
-#~ msgstr "Copia-la rexión seleccionada ó cartafol"
-
-#~ msgid "Paste selected region into the clipboard"
-#~ msgstr "Pega-la rexión seleccionada ó cartafol"
-
-#~ msgid "Undo"
-#~ msgstr "Desfacer"
-
-#~ msgid "Undo last operation"
-#~ msgstr "Desface-la última operación"
-
-#~ msgid "Edit Filter"
-#~ msgstr "Editar Filtro"
-
-#~ msgid "Create filter"
-#~ msgstr "Crear filtro"
-
-#~ msgid "Back"
-#~ msgstr "Atrás"
-
-#~ msgid "Finish"
-#~ msgstr "Finalizar"
-
-#~ msgid "Cancel"
-#~ msgstr "Cancelar"
-
-#~ msgid "Apply"
-#~ msgstr "Aplicar"
-
-#~ msgid "Test these values before continuing"
-#~ msgstr "Probe eses valores antes de continuar"
-
-#~ msgid "Mail Configuration"
-#~ msgstr "Configuración do Correo"
-
-#~ msgid "Identity"
-#~ msgstr "Identidade"
-
-#~ msgid "Mail Component: I could not initialize Bonobo"
-#~ msgstr "Compoñente de Correo: Non se pode inicializar Bonobo"
-
-#~ msgid "Composes a new mail message"
-#~ msgstr "Compoñer unha nova mensaxe de correo"
-
-#~ msgid "Task _Request (FIXME)"
-#~ msgstr "Solicitar _Tarefa (FIXME)"
-
-#~ msgid "_Journal Entry (FIXME)"
-#~ msgstr "Entrada de _Xornal (FIXME)"
diff --git a/po/hu.po b/po/hu.po
deleted file mode 100644
index 89215b4b61..0000000000
--- a/po/hu.po
+++ /dev/null
@@ -1,3904 +0,0 @@
-# Evolution Hungarian translations
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Szabolcs BAN <shooby@gnome.hu>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution VERSION\n"
-"POT-Creation-Date: 2000-08-11 14:21+0200\n"
-"PO-Revision-Date: 2000-05-19 19:06+0100\n"
-"Last-Translator: Szabolcs BAN <shooby@gnome.hu>\n"
-"Language-Team: Hungarian <hu@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=8859-2\n"
-"Content-Transfer-Encoding: 8bits\n"
-
-#: addressbook/backend/ebook/load-gnomecard-addressbook.c:41
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:59 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Nem tudom a bonobo-t elindítani"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "kategóriák"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "Az elemek az alábbi kategóriákhoz tartoznak:"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "Meglévõ mezõk"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/dialogs/task-editor.c:217 calendar/gui/event-editor.c:1168
-msgid "FIXME: _Appointment"
-msgstr "FIXME: _Idõpont"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/dialogs/task-editor.c:218 calendar/gui/event-editor.c:1169
-msgid "FIXME: Meeting Re_quest"
-msgstr "FIXME: Találkozó _felhívás"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/dialogs/task-editor.c:216 calendar/gui/event-editor.c:1171
-msgid "FIXME: _Mail Message"
-msgstr "FIXME: _Levél"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/dialogs/task-editor.c:219 calendar/gui/event-editor.c:1172
-msgid "FIXME: _Contact"
-msgstr "FIXME: _Címjegyzék"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/dialogs/task-editor.c:213
-#: calendar/gui/dialogs/task-editor.c:220 calendar/gui/event-editor.c:1173
-msgid "FIXME: _Task"
-msgstr "FIXME: _Feladat"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/dialogs/task-editor.c:214
-#: calendar/gui/dialogs/task-editor.c:221 calendar/gui/event-editor.c:1174
-msgid "FIXME: Task _Request"
-msgstr "FIXME: Feladat f_elhívás"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/dialogs/task-editor.c:222 calendar/gui/event-editor.c:1175
-msgid "FIXME: _Journal Entry"
-msgstr "FIXME: _Napló bejegyzés"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/dialogs/task-editor.c:223 calendar/gui/event-editor.c:1176
-msgid "FIXME: _Note"
-msgstr "FIXME: _Feljegyzés"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/dialogs/task-editor.c:225
-#: calendar/gui/dialogs/task-editor.c:332 calendar/gui/event-editor.c:1178
-#: calendar/gui/event-editor.c:1285
-msgid "FIXME: Ch_oose Form..."
-msgstr "FIXME: Válassz f_ormát..."
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/dialogs/task-editor.c:230 calendar/gui/event-editor.c:1183
-msgid "FIXME: _Memo Style"
-msgstr "FIXME: _Memo stílus"
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/dialogs/task-editor.c:232 calendar/gui/event-editor.c:1185
-msgid "FIXME: Define Print _Styles..."
-msgstr "FIXME: Nyomtatási stílusok definiálása..."
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/dialogs/task-editor.c:239 calendar/gui/event-editor.c:1192
-msgid "FIXME: S_end"
-msgstr "FIXME: _Elküld"
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/dialogs/task-editor.c:243 calendar/gui/event-editor.c:1196
-msgid "FIXME: Save Attac_hments..."
-msgstr "FIXME: Csatolások me_ntése..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "_Töröl"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/dialogs/task-editor.c:246 calendar/gui/event-editor.c:1199
-msgid "FIXME: _Move to Folder..."
-msgstr "FIXME: _Mappába mozgat..."
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/dialogs/task-editor.c:247 calendar/gui/event-editor.c:1200
-msgid "FIXME: Cop_y to Folder..."
-msgstr "FIXME: Mappába máso_l..."
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/dialogs/task-editor.c:249 calendar/gui/event-editor.c:1202
-msgid "Page Set_up"
-msgstr "Oldal _beállítás:"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/dialogs/task-editor.c:250 calendar/gui/event-editor.c:1203
-msgid "FIXME: Print Pre_view"
-msgstr "FIXME: Nyomtatás né_zet"
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/dialogs/task-editor.c:271 calendar/gui/event-editor.c:1224
-msgid "FIXME: Paste _Special..."
-msgstr "FIXME: _Speciális beillesztés"
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/dialogs/task-editor.c:276 calendar/gui/event-editor.c:1229
-msgid "FIXME: Mark as U_nread"
-msgstr "FIXME: Ne_m olvasottnak jelöl"
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/dialogs/task-editor.c:280 calendar/gui/event-editor.c:1233
-msgid "_Object"
-msgstr "_Objektum"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/dialogs/task-editor.c:285
-#: calendar/gui/dialogs/task-editor.c:293 calendar/gui/event-editor.c:1238
-#: calendar/gui/event-editor.c:1245
-msgid "FIXME: _Item"
-msgstr "FIXME: _Elem"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/dialogs/task-editor.c:286
-#: calendar/gui/dialogs/task-editor.c:294 calendar/gui/event-editor.c:1239
-#: calendar/gui/event-editor.c:1246
-msgid "FIXME: _Unread Item"
-msgstr "FIXME: _Nem olvasott elem"
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/dialogs/task-editor.c:288 calendar/gui/event-editor.c:1240
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr "FIXME: Elsõ e_lem a mappában"
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/dialogs/task-editor.c:296 calendar/gui/event-editor.c:1247
-msgid "FIXME: _Last Item in Folder"
-msgstr "FIXME: _Utolsó elem a mappában"
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/dialogs/task-editor.c:301 calendar/gui/event-editor.c:1252
-msgid "FIXME: _Standard"
-msgstr "FIXME: Á_ltalános"
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/dialogs/task-editor.c:303 calendar/gui/event-editor.c:1254
-msgid "FIXME: __Formatting"
-msgstr "FIXME: __Formázás"
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/dialogs/task-editor.c:306 calendar/gui/event-editor.c:1257
-msgid "FIXME: _Customize..."
-msgstr "FIXME: _Beállít..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/dialogs/task-editor.c:311 calendar/gui/event-editor.c:1262
-msgid "Pre_vious"
-msgstr "E_lõzõ"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/dialogs/task-editor.c:312 calendar/gui/event-editor.c:1263
-msgid "Ne_xt"
-msgstr "Kö_vetkezõ"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/dialogs/task-editor.c:314 calendar/gui/event-editor.c:1267
-msgid "_Toolbars"
-msgstr "_Eszközök"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/dialogs/task-editor.c:319 calendar/gui/event-editor.c:1272
-msgid "FIXME: _File..."
-msgstr "FIXME: _Fájl..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/dialogs/task-editor.c:320 calendar/gui/event-editor.c:1273
-msgid "FIXME: It_em..."
-msgstr "FIXME: Elem..."
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/dialogs/task-editor.c:321 calendar/gui/event-editor.c:1274
-msgid "FIXME: _Object..."
-msgstr "FIXME: _Objektum..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/dialogs/task-editor.c:326 calendar/gui/event-editor.c:1279
-msgid "FIXME: _Font..."
-msgstr "FIXME: _Betûtípus..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/dialogs/task-editor.c:327 calendar/gui/event-editor.c:1280
-msgid "FIXME: _Paragraph..."
-msgstr "FIXME: B_ekezdés..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/dialogs/task-editor.c:334 calendar/gui/event-editor.c:1287
-msgid "FIXME: Desi_gn This Form"
-msgstr "FIXME: Aktuális kérdõív _tervezése"
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/dialogs/task-editor.c:335 calendar/gui/event-editor.c:1288
-msgid "FIXME: D_esign a Form..."
-msgstr "FIXME: Kérdõív t_ervezése"
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/dialogs/task-editor.c:337 calendar/gui/event-editor.c:1290
-msgid "FIXME: Publish _Form..."
-msgstr "FIXME: Kérdõív _publikálása"
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/dialogs/task-editor.c:338 calendar/gui/event-editor.c:1291
-msgid "FIXME: Pu_blish Form As..."
-msgstr "FIXME: Kérdõív publikálása _mint..."
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/dialogs/task-editor.c:340 calendar/gui/event-editor.c:1293
-msgid "FIXME: Script _Debugger"
-msgstr "FIXME: Szkript _hibakeresõ"
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/dialogs/task-editor.c:345 calendar/gui/event-editor.c:1298
-msgid "FIXME: _Spelling..."
-msgstr "FIXME: _Helyesírás..."
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/dialogs/task-editor.c:350 calendar/gui/event-editor.c:1303
-msgid "_Forms"
-msgstr "_Kérdõívek"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "FIXME: Ú_j névjegy"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr "FIXME: Új névjegy ugyanannál a _cégnél"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr "FIXME: Levél ennek a _személynek"
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr "FIXME: Üze_net ennek a személynek"
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr "FIXME: Ta_lálkozó ezzel a személlyel"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr "FIXME: _Találkozó tervezése"
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr "FIXME: Új feladat a névjegyhez"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr "FIXME: Új napló bejegyzés a névjegyhez"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr "FIXME: _Zászló folytatáshoz..."
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr "FIXME: _Térkép vagy cím megjelenítése"
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr "FIXME: _Weblap megnyitása"
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr "FIXME: _vCard-ként továbbküld"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/dialogs/task-editor.c:367 calendar/gui/event-editor.c:1316
-msgid "FIXME: For_ward"
-msgstr "FIXME: _Továbbít"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/dialogs/task-editor.c:380 calendar/gui/event-editor.c:1329
-msgid "_Insert"
-msgstr "_Beilleszt"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/dialogs/task-editor.c:381 calendar/gui/event-editor.c:1330
-msgid "F_ormat"
-msgstr "F_ormátum"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/dialogs/task-editor.c:382 calendar/gui/event-editor.c:1331
-#: shell/e-shell-view-menu.c:512
-msgid "_Tools"
-msgstr "_Eszközök"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/dialogs/task-editor.c:383 calendar/gui/event-editor.c:1332
-msgid "Actio_ns"
-msgstr "_Mûveletek"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "Ment és bezár"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1371
-msgid "Save the appointment and close the dialog box"
-msgstr "A találkozó mentése és a párbeszédablak bezárása"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:680
-msgid "Print..."
-msgstr "Nyomtat..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/dialogs/task-editor.c:415 calendar/gui/event-editor.c:1376
-msgid "Print this item"
-msgstr "Az elem nyomtatása"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/dialogs/task-editor.c:416 calendar/gui/event-editor.c:1377
-msgid "FIXME: Insert File..."
-msgstr "FIXME: Fájl beillesztése..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/dialogs/task-editor.c:417 calendar/gui/event-editor.c:1378
-msgid "Insert a file as an attachment"
-msgstr "Fájl beillesztése csatolásként"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/gui/component/addressbook.c:427
-#: calendar/gui/e-calendar-table.c:375
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:508
-#: mail/folder-browser-factory.c:40 mail/mail-config.glade.h:13
-#: mail/mail-config.glade.h:18 mail/mail-config.glade.h:24
-msgid "Delete"
-msgstr "Töröl"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/dialogs/task-editor.c:426 calendar/gui/event-editor.c:1387
-#: calendar/gui/gncal-todo.c:336
-msgid "Delete this item"
-msgstr "Az elem törlése"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/dialogs/task-editor.c:428 calendar/gui/event-editor.c:1389
-msgid "FIXME: Previous"
-msgstr "FIXME: Elõzõ"
-
-#: addressbook/contact-editor/e-contact-editor.c:858
-#: calendar/gui/dialogs/task-editor.c:429 calendar/gui/event-editor.c:1390
-msgid "Go to the previous item"
-msgstr "Az elõzõ elemre ugrás"
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/dialogs/task-editor.c:430 calendar/gui/event-editor.c:1391
-msgid "FIXME: Next"
-msgstr "FIXME: Következõ"
-
-#: addressbook/contact-editor/e-contact-editor.c:861
-#: calendar/gui/dialogs/task-editor.c:431 calendar/gui/event-editor.c:1392
-msgid "Go to the next item"
-msgstr "Következõ elemre ugrás"
-
-#: addressbook/contact-editor/e-contact-editor.c:864
-#: calendar/gui/dialogs/task-editor.c:432 calendar/gui/event-editor.c:1393
-msgid "FIXME: Help"
-msgstr "FIXME: Súgó"
-
-#: addressbook/contact-editor/e-contact-editor.c:865
-#: calendar/gui/dialogs/task-editor.c:433 calendar/gui/event-editor.c:1394
-msgid "See online help"
-msgstr "Az online súgó"
-
-#: addressbook/contact-editor/e-contact-editor.c:1320
-msgid "Assistant"
-msgstr "Asszisztens"
-
-#: addressbook/contact-editor/e-contact-editor.c:1321
-#: addressbook/contact-editor/e-contact-editor.c:1425
-msgid "Business"
-msgstr "Üzleti"
-
-#: addressbook/contact-editor/e-contact-editor.c:1322
-msgid "Business 2"
-msgstr "2. Üzleti"
-
-#: addressbook/contact-editor/e-contact-editor.c:1323
-msgid "Business Fax"
-msgstr "Üzleti fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1324
-msgid "Callback"
-msgstr "Visszahívás"
-
-#: addressbook/contact-editor/e-contact-editor.c:1325
-msgid "Car"
-msgstr "Autó"
-
-#: addressbook/contact-editor/e-contact-editor.c:1326
-msgid "Company"
-msgstr "Vállalat"
-
-#: addressbook/contact-editor/e-contact-editor.c:1327
-#: addressbook/contact-editor/e-contact-editor.c:1426
-msgid "Home"
-msgstr "Otthoni"
-
-#: addressbook/contact-editor/e-contact-editor.c:1328
-msgid "Home 2"
-msgstr "2. Otthoni"
-
-#: addressbook/contact-editor/e-contact-editor.c:1329
-msgid "Home Fax"
-msgstr "Otthoni fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1330
-msgid "ISDN"
-msgstr "ISDN"
-
-#: addressbook/contact-editor/e-contact-editor.c:1331
-msgid "Mobile"
-msgstr "Mobil"
-
-#: addressbook/contact-editor/e-contact-editor.c:1332
-#: addressbook/contact-editor/e-contact-editor.c:1427
-#: mail/mail-config.glade.h:27
-msgid "Other"
-msgstr "Más"
-
-#: addressbook/contact-editor/e-contact-editor.c:1333
-msgid "Other Fax"
-msgstr "Egyéb fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1334
-msgid "Pager"
-msgstr "Személyhívó"
-
-#: addressbook/contact-editor/e-contact-editor.c:1335
-msgid "Primary"
-msgstr "Elsõdleges"
-
-#: addressbook/contact-editor/e-contact-editor.c:1336
-msgid "Radio"
-msgstr "Rádió"
-
-#: addressbook/contact-editor/e-contact-editor.c:1337
-msgid "Telex"
-msgstr "Telex"
-
-#: addressbook/contact-editor/e-contact-editor.c:1338
-msgid "TTY/TDD"
-msgstr "TTY/TDD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1382
-msgid "Primary Email"
-msgstr "Elsõdleges email"
-
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Email 2"
-msgstr "2. email"
-
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Email 3"
-msgstr "3. email"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:7
-msgid ""
-"Are you sure you want\n"
-"to delete this contact?"
-msgstr ""
-"Tényleg törölni akarod\n"
-"ezt a névjegyet?"
-
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:9
-msgid "Delete Contact?"
-msgstr "Névjegy törlése?"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "Hozzá_ad"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "Telefon típusok"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "Új telefon típus"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91 mail/mail-config.glade.h:11
-#: mail/mail-config.glade.h:16 mail/mail-config.glade.h:22
-msgid "Add"
-msgstr "Hozzáad"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "Névjegy szerkesztõ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "_Teljes név..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "Fájl mint:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Weblap cím:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "_HTML levelet kér"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Cím:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "Ü_zleti"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "_Otthoni"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "Üzleti _fax"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "_Mobil"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "Üz_leti"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "Ez a _levelezési cím"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "_Névjegyek..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:26
-msgid "Ca_tegories..."
-msgstr "Ka_tegóriák..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr "_Beosztás"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "_Vállalat:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:18
-msgid "General"
-msgstr "Alap"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "_Osztály:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "_Hivatal:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "_Foglalkozás:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "Be_cenév:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr "Háza_stárs:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "Születésna_p:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr "_Asszisztens neve:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "_Fõnök neve:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "É_vforduló:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "Felje_gyzések:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:33
-msgid "Details"
-msgstr "Részletek"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "A teljes név ellenõrzése"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "_Beosztás:"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "_Keresztnév:"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "_Utónév:"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "_Vezetéknév:"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "_Elõtag:"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Dr.\n"
-"Prof.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"Ifj.\n"
-"Özv.\n"
-
-#: addressbook/gui/component/addressbook.c:421
-#: calendar/gui/calendar-commands.c:545
-msgid "New"
-msgstr "Új"
-
-#: addressbook/gui/component/addressbook.c:421
-msgid "Create a new contact"
-msgstr "Egy új névjegy készítése"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Find"
-msgstr "Keres"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Find a contact"
-msgstr "Névjegy keresése"
-
-#: addressbook/gui/component/addressbook.c:426
-#: calendar/gui/calendar-commands.c:549 mail/folder-browser-factory.c:38
-msgid "Print"
-msgstr "Nyomtat"
-
-#: addressbook/gui/component/addressbook.c:426
-msgid "Print contacts"
-msgstr "Névjegyek nyomtatása"
-
-#: addressbook/gui/component/addressbook.c:427
-msgid "Delete a contact"
-msgstr "Névjegy törlése"
-
-#: addressbook/gui/component/addressbook.c:495
-msgid "_Print Contacts..."
-msgstr "_Névjegyek nyomtatása..."
-
-#: addressbook/gui/component/addressbook.c:505
-#: addressbook/gui/component/addressbook.c:1044
-msgid "As _Table"
-msgstr "_Táblázatként"
-
-#: addressbook/gui/component/addressbook.c:512
-msgid "_New Contact"
-msgstr "Ú_j névjegy"
-
-#: addressbook/gui/component/addressbook.c:520
-msgid "N_ew Directory Server"
-msgstr "Ú_j címtár szerver"
-
-#: addressbook/gui/component/addressbook.c:603
-msgid "Unable to open addressbook"
-msgstr "Nem tudom megnyitni a címjegyzéket"
-
-#: addressbook/gui/component/addressbook.c:608
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-"Nem tudom a címjegyzéket megnyitni. Ez azt jelenti,\n"
-"hogy hibás URI-t írtál be, vagy egy LDAP szervert\n"
-"szeretnél elérni, és nincs LDAP támogatás befordítva.\n"
-"Ha URI-t írtál be, ellenõrizd az URI-t elírás vagy\n"
-"helytelen szintaktika szempontjából. Ha nem,\n"
-"lehet, hogy egy LDAP szervert kéne elérned. Ha szeretnél\n"
-"használni egy LDAP szervert, le kell töltened és\n"
-"telepítened az OpenLDAP csomagot, és újrafordítani az Evolúciót.\n"
-
-#: addressbook/gui/component/addressbook.c:948
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr "VCard-ként mentés"
-
-#: addressbook/gui/component/addressbook.c:1015
-msgid "* Click here to add a contact *"
-msgstr "* Kattints ide névjegy hozzáadásához *"
-
-#: addressbook/gui/component/addressbook.c:1051
-msgid "As _Minicards"
-msgstr "_Kártyákként"
-
-#: addressbook/gui/component/addressbook.c:1102
-msgid "The URI that the Folder Browser will display"
-msgstr "Az URI amit a Mappa Böngészõ meg fog nyitni"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "2.ablak"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "k"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#: addressbook/gui/component/e-ldap-storage.c:87
-msgid "External Directories"
-msgstr "Külsõ könyvtárak"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "Leírás:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "LDAP szerver:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Portszám:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr "Root DN:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Név:"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"Nincsenek elemek, amiket meg lehetne mutatni\n"
-"\n"
-"Új névjegy készítéséhez kattints kettõt ide."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "Oldal beállítás:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Stílus neve:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "Elõnézet:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "Beállítások"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Beleértve:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "Szekciók:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr "Rögtön egymás után következnek"
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr "Levél címkék minden lapon"
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "Fejléc minden levélnek"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "Új lapon kezdd"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Oszlopok száma:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "A végén a formok ürítése:"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "Betûtípusok"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "Betûtípus..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "Fejlécek"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "Törzs"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "Árnyalás"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "Nyomatás szürkeskálás árnyalással"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "Formátum"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Papír"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Típus"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr "label26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Dimenziók:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Szélesség:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Magasság:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "Papír forrás:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "Margók"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Felsõ:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Alsó:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Bal:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Jobb:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "Lap"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Méret:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Elhelyezkedés"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "Álló"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "Fekvõ"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "Fejléc"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "Lábléc:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "Páros lapokon fordított"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "Fejléc/lábléc"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:544
-msgid "am"
-msgstr "de"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:543
-msgid "pm"
-msgstr "du"
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr "Körvonal:"
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr "Fejlécek:"
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr "Üres napok:"
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Appointments:"
-msgstr "Megbeszélések:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr "Kiemelt nap:"
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr "Nap számozás:"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr "Jelenlegi nap száma:"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr "Tennivaló, ami még nem járt le:"
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr "Tennivaló, ami ma jár le:"
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr "Tennivaló, ami lejárt:"
-
-#: calendar/gui/calendar-commands.c:176
-msgid "Gnome Calendar"
-msgstr "Gnome Naptár"
-
-#: calendar/gui/calendar-commands.c:179
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "GNOME személyi naptár és idõzítõ menedzser."
-
-#: calendar/gui/calendar-commands.c:435
-msgid "File not found"
-msgstr "Nem találom a fájlt"
-
-#: calendar/gui/calendar-commands.c:457
-msgid "Open calendar"
-msgstr "Naptár megnyitása"
-
-#: calendar/gui/calendar-commands.c:496
-msgid "Save calendar"
-msgstr "Naptár mentése"
-
-#: calendar/gui/calendar-commands.c:523 calendar/gui/gncal-todo.c:722
-#: calendar/gui/gncal-todo.c:726
-msgid "Day"
-msgstr "Nap"
-
-#: calendar/gui/calendar-commands.c:523
-msgid "Show 1 day"
-msgstr "Egy napot mutass"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "5 Days"
-msgstr "5 nap"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Show the working week"
-msgstr "A munkahetet mutasd"
-
-#: calendar/gui/calendar-commands.c:529 calendar/gui/gncal-todo.c:721
-msgid "Week"
-msgstr "Hét"
-
-#: calendar/gui/calendar-commands.c:529
-msgid "Show 1 week"
-msgstr "Egy hét mutatása"
-
-#: calendar/gui/calendar-commands.c:532
-msgid "Month"
-msgstr "Hónap"
-
-#: calendar/gui/calendar-commands.c:532
-msgid "Show 1 month"
-msgstr "Egy hónap mutatása"
-
-#: calendar/gui/calendar-commands.c:536
-msgid "Year"
-msgstr "Év"
-
-#: calendar/gui/calendar-commands.c:536
-msgid "Show 1 year"
-msgstr "Egy év mutatása"
-
-#: calendar/gui/calendar-commands.c:545 calendar/gui/calendar-commands.c:689
-msgid "Create a new appointment"
-msgstr "Új megbeszélés készítése"
-
-#: calendar/gui/calendar-commands.c:549 calendar/gui/calendar-commands.c:681
-msgid "Print this calendar"
-msgstr "A naptár nyomtatása"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Prev"
-msgstr "Elõzõ"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go back in time"
-msgstr "Vissza az idõben"
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Today"
-msgstr "Ma"
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go to present time"
-msgstr "Jelenidõre ugrás"
-
-#: calendar/gui/calendar-commands.c:555
-msgid "Next"
-msgstr "Köv."
-
-#: calendar/gui/calendar-commands.c:555
-msgid "Go forward in time"
-msgstr "Elõre az idõben"
-
-#: calendar/gui/calendar-commands.c:559
-msgid "Go to"
-msgstr "Menj..."
-
-#: calendar/gui/calendar-commands.c:559
-msgid "Go to a specific date"
-msgstr "Megadott idõpontra ugrás"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:666
-msgid "New Ca_lendar"
-msgstr "Új nap_tár"
-
-#: calendar/gui/calendar-commands.c:667
-msgid "Create a new calendar"
-msgstr "Új naptár készítése"
-
-#: calendar/gui/calendar-commands.c:670
-msgid "Open Ca_lendar"
-msgstr "Naptár megnyitá_sa"
-
-#: calendar/gui/calendar-commands.c:671
-msgid "Open a calendar"
-msgstr "Naptár megnyitása"
-
-#: calendar/gui/calendar-commands.c:675 calendar/gui/calendar-commands.c:676
-msgid "Save Calendar As"
-msgstr "Naptár mentése mint"
-
-#: calendar/gui/calendar-commands.c:689
-msgid "_New appointment..."
-msgstr "Új _idõpont"
-
-#: calendar/gui/calendar-commands.c:694
-msgid "New appointment for _today..."
-msgstr "Új megbeszélés _mára..."
-
-#: calendar/gui/calendar-commands.c:695
-msgid "Create a new appointment for today"
-msgstr "Mára új megbeszélés betétele"
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/prop.c:716
-msgid "Preferences"
-msgstr "Beállítások"
-
-#: calendar/gui/calendar-commands.c:710 calendar/gui/calendar-commands.c:711
-msgid "About Calendar"
-msgstr "Naptár névjegy"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:753
-#, c-format
-msgid "%s%s"
-msgstr "%s%s"
-
-#: calendar/gui/calendar-commands.c:753
-msgid "'s calendar"
-msgstr "naptára"
-
-#: calendar/gui/calendar-model.c:452
-#, c-format
-msgid ""
-"The date must be entered in the format: \n"
-"\n"
-"%s"
-msgstr ""
-"A dátumot a következõ formában tudod beírni: \n"
-"\n"
-"%s"
-
-#: calendar/gui/calendar-model.c:525
-msgid ""
-"The geographical position must be entered in the format: \n"
-"\n"
-"45.436845,125.862501"
-msgstr ""
-"A földrajzi pozíció megadása a következõ formátumban lehetséges: \n"
-"\n"
-"45.436845,125.862501"
-
-#: calendar/gui/calendar-model.c:570
-msgid "The percent value must be between 0 and 100"
-msgstr "A százalékos érték 0 és 100 között lehet csak"
-
-#: calendar/gui/calendar-model.c:603
-msgid "The priority must be between 0 and 10"
-msgstr "A prioritás 0 és 10 között lehet"
-
-#: calendar/gui/control-factory.c:136
-msgid "The URI that the calendar will display"
-msgstr "Az URI amit a naptár megjelenít"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:183
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "Riasztás idõpontja: %A %b %d %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:190
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr "Találkozó figyelmeztetés: %A %b %d %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:201
-msgid "No summary available."
-msgstr "Nincs elérhetõ összegzés."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "Bezár"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1070
-msgid "Snooze"
-msgstr "Szundi"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "_Idõpont szerkesztése"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr "Szundi idõ (percek)"
-
-#: calendar/gui/dialogs/task-editor.c:245 calendar/gui/event-editor.c:1198
-msgid "FIXME: _Delete"
-msgstr "FIXME: _Töröl"
-
-#: calendar/gui/dialogs/task-editor.c:287
-#: calendar/gui/dialogs/task-editor.c:295
-msgid "FIXME: In_complete Task"
-msgstr "FIXME: _Nem teljesített feladat"
-
-#: calendar/gui/dialogs/task-editor.c:347 calendar/gui/event-editor.c:1300
-msgid "FIXME: Chec_k Names"
-msgstr "FIXME: Nevek _ellenõrzése"
-
-#: calendar/gui/dialogs/task-editor.c:348 calendar/gui/event-editor.c:1301
-msgid "FIXME: Address _Book..."
-msgstr "FIXME: _Címjegyzék..."
-
-#: calendar/gui/dialogs/task-editor.c:355
-msgid "FIXME: _New Task"
-msgstr "FIXME: Ú_j feladat"
-
-#: calendar/gui/dialogs/task-editor.c:357
-msgid "FIXME: S_end Status Report"
-msgstr "FIXME: Státusz jelentés _elküldése"
-
-#: calendar/gui/dialogs/task-editor.c:358
-msgid "FIXME: _Mark Complete"
-msgstr "FIXME: _Teljesítettnek jelöl"
-
-#: calendar/gui/dialogs/task-editor.c:360 calendar/gui/event-editor.c:1310
-msgid "FIXME: Rec_urrence..."
-msgstr "FIXME: Ismétlõ_dés..."
-
-#: calendar/gui/dialogs/task-editor.c:361
-msgid "FIXME: S_kip Occurrence"
-msgstr "FIXME: Ismétlõdés _kihagyása..."
-
-#: calendar/gui/dialogs/task-editor.c:363
-msgid "FIXME: Assig_n Task"
-msgstr "FIXME: _Feladat hozzárendelése"
-
-#: calendar/gui/dialogs/task-editor.c:365
-msgid "FIXME: _Reply"
-msgstr "FIXME: _Válasz"
-
-#: calendar/gui/dialogs/task-editor.c:366
-msgid "FIXME: Reply to A_ll"
-msgstr "FIXME: M_indenkinek"
-
-#: calendar/gui/dialogs/task-editor.c:409 calendar/gui/event-editor.c:1370
-msgid "FIXME: Save and Close"
-msgstr "FIXME: Ment és bezár"
-
-#: calendar/gui/dialogs/task-editor.c:410
-msgid "Save the task and close the dialog box"
-msgstr "A feladat mentése és a párbeszédablak bezárása"
-
-#: calendar/gui/dialogs/task-editor.c:414 calendar/gui/event-editor.c:1375
-msgid "FIXME: Print..."
-msgstr "FIXME: Nyomtat..."
-
-#: calendar/gui/dialogs/task-editor.c:419 calendar/gui/event-editor.c:1380
-msgid "FIXME: Recurrence..."
-msgstr "FIXME: Ismétlõdés..."
-
-#: calendar/gui/dialogs/task-editor.c:420 calendar/gui/event-editor.c:1381
-msgid "Configure recurrence rules"
-msgstr "Ismétlõdési szabályok beállítása"
-
-#: calendar/gui/dialogs/task-editor.c:422
-msgid "FIXME: Assign Task..."
-msgstr "FIXME: Feladat hozzáadása"
-
-#: calendar/gui/dialogs/task-editor.c:423
-msgid "Assign the task to someone"
-msgstr "Feladat rendelése valakihez"
-
-#: calendar/gui/dialogs/task-editor.c:425 calendar/gui/event-editor.c:1386
-msgid "FIXME: Delete"
-msgstr "FIXME: Töröl"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:7
-msgid "S_ubject:"
-msgstr "Té_ma:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:8
-msgid "Owner:"
-msgstr "Tulaj:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:9
-msgid "Sta_rt Date:"
-msgstr "Ke_zdési dátum:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:10
-msgid "_Due Date:"
-msgstr "Le_járat:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:11
-msgid "_Status:"
-msgstr "_Státusz:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:12
-msgid ""
-"Not Started\n"
-"In Progress\n"
-"Completed\n"
-"Cancelled\n"
-msgstr ""
-"Nem indult még el\n"
-"Folyamatban van\n"
-"Befejezõdött\n"
-"Törölve\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:17
-msgid "Not Started"
-msgstr "Nem indult még el"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:18
-msgid "_Priority:"
-msgstr "_Prioritás:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:19
-msgid ""
-"High\n"
-"Normal\n"
-"Low\n"
-msgstr ""
-"Magas\n"
-"Normális\n"
-"Alacsony\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:23
-msgid "High"
-msgstr "Magas"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:24
-msgid "% Comp_lete:"
-msgstr "% kész:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:25
-msgid "_Contacts..."
-msgstr "_Névjegyek..."
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:27
-msgid "Private"
-msgstr "Személyes"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:28
-msgid "Task"
-msgstr "Feladat"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:29
-msgid "Date Completed:"
-msgstr "Teljesítés dátuma:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:30
-msgid "Location:"
-msgstr "Hely:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:31
-msgid "URL:"
-msgstr "URL:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:32
-msgid "Resources:"
-msgstr "Források:"
-
-#: calendar/gui/e-calendar-table.c:189
-msgid "Comment"
-msgstr "Megjegyzés"
-
-#: calendar/gui/e-calendar-table.c:194
-msgid "Completed"
-msgstr "Elvégezve"
-
-#: calendar/gui/e-calendar-table.c:199
-msgid "Created"
-msgstr "Létrehozva"
-
-#: calendar/gui/e-calendar-table.c:204
-msgid "Description"
-msgstr "Leírás"
-
-#: calendar/gui/e-calendar-table.c:209
-msgid "Timestamp"
-msgstr "Idõbélyeg"
-
-#: calendar/gui/e-calendar-table.c:214
-msgid "Start Date"
-msgstr "Kezdés dátuma"
-
-#: calendar/gui/e-calendar-table.c:219
-msgid "End Date"
-msgstr "Végdátum"
-
-#: calendar/gui/e-calendar-table.c:224
-msgid "Geographical Position"
-msgstr "Földrajzi pozíció"
-
-#: calendar/gui/e-calendar-table.c:229
-msgid "Last Modification Date"
-msgstr "Az utolsó módosítás dátuma"
-
-#: calendar/gui/e-calendar-table.c:234
-msgid "Location"
-msgstr "Hely"
-
-#: calendar/gui/e-calendar-table.c:239
-msgid "Organizer"
-msgstr "Rendezõ"
-
-#: calendar/gui/e-calendar-table.c:244
-msgid "% Complete"
-msgstr "% kész"
-
-#: calendar/gui/e-calendar-table.c:249 calendar/gui/gncal-todo.c:436
-#: calendar/gui/prop.c:609 mail/message-list.c:484
-msgid "Priority"
-msgstr "Prioritás"
-
-#: calendar/gui/e-calendar-table.c:260
-msgid "TaskPad"
-msgstr "FeladatTábla"
-
-#: calendar/gui/e-calendar-table.c:265
-msgid "URL"
-msgstr "URL"
-
-#: calendar/gui/e-calendar-table.c:270
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "Reminder"
-msgstr "Emlékeztetõ"
-
-#: calendar/gui/e-calendar-table.c:369
-msgid "Open..."
-msgstr "Megnyit..."
-
-#: calendar/gui/e-calendar-table.c:370
-msgid "Open the task"
-msgstr "A feladat megnyitása"
-
-#: calendar/gui/e-calendar-table.c:372
-msgid "Mark Complete"
-msgstr "Késznek jelöl"
-
-#: calendar/gui/e-calendar-table.c:373
-msgid "Mark the task complete"
-msgstr "Megjelölés mint kész feladat"
-
-#: calendar/gui/e-calendar-table.c:376
-msgid "Delete the task"
-msgstr "A feladat törlése"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr "%02i perces osztás"
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "Új _idõpont"
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "A megbeszélés szerkesztése..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "A megbeszélés törlése"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "A megbeszélés mozgathatóvá tétele"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr "A megjelenés törlése"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr "Az összes megjelenés törlése"
-
-#: calendar/gui/event-editor.c:291
-msgid "Edit Appointment"
-msgstr "Megbeszélés szerkesztése"
-
-#: calendar/gui/event-editor.c:296
-msgid "No summary"
-msgstr "Nincs összegzés"
-
-#: calendar/gui/event-editor.c:300
-#, c-format
-msgid "Appointment - %s"
-msgstr "Idõpont - %s"
-
-#: calendar/gui/event-editor.c:303
-#, c-format
-msgid "Task - %s"
-msgstr "Feladat - %s"
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Journal entry - %s"
-msgstr "Napló bejegyzés - %s"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:622 calendar/gui/event-editor.c:718
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Ca_lendar..."
-msgstr "FIXME: Nap_tár..."
-
-#: calendar/gui/event-editor.c:1308
-msgid "FIXME: _New Appointment"
-msgstr "FIXME: Új _megbeszélés"
-
-#: calendar/gui/event-editor.c:1312
-msgid "FIXME: Invite _Attendees..."
-msgstr "FIXME: Hallgatók meghívása..."
-
-#: calendar/gui/event-editor.c:1313
-msgid "FIXME: C_ancel Invitation..."
-msgstr "FIXME: Meghívás törlése..."
-
-#: calendar/gui/event-editor.c:1315
-msgid "FIXME: Forward as v_Calendar"
-msgstr "FIXME: v_Calendar-ként továbbítás"
-
-#: calendar/gui/event-editor.c:1383
-msgid "FIXME: Invite Attendees..."
-msgstr "FIXME: Hallgatók meghívása..."
-
-#: calendar/gui/event-editor.c:1384
-msgid "Invite attendees to a meeting"
-msgstr "Megbeszélésre hallgatók meghívása"
-
-#: calendar/gui/event-editor.c:1828
-msgid "%a %b %d %Y"
-msgstr "%a %b %d %Y"
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr "event-editor-dialog"
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr "Ö_sszegzés:"
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr "_Tulaj:"
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr "Idõ"
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr "Kezdési idõ:"
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr "Vég idõpont:"
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr "Minden napos esemény"
-
-#: calendar/gui/event-editor-dialog.glade.h:14
-msgid "Classification"
-msgstr "Besorolás"
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-msgid "Pu_blic"
-msgstr "Nyil_vános"
-
-#: calendar/gui/event-editor-dialog.glade.h:16
-msgid "Pri_vate"
-msgstr "Szemé_lyes"
-
-#: calendar/gui/event-editor-dialog.glade.h:17
-msgid "_Confidential"
-msgstr "_Bizalmas"
-
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-"Perc\n"
-"Óra\n"
-"Nap\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "_Display"
-msgstr "_Megjelenít"
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Audio"
-msgstr "_Hang"
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "_Program"
-msgstr "_Program"
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "_Mail"
-msgstr "_Levél"
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-msgid "Mail _to:"
-msgstr "Levél _valakinek:"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Run program:"
-msgstr "_Program indítása:"
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr "Ismétlõdési szabály"
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:736
-msgid "None"
-msgstr "Semmi"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-msgid "Daily"
-msgstr "Naponta"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr "Hetente"
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr "Havonta"
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr "Évente"
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr "label23"
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr "Minden "
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr "nap"
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr "label24"
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr "héten"
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "Hé"
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "Ke"
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "Sze"
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "Csü"
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "Pé"
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "Szo"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "Va"
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr "label25"
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr "Ismétlõdik"
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr "-ik napján a hónapnak"
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-"1.\n"
-"2.\n"
-"3.\n"
-"4.\n"
-"5.\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-"Hétfõ\n"
-"Kedd\n"
-"Szerda\n"
-"Csütörtök\n"
-"Péntek\n"
-"Szombat\n"
-"Vasárnap\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr "Minden"
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-msgid "month(s)"
-msgstr "hónapban"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr "évben"
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr "label27"
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr "Végdátum"
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr "Örökké ismétlõdjön"
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr "Vége ha "
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr "Vége ezután:"
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr "megjelenés"
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-msgid "Exceptions"
-msgstr "Kivételek"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-msgid "Change"
-msgstr "Csere"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr "Ismétlõdés"
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "január"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "február"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "március"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "április"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "május"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "június"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "július"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "augusztus"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "szeptember"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "szept"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "október"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "november"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "december"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "vasárnap"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "hétfõ"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "kedd"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "kedd"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "szerda"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "szerda"
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "csütörtök"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "csüt"
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "csüt"
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "péntek"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "szombat"
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr "év"
-
-#: calendar/gui/getdate.y:421
-msgid "month"
-msgstr "hónap"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr "két hét"
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr "hét"
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr "nap"
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr "óra"
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr "perc"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "perc"
-
-#: calendar/gui/getdate.y:428
-msgid "second"
-msgstr "másodperc"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "mp"
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "holnap"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "tegnap"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "ma"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr "most"
-
-#: calendar/gui/getdate.y:439
-msgid "last"
-msgstr "utolsó"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr "ez"
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr "következõ"
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr "elsõ"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr "harmadik"
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr "negyedik"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr "ötödik"
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr "hatodik"
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr "hetedik"
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr "nyolcadik"
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr "kilencedik"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr "tizedik"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr "tizenegyedik"
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr "tizenkettedik"
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr "óta"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Create to-do item"
-msgstr "Tennivaló készítése"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Edit to-do item"
-msgstr "Tennivaló szerkesztése"
-
-#: calendar/gui/gncal-todo.c:176
-msgid "Summary:"
-msgstr "Összegzés:"
-
-#: calendar/gui/gncal-todo.c:186
-msgid "Due Date:"
-msgstr "Lejárat:"
-
-#: calendar/gui/gncal-todo.c:195
-msgid "Priority:"
-msgstr "Prioritás:"
-
-#: calendar/gui/gncal-todo.c:212
-msgid "Item Comments:"
-msgstr "Megjegyzések:"
-
-#: calendar/gui/gncal-todo.c:334
-msgid "Add to-do item..."
-msgstr "Tennivaló hozzáadása..."
-
-#: calendar/gui/gncal-todo.c:335
-msgid "Edit this item..."
-msgstr "Elem szerkesztése..."
-
-#: calendar/gui/gncal-todo.c:434
-msgid "Summary"
-msgstr "Összegzés"
-
-#: calendar/gui/gncal-todo.c:435 calendar/gui/prop.c:608
-msgid "Due Date"
-msgstr "Lejárat"
-
-#: calendar/gui/gncal-todo.c:437
-msgid "Time Left"
-msgstr "Hátra van"
-
-#. Label
-#: calendar/gui/gncal-todo.c:449
-msgid "To-do list"
-msgstr "Lejárat"
-
-#. Add
-#: calendar/gui/gncal-todo.c:488
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Hozzáad..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:497
-msgid "Edit..."
-msgstr "Szerkeszt..."
-
-#: calendar/gui/gncal-todo.c:721
-msgid "Weeks"
-msgstr "Hetek"
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Days"
-msgstr "Napok"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hours"
-msgstr "Órák"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hour"
-msgstr "Óra"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minutes"
-msgstr "Percek"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minute"
-msgstr "Perc"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Seconds"
-msgstr "Másodpercek"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Second"
-msgstr "Másodperc"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1078
-#: calendar/gui/gnome-cal.c:1134
-msgid "Reminder of your appointment at "
-msgstr "A találkozód figyelmeztetõ üzenete:"
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1083 calendar/gui/gnome-cal.c:1138
-msgid "Ok"
-msgstr "Ok"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "Év:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "Dátumra ugrás"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-"Kérlek válassz egy dátumot amire lépni akarsz.\n"
-"Ha egy napra kattintassz, arra a dátumra leszel\n"
-"téve."
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "Ugorj mára"
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr "1."
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr "2."
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr "3."
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr "4."
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr "5."
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr "6."
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr "7."
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr "8."
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr "9."
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr "10."
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr "11."
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr "12."
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr "13."
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr "14."
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr "15."
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr "16."
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr "17."
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr "18."
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr "19."
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr "20."
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr "21."
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr "22."
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr "23."
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr "24."
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr "25."
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr "26."
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr "27."
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr "28."
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr "29."
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr "30."
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr "31."
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr "V"
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr "H"
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr "K"
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr "Sze"
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr "Cs"
-
-#: calendar/gui/print.c:326
-msgid "Fr"
-msgstr "P"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr "Szo"
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr "Tennivaló elemek"
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr "Mai nap (%a %b %d %Y)"
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr "%a"
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "Aktuális hét (%s %s %d - %s %d %d)"
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "Aktuális hét (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "Aktuális hét (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr "Aktuális hónap (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr "Ezév (%Y)"
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr "Naptár nyomtatása"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr "Nyomtatási elõnézet"
-
-#: calendar/gui/prop.c:334
-msgid "Time display"
-msgstr "Idõ mutatása"
-
-#. Time format
-#: calendar/gui/prop.c:338
-msgid "Time format"
-msgstr "Idõ formátum"
-
-#: calendar/gui/prop.c:339
-msgid "12-hour (AM/PM)"
-msgstr "12 órás (de/du)"
-
-#: calendar/gui/prop.c:340
-msgid "24-hour"
-msgstr "24 órás"
-
-#. Weeks start on
-#: calendar/gui/prop.c:350
-msgid "Weeks start on"
-msgstr "A hetek kezdete"
-
-#: calendar/gui/prop.c:351
-msgid "Sunday"
-msgstr "Vasárnap"
-
-#: calendar/gui/prop.c:352
-msgid "Monday"
-msgstr "Hétfõ"
-
-#. Day range
-#: calendar/gui/prop.c:362
-msgid "Day range"
-msgstr "Nap tartomány"
-
-#: calendar/gui/prop.c:373
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-"Kérlek add meg, hogy mikor kezdõdjön és mikor\n"
-"fejezõdjön be a nap és a hét.\n"
-"Az ezen kívülesõ idõpontok nem lesznek\n"
-"megjelenítve."
-
-#: calendar/gui/prop.c:389
-msgid "Day start:"
-msgstr "Nap kezdete:"
-
-#: calendar/gui/prop.c:400
-msgid "Day end:"
-msgstr "Nap vége:"
-
-#: calendar/gui/prop.c:523
-msgid "Colors for display"
-msgstr "Megjelenítés színei"
-
-#: calendar/gui/prop.c:526
-msgid "Colors"
-msgstr "Színek"
-
-#: calendar/gui/prop.c:603
-msgid "Show on TODO List:"
-msgstr "Tennivaló lista mutatása:"
-
-#: calendar/gui/prop.c:610
-msgid "Time Until Due"
-msgstr "Lejáratig hátralévõ idõ"
-
-#: calendar/gui/prop.c:641
-msgid "To Do List style options:"
-msgstr "Tennivaló lista stílus beállításai:"
-
-#: calendar/gui/prop.c:646
-msgid "Highlight overdue items"
-msgstr "Lejárt elemek kivilágítása"
-
-#: calendar/gui/prop.c:649
-msgid "Highlight not yet due items"
-msgstr "Világísd ki a még nem lejárt elemeket"
-
-#: calendar/gui/prop.c:652
-msgid "Highlight items due today"
-msgstr "A ma lejáró elemek kivilágítása"
-
-#: calendar/gui/prop.c:682
-msgid "To Do List Properties"
-msgstr "Tennivaló lista beállításai"
-
-#: calendar/gui/prop.c:685
-msgid "To Do List"
-msgstr "Tennivaló lista"
-
-#: calendar/gui/prop.c:784
-msgid "Alarms"
-msgstr "Ébresztõk"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:787
-msgid "Alarm Properties"
-msgstr "Ébresztõ beállítások"
-
-#: calendar/gui/prop.c:797
-msgid "Beep on display alarms"
-msgstr "Ébresztõ kiírásánál csipogj"
-
-#: calendar/gui/prop.c:807
-msgid "Audio alarms timeout after"
-msgstr "Hang ébreszés idõzítése"
-
-#: calendar/gui/prop.c:818 calendar/gui/prop.c:835
-msgid " seconds"
-msgstr " másodperc után"
-
-#: calendar/gui/prop.c:824
-msgid "Enable snoozing for "
-msgstr "Szundi engedése"
-
-#. populate default frame/box
-#: calendar/gui/prop.c:840
-msgid "Defaults"
-msgstr "Alapértelmezett"
-
-#: composer/e-msg-composer-address-dialog.c:182
-msgid "Cut"
-msgstr "Kivág"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut selected item into clipboard"
-msgstr "Kivágja a kiválasztott elemet a vágólapra"
-
-#: composer/e-msg-composer-address-dialog.c:186
-msgid "Copy"
-msgstr "Másol"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy selected item into clipboard"
-msgstr "Másolja a kiválasztott elemet a vágólapra"
-
-#: composer/e-msg-composer-address-dialog.c:190
-#: composer/e-msg-composer-address-dialog.c:198
-msgid "Paste"
-msgstr "Beilleszt"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste item from clipboard"
-msgstr "Beilleszti az elemet a vágólapról"
-
-#: composer/e-msg-composer-address-dialog.c:525
-msgid "Select recipients' addresses"
-msgstr "A címzettek címeinek kiválasztása"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Címzett lista:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Keres..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Név"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-#: mail/mail-config.glade.h:8
-msgid "Address"
-msgstr "Cím"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Tulajdonságok..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "To: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "label9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "label7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "label8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 bájt"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bájt"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Csatolás hozzáadása"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Törlés"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Törli a kiválasztott elemeket a csatolási listáról"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Csatol..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Csatolj egy fájlt a levélhez"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "Csatolás beállítások"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "MIME típus:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "Fájlnév:"
-
-#: composer/e-msg-composer-hdrs.c:137 composer/e-msg-composer-hdrs.c:295
-msgid "From:"
-msgstr "Feladó:"
-
-#: composer/e-msg-composer-hdrs.c:243
-msgid "Click here for the address book"
-msgstr "Címjegyzékben való kereséshez kattints ide"
-
-#: composer/e-msg-composer-hdrs.c:296
-msgid "Enter the identitiy you wish to send this message from"
-msgstr "Írd be a leveleid feladóját, amilyen címrõl levelezel"
-
-#: composer/e-msg-composer-hdrs.c:300
-msgid "To:"
-msgstr "To:"
-
-#: composer/e-msg-composer-hdrs.c:301
-msgid "Enter the recipients of the message"
-msgstr "Írd be a levél címzettjét"
-
-#: composer/e-msg-composer-hdrs.c:305
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:306
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Írd be, kik kapjanak másolatot a levélrõl"
-
-#: composer/e-msg-composer-hdrs.c:311
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:312
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Írd be azokat a címeket, akik rejtett másolatot kapnak a levélrõl, azaz a "
-"címzettnél nem jelenik meg a címük"
-
-#: composer/e-msg-composer-hdrs.c:318
-msgid "Subject:"
-msgstr "Téma:"
-
-#: composer/e-msg-composer-hdrs.c:319
-msgid "Enter the subject of the mail"
-msgstr "Írd be a levél címét (subject)"
-
-#: composer/e-msg-composer.c:450
-msgid "Save as..."
-msgstr "Ment mint..."
-
-#: composer/e-msg-composer.c:461
-#, c-format
-msgid "Error saving file: %s"
-msgstr "Fájl mentési hiba: %s"
-
-#: composer/e-msg-composer.c:481
-#, c-format
-msgid "Error loading file: %s"
-msgstr "Fájl betöltési hiba: %s"
-
-#: composer/e-msg-composer.c:534 shell/e-shell-view-menu.c:164
-msgid "Evolution"
-msgstr "Evolúció"
-
-#: composer/e-msg-composer.c:540
-msgid ""
-"This message has not been sent.\n"
-"\n"
-"Do you wish to save your changes?"
-msgstr ""
-"A levél nem lett elküldve.\n"
-"\n"
-"Menteni akarod a változásaidat?"
-
-#: composer/e-msg-composer.c:563
-msgid "Open file"
-msgstr "Fájl megnyitás"
-
-#: composer/e-msg-composer.c:675
-msgid "That file does not exist."
-msgstr "A fájl nem létezik."
-
-#: composer/e-msg-composer.c:685
-msgid "That is not a regular file."
-msgstr "Nem sima fájl."
-
-#: composer/e-msg-composer.c:695
-msgid "That file exists but is not readable."
-msgstr "Az a fájl létezik, de nem olvasható."
-
-#: composer/e-msg-composer.c:705
-msgid "That file appeared accesible but open(2) failed."
-msgstr "A fájl elérhetõnek látszik, de open(2) hiba történt."
-
-#: composer/e-msg-composer.c:727
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"A fájl túl nagy (100K fölötti).\n"
-"Tényleg be szeretnéd szúrni?"
-
-#: composer/e-msg-composer.c:748
-msgid "An error occurred while reading the file."
-msgstr "Hiba történt megnyitás közben."
-
-#: composer/e-msg-composer.c:844 shell/e-shell-view-menu.c:433
-msgid "_File"
-msgstr "_Fájl"
-
-#: composer/e-msg-composer.c:850
-msgid "_Open..."
-msgstr "_Megnyit..."
-
-#: composer/e-msg-composer.c:851
-msgid "Load a previously saved message"
-msgstr "Elõzõleg mentett üzenet betöltése"
-
-#: composer/e-msg-composer.c:859
-msgid "_Save..."
-msgstr "_Ment..."
-
-#: composer/e-msg-composer.c:860
-msgid "Save message"
-msgstr "Levél mentése"
-
-#: composer/e-msg-composer.c:868
-msgid "_Save as..."
-msgstr "_Ment mint..."
-
-#: composer/e-msg-composer.c:869
-msgid "Save message with a different name"
-msgstr "A levél elmentése másik néven"
-
-#: composer/e-msg-composer.c:877
-msgid "Save in _folder..."
-msgstr "Mentsd _mappába"
-
-#: composer/e-msg-composer.c:878
-msgid "Save the message in a specified folder"
-msgstr "A levél elmentése másik mappába"
-
-#: composer/e-msg-composer.c:887
-msgid "_Insert text file... (FIXME)"
-msgstr "_Szövegfájl beillesztése (FIXME)"
-
-#: composer/e-msg-composer.c:888
-msgid "Insert a file as text into the message"
-msgstr "Fájl beillesztése szövegként"
-
-#: composer/e-msg-composer.c:897
-msgid "_Send"
-msgstr "_Elküld"
-
-#: composer/e-msg-composer.c:898
-msgid "Send the message"
-msgstr "Levél elküldése"
-
-#: composer/e-msg-composer.c:908
-msgid "_Close..."
-msgstr "_Bezár..."
-
-#: composer/e-msg-composer.c:909
-msgid "Quit the message composer"
-msgstr "Kilépés a levélszerkesztõbõl"
-
-#: composer/e-msg-composer.c:922 shell/e-shell-view-menu.c:477
-msgid "_Edit"
-msgstr "_Szerkeszt"
-
-#: composer/e-msg-composer.c:933
-msgid "_Format"
-msgstr "_Formátum"
-
-#: composer/e-msg-composer.c:939
-msgid "HTML"
-msgstr "HTML"
-
-#: composer/e-msg-composer.c:940
-msgid "Send the mail in HTML format"
-msgstr "A levelet HTML formátumban küldd"
-
-#: composer/e-msg-composer.c:953 shell/e-shell-view-menu.c:382
-#: shell/e-shell-view-menu.c:488 shell/e-storage-set-view.c:242
-msgid "_View"
-msgstr "_Nézet"
-
-#: composer/e-msg-composer.c:959
-msgid "Show _attachments"
-msgstr "Csatolások _nézete"
-
-#: composer/e-msg-composer.c:960
-msgid "Show/hide attachments"
-msgstr "Csatolások megjelenítése/elrejtése"
-
-#: composer/e-msg-composer.c:993
-msgid "Send"
-msgstr "Elküld"
-
-#: composer/e-msg-composer.c:994
-msgid "Send this message"
-msgstr "Küldd el a levelet"
-
-#: composer/e-msg-composer.c:1003
-msgid "Attach"
-msgstr "Csatolás"
-
-#: composer/e-msg-composer.c:1004
-msgid "Attach a file"
-msgstr "Fájl csatolása"
-
-#: composer/e-msg-composer.c:1191
-msgid "Compose a message"
-msgstr "Levél írása"
-
-#: filter/filter-folder.c:183 filter/vfolder-rule.c:269
-msgid "Select Folder"
-msgstr "Válassz mappát"
-
-#: filter/filter-folder.c:246
-msgid "<click here to select a folder>"
-msgstr "<kattints ide a mappa kiválasztásához>"
-
-#: mail/component-factory.c:225
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Nem tudom az Evolúció levelezõ komponensét elindítani."
-
-#: mail/folder-browser-factory.c:24
-msgid "Get mail"
-msgstr "Letöltés"
-
-#: mail/folder-browser-factory.c:24
-msgid "Check for new mail"
-msgstr "Új levél jött-e?"
-
-#: mail/folder-browser-factory.c:25
-msgid "Compose"
-msgstr "Szerkesztés"
-
-#: mail/folder-browser-factory.c:25
-msgid "Compose a new message"
-msgstr "Egy új levelet készít"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply"
-msgstr "Válasz"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to the sender of this message"
-msgstr "Válasz küldése a feladónak erre a levélre"
-
-#: mail/folder-browser-factory.c:30
-msgid "Reply to All"
-msgstr "Mindenkinek"
-
-#: mail/folder-browser-factory.c:30
-msgid "Reply to all recipients of this message"
-msgstr "Válasz a feladónak és az összes címzettnek"
-
-#: mail/folder-browser-factory.c:32
-msgid "Forward"
-msgstr "Továbbít"
-
-#: mail/folder-browser-factory.c:32
-msgid "Forward this message"
-msgstr "A levél továbbítása"
-
-#: mail/folder-browser-factory.c:36
-msgid "Move"
-msgstr "Mozgat"
-
-#: mail/folder-browser-factory.c:36
-msgid "Move message to a new folder"
-msgstr "Levél mozgatása más mappába"
-
-#: mail/folder-browser-factory.c:38
-msgid "Print the selected message"
-msgstr "A levél nyomtatása"
-
-#: mail/folder-browser-factory.c:40
-msgid "Delete this message"
-msgstr "A levél törlése"
-
-#: mail/folder-browser-factory.c:62
-msgid "_Threaded Message List"
-msgstr "_Témaszerinti levéllista"
-
-#: mail/folder-browser-factory.c:72
-msgid "_Print message"
-msgstr "Levél _nyomtatása"
-
-#: mail/folder-browser-factory.c:81
-msgid "_Mark all messages seen"
-msgstr "_Minden olvasott levél kijelölése"
-
-#: mail/folder-browser-factory.c:86
-msgid "E_dit Message"
-msgstr "_Levél szerkesztése"
-
-#: mail/folder-browser-factory.c:92
-msgid "_View Message"
-msgstr "Levél meg_tekintése"
-
-#: mail/folder-browser-factory.c:98
-msgid "_Expunge"
-msgstr "_Tisztít"
-
-#: mail/folder-browser-factory.c:104
-msgid "Mail _Filters ..."
-msgstr "Levelezési _szûrõk ..."
-
-#: mail/folder-browser-factory.c:110
-msgid "_vFolder Editor ..."
-msgstr "_vMappa szerkesztõ ..."
-
-#: mail/folder-browser-factory.c:116
-msgid "_Mail Configuration ..."
-msgstr "_Levelezési beállítások ... "
-
-#: mail/folder-browser-factory.c:122
-msgid "Forget _Passwords"
-msgstr "_Jelszó elfelejtése"
-
-#: mail/folder-browser-factory.c:129
-msgid "_Configure Folder"
-msgstr "_Mappa beállítása"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config.glade.h:7 mail/mail-config.glade.h:14
-msgid "Identities"
-msgstr "Azonosítók"
-
-#: mail/mail-config.glade.h:9
-msgid "Organization"
-msgstr "Szervezet"
-
-#: mail/mail-config.glade.h:10
-msgid "Signature File"
-msgstr "Aláírás fájl"
-
-#: mail/mail-config.glade.h:12 mail/mail-config.glade.h:17
-#: mail/mail-config.glade.h:23
-msgid "Edit"
-msgstr "Szerkeszt"
-
-#: mail/mail-config.glade.h:15
-msgid "Sources"
-msgstr "Források"
-
-#: mail/mail-config.glade.h:19
-msgid "Mail Sources"
-msgstr "Levél források"
-
-#: mail/mail-config-druid.glade.h:15 mail/mail-config.glade.h:20
-msgid "Mail Transport"
-msgstr "Levél küldés"
-
-#: mail/mail-config.glade.h:21
-msgid "News Servers"
-msgstr "Hírcsoport-szerverek"
-
-#: mail/mail-config.glade.h:25
-msgid "News Sources"
-msgstr "Hírcsoport források"
-
-#: mail/mail-config.glade.h:26
-msgid "Send messages in HTML format"
-msgstr "A levelet HTML formátumban küldd"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config-druid.glade.h:7 mail/mail-config-druid.glade.h:8
-#: mail/mail-config-druid.glade.h:16
-msgid "Mail Configuration"
-msgstr "Levelezés beállítása"
-
-#: mail/mail-config-druid.glade.h:9
-msgid ""
-"Welcome to the Evolution Mail configuration wizard!\n"
-"By filling in some information about your email\n"
-"settings, you can start sending and receiving email\n"
-"right away. Click Next to continue."
-msgstr ""
-"Üdvözöllek az Evolúció levelezési varázslóban!\n"
-"A levelezési beállításaiddal kapcsolatos információk\n"
-"kitöltésével leveleket tudsz majd fogadni és küldeni.\n"
-"Kattints a 'Következõ' gombra a folytatáshoz."
-
-#: mail/mail-config-druid.glade.h:13
-msgid "Identity"
-msgstr "Azonosító"
-
-#: mail/mail-config-druid.glade.h:14
-msgid "Mail Source"
-msgstr "Levél forrás"
-
-#: mail/mail-config-druid.glade.h:17
-msgid ""
-"Your email configuration is now complete.\n"
-"Click \"Finish\" to save your new settings"
-msgstr ""
-"A levelezési beállításod most teljes.\n"
-"Kattints a 'Befejez' gombra a mentéshez"
-
-#: mail/mail-crypto.c:342 mail/mail-crypto.c:420
-msgid "No GPG/PGP program available."
-msgstr "Nincs elérhetõ GPG/PGP program."
-
-#: mail/mail-crypto.c:348 mail/mail-crypto.c:426
-#, c-format
-msgid "Couldn't create pipe to GPG/PGP: %s"
-msgstr "Nem tudok GPG/PGP programot pipe-olni: %s"
-
-#: mail/mail-ops.c:433
-msgid "Fetching mail"
-msgstr "Levelek letöltése"
-
-#: mail/mail-ops.c:445
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-"Nincs tárgya a levélnek.\n"
-"Tényleg elküldjem?"
-
-#: mail/mail-ops.c:564
-msgid ""
-"You need to configure an identity\n"
-"before you can send mail."
-msgstr ""
-"Egy azonosítót be kell állítanod\n"
-"mielõtt levelet küldessz."
-
-#: mail/mail-ops.c:838
-msgid "Move message(s) to"
-msgstr "Levél(levelek) mozgatása más mappába"
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr "Függõben lévõ mûveletek:"
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr "Nem teljes üzenet lett a csõbe írva!"
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr "Parancsok olvasásánál hiba történt egy feladó threadtõl."
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr "Hibás üzenet az feladó threadtõl?"
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr "Nem tudom a dialógust elkészíteni."
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr "A lekérdezést megszakítottad."
-
-#: mail/message-list.c:466
-msgid "Online Status"
-msgstr "Online státusz"
-
-#: mail/message-list.c:502
-msgid "From"
-msgstr "Feladó"
-
-#: mail/message-list.c:509
-msgid "Subject"
-msgstr "Téma"
-
-#: mail/message-list.c:516
-msgid "Date"
-msgstr "Dátum"
-
-#: mail/message-list.c:523
-msgid "Received"
-msgstr "Kézbesítve"
-
-#: mail/message-list.c:530
-msgid "To"
-msgstr "Címzett"
-
-#: mail/message-list.c:537
-msgid "Size"
-msgstr "Méret"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Evolúció telepítés"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Úgy látszik, elsõ alkalommal futtatod az Evolúciót."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-"Kérlek nyomd meg az 'OK' gombot az Evolúció felhasználói fájljainak "
-"telepítéséhez"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"Nem tudom létrehozni a könyvtárat\n"
-"%s\n"
-"Hiba: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"Nem tudom másolni a fájlokat\n"
-"'%s'-be."
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Az Evolúció fájljai sikeresen települtek."
-
-#: shell/e-setup.c:109
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please move it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"Az '%s' fájl nem egy könyvtár.\n"
-"Kérlek mozgasd el a fájlt hogy az Evolúció\n"
-"települni tudjon."
-
-#: shell/e-setup.c:121
-#, c-format
-msgid ""
-"The directory `%s' exists but is not the\n"
-"Evolution directory. Please move it in order\n"
-"to allow installation of the Evolution user files."
-msgstr ""
-"Az '%s' könyvtár létezik.\n"
-"Kérlek töröld a fájlt hogy az Evolúció\n"
-"települni tudjon."
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"Nem tudom elkészíteni a megadott mappát:\n"
-"%s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr "A megadott mappa név nem jó."
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "Evolúció - Új mappa készítése"
-
-#: shell/e-shell-folder-selection-dialog.c:96
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-"A kiválasztott mappa típusa nem jó a megadott\n"
-"mûvelethez."
-
-#: shell/e-shell-folder-selection-dialog.c:272
-msgid "New..."
-msgstr "Új..."
-
-#: shell/e-shell-folder-title-bar.c:459 shell/e-shell-folder-title-bar.c:460
-msgid "(Untitled)"
-msgstr "(Névtelen)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Bug buddy nem található a $PATH-odban."
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "A Bug buddy-t nem tudom futtatni."
-
-#: shell/e-shell-view-menu.c:166
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:168
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Az Evolúció egy munkacsoport program \n"
-"levelezéshez, naptár és címjegyzék funkciókkal\n"
-"a GNOME grafikus környezethez."
-
-#: shell/e-shell-view-menu.c:318
-msgid "Go to folder..."
-msgstr "Mappába menj..."
-
-#: shell/e-shell-view-menu.c:376
-msgid "_New"
-msgstr "Ú_j"
-
-#: shell/e-shell-view-menu.c:388
-msgid "_Folder"
-msgstr "_Mappa"
-
-#: shell/e-shell-view-menu.c:394
-msgid "Evolution bar _shortcut"
-msgstr "Evolúció indítósáv _ikon"
-
-#: shell/e-shell-view-menu.c:403
-msgid "_Mail message (FIXME)"
-msgstr "_Levél (FIXME)"
-
-#: shell/e-shell-view-menu.c:409
-msgid "_Appointment (FIXME)"
-msgstr "_Idõpont (FIXME)"
-
-#: shell/e-shell-view-menu.c:415
-msgid "_Contact (FIXME)"
-msgstr "_Címjegyzék (FIXME)"
-
-#: shell/e-shell-view-menu.c:421
-msgid "_Task (FIXME)"
-msgstr "_Munka (FIXME)"
-
-#: shell/e-shell-view-menu.c:443
-msgid "_Go to folder..."
-msgstr "Menj a ... _mappába"
-
-#: shell/e-shell-view-menu.c:444
-msgid "Display a different folder"
-msgstr "Egy másik mappa mutatása"
-
-#: shell/e-shell-view-menu.c:451
-msgid "_Create new folder..."
-msgstr "Új m_appa készítése..."
-
-#: shell/e-shell-view-menu.c:452 shell/e-shell-view-menu.c:464
-msgid "Create a new folder"
-msgstr "Új mappa készítése"
-
-#: shell/e-shell-view-menu.c:463
-msgid "E_xit..."
-msgstr "K_ilép..."
-
-#: shell/e-shell-view-menu.c:494
-msgid "Show _shortcut bar"
-msgstr "Oldal_sáv mutatása"
-
-#: shell/e-shell-view-menu.c:495
-msgid "Show the shortcut bar"
-msgstr "Az oldalsáv mutatása"
-
-#: shell/e-shell-view-menu.c:500
-msgid "Show _folder bar"
-msgstr "Mapp_asáv mutatása"
-
-#: shell/e-shell-view-menu.c:501
-msgid "Show the folder bar"
-msgstr "A mappákat tartalmazó sáv mutatása"
-
-#: shell/e-shell-view-menu.c:523
-msgid "_Actions"
-msgstr "_Mûveletek"
-
-#: shell/e-shell-view-menu.c:534
-msgid "_Help"
-msgstr "_Súgó"
-
-#: shell/e-shell-view-menu.c:540
-msgid "Help _index"
-msgstr "Súgó _tartalomjegyzék"
-
-#: shell/e-shell-view-menu.c:547
-msgid "Getting _started"
-msgstr "_Induláshoz"
-
-#: shell/e-shell-view-menu.c:554
-msgid "Using the _mailer"
-msgstr "A _levelezõ használata"
-
-#: shell/e-shell-view-menu.c:561
-msgid "Using the _calendar"
-msgstr "A _naptár használata"
-
-#: shell/e-shell-view-menu.c:568
-msgid "Using the c_ontact manager"
-msgstr "A _címjegyzék használata"
-
-#: shell/e-shell-view-menu.c:578
-msgid "_Submit bug report"
-msgstr "_Hibajelentés küldése"
-
-#: shell/e-shell-view-menu.c:579
-msgid "Submit bug report using Bug Buddy"
-msgstr "Hibajelentés feladása bug-buddy-val"
-
-#: shell/e-shell-view-menu.c:588
-msgid "_About Evolution..."
-msgstr "_Evolúció névjegy"
-
-#: shell/e-shell-view-menu.c:589
-msgid "Show information about Evolution"
-msgstr "Információk megjelenítése az Evolúcióval kapcsolatban"
-
-#: shell/e-shell-view.c:114
-msgid "(No folder displayed)"
-msgstr "(Nincs mappa mutatva)"
-
-#: shell/e-shell-view.c:342
-msgid "Folders"
-msgstr "Mappák"
-
-#: shell/e-shell-view.c:740
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolúció - %s"
-
-#: shell/e-shell.c:291
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Nem tudom beállítani a helyi tárterületet -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "_Kis ikonok"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "Kis ikonok mutatása az elemeken"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "_Nagy ikonok"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Nagy ikonok mutatása az elemeken"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "Aktivál"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "Az elem aktiválása"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Vedd le ezt az elemet az indítósávról"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Nem sikerül elmenteni az elemeket."
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "(névtelen)"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "Nincs hiba"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "Alapvetõ hiba"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "A megadott néven már létezik mappa"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr "A megadott mappatípus nem jó"
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "I/O hiba"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "Nincs elég hely a mappa elkészítéséhez"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "A megadott mappát nem találom"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr "A funkció nincs még ebben a tárolóban megírva"
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "Jogosultsági hiba"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "A mûvelet nem támogatott"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr "A megadott típus nem támogatott ebben a tárolóban."
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "Nem ismert hiba"
-
-#: shell/e-storage-set-view.c:242
-msgid "View the selected folder"
-msgstr "A kijelölt mappák megtekintése"
-
-#: shell/main.c:66
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Helló, köszönjük, hogy letöltötted az Evolution csomag fejlesztõi \n"
-"verzióját.\n"
-"\n"
-"Az Evolúció csapat sokat és keményen dolgozott hogy az Evolúciót \n"
-"robusztussá, széppé, jól használhatóvá, gyorssá és jól tervezetté \n"
-"tegye, ahogy csak lehetett. Nagyon fáradtak vagyunk. Még nem vagyunk \n"
-"kész, még nem.\n"
-"\n"
-"Mikor elindítod az Evolúciót, kérlek értsd meg, hogy a munkánk nagy\n"
-"része a backend (háttér) írására irányult, amely az egész rendszert\n"
-"hajtja, és nem a felhasználói felületre. Ez csak a hegycsúcs teteje,\n"
-"és még sok szeretetet fogunk beleölni az UI fejlesztérébe. Tudnod kell\n"
-"viszont, hogy amit használsz, nem demoware.\n"
-"Tehát, itt az idõ a mentegetõzésre. Az Evolúció fog: crash-elni, \n"
-"elveszti a leveleid, kósza processzeket hagy futni, megeszi a teljes\n"
-"CPU idõdet, HTML leveleket küld véletlenszerû levlistáknak, és lejárat\n"
-"a kollegáid és a barátaid elõtt. Használd a saját felelõsségedre.\n"
-"Azért reméljük, élvezni fogod a kemény munkánk eredményét, és várjuk\n"
-"hozzájárulásod! \n"
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Köszönettel\n"
-"Az Evolúció Csapat\n"
-
-#: shell/main.c:121
-msgid "Cannot initialize the Evolution shell."
-msgstr "Nem tudom elindítani az Evolúció shell-t."
-
-#: shell/main.c:156
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Nem tudom elindítani a Bonobo komponens rendszert."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Mezõk"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "Csoportosítás"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Rendezés"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Szûrõ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-msgid "Field Chooser"
-msgstr "Elemválasztó"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-"Oszlop hozzáadását a táblázathoz legegyszerûbben\n"
-"a megfelelõ helyre húzással teheted meg."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "window1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "Meglévõ mezõk"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "label1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "Ilyen rendezésben mutasd"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "label2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Hozzáad >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Töröl"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr "Kísérleti"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "Foglalt"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr "Üzemen kívül"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "Nincs információ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr "_Mások meghívása..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "_Beállítások"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr "Csak a _munkaórák mutatása"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr "_Nagyított mutatása"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr "_Szabad/foglalt frissítése"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "_<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr "_Automatikus kiszedés"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ">_>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "_Minden ember és erõforrás"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr "Minden _ember és egy erõforrás"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr "_A kért emberek"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr "A kért emberek és egy e_rõforrás"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "Megbeszélés _kezdõdik:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "Megbeszélés _vége:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr "Minden meghívott"
-
-#. Translators: These are the first characters of each day of the
-#. week, 'M' for 'Monday', 'T' for Tuesday etc.
-#: widgets/misc/e-calendar-item.c:281
-msgid "MTWTFSS"
-msgstr "HKSCPsV"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "Csoportosítás %i"
diff --git a/po/it.po b/po/it.po
deleted file mode 100644
index 96b215002b..0000000000
--- a/po/it.po
+++ /dev/null
@@ -1,3721 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# Clara Tattoni <clara.tattoni@libero.it>, 2000
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Evolution 1.0\n"
-"POT-Creation-Date: 2000-08-02 16:37+0200\n"
-"PO-Revision-Date: 2000-07-15 23:33+02:00\n"
-"Last-Translator: Clara Tattoni <clara.tattoni@libero.it>\n"
-"Language-Team: Italiano <it@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:59 calendar/gui/main.c:68
-#, fuzzy
-msgid "Could not initialize Bonobo"
-msgstr "Impossibile inizializzare Bonobo"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-#, fuzzy
-msgid "categories"
-msgstr "Ca_tegorie"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:9
-#, fuzzy
-msgid "Available Categories:"
-msgstr "Campi disponibili"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/event-editor.c:1168
-#, fuzzy
-msgid "FIXME: _Appointment"
-msgstr "_Appuntamenti"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1169
-#, fuzzy
-msgid "FIXME: Meeting Re_quest"
-msgstr "_Richieste di appuntamenti"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/event-editor.c:1171
-#, fuzzy
-msgid "FIXME: _Mail Message"
-msgstr "Invia _Messaggio"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/event-editor.c:1172
-#, fuzzy
-msgid "FIXME: _Contact"
-msgstr "_Contatti"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/event-editor.c:1173
-msgid "FIXME: _Task"
-msgstr "_Compito"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/event-editor.c:1174
-#, fuzzy
-msgid "FIXME: Task _Request"
-msgstr "_Richiesta compiti"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/event-editor.c:1175
-#, fuzzy
-msgid "FIXME: _Journal Entry"
-msgstr "_Ingressi giornalieri"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1176
-msgid "FIXME: _Note"
-msgstr "_Note"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/event-editor.c:1178 calendar/gui/event-editor.c:1285
-msgid "FIXME: Ch_oose Form..."
-msgstr "Scegli sc_heda..."
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1183
-msgid "FIXME: _Memo Style"
-msgstr "Stile _Memo"
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/event-editor.c:1185
-msgid "FIXME: Define Print _Styles..."
-msgstr "Definisci _Stili di Stampa"
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/event-editor.c:1192
-msgid "FIXME: S_end"
-msgstr "_Invia"
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/event-editor.c:1196
-#, fuzzy
-msgid "FIXME: Save Attac_hments..."
-msgstr "Salva allegato..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-#, fuzzy
-msgid "_Delete"
-msgstr "Elimina"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1199
-msgid "FIXME: _Move to Folder..."
-msgstr "_Sposta nella cartella..."
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/event-editor.c:1200
-msgid "FIXME: Cop_y to Folder..."
-msgstr "_Copia nella cartella..."
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/event-editor.c:1202
-#, fuzzy
-msgid "Page Set_up"
-msgstr "Impostazione pagina"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/event-editor.c:1203
-msgid "FIXME: Print Pre_view"
-msgstr "A_nteprima di stampa"
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: Paste _Special..."
-msgstr "Incolla _speciale..."
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/event-editor.c:1229
-msgid "FIXME: Mark as U_nread"
-msgstr "Segna come _non letto"
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/event-editor.c:1233
-msgid "_Object"
-msgstr "_Oggetto"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/event-editor.c:1238 calendar/gui/event-editor.c:1245
-msgid "FIXME: _Item"
-msgstr "_Articolo"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/event-editor.c:1239 calendar/gui/event-editor.c:1246
-msgid "FIXME: _Unread Item"
-msgstr "Articolo _non letto"
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr "P_rimo articolo nella cartella"
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/event-editor.c:1247
-msgid "FIXME: _Last Item in Folder"
-msgstr "U_ltimo articolo nella cartella"
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/event-editor.c:1252
-msgid "FIXME: _Standard"
-msgstr "_Strandard"
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1254
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/event-editor.c:1257
-msgid "FIXME: _Customize..."
-msgstr "Pe_rsonalizza..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/event-editor.c:1262
-msgid "Pre_vious"
-msgstr "Prec_edente"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/event-editor.c:1263
-msgid "Ne_xt"
-msgstr "Succe_ssivo"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/event-editor.c:1267
-#, fuzzy
-msgid "_Toolbars"
-msgstr "S_trumenti"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/event-editor.c:1272
-msgid "FIXME: _File..."
-msgstr "_File..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/event-editor.c:1273
-msgid "FIXME: It_em..."
-msgstr "_Articolo"
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/event-editor.c:1274
-msgid "FIXME: _Object..."
-msgstr "Oggetto..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/event-editor.c:1279
-#, fuzzy
-msgid "FIXME: _Font..."
-msgstr "Carattere..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/event-editor.c:1280
-msgid "FIXME: _Paragraph..."
-msgstr "_Paragrafo..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/event-editor.c:1287
-msgid "FIXME: Desi_gn This Form"
-msgstr "Impo_sta questa scheda..."
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/event-editor.c:1288
-msgid "FIXME: D_esign a Form..."
-msgstr "_imposta una scheda..."
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/event-editor.c:1290
-msgid "FIXME: Publish _Form..."
-msgstr "Pu_bblica scheda..."
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/event-editor.c:1291
-msgid "FIXME: Pu_blish Form As..."
-msgstr "Pubblica _scheda come..."
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/event-editor.c:1293
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/event-editor.c:1298
-msgid "FIXME: _Spelling..."
-msgstr "Or_tografia..."
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/event-editor.c:1303
-#, fuzzy
-msgid "_Forms"
-msgstr "Formato"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "_Nuovo Contatto"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr "Nuovo _Contatto della Stessa Compagnia"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr "Nuova _Lettera per il Contatto"
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr "Nuovo _Messaggio per il Contatto"
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr "Nuovo meetin_g con Contatto"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr "O_rganizza un Meeting..."
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr "Nuovo _Compito per il Contatto"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr "Nuova a_ggiunta quotidiana per il Contatto"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr "_Mostra la Mappa degli Indirizzi"
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr "_Apri Pagina Web"
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr "Inoltra come _vCard"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1316
-#, fuzzy
-msgid "FIXME: For_ward"
-msgstr "_Inoltra"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/event-editor.c:1329
-msgid "_Insert"
-msgstr "_Inserisci"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/event-editor.c:1330
-#, fuzzy
-msgid "F_ormat"
-msgstr "Formato"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/event-editor.c:1331 shell/e-shell-view-menu.c:515
-msgid "_Tools"
-msgstr "S_trumenti"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/event-editor.c:1332
-#, fuzzy
-msgid "Actio_ns"
-msgstr "_Azioni"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-#, fuzzy
-msgid "Save and Close"
-msgstr "Salva ed Esci"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1371
-msgid "Save the appointment and close the dialog box"
-msgstr "Salva l'appuntamento ed esci dalla finestra di dialogo"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:673
-#, fuzzy
-msgid "Print..."
-msgstr "Stampa"
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/event-editor.c:1376
-msgid "Print this item"
-msgstr "Stampa questo articolo"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/event-editor.c:1377
-msgid "FIXME: Insert File..."
-msgstr "Inserisci un File..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/event-editor.c:1378
-msgid "Insert a file as an attachment"
-msgstr "Inserisci un file come allegato"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/gui/component/addressbook.c:426 calendar/gui/gncal-todo.c:508
-#: mail/folder-browser-factory.c:39
-msgid "Delete"
-msgstr "Elimina"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/event-editor.c:1387 calendar/gui/gncal-todo.c:336
-#, fuzzy
-msgid "Delete this item"
-msgstr "Elimina questo messaggio"
-
-#: addressbook/contact-editor/e-contact-editor.c:856
-#: calendar/gui/event-editor.c:1389
-msgid "FIXME: Previous"
-msgstr "Precedente"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/event-editor.c:1390
-msgid "Go to the previous item"
-msgstr "Vai al precedente"
-
-#: addressbook/contact-editor/e-contact-editor.c:859
-#: calendar/gui/event-editor.c:1391
-msgid "FIXME: Next"
-msgstr "Successivo"
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/event-editor.c:1392
-msgid "Go to the next item"
-msgstr "Vai al successivo"
-
-#: addressbook/contact-editor/e-contact-editor.c:862
-#: calendar/gui/event-editor.c:1393
-msgid "FIXME: Help"
-msgstr "Aiuto"
-
-#: addressbook/contact-editor/e-contact-editor.c:863
-#: calendar/gui/event-editor.c:1394
-msgid "See online help"
-msgstr "Vedere l'aiuto in linea"
-
-#: addressbook/contact-editor/e-contact-editor.c:1278
-#, fuzzy
-msgid "Assistant"
-msgstr "Nome dell'_Assistente"
-
-#: addressbook/contact-editor/e-contact-editor.c:1279
-#: addressbook/contact-editor/e-contact-editor.c:1383
-#, fuzzy
-msgid "Business"
-msgstr "_Ufficio"
-
-#: addressbook/contact-editor/e-contact-editor.c:1280
-#, fuzzy
-msgid "Business 2"
-msgstr "_Ufficio"
-
-#: addressbook/contact-editor/e-contact-editor.c:1281
-#, fuzzy
-msgid "Business Fax"
-msgstr "_Fax Ufficio"
-
-#: addressbook/contact-editor/e-contact-editor.c:1282
-msgid "Callback"
-msgstr "Richiamare"
-
-#: addressbook/contact-editor/e-contact-editor.c:1283
-msgid "Car"
-msgstr "Auto"
-
-#: addressbook/contact-editor/e-contact-editor.c:1284
-#, fuzzy
-msgid "Company"
-msgstr "_Compagnia"
-
-#: addressbook/contact-editor/e-contact-editor.c:1285
-#: addressbook/contact-editor/e-contact-editor.c:1384
-#, fuzzy
-msgid "Home"
-msgstr "_Casa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1286
-#, fuzzy
-msgid "Home 2"
-msgstr "_Casa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1287
-#, fuzzy
-msgid "Home Fax"
-msgstr "_Casa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1288
-msgid "ISDN"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1289
-#, fuzzy
-msgid "Mobile"
-msgstr "C_ellulare"
-
-#: addressbook/contact-editor/e-contact-editor.c:1290
-#: addressbook/contact-editor/e-contact-editor.c:1385
-msgid "Other"
-msgstr "Altro"
-
-#: addressbook/contact-editor/e-contact-editor.c:1291
-msgid "Other Fax"
-msgstr "Altro fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1292
-#, fuzzy
-msgid "Pager"
-msgstr "Pagina"
-
-#: addressbook/contact-editor/e-contact-editor.c:1293
-#, fuzzy
-msgid "Primary"
-msgstr "Posta Elettronica"
-
-#: addressbook/contact-editor/e-contact-editor.c:1294
-msgid "Radio"
-msgstr "Radio"
-
-#: addressbook/contact-editor/e-contact-editor.c:1295
-msgid "Telex"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1296
-msgid "TTY/TDD"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1340
-msgid "Primary Email"
-msgstr "Posta Elettronica"
-
-#: addressbook/contact-editor/e-contact-editor.c:1341
-msgid "Email 2"
-msgstr "Posta elettronica 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1342
-msgid "Email 3"
-msgstr "Posta elettronica 3"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "_Aggiungi"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "Tipi di Telefono"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "Nuovo tipo di telefono"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-msgid "Add"
-msgstr "Aggiungi"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "Editor dei Contatti"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "Nome e Cognome"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "Memorizza come:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-#, fuzzy
-msgid "Web page address:"
-msgstr "Indirizzo email:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "Vuole ricevere messaggi in _HTML"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Indirizzo"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-#, fuzzy
-msgid "_Business"
-msgstr "_Ufficio"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-#, fuzzy
-msgid "_Home"
-msgstr "_Casa"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-#, fuzzy
-msgid "Business _Fax"
-msgstr "_Fax Ufficio"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-#, fuzzy
-msgid "_Mobile"
-msgstr "C_ellulare"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "_Ufficio"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "Indirizzo a cui _spedire"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "C_ontatti"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr "Ca_tegorie"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-#, fuzzy
-msgid "_Job title:"
-msgstr "_Titolo"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-#, fuzzy
-msgid "_Company:"
-msgstr "_Compagnia"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-msgid "General"
-msgstr "Generale"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "_Dipartimento"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "_Ufficio"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "_Professione"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "_Nickname"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr "Coniuge"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "Co_mpleanno"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-#, fuzzy
-msgid "_Assistant's name:"
-msgstr "Nome dell'_Assistente"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "Nome del _Manager"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "Anni_versario"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "No_te"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-#, fuzzy
-msgid "Details"
-msgstr "Predefinito"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "Verifiare Nome e Cognome"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "_Titolo"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-#, fuzzy
-msgid "_First:"
-msgstr "Formato"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-#, fuzzy
-msgid "_Middle:"
-msgstr "_Titolo"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:12
-#, fuzzy
-msgid "_Suffix:"
-msgstr "_Ufficio"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Sig.\n"
-"Sig.ra\n"
-"Dott.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:420
-#: calendar/gui/calendar-commands.c:544
-#, fuzzy
-msgid "New"
-msgstr "_Nuovo"
-
-#: addressbook/gui/component/addressbook.c:420
-msgid "Create a new contact"
-msgstr "Crea un nuovo contatto "
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find"
-msgstr "Trova"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find a contact"
-msgstr "Trova un contatto"
-
-#: addressbook/gui/component/addressbook.c:425
-#: addressbook/gui/component/addressbook.c:492
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:37
-msgid "Print"
-msgstr "Stampa"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Print contacts"
-msgstr "Stampa contatti"
-
-#: addressbook/gui/component/addressbook.c:426
-#, fuzzy
-msgid "Delete a contact"
-msgstr "Selezionare un contatto"
-
-#: addressbook/gui/component/addressbook.c:499
-#: addressbook/gui/component/addressbook.c:1034
-msgid "As _Table"
-msgstr "Come _Tabella"
-
-#: addressbook/gui/component/addressbook.c:506
-#, fuzzy
-msgid "_New Contact"
-msgstr "_Contatti"
-
-#: addressbook/gui/component/addressbook.c:514
-msgid "N_ew Directory Server"
-msgstr "N_uovo Server delle Cartelle"
-
-#: addressbook/gui/component/addressbook.c:593
-#, fuzzy
-msgid "Unable to open addressbook"
-msgstr "Impossibile aprire la rubruca"
-
-#: addressbook/gui/component/addressbook.c:598
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-"Impossibile aprire questa rubruca. Questo significa che \n"
-"è stata inserita una URI non corretta, oppure che si è\n"
-"cercato di accedere a un server LDAP senza avere il supporto \n"
-"LDAP compilato. Se si è inserita una URI, controllarne \n"
-"la correttezza ed inserirla nuovamente. Altrimenti, è \n"
-"probabile che si sia cercato di accedere ad un server LDAP. \n"
-"Se si desidera usare LDAP, è necessario scaricare e \n"
-"installare OpenLDAP, ricompilare e reinstallare Evolution.\n"
-
-#: addressbook/gui/component/addressbook.c:938
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr "Salva come vCard"
-
-#: addressbook/gui/component/addressbook.c:1005
-msgid "* Click here to add a contact *"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1041
-msgid "As _Minicards"
-msgstr "Come _Minicards"
-
-#: addressbook/gui/component/addressbook.c:1092
-msgid "The URI that the Folder Browser will display"
-msgstr "La URI visualizzata dal Browser delle cartelle"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:9
-#, fuzzy
-msgid "a"
-msgstr "am"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:13
-#, fuzzy
-msgid "e"
-msgstr "Me"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:21
-#, fuzzy
-msgid "m"
-msgstr "am"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:23
-#, fuzzy
-msgid "o"
-msgstr "A"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:26
-#, fuzzy
-msgid "r"
-msgstr "Ve"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:29
-#, fuzzy
-msgid "u"
-msgstr "Do"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-#, fuzzy
-msgid "Description:"
-msgstr "Nessuna descrizione"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-#, fuzzy
-msgid "LDAP Server:"
-msgstr "Server:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Numero Port"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Nome:"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"Non c'è niente da mostrare in questa view\n"
-"\n"
-"Fare doppio click qui per creare un nuovo contatto."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-#, fuzzy
-msgid "Page Setup:"
-msgstr "Impostazione pagina"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Nome dello stile"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-#, fuzzy
-msgid "Preview:"
-msgstr "Precedente"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-#, fuzzy
-msgid "Options"
-msgstr "Opzioni"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Allega"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-#, fuzzy
-msgid "Sections:"
-msgstr "Secondi"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr "Concatenati l'un l'altro"
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "Titolo per ogni lettera"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "Inizia su una nuova pagina"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Numero di colonne:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "Moduli bianchi alla fine"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-#, fuzzy
-msgid "Fonts"
-msgstr "Mese"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-#, fuzzy
-msgid "Font..."
-msgstr "Stampa"
-
-#: addressbook/printing/e-contact-print.glade.h:22
-#, fuzzy
-msgid "Headings"
-msgstr "Titoli"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:24
-#, fuzzy
-msgid "Body"
-msgstr "Oggi"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "Ombreggiatura"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "Stampa usando ombreggiatura grigia"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-#, fuzzy
-msgid "Format"
-msgstr "Formato"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Carta"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Tipo"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-msgid "label26"
-msgstr "etichetta"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Dimensioni:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Larghezza:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Altezza:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-#, fuzzy
-msgid "Paper source:"
-msgstr "Fonte della posta"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-#, fuzzy
-msgid "Margins"
-msgstr "Icone _grandi"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Superiore:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Inferiore:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Sinistra:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Destra:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-#, fuzzy
-msgid "Page"
-msgstr "Pagina"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Dimensione:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-#, fuzzy
-msgid "Orientation"
-msgstr "Organizzazione"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-#, fuzzy
-msgid "Portrait"
-msgstr "Prioritario"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:52
-#, fuzzy
-msgid "Header"
-msgstr "Anno"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-#, fuzzy
-msgid "Footer:"
-msgstr "Filtra"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:544
-#, fuzzy
-msgid "am"
-msgstr "am"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:543
-msgid "pm"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr "Linea:"
-
-#: calendar/gui/calendar-commands.c:57
-#, fuzzy
-msgid "Headings:"
-msgstr "Titoli"
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr "Giorni liberi:"
-
-#: calendar/gui/calendar-commands.c:59
-#, fuzzy
-msgid "Appointments:"
-msgstr "_Appuntamenti"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr "Giorni sottolineati:"
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr "Data"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr "Data odierna"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr "Compito non ancora svolto:"
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr "Compito da svolgere oggi:"
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr "Compito svolto: "
-
-#: calendar/gui/calendar-commands.c:175
-#, fuzzy
-msgid "Gnome Calendar"
-msgstr "Usare il _Calendario"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "Il calendario personale e il gestore degli impegni di GNOME."
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr "File non trovato"
-
-#: calendar/gui/calendar-commands.c:456
-msgid "Open calendar"
-msgstr "Apri calendario"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Save calendar"
-msgstr "Salva calendario"
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:722
-#: calendar/gui/gncal-todo.c:726
-msgid "Day"
-msgstr "Giorno"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr "Mostra 1 giorno"
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr "5 giorni"
-
-#: calendar/gui/calendar-commands.c:525
-#, fuzzy
-msgid "Show the working week"
-msgstr "Mostra la settimana lavorativa"
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:721
-msgid "Week"
-msgstr "Settimana"
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr "Mostra 1 settimana"
-
-#: calendar/gui/calendar-commands.c:531
-#, fuzzy
-msgid "Month"
-msgstr "Mese"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr "Mostra 1 mese"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Year"
-msgstr "Anno"
-
-#: calendar/gui/calendar-commands.c:535
-#, fuzzy
-msgid "Show 1 year"
-msgstr "Mostra 1 anno"
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:682
-msgid "Create a new appointment"
-msgstr "Crea un nuovo appuntamento"
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-#, fuzzy
-msgid "Print this calendar"
-msgstr "Stampa il _Calendario"
-
-#: calendar/gui/calendar-commands.c:552
-#, fuzzy
-msgid "Prev"
-msgstr "Precedente"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr "Vai indietro nel tempo"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Today"
-msgstr "Oggi"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr "Vai al presente"
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Next"
-msgstr "Successivo"
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr "Vai avanti nel tempo"
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr "Vai a "
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr "Vai ad una data specifica"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-#, fuzzy
-msgid "New Ca_lendar"
-msgstr "Nuovo _Calendario"
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr "Crea un nuovo _Calendario"
-
-#: calendar/gui/calendar-commands.c:663
-#, fuzzy
-msgid "Open Ca_lendar"
-msgstr "Apri _Calendario"
-
-#: calendar/gui/calendar-commands.c:664
-msgid "Open a calendar"
-msgstr "Apri un calendario"
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-msgid "Save Calendar As"
-msgstr "Salva Calendario come"
-
-#: calendar/gui/calendar-commands.c:682
-#, fuzzy
-msgid "_New appointment..."
-msgstr "_Nuovo Appuntamento..."
-
-#: calendar/gui/calendar-commands.c:687
-msgid "New appointment for _today..."
-msgstr "Nuovo appuntamento per _oggi..."
-
-#: calendar/gui/calendar-commands.c:688
-msgid "Create a new appointment for today"
-msgstr "Crea nuovo appuntamento per oggi..."
-
-#: calendar/gui/calendar-commands.c:696 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr "Preferenze"
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/calendar-commands.c:704
-#, fuzzy
-msgid "About Calendar"
-msgstr "Riguardo il Calendario"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:746
-#, c-format
-msgid "%s%s"
-msgstr "%2$s%1$s"
-
-#: calendar/gui/calendar-commands.c:746
-#, fuzzy
-msgid "'s calendar"
-msgstr "calendario di"
-
-#: calendar/gui/control-factory.c:136
-#, fuzzy
-msgid "The URI that the calendar will display"
-msgstr "La URI che il calendario visualizzerà"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "Avviso alle %A %b %d %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr "Avviso dell'appuntamento alle:%A %b %d %Y %H:%M"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-#, fuzzy
-msgid "Close"
-msgstr "Colori"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1070
-#, fuzzy
-msgid "Snooze"
-msgstr "Sonnellino"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-#, fuzzy
-msgid "Edit appointment"
-msgstr "_Appuntamenti"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr ""
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr "%02i divisioni per minuto"
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-#, fuzzy
-msgid "New appointment..."
-msgstr "Nuovo appuntamento..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "Edita questo appuntamento..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-#, fuzzy
-msgid "Delete this appointment"
-msgstr "Elimina questo appuntamento"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "Rendi rimandabile questo appuntamento"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-#, fuzzy
-msgid "Delete this occurrence"
-msgstr "Elimina questa ricorrenza"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr "Elimina tutte le ricorrenze"
-
-#: calendar/gui/event-editor.c:291
-#, fuzzy
-msgid "Edit Appointment"
-msgstr "_Appuntamenti"
-
-#: calendar/gui/event-editor.c:296
-msgid "No summary"
-msgstr "Niente riassunto"
-
-#: calendar/gui/event-editor.c:300
-#, fuzzy, c-format
-msgid "Appointment - %s"
-msgstr "Appuntamenti -%s"
-
-#: calendar/gui/event-editor.c:303
-#, c-format
-msgid "Task - %s"
-msgstr ""
-
-#: calendar/gui/event-editor.c:306
-#, fuzzy, c-format
-msgid "Journal entry - %s"
-msgstr "Ingressi giornalieri -%s"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:622 calendar/gui/event-editor.c:718
-msgid "?"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1198
-#, fuzzy
-msgid "FIXME: _Delete"
-msgstr "_Elimina"
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Ca_lendar..."
-msgstr "Cal_endario"
-
-#: calendar/gui/event-editor.c:1300
-msgid "FIXME: Chec_k Names"
-msgstr "_Controlla nomi"
-
-#: calendar/gui/event-editor.c:1301
-msgid "FIXME: Address _Book..."
-msgstr "R_ubrica..."
-
-#: calendar/gui/event-editor.c:1308
-#, fuzzy
-msgid "FIXME: _New Appointment"
-msgstr "Nuovo _appuntamento"
-
-#: calendar/gui/event-editor.c:1310
-msgid "FIXME: Rec_urrence..."
-msgstr "Ric_orrenza..."
-
-#: calendar/gui/event-editor.c:1312
-#, fuzzy
-msgid "FIXME: Invite _Attendees..."
-msgstr "Invita Assistenti"
-
-#: calendar/gui/event-editor.c:1313
-msgid "FIXME: C_ancel Invitation..."
-msgstr "_Annulla Invito..."
-
-#: calendar/gui/event-editor.c:1315
-msgid "FIXME: Forward as v_Calendar"
-msgstr "Inoltra come v_Calrendar"
-
-#: calendar/gui/event-editor.c:1370
-msgid "FIXME: Save and Close"
-msgstr "Salva ed Esci"
-
-#: calendar/gui/event-editor.c:1375
-msgid "FIXME: Print..."
-msgstr "Stampa..."
-
-#: calendar/gui/event-editor.c:1380
-msgid "FIXME: Recurrence..."
-msgstr "Ricorrenza..."
-
-#: calendar/gui/event-editor.c:1381
-msgid "Configure recurrence rules"
-msgstr "Configura regole di ricorrenza"
-
-#: calendar/gui/event-editor.c:1383
-msgid "FIXME: Invite Attendees..."
-msgstr "Invita Assistenti"
-
-#: calendar/gui/event-editor.c:1384
-msgid "Invite attendees to a meeting"
-msgstr "Invita gli assistenti al meeting"
-
-#: calendar/gui/event-editor.c:1386
-#, fuzzy
-msgid "FIXME: Delete"
-msgstr "Elimina"
-
-#: calendar/gui/event-editor.c:1828
-msgid "%a %b %d %Y"
-msgstr ""
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr ""
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr ""
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr ""
-
-#: calendar/gui/getdate.y:394
-#, fuzzy
-msgid "april"
-msgstr "Carta"
-
-#: calendar/gui/getdate.y:395
-#, fuzzy
-msgid "may"
-msgstr "Giorno"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr ""
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr ""
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr ""
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr ""
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr ""
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr ""
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr ""
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr ""
-
-#: calendar/gui/getdate.y:404
-#, fuzzy
-msgid "sunday"
-msgstr "Domenica"
-
-#: calendar/gui/getdate.y:405
-#, fuzzy
-msgid "monday"
-msgstr "Lunedì"
-
-#: calendar/gui/getdate.y:406
-#, fuzzy
-msgid "tuesday"
-msgstr "Domenica"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr ""
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr ""
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr ""
-
-#: calendar/gui/getdate.y:411
-#, fuzzy
-msgid "thur"
-msgstr "Altro"
-
-#: calendar/gui/getdate.y:412
-#, fuzzy
-msgid "thurs"
-msgstr "Altro"
-
-#: calendar/gui/getdate.y:413
-#, fuzzy
-msgid "friday"
-msgstr "Posta Elettronica"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr ""
-
-#: calendar/gui/getdate.y:420
-#, fuzzy
-msgid "year"
-msgstr "Anno"
-
-#: calendar/gui/getdate.y:421
-#, fuzzy
-msgid "month"
-msgstr "Mese"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr ""
-
-#: calendar/gui/getdate.y:423
-#, fuzzy
-msgid "week"
-msgstr "Settimana"
-
-#: calendar/gui/getdate.y:424
-#, fuzzy
-msgid "day"
-msgstr "Oggi"
-
-#: calendar/gui/getdate.y:425
-#, fuzzy
-msgid "hour"
-msgstr "Ora"
-
-#: calendar/gui/getdate.y:426
-#, fuzzy
-msgid "minute"
-msgstr "Minuto"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr ""
-
-#: calendar/gui/getdate.y:428
-#, fuzzy
-msgid "second"
-msgstr "secondi"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr ""
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr ""
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr ""
-
-#: calendar/gui/getdate.y:437
-#, fuzzy
-msgid "today"
-msgstr "Oggi"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr ""
-
-#: calendar/gui/getdate.y:439
-#, fuzzy
-msgid "last"
-msgstr "Incolla"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr ""
-
-#: calendar/gui/getdate.y:441
-#, fuzzy
-msgid "next"
-msgstr "Successivo"
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr ""
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-#, fuzzy
-msgid "third"
-msgstr "Altro"
-
-#: calendar/gui/getdate.y:445
-#, fuzzy
-msgid "fourth"
-msgstr "Ora"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr ""
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr ""
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:449
-#, fuzzy
-msgid "eighth"
-msgstr "Altezza:"
-
-#: calendar/gui/getdate.y:450
-#, fuzzy
-msgid "ninth"
-msgstr "Stampa"
-
-#: calendar/gui/getdate.y:451
-#, fuzzy
-msgid "tenth"
-msgstr "Mese"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr ""
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Create to-do item"
-msgstr "Crea una cosa da fare"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Edit to-do item"
-msgstr "Modifica cosa da fare"
-
-#: calendar/gui/gncal-todo.c:176
-msgid "Summary:"
-msgstr "Riassunto:"
-
-#: calendar/gui/gncal-todo.c:186
-#, fuzzy
-msgid "Due Date:"
-msgstr "Scadenza"
-
-#: calendar/gui/gncal-todo.c:195
-#, fuzzy
-msgid "Priority:"
-msgstr "Prioritario"
-
-#: calendar/gui/gncal-todo.c:212
-msgid "Item Comments:"
-msgstr "Commenti"
-
-#: calendar/gui/gncal-todo.c:334
-msgid "Add to-do item..."
-msgstr "Aggiungi..."
-
-#: calendar/gui/gncal-todo.c:335
-msgid "Edit this item..."
-msgstr "Modifica..."
-
-#: calendar/gui/gncal-todo.c:434
-msgid "Summary"
-msgstr "Riassunto"
-
-#: calendar/gui/gncal-todo.c:435 calendar/gui/prop.c:604
-#, fuzzy
-msgid "Due Date"
-msgstr "Data"
-
-#: calendar/gui/gncal-todo.c:436 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr "Prioritario"
-
-#: calendar/gui/gncal-todo.c:437
-msgid "Time Left"
-msgstr "Tempo rimasto"
-
-#. Label
-#: calendar/gui/gncal-todo.c:449
-#, fuzzy
-msgid "To-do list"
-msgstr "S_trumenti"
-
-#. Add
-#: calendar/gui/gncal-todo.c:488
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Aggiungi..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:497
-#, fuzzy
-msgid "Edit..."
-msgstr "Aggiungi..."
-
-#: calendar/gui/gncal-todo.c:721
-msgid "Weeks"
-msgstr "Settimane"
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Days"
-msgstr "Giorni"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hours"
-msgstr "Ore"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hour"
-msgstr "Ora"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minutes"
-msgstr "Minuti"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minute"
-msgstr "Minuto"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-#, fuzzy
-msgid "Seconds"
-msgstr "Secondi"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-#, fuzzy
-msgid "Second"
-msgstr "Secondi"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1078
-#: calendar/gui/gnome-cal.c:1134
-msgid "Reminder of your appointment at "
-msgstr "Promemoria dell'appuntamento alle"
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1083 calendar/gui/gnome-cal.c:1138
-msgid "Ok"
-msgstr ""
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "Dom"
-
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "Lun"
-
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "Mar"
-
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "Mer"
-
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "Gio"
-
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "Ven"
-
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "Sab"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "Anno:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "Vai alla data"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-"Selezionare la data in cui si vuole andare.\n"
-"Clickando su un giorno, si viene spostati\n"
-"su quella data."
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "Vai a oggi"
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr "1"
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr "2"
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr "3"
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr "4"
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr "5"
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr "6"
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr "7"
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr "8"
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr "9"
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr "10"
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr "11"
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr "12"
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr "13"
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr "14"
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr "15"
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr "16"
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr "17"
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr "18"
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr "19"
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr "20"
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr "21"
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr "22"
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr "23"
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr "24"
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr "25"
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr "26"
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr "27"
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr "28"
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr "29"
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr "30"
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr "31"
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr "Do"
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr "Lu"
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr "Ma"
-
-#: calendar/gui/print.c:326
-#, fuzzy
-msgid "We"
-msgstr "Me"
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr "Gi"
-
-#: calendar/gui/print.c:326
-#, fuzzy
-msgid "Fr"
-msgstr "Ve"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr "Sa"
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr "Da fare"
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr "Data odierna(%a %b %d %Y)"
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr ""
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr ""
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "Settimana corrente (%s %s %d - %s %d %d) "
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "Settimana corrente (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "Settimana in corso (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr "Mese corrente (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr "Anno corrente (%Y)"
-
-#: calendar/gui/print.c:1084
-#, fuzzy
-msgid "Print Calendar"
-msgstr "Usare il _Calendario"
-
-#: calendar/gui/print.c:1249
-#, fuzzy
-msgid "Print Preview"
-msgstr "Anteprima di stampa"
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr "Visualizza ora"
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr "Formato"
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr "12 ore (AM/PM)"
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr "24 ore"
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr "La Settimana comincia da"
-
-#: calendar/gui/prop.c:347
-#, fuzzy
-msgid "Sunday"
-msgstr "Domenica"
-
-#: calendar/gui/prop.c:348
-msgid "Monday"
-msgstr "Lunedì"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr "Ampiezza della giornata"
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-"Selezionare le ore di inizio e di fine\n"
-"che si desiderano visualizzare nella schermata\n"
-"del giorno e della settimana. Le ore al di fuori \n"
-"di questo intervallo non saranno visualizzate. "
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr "Inizio giornata:"
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr "Fine giornata:"
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr "Colori da usare"
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr "Colori"
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr "Mostra lista compiti:"
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr "Cronometra fino al termine"
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr "Opzioni dello stile della lista dei compiti:"
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr "Evidenzia compiti svolti"
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr "Evidenzia compiti da svolgere"
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr "Evidenzia compiti svolti oggi"
-
-#: calendar/gui/prop.c:678
-msgid "To Do List Properties"
-msgstr "Proprietà della lista dei compiti"
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr "Lista dei compiti"
-
-#: calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr "Avviso sonoro"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-#, fuzzy
-msgid "Alarm Properties"
-msgstr "Proprietà dell'avviso sonoro"
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr "Interruzione avviso sonoro dopo:"
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr "secondi"
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr "Abilita suoneria per"
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-#, fuzzy
-msgid "Defaults"
-msgstr "Predefinito"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut"
-msgstr "Taglia"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "Taglia l'oggetto selezionato nella clipboard"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy"
-msgstr "Copia"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "Copia gli oggetti selezionati sulla clipboard"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste"
-msgstr "Incolla"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Incolla un oggetto dalla clipboard"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "Seleziona gli indirizzi dei destinatari"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Elenco dei destinatari:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Cerca..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Nome"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr "Indirizzo"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Proprietà..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "A: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-#, fuzzy
-msgid "Cc: >>"
-msgstr "A: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-#, fuzzy
-msgid "Bcc: >>"
-msgstr "A: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-#, fuzzy
-msgid "label9"
-msgstr "etichetta"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-#, fuzzy
-msgid "label7"
-msgstr "etichetta"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-#, fuzzy
-msgid "label8"
-msgstr "etichetta"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Aggiungere allegato"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Rimuovere"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Rimuovere l'oggetto selezionato dalla lista degli allegati"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Aggiungere allegato..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Allegare un file al messaggio"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-#, fuzzy
-msgid "Attachment properties"
-msgstr "Proprietà dell'avviso sonoro"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr ""
-
-#: composer/e-msg-composer-attachment.glade.h:10
-#, fuzzy
-msgid "File name:"
-msgstr "Nome e cognome"
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr "Fare clic qui per la rubrica"
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "A:"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr "Inserire i destinatari del messaggio"
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr ""
-"Inserire gli indirizzi che riceveranno una copia conforme del messaggio"
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Inserire gli indirizzi che riceveranno una copia conforme del messaggio "
-"senza apparire nell'elenco dei destinatari del messaggio."
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr "Inserire il titolo dell'email"
-
-#: composer/e-msg-composer.c:444
-#, fuzzy
-msgid "Save as..."
-msgstr "Cerca..."
-
-#: composer/e-msg-composer.c:455
-#, fuzzy, c-format
-msgid "Error saving file: %s"
-msgstr "Errore nel caricare il file: %s"
-
-#: composer/e-msg-composer.c:475
-#, c-format
-msgid "Error loading file: %s"
-msgstr "Errore nel caricare il file: %s"
-
-#: composer/e-msg-composer.c:494
-#, fuzzy
-msgid "Discard this message?"
-msgstr "Inoltra questo messaggio"
-
-#: composer/e-msg-composer.c:511
-msgid "Open file"
-msgstr "Apri file"
-
-#: composer/e-msg-composer.c:623
-msgid "That file does not exist."
-msgstr ""
-
-#: composer/e-msg-composer.c:633
-msgid "That is not a regular file."
-msgstr ""
-
-#: composer/e-msg-composer.c:643
-msgid "That file exists but is not readable."
-msgstr ""
-
-#: composer/e-msg-composer.c:653
-msgid "That file appeared accesible but open(2) failed."
-msgstr ""
-
-#: composer/e-msg-composer.c:675
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-
-#: composer/e-msg-composer.c:696
-msgid "An error occurred while reading the file."
-msgstr ""
-
-#: composer/e-msg-composer.c:792 shell/e-shell-view-menu.c:438
-#, fuzzy
-msgid "_File"
-msgstr "Filtra"
-
-#: composer/e-msg-composer.c:798
-#, fuzzy
-msgid "_Open..."
-msgstr "_Apri"
-
-#: composer/e-msg-composer.c:799
-msgid "Load a previously saved message"
-msgstr ""
-
-#: composer/e-msg-composer.c:807
-msgid "_Save..."
-msgstr ""
-
-#: composer/e-msg-composer.c:808
-#, fuzzy
-msgid "Save message"
-msgstr "Invia un nuovo messaggio"
-
-#: composer/e-msg-composer.c:816
-#, fuzzy
-msgid "_Save as..."
-msgstr "Cerca..."
-
-#: composer/e-msg-composer.c:817
-#, fuzzy
-msgid "Save message with a different name"
-msgstr "Salva il messaggio in una cartella specificata"
-
-#: composer/e-msg-composer.c:825
-msgid "Save in _folder..."
-msgstr "Salva nella _cartella..."
-
-#: composer/e-msg-composer.c:826
-msgid "Save the message in a specified folder"
-msgstr "Salva il messaggio in una cartella specificata"
-
-#: composer/e-msg-composer.c:835
-msgid "_Insert text file... (FIXME)"
-msgstr ""
-
-#: composer/e-msg-composer.c:836
-#, fuzzy
-msgid "Insert a file as text into the message"
-msgstr "Allegare un file al messaggio"
-
-#: composer/e-msg-composer.c:845
-#, fuzzy
-msgid "_Send"
-msgstr "Invia"
-
-#: composer/e-msg-composer.c:846
-msgid "Send the message"
-msgstr "Invia il messaggio"
-
-#: composer/e-msg-composer.c:856
-#, fuzzy
-msgid "_Close..."
-msgstr "Sfoglia..."
-
-#: composer/e-msg-composer.c:857
-msgid "Quit the message composer"
-msgstr ""
-
-#: composer/e-msg-composer.c:870 shell/e-shell-view-menu.c:480
-#, fuzzy
-msgid "_Edit"
-msgstr "Modifica"
-
-#: composer/e-msg-composer.c:881
-#, fuzzy
-msgid "_Format"
-msgstr "Formato"
-
-#: composer/e-msg-composer.c:887
-msgid "HTML"
-msgstr ""
-
-#: composer/e-msg-composer.c:888
-#, fuzzy
-msgid "Send the mail in HTML format"
-msgstr "Invia posta in formato HTML"
-
-#: composer/e-msg-composer.c:901 shell/e-shell-view-menu.c:387
-#: shell/e-shell-view-menu.c:491
-#, fuzzy
-msgid "_View"
-msgstr "_Nuovo"
-
-#: composer/e-msg-composer.c:907
-#, fuzzy
-msgid "Show _attachments"
-msgstr "Mostra _allegati"
-
-#: composer/e-msg-composer.c:908
-#, fuzzy
-msgid "Show/hide attachments"
-msgstr "Mostra/nascondi allegati"
-
-#: composer/e-msg-composer.c:941
-msgid "Send"
-msgstr "Invia"
-
-#: composer/e-msg-composer.c:942
-msgid "Send this message"
-msgstr "Invia questo messaggio"
-
-#: composer/e-msg-composer.c:951
-msgid "Attach"
-msgstr "Allega"
-
-#: composer/e-msg-composer.c:952
-msgid "Attach a file"
-msgstr "Allega un file"
-
-#: composer/e-msg-composer.c:1139
-#, fuzzy
-msgid "Compose a message"
-msgstr "Componi un nuovo messaggio"
-
-#: mail/component-factory.c:188
-#, fuzzy
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Impossibile inizializzare il componente della posta di Evolution."
-
-#: mail/folder-browser-factory.c:23
-msgid "Get mail"
-msgstr "Ricevi posta"
-
-#: mail/folder-browser-factory.c:23
-msgid "Check for new mail"
-msgstr "Controlla nuova posta"
-
-#: mail/folder-browser-factory.c:24
-#, fuzzy
-msgid "Compose"
-msgstr "Colori"
-
-#: mail/folder-browser-factory.c:24
-#, fuzzy
-msgid "Compose a new message"
-msgstr "Componi un nuovo messaggio"
-
-#: mail/folder-browser-factory.c:28
-msgid "Reply"
-msgstr "Rispondi"
-
-#: mail/folder-browser-factory.c:28
-msgid "Reply to the sender of this message"
-msgstr "Rispondi all'autore di questo messaggio"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to All"
-msgstr "Rispondi a Tutti"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to all recipients of this message"
-msgstr "Rispondi a tutti i destinatari di questo messaggio"
-
-#: mail/folder-browser-factory.c:31
-msgid "Forward"
-msgstr "Inoltra"
-
-#: mail/folder-browser-factory.c:31
-msgid "Forward this message"
-msgstr "Inoltra questo messaggio"
-
-#: mail/folder-browser-factory.c:35
-#, fuzzy
-msgid "Move"
-msgstr "Lu"
-
-#: mail/folder-browser-factory.c:35
-#, fuzzy
-msgid "Move message to a new folder"
-msgstr "Salva il messaggio in una cartella specificata"
-
-#: mail/folder-browser-factory.c:37
-msgid "Print the selected message"
-msgstr "Stampa il messaggio selezionato"
-
-#: mail/folder-browser-factory.c:39
-msgid "Delete this message"
-msgstr "Elimina questo messaggio"
-
-#: mail/folder-browser-factory.c:59
-msgid "_Threaded Message List"
-msgstr ""
-
-#: mail/folder-browser-factory.c:72
-#, fuzzy
-msgid "_Mark all messages seen"
-msgstr "Invia un _Messaggio"
-
-#: mail/folder-browser-factory.c:78
-msgid "_Expunge"
-msgstr "Canc_ella"
-
-#: mail/folder-browser-factory.c:84
-#, fuzzy
-msgid "Mail _Filters ..."
-msgstr "_File..."
-
-#: mail/folder-browser-factory.c:90
-msgid "_vFolder Editor ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:96
-msgid "_Mail Configuration ..."
-msgstr "_Configurazione della Posta"
-
-#: mail/folder-browser-factory.c:102
-msgid "Forget _Passwords"
-msgstr "Dimentica _Password"
-
-#: mail/mail-config.c:688
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-"Inserire il nome e indirizzo di posta elettronica da usare per la\n"
-"posta in uscita. È possibile, eventualmente, inserire il nome\n"
-"dell'organizzazione, e il nome di un file dal quale leggere la firma."
-
-#: mail/mail-config.c:701
-#, fuzzy
-msgid "Full name:"
-msgstr "Nome e cognome"
-
-#: mail/mail-config.c:725
-#, fuzzy
-msgid "Email address:"
-msgstr "Indirizzo email:"
-
-#: mail/mail-config.c:740
-#, fuzzy
-msgid "Organization:"
-msgstr "Organizzazione"
-
-#: mail/mail-config.c:751
-msgid "Signature file:"
-msgstr "File firma:"
-
-#: mail/mail-config.c:756
-msgid "Signature File"
-msgstr "File firma"
-
-#: mail/mail-config.c:1167
-#, fuzzy
-msgid "Server:"
-msgstr "Server:"
-
-#: mail/mail-config.c:1173
-msgid "Username:"
-msgstr ""
-
-#: mail/mail-config.c:1179
-#, fuzzy
-msgid "Path:"
-msgstr "Percorso:"
-
-#: mail/mail-config.c:1187
-#, fuzzy
-msgid "Authentication:"
-msgstr "Autenticazione:"
-
-#: mail/mail-config.c:1199
-msgid "Detect supported types..."
-msgstr "Trova i tipi supportati..."
-
-#: mail/mail-config.c:1222
-#, fuzzy
-msgid "Test Settings"
-msgstr "Verifica i Nomi Selezionati"
-
-#: mail/mail-config.c:1344 mail/mail-config.c:1392
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"Selezionare il tipo di server della posta e inserirne le informazioni "
-"rilevanti. \n"
-"\n"
-"Se il server richiede un'autenticazione, è possibile cliccare il\n"
-"bottone \\\"Trova i tipi supportati...\\\" dopo aver inserito le altre\n"
-"informazioni. "
-
-#: mail/mail-config.c:1368
-#, fuzzy
-msgid ""
-"Select the kind of news server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"Selezionare il tipo di server della posta e inserirne le informazioni "
-"rilevanti. \n"
-"\n"
-"Se il server richiede un'autenticazione, è possibile cliccare il\n"
-"bottone \\\"Trova i tipi supportati...\\\" dopo aver inserito le altre\n"
-"informazioni. "
-
-#: mail/mail-config.c:1434
-msgid "Edit Identity"
-msgstr "Modifica Identità"
-
-#: mail/mail-config.c:1436
-msgid "Add Identity"
-msgstr "Aggiungi Identità"
-
-#: mail/mail-config.c:1515
-msgid "Edit Source"
-msgstr "Modifica Sorgente"
-
-#: mail/mail-config.c:1517
-msgid "Add Source"
-msgstr "Aggiungi Sorgente"
-
-#: mail/mail-config.c:1598
-msgid "Edit News Server"
-msgstr ""
-
-#: mail/mail-config.c:1600
-msgid "Add News Server"
-msgstr ""
-
-#: mail/mail-ops.c:393
-#, fuzzy
-msgid "Fetching mail"
-msgstr "Ricevi posta"
-
-#: mail/mail-ops.c:405
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-
-#: mail/mail-ops.c:791
-msgid "Move message(s) to"
-msgstr ""
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr ""
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr ""
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr ""
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr ""
-
-#: mail/mail-threads.c:814
-#, fuzzy
-msgid "Could not create dialog box."
-msgstr "Impossibile creare il connettore per il Pilot\n"
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr ""
-
-#: mail/message-list.c:456
-msgid "Online Status"
-msgstr "In linea"
-
-#: mail/message-list.c:492
-msgid "From"
-msgstr "Da"
-
-#: mail/message-list.c:499
-msgid "Subject"
-msgstr ""
-
-#: mail/message-list.c:506
-msgid "Date"
-msgstr "Data"
-
-#: mail/message-list.c:513
-#, fuzzy
-msgid "Received"
-msgstr "Ricevuto"
-
-#: mail/message-list.c:520
-msgid "To"
-msgstr "A"
-
-#: mail/message-list.c:527
-msgid "Size"
-msgstr "Dimensioni"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Installazione di Evolution"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Sembra che tu stia usando Evolution per la prima volta. "
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr "Cliccare \\\"OK\"\\ per installare i files di utente du Evolution in "
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"Impossibile creare la cartella\n"
-"%s\n"
-"Errore: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"Impossibile copiare i file in\n"
-"`%s'"
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "File di Evolution installati con successo."
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"Il file `%s' non è una cartella.\n"
-"Rinmuoverlo per permettere l'installazione\n"
-"dei file utente di Evolution."
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, fuzzy, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"Impossibile creare la cartella\n"
-"%s\n"
-"Errore: %s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:223
-#, fuzzy
-msgid "Evolution - Create new folder"
-msgstr "Evolution non riesce a creare le sue cartelle locali"
-
-#: shell/e-shell-folder-selection-dialog.c:95
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:236
-#, fuzzy
-msgid "New..."
-msgstr "_Nuovo"
-
-#: shell/e-shell-folder-title-bar.c:459 shell/e-shell-folder-title-bar.c:460
-msgid "(Untitled)"
-msgstr "(Senza nome)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Impossibile trovare Bug Buddy nel tuo $PATH. "
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "Bug buddy non può essere eseguito."
-
-#: shell/e-shell-view-menu.c:164
-msgid "Evolution"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:166
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:168
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution è una suite di applicazioni groupware\n"
-"per posta, calendario e gestione dei contatti\n"
-"nell'ambito dell'ambiente GNOME desktop. "
-
-#: shell/e-shell-view-menu.c:324
-#, fuzzy
-msgid "Go to folder..."
-msgstr "Vai nella cartella..."
-
-#: shell/e-shell-view-menu.c:381
-msgid "_New"
-msgstr "_Nuovo"
-
-#: shell/e-shell-view-menu.c:393
-msgid "_Folder"
-msgstr "_Cartella"
-
-#: shell/e-shell-view-menu.c:399
-#, fuzzy
-msgid "Evolution bar _shortcut"
-msgstr "_Collegamento"
-
-#: shell/e-shell-view-menu.c:408
-#, fuzzy
-msgid "_Mail message (FIXME)"
-msgstr "Invia un _Messaggio"
-
-#: shell/e-shell-view-menu.c:414
-#, fuzzy
-msgid "_Appointment (FIXME)"
-msgstr "_Appuntamenti"
-
-#: shell/e-shell-view-menu.c:420
-#, fuzzy
-msgid "_Contact (FIXME)"
-msgstr "_Contatti"
-
-#: shell/e-shell-view-menu.c:426
-msgid "_Task (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:448
-#, fuzzy
-msgid "_Go to folder..."
-msgstr "Vai nella cartella..."
-
-#: shell/e-shell-view-menu.c:449
-msgid "Display a different folder"
-msgstr "Mostra un'altra cartella"
-
-#: shell/e-shell-view-menu.c:456
-#, fuzzy
-msgid "_Create new folder..."
-msgstr "Salva nella _cartella..."
-
-#: shell/e-shell-view-menu.c:457 shell/e-shell-view-menu.c:467
-#, fuzzy
-msgid "Create a new folder"
-msgstr "Crea un nuovo _Calendario"
-
-#: shell/e-shell-view-menu.c:466
-#, fuzzy
-msgid "E_xit..."
-msgstr "Aggiungi..."
-
-#: shell/e-shell-view-menu.c:497
-msgid "Show _shortcut bar"
-msgstr "Mo_stra la barra dei collegamenti"
-
-#: shell/e-shell-view-menu.c:498
-msgid "Show the shortcut bar"
-msgstr "Mostra la barra dei collegamenti"
-
-#: shell/e-shell-view-menu.c:503
-msgid "Show _folder bar"
-msgstr "Mostra la _barra delle cartelle"
-
-#: shell/e-shell-view-menu.c:504
-msgid "Show the folder bar"
-msgstr "Mostra la barra delle cartelle"
-
-#: shell/e-shell-view-menu.c:526
-msgid "_Actions"
-msgstr "_Azioni"
-
-#: shell/e-shell-view-menu.c:537
-msgid "_Help"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:543
-#, fuzzy
-msgid "Help _index"
-msgstr "Indice degli Aiuti"
-
-#: shell/e-shell-view-menu.c:550
-#, fuzzy
-msgid "Getting _started"
-msgstr "Ora di inizio appuntamento:"
-
-#: shell/e-shell-view-menu.c:557
-#, fuzzy
-msgid "Using the _mailer"
-msgstr "Usare il programma di posta"
-
-#: shell/e-shell-view-menu.c:564
-#, fuzzy
-msgid "Using the _calendar"
-msgstr "Usare il _Calendario"
-
-#: shell/e-shell-view-menu.c:571
-#, fuzzy
-msgid "Using the c_ontact manager"
-msgstr "Usare il _Gestore dei Contatti"
-
-#: shell/e-shell-view-menu.c:581
-msgid "_Submit bug report"
-msgstr "_Inoltra un bug report"
-
-#: shell/e-shell-view-menu.c:582
-#, fuzzy
-msgid "Submit bug report using Bug Buddy"
-msgstr "Inoltra un bug-report con bug-buddy"
-
-#: shell/e-shell-view-menu.c:591
-msgid "_About Evolution..."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:592
-msgid "Show information about Evolution"
-msgstr ""
-
-#: shell/e-shell-view.c:114
-msgid "(No folder displayed)"
-msgstr "(Nessuna cartella mostrata)"
-
-#: shell/e-shell-view.c:342
-#, fuzzy
-msgid "Folders"
-msgstr "Cartelle"
-
-#: shell/e-shell-view.c:734
-#, fuzzy
-msgid "None"
-msgstr "Nessuno "
-
-#: shell/e-shell-view.c:738
-#, c-format
-msgid "Evolution - %s"
-msgstr ""
-
-#: shell/e-shell.c:293
-#, fuzzy, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Impossibile impostare il local storage --%s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "Icone _piccole"
-
-#: shell/e-shortcuts-view.c:236
-#, fuzzy
-msgid "Show the shortcuts as small icons"
-msgstr "Mostra i collegamenti come icone piccole "
-
-#: shell/e-shortcuts-view.c:238
-#, fuzzy
-msgid "_Large icons"
-msgstr "Icone _grandi"
-
-#: shell/e-shortcuts-view.c:239
-#, fuzzy
-msgid "Show the shortcuts as large icons"
-msgstr "Mostra i collegamenti come icone grandi"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "Attiva"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "Attiva questo collegamento"
-
-#: shell/e-shortcuts-view.c:333
-#, fuzzy
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Rimuovi il collegamenti dalla barra dei collegamenti"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Errore di salvataggio dei collegamenti."
-
-#: shell/e-storage.c:217
-#, fuzzy
-msgid "(No name)"
-msgstr "Nome"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr ""
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr ""
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr ""
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr ""
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr ""
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr ""
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr ""
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr ""
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr ""
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr ""
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr ""
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr ""
-
-#: shell/main.c:66
-#, fuzzy
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Buongiorno.  Grazie per aver trovato il tempo di scaricare questa\n"
-"prima versione-prototipo del groupware suite Evolution.\n"
-"\n"
-"La squadra di evolution ha lavorato sodo per rendere Evolution il più\n"
-"robusto, estensibile, gradevole, veloce ed adatto possibile ad un uso\n"
-"intenso di internet.  Siamo stanchi.  Ma non abbiamo ancora finito.\n"
-"\n"
-"Mentre espolorate Evolution, vogliate tenere presente che la maggior\n"
-"parte del nostro lavoro è stato indirizzato sul motore di fondo che\n"
-"gestisce l'intero sistema e non sull'interfaccia utente.  Stiamo\n"
-"appena raggiungendo il nostro obiettivo, da quel momento in poi, ci\n"
-"dedicheremo con passione e attenzione all'interfaccia utente. Almeno\n"
-"sappiate che state utilizzando una versione dimostrativa.  \n"
-"\n"
-"Ora è il momento della liberatoria da nerd.  Evolution farà impallare\n"
-"il vostro computer, perderà la vostra posta, lascerà processi attivi,\n"
-"consumerà il 100% del tempo di CPU, si bloccherà, manderà posta in\n"
-"HTML a liste di indirizzi scelti a caso mettendovi in imbarazzo di\n"
-"fronte ad amici e colleghi.  Usatelo a vostro rischio e pericolo.\n"
-"\n"
-"Ci auguriamo che apprezziate il risultato del nostro duro lavoro,\n"
-"e aspettiamo ansiosamente il vostro contributo\n"
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Grazie\n"
-"il team di Evolution.\n"
-
-#: shell/main.c:128
-msgid "Cannot initialize the Evolution shell."
-msgstr "Impossibile inizializzare la shell di Evolution."
-
-#: shell/main.c:166
-#, fuzzy
-msgid "Cannot initialize the configuration system."
-msgstr "Impossibile inizializzare la shell di Evolution."
-
-#: shell/main.c:172
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Impossibile inizializzare il sistema di componenti Bonobo."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Campi"
-
-#: widgets/e-table/e-table-config.glade.h:8
-#, fuzzy
-msgid "Grouping"
-msgstr "Gruppi %i"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Ordina"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Filtra"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-#, fuzzy
-msgid "Field Chooser"
-msgstr "Campi"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "Campi disponibili"
-
-#: widgets/e-table/e-table-group.glade.h:9
-#, fuzzy
-msgid "label1"
-msgstr "etichetta"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "Mostra in questo ordine"
-
-#: widgets/e-table/e-table-group.glade.h:11
-#, fuzzy
-msgid "label2"
-msgstr "etichetta"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Aggiungi >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Rimuovi"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-#, fuzzy
-msgid "Tentative"
-msgstr "Tentativo"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "Occupato"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr "Via dall'ufficio"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "Nessuna informazione"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr "_Invita altri"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-#, fuzzy
-msgid "_Options"
-msgstr "Opzioni"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr "Mostra s_olo le ore lavorative"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr "Vista _allargata"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr "A_ggiorna libero/Occupato"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "_Tutto il Personale e le Risorse"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr "Tutto il _Personale e una Risorsa"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr "Personale _Richiesto"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr "Personale Richiesto e _una risorsa"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-#, fuzzy
-msgid "Meeting _start time:"
-msgstr "Ora di inizio appuntamento:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-#, fuzzy
-msgid "Meeting _end time:"
-msgstr "Ora di termine dell' appuntamento:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr "Tutti i partecipanti"
-
-#: widgets/misc/e-clipped-label.c:106
-#, fuzzy
-msgid "..."
-msgstr "Aggiungi..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, fuzzy, c-format
-msgid "Group %i"
-msgstr "Gruppi %i"
-
-#, fuzzy
-#~ msgid "_Close Calendar"
-#~ msgstr "Chiudi il _Calendario"
-
-#~ msgid "Close current calendar"
-#~ msgstr "Chiudi calendario corrente"
-
-#~ msgid "Disabled"
-#~ msgstr "Disabilitato"
-
-#~ msgid "Synchronize"
-#~ msgstr "Sincronizza"
-
-#~ msgid "Copy From Pilot"
-#~ msgstr "Copia dal Pilot"
-
-#~ msgid "Copy To Pilot"
-#~ msgstr "Copia sul Pilot"
-
-#~ msgid "Merge To Pilot"
-#~ msgstr "Unisci dal Pilot"
-
-#~ msgid "Configuration utility for the calendar conduit.\n"
-#~ msgstr "Utilità di configurazione per il calendario.\n"
-
-#~ msgid "Synchronize Action"
-#~ msgstr "Sincronizzazione"
-
-#~ msgid ""
-#~ "No pilot configured, please choose the\n"
-#~ "'Pilot Link Properties' capplet first."
-#~ msgstr ""
-#~ "Nessun pilot configurato, scegliere prima\n"
-#~ "le 'Proprietà di collegamento del Pilot'. "
-
-#, fuzzy
-#~ msgid "Cannot initialze the GnomePilot Daemon"
-#~ msgstr "Impossibile inizializzare il sistema di componenti Bonobo."
-
-#~ msgid "Cannot connect to the GnomePilot Daemon"
-#~ msgstr "Impossibile conettersi al demone GnomePIlot"
-
-#~ msgid "Error while communicating with calendar server"
-#~ msgstr "Errore durante la comunicazione con il server del calendario"
-
-#~ msgid "Calendar holds %d entries"
-#~ msgstr "Il calendario contiene %d dati inseriti"
-
-#~ msgid "Could not start gnomecal server"
-#~ msgstr "Impossibile avviare il server gnomecal"
-
-#~ msgid "Could not read pilot's DateBook application block"
-#~ msgstr "Impossibile leggere il blocco Datebook del Pilot"
-
-#~ msgid "Specifies the port on which the Pilot is"
-#~ msgstr "Specifica la porta alla quale è collegato il Pilot"
-
-#~ msgid "If you want to debug the attributes on records"
-#~ msgstr "Se si voglioni debuggare gli attibuti sui record"
-
-#~ msgid "Only syncs from desktop to pilot"
-#~ msgstr "Sincronizza solamente dal desktop al Pilot"
-
-#~ msgid "Only syncs from pilot to desktop"
-#~ msgstr "Sincronizza solamente dal Pilot al desktop"
-
-#~ msgid "Can not bind to device %s\n"
-#~ msgstr "Impossibile collegare il dispositivo %s\n"
-
-#~ msgid "Failed to get a connection from the Pilot device"
-#~ msgstr "Connessione al dispositivo Pilot non riuscita"
-
-#~ msgid "\tObject did not exist, creating a new one\n"
-#~ msgstr "\\tOggetto non esistente, creazione di uno nuovo\n"
-
-#~ msgid ""
-#~ "\tObject has been modified on desktop and on the pilot, desktop takes "
-#~ "precedence\n"
-#~ msgstr ""
-#~ "\\tOggetto è stato modificato sul desktop e sul Pilot, il descktop ha la "
-#~ "precedenza\n"
-
-#~ msgid "Syncing with the pilot..."
-#~ msgstr "Sincronizzazione con il Pilot..."
-
-#~ msgid "Could not open DatebookDB on the Pilot"
-#~ msgstr "Impossibile aprire DateBookDB sul Pilot"
-
-#~ msgid "Unable to open DatebookDB"
-#~ msgstr "Impossibile aprire DateBookDB"
-
-#~ msgid "Synced DateBook from Pilot to GnomeCal"
-#~ msgstr "DateBook del Pilot sincronizzato con GnomeCal"
-
-#~ msgid "Configuration utility for the todo conduit.\n"
-#~ msgstr "Utilità di confugurazione per FIXME\n"
-
-#~ msgid "Enabled"
-#~ msgstr "Abilitato"
-
-#~ msgid "Cut selected region into the clipboard"
-#~ msgstr "Taglia la regione selezionata nella clipboard "
-
-#~ msgid "Copy selected region into the clipboard"
-#~ msgstr "Copia la regione selezionata nella clipboard"
-
-#~ msgid "Paste selected region into the clipboard"
-#~ msgstr "Incolla la regione selezionata nella clipboar"
-
-#~ msgid "Undo"
-#~ msgstr "Annulla"
-
-#~ msgid "Undo last operation"
-#~ msgstr "Annulla ultima operazione"
-
-#~ msgid "Find messages"
-#~ msgstr "Trova messaggio"
-
-#~ msgid "Test these values before continuing"
-#~ msgstr "Provare questi valori prima di continuare"
-
-#~ msgid "Select the method you would like to use to deliver your mail."
-#~ msgstr ""
-#~ "Selezionare il metodo che si desidera utilizzare per inviare la posta."
-
-#, fuzzy
-#~ msgid "Mail Configuration"
-#~ msgstr "_Configurazione della Posta"
-
-#~ msgid "Identity"
-#~ msgstr "Identità"
-
-#~ msgid "Mail Source"
-#~ msgstr "Sorgente della Posta"
-
-#~ msgid "Mail Transport"
-#~ msgstr "Trasporto della Posta"
-
-#~ msgid "Signature file"
-#~ msgstr "File firma"
-
-#, fuzzy
-#~ msgid "Camel Providers Configuration"
-#~ msgstr "Configurazione del Provider Camel"
-
-#~ msgid "Identities"
-#~ msgstr "Identità"
-
-#~ msgid "Sources"
-#~ msgstr "Sorgenti"
-
-#~ msgid "Transports"
-#~ msgstr "Trasporti"
-
-#~ msgid "Mail Component: I could not initialize Bonobo"
-#~ msgstr "Componente della Posta: impossibile inizializzare Bonobo"
-
-#, fuzzy
-#~ msgid "Cannot open location: %s"
-#~ msgstr "Impossibile impostare location: %s"
-
-#~ msgid "New group"
-#~ msgstr "Nuovo gruppo"
-
-#~ msgid "Composes a new mail message"
-#~ msgstr "Componei un nuovo messaggio"
-
-#~ msgid "Meeting Re_quest"
-#~ msgstr "_Richieste di appuntamenti"
-
-#~ msgid "_Task"
-#~ msgstr "_Obiettivi"
-
-#~ msgid "Task _Request"
-#~ msgstr "_Richiesta Obiettivi"
-
-#~ msgid "_Journal Entry"
-#~ msgstr "_Ingressi giornalieri"
-
-#~ msgid "_Note"
-#~ msgstr "_Appunti"
-
-#~ msgid "_Selected Items"
-#~ msgstr "_Oggetti selezionati"
-
-#~ msgid "Clos_e All Items"
-#~ msgstr "Chiudi _Tutti"
-
-#~ msgid "Closes all the open items"
-#~ msgstr "Chiude tutti gli oggetti aperti"
-
-#~ msgid "We are sorry, Evolution's Folder Browser can not be initialized."
-#~ msgstr ""
-#~ "Spiacenti, il Browser delle cartelle di Evolution non può essere "
-#~ "inizializzato"
-
-#~ msgid "Whether a message preview should be shown"
-#~ msgstr "Se un'anteprima del mesaggio dovrebbe essere mostrata"
diff --git a/po/ja.po b/po/ja.po
deleted file mode 100644
index 42f6f8add0..0000000000
--- a/po/ja.po
+++ /dev/null
@@ -1,3915 +0,0 @@
-# evolution ja.po
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Akira TAGOH <tagoh@gnome.gr.jp>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution CVS-20000810\n"
-"POT-Creation-Date: 2000-08-10 12:58+0900\n"
-"PO-Revision-Date: 2000-08-10 13:52+0900\n"
-"Last-Translator: Akira TAGOH <tagoh@gnome.gr.jp>\n"
-"Language-Team: Japanese <translation@gnome.gr.jp>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=euc-jp\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-gnomecard-addressbook.c:41
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:59 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Bonobo ¤Î½é´ü²½¤¬½ÐÍè¤Þ¤»¤ó¤Ç¤·¤¿"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "¥«¥Æ¥´¥ê"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "¥¢¥¤¥Æ¥à¤Ï¤³¤ì¤é¤Î¥«¥Æ¥´¥ê¤Ë°¤·¤Æ¤¤¤Þ¤¹:"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "ÍøÍѤǤ­¤ë¥«¥Æ¥´¥ê:"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/dialogs/task-editor.c:217 calendar/gui/event-editor.c:1168
-msgid "FIXME: _Appointment"
-msgstr "FIXME: ͽÌó(_A)"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/dialogs/task-editor.c:218 calendar/gui/event-editor.c:1169
-msgid "FIXME: Meeting Re_quest"
-msgstr "FIXME: ²ñµÄ°ÍÍê(_q)"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/dialogs/task-editor.c:216 calendar/gui/event-editor.c:1171
-msgid "FIXME: _Mail Message"
-msgstr "FIXME: ¥á¡¼¥ë¥á¥Ã¥»¡¼¥¸(_M)"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/dialogs/task-editor.c:219 calendar/gui/event-editor.c:1172
-msgid "FIXME: _Contact"
-msgstr "FIXME: ¸ò¾Ä(_C)"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/dialogs/task-editor.c:213
-#: calendar/gui/dialogs/task-editor.c:220 calendar/gui/event-editor.c:1173
-msgid "FIXME: _Task"
-msgstr "FIXME: ºî¶È(_T)"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/dialogs/task-editor.c:214
-#: calendar/gui/dialogs/task-editor.c:221 calendar/gui/event-editor.c:1174
-msgid "FIXME: Task _Request"
-msgstr "FIXME: ºî¶È°ÍÍê(_R)"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/dialogs/task-editor.c:222 calendar/gui/event-editor.c:1175
-msgid "FIXME: _Journal Entry"
-msgstr "FIXME: »ÅÌõµ­Æþ(_J)"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/dialogs/task-editor.c:223 calendar/gui/event-editor.c:1176
-msgid "FIXME: _Note"
-msgstr "FIXME: ¥Î¡¼¥È(_N)"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/dialogs/task-editor.c:225
-#: calendar/gui/dialogs/task-editor.c:332 calendar/gui/event-editor.c:1178
-#: calendar/gui/event-editor.c:1285
-msgid "FIXME: Ch_oose Form..."
-msgstr "FIXME: ¥Õ¥©¡¼¥à¤òÁªÂò(_o)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/dialogs/task-editor.c:230 calendar/gui/event-editor.c:1183
-msgid "FIXME: _Memo Style"
-msgstr "FIXME: ¥á¥â¥¹¥¿¥¤¥ë(_M)"
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/dialogs/task-editor.c:232 calendar/gui/event-editor.c:1185
-msgid "FIXME: Define Print _Styles..."
-msgstr "FIXME: °õºþ¥¹¥¿¥¤¥ë¤ÎÄêµÁ(_S)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/dialogs/task-editor.c:239 calendar/gui/event-editor.c:1192
-msgid "FIXME: S_end"
-msgstr "FIXME: Á÷¿®(_e)"
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/dialogs/task-editor.c:243 calendar/gui/event-editor.c:1196
-msgid "FIXME: Save Attac_hments..."
-msgstr "FIXME: źÉÕ¤ÎÊݸ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "ºï½ü(_D)"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/dialogs/task-editor.c:246 calendar/gui/event-editor.c:1199
-msgid "FIXME: _Move to Folder..."
-msgstr "FIXME: ¥Õ¥©¥ë¥À¤Ø°ÜÆ°(_M)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/dialogs/task-editor.c:247 calendar/gui/event-editor.c:1200
-msgid "FIXME: Cop_y to Folder..."
-msgstr "FIXME: ¥Õ¥©¥ë¥À¤Ø¥³¥Ô¡¼(_y)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/dialogs/task-editor.c:249 calendar/gui/event-editor.c:1202
-msgid "Page Set_up"
-msgstr "¥Ú¡¼¥¸ÀßÄê(_u)"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/dialogs/task-editor.c:250 calendar/gui/event-editor.c:1203
-msgid "FIXME: Print Pre_view"
-msgstr "FIXME: °õºþ¥×¥ì¥Ó¥å¡¼(_v)"
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/dialogs/task-editor.c:271 calendar/gui/event-editor.c:1224
-msgid "FIXME: Paste _Special..."
-msgstr "FIXME: Æü쎤êÉÕ¤±(_S)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/dialogs/task-editor.c:276 calendar/gui/event-editor.c:1229
-msgid "FIXME: Mark as U_nread"
-msgstr "FIXME: ̤Æɤ˥ޡ¼¥¯(_n)"
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/dialogs/task-editor.c:280 calendar/gui/event-editor.c:1233
-msgid "_Object"
-msgstr "¥ª¥Ö¥¸¥§¥¯¥È(_O)"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/dialogs/task-editor.c:285
-#: calendar/gui/dialogs/task-editor.c:293 calendar/gui/event-editor.c:1238
-#: calendar/gui/event-editor.c:1245
-msgid "FIXME: _Item"
-msgstr "FIXME: ¥¢¥¤¥Æ¥à(_I)"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/dialogs/task-editor.c:286
-#: calendar/gui/dialogs/task-editor.c:294 calendar/gui/event-editor.c:1239
-#: calendar/gui/event-editor.c:1246
-msgid "FIXME: _Unread Item"
-msgstr "FIXME: ̤ÆÉ¥¢¥¤¥Æ¥à(_U)"
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/dialogs/task-editor.c:288 calendar/gui/event-editor.c:1240
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr "FIXME: ¥Õ¥©¥ë¥À¤ÎºÇ½é¤Î¥¢¥¤¥Æ¥à(_r)"
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/dialogs/task-editor.c:296 calendar/gui/event-editor.c:1247
-msgid "FIXME: _Last Item in Folder"
-msgstr "FIXME: ¥Õ¥©¥ë¥À¤ÎºÇ¸å¤Î¥¢¥¤¥Æ¥à(_L)"
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/dialogs/task-editor.c:301 calendar/gui/event-editor.c:1252
-msgid "FIXME: _Standard"
-msgstr "FIXME: ɸ½à(_S)"
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/dialogs/task-editor.c:303 calendar/gui/event-editor.c:1254
-msgid "FIXME: __Formatting"
-msgstr "FIXME: ½ñ¼°(__)"
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/dialogs/task-editor.c:306 calendar/gui/event-editor.c:1257
-msgid "FIXME: _Customize..."
-msgstr "FIXME: ¥«¥¹¥¿¥Þ¥¤¥º(_C)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/dialogs/task-editor.c:311 calendar/gui/event-editor.c:1262
-msgid "Pre_vious"
-msgstr "Á°(_v)"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/dialogs/task-editor.c:312 calendar/gui/event-editor.c:1263
-msgid "Ne_xt"
-msgstr "¼¡(_x)"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/dialogs/task-editor.c:314 calendar/gui/event-editor.c:1267
-msgid "_Toolbars"
-msgstr "¥Ä¡¼¥ë¥Ð¡¼(_T)"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/dialogs/task-editor.c:319 calendar/gui/event-editor.c:1272
-msgid "FIXME: _File..."
-msgstr "FIXME: ¥Õ¥¡¥¤¥ë(_F)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/dialogs/task-editor.c:320 calendar/gui/event-editor.c:1273
-msgid "FIXME: It_em..."
-msgstr "FIXME: ¥¢¥¤¥Æ¥à(_e)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/dialogs/task-editor.c:321 calendar/gui/event-editor.c:1274
-msgid "FIXME: _Object..."
-msgstr "FIXME: ¥ª¥Ö¥¸¥§¥¯¥È(_O)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/dialogs/task-editor.c:326 calendar/gui/event-editor.c:1279
-msgid "FIXME: _Font..."
-msgstr "FIXME: ¥Õ¥©¥ó¥È(_F)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/dialogs/task-editor.c:327 calendar/gui/event-editor.c:1280
-msgid "FIXME: _Paragraph..."
-msgstr "FIXME: ÃÊÍî(_P)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/dialogs/task-editor.c:334 calendar/gui/event-editor.c:1287
-msgid "FIXME: Desi_gn This Form"
-msgstr "FIXME: ¤³¤Î¥Õ¥©¡¼¥à¤Î¥Ç¥¶¥¤¥ó(_g)"
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/dialogs/task-editor.c:335 calendar/gui/event-editor.c:1288
-msgid "FIXME: D_esign a Form..."
-msgstr "FIXME: ¥Õ¥©¡¼¥à¤Î¥Ç¥¶¥¤¥ó(_e)"
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/dialogs/task-editor.c:337 calendar/gui/event-editor.c:1290
-msgid "FIXME: Publish _Form..."
-msgstr "FIXME: ȯ¹Ô¥Õ¥©¡¼¥à(_F)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/dialogs/task-editor.c:338 calendar/gui/event-editor.c:1291
-msgid "FIXME: Pu_blish Form As..."
-msgstr "FIXME: ¾¤Îȯ¹Ô¥Õ¥©¡¼¥à(_b)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/dialogs/task-editor.c:340 calendar/gui/event-editor.c:1293
-msgid "FIXME: Script _Debugger"
-msgstr "FIXME: ¥¹¥¯¥ê¥×¥È¥Ç¥Ð¥Ã¥¬(_D)"
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/dialogs/task-editor.c:345 calendar/gui/event-editor.c:1298
-msgid "FIXME: _Spelling..."
-msgstr "FIXME: ¥¹¥Ú¥ë(_S)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/dialogs/task-editor.c:350 calendar/gui/event-editor.c:1303
-msgid "_Forms"
-msgstr "¥Õ¥©¡¼¥à(_F)"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "FIXME: ¿·µ¬¸ò¾Ä(_C)"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr "FIXME: Ʊ¤¸Áê¼ê¤«¤é¿·µ¬¸ò¾Ä(_C)"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr "FIXME: ¿·µ¬¼ê»æ¤Ë¸ò¾Ä(_L)"
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr "FIXME: ¸ò¾Ä¤¹¤ë¿·µ¬¥á¥Ã¥»¡¼¥¸(_M)"
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr "FIXME: ¸ò¾Ä¤È¤Î¿·µ¬²ñµÄ(_g)"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr "FIXME: ²ñµÄ·×²è(_P)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr "FIXME: ¸ò¾Ä¤Î¤¿¤á¤Î¿·µ¬ºî¶È(_T)"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr "FIXME: ¸ò¾Ä¤Î¤¿¤á¤Î¿·µ¬»ÅÌõµ­Æþ"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr "FIXME: ºÆÄ´ºº¤Î¤¿¤á¤Î¥Õ¥é¥°(_F)..."
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr "FIXME: ¥¢¥É¥ì¥¹¤Î¥Þ¥Ã¥×¤òɽ¼¨(_D)"
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr "FIXME: Web ¥Ú¡¼¥¸¤ò³«¤¯(_O)"
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr "FIXME: vCard ¤ÇžÁ÷(_v)"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/dialogs/task-editor.c:367 calendar/gui/event-editor.c:1316
-msgid "FIXME: For_ward"
-msgstr "FIXME: žÁ÷(_w)"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/dialogs/task-editor.c:380 calendar/gui/event-editor.c:1329
-msgid "_Insert"
-msgstr "ÁÞÆþ(_I)"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/dialogs/task-editor.c:381 calendar/gui/event-editor.c:1330
-msgid "F_ormat"
-msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È(_o)"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/dialogs/task-editor.c:382 calendar/gui/event-editor.c:1331
-#: shell/e-shell-view-menu.c:512
-msgid "_Tools"
-msgstr "¥Ä¡¼¥ë(_T)"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/dialogs/task-editor.c:383 calendar/gui/event-editor.c:1332
-msgid "Actio_ns"
-msgstr "¹ÔÆ°(_n)"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "Êݸ¤ÈÊĤ¸¤ë"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1371
-msgid "Save the appointment and close the dialog box"
-msgstr "ͽÌó¤òÊݸ¤·¤Æ¥À¥¤¥¢¥í¥°¥Ü¥Ã¥¯¥¹¤òÊĤ¸¤ë"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:680
-msgid "Print..."
-msgstr "°õºþ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/dialogs/task-editor.c:415 calendar/gui/event-editor.c:1376
-msgid "Print this item"
-msgstr "¤³¤Î¥¢¥¤¥Æ¥à¤ò°õºþ¤¹¤ë"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/dialogs/task-editor.c:416 calendar/gui/event-editor.c:1377
-msgid "FIXME: Insert File..."
-msgstr "FIXME: ¥Õ¥¡¥¤¥ë¤ÎÁÞÆþ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/dialogs/task-editor.c:417 calendar/gui/event-editor.c:1378
-msgid "Insert a file as an attachment"
-msgstr "¥Õ¥¡¥¤¥ë¤òźÉդȤ·¤ÆÁÞÆþ¤¹¤ë"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/gui/component/addressbook.c:427
-#: calendar/gui/e-calendar-table.c:375
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:508
-#: mail/folder-browser-factory.c:40 mail/mail-config.glade.h:13
-#: mail/mail-config.glade.h:18 mail/mail-config.glade.h:24
-msgid "Delete"
-msgstr "ºï½ü"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/dialogs/task-editor.c:426 calendar/gui/event-editor.c:1387
-#: calendar/gui/gncal-todo.c:336
-msgid "Delete this item"
-msgstr "¤³¤Î¥¢¥¤¥Æ¥à¤òºï½ü"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/dialogs/task-editor.c:428 calendar/gui/event-editor.c:1389
-msgid "FIXME: Previous"
-msgstr "FIXME: Á°"
-
-#: addressbook/contact-editor/e-contact-editor.c:858
-#: calendar/gui/dialogs/task-editor.c:429 calendar/gui/event-editor.c:1390
-msgid "Go to the previous item"
-msgstr "Á°¤Î¥¢¥¤¥Æ¥à¤Ø°ÜÆ°¤¹¤ë"
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/dialogs/task-editor.c:430 calendar/gui/event-editor.c:1391
-msgid "FIXME: Next"
-msgstr "FIXME: ¼¡"
-
-#: addressbook/contact-editor/e-contact-editor.c:861
-#: calendar/gui/dialogs/task-editor.c:431 calendar/gui/event-editor.c:1392
-msgid "Go to the next item"
-msgstr "¼¡¤Î¥¢¥¤¥Æ¥à¤Ø°ÜÆ°¤¹¤ë"
-
-#: addressbook/contact-editor/e-contact-editor.c:864
-#: calendar/gui/dialogs/task-editor.c:432 calendar/gui/event-editor.c:1393
-msgid "FIXME: Help"
-msgstr "FIXME: ¥Ø¥ë¥×"
-
-#: addressbook/contact-editor/e-contact-editor.c:865
-#: calendar/gui/dialogs/task-editor.c:433 calendar/gui/event-editor.c:1394
-msgid "See online help"
-msgstr "¥ª¥ó¥é¥¤¥ó¥Ø¥ë¥×¤ò¸«¤ë"
-
-#: addressbook/contact-editor/e-contact-editor.c:1320
-msgid "Assistant"
-msgstr "¥¢¥·¥¹¥¿¥ó¥È"
-
-#: addressbook/contact-editor/e-contact-editor.c:1321
-#: addressbook/contact-editor/e-contact-editor.c:1425
-msgid "Business"
-msgstr "ȁȚ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1322
-msgid "Business 2"
-msgstr "ȁȚ 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1323
-msgid "Business Fax"
-msgstr "»Å»ö¤Î FAX"
-
-#: addressbook/contact-editor/e-contact-editor.c:1324
-msgid "Callback"
-msgstr "¸Æ¤ÓÌᤷ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1325
-msgid "Car"
-msgstr "¼Ö"
-
-#: addressbook/contact-editor/e-contact-editor.c:1326
-msgid "Company"
-msgstr "²ñ¼Ò"
-
-#: addressbook/contact-editor/e-contact-editor.c:1327
-#: addressbook/contact-editor/e-contact-editor.c:1426
-msgid "Home"
-msgstr "²È"
-
-#: addressbook/contact-editor/e-contact-editor.c:1328
-msgid "Home 2"
-msgstr "²È 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1329
-msgid "Home Fax"
-msgstr "²È¤Î FAX"
-
-#: addressbook/contact-editor/e-contact-editor.c:1330
-msgid "ISDN"
-msgstr "ISDN"
-
-#: addressbook/contact-editor/e-contact-editor.c:1331
-msgid "Mobile"
-msgstr "¥â¥Ð¥¤¥ë"
-
-#: addressbook/contact-editor/e-contact-editor.c:1332
-#: addressbook/contact-editor/e-contact-editor.c:1427
-#: mail/mail-config.glade.h:27
-msgid "Other"
-msgstr "¤½¤Î¾"
-
-#: addressbook/contact-editor/e-contact-editor.c:1333
-msgid "Other Fax"
-msgstr "¤½¤Î¾¤Î FAX"
-
-#: addressbook/contact-editor/e-contact-editor.c:1334
-msgid "Pager"
-msgstr "¥Ý¥±¥Ù¥ë"
-
-#: addressbook/contact-editor/e-contact-editor.c:1335
-msgid "Primary"
-msgstr "¼çÍפÊ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1336
-msgid "Radio"
-msgstr "¥é¥¸¥ª"
-
-#: addressbook/contact-editor/e-contact-editor.c:1337
-msgid "Telex"
-msgstr "¥Æ¥ì¥Ã¥¯¥¹"
-
-#: addressbook/contact-editor/e-contact-editor.c:1338
-msgid "TTY/TDD"
-msgstr "TTY/TDD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1382
-msgid "Primary Email"
-msgstr "¼çÍ×¤Ê Email"
-
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Email 2"
-msgstr "Email 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Email 3"
-msgstr "Email 3"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:7
-msgid ""
-"Are you sure you want\n"
-"to delete this contact?"
-msgstr ""
-"¤³¤Î¥³¥ó¥¿¥¯¥È¤òºï½ü\n"
-"¤·¤¿¤¤¤Î¤Ï³Î¤«¤Ç¤¹¤«?"
-
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:9
-msgid "Delete Contact?"
-msgstr "¥³¥ó¥¿¥¯¥È¤òºï½ü?"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "ÄɲÃ(_A)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "ÅÅÏÃ¥¿¥¤¥×"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "¿·µ¬ÅÅÏÃ¥¿¥¤¥×"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91 mail/mail-config.glade.h:11
-#: mail/mail-config.glade.h:16 mail/mail-config.glade.h:22
-msgid "Add"
-msgstr "ÄɲÃ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "¥³¥ó¥¿¥¯¥È¥¨¥Ç¥£¥¿"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "¥Õ¥ë¥Í¡¼¥à(_F)..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "ÊÌ̾:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Web ¥Ú¡¼¥¸¤Î URL:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "HTML ¥á¡¼¥ë¤ò¼õ¿®µö²Ä(_H)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "½»½ê:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "ȁȚ(_B)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "²È(_H)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "»Å»ö¤Î FAX(_F)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "¥â¥Ð¥¤¥ë(_M)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "ȁȚ(_u)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "¤³¤ì¤Ï͹ÊØʪ¤Î½»½ê¤Ç¤¹"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "¥³¥ó¥¿¥¯¥È(_o)..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:26
-msgid "Ca_tegories..."
-msgstr "¥«¥Æ¥´¥ê(_t)..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "²ñ¼Ò(_C):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:18
-msgid "General"
-msgstr "°ìÈÌ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "ôÅöÉô½ð(_D):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "»ö̳½ê(_O):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "ÀìÌ翦(_P):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "¥Ë¥Ã¥¯¥Í¡¼¥à(_N):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr "ÇÛ¶ö¼Ô(_S):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "ÃÂÀ¸Æü(_B):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr "¥¢¥·¥¹¥¿¥ó¥È¤Î̾Á°(_A):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "¥Þ¥Í¡¼¥¸¥ã¤Î̾Á°(_M):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "µ­Ç°Æü(_v):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "¥Î¡¼¥È(_t):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:33
-msgid "Details"
-msgstr "¾ÜºÙ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "¥Õ¥ë¥Í¡¼¥à¤Î¥Á¥§¥Ã¥¯"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "¸ª½ñ¤­(_T):"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "̾(_F):"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "Ãæ´Ö̾(_M):"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "À«(_L):"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "ÀÜÈø¼­(_S):"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-
-#: addressbook/gui/component/addressbook.c:421
-#: calendar/gui/calendar-commands.c:545
-msgid "New"
-msgstr "¿·µ¬"
-
-#: addressbook/gui/component/addressbook.c:421
-msgid "Create a new contact"
-msgstr "¿·µ¬¥³¥ó¥¿¥¯¥È¤òºîÀ®¤¹¤ë"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Find"
-msgstr "¸¡º÷"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Find a contact"
-msgstr "¥³¥ó¥¿¥¯¥È¤ò¸¡º÷¤¹¤ë"
-
-#: addressbook/gui/component/addressbook.c:426
-#: calendar/gui/calendar-commands.c:549 mail/folder-browser-factory.c:38
-msgid "Print"
-msgstr "°õºþ"
-
-#: addressbook/gui/component/addressbook.c:426
-msgid "Print contacts"
-msgstr "¥³¥ó¥¿¥¯¥È¤ò°õºþ¤¹¤ë"
-
-#: addressbook/gui/component/addressbook.c:427
-msgid "Delete a contact"
-msgstr "¥³¥ó¥¿¥¯¥È¤òºï½ü"
-
-#: addressbook/gui/component/addressbook.c:495
-msgid "_Print Contacts..."
-msgstr "¥³¥ó¥¿¥¯¥È¤ò°õºþ¤¹¤ë(_P)..."
-
-#: addressbook/gui/component/addressbook.c:505
-#: addressbook/gui/component/addressbook.c:1044
-msgid "As _Table"
-msgstr "¥Æ¡¼¥Ö¥ë(_T)"
-
-#: addressbook/gui/component/addressbook.c:512
-msgid "_New Contact"
-msgstr "¿·µ¬¥³¥ó¥¿¥¯¥È(_N)"
-
-#: addressbook/gui/component/addressbook.c:520
-msgid "N_ew Directory Server"
-msgstr "¿·µ¬¥Ç¥£¥ì¥¯¥È¥ê¥µ¡¼¥Ð(_e)"
-
-#: addressbook/gui/component/addressbook.c:603
-msgid "Unable to open addressbook"
-msgstr "½»½êÏ¿¤ò³«¤¯¤³¤È¤¬½ÐÍè¤Þ¤»¤ó"
-
-#: addressbook/gui/component/addressbook.c:608
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-"²æ¡¹¤Ï¤³¤Î½»½êÏ¿¤ò³«¤¯¤³¤È¤¬½ÐÍè¤Þ¤»¤ó. ¤³¤ì¤Ï¤¢¤Ê¤¿¤¬\n"
-"´Ö°ã¤Ã¤¿ URI ¤òÆþÎϤ·¤¿¤«, LDAP ¥µ¡¼¥Ð¤Ë¥¢¥¯¥»¥¹¤·¤Æ\n"
-"LDAP ¥µ¥Ý¡¼¥È¤òºî¤ê¾å¤²¤Ê¤¤¤è¤¦¤Ë¤·¤¿¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹.\n"
-"¤â¤· URI ¤òÆþÎϤ·¤¿¤Ê¤é¸í¤ê¤¬¤Ê¤¤¤« URI ¤ò¥Á¥§¥Ã¥¯¤·¤Æ\n"
-"ºÆÆþÎϤ·¤Æ²¼¤µ¤¤. ¤½¤¦¤Ç¤Ê¤±¤ì¤Ð, ¤¿¤Ö¤ó LDAP ¥µ¡¼¥Ð¤Ë\n"
-"¥¢¥¯¥»¥¹¤¹¤ë¤Î¤ò»î¤ß¤Þ¤·¤¿¡¥LDAP ¤ò»È¤¦¤³¤È¤ò˾¤à¤Ê¤é\n"
-"OpenLDAP ¤Î¥À¥¦¥ó¥í¡¼¥É¤È¥¤¥ó¥¹¥È¡¼¥ë, ¤½¤·¤Æ evolution\n"
-"¤ò¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ëɬÍפ¬¤¢¤ë¤Ç¤·¤ç¤¦\n"
-
-#: addressbook/gui/component/addressbook.c:948
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr "VCard ¤ÇÊݸ"
-
-#: addressbook/gui/component/addressbook.c:1015
-msgid "* Click here to add a contact *"
-msgstr "* ¤³¤³¤ò¥¯¥ê¥Ã¥¯¤·¤Æ¥³¥ó¥¿¥¯¥È¤òÄɲ䷤Ƥ¯¤À¤µ¤¤ *"
-
-#: addressbook/gui/component/addressbook.c:1051
-msgid "As _Minicards"
-msgstr "¥ß¥Ë¥«¡¼¥É"
-
-#: addressbook/gui/component/addressbook.c:1102
-msgid "The URI that the Folder Browser will display"
-msgstr "¥Õ¥©¥ë¥À¥Ö¥é¥¦¥¶¤¬É½¼¨¤¹¤ë URI"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "window2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "k"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#: addressbook/gui/component/e-ldap-storage.c:87
-msgid "External Directories"
-msgstr "³°Éô¥Ç¥£¥ì¥¯¥È¥ê"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "ÀâÌÀ:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "LDAP ¥µ¡¼¥Ð:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "¥Ý¡¼¥ÈÈÖ¹æ:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr "Root DN:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "̾Á°:"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"¤³¤Î¥Ó¥å¡¼¤ÎÃæ¤Ëɽ¼¨¤Ç¤­¤ë¥¢¥¤¥Æ¥à¤Ï¤¢¤ê¤Þ¤»¤ó\n"
-"\n"
-"¥À¥Ö¥ë¥¯¥ê¥Ã¥¯¤ò¤·¤Æ¿·µ¬¥³¥ó¥¿¥¯¥È¤òºîÀ®¤·¤Æ²¼¤µ¤¤"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "¥Ú¡¼¥¸ÀßÄê:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "¥¹¥¿¥¤¥ë̾:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "¥×¥ì¥Ó¥å¡¼:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "¥ª¥×¥·¥ç¥ó"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "´Þ¤à:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "¥»¥¯¥·¥ç¥ó:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr "¥µ¥¤¥É¤Îʸ»ú¥¿¥Ö"
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "³Æʸ½ñ¤Î¤¿¤á¤Î¸«½Ð¤·"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "¿·µ¬¥Ú¡¼¥¸¤«¤é³«»Ï"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Îó¿ô:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "ºÇ¸å¤Î¶õÇò·Á¼°:"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "¥Õ¥©¥ó¥È"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "¥Õ¥©¥ó¥È..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "¸«½Ð¤·"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "ËÜÂÎ"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "¥·¥§¡¼¥Ç¥£¥ó¥°"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "¥°¥ì¥¤¥·¥§¡¼¥Ç¥£¥ó¥°¤ò»È¤Ã¤Æ°õºþ"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "ÍÑ»æ"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "¼ïÊÌ:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr "label26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "À£Ë¡:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Éý:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "¹â¤µ:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "ÍÑ»æ¤Îµ¯ÅÀ:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr ";Çò"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "¾å:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "²¼:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "º¸:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "±¦:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "¥Ú¡¼¥¸"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "¥µ¥¤¥º:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Êý¸þ"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "½ÄĹ"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "²£Ä¹"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "¥Ø¥Ã¥À"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "¥Õ¥Ã¥¿:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "¶ö¿ô¥Ú¡¼¥¸¤òȿž"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "¥Ø¥Ã¥À/¥Õ¥Ã¥¿"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:544
-msgid "am"
-msgstr "¸áÁ°"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:543
-msgid "pm"
-msgstr "¸á¸å"
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr "³µÍ×:"
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr "¸«½Ð¤·:"
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr "¶õ¤­Æü:"
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Appointments:"
-msgstr "ͽÌó:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr "½ÅÍפÊÆü:"
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr "Æü¿ô:"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr "¸½ºß¤ÎÆü¿ô:"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr "¤Þ¤À´ü¸Â¤ÎÍè¤Æ¤¤¤Ê¤¤ TODO ¥¢¥¤¥Æ¥à:"
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr "º£Æü´ü¸Â¤Î TODO ¥¢¥¤¥Æ¥à:"
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr "´ü¸Â¤Î²á¤®¤¿ TODO ¥¢¥¤¥Æ¥à:"
-
-#: calendar/gui/calendar-commands.c:176
-msgid "Gnome Calendar"
-msgstr "GNOME ¥«¥ì¥ó¥À"
-
-#: calendar/gui/calendar-commands.c:179
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "GNOME ¸Ä¿Í¥«¥ì¥ó¥À¤È¥¹¥±¥¸¥å¡¼¥ë´ÉÍý"
-
-#: calendar/gui/calendar-commands.c:435
-msgid "File not found"
-msgstr "¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó"
-
-#: calendar/gui/calendar-commands.c:457
-msgid "Open calendar"
-msgstr "¥«¥ì¥ó¥À¤ò³«¤¯"
-
-#: calendar/gui/calendar-commands.c:496
-msgid "Save calendar"
-msgstr "¥«¥ì¥ó¥À¤òÊݸ"
-
-#: calendar/gui/calendar-commands.c:523 calendar/gui/gncal-todo.c:722
-#: calendar/gui/gncal-todo.c:726
-msgid "Day"
-msgstr "Æü"
-
-#: calendar/gui/calendar-commands.c:523
-msgid "Show 1 day"
-msgstr "1 Æü¤òɽ¼¨¤¹¤ë"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "5 Days"
-msgstr "5 Æü"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Show the working week"
-msgstr "»Å»öÃæ¤Î½µ¤òɽ¼¨¤¹¤ë"
-
-#: calendar/gui/calendar-commands.c:529 calendar/gui/gncal-todo.c:721
-msgid "Week"
-msgstr "½µ"
-
-#: calendar/gui/calendar-commands.c:529
-msgid "Show 1 week"
-msgstr "1 ½µ´Ö¤òɽ¼¨¤¹¤ë"
-
-#: calendar/gui/calendar-commands.c:532
-msgid "Month"
-msgstr "·î"
-
-#: calendar/gui/calendar-commands.c:532
-msgid "Show 1 month"
-msgstr "1 ¥õ·î¤òɽ¼¨¤¹¤ë"
-
-#: calendar/gui/calendar-commands.c:536
-msgid "Year"
-msgstr "ǯ"
-
-#: calendar/gui/calendar-commands.c:536
-msgid "Show 1 year"
-msgstr "1 ǯ´Ö¤òɽ¼¨¤¹¤ë"
-
-#: calendar/gui/calendar-commands.c:545 calendar/gui/calendar-commands.c:689
-msgid "Create a new appointment"
-msgstr "¿·µ¬Í½Ìó¤òºîÀ®¤¹¤ë"
-
-#: calendar/gui/calendar-commands.c:549 calendar/gui/calendar-commands.c:681
-msgid "Print this calendar"
-msgstr "¤³¤Î¥«¥ì¥ó¥À¤ò°õºþ¤¹¤ë"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Prev"
-msgstr "Á°"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go back in time"
-msgstr "»þ´Ö¤òÌá¤ë"
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Today"
-msgstr "º£Æü"
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go to present time"
-msgstr "¸½ºß¤Î»þ´Ö¤Ø°ÜÆ°¤¹¤ë"
-
-#: calendar/gui/calendar-commands.c:555
-msgid "Next"
-msgstr "¼¡"
-
-#: calendar/gui/calendar-commands.c:555
-msgid "Go forward in time"
-msgstr "»þ´Ö¤ò¿Ê¤à"
-
-#: calendar/gui/calendar-commands.c:559
-msgid "Go to"
-msgstr "°ÜÆ°"
-
-#: calendar/gui/calendar-commands.c:559
-msgid "Go to a specific date"
-msgstr "»ØÄêÆü¤Ø°ÜÆ°¤¹¤ë"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:666
-msgid "New Ca_lendar"
-msgstr "¿·µ¬¥«¥ì¥ó¥À(_l)"
-
-#: calendar/gui/calendar-commands.c:667
-msgid "Create a new calendar"
-msgstr "¿·µ¬¥«¥ì¥ó¥À¤òºîÀ®¤¹¤ë"
-
-#: calendar/gui/calendar-commands.c:670
-msgid "Open Ca_lendar"
-msgstr "¥«¥ì¥ó¥À¤ò³«¤¯(_l)"
-
-#: calendar/gui/calendar-commands.c:671
-msgid "Open a calendar"
-msgstr "¥«¥ì¥ó¥À¤ò³«¤¯"
-
-#: calendar/gui/calendar-commands.c:675 calendar/gui/calendar-commands.c:676
-msgid "Save Calendar As"
-msgstr "¥«¥ì¥ó¥À¤òÊÌ̾¤ÇÊݸ"
-
-#: calendar/gui/calendar-commands.c:689
-msgid "_New appointment..."
-msgstr "¿·µ¬Í½Ìó(_N)..."
-
-#: calendar/gui/calendar-commands.c:694
-msgid "New appointment for _today..."
-msgstr "º£Æü¤Î¿·µ¬Í½Ìó(_t)..."
-
-#: calendar/gui/calendar-commands.c:695
-msgid "Create a new appointment for today"
-msgstr "º£Æü¤Î¿·µ¬Í½Ìó¤òºîÀ®¤¹¤ë"
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/prop.c:716
-msgid "Preferences"
-msgstr "ÀßÄê"
-
-#: calendar/gui/calendar-commands.c:710 calendar/gui/calendar-commands.c:711
-msgid "About Calendar"
-msgstr "¥«¥ì¥ó¥À¤Ë¤Ä¤¤¤Æ"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:753
-#, c-format
-msgid "%s%s"
-msgstr "%s%s"
-
-#: calendar/gui/calendar-commands.c:753
-msgid "'s calendar"
-msgstr "¤Î¥«¥ì¥ó¥À¤Ç¤¹"
-
-#: calendar/gui/calendar-model.c:452
-#, c-format
-msgid ""
-"The date must be entered in the format: \n"
-"\n"
-"%s"
-msgstr ""
-"ÆüÉդϥե©¡¼¥Þ¥Ã¥È¤ËÆþ¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó: \n"
-"\n"
-"%s"
-
-#: calendar/gui/calendar-model.c:525
-msgid ""
-"The geographical position must be entered in the format: \n"
-"\n"
-"45.436845,125.862501"
-msgstr ""
-"ÃÏÍýŪ¤Ê°ÌÃ֤ϥե©¡¼¥Þ¥Ã¥È¤ËÆþ¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó: \n"
-"\n"
-"45.436845,125.862501"
-
-#: calendar/gui/calendar-model.c:570
-msgid "The percent value must be between 0 and 100"
-msgstr "¥Ñ¡¼¥»¥ó¥ÈÃÍ¤Ï 0 ¤È 100 ¤Î´Ö¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"
-
-#: calendar/gui/calendar-model.c:603
-msgid "The priority must be between 0 and 10"
-msgstr "Í¥Àè½ç°Ì¤Ï 0 ¤È 10 ¤Î´Ö¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"
-
-#: calendar/gui/control-factory.c:136
-msgid "The URI that the calendar will display"
-msgstr "¥«¥ì¥ó¥À¤¬É½¼¨¤¹¤ë URI"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:183
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "%A %b %d %Y %H:%M ¤Ë¥¢¥é¡¼¥à"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:190
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr "%A %b %d %Y %H:%M ¤Î¤¢¤Ê¤¿¤ÎͽÌó¤Ë¤Ä¤¤¤ÆÄÌÃÎ"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:201
-msgid "No summary available."
-msgstr "ÍøÍѤǤ­¤ë¥µ¥Þ¥ê¤Ï¤¢¤ê¤Þ¤»¤ó"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "ÊĤ¸¤ë"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1070
-msgid "Snooze"
-msgstr "µï̲¤ê"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "ͽÌó¤ÎÊÔ½¸"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr "µï̲¤ê»þ´Ö (ʬ)"
-
-#: calendar/gui/dialogs/task-editor.c:245 calendar/gui/event-editor.c:1198
-msgid "FIXME: _Delete"
-msgstr "FIXME: ºï½ü(_D)"
-
-#: calendar/gui/dialogs/task-editor.c:287
-#: calendar/gui/dialogs/task-editor.c:295
-msgid "FIXME: In_complete Task"
-msgstr "FIXME: ̤´°Î»¤Îºî¶È(_c)"
-
-#: calendar/gui/dialogs/task-editor.c:347 calendar/gui/event-editor.c:1300
-msgid "FIXME: Chec_k Names"
-msgstr "FIXME: ̾Á°¥Á¥§¥Ã¥¯(_k)"
-
-#: calendar/gui/dialogs/task-editor.c:348 calendar/gui/event-editor.c:1301
-msgid "FIXME: Address _Book..."
-msgstr "FIXME: ½»½êÏ¿(_B)..."
-
-#: calendar/gui/dialogs/task-editor.c:355
-msgid "FIXME: _New Task"
-msgstr "FIXME: ¿·µ¬ºî¶È(_N)"
-
-#: calendar/gui/dialogs/task-editor.c:357
-msgid "FIXME: S_end Status Report"
-msgstr "FIXME: ¥¹¥Æ¡¼¥¿¥¹¥ì¥Ý¡¼¥È¤òÁ÷¿®(_e)"
-
-#: calendar/gui/dialogs/task-editor.c:358
-#, fuzzy
-msgid "FIXME: _Mark Complete"
-msgstr "FIXME: ºï½ü(_D)"
-
-#: calendar/gui/dialogs/task-editor.c:360 calendar/gui/event-editor.c:1310
-msgid "FIXME: Rec_urrence..."
-msgstr "FIXME: ¿¶¤êʬ¤±(_u)..."
-
-#: calendar/gui/dialogs/task-editor.c:361
-#, fuzzy
-msgid "FIXME: S_kip Occurrence"
-msgstr "FIXME: ¿¶¤êʬ¤±..."
-
-#: calendar/gui/dialogs/task-editor.c:363
-msgid "FIXME: Assig_n Task"
-msgstr "FIXME: ºî¶È³äÅö¤Æ(_n)"
-
-#: calendar/gui/dialogs/task-editor.c:365
-msgid "FIXME: _Reply"
-msgstr "FIXME: ÊÖ¿®(_R)"
-
-#: calendar/gui/dialogs/task-editor.c:366
-msgid "FIXME: Reply to A_ll"
-msgstr "FIXME: Á´°÷¤ØÊÖ¿®(_l)"
-
-#: calendar/gui/dialogs/task-editor.c:409 calendar/gui/event-editor.c:1370
-msgid "FIXME: Save and Close"
-msgstr "FIXME: Êݸ¤ÈÊĤ¸¤ë"
-
-#: calendar/gui/dialogs/task-editor.c:410
-msgid "Save the task and close the dialog box"
-msgstr "ºî¶È¤òÊݸ¤·¤Æ¥À¥¤¥¢¥í¥°¥Ü¥Ã¥¯¥¹¤òÊĤ¸¤ë"
-
-#: calendar/gui/dialogs/task-editor.c:414 calendar/gui/event-editor.c:1375
-msgid "FIXME: Print..."
-msgstr "FIXME: °õºþ..."
-
-#: calendar/gui/dialogs/task-editor.c:419 calendar/gui/event-editor.c:1380
-msgid "FIXME: Recurrence..."
-msgstr "FIXME: ¿¶¤êʬ¤±..."
-
-#: calendar/gui/dialogs/task-editor.c:420 calendar/gui/event-editor.c:1381
-msgid "Configure recurrence rules"
-msgstr "¿¶¤êʬ¤±¥ë¡¼¥ë¤òÀßÄꤹ¤ë"
-
-#: calendar/gui/dialogs/task-editor.c:422
-msgid "FIXME: Assign Task..."
-msgstr "FIXME: ºî¶È¤Î³ä¤êÅö¤Æ..."
-
-#: calendar/gui/dialogs/task-editor.c:423
-msgid "Assign the task to someone"
-msgstr "ºî¶È¤ò狼¤Ë³ä¤êÅö¤Æ¤Æ¤¯¤À¤µ¤¤"
-
-#: calendar/gui/dialogs/task-editor.c:425 calendar/gui/event-editor.c:1386
-msgid "FIXME: Delete"
-msgstr "FIXME: ºï½ü"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:7
-msgid "S_ubject:"
-msgstr "Âê̾(_u):"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:8
-msgid "Owner:"
-msgstr "½êÍ­¼Ô:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:9
-msgid "Sta_rt Date:"
-msgstr "³«»ÏÆü»þ(_r):"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:10
-msgid "_Due Date:"
-msgstr "´üÆü(_D):"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:11
-msgid "_Status:"
-msgstr "¾õ¶·(_S):"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:12
-msgid ""
-"Not Started\n"
-"In Progress\n"
-"Completed\n"
-"Cancelled\n"
-msgstr ""
-"̤Ã幩\n"
-"¿Ê¹ÔÃæ\n"
-"´°Î»\n"
-"¥­¥ã¥ó¥»¥ë\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:17
-msgid "Not Started"
-msgstr "̤Ã幩"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:18
-msgid "_Priority:"
-msgstr "Í¥Àè½ç°Ì(_P):"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:19
-msgid ""
-"High\n"
-"Normal\n"
-"Low\n"
-msgstr ""
-"¾å\n"
-"Ãæ\n"
-"²¼\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:23
-#, fuzzy
-msgid "High"
-msgstr "¹â¤µ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:24
-msgid "% Comp_lete:"
-msgstr "% ´°Î»(_l):"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:25
-msgid "_Contacts..."
-msgstr "¥³¥ó¥¿¥¯¥È(_C)..."
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:27
-msgid "Private"
-msgstr "¥×¥é¥¤¥Ù¡¼¥È"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:28
-msgid "Task"
-msgstr "ºî¶È"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:29
-msgid "Date Completed:"
-msgstr "´°Î»Æü:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:30
-msgid "Location:"
-msgstr "¾ì½ê:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:31
-msgid "URL:"
-msgstr "URL:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:32
-msgid "Resources:"
-msgstr "¥ê¥½¡¼¥¹:"
-
-#: calendar/gui/e-calendar-table.c:189
-msgid "Comment"
-msgstr "¥³¥á¥ó¥È"
-
-#: calendar/gui/e-calendar-table.c:194
-msgid "Completed"
-msgstr "´°Î»"
-
-#: calendar/gui/e-calendar-table.c:199
-msgid "Created"
-msgstr "ºîÀ®"
-
-#: calendar/gui/e-calendar-table.c:204
-msgid "Description"
-msgstr "ÀâÌÀ"
-
-#: calendar/gui/e-calendar-table.c:209
-msgid "Timestamp"
-msgstr "Æü»þ"
-
-#: calendar/gui/e-calendar-table.c:214
-msgid "Start Date"
-msgstr "³«»ÏÆü"
-
-#: calendar/gui/e-calendar-table.c:219
-msgid "End Date"
-msgstr "½ªÎ»Æü"
-
-#: calendar/gui/e-calendar-table.c:224
-msgid "Geographical Position"
-msgstr "ÃÏÍýŪ¤Ê°ÌÃÖ"
-
-#: calendar/gui/e-calendar-table.c:229
-msgid "Last Modification Date"
-msgstr "ºÇ½ª¹¹¿·Æü"
-
-#: calendar/gui/e-calendar-table.c:234
-msgid "Location"
-msgstr "¾ì½ê"
-
-#: calendar/gui/e-calendar-table.c:239
-msgid "Organizer"
-msgstr "ÁÈ¿¥¼Ô"
-
-#: calendar/gui/e-calendar-table.c:244
-msgid "% Complete"
-msgstr "% ´°Î»"
-
-#: calendar/gui/e-calendar-table.c:249 calendar/gui/gncal-todo.c:436
-#: calendar/gui/prop.c:609 mail/message-list.c:484
-msgid "Priority"
-msgstr "Í¥ÀèÅÙ"
-
-#: calendar/gui/e-calendar-table.c:260
-#, fuzzy
-msgid "TaskPad"
-msgstr "ºî¶È(_T)"
-
-#: calendar/gui/e-calendar-table.c:265
-msgid "URL"
-msgstr "URL"
-
-#: calendar/gui/e-calendar-table.c:270
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "Reminder"
-msgstr "ºÅÂ¥¾õ"
-
-#: calendar/gui/e-calendar-table.c:369
-msgid "Open..."
-msgstr "³«¤¯..."
-
-#: calendar/gui/e-calendar-table.c:370
-msgid "Open the task"
-msgstr "ºî¶È¤ò³«¤¯"
-
-#: calendar/gui/e-calendar-table.c:372
-msgid "Mark Complete"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:373
-msgid "Mark the task complete"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:376
-msgid "Delete the task"
-msgstr "ºî¶È¤òºï½ü¤¹¤ë"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr "%02i ʬʬ³ä"
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "¿·µ¬Í½Ìó..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "¤³¤ÎͽÌó¤òÊÔ½¸..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "¤³¤ÎͽÌó¤òºï½ü"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "¤³¤ÎͽÌó¤ò²ÄÆ°¤Ë¤¹¤ë"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr "¤³¤Î½ÐÍè»ö¤òºï½ü"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr "¤¹¤Ù¤Æ¤Î½ÐÍè»ö¤òºï½ü"
-
-#: calendar/gui/event-editor.c:291
-msgid "Edit Appointment"
-msgstr "ͽÌó¤ÎÊÔ½¸"
-
-#: calendar/gui/event-editor.c:296
-msgid "No summary"
-msgstr "¥µ¥Þ¥ê¤Ê¤·"
-
-#: calendar/gui/event-editor.c:300
-#, c-format
-msgid "Appointment - %s"
-msgstr "ͽÌó - %s"
-
-#: calendar/gui/event-editor.c:303
-#, c-format
-msgid "Task - %s"
-msgstr "ºî¶È - %s"
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Journal entry - %s"
-msgstr "»ÅÌõµ­Æþ - %s"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:622 calendar/gui/event-editor.c:718
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Ca_lendar..."
-msgstr "FIXME: ¥«¥ì¥ó¥À(_l)..."
-
-#: calendar/gui/event-editor.c:1308
-msgid "FIXME: _New Appointment"
-msgstr "FIXME: ¿·µ¬Í½Ìó(_N)"
-
-#: calendar/gui/event-editor.c:1312
-msgid "FIXME: Invite _Attendees..."
-msgstr "FIXME: ÉÕ¤­Åº¤¤¤ò¾·ÂÔ..."
-
-#: calendar/gui/event-editor.c:1313
-msgid "FIXME: C_ancel Invitation..."
-msgstr "FIXME: ¾·ÂԤΥ­¥ã¥ó¥»¥ë(_a)..."
-
-#: calendar/gui/event-editor.c:1315
-msgid "FIXME: Forward as v_Calendar"
-msgstr "FIXME: vCalendar ¤ÇžÁ÷(_C)"
-
-#: calendar/gui/event-editor.c:1383
-msgid "FIXME: Invite Attendees..."
-msgstr "FIXME: ÉÕ¤­Åº¤¤¤ò¾·ÂÔ..."
-
-#: calendar/gui/event-editor.c:1384
-msgid "Invite attendees to a meeting"
-msgstr "²ñµÄ¤ËÉÕ¤­Åº¤¤¤ò¾·ÂÔ¤¹¤ë"
-
-#: calendar/gui/event-editor.c:1828
-msgid "%a %b %d %Y"
-msgstr "%a %b %d %Y"
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr "¥¤¥Ù¥ó¥È¥¨¥Ç¥£¥¿¥À¥¤¥¢¥í¥°"
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr "¥µ¥Þ¥ê(_S):"
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr "½êÍ­¼Ô(_O):"
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr "»þ´Ö"
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr "³«»Ï»þ´Ö:"
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr "½ªÎ»»þ´Ö:"
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr "ËèÆü¤Î¥¤¥Ù¥ó¥È(_l)"
-
-#: calendar/gui/event-editor-dialog.glade.h:14
-msgid "Classification"
-msgstr "ʬÎà"
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-msgid "Pu_blic"
-msgstr "°ìÈÌ(_b)"
-
-#: calendar/gui/event-editor-dialog.glade.h:16
-msgid "Pri_vate"
-msgstr "¥×¥é¥¤¥Ù¡¼¥È(_v)"
-
-#: calendar/gui/event-editor-dialog.glade.h:17
-msgid "_Confidential"
-msgstr "ÆâÌ©(_C)"
-
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-"ʬ\n"
-"»þ\n"
-"Æü\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "_Display"
-msgstr "ɽ¼¨(_D)"
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Audio"
-msgstr "¥ª¡¼¥Ç¥£¥ª(_A)"
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "_Program"
-msgstr "¥×¥í¥°¥é¥à(_P)"
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "_Mail"
-msgstr "¥á¡¼¥ë(_M)"
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-msgid "Mail _to:"
-msgstr "¥á¡¼¥ë¤ÎÁ÷¤êÀè(_t):"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Run program:"
-msgstr "¥×¥í¥°¥é¥à¤ò¼Â¹Ô(_R):"
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr "¿¶¤êʬ¤±¥ë¡¼¥ë"
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:736
-msgid "None"
-msgstr "¥Î¡¼¥È"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-msgid "Daily"
-msgstr "ËèÆü"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr "Ëè½µ"
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr "Ëè·î"
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr "Ëèǯ"
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr "label23"
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr "¾ï¤Ë "
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr "Æü"
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr "label24"
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr "½µ"
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "·î"
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "²Ð"
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "¿å"
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "ÌÚ"
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "¶â"
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "ÅÚ"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "Æü"
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr "label25"
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-"1 ÈÖÌÜ\n"
-"2 ÈÖÌÜ\n"
-"3 ÈÖÌÜ\n"
-"4 ÈÖÌÜ\n"
-"5 ÈÖÌÜ\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-"·îÍË\n"
-"²ÐÍË\n"
-"¿åÍË\n"
-"ÌÚÍË\n"
-"¶âÍË\n"
-"ÅÚÍË\n"
-"ÆüÍË\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr "¾ï¤Ë"
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-msgid "month(s)"
-msgstr "·î"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr "ǯ"
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr "label27"
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr "½ªÎ»Æü"
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr "±Êµ×¤Ë·«¤êÊÖ¤¹"
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-#, fuzzy
-msgid "End after"
-msgstr "¥Õ¥£¥ë¥¿¤ÎÊÔ½¸"
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr "½ÐÍè»ö"
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-msgid "Exceptions"
-msgstr "Îã³°"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-msgid "Change"
-msgstr "Êѹ¹"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr "¿¶¤êʬ¤±"
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "1·î"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "2·î"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "3·î"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "4·î"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "5·î"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "6·î"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "7·î"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "8·î"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "9·î"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "9·î"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "10·î"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "11·î"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "12·î"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "ÆüÍË"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "·îÍË"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "²ÐÍË"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "²ÐÍË"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "¿åÍË"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "¿åÍË"
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "ÌÚÍË"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "ÌÚÍË"
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "ÌÚÍË"
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "¶âÍË"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "ÅÚÍË"
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr "ǯ"
-
-#: calendar/gui/getdate.y:421
-msgid "month"
-msgstr "·î"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr "2½µ´Ö"
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr "½µ"
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr "Æü"
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr "»þ"
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr "ʬ"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "ʬ"
-
-#: calendar/gui/getdate.y:428
-msgid "second"
-msgstr " ÉÃ"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "ÉÃ"
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "ÌÀÆü"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "ºòÆü"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "º£Æü"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr "º£"
-
-#: calendar/gui/getdate.y:439
-msgid "last"
-msgstr "ºÇ¸å"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr "¤³¤ì"
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr "¼¡"
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr "1ÈÖÌÜ"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr "3ÈÖÌÜ"
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr "4ÈÖÌÜ"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr "5ÈÖÌÜ"
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr "6ÈÖÌÜ"
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr "7ÈÖÌÜ"
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr "8ÈÖÌÜ"
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr "9ÈÖÌÜ"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr "10ÈÖÌÜ"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr "11ÈÖÌÜ"
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr "12ÈÖÌÜ"
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr "°ÊÁ°"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Create to-do item"
-msgstr "TODO ¥¢¥¤¥Æ¥à¤òºîÀ®"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Edit to-do item"
-msgstr "TODO ¥¢¥¤¥Æ¥à¤òÊÔ½¸"
-
-#: calendar/gui/gncal-todo.c:176
-msgid "Summary:"
-msgstr "¥µ¥Þ¥ê:"
-
-#: calendar/gui/gncal-todo.c:186
-msgid "Due Date:"
-msgstr "´üÆü:"
-
-#: calendar/gui/gncal-todo.c:195
-msgid "Priority:"
-msgstr "Í¥ÀèÅÙ:"
-
-#: calendar/gui/gncal-todo.c:212
-msgid "Item Comments:"
-msgstr "¥¢¥¤¥Æ¥à¤Î¥³¥á¥ó¥È:"
-
-#: calendar/gui/gncal-todo.c:334
-msgid "Add to-do item..."
-msgstr "TODO ¥¢¥¤¥Æ¥à¤òÄɲÃ..."
-
-#: calendar/gui/gncal-todo.c:335
-msgid "Edit this item..."
-msgstr "¥¢¥¤¥Æ¥à¤òÊÔ½¸..."
-
-#: calendar/gui/gncal-todo.c:434
-msgid "Summary"
-msgstr "¥µ¥Þ¥ê"
-
-#: calendar/gui/gncal-todo.c:435 calendar/gui/prop.c:608
-msgid "Due Date"
-msgstr "´üÆü"
-
-#: calendar/gui/gncal-todo.c:437
-msgid "Time Left"
-msgstr "»Ä¤Ã¤¿»þ´Ö"
-
-#. Label
-#: calendar/gui/gncal-todo.c:449
-msgid "To-do list"
-msgstr "TODO ¥ê¥¹¥È"
-
-#. Add
-#: calendar/gui/gncal-todo.c:488
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "ÄɲÃ..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:497
-msgid "Edit..."
-msgstr "ÊÔ½¸..."
-
-#: calendar/gui/gncal-todo.c:721
-msgid "Weeks"
-msgstr "½µ"
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Days"
-msgstr "Æü"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hours"
-msgstr "»þ"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hour"
-msgstr "»þ"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minutes"
-msgstr "ʬ"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minute"
-msgstr "ʬ"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Seconds"
-msgstr "ÉÃ"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Second"
-msgstr "ÉÃ"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1078
-#: calendar/gui/gnome-cal.c:1134
-msgid "Reminder of your appointment at "
-msgstr "¤¢¤Ê¤¿¤ÎͽÌó¤ÎºÅÂ¥ "
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1083 calendar/gui/gnome-cal.c:1138
-msgid "Ok"
-msgstr "Ok"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "ǯ:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "Æü¤Ë¤Á¤Ø°ÜÆ°"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-"°ÜÆ°¤·¤¿¤¤Æü¤Ë¤Á¤òÁªÂò¤·¤Æ²¼¤µ¤¤\n"
-"Æü¤Ë¤Á¤ò¥¯¥ê¥Ã¥¯¤·¤¿»þ, ¤½¤ÎÆü¤Ë¤Á¤Ë¤Ê¤ë\n"
-"¤Ç¤·¤ç¤¦"
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "º£Æü¤Ø°ÜÆ°"
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr "1st"
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr "2nd"
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr "3rd"
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr "4th"
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr "5th"
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr "6th"
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr "7th"
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr "8th"
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr "9th"
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr "10th"
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr "11th"
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr "12th"
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr "13th"
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr "14th"
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr "15th"
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr "16th"
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr "17th"
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr "18th"
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr "19th"
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr "20th"
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr "21st"
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr "22nd"
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr "23rd"
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr "24th"
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr "25th"
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr "26th"
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr "27th"
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr "28th"
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr "29th"
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr "30th"
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr "31st"
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr "Æü"
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr "·î"
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr "²Ð"
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr "¿å"
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr "ÌÚ"
-
-#: calendar/gui/print.c:326
-msgid "Fr"
-msgstr "¶â"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr "ÅÚ"
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr "TODO ¥¢¥¤¥Æ¥à"
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr "º£Æü¤ÎÆüÉÕ (%a %b %d %Y)"
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr "%a"
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "º£½µ (%s %s %d - %s %d %d)"
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "º£½µ (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "º£½µ (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr "º£·î (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr "º£Ç¯ (%Y)"
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr "¥«¥ì¥ó¥À¤Î°õºþ"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr "°õºþ¥×¥ì¥Ó¥å¡¼"
-
-#: calendar/gui/prop.c:334
-msgid "Time display"
-msgstr "»þ´Ö¤Îɽ¼¨"
-
-#. Time format
-#: calendar/gui/prop.c:338
-msgid "Time format"
-msgstr "»þ´Ö¤Î¥Õ¥©¡¼¥Þ¥Ã¥È"
-
-#: calendar/gui/prop.c:339
-msgid "12-hour (AM/PM)"
-msgstr "12 »þ´ÖÀ© (¸áÁ°/¸á¸å)"
-
-#: calendar/gui/prop.c:340
-msgid "24-hour"
-msgstr "24 »þ´ÖÀ©"
-
-#. Weeks start on
-#: calendar/gui/prop.c:350
-msgid "Weeks start on"
-msgstr "½µ¤Î»Ï¤á"
-
-#: calendar/gui/prop.c:351
-msgid "Sunday"
-msgstr "ÆüÍË"
-
-#: calendar/gui/prop.c:352
-msgid "Monday"
-msgstr "·îÍË"
-
-#. Day range
-#: calendar/gui/prop.c:362
-msgid "Day range"
-msgstr "Æü¤Ë¤Á¤ÎÉý"
-
-#: calendar/gui/prop.c:373
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-"Æüɽ¼¨¤È½µÉ½¼¨¤Çɽ¼¨¤·¤¿¤¤³«»Ï¤È½ªÎ»»þ´Ö¤òÁªÂò\n"
-"¤·¤Æ²¼¤µ¤¤\n"
-"¤³¤ÎÈϰϳ°¤Î»þ´Ö¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¤Ïɽ¼¨¤µ¤ì¤Ê¤¤\n"
-"¤Ç¤·¤ç¤¦"
-
-#: calendar/gui/prop.c:389
-msgid "Day start:"
-msgstr "³«»ÏÆü:"
-
-#: calendar/gui/prop.c:400
-msgid "Day end:"
-msgstr "½ªÎ»Æü:"
-
-#: calendar/gui/prop.c:523
-msgid "Colors for display"
-msgstr "ɽ¼¨¿§"
-
-#: calendar/gui/prop.c:526
-msgid "Colors"
-msgstr "¿§"
-
-#: calendar/gui/prop.c:603
-msgid "Show on TODO List:"
-msgstr "TODO ¥ê¥¹¥È¤Ëɽ¼¨:"
-
-#: calendar/gui/prop.c:610
-msgid "Time Until Due"
-msgstr "´ü¸Â¤Þ¤Ç¤Î»þ´Ö"
-
-#: calendar/gui/prop.c:641
-msgid "To Do List style options:"
-msgstr "TODO ¥ê¥¹¥È¥¹¥¿¥¤¥ë¤Î¥ª¥×¥·¥ç¥ó:"
-
-#: calendar/gui/prop.c:646
-msgid "Highlight overdue items"
-msgstr "´ü¸Â¤¬²á¤®¤¿¥¢¥¤¥Æ¥à¤ò¶¯Ä´"
-
-#: calendar/gui/prop.c:649
-msgid "Highlight not yet due items"
-msgstr "¤Þ¤À´ü¸Â¤¬Íè¤Æ¤¤¤Ê¤¤¥¢¥¤¥Æ¥à¤ò¶¯Ä´"
-
-#: calendar/gui/prop.c:652
-msgid "Highlight items due today"
-msgstr "º£Æü´ü¸Â¤Î¥¢¥¤¥Æ¥à¤ò¶¯Ä´"
-
-#: calendar/gui/prop.c:682
-msgid "To Do List Properties"
-msgstr "TODO ¥ê¥¹¥È¤Î¥×¥í¥Ñ¥Æ¥£"
-
-#: calendar/gui/prop.c:685
-msgid "To Do List"
-msgstr "TODO ¥ê¥¹¥È"
-
-#: calendar/gui/prop.c:784
-msgid "Alarms"
-msgstr "¥¢¥é¡¼¥à"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:787
-msgid "Alarm Properties"
-msgstr "¥¢¥é¡¼¥à¤Î¥×¥í¥Ñ¥Æ¥£"
-
-#: calendar/gui/prop.c:797
-msgid "Beep on display alarms"
-msgstr "ɽ¼¨¥¢¥é¡¼¥à¤ò BEEP ²»¤ÇÌĤ餹"
-
-#: calendar/gui/prop.c:807
-msgid "Audio alarms timeout after"
-msgstr "¥ª¡¼¥Ç¥£¥ª¥¢¥é¡¼¥à¤Î¥¿¥¤¥à¥¢¥¦¥È¤Þ¤Ç¸å"
-
-#: calendar/gui/prop.c:818 calendar/gui/prop.c:835
-msgid " seconds"
-msgstr " ÉÃ"
-
-#: calendar/gui/prop.c:824
-msgid "Enable snoozing for "
-msgstr "µï̲¤ê¤òÍ­¸ú "
-
-#. populate default frame/box
-#: calendar/gui/prop.c:840
-msgid "Defaults"
-msgstr "¥Ç¥Õ¥©¥ë¥È"
-
-#: composer/e-msg-composer-address-dialog.c:182
-msgid "Cut"
-msgstr "ÀÚ¤ê¼è¤ê"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut selected item into clipboard"
-msgstr "¥¯¥ê¥Ã¥×¥Ü¡¼¥É¤ÎÃæ¤ØÁªÂò¤µ¤ì¤¿¥¢¥¤¥Æ¥à¤òÀÚ¤ê¼è¤ë"
-
-#: composer/e-msg-composer-address-dialog.c:186
-msgid "Copy"
-msgstr "¥³¥Ô¡¼"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy selected item into clipboard"
-msgstr "¥¯¥ê¥Ã¥×¥Ü¡¼¥É¤ÎÃæ¤ØÁªÂò¤µ¤ì¤¿¥¢¥¤¥Æ¥à¤ò¥³¥Ô¡¼¤¹¤ë"
-
-#: composer/e-msg-composer-address-dialog.c:190
-#: composer/e-msg-composer-address-dialog.c:198
-msgid "Paste"
-msgstr "Ž¤êÉÕ¤±"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste item from clipboard"
-msgstr "¥¯¥ê¥Ã¥×¥Ü¡¼¥É¤«¤é¥¢¥¤¥Æ¥à¤òŽ¤êÉÕ¤±¤ë"
-
-#: composer/e-msg-composer-address-dialog.c:525
-msgid "Select recipients' addresses"
-msgstr "¼õ¼è¿Í¤Î¥¢¥É¥ì¥¹¤òÁªÂò¤·¤Þ¤¹"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "¼õ¿®¼Ô¤Î¥ê¥¹¥È:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "¸¡º÷..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "̾Á°"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-#: mail/mail-config.glade.h:8
-msgid "Address"
-msgstr "¥¢¥É¥ì¥¹"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "¥×¥í¥Ñ¥Æ¥£..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "To: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "label9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "label7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "label8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 ¥Ð¥¤¥È"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u ¥Ð¥¤¥È"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "źÉÕʪ¤ÎÄɲÃ"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "ºï½ü"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "źÉÕʪ¥ê¥¹¥È¤«¤éÁªÂò¤·¤¿¥¢¥¤¥Æ¥à¤òºï½ü¤¹¤ë"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "źÉÕʪ¤ÎÄɲÃ..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "¥á¥Ã¥»¡¼¥¸¤Ø¥Õ¥¡¥¤¥ë¤òźÉÕ¤¹¤ë"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "źÉդΥץí¥Ñ¥Æ¥£"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "MIME ¼ïÊÌ:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "¥Õ¥¡¥¤¥ë̾:"
-
-#: composer/e-msg-composer-hdrs.c:137 composer/e-msg-composer-hdrs.c:295
-msgid "From:"
-msgstr "º¹½Ð¿Í:"
-
-#: composer/e-msg-composer-hdrs.c:243
-msgid "Click here for the address book"
-msgstr "¥¢¥É¥ì¥¹Ä¢¤Î¤¿¤á¤Ë¤³¤³¤Ç¥¯¥ê¥Ã¥¯"
-
-#: composer/e-msg-composer-hdrs.c:296
-msgid "Enter the identitiy you wish to send this message from"
-msgstr "¤³¤Î¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤·¤¿¤¤¿È¸µ¤òÆþÎÏ"
-
-#: composer/e-msg-composer-hdrs.c:300
-msgid "To:"
-msgstr "¼õ¼è¿Í:"
-
-#: composer/e-msg-composer-hdrs.c:301
-msgid "Enter the recipients of the message"
-msgstr "¥á¥Ã¥»¡¼¥¸¤Î¼õ¼è¿Í¤òÆþÎÏ"
-
-#: composer/e-msg-composer-hdrs.c:305
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:306
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "¥á¥Ã¥»¡¼¥¸¤Î¥«¡¼¥Ü¥ó¥³¥Ô¡¼¤ò¼õ¿®¤¹¤ë¥¢¥É¥ì¥¹¤òÆþÎÏ"
-
-#: composer/e-msg-composer-hdrs.c:311
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:312
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"¥á¥Ã¥»¡¼¥¸¤Î¼õ¼è¿Í¥ê¥¹¥È¤ÎÃæ¤Ë¸½¤ì¤Ê¤¤¤Ç, "
-"¥á¥Ã¥»¡¼¥¸¤Î¥«¡¼¥Ü¥ó¥³¥Ô¡¼¤ò¼õ¿®¤¹¤ë¥¢¥É¥ì¥¹¤òÆþÎÏ"
-
-#: composer/e-msg-composer-hdrs.c:318
-msgid "Subject:"
-msgstr "Subject:"
-
-#: composer/e-msg-composer-hdrs.c:319
-msgid "Enter the subject of the mail"
-msgstr "¥á¡¼¥ë¤ÎɽÂê¤òÆþÎÏ"
-
-#: composer/e-msg-composer.c:450
-msgid "Save as..."
-msgstr "ÊÌ̾¤ÇÊݸ..."
-
-#: composer/e-msg-composer.c:461
-#, c-format
-msgid "Error saving file: %s"
-msgstr "¥Õ¥¡¥¤¥ë¤ÎÊݸÃæ¤Ë¥¨¥é¡¼: %s"
-
-#: composer/e-msg-composer.c:481
-#, c-format
-msgid "Error loading file: %s"
-msgstr "¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥ÉÃæ¤Ë¥¨¥é¡¼: %s"
-
-#: composer/e-msg-composer.c:534 shell/e-shell-view-menu.c:164
-msgid "Evolution"
-msgstr "Evolution"
-
-#: composer/e-msg-composer.c:540
-msgid ""
-"This message has not been sent.\n"
-"\n"
-"Do you wish to save your changes?"
-msgstr ""
-"¤³¤Î¥á¥Ã¥»¡¼¥¸¤ÏÁ÷¿®¤·¤Æ¤¤¤Þ¤»¤ó\n"
-"\n"
-"Êѹ¹¤òÊݸ¤·¤Þ¤¹¤«?"
-
-#: composer/e-msg-composer.c:563
-msgid "Open file"
-msgstr "¥Õ¥¡¥¤¥ë¤ò³«¤¯"
-
-#: composer/e-msg-composer.c:675
-msgid "That file does not exist."
-msgstr "¤½¤Î¥Õ¥¡¥¤¥ë¤Ï¸ºß¤·¤Þ¤»¤ó"
-
-#: composer/e-msg-composer.c:685
-msgid "That is not a regular file."
-msgstr "¤½¤ì¤ÏÄ̾ï¤Î¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó"
-
-#: composer/e-msg-composer.c:695
-msgid "That file exists but is not readable."
-msgstr "¤½¤Î¥Õ¥¡¥¤¥ë¤Ï¸ºß¤·¤Þ¤¹¤¬¡¤Æɤ߼è¤ê²Äǽ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó"
-
-#: composer/e-msg-composer.c:705
-msgid "That file appeared accesible but open(2) failed."
-msgstr "¤½¤Î¥Õ¥¡¥¤¥ë¤Ï¥¢¥¯¥»¥¹²Äǽ¤Î¤è¤¦¤Ë¸«¤¨¤Þ¤¹¤¬¡¤open(2) ¤Ï¼ºÇÔ¤·¤Þ¤·¤¿"
-
-#: composer/e-msg-composer.c:727
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"¥Õ¥¡¥¤¥ë¤Ï¤È¤Æ¤âÂ礭¤¤ (100K °Ê¾å) ¤Ç¤¹\n"
-"¤½¤ì¤òÁÞÆþ¤¹¤ë¤³¤È¤ò˾¤à¤Î¤Ï³Î¤«¤Ç¤¹¤«?"
-
-#: composer/e-msg-composer.c:748
-msgid "An error occurred while reading the file."
-msgstr "¥Õ¥¡¥¤¥ëÆɹþÃæ¤Î´Ö¤Ë¥¨¥é¡¼¤ÏȯÀ¸¤·¤Þ¤·¤¿"
-
-#: composer/e-msg-composer.c:844 shell/e-shell-view-menu.c:433
-msgid "_File"
-msgstr "¥Õ¥¡¥¤¥ë(_F)"
-
-#: composer/e-msg-composer.c:850
-msgid "_Open..."
-msgstr "³«¤¯(_O)..."
-
-#: composer/e-msg-composer.c:851
-msgid "Load a previously saved message"
-msgstr "°ÊÁ°¤ËÊݸ¤·¤¿¥á¥Ã¥»¡¼¥¸¤òÆɤ߹þ¤à"
-
-#: composer/e-msg-composer.c:859
-msgid "_Save..."
-msgstr "Êݸ(_S)..."
-
-#: composer/e-msg-composer.c:860
-msgid "Save message"
-msgstr "¥á¥Ã¥»¡¼¥¸¤òÊݸ¤¹¤ë"
-
-#: composer/e-msg-composer.c:868
-msgid "_Save as..."
-msgstr "ÊÌ̾¤ÇÊݸ(_S)..."
-
-#: composer/e-msg-composer.c:869
-msgid "Save message with a different name"
-msgstr "Ê̤Î̾Á°¤Ç¥á¥Ã¥»¡¼¥¸¤òÊݸ¤¹¤ë"
-
-#: composer/e-msg-composer.c:877
-msgid "Save in _folder..."
-msgstr "¥Õ¥©¥ë¥ÀÆâ¤òÊݸ(_f)..."
-
-#: composer/e-msg-composer.c:878
-msgid "Save the message in a specified folder"
-msgstr "»ØÄꤷ¤¿¥Õ¥©¥ë¥ÀÆâ¤Î¥á¥Ã¥»¡¼¥¸¤òÊݸ¤¹¤ë"
-
-#: composer/e-msg-composer.c:887
-msgid "_Insert text file... (FIXME)"
-msgstr "¥Æ¥­¥¹¥È¥Õ¥¡¥¤¥ë¤òÁÞÆþ(_I)... (FIXME)"
-
-#: composer/e-msg-composer.c:888
-msgid "Insert a file as text into the message"
-msgstr "¥Æ¥­¥¹¥È¥Õ¥¡¥¤¥ë¤ò¥á¥Ã¥»¡¼¥¸¤ÎÃæ¤ËÁÞÆþ¤¹¤ë"
-
-#: composer/e-msg-composer.c:897
-msgid "_Send"
-msgstr "Á÷¿®(_S)"
-
-#: composer/e-msg-composer.c:898
-msgid "Send the message"
-msgstr "¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤¹¤ë"
-
-#: composer/e-msg-composer.c:908
-msgid "_Close..."
-msgstr "ÊĤ¸¤ë(_C)..."
-
-#: composer/e-msg-composer.c:909
-msgid "Quit the message composer"
-msgstr "¥á¥Ã¥»¡¼¥¸ºîÀ®¤ò½ªÎ»¤¹¤ë"
-
-#: composer/e-msg-composer.c:922 shell/e-shell-view-menu.c:477
-msgid "_Edit"
-msgstr "ÊÔ½¸(_E)"
-
-#: composer/e-msg-composer.c:933
-msgid "_Format"
-msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È(_F)"
-
-#: composer/e-msg-composer.c:939
-msgid "HTML"
-msgstr "HTML"
-
-#: composer/e-msg-composer.c:940
-msgid "Send the mail in HTML format"
-msgstr "HTML ·Á¼°¤Ç¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤¹¤ë"
-
-#: composer/e-msg-composer.c:953 shell/e-shell-view-menu.c:382
-#: shell/e-shell-view-menu.c:488 shell/e-storage-set-view.c:242
-msgid "_View"
-msgstr "ɽ¼¨(_V)"
-
-#: composer/e-msg-composer.c:959
-msgid "Show _attachments"
-msgstr "źÉÕʪ¤òɽ¼¨(_a)"
-
-#: composer/e-msg-composer.c:960
-msgid "Show/hide attachments"
-msgstr "źÉÕʪ¤òɽ¼¨/±£¤¹"
-
-#: composer/e-msg-composer.c:993
-msgid "Send"
-msgstr "Á÷¿®"
-
-#: composer/e-msg-composer.c:994
-msgid "Send this message"
-msgstr "¤³¤Î¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤¹¤ë"
-
-#: composer/e-msg-composer.c:1003
-msgid "Attach"
-msgstr "źÉÕ"
-
-#: composer/e-msg-composer.c:1004
-msgid "Attach a file"
-msgstr "¥Õ¥¡¥¤¥ë¤òźÉÕ¤¹¤ë"
-
-#: composer/e-msg-composer.c:1191
-msgid "Compose a message"
-msgstr "¥á¥Ã¥»¡¼¥¸¤òºîÀ®¤¹¤ë"
-
-#: filter/filter-folder.c:183 filter/vfolder-rule.c:269
-msgid "Select Folder"
-msgstr "¥Õ¥©¥ë¥À¤òÁªÂò¤¹¤ë"
-
-#: filter/filter-folder.c:246
-msgid "<click here to select a folder>"
-msgstr "<¥Õ¥©¥ë¥À¤òÁªÂò¤¹¤ë¤¿¤á¤Ë¤³¤³¤ò¥¯¥ê¥Ã¥¯¤·¤Æ¤¯¤À¤µ¤¤>"
-
-#: mail/component-factory.c:225
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Evolution ¥á¡¼¥ë¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î½é´ü²½¤¬½ÐÍè¤Þ¤»¤ó"
-
-#: mail/folder-browser-factory.c:24
-msgid "Get mail"
-msgstr "¿·Ãå¥á¡¼¥ë"
-
-#: mail/folder-browser-factory.c:24
-msgid "Check for new mail"
-msgstr "¿·Ãå¥á¡¼¥ë¤Î¥Á¥§¥Ã¥¯"
-
-#: mail/folder-browser-factory.c:25
-msgid "Compose"
-msgstr "ºîÀ®"
-
-#: mail/folder-browser-factory.c:25
-msgid "Compose a new message"
-msgstr "¿·µ¬¥á¥Ã¥»¡¼¥¸¤òºîÀ®¤¹¤ë"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply"
-msgstr "ÊÖ¿®"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to the sender of this message"
-msgstr "¥á¥Ã¥»¡¼¥¸¤Îº¹½Ð¿Í¤ØÊÖ¿®¤¹¤ë"
-
-#: mail/folder-browser-factory.c:30
-msgid "Reply to All"
-msgstr "Á´°÷¤ØÊÖ¿®"
-
-#: mail/folder-browser-factory.c:30
-msgid "Reply to all recipients of this message"
-msgstr "¤³¤Î¥á¥Ã¥»¡¼¥¸¤Î¼õ¼è¿ÍÁ´°÷¤ØÊÖ¿®¤¹¤ë"
-
-#: mail/folder-browser-factory.c:32
-msgid "Forward"
-msgstr "žÁ÷"
-
-#: mail/folder-browser-factory.c:32
-msgid "Forward this message"
-msgstr "¤³¤Î¥á¥Ã¥»¡¼¥¸¤òžÁ÷¤¹¤ë"
-
-#: mail/folder-browser-factory.c:36
-msgid "Move"
-msgstr "°ÜÆ°"
-
-#: mail/folder-browser-factory.c:36
-msgid "Move message to a new folder"
-msgstr "¿·µ¬¥Õ¥©¥ë¥À¤Ø¥á¥Ã¥»¡¼¥¸¤ò°ÜÆ°¤¹¤ë"
-
-#: mail/folder-browser-factory.c:38
-msgid "Print the selected message"
-msgstr "ÁªÂò¤µ¤ì¤¿¥á¥Ã¥»¡¼¥¸¤ò°õºþ¤¹¤ë"
-
-#: mail/folder-browser-factory.c:40
-msgid "Delete this message"
-msgstr "¤³¤Î¥á¥Ã¥»¡¼¥¸¤òºï½ü¤¹¤ë"
-
-#: mail/folder-browser-factory.c:62
-msgid "_Threaded Message List"
-msgstr "¥á¥Ã¥»¡¼¥¸¤ò¥¹¥ì¥Ã¥Éɽ¼¨(_T)"
-
-#: mail/folder-browser-factory.c:72
-msgid "_Print message"
-msgstr "¥á¥Ã¥»¡¼¥¸¤ò°õºþ(_P)"
-
-#: mail/folder-browser-factory.c:81
-msgid "_Mark all messages seen"
-msgstr ""
-
-#: mail/folder-browser-factory.c:86
-msgid "E_dit Message"
-msgstr "¥á¥Ã¥»¡¼¥¸¤òÊÔ½¸(_d)"
-
-#: mail/folder-browser-factory.c:92
-msgid "_View Message"
-msgstr "¥á¥Ã¥»¡¼¥¸¤òɽ¼¨(_V)"
-
-#: mail/folder-browser-factory.c:98
-msgid "_Expunge"
-msgstr "Ëõ¾Ã(_E)"
-
-#: mail/folder-browser-factory.c:104
-msgid "Mail _Filters ..."
-msgstr "¥á¡¼¥ë¥Õ¥£¥ë¥¿(_F) ..."
-
-#: mail/folder-browser-factory.c:110
-msgid "_vFolder Editor ..."
-msgstr "²¾ÁÛ¥Õ¥©¥ë¥À¥¨¥Ç¥£¥¿(_v) ..."
-
-#: mail/folder-browser-factory.c:116
-msgid "_Mail Configuration ..."
-msgstr "¥á¡¼¥ëÀßÄê(_M)..."
-
-#: mail/folder-browser-factory.c:122
-msgid "Forget _Passwords"
-msgstr "¥Ñ¥¹¥ï¡¼¥Éʶ¼º(_P)"
-
-#: mail/folder-browser-factory.c:129
-msgid "_Configure Folder"
-msgstr "¥Õ¥©¥ë¥À¹½À®(_C)"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config.glade.h:7 mail/mail-config.glade.h:14
-msgid "Identities"
-msgstr "¿È¸µ"
-
-#: mail/mail-config.glade.h:9
-msgid "Organization"
-msgstr "ÁÈ¿¥"
-
-#: mail/mail-config.glade.h:10
-msgid "Signature File"
-msgstr "½ð̾¥Õ¥¡¥¤¥ë"
-
-#: mail/mail-config.glade.h:12 mail/mail-config.glade.h:17
-#: mail/mail-config.glade.h:23
-msgid "Edit"
-msgstr "ÊÔ½¸"
-
-#: mail/mail-config.glade.h:15
-msgid "Sources"
-msgstr "µ¯ÅÀ"
-
-#: mail/mail-config.glade.h:19
-msgid "Mail Sources"
-msgstr "¥á¡¼¥ë¥½¡¼¥¹"
-
-#: mail/mail-config-druid.glade.h:15 mail/mail-config.glade.h:20
-msgid "Mail Transport"
-msgstr "¥á¡¼¥ë¤ÎžÁ÷"
-
-#: mail/mail-config.glade.h:21
-msgid "News Servers"
-msgstr "¥Ë¥å¡¼¥¹¥µ¡¼¥Ð"
-
-#: mail/mail-config.glade.h:25
-msgid "News Sources"
-msgstr "¥Ë¥å¡¼¥¹¥½¡¼¥¹"
-
-#: mail/mail-config.glade.h:26
-msgid "Send messages in HTML format"
-msgstr "HTML ·Á¼°¤Ç¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config-druid.glade.h:7 mail/mail-config-druid.glade.h:8
-#: mail/mail-config-druid.glade.h:16
-msgid "Mail Configuration"
-msgstr "¥á¡¼¥ëÀßÄê"
-
-#: mail/mail-config-druid.glade.h:9
-msgid ""
-"Welcome to the Evolution Mail configuration wizard!\n"
-"By filling in some information about your email\n"
-"settings, you can start sending and receiving email\n"
-"right away. Click Next to continue."
-msgstr ""
-"¤è¤¦¤³¤½¡¤Evolution ¥á¡¼¥ëÀßÄꥦ¥£¥¶¡¼¥É¤Ø!\n"
-"¤¢¤Ê¤¿¤ÎÅŻҥ᡼¥ëÀßÄê¤Ë¤Ä¤¤¤Æ¤¤¤¯¤Ä¤«¤Î¾ðÊó¤òÆþÎÏ\n"
-"¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¤¤¹¤°¤ËÅŻҥ᡼¥ë¤òÁ÷¼õ¿®¤·»Ï¤á¤ë\n"
-"¤³¤È¤¬½ÐÍè¤Þ¤¹¡¥¼¡¤ò¥¯¥ê¥Ã¥¯¤·¤Æ³¤±¤Æ¤¯¤À¤µ¤¤¡¥"
-
-#: mail/mail-config-druid.glade.h:13
-msgid "Identity"
-msgstr "¿È¸µ"
-
-#: mail/mail-config-druid.glade.h:14
-msgid "Mail Source"
-msgstr "¥á¡¼¥ë¤Îµ¯ÅÀ"
-
-#: mail/mail-config-druid.glade.h:17
-msgid ""
-"Your email configuration is now complete.\n"
-"Click \"Finish\" to save your new settings"
-msgstr ""
-"¤¢¤Ê¤¿¤ÎÅŻҥ᡼¥ë¤ÎÀßÄê¤Ï´°Î»¤·¤Þ¤·¤¿\n"
-"\"´°Î»\" ¤ò¥¯¥ê¥Ã¥¯¤·¤Æ¿·¤·¤¤ÀßÄê¤òÊݸ¤·¤Æ¤¯¤À¤µ¤¤"
-
-#: mail/mail-crypto.c:342 mail/mail-crypto.c:420
-msgid "No GPG/PGP program available."
-msgstr "GPG/PGP ¥×¥í¥°¥é¥à¤ÏÍøÍѤǤ­¤Þ¤»¤ó"
-
-#: mail/mail-crypto.c:348 mail/mail-crypto.c:426
-#, c-format
-msgid "Couldn't create pipe to GPG/PGP: %s"
-msgstr "GPG/PGP ¤Ø¤Î¥Ñ¥¤¥×¤¬ºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿: %s"
-
-#: mail/mail-ops.c:433
-msgid "Fetching mail"
-msgstr "¥á¡¼¥ë¤ò¼è¤ê½Ð¤¹"
-
-#: mail/mail-ops.c:445
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-"¤³¤Î¥á¥Ã¥»¡¼¥¸¤ÏɽÂ꤬¤¢¤ê¤Þ¤»¤ó\n"
-"ËÜÅö¤ËÁ÷¿®¤·¤Þ¤¹¤«?"
-
-#: mail/mail-ops.c:564
-msgid ""
-"You need to configure an identity\n"
-"before you can send mail."
-msgstr ""
-"¤¢¤Ê¤¿¤Ï¥á¡¼¥ë¤òÁ÷¿®¤¹¤ëÁ°¤Ë¿È¸µ¤Î\n"
-"ÀßÄê¤ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹"
-
-#: mail/mail-ops.c:838
-#, fuzzy
-msgid "Move message(s) to"
-msgstr "¿·µ¬¥Õ¥©¥ë¥À¤Ø¥á¥Ã¥»¡¼¥¸¤ò°ÜÆ°¤¹¤ë"
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr "¸½ºß̤²ò·è¤ÎÁàºî:"
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr "¥Ñ¥¤¥×¾å¤ËÉÔ´°Á´¤Ê¥á¥Ã¥»¡¼¥¸¤¬½ñ¤«¤ì¤Þ¤·¤¿!"
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr "Çɸ¯¤µ¤ì¤¿¥¹¥ì¥Ã¥É¤«¤é¥³¥Þ¥ó¥ÉÆɤ߹þ¤ßÃæ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿"
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr "Çɸ¯¤µ¤ì¤¿¥¹¥ì¥Ã¥É¤«¤éÉÔÀµ¤Ê¥á¥Ã¥»¡¼¥¸?"
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr "¥À¥¤¥¢¥í¥°¥Ü¥Ã¥¯¥¹¤òºîÀ®¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤»¤ó¤Ç¤·¤¿"
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr "¥æ¡¼¥¶¤Ï¥¯¥¨¥ê¤ò¥­¥ã¥ó¥»¥ë¤·¤Þ¤·¤¿"
-
-#: mail/message-list.c:466
-msgid "Online Status"
-msgstr "¥ª¥ó¥é¥¤¥ó¾õÂÖ"
-
-#: mail/message-list.c:502
-msgid "From"
-msgstr "º¹½Ð¿Í"
-
-#: mail/message-list.c:509
-msgid "Subject"
-msgstr "ɽÂê"
-
-#: mail/message-list.c:516
-msgid "Date"
-msgstr "ÆüÉÕ"
-
-#: mail/message-list.c:523
-msgid "Received"
-msgstr "¼õ¿®"
-
-#: mail/message-list.c:530
-msgid "To"
-msgstr "¼õ¼è¿Í"
-
-#: mail/message-list.c:537
-msgid "Size"
-msgstr "¥µ¥¤¥º"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Evolution ¤Î¥¤¥ó¥¹¥È¡¼¥ë"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "¤¢¤Ê¤¿¤Ï Evolution ¤ò½é¤á¤Æ¼Â¹Ô¤·¤¿¤è¤¦¤Ë»×¤¨¤Þ¤¹"
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-"Evolution ¥æ¡¼¥¶¥Õ¥¡¥¤¥ë¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¤Î¤Ç \"OK\" ¤ò¥¯¥ê¥Ã¥¯¤·¤Æ²¼¤µ¤¤"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"¥Ç¥£¥ì¥¯¥È¥ê %s ¤òºîÀ®½ÐÍè¤Þ¤»¤ó\n"
-"\n"
-"¥¨¥é¡¼: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"'%s' ¤ÎÃæ¤Ë¥Õ¥¡¥¤¥ë¤ò\n"
-"¥³¥Ô¡¼½ÐÍè¤Þ¤»¤ó"
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Evolution ¤Î¥Õ¥¡¥¤¥ë¤ÏÀµ¤·¤¯¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Þ¤·¤¿"
-
-#: shell/e-setup.c:109
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please move it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"¥Õ¥¡¥¤¥ë '%s' ¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó\n"
-"Evolution ¥æ¡¼¥¶¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¹¥È¡¼¥ë¤ò\n"
-"µöÍƤ¹¤ë¤¿¤á¤Ë°ÜÆ°¤·¤Æ²¼¤µ¤¤"
-
-#: shell/e-setup.c:121
-#, c-format
-msgid ""
-"The directory `%s' exists but is not the\n"
-"Evolution directory. Please move it in order\n"
-"to allow installation of the Evolution user files."
-msgstr ""
-"¥Ç¥£¥ì¥¯¥È¥ê '%s' ¤Ï¸ºß¤·¤Æ¤Þ¤¹¤¬¡¤Evolution\n"
-"¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡¥Evolution ¥æ¡¼¥¶\n"
-"¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¹¥È¡¼¥ë¤òµöÍƤ¹¤ë¤¿¤á¤Ë°ÜÆ°¤·¤Æ²¼¤µ¤¤"
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"»ØÄꤵ¤ì¤¿¥Õ¥©¥ë¥À¤òºîÀ®¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤»¤ó:\n"
-"%s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr "»ØÄꤵ¤ì¤¿¥Õ¥©¥ë¥À̾¤ÏÍ­¸ú¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó"
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "Evolution - ¿·µ¬¥Õ¥©¥ë¥À¤ÎºîÀ®"
-
-#: shell/e-shell-folder-selection-dialog.c:96
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-"ÁªÂò¤·¤¿¥Õ¥©¥ë¥À¤Î¼ïÊ̤ÏÍ׵ᤵ¤ì¤¿Áàºî¤Î¤¿¤á¤Ë\n"
-"Í­¸ú¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó"
-
-#: shell/e-shell-folder-selection-dialog.c:272
-msgid "New..."
-msgstr "¿·µ¬..."
-
-#: shell/e-shell-folder-title-bar.c:459 shell/e-shell-folder-title-bar.c:460
-msgid "(Untitled)"
-msgstr "(¥¿¥¤¥È¥ë¤Ê¤·)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Bug buddy ¤Ï¤¢¤Ê¤¿¤Î $PATH ¤Ë¤Ï¸«¤Ä¤«¤ê¤Þ¤»¤ó"
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "Bug buddy ¤Ï¼Â¹Ô¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿"
-
-#: shell/e-shell-view-menu.c:166
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:168
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution ¤Ï GNOME ¥Ç¥¹¥¯¥È¥Ã¥×´Ä¶­¤Ç¤Î¥á¡¼¥ë¡¤\n"
-"¥«¥ì¥ó¥À¡¤¤½¤·¤Æ¥³¥ó¥¿¥¯¥È¥Þ¥Í¡¼¥¸¥á¥ó¥È¤Î¤¿¤á¤Î\n"
-"¥°¥ë¡¼¥×¥¦¥§¥¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Ã¥±¡¼¥¸¥½¥Õ¥È¤Ç¤¹"
-
-#: shell/e-shell-view-menu.c:318
-msgid "Go to folder..."
-msgstr "¥Õ¥©¥ë¥À¤Ø°ÜÆ°..."
-
-#: shell/e-shell-view-menu.c:376
-msgid "_New"
-msgstr "¿·µ¬(_N)"
-
-#: shell/e-shell-view-menu.c:388
-msgid "_Folder"
-msgstr "¥Õ¥©¥ë¥À(_F)"
-
-#: shell/e-shell-view-menu.c:394
-msgid "Evolution bar _shortcut"
-msgstr "Evolution ¥Ð¡¼¥·¥ç¡¼¥È¥«¥Ã¥È(_s)"
-
-#: shell/e-shell-view-menu.c:403
-msgid "_Mail message (FIXME)"
-msgstr "¥á¡¼¥ë¥á¥Ã¥»¡¼¥¸(_M) (FIXME)"
-
-#: shell/e-shell-view-menu.c:409
-msgid "_Appointment (FIXME)"
-msgstr "Ìó«(_A) (FIXME)"
-
-#: shell/e-shell-view-menu.c:415
-msgid "_Contact (FIXME)"
-msgstr "¥³¥ó¥¿¥¯¥È(_C) (FIXME)"
-
-#: shell/e-shell-view-menu.c:421
-msgid "_Task (FIXME)"
-msgstr "ºî¶È(_T) (FIXME)"
-
-#: shell/e-shell-view-menu.c:443
-msgid "_Go to folder..."
-msgstr "¥Õ¥©¥ë¥À¤Ø°ÜÆ°(_G)..."
-
-#: shell/e-shell-view-menu.c:444
-msgid "Display a different folder"
-msgstr "Ê̤Υե©¥ë¥À¤òɽ¼¨¤¹¤ë"
-
-#: shell/e-shell-view-menu.c:451
-msgid "_Create new folder..."
-msgstr "¿·µ¬¥Õ¥©¥ë¥À¤ÎºîÀ®(_C)..."
-
-#: shell/e-shell-view-menu.c:452 shell/e-shell-view-menu.c:464
-msgid "Create a new folder"
-msgstr "¿·µ¬¥Õ¥©¥ë¥À¤òºîÀ®¤¹¤ë"
-
-#: shell/e-shell-view-menu.c:463
-msgid "E_xit..."
-msgstr "½ªÎ»(_x)..."
-
-#: shell/e-shell-view-menu.c:494
-msgid "Show _shortcut bar"
-msgstr "¥·¥ç¡¼¥È¥«¥Ã¥È¥Ð¡¼¤òɽ¼¨(_s)"
-
-#: shell/e-shell-view-menu.c:495
-msgid "Show the shortcut bar"
-msgstr "¥·¥ç¡¼¥È¥«¥Ã¥È¥Ð¡¼¤Îɽ¼¨¤¹¤ë"
-
-#: shell/e-shell-view-menu.c:500
-msgid "Show _folder bar"
-msgstr "¥Õ¥©¥ë¥À¥Ð¡¼¤òɽ¼¨(_f)"
-
-#: shell/e-shell-view-menu.c:501
-msgid "Show the folder bar"
-msgstr "¥Õ¥©¥ë¥À¥Ð¡¼¤Îɽ¼¨¤¹¤ë"
-
-#: shell/e-shell-view-menu.c:523
-msgid "_Actions"
-msgstr "¹ÔÆ°(_A)"
-
-#: shell/e-shell-view-menu.c:534
-msgid "_Help"
-msgstr "¥Ø¥ë¥×(_H)"
-
-#: shell/e-shell-view-menu.c:540
-msgid "Help _index"
-msgstr "¥Ø¥ë¥×¥¤¥ó¥Ç¥Ã¥¯¥¹(_i)"
-
-#: shell/e-shell-view-menu.c:547
-msgid "Getting _started"
-msgstr "»Ï¤á(_s)"
-
-#: shell/e-shell-view-menu.c:554
-msgid "Using the _mailer"
-msgstr "¥á¡¼¥é¤Î»È¤¤Êý(_m)"
-
-#: shell/e-shell-view-menu.c:561
-msgid "Using the _calendar"
-msgstr "¥«¥ì¥ó¥À¤Î»È¤¤Êý(_c)"
-
-#: shell/e-shell-view-menu.c:568
-msgid "Using the c_ontact manager"
-msgstr "¥³¥ó¥¿¥¯¥È¥Þ¥Í¡¼¥¸¥ã¤Î»È¤¤Êý(_o)"
-
-#: shell/e-shell-view-menu.c:578
-msgid "_Submit bug report"
-msgstr "ÉÔ¶ñ¹çÊó¹ðÄó½Ð(_S)"
-
-#: shell/e-shell-view-menu.c:579
-msgid "Submit bug report using Bug Buddy"
-msgstr "Bug Buddy »È¤Ã¤ÆÉÔ¶ñ¹çÊó¹ð¤òÄó½Ð¤¹¤ë"
-
-#: shell/e-shell-view-menu.c:588
-msgid "_About Evolution..."
-msgstr "Evolution ¤Ë¤Ä¤¤¤Æ(_A)..."
-
-#: shell/e-shell-view-menu.c:589
-msgid "Show information about Evolution"
-msgstr "Evolution ¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤òɽ¼¨¤¹¤ë"
-
-#: shell/e-shell-view.c:114
-msgid "(No folder displayed)"
-msgstr "(ɽ¼¨¤·¤¿¥Õ¥©¥ë¥À¤Ï¤¢¤ê¤Þ¤»¤ó)"
-
-#: shell/e-shell-view.c:342
-msgid "Folders"
-msgstr "¥Õ¥©¥ë¥À"
-
-#: shell/e-shell-view.c:740
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell.c:291
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "¶ÉÉôµ­²±ÁõÃ֤Υ»¥Ã¥È¥¢¥Ã¥×¤¬½ÐÍè¤Þ¤»¤ó -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "¾®¤µ¤¤¥¢¥¤¥³¥ó(_S)"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "¾®¤µ¤¤¥¢¥¤¥³¥ó¤Ç¥·¥ç¡¼¥È¥«¥Ã¥È¤òɽ¼¨¤¹¤ë"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "Â礭¤¤¥¢¥¤¥³¥ó(_L)"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Â礭¤¤¥¢¥¤¥³¥ó¤Ç¥·¥ç¡¼¥È¥«¥Ã¥È¤òɽ¼¨¤¹¤ë"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "¥¢¥¯¥Æ¥£¥Ö"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "¤³¤Î¥·¥ç¡¼¥È¥«¥Ã¥È¤ò¥¢¥¯¥Æ¥£¥Ö¤Ë¤¹¤ë"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "¥·¥ç¡¼¥È¥«¥Ã¥È¥Ð¡¼¤«¤é¤³¤Î¥·¥ç¡¼¥È¥«¥Ã¥È¤òºï½ü¤¹¤ë"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "¥·¥ç¡¼¥È¥«¥Ã¥È¤ÎÊݸÃæ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿"
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "(̾Á°¤Ê¤·)"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "¥¨¥é¡¼¤Ï¤¢¤ê¤Þ¤»¤ó"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "°ìÈÌŪ¤Ê¥¨¥é¡¼"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "Ʊ¤¸Ì¾Á°¤Î¥Õ¥©¥ë¥À¤¬¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤Þ¤¹"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr "»ØÄꤵ¤ì¤¿¥Õ¥©¥ë¥À¼ïÊ̤ÏÍ­¸ú¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó"
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "I/O ¥¨¥é¡¼"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "¥Õ¥©¥ë¥À¤òºîÀ®¤¹¤ë½½Ê¬¤Ê¶õ¤­¤¬¤¢¤ê¤Þ¤»¤ó"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "»ØÄꤵ¤ì¤¿¥Õ¥©¥ë¥À¤Ï¸«ÉÕ¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr "µ¡Ç½¤Ï¤³¤Îµ­²±ÁõÃ֤ǤϼÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó"
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "µö²Ä¤¬¤¢¤ê¤Þ¤»¤ó"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "Áàºî¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr "»ØÄꤵ¤ì¤¿¼ïÊ̤Ϥ³¤Îµ­²±ÁõÃ֤Ǥϥµ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó"
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "̤ÃΤΥ¨¥é¡¼"
-
-#: shell/e-storage-set-view.c:242
-msgid "View the selected folder"
-msgstr "ÁªÂò¤µ¤ì¤¿¥Õ¥©¥ë¥À¤òɽ¼¨¤¹¤ë"
-
-#: shell/main.c:66
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"¤ä¤¢¡¤Evolution ¥°¥ë¡¼¥×¥¦¥§¥¢¥¹¥¤¡¼¥È¤Î¤³¤Î preview release ¤Î\n"
-"¥À¥¦¥ó¥í¡¼¥É¤Ë»þ´Ö¤ò³ä¤¤¤Æ¤¯¤ì¤Æ¤¢¤ê¤¬¤È¤¦\n"
-"\n"
-"ºÇ¸å¤Î°ì¥ö·îȾ¤Î´Ö¡¤²æ¡¹¤Î¾ÇÅÀ¤Ï Evolution ¤òÍ­ÍѤˤ¹¤ë¤³¤È¤Ë\n"
-"¤Ä¤¤¤Æ¤Ç¤·¤¿¡¥Evolution ³«È¯¼Ô¤Î¿¤¯¤Ï¥Õ¥ë¥¿¥¤¥à¤ÇÈà¤é¤Î¥á¡¼¥ë\n"
-"¤òÆɤि¤á¤Ëº£ Evolution ¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡¥¤¢¤Ê¤¿¤â½ÐÍè¤Þ¤·¤¿¡¥\n"
-"(ɬ¤º¥Ð¥Ã¥¯¥¢¥Ã¥×¤òÊÝ»ý¤·¤Æ¤¯¤À¤µ¤¤)\n"
-"\n"
-"¤·¤«¤·²æ¡¹¤¬¤½¤Î°ÂÄêÀ­¤È¥»¥­¥å¥ê¥Æ¥£¤Ë±Æ¶Á¤òÍ¿¤¨¤Æ¤¤¤ë¿¤¯¤Î¥Ð¥°\n"
-"¤ò½¤Àµ¤·¤¿´Ö¤Ë¡¤¤¢¤Ê¤¿¤Ï¤Þ¤ÀÃǤê½ñ¤­¤ò¼õ¤±¼è¤ê¤Þ¤¹: Evolution ¤Ï:\n"
-"¥¯¥é¥Ã¥·¥å¤·¤¿¤ê¡¤¤¢¤Ê¤¿¤¬¤½¤¦Ë¾¤Þ¤Ê¤¯¤È¤â¥á¡¼¥ë¤òʶ¼º¤·¤¿¤ê¡¤\n"
-"¤¢¤Ê¤¿¤¬Ë¾¤ó¤Ç¤â¥á¡¼¥ë¤Îºï½ü¤òµñÈݤ·¤¿¤ê¡¤»þÀÞ¥×¥í¥»¥¹¤¬Æ°ºî¤·¤¿\n"
-"¤Þ¤Þ¤Î¾õÂ֤ˤʤ俤ꡤ100% ¤Î CPU ¥Ñ¥ï¡¼¤ò¾ÃÈñ¤·¤¿¤ê¡¤¤È¤Æ¤â®¤¯\n"
-"Æ°¤¤¤¿¤ê¡¤¥í¥Ã¥¯¤·¤¿¤ê¡¤Ç¤°Õ¤Î¥á¡¼¥ê¥ó¥°¥ê¥¹¥È¤Ë HTML ¥á¡¼¥ë¤ò\n"
-"Á÷¤Ã¤¿¤ê¡¤¤½¤·¤Æ¤¢¤Ê¤¿¤Îͧ¿Í¤È»Å»öÃç´Ö¤ÎÁ°¤Ç¤¢¤Ê¤¿¤òº¤¤é¤»¤ë\n"
-"¤Ç¤·¤ç¤¦¡¥\n"
-"¤¢¤¯¤Þ¤ÇÀâÌÀ½ñ¤Ë½¾¤Ã¤Æ¤ª»È¤¤¤¯¤À¤µ¤¤¡¥\n"
-"\n"
-"²æ¡¹¤Ï¤¢¤Ê¤¿¤¬²æ¡¹¤ÎÀ®²Ì¤ò³Ú¤·¤à¤³¤È¤ò˾¤ó¤Ç¤¤¤Þ¤¹¡¥¤½¤·¤Æ²æ¡¹¤Ï\n"
-"Ç®¿´¤Ë¤¢¤Ê¤¿¤Î¹×¸¥¤òÂÔ¤Á¼õ¤±¤Æ¤¤¤Þ¤¹!\n"
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"¤¢¤ê¤¬¤È¤¦\n"
-"Evolution ¥Á¡¼¥à\n"
-
-#: shell/main.c:121
-msgid "Cannot initialize the Evolution shell."
-msgstr "Evolution ¥·¥§¥ë¤Î½é´ü²½¤¬½ÐÍè¤Þ¤»¤ó"
-
-#: shell/main.c:156
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Bonobo ¥³¥ó¥Ý¡¼¥Í¥ó¥È¥·¥¹¥Æ¥à¤ò½é´ü²½½ÐÍè¤Þ¤»¤ó"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "¥Õ¥£¡¼¥ë¥É"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "¥°¥ë¡¼¥×"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "¥½¡¼¥È"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "¥Õ¥£¥ë¥¿"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-msgid "Field Chooser"
-msgstr "¥Õ¥£¡¼¥ë¥ÉÁªÂò"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-"¥«¥é¥à¤ò¤¢¤Ê¤¿¤Î¥Æ¡¼¥Ö¥ë¤Ë²Ã¤¨¤ë¤¿¤á¤Ë¡¤¤½¤ì¤ò\n"
-"ɽ¼¨¤·¤¿¤¤¾ì½ê¤Ë¥É¥é¥Ã¥°¤·¤Æ¤¯¤À¤µ¤¤¡¥"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "window1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "ÍøÍѤǤ­¤ë¥Õ¥£¡¼¥ë¥É"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "label1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "¤³¤Î¥ª¡¼¥À¡¼¤Çɽ¼¨¤¹¤ë"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "label2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Äɲà >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< ºï½ü"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr "»î°Æ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "¥Ó¥¸¡¼"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr "¥ª¥Õ¥£¥¹¤Î³°"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "¾ðÊó¤Ê¤·"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr "¾¤Î¾·ÂÔ(_I)..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "¥ª¥×¥·¥ç¥ó(_O)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr "»Å»öÃæ¤Î»þ´Ö¤À¤±É½¼¨(_O)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr "½Ì¾®¤·¤Æɽ¼¨(_Z)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr "¥Õ¥ê¡¼/¥Ó¥¸¡¼ ¤Î¹¹¿·(_U)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "<<(_<)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr "¼«Æ°¥Ô¥Ã¥¯¥¢¥Ã¥×(_A)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ">>(_>)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "¤¹¤Ù¤Æ¤Î¿Í¡¹¤È¥ê¥½¡¼¥¹(_A)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr "¤¹¤Ù¤Æ¤Î¿Í¡¹¤È¤Ò¤È¤Ä¤Î¥ê¥½¡¼¥¹(_P)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr "¿Í¡¹¤¬É¬Í×(_R)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr "¿Í¡¹¤È¤Ò¤È¤Ä¤Î¥ê¥½¡¼¥¹¤¬É¬Í×(_O)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "²ñµÄ³«»Ï»þ´Ö(_s):"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "²ñµÄ½ªÎ»»þ´Ö(_e):"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr "¤¹¤Ù¤Æ¤ÎÉÕ¤­Åº¤¤"
-
-#. Translators: These are the first characters of each day of the
-#. week, 'M' for 'Monday', 'T' for Tuesday etc.
-#: widgets/misc/e-calendar-item.c:281
-msgid "MTWTFSS"
-msgstr "MTWTFSS"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "¥°¥ë¡¼¥× %i"
diff --git a/po/ko.po b/po/ko.po
deleted file mode 100644
index 513501cd8e..0000000000
--- a/po/ko.po
+++ /dev/null
@@ -1,3699 +0,0 @@
-# evolution ko.po
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Young-Ho, Cha <ganadist@dacome.co.kr>, 2000.
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution 0.0\n"
-"POT-Creation-Date: 2000-07-10 21:51-0400\n"
-"PO-Revision-Date: 2000-05-16 09:53:35+0900\n"
-"Last-Translator: Sung-Hyun Nam <namsh@kldp.org>\n"
-"Language-Team: korean <ko@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=euc-kr\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:58
-#: calendar/gui/calendar-pilot-sync.c:138 calendar/gui/main.c:68
-#, fuzzy
-msgid "Could not initialize Bonobo"
-msgstr "¸ÞÀÏ ÄÄÆ÷³ÍÆ®: Bonobo¸¦ ÃʱâÈ­ ÇÒ¼ö ¾ø½À´Ï´Ù"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-#, fuzzy
-msgid "categories"
-msgstr "¸ñ·Ï(_t)..."
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:9
-#, fuzzy
-msgid "Available Categories:"
-msgstr "°¡´ÉÇÑ Çʵå"
-
-#: addressbook/contact-editor/e-contact-editor.c:579
-#: calendar/gui/event-editor.c:1118
-#, fuzzy
-msgid "FIXME: _Appointment"
-msgstr "¾à¼Ó(_A)"
-
-#: addressbook/contact-editor/e-contact-editor.c:580
-#: calendar/gui/event-editor.c:1119
-#, fuzzy
-msgid "FIXME: Meeting Re_quest"
-msgstr "ȸÀÇ ¿äû(_q)"
-
-#: addressbook/contact-editor/e-contact-editor.c:582
-#: calendar/gui/event-editor.c:1121
-#, fuzzy
-msgid "FIXME: _Mail Message"
-msgstr "ÆíÁö ¸Þ¼¼Áö(_M)"
-
-#: addressbook/contact-editor/e-contact-editor.c:583
-#: calendar/gui/event-editor.c:1122
-#, fuzzy
-msgid "FIXME: _Contact"
-msgstr "¿¬°á(_C)"
-
-#: addressbook/contact-editor/e-contact-editor.c:584
-#: calendar/gui/event-editor.c:1123
-msgid "FIXME: _Task"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:585
-#: calendar/gui/event-editor.c:1124
-#, fuzzy
-msgid "FIXME: Task _Request"
-msgstr "ÀÛ¾÷ ¿äû(_R)"
-
-#: addressbook/contact-editor/e-contact-editor.c:586
-#: calendar/gui/event-editor.c:1125
-#, fuzzy
-msgid "FIXME: _Journal Entry"
-msgstr "¿©Çà ÀÏÁ¤(_J)"
-
-#: addressbook/contact-editor/e-contact-editor.c:587
-#: calendar/gui/event-editor.c:1126
-msgid "FIXME: _Note"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:589
-#: addressbook/contact-editor/e-contact-editor.c:694
-#: calendar/gui/event-editor.c:1128 calendar/gui/event-editor.c:1235
-msgid "FIXME: Ch_oose Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:594
-#: calendar/gui/event-editor.c:1133
-msgid "FIXME: _Memo Style"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:596
-#: calendar/gui/event-editor.c:1135
-msgid "FIXME: Define Print _Styles..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:603
-#: calendar/gui/event-editor.c:1142
-msgid "FIXME: S_end"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:607
-#: calendar/gui/event-editor.c:1146
-#, fuzzy
-msgid "FIXME: Save Attac_hments..."
-msgstr "÷ºÎÆÄÀÏ Ãß°¡..."
-
-#: addressbook/contact-editor/e-contact-editor.c:609
-#: calendar/gui/event-editor.c:1148
-#, fuzzy
-msgid "FIXME: _Delete"
-msgstr "»èÁ¦"
-
-#: addressbook/contact-editor/e-contact-editor.c:610
-#: calendar/gui/event-editor.c:1149
-msgid "FIXME: _Move to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:611
-#: calendar/gui/event-editor.c:1150
-msgid "FIXME: Cop_y to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:613
-#: calendar/gui/event-editor.c:1152
-#, fuzzy
-msgid "Page Set_up"
-msgstr "ÂÊ ¼³Á¤:"
-
-#: addressbook/contact-editor/e-contact-editor.c:614
-#: calendar/gui/event-editor.c:1153
-msgid "FIXME: Print Pre_view"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:635
-#: calendar/gui/event-editor.c:1174
-msgid "FIXME: Paste _Special..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:640
-#: calendar/gui/event-editor.c:1179
-msgid "FIXME: Mark as U_nread"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1183
-#, fuzzy
-msgid "_Object"
-msgstr "Á¦¸ñ"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: addressbook/contact-editor/e-contact-editor.c:656
-#: calendar/gui/event-editor.c:1188 calendar/gui/event-editor.c:1195
-msgid "FIXME: _Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: addressbook/contact-editor/e-contact-editor.c:657
-#: calendar/gui/event-editor.c:1189 calendar/gui/event-editor.c:1196
-msgid "FIXME: _Unread Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1190
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1197
-msgid "FIXME: _Last Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:663
-#: calendar/gui/event-editor.c:1202
-msgid "FIXME: _Standard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:665
-#: calendar/gui/event-editor.c:1204
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:668
-#: calendar/gui/event-editor.c:1207
-msgid "FIXME: _Customize..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:673
-#: calendar/gui/event-editor.c:1212
-msgid "Pre_vious"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1213
-msgid "Ne_xt"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:676
-#: calendar/gui/event-editor.c:1217
-#, fuzzy
-msgid "_Toolbars"
-msgstr "µµ±¸(_T)"
-
-#: addressbook/contact-editor/e-contact-editor.c:681
-#: calendar/gui/event-editor.c:1222
-msgid "FIXME: _File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:682
-#: calendar/gui/event-editor.c:1223
-msgid "FIXME: It_em..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:683
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: _Object..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:688
-#: calendar/gui/event-editor.c:1229
-#, fuzzy
-msgid "FIXME: _Font..."
-msgstr "±Û²Ã..."
-
-#: addressbook/contact-editor/e-contact-editor.c:689
-#: calendar/gui/event-editor.c:1230
-msgid "FIXME: _Paragraph..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:696
-#: calendar/gui/event-editor.c:1237
-msgid "FIXME: Desi_gn This Form"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:697
-#: calendar/gui/event-editor.c:1238
-msgid "FIXME: D_esign a Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Publish _Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:700
-#: calendar/gui/event-editor.c:1241
-msgid "FIXME: Pu_blish Form As..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:702
-#: calendar/gui/event-editor.c:1243
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:707
-#: calendar/gui/event-editor.c:1248
-msgid "FIXME: _Spelling..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:709
-#: calendar/gui/event-editor.c:1253
-#, fuzzy
-msgid "_Forms"
-msgstr "Çü½Ä"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-msgid "FIXME: _New Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-msgid "FIXME: New _Contact from Same Company"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:717
-msgid "FIXME: New _Letter to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:718
-msgid "FIXME: New _Message to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:719
-msgid "FIXME: New Meetin_g with Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:720
-msgid "FIXME: _Plan a Meeting..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:721
-msgid "FIXME: New _Task for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:724
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:725
-msgid "FIXME: _Display Map of Address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:726
-msgid "FIXME: _Open Web Page"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:728
-msgid "FIXME: Forward as _vCard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1266
-#, fuzzy
-msgid "FIXME: For_ward"
-msgstr "Àü´Þ"
-
-#: addressbook/contact-editor/e-contact-editor.c:741
-#: calendar/gui/event-editor.c:1279
-msgid "_Insert"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:742
-#: calendar/gui/event-editor.c:1280
-#, fuzzy
-msgid "F_ormat"
-msgstr "Çü½Ä"
-
-#. FIXME: add Favorites here
-#: addressbook/contact-editor/e-contact-editor.c:743
-#: calendar/gui/event-editor.c:1281 shell/e-shell-view-menu.c:473
-msgid "_Tools"
-msgstr "µµ±¸(_T)"
-
-#: addressbook/contact-editor/e-contact-editor.c:744
-#: calendar/gui/event-editor.c:1282
-#, fuzzy
-msgid "Actio_ns"
-msgstr "Çൿ(_A)"
-
-#: addressbook/contact-editor/e-contact-editor.c:775
-msgid "Save and Close"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:776
-#: calendar/gui/event-editor.c:1321
-msgid "Save the appointment and close the dialog box"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:780
-#: calendar/gui/event-editor.c:1325
-msgid "FIXME: Print..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-#: calendar/gui/event-editor.c:1326
-msgid "Print this item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-#: calendar/gui/event-editor.c:1327
-msgid "FIXME: Insert File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-#: calendar/gui/event-editor.c:1328
-msgid "Insert a file as an attachment"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-#: calendar/gui/event-editor.c:1336
-#, fuzzy
-msgid "FIXME: Delete"
-msgstr "»èÁ¦"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-#: calendar/gui/event-editor.c:1337 calendar/gui/gncal-todo.c:326
-#, fuzzy
-msgid "Delete this item"
-msgstr "ÀÌ ¸Þ¼¼Áö¸¦ »èÁ¦ÇÕ´Ï´Ù"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-#: calendar/gui/event-editor.c:1339
-msgid "FIXME: Previous"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-#: calendar/gui/event-editor.c:1340
-msgid "Go to the previous item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-#: calendar/gui/event-editor.c:1341
-msgid "FIXME: Next"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:791
-#: calendar/gui/event-editor.c:1342
-msgid "Go to the next item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-#: calendar/gui/event-editor.c:1343
-msgid "FIXME: Help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1344
-msgid "See online help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1208
-#, fuzzy
-msgid "Assistant"
-msgstr "Á¶¼ö À̸§:"
-
-#: addressbook/contact-editor/e-contact-editor.c:1209
-#: addressbook/contact-editor/e-contact-editor.c:1313
-msgid "Business"
-msgstr "Á÷Àå"
-
-#: addressbook/contact-editor/e-contact-editor.c:1210
-#, fuzzy
-msgid "Business 2"
-msgstr "Á÷Àå"
-
-#: addressbook/contact-editor/e-contact-editor.c:1211
-#, fuzzy
-msgid "Business Fax"
-msgstr "Á÷Àå Æѽº(_F)"
-
-#: addressbook/contact-editor/e-contact-editor.c:1212
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1213
-msgid "Car"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1214
-#, fuzzy
-msgid "Company"
-msgstr "ȸ»ç:"
-
-#: addressbook/contact-editor/e-contact-editor.c:1215
-#: addressbook/contact-editor/e-contact-editor.c:1314
-#, fuzzy
-msgid "Home"
-msgstr "Áý(_H)"
-
-#: addressbook/contact-editor/e-contact-editor.c:1216
-#, fuzzy
-msgid "Home 2"
-msgstr "Áý(_H)"
-
-#: addressbook/contact-editor/e-contact-editor.c:1217
-#, fuzzy
-msgid "Home Fax"
-msgstr "Áý(_H)"
-
-#: addressbook/contact-editor/e-contact-editor.c:1218
-msgid "ISDN"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1219
-#, fuzzy
-msgid "Mobile"
-msgstr "ÈÞ´ëÀüÈ­(_M)"
-
-#: addressbook/contact-editor/e-contact-editor.c:1220
-#: addressbook/contact-editor/e-contact-editor.c:1315
-msgid "Other"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1221
-msgid "Other Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1222
-#, fuzzy
-msgid "Pager"
-msgstr "ÂÊ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1223
-#, fuzzy
-msgid "Primary"
-msgstr "ÀÚÁÖ¾²´Â Email"
-
-#: addressbook/contact-editor/e-contact-editor.c:1224
-msgid "Radio"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1225
-msgid "Telex"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1226
-msgid "TTY/TDD"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1270
-msgid "Primary Email"
-msgstr "ÀÚÁÖ¾²´Â Email"
-
-#: addressbook/contact-editor/e-contact-editor.c:1271
-msgid "Email 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1272
-msgid "Email 3"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-#, fuzzy
-msgid "_Add"
-msgstr "Ãß°¡"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#, fuzzy
-msgid "_Delete"
-msgstr "»èÁ¦"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "ÀüÈ­ ÇüÅÂ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "»õ ÀüÈ­ ÇüÅÂ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91
-msgid "Add"
-msgstr "Ãß°¡"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "¿¬¶ôó ÆíÁý±â"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "Àüü À̸§(_F)..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "ÆÄÀÏ·Î ÀúÀå:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "ȨÆäÀÌÁö ÁÖ¼Ò:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-#, fuzzy
-msgid "Wants to receive _HTML mail"
-msgstr "HTMLÇü½Ä ÆíÁö »ç¿ë(_H)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "ÁÖ¼Ò:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "Á÷Àå(_B)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "Áý(_H)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "Á÷Àå Æѽº(_F)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "ÈÞ´ëÀüÈ­(_M)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-#, fuzzy
-msgid "B_usiness"
-msgstr "Á÷Àå"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-#, fuzzy
-msgid "_This is the mailing address"
-msgstr "ÀÌ°ÍÀº ÀüÀÚ¿ìÆí ÁÖ¼ÒÀÔ´Ï´Ù(_m)"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-#, fuzzy
-msgid "C_ontacts..."
-msgstr "¿¬¶ôó(_C)..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr "¸ñ·Ï(_t)..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-#, fuzzy
-msgid "_Job title:"
-msgstr "Á÷ÇÔ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-#, fuzzy
-msgid "_Company:"
-msgstr "ȸ»ç:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "General"
-msgstr "ÀÏ¹Ý Á¤º¸"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-#, fuzzy
-msgid "_Department:"
-msgstr "ºÎ¼­:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-#, fuzzy
-msgid "_Office:"
-msgstr "»ç¹«½Ç:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-#, fuzzy
-msgid "_Profession:"
-msgstr "Á÷¾÷:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-#, fuzzy
-msgid "_Nickname:"
-msgstr "º°¸í:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-#, fuzzy
-msgid "_Spouse:"
-msgstr "¹è¿ìÀÚ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-#, fuzzy
-msgid "_Birthday:"
-msgstr "»ýÀÏ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-#, fuzzy
-msgid "_Assistant's name:"
-msgstr "Á¶¼ö À̸§:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-#, fuzzy
-msgid "_Manager's Name:"
-msgstr "¸Å´ÏÀú À̸§:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-#, fuzzy
-msgid "Anni_versary:"
-msgstr "±â³äÀÏ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-#, fuzzy
-msgid "No_tes:"
-msgstr "³ëÆ®:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-msgid "Details"
-msgstr "ÀÚ¼¼È÷"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "Àüü À̸§ È®ÀÎ"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "¼º(_F):"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "À̸§(_L):"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:415
-#: calendar/gui/calendar-commands.c:544
-#, fuzzy
-msgid "New"
-msgstr "»õ·Î¿î(_N)"
-
-#: addressbook/gui/component/addressbook.c:415
-msgid "Create a new contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Find"
-msgstr "ã±â"
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Find a contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:420
-#: addressbook/gui/component/addressbook.c:487
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:43
-msgid "Print"
-msgstr "Àμâ"
-
-#: addressbook/gui/component/addressbook.c:420
-msgid "Print contacts"
-msgstr ""
-
-#. Delete
-#: addressbook/gui/component/addressbook.c:421
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:498
-#: mail/folder-browser-factory.c:45
-msgid "Delete"
-msgstr "»èÁ¦"
-
-#: addressbook/gui/component/addressbook.c:421
-#, fuzzy
-msgid "Delete a contact"
-msgstr "÷ºÎÆÄÀÏ ¼±ÅÃ"
-
-#: addressbook/gui/component/addressbook.c:494
-#: addressbook/gui/component/addressbook.c:1034
-msgid "As _Table"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:501
-#, fuzzy
-msgid "_New Contact"
-msgstr "¿¬°á(_C)"
-
-#: addressbook/gui/component/addressbook.c:509
-msgid "N_ew Directory Server"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:588
-#, fuzzy
-msgid "Unable to open addressbook"
-msgstr "ÁÖ¼Ò·Ï"
-
-#: addressbook/gui/component/addressbook.c:593
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:938
-#: addressbook/gui/minicard/e-minicard.c:329
-msgid "Save as VCard"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1005
-msgid "* Click here to add a contact *"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1041
-msgid "As _Minicards"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1092
-msgid "The URI that the Folder Browser will display"
-msgstr "Æú´õ Ž»ö±â°¡ Ç¥½ÃÇÒ URI"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:98
-msgid "h"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:23
-#, fuzzy
-msgid "o"
-msgstr "¹Þ´Â »ç¶÷"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "¼³¸í:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "LDAP ¼­¹ö:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Æ÷Æ® ¹øÈ£:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr "·çÆ® DN:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "À̸§:"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "ÂÊ ¼³Á¤:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Çü½Ä À̸§:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "¹Ì¸®º¸±â:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "¼³Á¤"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Æ÷ÇÔ:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "¼½¼Ç:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "°¢ À帶´Ù Ç¥Á¦´Þ±â"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "»õ ÂÊÀ» ½ÃÀÛÇÕ´Ï´Ù"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "¿­ ¼ö:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "³¡´Ü ºñ¿ì±â:"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "±Û²Ã"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "±Û²Ã..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "¸Ó¸´¸»"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 Æ÷ÀÎÆ® Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "º»¹®"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 Æ÷ÀÎÆ® Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "¸í¾Ï"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "ȸ»ö ¸í¾ÏÀ¸·Î Àμâ"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "Çü½Ä"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Á¾ÀÌ"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "ÇüÅÂ:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Æø:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "³ôÀÌ:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "±ÞÁö¹æ¹ý:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "¿©¹é"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "ˤ:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "¾Æ·¡:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "¿ÞÂÊ:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "¿À¸¥ÂÊ:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "ÂÊ"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Å©±â:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "¹æÇâ"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "¼¼·Î"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "°¡·Î"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "¸Ó¸®¸»:"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "²¿¸®¸»:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "¦¼ö ÂÊ µÚÁý±â"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "¸Ó¸®¸»/²¿¸®¸»"
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:544
-#, fuzzy
-msgid "am"
-msgstr "À̸§"
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:543
-msgid "pm"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:57
-#, fuzzy
-msgid "Headings:"
-msgstr "¸Ó¸´¸»"
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:59
-#, fuzzy
-msgid "Appointments:"
-msgstr "¾à¼Ó(_A)"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:456
-msgid "Open calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Save calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:712
-#: calendar/gui/gncal-todo.c:716
-msgid "Day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-#, fuzzy
-msgid "Show the working week"
-msgstr "³ª¹« ¸ð¾çº¸±â·Î Åä±ÛÇÕ´Ï´Ù"
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:711
-msgid "Week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:531
-#, fuzzy
-msgid "Month"
-msgstr "±Û²Ã"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:535
-#, fuzzy
-msgid "Year"
-msgstr "¸Ó¸®¸»:"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:682
-msgid "Create a new appointment"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-msgid "Print this calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-#, fuzzy
-msgid "Prev"
-msgstr "¹Ì¸®º¸±â:"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:553
-#, fuzzy
-msgid "Today"
-msgstr "º»¹®"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554 filter/filter-editor.c:210
-msgid "Next"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr ""
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-msgid "New Ca_lendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:663
-msgid "Open Ca_lendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:664
-msgid "Open a calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-msgid "Save Calendar As"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:673
-#, fuzzy
-msgid "Print..."
-msgstr "Àμâ"
-
-#: calendar/gui/calendar-commands.c:682
-#, fuzzy
-msgid "_New appointment..."
-msgstr "¾à¼Ó(_A)"
-
-#: calendar/gui/calendar-commands.c:687
-msgid "New appointment for _today..."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:688
-msgid "Create a new appointment for today"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:696 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/calendar-commands.c:704
-msgid "About Calendar"
-msgstr ""
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:746
-#, c-format
-msgid "%s%s"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:746
-msgid "'s calendar"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:68
-msgid "Specifies the port on which the Pilot is"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:68
-msgid "PORT"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:70
-msgid "If you want to debug the attributes on records"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:72
-msgid "Only syncs from desktop to pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:74
-msgid "Only syncs from pilot to desktop"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:97
-msgid "Can not create Pilot socket\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:104
-#, c-format
-msgid "Can not bind to device %s\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:107
-msgid "Failed to get a connection from the Pilot device"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:111
-msgid "pi_accept failed"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:211
-msgid ""
-"\tObject has been modified on desktop and on the pilot, desktop takes "
-"precedence\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:531
-#, fuzzy
-msgid "No description"
-msgstr "¼³¸í:"
-
-#: calendar/gui/calendar-pilot-sync.c:692
-msgid "Could not open DatebookDB on the Pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:693
-msgid "Unable to open DatebookDB"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:728
-msgid "Synced DateBook from Pilot to GnomeCal"
-msgstr ""
-
-#: calendar/gui/control-factory.c:136
-#, fuzzy
-msgid "The URI that the calendar will display"
-msgstr "Æú´õ Ž»ö±â°¡ Ç¥½ÃÇÒ URI"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1056
-#, fuzzy
-msgid "Snooze"
-msgstr "Å©±â"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-#, fuzzy
-msgid "Edit appointment"
-msgstr "¾à¼Ó(_A)"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr ""
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-#, fuzzy
-msgid "New appointment..."
-msgstr "¾à¼Ó(_A)"
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-#, fuzzy
-msgid "Delete this appointment"
-msgstr "ÀÌ ¸Þ¼¼Áö¸¦ »èÁ¦ÇÕ´Ï´Ù"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-#, fuzzy
-msgid "Delete this occurrence"
-msgstr "ÀÌ ¸Þ¼¼Áö¸¦ »èÁ¦ÇÕ´Ï´Ù"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr ""
-
-#: calendar/gui/event-editor.c:289
-#, fuzzy
-msgid "Edit Appointment"
-msgstr "¾à¼Ó(_A)"
-
-#: calendar/gui/event-editor.c:294
-msgid "No summary"
-msgstr ""
-
-#: calendar/gui/event-editor.c:298
-#, fuzzy, c-format
-msgid "Appointment - %s"
-msgstr "¾à¼Ó(_A)"
-
-#: calendar/gui/event-editor.c:301
-#, c-format
-msgid "Task - %s"
-msgstr ""
-
-#: calendar/gui/event-editor.c:304
-#, fuzzy, c-format
-msgid "Journal entry - %s"
-msgstr "¿©Çà ÀÏÁ¤(_J)"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:594 calendar/gui/event-editor.c:688
-msgid "?"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1215
-msgid "FIXME: Ca_lendar..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1250
-msgid "FIXME: Chec_k Names"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1251
-msgid "FIXME: Address _Book..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1258
-#, fuzzy
-msgid "FIXME: _New Appointment"
-msgstr "¾à¼Ó(_A)"
-
-#: calendar/gui/event-editor.c:1260
-msgid "FIXME: Rec_urrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1262
-msgid "FIXME: Intive _Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1263
-msgid "FIXME: C_ancel Invitation..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Forward as v_Calendar"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1320
-msgid "FIXME: Save and Close"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1330
-msgid "FIXME: Recurrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1331
-msgid "Configure recurrence rules"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1333
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1334
-msgid "Invite attendees to a meeting"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1745
-msgid "%a %b %d %Y"
-msgstr ""
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:14 calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid "_Display"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:32
-msgid "_Audio"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:33
-msgid "_Program"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:34
-#, fuzzy
-msgid "_Mail"
-msgstr "ÈÞ´ëÀüÈ­(_M)"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "Mail _to:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Run program:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "Classification"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "Pu_blic"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-#, fuzzy
-msgid "Pri_vate"
-msgstr "ºÙÀ̱â"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Confidential"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:596
-#, fuzzy
-msgid "None"
-msgstr "³ëÆ®(_N)"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-#, fuzzy
-msgid "Daily"
-msgstr "ÀÚ¼¼È÷"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr ""
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-#, fuzzy
-msgid "month(s)"
-msgstr "±Û²Ã"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-#, fuzzy
-msgid "Exceptions"
-msgstr "¼³Á¤"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-#, fuzzy
-msgid "Change"
-msgstr "¸í¾Ï"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr ""
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr ""
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr ""
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr ""
-
-#: calendar/gui/getdate.y:394
-#, fuzzy
-msgid "april"
-msgstr "Á¾ÀÌ"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr ""
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr ""
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr ""
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr ""
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr ""
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr ""
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr ""
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr ""
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr ""
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr ""
-
-#: calendar/gui/getdate.y:405
-#, fuzzy
-msgid "monday"
-msgstr "º»¹®"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:407
-#, fuzzy
-msgid "tues"
-msgstr "³ëÆ®:"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr ""
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr ""
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr ""
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr ""
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr ""
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr ""
-
-#: calendar/gui/getdate.y:420
-#, fuzzy
-msgid "year"
-msgstr "¸Ó¸®¸»:"
-
-#: calendar/gui/getdate.y:421
-#, fuzzy
-msgid "month"
-msgstr "±Û²Ã"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr ""
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr ""
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr ""
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr ""
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr ""
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr ""
-
-#: calendar/gui/getdate.y:428
-#, fuzzy
-msgid "second"
-msgstr "º¸³¿"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr ""
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr ""
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr ""
-
-#: calendar/gui/getdate.y:437
-#, fuzzy
-msgid "today"
-msgstr "º»¹®"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr ""
-
-#: calendar/gui/getdate.y:439
-#, fuzzy
-msgid "last"
-msgstr "ºÙÀ̱â"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr ""
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr ""
-
-#: calendar/gui/getdate.y:442
-#, fuzzy
-msgid "first"
-msgstr "¼º(_F):"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr ""
-
-#: calendar/gui/getdate.y:445
-#, fuzzy
-msgid "fourth"
-msgstr "Á¤·Ä"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr ""
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr ""
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:449
-#, fuzzy
-msgid "eighth"
-msgstr "³ôÀÌ:"
-
-#: calendar/gui/getdate.y:450
-#, fuzzy
-msgid "ninth"
-msgstr "Àμâ"
-
-#: calendar/gui/getdate.y:451
-#, fuzzy
-msgid "tenth"
-msgstr "º¸³Â½¿"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr ""
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Create to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Edit to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:171
-msgid "Summary:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:181
-#, fuzzy
-msgid "Due Date:"
-msgstr "ºÎ¼­:"
-
-#: calendar/gui/gncal-todo.c:190
-#, fuzzy
-msgid "Priority:"
-msgstr "¿ì¼±¼øÀ§"
-
-#: calendar/gui/gncal-todo.c:206
-msgid "Item Comments:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:324
-msgid "Add to-do item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:325
-msgid "Edit this item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:424
-msgid "Summary"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:425 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:426 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr "¿ì¼±¼øÀ§"
-
-#: calendar/gui/gncal-todo.c:427
-msgid "Time Left"
-msgstr ""
-
-#. Label
-#: calendar/gui/gncal-todo.c:439
-#, fuzzy
-msgid "To-do list"
-msgstr "µµ±¸(_T)"
-
-#. Add
-#: calendar/gui/gncal-todo.c:478
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Ãß°¡..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:487
-#, fuzzy
-msgid "Edit..."
-msgstr "Ãß°¡..."
-
-#: calendar/gui/gncal-todo.c:711
-msgid "Weeks"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:712 calendar/gui/gncal-todo.c:716
-msgid "Days"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:717 calendar/gui/gncal-todo.c:721
-msgid "Hours"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:717 calendar/gui/gncal-todo.c:721
-msgid "Hour"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Minutes"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Minute"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-#, fuzzy
-msgid "Seconds"
-msgstr "¼½¼Ç:"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-#, fuzzy
-msgid "Second"
-msgstr "º¸³¿"
-
-#: calendar/gui/gnome-cal.c:453 calendar/gui/gnome-cal.c:1064
-#: calendar/gui/gnome-cal.c:1120
-msgid "Reminder of your appointment at "
-msgstr ""
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1069 calendar/gui/gnome-cal.c:1124
-msgid "Ok"
-msgstr ""
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr ""
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr ""
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr ""
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr ""
-
-#: calendar/gui/print.c:326
-#, fuzzy
-msgid "Fr"
-msgstr "º¸³½ »ç¶÷"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr ""
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr ""
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr ""
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr ""
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr ""
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr ""
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr ""
-
-#: calendar/gui/print.c:1249
-#, fuzzy
-msgid "Print Preview"
-msgstr "¹Ì¸®º¸±â:"
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr ""
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr ""
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr ""
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr ""
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr ""
-
-#: calendar/gui/prop.c:347
-#, fuzzy
-msgid "Sunday"
-msgstr "º¸³¿"
-
-#: calendar/gui/prop.c:348
-#, fuzzy
-msgid "Monday"
-msgstr "º»¹®"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr ""
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr ""
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr ""
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr ""
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr ""
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr ""
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr ""
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr ""
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr ""
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr ""
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr ""
-
-#: calendar/gui/prop.c:678
-msgid "To Do List Properties"
-msgstr ""
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr ""
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-#, fuzzy
-msgid "Alarm Properties"
-msgstr "÷ºÎ ¼Ó¼º"
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr ""
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr ""
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr ""
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-#, fuzzy
-msgid "Defaults"
-msgstr "ÀÚ¼¼È÷"
-
-#: composer/e-msg-composer-address-dialog.c:183 composer/e-msg-composer.c:766
-msgid "Cut"
-msgstr "ÀÚ¸£±â"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "¼±ÅÃÇÑ Ç׸ñÀ» Ŭ¸³º¸µå·Î ÀÚ¸¨´Ï´Ù"
-
-#: composer/e-msg-composer-address-dialog.c:187 composer/e-msg-composer.c:767
-msgid "Copy"
-msgstr "º¹»ç"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "¼±ÅÃÇÑ Ç׸ñÀ» Ŭ¸³º¸µå·Î º¹»çÇÕ´Ï´Ù"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199 composer/e-msg-composer.c:768
-msgid "Paste"
-msgstr "ºÙÀ̱â"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Ŭ¸³º¸µå¿¡¼­ Ç׸ñÀ» º¹»çÇÕ´Ï´Ù"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "¹ÞÀ» »ç¶÷ÀÇ ÁÖ¼Ò ¼±ÅÃ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "¹Þ´Â»ç¶÷ ¸ñ·Ï:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "°Ë»ö..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "À̸§"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr "ÁÖ¼Ò"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "¼³Á¤..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "¹Þ´Â»ç¶÷: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "ÂüÁ¶: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 ¹ÙÀÌÆ®"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u ¹ÙÀÌÆ®"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "÷ºÎÆÄÀÏ Ãß°¡"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:332
-msgid "Remove"
-msgstr "Á¦°Å"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "÷ºÎÆÄÀÏ ¸ñ·Ï¿¡¼­ ¼±ÅÃÇÑ Ç׸ñÀ» Á¦°ÅÇÕ´Ï´Ù"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "÷ºÎÆÄÀÏ Ãß°¡..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "¸Þ¼¼Áö¿¡ ÆÄÀÏÀ» ÷ºÎÇÕ´Ï´Ù"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "÷ºÎ ¼Ó¼º"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "MIME Çü½Ä:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "ÆÄÀÏ À̸§:"
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr "ÁÖ¼Ò·Ï"
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "¹Þ´Â»ç¶÷:"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr "¸Þ¼¼Áö¸¦ ¹ÞÀ»»ç¶÷À» ÀÔ·ÂÇϼ¼¿ä"
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr "ÂüÁ¶:"
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "¸Þ¼¼ÁöÀÇ »çº»À» ¹ÞÀ» »ç¶÷ÀÇ ÁÖ¼Ò¸¦ ÀÔ·ÂÇϼ¼¿ä"
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr "ÂüÁ¶ ¸ñ·Ï¿¡´Â ¾øÁö¸¸ ¸Þ¼¼ÁöÀÇ »çº»À» ¹ÞÀ» »ç¶÷µéÀÇ ÁÖ¼Ò¸¦ ÀÔ·ÂÇϼ¼¿ä"
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr "Á¦¸ñ:"
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr "ÆíÁöÀÇ Á¦¸ñÀ» ÀÔ·ÂÇϼ¼¿ä"
-
-#: composer/e-msg-composer.c:463
-#, fuzzy
-msgid "Save as..."
-msgstr "°Ë»ö..."
-
-#: composer/e-msg-composer.c:474
-#, c-format
-msgid "Error saving file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:494
-#, c-format
-msgid "Error loading file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:513
-#, fuzzy
-msgid "Discard this message?"
-msgstr "ÀÌ ¸Þ¼¼Áö¸¦ ´Ù¸¥»ç¶÷¿¡°Ô Àü´ÞÇÕ´Ï´Ù"
-
-#: composer/e-msg-composer.c:561
-msgid "Open file"
-msgstr ""
-
-#: composer/e-msg-composer.c:718
-msgid "Save in _folder..."
-msgstr "Æú´õ·Î ÀúÀå(_f)..."
-
-#: composer/e-msg-composer.c:718
-msgid "Save the message in a specified folder"
-msgstr "¸Þ¼¼Áö¸¦ ÁöÁ¤ÇÑ Æú´õ·Î ÀúÀåÇÕ´Ï´Ù"
-
-#: composer/e-msg-composer.c:721 composer/e-msg-composer.c:763
-msgid "Send"
-msgstr "º¸³¿"
-
-#: composer/e-msg-composer.c:721
-msgid "Send the message"
-msgstr "¸Þ¼¼Áö¸¦ º¸³À´Ï´Ù"
-
-#: composer/e-msg-composer.c:733
-msgid "View _attachments"
-msgstr "÷ºÎ¹° º¸±â(_a)"
-
-#: composer/e-msg-composer.c:733
-msgid "View/hide attachments"
-msgstr "÷ºÎ¹°À» º¸°Å³ª ¼û±é´Ï´Ù"
-
-#: composer/e-msg-composer.c:763
-msgid "Send this message"
-msgstr "ÀÌ ¸Þ¼¼Áö¸¦ º¸³¿"
-
-#: composer/e-msg-composer.c:766
-msgid "Cut selected region into the clipboard"
-msgstr "¼±ÅÃÇÑ ¿µ¿ªÀ» Ŭ¸³º¸µå·Î ÀÚ¸¨´Ï´Ù"
-
-#: composer/e-msg-composer.c:767
-msgid "Copy selected region into the clipboard"
-msgstr "¼±ÅÃÇÑ ¿µ¿ªÀ» Ŭ¸³º¸µå·Î º¹»çÇÕ´Ï´Ù"
-
-#: composer/e-msg-composer.c:768
-msgid "Paste selected region into the clipboard"
-msgstr "Ŭ¸³º¸µå¿¡ ¼±ÅÃµÈ ¿µ¿ªÀ» ºÙÀÔ´Ï´Ù"
-
-#: composer/e-msg-composer.c:769
-msgid "Undo"
-msgstr "Ãë¼Ò"
-
-#: composer/e-msg-composer.c:769
-msgid "Undo last operation"
-msgstr "¸¶Áö¸· ÀÛ¾÷ Ãë¼Ò"
-
-#: composer/e-msg-composer.c:772
-msgid "Attach"
-msgstr "÷ºÎ"
-
-#: composer/e-msg-composer.c:772
-msgid "Attach a file"
-msgstr "ÆÄÀÏÀ» ÷ºÎÇÕ´Ï´Ù"
-
-#: composer/e-msg-composer.c:948
-#, fuzzy
-msgid "Compose a message"
-msgstr "»õ ¸ÞÀÏ ¸Þ¼¼Áö¸¦ ÀÛ¼ºÇÕ´Ï´Ù"
-
-#: filter/filter-editor.c:198
-#, fuzzy
-msgid "Edit Filter"
-msgstr "ÇÊÅÍ"
-
-#: filter/filter-editor.c:198
-msgid "Create filter"
-msgstr ""
-
-#: filter/filter-editor.c:209
-msgid "Back"
-msgstr ""
-
-#: filter/filter-editor.c:211
-#, fuzzy
-msgid "Finish"
-msgstr "ã±â"
-
-#: filter/filter-editor.c:212
-msgid "Cancel"
-msgstr ""
-
-#: filter/filter-editor.c:216
-#, fuzzy
-msgid "Apply"
-msgstr "´äÀå"
-
-#: filter/filter-editor.c:233
-msgid ""
-"<h2>Create Filtering Rule</h2><p>Select one of the base rules above, then "
-"continue forwards to customise it.</p>"
-msgstr ""
-
-#: mail/component-factory.c:196
-#, fuzzy
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Evolution ½©À» ÃʱâÈ­ ÇÒ¼ö ¾ø½À´Ï´Ù."
-
-#: mail/folder-browser-factory.c:29
-msgid "Get mail"
-msgstr "ÆíÁö ¹Þ±â"
-
-#: mail/folder-browser-factory.c:29
-msgid "Check for new mail"
-msgstr "»õ ÆíÁö¸¦ È®ÀÎÇÕ´Ï´Ù"
-
-#: mail/folder-browser-factory.c:30
-msgid "Compose"
-msgstr ""
-
-#: mail/folder-browser-factory.c:30
-#, fuzzy
-msgid "Compose a new message"
-msgstr "»õ ¸ÞÀÏ ¸Þ¼¼Áö¸¦ ÀÛ¼ºÇÕ´Ï´Ù"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply"
-msgstr "´äÀå"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply to the sender of this message"
-msgstr "ÀÌ ¸Þ¼¼Áö¸¦ º¸³½»ç¶÷¿¡°Ô ´äÀåÀ» ÇÕ´Ï´Ù"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to All"
-msgstr "¸ðµÎ ´äÀå"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to all recipients of this message"
-msgstr "ÀÌ ¸Þ¼¼Áö¸¦ ¹ÞÀº ¸ðµç »ç¶÷¿¡°Ô ´äÀåÀ» ÇÕ´Ï´Ù"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward"
-msgstr "Àü´Þ"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward this message"
-msgstr "ÀÌ ¸Þ¼¼Áö¸¦ ´Ù¸¥»ç¶÷¿¡°Ô Àü´ÞÇÕ´Ï´Ù"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Refile"
-msgstr "¹Þ¾Ò½¿"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Move message to a new folder"
-msgstr "¸Þ¼¼Áö¸¦ ÁöÁ¤ÇÑ Æú´õ·Î ÀúÀåÇÕ´Ï´Ù"
-
-#: mail/folder-browser-factory.c:43
-msgid "Print the selected message"
-msgstr "¼±ÅÃÇÑ ¸Þ¼¼Áö¸¦ ÀμâÇÕ´Ï´Ù"
-
-#: mail/folder-browser-factory.c:45
-msgid "Delete this message"
-msgstr "ÀÌ ¸Þ¼¼Áö¸¦ »èÁ¦ÇÕ´Ï´Ù"
-
-#: mail/folder-browser-factory.c:65
-msgid "_Threaded Message List"
-msgstr ""
-
-#: mail/folder-browser-factory.c:77
-msgid "_Expunge"
-msgstr "Á¦°Å(_E)"
-
-#: mail/folder-browser-factory.c:83
-#, fuzzy
-msgid "_Filter Druid ..."
-msgstr "ÇÊÅÍ"
-
-#: mail/folder-browser-factory.c:89
-msgid "_Virtual Folder Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:95
-msgid "_Mail Configuration ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:101
-msgid "Forget _Passwords"
-msgstr ""
-
-#: mail/mail-config.c:259
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-
-#: mail/mail-config.c:274
-#, fuzzy
-msgid "Full name:"
-msgstr "ÆÄÀÏ À̸§:"
-
-#: mail/mail-config.c:302
-#, fuzzy
-msgid "Email address:"
-msgstr "ȨÆäÀÌÁö ÁÖ¼Ò:"
-
-#: mail/mail-config.c:325
-#, fuzzy
-msgid "Organization:"
-msgstr "¹æÇâ"
-
-#: mail/mail-config.c:337
-msgid "Signature file:"
-msgstr ""
-
-#: mail/mail-config.c:342
-msgid "Signature File"
-msgstr ""
-
-#: mail/mail-config.c:699 mail/mail-config.c:790
-#, fuzzy
-msgid "Server:"
-msgstr "LDAP ¼­¹ö:"
-
-#: mail/mail-config.c:705
-#, fuzzy
-msgid "Username:"
-msgstr "ÆÄÀÏ À̸§:"
-
-#: mail/mail-config.c:711
-#, fuzzy
-msgid "Path:"
-msgstr "ºÙÀ̱â"
-
-#: mail/mail-config.c:717 mail/mail-config.c:796
-#, fuzzy
-msgid "Authentication:"
-msgstr "¹æÇâ"
-
-#: mail/mail-config.c:729 mail/mail-config.c:808
-msgid "Detect supported types..."
-msgstr ""
-
-#: mail/mail-config.c:755 mail/mail-config.c:830
-msgid "Test these values before continuing"
-msgstr ""
-
-#: mail/mail-config.c:937
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:955
-msgid "Select the method you would like to use to deliver your mail."
-msgstr ""
-
-#: mail/mail-config.c:1129 mail/mail-config.c:1208
-msgid "Mail Configuration"
-msgstr ""
-
-#. Identity page
-#: mail/mail-config.c:1146
-msgid "Identity"
-msgstr ""
-
-#. Source page
-#: mail/mail-config.c:1165
-msgid "Mail Source"
-msgstr ""
-
-#. Transport page
-#: mail/mail-config.c:1186
-msgid "Mail Transport"
-msgstr ""
-
-#: mail/mail-config.c:1308
-msgid "Edit Identity"
-msgstr ""
-
-#: mail/mail-config.c:1310
-msgid "Add Identity"
-msgstr ""
-
-#: mail/mail-config.c:1453
-msgid "Edit Source"
-msgstr ""
-
-#: mail/mail-config.c:1455
-msgid "Add Source"
-msgstr ""
-
-#: mail/mail-ops.c:372
-#, fuzzy
-msgid "Fetching mail"
-msgstr "ÆíÁö ¹Þ±â"
-
-#: mail/mail-ops.c:384
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-
-#: mail/mail-ops.c:732
-#, fuzzy
-msgid "Refile message(s) to"
-msgstr "¸Þ¼¼Áö¸¦ ã½À´Ï´Ù"
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr ""
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr ""
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr ""
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr ""
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr ""
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr ""
-
-#: mail/main.c:62
-msgid "Mail Component: I could not initialize Bonobo"
-msgstr "¸ÞÀÏ ÄÄÆ÷³ÍÆ®: Bonobo¸¦ ÃʱâÈ­ ÇÒ¼ö ¾ø½À´Ï´Ù"
-
-#: mail/message-list.c:460
-msgid "Online Status"
-msgstr ""
-
-#: mail/message-list.c:488
-msgid "From"
-msgstr "º¸³½ »ç¶÷"
-
-#: mail/message-list.c:495
-msgid "Subject"
-msgstr "Á¦¸ñ"
-
-#: mail/message-list.c:502
-#, fuzzy
-msgid "Date"
-msgstr "ºÙÀ̱â"
-
-#: mail/message-list.c:509
-#, fuzzy
-msgid "Received"
-msgstr "¹Þ¾Ò½¿"
-
-#: mail/message-list.c:516
-msgid "To"
-msgstr "¹Þ´Â »ç¶÷"
-
-#: mail/message-list.c:523
-msgid "Size"
-msgstr "Å©±â"
-
-#: shell/e-init.c:25
-msgid "Evolution can not create its local folders"
-msgstr ""
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr ""
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr ""
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr ""
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, fuzzy, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr "¸Þ¼¼Áö¸¦ ÁöÁ¤ÇÑ Æú´õ·Î ÀúÀåÇÕ´Ï´Ù"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:95
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:236
-#, fuzzy
-msgid "New..."
-msgstr "»õ·Î¿î(_N)"
-
-#: shell/e-shell-folder-title-bar.c:355
-msgid "(Untitled)"
-msgstr ""
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:110
-msgid "Bug buddy was not found in your $PATH."
-msgstr "½Ã½ºÅÛÀÇ °æ·Î¿¡ Bug buddy¸¦ ãÀ»¼ö ¾ø½À´Ï´Ù."
-
-#. same as above
-#: shell/e-shell-view-menu.c:116
-msgid "Bug buddy could not be run."
-msgstr "Bug buddy¸¦ ½ÇÇàÇÒ¼ö ¾ø½À´Ï´Ù."
-
-#: shell/e-shell-view-menu.c:159
-msgid "Evolution"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:161
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:163
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution Àº ±×³ð µ¥½ºÅ©Å¾ ȯ°æ¿¡¼­ ÀüÀÚ¿ìÆí, \n"
-"ÀÏÁ¤, ¿¬¶ôó °ü¸®¸¦ ÇÏ´Â ±×·ì¿þ¾î ÀÀ¿ëÇÁ·Î±×·¥\n"
-"¸ðÀ½ ÀÔ´Ï´Ù."
-
-#: shell/e-shell-view-menu.c:301
-#, fuzzy
-msgid "Go to folder..."
-msgstr "Æú´õ·Î ÀúÀå(_f)..."
-
-#: shell/e-shell-view-menu.c:365
-msgid "_Folder"
-msgstr "Æú´õ(_F)"
-
-#: shell/e-shell-view-menu.c:369
-msgid "Evolution _Bar Shortcut"
-msgstr "Evolution ´ÜÃà ¸·´ë(_B)"
-
-#: shell/e-shell-view-menu.c:375
-#, fuzzy
-msgid "_Mail message (FIXME)"
-msgstr "ÆíÁö ¸Þ¼¼Áö(_M)"
-
-#: shell/e-shell-view-menu.c:376 shell/e-shell-view-menu.c:379
-msgid "Composes a new mail message"
-msgstr "»õ ¸ÞÀÏ ¸Þ¼¼Áö¸¦ ÀÛ¼ºÇÕ´Ï´Ù"
-
-#: shell/e-shell-view-menu.c:378
-#, fuzzy
-msgid "_Appointment (FIXME)"
-msgstr "¾à¼Ó(_A)"
-
-#: shell/e-shell-view-menu.c:381
-#, fuzzy
-msgid "_Contact (FIXME)"
-msgstr "¿¬°á(_C)"
-
-#: shell/e-shell-view-menu.c:384
-msgid "_Task (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:387
-#, fuzzy
-msgid "Task _Request (FIXME)"
-msgstr "ÀÛ¾÷ ¿äû(_R)"
-
-#: shell/e-shell-view-menu.c:390
-#, fuzzy
-msgid "_Journal Entry (FIXME)"
-msgstr "¿©Çà ÀÏÁ¤(_J)"
-
-#: shell/e-shell-view-menu.c:398
-msgid "_New"
-msgstr "»õ·Î¿î(_N)"
-
-#: shell/e-shell-view-menu.c:402
-#, fuzzy
-msgid "_Go to folder..."
-msgstr "Æú´õ·Î ÀúÀå(_f)..."
-
-#: shell/e-shell-view-menu.c:402
-msgid "Display a different folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:404
-#, fuzzy
-msgid "_Create new folder..."
-msgstr "Æú´õ·Î ÀúÀå(_f)..."
-
-#: shell/e-shell-view-menu.c:404
-msgid "Create a new folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:419
-#, fuzzy
-msgid "Show _shortcut bar"
-msgstr "´ÜÃà ¸·´ë Åä±Û"
-
-#: shell/e-shell-view-menu.c:420
-#, fuzzy
-msgid "Show the shortcut bar"
-msgstr "´ÜÃื´ë¸¦ Åä±ÛÇÕ´Ï´Ù"
-
-#: shell/e-shell-view-menu.c:422
-#, fuzzy
-msgid "Show _folder bar"
-msgstr "´ÜÃà ¸·´ë Åä±Û"
-
-#: shell/e-shell-view-menu.c:423
-#, fuzzy
-msgid "Show the folder bar"
-msgstr "´ÜÃื´ë¸¦ Åä±ÛÇÕ´Ï´Ù"
-
-#: shell/e-shell-view-menu.c:440
-msgid "Help _Index"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:443
-msgid "Getting _Started"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:446
-msgid "Using the _Mailer"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:449
-msgid "Using the _Calendar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:452
-msgid "Using the Cont_act Manager"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:457
-#, fuzzy
-msgid "_Submit bug report"
-msgstr "¹ö±× Á¦º¸(_S)"
-
-#: shell/e-shell-view-menu.c:458
-msgid "Submit bug-report via bug-buddy"
-msgstr "bug-buddy·Î ¹ö±×Á¦º¸¸¦ ÇÕ´Ï´Ù"
-
-#: shell/e-shell-view-menu.c:474
-msgid "_Actions"
-msgstr "Çൿ(_A)"
-
-#: shell/e-shell-view.c:113
-msgid "(No folder displayed)"
-msgstr ""
-
-#: shell/e-shell-view.c:208
-#, fuzzy
-msgid "Folders"
-msgstr "Æú´õ(_F)"
-
-#: shell/e-shell-view.c:600
-#, c-format
-msgid "Evolution - %s"
-msgstr ""
-
-#: shell/e-shell.c:299
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "½Ã½ºÅÛ ÀúÀåÀåÄ¡¸¦ ÁöÁ¤ÇÒ¼ö ¾ø½À´Ï´Ù -- %s"
-
-#: shell/e-shortcut.c:469
-msgid "New group"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:236
-#, fuzzy
-msgid "Show the shortcuts as small icons"
-msgstr "´ÜÃื´ë¸¦ Åä±ÛÇÕ´Ï´Ù"
-
-#: shell/e-shortcuts-view.c:238
-#, fuzzy
-msgid "_Large icons"
-msgstr "¿©¹é"
-
-#: shell/e-shortcuts-view.c:239
-#, fuzzy
-msgid "Show the shortcuts as large icons"
-msgstr "´ÜÃื´ë¸¦ Åä±ÛÇÕ´Ï´Ù"
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate this shortcut"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:332
-msgid "Remove this shortcut from the shortcut bar"
-msgstr ""
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr ""
-
-#: shell/e-storage.c:217
-#, fuzzy
-msgid "(No name)"
-msgstr "À̸§"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr ""
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr ""
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr ""
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr ""
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr ""
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr ""
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr ""
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr ""
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr ""
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr ""
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr ""
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr ""
-
-#: shell/main.c:99
-#, fuzzy
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"¾È³çÇϼ¼¿ä. Evolution ±×·ì¿þ¾î ½´Æ®ÀÇ ¹Ì¸®º¸±â ÆÇÀ» ´Ù¿î·Îµå ¹Þ¾ÆÁּż­\n"
-"°¨»çÇÕ´Ï´Ù. \n"
-"\n"
-"Evolution ÆÀÀº ÀÎÅÍ³Ý »ç¿ëÀÚ¿¡°Ô °¡´ÉÇÑÇÑ °­·ÂÇÑ, È®À强ÀÖ°í ¿¹»Û, \n"
-"ºü¸£°í Àß ¿¬µ¿µÇ°Ô EvolutionÀ» ¸¸µå´Âµ¥ ÃÖ¼±À» ´ÙÇؼ­ ÀÛ¾÷ÇÏ°í \n"
-"ÀÖ½À´Ï´Ù. ¾ÆÁÖ ÈûµçÀÛ¾÷ÀÌÁö¸¸ ¾ÆÁ÷ ¿Ï·áµÇÁö´Â ¾Ê¾Ò½À´Ï´Ù. \n"
-"\n"
-"EvolutionÀ» ÀÌÇØÇÏ·Á¸é, »ç¿ëÀÚÀÎÅÍÆäÀ̽º »Ó¸¸ ¾Æ´Ï¶ó Àüü ½Ã½ºÅÛÀ»\n"
-"Á¦¾îÇÏ´Â ±â¹Ý ¿£ÁøÀ» ¸¸µå´Âµ¥ ¿ì¸®ÀÛ¾÷ÀÇ ´ëºÎºÐÀÌÀÌ ÃÐÁ¡ÀÌ ¸ÂÃß¾îÁ®\n"
-"Àִٴ°ÍÀ» ÀÌÇØÇÏ°í ÀÖ¾î¾ß ÇÕ´Ï´Ù. We are just cresting the hill now,\n"
-"though, and will be pouring most of our love and attention into the UI\n"
-"from here out. ÇÏÁö¸¸ Àû¾îµµ µ¥¸ðÆÇÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù´Â°ÍÀ» ¾Ë²®´Ï´Ù.\n"
-"\n"
-"¹Ùº¸°°Àº ±Ç¸®Æ÷±â ¼­¾à¼­ÀÔ´Ï´Ù. EvolutionÀº :½Ã½ºÅÛÀ» Æı«ÇÒ¼ö ÀÖÀ¸¸ç\n"
-"´ç½ÅÀÇ ¸ÞÀÏÀ» Àоî¹ö¸±¼öµµ, ÇÁ·Î¼¼½º ½ÇÇàÀÌ Çì¸á¼öµµ CPUÁ¡À¯¸¦ 100% \n"
-"»ç¿ëÇÒ¼öµµ, ¿Àµ¿ÀÛ Çϰųª ¸ØÃâ¼öµµ, ¾Æ¹« ¸ÞÀϸµ ¸ñ·Ï¿¡³ª HTMLÇü½ÄÀÇ \n"
-"¸ÞÀÏÀ» º¸³»¼­ ´ç½ÅÀÇ Ä£±¸³ª µ¿·áÁ÷¿øÀ» ³î·¡ÄÑ ÁÙ¼öµµ ÀÖÀ¸³ª ÀÌ·±°ÍµéÀ»\n"
-"°¨¼öÇÒ¼ö ÀÖ¾î¾ß ÇÕ´Ï´Ù.\n"
-"\n"
-"¿ì¸®ÀÇ Èûµç ÀÛ¾÷ÀÇ °á°ú°¡ ´ç½ÅÀ» ±â»Ú°Ô ÇÏ¿´À¸¸é ÁÁ°ÚÀ¸¸ç, ¶ÇÇÑ ´ç½ÅÀÇ\n"
-"µµ¿òÀ» °£ÀýÈ÷ ±â´Ù¸®°í ÀÖ½À´Ï´Ù.\n"
-
-#: shell/main.c:126
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"°¨»çÇÕ´Ï´Ù\n"
-"Evolution ÆÀ\n"
-
-#: shell/main.c:172
-msgid "Cannot initialize the Evolution shell."
-msgstr "Evolution ½©À» ÃʱâÈ­ ÇÒ¼ö ¾ø½À´Ï´Ù."
-
-#: shell/main.c:214
-#, fuzzy
-msgid "Cannot initialize the configuration system."
-msgstr "Evolution ½©À» ÃʱâÈ­ ÇÒ¼ö ¾ø½À´Ï´Ù."
-
-#: shell/main.c:220
-msgid "Cannot initialize the Bonobo component system."
-msgstr "º¸³ëº¸ ÄÄÆ÷³ÍÆ® ½Ã½ºÅÛÀ» ÃʱâÈ­ ÇÒ¼ö ¾ø½À´Ï´Ù."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Çʵå"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "¹­±â"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Á¤·Ä"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "ÇÊÅÍ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-#, fuzzy
-msgid "Field Chooser"
-msgstr "Çʵå"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "°¡´ÉÇÑ Çʵå"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "ÀÌ ¼ø¼­·Î º¸±â"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Ãß°¡ >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Á¦°Å"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-#, fuzzy
-msgid "Tentative"
-msgstr "¹æÇâ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-#, fuzzy
-msgid "Out of Office"
-msgstr "»ç¹«½Ç:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-#, fuzzy
-msgid "_Options"
-msgstr "¼³Á¤"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-#, fuzzy
-msgid "Meeting _start time:"
-msgstr "ȸÀÇ ¿äû(_q)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-#, fuzzy
-msgid "Meeting _end time:"
-msgstr "ȸÀÇ ¿äû(_q)"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr ""
-
-#: widgets/misc/e-clipped-label.c:106
-#, fuzzy
-msgid "..."
-msgstr "Ãß°¡..."
-
-#: widgets/shortcut-bar/e-group-bar.c:633
-#, fuzzy, c-format
-msgid "Group %i"
-msgstr "¹­±â"
-
-#~ msgid "Browse..."
-#~ msgstr "Ž»ö..."
-
-#~ msgid "Send a new message"
-#~ msgstr "»õ ¸Þ¼¼Áö¸¦ º¸³À´Ï´Ù"
-
-#~ msgid "We are sorry, Evolution's Folder Browser can not be initialized."
-#~ msgstr "EvolutionÀÇ Æú´õ Ž»ö±â¸¦ ÃʱâÈ­ ÇÒ¼ö ¾ø½À´Ï´Ù."
-
-#~ msgid "_Task"
-#~ msgstr "ÀÛ¾÷(_T)"
-
-#~ msgid "_Selected Items"
-#~ msgstr "¼±ÅÃÇÑ Ç׸ñ(_S)"
-
-#~ msgid "_New Folder"
-#~ msgstr "»õ Æú´õ(_N)"
-
-#~ msgid "_Open"
-#~ msgstr "¿­±â(_O)"
-
-#~ msgid "Clos_e All Items"
-#~ msgstr "¸ðµç Ç׸ñ ´Ý±â(_e)"
-
-#~ msgid "Closes all the open items"
-#~ msgstr "¿­·ÁÀÖ´Â ¸ðµç Ç׸ñÀ» ´Ý½À´Ï´Ù"
-
-#, fuzzy
-#~ msgid "Show _Treeview"
-#~ msgstr "³ª¹«¸ð¾çº¸±â Åä±Û(_T)"
diff --git a/po/nl.po b/po/nl.po
deleted file mode 100644
index 49bb08dd67..0000000000
--- a/po/nl.po
+++ /dev/null
@@ -1,3770 +0,0 @@
-# Evolution - Dutch translation
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Arjan Scherpenisse <acscherp@wins.uva.nl>, 2000
-msgid ""
-msgstr ""
-"Project-Id-Version: Evolution VERSION\n"
-"POT-Creation-Date: 2000-07-10 21:51-0400\n"
-"PO-Revision-Date: 2000-04-20 01:24+0100\n"
-"Last-Translator: Arjan Scherpenisse <acscherp@wins.uva.nl>\n"
-"Language-Team: Dutch <nl@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:58
-#: calendar/gui/calendar-pilot-sync.c:138 calendar/gui/main.c:68
-#, fuzzy
-msgid "Could not initialize Bonobo"
-msgstr "Mail gedeelte: Ik kon Bonobo niet initializeren"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:579
-#: calendar/gui/event-editor.c:1118
-#, fuzzy
-msgid "FIXME: _Appointment"
-msgstr "_Afspraak"
-
-#: addressbook/contact-editor/e-contact-editor.c:580
-#: calendar/gui/event-editor.c:1119
-#, fuzzy
-msgid "FIXME: Meeting Re_quest"
-msgstr "Verzoek tot _Vergadering"
-
-#: addressbook/contact-editor/e-contact-editor.c:582
-#: calendar/gui/event-editor.c:1121
-#, fuzzy
-msgid "FIXME: _Mail Message"
-msgstr "_Mail bericht"
-
-#: addressbook/contact-editor/e-contact-editor.c:583
-#: calendar/gui/event-editor.c:1122
-#, fuzzy
-msgid "FIXME: _Contact"
-msgstr "_Contact"
-
-#: addressbook/contact-editor/e-contact-editor.c:584
-#: calendar/gui/event-editor.c:1123
-msgid "FIXME: _Task"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:585
-#: calendar/gui/event-editor.c:1124
-#, fuzzy
-msgid "FIXME: Task _Request"
-msgstr "Taak _Verzoek"
-
-#: addressbook/contact-editor/e-contact-editor.c:586
-#: calendar/gui/event-editor.c:1125
-#, fuzzy
-msgid "FIXME: _Journal Entry"
-msgstr "_Dagboek Item"
-
-#: addressbook/contact-editor/e-contact-editor.c:587
-#: calendar/gui/event-editor.c:1126
-msgid "FIXME: _Note"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:589
-#: addressbook/contact-editor/e-contact-editor.c:694
-#: calendar/gui/event-editor.c:1128 calendar/gui/event-editor.c:1235
-msgid "FIXME: Ch_oose Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:594
-#: calendar/gui/event-editor.c:1133
-msgid "FIXME: _Memo Style"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:596
-#: calendar/gui/event-editor.c:1135
-msgid "FIXME: Define Print _Styles..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:603
-#: calendar/gui/event-editor.c:1142
-msgid "FIXME: S_end"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:607
-#: calendar/gui/event-editor.c:1146
-#, fuzzy
-msgid "FIXME: Save Attac_hments..."
-msgstr "Bestand bijvoegen..."
-
-#: addressbook/contact-editor/e-contact-editor.c:609
-#: calendar/gui/event-editor.c:1148
-#, fuzzy
-msgid "FIXME: _Delete"
-msgstr "Verwijderen"
-
-#: addressbook/contact-editor/e-contact-editor.c:610
-#: calendar/gui/event-editor.c:1149
-msgid "FIXME: _Move to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:611
-#: calendar/gui/event-editor.c:1150
-msgid "FIXME: Cop_y to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:613
-#: calendar/gui/event-editor.c:1152
-msgid "Page Set_up"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:614
-#: calendar/gui/event-editor.c:1153
-msgid "FIXME: Print Pre_view"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:635
-#: calendar/gui/event-editor.c:1174
-msgid "FIXME: Paste _Special..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:640
-#: calendar/gui/event-editor.c:1179
-msgid "FIXME: Mark as U_nread"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1183
-#, fuzzy
-msgid "_Object"
-msgstr "Onderwerp"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: addressbook/contact-editor/e-contact-editor.c:656
-#: calendar/gui/event-editor.c:1188 calendar/gui/event-editor.c:1195
-msgid "FIXME: _Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: addressbook/contact-editor/e-contact-editor.c:657
-#: calendar/gui/event-editor.c:1189 calendar/gui/event-editor.c:1196
-msgid "FIXME: _Unread Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1190
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1197
-msgid "FIXME: _Last Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:663
-#: calendar/gui/event-editor.c:1202
-msgid "FIXME: _Standard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:665
-#: calendar/gui/event-editor.c:1204
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:668
-#: calendar/gui/event-editor.c:1207
-msgid "FIXME: _Customize..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:673
-#: calendar/gui/event-editor.c:1212
-msgid "Pre_vious"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1213
-msgid "Ne_xt"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:676
-#: calendar/gui/event-editor.c:1217
-#, fuzzy
-msgid "_Toolbars"
-msgstr "_Gereedschap"
-
-#: addressbook/contact-editor/e-contact-editor.c:681
-#: calendar/gui/event-editor.c:1222
-msgid "FIXME: _File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:682
-#: calendar/gui/event-editor.c:1223
-msgid "FIXME: It_em..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:683
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: _Object..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:688
-#: calendar/gui/event-editor.c:1229
-msgid "FIXME: _Font..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:689
-#: calendar/gui/event-editor.c:1230
-msgid "FIXME: _Paragraph..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:696
-#: calendar/gui/event-editor.c:1237
-msgid "FIXME: Desi_gn This Form"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:697
-#: calendar/gui/event-editor.c:1238
-msgid "FIXME: D_esign a Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Publish _Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:700
-#: calendar/gui/event-editor.c:1241
-msgid "FIXME: Pu_blish Form As..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:702
-#: calendar/gui/event-editor.c:1243
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:707
-#: calendar/gui/event-editor.c:1248
-msgid "FIXME: _Spelling..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:709
-#: calendar/gui/event-editor.c:1253
-#, fuzzy
-msgid "_Forms"
-msgstr "Doorsturen"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-msgid "FIXME: _New Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-msgid "FIXME: New _Contact from Same Company"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:717
-msgid "FIXME: New _Letter to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:718
-msgid "FIXME: New _Message to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:719
-msgid "FIXME: New Meetin_g with Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:720
-msgid "FIXME: _Plan a Meeting..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:721
-msgid "FIXME: New _Task for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:724
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:725
-msgid "FIXME: _Display Map of Address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:726
-msgid "FIXME: _Open Web Page"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:728
-msgid "FIXME: Forward as _vCard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1266
-#, fuzzy
-msgid "FIXME: For_ward"
-msgstr "Doorsturen"
-
-#: addressbook/contact-editor/e-contact-editor.c:741
-#: calendar/gui/event-editor.c:1279
-msgid "_Insert"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:742
-#: calendar/gui/event-editor.c:1280
-#, fuzzy
-msgid "F_ormat"
-msgstr "Doorsturen"
-
-#. FIXME: add Favorites here
-#: addressbook/contact-editor/e-contact-editor.c:743
-#: calendar/gui/event-editor.c:1281 shell/e-shell-view-menu.c:473
-msgid "_Tools"
-msgstr "_Gereedschap"
-
-#: addressbook/contact-editor/e-contact-editor.c:744
-#: calendar/gui/event-editor.c:1282
-#, fuzzy
-msgid "Actio_ns"
-msgstr "_Acties"
-
-#: addressbook/contact-editor/e-contact-editor.c:775
-msgid "Save and Close"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:776
-#: calendar/gui/event-editor.c:1321
-msgid "Save the appointment and close the dialog box"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:780
-#: calendar/gui/event-editor.c:1325
-msgid "FIXME: Print..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-#: calendar/gui/event-editor.c:1326
-msgid "Print this item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-#: calendar/gui/event-editor.c:1327
-msgid "FIXME: Insert File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-#: calendar/gui/event-editor.c:1328
-msgid "Insert a file as an attachment"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-#: calendar/gui/event-editor.c:1336
-#, fuzzy
-msgid "FIXME: Delete"
-msgstr "Verwijderen"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-#: calendar/gui/event-editor.c:1337 calendar/gui/gncal-todo.c:326
-#, fuzzy
-msgid "Delete this item"
-msgstr "Verwijdert dit bericht"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-#: calendar/gui/event-editor.c:1339
-msgid "FIXME: Previous"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-#: calendar/gui/event-editor.c:1340
-msgid "Go to the previous item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-#: calendar/gui/event-editor.c:1341
-msgid "FIXME: Next"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:791
-#: calendar/gui/event-editor.c:1342
-msgid "Go to the next item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-#: calendar/gui/event-editor.c:1343
-msgid "FIXME: Help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1344
-msgid "See online help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1208
-msgid "Assistant"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1209
-#: addressbook/contact-editor/e-contact-editor.c:1313
-msgid "Business"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1210
-msgid "Business 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1211
-msgid "Business Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1212
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1213
-msgid "Car"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1214
-#, fuzzy
-msgid "Company"
-msgstr "Kopieren"
-
-#: addressbook/contact-editor/e-contact-editor.c:1215
-#: addressbook/contact-editor/e-contact-editor.c:1314
-#, fuzzy
-msgid "Home"
-msgstr "_Notitie"
-
-#: addressbook/contact-editor/e-contact-editor.c:1216
-#, fuzzy
-msgid "Home 2"
-msgstr "_Notitie"
-
-#: addressbook/contact-editor/e-contact-editor.c:1217
-#, fuzzy
-msgid "Home Fax"
-msgstr "_Notitie"
-
-#: addressbook/contact-editor/e-contact-editor.c:1218
-msgid "ISDN"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1219
-#, fuzzy
-msgid "Mobile"
-msgstr "_Mail"
-
-#: addressbook/contact-editor/e-contact-editor.c:1220
-#: addressbook/contact-editor/e-contact-editor.c:1315
-msgid "Other"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1221
-msgid "Other Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1222
-#, fuzzy
-msgid "Pager"
-msgstr "Plakken"
-
-#: addressbook/contact-editor/e-contact-editor.c:1223
-#, fuzzy
-msgid "Primary"
-msgstr "Prioriteit"
-
-#: addressbook/contact-editor/e-contact-editor.c:1224
-msgid "Radio"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1225
-msgid "Telex"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1226
-msgid "TTY/TDD"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1270
-msgid "Primary Email"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1271
-msgid "Email 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1272
-msgid "Email 3"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#, fuzzy
-msgid "_Delete"
-msgstr "Verwijderen"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91
-msgid "Add"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-#, fuzzy
-msgid "Contact Editor"
-msgstr "_Contact"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-#, fuzzy
-msgid "_Home"
-msgstr "_Notitie"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-#, fuzzy
-msgid "_Mobile"
-msgstr "_Mail"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-#, fuzzy
-msgid "C_ontacts..."
-msgstr "_Contact"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-#, fuzzy
-msgid "_Job title:"
-msgstr "_Mail"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-#, fuzzy
-msgid "_Company:"
-msgstr "Kopieren"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "General"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-#, fuzzy
-msgid "No_tes:"
-msgstr "_Notitie"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-msgid "Details"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:10
-#, fuzzy
-msgid "_Middle:"
-msgstr "_Mail"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:415
-#: calendar/gui/calendar-commands.c:544
-#, fuzzy
-msgid "New"
-msgstr "_Nieuw"
-
-#: addressbook/gui/component/addressbook.c:415
-msgid "Create a new contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Find"
-msgstr "Zoeken"
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Find a contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:420
-#: addressbook/gui/component/addressbook.c:487
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:43
-msgid "Print"
-msgstr "Afdrukken"
-
-#: addressbook/gui/component/addressbook.c:420
-#, fuzzy
-msgid "Print contacts"
-msgstr "Uw contactenlijst"
-
-#. Delete
-#: addressbook/gui/component/addressbook.c:421
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:498
-#: mail/folder-browser-factory.c:45
-msgid "Delete"
-msgstr "Verwijderen"
-
-#: addressbook/gui/component/addressbook.c:421
-#, fuzzy
-msgid "Delete a contact"
-msgstr "Selecteer het bestand"
-
-#: addressbook/gui/component/addressbook.c:494
-#: addressbook/gui/component/addressbook.c:1034
-msgid "As _Table"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:501
-#, fuzzy
-msgid "_New Contact"
-msgstr "_Contact"
-
-#: addressbook/gui/component/addressbook.c:509
-msgid "N_ew Directory Server"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:588
-#, fuzzy
-msgid "Unable to open addressbook"
-msgstr "Klik hier voor het adresboek"
-
-#: addressbook/gui/component/addressbook.c:593
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:938
-#: addressbook/gui/minicard/e-minicard.c:329
-msgid "Save as VCard"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1005
-msgid "* Click here to add a contact *"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1041
-msgid "As _Minicards"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1092
-msgid "The URI that the Folder Browser will display"
-msgstr "De URI die de Map Bladeraar weer zal geven"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:98
-msgid "h"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:23
-#, fuzzy
-msgid "o"
-msgstr "Aan"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr ""
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:10
-#, fuzzy
-msgid "Options"
-msgstr "_Acties"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:12
-#, fuzzy
-msgid "Sections:"
-msgstr "_Acties"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:16
-#, fuzzy
-msgid "Start on a new page"
-msgstr "Stuur een bericht"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:19
-#, fuzzy
-msgid "Fonts"
-msgstr "Contacten"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:24
-#, fuzzy
-msgid "Body"
-msgstr "Vandaag"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:28
-#, fuzzy
-msgid "Format"
-msgstr "Doorsturen"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-#, fuzzy
-msgid "Paper"
-msgstr "Plakken"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:37
-#, fuzzy
-msgid "Top:"
-msgstr "Aan:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:41
-#, fuzzy
-msgid "Page"
-msgstr "Plakken"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-#, fuzzy
-msgid "Size:"
-msgstr "Grootte"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:48
-#, fuzzy
-msgid "Portrait"
-msgstr "Prioriteit"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:544
-msgid "am"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:543
-msgid "pm"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:59
-#, fuzzy
-msgid "Appointments:"
-msgstr "_Afspraak"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:175
-#, fuzzy
-msgid "Gnome Calendar"
-msgstr "Kalender"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:456
-#, fuzzy
-msgid "Open calendar"
-msgstr "Uw kalender"
-
-#: calendar/gui/calendar-commands.c:495
-#, fuzzy
-msgid "Save calendar"
-msgstr "Uw kalender"
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:712
-#: calendar/gui/gncal-todo.c:716
-msgid "Day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-#, fuzzy
-msgid "Show the working week"
-msgstr "Toont of verbergt het boomoverzicht"
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:711
-msgid "Week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:531
-#, fuzzy
-msgid "Month"
-msgstr "Contacten"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:682
-msgid "Create a new appointment"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-#, fuzzy
-msgid "Print this calendar"
-msgstr "Uw kalender"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Prev"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:553
-#, fuzzy
-msgid "Today"
-msgstr "Vandaag"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554 filter/filter-editor.c:210
-msgid "Next"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr ""
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-#, fuzzy
-msgid "New Ca_lendar"
-msgstr "Kalender"
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:663
-#, fuzzy
-msgid "Open Ca_lendar"
-msgstr "Kalender"
-
-#: calendar/gui/calendar-commands.c:664
-#, fuzzy
-msgid "Open a calendar"
-msgstr "Uw kalender"
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-#, fuzzy
-msgid "Save Calendar As"
-msgstr "Kalender"
-
-#: calendar/gui/calendar-commands.c:673
-#, fuzzy
-msgid "Print..."
-msgstr "Afdrukken"
-
-#: calendar/gui/calendar-commands.c:682
-#, fuzzy
-msgid "_New appointment..."
-msgstr "_Afspraak"
-
-#: calendar/gui/calendar-commands.c:687
-msgid "New appointment for _today..."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:688
-msgid "Create a new appointment for today"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:696 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/calendar-commands.c:704
-#, fuzzy
-msgid "About Calendar"
-msgstr "Uw kalender"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:746
-#, c-format
-msgid "%s%s"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:746
-#, fuzzy
-msgid "'s calendar"
-msgstr "Uw kalender"
-
-#: calendar/gui/calendar-pilot-sync.c:68
-msgid "Specifies the port on which the Pilot is"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:68
-msgid "PORT"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:70
-msgid "If you want to debug the attributes on records"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:72
-msgid "Only syncs from desktop to pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:74
-msgid "Only syncs from pilot to desktop"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:97
-msgid "Can not create Pilot socket\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:104
-#, c-format
-msgid "Can not bind to device %s\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:107
-msgid "Failed to get a connection from the Pilot device"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:111
-msgid "pi_accept failed"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:211
-msgid ""
-"\tObject has been modified on desktop and on the pilot, desktop takes "
-"precedence\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:531
-msgid "No description"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:692
-msgid "Could not open DatebookDB on the Pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:693
-msgid "Unable to open DatebookDB"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:728
-msgid "Synced DateBook from Pilot to GnomeCal"
-msgstr ""
-
-#: calendar/gui/control-factory.c:136
-#, fuzzy
-msgid "The URI that the calendar will display"
-msgstr "De URI die de Map Bladeraar weer zal geven"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1056
-#, fuzzy
-msgid "Snooze"
-msgstr "Grootte"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-#, fuzzy
-msgid "Edit appointment"
-msgstr "_Afspraak"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr ""
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-#, fuzzy
-msgid "New appointment..."
-msgstr "_Afspraak"
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-#, fuzzy
-msgid "Delete this appointment"
-msgstr "Verwijdert dit bericht"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-#, fuzzy
-msgid "Delete this occurrence"
-msgstr "Verwijdert dit bericht"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr ""
-
-#: calendar/gui/event-editor.c:289
-#, fuzzy
-msgid "Edit Appointment"
-msgstr "_Afspraak"
-
-#: calendar/gui/event-editor.c:294
-msgid "No summary"
-msgstr ""
-
-#: calendar/gui/event-editor.c:298
-#, fuzzy, c-format
-msgid "Appointment - %s"
-msgstr "_Afspraak"
-
-#: calendar/gui/event-editor.c:301
-#, fuzzy, c-format
-msgid "Task - %s"
-msgstr "Taken"
-
-#: calendar/gui/event-editor.c:304
-#, fuzzy, c-format
-msgid "Journal entry - %s"
-msgstr "_Dagboek Item"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:594 calendar/gui/event-editor.c:688
-msgid "?"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1215
-msgid "FIXME: Ca_lendar..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1250
-msgid "FIXME: Chec_k Names"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1251
-msgid "FIXME: Address _Book..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1258
-#, fuzzy
-msgid "FIXME: _New Appointment"
-msgstr "_Afspraak"
-
-#: calendar/gui/event-editor.c:1260
-msgid "FIXME: Rec_urrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1262
-msgid "FIXME: Intive _Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1263
-msgid "FIXME: C_ancel Invitation..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Forward as v_Calendar"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1320
-msgid "FIXME: Save and Close"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1330
-msgid "FIXME: Recurrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1331
-msgid "Configure recurrence rules"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1333
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1334
-msgid "Invite attendees to a meeting"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1745
-msgid "%a %b %d %Y"
-msgstr ""
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:14 calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid "_Display"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:32
-msgid "_Audio"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:33
-msgid "_Program"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:34
-#, fuzzy
-msgid "_Mail"
-msgstr "_Mail"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "Mail _to:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Run program:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "Classification"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "Pu_blic"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-#, fuzzy
-msgid "Pri_vate"
-msgstr "Plakken"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Confidential"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:596
-#, fuzzy
-msgid "None"
-msgstr "_Notitie"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-msgid "Daily"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr ""
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-#, fuzzy
-msgid "month(s)"
-msgstr "Contacten"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-#, fuzzy
-msgid "Exceptions"
-msgstr "_Acties"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-#, fuzzy
-msgid "Change"
-msgstr "Plakken"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr ""
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr ""
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr ""
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr ""
-
-#: calendar/gui/getdate.y:394
-#, fuzzy
-msgid "april"
-msgstr "Plakken"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr ""
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr ""
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr ""
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr ""
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr ""
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr ""
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr ""
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr ""
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr ""
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr ""
-
-#: calendar/gui/getdate.y:405
-#, fuzzy
-msgid "monday"
-msgstr "Vandaag"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:407
-#, fuzzy
-msgid "tues"
-msgstr "_Notitie"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr ""
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr ""
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr ""
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr ""
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr ""
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr ""
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr ""
-
-#: calendar/gui/getdate.y:421
-#, fuzzy
-msgid "month"
-msgstr "Contacten"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr ""
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr ""
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr ""
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr ""
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr ""
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr ""
-
-#: calendar/gui/getdate.y:428
-#, fuzzy
-msgid "second"
-msgstr "Versturen"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr ""
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr ""
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr ""
-
-#: calendar/gui/getdate.y:437
-#, fuzzy
-msgid "today"
-msgstr "Vandaag"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr ""
-
-#: calendar/gui/getdate.y:439
-#, fuzzy
-msgid "last"
-msgstr "Plakken"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr ""
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr ""
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr ""
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr ""
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr ""
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr ""
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr ""
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr ""
-
-#: calendar/gui/getdate.y:450
-#, fuzzy
-msgid "ninth"
-msgstr "Afdrukken"
-
-#: calendar/gui/getdate.y:451
-#, fuzzy
-msgid "tenth"
-msgstr "Verzonden"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr ""
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Create to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Edit to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:171
-msgid "Summary:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:181
-msgid "Due Date:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:190
-#, fuzzy
-msgid "Priority:"
-msgstr "Prioriteit"
-
-#: calendar/gui/gncal-todo.c:206
-msgid "Item Comments:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:324
-msgid "Add to-do item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:325
-msgid "Edit this item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:424
-msgid "Summary"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:425 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:426 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr "Prioriteit"
-
-#: calendar/gui/gncal-todo.c:427
-msgid "Time Left"
-msgstr ""
-
-#. Label
-#: calendar/gui/gncal-todo.c:439
-#, fuzzy
-msgid "To-do list"
-msgstr "_Gereedschap"
-
-#. Add
-#: calendar/gui/gncal-todo.c:478
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr ""
-
-#. Edit
-#: calendar/gui/gncal-todo.c:487
-msgid "Edit..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:711
-msgid "Weeks"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:712 calendar/gui/gncal-todo.c:716
-#, fuzzy
-msgid "Days"
-msgstr "Klad"
-
-#: calendar/gui/gncal-todo.c:717 calendar/gui/gncal-todo.c:721
-msgid "Hours"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:717 calendar/gui/gncal-todo.c:721
-msgid "Hour"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Minutes"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Minute"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-#, fuzzy
-msgid "Seconds"
-msgstr "_Acties"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-#, fuzzy
-msgid "Second"
-msgstr "Versturen"
-
-#: calendar/gui/gnome-cal.c:453 calendar/gui/gnome-cal.c:1064
-#: calendar/gui/gnome-cal.c:1120
-msgid "Reminder of your appointment at "
-msgstr ""
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1069 calendar/gui/gnome-cal.c:1124
-msgid "Ok"
-msgstr ""
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr ""
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr ""
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr ""
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr ""
-
-#: calendar/gui/print.c:326
-#, fuzzy
-msgid "Fr"
-msgstr "Van"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr ""
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr ""
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr ""
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr ""
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr ""
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr ""
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1084
-#, fuzzy
-msgid "Print Calendar"
-msgstr "Kalender"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr ""
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr ""
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr ""
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr ""
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr ""
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr ""
-
-#: calendar/gui/prop.c:347
-#, fuzzy
-msgid "Sunday"
-msgstr "Versturen"
-
-#: calendar/gui/prop.c:348
-#, fuzzy
-msgid "Monday"
-msgstr "Vandaag"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr ""
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr ""
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr ""
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr ""
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr ""
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr ""
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr ""
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr ""
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr ""
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr ""
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr ""
-
-#: calendar/gui/prop.c:678
-msgid "To Do List Properties"
-msgstr ""
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr ""
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-#, fuzzy
-msgid "Alarm Properties"
-msgstr "Eigenschappen"
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr ""
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr ""
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr ""
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-msgid "Defaults"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.c:183 composer/e-msg-composer.c:766
-msgid "Cut"
-msgstr "Knippen"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "Knip het geselecteerde item naar het klembord"
-
-#: composer/e-msg-composer-address-dialog.c:187 composer/e-msg-composer.c:767
-msgid "Copy"
-msgstr "Kopieren"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "Kopieer het geseleceteerde item naar het klembord"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199 composer/e-msg-composer.c:768
-msgid "Paste"
-msgstr "Plakken"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Plak een item vanaf het klembord"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "Selecteer de geadresseerden"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-#, fuzzy
-msgid "Properties..."
-msgstr "Eigenschappen"
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-#, fuzzy
-msgid "To: >>"
-msgstr "Aan:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-#, fuzzy
-msgid "Cc: >>"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-#, fuzzy
-msgid "Bcc: >>"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bytes"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Bestand bijvoegen"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:332
-msgid "Remove"
-msgstr "Verwijderen"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Verwijder het geselecteerde bestand uit de lijst van attachments"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Bestand bijvoegen..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Voeg een bestand bij het bericht"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr ""
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr ""
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr "Klik hier voor het adresboek"
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "Aan:"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr "Geef de geaddreseerden"
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Geef de adressen die een 'carbon copy' van het bericht moeten krijgen"
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Geef de adressen die een 'carbon copy' van het bericht moeten krijgen "
-"zonder\n"
-"dat ze op de geadresseerden-lijst van het bericht verschijnen."
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr "Onderwerp:"
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr "Geef het onderwerp van het bericht"
-
-#: composer/e-msg-composer.c:463
-msgid "Save as..."
-msgstr ""
-
-#: composer/e-msg-composer.c:474
-#, c-format
-msgid "Error saving file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:494
-#, c-format
-msgid "Error loading file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:513
-#, fuzzy
-msgid "Discard this message?"
-msgstr "Dit bericht doorsturen"
-
-#: composer/e-msg-composer.c:561
-#, fuzzy
-msgid "Open file"
-msgstr "Map Openen"
-
-#: composer/e-msg-composer.c:718
-msgid "Save in _folder..."
-msgstr "Opslaan in _map..."
-
-#: composer/e-msg-composer.c:718
-msgid "Save the message in a specified folder"
-msgstr "Sla het bericht op in een bepaalde map"
-
-#: composer/e-msg-composer.c:721 composer/e-msg-composer.c:763
-msgid "Send"
-msgstr "Versturen"
-
-#: composer/e-msg-composer.c:721
-msgid "Send the message"
-msgstr "Verstuurt het bericht"
-
-#: composer/e-msg-composer.c:733
-msgid "View _attachments"
-msgstr "Bekijk _attachments"
-
-#: composer/e-msg-composer.c:733
-msgid "View/hide attachments"
-msgstr "Toon/verberg de attachments"
-
-#: composer/e-msg-composer.c:763
-msgid "Send this message"
-msgstr "Dit bericht versturen"
-
-#: composer/e-msg-composer.c:766
-msgid "Cut selected region into the clipboard"
-msgstr "Knip het geselecteerde gebied naar het klembord"
-
-#: composer/e-msg-composer.c:767
-msgid "Copy selected region into the clipboard"
-msgstr "Kopieer het geselecteerde gebied naar het klembord"
-
-#: composer/e-msg-composer.c:768
-msgid "Paste selected region into the clipboard"
-msgstr "Plak het geselecteerde gebied vanuit het klembord"
-
-#: composer/e-msg-composer.c:769
-msgid "Undo"
-msgstr "Ongedaan maken"
-
-#: composer/e-msg-composer.c:769
-msgid "Undo last operation"
-msgstr "Maak de laatste bewerking ongedaan"
-
-#: composer/e-msg-composer.c:772
-msgid "Attach"
-msgstr "Bijvoegen"
-
-#: composer/e-msg-composer.c:772
-msgid "Attach a file"
-msgstr "Voeg een bestand bij"
-
-#: composer/e-msg-composer.c:948
-#, fuzzy
-msgid "Compose a message"
-msgstr "Stelt een nieuw bericht op"
-
-#: filter/filter-editor.c:198
-#, fuzzy
-msgid "Edit Filter"
-msgstr "_Map"
-
-#: filter/filter-editor.c:198
-msgid "Create filter"
-msgstr ""
-
-#: filter/filter-editor.c:209
-msgid "Back"
-msgstr ""
-
-#: filter/filter-editor.c:211
-#, fuzzy
-msgid "Finish"
-msgstr "Zoeken"
-
-#: filter/filter-editor.c:212
-msgid "Cancel"
-msgstr ""
-
-#: filter/filter-editor.c:216
-#, fuzzy
-msgid "Apply"
-msgstr "Beantwoorden"
-
-#: filter/filter-editor.c:233
-msgid ""
-"<h2>Create Filtering Rule</h2><p>Select one of the base rules above, then "
-"continue forwards to customise it.</p>"
-msgstr ""
-
-#: mail/component-factory.c:196
-#, fuzzy
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Niet in geslaagd om het Bonobo componentensysteem te initializeren"
-
-#: mail/folder-browser-factory.c:29
-#, fuzzy
-msgid "Get mail"
-msgstr "Nieuwe mail"
-
-#: mail/folder-browser-factory.c:29
-msgid "Check for new mail"
-msgstr "Controleer op nieuwe mail"
-
-#: mail/folder-browser-factory.c:30
-msgid "Compose"
-msgstr ""
-
-#: mail/folder-browser-factory.c:30
-#, fuzzy
-msgid "Compose a new message"
-msgstr "Stelt een nieuw bericht op"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply"
-msgstr "Beantwoorden"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply to the sender of this message"
-msgstr "Beantwoord dit bericht"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to All"
-msgstr "Alle beantwoorden"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to all recipients of this message"
-msgstr "Stuur antwoord naar alle geadresseerden van dit bericht"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward"
-msgstr "Doorsturen"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward this message"
-msgstr "Dit bericht doorsturen"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Refile"
-msgstr "Ontvangen"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Move message to a new folder"
-msgstr "Sla het bericht op in een bepaalde map"
-
-#: mail/folder-browser-factory.c:43
-msgid "Print the selected message"
-msgstr "Druk dit bericht af"
-
-#: mail/folder-browser-factory.c:45
-msgid "Delete this message"
-msgstr "Verwijdert dit bericht"
-
-#: mail/folder-browser-factory.c:65
-msgid "_Threaded Message List"
-msgstr ""
-
-#: mail/folder-browser-factory.c:77
-msgid "_Expunge"
-msgstr ""
-
-#: mail/folder-browser-factory.c:83
-msgid "_Filter Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:89
-msgid "_Virtual Folder Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:95
-msgid "_Mail Configuration ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:101
-msgid "Forget _Passwords"
-msgstr ""
-
-#: mail/mail-config.c:259
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-
-#: mail/mail-config.c:274
-msgid "Full name:"
-msgstr ""
-
-#: mail/mail-config.c:302
-msgid "Email address:"
-msgstr ""
-
-#: mail/mail-config.c:325
-msgid "Organization:"
-msgstr ""
-
-#: mail/mail-config.c:337
-msgid "Signature file:"
-msgstr ""
-
-#: mail/mail-config.c:342
-msgid "Signature File"
-msgstr ""
-
-#: mail/mail-config.c:699 mail/mail-config.c:790
-msgid "Server:"
-msgstr ""
-
-#: mail/mail-config.c:705
-msgid "Username:"
-msgstr ""
-
-#: mail/mail-config.c:711
-#, fuzzy
-msgid "Path:"
-msgstr "Plakken"
-
-#: mail/mail-config.c:717 mail/mail-config.c:796
-msgid "Authentication:"
-msgstr ""
-
-#: mail/mail-config.c:729 mail/mail-config.c:808
-msgid "Detect supported types..."
-msgstr ""
-
-#: mail/mail-config.c:755 mail/mail-config.c:830
-msgid "Test these values before continuing"
-msgstr ""
-
-#: mail/mail-config.c:937
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:955
-msgid "Select the method you would like to use to deliver your mail."
-msgstr ""
-
-#: mail/mail-config.c:1129 mail/mail-config.c:1208
-msgid "Mail Configuration"
-msgstr ""
-
-#. Identity page
-#: mail/mail-config.c:1146
-msgid "Identity"
-msgstr ""
-
-#. Source page
-#: mail/mail-config.c:1165
-#, fuzzy
-msgid "Mail Source"
-msgstr "Belangrijkste Snelkoppelingen"
-
-#. Transport page
-#: mail/mail-config.c:1186
-msgid "Mail Transport"
-msgstr ""
-
-#: mail/mail-config.c:1308
-msgid "Edit Identity"
-msgstr ""
-
-#: mail/mail-config.c:1310
-msgid "Add Identity"
-msgstr ""
-
-#: mail/mail-config.c:1453
-msgid "Edit Source"
-msgstr ""
-
-#: mail/mail-config.c:1455
-#, fuzzy
-msgid "Add Source"
-msgstr "Snelkoppeling Toevoegen"
-
-#: mail/mail-ops.c:372
-#, fuzzy
-msgid "Fetching mail"
-msgstr "Nieuwe mail"
-
-#: mail/mail-ops.c:384
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-
-#: mail/mail-ops.c:732
-#, fuzzy
-msgid "Refile message(s) to"
-msgstr "Nieuwe email-berichten"
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr ""
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr ""
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr ""
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr ""
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr ""
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr ""
-
-#: mail/main.c:62
-msgid "Mail Component: I could not initialize Bonobo"
-msgstr "Mail gedeelte: Ik kon Bonobo niet initializeren"
-
-#: mail/message-list.c:460
-msgid "Online Status"
-msgstr ""
-
-#: mail/message-list.c:488
-msgid "From"
-msgstr "Van"
-
-#: mail/message-list.c:495
-msgid "Subject"
-msgstr "Onderwerp"
-
-#: mail/message-list.c:502
-#, fuzzy
-msgid "Date"
-msgstr "Plakken"
-
-#: mail/message-list.c:509
-#, fuzzy
-msgid "Received"
-msgstr "Ontvangen"
-
-#: mail/message-list.c:516
-msgid "To"
-msgstr "Aan"
-
-#: mail/message-list.c:523
-msgid "Size"
-msgstr "Grootte"
-
-#: shell/e-init.c:25
-msgid "Evolution can not create its local folders"
-msgstr "Evolution kan zijn lokale mappen niet maken"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr ""
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr ""
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr ""
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, fuzzy, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr "Sla het bericht op in een bepaalde map"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:223
-#, fuzzy
-msgid "Evolution - Create new folder"
-msgstr "Evolution kan zijn lokale mappen niet maken"
-
-#: shell/e-shell-folder-selection-dialog.c:95
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:236
-#, fuzzy
-msgid "New..."
-msgstr "_Nieuw"
-
-#: shell/e-shell-folder-title-bar.c:355
-msgid "(Untitled)"
-msgstr ""
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:110
-msgid "Bug buddy was not found in your $PATH."
-msgstr ""
-
-#. same as above
-#: shell/e-shell-view-menu.c:116
-msgid "Bug buddy could not be run."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:159
-msgid "Evolution"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:161
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:163
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:301
-#, fuzzy
-msgid "Go to folder..."
-msgstr "Opslaan in _map..."
-
-#: shell/e-shell-view-menu.c:365
-msgid "_Folder"
-msgstr "_Map"
-
-#: shell/e-shell-view-menu.c:369
-msgid "Evolution _Bar Shortcut"
-msgstr "Evolution _Balk Snelkoppeling"
-
-#: shell/e-shell-view-menu.c:375
-#, fuzzy
-msgid "_Mail message (FIXME)"
-msgstr "_Mail bericht"
-
-#: shell/e-shell-view-menu.c:376 shell/e-shell-view-menu.c:379
-msgid "Composes a new mail message"
-msgstr "Stelt een nieuw bericht op"
-
-#: shell/e-shell-view-menu.c:378
-#, fuzzy
-msgid "_Appointment (FIXME)"
-msgstr "_Afspraak"
-
-#: shell/e-shell-view-menu.c:381
-#, fuzzy
-msgid "_Contact (FIXME)"
-msgstr "_Contact"
-
-#: shell/e-shell-view-menu.c:384
-msgid "_Task (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:387
-#, fuzzy
-msgid "Task _Request (FIXME)"
-msgstr "Taak _Verzoek"
-
-#: shell/e-shell-view-menu.c:390
-#, fuzzy
-msgid "_Journal Entry (FIXME)"
-msgstr "_Dagboek Item"
-
-#: shell/e-shell-view-menu.c:398
-msgid "_New"
-msgstr "_Nieuw"
-
-#: shell/e-shell-view-menu.c:402
-#, fuzzy
-msgid "_Go to folder..."
-msgstr "Opslaan in _map..."
-
-#: shell/e-shell-view-menu.c:402
-msgid "Display a different folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:404
-#, fuzzy
-msgid "_Create new folder..."
-msgstr "Opslaan in _map..."
-
-#: shell/e-shell-view-menu.c:404
-msgid "Create a new folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:419
-#, fuzzy
-msgid "Show _shortcut bar"
-msgstr "Snelkoppelingenbalk Tonen/Verbergen"
-
-#: shell/e-shell-view-menu.c:420
-#, fuzzy
-msgid "Show the shortcut bar"
-msgstr "Toont of verbergt de snelkoppelingenbalk"
-
-#: shell/e-shell-view-menu.c:422
-#, fuzzy
-msgid "Show _folder bar"
-msgstr "Snelkoppelingenbalk Tonen/Verbergen"
-
-#: shell/e-shell-view-menu.c:423
-#, fuzzy
-msgid "Show the folder bar"
-msgstr "Toont of verbergt de snelkoppelingenbalk"
-
-#: shell/e-shell-view-menu.c:440
-msgid "Help _Index"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:443
-msgid "Getting _Started"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:446
-msgid "Using the _Mailer"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:449
-msgid "Using the _Calendar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:452
-msgid "Using the Cont_act Manager"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:457
-msgid "_Submit bug report"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:458
-msgid "Submit bug-report via bug-buddy"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:474
-msgid "_Actions"
-msgstr "_Acties"
-
-#: shell/e-shell-view.c:113
-msgid "(No folder displayed)"
-msgstr ""
-
-#: shell/e-shell-view.c:208
-#, fuzzy
-msgid "Folders"
-msgstr "_Map"
-
-#: shell/e-shell-view.c:600
-#, c-format
-msgid "Evolution - %s"
-msgstr ""
-
-#: shell/e-shell.c:299
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr ""
-
-#: shell/e-shortcut.c:469
-msgid "New group"
-msgstr "Nieuwe groep"
-
-#: shell/e-shortcuts-view.c:235
-#, fuzzy
-msgid "_Small icons"
-msgstr "Kleine Iconen"
-
-#: shell/e-shortcuts-view.c:236
-#, fuzzy
-msgid "Show the shortcuts as small icons"
-msgstr "Toont of verbergt de snelkoppelingenbalk"
-
-#: shell/e-shortcuts-view.c:238
-#, fuzzy
-msgid "_Large icons"
-msgstr "Grote Iconen"
-
-#: shell/e-shortcuts-view.c:239
-#, fuzzy
-msgid "Show the shortcuts as large icons"
-msgstr "Toont of verbergt de snelkoppelingenbalk"
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate this shortcut"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:332
-#, fuzzy
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Verwijderen van Snelkoppelingenbalk"
-
-#: shell/e-shortcuts.c:358
-#, fuzzy
-msgid "Error saving shortcuts."
-msgstr "Belangrijkste Snelkoppelingen"
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr ""
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr ""
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr ""
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr ""
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr ""
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr ""
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr ""
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr ""
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr ""
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr ""
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr ""
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr ""
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr ""
-
-#: shell/main.c:99
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-
-#: shell/main.c:126
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-
-#: shell/main.c:172
-msgid "Cannot initialize the Evolution shell."
-msgstr ""
-
-#: shell/main.c:214
-#, fuzzy
-msgid "Cannot initialize the configuration system."
-msgstr "Niet in geslaagd om het Bonobo componentensysteem te initializeren"
-
-#: shell/main.c:220
-#, fuzzy
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Niet in geslaagd om het Bonobo componentensysteem te initializeren"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-#, fuzzy
-msgid "Fields"
-msgstr "Zoeken"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr ""
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr ""
-
-#: widgets/e-table/e-table-config.glade.h:10
-#, fuzzy
-msgid "Filter"
-msgstr "_Map"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-#, fuzzy
-msgid "Field Chooser"
-msgstr "Zoeken"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:13
-#, fuzzy
-msgid "<< Remove"
-msgstr "Verwijderen"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-#, fuzzy
-msgid "_Options"
-msgstr "_Acties"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-#, fuzzy
-msgid "Meeting _start time:"
-msgstr "Verzoek tot _Vergadering"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-#, fuzzy
-msgid "Meeting _end time:"
-msgstr "Verzoek tot _Vergadering"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr ""
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr ""
-
-#: widgets/shortcut-bar/e-group-bar.c:633
-#, c-format
-msgid "Group %i"
-msgstr ""
-
-#~ msgid "Send a new message"
-#~ msgstr "Stuur een bericht"
-
-#~ msgid "Find messages"
-#~ msgstr "Zoek naar berichten"
-
-#~ msgid "We are sorry, Evolution's Folder Browser can not be initialized."
-#~ msgstr "Het spijt ons, Evolution's Map Bladeraar kon niet worden geladen."
-
-#~ msgid "Whether a message preview should be shown"
-#~ msgstr "Of een voorbeeld-bericht getoond moet worden"
-
-#~ msgid "_Task"
-#~ msgstr "_Taak"
-
-#~ msgid "_Selected Items"
-#~ msgstr "_Geselecteerde Items"
-
-#~ msgid "_New Folder"
-#~ msgstr "_Nieuwe Map"
-
-#~ msgid "_Open"
-#~ msgstr "_Openen"
-
-#~ msgid "Clos_e All Items"
-#~ msgstr "Alle Items _Sluiten"
-
-#~ msgid "Closes all the open items"
-#~ msgstr "Sluit alle geopende items"
-
-#, fuzzy
-#~ msgid "Show _Treeview"
-#~ msgstr "_Boomoverzicht Tonen/Verbergen"
-
-#~ msgid ""
-#~ "This is a development version of Evolution.\n"
-#~ "Using the mail component on your mail files\n"
-#~ "is extremely hazardous.\n"
-#~ "\n"
-#~ "Do not run this program on your real mail\n"
-#~ " and do not give it access to your real mail server.\n"
-#~ "\n"
-#~ "You have been warned\n"
-#~ msgstr ""
-#~ "Dit is een ontwikkel-versie van Evolution.\n"
-#~ "Het gebruik van het email-gedeelte op uw mail bestanden\n"
-#~ "is erg af te raden.\n"
-#~ "\n"
-#~ "Gebruik dit programma niet om uw echte email mee\n"
-#~ "te lezen en geef het geen toegang tot uw echte mail server.\n"
-#~ "\n"
-#~ "U bent gewaarschuwd\n"
-
-#~ msgid "A folder containing mail items"
-#~ msgstr "Een map die de mail items bevat"
-
-#~ msgid "A folder containing contacts"
-#~ msgstr "Een map die de contacten bevat"
-
-#~ msgid "A folder containing calendar entries"
-#~ msgstr "Een map die kalender entries bevat"
-
-#~ msgid "A folder containing tasks"
-#~ msgstr "Een map die taken bevat"
-
-#~ msgid "A service containing mail items"
-#~ msgstr "Een dienst die mail items bevat"
-
-#~ msgid "A service containing contacts"
-#~ msgstr "Een dienst die contacten bevat"
-
-#~ msgid "A service containing calendar entries"
-#~ msgstr "Een dienst die kalender entries bevat"
-
-#~ msgid "A service containing tasks"
-#~ msgstr "Een dienst die taken bevat"
-
-#~ msgid "Add New Group"
-#~ msgstr "Nieuwe Groep Toevoegen"
-
-#~ msgid "Remove Group"
-#~ msgstr "Groep Verwijderen"
-
-#~ msgid "Rename Group"
-#~ msgstr "Naam Wijzigen Groep"
-
-#~ msgid "Open in New Window"
-#~ msgstr "Openen in Nieuw Venster"
-
-#~ msgid "Advanced Find"
-#~ msgstr "Geavanceerd Zoeken"
-
-#~ msgid "Rename Shortcut"
-#~ msgstr "Naam Wijzigen Snelkoppeling"
-
-#~ msgid "Executive Summary"
-#~ msgstr "Samenvatting"
-
-#~ msgid "Inbox"
-#~ msgstr "Postvak In"
-
-#~ msgid "Sent messages"
-#~ msgstr "Verzonden berichten"
-
-#~ msgid "Sent mail messages"
-#~ msgstr "Verzonden email-berichten"
-
-#~ msgid "Draft mail messages"
-#~ msgstr "Klad mail berichten"
-
-#~ msgid "Tasks list"
-#~ msgstr "Taaklisjt"
-
-#~ msgid "Other Shortcuts"
-#~ msgstr "Andere Snelkoppelingen"
-
-#~ msgid "Enables some debugging functions"
-#~ msgstr "Zet wat debugging functies aan"
-
-#~ msgid "LEVEL"
-#~ msgstr "LEVEL"
-
-#~ msgid ""
-#~ "It was not possible to setup the Evolution startup files. Please\n"
-#~ "fix the problem, and restart Evolution"
-#~ msgstr ""
-#~ "Het was niet mogelijk om de Evolution opstartbestanden de installeren.\n"
-#~ "Repareer het probleem, en start Evolution overnieuw."
diff --git a/po/no.po b/po/no.po
deleted file mode 100644
index 72c68a41b3..0000000000
--- a/po/no.po
+++ /dev/null
@@ -1,4627 +0,0 @@
-# Norwegian translation of evolution (bokmål dialect).
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Kjartan Maraas <kmaraas@gnome.org>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution 0.4\n"
-"POT-Creation-Date: 2000-08-15 22:52+0200\n"
-"PO-Revision-Date: 2000-08-19 21:36+02:00\n"
-"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
-"Language-Team: Norwegian <no@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: addressbook/backend/ebook/load-gnomecard-addressbook.c:41
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/backend/ebook/test-client-list.c:29
-#: addressbook/backend/ebook/test-client.c:54
-#: addressbook/conduit/address-conduit.c:1201
-#: addressbook/demo/addressbook-factory.c:32
-#: addressbook/gui/component/addressbook-factory.c:59
-#: addressbook/gui/minicard/test-minicard-view.c:45
-#: calendar/conduits/calendar/calendar-conduit.c:1669
-#: calendar/conduits/todo/todo-conduit.c:1298 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Kunne ikke initialisere Bonobo"
-
-#. This array must be in the same order as enumerations
-#. in GnomePilotConduitSyncType as they are used as index.
-#. Custom type implies Disabled state.
-#.
-#: addressbook/conduit/address-conduit-control-applet.c:54
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:55
-#: calendar/conduits/todo/todo-conduit-control-applet.c:55
-msgid "Disabled"
-msgstr "Slått av"
-
-#: addressbook/conduit/address-conduit-control-applet.c:55
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:56
-#: calendar/conduits/todo/todo-conduit-control-applet.c:56
-msgid "Synchronize"
-msgstr "Synkronisér"
-
-#: addressbook/conduit/address-conduit-control-applet.c:56
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:57
-#: calendar/conduits/todo/todo-conduit-control-applet.c:57
-msgid "Copy From Pilot"
-msgstr "Kopiér fra Pilot"
-
-#: addressbook/conduit/address-conduit-control-applet.c:57
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:58
-#: calendar/conduits/todo/todo-conduit-control-applet.c:58
-msgid "Copy To Pilot"
-msgstr "Kopiér til Pilot"
-
-#: addressbook/conduit/address-conduit-control-applet.c:58
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:59
-#: calendar/conduits/todo/todo-conduit-control-applet.c:59
-msgid "Merge From Pilot"
-msgstr "Flett fra Pilot"
-
-#: addressbook/conduit/address-conduit-control-applet.c:59
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:60
-#: calendar/conduits/todo/todo-conduit-control-applet.c:60
-msgid "Merge To Pilot"
-msgstr "Flett til Pilot"
-
-#: addressbook/conduit/address-conduit-control-applet.c:143
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:144
-#: calendar/conduits/todo/todo-conduit-control-applet.c:144
-msgid "Eskil Heyn Olsen <deity@eskil.dk>"
-msgstr "Eskil Heyn Olsen <deity@eskil.dk>"
-
-#: addressbook/conduit/address-conduit-control-applet.c:145
-msgid "Gpilotd address conduit"
-msgstr "Gpilotd addressekomponent"
-
-#: addressbook/conduit/address-conduit-control-applet.c:146
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:147
-#: calendar/conduits/todo/todo-conduit-control-applet.c:147
-msgid "(C) 1998 the Free Software Foundation"
-msgstr "(C) 1998 the Free Software Foundation"
-
-#: addressbook/conduit/address-conduit-control-applet.c:148
-msgid "Configuration utility for the address conduit.\n"
-msgstr "Konfigurasjonsverktøy for adressekomponenten.\n"
-
-#: addressbook/conduit/address-conduit-control-applet.c:149
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:150
-#: calendar/conduits/todo/todo-conduit-control-applet.c:150
-msgid "gnome-unknown.xpm"
-msgstr "gnome-unknown.xpm"
-
-#: addressbook/conduit/address-conduit-control-applet.c:190
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:191
-#: calendar/conduits/todo/todo-conduit-control-applet.c:191
-msgid "Synchronize Action"
-msgstr "Synkroniseringshandling"
-
-#: addressbook/conduit/address-conduit-control-applet.c:261
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:262
-#: calendar/conduits/todo/todo-conduit-control-applet.c:262
-msgid "Conduit state"
-msgstr "Komponent-tilstand"
-
-#: addressbook/conduit/address-conduit-control-applet.c:315
-#: addressbook/conduit/address-conduit-control-applet.c:328
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:316
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:329
-#: calendar/conduits/todo/todo-conduit-control-applet.c:316
-#: calendar/conduits/todo/todo-conduit-control-applet.c:329
-msgid ""
-"No pilot configured, please choose the\n"
-"'Pilot Link Properties' capplet first."
-msgstr ""
-"Ingen pilot er konfigurert, vennligst\n"
-"velg cappleten 'Egenskaper for pilot link' først."
-
-#: addressbook/conduit/address-conduit-control-applet.c:334
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:335
-#: calendar/conduits/todo/todo-conduit-control-applet.c:335
-msgid "Not connected to the gnome-pilot daemon"
-msgstr "Ikke tilkoblet gnome-pilot daemon"
-
-#: addressbook/conduit/address-conduit-control-applet.c:339
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:340
-#: calendar/conduits/todo/todo-conduit-control-applet.c:340
-msgid ""
-"An error occured when trying to fetch\n"
-"pilot list from the gnome-pilot daemon"
-msgstr ""
-"En feil oppsto under forsøk på å hente\n"
-"pilot-listen fra gnome-pilot daemonen"
-
-#: addressbook/conduit/address-conduit.c:128
-#: addressbook/conduit/address-conduit.c:142
-msgid "BLARG\n"
-msgstr "BLARG\n"
-
-#: addressbook/conduit/address-conduit.c:459
-#, c-format
-msgid "Address holds %ld address entries"
-msgstr "Adressen har %ld adresseoppføringer"
-
-#: addressbook/conduit/address-conduit.c:485
-#: addressbook/conduit/address-conduit.c:487
-msgid "Could not start addressbook server"
-msgstr "Kunne ikke starte adressebok-tjeneren"
-
-#: addressbook/conduit/address-conduit.c:500
-#: addressbook/conduit/address-conduit.c:503
-msgid "Could not read pilot's Address application block"
-msgstr "Kunne ikke lese pilotens adresseapplikasjonsblokk"
-
-#: addressbook/conduit/address-conduit.c:841
-msgid "Error while communicating with address server"
-msgstr "Feil under kommunikasjon med adresse-tjeneren"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "kategorier"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "Oppføring(er) hører til disse kategoriene:"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "Tilgjengelige kategorier:"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/dialogs/task-editor.c:217 calendar/gui/event-editor.c:1168
-msgid "FIXME: _Appointment"
-msgstr "_Avtale"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/dialogs/task-editor.c:218 calendar/gui/event-editor.c:1169
-msgid "FIXME: Meeting Re_quest"
-msgstr "Møteforesp_ørsel"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/dialogs/task-editor.c:216 calendar/gui/event-editor.c:1171
-msgid "FIXME: _Mail Message"
-msgstr "Send _melding"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/dialogs/task-editor.c:219 calendar/gui/event-editor.c:1172
-msgid "FIXME: _Contact"
-msgstr "_Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/dialogs/task-editor.c:213
-#: calendar/gui/dialogs/task-editor.c:220 calendar/gui/event-editor.c:1173
-msgid "FIXME: _Task"
-msgstr "_Oppgave"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/dialogs/task-editor.c:214
-#: calendar/gui/dialogs/task-editor.c:221 calendar/gui/event-editor.c:1174
-msgid "FIXME: Task _Request"
-msgstr "Oppgavefo_respørsel"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/dialogs/task-editor.c:222 calendar/gui/event-editor.c:1175
-msgid "FIXME: _Journal Entry"
-msgstr "_Journaloppføring"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/dialogs/task-editor.c:223 calendar/gui/event-editor.c:1176
-msgid "FIXME: _Note"
-msgstr "_Notis"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/dialogs/task-editor.c:225
-#: calendar/gui/dialogs/task-editor.c:332 calendar/gui/event-editor.c:1178
-#: calendar/gui/event-editor.c:1285
-msgid "FIXME: Ch_oose Form..."
-msgstr "Velg skjema..."
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/dialogs/task-editor.c:230 calendar/gui/event-editor.c:1183
-msgid "FIXME: _Memo Style"
-msgstr "_Notis-stil"
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/dialogs/task-editor.c:232 calendar/gui/event-editor.c:1185
-msgid "FIXME: Define Print _Styles..."
-msgstr "Definér utskriftstiler..."
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/dialogs/task-editor.c:239 calendar/gui/event-editor.c:1192
-msgid "FIXME: S_end"
-msgstr "_Send"
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/dialogs/task-editor.c:243 calendar/gui/event-editor.c:1196
-msgid "FIXME: Save Attac_hments..."
-msgstr "Lagre vedlegg..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "_Slett"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/dialogs/task-editor.c:246 calendar/gui/event-editor.c:1199
-msgid "FIXME: _Move to Folder..."
-msgstr "_Flytt til mappe..."
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/dialogs/task-editor.c:247 calendar/gui/event-editor.c:1200
-msgid "FIXME: Cop_y to Folder..."
-msgstr "Kopiér til mappe..."
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/dialogs/task-editor.c:249 calendar/gui/event-editor.c:1202
-msgid "Page Set_up"
-msgstr "Sideoppsett"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/dialogs/task-editor.c:250 calendar/gui/event-editor.c:1203
-msgid "FIXME: Print Pre_view"
-msgstr "Forhåndsvisning av utskrift"
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/dialogs/task-editor.c:271 calendar/gui/event-editor.c:1224
-msgid "FIXME: Paste _Special..."
-msgstr "Lim inn _spesial..."
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/dialogs/task-editor.c:276 calendar/gui/event-editor.c:1229
-msgid "FIXME: Mark as U_nread"
-msgstr "Merk som ulest"
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/dialogs/task-editor.c:280 calendar/gui/event-editor.c:1233
-msgid "_Object"
-msgstr "_Objekt"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/dialogs/task-editor.c:285
-#: calendar/gui/dialogs/task-editor.c:293 calendar/gui/event-editor.c:1238
-#: calendar/gui/event-editor.c:1245
-msgid "FIXME: _Item"
-msgstr "_Oppføring"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/dialogs/task-editor.c:286
-#: calendar/gui/dialogs/task-editor.c:294 calendar/gui/event-editor.c:1239
-#: calendar/gui/event-editor.c:1246
-msgid "FIXME: _Unread Item"
-msgstr "_Ulest oppføring"
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/dialogs/task-editor.c:288 calendar/gui/event-editor.c:1240
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr "Fø_rste oppføring i mappe"
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/dialogs/task-editor.c:296 calendar/gui/event-editor.c:1247
-msgid "FIXME: _Last Item in Folder"
-msgstr "_Siste oppføring i mappe"
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/dialogs/task-editor.c:301 calendar/gui/event-editor.c:1252
-msgid "FIXME: _Standard"
-msgstr "_Standard"
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/dialogs/task-editor.c:303 calendar/gui/event-editor.c:1254
-msgid "FIXME: __Formatting"
-msgstr "_Formatering"
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/dialogs/task-editor.c:306 calendar/gui/event-editor.c:1257
-msgid "FIXME: _Customize..."
-msgstr "_Tilpass..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/dialogs/task-editor.c:311 calendar/gui/event-editor.c:1262
-msgid "Pre_vious"
-msgstr "Forri_ge"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/dialogs/task-editor.c:312 calendar/gui/event-editor.c:1263
-msgid "Ne_xt"
-msgstr "Nes_te"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/dialogs/task-editor.c:314 calendar/gui/event-editor.c:1267
-msgid "_Toolbars"
-msgstr "Verk_tøylinjer"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/dialogs/task-editor.c:319 calendar/gui/event-editor.c:1272
-msgid "FIXME: _File..."
-msgstr "_Fil..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/dialogs/task-editor.c:320 calendar/gui/event-editor.c:1273
-msgid "FIXME: It_em..."
-msgstr "Opp_føring"
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/dialogs/task-editor.c:321 calendar/gui/event-editor.c:1274
-msgid "FIXME: _Object..."
-msgstr "_Objekt..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/dialogs/task-editor.c:326 calendar/gui/event-editor.c:1279
-msgid "FIXME: _Font..."
-msgstr "FIXME: Skri_fttyper..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/dialogs/task-editor.c:327 calendar/gui/event-editor.c:1280
-msgid "FIXME: _Paragraph..."
-msgstr "_Avsnitt..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/dialogs/task-editor.c:334 calendar/gui/event-editor.c:1287
-msgid "FIXME: Desi_gn This Form"
-msgstr "_Utform dette skjemaet"
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/dialogs/task-editor.c:335 calendar/gui/event-editor.c:1288
-msgid "FIXME: D_esign a Form..."
-msgstr "U_tform et skjema..."
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/dialogs/task-editor.c:337 calendar/gui/event-editor.c:1290
-msgid "FIXME: Publish _Form..."
-msgstr "Publisér skjema..."
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/dialogs/task-editor.c:338 calendar/gui/event-editor.c:1291
-msgid "FIXME: Pu_blish Form As..."
-msgstr "Pu_blisér skjema som..."
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/dialogs/task-editor.c:340 calendar/gui/event-editor.c:1293
-msgid "FIXME: Script _Debugger"
-msgstr "Feilsøking i skript"
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/dialogs/task-editor.c:345 calendar/gui/event-editor.c:1298
-msgid "FIXME: _Spelling..."
-msgstr "_Stavekontroll..."
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/dialogs/task-editor.c:350 calendar/gui/event-editor.c:1303
-msgid "_Forms"
-msgstr "Sk_jemaer"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "_Ny kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr "Ny _kontakt fra samme firma"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr "Nytt brev ti_l kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr "Ny _melding til kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr "Nytt m_øte med kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr "_Planlegg et møte..."
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr "Ny opp_gave for kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr "Ny _journaloppføring for kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr "Merk _for oppfølging..."
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr "_Vis kart med adresse"
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr "_Åpne webside"
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr "Videresend som _vCard"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/dialogs/task-editor.c:367 calendar/gui/event-editor.c:1316
-msgid "FIXME: For_ward"
-msgstr "_Videresend"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/dialogs/task-editor.c:380 calendar/gui/event-editor.c:1329
-msgid "_Insert"
-msgstr "Sett _inn"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/dialogs/task-editor.c:381 calendar/gui/event-editor.c:1330
-msgid "F_ormat"
-msgstr "F_ormat"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/dialogs/task-editor.c:382 calendar/gui/event-editor.c:1331
-#: shell/e-shell-view-menu.c:513
-msgid "_Tools"
-msgstr "_Verktøy"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/dialogs/task-editor.c:383 calendar/gui/event-editor.c:1332
-msgid "Actio_ns"
-msgstr "Ha_ndlinger"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "Lagre og lukk"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1371
-msgid "Save the appointment and close the dialog box"
-msgstr "Lagre avtalen og lukk dialogboksen"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:654
-msgid "Print..."
-msgstr "Skriv ut..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/dialogs/task-editor.c:415 calendar/gui/event-editor.c:1376
-msgid "Print this item"
-msgstr "Skriv ut denne oppføringen"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/dialogs/task-editor.c:416 calendar/gui/event-editor.c:1377
-msgid "FIXME: Insert File..."
-msgstr "Sett inn fil..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/dialogs/task-editor.c:417 calendar/gui/event-editor.c:1378
-msgid "Insert a file as an attachment"
-msgstr "Sett inn en fil som vedlegg"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/demo/addressbook.c:84
-#: addressbook/gui/component/addressbook.c:424
-#: calendar/gui/e-calendar-table.c:375
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:508
-#: mail/folder-browser-factory.c:50 mail/mail-config.glade.h:13
-#: mail/mail-config.glade.h:18 mail/mail-config.glade.h:24
-#: mail/mail-view.c:147
-msgid "Delete"
-msgstr "Slett"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/dialogs/task-editor.c:426 calendar/gui/event-editor.c:1387
-#: calendar/gui/gncal-todo.c:336
-msgid "Delete this item"
-msgstr "Slett denne oppføringen"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/dialogs/task-editor.c:428 calendar/gui/event-editor.c:1389
-msgid "FIXME: Previous"
-msgstr "Forrige"
-
-#: addressbook/contact-editor/e-contact-editor.c:858
-#: calendar/gui/dialogs/task-editor.c:429 calendar/gui/event-editor.c:1390
-msgid "Go to the previous item"
-msgstr "Gå til forrige oppføring"
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/dialogs/task-editor.c:430 calendar/gui/event-editor.c:1391
-msgid "FIXME: Next"
-msgstr "Neste"
-
-#: addressbook/contact-editor/e-contact-editor.c:861
-#: calendar/gui/dialogs/task-editor.c:431 calendar/gui/event-editor.c:1392
-msgid "Go to the next item"
-msgstr "Gå til neste oppføring"
-
-#: addressbook/contact-editor/e-contact-editor.c:864
-#: calendar/gui/dialogs/task-editor.c:432 calendar/gui/event-editor.c:1393
-msgid "FIXME: Help"
-msgstr "Hjelp"
-
-#: addressbook/contact-editor/e-contact-editor.c:865
-#: calendar/gui/dialogs/task-editor.c:433 calendar/gui/event-editor.c:1394
-msgid "See online help"
-msgstr "Se hjelp"
-
-#: addressbook/contact-editor/e-contact-editor.c:1320
-msgid "Assistant"
-msgstr "Assistent"
-
-#: addressbook/contact-editor/e-contact-editor.c:1321
-#: addressbook/contact-editor/e-contact-editor.c:1425
-msgid "Business"
-msgstr "Arbeid"
-
-#: addressbook/contact-editor/e-contact-editor.c:1322
-msgid "Business 2"
-msgstr "Arbeid 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1323
-msgid "Business Fax"
-msgstr "Faks på arbeid"
-
-#: addressbook/contact-editor/e-contact-editor.c:1324
-msgid "Callback"
-msgstr "Tilbakering"
-
-#: addressbook/contact-editor/e-contact-editor.c:1325
-msgid "Car"
-msgstr "Bil"
-
-#: addressbook/contact-editor/e-contact-editor.c:1326
-msgid "Company"
-msgstr "Firma"
-
-#: addressbook/contact-editor/e-contact-editor.c:1327
-#: addressbook/contact-editor/e-contact-editor.c:1426
-msgid "Home"
-msgstr "Hjemme"
-
-#: addressbook/contact-editor/e-contact-editor.c:1328
-msgid "Home 2"
-msgstr "Hjemme 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1329
-msgid "Home Fax"
-msgstr "Faks hjemme"
-
-#: addressbook/contact-editor/e-contact-editor.c:1330
-msgid "ISDN"
-msgstr "ISDN"
-
-#: addressbook/contact-editor/e-contact-editor.c:1331
-msgid "Mobile"
-msgstr "Mobil"
-
-#: addressbook/contact-editor/e-contact-editor.c:1332
-#: addressbook/contact-editor/e-contact-editor.c:1427
-#: mail/mail-config.glade.h:27
-msgid "Other"
-msgstr "Annet"
-
-#: addressbook/contact-editor/e-contact-editor.c:1333
-msgid "Other Fax"
-msgstr "Annen faks"
-
-#: addressbook/contact-editor/e-contact-editor.c:1334
-msgid "Pager"
-msgstr "Personsøker"
-
-#: addressbook/contact-editor/e-contact-editor.c:1335
-msgid "Primary"
-msgstr "Primær"
-
-#: addressbook/contact-editor/e-contact-editor.c:1336
-msgid "Radio"
-msgstr "Radio"
-
-#: addressbook/contact-editor/e-contact-editor.c:1337
-msgid "Telex"
-msgstr "Teleks"
-
-#: addressbook/contact-editor/e-contact-editor.c:1338
-msgid "TTY/TDD"
-msgstr "TTY/TTD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1382
-msgid "Primary Email"
-msgstr "Primær e-post"
-
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Email 2"
-msgstr "E-post 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Email 3"
-msgstr "E-post 3"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:7
-msgid ""
-"Are you sure you want\n"
-"to delete this contact?"
-msgstr ""
-"Er du sikker på at du\n"
-"vil slette denne kontakten?"
-
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:9
-msgid "Delete Contact?"
-msgstr "Slett kontakt?"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "_Legg til"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "Telefontyper"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "Ny telefontype"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91 mail/mail-config.glade.h:11
-#: mail/mail-config.glade.h:16 mail/mail-config.glade.h:22
-msgid "Add"
-msgstr "Legg til"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "Kontaktredigering"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr ":Fullt navn..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "Lagre som:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Hjemmeside-adresse:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "Vil motta _HTML e-post"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Adresse:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "Ar_beid"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "_Hjemme"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "_Faks på arbeid"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "_Mobil"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "A_rbeid"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "De_tte er postadressen"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "K_ontakter..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:26
-msgid "Ca_tegories..."
-msgstr "Ka_tegorier..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr "_Jobbtittel:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "_Firma:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:18
-msgid "General"
-msgstr "Generell"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "Av_deling:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "Kont_or:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "_Yrke:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "Kalle_navn:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr "Ekte_felle:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "Fø_dselsdag:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr "Assistents navn"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "_Leders navn:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "Br_yllupsdag:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "No_tater:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:33
-msgid "Details"
-msgstr "Detaljer"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "Sjekk fullt navn:"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "_Tittel:"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "_Fornavn:"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "_Mellomnavn:"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "_Etternavn:"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "_Suffiks:"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Hr.\n"
-"Fru.\n"
-"Dr.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-
-#: addressbook/demo/addressbook.c:78
-#: addressbook/gui/component/addressbook.c:418
-#: calendar/gui/calendar-commands.c:511 notes/component-factory.c:27
-msgid "New"
-msgstr "Ny"
-
-#: addressbook/demo/addressbook.c:78
-#: addressbook/gui/component/addressbook.c:418
-msgid "Create a new contact"
-msgstr "Opprett en ny kontakt"
-
-#: addressbook/demo/addressbook.c:82
-#: addressbook/gui/component/addressbook.c:422
-msgid "Find"
-msgstr "Finn"
-
-#: addressbook/demo/addressbook.c:82
-#: addressbook/gui/component/addressbook.c:422
-msgid "Find a contact"
-msgstr "Finn en kontakt"
-
-#: addressbook/demo/addressbook.c:83
-#: addressbook/gui/component/addressbook.c:423
-#: calendar/gui/calendar-commands.c:516 mail/folder-browser-factory.c:48
-#: mail/mail-view.c:145
-msgid "Print"
-msgstr "Skriv ut"
-
-#: addressbook/demo/addressbook.c:83
-#: addressbook/gui/component/addressbook.c:423
-msgid "Print contacts"
-msgstr "Skriv ut kontakter"
-
-#: addressbook/demo/addressbook.c:84
-#: addressbook/gui/component/addressbook.c:424
-msgid "Delete a contact"
-msgstr "Slett en kontakt"
-
-#: addressbook/demo/addressbook.c:103
-#: addressbook/gui/component/addressbook.c:509
-msgid "_New Contact"
-msgstr "_Ny kontakt"
-
-#: addressbook/gui/component/addressbook.c:492
-msgid "_Print Contacts..."
-msgstr "_Skriv ut kontakter..."
-
-#: addressbook/gui/component/addressbook.c:502
-#: addressbook/gui/component/addressbook.c:972
-msgid "As _Table"
-msgstr "Som _tabell"
-
-#: addressbook/gui/component/addressbook.c:517
-msgid "N_ew Directory Server"
-msgstr "N_y katalogtjener"
-
-#: addressbook/gui/component/addressbook.c:600
-msgid "Unable to open addressbook"
-msgstr "Kunne ikke åpne adresseboken"
-
-#: addressbook/gui/component/addressbook.c:605
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-"Kunne ikke åpne denne adresseboken. Dette beyr at du\n"
-"har skrevet inn en ugyldig URI, eller at du har forsøkt\n"
-"å aksessere en LDAP-tjener og ikke har støtte for LDAP\n"
-"kompilert inn. Hvis du skrev inn en URI, vær vennlig\n"
-"og sjekk om denne er korrekt, og skriv den inn på nytt.\n"
-"Hvis ikke har du sannsynligvis forsøkt å bruke en LDAP-\n"
-"tjener. Hvis du ønsker å bruke LDAP må du laste ned og\n"
-"installere OpenLDAP, deretter må du kompilere og\n"
-"installere Evolution på nytt.\n"
-
-#: addressbook/gui/component/addressbook.c:876
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr "Lagre som VCard"
-
-#: addressbook/gui/component/addressbook.c:943
-msgid "* Click here to add a contact *"
-msgstr "* Klikk her for å legge til en kontakt *"
-
-#: addressbook/gui/component/addressbook.c:979
-msgid "As _Minicards"
-msgstr "Som _minikort"
-
-#: addressbook/gui/component/addressbook.c:1030
-msgid "The URI that the Folder Browser will display"
-msgstr "URIen som mappeutforskeren vil vise"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "vindu2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "k"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#: addressbook/gui/component/e-ldap-storage.c:88
-msgid "External Directories"
-msgstr "Eksterne kataloger"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "Beskrivelse:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "LDAP-tjener:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Portnummer:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr "Rot DN:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Navn:"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/select-names/select-names.glade.h:7
-msgid "Select Names"
-msgstr "Velg navn"
-
-#: addressbook/gui/component/select-names/select-names.glade.h:8
-msgid "Find..."
-msgstr "Finn..."
-
-#: addressbook/gui/component/select-names/select-names.glade.h:9
-msgid "Select name from List:"
-msgstr "Velg navn fra liste:"
-
-#: addressbook/gui/component/select-names/select-names.glade.h:10
-msgid "Message Recipients"
-msgstr "Meldingsmottakere:"
-
-#: addressbook/gui/minicard/e-minicard-control.c:276
-msgid "Save in addressbook"
-msgstr "Lagre i adressebok"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"Ingen oppføringer i denne visningen\n"
-"\n"
-"Dobbelklikk her for å opprette en ny kontakt."
-
-#: addressbook/gui/minicard/test-minicard-view.c:100
-msgid "Reflow Test"
-msgstr "Test av \"reflow\""
-
-#: addressbook/gui/minicard/test-minicard-view.c:101
-msgid "Copyright (C) 2000, Helix Code, Inc."
-msgstr "Copyright (C) 2000, Helix Code, Inc."
-
-#: addressbook/gui/minicard/test-minicard-view.c:103
-msgid "This should test the reflow canvas item"
-msgstr "Dette tester \"canvas-funksjonen \"reflow\""
-
-#. gtk_signal_connect(fb->search_entry, "changed", search_activate, fb);
-#: addressbook/gui/search/e-addressbook-search-dialog.c:127
-#: mail/folder-browser.c:349
-msgid "Search"
-msgstr "Søk"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "Sideoppsett"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Stilnavn:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "Forhåndsvis:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "Alternativer"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Inkluder:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "Seksjoner:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr "Rett etter hverandre"
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr "Bokstavfaner på siden"
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "Topptekst for hver bokstav"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "Start på en ny side"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Antall kolonner:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "Blanke skjema på slutten:"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "Skrifttyper"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "Skrifttype..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "Topptekster"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "Kropp"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "Skyggelegging"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "Skriv ut med gråtoner"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "Format"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Papir"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Type:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr "etikett26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Dimensjoner:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Bredde:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Høyde:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "Papirkilde:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "Marger"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Topp:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Bunn:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Venstre:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Høyre:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "Side"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Størrelse:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Orientering"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "Portrett"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "Landskap"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "Topptekst"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "Bunntekst:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "Motsatt på like sider"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "Topp-/bunntekst"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:596
-msgid "am"
-msgstr "am"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:595
-msgid "pm"
-msgstr "pm"
-
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:146
-msgid "Gpilotd calendar conduit"
-msgstr "Gpilotd kalenderkomponent"
-
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:149
-msgid "Configuration utility for the calendar conduit.\n"
-msgstr "Konfigurasjonsverktøy for kalenderkomponenten.\n"
-
-#: calendar/conduits/calendar/calendar-conduit.c:399
-#: calendar/conduits/calendar/calendar-conduit.c:1109
-#: calendar/conduits/todo/todo-conduit.c:443
-#: calendar/conduits/todo/todo-conduit.c:1025
-msgid "Error while communicating with calendar server"
-msgstr "Feil under kommunikasjon med kalendertjeneren"
-
-#: calendar/conduits/calendar/calendar-conduit.c:776
-#: calendar/conduits/calendar/calendar-conduit.c:778
-#: calendar/conduits/todo/todo-conduit.c:707
-#: calendar/conduits/todo/todo-conduit.c:709
-msgid "Could not start gnomecal server"
-msgstr "Kunne ikke starte gnomecal-tjeneren"
-
-#: calendar/conduits/calendar/calendar-conduit.c:806
-#: calendar/conduits/calendar/calendar-conduit.c:809
-msgid "Could not read pilot's DateBook application block"
-msgstr "Kunne ikke lese pilotens DateBook applikasjonsblokk"
-
-#: calendar/conduits/todo/todo-conduit-control-applet.c:146
-msgid "Gpilotd todo conduit"
-msgstr "Gpilotd oppgavelistekomponent"
-
-#: calendar/conduits/todo/todo-conduit-control-applet.c:149
-msgid "Configuration utility for the todo conduit.\n"
-msgstr "Konfigurasjonsverktøy for oppgavelistekomponenten.\n"
-
-#: calendar/conduits/todo/todo-conduit.c:737
-#: calendar/conduits/todo/todo-conduit.c:740
-msgid "Could not read pilot's ToDo application block"
-msgstr "Kunne ikke lese pilotens applikasjonsblokk for oppgaveliste"
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Outline:"
-msgstr "Omriss:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Headings:"
-msgstr "Topptekster:"
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Empty days:"
-msgstr "Tomme dager:"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Appointments:"
-msgstr "Avtaler:"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "Highlighted day:"
-msgstr "Merket dag:"
-
-#: calendar/gui/calendar-commands.c:64
-msgid "Day numbers:"
-msgstr "Dagnummer:"
-
-#: calendar/gui/calendar-commands.c:65
-msgid "Current day's number:"
-msgstr "Nummer for idag:"
-
-#: calendar/gui/calendar-commands.c:66
-msgid "To-Do item that is not yet due:"
-msgstr "Oppgavelisteoppføring som ikke har gått ut ennå:"
-
-#: calendar/gui/calendar-commands.c:67
-msgid "To-Do item that is due today:"
-msgstr "Oppgavelisteoppføring som går ut idag:"
-
-#: calendar/gui/calendar-commands.c:68
-msgid "To-Do item that is overdue:"
-msgstr "Oppgavelisteoppføring som har gått ut:"
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr "GNOME kalender"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "GNOME's personlige kalender og tidsplanlegger."
-
-#: calendar/gui/calendar-commands.c:401 tests/ui-tests/message-browser.c:676
-msgid "File not found"
-msgstr "Fil ikke funnet"
-
-#: calendar/gui/calendar-commands.c:423
-msgid "Open calendar"
-msgstr "Åpne kalender"
-
-#: calendar/gui/calendar-commands.c:462
-msgid "Save calendar"
-msgstr "Lagre kalender"
-
-#: calendar/gui/calendar-commands.c:489 calendar/gui/gncal-todo.c:722
-#: calendar/gui/gncal-todo.c:726
-msgid "Day"
-msgstr "Dag"
-
-#: calendar/gui/calendar-commands.c:489
-msgid "Show 1 day"
-msgstr "Vis 1 dag"
-
-#: calendar/gui/calendar-commands.c:492
-msgid "5 Days"
-msgstr "5 dager"
-
-#: calendar/gui/calendar-commands.c:492
-msgid "Show the working week"
-msgstr "Vis arbeidsuken"
-
-#: calendar/gui/calendar-commands.c:495 calendar/gui/gncal-todo.c:721
-msgid "Week"
-msgstr "Uke"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Show 1 week"
-msgstr "Vis 1 uke"
-
-#: calendar/gui/calendar-commands.c:498
-msgid "Month"
-msgstr "Måned"
-
-#: calendar/gui/calendar-commands.c:498
-msgid "Show 1 month"
-msgstr "Vis 1 måned"
-
-#: calendar/gui/calendar-commands.c:502
-msgid "Year"
-msgstr "År"
-
-#: calendar/gui/calendar-commands.c:502
-msgid "Show 1 year"
-msgstr "Vis 1 år"
-
-#: calendar/gui/calendar-commands.c:511 calendar/gui/calendar-commands.c:663
-msgid "Create a new appointment"
-msgstr "Opprett en ny avtale"
-
-#: calendar/gui/calendar-commands.c:516 calendar/gui/calendar-commands.c:655
-msgid "Print this calendar"
-msgstr "Skriv ut denne kalenderen"
-
-#: calendar/gui/calendar-commands.c:520
-msgid "Prev"
-msgstr "Forrige"
-
-#: calendar/gui/calendar-commands.c:520
-msgid "Go back in time"
-msgstr "Gå tilbake i tid"
-
-#: calendar/gui/calendar-commands.c:521
-msgid "Today"
-msgstr "Idag"
-
-#: calendar/gui/calendar-commands.c:521
-msgid "Go to present time"
-msgstr "Gå til nåtiden"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Next"
-msgstr "Neste"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Go forward in time"
-msgstr "Gå frem i tid"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Go to"
-msgstr "Gå til"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Go to a specific date"
-msgstr "Gå til en spesifikk dato"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:640
-msgid "New Ca_lendar"
-msgstr "Ny ka_lenderen"
-
-#: calendar/gui/calendar-commands.c:641
-msgid "Create a new calendar"
-msgstr "Opprett en ny kalender"
-
-#: calendar/gui/calendar-commands.c:644
-msgid "Open Ca_lendar"
-msgstr "Åpne ka_lender"
-
-#: calendar/gui/calendar-commands.c:645
-msgid "Open a calendar"
-msgstr "Åpne en kalender"
-
-#: calendar/gui/calendar-commands.c:649 calendar/gui/calendar-commands.c:650
-msgid "Save Calendar As"
-msgstr "Lagre kalender som"
-
-#: calendar/gui/calendar-commands.c:663
-msgid "_New appointment..."
-msgstr "_Ny avtale..."
-
-#: calendar/gui/calendar-commands.c:671 calendar/gui/prop.c:716
-msgid "Preferences"
-msgstr "Brukervalg"
-
-#: calendar/gui/calendar-commands.c:678 calendar/gui/calendar-commands.c:679
-msgid "About Calendar"
-msgstr "Om kalender"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:721
-#, c-format
-msgid "%s%s"
-msgstr "%s%s"
-
-#: calendar/gui/calendar-commands.c:721
-msgid "'s calendar"
-msgstr "sin kalender"
-
-#: calendar/gui/calendar-model.c:323
-msgid "Public"
-msgstr "Offentlig"
-
-#: calendar/gui/calendar-model.c:326
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:27
-msgid "Private"
-msgstr "Privat"
-
-#: calendar/gui/calendar-model.c:329
-msgid "Confidential"
-msgstr "Konfidensiell"
-
-#: calendar/gui/calendar-model.c:332 calendar/gui/calendar-model.c:499
-msgid "Unknown"
-msgstr "Ukjent"
-
-#: calendar/gui/calendar-model.c:419
-msgid "N"
-msgstr "N"
-
-#: calendar/gui/calendar-model.c:419
-msgid "S"
-msgstr "S"
-
-#: calendar/gui/calendar-model.c:421
-msgid "E"
-msgstr "Ø"
-
-#: calendar/gui/calendar-model.c:421
-msgid "W"
-msgstr "V"
-
-#: calendar/gui/calendar-model.c:493
-msgid "Transparent"
-msgstr "Gjennomsiktig"
-
-#: calendar/gui/calendar-model.c:496
-msgid "Opaque"
-msgstr "Ugjennomsiktig"
-
-#: calendar/gui/calendar-model.c:747
-#, c-format
-msgid ""
-"The date must be entered in the format: \n"
-"\n"
-"%s"
-msgstr ""
-"Datoen må skrives inn på formatet: \n"
-"\n"
-"%s"
-
-#: calendar/gui/calendar-model.c:820
-msgid ""
-"The geographical position must be entered in the format: \n"
-"\n"
-"45.436845,125.862501"
-msgstr ""
-"Den geografiske posisjonen må skrives inn på formatet: \n"
-"\n"
-"45.436845,125.862501"
-
-#: calendar/gui/calendar-model.c:865
-msgid "The percent value must be between 0 and 100"
-msgstr "Prosentverdien må være mellom 0 og 100"
-
-#: calendar/gui/calendar-model.c:898
-msgid "The priority must be between 0 and 10"
-msgstr "Prioriteten må være mellom 0 og 10"
-
-#: calendar/gui/control-factory.c:132
-msgid "The URI that the calendar will display"
-msgstr "URIen som kalenderen skal vise"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:183
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "Alarm på %A %b %d %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:190
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr "Melding om din avtale på %A %b %d %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:201
-msgid "No summary available."
-msgstr "Ingen sammendrag tilgjengelig."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "Lukk"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1070
-msgid "Snooze"
-msgstr "Utsett"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "Rediger avtale:"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr "Utsett-tid (minutter)"
-
-#: calendar/gui/dialogs/task-editor.c:245 calendar/gui/event-editor.c:1198
-msgid "FIXME: _Delete"
-msgstr "_Slett"
-
-#: calendar/gui/dialogs/task-editor.c:287
-#: calendar/gui/dialogs/task-editor.c:295
-msgid "FIXME: In_complete Task"
-msgstr "U_komplett oppgave"
-
-#: calendar/gui/dialogs/task-editor.c:347 calendar/gui/event-editor.c:1300
-msgid "FIXME: Chec_k Names"
-msgstr "Sjek_k navn"
-
-#: calendar/gui/dialogs/task-editor.c:348 calendar/gui/event-editor.c:1301
-msgid "FIXME: Address _Book..."
-msgstr "Addresse_bok..."
-
-#: calendar/gui/dialogs/task-editor.c:355
-msgid "FIXME: _New Task"
-msgstr "_Ny oppgave"
-
-#: calendar/gui/dialogs/task-editor.c:357
-msgid "FIXME: S_end Status Report"
-msgstr "S_end statusrapport"
-
-#: calendar/gui/dialogs/task-editor.c:358
-msgid "FIXME: _Mark Complete"
-msgstr "_Merk som fullført"
-
-#: calendar/gui/dialogs/task-editor.c:360 calendar/gui/event-editor.c:1310
-msgid "FIXME: Rec_urrence..."
-msgstr "Gjentakelse..."
-
-#: calendar/gui/dialogs/task-editor.c:361
-msgid "FIXME: S_kip Occurrence"
-msgstr "Hopp over gjenta_kelse"
-
-#: calendar/gui/dialogs/task-editor.c:363
-msgid "FIXME: Assig_n Task"
-msgstr "Tildel o_ppgave"
-
-#: calendar/gui/dialogs/task-editor.c:365
-msgid "FIXME: _Reply"
-msgstr "Sva_r"
-
-#: calendar/gui/dialogs/task-editor.c:366
-msgid "FIXME: Reply to A_ll"
-msgstr "Svar til a_lle"
-
-#: calendar/gui/dialogs/task-editor.c:409 calendar/gui/event-editor.c:1370
-msgid "FIXME: Save and Close"
-msgstr "Lagre og lukk"
-
-#: calendar/gui/dialogs/task-editor.c:410
-msgid "Save the task and close the dialog box"
-msgstr "Lagre oppgaven og lukk dialogboksen"
-
-#: calendar/gui/dialogs/task-editor.c:414 calendar/gui/event-editor.c:1375
-msgid "FIXME: Print..."
-msgstr "Skriv ut..."
-
-#: calendar/gui/dialogs/task-editor.c:419 calendar/gui/event-editor.c:1380
-msgid "FIXME: Recurrence..."
-msgstr "Gjentakelse..."
-
-#: calendar/gui/dialogs/task-editor.c:420 calendar/gui/event-editor.c:1381
-msgid "Configure recurrence rules"
-msgstr "Konfigurér regler for gjenintrffelse"
-
-#: calendar/gui/dialogs/task-editor.c:422
-msgid "FIXME: Assign Task..."
-msgstr "Tildel oppgave..."
-
-#: calendar/gui/dialogs/task-editor.c:423
-msgid "Assign the task to someone"
-msgstr "Tildel oppgaven til noen"
-
-#: calendar/gui/dialogs/task-editor.c:425 calendar/gui/event-editor.c:1386
-msgid "FIXME: Delete"
-msgstr "Slett"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:7
-msgid "S_ubject:"
-msgstr "E_mne:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:8
-msgid "Owner:"
-msgstr "Eier:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:9
-msgid "Sta_rt Date:"
-msgstr "Sta_rt dato:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:10
-msgid "_Due Date:"
-msgstr "Fer_dig-dato:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:11
-msgid "_Status:"
-msgstr "_Status:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:12
-msgid ""
-"Not Started\n"
-"In Progress\n"
-"Completed\n"
-"Cancelled\n"
-msgstr ""
-"Ikke påbegynt\n"
-"Under arbeid\n"
-"Fullført\n"
-"Avbrutt\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:17
-msgid "Not Started"
-msgstr "Ikke startet"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:18
-msgid "_Priority:"
-msgstr "_Prioritet:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:19
-msgid ""
-"High\n"
-"Normal\n"
-"Low\n"
-msgstr ""
-"Høy\n"
-"Normal\n"
-"Lav\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:23
-msgid "High"
-msgstr "Høy"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:24
-msgid "% Comp_lete:"
-msgstr "% ferdi_g:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:25
-msgid "_Contacts..."
-msgstr "_Kontakter..."
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:28
-msgid "Task"
-msgstr "Oppgave"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:29
-msgid "Date Completed:"
-msgstr "Fullført dato:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:30
-msgid "Location:"
-msgstr "Plassering:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:31
-msgid "URL:"
-msgstr "URL:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:32
-msgid "Resources:"
-msgstr "Ressurser:"
-
-#: calendar/gui/e-calendar-table.c:189
-msgid "Comment"
-msgstr "Kommentar"
-
-#: calendar/gui/e-calendar-table.c:194
-msgid "Completed"
-msgstr "Fullført"
-
-#: calendar/gui/e-calendar-table.c:199
-msgid "Created"
-msgstr "Opprettet"
-
-#: calendar/gui/e-calendar-table.c:204
-msgid "Description"
-msgstr "Beskrivelse"
-
-#: calendar/gui/e-calendar-table.c:209
-msgid "Timestamp"
-msgstr "Tidsmerking"
-
-#: calendar/gui/e-calendar-table.c:214
-msgid "Start Date"
-msgstr "Start-dato"
-
-#: calendar/gui/e-calendar-table.c:219
-msgid "End Date"
-msgstr "Slutt-dato"
-
-#: calendar/gui/e-calendar-table.c:224
-msgid "Geographical Position"
-msgstr "Geografisk plassering"
-
-#: calendar/gui/e-calendar-table.c:229
-msgid "Last Modification Date"
-msgstr "Dato for siste endring"
-
-#: calendar/gui/e-calendar-table.c:234
-msgid "Location"
-msgstr "Plassering"
-
-#: calendar/gui/e-calendar-table.c:239
-msgid "Organizer"
-msgstr "Organiserer"
-
-#: calendar/gui/e-calendar-table.c:244
-msgid "% Complete"
-msgstr "% ferdig"
-
-#: calendar/gui/e-calendar-table.c:249 calendar/gui/gncal-todo.c:436
-#: calendar/gui/prop.c:609 mail/message-list.c:507
-msgid "Priority"
-msgstr "Prioritet"
-
-#: calendar/gui/e-calendar-table.c:260
-msgid "TaskPad"
-msgstr "Oppgaveblokk"
-
-#: calendar/gui/e-calendar-table.c:265
-msgid "URL"
-msgstr "URL"
-
-#: calendar/gui/e-calendar-table.c:270
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "Reminder"
-msgstr "Påminnelse"
-
-#: calendar/gui/e-calendar-table.c:369
-msgid "Open..."
-msgstr "Åpne..."
-
-#: calendar/gui/e-calendar-table.c:370
-msgid "Open the task"
-msgstr "Åpne oppgaven"
-
-#: calendar/gui/e-calendar-table.c:372
-msgid "Mark Complete"
-msgstr "Merk som fullført"
-
-#: calendar/gui/e-calendar-table.c:373
-msgid "Mark the task complete"
-msgstr "Merk oppgaven som fullført"
-
-#: calendar/gui/e-calendar-table.c:376
-msgid "Delete the task"
-msgstr "Slett oppgaven"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr "%02i minutters oppdeling"
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "Ny avtale..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "Redigér denne avtalen..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "Slett denne avtalen"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "Gjør denne avtalen flyttbar"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr "Slett denne oppføringen"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr "Slett alle oppføringer"
-
-#: calendar/gui/event-editor.c:291
-msgid "Edit Appointment"
-msgstr "Rediger avtale"
-
-#: calendar/gui/event-editor.c:296
-msgid "No summary"
-msgstr "Ingen sammendrag"
-
-#: calendar/gui/event-editor.c:300
-#, c-format
-msgid "Appointment - %s"
-msgstr "Avtale - %s"
-
-#: calendar/gui/event-editor.c:303
-#, c-format
-msgid "Task - %s"
-msgstr "Oppgave - %s"
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Journal entry - %s"
-msgstr "Journaloppføring - %s"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:622 calendar/gui/event-editor.c:718
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Ca_lendar..."
-msgstr "Ka_lender..."
-
-#: calendar/gui/event-editor.c:1308
-msgid "FIXME: _New Appointment"
-msgstr "_Ny avtale"
-
-#: calendar/gui/event-editor.c:1312
-msgid "FIXME: Invite _Attendees..."
-msgstr "Invitér _deltakere..."
-
-#: calendar/gui/event-editor.c:1313
-msgid "FIXME: C_ancel Invitation..."
-msgstr "Avlys invitasjon..."
-
-#: calendar/gui/event-editor.c:1315
-msgid "FIXME: Forward as v_Calendar"
-msgstr "Videresend som v_Calendar"
-
-#: calendar/gui/event-editor.c:1383
-msgid "FIXME: Invite Attendees..."
-msgstr "Invitér deltakere..."
-
-#: calendar/gui/event-editor.c:1384
-msgid "Invite attendees to a meeting"
-msgstr "Invitér deltakere til et møte"
-
-#: calendar/gui/event-editor.c:1828
-msgid "%a %b %d %Y"
-msgstr "%a %b %d %Y"
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr "event-editor-dialog"
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr "_Sammendrag:"
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr "_Eier:"
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr "Tid"
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr "Start-tid:"
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr "Slutt-tid:"
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr "Varer he_le dagen"
-
-#: calendar/gui/event-editor-dialog.glade.h:14
-msgid "Classification"
-msgstr "Klassifisering"
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-msgid "Pu_blic"
-msgstr "Of_fentlig"
-
-#: calendar/gui/event-editor-dialog.glade.h:16
-msgid "Pri_vate"
-msgstr "Pri_vat"
-
-#: calendar/gui/event-editor-dialog.glade.h:17
-msgid "_Confidential"
-msgstr "_Konfidensiell"
-
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-"Minutter\n"
-"Timer\n"
-"Dager\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "_Display"
-msgstr "_Vis"
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Audio"
-msgstr "_Lyd"
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "_Program"
-msgstr "_Program"
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "_Mail"
-msgstr "_E-post"
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-msgid "Mail _to:"
-msgstr "Send _til:"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Run program:"
-msgstr "Kjø_r program:"
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr "Regel for gjenintreffelse"
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:875
-msgid "None"
-msgstr "Ingen"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-msgid "Daily"
-msgstr "Daglig"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr "Ukentlig"
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr "Månedlig"
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr "Årlig"
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr "etikett23"
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr "Hver"
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr "dag(er)"
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr "etikett24"
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr "uke(r)"
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "Man"
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "Tir"
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "Ons"
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "Tor"
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "Fre"
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "Lør"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "Søn"
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr "etikett25"
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr "Gjeninntreff den"
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr "de dagen i måneden"
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-"1ste\n"
-"2dre\n"
-"3dje\n"
-"4de\n"
-"5te\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-"Mandag\n"
-"Tirsdag\n"
-"Onsdag\n"
-"Torsdag\n"
-"Fredag\n"
-"Lørdag\n"
-"Søndag\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr "Hver"
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-msgid "month(s)"
-msgstr "måned(er)"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr "år"
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr "etikett27"
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr "Sluttdato"
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr "Gjenta for alltid"
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr "Slutt på "
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr "Slutt etter"
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr "gjentakelser"
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-msgid "Exceptions"
-msgstr "Unntak"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-msgid "Change"
-msgstr "Endre"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr "Gjeninntreffelse"
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "januar"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "februar"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "mars"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "april"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "mai"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "juni"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "juli"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "august"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "september"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "sept"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "oktober"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "november"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "desember"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "søndag"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "mandag"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "tirsdag"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "tirs"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "onsdag"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "ons"
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "torsdag"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "tor"
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "tors"
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "fredag"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "lørdag"
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr "år"
-
-#: calendar/gui/getdate.y:421
-msgid "month"
-msgstr "måned"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr "14-dager"
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr "uke"
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr "dag"
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr "time"
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr "minutt"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "min"
-
-#: calendar/gui/getdate.y:428
-msgid "second"
-msgstr "sekund"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "sek"
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "imorgen"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "igår"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "idag"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr "nå"
-
-#: calendar/gui/getdate.y:439
-msgid "last"
-msgstr "forrige"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr "denne"
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr "neste"
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr "første"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr "tredje"
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr "fjerde"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr "femte"
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr "sjette"
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr "syvende"
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr "åttende"
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr "niende"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr "tiende"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr "ellevte"
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr "tolvte"
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr "siden"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Create to-do item"
-msgstr "Opprett opgavelisteoppføring"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Edit to-do item"
-msgstr "Redigér oppgavelisteoppføring"
-
-#: calendar/gui/gncal-todo.c:176
-msgid "Summary:"
-msgstr "Sammendrag:"
-
-#: calendar/gui/gncal-todo.c:186
-msgid "Due Date:"
-msgstr "Ferdig-dato:"
-
-#: calendar/gui/gncal-todo.c:195
-msgid "Priority:"
-msgstr "Prioritet:"
-
-#: calendar/gui/gncal-todo.c:212
-msgid "Item Comments:"
-msgstr "Kommentarer for oppføring:"
-
-#: calendar/gui/gncal-todo.c:334
-msgid "Add to-do item..."
-msgstr "Legg til oppgavelisteoppføring..."
-
-#: calendar/gui/gncal-todo.c:335
-msgid "Edit this item..."
-msgstr "Redigér denne oppføringen..."
-
-#: calendar/gui/gncal-todo.c:434
-msgid "Summary"
-msgstr "Sammendrag"
-
-#: calendar/gui/gncal-todo.c:435 calendar/gui/prop.c:608
-msgid "Due Date"
-msgstr "Ferdig-dato"
-
-#: calendar/gui/gncal-todo.c:437
-msgid "Time Left"
-msgstr "Gjenstående tid"
-
-#. Label
-#: calendar/gui/gncal-todo.c:449
-msgid "To-do list"
-msgstr "Oppgaveliste"
-
-#. Add
-#: calendar/gui/gncal-todo.c:488
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Legg til..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:497
-msgid "Edit..."
-msgstr "Redigér..."
-
-#: calendar/gui/gncal-todo.c:721
-msgid "Weeks"
-msgstr "Uker"
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Days"
-msgstr "Dager"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hours"
-msgstr "Timer"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hour"
-msgstr "Time"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minutes"
-msgstr "Minutter"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minute"
-msgstr "Minutt"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Seconds"
-msgstr "Sekunder"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Second"
-msgstr "Send"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1078
-#: calendar/gui/gnome-cal.c:1134
-msgid "Reminder of your appointment at "
-msgstr "Påminnelse om din avtale "
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1083 calendar/gui/gnome-cal.c:1138
-msgid "Ok"
-msgstr "Ok"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "År:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "Gå til dato"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-"Vennligst velg datoen du vil gå til.\n"
-"Når du klikker på en dag vil du flytte\n"
-"deg til denne datoen."
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "Gå til idag"
-
-#: calendar/gui/print.c:288
-msgid "1st"
-msgstr "1"
-
-#: calendar/gui/print.c:288
-msgid "2nd"
-msgstr "2"
-
-#: calendar/gui/print.c:288
-msgid "3rd"
-msgstr "3"
-
-#: calendar/gui/print.c:288
-msgid "4th"
-msgstr "4"
-
-#: calendar/gui/print.c:288
-msgid "5th"
-msgstr "5"
-
-#: calendar/gui/print.c:289
-msgid "6th"
-msgstr "6"
-
-#: calendar/gui/print.c:289
-msgid "7th"
-msgstr "7"
-
-#: calendar/gui/print.c:289
-msgid "8th"
-msgstr "8"
-
-#: calendar/gui/print.c:289
-msgid "9th"
-msgstr "9"
-
-#: calendar/gui/print.c:289
-msgid "10th"
-msgstr "10"
-
-#: calendar/gui/print.c:290
-msgid "11th"
-msgstr "11"
-
-#: calendar/gui/print.c:290
-msgid "12th"
-msgstr "12"
-
-#: calendar/gui/print.c:290
-msgid "13th"
-msgstr "13"
-
-#: calendar/gui/print.c:290
-msgid "14th"
-msgstr "14"
-
-#: calendar/gui/print.c:290
-msgid "15th"
-msgstr "15"
-
-#: calendar/gui/print.c:291
-msgid "16th"
-msgstr "16"
-
-#: calendar/gui/print.c:291
-msgid "17th"
-msgstr "17"
-
-#: calendar/gui/print.c:291
-msgid "18th"
-msgstr "18"
-
-#: calendar/gui/print.c:291
-msgid "19th"
-msgstr "19"
-
-#: calendar/gui/print.c:291
-msgid "20th"
-msgstr "20"
-
-#: calendar/gui/print.c:292
-msgid "21st"
-msgstr "21"
-
-#: calendar/gui/print.c:292
-msgid "22nd"
-msgstr "22"
-
-#: calendar/gui/print.c:292
-msgid "23rd"
-msgstr "23"
-
-#: calendar/gui/print.c:292
-msgid "24th"
-msgstr "24"
-
-#: calendar/gui/print.c:292
-msgid "25th"
-msgstr "25"
-
-#: calendar/gui/print.c:293
-msgid "26th"
-msgstr "26"
-
-#: calendar/gui/print.c:293
-msgid "27th"
-msgstr "27"
-
-#: calendar/gui/print.c:293
-msgid "28th"
-msgstr "28"
-
-#: calendar/gui/print.c:293
-msgid "29th"
-msgstr "29"
-
-#: calendar/gui/print.c:293
-msgid "30th"
-msgstr "30"
-
-#: calendar/gui/print.c:294
-msgid "31st"
-msgstr "31"
-
-#: calendar/gui/print.c:349
-msgid "Su"
-msgstr "Søn"
-
-#: calendar/gui/print.c:349
-msgid "Mo"
-msgstr "Man"
-
-#: calendar/gui/print.c:349
-msgid "Tu"
-msgstr "Tir"
-
-#: calendar/gui/print.c:349
-msgid "We"
-msgstr "Ons"
-
-#: calendar/gui/print.c:349
-msgid "Th"
-msgstr "Tor"
-
-#: calendar/gui/print.c:349
-msgid "Fr"
-msgstr "Fre"
-
-#: calendar/gui/print.c:349
-msgid "Sa"
-msgstr "Lør"
-
-#: calendar/gui/print.c:937
-msgid "TODO Items"
-msgstr "Oppgavelisteoppføringer"
-
-#. Day
-#: calendar/gui/print.c:1038
-msgid "Current day (%a %b %d %Y)"
-msgstr "I dag (%a %b %d %Y)"
-
-#: calendar/gui/print.c:1058 calendar/gui/print.c:1072
-#: calendar/gui/print.c:1073
-msgid "%a"
-msgstr "%a"
-
-#: calendar/gui/print.c:1059 calendar/gui/print.c:1060
-#: calendar/gui/print.c:1074 calendar/gui/print.c:1075
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1062
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "Denne uken (%s %s %d - %s %d %d)"
-
-#: calendar/gui/print.c:1079
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "Denne uken (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1085
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "Denne uken (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1098
-msgid "Current month (%a %Y)"
-msgstr "Denne måneden (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1105
-msgid "Current year (%Y)"
-msgstr "Dette året (%Y)"
-
-#: calendar/gui/print.c:1142
-msgid "Print Calendar"
-msgstr "Skriv ut kalender"
-
-#: calendar/gui/print.c:1307
-msgid "Print Preview"
-msgstr "Forhåndsvisning av utskrift"
-
-#: calendar/gui/prop.c:334
-msgid "Time display"
-msgstr "Tidsvisning"
-
-#. Time format
-#: calendar/gui/prop.c:338
-msgid "Time format"
-msgstr "Tidsformat"
-
-#: calendar/gui/prop.c:339
-msgid "12-hour (AM/PM)"
-msgstr "12 timer (AM/PM)"
-
-#: calendar/gui/prop.c:340
-msgid "24-hour"
-msgstr "24 timer"
-
-#. Weeks start on
-#: calendar/gui/prop.c:350
-msgid "Weeks start on"
-msgstr "Uken starter på"
-
-#: calendar/gui/prop.c:351
-msgid "Sunday"
-msgstr "Søndag"
-
-#: calendar/gui/prop.c:352
-msgid "Monday"
-msgstr "Mandag"
-
-#. Day range
-#: calendar/gui/prop.c:362
-msgid "Day range"
-msgstr "Dagområde"
-
-#: calendar/gui/prop.c:373
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-"Vennligst velg start og slutt-tidene du ønsker\n"
-"at skal vises i dagvisningen og ukevisningen.\n"
-"Tider utenfor dette området vil ikke vises\n"
-"som standard."
-
-#: calendar/gui/prop.c:389
-msgid "Day start:"
-msgstr "Dagens start:"
-
-#: calendar/gui/prop.c:400
-msgid "Day end:"
-msgstr "Dagens slutt:"
-
-#: calendar/gui/prop.c:523
-msgid "Colors for display"
-msgstr "Farger i visning"
-
-#: calendar/gui/prop.c:526
-msgid "Colors"
-msgstr "Farger"
-
-#: calendar/gui/prop.c:603
-msgid "Show on TODO List:"
-msgstr "Vis på oppgavelisten:"
-
-#: calendar/gui/prop.c:610
-msgid "Time Until Due"
-msgstr "Tid før den går ut"
-
-#: calendar/gui/prop.c:641
-msgid "To Do List style options:"
-msgstr "Alternativer for stil for oppgaveliste:"
-
-#: calendar/gui/prop.c:646
-msgid "Highlight overdue items"
-msgstr "Merk utgåtte oppføringer"
-
-#: calendar/gui/prop.c:649
-msgid "Highlight not yet due items"
-msgstr "Merk oppføringer som ikke har gått ut"
-
-#: calendar/gui/prop.c:652
-msgid "Highlight items due today"
-msgstr "Merk oppføringer som går ut idag"
-
-#: calendar/gui/prop.c:682
-msgid "To Do List Properties"
-msgstr "Egenskaper for oppgaveliste"
-
-#: calendar/gui/prop.c:685
-msgid "To Do List"
-msgstr "Oppgaveliste"
-
-#: calendar/gui/prop.c:784
-msgid "Alarms"
-msgstr "Alarmer"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:787
-msgid "Alarm Properties"
-msgstr "Egenskaper for alarmer"
-
-#: calendar/gui/prop.c:797
-msgid "Beep on display alarms"
-msgstr "Pip ved visning av alarmer"
-
-#: calendar/gui/prop.c:807
-msgid "Audio alarms timeout after"
-msgstr "Tidsavbrudd for lydalarmer"
-
-#: calendar/gui/prop.c:818 calendar/gui/prop.c:835
-msgid " seconds"
-msgstr " sekunder"
-
-#: calendar/gui/prop.c:824
-msgid "Enable snoozing for "
-msgstr "Slå på utsetting for "
-
-#. populate default frame/box
-#: calendar/gui/prop.c:840
-msgid "Defaults"
-msgstr "Forvalg"
-
-#: composer/e-msg-composer-address-dialog.c:182
-msgid "Cut"
-msgstr "Klipp ut"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut selected item into clipboard"
-msgstr "Klipp ut valgt oppføring til utklippstavlen"
-
-#: composer/e-msg-composer-address-dialog.c:186
-#: mail/folder-browser-factory.c:46
-msgid "Copy"
-msgstr "Kopiér"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy selected item into clipboard"
-msgstr "Kopiér valgt oppføring til utklippstavlen"
-
-#: composer/e-msg-composer-address-dialog.c:190
-#: composer/e-msg-composer-address-dialog.c:198
-msgid "Paste"
-msgstr "Lim inn"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste item from clipboard"
-msgstr "Lim inn fra utklippstavlen"
-
-#: composer/e-msg-composer-address-dialog.c:525
-msgid "Select recipients' addresses"
-msgstr "Velg mottakerenes adresser"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Mottakerliste:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Søk..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Navn"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-#: mail/mail-config.glade.h:8
-msgid "Address"
-msgstr "Adresse"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Egenskaper..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "Til: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "etikett9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "etikett7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "etikett8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bytes"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Legg til vedlegg"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Fjern"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Fjern valgte oppføringer fra vedleggslisten"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Legg til vedlegg..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Legg en fil ved meldingen"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "Egenskaper for vedlegg"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "MIME-type:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "Filnavn:"
-
-#: composer/e-msg-composer-hdrs.c:137 composer/e-msg-composer-hdrs.c:295
-msgid "From:"
-msgstr "Fra:"
-
-#: composer/e-msg-composer-hdrs.c:243
-msgid "Click here for the address book"
-msgstr "Klikk her for å få opp adresseboken"
-
-#: composer/e-msg-composer-hdrs.c:296
-msgid "Enter the identitiy you wish to send this message from"
-msgstr "Skriv inn identitet for avsender av denne meldingen"
-
-#: composer/e-msg-composer-hdrs.c:300
-msgid "To:"
-msgstr "Til:"
-
-#: composer/e-msg-composer-hdrs.c:301
-msgid "Enter the recipients of the message"
-msgstr "Skriv inn mottakerene for meldingen"
-
-#: composer/e-msg-composer-hdrs.c:305
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:306
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Skriv inn adressene som skal motta en kopi av meldingen"
-
-#: composer/e-msg-composer-hdrs.c:311
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:312
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Skriv inn adressene som skal motta en kopi av meldingen uten å komme til "
-"syne i mottakerlisten for meldingen."
-
-#: composer/e-msg-composer-hdrs.c:318
-msgid "Subject:"
-msgstr "Emne:"
-
-#: composer/e-msg-composer-hdrs.c:319
-msgid "Enter the subject of the mail"
-msgstr "Skriv inn emnet for meldingen"
-
-#: composer/e-msg-composer.c:451
-msgid "Save as..."
-msgstr "Lagre som..."
-
-#: composer/e-msg-composer.c:462
-#, c-format
-msgid "Error saving file: %s"
-msgstr "Feil under lagring av fil: %s"
-
-#: composer/e-msg-composer.c:482
-#, c-format
-msgid "Error loading file: %s"
-msgstr "Feil under lasting av fil: %s"
-
-#: composer/e-msg-composer.c:504
-msgid "Saving changes to message..."
-msgstr "Lagre endringer i meldingen..."
-
-#: composer/e-msg-composer.c:506
-msgid "About to save changes to message..."
-msgstr "Lagrer endringer til meldingen..."
-
-#: composer/e-msg-composer.c:590 shell/e-shell-view-menu.c:165
-msgid "Evolution"
-msgstr "Evolution"
-
-#: composer/e-msg-composer.c:596
-msgid ""
-"This message has not been sent.\n"
-"\n"
-"Do you wish to save your changes?"
-msgstr ""
-"Denne meldingen er ikke sendt.\n"
-"\n"
-"Vil du lagre endringene?"
-
-#: composer/e-msg-composer.c:618
-msgid "Open file"
-msgstr "Åpne fil"
-
-#: composer/e-msg-composer.c:730
-msgid "That file does not exist."
-msgstr "Filen eksisterer ikke."
-
-#: composer/e-msg-composer.c:740
-msgid "That is not a regular file."
-msgstr "Er ikke en vanlig fil."
-
-#: composer/e-msg-composer.c:750
-msgid "That file exists but is not readable."
-msgstr "Filen eksisterer men er ikke lesbar."
-
-#: composer/e-msg-composer.c:760
-msgid "That file appeared accesible but open(2) failed."
-msgstr "Filen ser ut til å være tilgjengelig men open(2) feilet."
-
-#: composer/e-msg-composer.c:782
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"File en meget stor (mer enn 100K).\n"
-"Er du sikker på at du vil sette den inn?"
-
-#: composer/e-msg-composer.c:803
-msgid "An error occurred while reading the file."
-msgstr "En feil oppsto under lesing fra filen."
-
-#: composer/e-msg-composer.c:899 shell/e-shell-view-menu.c:434
-msgid "_File"
-msgstr "_Fil"
-
-#: composer/e-msg-composer.c:905
-msgid "_Open..."
-msgstr "_Åpne..."
-
-#: composer/e-msg-composer.c:906
-msgid "Load a previously saved message"
-msgstr "Les en tidligere lagret melding"
-
-#: composer/e-msg-composer.c:914
-msgid "_Save..."
-msgstr "_Lagre..."
-
-#: composer/e-msg-composer.c:915
-msgid "Save message"
-msgstr "Send melding"
-
-#: composer/e-msg-composer.c:923
-msgid "_Save as..."
-msgstr "Lagre _som..."
-
-#: composer/e-msg-composer.c:924
-msgid "Save message with a different name"
-msgstr "Lagre meldingen med et nytt navn"
-
-#: composer/e-msg-composer.c:932
-msgid "Save in _folder..."
-msgstr "Lagre i _mappe..."
-
-#: composer/e-msg-composer.c:933
-msgid "Save the message in a specified folder"
-msgstr "Lagre meldingen i en spesifisert mappe"
-
-#: composer/e-msg-composer.c:942
-msgid "_Insert text file... (FIXME)"
-msgstr "Sett _inn tekstfil..."
-
-#: composer/e-msg-composer.c:943
-msgid "Insert a file as text into the message"
-msgstr "Sett inn en tekstfil i meldingen"
-
-#: composer/e-msg-composer.c:952
-msgid "_Send"
-msgstr "_Send"
-
-#: composer/e-msg-composer.c:953
-msgid "Send the message"
-msgstr "Send meldingen"
-
-#: composer/e-msg-composer.c:963
-msgid "_Close..."
-msgstr "L_ukk..."
-
-#: composer/e-msg-composer.c:964
-msgid "Quit the message composer"
-msgstr "Avslutt meldingsredigering"
-
-#: composer/e-msg-composer.c:977 shell/e-shell-view-menu.c:478
-msgid "_Edit"
-msgstr "R_edigér"
-
-#: composer/e-msg-composer.c:988
-msgid "_Format"
-msgstr "_Formatér"
-
-#: composer/e-msg-composer.c:994
-msgid "HTML"
-msgstr "HTML"
-
-#: composer/e-msg-composer.c:995
-msgid "Send the mail in HTML format"
-msgstr "Send meldingen i HTML-format"
-
-#: composer/e-msg-composer.c:1008 shell/e-shell-view-menu.c:383
-#: shell/e-shell-view-menu.c:489 shell/e-storage-set-view.c:242
-msgid "_View"
-msgstr "_Vis"
-
-#: composer/e-msg-composer.c:1014
-msgid "Show _attachments"
-msgstr "Vis _vedlegg"
-
-#: composer/e-msg-composer.c:1015
-msgid "Show/hide attachments"
-msgstr "Vis/skjul vedlegg"
-
-#: composer/e-msg-composer.c:1048
-msgid "Send"
-msgstr "Send"
-
-#: composer/e-msg-composer.c:1049
-msgid "Send this message"
-msgstr "Send denne meldingen"
-
-#: composer/e-msg-composer.c:1058
-msgid "Attach"
-msgstr "Legg ved"
-
-#: composer/e-msg-composer.c:1059
-msgid "Attach a file"
-msgstr "Legg ved en fil"
-
-#: composer/e-msg-composer.c:1246
-msgid "Compose a message"
-msgstr "Skriv en melding"
-
-#: filter/filter-folder.c:183 filter/vfolder-rule.c:269
-msgid "Select Folder"
-msgstr "Velg mappe"
-
-#: filter/filter-folder.c:245
-msgid "<click here to select a folder>"
-msgstr "<klikk her for å velge en mappe>"
-
-#: mail/component-factory.c:187
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Kan ikke initialisere Evolutions e-postkomponent."
-
-#: mail/folder-browser-factory.c:33
-msgid "Get mail"
-msgstr "Hent e-post"
-
-#: mail/folder-browser-factory.c:33
-msgid "Check for new mail"
-msgstr "Sjekk etter ny e-post"
-
-#: mail/folder-browser-factory.c:34
-msgid "Compose"
-msgstr "Skriv"
-
-#: mail/folder-browser-factory.c:34
-msgid "Compose a new message"
-msgstr "Skriv en ny melding"
-
-#. GNOMEUIINFO_ITEM_STOCK (N_("Save"), N_("Save this message"),
-#. save_msg, GNOME_STOCK_PIXMAP_SAVE),
-#: mail/folder-browser-factory.c:38 mail/mail-view.c:135
-msgid "Reply"
-msgstr "Svar"
-
-#: mail/folder-browser-factory.c:38 mail/mail-view.c:135
-msgid "Reply to the sender of this message"
-msgstr "Svar til avsender av denne meldingen"
-
-#: mail/folder-browser-factory.c:39 mail/mail-view.c:138
-msgid "Reply to All"
-msgstr "Svar til alle"
-
-#: mail/folder-browser-factory.c:39 mail/mail-view.c:138
-msgid "Reply to all recipients of this message"
-msgstr "Svar til alle mottakere av denne meldingen"
-
-#: mail/folder-browser-factory.c:41 mail/mail-view.c:141
-msgid "Forward"
-msgstr "Videresend"
-
-#: mail/folder-browser-factory.c:41 mail/mail-view.c:141
-msgid "Forward this message"
-msgstr "Videresend denne meldingen"
-
-#: mail/folder-browser-factory.c:45
-msgid "Move"
-msgstr "Flytt"
-
-#: mail/folder-browser-factory.c:45
-msgid "Move message to a new folder"
-msgstr "Flytt meldingen til en ny mappe"
-
-#: mail/folder-browser-factory.c:46
-msgid "Copy message to a new folder"
-msgstr "Kopiér melding til en ny mappe"
-
-#: mail/folder-browser-factory.c:48 mail/mail-view.c:145
-msgid "Print the selected message"
-msgstr "Skriv ut den valgte meldingen"
-
-#: mail/folder-browser-factory.c:50 mail/mail-view.c:147
-msgid "Delete this message"
-msgstr "Slett denne meldingen"
-
-#: mail/folder-browser-factory.c:72
-msgid "_Threaded Message List"
-msgstr "Meldingsliste med _tråder"
-
-#: mail/folder-browser-factory.c:82
-msgid "_Print message"
-msgstr "Skriv _ut melding"
-
-#: mail/folder-browser-factory.c:90
-msgid "E_dit Message"
-msgstr "Re_digér melding"
-
-#: mail/folder-browser-factory.c:97
-msgid "_View Message"
-msgstr "_Vis melding"
-
-#: mail/folder-browser-factory.c:106
-msgid "_Mark all messages seen"
-msgstr "_Merk alle meldinger som lest"
-
-#: mail/folder-browser-factory.c:110
-msgid "_Expunge"
-msgstr "_Fjern"
-
-#: mail/folder-browser-factory.c:116
-msgid "Mail _Filters ..."
-msgstr "E-post _filtre ..."
-
-#: mail/folder-browser-factory.c:122
-msgid "_vFolder Editor ..."
-msgstr "_vFolder-redigering ..."
-
-#: mail/folder-browser-factory.c:128
-msgid "_Mail Configuration ..."
-msgstr "_E-post konfigurasjon ..."
-
-#: mail/folder-browser-factory.c:134
-msgid "Forget _Passwords"
-msgstr "Glem _passord"
-
-#: mail/folder-browser-factory.c:141
-msgid "_Configure Folder"
-msgstr "_Konfigurér mappe"
-
-#: mail/folder-browser.c:352
-msgid "Save"
-msgstr "Lagre"
-
-#: mail/mail-callbacks.c:134
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-"Denne meldingen har ikke emne.\n"
-"Send likevel?"
-
-#: mail/mail-callbacks.c:166
-msgid ""
-"You need to configure an identity\n"
-"before you can send mail."
-msgstr ""
-"Du må konfigurere en identitet\n"
-"før du kan sende e-post."
-
-#: mail/mail-callbacks.c:182
-msgid ""
-"You need to configure a mail transport\n"
-"before you can send mail."
-msgstr ""
-"Du må konfigurere en e-post-transport\n"
-"før du kan sende e-post."
-
-#: mail/mail-callbacks.c:389
-msgid "Move message(s) to"
-msgstr "Flytt melding(er) til"
-
-#: mail/mail-callbacks.c:391
-msgid "Copy message(s) to"
-msgstr "Kopiér melding(er) til"
-
-#: mail/mail-callbacks.c:448
-msgid ""
-"You may only edit messages saved\n"
-"in the Drafts folder."
-msgstr ""
-"Du kan kun redigere meldinger lagret\n"
-"i Skisser-katalogen."
-
-#: mail/mail-callbacks.c:536
-#, c-format
-msgid ""
-"Error loading filter information:\n"
-"%s"
-msgstr ""
-"Feil under lasting av filter-informasjon:\n"
-"%s"
-
-#: mail/mail-config-gui.c:430
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-"Skriv inn ditt navn og din e-post adresse for bruk i utgående post. Du kan "
-"også skrive inn navnet på din organisasjon, og navnet på en signaturfil."
-
-#: mail/mail-config-gui.c:443
-msgid "Full name:"
-msgstr "Fullt navn:"
-
-#: mail/mail-config-gui.c:467
-msgid "Email address:"
-msgstr "E-post adresse:"
-
-#: mail/mail-config-gui.c:482
-msgid "Organization:"
-msgstr "Organisasjon:"
-
-#: mail/mail-config-gui.c:493
-msgid "Signature file:"
-msgstr "Signaturfil:"
-
-#: mail/mail-config-gui.c:498 mail/mail-config.glade.h:10
-msgid "Signature File"
-msgstr "Signaturfil"
-
-#: mail/mail-config-gui.c:897
-msgid "Server:"
-msgstr "Tjener:"
-
-#: mail/mail-config-gui.c:903
-msgid "Username:"
-msgstr "Brukernavn:"
-
-#: mail/mail-config-gui.c:909
-msgid "Path:"
-msgstr "Sti:"
-
-#: mail/mail-config-gui.c:917
-msgid "Authentication:"
-msgstr "Autentisering:"
-
-#: mail/mail-config-gui.c:929
-msgid "Detect supported types..."
-msgstr "Søk etter støttede typer..."
-
-#: mail/mail-config-gui.c:952
-msgid "Don't delete messages from server"
-msgstr "Ikke slett meldinger fra tjeneren"
-
-#: mail/mail-config-gui.c:964
-msgid "Test Settings"
-msgstr "Prøv ut innstillinger"
-
-#: mail/mail-config-gui.c:1094 mail/mail-config-gui.c:1142
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"Velg hvilken type e-post tjener du har, og skriv inn relevant informasjon om "
-"denne.\n"
-"\n"
-"Hvis tjeneren trenger autentisering, kan du klikke på \"Søk etter støttede "
-"typer...\" knappen etter at du har skrevet inn resten av informasjonen."
-
-#: mail/mail-config-gui.c:1118
-msgid ""
-"Select the kind of news server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"Velg hvilken type news-tjener du har, og skriv inn relevant informasjon om "
-"denne.\n"
-"\n"
-"Hvis tjeneren trenger autentisering, kan du klikke på \"Søk etter støttede "
-"typer...\"-knappen etter at du har skrevet inn resten av informasjonen."
-
-#: mail/mail-config-gui.c:1192
-msgid "Edit Identity"
-msgstr "Rediger identitet"
-
-#: mail/mail-config-gui.c:1194
-msgid "Add Identity"
-msgstr "Legg til identitet"
-
-#: mail/mail-config-gui.c:1288
-msgid "Edit Source"
-msgstr "Rediger kilde"
-
-#: mail/mail-config-gui.c:1290
-msgid "Add Source"
-msgstr "Legg til kilde"
-
-#: mail/mail-config-gui.c:1387
-msgid "Edit News Server"
-msgstr "Redigér news-tjener"
-
-#: mail/mail-config-gui.c:1389
-msgid "Add News Server"
-msgstr "Legg til news-tjener"
-
-#: mail/mail-config-gui.c:2217
-msgid "The connection was successful!"
-msgstr "Tilkoblingen var vellykket!"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config.glade.h:7 mail/mail-config.glade.h:14
-msgid "Identities"
-msgstr "Identiteter"
-
-#: mail/mail-config.glade.h:9
-msgid "Organization"
-msgstr "Organisasjon"
-
-#: mail/mail-config.glade.h:12 mail/mail-config.glade.h:17
-#: mail/mail-config.glade.h:23
-msgid "Edit"
-msgstr "Redigér"
-
-#: mail/mail-config.glade.h:15
-msgid "Sources"
-msgstr "Kilder"
-
-#: mail/mail-config.glade.h:19
-msgid "Mail Sources"
-msgstr "E-post-kilder"
-
-#: mail/mail-config-druid.glade.h:15 mail/mail-config.glade.h:20
-msgid "Mail Transport"
-msgstr "E-post-transport"
-
-#: mail/mail-config.glade.h:21
-msgid "News Servers"
-msgstr "News-tjenere"
-
-#: mail/mail-config.glade.h:25
-msgid "News Sources"
-msgstr "News-kilder"
-
-#: mail/mail-config.glade.h:26
-msgid "Send messages in HTML format"
-msgstr "Send meldinger i HTML-format"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config-druid.glade.h:7 mail/mail-config-druid.glade.h:8
-#: mail/mail-config-druid.glade.h:16
-msgid "Mail Configuration"
-msgstr "E-post-konfigurasjon"
-
-#: mail/mail-config-druid.glade.h:9
-msgid ""
-"Welcome to the Evolution Mail configuration wizard!\n"
-"By filling in some information about your email\n"
-"settings, you can start sending and receiving email\n"
-"right away. Click Next to continue."
-msgstr ""
-"Velkommen til Evolution E-post-konfigurasjonsdruiden!\n"
-"Ved å fylle ut litt informasjon om dine e-post-\n"
-"innstillinger kan du begynne å sende og motta e-post\n"
-"med én gang. Klikk neste for å fortsette."
-
-#: mail/mail-config-druid.glade.h:13
-msgid "Identity"
-msgstr "Identitet"
-
-#: mail/mail-config-druid.glade.h:14
-msgid "Mail Source"
-msgstr "E-post-kilde"
-
-#: mail/mail-config-druid.glade.h:17
-msgid ""
-"Your email configuration is now complete.\n"
-"Click \"Finish\" to save your new settings"
-msgstr ""
-"Din e-post-konfigurasjon er nå komplett.\n"
-"Klikk \"Fullfør\" for å lagre dine nye innstillinger"
-
-#: mail/mail-crypto.c:338 mail/mail-crypto.c:418
-msgid "Please enter your PGP/GPG passphrase."
-msgstr "Vennligst skriv inn din PGP/GPG passphrase."
-
-#: mail/mail-crypto.c:342 mail/mail-crypto.c:422
-msgid "No password provided."
-msgstr "Ingen passord gitt."
-
-#: mail/mail-crypto.c:348 mail/mail-crypto.c:428
-#, c-format
-msgid "Couldn't create pipe to GPG/PGP: %s"
-msgstr "Kunne ikke opprette rør til GPG/PGP: %s"
-
-#: mail/mail-local.c:256
-#, c-format
-msgid "Changing folder \"%s\" to \"%s\" format"
-msgstr "Endrer mappe \"%s\" til \"%s\"-format"
-
-#: mail/mail-local.c:260
-#, c-format
-msgid "Change folder \"%s\" to \"%s\" format"
-msgstr "Endre mappe \"%s\" til \"%s\"-format"
-
-#: mail/mail-ops.c:74
-#, c-format
-msgid "Fetching email from %s"
-msgstr "Henter e-post fra %s"
-
-#: mail/mail-ops.c:76
-#, c-format
-msgid "Fetch email from %s"
-msgstr "Hent e-post fra %s"
-
-#: mail/mail-ops.c:87
-msgid "You have no remote mail source configured to fetch mail from."
-msgstr "Du har ikke konfigurert en ekstern e-post-kilde å hente e-post fra."
-
-#: mail/mail-ops.c:97
-msgid "Bad folder passed to fetch_mail"
-msgstr "Ugyldig mappe sendt til fetch_mail"
-
-#: mail/mail-ops.c:165
-msgid "There is no new mail."
-msgstr "Ingen ny e-post."
-
-#: mail/mail-ops.c:234
-#, c-format
-msgid "Sending \"%s\""
-msgstr "Sender \"%s\""
-
-#: mail/mail-ops.c:239
-msgid "Sending a message without a subject"
-msgstr "Sender en melding uten emne"
-
-#: mail/mail-ops.c:242
-#, c-format
-msgid "Send \"%s\""
-msgstr "Send \"%s\""
-
-#: mail/mail-ops.c:245
-msgid "Send a message without a subject"
-msgstr "Send en melding uten emne"
-
-#: mail/mail-ops.c:410
-#, c-format
-msgid "Expunging \"%s\""
-msgstr "Fjerner \"%s\""
-
-#: mail/mail-ops.c:412
-#, c-format
-msgid "Expunge \"%s\""
-msgstr "Fjern \"%s\""
-
-#: mail/mail-ops.c:484
-#, c-format
-msgid "Moving messages from \"%s\" into \"%s\""
-msgstr "Flytter meldinger fra \"%s\" til \"%s\""
-
-#: mail/mail-ops.c:486
-#, c-format
-msgid "Copying messages from \"%s\" into \"%s\""
-msgstr "Kopierer meldinger fra \"%s\" til \"%s\""
-
-#: mail/mail-ops.c:489
-#, c-format
-msgid "Move messages from \"%s\" into \"%s\""
-msgstr "Flytt meldinger fra \"%s\" til \"%s\""
-
-#: mail/mail-ops.c:491
-#, c-format
-msgid "Copy messages from \"%s\" into \"%s\""
-msgstr "Kopiér meldinger fra \"%s\" til \"%s\""
-
-#: mail/mail-ops.c:637
-#, c-format
-msgid "Marking messages in folder \"%s\""
-msgstr "Merker meldinger i mappe \"%s"
-
-#: mail/mail-ops.c:640
-#, c-format
-msgid "Mark messages in folder \"%s\""
-msgstr "Merk meldinger i mappe \"%s\""
-
-#: mail/mail-ops.c:769
-#, c-format
-msgid "Scanning folders in \"%s\""
-msgstr "Skanner mapper i \"%s\""
-
-#: mail/mail-ops.c:772
-#, c-format
-msgid "Scan folders in \"%s\""
-msgstr "Skann foldere i \"%s\""
-
-#: mail/mail-ops.c:859
-msgid "(No description)"
-msgstr "(Ingen beskrivelse)"
-
-#: mail/mail-ops.c:922
-#, c-format
-msgid "Attaching messages from folder \"%s\""
-msgstr "Legger ved meldinger fra mappe \"%s\""
-
-#: mail/mail-ops.c:925
-#, c-format
-msgid "Attach messages from \"%s\""
-msgstr "Legg ved meldinger fra \"%s\""
-
-#: mail/mail-ops.c:1051
-#, c-format
-msgid "Forwarding messages \"%s\""
-msgstr "Videresender meldinger \"%s\""
-
-#: mail/mail-ops.c:1056
-msgid "Forwarding a message without a subject"
-msgstr "Videresender en melding uten emne"
-
-#: mail/mail-ops.c:1059
-#, c-format
-msgid "Forward message \"%s\""
-msgstr "Videresend meldingen \"%s\""
-
-#: mail/mail-ops.c:1064
-msgid "Forward a message without a subject"
-msgstr "Videresend en melding uten emne"
-
-#: mail/mail-ops.c:1129
-msgid ""
-"Failed to generate mime part from message while generating forwarded message."
-msgstr "Kunne ikke generere MIME-del fra melding under generering av videresendt melding."
-
-#: mail/mail-ops.c:1218
-#, c-format
-msgid "Loading \"%s\""
-msgstr "Laster \"%s\""
-
-#: mail/mail-ops.c:1220
-#, c-format
-msgid "Load \"%s\""
-msgstr "Last \"%s\""
-
-#: mail/mail-ops.c:1339
-#, c-format
-msgid "Creating \"%s\""
-msgstr "Oppretter \"%s\""
-
-#: mail/mail-ops.c:1341
-#, c-format
-msgid "Create \"%s\""
-msgstr "Opprett \"%s\""
-
-#: mail/mail-ops.c:1412
-msgid "Exception while reporting result to shell component listener."
-msgstr "Unntak under rapportering av resultat til skallkomponentens lytter."
-
-#: mail/mail-ops.c:1465
-#, c-format
-msgid "Synchronizing \"%s\""
-msgstr "Synkroniserer \"%s\""
-
-#: mail/mail-ops.c:1467
-#, c-format
-msgid "Synchronize \"%s\""
-msgstr "Synkronisér \"%s\""
-
-#: mail/mail-ops.c:1543
-#, c-format
-msgid "Displaying message UID \"%s\""
-msgstr "Viser melding-UID \"%s\""
-
-#: mail/mail-ops.c:1546
-msgid "Clearing message display"
-msgstr "Tømmer meldingsvisning"
-
-#: mail/mail-ops.c:1549
-#, c-format
-msgid "Display message UID \"%s\""
-msgstr "Vis meldings-UID \"%s\""
-
-#: mail/mail-ops.c:1552
-msgid "Clear message dispaly"
-msgstr "Tøm meldingsvisning"
-
-#: mail/mail-ops.c:1671
-#, c-format
-msgid "Opening messages from folder \"%s\""
-msgstr "Åpner meldinger fra mappe \"%s\""
-
-#: mail/mail-ops.c:1674
-#, c-format
-msgid "Open messages from \"%s\""
-msgstr "Åpne meldinger fra \"%s\""
-
-#: mail/mail-ops.c:1786
-msgid "Loading Draftbox"
-msgstr "Laster skissemappe"
-
-#: mail/mail-ops.c:1788
-msgid "Load Draftbox"
-msgstr "Last skissemappe"
-
-#: mail/mail-ops.c:1856
-#, c-format
-msgid "Viewing messages from folder \"%s\""
-msgstr "Viser meldinger fra mappe \"%s\""
-
-#: mail/mail-ops.c:1859
-#, c-format
-msgid "View messages from \"%s\""
-msgstr "Vis meldinger fra \"%s\""
-
-#: mail/mail-threads.c:274
-#, c-format
-msgid ""
-"Error while preparing to %s:\n"
-"%s"
-msgstr ""
-"Feil under forberedelser til %s:\n"
-"%s"
-
-#: mail/mail-threads.c:622
-#, c-format
-msgid ""
-"Error while `%s':\n"
-"%s"
-msgstr ""
-"Feil under `%s':\n"
-"%s"
-
-#: mail/mail-threads.c:675
-msgid "Incomplete message written on pipe!"
-msgstr "Uferdig melding skrevet på rør!"
-
-#: mail/mail-threads.c:679
-msgid "Error reading commands from dispatching thread."
-msgstr "Feil under lesing av kommandoer fra utsender-tråd."
-
-#: mail/mail-threads.c:744
-msgid "Corrupted message from dispatching thread?"
-msgstr "Korrupt melding fra utsender-tråd?"
-
-#: mail/mail-threads.c:856
-msgid "Could not create dialog box."
-msgstr "Kan ikke opprette dialogboks."
-
-#: mail/mail-threads.c:867
-msgid "User cancelled query."
-msgstr "Spørring avbrutt av bruker."
-
-#: mail/message-list.c:489
-msgid "Online Status"
-msgstr "Tilkoblet status"
-
-#: mail/message-list.c:525
-msgid "From"
-msgstr "Fra"
-
-#: mail/message-list.c:532
-msgid "Subject"
-msgstr "Emne"
-
-#: mail/message-list.c:539
-msgid "Date"
-msgstr "Dato"
-
-#: mail/message-list.c:546
-msgid "Received"
-msgstr "Mottatt"
-
-#: mail/message-list.c:553
-msgid "To"
-msgstr "Til"
-
-#: mail/message-list.c:560
-msgid "Size"
-msgstr "Størrelse"
-
-#: notes/component-factory.c:27
-msgid "Create a new note"
-msgstr "Opprett en ny notis"
-
-#: notes/component-factory.c:148
-msgid "Cannot initialize Evolution's notes component."
-msgstr "Kan ikke initialisere Evolutions notiskomponent."
-
-#: notes/main.c:30
-msgid "Notes Component: Could not initialize bonobo"
-msgstr "Notiskomponent: Kunne ikke initialisere Bonobo"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Evolution installasjon"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Dette ser ut til å være første gang du kjører Evolution."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr "Vennligst klikk \"OK\" for å installere Evolutions brukerfiler under"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"Kan ikke opprette katalogen\n"
-"%s\n"
-"Feil: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"Kan ikke kopiere filer til\n"
-"`%s'."
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Evolutions filer ble installert."
-
-#: shell/e-setup.c:109
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please move it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"Filen '%s' er ikke en katalog.\n"
-"Venligst flytt denne for å tillate installasjon\n"
-"av Evolution's brukerfiler."
-
-#: shell/e-setup.c:121
-#, c-format
-msgid ""
-"The directory `%s' exists but is not the\n"
-"Evolution directory. Please move it in order\n"
-"to allow installation of the Evolution user files."
-msgstr ""
-"Katalogen `%s' eksisterer men er ikke.\n"
-"Evolution-katalogen. Venligst flytt den for å \n"
-"tillate installasjon av Evolution's brukerfiler."
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"Kan ikke opprette spesifisert katalog:\n"
-"%s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr "Spesifisert mappe er ikke gyldig."
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "Evolution - Lag ny mappe"
-
-#: shell/e-shell-folder-selection-dialog.c:96
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-"Typen for valgt mappe er ikke gyldig for den\n"
-"forespurte operasjonen."
-
-#: shell/e-shell-folder-selection-dialog.c:272
-msgid "New..."
-msgstr "Ny..."
-
-#: shell/e-shell-folder-title-bar.c:459 shell/e-shell-folder-title-bar.c:460
-msgid "(Untitled)"
-msgstr "(Uten navn)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Bug buddy ble ikke funnet i din $PATH."
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "Bug buddy kunne ikke kjøres."
-
-#: shell/e-shell-view-menu.c:167
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:169
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution er en suite av gruppevareapplikasjoner\n"
-"for e-post, kalender og kontaktdatabaser for\n"
-"GNOME skrivebordsmiljøet."
-
-#: shell/e-shell-view-menu.c:319
-msgid "Go to folder..."
-msgstr "Gå til mappe..."
-
-#: shell/e-shell-view-menu.c:377
-msgid "_New"
-msgstr "_Ny"
-
-#: shell/e-shell-view-menu.c:389
-msgid "_Folder"
-msgstr "_Mappe"
-
-#: shell/e-shell-view-menu.c:395
-msgid "Evolution bar _shortcut"
-msgstr "_Snarvei til Evolution-linje"
-
-#: shell/e-shell-view-menu.c:404
-msgid "_Mail message (FIXME)"
-msgstr "E-post _melding"
-
-#: shell/e-shell-view-menu.c:410
-msgid "_Appointment (FIXME)"
-msgstr "_Avtale"
-
-#: shell/e-shell-view-menu.c:416
-msgid "_Contact (FIXME)"
-msgstr "_Kontakt"
-
-#: shell/e-shell-view-menu.c:422
-msgid "_Task (FIXME)"
-msgstr "_Oppgave"
-
-#: shell/e-shell-view-menu.c:444
-msgid "_Go to folder..."
-msgstr "_Gå til mappe..."
-
-#: shell/e-shell-view-menu.c:445
-msgid "Display a different folder"
-msgstr "Vis en annen mappe"
-
-#: shell/e-shell-view-menu.c:452
-msgid "_Create new folder..."
-msgstr "_Opprett ny mappe..."
-
-#: shell/e-shell-view-menu.c:453 shell/e-shell-view-menu.c:465
-msgid "Create a new folder"
-msgstr "Opprett en ny mappe"
-
-#: shell/e-shell-view-menu.c:464
-msgid "E_xit..."
-msgstr "A_vslutt..."
-
-#: shell/e-shell-view-menu.c:495
-msgid "Show _shortcut bar"
-msgstr "Vis _snarveilinje"
-
-#: shell/e-shell-view-menu.c:496
-msgid "Show the shortcut bar"
-msgstr "Viser snarveilinjen"
-
-#: shell/e-shell-view-menu.c:501
-msgid "Show _folder bar"
-msgstr "Vis _folderlinje"
-
-#: shell/e-shell-view-menu.c:502
-msgid "Show the folder bar"
-msgstr "Viser folderlinjen"
-
-#: shell/e-shell-view-menu.c:524
-msgid "_Actions"
-msgstr "H_andlinger"
-
-#: shell/e-shell-view-menu.c:535
-msgid "_Help"
-msgstr "_Hjelp"
-
-#: shell/e-shell-view-menu.c:541
-msgid "Help _index"
-msgstr "Hjelp _indeks"
-
-#: shell/e-shell-view-menu.c:548
-msgid "Getting _started"
-msgstr "Kom _igang"
-
-#: shell/e-shell-view-menu.c:555
-msgid "Using the _mailer"
-msgstr "Bruk av _e-postleseren"
-
-#: shell/e-shell-view-menu.c:562
-msgid "Using the _calendar"
-msgstr "Bruk av _kalenderen"
-
-#: shell/e-shell-view-menu.c:569
-msgid "Using the c_ontact manager"
-msgstr "Bruk av k_ontaktlisten"
-
-#: shell/e-shell-view-menu.c:579
-msgid "_Submit bug report"
-msgstr "_Send feilrapport"
-
-#: shell/e-shell-view-menu.c:580
-msgid "Submit bug report using Bug Buddy"
-msgstr "Send feilrapport med bug-buddy"
-
-#: shell/e-shell-view-menu.c:589
-msgid "_About Evolution..."
-msgstr "_Om Evolution..."
-
-#: shell/e-shell-view-menu.c:590
-msgid "Show information about Evolution"
-msgstr "Vis informasjon om Evolution"
-
-#: shell/e-shell-view.c:122
-msgid "(No folder displayed)"
-msgstr "(Ingen mappe vist)"
-
-#: shell/e-shell-view.c:350
-msgid "Folders"
-msgstr "Mapper"
-
-#: shell/e-shell-view.c:879
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell.c:293
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Kan ikke sette opp lokal lagring -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "_Små ikoner"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "Vis snarveier som små ikoner"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "Store i_koner"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Vis snarveier som store ikoner"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "Aktiver"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "Aktiver denne snarveien"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Fjern denne snarveien fra snarveilinjen"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Feil under lagring av snarveier."
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "(Uten navn)"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "Ingen feil"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "Vanlig feil"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "En mappe med samme navn eksisterer allerede"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr "Spesifisert mappetype er ikke gyldig"
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "I/U-feil"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "Ikke nok plass til å opprette mappen"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "Spesifisert mappe ble ikke funnet"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr "Funksjonen er ikke implementert i dette lageret"
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "Tilgang nektet"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "Operasjonen er ikke støttet"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr "Spesifisert type er ikke støttet for dette lageret"
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "Ukjent feil"
-
-#: shell/e-storage-set-view.c:242
-msgid "View the selected folder"
-msgstr "Vis den valgte mappen"
-
-#: shell/main.c:66
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Hei. Takk for at du har tatt deg tid til å laste ned denne prøveversjonen\n"
-"av Evolution gruppevare-suiten.\n"
-"\n"
-"Den siste halvannen måneden har vi fokusert på å gjøre Evolution klar\n"
-"for generell bruk. Mange av utviklerene bruker nå Evolution som sin\n"
-"eneste e-postløsning. Det kan du også gjøre. (Bare sørg for å ha en \n"
-"sikkerhetskopi.)\n"
-"\n"
-"Men selv om vi har rettet mange feil mhp. stabilitet og sikkerhet, vil vi\n"
-"fremdeles vise deg denne meldingen: Evolution vil: krasje, miste din e-post\n"
-"når du ikke vil at det skal skje, etterlate seg vilfarne prosesser som \n"
-"spiser 100% av din CPU-tid, låse seg, sende e-post i HTML-format til\n"
-"tilfeldige e-postlister, og tabbe deg ut foran dine venner og kolleger.\n"
-"Bruk kun etter anvisninger.\n"
-"\n"
-"Vi håper at du nyter resultatene av vårt harde arbeid, og vi venter i\n"
-"spenning på at du tilbyr din hjelp!\n"
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Takk\n"
-"Evolution utviklerene\n"
-
-#: shell/main.c:121
-msgid "Cannot initialize the Evolution shell."
-msgstr "Kan ikke initialisere Evolution skallet."
-
-#: shell/main.c:156
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Kunne ikke initialisere Bonobo komponentsystemet."
-
-#: tests/ui-tests/message-browser.c:360
-msgid "The component now claims that it doesn't support PersistStream!"
-msgstr "Komponenten hevder nå at den ikke støtter PersistStream!"
-
-#: tests/ui-tests/message-browser.c:378
-msgid ""
-"An exception occured while trying to load data into the component with "
-"PersistStream"
-msgstr "Et unntak oppsto under forsøk på å laste data inn i komponenten med PersistStream"
-
-#: tests/ui-tests/message-browser.c:471
-#, c-format
-msgid "The %s component doesn't support PersistStream!\n"
-msgstr "Komponenten %s støtter ikke PersistStream!\n"
-
-#: tests/ui-tests/message-browser.c:710
-msgid "Open Mime Message"
-msgstr "Åpne MIME-melding"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Felt"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "Gruppering"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Sorter"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Filter"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-#: widgets/e-table/e-table-header-item.c:1164
-msgid "Field Chooser"
-msgstr "Feltvelger"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-"For å legge til en kolonne i tabellen, dra den til\n"
-"plasseringen du ønsker å ha den."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "vindu1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "Tilgjengelige felter"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "etikett1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "Vis i denne rekkefølgen"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "etikett2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Legg til >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Fjern"
-
-#: widgets/e-table/e-table-header-item.c:1156
-msgid "Sort Ascending"
-msgstr "Sortér stigende"
-
-#: widgets/e-table/e-table-header-item.c:1157
-msgid "Sort Descending"
-msgstr "Sortér synkende"
-
-#: widgets/e-table/e-table-header-item.c:1158
-msgid "Unsort"
-msgstr "Ikke sortér"
-
-#: widgets/e-table/e-table-header-item.c:1160
-msgid "Group By This Field"
-msgstr "Gruppér etter dette feltet"
-
-#: widgets/e-table/e-table-header-item.c:1161
-msgid "Group By Box"
-msgstr "Gruppér etter boks"
-
-#: widgets/e-table/e-table-header-item.c:1163
-msgid "Remove This Column"
-msgstr "Fjern denne kolonnen"
-
-#: widgets/e-table/e-table-header-item.c:1166
-msgid "Alignment"
-msgstr "Justering"
-
-#: widgets/e-table/e-table-header-item.c:1167
-msgid "Best Fit"
-msgstr "Beste tilpasning"
-
-#: widgets/e-table/e-table-header-item.c:1168
-msgid "Format Columns..."
-msgstr "Formatér kolonner..."
-
-#: widgets/e-table/e-table-header-item.c:1170
-msgid "Customize Current View..."
-msgstr "Tilpass aktiv visning..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr "Tentativ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "Opptatt"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr "Ute"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "Ingen informasjon"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr "_Inviter andre..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "_Alternativer"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr "Vis k_un arbeidstid"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr "Vis _zoomet ut"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr "_Oppdater fri/ledig"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "_<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr "_Autovelg"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ">_>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "_Alle mennesker og ressurser"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr "Alle _mennesker og en ressurs"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr "_Nødvendige mennesker"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr "Nødvendige mennesker _og en ressurs"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "Tid for møtets _start:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "Tid for møtets slutt:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr "Alle deltakere"
-
-#. Translators: These are the first characters of each day of the
-#. week, 'M' for 'Monday', 'T' for Tuesday etc.
-#: widgets/misc/e-calendar-item.c:281
-msgid "MTWTFSS"
-msgstr "MTWTFSS"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "Gruppe %i"
diff --git a/po/pl.po b/po/pl.po
deleted file mode 100644
index 001cc98a31..0000000000
--- a/po/pl.po
+++ /dev/null
@@ -1,3785 +0,0 @@
-# Polish translation of evolution
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# GNOME PL Team <gnomepl@pandora.info.bielsko.pl>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution\n"
-"POT-Creation-Date: 2000-07-10 21:51-0400\n"
-"PO-Revision-Date: 2000-05-13 03:41+0200\n"
-"Last-Translator: GNOME PL Team <gnomepl@pandora.info.bielsko.pl>\n"
-"Language-Team: Polish <pl@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-2\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:58
-#: calendar/gui/calendar-pilot-sync.c:138 calendar/gui/main.c:68
-#, fuzzy
-msgid "Could not initialize Bonobo"
-msgstr "Obs³uga poczty: nie powiod³o siê uruchomienie Bonobo"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:579
-#: calendar/gui/event-editor.c:1118
-#, fuzzy
-msgid "FIXME: _Appointment"
-msgstr "_Spotkanie"
-
-#: addressbook/contact-editor/e-contact-editor.c:580
-#: calendar/gui/event-editor.c:1119
-#, fuzzy
-msgid "FIXME: Meeting Re_quest"
-msgstr "¯±danie spotkania"
-
-#: addressbook/contact-editor/e-contact-editor.c:582
-#: calendar/gui/event-editor.c:1121
-#, fuzzy
-msgid "FIXME: _Mail Message"
-msgstr "_Wiadomo¶æ pocztowa"
-
-#: addressbook/contact-editor/e-contact-editor.c:583
-#: calendar/gui/event-editor.c:1122
-#, fuzzy
-msgid "FIXME: _Contact"
-msgstr "_Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:584
-#: calendar/gui/event-editor.c:1123
-msgid "FIXME: _Task"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:585
-#: calendar/gui/event-editor.c:1124
-#, fuzzy
-msgid "FIXME: Task _Request"
-msgstr "¯±danie zadania"
-
-#: addressbook/contact-editor/e-contact-editor.c:586
-#: calendar/gui/event-editor.c:1125
-#, fuzzy
-msgid "FIXME: _Journal Entry"
-msgstr "Wpis _dziennika"
-
-#: addressbook/contact-editor/e-contact-editor.c:587
-#: calendar/gui/event-editor.c:1126
-msgid "FIXME: _Note"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:589
-#: addressbook/contact-editor/e-contact-editor.c:694
-#: calendar/gui/event-editor.c:1128 calendar/gui/event-editor.c:1235
-msgid "FIXME: Ch_oose Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:594
-#: calendar/gui/event-editor.c:1133
-msgid "FIXME: _Memo Style"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:596
-#: calendar/gui/event-editor.c:1135
-msgid "FIXME: Define Print _Styles..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:603
-#: calendar/gui/event-editor.c:1142
-msgid "FIXME: S_end"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:607
-#: calendar/gui/event-editor.c:1146
-#, fuzzy
-msgid "FIXME: Save Attac_hments..."
-msgstr "Dodaj za³±cznik..."
-
-#: addressbook/contact-editor/e-contact-editor.c:609
-#: calendar/gui/event-editor.c:1148
-#, fuzzy
-msgid "FIXME: _Delete"
-msgstr "Usuñ"
-
-#: addressbook/contact-editor/e-contact-editor.c:610
-#: calendar/gui/event-editor.c:1149
-msgid "FIXME: _Move to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:611
-#: calendar/gui/event-editor.c:1150
-msgid "FIXME: Cop_y to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:613
-#: calendar/gui/event-editor.c:1152
-msgid "Page Set_up"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:614
-#: calendar/gui/event-editor.c:1153
-msgid "FIXME: Print Pre_view"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:635
-#: calendar/gui/event-editor.c:1174
-msgid "FIXME: Paste _Special..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:640
-#: calendar/gui/event-editor.c:1179
-msgid "FIXME: Mark as U_nread"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1183
-#, fuzzy
-msgid "_Object"
-msgstr "Temat"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: addressbook/contact-editor/e-contact-editor.c:656
-#: calendar/gui/event-editor.c:1188 calendar/gui/event-editor.c:1195
-msgid "FIXME: _Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: addressbook/contact-editor/e-contact-editor.c:657
-#: calendar/gui/event-editor.c:1189 calendar/gui/event-editor.c:1196
-msgid "FIXME: _Unread Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1190
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1197
-msgid "FIXME: _Last Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:663
-#: calendar/gui/event-editor.c:1202
-msgid "FIXME: _Standard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:665
-#: calendar/gui/event-editor.c:1204
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:668
-#: calendar/gui/event-editor.c:1207
-msgid "FIXME: _Customize..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:673
-#: calendar/gui/event-editor.c:1212
-msgid "Pre_vious"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1213
-msgid "Ne_xt"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:676
-#: calendar/gui/event-editor.c:1217
-#, fuzzy
-msgid "_Toolbars"
-msgstr "_Narzêdzia"
-
-#: addressbook/contact-editor/e-contact-editor.c:681
-#: calendar/gui/event-editor.c:1222
-msgid "FIXME: _File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:682
-#: calendar/gui/event-editor.c:1223
-msgid "FIXME: It_em..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:683
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: _Object..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:688
-#: calendar/gui/event-editor.c:1229
-msgid "FIXME: _Font..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:689
-#: calendar/gui/event-editor.c:1230
-msgid "FIXME: _Paragraph..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:696
-#: calendar/gui/event-editor.c:1237
-msgid "FIXME: Desi_gn This Form"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:697
-#: calendar/gui/event-editor.c:1238
-msgid "FIXME: D_esign a Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Publish _Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:700
-#: calendar/gui/event-editor.c:1241
-msgid "FIXME: Pu_blish Form As..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:702
-#: calendar/gui/event-editor.c:1243
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:707
-#: calendar/gui/event-editor.c:1248
-msgid "FIXME: _Spelling..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:709
-#: calendar/gui/event-editor.c:1253
-#, fuzzy
-msgid "_Forms"
-msgstr "_Katalog"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-msgid "FIXME: _New Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-msgid "FIXME: New _Contact from Same Company"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:717
-msgid "FIXME: New _Letter to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:718
-msgid "FIXME: New _Message to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:719
-msgid "FIXME: New Meetin_g with Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:720
-msgid "FIXME: _Plan a Meeting..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:721
-msgid "FIXME: New _Task for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:724
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:725
-msgid "FIXME: _Display Map of Address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:726
-msgid "FIXME: _Open Web Page"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:728
-msgid "FIXME: Forward as _vCard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1266
-#, fuzzy
-msgid "FIXME: For_ward"
-msgstr "Prze¶lij"
-
-#: addressbook/contact-editor/e-contact-editor.c:741
-#: calendar/gui/event-editor.c:1279
-msgid "_Insert"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:742
-#: calendar/gui/event-editor.c:1280
-msgid "F_ormat"
-msgstr ""
-
-#. FIXME: add Favorites here
-#: addressbook/contact-editor/e-contact-editor.c:743
-#: calendar/gui/event-editor.c:1281 shell/e-shell-view-menu.c:473
-msgid "_Tools"
-msgstr "_Narzêdzia"
-
-#: addressbook/contact-editor/e-contact-editor.c:744
-#: calendar/gui/event-editor.c:1282
-#, fuzzy
-msgid "Actio_ns"
-msgstr "_Czynno¶ci"
-
-#: addressbook/contact-editor/e-contact-editor.c:775
-msgid "Save and Close"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:776
-#: calendar/gui/event-editor.c:1321
-msgid "Save the appointment and close the dialog box"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:780
-#: calendar/gui/event-editor.c:1325
-msgid "FIXME: Print..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-#: calendar/gui/event-editor.c:1326
-msgid "Print this item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-#: calendar/gui/event-editor.c:1327
-msgid "FIXME: Insert File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-#: calendar/gui/event-editor.c:1328
-msgid "Insert a file as an attachment"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-#: calendar/gui/event-editor.c:1336
-#, fuzzy
-msgid "FIXME: Delete"
-msgstr "Usuñ"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-#: calendar/gui/event-editor.c:1337 calendar/gui/gncal-todo.c:326
-#, fuzzy
-msgid "Delete this item"
-msgstr "Usuwa tê wiadomo¶æ"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-#: calendar/gui/event-editor.c:1339
-msgid "FIXME: Previous"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-#: calendar/gui/event-editor.c:1340
-msgid "Go to the previous item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-#: calendar/gui/event-editor.c:1341
-msgid "FIXME: Next"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:791
-#: calendar/gui/event-editor.c:1342
-msgid "Go to the next item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-#: calendar/gui/event-editor.c:1343
-msgid "FIXME: Help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1344
-msgid "See online help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1208
-msgid "Assistant"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1209
-#: addressbook/contact-editor/e-contact-editor.c:1313
-msgid "Business"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1210
-msgid "Business 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1211
-msgid "Business Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1212
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1213
-msgid "Car"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1214
-#, fuzzy
-msgid "Company"
-msgstr "Kopiuj"
-
-#: addressbook/contact-editor/e-contact-editor.c:1215
-#: addressbook/contact-editor/e-contact-editor.c:1314
-msgid "Home"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1216
-msgid "Home 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1217
-msgid "Home Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1218
-msgid "ISDN"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1219
-msgid "Mobile"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1220
-#: addressbook/contact-editor/e-contact-editor.c:1315
-msgid "Other"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1221
-msgid "Other Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1222
-#, fuzzy
-msgid "Pager"
-msgstr "Wklej"
-
-#: addressbook/contact-editor/e-contact-editor.c:1223
-#, fuzzy
-msgid "Primary"
-msgstr "Priorytet"
-
-#: addressbook/contact-editor/e-contact-editor.c:1224
-msgid "Radio"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1225
-msgid "Telex"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1226
-msgid "TTY/TDD"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1270
-msgid "Primary Email"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1271
-msgid "Email 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1272
-msgid "Email 3"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#, fuzzy
-msgid "_Delete"
-msgstr "Usuñ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91
-msgid "Add"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-#, fuzzy
-msgid "Contact Editor"
-msgstr "_Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-#, fuzzy
-msgid "_Home"
-msgstr "_Notatka"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-#, fuzzy
-msgid "_Mobile"
-msgstr "_Poczta"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-#, fuzzy
-msgid "C_ontacts..."
-msgstr "Kontakty"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-#, fuzzy
-msgid "_Company:"
-msgstr "Kopiuj"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "General"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-#, fuzzy
-msgid "No_tes:"
-msgstr "_Notatka"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-#, fuzzy
-msgid "Details"
-msgstr "Pobierz pocztê"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:10
-#, fuzzy
-msgid "_Middle:"
-msgstr "_Poczta"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:415
-#: calendar/gui/calendar-commands.c:544
-#, fuzzy
-msgid "New"
-msgstr "_Nowe"
-
-#: addressbook/gui/component/addressbook.c:415
-msgid "Create a new contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Find"
-msgstr "Znajd¼"
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Find a contact"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:420
-#: addressbook/gui/component/addressbook.c:487
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:43
-msgid "Print"
-msgstr "Drukuj"
-
-#: addressbook/gui/component/addressbook.c:420
-#, fuzzy
-msgid "Print contacts"
-msgstr "Kontakty"
-
-#. Delete
-#: addressbook/gui/component/addressbook.c:421
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:498
-#: mail/folder-browser-factory.c:45
-msgid "Delete"
-msgstr "Usuñ"
-
-#: addressbook/gui/component/addressbook.c:421
-#, fuzzy
-msgid "Delete a contact"
-msgstr "Wybierz za³±cznik"
-
-#: addressbook/gui/component/addressbook.c:494
-#: addressbook/gui/component/addressbook.c:1034
-msgid "As _Table"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:501
-#, fuzzy
-msgid "_New Contact"
-msgstr "_Kontakt"
-
-#: addressbook/gui/component/addressbook.c:509
-msgid "N_ew Directory Server"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:588
-#, fuzzy
-msgid "Unable to open addressbook"
-msgstr "Kliknij tu aby zobaczyæ ksi±¿kê adresow±"
-
-#: addressbook/gui/component/addressbook.c:593
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:938
-#: addressbook/gui/minicard/e-minicard.c:329
-msgid "Save as VCard"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1005
-msgid "* Click here to add a contact *"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1041
-msgid "As _Minicards"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1092
-msgid "The URI that the Folder Browser will display"
-msgstr "URI które ma wy¶wietliæ przegl±darka katalogów"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:98
-msgid "h"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:23
-#, fuzzy
-msgid "o"
-msgstr "Dla"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr ""
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:10
-#, fuzzy
-msgid "Options"
-msgstr "_Czynno¶ci"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:12
-#, fuzzy
-msgid "Sections:"
-msgstr "_Czynno¶ci"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:16
-#, fuzzy
-msgid "Start on a new page"
-msgstr "Wy¶lij wiadomo¶æ"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:19
-#, fuzzy
-msgid "Fonts"
-msgstr "Kontakty"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:24
-#, fuzzy
-msgid "Body"
-msgstr "Dzi¶"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:28
-#, fuzzy
-msgid "Format"
-msgstr "Prze¶lij"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-#, fuzzy
-msgid "Paper"
-msgstr "Wklej"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:37
-#, fuzzy
-msgid "Top:"
-msgstr "Dla:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:41
-#, fuzzy
-msgid "Page"
-msgstr "Wklej"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-#, fuzzy
-msgid "Size:"
-msgstr "Rozmiar"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:48
-#, fuzzy
-msgid "Portrait"
-msgstr "Priorytet"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:544
-msgid "am"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:543
-msgid "pm"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:59
-#, fuzzy
-msgid "Appointments:"
-msgstr "_Spotkanie"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:175
-#, fuzzy
-msgid "Gnome Calendar"
-msgstr "Kalendarz"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:456
-#, fuzzy
-msgid "Open calendar"
-msgstr "Twój kalendarz"
-
-#: calendar/gui/calendar-commands.c:495
-#, fuzzy
-msgid "Save calendar"
-msgstr "Twój kalendarz"
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:712
-#: calendar/gui/gncal-todo.c:716
-msgid "Day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:525
-msgid "Show the working week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:711
-msgid "Week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Month"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:682
-msgid "Create a new appointment"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-#, fuzzy
-msgid "Print this calendar"
-msgstr "Twój kalendarz"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Prev"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Today"
-msgstr "Dzi¶"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554 filter/filter-editor.c:210
-msgid "Next"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr ""
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-#, fuzzy
-msgid "New Ca_lendar"
-msgstr "Kalendarz"
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:663
-#, fuzzy
-msgid "Open Ca_lendar"
-msgstr "Kalendarz"
-
-#: calendar/gui/calendar-commands.c:664
-#, fuzzy
-msgid "Open a calendar"
-msgstr "Twój kalendarz"
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-#, fuzzy
-msgid "Save Calendar As"
-msgstr "Kalendarz"
-
-#: calendar/gui/calendar-commands.c:673
-#, fuzzy
-msgid "Print..."
-msgstr "Drukuj"
-
-#: calendar/gui/calendar-commands.c:682
-#, fuzzy
-msgid "_New appointment..."
-msgstr "_Spotkanie"
-
-#: calendar/gui/calendar-commands.c:687
-msgid "New appointment for _today..."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:688
-msgid "Create a new appointment for today"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:696 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/calendar-commands.c:704
-#, fuzzy
-msgid "About Calendar"
-msgstr "Twój kalendarz"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:746
-#, c-format
-msgid "%s%s"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:746
-#, fuzzy
-msgid "'s calendar"
-msgstr "Twój kalendarz"
-
-#: calendar/gui/calendar-pilot-sync.c:68
-msgid "Specifies the port on which the Pilot is"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:68
-msgid "PORT"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:70
-msgid "If you want to debug the attributes on records"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:72
-msgid "Only syncs from desktop to pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:74
-msgid "Only syncs from pilot to desktop"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:97
-msgid "Can not create Pilot socket\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:104
-#, c-format
-msgid "Can not bind to device %s\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:107
-msgid "Failed to get a connection from the Pilot device"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:111
-msgid "pi_accept failed"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:211
-msgid ""
-"\tObject has been modified on desktop and on the pilot, desktop takes "
-"precedence\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:531
-msgid "No description"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:692
-msgid "Could not open DatebookDB on the Pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:693
-msgid "Unable to open DatebookDB"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:728
-msgid "Synced DateBook from Pilot to GnomeCal"
-msgstr ""
-
-#: calendar/gui/control-factory.c:136
-#, fuzzy
-msgid "The URI that the calendar will display"
-msgstr "URI które ma wy¶wietliæ przegl±darka katalogów"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1056
-#, fuzzy
-msgid "Snooze"
-msgstr "Rozmiar"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-#, fuzzy
-msgid "Edit appointment"
-msgstr "_Spotkanie"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr ""
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-#, fuzzy
-msgid "New appointment..."
-msgstr "_Spotkanie"
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-#, fuzzy
-msgid "Delete this appointment"
-msgstr "Usuwa tê wiadomo¶æ"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-#, fuzzy
-msgid "Delete this occurrence"
-msgstr "Usuwa tê wiadomo¶æ"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr ""
-
-#: calendar/gui/event-editor.c:289
-#, fuzzy
-msgid "Edit Appointment"
-msgstr "_Spotkanie"
-
-#: calendar/gui/event-editor.c:294
-msgid "No summary"
-msgstr ""
-
-#: calendar/gui/event-editor.c:298
-#, fuzzy, c-format
-msgid "Appointment - %s"
-msgstr "_Spotkanie"
-
-#: calendar/gui/event-editor.c:301
-#, fuzzy, c-format
-msgid "Task - %s"
-msgstr "Zadania"
-
-#: calendar/gui/event-editor.c:304
-#, fuzzy, c-format
-msgid "Journal entry - %s"
-msgstr "Wpis _dziennika"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:594 calendar/gui/event-editor.c:688
-msgid "?"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1215
-msgid "FIXME: Ca_lendar..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1250
-msgid "FIXME: Chec_k Names"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1251
-msgid "FIXME: Address _Book..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1258
-#, fuzzy
-msgid "FIXME: _New Appointment"
-msgstr "_Spotkanie"
-
-#: calendar/gui/event-editor.c:1260
-msgid "FIXME: Rec_urrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1262
-msgid "FIXME: Intive _Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1263
-msgid "FIXME: C_ancel Invitation..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Forward as v_Calendar"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1320
-msgid "FIXME: Save and Close"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1330
-msgid "FIXME: Recurrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1331
-msgid "Configure recurrence rules"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1333
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1334
-msgid "Invite attendees to a meeting"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1745
-msgid "%a %b %d %Y"
-msgstr ""
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:14 calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid "_Display"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:32
-msgid "_Audio"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:33
-msgid "_Program"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:34
-msgid "_Mail"
-msgstr "_Poczta"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "Mail _to:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Run program:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "Classification"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "Pu_blic"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-#, fuzzy
-msgid "Pri_vate"
-msgstr "Wklej"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Confidential"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:596
-#, fuzzy
-msgid "None"
-msgstr "_Notatka"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-#, fuzzy
-msgid "Daily"
-msgstr "_Poczta"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr ""
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-msgid "month(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-#, fuzzy
-msgid "Exceptions"
-msgstr "_Czynno¶ci"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-msgid "Change"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr ""
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr ""
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr ""
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr ""
-
-#: calendar/gui/getdate.y:394
-#, fuzzy
-msgid "april"
-msgstr "_Poczta"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr ""
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr ""
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr ""
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr ""
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr ""
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr ""
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr ""
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr ""
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr ""
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr ""
-
-#: calendar/gui/getdate.y:405
-#, fuzzy
-msgid "monday"
-msgstr "Dzi¶"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr ""
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr ""
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr ""
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr ""
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr ""
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr ""
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr ""
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr ""
-
-#: calendar/gui/getdate.y:421
-msgid "month"
-msgstr ""
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr ""
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr ""
-
-#: calendar/gui/getdate.y:424
-#, fuzzy
-msgid "day"
-msgstr "Dzi¶"
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr ""
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr ""
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr ""
-
-#: calendar/gui/getdate.y:428
-#, fuzzy
-msgid "second"
-msgstr "Wy¶lij"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr ""
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr ""
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr ""
-
-#: calendar/gui/getdate.y:437
-#, fuzzy
-msgid "today"
-msgstr "Dzi¶"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr ""
-
-#: calendar/gui/getdate.y:439
-#, fuzzy
-msgid "last"
-msgstr "Wklej"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr ""
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr ""
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr ""
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr ""
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr ""
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr ""
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr ""
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr ""
-
-#: calendar/gui/getdate.y:450
-#, fuzzy
-msgid "ninth"
-msgstr "Drukuj"
-
-#: calendar/gui/getdate.y:451
-#, fuzzy
-msgid "tenth"
-msgstr "Wys³ane"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr ""
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Create to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Edit to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:171
-msgid "Summary:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:181
-msgid "Due Date:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:190
-#, fuzzy
-msgid "Priority:"
-msgstr "Priorytet"
-
-#: calendar/gui/gncal-todo.c:206
-msgid "Item Comments:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:324
-msgid "Add to-do item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:325
-msgid "Edit this item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:424
-msgid "Summary"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:425 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:426 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr "Priorytet"
-
-#: calendar/gui/gncal-todo.c:427
-msgid "Time Left"
-msgstr ""
-
-#. Label
-#: calendar/gui/gncal-todo.c:439
-#, fuzzy
-msgid "To-do list"
-msgstr "_Narzêdzia"
-
-#. Add
-#: calendar/gui/gncal-todo.c:478
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr ""
-
-#. Edit
-#: calendar/gui/gncal-todo.c:487
-msgid "Edit..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:711
-msgid "Weeks"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:712 calendar/gui/gncal-todo.c:716
-#, fuzzy
-msgid "Days"
-msgstr "Kopie robocze"
-
-#: calendar/gui/gncal-todo.c:717 calendar/gui/gncal-todo.c:721
-msgid "Hours"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:717 calendar/gui/gncal-todo.c:721
-msgid "Hour"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Minutes"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Minute"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-#, fuzzy
-msgid "Seconds"
-msgstr "Wy¶lij"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-#, fuzzy
-msgid "Second"
-msgstr "Wy¶lij"
-
-#: calendar/gui/gnome-cal.c:453 calendar/gui/gnome-cal.c:1064
-#: calendar/gui/gnome-cal.c:1120
-msgid "Reminder of your appointment at "
-msgstr ""
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1069 calendar/gui/gnome-cal.c:1124
-msgid "Ok"
-msgstr ""
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr ""
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr ""
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr ""
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr ""
-
-#: calendar/gui/print.c:326
-#, fuzzy
-msgid "Fr"
-msgstr "Od"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr ""
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr ""
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr ""
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr ""
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr ""
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr ""
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1084
-#, fuzzy
-msgid "Print Calendar"
-msgstr "Kalendarz"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr ""
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr ""
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr ""
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr ""
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr ""
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr ""
-
-#: calendar/gui/prop.c:347
-#, fuzzy
-msgid "Sunday"
-msgstr "Wy¶lij"
-
-#: calendar/gui/prop.c:348
-#, fuzzy
-msgid "Monday"
-msgstr "Dzi¶"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr ""
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr ""
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr ""
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr ""
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr ""
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr ""
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr ""
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr ""
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr ""
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr ""
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr ""
-
-#: calendar/gui/prop.c:678
-#, fuzzy
-msgid "To Do List Properties"
-msgstr "W³a¶ciwo¶ci"
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr ""
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-#, fuzzy
-msgid "Alarm Properties"
-msgstr "W³a¶ciwo¶ci"
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr ""
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr ""
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr ""
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-msgid "Defaults"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.c:183 composer/e-msg-composer.c:766
-msgid "Cut"
-msgstr "Wytnij"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "Wycina wybrany element do schowka"
-
-#: composer/e-msg-composer-address-dialog.c:187 composer/e-msg-composer.c:767
-msgid "Copy"
-msgstr "Kopiuj"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "Kopiuje wybrany element do schowka"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199 composer/e-msg-composer.c:768
-msgid "Paste"
-msgstr "Wklej"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Wstawia zawarto¶æ schowka"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "Wybierz adresy odbiorców"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-#, fuzzy
-msgid "Properties..."
-msgstr "W³a¶ciwo¶ci"
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-#, fuzzy
-msgid "To: >>"
-msgstr "Dla:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-#, fuzzy
-msgid "Cc: >>"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-#, fuzzy
-msgid "Bcc: >>"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 bajt"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bajtów"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fk"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Dodaj za³±cznik"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:332
-msgid "Remove"
-msgstr "Usuñ"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Usuwa wybrane elementy z listy za³±czników"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Dodaj za³±cznik..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Za³±cza plik do wiadomo¶ci"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr ""
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr ""
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr ""
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr "Kliknij tu aby zobaczyæ ksi±¿kê adresow±"
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "Dla:"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr "Podaj adres odbiorcy"
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Podaj adresy, pod które zostanie przes³ana kopia wiadomo¶ci"
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Podaj adresy, pod które zostanie przes³ana kopia wiadomo¶ci bez listy "
-"odbiorców."
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr "Temat:"
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr "Podaj temat wiadomo¶ci"
-
-#: composer/e-msg-composer.c:463
-msgid "Save as..."
-msgstr ""
-
-#: composer/e-msg-composer.c:474
-#, c-format
-msgid "Error saving file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:494
-#, c-format
-msgid "Error loading file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:513
-#, fuzzy
-msgid "Discard this message?"
-msgstr "Przesy³a te wiadomo¶æ"
-
-#: composer/e-msg-composer.c:561
-#, fuzzy
-msgid "Open file"
-msgstr "Otwórz katalog"
-
-#: composer/e-msg-composer.c:718
-msgid "Save in _folder..."
-msgstr "Zapisz w _katalogu..."
-
-#: composer/e-msg-composer.c:718
-msgid "Save the message in a specified folder"
-msgstr "Zapisuje wiadomo¶æ w podanym katalogu"
-
-#: composer/e-msg-composer.c:721 composer/e-msg-composer.c:763
-msgid "Send"
-msgstr "Wy¶lij"
-
-#: composer/e-msg-composer.c:721
-msgid "Send the message"
-msgstr "Wysy³a wiadomo¶æ"
-
-#: composer/e-msg-composer.c:733
-msgid "View _attachments"
-msgstr "Wy¶wietl _za³±czniki"
-
-#: composer/e-msg-composer.c:733
-msgid "View/hide attachments"
-msgstr "Wy¶wietla/ukrywa za³±czniki"
-
-#: composer/e-msg-composer.c:763
-msgid "Send this message"
-msgstr "Wy¶lij tê wiadomo¶æ"
-
-#: composer/e-msg-composer.c:766
-msgid "Cut selected region into the clipboard"
-msgstr "Wytnij zaznaczony obszar do schowka"
-
-#: composer/e-msg-composer.c:767
-msgid "Copy selected region into the clipboard"
-msgstr "Kopiuj zaznaczony obszar do schowka"
-
-#: composer/e-msg-composer.c:768
-msgid "Paste selected region into the clipboard"
-msgstr "Wklej zaznaczony obszar do schowka"
-
-#: composer/e-msg-composer.c:769
-msgid "Undo"
-msgstr "Cofnij"
-
-#: composer/e-msg-composer.c:769
-msgid "Undo last operation"
-msgstr "Cofa ostatni± operacjê"
-
-#: composer/e-msg-composer.c:772
-msgid "Attach"
-msgstr "Za³±cz"
-
-#: composer/e-msg-composer.c:772
-msgid "Attach a file"
-msgstr "Za³±cza plik"
-
-#: composer/e-msg-composer.c:948
-#, fuzzy
-msgid "Compose a message"
-msgstr "Tworzy now± wiadomo¶æ"
-
-#: filter/filter-editor.c:198
-msgid "Edit Filter"
-msgstr ""
-
-#: filter/filter-editor.c:198
-msgid "Create filter"
-msgstr ""
-
-#: filter/filter-editor.c:209
-msgid "Back"
-msgstr ""
-
-#: filter/filter-editor.c:211
-#, fuzzy
-msgid "Finish"
-msgstr "Znajd¼"
-
-#: filter/filter-editor.c:212
-msgid "Cancel"
-msgstr ""
-
-#: filter/filter-editor.c:216
-#, fuzzy
-msgid "Apply"
-msgstr "Odpowiedz"
-
-#: filter/filter-editor.c:233
-msgid ""
-"<h2>Create Filtering Rule</h2><p>Select one of the base rules above, then "
-"continue forwards to customise it.</p>"
-msgstr ""
-
-#: mail/component-factory.c:196
-#, fuzzy
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Nie mo¿na uruchomiæ pow³oki Evlution."
-
-#: mail/folder-browser-factory.c:29
-msgid "Get mail"
-msgstr "Pobierz pocztê"
-
-#: mail/folder-browser-factory.c:29
-msgid "Check for new mail"
-msgstr "Sprawd¼ pocztê"
-
-#: mail/folder-browser-factory.c:30
-msgid "Compose"
-msgstr ""
-
-#: mail/folder-browser-factory.c:30
-#, fuzzy
-msgid "Compose a new message"
-msgstr "Tworzy now± wiadomo¶æ"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply"
-msgstr "Odpowiedz"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply to the sender of this message"
-msgstr "Odpowiedz nadawcy tej wiadomo¶ci"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to All"
-msgstr "Odpowiedz wszystkim"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to all recipients of this message"
-msgstr "Odpowiedz dla wszystkich odbiorców tej wiadomo¶ci"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward"
-msgstr "Prze¶lij"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward this message"
-msgstr "Przesy³a te wiadomo¶æ"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Refile"
-msgstr "Otrzymane"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Move message to a new folder"
-msgstr "Zapisuje wiadomo¶æ w podanym katalogu"
-
-#: mail/folder-browser-factory.c:43
-msgid "Print the selected message"
-msgstr "Drukuje wybran± wiadomo¶æ"
-
-#: mail/folder-browser-factory.c:45
-msgid "Delete this message"
-msgstr "Usuwa tê wiadomo¶æ"
-
-#: mail/folder-browser-factory.c:65
-msgid "_Threaded Message List"
-msgstr ""
-
-#: mail/folder-browser-factory.c:77
-msgid "_Expunge"
-msgstr ""
-
-#: mail/folder-browser-factory.c:83
-msgid "_Filter Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:89
-msgid "_Virtual Folder Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:95
-msgid "_Mail Configuration ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:101
-msgid "Forget _Passwords"
-msgstr ""
-
-#: mail/mail-config.c:259
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-
-#: mail/mail-config.c:274
-msgid "Full name:"
-msgstr ""
-
-#: mail/mail-config.c:302
-msgid "Email address:"
-msgstr ""
-
-#: mail/mail-config.c:325
-msgid "Organization:"
-msgstr ""
-
-#: mail/mail-config.c:337
-msgid "Signature file:"
-msgstr ""
-
-#: mail/mail-config.c:342
-msgid "Signature File"
-msgstr ""
-
-#: mail/mail-config.c:699 mail/mail-config.c:790
-msgid "Server:"
-msgstr ""
-
-#: mail/mail-config.c:705
-msgid "Username:"
-msgstr ""
-
-#: mail/mail-config.c:711
-#, fuzzy
-msgid "Path:"
-msgstr "Wklej"
-
-#: mail/mail-config.c:717 mail/mail-config.c:796
-msgid "Authentication:"
-msgstr ""
-
-#: mail/mail-config.c:729 mail/mail-config.c:808
-msgid "Detect supported types..."
-msgstr ""
-
-#: mail/mail-config.c:755 mail/mail-config.c:830
-msgid "Test these values before continuing"
-msgstr ""
-
-#: mail/mail-config.c:937
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:955
-msgid "Select the method you would like to use to deliver your mail."
-msgstr ""
-
-#: mail/mail-config.c:1129 mail/mail-config.c:1208
-msgid "Mail Configuration"
-msgstr ""
-
-#. Identity page
-#: mail/mail-config.c:1146
-msgid "Identity"
-msgstr ""
-
-#. Source page
-#: mail/mail-config.c:1165
-#, fuzzy
-msgid "Mail Source"
-msgstr "G³ówne skróty"
-
-#. Transport page
-#: mail/mail-config.c:1186
-msgid "Mail Transport"
-msgstr ""
-
-#: mail/mail-config.c:1308
-msgid "Edit Identity"
-msgstr ""
-
-#: mail/mail-config.c:1310
-msgid "Add Identity"
-msgstr ""
-
-#: mail/mail-config.c:1453
-msgid "Edit Source"
-msgstr ""
-
-#: mail/mail-config.c:1455
-#, fuzzy
-msgid "Add Source"
-msgstr "Dodaj skrót"
-
-#: mail/mail-ops.c:372
-#, fuzzy
-msgid "Fetching mail"
-msgstr "Pobierz pocztê"
-
-#: mail/mail-ops.c:384
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-
-#: mail/mail-ops.c:732
-#, fuzzy
-msgid "Refile message(s) to"
-msgstr "Nowe wiadomo¶ci"
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr ""
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr ""
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr ""
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr ""
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr ""
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr ""
-
-#: mail/main.c:62
-msgid "Mail Component: I could not initialize Bonobo"
-msgstr "Obs³uga poczty: nie powiod³o siê uruchomienie Bonobo"
-
-#: mail/message-list.c:460
-msgid "Online Status"
-msgstr ""
-
-#: mail/message-list.c:488
-msgid "From"
-msgstr "Od"
-
-#: mail/message-list.c:495
-msgid "Subject"
-msgstr "Temat"
-
-#: mail/message-list.c:502
-#, fuzzy
-msgid "Date"
-msgstr "Wklej"
-
-#: mail/message-list.c:509
-#, fuzzy
-msgid "Received"
-msgstr "Otrzymane"
-
-#: mail/message-list.c:516
-msgid "To"
-msgstr "Dla"
-
-#: mail/message-list.c:523
-msgid "Size"
-msgstr "Rozmiar"
-
-#: shell/e-init.c:25
-msgid "Evolution can not create its local folders"
-msgstr "Evolution nie mo¿e utworzyæ swoich lokalnych katalogów"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr ""
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr ""
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr ""
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, fuzzy, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr "Zapisuje wiadomo¶æ w podanym katalogu"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:223
-#, fuzzy
-msgid "Evolution - Create new folder"
-msgstr "Evolution nie mo¿e utworzyæ swoich lokalnych katalogów"
-
-#: shell/e-shell-folder-selection-dialog.c:95
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:236
-#, fuzzy
-msgid "New..."
-msgstr "_Nowe"
-
-#: shell/e-shell-folder-title-bar.c:355
-msgid "(Untitled)"
-msgstr ""
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:110
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Bug buddy nie znajduje siê w ¶cie¿ce."
-
-#. same as above
-#: shell/e-shell-view-menu.c:116
-msgid "Bug buddy could not be run."
-msgstr "Nie mo¿na uruchomiæ Bug buddy."
-
-#: shell/e-shell-view-menu.c:159
-msgid "Evolution"
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:161
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:163
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution to pakiet aplikacji do komunikacji\n"
-"grupowej przez pocztê elektroniczn±, wspólny\n"
-"kalendarz i zarz±dzanie kontaktami w ¶rodowisku\n"
-"GNOME."
-
-#: shell/e-shell-view-menu.c:301
-#, fuzzy
-msgid "Go to folder..."
-msgstr "Zapisz w _katalogu..."
-
-#: shell/e-shell-view-menu.c:365
-msgid "_Folder"
-msgstr "_Katalog"
-
-#: shell/e-shell-view-menu.c:369
-msgid "Evolution _Bar Shortcut"
-msgstr "Pasek _skrótów Evolution"
-
-#: shell/e-shell-view-menu.c:375
-#, fuzzy
-msgid "_Mail message (FIXME)"
-msgstr "_Wiadomo¶æ pocztowa"
-
-#: shell/e-shell-view-menu.c:376 shell/e-shell-view-menu.c:379
-msgid "Composes a new mail message"
-msgstr "Tworzy now± wiadomo¶æ"
-
-#: shell/e-shell-view-menu.c:378
-#, fuzzy
-msgid "_Appointment (FIXME)"
-msgstr "_Spotkanie"
-
-#: shell/e-shell-view-menu.c:381
-#, fuzzy
-msgid "_Contact (FIXME)"
-msgstr "_Kontakt"
-
-#: shell/e-shell-view-menu.c:384
-msgid "_Task (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:387
-#, fuzzy
-msgid "Task _Request (FIXME)"
-msgstr "¯±danie zadania"
-
-#: shell/e-shell-view-menu.c:390
-#, fuzzy
-msgid "_Journal Entry (FIXME)"
-msgstr "Wpis _dziennika"
-
-#: shell/e-shell-view-menu.c:398
-msgid "_New"
-msgstr "_Nowe"
-
-#: shell/e-shell-view-menu.c:402
-#, fuzzy
-msgid "_Go to folder..."
-msgstr "Zapisz w _katalogu..."
-
-#: shell/e-shell-view-menu.c:402
-msgid "Display a different folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:404
-#, fuzzy
-msgid "_Create new folder..."
-msgstr "Zapisz w _katalogu..."
-
-#: shell/e-shell-view-menu.c:404
-msgid "Create a new folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:419
-#, fuzzy
-msgid "Show _shortcut bar"
-msgstr "Wy¶wietla/ukrywa pasek skrótów"
-
-#: shell/e-shell-view-menu.c:420
-#, fuzzy
-msgid "Show the shortcut bar"
-msgstr "Wy¶wietla/ukrywa pasek skrótów"
-
-#: shell/e-shell-view-menu.c:422
-msgid "Show _folder bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:423
-msgid "Show the folder bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:440
-msgid "Help _Index"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:443
-msgid "Getting _Started"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:446
-msgid "Using the _Mailer"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:449
-msgid "Using the _Calendar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:452
-msgid "Using the Cont_act Manager"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:457
-#, fuzzy
-msgid "_Submit bug report"
-msgstr "Wy¶lij raport o b³êdzie"
-
-#: shell/e-shell-view-menu.c:458
-msgid "Submit bug-report via bug-buddy"
-msgstr "Wysy³a raport o b³êdzie przez Bug buddy"
-
-#: shell/e-shell-view-menu.c:474
-msgid "_Actions"
-msgstr "_Czynno¶ci"
-
-#: shell/e-shell-view.c:113
-msgid "(No folder displayed)"
-msgstr ""
-
-#: shell/e-shell-view.c:208
-#, fuzzy
-msgid "Folders"
-msgstr "_Katalog"
-
-#: shell/e-shell-view.c:600
-#, fuzzy, c-format
-msgid "Evolution - %s"
-msgstr "Evolution"
-
-#: shell/e-shell.c:299
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Nie mo¿na ustawiæ lokalnego pojemnika -- %s"
-
-#: shell/e-shortcut.c:469
-msgid "New group"
-msgstr "Nowa grupa"
-
-#: shell/e-shortcuts-view.c:235
-#, fuzzy
-msgid "_Small icons"
-msgstr "Ma³e ikony"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:238
-#, fuzzy
-msgid "_Large icons"
-msgstr "Du¿e ikony"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate this shortcut"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:332
-#, fuzzy
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Usuñ z paska skrótów"
-
-#: shell/e-shortcuts.c:358
-#, fuzzy
-msgid "Error saving shortcuts."
-msgstr "G³ówne skróty"
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr ""
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr ""
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr ""
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr ""
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr ""
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr ""
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr ""
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr ""
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr ""
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr ""
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr ""
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr ""
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr ""
-
-#: shell/main.c:99
-#, fuzzy
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Cze¶æ. Dziêki za poswiêcenie chwili na ¶ci±gniêcie tej wersji\n"
-"wstêpnej pakietu do komunikacji grupowej Evolution.\n"
-"\n"
-"Zespó³ Evolution ciê¿ko pracowa³ nad stworzeniem tego programu\n"
-"tak rozszerzalnym, ³adnym, szybkim i dopasowanym do potrzeb\n"
-"zagorza³ych uzytkowników Internetu, jak to tylko mo¿liwe. Jeste¶my\n"
-"bardzo zmêczeni. Ale to jeszcze nie koniec -- jeszcze nie.\n"
-"Podczas odkrywania Evolution nale¿y pamiêtaæ, ¿e wiêkszo¶æ naszej pracy\n"
-"zosta³a po¶wiêcona silnikowi napêdzaj±cemu system, a nie interfejsowi\n"
-"u¿ytkownika. W ka¿dym razie od tej pory bêdziemy wk³adaæ wiêkszo¶æ\n"
-"naszej mi³o¶ci i troski w³a¶nie w interfejs. Ale przynajmniej wiadomo,\n"
-"¿e to nie jest demo.\n"
-"Pora na umycie r±czek. Evolution bêdzie: przewracaæ siê, gubiæ przesy³ki,\n"
-"mno¿yæ procesy, zjadaæ 100 mocy procesora, zawieszaæ siê, wysy³aæ\n"
-"przesy³ki w HTML-u na losowe listy dyskusyjne i zawstydzaæ Ciê\n"
-"przed Twoimi przyjació³mi i wspó³pracownikami. U¿ywaj na w³asn±\n"
-"odpowiedzialno¶æ.\n"
-"Mamy nadzieje, ¿e spodoba Ci siê efekt naszej ciê¿kiej pracy\n"
-"i niecierpliwie oczekujemy Twojej pomocy!\n"
-
-#: shell/main.c:126
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Dziêki\n"
-"Zespó³ Evolution\n"
-
-#: shell/main.c:172
-msgid "Cannot initialize the Evolution shell."
-msgstr "Nie mo¿na uruchomiæ pow³oki Evlution."
-
-#: shell/main.c:214
-#, fuzzy
-msgid "Cannot initialize the configuration system."
-msgstr "Nie mo¿na uruchomiæ pow³oki Evlution."
-
-#: shell/main.c:220
-#, fuzzy
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Nieudana próba uruchomienia systemu komponentów Bonobo"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-#, fuzzy
-msgid "Fields"
-msgstr "Znajd¼"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr ""
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr ""
-
-#: widgets/e-table/e-table-config.glade.h:10
-#, fuzzy
-msgid "Filter"
-msgstr "_Katalog"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-msgid "Field Chooser"
-msgstr ""
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr ""
-
-#: widgets/e-table/e-table-group.glade.h:13
-#, fuzzy
-msgid "<< Remove"
-msgstr "Usuñ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-#, fuzzy
-msgid "_Options"
-msgstr "_Czynno¶ci"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-#, fuzzy
-msgid "Meeting _start time:"
-msgstr "¯±danie spotkania"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-#, fuzzy
-msgid "Meeting _end time:"
-msgstr "¯±danie spotkania"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr ""
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr ""
-
-#: widgets/shortcut-bar/e-group-bar.c:633
-#, c-format
-msgid "Group %i"
-msgstr ""
-
-#~ msgid "Find messages"
-#~ msgstr "Znajduje wiadomo¶ci"
-
-#~ msgid "We are sorry, Evolution's Folder Browser can not be initialized."
-#~ msgstr "Przepraszamy, przegl±darka katalogów nie mo¿e zostaæ uruchomiona."
-
-#~ msgid "Whether a message preview should be shown"
-#~ msgstr "Czy wyswietlaæ podgl±d wiadomo¶ci"
-
-#~ msgid "_Task"
-#~ msgstr "_Zadanie"
-
-#~ msgid "_Selected Items"
-#~ msgstr "_Wybrane elementy"
-
-#~ msgid "_New Folder"
-#~ msgstr "_Nowy katalog"
-
-#~ msgid "_Open"
-#~ msgstr "_Otwórz"
-
-#~ msgid "Clos_e All Items"
-#~ msgstr "Z_amknij wszystko"
-
-#~ msgid "Closes all the open items"
-#~ msgstr "Zamyka wszystkie otwarte elementy"
-
-#~ msgid "_Toggle Shortcut Bar"
-#~ msgstr "Prze³±cz pasek skrótów"
-
-#~ msgid "_Toggle Treeview"
-#~ msgstr "Prze³±cz widok drzewa"
-
-#~ msgid "Toggles the tree view"
-#~ msgstr "Wy¶wietla/ukrywa widok drzewa"
-
-#~ msgid ""
-#~ "This is a development version of Evolution.\n"
-#~ "Using the mail component on your mail files\n"
-#~ "is extremely hazardous.\n"
-#~ "\n"
-#~ "Do not run this program on your real mail\n"
-#~ " and do not give it access to your real mail server.\n"
-#~ "\n"
-#~ "You have been warned\n"
-#~ msgstr ""
-#~ "Bie¿±ca wersja Evolution jest rozwojowa.\n"
-#~ "U¿ywanie obs³ugi poczty na twoich plikach jest\n"
-#~ "wysoce ryzykowne.\n"
-#~ "\n"
-#~ "Nie u¿ywaj tego programu do prawdziwej poczty\n"
-#~ " i nie dawaj dostepu do serwera poczty.\n"
-#~ "\n"
-#~ "Zosta³e¶ ostrze¿ony\n"
-
-#~ msgid "A folder containing mail items"
-#~ msgstr "Katalog zawieraj±cy przesy³ki pocztowe"
-
-#~ msgid "A folder containing contacts"
-#~ msgstr "Katalog zawieraj±cy kontakty"
-
-#~ msgid "A folder containing calendar entries"
-#~ msgstr "Katalog zawierajacy wpisy do kalendarza"
-
-#~ msgid "A folder containing tasks"
-#~ msgstr "Katalog zawieraj±cy zadania"
-
-#~ msgid "A service containing mail items"
-#~ msgstr "Us³uga zawieraj±ca przesy³ki pocztowe"
-
-#~ msgid "A service containing contacts"
-#~ msgstr "Us³uga zawieraj±ca kontakty"
-
-#~ msgid "A service containing calendar entries"
-#~ msgstr "Us³uga zawieraj±ca wpisy do kalendarza"
-
-#~ msgid "A service containing tasks"
-#~ msgstr "Us³uga zawierajaca zadania"
-
-#~ msgid "Add New Group"
-#~ msgstr "Dodaj now± grupê"
-
-#~ msgid "Remove Group"
-#~ msgstr "Usuñ grupê"
-
-#~ msgid "Rename Group"
-#~ msgstr "Zmieñ nazwê grupy"
-
-#~ msgid "Open in New Window"
-#~ msgstr "Otwórz w nowym oknie"
-
-#~ msgid "Advanced Find"
-#~ msgstr "Zaawansowane wyszukiwanie"
-
-#~ msgid "Rename Shortcut"
-#~ msgstr "Zmieñ nazwê skrótu"
-
-#~ msgid "Executive Summary"
-#~ msgstr "Podsumowanie"
-
-#~ msgid "Inbox"
-#~ msgstr "Skrzynka odbiorcza"
-
-#~ msgid "Sent messages"
-#~ msgstr "Wiadomo¶ci wys³ane"
-
-#~ msgid "Sent mail messages"
-#~ msgstr "Wys³ane wiadomo¶ci pocztowe"
-
-#~ msgid "Draft mail messages"
-#~ msgstr "Wiadomo¶ci w fazie roboczej"
-
-#~ msgid "Your contacts list"
-#~ msgstr "Twoja lista kontaktów"
-
-#~ msgid "Tasks list"
-#~ msgstr "Lista zadañ"
-
-#~ msgid "Other Shortcuts"
-#~ msgstr "Inne skróty"
-
-#~ msgid "Enables some debugging functions"
-#~ msgstr "W³±cz funkcje odpluskwiania"
-
-#~ msgid "LEVEL"
-#~ msgstr "POZIOM"
-
-#~ msgid ""
-#~ "It was not possible to setup the Evolution startup files. Please\n"
-#~ "fix the problem, and restart Evolution"
-#~ msgstr ""
-#~ "Nie by³o mo¿liwe ustawienie plików startowych Evolution. Proszê\n"
-#~ "usun±æ problem i ponownie uruchomiæ Evolution"
diff --git a/po/pt.po b/po/pt.po
deleted file mode 100644
index 988645d447..0000000000
--- a/po/pt.po
+++ /dev/null
@@ -1,2556 +0,0 @@
-# Portuguese translation of evolution.
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Tiago Antão <tiagoantao@bigfoot.com>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution 0.1\n"
-"POT-Creation-Date: 2000-06-20 14:27+0100\n"
-"PO-Revision-Date: 2000-04-16 16:33+01:00\n"
-"Last-Translator: Tiago Antão <tiagoantao@bigfoot.com>\n"
-"Language-Team: Gnome Portuguese <gnome@poli.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:57
-#: calendar/gui/evolution-calendar-control.c:64 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Não se consegui inicializar Bonobo"
-
-#: addressbook/contact-editor/e-contact-editor.c:578
-#: calendar/gui/event-editor.c:1118
-#, fuzzy
-msgid "FIXME: _Appointment"
-msgstr "_Compromisso"
-
-#: addressbook/contact-editor/e-contact-editor.c:579
-#: calendar/gui/event-editor.c:1119
-#, fuzzy
-msgid "FIXME: Meeting Re_quest"
-msgstr "Pedido de _encontro"
-
-#: addressbook/contact-editor/e-contact-editor.c:581
-#: calendar/gui/event-editor.c:1121
-#, fuzzy
-msgid "FIXME: _Mail Message"
-msgstr "Mensagem de _correio"
-
-#: addressbook/contact-editor/e-contact-editor.c:582
-#: calendar/gui/event-editor.c:1122
-#, fuzzy
-msgid "FIXME: _Contact"
-msgstr "_Contacto"
-
-#: addressbook/contact-editor/e-contact-editor.c:583
-#: calendar/gui/event-editor.c:1123
-msgid "FIXME: _Task"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:584
-#: calendar/gui/event-editor.c:1124
-#, fuzzy
-msgid "FIXME: Task _Request"
-msgstr "_Pedido de tarefa"
-
-#: addressbook/contact-editor/e-contact-editor.c:585
-#: calendar/gui/event-editor.c:1125
-#, fuzzy
-msgid "FIXME: _Journal Entry"
-msgstr "_Entrada diária?"
-
-#: addressbook/contact-editor/e-contact-editor.c:586
-#: calendar/gui/event-editor.c:1126
-msgid "FIXME: _Note"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:588
-#: addressbook/contact-editor/e-contact-editor.c:693
-#: calendar/gui/event-editor.c:1128 calendar/gui/event-editor.c:1235
-msgid "FIXME: Ch_oose Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:593
-#: calendar/gui/event-editor.c:1133
-msgid "FIXME: _Memo Style"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:595
-#: calendar/gui/event-editor.c:1135
-msgid "FIXME: Define Print _Styles..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:602
-#: calendar/gui/event-editor.c:1142
-msgid "FIXME: S_end"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:606
-#: calendar/gui/event-editor.c:1146
-#, fuzzy
-msgid "FIXME: Save Attac_hments..."
-msgstr "Adicionar anexo..."
-
-#: addressbook/contact-editor/e-contact-editor.c:608
-#: calendar/gui/event-editor.c:1148
-msgid "FIXME: _Delete"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:609
-#: calendar/gui/event-editor.c:1149
-msgid "FIXME: _Move to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:610
-#: calendar/gui/event-editor.c:1150
-msgid "FIXME: Cop_y to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:612
-#: calendar/gui/event-editor.c:1152
-msgid "Page Set_up"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:613
-#: calendar/gui/event-editor.c:1153
-msgid "FIXME: Print Pre_view"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:634
-#: calendar/gui/event-editor.c:1174
-msgid "FIXME: Paste _Special..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:639
-#: calendar/gui/event-editor.c:1179
-msgid "FIXME: Mark as U_nread"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/event-editor.c:1183
-msgid "_Object"
-msgstr "_Objecto"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: addressbook/contact-editor/e-contact-editor.c:655
-#: calendar/gui/event-editor.c:1188 calendar/gui/event-editor.c:1195
-msgid "FIXME: _Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: addressbook/contact-editor/e-contact-editor.c:656
-#: calendar/gui/event-editor.c:1189 calendar/gui/event-editor.c:1196
-msgid "FIXME: _Unread Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/event-editor.c:1190
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:657
-#: calendar/gui/event-editor.c:1197
-msgid "FIXME: _Last Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:662
-#: calendar/gui/event-editor.c:1202
-msgid "FIXME: _Standard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:664
-#: calendar/gui/event-editor.c:1204
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/event-editor.c:1207
-msgid "FIXME: _Customize..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:672
-#: calendar/gui/event-editor.c:1212
-msgid "Pre_vious"
-msgstr "An_terior"
-
-#: addressbook/contact-editor/e-contact-editor.c:673
-#: calendar/gui/event-editor.c:1213
-msgid "Ne_xt"
-msgstr "Pró_ximo"
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/event-editor.c:1217
-msgid "_Toolbars"
-msgstr "_Ferramentas"
-
-#: addressbook/contact-editor/e-contact-editor.c:680
-#: calendar/gui/event-editor.c:1222
-msgid "FIXME: _File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:681
-#: calendar/gui/event-editor.c:1223
-msgid "FIXME: It_em..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:682
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: _Object..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:687
-#: calendar/gui/event-editor.c:1229
-msgid "FIXME: _Font..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:688
-#: calendar/gui/event-editor.c:1230
-msgid "FIXME: _Paragraph..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:695
-#: calendar/gui/event-editor.c:1237
-msgid "FIXME: Desi_gn This Form"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:696
-#: calendar/gui/event-editor.c:1238
-msgid "FIXME: D_esign a Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:698
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Publish _Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1241
-msgid "FIXME: Pu_blish Form As..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:701
-#: calendar/gui/event-editor.c:1243
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:706
-#: calendar/gui/event-editor.c:1248
-msgid "FIXME: _Spelling..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/event-editor.c:1253
-#, fuzzy
-msgid "_Forms"
-msgstr "_Pasta"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-msgid "FIXME: _New Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-msgid "FIXME: New _Contact from Same Company"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:716
-msgid "FIXME: New _Letter to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:717
-msgid "FIXME: New _Message to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:718
-msgid "FIXME: New Meetin_g with Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:719
-msgid "FIXME: _Plan a Meeting..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:720
-msgid "FIXME: New _Task for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:721
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:723
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:724
-msgid "FIXME: _Display Map of Address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:725
-msgid "FIXME: _Open Web Page"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-msgid "FIXME: Forward as _vCard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:728
-#: calendar/gui/event-editor.c:1266
-msgid "FIXME: For_ward"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/event-editor.c:1279
-msgid "_Insert"
-msgstr "_Inserir"
-
-#: addressbook/contact-editor/e-contact-editor.c:741
-#: calendar/gui/event-editor.c:1280
-msgid "F_ormat"
-msgstr "F_ormato"
-
-#. FIXME: add Favorites here
-#: addressbook/contact-editor/e-contact-editor.c:742
-#: calendar/gui/event-editor.c:1281 shell/e-shell-view-menu.c:468
-msgid "_Tools"
-msgstr "_Ferramentas"
-
-#: addressbook/contact-editor/e-contact-editor.c:743
-#: calendar/gui/event-editor.c:1282
-msgid "Actio_ns"
-msgstr "_Acções"
-
-#: addressbook/contact-editor/e-contact-editor.c:774
-#: calendar/gui/event-editor.c:1320
-msgid "FIXME: Save and Close"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:775
-#: calendar/gui/event-editor.c:1321
-msgid "Save the appointment and close the dialog box"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-#: calendar/gui/event-editor.c:1325
-msgid "FIXME: Print..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:780
-#: calendar/gui/event-editor.c:1326
-msgid "Print this item"
-msgstr "Imprimir este item"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-#: calendar/gui/event-editor.c:1327
-msgid "FIXME: Insert File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-#: calendar/gui/event-editor.c:1328
-msgid "Insert a file as an attachment"
-msgstr "Inserir ficheiro como anexo"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-#: calendar/gui/event-editor.c:1330
-msgid "FIXME: Recurrence..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-#: calendar/gui/event-editor.c:1331
-msgid "Configure recurrence rules"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:787
-#: calendar/gui/event-editor.c:1333
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-#: calendar/gui/event-editor.c:1334
-msgid "Invite attendees to a meeting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-#: calendar/gui/event-editor.c:1336
-msgid "FIXME: Delete"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:791
-#: calendar/gui/event-editor.c:1337 calendar/gui/gncal-todo.c:322
-msgid "Delete this item"
-msgstr "Apagar este item"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1339
-msgid "FIXME: Previous"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:794
-#: calendar/gui/event-editor.c:1340
-msgid "Go to the previous item"
-msgstr "Ir para o item anterior"
-
-#: addressbook/contact-editor/e-contact-editor.c:795
-#: calendar/gui/event-editor.c:1341
-msgid "FIXME: Next"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:796
-#: calendar/gui/event-editor.c:1342
-msgid "Go to the next item"
-msgstr "Ir para o próximo item"
-
-#: addressbook/contact-editor/e-contact-editor.c:797
-#: calendar/gui/event-editor.c:1343
-msgid "FIXME: Help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:798
-#: calendar/gui/event-editor.c:1344
-msgid "See online help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1213
-msgid "Assistant"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1214
-#: addressbook/contact-editor/e-contact-editor.c:1318
-msgid "Business"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1215
-msgid "Business 2"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1216
-msgid "Business Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1217
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1218
-msgid "Car"
-msgstr "Carro"
-
-#: addressbook/contact-editor/e-contact-editor.c:1219
-msgid "Company"
-msgstr "Empresa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1220
-#: addressbook/contact-editor/e-contact-editor.c:1319
-msgid "Home"
-msgstr "Casa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1221
-msgid "Home 2"
-msgstr "Casa 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1222
-msgid "Home Fax"
-msgstr "Fax de casa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1223
-msgid "ISDN"
-msgstr "RDIS"
-
-#: addressbook/contact-editor/e-contact-editor.c:1224
-msgid "Mobile"
-msgstr "Telemóvel"
-
-#: addressbook/contact-editor/e-contact-editor.c:1225
-#: addressbook/contact-editor/e-contact-editor.c:1320 mail/mail-config.c:2039
-msgid "Other"
-msgstr "Outro"
-
-#: addressbook/contact-editor/e-contact-editor.c:1226
-msgid "Other Fax"
-msgstr "Outro Fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1227
-msgid "Pager"
-msgstr "Bip"
-
-#: addressbook/contact-editor/e-contact-editor.c:1228
-msgid "Primary"
-msgstr "Primário"
-
-#: addressbook/contact-editor/e-contact-editor.c:1229
-msgid "Radio"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1230
-msgid "Telex"
-msgstr "Telex"
-
-#: addressbook/contact-editor/e-contact-editor.c:1231
-msgid "TTY/TDD"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1275
-msgid "Primary Email"
-msgstr "Endereço principal de correio electrónico"
-
-#: addressbook/contact-editor/e-contact-editor.c:1276
-msgid "Email 2"
-msgstr "Correio electrónico 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1277
-msgid "Email 3"
-msgstr "Correio electrónico 3"
-
-#: addressbook/gui/component/addressbook.c:417 mail/message-list.c:628
-msgid "To"
-msgstr "Para"
-
-#: addressbook/gui/component/addressbook.c:418 mail/message-list.c:600
-msgid "From"
-msgstr "De"
-
-#: addressbook/gui/component/addressbook.c:419
-msgid "Cc"
-msgstr "Cc"
-
-#: addressbook/gui/component/addressbook.c:424
-#: calendar/gui/calendar-commands.c:544
-msgid "New"
-msgstr "Novo"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Create a new contact"
-msgstr "Criar um novo contacto"
-
-#: addressbook/gui/component/addressbook.c:428
-#: mail/folder-browser-factory.c:37
-msgid "Find"
-msgstr "Encontrar"
-
-#: addressbook/gui/component/addressbook.c:428
-msgid "Find a contact"
-msgstr "Encontrar um contacto"
-
-#: addressbook/gui/component/addressbook.c:429
-#: addressbook/gui/component/addressbook.c:496
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:48
-msgid "Print"
-msgstr "Imprimir"
-
-#: addressbook/gui/component/addressbook.c:429
-msgid "Print contacts"
-msgstr "Imprimir contactos"
-
-#. Delete
-#: addressbook/gui/component/addressbook.c:430 calendar/gui/gncal-todo.c:494
-#: mail/folder-browser-factory.c:50 mail/mail-config.c:1865
-#: mail/mail-config.c:1961
-msgid "Delete"
-msgstr "Apagar"
-
-#: addressbook/gui/component/addressbook.c:430
-msgid "Delete a contact"
-msgstr "Apagar um contacto"
-
-#: addressbook/gui/component/addressbook.c:503
-msgid "Test Select Names"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:510
-#: addressbook/gui/component/addressbook.c:1052
-msgid "As _Table"
-msgstr "Como _Tabela"
-
-#: addressbook/gui/component/addressbook.c:517
-msgid "_New Contact"
-msgstr "_Novo Contacto"
-
-#: addressbook/gui/component/addressbook.c:525
-msgid "N_ew Directory Server"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:604
-msgid "Unable to open addressbook"
-msgstr "Impossível abrir o livro de endereços"
-
-#: addressbook/gui/component/addressbook.c:609
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:960
-#: addressbook/gui/minicard/e-minicard.c:329
-msgid "Save as VCard"
-msgstr "Gravar como VCard"
-
-#: addressbook/gui/component/addressbook.c:1059
-msgid "As _Minicards"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:1110
-msgid "The URI that the Folder Browser will display"
-msgstr "O URI que o navegador de pastas mostrará"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:544
-msgid "am"
-msgstr "am"
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:543
-msgid "pm"
-msgstr "pm"
-
-#: calendar/cal-util/timeutil.c:98
-msgid "h"
-msgstr "h"
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr "Cabeçalhos:"
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr "Dias vazios:"
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Appointments:"
-msgstr "Compromissos:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr "Calendário do Gnome"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr "Ficheiro não encontrado"
-
-#: calendar/gui/calendar-commands.c:456
-msgid "Open calendar"
-msgstr "Abrir calendário"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Save calendar"
-msgstr "Gravar calendário"
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:708
-#: calendar/gui/gncal-todo.c:712
-msgid "Day"
-msgstr "Dia"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr "Mostrar 1 dia"
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr "5 Dias"
-
-#: calendar/gui/calendar-commands.c:525
-msgid "Show the working week"
-msgstr "Mostrar a semana de trabalho"
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:707
-msgid "Week"
-msgstr "Semana"
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr "Mostrar 1 semana"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Month"
-msgstr "Mês"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr "Mostrar 1 mês"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Year"
-msgstr "Ano"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr "Mostrar 1 ano"
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:690
-msgid "Create a new appointment"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-msgid "Print this calendar"
-msgstr "Imprimir este calendário"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Prev"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Today"
-msgstr "Hoje"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Next"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr "Ir para"
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr "Ir para uma data específica"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-msgid "New Ca_lendar"
-msgstr "Novo Ca_lendário"
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr "Criar um novo calendário"
-
-#: calendar/gui/calendar-commands.c:663
-msgid "Open Ca_lendar"
-msgstr "Abrir Ca_lendário"
-
-#: calendar/gui/calendar-commands.c:664
-msgid "Open a calendar"
-msgstr "Abrir um calendário"
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-msgid "Save Calendar As"
-msgstr "Guardar Calendário como"
-
-#: calendar/gui/calendar-commands.c:673
-msgid "Print..."
-msgstr "Imprimir..."
-
-#: calendar/gui/calendar-commands.c:679
-msgid "_Close Calendar"
-msgstr "_Fechar Calendário"
-
-#: calendar/gui/calendar-commands.c:680
-msgid "Close current calendar"
-msgstr "Fechar o calendário corrente"
-
-#: calendar/gui/calendar-commands.c:690
-msgid "_New appointment..."
-msgstr "_Novo compromisso..."
-
-#: calendar/gui/calendar-commands.c:695
-msgid "New appointment for _today..."
-msgstr "Novo compromisso para _hoje..."
-
-#: calendar/gui/calendar-commands.c:696
-msgid "Create a new appointment for today"
-msgstr "Criar um novo compromisso para hoje"
-
-#: calendar/gui/calendar-commands.c:704 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr "Preferências"
-
-#: calendar/gui/calendar-commands.c:711 calendar/gui/calendar-commands.c:712
-msgid "About Calendar"
-msgstr "Sobre o calendário"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:754
-#, c-format
-msgid "%s%s"
-msgstr "%s%s"
-
-#: calendar/gui/calendar-commands.c:754
-#, fuzzy
-msgid "'s calendar"
-msgstr "O seu calendário"
-
-#. This array must be in the same order as enumerations
-#. in GnomePilotConduitSyncType as they are used as index.
-#. Custom type implies Disabled state.
-#.
-#: calendar/gui/calendar-conduit-control-applet.c:51
-msgid "Disabled"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:52
-msgid "Synchronize"
-msgstr "Sincronizar"
-
-#: calendar/gui/calendar-conduit-control-applet.c:53
-msgid "Copy From Pilot"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:54
-msgid "Copy To Pilot"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:55
-msgid "Merge From Pilot"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:56
-msgid "Merge To Pilot"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:142
-#: calendar/gui/todo-conduit-control-applet.c:110
-msgid "Eskil Heyn Olsen <deity@eskil.dk>"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:144
-msgid "GnomeCalendar Conduit"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:145
-msgid "(C) 1998"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:147
-msgid "Configuration utility for the calendar conduit.\n"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:148
-msgid "gnome-calendar-conduit.png"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:190
-msgid "Synchronize Action"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:261
-#: calendar/gui/todo-conduit-control-applet.c:194
-msgid "Conduit state"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:305
-#: calendar/gui/calendar-conduit-control-applet.c:316
-#: calendar/gui/todo-conduit-control-applet.c:235
-#: calendar/gui/todo-conduit-control-applet.c:246
-msgid ""
-"No pilot configured, please choose the\n"
-"'Pilot Link Properties' capplet first."
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:332
-#: calendar/gui/calendar-conduit-control-applet.c:333
-#: calendar/gui/todo-conduit-control-applet.c:265
-#: calendar/gui/todo-conduit-control-applet.c:266
-msgid "Cannot initialze the GnomePilot Daemon"
-msgstr ""
-
-#: calendar/gui/calendar-conduit-control-applet.c:339
-#: calendar/gui/calendar-conduit-control-applet.c:340
-#: calendar/gui/todo-conduit-control-applet.c:272
-#: calendar/gui/todo-conduit-control-applet.c:273
-msgid "Cannot connect to the GnomePilot Daemon"
-msgstr ""
-
-#: calendar/gui/calendar-conduit.c:116 calendar/gui/calendar-conduit.c:156
-#: calendar/gui/calendar-conduit.c:239 calendar/gui/calendar-conduit.c:279
-#: calendar/gui/calendar-conduit.c:501 calendar/gui/calendar-conduit.c:542
-#: calendar/gui/calendar-conduit.c:858 calendar/gui/calendar-conduit.c:910
-#: calendar/gui/calendar-conduit.c:1332
-msgid "Error while communicating with calendar server"
-msgstr ""
-
-#: calendar/gui/calendar-conduit.c:546
-#, c-format
-msgid "Calendar holds %d entries"
-msgstr ""
-
-#: calendar/gui/calendar-conduit.c:568 calendar/gui/calendar-conduit.c:570
-msgid "Could not start gnomecal server"
-msgstr ""
-
-#: calendar/gui/calendar-conduit.c:598 calendar/gui/calendar-conduit.c:601
-msgid "Could not read pilot's DateBook application block"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:60
-msgid "Specifies the port on which the Pilot is"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:60
-msgid "PORT"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:62
-msgid "If you want to debug the attributes on records"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:64
-msgid "Only syncs from desktop to pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:66
-msgid "Only syncs from pilot to desktop"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:89
-msgid "Can not create Pilot socket\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:96
-#, c-format
-msgid "Can not bind to device %s\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:99
-msgid "Failed to get a connection from the Pilot device"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:102
-msgid "pi_accept failed"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:167
-msgid "\tObject did not exist, creating a new one\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:174
-msgid ""
-"\tObject has been modified on desktop and on the pilot, desktop takes "
-"precedence\n"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:475
-msgid "No description"
-msgstr "Nenhuma descrição"
-
-#: calendar/gui/calendar-pilot-sync.c:547
-msgid "Syncing with the pilot..."
-msgstr "Sincronizando com o pilot..."
-
-#: calendar/gui/calendar-pilot-sync.c:554
-msgid "Could not open DatebookDB on the Pilot"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:555
-msgid "Unable to open DatebookDB"
-msgstr ""
-
-#: calendar/gui/calendar-pilot-sync.c:617
-msgid "Synced DateBook from Pilot to GnomeCal"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr "26º"
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr "27º"
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr "28º"
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr "29º"
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr "30º"
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr "31º"
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr "Do"
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr "Sg"
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr "Te"
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr "Qa"
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr "Qi"
-
-#: calendar/gui/print.c:326
-msgid "Fr"
-msgstr "Sx"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr "Sá"
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr ""
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr ""
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr ""
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr ""
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr ""
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr "Mês corrente (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr "Ano corrente (%Y)"
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr "Imprimir calendário"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr "Prever impressão"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2248 calendar/gui/e-day-view.c:2255
-#: calendar/gui/e-day-view.c:2264 calendar/gui/e-week-view.c:2625
-#: calendar/gui/e-week-view.c:2632 calendar/gui/e-week-view.c:2641
-msgid "New appointment..."
-msgstr "Novo compromisso"
-
-#: calendar/gui/e-day-view.c:2252 calendar/gui/e-day-view.c:2259
-#: calendar/gui/e-week-view.c:2629 calendar/gui/e-week-view.c:2636
-msgid "Edit this appointment..."
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2253 calendar/gui/e-week-view.c:2630
-msgid "Delete this appointment"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2260 calendar/gui/e-week-view.c:2637
-msgid "Make this appointment movable"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2261 calendar/gui/e-week-view.c:2638
-msgid "Delete this occurrence"
-msgstr "Apagar esta ocurrência"
-
-#: calendar/gui/e-day-view.c:2262 calendar/gui/e-week-view.c:2639
-msgid "Delete all occurrences"
-msgstr "Apagar todas as ocurrências"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "Ano:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr ""
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr ""
-
-#: calendar/gui/control-factory.c:136
-#: calendar/gui/evolution-calendar-control.c:131
-msgid "The URI that the calendar will display"
-msgstr "O URI que o calendário mostrará"
-
-#: calendar/gui/gncal-todo.c:135
-msgid "Create to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:135
-msgid "Edit to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:169
-msgid "Summary:"
-msgstr "Sumário:"
-
-#: calendar/gui/gncal-todo.c:179
-msgid "Due Date:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:188
-msgid "Priority:"
-msgstr "Prioridade:"
-
-#: calendar/gui/gncal-todo.c:204
-msgid "Item Comments:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:320
-msgid "Add to-do item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:321
-msgid "Edit this item..."
-msgstr "Editar este item..."
-
-#: calendar/gui/gncal-todo.c:420
-msgid "Summary"
-msgstr "Sumário"
-
-#: calendar/gui/gncal-todo.c:421 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:422 calendar/gui/prop.c:605
-#: mail/message-list.c:586
-msgid "Priority"
-msgstr "Prioridade"
-
-#: calendar/gui/gncal-todo.c:423
-msgid "Time Left"
-msgstr ""
-
-#. Label
-#: calendar/gui/gncal-todo.c:435
-#, fuzzy
-msgid "To-do list"
-msgstr "_Ferramentas"
-
-#. Add
-#: calendar/gui/gncal-todo.c:474
-msgid "Add..."
-msgstr "Adicionar..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:483
-msgid "Edit..."
-msgstr "Editar..."
-
-#: calendar/gui/gncal-todo.c:707
-msgid "Weeks"
-msgstr "Semanas"
-
-#: calendar/gui/gncal-todo.c:708 calendar/gui/gncal-todo.c:712
-msgid "Days"
-msgstr "DiasRascunhos"
-
-#: calendar/gui/gncal-todo.c:713 calendar/gui/gncal-todo.c:717
-msgid "Hours"
-msgstr "Horas"
-
-#: calendar/gui/gncal-todo.c:713 calendar/gui/gncal-todo.c:717
-msgid "Hour"
-msgstr "Hora"
-
-#: calendar/gui/gncal-todo.c:718 calendar/gui/gncal-todo.c:722
-msgid "Minutes"
-msgstr "Minutos"
-
-#: calendar/gui/gncal-todo.c:718 calendar/gui/gncal-todo.c:722
-msgid "Minute"
-msgstr "Minuto"
-
-#: calendar/gui/gncal-todo.c:723 calendar/gui/gncal-todo.c:727
-msgid "Seconds"
-msgstr "Segundos"
-
-#: calendar/gui/gncal-todo.c:723 calendar/gui/gncal-todo.c:727
-msgid "Second"
-msgstr "Segundo"
-
-#: calendar/gui/gnome-cal.c:442 calendar/gui/gnome-cal.c:1081
-#: calendar/gui/gnome-cal.c:1137
-msgid "Reminder of your appointment at "
-msgstr ""
-
-#: calendar/gui/gnome-cal.c:1073
-#, fuzzy
-msgid "Snooze"
-msgstr "Tamanho"
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1086 calendar/gui/gnome-cal.c:1141
-msgid "Ok"
-msgstr "Ok"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "Dom"
-
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "Seg"
-
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "Ter"
-
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "Qua"
-
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "Qui"
-
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "Sex"
-
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "Sáb"
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr ""
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr ""
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr "12 horas (AM/PM)"
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr "24 horas"
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr ""
-
-#: calendar/gui/prop.c:347
-msgid "Sunday"
-msgstr "Domingo"
-
-#: calendar/gui/prop.c:348
-msgid "Monday"
-msgstr "Segunda-feira"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr ""
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr ""
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr ""
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr ""
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr "Cores"
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr ""
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr ""
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr ""
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr ""
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr ""
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr ""
-
-#: calendar/gui/prop.c:678
-#, fuzzy
-msgid "To Do List Properties"
-msgstr "Propriedades"
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr ""
-
-#: calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr "Alarmes"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-msgid "Alarm Properties"
-msgstr "Propriedades do alarme"
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr ""
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr " segundos"
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr ""
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-msgid "Defaults"
-msgstr ""
-
-#: calendar/gui/todo-conduit-control-applet.c:112
-msgid "Gpilotd todo conduit"
-msgstr ""
-
-#: calendar/gui/todo-conduit-control-applet.c:113
-msgid "(C) 1998 the Free Software Foundation"
-msgstr "(C) 1998 Free Software Foundation"
-
-#: calendar/gui/todo-conduit-control-applet.c:115
-msgid "Configuration utility for the todo conduit.\n"
-msgstr ""
-
-#: calendar/gui/todo-conduit-control-applet.c:116
-msgid "gnome-unknown.xpm"
-msgstr "gnome-unknown.xpm"
-
-#: calendar/gui/todo-conduit-control-applet.c:141
-msgid "Enabled"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/event-editor.c:289
-msgid "Edit Appointment"
-msgstr "_Editar Compromisso"
-
-#: calendar/gui/event-editor.c:294
-msgid "No summary"
-msgstr "Nenhum sumário"
-
-#: calendar/gui/event-editor.c:298
-#, c-format
-msgid "Appointment - %s"
-msgstr "Compromisso - %s"
-
-#: calendar/gui/event-editor.c:301
-#, c-format
-msgid "Task - %s"
-msgstr "Tarefa - %s"
-
-#: calendar/gui/event-editor.c:304
-#, fuzzy, c-format
-msgid "Journal entry - %s"
-msgstr "_Entrada diária?"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:594 calendar/gui/event-editor.c:688
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1215
-msgid "FIXME: Ca_lendar..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1250
-msgid "FIXME: Chec_k Names"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1251
-msgid "FIXME: Address _Book..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1258
-#, fuzzy
-msgid "FIXME: _New Appointment"
-msgstr "_Compromisso"
-
-#: calendar/gui/event-editor.c:1260
-msgid "FIXME: Rec_urrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1262
-msgid "FIXME: Intive _Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1263
-msgid "FIXME: C_ancel Invitation..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Forward as v_Calendar"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1745
-msgid "%a %b %d %Y"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.c:183 composer/e-msg-composer.c:690
-msgid "Cut"
-msgstr "Cortar"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "Cortar item seleccionado para a área de transferência"
-
-#: composer/e-msg-composer-address-dialog.c:187 composer/e-msg-composer.c:691
-msgid "Copy"
-msgstr "Copiar"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "Copiar item seleccionada para a área de transferência"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199 composer/e-msg-composer.c:692
-msgid "Paste"
-msgstr "Colar"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Colar item da área de transferência"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "Seleccionar o endereço dos receptores"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bytes"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Adicionar anexo"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:332
-msgid "Remove"
-msgstr "Remover"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Remover items seleccionados da lista de anexos"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Adicionar anexo..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Anexar um ficheiro à mensagem"
-
-#: composer/e-msg-composer-hdrs.c:89
-msgid "Click here for the address book"
-msgstr "Pressione aqui para o livro de endereços"
-
-#: composer/e-msg-composer-hdrs.c:124
-msgid "To:"
-msgstr "Para:"
-
-#: composer/e-msg-composer-hdrs.c:125
-msgid "Enter the recipients of the message"
-msgstr "Introduza os receptores da mensagem"
-
-#: composer/e-msg-composer-hdrs.c:129
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:130
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Entre os endereços que irão receber uma cópia da mensagem"
-
-#: composer/e-msg-composer-hdrs.c:135
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:136
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Entre os endereços que irão receber uma cópia da mensagem sem conhecimento "
-"do receptor"
-
-#: composer/e-msg-composer-hdrs.c:142
-msgid "Subject:"
-msgstr "Assunto:"
-
-#: composer/e-msg-composer-hdrs.c:143
-msgid "Enter the subject of the mail"
-msgstr "Introduza o assunto da carta"
-
-#: composer/e-msg-composer.c:492
-msgid "Open file"
-msgstr "Abrir ficheiro"
-
-#: composer/e-msg-composer.c:502
-#, c-format
-msgid "Error loading file: %s"
-msgstr ""
-
-#: composer/e-msg-composer.c:543
-msgid "Discard this message?"
-msgstr "Descartar esta mensagem?"
-
-#: composer/e-msg-composer.c:648
-msgid "Save in _folder..."
-msgstr "Gravar na _pasta..."
-
-#: composer/e-msg-composer.c:648
-msgid "Save the message in a specified folder"
-msgstr "Gravar a mensagem na pasta especificada"
-
-#: composer/e-msg-composer.c:651 composer/e-msg-composer.c:688
-#: mail/folder-browser-factory.c:36
-msgid "Send"
-msgstr "Enviar"
-
-#: composer/e-msg-composer.c:651
-msgid "Send the message"
-msgstr "Enviar a mensagem"
-
-#: composer/e-msg-composer.c:659
-msgid "View _attachments"
-msgstr "Ver _anexos"
-
-#: composer/e-msg-composer.c:659
-msgid "View/hide attachments"
-msgstr "Ver/esconder anexos"
-
-#: composer/e-msg-composer.c:688
-msgid "Send this message"
-msgstr "Enviar esta mensagem"
-
-#: composer/e-msg-composer.c:690
-msgid "Cut selected region into the clipboard"
-msgstr "Cortar a região seleccionada para a área de transferência"
-
-#: composer/e-msg-composer.c:691
-msgid "Copy selected region into the clipboard"
-msgstr "Copiar a região seleccionada para a área de transferência"
-
-#: composer/e-msg-composer.c:692
-msgid "Paste selected region into the clipboard"
-msgstr "Colar a região seleccionada para a área de transferência"
-
-#: composer/e-msg-composer.c:693
-msgid "Undo"
-msgstr "Anular"
-
-#: composer/e-msg-composer.c:693
-msgid "Undo last operation"
-msgstr "Anular a última operação"
-
-#: composer/e-msg-composer.c:695
-msgid "Attach"
-msgstr "Anexar"
-
-#: composer/e-msg-composer.c:695
-msgid "Attach a file"
-msgstr "Anexar um ficheiro"
-
-#: composer/e-msg-composer.c:857
-msgid "Compose a message"
-msgstr "Criar uma nova mensagem"
-
-#: mail/folder-browser-factory.c:35
-msgid "Get mail"
-msgstr ""
-
-#: mail/folder-browser-factory.c:35
-msgid "Check for new mail"
-msgstr "Verificar novo correio"
-
-#: mail/folder-browser-factory.c:36
-msgid "Send a new message"
-msgstr "Enviar uma nova mensagem"
-
-#: mail/folder-browser-factory.c:37
-msgid "Find messages"
-msgstr "Encontrar mensagens"
-
-#: mail/folder-browser-factory.c:41
-msgid "Reply"
-msgstr "Responder"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Reply to the sender of this message"
-msgstr "Responder ao emissor desta mensagem"
-
-#: mail/folder-browser-factory.c:42
-msgid "Reply to All"
-msgstr "Reponder para todos"
-
-#: mail/folder-browser-factory.c:42
-msgid "Reply to all recipients of this message"
-msgstr "Reponder a todos receptores da mensagem"
-
-#: mail/folder-browser-factory.c:44
-msgid "Forward"
-msgstr ""
-
-#: mail/folder-browser-factory.c:44
-#, fuzzy
-msgid "Forward this message"
-msgstr "Enviar esta mensagem"
-
-#: mail/folder-browser-factory.c:48
-#, fuzzy
-msgid "Print the selected message"
-msgstr "Imprimir a mensagem seleccionada"
-
-#: mail/folder-browser-factory.c:50
-#, fuzzy
-msgid "Delete this message"
-msgstr "Enviar esta mensagem"
-
-#: mail/folder-browser-factory.c:69
-msgid "_Expunge"
-msgstr ""
-
-#: mail/folder-browser-factory.c:75
-msgid "_Filter Druid ..."
-msgstr "Druída dos _filtros"
-
-#: mail/folder-browser-factory.c:81
-msgid "_Virtual Folder Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:87
-msgid "_Mail Configuration ..."
-msgstr "Configuração do co_rreio..."
-
-#: mail/folder-browser-factory.c:93
-msgid "Forget _Passwords"
-msgstr "Esquecer _Senhas"
-
-#: mail/mail-config.c:258
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-
-#: mail/mail-config.c:273
-msgid "Full name:"
-msgstr "Nome completo:"
-
-#: mail/mail-config.c:301
-msgid "Email address:"
-msgstr "Endereço de correio:"
-
-#: mail/mail-config.c:324
-msgid "Organization:"
-msgstr "Organização:"
-
-#: mail/mail-config.c:336
-msgid "Signature file:"
-msgstr "Ficheiro com assinatura:"
-
-#: mail/mail-config.c:341
-msgid "Signature File"
-msgstr ""
-
-#: mail/mail-config.c:698 mail/mail-config.c:789
-msgid "Server:"
-msgstr "Servidor:"
-
-#: mail/mail-config.c:704
-msgid "Username:"
-msgstr "Utilizador:"
-
-#: mail/mail-config.c:710
-msgid "Path:"
-msgstr "Caminho"
-
-#: mail/mail-config.c:716 mail/mail-config.c:795
-msgid "Authentication:"
-msgstr "Autenticação"
-
-#: mail/mail-config.c:728 mail/mail-config.c:807
-msgid "Detect supported types..."
-msgstr ""
-
-#: mail/mail-config.c:754 mail/mail-config.c:829
-msgid "Test these values before continuing"
-msgstr ""
-
-#: mail/mail-config.c:936
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:954
-msgid "Select the method you would like to use to deliver your mail."
-msgstr ""
-
-#: mail/mail-config.c:1128 mail/mail-config.c:1207
-msgid "Mail Configuration"
-msgstr "Configuração do correio"
-
-#. Identity page
-#: mail/mail-config.c:1145 mail/mail-config.c:1874
-msgid "Identity"
-msgstr ""
-
-#. Source page
-#: mail/mail-config.c:1164
-#, fuzzy
-msgid "Mail Source"
-msgstr "atalhos principais"
-
-#. Transport page
-#: mail/mail-config.c:1185
-msgid "Mail Transport"
-msgstr "Transporte de correio"
-
-#: mail/mail-config.c:1307
-msgid "Edit Identity"
-msgstr ""
-
-#: mail/mail-config.c:1309
-msgid "Add Identity"
-msgstr ""
-
-#: mail/mail-config.c:1452
-msgid "Edit Source"
-msgstr ""
-
-#: mail/mail-config.c:1454
-msgid "Add Source"
-msgstr "Adicionar Fonte"
-
-#: mail/mail-config.c:1716
-msgid "Name"
-msgstr "Nome"
-
-#: mail/mail-config.c:1716
-msgid "Address"
-msgstr "Endereço"
-
-#: mail/mail-config.c:1716
-msgid "Organization"
-msgstr "Organização"
-
-#: mail/mail-config.c:1716
-msgid "Signature file"
-msgstr ""
-
-#: mail/mail-config.c:1742
-msgid "Camel Providers Configuration"
-msgstr ""
-
-#: mail/mail-config.c:1831
-msgid "Identities"
-msgstr ""
-
-#: mail/mail-config.c:1847 mail/mail-config.c:1943
-msgid "Add"
-msgstr "Adicionar"
-
-#: mail/mail-config.c:1856 mail/mail-config.c:1952
-msgid "Edit"
-msgstr ""
-
-#: mail/mail-config.c:1927
-msgid "Mail sources"
-msgstr "Fontes de correio"
-
-#: mail/mail-config.c:1970
-msgid "Sources"
-msgstr "Fontes"
-
-#: mail/mail-config.c:2009
-msgid "Transports"
-msgstr "Transportes"
-
-#: mail/mail-config.c:2030
-msgid "Send messages in HTML format"
-msgstr "Enviar mensagem em formato HTML"
-
-#: mail/main.c:58
-msgid "Mail Component: I could not initialize Bonobo"
-msgstr "Component de correio: Não consegui inicializar Bonobo"
-
-#: mail/message-list.c:572
-msgid "Online Status"
-msgstr "Situação online"
-
-#: mail/message-list.c:607
-msgid "Subject"
-msgstr "Assunto"
-
-#: mail/message-list.c:614
-msgid "Date"
-msgstr "Data"
-
-#: mail/message-list.c:621
-msgid "Receive"
-msgstr "Receber"
-
-#: mail/message-list.c:635
-msgid "Size"
-msgstr "Tamanho"
-
-#: mail/component-factory.c:173
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Não consigo inicializar o componente de mail do Evolution."
-
-#: shell/main.c:99
-msgid ""
-"Hi. Thanks for taking the time to download this preview release of\n"
-"the Evolution groupware suite.\n"
-"\n"
-"The Evolution team has worked hard to make Evolution as robust,\n"
-"extensible, pretty, fast and well-suited to heavy internet users as\n"
-"possible. And we're very tired. But we're not done -- not yet.\n"
-"\n"
-"As you explore Evolution, please understand that most of our work has\n"
-"been focused on the backend engine which drives the entire system and\n"
-"not on the user interface. We are just cresting the hill now, though,\n"
-"and will be pouring most of our love and attention into the UI from\n"
-"here out. But at least you know that you're not using demoware.\n"
-"\n"
-"So, time for the nerdy disclaimer. Evolution will: crash, lose your\n"
-"mail, leave stray processes running, consume 100% CPU, race, lock,\n"
-"send HTML mail to random mailing lists, and embarass you in front of\n"
-"your friends and co-workers. Use at your own risk.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-
-#: shell/main.c:128
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-
-#: shell/main.c:169
-msgid "Cannot initialize the Evolution shell."
-msgstr ""
-
-#: shell/main.c:205
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Falhou a inicialização do sistema de componentes Bonobo."
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Instalação do Evolution"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Esta parece ser a primeira vez que está a correr o Evolution."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr "Carregue em \\\"OK\\\" para instalar os ficheiros de utilizador do Evolution em"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Ficheiros do Evolution instalados com sucesso"
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-
-#: shell/e-shell-view.c:112
-msgid "(No folder displayed)"
-msgstr "(Nenhuma pasta mostrada)"
-
-#: shell/e-shell-view.c:207
-msgid "Folders"
-msgstr "_Pastas"
-
-#: shell/e-shell-view.c:575
-msgid "None"
-msgstr "Nenhuma"
-
-#: shell/e-shell-view.c:579
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell-view.c:647
-#, c-format
-msgid "Cannot open location: %s"
-msgstr "Não consigo abrir a localização: %s"
-
-#: shell/e-shell.c:250
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr ""
-
-#: shell/e-shell-folder-title-bar.c:353
-msgid "(Untitled)"
-msgstr "(Sem título)"
-
-#: shell/e-shortcut.c:469
-msgid "New group"
-msgstr "Novo grupo"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "Ícone_s pequenos"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "Ícones _grandes"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Mostrar atalhos co ícones grandes"
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate"
-msgstr "Activar"
-
-#: shell/e-shortcuts-view.c:329
-msgid "Activate this shortcut"
-msgstr "Activar este atalho"
-
-#: shell/e-shortcuts-view.c:332
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Remover este atalho da barra de atalhos"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:110
-msgid "Bug buddy was not found in your $PATH."
-msgstr "O Bug buddy não foi encontrado no seu $PATH."
-
-#. same as above
-#: shell/e-shell-view-menu.c:116
-msgid "Bug buddy could not be run."
-msgstr "Não consegui correr o Bub buddy"
-
-#: shell/e-shell-view-menu.c:159
-msgid "Evolution"
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:161
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:163
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:302 shell/e-shell-view-menu.c:399
-msgid "Go to folder..."
-msgstr "Ir para a _pasta..."
-
-#: shell/e-shell-view-menu.c:343
-msgid "_Folder"
-msgstr "_Pasta"
-
-#: shell/e-shell-view-menu.c:347
-msgid "Evolution _Bar Shortcut"
-msgstr "Atalho para _barra do Evolution"
-
-#: shell/e-shell-view-menu.c:353
-msgid "_Mail message"
-msgstr "Mensagem de _correio"
-
-#: shell/e-shell-view-menu.c:354 shell/e-shell-view-menu.c:357
-msgid "Composes a new mail message"
-msgstr "Criar uma nova mensagem"
-
-#: shell/e-shell-view-menu.c:356
-msgid "_Appointment"
-msgstr "_Compromisso"
-
-#: shell/e-shell-view-menu.c:359
-msgid "Meeting Re_quest"
-msgstr "Pedido de _encontro"
-
-#: shell/e-shell-view-menu.c:362
-msgid "_Contact"
-msgstr "_Contacto"
-
-#: shell/e-shell-view-menu.c:365
-msgid "_Task"
-msgstr "_Tarefa"
-
-#: shell/e-shell-view-menu.c:368
-msgid "Task _Request"
-msgstr "_Pedido de tarefa"
-
-#: shell/e-shell-view-menu.c:371
-msgid "_Journal Entry"
-msgstr "_Entrada diária?"
-
-#: shell/e-shell-view-menu.c:374
-msgid "_Note"
-msgstr "_Nota"
-
-#: shell/e-shell-view-menu.c:384
-msgid "_Selected Items"
-msgstr "_Items seleccionados"
-
-#: shell/e-shell-view-menu.c:392
-msgid "_New"
-msgstr "_Novo"
-
-#: shell/e-shell-view-menu.c:393
-msgid "_Open"
-msgstr "_Abrir"
-
-#: shell/e-shell-view-menu.c:395
-msgid "Clos_e All Items"
-msgstr "_Fechar todos os items"
-
-#: shell/e-shell-view-menu.c:395
-msgid "Closes all the open items"
-msgstr "Fecha todos os items abertos"
-
-#: shell/e-shell-view-menu.c:399
-msgid "Display a different folder"
-msgstr "Mostrar uma pasta diferente"
-
-#: shell/e-shell-view-menu.c:414
-msgid "Show _shortcut bar"
-msgstr "Mostrar barra de atalho_s"
-
-#: shell/e-shell-view-menu.c:415
-msgid "Show the shortcut bar"
-msgstr "Mostrar a barra de atalhos"
-
-#: shell/e-shell-view-menu.c:417
-msgid "Show _folder bar"
-msgstr "Motrar barra de _pastas"
-
-#: shell/e-shell-view-menu.c:418
-msgid "Show the folder bar"
-msgstr "Mostrar a barra de pastas"
-
-#: shell/e-shell-view-menu.c:435
-msgid "Help _Index"
-msgstr "Índ_ice de ajuda"
-
-#: shell/e-shell-view-menu.c:438
-msgid "Getting _Started"
-msgstr "_Começando"
-
-#: shell/e-shell-view-menu.c:441
-msgid "Using the _Mailer"
-msgstr "Usando o programa de C_orreio"
-
-#: shell/e-shell-view-menu.c:444
-msgid "Using the _Calendar"
-msgstr "Usando o _Calendário"
-
-#: shell/e-shell-view-menu.c:447
-msgid "Using the Cont_act Manager"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:452
-msgid "_Submit bug report"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:453
-msgid "Submit bug-report via bug-buddy"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:469
-msgid "_Actions"
-msgstr "_Acções"
-
-#: shell/e-init.c:25
-msgid "Evolution can not create its local folders"
-msgstr "O Evolution não consegue criar as suas pastas locais"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Erro a gravar os atalhos."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:385
-msgid "Tentative"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Busy"
-msgstr "Ocupado"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Out of Office"
-msgstr "Fora do escritório"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "No Information"
-msgstr "Nenhuma Informação"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:404
-msgid "_Invite Others..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:424
-msgid "_Options"
-msgstr "_Opções"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:441
-msgid "Show _Only Working Hours"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:454
-msgid "Show _Zoomed Out"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:472
-msgid "_Update Free/Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:490
-msgid "_<<"
-msgstr "_<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:507
-msgid "_Autopick"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:521
-msgid ">_>"
-msgstr ">_>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:538
-msgid "_All People and Resources"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:551
-msgid "All _People and One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:564
-msgid "_Required People"
-msgstr "Pessoas _Necessãrias"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:577
-msgid "Required People and _One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:600
-msgid "Meeting _start time:"
-msgstr "Hora de ín_icio de encontro"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:624
-msgid "Meeting _end time:"
-msgstr "Hora de _fim de _encontro"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:737
-msgid "All Attendees"
-msgstr ""
-
-#: widgets/shortcut-bar/e-group-bar.c:631
-#, c-format
-msgid "Group %i"
-msgstr "Grupo %i"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#~ msgid ""
-#~ "Evolution detected that the file `%s' is a not a directory.\n"
-#~ "\n"
-#~ "Evolution can rename the file, delete the file or shutdown and\n"
-#~ "let you fix the problem."
-#~ msgstr ""
-#~ "O Evolution detectou que o ficheiro '%s' não é um directório.\n"
-#~ "\n"
-#~ "O Evolution pode mudar o nome ou apagar o ficheiro ou então desligue\n"
-#~ "e resolva o problema."
-
-#~ msgid ""
-#~ "This is a development version of Evolution.\n"
-#~ " Using the mail component on your mail files\n"
-#~ " is extremely hazardous.\n"
-#~ "Please backup all your mails before trying\n"
-#~ " this program. \n"
-#~ " You have been warned\n"
-#~ msgstr ""
-#~ "Esta verão do Evolution é de desenvolvimento.\n"
-#~ " Usar o componente de correio nos seus ficheiros\n"
-#~ " é extremamente perigoso.\n"
-#~ "Por favor faça uma cópia de segurança antes de usar\n"
-#~ " o programa.\n"
-#~ " Foi avisado\n"
-
-#~ msgid "_Mail"
-#~ msgstr "_Correio"
-
-#~ msgid "We are sorry, Evolution's Folder Browser can not be initialized."
-#~ msgstr ""
-#~ "Pedimos desculpa. O navegador de pastas do Evolution não pode ser "
-#~ "inicializado."
-
-#~ msgid "Whether a message preview should be shown"
-#~ msgstr "Se uma previsão da mensagem deve ser mostrada"
-
-#~ msgid ""
-#~ "An exception occured while trying to load data into the component with "
-#~ "PersistStream"
-#~ msgstr ""
-#~ "Um excepção ocorreu enquanto se tentava carregar dados no componente com "
-#~ "PersistStream"
-
-#~ msgid "The %s component doesn't support PersistStream!\n"
-#~ msgstr "O componente %s não suporta PersistStream!\n"
-
-#~ msgid "Message status"
-#~ msgstr "Situação das mensagens"
-
-#~ msgid "Attachment"
-#~ msgstr "Anexo"
-
-#~ msgid "Sent"
-#~ msgstr "Enviar"
-
-#~ msgid "A folder containing mail items"
-#~ msgstr "Uma pasta contendo items de correio"
-
-#~ msgid "A folder containing contacts"
-#~ msgstr "Uma pasta contendo contactos"
-
-#~ msgid "A folder containing calendar entries"
-#~ msgstr "Uma pasta contendo entradas de calendário"
-
-#~ msgid "A folder containing tasks"
-#~ msgstr "Uma pasta contendo tarefas"
-
-#~ msgid "A service containing mail items"
-#~ msgstr "Um serviço contendo items de correio"
-
-#~ msgid "A service containing contacts"
-#~ msgstr "Um serviço contendo contactos"
-
-#~ msgid "A service containing calendar entries"
-#~ msgstr "Um serviço contendo entradas de calendário"
-
-#~ msgid "A service containing tasks"
-#~ msgstr "Um serviço contendo tarefas"
-
-#~ msgid "Add New Group"
-#~ msgstr "Adicionar novo grupo"
-
-#~ msgid "Remove Group"
-#~ msgstr "Remover grupo"
-
-#~ msgid "Rename Group"
-#~ msgstr "Mudar nome de grupo"
-
-#~ msgid "Open in New Window"
-#~ msgstr "Åbrir em nova janela"
-
-#~ msgid "Advanced Find"
-#~ msgstr "Encontrar avançado"
-
-#~ msgid "Rename Shortcut"
-#~ msgstr "Mudar nome de atalho"
-
-#~ msgid "_New Folder"
-#~ msgstr "_Nova pasta"
-
-#~ msgid "Executive Summary"
-#~ msgstr "Sumário executivo"
-
-#~ msgid "Inbox"
-#~ msgstr "Correio novo"
-
-#~ msgid "New mail messages"
-#~ msgstr "Novas mensagens de correio"
-
-#~ msgid "Sent mail messages"
-#~ msgstr "Mensagens enviadas"
-
-#~ msgid "Draft mail messages"
-#~ msgstr "Mensagens de correio em rascunho"
-
-#~ msgid "Your contacts list"
-#~ msgstr "A sua lista de contactos"
-
-#~ msgid "Tasks list"
-#~ msgstr "Lista de tarefas"
-
-#~ msgid "Enables some debugging functions"
-#~ msgstr "Liga algumas funções de deupração"
-
-#~ msgid "LEVEL"
-#~ msgstr "NÍVEL"
diff --git a/po/pt_BR.po b/po/pt_BR.po
deleted file mode 100644
index 1eecfafe43..0000000000
--- a/po/pt_BR.po
+++ /dev/null
@@ -1,3904 +0,0 @@
-# Brazilian Translation of Evolution.
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Gustavo Maciel Dias Vieira <gdvieira@zaz.com.br>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution 0.3\n"
-"POT-Creation-Date: 2000-08-02 11:36-0300\n"
-"PO-Revision-Date: 2000-07-29 23:07-03:00\n"
-"Last-Translator: Gustavo Maciel Dias Vieira <gdvieira@zaz.com.br>\n"
-"Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:59 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Não foi possível iniciar Bonobo"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "categorias"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "Item(ns) pertence(m) a estas categorias:"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "Categorias disponíveis:"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/event-editor.c:1168
-msgid "FIXME: _Appointment"
-msgstr "FIXME: _Compromisso"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1169
-msgid "FIXME: Meeting Re_quest"
-msgstr "FIXME: Pedido de _reunião"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/event-editor.c:1171
-msgid "FIXME: _Mail Message"
-msgstr "FIXME: _Mensagem de correio"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/event-editor.c:1172
-msgid "FIXME: _Contact"
-msgstr "FIXME: _Contato"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/event-editor.c:1173
-msgid "FIXME: _Task"
-msgstr "FIXME: _Tarefa"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/event-editor.c:1174
-msgid "FIXME: Task _Request"
-msgstr "FIXME: Pedido de t_arefa"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/event-editor.c:1175
-msgid "FIXME: _Journal Entry"
-msgstr "FIXME: Item de _diário"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1176
-msgid "FIXME: _Note"
-msgstr "FIXME: _Anotação"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/event-editor.c:1178 calendar/gui/event-editor.c:1285
-msgid "FIXME: Ch_oose Form..."
-msgstr "FIXME: Escolher _formulário..."
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1183
-msgid "FIXME: _Memo Style"
-msgstr "FIXME: Estilo de _memorando"
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/event-editor.c:1185
-msgid "FIXME: Define Print _Styles..."
-msgstr "FIXME: Definir estilos de _impressão..."
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/event-editor.c:1192
-msgid "FIXME: S_end"
-msgstr "FIXME: _Enviar"
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/event-editor.c:1196
-msgid "FIXME: Save Attac_hments..."
-msgstr "FIXME: Salvar a_nexos..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "_Excluir"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1199
-msgid "FIXME: _Move to Folder..."
-msgstr "FIXME: _Mover para a pasta..."
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/event-editor.c:1200
-msgid "FIXME: Cop_y to Folder..."
-msgstr "FIXME: _Copiar para a pasta..."
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/event-editor.c:1202
-msgid "Page Set_up"
-msgstr "_Configuração de página"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/event-editor.c:1203
-msgid "FIXME: Print Pre_view"
-msgstr "FIXME: _Visualizar impressão"
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: Paste _Special..."
-msgstr "FIXME: Colar _especial..."
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/event-editor.c:1229
-msgid "FIXME: Mark as U_nread"
-msgstr "FIXME: _Marcar como não lido"
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/event-editor.c:1233
-msgid "_Object"
-msgstr "_Objeto"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/event-editor.c:1238 calendar/gui/event-editor.c:1245
-msgid "FIXME: _Item"
-msgstr "FIXME: _Item"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/event-editor.c:1239 calendar/gui/event-editor.c:1246
-msgid "FIXME: _Unread Item"
-msgstr "FIXME: Item não _lido"
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr "FIXME: _Primeiro item na pasta"
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/event-editor.c:1247
-msgid "FIXME: _Last Item in Folder"
-msgstr "FIXME: Úl_timo item na pasta"
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/event-editor.c:1252
-msgid "FIXME: _Standard"
-msgstr "FIXME: _Padrão"
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1254
-msgid "FIXME: __Formatting"
-msgstr "FIXME: __Formatação"
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/event-editor.c:1257
-msgid "FIXME: _Customize..."
-msgstr "FIXME: _Customizar..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/event-editor.c:1262
-msgid "Pre_vious"
-msgstr "_Anterior"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/event-editor.c:1263
-msgid "Ne_xt"
-msgstr "P_róximo"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/event-editor.c:1267
-msgid "_Toolbars"
-msgstr "_Ferramentas"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/event-editor.c:1272
-msgid "FIXME: _File..."
-msgstr "FIXME: _Arquivo..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/event-editor.c:1273
-msgid "FIXME: It_em..."
-msgstr "FIXME: _Item..."
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/event-editor.c:1274
-msgid "FIXME: _Object..."
-msgstr "FIXME: _Objeto..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/event-editor.c:1279
-msgid "FIXME: _Font..."
-msgstr "FIXME: _Fonte..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/event-editor.c:1280
-msgid "FIXME: _Paragraph..."
-msgstr "FIXME: _Parágrafo..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/event-editor.c:1287
-msgid "FIXME: Desi_gn This Form"
-msgstr "FIXME: Projetar _este formulário"
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/event-editor.c:1288
-msgid "FIXME: D_esign a Form..."
-msgstr "FIXME: Projetar _um formulário..."
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/event-editor.c:1290
-msgid "FIXME: Publish _Form..."
-msgstr "FIXME: Publicar _formulário..."
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/event-editor.c:1291
-msgid "FIXME: Pu_blish Form As..."
-msgstr "FIXME: Publicar formulário _como..."
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/event-editor.c:1293
-msgid "FIXME: Script _Debugger"
-msgstr "FIXME: _Depurador de scripts"
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/event-editor.c:1298
-msgid "FIXME: _Spelling..."
-msgstr "FIXME: _Ortografia..."
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/event-editor.c:1303
-msgid "_Forms"
-msgstr "_Formulários"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "FIXME: _Novo contato"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr "FIXME: Novo _contato da mesma empresa"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr "FIXME: Nova c_orrespondência para contato"
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr "FIXME: Nova _mensagem para contato"
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr "FIXME: Nova _reunião com contato"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr "FIXME: _Planejar uma reunião..."
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr "FIXME: Nova _tarefa para contato"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr "FIXME: Novo item de _diário para contato"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr "FIXME: _Marcar para seguimento..."
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr "FIXME: _Exibir mapa do endereço"
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr "FIXME: _Abrir página web"
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr "FIXME: Encaminhar como _vCard"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1316
-msgid "FIXME: For_ward"
-msgstr "FIXME: _Encaminhar"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/event-editor.c:1329
-msgid "_Insert"
-msgstr "_Inserir"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/event-editor.c:1330
-msgid "F_ormat"
-msgstr "F_ormato"
-
-#. FIXME: add Favorites here
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/event-editor.c:1331 shell/e-shell-view-menu.c:473
-msgid "_Tools"
-msgstr "_Ferramentas"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/event-editor.c:1332
-msgid "Actio_ns"
-msgstr "_Ações"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "Salvar e fechar"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1371
-msgid "Save the appointment and close the dialog box"
-msgstr "Salva o compromisso e fecha a caixa de diálogo"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:673
-msgid "Print..."
-msgstr "Imprimir..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/event-editor.c:1376
-msgid "Print this item"
-msgstr "Imprime este item"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/event-editor.c:1377
-msgid "FIXME: Insert File..."
-msgstr "FIXME: Inserir arquivo..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/event-editor.c:1378
-msgid "Insert a file as an attachment"
-msgstr "Insere um arquivo como um anexo"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/gui/component/addressbook.c:426 calendar/gui/gncal-todo.c:508
-#: mail/folder-browser-factory.c:45
-msgid "Delete"
-msgstr "Excluir"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/event-editor.c:1387 calendar/gui/gncal-todo.c:336
-msgid "Delete this item"
-msgstr "Exclui este item"
-
-#: addressbook/contact-editor/e-contact-editor.c:856
-#: calendar/gui/event-editor.c:1389
-msgid "FIXME: Previous"
-msgstr "FIXME: Anterior"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/event-editor.c:1390
-msgid "Go to the previous item"
-msgstr "Vai para o item anterior"
-
-#: addressbook/contact-editor/e-contact-editor.c:859
-#: calendar/gui/event-editor.c:1391
-msgid "FIXME: Next"
-msgstr "FIXME: Próximo"
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/event-editor.c:1392
-msgid "Go to the next item"
-msgstr "Vai para o próximo item"
-
-#: addressbook/contact-editor/e-contact-editor.c:862
-#: calendar/gui/event-editor.c:1393
-msgid "FIXME: Help"
-msgstr "FIXME: Ajuda"
-
-#: addressbook/contact-editor/e-contact-editor.c:863
-#: calendar/gui/event-editor.c:1394
-msgid "See online help"
-msgstr "Abre ajuda"
-
-#: addressbook/contact-editor/e-contact-editor.c:1278
-msgid "Assistant"
-msgstr "Assistente:"
-
-#: addressbook/contact-editor/e-contact-editor.c:1279
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Business"
-msgstr "Comercial"
-
-#: addressbook/contact-editor/e-contact-editor.c:1280
-msgid "Business 2"
-msgstr "Comercial 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1281
-msgid "Business Fax"
-msgstr "Fax comercial"
-
-#: addressbook/contact-editor/e-contact-editor.c:1282
-msgid "Callback"
-msgstr "Callback"
-
-#: addressbook/contact-editor/e-contact-editor.c:1283
-msgid "Car"
-msgstr "Carro"
-
-#: addressbook/contact-editor/e-contact-editor.c:1284
-msgid "Company"
-msgstr "Empresa"
-
-#: addressbook/contact-editor/e-contact-editor.c:1285
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Home"
-msgstr "Residencial"
-
-#: addressbook/contact-editor/e-contact-editor.c:1286
-msgid "Home 2"
-msgstr "Residencial 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1287
-msgid "Home Fax"
-msgstr "Fax residencial"
-
-#: addressbook/contact-editor/e-contact-editor.c:1288
-msgid "ISDN"
-msgstr "ISDN"
-
-#: addressbook/contact-editor/e-contact-editor.c:1289
-msgid "Mobile"
-msgstr "Celular"
-
-#: addressbook/contact-editor/e-contact-editor.c:1290
-#: addressbook/contact-editor/e-contact-editor.c:1385
-msgid "Other"
-msgstr "Outro"
-
-#: addressbook/contact-editor/e-contact-editor.c:1291
-msgid "Other Fax"
-msgstr "Outro fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1292
-msgid "Pager"
-msgstr "Pager"
-
-#: addressbook/contact-editor/e-contact-editor.c:1293
-msgid "Primary"
-msgstr "Principal"
-
-#: addressbook/contact-editor/e-contact-editor.c:1294
-msgid "Radio"
-msgstr "Rádio"
-
-#: addressbook/contact-editor/e-contact-editor.c:1295
-msgid "Telex"
-msgstr "Telex"
-
-#: addressbook/contact-editor/e-contact-editor.c:1296
-msgid "TTY/TDD"
-msgstr "TTY/TDD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1340
-msgid "Primary Email"
-msgstr "E-mail principal"
-
-#: addressbook/contact-editor/e-contact-editor.c:1341
-msgid "Email 2"
-msgstr "E-mail 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1342
-msgid "Email 3"
-msgstr "E-mail 3"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "_Incluir"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "Tipos de telefone"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "Novo tipo de telefone"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-msgid "Add"
-msgstr "Incluir"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "Editor de contatos"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "Nome _completo..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "Arquivar como:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Endereço de página web:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "Deseja receber correio _HTML"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Endereço:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "_Comercial"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "_Residencial"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "_Fax comercial"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "Cel_ular"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "C_omercial"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "E_ste é o endereço de correspondência"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "Co_ntatos..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr "Ca_tegorias..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr "C_argo:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "_Empresa:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-msgid "General"
-msgstr "Geral"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "_Departamento:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "_Escritório:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "_Profissão:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "_Apelido:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr "_Cônjuge:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "Ani_versário:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr "Nome do a_ssistente:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "Nome do _gerente:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "_Bodas:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "_Notas:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-msgid "Details"
-msgstr "Detalhes"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "Verificar nome completo"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "_Tratamento:"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "_Nome:"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "Nome do _meio:"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "_Sobrenome:"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "S_ufixo:"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Sr.\n"
-"Sra.\n"
-"Dr.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-
-#: addressbook/gui/component/addressbook.c:420
-#: calendar/gui/calendar-commands.c:544
-msgid "New"
-msgstr "Novo"
-
-#: addressbook/gui/component/addressbook.c:420
-msgid "Create a new contact"
-msgstr "Cria um novo contato"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find"
-msgstr "Localizar"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find a contact"
-msgstr "Localiza um contato"
-
-#: addressbook/gui/component/addressbook.c:425
-#: addressbook/gui/component/addressbook.c:492
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:43
-msgid "Print"
-msgstr "Imprimir"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Print contacts"
-msgstr "Imprime contatos"
-
-#: addressbook/gui/component/addressbook.c:426
-msgid "Delete a contact"
-msgstr "Exclui um contato"
-
-#: addressbook/gui/component/addressbook.c:499
-#: addressbook/gui/component/addressbook.c:1039
-msgid "As _Table"
-msgstr "Como _tabela"
-
-#: addressbook/gui/component/addressbook.c:506
-msgid "_New Contact"
-msgstr "_Novo contato"
-
-#: addressbook/gui/component/addressbook.c:514
-msgid "N_ew Directory Server"
-msgstr "Novo _servidor de diretório"
-
-#: addressbook/gui/component/addressbook.c:593
-msgid "Unable to open addressbook"
-msgstr "Não é possível abrir o catálogo de endereços"
-
-#: addressbook/gui/component/addressbook.c:598
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-"Não foi possível abrir este catálogo de endereços. Isto \n"
-"significa que você forneceu uma URI incorreta ou tentou\n"
-"acessar um servidor LDAP sem que o suporte para LDAP esteja\n"
-"compilado. Se você entrou uma URI, verifique a URI e tente \n"
-"novamente. Caso contrário, você provavelmente tentou\n"
-"acessar um servidor LDAP. Se você quiser usar LDAP, você\n"
-"vai precisar baixar e instalar OpenLDAP e recompilar e\n"
-"instalar Evolution.\n"
-
-#: addressbook/gui/component/addressbook.c:943
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr "Salvar como vCard"
-
-#: addressbook/gui/component/addressbook.c:1010
-msgid "* Click here to add a contact *"
-msgstr "* Clique aqui para incluir um contato *"
-
-#: addressbook/gui/component/addressbook.c:1046
-msgid "As _Minicards"
-msgstr "Como _minicartões"
-
-#: addressbook/gui/component/addressbook.c:1097
-msgid "The URI that the Folder Browser will display"
-msgstr "A URI que o navegador de pastas vai exibir"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "window2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:98
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "k"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "Descrição"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "Servidor LDAP:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Número da porta:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr "DN raiz:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Nome:"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"Não há itens neste modo de exibição\n"
-"\n"
-"Clique duas vezes aqui para criar um novo contato."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "Configuração de página:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Nome do estilo:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "Visualizar:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "Opções"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Incluir:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "Seções:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr "Aparecem uma após a outra"
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "Cabeçalhos para cada carta"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "Começam em uma nova página"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Número de colunas:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "Formulários vazios no fim:"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "Fontes"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "Fonte..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "Cabeçalhos"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "Corpo"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "Sombreamento"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "Imprimir usando sombreamento"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "Formato"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Papel"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Tipo:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-msgid "label26"
-msgstr "label26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Tamanho:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Largura:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Altura:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "Fonte de papel:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "Margens"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Superior:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Inferior:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Esquerda:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Direita:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "Página"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Tamanho:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Orientação"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "Retrato"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "Paisagem"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "Cabeçalho"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "Rodapé:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "Inverter nas páginas pares"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "Cabeçalho/rodapé"
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:544
-msgid "am"
-msgstr "am"
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:543
-msgid "pm"
-msgstr "pm"
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr "Resumo:"
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr "Cabeçalhos:"
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr "Dias vazios:"
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Appointments:"
-msgstr "Compromissos:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr "Dia realçado:"
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr "Números do dia:"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr "Número do dia atual:"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr "Tarefa que não está com prazo vencido:"
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr "Tarefa que o prazo vence hoje:"
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr "Tarefa que está atrasada:"
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr "Agenda Gnome"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "A agenda pessoal e gerente de compromissos do GNOME."
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr "Arquivo não encontrado"
-
-#: calendar/gui/calendar-commands.c:456
-msgid "Open calendar"
-msgstr "Abrir agenda"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Save calendar"
-msgstr "Salvar agenda"
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:722
-#: calendar/gui/gncal-todo.c:726
-msgid "Day"
-msgstr "Dia"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr "Exibe 1 dia"
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr "5 dias"
-
-#: calendar/gui/calendar-commands.c:525
-msgid "Show the working week"
-msgstr "Exibe a semana útil"
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:721
-msgid "Week"
-msgstr "Semana"
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr "Exibe 1 semana"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Month"
-msgstr "Mês"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr "Exibe 1 mês"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Year"
-msgstr "Ano"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr "Exibe 1 ano"
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:682
-msgid "Create a new appointment"
-msgstr "Cria um novo compromisso"
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-msgid "Print this calendar"
-msgstr "Imprime esta agenda"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Prev"
-msgstr "Anterior"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr "Volta no tempo"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Today"
-msgstr "Hoje"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr "Vai para a data atual"
-
-#: calendar/gui/calendar-commands.c:554 filter/filter-editor.c:210
-msgid "Next"
-msgstr "Próximo"
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr "Avança no tempo"
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr "Ir para"
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr "Vai para uma data específica"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-msgid "New Ca_lendar"
-msgstr "Nova _agenda"
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr "Cria uma nova agenda"
-
-#: calendar/gui/calendar-commands.c:663
-msgid "Open Ca_lendar"
-msgstr "Abrir a_genda"
-
-#: calendar/gui/calendar-commands.c:664
-msgid "Open a calendar"
-msgstr "Abre uma agenda"
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-msgid "Save Calendar As"
-msgstr "Salvar agenda _como"
-
-#: calendar/gui/calendar-commands.c:682
-msgid "_New appointment..."
-msgstr "Novo _compromisso..."
-
-#: calendar/gui/calendar-commands.c:687
-msgid "New appointment for _today..."
-msgstr "Novo compromisso para _hoje..."
-
-#: calendar/gui/calendar-commands.c:688
-msgid "Create a new appointment for today"
-msgstr "Cria um novo compromisso para hoje"
-
-#: calendar/gui/calendar-commands.c:696 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr "Preferências"
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/calendar-commands.c:704
-msgid "About Calendar"
-msgstr "Sobre a agenda"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:746
-#, c-format
-msgid "%s%s"
-msgstr "%2$s%1$s"
-
-#: calendar/gui/calendar-commands.c:746
-msgid "'s calendar"
-msgstr "Agenda de "
-
-#: calendar/gui/control-factory.c:136
-msgid "The URI that the calendar will display"
-msgstr "A URI que a agenda vai exibir"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "Alarme em %A %b %d %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr "Notificação sobre seu compromisso em %A %b %d %Y %H:%M"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "Fechar"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1070
-msgid "Snooze"
-msgstr "Adiar"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "Editar compromisso"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr "Tempo de adiamento (minutos)"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr "%02i frações de minuto"
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "Novo compromisso..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "Editar este compromisso..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "Excluir este compromisso"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "Tornar este compromisso móvel"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr "Excluir esta ocorrência"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr "Excluir todas as ocorrências"
-
-#: calendar/gui/event-editor.c:291
-msgid "Edit Appointment"
-msgstr "Editar compromisso"
-
-#: calendar/gui/event-editor.c:296
-msgid "No summary"
-msgstr "Sem resumo"
-
-#: calendar/gui/event-editor.c:300
-#, c-format
-msgid "Appointment - %s"
-msgstr "Compromisso - %s"
-
-#: calendar/gui/event-editor.c:303
-#, c-format
-msgid "Task - %s"
-msgstr "Tarefa - %s"
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Journal entry - %s"
-msgstr "Item de diário - %s"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:622 calendar/gui/event-editor.c:718
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1198
-msgid "FIXME: _Delete"
-msgstr "FIXME: _Excluir"
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Ca_lendar..."
-msgstr "FIXME: _Agenda..."
-
-#: calendar/gui/event-editor.c:1300
-msgid "FIXME: Chec_k Names"
-msgstr "FIXME: _Verificar nomes"
-
-#: calendar/gui/event-editor.c:1301
-msgid "FIXME: Address _Book..."
-msgstr "FIXME: _Catálogo de endereços..."
-
-#: calendar/gui/event-editor.c:1308
-msgid "FIXME: _New Appointment"
-msgstr "FIXME: _Novo compromisso"
-
-#: calendar/gui/event-editor.c:1310
-msgid "FIXME: Rec_urrence..."
-msgstr "FIXME: _Recorrência..."
-
-#: calendar/gui/event-editor.c:1312
-msgid "FIXME: Invite _Attendees..."
-msgstr "FIXME: Convidar _participantes..."
-
-#: calendar/gui/event-editor.c:1313
-msgid "FIXME: C_ancel Invitation..."
-msgstr "FIXME: Cancelar con_vite..."
-
-#: calendar/gui/event-editor.c:1315
-msgid "FIXME: Forward as v_Calendar"
-msgstr "FIXME: _Encaminhar como vCalendar"
-
-#: calendar/gui/event-editor.c:1370
-msgid "FIXME: Save and Close"
-msgstr "FIXME: Salvar e fechar"
-
-#: calendar/gui/event-editor.c:1375
-msgid "FIXME: Print..."
-msgstr "FIXME: Imprimir..."
-
-#: calendar/gui/event-editor.c:1380
-msgid "FIXME: Recurrence..."
-msgstr "FIXME: Recorrência..."
-
-#: calendar/gui/event-editor.c:1381
-msgid "Configure recurrence rules"
-msgstr "Configura as regras de recorrência"
-
-#: calendar/gui/event-editor.c:1383
-msgid "FIXME: Invite Attendees..."
-msgstr "FIXME: Convidar participantes..."
-
-#: calendar/gui/event-editor.c:1384
-msgid "Invite attendees to a meeting"
-msgstr "Convida os participantes para uma reunião"
-
-#: calendar/gui/event-editor.c:1386
-msgid "FIXME: Delete"
-msgstr "FIXME: Excluir"
-
-#: calendar/gui/event-editor.c:1828
-msgid "%a %b %d %Y"
-msgstr "%a %b %d %Y"
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "janeiro"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "fevereiro"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "março"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "abril"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "maio"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "junho"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "julho"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "agosto"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "setembro"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "set"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "outubro"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "novembro"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "dezembro"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "domigo"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "segunda-feira"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "terça-feira"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "terça"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "quarta-feira"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "quarta"
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "quinta-feira"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "quint"
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "quinta"
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "sexta-feira"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "sábado"
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr "ano"
-
-#: calendar/gui/getdate.y:421
-msgid "month"
-msgstr "mês"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr "quinzena"
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr "semana"
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr "dia"
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr "hora"
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr "minuto"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "min"
-
-#: calendar/gui/getdate.y:428
-msgid "second"
-msgstr "segundo"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "seg"
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "amanhã"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "ontem"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "hoje"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr "agora"
-
-#: calendar/gui/getdate.y:439
-msgid "last"
-msgstr "último"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr "este"
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr "próximo"
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr "primeiro"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr "terceiro"
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr "quarto"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr "quinto"
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr "sexto"
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr "sétimo"
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr "oitavo"
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr "nono"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr "décimo"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr "décimo primeiro"
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr "décimo segundo"
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr "atrás"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Create to-do item"
-msgstr "Criar tarefa"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Edit to-do item"
-msgstr "Editar tarefa"
-
-#: calendar/gui/gncal-todo.c:176
-msgid "Summary:"
-msgstr "Resumo:"
-
-#: calendar/gui/gncal-todo.c:186
-msgid "Due Date:"
-msgstr "Prazo de conclusão:"
-
-#: calendar/gui/gncal-todo.c:195
-msgid "Priority:"
-msgstr "Prioridade:"
-
-#: calendar/gui/gncal-todo.c:212
-msgid "Item Comments:"
-msgstr "Comentários:"
-
-#: calendar/gui/gncal-todo.c:334
-msgid "Add to-do item..."
-msgstr "Incluir tarefa..."
-
-#: calendar/gui/gncal-todo.c:335
-msgid "Edit this item..."
-msgstr "Editar este item..."
-
-#: calendar/gui/gncal-todo.c:434
-msgid "Summary"
-msgstr "Resumo"
-
-#: calendar/gui/gncal-todo.c:435 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr "Prazo de conclusão"
-
-#: calendar/gui/gncal-todo.c:436 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr "Prioridade"
-
-#: calendar/gui/gncal-todo.c:437
-msgid "Time Left"
-msgstr "Tempo restante"
-
-#. Label
-#: calendar/gui/gncal-todo.c:449
-msgid "To-do list"
-msgstr "Lista de tarefas"
-
-#. Add
-#: calendar/gui/gncal-todo.c:488
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Incluir..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:497
-msgid "Edit..."
-msgstr "Editar..."
-
-#: calendar/gui/gncal-todo.c:721
-msgid "Weeks"
-msgstr "Semanas"
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Days"
-msgstr "Dias"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hours"
-msgstr "Horas"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hour"
-msgstr "Hora"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minutes"
-msgstr "Minutos"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minute"
-msgstr "Minuto"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Seconds"
-msgstr "Segundos"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Second"
-msgstr "Segundo"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1078
-#: calendar/gui/gnome-cal.c:1134
-msgid "Reminder of your appointment at "
-msgstr "Lembrete de seu compromisso às "
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1083 calendar/gui/gnome-cal.c:1138
-msgid "Ok"
-msgstr "Ok"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "dom"
-
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "seg"
-
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "ter"
-
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "qua"
-
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "qui"
-
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "sex"
-
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "sáb"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "Ano:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "Ir para data"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-"Por favor selecione a data para onde você deseja ir.\n"
-"Quando você clicar em um dia, você será \n"
-"levado para esta data."
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "Ir para hoje"
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr "1º"
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr "2º"
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr "3º"
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr "4º"
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr "5º"
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr "6º"
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr "7º"
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr "8º"
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr "9º"
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr "10º"
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr "11º"
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr "12º"
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr "13º"
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr "14º"
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr "15º"
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr "16º"
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr "17º"
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr "18º"
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr "19º"
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr "20º"
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr "21º"
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr "22º"
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr "23º"
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr "24º"
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr "25º"
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr "26º"
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr "27º"
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr "28º"
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr "29º"
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr "30º"
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr "31º"
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr "do"
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr "se"
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr "te"
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr "qu"
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr "qu"
-
-#: calendar/gui/print.c:326
-msgid "Fr"
-msgstr "se"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr "sá"
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr "Tarefas"
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr "Dia atual (%a %b %d %Y)"
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr "%a"
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "Semana atual (%s %s %d - %s %d %d)"
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "Semana atual (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "Semana atual (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr "Mês atual (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr "Ano atual (%Y)"
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr "Imprimir agenda"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr "Visualizar impressão"
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr "Exibição da hora"
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr "Formato da hora"
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr "12 horas (AM/PM)"
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr "24 horas"
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr "Semanas começam"
-
-#: calendar/gui/prop.c:347
-msgid "Sunday"
-msgstr "Domigo"
-
-#: calendar/gui/prop.c:348
-msgid "Monday"
-msgstr "Segunda"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr "Intervalo do dia"
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-"Por favor selecione as horas do início e fim que\n"
-"você quer exibidas nas visões de dia e semana.\n"
-"Horas fora deste intervalo não irão ser exibidas\n"
-"normalmente."
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr "Início do dia:"
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr "Fim do dia:"
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr "Cores para a exibição"
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr "Cores"
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr "Exibir na lista de tarefas:"
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr "Tempo até o prazo"
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr "Opções de estilo da lista de tarefas:"
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr "Realçar tarefas com prazo vencido"
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr "Realçar tarefas com prazo ainda não vencido"
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr "Realçar tarefas com prazo para hoje"
-
-#: calendar/gui/prop.c:678
-msgid "To Do List Properties"
-msgstr "Propriedades da lista de tarefas"
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr "Lista de tarefas"
-
-#: calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr "Alarmes"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-msgid "Alarm Properties"
-msgstr "Propriedades do alarme"
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr "Bips em alarmes visuais"
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr "Alarmes sonoros param após"
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr " segundos"
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr "Habilitar adiamento para "
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-msgid "Defaults"
-msgstr "Padrões"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut"
-msgstr "Recortar"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "Recortar item selecionado para a área de tranferência"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy"
-msgstr "Copiar"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "Copiar item selecionado para a área de transferência"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste"
-msgstr "Colar"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Colar item da área de transferência"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "Selecionar endereço dos destinatários"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Lista de destinatários:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Procurar..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Nome"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr "Endereço"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Propriedades..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "Para: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "label9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "label7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "label8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bytes"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Incluir anexo"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Remover"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Remover itens selecionados da lista de anexos"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Incluir anexo..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Anexar um arquivo à mensagem"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "Propriedades do anexo"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "Tipo MIME:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "Nome do arquivo:"
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr "Clique aqui para o catálogo de endereços"
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "Para:"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr "Entre os destinatários da mensagem"
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Entre os endereços que receberão uma cópia da mensagem"
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Entre os endereços que receberão uma cópia da mensagem sem aparecer na lista "
-"de destinatários da mensagem"
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr "Assunto:"
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr "Entre o assunto da correspondência"
-
-#: composer/e-msg-composer.c:447
-msgid "Save as..."
-msgstr "Salvar como..."
-
-#: composer/e-msg-composer.c:458
-#, c-format
-msgid "Error saving file: %s"
-msgstr "Erro ao salvar arquivo: %s"
-
-#: composer/e-msg-composer.c:478
-#, c-format
-msgid "Error loading file: %s"
-msgstr "Erro ao carregar arquivo: %s"
-
-#: composer/e-msg-composer.c:497
-msgid "Discard this message?"
-msgstr "Descartar esta mensagem?"
-
-#: composer/e-msg-composer.c:514
-msgid "Open file"
-msgstr "Abrir arquivo"
-
-#: composer/e-msg-composer.c:626
-msgid "That file does not exist."
-msgstr "Este arquivo não existe."
-
-#: composer/e-msg-composer.c:636
-msgid "That is not a regular file."
-msgstr "Este não é um arquivo comum."
-
-#: composer/e-msg-composer.c:646
-msgid "That file exists but is not readable."
-msgstr "Este arquivo existe mas não é legível."
-
-#: composer/e-msg-composer.c:656
-msgid "That file appeared accesible but open(2) failed."
-msgstr "Este arquivo aparenta ser acessível mas open(2) falhou."
-
-#: composer/e-msg-composer.c:678
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"O arquivo é muito grande (mais que 100K).\n"
-"Você tem certeza que deseja inserí-lo?"
-
-#: composer/e-msg-composer.c:699
-msgid "An error occurred while reading the file."
-msgstr "Um erro ocorreu ao ler o arquivo."
-
-#: composer/e-msg-composer.c:795
-msgid "_File"
-msgstr "_Arquivo"
-
-#: composer/e-msg-composer.c:801
-msgid "_Open..."
-msgstr "_Abrir..."
-
-#: composer/e-msg-composer.c:802
-msgid "Load a previously saved message"
-msgstr "Carrega uma mensagem salva anteriormente"
-
-#: composer/e-msg-composer.c:810
-msgid "_Save..."
-msgstr "_Salvar..."
-
-#: composer/e-msg-composer.c:811
-msgid "Save message"
-msgstr "Salva a mensagem"
-
-#: composer/e-msg-composer.c:819
-msgid "_Save as..."
-msgstr "Salvar _como..."
-
-#: composer/e-msg-composer.c:820
-msgid "Save message with a different name"
-msgstr "Salva a mensagem com um nome diferente"
-
-#: composer/e-msg-composer.c:828
-msgid "Save in _folder..."
-msgstr "Salvar na _pasta..."
-
-#: composer/e-msg-composer.c:829
-msgid "Save the message in a specified folder"
-msgstr "Salva a mensagem em uma pasta escolhida"
-
-#: composer/e-msg-composer.c:838
-msgid "_Insert text file... (FIXME)"
-msgstr "_Inserir arquivo texto... (FIXME)"
-
-#: composer/e-msg-composer.c:839
-msgid "Insert a file as text into the message"
-msgstr "Insere um arquivo como texto na mensagem"
-
-#: composer/e-msg-composer.c:848
-msgid "_Send"
-msgstr "_Enviar"
-
-#: composer/e-msg-composer.c:849
-msgid "Send the message"
-msgstr "Envia a mensagem"
-
-#: composer/e-msg-composer.c:859
-msgid "_Close..."
-msgstr "_Fechar..."
-
-#: composer/e-msg-composer.c:860
-msgid "Quit the message composer"
-msgstr "Sai do editor de mensagens"
-
-#: composer/e-msg-composer.c:873
-msgid "_Edit"
-msgstr "_Editar"
-
-#: composer/e-msg-composer.c:884
-msgid "_Format"
-msgstr "_Formato"
-
-#: composer/e-msg-composer.c:890
-msgid "HTML"
-msgstr "HTML"
-
-#: composer/e-msg-composer.c:891
-msgid "Send the mail in HTML format"
-msgstr "Envia a mensagem em formato HTML"
-
-#: composer/e-msg-composer.c:904
-msgid "_View"
-msgstr "_Visualizar"
-
-#: composer/e-msg-composer.c:910
-msgid "Show _attachments"
-msgstr "Exibir _anexos"
-
-#: composer/e-msg-composer.c:911
-msgid "Show/hide attachments"
-msgstr "Exibe/esconde os anexos"
-
-#: composer/e-msg-composer.c:944
-msgid "Send"
-msgstr "Enviar"
-
-#: composer/e-msg-composer.c:945
-msgid "Send this message"
-msgstr "Envia esta mensagem"
-
-#: composer/e-msg-composer.c:954
-msgid "Attach"
-msgstr "Anexar"
-
-#: composer/e-msg-composer.c:955
-msgid "Attach a file"
-msgstr "Anexa um arquivo"
-
-#: composer/e-msg-composer.c:1142
-msgid "Compose a message"
-msgstr "Redigir uma mensagem"
-
-#: filter/filter-editor.c:198
-msgid "Edit Filter"
-msgstr "Editar filtro"
-
-#: filter/filter-editor.c:198
-msgid "Create filter"
-msgstr "Criar filtro"
-
-#: filter/filter-editor.c:209
-msgid "Back"
-msgstr "Voltar"
-
-#: filter/filter-editor.c:211
-msgid "Finish"
-msgstr "Concluir"
-
-#: filter/filter-editor.c:212
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: filter/filter-editor.c:216
-msgid "Apply"
-msgstr "Aplicar"
-
-#: filter/filter-editor.c:233
-msgid ""
-"<h2>Create Filtering Rule</h2><p>Select one of the base rules above, then "
-"continue forwards to customise it.</p>"
-msgstr ""
-"<h2>Criar regra de filtragem</h2><p>Selecione uma das regras base acima, "
-"então continue para personalizá-la.</p>"
-
-#: mail/component-factory.c:196
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Não é possível iniciar o componente de correio do Evolution."
-
-#: mail/folder-browser-factory.c:29
-msgid "Get mail"
-msgstr "Receber correspondência"
-
-#: mail/folder-browser-factory.c:29
-msgid "Check for new mail"
-msgstr "Verificar nova correspondência"
-
-#: mail/folder-browser-factory.c:30
-msgid "Compose"
-msgstr "Redigir"
-
-#: mail/folder-browser-factory.c:30
-msgid "Compose a new message"
-msgstr "Redige uma nova mensagem"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply"
-msgstr "Responder"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply to the sender of this message"
-msgstr "Responder ao remetente desta mensagem"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to All"
-msgstr "Responder a todos"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to all recipients of this message"
-msgstr "Responder a todos os destinatários desta mensagem"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward"
-msgstr "Encaminhar"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward this message"
-msgstr "Encaminhar esta mensagem"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Refile"
-msgstr "Abrir arquivo"
-
-#: mail/folder-browser-factory.c:41
-msgid "Move message to a new folder"
-msgstr "Move a mensagem para uma nova pasta"
-
-#: mail/folder-browser-factory.c:43
-msgid "Print the selected message"
-msgstr "Imprimir a mensagem selecionada"
-
-#: mail/folder-browser-factory.c:45
-msgid "Delete this message"
-msgstr "Excluir esta mensagem"
-
-#: mail/folder-browser-factory.c:65
-msgid "_Threaded Message List"
-msgstr "_Lista encadeada de mensagens"
-
-#: mail/folder-browser-factory.c:77
-msgid "_Expunge"
-msgstr "_Excluir permanentemente"
-
-#: mail/folder-browser-factory.c:83
-msgid "_Filter Druid ..."
-msgstr "Assistente de _filtros ..."
-
-#: mail/folder-browser-factory.c:89
-msgid "_Virtual Folder Druid ..."
-msgstr "Assistente de pastas _virtuais ..."
-
-#: mail/folder-browser-factory.c:95
-msgid "_Mail Configuration ..."
-msgstr "_Configuração de correio ..."
-
-#: mail/folder-browser-factory.c:101
-msgid "Forget _Passwords"
-msgstr "Esquecer _senhas"
-
-#: mail/mail-config.c:262
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-"Entre o nome e endereço de e-mail que devem ser usados na correspondência "
-"enviada. Você podem também, opcionalmente, o nome de sua empresa e o nome de "
-"um arquivo que contém a sua assinatura."
-
-#: mail/mail-config.c:277
-msgid "Full name:"
-msgstr "Nome completo:"
-
-#: mail/mail-config.c:305
-msgid "Email address:"
-msgstr "Endereço de e-mail:"
-
-#: mail/mail-config.c:328
-msgid "Organization:"
-msgstr "Empresa:"
-
-#: mail/mail-config.c:340
-msgid "Signature file:"
-msgstr "Arquivo de assinatura:"
-
-#: mail/mail-config.c:345
-msgid "Signature File"
-msgstr "Arquivo de assinatura"
-
-#: mail/mail-config.c:718 mail/mail-config.c:812 mail/mail-config.c:1621
-msgid "Server:"
-msgstr "Servidor:"
-
-#: mail/mail-config.c:725
-msgid "Username:"
-msgstr "Nome do usuário:"
-
-#: mail/mail-config.c:732
-msgid "Path:"
-msgstr "Caminho:"
-
-#: mail/mail-config.c:739 mail/mail-config.c:819
-msgid "Authentication:"
-msgstr "Autenticação:"
-
-#: mail/mail-config.c:751 mail/mail-config.c:831
-msgid "Detect supported types..."
-msgstr "Detectar tipos suportados..."
-
-#: mail/mail-config.c:777 mail/mail-config.c:853
-msgid "Test these values before continuing"
-msgstr "Testar estes valores antes de continuar"
-
-#: mail/mail-config.c:960
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"Selecione o tipo de seu servidor de correio e entre os dados relevantes "
-"sobre ele.\n"
-"\n"
-"Se o servidor exigir autenticação, você pode clicar o botão \"Detectar tipos "
-"suportados...\" após entrar os outros dados."
-
-#: mail/mail-config.c:978
-msgid "Select the method you would like to use to deliver your mail."
-msgstr ""
-"Selecione a maneira como você gostaria de entregar sua correspondência."
-
-#: mail/mail-config.c:1163 mail/mail-config.c:1242
-#, fuzzy
-msgid "Mail Configuration"
-msgstr "_Configuração de correio ..."
-
-#. Identity page
-#: mail/mail-config.c:1180
-#, fuzzy
-msgid "Identity"
-msgstr "Incluir identidade"
-
-#. Source page
-#: mail/mail-config.c:1199
-#, fuzzy
-msgid "Mail Source"
-msgstr "Editar fonte"
-
-#. Transport page
-#: mail/mail-config.c:1220
-msgid "Mail Transport"
-msgstr "Transporte de correio"
-
-#: mail/mail-config.c:1343
-msgid "Edit Identity"
-msgstr "Editar identidade"
-
-#: mail/mail-config.c:1345
-msgid "Add Identity"
-msgstr "Incluir identidade"
-
-#: mail/mail-config.c:1488
-msgid "Edit Source"
-msgstr "Editar fonte"
-
-#: mail/mail-config.c:1490
-msgid "Add Source"
-msgstr "Incluir fonte"
-
-#. "\n\n"
-#. "If the server requires authentication, you can click the "
-#. "\"Detect supported types...\" button after entering "
-#. "the other information."
-#: mail/mail-config.c:1600
-msgid "Enter the hostname of the News Server you have."
-msgstr ""
-
-#: mail/mail-config.c:1656
-msgid "Edit News Server"
-msgstr "Editar servidor de news"
-
-#: mail/mail-config.c:1658
-msgid "Add News Server"
-msgstr "Incluir servidor de news"
-
-#: mail/mail-ops.c:374
-msgid "Fetching mail"
-msgstr "Coletando correio"
-
-#: mail/mail-ops.c:386
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-"Esta mensagem não possui um assunto.\n"
-"Deseja enviar?"
-
-#: mail/mail-ops.c:743
-#, fuzzy
-msgid "Refile message(s) to"
-msgstr "Mover mensagem(ns) para"
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr "Operações pendentes no momento:"
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr "Mensagem incompleta escrita no pipe!"
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr "Erro ao ler comandos da thread de envio."
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr "Mensagem corrompida da thread de envio?"
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr "Não foi possível criar caixa de diálogo."
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr "O usuário cancelou a consulta."
-
-#: mail/main.c:62
-#, fuzzy
-msgid "Mail Component: I could not initialize Bonobo"
-msgstr "Não foi possível iniciar Bonobo"
-
-#: mail/message-list.c:460
-msgid "Online Status"
-msgstr "Estado conectado"
-
-#: mail/message-list.c:488
-msgid "From"
-msgstr "De"
-
-#: mail/message-list.c:495
-msgid "Subject"
-msgstr "Assunto"
-
-#: mail/message-list.c:502
-msgid "Date"
-msgstr "Data"
-
-#: mail/message-list.c:509
-msgid "Received"
-msgstr "Recebida em"
-
-#: mail/message-list.c:516
-msgid "To"
-msgstr "Para"
-
-#: mail/message-list.c:523
-msgid "Size"
-msgstr "Tamanho"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Instalação do Evolution"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Esta parece ser a primeira vez que você executa o Evolution."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr "Por favor clique \"OK\" para instalar os arquivos do Evolution em"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"Não é possível criar o diretório\n"
-"%s\n"
-"Erro: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"Não é possível copiar arquivos em\n"
-"`%s'."
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Arquivos do Evolution instalados com sucesso."
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"O arquivo `%s' não é um diretório.\n"
-"Por favor o remova para permitir a instalação\n"
-"dos arquivos de usuário do Evolution."
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"Não é possível criar a pasta especificada:\n"
-"%s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr "O nome especificado para a pasta é inválido."
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "Evolution - Criar nova pasta"
-
-#: shell/e-shell-folder-selection-dialog.c:95
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-"O tipo da pasta selecionada não é válido para\n"
-"a operação desejada."
-
-#: shell/e-shell-folder-selection-dialog.c:236
-msgid "New..."
-msgstr "Novo..."
-
-#: shell/e-shell-folder-title-bar.c:355
-msgid "(Untitled)"
-msgstr "(Sem nome)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:110
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Bug buddy não foi encontrado em seu $PATH."
-
-#. same as above
-#: shell/e-shell-view-menu.c:116
-msgid "Bug buddy could not be run."
-msgstr "Bug buddy não pôde ser executado."
-
-#: shell/e-shell-view-menu.c:159
-msgid "Evolution"
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:161
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:163
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution é um conjunto de aplicativos de 'groupware'\n"
-"para correio, agenda e gerenciamento de contatos\n"
-"dentro do ambiente GNOME."
-
-#: shell/e-shell-view-menu.c:301
-msgid "Go to folder..."
-msgstr "Ir para a pasta..."
-
-#: shell/e-shell-view-menu.c:365
-msgid "_Folder"
-msgstr "_Pasta"
-
-#: shell/e-shell-view-menu.c:369
-#, fuzzy
-msgid "Evolution _Bar Shortcut"
-msgstr "Atalho da _barra do Evolution"
-
-#: shell/e-shell-view-menu.c:375
-msgid "_Mail message (FIXME)"
-msgstr "_Mensagem de correio (FIXME)"
-
-#: shell/e-shell-view-menu.c:376 shell/e-shell-view-menu.c:379
-#, fuzzy
-msgid "Composes a new mail message"
-msgstr "Redige uma nova mensagem"
-
-#: shell/e-shell-view-menu.c:378
-msgid "_Appointment (FIXME)"
-msgstr "_Compromisso (FIXME)"
-
-#: shell/e-shell-view-menu.c:381
-msgid "_Contact (FIXME)"
-msgstr "C_ontato (FIXME)"
-
-#: shell/e-shell-view-menu.c:384
-msgid "_Task (FIXME)"
-msgstr "_Tarefa (FIXME)"
-
-#: shell/e-shell-view-menu.c:387
-#, fuzzy
-msgid "Task _Request (FIXME)"
-msgstr "_Tarefa (FIXME)"
-
-#: shell/e-shell-view-menu.c:390
-#, fuzzy
-msgid "_Journal Entry (FIXME)"
-msgstr "C_ontato (FIXME)"
-
-#: shell/e-shell-view-menu.c:398
-msgid "_New"
-msgstr "_Novo"
-
-#: shell/e-shell-view-menu.c:402
-msgid "_Go to folder..."
-msgstr "Ir para a _pasta..."
-
-#: shell/e-shell-view-menu.c:402
-msgid "Display a different folder"
-msgstr "Exibe uma pasta diferente"
-
-#: shell/e-shell-view-menu.c:404
-msgid "_Create new folder..."
-msgstr "_Criar nova pasta..."
-
-#: shell/e-shell-view-menu.c:404
-msgid "Create a new folder"
-msgstr "Cria uma nova pasta"
-
-#: shell/e-shell-view-menu.c:419
-msgid "Show _shortcut bar"
-msgstr "Exibir barra de _atalhos"
-
-#: shell/e-shell-view-menu.c:420
-msgid "Show the shortcut bar"
-msgstr "Exibe a barra de atalhos"
-
-#: shell/e-shell-view-menu.c:422
-msgid "Show _folder bar"
-msgstr "Exibir barra de _pastas"
-
-#: shell/e-shell-view-menu.c:423
-msgid "Show the folder bar"
-msgstr "Exibe a barra de pastas"
-
-#: shell/e-shell-view-menu.c:440
-#, fuzzy
-msgid "Help _Index"
-msgstr "Índice da _ajuda"
-
-#: shell/e-shell-view-menu.c:443
-#, fuzzy
-msgid "Getting _Started"
-msgstr "_Primeiros passos"
-
-#: shell/e-shell-view-menu.c:446
-#, fuzzy
-msgid "Using the _Mailer"
-msgstr "Usando o _correio"
-
-#: shell/e-shell-view-menu.c:449
-#, fuzzy
-msgid "Using the _Calendar"
-msgstr "Usando a a_genda"
-
-#: shell/e-shell-view-menu.c:452
-#, fuzzy
-msgid "Using the Cont_act Manager"
-msgstr "Usando o gerenciador _de contatos"
-
-#: shell/e-shell-view-menu.c:457
-msgid "_Submit bug report"
-msgstr "_Enviar relatório de erro"
-
-#: shell/e-shell-view-menu.c:458
-#, fuzzy
-msgid "Submit bug-report via bug-buddy"
-msgstr "Envia um relatório de erro via Bug Buddy"
-
-#: shell/e-shell-view-menu.c:474
-msgid "_Actions"
-msgstr "Açõe_s"
-
-#: shell/e-shell-view.c:113
-msgid "(No folder displayed)"
-msgstr "(Nenhuma pasta exibida)"
-
-#: shell/e-shell-view.c:208
-msgid "Folders"
-msgstr "Pastas"
-
-#: shell/e-shell-view.c:596
-msgid "None"
-msgstr "Nenhum"
-
-#: shell/e-shell-view.c:600
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell.c:299
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Não é possível definir repositório local -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "Ícones _pequenos"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "Exibe os atalhos como ícones pequenos"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "Ícones _grandes"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Exibe os atalhos como ícones grandes"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "Ativar"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "Ativa este atalho"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Remove este atalho da barra de atalhos"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Erro ao salvar atalhos."
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "(Sem nome)"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "Sem erro"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "Erro genérico"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "Já existe uma pasta com o mesmo nome"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr "O tipo de pasta especificado não é válido"
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "Erro de I/O"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "Não há espaço suficiente para criar a pasta"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "A pasta especificada não foi achada"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr "Função não implementada neste repositório"
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "Permissão negada"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "Operação não suportada"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr "O tipo especificado não é suportado neste repositório"
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "Erro desconhecido"
-
-#: shell/main.c:99
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-
-#: shell/main.c:126
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Thanks\n"
-"The Evolution Team\n"
-
-#: shell/main.c:172
-msgid "Cannot initialize the Evolution shell."
-msgstr "Não é possível iniciar o Evolution."
-
-#: shell/main.c:214
-msgid "Cannot initialize the configuration system."
-msgstr "Não é possível iniciar o sistema de configuração."
-
-#: shell/main.c:220
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Não é possível iniciar o sistema de componentes Bonobo."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Campos"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "Agrupamento"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Ordem"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Filtro"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-msgid "Field Chooser"
-msgstr "Editor de campos"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-"Para incluir uma coluna à sua tabela, arreste-a\n"
-"para o local onde você deseja que ela apareça."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "window1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "Campos disponíveis"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "label1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "Exibir nesta ordem"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "label2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Incluir >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Remover"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr "Preliminar"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "Ocupado"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr "Fora do escritório"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "Sem informação"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr "_Convidar outros..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "_Opções"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr "Exibir apenas _horas do expediente"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr "Exibir com _menos ampliação"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr "_Atualizar livre/ocupado"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "_<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr "_Autoescolher"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ">_>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "_Todas as pessoas e recursos"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr "Todas as _pessoas e um recurso"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr "Pessoas _necessárias"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr "Pessoas necessárias e _um recurso"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "Hora de _início da reunião:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "Hora de _término da reunião:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr "Todos os participantes"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "Grupo %i"
-
-#, fuzzy
-msgid "FIXME: Intive _Attendees..."
-msgstr "FIXME: Convidar _participantes..."
-
-#, fuzzy
-msgid "Cut selected region into the clipboard"
-msgstr "Recortar item selecionado para a área de tranferência"
-
-#, fuzzy
-msgid "Copy selected region into the clipboard"
-msgstr "Copiar item selecionado para a área de transferência"
-
-#, fuzzy
-msgid "Paste selected region into the clipboard"
-msgstr "Recortar item selecionado para a área de tranferência"
-
-msgid "Undo"
-msgstr "Desfazer"
-
-msgid "Undo last operation"
-msgstr "Desfazer a última operação"
-
-#, fuzzy
-msgid "Cc"
-msgstr "Cc:"
-
-#, fuzzy
-msgid "Test Select Names"
-msgstr "Testar configurações"
-
-#, fuzzy
-msgid "_Close Calendar"
-msgstr "Agenda Gnome"
-
-#, fuzzy
-msgid "Close current calendar"
-msgstr "Abrir agenda"
-
-msgid "Disabled"
-msgstr "Desativado"
-
-msgid "Synchronize"
-msgstr "Sincronizar"
-
-msgid "Copy From Pilot"
-msgstr "Copiar do pilot"
-
-msgid "Copy To Pilot"
-msgstr "Copiar para o pilot"
-
-msgid "Merge From Pilot"
-msgstr "Mesclar do pilot"
-
-msgid "Merge To Pilot"
-msgstr "Mesclar para o pilot"
-
-msgid "Eskil Heyn Olsen <deity@eskil.dk>"
-msgstr "Eskil Heyn Olsen <deity@eskil.dk>"
-
-#, fuzzy
-msgid "GnomeCalendar Conduit"
-msgstr "Agenda Gnome"
-
-msgid "(C) 1998"
-msgstr "(C) 1998"
-
-msgid "Configuration utility for the calendar conduit.\n"
-msgstr "Utilitário de configuração para o canal de agenda.\n"
-
-msgid "gnome-calendar-conduit.png"
-msgstr "gnome-calendar-conduit.png"
-
-msgid "Synchronize Action"
-msgstr "Ação ao sincronizar"
-
-msgid "Conduit state"
-msgstr "Estado do canal"
-
-msgid ""
-"No pilot configured, please choose the\n"
-"'Pilot Link Properties' capplet first."
-msgstr ""
-"Não existem pilots configurados, por favor escolha\n"
-"'Pilot Link' na central de controle primeiro."
-
-#, fuzzy
-msgid "Cannot initialze the GnomePilot Daemon"
-msgstr "Não é possível iniciar o sistema de componentes Bonobo."
-
-msgid "Cannot connect to the GnomePilot Daemon"
-msgstr "Não é possível conectar ao daemon Gnome Pilot"
-
-msgid "Error while communicating with calendar server"
-msgstr "Erro ao comunicar com o servidor de agenda"
-
-msgid "Calendar holds %d entries"
-msgstr "Agenda mantém %d registros"
-
-msgid "Could not start gnomecal server"
-msgstr "Não foi possível iniciar servidor gnomecal"
-
-msgid "Could not read pilot's DateBook application block"
-msgstr "Não foi possível ler dados da aplicação DateBook no pilot"
-
-msgid "Specifies the port on which the Pilot is"
-msgstr "Especifica a porta onde o pilot está"
-
-msgid "PORT"
-msgstr "PORTA"
-
-msgid "If you want to debug the attributes on records"
-msgstr "Se você quer depurar os atributos dos registros"
-
-msgid "Only syncs from desktop to pilot"
-msgstr "Apenas sincroniza do computador para o pilot"
-
-msgid "Only syncs from pilot to desktop"
-msgstr "Apenas sincroniza do pilot para o computador"
-
-#, fuzzy
-msgid "Can not create Pilot socket\n"
-msgstr "Não foi possível criar caixa de diálogo."
-
-msgid "Can not bind to device %s\n"
-msgstr "Não é possível ligar ao dispositivo %s\n"
-
-msgid "Failed to get a connection from the Pilot device"
-msgstr "Falha ao criar uma conexão com o pilot"
-
-msgid "pi_accept failed"
-msgstr "Falhou pi_accept"
-
-msgid ""
-"\tObject has been modified on desktop and on the pilot, desktop takes "
-"precedence\n"
-msgstr ""
-"\tObjeto foi alterado no computador e no pilot, computador tem a "
-"precedência\n"
-
-#, fuzzy
-msgid "No description"
-msgstr "Descrição"
-
-msgid "Could not open DatebookDB on the Pilot"
-msgstr "Não foi possível abrir DatebookDB no pilot"
-
-#, fuzzy
-msgid "Unable to open DatebookDB"
-msgstr "Não é possível abrir o catálogo de endereços"
-
-msgid "Synced DateBook from Pilot to GnomeCal"
-msgstr "Sincronizado DateBook do pilot à Agenda Gnome"
-
-msgid "event-editor-dialog"
-msgstr "event-editor-dialog"
-
-#, fuzzy
-msgid "_Summary:"
-msgstr "Resumo:"
-
-msgid "_Owner:"
-msgstr "_Dono:"
-
-#, fuzzy
-msgid "Time"
-msgstr "Tempo restante"
-
-#, fuzzy
-msgid "Start time:"
-msgstr "Hora de _início da reunião:"
-
-msgid "End time:"
-msgstr "Hora de término:"
-
-msgid "A_ll day event"
-msgstr "Evento para o dia _todo"
-
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-"Minutos\n"
-"Horas\n"
-"Dias\n"
-
-#, fuzzy
-msgid "_Display"
-msgstr "Exibição da hora"
-
-#, fuzzy
-msgid "_Audio"
-msgstr "_Incluir"
-
-msgid "_Program"
-msgstr "_Programa"
-
-#, fuzzy
-msgid "_Mail"
-msgstr "Cel_ular"
-
-msgid "Mail _to:"
-msgstr "C_orreio para:"
-
-msgid "_Run program:"
-msgstr "E_xecutar programa:"
-
-msgid "Classification"
-msgstr "Classificação"
-
-msgid "Pu_blic"
-msgstr "Pú_blico"
-
-#, fuzzy
-msgid "Pri_vate"
-msgstr "Ativar"
-
-msgid "_Confidential"
-msgstr "Con_fidencial"
-
-#, fuzzy
-msgid "Recurrence rule"
-msgstr "Configura as regras de recorrência"
-
-#, fuzzy
-msgid "Daily"
-msgstr "Dia"
-
-#, fuzzy
-msgid "Weekly"
-msgstr "Semana"
-
-#, fuzzy
-msgid "Monthly"
-msgstr "Mês"
-
-#, fuzzy
-msgid "Yearly"
-msgstr "Ano"
-
-#, fuzzy
-msgid "label23"
-msgstr "label2"
-
-msgid "Every "
-msgstr "A cada "
-
-#, fuzzy
-msgid "day(s)"
-msgstr "dia"
-
-#, fuzzy
-msgid "label24"
-msgstr "label2"
-
-#, fuzzy
-msgid "week(s)"
-msgstr "semana"
-
-#, fuzzy
-msgid "label25"
-msgstr "label2"
-
-msgid "Recur on the"
-msgstr "Repetir no"
-
-msgid "th day of the month"
-msgstr "º dia do mês"
-
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-"1º\n"
-"2º\n"
-"3º\n"
-"4º\n"
-"5º\n"
-
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-"Segunda-feira\n"
-"Terça-feira\n"
-"Quarta-feira\n"
-"Quinta-feira\n"
-"Sexta-feira\n"
-"Sábado\n"
-"Domingo\n"
-
-msgid "Every"
-msgstr "A cada"
-
-#, fuzzy
-msgid "month(s)"
-msgstr "mês"
-
-#, fuzzy
-msgid "year(s)"
-msgstr "ano"
-
-#, fuzzy
-msgid "label27"
-msgstr "label7"
-
-msgid "Ending date"
-msgstr "Data de término"
-
-msgid "Repeat forever"
-msgstr "Repetir para sempre"
-
-msgid "End on "
-msgstr "Terminar em"
-
-#, fuzzy
-msgid "End after"
-msgstr "Editar filtro"
-
-#, fuzzy
-msgid "occurrence(s)"
-msgstr "Excluir todas as ocorrências"
-
-#, fuzzy
-msgid "Exceptions"
-msgstr "Opções"
-
-#, fuzzy
-msgid "Change"
-msgstr "Cancelar"
-
-#, fuzzy
-msgid "Recurrence"
-msgstr "FIXME: Recorrência..."
-
-msgid "Gpilotd todo conduit"
-msgstr "Canal de tarefas para Gnome Pilot"
-
-msgid "(C) 1998 the Free Software Foundation"
-msgstr "(C) 1998 the Free Software Foundation"
-
-msgid "Configuration utility for the todo conduit.\n"
-msgstr "Utilitário de configuração para o canal de tarefas.\n"
-
-msgid "gnome-unknown.xpm"
-msgstr "gnome-unknown.xpm"
-
-msgid "Enabled"
-msgstr "Habilitado"
-
-#, fuzzy
-msgid "Organization"
-msgstr "Empresa:"
-
-#, fuzzy
-msgid "Signature file"
-msgstr "Arquivo de assinatura:"
-
-#, fuzzy
-msgid "Camel Providers Configuration"
-msgstr "_Configuração de correio ..."
-
-#, fuzzy
-msgid "Identities"
-msgstr "Incluir identidade"
-
-#, fuzzy
-msgid "Mail sources"
-msgstr "Fonte de papel:"
-
-#, fuzzy
-msgid "Sources"
-msgstr "Incluir fonte"
-
-msgid "Transports"
-msgstr "Transportes"
-
-#, fuzzy
-msgid "Evolution can not create its local folders"
-msgstr "Evolution - Criar nova pasta"
-
-#, fuzzy
-msgid "_Appointment"
-msgstr "Compromissos:"
-
-#, fuzzy
-msgid "Meeting Re_quest"
-msgstr "FIXME: Pedido de _reunião"
-
-#, fuzzy
-msgid "_Contact"
-msgstr "_Novo contato"
-
-msgid "_Task"
-msgstr "_Tarefa"
-
-#, fuzzy
-msgid "Task _Request"
-msgstr "FIXME: Pedido de t_arefa"
-
-#, fuzzy
-msgid "_Journal Entry"
-msgstr "FIXME: Item de _diário"
-
-#, fuzzy
-msgid "_Note"
-msgstr "_Notas:"
-
-msgid "_Selected Items"
-msgstr "_Itens selecionados"
-
-msgid "Clos_e All Items"
-msgstr "Fechar _todos os itens"
-
-msgid "Closes all the open items"
-msgstr "Fecha todos os itens abertos"
-
-#, fuzzy
-msgid "Cannot open location: %s"
-msgstr "Não é possível definir repositório local -- %s"
-
-msgid "New group"
-msgstr "Novo grupo"
-
-#, fuzzy
-msgid "Browse..."
-msgstr "_Fechar..."
-
-msgid "_Configure Camel Providers ..."
-msgstr "_Configurar provedores Camel"
-
-msgid "We are sorry, Evolution's Folder Browser can not be initialized."
-msgstr "Pedimos desculpas, o navegador de pastas não pode ser iniciado."
-
-#, fuzzy
-msgid "Whether a message preview should be shown"
-msgstr "Se a visualização de uma mensagem deve ser exibida"
-
-#, fuzzy
-msgid "_New Folder"
-msgstr "_Pasta"
-
-msgid "\tObject did not exist, creating a new one\n"
-msgstr "\tObjeto não existe, criando um novo\n"
-
-msgid "Syncing with the pilot..."
-msgstr "Sincronizando com o pilot..."
-
-msgid "IMAP server replied using unknown tokens.\n"
-msgstr "Servidor IMAP respondeu usando mensagens desconhecidas.\n"
-
-msgid "IMAP responded with \"no such message\".\n"
-msgstr "IMAP respondeu com \"mensagem desconhecida\".\n"
-
-msgid "Connecting to IMAP server (%s)..."
-msgstr "Conectando ao servidor IMAP (%s)..."
-
-msgid "failed.\n"
-msgstr "falhou.\n"
-
-msgid "success.\n"
-msgstr "sucesso.\n"
-
-#, fuzzy
-msgid "Select Names"
-msgstr "Nome do estilo:"
-
-#, fuzzy
-msgid "Find..."
-msgstr "Localizar"
-
-msgid "T_ype name or select from List:"
-msgstr "_Digite o nome ou selecione da lista:"
-
-#, fuzzy
-msgid "Message Recipients"
-msgstr "Lista de destinatários:"
-
-#, fuzzy
-msgid "Cannot initialize Evolution's notes component."
-msgstr "Não é possível iniciar o componente de correio do Evolution."
-
-#, fuzzy
-msgid "Notes Component: Could not initialize bonobo"
-msgstr "Não foi possível iniciar Bonobo"
-
-#~ msgid "Move"
-#~ msgstr "Mover"
-
-#~ msgid "_Mark all messages seen"
-#~ msgstr "_Marcar todas as messagens como lidas"
-
-#~ msgid ""
-#~ "Select the kind of news server you have, and enter the relevant information "
-#~ "about it.\n"
-#~ "\n"
-#~ "If the server requires authentication, you can click the \"Detect supported "
-#~ "types...\" button after entering the other information."
-#~ msgstr ""
-#~ "Selecione o tipo de seu servidor de news e entre os dados relevantes sobre "
-#~ "ele.\n"
-#~ "\n"
-#~ "Se o servidor exigir autenticação, você pode clicar o botão \"Detectar tipos "
-#~ "suportados...\" após entrar os outros dados."
-
-#~ msgid "E_xit..."
-#~ msgstr "_Sair..."
-
-#~ msgid "_Help"
-#~ msgstr "A_juda"
-
-#~ msgid "_About Evolution..."
-#~ msgstr "_Sobre o Evolution..."
-
-#~ msgid "Show information about Evolution"
-#~ msgstr "Exibe informações sobre o Evolution"
diff --git a/po/ru.po b/po/ru.po
deleted file mode 100644
index e107572737..0000000000
--- a/po/ru.po
+++ /dev/null
@@ -1,4822 +0,0 @@
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Valek Filippov <frob@df.ru>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: E-volution\n"
-"POT-Creation-Date: 2000-08-19 11:01+0000\n"
-"PO-Revision-Date: 2000-08-19 11:16+00:00\n"
-"Last-Translator: Valek Filippov <frob@df.ru>\n"
-"Language-Team: Russian <ru@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=koi8-r\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: addressbook/backend/ebook/load-gnomecard-addressbook.c:41
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/backend/ebook/test-client-list.c:29
-#: addressbook/backend/ebook/test-client.c:54
-#: addressbook/conduit/address-conduit.c:1201
-#: addressbook/demo/addressbook-factory.c:32
-#: addressbook/gui/component/addressbook-factory.c:59
-#: addressbook/gui/minicard/test-minicard-view.c:45
-#: calendar/conduits/calendar/calendar-conduit.c:1669
-#: calendar/conduits/todo/todo-conduit.c:1298 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "îÅ ÕÄÁÌÏÓØ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ Bonobo"
-
-#. This array must be in the same order as enumerations
-#. in GnomePilotConduitSyncType as they are used as index.
-#. Custom type implies Disabled state.
-#.
-#: addressbook/conduit/address-conduit-control-applet.c:54
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:55
-#: calendar/conduits/todo/todo-conduit-control-applet.c:55
-msgid "Disabled"
-msgstr "ïÔËÌÀÞÅÎÏ"
-
-#: addressbook/conduit/address-conduit-control-applet.c:55
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:56
-#: calendar/conduits/todo/todo-conduit-control-applet.c:56
-msgid "Synchronize"
-msgstr "óÉÎÈÒÏÎÉÚÏ×ÁÔØ"
-
-#: addressbook/conduit/address-conduit-control-applet.c:56
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:57
-#: calendar/conduits/todo/todo-conduit-control-applet.c:57
-msgid "Copy From Pilot"
-msgstr "óËÏÐÉÒÏ×ÁÔØ ÉÚ ðÉÌÏÔÁ"
-
-#: addressbook/conduit/address-conduit-control-applet.c:57
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:58
-#: calendar/conduits/todo/todo-conduit-control-applet.c:58
-msgid "Copy To Pilot"
-msgstr "óËÏÐÉÒÏ×ÁÔØ × ðÉÌÏÔ"
-
-#: addressbook/conduit/address-conduit-control-applet.c:58
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:59
-#: calendar/conduits/todo/todo-conduit-control-applet.c:59
-msgid "Merge From Pilot"
-msgstr "ïÂßÅÄÉÎÉÔØ ÉÚ ðÉÌÏÔÁ"
-
-#: addressbook/conduit/address-conduit-control-applet.c:59
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:60
-#: calendar/conduits/todo/todo-conduit-control-applet.c:60
-msgid "Merge To Pilot"
-msgstr "ïÂßÅÄÉÎÉÔØ × ðÉÌÏÔÅ"
-
-#: addressbook/conduit/address-conduit-control-applet.c:143
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:144
-#: calendar/conduits/todo/todo-conduit-control-applet.c:144
-msgid "Eskil Heyn Olsen <deity@eskil.dk>"
-msgstr "Eskil Heyn Olsen <deity@eskil.dk>"
-
-#: addressbook/conduit/address-conduit-control-applet.c:145
-msgid "Gpilotd address conduit"
-msgstr "ëÏÎÄÕÉÔ ÁÄÒÅÓÏ× Gpilotd"
-
-#: addressbook/conduit/address-conduit-control-applet.c:146
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:147
-#: calendar/conduits/todo/todo-conduit-control-applet.c:147
-msgid "(C) 1998 the Free Software Foundation"
-msgstr "(C) 1998 the Free Software Foundation"
-
-#: addressbook/conduit/address-conduit-control-applet.c:148
-msgid "Configuration utility for the address conduit.\n"
-msgstr "óÒÅÄÓÔ×Ï ÎÁÓÔÒÏÊËÉ ÄÌÑ ËÏÎÄÕÉÔÁ ÁÄÒÅÓÏ×.\n"
-
-#: addressbook/conduit/address-conduit-control-applet.c:149
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:150
-#: calendar/conduits/todo/todo-conduit-control-applet.c:150
-msgid "gnome-unknown.xpm"
-msgstr "gnome-unknown.xpm"
-
-#: addressbook/conduit/address-conduit-control-applet.c:190
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:191
-#: calendar/conduits/todo/todo-conduit-control-applet.c:191
-msgid "Synchronize Action"
-msgstr "óÉÎÈÒÏÎÉÚÏ×ÁÔØ ÄÅÊÓÔ×ÉÑ"
-
-#: addressbook/conduit/address-conduit-control-applet.c:261
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:262
-#: calendar/conduits/todo/todo-conduit-control-applet.c:262
-msgid "Conduit state"
-msgstr "óÏÓÔÏÑÎÉÅ ËÏÎÄÕÉÔÁ"
-
-#: addressbook/conduit/address-conduit-control-applet.c:315
-#: addressbook/conduit/address-conduit-control-applet.c:328
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:316
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:329
-#: calendar/conduits/todo/todo-conduit-control-applet.c:316
-#: calendar/conduits/todo/todo-conduit-control-applet.c:329
-msgid ""
-"No pilot configured, please choose the\n"
-"'Pilot Link Properties' capplet first."
-msgstr ""
-"ðÉÌÏÔ ÎÅ ÎÁÓÔÒÏÅÎ, ÐÏÖÁÌÕÊÓÔÁ ×ÙÂÅÒÉÔÅ\n"
-"ÓÎÁÞÁÌÁ capplet \"ó×ÏÊÓÔ×Á Ó×ÑÚÉ Ó ðÉÌÏÔÏÍ\"."
-
-#: addressbook/conduit/address-conduit-control-applet.c:334
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:335
-#: calendar/conduits/todo/todo-conduit-control-applet.c:335
-msgid "Not connected to the gnome-pilot daemon"
-msgstr "îÅ ÐÏÄËÌÀÞÅÎ Ë ÄÅÍÏÎÕ gnome-pilot"
-
-#: addressbook/conduit/address-conduit-control-applet.c:339
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:340
-#: calendar/conduits/todo/todo-conduit-control-applet.c:340
-msgid ""
-"An error occured when trying to fetch\n"
-"pilot list from the gnome-pilot daemon"
-msgstr ""
-"ðÒÉ ÐÏÐÙÔËÅ ÐÏÌÕÞÉÔØ ÓÐÉÓÏË ðÉÌÏÔÏ×\n"
-"ÏÔ ÄÅÍÏÎÁ gnome-pilot ×ÏÚÎÉËÌÁ ÏÛÉÂËÁ"
-
-#: addressbook/conduit/address-conduit.c:128
-#: addressbook/conduit/address-conduit.c:142
-msgid "BLARG\n"
-msgstr "BLARG\n"
-
-#: addressbook/conduit/address-conduit.c:459
-#, c-format
-msgid "Address holds %ld address entries"
-msgstr "áÄÒÅÓ ÈÒÁÎÉÔ %ld ÚÁÐÉÓÅÊ ÁÄÒÅÓÏ×"
-
-#: addressbook/conduit/address-conduit.c:485
-#: addressbook/conduit/address-conduit.c:487
-msgid "Could not start addressbook server"
-msgstr "îÅ×ÏÚÍÏÖÎÏ ÚÁÐÕÓÔÉÔØ ÓÅÒ×ÅÒ ÁÄÒÅÓÎÏÊ ËÎÉÇÉ"
-
-#: addressbook/conduit/address-conduit.c:500
-#: addressbook/conduit/address-conduit.c:503
-msgid "Could not read pilot's Address application block"
-msgstr "îÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÅÓÔØ ÂÌÏË ÐÒÉÌÏÖÅÎÉÑ ÁÄÒÅÓÏ× ðÉÌÏÔÁ"
-
-#: addressbook/conduit/address-conduit.c:841
-msgid "Error while communicating with address server"
-msgstr "ïÛÉÂËÁ ÐÒÉ ÐÏÄËÌÀÞÅÎÉÉ Ë ÓÅÒ×ÅÒÕ ÁÄÒÅÓÏ×"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "ËÁÔÅÇÏÒÉÉ"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "üÌÅÍÅÎÔÙ ÐÒÉÎÁÄÌÅÖÁÝÉÅ ÜÔÉÍ ËÁÔÅÇÏÒÉÑÍ:"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "äÏÓÔÕÐÎÙÅ ËÁÔÅÇÏÒÉÉ:"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/dialogs/task-editor.c:217 calendar/gui/event-editor.c:1179
-msgid "FIXME: _Appointment"
-msgstr "FIXME: ÷ÓÔÒÅÞÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/dialogs/task-editor.c:218 calendar/gui/event-editor.c:1180
-msgid "FIXME: Meeting Re_quest"
-msgstr "FIXME: úÁÐÒÏÓ ×ÓÔÒÅÞÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/dialogs/task-editor.c:216 calendar/gui/event-editor.c:1182
-msgid "FIXME: _Mail Message"
-msgstr "FIXME: ðÏÞÔÏ×ÏÅ ÓÏÏÂÝÅÎÉÅ"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/dialogs/task-editor.c:219 calendar/gui/event-editor.c:1183
-msgid "FIXME: _Contact"
-msgstr "FIXME: ëÏÎÔÁËÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/dialogs/task-editor.c:213
-#: calendar/gui/dialogs/task-editor.c:220 calendar/gui/event-editor.c:1184
-msgid "FIXME: _Task"
-msgstr "FIXME: úÁÄÁÎÉÅ"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/dialogs/task-editor.c:214
-#: calendar/gui/dialogs/task-editor.c:221 calendar/gui/event-editor.c:1185
-msgid "FIXME: Task _Request"
-msgstr "FIXME: úÁÐÒÏÓ ÚÁÄÁÎÉÑ"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/dialogs/task-editor.c:222 calendar/gui/event-editor.c:1186
-msgid "FIXME: _Journal Entry"
-msgstr "FIXME: öÕÒÎÁÌØÎÁÑ ÚÁÐÉÓØ"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/dialogs/task-editor.c:223 calendar/gui/event-editor.c:1187
-msgid "FIXME: _Note"
-msgstr "FIXME: úÁÍÅÔËÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/dialogs/task-editor.c:225
-#: calendar/gui/dialogs/task-editor.c:332 calendar/gui/event-editor.c:1189
-#: calendar/gui/event-editor.c:1296
-msgid "FIXME: Ch_oose Form..."
-msgstr "FIXME: ÷ÙÂÒÁÔØ ÉÚ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/dialogs/task-editor.c:230 calendar/gui/event-editor.c:1194
-msgid "FIXME: _Memo Style"
-msgstr "FIXME: óÔÉÌØ ÐÁÍÑÔËÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/dialogs/task-editor.c:232 calendar/gui/event-editor.c:1196
-msgid "FIXME: Define Print _Styles..."
-msgstr "FIXME: ïÐÒÅÄÅÌÉÔØ ÓÔÉÌÉ ÐÅÞÁÔÉ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/dialogs/task-editor.c:239 calendar/gui/event-editor.c:1203
-msgid "FIXME: S_end"
-msgstr "FIXME: ïÔÐÒÁ×ÉÔØ"
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/dialogs/task-editor.c:243 calendar/gui/event-editor.c:1207
-msgid "FIXME: Save Attac_hments..."
-msgstr "FIXME: óÏÈÒÁÎÉÔØ ×ÌÏÖÅÎÉÑ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "õÄÁÌÉÔØ"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/dialogs/task-editor.c:246 calendar/gui/event-editor.c:1210
-msgid "FIXME: _Move to Folder..."
-msgstr "FIXME: ðÅÒÅÍÅÓÔÉÔØ × ÐÁÐËÕ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/dialogs/task-editor.c:247 calendar/gui/event-editor.c:1211
-msgid "FIXME: Cop_y to Folder..."
-msgstr "FIXME: óËÏÐÉÒÏ×ÁÔØ × ÐÁÐËÕ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/dialogs/task-editor.c:249 calendar/gui/event-editor.c:1213
-msgid "Page Set_up"
-msgstr "îÁÓÔÒÏÊËÁ ÓÔÒÁÎÉÃÙ:"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/dialogs/task-editor.c:250 calendar/gui/event-editor.c:1214
-msgid "FIXME: Print Pre_view"
-msgstr "FIXME: ðÒÏÓÍÏÔÒ ÐÅÞÁÔÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/dialogs/task-editor.c:271 calendar/gui/event-editor.c:1235
-msgid "FIXME: Paste _Special..."
-msgstr "FIXME: óÐÅÃÉÁÌØÎÁÑ ×ÓÔÁ×ËÁ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/dialogs/task-editor.c:276 calendar/gui/event-editor.c:1240
-msgid "FIXME: Mark as U_nread"
-msgstr "FIXME: ðÏÍÅÔÉÔØ ËÁË ÎÅÐÒÏÞÔÅÎÎÏÅ"
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/dialogs/task-editor.c:280 calendar/gui/event-editor.c:1244
-msgid "_Object"
-msgstr "ïÂßÅËÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/dialogs/task-editor.c:285
-#: calendar/gui/dialogs/task-editor.c:293 calendar/gui/event-editor.c:1249
-#: calendar/gui/event-editor.c:1256
-msgid "FIXME: _Item"
-msgstr "FIXME: üÌÅÍÅÎÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/dialogs/task-editor.c:286
-#: calendar/gui/dialogs/task-editor.c:294 calendar/gui/event-editor.c:1250
-#: calendar/gui/event-editor.c:1257
-msgid "FIXME: _Unread Item"
-msgstr "FIXME: îÅÐÒÏÞÔÅÎÎÙÊ ÜÌÅÍÅÎÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/dialogs/task-editor.c:288 calendar/gui/event-editor.c:1251
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr "FIXME: ðÅÒ×ÙÊ ÜÌÅÍÅÎÔ × ÐÁÐËÅ"
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/dialogs/task-editor.c:296 calendar/gui/event-editor.c:1258
-msgid "FIXME: _Last Item in Folder"
-msgstr "FIXME: ðÏÓÌÅÄÎÉÊ ÜÌÅÍÅÎÔ × ÐÁÐËÅ"
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/dialogs/task-editor.c:301 calendar/gui/event-editor.c:1263
-msgid "FIXME: _Standard"
-msgstr "FIXME: óÔÁÎÄÁÒÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/dialogs/task-editor.c:303 calendar/gui/event-editor.c:1265
-msgid "FIXME: __Formatting"
-msgstr "FIXME: æÏÒÍÁÔÉÒÏ×ÁÎÉÅ"
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/dialogs/task-editor.c:306 calendar/gui/event-editor.c:1268
-msgid "FIXME: _Customize..."
-msgstr "FIXME: îÁÓÔÒÏÊËÁ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/dialogs/task-editor.c:311 calendar/gui/event-editor.c:1273
-msgid "Pre_vious"
-msgstr "ðÒÅÄ."
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/dialogs/task-editor.c:312 calendar/gui/event-editor.c:1274
-msgid "Ne_xt"
-msgstr "óÌÅÄ."
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/dialogs/task-editor.c:314 calendar/gui/event-editor.c:1278
-msgid "_Toolbars"
-msgstr "ðÁÎÅÌÉ ÉÎÓÔÒÕÍÅÎÔÏ×"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/dialogs/task-editor.c:319 calendar/gui/event-editor.c:1283
-msgid "FIXME: _File..."
-msgstr "FIXME: æÁÊÌ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/dialogs/task-editor.c:320 calendar/gui/event-editor.c:1284
-msgid "FIXME: It_em..."
-msgstr "FIXME: üÌÅÍÅÎÔ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/dialogs/task-editor.c:321 calendar/gui/event-editor.c:1285
-msgid "FIXME: _Object..."
-msgstr "FIXME: ïÂßÅËÔ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/dialogs/task-editor.c:326 calendar/gui/event-editor.c:1290
-msgid "FIXME: _Font..."
-msgstr "FIXME: ûÒÉÆÔ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/dialogs/task-editor.c:327 calendar/gui/event-editor.c:1291
-msgid "FIXME: _Paragraph..."
-msgstr "FIXME: ðÁÒÁÇÒÁÆ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/dialogs/task-editor.c:334 calendar/gui/event-editor.c:1298
-msgid "FIXME: Desi_gn This Form"
-msgstr "FIXME: ëÏÎÓÔÒÕËÃÉÑ ÜÔÏÊ ÆÏÒÍÙ"
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/dialogs/task-editor.c:335 calendar/gui/event-editor.c:1299
-msgid "FIXME: D_esign a Form..."
-msgstr "FIXME: óÏÚÄÁÔØ ÆÏÒÍÕ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/dialogs/task-editor.c:337 calendar/gui/event-editor.c:1301
-msgid "FIXME: Publish _Form..."
-msgstr "FIXME: ïÐÕÂÌÉËÏ×ÁÔØ ÆÏÒÍÕ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/dialogs/task-editor.c:338 calendar/gui/event-editor.c:1302
-msgid "FIXME: Pu_blish Form As..."
-msgstr "FIXME: ïÐÕÂÌÉËÏ×ÁÔØ ÆÏÒÍÕ ËÁË..."
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/dialogs/task-editor.c:340 calendar/gui/event-editor.c:1304
-msgid "FIXME: Script _Debugger"
-msgstr "FIXME: ïÔÌÁÄÞÉË ÓËÒÉÐÔÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/dialogs/task-editor.c:345 calendar/gui/event-editor.c:1309
-msgid "FIXME: _Spelling..."
-msgstr "FIXME: ðÒÏ×ÅÒËÁ ÐÒÁ×ÏÐÉÓÁÎÉÑ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/dialogs/task-editor.c:350 calendar/gui/event-editor.c:1314
-msgid "_Forms"
-msgstr "æÏÒÍÙ"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "FIXME: îÏ×ÙÊ ËÏÎÔÁËÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr "FIXME: îÏ×ÙÊ ËÏÎÔÁËÔ × ÔÏÊ ÖÅ ËÏÍÐÁÎÉÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr "FIXME: îÏ×ÏÅ ÐÉÓØÍÏ ÄÌÑ ËÏÎÔÁËÔÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr "FIXME: îÏ×ÏÅ ÓÏÏÂÝÅÎÉÅ ÄÌÑ ËÏÎÔÁËÔÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr "FIXME: îÏ×ÁÑ ×ÓÔÒÅÞÁ Ó ËÏÎÔÁËÔÏÍ"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr "FIXME: ðÌÁÎ ×ÓÔÒÅÞÉ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr "FIXME: îÏ×ÁÑ ÚÁÄÁÞÁ ÄÌÑ ËÏÎÔÁËÔÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr "FIXME: îÏ×ÁÑ ÖÕÒÎÁÌØÎÁÑ ÚÁÐÉÓØ ÄÌÑ ËÏÎÔÁËÔÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr "FIXME: ïÔÏÂÒÁÚÉÔØ ËÁÒÔÕ ÁÄÒÅÓÏ×"
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr "FIXME: ïÔËÒÙÔØ Web-ÓÔÒÁÎÉÃÕ"
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr "FIXME: ðÅÒÅÓÌÁÔØ ËÁË vCard"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/dialogs/task-editor.c:367 calendar/gui/event-editor.c:1327
-msgid "FIXME: For_ward"
-msgstr "FIXME: ðÅÒÅÓÌÁÔØ"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/dialogs/task-editor.c:380 calendar/gui/event-editor.c:1340
-msgid "_Insert"
-msgstr "÷ÓÔÁ×ÉÔØ"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/dialogs/task-editor.c:381 calendar/gui/event-editor.c:1341
-msgid "F_ormat"
-msgstr "æÏÒÍÁÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/dialogs/task-editor.c:382 calendar/gui/event-editor.c:1342
-msgid "_Tools"
-msgstr "éÎÓÔÒÕÍÅÎÔÙ"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/dialogs/task-editor.c:383 calendar/gui/event-editor.c:1343
-msgid "Actio_ns"
-msgstr "äÅÊÓÔ×ÉÑ"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "óÏÈÒÁÎÉÔØ É ÚÁËÒÙÔØ"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1382
-msgid "Save the appointment and close the dialog box"
-msgstr "óÏÈÒÁÎÉÔØ ×ÓÔÒÅÞÕ É ÚÁËÒÙÔØ ÏËÎÏ ÄÉÁÌÏÇÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:654
-msgid "Print..."
-msgstr "ðÅÞÁÔØ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/dialogs/task-editor.c:415 calendar/gui/event-editor.c:1387
-msgid "Print this item"
-msgstr "ðÅÞÁÔØ ÜÔÏÇÏ ÜÌÅÍÅÎÔÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/dialogs/task-editor.c:416 calendar/gui/event-editor.c:1388
-msgid "FIXME: Insert File..."
-msgstr "FIXME: ÷ÓÔÁ×ÉÔØ ÆÁÊÌ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/dialogs/task-editor.c:417 calendar/gui/event-editor.c:1389
-msgid "Insert a file as an attachment"
-msgstr "÷ÓÔÁ×ÉÔØ ÆÁÊÌ ËÁË ×ÌÏÖÅÎÉÅ"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/demo/addressbook.c:84
-#: addressbook/gui/component/addressbook.c:424
-#: calendar/gui/e-calendar-table.c:375
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:548
-#: mail/folder-browser-factory.c:50 mail/mail-config.glade.h:13
-#: mail/mail-config.glade.h:18 mail/mail-config.glade.h:24
-#: mail/mail-view.c:147
-msgid "Delete"
-msgstr "õÄÁÌÉÔØ"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/dialogs/task-editor.c:426 calendar/gui/event-editor.c:1398
-#: calendar/gui/gncal-todo.c:376
-msgid "Delete this item"
-msgstr "õÄÁÌÉÔØ ÜÔÏÔ ÜÌÅÍÅÎÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/dialogs/task-editor.c:428 calendar/gui/event-editor.c:1400
-msgid "FIXME: Previous"
-msgstr "FIXME: ðÒÅÄ."
-
-#: addressbook/contact-editor/e-contact-editor.c:858
-#: calendar/gui/dialogs/task-editor.c:429 calendar/gui/event-editor.c:1401
-msgid "Go to the previous item"
-msgstr "ðÅÒÅÊÔÉ Ë ÐÒÅÄÙÄÕÝÅÍÕ ÜÌÅÍÅÎÔÕ"
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/dialogs/task-editor.c:430 calendar/gui/event-editor.c:1402
-msgid "FIXME: Next"
-msgstr "FIXME: óÌÅÄ."
-
-#: addressbook/contact-editor/e-contact-editor.c:861
-#: calendar/gui/dialogs/task-editor.c:431 calendar/gui/event-editor.c:1403
-msgid "Go to the next item"
-msgstr "ðÅÒÅÊÔÉ Ë ÓÌÅÄÕÀÝÅÍÕ ÜÌÅÍÅÎÔÕ"
-
-#: addressbook/contact-editor/e-contact-editor.c:864
-#: calendar/gui/dialogs/task-editor.c:432 calendar/gui/event-editor.c:1404
-msgid "FIXME: Help"
-msgstr "FIXME: óÐÒÁ×ËÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:865
-#: calendar/gui/dialogs/task-editor.c:433 calendar/gui/event-editor.c:1405
-msgid "See online help"
-msgstr "ðÒÏÓÍÏÔÒ ÓÐÒÁ×ËÉ × ÓÅÔÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1320
-msgid "Assistant"
-msgstr "ðÏÍÏÝÎÉË"
-
-#: addressbook/contact-editor/e-contact-editor.c:1321
-#: addressbook/contact-editor/e-contact-editor.c:1425
-msgid "Business"
-msgstr "òÁÂÏÞÉÊ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1322
-msgid "Business 2"
-msgstr "òÁÂÏÞÉÊ 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1323
-msgid "Business Fax"
-msgstr "òÁÂÏÞÉÊ ÆÁËÓ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1324
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1325
-msgid "Car"
-msgstr "íÁÛÉÎÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1326
-msgid "Company"
-msgstr "ëÏÍÐÁÎÉÑ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1327
-#: addressbook/contact-editor/e-contact-editor.c:1426
-msgid "Home"
-msgstr "äÏÍÁÛÎÉÊ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1328
-msgid "Home 2"
-msgstr "äÏÍÁÛÎÉÊ 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1329
-msgid "Home Fax"
-msgstr "äÏÍÁÛÎÉÊ æÁËÓ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1330
-msgid "ISDN"
-msgstr "ISDN"
-
-#: addressbook/contact-editor/e-contact-editor.c:1331
-msgid "Mobile"
-msgstr "íÏÂÉÌØÎÙÊ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1332
-#: addressbook/contact-editor/e-contact-editor.c:1427
-#: mail/mail-config.glade.h:28
-msgid "Other"
-msgstr "äÒÕÇÏÊ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1333
-msgid "Other Fax"
-msgstr "äÒÕÇÏÊ ÆÁËÓ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1334
-msgid "Pager"
-msgstr "ðÜÊÄÖÅÒ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1335
-msgid "Primary"
-msgstr "ðÅÒ×ÙÊ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1336
-msgid "Radio"
-msgstr "òÁÄÉÏ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1337
-msgid "Telex"
-msgstr "ôÅÌÅËÓ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1338
-msgid "TTY/TDD"
-msgstr "TTY/TDD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1382
-msgid "Primary Email"
-msgstr "ðÅÒ×ÙÊ ÜÌ.ÁÄÒÅÓ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Email 2"
-msgstr "üÌ.ÁÄÒÅÓ 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Email 3"
-msgstr "üÌ.ÁÄÒÅÓ 3"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:7
-msgid ""
-"Are you sure you want\n"
-"to delete this contact?"
-msgstr ""
-"÷Ù ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÈÏÔÉÔÅ\n"
-"ÕÄÁÌÉÔØ ÜÔÏÔ ËÏÎÔÁËÔ?"
-
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:9
-msgid "Delete Contact?"
-msgstr "õÄÁÌÉÔØ ËÏÎÔÁËÔ?"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "äÏÂÁ×ÉÔØ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "ôÉÐ ÔÅÌÅÆÏÎÁ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "îÏ×ÙÊ ÔÉÐ ÔÅÌÅÆÏÎÁ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91 mail/mail-config.glade.h:11
-#: mail/mail-config.glade.h:16 mail/mail-config.glade.h:22
-msgid "Add"
-msgstr "äÏÂÁ×ÉÔØ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "òÅÄÁËÔÏÒ ËÏÎÔÁËÔÏ×"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "ðÏÌÎÏÅ ÉÍÑ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "æÁÊÌ ËÁË:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "áÄÒÅÓ web-ÓÔÒÁÎÉÃÙ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "èÏÞÅÔ ÐÏÌÕÞÁÔØ ÐÏÞÔÕ × HTML"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "áÄÒÅÓ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "òÁÂÏÞÉÊ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "äÏÍÁÛÎÉÊ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "òÁÂÏÞÉÊ ÆÁËÓ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "íÏÂÉÌØÎÙÊ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "òÁÂÏÞÉÊ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "üÔÏ ÐÏÞÔÏ×ÙÊ ÁÄÒÅÓ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "ëÏÎÔÁËÔÙ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:26
-msgid "Ca_tegories..."
-msgstr "ëÁÔÅÇÏÒÉÉ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr "äÏÌÖÎÏÓÔØ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "ëÏÍÐÁÎÉÑ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:18
-msgid "General"
-msgstr "ïÂÝÅÅ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "ïÔÄÅÌ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "ïÆÉÓ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "ðÒÏÆÅÓÓÉÑ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "ðÓÅ×ÄÏÎÉÍ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr "óÕÐÒÕÇ(Á):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "äÅÎØ ÒÏÖÄÅÎÉÑ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr "éÍÑ ÐÏÍÏÝÎÉËÁ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "éÍÑ ÍÅÎÅÄÖÅÒÁ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "çÏÄÏ×ÝÉÎÁ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "úÁÍÅÔËÉ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:33
-msgid "Details"
-msgstr "äÅÔÁÌÉ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "ðÒÏ×ÅÒÉÔØ ÐÏÌÎÏÅ ÉÍÑ"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "úÁÇÏÌÏ×ÏË:"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "éÍÑ:"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "ïÔÞÅÓÔ×Ï:"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "æÁÍÉÌÉÑ:"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "óÕÆÆÉËÓ:"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Ç.\n"
-"Ç-ÖÁ.\n"
-"Ä-Ò.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"Sr.\n"
-"ÍÌ.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-
-#: addressbook/demo/addressbook.c:78
-#: addressbook/gui/component/addressbook.c:418
-#: calendar/gui/calendar-commands.c:511 notes/component-factory.c:27
-msgid "New"
-msgstr "îÏ×ÙÊ"
-
-#: addressbook/demo/addressbook.c:78
-#: addressbook/gui/component/addressbook.c:418
-msgid "Create a new contact"
-msgstr "óÏÚÄÁÔØ ÎÏ×ÙÊ ËÏÎÔÁËÔ"
-
-#: addressbook/demo/addressbook.c:82
-#: addressbook/gui/component/addressbook.c:422
-msgid "Find"
-msgstr "îÁÊÔÉ"
-
-#: addressbook/demo/addressbook.c:82
-#: addressbook/gui/component/addressbook.c:422
-msgid "Find a contact"
-msgstr "îÁÊÔÉ ËÏÎÔÁËÔ"
-
-#: addressbook/demo/addressbook.c:83
-#: addressbook/gui/component/addressbook.c:423
-#: calendar/gui/calendar-commands.c:516 mail/folder-browser-factory.c:48
-#: mail/mail-view.c:145
-msgid "Print"
-msgstr "ðÅÞÁÔØ"
-
-#: addressbook/demo/addressbook.c:83
-#: addressbook/gui/component/addressbook.c:423
-msgid "Print contacts"
-msgstr "îÁÐÅÞÁÔÁÔØ ËÏÎÔÁËÔ"
-
-#: addressbook/demo/addressbook.c:84
-#: addressbook/gui/component/addressbook.c:424
-msgid "Delete a contact"
-msgstr "õÄÁÌÉÔØ ËÏÎÔÁËÔ"
-
-#: addressbook/demo/addressbook.c:103
-#: addressbook/gui/component/addressbook.c:509
-msgid "_New Contact"
-msgstr "îÏ×ÙÊ ËÏÎÔÁËÔ"
-
-#: addressbook/gui/component/addressbook.c:492
-msgid "_Print Contacts..."
-msgstr "îÁÐÅÞÁÔÁÔØ ËÏÎÔÁËÔÙ..."
-
-#: addressbook/gui/component/addressbook.c:502
-#: addressbook/gui/component/addressbook.c:972
-msgid "As _Table"
-msgstr "ëÁË ÔÁÂÌÉÃÁ"
-
-#: addressbook/gui/component/addressbook.c:517
-msgid "N_ew Directory Server"
-msgstr "îÏ×ÙÊ ÓÅÒ×ÅÒ ËÁÔÁÌÏÇÏ×"
-
-#: addressbook/gui/component/addressbook.c:600
-msgid "Unable to open addressbook"
-msgstr "îÅ ÕÄÁÌÏÓØ ÏÔËÒÙÔØ ÁÄÒÅÓÎÕÀ ËÎÉÇÕ"
-
-#: addressbook/gui/component/addressbook.c:605
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-"îÅ ÕÄÁÌÏÓØ ÏÔËÒÙÔØ ÜÔÕ ÁÄÒÅÓÎÕÀ ËÎÉÇÕ. üÔÏ ÚÎÁÞÉÔ,\n"
-"ÞÔÏ ÌÉÂÏ ×Ù ××ÅÌÉ ÎÅËÏÒÒÅËÔÎÙÊ URI, ÌÉÂÏ ÐÙÔÁÌÉÓØ\n"
-"ÏÂÒÁÔÉÔØÓÑ Ë LDAP ÓÅÒ×ÅÒÕ É ÎÅ ÉÍÅÅÔÅ ×ÓÔÒÏÅÎÎÏÊ\n"
-"ÐÏÄÄÅÒÖËÉ LDAP. åÓÌÉ ×Ù ××ÏÄÉÌÉ URI, ÐÒÏ×ÅÒØÔÅ ÅÇÏ\n"
-"ÐÒÁ×ÉÌØÎÏÓÔØ É ÐÅÒÅ××ÅÄÉÔÅ. åÓÌÉ ÎÅÔ, ×Ù ×ÏÚÍÏÖÎÏ\n"
-"ÐÙÔÁÌÉÓØ ÏÂÒÁÔÉÔØÓÑ Ë LDAP ÓÅÒ×ÅÒÕ. åÓÌÉ ×Ù ÈÏÔÉÔÅ\n"
-"ÉÓÐÏÌØÚÏ×ÁÔØ LDAP, ×ÁÍ ÎÁÄÏ ÓËÁÞÁÔØ É ÕÓÔÁÎÏ×ÉÔØ \n"
-"OpenLDAP É ÐÅÒÅËÏÍÐÉÌÉÒÏ×ÁÔØ É ÕÓÔÁÎÏ×ÉÔØ evolution.\n"
-
-#: addressbook/gui/component/addressbook.c:876
-#: addressbook/gui/minicard/e-minicard.c:332
-msgid "Save as VCard"
-msgstr "óÏÈÒÁÎÉÔØ ËÁË VCard"
-
-#: addressbook/gui/component/addressbook.c:943
-msgid "* Click here to add a contact *"
-msgstr "* ýÅÌËÎÉÔÅ ÚÄÅÓØ ÞÔÏÂÙ ÄÏÂÁ×ÉÔØ ËÏÎÔÁËÔ *"
-
-#: addressbook/gui/component/addressbook.c:979
-msgid "As _Minicards"
-msgstr "ëÁË ÍÉÎÉËÁÒÔÏÞËÉ"
-
-#: addressbook/gui/component/addressbook.c:1030
-msgid "The URI that the Folder Browser will display"
-msgstr "URI, ËÏÔÏÒÙÊ ÂÕÄÅÔ ÐÏËÁÚÙ×ÁÔØ ÐÒÏÇÒÁÍÍÁ ÐÒÏÓÍÏÔÒÁ ÐÁÐÏË"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "ÏËÎÏ2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "Ë"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#: addressbook/gui/component/e-ldap-storage.c:88
-msgid "External Directories"
-msgstr "÷ÎÅÛÎÉÅ ËÁÔÁÌÏÇÉ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "ïÐÉÓÁÎÉÅ:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "óÅÒ×ÅÒ LDAP:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "îÏÍÅÒ ÐÏÒÔÁ:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "éÍÑ:"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/select-names/select-names.glade.h:7
-msgid "Select Names"
-msgstr "÷ÙÂÒÁÔØ ÉÍÅÎÁ"
-
-#: addressbook/gui/component/select-names/select-names.glade.h:8
-msgid "Find..."
-msgstr "îÁÊÔÉ..."
-
-#: addressbook/gui/component/select-names/select-names.glade.h:9
-msgid "Select name from List:"
-msgstr "÷ÙÂÒÁÔØ ÉÍÅÎÁ ÉÚ ÓÐÉÓËÁ:"
-
-#: addressbook/gui/component/select-names/select-names.glade.h:10
-msgid "Message Recipients"
-msgstr "ðÏÌÕÞÁÔÅÌÉ ÓÏÏÂÝÅÎÉÑ"
-
-#: addressbook/gui/minicard/e-minicard-control.c:276
-msgid "Save in addressbook"
-msgstr "óÏÈÒÁÎÉÔØ × ÁÄÒÅÓÎÏÊ ËÎÉÇÅ"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"îÅÔ ÜÌÅÍÅÎÔÏ× ÄÌÑ ÏÔÏÂÒÁÖÅÎÉÑ × ÜÔÏÍ ÏËÎÅ\n"
-"\n"
-"ä×ÁÖÄÙ ÝÅÌËÎÉÔÅ ÚÄÅÓØ ÄÌÑ ÓÏÚÄÁÎÉÑ ÎÏ×ÏÇÏ ËÏÎÔÁËÔÁ."
-
-#: addressbook/gui/minicard/test-minicard-view.c:100
-msgid "Reflow Test"
-msgstr "ðÅÒÅÚÁÐÕÓÔÉÔØ ÔÅÓÔ"
-
-#: addressbook/gui/minicard/test-minicard-view.c:101
-msgid "Copyright (C) 2000, Helix Code, Inc."
-msgstr "Copyright (C) 2000 Helix Code, Inc."
-
-#: addressbook/gui/minicard/test-minicard-view.c:103
-msgid "This should test the reflow canvas item"
-msgstr ""
-
-#. gtk_signal_connect(fb->search_entry, "changed", search_activate, fb);
-#: addressbook/gui/search/e-addressbook-search-dialog.c:127
-#: mail/folder-browser.c:368
-msgid "Search"
-msgstr "ðÏÉÓË"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "îÁÓÔÒÏÊËÁ ÓÔÒÁÎÉÃÙ:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "îÁÚ×ÁÎÉÅ ÓÔÉÌÑ:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "ðÒÏÓÍÏÔÒ:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "ðÁÒÁÍÅÔÒÙ"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "÷ËÌÀÞÉÔØ:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "òÁÚÄÅÌÙ:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr "ïÄÉÎ ÚÁ ÄÒÕÇÉÍ"
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr "úÁËÌÁÄËÉ ÂÕË× ÓÂÏËÕ"
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "úÁÇÏÌÏ×ËÉ ÄÌÑ ËÁÖÄÏÊ ÂÕË×Ù"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "îÁÞÉÎÁÔØ Ó ÎÏ×ÏÊ ÓÔÒÁÎÉÃÙ"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "þÉÓÌÏ ÓÔÏÌÂÃÏ×:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "ðÕÓÔÁÑ ÆÏÒÍÁ × ËÏÎÃÅ:"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "ûÒÉÆÔÙ..."
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "ûÒÉÆÔ..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "úÁÇÏÌÏ×ËÉ"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "ôÅÌÏ"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "ðÏÌÕÔÏÎÁ"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "ðÅÞÁÔØ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÐÏÌÕÔÏÎÏ×"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "æÏÒÍÁÔ"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "âÕÍÁÇÁ"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "ôÉÐ:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr "ÍÅÔËÁ26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "òÁÚÍÅÒÙ:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "ûÉÒÉÎÁ:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "÷ÙÓÏÔÁ:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "éÓÔÏÞÎÉË ÂÕÍÁÇÉ:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "ðÏÌÑ"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "ó×ÅÒÈÕ:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "óÎÉÚÕ:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "óÌÅ×Á:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "óÐÒÁ×Á:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "óÔÒÁÎÉÃÁ"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "òÁÚÍÅÒ:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "ïÒÉÅÎÔÁÃÉÑ"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "ðÏÒÔÒÅÔ"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "âÌÏËÎÏÔ"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "úÁÇÏÌÏ×ÏË"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "óÎÏÓËÁ:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "ïÂÒÁÝÁÔØ ÎÁ ÞÅÔÎÙÈ ÓÔÒÁÎÉÃÁÈ"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "úÁÇÏÌÏ×ÏË/óÎÏÓËÁ"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:596
-msgid "am"
-msgstr "Ä.Ð."
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:595
-msgid "pm"
-msgstr "Ð.Ð."
-
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:146
-msgid "Gpilotd calendar conduit"
-msgstr "ëÏÎÄÕÉÔ ËÁÌÅÎÄÁÒÑ Gpilotd"
-
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:149
-msgid "Configuration utility for the calendar conduit.\n"
-msgstr "óÒÅÄÓÔ×Ï ÎÁÓÔÒÏÊËÉ ÄÌÑ ËÏÎÄÕÉÔÁ ËÁÌÅÎÄÁÒÑ.\n"
-
-#: calendar/conduits/calendar/calendar-conduit.c:399
-#: calendar/conduits/calendar/calendar-conduit.c:1109
-#: calendar/conduits/todo/todo-conduit.c:443
-#: calendar/conduits/todo/todo-conduit.c:1025
-msgid "Error while communicating with calendar server"
-msgstr "ïÛÉÂËÁ ÐÒÉ ÐÏÄËÌÀÞÅÎÉÉ Ë ÓÅÒ×ÅÒÕ ËÁÌÅÎÄÁÒÑ"
-
-#: calendar/conduits/calendar/calendar-conduit.c:776
-#: calendar/conduits/calendar/calendar-conduit.c:778
-#: calendar/conduits/todo/todo-conduit.c:707
-#: calendar/conduits/todo/todo-conduit.c:709
-msgid "Could not start gnomecal server"
-msgstr "îÅ ÕÄÁÌÏÓØ ÚÁÐÕÓÔÉÔØ ÓÅÒ×ÅÒ gnomecal"
-
-#: calendar/conduits/calendar/calendar-conduit.c:806
-#: calendar/conduits/calendar/calendar-conduit.c:809
-msgid "Could not read pilot's DateBook application block"
-msgstr "îÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÅÓÔØ ÂÌÏË ÐÒÉÌÏÖÅÎÉÑ ËÎÉÇÉ ÄÁÎÎÙÈ ðÉÌÏÔÁ"
-
-#: calendar/conduits/todo/todo-conduit-control-applet.c:146
-msgid "Gpilotd todo conduit"
-msgstr "ëÏÎÄÕÉÔ ÚÁÄÁÎÉÊ Gpilotd"
-
-#: calendar/conduits/todo/todo-conduit-control-applet.c:149
-msgid "Configuration utility for the todo conduit.\n"
-msgstr "óÒÅÄÓÔ×Ï ÎÁÓÔÒÏÊËÉ ÄÌÑ ËÏÎÄÕÉÔÁ ÚÁÄÁÎÉÊ.\n"
-
-#: calendar/conduits/todo/todo-conduit.c:737
-#: calendar/conduits/todo/todo-conduit.c:740
-msgid "Could not read pilot's ToDo application block"
-msgstr "îÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÅÓÔØ ÂÌÏË ÐÒÉÌÏÖÅÎÉÑ ÚÁÄÁÎÉÊ ðÉÌÏÔÁ"
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Outline:"
-msgstr "ëÏÎÔÕÒ:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Headings:"
-msgstr "úÁÇÏÌÏ×ËÉ:"
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Empty days:"
-msgstr "ðÕÓÔÙÅ ÄÎÉ:"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Appointments:"
-msgstr "÷ÓÔÒÅÞÉ:"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "Highlighted day:"
-msgstr "ðÏÄÓ×ÅÞÅÎÎÙÅ ÄÎÉ:"
-
-#: calendar/gui/calendar-commands.c:64
-msgid "Day numbers:"
-msgstr "þÉÓÌÁ ÄÎÅÊ:"
-
-#: calendar/gui/calendar-commands.c:65
-msgid "Current day's number:"
-msgstr "þÉÓÌÏ ÔÅËÕÝÅÇÏ ÄÎÑ:"
-
-#: calendar/gui/calendar-commands.c:66
-msgid "To-Do item that is not yet due:"
-msgstr "úÁÄÁÎÉÑ, ÄÌÑ ËÏÔÏÒÙÈ ÓÒÏË ×ÙÐÏÌÎÅÎÉÑ ÎÅ ÎÁÓÔÁÌ:"
-
-#: calendar/gui/calendar-commands.c:67
-msgid "To-Do item that is due today:"
-msgstr "úÁÄÁÎÉÑ, ËÏÔÏÒÙÅ ÄÏÌÖÎÙ ÂÙÔØ ×ÙÐÏÌÎÅÎÙ ÓÅÇÏÄÎÑ:"
-
-#: calendar/gui/calendar-commands.c:68
-msgid "To-Do item that is overdue:"
-msgstr "ðÒÏÓÒÏÞÅÎÎÙÅ ÚÁÄÁÎÉÑ:"
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr "ëÁÌÅÎÄÁÒØ Gnome"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "ìÉÞÎÙÊ ËÁÌÅÎÄÁÒØ É ÄÉÓÐÅÔÞÅÒ ÒÁÓÐÉÓÁÎÉÑ Gnome."
-
-#: calendar/gui/calendar-commands.c:401 tests/ui-tests/message-browser.c:676
-msgid "File not found"
-msgstr "æÁÊÌ ÎÅ ÎÁÊÄÅÎ"
-
-#: calendar/gui/calendar-commands.c:423
-msgid "Open calendar"
-msgstr "ïÔËÒÙÔØ ËÁÌÅÎÄÁÒØ"
-
-#: calendar/gui/calendar-commands.c:462
-msgid "Save calendar"
-msgstr "óÏÈÒÁÎÉÔØ ËÁÌÅÎÄÁÒØ"
-
-#: calendar/gui/calendar-commands.c:489 calendar/gui/gncal-todo.c:763
-#: calendar/gui/gncal-todo.c:767
-msgid "Day"
-msgstr "äÅÎØ"
-
-#: calendar/gui/calendar-commands.c:489
-msgid "Show 1 day"
-msgstr "ðÏËÁÚÁÔØ 1 ÄÅÎØ"
-
-#: calendar/gui/calendar-commands.c:492
-msgid "5 Days"
-msgstr "5 ÄÎÅÊ"
-
-#: calendar/gui/calendar-commands.c:492
-msgid "Show the working week"
-msgstr "ðÏËÁÚÁÔØ ÒÁÂÏÞÕÀ ÎÅÄÅÌÀ"
-
-#: calendar/gui/calendar-commands.c:495 calendar/gui/gncal-todo.c:762
-msgid "Week"
-msgstr "îÅÄÅÌÑ"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Show 1 week"
-msgstr "ðÏËÁÚÁÔØ 1 ÎÅÄÅÌÀ"
-
-#: calendar/gui/calendar-commands.c:498
-msgid "Month"
-msgstr "íÅÓÑÃ"
-
-#: calendar/gui/calendar-commands.c:498
-msgid "Show 1 month"
-msgstr "ðÏËÁÚÁÔØ 1 ÍÅÓÑÃ"
-
-#: calendar/gui/calendar-commands.c:502
-msgid "Year"
-msgstr "çÏÄ"
-
-#: calendar/gui/calendar-commands.c:502
-msgid "Show 1 year"
-msgstr "ðÏËÁÚÁÔØ 1 ÇÏÄ"
-
-#: calendar/gui/calendar-commands.c:511 calendar/gui/calendar-commands.c:663
-msgid "Create a new appointment"
-msgstr "óÏÚÄÁÔØ ÎÏ×ÕÀ ×ÓÔÒÅÞÕ"
-
-#: calendar/gui/calendar-commands.c:516 calendar/gui/calendar-commands.c:655
-msgid "Print this calendar"
-msgstr "îÁÐÅÞÁÔÁÔØ ÜÔÏÔ ËÁÌÅÎÄÁÒØ"
-
-#: calendar/gui/calendar-commands.c:520
-msgid "Prev"
-msgstr "ðÒÅÄ."
-
-#: calendar/gui/calendar-commands.c:520
-msgid "Go back in time"
-msgstr "ðÅÒÅÊÔÉ × ÐÒÏÛÌÏÅ"
-
-#: calendar/gui/calendar-commands.c:521
-msgid "Today"
-msgstr "óÅÇÏÄÎÑ"
-
-#: calendar/gui/calendar-commands.c:521
-msgid "Go to present time"
-msgstr "ðÅÒÅÊÔÉ Ë ÎÁÓÔÏÑÝÅÍÕ"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Next"
-msgstr "óÌÅÄ."
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Go forward in time"
-msgstr "ðÅÒÅÊÔÉ × ÂÕÄÕÝÅÅ"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Go to"
-msgstr "ðÅÒÅÊÔÉ"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Go to a specific date"
-msgstr "ðÅÒÅÊÔÉ Ë ÕËÁÚÁÎÎÏÊ ÄÁÔÅ"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:640
-msgid "New Ca_lendar"
-msgstr "îÏ×ÙÊ ËÁÌÅÎÄÁÒØ"
-
-#: calendar/gui/calendar-commands.c:641
-msgid "Create a new calendar"
-msgstr "óÏÚÄÁÔØ ÎÏ×ÙÊ ËÁÌÅÎÄÁÒØ"
-
-#: calendar/gui/calendar-commands.c:644
-msgid "Open Ca_lendar"
-msgstr "ïÔËÒÙÔØ ËÁÌÅÎÄÁÒØ"
-
-#: calendar/gui/calendar-commands.c:645
-msgid "Open a calendar"
-msgstr "ïÔËÒÙÔØ ËÁÌÅÎÄÁÒØ"
-
-#: calendar/gui/calendar-commands.c:649 calendar/gui/calendar-commands.c:650
-msgid "Save Calendar As"
-msgstr "óÏÈÒÁÎÉÔØ ËÁÌÅÎÄÁÒØ ËÁË"
-
-#: calendar/gui/calendar-commands.c:663
-msgid "_New appointment..."
-msgstr "îÏ×ÁÑ ×ÓÔÒÅÞÁ..."
-
-#: calendar/gui/calendar-commands.c:671 calendar/gui/prop.c:716
-msgid "Preferences"
-msgstr "îÁÓÔÒÏÊËÉ"
-
-#: calendar/gui/calendar-commands.c:678 calendar/gui/calendar-commands.c:679
-msgid "About Calendar"
-msgstr "ï ÐÒÏÇÒÁÍÍÅ \"ëÁÌÅÎÄÁÒØ\""
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:721
-#, c-format
-msgid "%s%s"
-msgstr "%s%s"
-
-#: calendar/gui/calendar-commands.c:721
-msgid "'s calendar"
-msgstr "' ËÁÌÅÎÄÁÒØ"
-
-#: calendar/gui/calendar-model.c:323
-msgid "Public"
-msgstr "ïÂÝÅÅ"
-
-#: calendar/gui/calendar-model.c:326
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:27
-msgid "Private"
-msgstr "ìÉÞÎÏÅ"
-
-#: calendar/gui/calendar-model.c:329
-msgid "Confidential"
-msgstr "ëÏÎÆÉÄÅÎÃÉÁÌØÎÏÅ"
-
-#: calendar/gui/calendar-model.c:332 calendar/gui/calendar-model.c:499
-msgid "Unknown"
-msgstr "îÅÉÚ×ÅÓÔÎÏÅ"
-
-#: calendar/gui/calendar-model.c:419
-msgid "N"
-msgstr "ó"
-
-#: calendar/gui/calendar-model.c:419
-msgid "S"
-msgstr "à"
-
-#: calendar/gui/calendar-model.c:421
-msgid "E"
-msgstr "÷"
-
-#: calendar/gui/calendar-model.c:421
-msgid "W"
-msgstr "ú"
-
-#: calendar/gui/calendar-model.c:493
-msgid "Transparent"
-msgstr "ðÒÏÚÒÁÞÎÙÊ"
-
-#: calendar/gui/calendar-model.c:496
-msgid "Opaque"
-msgstr "îÅÐÒÏÚÒÁÞÎÙÊ"
-
-#: calendar/gui/calendar-model.c:747
-#, c-format
-msgid ""
-"The date must be entered in the format: \n"
-"\n"
-"%s"
-msgstr ""
-"äÁÔÁ ÄÏÌÖÎÁ ÂÙÔØ ××ÅÄÅÎÁ × ÆÏÒÍÁÔÅ:\n"
-"\n"
-"%s"
-
-#: calendar/gui/calendar-model.c:820
-msgid ""
-"The geographical position must be entered in the format: \n"
-"\n"
-"45.436845,125.862501"
-msgstr ""
-"çÅÏÇÒÁÆÉÞÅÓËÏÅ ÐÏÌÏÖÅÎÉÅ ÄÏÌÖÎÏ ÂÙÔØ ××ÅÄÅÎÏ × ÆÏÒÍÁÔÅ:\n"
-"\n"
-"45.436845,125.862501"
-
-#: calendar/gui/calendar-model.c:865
-msgid "The percent value must be between 0 and 100"
-msgstr "úÎÁÞÅÎÉÅ ÐÒÏÃÅÎÔÁ ÄÏÌÖÎÏ ÂÙÔØ ÍÅÖÄÕ 0 É 100"
-
-#: calendar/gui/calendar-model.c:898
-msgid "The priority must be between 0 and 10"
-msgstr "ðÒÉÏÒÉÔÅÔ ÄÏÌÖÅÎ ÂÙÔØ ÍÅÖÄÕ 0 É 10"
-
-#: calendar/gui/control-factory.c:132
-msgid "The URI that the calendar will display"
-msgstr "URI, ËÏÔÏÒÙÊ ÂÕÄÅÔ ÐÏËÁÚÙ×ÁÔØ ËÁÌÅÎÄÁÒØ"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:183
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "ôÁÊÍÅÒ ÎÁ %A %b %d %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:190
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr "õ×ÅÄÏÍÌÅÎÉÅ Ï ×ÁÛÅÊ ×ÓÔÒÅÞÅ × %A %b %d %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:201
-msgid "No summary available."
-msgstr "éÔÏÇ ÎÅ ÄÏÓÔÕÐÅÎ."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "úÁËÒÙÔØ"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1086
-msgid "Snooze"
-msgstr "ëÏÒÏÔËÉÊ ÓÏÎ"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "ðÒÁ×ËÁ ×ÓÔÒÅÞÉ"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr "÷ÒÅÍÑ ÄÒÅÍÁÎÉÑ (ÍÉÎÕÔ)"
-
-#: calendar/gui/dialogs/task-editor.c:245 calendar/gui/event-editor.c:1209
-msgid "FIXME: _Delete"
-msgstr "FIXME: õÄÁÌÉÔØ"
-
-#: calendar/gui/dialogs/task-editor.c:287
-#: calendar/gui/dialogs/task-editor.c:295
-msgid "FIXME: In_complete Task"
-msgstr "FIXME: îÅ×ÙÐÏÌÎÅÎÎÏÅ úÁÄÁÎÉÅ"
-
-#: calendar/gui/dialogs/task-editor.c:347 calendar/gui/event-editor.c:1311
-msgid "FIXME: Chec_k Names"
-msgstr "FIXME: ðÒÏ×ÅÒËÁ ÉÍÅÎ"
-
-#: calendar/gui/dialogs/task-editor.c:348 calendar/gui/event-editor.c:1312
-msgid "FIXME: Address _Book..."
-msgstr "FIXME: áÄÒÅÓÎÁÑ ËÎÉÇÁ..."
-
-#: calendar/gui/dialogs/task-editor.c:355
-msgid "FIXME: _New Task"
-msgstr "FIXME: îÏ×ÏÅ úÁÄÁÎÉÅ"
-
-#: calendar/gui/dialogs/task-editor.c:357
-msgid "FIXME: S_end Status Report"
-msgstr "FIXME: ïÔÐÒÁ×ÉÔØ ÏÔÞÅÔ Ï ÓÏÓÔÏÑÎÉÉ"
-
-#: calendar/gui/dialogs/task-editor.c:358
-msgid "FIXME: _Mark Complete"
-msgstr "FIXME: ðÏÍÅÔÉÔØ ËÁË ×ÙÐÏÌÎÅÎÎÏÅ"
-
-#: calendar/gui/dialogs/task-editor.c:360 calendar/gui/event-editor.c:1321
-msgid "FIXME: Rec_urrence..."
-msgstr "FIXME: ðÏ×ÔÏÒÅÎÉÅ..."
-
-#: calendar/gui/dialogs/task-editor.c:361
-msgid "FIXME: S_kip Occurrence"
-msgstr "FIXME: ðÒÏÐÕÓÔÉÔØ ÓÌÕÞÁÊ"
-
-#: calendar/gui/dialogs/task-editor.c:363
-msgid "FIXME: Assig_n Task"
-msgstr "FIXME: îÁÚÎÁÞÉÔØ úÁÄÁÎÉÅ"
-
-#: calendar/gui/dialogs/task-editor.c:365
-msgid "FIXME: _Reply"
-msgstr "FIXME: ïÔ×ÅÔÉÔØ"
-
-#: calendar/gui/dialogs/task-editor.c:366
-msgid "FIXME: Reply to A_ll"
-msgstr "FIXME: ïÔ×ÅÔÉÔØ ×ÓÅÍ"
-
-#: calendar/gui/dialogs/task-editor.c:409 calendar/gui/event-editor.c:1381
-msgid "FIXME: Save and Close"
-msgstr "FIXME: óÏÈÒÁÎÉÔØ É ÚÁËÒÙÔØ"
-
-#: calendar/gui/dialogs/task-editor.c:410
-msgid "Save the task and close the dialog box"
-msgstr "óÏÈÒÁÎÉÔØ ÚÁÄÁÎÉÅ É ÚÁËÒÙÔØ ÏËÎÏ ÄÉÁÌÏÇÁ"
-
-#: calendar/gui/dialogs/task-editor.c:414 calendar/gui/event-editor.c:1386
-msgid "FIXME: Print..."
-msgstr "FIXME: ðÅÞÁÔØ..."
-
-#: calendar/gui/dialogs/task-editor.c:419 calendar/gui/event-editor.c:1391
-msgid "FIXME: Recurrence..."
-msgstr "FIXME: ðÏ×ÔÏÒÅÎÉÅ..."
-
-#: calendar/gui/dialogs/task-editor.c:420 calendar/gui/event-editor.c:1392
-msgid "Configure recurrence rules"
-msgstr "îÁÓÔÒÏÊËÁ ÐÒÁ×ÉÌ ÐÏ×ÔÏÒÅÎÉÑ"
-
-#: calendar/gui/dialogs/task-editor.c:422
-msgid "FIXME: Assign Task..."
-msgstr "FIXME: îÁÚÎÁÞÉÔØ ÚÁÄÁÎÉÅ..."
-
-#: calendar/gui/dialogs/task-editor.c:423
-msgid "Assign the task to someone"
-msgstr "îÁÚÎÁÞÉÔØ ÚÁÄÁÎÉÅ ËÏÍÕ-ÌÉÂÏ"
-
-#: calendar/gui/dialogs/task-editor.c:425 calendar/gui/event-editor.c:1397
-msgid "FIXME: Delete"
-msgstr "FIXME: õÄÁÌÉÔØ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:7
-msgid "S_ubject:"
-msgstr "ôÅÍÁ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:8
-msgid "Owner:"
-msgstr "÷ÌÁÄÅÌÅÃ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:9
-msgid "Sta_rt Date:"
-msgstr "äÁÔÁ ÎÁÞÁÌÁ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:10
-msgid "_Due Date:"
-msgstr "õÓÌÏ×ÌÅÎÎÁÑ ÄÁÔÁ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:11
-msgid "_Status:"
-msgstr "óÏÓÔÏÑÎÉÅ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:12
-msgid ""
-"Not Started\n"
-"In Progress\n"
-"Completed\n"
-"Cancelled\n"
-msgstr ""
-"îÅ ÎÁÞÁÔÏ\n"
-"÷ ÐÒÏÃÅÓÓÅ\n"
-"úÁ×ÅÒÛÅÎÏ\n"
-"ïÔÍÅÎÅÎÏ\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:17
-msgid "Not Started"
-msgstr "îÅ ÎÁÞÁÔÏ"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:18
-msgid "_Priority:"
-msgstr "ðÒÉÏÒÉÔÅÔ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:19
-msgid ""
-"High\n"
-"Normal\n"
-"Low\n"
-msgstr ""
-"÷ÙÓÏËÉÊ\n"
-"îÏÒÍÁÌØÎÙÊ\n"
-"îÉÚËÉÊ\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:23
-msgid "High"
-msgstr "÷ÙÓÏËÉÊ"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:24
-msgid "% Comp_lete:"
-msgstr "% ÷ÙÐÏÌÎÅÎÉÑ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:25
-msgid "_Contacts..."
-msgstr "ëÏÎÔÁËÔÙ..."
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:28
-msgid "Task"
-msgstr "úÁÄÁÎÉÅ"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:29
-msgid "Date Completed:"
-msgstr "äÁÔÁ ×ÙÐÏÌÎÅÎÉÑ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:30
-msgid "Location:"
-msgstr "òÁÓÐÏÌÏÖÅÎÉÅ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:31
-msgid "URL:"
-msgstr "URL:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:32
-msgid "Resources:"
-msgstr "éÓÔÏÞÎÉËÉ:"
-
-#: calendar/gui/e-calendar-table.c:189
-msgid "Comment"
-msgstr "ëÏÍÍÅÎÔÁÒÉÊ"
-
-#: calendar/gui/e-calendar-table.c:194
-msgid "Completed"
-msgstr "úÁ×ÅÒÛÅÎÏ"
-
-#: calendar/gui/e-calendar-table.c:199
-msgid "Created"
-msgstr "óÏÚÄÁÎÏ"
-
-#: calendar/gui/e-calendar-table.c:204
-msgid "Description"
-msgstr "ïÐÉÓÁÎÉÅ"
-
-#: calendar/gui/e-calendar-table.c:209
-msgid "Timestamp"
-msgstr "ïÔÍÅÔËÁ ×ÒÅÍÅÎÉ"
-
-#: calendar/gui/e-calendar-table.c:214
-msgid "Start Date"
-msgstr "äÁÔÁ ÎÁÞÁÌÁ"
-
-#: calendar/gui/e-calendar-table.c:219
-msgid "End Date"
-msgstr "äÁÔÁ ÏËÏÎÞÁÎÉÑ"
-
-#: calendar/gui/e-calendar-table.c:224
-msgid "Geographical Position"
-msgstr "çÅÏÇÒÁÆÉÞÅÓËÏÅ ÐÏÌÏÖÅÎÉÅ"
-
-#: calendar/gui/e-calendar-table.c:229
-msgid "Last Modification Date"
-msgstr "äÁÔÁ ÐÏÓÌÅÄÎÅÇÏ ÉÚÍÅÎÅÎÉÑ"
-
-#: calendar/gui/e-calendar-table.c:234
-msgid "Location"
-msgstr "ðÏÌÏÖÅÎÉÅ"
-
-#: calendar/gui/e-calendar-table.c:239
-msgid "Organizer"
-msgstr "ïÒÇÁÎÉÚÁÔÏÒ"
-
-#: calendar/gui/e-calendar-table.c:244
-msgid "% Complete"
-msgstr "% ÷ÙÐÏÌÎÅÎÏ"
-
-#: calendar/gui/e-calendar-table.c:249 calendar/gui/gncal-todo.c:476
-#: calendar/gui/prop.c:609 mail/message-list.c:508
-msgid "Priority"
-msgstr "ðÒÉÏÒÉÔÅÔ"
-
-#: calendar/gui/e-calendar-table.c:260
-msgid "TaskPad"
-msgstr "úÁÄÁÎÉÑ"
-
-#: calendar/gui/e-calendar-table.c:265
-msgid "URL"
-msgstr "URL"
-
-#: calendar/gui/e-calendar-table.c:270
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "Reminder"
-msgstr "îÁÐÏÍÉÎÁÎÉÅ"
-
-#: calendar/gui/e-calendar-table.c:369
-msgid "Open..."
-msgstr "ïÔËÒÙÔØ..."
-
-#: calendar/gui/e-calendar-table.c:370
-msgid "Open the task"
-msgstr "ïÔËÒÙÔØ ÚÁÄÁÎÉÅ"
-
-#: calendar/gui/e-calendar-table.c:372
-msgid "Mark Complete"
-msgstr "ðÏÍÅÔÉÔØ ËÁË ×ÙÐÏÌÎÅÎÎÏÅ"
-
-#: calendar/gui/e-calendar-table.c:373
-msgid "Mark the task complete"
-msgstr "ðÏÍÅÔÉÔØ ÚÁÄÁÎÉÅ ËÁË ×ÙÐÏÌÎÅÎÎÏÅ"
-
-#: calendar/gui/e-calendar-table.c:376
-msgid "Delete the task"
-msgstr "õÄÁÌÉÔØ ÚÁÄÁÎÉÅ"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "îÏ×ÁÑ ×ÓÔÒÅÞÁ..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "ðÒÁ×ËÁ ÜÔÏÊ ×ÓÔÒÅÞÉ..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "õÄÁÌÉÔØ ÜÔÕ ×ÓÔÒÅÞÕ"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "óÄÅÌÁÔØ ÜÔÕ ×ÓÔÒÅÞÕ ÐÅÒÅÍÅÝÁÅÍÏÊ"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr "õÄÁÌÉÔØ ÜÔÏÔ ÓÌÕÞÁÊ"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr "õÄÁÌÉÔØ ×ÓÅ ÓÌÕÞÁÉ"
-
-#: calendar/gui/event-editor.c:294
-msgid "Edit Appointment"
-msgstr "ðÒÁ×ËÁ ×ÓÔÒÅÞÉ"
-
-#: calendar/gui/event-editor.c:300
-msgid "No summary"
-msgstr "îÅÔ ÉÔÏÇÁ"
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Appointment - %s"
-msgstr "÷ÓÔÒÅÞÁ - %s"
-
-#: calendar/gui/event-editor.c:309
-#, c-format
-msgid "Task - %s"
-msgstr "úÁÄÁÎÉÅ - %s"
-
-#: calendar/gui/event-editor.c:312
-#, c-format
-msgid "Journal entry - %s"
-msgstr "öÕÒÎÁÌØÎÁÑ ÚÁÐÉÓØ - %s"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:613 calendar/gui/event-editor.c:717
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1276
-msgid "FIXME: Ca_lendar..."
-msgstr "FIXME: ëÁÌÅÎÄÁÒØ..."
-
-#: calendar/gui/event-editor.c:1319
-msgid "FIXME: _New Appointment"
-msgstr "FIXME: îÏ×ÁÑ ×ÓÔÒÅÞÁ"
-
-#: calendar/gui/event-editor.c:1323
-msgid "FIXME: Invite _Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1324
-msgid "FIXME: C_ancel Invitation..."
-msgstr "FIXME: ïÔÍÅÎÁ ÐÒÉÇÌÁÛÅÎÉÑ..."
-
-#: calendar/gui/event-editor.c:1326
-msgid "FIXME: Forward as v_Calendar"
-msgstr "FIXME: ðÅÒÅÓÌÁÔØ ËÁË v_Calendar"
-
-#: calendar/gui/event-editor.c:1394
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1395
-msgid "Invite attendees to a meeting"
-msgstr "ðÒÉÇÌÁÓÉÔØ ÐÏÓÅÔÉÔÅÌÅÊ ÎÁ ×ÓÔÒÅÞÕ"
-
-#: calendar/gui/event-editor.c:1838
-msgid "%a %b %d %Y"
-msgstr "%a %b %d %Y"
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr "ÄÉÁÌÏÇ ÒÅÄÁËÔÏÒÁ ÓÏÂÙÔÉÊ"
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr "éÔÏÇ:"
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr "÷ÌÁÄÅÌÅÃ:"
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr "÷ÒÅÍÑ"
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr "÷ÒÅÍÑ ÎÁÞÁÌÁ:"
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr "÷ÒÅÍÑ ÏËÏÎÞÁÎÉÑ:"
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr "÷ÓÅ ÓÏÂÙÔÉÑ ÄÎÑ"
-
-#: calendar/gui/event-editor-dialog.glade.h:14
-msgid "Classification"
-msgstr "ëÌÁÓÓÉÆÉËÁÃÉÑ"
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-msgid "Pu_blic"
-msgstr "ïÂÝÅÅ"
-
-#: calendar/gui/event-editor-dialog.glade.h:16
-msgid "Pri_vate"
-msgstr "ìÉÞÎÏÅ"
-
-#: calendar/gui/event-editor-dialog.glade.h:17
-msgid "_Confidential"
-msgstr "ëÏÎÆÉÄÅÎÃÉÁÌØÎÏÅ"
-
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-"íÉÎÕÔÙ\n"
-"þÁÓÙ\n"
-"äÎÉ\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "_Display"
-msgstr "ïÔÏÂÒÁÚÉÔØ"
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Audio"
-msgstr "áÕÄÉÏ"
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "_Program"
-msgstr "ðÒÏÇÒÁÍÍÁ"
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "_Mail"
-msgstr "ðÏÞÔÁ"
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-msgid "Mail _to:"
-msgstr "ðÏÞÔÁ ÄÌÑ:"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Run program:"
-msgstr "úÁÐÕÓÔÉÔØ ÐÒÏÇÒÁÍÍÕ:"
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr "ðÒÁ×ÉÌÏ ÐÏ×ÔÏÒÅÎÉÑ"
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:875
-msgid "None"
-msgstr "îÅÔ"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-msgid "Daily"
-msgstr "åÖÅÄÎÅ×ÎÏ"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr "åÖÅÎÅÄÅÌØÎÏ"
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr "åÖÅÍÅÓÑÞÎÏ"
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr "åÖÅÇÏÄÎÏ"
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr "ÍÅÔËÁ23"
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr "ëÁÖÄÙÊ"
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr "ÄÅÎØ"
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr "ÍÅÔËÁ24"
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr "ÎÅÄÅÌÑ"
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "ðÏÎ"
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "÷ÔÒ"
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "óÒÄ"
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "þÔ×"
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "ðÑÔ"
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "óÕÂ"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "÷ÓË"
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr "ÍÅÔËÁ25"
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr "ðÏ×ÔÏÒ"
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr "-ÏÊ ÄÅÎØ ÍÅÓÑÃÁ"
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-"1ÙÊ\n"
-"2ÏÊ\n"
-"3ÉÊ\n"
-"4ÙÊ\n"
-"5ÙÊ\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-"ðÏÎÅÄÅÌØÎÉË\n"
-"÷ÔÏÒÎÉË\n"
-"óÒÅÄÁ\n"
-"þÅÔ×ÅÒÇ\n"
-"ðÑÔÎÉÃÁ\n"
-"óÕÂÂÏÔÁ\n"
-"÷ÏÓËÒÅÓÅÎØÅ\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr "ëÁÖÄÙÊ"
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-msgid "month(s)"
-msgstr "ÍÅÓÑÃ"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr "ÇÏÄ"
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr "ÍÅÔËÁ27"
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr "äÁÔÁ ÚÁ×ÅÒÛÅÎÉÑ"
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr "âÅÓËÏÎÅÞÎÏÅ ÐÏ×ÔÏÒÅÎÉÅ"
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr "úÁËÏÎÞÉÔØ ×"
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr "úÁËÏÎÞÉÔØ ÐÏÓÌÅ"
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr "ÓÌÕÞÁÉ"
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-msgid "Exceptions"
-msgstr "éÓËÌÀÞÅÎÉÑ"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-msgid "Change"
-msgstr "éÚÍÅÎÉÔØ"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr "ðÏ×ÔÏÒÅÎÉÅ"
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "ÑÎ×ÁÒØ"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "ÆÅ×ÒÁÌØ"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "ÍÁÒÔ"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "ÁÐÒÅÌØ"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "ÍÁÊ"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "ÉÀÎØ"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "ÉÀÌØ"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "Á×ÇÕÓÔ"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "ÓÅÎÔÑÂÒØ"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "ÓÅÎÔ"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "ÏËÔÑÂÒØ"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "ÎÏÑÂÒØ"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "ÄÅËÁÂÒØ"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "×ÏÓËÒÅÓÅÎØÅ"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "ÐÏÎÅÄÅÌØÎÉË"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "×ÔÏÒÎÉË"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "×ÔÒÎ"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "ÓÒÅÄÁ"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "ÓÒÄ"
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "ÞÅÔ×ÅÒÇ"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "ÞÅÔ×"
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "ÞÅÔ×"
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "ÐÑÔÎÉÃÁ"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "ÓÕÂÂÏÔÁ"
-
-#: calendar/gui/getdate.y:420 filter/filter-datespec.c:61
-msgid "year"
-msgstr "ÇÏÄ"
-
-#: calendar/gui/getdate.y:421 filter/filter-datespec.c:62
-msgid "month"
-msgstr "ÍÅÓÑÃ"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr "Ä×Å ÎÅÄÅÌÉ"
-
-#: calendar/gui/getdate.y:423 filter/filter-datespec.c:63
-msgid "week"
-msgstr "ÎÅÄÅÌÑ"
-
-#: calendar/gui/getdate.y:424 filter/filter-datespec.c:64
-msgid "day"
-msgstr "ÄÅÎØ"
-
-#: calendar/gui/getdate.y:425 filter/filter-datespec.c:65
-msgid "hour"
-msgstr "ÞÁÓ"
-
-#: calendar/gui/getdate.y:426 filter/filter-datespec.c:66
-msgid "minute"
-msgstr "ÍÉÎÕÔÁ"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "ÍÉÎ"
-
-#: calendar/gui/getdate.y:428 filter/filter-datespec.c:67
-msgid "second"
-msgstr "ÓÅËÕÎÄÁ"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "ÓÅË"
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "ÚÁ×ÔÒÁ"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "×ÞÅÒÁ"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "ÓÅÇÏÄÎÑ"
-
-#: calendar/gui/getdate.y:438 filter/filter-datespec.c:504
-#: filter/filter-datespec.c:664
-msgid "now"
-msgstr "ÓÅÊÞÁÓ"
-
-#: calendar/gui/getdate.y:439
-msgid "last"
-msgstr "ÐÏÓÌÅÄÎÉÊ"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr "ÜÔÏÔ"
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr "cÌÅÄ."
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr "ÐÅÒ×ÙÊ"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr "ÔÒÅÔÉÊ"
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr "ÞÅÔ×ÅÒÔÙÊ"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr "ÐÑÔÙÊ"
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr "ÛÅÓÔÏÊ"
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr "ÓÅÄØÍÏÊ"
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr "×ÏÓØÍÏÊ"
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr "ÄÅ×ÑÔÙÊ"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr "ÄÅÓÑÔÙÊ"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr "ÏÄÉÎÁÄÃÁÔÙÊ"
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr "Ä×ÅÎÁÄÃÁÔÙÊ"
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr "ÎÁÚÁÄ"
-
-#: calendar/gui/gncal-todo.c:167
-msgid "Create to-do item"
-msgstr "óÏÚÄÁÔØ ÚÁÄÁÎÉÅ"
-
-#: calendar/gui/gncal-todo.c:167
-msgid "Edit to-do item"
-msgstr "ðÒÁ×ËÁ ÚÁÄÁÎÉÑ"
-
-#: calendar/gui/gncal-todo.c:203
-msgid "Summary:"
-msgstr "éÔÏÇ:"
-
-#: calendar/gui/gncal-todo.c:214
-msgid "Due Date:"
-msgstr "õÓÌÏ×ÌÅÎÎÁÑ ÄÁÔÁ:"
-
-#: calendar/gui/gncal-todo.c:225
-msgid "Priority:"
-msgstr "ðÒÉÏÒÉÔÅÔ:"
-
-#: calendar/gui/gncal-todo.c:243
-msgid "Item Comments:"
-msgstr "ëÏÍÍÅÎÔÁÒÉÉ ÜÌÅÍÅÎÔÁ:"
-
-#: calendar/gui/gncal-todo.c:374
-msgid "Add to-do item..."
-msgstr "äÏÂÁ×ÉÔØ ÚÁÄÁÎÉÅ..."
-
-#: calendar/gui/gncal-todo.c:375
-msgid "Edit this item..."
-msgstr "ðÒÁ×ËÁ ÜÔÏÇÏ ÜÌÅÍÅÎÔÁ..."
-
-#: calendar/gui/gncal-todo.c:474
-msgid "Summary"
-msgstr "éÔÏÇÏ"
-
-#: calendar/gui/gncal-todo.c:475 calendar/gui/prop.c:608
-msgid "Due Date"
-msgstr "õÓÌÏ×ÌÅÎÎÁÑ ÄÁÔÁ"
-
-#: calendar/gui/gncal-todo.c:477
-msgid "Time Left"
-msgstr "ïÓÔÁ×ÛÅÅÓÑ ×ÒÅÍÑ"
-
-#. Label
-#: calendar/gui/gncal-todo.c:489
-msgid "To-do list"
-msgstr "óÐÉÓÏË ÚÁÄÁÎÉÊ"
-
-#. Add
-#: calendar/gui/gncal-todo.c:528
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "äÏÂÁ×ÉÔØ..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:537
-msgid "Edit..."
-msgstr "ðÒÁ×ËÁ..."
-
-#: calendar/gui/gncal-todo.c:762
-msgid "Weeks"
-msgstr "îÅÄÅÌÉ"
-
-#: calendar/gui/gncal-todo.c:763 calendar/gui/gncal-todo.c:767
-msgid "Days"
-msgstr "äÎÉ"
-
-#: calendar/gui/gncal-todo.c:768 calendar/gui/gncal-todo.c:772
-msgid "Hours"
-msgstr "þÁÓÙ"
-
-#: calendar/gui/gncal-todo.c:768 calendar/gui/gncal-todo.c:772
-msgid "Hour"
-msgstr "þÁÓ"
-
-#: calendar/gui/gncal-todo.c:773 calendar/gui/gncal-todo.c:777
-msgid "Minutes"
-msgstr "íÉÎÕÔÙ"
-
-#: calendar/gui/gncal-todo.c:773 calendar/gui/gncal-todo.c:777
-msgid "Minute"
-msgstr "íÉÎÕÔÁ"
-
-#: calendar/gui/gncal-todo.c:778 calendar/gui/gncal-todo.c:782
-msgid "Seconds"
-msgstr "óÅËÕÎÄÙ"
-
-#: calendar/gui/gncal-todo.c:778 calendar/gui/gncal-todo.c:782
-msgid "Second"
-msgstr "óÅËÕÎÄÁ"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1094
-#: calendar/gui/gnome-cal.c:1150
-msgid "Reminder of your appointment at "
-msgstr "îÁÐÏÍÉÎÁÎÉÅ Ï ×ÁÛÅÊ ×ÓÔÒÅÞÅ × "
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1099 calendar/gui/gnome-cal.c:1154
-msgid "Ok"
-msgstr "ïË"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "çÏÄ:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "ðÅÒÅÊÔÉ Ë ÄÁÔÅ"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-"ðÏÖÁÌÕÊÓÔÁ ×ÙÂÅÒÉÔÅ ÄÁÔÕ, Ë ËÏÔÏÒÏÊ ÷Ù ÈÏÔÉÔÅ\n"
-"ÐÅÒÅÊÔÉ. ëÏÇÄÁ ÷Ù ÝÅÌËÎÅÔÅ ËÎÏÐËÏÊ ÍÙÛÉ ÎÁ\n"
-"ÎÕÖÎÏÍ ÄÎÅ, ÷Ù ÐÅÒÅÊÄÅÔÅ Ë ÜÔÏÊ ÄÁÔÅ."
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "ðÅÒÅÊÔÉ Ë ÓÅÇÏÄÎÑÛÎÅÍÕ ÄÎÀ"
-
-#: calendar/gui/print.c:288
-msgid "1st"
-msgstr "1-ÙÊ"
-
-#: calendar/gui/print.c:288
-msgid "2nd"
-msgstr "2-ÏÊ"
-
-#: calendar/gui/print.c:288
-msgid "3rd"
-msgstr "3-ÉÊ"
-
-#: calendar/gui/print.c:288
-msgid "4th"
-msgstr "4-ÙÊ"
-
-#: calendar/gui/print.c:288
-msgid "5th"
-msgstr "5-ÙÊ"
-
-#: calendar/gui/print.c:289
-msgid "6th"
-msgstr "6-ÏÊ"
-
-#: calendar/gui/print.c:289
-msgid "7th"
-msgstr "7-ÏÊ"
-
-#: calendar/gui/print.c:289
-msgid "8th"
-msgstr "8-ÏÊ"
-
-#: calendar/gui/print.c:289
-msgid "9th"
-msgstr "9-ÙÊ"
-
-#: calendar/gui/print.c:289
-msgid "10th"
-msgstr "10-ÙÊ"
-
-#: calendar/gui/print.c:290
-msgid "11th"
-msgstr "11-ÙÊ"
-
-#: calendar/gui/print.c:290
-msgid "12th"
-msgstr "12-ÙÊ"
-
-#: calendar/gui/print.c:290
-msgid "13th"
-msgstr "13-ÙÊ"
-
-#: calendar/gui/print.c:290
-msgid "14th"
-msgstr "14-ÙÊ"
-
-#: calendar/gui/print.c:290
-msgid "15th"
-msgstr "15-ÙÊ"
-
-#: calendar/gui/print.c:291
-msgid "16th"
-msgstr "16-ÙÊ"
-
-#: calendar/gui/print.c:291
-msgid "17th"
-msgstr "17-ÙÊ"
-
-#: calendar/gui/print.c:291
-msgid "18th"
-msgstr "18-ÙÊ"
-
-#: calendar/gui/print.c:291
-msgid "19th"
-msgstr "19-ÙÊ"
-
-#: calendar/gui/print.c:291
-msgid "20th"
-msgstr "20-ÙÊ"
-
-#: calendar/gui/print.c:292
-msgid "21st"
-msgstr "21-ÙÊ"
-
-#: calendar/gui/print.c:292
-msgid "22nd"
-msgstr "22-ÏÊ"
-
-#: calendar/gui/print.c:292
-msgid "23rd"
-msgstr "23-ÉÊ"
-
-#: calendar/gui/print.c:292
-msgid "24th"
-msgstr "24-ÙÊ"
-
-#: calendar/gui/print.c:292
-msgid "25th"
-msgstr "25-ÙÊ"
-
-#: calendar/gui/print.c:293
-msgid "26th"
-msgstr "26-ÏÊ"
-
-#: calendar/gui/print.c:293
-msgid "27th"
-msgstr "27-ÏÊ"
-
-#: calendar/gui/print.c:293
-msgid "28th"
-msgstr "28-ÏÊ"
-
-#: calendar/gui/print.c:293
-msgid "29th"
-msgstr "29-ÙÊ"
-
-#: calendar/gui/print.c:293
-msgid "30th"
-msgstr "30-ÙÊ"
-
-#: calendar/gui/print.c:294
-msgid "31st"
-msgstr "31-ÙÊ"
-
-#: calendar/gui/print.c:349
-msgid "Su"
-msgstr "÷Ó"
-
-#: calendar/gui/print.c:349
-msgid "Mo"
-msgstr "ðÎ"
-
-#: calendar/gui/print.c:349
-msgid "Tu"
-msgstr "÷Ô"
-
-#: calendar/gui/print.c:349
-msgid "We"
-msgstr "óÒ"
-
-#: calendar/gui/print.c:349
-msgid "Th"
-msgstr "þÔ"
-
-#: calendar/gui/print.c:349
-msgid "Fr"
-msgstr "ðÔ"
-
-#: calendar/gui/print.c:349
-msgid "Sa"
-msgstr "CÂ"
-
-#: calendar/gui/print.c:937
-msgid "TODO Items"
-msgstr "úÁÄÁÎÉÑ"
-
-#. Day
-#: calendar/gui/print.c:1038
-msgid "Current day (%a %b %d %Y)"
-msgstr "ôÅËÕÝÉÊ ÄÅÎØ (%a %b %d %Y)"
-
-#: calendar/gui/print.c:1058 calendar/gui/print.c:1072
-#: calendar/gui/print.c:1073
-msgid "%a"
-msgstr "%a"
-
-#: calendar/gui/print.c:1059 calendar/gui/print.c:1060
-#: calendar/gui/print.c:1074 calendar/gui/print.c:1075
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1062
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "ôÅËÕÝÁÑ ÎÅÄÅÌÑ (%s %s %d - %s %d %d)"
-
-#: calendar/gui/print.c:1079
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "ôÅËÕÝÁÑ ÎÅÄÅÌÑ (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1085
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "ôÅËÕÝÁÑ ÎÅÄÅÌÑ (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1098
-msgid "Current month (%a %Y)"
-msgstr "ôÅËÕÝÉÊ ÍÅÓÑÃ (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1105
-msgid "Current year (%Y)"
-msgstr "ôÅËÕÝÉÊ ÇÏÄ (%Y)"
-
-#: calendar/gui/print.c:1142
-msgid "Print Calendar"
-msgstr "îÁÐÅÞÁÔÁÔØ ËÁÌÅÎÄÁÒØ"
-
-#: calendar/gui/print.c:1307
-msgid "Print Preview"
-msgstr "ðÒÏÓÍÏÔÒ ÐÅÞÁÔÉ"
-
-#: calendar/gui/prop.c:334
-msgid "Time display"
-msgstr "ïÔÏÂÒÁÖÁÅÍÏÅ ×ÒÅÍÑ"
-
-#. Time format
-#: calendar/gui/prop.c:338
-msgid "Time format"
-msgstr "æÏÒÍÁÔ ×ÒÅÍÅÎÉ"
-
-#: calendar/gui/prop.c:339
-msgid "12-hour (AM/PM)"
-msgstr "12-ÞÁÓÏ×ÏÊ (äð/ðð)"
-
-#: calendar/gui/prop.c:340
-msgid "24-hour"
-msgstr "24-ÞÁÓÏ×ÏÊ"
-
-#. Weeks start on
-#: calendar/gui/prop.c:350
-msgid "Weeks start on"
-msgstr "îÅÄÅÌÉ ÎÁÞÉÎÁÀÔÓÑ ×"
-
-#: calendar/gui/prop.c:351
-msgid "Sunday"
-msgstr "÷ÏÓËÒÅÓÅÎØÅ"
-
-#: calendar/gui/prop.c:352
-msgid "Monday"
-msgstr "ðÏÎÅÄÅÌØÎÉË"
-
-#. Day range
-#: calendar/gui/prop.c:362
-msgid "Day range"
-msgstr "äÉÁÐÁÚÏÎ ÄÎÑ"
-
-#: calendar/gui/prop.c:373
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-"÷ÙÂÅÒÉÔÅ ÎÁÞÁÌØÎÙÊ É ËÏÎÅÞÎÙÊ ÞÁÓÙ, ËÏÔÏÒÙÅ ÷Ù\n"
-"ÈÏÔÉÔÅ ×ÉÄÅÔØ × ÒÅÖÉÍÅ ÐÒÏÓÍÏÔÒÁ ÄÎÅÊ É ÎÅÄÅÌØ.\n"
-"÷ÒÅÍÑ ×ÎÅ ÜÔÏÇÏ ÄÉÁÐÁÚÏÎÁ ÐÏ ÕÍÏÌÞÁÎÉÀ ÎÅ ÂÕÄÅÔ\n"
-"ÐÏËÁÚÙ×ÁÔØÓÑ."
-
-#: calendar/gui/prop.c:389
-msgid "Day start:"
-msgstr "îÁÞÁÌÏ ÄÎÑ:"
-
-#: calendar/gui/prop.c:400
-msgid "Day end:"
-msgstr "ëÏÎÅà ÄÎÑ:"
-
-#: calendar/gui/prop.c:523
-msgid "Colors for display"
-msgstr "ã×ÅÔÁ ÄÌÑ ÐÏËÁÚÁ"
-
-#: calendar/gui/prop.c:526
-msgid "Colors"
-msgstr "ã×ÅÔÁ"
-
-#: calendar/gui/prop.c:603
-msgid "Show on TODO List:"
-msgstr "ðÏËÁÚÁÔØ × ÓÐÉÓËÅ ÚÁÄÁÎÉÊ:"
-
-#: calendar/gui/prop.c:610
-msgid "Time Until Due"
-msgstr "÷ÒÅÍÑ ÄÏ ÕÓÌÏ×ÌÅÎÎÏÇÏ"
-
-#: calendar/gui/prop.c:641
-msgid "To Do List style options:"
-msgstr "ðÁÒÁÍÅÔÒÙ ÓÔÉÌÑ ÓÐÉÓËÁ \"éÓÐÏÌÎÉÔØ\":"
-
-#: calendar/gui/prop.c:646
-msgid "Highlight overdue items"
-msgstr "ðÏÄÓ×ÅÔËÁ ÐÒÏÓÒÏÞÅÎÎÙÈ ÜÌÅÍÅÎÔÏ×"
-
-#: calendar/gui/prop.c:649
-msgid "Highlight not yet due items"
-msgstr "ðÏÄÓ×ÅÔËÁ ÅÝÅ ÎÅ ÉÓÐÏÌÎÅÎÎÙÈ ÜÌÅÍÅÎÔÏ×"
-
-#: calendar/gui/prop.c:652
-msgid "Highlight items due today"
-msgstr "ðÏÄÓ×ÅÔËÁ ÜÌÅÍÅÎÔÏ× ÕÓÌÏ×ÌÅÎÎÙÈ ÎÁ ÓÅÇÏÄÎÑ"
-
-#: calendar/gui/prop.c:682
-msgid "To Do List Properties"
-msgstr "ó×ÏÊÓÔ×Á ÓÐÉÓËÁ \"éÓÐÏÌÎÉÔØ\""
-
-#: calendar/gui/prop.c:685
-msgid "To Do List"
-msgstr "óÐÉÓÏË \"éÓÐÏÌÎÉÔØ\""
-
-#: calendar/gui/prop.c:784
-msgid "Alarms"
-msgstr "ôÁÊÍÅÒÙ"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:787
-msgid "Alarm Properties"
-msgstr "ó×ÏÊÓÔ×Á ÔÁÊÍÅÒÏ×"
-
-#: calendar/gui/prop.c:797
-msgid "Beep on display alarms"
-msgstr "çÕÄÏË ÐÒÉ ÏÔÏÂÒÁÖÅÎÉÉ ÔÁÊÍÅÒÏ×"
-
-#: calendar/gui/prop.c:807
-msgid "Audio alarms timeout after"
-msgstr "úÁÄÅÒÖËÁ ÁÕÄÉÏÓÉÇÎÁÌÁ ÎÁ"
-
-#: calendar/gui/prop.c:818 calendar/gui/prop.c:835
-msgid " seconds"
-msgstr " ÓÅËÕÎÄ"
-
-#: calendar/gui/prop.c:824
-msgid "Enable snoozing for "
-msgstr "òÁÚÒÅÛÉÔØ ËÒÁÔËÉÊ ÓÏÎ ÄÌÑ "
-
-#. populate default frame/box
-#: calendar/gui/prop.c:840
-msgid "Defaults"
-msgstr "éÓÈ.ÚÎÁÞÅÎÉÑ"
-
-#: composer/e-msg-composer-address-dialog.c:182
-msgid "Cut"
-msgstr "÷ÙÒÅÚÁÔØ"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut selected item into clipboard"
-msgstr "÷ÙÒÅÚÁÅÔ ×ÙÄÅÌÅÎÎÙÊ ÜÌÅÍÅÎÔ × ÂÕÆÅÒ ÏÂÍÅÎÁ"
-
-#: composer/e-msg-composer-address-dialog.c:186
-#: mail/folder-browser-factory.c:46
-msgid "Copy"
-msgstr "óËÏÐÉÒÏ×ÁÔØ"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy selected item into clipboard"
-msgstr "ëÏÐÉÒÕÅÔ ×ÙÄÅÌÅÎÎÙÊ ÜÌÅÍÅÎÔ × ÂÕÆÅÒ ÏÂÍÅÎÁ"
-
-#: composer/e-msg-composer-address-dialog.c:190
-#: composer/e-msg-composer-address-dialog.c:198
-msgid "Paste"
-msgstr "÷ÓÔÁ×ÉÔØ"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste item from clipboard"
-msgstr "÷ÓÔÁ×ÉÔØ ÜÌÅÍÅÎÔ ÉÚ ÂÕÆÅÒÁ ÏÂÍÅÎÁ"
-
-#: composer/e-msg-composer-address-dialog.c:525
-msgid "Select recipients' addresses"
-msgstr "÷ÙÂÒÁÔØ ÁÄÒÅÓÁ ÐÏÌÕÞÁÔÅÌÅÊ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "óÐÉÓÏË ÐÏÌÕÞÁÔÅÌÅÊ:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "ðÏÉÓË..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "éÍÑ"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-#: mail/mail-config.glade.h:8
-msgid "Address"
-msgstr "áÄÒÅÓ"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "ó×ÏÊÓÔ×Á..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "ëÏÍÕ: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "ëÏÐÉÑ: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "óËÒ.ËÏÐÉÑ: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "ÍÅÔËÁ9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "ÍÅÔËÁ7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "ÍÅÔËÁ8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 ÂÁÊÔ"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u ÂÁÊÔ"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fë"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "äÏÂÁ×ÉÔØ ×ÌÏÖÅÎÉÅ"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "õÄÁÌÉÔØ"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "õÄÁÌÉÔØ ×ÙÂÒÁÎÎÙÅ ÜÌÅÍÅÎÔÙ ÉÚ ÓÐÉÓËÁ ×ÌÏÖÅÎÉÊ"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "äÏÂÁ×ÉÔØ ×ÌÏÖÅÎÉÅ..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "ðÒÉÓÏÅÄÉÎÉÔØ ÆÁÊÌ Ë ÓÏÏÂÝÅÎÉÀ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "ó×ÏÊÓÔ×Á ×ÌÏÖÅÎÉÑ"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "ôÉÐ MIME:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "éÍÑ ÆÁÊÌÁ:"
-
-#: composer/e-msg-composer-hdrs.c:137 composer/e-msg-composer-hdrs.c:295
-msgid "From:"
-msgstr "ïÔ:"
-
-#: composer/e-msg-composer-hdrs.c:243
-msgid "Click here for the address book"
-msgstr "ýÅÌËÎÉÔÅ ÚÄÅÓØ ÄÌÑ ÁÄÒÅÓÎÏÊ ËÎÉÇÉ"
-
-#: composer/e-msg-composer-hdrs.c:296
-msgid "Enter the identitiy you wish to send this message from"
-msgstr "÷×ÅÄÉÔÅ ÉÍÅÎÏ×ÁÎÉÅ, ÏÔ ËÏÔÏÒÏÇÏ ×Ù ÈÏÔÉÔÅ ÏÔÐÒÁ×ÉÔØ ÜÔÏ ÓÏÏÂÝÅÎÉÅ"
-
-#: composer/e-msg-composer-hdrs.c:300
-msgid "To:"
-msgstr "ëÏÍÕ:"
-
-#: composer/e-msg-composer-hdrs.c:301
-msgid "Enter the recipients of the message"
-msgstr "÷×ÅÄÉÔÅ ÐÏÌÕÞÁÔÅÌÅÊ ÓÏÏÂÝÅÎÉÑ"
-
-#: composer/e-msg-composer-hdrs.c:305
-msgid "Cc:"
-msgstr "ëÏÐÉÑ:"
-
-#: composer/e-msg-composer-hdrs.c:306
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "÷×ÅÄÉÔÅ ÁÄÒÅÓÁÔÏ×, ËÏÔÏÒÙÅ ÐÏÌÕÞÁÔ ËÏÐÉÀ ÓÏÏÂÝÅÎÉÑ"
-
-#: composer/e-msg-composer-hdrs.c:311
-msgid "Bcc:"
-msgstr "óËÒ.ËÏÐÉÑ:"
-
-#: composer/e-msg-composer-hdrs.c:312
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"÷×ÅÄÉÔÅ ÁÄÒÅÓÁÔÏ×, ËÏÔÏÒÙÅ ÐÏÌÕÞÁÔ ËÏÐÉÀ ÓÏÏÂÝÅÎÉÑ ÎÅ ÐÏÐÁ× × ÓÐÉÓÏË "
-"ÐÏÌÕÞÁÔÅÌÅÊ."
-
-#: composer/e-msg-composer-hdrs.c:318
-msgid "Subject:"
-msgstr "ôÅÍÁ:"
-
-#: composer/e-msg-composer-hdrs.c:319
-msgid "Enter the subject of the mail"
-msgstr "÷×ÅÄÉÔÅ ÔÅÍÕ ÐÉÓØÍÁ"
-
-#: composer/e-msg-composer.c:451
-msgid "Save as..."
-msgstr "óÏÈÒÁÎÉÔØ ËÁË..."
-
-#: composer/e-msg-composer.c:462
-#, c-format
-msgid "Error saving file: %s"
-msgstr "ïÛÉÂËÁ ÓÏÈÒÁÎÅÎÉÑ ÆÁÊÌÁ: %s"
-
-#: composer/e-msg-composer.c:482
-#, c-format
-msgid "Error loading file: %s"
-msgstr "ïÛÉÂËÁ ÐÒÉ ÚÁÇÒÕÚËÅ ÆÁÊÌÁ: %s"
-
-#: composer/e-msg-composer.c:504
-msgid "Saving changes to message..."
-msgstr "óÏÈÒÁÎÉÔØ ÉÚÍÅÎÅÎÉÑ × ÓÏÏÂÝÅÎÉÉ..."
-
-#: composer/e-msg-composer.c:506
-msgid "About to save changes to message..."
-msgstr "ï ÓÏÈÒÁÎÅÎÉÉ ÉÚÍÅÎÅÎÉÊ × ÓÏÏÂÝÅÎÉÉ..."
-
-#: composer/e-msg-composer.c:590 shell/e-shell-view-menu.c:165
-msgid "Evolution"
-msgstr "ü×ÏÌÀÃÉÑ"
-
-#: composer/e-msg-composer.c:596
-msgid ""
-"This message has not been sent.\n"
-"\n"
-"Do you wish to save your changes?"
-msgstr ""
-"üÔÏ ÓÏÏÂÝÅÎÉÅ ÎÅ ÂÙÌÏ ÏÔÐÒÁ×ÌÅÎÏ.\n"
-"\n"
-"÷Ù ÈÏÔÉÔÅ ÓÏÈÒÁÎÉÔØ ÉÚÍÅÎÅÎÉÑ?"
-
-#: composer/e-msg-composer.c:618
-msgid "Open file"
-msgstr "ïÔËÒÙÔØ ÆÁÊÌ"
-
-#: composer/e-msg-composer.c:730
-msgid "That file does not exist."
-msgstr "üÔÏÔ ÆÁÊÌ ÎÅ ÓÕÝÅÓÔ×ÕÅÔ."
-
-#: composer/e-msg-composer.c:740
-msgid "That is not a regular file."
-msgstr "üÔÏ ÎÅ ÏÂÙÞÎÙÊ ÆÁÊÌ."
-
-#: composer/e-msg-composer.c:750
-msgid "That file exists but is not readable."
-msgstr "üÔÏÔ ÆÁÊÌ ÓÕÝÅÓÔ×ÕÅÔ, ÎÏ ÎÅ ÞÉÔÁÅÔÓÑ."
-
-#: composer/e-msg-composer.c:760
-msgid "That file appeared accesible but open(2) failed."
-msgstr "æÁÊÌ ×ÙÇÌÑÄÉÔ ÄÏÓÔÕÐÎÙÍ, ÎÏ ÐÒÏÉÚÏÛÅÌ ÓÂÏÊ open(2)."
-
-#: composer/e-msg-composer.c:782
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"æÁÊÌ ÏÞÅÎØ ÂÏÌØÛÏÊ (ÂÏÌØÛÅ 100ë).\n"
-"÷Ù Õ×ÅÒÅÎÙ, ÞÔÏ ÈÏÔÉÔÅ ×ÓÔÁ×ÉÔØ ÅÇÏ?"
-
-#: composer/e-msg-composer.c:803
-msgid "An error occurred while reading the file."
-msgstr "ðÒÉ ÞÔÅÎÉÉ ÆÁÊÌÁ ×ÏÚÎÉËÌÁ ÏÛÉÂËÁ."
-
-#: composer/e-msg-composer.c:899 shell/e-shell-view-menu.c:434
-msgid "_File"
-msgstr "æÁÊÌ"
-
-#: composer/e-msg-composer.c:905
-msgid "_Open..."
-msgstr "ïÔËÒÙÔØ..."
-
-#: composer/e-msg-composer.c:906
-msgid "Load a previously saved message"
-msgstr "úÁÇÒÕÚÉÔØ ÒÁÎÅÅ ÓÏÈÒÁÎÅÎÎÏÅ ÓÏÏÂÝÅÎÉÅ"
-
-#: composer/e-msg-composer.c:914
-msgid "_Save..."
-msgstr "CÏÈÒÁÎÉÔØ..."
-
-#: composer/e-msg-composer.c:915
-msgid "Save message"
-msgstr "óÏÈÒÁÎÉÔØ ÓÏÏÂÝÅÎÉÅ"
-
-#: composer/e-msg-composer.c:923
-msgid "_Save as..."
-msgstr "óÏÈÒÁÎÉÔØ ËÁË..."
-
-#: composer/e-msg-composer.c:924
-msgid "Save message with a different name"
-msgstr "óÏÈÒÁÎÉÔØ ÓÏÏÂÝÅÎÉÅ c ÄÒÕÇÉÍ ÎÁÚ×ÁÎÉÅÍ"
-
-#: composer/e-msg-composer.c:932
-msgid "Save in _folder..."
-msgstr "óÏÈÒÁÎÉÔØ × ÐÁÐËÅ..."
-
-#: composer/e-msg-composer.c:933
-msgid "Save the message in a specified folder"
-msgstr "óÏÈÒÁÎÉÔØ ÓÏÏÂÝÅÎÉÅ × ÕËÁÚÁÎÎÏÊ ÐÁÐËÅ"
-
-#: composer/e-msg-composer.c:942
-msgid "_Insert text file... (FIXME)"
-msgstr "÷ÓÔÁ×ÉÔØ ÔÅËÓÔÏ×ÙÊ ÆÁÊÌ... (FIXME)"
-
-#: composer/e-msg-composer.c:943
-msgid "Insert a file as text into the message"
-msgstr "÷ÓÔÁ×ÉÔØ ÆÁÊÌ × ÓÏÏÂÝÅÎÉÅ ËÁË ÔÅËÓÔ"
-
-#: composer/e-msg-composer.c:952
-msgid "_Send"
-msgstr "ïÔÐÒÁ×ÉÔØ"
-
-#: composer/e-msg-composer.c:953
-msgid "Send the message"
-msgstr "ïÔÐÒÁ×ÉÔØ ÓÏÏÂÝÅÎÉÅ"
-
-#: composer/e-msg-composer.c:963
-msgid "_Close..."
-msgstr "úÁËÒÙÔØ..."
-
-#: composer/e-msg-composer.c:964
-msgid "Quit the message composer"
-msgstr "÷ÙÊÔÉ ÉÚ ÒÅÄÁËÔÏÒÁ ÓÏÏÂÝÅÎÉÊ"
-
-#: composer/e-msg-composer.c:977 shell/e-shell-view-menu.c:478
-msgid "_Edit"
-msgstr "ðÒÁ×ËÁ"
-
-#: composer/e-msg-composer.c:988
-msgid "_Format"
-msgstr "æÏÒÍÁÔ"
-
-#: composer/e-msg-composer.c:994
-msgid "HTML"
-msgstr "HTML"
-
-#: composer/e-msg-composer.c:995
-msgid "Send the mail in HTML format"
-msgstr "ïÔÐÒÁ×ÉÔØ ÐÏÞÔÕ × ÆÏÒÍÁÔÅ HTML"
-
-#: composer/e-msg-composer.c:1008 mail/folder-browser-factory.c:185
-#: shell/e-shell-view-menu.c:383 shell/e-shell-view-menu.c:489
-#: shell/e-storage-set-view.c:242
-msgid "_View"
-msgstr "ðÒÏÓÍÏÔÒ"
-
-#: composer/e-msg-composer.c:1014
-msgid "Show _attachments"
-msgstr "ðÏËÁÚÁÔØ ×ÌÏÖÅÎÉÑ"
-
-#: composer/e-msg-composer.c:1015
-msgid "Show/hide attachments"
-msgstr "ðÏËÁÚÁÔØ/ÓËÒÙÔØ ×ÌÏÖÅÎÉÑ"
-
-#: composer/e-msg-composer.c:1048
-msgid "Send"
-msgstr "ïÔÐÒÁ×ÉÔØ"
-
-#: composer/e-msg-composer.c:1049
-msgid "Send this message"
-msgstr "ïÔÐÒÁ×ÉÔØ ÜÔÏ ÓÏÏÂÝÅÎÉÅ"
-
-#: composer/e-msg-composer.c:1058
-msgid "Attach"
-msgstr "ðÒÉÓÏÅÄÉÎÉÔØ"
-
-#: composer/e-msg-composer.c:1059
-msgid "Attach a file"
-msgstr "ðÒÉÓÏÅÄÉÎÉÔØ ÆÁÊÌ"
-
-#: composer/e-msg-composer.c:1246
-msgid "Compose a message"
-msgstr "óÏÚÄÁÔØ ÓÏÏÂÝÅÎÉÅ"
-
-#: filter/filter-datespec.c:61
-msgid "years"
-msgstr "ÇÏÄÙ"
-
-#: filter/filter-datespec.c:62
-msgid "months"
-msgstr "ÍÅÓÑÃÙ"
-
-#: filter/filter-datespec.c:63
-msgid "weeks"
-msgstr "ÎÅÄÅÌÉ"
-
-#: filter/filter-datespec.c:64
-msgid "days"
-msgstr "ÄÎÉ"
-
-#: filter/filter-datespec.c:65
-msgid "hours"
-msgstr "ÞÁÓÙ"
-
-#: filter/filter-datespec.c:66
-msgid "minutes"
-msgstr "ÍÉÎÕÔÙ"
-
-#: filter/filter-datespec.c:67
-msgid "seconds"
-msgstr "ÓÅËÕÎÄÙ"
-
-#: filter/filter-datespec.c:232
-msgid ""
-"The message's date will be compared against\n"
-"whatever the time is when the filter is run\n"
-"or vfolder is opened."
-msgstr ""
-"äÁÔÁ ÓÏÏÂÝÅÎÉÑ ÂÕÄÅÔ ÓÒÁ×ÎÉ×ÁÔØÓÑ ÌÉÂÏ\n"
-"ÓÏ ×ÒÅÍÅÎÅÍ ÚÁÐÕÓËÁ ÆÉÌØÔÒÁ, ÌÉÂÏ \n"
-"ÏÔËÒÙÔÉÑ ×ÉÒÔ.ÐÁÐËÉ."
-
-#: filter/filter-datespec.c:254
-msgid ""
-"The message's date will be compared against\n"
-"the time that you specify here."
-msgstr ""
-"äÁÔÁ ÓÏÏÂÝÅÎÉÑ ÂÕÄÅÔ ÓÒÁ×ÎÉ×ÁÔØÓÑ Ó ÄÁÔÏÊ,\n"
-"ËÏÔÏÒÕÀ ×Ù ÕËÁÚÁÌÉ ÚÄÅÓØ."
-
-#: filter/filter-datespec.c:293
-msgid ""
-"The message's date will be compared against\n"
-"a time relative to when the filter is run;\n"
-"\"a week ago\", for example."
-msgstr ""
-"äÁÔÁ ÓÏÏÂÝÅÎÉÑ ÂÕÄÅÔ ÓÒÁ×ÎÉ×ÁÔØÓÑ ÓÏ\n"
-"×ÒÅÍÅÎÅÍ ÏÔÎÏÓÉÔÅÌØÎÏ ÚÁÐÕÓËÁ ÆÉÌØÔÒÁ;\n"
-"ÎÁÐÒÉÍÅÒ \"ÎÅÄÅÌÀ ÎÁÚÁÄ\"."
-
-#. keep in sync with FilterDatespec_type!
-#: filter/filter-datespec.c:328
-msgid "the current time"
-msgstr "ÔÅËÕÝÅÅ ×ÒÅÍÑ"
-
-#: filter/filter-datespec.c:328
-msgid "a time you specify"
-msgstr "ÕËÁÚÁÎÎÏÅ ×ÁÍÉ ×ÒÅÍÑ"
-
-#: filter/filter-datespec.c:329
-msgid "a time relative to the current time"
-msgstr "×ÒÅÍÑ ÏÔÎÏÓÉÔÅÌØÎÏ ÔÅËÕÝÅÇÏ"
-
-#. The label
-#: filter/filter-datespec.c:387
-msgid "Compare against"
-msgstr "óÒÁ×ÎÉ×ÁÔØ Ó"
-
-#: filter/filter-datespec.c:661
-msgid "<click here to select a date>"
-msgstr "<ÝÅÌËÎÉÔÅ ÚÄÅÓØ ÄÌÑ ×ÙÂÏÒÁ ÄÁÔÙ>"
-
-#: filter/filter-editor.c:156 filter/score-editor.c:126
-#: filter/vfolder-editor.c:152
-msgid "Add Rule"
-msgstr "äÏÂÁ×ÉÔØ ÐÒÁ×ÉÌÏ"
-
-#: filter/filter-editor.c:188
-msgid "Edit Rule"
-msgstr "ðÒÁ×ËÁ ÐÒÁ×ÉÌÁ"
-
-#: filter/filter-filter.c:397 filter/filter-rule.c:534
-msgid "Less"
-msgstr "íÅÎØÛÅ"
-
-#: filter/filter-filter.c:400 filter/filter-rule.c:537
-msgid "More"
-msgstr "âÏÌØÛÅ"
-
-#: filter/filter-folder.c:183 filter/vfolder-rule.c:269
-msgid "Select Folder"
-msgstr "÷ÙÂÒÁÔØ ÐÁÐËÕ"
-
-#: filter/filter-folder.c:205
-msgid "Enter folder URI"
-msgstr "÷×ÅÓÔÉ URI ÐÁÐËÉ"
-
-#: filter/filter-folder.c:247
-msgid "<click here to select a folder>"
-msgstr "<ÝÅÌËÎÉÔÅ ÚÄÅÓØ ÄÌÑ ×ÙÂÏÒÁ ÐÁÐËÉ>"
-
-#: filter/filter-part.c:420
-msgid "Test"
-msgstr "ðÒÏ×ÅÒËÁ"
-
-#: filter/score-editor.c:160
-msgid "Edit Score Rule"
-msgstr "ðÒÁ×ËÁ ÐÒÁ×ÉÌÁ ÐÏÄÓÞÅÔÁ"
-
-#: filter/vfolder-editor.c:186
-msgid "Edit VFolder Rule"
-msgstr "ðÒÁ×ËÁ ÐÒÁ×ÉÌÁ ×ÉÒÔ.ÐÁÐËÉ"
-
-#: mail/component-factory.c:187
-msgid "Cannot initialize Evolution's mail component."
-msgstr "îÅ×ÏÚÍÏÖÎÏ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÐÏÞÔÏ×ÙÊ ËÏÍÐÏÎÅÎÔ \"ü×ÏÌÀÃÉÉ\"."
-
-#: mail/folder-browser-factory.c:33
-msgid "Get mail"
-msgstr "ðÏÌÕÞÉÔØ ÐÏÞÔÕ"
-
-#: mail/folder-browser-factory.c:33
-msgid "Check for new mail"
-msgstr "ðÒÏ×ÅÒÉÔØ ÐÏÞÔÏ×ÙÊ ÑÝÉË"
-
-#: mail/folder-browser-factory.c:34
-msgid "Compose"
-msgstr "óÏÚÄÁÔØ"
-
-#: mail/folder-browser-factory.c:34
-msgid "Compose a new message"
-msgstr "óÏÚÄÁÔØ ÎÏ×ÏÅ ÓÏÏÂÝÅÎÉÅ"
-
-#. GNOMEUIINFO_ITEM_STOCK (N_("Save"), N_("Save this message"),
-#. save_msg, GNOME_STOCK_PIXMAP_SAVE),
-#: mail/folder-browser-factory.c:38 mail/mail-view.c:135
-msgid "Reply"
-msgstr "ïÔ×ÅÔÉÔØ"
-
-#: mail/folder-browser-factory.c:38 mail/mail-view.c:135
-msgid "Reply to the sender of this message"
-msgstr "ïÔ×ÅÔÉÔØ ÏÔÐÒÁ×ÉÔÅÌÀ ÜÔÏÇÏ ÓÏÏÂÝÅÎÉÑ"
-
-#: mail/folder-browser-factory.c:39 mail/mail-view.c:138
-msgid "Reply to All"
-msgstr "ïÔ×ÅÔÉÔØ ×ÓÅÍ"
-
-#: mail/folder-browser-factory.c:39 mail/mail-view.c:138
-msgid "Reply to all recipients of this message"
-msgstr "ïÔ×ÅÔÉÔØ ×ÓÅÍ ÐÏÌÕÞÁÔÅÌÑÍ ÜÔÏÇÏ ÓÏÏÂÝÅÎÉÑ"
-
-#: mail/folder-browser-factory.c:41 mail/mail-view.c:141
-msgid "Forward"
-msgstr "ðÅÒÅÓÌÁÔØ"
-
-#: mail/folder-browser-factory.c:41 mail/mail-view.c:141
-msgid "Forward this message"
-msgstr "ðÅÒÅÓÌÁÔØ ÜÔÏ ÓÏÏÂÝÅÎÉÅ"
-
-#: mail/folder-browser-factory.c:45
-msgid "Move"
-msgstr "ðÅÒÅÎÅÓÔÉ"
-
-#: mail/folder-browser-factory.c:45
-msgid "Move message to a new folder"
-msgstr "ðÅÒÅÍÅÓÔÉÔØ ÓÏÏÂÝÅÎÉÅ × ÎÏ×ÕÀ ÐÁÐËÕ"
-
-#: mail/folder-browser-factory.c:46
-msgid "Copy message to a new folder"
-msgstr "óËÏÐÉÒÏ×ÁÔØ ÓÏÏÂÝÅÎÉÅ × ÎÏ×ÕÀ ÐÁÐËÕ"
-
-#: mail/folder-browser-factory.c:48 mail/mail-view.c:145
-msgid "Print the selected message"
-msgstr "òÁÓÐÅÞÁÔÁÔØ ×ÙÄÅÌÅÎÎÏÅ ÓÏÏÂÝÅÎÉÅ"
-
-#: mail/folder-browser-factory.c:50 mail/mail-view.c:147
-msgid "Delete this message"
-msgstr "õÄÁÌÉÔØ ÜÔÏ ÓÏÏÂÝÅÎÉÅ"
-
-#: mail/folder-browser-factory.c:71
-#, c-format
-msgid "Run filter \"%s\""
-msgstr "ðÒÉÍÅÎÉÔØ ÆÉÌØÔÒ \"%s\""
-
-#: mail/folder-browser-factory.c:127
-msgid "_Threaded Message List"
-msgstr "óÐÉÓÏË ÐÏÄÛÉÔÙÈ ÓÏÏÂÝÅÎÉÊ"
-
-#: mail/folder-browser-factory.c:137
-msgid "_Print Message"
-msgstr "ðÅÞÁÔØ ÓÏÏÂÝÅÎÉÑ"
-
-#: mail/folder-browser-factory.c:146
-msgid "F_older"
-msgstr "ðÁÐËÁ"
-
-#: mail/folder-browser-factory.c:152
-msgid "_Mark all as Read"
-msgstr "ðÏÍÅÔÉÔØ ×ÓÅ ËÁË ÐÒÏÞÔÅÎÎÏÅ"
-
-#: mail/folder-browser-factory.c:158
-msgid "_Expunge"
-msgstr "÷ÙÞÅÒËÎÕÔØ"
-
-#: mail/folder-browser-factory.c:165
-msgid "_Configure Folder"
-msgstr "îÁÓÔÒÏÉÔØ ÐÁÐËÕ"
-
-#: mail/folder-browser-factory.c:172
-msgid "_Message"
-msgstr "óÏÏÂÝÅÎÉÅ"
-
-#: mail/folder-browser-factory.c:178
-msgid "E_dit"
-msgstr "ðÒÁ×ËÁ"
-
-#: mail/folder-browser-factory.c:192
-msgid "Mail _Filters ..."
-msgstr "ðÏÞÔÏ×ÙÅ ÆÉÌØÔÒÙ ..."
-
-#: mail/folder-browser-factory.c:199
-msgid "_vFolder Editor ..."
-msgstr "òÅÄÁËÔÏÒ ×ÉÒÔÕÁÌØÎÙÈ ÐÁÐÏË ..."
-
-#: mail/folder-browser-factory.c:206
-msgid "_Mail Configuration ..."
-msgstr "îÁÓÔÒÏÊËÁ ÐÏÞÔÙ ..."
-
-#: mail/folder-browser-factory.c:213
-msgid "Forget _Passwords"
-msgstr "úÁÂÙÔØ ÐÁÒÏÌÉ"
-
-#: mail/folder-browser.c:371
-msgid "Save"
-msgstr "óÏÈÒÁÎÉÔØ"
-
-#: mail/mail-callbacks.c:134
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-"üÔÏ ÓÏÏÂÝÅÎÉÅ ÎÅ ÉÍÅÅÔ ÔÅÍÙ.\n"
-"ðÏÓÌÁÔØ ÅÇÏ?"
-
-#: mail/mail-callbacks.c:166
-msgid ""
-"You need to configure an identity\n"
-"before you can send mail."
-msgstr ""
-"÷Ù ÄÏÌÖÎÙ ÎÁÓÔÒÏÉÔØ ÉÄÅÎÔÉÆÉËÁÃÉÀ\n"
-"ÄÏ ÔÏÇÏ ËÁË ×Ù ÓÍÏÖÅÔÅ ÐÏÓÌÁÔØ ÐÏÞÔÕ."
-
-#: mail/mail-callbacks.c:182
-msgid ""
-"You need to configure a mail transport\n"
-"before you can send mail."
-msgstr ""
-"÷Ù ÄÏÌÖÎÙ ÎÁÓÔÒÏÉÔØ ÐÅÒÅÄÁÞÕ ÐÏÞÔÙ\n"
-"ÄÏ ÔÏÇÏ ËÁË ×Ù ÓÍÏÖÅÔÅ ÐÏÓÌÁÔØ ÐÏÞÔÕ."
-
-#: mail/mail-callbacks.c:389
-msgid "Move message(s) to"
-msgstr "ðÅÒÅÍÅÓÔÉÔØ ÓÏÏÂÝÅÎÉÅ ×"
-
-#: mail/mail-callbacks.c:391
-msgid "Copy message(s) to"
-msgstr "óËÏÐÉÒÏ×ÁÔØ ÓÏÏÂÝÅÎÉÑ ×"
-
-#: mail/mail-callbacks.c:448
-msgid ""
-"You may only edit messages saved\n"
-"in the Drafts folder."
-msgstr ""
-"÷Ù ÍÏÖÅÔÅ ÐÒÁ×ÉÔØ ÔÏÌØËÏ ÓÏÏÂÝÅÎÉÑ\n"
-"ÓÏÈÒÁÎÅÎÎÙÅ × ÐÁÐËÅ \"þÅÒÎÏ×ÉËÉ\"."
-
-#: mail/mail-callbacks.c:536
-#, c-format
-msgid ""
-"Error loading filter information:\n"
-"%s"
-msgstr ""
-"ïÛÉÂËÁ ÐÒÉ ÚÁÇÒÕÚËÅ ÉÎÆÏÒÍÁÃÉÉ ÆÉÌØÔÒÁ:\n"
-"%s"
-
-#: mail/mail-config-gui.c:431
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-"÷×ÅÄÉÔÅ ×ÁÛÅ ÉÍÑ É ÜÌ.ÁÄÒÅÓ, ËÏÔÏÒÙÅ ÂÕÄÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÉÓÈÏÄÑÝÅÊ "
-"ÐÏÞÔÙ. ÷Ù ÍÏÖÅÔÅ ÔÁËÖÅ, ÄÏÐÏÌÎÉÔÅÌØÎÏ, ××ÅÓÔÉ ÎÁÚ×ÁÎÉÅ ×ÁÛÅÊ ÏÒÇÁÎÉÚÁÃÉÉ É "
-"ÎÁÚ×ÁÎÉÅ ÆÁÊÌÁ, × ËÏÔÏÒÏÍ ÈÒÁÎÉÔÓÑ ×ÁÛÁ ÐÏÄÐÉÓØ."
-
-#: mail/mail-config-gui.c:444
-msgid "Full name:"
-msgstr "ðÏÌÎÏÅ ÉÍÑ:"
-
-#: mail/mail-config-gui.c:468
-msgid "Email address:"
-msgstr "üÌ.ÁÄÒÅÓ:"
-
-#: mail/mail-config-gui.c:483
-msgid "Organization:"
-msgstr "ïÒÇÁÎÉÚÁÃÉÑ:"
-
-#: mail/mail-config-gui.c:494
-msgid "Signature file:"
-msgstr "æÁÊÌ ÐÏÄÐÉÓÉ:"
-
-#: mail/mail-config-gui.c:499 mail/mail-config.glade.h:10
-msgid "Signature File"
-msgstr "æÁÊÌ ÐÏÄÐÉÓÉ"
-
-#: mail/mail-config-gui.c:898
-msgid "Server:"
-msgstr "óÅÒ×ÅÒ:"
-
-#: mail/mail-config-gui.c:904
-msgid "Username:"
-msgstr "éÍÑ ÐÏÌØÚÏ×ÁÔÅÌÑ:"
-
-#: mail/mail-config-gui.c:910
-msgid "Path:"
-msgstr "ðÕÔØ:"
-
-#: mail/mail-config-gui.c:918
-msgid "Authentication:"
-msgstr "éÄÅÎÔÉÆÉËÁÃÉÑ:"
-
-#: mail/mail-config-gui.c:930
-msgid "Detect supported types..."
-msgstr "ïÐÒÅÄÅÌÉÔØ ÐÏÄÄÅÒÖÉ×ÁÅÍÙÅ ÔÉÐÙ..."
-
-#: mail/mail-config-gui.c:955
-msgid "Don't delete messages from server"
-msgstr "îÅ ÕÄÁÌÑÔØ ÓÏÏÂÝÅÎÉÑ Ó ÓÅÒ×ÅÒÁ"
-
-#: mail/mail-config-gui.c:967
-msgid "Test Settings"
-msgstr "õÓÔÁÎÏ×ËÉ ÔÅÓÔÁ"
-
-#: mail/mail-config-gui.c:1099 mail/mail-config-gui.c:1147
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"÷ÙÂÅÒÉÔÅ ×ÉÄ ÉÓÐÏÌØÚÕÅÍÏÇÏ ×ÁÍÉ ÐÏÞÔÏ×ÏÇÏ ÓÅÒ×ÅÒÁ É ××ÅÄÉÔÅ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÕÀ "
-"ÉÎÆÏÒÍÁÃÉÀ Ï ÎÅÍ.\n"
-"\n"
-"åÓÌÉ ÓÅÒ×ÅÒ ÔÒÅÂÕÅÔ ÉÄÅÎÔÉÆÉËÁÃÉÉ, ÔÏ ÝÅÌËÎÉÔÅ ÎÁ ËÎÏÐËÅ \"ïÐÒÅÄÅÌÉÔØ "
-"ÐÏÄÄÅÒÖÉ×ÁÅÍÙÅ ÔÉÐÙ...\" ÐÏÓÌÅ ××ÏÄÁ ÏÓÔÁÌØÎÏÊ ÉÎÆÏÒÍÁÃÉÉ."
-
-#: mail/mail-config-gui.c:1123
-msgid ""
-"Select the kind of news server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"÷ÙÂÅÒÉÔÅ ÉÓÐÏÌØÚÕÅÍÙÊ ×ÁÍÉ ÓÅÒ×ÅÒ ÎÏ×ÏÓÔÅÊ É ××ÅÄÉÔÅ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÕÀ "
-"ÉÎÆÏÒÍÁÃÉÀ Ï ÎÅÍ.\n"
-"\n"
-"åÓÌÉ ÓÅÒ×ÅÒ ÔÒÅÂÕÅÔ ÉÄÅÎÔÉÆÉËÁÃÉÉ, ×Ù ÍÏÖÅÔÅ ÝÅÌËÎÕÔØ ÎÁ ËÎÏÐËÅ \"ïÐÒÅÄÅÌÉÔØ "
-"ÐÏÄÄÅÒÖÉ×ÁÅÍÙÅ ÔÉÐÙ...\" ÐÏÓÌÅ ××ÏÄÁ ÏÓÔÁÌØÎÏÊ ÉÎÆÏÒÍÁÃÉÉ."
-
-#: mail/mail-config-gui.c:1142
-msgid "Mail transport type:"
-msgstr "ôÉÐ ÐÅÒÅÄÁÞÉ ÐÏÞÔÙ:"
-
-#: mail/mail-config-gui.c:1197
-msgid "Edit Identity"
-msgstr "ðÒÁ×ËÁ ÉÍÅÎÏ×ÁÎÉÑ"
-
-#: mail/mail-config-gui.c:1199
-msgid "Add Identity"
-msgstr "äÏÂÁ×ÉÔØ ÉÍÅÎÏ×ÁÎÉÅ"
-
-#: mail/mail-config-gui.c:1293
-msgid "Edit Source"
-msgstr "ðÒÁ×ËÁ ÉÓÔÏÞÎÉËÁ"
-
-#: mail/mail-config-gui.c:1295
-msgid "Add Source"
-msgstr "äÏÂÁ×ÉÔØ ÉÓÔÏÞÎÉË"
-
-#: mail/mail-config-gui.c:1392
-msgid "Edit News Server"
-msgstr "ðÒÁ×ËÁ ÓÅÒ×ÅÒÁ ÎÏ×ÏÓÔÅÊ"
-
-#: mail/mail-config-gui.c:1394
-msgid "Add News Server"
-msgstr "äÏÂÁ×ÉÔØ ÓÅÒ×ÅÒ ÎÏ×ÏÓÔÅÊ"
-
-#: mail/mail-config-gui.c:2243
-msgid "The connection was successful!"
-msgstr "óÏÅÄÉÎÅÎÉÅ ÂÙÌÏ ÕÓÐÅÛÎÙÍ!"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config.glade.h:7 mail/mail-config.glade.h:14
-msgid "Identities"
-msgstr "éÍÅÎÏ×ÁÎÉÑ"
-
-#: mail/mail-config.glade.h:9
-msgid "Organization"
-msgstr "ïÒÇÁÎÉÚÁÃÉÑ"
-
-#: mail/mail-config.glade.h:12 mail/mail-config.glade.h:17
-#: mail/mail-config.glade.h:23
-msgid "Edit"
-msgstr "ðÒÁ×ËÁ"
-
-#: mail/mail-config.glade.h:15
-msgid "Sources"
-msgstr "éÓÔÏÞÎÉËÉ"
-
-#: mail/mail-config.glade.h:19
-msgid "Mail Sources"
-msgstr "éÓÔÏÞÎÉËÉ ÐÏÞÔÙ"
-
-#: mail/mail-config-druid.glade.h:15 mail/mail-config.glade.h:20
-msgid "Mail Transport"
-msgstr "ðÅÒÅÄÁÞÁ ÐÏÞÔÙ"
-
-#: mail/mail-config.glade.h:21
-msgid "News Servers"
-msgstr "óÅÒ×ÅÒÙ ÎÏ×ÏÓÔÅÊ"
-
-#: mail/mail-config.glade.h:25
-msgid "News Sources"
-msgstr "éÓÔÏÞÎÉËÉ ÎÏ×ÏÓÔÅÊ"
-
-#: mail/mail-config.glade.h:26
-msgid "Send messages in HTML format"
-msgstr "ïÔÐÒÁ×ÉÔØ ÐÏÞÔÕ × ÆÏÒÍÁÔÅ HTML"
-
-#: mail/mail-config.glade.h:27
-msgid "Mark message as seen [ms]: "
-msgstr "ïÔÍÅÔÉÔØ ÓÏÏÂÝÅÎÉÅ ËÁË ÐÒÏÓÍÏÔÒÅÎÎÏÅ [ÍÓ]:"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config-druid.glade.h:7 mail/mail-config-druid.glade.h:8
-#: mail/mail-config-druid.glade.h:16
-msgid "Mail Configuration"
-msgstr "îÁÓÔÒÏÊËÁ ÐÏÞÔÙ"
-
-#: mail/mail-config-druid.glade.h:9
-msgid ""
-"Welcome to the Evolution Mail configuration wizard!\n"
-"By filling in some information about your email\n"
-"settings, you can start sending and receiving email\n"
-"right away. Click Next to continue."
-msgstr ""
-"äÏÂÒÏ ÐÏÖÁÌÏ×ÁÔØ Ë ÐÏÍÏÝÎÉËÕ ÐÏ ÎÁÓÔÒÏÊËÅ ÐÏÞÔÙ × Evolution!\n"
-"÷×ÅÄÑ ÎÅËÏÔÏÒÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÁÛÉÈ ÐÏÞÔÏ×ÙÈ ÎÁÓÔÒÏÊËÁÈ\n"
-"×Ù ÓÍÏÖÅÔÅ ÎÁÞÁÔØ ÐÏÓÙÌÁÔØ É ÐÒÉÎÉÍÁÔØ ÐÏÞÔÕ.\n"
-"äÌÑ ÐÒÏÄÏÌÖÅÎÉÑ ÎÁÖÍÉÔÅ \"óÌÅÄ.\"."
-
-#: mail/mail-config-druid.glade.h:13
-msgid "Identity"
-msgstr "éÍÅÎÏ×ÁÎÉÅ"
-
-#: mail/mail-config-druid.glade.h:14
-msgid "Mail Source"
-msgstr "éÓÔÏÞÎÉË ÐÏÞÔÙ"
-
-#: mail/mail-config-druid.glade.h:17
-msgid ""
-"Your email configuration is now complete.\n"
-"Click \"Finish\" to save your new settings"
-msgstr ""
-"îÁÓÔÒÏÊËÁ ×ÁÛÅÊ ÐÏÞÔÙ ÚÁ×ÅÒÛÅÎÁ.\n"
-"îÁÖÍÉÔÅ \"úÁ×ÅÒÛÉÔØ\", ÞÔÏÂÙ ÓÏÈÒÁÎÉÔØ ÎÏ×ÙÅ ÕÓÔÁÎÏ×ËÉ."
-
-#: mail/mail-crypto.c:338 mail/mail-crypto.c:418
-msgid "Please enter your PGP/GPG passphrase."
-msgstr "ðÏÖÁÌÕÊÓÔÁ ××ÅÄÉÔÅ ×ÁÛÕ ÐÁÒÏÌØÎÕÀ ÆÒÁÚÕ PGP/GPG."
-
-#: mail/mail-crypto.c:342 mail/mail-crypto.c:422
-msgid "No password provided."
-msgstr "ðÁÒÏÌØ ÎÅ ÐÒÅÄÏÓÔÁ×ÌÅÎ."
-
-#: mail/mail-crypto.c:348 mail/mail-crypto.c:428
-#, c-format
-msgid "Couldn't create pipe to GPG/PGP: %s"
-msgstr "îÅ ÕÄÁÌÏÓØ ÓÏÚÄÁÔØ ËÁÎÁÌ Ë GPG/PGP: %s"
-
-#: mail/mail-local.c:257
-#, c-format
-msgid "Changing folder \"%s\" to \"%s\" format"
-msgstr "éÚÍÅÎÅÎÉÅ ÐÁÐËÉ \"%s\" × ÆÏÒÍÁÔ \"%s\""
-
-#: mail/mail-local.c:261
-#, c-format
-msgid "Change folder \"%s\" to \"%s\" format"
-msgstr "éÚÍÅÎÉÔØ ÐÁÐËÕ \"%s\" × ÆÏÒÍÁÔ \"%s\""
-
-#: mail/mail-ops.c:74
-#, c-format
-msgid "Fetching email from %s"
-msgstr "ðÏÌÕÞÅÎÉÅ ÐÏÞÔÙ c %s"
-
-#: mail/mail-ops.c:76
-#, c-format
-msgid "Fetch email from %s"
-msgstr "ðÏÌÕÞÉÔØ ÐÏÞÔÕ c %s"
-
-#: mail/mail-ops.c:87
-msgid "You have no remote mail source configured to fetch mail from."
-msgstr ""
-"õ ×ÁÓ ÎÅ ÎÁÓÔÒÏÅÎ ÉÓÔÏÞÎÉË ÐÏÞÔÙ, ÉÚ ËÏÔÏÒÏÇÏ ÅÅ ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÐÏÌÕÞÉÔØ."
-
-#: mail/mail-ops.c:97
-msgid "Bad folder passed to fetch_mail"
-msgstr "îÅÐÒÁ×ÉÌØÎÁÑ ÐÁÐËÁ ÐÅÒÅÄÁÎÁ × fetch_mail"
-
-#: mail/mail-ops.c:165
-msgid "There is no new mail."
-msgstr "îÅÔ ÎÏ×ÏÊ ÐÏÞÔÙ."
-
-#: mail/mail-ops.c:234
-#, c-format
-msgid "Sending \"%s\""
-msgstr "ïÔÐÒÁ×ËÁ \"%s\""
-
-#: mail/mail-ops.c:239
-msgid "Sending a message without a subject"
-msgstr "ïÔÐÒÁ×ËÁ ÓÏÏÂÝÅÎÉÑ ÂÅÚ ÔÅÍÙ"
-
-#: mail/mail-ops.c:242
-#, c-format
-msgid "Send \"%s\""
-msgstr "ðÏÓÌÁÔØ \"%s\""
-
-#: mail/mail-ops.c:245
-msgid "Send a message without a subject"
-msgstr "ðÏÓÌÁÔØ ÓÏÏÂÝÅÎÉÅ ÂÅÚ ÔÅÍÙ"
-
-#: mail/mail-ops.c:410
-#, c-format
-msgid "Expunging \"%s\""
-msgstr "÷ÙÞÅÒËÉ×ÁÎÉÅ \"%s\""
-
-#: mail/mail-ops.c:412
-#, c-format
-msgid "Expunge \"%s\""
-msgstr "÷ÙÞÅÒËÎÕÔØ \"%s\""
-
-#: mail/mail-ops.c:484
-#, c-format
-msgid "Moving messages from \"%s\" into \"%s\""
-msgstr "ðÅÒÅÍÅÝÅÎÉÅ ÓÏÏÂÝÅÎÉÊ ÉÚ \"%s\" × \"%s\""
-
-#: mail/mail-ops.c:486
-#, c-format
-msgid "Copying messages from \"%s\" into \"%s\""
-msgstr "ëÏÐÉÒÏ×ÁÎÉÅ ÓÏÏÂÝÅÎÉÊ ÉÚ \"%s\" × \"%s\""
-
-#: mail/mail-ops.c:489
-#, c-format
-msgid "Move messages from \"%s\" into \"%s\""
-msgstr "ðÅÒÅÍÅÓÔÉÔØ ÓÏÏÂÝÅÎÉÑ ÉÚ \"%s\" × \"%s\""
-
-#: mail/mail-ops.c:491
-#, c-format
-msgid "Copy messages from \"%s\" into \"%s\""
-msgstr "óËÏÐÉÒÏ×ÁÔØ ÓÏÏÂÝÅÎÉÑ ÉÚ \"%s\" × \"%s\""
-
-#: mail/mail-ops.c:637
-#, c-format
-msgid "Marking messages in folder \"%s\""
-msgstr "ðÏÍÅÞÁÎÉÅ ÓÏÏÂÝÅÎÉÊ × ÐÁÐËÅ \"%s\""
-
-#: mail/mail-ops.c:640
-#, c-format
-msgid "Mark messages in folder \"%s\""
-msgstr "ðÏÍÅÔÉÔØ ÓÏÏÂÝÅÎÉÑ × ÐÁÐËÅ \"%s\""
-
-#: mail/mail-ops.c:769
-#, c-format
-msgid "Scanning folders in \"%s\""
-msgstr "óÞÉÔÙ×ÁÎÉÅ ÐÁÐÏË × \"%s\""
-
-#: mail/mail-ops.c:772
-#, c-format
-msgid "Scan folders in \"%s\""
-msgstr "óÞÉÔÁÔØ ÐÁÐËÉ × \"%s\""
-
-#: mail/mail-ops.c:859
-msgid "(No description)"
-msgstr "(îÅÔ ÏÐÉÓÁÎÉÑ)"
-
-#: mail/mail-ops.c:922
-#, c-format
-msgid "Attaching messages from folder \"%s\""
-msgstr "ðÒÉÓÏÅÄÉÎÅÎÉÅ ÓÏÏÂÝÅÎÉÊ ÉÚ ÐÁÐËÉ \"%s\""
-
-#: mail/mail-ops.c:925
-#, c-format
-msgid "Attach messages from \"%s\""
-msgstr "ðÒÉÓÏÅÄÉÎÉÔØ ÓÏÏÂÝÅÎÉÑ ÉÚ \"%s\""
-
-#: mail/mail-ops.c:1051
-#, c-format
-msgid "Forwarding messages \"%s\""
-msgstr "ðÅÒÅÓÙÌËÁ ÓÏÏÂÝÅÎÉÊ \"%s\""
-
-#: mail/mail-ops.c:1056
-msgid "Forwarding a message without a subject"
-msgstr "ðÅÒÅÓÙÌËÁ ÓÏÏÂÝÅÎÉÑ ÂÅÚ ÔÅÍÙ"
-
-#: mail/mail-ops.c:1059
-#, c-format
-msgid "Forward message \"%s\""
-msgstr "ðÅÒÅÓÌÁÔØ ÓÏÏÂÝÅÎÉÅ \"%s\""
-
-#: mail/mail-ops.c:1064
-msgid "Forward a message without a subject"
-msgstr "ðÅÒÅÓÌÁÔØ ÓÏÏÂÝÅÎÉÅ ÂÅÚ ÔÅÍÙ"
-
-#: mail/mail-ops.c:1129
-msgid ""
-"Failed to generate mime part from message while generating forwarded message."
-msgstr ""
-"îÅ ÕÄÁÌÏÓØ ÓÏÚÄÁÔØ mime-ÞÁÓÔØ ÉÚ ÓÏÏÂÝÅÎÉÑ ÐÒÉ ÓÏÚÄÁÎÉÉ ÐÅÒÅÓÙÌÁÅÍÏÇÏ "
-"ÓÏÏÂÝÅÎÉÑ."
-
-#: mail/mail-ops.c:1218
-#, c-format
-msgid "Loading \"%s\""
-msgstr "úÁÇÒÕÚËÁ \"%s\""
-
-#: mail/mail-ops.c:1220
-#, c-format
-msgid "Load \"%s\""
-msgstr "úÁÇÒÕÚÉÔØ \"%s\""
-
-#: mail/mail-ops.c:1339
-#, c-format
-msgid "Creating \"%s\""
-msgstr "óÏÚÄÁÎÉÅ \"%s\""
-
-#: mail/mail-ops.c:1341
-#, c-format
-msgid "Create \"%s\""
-msgstr "óÏÚÄÁÔØ \"%s\""
-
-#: mail/mail-ops.c:1412
-msgid "Exception while reporting result to shell component listener."
-msgstr ""
-
-#: mail/mail-ops.c:1465
-#, c-format
-msgid "Synchronizing \"%s\""
-msgstr "óÉÎÈÒÏÎÉÚÁÃÉÑ \"%s\""
-
-#: mail/mail-ops.c:1467
-#, c-format
-msgid "Synchronize \"%s\""
-msgstr "óÉÎÈÒÏÎÉÚÏ×ÁÔØ \"%s\""
-
-#: mail/mail-ops.c:1543
-#, c-format
-msgid "Displaying message UID \"%s\""
-msgstr "ðÏËÁÚÁÔØ UID ÓÏÏÂÝÅÎÉÑ \"%s\""
-
-#: mail/mail-ops.c:1546
-msgid "Clearing message display"
-msgstr "ïÞÉÓÔËÁ ÏÔÏÂÒÁÖÅÎÉÑ ÓÏÏÂÝÅÎÉÑ"
-
-#: mail/mail-ops.c:1549
-#, c-format
-msgid "Display message UID \"%s\""
-msgstr "ðÏËÁÚÁÔØ UID ÓÏÏÂÝÅÎÉÑ \"%s\""
-
-#: mail/mail-ops.c:1552
-msgid "Clear message display"
-msgstr "ïÞÉÓÔÉÔØ ÏÔÏÂÒÁÖÅÎÉÅ ÓÏÏÂÝÅÎÉÑ"
-
-#: mail/mail-ops.c:1679
-#, c-format
-msgid "Opening messages from folder \"%s\""
-msgstr "ïÔËÒÙÔÉÅ ÓÏÏÂÝÅÎÉÊ ÉÚ ÐÁÐËÉ \"%s\""
-
-#: mail/mail-ops.c:1682
-#, c-format
-msgid "Open messages from \"%s\""
-msgstr "ïÔËÒÙÔØ ÓÏÏÂÝÅÎÉÑ ÉÚ \"%s\""
-
-#: mail/mail-ops.c:1794
-msgid "Loading Draftbox"
-msgstr "úÁÇÒÕÚËÁ ÑÝÉËÁ ÞÅÒÎÏ×ÉËÏ×"
-
-#: mail/mail-ops.c:1796
-msgid "Load Draftbox"
-msgstr "úÁÇÒÕÚÉÔØ ÑÝÉË ÞÅÒÎÏ×ÉËÏ×"
-
-#: mail/mail-ops.c:1864
-#, c-format
-msgid "Viewing messages from folder \"%s\""
-msgstr "ðÒÏÓÍÏÔÒ ÓÏÏÂÝÅÎÉÊ ÉÚ ÐÁÐËÉ \"%s\""
-
-#: mail/mail-ops.c:1867
-#, c-format
-msgid "View messages from \"%s\""
-msgstr "ðÒÏÓÍÏÔÒÅÔØ ÓÏÏÂÝÅÎÉÑ ÉÚ \"%s\""
-
-#: mail/mail-threads.c:274
-#, c-format
-msgid ""
-"Error while preparing to %s:\n"
-"%s"
-msgstr ""
-"ïÛÉÂËÁ ÐÒÉ ÐÏÄÇÏÔÏ×ËÅ Ë %s:\n"
-"%s"
-
-#: mail/mail-threads.c:627
-#, c-format
-msgid ""
-"Error while `%s':\n"
-"%s"
-msgstr ""
-"ïÛÉÂËÁ ÐÒÉ \"%s\":\n"
-"%s"
-
-#: mail/mail-threads.c:680
-msgid "Incomplete message written on pipe!"
-msgstr "îÅÐÏÌÎÏÅ ÓÏÏÂÝÅÎÉÅ ÚÁÐÉÓÁÎÏ × ËÁÎÁÌ!"
-
-#: mail/mail-threads.c:684
-msgid "Error reading commands from dispatching thread."
-msgstr "ïÛÉÂËÁ ÞÔÅÎÉÑ ËÏÍÁÎÄ ÉÚ ÐÒÏ×ÅÒÑÅÍÏÊ ÎÉÔÉ."
-
-#: mail/mail-threads.c:749
-msgid "Corrupted message from dispatching thread?"
-msgstr "ðÏ×ÒÅÖÄÅÎÎÏÅ ÓÏÏÂÝÅÎÉÅ ÉÚ ÐÒÏ×ÅÒÑÅÍÏÊ ÎÉÔÉ?"
-
-#: mail/mail-threads.c:861
-msgid "Could not create dialog box."
-msgstr "îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÏËÎÏ ÄÉÁÌÏÇÁ."
-
-#: mail/mail-threads.c:872
-msgid "User cancelled query."
-msgstr "ðÏÌØÚÏ×ÁÔÅÌØ ÏÔÍÅÎÉÌ ÚÁÐÒÏÓ."
-
-#: mail/mail-tools.c:205
-#, c-format
-msgid "Couldn't create temporary mbox `%s': %s"
-msgstr "îÅ ÕÄÁÌÏÓØ ÓÏÚÄÁÔØ ×ÒÅÍÅÎÎÙÊ mbox \"%s\": %s"
-
-#: mail/mail-tools.c:290
-#, c-format
-msgid ""
-"Could not read UID cache file \"%s\". You may receive duplicate messages."
-msgstr "îÅ ÕÄÁÌÏÓØ ÐÒÏÞÅÓÔØ UID ËÜÛ-ÆÁÊÌ \"%s\". ÷Ù ÍÏÖÅÔÅ ÐÏÌÕÞÉÔØ ÄÕÂÌÉËÁÔÙ ÓÏÏÂÝÅÎÉÊ."
-
-#: mail/mail-tools.c:373
-#, c-format
-msgid "[%s] %s"
-msgstr "[%s] %s"
-
-#: mail/mail-tools.c:375
-#, c-format
-msgid "[%s] (forwarded message)"
-msgstr "[%s] (ÐÅÒÅÓÌÁÎÎÏÅ ÓÏÏÂÝÅÎÉÅ)"
-
-#: mail/mail-tools.c:384
-msgid "Fwd: (no subject)"
-msgstr "ðÅÒÅÓÌ.: (ÎÅÔ ÔÅÍÙ)"
-
-#: mail/mail-tools.c:419
-#, c-format
-msgid "Forwarded message - %s"
-msgstr "ðÅÒÅÓÌÁÎÎÏÅ ÓÏÏÂÝÅÎÉÅ - %s"
-
-#: mail/mail-tools.c:421
-msgid "Forwarded message (no subject)"
-msgstr "ðÅÒÅÓÌÁÎÎÏÅ ÓÏÏÂÝÅÎÉÅ (ÂÅÚ ÔÅÍÙ)"
-
-#: mail/mail-tools.c:532
-#, c-format
-msgid "Couldn't stat(2) movemail folder %s"
-msgstr ""
-
-#: mail/mail-tools.c:633
-#, c-format
-msgid "Don't know protocol to open URI `%s'"
-msgstr "îÅ ÉÚ×ÅÓÔÅÎ ÐÒÏÔÏËÏÌ ÄÌÑ ÏÔËÒÙÔÉÑ URI \"%s\""
-
-#: mail/mail-tools.c:662
-#, c-format
-msgid ""
-"Cannot open location `%s':\n"
-"%s"
-msgstr ""
-"îÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÐÏÌÏÖÅÎÉÅ \"%s\":\n"
-"%s"
-
-#: mail/mail-vfolder.c:298
-msgid "New VFolder"
-msgstr "îÏ×ÁÑ ×ÉÒÔ.ÐÁÐËÁ"
-
-#: mail/message-list.c:490
-msgid "Online Status"
-msgstr "ðÏÄËÌÀÞÅÎÎÏÅ ÓÏÓÔÏÑÎÉÅ"
-
-#: mail/message-list.c:526
-msgid "From"
-msgstr "ïÔ"
-
-#: mail/message-list.c:533
-msgid "Subject"
-msgstr "ôÅÍÁ"
-
-#: mail/message-list.c:540
-msgid "Date"
-msgstr "äÁÔÁ"
-
-#: mail/message-list.c:547
-msgid "Received"
-msgstr "ðÏÌÕÞÅÎÏ"
-
-#: mail/message-list.c:554
-msgid "To"
-msgstr "ëÏÍÕ"
-
-#: mail/message-list.c:561
-msgid "Size"
-msgstr "òÁÚÍÅÒ"
-
-#: notes/component-factory.c:27
-msgid "Create a new note"
-msgstr "óÏÚÄÁÔØ ÎÏ×ÕÀ ÚÁÐÉÓØ"
-
-#: notes/component-factory.c:148
-msgid "Cannot initialize Evolution's notes component."
-msgstr "îÅ×ÏÚÍÏÖÎÏ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ËÏÍÐÏÎÅÎÔ \"âÌÏËÎÏÔ\" Evolution."
-
-#: notes/main.c:30
-msgid "Notes Component: Could not initialize bonobo"
-msgstr "ëÏÍÐÏÎÅÎÔ \"âÌÏËÎÏÔ\": îÅ ÕÄÁÌÏÓØ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ Bonobo"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "õÓÔÁÎÏ×ËÁ \"ü×ÏÌÀÃÉÉ\""
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "ðÏÈÏÖÅ ×Ù ÚÁÐÕÓÔÉÌÉ \"ü×ÏÌÀÃÉÀ\" × ÐÅÒ×ÙÅ."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-"ðÏÖÁÌÕÊÓÔÁ ÎÁÖÍÉÔÅ \"ïË\", ÞÔÏÂÙ ÕÓÔÁÎÏ×ÉÔØ ÐÏÌØÚÏ×ÁÔÅÌØÓËÉÅ ÆÁÊÌÙ "
-"\"ü×ÏÌÀÃÉÉ\" ×"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ\n"
-"%s\n"
-"ïÛÉÂËÁ: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"îÅ×ÏÚÍÏÖÎÏ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌÙ ×\n"
-"\"%s\"."
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "æÁÊÌÙ \"ü×ÏÌÀÃÉÉ\" ÕÓÐÅÛÎÏ ÕÓÔÁÎÏ×ÌÅÎÙ."
-
-#: shell/e-setup.c:109
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please move it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"æÁÊÌ \"%s\" ÎÅ Ñ×ÌÑÅÔÓÑ ËÁÔÁÌÏÇÏÍ.\n"
-"ðÏÖÁÌÕÊÓÔÁ, ÐÅÒÅÍÅÓÔÉÔÅ ÅÇÏ, ÞÔÏÂÙ ÐÏÚ×ÏÌÉÔØ\n"
-"ÕÓÔÁÎÏ×ÉÔØ ÆÁÊÌÙ ÐÏÌØÚÏ×ÁÔÅÌÑ Evolution."
-
-#: shell/e-setup.c:121
-#, c-format
-msgid ""
-"The directory `%s' exists but is not the\n"
-"Evolution directory. Please move it in order\n"
-"to allow installation of the Evolution user files."
-msgstr ""
-"æÁÊÌ \"%s\" ÎÅ Ñ×ÌÑÅÔÓÑ ËÁÔÁÌÏÇÏÍ Evolution.\n"
-"ðÏÖÁÌÕÊÓÔÁ, ÕÄÁÌÉÔÅ ÅÇÏ, ÞÔÏÂÙ ÐÏÚ×ÏÌÉÔØ\n"
-"ÕÓÔÁÎÏ×ÉÔØ ÆÁÊÌÙ ÐÏÌØÚÏ×ÁÔÅÌÑ Evolution."
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÕËÁÚÁÎÎÕÀ ÐÁÐËÕ:\n"
-"%s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr "õËÁÚÁÎÎÏÅ ÉÍÑ ÐÁÐËÉ ÎÅ ÄÏÐÕÓÔÉÍÏ."
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "ü×ÏÌÀÃÉÑ - óÏÚÄÁÔØ ÎÏ×ÕÀ ÐÁÐËÕ"
-
-#: shell/e-shell-folder-selection-dialog.c:96
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-"ôÉÐ ×ÙÂÒÁÎÎÏÊ ÐÁÐËÉ ÎÅ ÐÏÄÈÏÄÉÔ ÄÌÑ\n"
-"ÚÁÐÒÏÛÅÎÎÏÇÏ ÄÅÊÓÔ×ÉÑ."
-
-#: shell/e-shell-folder-selection-dialog.c:272
-msgid "New..."
-msgstr "îÏ×ÁÑ..."
-
-#: shell/e-shell-folder-title-bar.c:451 shell/e-shell-folder-title-bar.c:452
-msgid "(Untitled)"
-msgstr "(âÅÚ ÚÁÇÏÌÏ×ËÁ)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Bug-buddy ÎÅ ÂÙÌ ÎÁÊÄÅÎ × ×ÁÛÅÍ $PATH."
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "Bug-buddy ÎÅ ÍÏÖÅÔ ÂÙÔØ ÚÁÐÕÝÅÎ."
-
-#: shell/e-shell-view-menu.c:167
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:169
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"\"ü×ÏÌÀÃÉÑ\" ÜÔÏ ÎÁÂÏÒ ÐÒÉÌÏÖÅÎÉÊ ÜÌÅËÔÒÏÎÎÏÊ ÐÏÞÔÙ,\n"
-"×ÅÄÅÎÉÑ ËÁÌÅÎÄÁÒÅÊ É ËÏÎÔÁËÔÎÏÊ ÉÎÆÏÒÍÁÃÉÉ ÄÌÑ\n"
-"ÇÒÕÐÐÏ×ÏÊ ÒÁÂÏÔÙ × ÓÒÅÄÅ GNOME."
-
-#: shell/e-shell-view-menu.c:319
-msgid "Go to folder..."
-msgstr "ðÅÒÅÊÔÉ Ë ÐÁÐËÅ..."
-
-#: shell/e-shell-view-menu.c:377
-msgid "_New"
-msgstr "îÏ×ÏÅ"
-
-#: shell/e-shell-view-menu.c:389
-msgid "_Folder"
-msgstr "ðÁÐËÁ"
-
-#: shell/e-shell-view-menu.c:395
-msgid "Evolution bar _shortcut"
-msgstr "óÔÒÏËÁ ÑÒÌÙËÏ× Evolution"
-
-#: shell/e-shell-view-menu.c:404
-msgid "_Mail message (FIXME)"
-msgstr "ðÏÞÔÏ×ÏÅ ÓÏÏÂÝÅÎÉÅ (FIXME)"
-
-#: shell/e-shell-view-menu.c:410
-msgid "_Appointment (FIXME)"
-msgstr "÷ÓÔÒÅÞÁ (FIXME)"
-
-#: shell/e-shell-view-menu.c:416
-msgid "_Contact (FIXME)"
-msgstr "ëÏÎÔÁËÔ (FIXME)"
-
-#: shell/e-shell-view-menu.c:422
-msgid "_Task (FIXME)"
-msgstr "úÁÄÁÎÉÅ (FIXME)"
-
-#: shell/e-shell-view-menu.c:444
-msgid "_Go to Folder..."
-msgstr "ðÅÒÅÊÔÉ Ë ÐÁÐËÅ..."
-
-#: shell/e-shell-view-menu.c:445
-msgid "Display a different folder"
-msgstr "ðÏËÁÚÁÔØ ÄÒÕÇÕÀ ÐÁÐËÕ"
-
-#: shell/e-shell-view-menu.c:452
-msgid "_Create New Folder..."
-msgstr "óÏÚÄÁÔØ ÎÏ×ÕÀ ÐÁÐËÕ..."
-
-#: shell/e-shell-view-menu.c:453 shell/e-shell-view-menu.c:465
-msgid "Create a new folder"
-msgstr "óÏÚÄÁÔØ ÎÏ×ÕÀ ÐÁÐËÕ"
-
-#: shell/e-shell-view-menu.c:464
-msgid "E_xit..."
-msgstr "÷ÙÈÏÄ..."
-
-#: shell/e-shell-view-menu.c:495
-msgid "Show _Shortcut Bar"
-msgstr "ðÏËÁÚÁÔØ ÓÔÒÏËÕ ÚÁËÌÁÄÏË"
-
-#: shell/e-shell-view-menu.c:496
-msgid "Show the shortcut bar"
-msgstr "ðÏËÁÚÁÔØ ÓÔÒÏËÕ ÚÁËÌÁÄÏË"
-
-#: shell/e-shell-view-menu.c:501
-msgid "Show _Folder Bar"
-msgstr "ðÏËÁÚÁÔØ ÓÔÒÏËÕ ÐÁÐÏË"
-
-#: shell/e-shell-view-menu.c:502
-msgid "Show the folder bar"
-msgstr "ðÏËÁÚÁÔØ ÓÔÒÏËÕ ÐÁÐÏË"
-
-#: shell/e-shell-view-menu.c:513
-msgid "_Settings"
-msgstr "õÓÔÁÎÏ×ËÉ"
-
-#: shell/e-shell-view-menu.c:524
-msgid "_Help"
-msgstr "óÐÒÁ×ËÁ"
-
-#: shell/e-shell-view-menu.c:530
-msgid "Help _Index"
-msgstr "éÎÄÅËÓ ÓÐÒÁ×ËÉ"
-
-#: shell/e-shell-view-menu.c:537
-msgid "Getting _Started"
-msgstr "÷×ÅÄÅÎÉÅ"
-
-#: shell/e-shell-view-menu.c:544
-msgid "Using the _Mailer"
-msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ ÐÏÞÔÏ×ÏÊ ÐÒÏÇÒÁÍÍÙ"
-
-#: shell/e-shell-view-menu.c:551
-msgid "Using the _Calendar"
-msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ ËÁÌÅÎÄÁÒÑ"
-
-#: shell/e-shell-view-menu.c:558
-msgid "Using the C_ontact Manager"
-msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ ÄÉÓÐÅÔÞÅÒÁ ËÏÎÔÁËÔÏ×"
-
-#: shell/e-shell-view-menu.c:568
-msgid "_Submit Bug Report"
-msgstr "ïÔÐÒÁ×ÉÔØ ÓÏÏÂÝÅÎÉÅ Ï ÏÛÉÂËÅ"
-
-#: shell/e-shell-view-menu.c:569
-msgid "Submit bug report using Bug Buddy"
-msgstr "ïÐÒÁ×ÉÔØ ÓÏÏÂÝÅÎÉÅ Ï ÏÛÉÂËÅ ÞÅÒÅÚ bug-buddy"
-
-#: shell/e-shell-view-menu.c:578
-msgid "_About Evolution..."
-msgstr "ï ÐÒÏÇÒÁÍÍÅ Evolution..."
-
-#: shell/e-shell-view-menu.c:579
-msgid "Show information about Evolution"
-msgstr "ðÏËÁÚÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ÐÒÏÇÒÁÍÍÅ Evolution"
-
-#: shell/e-shell-view.c:122
-msgid "(No folder displayed)"
-msgstr "(ðÁÐËÉ ÎÅ ÐÏËÁÚÁÎÙ)"
-
-#: shell/e-shell-view.c:350
-msgid "Folders"
-msgstr "ðÁÐËÉ"
-
-#: shell/e-shell-view.c:879
-#, c-format
-msgid "Evolution - %s"
-msgstr "ü×ÏÌÀÃÉÑ - %s"
-
-#: shell/e-shell.c:293
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "îÅ×ÏÚÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ ÌÏËÁÌØÎÏÅ ÈÒÁÎÉÌÉÝÅ -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "íÁÌÅÎØËÉÅ ÐÉËÔÏÇÒÁÍÍÙ"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "ðÏËÁÚÁÔØ ÚÁËÌÁÄËÉ ËÁË ÍÁÌÅÎØËÉÅ ÐÉËÔÏÇÒÁÍÍÙ"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "âÏÌØÛÉÅ ÐÉËÔÏÇÒÁÍÍÙ"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "ðÏËÁÚÁÔØ ÚÁËÌÁÄËÉ ËÁË ÂÏÌØÛÉÅ ÐÉËÔÏÇÒÁÍÍÙ"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "áËÔÉ×ÉÒÏ×ÁÔØ"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "áËÔÉ×ÉÒÏ×ÁÔØ ÜÔÕ ÚÁËÌÁÄËÕ"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "õÄÁÌÉÔØ ÜÔÕ ÚÁËÌÁÄËÕ ÉÚ ÓÔÒÏËÉ ÚÁËÌÁÄÏË"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "ïÛÉÂËÁ ÓÏÈÒÁÎÅÎÉÑ ÚÁËÌÁÄÏË."
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "(âÅÚ ÉÍÅÎÉ)"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "îÅÔ ÏÛÉÂËÉ"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "ïÂÙÞÎÁÑ ÏÛÉÂËÁ"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "ðÁÐËÁ Ó ÔÁËÉÍ ÎÁÚ×ÁÎÉÅÍ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr "õËÁÚÁÎÎÙÊ ÔÉÐ ÐÁÐËÉ ÎÅ ÄÏÐÕÓÔÉÍ"
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "ïÛÉÂËÁ ××ÏÄÁ/×Ù×ÏÄÁ"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "îÅÄÏÓÔÁÔÏÞÎÏ ÍÅÓÔÁ ÄÌÑ ÓÏÚÄÁÎÉÑ ÐÁÐËÉ"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "õËÁÚÁÎÎÁÑ ÐÁÐËÁ ÎÅ ÎÁÊÄÅÎÁ"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr "æÕÎËÃÉÑ ÎÅ ÒÅÁÌÉÚÏ×ÁÎÁ ÄÌÑ ÜÔÏÇÏ ÎÏÓÉÔÅÌÑ"
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "ïÔËÁÚ × ÄÏÓÔÕÐÅ"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "ïÐÅÒÁÃÉÑ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr "õËÁÚÁÎÎÙÊ ÔÉÐ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ ÄÌÑ ÜÔÏÇÏ ÎÏÓÉÔÅÌÑ"
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ"
-
-#: shell/e-storage-set-view.c:242
-msgid "View the selected folder"
-msgstr "ðÒÏÓÍÏÔÒ ×ÙÂÒÁÎÎÏÊ ÐÁÐËÉ"
-
-#: shell/main.c:66
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"ðÒÉ×ÅÔ! óÐÁÓÉÂÏ, ÞÔÏ ÎÁÛÌÉ ×ÒÅÍÑ ÓËÁÞÁÔØ ÜÔÕ ÐÒÅÄ×ÁÒÉÔÅÌØÎÕÀ ×ÅÒÓÉÀ\n"
-"ÎÁÂÏÒÁ ÇÒÕÐÐÏ×ÙÈ ÐÒÉÌÏÖÅÎÉÊ \"ü×ÏÌÀÃÉÑ\"\n"
-"ëÏÍÁÎÄÁ \"ü×ÏÌÀÃÉÉ\" ÕÐÏÒÎÏ ÒÁÂÏÔÁÅÔ, ÞÔÏÂÙ ÓÄÅÌÁÔØ ÐÒÏÇÒÁÍÍÕ ÎÁÓÔÏÌØËÏ\n"
-"ÕÓÔÏÊÞÉ×ÏÊ, ÒÁÓÛÉÒÑÅÍÏÊ, ËÒÁÓÉ×ÏÊ, ÂÙÓÔÒÏÊ É ÆÕÎËÃÉÏÎÁÌØÎÏÊ ÄÌÑ\n"
-"ÉÚÏÝÒÅÎÎÏÇÏ ÐÏÌØÚÏ×ÁÔÅÌÑ éÎÔÅÒÎÅÔ, ÎÁÓËÏÌØËÏ ×ÏÚÍÏÖÎÏ. é ÍÙ ÕÓÔÁÌÉ.\n"
-"îÏ ÍÙ ÅÝÅ ÎÅ ÇÏÔÏ×Ù -- ÐÏËÁ ÎÅÔ.\n"
-"\n"
-"ëÏÇÄÁ ×Ù ÉÓÓÌÅÄÕÀÔÅ \"ü×ÏÌÀÃÉÀ\", ÐÏÖÁÌÕÊÓÔÁ ÕÞÉÔÙ×ÁÊÔÅ, ÞÔÏ ÂÏÌØÛÁÑ ÞÁÓÔØ\n"
-"ÎÁÛÅÊ ÒÁÂÏÔÙ ÂÙÌÁ ÎÁÐÒÁ×ÌÅÎÁ ÎÁ ÓÏÚÄÁÎÉÅ ÍÏÝÎÏÇÏ Ä×ÉÖËÁ, ËÏÔÏÒÙÊ ÂÕÄÅÔ\n"
-"ÕÐÒÁ×ÌÑÔØ ×ÓÅÊ ÓÉÓÔÅÍÏÊ, Á ÎÅ ÐÏÌØÚÏ×ÁÔÅÌØÓËÏÇÏ ÉÎÔÅÒÆÅÊÓÁ. ðÒÅÄÓÔÏÉÔ ÅÝÅ\n"
-"ÍÎÏÇÏ ÒÁÂÏÔÙ, ÍÙ Ó ÌÀÂÏ×ØÀ É ×ÎÉÍÁÎÉÅÍ ÂÕÄÅÍ ÒÁÚ×É×ÁÔØ ÐÏÌØÚÏ×ÁÔÅÌØÓËÉÊ\n"
-"ÉÎÔÅÒÆÅÊÓ. á ×Ù ÕÚÎÁÅÔÅ, ÞÔÏ ÜÔÏ ÎÅ ÄÅÍÏÎÓÔÒÁÛËÁ.\n"
-"\n"
-"÷ÒÅÍÑ ÄÌÑ ÚÁÎÕÄÎÏÇÏ \"ïÐÒÏ×ÅÒÖÅÎÉÑ\". \"ü×ÏÌÀÃÉÑ ÂÕÄÅÔ: ÐÁÄÁÔØ, ÕÎÉÞÔÏÖÁÔØ\n"
-"×ÁÛÕ ÐÏÞÔÕ, ÏÓÔÁ×ÌÑÔØ ÚÁÐÕÝÅÎÎÙÍÉ ÚÁÂÌÕÄÉ×ÛÉÅÓÑ ÐÒÏÃÅÓÓÙ, ÐÏÇÌÏÝÁÔØ 100%\n"
-"ãðõ, ÚÁ×ÉÓÁÔØ, ÏÔÐÒÁ×ÌÑÔØ HTML-ÐÏÞÔÕ × ÓÌÕÞÁÊÎÙÅ ÓÐÉÓËÉ ÒÁÓÓÙÌËÉ É ÓÔÁ×ÉÔØ\n"
-"×ÁÓ × ÎÅÌÏ×ËÏÅ ÐÏÌÏÖÅÎÉÅ ÐÅÒÅÄ ÄÒÕÚØÑÍÉ É ËÏÌÌÅÇÁÍÉ. éÓÐÏÌØÚÕÊÔÅ ÎÁ Ó×ÏÊ\n"
-"ÓÔÒÁÈ É ÒÉÓË.\n"
-"íÙ ÎÁÄÅÅÍÓÑ, ÞÔÏ ×ÁÍ ÐÏÎÒÁ×ÑÔÓÑ ÒÅÚÕÌØÔÁÔÙ ÎÁÛÅÊ ÕÐÏÒÎÏÊ ÒÁÂÏÔÙ É ÍÙ\n"
-"ÒÁÓÓÞÉÔÙ×ÁÅÍ ÎÁ ×ÁÛÅ ÕÞÁÓÔÉÅ!\n"
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"ó ÂÌÁÇÏÄÁÒÎÏÓÔØÀ\n"
-"ëÏÍÁÎÄÁ Evolution\n"
-
-#: shell/main.c:121
-msgid "Cannot initialize the Evolution shell."
-msgstr "îÅ×ÏÚÍÏÖÎÏ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÏÂÏÌÏÞËÕ \"ü×ÏÌÀÃÉÉ\"."
-
-#: shell/main.c:156
-msgid "Cannot initialize the Bonobo component system."
-msgstr "îÅ ÕÄÁÌÏÓØ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ËÏÍÐÏÎÅÎÔÎÕÀ ÓÉÓÔÅÍÕ Bonobo."
-
-#: tests/ui-tests/message-browser.c:360
-msgid "The component now claims that it doesn't support PersistStream!"
-msgstr "ëÏÍÐÏÎÅÎÔ ÚÁÑ×ÌÑÅÔ, ÞÔÏ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔ PersistStream!"
-
-#: tests/ui-tests/message-browser.c:378
-msgid ""
-"An exception occured while trying to load data into the component with "
-"PersistStream"
-msgstr ""
-"ðÒÉ ÐÏÐÙÔËÅ ÚÁÇÒÕÚÉÔØ ÄÁÎÎÙÅ × ËÏÍÐÏÎÅÎÔ ÞÅÒÅÚ PersistStream ×ÏÚÎÉËÌÏ "
-"ÉÓËÌÀÞÅÎÉÅ"
-
-#: tests/ui-tests/message-browser.c:471
-#, c-format
-msgid "The %s component doesn't support PersistStream!\n"
-msgstr "ëÏÍÐÏÎÅÎÔ %s ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔ PersistStream!\n"
-
-#: tests/ui-tests/message-browser.c:710
-msgid "Open Mime Message"
-msgstr "ïÔËÒÙÔØ Mime-ÓÏÏÂÝÅÎÉÅ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "ðÏÌÑ"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "çÒÕÐÐÉÒÏ×ÁÎÉÅ"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "óÏÒÔÉÒÏ×ÁÔØ"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "æÉÌØÔÒ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-#: widgets/e-table/e-table-header-item.c:1164
-msgid "Field Chooser"
-msgstr "÷ÙÂÏÒ ÐÏÌÑ"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-"þÔÏÂÙ ÄÏÂÁ×ÉÔØ ÓÔÏÌÂÅÃ Ë ×ÁÛÅÊ ÔÁÂÌÉÃÅ, ÐÅÒÅÔÁÝÉÔÅ\n"
-"ÅÇÏ × ÔÏ ÍÅÓÔÏ ÇÄÅ ÏÎ ÄÏÌÖÅÎ ÎÁÈÏÄÉÔØÓÑ."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "ÏËÎÏ1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "äÏÓÔÕÐÎÙÅ ÐÏÌÑ"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "ÍÅÔËÁ1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "ðÏËÁÚÁÔØ × ÔÁËÏÍ ÐÏÒÑÄËÅ"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "ÍÅÔËÁ2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "äÏÂÁ×ÉÔØ >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< õÄÁÌÉÔØ"
-
-#: widgets/e-table/e-table-header-item.c:1156
-msgid "Sort Ascending"
-msgstr "óÏÒÔÉÒÏ×ËÁ ÐÏ ×ÏÚÒÁÓÔÁÎÉÀ"
-
-#: widgets/e-table/e-table-header-item.c:1157
-msgid "Sort Descending"
-msgstr "óÏÒÔÉÒÏ×ËÁ ÐÏ ÕÂÙ×ÁÎÉÀ"
-
-#: widgets/e-table/e-table-header-item.c:1158
-msgid "Unsort"
-msgstr "âÅÚ ÓÏÒÔÉÒÏ×ËÉ"
-
-#: widgets/e-table/e-table-header-item.c:1160
-msgid "Group By This Field"
-msgstr "çÒÕÐÐÉÒÏ×ÁÔØ ÐÏ ÜÔÏÍÕ ÐÏÌÀ"
-
-#: widgets/e-table/e-table-header-item.c:1161
-msgid "Group By Box"
-msgstr "çÒÕÐÐÉÒÏ×ÁÔØ ÐÏ ÑÝÉËÕ"
-
-#: widgets/e-table/e-table-header-item.c:1163
-msgid "Remove This Column"
-msgstr "õÄÁÌÉÔØ ÜÔÏÔ ÓÔÏÌÂÅÃ"
-
-#: widgets/e-table/e-table-header-item.c:1166
-msgid "Alignment"
-msgstr "÷ÙÒÁ×ÎÉ×ÁÎÉÅ"
-
-#: widgets/e-table/e-table-header-item.c:1167
-msgid "Best Fit"
-msgstr "ìÕÞÛÅÅ ÚÁÐÏÌÎÅÎÉÅ"
-
-#: widgets/e-table/e-table-header-item.c:1168
-msgid "Format Columns..."
-msgstr "æÏÒÍÁÔÉÒÏ×ÁÎÉÅ ÓÔÏÌÂÃÏ×..."
-
-#: widgets/e-table/e-table-header-item.c:1170
-msgid "Customize Current View..."
-msgstr "îÁÓÔÒÏÊËÁ ÔÅËÕÝÅÇÏ ÐÒÏÓÍÏÔÒÁ..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr "üËÓÐÅÒÉÍÅÎÔÁÌØÎÙÊ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "úÁÎÑÔ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr "÷ÎÅ ÏÆÉÓÁ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "îÅÔ ÉÎÆÏÒÍÁÃÉÉ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr "ðÒÉÇÌÁÓÉÔØ ÄÒÕÇÉÈ..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "ðÁÒÁÍÅÔÒÙ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr "ðÏËÁÚÙ×ÁÔØ ÔÏÌØËÏ ÒÁÂÏÞÉÅ ÞÁÓÙ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr "ðÏËÁÚÙ×ÁÔØ ÕÍÅÎØÛÅÎÎÙÅ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr "ïÂÎÏ×ÉÔØ ó×ÏÂÏÄÅÎ/úÁÎÑÔ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr "á×ÔÏ×ÙÂÏÒ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ">>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "÷ÓÅ ÌÀÄÉ É ÒÅÓÕÒÓÙ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr "÷ÓÅ ÌÀÄÉ É ÏÄÉÎ ÒÅÓÕÒÓ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr "ôÒÅÂÕÅÍÙÅ ÌÀÄÉ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr "ôÒÅÂÕÅÍÙÅ ÌÀÄÉ É ÏÄÉÎ ÒÅÓÕÒÓ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "÷ÒÅÍÑ ÎÁÞÁÌÁ ÓÏÂÒÁÎÉÑ:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "÷ÒÅÍÑ ÚÁ×ÅÒÛÅÎÉÑ ÓÏÂÒÁÎÉÑ:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr "÷ÓÅ ÓÏÐÒÏ×ÏÖÄÅÎÉÅ"
-
-#. Translators: These are the first characters of each day of the
-#. week, 'M' for 'Monday', 'T' for Tuesday etc.
-#: widgets/misc/e-calendar-item.c:281
-msgid "MTWTFSS"
-msgstr "ð÷óþðó÷"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "çÒÕÐÐÁ %i"
diff --git a/po/sl.po b/po/sl.po
deleted file mode 100644
index 2dd882445b..0000000000
--- a/po/sl.po
+++ /dev/null
@@ -1,4025 +0,0 @@
-# Slovenian translation file for Evolution.
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Andraz Tori <andraz.tori1@guest.arnes.si> 2000
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution\n"
-"POT-Creation-Date: 2000-08-10 23:08+0200\n"
-"PO-Revision-Date: 2000-07-28 03:15+0200\n"
-"Last-Translator: Andraz Tori <andraz.tori1@guest.arnes.si>\n"
-"Language-Team: Slovenian <sl@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso8859-2\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-gnomecard-addressbook.c:41
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:59 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Nisem mogel inicializirati Bonoba"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "kategorije"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "Predmet(i) pripada(jo) tem kategorijam:"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "Dostopne kategorije:"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/dialogs/task-editor.c:217 calendar/gui/event-editor.c:1168
-msgid "FIXME: _Appointment"
-msgstr "FIXME: _Zmenek"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/dialogs/task-editor.c:218 calendar/gui/event-editor.c:1169
-msgid "FIXME: Meeting Re_quest"
-msgstr "FIXME: Za_hteva po sestanku"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/dialogs/task-editor.c:216 calendar/gui/event-editor.c:1171
-msgid "FIXME: _Mail Message"
-msgstr "FIXME: _Po¹lji sporoèilo"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/dialogs/task-editor.c:219 calendar/gui/event-editor.c:1172
-msgid "FIXME: _Contact"
-msgstr "FIXME: _Stik"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/dialogs/task-editor.c:213
-#: calendar/gui/dialogs/task-editor.c:220 calendar/gui/event-editor.c:1173
-msgid "FIXME: _Task"
-msgstr "FIXME: _Naloga"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/dialogs/task-editor.c:214
-#: calendar/gui/dialogs/task-editor.c:221 calendar/gui/event-editor.c:1174
-msgid "FIXME: Task _Request"
-msgstr "FIXME: Zahteva po _nalogi"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/dialogs/task-editor.c:222 calendar/gui/event-editor.c:1175
-msgid "FIXME: _Journal Entry"
-msgstr "FIXME: _Vpis v dnevniku"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/dialogs/task-editor.c:223 calendar/gui/event-editor.c:1176
-msgid "FIXME: _Note"
-msgstr "FIXME: _Opomba"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/dialogs/task-editor.c:225
-#: calendar/gui/dialogs/task-editor.c:332 calendar/gui/event-editor.c:1178
-#: calendar/gui/event-editor.c:1285
-msgid "FIXME: Ch_oose Form..."
-msgstr "FIXME: Izberi izmed..."
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/dialogs/task-editor.c:230 calendar/gui/event-editor.c:1183
-msgid "FIXME: _Memo Style"
-msgstr "FIXME: V slogu zabele¾ka"
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/dialogs/task-editor.c:232 calendar/gui/event-editor.c:1185
-msgid "FIXME: Define Print _Styles..."
-msgstr "FIXME: Doloèi sloge tiskanja..."
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/dialogs/task-editor.c:239 calendar/gui/event-editor.c:1192
-msgid "FIXME: S_end"
-msgstr "FIXME: Po¹lji"
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/dialogs/task-editor.c:243 calendar/gui/event-editor.c:1196
-msgid "FIXME: Save Attac_hments..."
-msgstr "FIXME: Dodaj prilogo..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "_Zbri¹i"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/dialogs/task-editor.c:246 calendar/gui/event-editor.c:1199
-msgid "FIXME: _Move to Folder..."
-msgstr "FIXME: Prestavi v mapo..."
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/dialogs/task-editor.c:247 calendar/gui/event-editor.c:1200
-msgid "FIXME: Cop_y to Folder..."
-msgstr "FIXME: Kopiraj v mapo..."
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/dialogs/task-editor.c:249 calendar/gui/event-editor.c:1202
-msgid "Page Set_up"
-msgstr "Nastavitev _strani"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/dialogs/task-editor.c:250 calendar/gui/event-editor.c:1203
-msgid "FIXME: Print Pre_view"
-msgstr "FIXME: Predogled tiskanja"
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/dialogs/task-editor.c:271 calendar/gui/event-editor.c:1224
-msgid "FIXME: Paste _Special..."
-msgstr "FIXME: Prilepi _posebno..."
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/dialogs/task-editor.c:276 calendar/gui/event-editor.c:1229
-msgid "FIXME: Mark as U_nread"
-msgstr "FIXME: Oznaèi kot _neprebrano"
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/dialogs/task-editor.c:280 calendar/gui/event-editor.c:1233
-msgid "_Object"
-msgstr "_Zadeva"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/dialogs/task-editor.c:285
-#: calendar/gui/dialogs/task-editor.c:293 calendar/gui/event-editor.c:1238
-#: calendar/gui/event-editor.c:1245
-msgid "FIXME: _Item"
-msgstr "FIXME: _Predmet"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/dialogs/task-editor.c:286
-#: calendar/gui/dialogs/task-editor.c:294 calendar/gui/event-editor.c:1239
-#: calendar/gui/event-editor.c:1246
-msgid "FIXME: _Unread Item"
-msgstr "FIXME: _Neprebran predmet"
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/dialogs/task-editor.c:288 calendar/gui/event-editor.c:1240
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr "FIXME: P_rvi predmet v mapi"
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/dialogs/task-editor.c:296 calendar/gui/event-editor.c:1247
-msgid "FIXME: _Last Item in Folder"
-msgstr "FIXME: _Zadnji predmet v mapi"
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/dialogs/task-editor.c:301 calendar/gui/event-editor.c:1252
-msgid "FIXME: _Standard"
-msgstr "FIXME: _Obièajno"
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/dialogs/task-editor.c:303 calendar/gui/event-editor.c:1254
-msgid "FIXME: __Formatting"
-msgstr "FIXME: __Oblikovanje"
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/dialogs/task-editor.c:306 calendar/gui/event-editor.c:1257
-msgid "FIXME: _Customize..."
-msgstr "FIXME: _Po meri..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/dialogs/task-editor.c:311 calendar/gui/event-editor.c:1262
-msgid "Pre_vious"
-msgstr "P_rej¹nji"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/dialogs/task-editor.c:312 calendar/gui/event-editor.c:1263
-msgid "Ne_xt"
-msgstr "_Naslednji"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/dialogs/task-editor.c:314 calendar/gui/event-editor.c:1267
-msgid "_Toolbars"
-msgstr "_Orodjarne"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/dialogs/task-editor.c:319 calendar/gui/event-editor.c:1272
-msgid "FIXME: _File..."
-msgstr "FIXME: _Datoteka..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/dialogs/task-editor.c:320 calendar/gui/event-editor.c:1273
-msgid "FIXME: It_em..."
-msgstr "FIXME: Pr_edmet..."
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/dialogs/task-editor.c:321 calendar/gui/event-editor.c:1274
-msgid "FIXME: _Object..."
-msgstr "FIXME: _Zadeva..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/dialogs/task-editor.c:326 calendar/gui/event-editor.c:1279
-msgid "FIXME: _Font..."
-msgstr "FIXME: _Pisava..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/dialogs/task-editor.c:327 calendar/gui/event-editor.c:1280
-msgid "FIXME: _Paragraph..."
-msgstr "FIXME: _Odstavek..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/dialogs/task-editor.c:334 calendar/gui/event-editor.c:1287
-msgid "FIXME: Desi_gn This Form"
-msgstr "FIXME: Obli_kuj ta obrazec"
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/dialogs/task-editor.c:335 calendar/gui/event-editor.c:1288
-msgid "FIXME: D_esign a Form..."
-msgstr "FIXME: _Oblikuj obrazec..."
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/dialogs/task-editor.c:337 calendar/gui/event-editor.c:1290
-msgid "FIXME: Publish _Form..."
-msgstr "FIXME: Ob_javi obrazec..."
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/dialogs/task-editor.c:338 calendar/gui/event-editor.c:1291
-msgid "FIXME: Pu_blish Form As..."
-msgstr "FIXME: O_bjavi obrazec kot..."
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/dialogs/task-editor.c:340 calendar/gui/event-editor.c:1293
-msgid "FIXME: Script _Debugger"
-msgstr "FIXME: Razhro¹èevalnik skript"
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/dialogs/task-editor.c:345 calendar/gui/event-editor.c:1298
-msgid "FIXME: _Spelling..."
-msgstr "FIXME: _Èrkovanje..."
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/dialogs/task-editor.c:350 calendar/gui/event-editor.c:1303
-msgid "_Forms"
-msgstr "_Obrazci"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "FIXME: _Nov stik"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr "FIXME: Nov _stik iz istega podjetja"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr "FIXME: Novo _pismo za stik"
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr "FIXME: Novo sporoèilo za stik"
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr "FIXME: Nov sestanek s stikom"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr "FIXME: _Naèrtuj sestanek..."
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr "FIXME: Nova na_loga za stik"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr "FIXME: Nov vpis v _dnevnik za stik"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr "FIXME: _Zastavica za nadaljevanje..."
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr "FIXME: _Poka¾i zemljevid naslova"
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr "FIXME: _Odpri spletno stran"
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr "FIXME: Posreduj naprej kot _vVizitko"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/dialogs/task-editor.c:367 calendar/gui/event-editor.c:1316
-msgid "FIXME: For_ward"
-msgstr "FIXME: _Posreduj naprej"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/dialogs/task-editor.c:380 calendar/gui/event-editor.c:1329
-msgid "_Insert"
-msgstr "Vstavi"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/dialogs/task-editor.c:381 calendar/gui/event-editor.c:1330
-msgid "F_ormat"
-msgstr "O_blikuj izpis"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/dialogs/task-editor.c:382 calendar/gui/event-editor.c:1331
-#: shell/e-shell-view-menu.c:513
-msgid "_Tools"
-msgstr "_Orodja"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/dialogs/task-editor.c:383 calendar/gui/event-editor.c:1332
-msgid "Actio_ns"
-msgstr "_Dejanja"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "Shrani in zapri"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1371
-msgid "Save the appointment and close the dialog box"
-msgstr "Shrani zmenek in zapri dialog"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:687
-msgid "Print..."
-msgstr "Natisni..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/dialogs/task-editor.c:415 calendar/gui/event-editor.c:1376
-msgid "Print this item"
-msgstr "Natisni ta predmet"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/dialogs/task-editor.c:416 calendar/gui/event-editor.c:1377
-msgid "FIXME: Insert File..."
-msgstr "FIXME: Vstavi datoteko..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/dialogs/task-editor.c:417 calendar/gui/event-editor.c:1378
-msgid "Insert a file as an attachment"
-msgstr "Vstavi datoteko kot prilogo"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/gui/component/addressbook.c:427
-#: calendar/gui/e-calendar-table.c:375
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:508
-#: mail/folder-browser-factory.c:40 mail/mail-config.glade.h:13
-#: mail/mail-config.glade.h:18 mail/mail-config.glade.h:24
-msgid "Delete"
-msgstr "Zbri¹i"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/dialogs/task-editor.c:426 calendar/gui/event-editor.c:1387
-#: calendar/gui/gncal-todo.c:336
-msgid "Delete this item"
-msgstr "Zbri¹i ta predmet"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/dialogs/task-editor.c:428 calendar/gui/event-editor.c:1389
-msgid "FIXME: Previous"
-msgstr "FIXME: Prej¹nji"
-
-#: addressbook/contact-editor/e-contact-editor.c:858
-#: calendar/gui/dialogs/task-editor.c:429 calendar/gui/event-editor.c:1390
-msgid "Go to the previous item"
-msgstr "Pojdi na prej¹nji predmet"
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/dialogs/task-editor.c:430 calendar/gui/event-editor.c:1391
-msgid "FIXME: Next"
-msgstr "FIXME: Naslednji"
-
-#: addressbook/contact-editor/e-contact-editor.c:861
-#: calendar/gui/dialogs/task-editor.c:431 calendar/gui/event-editor.c:1392
-msgid "Go to the next item"
-msgstr "Pojdi na naslednji predmet"
-
-#: addressbook/contact-editor/e-contact-editor.c:864
-#: calendar/gui/dialogs/task-editor.c:432 calendar/gui/event-editor.c:1393
-msgid "FIXME: Help"
-msgstr "FIXME: Pomoè"
-
-#: addressbook/contact-editor/e-contact-editor.c:865
-#: calendar/gui/dialogs/task-editor.c:433 calendar/gui/event-editor.c:1394
-msgid "See online help"
-msgstr "Glej pomoè na liniji"
-
-#: addressbook/contact-editor/e-contact-editor.c:1320
-msgid "Assistant"
-msgstr "Pomoènik"
-
-#: addressbook/contact-editor/e-contact-editor.c:1321
-#: addressbook/contact-editor/e-contact-editor.c:1425
-msgid "Business"
-msgstr "Slu¾ba"
-
-#: addressbook/contact-editor/e-contact-editor.c:1322
-msgid "Business 2"
-msgstr "Slu¾ba"
-
-#: addressbook/contact-editor/e-contact-editor.c:1323
-msgid "Business Fax"
-msgstr "Slu¾beni faks"
-
-#: addressbook/contact-editor/e-contact-editor.c:1324
-msgid "Callback"
-msgstr "Povratni klic"
-
-#: addressbook/contact-editor/e-contact-editor.c:1325
-msgid "Car"
-msgstr "Avto"
-
-#: addressbook/contact-editor/e-contact-editor.c:1326
-msgid "Company"
-msgstr "Podjetje"
-
-#: addressbook/contact-editor/e-contact-editor.c:1327
-#: addressbook/contact-editor/e-contact-editor.c:1426
-msgid "Home"
-msgstr "Doma"
-
-#: addressbook/contact-editor/e-contact-editor.c:1328
-msgid "Home 2"
-msgstr "Doma 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1329
-msgid "Home Fax"
-msgstr "Domaèi faks"
-
-#: addressbook/contact-editor/e-contact-editor.c:1330
-msgid "ISDN"
-msgstr "ISDN"
-
-#: addressbook/contact-editor/e-contact-editor.c:1331
-msgid "Mobile"
-msgstr "Prenosni telefon"
-
-#: addressbook/contact-editor/e-contact-editor.c:1332
-#: addressbook/contact-editor/e-contact-editor.c:1427
-#: mail/mail-config.glade.h:27
-msgid "Other"
-msgstr "Drugo"
-
-#: addressbook/contact-editor/e-contact-editor.c:1333
-msgid "Other Fax"
-msgstr "Drugi faks"
-
-#: addressbook/contact-editor/e-contact-editor.c:1334
-msgid "Pager"
-msgstr "Pozivnik"
-
-#: addressbook/contact-editor/e-contact-editor.c:1335
-msgid "Primary"
-msgstr "Prvi"
-
-#: addressbook/contact-editor/e-contact-editor.c:1336
-msgid "Radio"
-msgstr "Radijo"
-
-#: addressbook/contact-editor/e-contact-editor.c:1337
-msgid "Telex"
-msgstr "Teleks"
-
-#: addressbook/contact-editor/e-contact-editor.c:1338
-msgid "TTY/TDD"
-msgstr "TTY/TDD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1382
-msgid "Primary Email"
-msgstr "prvi e-naslov"
-
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Email 2"
-msgstr "E-naslov 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Email 3"
-msgstr "E-naslov 3"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:7
-msgid ""
-"Are you sure you want\n"
-"to delete this contact?"
-msgstr ""
-"Ste preprièani, da \n"
-"¾elite izbrisati ta stik?"
-
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:9
-msgid "Delete Contact?"
-msgstr "Zbri¹i stik?"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "_Dodaj"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "Tipi telefonov"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "Nov tip telefona"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91 mail/mail-config.glade.h:11
-#: mail/mail-config.glade.h:16 mail/mail-config.glade.h:22
-msgid "Add"
-msgstr "Dodaj"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "Urejevalnik stikov"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "_Polno Ime..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "Zavedi kot:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Naslov spletne strani:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "®eli dobivati _HTML e-po¹to"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Naslov:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "_Slu¾beni"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "_Domaè"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "Slu¾beni _faks"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "_Prenosni telefon"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "V sl_u¾bi"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "_To je po¹tni naslov"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "_Stiki..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:26
-msgid "Ca_tegories..."
-msgstr "Ka_tegorije..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr "Slu¾beni _naziv:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "_Podjetje:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:18
-msgid "General"
-msgstr "Splo¹no"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "O_ddelek:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "Pi_sarna:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "_Poklic:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "_Vzdevek:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr "_Partner(ka):"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "_Rojstni dan:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr "_Ime pomoènika:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "Ime _managerja:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "Ob_letnica:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "Opom_be:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:33
-msgid "Details"
-msgstr "Podrobnosti"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "Preveri polno ime"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "_Naziv:"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "_Ime:"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "_Drugo ime:"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "_Priimek:"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "P_ripona:"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"G.\n"
-"G.\n"
-"Dr.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"St.\n"
-"Ml.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-
-#: addressbook/gui/component/addressbook.c:421
-#: calendar/gui/calendar-commands.c:552
-msgid "New"
-msgstr "Nov"
-
-#: addressbook/gui/component/addressbook.c:421
-msgid "Create a new contact"
-msgstr "Ustvari nov stik"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Find"
-msgstr "Poi¹èi"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Find a contact"
-msgstr "Poi¹èi stik"
-
-#: addressbook/gui/component/addressbook.c:426
-#: calendar/gui/calendar-commands.c:556 mail/folder-browser-factory.c:38
-msgid "Print"
-msgstr "Natisni"
-
-#: addressbook/gui/component/addressbook.c:426
-msgid "Print contacts"
-msgstr "Natisni stike"
-
-#: addressbook/gui/component/addressbook.c:427
-msgid "Delete a contact"
-msgstr "Zbri¹i stik"
-
-#: addressbook/gui/component/addressbook.c:495
-msgid "_Print Contacts..."
-msgstr "_Natisni stike..."
-
-#: addressbook/gui/component/addressbook.c:505
-#: addressbook/gui/component/addressbook.c:1044
-msgid "As _Table"
-msgstr "Kot tabelo"
-
-#: addressbook/gui/component/addressbook.c:512
-msgid "_New Contact"
-msgstr "_Nov stik"
-
-#: addressbook/gui/component/addressbook.c:520
-msgid "N_ew Directory Server"
-msgstr "N_ov stre¾nik imenikov"
-
-#: addressbook/gui/component/addressbook.c:603
-msgid "Unable to open addressbook"
-msgstr "Kliknite tu za odprtje adresarja"
-
-#: addressbook/gui/component/addressbook.c:608
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-"Adresarja ni bilo mogoèe odpreti. To lahko pomeni ali\n"
-"da ste vnesli napaèen URI, ali pa posku¹ali dostopati \n"
-"do LDAP stre¾nika brez prevedene LDAP podpore. Èe ste \n"
-"vnesli URI, preverite njegovo pravilnost in ga znova \n"
-"vnesite. Èe ne, ste verjetno posku¹ali dostopati do LDAP \n"
-"stre¾nika. Èe ¾elite dostopati do LDAP morate nalo¾iti in \n"
-"namestiti OpenLDAP in ponovno prevesti in namestiti evolution. \n"
-
-#: addressbook/gui/component/addressbook.c:948
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr "Shrani kot vVizitko"
-
-#: addressbook/gui/component/addressbook.c:1015
-msgid "* Click here to add a contact *"
-msgstr "* Kliknite tu za dodajo stika *"
-
-#: addressbook/gui/component/addressbook.c:1051
-msgid "As _Minicards"
-msgstr "Kot _minivizitke"
-
-#: addressbook/gui/component/addressbook.c:1102
-msgid "The URI that the Folder Browser will display"
-msgstr "URI, ki naj ga prika¾e brskalnik map"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "okno2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "k"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#: addressbook/gui/component/e-ldap-storage.c:87
-msgid "External Directories"
-msgstr "Zunanji imeniki"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "Opis:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "LDAP stre¾nik:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "©tevilka vrat:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr "Korenski DN:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Ime:"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"V tem pogledu ni predmetov za prikaz\n"
-"\n"
-"Èe ¾elite ustvariti nov stik, dvojno kliknite tu.."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "Nastavitev strani:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Ime stila:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "Predogled:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "Mo¾nosti"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Vkljuèi:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "Sekcije:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr "Si sledijo takoj"
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr "Uhlji èrk ob strani"
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "Zaglavja za vsako èrko"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "Zaèni na novi strani"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "©tevilo stolpcev:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "Prazni obrazci na koncu:"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "Pisave"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "Pisava..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "Zaglavja"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 pik Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "Telo"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 pik Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "Senèenje"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "Tiskaj z uporabo sivinskega senèenja"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "Oblika izpisa"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Papir"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Tip:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr "oznaèba26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Mere:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "©irina:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Vi¹ina:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "Izvor papirja:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "Robovi"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Zgoraj:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Spodaj:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Levo:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Desno:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "Stran"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Velikost:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Usmerjenost"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "Pokonèno"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "Le¾eèe"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "Glava"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "Noga:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "Obratno na sodih straneh"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "Glava/noga"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:544
-msgid "am"
-msgstr "dop"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:543
-msgid "pm"
-msgstr "pop"
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr "Obroba:"
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr "Zaglavja:"
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr "Prazni dnevi:"
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Appointments:"
-msgstr "Zmenki:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr "Osvetljen dan:"
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr "©tevilke dni:"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr "©tevilka trenutnega dne:"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr "Predmet za-opravit, ki ¹e ni na vrsti:"
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr "Predmet za-opravit, ki je na vrsti danes:"
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr "Predmet za-opravit, ki je ¾e pretekel:"
-
-#: calendar/gui/calendar-commands.c:172
-msgid "Gnome Calendar"
-msgstr "Gnome Koledar"
-
-#: calendar/gui/calendar-commands.c:175
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "Gnome osebni koledar in urnik."
-
-#: calendar/gui/calendar-commands.c:442
-msgid "File not found"
-msgstr "Datoteke ni mogoèe najti"
-
-#: calendar/gui/calendar-commands.c:464
-msgid "Open calendar"
-msgstr "Odpri koledar"
-
-#: calendar/gui/calendar-commands.c:503
-msgid "Save calendar"
-msgstr "Shrani koledar"
-
-#: calendar/gui/calendar-commands.c:530 calendar/gui/gncal-todo.c:722
-#: calendar/gui/gncal-todo.c:726
-msgid "Day"
-msgstr "Dan"
-
-#: calendar/gui/calendar-commands.c:530
-msgid "Show 1 day"
-msgstr "Ka¾i en dan"
-
-#: calendar/gui/calendar-commands.c:533
-msgid "5 Days"
-msgstr "5 dni"
-
-#: calendar/gui/calendar-commands.c:533
-msgid "Show the working week"
-msgstr "Poka¾i delavni teden"
-
-#: calendar/gui/calendar-commands.c:536 calendar/gui/gncal-todo.c:721
-msgid "Week"
-msgstr "Teden"
-
-#: calendar/gui/calendar-commands.c:536
-msgid "Show 1 week"
-msgstr "Ka¾i en teden"
-
-#: calendar/gui/calendar-commands.c:539
-msgid "Month"
-msgstr "Mesec"
-
-#: calendar/gui/calendar-commands.c:539
-msgid "Show 1 month"
-msgstr "Ka¾i en mesec"
-
-#: calendar/gui/calendar-commands.c:543
-msgid "Year"
-msgstr "Leto"
-
-#: calendar/gui/calendar-commands.c:543
-msgid "Show 1 year"
-msgstr "Poka¾e vrstico z mapami"
-
-#: calendar/gui/calendar-commands.c:552 calendar/gui/calendar-commands.c:696
-msgid "Create a new appointment"
-msgstr "Ustvari nov zmenek"
-
-#: calendar/gui/calendar-commands.c:556 calendar/gui/calendar-commands.c:688
-msgid "Print this calendar"
-msgstr "Natisni ta koledar"
-
-#: calendar/gui/calendar-commands.c:560
-msgid "Prev"
-msgstr "Nazaj"
-
-#: calendar/gui/calendar-commands.c:560
-msgid "Go back in time"
-msgstr "Pojdi po èasu nazaj"
-
-#: calendar/gui/calendar-commands.c:561
-msgid "Today"
-msgstr "Danes"
-
-#: calendar/gui/calendar-commands.c:561
-msgid "Go to present time"
-msgstr "Pojdi na sedanjost"
-
-#: calendar/gui/calendar-commands.c:562
-msgid "Next"
-msgstr "Naprej"
-
-#: calendar/gui/calendar-commands.c:562
-msgid "Go forward in time"
-msgstr "Pojdi po èasu naprej"
-
-#: calendar/gui/calendar-commands.c:566
-msgid "Go to"
-msgstr "Pojdi na"
-
-#: calendar/gui/calendar-commands.c:566
-msgid "Go to a specific date"
-msgstr "Pojdi na doloèen datum"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:673
-msgid "New Ca_lendar"
-msgstr "Nov Ko_ledar"
-
-#: calendar/gui/calendar-commands.c:674
-msgid "Create a new calendar"
-msgstr "Ustvari nov koledar"
-
-#: calendar/gui/calendar-commands.c:677
-msgid "Open Ca_lendar"
-msgstr "Odpri ko_ledar"
-
-#: calendar/gui/calendar-commands.c:678
-msgid "Open a calendar"
-msgstr "Odpri koledar"
-
-#: calendar/gui/calendar-commands.c:682 calendar/gui/calendar-commands.c:683
-msgid "Save Calendar As"
-msgstr "Shrani koledar kot"
-
-#: calendar/gui/calendar-commands.c:696
-msgid "_New appointment..."
-msgstr "_Nov zmenek..."
-
-#: calendar/gui/calendar-commands.c:701
-msgid "New appointment for _today..."
-msgstr "Nov zmenek za _danes..."
-
-#: calendar/gui/calendar-commands.c:702
-msgid "Create a new appointment for today"
-msgstr "Ustvari nov zmenek za danes"
-
-#: calendar/gui/calendar-commands.c:710 calendar/gui/prop.c:716
-msgid "Preferences"
-msgstr "Nastavitve"
-
-#: calendar/gui/calendar-commands.c:717 calendar/gui/calendar-commands.c:718
-msgid "About Calendar"
-msgstr "Uporaba _koledarja"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:760
-#, c-format
-msgid "%s%s"
-msgstr "%s%s"
-
-#: calendar/gui/calendar-commands.c:760
-msgid "'s calendar"
-msgstr " koledar"
-
-#: calendar/gui/calendar-model.c:452
-#, c-format
-msgid ""
-"The date must be entered in the format: \n"
-"\n"
-"%s"
-msgstr ""
-"Datum mora biti vpisan v obliki: \n"
-"\n"
-"%s"
-
-#: calendar/gui/calendar-model.c:525
-msgid ""
-"The geographical position must be entered in the format: \n"
-"\n"
-"45.436845,125.862501"
-msgstr ""
-"Zemljepisna lega mora biti vpisana v obliki: \n"
-"\n"
-"45.436845,125.862501"
-
-#: calendar/gui/calendar-model.c:570
-msgid "The percent value must be between 0 and 100"
-msgstr "Vrednost v procentih mora biti med 0 in 100"
-
-#: calendar/gui/calendar-model.c:603
-msgid "The priority must be between 0 and 10"
-msgstr "Prioriteta mora biti med 0 in 10"
-
-#: calendar/gui/control-factory.c:136
-msgid "The URI that the calendar will display"
-msgstr "URI, ki naj ga prika¾e brskalnik map"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:183
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "Alarm na %A %d %b %Y ob %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:190
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr "Obvestilo o va¹em zmenku na %A %d %b %Y ob %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:201
-msgid "No summary available."
-msgstr "Povzetek ni na voljo."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "Zapri"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1070
-msgid "Snooze"
-msgstr "Podalj¹ek spanja"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "Uredi zmenek"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr "Èas podalj¹ka spanja (minut)"
-
-#: calendar/gui/dialogs/task-editor.c:245 calendar/gui/event-editor.c:1198
-msgid "FIXME: _Delete"
-msgstr "FIXME: _Zbri¹i"
-
-#: calendar/gui/dialogs/task-editor.c:287
-#: calendar/gui/dialogs/task-editor.c:295
-msgid "FIXME: In_complete Task"
-msgstr "FIXME: Do_konèana naloga"
-
-#: calendar/gui/dialogs/task-editor.c:347 calendar/gui/event-editor.c:1300
-msgid "FIXME: Chec_k Names"
-msgstr "FIXME: Preve_ri imena"
-
-#: calendar/gui/dialogs/task-editor.c:348 calendar/gui/event-editor.c:1301
-msgid "FIXME: Address _Book..."
-msgstr "FIXME: A_dresar..."
-
-#: calendar/gui/dialogs/task-editor.c:355
-msgid "FIXME: _New Task"
-msgstr "FIXME: _Nova naloga"
-
-#: calendar/gui/dialogs/task-editor.c:357
-msgid "FIXME: S_end Status Report"
-msgstr "FIXME: Po¹lji poroèilo stanja"
-
-#: calendar/gui/dialogs/task-editor.c:358
-msgid "FIXME: _Mark Complete"
-msgstr "FIXME: _Oznaèi kot dokonèano"
-
-#: calendar/gui/dialogs/task-editor.c:360 calendar/gui/event-editor.c:1310
-msgid "FIXME: Rec_urrence..."
-msgstr "FIXME: Ponovitve..."
-
-#: calendar/gui/dialogs/task-editor.c:361
-msgid "FIXME: S_kip Occurrence"
-msgstr "FIXME: Preskoèi ponovitev"
-
-#: calendar/gui/dialogs/task-editor.c:363
-msgid "FIXME: Assig_n Task"
-msgstr "FIXME: Dodali _nalogo"
-
-#: calendar/gui/dialogs/task-editor.c:365
-msgid "FIXME: _Reply"
-msgstr "FIXME: _Odgovori"
-
-#: calendar/gui/dialogs/task-editor.c:366
-msgid "FIXME: Reply to A_ll"
-msgstr "FIXME: Odgovori v_sem"
-
-#: calendar/gui/dialogs/task-editor.c:409 calendar/gui/event-editor.c:1370
-msgid "FIXME: Save and Close"
-msgstr "FIXME: Shrani in zapri"
-
-#: calendar/gui/dialogs/task-editor.c:410
-msgid "Save the task and close the dialog box"
-msgstr "Shrani nalogo in zapri dialog"
-
-#: calendar/gui/dialogs/task-editor.c:414 calendar/gui/event-editor.c:1375
-msgid "FIXME: Print..."
-msgstr "FIXME: Natisni..."
-
-#: calendar/gui/dialogs/task-editor.c:419 calendar/gui/event-editor.c:1380
-msgid "FIXME: Recurrence..."
-msgstr "FIXME: Ponovitev..."
-
-#: calendar/gui/dialogs/task-editor.c:420 calendar/gui/event-editor.c:1381
-msgid "Configure recurrence rules"
-msgstr "Nastavi pravila ponovitev"
-
-#: calendar/gui/dialogs/task-editor.c:422
-msgid "FIXME: Assign Task..."
-msgstr "FIXME: _Dodeli nalogo..."
-
-#: calendar/gui/dialogs/task-editor.c:423
-msgid "Assign the task to someone"
-msgstr "Nekomu dodeli nalogo"
-
-#: calendar/gui/dialogs/task-editor.c:425 calendar/gui/event-editor.c:1386
-msgid "FIXME: Delete"
-msgstr "FIXME: Zbri¹i"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:7
-msgid "S_ubject:"
-msgstr "Z_adeva:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:8
-msgid "Owner:"
-msgstr "Lastnik:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:9
-msgid "Sta_rt Date:"
-msgstr "Datum _prièetka"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:10
-msgid "_Due Date:"
-msgstr "_Do datuma:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:11
-msgid "_Status:"
-msgstr "_Stanje:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:12
-msgid ""
-"Not Started\n"
-"In Progress\n"
-"Completed\n"
-"Cancelled\n"
-msgstr ""
-"Ni prièeto\n"
-"V delu\n"
-"Konèano\n"
-"Zavrnjeno\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:17
-msgid "Not Started"
-msgstr "Ni prièeto"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:18
-msgid "_Priority:"
-msgstr "_Prioriteta:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:19
-msgid ""
-"High\n"
-"Normal\n"
-"Low\n"
-msgstr ""
-"Visoka\n"
-"Obièajna\n"
-"Nizka\n"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:23
-msgid "High"
-msgstr "Visoka"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:24
-msgid "% Comp_lete:"
-msgstr "% konèa_no"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:25
-msgid "_Contacts..."
-msgstr "_Stiki..."
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:27
-msgid "Private"
-msgstr "Osebno"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:28
-msgid "Task"
-msgstr "Naloga"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:29
-msgid "Date Completed:"
-msgstr "Konèano dne:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:30
-msgid "Location:"
-msgstr "Kraj:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:31
-msgid "URL:"
-msgstr "URL:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:32
-msgid "Resources:"
-msgstr "Viri:"
-
-#: calendar/gui/e-calendar-table.c:189
-msgid "Comment"
-msgstr "Komentar"
-
-#: calendar/gui/e-calendar-table.c:194
-msgid "Completed"
-msgstr "Konèano"
-
-#: calendar/gui/e-calendar-table.c:199
-msgid "Created"
-msgstr "Ustvarjeno"
-
-#: calendar/gui/e-calendar-table.c:204
-msgid "Description"
-msgstr "Opis"
-
-#: calendar/gui/e-calendar-table.c:209
-msgid "Timestamp"
-msgstr "Èasovni ¾ig"
-
-#: calendar/gui/e-calendar-table.c:214
-msgid "Start Date"
-msgstr "Datum prièetka"
-
-#: calendar/gui/e-calendar-table.c:219
-msgid "End Date"
-msgstr "Datum konca"
-
-#: calendar/gui/e-calendar-table.c:224
-msgid "Geographical Position"
-msgstr "Zemljepisna lega"
-
-#: calendar/gui/e-calendar-table.c:229
-msgid "Last Modification Date"
-msgstr "Datum zadnje spremembe"
-
-#: calendar/gui/e-calendar-table.c:234
-msgid "Location"
-msgstr "Lega"
-
-#: calendar/gui/e-calendar-table.c:239
-msgid "Organizer"
-msgstr "Organizator"
-
-#: calendar/gui/e-calendar-table.c:244
-msgid "% Complete"
-msgstr "% konèano"
-
-#: calendar/gui/e-calendar-table.c:249 calendar/gui/gncal-todo.c:436
-#: calendar/gui/prop.c:609 mail/message-list.c:503
-msgid "Priority"
-msgstr "Prioriteta"
-
-#: calendar/gui/e-calendar-table.c:260
-msgid "TaskPad"
-msgstr "Naloge"
-
-#: calendar/gui/e-calendar-table.c:265
-msgid "URL"
-msgstr "URL"
-
-#: calendar/gui/e-calendar-table.c:270
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "Reminder"
-msgstr "Opozorilo"
-
-#: calendar/gui/e-calendar-table.c:369
-msgid "Open..."
-msgstr "Odpri..."
-
-#: calendar/gui/e-calendar-table.c:370
-msgid "Open the task"
-msgstr "Odpri nalogo"
-
-#: calendar/gui/e-calendar-table.c:372
-msgid "Mark Complete"
-msgstr "Oznaèi kot opravljeno"
-
-#: calendar/gui/e-calendar-table.c:373
-msgid "Mark the task complete"
-msgstr "Oznaèi nalogo kot opravljeno"
-
-#: calendar/gui/e-calendar-table.c:376
-msgid "Delete the task"
-msgstr "Zbri¹i nalogo"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr "%02i deljenj minute"
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "Nov zmenek..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "Uredi ta zmenek..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "Zbri¹i ta zmenek"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "Naredi zmenek prestavljiv"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr "Zbri¹i to pojavitev"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr "Zbri¹i vse pojavitve"
-
-#: calendar/gui/event-editor.c:291
-msgid "Edit Appointment"
-msgstr "Uredi zmenek"
-
-#: calendar/gui/event-editor.c:296
-msgid "No summary"
-msgstr "Ni povzetka"
-
-#: calendar/gui/event-editor.c:300
-#, c-format
-msgid "Appointment - %s"
-msgstr "Zmenek - %s"
-
-#: calendar/gui/event-editor.c:303
-#, c-format
-msgid "Task - %s"
-msgstr "Naloga - %s"
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Journal entry - %s"
-msgstr "Vpis v dnevniku - %s"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:622 calendar/gui/event-editor.c:718
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Ca_lendar..."
-msgstr "FIXME: Ko_kedar..."
-
-#: calendar/gui/event-editor.c:1308
-msgid "FIXME: _New Appointment"
-msgstr "FIXME: _Nov zmenek"
-
-#: calendar/gui/event-editor.c:1312
-msgid "FIXME: Invite _Attendees..."
-msgstr "FIXME: Povabi udele¾ence..."
-
-#: calendar/gui/event-editor.c:1313
-msgid "FIXME: C_ancel Invitation..."
-msgstr "FIXME: Preklièi povabilo..."
-
-#: calendar/gui/event-editor.c:1315
-msgid "FIXME: Forward as v_Calendar"
-msgstr "FIXME: Posreduj naprej kot v_Koledar"
-
-#: calendar/gui/event-editor.c:1383
-msgid "FIXME: Invite Attendees..."
-msgstr "FIXME: Povabi udele¾ence..."
-
-#: calendar/gui/event-editor.c:1384
-msgid "Invite attendees to a meeting"
-msgstr "Povabi udele¾ence na sestanek"
-
-#: calendar/gui/event-editor.c:1828
-msgid "%a %b %d %Y"
-msgstr "%a %d %b %Y"
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr "dialog-urejevalec-dogodkov"
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr "_Povzetek:"
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr "_Lastnik:"
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr "Èas"
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr "Èas prièetka:"
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr "Èas konca"
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr "_Celodnevni dogodek"
-
-#: calendar/gui/event-editor-dialog.glade.h:14
-msgid "Classification"
-msgstr "Uvrstitev"
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-msgid "Pu_blic"
-msgstr "_Javno"
-
-#: calendar/gui/event-editor-dialog.glade.h:16
-msgid "Pri_vate"
-msgstr "Pri_vatno"
-
-#: calendar/gui/event-editor-dialog.glade.h:17
-msgid "_Confidential"
-msgstr "_Zaupno"
-
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-"Minut\n"
-"Ur\n"
-"Dni\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "_Display"
-msgstr "_Prikaz"
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-msgid "_Audio"
-msgstr "_Zvok"
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "_Program"
-msgstr "_Program"
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-msgid "_Mail"
-msgstr "_Po¹lji po¹to"
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-msgid "Mail _to:"
-msgstr "Po¹lji po¹to _za:"
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Run program:"
-msgstr "_Po¾eni program:"
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr "Pravilo ponovitev"
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:736
-msgid "None"
-msgstr "Brez"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-msgid "Daily"
-msgstr "Dnevne"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr "Tedenske"
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr "Meseène"
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr "Letne"
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-msgid "label23"
-msgstr "label23"
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr "Vsak "
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr "dan"
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-msgid "label24"
-msgstr "label24"
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr "teden"
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "pon"
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "tor"
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "sre"
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "èet"
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "pet"
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "sob"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "ned"
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-msgid "label25"
-msgstr "label25"
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr "Ponovitev na"
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr "dan v mesecu"
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-"1.\n"
-"2.\n"
-"3.\n"
-"4.\n"
-"5.\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-"Ponedeljek\n"
-"Torek\n"
-"Sreda\n"
-"Èetrtek\n"
-"Petek\n"
-"Sobota\n"
-"Nedelja\n"
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr "Vsak"
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-msgid "month(s)"
-msgstr "mesec"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr "leto"
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-msgid "label27"
-msgstr "oznaka27"
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr "Datum zakljuèka"
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr "Vseskozi ponavljal"
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr "Konèa se na "
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr "Konèaj po"
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr "pojavitvah"
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-msgid "Exceptions"
-msgstr "Izjeme"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-msgid "Change"
-msgstr "Spremeni"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr "Ponovitev"
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "januar"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "februar"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "marec"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "april"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "maj"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "junij"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "julij"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "avgust"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "september"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "sept"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "oktober"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "november"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "december"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "nedelja"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "ponedeljek"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "torek"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "tor"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "sreda"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "sre"
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "èetrtek"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "èet"
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "èet"
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "petek"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "sobota"
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr "leto"
-
-#: calendar/gui/getdate.y:421
-msgid "month"
-msgstr "mesec"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr "¹tirinajst dni"
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr "teden"
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr "dan"
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr "ura"
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr "minuta"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "min"
-
-#: calendar/gui/getdate.y:428
-msgid "second"
-msgstr "sekunda"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "sek"
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "jutri"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "vèeraj"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "danes"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr "sedaj"
-
-#: calendar/gui/getdate.y:439
-msgid "last"
-msgstr "zadnji"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr "ta"
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr "naslednji"
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr "prvi"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr "tretji"
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr "èetrti"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr "peti"
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr "¹esti"
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr "sedmi"
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr "osmi"
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr "deveti"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr "deseti"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr "enajsti"
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr "dvanajsti"
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr "nazaj"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Create to-do item"
-msgstr "Ustvari predmet za-opravit"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Edit to-do item"
-msgstr "Uredi predemet za-opravit"
-
-#: calendar/gui/gncal-todo.c:176
-msgid "Summary:"
-msgstr "Povzetek:"
-
-#: calendar/gui/gncal-todo.c:186
-msgid "Due Date:"
-msgstr "Do datuma:"
-
-#: calendar/gui/gncal-todo.c:195
-msgid "Priority:"
-msgstr "Prioriteta:"
-
-#: calendar/gui/gncal-todo.c:212
-msgid "Item Comments:"
-msgstr "Komentarji predmeta:"
-
-#: calendar/gui/gncal-todo.c:334
-msgid "Add to-do item..."
-msgstr "Dodaj predmet za-opravit..."
-
-#: calendar/gui/gncal-todo.c:335
-msgid "Edit this item..."
-msgstr "Uredi ta predmet..."
-
-#: calendar/gui/gncal-todo.c:434
-msgid "Summary"
-msgstr "Povzetek"
-
-#: calendar/gui/gncal-todo.c:435 calendar/gui/prop.c:608
-msgid "Due Date"
-msgstr "Do datuma"
-
-#: calendar/gui/gncal-todo.c:437
-msgid "Time Left"
-msgstr "Preostalo èasa"
-
-#. Label
-#: calendar/gui/gncal-todo.c:449
-msgid "To-do list"
-msgstr "Seznam za opravit"
-
-#. Add
-#: calendar/gui/gncal-todo.c:488
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Dodaj..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:497
-msgid "Edit..."
-msgstr "Uredi..."
-
-#: calendar/gui/gncal-todo.c:721
-msgid "Weeks"
-msgstr "Tednov"
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Days"
-msgstr "Dni"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hours"
-msgstr "Ur"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hour"
-msgstr "Ura"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minutes"
-msgstr "Minut"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minute"
-msgstr "Minuta"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Seconds"
-msgstr "Sekund"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Second"
-msgstr "Sekunda"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1078
-#: calendar/gui/gnome-cal.c:1134
-msgid "Reminder of your appointment at "
-msgstr "Opomin na zmenek ob "
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1083 calendar/gui/gnome-cal.c:1138
-msgid "Ok"
-msgstr "V redu"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "Leto:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "Pojdi na datum"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-"Prosim izberite datum na katerega hoèete iti.\n"
-"Ko klikente na dan boste samodejno ¹li\n"
-"na ta datum."
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "Pojdi na danes"
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr "1."
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr "2."
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr "3."
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr "4."
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr "5."
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr "6."
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr "7."
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr "8."
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr "9."
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr "10."
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr "11."
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr "12."
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr "13."
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr "14."
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr "15."
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr "16."
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr "17."
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr "18."
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr "19."
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr "20."
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr "21."
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr "22."
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr "23."
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr "24."
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr "25."
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr "26."
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr "27."
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr "28."
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr "29."
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr "30."
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr "31."
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr "ne"
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr "po"
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr "to"
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr "sr"
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr "èe"
-
-#: calendar/gui/print.c:326
-msgid "Fr"
-msgstr "pe"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr "so"
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr "Predmeti za-opravit"
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr "Trenuten dan (%b %a %d %Y)"
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr "%b"
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr "%a"
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "Trenutni teden (%s %s %d - %s %d %d)"
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "Trenutni teden (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "Trenutni teden (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr "Trenutni mesec (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr "Trenutno leto (%Y)"
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr "Natisni _koledar"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr "Predogled tiskanja"
-
-#: calendar/gui/prop.c:334
-msgid "Time display"
-msgstr "Prikaz èasa"
-
-#. Time format
-#: calendar/gui/prop.c:338
-msgid "Time format"
-msgstr "Oblika izpisa èasa"
-
-#: calendar/gui/prop.c:339
-msgid "12-hour (AM/PM)"
-msgstr "12 urna (dop./pop.)"
-
-#: calendar/gui/prop.c:340
-msgid "24-hour"
-msgstr "24 urna"
-
-#. Weeks start on
-#: calendar/gui/prop.c:350
-msgid "Weeks start on"
-msgstr "Tedni se zaènejo v"
-
-#: calendar/gui/prop.c:351
-msgid "Sunday"
-msgstr "nedeljo"
-
-#: calendar/gui/prop.c:352
-msgid "Monday"
-msgstr "ponedeljek"
-
-#. Day range
-#: calendar/gui/prop.c:362
-msgid "Day range"
-msgstr "Razpon dni"
-
-#: calendar/gui/prop.c:373
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-"Prosim izberite ure zaèetka in konca dneva, ki naj\n"
-"bodo prikazane v dnevnem in tedenskem pogledu.\n"
-"Èasi izven tega razpona ne bodo samodejno prikazani"
-
-#: calendar/gui/prop.c:389
-msgid "Day start:"
-msgstr "Zaèetek dneva:"
-
-#: calendar/gui/prop.c:400
-msgid "Day end:"
-msgstr "Konec dneva:"
-
-#: calendar/gui/prop.c:523
-msgid "Colors for display"
-msgstr "Barve za prikaz"
-
-#: calendar/gui/prop.c:526
-msgid "Colors"
-msgstr "Barve"
-
-#: calendar/gui/prop.c:603
-msgid "Show on TODO List:"
-msgstr "Poka¾i v seznamu za-opravit:"
-
-#: calendar/gui/prop.c:610
-msgid "Time Until Due"
-msgstr "Èas do preteka"
-
-#: calendar/gui/prop.c:641
-msgid "To Do List style options:"
-msgstr "Slog seznama za-opravit:"
-
-#: calendar/gui/prop.c:646
-msgid "Highlight overdue items"
-msgstr "Osvetli preteèene predmete"
-
-#: calendar/gui/prop.c:649
-msgid "Highlight not yet due items"
-msgstr "Osvetli ¹e nepreteèene predmete"
-
-#: calendar/gui/prop.c:652
-msgid "Highlight items due today"
-msgstr "Osvetli predmete z dana¹njim rokom"
-
-#: calendar/gui/prop.c:682
-msgid "To Do List Properties"
-msgstr "Lastnosti seznama Za-opravit"
-
-#: calendar/gui/prop.c:685
-msgid "To Do List"
-msgstr "Seznam Za-opravit"
-
-#: calendar/gui/prop.c:784
-msgid "Alarms"
-msgstr "Alarmi"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:787
-msgid "Alarm Properties"
-msgstr "Lastnosti alarma"
-
-#: calendar/gui/prop.c:797
-msgid "Beep on display alarms"
-msgstr "Piskaj ob zaslonskih alarmih"
-
-#: calendar/gui/prop.c:807
-msgid "Audio alarms timeout after"
-msgstr "Zvoèni alarmi preteèejo po"
-
-#: calendar/gui/prop.c:818 calendar/gui/prop.c:835
-msgid " seconds"
-msgstr " sekundah"
-
-#: calendar/gui/prop.c:824
-msgid "Enable snoozing for "
-msgstr "Omogoèi podalj¹anje spanja za "
-
-#. populate default frame/box
-#: calendar/gui/prop.c:840
-msgid "Defaults"
-msgstr "Privzeto"
-
-#: composer/e-msg-composer-address-dialog.c:182
-msgid "Cut"
-msgstr "Izre¾i"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut selected item into clipboard"
-msgstr "Izre¾i izbran predmet na odlo¾i¹èe"
-
-#: composer/e-msg-composer-address-dialog.c:186
-msgid "Copy"
-msgstr "Kopiraj"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy selected item into clipboard"
-msgstr "Kopiraj izbran predmet na odlo¾i¹èe"
-
-#: composer/e-msg-composer-address-dialog.c:190
-#: composer/e-msg-composer-address-dialog.c:198
-msgid "Paste"
-msgstr "Prilepi"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste item from clipboard"
-msgstr "Prilepi predmet iz odlo¾i¹èa"
-
-#: composer/e-msg-composer-address-dialog.c:525
-msgid "Select recipients' addresses"
-msgstr "Izberi naslove prejemnikov"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Seznam prejemnikov:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Iskanje..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Ime"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-#: mail/mail-config.glade.h:8
-msgid "Address"
-msgstr "Naslov"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Lastnosti..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "Za: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "oznaka9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "oznaka7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "oznaka8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 bajt"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bajtov"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Dodaj prilogo"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Odstrani"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Odstrani izbrane predmete iz seznama prilog"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Dodaj prilogo..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Prilo¾i datoteko k sporoèilu"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "Lastnosti priloge"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "MIME tip:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "Ime datoteke:"
-
-#: composer/e-msg-composer-hdrs.c:137 composer/e-msg-composer-hdrs.c:295
-msgid "From:"
-msgstr "Od:"
-
-#: composer/e-msg-composer-hdrs.c:243
-msgid "Click here for the address book"
-msgstr "Kliknite tu za adresar"
-
-#: composer/e-msg-composer-hdrs.c:296
-msgid "Enter the identitiy you wish to send this message from"
-msgstr "Vnesite identiteto s katero ¾elite poslati to sporoèilo"
-
-#: composer/e-msg-composer-hdrs.c:300
-msgid "To:"
-msgstr "Za:"
-
-#: composer/e-msg-composer-hdrs.c:301
-msgid "Enter the recipients of the message"
-msgstr "Vnesite prejemnike sporoèila"
-
-#: composer/e-msg-composer-hdrs.c:305
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:306
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Vnesite naslove, ki bodo prejeli, karbonske kopije sporoèila"
-
-#: composer/e-msg-composer-hdrs.c:311
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:312
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Vnesite naslove, ki bodo prejeli karbonske kopije sporoèila, a se ne bodo "
-"pojavili v seznamu prejemnikov sporoèila."
-
-#: composer/e-msg-composer-hdrs.c:318
-msgid "Subject:"
-msgstr "Zadeva:"
-
-#: composer/e-msg-composer-hdrs.c:319
-msgid "Enter the subject of the mail"
-msgstr "Vnesite zadevo sproèila"
-
-#: composer/e-msg-composer.c:452
-msgid "Save as..."
-msgstr "Shrani kot..."
-
-#: composer/e-msg-composer.c:463
-#, c-format
-msgid "Error saving file: %s"
-msgstr "Napak ob shranjevanju datoteke: %s"
-
-#: composer/e-msg-composer.c:483
-#, c-format
-msgid "Error loading file: %s"
-msgstr "Napaka ob nalaganju datoteke %s"
-
-#: composer/e-msg-composer.c:505
-msgid "Saving changes to message..."
-msgstr "Shranjujem spremembe sporoèila..."
-
-#: composer/e-msg-composer.c:507
-msgid "About to save changes to message..."
-msgstr "Shranil bom spremembe sporoèila"
-
-#: composer/e-msg-composer.c:591 shell/e-shell-view-menu.c:165
-msgid "Evolution"
-msgstr "Evolution"
-
-#: composer/e-msg-composer.c:597
-msgid ""
-"This message has not been sent.\n"
-"\n"
-"Do you wish to save your changes?"
-msgstr ""
-"To sporoèilo ni bilo poslano.\n"
-"\n"
-"®elite shraniti spremembe?"
-
-#: composer/e-msg-composer.c:619
-msgid "Open file"
-msgstr "Odpri datoteko"
-
-#: composer/e-msg-composer.c:731
-msgid "That file does not exist."
-msgstr "Datoteka ne obstaja."
-
-#: composer/e-msg-composer.c:741
-msgid "That is not a regular file."
-msgstr "To ni obièajna datoteka."
-
-#: composer/e-msg-composer.c:751
-msgid "That file exists but is not readable."
-msgstr "Ta datoteka obstaja a ni berljiva."
-
-#: composer/e-msg-composer.c:761
-msgid "That file appeared accesible but open(2) failed."
-msgstr "Datoteka se je zdela dostopna a open(2) ni uspel."
-
-#: composer/e-msg-composer.c:783
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"Datoteka je zelo velika (èez 100K).\n"
-"Ste preprièani,da jo ¾elite vstaviti?"
-
-#: composer/e-msg-composer.c:804
-msgid "An error occurred while reading the file."
-msgstr "Ob branju datoteke se je zgodila napaka."
-
-#: composer/e-msg-composer.c:900 shell/e-shell-view-menu.c:434
-msgid "_File"
-msgstr "_Datoteka"
-
-#: composer/e-msg-composer.c:906
-msgid "_Open..."
-msgstr "_Odpri..."
-
-#: composer/e-msg-composer.c:907
-msgid "Load a previously saved message"
-msgstr "Nalo¾i prej shranjeno sporoèilo"
-
-#: composer/e-msg-composer.c:915
-msgid "_Save..."
-msgstr "_Shrani..."
-
-#: composer/e-msg-composer.c:916
-msgid "Save message"
-msgstr "Shrani sporoèilo"
-
-#: composer/e-msg-composer.c:924
-msgid "_Save as..."
-msgstr "Shrani kot..."
-
-#: composer/e-msg-composer.c:925
-msgid "Save message with a different name"
-msgstr "Shrani sporoèilo pod drugaènim imenom"
-
-#: composer/e-msg-composer.c:933
-msgid "Save in _folder..."
-msgstr "Shrani v _mapo..."
-
-#: composer/e-msg-composer.c:934
-msgid "Save the message in a specified folder"
-msgstr "Shrani sporoèilo v izbrano mapo"
-
-#: composer/e-msg-composer.c:943
-msgid "_Insert text file... (FIXME)"
-msgstr "_Vstavi datoteko z besedilom... (FIXME)"
-
-#: composer/e-msg-composer.c:944
-msgid "Insert a file as text into the message"
-msgstr "Vstavi datoteko v sporoèilo kot besedilo"
-
-#: composer/e-msg-composer.c:953
-msgid "_Send"
-msgstr "_Po¹lji"
-
-#: composer/e-msg-composer.c:954
-msgid "Send the message"
-msgstr "Po¹lji sporoèilo"
-
-#: composer/e-msg-composer.c:964
-msgid "_Close..."
-msgstr "_Zapri..."
-
-#: composer/e-msg-composer.c:965
-msgid "Quit the message composer"
-msgstr "Zapri sestavljalca sporoèil"
-
-#: composer/e-msg-composer.c:978 shell/e-shell-view-menu.c:478
-msgid "_Edit"
-msgstr "_Uredi"
-
-#: composer/e-msg-composer.c:989
-msgid "_Format"
-msgstr "_Oblika izpisa"
-
-#: composer/e-msg-composer.c:995
-msgid "HTML"
-msgstr "HTML"
-
-#: composer/e-msg-composer.c:996
-msgid "Send the mail in HTML format"
-msgstr "Po¹lji po¹to v HTML obliki"
-
-#: composer/e-msg-composer.c:1009 shell/e-shell-view-menu.c:383
-#: shell/e-shell-view-menu.c:489 shell/e-storage-set-view.c:242
-msgid "_View"
-msgstr "_Pogled"
-
-#: composer/e-msg-composer.c:1015
-msgid "Show _attachments"
-msgstr "Ka¾i priloge"
-
-#: composer/e-msg-composer.c:1016
-msgid "Show/hide attachments"
-msgstr "Ka¾i/skrij priloge"
-
-#: composer/e-msg-composer.c:1049
-msgid "Send"
-msgstr "Po¹lji"
-
-#: composer/e-msg-composer.c:1050
-msgid "Send this message"
-msgstr "Po¹lji to sporoèilo"
-
-#: composer/e-msg-composer.c:1059
-msgid "Attach"
-msgstr "Prilo¾i"
-
-#: composer/e-msg-composer.c:1060
-msgid "Attach a file"
-msgstr "Prilo¾i datoteko"
-
-#: composer/e-msg-composer.c:1247
-msgid "Compose a message"
-msgstr "Sestavi novo sporoèilo"
-
-#: filter/filter-folder.c:183 filter/vfolder-rule.c:269
-msgid "Select Folder"
-msgstr "Izberi mapo"
-
-#: filter/filter-folder.c:246
-msgid "<click here to select a folder>"
-msgstr "<kliknite tukaj za izbiro mape>"
-
-#: mail/component-factory.c:177
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Ne morem inicializirati Evolution komponente za po¹to."
-
-#: mail/folder-browser-factory.c:24
-msgid "Get mail"
-msgstr "Poberi po¹to"
-
-#: mail/folder-browser-factory.c:24
-msgid "Check for new mail"
-msgstr "Preveri za novo po¹to"
-
-#: mail/folder-browser-factory.c:25
-msgid "Compose"
-msgstr "Sestavi"
-
-#: mail/folder-browser-factory.c:25
-msgid "Compose a new message"
-msgstr "Sestavi novo sporoèilo"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply"
-msgstr "Odgovori"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to the sender of this message"
-msgstr "Odgovori po¹iljatelju tega sporoèila"
-
-#: mail/folder-browser-factory.c:30
-msgid "Reply to All"
-msgstr "Odgovori vsem"
-
-#: mail/folder-browser-factory.c:30
-msgid "Reply to all recipients of this message"
-msgstr "Odgovori vsem prejemnikom tega sporoèila"
-
-#: mail/folder-browser-factory.c:32
-msgid "Forward"
-msgstr "Posreduj naprej"
-
-#: mail/folder-browser-factory.c:32
-msgid "Forward this message"
-msgstr "Sporoèilo posreduj naprej"
-
-#: mail/folder-browser-factory.c:36
-msgid "Move"
-msgstr "Prestavi"
-
-#: mail/folder-browser-factory.c:36
-msgid "Move message to a new folder"
-msgstr "Prestavi sporoèilo v novo mapo"
-
-#: mail/folder-browser-factory.c:38
-msgid "Print the selected message"
-msgstr "Natisni izbrano sporoèilo"
-
-#: mail/folder-browser-factory.c:40
-msgid "Delete this message"
-msgstr "Zbri¹i to sporèilo"
-
-#: mail/folder-browser-factory.c:62
-msgid "_Threaded Message List"
-msgstr "_Niten seznam sporoèil"
-
-#: mail/folder-browser-factory.c:72
-msgid "_Print message"
-msgstr "_Natisni sporoèilo"
-
-#: mail/folder-browser-factory.c:81
-msgid "_Mark all messages seen"
-msgstr "_Oznaèi vsa sporoèila kot videna"
-
-#: mail/folder-browser-factory.c:86
-msgid "E_dit Message"
-msgstr "_Uredi sporoèilo"
-
-#: mail/folder-browser-factory.c:92
-msgid "_View Message"
-msgstr "_Glej sporoèilo"
-
-#: mail/folder-browser-factory.c:98
-msgid "_Expunge"
-msgstr "_Unièi"
-
-#: mail/folder-browser-factory.c:104
-msgid "Mail _Filters ..."
-msgstr "Po¹lji _filtre ..."
-
-#: mail/folder-browser-factory.c:110
-msgid "_vFolder Editor ..."
-msgstr "Urejevalnik vMap ..."
-
-#: mail/folder-browser-factory.c:116
-msgid "_Mail Configuration ..."
-msgstr "Nastavitev _Po¹te ..."
-
-#: mail/folder-browser-factory.c:122
-msgid "Forget _Passwords"
-msgstr "Pozabi _gesla"
-
-#: mail/folder-browser-factory.c:129
-msgid "_Configure Folder"
-msgstr "_Nastavi mapo"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config.glade.h:7 mail/mail-config.glade.h:14
-msgid "Identities"
-msgstr "Identitete"
-
-#: mail/mail-config.glade.h:9
-msgid "Organization"
-msgstr "Organizacija"
-
-#: mail/mail-config.glade.h:10
-msgid "Signature File"
-msgstr "Datoteka s podpisom"
-
-#: mail/mail-config.glade.h:12 mail/mail-config.glade.h:17
-#: mail/mail-config.glade.h:23
-msgid "Edit"
-msgstr "Uredi"
-
-#: mail/mail-config.glade.h:15
-msgid "Sources"
-msgstr "Viri"
-
-#: mail/mail-config.glade.h:19
-msgid "Mail Sources"
-msgstr "Izvori po¹te"
-
-#: mail/mail-config-druid.glade.h:15 mail/mail-config.glade.h:20
-msgid "Mail Transport"
-msgstr "Prenos Po¹te"
-
-#: mail/mail-config.glade.h:21
-msgid "News Servers"
-msgstr "Novièarski stre¾niki"
-
-#: mail/mail-config.glade.h:25
-msgid "News Sources"
-msgstr "Viri novic"
-
-#: mail/mail-config.glade.h:26
-#, fuzzy
-msgid "Send messages in HTML format"
-msgstr "Po¹lji po¹to v HTML obliki"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config-druid.glade.h:7 mail/mail-config-druid.glade.h:8
-#: mail/mail-config-druid.glade.h:16
-msgid "Mail Configuration"
-msgstr "Nastavitev _po¹te"
-
-#: mail/mail-config-druid.glade.h:9
-msgid ""
-"Welcome to the Evolution Mail configuration wizard!\n"
-"By filling in some information about your email\n"
-"settings, you can start sending and receiving email\n"
-"right away. Click Next to continue."
-msgstr ""
-"Dobrodo¹li v nastavitvenem èarovniku po¹te!\n"
-"Z vpisom nekaterih podatkov o va¹ih nastavitvah e-po¹te\n"
-"lahko takoj priènete po¹iljati in sprejemati po¹to\n"
-"Kliknite naprej za nadaljevanje."
-
-#: mail/mail-config-druid.glade.h:13
-msgid "Identity"
-msgstr "Identiteta"
-
-#: mail/mail-config-druid.glade.h:14
-msgid "Mail Source"
-msgstr "Izvor po¹te"
-
-#: mail/mail-config-druid.glade.h:17
-msgid ""
-"Your email configuration is now complete.\n"
-"Click \"Finish\" to save your new settings"
-msgstr ""
-"Nastavljanje va¹e e-po¹te je sedaj gotovo.\n"
-"Kliknite \"Konèaj\" za shranitev nastavitev"
-
-#: mail/mail-crypto.c:342 mail/mail-crypto.c:420
-msgid "No GPG/PGP program available."
-msgstr "GPG/PGP program ni na voljo."
-
-#: mail/mail-crypto.c:348 mail/mail-crypto.c:426
-#, c-format
-msgid "Couldn't create pipe to GPG/PGP: %s"
-msgstr "Nisem mogel ustvariti cevi do GPG/PGP: %s"
-
-#: mail/mail-threads.c:618
-msgid "Currently pending operations:"
-msgstr "Trenutno èakajoèe operacije:"
-
-#: mail/mail-threads.c:819
-msgid "Incomplete message written on pipe!"
-msgstr "Nepopolno sporoèilo zapisano v cev!"
-
-#: mail/mail-threads.c:823
-msgid "Error reading commands from dispatching thread."
-msgstr "Napaka pri branju ukazov iz razpo¹iljalne niti."
-
-#: mail/mail-threads.c:937
-msgid "Corrupted message from dispatching thread?"
-msgstr "Prispelo pokvarjeno sporoèilo iz razpo¹iljalne niti?"
-
-#: mail/mail-threads.c:1002
-msgid "Waiting for user to close error dialog"
-msgstr "Èakam na uporabnika, da zapre dialog z napako"
-
-#: mail/mail-threads.c:1063
-msgid "Waiting for user to enter data"
-msgstr "Èakam na uporabnika, da vpi¹e podatek"
-
-#: mail/mail-threads.c:1071
-msgid "Could not create dialog box."
-msgstr "Nisem mogel ustvariti dialoga."
-
-#: mail/mail-threads.c:1113
-msgid "User cancelled query."
-msgstr "Uporabnik je preklical poizvedbo."
-
-#: mail/message-list.c:485
-msgid "Online Status"
-msgstr "Stanje priklopa"
-
-#: mail/message-list.c:521
-msgid "From"
-msgstr "Od"
-
-#: mail/message-list.c:528
-msgid "Subject"
-msgstr "Zadeva"
-
-#: mail/message-list.c:535
-msgid "Date"
-msgstr "Datum"
-
-#: mail/message-list.c:542
-msgid "Received"
-msgstr "Sprejeto"
-
-#: mail/message-list.c:549
-msgid "To"
-msgstr "Za"
-
-#: mail/message-list.c:556
-msgid "Size"
-msgstr "Velikost"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Namestitev Evolutiona"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Izgleda, da je tokrat va¹ prvi zagon Evolutiona."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-"Prosim kliknite \"V redu\" za namestitev Evoultionovih uporabni¹kih datotek "
-"pod"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"Ne morem ustvariti imenika\n"
-"%s\n"
-"Napaka: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"Ne morem kopirati datotek v\n"
-"`%s'."
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Evolutionove datoteke so se uspe¹no namestile."
-
-#: shell/e-setup.c:109
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please move it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"Datoteka `%s' ni imenik.\n"
-"Prosim premestite jo, da se lahko namestitev\n"
-"Evolutionovih uporabni¹kih datotek nadaljuje."
-
-#: shell/e-setup.c:121
-msgid ""
-"The directory `%s' exists but is not the\n"
-"Evolution directory. Please move it in order\n"
-"to allow installation of the Evolution user files."
-msgstr ""
-"Datoteka `%s' obstaja a ni Evolutionov imenik.\n"
-"Prosim premestite jo, da se lahko namestitev\n"
-"Evolutionovih uporabni¹kih datotek nadaljuje."
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"Ne morem ustvariti izbrane mape:\n"
-"%s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr "Izbrano ime mape ni veljavno."
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "Evolution - Ustvar novo mapo"
-
-#: shell/e-shell-folder-selection-dialog.c:96
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-"Tip izbrane mape ni veljaven za zahtevano\n"
-"operacijo."
-
-#: shell/e-shell-folder-selection-dialog.c:272
-msgid "New..."
-msgstr "Nova..."
-
-#: shell/e-shell-folder-title-bar.c:459 shell/e-shell-folder-title-bar.c:460
-msgid "(Untitled)"
-msgstr "(Neimenovana)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Program 'Bug buddy' ni bil najden v va¹i poti ($PATH)."
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "Programa 'Bug buddy' ni bilo mogoèe pognati."
-
-#: shell/e-shell-view-menu.c:167
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Avtorske pravice pridr¾ane 1999,2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:169
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution je zbirka programov okolja \n"
-"GNOME za delo v skupinah, za po¹to, koledar in \n"
-"urejanje stikov."
-
-#: shell/e-shell-view-menu.c:319
-msgid "Go to folder..."
-msgstr "Pojdi v _mapo..."
-
-#: shell/e-shell-view-menu.c:377
-msgid "_New"
-msgstr "_Nova"
-
-#: shell/e-shell-view-menu.c:389
-msgid "_Folder"
-msgstr "_Mapa"
-
-#: shell/e-shell-view-menu.c:395
-msgid "Evolution bar _shortcut"
-msgstr "Evolution vrstica z blji¾nicami"
-
-#: shell/e-shell-view-menu.c:404
-msgid "_Mail message (FIXME)"
-msgstr "_Po¹lji sporoèilo (FIXME)"
-
-#: shell/e-shell-view-menu.c:410
-msgid "_Appointment (FIXME)"
-msgstr "_Zmenek (FIXME)"
-
-#: shell/e-shell-view-menu.c:416
-msgid "_Contact (FIXME)"
-msgstr "_Kontakt (FIXME)"
-
-#: shell/e-shell-view-menu.c:422
-msgid "_Task (FIXME)"
-msgstr "_Naloga (FIXME)"
-
-#: shell/e-shell-view-menu.c:444
-msgid "_Go to folder..."
-msgstr "Pojdi v _mapo..."
-
-#: shell/e-shell-view-menu.c:445
-msgid "Display a different folder"
-msgstr "Poka¾i drugo mapo"
-
-#: shell/e-shell-view-menu.c:452
-msgid "_Create new folder..."
-msgstr "_Ustvari novo mapo..."
-
-#: shell/e-shell-view-menu.c:453 shell/e-shell-view-menu.c:465
-msgid "Create a new folder"
-msgstr "Ustvari novo mapo"
-
-#: shell/e-shell-view-menu.c:464
-msgid "E_xit..."
-msgstr "_Izhod..."
-
-#: shell/e-shell-view-menu.c:495
-msgid "Show _shortcut bar"
-msgstr "Ka¾i vrstico z _bli¾njicami"
-
-#: shell/e-shell-view-menu.c:496
-msgid "Show the shortcut bar"
-msgstr "Poka¾e vrstico z blji¾nicami"
-
-#: shell/e-shell-view-menu.c:501
-msgid "Show _folder bar"
-msgstr "Ka¾i vrstico z _mapami"
-
-#: shell/e-shell-view-menu.c:502
-msgid "Show the folder bar"
-msgstr "Poka¾e vrstico z mapami"
-
-#: shell/e-shell-view-menu.c:524
-msgid "_Actions"
-msgstr "_Dejanja"
-
-#: shell/e-shell-view-menu.c:535
-msgid "_Help"
-msgstr "_Pomoè"
-
-#: shell/e-shell-view-menu.c:541
-msgid "Help _index"
-msgstr "Kazalo _pomoèi"
-
-#: shell/e-shell-view-menu.c:548
-msgid "Getting _started"
-msgstr "Kako _zaèeti"
-
-#: shell/e-shell-view-menu.c:555
-msgid "Using the _mailer"
-msgstr "Uporaba _po¹te"
-
-#: shell/e-shell-view-menu.c:562
-msgid "Using the _calendar"
-msgstr "Uporaba _koledarja"
-
-#: shell/e-shell-view-menu.c:569
-msgid "Using the c_ontact manager"
-msgstr "Uporaba upravljalnika _stikov"
-
-#: shell/e-shell-view-menu.c:579
-msgid "_Submit bug report"
-msgstr "_Po¹lji poroèilo o hro¹èu"
-
-#: shell/e-shell-view-menu.c:580
-msgid "Submit bug report using Bug Buddy"
-msgstr "Po¹lji poroèilo o hro¹èu z uporabo progama Bug buddy"
-
-#: shell/e-shell-view-menu.c:589
-msgid "_About Evolution..."
-msgstr "_O Evolutionu..."
-
-#: shell/e-shell-view-menu.c:590
-msgid "Show information about Evolution"
-msgstr "Ka¾i podatke o Evolutionu"
-
-#: shell/e-shell-view.c:114
-msgid "(No folder displayed)"
-msgstr "(Nobena mapa ni prikazana)"
-
-#: shell/e-shell-view.c:342
-msgid "Folders"
-msgstr "Mape"
-
-#: shell/e-shell-view.c:740
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell.c:291
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Ne morem nastaviti krajevnega hranilnika -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "_Majhne ikone"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "Ka¾i blji¾nice kot majhne ikone"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "_Velike ikone"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Ka¾i blji¾nice kot velike ikone"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "Aktiviraj"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "Aktiviraj to blji¾nico"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Odstrani to blji¾nico iz vrstice blji¾nic"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Napaka pri shranjevanju blji¾nic."
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "(Brez imena)"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "Brez napak"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "Generièna napaka"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "Mapa z enakim imenom ¾e obstaja"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr "Izbran tip mape ni veljaven"
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "V/I napaka"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "Ni dovolj prostora za ustvaritev mape"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "Izbrana mapa ni bila najdena"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr "Funkcija ni implementirana v tem hranilniku"
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "Nimate dovoljenja"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "Operacija ni podprta"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr "Izbran tip ni podprt v tem hranilniku"
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "Neznana napaka"
-
-#: shell/e-storage-set-view.c:242
-msgid "View the selected folder"
-msgstr "Poglej izbrane mape"
-
-#: shell/main.c:66
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Zdravo. Hvala, ker ste si vzeli èas za prenos te predizdaje\n"
-"programja za delovne skupine Evolution.\n"
-"\n"
-"Skozi prej¹nji mesec in pol smo se trudili Evolution narediti \n"
-"uporabnega. Veliko razvijalcev Evolutiona ga ¾e exkluzivno \n"
-"uporablja za branje svoje po¹te. Tudi vi ga lahko. (Le ne pozabite\n"
-"na varnostne kopije.)\n"
-"\n"
-"Kljub temu, da smo popravili veliko hro¹èev, ki vplivajo na stabilnost \n"
-"in varnost vseeno opozarjamo: Evolution se bo: sesul, izgubil va¹o \n"
-"po¹to, ko tega ne boste hoteli, zavrnil brisanje va¹e po¹te, boste to \n"
-"¾eleli, pustil teèi mrtve procese, uporabil 100% procesorja, se zaklenil, \n"
-"poslal HTML na nakljuène dopisne sezname in vas osramotil pred prijatelji \n"
-"in sodelavci. \n"
-"Uporabljajte ga le tako kot je predvideno.\n"
-"\n"
-"Upamo, da boste u¾ivali sadove na¹ega trdega dela in nestrpno\n"
-"prièakujemo va¹e prispevke!\n"
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Hvala!\n"
-"Skupina Evolution\n"
-
-#: shell/main.c:121
-msgid "Cannot initialize the Evolution shell."
-msgstr "Ne morem inicializirati lupine Evolution."
-
-#: shell/main.c:156
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Ne morem inicializirati komponentnega sistema Bonobo."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Polja"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "Grupiranje"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Sortiranje"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Filtriranje"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-msgid "Field Chooser"
-msgstr "Izbirnik polij"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-"Da bi dodali stolpec k va¹i tabeli, ga potegnite\n"
-"do mesta kjer ¾elite, da se pojavi."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "okno1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "Polja na voljo"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "label1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "Ka¾i v tem vrstnem redu"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "label2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Dodaj >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< odstrani"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr "Poskusno"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "Zaseden"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr "Iz pisarne"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "Ni podatkov"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr "_Povabi ostale..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "_Mo¾nosti"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr "Ka¾i le delavne ure"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr "Ka¾i poman_j¹ano"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr "_Posodobi Prosto/Zasedeno"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "_<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr "_Samodeno izberi"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ">_>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "_Vsi ljudje in vsa sredstva"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr "Vsi ljudje in eno sredstvo"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr "_Potrebni ljudje"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr "Potrebni ljudje in eno sredstvo"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "Èas prièetka sestanka:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "Èas zakljuèka sestanka:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr "Vsi udele¾eni"
-
-#. Translators: These are the first characters of each day of the
-#. week, 'M' for 'Monday', 'T' for Tuesday etc.
-#: widgets/misc/e-calendar-item.c:281
-msgid "MTWTFSS"
-msgstr "PTSÈPSN"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "Skupina %i"
-
-#~ msgid "Discard this message?"
-#~ msgstr "Zavrzi to sporoèilo"
-
-#~ msgid ""
-#~ "Enter your name and email address to be used in outgoing mail. You may also, "
-#~ "optionally, enter the name of your organization, and the name of a file to "
-#~ "read your signature from."
-#~ msgstr ""
-#~ "Vnesite svoje ime in e-po¹tni naslov, ki naj se uporablja v izhodni po¹ti Po "
-#~ "¾elji lahko vnesete tudi ime va¹e organizacije in ime datoteke iz katere naj "
-#~ "se prebere va¹ podpis."
-
-#~ msgid "Full name:"
-#~ msgstr "Polno ime:"
-
-#~ msgid "Email address:"
-#~ msgstr "E-po¹tni naslov:"
-
-#~ msgid "Signature file:"
-#~ msgstr "Datoteka s podpisom:"
-
-#~ msgid "Server:"
-#~ msgstr "Stre¾nik:"
-
-#~ msgid "Username:"
-#~ msgstr "Uporabni¹ko ime:"
-
-#~ msgid "Path:"
-#~ msgstr "Pot:"
-
-#~ msgid "Authentication:"
-#~ msgstr "Avtentikacija:"
-
-#~ msgid "Detect supported types..."
-#~ msgstr "Ugotovi podprte tipe..."
-
-#~ msgid "Test Settings"
-#~ msgstr "Preveri nastavitve"
-
-#~ msgid ""
-#~ "Select the kind of mail server you have, and enter the relevant information "
-#~ "about it.\n"
-#~ "\n"
-#~ "If the server requires authentication, you can click the \"Detect supported "
-#~ "types...\" button after entering the other information."
-#~ msgstr ""
-#~ "Izberite vrsto po¹tnega stre¾nika, ki ga uporabljate in nastavite zanj "
-#~ "pomembne podatke.\n"
-#~ "\n"
-#~ "Èe stre¾nik potrebuje avtentikacijo, lako kliknete na gumb \"Ugotovi podprte "
-#~ "tipe...\", ko boste vnesli ostale podatke."
-
-#~ msgid ""
-#~ "Select the kind of news server you have, and enter the relevant information "
-#~ "about it.\n"
-#~ "\n"
-#~ "If the server requires authentication, you can click the \"Detect supported "
-#~ "types...\" button after entering the other information."
-#~ msgstr ""
-#~ "Izberite vrsto po¹tnega stre¾nika, ki ga uporabljate in nastavite zanj "
-#~ "pomembne podatke.\n"
-#~ "\n"
-#~ "Èe stre¾nik potrebuje avtentikacijo, lako kliknete na gumb \"Ugotovi podprte "
-#~ "tipe...\", po tem ko boste vnesli ostale podatke."
-
-#~ msgid "Edit Identity"
-#~ msgstr "Uredi identiteto"
-
-#~ msgid "Add Identity"
-#~ msgstr "Dodaj identiteto"
-
-#~ msgid "Edit Source"
-#~ msgstr "Uredi izbor"
-
-#~ msgid "Edit News Server"
-#~ msgstr "Uredi novièarski stre¾nik"
-
-#~ msgid "Fetching mail"
-#~ msgstr "Prena¹am po¹to"
-
-#~ msgid ""
-#~ "This message has no subject.\n"
-#~ "Really send?"
-#~ msgstr ""
-#~ "Sporoèilo nima 'zadeve'.\n"
-#~ "Resnièno po¹lji?"
-
-#~ msgid ""
-#~ "You need to configure an identity\n"
-#~ "before you can send mail."
-#~ msgstr ""
-#~ "Nastaviti morate sovjo identiteto\n"
-#~ "preden lahko po¹ljete po¹to."
-
-#~ msgid "Move message(s) to"
-#~ msgstr "Prestavi sporoèilo(a) v"
-
-#~ msgid "Back"
-#~ msgstr "Prej¹nji"
-
-#~ msgid "Finish"
-#~ msgstr "Konèaj"
-
-#~ msgid "Apply"
-#~ msgstr "Uporabi"
-
-#~ msgid ""
-#~ "<h2>Create Filtering Rule</h2><p>Select one of the base rules above, then "
-#~ "continue forwards to customise it.</p>"
-#~ msgstr ""
-#~ "<h2>Ustvari pravilo filtriranja</h2><p>Izberite eno od osnovnih pravil "
-#~ "zgorajnato nadaljujte naprej, da ga prilagodite.</p>"
-
-#~ msgid "_Virtual Folder Druid ..."
-#~ msgstr "©krat za navidezne _Vmape ..."
-
-#~ msgid "Test these values before continuing"
-#~ msgstr "Preveri te vrednosti pred nadaljevanjem"
-
-#~ msgid "Select the method you would like to use to deliver your mail."
-#~ msgstr "Izberite naèin na katerega ¾elite dostavljati va¹o po¹to."
-
-#~ msgid "Enter the hostname of the News Server you have."
-#~ msgstr "Vpi¹ite ime raèunalnika na katerem teèe novièarski stre¾nik."
-
-#~ msgid "Cannot initialize the configuration system."
-#~ msgstr "Ne morem inicializirati nastavitvenega sistema."
diff --git a/po/sv.po b/po/sv.po
deleted file mode 100644
index 087eb8b077..0000000000
--- a/po/sv.po
+++ /dev/null
@@ -1,3543 +0,0 @@
-# Swedish translation of evolution.
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Andreas Hyden <a.hyden@cyberpoint.se>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution 0.1\n"
-"POT-Creation-Date: 2000-07-19 02:01+0000\n"
-"PO-Revision-Date: 2000-04-04 19:23+0200\n"
-"Last-Translator: Andreas Hyden <a.hyden@cyberpoint.se>\n"
-"Language-Team: Swedish <sv@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:59 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Kunde inte initialisera bonobo"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "katerogier"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "Objekt tillhör dessa katerogier:"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "Tillgänliga katerogier:"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/event-editor.c:1118
-#, fuzzy
-msgid "FIXME: _Appointment"
-msgstr "_Möte"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1119
-#, fuzzy
-msgid "FIXME: Meeting Re_quest"
-msgstr "Begäran om möte"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/event-editor.c:1121
-#, fuzzy
-msgid "FIXME: _Mail Message"
-msgstr "_Posta meddelande"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/event-editor.c:1122
-#, fuzzy
-msgid "FIXME: _Contact"
-msgstr "_Kontakt"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/event-editor.c:1123
-msgid "FIXME: _Task"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/event-editor.c:1124
-#, fuzzy
-msgid "FIXME: Task _Request"
-msgstr "Uppgiftsbegä_ran"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/event-editor.c:1125
-#, fuzzy
-msgid "FIXME: _Journal Entry"
-msgstr "_Dagbokpost"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1126
-msgid "FIXME: _Note"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/event-editor.c:1128 calendar/gui/event-editor.c:1235
-msgid "FIXME: Ch_oose Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1133
-msgid "FIXME: _Memo Style"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/event-editor.c:1135
-msgid "FIXME: Define Print _Styles..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/event-editor.c:1142
-msgid "FIXME: S_end"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/event-editor.c:1146
-#, fuzzy
-msgid "FIXME: Save Attac_hments..."
-msgstr "Lägg till bilaga..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "_Ta bort"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1149
-msgid "FIXME: _Move to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/event-editor.c:1150
-msgid "FIXME: Cop_y to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/event-editor.c:1152
-msgid "Page Set_up"
-msgstr "Inställningar för sida"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/event-editor.c:1153
-msgid "FIXME: Print Pre_view"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1174
-msgid "FIXME: Paste _Special..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/event-editor.c:1179
-msgid "FIXME: Mark as U_nread"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/event-editor.c:1183
-msgid "_Object"
-msgstr "_Object"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/event-editor.c:1188 calendar/gui/event-editor.c:1195
-msgid "FIXME: _Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/event-editor.c:1189 calendar/gui/event-editor.c:1196
-msgid "FIXME: _Unread Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/event-editor.c:1190
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/event-editor.c:1197
-msgid "FIXME: _Last Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/event-editor.c:1202
-msgid "FIXME: _Standard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1204
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/event-editor.c:1207
-msgid "FIXME: _Customize..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/event-editor.c:1212
-msgid "Pre_vious"
-msgstr "Föreg_ående"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/event-editor.c:1213
-msgid "Ne_xt"
-msgstr "Nä_sta"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/event-editor.c:1217
-msgid "_Toolbars"
-msgstr "_Verktyg"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/event-editor.c:1222
-msgid "FIXME: _File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/event-editor.c:1223
-msgid "FIXME: It_em..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: _Object..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/event-editor.c:1229
-#, fuzzy
-msgid "FIXME: _Font..."
-msgstr "Typsnitt..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/event-editor.c:1230
-msgid "FIXME: _Paragraph..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/event-editor.c:1237
-msgid "FIXME: Desi_gn This Form"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/event-editor.c:1238
-msgid "FIXME: D_esign a Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Publish _Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/event-editor.c:1241
-msgid "FIXME: Pu_blish Form As..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/event-editor.c:1243
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/event-editor.c:1248
-msgid "FIXME: _Spelling..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/event-editor.c:1253
-msgid "_Forms"
-msgstr "_Former"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1266
-msgid "FIXME: For_ward"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/event-editor.c:1279
-msgid "_Insert"
-msgstr "_Infoga"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/event-editor.c:1280
-msgid "F_ormat"
-msgstr "F_ormatera"
-
-#. FIXME: add Favorites here
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/event-editor.c:1281 shell/e-shell-view-menu.c:473
-msgid "_Tools"
-msgstr "_Verktyg"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/event-editor.c:1282
-msgid "Actio_ns"
-msgstr "Hä_ndelser"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "Spara och stäng"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1321
-msgid "Save the appointment and close the dialog box"
-msgstr "Spara ärendet och stäng dialogen"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:673
-msgid "Print..."
-msgstr "Skriv ut..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/event-editor.c:1326
-msgid "Print this item"
-msgstr "Skriv ut detta objektet"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/event-editor.c:1327
-msgid "FIXME: Insert File..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/event-editor.c:1328
-msgid "Insert a file as an attachment"
-msgstr "Infoga en fil som en bifogning"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/gui/component/addressbook.c:426 calendar/gui/gncal-todo.c:499
-#: mail/folder-browser-factory.c:45
-msgid "Delete"
-msgstr "Ta bort"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/event-editor.c:1337 calendar/gui/gncal-todo.c:327
-msgid "Delete this item"
-msgstr "Ta bort detta objektet"
-
-#: addressbook/contact-editor/e-contact-editor.c:856
-#: calendar/gui/event-editor.c:1339
-msgid "FIXME: Previous"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/event-editor.c:1340
-msgid "Go to the previous item"
-msgstr "Gå till det föregående objektet"
-
-#: addressbook/contact-editor/e-contact-editor.c:859
-#: calendar/gui/event-editor.c:1341
-msgid "FIXME: Next"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/event-editor.c:1342
-msgid "Go to the next item"
-msgstr "Gå till det nästa objektet"
-
-#: addressbook/contact-editor/e-contact-editor.c:862
-#: calendar/gui/event-editor.c:1343
-msgid "FIXME: Help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:863
-#: calendar/gui/event-editor.c:1344
-msgid "See online help"
-msgstr "Läs direkthjälp"
-
-#: addressbook/contact-editor/e-contact-editor.c:1278
-msgid "Assistant"
-msgstr "Assistant"
-
-#: addressbook/contact-editor/e-contact-editor.c:1279
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Business"
-msgstr "Företag"
-
-#: addressbook/contact-editor/e-contact-editor.c:1280
-msgid "Business 2"
-msgstr "Företag 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1281
-msgid "Business Fax"
-msgstr "Fax företag"
-
-#: addressbook/contact-editor/e-contact-editor.c:1282
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1283
-msgid "Car"
-msgstr "Bil"
-
-#: addressbook/contact-editor/e-contact-editor.c:1284
-msgid "Company"
-msgstr "Företag"
-
-#: addressbook/contact-editor/e-contact-editor.c:1285
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Home"
-msgstr "Hem"
-
-#: addressbook/contact-editor/e-contact-editor.c:1286
-msgid "Home 2"
-msgstr "Hem 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1287
-msgid "Home Fax"
-msgstr "Fax hem"
-
-#: addressbook/contact-editor/e-contact-editor.c:1288
-msgid "ISDN"
-msgstr "ISDN"
-
-#: addressbook/contact-editor/e-contact-editor.c:1289
-msgid "Mobile"
-msgstr "Mobil"
-
-#: addressbook/contact-editor/e-contact-editor.c:1290
-#: addressbook/contact-editor/e-contact-editor.c:1385
-msgid "Other"
-msgstr "Annat"
-
-#: addressbook/contact-editor/e-contact-editor.c:1291
-msgid "Other Fax"
-msgstr "Annan fax"
-
-#: addressbook/contact-editor/e-contact-editor.c:1292
-#, fuzzy
-msgid "Pager"
-msgstr "Sida"
-
-#: addressbook/contact-editor/e-contact-editor.c:1293
-msgid "Primary"
-msgstr "Primär"
-
-#: addressbook/contact-editor/e-contact-editor.c:1294
-msgid "Radio"
-msgstr "Radio"
-
-#: addressbook/contact-editor/e-contact-editor.c:1295
-msgid "Telex"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1296
-msgid "TTY/TDD"
-msgstr "TTY/TDD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1340
-msgid "Primary Email"
-msgstr "Primär epost"
-
-#: addressbook/contact-editor/e-contact-editor.c:1341
-msgid "Email 2"
-msgstr "Epost 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1342
-msgid "Email 3"
-msgstr "Epost 3"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "_Lägg till"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "Telefontyper"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "Ny telefontyp"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-msgid "Add"
-msgstr "Lägg till"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "_Kontakt editor"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "Hela namet..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "Spara som:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Webbsajt adress:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "Vill ha _HTML-post"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Adress:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "_Företag"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "_Hem"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "Företags_fax"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "_Mobil"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "F_öretag"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "De_tta är epost-adressen"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "_Kontakter..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr "Ka_tegorier..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr "Jobbtitel:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "_Företag:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-msgid "General"
-msgstr "Generellt"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "Av_delning:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "K_ontor:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "_Yrke:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "_Smeknamn:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "Föd_elsedag:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr "_Assistantnamn:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "Chefens na_mn:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "_Jubileum:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "An_teckningar:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-msgid "Details"
-msgstr "Detaljer"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "Kolla hela namnet"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "_Titel:"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "_Första:"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "_Mellan:"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "_Senaste:"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "_Suffix:"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-
-#: addressbook/gui/component/addressbook.c:420
-#: calendar/gui/calendar-commands.c:544
-msgid "New"
-msgstr "Ny"
-
-#: addressbook/gui/component/addressbook.c:420
-msgid "Create a new contact"
-msgstr "Skapa en ny kontakt"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find"
-msgstr "Hitta"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find a contact"
-msgstr "Hitta en kontakt"
-
-#: addressbook/gui/component/addressbook.c:425
-#: addressbook/gui/component/addressbook.c:492
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:43
-msgid "Print"
-msgstr "Skriv ut"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Print contacts"
-msgstr "Skriv ut kontakter"
-
-#: addressbook/gui/component/addressbook.c:426
-msgid "Delete a contact"
-msgstr "Ta bort en kontakt"
-
-#: addressbook/gui/component/addressbook.c:499
-#: addressbook/gui/component/addressbook.c:1039
-msgid "As _Table"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:506
-msgid "_New Contact"
-msgstr "_Ny kontakt"
-
-#: addressbook/gui/component/addressbook.c:514
-msgid "N_ew Directory Server"
-msgstr "Ny katalogserver"
-
-#: addressbook/gui/component/addressbook.c:593
-msgid "Unable to open addressbook"
-msgstr "Kunde inte öppna adressboken"
-
-#: addressbook/gui/component/addressbook.c:598
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:943
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr "Spara som VCard"
-
-#: addressbook/gui/component/addressbook.c:1010
-msgid "* Click here to add a contact *"
-msgstr "* Klicka här för att lägga till en kontakt *"
-
-#: addressbook/gui/component/addressbook.c:1046
-msgid "As _Minicards"
-msgstr "Som _minikort"
-
-#: addressbook/gui/component/addressbook.c:1097
-msgid "The URI that the Folder Browser will display"
-msgstr "URL:en som mappbläddraden kommer att visa"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "window2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:98
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "k"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "Beskrivning:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "LDAP-server:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Portnummer:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr "Rot DN:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Namn:"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"Det finns inga objekt att visa i denna vyn\n"
-"\n"
-"Dubbel-klicka här för att skapa en ny kontakt."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "Inställningar för sida:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Bladnamn:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "Förhandsgranskning:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "Alternativ"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Inkludera:"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "Sektioner:"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr "Följ efter varandra omedelbart"
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr "Brevtabbar på sidan"
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "Rubriker för varje brev"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "Börja på en ny sida"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Antal kolumner"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "Tomma blanketter vid slutet:"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "Typsnitt"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "Typsnitt..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "Rubriker"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "Kropp"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 pt. Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "Skuggning"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "Skriv ut med grå skuggning"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "Format"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Papper"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Typ:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-msgid "label26"
-msgstr "label26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Geometri:"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "Bredd:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Höjd:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "Papperskälla:"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "Marginaler"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Topp:"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Botten:"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Vänster:"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Höger:"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "Sida"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Storlek:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Orientation"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "Stående"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "Liggande"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "Rubrik"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "Sidfot:"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "Backa vid jämna sidor"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "Rubrik/sidfot"
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:544
-msgid "am"
-msgstr "am"
-
-#: calendar/cal-util/timeutil.c:96 calendar/gui/print.c:543
-msgid "pm"
-msgstr "pm"
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr "Rubriker:"
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Appointments:"
-msgstr "Ärenden:"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr "Dagnummer:"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr "Gnome-kalender"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "GNOMEs personliga kalender och schemahanterare."
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr "Filen hittades inte"
-
-#: calendar/gui/calendar-commands.c:456
-msgid "Open calendar"
-msgstr "Öppna kalendern"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Save calendar"
-msgstr "Spara kalendern"
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:713
-#: calendar/gui/gncal-todo.c:717
-msgid "Day"
-msgstr "Dag"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr "Visa 1 dag"
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr "5 dagar"
-
-#: calendar/gui/calendar-commands.c:525
-#, fuzzy
-msgid "Show the working week"
-msgstr "Växlar trädvyn"
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:712
-msgid "Week"
-msgstr "Vecka"
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr "Visa 1 vecka"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Month"
-msgstr "Månader"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr "Visa 1 månad"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Year"
-msgstr "År"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr "Visa 1 år"
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:682
-msgid "Create a new appointment"
-msgstr "Skapa ett nytt ärende"
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:674
-msgid "Print this calendar"
-msgstr "Skriv ut denna kalendern"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Prev"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr "Gå tillbaka i tiden"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Today"
-msgstr "Idag"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr "Gå till nutid"
-
-#: calendar/gui/calendar-commands.c:554 filter/filter-editor.c:210
-msgid "Next"
-msgstr "Nästa"
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr "Gå fram i tiden"
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr "Gå till"
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr "Gå till ett specifikt datum"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:659
-msgid "New Ca_lendar"
-msgstr "Ny ka_lender"
-
-#: calendar/gui/calendar-commands.c:660
-msgid "Create a new calendar"
-msgstr "Skapa en ny kalender"
-
-#: calendar/gui/calendar-commands.c:663
-msgid "Open Ca_lendar"
-msgstr "Öppna ka_lender"
-
-#: calendar/gui/calendar-commands.c:664
-msgid "Open a calendar"
-msgstr "Öppna en kalender"
-
-#: calendar/gui/calendar-commands.c:668 calendar/gui/calendar-commands.c:669
-msgid "Save Calendar As"
-msgstr "Spara kalender som"
-
-#: calendar/gui/calendar-commands.c:682
-msgid "_New appointment..."
-msgstr "_Nytt ärende..."
-
-#: calendar/gui/calendar-commands.c:687
-msgid "New appointment for _today..."
-msgstr "Ny_tt ärende för idag..."
-
-#: calendar/gui/calendar-commands.c:688
-msgid "Create a new appointment for today"
-msgstr "Skapa ett nytt ärende för idag"
-
-#: calendar/gui/calendar-commands.c:696 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr "Inställningar"
-
-#: calendar/gui/calendar-commands.c:703 calendar/gui/calendar-commands.c:704
-msgid "About Calendar"
-msgstr "Om kalendern"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:746
-#, c-format
-msgid "%s%s"
-msgstr "%s%s"
-
-#: calendar/gui/calendar-commands.c:746
-msgid "'s calendar"
-msgstr "'s kalender"
-
-#: calendar/gui/control-factory.c:136
-#, fuzzy
-msgid "The URI that the calendar will display"
-msgstr "URL:en som mappbläddraden kommer att visa"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "Alarm på %A %b %d %Y %H:%M"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "Stäng"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1056
-#, fuzzy
-msgid "Snooze"
-msgstr "Storlek"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "Redigera ärende"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr ""
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "Nytt ärende..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "Redigera detta ärendet..."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "Ta bort detta ärendet"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "Gör detta ärendet flyttbart"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-#, fuzzy
-msgid "Delete this occurrence"
-msgstr "Ta bort detta meddelandet"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr ""
-
-#: calendar/gui/event-editor.c:289
-msgid "Edit Appointment"
-msgstr "Redigera ärende"
-
-#: calendar/gui/event-editor.c:294
-msgid "No summary"
-msgstr "Ingen sammanfattning"
-
-#: calendar/gui/event-editor.c:298
-#, c-format
-msgid "Appointment - %s"
-msgstr "Ärende - %s"
-
-#: calendar/gui/event-editor.c:301
-#, c-format
-msgid "Task - %s"
-msgstr "Uppgift - %s"
-
-#: calendar/gui/event-editor.c:304
-#, fuzzy, c-format
-msgid "Journal entry - %s"
-msgstr "_Dagbokpost"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:594 calendar/gui/event-editor.c:688
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1148
-#, fuzzy
-msgid "FIXME: _Delete"
-msgstr "Ta bort"
-
-#: calendar/gui/event-editor.c:1215
-msgid "FIXME: Ca_lendar..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1250
-msgid "FIXME: Chec_k Names"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1251
-msgid "FIXME: Address _Book..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1258
-#, fuzzy
-msgid "FIXME: _New Appointment"
-msgstr "_Möte"
-
-#: calendar/gui/event-editor.c:1260
-msgid "FIXME: Rec_urrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1262
-msgid "FIXME: Intive _Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1263
-msgid "FIXME: C_ancel Invitation..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Forward as v_Calendar"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1320
-msgid "FIXME: Save and Close"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1325
-msgid "FIXME: Print..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1330
-msgid "FIXME: Recurrence..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1331
-msgid "Configure recurrence rules"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1333
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1334
-msgid "Invite attendees to a meeting"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1336
-#, fuzzy
-msgid "FIXME: Delete"
-msgstr "Ta bort"
-
-#: calendar/gui/event-editor.c:1745
-msgid "%a %b %d %Y"
-msgstr "%a %b %d %Y"
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "januari"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "februari"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "mars"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "april"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "maj"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "juni"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "juli"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "augusti"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "september"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "sept"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "oktober"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "november"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "december"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "söndag"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "måndag"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "tisdag"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "tis"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "onsdag"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "ons"
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "torsdag"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "tor"
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "tors"
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "fredag"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "lördag"
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr "år"
-
-#: calendar/gui/getdate.y:421
-msgid "month"
-msgstr "månad"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr ""
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr "vecka"
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr "dag"
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr "timme"
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr "minut"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "min"
-
-#: calendar/gui/getdate.y:428
-msgid "second"
-msgstr "sekund"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "sek"
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "imorgon"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "förgår"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "idag"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr "nu"
-
-#: calendar/gui/getdate.y:439
-#, fuzzy
-msgid "last"
-msgstr "Klistra in"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr ""
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr "nästa"
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr "första"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr "tredje"
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr "fjärde"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr "femte"
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr "sjätte"
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr "sjunde"
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr "åttonde"
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr "nionde"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr "tionde"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr "elfte"
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr "tolfte"
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr "sen"
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Create to-do item"
-msgstr "Skapa att-göra objekt"
-
-#: calendar/gui/gncal-todo.c:137
-msgid "Edit to-do item"
-msgstr "Redigera att-göra objekt"
-
-#: calendar/gui/gncal-todo.c:171
-msgid "Summary:"
-msgstr "Sammanfattning:"
-
-#: calendar/gui/gncal-todo.c:181
-#, fuzzy
-msgid "Due Date:"
-msgstr "Avdelning:"
-
-#: calendar/gui/gncal-todo.c:190
-msgid "Priority:"
-msgstr "Prioritet:"
-
-#: calendar/gui/gncal-todo.c:207
-msgid "Item Comments:"
-msgstr "Objektkommentarer:"
-
-#: calendar/gui/gncal-todo.c:325
-msgid "Add to-do item..."
-msgstr "Lägg till att-göra objekt..."
-
-#: calendar/gui/gncal-todo.c:326
-msgid "Edit this item..."
-msgstr "Redigera detta objektet..."
-
-#: calendar/gui/gncal-todo.c:425
-msgid "Summary"
-msgstr "Sammanfattning"
-
-#: calendar/gui/gncal-todo.c:426 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:427 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr "Prioritet"
-
-#: calendar/gui/gncal-todo.c:428
-msgid "Time Left"
-msgstr "Tid kvar"
-
-#. Label
-#: calendar/gui/gncal-todo.c:440
-msgid "To-do list"
-msgstr "Att-göra lista"
-
-#. Add
-#: calendar/gui/gncal-todo.c:479
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Lägg till..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:488
-msgid "Edit..."
-msgstr "Redigera..."
-
-#: calendar/gui/gncal-todo.c:712
-msgid "Weeks"
-msgstr "Veckor"
-
-#: calendar/gui/gncal-todo.c:713 calendar/gui/gncal-todo.c:717
-msgid "Days"
-msgstr "Dagar"
-
-#: calendar/gui/gncal-todo.c:718 calendar/gui/gncal-todo.c:722
-msgid "Hours"
-msgstr "Timmar"
-
-#: calendar/gui/gncal-todo.c:718 calendar/gui/gncal-todo.c:722
-msgid "Hour"
-msgstr "Timme"
-
-#: calendar/gui/gncal-todo.c:723 calendar/gui/gncal-todo.c:727
-msgid "Minutes"
-msgstr "Minuter"
-
-#: calendar/gui/gncal-todo.c:723 calendar/gui/gncal-todo.c:727
-msgid "Minute"
-msgstr "Minut"
-
-#: calendar/gui/gncal-todo.c:728 calendar/gui/gncal-todo.c:732
-msgid "Seconds"
-msgstr "Sekunder"
-
-#: calendar/gui/gncal-todo.c:728 calendar/gui/gncal-todo.c:732
-msgid "Second"
-msgstr "Sekund"
-
-#: calendar/gui/gnome-cal.c:453 calendar/gui/gnome-cal.c:1064
-#: calendar/gui/gnome-cal.c:1120
-msgid "Reminder of your appointment at "
-msgstr ""
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1069 calendar/gui/gnome-cal.c:1124
-msgid "Ok"
-msgstr "Ok"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "Sön"
-
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "Mån"
-
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "Tis"
-
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "Ons"
-
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "Tors"
-
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "Fre"
-
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "Lör"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "År:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "Gå till datum"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "Gå till idag"
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr ""
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr ""
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr ""
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr ""
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr ""
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr ""
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr ""
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr "Må"
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr "Ti"
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr "On"
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr "To"
-
-#: calendar/gui/print.c:326
-msgid "Fr"
-msgstr "Fr"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr "Lö"
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr "ATT-GÖRA objekt"
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr "Aktuell dag (%a %b %d %Y)"
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr "%a"
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "Aktuell vecka (%s %s %d - %s %d %d)"
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "Aktuell vecka (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "Aktuell vecka (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr "Nuvarande månad (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr "Aktuellt år (%Y)"
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr "Skriv ut kalender"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr "Förhandsgranskning"
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr "Tidsvisning"
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr "Tidsformat"
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr "12-timmars (AM/PM)"
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr "24-timmars"
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr "Veckor börjar på"
-
-#: calendar/gui/prop.c:347
-msgid "Sunday"
-msgstr "Söndag"
-
-#: calendar/gui/prop.c:348
-msgid "Monday"
-msgstr "Måndag"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr ""
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr ""
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr ""
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr "Färger för visning"
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr "Färger"
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr "Visa på ATT-GÖRA listan:"
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr ""
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr ""
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr ""
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr ""
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr ""
-
-#: calendar/gui/prop.c:678
-msgid "To Do List Properties"
-msgstr ""
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr ""
-
-#: calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr "Alarm"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-msgid "Alarm Properties"
-msgstr "Egenskaper hos alarm"
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr ""
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr " sekunder"
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr ""
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-#, fuzzy
-msgid "Defaults"
-msgstr "Detaljer"
-
-#: composer/e-msg-composer-address-dialog.c:183 composer/e-msg-composer.c:945
-msgid "Cut"
-msgstr "Klipp ut"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "Klipp ut markerat objekt till urklipp"
-
-#: composer/e-msg-composer-address-dialog.c:187 composer/e-msg-composer.c:946
-msgid "Copy"
-msgstr "Kopiera"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "Kopiera markerat objekt till urklipp"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199 composer/e-msg-composer.c:947
-msgid "Paste"
-msgstr "Klistra in"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Klistra in objekt från urklipp"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "Välj mottagaradresser"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Mottagarlista:"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Sök..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Namn"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr "Adress"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Egenskaper..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "Till: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "label9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "label7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "label8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 byte"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u byte"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fK"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fM"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fG"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Lägg till bilaga"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Ta bort"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Ta bort markerade objekt från bifogningslistan"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Lägg till bilaga..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Bifoga en fil till meddelandet"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "Egenskaper hos bilagan"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "Mime-typ:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "Filnamn:"
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr "Klicka här för att ta fram adressboken"
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "Till:"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr "Ange meddelandets mottagare"
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Ange adresserna som ska få en kopia av meddelandet"
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Ange adressen till den som ska ta emot extrakopian av meddelandet utan att "
-"den visas i mottagandelistan av meddelandet."
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr "Ämne:"
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr "Ange brevets ämne"
-
-#: composer/e-msg-composer.c:463
-msgid "Save as..."
-msgstr "Spara som..."
-
-#: composer/e-msg-composer.c:474
-#, c-format
-msgid "Error saving file: %s"
-msgstr "Fel vid sparning av filen: %s"
-
-#: composer/e-msg-composer.c:494
-#, c-format
-msgid "Error loading file: %s"
-msgstr "Fel vid laddning av filen: %s"
-
-#: composer/e-msg-composer.c:513
-#, fuzzy
-msgid "Discard this message?"
-msgstr "Skicka detta meddelandet vidare"
-
-#: composer/e-msg-composer.c:561
-msgid "Open file"
-msgstr "Öppna fil"
-
-#: composer/e-msg-composer.c:676
-msgid "That file does not exist."
-msgstr "Den filen finns inte."
-
-#: composer/e-msg-composer.c:686
-msgid "That is not a regular file."
-msgstr "Den där är ingen vanlig fil."
-
-#: composer/e-msg-composer.c:696
-msgid "That file exists but is not readable."
-msgstr "Den filen finns men är inte läsbar."
-
-#: composer/e-msg-composer.c:707
-msgid "That file appeared accesible but open(2) failed."
-msgstr ""
-
-#: composer/e-msg-composer.c:729
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"Filen är mycket stor (mer än 100K).\n"
-"Är du säker på att du vill infoga den?"
-
-#: composer/e-msg-composer.c:748
-msgid "An error occurred while reading the file."
-msgstr "Ett fel uppstod vid läsning av filen."
-
-#: composer/e-msg-composer.c:888
-msgid "Save in _folder..."
-msgstr "Spara i _mapp..."
-
-#: composer/e-msg-composer.c:888
-msgid "Save the message in a specified folder"
-msgstr "Spara meddelandet i en viss mapp"
-
-#: composer/e-msg-composer.c:891
-msgid "_Insert Text File"
-msgstr "_Infoga textfil"
-
-#: composer/e-msg-composer.c:891
-msgid "Insert a file as text into the message"
-msgstr "Infoga en fil som text i meddelandet"
-
-#: composer/e-msg-composer.c:894 composer/e-msg-composer.c:942
-msgid "Send"
-msgstr "Skicka"
-
-#: composer/e-msg-composer.c:894
-msgid "Send the message"
-msgstr "Skicka meddelandet"
-
-#: composer/e-msg-composer.c:906
-msgid "View _attachments"
-msgstr "Visa _bilagor"
-
-#: composer/e-msg-composer.c:907
-msgid "View/hide attachments"
-msgstr "Visa/göm bilagor"
-
-#: composer/e-msg-composer.c:942
-msgid "Send this message"
-msgstr "Skicka detta meddelandet"
-
-#: composer/e-msg-composer.c:945
-msgid "Cut selected region into the clipboard"
-msgstr "Klipp ut markerat område till urklipp"
-
-#: composer/e-msg-composer.c:946
-msgid "Copy selected region into the clipboard"
-msgstr "Kopiera markerat område till urklipp"
-
-#: composer/e-msg-composer.c:947
-msgid "Paste selected region into the clipboard"
-msgstr "Klistra in markerat område till urklipp"
-
-#: composer/e-msg-composer.c:948
-msgid "Undo"
-msgstr "Ångra"
-
-#: composer/e-msg-composer.c:948
-msgid "Undo last operation"
-msgstr "Ångra senaste ändringen"
-
-#: composer/e-msg-composer.c:951
-msgid "Attach"
-msgstr "Bifoga"
-
-#: composer/e-msg-composer.c:951
-msgid "Attach a file"
-msgstr "Bifoga en fil"
-
-#: composer/e-msg-composer.c:1127
-msgid "Compose a message"
-msgstr ""
-
-#: filter/filter-editor.c:198
-msgid "Edit Filter"
-msgstr "Redigera filter"
-
-#: filter/filter-editor.c:198
-msgid "Create filter"
-msgstr "Skapa filter"
-
-#: filter/filter-editor.c:209
-msgid "Back"
-msgstr "Tillbaka"
-
-#: filter/filter-editor.c:211
-msgid "Finish"
-msgstr "Klar"
-
-#: filter/filter-editor.c:212
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: filter/filter-editor.c:216
-msgid "Apply"
-msgstr "Verkställ"
-
-#: filter/filter-editor.c:233
-msgid ""
-"<h2>Create Filtering Rule</h2><p>Select one of the base rules above, then "
-"continue forwards to customise it.</p>"
-msgstr ""
-
-#: mail/component-factory.c:196
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Kan inte initialisera Evolutions postkomponent."
-
-#: mail/folder-browser-factory.c:29
-msgid "Get mail"
-msgstr "Hämta post"
-
-#: mail/folder-browser-factory.c:29
-msgid "Check for new mail"
-msgstr "Kolla efter ny post"
-
-#: mail/folder-browser-factory.c:30
-msgid "Compose"
-msgstr ""
-
-#: mail/folder-browser-factory.c:30
-#, fuzzy
-msgid "Compose a new message"
-msgstr "Skriv ett nytt brev"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply"
-msgstr "Svara"
-
-#: mail/folder-browser-factory.c:34
-msgid "Reply to the sender of this message"
-msgstr "Svara till sändaren av det här meddelandet"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to All"
-msgstr "Svara till alla"
-
-#: mail/folder-browser-factory.c:35
-msgid "Reply to all recipients of this message"
-msgstr "Svara till alla mottagare av det här meddelandet"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward"
-msgstr "Skicka vidare"
-
-#: mail/folder-browser-factory.c:37
-msgid "Forward this message"
-msgstr "Skicka detta meddelandet vidare"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Refile"
-msgstr "Mottag"
-
-#: mail/folder-browser-factory.c:41
-#, fuzzy
-msgid "Move message to a new folder"
-msgstr "Spara meddelandet i en viss mapp"
-
-#: mail/folder-browser-factory.c:43
-msgid "Print the selected message"
-msgstr "Skriv ut markerat meddelande"
-
-#: mail/folder-browser-factory.c:45
-msgid "Delete this message"
-msgstr "Ta bort detta meddelandet"
-
-#: mail/folder-browser-factory.c:65
-msgid "_Threaded Message List"
-msgstr ""
-
-#: mail/folder-browser-factory.c:77
-msgid "_Expunge"
-msgstr "Rad_era"
-
-#: mail/folder-browser-factory.c:83
-msgid "_Filter Druid ..."
-msgstr "_Filter-guide ..."
-
-#: mail/folder-browser-factory.c:89
-msgid "_Virtual Folder Druid ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:95
-msgid "_Mail Configuration ..."
-msgstr "_Post konfiguration ..."
-
-#: mail/folder-browser-factory.c:101
-msgid "Forget _Passwords"
-msgstr "_Glöm lösenord"
-
-#: mail/mail-config.c:262
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-"Ange ditt namn och epost-adress som ska användas i utgående post. Du kan "
-"också, om du vill, ange namnet på din organisation, och namnet på en fil att "
-"läsa din signatur från."
-
-#: mail/mail-config.c:277
-msgid "Full name:"
-msgstr "Hela namnet:"
-
-#: mail/mail-config.c:305
-msgid "Email address:"
-msgstr "Epost-adress:"
-
-#: mail/mail-config.c:328
-msgid "Organization:"
-msgstr "Organisation:"
-
-#: mail/mail-config.c:340
-msgid "Signature file:"
-msgstr "Signaturfil:"
-
-#: mail/mail-config.c:345
-msgid "Signature File"
-msgstr "Signaturfil"
-
-#: mail/mail-config.c:718 mail/mail-config.c:812 mail/mail-config.c:1621
-msgid "Server:"
-msgstr "Server:"
-
-#: mail/mail-config.c:725
-msgid "Username:"
-msgstr "Filnamn:"
-
-#: mail/mail-config.c:732
-msgid "Path:"
-msgstr "Sökväg"
-
-#: mail/mail-config.c:739 mail/mail-config.c:819
-#, fuzzy
-msgid "Authentication:"
-msgstr "Orientation"
-
-#: mail/mail-config.c:751 mail/mail-config.c:831
-msgid "Detect supported types..."
-msgstr ""
-
-#: mail/mail-config.c:777 mail/mail-config.c:853
-msgid "Test these values before continuing"
-msgstr "Testa dessa värden innan nästa steg"
-
-#: mail/mail-config.c:960
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config.c:978
-msgid "Select the method you would like to use to deliver your mail."
-msgstr "Välj den metod du vill använda för att leverera din post."
-
-#: mail/mail-config.c:1163 mail/mail-config.c:1242
-msgid "Mail Configuration"
-msgstr "Konfiguration för post"
-
-#. Identity page
-#: mail/mail-config.c:1180
-msgid "Identity"
-msgstr "Identitet"
-
-#. Source page
-#: mail/mail-config.c:1199
-msgid "Mail Source"
-msgstr "Post-källa"
-
-#. Transport page
-#: mail/mail-config.c:1220
-msgid "Mail Transport"
-msgstr "Post-transportering"
-
-#: mail/mail-config.c:1343
-msgid "Edit Identity"
-msgstr "Redigera identitet"
-
-#: mail/mail-config.c:1345
-msgid "Add Identity"
-msgstr "Lägg till identitet"
-
-#: mail/mail-config.c:1488
-msgid "Edit Source"
-msgstr "Redigera källa"
-
-#: mail/mail-config.c:1490
-msgid "Add Source"
-msgstr "Lägg till källa"
-
-#. "\n\n"
-#. "If the server requires authentication, you can click the "
-#. "\"Detect supported types...\" button after entering "
-#. "the other information."
-#: mail/mail-config.c:1600
-msgid "Enter the hostname of the News Server you have."
-msgstr "Ange värdnamnet på den nyhetsserver du har."
-
-#: mail/mail-config.c:1656
-msgid "Edit News Server"
-msgstr "Redigera nyhetsserver"
-
-#: mail/mail-config.c:1658
-msgid "Add News Server"
-msgstr "Lägg till nyhetsserver"
-
-#: mail/mail-ops.c:374
-msgid "Fetching mail"
-msgstr "Hämtar post"
-
-#: mail/mail-ops.c:386
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-"Detta meddelandet har inget ämne.\n"
-"Vill du verkligen skicka?"
-
-#: mail/mail-ops.c:743
-#, fuzzy
-msgid "Refile message(s) to"
-msgstr "Nya brev"
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr ""
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr ""
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr ""
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr ""
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr "Kunde inte skapa dialog."
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr ""
-
-#: mail/main.c:62
-msgid "Mail Component: I could not initialize Bonobo"
-msgstr "Postkomponent: Jag kunde inte initialisera Bonobo"
-
-#: mail/message-list.c:460
-msgid "Online Status"
-msgstr "Anslutningsstatus"
-
-#: mail/message-list.c:488
-msgid "From"
-msgstr "Från"
-
-#: mail/message-list.c:495
-msgid "Subject"
-msgstr "Ämne"
-
-#: mail/message-list.c:502
-msgid "Date"
-msgstr "Datum"
-
-#: mail/message-list.c:509
-msgid "Received"
-msgstr "Mottog"
-
-#: mail/message-list.c:516
-msgid "To"
-msgstr "Till"
-
-#: mail/message-list.c:523
-msgid "Size"
-msgstr "Storlek"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Installation för Evolution"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Det verkar som det är första gången du kör Evolution."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-"Var vänlig klicka på \"OK\" för att installera Evolutions användarfiler i"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"Kan inte skapa katalogen\n"
-"%s\n"
-"Fel: %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"Kan inte kopiera filer till\n"
-"'%s'."
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Evolutions installation lyckades."
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, fuzzy, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr "Spara meddelandet i en viss mapp"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr "Det angivna mappnamnet är inte giltigt."
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "Evolution - Skapa ny mapp"
-
-#: shell/e-shell-folder-selection-dialog.c:95
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:236
-msgid "New..."
-msgstr "Ny..."
-
-#: shell/e-shell-folder-title-bar.c:355
-msgid "(Untitled)"
-msgstr "(Namnlös)"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:110
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Bug-buddy hittades inte i din $PATH."
-
-#. same as above
-#: shell/e-shell-view-menu.c:116
-msgid "Bug buddy could not be run."
-msgstr "Bug-buddy kunde inte köras."
-
-#: shell/e-shell-view-menu.c:159
-msgid "Evolution"
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:161
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:163
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution är en svit av grupprogram\n"
-"för epost, kalender, och kontakt-hantering\n"
-"inom GNOME's skrivbordsmiljö."
-
-#: shell/e-shell-view-menu.c:301
-msgid "Go to folder..."
-msgstr "Gå till mapp..."
-
-#: shell/e-shell-view-menu.c:365
-msgid "_Folder"
-msgstr "_Mapp"
-
-#: shell/e-shell-view-menu.c:369
-msgid "Evolution _Bar Shortcut"
-msgstr "Evolution genvägsrad"
-
-#: shell/e-shell-view-menu.c:375
-#, fuzzy
-msgid "_Mail message (FIXME)"
-msgstr "_Posta meddelande"
-
-#: shell/e-shell-view-menu.c:376 shell/e-shell-view-menu.c:379
-msgid "Composes a new mail message"
-msgstr "Skriv ett nytt brev"
-
-#: shell/e-shell-view-menu.c:378
-#, fuzzy
-msgid "_Appointment (FIXME)"
-msgstr "_Möte"
-
-#: shell/e-shell-view-menu.c:381
-#, fuzzy
-msgid "_Contact (FIXME)"
-msgstr "_Kontakt"
-
-#: shell/e-shell-view-menu.c:384
-msgid "_Task (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:387
-#, fuzzy
-msgid "Task _Request (FIXME)"
-msgstr "Uppgiftsbegä_ran"
-
-#: shell/e-shell-view-menu.c:390
-#, fuzzy
-msgid "_Journal Entry (FIXME)"
-msgstr "_Dagbokpost"
-
-#: shell/e-shell-view-menu.c:398
-msgid "_New"
-msgstr "_Ny"
-
-#: shell/e-shell-view-menu.c:402
-msgid "_Go to folder..."
-msgstr "_Gå till mapp..."
-
-#: shell/e-shell-view-menu.c:402
-msgid "Display a different folder"
-msgstr "Visa en annan mapp"
-
-#: shell/e-shell-view-menu.c:404
-msgid "_Create new folder..."
-msgstr "_Skapa ny mapp..."
-
-#: shell/e-shell-view-menu.c:404
-msgid "Create a new folder"
-msgstr "Skapa en ny mapp"
-
-#: shell/e-shell-view-menu.c:419
-#, fuzzy
-msgid "Show _shortcut bar"
-msgstr "_Växla genvägsrad"
-
-#: shell/e-shell-view-menu.c:420
-#, fuzzy
-msgid "Show the shortcut bar"
-msgstr "Växlar genvägsraden"
-
-#: shell/e-shell-view-menu.c:422
-#, fuzzy
-msgid "Show _folder bar"
-msgstr "_Växla genvägsrad"
-
-#: shell/e-shell-view-menu.c:423
-#, fuzzy
-msgid "Show the folder bar"
-msgstr "Växlar genvägsraden"
-
-#: shell/e-shell-view-menu.c:440
-msgid "Help _Index"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:443
-msgid "Getting _Started"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:446
-msgid "Using the _Mailer"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:449
-msgid "Using the _Calendar"
-msgstr "Att använda kalendern"
-
-#: shell/e-shell-view-menu.c:452
-msgid "Using the Cont_act Manager"
-msgstr "Att använda kontakthanteraren"
-
-#: shell/e-shell-view-menu.c:457
-msgid "_Submit bug report"
-msgstr "_Skicka felrapport"
-
-#: shell/e-shell-view-menu.c:458
-msgid "Submit bug-report via bug-buddy"
-msgstr "Skicka felrapport via bug-buddy"
-
-#: shell/e-shell-view-menu.c:474
-msgid "_Actions"
-msgstr "_Händelser"
-
-#: shell/e-shell-view.c:113
-msgid "(No folder displayed)"
-msgstr "(Ingen mapp visas)"
-
-#: shell/e-shell-view.c:208
-msgid "Folders"
-msgstr "Mappar"
-
-#: shell/e-shell-view.c:596
-msgid "None"
-msgstr "Inga"
-
-#: shell/e-shell-view.c:600
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell.c:299
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Kan inte lägga upp lokal sparningsplats -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "_Små ikoner"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "Visa genvägarna som små ikoner"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "S_tora ikoner"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Visa genvägarna som stora ikoner"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "Aktivera"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "Aktivera denna genvägen"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Ta bort denna genvägen från genvägsraden"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Fel vid sparning av genvägar."
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "(Inget namn)"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "Inga fel"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr ""
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "En mapp med samma namn finns redan"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr "Den angivna mapptypen är inte giltig"
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "I/O-fel"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "Inte tillräckligt med utrymme att skapa mapp"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "Den angivna mappen hittades inte"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr ""
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr ""
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr ""
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr ""
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "Okänt fel"
-
-#: shell/main.c:99
-#, fuzzy
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Hej. Tack för att du tog tiden att ladda ner den här förhandsversionen av\n"
-"Evolution grupprogramsviten.\n"
-"\n"
-"Evolution-teamet har jobbat hårt för att göra Evolution så robust,\n"
-"utbyggbart, snyggt, snabbt och välutrustat för avancerade internetanvändare "
-"som\n"
-"möjligt. Och vi är väldigt trötta. Men vi är inte klara -- inte än.\n"
-"\n"
-"Allt eftersom du utforskar Evolution, var vänlig och förstå att det mesta av "
-"vårt arbete har\n"
-"fokuserats på backgrundsmotorn som kör hela systemet och\n"
-"inte användargränssnittet. Vi håller däremot just på att komma upp för "
-"kullen,\n"
-"och vi kommer att använda nästan all vår kärlek och uppmärksamhet till UI:et "
-"från\n"
-"och med nu. Men du vet åtminstone att du inte använder ett demo.\n"
-"\n"
-"Så, dags för den nördiga förnekelsen. Evolution kommer att: krascha, göra av "
-"med din\n"
-"epost, lämna kvar förvirrade processer, använda 100% CPU, löpa, låsa sig,\n"
-"skicka HTML-post till slumpmässiga maillistor, och skämma ut dig framför\n"
-"dina vänner och medarbetare. Använd vid egen risk.\n"
-"\n"
-"Vi hoppas att du trivs med resultatet av vårt hårda arbete, och vi väntar\n"
-"irvrigt på dina bidrag!\n"
-
-#: shell/main.c:126
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Tack\n"
-"Evolution-teamet\n"
-
-#: shell/main.c:172
-msgid "Cannot initialize the Evolution shell."
-msgstr "Kan inte initialisera Evolution-skalet"
-
-#: shell/main.c:214
-msgid "Cannot initialize the configuration system."
-msgstr "Kan inte initialisera konfigurationssystemet."
-
-#: shell/main.c:220
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Kan inte initiera Bonobo-komponentsystemet"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Poster"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "Gruppering"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Sortera"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Filter"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-#, fuzzy
-msgid "Field Chooser"
-msgstr "Poster"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "window1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "Tillgänliga poster"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "label1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "Visa i denna ordningen"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "label2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Lägg till >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Ta bort"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-#, fuzzy
-msgid "Tentative"
-msgstr "Orientation"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "Upptagen"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-#, fuzzy
-msgid "Out of Office"
-msgstr "Kontor:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "Ingen information"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "_Alternativ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "_<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr "_Autovälj"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ">_>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "_Alla människor och tillgångar"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-#, fuzzy
-msgid "Meeting _start time:"
-msgstr "Begäran om möte"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-#, fuzzy
-msgid "Meeting _end time:"
-msgstr "Begäran om möte"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr ""
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "Grupp %i"
-
-#, fuzzy
-#~ msgid "No description"
-#~ msgstr "Beskrivning:"
-
-#, fuzzy
-#~ msgid "_Mail"
-#~ msgstr "_Mobil"
-
-#, fuzzy
-#~ msgid "Pri_vate"
-#~ msgstr "Klistra in"
-
-#, fuzzy
-#~ msgid "Daily"
-#~ msgstr "Detaljer"
-
-#, fuzzy
-#~ msgid "label23"
-#~ msgstr "label2"
-
-#, fuzzy
-#~ msgid "label24"
-#~ msgstr "label2"
-
-#, fuzzy
-#~ msgid "label25"
-#~ msgstr "label2"
-
-#, fuzzy
-#~ msgid "month(s)"
-#~ msgstr "Typsnitt"
-
-#, fuzzy
-#~ msgid "label27"
-#~ msgstr "label7"
-
-#, fuzzy
-#~ msgid "Exceptions"
-#~ msgstr "Alternativ"
-
-#, fuzzy
-#~ msgid "Change"
-#~ msgstr "Skuggning"
-
-#~ msgid "Evolution can not create its local folders"
-#~ msgstr "Evolution kan inte skapa sina lokala mappar"
-
-#~ msgid "New group"
-#~ msgstr "Ny grupp"
-
-#~ msgid "Browse..."
-#~ msgstr "Bläddra..."
-
-#~ msgid "Send a new message"
-#~ msgstr "Skicka ett nytt meddelande"
-
-#~ msgid "Find messages"
-#~ msgstr "Hitta meddelanden"
-
-#~ msgid "We are sorry, Evolution's Folder Browser can not be initialized."
-#~ msgstr "Tyvärr, Evolutions mappbläddrare kan inte initialiseras."
-
-#~ msgid "Whether a message preview should be shown"
-#~ msgstr "Huruvida meddelanden ska förhandsgranskas"
-
-#~ msgid "_Task"
-#~ msgstr "Uppgif_t"
-
-#~ msgid "_Selected Items"
-#~ msgstr "_Markerade objekt"
-
-#~ msgid "_New Folder"
-#~ msgstr "_Ny mapp"
-
-#~ msgid "_Open"
-#~ msgstr "_Öppna"
-
-#~ msgid "Clos_e All Items"
-#~ msgstr "Stäng _alla objekt"
-
-#~ msgid "Closes all the open items"
-#~ msgstr "Stänger alla öppna objekt"
-
-#, fuzzy
-#~ msgid "Show _Treeview"
-#~ msgstr "_Växla trädvy"
-
-#~ msgid ""
-#~ "This is a development version of Evolution.\n"
-#~ "Using the mail component on your mail files\n"
-#~ "is extremely hazardous.\n"
-#~ "\n"
-#~ "Do not run this program on your real mail,\n"
-#~ "do not give it access to your real mail server,\n"
-#~ "and do not send mail to real people with it.\n"
-#~ "\n"
-#~ "You have been warned\n"
-#~ msgstr ""
-#~ "Det här är en utvecklingsversion av Evolution.\n"
-#~ "Att använda brevkomponenten till dina brevfiler\n"
-#~ "är extremt riskfyllt.\n"
-#~ "\n"
-#~ "Kör inte det här programmet på din riktiga epost,\n"
-#~ "ge den inte tillgång till din riktiga brevserver,\n"
-#~ "och skicka inte brev till riktiga människor med den.\n"
-#~ "\n"
-#~ "Du har blivit varnad\n"
-
-#~ msgid "A folder containing mail items"
-#~ msgstr "En mapp som innehåller mailobjekt"
-
-#~ msgid "A folder containing contacts"
-#~ msgstr "En mapp som innehåller kontakter"
-
-#~ msgid "A folder containing calendar entries"
-#~ msgstr "En mapp som innehåller kalenderposter"
-
-#~ msgid "A folder containing tasks"
-#~ msgstr "En mapp som innehåller uppgifter"
-
-#~ msgid "A service containing mail items"
-#~ msgstr "En tjänst som innehåller postobjekt"
-
-#~ msgid "A service containing contacts"
-#~ msgstr "En tjänst som innehåller kontakter"
-
-#~ msgid "A service containing calendar entries"
-#~ msgstr "En tjänst som innehåller kalanderposter"
-
-#~ msgid "A service containing tasks"
-#~ msgstr "En tjänst som innehåller uppgifter"
-
-#~ msgid "Remove Group"
-#~ msgstr "Ta bort grupp"
-
-#~ msgid "Rename Group"
-#~ msgstr "Byt namn på grupp"
-
-#~ msgid "Open in New Window"
-#~ msgstr "Öppna i ett nytt fönster"
-
-#~ msgid "Advanced Find"
-#~ msgstr "Avancerat sök"
-
-#~ msgid "Rename Shortcut"
-#~ msgstr "Byt namn på genväg"
-
-#~ msgid "Executive Summary"
-#~ msgstr "Slutgiltiga summan"
-
-#~ msgid "Inbox"
-#~ msgstr "Inbox"
-
-#~ msgid "Sent messages"
-#~ msgstr "Skickade brev"
-
-#~ msgid "Sent mail messages"
-#~ msgstr "Skickade brev"
-
-#~ msgid "Draft mail messages"
-#~ msgstr "Icke färdigskriven epost"
-
-#~ msgid "Tasks list"
-#~ msgstr "Lista med uppgifter"
-
-#~ msgid "Other Shortcuts"
-#~ msgstr "Andra genvägar"
-
-#~ msgid "Enables some debugging functions"
-#~ msgstr "Aktiverar felsökningsfunktioner"
-
-#~ msgid "LEVEL"
-#~ msgstr "NIVÅ"
-
-#~ msgid ""
-#~ "It was not possible to setup the Evolution startup files. Please\n"
-#~ "fix the problem, and restart Evolution"
-#~ msgstr ""
-#~ "Det gick ej att ställa in Evolutions uppstartsfiler. Var vänlig\n"
-#~ "och fixa problemet, och starta om Evolution"
-
-#~ msgid ""
-#~ "An exception occured while trying to load data into the component with "
-#~ "PersistStream"
-#~ msgstr ""
-#~ "Ett undantag uppstod vid laddning av data till komponenten med PersistStream"
-
-#~ msgid "The %s component doesn't support PersistStream!\n"
-#~ msgstr "Komponenten %s stöder inte PersistStream!\n"
-
-#~ msgid ""
-#~ "Evolution detected that the file `%s' is a not a directory.\n"
-#~ "\n"
-#~ "Evolution can rename the file, delete the file or shutdown and\n"
-#~ "let you fix the problem."
-#~ msgstr ""
-#~ "Evolution har upptäckt att filen \"%s\" inte är en katalog.\n"
-#~ "\n"
-#~ "Evolution kan byta namn på filen, ta bort den eller stänga av och\n"
-#~ "låt dig fixa problemet."
-
-#~ msgid "Message status"
-#~ msgstr "Meddelandestatus"
diff --git a/po/tr.po b/po/tr.po
deleted file mode 100644
index b5b96dad9d..0000000000
--- a/po/tr.po
+++ /dev/null
@@ -1,3376 +0,0 @@
-# -------------------------------------------------------
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Fatih Demir <kabalak@gmx.net>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution 0.3.1\n"
-"POT-Creation-Date: 2000-08-05 10:50+0200\n"
-"PO-Revision-Date: 2000-08-05 10:53+0200\n"
-"Last-Translator: Fatih Demir <kabalak@gmx.net>\n"
-"Language-Team: Turkish <tr@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-9\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/gui/component/addressbook-factory.c:59 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "Bonobo'yu baþlatamadým"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "türler"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr "Bu türlere ait olan birimler :"
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "Varolan türler :"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/event-editor.c:1168
-msgid "FIXME: _Appointment"
-msgstr "ABY : _Toplantý"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/event-editor.c:1169
-msgid "FIXME: Meeting Re_quest"
-msgstr "ABY : Toplantý is_teði"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/event-editor.c:1171
-msgid "FIXME: _Mail Message"
-msgstr "ABY : e_Posta iletisi"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/event-editor.c:1172
-msgid "FIXME: _Contact"
-msgstr "ABY : _Tanýk"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/event-editor.c:1173
-msgid "FIXME: _Task"
-msgstr "ABY : _Görev"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/event-editor.c:1174
-msgid "FIXME: Task _Request"
-msgstr "ABY : Görev _isteði"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/event-editor.c:1175
-msgid "FIXME: _Journal Entry"
-msgstr "ABY : Gü_nlük birimi"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/event-editor.c:1176
-msgid "FIXME: _Note"
-msgstr "ABY : _Not"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/event-editor.c:1178 calendar/gui/event-editor.c:1285
-msgid "FIXME: Ch_oose Form..."
-msgstr "ABY : Seçme _formu ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/event-editor.c:1183
-msgid "FIXME: _Memo Style"
-msgstr "ABY : _Aný stili"
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/event-editor.c:1185
-msgid "FIXME: Define Print _Styles..."
-msgstr "ABY : Yazdýrma _stilini belirle"
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/event-editor.c:1192
-msgid "FIXME: S_end"
-msgstr "ABY : Gö_nder"
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/event-editor.c:1196
-msgid "FIXME: Save Attac_hments..."
-msgstr "ABY : Eklem _ekle ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "_Sil"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/event-editor.c:1199
-msgid "FIXME: _Move to Folder..."
-msgstr "ABY : Dizine _taþý ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/event-editor.c:1200
-msgid "FIXME: Cop_y to Folder..."
-msgstr "ABY : Dizine _kopyala ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/event-editor.c:1202
-msgid "Page Set_up"
-msgstr "Sayfa _kurulumu"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/event-editor.c:1203
-msgid "FIXME: Print Pre_view"
-msgstr "ABY : Yazdýrma önizlemesi"
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/event-editor.c:1224
-msgid "FIXME: Paste _Special..."
-msgstr "ABY : Ö_zel yapýþtýr ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/event-editor.c:1229
-msgid "FIXME: Mark as U_nread"
-msgstr "ABY : _Okunmamýþ olarak iþaretle"
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/event-editor.c:1233
-msgid "_Object"
-msgstr "_Nesne"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/event-editor.c:1238 calendar/gui/event-editor.c:1245
-msgid "FIXME: _Item"
-msgstr "ABY : _Birim"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/event-editor.c:1239 calendar/gui/event-editor.c:1246
-msgid "FIXME: _Unread Item"
-msgstr "ABY : _Okunmamýþ birim"
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/event-editor.c:1240
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr "ABY : Dizindeki _ilk birim"
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/event-editor.c:1247
-msgid "FIXME: _Last Item in Folder"
-msgstr "ABY : Dizindeki _son birim"
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/event-editor.c:1252
-msgid "FIXME: _Standard"
-msgstr "ABY : _Vasat"
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/event-editor.c:1254
-msgid "FIXME: __Formatting"
-msgstr "ABY : __Þekillendirme"
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/event-editor.c:1257
-msgid "FIXME: _Customize..."
-msgstr "ABY : _Özelleþtir ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/event-editor.c:1262
-msgid "Pre_vious"
-msgstr "_Geri"
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/event-editor.c:1263
-msgid "Ne_xt"
-msgstr "_Ileri"
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/event-editor.c:1267
-msgid "_Toolbars"
-msgstr "_Araç çubuklarý"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/event-editor.c:1272
-msgid "FIXME: _File..."
-msgstr "ABY : _Dosya ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/event-editor.c:1273
-msgid "FIXME: It_em..."
-msgstr "ABY : Bi_rim ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/event-editor.c:1274
-msgid "FIXME: _Object..."
-msgstr "ABY : _Nesne ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/event-editor.c:1279
-msgid "FIXME: _Font..."
-msgstr "ABY : _Yazý tipi ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/event-editor.c:1280
-msgid "FIXME: _Paragraph..."
-msgstr "ABY : _Fýkra ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/event-editor.c:1287
-msgid "FIXME: Desi_gn This Form"
-msgstr "ABY : Bu formu _düzenle"
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/event-editor.c:1288
-msgid "FIXME: D_esign a Form..."
-msgstr "ABY : _Bir formu düzenle ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/event-editor.c:1290
-msgid "FIXME: Publish _Form..."
-msgstr "ABY : _Formu açýkla ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/event-editor.c:1291
-msgid "FIXME: Pu_blish Form As..."
-msgstr "ABY : Formu far_klý açikla ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/event-editor.c:1293
-msgid "FIXME: Script _Debugger"
-msgstr "ABY : Denetlem çö_zümleyicisi"
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/event-editor.c:1298
-msgid "FIXME: _Spelling..."
-msgstr "ABY : _Imla ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/event-editor.c:1303
-msgid "_Forms"
-msgstr "_Þekiller"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr "ABY : _Yeni tanýk"
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr "ABY : Ayný þi_rketten yeni bir tanýk"
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr "ABY : Tanýða yeni bir _mektup"
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr "ABY : Tanýða yeni bir _ileti"
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr "ABY : Tanýkla yeni bir t_oplantý"
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr "ABY : _Bir toplantýyý tasarý et ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr "ABY : Tanýk için yeni bir _görev"
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr "ABY : Tanýk için yeni bir gü_nlük birimi"
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr "ABY : I_letme için iþaretle ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr "ABY : _Adresin haritasýný göster"
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr "ABY : _Websitesini aç"
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr "ABY : v_Calendat þeklinde ilet"
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/event-editor.c:1316
-msgid "FIXME: For_ward"
-msgstr "ABY : _Ilet"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/event-editor.c:1329
-msgid "_Insert"
-msgstr "_Içer"
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/event-editor.c:1330
-msgid "F_ormat"
-msgstr "Þeki_l"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/event-editor.c:1331 shell/e-shell-view-menu.c:510
-msgid "_Tools"
-msgstr "_Çerezler"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/event-editor.c:1332
-msgid "Actio_ns"
-msgstr "E_ylemler"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "Kaydet ve kapat"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1371
-msgid "Save the appointment and close the dialog box"
-msgstr "Toplantýyý kaydet ve diyaloðu kapat"
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:674
-msgid "Print..."
-msgstr "Yazdýr ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/event-editor.c:1376
-msgid "Print this item"
-msgstr "Bu birimi yazdýrt"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/event-editor.c:1377
-msgid "FIXME: Insert File..."
-msgstr "ABY : Dosya içer ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/event-editor.c:1378
-msgid "Insert a file as an attachment"
-msgstr "Bir dosyayý eklem olarak ekle"
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/gui/component/addressbook.c:426 calendar/gui/gncal-todo.c:508
-#: mail/folder-browser-factory.c:39
-msgid "Delete"
-msgstr "Sil"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/event-editor.c:1387 calendar/gui/gncal-todo.c:336
-msgid "Delete this item"
-msgstr "Bu birimi sil"
-
-#: addressbook/contact-editor/e-contact-editor.c:856
-#: calendar/gui/event-editor.c:1389
-msgid "FIXME: Previous"
-msgstr "ABY : Geri"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/event-editor.c:1390
-msgid "Go to the previous item"
-msgstr "Gerideki birime git"
-
-#: addressbook/contact-editor/e-contact-editor.c:859
-#: calendar/gui/event-editor.c:1391
-msgid "FIXME: Next"
-msgstr "ABY : Ileri"
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/event-editor.c:1392
-msgid "Go to the next item"
-msgstr "Ilerideki birime git"
-
-#: addressbook/contact-editor/e-contact-editor.c:862
-#: calendar/gui/event-editor.c:1393
-msgid "FIXME: Help"
-msgstr "ABY : Yardým"
-
-#: addressbook/contact-editor/e-contact-editor.c:863
-#: calendar/gui/event-editor.c:1394
-msgid "See online help"
-msgstr "Yardýma bak"
-
-#: addressbook/contact-editor/e-contact-editor.c:1278
-msgid "Assistant"
-msgstr "Yardýmcý"
-
-#: addressbook/contact-editor/e-contact-editor.c:1279
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Business"
-msgstr "Meslek"
-
-#: addressbook/contact-editor/e-contact-editor.c:1280
-msgid "Business 2"
-msgstr "2.nci Meslek"
-
-#: addressbook/contact-editor/e-contact-editor.c:1281
-msgid "Business Fax"
-msgstr "Mesleki Faks"
-
-#: addressbook/contact-editor/e-contact-editor.c:1282
-msgid "Callback"
-msgstr "Geri arama"
-
-#: addressbook/contact-editor/e-contact-editor.c:1283
-msgid "Car"
-msgstr "Araba"
-
-#: addressbook/contact-editor/e-contact-editor.c:1284
-msgid "Company"
-msgstr "Þirket"
-
-#: addressbook/contact-editor/e-contact-editor.c:1285
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Home"
-msgstr "Ev"
-
-#: addressbook/contact-editor/e-contact-editor.c:1286
-msgid "Home 2"
-msgstr "2.nci ev"
-
-#: addressbook/contact-editor/e-contact-editor.c:1287
-msgid "Home Fax"
-msgstr "Ev faksý"
-
-#: addressbook/contact-editor/e-contact-editor.c:1288
-msgid "ISDN"
-msgstr "ISDN"
-
-#: addressbook/contact-editor/e-contact-editor.c:1289
-msgid "Mobile"
-msgstr "Cep"
-
-#: addressbook/contact-editor/e-contact-editor.c:1290
-#: addressbook/contact-editor/e-contact-editor.c:1385
-msgid "Other"
-msgstr "Baþka"
-
-#: addressbook/contact-editor/e-contact-editor.c:1291
-msgid "Other Fax"
-msgstr "Baþka faks"
-
-#: addressbook/contact-editor/e-contact-editor.c:1292
-msgid "Pager"
-msgstr "Haberleyici"
-
-#: addressbook/contact-editor/e-contact-editor.c:1293
-msgid "Primary"
-msgstr "Ilk"
-
-#: addressbook/contact-editor/e-contact-editor.c:1294
-msgid "Radio"
-msgstr "Radyo"
-
-#: addressbook/contact-editor/e-contact-editor.c:1295
-msgid "Telex"
-msgstr "Teleks"
-
-#: addressbook/contact-editor/e-contact-editor.c:1296
-msgid "TTY/TDD"
-msgstr "TTY/TDD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1340
-msgid "Primary Email"
-msgstr "Ilk ePosta adresi"
-
-#: addressbook/contact-editor/e-contact-editor.c:1341
-msgid "Email 2"
-msgstr "2.nci ePosta adresi"
-
-#: addressbook/contact-editor/e-contact-editor.c:1342
-msgid "Email 3"
-msgstr "3.ncü ePosta adresi"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "_Ekle"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "Telefon tipleri"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "Yeni telefon tipi"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-msgid "Add"
-msgstr "Ekle"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "Tanýk editörü"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "_Tam isim ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr "Farklý dosyala :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr "Web sitesi :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr "_HTML ePostalarýný kabul ediyor"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "Adres :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "_Meslek"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "_Ev"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr "Mesleki _Faks"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "_Cep"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr "_Meslek"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr "_Bu ePostalaþma adresidir"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "_Tanýk ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-msgid "Ca_tegories..."
-msgstr "Tü_rler ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr "Meslek _tanýmlamasý :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "Þ_irket :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-msgid "General"
-msgstr "Genel"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "_Bölük :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "_Ofis :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "_Meslek :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "_Lakap :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr "_Zýpzak :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "_Doðum günü :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr "_Yardýmcý'sýnýn adý :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr "_Menajerinin adý :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr "_Yýldönümü :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "_Notlar :"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-msgid "Details"
-msgstr "Ince konular"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr "Tam ismi kontrol et"
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr "Ü_styazý :"
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr "_Ad :"
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr "_Orta eki :"
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr "_Soyad :"
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr "S_onek :"
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"Bay\n"
-"Bn.\n"
-"Dr.\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-"\n"
-"Büyük\n"
-"Küçük\n"
-"I.\n"
-"II.\n"
-"III.\n"
-"Esq.\n"
-
-#: addressbook/gui/component/addressbook.c:420
-#: calendar/gui/calendar-commands.c:544
-msgid "New"
-msgstr "Yeni"
-
-#: addressbook/gui/component/addressbook.c:420
-msgid "Create a new contact"
-msgstr "Yeni bir tanýk birimi yarat"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find"
-msgstr "Bul"
-
-#: addressbook/gui/component/addressbook.c:424
-msgid "Find a contact"
-msgstr "Bir tanýðý bul"
-
-#: addressbook/gui/component/addressbook.c:425
-#: addressbook/gui/component/addressbook.c:493
-#: calendar/gui/calendar-commands.c:548 mail/folder-browser-factory.c:37
-msgid "Print"
-msgstr "Yazdýr"
-
-#: addressbook/gui/component/addressbook.c:425
-msgid "Print contacts"
-msgstr "Tanýklarýy azdýrt"
-
-#: addressbook/gui/component/addressbook.c:426
-msgid "Delete a contact"
-msgstr "Tanýðý sil"
-
-#: addressbook/gui/component/addressbook.c:500
-#: addressbook/gui/component/addressbook.c:1035
-msgid "As _Table"
-msgstr "Çi_zgiye olarak"
-
-#: addressbook/gui/component/addressbook.c:507
-msgid "_New Contact"
-msgstr "_Yeni tanýk"
-
-#: addressbook/gui/component/addressbook.c:515
-msgid "N_ew Directory Server"
-msgstr "Yeni _dizin sunucusu"
-
-#: addressbook/gui/component/addressbook.c:594
-msgid "Unable to open addressbook"
-msgstr "Adres defterini açamadým"
-
-#: addressbook/gui/component/addressbook.c:599
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-"Bu adres defterini açamadýk. Bu ya yanlýþ bir\n"
-"URI'nin verilmesinden dolayý ya da LDAP desteði \n"
-"olmayan bir sunucuya ulaþmaya denediðinden dolayýdýr.\n"
-"Bir URI verdinsen, URI'nin doðru olmasýndan emin olduktan sonra\n"
-"bir def'a daha dene. Bir URI vermediysen, bir LDAP sunucusuna\n"
-"eriþmeye uðraþtýn. LDAp'i kullanmak istiyorsan, OpenLDAP'i\n"
-"yükleyip, Evolution'u yeniden denetleyip yeniden yüklemek zorundasýn.\n"
-
-#: addressbook/gui/component/addressbook.c:939
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr "VCard olarak kaydet"
-
-#: addressbook/gui/component/addressbook.c:1006
-msgid "* Click here to add a contact *"
-msgstr "* Bir tanýðý eklemek için buraya týkla *"
-
-#: addressbook/gui/component/addressbook.c:1042
-msgid "As _Minicards"
-msgstr "_Ufak kartlar olarak"
-
-#: addressbook/gui/component/addressbook.c:1093
-msgid "The URI that the Folder Browser will display"
-msgstr "Dizin Gezginini gösterecek olan URI"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "pencere2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr "a"
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr "b"
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr "c"
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr "d"
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr "e"
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr "f"
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr "g"
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr "h"
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr "i"
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr "j"
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr "k"
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr "l"
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr "m"
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr "n"
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr "o"
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr "p"
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr "q"
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr "r"
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr "s"
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr "t"
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr "u"
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr "v"
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr "w"
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr "x"
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr "y"
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr "z"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "Anlatým :"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "LDAP Sunucusu :"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "Kapý no. :"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr "Kök DN :"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "Isim :"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-"\n"
-"\n"
-"Bu bakýþta gösterilecek birimler yok\n"
-"\n"
-"Buraya çift-týklayarak bir tanýk birimini yarat."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "Sayfa _kurulumu :"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "Stil adý :"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "Önizleme :"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "Seçenekler"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr "Içer :"
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr "Bölümler :"
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr "Peþpeþe"
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr "Mektup tab'lerinin tarafa koy"
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr "Her bir mektup için üstyazý"
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr "Yeni bir sayfayla baþla"
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "Sütunlarýn sayýsý :"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr "Sonda boþ formlar olsun :"
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "Yazý tipleri"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "Yazý tipi ..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr "Baþlýklar"
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr "10 punto Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "Içerik"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr "8 punto Tahoma"
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr "Gölgeleme"
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr "Gri gölgelemeyi kullanarak yazdýrt"
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "Þekil"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "Kaðýt"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "Tip :"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-msgid "label26"
-msgstr "yafta26"
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr "Ebatlar :"
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "En :"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "Yükseklik :"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr "Kaðýt kaynaðý :"
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr "Kenarlar"
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr "Üst :"
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr "Alt :"
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr "Sol :"
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr "Sað :"
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "Sayfa"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "Boyut :"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "Taraflama"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "Portre"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "Manzara"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "Baþlýk"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr "Son :"
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr "Ikili sayfalarý ters çevir"
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr "Baþlýk/son"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:544
-msgid "am"
-msgstr " ö.ö."
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:543
-msgid "pm"
-msgstr " ö.s"
-
-#: calendar/gui/calendar-commands.c:56
-msgid "Outline:"
-msgstr "Dýþlým :"
-
-#: calendar/gui/calendar-commands.c:57
-msgid "Headings:"
-msgstr "Baþlýklar :"
-
-#: calendar/gui/calendar-commands.c:58
-msgid "Empty days:"
-msgstr "Boþ günler :"
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Appointments:"
-msgstr "T_oplantýlar :"
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Highlighted day:"
-msgstr "Öne getirilmiþ gün :"
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Day numbers:"
-msgstr "Gün sayýsý :"
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Current day's number:"
-msgstr "Þu anki günün numarasý :"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "To-Do item that is not yet due:"
-msgstr "Daha geçmemiþ \"Yapýlacak\" birimi :"
-
-#: calendar/gui/calendar-commands.c:64
-msgid "To-Do item that is due today:"
-msgstr "Bugün geçecek olan \"Yapýlacak\" birimi :"
-
-#: calendar/gui/calendar-commands.c:65
-msgid "To-Do item that is overdue:"
-msgstr "Zamaný geçmiþ \"Yapýlacak\" birimi :"
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr "Gnome Takvimi"
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr "GNOME þahsi takvim ve görev yönetmeni ."
-
-#: calendar/gui/calendar-commands.c:434
-msgid "File not found"
-msgstr "Dosya bulunamadý"
-
-#: calendar/gui/calendar-commands.c:456
-msgid "Open calendar"
-msgstr "Takvimi aç"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Save calendar"
-msgstr "Takvimi kaydet"
-
-#: calendar/gui/calendar-commands.c:522 calendar/gui/gncal-todo.c:722
-#: calendar/gui/gncal-todo.c:726
-msgid "Day"
-msgstr "Gün"
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Show 1 day"
-msgstr "1 günü göster"
-
-#: calendar/gui/calendar-commands.c:525
-msgid "5 Days"
-msgstr "5 gün"
-
-#: calendar/gui/calendar-commands.c:525
-msgid "Show the working week"
-msgstr "Çalýþma haftasýný göster"
-
-#: calendar/gui/calendar-commands.c:528 calendar/gui/gncal-todo.c:721
-msgid "Week"
-msgstr "Hafta"
-
-#: calendar/gui/calendar-commands.c:528
-msgid "Show 1 week"
-msgstr "2 haftayý öster"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Month"
-msgstr "Ay"
-
-#: calendar/gui/calendar-commands.c:531
-msgid "Show 1 month"
-msgstr "1 ayý göster"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Year"
-msgstr "Yýl"
-
-#: calendar/gui/calendar-commands.c:535
-msgid "Show 1 year"
-msgstr "1 seneyi göster"
-
-#: calendar/gui/calendar-commands.c:544 calendar/gui/calendar-commands.c:683
-msgid "Create a new appointment"
-msgstr "Yeni bir toplantý"
-
-#: calendar/gui/calendar-commands.c:548 calendar/gui/calendar-commands.c:675
-msgid "Print this calendar"
-msgstr "Bu takvimi yazdýrt"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Prev"
-msgstr "Geri"
-
-#: calendar/gui/calendar-commands.c:552
-msgid "Go back in time"
-msgstr "Zamanda geri git"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Today"
-msgstr "Bugün"
-
-#: calendar/gui/calendar-commands.c:553
-msgid "Go to present time"
-msgstr "Þimdiki zamana git"
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Next"
-msgstr "Ileri"
-
-#: calendar/gui/calendar-commands.c:554
-msgid "Go forward in time"
-msgstr "Zamanda ileri git"
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to"
-msgstr "Git"
-
-#: calendar/gui/calendar-commands.c:558
-msgid "Go to a specific date"
-msgstr "Belirli bir tarihe git"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:660
-msgid "New Ca_lendar"
-msgstr "Yeni _takvim"
-
-#: calendar/gui/calendar-commands.c:661
-msgid "Create a new calendar"
-msgstr "Yeni bir takvimi yarat"
-
-#: calendar/gui/calendar-commands.c:664
-msgid "Open Ca_lendar"
-msgstr "_Takvimi aç"
-
-#: calendar/gui/calendar-commands.c:665
-msgid "Open a calendar"
-msgstr "Bir takvimi aç"
-
-#: calendar/gui/calendar-commands.c:669 calendar/gui/calendar-commands.c:670
-msgid "Save Calendar As"
-msgstr "Takvimi farklý kaydet"
-
-#: calendar/gui/calendar-commands.c:683
-msgid "_New appointment..."
-msgstr "_Yeni toplantý ..."
-
-#: calendar/gui/calendar-commands.c:688
-msgid "New appointment for _today..."
-msgstr "_Bugün için yeni bir toplantý ..."
-
-#: calendar/gui/calendar-commands.c:689
-msgid "Create a new appointment for today"
-msgstr "Bugün için yeni bir toplantý yarat"
-
-#: calendar/gui/calendar-commands.c:697 calendar/gui/prop.c:712
-msgid "Preferences"
-msgstr "Ayarlar"
-
-#: calendar/gui/calendar-commands.c:704 calendar/gui/calendar-commands.c:705
-msgid "About Calendar"
-msgstr "Takvým bilgisi"
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:747
-#, c-format
-msgid "%s%s"
-msgstr "%s%s"
-
-#: calendar/gui/calendar-commands.c:747
-msgid "'s calendar"
-msgstr "'in takvimi"
-
-#: calendar/gui/control-factory.c:136
-msgid "The URI that the calendar will display"
-msgstr "Takvimin gösterecek olduðu URI"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:181
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr "%A %b %d %Y %H:%M'de ikaz et"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:188
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr "%A %b %d %Y %H:%M'deki toplantý için bildirme"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr "Kapat"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1070
-msgid "Snooze"
-msgstr "Ikaz et"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-msgid "Edit appointment"
-msgstr "Toplantýyý deðiþtir"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr "Ikaz zamaný ( dakika )"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr "%02i dakika bölmeleri"
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-msgid "New appointment..."
-msgstr "Yeni toplantý ..."
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr "Bu toplantýyý deðiþtir .."
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-msgid "Delete this appointment"
-msgstr "Bu toplantýyý sil"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr "Bu toplantýyý taþýnabilir yap"
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-msgid "Delete this occurrence"
-msgstr "Bu oluþumu sil"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr "Yekin oluþumlarý sil"
-
-#: calendar/gui/event-editor.c:291
-msgid "Edit Appointment"
-msgstr "Toplantýyý deðiþtir"
-
-#: calendar/gui/event-editor.c:296
-msgid "No summary"
-msgstr "Toplama yok"
-
-#: calendar/gui/event-editor.c:300
-#, c-format
-msgid "Appointment - %s"
-msgstr "Toplantý - %s"
-
-#: calendar/gui/event-editor.c:303
-#, c-format
-msgid "Task - %s"
-msgstr "Görev - %s"
-
-#: calendar/gui/event-editor.c:306
-#, c-format
-msgid "Journal entry - %s"
-msgstr "Günlük birimi - %s"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:622 calendar/gui/event-editor.c:718
-msgid "?"
-msgstr "?"
-
-#: calendar/gui/event-editor.c:1198
-msgid "FIXME: _Delete"
-msgstr "ABY : _Sil"
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Ca_lendar..."
-msgstr "ABY : _Takvim ..."
-
-#: calendar/gui/event-editor.c:1300
-msgid "FIXME: Chec_k Names"
-msgstr "ABY : Isimleri gözden g_eçir"
-
-#: calendar/gui/event-editor.c:1301
-msgid "FIXME: Address _Book..."
-msgstr "ABY : Adres _defteri ..."
-
-#: calendar/gui/event-editor.c:1308
-msgid "FIXME: _New Appointment"
-msgstr "ABY : _Yeni toplantý"
-
-#: calendar/gui/event-editor.c:1310
-msgid "FIXME: Rec_urrence..."
-msgstr "ABY : _Kaynaklar ..."
-
-#: calendar/gui/event-editor.c:1312
-msgid "FIXME: Invite _Attendees..."
-msgstr "ABY : _Ziyaretçileri davet et .."
-
-#: calendar/gui/event-editor.c:1313
-msgid "FIXME: C_ancel Invitation..."
-msgstr "ABY : Daveti i_ptal et ..."
-
-#: calendar/gui/event-editor.c:1315
-msgid "FIXME: Forward as v_Calendar"
-msgstr "ABY : v_Calendat þeklinde ilet"
-
-#: calendar/gui/event-editor.c:1370
-msgid "FIXME: Save and Close"
-msgstr "ABY : KAydet ve kapat"
-
-#: calendar/gui/event-editor.c:1375
-msgid "FIXME: Print..."
-msgstr "ABY : Yazdýr ..."
-
-#: calendar/gui/event-editor.c:1380
-msgid "FIXME: Recurrence..."
-msgstr "ABY : Geliþler ..."
-
-#: calendar/gui/event-editor.c:1381
-msgid "Configure recurrence rules"
-msgstr "Geliþ kurallarýný ayarla"
-
-#: calendar/gui/event-editor.c:1383
-msgid "FIXME: Invite Attendees..."
-msgstr "ABY : Ziyaretçileri davet et .."
-
-#: calendar/gui/event-editor.c:1384
-msgid "Invite attendees to a meeting"
-msgstr "Ziyaretcýleri davet et"
-
-#: calendar/gui/event-editor.c:1386
-msgid "FIXME: Delete"
-msgstr "ABY : Sil"
-
-#: calendar/gui/event-editor.c:1828
-msgid "%a %b %d %Y"
-msgstr "%a %b %d %Y"
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr "ocak"
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr "þubat"
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr "mart"
-
-#: calendar/gui/getdate.y:394
-msgid "april"
-msgstr "nisan"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr "mayýs"
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr "haziran"
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr "temmuz"
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr "aðustos"
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr "eylül"
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr "eylül"
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr "ekim"
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr "kasým"
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr "aralýk"
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr "pazar"
-
-#: calendar/gui/getdate.y:405
-msgid "monday"
-msgstr "pazartesi"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr "salý"
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr "salý"
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr "çarþamba"
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr "çþb."
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr "perþembe"
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr "pþb."
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr "perþ."
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr "cuma"
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr "cumartesi"
-
-#: calendar/gui/getdate.y:420
-msgid "year"
-msgstr "yýl"
-
-#: calendar/gui/getdate.y:421
-msgid "month"
-msgstr "ay"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr "geceleyin"
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr "hafta"
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr "gün"
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr "saat"
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr "dakika"
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr "dak."
-
-#: calendar/gui/getdate.y:428
-msgid "second"
-msgstr "saniye"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr "san."
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr "yarýn"
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr "dün"
-
-#: calendar/gui/getdate.y:437
-msgid "today"
-msgstr "bugün"
-
-#: calendar/gui/getdate.y:438
-msgid "now"
-msgstr "þimdi"
-
-#: calendar/gui/getdate.y:439
-msgid "last"
-msgstr "son"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr "bu"
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr "ileri"
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr "ilk"
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr "üçüncü"
-
-#: calendar/gui/getdate.y:445
-msgid "fourth"
-msgstr "dürdüncü"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr "beþinci"
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr "altýncý"
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr "yedinci"
-
-#: calendar/gui/getdate.y:449
-msgid "eighth"
-msgstr "sekizinci"
-
-#: calendar/gui/getdate.y:450
-msgid "ninth"
-msgstr "dokuzuncu"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr "onuncu"
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr "onbirinci"
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr "onikinci"
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr "önce"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Create to-do item"
-msgstr "Bir \"Yapýlacak\" birimi yarat"
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Edit to-do item"
-msgstr "Bir \"Yapýlacak\" birimini deðiþtir"
-
-#: calendar/gui/gncal-todo.c:176
-msgid "Summary:"
-msgstr "Toplama :"
-
-#: calendar/gui/gncal-todo.c:186
-msgid "Due Date:"
-msgstr "Bu tarihe kadar :"
-
-#: calendar/gui/gncal-todo.c:195
-msgid "Priority:"
-msgstr "Önem :"
-
-#: calendar/gui/gncal-todo.c:212
-msgid "Item Comments:"
-msgstr "Birim anlatýmý :"
-
-#: calendar/gui/gncal-todo.c:334
-msgid "Add to-do item..."
-msgstr "Bir \"Yapýlacak\" birimini ekle ..."
-
-#: calendar/gui/gncal-todo.c:335
-msgid "Edit this item..."
-msgstr "Bu birimi deðiþtir ..."
-
-#: calendar/gui/gncal-todo.c:434
-msgid "Summary"
-msgstr "Toplama"
-
-#: calendar/gui/gncal-todo.c:435 calendar/gui/prop.c:604
-msgid "Due Date"
-msgstr "Tarihe göre"
-
-#: calendar/gui/gncal-todo.c:436 calendar/gui/prop.c:605
-#: mail/message-list.c:474
-msgid "Priority"
-msgstr "Önem"
-
-#: calendar/gui/gncal-todo.c:437
-msgid "Time Left"
-msgstr "Kalan zaman"
-
-#. Label
-#: calendar/gui/gncal-todo.c:449
-msgid "To-do list"
-msgstr "\"Yapýlacak\"'lar listesi"
-
-#. Add
-#: calendar/gui/gncal-todo.c:488
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "Ekle ..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:497
-msgid "Edit..."
-msgstr "Deðiþtir ..."
-
-#: calendar/gui/gncal-todo.c:721
-msgid "Weeks"
-msgstr "Hafta"
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Days"
-msgstr "Gün"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hours"
-msgstr "Saat"
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hour"
-msgstr "Saat"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minutes"
-msgstr "Dakika"
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minute"
-msgstr "Dakika"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Seconds"
-msgstr "Saniye"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-msgid "Second"
-msgstr "Saniye"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1078
-#: calendar/gui/gnome-cal.c:1134
-msgid "Reminder of your appointment at "
-msgstr "Toplantý anýtlayýcýsý :"
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1083 calendar/gui/gnome-cal.c:1138
-msgid "Ok"
-msgstr "Oldu"
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr "Paz"
-
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr "P.t"
-
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr "Sal"
-
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr "Çar"
-
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr "Per"
-
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr "Cum"
-
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr "C.t"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "Yýl :"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr "Tarihe git"
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-"Gitmek istediðin tarihi belirt.\n"
-"Bir güne týkladýðýn zaman, o tarihe\n"
-"gideceksin."
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr "Bugüne git"
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr "1.nci"
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr "2.nci"
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr "3.ncü"
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr "4.ncü"
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr "5.nci"
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr "6.ncý"
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr "7.nci"
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr "8.nci"
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr "8.ncu"
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr "10.ncu"
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr "11.nci"
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr "12.nci"
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr "13.ncü"
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr "14.ncü"
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr "15.nci"
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr "16.ncý"
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr "17.nci"
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr "18.nci"
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr "19.ncu"
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr "20.nci"
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr "21.nci"
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr "22.nci"
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr "23.ncü"
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr "24.ncü"
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr "25.nci"
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr "26.ncý"
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr "27.nci"
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr "28.nci"
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr "29.ncu"
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr "39.ncu"
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr "31.nci"
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr "Paz."
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr "P.tesi"
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr "Salý"
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr "Çarþ."
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr "Perþ."
-
-#: calendar/gui/print.c:326
-msgid "Fr"
-msgstr "Cuma"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr "C.tesi"
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr "\"Yapýlacak\" birimleri"
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr "geçerli gün ( %a %b %d %Y )"
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr "%a"
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "Geçerli hafta ( %s %s %d - %s %d %d )"
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "Geçerli hafta ( %s %s %d - %s %s %d %d )"
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "Geçerli hafta ( %s %s %d %d - %s %s %d %d )"
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr "Geçerli ay ( %a %Y )"
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr "Geçerli yýl ( %Y )"
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr "Takvimi yazdýr"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr "Yazdýrma önizlemesi"
-
-#: calendar/gui/prop.c:330
-msgid "Time display"
-msgstr "Zaman gösterimi"
-
-#. Time format
-#: calendar/gui/prop.c:334
-msgid "Time format"
-msgstr "Zaman þekli"
-
-#: calendar/gui/prop.c:335
-msgid "12-hour (AM/PM)"
-msgstr "12 saat (ö.ö./ö.s.)"
-
-#: calendar/gui/prop.c:336
-msgid "24-hour"
-msgstr "24 saat"
-
-#. Weeks start on
-#: calendar/gui/prop.c:346
-msgid "Weeks start on"
-msgstr "Hafta'nýn baþlama günü"
-
-#: calendar/gui/prop.c:347
-msgid "Sunday"
-msgstr "Pazar"
-
-#: calendar/gui/prop.c:348
-msgid "Monday"
-msgstr "Pazartesi"
-
-#. Day range
-#: calendar/gui/prop.c:358
-msgid "Day range"
-msgstr "Gün sýnýrlarý"
-
-#: calendar/gui/prop.c:369
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-"Gön ve hafta bakýþýnda gösterilinecek baþlama ve\n"
-"bitme saatlerini belirle .\n"
-"Bu saatlerin dýþýnda kalan saatler normal bakýþta\n"
-"gösterilmeyecektir."
-
-#: calendar/gui/prop.c:385
-msgid "Day start:"
-msgstr "Gün baþlangýçý :"
-
-#: calendar/gui/prop.c:396
-msgid "Day end:"
-msgstr "Gün bitimi :"
-
-#: calendar/gui/prop.c:519
-msgid "Colors for display"
-msgstr "Gösterim renkler"
-
-#: calendar/gui/prop.c:522
-msgid "Colors"
-msgstr "Renkler"
-
-#: calendar/gui/prop.c:599
-msgid "Show on TODO List:"
-msgstr "\"Yapýlacak\"'lar listesinde göster :"
-
-#: calendar/gui/prop.c:606
-msgid "Time Until Due"
-msgstr "Geçmesine kalan zaman"
-
-#: calendar/gui/prop.c:637
-msgid "To Do List style options:"
-msgstr "\"Yapýlacak\" stil seçenekleri :"
-
-#: calendar/gui/prop.c:642
-msgid "Highlight overdue items"
-msgstr "Zamaný geçmiþ birimleri \"gözönüne\" ser"
-
-#: calendar/gui/prop.c:645
-msgid "Highlight not yet due items"
-msgstr "Daha zamaný geçmemiþ bilgileri \"gözönüne\" ser"
-
-#: calendar/gui/prop.c:648
-msgid "Highlight items due today"
-msgstr "Bugün zamaný dolacak birimleri \"gözönüne\" ser"
-
-#: calendar/gui/prop.c:678
-msgid "To Do List Properties"
-msgstr "\"Yapýlacak\"'lar listesi özellikler"
-
-#: calendar/gui/prop.c:681
-msgid "To Do List"
-msgstr "\"Yapýlacak\"'lar listesi"
-
-#: calendar/gui/prop.c:780
-msgid "Alarms"
-msgstr "Ikazlar"
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:783
-msgid "Alarm Properties"
-msgstr "Ikaz özellikleri"
-
-#: calendar/gui/prop.c:793
-msgid "Beep on display alarms"
-msgstr "Ekran ikazlarýnda týngýrtý yap"
-
-#: calendar/gui/prop.c:803
-msgid "Audio alarms timeout after"
-msgstr "Sedai ikazlarý kapatma zamaný"
-
-#: calendar/gui/prop.c:814 calendar/gui/prop.c:831
-msgid " seconds"
-msgstr " saniye"
-
-#: calendar/gui/prop.c:820
-msgid "Enable snoozing for "
-msgstr "Ikazlamayý aç :"
-
-#. populate default frame/box
-#: calendar/gui/prop.c:836
-msgid "Defaults"
-msgstr "Ince ayarlar"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut"
-msgstr "Kes"
-
-#: composer/e-msg-composer-address-dialog.c:184
-msgid "Cut selected item into clipboard"
-msgstr "Seçili birimi arabelleðe kes"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy"
-msgstr "Kopyala"
-
-#: composer/e-msg-composer-address-dialog.c:188
-msgid "Copy selected item into clipboard"
-msgstr "Seçili birimi arabelleðe kopyala"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste"
-msgstr "Yapýþtýr"
-
-#: composer/e-msg-composer-address-dialog.c:192
-#: composer/e-msg-composer-address-dialog.c:200
-msgid "Paste item from clipboard"
-msgstr "Birimi arabellekten yapýþtýr"
-
-#: composer/e-msg-composer-address-dialog.c:528
-msgid "Select recipients' addresses"
-msgstr "Gönderilecek adresleri belirle"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr "Alýcýlar listesi :"
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "Ara ..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "Isim"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-msgid "Address"
-msgstr "Adres"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "Özellikler ..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "Gn : >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc : >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc : >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr "yafta9"
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr "yafta7"
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr "yafta8"
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 bayt"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u bayt"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1f bin bayt"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1f milyon bayt"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1f milyar bayt"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "Eklem ekle"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "Sil"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "Seçili birimleri eklemler listesinden sil"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "Eklem ekle ..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "Iletiyi bir dosya ekle"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "Eklem özellikleri"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "MIME türü :"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "Dosya adý :"
-
-#: composer/e-msg-composer-hdrs.c:174
-msgid "Click here for the address book"
-msgstr "Adres defteri için buraya týkla"
-
-#: composer/e-msg-composer-hdrs.c:216
-msgid "To:"
-msgstr "Gn:"
-
-#: composer/e-msg-composer-hdrs.c:217
-msgid "Enter the recipients of the message"
-msgstr "Iletinin gönderildiði kiþiler"
-
-#: composer/e-msg-composer-hdrs.c:221
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:222
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "Iletinin kopyasýnýn gönderilecek olunduðu adresler"
-
-#: composer/e-msg-composer-hdrs.c:227
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:228
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"Iletinin \"kür\" kopyalarýnýn gönderilecek olunduðu adresleri ver ; bunlar "
-"kendilerini iletinin gönderildiði kiþiler arasýn da görmeyecektir ."
-
-#: composer/e-msg-composer-hdrs.c:234
-msgid "Subject:"
-msgstr "Konu :"
-
-#: composer/e-msg-composer-hdrs.c:235
-msgid "Enter the subject of the mail"
-msgstr "Iletinin konusunu ver"
-
-#: composer/e-msg-composer.c:444
-msgid "Save as..."
-msgstr "Farklý kaydet ..."
-
-#: composer/e-msg-composer.c:455
-#, c-format
-msgid "Error saving file: %s"
-msgstr "`%s' dosyasýný kaydederken hata oldu"
-
-#: composer/e-msg-composer.c:475
-#, c-format
-msgid "Error loading file: %s"
-msgstr "`%s' dosyasýný yüklerken hata oldu"
-
-#: composer/e-msg-composer.c:494
-msgid "Discard this message?"
-msgstr "Bu iletiyi unutalým mý ?"
-
-#: composer/e-msg-composer.c:511
-msgid "Open file"
-msgstr "Dosyayý aç"
-
-#: composer/e-msg-composer.c:623
-msgid "That file does not exist."
-msgstr "Böyle bir dosya yok ."
-
-#: composer/e-msg-composer.c:633
-msgid "That is not a regular file."
-msgstr "Bu normal bir dosya deðildir ."
-
-#: composer/e-msg-composer.c:643
-msgid "That file exists but is not readable."
-msgstr "Bu dosya vardýr ama okunabilir deðil ."
-
-#: composer/e-msg-composer.c:653
-msgid "That file appeared accesible but open(2) failed."
-msgstr "Bu dosya eriþilebilinir gibiydi amma open(2)-çaðrýsý baþarýsýz oldu ."
-
-#: composer/e-msg-composer.c:675
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-"Bu dosya çok büyük ( 100 KB'den büyük ! ) .\n"
-"Bu dosyayý içermekten emin misin ?"
-
-#: composer/e-msg-composer.c:696
-msgid "An error occurred while reading the file."
-msgstr "Dosyayý okurken bir hata oldu ."
-
-#: composer/e-msg-composer.c:792 shell/e-shell-view-menu.c:433
-msgid "_File"
-msgstr "_Dosya"
-
-#: composer/e-msg-composer.c:798
-msgid "_Open..."
-msgstr "_Aç ..."
-
-#: composer/e-msg-composer.c:799
-msgid "Load a previously saved message"
-msgstr "Önceden kaydedilmiþ iletiyi yükle"
-
-#: composer/e-msg-composer.c:807
-msgid "_Save..."
-msgstr "_Farklý kaydet ..."
-
-#: composer/e-msg-composer.c:808
-msgid "Save message"
-msgstr "Iletiyi kaydet"
-
-#: composer/e-msg-composer.c:816
-msgid "_Save as..."
-msgstr "_Farklý kaydet ..."
-
-#: composer/e-msg-composer.c:817
-msgid "Save message with a different name"
-msgstr "Iletiyi faklý bir isim altýnda kaydet"
-
-#: composer/e-msg-composer.c:825
-msgid "Save in _folder..."
-msgstr "_Dizinde kaydet ..."
-
-#: composer/e-msg-composer.c:826
-msgid "Save the message in a specified folder"
-msgstr "Iletiyi belirlenen dizinde kaydet"
-
-#: composer/e-msg-composer.c:835
-msgid "_Insert text file... (FIXME)"
-msgstr "_Metin dosyasýný içer ... ( ABY )"
-
-#: composer/e-msg-composer.c:836
-msgid "Insert a file as text into the message"
-msgstr "Bir dosyayý metin olarak ekle"
-
-#: composer/e-msg-composer.c:845
-msgid "_Send"
-msgstr "_Gönder"
-
-#: composer/e-msg-composer.c:846
-msgid "Send the message"
-msgstr "Iletiyi gönder"
-
-#: composer/e-msg-composer.c:856
-msgid "_Close..."
-msgstr "_Kapat"
-
-#: composer/e-msg-composer.c:857
-msgid "Quit the message composer"
-msgstr "Ileti tasarýlayýcýsýndan çýk"
-
-#: composer/e-msg-composer.c:870 shell/e-shell-view-menu.c:475
-msgid "_Edit"
-msgstr "_Deðiþtir"
-
-#: composer/e-msg-composer.c:881
-msgid "_Format"
-msgstr "Þe_kil"
-
-#: composer/e-msg-composer.c:887
-msgid "HTML"
-msgstr "HTML"
-
-#: composer/e-msg-composer.c:888
-msgid "Send the mail in HTML format"
-msgstr "ePostayý HTML þeklinde gönder"
-
-#: composer/e-msg-composer.c:901 shell/e-shell-view-menu.c:382
-#: shell/e-shell-view-menu.c:486
-msgid "_View"
-msgstr "_Göster"
-
-#: composer/e-msg-composer.c:907
-msgid "Show _attachments"
-msgstr "_Eklemleri göster"
-
-#: composer/e-msg-composer.c:908
-msgid "Show/hide attachments"
-msgstr "Eklemleri göster/gizle"
-
-#: composer/e-msg-composer.c:941
-msgid "Send"
-msgstr "Gönder"
-
-#: composer/e-msg-composer.c:942
-msgid "Send this message"
-msgstr "Bu iletiyi gönder"
-
-#: composer/e-msg-composer.c:951
-msgid "Attach"
-msgstr "Ekle"
-
-#: composer/e-msg-composer.c:952
-msgid "Attach a file"
-msgstr "Bir dosya ekle"
-
-#: composer/e-msg-composer.c:1139
-msgid "Compose a message"
-msgstr "Bir ileti yaz"
-
-#: mail/component-factory.c:208
-msgid "Cannot initialize Evolution's mail component."
-msgstr "Evolution'in ePosta parçasýný baþlatamadým ."
-
-#: mail/folder-browser-factory.c:23
-msgid "Get mail"
-msgstr "ePosta'yý al"
-
-#: mail/folder-browser-factory.c:23
-msgid "Check for new mail"
-msgstr "Yeni ePosta için bak"
-
-#: mail/folder-browser-factory.c:24
-msgid "Compose"
-msgstr "Yaz"
-
-#: mail/folder-browser-factory.c:24
-msgid "Compose a new message"
-msgstr "Yeni bir ePosta iletisini yaz"
-
-#: mail/folder-browser-factory.c:28
-msgid "Reply"
-msgstr "Cevapla"
-
-#: mail/folder-browser-factory.c:28
-msgid "Reply to the sender of this message"
-msgstr "Iletiyi gönderene cevap ver"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to All"
-msgstr "Hepsine cevapla"
-
-#: mail/folder-browser-factory.c:29
-msgid "Reply to all recipients of this message"
-msgstr "Iletinin yekin alýcýlarýna cevap ver"
-
-#: mail/folder-browser-factory.c:31
-msgid "Forward"
-msgstr "Ilet"
-
-#: mail/folder-browser-factory.c:31
-msgid "Forward this message"
-msgstr "Bu iletiyi ilet"
-
-#: mail/folder-browser-factory.c:35
-msgid "Move"
-msgstr "Taþý"
-
-#: mail/folder-browser-factory.c:35
-msgid "Move message to a new folder"
-msgstr "Iletiyi yeni bir dizine taþý"
-
-#: mail/folder-browser-factory.c:37
-msgid "Print the selected message"
-msgstr "Seçili iletiyi yazdýr"
-
-#: mail/folder-browser-factory.c:39
-msgid "Delete this message"
-msgstr "Bu iletiyi sil"
-
-#: mail/folder-browser-factory.c:60
-msgid "_Threaded Message List"
-msgstr "Iletilerin k_onu listesi"
-
-#: mail/folder-browser-factory.c:73
-msgid "_Mark all messages seen"
-msgstr "_Yekin iletilei görünmüþ olarak iþaretle"
-
-#: mail/folder-browser-factory.c:79
-msgid "_Expunge"
-msgstr "_Temizle"
-
-#: mail/folder-browser-factory.c:85
-msgid "Mail _Filters ..."
-msgstr "ePosta _filtralarý ..."
-
-#: mail/folder-browser-factory.c:91
-msgid "_vFolder Editor ..."
-msgstr "_sanal klasörler editörü ..."
-
-#: mail/folder-browser-factory.c:97
-msgid "_Mail Configuration ..."
-msgstr "_ePosta ayarlarý ..."
-
-#: mail/folder-browser-factory.c:103
-msgid "Forget _Passwords"
-msgstr "_Parolalarý unut"
-
-#: mail/mail-config.c:707
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-"Gönderdiðin ePostalarda kullanýlanacak isim ve ePosta adresini belirle. Ve "
-"istersen üye oldudun örgütün adýný ve imza dosyasý olarak kullanýlacak "
-"dosyanýn adýný belirtebilirsin."
-
-#: mail/mail-config.c:720
-msgid "Full name:"
-msgstr "Tam ismi :"
-
-#: mail/mail-config.c:744
-msgid "Email address:"
-msgstr "ePosta adresi : "
-
-#: mail/mail-config.c:759
-msgid "Organization:"
-msgstr "Örgüt : "
-
-#: mail/mail-config.c:770
-msgid "Signature file:"
-msgstr "Imza dosyasý : "
-
-#: mail/mail-config.c:775
-msgid "Signature File"
-msgstr "Imza Dosyasý"
-
-#: mail/mail-config.c:1188
-msgid "Server:"
-msgstr "Sunucu :"
-
-#: mail/mail-config.c:1194
-msgid "Username:"
-msgstr "Kullanýcý adý :"
-
-#: mail/mail-config.c:1200
-msgid "Path:"
-msgstr "Dizin :"
-
-#: mail/mail-config.c:1208
-msgid "Authentication:"
-msgstr "Doðrulama :"
-
-#: mail/mail-config.c:1220
-msgid "Detect supported types..."
-msgstr "Desteklenen türleri dene ..."
-
-#: mail/mail-config.c:1243
-msgid "Test Settings"
-msgstr "Ayarlarý dene"
-
-#: mail/mail-config.c:1365 mail/mail-config.c:1413
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"ePosta sunucusunun türünü seç ve gerekli bilgileri de verebilirsin. \n"
-"\n"
-"Sunucu bir tanýmlama bekliyorsa o zaman \"Desteklenen türleri dene ...\" "
-"basmasýna öbür bilgiler verdikten sonra basabilirsin ."
-
-#: mail/mail-config.c:1389
-msgid ""
-"Select the kind of news server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-"Kullanýlacak haber sunucusunu seç ve yekin gerekn bilgileri ver"
-"\n"
-"\n"
-"Sunucu bir tanýmlama bekliyorsa o zaman \"Desteklenen türleri dene ...\" "
-"basmasýna öbür bilgiler verdikten sonra basabilirsin ."
-
-#: mail/mail-config.c:1455
-msgid "Edit Identity"
-msgstr "Kimliði deðiþtir"
-
-#: mail/mail-config.c:1457
-msgid "Add Identity"
-msgstr "Kimlik ekle"
-
-#: mail/mail-config.c:1537
-msgid "Edit Source"
-msgstr "Kaynaðý deðiþtir"
-
-#: mail/mail-config.c:1539
-msgid "Add Source"
-msgstr "Kaynak ekle"
-
-#: mail/mail-config.c:1622
-msgid "Edit News Server"
-msgstr "Haber sunucusuyla oyna"
-
-#: mail/mail-config.c:1624
-msgid "Add News Server"
-msgstr "Haber suncusu ekle"
-
-#: mail/mail-ops.c:393
-msgid "Fetching mail"
-msgstr "ePosta'yý alýyorum"
-
-#: mail/mail-ops.c:405
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-"Bu iletinin konusu yok .\n"
-"Vallahi mi göndereyim ?"
-
-#: mail/mail-ops.c:525
-msgid ""
-"You need to configure an identity\n"
-"before you can send mail."
-msgstr ""
-"ePosta göndermeden önce bir ePosta\n"
-"hesabýný ayarlaman lazým."
-
-#: mail/mail-ops.c:801
-msgid "Move message(s) to"
-msgstr "Ileti(leri) buraya taþý "
-
-#: mail/mail-threads.c:483
-msgid "Currently pending operations:"
-msgstr "Þu an geçerli olan eylemler :"
-
-#: mail/mail-threads.c:621
-msgid "Incomplete message written on pipe!"
-msgstr "Tünellemeden bozuk bir ileti geldi !"
-
-#: mail/mail-threads.c:623
-msgid "Error reading commands from dispatching thread."
-msgstr "Konu dizimini komutalarla okurken hata oldu ."
-
-#: mail/mail-threads.c:712
-msgid "Corrupted message from dispatching thread?"
-msgstr "Konu dizimini ayýrtýrken bir ileti bozuk mu cýktý ?"
-
-#: mail/mail-threads.c:814
-msgid "Could not create dialog box."
-msgstr "Diyalog kutusunu yaratamadým ."
-
-#: mail/mail-threads.c:849
-msgid "User cancelled query."
-msgstr "Sorgulamayý kullanýcý durdurdu ."
-
-#: mail/message-list.c:456
-msgid "Online Status"
-msgstr "Baðlý olma durumu"
-
-#: mail/message-list.c:492
-msgid "From"
-msgstr "Gönderen"
-
-#: mail/message-list.c:499
-msgid "Subject"
-msgstr "Konu"
-
-#: mail/message-list.c:506
-msgid "Date"
-msgstr "Tarih"
-
-#: mail/message-list.c:513
-msgid "Received"
-msgstr "Alýndý"
-
-#: mail/message-list.c:520
-msgid "To"
-msgstr "Gn:"
-
-#: mail/message-list.c:527
-msgid "Size"
-msgstr "Boyut"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr "Evolution yüklenmesi"
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr "Bu Evolution'i ilk çalýþtýrmana benziyor ."
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr "\"Oldu\"'ya týklayýp, Evolution kullanýcý dosyalarýný"
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-"%s dizinini yaratamadým\n"
-"\n"
-"Hata : %s"
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-"Dosyalarý `%s''ye\n"
-"kopyalayamadým ."
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "Evolution dosyalarý baþarýlý yüklendi."
-
-#: shell/e-setup.c:108
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please remove it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-"`%s' bir dizin deðildir.\n"
-"Evolution kullanýcý dosyalarýnýn yüklenmesi\n"
-"için o'nu sil."
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"%s dizinini yaratamadým\n"
-" "
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr "Belirtilen dizin adý geçerli deðildir ."
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr "Evolution - Yeni dizin yarat"
-
-#: shell/e-shell-folder-selection-dialog.c:96
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-"Belirtilen eylem için bu seçili klasör tipi \n"
-"geçerli deðildir ."
-
-#: shell/e-shell-folder-selection-dialog.c:272
-msgid "New..."
-msgstr "Yeni ..."
-
-#: shell/e-shell-folder-title-bar.c:459 shell/e-shell-folder-title-bar.c:460
-msgid "(Untitled)"
-msgstr "( Isimsiz )"
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr "Bug-buddy $PATH dizinlenmende bulunamadý."
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "Bug-buddy çalýþtýrýlýnamadý."
-
-#: shell/e-shell-view-menu.c:164
-msgid "Evolution"
-msgstr "Evolution"
-
-#: shell/e-shell-view-menu.c:166
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Tel'if hakký (C) 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:168
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-"Evolution GNOME masaüstü için acaip bir ePosta, \n"
-"takvim ve tanýklar yönetim uygulamasý\n"
-"idir."
-
-#: shell/e-shell-view-menu.c:318
-msgid "Go to folder..."
-msgstr "Dizinde git ..."
-
-#: shell/e-shell-view-menu.c:376
-msgid "_New"
-msgstr "_Yeni"
-
-#: shell/e-shell-view-menu.c:388
-msgid "_Folder"
-msgstr "_Dizin"
-
-#: shell/e-shell-view-menu.c:394
-msgid "Evolution bar _shortcut"
-msgstr "Evolution çubuðu _kýsayolu"
-
-#: shell/e-shell-view-menu.c:403
-msgid "_Mail message (FIXME)"
-msgstr "e_Posta iletisi"
-
-#: shell/e-shell-view-menu.c:409
-msgid "_Appointment (FIXME)"
-msgstr "T_oplantý"
-
-#: shell/e-shell-view-menu.c:415
-msgid "_Contact (FIXME)"
-msgstr "_Tanýk"
-
-#: shell/e-shell-view-menu.c:421
-msgid "_Task (FIXME)"
-msgstr "_Görev"
-
-#: shell/e-shell-view-menu.c:443
-msgid "_Go to folder..."
-msgstr "Dizine _git ..."
-
-#: shell/e-shell-view-menu.c:444
-msgid "Display a different folder"
-msgstr "Deðiþik bir dizini göster"
-
-#: shell/e-shell-view-menu.c:451
-msgid "_Create new folder..."
-msgstr "_Yeni bir dizini yarat ..."
-
-#: shell/e-shell-view-menu.c:452 shell/e-shell-view-menu.c:462
-msgid "Create a new folder"
-msgstr "Yeni bir dizini yarat"
-
-#: shell/e-shell-view-menu.c:461
-msgid "E_xit..."
-msgstr "Çý_k ..."
-
-#: shell/e-shell-view-menu.c:492
-msgid "Show _shortcut bar"
-msgstr "Ký_sayol çubuðunu göster"
-
-#: shell/e-shell-view-menu.c:493
-msgid "Show the shortcut bar"
-msgstr "Kýsayol çubuðunu gösterir"
-
-#: shell/e-shell-view-menu.c:498
-msgid "Show _folder bar"
-msgstr "Di_zinler çubuðunu göster"
-
-#: shell/e-shell-view-menu.c:499
-msgid "Show the folder bar"
-msgstr "Dizinler çubuðunu gösterir"
-
-#: shell/e-shell-view-menu.c:521
-msgid "_Actions"
-msgstr "E_ylemler"
-
-#: shell/e-shell-view-menu.c:532
-msgid "_Help"
-msgstr "_Bark"
-
-#: shell/e-shell-view-menu.c:538
-msgid "Help _index"
-msgstr "Yardým _içeriði"
-
-#: shell/e-shell-view-menu.c:545
-msgid "Getting _started"
-msgstr "Na_sýl baþlarým"
-
-#: shell/e-shell-view-menu.c:552
-msgid "Using the _mailer"
-msgstr "_ePosta bölümünü nasýl kullanýrým"
-
-#: shell/e-shell-view-menu.c:559
-msgid "Using the _calendar"
-msgstr "_Takvimi nasýl kullanýrým"
-
-#: shell/e-shell-view-menu.c:566
-msgid "Using the c_ontact manager"
-msgstr "Ta_nýklar yöneticisini nasýl kullanýrým"
-
-#: shell/e-shell-view-menu.c:576
-msgid "_Submit bug report"
-msgstr "_Hata raporunu gönder"
-
-#: shell/e-shell-view-menu.c:577
-msgid "Submit bug report using Bug Buddy"
-msgstr "bug-buddy desteðiyle bir hata raporunu gönder"
-
-#: shell/e-shell-view-menu.c:586
-msgid "_About Evolution..."
-msgstr "_Evolution bilgisi ..."
-
-#: shell/e-shell-view-menu.c:587
-msgid "Show information about Evolution"
-msgstr "Evolution hakkýnda bilgi göster"
-
-#: shell/e-shell-view.c:114
-msgid "(No folder displayed)"
-msgstr "( Hiç bir dizin gösterilmiyor )"
-
-#: shell/e-shell-view.c:342
-msgid "Folders"
-msgstr "Dizinler"
-
-#: shell/e-shell-view.c:736
-msgid "None"
-msgstr "Yok"
-
-#: shell/e-shell-view.c:740
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell.c:291
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr "Yerel kaydý kuramadým -- %s"
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "_Ufak ikonalar"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr "Kýsayollarý ufak ikonalar olarak göster"
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "_Büyük ikonalar"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr "Kýsayollarý büyük ikonalar olarak göster"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr "Geçerli yap"
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr "Bu kýsayolu geçerli yap"
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr "Bu kýsayolu kýsayol çubuðundan sil"
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr "Kýsayollarý kaydederken hata oldu."
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr "( Ismi yok )"
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr "Hata yok"
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr "Genel hata"
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr "Ayný isimli bir klasör zaten var"
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr "Belirtilen klasör tipi geçerli deðildir"
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "V/D hatasý"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr "Klasörü yaratmak için gerekli disk alaný yok"
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr "Belirtilen klasör bulunamadý"
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr "Iþlem yazýlmamýþtýr"
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr "Izin yok"
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr "Iþlem desteklenmiyor"
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr "Bu kayýtta belirtilen tip desteklenmiyor"
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "Bilinmeyen hata"
-
-#: shell/main.c:66
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-"Merhaba. Evolution kitlesel iþlemler uygulamasýnýn önizleme neslini\n"
-"yüklemen için teþekkürler.\n"
-"\n"
-"Son bir buçuk ayda, Evolution'u kullanabilir bi' hale getirmeye uðraþtýk.\n"
-"Evolution'un yazarlarýnýn çoðu ( idealizm ? ) ePostalarýný \n"
-"Evolution ile okuyup, yazmaktadýr . Sen de böyle yapabilirsin tabii ki .\n"
-"( Sadece bir yedekleme yapmayý unutma . )\n"
-".\n"
-"Çoðu aðýr hatalarý ve sorunlarý düzeltmemize raðmen vasat ikaz iletisi\n"
-"var. Evolution'un becerilerini sayalým :\n"
-"çökmeler, ePosta kaybý, ortada kalan yetim iþlemler, %%100 iþlem kullanýmý,\n"
-"kilitlenmeler, tesadüfi ePosta listelerine gönderilmiþ HTML ePostalarý ve "
-"arkadaþlarýnýn\n"
-"ve meslektaþlarýnýn önünde utanmalar. Yani riski sana kalmýþ.\n"
-"\n"
-"Aðýr bir iþin sonucunu beðindiðinizi umup, sizin katkýlarýný\n"
-"bekliyoruz !\n"
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-"Teþekkürler\n"
-"Evolution Takýmý\n"
-
-#: shell/main.c:121
-msgid "Cannot initialize the Evolution shell."
-msgstr "Evolution komutasýný baþlatamadým ."
-
-#: shell/main.c:156
-msgid "Cannot initialize the Bonobo component system."
-msgstr "Bonobo parçalar sistemini baþlatamadým."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "Birimler"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "Kitle"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "Sýrala"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "Filtra"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-msgid "Field Chooser"
-msgstr "Birim seçmeni"
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-"Çizgiyene bir sütun eklemek için, o çizgiyeyi\n"
-"istediðin yere býrakabilirsin ."
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "pencere1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "Varolan birimler"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "yafta1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "Bu sýralamada göster"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "yafta2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "Ekle >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< Sil"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr "Giriþimli"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr "Mesþgul"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr "Ofis'te deðil"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "Bilgi yok"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr "Baþkalarý _davet et ..."
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "_Seçenekler"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr "Sadece ça_lýþma saatleri göster"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr "_Uzaklaþtýrýlmýþ göster"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr "Boþ/Meþgul'leri _yenile"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "_<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr "_Otomatikman seç"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr ">_>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr "_Yekin kiþiler ve kaynaklar"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr "Yekin _kiþiler ve bir kaynak"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr "_Gerekli kiþiler"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr "Gerekli kiþiler ve _bir kaynak"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "Toplantý baþlama saati :"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "Toplantý bitiþ saati :"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr "Yekin ziyaretciler"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "Kitle %i"
-
-#~ msgid "Edit Filter"
-#~ msgstr "Filtralarla oyna"
-
-#~ msgid "Create filter"
-#~ msgstr "Filtra yarat"
-
-#~ msgid "Back"
-#~ msgstr "Geri"
-
-#~ msgid "Finish"
-#~ msgstr "Bitir"
-
-#~ msgid "Cancel"
-#~ msgstr "Iptal"
-
-#~ msgid "Apply"
-#~ msgstr "Uygula"
-
-#~ msgid ""
-#~ "<h2>Create Filtering Rule</h2><p>Select one of the base rules above, then "
-#~ "continue forwards to customise it.</p>"
-#~ msgstr ""
-#~ "<h2>Filtra kuralýný kur</h2><p>Alttaki kurallardan bir tanesini seçip, o "
-#~ "kuralý özelleþtirmeye devam et .</p>"
-
-#~ msgid "_Virtual Folder Druid ..."
-#~ msgstr "_Sanal Dizin Sihirbazý ..."
-
-#~ msgid "Test these values before continuing"
-#~ msgstr "Bu deðerleri devam etmekten önce bir dene"
-
-#~ msgid "Select the method you would like to use to deliver your mail."
-#~ msgstr "ePostaný gönderirken tercih ettiðin türü belirle."
-
-#~ msgid "Mail Configuration"
-#~ msgstr "ePosta ayarlamasý"
-
-#~ msgid "Identity"
-#~ msgstr "Kimlik"
-
-#~ msgid "Mail Source"
-#~ msgstr "ePosta kaynaðý"
-
-#~ msgid "Mail Transport"
-#~ msgstr "ePosta transferi"
-
-#~ msgid "Enter the hostname of the News Server you have."
-#~ msgstr "Haber sunucusunun adresini ver ."
-
-#~ msgid "Cannot initialize the configuration system."
-#~ msgstr "Ayarlama sistemini baþlatamadým ."
-
-#~ msgid "Refile"
-#~ msgstr "Yeniden dosyala"
-
-#~ msgid "Mail Component: I could not initialize Bonobo"
-#~ msgstr "ePosta parçasý : Bonobo'yu baþlatamadým"
diff --git a/po/uk.po b/po/uk.po
deleted file mode 100644
index a70e3c40ef..0000000000
--- a/po/uk.po
+++ /dev/null
@@ -1,4373 +0,0 @@
-# Ukrainian translation of evolution.
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Yuri Syrota <rasta@renome.rovno.ua>, 2000.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution 0.1\n"
-"POT-Creation-Date: 2000-08-14 12:45+0300\n"
-"PO-Revision-Date: 2000-04-04 15:25+0200\n"
-"Last-Translator: Yuri Syrota <rasta@renome.rovno.ua>\n"
-"Language-Team: Ukrainian <uk@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=koi8-u\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: addressbook/backend/ebook/load-gnomecard-addressbook.c:41
-#: addressbook/backend/ebook/load-pine-addressbook.c:41
-#: addressbook/backend/ebook/test-client-list.c:29
-#: addressbook/backend/ebook/test-client.c:54
-#: addressbook/demo/addressbook-factory.c:32
-#: addressbook/gui/component/addressbook-factory.c:59
-#: addressbook/gui/minicard/test-minicard-view.c:45
-#: calendar/conduits/calendar/calendar-conduit.c:1669
-#: calendar/conduits/todo/todo-conduit.c:1298 calendar/gui/main.c:68
-msgid "Could not initialize Bonobo"
-msgstr "îÅ ×ÄÁÌÏÓØ ¦Î¦Ã¦Á̦ÚÕ×ÁÔÉ Bonobo"
-
-#. This array must be in the same order as enumerations
-#. in GnomePilotConduitSyncType as they are used as index.
-#. Custom type implies Disabled state.
-#.
-#: addressbook/conduit/address-conduit-control-applet.c:54
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:55
-#: calendar/conduits/todo/todo-conduit-control-applet.c:55
-msgid "Disabled"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:55
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:56
-#: calendar/conduits/todo/todo-conduit-control-applet.c:56
-msgid "Synchronize"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:56
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:57
-#: calendar/conduits/todo/todo-conduit-control-applet.c:57
-msgid "Copy From Pilot"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:57
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:58
-#: calendar/conduits/todo/todo-conduit-control-applet.c:58
-msgid "Copy To Pilot"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:58
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:59
-#: calendar/conduits/todo/todo-conduit-control-applet.c:59
-msgid "Merge From Pilot"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:59
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:60
-#: calendar/conduits/todo/todo-conduit-control-applet.c:60
-msgid "Merge To Pilot"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:143
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:144
-#: calendar/conduits/todo/todo-conduit-control-applet.c:144
-msgid "Eskil Heyn Olsen <deity@eskil.dk>"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:145
-msgid "Gpilotd address conduit"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:146
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:147
-#: calendar/conduits/todo/todo-conduit-control-applet.c:147
-msgid "(C) 1998 the Free Software Foundation"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:148
-msgid "Configuration utility for the address conduit.\n"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:149
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:150
-#: calendar/conduits/todo/todo-conduit-control-applet.c:150
-msgid "gnome-unknown.xpm"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:190
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:191
-#: calendar/conduits/todo/todo-conduit-control-applet.c:191
-msgid "Synchronize Action"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:261
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:262
-#: calendar/conduits/todo/todo-conduit-control-applet.c:262
-msgid "Conduit state"
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:315
-#: addressbook/conduit/address-conduit-control-applet.c:328
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:316
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:329
-#: calendar/conduits/todo/todo-conduit-control-applet.c:316
-#: calendar/conduits/todo/todo-conduit-control-applet.c:329
-msgid ""
-"No pilot configured, please choose the\n"
-"'Pilot Link Properties' capplet first."
-msgstr ""
-
-#: addressbook/conduit/address-conduit-control-applet.c:334
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:335
-#: calendar/conduits/todo/todo-conduit-control-applet.c:335
-msgid "Not connected to the gnome-pilot daemon"
-msgstr "îÅÍÁ¤ Ú'¤ÄÎÁÎÎÑ Ú ÄÅÍÏÎÏÍ gnome-pilot."
-
-#: addressbook/conduit/address-conduit-control-applet.c:339
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:340
-#: calendar/conduits/todo/todo-conduit-control-applet.c:340
-msgid ""
-"An error occured when trying to fetch\n"
-"pilot list from the gnome-pilot daemon"
-msgstr ""
-
-#: addressbook/conduit/address-conduit.c:125
-#: addressbook/conduit/address-conduit.c:139
-msgid "BLARG\n"
-msgstr ""
-
-#: addressbook/conduit/address-conduit.c:456
-#, c-format
-msgid "Address holds %ld address entries"
-msgstr ""
-
-#: addressbook/conduit/address-conduit.c:482
-#: addressbook/conduit/address-conduit.c:484
-msgid "Could not start addressbook server"
-msgstr ""
-
-#: addressbook/conduit/address-conduit.c:497
-#: addressbook/conduit/address-conduit.c:500
-msgid "Could not read pilot's Address application block"
-msgstr ""
-
-#: addressbook/conduit/address-conduit.c:838
-msgid "Error while communicating with address server"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/categories-strings.h:7
-msgid "categories"
-msgstr "ËÁÔÅÇÏÒ¦§"
-
-#: addressbook/contact-editor/categories-strings.h:8
-msgid "Item(s) belong to these categories:"
-msgstr ""
-
-#: addressbook/contact-editor/categories-strings.h:9
-msgid "Available Categories:"
-msgstr "äÏÓÔÕÐΦ ËÁÔÅÇÏÒ¦§:"
-
-#: addressbook/contact-editor/e-contact-editor.c:643
-#: calendar/gui/dialogs/task-editor.c:217 calendar/gui/event-editor.c:1168
-msgid "FIXME: _Appointment"
-msgstr "úÕÓÔÒ¦Þ"
-
-#: addressbook/contact-editor/e-contact-editor.c:644
-#: calendar/gui/dialogs/task-editor.c:218 calendar/gui/event-editor.c:1169
-msgid "FIXME: Meeting Re_quest"
-msgstr "úÁÐÉÔ ÚÕÓÔÒ¦Þ¦"
-
-#: addressbook/contact-editor/e-contact-editor.c:646
-#: calendar/gui/dialogs/task-editor.c:216 calendar/gui/event-editor.c:1171
-msgid "FIXME: _Mail Message"
-msgstr "÷¦Ä¦ÓÌÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: addressbook/contact-editor/e-contact-editor.c:647
-#: calendar/gui/dialogs/task-editor.c:219 calendar/gui/event-editor.c:1172
-msgid "FIXME: _Contact"
-msgstr "ëÏÎÔÁËÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:648
-#: calendar/gui/dialogs/task-editor.c:213
-#: calendar/gui/dialogs/task-editor.c:220 calendar/gui/event-editor.c:1173
-msgid "FIXME: _Task"
-msgstr "úÁ×ÄÁÎÎÑ"
-
-#: addressbook/contact-editor/e-contact-editor.c:649
-#: calendar/gui/dialogs/task-editor.c:214
-#: calendar/gui/dialogs/task-editor.c:221 calendar/gui/event-editor.c:1174
-msgid "FIXME: Task _Request"
-msgstr "úÁÐÉÔ ÚÁ×ÄÁÎÎÑ"
-
-#: addressbook/contact-editor/e-contact-editor.c:650
-#: calendar/gui/dialogs/task-editor.c:222 calendar/gui/event-editor.c:1175
-msgid "FIXME: _Journal Entry"
-msgstr "öÕÒÎÁÌØÎÉÊ ÒÑÄÏË"
-
-#: addressbook/contact-editor/e-contact-editor.c:651
-#: calendar/gui/dialogs/task-editor.c:223 calendar/gui/event-editor.c:1176
-msgid "FIXME: _Note"
-msgstr "îÏÔÁÔËÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:653
-#: addressbook/contact-editor/e-contact-editor.c:758
-#: calendar/gui/dialogs/task-editor.c:225
-#: calendar/gui/dialogs/task-editor.c:332 calendar/gui/event-editor.c:1178
-#: calendar/gui/event-editor.c:1285
-msgid "FIXME: Ch_oose Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:658
-#: calendar/gui/dialogs/task-editor.c:230 calendar/gui/event-editor.c:1183
-msgid "FIXME: _Memo Style"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:660
-#: calendar/gui/dialogs/task-editor.c:232 calendar/gui/event-editor.c:1185
-msgid "FIXME: Define Print _Styles..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:667
-#: calendar/gui/dialogs/task-editor.c:239 calendar/gui/event-editor.c:1192
-msgid "FIXME: S_end"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:671
-#: calendar/gui/dialogs/task-editor.c:243 calendar/gui/event-editor.c:1196
-msgid "FIXME: Save Attac_hments..."
-msgstr "."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:8
-#: addressbook/contact-editor/e-contact-editor.c:673
-msgid "_Delete"
-msgstr "óÔÅÒÔÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:674
-#: calendar/gui/dialogs/task-editor.c:246 calendar/gui/event-editor.c:1199
-msgid "FIXME: _Move to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:675
-#: calendar/gui/dialogs/task-editor.c:247 calendar/gui/event-editor.c:1200
-msgid "FIXME: Cop_y to Folder..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:677
-#: calendar/gui/dialogs/task-editor.c:249 calendar/gui/event-editor.c:1202
-msgid "Page Set_up"
-msgstr "ðÁÒÉÍÅÔÒÉ ÓÔÏÒ¦ÎËÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:678
-#: calendar/gui/dialogs/task-editor.c:250 calendar/gui/event-editor.c:1203
-msgid "FIXME: Print Pre_view"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:699
-#: calendar/gui/dialogs/task-editor.c:271 calendar/gui/event-editor.c:1224
-msgid "FIXME: Paste _Special..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:704
-#: calendar/gui/dialogs/task-editor.c:276 calendar/gui/event-editor.c:1229
-msgid "FIXME: Mark as U_nread"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:708
-#: calendar/gui/dialogs/task-editor.c:280 calendar/gui/event-editor.c:1233
-msgid "_Object"
-msgstr "ïÂ'¤ËÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:713
-#: addressbook/contact-editor/e-contact-editor.c:720
-#: calendar/gui/dialogs/task-editor.c:285
-#: calendar/gui/dialogs/task-editor.c:293 calendar/gui/event-editor.c:1238
-#: calendar/gui/event-editor.c:1245
-msgid "FIXME: _Item"
-msgstr "åÌÅÍÅÎÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:714
-#: addressbook/contact-editor/e-contact-editor.c:721
-#: calendar/gui/dialogs/task-editor.c:286
-#: calendar/gui/dialogs/task-editor.c:294 calendar/gui/event-editor.c:1239
-#: calendar/gui/event-editor.c:1246
-msgid "FIXME: _Unread Item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:715
-#: calendar/gui/dialogs/task-editor.c:288 calendar/gui/event-editor.c:1240
-msgid "FIXME: Fi_rst Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:722
-#: calendar/gui/dialogs/task-editor.c:296 calendar/gui/event-editor.c:1247
-msgid "FIXME: _Last Item in Folder"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:727
-#: calendar/gui/dialogs/task-editor.c:301 calendar/gui/event-editor.c:1252
-msgid "FIXME: _Standard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:729
-#: calendar/gui/dialogs/task-editor.c:303 calendar/gui/event-editor.c:1254
-msgid "FIXME: __Formatting"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:732
-#: calendar/gui/dialogs/task-editor.c:306 calendar/gui/event-editor.c:1257
-msgid "FIXME: _Customize..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:737
-#: calendar/gui/dialogs/task-editor.c:311 calendar/gui/event-editor.c:1262
-msgid "Pre_vious"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:738
-#: calendar/gui/dialogs/task-editor.c:312 calendar/gui/event-editor.c:1263
-msgid "Ne_xt"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:740
-#: calendar/gui/dialogs/task-editor.c:314 calendar/gui/event-editor.c:1267
-msgid "_Toolbars"
-msgstr "ðÁÎÅÌØ ¦ÎÓÔÒÕÍÅÎÔ¦×"
-
-#: addressbook/contact-editor/e-contact-editor.c:745
-#: calendar/gui/dialogs/task-editor.c:319 calendar/gui/event-editor.c:1272
-msgid "FIXME: _File..."
-msgstr "æÁÊÌ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:746
-#: calendar/gui/dialogs/task-editor.c:320 calendar/gui/event-editor.c:1273
-msgid "FIXME: It_em..."
-msgstr "åÌÅÍÅÎÔ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:747
-#: calendar/gui/dialogs/task-editor.c:321 calendar/gui/event-editor.c:1274
-msgid "FIXME: _Object..."
-msgstr "ïÂ'¤ËÔ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:752
-#: calendar/gui/dialogs/task-editor.c:326 calendar/gui/event-editor.c:1279
-msgid "FIXME: _Font..."
-msgstr "ûÒÉÆÔ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:753
-#: calendar/gui/dialogs/task-editor.c:327 calendar/gui/event-editor.c:1280
-msgid "FIXME: _Paragraph..."
-msgstr "ðÁÒÁÇÒÁÆ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:760
-#: calendar/gui/dialogs/task-editor.c:334 calendar/gui/event-editor.c:1287
-msgid "FIXME: Desi_gn This Form"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:761
-#: calendar/gui/dialogs/task-editor.c:335 calendar/gui/event-editor.c:1288
-msgid "FIXME: D_esign a Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:763
-#: calendar/gui/dialogs/task-editor.c:337 calendar/gui/event-editor.c:1290
-msgid "FIXME: Publish _Form..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:764
-#: calendar/gui/dialogs/task-editor.c:338 calendar/gui/event-editor.c:1291
-msgid "FIXME: Pu_blish Form As..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:766
-#: calendar/gui/dialogs/task-editor.c:340 calendar/gui/event-editor.c:1293
-msgid "FIXME: Script _Debugger"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:771
-#: calendar/gui/dialogs/task-editor.c:345 calendar/gui/event-editor.c:1298
-msgid "FIXME: _Spelling..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:773
-#: calendar/gui/dialogs/task-editor.c:350 calendar/gui/event-editor.c:1303
-msgid "_Forms"
-msgstr "æÏÒÍÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:778
-msgid "FIXME: _New Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:779
-msgid "FIXME: New _Contact from Same Company"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:781
-msgid "FIXME: New _Letter to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:782
-msgid "FIXME: New _Message to Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:783
-msgid "FIXME: New Meetin_g with Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:784
-msgid "FIXME: _Plan a Meeting..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:785
-msgid "FIXME: New _Task for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:786
-msgid "FIXME: New _Journal Entry for Contact"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:788
-msgid "FIXME: _Flag for Follow Up..."
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:789
-msgid "FIXME: _Display Map of Address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:790
-msgid "FIXME: _Open Web Page"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:792
-msgid "FIXME: Forward as _vCard"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:793
-#: calendar/gui/dialogs/task-editor.c:367 calendar/gui/event-editor.c:1316
-msgid "FIXME: For_ward"
-msgstr "ðÅÒÅÓÌÁÔÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:805
-#: calendar/gui/dialogs/task-editor.c:380 calendar/gui/event-editor.c:1329
-msgid "_Insert"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:806
-#: calendar/gui/dialogs/task-editor.c:381 calendar/gui/event-editor.c:1330
-msgid "F_ormat"
-msgstr "æÏÒÍÁÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:807
-#: calendar/gui/dialogs/task-editor.c:382 calendar/gui/event-editor.c:1331
-#: shell/e-shell-view-menu.c:513
-msgid "_Tools"
-msgstr "¶ÎÓÔÒÕÍÅÎÔÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:808
-#: calendar/gui/dialogs/task-editor.c:383 calendar/gui/event-editor.c:1332
-msgid "Actio_ns"
-msgstr "䦧"
-
-#: addressbook/contact-editor/e-contact-editor.c:839
-msgid "Save and Close"
-msgstr "úÂÅÒÅÇÔÉ ÔÁ ÚÁËÒÉÔÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:840
-#: calendar/gui/event-editor.c:1371
-msgid "Save the appointment and close the dialog box"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:844
-#: calendar/gui/calendar-commands.c:654
-msgid "Print..."
-msgstr "äÒÕËÕ×ÁÔÉ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:845
-#: calendar/gui/dialogs/task-editor.c:415 calendar/gui/event-editor.c:1376
-msgid "Print this item"
-msgstr "îÁÄÒÕËÕ×ÁÔÉ ÃÅÊ ÅÌÅÍÅÎÔ"
-
-#: addressbook/contact-editor/e-contact-editor.c:848
-#: calendar/gui/dialogs/task-editor.c:416 calendar/gui/event-editor.c:1377
-msgid "FIXME: Insert File..."
-msgstr "÷ÓÔÁ×ÉÔÉ ÆÁÊÌ..."
-
-#: addressbook/contact-editor/e-contact-editor.c:849
-#: calendar/gui/dialogs/task-editor.c:417 calendar/gui/event-editor.c:1378
-msgid "Insert a file as an attachment"
-msgstr ""
-
-#. Delete
-#: addressbook/contact-editor/e-contact-editor.c:852
-#: addressbook/demo/addressbook.c:84
-#: addressbook/gui/component/addressbook.c:424
-#: calendar/gui/e-calendar-table.c:375
-#: calendar/gui/event-editor-dialog.glade.h:93 calendar/gui/gncal-todo.c:508
-#: mail/folder-browser-factory.c:49 mail/mail-config.glade.h:13
-#: mail/mail-config.glade.h:18 mail/mail-config.glade.h:24
-#: mail/mail-view.c:147
-msgid "Delete"
-msgstr "óÔÅÒÔÉ"
-
-#: addressbook/contact-editor/e-contact-editor.c:853
-#: calendar/gui/dialogs/task-editor.c:426 calendar/gui/event-editor.c:1387
-#: calendar/gui/gncal-todo.c:336
-msgid "Delete this item"
-msgstr "óÔÅÒÔÉ ÃÅ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: addressbook/contact-editor/e-contact-editor.c:857
-#: calendar/gui/dialogs/task-editor.c:428 calendar/gui/event-editor.c:1389
-msgid "FIXME: Previous"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:858
-#: calendar/gui/dialogs/task-editor.c:429 calendar/gui/event-editor.c:1390
-msgid "Go to the previous item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:860
-#: calendar/gui/dialogs/task-editor.c:430 calendar/gui/event-editor.c:1391
-msgid "FIXME: Next"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:861
-#: calendar/gui/dialogs/task-editor.c:431 calendar/gui/event-editor.c:1392
-msgid "Go to the next item"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:864
-#: calendar/gui/dialogs/task-editor.c:432 calendar/gui/event-editor.c:1393
-msgid "FIXME: Help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:865
-#: calendar/gui/dialogs/task-editor.c:433 calendar/gui/event-editor.c:1394
-msgid "See online help"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1320
-msgid "Assistant"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1321
-#: addressbook/contact-editor/e-contact-editor.c:1425
-msgid "Business"
-msgstr "òÏÂÏÞÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1322
-msgid "Business 2"
-msgstr "òÏÂÏÞÁ 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1323
-msgid "Business Fax"
-msgstr "òÏÂÏÞÉÊ ÆÁËÓ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1324
-msgid "Callback"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1325
-msgid "Car"
-msgstr "á×ÔÏ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1326
-msgid "Company"
-msgstr "ëÏÍÐÁΦÑ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1327
-#: addressbook/contact-editor/e-contact-editor.c:1426
-msgid "Home"
-msgstr "äÏÍÁÛÎÑ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1328
-msgid "Home 2"
-msgstr "äÏÍÁÛÎÑ 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1329
-msgid "Home Fax"
-msgstr "äÏÍÁÛÎ¦Ê ÆÁËÓ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1330
-msgid "ISDN"
-msgstr "ISDN"
-
-#: addressbook/contact-editor/e-contact-editor.c:1331
-msgid "Mobile"
-msgstr "íϦÌØÎÉÊ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1332
-#: addressbook/contact-editor/e-contact-editor.c:1427
-#: mail/mail-config.glade.h:27
-msgid "Other"
-msgstr "¶ÎÛÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1333
-msgid "Other Fax"
-msgstr "¶ÎÛÉÊ ÆÁËÓ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1334
-msgid "Pager"
-msgstr "ðÅÊÄÖÅÒ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1335
-msgid "Primary"
-msgstr "ðÅÒ×ÉÎÎÉÊ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1336
-msgid "Radio"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1337
-msgid "Telex"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor.c:1338
-msgid "TTY/TDD"
-msgstr "TTY/TDD"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:23
-#: addressbook/contact-editor/e-contact-editor.c:1382
-msgid "Primary Email"
-msgstr "ðÅÒ×ÉÎÎÁ Å-ÐÏÛÔÁ"
-
-#: addressbook/contact-editor/e-contact-editor.c:1383
-msgid "Email 2"
-msgstr "å-ÐÏÛÔÁ 2"
-
-#: addressbook/contact-editor/e-contact-editor.c:1384
-msgid "Email 3"
-msgstr "å-ÐÏÛÔÁ 3"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:7
-msgid ""
-"Are you sure you want\n"
-"to delete this contact?"
-msgstr ""
-"÷É ×ÐÅ×ÎÅΦ, ÝÏ ÈÏÞÅÔÅ\n"
-"ÓÔÅÒÔÉ ÃÀ ËÏÎÔÁËÔÎÕ ¦ÎÆÏÒÍÁæÀ?"
-
-#: addressbook/contact-editor/e-contact-editor-confirm-delete.glade.h:9
-msgid "Delete Contact?"
-msgstr "óÔÅÒÔÉ ËÏÎÔÁËÔÎÕ ¦ÎÆÏÒÍÁæÀ?"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/e-contact-editor-strings.h:7
-msgid "_Add"
-msgstr "äÏÄÁÔÉ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:9
-msgid "Phone Types"
-msgstr "ôÉÐÉ ÔÅÌÅÆÏΦ×"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:10
-#: addressbook/contact-editor/e-contact-editor-strings.h:12
-msgid "New phone type"
-msgstr "îÏ×ÉÊ ÔÉÐ ÔÅÌÅÆÏÎÁ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:11
-#: calendar/gui/event-editor-dialog.glade.h:91 mail/mail-config.glade.h:11
-#: mail/mail-config.glade.h:16 mail/mail-config.glade.h:22
-msgid "Add"
-msgstr "äÏÄÁÔÉ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:13
-msgid "Contact Editor"
-msgstr "òÅÄÁËÔÏÒ Ú×'ÑÚ˦×"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:14
-msgid "_Full Name..."
-msgstr "ðÏ×ÎÅ ¦Í'Ñ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:15
-msgid "File As:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:16
-msgid "Web page address:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:17
-msgid "Wants to receive _HTML mail"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:18
-msgid "Address:"
-msgstr "áÄÒÅÓÁ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:19
-msgid "_Business"
-msgstr "òÏÂÏÞÁ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:20
-msgid "_Home"
-msgstr "äÏÍÁÛÎÑ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:21
-msgid "Business _Fax"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:22
-msgid "_Mobile"
-msgstr "íϦÌØÎÉÊ ÔÅÌÅÆÏÎ"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:24
-msgid "B_usiness"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:25
-msgid "_This is the mailing address"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:26
-msgid "C_ontacts..."
-msgstr "ú×'ÑÚËÉ..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:27
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:26
-msgid "Ca_tegories..."
-msgstr "ëÁÔÅÇÏÒ¦§..."
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:28
-msgid "_Job title:"
-msgstr "ðÏÓÁÄÁ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:29
-msgid "_Company:"
-msgstr "ëÏÍÐÁΦÑ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:30
-#: calendar/gui/event-editor-dialog.glade.h:18
-msgid "General"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:31
-msgid "_Department:"
-msgstr "÷¦ÄĦÌ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:32
-msgid "_Office:"
-msgstr "ïƦÓ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:33
-msgid "_Profession:"
-msgstr "ðÒÏÆÅÓ¦Ñ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:34
-msgid "_Nickname:"
-msgstr "ðÒ¦Ú×ÉÓØËÏ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:35
-msgid "_Spouse:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:36
-msgid "_Birthday:"
-msgstr "äÁÔÁ ÎÁÒÏÄÖÅÎÎÑ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:37
-msgid "_Assistant's name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:38
-msgid "_Manager's Name:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:39
-msgid "Anni_versary:"
-msgstr ""
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:40
-msgid "No_tes:"
-msgstr "îÏÔÁÔËÉ:"
-
-#: addressbook/contact-editor/e-contact-editor-strings.h:41
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:33
-msgid "Details"
-msgstr "ðÏÄÒÏÂÉæ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/contact-editor/fullname-strings.h:7
-msgid "Check Full Name"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:8
-msgid "_Title:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:9
-msgid "_First:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:10
-msgid "_Middle:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:11
-msgid "_Last:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:12
-msgid "_Suffix:"
-msgstr ""
-
-#: addressbook/contact-editor/fullname-strings.h:13
-msgid ""
-"\n"
-"Mr.\n"
-"Mrs.\n"
-"Dr.\n"
-msgstr ""
-"\n"
-"ðÁÎ\n"
-"ðÁΦ\n"
-"äÏËÔÏÒ\n"
-
-#: addressbook/contact-editor/fullname-strings.h:18
-msgid ""
-"\n"
-"Sr.\n"
-"Jr.\n"
-"I\n"
-"II\n"
-"III\n"
-"Esq.\n"
-msgstr ""
-
-#: addressbook/demo/addressbook.c:78
-#: addressbook/gui/component/addressbook.c:418
-#: calendar/gui/calendar-commands.c:511 notes/component-factory.c:27
-msgid "New"
-msgstr "îÏ×ÉÊ"
-
-#: addressbook/demo/addressbook.c:78
-#: addressbook/gui/component/addressbook.c:418
-msgid "Create a new contact"
-msgstr "óÔ×ÏÒÉÔÉ ÎÏ×ÉÊ ÚÁÐÉÓ"
-
-#: addressbook/demo/addressbook.c:82
-#: addressbook/gui/component/addressbook.c:422
-msgid "Find"
-msgstr "ûÕËÁÔÉ"
-
-#: addressbook/demo/addressbook.c:82
-#: addressbook/gui/component/addressbook.c:422
-msgid "Find a contact"
-msgstr "úÎÁÊÔÉ ËÏÎÔÁËÔÎÕ ¦ÎÆÏÒÍÁæÀ"
-
-#: addressbook/demo/addressbook.c:83
-#: addressbook/gui/component/addressbook.c:423
-#: calendar/gui/calendar-commands.c:516 mail/folder-browser-factory.c:47
-#: mail/mail-view.c:145
-msgid "Print"
-msgstr "äÒÕËÕ×ÁÔÉ"
-
-#: addressbook/demo/addressbook.c:83
-#: addressbook/gui/component/addressbook.c:423
-msgid "Print contacts"
-msgstr "îÁÄÒÕËÕ×ÁÔÉ ËÏÎÔÁËÔÎÕ ¦ÎÆÏÒÍÁæÀ"
-
-#: addressbook/demo/addressbook.c:84
-#: addressbook/gui/component/addressbook.c:424
-msgid "Delete a contact"
-msgstr "óÔÅÒÔÉ ËÏÎÔÁËÔÎÕ ¦ÎÆÏÒÍÁæÀ"
-
-#: addressbook/demo/addressbook.c:103
-#: addressbook/gui/component/addressbook.c:509
-msgid "_New Contact"
-msgstr "îÏ×Á ¦ÎÆÏÒÍÁæÑ"
-
-#: addressbook/gui/component/addressbook.c:492
-msgid "_Print Contacts..."
-msgstr "îÁÄÒÕËÕ×ÁÔÉ ËÏÎÔÁËÔÎÕ ¦ÎÆÏÒÍÁæÀ..."
-
-#: addressbook/gui/component/addressbook.c:502
-#: addressbook/gui/component/addressbook.c:972
-msgid "As _Table"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:517
-msgid "N_ew Directory Server"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:600
-msgid "Unable to open addressbook"
-msgstr "îÅ ×ÄÁÌÏÓÑ ×¦ÄËÒÉÔÉ ÁÄÒÅÓÎÕ ËÎÉÇÕ"
-
-#: addressbook/gui/component/addressbook.c:605
-msgid ""
-"We were unable to open this addressbook. This either\n"
-"means you have entered an incorrect URI, or have tried\n"
-"to access an LDAP server and don't have LDAP support\n"
-"compiled in. If you've entered a URI, check the URI for\n"
-"correctness and reenter. If not, you probably have\n"
-"attempted to access an LDAP server. If you wish to be\n"
-"able to use LDAP, you'll need to download and install\n"
-"OpenLDAP and recompile and install evolution.\n"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:876
-#: addressbook/gui/minicard/e-minicard.c:330
-msgid "Save as VCard"
-msgstr "úÂÅÒÅÇÔÉ ÑË VCard"
-
-#: addressbook/gui/component/addressbook.c:943
-msgid "* Click here to add a contact *"
-msgstr ""
-
-#: addressbook/gui/component/addressbook.c:979
-msgid "As _Minicards"
-msgstr "ñË _Minicards"
-
-#: addressbook/gui/component/addressbook.c:1030
-msgid "The URI that the Folder Browser will display"
-msgstr "URI ÔÅËÉ, ÝÏ ÂÕÄŠצÄÏÂÒÁÖÅÎÏ ÐÅÒÅÇÌÑÄÁÞÅÍ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/alphabet.glade.h:7
-msgid "window2"
-msgstr "צËÎÏ2"
-
-#: addressbook/gui/component/alphabet.glade.h:8
-msgid "123"
-msgstr "123"
-
-#: addressbook/gui/component/alphabet.glade.h:9
-msgid "a"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:10
-msgid "b"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:11
-msgid "c"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:12
-msgid "d"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:13
-msgid "e"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:14
-msgid "f"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:15
-msgid "g"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:16
-#: calendar/cal-util/timeutil.c:131
-msgid "h"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:17
-msgid "i"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:18
-msgid "j"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:19
-msgid "k"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:20
-msgid "l"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:21
-msgid "m"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:22
-msgid "n"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:23
-msgid "o"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:24
-msgid "p"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:25
-msgid "q"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:26
-msgid "r"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:27
-msgid "s"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:28
-msgid "t"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:29
-msgid "u"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:30
-msgid "v"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:31
-msgid "w"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:32
-msgid "x"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:33
-msgid "y"
-msgstr ""
-
-#: addressbook/gui/component/alphabet.glade.h:34
-msgid "z"
-msgstr ""
-
-#: addressbook/gui/component/e-ldap-storage.c:88
-msgid "External Directories"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/ldap-server-dialog.glade.h:7
-#: composer/e-msg-composer-attachment.glade.h:9
-msgid "Description:"
-msgstr "ïÐÉÓ:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:8
-msgid "LDAP Server:"
-msgstr "óÅÒ×ÅÒ LDAP:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:9
-msgid "Port Number:"
-msgstr "îÏÍÅÒ ÐÏÒÔÁ:"
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:10
-msgid "Root DN:"
-msgstr ""
-
-#: addressbook/gui/component/ldap-server-dialog.glade.h:11
-#: composer/e-msg-composer-address-dialog.glade.h:8
-msgid "Name:"
-msgstr "¶Í'Ñ:"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/gui/component/select-names/select-names.glade.h:7
-msgid "Select Names"
-msgstr "÷ÉÂÒÁÔÉ ÎÁÚ×É"
-
-#: addressbook/gui/component/select-names/select-names.glade.h:8
-msgid "Find..."
-msgstr "ûÕËÁÔÉ..."
-
-#: addressbook/gui/component/select-names/select-names.glade.h:9
-#, fuzzy
-msgid "Select name from List:"
-msgstr "÷ÉÂÒÁÔÉ ÎÁÚ×É"
-
-#: addressbook/gui/component/select-names/select-names.glade.h:10
-msgid "Message Recipients"
-msgstr "áÄÒÅÓÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: addressbook/gui/minicard/e-minicard-control.c:276
-#, fuzzy
-msgid "Save in addressbook"
-msgstr "îÅ ×ÄÁÌÏÓÑ ×¦ÄËÒÉÔÉ ÁÄÒÅÓÎÕ ËÎÉÇÕ"
-
-#: addressbook/gui/minicard/e-minicard-view.c:110
-msgid ""
-"\n"
-"\n"
-"There are no items to show in this view\n"
-"\n"
-"Double-click here to create a new Contact."
-msgstr ""
-
-#: addressbook/gui/minicard/test-minicard-view.c:100
-msgid "Reflow Test"
-msgstr ""
-
-#: addressbook/gui/minicard/test-minicard-view.c:101
-#, fuzzy
-msgid "Copyright (C) 2000, Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: addressbook/gui/minicard/test-minicard-view.c:103
-msgid "This should test the reflow canvas item"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: addressbook/printing/e-contact-print.glade.h:7
-msgid "Page Setup:"
-msgstr "ðÁÒÁÍÅÔÒÉ ÓÔÏÒ¦ÎËÉ:"
-
-#: addressbook/printing/e-contact-print.glade.h:8
-msgid "Style name:"
-msgstr "îÁÚ×Á ÓÔÉÌÀ:"
-
-#: addressbook/printing/e-contact-print.glade.h:9
-msgid "Preview:"
-msgstr "ðÅÒÅÇÌÑÄ:"
-
-#: addressbook/printing/e-contact-print.glade.h:10
-msgid "Options"
-msgstr "ðÁÒÁÍÅÔÒÉ"
-
-#: addressbook/printing/e-contact-print.glade.h:11
-msgid "Include:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:12
-msgid "Sections:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:13
-msgid "Immediately follow each other"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:14
-msgid "Letter tabs on side"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:15
-msgid "Headings for each letter"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:16
-msgid "Start on a new page"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:17
-msgid "Number of columns:"
-msgstr "ë¦ÌØ˦ÓÔØ ÓÔÏ×ÐÞÉ˦×:"
-
-#: addressbook/printing/e-contact-print.glade.h:18
-msgid "Blank forms at end:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:19
-msgid "Fonts"
-msgstr "ûÒÉÆÔÉ"
-
-#: addressbook/printing/e-contact-print.glade.h:20
-#: addressbook/printing/e-contact-print.glade.h:21
-#: addressbook/printing/e-contact-print.glade.h:51
-#: addressbook/printing/e-contact-print.glade.h:54
-msgid "Font..."
-msgstr "ûÒÉÆÔ..."
-
-#: addressbook/printing/e-contact-print.glade.h:22
-msgid "Headings"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:23
-msgid "10 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:24
-msgid "Body"
-msgstr "ô¦ÌÏ"
-
-#: addressbook/printing/e-contact-print.glade.h:25
-msgid "8 pt. Tahoma"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:26
-msgid "Shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:27
-msgid "Print using gray shading"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:28
-msgid "Format"
-msgstr "æÏÒÍÁÔ"
-
-#: addressbook/printing/e-contact-print.glade.h:29
-#: addressbook/printing/e-contact-print.glade.h:50
-msgid "Paper"
-msgstr "ðÁЦÒ"
-
-#: addressbook/printing/e-contact-print.glade.h:30
-msgid "Type:"
-msgstr "ôÉÐ:"
-
-#: addressbook/printing/e-contact-print.glade.h:31
-#: addressbook/printing/e-contact-print.glade.h:43
-#: calendar/gui/event-editor-dialog.glade.h:81
-msgid "label26"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:32
-#: addressbook/printing/e-contact-print.glade.h:44
-msgid "Dimensions:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:33
-#: addressbook/printing/e-contact-print.glade.h:45
-msgid "Width:"
-msgstr "ûÉÒÉÎÁ:"
-
-#: addressbook/printing/e-contact-print.glade.h:34
-#: addressbook/printing/e-contact-print.glade.h:46
-msgid "Height:"
-msgstr "÷ÉÓÏÔÁ:"
-
-#: addressbook/printing/e-contact-print.glade.h:35
-msgid "Paper source:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:36
-msgid "Margins"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:37
-msgid "Top:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:38
-msgid "Bottom:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:39
-msgid "Left:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:40
-msgid "Right:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:41
-msgid "Page"
-msgstr "óÔÏÒ¦ÎËÁ"
-
-#: addressbook/printing/e-contact-print.glade.h:42
-msgid "Size:"
-msgstr "òÏÚͦÒ:"
-
-#: addressbook/printing/e-contact-print.glade.h:47
-msgid "Orientation"
-msgstr "ïÒ¦¤ÎÔÁæÑ"
-
-#: addressbook/printing/e-contact-print.glade.h:48
-msgid "Portrait"
-msgstr "ëÎÉÖÎÁ"
-
-#: addressbook/printing/e-contact-print.glade.h:49
-msgid "Landscape"
-msgstr "áÌØÂÏÍÎÁ"
-
-#: addressbook/printing/e-contact-print.glade.h:52
-msgid "Header"
-msgstr "úÁÇÏÌÏ×ÏË"
-
-#: addressbook/printing/e-contact-print.glade.h:53
-msgid "Footer:"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:55
-msgid "Reverse on even pages"
-msgstr ""
-
-#: addressbook/printing/e-contact-print.glade.h:56
-msgid "Header/Footer"
-msgstr ""
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:544
-msgid "am"
-msgstr "ÄÐ"
-
-#: calendar/cal-util/timeutil.c:129 calendar/gui/print.c:543
-msgid "pm"
-msgstr "ÐÐ"
-
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:146
-msgid "Gpilotd calendar conduit"
-msgstr ""
-
-#: calendar/conduits/calendar/calendar-conduit-control-applet.c:149
-msgid "Configuration utility for the calendar conduit.\n"
-msgstr ""
-
-#: calendar/conduits/calendar/calendar-conduit.c:399
-#: calendar/conduits/calendar/calendar-conduit.c:1109
-#: calendar/conduits/todo/todo-conduit.c:443
-#: calendar/conduits/todo/todo-conduit.c:1025
-msgid "Error while communicating with calendar server"
-msgstr ""
-
-#: calendar/conduits/calendar/calendar-conduit.c:776
-#: calendar/conduits/calendar/calendar-conduit.c:778
-#: calendar/conduits/todo/todo-conduit.c:707
-#: calendar/conduits/todo/todo-conduit.c:709
-msgid "Could not start gnomecal server"
-msgstr ""
-
-#: calendar/conduits/calendar/calendar-conduit.c:806
-#: calendar/conduits/calendar/calendar-conduit.c:809
-msgid "Could not read pilot's DateBook application block"
-msgstr ""
-
-#: calendar/conduits/todo/todo-conduit-control-applet.c:146
-msgid "Gpilotd todo conduit"
-msgstr ""
-
-#: calendar/conduits/todo/todo-conduit-control-applet.c:149
-msgid "Configuration utility for the todo conduit.\n"
-msgstr ""
-
-#: calendar/conduits/todo/todo-conduit.c:737
-#: calendar/conduits/todo/todo-conduit.c:740
-msgid "Could not read pilot's ToDo application block"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:59
-msgid "Outline:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:60
-msgid "Headings:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:61
-msgid "Empty days:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:62
-msgid "Appointments:"
-msgstr "úÕÓÔÒ¦Þ¦:"
-
-#: calendar/gui/calendar-commands.c:63
-msgid "Highlighted day:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:64
-msgid "Day numbers:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:65
-msgid "Current day's number:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:66
-msgid "To-Do item that is not yet due:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:67
-msgid "To-Do item that is due today:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:68
-msgid "To-Do item that is overdue:"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:175
-msgid "Gnome Calendar"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:178
-msgid "The GNOME personal calendar and schedule manager."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:401 tests/ui-tests/message-browser.c:676
-msgid "File not found"
-msgstr "æÁÊÌÕ ÎÅ ÚÎÁÊÄÅÎÏ"
-
-#: calendar/gui/calendar-commands.c:423
-msgid "Open calendar"
-msgstr "÷¦ÄËÒÉÔÉ ËÁÌÅÎÄÁÒ"
-
-#: calendar/gui/calendar-commands.c:462
-msgid "Save calendar"
-msgstr "úÂÅÒÅÇÔÉ ËÁÌÅÎÄÁÒ"
-
-#: calendar/gui/calendar-commands.c:489 calendar/gui/gncal-todo.c:722
-#: calendar/gui/gncal-todo.c:726
-msgid "Day"
-msgstr "äÅÎØ"
-
-#: calendar/gui/calendar-commands.c:489
-msgid "Show 1 day"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:492
-msgid "5 Days"
-msgstr "5 äΦ×"
-
-#: calendar/gui/calendar-commands.c:492
-msgid "Show the working week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:495 calendar/gui/gncal-todo.c:721
-msgid "Week"
-msgstr "ôÉÖÄÅÎØ"
-
-#: calendar/gui/calendar-commands.c:495
-msgid "Show 1 week"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:498
-msgid "Month"
-msgstr "í¦ÓÑÃØ"
-
-#: calendar/gui/calendar-commands.c:498
-msgid "Show 1 month"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:502
-msgid "Year"
-msgstr "ò¦Ë"
-
-#: calendar/gui/calendar-commands.c:502
-msgid "Show 1 year"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:511 calendar/gui/calendar-commands.c:663
-msgid "Create a new appointment"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:516 calendar/gui/calendar-commands.c:655
-msgid "Print this calendar"
-msgstr "îÁÄÒÕËÕ×ÁÔÉ ÃÅÊ ËÁÌÅÎÄÁÒ"
-
-#: calendar/gui/calendar-commands.c:520
-msgid "Prev"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:520
-msgid "Go back in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:521
-#, fuzzy
-msgid "Today"
-msgstr "ô¦ÌÏ"
-
-#: calendar/gui/calendar-commands.c:521
-msgid "Go to present time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Next"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:522
-msgid "Go forward in time"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Go to"
-msgstr "ðÅÒÅÊÔÉ"
-
-#: calendar/gui/calendar-commands.c:526
-msgid "Go to a specific date"
-msgstr "ðÅÒÅÊÔÉ ÄÏ ×ËÁÚÁÎϧ ÄÁÔÉ"
-
-#. file menu
-#: calendar/gui/calendar-commands.c:640
-msgid "New Ca_lendar"
-msgstr "îÏ×ÉÊ ËÁÌÅÎÄÁÒ"
-
-#: calendar/gui/calendar-commands.c:641
-msgid "Create a new calendar"
-msgstr "óÔ×ÏÒÉÔÉ ÎÏ×ÉÊ ËÁÌÅÎÄÁÒ"
-
-#: calendar/gui/calendar-commands.c:644
-msgid "Open Ca_lendar"
-msgstr "÷¦ÄËÒÉÔÉ ËÁÌÅÎÄÁÒ"
-
-#: calendar/gui/calendar-commands.c:645
-msgid "Open a calendar"
-msgstr "÷¦ÄËÒÉÔÉ ËÁÌÅÎÄÁÒ"
-
-#: calendar/gui/calendar-commands.c:649 calendar/gui/calendar-commands.c:650
-msgid "Save Calendar As"
-msgstr "úÂÅÒÅÇÔÉ ËÁÌÅÎÄÁÒ ÑË"
-
-#: calendar/gui/calendar-commands.c:663
-msgid "_New appointment..."
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:671 calendar/gui/prop.c:716
-msgid "Preferences"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:678 calendar/gui/calendar-commands.c:679
-msgid "About Calendar"
-msgstr ""
-
-#. i18n: This "%s%s" indicates possession. Languages where the order is
-#. * the inverse should translate it to "%2$s%1$s".
-#.
-#: calendar/gui/calendar-commands.c:721
-#, c-format
-msgid "%s%s"
-msgstr ""
-
-#: calendar/gui/calendar-commands.c:721
-msgid "'s calendar"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:323
-msgid "Public"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:326
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:27
-#, fuzzy
-msgid "Private"
-msgstr "÷ÓÔÁ×ÉÔÉ"
-
-#: calendar/gui/calendar-model.c:329
-msgid "Confidential"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:332 calendar/gui/calendar-model.c:499
-#, fuzzy
-msgid "Unknown"
-msgstr "îÅצÄÏÍÁ ÐÏÍÉÌËÁ"
-
-#: calendar/gui/calendar-model.c:419
-msgid "N"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:419
-msgid "S"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:421
-msgid "E"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:421
-msgid "W"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:493
-msgid "Transparent"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:496
-msgid "Opaque"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:747
-#, c-format
-msgid ""
-"The date must be entered in the format: \n"
-"\n"
-"%s"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:820
-msgid ""
-"The geographical position must be entered in the format: \n"
-"\n"
-"45.436845,125.862501"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:865
-msgid "The percent value must be between 0 and 100"
-msgstr ""
-
-#: calendar/gui/calendar-model.c:898
-msgid "The priority must be between 0 and 10"
-msgstr ""
-
-#: calendar/gui/control-factory.c:132
-#, fuzzy
-msgid "The URI that the calendar will display"
-msgstr "URI ÔÅËÉ, ÝÏ ÂÕÄŠצÄÏÂÒÁÖÅÎÏ ÐÅÒÅÇÌÑÄÁÞÅÍ"
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:183
-msgid "Alarm on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:190
-msgid "Notification about your appointment on %A %b %d %Y %H:%M"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify-dialog.c:201
-msgid "No summary available."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/alarm-notify.glade.h:7
-msgid "Close"
-msgstr ""
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:8 calendar/gui/gnome-cal.c:1070
-#, fuzzy
-msgid "Snooze"
-msgstr "òÏÚͦÒ"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:9
-#, fuzzy
-msgid "Edit appointment"
-msgstr "úÕÓÔÒ¦Þ"
-
-#: calendar/gui/dialogs/alarm-notify.glade.h:10
-msgid "Snooze time (minutes)"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:245 calendar/gui/event-editor.c:1198
-msgid "FIXME: _Delete"
-msgstr "óÔÅÒÔÉ"
-
-#: calendar/gui/dialogs/task-editor.c:287
-#: calendar/gui/dialogs/task-editor.c:295
-#, fuzzy
-msgid "FIXME: In_complete Task"
-msgstr "úÁ×ÄÁÎÎÑ"
-
-#: calendar/gui/dialogs/task-editor.c:347 calendar/gui/event-editor.c:1300
-msgid "FIXME: Chec_k Names"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:348 calendar/gui/event-editor.c:1301
-msgid "FIXME: Address _Book..."
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:355
-#, fuzzy
-msgid "FIXME: _New Task"
-msgstr "úÁ×ÄÁÎÎÑ"
-
-#: calendar/gui/dialogs/task-editor.c:357
-msgid "FIXME: S_end Status Report"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:358
-#, fuzzy
-msgid "FIXME: _Mark Complete"
-msgstr "óÔÅÒÔÉ"
-
-#: calendar/gui/dialogs/task-editor.c:360 calendar/gui/event-editor.c:1310
-msgid "FIXME: Rec_urrence..."
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:361
-msgid "FIXME: S_kip Occurrence"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:363
-#, fuzzy
-msgid "FIXME: Assig_n Task"
-msgstr "úÁ×ÄÁÎÎÑ"
-
-#: calendar/gui/dialogs/task-editor.c:365
-#, fuzzy
-msgid "FIXME: _Reply"
-msgstr "óÔÅÒÔÉ"
-
-#: calendar/gui/dialogs/task-editor.c:366
-#, fuzzy
-msgid "FIXME: Reply to A_ll"
-msgstr "÷¦ÄÐÏצÓÔÉ ×Ó¦Í"
-
-#: calendar/gui/dialogs/task-editor.c:409 calendar/gui/event-editor.c:1370
-msgid "FIXME: Save and Close"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:410
-msgid "Save the task and close the dialog box"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:414 calendar/gui/event-editor.c:1375
-msgid "FIXME: Print..."
-msgstr "äÒÕËÕ×ÁÔÉ..."
-
-#: calendar/gui/dialogs/task-editor.c:419 calendar/gui/event-editor.c:1380
-msgid "FIXME: Recurrence..."
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:420 calendar/gui/event-editor.c:1381
-msgid "Configure recurrence rules"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:422
-#, fuzzy
-msgid "FIXME: Assign Task..."
-msgstr "úÁ×ÄÁÎÎÑ"
-
-#: calendar/gui/dialogs/task-editor.c:423
-msgid "Assign the task to someone"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor.c:425 calendar/gui/event-editor.c:1386
-msgid "FIXME: Delete"
-msgstr "óÔÅÒÔÉ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:7
-#, fuzzy
-msgid "S_ubject:"
-msgstr "ôÅÍÁ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:8
-msgid "Owner:"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:9
-msgid "Sta_rt Date:"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:10
-#, fuzzy
-msgid "_Due Date:"
-msgstr "äÁÔÁ"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:11
-msgid "_Status:"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:12
-msgid ""
-"Not Started\n"
-"In Progress\n"
-"Completed\n"
-"Cancelled\n"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:17
-msgid "Not Started"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:18
-#, fuzzy
-msgid "_Priority:"
-msgstr "ðÒÉÏÒ¦ÔÅÔ"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:19
-msgid ""
-"High\n"
-"Normal\n"
-"Low\n"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:23
-#, fuzzy
-msgid "High"
-msgstr "÷ÉÓÏÔÁ:"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:24
-msgid "% Comp_lete:"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:25
-#, fuzzy
-msgid "_Contacts..."
-msgstr "ú×'ÑÚËÉ..."
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:28
-#, fuzzy
-msgid "Task"
-msgstr "úÁ×ÄÁÎÎÑ"
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:29
-msgid "Date Completed:"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:30
-msgid "Location:"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:31
-msgid "URL:"
-msgstr ""
-
-#: calendar/gui/dialogs/task-editor-dialog.glade.h:32
-msgid "Resources:"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:189
-msgid "Comment"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:194
-msgid "Completed"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:199
-msgid "Created"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:204
-#, fuzzy
-msgid "Description"
-msgstr "ïÐÉÓ:"
-
-#: calendar/gui/e-calendar-table.c:209
-msgid "Timestamp"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:214
-msgid "Start Date"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:219
-#, fuzzy
-msgid "End Date"
-msgstr "äÁÔÁ"
-
-#: calendar/gui/e-calendar-table.c:224
-msgid "Geographical Position"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:229
-msgid "Last Modification Date"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:234
-#, fuzzy
-msgid "Location"
-msgstr "䦧"
-
-#: calendar/gui/e-calendar-table.c:239
-#, fuzzy
-msgid "Organizer"
-msgstr "ïÒ¦¤ÎÔÁæÑ"
-
-#: calendar/gui/e-calendar-table.c:244
-msgid "% Complete"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:249 calendar/gui/gncal-todo.c:436
-#: calendar/gui/prop.c:609 mail/message-list.c:507
-msgid "Priority"
-msgstr "ðÒÉÏÒ¦ÔÅÔ"
-
-#: calendar/gui/e-calendar-table.c:260
-#, fuzzy
-msgid "TaskPad"
-msgstr "úÁ×ÄÁÎÎÑ"
-
-#: calendar/gui/e-calendar-table.c:265
-msgid "URL"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:270
-#: calendar/gui/event-editor-dialog.glade.h:41
-msgid "Reminder"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:369
-#, fuzzy
-msgid "Open..."
-msgstr "÷¦ÄËÒÉÔÉ"
-
-#: calendar/gui/e-calendar-table.c:370
-msgid "Open the task"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:372
-msgid "Mark Complete"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:373
-msgid "Mark the task complete"
-msgstr ""
-
-#: calendar/gui/e-calendar-table.c:376
-#, fuzzy
-msgid "Delete the task"
-msgstr "óÔÅÒÔÉ ÃÅ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: calendar/gui/e-day-view-time-item.c:391
-#, c-format
-msgid "%02i minute divisions"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2317 calendar/gui/e-day-view.c:2324
-#: calendar/gui/e-day-view.c:2333 calendar/gui/e-week-view.c:2643
-#: calendar/gui/e-week-view.c:2650 calendar/gui/e-week-view.c:2659
-#, fuzzy
-msgid "New appointment..."
-msgstr "úÕÓÔÒ¦Þ"
-
-#: calendar/gui/e-day-view.c:2321 calendar/gui/e-day-view.c:2328
-#: calendar/gui/e-week-view.c:2647 calendar/gui/e-week-view.c:2654
-msgid "Edit this appointment..."
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2322 calendar/gui/e-week-view.c:2648
-#, fuzzy
-msgid "Delete this appointment"
-msgstr "óÔÅÒÔÉ ÃÅ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: calendar/gui/e-day-view.c:2329 calendar/gui/e-week-view.c:2655
-msgid "Make this appointment movable"
-msgstr ""
-
-#: calendar/gui/e-day-view.c:2330 calendar/gui/e-week-view.c:2656
-#, fuzzy
-msgid "Delete this occurrence"
-msgstr "óÔÅÒÔÉ ÃÅ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: calendar/gui/e-day-view.c:2331 calendar/gui/e-week-view.c:2657
-msgid "Delete all occurrences"
-msgstr ""
-
-#: calendar/gui/event-editor.c:291
-#, fuzzy
-msgid "Edit Appointment"
-msgstr "úÕÓÔÒ¦Þ"
-
-#: calendar/gui/event-editor.c:296
-msgid "No summary"
-msgstr ""
-
-#: calendar/gui/event-editor.c:300
-#, fuzzy, c-format
-msgid "Appointment - %s"
-msgstr "úÕÓÔÒ¦Þ"
-
-#: calendar/gui/event-editor.c:303
-#, c-format
-msgid "Task - %s"
-msgstr ""
-
-#: calendar/gui/event-editor.c:306
-#, fuzzy, c-format
-msgid "Journal entry - %s"
-msgstr "öÕÒÎÁÌØÎÉÊ ÒÑÄÏË"
-
-#. Owner, summary
-#: calendar/gui/event-editor.c:622 calendar/gui/event-editor.c:718
-msgid "?"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1265
-msgid "FIXME: Ca_lendar..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1308
-#, fuzzy
-msgid "FIXME: _New Appointment"
-msgstr "úÕÓÔÒ¦Þ"
-
-#: calendar/gui/event-editor.c:1312
-#, fuzzy
-msgid "FIXME: Invite _Attendees..."
-msgstr "."
-
-#: calendar/gui/event-editor.c:1313
-msgid "FIXME: C_ancel Invitation..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1315
-msgid "FIXME: Forward as v_Calendar"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1383
-msgid "FIXME: Invite Attendees..."
-msgstr ""
-
-#: calendar/gui/event-editor.c:1384
-msgid "Invite attendees to a meeting"
-msgstr ""
-
-#: calendar/gui/event-editor.c:1828
-msgid "%a %b %d %Y"
-msgstr ""
-
-#. todo
-#.
-#. build some of the recur stuff by hand to take into account
-#. the start-on-monday preference?
-#.
-#. get the apply button to work right
-#.
-#. make the properties stuff unglobal
-#.
-#. figure out why alarm units aren't sticking between edits
-#.
-#. closing the dialog window with the wm caused a crash
-#. Gtk-WARNING **: invalid cast from `(unknown)' to `GnomeDialog'
-#. on line 669: gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
-#.
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: calendar/gui/event-editor-dialog.glade.h:7
-msgid "event-editor-dialog"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:8
-msgid "_Summary:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:9
-msgid "_Owner:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:10
-msgid "Time"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:11
-msgid "Start time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:12
-msgid "End time:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:13
-msgid "A_ll day event"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:14
-msgid "Classification"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:15
-msgid "Pu_blic"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:16
-#, fuzzy
-msgid "Pri_vate"
-msgstr "÷ÓÔÁ×ÉÔÉ"
-
-#: calendar/gui/event-editor-dialog.glade.h:17
-msgid "_Confidential"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:19
-#: calendar/gui/event-editor-dialog.glade.h:23
-#: calendar/gui/event-editor-dialog.glade.h:27
-#: calendar/gui/event-editor-dialog.glade.h:31
-msgid ""
-"Minutes\n"
-"Hours\n"
-"Days\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:35
-msgid "_Display"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:36
-#, fuzzy
-msgid "_Audio"
-msgstr "äÏÄÁÔÉ"
-
-#: calendar/gui/event-editor-dialog.glade.h:37
-msgid "_Program"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:38
-#, fuzzy
-msgid "_Mail"
-msgstr "íϦÌØÎÉÊ ÔÅÌÅÆÏÎ"
-
-#: calendar/gui/event-editor-dialog.glade.h:39
-msgid "Mail _to:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:40
-msgid "_Run program:"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:42
-msgid "Recurrence rule"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:43 shell/e-shell-view.c:865
-#, fuzzy
-msgid "None"
-msgstr "îÏÔÁÔËÁ"
-
-#: calendar/gui/event-editor-dialog.glade.h:44
-#, fuzzy
-msgid "Daily"
-msgstr "ðÏÄÒÏÂÉæ"
-
-#: calendar/gui/event-editor-dialog.glade.h:45
-msgid "Weekly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:46
-msgid "Monthly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:47
-msgid "Yearly"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:48
-#, fuzzy
-msgid "label23"
-msgstr "ÐÏÚÎÁÞËÁ2"
-
-#: calendar/gui/event-editor-dialog.glade.h:49
-#: calendar/gui/event-editor-dialog.glade.h:52
-#: calendar/gui/event-editor-dialog.glade.h:82
-msgid "Every "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:50
-msgid "day(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:51
-#, fuzzy
-msgid "label24"
-msgstr "ÐÏÚÎÁÞËÁ2"
-
-#: calendar/gui/event-editor-dialog.glade.h:53
-msgid "week(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:54
-#: calendar/gui/gnome-month-item.c:737
-msgid "Mon"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:55
-#: calendar/gui/gnome-month-item.c:738
-msgid "Tue"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:56
-#: calendar/gui/gnome-month-item.c:739
-msgid "Wed"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:57
-#: calendar/gui/gnome-month-item.c:740
-msgid "Thu"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:58
-#: calendar/gui/gnome-month-item.c:741
-msgid "Fri"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:59
-#: calendar/gui/gnome-month-item.c:742
-msgid "Sat"
-msgstr ""
-
-#. Initialize by default to three-letter day names
-#: calendar/gui/event-editor-dialog.glade.h:60
-#: calendar/gui/gnome-month-item.c:736
-msgid "Sun"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:61
-#, fuzzy
-msgid "label25"
-msgstr "ÐÏÚÎÁÞËÁ2"
-
-#: calendar/gui/event-editor-dialog.glade.h:62
-#: calendar/gui/event-editor-dialog.glade.h:63
-msgid "Recur on the"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:64
-msgid "th day of the month"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:65
-msgid ""
-"1st\n"
-"2nd\n"
-"3rd\n"
-"4th\n"
-"5th\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:71
-msgid ""
-"Monday\n"
-"Tuesday\n"
-"Wednesday\n"
-"Thursday\n"
-"Friday\n"
-"Saturday\n"
-"Sunday\n"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:79
-msgid "Every"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:80
-#, fuzzy
-msgid "month(s)"
-msgstr "ûÒÉÆÔÉ"
-
-#: calendar/gui/event-editor-dialog.glade.h:83
-msgid "year(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:84
-#, fuzzy
-msgid "label27"
-msgstr "ÐÏÚÎÁÞËÁ2"
-
-#: calendar/gui/event-editor-dialog.glade.h:85
-msgid "Ending date"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:86
-msgid "Repeat forever"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:87
-msgid "End on "
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:88
-msgid "End after"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:89
-msgid "occurrence(s)"
-msgstr ""
-
-#: calendar/gui/event-editor-dialog.glade.h:90
-#, fuzzy
-msgid "Exceptions"
-msgstr "ðÁÒÁÍÅÔÒÉ"
-
-#: calendar/gui/event-editor-dialog.glade.h:92
-#, fuzzy
-msgid "Change"
-msgstr "óÔÏÒ¦ÎËÁ"
-
-#: calendar/gui/event-editor-dialog.glade.h:94
-msgid "Recurrence"
-msgstr ""
-
-#: calendar/gui/getdate.y:391
-msgid "january"
-msgstr ""
-
-#: calendar/gui/getdate.y:392
-msgid "february"
-msgstr ""
-
-#: calendar/gui/getdate.y:393
-msgid "march"
-msgstr ""
-
-#: calendar/gui/getdate.y:394
-#, fuzzy
-msgid "april"
-msgstr "ðÁЦÒ"
-
-#: calendar/gui/getdate.y:395
-msgid "may"
-msgstr ""
-
-#: calendar/gui/getdate.y:396
-msgid "june"
-msgstr ""
-
-#: calendar/gui/getdate.y:397
-msgid "july"
-msgstr ""
-
-#: calendar/gui/getdate.y:398
-msgid "august"
-msgstr ""
-
-#: calendar/gui/getdate.y:399
-msgid "september"
-msgstr ""
-
-#: calendar/gui/getdate.y:400
-msgid "sept"
-msgstr ""
-
-#: calendar/gui/getdate.y:401
-msgid "october"
-msgstr ""
-
-#: calendar/gui/getdate.y:402
-msgid "november"
-msgstr ""
-
-#: calendar/gui/getdate.y:403
-msgid "december"
-msgstr ""
-
-#: calendar/gui/getdate.y:404
-msgid "sunday"
-msgstr ""
-
-#: calendar/gui/getdate.y:405
-#, fuzzy
-msgid "monday"
-msgstr "ô¦ÌÏ"
-
-#: calendar/gui/getdate.y:406
-msgid "tuesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:407
-msgid "tues"
-msgstr ""
-
-#: calendar/gui/getdate.y:408
-msgid "wednesday"
-msgstr ""
-
-#: calendar/gui/getdate.y:409
-msgid "wednes"
-msgstr ""
-
-#: calendar/gui/getdate.y:410
-msgid "thursday"
-msgstr ""
-
-#: calendar/gui/getdate.y:411
-msgid "thur"
-msgstr ""
-
-#: calendar/gui/getdate.y:412
-msgid "thurs"
-msgstr ""
-
-#: calendar/gui/getdate.y:413
-msgid "friday"
-msgstr ""
-
-#: calendar/gui/getdate.y:414
-msgid "saturday"
-msgstr ""
-
-#: calendar/gui/getdate.y:420
-#, fuzzy
-msgid "year"
-msgstr "úÁÇÏÌÏ×ÏË"
-
-#: calendar/gui/getdate.y:421
-#, fuzzy
-msgid "month"
-msgstr "ûÒÉÆÔÉ"
-
-#: calendar/gui/getdate.y:422
-msgid "fortnight"
-msgstr ""
-
-#: calendar/gui/getdate.y:423
-msgid "week"
-msgstr ""
-
-#: calendar/gui/getdate.y:424
-msgid "day"
-msgstr ""
-
-#: calendar/gui/getdate.y:425
-msgid "hour"
-msgstr ""
-
-#: calendar/gui/getdate.y:426
-msgid "minute"
-msgstr ""
-
-#: calendar/gui/getdate.y:427
-msgid "min"
-msgstr ""
-
-#: calendar/gui/getdate.y:428
-#, fuzzy
-msgid "second"
-msgstr "÷¦Ä¦ÓÌÁÔÉ"
-
-#: calendar/gui/getdate.y:429
-msgid "sec"
-msgstr ""
-
-#: calendar/gui/getdate.y:435
-msgid "tomorrow"
-msgstr ""
-
-#: calendar/gui/getdate.y:436
-msgid "yesterday"
-msgstr ""
-
-#: calendar/gui/getdate.y:437
-#, fuzzy
-msgid "today"
-msgstr "ô¦ÌÏ"
-
-#: calendar/gui/getdate.y:438
-#, fuzzy
-msgid "now"
-msgstr "צËÎÏ1"
-
-#: calendar/gui/getdate.y:439
-#, fuzzy
-msgid "last"
-msgstr "÷ÓÔÁ×ÉÔÉ"
-
-#: calendar/gui/getdate.y:440
-msgid "this"
-msgstr ""
-
-#: calendar/gui/getdate.y:441
-msgid "next"
-msgstr ""
-
-#: calendar/gui/getdate.y:442
-msgid "first"
-msgstr ""
-
-#. { N_("second"), tUNUMBER, 2 },
-#: calendar/gui/getdate.y:444
-msgid "third"
-msgstr ""
-
-#: calendar/gui/getdate.y:445
-#, fuzzy
-msgid "fourth"
-msgstr "óÏÒÔÕ×ÁÔÉ"
-
-#: calendar/gui/getdate.y:446
-msgid "fifth"
-msgstr ""
-
-#: calendar/gui/getdate.y:447
-msgid "sixth"
-msgstr ""
-
-#: calendar/gui/getdate.y:448
-msgid "seventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:449
-#, fuzzy
-msgid "eighth"
-msgstr "÷ÉÓÏÔÁ:"
-
-#: calendar/gui/getdate.y:450
-#, fuzzy
-msgid "ninth"
-msgstr "äÒÕËÕ×ÁÔÉ"
-
-#: calendar/gui/getdate.y:451
-msgid "tenth"
-msgstr ""
-
-#: calendar/gui/getdate.y:452
-msgid "eleventh"
-msgstr ""
-
-#: calendar/gui/getdate.y:453
-msgid "twelfth"
-msgstr ""
-
-#: calendar/gui/getdate.y:454
-msgid "ago"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Create to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:140
-msgid "Edit to-do item"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:176
-msgid "Summary:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:186
-#, fuzzy
-msgid "Due Date:"
-msgstr "äÁÔÁ"
-
-#: calendar/gui/gncal-todo.c:195
-#, fuzzy
-msgid "Priority:"
-msgstr "ðÒÉÏÒ¦ÔÅÔ"
-
-#: calendar/gui/gncal-todo.c:212
-msgid "Item Comments:"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:334
-msgid "Add to-do item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:335
-msgid "Edit this item..."
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:434
-msgid "Summary"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:435 calendar/gui/prop.c:608
-#, fuzzy
-msgid "Due Date"
-msgstr "äÁÔÁ"
-
-#: calendar/gui/gncal-todo.c:437
-msgid "Time Left"
-msgstr ""
-
-#. Label
-#: calendar/gui/gncal-todo.c:449
-#, fuzzy
-msgid "To-do list"
-msgstr "¶ÎÓÔÒÕÍÅÎÔÉ"
-
-#. Add
-#: calendar/gui/gncal-todo.c:488
-#: composer/e-msg-composer-address-dialog.glade.h:13
-msgid "Add..."
-msgstr "äÏÄÁÔÉ..."
-
-#. Edit
-#: calendar/gui/gncal-todo.c:497
-#, fuzzy
-msgid "Edit..."
-msgstr "äÏÄÁÔÉ..."
-
-#: calendar/gui/gncal-todo.c:721
-msgid "Weeks"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:722 calendar/gui/gncal-todo.c:726
-msgid "Days"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hours"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:727 calendar/gui/gncal-todo.c:731
-msgid "Hour"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minutes"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:732 calendar/gui/gncal-todo.c:736
-msgid "Minute"
-msgstr ""
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-#, fuzzy
-msgid "Seconds"
-msgstr "÷¦Ä¦ÓÌÁÔÉ"
-
-#: calendar/gui/gncal-todo.c:737 calendar/gui/gncal-todo.c:741
-#, fuzzy
-msgid "Second"
-msgstr "÷¦Ä¦ÓÌÁÔÉ"
-
-#: calendar/gui/gnome-cal.c:461 calendar/gui/gnome-cal.c:1078
-#: calendar/gui/gnome-cal.c:1134
-msgid "Reminder of your appointment at "
-msgstr ""
-
-#. Idea: we need Snooze option :-)
-#: calendar/gui/gnome-cal.c:1083 calendar/gui/gnome-cal.c:1138
-msgid "Ok"
-msgstr "çÁÒÁÚÄ"
-
-#: calendar/gui/goto.c:82
-msgid "Year:"
-msgstr "ò¦Ë:"
-
-#: calendar/gui/goto.c:264
-msgid "Go to date"
-msgstr ""
-
-#. Instructions
-#: calendar/gui/goto.c:275
-msgid ""
-"Please select the date you want to go to.\n"
-"When you click on a day, you will be taken\n"
-"to that date."
-msgstr ""
-
-#: calendar/gui/goto.c:312
-msgid "Go to today"
-msgstr ""
-
-#: calendar/gui/print.c:265
-msgid "1st"
-msgstr "1"
-
-#: calendar/gui/print.c:265
-msgid "2nd"
-msgstr "2"
-
-#: calendar/gui/print.c:265
-msgid "3rd"
-msgstr "3"
-
-#: calendar/gui/print.c:265
-msgid "4th"
-msgstr "4"
-
-#: calendar/gui/print.c:265
-msgid "5th"
-msgstr "5"
-
-#: calendar/gui/print.c:266
-msgid "6th"
-msgstr "6"
-
-#: calendar/gui/print.c:266
-msgid "7th"
-msgstr "7"
-
-#: calendar/gui/print.c:266
-msgid "8th"
-msgstr "8"
-
-#: calendar/gui/print.c:266
-msgid "9th"
-msgstr "9"
-
-#: calendar/gui/print.c:266
-msgid "10th"
-msgstr "10"
-
-#: calendar/gui/print.c:267
-msgid "11th"
-msgstr "11"
-
-#: calendar/gui/print.c:267
-msgid "12th"
-msgstr "12"
-
-#: calendar/gui/print.c:267
-msgid "13th"
-msgstr "13"
-
-#: calendar/gui/print.c:267
-msgid "14th"
-msgstr "14"
-
-#: calendar/gui/print.c:267
-msgid "15th"
-msgstr "15"
-
-#: calendar/gui/print.c:268
-msgid "16th"
-msgstr "16"
-
-#: calendar/gui/print.c:268
-msgid "17th"
-msgstr "17"
-
-#: calendar/gui/print.c:268
-msgid "18th"
-msgstr "18"
-
-#: calendar/gui/print.c:268
-msgid "19th"
-msgstr "19"
-
-#: calendar/gui/print.c:268
-msgid "20th"
-msgstr "20"
-
-#: calendar/gui/print.c:269
-msgid "21st"
-msgstr "21"
-
-#: calendar/gui/print.c:269
-msgid "22nd"
-msgstr "22"
-
-#: calendar/gui/print.c:269
-msgid "23rd"
-msgstr "23"
-
-#: calendar/gui/print.c:269
-msgid "24th"
-msgstr "24"
-
-#: calendar/gui/print.c:269
-msgid "25th"
-msgstr "25"
-
-#: calendar/gui/print.c:270
-msgid "26th"
-msgstr "26"
-
-#: calendar/gui/print.c:270
-msgid "27th"
-msgstr "27"
-
-#: calendar/gui/print.c:270
-msgid "28th"
-msgstr "28"
-
-#: calendar/gui/print.c:270
-msgid "29th"
-msgstr "29"
-
-#: calendar/gui/print.c:270
-msgid "30th"
-msgstr "30"
-
-#: calendar/gui/print.c:271
-msgid "31st"
-msgstr "31"
-
-#: calendar/gui/print.c:326
-msgid "Su"
-msgstr "îÄÌ"
-
-#: calendar/gui/print.c:326
-msgid "Mo"
-msgstr "ðÎÄ"
-
-#: calendar/gui/print.c:326
-msgid "Tu"
-msgstr "÷ÔÒ"
-
-#: calendar/gui/print.c:326
-msgid "We"
-msgstr "óÒÄ"
-
-#: calendar/gui/print.c:326
-msgid "Th"
-msgstr "þÔ×"
-
-#: calendar/gui/print.c:326
-msgid "Fr"
-msgstr "ðÔÎ"
-
-#: calendar/gui/print.c:326
-msgid "Sa"
-msgstr "óÂÔ"
-
-#: calendar/gui/print.c:868
-msgid "TODO Items"
-msgstr ""
-
-#. Day
-#: calendar/gui/print.c:980
-msgid "Current day (%a %b %d %Y)"
-msgstr "ðÏÔÏÞÎÉÊ ÄÅÎØ (%a %b %d %Y)"
-
-#: calendar/gui/print.c:1000 calendar/gui/print.c:1014
-#: calendar/gui/print.c:1015
-msgid "%a"
-msgstr "%a"
-
-#: calendar/gui/print.c:1001 calendar/gui/print.c:1002
-#: calendar/gui/print.c:1016 calendar/gui/print.c:1017
-msgid "%b"
-msgstr "%b"
-
-#: calendar/gui/print.c:1004
-#, c-format
-msgid "Current week (%s %s %d - %s %d %d)"
-msgstr "ðÏÔÏÞÎÉÊ ÔÉÖÄÅÎØ (%s %s %d - %s %d %d)"
-
-#: calendar/gui/print.c:1021
-#, c-format
-msgid "Current week (%s %s %d - %s %s %d %d)"
-msgstr "ðÏÔÏÞÎÉÊ ÔÉÖÄÅÎØ (%s %s %d - %s %s %d %d)"
-
-#: calendar/gui/print.c:1027
-#, c-format
-msgid "Current week (%s %s %d %d - %s %s %d %d)"
-msgstr "ðÏÔÏÞÎÉÊ ÔÉÖÄÅÎØ (%s %s %d %d - %s %s %d %d)"
-
-#. Month
-#: calendar/gui/print.c:1040
-msgid "Current month (%a %Y)"
-msgstr "ðÏÔÏÞÎÉÊ Í¦ÓÑÃØ (%a %Y)"
-
-#. Year
-#: calendar/gui/print.c:1047
-msgid "Current year (%Y)"
-msgstr "ðÏÔÏÞÎÉÊ Ò¦Ë (%Y)"
-
-#: calendar/gui/print.c:1084
-msgid "Print Calendar"
-msgstr "îÁÄÒÕËÕ×ÁÔÉ ËÁÌÅÎÄÁÒ"
-
-#: calendar/gui/print.c:1249
-msgid "Print Preview"
-msgstr "ðÅÒÅÇÌÑÄ ÄÒÕËÕ"
-
-#: calendar/gui/prop.c:334
-msgid "Time display"
-msgstr ""
-
-#. Time format
-#: calendar/gui/prop.c:338
-msgid "Time format"
-msgstr ""
-
-#: calendar/gui/prop.c:339
-msgid "12-hour (AM/PM)"
-msgstr ""
-
-#: calendar/gui/prop.c:340
-msgid "24-hour"
-msgstr ""
-
-#. Weeks start on
-#: calendar/gui/prop.c:350
-msgid "Weeks start on"
-msgstr ""
-
-#: calendar/gui/prop.c:351
-#, fuzzy
-msgid "Sunday"
-msgstr "÷¦Ä¦ÓÌÁÔÉ"
-
-#: calendar/gui/prop.c:352
-#, fuzzy
-msgid "Monday"
-msgstr "ô¦ÌÏ"
-
-#. Day range
-#: calendar/gui/prop.c:362
-msgid "Day range"
-msgstr ""
-
-#: calendar/gui/prop.c:373
-msgid ""
-"Please select the start and end hours you want\n"
-"to be displayed in the day view and week view.\n"
-"Times outside this range will not be displayed\n"
-"by default."
-msgstr ""
-
-#: calendar/gui/prop.c:389
-msgid "Day start:"
-msgstr ""
-
-#: calendar/gui/prop.c:400
-msgid "Day end:"
-msgstr ""
-
-#: calendar/gui/prop.c:523
-msgid "Colors for display"
-msgstr ""
-
-#: calendar/gui/prop.c:526
-msgid "Colors"
-msgstr ""
-
-#: calendar/gui/prop.c:603
-msgid "Show on TODO List:"
-msgstr ""
-
-#: calendar/gui/prop.c:610
-msgid "Time Until Due"
-msgstr ""
-
-#: calendar/gui/prop.c:641
-msgid "To Do List style options:"
-msgstr ""
-
-#: calendar/gui/prop.c:646
-msgid "Highlight overdue items"
-msgstr ""
-
-#: calendar/gui/prop.c:649
-msgid "Highlight not yet due items"
-msgstr ""
-
-#: calendar/gui/prop.c:652
-msgid "Highlight items due today"
-msgstr ""
-
-#: calendar/gui/prop.c:682
-msgid "To Do List Properties"
-msgstr ""
-
-#: calendar/gui/prop.c:685
-msgid "To Do List"
-msgstr ""
-
-#: calendar/gui/prop.c:784
-msgid "Alarms"
-msgstr ""
-
-#. build miscellaneous box
-#: calendar/gui/prop.c:787
-#, fuzzy
-msgid "Alarm Properties"
-msgstr "÷ÌÁÓÔÉ×ÏÓÔ¦ ÄÏÌÕÞÅÎÎÑ"
-
-#: calendar/gui/prop.c:797
-msgid "Beep on display alarms"
-msgstr ""
-
-#: calendar/gui/prop.c:807
-msgid "Audio alarms timeout after"
-msgstr ""
-
-#: calendar/gui/prop.c:818 calendar/gui/prop.c:835
-msgid " seconds"
-msgstr ""
-
-#: calendar/gui/prop.c:824
-msgid "Enable snoozing for "
-msgstr ""
-
-#. populate default frame/box
-#: calendar/gui/prop.c:840
-#, fuzzy
-msgid "Defaults"
-msgstr "ðÏÄÒÏÂÉæ"
-
-#: composer/e-msg-composer-address-dialog.c:182
-msgid "Cut"
-msgstr "÷ÉÒ¦ÚÁÔÉ"
-
-#: composer/e-msg-composer-address-dialog.c:183
-msgid "Cut selected item into clipboard"
-msgstr "÷ÉÒ¦ÚÁÔÉ ×ÉÂÒÁÎÉÊ ÅÌÅÍÅÎÔ × ÂÕÆÅÒ ÏÂͦÎÕ"
-
-#: composer/e-msg-composer-address-dialog.c:186
-msgid "Copy"
-msgstr "óËÏЦÀ×ÁÔÉ"
-
-#: composer/e-msg-composer-address-dialog.c:187
-msgid "Copy selected item into clipboard"
-msgstr "óËÏЦÀ×ÁÔÉ ×ÉÂÒÁÎÉÊ ÅÌÅÍÅÎÔ × ÂÕÆÅÒ ÏÂͦÎÕ"
-
-#: composer/e-msg-composer-address-dialog.c:190
-#: composer/e-msg-composer-address-dialog.c:198
-msgid "Paste"
-msgstr "÷ÓÔÁ×ÉÔÉ"
-
-#: composer/e-msg-composer-address-dialog.c:191
-#: composer/e-msg-composer-address-dialog.c:199
-msgid "Paste item from clipboard"
-msgstr "÷ÓÔÁ×ÉÔÉ ÅÌÅÍÅÎÔ Ú ÂÕÆÅÒÕ ÏÂͦÎÕ"
-
-#: composer/e-msg-composer-address-dialog.c:525
-msgid "Select recipients' addresses"
-msgstr "÷ÉÂÒÁÔÉ ÁÄÒÅÓÉ ÁÄÒÅÓÁÔ¦×"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-address-dialog.glade.h:7
-msgid "Recipient list:"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:9
-msgid "Search..."
-msgstr "ðÏÛÕË..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:10
-msgid "Name"
-msgstr "¶Í'Ñ"
-
-#: composer/e-msg-composer-address-dialog.glade.h:11
-#: mail/mail-config.glade.h:8
-msgid "Address"
-msgstr "áÄÒÅÓÁ"
-
-#: composer/e-msg-composer-address-dialog.glade.h:12
-msgid "Properties..."
-msgstr "÷ÌÁÓÔÉ×ÏÓÔ¦..."
-
-#: composer/e-msg-composer-address-dialog.glade.h:14
-msgid "To: >>"
-msgstr "äÏ: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:15
-msgid "Cc: >>"
-msgstr "Cc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:16
-msgid "Bcc: >>"
-msgstr "Bcc: >>"
-
-#: composer/e-msg-composer-address-dialog.glade.h:17
-msgid "label9"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:18
-msgid "label7"
-msgstr ""
-
-#: composer/e-msg-composer-address-dialog.glade.h:19
-msgid "label8"
-msgstr ""
-
-#: composer/e-msg-composer-attachment-bar.c:76
-msgid "1 byte"
-msgstr "1 ÂÁÊÔ"
-
-#: composer/e-msg-composer-attachment-bar.c:78
-#, c-format
-msgid "%u bytes"
-msgstr "%u ÂÁÊÔ¦×"
-
-#: composer/e-msg-composer-attachment-bar.c:85
-#, c-format
-msgid "%.1fK"
-msgstr "%.1fë"
-
-#: composer/e-msg-composer-attachment-bar.c:89
-#, c-format
-msgid "%.1fM"
-msgstr "%.1fí"
-
-#: composer/e-msg-composer-attachment-bar.c:93
-#, c-format
-msgid "%.1fG"
-msgstr "%.1fç"
-
-#: composer/e-msg-composer-attachment-bar.c:299
-msgid "Add attachment"
-msgstr "äÏÌÕÞÉÔÉ"
-
-#: composer/e-msg-composer-attachment-bar.c:362 shell/e-shortcuts-view.c:333
-msgid "Remove"
-msgstr "÷ÉÄÁÌÉÔÉ"
-
-#: composer/e-msg-composer-attachment-bar.c:363
-msgid "Remove selected items from the attachment list"
-msgstr "÷ÉÄÁÌÉÔÉ ×ÉÂÒÁΦ ÅÌÅÍÅÎÔÉ Ú ÓÐÉÓËÕ ÄÏÌÕÞÅÎÎÑ"
-
-#: composer/e-msg-composer-attachment-bar.c:394
-msgid "Add attachment..."
-msgstr "äÏÌÕÞÉÔÉ..."
-
-#: composer/e-msg-composer-attachment-bar.c:395
-msgid "Attach a file to the message"
-msgstr "äÏÌÕÞÉÔÉ ÆÁÊÌ ÄÏ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: composer/e-msg-composer-attachment.glade.h:7
-msgid "Attachment properties"
-msgstr "÷ÌÁÓÔÉ×ÏÓÔ¦ ÄÏÌÕÞÅÎÎÑ"
-
-#: composer/e-msg-composer-attachment.glade.h:8
-msgid "MIME type:"
-msgstr "ôÉÐ MIME:"
-
-#: composer/e-msg-composer-attachment.glade.h:10
-msgid "File name:"
-msgstr "îÁÚ×Á ÆÁÊÌÕ:"
-
-#: composer/e-msg-composer-hdrs.c:137 composer/e-msg-composer-hdrs.c:295
-#, fuzzy
-msgid "From:"
-msgstr "÷¦Ä"
-
-#: composer/e-msg-composer-hdrs.c:243
-msgid "Click here for the address book"
-msgstr "ëÌÁÃΦÔØ ÔÕÔ ÝÏ ×ÉËÌÉËÁÔÉ ÁÄÒÅÓÎÕ ËÎÉÇÕ"
-
-#: composer/e-msg-composer-hdrs.c:296
-#, fuzzy
-msgid "Enter the identitiy you wish to send this message from"
-msgstr "÷×ÅĦÔØ ÁÄÒÅÓÁÔ¦× ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: composer/e-msg-composer-hdrs.c:300
-msgid "To:"
-msgstr "äÏ:"
-
-#: composer/e-msg-composer-hdrs.c:301
-msgid "Enter the recipients of the message"
-msgstr "÷×ÅĦÔØ ÁÄÒÅÓÁÔ¦× ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: composer/e-msg-composer-hdrs.c:305
-msgid "Cc:"
-msgstr "Cc:"
-
-#: composer/e-msg-composer-hdrs.c:306
-msgid "Enter the addresses that will receive a carbon copy of the message"
-msgstr "÷×ÅĦÔØ ÁÄÒÅÓÁÔ¦×, ÝÏ ÏÔÒÉÍÁÀÔØ ËÏЦÀ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: composer/e-msg-composer-hdrs.c:311
-msgid "Bcc:"
-msgstr "Bcc:"
-
-#: composer/e-msg-composer-hdrs.c:312
-msgid ""
-"Enter the addresses that will receive a carbon copy of the message without "
-"appearing in the recipient list of the message."
-msgstr ""
-"÷×ÅĦÔØ ÁÄÒÅÓÁÔ¦×, ÝÏ ÏÔÒÉÍÁÀÔØ ËÏЦÀ ÐÏצÄÏÍÌÅÎÎÑ ÎÅ ÐÏÐÁ×ÛÉ × ÓÐÉÓÏË "
-"ÏÔÒÉÍÕ×ÁÞ¦×."
-
-#: composer/e-msg-composer-hdrs.c:318
-msgid "Subject:"
-msgstr "ôÅÍÁ:"
-
-#: composer/e-msg-composer-hdrs.c:319
-msgid "Enter the subject of the mail"
-msgstr "÷×ÅĦÔØ ÔÅÍÕ ÐÏÓÌÁÎÎÑ"
-
-#: composer/e-msg-composer.c:451
-msgid "Save as..."
-msgstr "úÂÅÒÅÇÔÉ ÑË..."
-
-#: composer/e-msg-composer.c:462
-#, c-format
-msgid "Error saving file: %s"
-msgstr "ðÏÍÉÌËÁ ÚÂÅÒÅÖÅÎÎÑ ÆÁÊÌÕ: %s"
-
-#: composer/e-msg-composer.c:482
-#, c-format
-msgid "Error loading file: %s"
-msgstr "ðÏÍÉÌËÁ ÚÁ×ÁÎÔÁÖÅÎÎÑ ÆÁÊÌÕ: %s"
-
-#: composer/e-msg-composer.c:504
-#, fuzzy
-msgid "Saving changes to message..."
-msgstr "÷¦Ä¦ÓÌÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: composer/e-msg-composer.c:506
-#, fuzzy
-msgid "About to save changes to message..."
-msgstr "äÏÌÕÞÉÔÉ ÆÁÊÌ ÄÏ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: composer/e-msg-composer.c:590 shell/e-shell-view-menu.c:165
-msgid "Evolution"
-msgstr "Evolution"
-
-#: composer/e-msg-composer.c:596
-msgid ""
-"This message has not been sent.\n"
-"\n"
-"Do you wish to save your changes?"
-msgstr ""
-
-#: composer/e-msg-composer.c:618
-msgid "Open file"
-msgstr "÷¦ÄËÒÉÔÉ ÆÁÊÌ"
-
-#: composer/e-msg-composer.c:730
-msgid "That file does not exist."
-msgstr ""
-
-#: composer/e-msg-composer.c:740
-msgid "That is not a regular file."
-msgstr ""
-
-#: composer/e-msg-composer.c:750
-msgid "That file exists but is not readable."
-msgstr ""
-
-#: composer/e-msg-composer.c:760
-msgid "That file appeared accesible but open(2) failed."
-msgstr ""
-
-#: composer/e-msg-composer.c:782
-msgid ""
-"The file is very large (more than 100K).\n"
-"Are you sure you wish to insert it?"
-msgstr ""
-
-#: composer/e-msg-composer.c:803
-msgid "An error occurred while reading the file."
-msgstr ""
-
-#: composer/e-msg-composer.c:899 shell/e-shell-view-menu.c:434
-msgid "_File"
-msgstr "æÁÊÌ"
-
-#: composer/e-msg-composer.c:905
-msgid "_Open..."
-msgstr "÷¦ÄËÒÉÔÉ..."
-
-#: composer/e-msg-composer.c:906
-msgid "Load a previously saved message"
-msgstr ""
-
-#: composer/e-msg-composer.c:914
-msgid "_Save..."
-msgstr "úÂÅÒÅÇÔÉ..."
-
-#: composer/e-msg-composer.c:915
-#, fuzzy
-msgid "Save message"
-msgstr "÷¦Ä¦ÓÌÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: composer/e-msg-composer.c:923
-#, fuzzy
-msgid "_Save as..."
-msgstr "úÂÅÒÅÇÔÉ ÑË..."
-
-#: composer/e-msg-composer.c:924
-#, fuzzy
-msgid "Save message with a different name"
-msgstr "úÂÅÒÅÇÔÉ ÐÏצÄÏÍÌÅÎÎÑ Õ ×ËÁÚÁÎ¦Ê ÔÅæ"
-
-#: composer/e-msg-composer.c:932
-msgid "Save in _folder..."
-msgstr "úÂÅÒÅÇÔÉ Õ ÔÅæ..."
-
-#: composer/e-msg-composer.c:933
-msgid "Save the message in a specified folder"
-msgstr "úÂÅÒÅÇÔÉ ÐÏצÄÏÍÌÅÎÎÑ Õ ×ËÁÚÁÎ¦Ê ÔÅæ"
-
-#: composer/e-msg-composer.c:942
-msgid "_Insert text file... (FIXME)"
-msgstr ""
-
-#: composer/e-msg-composer.c:943
-#, fuzzy
-msgid "Insert a file as text into the message"
-msgstr "äÏÌÕÞÉÔÉ ÆÁÊÌ ÄÏ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: composer/e-msg-composer.c:952
-#, fuzzy
-msgid "_Send"
-msgstr "÷¦Ä¦ÓÌÁÔÉ"
-
-#: composer/e-msg-composer.c:953
-msgid "Send the message"
-msgstr "÷¦Ä¦ÓÌÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: composer/e-msg-composer.c:963
-msgid "_Close..."
-msgstr "úÁËÒÉÔÉ..."
-
-#: composer/e-msg-composer.c:964
-msgid "Quit the message composer"
-msgstr ""
-
-#: composer/e-msg-composer.c:977 shell/e-shell-view-menu.c:478
-#, fuzzy
-msgid "_Edit"
-msgstr "äÏÄÁÔÉ..."
-
-#: composer/e-msg-composer.c:988
-msgid "_Format"
-msgstr "æÏÒÍÁÔ"
-
-#: composer/e-msg-composer.c:994
-msgid "HTML"
-msgstr "HTML"
-
-#: composer/e-msg-composer.c:995
-msgid "Send the mail in HTML format"
-msgstr "÷¦Ä¦ÓÌÁÔÉ ËÏÒÅÓÐÏÎÄÅÎæÀ × ÆÏÒÍÁÔ¦ HTML"
-
-#: composer/e-msg-composer.c:1008 shell/e-shell-view-menu.c:383
-#: shell/e-shell-view-menu.c:489 shell/e-storage-set-view.c:242
-#, fuzzy
-msgid "_View"
-msgstr "îÏ×ÉÊ"
-
-#: composer/e-msg-composer.c:1014
-#, fuzzy
-msgid "Show _attachments"
-msgstr "ðÏËÁÚÁÔÉ ÄÏÌÕÞÅÎÎÑ"
-
-#: composer/e-msg-composer.c:1015
-#, fuzzy
-msgid "Show/hide attachments"
-msgstr "ðÏËÁÚÁÔÉ/ÐÒÉÂÒÁÔÉ ÄÏÌÕÞÅÎÎÑ"
-
-#: composer/e-msg-composer.c:1048
-msgid "Send"
-msgstr "÷¦Ä¦ÓÌÁÔÉ"
-
-#: composer/e-msg-composer.c:1049
-msgid "Send this message"
-msgstr "÷¦Ä¦ÓÌÁÔÉ ÃÅ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: composer/e-msg-composer.c:1058
-msgid "Attach"
-msgstr "äÏÌÕÞÉÔÉ"
-
-#: composer/e-msg-composer.c:1059
-msgid "Attach a file"
-msgstr "äÏÌÕÞÉÔÉ ÆÁÊÌ"
-
-#: composer/e-msg-composer.c:1246
-#, fuzzy
-msgid "Compose a message"
-msgstr "ð¦ÄÇÏÔÕ×ÁÔÉ ÎÏ×Å ÐÏÛÔÏ×Å ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: filter/filter-folder.c:183 filter/vfolder-rule.c:269
-#, fuzzy
-msgid "Select Folder"
-msgstr "÷ÉÂÒÁÔÉ ÎÁÚ×É"
-
-#: filter/filter-folder.c:245
-msgid "<click here to select a folder>"
-msgstr ""
-
-#: mail/component-factory.c:187
-#, fuzzy
-msgid "Cannot initialize Evolution's mail component."
-msgstr "îÅ ×ÄÁÌÏÓÑ ¦Î¦Ã¦Á̦ÚÕ×ÁÔÉ ÏÂÏÌÏÎËÕ Evolutuion."
-
-#: mail/folder-browser-factory.c:33
-msgid "Get mail"
-msgstr ""
-
-#: mail/folder-browser-factory.c:33
-msgid "Check for new mail"
-msgstr ""
-
-#: mail/folder-browser-factory.c:34
-msgid "Compose"
-msgstr ""
-
-#: mail/folder-browser-factory.c:34
-#, fuzzy
-msgid "Compose a new message"
-msgstr "ð¦ÄÇÏÔÕ×ÁÔÉ ÎÏ×Å ÐÏÛÔÏ×Å ÐÏצÄÏÍÌÅÎÎÑ"
-
-#. GNOMEUIINFO_ITEM_STOCK (N_("Save"), N_("Save this message"),
-#. save_msg, GNOME_STOCK_PIXMAP_SAVE),
-#: mail/folder-browser-factory.c:38 mail/mail-view.c:135
-msgid "Reply"
-msgstr "÷¦ÄÐÏצÓÔÉ"
-
-#: mail/folder-browser-factory.c:38 mail/mail-view.c:135
-msgid "Reply to the sender of this message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:39 mail/mail-view.c:138
-msgid "Reply to All"
-msgstr "÷¦ÄÐÏצÓÔÉ ×Ó¦Í"
-
-#: mail/folder-browser-factory.c:39 mail/mail-view.c:138
-msgid "Reply to all recipients of this message"
-msgstr ""
-
-#: mail/folder-browser-factory.c:41 mail/mail-view.c:141
-msgid "Forward"
-msgstr "ðÅÒÅÓÌÁÔÉ"
-
-#: mail/folder-browser-factory.c:41 mail/mail-view.c:141
-msgid "Forward this message"
-msgstr "ðÅÒÅÓÌÁÔÉ ÃÅ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: mail/folder-browser-factory.c:45
-#, fuzzy
-msgid "Move"
-msgstr "íϦÌØÎÉÊ"
-
-#: mail/folder-browser-factory.c:45
-#, fuzzy
-msgid "Move message to a new folder"
-msgstr "úÂÅÒÅÇÔÉ ÐÏצÄÏÍÌÅÎÎÑ Õ ×ËÁÚÁÎ¦Ê ÔÅæ"
-
-#: mail/folder-browser-factory.c:47 mail/mail-view.c:145
-msgid "Print the selected message"
-msgstr "îÁÄÒÕËÕ×ÁÔÉ ×ÉÂÒÁÎÅ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: mail/folder-browser-factory.c:49 mail/mail-view.c:147
-msgid "Delete this message"
-msgstr "óÔÅÒÔÉ ÃÅ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: mail/folder-browser-factory.c:73
-msgid "_Threaded Message List"
-msgstr ""
-
-#: mail/folder-browser-factory.c:83
-#, fuzzy
-msgid "_Print message"
-msgstr "÷¦Ä¦ÓÌÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: mail/folder-browser-factory.c:91
-#, fuzzy
-msgid "E_dit Message"
-msgstr "÷¦Ä¦ÓÌÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: mail/folder-browser-factory.c:98
-#, fuzzy
-msgid "_View Message"
-msgstr "÷¦Ä¦ÓÌÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: mail/folder-browser-factory.c:107
-msgid "_Mark all messages seen"
-msgstr ""
-
-#: mail/folder-browser-factory.c:111
-msgid "_Expunge"
-msgstr ""
-
-#: mail/folder-browser-factory.c:117
-#, fuzzy
-msgid "Mail _Filters ..."
-msgstr "æÁÊÌ..."
-
-#: mail/folder-browser-factory.c:123
-msgid "_vFolder Editor ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:129
-msgid "_Mail Configuration ..."
-msgstr ""
-
-#: mail/folder-browser-factory.c:135
-msgid "Forget _Passwords"
-msgstr ""
-
-#: mail/folder-browser-factory.c:142
-msgid "_Configure Folder"
-msgstr ""
-
-#. gtk_signal_connect(fb->search_entry, "changed", search_activate, fb);
-#: mail/folder-browser.c:349
-msgid "Search"
-msgstr "ðÏÛÕË"
-
-#: mail/folder-browser.c:352
-msgid "Save"
-msgstr "úÂÅÒÅÇÔÉ"
-
-#: mail/mail-callbacks.c:134
-msgid ""
-"This message has no subject.\n"
-"Really send?"
-msgstr ""
-
-#: mail/mail-callbacks.c:166
-msgid ""
-"You need to configure an identity\n"
-"before you can send mail."
-msgstr ""
-
-#: mail/mail-callbacks.c:182
-msgid ""
-"You need to configure a mail transport\n"
-"before you can send mail."
-msgstr ""
-
-#: mail/mail-callbacks.c:388
-#, fuzzy
-msgid "Move message(s) to"
-msgstr "÷¦Ä¦ÓÌÁΦ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: mail/mail-callbacks.c:430
-msgid ""
-"You may only edit messages saved\n"
-"in the Drafts folder."
-msgstr ""
-
-#: mail/mail-callbacks.c:518
-#, fuzzy, c-format
-msgid ""
-"Error loading filter information:\n"
-"%s"
-msgstr "ðÏÍÉÌËÁ ÚÁ×ÁÎÔÁÖÅÎÎÑ ÆÁÊÌÕ: %s"
-
-#: mail/mail-config-gui.c:430
-msgid ""
-"Enter your name and email address to be used in outgoing mail. You may also, "
-"optionally, enter the name of your organization, and the name of a file to "
-"read your signature from."
-msgstr ""
-
-#: mail/mail-config-gui.c:443
-msgid "Full name:"
-msgstr "ðÏ×ÎÁ ÎÁÚ×Á:"
-
-#: mail/mail-config-gui.c:467
-msgid "Email address:"
-msgstr "åÌÅËÔÒÏÎÎÁ ÁÄÒÅÓÁ:"
-
-#: mail/mail-config-gui.c:482
-msgid "Organization:"
-msgstr "ïÒ¦¤ÎÔÁæÑ:"
-
-#: mail/mail-config-gui.c:493
-msgid "Signature file:"
-msgstr "æÁÊÌ Ð¦ÄÐÉÓÕ:"
-
-#: mail/mail-config-gui.c:498 mail/mail-config.glade.h:10
-msgid "Signature File"
-msgstr "æÁÊÌ Ð¦ÄÐÉÓÕ"
-
-#: mail/mail-config-gui.c:897
-msgid "Server:"
-msgstr "óÅÒ×ÅÒ:"
-
-#: mail/mail-config-gui.c:903
-msgid "Username:"
-msgstr "îÁÚ×Á ËÏÒÉÓÔÕ×ÁÞÁ:"
-
-#: mail/mail-config-gui.c:909
-msgid "Path:"
-msgstr "ûÌÑÈ:"
-
-#: mail/mail-config-gui.c:917
-msgid "Authentication:"
-msgstr "áÕÔÅÎƦËÁæÑ:"
-
-#: mail/mail-config-gui.c:929
-msgid "Detect supported types..."
-msgstr ""
-
-#: mail/mail-config-gui.c:952
-msgid "Don't delete messages from server"
-msgstr ""
-
-#: mail/mail-config-gui.c:964
-msgid "Test Settings"
-msgstr ""
-
-#: mail/mail-config-gui.c:1094 mail/mail-config-gui.c:1142
-msgid ""
-"Select the kind of mail server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config-gui.c:1118
-msgid ""
-"Select the kind of news server you have, and enter the relevant information "
-"about it.\n"
-"\n"
-"If the server requires authentication, you can click the \"Detect supported "
-"types...\" button after entering the other information."
-msgstr ""
-
-#: mail/mail-config-gui.c:1192
-msgid "Edit Identity"
-msgstr ""
-
-#: mail/mail-config-gui.c:1194
-msgid "Add Identity"
-msgstr ""
-
-#: mail/mail-config-gui.c:1288
-msgid "Edit Source"
-msgstr ""
-
-#: mail/mail-config-gui.c:1290
-msgid "Add Source"
-msgstr ""
-
-#: mail/mail-config-gui.c:1387
-msgid "Edit News Server"
-msgstr ""
-
-#: mail/mail-config-gui.c:1389
-msgid "Add News Server"
-msgstr ""
-
-#: mail/mail-config-gui.c:2217
-msgid "The connection was successful!"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config.glade.h:7 mail/mail-config.glade.h:14
-msgid "Identities"
-msgstr ""
-
-#: mail/mail-config.glade.h:9
-msgid "Organization"
-msgstr "ïÒ¦¤ÎÔÁæÑ"
-
-#: mail/mail-config.glade.h:12 mail/mail-config.glade.h:17
-#: mail/mail-config.glade.h:23
-msgid "Edit"
-msgstr "òÅÄÁÇÕ×ÁÎÎÑ"
-
-#: mail/mail-config.glade.h:15
-msgid "Sources"
-msgstr ""
-
-#: mail/mail-config.glade.h:19
-msgid "Mail Sources"
-msgstr ""
-
-#: mail/mail-config-druid.glade.h:15 mail/mail-config.glade.h:20
-msgid "Mail Transport"
-msgstr ""
-
-#: mail/mail-config.glade.h:21
-#, fuzzy
-msgid "News Servers"
-msgstr "óÅÒ×ÅÒ LDAP:"
-
-#: mail/mail-config.glade.h:25
-msgid "News Sources"
-msgstr ""
-
-#: mail/mail-config.glade.h:26
-msgid "Send messages in HTML format"
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: mail/mail-config-druid.glade.h:7 mail/mail-config-druid.glade.h:8
-#: mail/mail-config-druid.glade.h:16
-msgid "Mail Configuration"
-msgstr ""
-
-#: mail/mail-config-druid.glade.h:9
-msgid ""
-"Welcome to the Evolution Mail configuration wizard!\n"
-"By filling in some information about your email\n"
-"settings, you can start sending and receiving email\n"
-"right away. Click Next to continue."
-msgstr ""
-
-#: mail/mail-config-druid.glade.h:13
-msgid "Identity"
-msgstr ""
-
-#: mail/mail-config-druid.glade.h:14
-msgid "Mail Source"
-msgstr ""
-
-#: mail/mail-config-druid.glade.h:17
-msgid ""
-"Your email configuration is now complete.\n"
-"Click \"Finish\" to save your new settings"
-msgstr ""
-
-#: mail/mail-crypto.c:338 mail/mail-crypto.c:418
-msgid "Please enter your PGP/GPG passphrase."
-msgstr ""
-
-#: mail/mail-crypto.c:342 mail/mail-crypto.c:422
-msgid "No password provided."
-msgstr ""
-
-#: mail/mail-crypto.c:348 mail/mail-crypto.c:428
-#, c-format
-msgid "Couldn't create pipe to GPG/PGP: %s"
-msgstr ""
-
-#: mail/mail-local.c:256
-#, c-format
-msgid "Changing folder \"%s\" to \"%s\" format"
-msgstr ""
-
-#: mail/mail-local.c:260
-#, c-format
-msgid "Change folder \"%s\" to \"%s\" format"
-msgstr ""
-
-#: mail/mail-threads.c:669
-msgid "Incomplete message written on pipe!"
-msgstr ""
-
-#: mail/mail-threads.c:673
-msgid "Error reading commands from dispatching thread."
-msgstr ""
-
-#: mail/mail-threads.c:738
-msgid "Corrupted message from dispatching thread?"
-msgstr ""
-
-#: mail/mail-threads.c:846
-msgid "Could not create dialog box."
-msgstr ""
-
-#: mail/mail-threads.c:857
-msgid "User cancelled query."
-msgstr ""
-
-#: mail/message-list.c:489
-msgid "Online Status"
-msgstr "óÔÁÎ ÎÁ ̦Φ§"
-
-#: mail/message-list.c:525
-msgid "From"
-msgstr "÷¦Ä"
-
-#: mail/message-list.c:532
-msgid "Subject"
-msgstr "ôÅÍÁ"
-
-#: mail/message-list.c:539
-msgid "Date"
-msgstr "äÁÔÁ"
-
-#: mail/message-list.c:546
-msgid "Received"
-msgstr "ïÔÒÉÍÁÎÏ"
-
-#: mail/message-list.c:553
-msgid "To"
-msgstr "äÏ"
-
-#: mail/message-list.c:560
-msgid "Size"
-msgstr "òÏÚͦÒ"
-
-#: notes/component-factory.c:27
-#, fuzzy
-msgid "Create a new note"
-msgstr "óÔ×ÏÒÉÔÉ ÎÏ×ÉÊ ËÁÌÅÎÄÁÒ"
-
-#: notes/component-factory.c:148
-#, fuzzy
-msgid "Cannot initialize Evolution's notes component."
-msgstr "îÅ ×ÄÁÌÏÓÑ ¦Î¦Ã¦Á̦ÚÕ×ÁÔÉ ÏÂÏÌÏÎËÕ Evolutuion."
-
-#: notes/main.c:30
-#, fuzzy
-msgid "Notes Component: Could not initialize bonobo"
-msgstr "ðÏÛÔÏ×ÉÊ ËÏÍÐÏÎÅÎÔ: ÎÅ ×ÄÁÌÏÓØ ¦Î¦Ã¦Á̦ÚÕ×ÁÔÉ Bonobo"
-
-#: shell/e-setup.c:47
-msgid "Evolution installation"
-msgstr ""
-
-#: shell/e-setup.c:51
-msgid "This seems to be the first time you run Evolution."
-msgstr ""
-
-#: shell/e-setup.c:52
-msgid "Please click \"OK\" to install the Evolution user files under"
-msgstr ""
-
-#: shell/e-setup.c:69
-#, c-format
-msgid ""
-"Cannot create the directory\n"
-"%s\n"
-"Error: %s"
-msgstr ""
-
-#: shell/e-setup.c:84
-#, c-format
-msgid ""
-"Cannot copy files into\n"
-"`%s'."
-msgstr ""
-
-#: shell/e-setup.c:88
-msgid "Evolution files successfully installed."
-msgstr "æÁÊÌÉ Evolution ÕÓЦÛÎÏ ×ÓÔÁÎÏ×ÌÅÎÏ."
-
-#: shell/e-setup.c:109
-#, c-format
-msgid ""
-"The file `%s' is not a directory.\n"
-"Please move it in order to allow installation\n"
-"of the Evolution user files."
-msgstr ""
-
-#: shell/e-setup.c:121
-#, c-format
-msgid ""
-"The directory `%s' exists but is not the\n"
-"Evolution directory. Please move it in order\n"
-"to allow installation of the Evolution user files."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:81
-#, c-format
-msgid ""
-"Cannot create the specified folder:\n"
-"%s"
-msgstr ""
-"îÅÍÏÖÌÉ×Ï ÓÔ×ÏÒÉÔÉ ×ËÁÚÁÎÕ ÔÅËÕ:\n"
-"%s"
-
-#: shell/e-shell-folder-creation-dialog.c:133
-msgid "The specified folder name is not valid."
-msgstr ""
-
-#: shell/e-shell-folder-creation-dialog.c:223
-msgid "Evolution - Create new folder"
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:96
-msgid ""
-"The type of the selected folder is not valid for\n"
-"the requested operation."
-msgstr ""
-
-#: shell/e-shell-folder-selection-dialog.c:272
-#, fuzzy
-msgid "New..."
-msgstr "îÏ×ÉÊ"
-
-#: shell/e-shell-folder-title-bar.c:459 shell/e-shell-folder-title-bar.c:460
-msgid "(Untitled)"
-msgstr ""
-
-#. you might have to call gnome_dialog_run() on the
-#. * dialog returned here, I don't remember...
-#.
-#: shell/e-shell-view-menu.c:113
-msgid "Bug buddy was not found in your $PATH."
-msgstr ""
-
-#. same as above
-#: shell/e-shell-view-menu.c:119
-msgid "Bug buddy could not be run."
-msgstr "îÅ ×ÄÁÌÏÓÑ ÚÁÐÕÓÔÉÔÉ Bug buddy"
-
-#: shell/e-shell-view-menu.c:167
-msgid "Copyright 1999, 2000 Helix Code, Inc."
-msgstr "Copyright 1999, 2000 Helix Code, Inc."
-
-#: shell/e-shell-view-menu.c:169
-msgid ""
-"Evolution is a suite of groupware applications\n"
-"for mail, calendaring, and contact management\n"
-"within the GNOME desktop environment."
-msgstr ""
-
-#: shell/e-shell-view-menu.c:319
-msgid "Go to folder..."
-msgstr "ðÅÒÅÊÔÉ ÎÁ ÔÅËÕ..."
-
-#: shell/e-shell-view-menu.c:377
-msgid "_New"
-msgstr "îÏ×ÉÊ"
-
-#: shell/e-shell-view-menu.c:389
-msgid "_Folder"
-msgstr "æÏÌÄÅÒ"
-
-#: shell/e-shell-view-menu.c:395
-#, fuzzy
-msgid "Evolution bar _shortcut"
-msgstr "ì¦Î¦ÊËÁ ÑÒÌÉË¦× Evolution"
-
-#: shell/e-shell-view-menu.c:404
-#, fuzzy
-msgid "_Mail message (FIXME)"
-msgstr "÷¦Ä¦ÓÌÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: shell/e-shell-view-menu.c:410
-#, fuzzy
-msgid "_Appointment (FIXME)"
-msgstr "úÕÓÔÒ¦Þ"
-
-#: shell/e-shell-view-menu.c:416
-#, fuzzy
-msgid "_Contact (FIXME)"
-msgstr "ëÏÎÔÁËÔ"
-
-#: shell/e-shell-view-menu.c:422
-msgid "_Task (FIXME)"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:444
-#, fuzzy
-msgid "_Go to folder..."
-msgstr "ðÅÒÅÊÔÉ ÎÁ ÔÅËÕ..."
-
-#: shell/e-shell-view-menu.c:445
-msgid "Display a different folder"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:452
-#, fuzzy
-msgid "_Create new folder..."
-msgstr "úÂÅÒÅÇÔÉ Õ ÔÅæ..."
-
-#: shell/e-shell-view-menu.c:453 shell/e-shell-view-menu.c:465
-#, fuzzy
-msgid "Create a new folder"
-msgstr "óÔ×ÏÒÉÔÉ ÎÏ×ÉÊ ËÁÌÅÎÄÁÒ"
-
-#: shell/e-shell-view-menu.c:464
-msgid "E_xit..."
-msgstr "÷ÉÊÔÉ..."
-
-#: shell/e-shell-view-menu.c:495
-msgid "Show _shortcut bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:496
-msgid "Show the shortcut bar"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:501
-msgid "Show _folder bar"
-msgstr "ðÏËÁÚÕ×ÁÔÉ ÐÁÎÅÌØ ÔÅË"
-
-#: shell/e-shell-view-menu.c:502
-msgid "Show the folder bar"
-msgstr "ðÏËÁÚÕ×ÁÔÉ ÐÁÎÅÌØ ÔÅË"
-
-#: shell/e-shell-view-menu.c:524
-msgid "_Actions"
-msgstr "䦧"
-
-#: shell/e-shell-view-menu.c:535
-msgid "_Help"
-msgstr "äÏצÄËÁ"
-
-#: shell/e-shell-view-menu.c:541
-msgid "Help _index"
-msgstr "ðÏËÁÖÞÉË ÄÏצÄËÉ"
-
-#: shell/e-shell-view-menu.c:548
-#, fuzzy
-msgid "Getting _started"
-msgstr "þÁÓ ÐÏÞÁÔËÕ ÚÕÓÔÒ¦Þ¦:"
-
-#: shell/e-shell-view-menu.c:555
-msgid "Using the _mailer"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:562
-#, fuzzy
-msgid "Using the _calendar"
-msgstr "îÁÄÒÕËÕ×ÁÔÉ ÃÅÊ ËÁÌÅÎÄÁÒ"
-
-#: shell/e-shell-view-menu.c:569
-msgid "Using the c_ontact manager"
-msgstr ""
-
-#: shell/e-shell-view-menu.c:579
-msgid "_Submit bug report"
-msgstr "ð¦ÄÇÏÔÕ×ÁÔÉ Ú×¦Ô ÐÒÏ ÐÏÍÉÌËÕ"
-
-#: shell/e-shell-view-menu.c:580
-#, fuzzy
-msgid "Submit bug report using Bug Buddy"
-msgstr "ð¦ÄÇÏÔÕ×ÁÔÉ Ú×¦Ô ÐÒÏ ÐÏÍÉÌËÕ × bug-buddy"
-
-#: shell/e-shell-view-menu.c:589
-msgid "_About Evolution..."
-msgstr "ðÒÏ Evolution..."
-
-#: shell/e-shell-view-menu.c:590
-msgid "Show information about Evolution"
-msgstr "ðÏËÁÚÁÔÉ ¦ÎÆÏÒÍÁæÀ ÐÒÏ Evolution"
-
-#: shell/e-shell-view.c:122
-msgid "(No folder displayed)"
-msgstr ""
-
-#: shell/e-shell-view.c:350
-msgid "Folders"
-msgstr "ôÅËÉ"
-
-#: shell/e-shell-view.c:869
-#, c-format
-msgid "Evolution - %s"
-msgstr "Evolution - %s"
-
-#: shell/e-shell.c:293
-#, c-format
-msgid "Cannot set up local storage -- %s"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:235
-msgid "_Small icons"
-msgstr "íÉ̦ ЦËÔÏÇÒÁÍÉ"
-
-#: shell/e-shortcuts-view.c:236
-msgid "Show the shortcuts as small icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:238
-msgid "_Large icons"
-msgstr "÷ÅÌÉ˦ ЦËÔÏÇÒÁÍÉ"
-
-#: shell/e-shortcuts-view.c:239
-msgid "Show the shortcuts as large icons"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:330
-msgid "Activate this shortcut"
-msgstr ""
-
-#: shell/e-shortcuts-view.c:333
-msgid "Remove this shortcut from the shortcut bar"
-msgstr ""
-
-#: shell/e-shortcuts.c:358
-msgid "Error saving shortcuts."
-msgstr ""
-
-#: shell/e-storage.c:217
-msgid "(No name)"
-msgstr ""
-
-#: shell/e-storage.c:412
-msgid "No error"
-msgstr ""
-
-#: shell/e-storage.c:414
-msgid "Generic error"
-msgstr ""
-
-#: shell/e-storage.c:416
-msgid "A folder with the same name already exists"
-msgstr ""
-
-#: shell/e-storage.c:418
-msgid "The specified folder type is not valid"
-msgstr ""
-
-#: shell/e-storage.c:420
-msgid "I/O error"
-msgstr "ðÏÍÉÌËÁ ××ÏÄÕ/×É×ÏÄÕ"
-
-#: shell/e-storage.c:422
-msgid "Not enough space to create the folder"
-msgstr ""
-
-#: shell/e-storage.c:424
-msgid "The specified folder was not found"
-msgstr ""
-
-#: shell/e-storage.c:426
-msgid "Function not implemented in this storage"
-msgstr ""
-
-#: shell/e-storage.c:428
-msgid "Permission denied"
-msgstr ""
-
-#: shell/e-storage.c:430
-msgid "Operation not supported"
-msgstr ""
-
-#: shell/e-storage.c:432
-msgid "The specified type is not supported in this storage"
-msgstr ""
-
-#: shell/e-storage.c:434
-msgid "Unknown error"
-msgstr "îÅצÄÏÍÁ ÐÏÍÉÌËÁ"
-
-#: shell/e-storage-set-view.c:242
-#, fuzzy
-msgid "View the selected folder"
-msgstr "îÁÄÒÕËÕ×ÁÔÉ ×ÉÂÒÁÎÅ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#: shell/main.c:66
-msgid ""
-"Hi. Thanks for taking the time to download this preview release\n"
-"of the Evolution groupware suite.\n"
-"\n"
-"Over the last month and a half, our focus has been on making\n"
-"Evolution usable. Many of the Evolution developers are now using\n"
-"Evolution to read their mail full time. You could too. (Just\n"
-"be sure to keep a backup.)\n"
-"\n"
-"But while we have fixed many bugs affecting its stability and\n"
-"security, you still get the disclaimer: Evolution will: crash,\n"
-"lose your mail when you don't want it to, refuse to delete your\n"
-"mail when you do want it to, leave stray processes running,\n"
-"consume 100% CPU, race, lock, send HTML mail to random mailing\n"
-"lists, and embarass you in front of your friends and co-workers.\n"
-"Use only as directed.\n"
-"\n"
-"We hope that you enjoy the results of our hard work, and we eagerly\n"
-"await your contributions!\n"
-msgstr ""
-
-#: shell/main.c:93
-msgid ""
-"Thanks\n"
-"The Evolution Team\n"
-msgstr ""
-
-#: shell/main.c:121
-msgid "Cannot initialize the Evolution shell."
-msgstr "îÅ ×ÄÁÌÏÓÑ ¦Î¦Ã¦Á̦ÚÕ×ÁÔÉ ÏÂÏÌÏÎËÕ Evolutuion."
-
-#: shell/main.c:156
-msgid "Cannot initialize the Bonobo component system."
-msgstr "îÅ ×ÄÁÌÏÓÑ ¦Î¦Ã¦Á̦ÚÕ×ÁÔÉ ËÏÍÐÏÎÅÎÔÎÕ ÓÉÓÔÅÍÕ Bonobo."
-
-#: tests/ui-tests/message-browser.c:360
-msgid "The component now claims that it doesn't support PersistStream!"
-msgstr ""
-
-#: tests/ui-tests/message-browser.c:378
-msgid ""
-"An exception occured while trying to load data into the component with "
-"PersistStream"
-msgstr ""
-
-#: tests/ui-tests/message-browser.c:471
-#, c-format
-msgid "The %s component doesn't support PersistStream!\n"
-msgstr ""
-
-#: tests/ui-tests/message-browser.c:710
-#, fuzzy
-msgid "Open Mime Message"
-msgstr "÷¦Ä¦ÓÌÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-config.glade.h:7
-msgid "Fields"
-msgstr "ðÏÌÑ"
-
-#: widgets/e-table/e-table-config.glade.h:8
-msgid "Grouping"
-msgstr "çÒÕÐÕ×ÁÎÎÑ"
-
-#: widgets/e-table/e-table-config.glade.h:9
-msgid "Sort"
-msgstr "óÏÒÔÕ×ÁÔÉ"
-
-#: widgets/e-table/e-table-config.glade.h:10
-msgid "Filter"
-msgstr "æ¦ÌØÔÒ"
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-field-chooser.glade.h:7
-#: widgets/e-table/e-table-header-item.c:1164
-msgid "Field Chooser"
-msgstr ""
-
-#: widgets/e-table/e-table-field-chooser.glade.h:8
-msgid ""
-"To add a column to your table, drag it into\n"
-"the location in which you want it to appear."
-msgstr ""
-
-#.
-#. * Translatable strings file generated by Glade.
-#. * Add this file to your project's POTFILES.in.
-#. * DO NOT compile it as part of your application.
-#.
-#: widgets/e-table/e-table-group.glade.h:7
-msgid "window1"
-msgstr "צËÎÏ1"
-
-#: widgets/e-table/e-table-group.glade.h:8
-msgid "Available fields"
-msgstr "äÏÓÔÕÐΦ ÐÏÌÑ"
-
-#: widgets/e-table/e-table-group.glade.h:9
-msgid "label1"
-msgstr "ÐÏÚÎÁÞËÁ1"
-
-#: widgets/e-table/e-table-group.glade.h:10
-msgid "Show in this order"
-msgstr "ðÏËÁÚÕ×ÁÔÉ × ÃØÏÍÕ ÐÏÒÑÄËÕ"
-
-#: widgets/e-table/e-table-group.glade.h:11
-msgid "label2"
-msgstr "ÐÏÚÎÁÞËÁ2"
-
-#: widgets/e-table/e-table-group.glade.h:12
-msgid "Add >>"
-msgstr "äÏÄÁÔÉ >>"
-
-#: widgets/e-table/e-table-group.glade.h:13
-msgid "<< Remove"
-msgstr "<< ÷ÉÄÁÌÉÔÉ"
-
-#: widgets/e-table/e-table-header-item.c:1156
-msgid "Sort Ascending"
-msgstr ""
-
-#: widgets/e-table/e-table-header-item.c:1157
-msgid "Sort Descending"
-msgstr ""
-
-#: widgets/e-table/e-table-header-item.c:1158
-#, fuzzy
-msgid "Unsort"
-msgstr "÷¦ÄͦÎÉÔÉ"
-
-#: widgets/e-table/e-table-header-item.c:1160
-msgid "Group By This Field"
-msgstr ""
-
-#: widgets/e-table/e-table-header-item.c:1161
-#, fuzzy
-msgid "Group By Box"
-msgstr "çÒÕÐÁ %i"
-
-#: widgets/e-table/e-table-header-item.c:1163
-msgid "Remove This Column"
-msgstr ""
-
-#: widgets/e-table/e-table-header-item.c:1166
-msgid "Alignment"
-msgstr ""
-
-#: widgets/e-table/e-table-header-item.c:1167
-msgid "Best Fit"
-msgstr ""
-
-#: widgets/e-table/e-table-header-item.c:1168
-msgid "Format Columns..."
-msgstr ""
-
-#: widgets/e-table/e-table-header-item.c:1170
-msgid "Customize Current View..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:386
-msgid "Tentative"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:387
-msgid "Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:388
-msgid "Out of Office"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:389
-msgid "No Information"
-msgstr "îÅÍÁ¤ ¦ÎÆÏÒÍÁæ§"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:405
-msgid "_Invite Others..."
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:425
-msgid "_Options"
-msgstr "ðÁÒÁÍÅÔÒÉ"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:442
-msgid "Show _Only Working Hours"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:455
-msgid "Show _Zoomed Out"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:473
-msgid "_Update Free/Busy"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:491
-msgid "_<<"
-msgstr "_<<"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:508
-msgid "_Autopick"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:522
-msgid ">_>"
-msgstr "_>>"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:539
-msgid "_All People and Resources"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:552
-msgid "All _People and One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:565
-msgid "_Required People"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:578
-msgid "Required People and _One Resource"
-msgstr ""
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:601
-msgid "Meeting _start time:"
-msgstr "þÁÓ ÐÏÞÁÔËÕ ÚÕÓÔÒ¦Þ¦:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:625
-msgid "Meeting _end time:"
-msgstr "þÁÓ ÚÁ×ÅÒÛÅÎÎÑ ÚÕÓÔÒ¦Þ¦:"
-
-#: widgets/meeting-time-sel/e-meeting-time-sel.c:738
-msgid "All Attendees"
-msgstr ""
-
-#. Translators: These are the first characters of each day of the
-#. week, 'M' for 'Monday', 'T' for Tuesday etc.
-#: widgets/misc/e-calendar-item.c:281
-msgid "MTWTFSS"
-msgstr "ð÷óþðóî"
-
-#: widgets/misc/e-clipped-label.c:106
-msgid "..."
-msgstr "..."
-
-#: widgets/shortcut-bar/e-group-bar.c:632
-#, c-format
-msgid "Group %i"
-msgstr "çÒÕÐÁ %i"
diff --git a/po/update.pl b/po/update.pl
deleted file mode 100755
index 9cc746fa46..0000000000
--- a/po/update.pl
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/usr/bin/perl -w
-
-# GNOME po update utility.
-# (C) 2000 The Free Software Foundation
-#
-# Author(s): Kenneth Christiansen
-
-
-$VERSION = "1.2.5 beta 2";
-$LANG = $ARGV[0];
-$PACKAGE = "evolution";
-
-if (! $LANG){
- print "update.pl: missing file arguments\n";
- print "Try `update.pl --help' for more information.\n";
- exit;
-}
-
-if ($LANG=~/^-(.)*/){
-
- if ("$LANG" eq "--version" || "$LANG" eq "-V"){
- print "GNOME PO Updater $VERSION\n";
- print "Written by Kenneth Christiansen <kenneth\@gnome.org>, 2000.\n\n";
- print "Copyright (C) 2000 Free Software Foundation, Inc.\n";
- print "This is free software; see the source for copying conditions. There is NO\n";
- print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
- exit;
- }
-
-
- elsif ($LANG eq "--help" || "$LANG" eq "-H"){
- print "Usage: ./update.pl [OPTIONS] ...LANGCODE\n";
- print "Updates pot files and merge them with the translations.\n\n";
- print " -V, --version shows the version\n";
- print " -H, --help shows this help page\n";
- print " -P, --pot only generates the potfile\n";
- print " -M, --maintain search for missing files in POTFILES.in\n";
- print "\nExamples of use:\n";
- print "update.sh --pot just creates a new pot file from the source\n";
- print "update.sh da created new pot file and updated the da.po file\n\n";
- print "Report bugs to <kenneth\@gnome.org>.\n";
- exit;
- }
-
- elsif($LANG eq "--pot" || "$LANG" eq "-P"){
-
- print "Building the $PACKAGE.pot ...";
-
- $b="xgettext --default-domain\=$PACKAGE --directory\=\.\."
- ." --add-comments --keyword\=\_ --keyword\=N\_"
- ." --files-from\=\.\/POTFILES\.in ";
- $b1="test \! -f $PACKAGE\.po \|\| \( rm -f \.\/$PACKAGE\.pot "
- ."&& mv $PACKAGE\.po \.\/$PACKAGE\.pot \)";
-
- `$b`;
- `$b1`;
-
- print "...done\n";
-
- exit;
- }
-
- elsif ($LANG eq "--maintain" || "$LANG" eq "-M"){
-
- $a="find ../ -print | egrep '.*\\.(c|y|cc|c++|h|gob)' ";
-
- open(BUF2, "POTFILES.in") || die "update.pl: there's not POTFILES.in!!!\n";
- print "Searching for missing _(\" \") entries...\n";
- open(BUF1, "$a|");
-
-
- @buf2 = <BUF2>;
- @buf1 = <BUF1>;
-
- if (-s "POTFILES.ignore"){
- open FILE, "POTFILES.ignore";
- while (<FILE>) {
- if ($_=~/^[^#]/o){
- push @bup, $_;
- }
- }
- print "POTFILES.ignore found! Ignoring files...\n";
- @buf2 = (@bup, @buf2);
- }
-
- foreach my $file (@buf1){
- open FILE, "<$file";
- while (<FILE>) {
- if ($_=~/_\(\"/o){
- $file = unpack("x3 A*",$file) . "\n";
- push @buff1, $file;
- last;
- }
- }
- }
-
- @bufff1 = sort (@buff1);
-
- @bufff2 = sort (@buf2);
-
- my %in2;
- foreach (@bufff2) {
- $in2{$_} = 1;
- }
-
- foreach (@bufff1){
- if (!exists($in2{$_})){
- push @result, $_ }
- }
-
- if(@result){
- open OUT, ">POTFILES.in.missing";
- print OUT @result;
- print "\nHere are the results:\n\n", @result, "\n";
- print "File POTFILES.in.missing is being placed in directory...\n";
- print "Please add the files that should be ignored in POTFILES.ignore\n";
- }
- else{
- print "\nWell, it's all perfect! Congratulation!\n";
- }
- }
-
-
- else{
- print "update.pl: invalid option -- $LANG\n";
- print "Try `update.pl --help' for more information.\n";
- }
- exit;
- }
-
-elsif(-s "$LANG.po"){
-
- print "Building the $PACKAGE.pot ...";
-
- $c="xgettext --default-domain\=$PACKAGE --directory\=\.\."
- ." --add-comments --keyword\=\_ --keyword\=N\_"
- ." --files-from\=\.\/POTFILES\.in ";
- $c1="test \! -f $PACKAGE\.po \|\| \( rm -f \.\/$PACKAGE\.pot "
- ."&& mv $PACKAGE\.po \.\/$PACKAGE\.pot \)";
-
- `$c`;
- `$c1`;
-
- print "...done";
-
- print "\nNow merging $LANG.po with $PACKAGE.pot, and creating an updated $LANG.po ...\n";
-
-
- $d="mv $LANG.po $LANG.po.old && msgmerge $LANG.po.old $PACKAGE.pot -o $LANG.po";
-
- $f="msgfmt --statistics $LANG.po";
-
- `$d`;
- `$f`;
-
- unlink "messages";
- unlink "$LANG.po.old";
-
- exit;
-}
-
-else{
- print "update.pl: sorry $LANG.po does not exist!\n";
- print "Try `update.pl --help' for more information.\n";
- exit;
-}
diff --git a/po/update.sh b/po/update.sh
deleted file mode 100755
index 74dca77b27..0000000000
--- a/po/update.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-
-PACKAGE="evolution"
-
-if [ "x$1" = "x--help" ]; then
-
-echo Usage: ./update.sh langcode
-echo --help display this help and exit
-echo
-echo Examples of use:
-echo ./update.sh ----- just creates a new pot file from the source
-echo ./update.sh da -- created new pot file and updated the da.po file
-
-elif [ "x$1" = "x" ]; then
-
-echo "Building the $PACKAGE.pot ..."
-
-xgettext --default-domain=$PACKAGE --directory=.. \
- --add-comments --keyword=_ --keyword=N_ \
- --files-from=./POTFILES.in \
-&& test ! -f $PACKAGE.po \
- || ( rm -f ./$PACKAGE.pot \
-&& mv $PACKAGE.po ./$PACKAGE.pot );
-
-else
-
-xgettext --default-domain=$PACKAGE --directory=.. \
- --add-comments --keyword=_ --keyword=N_ \
- --files-from=./POTFILES.in \
-&& test ! -f $PACKAGE.po \
- || ( rm -f ./PACKAGE.pot \
-&& mv $PACKAGE.po ./$PACKAGE.pot );
-
-echo "Building the $PACKAGE.pot ..."
-echo "Now merging $1.po with $PACKAGE.pot, and creating an updated $1.po ..."
-
-mv $1.po $1.po.old && msgmerge $1.po.old $PACKAGE.pot -o $1.po \
-&& rm $1.po.old;
-
-msgfmt --statistics $1.po
-
-fi;
diff --git a/shell/.cvsignore b/shell/.cvsignore
deleted file mode 100644
index 417b3c6bcf..0000000000
--- a/shell/.cvsignore
+++ /dev/null
@@ -1,11 +0,0 @@
-.deps
-.libs
-.pure
-evolution
-evolution.pure
-Makefile.in
-Makefile
-Evolution-stubs.c
-Evolution-skels.c
-Evolution-common.c
-Evolution.h
diff --git a/shell/ChangeLog b/shell/ChangeLog
deleted file mode 100644
index a05041c9c9..0000000000
--- a/shell/ChangeLog
+++ /dev/null
@@ -1,2040 +0,0 @@
-2000-08-20 arik devens <arik@helixcode.com>
-
- * Makefile.am (evolution_LDADD): Added UNICODE_LIBS to link in the
- new e-text stuff.
-
-2000-08-19 Christopher James Lahey <clahey@helixcode.com>
-
- * e-shell-folder-title-bar.c: Fixed a warning.
-
-2000-08-19 Christopher James Lahey <clahey@helixcode.com>
-
- * e-shell-view.c: Fixed a warning.
-
-2000-08-18 Larry Ewing <lewing@helixcode.com>
-
- * e-shell-folder-title-bar.c (style_set_cb): update the pixmap
- define E_USE_STYLES to disable the current darkening behavior
- (destroy): free the icon.
- (e_shell_folder_title_bar_construct): style_set_cb does everything
- important now.
- (e_shell_folder_title_bar_set_icon): actually store the pixbuf
- when we set it so that we still have it if the style changes and
- take care of refcounting them properly.
-
-2000-08-17 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view-menu.c (menu_create_file): Make capitalization of
- menu items consistent.
- (menu_create_view): Likewise.
- (menu_create_help): Likewise.
- (e_shell_view_menu_setup): Create a component menu placeholder so
- that components can add their own component-specific menus there.
- (menu_create_actions): Removed.
- (e_shell_view_menu_setup): Don't call it.
- (menu_create_tools): Removed.
- (e_shell_view_menu_setup): Don't call it.
- (menu_create_settings): New.
- (e_shell_view_menu_setup): Call it.
-
-2000-08-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (delete_event): New. Make the parent shell quit.
-
-2000-08-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (shell_view_interface_set_message_cb): Removed
- debugging message.
- (shell_view_interface_unset_message_cb): Likewise.
-
-2000-08-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c: New members `progress_bar_timeout_id',
- `progress_bar_value' in `EShellViewPrivate'.
- (init): Init them.
- (destroy): If the timeout id is not zero, remove the associated
- timeout.
- (progress_bar_timeout_cb): New.
- (start_progress_bar): New.
- (stop_progress_bar): New.
- (shell_view_interface_set_message_cb): If busy, start the progress
- bar. Otherwise, stop it.
- (shell_view_interface_unset_message_cb): Stop the progress bar.
-
- * e-shell-view.c (setup_widgets): Enable the progress bar in the
- appbar.
-
- * e-shell-view.c (shell_view_interface_unset_message_cb): New
- function, callback for the `EvolutionShellView::unset_message'
- signal.
- (shell_view_interface_set_message_cb): New function, callback for
- the `EvolutionShellView::set_message' signal.
- (setup_evolution_shell_view_interface): Connect these signals to a
- newly created EvolutionShellView object, add ::add_interface this
- object to the control's frame.
-
- * evolution-shell-view.c: New.
- * evolution-shell-view.h: New.
-
- * Evolution-ShellView.idl: New interface.
-
-2000-08-10 Dan Winship <danw@helixcode.com>
-
- * Evolution-ShellComponent.idl: add "in string evolution_homedir"
- to ShellComponent::set_owner's arguments.
-
- * e-shell.c (e_shell_get_local_directory): Expose local_directory.
-
- * e-component-registry.c (register_component): Pass the shell's
- "local_directory" to the component as its evolution_homedir.
-
- * evolution-shell-component.c (impl_ShellComponent_set_owner):
- Update to include evolution_homedir.
- (class_init): Update signal prototype.
-
- * evolution-shell-component-client.c
- (evolution_shell_component_client_set_owner): Update to include
- evolution_homedir.
-
- * e-init.c: Remove. This wasn't being used.
-
-2000-08-10 Peter Williams <peterw@helixcode.com>
-
- * e-shell-view-menu.c (command_about_box): Add lil' ol'
- me to the about box.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-setup.c, e-shell.c: Fixed some warnings.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-shell-view.c: Fixed a warning.
-
-2000-08-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view-menu.c (menu_create_file_new): Create a placeholder
- for the print items.
-
-2000-08-08 Dan Winship <danw@helixcode.com>
-
- * e-setup.c (e_setup): Check for ~/evolution/shortcuts.xml in
- addition to ~/evolution, to make sure it's really the directory
- we're expecting it to be. Also, convert from old-style config file
- to new-style config directory.
-
-2000-08-04 Michael Meeks <michael@helixcode.com>
-
- * evolution-shell-component.c (impl_ShellComponent_populate_folder_context_menu):
- unref.
-
- * e-shell.c (e_shell_construct): Remove erroneous refs on
- folder_type_registry, storage_set.
-
- * e-shortcuts-view.c (destroy): unref the shortcuts, causing a
- massive ripple chain ref-count reaction.
-
-2000-08-03 JP Rosevear <jpr@helixcode.com>
-
- * e-shell.h: Remove gconf references
-
- * e-shell-view.h: Remove gconf references
-
- * main.c (idle_cb): Remove gconf references
-
- * Makefile.am: Remove gconf cflags and libs
-
- * e-shell-view.c (e_shell_view_load_settings): Change to use
- gnome-config
- (e_shell_view_save_settings): ditto
-
- * e-shell.c (e_shell_restore_from_settings): Change to
- use gnome_config
- (save_settings_for_views): ditto
-
-2000-08-03 Michael Meeks <michael@helixcode.com>
-
- * e-shell-view.c (destroy): unref the UI handler.
-
-2000-08-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-shell-folder-selection-dialog.c (set_default_folder): Make
- sure default_uri isn't NULL!!
-
-2000-08-03 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view-menu.c (command_goto_folder): Just use the current
- URI as the @default_uri parameter for
- `e_shell_folder_selection_dialog_new()'.
-
- * evolution-session.c (class_init): Call `corba_class_init()'.
-
- * e-shell-folder-selection-dialog.c
- (e_shell_folder_selection_dialog_new): @default_path renamed to
- @default_uri.
- (e_shell_folder_selection_dialog_construct): Likewise. If the
- @default_uri is an `evolution:' one, use it as a path; if it is
- different, assume it is a physical URI and consequently look for
- the folder that has that physical URI and make it the default.
- (set_default_folder): New helper function.
- (e_shell_folder_selection_dialog_construct): Use it.
-
- * e-storage-set.c (e_storage_set_get_path_for_physical_uri): New.
-
- * e-storage.c (e_storage_get_path_for_physical_uri): New.
-
-2000-07-27 Dan Winship <danw@helixcode.com>
-
- * main.c (idle_cb): work with either gconf 0.5 or newer
-
-2000-07-26 Peter Williams <peterw@helixcode.com>
-
- * e-storage.c (e_storage_new_folder): Fix tiny mem leak.
-
-2000-07-26 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (disconnect_popup_signals): Disconnect the "map"
- signal handler too.
-
-2000-07-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-folder-creation-dialog.c (add_folder_types): Work around
- GtkOptionMenu utter brokenness by destroying the associated
- Glade-built GtkMenu and creating a new one from scratch.
-
-2000-07-24 Dan Winship <danw@helixcode.com>
-
- * e-shell.c, main.c: Remove GOAD support.
-
- * evolution-shell-component-client.c: Remove GOAD support.
- (evolution_shell_component_client_new): Give the "maybe
- OAF_INFO_PATH" message if no oafinfo file was found, and give a
- "consult previous error messages" message if the component was
- found but not activated. Abort in either case.
-
-2000-07-23 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view-menu.c: Converted to use `bonobo_ui_handler_*()'
- stuff directly, instead of converting from GnomeUIInfo.
- (command_quit): Update arg types for BonoboUIHandler.
- (command_run_bugbuddy): Likewise.
- (command_about_box): Likewise.
- (command_new_task): Removed.
- (command_new_journal_entry): Removed.
- (menu_create_file_new): New.
- (menu_create_file): New.
- (menu_create_edit): New.
- (menu_create_view): New.
- (menu_create_tools): New.
- (menu_create_actions): New.
- (e_shell_view_menu_setup): Create menus using them instead of
- converting from GnomeUIInfo.
-
-2000-07-22 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c (e_shell_construct): Don't unref NULL shortcuts, you
- idiot.
-
-2000-07-22 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (e_shell_view_set_folder_bar_mode): Make the
- title bar non-clickable when the folder tree is visible.
-
- * e-shell-folder-title-bar.c: New members `button_arrow' and
- `clickable' in `EShellFolderTitleBarPrivate'. Renamed `label'
- into `button_label'. Added `label'.
- (init): Init them.
- (e_shell_folder_title_bar_construct): Pass a pointer to the title
- bar as the user data for the "realize" signal. Create `label'.
- (title_button_box_realize_cb): Use the `button_arrow' member
- instead of using `gtk_object_{set,get}_data()'.
- (setup_style): Set the style for `label' too.
- (e_shell_folder_title_bar_set_clickable): New.
- (e_shell_folder_title_bar_set_title): Set both `label' and
- `button_label'.
-
-2000-07-21 Peter Williams <peterw@helixcode.com>
-
- * evolution-shell-client.c (user_select_folder): Don't use
- g_main_loop to block the caller; this will break when
- threads are enabled and GDK_THREADS_ENTER deadlocks. Use
- gtk_main / gtk_main_exit to enter and exit the main loop,
- which handles the recursive case correctly.
- (impl_FolderSelectionListener_selected): Same.
- (impl_FolderSelectionListener_cancel): Same.
- (struct _FolderSelectionListenerServant): No more main_loop member.
-
-2000-07-21 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (storage_set_view_box_button_release_event_cb):
- Set the toggle state to FALSE on the title bar.
-
- * e-shell-folder-title-bar.c: Signal "title_clicked" replaced by
- "title_toggled".
- (setup_style): Change the style for the button too.
- (e_shell_folder_title_bar_construct): Use a GtkToggleButton, not a
- GtkButton.
- (e_shell_folder_title_bar_set_toggle_state): New.
-
-2000-07-21 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-folder-title-bar.c (create_icon_pixmap): New. Create a
- small arrow-shaped GtkPixmap.
- (title_button_box_realize_cb): New. Callback for the "realize"
- signal of the button's inner box.
-
- * e-shell-view.c (title_bar_clicked_cb): New function, callback
- for the "title_clicked" signal of the title bar.
- (setup_widgets): Connect it.
-
- * e-shell-view.c: New member `storage_set_title_bar' in
- `EShellViewPrivate'.
- (setup_storage_set_subwindow): Set it.
-
- * e-shell-folder-title-bar.c: Use a GtkLabel instead of an
- EClippedLabel for the title.
- (title_button_clicked_cb): New.
- (e_shell_folder_title_bar_construct): Put the label into a button.
- Connect the button's "clicked" signal to
- `title_button_clicked_cb'.
-
-2000-07-21 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-shell-component.c
- (impl_ShellComponent_populate_folder_context_menu): If the pointer
- to the function to populate the folder context menu is NULL, don't
- do anything.
-
-2000-07-21 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-storage-set-view.c (popup_folder_menu): New. Create a
- BonoboUIHandler-managed pop-up menu, let the component fill it in
- with `::populate_folder_context_menu', and display it. Then
- destroy it with the associated BonoboUIHandler.
- (handle_right_button_selection): New.
- (handle_left_button_selection): New. This pops up the right-click
- menu.
- (button_release_event): Use them.
- (init): Set the `GTK_BUTTON_SELECTS' flag for button #3's actions.
-
- * evolution-shell-component-client.c
- (evolution_shell_component_client_populate_folder_context_menu):
- New.
- (evolution_shell_component_client_async_create_folder): Added
- preconditions.
-
- * e-shell-view.c (e_shell_view_save_settings): Add missing cast.
-
- * evolution-shell-component.c: New member
- `populate_folder_context_menu' in
- `EvolutionShellComponentPrivate'.
- (impl_ShellComponent_populate_folder_context_menu): New,
- implementation for
- `Evolution::ShellComponent::populate_folder_context_menu'.
- (corba_class_init): Install it.
- (evolution_shell_component_new): New arg
- @populate_folder_context_menu.
- (evolution_shell_component_construct): Likewise.
-
- * Evolution-ShellComponent.idl: New method
- `::populate_folder_context_menu'.
-
-2000-07-20 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (e_shell_view_save_settings): Save the paned
- positions.
- (e_shell_view_load_settings): Restore them.
-
-2000-07-20 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c (save_settings_for_views): New. Code moved out of
- `e_shell_save_settings'.
- (e_shell_save_settings): Use it.
- (save_settings_for_component): New.
- (save_settings_for_components): New.
- (e_shell_save_settings): Use it, so that we make all the
- components save settings too.
-
- * e-component-registry.c
- (e_component_registry_get_id_list): New.
- (e_component_registry_get_component_by_id): New.
-
- * Makefile.am (libeshell_a_SOURCES): Add
- `evolution-shell-component-client' and `evolution-session'.
-
- * evolution-session.c: New.
- * evolution-session.h: New.
-
- * Makefile.am (evolution_SOURCES): Removed files that were already
- in `libeshell.a'.
-
- * Evolution.idl: #include <Evolution-Session.idl>.
-
- * Evolution-Session.idl: New.
-
-2000-07-20 Ettore Perazzoli <ettore@helixcode.com>
-
- * main.c (no_views_left_cb): Call `e_shell_quit()' on the shell
- before getting out of the GTK+ main loop.
- (view_delete_event_cb): Removed.
- (idle_cb): Don't call it.
-
- * e-shell-view-menu.c (command_new_view): New, implementation of
- the "New view" command.
-
-2000-07-16 Damon Chaplin <damon@helixcode.com>
-
- * e-shortcuts-view.c (e_shortcuts_view_construct): created a model
- for the EShortcutBar. This will probably have to be moved to support
- multiple views.
- (class_init): #if'd out overriding the class functions. They don't
- exist any more (they are in the model instead).
-
-2000-07-12 Christopher James Lahey <clahey@helixcode.com>
-
- * main.c: Fixed to match gconf API change.
-
-2000-07-10 Dan Winship <danw@helixcode.com>
-
- * main.c (development_warning): Update the message.
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-folder-title-bar.c (title_button_clicked_cb):
- Temporarily `#if 0'ed out.
-
-2000-07-10 Dan Winship <danw@helixcode.com>
-
- * e-shell.c (impl_Shell_user_select_folder): Translate a
- default_folder of "" into NULL (which can't be passed over CORBA).
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-storage.c (e_storage_new_folder): Removed debugging message.
-
- * e-storage-set.c (storage_new_folder_cb): Removed debugging
- message.
-
-2000-07-10 Federico Mena Quintero <federico@helixcode.com>
-
- * e-shell-view.c (unrealize): As a quasi-hack, do a gdk_flush()
- when the shell view is unrealized so that the DeleteEvent gets
- sent to the remote plugs as soon as possible before we start
- making other CORBA calls. The problem is that our CORBA pipe is
- synchronous while our X pipe is asynch. We have to ensure
- ordering for certain operations. This is NOT the correct and
- complete fix, which should go in Bonobo.
-
-2000-07-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (e_shell_view_display_uri): Don't update the
- current URI if there are problems creating a view for it.
- (show_error): Remove. Not used anymore.
-
-2000-07-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view-menu.c: Cleanup some unused menu items and added
- "FIXMEs" for the ones we plan to add in the short term but are not
- implemented yet.
- (command_create_folder): Get rid of an unused variable.
-
-2000-07-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-shell-client.c (user_select_folder): Fix small warning
- by adding proper cast when filling in the CORBA sequence struct.
-
-2000-07-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c (setup_corba_storages): Ref the CORBA storage
- registry.
-
-2000-07-06 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-storage.c: Removed `corba_storage_registry' member
- from `EvolutionStoragePrivate'.
- (destroy): Don't unref/release it. Call
- `StorageListener::destroy' to notify that we are dead.
- (evolution_storage_register): Don't ref and store the registry.
-
-2000-07-05 Dan Winship <danw@helixcode.com>
-
- * e-shell.c (e_shell_save_settings): Use the correct gconf path
- (/apps, not /app), and call gconf_client_suggest_sync at the end.
- (e_shell_restore_from_settings): Use the correct gconf path.
-
-2000-07-05 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view-menu.c (command_goto_folder): Set the folder
- selection dialog as transient for the shell view.
- (command_create_folder): New, bound to the "Create folder"
- command in the "File" menu.
-
-2000-07-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c (impl_Shell_user_select_folder): New arg
- @allowed_types. Pass it to the EShellFolderSelectionDialog.
- Connect to the "cancelled" and "folder_selected" signals instead
- of "clicked".
- (corba_listener_destroy_notify): New callback.
- (impl_Shell_user_select_folder): Associate it to the DestroyNotify
- for the "corba_listener" GtkObject data, so we don't leak it.
- (folder_selection_dialog_clicked_cb): Don't release the listener
- interface here.
- (folder_selection_dialog_cancelled_cb): New callback for the
- "cancelled" signal.
- (folder_selection_dialog_folder_selected_cb): New callback for the
- "folder_selected" signal.
-
- * e-shell-view-menu.c (command_goto_folder): Don't connect to
- "clicked". Connect to "cancelled" and "folder_selected" instead.
- (folder_selection_dialog_cancelled_cb): New, callback for the
- "cancelled" signal.
- (folder_selection_dialog_folder_selected_cb): New, callback for
- the "folder_selected" signal.
-
- * e-shell-folder-selection-dialog.c New members `allowed_types',
- `storage_set' in `EShellFolderSelectionDialogPrivate'.
- (class_init): Install signals "folder_selected", "cancelled".
- (init): Init to NULL.
- (impl_destroy): Free/unref them.
- (e_shell_folder_selection_dialog_new): New arg @allowed_types.
- (e_shell_folder_selection_dialog_construct): New arg
- @allowed_types. Initialize `priv->allowed_types' from it.
- (check_folder_type): New function. Check if the selected folder
- is of the appropriate type and, if not, return FALSE and pop up an
- error dialog. Otherwise, return TRUE.
- (impl_clicked): Use `check_folder_type()' to check if the folder
- type is OK. If it is not, stop emission of the "clicked" signal.
-
- * e-shell-folder-selection-dialog.h: New signals
- "folder_selected", "cancelled".
-
- * evolution-shell-client.c
- (evolution_shell_client_user_select_folder): New arg
- @allowed_types.
- (user_select_folder): New arg @allowed_types. Pass this to the
- ::user_select_folder method.
-
- * Evolution-Shell.idl: New arg @required_types in
- ::user_select_folder.
-
-2000-07-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c (setup_components): Don't ref the component registry.
-
-2000-06-30 Dan Winship <danw@helixcode.com>
-
- * Evolution-Shell.idl: add "cancel" to FolderSelectionListener.
-
- * evolution-shell-client.c (impl_FolderSelectionListener_cancel):
- Implement cancel (set *uri and *physical_uri to NULL).
- (evolution_shell_client_user_select_folder): document %NULL uri
- and physical_uri return values.
-
- * e-shell.c (folder_selection_dialog_clicked_cb): If the user
- clicked "Cancel" or used the wm to close the dialog, call _cancel
- instead of _selected.
-
-2000-06-30 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-shell-component.c (impl_ShellComponent_set_owner):
- Duplicate the object before storing it, you doofus.
-
-2000-06-30 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-shell-component.c (impl_ShellComponent_unset_owner):
- NULL the owner_client.
-
-2000-06-30 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-shell-client.h
- (evolution_shell_client_user_select_folder): Add prototype.
-
-2000-06-29 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-shell-component.c: New member `owner_client'. Removed
- member `corba_owner'. All the code updated to use it.
- (evolution_shell_component_get_owner): Changed so that it returns
- an EvolutionShellClient instead of the raw CORBA object.
-
- * evolution-shell-component.h: Change signal "owner_set" to get an
- EvolutionShellClient wrapper instead of a CORBA interface.
-
- * evolution-shell-client.c: New.
- * evolution-shell-client.h: New.
-
-2000-06-29 Dan Winship <danw@helixcode.com>
-
- * evolution-shell-component-client.c
- (evolution_shell_component_client_new): Update warning message to
- not say "CRASHING", since it won't if you have current bonobo.
-
-2000-06-29 Peter Williams <peter@beta.newton.cx>
-
- * e-shell.c (e_shell_restore_from_settings): Check for the
- insanely invalid NumberOfViews = 0 case.
-
-2000-06-29 Peter Williams <peter@helixcode.com>
-
- * e-shell.c (e_shell_construct): Ref the various E-things that
- we create to go with our unrefs in the destructor.
-
-2000-06-29 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (e_shell_view_construct): Don't ref the shell.
- (destroy): Don't unref the shell.
-
-2000-06-29 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shortcuts.c (e_shortcuts_construct): Fix typo: @shortcuts
- should unset `GTK_FLOATING', not @storage_set.
-
- * e-shell-view.c (get_storage_set_path_from_uri): If @uri is NULL,
- return NULL.
-
- * main.c (idle_cb): Restore the shell from the settings. If this
- fails, just create a new view.
-
- * e-shell.c (e_shell_save_settings): New.
- (e_shell_quit): Save settings before exiting.
- (e_shell_restore_from_settings): New.
-
- * e-shell-view.c (e_shell_view_save_settings): New.
- (e_shell_view_load_settings): New.
-
- * main.c (idle_cb): Initialize Gconf, create the GConfClient and
- pass it to `e_shell_new()'.
-
- * e-shell.c: New member `gconf_client' in `EShellPrivate'.
- (destroy): Unref it if not NULL.
- (init): Init to NULL.
- (e_shell_new): New param @gconf_client.
- (e_shell_construct): Likewise.
-
- * Makefile.am (INCLUDES): Add `GCONF_CFLAGS'.
-
-2000-06-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-folder-title-bar.c (e_shell_folder_title_bar_construct):
- Enable the title bar button.
-
-2000-06-27 Michael Zucchi <zucchi@zedzone.mmc.com.au>
-
- * e-shell.c (folder_selection_dialog_clicked_cb): Close the dialog
- when done. Dont do anything if 'new' was pressed, and always
- return empty strings if 'cancel' was pressed.
-
-2000-06-27 Michael Zucchi <zucchi@zedzone.mmc.com.au>
-
- * e-shell.c (impl_Shell_user_select_folder): Set the listener as
- the corba_listener data, not the shell.
-
-2000-06-26 Christopher James Lahey <clahey@helixcode.com>
-
- * glade/Makefile.am: Added EXTRA_DIST for make distcheck.
-
-2000-06-19 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-local-storage.c: Don't #define POSIX_SOURCE at all; this is
- not needed anymore as we no longer use `readdir_r'.
-
-2000-06-19 Chris Toshok <toshok@helixcode.com>
-
- * e-local-storage.c: #undef _POSIX_SOURCE after including
- dirent.h. this breaks the build on freebsd if we leave it
- #defined. go figure.
-
-2000-06-19 Dan Winship <danw@helixcode.com>
-
- * evolution-shell-component-client.c
- (evolution_shell_component_client_new): Add a warning before
- crashing due to a known bug when it can't activate a component, so
- people don't have to waste any time trying to figure out what's
- up.
-
-2000-06-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am: Compile the CORBA-built files,
- evolution-shell-component.c and evolution-storage.c into a
- separate `libeshell.a' library. Link the `evolution' executable
- to it. Also cleaned up a bit and got rid of the `CPP_FLAGS'
- assignment.
-
-2000-06-12 Michael Meeks <michael@helixcode.com>
-
- * e-shell-folder-selection-dialog.c: include gnome-dialog.h
- (PARENT_TYPE): GNOME_TYPE_DIALOG replaced with gnome_dialog_get_type.
-
-2000-06-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c (impl_Shell_user_select_folder): New, implementation
- for `Shell:user_select_folder'.
- (corba_class_init): Install it.
- (folder_selection_dialog_clicked_cb): Callback for the folder
- selection dialog.
-
- * Evolution-Shell.idl: New method `Shell::user_select_folder'.
- New interface `FolderSelectionListener'.
-
- * glade/e-shell-folder-creation-dialog.glade: Make it larger.
-
- * e-shell-folder-creation-dialog.h: Fix typo: #include
- <gtk/gtkwindow.h>, not <gtk/gtkwidget.h>.
-
- * e-shell-view-menu.c: Added "Go to folder..." command.
- (commmand_goto_folder): Implementation for it.
-
- * e-shell-folder-selection-dialog.c: New.
- * e-shell-folder-selection-dialog.h: New.
-
-2000-06-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-local-folder.c (save_metadata): Don't set the description in
- the XML file if null. Compute the physical path correctly.
-
- * e-folder.c (e_folder_construct): Allow NULL description.
-
- * evolution-shell-component-client.c (init): Initalize
- `listener_interface' to `CORBA_OBJECT_NIL' and `listener_servant'
- to NULL.
- (create_listener_interface): Return void and set the `servant' and
- `listener_servant' fields directly.
- (evolution_shell_component_client_async_create_folder): Updated
- accordingly.
-
- * e-shell-folder-creation-dialog.c: New struct `DialogData' to be
- passed to the dialog's callbacks.
- (dialog_data_destroy): New.
- (e_shell_show_folder_creation_dialog): Set up a `DialogData'
- object and pass it as the data for the signals.
- (shell_destroy_cb): New handler for the "destroy" signal on the
- shell.
- (e_shell_show_folder_creation_dialog): Connect it.
- (dialog_destroy_cb): New handler for the "destroy" signal on the
- dialog; it frees the associated `DialogData'.
- (e_shell_show_folder_creation_dialog): Connect it.
- (async_create_cb): New function, callback for the async folder
- creation function.
- (entry_name_is_valid): New function to check if the entered folder
- name is valid.
- (dialog_clicked_cb): Check if the specified folder name is valid
- and, if so, asynchronously create the new folder.
- (add_folder_types): Set "type_name" data on each menu item.
-
- * e-storage-set-view.c (e_storage_set_view_get_current_folder):
- New function.
-
- * e-storage-set.c (get_storage_for_path): New helper function.
- (e_storage_set_get_folder): Use it.
-
- * e-storage.c (e_storage_async_create_folder): Renamed from
- `e_storage_create_folder'.
- (e_storage_remove_folder): Renamed from `e_storage_remove_folder'.
- (impl_create_create_folder): Renamed from `impl_create_folder'.
- (impl_create_remove_folder): Renamed from `impl_remove_folder'.
- (class_init): Updated accordingly.
- (e_storage_result_to_string): New function.
-
- * e-storage.h: `::create_folder' renamed to
- `::async_create_folder'. `::remove_folder' renamed to
- `::async_remove_folder'.
-
- * evolution-shell-component.h: Return type of
- `EvolutionShellComponentCreateFolderFn' and
- `EvolutionShellComponentRemoveFolderFn' changed to `void'.
-
- * e-local-storage.c: `EComponentRegistry component_registry'
- replaced with `EFolderTypeRegistry folder_type_registry' in
- `ELocalStoragePrivate'
- (component_async_create_folder_callback): New function, to handle
- the callback from EvolutionShellComponent.
- (construct): Likewise.
- (e_local_storage_open): Replaced @component_registry with
- @folder_type_registry.
- (impl_create_folder): Implemented.
-
- * e-local-folder.c (e_local_folder_new): New.
- (e_local_folder_construct): New.
- (e_local_folder_save): Precondition: physical URI is not NULL.
- (save_metadata): Unlink the metadata file if `xmlSaveFile()'
- fails.
-
- * e-storage.c (e_storage_create_folder): Precondition: @path is
- absolute.
- (e_storage_remove_folder): Likewise.
-
-2000-06-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view-menu.c: Removed folder menu and "save as..." command.
-
- * main.c (main): Call `glade_gnome_init()'.
-
- * e-shell-view-menu.c (command_new_folder): Implemented.
-
- * e-shell-folder-creation-dialog.c: New.
- * e-shell-folder-creation-dialog.h: New.
-
- * glade/Makefile.am: New.
- * glade/e-shell-folder-creation-dialog.glade: New.
-
- * e-shell-view.c (e_shell_view_get_current_uri): New.
-
- * e-folder-type-registry.c
- (e_folder_type_registry_get_type_names): New.
-
- * e-shell-view.c (get_control_for_uri): Updated to use
- `EvolutionShellComponentClient'.
-
- * e-folder-type-registry.c: Use `EvolutionShellComponentClient's
- instead of `BonoboObjectClient's.
-
- * e-component-registry.c: Use `EvolutionShellComponentClient'
- instead of `BonoboObjectClient' in `Component'.
- (component_new): Updated accordingly.
- (register_component): Likewise.
-
- * evolution-shell-component-client.h: New.
- * evolution-shell-component-client.c: New.
-
- * evolution-shell-component.c
- (impl_ShellComponent_async_create_folder): New, implementation of
- `::async_create_folder'.
- (impl_ShellComponent_async_remove_folder): New, implementation of
- `::async_remove_folder'.
- (corba_class_init): Install them.
- (evolution_shell_component_new): New args `create_folder_fn' and
- `remove_folder_fn' for setting the handlers for these new methods.
- (evolution_shell_component_construct): Likewise.
-
- * Evolution-ShellComponent.idl
- (ShellComponent::async_create_folder): New.
- (ShellComponent::async_remove_folder): New.
- (ShellComponentListener): New.
-
- * evolution-shell-component.c (impl_ShellComponent_create_view):
- New param @type. Use the new `EvolutionShellComponentCreateViewFn'.
-
- * evolution-shell-component.h: New enum `EvolutionShellComponentResult'.
- Changed `EvolutionShellComponentCreateViewFn' to return an
- `EvolutionShellComponentResult'.
-
- * e-shell-view.c (get_control_for_uri): Pass the folder type to
- `ShellComponent::create_view'.
-
- * Evolution-ShellComponent.idl: New param @type for
- `ShellComponent::create_view'.
-
-2000-06-08 Miguel de Icaza <miguel@helixcode.com>
-
- * main.c (development_warning): Use version here. Add padding to
- the message.
- Only destroy object if its window was not closed.
-
-2000-06-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (setup_bonobo_ui_handler): Oops. Don't create
- the toolbar. This was not supposed to be committed.
-
-2000-06-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-storage.c (folder_destroy): Don't destroy the subfolders.
- (remove_folder): New helper function.
- (free_private): Use it.
- (e_storage_removed_folder): Use it here too.
- (folder_destroy): Don't unref the EFolder if NULL.
-
- * e-storage-set-view.c (e_storage_set_view_construct): Use
- `gtk_signal_connect_while_alive()' instead of just
- `gtk_signal_connect()' so that the signal handler is automatically
- removed when we are destroyed.
-
- * e-storage-set.c (e_storage_set_remove_all_storages): New
- function.
-
- * e-shell-view.c (e_shell_view_construct): Use `bonobo_object_ref'
- on the shell instead of `gtk_object_ref'.
- (destroy): Unref the shell.
-
- * e-local-storage.h: #include "e-component-registry.h".
-
- * e-shell.c (setup_local_storage): Renamed from `setup_storages'.
- Only set up the local storage, not the CORBA one, and don't create
- the storage set.
- (e_shell_construct): Create the storage set here instead. Call
- `setup_local_storage' after setting up the components.
-
- * e-local-storage.c: New member `component_registry' in
- `ELocalStoragePrivate'.
- (init): Init to NULL.
- (destroy): If not null, unref it.
- (e_local_storage_open): New arg @component_registry.
- (construct): New arg @component_registry. Init
- `priv->component_registry' from it.
-
- * e-local-storage.c (impl_get_name): Renamed from `get_name'.
- (impl_create_folder): New function, implementing
- `EStorage::create_folder'. Just a stub for now.
- (impl_remove_folder): New function, implementing
- `EStorage::remove_folder'. Just a stub for now.
- (class_init): Install these stub implementations.
-
- * e-storage.c (e_storage_remove_folder): New function.
- (e_storage_create_folder): New function.
- (impl_create_folder): New function, default implementation for
- `::create_folder'.
- (impl_remove_folder): New function, default implementation for
- `::remove_folder'.
- (class_init): Install the implementations.
-
- * e-storage.c (impl_get_name): Renamed from `get_name'.
- (impl_get_folder): Renamed from `get_folder'.
- (impl_list_folders): Renamed from `list_folders'.
-
- * e-storage.h: New virtual methods `remove_folder',
- `create_folder'.
-
- * e-storage.c (e_storage_removed_folder): Renamed from
- `e_storage_remove_folder'.
- * e-corba-storage.c (impl_StorageListener_removed_folder): Updated
- accordingly.
-
-2000-06-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (setup_bonobo_ui_handler): Create the default toolbar.
-
-2000-06-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-shell-view-menu.c: Changed "Using the Shell" to "Getting Started"
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * e-shell-view.c: Free the uri variable.
-
- * e-shell.c: Free the local_directory variable.
-
-2000-06-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * main.c (view_delete_event_cb): New callback for the
- "delete_event" on the view.
- (idle_cb): Connect it.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * e-storage-set-view.c (set_e_shortcut_selection): Added a
- g_return_if_fail check.
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * e-shell-view-menu.c (command_help): New menu callback to launch
- the help browser.
- (menu_help): add pointers to the users' guide.
- (e_shell_view_menu_setup): Add the help menu stuff to the uih.
-
- * main.c (main): Set up gettext. (Problem noted by Héctor García
- Alvarez)
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (DEFAULT_WIDTH): Add more 5 pixels.
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (DEFAULT_WIDTH): Made the default window a bit
- narrower.
- (DEFAULT_HEIGHT): And shorter.
- (setup_widgets): Set the border width of the vbox that holds the
- title bar to 2 pixels, so that the view looks a bit nicer.
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (DEFAULT_TREE_WIDTH): Made the tree 150 pixel
- wide [instead of 100].
- (setup_widgets): Use `DEFAULT_TREE_WIDTH' instead of
- `DEFAULT_SHORTCUT_BAR_WIDTH' where appropriate.
- (e_shell_view_construct): Hide the folder bar by default.
-
- * e-storage-set-view.c (e_storage_set_view_construct): Set
- auto-resize mode for column one.
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view-menu.c (e_shell_view_menu_setup): Set the
- statusbar.
-
- * e-shell-view.c: New member `appbar' for `EShellViewPrivate'.
- (init): Initialize to NULL.
- (setup_widgets): Install a status bar and set `appbar' to point to
- it.
- (setup_bonobo_ui_handler): Make the BonoboUIHandler use `appbar'
- as its statusbar.
- (e_shell_view_get_appbar): New function.
- (e_shell_view_construct): Set up the BonoboUIHandler after setting
- up the widgets.
-
- * e-shortcuts.c (class_init): Add new signals "new_shortcut",
- "removed_shortcut", "new_group", "removed_group".
- (e_shortcuts_remove_shortcut): Emit "remove_shortcut".
- (e_shortcuts_add_shortcut): Emit "new_shortcut".
- (e_shortcuts_remove_group): Emit "remove_group".
- (e_shortcuts_add_group): Emit "new_group".
- (unload_shortcuts): Emit "remove_group" for all the groups.
-
- * e-shortcuts.h: New signals "new_shortcut", "removed_shortcut",
- "new_group", "removed_group".
-
- * e-shortcuts-view.c (pop_up_right_click_menu): New function to
- pop up the right-click menu for the shortcut bar.
- (pop_up_right_click_menu_for_shortcut): New function.
- (selected_item): Pop up right click menu when appropriate. Don't
- activate the shortcut when right-clicking.
-
-2000-05-31 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-storage.h: #include 'Evolution.h".
-
-2000-05-31 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c (show_error): Use `set_current_notebook_page()'
- instead of `gtk_notebook_set_page()'; this will also deactivate
- the current control properly.
-
- * e-shell-view-menu.c (e_shell_view_menu_setup): Initialize the
- state of the shortcut/folder toggle menu items using
- `e_shell_view_get_shortcut_bar_mode()' and
- `e_shell_view_get_folder_bar_mode()'.
- (command_toggle_shortcut_bar): Removed debugging message.
- (command_toggle_folder_bar): Likewise.
-
- * e-shell-view.c (e_shell_view_get_shortcut_bar_mode): New
- function.
- (e_shell_view_get_folder_bar_mode): New function.
-
-2000-05-31 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-storage-set-view.c: New constant `DRAG_RESISTANCE'. New
- members `button_x', `button_y' in `EStorageSetViewPrivate'.
- (init): Initialize to zero.
- (button_press_event): Set.
- (motion_notify_event): Don't start drag unless the current x/y
- position is farther than `DRAG_RESISTANCE', in any of the two
- directions, from the original position of the button click.
- (button_release_event): Always ungrab the pointer, even if
- `selected_row_path' is NULL.
-
-2000-05-31 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-shell-component.c (class_init): Eeek!
- s/owner_set/owner_unset/.
-
- * e-shell-folder-title-bar.c (e_shell_folder_title_bar_construct):
- Increase the size of the border of the hbox slightly to make the
- title bar a bit nicer.
-
-2000-05-31 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-component-registry.c (component_free): Invoke `::unset_owner'
- on the component before releasing it.
-
- * evolution-shell-component.c (class_init): Install the
- "owner_set" signal.
- (impl_ShellComponent_unset_owner): New function, implementation of
- `ShellComponent::unset_owner'.
- (corba_class_init): Install it.
-
- * evolution-shell-component.h: New signal "owner_unset".
-
- * Evolution-ShellComponent.idl: New method `ShellComponent::
- unset_owner'.
-
- * e-shell.c (e_shell_quit): Destroy all the views explicitly.
-
- * e-shell-view-menu.c: Changed `Show shortcut bar' and `Show
- folder tree' items into toggle items.
- (shortcut_bar_mode_changed_cb): New callback to update the status
- of the "show shortcut bar" toggle item when the shortcut bar is
- hidden/shown in the view.
- (folder_bar_mode_changed_cb): Likewise for the folder bar.
- (e_shell_view_menu_setup): Connect these to the corresponding
- signals on the shell.
-
- * e-shell-view.c: New members `shortcut_bar_mode' and
- `folder_bar_mode' in `EShellViewPrivate'.
- (init): Initialize `shortcut_bar_mode' and `folder_bar_mode' to
- `E_SHELL_VIEW_SUBWINDOW_HIDDEN'.
- (class_init): Add the new signals.
- (e_shell_view_set_shortcut_bar_mode): Renamed from
- `e_shell_view_show_shortcuts'. Emit "shortcut_bar_mode_changed"
- and update the `shortcut_bar_mode' member.
- (e_shell_view_set_folder_bar_mode): Renamed from
- `e_shell_view_show_folders'. Emit "folder_bar_mode_changed" and
- update the `folder_bar_mode' member.
-
- * e-shell-view.h: New signals "shortcut_bar_mode_changed",
- "folder_bar_mode_changed".
-
- * e-shell-view.c (setup_menus): Removed.
- (e_shell_view_construct): Use `e_shell_view_menu_setup' instead.
- (e_shell_view_get_bonobo_ui_handler): New function.
-
- * e-shell-view-menu.c (e_shell_view_menu_setup): New.
-
- * e-shell.c (impl_Shell_get_component_for_type): New function,
- implementation of `Evolution::Shell::get_component_for_type'.
- (corba_class_init): Install it into the EPV.
-
- * Evolution-Shell.idl: Added method `get_component_for_type'.
-
-2000-05-30 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shortcuts.c: New members `dirty', `save_idle_id' in
- `EShortcutsPrivate'.
- (init): Initialize.
- (destroy): If the idle ID is nonzero, remove the idle. If `dirty'
- is true, save.
- (idle_cb): New.
- (schedule_idle): New.
- (make_dirty): New.
- (e_shortcuts_remove_shortcut): Call it.
- (e_shortcuts_add_shortcut): Likewise.
- (e_shortcuts_remove_group): Likewise.
- (e_shortcuts_add_group): Likewise.
-
- * e-shell.c (e_shell_construct): Updated to match the `EShortcuts'
- API changes.
-
- * e-shortcuts.c: New member `file_name' in `EShortcutsPrivate'.
- (init): Init to NULL.
- (destroy): Free it.
- (e_shortcuts_load): Removed.
- (e_shortcuts_save): Removed.
- (e_shortcuts_new): New arg @file_name. Load from the specified
- file name.
-
- * e-shortcuts-view.c (added_item): New method implementation.
- (removed_item): New method implementation.
- (added_group): New method implementation.
- (removed_group): New method implementation.
- (class_init): Install these.
-
- * e-shortcuts.c (e_shortcuts_remove_shortcut): New function.
- (e_shortcuts_add_shortcut): New function.
- (e_shortcuts_remove_group): New function.
- (e_shortcuts_add_group): New function.
-
- * e-shell-view.c: New member `view_title_bar' in
- `EShellViewPrivate'.
- (setup_widgets): Put an EShellFolderTitleBar on top of the tree
- view and the content view.
- (update_window_icon): Renamed from `set_icon'.
- (update_folder_title_bar): New.
- (popup_tree): New function to pop up the tree view when the title
- button in the title bar is clicked.
- (folder_title_clicked_cb): New callback for the "clicked" signal
- of EShellFolderTitleBar.
- (setup_widgets): Don't add a title bar to the shortcut bar.
- (create_storage_set_subwindow): New helper function.
- (setup_widgets): Use it.
- (show_error): Use an EClippedLabel instead of a GtkLabel.
-
- * e-shell-view.c: Replaced all the occurences of `gpointer' with
- `void *' for consistency.
-
- * e-shell-folder-title-bar.c: New file.
- * e-shell-folder-title-bar.h: New file.
-
- * e-storage-set-view.c (e_storage_set_view_construct): Ooops. Fix
- inverted key/value pair in the call to `g_hash_table_insert()'.
-
-2000-05-28 Dan Winship <danw@helixcode.com>
-
- * main.c (main): Remove extra free of evolution_directory.
-
-2000-05-28 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-storage.c (evolution_storage_register): Use the
- storage's name when registering.
-
-2000-05-26 Matt Loper <matt@helixcode.com>
-
- * e-shell-view-menu.c (command_about_box): Make authorlist more
- alphabetical.
- (command_show_treeview): New function; shows the treeview, when it
- has been hidden.
- (command_show_shortcut_bar): New function; shows the shortcut bar,
- when it's been hidden.
-
-2000-05-26 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-corba-storage.c (impl_StorageListener_new_folder): Set the
- physical URI on the folder using `e_folder_set_physical_uri()'.
-
- * e-local-folder.c (get_physical_uri): Removed.
- (construct_loading_metadata): Use EFolder's `physical_uri' field
- instead of ours, which is gone.
- (save_metadata): Likewise.
- (destroy): Don't free.
-
- * e-local-folder.h: Removed `physical_uri' from `ELocalFolder'.
-
- * e-folder.c: New member `physical_uri' in `EFolderPrivate'.
- (init): Initialize to NULL.
- (destroy): Free it.
- (get_physical_uri): Removed.
- (e_folder_set_physical_uri): New function.
-
- * e-storage-set.c (e_storage_set_get_folder): Fix off-by-one error
- in extracting the base name.
-
- * e-storage.c: New member `path' in `Folder'.
- (folder_destroy): Free it.
- (folder_new): New arg. Initialize `path' from it.
- (e_storage_construct): Updated accordingly.
- (e_storage_new_folder): Likewise.
- (e_storage_remove_folder): Remove the folder from the hash.
-
- * e-storage-set-view.c (remove_node): New function.
- (removed_storage_cb): Use it.
- (new_folder_cb): New function, callback for the "new_folder"
- signal on the EStorageSet.
- (removed_folder_cb): New function, callback for the
- "removed_folder" signal on the EStorageSet.
- (e_storage_set_view_construct): Connect these signal handlers to
- the respective signals on our model storage.
-
- * e-storage-set.c (storage_new_folder_cb): New function, callback
- for the "new_folder" signal on the storages.
- (storage_removed_folder_cb): New function, callback for the
- "removed_folder" signal on the storages.
- (e_storage_set_add_storage): Connect them to the signals of the
- storage being added.
-
- * e-corba-storage-registry.c
- (impl_StorageRegistry_register_storage): Throw an exception if
- `e_storage_set_add_storage()' returns false.
-
- * e-shell.c (setup_storages): Unref the local storage after adding
- to the storage set.
-
- * e-corba-storage-registry.c
- (impl_StorageRegistry_register_storage): Unref the storage after
- adding to the storage set.
-
- * e-storage-set.c: New hash table `name_to_named_storage' in
- `EStorageSetPrivate'.
- (named_storage_new): New helper function.
- (named_storage_destroy): New helper function.
- (e_storage_set_add_storage): Use the hash table. Return value
- changed to `gboolean'. Return FALSE if there is a storage with
- that name already. Also, ref the storage.
- (e_storage_set_remove_storage): Likewise [but of course don't ref
- the storage].
- (e_storage_set_get_storage): Use the `name_to_named_storage' hash
- table.
- (destroy): Destroy the `name_to_named_storage' hash.
-
- * e-storage-set.h: New signals "new_folder", "removed_folder".
-
- * e-storage.c (e_storage_get_watcher_for_path): Removed.
- (get_watcher_for_path): Removed.
- (class_init): Install signals "new_folder" and "removed_folder".
- (e_storage_remove_folder): Emit "removed_folder".
- (e_storage_new_folder): Emit "new_folder".
-
- * e-storage.h: Removed method `get_watcher_for_path'. New signals
- "new_folder", "removed_folder".
-
- * e-storage-watcher.c: Removed.
- * e-storage-watcher.h: Removed.
-
- * e-corba-storage-registry.c (corba_class_init): Set the
- Bonobo_Unknown evp parts.
-
- * evolution-storage.c: New.
- * evolution-storage.h: New.
-
- * evolution-shell-component.c
- (evolution_shell_component_get_owner): New.
-
- * e-storage-set-view.c (new_storage_cb): New function.
- (e_storage_set_view_construct): Connect to the "new_storage"
- signal on the EStorageSet.
- (removed_storage_cb): New function.
- (e_storage_set_view_construct): Connect to the "removed_storage"
- signal on the EStorageSet.
-
- * e-storage-set-view.c (e_storage_set_view_construct): Make this
- always look pretty, with Helix GNOME or without.
-
-2000-05-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-storage-set-view.c: Make this always look pretty, with Helix
- GNOME or without.
-
-2000-05-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-storage-set-view.c (e_storage_set_view_construct): Set the
- dotted line type again. Dotted is less butt-ugly than continuous.
-
- * e-shell-view.c (show_error): Display page zero in the notebook.
-
- * main.c (idle_cb): Renamed from `new_view_idle_cb'. Create the
- EShell object here, because now the shell depends on the GLib loop
- to be running for correct operation.
- (main): Don't create the EShell here.
-
- * e-storage-set-view.c (get_pixmap_and_mask_for_folder): If the
- icon is not found, set the returned pixmap and mask to NULL.
-
- * e-shell.c (e_shell_construct): Added precondition: @corba_object
- must be non-nil.
- (e_shell_new): Added precondition: @local_direcory must be
- non-null.
-
- * evolution-shell-component.c: New.
- * evolution-shell-component.h: New.
-
- * e-shell.c: New member `component_registry' in `EShellPrivate'.
- (init): Initialize to NULL.
- (destroy): Unref it.
- (setup_components): New function to set up the compnent registry
- and initialize the mail, calendar and addressbook components.
- (e_shell_construct): Call it.
-
- * e-storage-set.c: Updated to use EFolderTypeRegistry.
- * e-storage-set.h: Likewise.
- * e-shortcuts.c: Likewise.
- * e-shortcuts.h: Likewise.
- * e-shell.c: Likewise.
-
- * e-shell.h: Likewise.
- * e-shell-view.c: Likewise.
- * e-shortcuts-view.c: Likewise.
- * e-storage-set-view.c: Likewise.
-
- * e-component-registry.c: New.
- * e-component-registry.h: New.
-
- * e-folder-type-registry.c: New.
- * e-folder-type-registry.h: New.
-
- * e-folder-type-repository.c: Removed.
- * e-folder-type-repository.h: Removed.
-
- * Evolution-ShellComponent.idl: New struct `FolderType'; new type
- `FolderTypeList'. New attribute `supported_types'.
- (ShellComponent::set_owner): Renamed from `set_shell'.
- (ShellComponent::create_view): New.
-
-2000-05-24 Christopher James Lahey <clahey@helixcode.com>
-
- * e-shell-view.c: Was using the wrong include here.
-
- * e-storage-set-view.c: Got rid of the lines in the tree view.
-
-2000-05-24 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added libepaned.a.
-
- * e-shell-view.c: Switched from GtkPaned to EPaned.
-
-2000-05-23 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c: New member `corba_storage_registry' in
- `EShellPrivate'.
- (init): Initialize it to NULL.
- (destroy): Unref it if not NULL.
- (setup_corba_storages): New function to set up the CORBA storage
- registry and `bonobo_object_add_interface()' it to the shell.
- (setup_storages): Call it from here.
-
- * e-shell.h, e-shell.c: Derive EShell from BonoboObject instead of
- GtkObject.
-
- * e-storage.c (e_storage_remove_folder): Return value changed into
- `gboolean'; return false if an error occurs, true otherwise.
- (e_storage_new_folder): Likewise.
-
- * e-corba-storage-registry.c: New.
- * e-corba-storage-registry.h: New.
-
- * e-corba-storage.c: New.
- * e-corba-storage.h: New.
-
- * Evolution.idl: Include the new IDLs, but no
- `evolution-service-repository.idl' anymore.
-
- * Evolution-Shell.idl: New.
- * Evolution-ShellComponent.idl: New.
- * Evolution-Storage.idl: New.
-
- * evolution-service-repository.idl: Removed.
- * evolution-service-repository.c: Removed.
- * evolution-service-repository.h: Removed.
-
- * e-folder-type-repository.c (folder_type_new): Free `icon_path'.
-
-2000-05-18 Dan Winship <danw@helixcode.com>
-
- * main.c (new_view_idle_cb): add development_warning (moved from
- mail component)
-
-2000-05-16 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-storage-set-view.c: Get rid of the `ICON_WIDTH' and
- `ICON_HEIGHT' #defines.
- (get_pixmap_and_mask_for_folder): Get the mini icon instead of the
- big one. Use `E_SHELL_MINI_ICON_SIZE' instead of `ICON_WIDTH' and
- `ICON_HEIGHT'.
-
- * e-folder-type-repository.c: New member `mini_icon_pixbuf' in
- `FolderType'.
- (folder_type_new): Initialize `mini_icon_pixbuf' by loading the
- mini icon if possible. If the mini icon is not found, resort to
- the big one.
- (folder_type_free): Unref the mini icon.
- (e_folder_type_repository_get_icon_for_type): New arg @mini. If
- true, return the mini icon instead of the standard one.
-
- * e-shell-view.c (set_icon): Get the mini icon instead of the big
- one by using `e_shell_get_icon_path's @try_mini arg.
-
- * e-shell-constants.h: New file.
-
- * e-shell-utils.c
- (e_shell_get_icon_path): New arg @try_mini. If true, look for the
- mini version [whose name ends in `-mini'].
-
- * e-folder-type-repository.c
- (folder_type_new): Free string returned by
- `e_shell_get_icon_path()'.
-
-2000-05-16 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c: New members `storage_set_view_box',
- `shortcut_bar_box', `hpaned1_position', `hpaned2_position' in
- `EShellViewPrivate'.
- (init): Initialize them.
- (setup_widgets): Add title bars to the tree and shortcut views.
- (shortcuts_view_close_button_clicked_cb): New callback function.
- (setup_widgets): Connect to the "close_button_clicked" signal of
- the shortcut view's title bar.
- (storage_set_view_close_button_clicked_cb): New callback function.
- (setup_widgets): Connect to the "close_button_clicked" signal of
- the storage set view's title bar.
- (e_shell_view_show_shortcuts): New function.
- (e_shell_view_show_folders): New function.
-
- * e-shell-view.c: New members `hpaned1', `hpaned2' in
- `EShellViewPrivate'.
- (init): Initialize both to NULL.
- (setup_widgets): Invert the parenting order for the GtkHPaneds and
- store them into the private `hpaned' and `hpaned2' members.
-
- * Makefile.am (evolution_LDADD): Link with `libemiscwidgets.a'.
-
-2000-05-15 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shortcuts.c
- (load_shortcuts_into_view): Removed.
- (e_shortcuts_new_view): Don't set up the shortcut bar manually
- here anymore, and don't set the icon callback either. The
- `EShortcutsView' object is now able to do this by itself.
-
- * e-shortcuts-view.c
- (icon_callback): Moved here from `e-shortcuts.c'.
- (load_group): New function.
- (load_all_shortcuts): New function.
- (e_shortcuts_view_construct): Call it to load the shortcuts from
- the `EShortcuts' object. Also, set `icon_callback' as the icon
- callback.
-
- * e-storage-set-view.c
- (button_press_event): Add/remove grab with `gtk_grab_add' and
- `gtk_grab_remove'.
- (button_release_event): Call `gtk_grab_remove' when removing the
- grab.
-
- * e-shortcuts.c: New member `title_to_group' in
- `EShortcutsPrivate'.
- (init): Initialize here.
- (destroy): Destroy here.
- (unload_shortcuts): Destroy and recreate here.
- (load_shortcuts): Avoid inserting multiple groups with the same
- title, and insert the groups into the `title_to_group' hash table.
- Also, avoid leaking the return value from `xmlNodeListGetString'.
- (e_shortcuts_get_group_titles): New function.
- (e_shortcuts_get_shortcuts_in_group): New function.
- (e_shortcuts_get_storage_set): New function.
-
- * e-storage-set-view.c
- (e_storage_set_view_set_current_folder): Emit the
- "folder_selected" signal.
-
- * e-local-folder.c
- (get_string_value): Return a `char *' to be deallocated by the
- caller instead of a `const char *' that does not need to be
- deallocated.
- (construct_loading_metadata): Free values returned from
- `get_string_value'.
-
-2000-05-15 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-storage-set-view.c: New members `dragged_row_path',
- `selected_row_path_before_click' in `EStorageSetViewPrivate'.
- (init): Initialize them to NULL.
- (motion_notify_event): Set `dragged_row_path' from
- `selected_row_path'.
- (button_press_event): Initialize `selected_row_path_before_click'
- from `selected_row_path'.
- (button_release_event): Set `selected_row_path_before_click' to
- NULL.
- (drag_end): Restore the current selection from
- `selected_row_path_before_click'; then set both `dragged_row_path'
- to NULL.
-
-2000-05-15 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-storage-set-view.c: New members `in_drag' and `drag_button' in
- `EStorageSetViewPrivate'. New static variables `drag_types',
- `num_drag_types', `target_list'.
- (class_init): Create the `target_list'.
- (init): Initialize the private `in_drag' member to false.
- Initialize the private `drag_button' member to zero.
- (button_release_event): Set it to false.
- (motion_notify_event): New function, implementation of
- `GtkWidget::motion_notify_event'. If `in_drag' is false, set it
- to true and set ourselves up as a drag source.
- (button_press_event): New function, implementation of
- `GtkWidget::button_press_event'. Set `drag_button' to the event's
- button number and then chain to the implementation in the parent
- class.
- (drag_end): New function, implementation of `GtkWidget::drag_end'.
- (drag_data_get): New function, implementation of
- `GtkWidget::drag_data_get'.
- (set_e_shortcut_selection): New function, helper for `drag_data_get'.
- (set_uri_list_selection): New function, helper for `drag_data_get'.
- (class_init): Install these method implementations.
-
- * e-storage-set-view.c: New member `selected_row_path' in
- `EStorageSetViewPrivate'.
- (init): Initialize it to NULL.
- (tree_select_row): Set it to the path of the selected row. Don't
- emit "folder_selected" yet. Also, keep the grab.
- (button_release_event): New function, implementation of
- `GtkWidget::button_release_event'. If `selected_row_path' is not
- NULL, emit the "folder_selected" signal with `selected_row_path'
- as the parameter and then set `selected_row_path' to NULL again.
- (class_init): Install `button_release_event'.
-
- * e-storage-set-view.c: Made `ICON_WIDTH' and `ICON_HEIGHT' global
- #defines.
- (e_storage_set_view_construct): Set the row height to
- `ICON_HEIGHT'. Alos, set the selection mode to
- `GTK_SELECTION_BROWSE'.
-
-2000-05-15 Iain Holmes <ih@csd.abdn.ac.uk>
-
- * e-local-folder.c (get_string_value): Use the correct function to
- get the node's contents.
-
- * e-shortcuts.c (load_shortcuts): Same as above.
-
-2000-05-14 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-folder-type-repository.c
- (e_folder_type_repository_get_control_id_for_type): Protect
- against non-existing types.
- (e_folder_type_repository_get_icon_for_type): Likewise.
-
-2000-05-14 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-storage-set-view.c
- (folder_compare_cb): Callback comparison function for comparing
- folders based on their names.
- (insert_folders): Use it to sort the folder list before using it.
-
-2000-05-14 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c
- (setup_storages): Pass the pointer to the folder type repository.
- (e_shell_construct): Initialize the folder type repository before
- everything else.
-
- * e-storage-set.c: New member `folder_type_repository' in
- `EStorageSetPrivate'.
- (init): Initialize it to NULL.
- (destroy): Unref it.
- (e_storage_set_construct): New arg @folder_type_repository.
- Initialize the corresponding member in the private struct through
- it.
- (e_storage_set_new): New arg @folder_type_repository.
- (e_storage_set_get_folder_type_repository): New function.
-
- * e-shortcuts.c (icon_callback): Just use [the new version of]
- `e_folder_type_repository_get_icon_for_type()' instead of loading
- the image manually.
-
- * e-folder-type-repository.c: New member `icon_pixbuf' in
- `FolderType'.
- (folder_type_new): Load the pixbuf.
- (folder_type_free): Unref the pixbuf.
- (e_folder_type_repository_get_icon_name_for_type): Renamed from
- `e_folder_type_repository_get_icon_for_type'.
- (e_folder_type_repository_get_icon_for_type): New function, now
- returning a `GdkPixbuf *'.
-
- * e-shortcuts.c
- (icon_callback): Use `e_shell_get_icon_name()'.
-
- * e-shell-view.c: New member `storage_set_view' in
- `EShellViewPrivate'.
- (init): Initialize it to NULL.
- (e_shell_view_construct): Create an EStorageSetView for the
- shell's EStorageSet and put it into a scrolled window. Also, put
- the scrolled window into the EShellView with some
- [temporary] GtkPaned action. Store the pointer to the
- EStorageSetView to `priv->storage_set_view'.
- (set_icon): Get an EShellView and an EFolder instead of an
- EShellView and a URI. Also, don't leak.
- (update_for_current_uir): New helper function. Call `set_icon'.
- (show_error): Call it.
- (folder_selected_cb): New function.
- (setup_widgets): Connect it to the "folder_selected" signal of the
- storage set view.
-
- * e-storage-set-view.c: New file.
- * e-storage-set-view.h: New file.
-
- * e-shell-utils.c: New file.
- * e-shell-utils.h: New file.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * e-shell-view-menu.c: Added an about box.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * e-shell-view.c: Set the icons when changing between components.
-
- * main.c: Set the default icon. (The change in e-shell-view.c
- doesn't work unless we do this.)
-
-2000-05-09 Matt Loper <matt@helixcode.com>
-
- * e-shell-view-menu.c (command_run_bugbuddy): New function; allows
- users to submit a bug.
- (command_run_bugbuddy): Implemented with jacob's patch.
-
-2000-05-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c (e_shell_new_view): Display the specified @uri in the
- view.
-
- * e-shell-view.c (e_shell_view_construct): Removed arg @uri.
- (e_shell_view_new): Likewise.
-
- * main.c: New string constant `STARTUP_URI', specifying the URI to
- show in the startup view.
- (new_view_idle_cb): New callback function to create a new view for
- `STARTUP_URI' in the idle loop. We need to do this in the idle
- loop because the CORBA stuff cannot work until the loop starts
- running.
- (main): Set `new_view_idle_cb' up as the idle callback instead of
- creating the view right away.
-
-2000-05-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c (setup_storages): Woops. Don't free the path before
- the warning message, as we need to print it.
-
-2000-05-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * main.c (destroy_cb): New function.
- (main): Connect it to the `destroy' signal on the shell.
-
-2000-05-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shortcuts.c (load_shortcuts): Const fix.
-
-2000-05-08 Larry Ewing <lewing@helixcode.com>
-
- * e-shortcuts.c (load_shortcuts_into_view): xmlFree the return
- value of xmlGetProp.
-
-2000-05-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shortcuts-view.c (e_shortcuts_view_construct): Use
- correct cast.
-
-2000-05-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * main.c (main): Connect to "no_views_left", not "destroy".
-
- * e-shell.c (view_destroy_cb): Grmpf.
-
-2000-05-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell.c (e_shell_construct): Output a warning message if the
- shortcut file is not found.
- (setup_storages): Output a warning message if the local storage
- cannot be initialized.
- (destroy): Destroy all the views.
-
- * e-shell-view.c
- (e_shell_view_construct): Ref the shell.
-
- * e-shortcuts-view.c
- (e_shortcuts_view_construct): Ref the shortcuts.
-
- * e-shell.c: Create the "no_views_left" signal. New member
- `views' in `EShellPrivate'.
- (init): Initialize `views' to NULL.
- (view_destroy_cb): Destroy handler for a view: remove the view
- from `views', and emit the "no_views_left" signal if this was the
- last view.
- (e_shell_new_view): Add the new view to `views' and connect the
- "destroy" signal to `view_destroy_cb'.
- (destroy): Destroy the views.
-
- * e-shell.h: New signal "no_views_left".
-
- * e-shell-view-menu.c (command_quit): New function, implementation
- of the "quit" command.
-
- * e-shell-view.c (e_shell_view_get_shell): New function.
-
- * e-shell.c (e_shell_quit): New function.
-
- * main.c (main): If it is not possible to create the shell for
- some reason, pop up an error message.
- (shell_destroy_cb): New function, signal handler for "destroy" on
- the shell object.
- (main): Connect it.
-
-2000-05-06 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shortcuts.c (destroy): Be safer about NULL objects.
-
- * e-shell.c (destroy): Be safer about NULL objects.
-
- * e-local-storage.c (load_folders): Use `readdir()', not
- `readdir_r()'.
-
-2000-05-06 Ettore Perazzoli <ettore@helixcode.com>
-
- * main.c (init_corba) [! USING_OAF]: We have no options no
- popt context.
-
-2000-05-06 Ettore Perazzoli <ettore@helixcode.com>
-
- * All files: Reorganized and redone a lot of the shell. New
- features: internal URI namespace, extensible storage/folder
- mechanism, configurable shortcuts.
-
-2000-05-03 Damon Chaplin <damon@helixcode.com>
-
- * e-shell-view.c (e_shell_view_new): turned the notebook border off.
- The calendar looks better without it. If any of the views want a
- border they should create it themselves, shouldn't they?
-
-2000-05-04 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shortcut.c (shell_icon_cb): Type of @url changed from `gchar
- *' to `const gchar *'; new arg @data.
- (e_shortcut_bar_view_new): Pass NULL as the closure value for
- `e_shortcut_bar_set_icon_callback()'.
-
-2000-05-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-folder-mail.c: Removed.
-
- * e-folder-mail.h: Removed.
-
- * eshell-types.h: Removed.
-
- * e-folder.h: Don't #include "eshell-types.h".
-
-2000-05-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-folder.h: Removed member `eservice' from `EFolder'.
-
- * e-service.c: Removed.
-
- * e-service.h: Removed.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: set G_LOG_DOMAIN.
-
-2000-05-01 Dan Winship <danw@helixcode.com>
-
- * e-shell-view.c (e_shell_view_set_view): Turn off control frame
- autoactivation, so the toolbars work correctly. This may actually
- be a bug in Bonobo, but we'll kludge around it here for now.
-
-2000-04-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shell-view.c: OAFized.
- (get_view): If `bonobo_widget_new_control()' fails for the
- calendar, don't try to get the property bag and stuff and thus
- prevent a segfault.
-
- * main.c
- (corba_init): Removed Bonobo initialization. Implemented OAF
- version for the case in which `USING_OAF' is #defined.
- (init_bonob): New function.
- (main): Call `init_bonobo()'.
-
-2000-04-26 Matt Loper <matt@helixcode.com>
-
- * e-shell-view.c (bonobo_widget_is_dead): Helper function to see
- whether a bonobo widget is a zombie (ie the remote bonobo control
- died).
- (e_shell_view_set_view): Try to respawn dead widgets.
-
-2000-04-25 Dan Winship <danw@helixcode.com>
-
- * Makefile.am: include -I$(datadir)/idl in orbit-idl arguments so
- that you can have bonobo installed in the same prefix as
- evolution, when that isn't the same prefix is gnome-libs, which a
- lot of people seem to be doing.
- (CLEANFILES): add EVOLUTION_CORBA_GENERATED
-
-2000-04-24 Christopher James Lahey <clahey@helixcode.com>
-
- * idl/folder.idl: Made some functions syncronous that didn't need
- to be asyncronous.
-
-2000-04-24 Matt Loper <matt@helixcode.com>
-
- * e-shell-view.h: Added hpaned and treeview widgets to
- EShellView. Added e_shell_view_toggle_shortcut_bar() and
- e_shell_view_toggle_treeview().
-
- * e-shell-view.c (e_shell_view_setup_shortcut_display): Use EPaned
- widget to house our shortcut bar.
- (e_shell_view_toggle_shortcut_bar): New function; toggles whether
- the shortcut bar is showing.
- (e_shell_view_toggle_treeview): Same, for the treeview (NYI).
- (e_shell_view_new): Put the notebook view in our EPaned widget.
-
- * e-shell-view-menu.c (esv_cmd_toggle_shortcut_bar): New function;
- toggles whether the shortcut bar is viewed.
- (esv_cmd_toggle_treeview): Same, but with the treeview. Added
- menuitems in the "view" menu to allow access to the above.
-
-2000-04-19 Seth Alves <alves@hungry.com>
-
- * e-shell-view.c (get_view): set calendar's uri with a property bag
-
-2000-04-19 Christopher James Lahey <clahey@helixcode.com>
-
- * idl/folder.idl: New idl file. Still unused.
-
-2000-04-14 Christopher James Lahey <clahey@helixcode.com>
-
- * e-shell-view.c: Made the left pane of the shell view not
- autoresize.
-
-2000-04-09 Matt Loper <matt@helixcode.com>
-
- * e-shell-view.c (e_shell_view_setup): Set the default height
- bigger, to 600, so that everything in the shortcut-bar shows up.
-
-2000-04-07 Matt Loper <matt@helixcode.com>
-
- * e-shell-view.c (destroy_folder_view): New function;
- Bonobo_Unknown_unref's the controls that have the views in them.
- (esv_destroy): Calls the above for each folder_view in the
- hashtable.
- (get_view): unref the ServiceRepository interface of the control
- when we're done with it.
-
-2000-04-06 Miguel de Icaza <miguel@gnu.org>
-
- * shell/e-shortcut.c (shell_icon_cb): Append a slash here.
- (shell_icons): Only list the filenames.
-
- * shell/main.c (evolution_boot): Be less rude.
-
-2000-04-06 Matt Loper <matt@helixcode.com>
-
- * shell/main.c (evolution_boot): Make sure our data directory is
- available with e_setup_base_dir ().
-
-2000-04-06 Miguel de Icaza <miguel@gnu.org>
-
- * shell/e-shortcut.c (shell_icon_cb): Load the icons from the
- installation path, not form the GNOME-libs installation prefix.
- (shell_icon_cb): Memory leak fix.
-
- * shell/Makefile.am (imagesdir): Pass the EVOLUTION_IMAGES
- installation directory here.
-
-2000-04-05 Seth Alves <alves@hungry.com>
-
- * shell/e-shell-view.c (get_view): hook up control:calendar
-
-2000-03-31 Dan Winship <danw@helixcode.com>
-
- * shell/e-shortcut.c (e_shortcut_bar_view_new, shell_icon_cb):
- Update for shortcut bar changes.
-
- * shell/e-folder.h: add E_FOLDER_SUMMARY
- * shell/e-shell.c (e_shell_setup_default_folders): make the
- "Today" icon be of type E_FOLDER_SUMMARY, not E_FOLDER_MAIL.
-
-2000-03-30 Dan Winship <danw@helixcode.com>
-
- * shell/e-shell-view.c (e_shell_view_set_view): Hold off on
- deactivating the "outgoing" control until after setting up the
- "incoming" control. That way if the new control takes a few
- seconds to load, there won't be an ugly empty spot where the
- toolbar used to be while the new control loads.
-
-2000-03-29 Dan Winship <danw@helixcode.com>
-
- * shell/e-shell-view.c (e_shell_view_set_view): Call
- bonobo_control_frame_activate on the folder_view every time it
- is displayed, and bonobo_control_frame_deactivate every time it is
- hidden.
-
-2000-03-25 Matt Loper <matt@helixcode.com>
-
- * shell/e-shell-view.c (get_view): Move CORBA_Environment to
- different scope.
-
-2000-03-22 Matt Loper <matt@helixcode.com>
-
- * shell/main.c (evolution_boot): gtk_signal_connect'ed "destroy"
- to gtk_main_quit, so that the shell dies when you want it to.
-
- * shell/e-shell-view.c (get_view): Reorganized, and added
- assertions.
- (e_shell_view_set_view): Added assertions.
-
-2000-03-20 Matt Loper <matt@helixcode.com>
-
- * shell/e-shell-view.h: New private field in EShellView added,
- which contains the notebook and a hashtable of folders to views.
-
- * shell/e-shell-view.c (e_shell_view_set_view): Instead of
- creating a new control every time we set the view, we now keep our
- controls in a notebook. This function now switches to the correct
- notebook page, or creates a new page/control as necessary.
- (e_shell_view_new): Creates and inserts the notebook into the
- shell.
-
-2000-03-13 Christopher James Lahey <clahey@helixcode.com>
-
- * shell/e-shell-view.c: Added an E_FOLDER_CONTACTS section to the
- get_view function.
-
-2000-03-13 bertrand <bertrand@helixcode.com>
-
- * shell/e-shell.c (EShell_register_service):
- test implementation. Show the uri and the type
- of service that has just been registered.
-
- * shell/e-shell-view.c (get_view):
- once we have the bonobo control widget,
- disable the autoactivation and activate
- the control frame.
- (get_view): added a parameter to have
- a reference to the EShellView.
- (get_view): In the case of the mail component
- use the Evolution_ServiceRepository to
- give the component a reference to the
- Shell server.
-
-2000-03-12 bertrand <bertrand@helixcode.com>
-
- * shell/e-shell-view.c (get_view): name change
-
-
- * shell/e-folder.c (e_folder_get_folder_type): added the
- get_e_folder_type function.
-
- * shell/evolution-service-repository.c:
- (evolution_service_repository_new): creates an
- Evolution_ServiceRepository object.
- (create_evolution_service_repository):
- create the corresponding servant.
- (evolution_service_repository_construct): set
- the closure as well as the virtual functions.
-
-2000-03-12 bertrand <bertrand@helixcode.com>
-
- * shell/evolution-service-repository.c:
- * shell/evolution-service-repository.h:
- Implementation of the service repository interface
- as a bonobo object.
-
- * shell/evolution-service-repository.idl:
- new file. Contains the definition for the service
- repository interface.
-
- * shell/Shell.idl: move the shell related stuff
- here
-
-2000-03-12 bertrand <bertrand@helixcode.com>
-
- * shell/e-folder.h: add a field refering to a
- service associated to the efolder. In the case of
- distant folders, it is generally a server.
-
- * shell/e-service.c: New class. Models a service.
- A service is an object with an URI and a root folder.
- It genreally reporesents a distant folder.
- A service is generally a ressource shared amongst
- several folders.
- * shell/e-service.h:
-
-2000-03-07 bertrand <bertrand@helixcode.com>
-
- * shell/e-shell-shortcut.c (shortcut_bar_item_selected):
- removed a test that prevented the standard menu
- to be shown.
-
-2000-03-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * shell/Makefile.am (INCLUDES): use `top_srcdir' instead of
- `srcdir'. Also, add `$(top_srcdir)'. And put the srcdir includes
- before everything else.
- (evolution_LDADD): `libeutil.la', not `libeutil.a'.
-
-2000-02-22 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * shell/Makefile.am (evolution_LDADD):
- add libetext.a.
-
-2000-02-08 Iain Holmes <ih@csd.abdn.ac.uk>
-
- * shell/Makefile.am: Changed the order of the compilation, so the CORBA
- stuff was generated before it was needed.
-
-2000-01-15 Miguel de Icaza <miguel@gnu.org>
-
- * shell/e-shell.c: Construct the default folders
-
- * shell/e-shell-view.c (e_shell_view_new): Setup the main GnomeApp
- application, load the shortcut, internal api.
-
- * shell/e-folder.c (e_folder_get_type_name): Return description
- here; Change of policy; We now know about all of the possible
- types that can be displayed on Evolution.
-
-2000-01-15 Miguel de Icaza <miguel@gnu.org>
-
- * shell/e-folder.c: Renamed signal.
-
- * widgets/shortcut-bar/e-shortcut-bar.c (e_shortcut_bar_add_item):
- Use e_bar_set_item_data.
-
- Drop item_url; Require image argument; Require user data
- argument.
-
-2000-01-05 Miguel de Icaza <miguel@gnu.org>
-
- * shell/Makefile.am: New file.
-
diff --git a/shell/Evolution-Session.idl b/shell/Evolution-Session.idl
deleted file mode 100644
index 855f1c03ea..0000000000
--- a/shell/Evolution-Session.idl
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Interface for saving configuration information.
- *
- * Authors:
- * Ettore Perazzoli <ettore@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <Bonobo.h>
-
-module Evolution {
-
- interface Session : Bonobo::Unknown {
- exception Failed {};
-
- /**
- * save_configuration:
- * @prefix: A configuration path prefix.
- *
- * Save the current configuration at the specified @prefix.
- * The component can use any path starting by @prefix for its
- * keys.
- */
- void save_configuration (in string prefix)
- raises (Failed);
-
- /**
- * load_configuration:
- * @prefix: A configuration path prefix.
- *
- * Load the saved configuration at the specified @prefix.
- */
- void load_configuration (in string prefix)
- raises (Failed);
- };
-
-};
diff --git a/shell/Evolution-Shell.idl b/shell/Evolution-Shell.idl
deleted file mode 100644
index bda5732537..0000000000
--- a/shell/Evolution-Shell.idl
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Interface for the Evolution shell.
- *
- * Authors:
- * Ettore Perazzoli <ettore@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <Bonobo.idl>
-
-module Evolution {
- interface ShellComponent;
-
- interface FolderSelectionListener;
-
- interface Shell : Bonobo::Unknown {
- exception NotFound {};
- exception Busy {};
-
- /**
- * get_component_for_type:
- * @type: name of a valid folder type
- *
- * Get the shell component associated with a specific folder type.
- *
- * Return value: the Evolution::ShellComponent interface for the component that
- * handles @type.
- */
- ShellComponent get_component_for_type (in string type)
- raises (NotFound);
-
- typedef sequence<string> FolderTypeList;
-
- /**
- * user_select_folder:
- * @listener: a listener interface to report the answer of the user.
- * @title: title for the folder selector dialog
- * @default_folder: physical or `evolution:' URI for the folder that must be
- * selected by default, when the dialog is popped up
- * @possible_types: list of the names of the types of folders that are allowed
- *
- * Pop up a folder selection dialog from which the user can select a folder.
- * Initially, the @default_folder is selected. The user can also create a new
- * folder by using the "New..." button. The dialog only lets the user choose
- * a folder whose type is listed in @possible_types.
- */
- void user_select_folder (in FolderSelectionListener listener,
- in string title,
- in string default_folder,
- in FolderTypeList possible_types)
- raises (Busy);
- };
-
- interface FolderSelectionListener {
- void selected (in string uri, in string physical_uri);
- void cancel ();
- };
-};
diff --git a/shell/Evolution-ShellComponent.idl b/shell/Evolution-ShellComponent.idl
deleted file mode 100644
index f907cca72b..0000000000
--- a/shell/Evolution-ShellComponent.idl
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Interface for the Evolution components.
- *
- * Authors:
- * Ettore Perazzoli <ettore@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <Bonobo.h>
-
-module Evolution {
- interface Shell;
-
- struct FolderType {
- string name;
- string icon_name;
- };
-
- typedef sequence<FolderType> FolderTypeList;
-
- interface ShellComponentListener;
-
- interface ShellComponent : Bonobo::Unknown {
- readonly attribute FolderTypeList supported_types;
-
- /* FIXME: Can we use an attribute here? */
- exception AlreadyOwned {};
-
- void set_owner (in Shell shell, in string evolution_homedir)
- raises (AlreadyOwned);
-
- exception NotOwned {};
-
- void unset_owner ()
- raises (NotOwned);
-
- /* FIXME: We might want more exceptions here. */
- exception NotFound {};
- exception UnsupportedType {};
- exception InternalError {};
-
- Bonobo::Control create_view (in string physical_uri,
- in string type)
- raises (NotFound, UnsupportedType, InternalError);
-
- exception Busy {};
-
- void async_create_folder (in ShellComponentListener listener,
- in string physical_uri,
- in string type)
- raises (Busy);
- void async_remove_folder (in ShellComponentListener listener,
- in string physical_uri)
- raises (Busy);
-
- void populate_folder_context_menu (in Bonobo::UIHandler uih,
- in string physical_uri,
- in string type);
- };
-
- interface ShellComponentListener {
- enum Result {
- OK,
- UNSUPPORTED_OPERATION,
- UNSUPPORTED_TYPE,
- EXISTS,
- INVALID_URI,
- PERMISSION_DENIED,
- HAS_SUBFOLDERS,
- NO_SPACE
- };
-
- void report_result (in Result result);
- };
-};
diff --git a/shell/Evolution-ShellView.idl b/shell/Evolution-ShellView.idl
deleted file mode 100644
index f0931dccdd..0000000000
--- a/shell/Evolution-ShellView.idl
+++ /dev/null
@@ -1,18 +0,0 @@
-/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Interface for the Evolution shell views.
- *
- * Authors:
- * Ettore Perazzoli <ettore@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <Bonobo.idl>
-
-module Evolution {
- interface ShellView : Bonobo::Unknown {
- void set_message (in string message, in boolean busy);
- void unset_message ();
- };
-};
diff --git a/shell/Evolution-Storage.idl b/shell/Evolution-Storage.idl
deleted file mode 100644
index 4e35e859bf..0000000000
--- a/shell/Evolution-Storage.idl
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Storage interface for the Evolution shell.
- *
- * Authors:
- * Ettore Perazzoli <ettore@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <Bonobo.h>
-
-module Evolution {
- struct Folder {
- string type;
- string description;
- string name;
- string physical_uri;
- };
-
- interface Storage;
- interface StorageListener;
-
- interface Storage : Bonobo::Unknown {
- attribute string name;
- };
-
- interface StorageListener {
- exception Exists {};
- exception NotFound {};
-
- void destroyed ();
-
- void new_folder (in string path, in Folder folder)
- raises (Exists);
-
- void removed_folder (in string path)
- raises (NotFound);
- };
-
- interface StorageRegistry : Bonobo::Unknown {
- exception Exists {};
- exception NotFound {};
-
- StorageListener register_storage (in Storage storage, in string name)
- raises (Exists);
-
- void unregister_storage (in string name)
- raises (NotFound);
- };
-};
diff --git a/shell/Evolution.idl b/shell/Evolution.idl
deleted file mode 100644
index 2463d23b10..0000000000
--- a/shell/Evolution.idl
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * CORBA interface for the Evolution shell.
- *
- * Authors:
- * Ettore Perazzoli <ettore@helixcode.com>
- *
- * Copyright (C) 2000 Helix Code, Inc.
- */
-
-#include <Bonobo.idl>
-
-#include <Evolution-Session.idl>
-#include <Evolution-Shell.idl>
-#include <Evolution-ShellComponent.idl>
-#include <Evolution-ShellView.idl>
-#include <Evolution-Storage.idl>
diff --git a/shell/Makefile.am b/shell/Makefile.am
deleted file mode 100644
index 0b2457a464..0000000000
--- a/shell/Makefile.am
+++ /dev/null
@@ -1,133 +0,0 @@
-SUBDIRS = glade
-
-INCLUDES = \
- -I$(top_srcdir)/widgets \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_srcdir) \
- $(BONOBO_GNOME_CFLAGS) \
- -DEVOLUTION_IMAGES=\""$(datadir)/images/evolution"\" \
- -DEVOLUTION_VERSION=\""$(VERSION)"\" \
- -DEVOLUTION_LOCALEDIR=\""$(datadir)/locale"\" \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_GLADEDIR=\"$(datadir)/evolution/glade\" \
- -DG_LOG_DOMAIN=\"evolution-shell\"
-
-EXTRA_DIST = $(IDLS)
-
-CLEANFILES = $(IDL_GENERATED)
-
-# CORBA stuff
-
-IDLS = \
- Evolution.idl \
- Evolution-Session.idl \
- Evolution-Shell.idl \
- Evolution-ShellComponent.idl \
- Evolution-ShellView.idl \
- Evolution-Storage.idl
-
-IDL_GENERATED = \
- Evolution.h \
- Evolution-common.c \
- Evolution-skels.c \
- Evolution-stubs.c
-
-Evolution-impl.o: Evolution.h
-
-$(IDL_GENERATED): $(IDLS)
- $(ORBIT_IDL) -I$(datadir)/idl `$(GNOME_CONFIG) --cflags idl` \
- -I$(srcdir) $(srcdir)/Evolution.idl
-
-# Shell library
-
-noinst_LIBRARIES = \
- libeshell.a
-
-libeshell_a_SOURCES = \
- $(IDL_GENERATED) \
- evolution-session.c \
- evolution-session.h \
- evolution-shell-client.c \
- evolution-shell-client.h \
- evolution-shell-component.c \
- evolution-shell-component.h \
- evolution-shell-component-client.c \
- evolution-shell-component-client.h \
- evolution-shell-view.c \
- evolution-shell-view.h \
- evolution-storage.c \
- evolution-storage.h
-
-# Evolution executable
-
-bin_PROGRAMS = evolution
-
-evolution_SOURCES = \
- e-component-registry.c \
- e-component-registry.h \
- e-corba-storage-registry.c \
- e-corba-storage-registry.h \
- e-corba-storage.c \
- e-corba-storage.h \
- e-folder-type-registry.c \
- e-folder-type-registry.h \
- e-folder.c \
- e-folder.h \
- e-local-folder.c \
- e-local-folder.h \
- e-local-storage.c \
- e-local-storage.h \
- e-setup.c \
- e-setup.h \
- e-shell-constants.h \
- e-shell-folder-creation-dialog.c \
- e-shell-folder-creation-dialog.h \
- e-shell-folder-selection-dialog.c \
- e-shell-folder-selection-dialog.h \
- e-shell-folder-title-bar.c \
- e-shell-folder-title-bar.h \
- e-shell-utils.c \
- e-shell-utils.h \
- e-shell-view-menu.c \
- e-shell-view-menu.h \
- e-shell-view.c \
- e-shell-view.h \
- e-shell.c \
- e-shell.h \
- e-shortcuts-view.c \
- e-shortcuts-view.h \
- e-shortcuts.c \
- e-shortcuts.h \
- e-storage-set-view.c \
- e-storage-set-view.h \
- e-storage-set.c \
- e-storage-set.h \
- e-storage.c \
- e-storage.h \
- main.c
-
-evolution_LDADD = \
- libeshell.a \
- $(top_builddir)/widgets/shortcut-bar/libshortcut-bar.a \
- $(top_builddir)/widgets/e-paned/libepaned.a \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(UNICODE_LIBS) \
- $(BONOBO_GNOME_LIBS)
-
-# Purify support
-
-if ENABLE_PURIFY
-
-PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-
-all-local: evolution.pure
-
-evolution.pure: evolution
- @rm -f evolution.pure
- $(PLINK) $(evolution_LDFLAGS) $(evolution_OBJECTS) $(evolution_LDADD) $(LIBS)
-
-endif
-
-
diff --git a/shell/e-component-registry.c b/shell/e-component-registry.c
deleted file mode 100644
index 411fe93d42..0000000000
--- a/shell/e-component-registry.c
+++ /dev/null
@@ -1,374 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-component-registry.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkobject.h>
-#include <gtk/gtktypeutils.h>
-#include <bonobo.h>
-
-#include "e-util/e-util.h"
-#include "e-shell-utils.h"
-
-#include "Evolution.h"
-
-#include "evolution-shell-component-client.h"
-
-#include "e-component-registry.h"
-
-
-#define PARENT_TYPE GTK_TYPE_OBJECT
-static GtkObjectClass *parent_class = NULL;
-
-typedef struct _Component Component;
-
-struct _Component {
- char *id;
-
- EvolutionShellComponentClient *client;
-
- /* Names of the folder types we support (normal ASCII strings). */
- GList *folder_type_names;
-};
-
-struct _EComponentRegistryPrivate {
- EShell *shell;
-
- GHashTable *component_id_to_component;
-};
-
-
-/* Component information handling. */
-
-static Component *
-component_new (const char *id,
- EvolutionShellComponentClient *client)
-{
- Component *new;
-
- bonobo_object_ref (BONOBO_OBJECT (client));
-
- new = g_new (Component, 1);
- new->id = g_strdup (id);
- new->folder_type_names = NULL;
- new->client = client;
-
- return new;
-}
-
-static void
-component_free (Component *component)
-{
- Evolution_ShellComponent corba_shell_component;
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- corba_shell_component = bonobo_object_corba_objref (BONOBO_OBJECT (component->client));
- Evolution_ShellComponent_unset_owner (corba_shell_component, &ev);
- if (ev._major != CORBA_NO_EXCEPTION)
- g_warning ("Cannot unregister component -- %s", component->id);
- else
- g_print ("Component unregistered successfully -- %s\n", component->id);
- CORBA_exception_free (&ev);
-
- g_free (component->id);
-
- bonobo_object_unref (BONOBO_OBJECT (component->client));
-
- e_free_string_list (component->folder_type_names);
-
- g_free (component);
-}
-
-static gboolean
-register_type (EComponentRegistry *component_registry,
- const char *name,
- const char *icon_name,
- Component *handler)
-{
- EComponentRegistryPrivate *priv;
- EFolderTypeRegistry *folder_type_registry;
-
- priv = component_registry->priv;
-
- folder_type_registry = e_shell_get_folder_type_registry (priv->shell);
- g_assert (folder_type_registry != NULL);
-
- if (! e_folder_type_registry_register_type (folder_type_registry, name, icon_name)) {
- g_warning ("Trying to register duplicate folder type -- %s", name);
- return FALSE;
- }
-
- e_folder_type_registry_set_handler_for_type (folder_type_registry, name, handler->client);
-
- return TRUE;
-}
-
-static gboolean
-register_component (EComponentRegistry *component_registry,
- const char *id)
-{
- EComponentRegistryPrivate *priv;
- Evolution_ShellComponent component_corba_interface;
- Evolution_Shell shell_corba_interface;
- Evolution_FolderTypeList *supported_types;
- Component *component;
- EvolutionShellComponentClient *client;
- CORBA_Environment ev;
- CORBA_unsigned_long i;
- const char *local_directory;
-
- priv = component_registry->priv;
-
- if (g_hash_table_lookup (priv->component_id_to_component, id) != NULL) {
- g_warning ("Trying to register component twice -- %s", id);
- return FALSE;
- }
-
- client = evolution_shell_component_client_new (id);
- if (client == NULL)
- return FALSE;
-
- CORBA_exception_init (&ev);
-
- /* FIXME we could use the EvolutionShellComponentClient API here instead, but for
- now we don't care. */
-
- component_corba_interface = bonobo_object_corba_objref (BONOBO_OBJECT (client));
- shell_corba_interface = bonobo_object_corba_objref (BONOBO_OBJECT (priv->shell));
- local_directory = e_shell_get_local_directory (priv->shell);
-
- Evolution_ShellComponent_set_owner (component_corba_interface, shell_corba_interface, local_directory, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- bonobo_object_unref (BONOBO_OBJECT (client));
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- supported_types = Evolution_ShellComponent__get_supported_types (component_corba_interface, &ev);
- if (ev._major != CORBA_NO_EXCEPTION || supported_types->_length == 0) {
- bonobo_object_unref (BONOBO_OBJECT (client));
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
-
- component = component_new (id, client);
- g_hash_table_insert (priv->component_id_to_component, component->id, component);
-
- for (i = 0; i < supported_types->_length; i++) {
- const Evolution_FolderType *type;
-
- type = supported_types->_buffer + i;
-
- if (! register_type (component_registry, type->name, type->icon_name, component)) {
- g_warning ("Cannot register type `%s' for component %s",
- type->name, component->id);
- } else {
- g_print ("Registered type for component -- (%s) %s\n",
- type->name, component->id);
- }
- }
-
- CORBA_free (supported_types);
-
- return TRUE;
-}
-
-
-/* GtkObject methods. */
-
-static void
-component_id_foreach_free (void *key,
- void *value,
- void *user_data)
-{
- Component *component;
-
- component = (Component *) value;
- component_free (component);
-}
-
-static void
-destroy (GtkObject *object)
-{
- EComponentRegistry *component_registry;
- EComponentRegistryPrivate *priv;
-
- component_registry = E_COMPONENT_REGISTRY (object);
- priv = component_registry->priv;
-
- bonobo_object_unref (BONOBO_OBJECT (priv->shell));
-
- g_hash_table_foreach (priv->component_id_to_component, component_id_foreach_free, NULL);
- g_hash_table_destroy (priv->component_id_to_component);
-
- g_free (priv);
-}
-
-
-static void
-class_init (EComponentRegistryClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-}
-
-
-static void
-init (EComponentRegistry *component_registry)
-{
- EComponentRegistryPrivate *priv;
-
- priv = g_new (EComponentRegistryPrivate, 1);
- priv->shell = NULL;
- priv->component_id_to_component = g_hash_table_new (g_str_hash, g_str_equal);
-
- component_registry->priv = priv;
-}
-
-
-void
-e_component_registry_construct (EComponentRegistry *component_registry,
- EShell *shell)
-{
- EComponentRegistryPrivate *priv;
-
- g_return_if_fail (component_registry != NULL);
- g_return_if_fail (E_IS_COMPONENT_REGISTRY (component_registry));
- g_return_if_fail (shell != NULL);
- g_return_if_fail (E_IS_SHELL (shell));
-
- priv = component_registry->priv;
-
- bonobo_object_ref (BONOBO_OBJECT (shell));
- priv->shell = shell;
-}
-
-EComponentRegistry *
-e_component_registry_new (EShell *shell)
-{
- EComponentRegistry *component_registry;
-
- g_return_val_if_fail (shell != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
- component_registry = gtk_type_new (e_component_registry_get_type ());
- e_component_registry_construct (component_registry, shell);
-
- return component_registry;
-}
-
-
-gboolean
-e_component_registry_register_component (EComponentRegistry *component_registry,
- const char *id)
-{
- g_return_val_if_fail (component_registry != NULL, FALSE);
- g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (component_registry), FALSE);
- g_return_val_if_fail (id != NULL, FALSE);
-
- return register_component (component_registry, id);
-}
-
-
-static void
-compose_id_list_foreach (void *key,
- void *value,
- void *data)
-{
- GList **listp;
- const char *id;
-
- listp = (GList **) data;
- id = (const char *) key;
-
- *listp = g_list_prepend (*listp, g_strdup (id));
-}
-
-/**
- * e_component_registry_get_id_list:
- * @component_registry:
- *
- * Get the list of components registered.
- *
- * Return value: A GList of strings containining the IDs for all the registered
- * components. The list must be freed by the caller when not used anymore.
- **/
-GList *
-e_component_registry_get_id_list (EComponentRegistry *component_registry)
-{
- EComponentRegistryPrivate *priv;
- GList *list;
-
- g_return_val_if_fail (component_registry != NULL, NULL);
- g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (component_registry), NULL);
-
- priv = component_registry->priv;
- list = NULL;
-
- g_hash_table_foreach (priv->component_id_to_component, compose_id_list_foreach, &list);
-
- return list;
-}
-
-/**
- * e_component_registry_get_component_by_id:
- * @component_registry:
- * @id: The component's OAF ID
- *
- * Get the registered component client for the specified ID. If that component
- * is not registered, return NULL.
- *
- * Return value: A pointer to the ShellComponentClient for that component.
- **/
-EvolutionShellComponentClient *
-e_component_registry_get_component_by_id (EComponentRegistry *component_registry,
- const char *id)
-{
- EComponentRegistryPrivate *priv;
- const Component *component;
-
- g_return_val_if_fail (component_registry != NULL, NULL);
- g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (component_registry), NULL);
- g_return_val_if_fail (id != NULL, NULL);
-
- priv = component_registry->priv;
-
- component = g_hash_table_lookup (priv->component_id_to_component, id);
- if (component == NULL)
- return NULL;
-
- return component->client;
-}
-
-
-E_MAKE_TYPE (e_component_registry, "EComponentRegistry", EComponentRegistry,
- class_init, init, PARENT_TYPE)
diff --git a/shell/e-component-registry.h b/shell/e-component-registry.h
deleted file mode 100644
index 0a34413844..0000000000
--- a/shell/e-component-registry.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-component-registry.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __E_COMPONENT_REGISTRY_H__
-#define __E_COMPONENT_REGISTRY_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkobject.h>
-
-#include "e-shell.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_COMPONENT_REGISTRY (e_component_registry_get_type ())
-#define E_COMPONENT_REGISTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_COMPONENT_REGISTRY, EComponentRegistry))
-#define E_COMPONENT_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_COMPONENT_REGISTRY, EComponentRegistryClass))
-#define E_IS_COMPONENT_REGISTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_COMPONENT_REGISTRY))
-#define E_IS_COMPONENT_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_COMPONENT_REGISTRY))
-
-
-typedef struct _EComponentRegistry EComponentRegistry;
-typedef struct _EComponentRegistryPrivate EComponentRegistryPrivate;
-typedef struct _EComponentRegistryClass EComponentRegistryClass;
-
-struct _EComponentRegistry {
- GtkObject parent;
-
- EComponentRegistryPrivate *priv;
-};
-
-struct _EComponentRegistryClass {
- GtkObjectClass parent_class;
-};
-
-
-GtkType e_component_registry_get_type (void);
-void e_component_registry_construct (EComponentRegistry *component_registry,
- EShell *shell);
-EComponentRegistry *e_component_registry_new (EShell *shell);
-
-gboolean e_component_registry_register_component (EComponentRegistry *component_registry,
- const char *id);
-
-GList *e_component_registry_get_id_list (EComponentRegistry *component_registry);
-
-EvolutionShellComponentClient *e_component_registry_get_component_by_id (EComponentRegistry *component_registry,
- const char *id);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_COMPONENT_REGISTRY_H__ */
diff --git a/shell/e-corba-storage-registry.c b/shell/e-corba-storage-registry.c
deleted file mode 100644
index c3b259bb71..0000000000
--- a/shell/e-corba-storage-registry.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-corba-storage-registry.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-util/e-util.h"
-
-#include "e-corba-storage.h"
-
-#include "e-corba-storage-registry.h"
-
-
-#define PARENT_TYPE BONOBO_OBJECT_TYPE
-static BonoboObjectClass *parent_class = NULL;
-
-struct _ECorbaStorageRegistryPrivate {
- EStorageSet *storage_set;
-};
-
-
-/* CORBA interface implementation. */
-
-static POA_Evolution_StorageRegistry__vepv storage_registry_vepv;
-
-static POA_Evolution_StorageRegistry *
-create_servant (void)
-{
- POA_Evolution_StorageRegistry *servant;
- CORBA_Environment ev;
-
- servant = (POA_Evolution_StorageRegistry *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &storage_registry_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_StorageRegistry__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- return servant;
-}
-
-static Evolution_StorageListener
-impl_StorageRegistry_register_storage (PortableServer_Servant servant,
- const Evolution_Storage storage_interface,
- const CORBA_char *name,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- ECorbaStorageRegistry *storage_registry;
- ECorbaStorageRegistryPrivate *priv;
- EStorage *storage;
- Evolution_StorageListener listener_interface;
-
- g_print ("Shell: Registering storage -- %s\n", name);
-
- bonobo_object = bonobo_object_from_servant (servant);
- storage_registry = E_CORBA_STORAGE_REGISTRY (bonobo_object);
- priv = storage_registry->priv;
-
- storage = e_corba_storage_new (storage_interface, name);
-
- if (! e_storage_set_add_storage (priv->storage_set, storage)) {
- CORBA_exception_set (ev,
- CORBA_USER_EXCEPTION,
- ex_Evolution_StorageRegistry_Exists,
- NULL);
- return CORBA_OBJECT_NIL;
- }
-
- gtk_object_unref (GTK_OBJECT (storage));
-
- listener_interface = CORBA_Object_duplicate (e_corba_storage_get_StorageListener
- (E_CORBA_STORAGE (storage)), ev);
-
- return listener_interface;
-}
-
-static void
-impl_StorageRegistry_unregister_storage (PortableServer_Servant servant,
- const CORBA_char *name,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- ECorbaStorageRegistry *storage_registry;
- ECorbaStorageRegistryPrivate *priv;
- EStorage *storage;
-
- bonobo_object = bonobo_object_from_servant (servant);
- storage_registry = E_CORBA_STORAGE_REGISTRY (bonobo_object);
- priv = storage_registry->priv;
-
- storage = e_storage_set_get_storage (priv->storage_set, name);
- if (storage == NULL) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_StorageRegistry_NotFound,
- NULL);
- return;
- }
-
- /* FIXME: Yucky to get the storage by name and then remove it. */
- /* FIXME: Check failure. */
- e_storage_set_remove_storage (priv->storage_set, storage);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- ECorbaStorageRegistry *corba_storage_registry;
- ECorbaStorageRegistryPrivate *priv;
-
- corba_storage_registry = E_CORBA_STORAGE_REGISTRY (object);
- priv = corba_storage_registry->priv;
-
- if (priv->storage_set != NULL)
- gtk_object_unref (GTK_OBJECT (priv->storage_set));
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* Initialization. */
-
-static void
-corba_class_init (void)
-{
- POA_Evolution_StorageRegistry__vepv *vepv;
- POA_Evolution_StorageRegistry__epv *epv;
- PortableServer_ServantBase__epv *base_epv;
-
- base_epv = g_new0 (PortableServer_ServantBase__epv, 1);
- base_epv->_private = NULL;
- base_epv->finalize = NULL;
- base_epv->default_POA = NULL;
-
- epv = g_new0 (POA_Evolution_StorageRegistry__epv, 1);
- epv->register_storage = impl_StorageRegistry_register_storage;
- epv->unregister_storage = impl_StorageRegistry_unregister_storage;
-
- vepv = &storage_registry_vepv;
- vepv->_base_epv = base_epv;
- vepv->Bonobo_Unknown_epv = bonobo_object_get_epv ();
- vepv->Evolution_StorageRegistry_epv = epv;
-}
-
-static void
-class_init (ECorbaStorageRegistryClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- corba_class_init ();
-}
-
-static void
-init (ECorbaStorageRegistry *corba_storage_registry)
-{
- ECorbaStorageRegistryPrivate *priv;
-
- priv = g_new (ECorbaStorageRegistryPrivate, 1);
- priv->storage_set = NULL;
-
- corba_storage_registry->priv = priv;
-}
-
-
-void
-e_corba_storage_registry_construct (ECorbaStorageRegistry *corba_storage_registry,
- Evolution_StorageRegistry corba_object,
- EStorageSet *storage_set)
-{
- ECorbaStorageRegistryPrivate *priv;
-
- g_return_if_fail (corba_storage_registry != NULL);
- g_return_if_fail (E_IS_CORBA_STORAGE_REGISTRY (corba_storage_registry));
- g_return_if_fail (corba_object != CORBA_OBJECT_NIL);
-
- bonobo_object_construct (BONOBO_OBJECT (corba_storage_registry), corba_object);
-
- priv = corba_storage_registry->priv;
-
- gtk_object_ref (GTK_OBJECT (storage_set));
- priv->storage_set = storage_set;
-}
-
-ECorbaStorageRegistry *
-e_corba_storage_registry_new (EStorageSet *storage_set)
-{
- ECorbaStorageRegistry *corba_storage_registry;
- POA_Evolution_StorageRegistry *servant;
- Evolution_StorageRegistry corba_object;
-
- g_return_val_if_fail (storage_set != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL);
-
- servant = create_servant ();
- if (servant == NULL)
- return NULL;
-
- corba_storage_registry = gtk_type_new (e_corba_storage_registry_get_type ());
-
- corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (corba_storage_registry),
- servant);
-
- e_corba_storage_registry_construct (corba_storage_registry, corba_object, storage_set);
-
- return corba_storage_registry;
-}
-
-
-E_MAKE_TYPE (e_corba_storage_registry, "ECorbaStorageRegistry", ECorbaStorageRegistry, class_init, init, PARENT_TYPE)
diff --git a/shell/e-corba-storage-registry.h b/shell/e-corba-storage-registry.h
deleted file mode 100644
index baf689c551..0000000000
--- a/shell/e-corba-storage-registry.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-corba-storage-registry.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __E_CORBA_STORAGE_REGISTRY_H__
-#define __E_CORBA_STORAGE_REGISTRY_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo/bonobo-object.h>
-
-#include "Evolution.h"
-#include "e-storage-set.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_CORBA_STORAGE_REGISTRY (e_corba_storage_registry_get_type ())
-#define E_CORBA_STORAGE_REGISTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CORBA_STORAGE_REGISTRY, ECorbaStorageRegistry))
-#define E_CORBA_STORAGE_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CORBA_STORAGE_REGISTRY, ECorbaStorageRegistryClass))
-#define E_IS_CORBA_STORAGE_REGISTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CORBA_STORAGE_REGISTRY))
-#define E_IS_CORBA_STORAGE_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_CORBA_STORAGE_REGISTRY))
-
-
-typedef struct _ECorbaStorageRegistry ECorbaStorageRegistry;
-typedef struct _ECorbaStorageRegistryPrivate ECorbaStorageRegistryPrivate;
-typedef struct _ECorbaStorageRegistryClass ECorbaStorageRegistryClass;
-
-struct _ECorbaStorageRegistry {
- BonoboObject parent;
-
- ECorbaStorageRegistryPrivate *priv;
-};
-
-struct _ECorbaStorageRegistryClass {
- BonoboObjectClass parent_class;
-};
-
-
-GtkType e_corba_storage_registry_get_type (void);
-void e_corba_storage_registry_construct (ECorbaStorageRegistry *corba_storage_registry,
- Evolution_StorageRegistry corba_object,
- EStorageSet *storage_set);
-ECorbaStorageRegistry *e_corba_storage_registry_new (EStorageSet *storage_set);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_CORBA_STORAGE_REGISTRY_H__ */
diff --git a/shell/e-corba-storage.c b/shell/e-corba-storage.c
deleted file mode 100644
index b4320a4c52..0000000000
--- a/shell/e-corba-storage.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-corba-storage.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo.h>
-
-#include "e-util/e-util.h"
-
-#include "Evolution.h"
-
-#include "e-corba-storage.h"
-
-
-#define PARENT_TYPE E_TYPE_STORAGE
-static EStorageClass *parent_class = NULL;
-
-typedef struct _StorageListenerServant StorageListenerServant;
-
-struct _ECorbaStoragePrivate {
- char *name;
-
- Evolution_Storage storage_interface;
-
- /* The Evolution::StorageListener interface we expose. */
-
- Evolution_StorageListener storage_listener_interface;
- StorageListenerServant *storage_listener_servant;
-};
-
-
-/* Implementation of the CORBA Evolution::StorageListener interface. */
-
-static POA_Evolution_StorageListener__vepv storage_listener_vepv;
-
-struct _StorageListenerServant {
- POA_Evolution_StorageListener servant;
- EStorage *storage;
-};
-
-static StorageListenerServant *
-storage_listener_servant_new (ECorbaStorage *corba_storage)
-{
- StorageListenerServant *servant;
-
- servant = g_new0 (StorageListenerServant, 1);
-
- servant->servant.vepv = &storage_listener_vepv;
-
- gtk_object_ref (GTK_OBJECT (corba_storage));
- servant->storage = E_STORAGE (corba_storage);
-
- return servant;
-}
-
-static void
-storage_listener_servant_free (StorageListenerServant *servant)
-{
- gtk_object_unref (GTK_OBJECT (servant->storage));
-
- g_free (servant);
-}
-
-#if 0
-static void
-impl_StorageListener_destroy (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- /* FIXME */
-}
-#endif
-
-static void
-impl_StorageListener_new_folder (PortableServer_Servant servant,
- const CORBA_char *path,
- const Evolution_Folder *folder,
- CORBA_Environment *ev)
-{
- StorageListenerServant *storage_listener_servant;
- EStorage *storage;
- EFolder *e_folder;
-
- storage_listener_servant = (StorageListenerServant *) servant;
- storage = storage_listener_servant->storage;
-
- e_folder = e_folder_new (folder->name,
- folder->type,
- folder->description);
-
- e_folder_set_physical_uri (e_folder, folder->physical_uri);
-
- if (! e_storage_new_folder (storage, path, e_folder)) {
- g_print ("Cannot register folder -- %s %s\n", path, folder->name);
- CORBA_exception_set (ev,
- CORBA_USER_EXCEPTION,
- ex_Evolution_StorageListener_Exists,
- NULL);
- gtk_object_unref (GTK_OBJECT (e_folder));
- }
-
- g_print ("Folder registered successfully -- %s %s\n", path, folder->name);
-}
-
-static void
-impl_StorageListener_removed_folder (PortableServer_Servant servant,
- const CORBA_char *path,
- CORBA_Environment *ev)
-{
- StorageListenerServant *storage_listener_servant;
- EStorage *storage;
-
- storage_listener_servant = (StorageListenerServant *) servant;
- storage = storage_listener_servant->storage;
-
- if (! e_storage_removed_folder (storage, path))
- CORBA_exception_set (ev,
- CORBA_USER_EXCEPTION,
- ex_Evolution_StorageListener_NotFound,
- NULL);
-}
-
-
-static gboolean
-setup_storage_listener (ECorbaStorage *corba_storage)
-{
- StorageListenerServant *servant;
- ECorbaStoragePrivate *priv;
- Evolution_StorageListener storage_listener_interface;
- CORBA_Environment ev;
-
- priv = corba_storage->priv;
-
- servant = storage_listener_servant_new (corba_storage);
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_StorageListener__init (servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION)
- goto error;
-
- CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), servant, &ev));
- if (ev._major != CORBA_NO_EXCEPTION)
- goto error;
-
- storage_listener_interface = PortableServer_POA_servant_to_reference (bonobo_poa (),
- servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION)
- goto error;
-
- priv->storage_listener_interface = storage_listener_interface;
- priv->storage_listener_servant = servant;
-
- return TRUE;
-
- error:
- storage_listener_servant_free (servant);
- CORBA_exception_free (&ev);
- return FALSE;
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- CORBA_Environment ev;
- ECorbaStorage *corba_storage;
- ECorbaStoragePrivate *priv;
-
- corba_storage = E_CORBA_STORAGE (object);
- priv = corba_storage->priv;
-
- g_free (priv->name);
-
- CORBA_exception_init (&ev);
-
- if (priv->storage_interface != CORBA_OBJECT_NIL) {
- Bonobo_Unknown_unref (priv->storage_interface, &ev);
- CORBA_Object_release (priv->storage_interface, &ev);
- }
-
- if (priv->storage_listener_interface != CORBA_OBJECT_NIL)
- CORBA_Object_release (priv->storage_listener_interface, &ev);
-
- if (priv->storage_listener_servant != NULL) {
- PortableServer_ObjectId *object_id;
-
- object_id = PortableServer_POA_servant_to_id (bonobo_poa (), priv->storage_listener_servant,
- &ev);
- PortableServer_POA_deactivate_object (bonobo_poa (), object_id, &ev);
-
- POA_Evolution_StorageListener__fini (priv->storage_listener_servant, &ev);
- CORBA_free (object_id);
- }
-
- CORBA_exception_free (&ev);
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* EStorage methods. */
-
-static const char *
-get_name (EStorage *storage)
-{
- ECorbaStorage *corba_storage;
- ECorbaStoragePrivate *priv;
-
- corba_storage = E_CORBA_STORAGE (storage);
- priv = corba_storage->priv;
-
- return priv->name;
-}
-
-
-static void
-corba_class_init (void)
-{
- POA_Evolution_StorageListener__vepv *vepv;
- POA_Evolution_StorageListener__epv *epv;
- PortableServer_ServantBase__epv *base_epv;
-
- base_epv = g_new0 (PortableServer_ServantBase__epv, 1);
- base_epv->_private = NULL;
- base_epv->finalize = NULL;
- base_epv->default_POA = NULL;
-
- epv = g_new0 (POA_Evolution_StorageListener__epv, 1);
- epv->new_folder = impl_StorageListener_new_folder;
- epv->removed_folder = impl_StorageListener_removed_folder;
-
- vepv = &storage_listener_vepv;
- vepv->_base_epv = base_epv;
- vepv->Evolution_StorageListener_epv = epv;
-}
-
-static void
-class_init (ECorbaStorageClass *klass)
-{
- GtkObjectClass *object_class;
- EStorageClass *storage_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- storage_class = E_STORAGE_CLASS (klass);
- storage_class->get_name = get_name;
-
- corba_class_init ();
-
- parent_class = gtk_type_class (PARENT_TYPE);
-}
-
-static void
-init (ECorbaStorage *corba_storage)
-{
- ECorbaStoragePrivate *priv;
-
- priv = g_new (ECorbaStoragePrivate, 1);
- priv->name = NULL;
- priv->storage_interface = CORBA_OBJECT_NIL;
-
- corba_storage->priv = priv;
-}
-
-
-/* FIXME: OK to have a boolean construct function? */
-void
-e_corba_storage_construct (ECorbaStorage *corba_storage,
- const Evolution_Storage storage_interface,
- const char *name)
-{
- ECorbaStoragePrivate *priv;
- CORBA_Environment ev;
-
- g_return_if_fail (corba_storage != NULL);
- g_return_if_fail (E_IS_CORBA_STORAGE (corba_storage));
- g_return_if_fail (storage_interface != CORBA_OBJECT_NIL);
- g_return_if_fail (name != NULL);
-
- e_storage_construct (E_STORAGE (corba_storage));
-
- priv = corba_storage->priv;
-
- priv->name = g_strdup (name);
-
- CORBA_exception_init (&ev);
-
- Bonobo_Unknown_ref (storage_interface, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("%s -- Cannot reference Bonobo object", __FUNCTION__);
- } else {
- priv->storage_interface = CORBA_Object_duplicate (storage_interface, &ev);
- }
-
- CORBA_exception_free (&ev);
-
- setup_storage_listener (corba_storage);
-}
-
-EStorage *
-e_corba_storage_new (const Evolution_Storage storage_interface,
- const char *name)
-{
- EStorage *new;
-
- g_return_val_if_fail (storage_interface != CORBA_OBJECT_NIL, NULL);
- g_return_val_if_fail (name != NULL, NULL);
-
- new = gtk_type_new (e_corba_storage_get_type ());
-
- e_corba_storage_construct (E_CORBA_STORAGE (new), storage_interface, name);
-
- return new;
-}
-
-
-const Evolution_StorageListener
-e_corba_storage_get_StorageListener (ECorbaStorage *corba_storage)
-{
- g_return_val_if_fail (corba_storage != NULL, NULL);
- g_return_val_if_fail (E_IS_CORBA_STORAGE (corba_storage), NULL);
-
- return corba_storage->priv->storage_listener_interface;
-}
-
-
-E_MAKE_TYPE (e_corba_storage, "ECorbaStorage", ECorbaStorage, class_init, init, PARENT_TYPE)
diff --git a/shell/e-corba-storage.h b/shell/e-corba-storage.h
deleted file mode 100644
index 99ab23e97e..0000000000
--- a/shell/e-corba-storage.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-corba-storage.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __E_CORBA_STORAGE_H__
-#define __E_CORBA_STORAGE_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-storage.h"
-
-#include "Evolution.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_CORBA_STORAGE (e_corba_storage_get_type ())
-#define E_CORBA_STORAGE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CORBA_STORAGE, ECorbaStorage))
-#define E_CORBA_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CORBA_STORAGE, ECorbaStorageClass))
-#define E_IS_CORBA_STORAGE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CORBA_STORAGE))
-#define E_IS_CORBA_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_CORBA_STORAGE))
-
-
-typedef struct _ECorbaStorage ECorbaStorage;
-typedef struct _ECorbaStoragePrivate ECorbaStoragePrivate;
-typedef struct _ECorbaStorageClass ECorbaStorageClass;
-
-struct _ECorbaStorage {
- EStorage parent;
-
- ECorbaStoragePrivate *priv;
-};
-
-struct _ECorbaStorageClass {
- EStorageClass parent_class;
-};
-
-
-GtkType e_corba_storage_get_type (void);
-void e_corba_storage_construct (ECorbaStorage *corba_storage,
- const Evolution_Storage storage_interface,
- const char *name);
-EStorage *e_corba_storage_new (const Evolution_Storage storage_interface,
- const char *name);
-
-/* FIXME: I don't like this call. */
-const Evolution_StorageListener e_corba_storage_get_StorageListener (ECorbaStorage *corba_storage);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_CORBA_STORAGE_H__ */
diff --git a/shell/e-folder-type-registry.c b/shell/e-folder-type-registry.c
deleted file mode 100644
index 34fa5a0193..0000000000
--- a/shell/e-folder-type-registry.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-folder-type-registry.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <gtk/gtktypeutils.h>
-
-#include "e-util/e-util.h"
-
-#include "e-shell-utils.h"
-
-#include "e-folder-type-registry.h"
-
-
-#define PARENT_TYPE GTK_TYPE_OBJECT
-static GtkObjectClass *parent_class = NULL;
-
-struct _FolderType {
- char *name;
- char *icon_name;
-
- EvolutionShellComponentClient *handler;
-
- /* The icon, standard (48x48) and mini (16x16) versions. */
- GdkPixbuf *icon_pixbuf;
- GdkPixbuf *mini_icon_pixbuf;
-};
-typedef struct _FolderType FolderType;
-
-struct _EFolderTypeRegistryPrivate {
- GHashTable *name_to_type;
-};
-
-
-/* FolderType handling. */
-
-static FolderType *
-folder_type_new (const char *name,
- const char *icon_name)
-{
- FolderType *new;
- char *icon_path;
-
- new = g_new (FolderType, 1);
-
- new->name = g_strdup (name);
- new->icon_name = g_strdup (icon_name);
- new->handler = NULL;
-
- icon_path = e_shell_get_icon_path (icon_name, FALSE);
- if (icon_path == NULL)
- new->icon_pixbuf = NULL;
- else
- new->icon_pixbuf = gdk_pixbuf_new_from_file (icon_path);
-
- g_free (icon_path);
-
- icon_path = e_shell_get_icon_path (icon_name, TRUE);
- if (icon_path != NULL) {
- new->mini_icon_pixbuf = gdk_pixbuf_new_from_file (icon_path);
- } else {
- if (new->icon_pixbuf != NULL)
- new->mini_icon_pixbuf = gdk_pixbuf_ref (new->icon_pixbuf);
- else
- new->mini_icon_pixbuf = NULL;
- }
-
- g_free (icon_path);
-
- return new;
-}
-
-static void
-folder_type_free (FolderType *folder_type)
-{
- g_free (folder_type->name);
- g_free (folder_type->icon_name);
-
- if (folder_type->icon_pixbuf != NULL)
- gdk_pixbuf_unref (folder_type->icon_pixbuf);
- if (folder_type->mini_icon_pixbuf != NULL)
- gdk_pixbuf_unref (folder_type->mini_icon_pixbuf);
-
- if (folder_type->handler != NULL)
- bonobo_object_unref (BONOBO_OBJECT (folder_type->handler));
-
- g_free (folder_type);
-}
-
-static FolderType *
-get_folder_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name)
-{
- EFolderTypeRegistryPrivate *priv;
-
- priv = folder_type_registry->priv;
-
- return g_hash_table_lookup (priv->name_to_type, type_name);
-}
-
-static gboolean
-register_folder_type (EFolderTypeRegistry *folder_type_registry,
- const char *name,
- const char *icon_name)
-{
- EFolderTypeRegistryPrivate *priv;
- FolderType *folder_type;
-
- priv = folder_type_registry->priv;
-
- /* Make sure we don't add the same type twice. */
- if (get_folder_type (folder_type_registry, name) != NULL)
- return FALSE;
-
- folder_type = folder_type_new (name, icon_name);
- g_hash_table_insert (priv->name_to_type, folder_type->name, folder_type);
-
- return TRUE;
-}
-
-static gboolean
-set_handler (EFolderTypeRegistry *folder_type_registry,
- const char *name,
- EvolutionShellComponentClient *handler)
-{
- EFolderTypeRegistryPrivate *priv;
- FolderType *folder_type;
-
- priv = folder_type_registry->priv;
-
- folder_type = get_folder_type (folder_type_registry, name);
- if (folder_type == NULL)
- return FALSE;
- if (folder_type->handler != NULL) {
- g_warning ("Folder type already has a handler -- %s",
- folder_type->name);
- return FALSE;
- }
-
- bonobo_object_ref (BONOBO_OBJECT (handler));
- folder_type->handler = handler;
-
- return TRUE;
-}
-
-
-/* GtkObject methods. */
-
-static void
-hash_forall_free_folder_type (gpointer key,
- gpointer value,
- gpointer data)
-{
- FolderType *folder_type;
-
- folder_type = (FolderType *) value;
- folder_type_free (folder_type);
-}
-
-static void
-destroy (GtkObject *object)
-{
- EFolderTypeRegistry *folder_type_registry;
- EFolderTypeRegistryPrivate *priv;
-
- folder_type_registry = E_FOLDER_TYPE_REGISTRY (object);
- priv = folder_type_registry->priv;
-
- g_hash_table_foreach (priv->name_to_type,
- hash_forall_free_folder_type, NULL);
- g_hash_table_destroy (priv->name_to_type);
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-class_init (EFolderTypeRegistryClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (class);
- object_class->destroy = destroy;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-}
-
-static void
-init (EFolderTypeRegistry *folder_type_registry)
-{
- EFolderTypeRegistryPrivate *priv;
-
- priv = g_new (EFolderTypeRegistryPrivate, 1);
- priv->name_to_type = g_hash_table_new (g_str_hash, g_str_equal);
-
- folder_type_registry->priv = priv;
-}
-
-
-void
-e_folder_type_registry_construct (EFolderTypeRegistry *folder_type_registry)
-{
- g_return_if_fail (folder_type_registry != NULL);
- g_return_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry));
-
- GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (folder_type_registry), GTK_FLOATING);
-}
-
-EFolderTypeRegistry *
-e_folder_type_registry_new (void)
-{
- EFolderTypeRegistry *new;
-
- new = gtk_type_new (e_folder_type_registry_get_type ());
-
- e_folder_type_registry_construct (new);
-
- return new;
-}
-
-
-gboolean
-e_folder_type_registry_register_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name,
- const char *icon_name)
-{
- g_return_val_if_fail (folder_type_registry != NULL, FALSE);
- g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), FALSE);
- g_return_val_if_fail (type_name != NULL, FALSE);
- g_return_val_if_fail (icon_name != NULL, FALSE);
-
- return register_folder_type (folder_type_registry, type_name, icon_name);
-}
-
-gboolean
-e_folder_type_registry_set_handler_for_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name,
- EvolutionShellComponentClient *handler)
-{
- g_return_val_if_fail (folder_type_registry != NULL, FALSE);
- g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), FALSE);
- g_return_val_if_fail (handler != NULL, FALSE);
- g_return_val_if_fail (BONOBO_IS_OBJECT_CLIENT (handler), FALSE);
-
- return set_handler (folder_type_registry, type_name, handler);
-}
-
-
-static void
-get_type_names_hash_forall (void *key,
- void *value,
- void *data)
-{
- GList **type_name_list;
-
- type_name_list = (GList **) data;
-
- *type_name_list = g_list_prepend (*type_name_list, g_strdup ((const char *) key));
-}
-
-GList *
-e_folder_type_registry_get_type_names (EFolderTypeRegistry *folder_type_registry)
-{
- GList *type_name_list;
- EFolderTypeRegistryPrivate *priv;
-
- g_return_val_if_fail (folder_type_registry != NULL, NULL);
- g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
-
- priv = folder_type_registry->priv;
-
- type_name_list = NULL;
- g_hash_table_foreach (priv->name_to_type, get_type_names_hash_forall, &type_name_list);
-
- return type_name_list;
-}
-
-
-const char *
-e_folder_type_registry_get_icon_name_for_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name)
-{
- const FolderType *folder_type;
-
- g_return_val_if_fail (folder_type_registry != NULL, NULL);
- g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
- g_return_val_if_fail (type_name != NULL, NULL);
-
- folder_type = get_folder_type (folder_type_registry, type_name);
- if (folder_type == NULL) {
- g_warning ("%s: Unknown type -- %s", __FUNCTION__, type_name);
- return NULL;
- }
-
- return folder_type->icon_name;
-}
-
-GdkPixbuf *
-e_folder_type_registry_get_icon_for_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name,
- gboolean mini)
-{
- const FolderType *folder_type;
-
- g_return_val_if_fail (folder_type_registry != NULL, NULL);
- g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
- g_return_val_if_fail (type_name != NULL, NULL);
-
- folder_type = get_folder_type (folder_type_registry, type_name);
- if (folder_type == NULL) {
- g_warning ("%s: Unknown type -- %s", __FUNCTION__, type_name);
- return NULL;
- }
-
- if (mini)
- return folder_type->mini_icon_pixbuf;
- else
- return folder_type->icon_pixbuf;
-}
-
-EvolutionShellComponentClient *
-e_folder_type_registry_get_handler_for_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name)
-{
- const FolderType *folder_type;
-
- g_return_val_if_fail (folder_type_registry != NULL, NULL);
- g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
- g_return_val_if_fail (type_name != NULL, NULL);
-
- folder_type = get_folder_type (folder_type_registry, type_name);
- if (folder_type == NULL) {
- g_warning ("%s: Unknown type -- %s", __FUNCTION__, type_name);
- return NULL;
- }
-
- return folder_type->handler;
-}
-
-
-E_MAKE_TYPE (e_folder_type_registry, "EFolderTypeRegistry", EFolderTypeRegistry,
- class_init, init, PARENT_TYPE)
diff --git a/shell/e-folder-type-registry.h b/shell/e-folder-type-registry.h
deleted file mode 100644
index 6d832282aa..0000000000
--- a/shell/e-folder-type-registry.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-folder-type-registry.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_FOLDER_TYPE_REGISTRY_H_
-#define _E_FOLDER_TYPE_REGISTRY_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkobject.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "evolution-shell-component-client.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_FOLDER_TYPE_REGISTRY (e_folder_type_registry_get_type ())
-#define E_FOLDER_TYPE_REGISTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_FOLDER_TYPE_REGISTRY, EFolderTypeRegistry))
-#define E_FOLDER_TYPE_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_FOLDER_TYPE_REGISTRY, EFolderTypeRegistryClass))
-#define E_IS_FOLDER_TYPE_REGISTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_FOLDER_TYPE_REGISTRY))
-#define E_IS_FOLDER_TYPE_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_FOLDER_TYPE_REGISTRY))
-
-
-typedef struct _EFolderTypeRegistry EFolderTypeRegistry;
-typedef struct _EFolderTypeRegistryPrivate EFolderTypeRegistryPrivate;
-typedef struct _EFolderTypeRegistryClass EFolderTypeRegistryClass;
-
-struct _EFolderTypeRegistry {
- GtkObject parent;
-
- EFolderTypeRegistryPrivate *priv;
-};
-
-struct _EFolderTypeRegistryClass {
- GtkObjectClass parent_class;
-};
-
-
-GtkType e_folder_type_registry_get_type (void);
-void e_folder_type_registry_construct (EFolderTypeRegistry *folder_type_registry);
-EFolderTypeRegistry *e_folder_type_registry_new (void);
-
-gboolean e_folder_type_registry_register_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name,
- const char *icon_name);
-gboolean e_folder_type_registry_set_handler_for_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name,
- EvolutionShellComponentClient *handler);
-
-GList *e_folder_type_registry_get_type_names (EFolderTypeRegistry *folder_type_registry);
-
-GdkPixbuf *e_folder_type_registry_get_icon_for_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name,
- gboolean mini);
-const char *e_folder_type_registry_get_icon_name_for_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name);
-EvolutionShellComponentClient *e_folder_type_registry_get_handler_for_type (EFolderTypeRegistry *folder_type_registry,
- const char *type_name);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_FOLDER_TYPE_REGISTRY_H_ */
diff --git a/shell/e-folder.c b/shell/e-folder.c
deleted file mode 100644
index 90bd886352..0000000000
--- a/shell/e-folder.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-folder.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkobject.h>
-#include <gtk/gtksignal.h>
-
-#include "e-util/e-util.h"
-
-#include "e-folder.h"
-
-
-#define PARENT_TYPE GTK_TYPE_OBJECT
-static GtkObjectClass *parent_class = NULL;
-
-struct _EFolderPrivate {
- char *name;
- char *type;
- char *description;
- char *physical_uri;
-};
-
-#define EF_CLASS(obj) \
- E_FOLDER_CLASS (GTK_OBJECT (obj)->klass)
-
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-/* EFolder methods. */
-
-static gboolean
-save_info (EFolder *folder)
-{
- g_warning ("`%s' does not implement `EFolder::save_info()'",
- gtk_type_name (GTK_OBJECT_TYPE (folder)));
- return FALSE;
-}
-
-static gboolean
-load_info (EFolder *folder)
-{
- g_warning ("`%s' does not implement `EFolder::load_info()'",
- gtk_type_name (GTK_OBJECT_TYPE (folder)));
- return FALSE;
-}
-
-static gboolean
-remove (EFolder *folder)
-{
- g_warning ("`%s' does not implement `EFolder::remove()'",
- gtk_type_name (GTK_OBJECT_TYPE (folder)));
- return FALSE;
-}
-
-static const char *
-get_physical_uri (EFolder *folder)
-{
- return folder->priv->physical_uri;
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EFolder *folder;
- EFolderPrivate *priv;
-
- folder = E_FOLDER (object);
- priv = folder->priv;
-
- g_free (priv->name);
- g_free (priv->type);
- g_free (priv->description);
- g_free (priv->physical_uri);
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-class_init (EFolderClass *klass)
-{
- GtkObjectClass *object_class;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- signals[CHANGED] = gtk_signal_new ("changed",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EFolderClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-
- klass->save_info = save_info;
- klass->load_info = load_info;
- klass->remove = remove;
- klass->get_physical_uri = get_physical_uri;
-}
-
-static void
-init (EFolder *folder)
-{
- EFolderPrivate *priv;
-
- priv = g_new (EFolderPrivate, 1);
- priv->type = NULL;
- priv->name = NULL;
- priv->description = NULL;
- priv->physical_uri = NULL;
-
- folder->priv = priv;
-}
-
-
-void
-e_folder_construct (EFolder *folder,
- const char *name,
- const char *type,
- const char *description)
-{
- EFolderPrivate *priv;
-
- g_return_if_fail (folder != NULL);
- g_return_if_fail (E_IS_FOLDER (folder));
- g_return_if_fail (name != NULL);
- g_return_if_fail (type != NULL);
-
- GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (folder), GTK_FLOATING);
-
- priv = folder->priv;
-
- priv->name = g_strdup (name);
- priv->type = g_strdup (type);
- priv->description = g_strdup (description);
-}
-
-EFolder *
-e_folder_new (const char *name,
- const char *type,
- const char *description)
-{
- EFolder *folder;
-
- g_return_val_if_fail (name != NULL, NULL);
- g_return_val_if_fail (type != NULL, NULL);
- g_return_val_if_fail (description != NULL, NULL);
-
- folder = gtk_type_new (E_TYPE_FOLDER);
-
- e_folder_construct (folder, name, type, description);
-
- return folder;
-}
-
-
-const char *
-e_folder_get_name (EFolder *folder)
-{
- g_return_val_if_fail (folder != NULL, NULL);
- g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
-
- return folder->priv->name;
-}
-
-const char *
-e_folder_get_type_string (EFolder *folder)
-{
- g_return_val_if_fail (folder != NULL, NULL);
- g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
-
- return folder->priv->type;
-}
-
-const char *
-e_folder_get_description (EFolder *folder)
-{
- g_return_val_if_fail (folder != NULL, NULL);
- g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
-
- return folder->priv->description;
-}
-
-
-void
-e_folder_set_name (EFolder *folder,
- const char *name)
-{
- g_return_if_fail (folder != NULL);
- g_return_if_fail (E_IS_FOLDER (folder));
- g_return_if_fail (name != NULL);
-
- g_free (folder->priv->name);
- folder->priv->name = g_strdup (name);
-
- gtk_signal_emit (GTK_OBJECT (folder), signals[CHANGED]);
-}
-
-void
-e_folder_set_type_string (EFolder *folder,
- const char *type)
-{
- g_return_if_fail (folder != NULL);
- g_return_if_fail (E_IS_FOLDER (folder));
- g_return_if_fail (type != NULL);
-
- g_free (folder->priv->type);
- folder->priv->type = g_strdup (type);
-
- gtk_signal_emit (GTK_OBJECT (folder), signals[CHANGED]);
-}
-
-void
-e_folder_set_description (EFolder *folder,
- const char *description)
-{
- g_return_if_fail (folder != NULL);
- g_return_if_fail (E_IS_FOLDER (folder));
- g_return_if_fail (description != NULL);
-
- g_free (folder->priv->description);
- folder->priv->description = g_strdup (description);
-
- gtk_signal_emit (GTK_OBJECT (folder), signals[CHANGED]);
-}
-
-void
-e_folder_set_physical_uri (EFolder *folder,
- const char *physical_uri)
-{
- g_return_if_fail (folder != NULL);
- g_return_if_fail (E_IS_FOLDER (folder));
- g_return_if_fail (physical_uri != NULL);
-
- g_free (folder->priv->physical_uri);
- folder->priv->physical_uri = g_strdup (physical_uri);
-
- gtk_signal_emit (GTK_OBJECT (folder), signals[CHANGED]);
-}
-
-
-const char *
-e_folder_get_physical_uri (EFolder *folder)
-{
- g_return_val_if_fail (folder != NULL, NULL);
- g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
-
- return folder->priv->physical_uri;
-}
-
-
-E_MAKE_TYPE (e_folder, "EFolder", EFolder, class_init, init, PARENT_TYPE)
diff --git a/shell/e-folder.h b/shell/e-folder.h
deleted file mode 100644
index d7bbd6ba9e..0000000000
--- a/shell/e-folder.h
+++ /dev/null
@@ -1,93 +0,0 @@
- /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-folder.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_FOLDER_H_
-#define _E_FOLDER_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkobject.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_FOLDER (e_folder_get_type ())
-#define E_FOLDER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_FOLDER, EFolder))
-#define E_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_FOLDER, EFolderClass))
-#define E_IS_FOLDER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_FOLDER))
-#define E_IS_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_FOLDER))
-
-
-typedef struct _EFolder EFolder;
-typedef struct _EFolderPrivate EFolderPrivate;
-typedef struct _EFolderClass EFolderClass;
-
-struct _EFolder {
- GtkObject parent;
-
- EFolderPrivate *priv;
-};
-
-struct _EFolderClass {
- GtkObjectClass parent_class;
-
- /* Virtual methods. */
- gboolean (* save_info) (EFolder *folder);
- gboolean (* load_info) (EFolder *folder);
- gboolean (* remove) (EFolder *folder);
- const char * (* get_physical_uri) (EFolder *folder);
-
- /* Signals. */
- void (* changed) (EFolder *folder);
-};
-
-
-GtkType e_folder_get_type (void);
-void e_folder_construct (EFolder *folder,
- const char *name,
- const char *type,
- const char *description);
-EFolder *e_folder_new (const char *name,
- const char *type,
- const char *description);
-
-const char *e_folder_get_physical_uri (EFolder *folder);
-
-const char *e_folder_get_name (EFolder *folder);
-const char *e_folder_get_type_string (EFolder *folder);
-const char *e_folder_get_description (EFolder *folder);
-
-void e_folder_set_name (EFolder *folder, const char *name);
-void e_folder_set_type_string (EFolder *folder, const char *type);
-void e_folder_set_description (EFolder *folder, const char *description);
-void e_folder_set_physical_uri (EFolder *folder, const char *physical_uri);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_FOLDER_H_ */
diff --git a/shell/e-local-folder.c b/shell/e-local-folder.c
deleted file mode 100644
index 80cee7d7bc..0000000000
--- a/shell/e-local-folder.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-local-folder.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-/* The metafile goes like this:
-
- <?xml version="1.0"?>
- <efolder>
- <type>mail</type>
- <description>This is the folder where I store mail from my gf</description>
- <homepage>http://www.somewhere.net</homepage>
- </efolder>
-
- FIXME: Do we want to use a namespace for this?
- FIXME: Do we want to have an internationalized description?
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include "e-util/e-util.h"
-#include "e-util/e-xml-utils.h"
-
-#include "e-local-folder.h"
-
-
-#define PARENT_TYPE E_TYPE_FOLDER
-static EFolderClass *parent_class = NULL;
-
-#define URI_PREFIX "file://"
-#define URI_PREFIX_LEN 7
-
-#define METADATA_FILE_NAME "folder-metadata.xml"
-#define METADATA_FILE_NAME_LEN 19
-
-struct _ELocalFolderPrivate {
- int dummy;
-};
-
-
-static char *
-get_string_value (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)
- return NULL;
-
- xml_string = xmlNodeListGetString (node->doc, p, 1);
- retval = g_strdup ((char *) xml_string);
- xmlFree (xml_string);
-
- return retval;
-}
-
-static gboolean
-construct_loading_metadata (ELocalFolder *local_folder,
- const char *path)
-{
- EFolder *folder;
- xmlDoc *doc;
- xmlNode *root;
- char *type;
- char *description;
- char *metadata_path;
- char *physical_uri;
-
- folder = E_FOLDER (local_folder);
-
- metadata_path = g_concat_dir_and_file (path, METADATA_FILE_NAME);
-
- doc = xmlParseFile (metadata_path);
- if (doc == NULL) {
- g_free (metadata_path);
- return FALSE;
- }
-
- root = xmlDocGetRootElement (doc);
- if (root == NULL || strcmp (root->name, "efolder") != 0) {
- g_free (metadata_path);
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- type = get_string_value (root, "type");
- description = get_string_value (root, "description");
-
- e_folder_construct (folder, g_basename (path), type, description);
-
- g_free (type);
- g_free (description);
-
- xmlFreeDoc (doc);
-
- physical_uri = g_strconcat (URI_PREFIX, path, NULL);
- e_folder_set_physical_uri (folder, physical_uri);
- g_free (physical_uri);
-
- g_free (metadata_path);
-
- return TRUE;
-}
-
-static gboolean
-save_metadata (ELocalFolder *local_folder)
-{
- EFolder *folder;
- xmlDoc *doc;
- xmlNode *root;
- const char *physical_directory;
- char *physical_path;
-
- folder = E_FOLDER (local_folder);
-
- doc = xmlNewDoc ((xmlChar *) "1.0");
- root = xmlNewDocNode (doc, NULL, (xmlChar *) "efolder", NULL);
- xmlDocSetRootElement (doc, root);
-
- xmlNewChild (root, NULL, (xmlChar *) "type",
- (xmlChar *) e_folder_get_type_string (folder));
-
- if (e_folder_get_description (folder) != NULL)
- xmlNewChild (root, NULL, (xmlChar *) "description",
- (xmlChar *) e_folder_get_description (folder));
-
- physical_directory = e_folder_get_physical_uri (folder) + URI_PREFIX_LEN - 1;
- physical_path = g_concat_dir_and_file (physical_directory, METADATA_FILE_NAME);
-
- if (xmlSaveFile (physical_path, doc) < 0) {
- unlink (physical_path);
- g_free (physical_path);
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- g_free (physical_path);
-
- xmlFreeDoc (doc);
- return TRUE;
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- /* No ELocalFolder-specific data to free. */
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-class_init (ELocalFolderClass *klass)
-{
- GtkObjectClass *object_class;
-
- parent_class = gtk_type_class (e_folder_get_type ());
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-}
-
-static void
-init (ELocalFolder *local_folder)
-{
-}
-
-
-void
-e_local_folder_construct (ELocalFolder *local_folder,
- const char *name,
- const char *type,
- const char *description)
-{
- g_return_if_fail (local_folder != NULL);
- g_return_if_fail (E_IS_LOCAL_FOLDER (local_folder));
- g_return_if_fail (name != NULL);
- g_return_if_fail (type != NULL);
-
- e_folder_construct (E_FOLDER (local_folder), name, type, description);
-}
-
-EFolder *
-e_local_folder_new (const char *name,
- const char *type,
- const char *description)
-{
- ELocalFolder *local_folder;
-
- g_return_val_if_fail (name != NULL, NULL);
- g_return_val_if_fail (type != NULL, NULL);
-
- local_folder = gtk_type_new (e_local_folder_get_type ());
-
- e_local_folder_construct (local_folder, name, type, description);
-
- return E_FOLDER (local_folder);
-}
-
-EFolder *
-e_local_folder_new_from_path (const char *path)
-{
- EFolder *folder;
-
- g_return_val_if_fail (g_path_is_absolute (path), NULL);
-
- folder = gtk_type_new (e_local_folder_get_type ());
-
- if (! construct_loading_metadata (E_LOCAL_FOLDER (folder), path)) {
- gtk_object_unref (GTK_OBJECT (folder));
- return NULL;
- }
-
- return folder;
-}
-
-gboolean
-e_local_folder_save (ELocalFolder *local_folder)
-{
- g_return_val_if_fail (local_folder != NULL, FALSE);
- g_return_val_if_fail (E_IS_LOCAL_FOLDER (local_folder), FALSE);
- g_return_val_if_fail (e_folder_get_physical_uri (E_FOLDER (local_folder)) != NULL, FALSE);
-
- return save_metadata (local_folder);
-}
-
-
-E_MAKE_TYPE (e_local_folder, "ELocalFolder", ELocalFolder, class_init, init, PARENT_TYPE)
diff --git a/shell/e-local-folder.h b/shell/e-local-folder.h
deleted file mode 100644
index aa9e79a990..0000000000
--- a/shell/e-local-folder.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-local-folder.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_LOCAL_FOLDER_H_
-#define _E_LOCAL_FOLDER_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkobject.h>
-
-#include "e-folder.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_LOCAL_FOLDER (e_local_folder_get_type ())
-#define E_LOCAL_FOLDER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_LOCAL_FOLDER, ELocalFolder))
-#define E_LOCAL_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_LOCAL_FOLDER, ELocalFolderClass))
-#define E_IS_LOCAL_FOLDER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_LOCAL_FOLDER))
-#define E_IS_LOCAL_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_LOCAL_FOLDER))
-
-typedef struct _ELocalFolder ELocalFolder;
-typedef struct _ELocalFolderClass ELocalFolderClass;
-
-struct _ELocalFolder {
- EFolder parent;
-};
-
-struct _ELocalFolderClass {
- EFolderClass parent_class;
-};
-
-
-GtkType e_local_folder_get_type (void);
-void e_local_folder_construct (ELocalFolder *local_folder,
- const char *name,
- const char *type,
- const char *description);
-EFolder *e_local_folder_new (const char *name,
- const char *type,
- const char *description);
-EFolder *e_local_folder_new_from_path (const char *physical_path);
-gboolean e_local_folder_save (ELocalFolder *local_folder);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_LOCAL_FOLDER_H__ */
diff --git a/shell/e-local-storage.c b/shell/e-local-storage.c
deleted file mode 100644
index 93234b4741..0000000000
--- a/shell/e-local-storage.c
+++ /dev/null
@@ -1,589 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-local-storage.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-/* FIXMEs:
- *
- * - If we have `.' or `..' as path elements, we lose.
- *
- * - If the LocalStorage is destroyed and an async operation on a shell component is
- * pending, we get a callback on a bogus object. We need support for cancelling
- * operations on the shell component.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <dirent.h>
-
-#include <errno.h>
-#include <string.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <gnome.h>
-
-#include "e-util/e-util.h"
-#include "e-local-folder.h"
-
-#include "e-local-storage.h"
-
-
-#define PARENT_TYPE E_TYPE_STORAGE
-static EStorageClass *parent_class = NULL;
-
-#define SUBFOLDER_DIR_NAME "subfolders"
-#define SUBFOLDER_DIR_NAME_LEN 10
-
-struct _ELocalStoragePrivate {
- EFolderTypeRegistry *folder_type_registry;
- char *base_path;
-};
-
-
-/* Utility functions. */
-
-/* Translate a storage path into a physical path on the file system. */
-static char *
-get_physical_path (ELocalStorage *local_storage,
- const char *path)
-{
- EStorage *storage;
- ELocalStoragePrivate *priv;
- const char *p, *newp;
- char *dp;
- char *real_path;
- int real_path_len;
- int base_path_len;
-
- storage = E_STORAGE (local_storage);
- priv = local_storage->priv;
-
- /* @path is always absolute, so it starts with a slash. The base class should
- make sure this is the case; if not, it's broken. */
- g_assert (*path == G_DIR_SEPARATOR);
- path++;
-
- /* Calculate the length of the real path. */
-
- real_path_len = strlen (path);
- real_path_len++; /* For the ending zero. */
-
- base_path_len = strlen (priv->base_path);
- real_path_len += base_path_len;
- real_path_len++; /* For the separating slash. */
-
- /* Take account for the fact that we need to translate every separator into
- `subfolders/'. */
- p = path;
- while (1) {
- newp = strchr (p, G_DIR_SEPARATOR);
- if (newp == NULL)
- break;
-
- real_path_len += SUBFOLDER_DIR_NAME_LEN;
- real_path_len++; /* For the separating slash. */
-
- /* Skip consecutive slashes. */
- while (*newp == G_DIR_SEPARATOR)
- newp++;
-
- p = newp;
- };
-
- real_path = g_malloc (real_path_len);
- dp = real_path;
-
- memcpy (dp, priv->base_path, base_path_len);
- dp += base_path_len;
- *(dp++) = G_DIR_SEPARATOR;
-
- /* Copy the mangled path. */
- p = path;
- while (1) {
- newp = strchr (p, G_DIR_SEPARATOR);
- if (newp == NULL) {
- strcpy (dp, p);
- break;
- }
-
- memcpy (dp, p, newp - p + 1); /* `+ 1' to copy the slash too. */
- dp += newp - p + 1;
-
- memcpy (dp, SUBFOLDER_DIR_NAME, SUBFOLDER_DIR_NAME_LEN);
- dp += SUBFOLDER_DIR_NAME_LEN;
-
- *(dp++) = G_DIR_SEPARATOR;
-
- /* Skip consecutive slashes. */
- while (*newp == G_DIR_SEPARATOR)
- newp++;
-
- p = newp;
- }
-
- return real_path;
-}
-
-static gboolean
-load_folders (ELocalStorage *local_storage,
- const char *parent_path,
- const char *path,
- const char *physical_path)
-{
- DIR *dir;
- char *subfolder_directory_path;
-
- if (parent_path == NULL) {
- /* On the top level, we don't have any folders and, consequently, no
- subfolder directory. */
-
- subfolder_directory_path = g_strdup (physical_path);
- } else {
- EFolder *folder;
-
- /* Otherwise, we have to load the corresponding folder. */
-
- folder = e_local_folder_new_from_path (physical_path);
- if (folder == NULL)
- return FALSE;
-
- e_storage_new_folder (E_STORAGE (local_storage), parent_path, folder);
-
- subfolder_directory_path = g_concat_dir_and_file (physical_path, SUBFOLDER_DIR_NAME);
- }
-
- /* Now scan the subfolders and load them. The subfolders are represented by
- directories under the "SUBFOLDER_DIR_NAME" directory. */
-
- dir = opendir (subfolder_directory_path);
-
- if (dir == NULL) {
- g_free (subfolder_directory_path);
- return FALSE;
- }
-
- while (1) {
- struct stat file_stat;
- struct dirent *dirent;
- char *file_path;
- char *new_path;
-
- dirent = readdir (dir);
- if (dirent == NULL)
- break;
-
- if (strcmp (dirent->d_name, ".") == 0 || strcmp (dirent->d_name, "..") == 0)
- continue;
-
- file_path = g_concat_dir_and_file (subfolder_directory_path,
- dirent->d_name);
-
- if (stat (file_path, &file_stat) < 0) {
- g_free (file_path);
- continue;
- }
- if (! S_ISDIR (file_stat.st_mode)) {
- g_free (file_path);
- continue;
- }
-
- new_path = g_concat_dir_and_file (path, dirent->d_name);
-
- load_folders (local_storage, path, new_path, file_path);
-
- g_free (file_path);
- g_free (new_path);
- }
-
- closedir (dir);
- g_free (subfolder_directory_path);
-
- return TRUE;
-}
-
-static gboolean
-load_all_folders (ELocalStorage *local_storage)
-{
- const char *base_path;
-
- base_path = e_local_storage_get_base_path (local_storage);
-
- return load_folders (local_storage, NULL, G_DIR_SEPARATOR_S, base_path);
-}
-
-static EStorageResult
-errno_to_storage_result (void)
-{
- EStorageResult storage_result;
-
- switch (errno) {
- case EACCES:
- case EROFS:
- storage_result = E_STORAGE_PERMISSIONDENIED;
- break;
- case EEXIST:
- storage_result = E_STORAGE_EXISTS;
- break;
- case ENOSPC:
- storage_result = E_STORAGE_NOSPACE;
- break;
- default:
- storage_result = E_STORAGE_GENERICERROR;
- }
-
- return storage_result;
-}
-
-static EStorageResult
-shell_component_result_to_storage_result (EvolutionShellComponentResult result)
-{
- /* FIXME: Maybe we need better mapping here. */
- switch (result) {
- case EVOLUTION_SHELL_COMPONENT_OK:
- return E_STORAGE_OK;
- case EVOLUTION_SHELL_COMPONENT_NOTFOUND:
- return E_STORAGE_NOTFOUND;
- case EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE:
- return E_STORAGE_UNSUPPORTEDTYPE;
- case EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDOPERATION:
- return E_STORAGE_UNSUPPORTEDOPERATION;
- case EVOLUTION_SHELL_COMPONENT_EXISTS:
- return E_STORAGE_EXISTS;
- case EVOLUTION_SHELL_COMPONENT_PERMISSIONDENIED:
- return E_STORAGE_PERMISSIONDENIED;
- case EVOLUTION_SHELL_COMPONENT_ALREADYOWNED:
- case EVOLUTION_SHELL_COMPONENT_BUSY:
- case EVOLUTION_SHELL_COMPONENT_CORBAERROR:
- case EVOLUTION_SHELL_COMPONENT_HASSUBFOLDERS:
- case EVOLUTION_SHELL_COMPONENT_INTERNALERROR:
- case EVOLUTION_SHELL_COMPONENT_INTERRUPTED:
- case EVOLUTION_SHELL_COMPONENT_INVALIDARG:
- case EVOLUTION_SHELL_COMPONENT_INVALIDURI:
- case EVOLUTION_SHELL_COMPONENT_NOSPACE:
- case EVOLUTION_SHELL_COMPONENT_NOTOWNED:
- case EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR:
- default:
- return E_STORAGE_GENERICERROR;
- }
-}
-
-
-/* Callbacks for the async methods invoked on the `Evolution::ShellComponent's. */
-
-struct _AsyncCreateFolderCallbackData {
- EStorage *storage;
-
- char *parent_path;
- char *name;
- char *type;
- char *description;
- char *physical_uri;
- char *physical_path;
-
- EStorageResultCallback callback;
- void *callback_data;
-};
-typedef struct _AsyncCreateFolderCallbackData AsyncCreateFolderCallbackData;
-
-static void
-component_async_create_folder_callback (EvolutionShellComponentClient *shell_component_client,
- EvolutionShellComponentResult result,
- void *data)
-{
- AsyncCreateFolderCallbackData *callback_data;
-
- callback_data = (AsyncCreateFolderCallbackData *) data;
-
- if (result != EVOLUTION_SHELL_COMPONENT_OK) {
- /* XXX: This assumes the component won't leave any files in the directory. */
- rmdir (callback_data->physical_path);
- } else {
- EFolder *folder;
-
- folder = e_local_folder_new (callback_data->name,
- callback_data->type,
- callback_data->description);
-
- e_folder_set_physical_uri (folder, callback_data->physical_uri);
-
- if (e_local_folder_save (E_LOCAL_FOLDER (folder))) {
- e_storage_new_folder (callback_data->storage,
- callback_data->parent_path,
- folder);
- } else {
- rmdir (callback_data->physical_path);
- gtk_object_unref (GTK_OBJECT (folder));
- result = E_STORAGE_IOERROR;
- }
- }
-
- bonobo_object_unref (BONOBO_OBJECT (shell_component_client));
-
- (* callback_data->callback) (callback_data->storage,
- shell_component_result_to_storage_result (result),
- callback_data->callback_data);
-
- g_free (callback_data->parent_path);
- g_free (callback_data->name);
- g_free (callback_data->type);
- g_free (callback_data->description);
- g_free (callback_data->physical_uri);
- g_free (callback_data->physical_path);
- g_free (callback_data);
-}
-
-
-/* GtkObject methods. */
-
-static void
-impl_destroy (GtkObject *object)
-{
- ELocalStorage *local_storage;
- ELocalStoragePrivate *priv;
-
- local_storage = E_LOCAL_STORAGE (object);
- priv = local_storage->priv;
-
- g_free (priv->base_path);
-
- if (priv->folder_type_registry != NULL)
- gtk_object_unref (GTK_OBJECT (priv->folder_type_registry));
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* EStorage methods. */
-
-static const char *
-impl_get_name (EStorage *storage)
-{
- /* FIXME this sucks. */
- return "local";
-}
-
-static void
-impl_async_create_folder (EStorage *storage,
- const char *path,
- const char *type,
- const char *description,
- EStorageResultCallback callback,
- void *data)
-{
- ELocalStorage *local_storage;
- ELocalStoragePrivate *priv;
- EvolutionShellComponentClient *component_client;
- const char *folder_name;
- AsyncCreateFolderCallbackData *callback_data;
- char *physical_path;
- char *physical_uri;
- char *parent_path;
-
- local_storage = E_LOCAL_STORAGE (storage);
- priv = local_storage->priv;
-
- component_client = e_folder_type_registry_get_handler_for_type (priv->folder_type_registry,
- type);
- if (component_client == NULL) {
- (* callback) (storage, E_STORAGE_INVALIDTYPE, data);
- return;
- }
-
- g_assert (g_path_is_absolute (path));
-
- folder_name = g_basename (path);
- if (folder_name == path + 1) {
- /* We want a direct child of the root, so we don't need to create a
- `subfolders' directory. */
- physical_path = get_physical_path (local_storage, path);
- parent_path = g_strdup (G_DIR_SEPARATOR_S);
- } else {
- char *parent_physical_path;
- char *subfolders_directory_physical_path;
-
- /* Create the `subfolders' subdirectory under the parent. */
-
- parent_path = g_strndup (path, folder_name - path - 1);
- parent_physical_path = get_physical_path (local_storage, parent_path);
- subfolders_directory_physical_path = g_concat_dir_and_file (parent_physical_path,
- SUBFOLDER_DIR_NAME);
-
- if (! g_file_exists (subfolders_directory_physical_path)
- && mkdir (subfolders_directory_physical_path, 0700) == -1) {
- g_free (parent_path);
- g_free (subfolders_directory_physical_path);
- g_free (parent_physical_path);
-
- (* callback) (storage, errno_to_storage_result (), data);
- return;
- }
-
- physical_path = g_concat_dir_and_file (subfolders_directory_physical_path,
- folder_name);
- g_free (subfolders_directory_physical_path);
- g_free (parent_physical_path);
- }
-
- /* Create the directory that holds the folder. */
-
- if (mkdir (physical_path, 0700) == -1) {
- g_free (physical_path);
- (* callback) (storage, errno_to_storage_result (), data);
- return;
- }
-
- /* Finally tell the component to do the job of creating the physical files in
- it. */
- /* FIXME: We should put the operations on a queue so that we can cancel them when
- the ELocalStorage is destroyed. */
-
- physical_uri = g_strconcat ("file://", physical_path, NULL);
-
- callback_data = g_new (AsyncCreateFolderCallbackData, 1);
- callback_data->storage = storage;
- callback_data->parent_path = parent_path;
- callback_data->name = g_strdup (folder_name);
- callback_data->type = g_strdup (type);
- callback_data->description = g_strdup (description);
- callback_data->physical_uri = physical_uri;
- callback_data->physical_path = physical_path;
- callback_data->callback = callback;
- callback_data->callback_data = data;
-
- bonobo_object_ref (BONOBO_OBJECT (component_client));
-
- evolution_shell_component_client_async_create_folder (component_client,
- physical_path,
- type,
- component_async_create_folder_callback,
- callback_data);
-}
-
-static void
-impl_async_remove_folder (EStorage *storage,
- const char *path,
- EStorageResultCallback callback,
- void *data)
-{
- ELocalStorage *local_storage;
-
- local_storage = E_LOCAL_STORAGE (storage);
-}
-
-
-/* Initialization. */
-
-static void
-class_init (ELocalStorageClass *class)
-{
- EStorageClass *storage_class;
- GtkObjectClass *object_class;
-
- parent_class = gtk_type_class (e_storage_get_type ());
- object_class = GTK_OBJECT_CLASS (class);
- storage_class = E_STORAGE_CLASS (class);
-
- object_class->destroy = impl_destroy;
-
- storage_class->get_name = impl_get_name;
- storage_class->async_create_folder = impl_async_create_folder;
- storage_class->async_remove_folder = impl_async_remove_folder;
-}
-
-static void
-init (ELocalStorage *local_storage)
-{
- ELocalStoragePrivate *priv;
-
- priv = g_new (ELocalStoragePrivate, 1);
-
- priv->base_path = NULL;
- priv->folder_type_registry = NULL;
-
- local_storage->priv = priv;
-}
-
-
-static gboolean
-construct (ELocalStorage *local_storage,
- EFolderTypeRegistry *folder_type_registry,
- const char *base_path)
-{
- ELocalStoragePrivate *priv;
- int base_path_len;
-
- e_storage_construct (E_STORAGE (local_storage));
-
- priv = local_storage->priv;
-
- base_path_len = strlen (base_path);
- while (base_path_len > 0 && base_path[base_path_len - 1] == G_DIR_SEPARATOR)
- base_path_len--;
-
- g_return_val_if_fail (base_path_len != 0, FALSE);
-
- g_assert (priv->folder_type_registry == NULL);
- gtk_object_ref (GTK_OBJECT (folder_type_registry));
- priv->folder_type_registry = folder_type_registry;
-
- g_assert (priv->base_path == NULL);
- priv->base_path = g_strndup (base_path, base_path_len);
-
- return load_all_folders (local_storage);
-}
-
-EStorage *
-e_local_storage_open (EFolderTypeRegistry *folder_type_registry,
- const char *base_path)
-{
- EStorage *new;
-
- g_return_val_if_fail (folder_type_registry != NULL, NULL);
- g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
- g_return_val_if_fail (base_path != NULL, NULL);
-
- new = gtk_type_new (e_local_storage_get_type ());
-
- if (! construct (E_LOCAL_STORAGE (new), folder_type_registry, base_path)) {
- gtk_object_unref (GTK_OBJECT (new));
- return NULL;
- }
-
- return new;
-}
-
-const char *
-e_local_storage_get_base_path (ELocalStorage *local_storage)
-{
- g_return_val_if_fail (local_storage != NULL, NULL);
- g_return_val_if_fail (E_IS_LOCAL_STORAGE (local_storage), NULL);
-
- return local_storage->priv->base_path;
-}
-
-
-E_MAKE_TYPE (e_local_storage, "ELocalStorage", ELocalStorage, class_init, init, PARENT_TYPE)
diff --git a/shell/e-local-storage.h b/shell/e-local-storage.h
deleted file mode 100644
index 14a48cbdd4..0000000000
--- a/shell/e-local-storage.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-local-storage.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_LOCAL_STORAGE_H_
-#define _E_LOCAL_STORAGE_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-folder-type-registry.h"
-#include "e-storage.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_LOCAL_STORAGE (e_local_storage_get_type ())
-#define E_LOCAL_STORAGE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_LOCAL_STORAGE, ELocalStorage))
-#define E_LOCAL_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_LOCAL_STORAGE, ELocalStorageClass))
-#define E_IS_LOCAL_STORAGE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_LOCAL_STORAGE))
-#define E_IS_LOCAL_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_LOCAL_STORAGE))
-
-typedef struct _ELocalStorage ELocalStorage;
-typedef struct _ELocalStoragePrivate ELocalStoragePrivate;
-typedef struct _ELocalStorageClass ELocalStorageClass;
-
-struct _ELocalStorage {
- EStorage parent;
-
- ELocalStoragePrivate *priv;
-};
-
-struct _ELocalStorageClass {
- EStorageClass parent_class;
-};
-
-
-GtkType e_local_storage_get_type (void);
-EStorage *e_local_storage_open (EFolderTypeRegistry *folder_type_registry,
- const char *base_path);
-const char *e_local_storage_get_base_path (ELocalStorage *storage);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_LOCAL_STORAGE_H__ */
diff --git a/shell/e-setup.c b/shell/e-setup.c
deleted file mode 100644
index 3393247f35..0000000000
--- a/shell/e-setup.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-setup.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- */
-
-/* This needs to be a lot better. */
-
-#include <glib.h>
-#include <gnome.h>
-
-#include <errno.h>
-#include <sys/stat.h>
-
-#include "e-util/e-gui-utils.h"
-
-#include "e-setup.h"
-
-
-static gboolean
-copy_default_stuff (const char *evolution_directory)
-{
- GtkWidget *dialog;
- GtkWidget *label1;
- GtkWidget *label2;
- GtkWidget *label3;
- gboolean retval;
- char *command;
- int result;
-
- dialog = gnome_dialog_new (_("Evolution installation"),
- GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL,
- NULL);
-
- label1 = gtk_label_new (_("This seems to be the first time you run Evolution."));
- label2 = gtk_label_new (_("Please click \"OK\" to install the Evolution user files under"));
- label3 = gtk_label_new (evolution_directory);
-
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label1, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label2, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label3, TRUE, TRUE, 0);
-
- gtk_widget_show (label1);
- gtk_widget_show (label2);
- gtk_widget_show (label3);
-
- result = gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
- if (result != 0)
- return FALSE;
-
- if (mkdir (evolution_directory, 0700)) {
- e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
- _("Cannot create the directory\n%s\nError: %s"),
- evolution_directory,
- g_strerror (errno));
- return FALSE;
- }
-
- command = g_strconcat ("cp -r ",
- EVOLUTION_DATADIR,
- "/evolution/default_user/* ",
- evolution_directory,
- NULL);
-
- if (system (command) != 0) {
- /* FIXME: Give more help. */
- e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
- _("Cannot copy files into\n`%s'."), evolution_directory);
- retval = FALSE;
- } else {
- e_notice (NULL, GNOME_MESSAGE_BOX_INFO,
- _("Evolution files successfully installed."));
- retval = TRUE;
- }
-
- g_free (command);
-
- return retval;
-}
-
-
-gboolean
-e_setup (const char *evolution_directory)
-{
- struct stat statinfo;
- char *file;
-
- if (stat (evolution_directory, &statinfo) != 0)
- return copy_default_stuff (evolution_directory);
-
- if (! S_ISDIR (statinfo.st_mode)) {
- e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
- _("The file `%s' is not a directory.\n"
- "Please move it in order to allow installation\n"
- "of the Evolution user files."));
- return FALSE;
- }
-
- /* Make sure this is really our directory, not an Evolution
- * build tree or something like that.
- */
- file = g_strdup_printf ("%s/shortcuts.xml", evolution_directory);
- if (stat (file, &statinfo) != 0) {
- e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
- _("The directory `%s' exists but is not the\n"
- "Evolution directory. Please move it in order\n"
- "to allow installation of the Evolution user "
- "files."), evolution_directory);
- g_free (file);
- return FALSE;
- }
- g_free (file);
-
- /* If the user has an old-style config file, replace it with
- * the new-style config directory. FIXME: This should be
- * temporary.
- */
- file = g_strdup_printf ("%s/config", evolution_directory);
- if (stat (file, &statinfo) == 0 && ! S_ISDIR (statinfo.st_mode)) {
- char *old = g_strdup_printf ("%s.old", file);
- rename (file, old);
- mkdir (file, 0700);
- g_free (old);
- }
- g_free (file);
-
- return TRUE;
-}
diff --git a/shell/e-setup.h b/shell/e-setup.h
deleted file mode 100644
index a69d216b94..0000000000
--- a/shell/e-setup.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-setup.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_SETUP_H
-#define _E_SETUP_H
-
-#include <glib.h>
-
-gboolean e_setup (const char *evolution_directory);
-
-#endif /* _E_SETUP_H */
diff --git a/shell/e-shell-constants.h b/shell/e-shell-constants.h
deleted file mode 100644
index 70986144d0..0000000000
--- a/shell/e-shell-constants.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-utils.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef E_SHELL_CONSTANTS_H
-#define E_SHELL_CONSTANTS_H
-
-#define E_SHELL_URI_PREFIX "evolution:"
-#define E_SHELL_URI_PREFIX_LEN 10
-
-#define E_SHELL_MINI_ICON_SUFFIX "-mini"
-#define E_SHELL_MINI_ICON_SUFFIX_LEN 5
-
-#define E_SHELL_ICON_SIZE 48
-#define E_SHELL_MINI_ICON_SIZE 16
-
-#endif
diff --git a/shell/e-shell-folder-creation-dialog.c b/shell/e-shell-folder-creation-dialog.c
deleted file mode 100644
index e793b2ccff..0000000000
--- a/shell/e-shell-folder-creation-dialog.c
+++ /dev/null
@@ -1,398 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-#include <glade/glade-xml.h>
-
-#include "e-util/e-gui-utils.h"
-#include "e-util/e-util.h"
-
-#include "widgets/misc/e-scroll-frame.h"
-
-#include "e-storage-set.h"
-#include "e-storage-set-view.h"
-
-#include "e-shell-folder-creation-dialog.h"
-
-
-#define GLADE_FILE_NAME EVOLUTION_GLADEDIR "/e-shell-folder-creation-dialog.glade"
-
-
-/* Data for the callbacks. */
-struct _DialogData {
- GtkWidget *dialog;
- EShell *shell;
- GtkWidget *folder_name_entry;
- GtkWidget *storage_set_view;
- GtkWidget *folder_type_option_menu;
- GList *folder_types;
-};
-typedef struct _DialogData DialogData;
-
-static void
-dialog_data_destroy (DialogData *dialog_data)
-{
- e_free_string_list (dialog_data->folder_types);
- g_free (dialog_data);
-}
-
-
-/* Callback for the asynchronous folder creation function. */
-
-static void
-async_create_cb (EStorage *storage,
- EStorageResult result,
- void *data)
-{
- DialogData *dialog_data;
-
- dialog_data = (DialogData *) data;
-
- if (result == E_STORAGE_OK) {
- gtk_widget_destroy (dialog_data->dialog);
- return;
- }
-
- e_notice (GTK_WINDOW (dialog_data->dialog), GNOME_MESSAGE_BOX_ERROR,
- _("Cannot create the specified folder:\n%s"),
- e_storage_result_to_string (result));
-}
-
-
-/* Sanity check for the user-specified folder name. */
-/* FIXME in the future we would like not to have the `G_DIR_SEPARATOR' limitation. */
-static gboolean
-entry_name_is_valid (GtkEntry *entry)
-{
- const char *name;
-
- name = gtk_entry_get_text (entry);
-
- if (name == NULL || *name == '\0')
- return FALSE;
-
- if (strchr (name, G_DIR_SEPARATOR) != NULL)
- return FALSE;
-
- if (strcmp (name, ".") == 0 || strcmp (name, "..") == 0)
- return FALSE;
-
- return TRUE;
-}
-
-
-/* Dialog signal callbacks. */
-
-static void
-dialog_clicked_cb (GnomeDialog *dialog,
- int button_number,
- void *data)
-{
- DialogData *dialog_data;
- EStorageSet *storage_set;
- GtkWidget *folder_type_menu_item;
- const char *folder_type;
- const char *parent_path;
- const char *folder_name;
- char *path;
-
- if (button_number != 0) {
- gnome_dialog_close (dialog);
- return;
- }
-
- dialog_data = (DialogData *) data;
-
- if (! entry_name_is_valid (GTK_ENTRY (dialog_data->folder_name_entry))) {
- /* FIXME: Explain better. */
- e_notice (GTK_WINDOW (dialog), GNOME_MESSAGE_BOX_ERROR,
- _("The specified folder name is not valid."));
- return;
- }
-
- parent_path = e_storage_set_view_get_current_folder
- (E_STORAGE_SET_VIEW (dialog_data->storage_set_view));
- if (parent_path == NULL) {
- gnome_dialog_close (dialog);
- return;
- }
-
- folder_name = gtk_entry_get_text (GTK_ENTRY (dialog_data->folder_name_entry));
- path = g_concat_dir_and_file (parent_path, folder_name);
-
- storage_set = e_shell_get_storage_set (dialog_data->shell);
-
- folder_type_menu_item = GTK_OPTION_MENU (dialog_data->folder_type_option_menu)->menu_item;
- folder_type = gtk_object_get_data (GTK_OBJECT (folder_type_menu_item), "folder_type");
-
- if (folder_type == NULL) {
- g_warning ("Cannot get folder type for selected GtkOptionMenu item.");
- return;
- }
-
- e_storage_set_async_create_folder (storage_set,
- path,
- folder_type,
- NULL, /* description */
- async_create_cb, dialog_data);
-}
-
-static void
-dialog_close_cb (GnomeDialog *dialog,
- void *data)
-{
- gtk_widget_destroy (GTK_WIDGET (dialog));
-}
-
-static void
-dialog_destroy_cb (GtkObject *object,
- void *data)
-{
- DialogData *dialog_data;
-
- dialog_data = (DialogData *) data;
- dialog_data_destroy (dialog_data);
-}
-
-static void
-folder_name_entry_changed_cb (GtkEditable *editable,
- void *data)
-{
- GnomeDialog *dialog;
- GtkEntry *entry;
-
- entry = GTK_ENTRY (editable);
- dialog = GNOME_DIALOG (data);
-
- if (entry->text_length > 0)
- gnome_dialog_set_sensitive (dialog, 0, TRUE);
- else
- gnome_dialog_set_sensitive (dialog, 0, FALSE);
-}
-
-
-/* Shell signal callbacks. */
-
-static void
-shell_destroy_cb (GtkObject *object,
- void *data)
-{
- GnomeDialog *dialog;
-
- dialog = GNOME_DIALOG (data);
- gtk_widget_destroy (GTK_WIDGET (dialog));
-}
-
-
-/* Dialog setup. */
-
-static void
-setup_dialog (GtkWidget *dialog,
- GladeXML *gui,
- EShell *shell,
- GtkWindow *parent_window)
-{
- if (parent_window != NULL)
- gtk_window_set_transient_for (GTK_WINDOW (dialog), parent_window);
-
- gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
- gtk_window_set_title (GTK_WINDOW (dialog), _("Evolution - Create new folder"));
-
- gnome_dialog_set_default (GNOME_DIALOG (dialog), 0);
- gnome_dialog_set_sensitive (GNOME_DIALOG (dialog), 0, FALSE);
-
- gtk_widget_show (dialog);
-}
-
-static void
-setup_folder_name_entry (GtkWidget *dialog,
- GladeXML *gui,
- EShell *shell)
-{
- GtkWidget *folder_name_entry;
-
- folder_name_entry = glade_xml_get_widget (gui, "folder_name_entry");
-
- gnome_dialog_editable_enters (GNOME_DIALOG (dialog), GTK_EDITABLE (folder_name_entry));
-
- gtk_signal_connect (GTK_OBJECT (folder_name_entry), "changed",
- GTK_SIGNAL_FUNC (folder_name_entry_changed_cb), dialog);
-}
-
-static GtkWidget *
-add_storage_set_view (GtkWidget *dialog,
- GladeXML *gui,
- EShell *shell,
- const char *default_parent_folder)
-{
- EStorageSet *storage_set;
- GtkWidget *storage_set_view;
- GtkWidget *scroll_frame;
- GtkWidget *vbox;
-
- storage_set = e_shell_get_storage_set (shell);
- storage_set_view = e_storage_set_new_view (storage_set);
-
- GTK_WIDGET_SET_FLAGS (storage_set_view, GTK_CAN_FOCUS);
-
- if (default_parent_folder != NULL)
- e_storage_set_view_set_current_folder (E_STORAGE_SET_VIEW (storage_set_view),
- default_parent_folder);
-
- vbox = glade_xml_get_widget (gui, "main_vbox");
-
- scroll_frame = e_scroll_frame_new (NULL, NULL);
- e_scroll_frame_set_policy (E_SCROLL_FRAME (scroll_frame), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_box_pack_start (GTK_BOX (vbox), scroll_frame, TRUE, TRUE, 0);
-
- gtk_container_add (GTK_CONTAINER (scroll_frame), storage_set_view);
-
- gtk_widget_show (scroll_frame);
- gtk_widget_show (storage_set_view);
-
- return storage_set_view;
-}
-
-static GList *
-add_folder_types (GtkWidget *dialog,
- GladeXML *gui,
- EShell *shell)
-{
- EFolderTypeRegistry *folder_type_registry;
- GtkWidget *folder_type_option_menu;
- GtkWidget *menu;
- GList *folder_types;
- GList *p;
- int default_item;
- int i;
-
- folder_type_option_menu = glade_xml_get_widget (gui, "folder_type_option_menu");
-
- /* KLUDGE. So, GtkOptionMenu is badly broken. It calculates its size
- in `gtk_option_menu_set_menu()' instead of using `size_request()' as
- any sane widget would do. So, in order to avoid the "narrow
- GtkOptionMenu" bug, we have to destroy the existing associated menu
- and create a new one. Life sucks. */
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (folder_type_option_menu));
- g_assert (menu != NULL);
- gtk_widget_destroy (menu);
-
- menu = gtk_menu_new ();
-
- folder_type_registry = e_shell_get_folder_type_registry (shell);
- g_assert (folder_type_registry != NULL);
-
- folder_types = e_folder_type_registry_get_type_names (folder_type_registry);
- if (folder_types == NULL)
- return NULL; /* Uh? */
-
- folder_types = g_list_sort (folder_types, (GCompareFunc) g_strcasecmp);
-
- /* FIXME: Use descriptive name (not in the registry's implementation yet). */
- /* FIXME: Add icon (I don't feel like writing an alpha-capable thingie again). */
-
- default_item = 0;
- for (p = folder_types, i = 0; p != NULL; p = p->next, i++) {
- const char *type_name;
- GtkWidget *menu_item;
-
- type_name = (const char *) p->data;
-
- menu_item = gtk_menu_item_new_with_label (type_name);
- gtk_widget_show (menu_item);
- gtk_menu_append (GTK_MENU (menu), menu_item);
-
- gtk_object_set_data (GTK_OBJECT (menu_item), "folder_type", (void *) type_name);
-
- if (strcmp (type_name, "mail") == 0)
- default_item = i;
- }
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (folder_type_option_menu), menu);
- gtk_widget_show (menu);
-
- gtk_option_menu_set_history (GTK_OPTION_MENU (folder_type_option_menu), default_item);
- gtk_widget_queue_resize (folder_type_option_menu);
-
- return folder_types;
-}
-
-
-/* FIXME: Currently this is modal. I think it's OK, but if people think it is
- not, we should change it to non-modal and make sure only one of these is
- open at once. Currently it relies on modality for this. */
-void
-e_shell_show_folder_creation_dialog (EShell *shell,
- GtkWindow *parent_window,
- const char *default_parent_folder)
-{
- GladeXML *gui;
- GtkWidget *dialog;
- GtkWidget *storage_set_view;
- GList *folder_types;
- DialogData *dialog_data;
-
- g_return_if_fail (shell != NULL);
- g_return_if_fail (E_IS_SHELL (shell));
-
- gui = glade_xml_new (GLADE_FILE_NAME, NULL);
- if (gui == NULL) {
- g_warning ("Cannot load Glade description file for the folder creation dialog -- %s",
- GLADE_FILE_NAME);
- return;
- }
-
- dialog = glade_xml_get_widget (gui, "create_folder_dialog");
-
- setup_dialog (dialog, gui, shell, parent_window);
- setup_folder_name_entry (dialog, gui, shell);
-
- storage_set_view = add_storage_set_view (dialog, gui, shell, default_parent_folder);
- folder_types = add_folder_types (dialog, gui, shell);
-
- dialog_data = g_new (DialogData, 1);
- dialog_data->dialog = dialog;
- dialog_data->shell = shell;
- dialog_data->folder_name_entry = glade_xml_get_widget (gui, "folder_name_entry");
- dialog_data->storage_set_view = storage_set_view;
- dialog_data->folder_type_option_menu = glade_xml_get_widget (gui, "folder_type_option_menu");
- dialog_data->folder_types = folder_types;
-
- gtk_signal_connect (GTK_OBJECT (dialog), "clicked",
- GTK_SIGNAL_FUNC (dialog_clicked_cb), dialog_data);
- gtk_signal_connect (GTK_OBJECT (dialog), "close",
- GTK_SIGNAL_FUNC (dialog_close_cb), dialog_data);
- gtk_signal_connect (GTK_OBJECT (dialog), "destroy",
- GTK_SIGNAL_FUNC (dialog_destroy_cb), dialog_data);
-
- gtk_signal_connect_while_alive (GTK_OBJECT (shell), "destroy",
- GTK_SIGNAL_FUNC (shell_destroy_cb), dialog_data,
- GTK_OBJECT (dialog));
-
- gtk_object_unref (GTK_OBJECT (gui));
-}
diff --git a/shell/e-shell-folder-creation-dialog.h b/shell/e-shell-folder-creation-dialog.h
deleted file mode 100644
index ac7518f986..0000000000
--- a/shell/e-shell-folder-creation-dialog.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef E_SHELL_FOLDER_CREATION_DIALOG_H
-#define E_SHELL_FOLDER_CREATION_DIALOG_H
-
-#include <gtk/gtkwindow.h>
-
-#include "e-shell.h"
-
-void e_shell_show_folder_creation_dialog (EShell *shell,
- GtkWindow *parent,
- const char *default_parent_folder);
-
-#endif /* E_SHELL_FOLDER_CREATION_DIALOG_H */
diff --git a/shell/e-shell-folder-selection-dialog.c b/shell/e-shell-folder-selection-dialog.c
deleted file mode 100644
index 3bf60d28e4..0000000000
--- a/shell/e-shell-folder-selection-dialog.c
+++ /dev/null
@@ -1,359 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-folder-selection-dialog.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <libgnomeui/gnome-stock.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "e-util/e-gui-utils.h"
-#include "e-util/e-util.h"
-#include "widgets/misc/e-scroll-frame.h"
-
-#include "e-shell-constants.h"
-#include "e-storage-set-view.h"
-#include "e-storage-set.h"
-
-#include "e-shell-folder-creation-dialog.h"
-
-#include "e-shell-folder-selection-dialog.h"
-
-
-#define PARENT_TYPE (gnome_dialog_get_type ())
-static GnomeDialogClass *parent_class = NULL;
-
-struct _EShellFolderSelectionDialogPrivate {
- EShell *shell;
- GList *allowed_types;
- EStorageSet *storage_set;
- GtkWidget *storage_set_view;
-};
-
-enum {
- FOLDER_SELECTED,
- CANCELLED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-static gboolean
-check_folder_type (EShellFolderSelectionDialog *folder_selection_dialog)
-{
- EShellFolderSelectionDialogPrivate *priv;
- const char *selected_path;
- EFolder *folder;
- const char *folder_type;
- GList *p;
-
- priv = folder_selection_dialog->priv;
- if (priv->allowed_types == NULL)
- return TRUE;
-
- selected_path = e_shell_folder_selection_dialog_get_selected_path (folder_selection_dialog);
- if (selected_path == NULL)
- return FALSE;
-
- folder = e_storage_set_get_folder (priv->storage_set, selected_path);
- if (folder == NULL)
- return FALSE;
-
- folder_type = e_folder_get_type_string (folder);
-
- for (p = priv->allowed_types; p != NULL; p = p->next) {
- const char *type;
-
- type = (const char *) p->data;
- if (strcasecmp (folder_type, type) == 0)
- return TRUE;
- }
-
- e_notice (GTK_WINDOW (folder_selection_dialog), GNOME_MESSAGE_BOX_ERROR,
- _("The type of the selected folder is not valid for\nthe requested operation."));
-
- return FALSE;
-}
-
-
-/* GtkObject methods. */
-
-static void
-impl_destroy (GtkObject *object)
-{
- EShellFolderSelectionDialog *folder_selection_dialog;
- EShellFolderSelectionDialogPrivate *priv;
-
- folder_selection_dialog = E_SHELL_FOLDER_SELECTION_DIALOG (object);
- priv = folder_selection_dialog->priv;
-
- if (priv->storage_set != NULL)
- gtk_object_unref (GTK_OBJECT (priv->storage_set));
-
- e_free_string_list (priv->allowed_types);
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* GnomeDialog methods. */
-
-static void
-impl_clicked (GnomeDialog *dialog,
- int button_number)
-{
- EShellFolderSelectionDialog *folder_selection_dialog;
- EShellFolderSelectionDialogPrivate *priv;
- EStorageSetView *storage_set_view;
- const char *default_parent_folder;
-
- folder_selection_dialog = E_SHELL_FOLDER_SELECTION_DIALOG (dialog);
- priv = folder_selection_dialog->priv;
-
- switch (button_number) {
- case 0: /* OK */
- if (check_folder_type (folder_selection_dialog)) {
- gtk_signal_emit (GTK_OBJECT (folder_selection_dialog), signals[FOLDER_SELECTED],
- e_shell_folder_selection_dialog_get_selected_path (folder_selection_dialog));
- gtk_widget_destroy (GTK_WIDGET (dialog));
- }
- break;
- case 1: /* Cancel */
- gtk_signal_emit (GTK_OBJECT (folder_selection_dialog), signals[CANCELLED]);
- gtk_widget_destroy (GTK_WIDGET (dialog));
- break;
- case 2: /* Add */
- storage_set_view = E_STORAGE_SET_VIEW (priv->storage_set_view);
- default_parent_folder = e_storage_set_view_get_current_folder (storage_set_view);
-
- e_shell_show_folder_creation_dialog (priv->shell, GTK_WINDOW (dialog),
- default_parent_folder);
-
- break;
- }
-}
-
-
-/* GTK+ type initialization. */
-
-static void
-class_init (EShellFolderSelectionDialogClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeDialogClass *dialog_class;
-
- parent_class = gtk_type_class (PARENT_TYPE);
- object_class = GTK_OBJECT_CLASS (klass);
- dialog_class = GNOME_DIALOG_CLASS (klass);
-
- object_class->destroy = impl_destroy;
-
- dialog_class->clicked = impl_clicked;
-
- signals[FOLDER_SELECTED]
- = gtk_signal_new ("folder_selected",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShellFolderSelectionDialogClass, folder_selected),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
-
- signals[CANCELLED]
- = gtk_signal_new ("cancelled",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShellFolderSelectionDialogClass, cancelled),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (EShellFolderSelectionDialog *shell_folder_selection_dialog)
-{
- EShellFolderSelectionDialogPrivate *priv;
-
- priv = g_new (EShellFolderSelectionDialogPrivate, 1);
- priv->shell = NULL;
- priv->storage_set = NULL;
- priv->storage_set_view = NULL;
- priv->allowed_types = NULL;
-
- shell_folder_selection_dialog->priv = priv;
-}
-
-
-static void
-set_default_folder (EShellFolderSelectionDialog *shell_folder_selection_dialog,
- const char *default_uri)
-{
- EShellFolderSelectionDialogPrivate *priv;
- char *default_path;
-
- priv = shell_folder_selection_dialog->priv;
-
- if (default_uri && strncmp (default_uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0) {
- /* `evolution:' URI. */
- default_path = g_strdup (default_uri + E_SHELL_URI_PREFIX_LEN);
- } else {
- /* Physical URI. */
- default_path = e_storage_set_get_path_for_physical_uri (priv->storage_set,
- default_uri);
- }
-
- e_storage_set_view_set_current_folder (E_STORAGE_SET_VIEW (priv->storage_set_view),
- default_path);
-
- g_free (default_path);
-}
-
-
-/**
- * e_shell_folder_selection_dialog_construct:
- * @folder_selection_dialog: A folder selection dialog widget
- * @shell: The this folder selection dialog is for
- * @title: Title of the window
- * @default_uri: The URI of the folder to be selected by default
- * @allowed_types: List of the names of the allowed types
- *
- * Construct @folder_selection_dialog.
- **/
-void
-e_shell_folder_selection_dialog_construct (EShellFolderSelectionDialog *folder_selection_dialog,
- EShell *shell,
- const char *title,
- const char *default_uri,
- const char *allowed_types[])
-{
- EShellFolderSelectionDialogPrivate *priv;
- GtkWidget *scroll_frame;
- int i;
-
- g_return_if_fail (folder_selection_dialog != NULL);
- g_return_if_fail (E_IS_SHELL_FOLDER_SELECTION_DIALOG (folder_selection_dialog));
- g_return_if_fail (shell != NULL);
- g_return_if_fail (E_IS_SHELL (shell));
-
- priv = folder_selection_dialog->priv;
-
- gtk_window_set_modal (GTK_WINDOW (folder_selection_dialog), TRUE);
- gtk_window_set_title (GTK_WINDOW (folder_selection_dialog), title);
-
- gnome_dialog_append_buttons (GNOME_DIALOG (folder_selection_dialog),
- GNOME_STOCK_BUTTON_OK,
- GNOME_STOCK_BUTTON_CANCEL,
- _("New..."),
- NULL);
- gnome_dialog_set_default (GNOME_DIALOG (folder_selection_dialog), 0);
-
- gtk_window_set_policy (GTK_WINDOW (folder_selection_dialog), TRUE, TRUE, FALSE);
- gtk_window_set_default_size (GTK_WINDOW (folder_selection_dialog), 350, 300);
-
- priv->shell = shell;
- gtk_signal_connect_object_while_alive (GTK_OBJECT (shell), "destroy",
- GTK_SIGNAL_FUNC (gtk_widget_destroy),
- GTK_OBJECT (folder_selection_dialog));
-
- priv->storage_set = e_shell_get_storage_set (shell);
- gtk_object_ref (GTK_OBJECT (priv->storage_set));
-
- priv->storage_set_view = e_storage_set_new_view (priv->storage_set);
- GTK_WIDGET_SET_FLAGS (priv->storage_set_view, GTK_CAN_FOCUS);
-
- g_assert (priv->allowed_types == NULL);
- if (allowed_types != NULL) {
- for (i = 0; allowed_types[i] != NULL; i++)
- priv->allowed_types = g_list_prepend (priv->allowed_types,
- g_strdup (allowed_types[i]));
- }
-
- set_default_folder (folder_selection_dialog, default_uri);
-
- scroll_frame = e_scroll_frame_new (NULL, NULL);
- e_scroll_frame_set_policy (E_SCROLL_FRAME (scroll_frame),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
- gtk_container_add (GTK_CONTAINER (scroll_frame), priv->storage_set_view);
-
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (folder_selection_dialog)->vbox),
- scroll_frame, TRUE, TRUE, 2);
-
- gtk_widget_show (scroll_frame);
- gtk_widget_show (priv->storage_set_view);
-}
-
-/**
- * e_shell_folder_selection_dialog_new:
- * @shell: The this folder selection dialog is for
- * @title: Title of the window
- * @default_uri: The URI of the folder to be selected by default
- * @allowed_types: List of the names of the allowed types
- *
- * Create a new folder selection dialog widget. @default_uri can be either an
- * `evolution:' URI or a physical URI (all the non-`evoluion:' URIs are
- * considered to be physical URIs).
- *
- * Return value:
- **/
-GtkWidget *
-e_shell_folder_selection_dialog_new (EShell *shell,
- const char *title,
- const char *default_uri,
- const char *allowed_types[])
-{
- EShellFolderSelectionDialog *folder_selection_dialog;
-
- g_return_val_if_fail (shell != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
- folder_selection_dialog = gtk_type_new (e_shell_folder_selection_dialog_get_type ());
- e_shell_folder_selection_dialog_construct (folder_selection_dialog, shell,
- title, default_uri, allowed_types);
-
- return GTK_WIDGET (folder_selection_dialog);
-}
-
-
-const char *
-e_shell_folder_selection_dialog_get_selected_path (EShellFolderSelectionDialog *folder_selection_dialog)
-{
- EShellFolderSelectionDialogPrivate *priv;
-
- g_return_val_if_fail (folder_selection_dialog != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL_FOLDER_SELECTION_DIALOG (folder_selection_dialog), NULL);
-
- priv = folder_selection_dialog->priv;
-
- return e_storage_set_view_get_current_folder (E_STORAGE_SET_VIEW (priv->storage_set_view));
-}
-
-
-E_MAKE_TYPE (e_shell_folder_selection_dialog, "EShellFolderSelectionDialog", EShellFolderSelectionDialog,
- class_init, init, PARENT_TYPE)
diff --git a/shell/e-shell-folder-selection-dialog.h b/shell/e-shell-folder-selection-dialog.h
deleted file mode 100644
index 2ddb98bafe..0000000000
--- a/shell/e-shell-folder-selection-dialog.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-folder-selection-dialog.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef E_SHELL_FOLDER_SELECTION_DIALOG_H
-#define E_SHELL_FOLDER_SELECTION_DIALOG_H
-
-#include <libgnomeui/gnome-dialog.h>
-
-#include "e-shell.h"
-
-#ifdef cplusplus
-extern "C" {
-#pragma }
-#endif /* cplusplus */
-
-#define E_TYPE_SHELL_FOLDER_SELECTION_DIALOG (e_shell_folder_selection_dialog_get_type ())
-#define E_SHELL_FOLDER_SELECTION_DIALOG(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL_FOLDER_SELECTION_DIALOG, EShellFolderSelectionDialog))
-#define E_SHELL_FOLDER_SELECTION_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_FOLDER_SELECTION_DIALOG, EShellFolderSelectionDialogClass))
-#define E_IS_SHELL_FOLDER_SELECTION_DIALOG(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_FOLDER_SELECTION_DIALOG))
-#define E_IS_SHELL_FOLDER_SELECTION_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_FOLDER_SELECTION_DIALOG))
-
-
-typedef struct _EShellFolderSelectionDialog EShellFolderSelectionDialog;
-typedef struct _EShellFolderSelectionDialogPrivate EShellFolderSelectionDialogPrivate;
-typedef struct _EShellFolderSelectionDialogClass EShellFolderSelectionDialogClass;
-
-struct _EShellFolderSelectionDialog {
- GnomeDialog parent;
-
- EShellFolderSelectionDialogPrivate *priv;
-};
-
-struct _EShellFolderSelectionDialogClass {
- GnomeDialogClass parent_class;
-
- void (* folder_selected) (EShellFolderSelectionDialog *folder_selection_dialog,
- const char *path);
- void (* cancelled) (EShellFolderSelectionDialog *folder_selection_dialog);
-};
-
-
-GtkType e_shell_folder_selection_dialog_get_type (void);
-void e_shell_folder_selection_dialog_construct (EShellFolderSelectionDialog *folder_selection_dialog,
- EShell *shell,
- const char *title,
- const char *default_path,
- const char *allowed_types[]);
-GtkWidget *e_shell_folder_selection_dialog_new (EShell *shell,
- const char *title,
- const char *default_path,
- const char *allowed_types[]);
-
-const char *e_shell_folder_selection_dialog_get_selected_path (EShellFolderSelectionDialog *folder_selection_dialog);
-
-#ifdef cplusplus
-}
-#endif /* cplusplus */
-
-#endif /* E_SHELL_FOLDER_SELECTION_DIALOG_H */
diff --git a/shell/e-shell-folder-title-bar.c b/shell/e-shell-folder-title-bar.c
deleted file mode 100644
index 00d0e70e98..0000000000
--- a/shell/e-shell-folder-title-bar.c
+++ /dev/null
@@ -1,548 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-folder-title-bar.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "widgets/misc/e-clipped-label.h"
-#include "e-util/e-util.h"
-
-#include "e-shell-constants.h"
-#include "e-shell-folder-title-bar.h"
-
-
-#define PARENT_TYPE GTK_TYPE_EVENT_BOX
-static GtkEventBox *parent_class = NULL;
-
-struct _EShellFolderTitleBarPrivate {
- GdkPixbuf *icon;
- GtkWidget *icon_widget;
-
- /* The hbox containing the button, the label and the icon on the right. */
- GtkWidget *hbox;
-
- /* We have a label and a button. When the button is enabled, the label is hidden;
- when the button is disable, only the label is visible. */
-
- /* The label. */
- GtkWidget *label;
-
- /* The button. */
- GtkWidget *button;
- GtkWidget *button_label;
- GtkWidget *button_arrow;
-
- gboolean clickable;
-};
-
-enum {
- TITLE_TOGGLED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-static char *arrow_xpm[] = {
- "11 5 2 1",
- " c none",
- ". c #ffffffffffff",
- " ......... ",
- " ....... ",
- " ..... ",
- " ... ",
- " . ",
-};
-
-
-/* Icon handling. */
-
-static unsigned int
-rgb_from_gdk_color (GdkColor *color)
-{
- return (((color->red >> 8) << 16)
- | ((color->green >> 8) << 8)
- | ((color->blue >> 8)));
-}
-
-static GdkPixmap *
-make_icon_pixmap (EShellFolderTitleBar *folder_title_bar,
- const GdkPixbuf *pixbuf)
-{
- GdkPixmap *pixmap;
- GtkWidget *widget;
- unsigned int depth;
- unsigned int rgb;
-
- widget = GTK_WIDGET (folder_title_bar);
-
- rgb = rgb_from_gdk_color (&widget->style->bg[GTK_STATE_NORMAL]);
-
- depth = gtk_widget_get_visual (widget)->depth;
-
- pixmap = gdk_pixmap_new (GTK_WIDGET (folder_title_bar)->window,
- E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE,
- depth);
-
- if (pixbuf == NULL) {
- gdk_draw_rectangle (pixmap, widget->style->bg_gc[GTK_STATE_NORMAL], TRUE,
- 0, 0, E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE);
- } else {
- GdkPixbuf *composited_pixbuf;
-
- composited_pixbuf = gdk_pixbuf_composite_color_simple
- (pixbuf, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf),
- GDK_INTERP_NEAREST, 255, 32, rgb, rgb);
-
- gdk_pixbuf_render_to_drawable (composited_pixbuf,
- pixmap, widget->style->fg_gc[GTK_STATE_NORMAL],
- 0, 0, 0, 0,
- E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE,
- GDK_RGB_DITHER_MAX, 0, 0);
-
- gdk_pixbuf_unref (composited_pixbuf);
- }
-
- return pixmap;
-}
-
-
-/* Icon pixmap. */
-
-static GtkWidget *
-create_icon_pixmap (GtkWidget *parent)
-{
- GtkWidget *gtk_pixmap;
- GdkPixmap *gdk_pixmap;
- GdkBitmap *gdk_mask;
-
- gdk_pixmap = gdk_pixmap_create_from_xpm_d (parent->window, &gdk_mask, NULL, arrow_xpm);
- gtk_pixmap = gtk_pixmap_new (gdk_pixmap, gdk_mask);
-
- gdk_pixmap_unref (gdk_pixmap);
- gdk_bitmap_unref (gdk_mask);
-
- return gtk_pixmap;
-}
-
-static void
-title_button_box_realize_cb (GtkWidget *widget,
- void *data)
-{
- EShellFolderTitleBar *folder_title_bar;
- EShellFolderTitleBarPrivate *priv;
- GtkWidget *button_arrow;
-
- folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (data);
- priv = folder_title_bar->priv;
-
- if (priv->button_arrow != NULL)
- return;
-
- button_arrow = create_icon_pixmap (widget);
-
- gtk_widget_show (button_arrow);
- gtk_box_pack_start (GTK_BOX (widget), button_arrow, FALSE, TRUE, 2);
-
- priv->button_arrow = button_arrow;
-}
-
-
-/* Style handling. */
-
-static void
-endarken_style (GtkWidget *widget)
-{
-#ifndef E_USE_STYLES
- GtkStyle *style;
- GtkRcStyle *new_rc_style;
- int i;
-
- style = widget->style;
-
- new_rc_style = gtk_rc_style_new ();
-
- for (i = 0; i < 5; i++) {
- new_rc_style->bg[i].red = style->bg[i].red * .8;
- new_rc_style->bg[i].green = style->bg[i].green * .8;
- new_rc_style->bg[i].blue = style->bg[i].blue * .8;
- new_rc_style->fg[i].red = 0xffff;
- new_rc_style->fg[i].green = 0xffff;
- new_rc_style->fg[i].blue = 0xffff;
-
- new_rc_style->color_flags[i] = GTK_RC_BG | GTK_RC_FG;
- }
-
- gtk_widget_modify_style (widget, new_rc_style);
-
- gtk_rc_style_unref (new_rc_style);
-#endif
-}
-
-static void
-style_set_cb (GtkWidget *widget,
- GtkStyle *previous_style,
- void *data)
-{
- EShellFolderTitleBar *folder_title_bar;
-
- folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (widget);
-
- /*
- This will cause a style_set signal to be emitted again,
- so we need to do this to prevent infinite recursion.
- */
- gtk_signal_handler_block_by_func (GTK_OBJECT (widget), GTK_SIGNAL_FUNC (style_set_cb), data);
-
- endarken_style (widget);
- gtk_signal_handler_unblock_by_func (GTK_OBJECT (widget), GTK_SIGNAL_FUNC (style_set_cb), data);
-
- if (folder_title_bar->priv->icon)
- e_shell_folder_title_bar_set_icon (folder_title_bar, folder_title_bar->priv->icon);
-}
-
-
-/* Popup button callback. */
-
-static void
-title_button_toggled_cb (GtkToggleButton *button,
- void *data)
-{
- EShellFolderTitleBar *folder_title_bar;
-
- folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (data);
- gtk_signal_emit (GTK_OBJECT (folder_title_bar),
- signals[TITLE_TOGGLED],
- gtk_toggle_button_get_active (button));
-}
-
-
-/* GTkWidget methods. */
-
-static void
-realize (GtkWidget *widget)
-{
- EShellFolderTitleBar *folder_title_bar;
- EShellFolderTitleBarPrivate *priv;
- GdkPixmap *pixmap;
-
- (* GTK_WIDGET_CLASS (parent_class)->realize) (widget);
-
- folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (widget);
- priv = folder_title_bar->priv;
-
- pixmap = make_icon_pixmap (folder_title_bar, priv->icon);
- priv->icon_widget = gtk_pixmap_new (pixmap, NULL);
- gdk_pixmap_unref (pixmap);
- gtk_widget_show (priv->icon_widget);
-
- gtk_misc_set_alignment (GTK_MISC (priv->icon_widget), 1.0, .5);
- gtk_misc_set_padding (GTK_MISC (priv->icon_widget), 5, 0);
- gtk_box_pack_start (GTK_BOX (priv->hbox), priv->icon_widget, TRUE, TRUE, 2);
-}
-
-static void
-unrealize (GtkWidget *widget)
-{
- EShellFolderTitleBar *folder_title_bar;
- EShellFolderTitleBarPrivate *priv;
-
- (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
-
- folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (widget);
- priv = folder_title_bar->priv;
-
- gtk_widget_destroy (priv->icon_widget);
- priv->icon_widget = NULL;
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EShellFolderTitleBar *folder_title_bar;
- EShellFolderTitleBarPrivate *priv;
-
- folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (object);
- priv = folder_title_bar->priv;
-
- gdk_pixbuf_unref (priv->icon);
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-class_init (EShellFolderTitleBarClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- widget_class = GTK_WIDGET_CLASS (klass);
- widget_class->realize = realize;
- widget_class->unrealize = unrealize;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- signals[TITLE_TOGGLED] = gtk_signal_new ("title_toggled",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShellFolderTitleBarClass, title_toggled),
- gtk_marshal_NONE__BOOL,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_BOOL);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (EShellFolderTitleBar *shell_folder_title_bar)
-{
- EShellFolderTitleBarPrivate *priv;
-
- priv = g_new (EShellFolderTitleBarPrivate, 1);
-
- priv->icon = NULL;
- priv->icon_widget = NULL;
- priv->hbox = NULL;
- priv->label = NULL;
- priv->button_label = NULL;
- priv->button = NULL;
- priv->button_arrow = NULL;
-
- priv->clickable = TRUE;
-
- shell_folder_title_bar->priv = priv;
-}
-
-
-/**
- * e_shell_folder_title_bar_construct:
- * @folder_title_bar:
- *
- * Construct the folder title bar widget.
- **/
-void
-e_shell_folder_title_bar_construct (EShellFolderTitleBar *folder_title_bar)
-{
- EShellFolderTitleBarPrivate *priv;
- GtkRequisition button_requisition;
- GtkWidget *button_hbox;
- GtkWidget *widget;
-
- g_return_if_fail (folder_title_bar != NULL);
- g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar));
-
- priv = folder_title_bar->priv;
- widget = GTK_WIDGET (folder_title_bar);
-
- priv->label = gtk_label_new ("");
- gtk_misc_set_padding (GTK_MISC (priv->label), 5, 0);
- gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5);
-
- priv->button_label = gtk_label_new ("");
- gtk_misc_set_padding (GTK_MISC (priv->button_label), 5, 0);
- gtk_misc_set_alignment (GTK_MISC (priv->button_label), 0.0, 0.5);
- gtk_widget_show (priv->button_label);
-
- button_hbox = gtk_hbox_new (FALSE, 0);
- gtk_signal_connect (GTK_OBJECT (button_hbox), "realize",
- GTK_SIGNAL_FUNC (title_button_box_realize_cb), folder_title_bar);
- gtk_box_pack_start (GTK_BOX (button_hbox), priv->button_label, TRUE, TRUE, 0);
- gtk_widget_show (button_hbox);
-
- priv->button = gtk_toggle_button_new ();
- gtk_button_set_relief (GTK_BUTTON (priv->button), GTK_RELIEF_NONE);
- gtk_container_add (GTK_CONTAINER (priv->button), button_hbox);
- GTK_WIDGET_UNSET_FLAGS (priv->button, GTK_CAN_FOCUS);
- gtk_widget_show (priv->button);
-
- priv->hbox = gtk_hbox_new (FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (priv->hbox), 2);
- gtk_box_pack_start (GTK_BOX (priv->hbox), priv->label, FALSE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (priv->hbox), priv->button, FALSE, TRUE, 0);
-
- gtk_widget_show (priv->hbox);
-
- gtk_signal_connect (GTK_OBJECT (priv->button), "toggled",
- GTK_SIGNAL_FUNC (title_button_toggled_cb), folder_title_bar);
-
- gtk_container_add (GTK_CONTAINER (folder_title_bar), priv->hbox);
-
- gtk_signal_connect (GTK_OBJECT (folder_title_bar), "style_set",
- GTK_SIGNAL_FUNC (style_set_cb), NULL);
-
- e_shell_folder_title_bar_set_title (folder_title_bar, NULL);
-
- /* KLUDGE */
- gtk_widget_size_request (priv->button, &button_requisition);
- gtk_widget_set_usize (priv->label, button_requisition.width, button_requisition.height);
-}
-
-/**
- * e_shell_folder_title_bar_new:
- * @void:
- *
- * Create a new title bar widget.
- *
- * Return value:
- **/
-GtkWidget *
-e_shell_folder_title_bar_new (void)
-{
- EShellFolderTitleBar *new;
-
- new = gtk_type_new (e_shell_folder_title_bar_get_type ());
-
- e_shell_folder_title_bar_construct (new);
-
- return GTK_WIDGET (new);
-}
-
-/**
- * e_shell_folder_title_bar_set_title:
- * @folder_title_bar:
- * @title:
- *
- * Set the title for the title bar.
- **/
-void
-e_shell_folder_title_bar_set_title (EShellFolderTitleBar *folder_title_bar,
- const char *title)
-{
- EShellFolderTitleBarPrivate *priv;
-
- g_return_if_fail (folder_title_bar != NULL);
- g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar));
-
- priv = folder_title_bar->priv;
-
- if (title == NULL) {
- gtk_label_set_text (GTK_LABEL (priv->button_label), _("(Untitled)"));
- gtk_label_set_text (GTK_LABEL (priv->label), _("(Untitled)"));
- } else {
- gtk_label_set_text (GTK_LABEL (priv->button_label), title);
- gtk_label_set_text (GTK_LABEL (priv->label), title);
- }
-
- /* FIXME: There seems to be a bug in EClippedLabel, this is just a workaround. */
- gtk_widget_queue_draw (GTK_WIDGET (folder_title_bar));
-}
-
-/**
- * e_shell_folder_title_bar_set_icon:
- * @folder_title_bar:
- * @icon:
- *
- * Set the name of the icon for the title bar.
- **/
-void
-e_shell_folder_title_bar_set_icon (EShellFolderTitleBar *folder_title_bar,
- const GdkPixbuf *icon)
-{
- EShellFolderTitleBarPrivate *priv;
- GdkPixmap *pixmap;
-
- g_return_if_fail (icon != NULL);
-
- g_return_if_fail (folder_title_bar != NULL);
- g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar));
-
- priv = folder_title_bar->priv;
-
- gdk_pixbuf_ref ((GdkPixbuf *) icon);
- if (priv->icon)
- gdk_pixbuf_unref (priv->icon);
- priv->icon = (GdkPixbuf *) icon;
-
- pixmap = make_icon_pixmap (folder_title_bar, icon);
-
- gtk_pixmap_set (GTK_PIXMAP (priv->icon_widget), pixmap, NULL);
-}
-
-
-/**
- * e_shell_folder_title_bar_set_toggle_state:
- * @folder_title_bar:
- * @state:
- *
- * Set whether the title bar's button is in pressed state (TRUE) or not (FALSE).
- **/
-void
-e_shell_folder_title_bar_set_toggle_state (EShellFolderTitleBar *folder_title_bar,
- gboolean state)
-{
- EShellFolderTitleBarPrivate *priv;
-
- g_return_if_fail (folder_title_bar != NULL);
- g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar));
-
- priv = folder_title_bar->priv;
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->button), state);
-}
-
-/**
- * e_shell_folder_title_bar_set_clickable:
- * @folder_title_bar:
- * @clickable:
- *
- * Specify whether @folder_title_bar is clickable. If not, the arrow pixmap is not shown.
- **/
-void
-e_shell_folder_title_bar_set_clickable (EShellFolderTitleBar *folder_title_bar,
- gboolean clickable)
-{
- EShellFolderTitleBarPrivate *priv;
-
- g_return_if_fail (folder_title_bar != NULL);
- g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar));
-
- priv = folder_title_bar->priv;
-
- if ((priv->clickable && clickable) || (! priv->clickable && ! clickable))
- return;
-
- if (clickable) {
- gtk_widget_show (priv->button);
- gtk_widget_hide (priv->label);
- } else {
- gtk_widget_hide (priv->button);
- gtk_widget_show (priv->label);
- }
-
- priv->clickable = !! clickable;
-}
-
-
-E_MAKE_TYPE (e_shell_folder_title_bar, "EShellFolderTitleBar", EShellFolderTitleBar, class_init, init, PARENT_TYPE)
diff --git a/shell/e-shell-folder-title-bar.h b/shell/e-shell-folder-title-bar.h
deleted file mode 100644
index c8bab9994c..0000000000
--- a/shell/e-shell-folder-title-bar.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-folder-title-bar.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __E_SHELL_FOLDER_TITLE_BAR_H__
-#define __E_SHELL_FOLDER_TITLE_BAR_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkeventbox.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_SHELL_FOLDER_TITLE_BAR (e_shell_folder_title_bar_get_type ())
-#define E_SHELL_FOLDER_TITLE_BAR(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL_FOLDER_TITLE_BAR, EShellFolderTitleBar))
-#define E_SHELL_FOLDER_TITLE_BAR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_FOLDER_TITLE_BAR, EShellFolderTitleBarClass))
-#define E_IS_SHELL_FOLDER_TITLE_BAR(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_FOLDER_TITLE_BAR))
-#define E_IS_SHELL_FOLDER_TITLE_BAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_FOLDER_TITLE_BAR))
-
-
-typedef struct _EShellFolderTitleBar EShellFolderTitleBar;
-typedef struct _EShellFolderTitleBarPrivate EShellFolderTitleBarPrivate;
-typedef struct _EShellFolderTitleBarClass EShellFolderTitleBarClass;
-
-struct _EShellFolderTitleBar {
- GtkEventBox parent;
-
- EShellFolderTitleBarPrivate *priv;
-};
-
-struct _EShellFolderTitleBarClass {
- GtkEventBoxClass parent_class;
-
- /* Signals. */
- void (* title_toggled) (EShellFolderTitleBar *folder_title_bar, gboolean pressed);
-};
-
-
-GtkType e_shell_folder_title_bar_get_type (void);
-void e_shell_folder_title_bar_construct (EShellFolderTitleBar *folder_title_bar);
-GtkWidget *e_shell_folder_title_bar_new (void);
-
-void e_shell_folder_title_bar_set_title (EShellFolderTitleBar *folder_title_bar,
- const char *title);
-void e_shell_folder_title_bar_set_icon (EShellFolderTitleBar *folder_title_bar,
- const GdkPixbuf *icon);
-void e_shell_folder_title_bar_set_toggle_state (EShellFolderTitleBar *folder_title_bar,
- gboolean state);
-void e_shell_folder_title_bar_set_clickable (EShellFolderTitleBar *folder_title_bar,
- gboolean clickable);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_SHELL_FOLDER_TITLE_BAR_H__ */
diff --git a/shell/e-shell-utils.c b/shell/e-shell-utils.c
deleted file mode 100644
index 9065fc224c..0000000000
--- a/shell/e-shell-utils.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-utils.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-
-#include "e-shell-constants.h"
-
-#include "e-shell-utils.h"
-
-
-static char *
-get_icon_path (const char *icon_name)
-{
- char *icon_path;
-
- if (g_path_is_absolute (icon_name)) {
- icon_path = g_strdup (icon_name);
- } else {
- icon_path = gnome_pixmap_file (icon_name);
-
- if (icon_path == NULL)
- icon_path = g_concat_dir_and_file (EVOLUTION_IMAGES,
- icon_name);
- }
-
- if (g_file_exists (icon_path)) {
- return icon_path;
- } else {
- g_free (icon_path);
- return NULL;
- }
-}
-
-static char *
-get_mini_name (const char *icon_name)
-{
- const char *dot_ptr;
- const char *basename;
- char *name_without_extension;
- char *mini_name;
-
- basename = g_basename (icon_name);
- if (basename == NULL)
- return NULL;
-
- dot_ptr = strrchr (basename, '.');
-
- if (dot_ptr == NULL) {
- /* No extension. */
- return g_strconcat (icon_name, E_SHELL_MINI_ICON_SUFFIX, NULL);
- }
-
- name_without_extension = g_strndup (icon_name, dot_ptr - icon_name);
- mini_name = g_strconcat (name_without_extension, E_SHELL_MINI_ICON_SUFFIX,
- dot_ptr, NULL);
- g_free (name_without_extension);
-
- return mini_name;
-}
-
-
-char *
-e_shell_get_icon_path (const char *icon_name,
- gboolean try_mini)
-{
- if (try_mini) {
- char *path;
- char *mini_name;
-
- mini_name = get_mini_name (icon_name);
- if (mini_name == NULL) {
- path = NULL;
- } else {
- path = get_icon_path (mini_name);
- g_free (mini_name);
- }
-
- if (path != NULL)
- return path;
- }
-
- return get_icon_path (icon_name);
-}
diff --git a/shell/e-shell-utils.h b/shell/e-shell-utils.h
deleted file mode 100644
index a701dd38eb..0000000000
--- a/shell/e-shell-utils.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-utils.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef E_SHELL_UTILS_H
-#define E_SHELL_UTILS_H
-
-char *e_shell_get_icon_path (const char *icon_name,
- gboolean try_mini);
-
-#endif
diff --git a/shell/e-shell-view-menu.c b/shell/e-shell-view-menu.c
deleted file mode 100644
index 6cf7fe826a..0000000000
--- a/shell/e-shell-view-menu.c
+++ /dev/null
@@ -1,623 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-view.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Authors:
- * Miguel de Icaza
- * Ettore Perazzoli
- */
-
-#include <config.h>
-#include <gnome.h>
-
-#include "e-shell-folder-creation-dialog.h"
-#include "e-shell-folder-selection-dialog.h"
-
-#include "e-shell-constants.h"
-
-#include "e-shell-view-menu.h"
-
-
-/* EShellView callbacks. */
-
-static void
-shortcut_bar_mode_changed_cb (EShellView *shell_view,
- EShellViewSubwindowMode new_mode,
- void *data)
-{
- BonoboUIHandler *uih;
- const char *path;
- gboolean toggle_state;
-
- if (new_mode == E_SHELL_VIEW_SUBWINDOW_HIDDEN)
- toggle_state = FALSE;
- else
- toggle_state = TRUE;
-
- path = (const char *) data;
- uih = e_shell_view_get_bonobo_ui_handler (shell_view);
-
- bonobo_ui_handler_menu_set_toggle_state (uih, path, toggle_state);
-}
-
-static void
-folder_bar_mode_changed_cb (EShellView *shell_view,
- EShellViewSubwindowMode new_mode,
- void *data)
-{
- BonoboUIHandler *uih;
- const char *path;
- gboolean toggle_state;
-
- if (new_mode == E_SHELL_VIEW_SUBWINDOW_HIDDEN)
- toggle_state = FALSE;
- else
- toggle_state = TRUE;
-
- path = (const char *) data;
- uih = e_shell_view_get_bonobo_ui_handler (shell_view);
-
- bonobo_ui_handler_menu_set_toggle_state (uih, path, toggle_state);
-}
-
-
-/* Command callbacks. */
-static void
-command_quit (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- EShellView *shell_view;
- EShell *shell;
-
- shell_view = E_SHELL_VIEW (data);
-
- shell = e_shell_view_get_shell (shell_view);
- e_shell_quit (shell);
-}
-
-static void
-command_run_bugbuddy (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- int pid;
- char *args[] = {
- "bug-buddy",
- "--sm-disable",
- "--package=evolution",
- "--package-ver="VERSION,
- NULL
- };
- args[0] = gnome_is_program_in_path ("bug-buddy");
- if (!args[0]) {
- /* you might have to call gnome_dialog_run() on the
- * dialog returned here, I don't remember...
- */
- gnome_error_dialog (_("Bug buddy was not found in your $PATH."));
- }
- pid = gnome_execute_async (NULL, 4, args);
- g_free (args[0]);
- if (pid == -1) {
- /* same as above */
- gnome_error_dialog (_("Bug buddy could not be run."));
- }
-}
-
-static void
-zero_pointer(GtkObject *object, void **pointer)
-{
- *pointer = NULL;
-}
-
-static void
-command_about_box (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- static GtkWidget *about_box = NULL;
-
- if (about_box)
- gdk_window_raise(GTK_WIDGET(about_box)->window);
- else {
- const gchar *authors[] = {
- "Seth Alves",
- "Anders Carlsson",
- "Damon Chaplin",
- "Clifford R. Conover",
- "Miguel de Icaza",
- "Radek Doulik",
- "Arturo Espinoza",
- "Larry Ewing",
- "Nat Friedman",
- "Bertrand Guiheneuf",
- "Tuomas Kuosmanen",
- "Christopher J. Lahey",
- "Matthew Loper",
- "Federico Mena",
- "Eskil Heyn Olsen",
- "Ettore Perazzoli",
- "Jeffrey Stedfast",
- "Russell Steinthal",
- "Peter Teichman",
- "Chris Toshok",
- "Peter Williams",
- "Dan Winship",
- "Michael Zucchi",
- NULL};
-
- about_box = gnome_about_new(_("Evolution"),
- VERSION,
- _("Copyright 1999, 2000 Helix Code, Inc."),
- authors,
- _("Evolution is a suite of groupware applications\n"
- "for mail, calendaring, and contact management\n"
- "within the GNOME desktop environment."),
- NULL);
- gtk_signal_connect(GTK_OBJECT(about_box), "destroy",
- GTK_SIGNAL_FUNC(zero_pointer), &about_box);
- gtk_widget_show(about_box);
- }
-}
-
-static void
-command_help (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- char *url;
-
- url = g_strdup_printf ("ghelp:%s/gnome/help/evolution/C/%s",
- EVOLUTION_DATADIR, (char *)data);
- gnome_url_show (url);
-}
-
-static void
-command_toggle_folder_bar (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- EShellView *shell_view;
- EShellViewSubwindowMode mode;
- gboolean show;
-
- shell_view = E_SHELL_VIEW (data);
-
- show = bonobo_ui_handler_menu_get_toggle_state (uih, path);
- if (show)
- mode = E_SHELL_VIEW_SUBWINDOW_STICKY;
- else
- mode = E_SHELL_VIEW_SUBWINDOW_HIDDEN;
-
- e_shell_view_set_folder_bar_mode (shell_view, mode);
-}
-
-static void
-command_toggle_shortcut_bar (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- EShellView *shell_view;
- EShellViewSubwindowMode mode;
- gboolean show;
-
- shell_view = E_SHELL_VIEW (data);
-
- show = bonobo_ui_handler_menu_get_toggle_state (uih, path);
-
- if (show)
- mode = E_SHELL_VIEW_SUBWINDOW_STICKY;
- else
- mode = E_SHELL_VIEW_SUBWINDOW_HIDDEN;
-
- e_shell_view_set_shortcut_bar_mode (shell_view, mode);
-}
-
-
-static void
-command_new_folder (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- EShellView *shell_view;
- EShell *shell;
- const char *current_uri;
- const char *default_parent_folder;
-
- shell_view = E_SHELL_VIEW (data);
- shell = e_shell_view_get_shell (shell_view);
- current_uri = e_shell_view_get_current_uri (shell_view);
-
- if (strncmp (current_uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0)
- default_parent_folder = current_uri + E_SHELL_URI_PREFIX_LEN;
- else
- default_parent_folder = NULL;
-
- e_shell_show_folder_creation_dialog (shell, GTK_WINDOW (shell_view),
- default_parent_folder);
-}
-
-static void
-command_new_view (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- EShellView *shell_view;
- EShell *shell;
- const char *current_uri;
-
- shell_view = E_SHELL_VIEW (data);
- shell = e_shell_view_get_shell (shell_view);
- current_uri = e_shell_view_get_current_uri (shell_view);
-
- e_shell_new_view (shell, current_uri);
-}
-
-
-/* Going to a folder. */
-
-static void
-folder_selection_dialog_cancelled_cb (EShellFolderSelectionDialog *folder_selection_dialog,
- void *data)
-{
- EShellView *shell_view;
-
- shell_view = E_SHELL_VIEW (data);
-
- gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog));
-}
-
-static void
-folder_selection_dialog_folder_selected_cb (EShellFolderSelectionDialog *folder_selection_dialog,
- const char *path,
- void *data)
-{
- if (path != NULL) {
- EShellView *shell_view;
- char *uri;
-
- shell_view = E_SHELL_VIEW (data);
-
- uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL);
- e_shell_view_display_uri (shell_view, uri);
- g_free (uri);
- }
-}
-
-static void
-command_goto_folder (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- GtkWidget *folder_selection_dialog;
- EShellView *shell_view;
- EShell *shell;
- const char *current_uri;
-
- shell_view = E_SHELL_VIEW (data);
- shell = e_shell_view_get_shell (shell_view);
-
- current_uri = e_shell_view_get_current_uri (shell_view);
-
- folder_selection_dialog = e_shell_folder_selection_dialog_new (shell,
- _("Go to folder..."),
- current_uri,
- NULL);
-
- gtk_window_set_transient_for (GTK_WINDOW (folder_selection_dialog), GTK_WINDOW (shell_view));
-
- gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "folder_selected",
- GTK_SIGNAL_FUNC (folder_selection_dialog_folder_selected_cb), shell_view);
- gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "cancelled",
- GTK_SIGNAL_FUNC (folder_selection_dialog_cancelled_cb), shell_view);
-
- gtk_widget_show (folder_selection_dialog);
-}
-
-static void
-command_create_folder (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- EShellView *shell_view;
- EShell *shell;
- const char *current_uri;
- const char *default_folder;
-
- shell_view = E_SHELL_VIEW (data);
- shell = e_shell_view_get_shell (shell_view);
-
- current_uri = e_shell_view_get_current_uri (shell_view);
-
- if (strncmp (current_uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0)
- default_folder = current_uri + E_SHELL_URI_PREFIX_LEN;
- else
- default_folder = NULL;
-
- e_shell_show_folder_creation_dialog (shell, GTK_WINDOW (shell_view), default_folder);
-}
-
-
-/* Unimplemented commands. */
-
-#define DEFINE_UNIMPLEMENTED(func) \
-static void \
-func (BonoboUIHandler *uih, void *data, const char *path) \
-{ \
- g_warning ("EShellView: %s: not implemented.", __FUNCTION__); \
-} \
-
-DEFINE_UNIMPLEMENTED (command_new_shortcut)
-DEFINE_UNIMPLEMENTED (command_new_mail_message)
-DEFINE_UNIMPLEMENTED (command_new_contact)
-DEFINE_UNIMPLEMENTED (command_new_task_request)
-
-
-static void
-menu_create_file_new (BonoboUIHandler *uih,
- void *data)
-{
- bonobo_ui_handler_menu_new_subtree (uih, "/File/New",
- _("_New"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/New/View",
- _("_View"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 'v', GDK_CONTROL_MASK | GDK_SHIFT_MASK,
- command_new_view, data);
- bonobo_ui_handler_menu_new_item (uih, "/File/New/View",
- _("_Folder"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 'f', GDK_CONTROL_MASK | GDK_SHIFT_MASK,
- command_new_folder, data);
- bonobo_ui_handler_menu_new_item (uih, "/File/New/Evolution bar shortcut",
- _("Evolution bar _shortcut"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 's', GDK_CONTROL_MASK | GDK_SHIFT_MASK,
- command_new_shortcut, data);
-
- bonobo_ui_handler_menu_new_separator (uih, "/File/New/Separator1", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/New/Mail message",
- _("_Mail message (FIXME)"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 'm', GDK_CONTROL_MASK | GDK_SHIFT_MASK,
- command_new_mail_message, data);
- bonobo_ui_handler_menu_new_item (uih, "/File/New/Appointment",
- _("_Appointment (FIXME)"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 'a', GDK_CONTROL_MASK | GDK_SHIFT_MASK,
- command_new_shortcut, data);
- bonobo_ui_handler_menu_new_item (uih, "/File/New/Contact",
- _("_Contact (FIXME)"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 'c', GDK_CONTROL_MASK | GDK_SHIFT_MASK,
- command_new_contact, data);
- bonobo_ui_handler_menu_new_item (uih, "/File/New/Contact",
- _("_Task (FIXME)"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 't', GDK_CONTROL_MASK | GDK_SHIFT_MASK,
- command_new_task_request, data);
-}
-
-static void
-menu_create_file (BonoboUIHandler *uih,
- void *data)
-{
- bonobo_ui_handler_menu_new_subtree (uih, "/File",
- _("_File"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-
- menu_create_file_new (uih, data);
-
- bonobo_ui_handler_menu_new_separator (uih, "/File/Separator1", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/Go to folder",
- _("_Go to Folder..."),
- _("Display a different folder"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- command_goto_folder, data);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/Create new folder",
- _("_Create New Folder..."),
- _("Create a new folder"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- command_create_folder, data);
-
- bonobo_ui_handler_menu_new_placeholder (uih, "/File/<Print Placeholder>");
-
- bonobo_ui_handler_menu_new_separator (uih, "/File/Separator2", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/File/Exit",
- _("E_xit..."),
- _("Create a new folder"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_STOCK,
- GNOME_STOCK_MENU_EXIT,
- 0, 0,
- command_quit, data);
-}
-
-static void
-menu_create_edit (BonoboUIHandler *uih,
- void *data)
-{
- bonobo_ui_handler_menu_new_subtree (uih, "/Edit",
- _("_Edit"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-}
-
-static void
-menu_create_view (BonoboUIHandler *uih,
- void *data)
-{
- bonobo_ui_handler_menu_new_subtree (uih, "/View",
- _("_View"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-
- bonobo_ui_handler_menu_new_toggleitem (uih, "/View/Show shortcut bar",
- _("Show _Shortcut Bar"),
- _("Show the shortcut bar"),
- -1,
- 0, 0,
- command_toggle_shortcut_bar, data);
- bonobo_ui_handler_menu_new_toggleitem (uih, "/View/Show folder bar",
- _("Show _Folder Bar"),
- _("Show the folder bar"),
- -1,
- 0, 0,
- command_toggle_folder_bar, data);
-}
-
-static void
-menu_create_settings (BonoboUIHandler *uih,
- void *data)
-{
- bonobo_ui_handler_menu_new_subtree (uih, "/Settings",
- _("_Settings"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-}
-
-static void
-menu_create_help (BonoboUIHandler *uih,
- void *data)
-{
- bonobo_ui_handler_menu_new_subtree (uih, "/Help",
- _("_Help"),
- NULL, -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0);
-
- bonobo_ui_handler_menu_new_item (uih, "/Help/Help index",
- _("Help _Index"),
- NULL,
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- command_help, "index.html");
- bonobo_ui_handler_menu_new_item (uih, "/Help/Getting started",
- _("Getting _Started"),
- NULL,
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- command_help, "usage-mainwindow.html");
- bonobo_ui_handler_menu_new_item (uih, "/Help/Using the mailer",
- _("Using the _Mailer"),
- NULL,
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- command_help, "usage-mail.html");
- bonobo_ui_handler_menu_new_item (uih, "/Help/Using the calendar",
- _("Using the _Calendar"),
- NULL,
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- command_help, "usage-calendar.html");
- bonobo_ui_handler_menu_new_item (uih, "/Help/Using the contact manager",
- _("Using the C_ontact Manager"),
- NULL,
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- command_help, "usage-contact.html");
-
- bonobo_ui_handler_menu_new_separator (uih, "/Help/Separator1", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/Help/Submit bug report",
- _("_Submit Bug Report"),
- _("Submit bug report using Bug Buddy"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- command_run_bugbuddy, data);
-
- bonobo_ui_handler_menu_new_separator (uih, "/Help/Separator2", -1);
-
- bonobo_ui_handler_menu_new_item (uih, "/Help/About Evolution",
- _("_About Evolution..."),
- _("Show information about Evolution"),
- -1,
- BONOBO_UI_HANDLER_PIXMAP_NONE, NULL,
- 0, 0,
- command_about_box, data);
-}
-
-
-/* FIXME these must match the corresponding setup in the GnomeUIInfo and this sucks sucks. */
-#define SHORTCUT_BAR_TOGGLE_PATH "/View/Show shortcut bar"
-#define FOLDER_BAR_TOGGLE_PATH "/View/Show folder bar"
-
-void
-e_shell_view_menu_setup (EShellView *shell_view)
-{
- BonoboUIHandler *uih;
-
- g_return_if_fail (shell_view != NULL);
- g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
-
- uih = e_shell_view_get_bonobo_ui_handler (shell_view);
-
- menu_create_file (uih, shell_view);
- menu_create_edit (uih, shell_view);
- menu_create_view (uih, shell_view);
- menu_create_settings (uih, shell_view);
-
- bonobo_ui_handler_menu_new_placeholder (uih, "/<Component Placeholder>");
-
- menu_create_help (uih, shell_view);
-
- gtk_signal_connect (GTK_OBJECT (shell_view), "shortcut_bar_mode_changed",
- GTK_SIGNAL_FUNC (shortcut_bar_mode_changed_cb),
- SHORTCUT_BAR_TOGGLE_PATH);
- gtk_signal_connect (GTK_OBJECT (shell_view), "folder_bar_mode_changed",
- GTK_SIGNAL_FUNC (folder_bar_mode_changed_cb),
- FOLDER_BAR_TOGGLE_PATH);
-
- /* Initialize the toggles. Yeah, this is, well, yuck. */
-
- folder_bar_mode_changed_cb (shell_view, e_shell_view_get_folder_bar_mode (shell_view),
- FOLDER_BAR_TOGGLE_PATH);
- shortcut_bar_mode_changed_cb (shell_view, e_shell_view_get_shortcut_bar_mode (shell_view),
- SHORTCUT_BAR_TOGGLE_PATH);
-}
diff --git a/shell/e-shell-view-menu.h b/shell/e-shell-view-menu.h
deleted file mode 100644
index fb86cb9e98..0000000000
--- a/shell/e-shell-view-menu.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-view.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Authors:
- * Miguel de Icaza
- * Ettore Perazzoli
- */
-
-#ifndef E_SHELL_VIEW_MENU_H
-#define E_SHELL_VIEW_MENU_H
-
-#include <bonobo/bonobo-ui-handler.h>
-
-#include "e-shell-view.h"
-
-void e_shell_view_menu_setup (EShellView *shell_view);
-
-#endif
diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c
deleted file mode 100644
index c7bc911aad..0000000000
--- a/shell/e-shell-view.c
+++ /dev/null
@@ -1,1379 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-view.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Authors:
- * Ettore Perazzoli <ettore@helixcode.com>
- * Miguel de Icaza <miguel@helixcode.com>
- * Matt Loper <matt@helixcode.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-#include <bonobo.h>
-#include <libgnomeui/gnome-window-icon.h>
-
-#include "widgets/misc/e-clipped-label.h"
-#include "e-util/e-util.h"
-#include "e-util/e-gui-utils.h"
-
-#include "evolution-shell-view.h"
-
-#include "e-shell-constants.h"
-#include "e-shell-folder-title-bar.h"
-#include "e-shell-utils.h"
-#include "e-shell.h"
-#include "e-shortcuts-view.h"
-#include "e-storage-set-view.h"
-#include "e-title-bar.h"
-
-#include "e-shell-view.h"
-#include "e-shell-view-menu.h"
-
-#include <widgets/e-paned/e-hpaned.h>
-
-
-#define PARENT_TYPE gnome_app_get_type () /* Losing GnomeApp does not define GNOME_TYPE_APP. */
-static GnomeAppClass *parent_class = NULL;
-
-struct _EShellViewPrivate {
- /* The shell. */
- EShell *shell;
-
- /* The UI handler. */
- BonoboUIHandler *uih;
-
- /* Currently displayed URI. */
- char *uri;
-
- /* The widgetry. */
- GtkWidget *appbar;
- GtkWidget *hpaned;
- GtkWidget *view_vbox;
- GtkWidget *view_title_bar;
- GtkWidget *view_hpaned;
- GtkWidget *contents;
- GtkWidget *notebook;
- GtkWidget *shortcut_bar;
- GtkWidget *storage_set_title_bar;
- GtkWidget *storage_set_view;
- GtkWidget *storage_set_view_box;
-
- /* The view we have already open. */
- GHashTable *uri_to_control;
-
- /* Position of the handles in the paneds, to be restored when we show elements
- after hiding them. */
- unsigned int hpaned_position;
- unsigned int view_hpaned_position;
-
- /* Status of the shortcut and folder bars. */
- EShellViewSubwindowMode shortcut_bar_mode;
- EShellViewSubwindowMode folder_bar_mode;
-
- /* Timeout ID for the progress bar. */
- int progress_bar_timeout_id;
-
- /* Status of the progress bar. */
- int progress_bar_value;
-};
-
-enum {
- SHORTCUT_BAR_MODE_CHANGED,
- FOLDER_BAR_MODE_CHANGED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-#define DEFAULT_SHORTCUT_BAR_WIDTH 100
-#define DEFAULT_TREE_WIDTH 130
-
-#define DEFAULT_WIDTH 705
-#define DEFAULT_HEIGHT 550
-
-
-/* Utility functions. */
-
-static GtkWidget *
-create_label_for_empty_page (void)
-{
- GtkWidget *label;
-
- label = e_clipped_label_new (_("(No folder displayed)"));
- gtk_widget_show (label);
-
- return label;
-}
-
-/* FIXME this is broken. */
-static gboolean
-bonobo_widget_is_dead (BonoboWidget *bonobo_widget)
-{
- BonoboControlFrame *control_frame;
- CORBA_Object corba_object;
- CORBA_Environment ev;
- gboolean is_dead;
-
- control_frame = bonobo_widget_get_control_frame (bonobo_widget);
- corba_object = bonobo_control_frame_get_control (control_frame);
-
- CORBA_exception_init (&ev);
- is_dead = CORBA_Object_non_existent (corba_object, &ev);
- CORBA_exception_free (&ev);
-
- return is_dead;
-}
-
-
-/* Folder bar pop-up handling. */
-
-static void disconnect_popup_signals (EShellView *shell_view);
-
-static void
-storage_set_view_box_button_release_event_cb (GtkWidget *widget,
- GdkEventButton *button_event,
- void *data)
-{
- EShellView *shell_view;
- EShellViewPrivate *priv;
-
- shell_view = E_SHELL_VIEW (data);
- priv = shell_view->priv;
-
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- gtk_grab_remove (priv->storage_set_view_box);
-
- e_shell_view_set_folder_bar_mode (shell_view, E_SHELL_VIEW_SUBWINDOW_HIDDEN);
-
- disconnect_popup_signals (shell_view);
-
- e_shell_folder_title_bar_set_toggle_state (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar), FALSE);
-}
-
-static void
-popup_storage_set_view_close_button_clicked (ETitleBar *title_bar,
- void *data)
-{
- EShellView *shell_view;
- EShellViewPrivate *priv;
-
- shell_view = E_SHELL_VIEW (data);
- priv = shell_view->priv;
-
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- gtk_grab_remove (priv->storage_set_view_box);
-
- disconnect_popup_signals (shell_view);
-
- e_shell_view_set_folder_bar_mode (shell_view, E_SHELL_VIEW_SUBWINDOW_STICKY);
- e_shell_folder_title_bar_set_toggle_state (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar), FALSE);
-}
-
-static void
-storage_set_view_box_map_cb (GtkWidget *widget,
- void *data)
-{
- EShellView *shell_view;
- EShellViewPrivate *priv;
-
- shell_view = E_SHELL_VIEW (data);
- priv = shell_view->priv;
-
- if ((gdk_pointer_grab (widget->window, TRUE,
- (GDK_BUTTON_PRESS_MASK
- | GDK_BUTTON_RELEASE_MASK
- | GDK_ENTER_NOTIFY_MASK
- | GDK_LEAVE_NOTIFY_MASK
- | GDK_POINTER_MOTION_MASK),
- NULL, NULL, GDK_CURRENT_TIME) != 0)) {
- g_warning ("%s -- pointer grab failed.", __FUNCTION__);
- e_shell_view_set_folder_bar_mode (shell_view, E_SHELL_VIEW_SUBWINDOW_STICKY);
- return;
- }
-
- gtk_grab_add (widget);
- gtk_signal_connect (GTK_OBJECT (widget), "button_release_event",
- GTK_SIGNAL_FUNC (storage_set_view_box_button_release_event_cb), shell_view);
- gtk_signal_connect (GTK_OBJECT (priv->storage_set_view), "button_release_event",
- GTK_SIGNAL_FUNC (storage_set_view_box_button_release_event_cb), shell_view);
- gtk_signal_connect (GTK_OBJECT (priv->storage_set_title_bar), "close_button_clicked",
- GTK_SIGNAL_FUNC (popup_storage_set_view_close_button_clicked), shell_view);
-}
-
-static void
-disconnect_popup_signals (EShellView *shell_view)
-{
- EShellViewPrivate *priv;
-
- priv = shell_view->priv;
-
- gtk_signal_disconnect_by_func (GTK_OBJECT (priv->storage_set_view_box),
- GTK_SIGNAL_FUNC (storage_set_view_box_button_release_event_cb),
- shell_view);
- gtk_signal_disconnect_by_func (GTK_OBJECT (priv->storage_set_view),
- GTK_SIGNAL_FUNC (storage_set_view_box_button_release_event_cb),
- shell_view);
- gtk_signal_disconnect_by_func (GTK_OBJECT (priv->storage_set_title_bar),
- GTK_SIGNAL_FUNC (popup_storage_set_view_close_button_clicked),
- shell_view);
- gtk_signal_disconnect_by_func (GTK_OBJECT (priv->storage_set_view_box),
- GTK_SIGNAL_FUNC (storage_set_view_box_map_cb),
- shell_view);
-}
-
-static void
-pop_up_folder_bar (EShellView *shell_view)
-{
- EShellViewPrivate *priv;
-
- priv = shell_view->priv;
-
- priv->folder_bar_mode = E_SHELL_VIEW_SUBWINDOW_TRANSIENT;
-
- /* We need to show the storage set view box and do a pointer grab to catch the
- mouse clicks. But until the box is shown, we cannot grab. So we connect to
- the "map" signa; `storage_set_view_box_map_cb' will do the grab. */
-
- gtk_signal_connect (GTK_OBJECT (priv->storage_set_view_box), "map",
- GTK_SIGNAL_FUNC (storage_set_view_box_map_cb), shell_view);
- gtk_widget_show (priv->storage_set_view_box);
-
- e_paned_set_position (E_PANED (priv->view_hpaned), priv->view_hpaned_position);
-}
-
-
-/* Callbacks. */
-
-/* Callback called when an icon on the shortcut bar gets clicked. */
-static void
-activate_shortcut_cb (EShortcutsView *shortcut_view,
- EShortcuts *shortcuts,
- const char *uri,
- void *data)
-{
- EShellView *shell_view;
-
- shell_view = E_SHELL_VIEW (data);
-
- e_shell_view_display_uri (shell_view, uri);
-}
-
-/* Callback called when a folder on the tree view gets clicked. */
-static void
-folder_selected_cb (EStorageSetView *storage_set_view,
- const char *path,
- void *data)
-{
- EShellView *shell_view;
- char *uri;
-
- shell_view = E_SHELL_VIEW (data);
-
- uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL);
- e_shell_view_display_uri (shell_view, uri);
- g_free (uri);
-}
-
-/* Callback called when the close button on the tree's title bar is clicked. */
-static void
-storage_set_view_close_button_clicked_cb (ETitleBar *title_bar,
- void *data)
-{
- EShellView *shell_view;
-
- shell_view = E_SHELL_VIEW (data);
-
- e_shell_view_set_folder_bar_mode (shell_view, E_SHELL_VIEW_SUBWINDOW_HIDDEN);
-}
-
-/* Callback called when the title bar button has been pressed. */
-static void
-title_bar_toggled_cb (EShellFolderTitleBar *title_bar,
- gboolean state,
- void *data)
-{
- EShellView *shell_view;
-
- shell_view = E_SHELL_VIEW (data);
-
- if (! state)
- return;
-
- if (e_shell_view_get_folder_bar_mode (shell_view) != E_SHELL_VIEW_SUBWINDOW_TRANSIENT)
- pop_up_folder_bar (shell_view);
-}
-
-
-/* Widget setup. */
-
-static void
-setup_storage_set_subwindow (EShellView *shell_view)
-{
- EShellViewPrivate *priv;
- GtkWidget *storage_set_view;
- GtkWidget *vbox;
- GtkWidget *scrolled_window;
-
- priv = shell_view->priv;
-
- storage_set_view = e_storage_set_view_new (e_shell_get_storage_set (priv->shell));
- gtk_signal_connect (GTK_OBJECT (storage_set_view), "folder_selected",
- GTK_SIGNAL_FUNC (folder_selected_cb), shell_view);
-
- 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_container_add (GTK_CONTAINER (scrolled_window), storage_set_view);
-
- vbox = gtk_vbox_new (FALSE, 0);
- priv->storage_set_title_bar = e_title_bar_new (_("Folders"));
-
- gtk_box_pack_start (GTK_BOX (vbox), priv->storage_set_title_bar, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
-
- gtk_signal_connect (GTK_OBJECT (priv->storage_set_title_bar), "close_button_clicked",
- GTK_SIGNAL_FUNC (storage_set_view_close_button_clicked_cb), shell_view);
-
- gtk_widget_show (vbox);
- gtk_widget_show (storage_set_view);
- gtk_widget_show (priv->storage_set_title_bar);
- gtk_widget_show (scrolled_window);
-
- priv->storage_set_view_box = vbox;
- priv->storage_set_view = storage_set_view;
-}
-
-static void
-setup_widgets (EShellView *shell_view)
-{
- EShellViewPrivate *priv;
- GtkWidget *progress_bar;
-
- priv = shell_view->priv;
-
- /* The application bar. */
-
- priv->appbar = gnome_appbar_new (TRUE, TRUE, GNOME_PREFERENCES_NEVER);
- gnome_app_set_statusbar (GNOME_APP (shell_view), priv->appbar);
-
- /* The progress bar. */
-
- progress_bar = GNOME_APPBAR (GNOME_APP (shell_view)->statusbar)->progress;
-
- gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (progress_bar), GTK_PROGRESS_LEFT_TO_RIGHT);
- gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (progress_bar), GTK_PROGRESS_CONTINUOUS);
-
- /* The shortcut bar. */
-
- priv->shortcut_bar = e_shortcuts_new_view (e_shell_get_shortcuts (priv->shell));
- gtk_signal_connect (GTK_OBJECT (priv->shortcut_bar), "activate_shortcut",
- GTK_SIGNAL_FUNC (activate_shortcut_cb), shell_view);
-
- /* The storage set view. */
-
- setup_storage_set_subwindow (shell_view);
-
- /* The tabless notebook which we used to contain the 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);
-
- /* Page for "No URL displayed" message. */
-
- gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), create_label_for_empty_page (), NULL);
-
- /* Put things into a paned and the paned into the GnomeApp. */
-
- priv->view_vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (priv->view_vbox), 2);
-
- priv->view_title_bar = e_shell_folder_title_bar_new ();
- gtk_signal_connect (GTK_OBJECT (priv->view_title_bar), "title_toggled",
- GTK_SIGNAL_FUNC (title_bar_toggled_cb), shell_view);
-
- priv->view_hpaned = e_hpaned_new ();
- e_paned_add1 (E_PANED (priv->view_hpaned), priv->storage_set_view_box);
- e_paned_add2 (E_PANED (priv->view_hpaned), priv->notebook);
- e_paned_set_position (E_PANED (priv->view_hpaned), DEFAULT_TREE_WIDTH);
-
- gtk_box_pack_start (GTK_BOX (priv->view_vbox), priv->view_title_bar,
- FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (priv->view_vbox), priv->view_hpaned,
- TRUE, TRUE, 2);
-
- priv->hpaned = e_hpaned_new ();
- e_paned_add1 (E_PANED (priv->hpaned), priv->shortcut_bar);
- e_paned_add2 (E_PANED (priv->hpaned), priv->view_vbox);
- e_paned_set_position (E_PANED (priv->hpaned), DEFAULT_SHORTCUT_BAR_WIDTH);
-
- gnome_app_set_contents (GNOME_APP (shell_view), priv->hpaned);
-
- /* Show stuff. */
-
- gtk_widget_show (priv->shortcut_bar);
- gtk_widget_show (priv->storage_set_view);
- gtk_widget_show (priv->storage_set_view_box);
- gtk_widget_show (priv->notebook);
- gtk_widget_show (priv->hpaned);
- gtk_widget_show (priv->view_hpaned);
- gtk_widget_show (priv->view_vbox);
- gtk_widget_show (priv->view_title_bar);
-
- /* By default, both the folder bar and shortcut bar are visible. */
- priv->shortcut_bar_mode = E_SHELL_VIEW_SUBWINDOW_STICKY;
- priv->folder_bar_mode = E_SHELL_VIEW_SUBWINDOW_STICKY;
-
- /* FIXME: Session management and stuff? */
- gtk_window_set_default_size (GTK_WINDOW (shell_view), DEFAULT_WIDTH, DEFAULT_HEIGHT);
-}
-
-
-/* BonoboUIHandler setup. */
-
-static void
-setup_bonobo_ui_handler (EShellView *shell_view)
-{
- BonoboUIHandler *uih;
- EShellViewPrivate *priv;
-
- priv = shell_view->priv;
-
- uih = bonobo_ui_handler_new ();
-
- bonobo_ui_handler_set_app (uih, GNOME_APP (shell_view));
- bonobo_ui_handler_create_menubar (uih);
- /* bonobo_ui_handler_create_toolbar (uih, "Toolbar"); */
- bonobo_ui_handler_set_statusbar (uih, priv->appbar);
-
- priv->uih = uih;
-}
-
-
-/* GtkObject methods. */
-
-static void
-hash_forall_destroy_control (void *name,
- void *value,
- void *data)
-{
- BonoboWidget *bonobo_widget;
-
- bonobo_widget = BONOBO_WIDGET (value);
- gtk_widget_destroy (GTK_WIDGET (bonobo_widget));
-
- g_free (name);
-}
-
-static void
-destroy (GtkObject *object)
-{
- EShellView *shell_view;
- EShellViewPrivate *priv;
-
- shell_view = E_SHELL_VIEW (object);
- priv = shell_view->priv;
-
- g_hash_table_foreach (priv->uri_to_control, hash_forall_destroy_control, NULL);
- g_hash_table_destroy (priv->uri_to_control);
-
- bonobo_object_unref (BONOBO_OBJECT (priv->uih));
-
- g_free (priv->uri);
-
- if (priv->progress_bar_timeout_id != 0)
- gtk_timeout_remove (priv->progress_bar_timeout_id);
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-/* Unrealize handler */
-static void
-unrealize (GtkWidget *widget)
-{
- if (GTK_WIDGET_CLASS (parent_class)->unrealize)
- (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
-
- /* We flush so that all the destroy window requests for foreign windows
- * get sent over the X wire. Hopefully this will diminish the chance of
- * hitting the CORBA (sync) vs. Xlib (async) race conditions. This is
- * not the complete fix, which should actually be put in Bonobo and
- * completed. FIXME.
- */
- gdk_flush ();
-}
-
-static int
-delete_event (GtkWidget *widget,
- GdkEventAny *event)
-{
- EShellView *shell_view;
- EShell *shell;
-
- shell_view = E_SHELL_VIEW (widget);
-
- shell = e_shell_view_get_shell (shell_view);
- e_shell_quit (shell);
- /* FIXME: Is this right, or should it be FALSE? */
- return TRUE;
-}
-
-
-/* Initialization. */
-
-static void
-class_init (EShellViewClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass *) klass;
- widget_class = (GtkWidgetClass *) klass;
-
- object_class->destroy = destroy;
-
- widget_class->unrealize = unrealize;
- widget_class->delete_event = delete_event;
-
- parent_class = gtk_type_class (gnome_app_get_type ());
-
- signals[SHORTCUT_BAR_MODE_CHANGED]
- = gtk_signal_new ("shortcut_bar_mode_changed",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShellViewClass, shortcut_bar_mode_changed),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_INT);
-
- signals[FOLDER_BAR_MODE_CHANGED]
- = gtk_signal_new ("folder_bar_mode_changed",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShellViewClass, folder_bar_mode_changed),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (EShellView *shell_view)
-{
- EShellViewPrivate *priv;
-
- priv = g_new (EShellViewPrivate, 1);
-
- priv->shell = NULL;
- priv->uih = NULL;
- priv->uri = NULL;
-
- priv->appbar = NULL;
- priv->hpaned = NULL;
- priv->view_hpaned = NULL;
- priv->contents = NULL;
- priv->notebook = NULL;
-
- priv->storage_set_title_bar = NULL;
- priv->storage_set_view = NULL;
- priv->storage_set_view_box = NULL;
- priv->shortcut_bar = NULL;
-
- priv->shortcut_bar_mode = E_SHELL_VIEW_SUBWINDOW_HIDDEN;
- priv->folder_bar_mode = E_SHELL_VIEW_SUBWINDOW_HIDDEN;
-
- priv->hpaned_position = 0;
- priv->view_hpaned_position = 0;
-
- priv->uri_to_control = g_hash_table_new (g_str_hash, g_str_equal);
-
- priv->progress_bar_timeout_id = 0;
- priv->progress_bar_value = 0;
-
- shell_view->priv = priv;
-}
-
-
-/* Progress bar handling. */
-
-#define PROGRESS_BAR_TIMEOUT 80
-
-static int
-progress_bar_timeout_cb (void *data)
-{
- EShellView *shell_view;
- EShellViewPrivate *priv;
- GtkWidget *progress_bar;
-
- shell_view = E_SHELL_VIEW (data);
- priv = shell_view->priv;
- progress_bar = GNOME_APPBAR (GNOME_APP (shell_view)->statusbar)->progress;
-
- priv->progress_bar_value = ! priv->progress_bar_value;
- gtk_progress_set_value (GTK_PROGRESS (progress_bar), priv->progress_bar_value);
-
- return TRUE;
-}
-
-static void
-start_progress_bar (EShellView *shell_view)
-{
- EShellViewPrivate *priv;
- GtkWidget *progress_bar;
-
- priv = shell_view->priv;
- progress_bar = GNOME_APPBAR (GNOME_APP (shell_view)->statusbar)->progress;
-
- if (priv->progress_bar_timeout_id != 0)
- return;
-
- priv->progress_bar_timeout_id = gtk_timeout_add (PROGRESS_BAR_TIMEOUT,
- progress_bar_timeout_cb,
- shell_view);
-
- gtk_progress_set_activity_mode (GTK_PROGRESS (progress_bar), TRUE);
- gtk_progress_set_value (GTK_PROGRESS (progress_bar), priv->progress_bar_value);
-}
-
-static void
-stop_progress_bar (EShellView *shell_view)
-{
- EShellViewPrivate *priv;
- GtkWidget *progress_bar;
-
- priv = shell_view->priv;
- progress_bar = GNOME_APPBAR (GNOME_APP (shell_view)->statusbar)->progress;
-
- if (priv->progress_bar_timeout_id != 0) {
- gtk_timeout_remove (priv->progress_bar_timeout_id);
- priv->progress_bar_timeout_id = 0;
- }
-
- gtk_progress_set_activity_mode (GTK_PROGRESS (progress_bar), FALSE);
- gtk_progress_set_value (GTK_PROGRESS (progress_bar), 0);
-}
-
-
-/* EvolutionShellView interface callbacks. */
-
-static void
-shell_view_interface_set_message_cb (EvolutionShellView *shell_view,
- const char *message,
- gboolean busy,
- void *data)
-{
- GnomeApp *app;
- GnomeAppBar *app_bar;
-
- app = GNOME_APP (data);
- app_bar = GNOME_APPBAR (app->statusbar);
-
- gtk_progress_set_value (GTK_PROGRESS (app_bar->progress), 1.0);
-
- if (message != NULL)
- gnome_appbar_set_status (app_bar, message);
- else
- gnome_appbar_set_status (app_bar, "");
-
- if (busy)
- start_progress_bar (E_SHELL_VIEW (data));
- else
- stop_progress_bar (E_SHELL_VIEW (data));
-}
-
-static void
-shell_view_interface_unset_message_cb (EvolutionShellView *shell_view,
- void *data)
-{
- GnomeApp *app;
- GnomeAppBar *app_bar;
-
- app = GNOME_APP (data);
- app_bar = GNOME_APPBAR (app->statusbar);
-
- gnome_appbar_set_status (app_bar, "");
-
- stop_progress_bar (E_SHELL_VIEW (data));
-}
-
-
-void
-e_shell_view_construct (EShellView *shell_view,
- EShell *shell)
-{
- EShellViewPrivate *priv;
-
- g_return_if_fail (shell_view != NULL);
- g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
- g_return_if_fail (shell != NULL);
- g_return_if_fail (E_IS_SHELL (shell));
-
- priv = shell_view->priv;
-
- gnome_app_construct (GNOME_APP (shell_view), "evolution", "Evolution");
-
- priv->shell = shell;
-
- setup_widgets (shell_view);
- setup_bonobo_ui_handler (shell_view);
-
- e_shell_view_menu_setup (shell_view);
-
- e_shell_view_set_folder_bar_mode (shell_view, E_SHELL_VIEW_SUBWINDOW_HIDDEN);
-}
-
-GtkWidget *
-e_shell_view_new (EShell *shell)
-{
- GtkWidget *new;
-
- g_return_val_if_fail (shell != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
- new = gtk_type_new (e_shell_view_get_type ());
- e_shell_view_construct (E_SHELL_VIEW (new), shell);
-
- return new;
-}
-
-
-static const char *
-get_storage_set_path_from_uri (const char *uri)
-{
- const char *colon;
-
- if (uri == NULL)
- return NULL;
-
- if (g_path_is_absolute (uri))
- return NULL;
-
- colon = strchr (uri, ':');
- if (colon == NULL || colon == uri || colon[1] == '\0')
- return NULL;
-
- if (! g_path_is_absolute (colon + 1))
- return NULL;
-
- if (g_strncasecmp (uri, E_SHELL_URI_PREFIX, colon - uri) != 0)
- return NULL;
-
- return colon + 1;
-}
-
-static void
-update_window_icon (EShellView *shell_view,
- EFolder *folder)
-{
- EShellViewPrivate *priv;
- const char *type;
- const char *icon_name;
- char *icon_path;
-
- priv = shell_view->priv;
-
- if (folder == NULL)
- type = NULL;
- else
- type = e_folder_get_type_string (folder);
-
- if (type == NULL) {
- icon_path = NULL;
- } else {
- EFolderTypeRegistry *folder_type_registry;
-
- folder_type_registry = e_shell_get_folder_type_registry (priv->shell);
- icon_name = e_folder_type_registry_get_icon_name_for_type (folder_type_registry, type);
- if (icon_name == NULL)
- icon_path = NULL;
- else
- icon_path = e_shell_get_icon_path (icon_name, TRUE);
- }
-
- if (icon_path == NULL) {
- gnome_window_icon_set_from_default (GTK_WINDOW (shell_view));
- } else {
- gnome_window_icon_set_from_file (GTK_WINDOW (shell_view), icon_path);
- g_free (icon_path);
- }
-}
-
-static void
-update_folder_title_bar (EShellView *shell_view,
- EFolder *folder)
-{
- EShellViewPrivate *priv;
- EFolderTypeRegistry *folder_type_registry;
- GdkPixbuf *folder_icon;
- const char *folder_name;
- const char *folder_type_name;
-
- priv = shell_view->priv;
-
- if (folder == NULL)
- folder_type_name = NULL;
- else
- folder_type_name = e_folder_get_type_string (folder);
-
- if (folder_type_name == NULL) {
- folder_name = NULL;
- folder_icon = NULL;
- } else {
- folder_type_registry = e_shell_get_folder_type_registry (priv->shell);
- folder_icon = e_folder_type_registry_get_icon_for_type (folder_type_registry,
- folder_type_name,
- TRUE);
- folder_name = e_folder_get_name (folder);
- }
-
- e_shell_folder_title_bar_set_icon (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar), folder_icon);
- e_shell_folder_title_bar_set_title (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar), folder_name);
-}
-
-static void
-update_for_current_uri (EShellView *shell_view)
-{
- EShellViewPrivate *priv;
- EFolder *folder;
- const char *folder_name;
- const char *path;
- char *window_title;
-
- priv = shell_view->priv;
-
- path = get_storage_set_path_from_uri (priv->uri);
-
- if (path == NULL)
- folder = NULL;
- else
- folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell),
- path);
-
- if (folder == NULL)
- folder_name = _("None");
- else
- folder_name = e_folder_get_name (folder);
-
- window_title = g_strdup_printf (_("Evolution - %s"), folder_name);
- gtk_window_set_title (GTK_WINDOW (shell_view), window_title);
- g_free (window_title);
-
- update_folder_title_bar (shell_view, folder);
-
- update_window_icon (shell_view, folder);
-
- gtk_signal_handler_block_by_func (GTK_OBJECT (priv->storage_set_view),
- GTK_SIGNAL_FUNC (folder_selected_cb),
- shell_view);
- e_storage_set_view_set_current_folder (E_STORAGE_SET_VIEW (priv->storage_set_view),
- path);
- gtk_signal_handler_unblock_by_func (GTK_OBJECT (priv->storage_set_view),
- GTK_SIGNAL_FUNC (folder_selected_cb),
- shell_view);
-}
-
-/* This displays the specified page, doing the appropriate Bonobo activation/deactivation
- magic to make sure things work nicely. FIXME: Crappy way to solve the issue. */
-static void
-set_current_notebook_page (EShellView *shell_view,
- int page_num)
-{
- EShellViewPrivate *priv;
- GtkNotebook *notebook;
- GtkWidget *current;
- BonoboControlFrame *control_frame;
- int current_page;
-
- priv = shell_view->priv;
- notebook = GTK_NOTEBOOK (priv->notebook);
-
- current_page = gtk_notebook_get_current_page (notebook);
- if (current_page == page_num)
- return;
-
- if (current_page != -1 && current_page != 0) {
- current = gtk_notebook_get_nth_page (notebook, current_page);
- control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (current));
-
- bonobo_control_frame_set_autoactivate (control_frame, FALSE);
- bonobo_control_frame_control_deactivate (control_frame);
- }
-
- gtk_notebook_set_page (notebook, page_num);
-
- if (page_num == -1 || page_num == 0)
- return;
-
- current = gtk_notebook_get_nth_page (notebook, page_num);
- control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (current));
-
- bonobo_control_frame_set_autoactivate (control_frame, FALSE);
- bonobo_control_frame_control_activate (control_frame);
-}
-
-static void
-setup_evolution_shell_view_interface (EShellView *shell_view,
- GtkWidget *control)
-{
- BonoboControlFrame *control_frame;
- EvolutionShellView *shell_view_interface;
-
- control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (control));
- shell_view_interface = evolution_shell_view_new ();
-
- gtk_signal_connect_while_alive (GTK_OBJECT (shell_view_interface), "set_message",
- GTK_SIGNAL_FUNC (shell_view_interface_set_message_cb),
- shell_view, GTK_OBJECT (shell_view));
- gtk_signal_connect_while_alive (GTK_OBJECT (shell_view_interface), "unset_message",
- GTK_SIGNAL_FUNC (shell_view_interface_unset_message_cb),
- shell_view, GTK_OBJECT (shell_view));
-
- bonobo_object_add_interface (BONOBO_OBJECT (control_frame),
- BONOBO_OBJECT (shell_view_interface));
-}
-
-/* Create a new view for @uri with @control. It assumes a view for @uri does not exist yet. */
-static GtkWidget *
-get_control_for_uri (EShellView *shell_view,
- const char *uri)
-{
- EShellViewPrivate *priv;
- EFolderTypeRegistry *folder_type_registry;
- EStorageSet *storage_set;
- EFolder *folder;
- Bonobo_UIHandler corba_uih;
- EvolutionShellComponentClient *handler_client;
- Bonobo_Control corba_control;
- Evolution_ShellComponent handler;
- const char *path;
- const char *folder_type;
- GtkWidget *control;
- CORBA_Environment ev;
-
- priv = shell_view->priv;
-
- path = strchr (uri, ':');
- if (path == NULL)
- return NULL;
-
- path++;
- if (*path == '\0')
- return NULL;
-
- storage_set = e_shell_get_storage_set (priv->shell);
- folder_type_registry = e_shell_get_folder_type_registry (priv->shell);
-
- folder = e_storage_set_get_folder (storage_set, path);
- if (folder == NULL)
- return NULL;
-
- folder_type = e_folder_get_type_string (folder);
- if (folder_type == NULL)
- return NULL;
-
- handler_client = e_folder_type_registry_get_handler_for_type (folder_type_registry, folder_type);
- if (handler_client == NULL)
- return NULL;
-
- handler = bonobo_object_corba_objref (BONOBO_OBJECT (handler_client));
- if (handler_client == CORBA_OBJECT_NIL)
- return NULL;
-
- CORBA_exception_init (&ev);
-
- corba_control = Evolution_ShellComponent_create_view (
- handler, e_folder_get_physical_uri (folder), folder_type, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- corba_uih = bonobo_object_corba_objref (BONOBO_OBJECT (priv->uih));
- control = bonobo_widget_new_control_from_objref (corba_control, corba_uih);
-
- setup_evolution_shell_view_interface (shell_view, control);
-
- return control;
-}
-
-static gboolean
-show_existing_view (EShellView *shell_view,
- const char *uri,
- GtkWidget *control)
-{
- EShellViewPrivate *priv;
- int notebook_page;
-
- g_print ("Already have view for %s\n", uri);
-
- priv = shell_view->priv;
-
- notebook_page = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), control);
- g_assert (notebook_page != -1);
-
- /* A BonoboWidget can be a "zombie" in the sense that its actual
- control is dead; if it's zombie, we have to recreate it. */
- if (bonobo_widget_is_dead (BONOBO_WIDGET (control))) {
- GtkWidget *parent;
- Bonobo_UIHandler uih;
-
- parent = control->parent;
- uih = bonobo_object_corba_objref (BONOBO_OBJECT (priv->uih));
-
- /* Out with the old. */
- gtk_container_remove (GTK_CONTAINER (parent), control);
- g_hash_table_remove (priv->uri_to_control, uri);
-
- /* In with the new. */
- control = get_control_for_uri (shell_view, uri);
- if (control == NULL)
- return FALSE;
-
- gtk_container_add (GTK_CONTAINER (parent), control);
- g_hash_table_insert (priv->uri_to_control, g_strdup (uri), control);
-
- /* Show. */
- gtk_widget_show (control);
- }
-
- set_current_notebook_page (shell_view, notebook_page);
-
- return TRUE;
-}
-
-static gboolean
-create_new_view_for_uri (EShellView *shell_view,
- const char *uri)
-{
- GtkWidget *control;
- EShellViewPrivate *priv;
- int page_num;
-
- priv = shell_view->priv;
-
- control = get_control_for_uri (shell_view, uri);
- if (control == NULL)
- return FALSE;
-
- gtk_widget_show (control);
-
- gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), control, NULL);
-
- page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), control);
- g_assert (page_num != -1);
- set_current_notebook_page (shell_view, page_num);
-
- g_hash_table_insert (priv->uri_to_control, g_strdup (uri), control);
-
- return TRUE;
-}
-
-gboolean
-e_shell_view_display_uri (EShellView *shell_view,
- const char *uri)
-{
- EShellViewPrivate *priv;
- GtkWidget *control;
- gboolean retval;
-
- g_return_val_if_fail (shell_view != NULL, FALSE);
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE);
-
- priv = shell_view->priv;
-
- if (uri == NULL) {
- gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), 0);
- gtk_notebook_prepend_page (GTK_NOTEBOOK (priv->notebook),
- create_label_for_empty_page (), NULL);
-
- set_current_notebook_page (shell_view, 0);
-
- if (priv->uri != NULL) {
- g_free (priv->uri);
- priv->uri = NULL;
- }
-
- retval = TRUE;
-
- goto end;
- }
-
- if (strncmp (uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) != 0) {
- retval = FALSE;
- goto end;
- }
-
- control = g_hash_table_lookup (priv->uri_to_control, uri);
- if (control != NULL) {
- g_assert (GTK_IS_WIDGET (control));
- show_existing_view (shell_view, uri, control);
- } else if (! create_new_view_for_uri (shell_view, uri)) {
- retval = FALSE;
- goto end;
- }
-
- g_free (priv->uri);
- priv->uri = g_strdup (uri);
-
- retval = TRUE;
-
- end:
- update_for_current_uri (shell_view);
- return retval;
-}
-
-
-void
-e_shell_view_set_shortcut_bar_mode (EShellView *shell_view,
- EShellViewSubwindowMode mode)
-{
- EShellViewPrivate *priv;
-
- g_return_if_fail (shell_view != NULL);
- g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
- g_return_if_fail (mode == E_SHELL_VIEW_SUBWINDOW_STICKY
- || mode == E_SHELL_VIEW_SUBWINDOW_HIDDEN);
-
- priv = shell_view->priv;
-
- if (priv->shortcut_bar_mode == mode)
- return;
-
- if (mode == E_SHELL_VIEW_SUBWINDOW_STICKY) {
- if (! GTK_WIDGET_VISIBLE (priv->shortcut_bar)) {
- gtk_widget_show (priv->shortcut_bar);
- e_paned_set_position (E_PANED (priv->hpaned), priv->hpaned_position);
- }
- } else {
- if (GTK_WIDGET_VISIBLE (priv->shortcut_bar)) {
- gtk_widget_hide (priv->shortcut_bar);
- /* FIXME this is a private field! */
- priv->hpaned_position = E_PANED (priv->hpaned)->child1_size;
- e_paned_set_position (E_PANED (priv->hpaned), 0);
- }
- }
-
- priv->shortcut_bar_mode = mode;
-
- gtk_signal_emit (GTK_OBJECT (shell_view), signals[SHORTCUT_BAR_MODE_CHANGED], mode);
-}
-
-/**
- * e_shell_view_set_folder_bar_mode:
- * @shell_view:
- * @mode:
- *
- * Set the visualization mode for the folder bar's subwindow.
- **/
-void
-e_shell_view_set_folder_bar_mode (EShellView *shell_view,
- EShellViewSubwindowMode mode)
-{
- EShellViewPrivate *priv;
-
- g_return_if_fail (shell_view != NULL);
- g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
- g_return_if_fail (mode == E_SHELL_VIEW_SUBWINDOW_STICKY
- || mode == E_SHELL_VIEW_SUBWINDOW_HIDDEN);
-
- priv = shell_view->priv;
-
- if (priv->folder_bar_mode == mode)
- return;
-
- if (mode == E_SHELL_VIEW_SUBWINDOW_STICKY) {
- if (! GTK_WIDGET_VISIBLE (priv->storage_set_view_box)) {
- gtk_widget_show (priv->storage_set_view_box);
- e_paned_set_position (E_PANED (priv->view_hpaned), priv->view_hpaned_position);
- }
-
- e_shell_folder_title_bar_set_clickable (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar),
- FALSE);
- } else {
- if (GTK_WIDGET_VISIBLE (priv->storage_set_view_box)) {
- gtk_widget_hide (priv->storage_set_view_box);
- /* FIXME this is a private field! */
- priv->view_hpaned_position = E_PANED (priv->view_hpaned)->child1_size;
- e_paned_set_position (E_PANED (priv->view_hpaned), 0);
- }
-
- e_shell_folder_title_bar_set_clickable (E_SHELL_FOLDER_TITLE_BAR (priv->view_title_bar),
- TRUE);
- }
-
- priv->folder_bar_mode = mode;
-
- gtk_signal_emit (GTK_OBJECT (shell_view), signals[FOLDER_BAR_MODE_CHANGED], mode);
-}
-
-EShellViewSubwindowMode
-e_shell_view_get_shortcut_bar_mode (EShellView *shell_view)
-{
- g_return_val_if_fail (shell_view != NULL, E_SHELL_VIEW_SUBWINDOW_HIDDEN);
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), E_SHELL_VIEW_SUBWINDOW_HIDDEN);
-
- return shell_view->priv->shortcut_bar_mode;
-}
-
-EShellViewSubwindowMode
-e_shell_view_get_folder_bar_mode (EShellView *shell_view)
-{
- g_return_val_if_fail (shell_view != NULL, E_SHELL_VIEW_SUBWINDOW_HIDDEN);
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), E_SHELL_VIEW_SUBWINDOW_HIDDEN);
-
- return shell_view->priv->folder_bar_mode;
-}
-
-
-EShell *
-e_shell_view_get_shell (EShellView *shell_view)
-{
- g_return_val_if_fail (shell_view != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
-
- return shell_view->priv->shell;
-}
-
-BonoboUIHandler *
-e_shell_view_get_bonobo_ui_handler (EShellView *shell_view)
-{
- g_return_val_if_fail (shell_view != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
-
- return shell_view->priv->uih;
-}
-
-GtkWidget *
-e_shell_view_get_appbar (EShellView *shell_view)
-{
- g_return_val_if_fail (shell_view != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
-
- return shell_view->priv->appbar;
-}
-
-const char *
-e_shell_view_get_current_uri (EShellView *shell_view)
-{
- g_return_val_if_fail (shell_view != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
-
- return shell_view->priv->uri;
-}
-
-
-/**
- * e_shell_view_save_settings:
- * @shell_view:
- * @prefix:
- *
- * Save settings for @shell_view at the specified gnome config @prefix
- *
- * Return value: TRUE if successful, FALSE if not.
- **/
-gboolean
-e_shell_view_save_settings (EShellView *shell_view,
- const char *prefix)
-{
- EShellViewPrivate *priv;
- const char *uri;
-
- g_return_val_if_fail (shell_view != NULL, FALSE);
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE);
- g_return_val_if_fail (prefix != NULL, FALSE);
-
- priv = shell_view->priv;
-
- gnome_config_push_prefix (prefix);
-
- gnome_config_set_int ("FolderBarMode", e_shell_view_get_folder_bar_mode (shell_view));
- gnome_config_set_int ("ShortcutBarMode", e_shell_view_get_shortcut_bar_mode (shell_view));
- gnome_config_set_int ("HPanedPosition", e_paned_get_position (E_PANED (priv->hpaned)));
- gnome_config_set_int ("ViewHPanedPosition", e_paned_get_position (E_PANED (priv->view_hpaned)));
-
- uri = e_shell_view_get_current_uri (shell_view);
- if (uri != NULL)
- gnome_config_set_string ("DisplayedURI", uri);
- else
- gnome_config_clean_section ("DisplayedURI");
-
- gnome_config_pop_prefix ();
-
- return TRUE;
-}
-
-/**
- * e_shell_view_load_settings:
- * @shell_view:
- * @prefix:
- *
- * Load settings for @shell_view at the specified gnome config @prefix
- *
- * Return value:
- **/
-gboolean
-e_shell_view_load_settings (EShellView *shell_view,
- const char *prefix)
-{
- EShellViewPrivate *priv;
- int val;
- char *stringval;
-
- g_return_val_if_fail (shell_view != NULL, FALSE);
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE);
- g_return_val_if_fail (prefix != NULL, FALSE);
-
- priv = shell_view->priv;
-
- gnome_config_push_prefix (prefix);
-
- val = gnome_config_get_int ("FolderBarMode");
- e_shell_view_set_folder_bar_mode (shell_view, val);
-
- val = gnome_config_get_int ("ShortcutBarMode");
- e_shell_view_set_shortcut_bar_mode (shell_view, val);
-
- val = gnome_config_get_int ("HPanedPosition");
- e_paned_set_position (E_PANED (priv->hpaned), val);
-
- val = gnome_config_get_int ("ViewHPanedPosition");
- e_paned_set_position (E_PANED (priv->view_hpaned), val);
-
- stringval = gnome_config_get_string ("DisplayedURI");
- e_shell_view_display_uri (shell_view, stringval);
- g_free (stringval);
-
- gnome_config_pop_prefix ();
-
- return TRUE;
-}
-
-
-E_MAKE_TYPE (e_shell_view, "EShellView", EShellView, class_init, init, PARENT_TYPE)
diff --git a/shell/e-shell-view.h b/shell/e-shell-view.h
deleted file mode 100644
index 69a0e5c22c..0000000000
--- a/shell/e-shell-view.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-view.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_SHELL_VIEW_H_
-#define _E_SHELL_VIEW_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <libgnomeui/gnome-app.h>
-#include <bonobo/bonobo-ui-handler.h>
-
-#include "e-shell.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-
-#define E_TYPE_SHELL_VIEW (e_shell_view_get_type ())
-#define E_SHELL_VIEW(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL_VIEW, EShellView))
-#define E_SHELL_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_VIEW, EShellViewClass))
-#define E_IS_SHELL_VIEW(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_VIEW))
-#define E_IS_SHELL_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_VIEW))
-
-typedef struct _EShellView EShellView;
-typedef struct _EShellViewPrivate EShellViewPrivate;
-typedef struct _EShellViewClass EShellViewClass;
-
-enum _EShellViewSubwindowMode {
- E_SHELL_VIEW_SUBWINDOW_HIDDEN,
- E_SHELL_VIEW_SUBWINDOW_TRANSIENT,
- E_SHELL_VIEW_SUBWINDOW_STICKY
-};
-typedef enum _EShellViewSubwindowMode EShellViewSubwindowMode;
-
-struct _EShellView {
- GnomeApp parent;
-
- EShellViewPrivate *priv;
-};
-
-struct _EShellViewClass {
- GnomeAppClass parent_class;
-
- /* Signals. */
- void (* shortcut_bar_mode_changed) (EShellView *shell_view, EShellViewSubwindowMode new_mode);
- void (* folder_bar_mode_changed) (EShellView *shell_view, EShellViewSubwindowMode mode);
-};
-
-
-GtkType e_shell_view_get_type (void);
-void e_shell_view_construct (EShellView *shell_view,
- EShell *shell);
-GtkWidget *e_shell_view_new (EShell *shell);
-
-gboolean e_shell_view_display_uri (EShellView *shell_view,
- const char *uri);
-
-void e_shell_view_set_shortcut_bar_mode (EShellView *shell_view,
- EShellViewSubwindowMode mode);
-void e_shell_view_set_folder_bar_mode (EShellView *shell_view,
- EShellViewSubwindowMode mode);
-EShellViewSubwindowMode e_shell_view_get_shortcut_bar_mode (EShellView *shell_view);
-EShellViewSubwindowMode e_shell_view_get_folder_bar_mode (EShellView *shell_view);
-
-EShell *e_shell_view_get_shell (EShellView *shell_view);
-BonoboUIHandler *e_shell_view_get_bonobo_ui_handler (EShellView *shell_view);
-GtkWidget *e_shell_view_get_appbar (EShellView *shell_view);
-const char *e_shell_view_get_current_uri (EShellView *shell_view);
-
-gboolean e_shell_view_save_settings (EShellView *shell_view,
- const char *prefix);
-gboolean e_shell_view_load_settings (EShellView *shell_view,
- const char *prefix);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_SHELL_VIEW_H_ */
diff --git a/shell/e-shell.c b/shell/e-shell.c
deleted file mode 100644
index 26a556de96..0000000000
--- a/shell/e-shell.c
+++ /dev/null
@@ -1,846 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-
-#include "Evolution.h"
-
-#include "e-util/e-gui-utils.h"
-#include "e-util/e-util.h"
-
-#include "e-component-registry.h"
-#include "e-corba-storage-registry.h"
-#include "e-folder-type-registry.h"
-#include "e-local-storage.h"
-#include "e-shell-constants.h"
-#include "e-shell-folder-selection-dialog.h"
-#include "e-shell-view.h"
-#include "e-shortcuts.h"
-#include "e-storage-set.h"
-
-#include "e-shell.h"
-
-
-#define PARENT_TYPE BONOBO_OBJECT_TYPE
-static BonoboObjectClass *parent_class = NULL;
-
-struct _EShellPrivate {
- char *local_directory;
-
- GList *views;
-
- EStorageSet *storage_set;
- EShortcuts *shortcuts;
- EFolderTypeRegistry *folder_type_registry;
-
- EComponentRegistry *component_registry;
-
- ECorbaStorageRegistry *corba_storage_registry;
-};
-
-
-/* Constants. */
-
-/* FIXME: We need a component repository instead. */
-
-#define SHORTCUTS_FILE_NAME "shortcuts.xml"
-#define LOCAL_STORAGE_DIRECTORY "local"
-
-#define MAIL_COMPONENT_ID "OAFIID:evolution-shell-component:evolution-mail:d3cb3ed6-a654-4337-8aa0-f443751d6d1b"
-#define CALENDAR_COMPONENT_ID "OAFIID:evolution-shell-component:evolution-calendar:2eb9eb63-d305-4918-9c35-faae5db19e51"
-#define ADDRESSBOOK_COMPONENT_ID "OAFIID:evolution-shell-component:addressbook:b7a26547-7014-4bb5-98ab-2bcac2bb55ca"
-
-
-enum {
- NO_VIEWS_LEFT,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-/* Callback for the folder selection dialog. */
-
-static void
-folder_selection_dialog_cancelled_cb (EShellFolderSelectionDialog *folder_selection_dialog,
- void *data)
-{
- Evolution_FolderSelectionListener listener;
- CORBA_Environment ev;
-
- listener = gtk_object_get_data (GTK_OBJECT (folder_selection_dialog), "corba_listener");
-
- CORBA_exception_init (&ev);
-
- Evolution_FolderSelectionListener_cancel (listener, &ev);
-
- CORBA_exception_free (&ev);
-
- gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog));
-}
-
-static void
-folder_selection_dialog_folder_selected_cb (EShellFolderSelectionDialog *folder_selection_dialog,
- const char *path,
- void *data)
-{
- CORBA_Environment ev;
- EShell *shell;
- Evolution_FolderSelectionListener listener;
- EStorageSet *storage_set;
- EFolder *folder;
- char *uri;
- const char *physical_uri;
-
- shell = E_SHELL (data);
- listener = gtk_object_get_data (GTK_OBJECT (folder_selection_dialog), "corba_listener");
-
- CORBA_exception_init (&ev);
-
- storage_set = e_shell_get_storage_set (shell);
- folder = e_storage_set_get_folder (storage_set, path);
-
- uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL);
-
- if (folder == NULL)
- physical_uri = "";
- else
- physical_uri = e_folder_get_physical_uri (folder);
-
- Evolution_FolderSelectionListener_selected (listener, uri, physical_uri, &ev);
- g_free (uri);
-
- CORBA_exception_free (&ev);
-
- gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog));
-}
-
-
-/* CORBA interface implementation. */
-
-static POA_Evolution_Shell__vepv shell_vepv;
-
-static POA_Evolution_Shell *
-create_servant (void)
-{
- POA_Evolution_Shell *servant;
- CORBA_Environment ev;
-
- servant = (POA_Evolution_Shell *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &shell_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_Shell__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- return servant;
-}
-
-static Evolution_ShellComponent
-impl_Shell_get_component_for_type (PortableServer_Servant servant,
- const CORBA_char *type,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionShellComponentClient *handler;
- EFolderTypeRegistry *folder_type_registry;
- Evolution_ShellComponent corba_component;
- EShell *shell;
-
- bonobo_object = bonobo_object_from_servant (servant);
- shell = E_SHELL (bonobo_object);
- folder_type_registry = shell->priv->folder_type_registry;
-
- handler = e_folder_type_registry_get_handler_for_type (folder_type_registry, type);
-
- if (handler == NULL) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_Evolution_Shell_NotFound, NULL);
- return CORBA_OBJECT_NIL;
- }
-
- corba_component = bonobo_object_corba_objref (BONOBO_OBJECT (handler));
- Bonobo_Unknown_ref (corba_component, ev);
-
- return CORBA_Object_duplicate (corba_component, ev);
-}
-
-static void
-corba_listener_destroy_notify (void *data)
-{
- CORBA_Environment ev;
- Evolution_FolderSelectionListener listener_interface;
-
- listener_interface = (Evolution_FolderSelectionListener) data;
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (listener_interface, &ev);
- CORBA_exception_free (&ev);
-}
-
-static void
-impl_Shell_user_select_folder (PortableServer_Servant servant,
- const Evolution_FolderSelectionListener listener,
- const CORBA_char *title,
- const CORBA_char *default_folder,
- const Evolution_Shell_FolderTypeList *corba_allowed_types,
- CORBA_Environment *ev)
-{
- GtkWidget *folder_selection_dialog;
- BonoboObject *bonobo_object;
- Evolution_FolderSelectionListener listener_duplicate;
- EShell *shell;
- const char **allowed_types;
- int i;
-
- bonobo_object = bonobo_object_from_servant (servant);
- shell = E_SHELL (bonobo_object);
-
- allowed_types = alloca (sizeof (allowed_types[0]) * (corba_allowed_types->_length + 1));
- for (i = 0; i < corba_allowed_types->_length; i++)
- allowed_types[i] = corba_allowed_types->_buffer[i];
- allowed_types[corba_allowed_types->_length] = NULL;
-
- /* CORBA doesn't allow you to pass a NULL pointer. */
- if (!*default_folder)
- default_folder = NULL;
- folder_selection_dialog = e_shell_folder_selection_dialog_new (shell, title, default_folder, allowed_types);
-
- listener_duplicate = CORBA_Object_duplicate (listener, ev);
- gtk_object_set_data_full (GTK_OBJECT (folder_selection_dialog), "corba_listener",
- listener_duplicate, corba_listener_destroy_notify);
-
- gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "folder_selected",
- GTK_SIGNAL_FUNC (folder_selection_dialog_folder_selected_cb), shell);
- gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "cancelled",
- GTK_SIGNAL_FUNC (folder_selection_dialog_cancelled_cb), shell);
-
- gtk_widget_show (folder_selection_dialog);
-}
-
-
-/* Initialization of the storages. */
-
-static gboolean
-setup_corba_storages (EShell *shell)
-{
- EShellPrivate *priv;
- ECorbaStorageRegistry *corba_storage_registry;
-
- priv = shell->priv;
-
- g_assert (priv->storage_set != NULL);
- corba_storage_registry = e_corba_storage_registry_new (priv->storage_set);
-
- if (corba_storage_registry == NULL)
- return FALSE;
-
- bonobo_object_add_interface (BONOBO_OBJECT (shell), BONOBO_OBJECT (corba_storage_registry));
-
- /* Notice that `bonobo_object_add_interface()' aggregates the two object's
- reference counts, so we need an extra ref here if we want to keep a separate
- pointer to the storage interface. */
- bonobo_object_ref (BONOBO_OBJECT (corba_storage_registry));
- priv->corba_storage_registry = corba_storage_registry;
-
- return TRUE;
-}
-
-static gboolean
-setup_local_storage (EShell *shell)
-{
- EStorage *local_storage;
- EShellPrivate *priv;
- gchar *local_storage_path;
-
- priv = shell->priv;
-
- local_storage_path = g_concat_dir_and_file (priv->local_directory,
- LOCAL_STORAGE_DIRECTORY);
- local_storage = e_local_storage_open (priv->folder_type_registry,
- local_storage_path);
- if (local_storage == NULL) {
- g_warning (_("Cannot set up local storage -- %s"), local_storage_path);
- g_free (local_storage_path);
- return FALSE;
- }
- g_free (local_storage_path);
-
- g_assert (shell->priv->folder_type_registry);
-
- e_storage_set_add_storage (priv->storage_set, local_storage);
-
- gtk_object_unref (GTK_OBJECT (local_storage));
-
- return TRUE;
-}
-
-
-/* Initialization of the components. */
-
-static void
-setup_components (EShell *shell)
-{
- EShellPrivate *priv;
-
- priv = shell->priv;
-
- priv->component_registry = e_component_registry_new (shell);
-
- /* FIXME: Hardcoded for now. */
-
- if (! e_component_registry_register_component (priv->component_registry, MAIL_COMPONENT_ID))
- g_warning ("Cannot activate mail component -- %s", MAIL_COMPONENT_ID);
-
- if (! e_component_registry_register_component (priv->component_registry, CALENDAR_COMPONENT_ID))
- g_warning ("Cannot activate calendar component -- %s", CALENDAR_COMPONENT_ID);
-
- if (! e_component_registry_register_component (priv->component_registry, ADDRESSBOOK_COMPONENT_ID))
- g_warning ("Cannot activate addressbook component -- %s", ADDRESSBOOK_COMPONENT_ID);
-}
-
-
-/* EShellView destruction callback. */
-
-static void
-view_destroy_cb (GtkObject *object,
- gpointer data)
-{
- EShell *shell;
-
- g_assert (E_IS_SHELL_VIEW (object));
-
- shell = E_SHELL (data);
- shell->priv->views = g_list_remove (shell->priv->views, object);
-
- if (shell->priv->views == NULL) {
- /* FIXME: This looks like a Bonobo bug to me. */
- bonobo_object_ref (BONOBO_OBJECT (shell));
- gtk_signal_emit (GTK_OBJECT (shell), signals[NO_VIEWS_LEFT]);
- bonobo_object_unref (BONOBO_OBJECT (shell));
- }
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EShell *shell;
- EShellPrivate *priv;
- GList *p;
-
- shell = E_SHELL (object);
- priv = shell->priv;
-
- g_free (priv->local_directory);
-
- if (priv->storage_set != NULL)
- gtk_object_unref (GTK_OBJECT (priv->storage_set));
-
- if (priv->shortcuts != NULL)
- gtk_object_unref (GTK_OBJECT (priv->shortcuts));
-
- if (priv->folder_type_registry != NULL)
- gtk_object_unref (GTK_OBJECT (priv->folder_type_registry));
-
- if (priv->component_registry != NULL)
- gtk_object_unref (GTK_OBJECT (priv->component_registry));
-
- for (p = priv->views; p != NULL; p = p->next) {
- EShellView *view;
-
- view = E_SHELL_VIEW (p->data);
-
- gtk_signal_disconnect_by_func (GTK_OBJECT (view),
- GTK_SIGNAL_FUNC (view_destroy_cb), shell);
- gtk_object_destroy (GTK_OBJECT (view));
- }
-
- g_list_free (priv->views);
-
- if (priv->corba_storage_registry != NULL)
- bonobo_object_unref (BONOBO_OBJECT (priv->corba_storage_registry));
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* Initialization. */
-
-static void
-corba_class_init (void)
-{
- POA_Evolution_Shell__vepv *vepv;
- POA_Evolution_Shell__epv *epv;
- PortableServer_ServantBase__epv *base_epv;
-
- base_epv = g_new0 (PortableServer_ServantBase__epv, 1);
- base_epv->_private = NULL;
- base_epv->finalize = NULL;
- base_epv->default_POA = NULL;
-
- epv = g_new0 (POA_Evolution_Shell__epv, 1);
- epv->get_component_for_type = impl_Shell_get_component_for_type;
- epv->user_select_folder = impl_Shell_user_select_folder;
-
- vepv = &shell_vepv;
- vepv->Bonobo_Unknown_epv = bonobo_object_get_epv ();
- vepv->Evolution_Shell_epv = epv;
-}
-
-static void
-class_init (EShellClass *klass)
-{
- GtkObjectClass *object_class;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- signals[NO_VIEWS_LEFT] =
- gtk_signal_new ("no_views_left",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShellClass, no_views_left),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-
- corba_class_init ();
-}
-
-static void
-init (EShell *shell)
-{
- EShellPrivate *priv;
-
- priv = g_new (EShellPrivate, 1);
-
- priv->views = NULL;
-
- priv->local_directory = NULL;
- priv->storage_set = NULL;
- priv->shortcuts = NULL;
- priv->component_registry = NULL;
- priv->folder_type_registry = NULL;
- priv->corba_storage_registry = NULL;
-
- shell->priv = priv;
-}
-
-
-void
-e_shell_construct (EShell *shell,
- Evolution_Shell corba_object,
- const char *local_directory)
-{
- EShellPrivate *priv;
- gchar *shortcut_path;
-
- g_return_if_fail (shell != NULL);
- g_return_if_fail (E_IS_SHELL (shell));
- g_return_if_fail (corba_object != CORBA_OBJECT_NIL);
- g_return_if_fail (local_directory != NULL);
- g_return_if_fail (g_path_is_absolute (local_directory));
-
- bonobo_object_construct (BONOBO_OBJECT (shell), corba_object);
-
- priv = shell->priv;
-
- priv->local_directory = g_strdup (local_directory);
- priv->folder_type_registry = e_folder_type_registry_new ();
- priv->storage_set = e_storage_set_new (shell->priv->folder_type_registry);
-
- gtk_object_ref (GTK_OBJECT (priv->storage_set ));
-
- /* CORBA storages must be set up before the components, because otherwise components
- cannot register their own storages. */
- if (! setup_corba_storages (shell))
- return;
-
- setup_components (shell);
-
- /* The local storage depends on the component registry. */
- setup_local_storage (shell);
-
- shortcut_path = g_concat_dir_and_file (local_directory, "shortcuts.xml");
- priv->shortcuts = e_shortcuts_new (priv->storage_set,
- priv->folder_type_registry,
- shortcut_path);
-
- if (priv->shortcuts == NULL)
- g_warning ("Cannot load shortcuts -- %s", shortcut_path);
-
- g_free (shortcut_path);
-}
-
-EShell *
-e_shell_new (const char *local_directory)
-{
- EShell *new;
- EShellPrivate *priv;
- Evolution_Shell corba_object;
- POA_Evolution_Shell *servant;
-
- g_return_val_if_fail (local_directory != NULL, NULL);
- g_return_val_if_fail (*local_directory != '\0', NULL);
-
- servant = create_servant ();
- if (servant == NULL)
- return NULL;
-
- new = gtk_type_new (e_shell_get_type ());
-
- corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant);
- e_shell_construct (new, corba_object, local_directory);
-
- priv = new->priv;
-
- if (priv->shortcuts == NULL || priv->storage_set == NULL) {
- bonobo_object_unref (BONOBO_OBJECT (new));
- return NULL;
- }
-
- return new;
-}
-
-
-GtkWidget *
-e_shell_new_view (EShell *shell,
- const char *uri)
-{
- GtkWidget *view;
-
- g_return_val_if_fail (shell != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
- view = e_shell_view_new (shell);
-
- gtk_widget_show (view);
- gtk_signal_connect (GTK_OBJECT (view), "destroy",
- GTK_SIGNAL_FUNC (view_destroy_cb), shell);
-
- if (uri != NULL)
- e_shell_view_display_uri (E_SHELL_VIEW (view), uri);
-
- shell->priv->views = g_list_prepend (shell->priv->views, view);
-
- return view;
-}
-
-
-const char *
-e_shell_get_local_directory (EShell *shell)
-{
- g_return_val_if_fail (shell != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
- return shell->priv->local_directory;
-}
-
-EShortcuts *
-e_shell_get_shortcuts (EShell *shell)
-{
- g_return_val_if_fail (shell != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
- return shell->priv->shortcuts;
-}
-
-EStorageSet *
-e_shell_get_storage_set (EShell *shell)
-{
- g_return_val_if_fail (shell != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
- return shell->priv->storage_set;
-}
-
-EFolderTypeRegistry *
-e_shell_get_folder_type_registry (EShell *shell)
-{
- g_return_val_if_fail (shell != NULL, NULL);
- g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
- return shell->priv->folder_type_registry;
-}
-
-
-static gboolean
-save_settings_for_views (EShell *shell)
-{
- EShellPrivate *priv;
- GList *p;
- gboolean retval;
- char *prefix;
- int i;
-
- priv = shell->priv;
- retval = TRUE;
-
- for (p = priv->views, i = 0; p != NULL; p = p->next, i++) {
- EShellView *view;
-
- view = E_SHELL_VIEW (p->data);
-
- prefix = g_strdup_printf ("=%s/config/Shell=/Views/%d/",
- priv->local_directory, i);
-
- if (! e_shell_view_save_settings (view, prefix)) {
- g_warning ("Cannot save settings for view -- %d", i);
- retval = FALSE;
- }
-
- g_free (prefix);
- }
-
- prefix = g_strdup_printf ("=%s/config/Shell=/Views/NumberOfViews",
- priv->local_directory);
- gnome_config_set_int (prefix, g_list_length (priv->views));
- g_free (prefix);
-
- gnome_config_sync ();
-
- return TRUE;
-}
-
-static gboolean
-save_settings_for_component (EShell *shell,
- const char *id,
- EvolutionShellComponentClient *client)
-{
- Bonobo_Unknown unknown_interface;
- Evolution_Session session_interface;
- CORBA_Environment ev;
- char *prefix;
- gboolean retval;
-
- unknown_interface = bonobo_object_corba_objref (BONOBO_OBJECT (client));
- g_assert (unknown_interface != CORBA_OBJECT_NIL);
-
- CORBA_exception_init (&ev);
-
- session_interface = Bonobo_Unknown_query_interface (unknown_interface, "IDL:Evolution/Session:1.0", &ev);
- if (ev._major != CORBA_NO_EXCEPTION || CORBA_Object_is_nil (session_interface, &ev)) {
- CORBA_exception_free (&ev);
- return TRUE;
- }
-
- prefix = g_strconcat ("/apps/Evolution/Shell/Components/", id, NULL);
- Evolution_Session_save_configuration (session_interface, prefix, &ev);
-
- if (ev._major == CORBA_NO_EXCEPTION)
- retval = TRUE;
- else
- retval = FALSE;
-
- g_free (prefix);
-
- CORBA_exception_free (&ev);
-
- return retval;
-}
-
-static gboolean
-save_settings_for_components (EShell *shell)
-{
- EShellPrivate *priv;
- GList *component_ids;
- GList *p;
- gboolean retval;
-
- priv = shell->priv;
-
- g_assert (priv->component_registry);
- component_ids = e_component_registry_get_id_list (priv->component_registry);
-
- retval = TRUE;
- for (p = component_ids; p != NULL; p = p->next) {
- EvolutionShellComponentClient *client;
- const char *id;
-
- id = p->data;
- client = e_component_registry_get_component_by_id (priv->component_registry, id);
-
- if (! save_settings_for_component (shell, id, client))
- retval = FALSE;
- }
-
- e_free_string_list (component_ids);
-
- return retval;
-}
-
-/**
- * e_shell_save_settings:
- * @shell:
- *
- * Save the settings for this shell.
- *
- * Return value: %TRUE if it worked, %FALSE otherwise. Even if %FALSE is
- * returned, it is possible that at least part of the settings for the views
- * have been saved.
- **/
-gboolean
-e_shell_save_settings (EShell *shell)
-{
- gboolean views_saved;
- gboolean components_saved;
-
- g_return_val_if_fail (shell != NULL, FALSE);
- g_return_val_if_fail (E_IS_SHELL (shell), FALSE);
-
- views_saved = save_settings_for_views (shell);
- components_saved = save_settings_for_components (shell);
-
- return views_saved && components_saved;
-}
-
-/**
- * e_shell_restore_from_settings:
- * @shell: An EShell object.
- *
- * Restore the existing views from the saved configuration. The shell must
- * have no views for this to work.
- *
- * Return value: %FALSE if the shell has some open views or there is no saved
- * configuration. %TRUE if the configuration could be restored successfully.
- **/
-gboolean
-e_shell_restore_from_settings (EShell *shell)
-{
- EShellPrivate *priv;
- gboolean retval;
- char *prefix;
- int num_views;
- int i;
-
- g_return_val_if_fail (shell != NULL, FALSE);
- g_return_val_if_fail (E_IS_SHELL (shell), FALSE);
- g_return_val_if_fail (shell->priv->views == NULL, FALSE);
-
- priv = shell->priv;
-
- prefix = g_strdup_printf ("=%s/config/Shell=/Views/NumberOfViews",
- priv->local_directory);
- num_views = gnome_config_get_int (prefix);
- if (num_views == 0)
- return FALSE;
-
- retval = TRUE;
-
- for (i = 0; i < num_views; i++) {
- GtkWidget *view_widget;
-
- prefix = g_strdup_printf ("=%s/config/Shell=/Views/%d/",
- priv->local_directory, i);
-
- /* FIXME restore the URI here. There should be an
- e_shell_view_new_from_configuration() thingie. */
- view_widget = e_shell_new_view (shell, NULL);
-
- if (! e_shell_view_load_settings (E_SHELL_VIEW (view_widget), prefix))
- retval = FALSE;
-
- g_free (prefix);
- }
-
- return retval;
-}
-
-/**
- * e_shell_quit:
- * @shell: An EShell.
- *
- * Make @shell quit. This will close all the associated views and destroy the
- * object.
- **/
-void
-e_shell_quit (EShell *shell)
-{
- EShellPrivate *priv;
- GList *p;
-
- g_return_if_fail (shell != NULL);
- g_return_if_fail (E_IS_SHELL (shell));
-
- e_shell_save_settings (shell);
-
- priv = shell->priv;
-
- for (p = priv->views; p != NULL; p = p->next) {
- EShellView *shell_view;
-
- shell_view = E_SHELL_VIEW (p->data);
- gtk_signal_disconnect_by_func (GTK_OBJECT (shell_view),
- GTK_SIGNAL_FUNC (view_destroy_cb), shell);
- gtk_widget_destroy (GTK_WIDGET (shell_view));
- }
-
- g_list_free (priv->views);
- priv->views = NULL;
-
- bonobo_object_unref (BONOBO_OBJECT (priv->corba_storage_registry));
-
- priv->corba_storage_registry = NULL;
-
- e_storage_set_remove_all_storages (priv->storage_set);
-
- /*
- * Ok, so you thought the GUI components lifecycle was coupled to
- * the Shell's, in fact this is not the case, they are unref'd
- * here, and NULL'd to avoid shell destruction killing them again.
- * So; the shell can be destroyed either remotely or localy.
- */
-
- gtk_object_unref (GTK_OBJECT (priv->storage_set));
- gtk_object_unref (GTK_OBJECT (priv->shortcuts));
- gtk_object_unref (GTK_OBJECT (priv->folder_type_registry));
- gtk_object_unref (GTK_OBJECT (priv->component_registry));
-
- priv->storage_set = NULL;
- priv->shortcuts = NULL;
- priv->folder_type_registry = NULL;
- priv->component_registry = NULL;
-
- bonobo_object_unref (BONOBO_OBJECT (shell));
-}
-
-
-E_MAKE_TYPE (e_shell, "EShell", EShell, class_init, init, PARENT_TYPE)
diff --git a/shell/e-shell.h b/shell/e-shell.h
deleted file mode 100644
index ca63c4776d..0000000000
--- a/shell/e-shell.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_SHELL_H_
-#define _E_SHELL_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo/bonobo-object.h>
-
-#include "Evolution.h"
-#include "e-shortcuts.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_SHELL (e_shell_get_type ())
-#define E_SHELL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL, EShell))
-#define E_SHELL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL, EShellClass))
-#define E_IS_SHELL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL))
-#define E_IS_SHELL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL))
-
-
-typedef struct _EShell EShell;
-typedef struct _EShellPrivate EShellPrivate;
-typedef struct _EShellClass EShellClass;
-
-struct _EShell {
- BonoboObject parent;
-
- EShellPrivate *priv;
-};
-
-struct _EShellClass {
- BonoboObjectClass parent_class;
-
- void (* no_views_left) (EShell *shell);
-};
-
-
-GtkType e_shell_get_type (void);
-void e_shell_construct (EShell *shell,
- Evolution_Shell corba_object,
- const char *local_directory);
-
-EShell *e_shell_new (const char *local_directory);
-GtkWidget *e_shell_new_view (EShell *shell,
- const char *uri);
-
-const char *e_shell_get_local_directory (EShell *shell);
-EShortcuts *e_shell_get_shortcuts (EShell *shell);
-EStorageSet *e_shell_get_storage_set (EShell *shell);
-EFolderTypeRegistry *e_shell_get_folder_type_registry (EShell *shell);
-
-gboolean e_shell_save_settings (EShell *shell);
-gboolean e_shell_restore_from_settings (EShell *shell);
-
-void e_shell_quit (EShell *shell);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_SHELL_H_ */
diff --git a/shell/e-shortcuts-view.c b/shell/e-shortcuts-view.c
deleted file mode 100644
index 6f457cc18d..0000000000
--- a/shell/e-shortcuts-view.c
+++ /dev/null
@@ -1,584 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shortcuts-view.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-
-#include "e-util/e-util.h"
-
-#include "e-shortcuts-view.h"
-
-
-#define PARENT_TYPE E_TYPE_SHORTCUT_BAR
-static EShortcutBarClass *parent_class = NULL;
-
-struct _EShortcutsViewPrivate {
- EShortcuts *shortcuts;
-};
-
-enum {
- ACTIVATE_SHORTCUT,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-/* View initialization. */
-
-static const char *
-get_storage_set_path_from_uri (const char *uri)
-{
- const char *colon;
-
- if (g_path_is_absolute (uri))
- return NULL;
-
- colon = strchr (uri, ':');
- if (colon == NULL || colon == uri || colon[1] == '\0')
- return NULL;
-
- if (! g_path_is_absolute (colon + 1))
- return NULL;
-
- if (g_strncasecmp (uri, "evolution", colon - uri) != 0)
- return NULL;
-
- return colon + 1;
-}
-
-static void
-load_group (EShortcutsView *shortcuts_view,
- EShortcuts *shortcuts,
- const char *group_title,
- int group_num)
-{
- EShortcutsViewPrivate *priv;
- EStorageSet *storage_set;
- GList *shortcut_list;
- GList *p;
-
- priv = shortcuts_view->priv;
-
- storage_set = e_shortcuts_get_storage_set (shortcuts);
- g_assert (storage_set != NULL);
-
- shortcut_list = e_shortcuts_get_shortcuts_in_group (shortcuts, group_title);
- if (shortcut_list == NULL)
- return;
-
- for (p = shortcut_list; p != NULL; p = p->next) {
- EFolder *folder;
- const char *path;
- const char *uri;
- const char *name;
-
- uri = (const char *) p->data;
- path = get_storage_set_path_from_uri (uri);
- if (path != NULL)
- folder = e_storage_set_get_folder (storage_set, path);
-
- if (path == NULL || folder == NULL) {
- /* FIXME */
- g_warning ("Invalid link while loading shortcut bar view -- %s\n",
- uri);
- continue;
- }
-
- name = e_folder_get_name (folder);
- e_shortcut_model_add_item (E_SHORTCUT_BAR (shortcuts_view)->model, group_num, -1, uri, name);
- }
-
- e_free_string_list (shortcut_list);
-}
-
-static void
-load_all_shortcuts (EShortcutsView *shortcuts_view,
- EShortcuts *shortcuts)
-{
- EShortcutsViewPrivate *priv;
- GList *group_titles;
- GList *p;
- int group_num;
-
- priv = shortcuts_view->priv;
-
- group_titles = e_shortcuts_get_group_titles (shortcuts);
-
- for (p = group_titles; p != NULL; p = p->next) {
- const char *group_title;
-
- group_title = (const char *) p->data;
- group_num = e_shortcut_model_add_group (E_SHORTCUT_BAR (shortcuts_view)->model,
- -1, group_title);
-
- load_group (shortcuts_view, shortcuts, group_title, group_num);
- }
-
- e_free_string_list (group_titles);
-
- gtk_object_ref (GTK_OBJECT (shortcuts));
- priv->shortcuts = shortcuts;
-}
-
-/* Icon callback for the shortcut bar. */
-static GdkPixbuf *
-icon_callback (EShortcutBar *shortcut_bar,
- const char *uri,
- gpointer data)
-{
- EFolderTypeRegistry *folder_type_registry;
- EShortcuts *shortcuts;
- EStorageSet *storage_set;
- EFolder *folder;
- GdkPixbuf *pixbuf;
- const char *type;
-
- shortcuts = E_SHORTCUTS (data);
-
- storage_set = e_shortcuts_get_storage_set (shortcuts);
- folder_type_registry = e_storage_set_get_folder_type_registry (storage_set);
-
- folder = e_storage_set_get_folder (storage_set,
- get_storage_set_path_from_uri (uri));
-
- if (folder == NULL)
- return NULL;
-
- type = e_folder_get_type_string (folder);
- if (type == NULL)
- return NULL;
-
- /* FIXME mini icons? */
- pixbuf = e_folder_type_registry_get_icon_for_type (folder_type_registry, type, FALSE);
- if (pixbuf != NULL)
- gdk_pixbuf_ref (pixbuf);
-
- return pixbuf;
-}
-
-
-/* Shortcut bar right-click menu. */
-
-struct _RightClickMenuData {
- EShortcutsView *shortcuts_view;
- int group_num;
-};
-typedef struct _RightClickMenuData RightClickMenuData;
-
-static void
-toggle_large_icons_cb (GtkWidget *widget,
- void *data)
-{
- RightClickMenuData *menu_data;
-
- g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (widget));
-
- if (data == NULL)
- return;
-
- menu_data = (RightClickMenuData *) data;
-
- if (! GTK_CHECK_MENU_ITEM (widget)->active)
- return;
-
- e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (menu_data->shortcuts_view),
- menu_data->group_num,
- E_ICON_BAR_LARGE_ICONS);
-}
-
-static void
-toggle_small_icons_cb (GtkWidget *widget,
- void *data)
-{
- RightClickMenuData *menu_data;
-
- g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (widget));
-
- if (data == NULL)
- return;
-
- menu_data = (RightClickMenuData *) data;
-
- if (! GTK_CHECK_MENU_ITEM (widget)->active)
- return;
-
- e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (menu_data->shortcuts_view),
- menu_data->group_num,
- E_ICON_BAR_SMALL_ICONS);
-}
-
-static GnomeUIInfo icon_size_radio_group_uiinfo[] = {
- { GNOME_APP_UI_ITEM, N_("_Small icons"),
- N_("Show the shortcuts as small icons"), toggle_small_icons_cb, NULL,
- NULL, 0, 0, 0, 0 },
- { GNOME_APP_UI_ITEM, N_("_Large icons"),
- N_("Show the shortcuts as large icons"), toggle_large_icons_cb, NULL,
- NULL, 0, 0, 0, 0 },
-
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo right_click_menu_uiinfo[] = {
- GNOMEUIINFO_RADIOLIST (icon_size_radio_group_uiinfo),
- GNOMEUIINFO_END
-};
-
-static void
-pop_up_right_click_menu_for_group (EShortcutsView *shortcuts_view,
- GdkEventButton *event,
- int group_num)
-{
- RightClickMenuData *menu_data;
- GtkWidget *popup_menu;
-
- menu_data = g_new (RightClickMenuData, 1);
- menu_data->shortcuts_view = shortcuts_view;
- menu_data->group_num = group_num;
-
- popup_menu = gnome_popup_menu_new (right_click_menu_uiinfo);
-
- if (e_shortcut_bar_get_view_type (E_SHORTCUT_BAR (shortcuts_view), group_num)
- == E_ICON_BAR_SMALL_ICONS)
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (icon_size_radio_group_uiinfo[0].widget),
- TRUE);
- else
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (icon_size_radio_group_uiinfo[1].widget),
- TRUE);
-
- gnome_popup_menu_do_popup_modal (popup_menu, NULL, NULL, event, menu_data);
-
- g_free (menu_data);
- gtk_widget_destroy (popup_menu);
-}
-
-
-/* Shortcut right-click menu. */
-
-struct _ShortcutRightClickMenuData {
- EShortcutsView *shortcuts_view;
- int group_num;
- int item_num;
-};
-typedef struct _ShortcutRightClickMenuData ShortcutRightClickMenuData;
-
-static void
-activate_shortcut_cb (GtkWidget *widget,
- void *data)
-{
- ShortcutRightClickMenuData *menu_data;
- EShortcutsView *shortcuts_view;
- EShortcuts *shortcuts;
- const char *uri;
-
- menu_data = (ShortcutRightClickMenuData *) data;
- shortcuts_view = menu_data->shortcuts_view;
- shortcuts = shortcuts_view->priv->shortcuts;
-
- uri = e_shortcuts_get_uri (shortcuts, menu_data->group_num, menu_data->item_num);
- if (uri == NULL)
- return;
-
- gtk_signal_emit (GTK_OBJECT (shortcuts_view), signals[ACTIVATE_SHORTCUT],
- shortcuts, uri);
-}
-
-static void
-remove_shortcut_cb (GtkWidget *widget,
- void *data)
-{
- ShortcutRightClickMenuData *menu_data;
- EShortcutsView *shortcuts_view;
- EShortcuts *shortcuts;
-
- menu_data = (ShortcutRightClickMenuData *) data;
- shortcuts_view = menu_data->shortcuts_view;
- shortcuts = shortcuts_view->priv->shortcuts;
-
- e_shortcuts_remove_shortcut (shortcuts, menu_data->group_num, menu_data->item_num);
-
- /* FIXME not real model-view. */
- e_shortcut_model_remove_item (E_SHORTCUT_BAR (shortcuts_view)->model,
- menu_data->group_num,
- menu_data->item_num);
-}
-
-static GnomeUIInfo shortcut_right_click_menu_uiinfo[] = {
- GNOMEUIINFO_ITEM (N_("Activate"), N_("Activate this shortcut"),
- activate_shortcut_cb, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_STOCK (N_("Remove"), N_("Remove this shortcut from the shortcut bar"),
- remove_shortcut_cb, GNOME_STOCK_MENU_CLOSE),
- GNOMEUIINFO_END
-};
-
-static void
-pop_up_right_click_menu_for_shortcut (EShortcutsView *shortcuts_view,
- GdkEventButton *event,
- int group_num,
- int item_num)
-{
- ShortcutRightClickMenuData *menu_data;
- GtkWidget *popup_menu;
-
- menu_data = g_new (ShortcutRightClickMenuData, 1);
- menu_data->shortcuts_view = shortcuts_view;
- menu_data->group_num = group_num;
- menu_data->item_num = item_num;
-
- popup_menu = gnome_popup_menu_new (shortcut_right_click_menu_uiinfo);
-
- gnome_popup_menu_do_popup_modal (popup_menu, NULL, NULL, event, menu_data);
-
- g_free (menu_data);
- gtk_widget_destroy (popup_menu);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EShortcutsViewPrivate *priv;
- EShortcutsView *shortcuts_view;
-
- shortcuts_view = E_SHORTCUTS_VIEW (object);
-
- priv = shortcuts_view->priv;
-
- gtk_object_unref (GTK_OBJECT (priv->shortcuts));
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* EShortcutBar methods. */
-
-static void
-selected_item (EShortcutBar *shortcut_bar,
- GdkEvent *event,
- int group_num,
- int item_num)
-{
- EShortcuts *shortcuts;
- EShortcutsView *shortcuts_view;
- const char *uri;
-
- shortcuts_view = E_SHORTCUTS_VIEW (shortcut_bar);
- shortcuts = shortcuts_view->priv->shortcuts;
-
- if (event->button.button == 3) {
- if (item_num < 0)
- pop_up_right_click_menu_for_group (shortcuts_view, &event->button,
- group_num);
- else
- pop_up_right_click_menu_for_shortcut (shortcuts_view, &event->button,
- group_num, item_num);
- return;
- } else if (event->button.button != 1) {
- return;
- }
-
- if (item_num < 0)
- return;
-
- uri = e_shortcuts_get_uri (shortcuts, group_num, item_num);
- if (uri == NULL)
- return;
-
- gtk_signal_emit (GTK_OBJECT (shortcuts_view), signals[ACTIVATE_SHORTCUT],
- shortcuts, uri);
-}
-
-#if 0
-static void
-added_item (EShortcutBar *shortcut_bar,
- int group_num,
- int item_num)
-{
- EShortcutsViewPrivate *priv;
- EShortcutBarGroup *group;
- EShortcuts *shortcuts;
- const char *url;
-
- priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv;
- shortcuts = priv->shortcuts;
-
- if (shortcuts == NULL)
- return;
-
- /* FIXME ** NASTY ** */
-
- group = &g_array_index (shortcut_bar->groups, EShortcutBarGroup, group_num);
- url = e_icon_bar_get_item_data (E_ICON_BAR (group->icon_bar), item_num);
-
- if (url == NULL) {
- g_warning ("NULL URL being added to the shortcut bar!?");
- return;
- }
-
- e_shortcuts_add_shortcut (shortcuts, group_num, item_num, url);
-}
-
-static void
-removed_item (EShortcutBar *shortcut_bar,
- int group_num,
- int item_num)
-{
- EShortcutsViewPrivate *priv;
- EShortcuts *shortcuts;
-
- priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv;
- shortcuts = priv->shortcuts;
-
- e_shortcuts_remove_shortcut (shortcuts, group_num, item_num);
-}
-
-static void
-added_group (EShortcutBar *shortcut_bar,
- int group_num)
-{
- EShortcutsViewPrivate *priv;
- EShortcuts *shortcuts;
- EShortcutBarGroup *group;
- const char *group_name;
-
- priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv;
- shortcuts = priv->shortcuts;
-
- if (shortcuts == NULL)
- return;
-
- group = &g_array_index (shortcut_bar->groups, EShortcutBarGroup, group_num);
-
- /* FIXME Losing EShortcutBar does not give me a method to retrieve the
- group name. */
- group_name = "Foo";
-
- e_shortcuts_add_group (shortcuts, group_num, group_name);
-}
-
-static void
-removed_group (EShortcutBar *shortcut_bar,
- int group_num)
-{
- EShortcutsViewPrivate *priv;
- EShortcuts *shortcuts;
-
- priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv;
- shortcuts = priv->shortcuts;
-
- if (shortcuts == NULL)
- return;
-
- e_shortcuts_remove_group (shortcuts, group_num);
-}
-#endif
-
-
-static void
-class_init (EShortcutsViewClass *klass)
-{
- GtkObjectClass *object_class;
- EShortcutBarClass *shortcut_bar_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- shortcut_bar_class = E_SHORTCUT_BAR_CLASS (klass);
- shortcut_bar_class->selected_item = selected_item;
-#if 0
- shortcut_bar_class->added_item = added_item;
- shortcut_bar_class->removed_item = removed_item;
- shortcut_bar_class->added_group = added_group;
- shortcut_bar_class->removed_group = removed_group;
-#endif
- parent_class = gtk_type_class (e_shortcut_bar_get_type ());
-
- signals[ACTIVATE_SHORTCUT] =
- gtk_signal_new ("activate_shortcut",
- GTK_RUN_LAST | GTK_RUN_ACTION,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShortcutsViewClass, activate_shortcut),
- gtk_marshal_NONE__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_STRING);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (EShortcutsView *shortcuts_view)
-{
- EShortcutsViewPrivate *priv;
-
- priv = g_new (EShortcutsViewPrivate, 1);
- priv->shortcuts = NULL;
-
- shortcuts_view->priv = priv;
-}
-
-
-void
-e_shortcuts_view_construct (EShortcutsView *shortcuts_view,
- EShortcuts *shortcuts)
-{
- EShortcutsViewPrivate *priv;
-
- g_return_if_fail (shortcuts != NULL);
- g_return_if_fail (E_IS_SHORTCUTS (shortcuts));
-
- priv = shortcuts_view->priv;
-
- e_shortcut_bar_set_model (E_SHORTCUT_BAR (shortcuts_view),
- e_shortcut_model_new ());
-
- e_shortcut_bar_set_icon_callback (E_SHORTCUT_BAR (shortcuts_view), icon_callback,
- shortcuts);
-
- load_all_shortcuts (shortcuts_view, shortcuts);
-}
-
-GtkWidget *
-e_shortcuts_view_new (EShortcuts *shortcuts)
-{
- GtkWidget *new;
-
- g_return_val_if_fail (shortcuts != NULL, NULL);
- g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL);
-
- new = gtk_type_new (e_shortcuts_view_get_type ());
- e_shortcuts_view_construct (E_SHORTCUTS_VIEW (new), shortcuts);
-
- return new;
-}
-
-
-E_MAKE_TYPE (e_shortcuts_view, "EShortcutsView", EShortcutsView, class_init, init, PARENT_TYPE)
diff --git a/shell/e-shortcuts-view.h b/shell/e-shortcuts-view.h
deleted file mode 100644
index 8f6f8cb0af..0000000000
--- a/shell/e-shortcuts-view.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shortcuts-view.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_SHORTCUTS_VIEW_H_
-#define _E_SHORTCUTS_VIEW_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-
-#include "shortcut-bar/e-shortcut-bar.h"
-#include "e-shortcuts.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_SHORTCUTS_VIEW (e_shortcuts_view_get_type ())
-#define E_SHORTCUTS_VIEW(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHORTCUTS_VIEW, EShortcutsView))
-#define E_SHORTCUTS_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHORTCUTS_VIEW, EShortcutsViewClass))
-#define E_IS_SHORTCUTS_VIEW(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHORTCUTS_VIEW))
-#define E_IS_SHORTCUTS_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHORTCUTS_VIEW))
-
-
-typedef struct _EShortcutsView EShortcutsView;
-typedef struct _EShortcutsViewPrivate EShortcutsViewPrivate;
-typedef struct _EShortcutsViewClass EShortcutsViewClass;
-
-struct _EShortcutsView {
- EShortcutBar parent;
-
- EShortcutsViewPrivate *priv;
-};
-
-struct _EShortcutsViewClass {
- EShortcutBarClass parent_class;
-
- void (* activate_shortcut) (EShortcutsView *view,
- EShortcuts *shortcuts,
- const char *uri);
-};
-
-
-GtkType e_shortcuts_view_get_type (void);
-void e_shortcuts_view_construct (EShortcutsView *shortcuts_view,
- EShortcuts *shortcuts);
-GtkWidget *e_shortcuts_view_new (EShortcuts *shortcuts);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_SHORTCUTS_VIEW_H_ */
diff --git a/shell/e-shortcuts.c b/shell/e-shortcuts.c
deleted file mode 100644
index 1828406df3..0000000000
--- a/shell/e-shortcuts.c
+++ /dev/null
@@ -1,760 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shortcuts.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-/* The shortcut list goes this:
-
- <?xml version="1.0"?>
- <shortcuts>
- <group title="Evolution shortcuts">
- <item>evolution:/local/Inbox</item>
- <item>evolution:/local/Trash</item>
- <item>evolution:/local/Calendar</item>
- </group>
-
- <group title="Personal shortcuts">
- <item>evolution:/local/Personal</item>
- </group>
- </shortcuts>
-
- FIXME: Do we want to use a namespace for this?
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkobject.h>
-#include <gtk/gtktypeutils.h>
-
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include <string.h>
-
-#include "e-util/e-util.h"
-#include "e-util/e-xml-utils.h"
-
-#include "shortcut-bar/e-shortcut-bar.h"
-#include "e-shortcuts-view.h"
-
-#include "e-shortcuts.h"
-
-
-#define PARENT_TYPE GTK_TYPE_OBJECT
-static GtkObjectClass *parent_class = NULL;
-
-struct _ShortcutGroup {
- /* Title of the group. */
- char *title;
-
- /* A list of strings with the URI for the shortcut. */
- GList *shortcuts;
-};
-typedef struct _ShortcutGroup ShortcutGroup;
-
-struct _EShortcutsPrivate {
- /* Name of the file associated with these shortcuts. Changes in the shortcuts
- will update this file automatically. */
- char *file_name;
-
- /* ID of the idle function that will be called to save the shortcuts when they are
- changed. */
- int save_idle_id;
-
- /* Whether these shortcuts need to be saved to disk. */
- gboolean dirty;
-
- /* The storage set to which these shortcuts are associated. */
- EStorageSet *storage_set;
-
- /* The folder type registry. */
- EFolderTypeRegistry *folder_type_registry;
-
- /* A list of ShortcutGroups. */
- GList *groups;
-
- /* A list of ShortcutViews. */
- GList *views;
-
- /* A hash table to get a group given its name. */
- GHashTable *title_to_group;
-};
-
-enum {
- NEW_GROUP,
- REMOVE_GROUP,
- NEW_SHORTCUT,
- REMOVE_SHORTCUT,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-static void
-unload_shortcuts (EShortcuts *shortcuts)
-{
- EShortcutsPrivate *priv;
- GList *orig_groups;
- GList *p, *q;
-
- priv = shortcuts->priv;
- orig_groups = priv->groups;
-
- for (p = priv->groups; p != NULL; p = p->next) {
- ShortcutGroup *group;
-
- gtk_signal_emit (GTK_OBJECT (shortcuts), signals[REMOVE_GROUP], 0);
-
- group = (ShortcutGroup *) p->data;
-
- g_hash_table_remove (priv->title_to_group, group->title);
-
- for (q = group->shortcuts; q != NULL; q = q->next)
- g_free (q->data);
- g_free (group->title);
-
- g_list_free (group->shortcuts);
-
- priv->groups = priv->groups->next;
- }
-
- if (orig_groups != NULL)
- g_list_free (orig_groups);
-
- priv->groups = NULL;
-
- g_hash_table_destroy (priv->title_to_group);
- priv->title_to_group = g_hash_table_new (g_str_hash, g_str_equal);
-}
-
-static gboolean
-load_shortcuts (EShortcuts *shortcuts,
- const char *file_name)
-{
- EShortcutsPrivate *priv;
- xmlDoc *doc;
- xmlNode *root;
- xmlNode *p, *q;
-
- /* FIXME: Update the views by emitting the appropriate signals. */
-
- priv = shortcuts->priv;
-
- doc = xmlParseFile (file_name);
- if (doc == NULL)
- return FALSE;
-
- root = xmlDocGetRootElement (doc);
- if (root == NULL || strcmp (root->name, "shortcuts") != 0) {
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- unload_shortcuts (shortcuts);
-
- for (p = root->childs; p != NULL; p = p->next) {
- ShortcutGroup *shortcut_group;
- char *shortcut_group_title;
-
- if (strcmp ((char *) p->name, "group") != 0)
- continue;
-
- shortcut_group_title = (char *) xmlGetProp (p, "title");
- if (shortcut_group_title == NULL)
- continue;
-
- shortcut_group = g_hash_table_lookup (priv->title_to_group,
- shortcut_group_title);
- if (shortcut_group != NULL) {
- g_warning ("Duplicate shortcut group title -- %s",
- shortcut_group_title);
- xmlFree (shortcut_group_title);
- continue;
- }
-
- shortcut_group = g_new (ShortcutGroup, 1);
- shortcut_group->title = g_strdup (shortcut_group_title);
- xmlFree (shortcut_group_title);
-
- shortcut_group->shortcuts = NULL;
- for (q = p->childs; q != NULL; q = q->next) {
- char *content;
-
- if (strcmp ((char *) q->name, "item") != 0)
- continue;
-
- content = xmlNodeListGetString (doc, q->childs, 1);
- shortcut_group->shortcuts = g_list_prepend (shortcut_group->shortcuts,
- g_strdup (content));
- xmlFree (content);
- }
- shortcut_group->shortcuts = g_list_reverse (shortcut_group->shortcuts);
-
- priv->groups = g_list_prepend (priv->groups, shortcut_group);
- g_hash_table_insert (priv->title_to_group, shortcut_group->title, shortcut_group);
- }
-
- priv->groups = g_list_reverse (priv->groups);
-
- xmlFreeDoc (doc);
-
- return TRUE;
-}
-
-static gboolean
-save_shortcuts (EShortcuts *shortcuts,
- const char *file_name)
-{
- EShortcutsPrivate *priv;
- xmlDoc *doc;
- xmlNode *root;
- GList *p, *q;
-
- priv = shortcuts->priv;
-
- doc = xmlNewDoc ((xmlChar *) "1.0");
- root = xmlNewDocNode (doc, NULL, (xmlChar *) "shortcuts", NULL);
- xmlDocSetRootElement (doc, root);
-
- for (p = priv->groups; p != NULL; p = p->next) {
- ShortcutGroup *group;
- xmlNode *group_node;
-
- group = (ShortcutGroup *) p->data;
- group_node = xmlNewChild (root, NULL, (xmlChar *) "group", NULL);
-
- xmlSetProp (group_node, (xmlChar *) "title", group->title);
-
- for (q = group->shortcuts; q != NULL; q = q->next) {
- const char *shortcut;
-
- shortcut = (const char *) q->data;
- xmlNewChild (group_node, NULL, (xmlChar *) "item", (xmlChar *) shortcut);
- }
- }
-
- if (xmlSaveFile (file_name, doc) < 0) {
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- xmlFreeDoc (doc);
- return TRUE;
-}
-
-
-/* Idle function to update the file on disk. */
-
-static int
-idle_cb (void *data)
-{
- EShortcuts *shortcuts;
- EShortcutsPrivate *priv;
-
- shortcuts = E_SHORTCUTS (data);
- priv = shortcuts->priv;
-
- if (priv->dirty) {
- g_print ("Saving shortcuts -- %s\n", priv->file_name);
- if (! e_shortcuts_save (shortcuts, NULL))
- g_warning ("Saving of shortcuts failed -- %s", priv->file_name);
- else
- priv->dirty = FALSE;
- }
-
- priv->save_idle_id = 0;
-
- return FALSE;
-}
-
-static void
-schedule_idle (EShortcuts *shortcuts)
-{
- EShortcutsPrivate *priv;
-
- priv = shortcuts->priv;
-
- if (priv->save_idle_id != 0)
- return;
-
- gtk_idle_add (idle_cb, shortcuts);
-}
-
-static void
-make_dirty (EShortcuts *shortcuts)
-{
- EShortcutsPrivate *priv;
-
- priv = shortcuts->priv;
-
- priv->dirty = TRUE;
- schedule_idle (shortcuts);
-}
-
-
-/* Signal handlers for the views. */
-
-static void
-view_destroyed_cb (GtkObject *object,
- gpointer data)
-{
- EShortcuts *shortcuts;
- EShortcutsPrivate *priv;
-
- shortcuts = E_SHORTCUTS (data);
- priv = shortcuts->priv;
-
- priv->views = g_list_remove (priv->views, object);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EShortcuts *shortcuts;
- EShortcutsPrivate *priv;
-
- shortcuts = E_SHORTCUTS (object);
- priv = shortcuts->priv;
-
- g_free (priv->file_name);
-
- if (priv->storage_set != NULL)
- gtk_object_unref (GTK_OBJECT (priv->storage_set));
-
- if (priv->folder_type_registry != NULL)
- gtk_object_unref (GTK_OBJECT (priv->folder_type_registry));
-
- unload_shortcuts (shortcuts);
-
- if (priv->save_idle_id != 0)
- gtk_idle_remove (priv->save_idle_id);
-
- if (priv->dirty) {
- if (! e_shortcuts_save (shortcuts, NULL))
- g_warning (_("Error saving shortcuts.")); /* FIXME */
- }
-
- g_hash_table_destroy (priv->title_to_group);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-class_init (EShortcutsClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass*) klass;
- object_class->destroy = destroy;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-
- signals[NEW_GROUP]
- = gtk_signal_new ("new_group",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShortcutsClass, new_group),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_INT);
-
- signals[REMOVE_GROUP]
- = gtk_signal_new ("remove_group",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShortcutsClass, remove_group),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_INT);
-
- signals[NEW_SHORTCUT]
- = gtk_signal_new ("new_shortcut",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShortcutsClass, new_shortcut),
- gtk_marshal_NONE__INT_INT,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_INT,
- GTK_TYPE_INT);
-
- signals[REMOVE_SHORTCUT]
- = gtk_signal_new ("remove_shortcut",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShortcutsClass, remove_shortcut),
- gtk_marshal_NONE__INT_INT,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_INT,
- GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-
-static void
-init (EShortcuts *shortcuts)
-{
- EShortcutsPrivate *priv;
-
- priv = g_new (EShortcutsPrivate, 1);
-
- priv->file_name = NULL;
- priv->storage_set = NULL;
- priv->groups = NULL;
- priv->views = NULL;
- priv->title_to_group = g_hash_table_new (g_str_hash, g_str_equal);
- priv->dirty = 0;
- priv->save_idle_id = 0;
-
- shortcuts->priv = priv;
-}
-
-
-void
-e_shortcuts_construct (EShortcuts *shortcuts,
- EStorageSet *storage_set,
- EFolderTypeRegistry *folder_type_registry)
-{
- EShortcutsPrivate *priv;
-
- g_return_if_fail (shortcuts != NULL);
- g_return_if_fail (E_IS_SHORTCUTS (shortcuts));
- g_return_if_fail (storage_set != NULL);
- g_return_if_fail (E_IS_STORAGE_SET (storage_set));
-
- GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (shortcuts), GTK_FLOATING);
-
- priv = shortcuts->priv;
-
- gtk_object_ref (GTK_OBJECT (storage_set));
- priv->storage_set = storage_set;
-
- gtk_object_ref (GTK_OBJECT (folder_type_registry));
- priv->folder_type_registry = folder_type_registry;
-}
-
-EShortcuts *
-e_shortcuts_new (EStorageSet *storage_set,
- EFolderTypeRegistry *folder_type_registry,
- const char *file_name)
-{
- EShortcuts *new;
-
- g_return_val_if_fail (storage_set != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL);
-
- new = gtk_type_new (e_shortcuts_get_type ());
- e_shortcuts_construct (new, storage_set, folder_type_registry);
-
- if (! e_shortcuts_load (new, file_name)) {
- gtk_object_unref (GTK_OBJECT (new));
- return NULL;
- }
-
- return new;
-}
-
-
-GList *
-e_shortcuts_get_group_titles (EShortcuts *shortcuts)
-{
- EShortcutsPrivate *priv;
- ShortcutGroup *group;
- GList *list;
- GList *p;
-
- g_return_val_if_fail (shortcuts != NULL, NULL);
- g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL);
-
- priv = shortcuts->priv;
-
- list = NULL;
-
- for (p = priv->groups; p != NULL; p = p->next) {
- group = (ShortcutGroup *) p->data;
- list = g_list_prepend (list, g_strdup (group->title));
- }
-
- return g_list_reverse (list);
-}
-
-GList *
-e_shortcuts_get_shortcuts_in_group (EShortcuts *shortcuts,
- const char *group_title)
-{
- EShortcutsPrivate *priv;
- ShortcutGroup *shortcut_group;
- GList *list;
- GList *p;
-
- priv = shortcuts->priv;
-
- g_return_val_if_fail (shortcuts != NULL, NULL);
- g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL);
- g_return_val_if_fail (group_title != NULL, NULL);
-
- shortcut_group = g_hash_table_lookup (priv->title_to_group, group_title);
- if (shortcut_group == NULL)
- return NULL;
-
- list = NULL;
-
- for (p = shortcut_group->shortcuts; p != NULL; p = p->next)
- list = g_list_prepend (list, g_strdup ((const char *) p->data));
-
- return g_list_reverse (list);
-}
-
-
-EStorageSet *
-e_shortcuts_get_storage_set (EShortcuts *shortcuts)
-{
- g_return_val_if_fail (shortcuts != NULL, NULL);
- g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL);
-
- return shortcuts->priv->storage_set;
-}
-
-
-GtkWidget *
-e_shortcuts_new_view (EShortcuts *shortcuts)
-{
- EShortcutsPrivate *priv;
- GtkWidget *new;
-
- g_return_val_if_fail (shortcuts != NULL, NULL);
- g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL);
-
- priv = shortcuts->priv;
-
- new = e_shortcuts_view_new (shortcuts);
- priv->views = g_list_prepend (priv->views, new);
-
- gtk_signal_connect (GTK_OBJECT (new), "destroy", view_destroyed_cb, shortcuts);
-
- return new;
-}
-
-
-gboolean
-e_shortcuts_load (EShortcuts *shortcuts,
- const char *file_name)
-{
- EShortcutsPrivate *priv;
- char *tmp;
-
- g_return_val_if_fail (shortcuts != NULL, FALSE);
- g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), FALSE);
- g_return_val_if_fail (file_name == NULL || g_path_is_absolute (file_name), FALSE);
-
- priv = shortcuts->priv;
-
- if (file_name == NULL) {
- if (priv->file_name == NULL)
- return FALSE;
- file_name = priv->file_name;
- }
-
- if (! load_shortcuts (shortcuts, file_name))
- return FALSE;
-
- tmp = g_strdup (file_name);
- g_free (priv->file_name);
- priv->file_name = tmp;
-
- return TRUE;
-}
-
-gboolean
-e_shortcuts_save (EShortcuts *shortcuts,
- const char *file_name)
-{
- EShortcutsPrivate *priv;
- char *tmp;
-
- g_return_val_if_fail (shortcuts != NULL, FALSE);
- g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), FALSE);
- g_return_val_if_fail (file_name == NULL || g_path_is_absolute (file_name), FALSE);
-
- priv = shortcuts->priv;
-
- if (file_name == NULL) {
- if (priv->file_name == NULL)
- return FALSE;
- file_name = priv->file_name;
- }
-
- if (! save_shortcuts (shortcuts, file_name))
- return FALSE;
-
- tmp = g_strdup (file_name);
- g_free (priv->file_name);
- priv->file_name = tmp;
-
- return TRUE;
-}
-
-
-const char *
-e_shortcuts_get_uri (EShortcuts *shortcuts, int group_num, int num)
-{
- EShortcutsPrivate *priv;
- ShortcutGroup *group;
- GList *shortcut_element;
-
- g_return_val_if_fail (shortcuts != NULL, NULL);
- g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL);
-
- priv = shortcuts->priv;
-
- group = g_list_nth (priv->groups, group_num)->data;
- if (group == NULL)
- return NULL;
-
- shortcut_element = g_list_nth (group->shortcuts, num);
- if (shortcut_element == NULL)
- return NULL;
-
- return shortcut_element->data;
-}
-
-
-void
-e_shortcuts_remove_shortcut (EShortcuts *shortcuts,
- int group_num,
- int num)
-{
- EShortcutsPrivate *priv;
- ShortcutGroup *group;
- GList *p;
- char *uri;
-
- g_return_if_fail (shortcuts != NULL);
- g_return_if_fail (E_IS_SHORTCUTS (shortcuts));
-
- priv = shortcuts->priv;
-
- p = g_list_nth (priv->groups, group_num);
- g_return_if_fail (p != NULL);
-
- group = (ShortcutGroup *) p->data;
-
- p = g_list_nth (group->shortcuts, num);
- g_return_if_fail (p != NULL);
-
- gtk_signal_emit (GTK_OBJECT (shortcuts), signals[REMOVE_SHORTCUT], group_num, num);
-
- uri = (char *) p->data;
- g_free (uri);
-
- group->shortcuts = g_list_remove_link (group->shortcuts, p);
-
- make_dirty (shortcuts);
-}
-
-void
-e_shortcuts_add_shortcut (EShortcuts *shortcuts,
- int group_num,
- int num,
- const char *uri)
-{
- EShortcutsPrivate *priv;
- ShortcutGroup *group;
- GList *p;
-
- g_return_if_fail (shortcuts != NULL);
- g_return_if_fail (E_IS_SHORTCUTS (shortcuts));
-
- priv = shortcuts->priv;
-
- p = g_list_nth (priv->groups, group_num);
- g_return_if_fail (p != NULL);
-
- group = (ShortcutGroup *) p->data;
-
- group->shortcuts = g_list_insert (group->shortcuts, g_strdup (uri), num);
-
- gtk_signal_emit (GTK_OBJECT (shortcuts), signals[NEW_SHORTCUT], group_num, num);
-
- make_dirty (shortcuts);
-}
-
-void
-e_shortcuts_remove_group (EShortcuts *shortcuts,
- int group_num)
-{
- EShortcutsPrivate *priv;
- ShortcutGroup *group;
- GList *p;
-
- g_return_if_fail (shortcuts != NULL);
- g_return_if_fail (E_IS_SHORTCUTS (shortcuts));
-
- priv = shortcuts->priv;
-
- p = g_list_nth (priv->groups, group_num);
- g_return_if_fail (p != NULL);
-
- gtk_signal_emit (GTK_OBJECT (shortcuts), signals[REMOVE_GROUP], group_num);
-
- group = (ShortcutGroup *) p->data;
-
- e_free_string_list (group->shortcuts);
-
- priv->groups = g_list_remove_link (priv->groups, p);
-
- make_dirty (shortcuts);
-}
-
-void
-e_shortcuts_add_group (EShortcuts *shortcuts,
- int group_num,
- const char *group_name)
-{
- EShortcutsPrivate *priv;
- ShortcutGroup *group;
-
- g_return_if_fail (shortcuts != NULL);
- g_return_if_fail (E_IS_SHORTCUTS (shortcuts));
-
- priv = shortcuts->priv;
-
- group = g_new (ShortcutGroup, 1);
- group->title = g_strdup (group_name);
- group->shortcuts = NULL;
-
- priv->groups = g_list_insert (priv->groups, group, group_num);
-
- gtk_signal_emit (GTK_OBJECT (shortcuts), signals[NEW_GROUP], group_num);
-
- make_dirty (shortcuts);
-}
-
-
-E_MAKE_TYPE (e_shortcuts, "EShortcuts", EShortcuts, class_init, init, PARENT_TYPE)
-
diff --git a/shell/e-shortcuts.h b/shell/e-shortcuts.h
deleted file mode 100644
index da4dfc1fa0..0000000000
--- a/shell/e-shortcuts.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shortcuts.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_SHORTCUTS_H_
-#define _E_SHORTCUTS_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkwidget.h>
-
-#include "e-folder-type-registry.h"
-#include "e-storage-set.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_SHORTCUTS (e_shortcuts_get_type ())
-#define E_SHORTCUTS(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHORTCUTS, EShortcuts))
-#define E_SHORTCUTS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHORTCUTS, EShortcutsClass))
-#define E_IS_SHORTCUTS(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHORTCUTS))
-#define E_IS_SHORTCUTS_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHORTCUTS))
-
-
-typedef struct _EShortcuts EShortcuts;
-typedef struct _EShortcutsPrivate EShortcutsPrivate;
-typedef struct _EShortcutsClass EShortcutsClass;
-
-struct _EShortcuts {
- GtkObject parent;
-
- EShortcutsPrivate *priv;
-};
-
-struct _EShortcutsClass {
- GtkObjectClass parent_class;
-
- /* Signals. */
-
- void (* new_group) (EShortcuts *shortcuts, int group_num);
- void (* remove_group) (EShortcuts *shortcuts, int group_num);
- void (* new_shortcut) (EShortcuts *shortcuts, int group_num, int item_num);
- void (* remove_shortcut) (EShortcuts *shortcuts, int group_num, int item_num);}
-;
-
-
-GtkType e_shortcuts_get_type (void);
-void e_shortcuts_construct (EShortcuts *shortcuts,
- EStorageSet *storage_set,
- EFolderTypeRegistry *folder_type_registry);
-EShortcuts *e_shortcuts_new (EStorageSet *storage_set,
- EFolderTypeRegistry *folder_type_registry,
- const char *file_name);
-
-GList *e_shortcuts_get_group_titles (EShortcuts *shortcuts);
-GList *e_shortcuts_get_shortcuts_in_group (EShortcuts *shortcuts,
- const char *group_title);
-EStorageSet *e_shortcuts_get_storage_set (EShortcuts *shortcuts);
-GtkWidget *e_shortcuts_new_view (EShortcuts *shortcuts);
-
-gboolean e_shortcuts_load (EShortcuts *shortcuts,
- const char *path);
-gboolean e_shortcuts_save (EShortcuts *shortcuts,
- const char *path);
-
-const char *e_shortcuts_get_uri (EShortcuts *shortcuts,
- int group_num,
- int num);
-
-void e_shortcuts_remove_shortcut (EShortcuts *shortcuts,
- int group_num,
- int num);
-void e_shortcuts_add_shortcut (EShortcuts *shortcuts,
- int group_num,
- int num,
- const char *uri);
-void e_shortcuts_remove_group (EShortcuts *shortcuts,
- int group_num);
-void e_shortcuts_add_group (EShortcuts *shortcuts,
- int group_num,
- const char *group_name);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_SHORTCUTS_H_ */
diff --git a/shell/e-storage-set-view.c b/shell/e-storage-set-view.c
deleted file mode 100644
index ea7eb938ee..0000000000
--- a/shell/e-storage-set-view.c
+++ /dev/null
@@ -1,1003 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-storage-set-view.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-
-#include "e-util/e-util.h"
-#include "e-shell-constants.h"
-
-#include "e-storage-set-view.h"
-
-
-#define PARENT_TYPE GTK_TYPE_CTREE
-static GtkCTreeClass *parent_class = NULL;
-
-struct _EStorageSetViewPrivate {
- EStorageSet *storage_set;
-
- /* These tables must always be kept in sync, and one cannot exist
- without the other, as they share the dynamically allocated path. */
- GHashTable *ctree_node_to_path;
- GHashTable *path_to_ctree_node;
-
- /* Path of the row selected by the latest "tree_select_row" signal. */
- const char *selected_row_path;
-
- /* Path of the row currently being dragged. */
- const char *dragged_row_path;
-
- /* Path of the row that was selected before the latest click. */
- const char *selected_row_path_before_click;
-
- /* Whether we are currently performing a drag from this view. */
- int in_drag : 1;
-
- /* X/Y position for the last button click. */
- int button_x, button_y;
-
- /* Button used for the drag. This is initialized in the `button_press_event'
- handler. */
- int drag_button;
-};
-
-#define DRAG_RESISTANCE 3
-
-
-enum {
- FOLDER_SELECTED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-/* DND stuff. */
-
-enum _DndTargetType {
- DND_TARGET_TYPE_URI_LIST,
- DND_TARGET_TYPE_E_SHORTCUT
-};
-typedef enum _DndTargetType DndTargetType;
-
-#define URI_LIST_TYPE "text/uri-list"
-#define E_SHORTCUT_TYPE "E-SHORTCUT"
-
-static GtkTargetEntry drag_types [] = {
- { URI_LIST_TYPE, 0, DND_TARGET_TYPE_URI_LIST },
- { E_SHORTCUT_TYPE, 0, DND_TARGET_TYPE_E_SHORTCUT }
-};
-static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]);
-
-static GtkTargetList *target_list;
-
-
-/* Helper functions. */
-
-static gboolean
-add_node_to_hashes (EStorageSetView *storage_set_view,
- const char *path,
- GtkCTreeNode *node)
-{
- EStorageSetViewPrivate *priv;
- char *hash_path;
-
- g_return_val_if_fail (g_path_is_absolute (path), FALSE);
-
- priv = storage_set_view->priv;
-
- if (g_hash_table_lookup (priv->path_to_ctree_node, path) != NULL) {
- g_warning ("EStorageSetView: Node already existing while adding -- %s", path);
- return FALSE;
- }
-
- g_print ("EStorageSetView: Adding -- %s\n", path);
-
- hash_path = g_strdup (path);
-
- g_hash_table_insert (priv->path_to_ctree_node, hash_path, node);
- g_hash_table_insert (priv->ctree_node_to_path, node, hash_path);
-
- return TRUE;
-}
-
-static GtkCTreeNode *
-remove_node_from_hashes (EStorageSetView *storage_set_view,
- const char *path)
-{
- EStorageSetViewPrivate *priv;
- GtkCTreeNode *node;
- char *hash_path;
-
- priv = storage_set_view->priv;
-
- node = g_hash_table_lookup (priv->path_to_ctree_node, path);
- if (node == NULL) {
- g_warning ("EStorageSetView: Node not found while removing -- %s", path);
- return NULL;
- }
-
- g_print ("EStorageSetView: Removing -- %s\n", path);
-
- hash_path = g_hash_table_lookup (priv->ctree_node_to_path, node);
- g_free (hash_path);
-
- g_hash_table_remove (priv->ctree_node_to_path, node);
- g_hash_table_remove (priv->path_to_ctree_node, path);
-
- return node;
-}
-
-static void
-get_pixmap_and_mask_for_folder (EStorageSetView *storage_set_view,
- EFolder *folder,
- GdkPixmap **pixmap_return,
- GdkBitmap **mask_return)
-{
- EFolderTypeRegistry *folder_type_registry;
- EStorageSet *storage_set;
- const char *type_name;
- GdkPixbuf *icon_pixbuf;
- GdkPixbuf *scaled_pixbuf;
- GdkVisual *visual;
- GdkGC *gc;
-
- storage_set = storage_set_view->priv->storage_set;
- folder_type_registry = e_storage_set_get_folder_type_registry (storage_set);
-
- type_name = e_folder_get_type_string (folder);
- icon_pixbuf = e_folder_type_registry_get_icon_for_type (folder_type_registry,
- type_name, TRUE);
-
- if (icon_pixbuf == NULL) {
- *pixmap_return = NULL;
- *mask_return = NULL;
- return;
- }
-
- scaled_pixbuf = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (icon_pixbuf),
- gdk_pixbuf_get_has_alpha (icon_pixbuf),
- gdk_pixbuf_get_bits_per_sample (icon_pixbuf),
- E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE);
-
- gdk_pixbuf_scale (icon_pixbuf, scaled_pixbuf,
- 0, 0, E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE,
- 0.0, 0.0,
- (double) E_SHELL_MINI_ICON_SIZE / gdk_pixbuf_get_width (icon_pixbuf),
- (double) E_SHELL_MINI_ICON_SIZE / gdk_pixbuf_get_height (icon_pixbuf),
- GDK_INTERP_HYPER);
-
- visual = gdk_rgb_get_visual ();
- *pixmap_return = gdk_pixmap_new (NULL,
- E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE,
- visual->depth);
-
- gc = gdk_gc_new (*pixmap_return);
- gdk_pixbuf_render_to_drawable (scaled_pixbuf, *pixmap_return, gc, 0, 0, 0, 0,
- E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE,
- GDK_RGB_DITHER_NORMAL, 0, 0);
- gdk_gc_unref (gc);
-
- *mask_return = gdk_pixmap_new (NULL, E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE, 1);
- gdk_pixbuf_render_threshold_alpha (scaled_pixbuf, *mask_return,
- 0, 0, 0, 0,
- E_SHELL_MINI_ICON_SIZE, E_SHELL_MINI_ICON_SIZE,
- 0x7f);
-
- gdk_pixbuf_unref (scaled_pixbuf);
-}
-
-
-/* Folder context menu. */
-/* FIXME: This should be moved somewhere else, so that also the sortcut code
- can share it. */
-
-static void
-folder_context_menu_activate_cb (BonoboUIHandler *uih,
- void *data,
- const char *path)
-{
- EStorageSetView *storage_set_view;
- EStorageSetViewPrivate *priv;
-
- storage_set_view = E_STORAGE_SET_VIEW (data);
- priv = storage_set_view->priv;
-
- gtk_signal_emit (GTK_OBJECT (storage_set_view), signals[FOLDER_SELECTED],
- priv->selected_row_path);
-
- /* Make sure we don't restore the previously selected row after the
- menu is popped down. */
- priv->selected_row_path_before_click = NULL;
-}
-
-static void
-populate_folder_context_menu_with_common_items (EStorageSetView *storage_set_view,
- BonoboUIHandler *uih)
-{
- bonobo_ui_handler_menu_new_item (uih, "/Activate",
- _("_View"), _("View the selected folder"),
- 0, BONOBO_UI_HANDLER_PIXMAP_NONE,
- NULL, 0, 0,
- folder_context_menu_activate_cb,
- storage_set_view);
-}
-
-static void
-popup_folder_menu (EStorageSetView *storage_set_view,
- GdkEventButton *event)
-{
- EvolutionShellComponentClient *handler;
- EStorageSetViewPrivate *priv;
- EFolderTypeRegistry *folder_type_registry;
- BonoboUIHandler *uih;
- EFolder *folder;
-
- priv = storage_set_view->priv;
-
- uih = bonobo_ui_handler_new ();
- bonobo_ui_handler_create_popup_menu (uih);
-
- folder = e_storage_set_get_folder (priv->storage_set, priv->selected_row_path);
- if (folder == NULL) {
- /* Uh!? */
- return;
- }
-
- folder_type_registry = e_storage_set_get_folder_type_registry (priv->storage_set);
- g_assert (folder_type_registry != NULL);
-
- handler = e_folder_type_registry_get_handler_for_type (folder_type_registry,
- e_folder_get_type_string (folder));
- g_assert (handler != NULL);
-
- evolution_shell_component_client_populate_folder_context_menu (handler,
- uih,
- e_folder_get_physical_uri (folder),
- e_folder_get_type_string (folder));
-
- populate_folder_context_menu_with_common_items (storage_set_view, uih);
-
- bonobo_ui_handler_do_popup_menu (uih);
-
- bonobo_object_unref (BONOBO_OBJECT (uih));
-}
-
-
-/* GtkObject methods. */
-
-static void
-hash_foreach_free_path (gpointer key,
- gpointer value,
- gpointer data)
-{
- g_free (value);
-}
-
-static void
-destroy (GtkObject *object)
-{
- EStorageSetView *storage_set_view;
- EStorageSetViewPrivate *priv;
-
- storage_set_view = E_STORAGE_SET_VIEW (object);
- priv = storage_set_view->priv;
-
- gtk_object_unref (GTK_OBJECT (priv->storage_set));
-
- g_hash_table_foreach (priv->ctree_node_to_path, hash_foreach_free_path, NULL);
- g_hash_table_destroy (priv->ctree_node_to_path);
- g_hash_table_destroy (priv->path_to_ctree_node);
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* GtkWidget methods. */
-
-static int
-button_press_event (GtkWidget *widget,
- GdkEventButton *event)
-{
- EStorageSetView *storage_set_view;
- EStorageSetViewPrivate *priv;
-
- storage_set_view = E_STORAGE_SET_VIEW (widget);
- priv = storage_set_view->priv;
-
- priv->selected_row_path_before_click = priv->selected_row_path;
-
- (* GTK_WIDGET_CLASS (parent_class)->button_press_event) (widget, event);
-
- if (priv->in_drag)
- return FALSE;
-
- priv->drag_button = event->button;
- priv->button_x = event->x;
- priv->button_y = event->y;
-
- /* KLUDGE ALERT. So look at this. We need to grab the pointer now, to check for
- motion events and maybe start a drag operation. And GtkCTree seems to do it
- already in the `button_press_event'. *But* for some reason something is very
- broken somewhere and the grab misbehaves when done by GtkCTree's
- `button_press_event'. So we have to ungrab the pointer and re-grab it our way.
- Weee! */
-
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- gdk_flush ();
- gtk_grab_remove (widget);
-
- gdk_pointer_grab (GTK_CLIST (widget)->clist_window, FALSE,
- GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
- NULL, NULL, event->time);
- gtk_grab_add (widget);
-
- return TRUE;
-}
-
-static int
-motion_notify_event (GtkWidget *widget,
- GdkEventMotion *event)
-{
- EStorageSetView *storage_set_view;
- EStorageSetViewPrivate *priv;
-
- if (event->window != GTK_CLIST (widget)->clist_window)
- return (* GTK_WIDGET_CLASS (parent_class)->motion_notify_event) (widget, event);
-
- storage_set_view = E_STORAGE_SET_VIEW (widget);
- priv = storage_set_view->priv;
-
- if (priv->in_drag || priv->drag_button == 0)
- return FALSE;
-
- if (ABS (event->x - priv->button_x) < DRAG_RESISTANCE
- && ABS (event->y - priv->button_y) < DRAG_RESISTANCE)
- return FALSE;
-
- priv->in_drag = TRUE;
- priv->dragged_row_path = priv->selected_row_path;
-
- gtk_drag_begin (widget, target_list, GDK_ACTION_MOVE,
- priv->drag_button, (GdkEvent *) event);
-
- return TRUE;
-}
-
-static void
-handle_left_button_selection (EStorageSetView *storage_set_view,
- GtkWidget *widget,
- GdkEventButton *event)
-{
- EStorageSetViewPrivate *priv;
-
- priv = storage_set_view->priv;
-
- gtk_signal_emit (GTK_OBJECT (widget), signals[FOLDER_SELECTED],
- priv->selected_row_path);
- priv->selected_row_path = NULL;
-}
-
-static void
-handle_right_button_selection (EStorageSetView *storage_set_view,
- GtkWidget *widget,
- GdkEventButton *event)
-{
- EStorageSetViewPrivate *priv;
-
- priv = storage_set_view->priv;
-
- popup_folder_menu (storage_set_view, event);
-
- if (priv->selected_row_path_before_click != NULL)
- e_storage_set_view_set_current_folder (storage_set_view,
- priv->selected_row_path_before_click);
-}
-
-static int
-button_release_event (GtkWidget *widget,
- GdkEventButton *event)
-{
- EStorageSetView *storage_set_view;
- EStorageSetViewPrivate *priv;
-
- if (event->window != GTK_CLIST (widget)->clist_window)
- return (* GTK_WIDGET_CLASS (parent_class)->button_release_event) (widget, event);
-
- storage_set_view = E_STORAGE_SET_VIEW (widget);
- priv = storage_set_view->priv;
-
- if (! priv->in_drag) {
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- gtk_grab_remove (widget);
- gdk_flush ();
-
- if (priv->selected_row_path != NULL) {
- if (priv->drag_button == 1)
- handle_left_button_selection (storage_set_view, widget, event);
- else
- handle_right_button_selection (storage_set_view, widget, event);
- }
- }
-
- priv->selected_row_path_before_click = NULL;
-
- return TRUE;
-}
-
-static void
-drag_end (GtkWidget *widget,
- GdkDragContext *context)
-{
- EStorageSetView *storage_set_view;
- EStorageSetViewPrivate *priv;
-
- storage_set_view = E_STORAGE_SET_VIEW (widget);
- priv = storage_set_view->priv;
-
- if (priv->dragged_row_path != NULL)
- e_storage_set_view_set_current_folder (storage_set_view,
- priv->selected_row_path_before_click);
-
- priv->in_drag = FALSE;
- priv->drag_button = 0;
- priv->dragged_row_path = NULL;
-}
-
-static void
-set_uri_list_selection (EStorageSetView *storage_set_view,
- GtkSelectionData *selection_data)
-{
- EStorageSetViewPrivate *priv;
- char *uri_list;
-
- priv = storage_set_view->priv;
-
- /* FIXME: Get `evolution:' from somewhere instead of hardcoding it here. */
- uri_list = g_strconcat ("evolution:", priv->selected_row_path, "\n", NULL);
- gtk_selection_data_set (selection_data, selection_data->target,
- 8, (guchar *) uri_list, strlen (uri_list));
- g_free (uri_list);
-}
-
-static void
-set_e_shortcut_selection (EStorageSetView *storage_set_view,
- GtkSelectionData *selection_data)
-{
- EStorageSetViewPrivate *priv;
- int shortcut_len;
- char *shortcut;
- const char *trailing_slash;
- const char *name;
-
- g_return_if_fail(storage_set_view != NULL);
-
- priv = storage_set_view->priv;
-
- trailing_slash = strrchr (priv->selected_row_path, '/');
- if (trailing_slash == NULL)
- name = NULL;
- else
- name = trailing_slash + 1;
-
- /* FIXME: Get `evolution:' from somewhere instead of hardcoding it here. */
-
- if (name != NULL)
- shortcut_len = strlen (name);
- else
- shortcut_len = 0;
-
- shortcut_len ++; /* Separating zero. */
-
- shortcut_len += strlen ("evolution:");
- shortcut_len += strlen (priv->selected_row_path);
- shortcut_len ++; /* Trailing zero. */
-
- shortcut = g_malloc (shortcut_len);
-
- if (name == NULL)
- sprintf (shortcut, "%cevolution:%s", '\0', priv->selected_row_path);
- else
- sprintf (shortcut, "%s%cevolution:%s", name, '\0', priv->selected_row_path);
-
- gtk_selection_data_set (selection_data, selection_data->target,
- 8, (guchar *) shortcut, shortcut_len);
-
- g_free (shortcut);
-}
-
-static void
-drag_data_get (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint32 time)
-{
- EStorageSetView *storage_set_view;
-
- storage_set_view = E_STORAGE_SET_VIEW (widget);
-
- switch (info) {
- case DND_TARGET_TYPE_URI_LIST:
- set_uri_list_selection (storage_set_view, selection_data);
- break;
- case DND_TARGET_TYPE_E_SHORTCUT:
- set_e_shortcut_selection (storage_set_view, selection_data);
- break;
- default:
- g_assert_not_reached ();
- }
-}
-
-
-/* StorageSet signal handling. */
-
-static void
-new_storage_cb (EStorageSet *storage_set,
- EStorage *storage,
- void *data)
-{
- EStorageSetView *storage_set_view;
- EStorageSetViewPrivate *priv;
- GtkCTreeNode *node;
- char *text[2];
- char *path;
-
- storage_set_view = E_STORAGE_SET_VIEW (data);
- priv = storage_set_view->priv;
-
- path = g_strconcat (G_DIR_SEPARATOR_S, e_storage_get_name (storage), NULL);
-
- text[0] = (char *) e_storage_get_name (storage); /* Yuck. */
- text[1] = NULL;
-
- node = gtk_ctree_insert_node (GTK_CTREE (storage_set_view), NULL, NULL,
- text, 3, NULL, NULL, NULL, NULL, FALSE, TRUE);
-
- if (! add_node_to_hashes (storage_set_view, path, node)) {
- g_free (path);
- gtk_ctree_remove_node (GTK_CTREE (storage_set_view), node);
- return;
- }
-
- g_free (path);
-
- /* FIXME: We want a more specialized sort, e.g. the local folders should always be
- on top. */
- gtk_ctree_sort_node (GTK_CTREE (storage_set_view), NULL);
-}
-
-static void
-removed_storage_cb (EStorageSet *storage_set,
- EStorage *storage,
- void *data)
-{
- EStorageSetView *storage_set_view;
- EStorageSetViewPrivate *priv;
- GtkCTreeNode *node;
- char *path;
-
- storage_set_view = E_STORAGE_SET_VIEW (data);
- priv = storage_set_view->priv;
-
- path = g_strconcat (G_DIR_SEPARATOR_S, e_storage_get_name (storage), NULL);
- node = remove_node_from_hashes (storage_set_view, path);
- g_free (path);
-
- gtk_ctree_remove_node (GTK_CTREE (storage_set_view), node);
-}
-
-static void
-new_folder_cb (EStorageSet *storage_set,
- const char *path,
- void *data)
-{
- EStorageSetView *storage_set_view;
- EStorageSetViewPrivate *priv;
- GtkCTreeNode *parent_node;
- GtkCTreeNode *node;
- GdkPixmap *pixmap;
- GdkBitmap *mask;
- char *text[2];
- const char *last_separator;
- char *parent_path;
-
- g_return_if_fail (g_path_is_absolute (path));
-
- storage_set_view = E_STORAGE_SET_VIEW (data);
- priv = storage_set_view->priv;
-
- last_separator = strrchr (path, G_DIR_SEPARATOR);
-
- parent_path = g_strndup (path, last_separator - path);
- parent_node = g_hash_table_lookup (priv->path_to_ctree_node, parent_path);
- if (parent_node == NULL) {
- g_print ("EStorageSetView: EStorageSet reported new subfolder for non-existing folder -- %s\n",
- parent_path);
- g_free (parent_path);
- return;
- }
-
- g_free (parent_path);
-
- if (parent_node == NULL)
- return;
-
- text[0] = (char *) last_separator + 1; /* Yuck. */
- text[1] = NULL;
-
- get_pixmap_and_mask_for_folder (storage_set_view,
- e_storage_set_get_folder (storage_set, path),
- &pixmap, &mask);
- node = gtk_ctree_insert_node (GTK_CTREE (storage_set_view),
- parent_node, NULL,
- text, 3,
- pixmap, mask, pixmap, mask,
- FALSE, TRUE);
-
- if (! add_node_to_hashes (storage_set_view, path, node)) {
- gtk_ctree_remove_node (GTK_CTREE (storage_set_view), node);
- return;
- }
-
- gtk_ctree_sort_node (GTK_CTREE (storage_set_view), parent_node);
-}
-
-static void
-removed_folder_cb (EStorageSet *storage_set,
- const char *path,
- void *data)
-{
- EStorageSetView *storage_set_view;
- GtkCTreeNode *node;
-
- storage_set_view = E_STORAGE_SET_VIEW (data);
-
- node = remove_node_from_hashes (storage_set_view, path);
- gtk_ctree_remove_node (GTK_CTREE (storage_set_view), node);
-}
-
-
-/* GtkCTree methods. */
-
-static void
-tree_select_row (GtkCTree *ctree,
- GtkCTreeNode *row,
- gint column)
-{
- EStorageSetView *storage_set_view;
- EStorageSetViewPrivate *priv;
- const char *path;
-
- (* GTK_CTREE_CLASS (parent_class)->tree_select_row) (ctree, row, column);
-
- storage_set_view = E_STORAGE_SET_VIEW (ctree);
- priv = storage_set_view->priv;
-
- path = g_hash_table_lookup (storage_set_view->priv->ctree_node_to_path, row);
- if (path == NULL)
- return;
-
- priv->selected_row_path = path;
-}
-
-
-static void
-class_init (EStorageSetViewClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GtkCTreeClass *ctree_class;
-
- parent_class = gtk_type_class (gtk_ctree_get_type ());
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- widget_class = GTK_WIDGET_CLASS (klass);
- widget_class->button_press_event = button_press_event;
- widget_class->motion_notify_event = motion_notify_event;
- widget_class->button_release_event = button_release_event;
- widget_class->drag_end = drag_end;
- widget_class->drag_data_get = drag_data_get;
-
- ctree_class = GTK_CTREE_CLASS (klass);
- ctree_class->tree_select_row = tree_select_row;
-
- signals[FOLDER_SELECTED]
- = gtk_signal_new ("folder_selected",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EStorageSetViewClass, folder_selected),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-
- /* Set up DND. */
-
- target_list = gtk_target_list_new (drag_types, num_drag_types);
- g_assert (target_list != NULL);
-}
-
-static void
-init (EStorageSetView *storage_set_view)
-{
- EStorageSetViewPrivate *priv;
- GtkCList *clist;
-
- /* Avoid GtkCTree's broken focusing behavior. FIXME: Other ways? */
- GTK_WIDGET_UNSET_FLAGS (storage_set_view, GTK_CAN_FOCUS);
-
- priv = g_new (EStorageSetViewPrivate, 1);
-
- priv->storage_set = NULL;
- priv->ctree_node_to_path = g_hash_table_new (g_direct_hash, g_direct_equal);
- priv->path_to_ctree_node = g_hash_table_new (g_str_hash, g_str_equal);
- priv->selected_row_path = NULL;
- priv->dragged_row_path = NULL;
- priv->selected_row_path_before_click = NULL;
- priv->in_drag = FALSE;
- priv->button_x = 0;
- priv->button_y = 0;
-
- storage_set_view->priv = priv;
-
- /* Set up the right mouse button so that it also selects. */
- clist = GTK_CLIST (storage_set_view);
- clist->button_actions[2] |= GTK_BUTTON_SELECTS;
-}
-
-
-static int
-folder_compare_cb (gconstpointer a, gconstpointer b)
-{
- EFolder *folder_a;
- EFolder *folder_b;
- const char *name_a;
- const char *name_b;
-
- folder_a = E_FOLDER (a);
- folder_b = E_FOLDER (b);
-
- name_a = e_folder_get_name (folder_a);
- name_b = e_folder_get_name (folder_b);
-
- return strcmp (name_a, name_b);
-}
-
-static void
-insert_folders (EStorageSetView *storage_set_view,
- GtkCTreeNode *parent,
- EStorage *storage,
- const char *path,
- int level)
-{
- EStorageSetViewPrivate *priv;
- GtkCTree *ctree;
- GtkCTreeNode *node;
- GList *folder_list;
- GList *p;
- const char *storage_name;
-
- ctree = GTK_CTREE (storage_set_view);
- priv = storage_set_view->priv;
-
- storage_name = e_storage_get_name (storage);
-
- folder_list = e_storage_list_folders (storage, path);
- if (folder_list == NULL)
- return;
-
- folder_list = g_list_sort (folder_list, folder_compare_cb);
-
- for (p = folder_list; p != NULL; p = p->next) {
- EFolder *folder;
- const char *folder_name;
- char *text[2];
- char *subpath;
- char *full_path;
- GdkPixmap *pixmap;
- GdkBitmap *mask;
-
- folder = E_FOLDER (p->data);
- folder_name = e_folder_get_name (folder);
-
- text[0] = (char *) folder_name; /* Yuck. */
- text[1] = NULL;
-
- get_pixmap_and_mask_for_folder (storage_set_view, folder, &pixmap, &mask);
- node = gtk_ctree_insert_node (ctree, parent, NULL,
- text, 3,
- pixmap, mask, pixmap, mask,
- FALSE, TRUE);
-
- subpath = g_concat_dir_and_file (path, folder_name);
- insert_folders (storage_set_view, node, storage, subpath, level + 1);
-
- full_path = g_strconcat("/", storage_name, subpath, NULL);
- g_hash_table_insert (priv->ctree_node_to_path, node, full_path);
- g_hash_table_insert (priv->path_to_ctree_node, full_path, node);
-
- g_free (subpath);
- }
-
- e_free_object_list (folder_list);
-}
-
-void
-e_storage_set_view_construct (EStorageSetView *storage_set_view,
- EStorageSet *storage_set)
-{
- EStorageSetViewPrivate *priv;
- GtkCTreeNode *parent;
- GtkCTree *ctree;
- EStorage *storage;
- GList *storage_list;
- GList *p;
- const char *name;
- char *text[2];
- char *path;
-
- g_return_if_fail (storage_set_view != NULL);
- g_return_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view));
- g_return_if_fail (storage_set != NULL);
- g_return_if_fail (E_IS_STORAGE_SET (storage_set));
-
- ctree = GTK_CTREE (storage_set_view);
- priv = storage_set_view->priv;
-
- /* Set up GtkCTree/GtkCList parameters. */
-
- gtk_ctree_construct (ctree, 1, 0, NULL);
- gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
- gtk_ctree_set_expander_style (ctree, GTK_CTREE_EXPANDER_SQUARE);
-
- gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_BROWSE);
- gtk_clist_set_row_height (GTK_CLIST (ctree), E_SHELL_MINI_ICON_SIZE);
- gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE);
-
- gtk_object_ref (GTK_OBJECT (storage_set));
- priv->storage_set = storage_set;
-
- gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "new_storage",
- GTK_SIGNAL_FUNC (new_storage_cb), storage_set_view,
- GTK_OBJECT (storage_set_view));
- gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "removed_storage",
- GTK_SIGNAL_FUNC (removed_storage_cb), storage_set_view,
- GTK_OBJECT (storage_set_view));
- gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "new_folder",
- GTK_SIGNAL_FUNC (new_folder_cb), storage_set_view,
- GTK_OBJECT (storage_set_view));
- gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "removed_folder",
- GTK_SIGNAL_FUNC (removed_folder_cb), storage_set_view,
- GTK_OBJECT (storage_set_view));
-
- storage_list = e_storage_set_get_storage_list (storage_set);
-
- text[1] = NULL;
-
- for (p = storage_list; p != NULL; p = p->next) {
- storage = E_STORAGE (p->data);
-
- name = e_storage_get_name (storage);
- text[0] = (char *) name; /* Yuck. */
-
- parent = gtk_ctree_insert_node (ctree, NULL, NULL,
- text, 3,
- NULL, NULL, NULL, NULL,
- FALSE, TRUE);
-
- path = g_strconcat ("/", name, NULL);
- g_hash_table_insert (priv->ctree_node_to_path, parent, path);
- g_hash_table_insert (priv->path_to_ctree_node, path, parent);
-
- insert_folders (storage_set_view, parent, storage, "/", 1);
- }
-
- e_free_object_list (storage_list);
-}
-
-GtkWidget *
-e_storage_set_view_new (EStorageSet *storage_set)
-{
- GtkWidget *new;
-
- g_return_val_if_fail (storage_set != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL);
-
- new = gtk_type_new (e_storage_set_view_get_type ());
- e_storage_set_view_construct (E_STORAGE_SET_VIEW (new), storage_set);
-
- return new;
-}
-
-
-void
-e_storage_set_view_set_current_folder (EStorageSetView *storage_set_view,
- const char *path)
-{
- EStorageSetViewPrivate *priv;
- GtkCTreeNode *node;
-
- g_return_if_fail (storage_set_view != NULL);
- g_return_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view));
- g_return_if_fail (path == NULL || g_path_is_absolute (path));
-
- priv = storage_set_view->priv;
-
- if (path == NULL) {
- gtk_clist_unselect_all (GTK_CLIST (storage_set_view));
- return;
- }
-
- node = g_hash_table_lookup (priv->path_to_ctree_node, path);
- if (node == NULL) {
- gtk_clist_unselect_all (GTK_CLIST (storage_set_view));
- return;
- }
-
- gtk_ctree_select (GTK_CTREE (storage_set_view), node);
-
- gtk_signal_emit (GTK_OBJECT (storage_set_view), signals[FOLDER_SELECTED], path);
-}
-
-const char *
-e_storage_set_view_get_current_folder (EStorageSetView *storage_set_view)
-{
- EStorageSetViewPrivate *priv;
- GtkCList *clist;
- GtkCTree *ctree;
- GtkCTreeRow *ctree_row;
- GtkCTreeNode *ctree_node;
- const char *path;
-
- g_return_val_if_fail (storage_set_view != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view), NULL);
-
- priv = storage_set_view->priv;
-
- clist = GTK_CLIST (storage_set_view);
- ctree = GTK_CTREE (storage_set_view);
-
- if (clist->selection == NULL)
- return NULL;
-
- ctree_row = GTK_CTREE_ROW (clist->selection->data);
- ctree_node = gtk_ctree_find_node_ptr (ctree, ctree_row);
- if (ctree_node == NULL)
- return NULL; /* Mmh? */
-
- path = g_hash_table_lookup (priv->ctree_node_to_path, ctree_node);
-
- return path;
-}
-
-
-E_MAKE_TYPE (e_storage_set_view, "EStorageSetView", EStorageSetView, class_init, init, PARENT_TYPE)
diff --git a/shell/e-storage-set-view.h b/shell/e-storage-set-view.h
deleted file mode 100644
index 098de0d2a7..0000000000
--- a/shell/e-storage-set-view.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-storage-set-view.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __E_STORAGE_SET_VIEW_H__
-#define __E_STORAGE_SET_VIEW_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkctree.h>
-#include "e-storage-set.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_STORAGE_SET_VIEW (e_storage_set_view_get_type ())
-#define E_STORAGE_SET_VIEW(obj) (GTK_CHECK_CAST ((obj), E_TYPE_STORAGE_SET_VIEW, EStorageSetView))
-#define E_STORAGE_SET_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_STORAGE_SET_VIEW, EStorageSetViewClass))
-#define E_IS_STORAGE_SET_VIEW(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_STORAGE_SET_VIEW))
-#define E_IS_STORAGE_SET_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_STORAGE_SET_VIEW))
-
-
-typedef struct _EStorageSetView EStorageSetView;
-typedef struct _EStorageSetViewPrivate EStorageSetViewPrivate;
-typedef struct _EStorageSetViewClass EStorageSetViewClass;
-
-struct _EStorageSetView {
- GtkCTree parent;
-
- EStorageSetViewPrivate *priv;
-};
-
-struct _EStorageSetViewClass {
- GtkCTreeClass parent_class;
-
- /* Signals. */
-
- void (* folder_selected) (EStorageSetView *storage_set_view,
- const char *uri);
-};
-
-
-GtkType e_storage_set_view_get_type (void);
-GtkWidget *e_storage_set_view_new (EStorageSet *storage_set);
-void e_storage_set_view_construct (EStorageSetView *storage_set_view,
- EStorageSet *storage_set);
-void e_storage_set_view_set_current_folder (EStorageSetView *storage_set_view,
- const char *path);
-const char *e_storage_set_view_get_current_folder (EStorageSetView *storage_set_view);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_STORAGE_SET_VIEW_H__ */
diff --git a/shell/e-storage-set.c b/shell/e-storage-set.c
deleted file mode 100644
index 7b18d93c1c..0000000000
--- a/shell/e-storage-set.c
+++ /dev/null
@@ -1,576 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-storage-set.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkobject.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtktypeutils.h>
-
-#include <string.h>
-
-#include "e-util/e-util.h"
-
-#include "e-storage-set-view.h"
-#include "e-storage-set.h"
-
-
-#define PARENT_TYPE GTK_TYPE_OBJECT
-
-static GtkObjectClass *parent_class = NULL;
-
-/* This is just to make GHashTable happy. */
-struct _NamedStorage {
- char *name;
- EStorage *storage;
-};
-typedef struct _NamedStorage NamedStorage;
-
-struct _EStorageSetPrivate {
- GList *storages; /* EStorage */
- GHashTable *name_to_named_storage;
-
- EFolderTypeRegistry *folder_type_registry;
-};
-
-enum {
- NEW_STORAGE,
- REMOVED_STORAGE,
- NEW_FOLDER,
- REMOVED_FOLDER,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-static NamedStorage *
-named_storage_new (EStorage *storage)
-{
- NamedStorage *new;
-
- new = g_new (NamedStorage, 1);
- new->name = g_strdup (e_storage_get_name (storage));
- new->storage = storage;
-
- return new;
-}
-
-static void
-named_storage_destroy (NamedStorage *named_storage)
-{
- g_free (named_storage->name);
- g_free (named_storage);
-}
-
-static gboolean
-name_to_named_storage_foreach_destroy (void *key,
- void *value,
- void *user_data)
-{
- NamedStorage *named_storage;
-
- named_storage = (NamedStorage *) value;
- named_storage_destroy (named_storage);
-
- return TRUE;
-}
-
-
-/* Handling for signals coming from the EStorages. */
-
-static char *
-make_full_path (EStorage *storage,
- const char *path)
-{
- const char *storage_name;
- char *full_path;
-
- storage_name = e_storage_get_name (storage);
-
- if (! g_path_is_absolute (path))
- full_path = g_strconcat (G_DIR_SEPARATOR_S, storage_name,
- G_DIR_SEPARATOR_S, path, NULL);
- else
- full_path = g_strconcat (G_DIR_SEPARATOR_S, storage_name,
- path, NULL);
-
- return full_path;
-}
-
-static void
-storage_new_folder_cb (EStorage *storage,
- const char *path,
- void *data)
-{
- EStorageSet *storage_set;
- char *full_path;
-
- storage_set = E_STORAGE_SET (data);
-
- full_path = make_full_path (storage, path);
- gtk_signal_emit (GTK_OBJECT (storage_set), signals[NEW_FOLDER], full_path);
- g_free (full_path);
-}
-
-static void
-storage_removed_folder_cb (EStorage *storage,
- const char *path,
- void *data)
-{
- EStorageSet *storage_set;
- char *full_path;
-
- storage_set = E_STORAGE_SET (data);
-
- full_path = make_full_path (storage, path);
- g_print ("EStorageSet: Removed folder -- %s\n", full_path);
- gtk_signal_emit (GTK_OBJECT (storage_set), signals[REMOVED_FOLDER], full_path);
- g_free (full_path);
-}
-
-
-static EStorage *
-get_storage_for_path (EStorageSet *storage_set,
- const char *path,
- const char **subpath_return)
-{
- EStorage *storage;
- char *storage_name;
- const char *first_separator;
-
- g_return_val_if_fail (g_path_is_absolute (path), NULL);
-
- /* Skip initial separator. */
- path++;
-
- first_separator = strchr (path, G_DIR_SEPARATOR);
-
- if (first_separator == NULL || first_separator == path || first_separator[1] == 0) {
- *subpath_return = NULL;
- return NULL;
- }
-
- storage_name = g_strndup (path, first_separator - path);
- storage = e_storage_set_get_storage (storage_set, storage_name);
- g_free (storage_name);
-
- *subpath_return = first_separator;
-
- return storage;
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EStorageSet *storage_set;
- EStorageSetPrivate *priv;
-
- storage_set = E_STORAGE_SET (object);
- priv = storage_set->priv;
-
- e_free_object_list (priv->storages);
-
- gtk_object_unref (GTK_OBJECT (priv->folder_type_registry));
-
- g_hash_table_foreach (priv->name_to_named_storage,
- (GHFunc) named_storage_destroy, NULL);
- g_hash_table_destroy (priv->name_to_named_storage);
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-class_init (EStorageSetClass *klass)
-{
- GtkObjectClass *object_class;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
- object_class = GTK_OBJECT_CLASS (klass);
-
- object_class->destroy = destroy;
-
- signals[NEW_STORAGE] =
- gtk_signal_new ("new_storage",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EStorageSetClass, new_storage),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
- signals[REMOVED_STORAGE] =
- gtk_signal_new ("removed_storage",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EStorageSetClass, removed_storage),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
- signals[NEW_FOLDER] =
- gtk_signal_new ("new_folder",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EStorageSetClass, new_folder),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
- signals[REMOVED_FOLDER] =
- gtk_signal_new ("removed_folder",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EStorageSetClass, removed_folder),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (EStorageSet *storage_set)
-{
- EStorageSetPrivate *priv;
-
- g_return_if_fail (E_IS_STORAGE_SET (storage_set));
-
- priv = g_new (EStorageSetPrivate, 1);
- priv->storages = NULL;
- priv->name_to_named_storage = g_hash_table_new (g_str_hash, g_str_equal);
- priv->folder_type_registry = NULL;
-
- storage_set->priv = priv;
-}
-
-
-void
-e_storage_set_construct (EStorageSet *storage_set,
- EFolderTypeRegistry *folder_type_registry)
-{
- g_return_if_fail (storage_set != NULL);
- g_return_if_fail (E_IS_STORAGE_SET (storage_set));
-
- GTK_OBJECT_UNSET_FLAGS (storage_set, GTK_FLOATING);
-
- gtk_object_ref (GTK_OBJECT (folder_type_registry));
- storage_set->priv->folder_type_registry = folder_type_registry;
-}
-
-EStorageSet *
-e_storage_set_new (EFolderTypeRegistry *folder_type_registry)
-{
- EStorageSet *new;
-
- new = gtk_type_new (e_storage_set_get_type ());
-
- e_storage_set_construct (new, folder_type_registry);
-
- return new;
-}
-
-
-GList *
-e_storage_set_get_storage_list (EStorageSet *storage_set)
-{
- EStorageSetPrivate *priv;
- GList *list;
- GList *p;
-
- g_return_val_if_fail (storage_set != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL);
-
- priv = storage_set->priv;
-
- list = NULL;
- for (p = priv->storages; p != NULL; p = p->next) {
- gtk_object_ref (GTK_OBJECT (p->data));
- list = g_list_prepend (list, p->data);
- }
-
- return g_list_reverse (list); /* Lame. */
-}
-
-/**
- * e_storage_set_add_storage:
- * @storage_set:
- * @storage:
- *
- * Add @storage to @storage_set. Notice that will ref the storage.
- **/
-gboolean
-e_storage_set_add_storage (EStorageSet *storage_set,
- EStorage *storage)
-{
- EStorageSetPrivate *priv;
- const char *storage_name;
- NamedStorage *named_storage;
-
- g_return_val_if_fail (storage_set != NULL, FALSE);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), FALSE);
- g_return_val_if_fail (storage != NULL, FALSE);
- g_return_val_if_fail (E_IS_STORAGE (storage), FALSE);
-
- priv = storage_set->priv;
-
- storage_name = e_storage_get_name (storage);
- if (g_hash_table_lookup (priv->name_to_named_storage, storage_name) != NULL)
- return FALSE;
-
- gtk_object_ref (GTK_OBJECT (storage));
-
- gtk_signal_connect (GTK_OBJECT (storage), "new_folder",
- GTK_SIGNAL_FUNC (storage_new_folder_cb), storage_set);
- gtk_signal_connect (GTK_OBJECT (storage), "removed_folder",
- GTK_SIGNAL_FUNC (storage_removed_folder_cb), storage_set);
-
- priv->storages = g_list_append (priv->storages, storage);
-
- named_storage = named_storage_new (storage);
- g_hash_table_insert (priv->name_to_named_storage, named_storage->name, named_storage);
-
- gtk_signal_emit (GTK_OBJECT (storage_set), signals[NEW_STORAGE], storage);
-
- return TRUE;
-}
-
-gboolean
-e_storage_set_remove_storage (EStorageSet *storage_set,
- EStorage *storage)
-{
- EStorageSetPrivate *priv;
- NamedStorage *named_storage;
-
- g_return_val_if_fail (storage_set != NULL, FALSE);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), FALSE);
- g_return_val_if_fail (storage != NULL, FALSE);
- g_return_val_if_fail (E_IS_STORAGE (storage), FALSE);
-
- priv = storage_set->priv;
-
- named_storage = g_hash_table_lookup (priv->name_to_named_storage,
- e_storage_get_name (storage));
- if (named_storage == NULL)
- return FALSE;
-
- g_hash_table_remove (priv->name_to_named_storage, named_storage->name);
- named_storage_destroy (named_storage);
-
- priv->storages = g_list_remove (priv->storages, storage);
-
- gtk_signal_emit (GTK_OBJECT (storage_set), signals[REMOVED_STORAGE], storage);
- gtk_object_unref (GTK_OBJECT (storage));
-
- return TRUE;
-}
-
-void
-e_storage_set_remove_all_storages (EStorageSet *storage_set)
-{
- EStorageSetPrivate *priv;
- GList *p;
-
- g_return_if_fail (storage_set != NULL);
- g_return_if_fail (E_IS_STORAGE_SET (storage_set));
-
- priv = storage_set->priv;
-
- for (p = priv->storages; p != NULL; p = p->next) {
- EStorage *storage;
-
- storage = E_STORAGE (p->data);
-
- gtk_signal_emit (GTK_OBJECT (storage_set), signals[REMOVED_STORAGE], storage);
- gtk_object_unref (GTK_OBJECT (storage));
- }
-
- g_hash_table_foreach_remove (priv->name_to_named_storage,
- name_to_named_storage_foreach_destroy,
- NULL);
-
- g_list_free (priv->storages);
- priv->storages = NULL;
-}
-
-
-EStorage *
-e_storage_set_get_storage (EStorageSet *storage_set,
- const char *name)
-{
- EStorageSetPrivate *priv;
- NamedStorage *named_storage;
-
- g_return_val_if_fail (storage_set != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL);
- g_return_val_if_fail (name != NULL, NULL);
-
- priv = storage_set->priv;
-
- named_storage = g_hash_table_lookup (priv->name_to_named_storage, name);
- if (named_storage == NULL)
- return NULL;
- else
- return named_storage->storage;
-}
-
-EFolder *
-e_storage_set_get_folder (EStorageSet *storage_set,
- const char *path)
-{
- EStorage *storage;
- const char *subpath;
-
- g_return_val_if_fail (storage_set != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL);
- g_return_val_if_fail (path != NULL, NULL);
- g_return_val_if_fail (g_path_is_absolute (path), NULL);
-
- storage = get_storage_for_path (storage_set, path, &subpath);
-
- return e_storage_get_folder (storage, subpath);
-}
-
-
-GtkWidget *
-e_storage_set_new_view (EStorageSet *storage_set)
-{
- GtkWidget *storage_set_view;
-
- g_return_val_if_fail (storage_set != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL);
-
- storage_set_view = e_storage_set_view_new (storage_set);
-
- return storage_set_view;
-}
-
-
-void
-e_storage_set_async_create_folder (EStorageSet *storage_set,
- const char *path,
- const char *type,
- const char *description,
- EStorageResultCallback callback,
- void *data)
-{
- EStorage *storage;
- const char *subpath;
-
- g_return_if_fail (storage_set != NULL);
- g_return_if_fail (E_IS_STORAGE_SET (storage_set));
- g_return_if_fail (path != NULL);
- g_return_if_fail (g_path_is_absolute (path));
- g_return_if_fail (type != NULL);
- g_return_if_fail (callback != NULL);
-
- storage = get_storage_for_path (storage_set, path, &subpath);
-
- e_storage_async_create_folder (storage, subpath, type, description, callback, data);
-}
-
-void
-e_storage_set_async_remove_folder (EStorageSet *storage_set,
- const char *path,
- EStorageResultCallback callback,
- void *data)
-{
- EStorage *storage;
- const char *subpath;
-
- g_return_if_fail (storage_set != NULL);
- g_return_if_fail (E_IS_STORAGE_SET (storage_set));
- g_return_if_fail (path != NULL);
- g_return_if_fail (g_path_is_absolute (path));
- g_return_if_fail (callback != NULL);
-
- storage = get_storage_for_path (storage_set, path, &subpath);
-
- e_storage_async_remove_folder (storage, path, callback, data);
-}
-
-
-EFolderTypeRegistry *
-e_storage_set_get_folder_type_registry (EStorageSet *storage_set)
-{
- g_return_val_if_fail (storage_set != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL);
-
- return storage_set->priv->folder_type_registry;
-}
-
-
-/* Utility functions. */
-
-/**
- * e_storage_set_get_path_for_physical_uri:
- * @storage_set: A storage set
- * @physical_uri: A physical URI
- *
- * Retrieve the path of the folder whose physical URI matches @physical_uri.
- *
- * Return value:
- **/
-char *
-e_storage_set_get_path_for_physical_uri (EStorageSet *storage_set,
- const char *physical_uri)
-{
- EStorageSetPrivate *priv;
- GList *p;
-
- g_return_val_if_fail (storage_set != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL);
- g_return_val_if_fail (physical_uri != NULL, NULL);
-
- priv = storage_set->priv;
-
- for (p = priv->storages; p != NULL; p = p->next) {
- EStorage *storage;
- char *storage_path;
-
- storage = E_STORAGE (p->data);
-
- storage_path = e_storage_get_path_for_physical_uri (storage, physical_uri);
- if (storage_path != NULL) {
- char *storage_set_path;
-
- storage_set_path = g_strconcat (G_DIR_SEPARATOR_S,
- e_storage_get_name (storage),
- storage_path,
- NULL);
- g_free (storage_path);
-
- return storage_set_path;
- }
- }
-
- return NULL;
-}
-
-
-E_MAKE_TYPE (e_storage_set, "EStorageSet", EStorageSet, class_init, init, PARENT_TYPE)
diff --git a/shell/e-storage-set.h b/shell/e-storage-set.h
deleted file mode 100644
index cc0d34811a..0000000000
--- a/shell/e-storage-set.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-storage-set.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_STORAGE_SET_H_
-#define _E_STORAGE_SET_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkwidget.h>
-
-#include "e-folder-type-registry.h"
-#include "e-storage.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_STORAGE_SET (e_storage_set_get_type ())
-#define E_STORAGE_SET(obj) (GTK_CHECK_CAST ((obj), E_TYPE_STORAGE_SET, EStorageSet))
-#define E_STORAGE_SET_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_STORAGE_SET, EStorageSetClass))
-#define E_IS_STORAGE_SET(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_STORAGE_SET))
-#define E_IS_STORAGE_SET_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_STORAGE_SET))
-
-
-typedef struct _EStorageSet EStorageSet;
-typedef struct _EStorageSetPrivate EStorageSetPrivate;
-typedef struct _EStorageSetClass EStorageSetClass;
-
-struct _EStorageSet {
- GtkObject parent;
-
- EStorageSetPrivate *priv;
-};
-
-struct _EStorageSetClass {
- GtkObjectClass parent_class;
-
- /* Signals. */
-
- void (* new_storage) (EStorageSet *storage_set, EStorage *storage);
- void (* removed_storage) (EStorageSet *storage_set, EStorage *storage);
- /* FIXME? Inconsistency between storage and folders. */
- void (* new_folder) (EStorageSet *storage_set, const char *path);
- void (* removed_folder) (EStorageSet *storage_set, const char *path);
-};
-
-
-GtkType e_storage_set_get_type (void);
-void e_storage_set_construct (EStorageSet *storage_set,
- EFolderTypeRegistry *folder_type_registry);
-EStorageSet *e_storage_set_new (EFolderTypeRegistry *folder_type_registry);
-
-gboolean e_storage_set_add_storage (EStorageSet *storage_set,
- EStorage *storage);
-gboolean e_storage_set_remove_storage (EStorageSet *storage_set,
- EStorage *storage);
-void e_storage_set_remove_all_storages (EStorageSet *storage_set);
-
-GList *e_storage_set_get_storage_list (EStorageSet *storage_set);
-EStorage *e_storage_set_get_storage (EStorageSet *storage_set,
- const char *storage_name);
-EFolder *e_storage_set_get_folder (EStorageSet *storage_set,
- const char *path);
-
-GtkWidget *e_storage_set_new_view (EStorageSet *storage_set);
-
-void e_storage_set_async_create_folder (EStorageSet *storage_set,
- const char *path,
- const char *type,
- const char *description,
- EStorageResultCallback callback,
- void *data);
-void e_storage_set_async_remove_folder (EStorageSet *storage_set,
- const char *path,
- EStorageResultCallback callback,
- void *data);
-
-EFolderTypeRegistry *e_storage_set_get_folder_type_registry (EStorageSet *storage_set);
-
-/* Utility functions. */
-
-char *e_storage_set_get_path_for_physical_uri (EStorageSet *storage_set,
- const char *physical_uri);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_STORAGE_SET_H_ */
diff --git a/shell/e-storage.c b/shell/e-storage.c
deleted file mode 100644
index eb03cb36a0..0000000000
--- a/shell/e-storage.c
+++ /dev/null
@@ -1,593 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-storage.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkobject.h>
-#include <gtk/gtksignal.h>
-
-#include <gnome.h>
-
-#include "e-util/e-util.h"
-
-#include "e-storage.h"
-
-
-#define PARENT_TYPE GTK_TYPE_OBJECT
-static GtkObjectClass *parent_class = NULL;
-
-#define ES_CLASS(obj) \
- E_STORAGE_CLASS (GTK_OBJECT (obj)->klass)
-
-/* This describes a folder and its children. */
-struct _Folder {
- struct _Folder *parent;
-
- char *path;
- EFolder *e_folder;
- GList *subfolders;
-};
-typedef struct _Folder Folder;
-
-struct _EStoragePrivate {
- GHashTable *path_to_folder; /* Folder */
-};
-
-enum {
- NEW_FOLDER,
- REMOVED_FOLDER,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-/* Folder handling. */
-
-static Folder *
-folder_new (EFolder *e_folder,
- const char *path)
-{
- Folder *folder;
-
- folder = g_new (Folder, 1);
- folder->path = g_strdup (path);
- folder->parent = NULL;
- folder->e_folder = e_folder;
- folder->subfolders = NULL;
-
- return folder;
-}
-
-static void
-folder_remove_subfolder (Folder *folder, Folder *subfolder)
-{
- g_list_remove (folder->subfolders, folder);
-}
-
-static void
-folder_add_subfolder (Folder *folder, Folder *subfolder)
-{
- folder->subfolders = g_list_prepend (folder->subfolders, subfolder);
- subfolder->parent = folder;
-}
-
-static void
-folder_destroy (Folder *folder)
-{
- g_assert (folder->subfolders == NULL);
-
- if (folder->parent != NULL)
- folder_remove_subfolder (folder->parent, folder);
-
- g_free (folder->path);
-
- if (folder->e_folder != NULL)
- gtk_object_unref (GTK_OBJECT (folder->e_folder));
-
- g_free (folder);
-}
-
-static void
-remove_folder (EStorage *storage,
- Folder *folder)
-{
- EStoragePrivate *priv;
-
- priv = storage->priv;
-
- if (folder->subfolders != NULL) {
- GList *p;
-
- for (p = folder->subfolders; p != NULL; p = p->next) {
- Folder *subfolder;
-
- subfolder = (Folder *) p->data;
- remove_folder (storage, subfolder);
- }
-
- g_list_free (folder->subfolders);
- folder->subfolders = NULL;
- }
-
- g_hash_table_remove (priv->path_to_folder, folder->path);
-
- folder_destroy (folder);
-}
-
-static void
-free_private (EStorage *storage)
-{
- EStoragePrivate *priv;
- Folder *root_folder;
-
- priv = storage->priv;
-
- root_folder = g_hash_table_lookup (priv->path_to_folder, G_DIR_SEPARATOR_S);
- remove_folder (storage, root_folder);
-
- g_hash_table_destroy (priv->path_to_folder);
-
- g_free (priv);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EStorage *storage;
-
- storage = E_STORAGE (object);
-
- free_private (storage);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* EStorage methods. */
-
-static GList *
-impl_list_folders (EStorage *storage,
- const char *path)
-{
- Folder *folder;
- Folder *subfolder;
- GList *list;
- GList *p;
-
- folder = g_hash_table_lookup (storage->priv->path_to_folder, path);
- if (folder == NULL)
- return NULL;
-
- list = NULL;
- for (p = folder->subfolders; p != NULL; p = p->next) {
- subfolder = (Folder *) p->data;
-
- gtk_object_ref (GTK_OBJECT (subfolder->e_folder));
- list = g_list_prepend (list, subfolder->e_folder);
- }
-
- return list;
-}
-
-static EFolder *
-impl_get_folder (EStorage *storage,
- const char *path)
-{
- EStoragePrivate *priv;
- Folder *folder;
-
- priv = storage->priv;
-
- folder = g_hash_table_lookup (priv->path_to_folder, path);
- if (folder == NULL)
- return NULL;
-
- return folder->e_folder;
-}
-
-static const char *
-impl_get_name (EStorage *storage)
-{
- return _("(No name)");
-}
-
-static void
-impl_async_create_folder (EStorage *storage,
- const char *path,
- const char *type,
- const char *description,
- EStorageResultCallback callback,
- void *data)
-{
- (* callback) (storage, E_STORAGE_NOTIMPLEMENTED, data);
-}
-
-static void
-impl_async_remove_folder (EStorage *storage,
- const char *path,
- EStorageResultCallback callback,
- void *data)
-{
- (* callback) (storage, E_STORAGE_NOTIMPLEMENTED, data);
-}
-
-
-/* Initialization. */
-
-static void
-class_init (EStorageClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (class);
- parent_class = gtk_type_class (gtk_object_get_type ());
-
- object_class->destroy = destroy;
-
- class->list_folders = impl_list_folders;
- class->get_folder = impl_get_folder;
- class->get_name = impl_get_name;
- class->async_create_folder = impl_async_create_folder;
- class->async_remove_folder = impl_async_remove_folder;
-
- signals[NEW_FOLDER] =
- gtk_signal_new ("new_folder",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EStorageClass, new_folder),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
- signals[REMOVED_FOLDER] =
- gtk_signal_new ("removed_folder",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EStorageClass, removed_folder),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (EStorage *storage)
-{
- EStoragePrivate *priv;
-
- priv = g_new (EStoragePrivate, 1);
- priv->path_to_folder = g_hash_table_new (g_str_hash, g_str_equal);
-
- storage->priv = priv;
-}
-
-
-/* Creation. */
-
-void
-e_storage_construct (EStorage *storage)
-{
- Folder *root_folder;
-
- g_return_if_fail (storage != NULL);
- g_return_if_fail (E_IS_STORAGE (storage));
-
- GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (storage), GTK_FLOATING);
-
- root_folder = folder_new (NULL, G_DIR_SEPARATOR_S);
- g_hash_table_insert (storage->priv->path_to_folder, root_folder->path, root_folder);
-}
-
-EStorage *
-e_storage_new (void)
-{
- EStorage *new;
-
- new = gtk_type_new (e_storage_get_type ());
-
- e_storage_construct (new);
-
- return new;
-}
-
-
-gboolean
-e_storage_path_is_absolute (const char *path)
-{
- g_return_val_if_fail (path != NULL, FALSE);
-
- return *path == G_DIR_SEPARATOR;
-}
-
-gboolean
-e_storage_path_is_relative (const char *path)
-{
- g_return_val_if_fail (path != NULL, FALSE);
-
- return *path != G_DIR_SEPARATOR;
-}
-
-
-GList *
-e_storage_list_folders (EStorage *storage,
- const char *path)
-{
- g_return_val_if_fail (storage != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE (storage), NULL);
- g_return_val_if_fail (path != NULL, NULL);
- g_return_val_if_fail (g_path_is_absolute (path), NULL);
-
- return (* ES_CLASS (storage)->list_folders) (storage, path);
-}
-
-EFolder *
-e_storage_get_folder (EStorage *storage,
- const char *path)
-{
- g_return_val_if_fail (storage != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE (storage), NULL);
- g_return_val_if_fail (path != NULL, NULL);
- g_return_val_if_fail (e_storage_path_is_absolute (path), NULL);
-
- return (* ES_CLASS (storage)->get_folder) (storage, path);
-}
-
-const char *
-e_storage_get_name (EStorage *storage)
-{
- g_return_val_if_fail (storage != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE (storage), NULL);
-
- return (* ES_CLASS (storage)->get_name) (storage);
-}
-
-
-/* Folder operations. */
-
-void
-e_storage_async_create_folder (EStorage *storage,
- const char *path,
- const char *type,
- const char *description,
- EStorageResultCallback callback,
- void *data)
-{
- g_return_if_fail (storage != NULL);
- g_return_if_fail (E_IS_STORAGE (storage));
- g_return_if_fail (path != NULL);
- g_return_if_fail (g_path_is_absolute (path));
- g_return_if_fail (type != NULL);
- g_return_if_fail (callback != NULL);
-
- (* ES_CLASS (storage)->async_create_folder) (storage, path, type, description, callback, data);
-}
-
-void
-e_storage_async_remove_folder (EStorage *storage,
- const char *path,
- EStorageResultCallback callback,
- void *data)
-{
- g_return_if_fail (storage != NULL);
- g_return_if_fail (E_IS_STORAGE (storage));
- g_return_if_fail (path != NULL);
- g_return_if_fail (g_path_is_absolute (path));
- g_return_if_fail (callback != NULL);
-
- (* ES_CLASS (storage)->async_remove_folder) (storage, path, callback, data);
-}
-
-
-const char *
-e_storage_result_to_string (EStorageResult result)
-{
- switch (result) {
- case E_STORAGE_OK:
- return _("No error");
- case E_STORAGE_GENERICERROR:
- return _("Generic error");
- case E_STORAGE_EXISTS:
- return _("A folder with the same name already exists");
- case E_STORAGE_INVALIDTYPE:
- return _("The specified folder type is not valid");
- case E_STORAGE_IOERROR:
- return _("I/O error");
- case E_STORAGE_NOSPACE:
- return _("Not enough space to create the folder");
- case E_STORAGE_NOTFOUND:
- return _("The specified folder was not found");
- case E_STORAGE_NOTIMPLEMENTED:
- return _("Function not implemented in this storage");
- case E_STORAGE_PERMISSIONDENIED:
- return _("Permission denied");
- case E_STORAGE_UNSUPPORTEDOPERATION:
- return _("Operation not supported");
- case E_STORAGE_UNSUPPORTEDTYPE:
- return _("The specified type is not supported in this storage");
- default:
- return _("Unknown error");
- }
-}
-
-
-/* Utility functions. */
-
-struct _GetPathForPhysicalUriForeachData {
- const char *physical_uri;
- char *retval;
-};
-typedef struct _GetPathForPhysicalUriForeachData GetPathForPhysicalUriForeachData;
-
-static void
-get_path_for_physical_uri_foreach (void *key,
- void *value,
- void *data)
-{
- GetPathForPhysicalUriForeachData *foreach_data;
- const char *physical_uri;
- Folder *folder;
-
- foreach_data = (GetPathForPhysicalUriForeachData *) data;
- if (foreach_data->retval != NULL)
- return;
-
- folder = (Folder *) value;
- if (folder->e_folder == NULL)
- return;
-
- physical_uri = e_folder_get_physical_uri (folder->e_folder);
-
- if (strcmp (foreach_data->physical_uri, physical_uri) == 0) {
- const char *path;
-
- path = (const char *) key;
- foreach_data->retval = g_strdup (path);
- }
-}
-
-/**
- * e_storage_get_path_for_physical_uri:
- * @storage: A storage
- * @physical_uri: A physical URI
- *
- * Look for the folder having the specified @physical_uri.
- *
- * Return value: The path of the folder having the specified @physical_uri in
- * @storage. If such a folder does not exist, just return NULL. The return
- * value must be freed by the caller.
- **/
-char *
-e_storage_get_path_for_physical_uri (EStorage *storage,
- const char *physical_uri)
-{
- GetPathForPhysicalUriForeachData foreach_data;
- EStoragePrivate *priv;
-
- g_return_val_if_fail (storage != NULL, NULL);
- g_return_val_if_fail (E_IS_STORAGE (storage), NULL);
- g_return_val_if_fail (physical_uri != NULL, NULL);
-
- priv = storage->priv;
-
- foreach_data.physical_uri = physical_uri;
- foreach_data.retval = NULL;
-
- g_hash_table_foreach (priv->path_to_folder, get_path_for_physical_uri_foreach, &foreach_data);
-
- return foreach_data.retval;
-}
-
-
-/* Protected functions. */
-
-/* These functions are used by subclasses to add and remove folders from the
- state stored in the storage object. */
-
-gboolean
-e_storage_new_folder (EStorage *storage,
- const char *path,
- EFolder *e_folder)
-{
- EStoragePrivate *priv;
- Folder *folder;
- Folder *parent_folder;
- const char *name;
- char *full_path;
-
- g_return_val_if_fail (storage != NULL, FALSE);
- g_return_val_if_fail (E_IS_STORAGE (storage), FALSE);
- g_return_val_if_fail (path != NULL, FALSE);
- g_return_val_if_fail (g_path_is_absolute (path), FALSE);
- g_return_val_if_fail (e_folder != NULL, FALSE);
- g_return_val_if_fail (E_IS_FOLDER (e_folder), FALSE);
-
- priv = storage->priv;
-
- parent_folder = g_hash_table_lookup (priv->path_to_folder, path);
- if (parent_folder == NULL) {
- g_warning ("%s: Trying to add a subfolder to a path that does not exist yet -- %s",
- __FUNCTION__, path);
- return FALSE;
- }
-
- name = e_folder_get_name (e_folder);
- g_assert (name != NULL);
- g_return_val_if_fail (*name != G_DIR_SEPARATOR, FALSE);
-
- full_path = g_concat_dir_and_file (path, name);
-
- folder = g_hash_table_lookup (priv->path_to_folder, full_path);
- if (folder != NULL) {
- g_warning ("%s: Trying to add a subfolder for a path that already exists -- %s",
- __FUNCTION__, full_path);
- g_free (full_path);
- return FALSE;
- }
-
- folder = folder_new (e_folder, full_path);
- folder_add_subfolder (parent_folder, folder);
-
- g_hash_table_insert (priv->path_to_folder, folder->path, folder);
-
- gtk_signal_emit (GTK_OBJECT (storage), signals[NEW_FOLDER], folder->path);
-
- g_free (full_path);
-
- return TRUE;
-}
-
-gboolean
-e_storage_removed_folder (EStorage *storage,
- const char *path)
-{
- EStoragePrivate *priv;
- Folder *folder;
-
- g_return_val_if_fail (storage != NULL, FALSE);
- g_return_val_if_fail (E_IS_STORAGE (storage), FALSE);
- g_return_val_if_fail (path != NULL, FALSE);
- g_return_val_if_fail (g_path_is_absolute (path), FALSE);
-
- priv = storage->priv;
-
- folder = g_hash_table_lookup (priv->path_to_folder, path);
- if (folder == NULL) {
- g_warning ("%s: Folder not found -- %s", __FUNCTION__, path);
- return FALSE;
- }
-
- gtk_signal_emit (GTK_OBJECT (storage), signals[REMOVED_FOLDER], path);
-
- remove_folder (storage, folder);
-
- return TRUE;
-}
-
-
-E_MAKE_TYPE (e_storage, "EStorage", EStorage, class_init, init, PARENT_TYPE)
diff --git a/shell/e-storage.h b/shell/e-storage.h
deleted file mode 100644
index 7b140bda22..0000000000
--- a/shell/e-storage.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-storage.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef _E_STORAGE_H_
-#define _E_STORAGE_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkobject.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_STORAGE (e_storage_get_type ())
-#define E_STORAGE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_STORAGE, EStorage))
-#define E_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_STORAGE, EStorageClass))
-#define E_IS_STORAGE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_STORAGE))
-#define E_IS_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_STORAGE))
-
-
-typedef struct _EStorage EStorage;
-typedef struct _EStoragePrivate EStoragePrivate;
-typedef struct _EStorageClass EStorageClass;
-
-enum _EStorageResult {
- E_STORAGE_OK,
- E_STORAGE_GENERICERROR,
- E_STORAGE_EXISTS,
- E_STORAGE_INVALIDTYPE,
- E_STORAGE_IOERROR,
- E_STORAGE_NOSPACE,
- E_STORAGE_NOTFOUND,
- E_STORAGE_NOTIMPLEMENTED,
- E_STORAGE_PERMISSIONDENIED,
- E_STORAGE_UNSUPPORTEDOPERATION,
- E_STORAGE_UNSUPPORTEDTYPE
-};
-typedef enum _EStorageResult EStorageResult;
-
-typedef void (* EStorageResultCallback) (EStorage *storage, EStorageResult result, void *data);
-
-#include "e-folder.h"
-
-struct _EStorage {
- GtkObject parent;
-
- EStoragePrivate *priv;
-};
-
-struct _EStorageClass {
- GtkObjectClass parent_class;
-
- /* Signals. */
-
- void * (* new_folder) (EStorage *storage, const char *path);
- void * (* removed_folder) (EStorage *storage, const char *path);
-
- /* Virtual methods. */
-
- GList * (* list_folders) (EStorage *storage, const char *path);
- EFolder * (* get_folder) (EStorage *storage, const char *path);
- const char * (* get_name) (EStorage *storage);
-
- void (* async_create_folder) (EStorage *storage, const char *path,
- const char *type, const char *description,
- EStorageResultCallback callback, void *data);
- void (* async_remove_folder) (EStorage *storage, const char *path,
- EStorageResultCallback callback, void *data);
-};
-
-
-GtkType e_storage_get_type (void);
-void e_storage_construct (EStorage *storage);
-EStorage *e_storage_new (void);
-gboolean e_storage_path_is_relative (const char *path);
-gboolean e_storage_path_is_absolute (const char *path);
-
-GList *e_storage_list_folders (EStorage *storage, const char *path);
-EFolder *e_storage_get_folder (EStorage *storage, const char *path);
-
-const char *e_storage_get_name (EStorage *storage);
-
-/* Folder operations. */
-
-void e_storage_async_create_folder (EStorage *storage,
- const char *path,
- const char *type,
- const char *description,
- EStorageResultCallback callback,
- void *data);
-void e_storage_async_remove_folder (EStorage *storage,
- const char *path,
- EStorageResultCallback callback,
- void *data);
-
-const char *e_storage_result_to_string (EStorageResult result);
-
-/* Utility functions. */
-
-char *e_storage_get_path_for_physical_uri (EStorage *storage,
- const char *physical_uri);
-
-/* Protected. C++ anyone? */
-gboolean e_storage_new_folder (EStorage *storage, const char *path, EFolder *folder);
-gboolean e_storage_removed_folder (EStorage *storage, const char *path);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_STORAGE_H_ */
diff --git a/shell/evolution-session.c b/shell/evolution-session.c
deleted file mode 100644
index 1e0acb36b4..0000000000
--- a/shell/evolution-session.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-session.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-
-#include "Evolution.h"
-
-#include "e-util/e-util.h"
-
-#include "evolution-session.h"
-
-
-#define PARENT_TYPE bonobo_object_get_type ()
-static BonoboObjectClass *parent_class = NULL;
-
-struct _EvolutionSessionPrivate {
- int dummy;
-};
-
-enum {
- LOAD_CONFIGURATION,
- SAVE_CONFIGURATION,
- LAST_SIGNAL
-};
-
-static int signals[LAST_SIGNAL];
-
-
-/* GtkObject methods. */
-
-static void
-impl_destroy (GtkObject *object)
-{
- EvolutionSession *session;
- EvolutionSessionPrivate *priv;
-
- session = EVOLUTION_SESSION (object);
- priv = session->priv;
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* CORBA interface implementation. */
-
-static void
-impl_Evolution_Session_save_configuration (PortableServer_Servant servant,
- const CORBA_char *prefix,
- CORBA_Environment *ev)
-{
- BonoboObject *self;
-
- self = bonobo_object_from_servant (servant);
- gtk_signal_emit (GTK_OBJECT (self), signals[SAVE_CONFIGURATION], prefix);
-}
-
-static void
-impl_Evolution_Session_load_configuration (PortableServer_Servant servant,
- const CORBA_char *prefix,
- CORBA_Environment *ev)
-{
- BonoboObject *self;
-
- self = bonobo_object_from_servant (servant);
- gtk_signal_emit (GTK_OBJECT (self), signals[LOAD_CONFIGURATION], prefix);
-}
-
-
-/* Initialization. */
-
-static POA_Evolution_Session__vepv Evolution_Session_vepv;
-
-static void
-corba_class_init (void)
-{
- POA_Evolution_Session__vepv *vepv;
- POA_Evolution_Session__epv *epv;
- PortableServer_ServantBase__epv *base_epv;
-
- base_epv = g_new0 (PortableServer_ServantBase__epv, 1);
- base_epv->_private = NULL;
- base_epv->finalize = NULL;
- base_epv->default_POA = NULL;
-
- epv = g_new0 (POA_Evolution_Session__epv, 1);
- epv->save_configuration = impl_Evolution_Session_save_configuration;
- epv->load_configuration = impl_Evolution_Session_load_configuration;
-
- vepv = &Evolution_Session_vepv;
- vepv->_base_epv = base_epv;
- vepv->Bonobo_Unknown_epv = bonobo_object_get_epv ();
- vepv->Evolution_Session_epv = epv;
-}
-
-static void
-class_init (EvolutionSessionClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- parent_class = gtk_type_class (bonobo_object_get_type ());
-
- object_class->destroy = impl_destroy;
-
- signals[LOAD_CONFIGURATION]
- = gtk_signal_new ("load_configuration",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EvolutionSessionClass, load_configuration),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
- signals[SAVE_CONFIGURATION]
- = gtk_signal_new ("save_configuration",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EvolutionSessionClass, save_configuration),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
-
- corba_class_init ();
-}
-
-static void
-init (EvolutionSession *session)
-{
- EvolutionSessionPrivate *priv;
-
- priv = g_new (EvolutionSessionPrivate, 1);
-
- session->priv = priv;
-}
-
-
-static Evolution_Session
-create_corba_session (BonoboObject *object)
-{
- POA_Evolution_Session *servant;
- CORBA_Environment ev;
-
- servant = (POA_Evolution_Session *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &Evolution_Session_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_Session__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION){
- g_free (servant);
- CORBA_exception_free (&ev);
- return CORBA_OBJECT_NIL;
- }
-
- CORBA_exception_free (&ev);
- return (Evolution_Session) bonobo_object_activate_servant (object, servant);
-}
-
-void
-evolution_session_construct (EvolutionSession *session,
- CORBA_Object corba_session)
-{
- g_return_if_fail (session != NULL);
- g_return_if_fail (corba_session != CORBA_OBJECT_NIL);
-
- bonobo_object_construct (BONOBO_OBJECT (session), corba_session);
-}
-
-EvolutionSession *
-evolution_session_new (void)
-{
- EvolutionSession *session;
- Evolution_Session corba_session;
-
- session = gtk_type_new (evolution_session_get_type ());
-
- corba_session = create_corba_session (BONOBO_OBJECT (session));
- if (corba_session == CORBA_OBJECT_NIL) {
- bonobo_object_unref (BONOBO_OBJECT (session));
- return NULL;
- }
-
- evolution_session_construct (session, corba_session);
- return session;
-}
-
-
-E_MAKE_TYPE (evolution_session, "EvolutionSession", EvolutionSession, class_init, init, PARENT_TYPE)
diff --git a/shell/evolution-session.h b/shell/evolution-session.h
deleted file mode 100644
index 93c0ebed2a..0000000000
--- a/shell/evolution-session.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-session.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __EVOLUTION_SESSION_H__
-#define __EVOLUTION_SESSION_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define EVOLUTION_TYPE_SESSION (evolution_session_get_type ())
-#define EVOLUTION_SESSION(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_SESSION, EvolutionSession))
-#define EVOLUTION_SESSION_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_SESSION, EvolutionSessionClass))
-#define EVOLUTION_IS_SESSION(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_SESSION))
-#define EVOLUTION_IS_SESSION_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_SESSION))
-
-
-typedef struct _EvolutionSession EvolutionSession;
-typedef struct _EvolutionSessionPrivate EvolutionSessionPrivate;
-typedef struct _EvolutionSessionClass EvolutionSessionClass;
-
-struct _EvolutionSession {
- BonoboObject parent;
-
- EvolutionSessionPrivate *priv;
-};
-
-struct _EvolutionSessionClass {
- BonoboObjectClass parent_class;
-
- void (* save_configuration) (EvolutionSession *session, const char *prefix);
- void (* load_configuration) (EvolutionSession *session, const char *prefix);
-};
-
-
-GtkType evolution_session_get_type (void);
-void evolution_session_construct (EvolutionSession *session,
- CORBA_Object corba_session);
-EvolutionSession *evolution_session_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EVOLUTION_SESSION_H__ */
diff --git a/shell/evolution-shell-client.c b/shell/evolution-shell-client.c
deleted file mode 100644
index 4e4fd830b3..0000000000
--- a/shell/evolution-shell-client.c
+++ /dev/null
@@ -1,333 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-shell-client.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo.h>
-
-#include "e-util/e-util.h"
-
-#include "evolution-shell-client.h"
-
-
-struct _EvolutionShellClientPrivate {
- int dummy;
-};
-
-#define PARENT_TYPE bonobo_object_client_get_type ()
-static BonoboObjectClientClass *parent_class = NULL;
-
-
-/* Easy-to-use wrapper for Evolution::user_select_folder. */
-
-static PortableServer_ServantBase__epv FolderSelectionListener_base_epv;
-static POA_Evolution_FolderSelectionListener__epv FolderSelectionListener_epv;
-static POA_Evolution_FolderSelectionListener__vepv FolderSelectionListener_vepv;
-static gboolean FolderSelectionListener_vtables_initialized = FALSE;
-
-struct _FolderSelectionListenerServant {
- POA_Evolution_FolderSelectionListener servant;
- char **uri_return;
- char **physical_uri_return;
-};
-typedef struct _FolderSelectionListenerServant FolderSelectionListenerServant;
-
-static void
-impl_FolderSelectionListener_selected (PortableServer_Servant servant,
- const CORBA_char *uri,
- const CORBA_char *physical_uri,
- CORBA_Environment *ev)
-{
- FolderSelectionListenerServant *listener_servant;
-
- listener_servant = (FolderSelectionListenerServant *) servant;
-
- if (listener_servant->uri_return != NULL)
- * (listener_servant->uri_return) = g_strdup (uri);
-
- if (listener_servant->physical_uri_return != NULL)
- * (listener_servant->physical_uri_return) = g_strdup (physical_uri);
-
- gtk_main_quit ();
-}
-
-static void
-impl_FolderSelectionListener_cancel (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- FolderSelectionListenerServant *listener_servant;
-
- listener_servant = (FolderSelectionListenerServant *) servant;
-
- if (listener_servant->uri_return != NULL)
- * (listener_servant->uri_return) = NULL;
-
- if (listener_servant->physical_uri_return != NULL)
- * (listener_servant->physical_uri_return) = NULL;
-
- gtk_main_quit ();
-}
-
-static void
-init_FolderSelectionListener_vtables (void)
-{
- FolderSelectionListener_base_epv._private = NULL;
- FolderSelectionListener_base_epv.finalize = NULL;
- FolderSelectionListener_base_epv.default_POA = NULL;
-
- FolderSelectionListener_epv.selected = impl_FolderSelectionListener_selected;
- FolderSelectionListener_epv.cancel = impl_FolderSelectionListener_cancel;
-
- FolderSelectionListener_vepv._base_epv = &FolderSelectionListener_base_epv;
- FolderSelectionListener_vepv.Evolution_FolderSelectionListener_epv = &FolderSelectionListener_epv;
-
- FolderSelectionListener_vtables_initialized = TRUE;
-}
-
-static Evolution_FolderSelectionListener
-create_folder_selection_listener_interface (char **result,
- char **uri_return,
- char **physical_uri_return)
-{
- Evolution_FolderSelectionListener corba_interface;
- CORBA_Environment ev;
- FolderSelectionListenerServant *servant;
- PortableServer_Servant listener_servant;
-
- if (! FolderSelectionListener_vtables_initialized)
- init_FolderSelectionListener_vtables ();
-
- servant = g_new0 (FolderSelectionListenerServant, 1);
- servant->servant.vepv = &FolderSelectionListener_vepv;
- servant->uri_return = uri_return;
- servant->physical_uri_return = physical_uri_return;
-
- listener_servant = (PortableServer_Servant) servant;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_FolderSelectionListener__init (listener_servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free(servant);
- return CORBA_OBJECT_NIL;
- }
-
- CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), listener_servant, &ev));
-
- corba_interface = PortableServer_POA_servant_to_reference (bonobo_poa (), listener_servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION)
- corba_interface = CORBA_OBJECT_NIL;
-
- CORBA_exception_free (&ev);
-
- return corba_interface;
-}
-
-static int
-count_string_items (const char *list[])
-{
- int i;
-
- if (list == NULL)
- return 0;
-
- for (i = 0; list[i] != NULL; i++)
- ;
-
- return i;
-}
-
-static void
-user_select_folder (EvolutionShellClient *shell_client,
- const char *title,
- const char *default_folder,
- const char *possible_types[],
- char **uri_return,
- char **physical_uri_return)
-{
- Evolution_FolderSelectionListener listener_interface;
- Evolution_Shell corba_shell;
- CORBA_Environment ev;
- Evolution_Shell_FolderTypeList corba_type_list;
- int num_possible_types;
- char *result;
-
- result = NULL;
-
- listener_interface = create_folder_selection_listener_interface (&result, uri_return,
- physical_uri_return);
- if (listener_interface == CORBA_OBJECT_NIL)
- return;
-
- CORBA_exception_init (&ev);
-
- corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client));
-
- num_possible_types = count_string_items (possible_types);
-
- corba_type_list._length = num_possible_types;
- corba_type_list._maximum = num_possible_types;
- corba_type_list._buffer = (CORBA_char **) possible_types;
-
- Evolution_Shell_user_select_folder (corba_shell, listener_interface,
- title, default_folder, &corba_type_list,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- CORBA_exception_free (&ev);
-
- if (uri_return != NULL)
- *uri_return = NULL;
- if (physical_uri_return != NULL)
- *physical_uri_return = NULL;
-
- return;
- }
-
- gtk_main();
-
- CORBA_Object_release (listener_interface, &ev);
-
- CORBA_exception_free (&ev);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EvolutionShellClient *shell_client;
- EvolutionShellClientPrivate *priv;
-
- shell_client = EVOLUTION_SHELL_CLIENT (object);
- priv = shell_client->priv;
-
- /* Nothing to do here. */
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-class_init (EvolutionShellClientClass *klass)
-{
- GtkObjectClass *object_class;
-
- parent_class = gtk_type_class (bonobo_object_get_type ());
-
- object_class = GTK_OBJECT_CLASS (klass);
-
- object_class->destroy = destroy;
-}
-
-static void
-init (EvolutionShellClient *shell_client)
-{
- EvolutionShellClientPrivate *priv;
-
- priv = g_new (EvolutionShellClientPrivate, 1);
- priv->dummy = 0;
-
- shell_client->priv = priv;
-}
-
-
-/**
- * evolution_shell_client_construct:
- * @shell_client:
- * @corba_shell:
- *
- * Construct @shell_client associating it to @corba_shell.
- **/
-void
-evolution_shell_client_construct (EvolutionShellClient *shell_client,
- Evolution_Shell corba_shell)
-{
- g_return_if_fail (shell_client != NULL);
- g_return_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client));
- g_return_if_fail (corba_shell != CORBA_OBJECT_NIL);
-
- bonobo_object_construct (BONOBO_OBJECT (shell_client), (CORBA_Object) corba_shell);
-}
-
-/**
- * evolution_shell_client_new:
- * @corba_shell: A pointer to the CORBA Evolution::Shell interface.
- *
- * Create a new client object for @corba_shell.
- *
- * Return value: A pointer to the Evolution::Shell client BonoboObject.
- **/
-EvolutionShellClient *
-evolution_shell_client_new (Evolution_Shell corba_shell)
-{
- EvolutionShellClient *shell_client;
-
- shell_client = gtk_type_new (evolution_shell_client_get_type ());
-
- evolution_shell_client_construct (shell_client, corba_shell);
-
- if (bonobo_object_corba_objref (BONOBO_OBJECT (shell_client)) == CORBA_OBJECT_NIL) {
- bonobo_object_unref (BONOBO_OBJECT (shell_client));
- return NULL;
- }
-
- return shell_client;
-}
-
-
-/**
- * evolution_shell_client_user_select_folder:
- * @shell_client: A EvolutionShellClient object
- * @title: The title for the folder selection dialog
- * @default_folder: URI (physical or evolution:) of the folder initially selected on the dialog
- * @uri_return:
- * @physical_uri_return:
- *
- * Pop up the shell's folder selection dialog with the specified @title and
- * @default_folder as the initially selected folder. On return, set *@uri and
- * *@physical_uri to the evolution: URI and the physical URI of the selected
- * folder (or %NULL if the user cancelled the dialog). (The dialog is modal.)
- **/
-void
-evolution_shell_client_user_select_folder (EvolutionShellClient *shell_client,
- const char *title,
- const char *default_folder,
- const char *possible_types[],
- char **uri_return,
- char **physical_uri_return)
-{
- g_return_if_fail (shell_client != NULL);
- g_return_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client));
- g_return_if_fail (title != NULL);
- g_return_if_fail (default_folder != NULL);
-
- user_select_folder (shell_client, title, default_folder, possible_types,
- uri_return, physical_uri_return);
-}
-
-
-E_MAKE_TYPE (evolution_shell_client, "EvolutionShellClient", EvolutionShellClient, class_init, init, PARENT_TYPE)
diff --git a/shell/evolution-shell-client.h b/shell/evolution-shell-client.h
deleted file mode 100644
index c9258574f7..0000000000
--- a/shell/evolution-shell-client.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-shell-client.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __EVOLUTION_SHELL_CLIENT_H__
-#define __EVOLUTION_SHELL_CLIENT_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo/bonobo-object-client.h>
-
-#include "Evolution.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define EVOLUTION_TYPE_SHELL_CLIENT (evolution_shell_client_get_type ())
-#define EVOLUTION_SHELL_CLIENT(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_SHELL_CLIENT, EvolutionShellClient))
-#define EVOLUTION_SHELL_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_SHELL_CLIENT, EvolutionShellClientClass))
-#define EVOLUTION_IS_SHELL_CLIENT(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_SHELL_CLIENT))
-#define EVOLUTION_IS_SHELL_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_SHELL_CLIENT))
-
-
-typedef struct _EvolutionShellClient EvolutionShellClient;
-typedef struct _EvolutionShellClientPrivate EvolutionShellClientPrivate;
-typedef struct _EvolutionShellClientClass EvolutionShellClientClass;
-
-struct _EvolutionShellClient {
- BonoboObjectClient parent;
-
- EvolutionShellClientPrivate *priv;
-};
-
-struct _EvolutionShellClientClass {
- BonoboObjectClientClass parent_class;
-};
-
-
-GtkType evolution_shell_client_get_type (void);
-void evolution_shell_client_construct (EvolutionShellClient *shell_client,
- Evolution_Shell corba_shell);
-EvolutionShellClient *evolution_shell_client_new (Evolution_Shell shell);
-
-void evolution_shell_client_user_select_folder (EvolutionShellClient *shell_client,
- const char *title,
- const char *default_folder,
- const char *possible_types[],
- char **uri_return,
- char **physical_uri_return);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EVOLUTION_SHELL_CLIENT_H__ */
diff --git a/shell/evolution-shell-component-client.c b/shell/evolution-shell-component-client.c
deleted file mode 100644
index c6cb1463dd..0000000000
--- a/shell/evolution-shell-component-client.c
+++ /dev/null
@@ -1,526 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-shell-component-client.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtksignal.h>
-#include <gtk/gtktypeutils.h>
-
-#include <bonobo/bonobo-main.h>
-#include <bonobo/bonobo-widget.h>
-
-#include <liboaf/liboaf.h>
-
-#include "e-util/e-util.h"
-
-#include "evolution-shell-component-client.h"
-
-
-#define PARENT_TYPE BONOBO_OBJECT_CLIENT_TYPE
-static BonoboObjectClass *parent_class = NULL;
-
-struct _EvolutionShellComponentClientPrivate {
- EvolutionShellComponentClientCallback callback;
- void *callback_data;
-
- Evolution_ShellComponentListener listener_interface;
- PortableServer_Servant listener_servant;
-};
-
-
-#define RETURN_ERROR_IF_FAIL(cond) \
- g_return_val_if_fail ((cond), EVOLUTION_SHELL_COMPONENT_INVALIDARG)
-
-
-/* Utility functions. */
-
-static EvolutionShellComponentResult
-corba_exception_to_result (const CORBA_Environment *ev)
-{
- if (ev->_major == CORBA_NO_EXCEPTION)
- return EVOLUTION_SHELL_COMPONENT_OK;
-
- if (ev->_major == CORBA_USER_EXCEPTION) {
- if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_AlreadyOwned) == 0)
- return EVOLUTION_SHELL_COMPONENT_ALREADYOWNED;
- if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_NotOwned) == 0)
- return EVOLUTION_SHELL_COMPONENT_NOTOWNED;
- if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_NotFound) == 0)
- return EVOLUTION_SHELL_COMPONENT_NOTFOUND;
- if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_UnsupportedType) == 0)
- return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE;
- if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_InternalError) == 0)
- return EVOLUTION_SHELL_COMPONENT_INTERNALERROR;
- if (strcmp (ev->_repo_id, ex_Evolution_ShellComponent_Busy) == 0)
- return EVOLUTION_SHELL_COMPONENT_BUSY;
-
- return EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR;
- } else {
- /* FIXME maybe we need something more specific here. */
- return EVOLUTION_SHELL_COMPONENT_CORBAERROR;
- }
-}
-
-static void
-dispatch_callback (EvolutionShellComponentClient *shell_component_client,
- EvolutionShellComponentResult result)
-{
- EvolutionShellComponentClientPrivate *priv;
- EvolutionShellComponentClientCallback callback;
- PortableServer_ObjectId *oid;
- void *callback_data;
- CORBA_Environment ev;
-
- priv = shell_component_client->priv;
-
- g_return_if_fail (priv->callback != NULL);
- g_return_if_fail (priv->listener_servant != NULL);
-
- /* Notice that we destroy the interface and reset the callback information before
- dispatching the callback so that the callback can generate another request. */
-
- CORBA_exception_init (&ev);
-
- oid = PortableServer_POA_servant_to_id (bonobo_poa (), priv->listener_servant, &ev);
- PortableServer_POA_deactivate_object (bonobo_poa (), oid, &ev);
- POA_Evolution_ShellComponentListener__fini (priv->listener_servant, &ev);
- CORBA_free (oid);
-
- CORBA_Object_release (priv->listener_interface, &ev);
-
- CORBA_exception_free (&ev);
-
- priv->listener_servant = NULL;
- priv->listener_interface = CORBA_OBJECT_NIL;
-
- callback = priv->callback;
- callback_data = priv->callback_data;
-
- priv->callback = NULL;
- priv->callback_data = NULL;
-
- (* callback) (shell_component_client, result, callback_data);
-}
-
-
-/* CORBA listener interface implementation. */
-
-static PortableServer_ServantBase__epv ShellComponentListener_base_epv;
-static POA_Evolution_ShellComponentListener__epv ShellComponentListener_epv;
-static POA_Evolution_ShellComponentListener__vepv ShellComponentListener_vepv;
-static gboolean ShellComponentListener_vepv_initialized = FALSE;
-
-struct _ShellComponentListenerServant {
- POA_Evolution_ShellComponentListener servant;
- EvolutionShellComponentClient *component_client;
-};
-typedef struct _ShellComponentListenerServant ShellComponentListenerServant;
-
-static EvolutionShellComponentClient *
-component_client_from_ShellComponentListener_servant (PortableServer_Servant servant)
-{
- ShellComponentListenerServant *listener_servant;
-
- listener_servant = (ShellComponentListenerServant *) servant;
- return listener_servant->component_client;
-}
-
-static EvolutionShellComponentResult
-result_from_async_corba_result (Evolution_ShellComponentListener_Result async_corba_result)
-{
- switch (async_corba_result) {
- case Evolution_ShellComponentListener_OK:
- return EVOLUTION_SHELL_COMPONENT_OK;
- case Evolution_ShellComponentListener_UNSUPPORTED_OPERATION:
- return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDOPERATION;
- case Evolution_ShellComponentListener_EXISTS:
- return EVOLUTION_SHELL_COMPONENT_EXISTS;
- case Evolution_ShellComponentListener_INVALID_URI:
- return EVOLUTION_SHELL_COMPONENT_INVALIDURI;
- case Evolution_ShellComponentListener_PERMISSION_DENIED:
- return EVOLUTION_SHELL_COMPONENT_PERMISSIONDENIED;
- case Evolution_ShellComponentListener_HAS_SUBFOLDERS:
- return EVOLUTION_SHELL_COMPONENT_HASSUBFOLDERS;
- case Evolution_ShellComponentListener_NO_SPACE:
- return EVOLUTION_SHELL_COMPONENT_NOSPACE;
- default:
- return EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR;
- }
-}
-
-static void
-impl_ShellComponentListener_report_result (PortableServer_Servant servant,
- const Evolution_ShellComponentListener_Result result,
- CORBA_Environment *ev)
-{
- EvolutionShellComponentClient *component_client;
-
- component_client = component_client_from_ShellComponentListener_servant (servant);
- dispatch_callback (component_client, result_from_async_corba_result (result));
-}
-
-static void
-ShellComponentListener_vepv_initialize (void)
-{
- ShellComponentListener_base_epv._private = NULL;
- ShellComponentListener_base_epv.finalize = NULL;
- ShellComponentListener_base_epv.default_POA = NULL;
-
- ShellComponentListener_epv.report_result = impl_ShellComponentListener_report_result;
-
- ShellComponentListener_vepv._base_epv = & ShellComponentListener_base_epv;
- ShellComponentListener_vepv.Evolution_ShellComponentListener_epv = & ShellComponentListener_epv;
-
- ShellComponentListener_vepv_initialized = TRUE;
-}
-
-static PortableServer_Servant *
-create_ShellComponentListener_servant (EvolutionShellComponentClient *component_client)
-{
- ShellComponentListenerServant *servant;
-
- if (! ShellComponentListener_vepv_initialized)
- ShellComponentListener_vepv_initialize ();
-
- servant = g_new0 (ShellComponentListenerServant, 1);
- servant->servant.vepv = &ShellComponentListener_vepv;
- servant->component_client = component_client;
-
- return (PortableServer_Servant) servant;
-}
-
-static void
-free_ShellComponentListener_servant (PortableServer_Servant servant)
-{
- g_free (servant);
-}
-
-static void
-create_listener_interface (EvolutionShellComponentClient *shell_component_client)
-{
- EvolutionShellComponentClientPrivate *priv;
- PortableServer_Servant listener_servant;
- Evolution_ShellComponentListener corba_interface;
- CORBA_Environment ev;
-
- priv = shell_component_client->priv;
-
- listener_servant = create_ShellComponentListener_servant (shell_component_client);
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_ShellComponentListener__init (listener_servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- free_ShellComponentListener_servant (listener_servant);
- return;
- }
-
- CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), listener_servant, &ev));
-
- corba_interface = PortableServer_POA_servant_to_reference (bonobo_poa (), listener_servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- corba_interface = CORBA_OBJECT_NIL;
- free_ShellComponentListener_servant (listener_servant);
- }
-
- CORBA_exception_free (&ev);
-
- priv->listener_servant = listener_servant;
- priv->listener_interface = corba_interface;
-}
-
-
-/* GtkObject methods. */
-
-static void
-impl_destroy (GtkObject *object)
-{
- EvolutionShellComponentClient *shell_component_client;
- EvolutionShellComponentClientPrivate *priv;
-
- shell_component_client = EVOLUTION_SHELL_COMPONENT_CLIENT (object);
- priv = shell_component_client->priv;
-
- if (priv->callback != NULL)
- dispatch_callback (shell_component_client, EVOLUTION_SHELL_COMPONENT_INTERRUPTED);
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-class_init (EvolutionShellComponentClientClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = impl_destroy;
-}
-
-static void
-init (EvolutionShellComponentClient *shell_component_client)
-{
- EvolutionShellComponentClientPrivate *priv;
-
- priv = g_new (EvolutionShellComponentClientPrivate, 1);
- priv->listener_interface = CORBA_OBJECT_NIL;
- priv->listener_servant = NULL;
- priv->callback = NULL;
- priv->callback_data = NULL;
-
- shell_component_client->priv = priv;
-}
-
-
-/* Construction. */
-
-void
-evolution_shell_component_client_construct (EvolutionShellComponentClient *shell_component_client,
- CORBA_Object corba_object)
-{
- g_return_if_fail (shell_component_client != NULL);
- g_return_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client));
- g_return_if_fail (corba_object != CORBA_OBJECT_NIL);
-
- bonobo_object_client_construct (BONOBO_OBJECT_CLIENT (shell_component_client),
- corba_object);
-}
-
-EvolutionShellComponentClient *
-evolution_shell_component_client_new (const char *id)
-{
- EvolutionShellComponentClient *new;
- CORBA_Environment ev;
- CORBA_Object corba_object;
-
- g_return_val_if_fail (id != NULL, NULL);
-
- CORBA_exception_init (&ev);
-
- corba_object = oaf_activate_from_id ((char *) id, 0, NULL, &ev); /* Yuck. */
- if (ev._major != CORBA_NO_EXCEPTION) {
- CORBA_exception_free (&ev);
- g_error ("Could not start up component for %s. "
- "(See previous error messages?)", id);
- }
- CORBA_exception_free (&ev);
-
- if (corba_object == CORBA_OBJECT_NIL) {
- g_error ("Could not activate component %s. "
- "(Maybe you need to set OAF_INFO_PATH?)", id);
- }
-
- new = gtk_type_new (evolution_shell_component_client_get_type ());
- evolution_shell_component_client_construct (new, corba_object);
-
- return new;
-}
-
-
-/* Synchronous operations. */
-
-EvolutionShellComponentResult
-evolution_shell_component_client_set_owner (EvolutionShellComponentClient *shell_component_client,
- Evolution_Shell shell,
- const char *evolution_homedir)
-{
- EvolutionShellComponentResult result;
- CORBA_Environment ev;
-
- RETURN_ERROR_IF_FAIL (shell_component_client != NULL);
- RETURN_ERROR_IF_FAIL (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client));
- RETURN_ERROR_IF_FAIL (shell != CORBA_OBJECT_NIL);
-
- CORBA_exception_init (&ev);
-
- Evolution_ShellComponent_set_owner (bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client)),
- shell, evolution_homedir, &ev);
-
- result = corba_exception_to_result (&ev);
-
- CORBA_exception_free (&ev);
-
- return result;
-}
-
-EvolutionShellComponentResult
-evolution_shell_component_client_unset_owner (EvolutionShellComponentClient *shell_component_client,
- Evolution_Shell shell)
-{
- EvolutionShellComponentResult result;
- Evolution_ShellComponent corba_component;
- CORBA_Environment ev;
-
- RETURN_ERROR_IF_FAIL (shell_component_client != NULL);
- RETURN_ERROR_IF_FAIL (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client));
- RETURN_ERROR_IF_FAIL (shell != CORBA_OBJECT_NIL);
-
- CORBA_exception_init (&ev);
-
- corba_component = bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client));
-
- Evolution_ShellComponent_unset_owner (corba_component, &ev);
-
- result = corba_exception_to_result (&ev);
-
- CORBA_exception_free (&ev);
-
- return result;
-}
-
-EvolutionShellComponentResult
-evolution_shell_component_client_create_view (EvolutionShellComponentClient *shell_component_client,
- BonoboUIHandler *uih,
- const char *physical_uri,
- const char *type_string,
- BonoboControl **control_return)
-{
- EvolutionShellComponentResult result;
- CORBA_Environment ev;
- Evolution_ShellComponent corba_component;
- Bonobo_Control corba_control;
-
- RETURN_ERROR_IF_FAIL (shell_component_client != NULL);
- RETURN_ERROR_IF_FAIL (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client));
- RETURN_ERROR_IF_FAIL (uih != NULL);
- RETURN_ERROR_IF_FAIL (BONOBO_IS_UI_HANDLER (uih));
- RETURN_ERROR_IF_FAIL (physical_uri != NULL);
- RETURN_ERROR_IF_FAIL (type_string != NULL);
- RETURN_ERROR_IF_FAIL (control_return != NULL);
-
- CORBA_exception_init (&ev);
-
- corba_component = bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client));
- corba_control = Evolution_ShellComponent_create_view (corba_component, physical_uri, type_string, &ev);
-
- result = corba_exception_to_result (&ev);
-
- if (result != EVOLUTION_SHELL_COMPONENT_OK) {
- *control_return = NULL;
- } else {
- Bonobo_UIHandler corba_uih;
-
- corba_uih = bonobo_object_corba_objref (BONOBO_OBJECT (uih));
- *control_return = BONOBO_CONTROL (bonobo_widget_new_control_from_objref (corba_control,
- corba_uih));
- }
-
- CORBA_exception_free (&ev);
-
- return result;
-}
-
-
-/* Asyncronous operations. */
-
-void
-evolution_shell_component_client_async_create_folder (EvolutionShellComponentClient *shell_component_client,
- const char *physical_uri,
- const char *type,
- EvolutionShellComponentClientCallback callback,
- void *data)
-{
- EvolutionShellComponentClientPrivate *priv;
- Evolution_ShellComponent corba_shell_component;
- CORBA_Environment ev;
-
- g_return_if_fail (shell_component_client != NULL);
- g_return_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client));
- g_return_if_fail (physical_uri != NULL);
- g_return_if_fail (type != NULL);
- g_return_if_fail (callback != NULL);
-
- priv = shell_component_client->priv;
-
- if (priv->callback != NULL) {
- (* callback) (shell_component_client, EVOLUTION_SHELL_COMPONENT_BUSY, data);
- return;
- }
-
- create_listener_interface (shell_component_client);
-
- CORBA_exception_init (&ev);
-
- corba_shell_component = bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client));
-
- priv->callback = callback;
- priv->callback_data = data;
-
- Evolution_ShellComponent_async_create_folder (corba_shell_component,
- priv->listener_interface,
- physical_uri, type,
- &ev);
-
- CORBA_exception_free (&ev);
-}
-
-void
-evolution_shell_component_client_async_remove_folder (EvolutionShellComponentClient *shell_component_client,
- const char *physical_uri,
- EvolutionShellComponentClientCallback callback,
- void *data)
-{
- /* FIXME to do. */
-}
-
-void
-evolution_shell_component_client_populate_folder_context_menu (EvolutionShellComponentClient *shell_component_client,
- BonoboUIHandler *uih,
- const char *physical_uri,
- const char *type)
-{
- Bonobo_UIHandler corba_uih;
- EvolutionShellComponentClientPrivate *priv;
- Evolution_ShellComponent corba_shell_component;
- CORBA_Environment ev;
-
- g_return_if_fail (shell_component_client != NULL);
- g_return_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client));
- g_return_if_fail (physical_uri != NULL);
- g_return_if_fail (type != NULL);
-
- priv = shell_component_client->priv;
-
- CORBA_exception_init (&ev);
-
- corba_shell_component = bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client));
- corba_uih = bonobo_object_corba_objref (BONOBO_OBJECT (uih));
-
- Evolution_ShellComponent_populate_folder_context_menu (corba_shell_component,
- corba_uih,
- physical_uri,
- type,
- &ev);
-
- CORBA_exception_free (&ev);
-}
-
-
-E_MAKE_TYPE (evolution_shell_component_client, "EvolutionShellComponentClient",
- EvolutionShellComponentClient, class_init, init, PARENT_TYPE)
diff --git a/shell/evolution-shell-component-client.h b/shell/evolution-shell-component-client.h
deleted file mode 100644
index fa066cb27d..0000000000
--- a/shell/evolution-shell-component-client.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-shell-component-client.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef EVOLUTION_SHELL_COMPONENT_CLIENT_H
-#define EVOLUTION_SHELL_COMPONENT_CLIENT_H
-
-#include <bonobo/bonobo-object-client.h>
-#include <bonobo/bonobo-ui-handler.h>
-
-#include "evolution-shell-component.h"
-
-#ifdef cplusplus
-extern "C" {
-#pragma }
-#endif /* cplusplus */
-
-#define EVOLUTION_TYPE_SHELL_COMPONENT_CLIENT (evolution_shell_component_client_get_type ())
-#define EVOLUTION_SHELL_COMPONENT_CLIENT(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_SHELL_COMPONENT_CLIENT, EvolutionShellComponentClient))
-#define EVOLUTION_SHELL_COMPONENT_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_SHELL_COMPONENT_CLIENT, EvolutionShellComponentClientClass))
-#define EVOLUTION_IS_SHELL_COMPONENT_CLIENT(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_SHELL_COMPONENT_CLIENT))
-#define EVOLUTION_IS_SHELL_COMPONENT_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_SHELL_COMPONENT_CLIENT))
-
-
-typedef struct _EvolutionShellComponentClient EvolutionShellComponentClient;
-typedef struct _EvolutionShellComponentClientPrivate EvolutionShellComponentClientPrivate;
-typedef struct _EvolutionShellComponentClientClass EvolutionShellComponentClientClass;
-
-struct _EvolutionShellComponentClient {
- BonoboObjectClient parent;
-
- EvolutionShellComponentClientPrivate *priv;
-};
-
-struct _EvolutionShellComponentClientClass {
- BonoboObjectClientClass parent_class;
-};
-
-typedef void (* EvolutionShellComponentClientCallback) (EvolutionShellComponentClient *shell_component_client,
- EvolutionShellComponentResult result,
- void *data);
-
-
-/* Construction. */
-GtkType evolution_shell_component_client_get_type (void);
-void evolution_shell_component_client_construct (EvolutionShellComponentClient *shell_component_client,
- CORBA_Object corba_object);
-EvolutionShellComponentClient *evolution_shell_component_client_new (const char *id);
-
-/* Synchronous operations. */
-EvolutionShellComponentResult evolution_shell_component_client_set_owner (EvolutionShellComponentClient *shell_component_client,
- Evolution_Shell shell,
- const char *evolution_homedir);
-EvolutionShellComponentResult evolution_shell_component_client_unset_owner (EvolutionShellComponentClient *shell_component_client,
- Evolution_Shell shell);
-EvolutionShellComponentResult evolution_shell_component_client_create_view (EvolutionShellComponentClient *shell_component_client,
- BonoboUIHandler *uih,
- const char *physical_uri,
- const char *type_string,
- BonoboControl **control_return);
-
-/* Asyncronous operations. */
-void evolution_shell_component_client_async_create_folder (EvolutionShellComponentClient *shell_component_client,
- const char *physical_uri,
- const char *type,
- EvolutionShellComponentClientCallback callback,
- void *data);
-void evolution_shell_component_client_async_remove_folder (EvolutionShellComponentClient *shell_component_client,
- const char *physical_uri,
- EvolutionShellComponentClientCallback callback,
- void *data);
-
-void evolution_shell_component_client_populate_folder_context_menu (EvolutionShellComponentClient *shell_component_client,
- BonoboUIHandler *uih,
- const char *physical_uri,
- const char *type);
-
-#ifdef cplusplus
-}
-#endif /* cplusplus */
-
-#endif /* EVOLUTION_SHELL_COMPONENT_CLIENT_H */
diff --git a/shell/evolution-shell-component.c b/shell/evolution-shell-component.c
deleted file mode 100644
index cedcf64b98..0000000000
--- a/shell/evolution-shell-component.c
+++ /dev/null
@@ -1,498 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-shell-component.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo.h>
-
-#include "Evolution.h"
-
-#include "e-util/e-util.h"
-
-#include "evolution-shell-component.h"
-
-
-#define PARENT_TYPE BONOBO_OBJECT_TYPE
-static BonoboObjectClass *parent_class = NULL;
-
-struct _EvolutionShellComponentPrivate {
- GList *folder_types; /* EvolutionShellComponentFolderType */
-
- EvolutionShellComponentCreateViewFn create_view_fn;
- EvolutionShellComponentCreateFolderFn create_folder_fn;
- EvolutionShellComponentRemoveFolderFn remove_folder_fn;
- EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn;
-
- EvolutionShellClient *owner_client;
-
- void *closure;
-};
-
-enum {
- OWNER_SET,
- OWNER_UNSET,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-/* CORBA interface implementation. */
-
-static POA_Evolution_ShellComponent__vepv ShellComponent_vepv;
-
-static POA_Evolution_ShellComponent *
-create_servant (void)
-{
- POA_Evolution_ShellComponent *servant;
- CORBA_Environment ev;
-
- servant = (POA_Evolution_ShellComponent *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &ShellComponent_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_ShellComponent__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- return servant;
-}
-
-static Evolution_FolderTypeList *
-impl_ShellComponent__get_supported_types (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionShellComponent *shell_component;
- EvolutionShellComponentPrivate *priv;
- Evolution_FolderTypeList *folder_type_list;
- unsigned int i;
- GList *p;
-
- bonobo_object = bonobo_object_from_servant (servant);
- shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object);
- priv = shell_component->priv;
-
- folder_type_list = Evolution_FolderTypeList__alloc ();
- folder_type_list->_length = g_list_length (priv->folder_types);
- folder_type_list->_maximum = folder_type_list->_length;
- folder_type_list->_buffer = CORBA_sequence_Evolution_FolderType_allocbuf (folder_type_list->_maximum);
-
- for (p = priv->folder_types, i = 0; p != NULL; p = p->next, i++) {
- Evolution_FolderType *corba_folder_type;
- EvolutionShellComponentFolderType *folder_type;
-
- folder_type = (EvolutionShellComponentFolderType *) p->data;
-
- corba_folder_type = folder_type_list->_buffer + i;
- corba_folder_type->name = CORBA_string_dup (folder_type->name);
- corba_folder_type->icon_name = CORBA_string_dup (folder_type->icon_name);
- }
-
- return folder_type_list;
-}
-
-static void
-impl_ShellComponent_set_owner (PortableServer_Servant servant,
- const Evolution_Shell shell,
- const CORBA_char *evolution_homedir,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionShellComponent *shell_component;
- EvolutionShellComponentPrivate *priv;
- Evolution_Shell shell_duplicate;
-
- bonobo_object = bonobo_object_from_servant (servant);
- shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object);
- priv = shell_component->priv;
-
- if (priv->owner_client != NULL) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_ShellComponent_AlreadyOwned, NULL);
- return;
- }
-
- shell_duplicate = CORBA_Object_duplicate (shell, ev);
-
- if (ev->_major == CORBA_NO_EXCEPTION) {
- priv->owner_client = evolution_shell_client_new (shell_duplicate);
- gtk_signal_emit (GTK_OBJECT (shell_component), signals[OWNER_SET], priv->owner_client, evolution_homedir);
- }
-}
-
-static void
-impl_ShellComponent_unset_owner (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionShellComponent *shell_component;
- EvolutionShellComponentPrivate *priv;
-
- bonobo_object = bonobo_object_from_servant (servant);
- shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object);
- priv = shell_component->priv;
-
- if (priv->owner_client == NULL) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_ShellComponent_NotOwned, NULL);
- return;
- }
-
- bonobo_object_unref (BONOBO_OBJECT (priv->owner_client));
- priv->owner_client = NULL;
-
- gtk_signal_emit (GTK_OBJECT (shell_component), signals[OWNER_UNSET]);
-}
-
-static Bonobo_Control
-impl_ShellComponent_create_view (PortableServer_Servant servant,
- const CORBA_char *physical_uri,
- const CORBA_char *type,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionShellComponent *shell_component;
- EvolutionShellComponentPrivate *priv;
- EvolutionShellComponentResult result;
- BonoboControl *control;
-
- bonobo_object = bonobo_object_from_servant (servant);
- shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object);
- priv = shell_component->priv;
-
- result = (* priv->create_view_fn) (shell_component, physical_uri, type,
- &control, priv->closure);
-
- if (result != EVOLUTION_SHELL_COMPONENT_OK) {
- switch (result) {
- case EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE:
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_ShellComponent_UnsupportedType,
- NULL);
- break;
- case EVOLUTION_SHELL_COMPONENT_INTERNALERROR:
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_ShellComponent_InternalError,
- NULL);
- break;
- default:
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Evolution_ShellComponent_NotFound,
- NULL);
- }
-
- return CORBA_OBJECT_NIL;
- }
-
- return bonobo_object_corba_objref (BONOBO_OBJECT (control));
-}
-
-static void
-impl_ShellComponent_async_create_folder (PortableServer_Servant servant,
- const Evolution_ShellComponentListener listener,
- const CORBA_char *physical_uri,
- const CORBA_char *type,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionShellComponent *shell_component;
- EvolutionShellComponentPrivate *priv;
-
- bonobo_object = bonobo_object_from_servant (servant);
- shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object);
- priv = shell_component->priv;
-
- if (priv->create_folder_fn == NULL) {
- Evolution_ShellComponentListener_report_result (listener,
- Evolution_ShellComponentListener_UNSUPPORTED_OPERATION,
- ev);
- return;
- }
-
- (* priv->create_folder_fn) (shell_component, physical_uri, type, listener, priv->closure);
-}
-
-static void
-impl_ShellComponent_async_remove_folder (PortableServer_Servant servant,
- const Evolution_ShellComponentListener listener,
- const CORBA_char *physical_uri,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionShellComponent *shell_component;
- EvolutionShellComponentPrivate *priv;
-
- bonobo_object = bonobo_object_from_servant (servant);
- shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object);
- priv = shell_component->priv;
-
- if (priv->remove_folder_fn == NULL) {
- Evolution_ShellComponentListener_report_result (listener,
- Evolution_ShellComponentListener_UNSUPPORTED_OPERATION,
- ev);
- return;
- }
-
- (* priv->remove_folder_fn) (shell_component, physical_uri, listener, priv->closure);
-}
-
-static void
-impl_ShellComponent_populate_folder_context_menu (PortableServer_Servant servant,
- const Bonobo_UIHandler corba_uih,
- const CORBA_char *physical_uri,
- const CORBA_char *type,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionShellComponent *shell_component;
- EvolutionShellComponentPrivate *priv;
- BonoboUIHandler *uih;
-
- bonobo_object = bonobo_object_from_servant (servant);
- shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object);
- priv = shell_component->priv;
-
- if (priv->populate_folder_context_menu_fn == NULL)
- return;
-
- uih = bonobo_ui_handler_new ();
- bonobo_ui_handler_set_container (uih, corba_uih);
- bonobo_object_release_unref (corba_uih, NULL);
-
- (* priv->populate_folder_context_menu_fn) (shell_component, uih, physical_uri, type, priv->closure);
-
- bonobo_object_unref (BONOBO_OBJECT (uih));
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EvolutionShellComponent *shell_component;
- EvolutionShellComponentPrivate *priv;
- CORBA_Environment ev;
- GList *p;
-
- shell_component = EVOLUTION_SHELL_COMPONENT (object);
-
- priv = shell_component->priv;
-
- CORBA_exception_init (&ev);
-
- if (priv->owner_client != NULL)
- bonobo_object_unref (BONOBO_OBJECT (priv->owner_client));
-
- CORBA_exception_free (&ev);
-
- for (p = priv->folder_types; p != NULL; p = p->next) {
- EvolutionShellComponentFolderType *folder_type;
-
- folder_type = (EvolutionShellComponentFolderType *) p->data;
-
- g_free (folder_type->name);
- g_free (folder_type->icon_name);
- g_free (folder_type);
- }
- g_list_free (priv->folder_types);
-
- g_free (priv);
-}
-
-
-/* Initialization. */
-
-static void
-corba_class_init (void)
-{
- POA_Evolution_ShellComponent__vepv *vepv;
- POA_Evolution_ShellComponent__epv *epv;
- PortableServer_ServantBase__epv *base_epv;
-
- base_epv = g_new0 (PortableServer_ServantBase__epv, 1);
- base_epv->_private = NULL;
- base_epv->finalize = NULL;
- base_epv->default_POA = NULL;
-
- epv = g_new0 (POA_Evolution_ShellComponent__epv, 1);
- epv->_get_supported_types = impl_ShellComponent__get_supported_types;
- epv->set_owner = impl_ShellComponent_set_owner;
- epv->unset_owner = impl_ShellComponent_unset_owner;
- epv->create_view = impl_ShellComponent_create_view;
- epv->async_create_folder = impl_ShellComponent_async_create_folder;
- epv->async_remove_folder = impl_ShellComponent_async_remove_folder;
- epv->populate_folder_context_menu = impl_ShellComponent_populate_folder_context_menu;
-
- vepv = &ShellComponent_vepv;
- vepv->_base_epv = base_epv;
- vepv->Bonobo_Unknown_epv = bonobo_object_get_epv ();
- vepv->Evolution_ShellComponent_epv = epv;
-}
-
-static void
-class_init (EvolutionShellComponentClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- signals[OWNER_SET]
- = gtk_signal_new ("owner_set",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EvolutionShellComponentClass, owner_set),
- gtk_marshal_NONE__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER, GTK_TYPE_POINTER);
-
- signals[OWNER_UNSET]
- = gtk_signal_new ("owner_unset",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EvolutionShellComponentClass, owner_unset),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- corba_class_init ();
-}
-
-static void
-init (EvolutionShellComponent *shell_component)
-{
- EvolutionShellComponentPrivate *priv;
-
- priv = g_new (EvolutionShellComponentPrivate, 1);
-
- priv->folder_types = NULL;
- priv->create_view_fn = NULL;
- priv->create_folder_fn = NULL;
- priv->remove_folder_fn = NULL;
- priv->populate_folder_context_menu_fn = NULL;
-
- priv->owner_client = NULL;
- priv->closure = NULL;
-
- shell_component->priv = priv;
-}
-
-
-void
-evolution_shell_component_construct (EvolutionShellComponent *shell_component,
- const EvolutionShellComponentFolderType folder_types[],
- Evolution_ShellComponent corba_object,
- EvolutionShellComponentCreateViewFn create_view_fn,
- EvolutionShellComponentCreateFolderFn create_folder_fn,
- EvolutionShellComponentRemoveFolderFn remove_folder_fn,
- EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn,
- void *closure)
-{
- EvolutionShellComponentPrivate *priv;
- int i;
-
- g_return_if_fail (shell_component != NULL);
- g_return_if_fail (corba_object != CORBA_OBJECT_NIL);
-
- bonobo_object_construct (BONOBO_OBJECT (shell_component), corba_object);
-
- priv = shell_component->priv;
-
- priv->create_view_fn = create_view_fn;
- priv->create_folder_fn = create_folder_fn;
- priv->remove_folder_fn = remove_folder_fn;
- priv->populate_folder_context_menu_fn = populate_folder_context_menu_fn;
-
- priv->closure = closure;
-
- for (i = 0; folder_types[i].name != NULL; i++) {
- EvolutionShellComponentFolderType *new;
-
- if (folder_types[i].icon_name == NULL
- || folder_types[i].name[0] == '\0'
- || folder_types[i].icon_name[0] == '\0')
- continue;
-
- new = g_new (EvolutionShellComponentFolderType, 1);
- new->name = g_strdup (folder_types[i].name);
- new->icon_name = g_strdup (folder_types[i].icon_name);
-
- priv->folder_types = g_list_prepend (priv->folder_types, new);
- }
-
- if (priv->folder_types == NULL)
- g_warning ("No valid folder types constructing EShellComponent %p", shell_component);
-}
-
-EvolutionShellComponent *
-evolution_shell_component_new (const EvolutionShellComponentFolderType folder_types[],
- EvolutionShellComponentCreateViewFn create_view_fn,
- EvolutionShellComponentCreateFolderFn create_folder_fn,
- EvolutionShellComponentRemoveFolderFn remove_folder_fn,
- EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn,
- void *closure)
-{
- EvolutionShellComponent *new;
- POA_Evolution_ShellComponent *servant;
- Evolution_ShellComponent corba_object;
-
- servant = create_servant ();
- if (servant == NULL)
- return NULL;
-
- new = gtk_type_new (evolution_shell_component_get_type ());
-
- corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant);
- evolution_shell_component_construct (new, folder_types, corba_object,
- create_view_fn, create_folder_fn, remove_folder_fn,
- populate_folder_context_menu_fn,
- closure);
-
- return new;
-}
-
-EvolutionShellClient *
-evolution_shell_component_get_owner (EvolutionShellComponent *shell_component)
-{
- g_return_val_if_fail (shell_component != NULL, NULL);
- g_return_val_if_fail (EVOLUTION_IS_SHELL_COMPONENT (shell_component), NULL);
-
- return shell_component->priv->owner_client;
-}
-
-
-E_MAKE_TYPE (evolution_shell_component, "EvolutionShellComponent", EvolutionShellComponent,
- class_init, init, PARENT_TYPE)
diff --git a/shell/evolution-shell-component.h b/shell/evolution-shell-component.h
deleted file mode 100644
index 6b080e48c3..0000000000
--- a/shell/evolution-shell-component.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-shell-component.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef EVOLUTION_SHELL_COMPONENT_H
-#define EVOLUTION_SHELL_COMPONENT_H
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-control.h>
-
-#include "Evolution.h"
-
-#include "evolution-shell-client.h"
-
-#ifdef cplusplus
-extern "C" {
-#pragma }
-#endif /* cplusplus */
-
-#define EVOLUTION_TYPE_SHELL_COMPONENT (evolution_shell_component_get_type ())
-#define EVOLUTION_SHELL_COMPONENT(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_SHELL_COMPONENT, EvolutionShellComponent))
-#define EVOLUTION_SHELL_COMPONENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_SHELL_COMPONENT, EvolutionShellComponentClass))
-#define EVOLUTION_IS_SHELL_COMPONENT(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_SHELL_COMPONENT))
-#define EVOLUTION_IS_SHELL_COMPONENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_SHELL_COMPONENT))
-
-
-typedef struct _EvolutionShellComponent EvolutionShellComponent;
-typedef struct _EvolutionShellComponentPrivate EvolutionShellComponentPrivate;
-typedef struct _EvolutionShellComponentClass EvolutionShellComponentClass;
-
-enum _EvolutionShellComponentResult {
- EVOLUTION_SHELL_COMPONENT_OK,
- EVOLUTION_SHELL_COMPONENT_CORBAERROR,
- EVOLUTION_SHELL_COMPONENT_INTERRUPTED,
- EVOLUTION_SHELL_COMPONENT_INVALIDARG,
- EVOLUTION_SHELL_COMPONENT_ALREADYOWNED,
- EVOLUTION_SHELL_COMPONENT_NOTOWNED,
- EVOLUTION_SHELL_COMPONENT_NOTFOUND,
- EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE,
- EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDOPERATION,
- EVOLUTION_SHELL_COMPONENT_INTERNALERROR,
- EVOLUTION_SHELL_COMPONENT_BUSY,
- EVOLUTION_SHELL_COMPONENT_EXISTS,
- EVOLUTION_SHELL_COMPONENT_INVALIDURI,
- EVOLUTION_SHELL_COMPONENT_PERMISSIONDENIED,
- EVOLUTION_SHELL_COMPONENT_HASSUBFOLDERS,
- EVOLUTION_SHELL_COMPONENT_NOSPACE,
- EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR
-};
-typedef enum _EvolutionShellComponentResult EvolutionShellComponentResult;
-
-typedef EvolutionShellComponentResult (* EvolutionShellComponentCreateViewFn)
- (EvolutionShellComponent *shell_component,
- const char *physical_uri,
- const char *type,
- BonoboControl **control_return,
- void *closure);
-typedef void (* EvolutionShellComponentCreateFolderFn) (EvolutionShellComponent *shell_component,
- const char *physical_uri,
- const char *type,
- const Evolution_ShellComponentListener listener,
- void *closure);
-typedef void (* EvolutionShellComponentRemoveFolderFn) (EvolutionShellComponent *shell_component,
- const char *physical_uri,
- const Evolution_ShellComponentListener listener,
- void *closure);
-typedef void (* EvolutionShellComponentPopulateFolderContextMenu) (EvolutionShellComponent *shell_component,
- BonoboUIHandler *uih,
- const char *physical_uri,
- const char *type,
- void *closure);
-
-struct _EvolutionShellComponentFolderType {
- char *name;
- char *icon_name;
-};
-typedef struct _EvolutionShellComponentFolderType EvolutionShellComponentFolderType;
-
-struct _EvolutionShellComponent {
- BonoboObject parent;
-
- EvolutionShellComponentPrivate *priv;
-};
-
-struct _EvolutionShellComponentClass {
- BonoboObjectClass parent_class;
-
- /* Signals. */
-
- void (* owner_set) (EvolutionShellComponent *shell_component,
- EvolutionShellClient *shell_client,
- const char *evolution_homedir);
- void (* owner_unset) (EvolutionShellComponent *shell_component);
-};
-
-
-GtkType evolution_shell_component_get_type (void);
-void evolution_shell_component_construct (EvolutionShellComponent *shell_component,
- const EvolutionShellComponentFolderType folder_types[],
- Evolution_ShellComponent corba_object,
- EvolutionShellComponentCreateViewFn create_view_fn,
- EvolutionShellComponentCreateFolderFn create_folder_fn,
- EvolutionShellComponentRemoveFolderFn remove_folder_fn,
- EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn,
- void *closure);
-EvolutionShellComponent *evolution_shell_component_new (const EvolutionShellComponentFolderType folder_types[],
- EvolutionShellComponentCreateViewFn create_view_fn,
- EvolutionShellComponentCreateFolderFn create_folder_fn,
- EvolutionShellComponentRemoveFolderFn remove_folder_fn,
- EvolutionShellComponentPopulateFolderContextMenu populate_folder_context_menu_fn,
- void *closure);
-EvolutionShellClient *evolution_shell_component_get_owner (EvolutionShellComponent *shell_component);
-
-#ifdef cplusplus
-}
-#endif /* cplusplus */
-
-#endif /* EVOLUTION_SHELL_COMPONENT_H */
diff --git a/shell/evolution-shell-view.c b/shell/evolution-shell-view.c
deleted file mode 100644
index 8ace962f1b..0000000000
--- a/shell/evolution-shell-view.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-shell-view.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-#include <bonobo.h>
-
-#include "e-util/e-util.h"
-
-#include "evolution-shell-view.h"
-
-
-#define PARENT_TYPE bonobo_object_get_type ()
-static BonoboObjectClass *parent_class = NULL;
-
-struct _EvolutionShellViewPrivate {
- int dummy;
-};
-
-enum {
- SET_MESSAGE,
- UNSET_MESSAGE,
- LAST_SIGNAL
-};
-static int signals[LAST_SIGNAL] = { 0 };
-
-
-/* CORBA interface implementation. */
-
-static POA_Evolution_ShellView__vepv ShellView_vepv;
-
-static POA_Evolution_ShellView *
-create_servant (void)
-{
- POA_Evolution_ShellView *servant;
- CORBA_Environment ev;
-
- servant = (POA_Evolution_ShellView *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &ShellView_vepv;
- CORBA_exception_init (&ev);
-
- POA_Evolution_ShellView__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- return servant;
-}
-
-static void
-impl_ShellView_set_message (PortableServer_Servant servant,
- const CORBA_char *message,
- const CORBA_boolean busy,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
-
- bonobo_object = bonobo_object_from_servant (servant);
- gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[SET_MESSAGE], message, busy);
-}
-
-static void
-impl_ShellView_unset_message (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
-
- bonobo_object = bonobo_object_from_servant (servant);
- gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[UNSET_MESSAGE]);
-}
-
-
-/* GtkObject methods. */
-static void
-destroy (GtkObject *object)
-{
- EvolutionShellView *shell_view;
- EvolutionShellViewPrivate *priv;
-
- shell_view = EVOLUTION_SHELL_VIEW (object);
- priv = shell_view->priv;
-
- g_free (priv);
-}
-
-
-static void
-corba_class_init (void)
-{
- POA_Evolution_ShellView__vepv *vepv;
- POA_Evolution_ShellView__epv *epv;
- PortableServer_ServantBase__epv *base_epv;
-
- base_epv = g_new0 (PortableServer_ServantBase__epv, 1);
- base_epv->_private = NULL;
- base_epv->finalize = NULL;
- base_epv->default_POA = NULL;
-
- epv = g_new0 (POA_Evolution_ShellView__epv, 1);
- epv->set_message = impl_ShellView_set_message;
- epv->unset_message = impl_ShellView_unset_message;
-
- vepv = &ShellView_vepv;
- vepv->_base_epv = base_epv;
- vepv->Bonobo_Unknown_epv = bonobo_object_get_epv ();
- vepv->Evolution_ShellView_epv = epv;
-}
-
-static void
-class_init (EvolutionShellViewClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- signals[SET_MESSAGE]
- = gtk_signal_new ("set_message",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EvolutionShellViewClass, set_message),
- gtk_marshal_NONE__POINTER_INT,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_STRING,
- GTK_TYPE_BOOL);
-
- signals[UNSET_MESSAGE]
- = gtk_signal_new ("unset_message",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EvolutionShellViewClass, unset_message),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-
- parent_class = gtk_type_class (bonobo_object_get_type ());
-
- corba_class_init ();
-}
-
-static void
-init (EvolutionShellView *shell_view)
-{
- EvolutionShellViewPrivate *priv;
-
- priv = g_new (EvolutionShellViewPrivate, 1);
- priv->dummy = 0;
-
- shell_view->priv = priv;
-}
-
-
-/**
- * evolution_shell_view_construct:
- * @shell_view:
- * @corba_object:
- *
- * Construct @shell_view with the specified @corba_object.
- **/
-void
-evolution_shell_view_construct (EvolutionShellView *shell_view,
- Evolution_ShellView corba_object)
-{
- g_return_if_fail (shell_view != NULL);
- g_return_if_fail (EVOLUTION_IS_SHELL_VIEW (shell_view));
-
- bonobo_object_construct (BONOBO_OBJECT (shell_view), corba_object);
-}
-
-/**
- * evolution_shell_view_new:
- *
- * Create a new EvolutionShellView object.
- *
- * Return value: The new EvolutionShellView object.
- **/
-EvolutionShellView *
-evolution_shell_view_new (void)
-{
- POA_Evolution_ShellView *servant;
- Evolution_ShellView corba_object;
- EvolutionShellView *new;
-
- servant = create_servant ();
- if (servant == NULL)
- return NULL;
-
- new = gtk_type_new (evolution_shell_view_get_type ());
-
- corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant);
-
- evolution_shell_view_construct (new, corba_object);
-
- return new;
-}
-
-
-E_MAKE_TYPE (evolution_shell_view, "EvolutionShellView", EvolutionShellView, class_init, init, PARENT_TYPE)
diff --git a/shell/evolution-shell-view.h b/shell/evolution-shell-view.h
deleted file mode 100644
index e12e8be2e1..0000000000
--- a/shell/evolution-shell-view.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-shell-view.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __EVOLUTION_SHELL_VIEW_H__
-#define __EVOLUTION_SHELL_VIEW_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-
-#include "Evolution.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define EVOLUTION_TYPE_SHELL_VIEW (evolution_shell_view_get_type ())
-#define EVOLUTION_SHELL_VIEW(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_SHELL_VIEW, EvolutionShellView))
-#define EVOLUTION_SHELL_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_SHELL_VIEW, EvolutionShellViewClass))
-#define EVOLUTION_IS_SHELL_VIEW(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_SHELL_VIEW))
-#define EVOLUTION_IS_SHELL_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_SHELL_VIEW))
-
-
-typedef struct _EvolutionShellView EvolutionShellView;
-typedef struct _EvolutionShellViewPrivate EvolutionShellViewPrivate;
-typedef struct _EvolutionShellViewClass EvolutionShellViewClass;
-
-struct _EvolutionShellView {
- BonoboObject parent;
-
- EvolutionShellViewPrivate *priv;
-};
-
-struct _EvolutionShellViewClass {
- BonoboObjectClass parent_class;
-
- /* Signals. */
-
- void (* set_message) (EvolutionShellView *shell_view, const char *message, gboolean busy);
- void (* unset_message) (EvolutionShellView *shell_view);
-};
-
-
-GtkType evolution_shell_view_get_type (void);
-void evolution_shell_view_construct (EvolutionShellView *shell_view,
- Evolution_ShellView corba_object);
-EvolutionShellView *evolution_shell_view_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EVOLUTION_SHELL_VIEW_H__ */
diff --git a/shell/evolution-storage.c b/shell/evolution-storage.c
deleted file mode 100644
index 2503905b13..0000000000
--- a/shell/evolution-storage.c
+++ /dev/null
@@ -1,387 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-storage.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo.h>
-
-#include "Evolution.h"
-
-#include "e-util/e-util.h"
-
-#include "evolution-storage.h"
-
-
-#define PARENT_TYPE BONOBO_OBJECT_TYPE
-static BonoboObjectClass *parent_class = NULL;
-
-struct _EvolutionStoragePrivate {
- char *name;
-
- Evolution_StorageListener corba_storage_listener;
-};
-
-
-/* CORBA interface implementation. */
-
-static POA_Evolution_Storage__vepv Storage_vepv;
-
-static POA_Evolution_Storage *
-create_servant (void)
-{
- POA_Evolution_Storage *servant;
- CORBA_Environment ev;
-
- servant = (POA_Evolution_Storage *) g_new0 (BonoboObjectServant, 1);
- servant->vepv = &Storage_vepv;
-
- CORBA_exception_init (&ev);
-
- POA_Evolution_Storage__init ((PortableServer_Servant) servant, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_free (servant);
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- return servant;
-}
-
-static CORBA_char *
-impl_Storage__get_name (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionStorage *storage;
- EvolutionStoragePrivate *priv;
-
- bonobo_object = bonobo_object_from_servant (servant);
- storage = EVOLUTION_STORAGE (bonobo_object);
- priv = storage->priv;
-
- return CORBA_string_dup (priv->name);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EvolutionStorage *storage;
- EvolutionStoragePrivate *priv;
- CORBA_Environment ev;
-
- storage = EVOLUTION_STORAGE (object);
- priv = storage->priv;
-
- g_free (priv->name);
-
- CORBA_exception_init (&ev);
-
- if (priv->corba_storage_listener != CORBA_OBJECT_NIL) {
- Evolution_StorageListener_destroyed (priv->corba_storage_listener, &ev);
-
- /* (This is not a Bonobo object, so no unref.) */
- CORBA_Object_release (priv->corba_storage_listener, &ev);
- }
-
- CORBA_exception_free (&ev);
-
- g_free (priv);
-}
-
-
-static void
-corba_class_init (void)
-{
- POA_Evolution_Storage__vepv *vepv;
- POA_Evolution_Storage__epv *epv;
- PortableServer_ServantBase__epv *base_epv;
-
- base_epv = g_new0 (PortableServer_ServantBase__epv, 1);
- base_epv->_private = NULL;
- base_epv->finalize = NULL;
- base_epv->default_POA = NULL;
-
- epv = g_new0 (POA_Evolution_Storage__epv, 1);
- epv->_get_name = impl_Storage__get_name;
-
- vepv = &Storage_vepv;
- vepv->Bonobo_Unknown_epv = bonobo_object_get_epv ();
- vepv->Evolution_Storage_epv = epv;
-}
-
-static void
-class_init (EvolutionStorageClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
-
- parent_class = gtk_type_class (bonobo_object_get_type ());
-
- corba_class_init ();
-}
-
-static void
-init (EvolutionStorage *storage)
-{
- EvolutionStoragePrivate *priv;
-
- priv = g_new (EvolutionStoragePrivate, 1);
- priv->name = NULL;
- priv->corba_storage_listener = NULL;
-
- storage->priv = priv;
-}
-
-
-void
-evolution_storage_construct (EvolutionStorage *storage,
- Evolution_Storage corba_object,
- const char *name)
-{
- EvolutionStoragePrivate *priv;
-
- g_return_if_fail (storage != NULL);
- g_return_if_fail (EVOLUTION_IS_STORAGE (storage));
- g_return_if_fail (corba_object != CORBA_OBJECT_NIL);
- g_return_if_fail (name != NULL);
- g_return_if_fail (name[0] != '\0');
-
- bonobo_object_construct (BONOBO_OBJECT (storage), corba_object);
-
- priv = storage->priv;
- priv->name = g_strdup (name);
-}
-
-EvolutionStorage *
-evolution_storage_new (const char *name)
-{
- EvolutionStorage *new;
- POA_Evolution_Storage *servant;
- Evolution_Storage corba_object;
-
- g_return_val_if_fail (name != NULL, NULL);
- g_return_val_if_fail (name[0] != '\0', NULL);
-
- servant = create_servant ();
- if (servant == NULL)
- return NULL;
-
- new = gtk_type_new (evolution_storage_get_type ());
-
- corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant);
- evolution_storage_construct (new, corba_object, name);
-
- return new;
-}
-
-EvolutionStorageResult
-evolution_storage_register (EvolutionStorage *evolution_storage,
- Evolution_StorageRegistry corba_storage_registry)
-{
- EvolutionStorageResult result;
- Evolution_StorageListener corba_storage_listener;
- Evolution_Storage corba_storage;
- EvolutionStoragePrivate *priv;
- CORBA_Environment ev;
-
- g_return_val_if_fail (evolution_storage != NULL,
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (EVOLUTION_IS_STORAGE (evolution_storage),
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (corba_storage_registry != CORBA_OBJECT_NIL,
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
-
- priv = evolution_storage->priv;
-
- if (priv->corba_storage_listener != CORBA_OBJECT_NIL)
- return EVOLUTION_STORAGE_ERROR_ALREADYREGISTERED;
-
- CORBA_exception_init (&ev);
-
- corba_storage = bonobo_object_corba_objref (BONOBO_OBJECT (evolution_storage));
- corba_storage_listener = Evolution_StorageRegistry_register_storage (corba_storage_registry,
- corba_storage,
- priv->name, &ev);
-
- if (ev._major == CORBA_NO_EXCEPTION) {
- priv->corba_storage_listener = corba_storage_listener;
- result = EVOLUTION_STORAGE_OK;
- } else {
- if (ev._major != CORBA_USER_EXCEPTION)
- result = EVOLUTION_STORAGE_ERROR_CORBA;
- else if (strcmp (CORBA_exception_id (&ev), ex_Evolution_StorageRegistry_Exists) == 0)
- result = EVOLUTION_STORAGE_ERROR_EXISTS;
- else
- result = EVOLUTION_STORAGE_ERROR_GENERIC;
- }
-
- CORBA_exception_free (&ev);
-
- return result;
-}
-
-EvolutionStorageResult
-evolution_storage_register_on_shell (EvolutionStorage *evolution_storage,
- Evolution_Shell corba_shell)
-{
- Evolution_StorageRegistry corba_storage_registry;
- EvolutionStorageResult result;
- CORBA_Environment ev;
-
- g_return_val_if_fail (evolution_storage != NULL,
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (EVOLUTION_IS_STORAGE (evolution_storage),
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (corba_shell != CORBA_OBJECT_NIL,
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
-
- CORBA_exception_init (&ev);
-
- corba_storage_registry = Bonobo_Unknown_query_interface (corba_shell,
- "IDL:Evolution/StorageRegistry:1.0",
- &ev);
- if (corba_storage_registry == CORBA_OBJECT_NIL || ev._major != CORBA_NO_EXCEPTION) {
- CORBA_exception_free (&ev);
- return EVOLUTION_STORAGE_ERROR_NOREGISTRY;
- }
-
- result = evolution_storage_register (evolution_storage, corba_storage_registry);
-
- Bonobo_Unknown_unref (corba_storage_registry, &ev);
- CORBA_Object_release (corba_storage_registry, &ev);
-
- CORBA_exception_free (&ev);
-
- return result;
-}
-
-EvolutionStorageResult
-evolution_storage_new_folder (EvolutionStorage *evolution_storage,
- const char *path,
- const char *type,
- const char *physical_uri,
- const char *description)
-{
- EvolutionStorageResult result;
- EvolutionStoragePrivate *priv;
- Evolution_Folder corba_folder;
- CORBA_Environment ev;
- const char *path_basename;
- char *parent_path;
-
- g_return_val_if_fail (evolution_storage != NULL,
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (EVOLUTION_IS_STORAGE (evolution_storage),
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (path != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (g_path_is_absolute (path), EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (description != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (type != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (physical_uri != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
-
- priv = evolution_storage->priv;
-
- path_basename = g_basename (path);
-
- /* Yuck. */
- corba_folder.name = (CORBA_char *) path_basename;
- corba_folder.description = (CORBA_char *) description;
- corba_folder.type = (CORBA_char *) type;
- corba_folder.physical_uri = (CORBA_char *) physical_uri;
-
- if (path_basename - path > 1) {
- parent_path = g_strndup (path, path_basename - path - 1);
- } else {
- parent_path = g_strdup (G_DIR_SEPARATOR_S);
- }
-
- CORBA_exception_init (&ev);
-
- Evolution_StorageListener_new_folder (priv->corba_storage_listener, parent_path,
- &corba_folder, &ev);
-
- if (ev._major == CORBA_NO_EXCEPTION)
- result = EVOLUTION_STORAGE_OK;
- else if (ev._major != CORBA_USER_EXCEPTION)
- result = EVOLUTION_STORAGE_ERROR_CORBA;
- else if (strcmp (CORBA_exception_id (&ev), ex_Evolution_StorageListener_Exists) == 0)
- result = EVOLUTION_STORAGE_ERROR_EXISTS;
- else
- result = EVOLUTION_STORAGE_ERROR_GENERIC;
-
- CORBA_exception_free (&ev);
-
- g_free (parent_path);
-
- return result;
-}
-
-EvolutionStorageResult
-evolution_storage_removed_folder (EvolutionStorage *evolution_storage,
- const char *path)
-{
- EvolutionStorageResult result;
- EvolutionStoragePrivate *priv;
- CORBA_Environment ev;
-
- g_return_val_if_fail (evolution_storage != NULL,
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (EVOLUTION_IS_STORAGE (evolution_storage),
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (path != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (g_path_is_absolute (path), EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
-
- priv = evolution_storage->priv;
-
- if (priv->corba_storage_listener == CORBA_OBJECT_NIL)
- return EVOLUTION_STORAGE_ERROR_NOTREGISTERED;
-
- CORBA_exception_init (&ev);
-
- Evolution_StorageListener_removed_folder (priv->corba_storage_listener, path, &ev);
-
- if (ev._major == CORBA_NO_EXCEPTION)
- result = EVOLUTION_STORAGE_OK;
- else if (ev._major != CORBA_USER_EXCEPTION)
- result = EVOLUTION_STORAGE_ERROR_CORBA;
- else if (strcmp (CORBA_exception_id (&ev), ex_Evolution_StorageListener_NotFound) == 0)
- result = EVOLUTION_STORAGE_ERROR_NOTFOUND;
- else
- result = EVOLUTION_STORAGE_ERROR_GENERIC;
-
- CORBA_exception_free (&ev);
-
- return result;
-}
-
-
-E_MAKE_TYPE (evolution_storage, "EvolutionStorage", EvolutionStorage, class_init, init, PARENT_TYPE)
diff --git a/shell/evolution-storage.h b/shell/evolution-storage.h
deleted file mode 100644
index 4e96e28df8..0000000000
--- a/shell/evolution-storage.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-storage.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __EVOLUTION_STORAGE_H__
-#define __EVOLUTION_STORAGE_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 EVOLUTION_TYPE_STORAGE (evolution_storage_get_type ())
-#define EVOLUTION_STORAGE(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_STORAGE, EvolutionStorage))
-#define EVOLUTION_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_STORAGE, EvolutionStorageClass))
-#define EVOLUTION_IS_STORAGE(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_STORAGE))
-#define EVOLUTION_IS_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_STORAGE))
-
-
-typedef struct _EvolutionStorage EvolutionStorage;
-typedef struct _EvolutionStoragePrivate EvolutionStoragePrivate;
-typedef struct _EvolutionStorageClass EvolutionStorageClass;
-
-enum _EvolutionStorageResult {
- EVOLUTION_STORAGE_OK,
- EVOLUTION_STORAGE_ERROR_ALREADYREGISTERED,
- EVOLUTION_STORAGE_ERROR_NOTREGISTERED,
- EVOLUTION_STORAGE_ERROR_NOREGISTRY,
- EVOLUTION_STORAGE_ERROR_CORBA,
- EVOLUTION_STORAGE_ERROR_EXISTS,
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER,
- EVOLUTION_STORAGE_ERROR_NOTFOUND,
- EVOLUTION_STORAGE_ERROR_GENERIC
-};
-typedef enum _EvolutionStorageResult EvolutionStorageResult;
-
-struct _EvolutionStorage {
- BonoboObject parent;
-
- EvolutionStoragePrivate *priv;
-};
-
-struct _EvolutionStorageClass {
- BonoboObjectClass parent_class;
-};
-
-
-GtkType evolution_storage_get_type (void);
-void evolution_storage_construct (EvolutionStorage *storage,
- Evolution_Storage corba_object,
- const char *name);
-EvolutionStorage *evolution_storage_new (const char *name);
-
-EvolutionStorageResult evolution_storage_register (EvolutionStorage *storage,
- Evolution_StorageRegistry corba_registry);
-EvolutionStorageResult evolution_storage_register_on_shell (EvolutionStorage *evolution_storage,
- Evolution_Shell corba_shell);
-
-EvolutionStorageResult evolution_storage_new_folder (EvolutionStorage *evolution_storage,
- const char *path,
- const char *type,
- const char *physical_uri,
- const char *description);
-EvolutionStorageResult evolution_storage_removed_folder (EvolutionStorage *evolution_storage,
- const char *path);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EVOLUTION_STORAGE_H__ */
diff --git a/shell/glade/.cvsignore b/shell/glade/.cvsignore
deleted file mode 100644
index 3045c518dc..0000000000
--- a/shell/glade/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.deps
-.libs
-Makefile.in
-Makefile
diff --git a/shell/glade/Makefile.am b/shell/glade/Makefile.am
deleted file mode 100644
index 9ef3238360..0000000000
--- a/shell/glade/Makefile.am
+++ /dev/null
@@ -1,5 +0,0 @@
-gladedir = $(datadir)/evolution/glade
-
-glade_DATA = e-shell-folder-creation-dialog.glade
-
-EXTRA_DIST = $(glade_DATA)
diff --git a/shell/glade/e-shell-folder-creation-dialog.glade b/shell/glade/e-shell-folder-creation-dialog.glade
deleted file mode 100644
index 21701a2a29..0000000000
--- a/shell/glade/e-shell-folder-creation-dialog.glade
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>Shell</name>
- <program_name>shell</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>create_folder_dialog</name>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <default_width>350</default_width>
- <default_height>410</default_height>
- <allow_shrink>True</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>ok_button</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>cancel_button</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>main_vbox</name>
- <homogeneous>False</homogeneous>
- <spacing>6</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>folder_name_label</name>
- <label>Folder name:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>7.45058e-09</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkEntry</class>
- <name>folder_name_entry</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>folder_type_label</name>
- <label>Folder type:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>7.45058e-09</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkOptionMenu</class>
- <name>folder_type_option_menu</name>
- <can_focus>True</can_focus>
- <items></items>
- <initial_choice>0</initial_choice>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>creation_position_label</name>
- <label>Specify where to create the folder:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>7.45058e-09</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/shell/idl/folder.idl b/shell/idl/folder.idl
deleted file mode 100644
index 4a9850a468..0000000000
--- a/shell/idl/folder.idl
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * folder.idl
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Christopher James Lahey <clahey@helixcode.com>
- *
- * Based on original from Matt Loper.
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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.
- */
-
-module Evolution {
-
- interface FolderListener {
-
- enum CallStatus {
- Success,
- RepositoryOffline,
- PermissionDenied,
- WrongFolderType,
- WrongFolderDomain,
- FolderNotFound
- };
-
- void folder_listener_ready (in CallStatus status,
- in Folder folder);
-
- void respond_add_subfolder (in CallStatus status,
- in Folder folder);
- void respond_move_subfolder (in CallStatus status);
- void respond_delete_subfolder (in CallStatus status);
-
- /* This signals that some piece of data has changed.
- The name or icon has changed. */
- void signal_name_changed(in Folder folder);
- void signal_icon_changed(in Folder folder);
-
- /* This says a child/children has been added. */
- void signal_subfolder_added(in FolderList folders);
- /* This says a child has been removed. */
- void signal_subfolder_removed(in Folder folder);
- };
-
- interface Folder {
- void set_listener (in FolderListener listener);
-
- /*
- * get a bonobo control for this view; a client won't
- * use the goad_id gathered in the above function, b/c
- * only the wombat knows how to do that, by surfing
- * the physical evolution directory structure
- */
- Bonobo::control get_control();
-
- /*
- * You must know what interface to query_interface()
- * for once you get a data source!
- */
- Bonobo::Unknown get_data_source();
-
- char *get_name();
- char *get_icon();
-
- void add_subfolder (in string data_source_id,
- in string control_id,
- in string viewable_name);
- void move_subfolder (in Folder subfolder);
- void delete_subfolder (in Folder subfolder);
- };
-
- interface Wombat {
- void get_root_folder(FolderListener listener);
- };
-};
diff --git a/shell/main.c b/shell/main.c
deleted file mode 100644
index 1e2d3c3cc2..0000000000
--- a/shell/main.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* main.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#include <config.h>
-#include <gnome.h>
-#include <bonobo.h>
-#include <libgnomeui/gnome-window-icon.h>
-#include <glade/glade.h>
-#include <liboaf/liboaf.h>
-
-#include "e-util/e-gui-utils.h"
-#include "e-setup.h"
-
-#include "e-shell.h"
-
-#define STARTUP_URI "evolution:/local/Inbox"
-
-static EShell *shell;
-
-static void
-no_views_left_cb (EShell *shell, gpointer data)
-{
- e_shell_quit (shell);
- gtk_main_quit ();
-}
-
-static void
-destroy_cb (GtkObject *object, gpointer data)
-{
- gtk_main_quit ();
-}
-
-static void
-development_warning ()
-{
- GtkWidget *label, *warning_dialog;
- int ret;
-
- warning_dialog = gnome_dialog_new (
- "Evolution" VERSION,
- GNOME_STOCK_BUTTON_OK,
- NULL);
-
- label = gtk_label_new (
- _(
- "Hi. Thanks for taking the time to download this preview release\n"
- "of the Evolution groupware suite.\n"
- "\n"
- "Over the last month and a half, our focus has been on making\n"
- "Evolution usable. Many of the Evolution developers are now using\n"
- "Evolution to read their mail full time. You could too. (Just\n"
- "be sure to keep a backup.)\n"
- "\n"
- "But while we have fixed many bugs affecting its stability and\n"
- "security, you still get the disclaimer: Evolution will: crash,\n"
- "lose your mail when you don't want it to, refuse to delete your\n"
- "mail when you do want it to, leave stray processes running,\n"
- "consume 100% CPU, race, lock, send HTML mail to random mailing\n"
- "lists, and embarass you in front of your friends and co-workers.\n"
- "Use only as directed.\n"
- "\n"
- "We hope that you enjoy the results of our hard work, and we eagerly\n"
- "await your contributions!\n"
- ));
- gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
- gtk_widget_show (label);
-
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (warning_dialog)->vbox),
- label, TRUE, TRUE, 4);
-
- label = gtk_label_new (
- _(
- "Thanks\n"
- "The Evolution Team\n"
- ));
- gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
- gtk_misc_set_alignment(GTK_MISC(label), 1, .5);
- gtk_widget_show (label);
-
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (warning_dialog)->vbox),
- label, TRUE, TRUE, 0);
-
- ret = gnome_dialog_run (GNOME_DIALOG (warning_dialog));
- if (ret != -1)
- gtk_object_destroy (GTK_OBJECT (warning_dialog));
-}
-
-static gint
-idle_cb (gpointer data)
-{
- GtkWidget *view;
- char *evolution_directory;
-
- evolution_directory = (char *) data;
-
- shell = e_shell_new (evolution_directory);
- g_free (evolution_directory);
-
- if (shell == NULL) {
- e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
- _("Cannot initialize the Evolution shell."));
- exit (1);
- }
-
- gtk_signal_connect (GTK_OBJECT (shell), "no_views_left",
- GTK_SIGNAL_FUNC (no_views_left_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (shell), "destroy",
- GTK_SIGNAL_FUNC (destroy_cb), NULL);
-
- if (! e_shell_restore_from_settings (shell))
- view = e_shell_new_view (shell, STARTUP_URI);
-
- if (!getenv ("EVOLVE_ME_HARDER"))
- development_warning ();
-
- return FALSE;
-}
-
-int
-main (int argc, char **argv)
-{
- char *evolution_directory;
-
- bindtextdomain (PACKAGE, EVOLUTION_LOCALEDIR);
- textdomain (PACKAGE);
-
- gnome_init_with_popt_table ("Evolution", VERSION, argc, argv, oaf_popt_options, 0, NULL);
- oaf_init (argc, argv);
-
- glade_gnome_init ();
-
- gnome_window_icon_set_default_from_file (EVOLUTION_IMAGES "/evolution-inbox.png");
-
- if (! bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL)) {
- e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
- _("Cannot initialize the Bonobo component system."));
- exit (1);
- }
-
- /* FIXME */
- evolution_directory = g_concat_dir_and_file (g_get_home_dir (), "evolution");
-
- if (! e_setup (evolution_directory)) {
- g_free (evolution_directory);
- exit (1);
- }
-
- gtk_idle_add (idle_cb, evolution_directory);
-
- bonobo_main ();
-
- return 0;
-}
-
diff --git a/stamp.h.in b/stamp.h.in
deleted file mode 100644
index 8b13789179..0000000000
--- a/stamp.h.in
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/tests/.cvsignore b/tests/.cvsignore
deleted file mode 100644
index 1ad18182a2..0000000000
--- a/tests/.cvsignore
+++ /dev/null
@@ -1,24 +0,0 @@
-test1
-test2
-test3
-test4
-test5
-test6
-test7
-test8
-test9
-test10
-test11
-test12
-test13
-Makefile.in
-Makefile
-.deps
-.libs
-.pure
-mail1.test
-mail2.test
-test-formatter
-test-movemail
-test-url
-
diff --git a/tests/Makefile.am b/tests/Makefile.am
deleted file mode 100644
index a73eb21c55..0000000000
--- a/tests/Makefile.am
+++ /dev/null
@@ -1,73 +0,0 @@
-# process this file with automake to create Makefile.in
-
-INCLUDES = -I$(top_srcdir)/intl -I$(top_srcdir) -I$(top_srcdir)/camel \
- -I$(includedir) -I$(top_srcdir)/camel/providers/pop3 \
- -I$(top_srcdir)/camel/providers/mbox -I$(top_srcdir)/camel/providers/nntp \
- -DG_LOG_DOMAIN=\"evolution-tests\"
-
-LDADD = \
- $(top_builddir)/camel/libcamel.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libibex/libibex.la \
- $(GNOME_LIBDIR) \
- $(GNOMEUI_LIBS) $(INTLLIBS) $(EXTRA_GNOME_LIBS)
-# $(BONOBO_LIBS)
-
-
-
-
-#test4_LDADD = \
-# $(top_builddir)/camel/libcamel.la \
-# $(top_builddir)/camel/providers/MH/libcamelmh.la \
-# $(GNOME_LIBDIR) \
-# $(GNOMEUI_LIBS) $(INTLLIBS) $(PTHREAD_LIB)
-
-#test11_LDADD = \
-# $(LDADD) \
-# $(top_builddir)/filter/libfilter.la \
-# $(top_builddir)/libibex/libibex.a
-
-#test9_LDADD = \
-# $(top_builddir)/camel/libcamel.la \
-# $(top_builddir)/camel/providers/mbox/libcamelmbox.la \
-# $(top_builddir)/libibex/libibex.la \
-# $(GNOME_LIBDIR) \
-# $(GNOMEUI_LIBS) $(INTLLIBS) $(EXTRA_GNOME_LIBS)
-
-test14_LDADD = \
- $(top_builddir)/camel/providers/vee/libcamelvee.la \
- $(top_builddir)/camel/libcamel.la \
- $(top_builddir)/libibex/libibex.la \
- $(GNOME_LIBDIR) \
- $(GNOMEUI_LIBS) $(INTLLIBS) $(EXTRA_GNOME_LIBS)
-
-#test12_LDADD = \
-# $(top_builddir)/camel/libcamel.la \
-# $(top_builddir)/camel/providers/nntp/libcamelnntp.la \
-# $(top_builddir)/libibex/libibex.la \
-# $(GNOME_LIBDIR) \
-# $(GNOMEUI_LIBS) $(INTLLIBS) $(EXTRA_GNOME_LIBS)
-
-test_movemail_LDADD = \
- $(top_builddir)/camel/libcamel.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/libibex/libibex.la \
- $(GNOME_LIBDIR) \
- $(GNOMEUI_LIBS) $(INTLLIBS) $(EXTRA_GNOME_LIBS)
-
-THREAD_RELATED_TESTS=test8
-
-noinst_PROGRAMS = \
- test1 \
- test2 \
- test10 \
- test11 \
- test13 \
- test14 \
- test-movemail \
- test-url \
- $(THREAD_RELATED_TESTS)
-
-# test3 \
-# test12 \
-# test-formatter
diff --git a/tests/test-movemail.c b/tests/test-movemail.c
deleted file mode 100644
index bcd5334b5a..0000000000
--- a/tests/test-movemail.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <camel.h>
-#include <e-util/e-setup.h>
-
-static char *
-auth_callback (char *prompt, gboolean secret, CamelService *service,
- char *item, CamelException *ex)
-{
- char buf[80];
-
- printf ("%s\n", prompt);
- if (secret)
- printf ("(Warning: your input will be displayed)\n");
- if (fgets (buf, sizeof (buf), stdin) == NULL) {
- camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL,
- "User cancelled input.");
- return NULL;
- }
- return g_strdup (buf);
-}
-
-extern char *evolution_folders_dir;
-
-int main (int argc, char **argv)
-{
- CamelSession *session;
- CamelException *ex;
- CamelStore *store, *outstore;
- CamelFolder *folder, *outfolder;
- int nmsgs, i;
- CamelMimeMessage *msg;
- char *url;
- gboolean delete = FALSE;
-
- gtk_init (&argc, &argv);
- camel_init ();
-
- if (argc == 3) {
- if (!strcmp (argv[1], "--delete") ||
- !strcmp (argv[1], "-d")) {
- delete = TRUE;
- argc--;
- argv++;
- }
- }
- if (argc != 2) {
- fprintf (stderr, "Usage: test-movemail [--delete] url\n");
- exit (1);
- }
- e_setup_base_dir ();
- session = camel_session_new (auth_callback);
-
- ex = camel_exception_new ();
- store = camel_session_get_store (session, argv[1], ex);
- if (!store) {
- fprintf(stderr, "Could not open store %s:\n%s\n", argv[1],
- camel_exception_get_description (ex));
- exit (1);
- }
- camel_service_connect_with_url (CAMEL_SERVICE (store), argv[1], ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- printf ("Couldn't connect to %s:\n%s\n", argv[1],
- camel_exception_get_description (ex));
- exit (1);
- }
-
- folder = camel_store_get_folder (store, "inbox", ex);
- if (!folder) {
- fprintf(stderr, "Could not get inbox:\n%s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
- camel_folder_open (folder, FOLDER_OPEN_READ, ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- printf ("Couldn't open folder: %s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
-
- nmsgs = camel_folder_get_message_count (folder, ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- printf ("Couldn't get message count: %s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
- printf ("Inbox contains %d messages.\n", nmsgs);
-
-#ifdef DISPLAY_ONLY
- stdout_stream = camel_stream_fs_new_with_fd (1);
-#else
- url = g_strdup_printf ("mbox://%s", evolution_folders_dir);
- outstore = camel_session_get_store (session, url, ex);
- g_free (url);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- printf ("Couldn't open output store: %s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
- outfolder = camel_store_get_folder (outstore, "inbox", ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- printf ("Couldn't make output folder: %s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
- camel_folder_open (outfolder, FOLDER_OPEN_WRITE, ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- printf ("Couldn't open output folder: %s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
-#endif
-
- for (i = 1; i <= nmsgs; i++) {
- msg = camel_folder_get_message_by_number (folder, i, ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- printf ("Couldn't get message: %s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
-
-#ifdef DISPLAY_ONLY
- camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (msg),
- stdout_stream);
-#else
- camel_folder_append_message (outfolder, msg, ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- printf ("Couldn't write message: %s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
-
- if (delete) {
- camel_folder_delete_message_by_number (folder, i, ex);
- if (camel_exception_get_id (ex) !=
- CAMEL_EXCEPTION_NONE) {
- printf ("Couldn't delete message: %s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
- }
-#endif
- }
-
-#ifndef DISPLAY_ONLY
- camel_folder_close (outfolder, FALSE, ex);
-#endif
- camel_folder_close (folder, TRUE, ex);
-
- camel_service_disconnect (CAMEL_SERVICE (store), ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
- printf ("Couldn't disconnect: %s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
-
- return 0;
-}
-
-void
-gratuitous_dependency_generator()
-{
- xmlSetProp();
-}
diff --git a/tests/test-url.c b/tests/test-url.c
deleted file mode 100644
index 5d8d75951b..0000000000
--- a/tests/test-url.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <camel.h>
-
-int main (int argc, char **argv)
-{
- CamelURL *url;
- CamelException *ex;
-
- if (argc != 2) {
- fprintf (stderr, "Usage: test-url URL\n");
- exit (1);
- }
-
- ex = camel_exception_new ();
- url = camel_url_new (argv[1], ex);
- if (!url) {
- fprintf (stderr, "Could not parse URL:\n%s",
- camel_exception_get_description (ex));
- exit (1);
- }
-
- printf ("URL : %s\n\n", camel_url_to_string (url, TRUE));
- printf ("Protocol: %s\n", url->protocol);
- if (url->user)
- printf ("User : %s\n", url->user);
- if (url->authmech)
- printf ("Authmech: %s\n", url->authmech);
- if (url->passwd)
- printf ("Password: %s\n", url->passwd);
- if (url->host)
- printf ("Host : %s\n", url->host);
- if (url->port)
- printf ("Port : %d\n", url->port);
- if (url->path)
- printf ("Path : %s\n", url->path);
-
- return 0;
-}
diff --git a/tests/test1.c b/tests/test1.c
deleted file mode 100644
index c21cfd371b..0000000000
--- a/tests/test1.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <stdio.h>
-
-#include "camel-mime-message.h"
-#include "camel-multipart.h"
-#include "camel-stream.h"
-#include "camel-stream-fs.h"
-#include "camel-data-wrapper.h"
-#include "camel.h"
-
-int
-main (int argc, char**argv)
-{
- CamelMimeMessage *message;
- CamelMultipart *multipart;
- CamelMimePart *body_part;
- CamelMimePart *attachment_part;
- CamelStream *attachment_stream;
- CamelStream *stream;
- CamelException *ex = camel_exception_new ();
-
- gtk_init (&argc, &argv);
- camel_init ();
-
- if (argc < 2) {
- attachment_stream = NULL;
- } else {
- if (argc == 2) {
- attachment_stream = camel_stream_fs_new_with_name (argv[1], O_RDONLY, 0, ex);
- if (attachment_stream == NULL) {
- fprintf (stderr, "Cannot open `%s': %s\n",
- argv[1],
- camel_exception_get_description (ex));
- return 1;
- }
- } else {
- fprintf (stderr, "Usage: %s [<attachment>]\n",
- argv[0]);
- return 1;
- }
- }
-
- message = camel_mime_message_new ();
-
- camel_mime_part_set_description (CAMEL_MIME_PART (message), "a test");
-
- camel_medium_add_header (CAMEL_MEDIUM (message), "X-test1", "the value of a test");
- camel_medium_add_header (CAMEL_MEDIUM (message), "X-test2", "the value of another test");
- /*camel_mime_part_add_content_language (CAMEL_MIME_PART (message), g_string_new ("es-ca"));*/
-
- camel_mime_message_set_date (message, CAMEL_MESSAGE_DATE_CURRENT, 0);
- camel_mime_message_set_subject (message, g_strdup ("A test message"));
- camel_mime_message_set_reply_to (message, g_strdup ("toto@toto.com"));
- camel_mime_message_set_from (message, g_strdup ("Bertrand.Guiheneuf@aful.org"));
-
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_TO,
- "Franck DeChamps", "franck.dechamps@alseve.fr");
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_TO,
- NULL, "mc@alseve.fr");
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_TO,
- "Richo", "richard.lengagne@inria.fr");
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_CC,
- "Frank", "Francois.fleuret@inria.fr");
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_CC,
- NULL, "maury@justmagic.com");
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_BCC,
- "Bertie", "Bertrand.Guiheneuf@aful.org");
-
- multipart = camel_multipart_new ();
- body_part = camel_mime_part_new ();
- camel_mime_part_set_content (CAMEL_MIME_PART (body_part), "This is a test.\nThis is only a test.\n",
- strlen("This is a test.\nThis is only a test.\n"), "text/plain");
- camel_multipart_add_part (multipart, body_part);
-
- if (attachment_stream == NULL) {
- attachment_part = NULL;
- } else {
- CamelDataWrapper *attachment_wrapper;
-
- /*CamelDataWrapper *stream_wrapper;
-
- stream_wrapper = camel_stream_data_wrapper_new
- (attachment_stream);
-
- attachment_part = camel_mime_body_part_new ();
- camel_mime_part_set_encoding (CAMEL_MIME_PART (attachment_part),
- CAMEL_MIME_PART_ENCODING_BASE64);
- camel_medium_set_content_object (CAMEL_MEDIUM (attachment_part),
- stream_wrapper);
- camel_multipart_add_part (multipart, attachment_part);
-
- gtk_object_unref (GTK_OBJECT (stream_wrapper));*/
-
- attachment_wrapper = camel_data_wrapper_new ();
- camel_data_wrapper_construct_from_stream (attachment_wrapper,
- attachment_stream);
-
- attachment_part = camel_mime_part_new ();
- camel_mime_part_set_encoding (CAMEL_MIME_PART (attachment_part),
- CAMEL_MIME_PART_ENCODING_BASE64);
- camel_medium_set_content_object (CAMEL_MEDIUM (attachment_part),
- attachment_wrapper);
- camel_multipart_add_part (multipart, attachment_part);
- }
-
- camel_medium_set_content_object (CAMEL_MEDIUM (message), CAMEL_DATA_WRAPPER (multipart));
-
- stream = camel_stream_fs_new_with_name ("mail1.test", O_WRONLY|O_TRUNC|O_CREAT, 0600, ex);
- if (!stream) {
- printf ("Could not open output file: %s\n",
- camel_exception_get_description (ex));
- exit(2);
- }
-
- camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message),
- stream, ex);
- camel_stream_flush (stream, ex);
- gtk_object_unref (GTK_OBJECT (stream));
- if (camel_exception_is_set (ex)) {
- printf ("Oops. Failed. %s\n",
- camel_exception_get_description (ex));
- exit (1);
- }
-
- gtk_object_unref (GTK_OBJECT (message));
- gtk_object_unref (GTK_OBJECT (multipart));
- gtk_object_unref (GTK_OBJECT (body_part));
-
- if (attachment_part != NULL)
- gtk_object_unref (GTK_OBJECT (attachment_part));
-
- printf ("Test1 finished\n");
- return 1;
-}
-
diff --git a/tests/test10.c b/tests/test10.c
deleted file mode 100644
index efe069242a..0000000000
--- a/tests/test10.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-
-#include "camel.h"
-#include "camel-mbox-folder.h"
-#include "camel-exception.h"
-#include "md5-utils.h"
-#include <sys/types.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <glib.h>
-
-
-static CamelMimeMessage *
-create_sample_mime_message ()
-{
- CamelMimeMessage *message;
- CamelMimePart *body_part;
- CamelMultipart *multipart;
-
-
- message = camel_mime_message_new ();
-
- camel_mime_part_set_description (CAMEL_MIME_PART (message), "a test");
-
- camel_medium_add_header (CAMEL_MEDIUM (message), "X-test1", "the value of a test");
- camel_medium_add_header (CAMEL_MEDIUM (message), "X-test2", "the value of another test");
-
- camel_mime_message_set_date (message, time(0), 200);
- camel_mime_message_set_subject (message, "A test message");
- camel_mime_message_set_reply_to (message, "toto@toto.com");
- camel_mime_message_set_from (message, "Bertrand.Guiheneuf@aful.org");
-
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_TO,
- "Franck DeChamps", "franck.dechamps@alseve.fr");
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_TO,
- NULL, "mc@alseve.fr");
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_TO,
- "Richo", "richard.lengagne@inria.fr");
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_CC,
- "Frank", "Francois.fleuret@inria.fr");
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_CC,
- NULL, "maury@justmagic.com");
- camel_mime_message_add_recipient (message, CAMEL_RECIPIENT_TYPE_BCC,
- "Bertie", "Bertrand.Guiheneuf@aful.org");
-
- multipart = camel_multipart_new ();
- body_part = camel_mime_part_new ();
- camel_mime_part_set_content (CAMEL_MIME_PART (body_part), "This is a test.\nThis is only a test.\n",
- strlen("This is a test.\nThis is only a test.\n"), "text/plain");
- camel_multipart_add_part (multipart, body_part);
- camel_medium_set_content_object (CAMEL_MEDIUM (message), CAMEL_DATA_WRAPPER (multipart));
-
- return message;
-}
-
-static char *
-auth_callback(char *prompt, gboolean secret,
- CamelService *service, char *item,
- CamelException *ex)
-{
- printf ("auth_callback called: %s\n", prompt);
- return NULL;
-}
-
-
-
-
-int
-main (int argc, char**argv)
-{
- CamelSession *session;
- CamelException *ex;
- CamelStore *store;
- gchar *store_url = "mbox:///tmp/evmail";
- CamelFolder *folder;
- CamelMimeMessage *message;
- GList *uid_list;
-
- gtk_init (&argc, &argv);
- camel_init ();
- ex = camel_exception_new ();
-
- session = camel_session_new (auth_callback);
- store = camel_session_get_store (session, store_url, ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_session_get_store\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- folder = camel_store_get_folder (store, "Inbox", ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_store_get_folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- camel_folder_open (folder, FOLDER_OPEN_RW, ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught when trying to open the folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- message = create_sample_mime_message ();
- camel_folder_append_message (folder, message, ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught when trying to append a message to the folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- uid_list = camel_folder_get_uid_list (folder, ex);
-
-
- camel_folder_get_message_by_uid (folder, (gchar *)uid_list->data, ex);
- camel_folder_close (folder, FALSE, ex);
- return 1;
-}
-
-
-
-
diff --git a/tests/test11.c b/tests/test11.c
deleted file mode 100644
index 1323a5f90b..0000000000
--- a/tests/test11.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- Test search api
- */
-
-
-#include <camel/camel.h>
-#include <camel/camel-exception.h>
-#include <camel/camel-folder.h>
-#include <camel/md5-utils.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <glib.h>
-
-static char *
-auth_callback(char *prompt, gboolean secret,
- CamelService *service, char *item,
- CamelException *ex)
-{
- printf ("auth_callback called: %s\n", prompt);
- return NULL;
-}
-
-int
-main (int argc, char**argv)
-{
- CamelSession *session;
- CamelException *ex;
- CamelStore *store;
- gchar *store_url = "mbox:///tmp/evmail";
- CamelFolder *folder, *outbox;
- GList *n, *matches;
-
- gtk_init (&argc, &argv);
- camel_init ();
- ex = camel_exception_new ();
-
- session = camel_session_new (auth_callback);
-
- camel_provider_load (session, "../camel/providers/mbox/.libs/libcamelmbox.so.0", ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exceptions suck: %s\n", camel_exception_get_description (ex));
- return 1;
- }
-
- store = camel_session_get_store (session, store_url, ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_session_get_store\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- printf("get folder\n");
-
- folder = camel_store_get_folder (store, "Inbox", ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_store_get_folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- printf("open folder\n");
-
- camel_folder_open (folder, FOLDER_OPEN_READ, ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught when trying to open the folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- printf("create output folder ...\n");
- outbox = camel_store_get_folder (store, "Gnome", ex);
- if (!camel_folder_exists(outbox, ex)) {
- camel_folder_create(outbox, ex);
- }
-
- camel_folder_open (outbox, FOLDER_OPEN_WRITE, ex);
-
- printf("Search for messages\n");
-
- matches = camel_folder_search_by_expression (folder,
-/* "(match-all (header-contains \"subject\" \"gnome\"))",*/
- "(body-contains \"gnome\")",
- ex);
-
- printf("search found matches:\n");
- n = matches;
- while (n) {
- CamelMimeMessage *m;
-
- printf("uid: %s\n", (char *) n->data);
- m = camel_folder_get_message_by_uid(folder, n->data, ex);
-
- if (camel_exception_get_id (ex)) {
- printf ("Cannot get message\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- camel_exception_init(ex);
- } else {
-
-#if 1
-
- camel_folder_append_message(outbox, m, ex);
-
- if (camel_exception_get_id (ex)) {
- printf ("Cannot save message\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- }
-
- printf("Removing matching message from source folder?\n");
- camel_mime_message_set_flags(m, CAMEL_MESSAGE_DELETED, CAMEL_MESSAGE_DELETED);
-/* camel_mime_message_set_flags(m, CAMEL_MESSAGE_ANSWERED, CAMEL_MESSAGE_ANSWERED);*/
-#endif
-
- }
- if (m)
- gtk_object_unref(m);
- n = g_list_next(n);
- }
-
- camel_folder_close (outbox, TRUE, ex);
- camel_folder_close (folder, TRUE, ex);
-
- gtk_object_unref((GtkObject *)outbox);
- gtk_object_unref((GtkObject *)folder);
-
- return 0;
-}
-
-
-
-
diff --git a/tests/test12.c b/tests/test12.c
deleted file mode 100644
index 223eb980a8..0000000000
--- a/tests/test12.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <stdio.h>
-
-#include "camel.h"
-#include "camel-nntp-store.h"
-#include "camel-session.h"
-#include "camel-exception.h"
-
-static char*
-authenticator (char *prompt, gboolean secret, CamelService *service, char *item,
- CamelException *ex)
-{
-}
-
-static void
-print_name(gpointer data, gpointer foo)
-{
- printf ("%s\n", (char*)data);
-}
-
-int
-main (int argc, char **argv)
-{
- CamelSession *session;
- CamelException *ex;
- CamelStore *store;
- CamelFolder *n_p_m_a;
- GList *groups;
- const gchar *news_url = "news://news.mozilla.org";
-
- gtk_init (&argc, &argv);
- camel_init ();
- ex = camel_exception_new ();
-
- g_assert (camel_provider_register_as_module ("/usr/local/lib/evolution/camel-providers/0.0.1/libcamelnntp.so"));
-
- session = camel_session_new (authenticator);
- store = camel_session_get_store (session, news_url, ex);
-
- g_assert (store);
-
- camel_nntp_store_subscribe_group (store, "netscape.public.mozilla.announce");
-
- printf ("subscribed groups on %s\n", news_url);
-
- groups = camel_nntp_store_list_subscribed_groups (store);
-
- g_list_foreach(groups, print_name, NULL);
-
- n_p_m_a = camel_store_get_folder (store, "netscape.public.mozilla.announce", ex);
-
- camel_folder_open(n_p_m_a, FOLDER_OPEN_READ, ex);
-
- camel_folder_close(n_p_m_a, FALSE, ex);
-}
diff --git a/tests/test13.c b/tests/test13.c
deleted file mode 100644
index 3e191eddf5..0000000000
--- a/tests/test13.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* tests mime message file parsing */
-#include "stdio.h"
-#include "camel-mime-message.h"
-#include "camel-mime-part.h"
-#include "camel-stream.h"
-#include "camel-stream-fs.h"
-#include "camel.h"
-
-
-static void
-dump_message_content(CamelDataWrapper *object)
-{
- CamelDataWrapper *containee;
- CamelStream *stream;
- int parts, i;
- int len;
- int left;
- char buffer[128];
-
- printf("Dumping message ...");
-
- containee = camel_medium_get_content_object(CAMEL_MEDIUM(object));
-
- if (containee) {
- char *type = gmime_content_field_get_mime_type(containee->mime_type);
-
- printf("type = %s\n", type);
-
- if (CAMEL_IS_MULTIPART(containee)) {
- parts = camel_multipart_get_number (CAMEL_MULTIPART(containee));
- printf("multipart message, scanning contents %d parts ...\n", parts);
- for (i=0;i<parts;i++) {
- dump_message_content(CAMEL_DATA_WRAPPER (camel_multipart_get_part(CAMEL_MULTIPART(containee), i)));
- }
- } else if (CAMEL_IS_MIME_MESSAGE(containee)) {
- dump_message_content((CamelDataWrapper *)containee);
- } else {
- stream = camel_data_wrapper_get_output_stream(containee);
- left = 0;
-
- if (stream) {
- while ( (len = camel_stream_read(stream, buffer+left, sizeof(buffer)-left, NULL)) > 0) {
- fwrite(buffer, len, 1, stdout);
- }
- printf("\n");
- } else {
- g_warning("cannot get stream for message?");
- }
- }
-
- g_free(type);
- } else {
- printf("no containee?\n");
- }
-}
-
-int
-main (int argc, char**argv)
-{
- CamelMimeMessage *message;
- CamelStream *input_stream, *output_stream;
- CamelMimeParser *parser;
-
- gtk_init (&argc, &argv);
- camel_init ();
-
-/* should have another program to test all this internationalisation/header parsing stuff */
-#if 0
- {
- char *s, *o;
- s = "This is a test, simple ascii text";
- o = header_encode_string(s);
- printf("%s -> %s\n", s, o);
- s = "To: Markus \"DÃ…hr\" <doehrm@aubi.de>";
- o = header_encode_string(s);
- printf("%s -> %s\n", s, o);
-
- s = "From: =?iso-8859-1?Q?Kenneth_ll=E9phaane_Christiansen?= <kenneth@ripen.dk>";
- o = header_encode_string(s);
- printf("%s -> %s\n", s, o);
-
- printf("decoding ... \n");
- s = "From: =?iso-8859-1?Q?Kenneth_ll=E9phaane_Christiansen?= <kenneth@ripen.dk>";
- o = header_decode_string(s);
- printf("%s -> %s\n", s, o);
-
- printf("reencoded\n");
- s = header_encode_string(o);
- printf("%s -> %s\n", o, s);
- return 0;
- }
-#endif
-
- message = camel_mime_message_new ();
-
-
- input_stream = camel_stream_fs_new_with_name ("mail.test", O_RDONLY, 0, NULL);
- if (!input_stream) {
- perror ("could not open input file\n");
- printf ("You must create the file mail.test before running this test\n");
- exit(2);
- }
-
- printf("creating parser to create message\n");
- parser = camel_mime_parser_new();
- camel_mime_parser_init_with_stream(parser, input_stream);
- camel_mime_part_construct_from_parser(CAMEL_MIME_PART (message),
- parser);
-
- dump_message_content(CAMEL_DATA_WRAPPER (message));
-
- gtk_object_unref (GTK_OBJECT (input_stream));
-
- output_stream = camel_stream_fs_new_with_name ("mail2.test", O_WRONLY|O_CREAT|O_TRUNC, 0600, NULL);
- camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), output_stream, NULL);
- camel_stream_flush (output_stream, NULL);
- gtk_object_unref (GTK_OBJECT (output_stream));
-
- //gtk_object_unref (GTK_OBJECT (message));
- return 0;
-
-}
diff --git a/tests/test14.c b/tests/test14.c
deleted file mode 100644
index 80963415db..0000000000
--- a/tests/test14.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- Test vfolder.
- */
-
-
-#include <camel/camel.h>
-#include <camel/camel-exception.h>
-#include <camel/camel-folder.h>
-#include <camel/providers/vee/camel-vee-folder.h>
-#include <camel/md5-utils.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <glib.h>
-
-static void
-dump_message_content(CamelDataWrapper *object)
-{
- CamelDataWrapper *containee;
- CamelStream *stream;
- int parts, i;
- int len;
- int left;
- char buffer[128];
-
- printf("Dumping message ...");
-
- containee = camel_medium_get_content_object(CAMEL_MEDIUM(object));
-
- if (containee) {
- char *type = gmime_content_field_get_mime_type(containee->mime_type);
-
- printf("type = %s\n", type);
-
- if (CAMEL_IS_MULTIPART(containee)) {
- parts = camel_multipart_get_number (CAMEL_MULTIPART(containee));
- printf("multipart message, scanning contents %d parts ...\n", parts);
- for (i=0;i<parts;i++) {
- dump_message_content(CAMEL_DATA_WRAPPER (camel_multipart_get_part(CAMEL_MULTIPART(containee), i)));
- }
- } else if (CAMEL_IS_MIME_MESSAGE(containee)) {
- dump_message_content((CamelDataWrapper *)containee);
- } else {
- stream = camel_data_wrapper_get_output_stream(containee);
- left = 0;
-
- if (stream) {
- while ( (len = camel_stream_read(stream, buffer+left, sizeof(buffer)-left, NULL)) > 0) {
- fwrite(buffer, len, 1, stdout);
- }
- printf("\n");
- } else {
- g_warning("cannot get stream for message?");
- }
- }
-
- g_free(type);
- } else {
- printf("no containee?\n");
- }
-}
-
-
-static char *
-auth_callback(char *prompt, gboolean secret,
- CamelService *service, char *item,
- CamelException *ex)
-{
- printf ("auth_callback called: %s\n", prompt);
- return NULL;
-}
-
-int
-main (int argc, char**argv)
-{
- CamelSession *session;
- CamelException *ex;
- CamelStore *store;
- gchar *store_url = "vfolder:";
- CamelFolder *folder;
- GList *n, *matches;
-
- gtk_init (&argc, &argv);
- camel_init ();
- ex = camel_exception_new ();
-
- session = camel_session_new (auth_callback);
-
- camel_provider_load (session, "../camel/providers/vee/.libs/libcamelvee.so.0", ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exceptions suck: %s\n", camel_exception_get_description (ex));
- return 1;
- }
-
- store = camel_session_get_store (session, store_url, ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_session_get_store\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- printf("get folder\n");
-
- folder = camel_store_get_folder (store, "gnome_email?(match-all (header-contains \"subject\" \"gnome\"))", ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_store_get_folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- /* setup searched folders */
- {
- CamelFolder *subfolder;
- CamelStore *substore;
-
- substore = camel_session_get_store (session, "mbox:///home/notzed/evolution/local/Inbox", ex);
- subfolder = camel_store_get_folder(substore, "mbox", ex);
- camel_folder_open (subfolder, FOLDER_OPEN_READ, ex);
- camel_vee_folder_add_folder(folder, subfolder);
-
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_store_get_folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- substore = camel_session_get_store (session, "mbox:///home/notzed/evolution/local/Outbox", ex);
- subfolder = camel_store_get_folder(substore, "mbox", ex);
- camel_folder_open (subfolder, FOLDER_OPEN_READ, ex);
- camel_vee_folder_add_folder(folder, subfolder);
-
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_store_get_folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
- }
-
- printf("open folder\n");
-
- camel_folder_open (folder, FOLDER_OPEN_READ, ex);
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught when trying to open the folder\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- return -1;
- }
-
- printf("vfolder's uid's:\n");
- n = camel_folder_get_uid_list(folder, ex);
- while (n) {
- CamelMimeMessage *m;
-
- printf("uid: %s\n", (char *) n->data);
-
- m = camel_folder_get_message_by_uid(folder, n->data, ex);
- if (m) {
- dump_message_content(m);
- gtk_object_unref(m);
- }
- n = g_list_next(n);
- }
-
- camel_folder_close (folder, TRUE, ex);
-
- gtk_object_unref((GtkObject *)folder);
-
- return 0;
-}
-
-
-
-
diff --git a/tests/test2.c b/tests/test2.c
deleted file mode 100644
index a6299357cb..0000000000
--- a/tests/test2.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* tests mime message file parsing */
-#include "stdio.h"
-#include "camel-mime-message.h"
-#include "camel-mime-part.h"
-#include "camel-stream.h"
-#include "camel-stream-fs.h"
-#include "camel.h"
-
-int
-main (int argc, char**argv)
-{
- CamelMimeMessage *message;
- CamelStream *input_stream;
- CamelException *ex = camel_exception_new ();
-
- gtk_init (&argc, &argv);
- camel_init ();
-
- message = camel_mime_message_new ();
-
-
- input_stream = camel_stream_fs_new_with_name ("mail.test", O_RDONLY, 0, ex);
- if (!input_stream) {
- perror ("could not open input file\n");
- printf ("You must create the file mail.test before running this test\n");
- exit(2);
- }
-
-
- camel_data_wrapper_construct_from_stream ( CAMEL_DATA_WRAPPER (message), input_stream);
-
- camel_medium_get_content_object (CAMEL_MEDIUM (message));
-
-#if 0
- camel_stream_close (input_stream);
- gtk_object_unref (GTK_OBJECT (input_stream));
-
- output_stream = camel_stream_fs_new_with_name ("mail2.test", O_WRONLY|O_TRUNC|O_CREAT, 0600);
- camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), output_stream);
- camel_stream_close (output_stream);
- gtk_object_unref (GTK_OBJECT (output_stream));
-
- //gtk_object_unref (GTK_OBJECT (message));
-#endif
- return 0;
-
-}
diff --git a/tests/test3.c b/tests/test3.c
deleted file mode 100644
index 9893e2e507..0000000000
--- a/tests/test3.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#include "camel.h"
-
-int
-main (int argc, char**argv)
-{
- GtkType type;
-
- gtk_init (&argc, &argv);
- camel_init ();
-
- printf ("Test 3 : data wrapper repository\n");
-
- printf ("\nMime type : \"multipart\"\n");
- type = data_wrapper_repository_get_data_wrapper_type ("multipart");
- printf ("Type found %s\n", gtk_type_name (type) );
-
- printf ("\nMime type : \"multipart/alternative\"\n");
- type = data_wrapper_repository_get_data_wrapper_type ("multipart/alternative");
- printf ("Type found %s\n", gtk_type_name (type) );
-
- printf ("\nMime type : \"toto/titi\"\n");
- type = data_wrapper_repository_get_data_wrapper_type ("toto/titi");
- printf ("Type found %s\n", gtk_type_name (type) );
-
- printf ("Test3 finished\n");
- return 1;
-}
-
diff --git a/tests/test4.c b/tests/test4.c
deleted file mode 100644
index bc9eef71d1..0000000000
--- a/tests/test4.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* testing mh providers
- do not use CamelMhFolder and CamelMhStore directly.
- We do it here for test purpose only */
-
-
-
-#include "camel-folder.h"
-#include "camel-mh-folder.h"
-#include "camel-mh-store.h"
-#include "camel.h"
-
-int
-main (int argc, char**argv)
-{
- CamelStore *store;
- CamelFolder *inbox_folder;
- CamelFolder *root_mh_folder;
- GList *mh_subfolders_name;
- CamelMimeMessage *message_1;
- gboolean inbox_exists;
-
- gtk_init (&argc, &argv);
- camel_init ();
-
-
- store = gtk_type_new (CAMEL_MH_STORE_TYPE);
- camel_store_init (store, (CamelSession *)NULL, g_strdup ("mh:///root/Mail"));
-
- root_mh_folder = camel_store_get_folder (store, "");
- mh_subfolders_name = camel_folder_list_subfolders (root_mh_folder, NULL);
-
- printf ("\n------------- Listing root Mh folder subfolders --------\n");
- while (mh_subfolders_name) {
- printf ("\t\"%s\"\n", (gchar *)mh_subfolders_name->data);
- mh_subfolders_name = mh_subfolders_name->next;
- }
- printf ("--------------------------------------------------------\n\n");
-
- inbox_folder = camel_store_get_folder (store, "inbox");
- if (!inbox_folder) {
- printf ("** Error: could not get inbox folder from store\n");
- return 1;
- }
-
- /* test existence */
- inbox_exists = camel_folder_exists (inbox_folder, NULL);
- if (inbox_exists)
- printf ("MH folder inbox exists, continuing tests\n");
- else {
- printf ("MH folder inbox does not exist. Stopping \n");
- return 1;
- }
-
- printf ("\n Inbox folder contains %d messages\n", camel_folder_get_message_count (inbox_folder, NULL));
- printf ("\n------------- Gettting message numer 3 in inbox --------\n");
- message_1 = camel_folder_get_message (inbox_folder, 3, NULL);
- printf ("--------------------------------------------------------\n\n");
-
-
- return 1;
-
-
-}
diff --git a/tests/test5.c b/tests/test5.c
deleted file mode 100644
index 81c5e2256a..0000000000
--- a/tests/test5.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* test for the RFC 2047 decoder */
-
-#include <string.h>
-#include <unicode.h>
-
-#include "gmime-utils.h"
-#include "stdio.h"
-#include "camel-mime-message.h"
-#include "camel-mime-part.h"
-#include "camel-stream.h"
-#include "camel-stream-fs.h"
-#include "camel.h"
-#include "gmime-rfc2047.h"
-
-#define TERMINAL_CHARSET "UTF-8"
-
-/*
- * Info on many unicode issues, including, utf-8 xterms from :
- *
- * http://www.cl.cam.ac.uk/~mgk/unicode.html
- *
- */
-
-const char *tests[] =
-{
-/* these strings come from RFC 2047. Ought to add a few torture cases here. */
- "=?US-ASCII?Q?Keith_Moore?= <moore@cs.utk.edu>",
- "=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>",
- "=?ISO-8859-1?Q?Andr=E9?= Pirard <PIRARD@vm1.ulg.ac.be>",
- "=?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=",
- "=?ISO-8859-1?Q?Olle_J=E4rnefors?= <ojarnef@admin.kth.se>",
- "=?ISO-8859-1?Q?Patrik_F=E4ltstr=F6m?= <paf@nada.kth.se>",
- "Nathaniel Borenstein <nsb@thumper.bellcore.com> (=?iso-8859-8?b?7eXs+SDv4SDp7Oj08A==?=)",
- "",
- "(=?ISO-8859-1?Q?a?=)", /* should be displayed as (a) */
- "(=?ISO-8859-1?Q?a?= b)", /* (a b) */
- "(=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=)", /* (ab) */
- "(=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=)", /* (ab) */
- "(=?ISO-8859-1?Q?a?= \n=?ISO-8859-1?Q?b?=)", /* (ab) */
- "(=?ISO-8859-1?Q?a_b?=)", /* (a b) */
- "(=?ISO-8859-1?Q?a?= =?ISO-8859-2?Q?_b?=)", /* (ab) */
- NULL
-};
-
-
-int
-main (int argc, char**argv)
-{
- const char **b = tests;
- while (*b) {
- printf("%s\n", gmime_rfc2047_decode(*b, TERMINAL_CHARSET));
- b++;
- }
-
- return 0;
-
-}
diff --git a/tests/test6.c b/tests/test6.c
deleted file mode 100644
index c2883d89c0..0000000000
--- a/tests/test6.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* test for the RFC 2047 encoder */
-
-#include <string.h>
-#include <unicode.h>
-
-#include "gmime-utils.h"
-#include "stdio.h"
-#include "camel-mime-message.h"
-#include "camel-mime-part.h"
-#include "camel-stream.h"
-#include "camel-stream-fs.h"
-#include "camel.h"
-#include "gmime-rfc2047.h"
-
-#define TERMINAL_CHARSET "UTF-8"
-
-/*
- * Info on many unicode issues, including, utf-8 xterms from :
- *
- * http://www.cl.cam.ac.uk/~mgk25/unicode.html
- *
- */
-
-const char *tests[] =
-{
- "Ðis is a test", "ISO-8859-1",
- "Iñtérñàtiönælîçation", "ISO-8859-1",
- "ΚαλημέÏα κόσμε", "UTF-8",
- "コンニãƒãƒ", "UTF-8",
- "ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn", "UTF-8",
- NULL
-};
-
-
-int
-main (int argc, char**argv)
-{
- const char **b = tests;
- while (*b) {
- char *e = gmime_rfc2047_encode(b[0], b[1]);
- printf("%s\t%s\n", e, gmime_rfc2047_decode(e, TERMINAL_CHARSET));
- b+=2;
- }
-
- return 0;
-
-}
diff --git a/tests/test8.c b/tests/test8.c
deleted file mode 100644
index aa7debdba9..0000000000
--- a/tests/test8.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/* test posix thread folder proxy */
-
-
-#include "camel.h"
-
-CamelThreadProxy *proxy;
-CamelFuncDef *func_def;
-
-
-void
-test_sync_func (int num)
-{
- printf ("Sync function number %d\n", num);
- printf ("Sync function : current thread : %d\n", pthread_self ());
-
-}
-
-
-void
-test_async_cb (int num)
-{
- printf ("Callback number %d\n", num);
- printf ("Callback : current thread : %d\n", pthread_self ());
-}
-
-void
-test_async_func (int num)
-{
- CamelOp *cb;
-
- printf ("Async function number %d\n", num);
- printf ("Async function : current thread : %d\n", pthread_self ());
- sleep (1);
- cb = camel_marshal_create_op (func_def, test_async_cb, num);
- camel_thread_proxy_push_cb (proxy, cb);
-
-
-}
-
-int
-main (int argc, char **argv)
-{
- int i;
- CamelOp *op;
-
- camel_init ();
-
- func_def =
- camel_func_def_new (camel_marshal_NONE__INT,
- 1,
- GTK_TYPE_INT);
-
- printf ("--== Testing Simple marshalling system ==--\n");
- for (i=0; i<5; i++) {
- printf ("Iterration number %d\n", i);
- op = camel_marshal_create_op (func_def, test_sync_func, i);
- camel_op_run (op);
- camel_op_free (op);
-
- }
- printf ("\n\n");
-
- proxy = camel_thread_proxy_new ();
-
- printf ("--== Testing Asynchronous Operation System ==--\n");
- for (i=0; i<5; i++) {
- printf ("Pushing async operation number %d for execution\n", i);
- op = camel_marshal_create_op (func_def, test_async_func, i);
- camel_thread_proxy_push_op (proxy, op);
- }
- printf ("\n\n");
- printf ("--== Operations execution planned ==--\n");
- gtk_main ();
-}
-
diff --git a/tests/test9.c b/tests/test9.c
deleted file mode 100644
index 7fbbee8b8a..0000000000
--- a/tests/test9.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include "camel.h"
-#include "camel-mbox-folder.h"
-#include "camel-mbox-parser.h"
-#include "camel-mbox-utils.h"
-#include "camel-mbox-summary.h"
-#include "camel-exception.h"
-#include <sys/types.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <glib.h>
-
-int
-main (int argc, char**argv)
-{
- GArray *message_info_array;
- gint test_file_fd;
- CamelException *ex;
- CamelMboxSummary *sum1, *sum2;
- GArray *mbox_summary_info;
- CamelMboxSummaryInformation *msg_info;
- int i;
- guint32 next_uid;
- guint32 mbox_file_size;
-
- gtk_init (&argc, &argv);
- camel_init ();
-
- ex = camel_exception_new ();
- test_file_fd = open (argv[1], O_RDONLY);
- message_info_array = camel_mbox_parse_file (test_file_fd,
- "From ",
- 0,
- &mbox_file_size,
- &next_uid,
- TRUE,
- NULL,
- 0,
- ex);
-
- close (test_file_fd);
-#warning This test is no longer valid.
-#if 0
- /* needs a folder to work with (indexing) */
- camel_mbox_write_xev (argv[1], message_info_array, &mbox_file_size, 1, ex);
-#endif
- if (camel_exception_get_id (ex)) {
- printf ("Exception caught in camel_mbox_write_xev : %s\n", camel_exception_get_description (ex));
- }
-
-
- mbox_summary_info =
- parsed_information_to_mbox_summary (message_info_array);
- sum1 = CAMEL_MBOX_SUMMARY (gtk_object_new (camel_mbox_summary_get_type (), NULL));
-
- sum1->nb_message = mbox_summary_info->len;
-
- sum1->message_info = mbox_summary_info;
-
- camel_mbox_summary_save (sum1, "ev-summary.mbox", ex);
-
- sum2 = camel_mbox_summary_load ("ev-summary.mbox", ex);
-
- for (i=0; i<sum1->nb_message; i++) {
-
- msg_info = (CamelMboxSummaryInformation *)(sum1->message_info->data) + i;
- printf ("Message %d :\n"
- " From : %s\n", i, msg_info->headers.sender);
- }
-
- return 1;
-
-}
-
-
-
diff --git a/tests/ui-tests/.cvsignore b/tests/ui-tests/.cvsignore
deleted file mode 100644
index 84c2937bdc..0000000000
--- a/tests/ui-tests/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-Makefile.in
-Makefile
-.deps
-.libs
-store_listing
-msg-composer-test
-message-browser
-filter \ No newline at end of file
diff --git a/tests/ui-tests/Makefile.am b/tests/ui-tests/Makefile.am
deleted file mode 100644
index e61a054093..0000000000
--- a/tests/ui-tests/Makefile.am
+++ /dev/null
@@ -1,39 +0,0 @@
-# process this file with automake to create Makefile.in
-
-INCLUDES = \
- -I$(top_srcdir)/intl \
- -I$(top_srcdir)/camel \
- -I$(includedir) \
- -I$(top_srcdir)/camel/providers/MH \
- -I$(top_srcdir)/widgets \
- -I$(top_srcdir)/filter \
- $(EXTRA_GNOME_CFLAGS) $(BONOBO_GNOME_CFLAGS) \
- -DG_LOG_DOMAIN=\"evolution-ui-tests\"
-
-LDADD = \
- $(top_builddir)/widgets/libevolutionwidgets.la \
- $(top_builddir)/camel/libcamel.la \
- $(INTLLIBS) \
- $(EXTRA_GNOME_LIBS) \
- $(PTHREAD_LIB)
-
-message_browser_LDADD = \
- $(top_builddir)/camel/libcamel.la \
- $(INTLLIBS) \
- $(EXTRA_GNOME_LIBS) \
- $(PTHREAD_LIB) \
- $(EXTRA_GNOME_LIBS) \
- -lgtkhtml -lgnomeprint ../../mail/html-stream.o $(BONOBO_GNOME_LIBS)
-
-filter_LDADD = \
- $(top_builddir)/camel/libcamel.la \
- $(INTLLIBS) \
- $(EXTRA_GNOME_LIBS) \
- $(PTHREAD_LIB) \
- $(EXTRA_GNOME_LIBS) \
- $(top_builddir)/filter/libfilter.la \
- -lgtkhtml -lgnomeprint
-
-noinst_PROGRAMS = \
- message-browser \
- filter
diff --git a/tests/ui-tests/filter.c b/tests/ui-tests/filter.c
deleted file mode 100644
index 3ff6a1b1ae..0000000000
--- a/tests/ui-tests/filter.c
+++ /dev/null
@@ -1,30 +0,0 @@
-
-#include <gnome.h>
-#include "filter-editor.h"
-
-int main(int argc, char **argv)
-{
- GList *rules, *options, *options2;
- xmlDocPtr doc, out, optionset, filteroptions;
- GString *s;
- GtkWidget *w;
-
- gnome_init("Test", "0.0", argc, argv);
- gdk_rgb_init ();
- gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
- gtk_widget_set_default_visual (gdk_rgb_get_visual ());
-
- w = filter_editor_new();
-
- doc = xmlParseFile("filterdescription.xml");
- rules = filter_load_ruleset(doc);
- options = filter_load_optionset(doc, rules);
- options2 = options;
- out = xmlParseFile("saveoptions.xml");
- options = filter_load_optionset(out, rules);
-
- filter_editor_set_rules(w, rules, options2, options);
-
- gtk_widget_show(w);
- gtk_main();
-}
diff --git a/tests/ui-tests/filterdescription.xml b/tests/ui-tests/filterdescription.xml
deleted file mode 100644
index 07c392aa70..0000000000
--- a/tests/ui-tests/filterdescription.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0"?>
-<filterdescription>
-<ruleset type="match">
-<rule name="from-address">
- <code>
- (match-all (header-contains "From" ${sender}))
- </code>
- <description lang="en">The From address matches <source type="address" name="sender">sender(s)</source>.</description>
-</rule>
-
-<rule name="to-address">
- <code>
- (match-all (header-contains "To" ${receipient}))
- </code>
- <description lang="en">The To address matches <source type="address" name="receipient">receipients</source>.</description>
-</rule>
-
-<rule name="cc-address">
- <code>
- (match-all (header-contains "CC" ${self-email}))
- </code>
- <description lang="en">I am in the cc list.</description>
-</rule>
-
-<rule name="msg-size">
- <code>
- (&amp; (&gt; message-size (size-lower size-range))
- (&lt; message-size (size-uppwer size-range)))
- </code>
- <description lang="en">The message is a <source type="size-range" name="size">certain size</source>.</description>
-</rule>
-</ruleset>
-
-<ruleset type="action">
-<rule name="copy-me">
- <code>
- (copy-to ${folder})
- </code>
- <description language="en">Send a copy to <source type="folder" name="folder">folder</source>.</description>
-</rule>
-<rule name="forward">
- <code>
- (forward-to ${address})
- </code>
- <description language="en">Forward the message to <source type="address" name="address">people</source>.</description>
-</rule>
-<rule name="delete">
- <code>
- (delete)
- </code>
- <description language="en">Delete message.</description>
-</rule>
-<rule name="stop">
- <code>
- (stop)
- </code>
- <description language="en">Stop processing further rules for this message.</description>
-</rule>
-</ruleset>
-
-<ruleset type="except">
-<rule name="except-me">
- <code>
- (match-all (not (header-contains "To" "zucchi@zedzone")))
- </code>
- <description language="en">When I am the receipient.</description>
-</rule>
-</ruleset>
-
-<optionset>
- <option type="receive">
- <description language="en">When a message arrives.</description>
- </option>
- <option type="send">
- <description language="en">When a message is sent.</description>
- </option>
- <option type="receive">
- <description language="en">Copy incoming messages from a certain address to specific folder.</description>
- <optionrule type="match" rule="from-address"/>
- <optionrule type="action" rule="copy-me"/>
- </option>
- <option type="send">
- <description language="en">Copy sent messages to a specific folder.</description>
- <optionrule type="action" rule="copy-me"/>
- </option>
- <option type="send">
- <description language="en">Copy messages to me and others to a specific folder.</description>
- <optionrule type="match" rule="from-address">
- <optionvalue name="sender">
- <address name="zucchi" email="zucchi@zedzone"/>
- <address name="foo" email="bar"/>
- </optionvalue>
- </optionrule>
- <optionrule type="match" rule="to-address"/>
- <optionrule type="match" rule="cc-address"/>
- <optionrule type="action" rule="copy-me"/>
- </option>
-</optionset>
-</filterdescription>
diff --git a/tests/ui-tests/mail-atchmt-image.msg b/tests/ui-tests/mail-atchmt-image.msg
deleted file mode 100644
index e828e722b9..0000000000
--- a/tests/ui-tests/mail-atchmt-image.msg
+++ /dev/null
@@ -1,67 +0,0 @@
-X-Mailer: exmh version 2.0.3
-X-Exmh-Isig-CompType: unknown
-X-Exmh-Isig-Folder: inbox
-To:guiheneu
-cc:
-Subject:image
-Mime-Version: 1.0
-Content-Type: multipart/mixed ;
- boundary="==_Exmh_20679612960"
---------
-This is a multipart MIME message.
-
---==_Exmh_20679612960
-Content-Type: text/plain
-
-voici une image, c'est super.
-
-
---==_Exmh_20679612960
-Content-Type: image/png ; name="gnome-fontsel.png"
-Content-Description: gnome-fontsel.png
-Content-Transfer-Encoding: base64
-Content-Disposition: inline; filename="gnome-fontsel.png"
-
-iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAB85J
-REFUeJztmFlslNcVx3+zexnP2MYrXjEBHGICCChgQVu5icCkzUuxm7QSKKKtWgUiRd3eKvHS
-8hIqtUVtWqlVpFBVNlLVB1dJSkHEyGwJFC9g43U8Y3sWz74v39w+eKYMxp7xzLhqHvyTrj7N
-t/zvOffce+49AxtssMEGX2TeA8Qa2qEsNLvWqCkS/a8Lqwn2JO5nQz1LTgyk6A4k7nUte9aV
-u8lPSR2x5YI9ic5yIXWk311BV7DkbFqUa+goVeTWsmcX1/B9Jk0A07Lft1a5nxPJ0ZhdZkBP
-roLt7e3vd3R0iM7OzmQEkhxK6GazpjIym+gk1eD3eNahrKjYu1e8ceqbQrelRZw4cSLVgWTS
-WDNrmUINiWtyLSTpzaajJHW7d4muo7vYX1/IxJgOk8nEMl1jNnryDM9TF203IEs0eH49rIkj
-TSW88eqXqCorxmReRK/XJ7W7E6/czkZvLRFIsnxksl5gbS3V4uvtuzCODjI6MYvZYMJsMHXz
-bDSzGhhZhuc9PI1CpndX5S8DPS0f/uK3k987vp+dLdVcv/k5fZ/N4I9puXbtWs66kDkCyXSX
-1bxczu/P/3ryJ91fY3t1AcOPp3B6A0yafDx6dDcvXcjswOHENat5mcrp06dFS5XE1oYq5o2z
-zM5Z+GTIisFshnXI8+kWceoOm8zPWXHlyhURDAb56t6dRINexqenWXCF+PyxAb/DAUsDlNeR
-Id38W0k0q9R59JV28bM3X2FHYyXG2Rlu3B7k/B//2b3Cq7fIMRrpplBOeT5Jd3e3aK0I0Vyt
-x+t2MmG08NHAWN66y8m0D+TE5cuXRSQc5BuvHkWtVjD6ZIY7j+cYM9j44IMPxLlz57I9wa5K
-XilsOadOnRIAs3NjnP/Bt6ivKGb00RBDj6cYcsm4/GEfHR0d3L9/HyEER44coa+vb602yFjh
-mLFuETje1Snad6gJBoO8dbKDhtpNLC4YsDvdjFkDlOqbAZgaG2TLZj1VZQX037i+VvlVncxm
-J16Vs2fPirZKHy+0NBEITtK+rZa4z4bb62fcYOOTgWEO7C+lsaac+i2tbKuSEwn5uDE4h8cX
-WEsXq065dBFIHqMztS5sD3lxx3bs7jjbG6tRqvUMj81QpCng3ogBNYJqpYOfvnWcN7/chNfl
-wmRxYzJZspk+K76bLgJGltLbYVZOc4dYOqn2Hjt2DLWulpKIjd0vvYzf4yIejxEKh3jn+93E
-/G4Gp+zMWpzYHYvMWL3Y/LE12g6kiUA6B37EUql3GPgVz6e/WcD4neN7hb5Egz8QYuvmEiQR
-Z3Z6FLlMRk1TI8UFxciVWxiZ6GPkyThTFg9CpWVbTQHl9YfFg/5beSWSTIs4eZRIGv8uT3fk
-hpMnT1rb2l6idus+lFEX8ogXtUZHsUbBpjIdWv1mXE43i/NTtDaU4/aGeXHXHk6/doCjB3by
-Qk3GkjdvB7pSrl0JB5LlXndzc/O+lsbNhIIemhvqKGnYS1zE0GmLqKmuRlNaj8lkJByFHa07
-+M3Pv8u+5gqMhjluPRij/95dzpw5k9eekM6B1OHpSbQGnh7setVqNXJVIXHPPAX6ShSFJRDx
-o1Yp0dZswzI9TFGRmrrGFpQigpAi1OoEAyMz3B2aQaeCqzc/zcf+tA4kp89Flqql5D8Q/y04
-4ov3KC5UUUAQTUkVYacRKRJEW9dGcNFAkXBRXVGBXF3MgjPI4PgCtqgGhVZHc20ZVaWFiLA/
-LwfSLeLkVOlladSNLEXgFsClS5dE2NzP9ubNaEsrEZJEPBpEo6sh6DQhRXyoikopKWvEMH6f
-RZuN3W2tKOIBytUSM4Y5AqoijP/6d14OpItAspi/nXLtTv7u//gPvNbxFQqLtSiLSgl7rcgV
-KqIBB1GvFWVxORpdDb75IbQqqCzTEo94uDk0g9PpQiAYMwcwTBj+ZxVZF2nq02gsjjzoRrmp
-iVjYRzToRAr5iEoRlAUlqMsbcE3fByFYsNiJxCQcLj8W0xxub5BFSck//n4177PYSg6k1sHJ
-ggOWImIC+Ovvvi1KVDoABAIhxQh7rCBFKdjUTCQSwWd4gNXmoLRMz5zVSRwZHq8Po9kJRVom
-App8bQdW3p5Xq7yeKUR6L/5QHDx4CFWhnrDXStBjw+wI0lBThtE0T5ley4PBJ3ijcZxuH2qV
-kofDM4zMLDA0aV23U/BKEVipYlrOn/e0NvkVGm1xNOgm6ncElApFUX2lloDfh93h4d7QJFa7
-B622SJIkKfLoiVH69OFUxGz3LQLvsBRNH/AZ4FhPBzKxtaGm3K7WVhTHIwHC7oUQoAGIxmLM
-LdiYNC4gSVCi1UTtTm+0//44NpfPa7H7LgiBGbCzlNUmgHiuxufqwJ6uYwd8MoWSiN8BUADg
-9vqx2JxMm2zEhcz+0cBILByVlEq5LCCXy3rdvtCP4wIZoAfc+RqejwP17Xu2KqRIEJlcATAH
-1IXDEYzzNmRC4vHkPIYFx0goGvtldZn2+uCEWUp8KwDnehieJBcHJkLhWEQK+5Er1QB1AHan
-B7lcNmuyeCITpsWzBrPrYwCL3beO5j5PLiVl38GXW/4khDQMxIBYIBhCo1b5rXb30NU7ozdf
-P7rz2jrbuSp5pTMhhE4mk3kuvN35ulwmW5ics0vv/+3OQ0DK+PEXiQtvdyr+3zZssEGO/Afd
-sGNaGjYibwAAAABJRU5ErkJggg==
-
---==_Exmh_20679612960--
-
-
diff --git a/tests/ui-tests/mail-atchmt-postscript.msg b/tests/ui-tests/mail-atchmt-postscript.msg
deleted file mode 100644
index 9787567865..0000000000
--- a/tests/ui-tests/mail-atchmt-postscript.msg
+++ /dev/null
@@ -1,8069 +0,0 @@
-X-Mailer: exmh version 2.0.3
-X-Exmh-Isig-CompType: unknown
-X-Exmh-Isig-Folder: drafts
-To:
-cc:
-Subject:
-Mime-Version: 1.0
-Content-Type: multipart/mixed ;
- boundary="==_Exmh_-1506175120"
---------
-This is a multipart MIME message.
-
---==_Exmh_-1506175120
-Content-Type: text/plain
-
-
-
---==_Exmh_-1506175120
-Content-Type: application/postscript ; name="popt.ps"
-Content-Description: popt.ps
-Content-Transfer-Encoding: base64
-Content-Disposition: attachment; filename="popt.ps"
-
-JSFQUy1BZG9iZS0yLjAKJSVDcmVhdG9yOiBkdmlwc2sgNS41OGYgQ29weXJpZ2h0IDE5ODYs
-IDE5OTQgUmFkaWNhbCBFeWUgU29mdHdhcmUKJSVUaXRsZTogYm9vay5kdmkKJSVQYWdlczog
-MTEKJSVQYWdlT3JkZXI6IEFzY2VuZAolJUJvdW5kaW5nQm94OiAwIDAgNTY3IDcwMgolJURv
-Y3VtZW50Rm9udHM6IFphcGZEaW5nYmF0cyBQYWxhdGluby1Cb2xkIFBhbGF0aW5vLVJvbWFu
-CiUlKyBTdG9uZVNhbnMtQm9sZCBTdG9uZVNhbnMgUGFsYXRpbm8tSXRhbGljIFBQQ29kZQol
-JSsgU3RvbmVTYW5zLVNlbWlib2xkSXRhbGljIFN0b25lU2Fucy1TZW1pYm9sZCBQUENvZGVC
-b2xkCiUlRG9jdW1lbnRQYXBlclNpemVzOiBMZXR0ZXIKJSVFbmRDb21tZW50cwolRFZJUFND
-b21tYW5kTGluZTogZHZpcHMgLWsgLW8gInwuL2ZpeGFwcGVuZGl4IGJvb2sucHMiIGJvb2su
-ZHZpCiVEVklQU1BhcmFtZXRlcnM6IGRwaT02MDAsIGNvbW1lbnRzIHJlbW92ZWQKJURWSVBT
-U291cmNlOiAgVGVYIG91dHB1dCAxOTk4LjAzLjIzOjE1MjMKJSVCZWdpblByb2NTZXQ6IHRl
-eC5wcm8KL1RlWERpY3QgMjUwIGRpY3QgZGVmIFRlWERpY3QgYmVnaW4gL057ZGVmfWRlZiAv
-QntiaW5kIGRlZn1OIC9Te2V4Y2h9TgovWHtTIE59QiAvVFJ7dHJhbnNsYXRlfU4gL2lzbHMg
-ZmFsc2UgTiAvdnNpemUgMTEgNzIgbXVsIE4gL2hzaXplIDguNSA3MgptdWwgTiAvbGFuZHBs
-dXM5MHtmYWxzZX1kZWYgL0ByaWdpbntpc2xze1swIGxhbmRwbHVzOTB7MSAtMX17LTEgMX0K
-aWZlbHNlIDAgMCAwXWNvbmNhdH1pZiA3MiBSZXNvbHV0aW9uIGRpdiA3MiBWUmVzb2x1dGlv
-biBkaXYgbmVnIHNjYWxlCmlzbHN7bGFuZHBsdXM5MHtWUmVzb2x1dGlvbiA3MiBkaXYgdnNp
-emUgbXVsIDAgZXhjaH17UmVzb2x1dGlvbiAtNzIgZGl2CmhzaXplIG11bCAwfWlmZWxzZSBU
-Un1pZiBSZXNvbHV0aW9uIFZSZXNvbHV0aW9uIHZzaXplIC03MiBkaXYgMSBhZGQgbXVsClRS
-W21hdHJpeCBjdXJyZW50bWF0cml4e2R1cCBkdXAgcm91bmQgc3ViIGFicyAwLjAwMDAxIGx0
-e3JvdW5kfWlmfQpmb3JhbGwgcm91bmQgZXhjaCByb3VuZCBleGNoXXNldG1hdHJpeH1OIC9A
-bGFuZHNjYXBley9pc2xzIHRydWUgTn1CCi9AbWFudWFsZmVlZHtzdGF0dXNkaWN0IC9tYW51
-YWxmZWVkIHRydWUgcHV0fUIgL0Bjb3BpZXN7LyNjb3BpZXMgWH1CCi9GTWF0WzEgMCAwIC0x
-IDAgMF1OIC9GQkJbMCAwIDAgMF1OIC9ubiAwIE4gL0lFIDAgTiAvY3RyIDAgTiAvZGYtdGFp
-bHsKL25uIDggZGljdCBOIG5uIGJlZ2luIC9Gb250VHlwZSAzIE4gL0ZvbnRNYXRyaXggZm50
-cnggTiAvRm9udEJCb3ggRkJCIE4Kc3RyaW5nIC9iYXNlIFggYXJyYXkgL0JpdE1hcHMgWCAv
-QnVpbGRDaGFye0NoYXJCdWlsZGVyfU4gL0VuY29kaW5nIElFIE4KZW5kIGR1cHsvZm9vIHNl
-dGZvbnR9MiBhcnJheSBjb3B5IGN2eCBOIGxvYWQgMCBubiBwdXQgL2N0ciAwIE5bfUIgL2Rm
-ewovc2YgMSBOIC9mbnRyeCBGTWF0IE4gZGYtdGFpbH1CIC9kZnN7ZGl2IC9zZiBYIC9mbnRy
-eFtzZiAwIDAgc2YgbmVnIDAgMF0KTiBkZi10YWlsfUIgL0V7cG9wIG5uIGR1cCBkZWZpbmVm
-b250IHNldGZvbnR9QiAvY2gtd2lkdGh7Y2gtZGF0YSBkdXAKbGVuZ3RoIDUgc3ViIGdldH1C
-IC9jaC1oZWlnaHR7Y2gtZGF0YSBkdXAgbGVuZ3RoIDQgc3ViIGdldH1CIC9jaC14b2Zmewox
-MjggY2gtZGF0YSBkdXAgbGVuZ3RoIDMgc3ViIGdldCBzdWJ9QiAvY2gteW9mZntjaC1kYXRh
-IGR1cCBsZW5ndGggMiBzdWIKZ2V0IDEyNyBzdWJ9QiAvY2gtZHh7Y2gtZGF0YSBkdXAgbGVu
-Z3RoIDEgc3ViIGdldH1CIC9jaC1pbWFnZXtjaC1kYXRhCmR1cCB0eXBlIC9zdHJpbmd0eXBl
-IG5le2N0ciBnZXQgL2N0ciBjdHIgMSBhZGQgTn1pZn1CIC9pZCAwIE4gL3J3IDAgTgovcmMg
-MCBOIC9ncCAwIE4gL2NwIDAgTiAvRyAwIE4gL3NmIDAgTiAvQ2hhckJ1aWxkZXJ7c2F2ZSAz
-IDEgcm9sbCBTIGR1cAovYmFzZSBnZXQgMiBpbmRleCBnZXQgUyAvQml0TWFwcyBnZXQgUyBn
-ZXQgL2NoLWRhdGEgWCBwb3AgL2N0ciAwIE4gY2gtZHgKMCBjaC14b2ZmIGNoLXlvZmYgY2gt
-aGVpZ2h0IHN1YiBjaC14b2ZmIGNoLXdpZHRoIGFkZCBjaC15b2ZmCnNldGNhY2hlZGV2aWNl
-IGNoLXdpZHRoIGNoLWhlaWdodCB0cnVlWzEgMCAwIC0xIC0uMSBjaC14b2ZmIHN1YiBjaC15
-b2ZmCi4xIHN1Yl17Y2gtaW1hZ2V9aW1hZ2VtYXNrIHJlc3RvcmV9QiAvRHsvY2MgWCBkdXAg
-dHlwZSAvc3RyaW5ndHlwZSBuZXtdfQppZiBubiAvYmFzZSBnZXQgY2MgY3RyIHB1dCBubiAv
-Qml0TWFwcyBnZXQgUyBjdHIgUyBzZiAxIG5le2R1cCBkdXAKbGVuZ3RoIDEgc3ViIGR1cCAy
-IGluZGV4IFMgZ2V0IHNmIGRpdiBwdXR9aWYgcHV0IC9jdHIgY3RyIDEgYWRkIE59QiAvSXsK
-Y2MgMSBhZGQgRH1CIC9ib3B7dXNlcmRpY3QgL2JvcC1ob29rIGtub3due2JvcC1ob29rfWlm
-IC9TSSBzYXZlIE4gQHJpZ2luCjAgMCBtb3ZldG8gL1YgbWF0cml4IGN1cnJlbnRtYXRyaXgg
-ZHVwIDEgZ2V0IGR1cCBtdWwgZXhjaCAwIGdldCBkdXAgbXVsCmFkZCAuOTkgbHR7L1FWfXsv
-UlZ9aWZlbHNlIGxvYWQgZGVmIHBvcCBwb3B9TiAvZW9we1NJIHJlc3RvcmUgdXNlcmRpY3QK
-L2VvcC1ob29rIGtub3due2VvcC1ob29rfWlmIHNob3dwYWdlfU4gL0BzdGFydHt1c2VyZGlj
-dCAvc3RhcnQtaG9vawprbm93bntzdGFydC1ob29rfWlmIHBvcCAvVlJlc29sdXRpb24gWCAv
-UmVzb2x1dGlvbiBYIDEwMDAgZGl2IC9EVkltYWcgWAovSUUgMjU2IGFycmF5IE4gMCAxIDI1
-NXtJRSBTIDEgc3RyaW5nIGR1cCAwIDMgaW5kZXggcHV0IGN2biBwdXR9Zm9yCjY1NzgxLjc2
-IGRpdiAvdnNpemUgWCA2NTc4MS43NiBkaXYgL2hzaXplIFh9TiAvcHtzaG93fU4gL1JNYXRb
-MSAwIDAgLTEgMAowXU4gL0JEb3QgMjYwIHN0cmluZyBOIC9ydWxleCAwIE4gL3J1bGV5IDAg
-TiAvdnsvcnVsZXkgWCAvcnVsZXggWCBWfUIgL1YKe31CIC9SViBzdGF0dXNkaWN0IGJlZ2lu
-IC9wcm9kdWN0IHdoZXJle3BvcCBwcm9kdWN0IGR1cCBsZW5ndGggNyBnZXswIDcKZ2V0aW50
-ZXJ2YWwgZHVwKERpc3BsYXkpZXEgZXhjaCAwIDQgZ2V0aW50ZXJ2YWwoTmVYVCllcSBvcn17
-cG9wIGZhbHNlfQppZmVsc2V9e2ZhbHNlfWlmZWxzZSBlbmR7e2dzYXZlIFRSIC0uMSAuMSBU
-UiAxIDEgc2NhbGUgcnVsZXggcnVsZXkgZmFsc2UKUk1hdHtCRG90fWltYWdlbWFzayBncmVz
-dG9yZX19e3tnc2F2ZSBUUiAtLjEgLjEgVFIgcnVsZXggcnVsZXkgc2NhbGUgMSAxCmZhbHNl
-IFJNYXR7QkRvdH1pbWFnZW1hc2sgZ3Jlc3RvcmV9fWlmZWxzZSBCIC9RVntnc2F2ZSBuZXdw
-YXRoIHRyYW5zZm9ybQpyb3VuZCBleGNoIHJvdW5kIGV4Y2ggaXRyYW5zZm9ybSBtb3ZldG8g
-cnVsZXggMCBybGluZXRvIDAgcnVsZXkgbmVnCnJsaW5ldG8gcnVsZXggbmVnIDAgcmxpbmV0
-byBmaWxsIGdyZXN0b3JlfUIgL2F7bW92ZXRvfUIgL2RlbHRhIDAgTiAvdGFpbAp7ZHVwIC9k
-ZWx0YSBYIDAgcm1vdmV0b31CIC9Ne1MgcCBkZWx0YSBhZGQgdGFpbH1CIC9ie1MgcCB0YWls
-fUIgL2N7LTQgTX0KQiAvZHstMyBNfUIgL2V7LTIgTX1CIC9mey0xIE19QiAvZ3swIE19QiAv
-aHsxIE19QiAvaXsyIE19QiAvanszIE19QiAva3sKNCBNfUIgL3d7MCBybW92ZXRvfUIgL2x7
-cCAtNCB3fUIgL217cCAtMyB3fUIgL257cCAtMiB3fUIgL297cCAtMSB3fUIgL3F7CnAgMSB3
-fUIgL3J7cCAyIHd9QiAvc3twIDMgd31CIC90e3AgNCB3fUIgL3h7MCBTIHJtb3ZldG99QiAv
-eXszIDIgcm9sbCBwCmF9QiAvYm9zey9TUyBzYXZlIE59QiAvZW9ze1NTIHJlc3RvcmV9QiBl
-bmQKJSVFbmRQcm9jU2V0CiUlQmVnaW5Gb250OiBQYWxhdGluby1Cb2xkCiUgQEBwc2VuY29k
-aW5nZmlsZUB7CiUgICBhdXRob3IgPSAiUy4gUmFodHosIFAuIE1hY0theSwgQWxhbiBKZWZm
-cmV5LCBCLiBIb3JuLCBLLiBCZXJyeSIsCiUgICB2ZXJzaW9uID0gIjAuNiIsCiUgICBkYXRl
-ID0gIjIyIEp1bmUgMTk5NiIsCiUgICBmaWxlbmFtZSA9ICI4ci5lbmMiLAolICAgZW1haWwg
-PSAia2JAQG1haWwudHVnLm9yZyIsCiUgICBhZGRyZXNzID0gIjEzNSBDZW50ZXIgSGlsbCBS
-ZC4gLy8gUGx5bW91dGgsIE1BIDAyMzYwIiwKJSAgIGNvZGV0YWJsZSA9ICJJU08vQVNDSUki
-LAolICAgY2hlY2tzdW0gPSAiMTE5ICAgICA2NjIgICAgNDQyNCIsCiUgICBkb2NzdHJpbmcg
-PSAiRW5jb2RpbmcgZm9yIFRydWVUeXBlIG9yIFR5cGUgMSBmb250cyB0byBiZSB1c2VkIHdp
-dGggVGVYLiIKJSBAfQolIAolIElkZWEgaXMgdG8gaGF2ZSBhbGwgdGhlIGNoYXJhY3RlcnMg
-bm9ybWFsbHkgaW5jbHVkZWQgaW4gVHlwZSAxIGZvbnRzCiUgYXZhaWxhYmxlIGZvciB0eXBl
-c2V0dGluZy4gVGhpcyBpcyBlZmZlY3RpdmVseSB0aGUgY2hhcmFjdGVycyBpbiBBZG9iZQol
-IFN0YW5kYXJkIEVuY29kaW5nICsgSVNPIExhdGluIDEgKyBleHRyYSBjaGFyYWN0ZXJzIGZy
-b20gTHVjaWRhLgolIAolIENoYXJhY3RlciBjb2RlIGFzc2lnbm1lbnRzIHdlcmUgbWFkZSBh
-cyBmb2xsb3dzOgolIAolICgxKSB0aGUgV2luZG93cyBBTlNJIGNoYXJhY3RlcnMgYXJlIGFs
-bW9zdCBhbGwgaW4gdGhlaXIgV2luZG93cyBBTlNJCiUgcG9zaXRpb25zLCBiZWNhdXNlIHNv
-bWUgV2luZG93cyB1c2VycyBjYW5ub3QgZWFzaWx5IHJlZW5jb2RlIHRoZQolIGZvbnRzLCBh
-bmQgaXQgbWFrZXMgbm8gZGlmZmVyZW5jZSBvbiBvdGhlciBzeXN0ZW1zLiBUaGUgb25seSBX
-aW5kb3dzCiUgQU5TSSBjaGFyYWN0ZXJzIG5vdCBhdmFpbGFibGUgYXJlIHRob3NlIHRoYXQg
-bWFrZSBubyBzZW5zZSBmb3IKJSB0eXBlc2V0dGluZyAtLSBydWJvdXQgKDEyNyBkZWNpbWFs
-KSwgbm9icmVha3NwYWNlICgxNjApLCBzb2Z0aHlwaGVuCiUgKDE3MykuIHF1b3Rlc2luZ2xl
-IGFuZCBncmF2ZSBhcmUgbW92ZWQganVzdCBiZWNhdXNlIGl0J3Mgc3VjaCBhbgolIGlycml0
-YXRpb24gbm90IGhhdmluZyB0aGVtIGluIFRlWCBwb3NpdGlvbnMuCiUgCiUgKDIpIFJlbWFp
-bmluZyBjaGFyYWN0ZXJzIGFyZSBhc3NpZ25lZCBhcmJpdHJhcmlseSB0byB0aGUgbG93ZXIg
-cGFydAolIG9mIHRoZSByYW5nZSwgYXZvaWRpbmcgMCwgMTAgYW5kIDEzIGluIGNhc2Ugd2Ug
-bWVldCBkdW1iIHNvZnR3YXJlLgolIAolICgzKSBZJlkgTHVjaWRhIEJyaWdodCBpbmNsdWRl
-cyBzb21lIGV4dHJhIHRleHQgY2hhcmFjdGVyczsgaW4gdGhlCiUgaG9wZXMgdGhhdCBvdGhl
-ciBQb3N0U2NyaXB0IGZvbnRzLCBwZXJoYXBzIGNyZWF0ZWQgZm9yIHB1YmxpYwolIGNvbnN1
-bXB0aW9uLCB3aWxsIGluY2x1ZGUgdGhlbSwgdGhleSBhcmUgaW5jbHVkZWQgc3RhcnRpbmcg
-YXQgMHgxMi4KJSAKJSAoNCkgUmVtYWluaW5nIHBvc2l0aW9ucyBsZWZ0IHVuZGVmaW5lZCBh
-cmUgZm9yIHVzZSBpbiAoaG9wZWZ1bGx5KQolIHVwd2FyZC1jb21wYXRpYmxlIHJldmlzaW9u
-cywgaWYgc29tZWRheSBtb3JlIGNoYXJhY3RlcnMgYXJlIGdlbmVyYWxseQolIGF2YWlsYWJs
-ZS4KJSAKJSAoNSkgaHlwaGVuIGFwcGVhcnMgdHdpY2UgZm9yIGNvbXBhdGliaWxpdHkgd2l0
-aCBib3RoIEFTQ0lJIGFuZCBXaW5kb3dzLgolIAovVGVYQmFzZTFFbmNvZGluZyBbCiUgMHgw
-MCAoZW5jb2RlZCBjaGFyYWN0ZXJzIGZyb20gQWRvYmUgU3RhbmRhcmQgbm90IGluIFdpbmRv
-d3MgMy4xKQogIC8ubm90ZGVmIC9kb3RhY2NlbnQgL2ZpIC9mbAogIC9mcmFjdGlvbiAvaHVu
-Z2FydW1sYXV0IC9Mc2xhc2ggL2xzbGFzaAogIC9vZ29uZWsgL3JpbmcgLy5ub3RkZWYKICAv
-YnJldmUgL21pbnVzIC8ubm90ZGVmIAolIFRoZXNlIGFyZSB0aGUgb25seSB0d28gcmVtYWlu
-aW5nIHVuZW5jb2RlZCBjaGFyYWN0ZXJzLCBzbyBtYXkgYXMKJSB3ZWxsIGluY2x1ZGUgdGhl
-bS4KICAvWmNhcm9uIC96Y2Fyb24gCiUgMHgxMAogL2Nhcm9uIC9kb3RsZXNzaSAKJSAodW51
-c3VhbCBUZVggY2hhcmFjdGVycyBhdmFpbGFibGUgaW4sIGUuZy4sIEx1Y2lkYSBCcmlnaHQp
-CiAvZG90bGVzc2ogL2ZmIC9mZmkgL2ZmbCAKIC8ubm90ZGVmIC8ubm90ZGVmIC8ubm90ZGVm
-IC8ubm90ZGVmCiAvLm5vdGRlZiAvLm5vdGRlZiAvLm5vdGRlZiAvLm5vdGRlZgogJSB2ZXJ5
-IGNvbnRlbnRpb3VzOyBpdCdzIHNvIHBhaW5mdWwgbm90IGhhdmluZyBxdW90ZWxlZnQgYW5k
-IHF1b3RlcmlnaHQKICUgYXQgOTYgYW5kIDE0NSB0aGF0IHdlIG1vdmUgdGhlIHRoaW5ncyBu
-b3JtYWxseSBmb3VuZCB0aGVyZSBkb3duIHRvIGhlcmUuCiAvZ3JhdmUgL3F1b3Rlc2luZ2xl
-IAolIDB4MjAgKEFTQ0lJIGJlZ2lucykKIC9zcGFjZSAvZXhjbGFtIC9xdW90ZWRibCAvbnVt
-YmVyc2lnbgogL2RvbGxhciAvcGVyY2VudCAvYW1wZXJzYW5kIC9xdW90ZXJpZ2h0CiAvcGFy
-ZW5sZWZ0IC9wYXJlbnJpZ2h0IC9hc3RlcmlzayAvcGx1cyAvY29tbWEgL2h5cGhlbiAvcGVy
-aW9kIC9zbGFzaAolIDB4MzAKIC96ZXJvIC9vbmUgL3R3byAvdGhyZWUgL2ZvdXIgL2ZpdmUg
-L3NpeCAvc2V2ZW4KIC9laWdodCAvbmluZSAvY29sb24gL3NlbWljb2xvbiAvbGVzcyAvZXF1
-YWwgL2dyZWF0ZXIgL3F1ZXN0aW9uCiUgMHg0MAogL2F0IC9BIC9CIC9DIC9EIC9FIC9GIC9H
-IC9IIC9JIC9KIC9LIC9MIC9NIC9OIC9PCiUgMHg1MAogL1AgL1EgL1IgL1MgL1QgL1UgL1Yg
-L1cKIC9YIC9ZIC9aIC9icmFja2V0bGVmdCAvYmFja3NsYXNoIC9icmFja2V0cmlnaHQgL2Fz
-Y2lpY2lyY3VtIC91bmRlcnNjb3JlCiUgMHg2MAogL3F1b3RlbGVmdCAvYSAvYiAvYyAvZCAv
-ZSAvZiAvZyAvaCAvaSAvaiAvayAvbCAvbSAvbiAvbwolIDB4NzAKIC9wIC9xIC9yIC9zIC90
-IC91IC92IC93CiAveCAveSAveiAvYnJhY2VsZWZ0IC9iYXIgL2JyYWNlcmlnaHQgL2FzY2lp
-dGlsZGUKIC8ubm90ZGVmICUgcnVib3V0OyBBU0NJSSBlbmRzCiUgMHg4MAogLy5ub3RkZWYg
-Ly5ub3RkZWYgL3F1b3Rlc2luZ2xiYXNlIC9mbG9yaW4KIC9xdW90ZWRibGJhc2UgL2VsbGlw
-c2lzIC9kYWdnZXIgL2RhZ2dlcmRibAogL2NpcmN1bWZsZXggL3BlcnRob3VzYW5kIC9TY2Fy
-b24gL2d1aWxzaW5nbGxlZnQKIC9PRSAvLm5vdGRlZiAvLm5vdGRlZiAvLm5vdGRlZgolIDB4
-OTAKIC8ubm90ZGVmIC8ubm90ZGVmIC8ubm90ZGVmIC9xdW90ZWRibGxlZnQKIC9xdW90ZWRi
-bHJpZ2h0IC9idWxsZXQgL2VuZGFzaCAvZW1kYXNoCiAvdGlsZGUgL3RyYWRlbWFyayAvc2Nh
-cm9uIC9ndWlsc2luZ2xyaWdodAogL29lIC8ubm90ZGVmIC8ubm90ZGVmIC9ZZGllcmVzaXMK
-JSAweEEwCiAvLm5vdGRlZiAlIG5vYnJlYWtzcGFjZQogL2V4Y2xhbWRvd24gL2NlbnQgL3N0
-ZXJsaW5nCiAvY3VycmVuY3kgL3llbiAvYnJva2VuYmFyIC9zZWN0aW9uCiAvZGllcmVzaXMg
-L2NvcHlyaWdodCAvb3JkZmVtaW5pbmUgL2d1aWxsZW1vdGxlZnQKIC9sb2dpY2Fsbm90CiAv
-aHlwaGVuICUgWSZZIChhbHNvIGF0IDQ1KTsgV2luZG93cycgc29mdGh5cGhlbgogL3JlZ2lz
-dGVyZWQKIC9tYWNyb24KJSAweEQwCiAvZGVncmVlIC9wbHVzbWludXMgL3R3b3N1cGVyaW9y
-IC90aHJlZXN1cGVyaW9yCiAvYWN1dGUgL211IC9wYXJhZ3JhcGggL3BlcmlvZGNlbnRlcmVk
-CiAvY2VkaWxsYSAvb25lc3VwZXJpb3IgL29yZG1hc2N1bGluZSAvZ3VpbGxlbW90cmlnaHQK
-IC9vbmVxdWFydGVyIC9vbmVoYWxmIC90aHJlZXF1YXJ0ZXJzIC9xdWVzdGlvbmRvd24KJSAw
-eEMwCiAvQWdyYXZlIC9BYWN1dGUgL0FjaXJjdW1mbGV4IC9BdGlsZGUgL0FkaWVyZXNpcyAv
-QXJpbmcgL0FFIC9DY2VkaWxsYQogL0VncmF2ZSAvRWFjdXRlIC9FY2lyY3VtZmxleCAvRWRp
-ZXJlc2lzCiAvSWdyYXZlIC9JYWN1dGUgL0ljaXJjdW1mbGV4IC9JZGllcmVzaXMKJSAweEQw
-CiAvRXRoIC9OdGlsZGUgL09ncmF2ZSAvT2FjdXRlCiAvT2NpcmN1bWZsZXggL090aWxkZSAv
-T2RpZXJlc2lzIC9tdWx0aXBseQogL09zbGFzaCAvVWdyYXZlIC9VYWN1dGUgL1VjaXJjdW1m
-bGV4CiAvVWRpZXJlc2lzIC9ZYWN1dGUgL1Rob3JuIC9nZXJtYW5kYmxzCiUgMHhFMAogL2Fn
-cmF2ZSAvYWFjdXRlIC9hY2lyY3VtZmxleCAvYXRpbGRlCiAvYWRpZXJlc2lzIC9hcmluZyAv
-YWUgL2NjZWRpbGxhCiAvZWdyYXZlIC9lYWN1dGUgL2VjaXJjdW1mbGV4IC9lZGllcmVzaXMK
-IC9pZ3JhdmUgL2lhY3V0ZSAvaWNpcmN1bWZsZXggL2lkaWVyZXNpcwolIDB4RjAKIC9ldGgg
-L250aWxkZSAvb2dyYXZlIC9vYWN1dGUKIC9vY2lyY3VtZmxleCAvb3RpbGRlIC9vZGllcmVz
-aXMgL2RpdmlkZQogL29zbGFzaCAvdWdyYXZlIC91YWN1dGUgL3VjaXJjdW1mbGV4CiAvdWRp
-ZXJlc2lzIC95YWN1dGUgL3Rob3JuIC95ZGllcmVzaXMKXSBkZWYKJSVFbmRGb250CiUlQmVn
-aW5Qcm9jU2V0OiBzdG9uZXNiLnBmYQoxMSBkaWN0IGJlZ2luCi9Gb250SW5mbyAxMCBkaWN0
-IGR1cCBiZWdpbgovdmVyc2lvbiAoMDAxLjAwMikgcmVhZG9ubHkgZGVmCi9Ob3RpY2UgKENv
-cHlyaWdodCAoYykgMTk4NywgMTk5MCwgMTk5MiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRl
-ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuSVRDIFN0b25lIGlzIGEgcmVnaXN0ZXJlZCB0cmFk
-ZW1hcmsgb2YgSW50ZXJuYXRpb25hbCBUeXBlZmFjZSBDb3Jwb3JhdGlvbi4pIHJlYWRvbmx5
-IGRlZgovRnVsbE5hbWUgKElUQyBTdG9uZSBTYW5zIEJvbGQpIHJlYWRvbmx5IGRlZgovRmFt
-aWx5TmFtZSAoSVRDIFN0b25lIFNhbnMpIHJlYWRvbmx5IGRlZgovV2VpZ2h0IChCb2xkKSBy
-ZWFkb25seSBkZWYKL2lzRml4ZWRQaXRjaCBmYWxzZSBkZWYKL0l0YWxpY0FuZ2xlIDAgZGVm
-Ci9VbmRlcmxpbmVQb3NpdGlvbiAtMTAwIGRlZgovVW5kZXJsaW5lVGhpY2tuZXNzIDUwIGRl
-ZgplbmQgcmVhZG9ubHkgZGVmCi9Gb250TmFtZSAvU3RvbmVTYW5zLUJvbGQgZGVmCi9FbmNv
-ZGluZyBTdGFuZGFyZEVuY29kaW5nIGRlZgovUGFpbnRUeXBlIDAgZGVmCi9Gb250VHlwZSAx
-IGRlZgovRm9udE1hdHJpeCBbMC4wMDEgMCAwIDAuMDAxIDAgMF0gcmVhZG9ubHkgZGVmCi9V
-bmlxdWVJRCAzODc4MiBkZWYKL0ZvbnRCQm94ey0xNTggLTI1MCAxNTQwIDk0Nn1yZWFkb25s
-eSBkZWYKY3VycmVudGRpY3QgZW5kCmN1cnJlbnRmaWxlIGVleGVjCjQwNTE0OUI1NzNBRUM5
-Mzc4QkFFNDY2ODVBQUY3ODQ5RTVDOUE1QzhDODc2NzQ4NzI1NTg5RkIxNEEwNDk4MDhEMzlB
-NzVENTVGNjQ2NAoxMUE5QzM1MjZGMTg4N0FBMkJBRTUzRUU0QkE2Mzc3Q0IwOTQwOThCQjI1
-OTA4MjhEQjk2RkZEM0EyODk1Nzk1MjREQkJDNzlEOTU5N0QKNDdBNzkxOTJFMDFDMzYwRjA2
-QjkzQkZGODlBM0M2NDJCQzQxMDMzN0Q3NDM0OTlBN0Y4QjFFNDc2RkExQkRCMEIxOThGNjdD
-QUUzRjU3CjQ5QTFBQ0M0ODc5RjZFQkNEODQ3NDBENjJDNTI0ODU5NUI1MzBFNkMzRDNDREMz
-QUY1NDM2OUVBRkRFRENEOTg0OEUyRDM4Q0QwOTFCRgoyQUNBRDEwREYxQzg3ODcyQUFCRDA4
-NkQ2MDQ3NUVENjA0NkUyNDBGMjIzMkZFMkYwMDI1OTIyNTkzMTUxOEI3QjQyOTEzN0IxNDM4
-NEQKMTVGNTgyNDY3QTgxOEMyMEMxQzYzMTZDNTY3MzZDMTlGMUQ3NDY0MjMxRDY5ODAwRDk0
-Q0Y1MDEzREMyMzdEQTFFQzE2RkQ2M0QzMTU0CjRGQURGODNGMTUyRDE0OTZFM0UxQjUwRTY1
-N0Q1MTk1MkE2NURBMjIyNEFFM0MyOTBBOTQ4MjI2RjAwNUMzN0FCQTJGNkNBQTczMjM2Nwo5
-RDAzQTFGOTI0QTMzMkZDRjcxM0MzQUZGNjg1RENEMTRGOTUwQTlGNTBGNDY5Mzk3NTlGOTE1
-Rjc4MEY2OEVCMUU4QTJBNkREMzcwREQKREVGNUE1MTY1MkNEMEM1REVDQkNDOTQzOTY5NjI5
-MDRCMTkwNjlBQ0FCMjI3QjZENEQxNDg1MkE2NTM2MkQyQkZFM0IzOTM2RDhBQjNGCjIzMThB
-OTlBNDY5MTNEODY4RURGMTk4NEY4Njg3ODVFM0IxMTA3NjQzQkM0RTU4MjA2RThFNUU3MUU1
-RTEzQTgyMkEyODlBN0M3NTU5RQowN0JCRDg4MjI4NDdDNTZFQzBEREIxMjIwMjYzM0NBQ0E5
-OTBCNTg0NEI1MjUzRUJGNzIxOEMyQzQ5MTIxMUQxODc5QTRGMzZCQUQ5QjYKOTM1M0Q2MzY1
-MDZDNTJGMjQ4MThFNDQ2NEUwMkM0MUFBQTE3QUY3QkYwOUZCQzM3QzMzNUE3QkNBNDA0ODFD
-MTM3MTgyOEQ0QURFNjMwCjhERjA5REMwOEM2NDEzNzcyOTVDRDc1NDg1REMxNDczMjgxOUMy
-REIyMUNDNDk5NzMzRkVDQUUxQ0E5NDkwN0ExRjE0NEYwRUI5QkZDMgo5OEU0NzFBRjMwNEJD
-MzYyOENEMzkwMjAyRkZGNTlBN0JEMTREOUY5Q0M5OTM2ODgyNkRFNjQ0NkNENDBBNjhBREVE
-QkJFOEMzODg3OTgKMEZFNTc0NDQ4QjE5NkU5ODdDMkEzOTJEQTg2NURBNDZFNjUyQUFDOEY5
-QTQ4MjZENUFEMTc3NkZFMkU1RDJERUVGQTAxMTUwN0JFOTM1CjlFMTlFMkFGMzQ2NDMxMzU2
-OTFFM0EyMjFCNEIwQUIwRDE4REMzOTkzRjY0NjU0ODlDRTVFRkEwRDJGRUMwODc4ODE5MjdB
-NDM0RTUxRgo5OTY4M0FBMDQ2MzY5N0JCOTYxNEI2Q0Y1MjQ3MzMwQkI3MzkzRjgzNkE3ODlB
-Mzc3NDYyOUIyN0UxRjgyQUU0QzAxRURCRTk1QzIzN0EKMEVBQzc4QTVBN0ZGQ0MyMzMyRENE
-QjcyNUJERTkxMDFBOURFNTNBNkNDQTY0QTk4NDI5NDcxQkE4MDE4QTNFM0MyRDI4N0I2MzE2
-RkJGCjA4QzNEMkJCNUE2MTFEMUJFODQ2QjE3QzJGMENBQUUyOTU1QkJBN0VFNEQ4NERCRkE2
-QkI1RDU0QjVEOTBFMjNDMjFEMzQ1NjIxNDREQQo0RjVBNDlFNjY2QzFFNkY3RjE4QjJCMzNC
-MkJDNEE3RkU3MjI0NDBEMjcyQ0U1MzM1NEIzOTQ0MkYzQkM4OUU1RjkzOUI3MTc1NDQ4RjAK
-MDJENkE2MEJDMjk3Qzc3MDc0NTIyMkZEQUNDOUQ0NTZCNEY4NjlFN0JENEU4MDJDMDFENTE3
-QUQ3NTJCQTUzM0RGMUVDRjRGOUE2Q0YwCkRFODMwNkM1NUE5MDQwNUYyM0QxODM0RDc2RDJC
-NDQ1MkU0NTA0QUE5NTNBOEI0RERBNEYwQzk2NzMyOUQ5MjJBNjg2MTVCMUI3MUY3MwpFOEJC
-NjgyRUNCRTNDNzQxN0EyMThEQzM4NkIwMDk1QjM4NTc1RUJCQTU1NTgxRjc2OEJBNUQ1RjIw
-M0E3NjI1RkU3ODg1N0VGMkI5MTkKQkFFNERFMDExNjUwNkZFMkM0NzZBNjQyMzQxNEZFRjU4
-MzNERkUwMEQzRUFENkM2QjVGMzE2MjVDRDc2RkIwQTQ5RDA0QzFERDg1QTdFCjY5MkJFQ0Uw
-Q0MzMkM5QThDMDRBQzIwOUI1RDFENzdCN0JEMjEzQjcxODU1RkJFODFGNzU3RjQ2MTI3RTcy
-NTM4MjNFNzMyQTYwOURDRgoxNkM3OTQxMkQxRjBBMTUxNzI4OEE4MUI0MjE2NUI0N0RBNjZF
-Q0E1RThFMUY2QTM5QTQ3NDQ4NkEzRDRCNjY5QkM2NUNGNjMxMzZBQzkKMjQzRTdBNDkyQ0ZF
-MjIyQ0I0RjU1QzJFRDRCQUE3NTU2REVEQUQ0MjVCRDcwNkFFRUQ4OTVFQUM3NjcwNEFGNjM2
-NjI5NUVGQjRBOTFCCjU0OEMyMTc2RDRBMzBCMTAyNjQ4OUU3MEQ4RDk4MUQxMTBERTQ2RTBE
-NURGM0EyODcwNTkyMjAxNDJEQjAxMDAwOTJGQkQ5RTE2NDg0Qgo3Q0RGQkFDMkI1OTVGRDM1
-MzU5RDY1RDUzNTFENUFBMUFGOEVFOTRFNkEyNTlBNTY4RjNENjIxOUYyNTM4RUI5RTMxRTg4
-RDJBN0Q4QjIKMTVGODhDNTgxQUZBQUFFNjdBRjU4NzM0M0FCNkFCMzYzNkFFNTE5Q0FCMDBD
-RDBBNzlFQUU0REJDQjU2RTc2RTQ2RjE0REQ3RjAzNzU5CkQxMEE0Rjc4QkM3MTRCNjBFM0ND
-NTZCQzA0QzRGRTY4QzU1NDlCQzFBNDU3N0YyQUY1NzhGMTQ0MUVFRTkxNzhFNjc4OENFMDNF
-RTE2Qwo4QzNFODBERUUzRjBEMDE2QUMwOUIwQjYyQjQ2RUJFNTQ3RjBDMTA0NjZFOEJDOUMz
-QUMyMzVGOTFGNTk5QjI0NEY4REFDM0I5RkE2NjEKOEEwOUQ5QTYyRTlFOTA0Q0NFMzNCQjFE
-QTFGNkZDODFFMUY5N0ExQzU2QTIxMDdGNzIxRjgzNzE4MERGMjRGRjExMEM3QUVENjI4RTdE
-CjBCNDY1RDUwNjRBNkRCMEUxNzhDNDAwQjY1RTIzOTUxRTc1NjJBOEM4OTBCQUIwNzc0QzJB
-Q0NFRDA3RTQ4N0Q1NEU2ODhFNUFGMzU0Ngo2NjFCMTMzMzZFQjFBNEVGNDg0QkZFNENBQjYx
-QkZBNDdCN0YyMzJENDZFRkFGNTBENUUzMUE4MzA1RUY3MjdEQjA5MUFCMEI5MzQzMEUKNjFG
-QjkzOEY3MjEzOTBFRTI3MUQyQkE1RDhCMzNCQUZENUNCM0YyNEM3QTRBREVGRjZDMEU0MkQ5
-M0UxQjlEQUJEMjVGODkxODExQTA5CjQ1N0JDOTRFMTNGMUI3MUY2Mjg5Njk2Nzk3NDBEOTFD
-MTk3MTU5OEExRDRDMjQ4Rjg0MEJCRUYyQkNGNzRGQjFFQUM2RDNENTgzMDZERAo2MDdDQUVC
-MThBOEIxOUVCNzc1QkNCQzY2MDJERUQ2REMyNzNENEEwMTkwRUY4RDMwRTA1Njc1QkM3QjNF
-RTFGNkQ1ODQzMTFDNjgxRjAKQzlCN0Q2MEQyNUJFQ0MzQ0E3QkM4M0IxN0U3RDQyODMyRDky
-Q0I2NjM0NTY2OEY0NTVGODZBMzlENTk1MzRCODQ5NjdENTU0MkQyODhCCjAwMThGQTE4M0E0
-MjcxMTUwRjU0OUQwNTMyRTY5MkMzMTA3N0FDRDhGOTA1MjkzQ0MxNkM5OTAxREVBQUU2QjMy
-NjY4MEE1OTQ5MzcwNwo4OTUyNjRGODgxRDY5M0JCQ0E5NTVBNkYwM0I1OEFFMEQ4MTU0MEUy
-NkJDOUEyMTA0RDRBQjIwQzVDRDFENEZBM0RCMDlBMzgyNDY0MjUKRTVCMUZFMUVGQkU2QzMy
-QUY2MDlFQkU3MUNBNURFNEUyNEQ4Q0RDQUYxQzNDODQzNTkxMjZEQUE2QUQwMDk4QkY3NDI4
-NDQ1NTk0M0Y1CjExNTM2MDc5OUYxMEJERDY1N0QwMEZGQkMyMDM5ODE2Nzg1QUQ2RTVFRkE4
-NDQ0RjNBRUFBOERCNTJFMkYzQ0JFQTgxNUM0RUMwOTA3NgoxRDAzRTg3NDAxMzE3QTEyNTY3
-REEzNUE5REVEOTU5NzQ2RkQ1NjEzRTFENzQ5N0QwNEY4MENBQTM0NjNEM0YzRUI3OTEyQ0NC
-NkVGODcKOEI0ODc0ODVBMjc1RDE1NEUyNTQ5RjNDNDI0QTczMEY2NkY2NkFDOUU2RkFFMDk5
-RTcxNTA0QUQ1Qjc2QjRGOTdDN0JFMTVENzBFNEE0CjNDQjAxRTA5Q0Q0N0Y0MUJGMDQ3NzU3
-NDM2Qzg4NkEzNkI5QzVGMkM1MUIxNjFBMzk3REZDNTQ5NEMyRUNCNUE0Q0NDQzA3NURCRTJE
-MgpFMzdCMjJGMTRDMzY2NTE4MjIwMDgzMEY2Nzk2QzFDOTg0MUYyNDQ1MzI4NjUxNUUzRjZC
-NzAxRUY4QzBCRTY1QjgzMDVBM0QyQTA1MjIKQ0E1QTMwQ0ZFNUNCRkM1MEE5QjZFN0QzOTI1
-RTUzMkFCNUE1OEQ0QzZDRUE1RkFFMUMxRUVEMkUzOUM4MTVFNjRCQ0M5NkRFMkFGODVFCkY1
-QkMxODMxRURBM0IxQkE1NDFCN0RCNUVERjZFMDQyMjQ2QTg1MzQzNTNCMjBFOTlBMEFEREI0
-NkIzMkFGMTFERURDMkZFMUIzMjI2MwpGMDU0RTc1MkY2ODQyN0Y1QTFCNzFFRDk1M0ZDMjcy
-RkRERUE1NTUwNkNDOEZERThGMzVDNjE5RTM3Mjk2MDQ4MDI0RkE2MzAzQTlGRkUKNkM5QkUz
-RURFNEJFNTc5NEFEMUE4RTc2MUIzQ0RGMTM3QzdBMjlDNjREMEQ4RUUxQ0YwNzFGOTA5NkRF
-RTg0M0VENDBGMUQ0QTU0M0E4CkNFMjhGNzA0M0QzOEE3NEU5MjlFQUVBQjZCQTk1Q0REMTdF
-NTFCREQ3NzY5MUYwODQ2RjlFRUU0OENENUNBRjkwNUNFMDgxNEYzQzdERgpBMTdGNDMwMzg0
-Q0YxQjIwMDRGMzFFMDc5NzVDRTRBNkJDODhDQUQwQTgwNUNGODlEMTY3QkREMTVDOUYwRjg0
-NDIxNjZERTNERkE2ODcKNUZDMDhBMzVEMjIxQTE1MTY5OEI4MDNCRDY3MDY0NTcxQUU1N0I2
-Nzc5N0I1RjA2MThCNkI4RjNEMTQ4MjlCODdBREE3ODM4RDY1QkNFCkQ1MjdDRTJGRjk5ODQ1
-NTVCOEE2QjkxNUE2ODI2M0U2NDE0MTQwOEZDQjdCQkYxRkY3QjhDMDQzNzA1QTg4MDNBREI4
-NDM5N0I4NjFCRAo2NEEzQTdCQTc4MUM0NEM4NDdBNjhGMUE5RThGRjZFRDdCRTg4MUIwOEM4
-RUQzQTJCQUZBQjkxOUQ3RDM2RDM2NzcyREFBRjgxMkE3NEEKRUMzNjhFQTYyMkRCNjkwM0NC
-QTMxMzRFNzU1QzYzQjAwMjBFRTcyRUE2OTlBMzk3NUJBNEIxQ0Y3MDMwRTY2QjM2QkRFOEE2
-NkJEMEIyCjcwQzdBMkVDMDg0QjgzODNEMDIzMjY5QjkzMUI5Q0EwMzZGQ0EzNjJBOURBNkRD
-OUREREZDMTFGNzE1QjFGMkE2MDA5OEM1NkI2QjY4RAo1MkJBRjMzQkYwQUVFMkQ4NTUxRjBD
-ODgwOTM0Mjg5NEY2MEQzNDkwRDlEQUQxMzE3QUIyRjcwRTMxMzkyNEU5RDY4MEM2MTBENDFD
-QzMKMTkyNEUxNDU4QUQyMjBGRkUwQjM4NDQwNERGM0FBNjdFNzMwNUEwODM2QzVDMTk1NTEz
-RUMzRDA2ODZCMzY4QTY1REQzREU5QUVGNUQ0CkVBMjgzNzZCNEFDQzFEMDBFQjM4RjZENEVF
-RDdFMDI1RUUxN0ExRDE1N0MxRTcxODc5REUxNkJGNDZENThFMUJCNDZCMkNGOUNCQTA4MgpD
-MEE5NDU2N0E1Qzg3NEU4RTY0NzdBM0NEMEQ2RTQ4RjhDRDRFNEFDMzczMEUzM0VDODA3OUI0
-Q0NFMEVCRERBNUU0OEVEMTM2MjZGOTAKODg4QTI4OTI0NDhERDA3NUVBM0E4NDZEMUM4RTZF
-M0YwRkYwM0I4RDYzRDA0QUVERkM2NTk4NDBBOTQ5Mjc1Mzk0RUIyMUI4NUU1NDRDCjI4QkYw
-QzJBQjcxMTNFQkU0QThBM0QwNTc5RUY0OEMxNUQ5RDgyQTA5RTk2MzQ3NDIyMDczQTQ1RTMx
-OTc0OTBENTlGRTVFOTgxODY5NwowNjVBNDE5RTk1NzY4REFGNzY4RTFEOTM4NDE0RUNERTUx
-NTkyODFGNEJCMzVFRUQ4RDY1RDM2NTE5MDYyMTdGRkMwOEFGQkIwNzU0NzQKRDBGNkI3NTE5
-Q0UzNjY4MDkwQjExNUEzNTBEQzNFOTBEQjM1MEEyOTA4MjI0MDVDN0FENjcxM0YzQkMyOUZF
-RTBBNEUzMkY5Qzg1RkRCCjIzMkE0NThGNTVEQjFDQTMzNUZDOTRBNDcyQzM5MEEzMjI0MjJD
-QUQ2MDk0NDNGNTY0NUU2QzQ1MjM4NTcwQjY4OUE3QUIzMDdCNjNEQgpCNTk4RkNGMkVCMkE3
-MEY2QzRDOUNCNURDMzA3NjkzOEM0RDJDNDAwOTMwREMyNjI1Mjg1RUI0NDgzMjk0NTA5QTRC
-MDE4MDAyQjgyNjEKQUVGNTcxQjA2RDhFOUJEODZFOEFBNDBDRkVEOEU5MkQwNTVEMUY2NTNG
-RjY4RjJFREY5NDYzNzk2QjA3MEEyQjM2NkJBMjc0QTA3Q0E4CjI4M0IzMENGNzkyMzFDRERF
-NEEyOTQ5RjQ3RDhDMThDMTU4MzY3M0ZCQzVBRTE4RTBBNTREMzJCMDk1MzIyQ0ZGNURGMzgz
-MUY5MTA2OApFOURDNzEzRUYxQjI4MEQ0MUM0QkJFRkIyNjA5NUZDRDU3QTVGRjc0NUUwQTI0
-QzAzN0I4MDkzRkZGMkUxMERBN0Y2RjZBNDgxMjYwRDMKMjM3MTU4Q0U1MDYxOEE4QkRCMUNF
-MUNGNTU1MUI0NTk4OTE3RTRENDAxMzdFNjc5OTNEOTZENzVENkMzODUwRDkyRDUzNzM1NDFE
-N0U2CjVFN0NDQTE0NzhBNUYzRDExN0FCOEVGMkY4MEYwMjQ4OUU3RDk4OTlBNDZCNEIxQzMw
-RTYxRDY1N0FFRDg0OEExNDREQzI0RjExQTFGNwoxODIwMjAyOUM4MTkyNkFBNzZEOUY3RTRC
-OENERTM4ODQ4RTcwMkVDNjg0MTExNUEwRjU4NTMzNEY0MjQ0NUFFQUFFNzg3QkYyNzJBMjYK
-MzU5NEU0RjYyMzU4RTdFREFBQUE2MzAyOERFNzg4NzI0RUUwNEQxNzUxQTU5QkQ5NUQ5REMy
-RjJFREYwMjU2Q0I0NEVEM0UyMjEwQTlCCkFGRTgyODMzOTI2RUQ2REFCQTYwMTQxRDc0MERC
-MDMxOEZERDlBN0QzQjRDRUM4RjJDOTVFM0ZBNkVGNjAxMzczN0YwQjFENDhEMjRENgpGRTM4
-OUMyRUY1QkQxMkFEOEM2RDJBQkFGOTAxNkVGQzdERThEQkRBNkZEQTIxNzI3RUY4RTAwN0Ix
-NTVEMzExRDdCMjc5NzU3MTY3RjQKRDFCMjQ3MzUzNEMyNDA4RTQwMkFBMDUwNEY4NTNBQ0JC
-QjVDRURFMjA4MTM3RjJEQTZDMjEyMzBGRTI3MTVDNDVFRjAwM0FBOTAxM0Y4CjU0QTU1MzRG
-M0FEM0Y4RkYwNTUwQkFEMzcxNjQ0OURGQjNBNkE0RjQ2MEM3MkVGRTNFQzVBQTIyMEU5MDJD
-M0M5RjA2MkU4RUI0MTA2OQo1QjNENjAyNTQ1QkJDMjRENjE2RjA5NzVCMTZFOEM3RDM0MTVG
-NzkyNTU1MzY3NzA0QjkyQ0VDOUJGRDZBODUxQzgxRjVEOTcxNEFGOEIKRTZGOEM5OTJBQjFD
-MTNENTFGNDZDNUUzMkY3OTczMUVBMzJEOUM1MjZEMkFBQTBBMTU4NDY5MkEwMjRFMEY4NUJG
-OUUxMzgzQ0RBMUM4CkZDNkJFMzZDQTNDMTJFNEZGMzRGMTFCQTYyRDk1OTZCMzk4MzZFQjU5
-QjYxQkM1RjVEQTk3RDgwMzIxNUJBMUQ0MzQzMzM3RkJCNUQ3MgowQ0RFQTA4MUVDNDAzMjlG
-RjMxMDU3QkVBNzY5OEFFNERFMUYwQjc1RDREOTAyN0Y3NDFGNTg3QjRCNTI0RUIxMjI4N0RG
-RDBCOTBBQzQKQkVCMjc1MzhBNzg1NUI3OTY2NTc2QjY4RjE2ODJCOTkwQ0I1RkY0QkEyOTRG
-Mjc4REM5ODk1NkM1OEZBQ0NCQUYzODNCNzA4RkU0NjY2CjUyNzYxRTk0QkIzRTVFNjVDN0U5
-MDQ2NDNENTRDNjg5MjBDMEIxMDcyQjc5MEFFRjk5MjI5RDFGNzc0NUNCNDAzRjA3QzAyM0ZB
-NkEzMApFMEEwMEQ0QURFNzA1MUE4QjU5QURCMjlENDQxMzBBQjAzQjdGQjMwMzY1MEU5RUY1
-NUM0OTk3OEE5NEE1ODM5NzRCNkI5MUEwQTQwNjUKQjQ3REJBMzRCQ0VEQTE5RDQ0QTNGRDgz
-RTdGRDIzQ0JFQjZEMTY5OTAyM0I3MDRCOEMwRTJGQTgwMUNFMTVBOThFQ0RCQjA0OThCQkEy
-CjIzQjQ0NEMwQTc1RTBFNEREOTk1RDQwQUE0RjlGMDNDMEFGODVCQzU3NDIxODJENjI4QjND
-MEQxRjc2QTFBOUM3RTAyQ0IyMjk1Q0YyNgpBMkY3Mzc2MEJDNDcyRTIyNzhDQUU1NEQ5NzYy
-RkEyN0E5MjQ2OTY1MzI2QTBDREJDQUU5OTc2MDhEMEExRDUzMjZFNzhCNjc4MEUxNUIKQUU2
-ODg4Mjc2NjVERDc4NkU2Mjc1OTY5NDQ4RTMwMzAxMjQ4NkJDQkU0MTMwRDg0OEI0NjY2NkQ2
-NjBEMDc5MzU1OUFFM0U5ODREREQxCjA0QzRENTZBMDY2Nzg3QjRBQTRFMURFODE4M0IwNzhB
-OERFNDJGMDY2M0QzM0QzNUJBQ0IxOUEyRDgyQTYyQzUyQkU2RDNDNkVBNkM1RQozREM5QzQ5
-QkI3NEZCMUU0MzA2MjlGNDM3REZFNjdEQjREQUM3MzU5MDI1ODg3M0I2RDgwOEU4REFENEZG
-RkU2NjBGMDlENTIwN0FBN0QKN0Y0NUVFREU2RUNDMzJFQThGOEJBQTA3NUVGMjM2QzcyRjk3
-NTlGNDRGNTlGREI0NzhFQjgxODc2OEVGNzQwQjlDODkyMzk4QjM1Qjg5CkM2RjQ0RUZBMUUz
-QkFGMzg0RDRCRUM2OEQ4MTdBRTdDNDQ5REUwNjFENTNDNzU2OEYyNzE0MzY1RDVDODA3Mjk4
-RDZGNzJFNEQ1RDhBRApCODdBQ0UxOUU0MDU3RTIxODgxMUVEMTJGODQ5MDZGNEZGOUJFRDQ2
-NjA3MjYzQUYxQ0U0RTRGQzFBN0QwNkQ1OTcyNUJGQUY5QjE5MUMKMTdEOTEyQzY3NzI2RDg4
-Q0U4MDVFQ0Y5MzA4MUExQkVFMjgxQTAzNjRFRjBDRUZCQTkyRkNENjQzM0I0QTQ0QUM4M0M0
-NDkzNTkwMUQ5CjJFMzIxODRBMzFGRTc2NjFCNzYzNkI3MEZGNjJEOTdBRTlENzQ0MEEzQTYx
-MkE2OERGRDcxNzY0NDVGMDczNDZGRDI1REE1RDkxMDA3MAo1QjdBQzZGOTA2QkNCQ0FGRTJC
-QjNBM0UyOTZENTgwNjYwQjVGN0IyQjgyOTk1MUQyOTFBNzU5Q0U1REFCQzQ3RTkwMjFDMTRB
-RjgwRDQKRTI1OUVFMTMxNjkyNTdFRTI0QzAzNzNBN0NBQzE3Qjk1NDlBMzk0MEZDNjU4QkMz
-NUZDNjM2NkM3QTlFQURGREI2RkYxNUNGQ0UwMzhECkI1RjFFMEIyQTMzQ0I4QzQ1RDc4Q0Uw
-M0U4Mzk0RTBFQTlENjc3MDhDMTFGN0UyNUFEQTQyOThENUM4OUQ5NzdCRjE3NTU1QUM3MDU3
-MApCRTA3ODE1QzhDRDIwNEUzQ0NDRDNFODlBNkE0QjlCQjFBMDVGRDZERDRBNTZEREMwQUU1
-NkQ3RjU4MzgxMjQ2MDk1RTg2MjQ1MDU1QjcKNzYyRDA5ODExNDgwRTlBMTcwMEZCMzkwQkJE
-NDVGRDA1RjEwNTRFRTY1QTlGQ0E4MkIyOEYxNDUzRDcxOUQ4RUExRTM4RTE0NzVEOTRECjNE
-MUIxNkY2NUNDNDU4MkNDMzJDQkY1QjlERTkwRTk2RDkyQTM5RjY2NzA5MEI4QjQ3RTBFQUNC
-QkU4NUY4ODVGQjU1RjgzQjE5QjAzMAo1MkQ0RUQ1NTJDMUNBNzc4MEE0QUJGMERCMDJGNDc2
-RDZBNDk0QjM2Mzk5OEI0QkU4MzJDRkRCREZCMjhFMEQyRjZEQkRGMDQyOTFFNTMKRjhDRUU5
-N0Q2MDU3RTY2OEYzNTk0NzVGQTU3NTQ0MUJDNzdGQTZGRjMxNzA2MjFEMTAwMkIxQUI0MEMx
-NTVCOEY0MEY3NERDODIyQjlBCjlDRUVGNzY2MkM5Q0VDRTEwODJBRTI2OTk1M0FDQUUyRTc4
-RTNFQjAxMUY3MjFFNkQ2NUI4OTc2OTlERjZCRTFEMTQzOTg5RkUwN0JFOQpFMUVFQUM0QTdG
-QUIyQkI4ODg0MUUzM0U5QUYwRTEwOUExODZGNzJCNkQ5NThEMkRCRDkyRTA3MEI2MUZBOEFD
-OURFNjBEM0IwQkUwODkKNTBDNTk3RDAyNTUxQjNCMTBBMEU1MkU0MDU3MUJGNkFGNDA0N0Ix
-OTE0RkE1NjUxRUFGMERFMEQzMzJFRTk1OUY1OEY0RERFMUQ4RDRECjZEODQ3REU1MEU0QTQ3
-QUMwQzJFRTczRkI2N0NFN0ZBMjJGMjQyRDRFNjlFREYyQ0MwNTBEQUREQjI1Rjg5NTlFOTA2
-MEFGMEUyQUJDRAoyRTAyMjVBMUI5QzQ3OTJFRTk4ODUxN0IzQTU2N0RBMDlGM0UxMkUwNTJF
-Q0RDOTFBNTczN0M0NDAyNjUxM0U0NkQ3QjBDNzM5OUIwMDYKQjE1MDVGM0I3RjQxODgzQTE0
-QkE1QjE4MEU4MEM2M0RENUQzN0VDNUU5MEMzOEY0NkRDODhGMTFGRDVDMTU3MDQ1NTk0MTk0
-OTYwNkNBCjU5OENBMjAxMDU2OERDMEI0OUZFNUU1RUI1REZCN0UzQUYxOTVBMjNGNTFGODdG
-NTg5OEQxMEEzNDA0M0YyMzQwOUE5NTUxOTM1NjYxNwowNzNFQzgzQ0QzMTJBRjY5NjFFRUE0
-MDM3N0VBQjBCMEMxNTlDMzkwNkYwNDkyRTk0NDE0QUJCOEZGMzRGMUZCNkQzMzU5NERDQjVB
-NjQKRkFBN0EwMkM3NDk3OTlCQzE0NTUyRjIwNTEyMkUyMjIwOEVEQjYzM0ZBNTAzMTFCMzk4
-Qjk4RUZGQzBGRUI1Q0FFOEIwOTUzQ0QxRDBGCjA1NzAxQzI5MTlENURFNThFRUEyQ0E0QUVE
-RDA2NDQ0OTE1QjE2OTI1NTA0RDE1OUYwNTBBQUEyMDM0NzNDMjk4MDVFREY1QTcxQUFEMgow
-NkM2MDEyNjZFRDJCOTA5RTY4ODg3Rjk0Qjc2MTRFNzIzOTUwRUE5ODE4Rjc3OTMwNDBCQjhG
-N0UzNTAwQkU0NDg5OEI5MkUxQkRDOTcKQkNDRjMxMkQzNUE4NUU2Njc2NjlGMTVCREI0Mjg4
-NEU3QTI1OEMzNkM3Q0Y0OTQ3ODUyODY0RkY0NkVGQ0Q1NjgxN0M1OEE3QkRGMjlGCjMxMTFB
-MTg4QTVGOUYyNTVGRTA0MjU1QjE0MjdDQ0Q5RDBDQUY2RDk5OTJDNkZENDkzRTExQUFBODFF
-MTNGQzY5QzU2OUE1NzNBNzlDQwpEM0QyODU5QjA1MUI3RUM3Q0I1NUEyOTI5RTUxNUZDMTVC
-MDhBREE1MDM2OUMxMDgwOEI4M0VGQjY0NDVCNEU1N0U4QkJCRDc1RDZBNkEKNjJGNzIyODc1
-QzZBNjVCQTM1NUJGMjRDRERGNEY1NjExRDQ5MThFRDlEREM1MkU1MjdDNDlBMjg0M0JBMzY0
-NkYzN0IwMTAzRUQwODM4CjVENjg4MzQ3ODNGMjlDMjFGQzY2RjU1QTdCMTFDREQxNTQ4MTAz
-MTBDQjBDMDUzNjdEMkYxMkQ3NDlGNUJBRkNBODZBRjE2MTYwRTkwRQoxRTY2MDlEQkZFQjMw
-MkJCNzM5MzIzNzczMUZGOTBFRjU1NUUxQTE5NEY4OEJCMDVGQ0VCQjZCMDU3MzcyNzMxQ0Yx
-RDE0Q0I0N0U0N0IKNjlBM0UxMTU4RjE3NDFEQTQ1MDU1NDFBODMyRDAzNjJDRDREMTZFQzU0
-QkIxNkU0MENDNjgyQ0U2MTMyRTM2OUMwQkFBMkFCRDdBMzVGCkMyNzk5OTg4MUIwMkQ5QzIy
-REZERDU2Q0Q3NTIwQ0I4M0E4Q0ZDQjRBMTdEQzc5OTA0M0YyNUQ2OUJGMzQ2MERFRUJGMThD
-MjU3OUYwNQoyQjY5QjlGRTVFNkI3NDY3QTE1REFDMTBGM0QzNTAwQjdFQjBENDFFOENCQjBE
-M0REN0E2OUQyODQ1ODM3M0M2ODFGQTc2M0JBRkZDNTcKMjRFMUI1OUYyMUFBODgzMEU3Mzkx
-RThCRjhDRDY0OUY3RjM4MjYyNjQ5MTQ1MDVBM0IzNjcwNTY1NUFGM0MzRkY1MDYzMzJBNDNE
-NzUzCkQxNUJGMEE0MTVENkM3RjhGNjUzRUVDMEE2Njg0MEU3QjlFNzhDOEFCMDU1NjQxNzA3
-MUNBREI4NjFEOUNFOTU5Q0Q0NjQxRUYyQ0RFQQpCNDUwNTg3NzUyQjRBQkU4RjFFNjE3MzJD
-NDlDNTcyNDE3NDZFOTEzQjk5RDIzNTY4RjYyN0FBN0EyMkI5RDMzNzJGMjRBOUYxQjhBQzMK
-NDI3RTU5ODgwOTA4NEQ0QkNEQ0M4RTI5Qjk3NTAyMEU3MzdGQkRFMUJFMUFGNzRDRDAyQkRE
-NzgxMzg4RjM5QTE4OUY2NTgzMDc1QTU3CkE1QjIxRTFBNUU5M0FEMTcwQzM3NjdCNTQzQkZD
-QzE1MkUzMjZCNzY4RDk4QkRERDQwM0ZDQUMwN0VBMzk1QTAxOUU2NDUwNjVCMEREOApEREFE
-MzM5ODI5OUFBQkU2MUQyMEQ4NUU5OUZCODFDNjNDMTUyMTJCNDk2QTNFMjNGNjRGNDBBQkU2
-MEJEODUyN0Y4NUE3ODkwQkI3QzEKQTMxRjlGQUQ1Nzc2Q0JGODUyRERGOTA5OTYzMEEwQjEx
-MEREMUZEQjg3RkEwNzRFQzU0OTNCQjIxODg5NDBGMjk3OUEwMUMxNDYzQURFCkI2ODhBM0Mz
-MzM5MjkzQjBFMUVBN0ZFQjUyMDMzMzVEMjU1OEVCQjhCREI2NUYxM0RDMkVCOEVERDZDMjc4
-NEQ5MDJENkIyMDEzNUY3Qwo4ODY2Mjk5MUNEQzkxRTJCOTk4MEZENjhCMTdCNjJFNDQ2OTM5
-ODRCNzY2MjQ3QTlGMTIxQTEyRTI4MEFFQzREM0M3NjVGMjg1NzMzOEMKODg3MTAyNjYwNTM3
-QUUyOEVCQzc3NzFENDAyQkUzODFFNkFDNzVEMDcxRDZFNjZCRDUzQ0MwMkVDOTY4NTFCN0Y2
-RUNBN0E5NDY0ODM0CjcwRjJBRjE4MjU5MkY1M0ZCQ0Y3RjNEMDg3OEUxNEJEM0E3MjYzMzQ2
-MTg3RkIzMjUwRjE3MjY2RjExMDYyQkRFNzc0QUEzOTk3RTgxMAoyQkE5QzdCQzM3QTBCNjlE
-Q0Q3ODgwNzA3MjVERTdEOERERTgwNEIzQjUzODAyNEYyRDY3REY3QjlFMDA5QTIwQzIzRkZB
-NUIzNkNFRjEKRjIzRDdBMTJGNjY3QTE3NTBCQkYyQjIyMkM4RUQ4MjQ5OEE5QzY0NEFBRTdB
-QzI1OTg0MEYzODgxNzQ3RjJCNEVBREU3RDk2MUU3NEVFCkExNzg2M0I3NDBFMUE2NzJGMjcw
-OTcyODczRUYzQkNEQTQyOTRFNzAwOEFFM0Y0NzBBODkxNTkwMDU0MzFEOUNCRDFCREVCMEIz
-NDIwMgo0MUQ0MTg2ODdCRDA0NEI5REVBMDlGNDgwMUJGMTE5M0IxMEE2Qjk2NDc4QzkzOEFB
-NjdDQkUzNTgwMTg3RjJDQzI2MDQ5MTJCRTZBQjEKQ0M5RDEwRTE1REQyRDAyQzU1QzZFRjgy
-NEU0RThEQ0QxQzFGOTI4NzFBQUU0QTMzNDU1RjE1RDcxQjQzNTlFMTVDRkIyOUY4RkZCMUZE
-CkYwODg5NzhCOTJCNDM2QThGNDJDRjgwNjFEQzk4Njk0QTc2MjdFQTA2ODcyREQyNEZENUY2
-Q0FFNEEwOTEwNkI4MkFGNkQwQTRGMTMxQwoxRDI1QTA2MjY0OUZFOEI2RkExNjkyOTM4NEQ0
-QzE1QzMwMTg3NUIwNUI3ODQ4MTM5MUE0OTdERUYzRDZFMjQ3NzY5ODVFN0I5RDAxMTEKODQ1
-MkIzM0VFRTA4NEExQTVDRUI4ODY2QThFN0Y3MDE2RDgyRDA1ODhDOUVDMDA2NzFEQjc5RjIy
-QkJDOTA0MjA0MTM2RjJBOTdCMjdECkIxRTIwQTU3MUE4OTMxMkY3RjFGREFFMUY5QUE2NkVF
-QjZDN0I0NzNGRUM5MEZGRTc1RURDQkI1M0NENEY0NjI1RDNFMDlDNzlBRjhBOQowODI3OTc1
-N0FDNDk5NUFCNTc1REM0NzYyQjMzQjY2MDhBOEE4NUQ1RUIzOUM1MkMxQ0E0NTIwNDdFRDE4
-M0EwMzExNDJBRTA2MUQyQzEKMUM4QThGQUM0OEI1MjM5RDI3RTE5NkFEMTk2MTMxNThDMkIy
-NEJGNjZFRjVFQjA0MEM1NzFCNjc3OTE5OTZGMThFN0M1RTQxMjVCOUNCCjUyNTkxMTMyNTAx
-RDRFM0U5QTQzQjExMUJFNzZFQzA2RTcwODY3NDk0QzRERDI3QzEzN0U2QkUzNUMzMkNBRTlD
-QTRGNUNFMzkzNEFEQQo4NjVGMThDMTUyNjk3QzZCMUNGMDYwNDUxN0FEOEM2RDJBRjRDQzAw
-RDNFMzU0RTJEMjg1RUUyRjA2MjM3QzlGQ0IwMkEzQTRBNjAxNTcKQ0NCMEEwRjM1OTE1NTY5
-QUFBNjRBOTVDN0REQTAwRUUyNzE4RTJDNjA3MkY3RTVEODhBODhCNTcwMjFERTRGRUMzOUM0
-NzQ0NjAwMDczCkIyRDgxQTY2ODEwOUE2NTE2NjcwQTFGM0VGNzhCRjQ2NTE4RTk1RDAyMjQz
-MDg5RDg5QTQ5RkRENzhBOEVFMTgzNTk0RUY5MzZGNzFBMQo4RkI1RjkzMzE4NjAyRDY0OTZG
-RjM1RkZGRjc5RkVBRTIyMzYzODZGMDdBQTg0MzAwQjA2N0E5RUQ0RkVCRjUxQjY5RkRGQkI5
-NzNGQ0EKNjIxMjVGRUU0NDYzQTA2QjhGRkNGNUM2NjI5ODRDMUNENENBREVDQzI3NTcwOTI2
-OEM0RkZBRTc3NEUxMkI2MTc5NzM3NjBFMzY5RDFCCjhDNzlGMDA0NzEzMTBFREJCMzU2OTAy
-MkJFMEZBQTJFOURFQjEyRTgxQzQwQThFRDM4MDNGRjNFNDAwOTMzQjUwOTA1RjNFQjIzMTU0
-NwoxNTc4ODcxNDg3Mzg4NDU2Njc4MTdGRUJFQjAwRDE3Njk4REJBOUQxRTIzNkQ1OTZEREYz
-RUJERjQ2QTMzNDY3NTdDQzAxMjY1N0QwRTYKQTBEQzc4Mzk5RkY0Q0E4M0IyNTQ1Q0YzRTM3
-NEYxNkRCMkE1REMzNkIzREY5QUUwRkFGRURBQzkzNzlGMEVFQTNGQTE3NUNBMEU5RkQ2CjJF
-MTFGMTAzNjlCMjFGQUI5OUQ3MjFFREE5QjEzNTE5ODIyREY5OTlCNTEyQTgwNjE1ODJGN0Mw
-RTgzNjExMkQwMjNDNDYxNzg0OEMyQwo2RjkyM0Y4QkJFMjcwMTdERTdDRUFCM0M4NTdGNkEx
-NTFCRDk5ODI2NkRGNjJENzg4NUEzQzM4MzYzRjU5ODY2MTQxOTFENjhDMjk4NzcKNTY3QjE0
-MDhENERBMUM1QURBOTFBNzVBMUE1Q0IwN0M3RDU4NDNDRjcyNDYyMzNCRkIzMjNGRkY0OTVF
-RUFGNzJEOTZBOEVERDhDMzIwCjU3Njc0NTM2QjA4RTc2MDQwNzQyRUFGNjVFQjBGRUU1MEQ0
-QjBCRkM2NjFCMUVENUE0MzZENjYwMUE4MTNGMzYwQkMxQTZDOEQ4REEzNApERDE1NjBGODY0
-ODY4Qzg4QTRCNzJDOTVDODJBMDMyOEQ0MTZFQTZBMkE3NUU1RjlBRTY1OEQ2MjM5RTU0RTc4
-NjZDRjhDN0UzN0Y5MTEKN0U5RDk0MEYxQTI0Mzk5MjRFQTYzMEMzMTA0MTZEMUExQjk1QzNF
-OEJDQkQwRjFEQTZCQjNGNUFDOTM0MkZBRDE0NUVERDk2QzQyNTBGCjg5QjVCNUU1RjEwNjdE
-NEIyRTJFNTJBMTgyRkEzODNBRDQ0QkM0REVDQTFEMjA3NEJCNkVCMURGQkU3REYyNUFGM0Iw
-MjcxQjAyN0IxMQpCRjRCMEYxQjU2RTgzNEEwNjY3QThCMzBDOUI2MUUzQjQ0MjgzRDU3MUEx
-MTY2N0E0REMxMEY3QjZFM0IzMzQ3NjRDQjEwMzU3MDkwQjIKNzRGN0JGNkI5QTE5RUNCQUVB
-QzBBOTQyRjk1RjgyQTYwNEM1MERENzFGMkNGRTVCMUI4NjhFNjlDMDc3Q0RERjVDODI5OUNB
-NkMxODE2CjkzQUIwRTQzRjg5QURCRjNCQjk0RTJFM0NGQjAxREU0N0JFQzlGQUE1OUVEQzVC
-NkQ1MDc2NUI2RUIwOTk5NTc1NUM2MDc0QzIxMDZBNgpGQjE0OEZCOTgzQ0ZFMDZFQjRFQUJF
-ODI3Rjk4Q0YxNTgzNzVBN0M5Qzc0NUQzRjc5MDdDNjk1MkQwQ0JGMjhGNUYxREREQTMxQThC
-QzUKNUEyNEZBMzVFNTU4NEY2MUY0QUNBMjU3NzNEODZDNDZCN0EwNDJCRjAwMzA4NkQ4ODc5
-NTA1RkI0RTRBODhCMzc3MjQyNzZFNUFFRTA5CkZEODI0Mjk4MTRDMEI2MDFDRTI5Rjc2ODFC
-QjM5MDNFNjQ2MTlCQTU3RDRDNzM5OUUzQkI3MzgxMDVDNjQwNDE2NUQxRkYyRTREQjY1NAoy
-NzJDMTExODU4ODZCOUY5Q0JCOTRGRTFEMUY3Q0NCQTZFMEU0OTQ0RDZDNTlFQUI1QkU3RjY5
-RkRDMTQ5NkE3NzlDNjMzOTFFMUZBNkEKMzhBQ0QxMUU4NkY2ODg2MDBGRTFDQjM5ODRCNTI3
-RkQ4NTZEQTAyRjhGMEQxRDI0N0RDRkMxNzIyMTEzOUMzMTI0OThBQ0Y4RDlFODEyCjRBNjRB
-NTExQUNCNjUwMUVBREU5Rjg3OTBENEY2RTlDM0I0MkJDMDRDMjNFNkFEMkE2RTZBNTQxNzhC
-QzM4REM2ODRCMDBGQjU0OUE5Mgo4MTYyNzA1NkY0NkI2ODM2QTY4ODk4MjExODc2MDU4Mzk0
-RDVCQjI2MzIwMUJDNjlFNjhGMDUwREEwMzhCN0Y4NkVFQ0MxMTdDMzdDNzQKQUFCMEM5QzRG
-OEI0NjUyRTJGODNGMDkyN0FEQjJBN0JFOTAzMzI1NUM2MzE5NTZERENCMTdEQjJGRTM3NUQ3
-OUJEODEwQUM0M0EyRkUwCjhCNTFEN0JBOTYxOTM1QjNEOUJCQzc4NUIwREVENjhEODRDOTBE
-M0RDM0IyMjU0MUMyQjNDMUE1M0RFOTlEQTE2RTZFQzZEMTQ3NkNCRgo1NTE0RTNCQ0FENDI3
-QzlDODg3NUFFQzU5MUJCNUUyMUEyQ0E0M0MxNDA1MUQ3MkMxOEJFRDczNjEyQ0U1Qjg4QThB
-NzFDMTE0QTU2MjMKN0ZFRkM1NDU4M0EzMDQxQTZFODcxQzhFN0RDQjRDQzQ1N0JBRTczOTBE
-RTY3NDk5MkVGMkUzREM1QUNDODA4Q0VGMUI2RjNENTgyMTRDCkY1MDI0NDE3QkQ5MDEzNDNG
-MkYwOTYxNTdDRTMxRUMwRUE2Q0JFODA4QzhFNTA4RTYwMDBGMDE2NzBFNTUyREUwMEE0RUI0
-RDdCRDI1NApGODQwQ0E2RUU2Qzc1QkQ5NkU5NDQzNTJEOUFFREVFNjk0MUNFM0VFOERBM0U4
-NTFEODExMzA5RTNCNUVDQzYxMEU5OERERUUyNjI0NzMKM0Q2MURCOTYzNTMxMjI1OUNGREE4
-OTUzREY0RDAxQTlCODU3REI2NTMyQ0VENURFRjJBREI1ODMwQUNEQUMzQkRDODlCOTU4MzQy
-NTVDCjQ0MTMxMDBCMTlDRjQ5QTU0NzVDNUM5ODVGODJEMUM0Mzc1MEU5MzNDNTlDQkMzRjky
-RjU3ODVFQjU0MzM5Q0Y3NDJGNDRBMkI0RDc3Rgo2OTQ1OTJDRTJGOTI2REFGRTFGM0QyQ0U1
-MkY0M0MxNkEyMzMxRTAyN0ZGM0UyNEMxMDJEMDk0MTFCNTc4QjE0MzU4MkI1NTEwMzI0N0YK
-Nzg2NkIxQjg3MTI3NzYzRUFFOUJBMDYzNzQ2Qjc4NUUzOTJFRDExRThENEE2QzI1QUUzOURB
-N0FGNkYxMjUwNkJGOUFGQ0FCODlENzdFCjE0QzY3NTdBNkU4MDZDMEYxQTE2QTBFNDJFRUNE
-Q0UxOTk5NkFERURFNDNFNDc3Qjg0RTUwM0M3QURFODRCMUQ3OUVBQThDM0UwRDRDRgo5NDM0
-MTZCNTVFQUNGNEQzRTYyMTc4QTI5NDg2QThGMzExOTA3MjgyMEYzN0IyMDRBMUJENDgyNUU3
-NTg2NTBFNEIwNjYwOUI4NjdDREYKQTM2RTUwQTgyMzZDQjlGQzg3RkQ4MTNEOEU4NDcyOTRC
-NUI1REQ2M0RCN0E1NTM5MTdENTgzODNFQUY2OUJEMDk2RUQ2NTg1MzZDQTlDCkI4M0RBOTY3
-RUNDNDY3RTgzMjlFQkZDNDUwRkM4NkM5NjBEMjNBQkZFMEE2Njk4Mjg3QTU0MDVGNTQwODNE
-NUM2QTk0OUY3M0MwNUVDQgpERjUyMUJGRDBBMzU4M0NEMzhBRDdCMjMyNEZFNTc5NTgyMTJC
-NDRFQzZDQkNGQkU2NDkxRDVGMjdGOTFBN0M2OEJGN0FFOTEyMzlCQzEKMDZBMzdEMTQ0Rjcy
-OEE5Rjk0NTJBMTdDM0UzQzgxNTAxRTYxOThCQUU5NThFMzdDOUI1MEMxQUYyN0MxOERGQzE0
-NTc5NzcyRjlGODc2CjlEMUM0QkExQ0U4NkE4OEIxRUIwRDVFQTlGNTFEQzA4RERFQjU3MzdB
-Q0RENThEODU2Njk4Nzk1QjFCM0VFMjVFN0JEQUM5RTUwQzZDMwpENkNFNjVGQjM0QUY0Qzkz
-QTQ5Nzk2MzI0QjdEQjQ0MTBBNTA2ODAzOTJCRkE1QUFERjIzNERGMjU4NjE3NkJDOTlBMDRG
-QkE3RTJBMDcKOUY1Rjc5QzdEOEFENjhGOTNCMkYzQjdCRUFFQUMxQ0Q0RTQzMzhBOUNEMDIw
-M0QxRTA0QkMwRkMzMTY1RkNBNDEwM0VFQjcxREZEMTE5CjUwNTQ3MzQwQUM4MzYwNUI4ODVD
-MkYyQjIzNUJCMUZBMUY4RkEwQ0FDMkVCNjQ2MTVERjVDMjRGQjJDRkEyNTU0QjdGQzJDNUNG
-NzQ0MAozQzVEQ0VGQzIyQzcxOUU5ODU1M0IwRUNBMUQwODQ4MUExMzBGREFCNjE5OUNGRDVG
-Q0JGNjEwRDRFMkY1MUExNzYzMjI3MEEwOTZBNzAKRjFFRDIzNDVFMTk2ODQ0Q0FGQUIxQTk3
-OUZBMUNCQTU0NTE4QUZGQjUwN0M1OEU4NkUyQ0NBNDE3ODE3MkI0ODhEN0FENjEwQjUzMkU3
-CkZCMTA2Rjk0RTkwQzA2MkZGRDY3RkREMThBNzJCM0YyNjUyNDUzODA3OTAxNzM3REI4ODU5
-MDM1ODg0RDI4OTI2NkU0MDJCRjhGNDcxOAo1M0FBQjY4MDZCRTFCQzM5RkZEOTc1NTJCMDJC
-QjA4MDkyNkY5MDk1RDU2RjJFQzJDQjA0OTgwQTc2RjZERUQzMkI5Rjg3OTAzNEFFMkMKQTYy
-MkUwRTIxNDdFMzM1ODRFREVBNUQwMDNBRjc1MTI1NUI1MTk1OTk1NkQxRTI3Q0ExMDhDNkVE
-QTlDRjVDQUY1M0NDNDY0OTg2MTIzCkI5NTgyRDAxNzZCNjY4OTkwNEQ1NzQ0QjkyNUYxMkFF
-RTE3NDkyRUQzRkZGMDQ4RTA3NjExOUZEMUY4RkQyQTRBMUI3MEE2MzY5MzEyRgo2NEY0NDY2
-NEQxQUM1MTk0NjRBMEYyQURGMzAxOEIzOUE4OEFGMDdDNTJCM0NDQkM5REVCRDk5MzdGQjIz
-MzA5MjhDMUU1RkY1NkJENzMKQzRFQkI5NDNBMzAwM0U0MkQ5MTNDMTVFRkU1MkVDMTdGMDFD
-N0YyNjNGNzk1NDYyQkU2MDVBMjkxMENFQTc5QzZCNzI0OTVDQzU4RjgxCkNFODMyOTdCMjEw
-NjMxOUVDNjA5N0MzOEE3Mzk0Mzc4MTY0Qjc3MzU1MDA0NTM5NzRBQkE1RTNCRTA0NTQyODkz
-QUUxNUNENUIzNEFENQowMzJCOEQxRjJBQjY4M0M3NDNCN0REM0NFQTFDMzlBMDAxNEU5MjY0
-RTc2NTU2NTE1MzkwMDNBMkJEQzU4N0YzMUI2MkUzQkUxQjdGOUQKNUYxMzRBRTc2OTQ5RjVB
-QTYyOUQ1QTYzRkMyMzk5MjAxODAyNDZFQTFGRjYxNzZERDQ4MkUzM0FEMjU4QjE1NUQ1NUNE
-NjZCNDRBMjgxCjcyM0NEM0NDQjY2QTM2MkYxMUU0RDU4RjlERDAwNkNGMTY1MUQ2QUZEOTAz
-QUY4N0U3MjU0NENEMzcyNTY3MDIzMkQ3RERBOEFCMTkzRAoyQzA4NzM2QTQ5RDFGQUFBRTg2
-MUE2NjRBOURBNDI5NzcyOTQ3MTA3RjI5MTdEN0U3NzE3QTQ1MzVENDY0RDM0QjNDNjVCMUU3
-NzQ0NEEKNDcwRUFDQTY4RTREQUIxMjI0MjBGMDFGOEE3RDIxM0QwMDQxOTA4QTg2NENBQTZB
-NjIxRjE0QzE0RTQwN0YwQkM1Q0M3MENGMEJDNEZDCkNEMkZBRjhDRDBDNUQ1RkIyMDgwMDEw
-RTAzOEMwRjExOEQ3NjJDMDk4OTg2ODZEOERCRkMyOUNDREQ0NkYwOEVGRDU5OTMyODEwMUJG
-NQoxNkE1NzM2RjIwQURENEFDMUMxNTBCRDNCRUFENTg1RDFEMzYyMjYxQzczNUYyNENGQkJE
-NEI2NDY4MkUzNDkyNkNCMDRGOUQzMUUwOUMKQTYzMzVBRUIzQzQ3REUzOUQxNjAwRDdGNjIy
-MTNBNzFDNzRBMEY4MTk2NURDNUIxQjNENzIyNzYzNjY5MEI4ODJGMzgxMjZEOTAxQTlDCkU0
-MThCQzZEM0Q5MjNGQkI4MDE3NjFGRTdCODFBNTVERTNGMkU0MjY4ODI0NkEwNjQ0MUZBRTE0
-RjIzRERCOTkzNjcxOTAxRjk3NDUwQwpFQTZEQjEwQjBEQjEzQTIzQ0UwRTIxQzI3QzFDRDZB
-QjUyNEQyNUVGQzEzREFBNDUwRkQ4MEJCREM2Mzc2MDY1QTE0RDc0OUQ0OEVFMUUKOEM4M0I4
-MzNCNTEwMDI3RjlDODlGNzMxOUIxNTA5QjY5OTE2MkI3RjlDNUI4QTczOUFDQzEwMDY2MzlD
-Mjk3QzIzQjhBNjYyMTNGNDdFCkE4NzNGODdGMUNDMTlGNTgxRUMwMjZERTU4NEJDMDQ5QzQ5
-QkRDRkU4OUMwMDE1MDRGNDFERTE3RDg0Rjk3MzgyNjg4NkY0RTUyNDZCRgpGQjg3QURGMDcy
-NkNFQzdBNEYxNjdFMDM4NEI5MTUyNjg5NEMyRDAwOTBEMzhFQUIxNDYxQzYwN0VGMzU5RTc0
-NjI4ODU0REVFMUFFQzAKNURBODk0NTk5NUEzRDY4NjcxRThCREQ5OTQ2QzIyMjI5NEIwQzQ2
-ODBFRjJGREMyMjRBMEM3QUZBOUU1NDY2QzdCMTQ1N0NFM0RDN0I4CjdCMEMzNTE3REI4MzNF
-REQzMDJCQUNGM0MzN0JBRTQ2MTdCQTYyMDZENUQxQzc3REQ1MzU0N0E3QkJFMEM5NDhEMjE3
-MjQ2QzI5NEM3MAo1QjI1NEE5NjBDQzVDMkY1RTM1MTIwMDM2MzU2RDc2MDQ1Mjg4NzIzN0Q3
-MEQxRTJGM0Q2QjY0QTAxNzFGQzU3ODg1OUFCQjYyQzE0NDQKRDNGRTA3MTlERDg1RTdBODgx
-MkY3QTVDMEI4QkVBNzIwN0UzMUM3QzU1MjgwMzQ4MTcyREM1RUIyNzU4OTgwNDRDMDBDMkQ5
-MjU0NUEzCjM2MkY3QjQyRTA3M0M3NUJGMTc5RDEzQjBCRTc2QjQ4MzZEMDY5RkUwMUMyODdC
-MzY3RDAyRERDRUM5NDEyQzJGQkVDM0Q0QjMyN0ExMAo3NjU4Njc1MEM4OTk0QUNFMERFMTcz
-MjdCMDFGNzRBMzgxM0QzRUY5RkJCOUM5QzU0MTRGMkU5Q0MxREQ5RDA2Mjk3RDE3NERGRDJE
-RTkKQ0U3QkM5NUY1ODBCNEYzRjI2ODMyQUVFNTM1QUMxNkEwODdBMDEyREU0N0JDQzY5MkI3
-QzA1QjYwMTVDRUUyMjEzMjNGN0VBQTE5MUVCCjg2RkE5NERCRUFDRjA5OTZBOEM4RDAxMzMw
-MUE3QkY2NEMyNDM2MTM1QzNDQ0YyMjk0QjFFMjI0NjE4NDI2MUI5QTZCRDJGNEI5OEE5MQpF
-NDFFRUY5QkQwNzAxOEY1Q0I5QjAwNjBBQTc2NjUxQ0UxNDA1RTA4RTQ1NUJBNjg5Q0QyRTZB
-MzEyNzAwN0JCNEIzMTFDMjM4MDQ2ODkKRUNGNjBEQTc5NzIzNzNEOTY1MjUwNDJDMzYwRjVE
-RTA5RENGRjk0MEU3MkNENURDMEE5MTU0QjYzMUFDMUYyRTM4QUEyQjg1NTFCQkM5CkFENUNC
-NzRDRDg2RjUzODhBQTc1QjZEOTJCMUUzN0E0Rjg3NUE2NzE0OTA4Mzc3RDc4QkM5NkRGQUI3
-RUJFMDQ3QkU0RDQyQzQxNkZERQo1MEEzM0ZDQTlFNjU2MDBBMkM3QTc1NzVENjA1OTA4MkMz
-RkEwREYzQzMxRTgyRDNGQTM5NjlDRTQzOTY1RUE0OUYwNjYzQ0YyQTJDNzEKRUU0QUQ1QzdE
-ODUzQjUyQjZBQTBGNDFBQjNENDdFNTEwRDhCRjY0QUZCMUU4QjhGNzgyQzk4Q0QyODdERUI5
-QUZFRDM5MzM1NTIwQjcyCkI4QjVDRkUyQTZCQjdDMUFCMEVCNzQ2RUNGNkY3QUY4NkMxODM2
-MTJCMERDRDU4M0ZBQzY3OEQ5NjAyOTU3RTYxQzE4N0YzOUIzQTY1NApCMjBDNzkyQkRBOUQ4
-MUZBOTc0QTlFODg2NEMxQTg2RjlBQjcyOTE4RkVCRkU0NzUxNjI5OUFFMUU5QjI3RjQ2RjND
-Mjk1OUM1QUFBRDAKQTVDM0MzMDY1MTE0RTg5OTU2RjVGQTM2RTE2MTc0NDcwREI4REIyRkUw
-ODM5NkVBNUVEN0Q1MEFGOTg5RDhEMTQzM0UwREU3MTE1QTQxCjAxMTVBREUwQkE3NEU4QTRE
-QkNFM0Q5Qjg3Q0E3NjdBRTM4MDI4MEQ1MUZFQTlBMEY2MjNBQjE3NUMzNDYyQjk0ODJERjZE
-MEJFOEY4RAo0MjA3ODJEQkE2M0Q1RjQzOTY2QTg4RTM3NTJCMjcwMDQ4RUFGRThCQTI5MUU3
-MEI4QkRGOEZCNDMzQTVBNTdDNjY5QjRGN0QzNUM4RDcKM0M1MjcwMERFRkJENENENDJFMUYy
-QzhFNDQyRDE5QzAzMENCMzVBRDY2QUVGN0VGMDIzM0JCNEUwOEZDQjQ4Qzg3MjM5OUFGODU5
-OTM4CkEwMkJFNUY5NjM5MUZDNjRFMjk3QUM3OTBENzAzMDJENTE5NzlDRjU0NTlGNERGMkE0
-MUIyNzU5MkQwNTM4REJBQzM5NEMzN0VDRjBFMgpDMTE2RDBBMkEyQzZBREFCNUIwNTQyRjg2
-Q0U1NDM2Q0Y5ODlBODY5NTY2QURFNEQ3NjRFNDIzQkU1ODNBQ0IxMjc4QzdFRDM2MkMwMjMK
-RjhBQzQ4NTUyOTAwNkExODkzREQ1QTk4RDA1MDU2NTU0M0VENkE0RjNCMDMwOTJFMjdFODkx
-Mzc2NUU1REVDMUZGRkJBODA5ODIzNDBECkFBQURDQTdBOTVBMjRFQjVGMzkyREE5OUZFM0U2
-QzM0OTQ4REQ0Q0JDNDY5QkYyQjUzQTUwRjE2MkQwNTk2M0Q3M0U3OUVDODhBOUQ5NAowNTIw
-OTk0MzE3OTNDRjhBMENDQUVBNUM5NUIxNzQ2MDYxNkExMzkyNzUzMjA0M0JFOUZBNzlGRTAy
-MzFENTdGRTg2MUZDMEQzMkRGOTAKRTlGM0VBNUQwMjhFMDYyODE2MThFOTg0QTE2OUY1MDA2
-NzU2MzQxQzFCMkNDQjlCQjVDNkNCRDJFREY3MUE1MjQ0RUU2NDZEQkVDRDI2CjBGNTQ3QjhD
-RjAzRjI2ODlFQjdGQURFNTZEMzY0M0FCOERDN0I4OUE1MTk0NDE5ODE4RkI2N0RENUM2NkU3
-ODY2RUJCMDEyQzM2NUUyNwpCRDRCRUY0QTZGQThBQkU0MjlCRUUzODcxNUFGMzVBQTNGMjc1
-MUUwRkQ5ODBEQ0Y2QUY5NEE4Q0Q2QTc2OTRCNkZBNzFGMkZDMkZFNjEKODc4ODREMDI5RUE3
-QkI5NTFFQzFGRUMzNkMxMDAzOTU5NDNDOEEwNDBFNUYxMzI1RUY4RUI2NjhCMDg5OTlGMDQz
-MUMyQjM2NzYxRkZBCkY2RTIxNzkwRTUxMTEzNTI2QjkyREY3NkFCMjJCOTc2MUIxMUEwQTY2
-NzNDOEUwOTNBREJFRkIxQjE4RkI3Q0Y4MEY0M0QxRDM4RjE3Ngo3ODU5N0I0RjYzOTA3NjRE
-NjBBMUM3OTdEQzA5MjZERDAxQjdEMDk0NDhDNjcxRkE1QjUxQjkzQTU4NjQwRUVCNjJFODBD
-NEYzODEwRTkKOUFDOTk5NTBEOEFFMzE4OTE1MkJBMEFDN0Q4RkE4NDMxREZGMUVBM0NENEZE
-MDdCMjcyQTU2M0U2N0MzRkRDMzE4OEJENjIxQkNGMEJFCjQwQUVFMTkyQTAyQkE1RUMzNkM1
-QTQ1RTFFMTYwOTdGNDI4NEI3NEFGQ0Q4NjkwQjI0RUQ4QzE0RDI1QzdFREE3Q0I2MzkwNDNB
-MjMxNwo4QTU4MDk0NzMzRkU3Mzg4N0Y3RkJCQzk5NTE1MEI2RTU0RjVDQURFNjUzMzhBMTJB
-MEYzODI0OTg0RjVCMTZBQTBDQkRGRjMzMEE0MDgKNzExNkVGQzE3OUREMDNDREZDMjMxMkVG
-NDlGQ0Q1MDE3MzI4NzVBOTYxREZBNzVERjJBRkVDMDcxMUREOEEyMTVDNjlCOUVGREUwOTVF
-CkIwMzI2MUM2M0M4OEI2QzY2QzNEQkVEQTIyMjM0MjA3MTMxOTJGQzM4QUYwREQ5QzRFNDJG
-M0JBRDlFMTMwNkFDODQ3MUFGQUI4OTUxQwoxMENDM0ZBNTFFMDk2QUYyOEQ3M0ZBQzVDRkFG
-NDEwRjgzRURDMDhGN0FGODZBMjgwQTIzMzY3NzQzRkVDQTcxMDZFRTBENDYwMjYxQzkKQUVE
-RTgyNkQzQzFCMTZEQkU0QzBERTBFRkY5Rjc0NENBMjYyNDZERkY5NTBCMEZENkYxNDYwMjUw
-M0Y1OEE0RjNCNzc2RDk0RTNDRjQ3CkNEQTAzQzA0RDMxRTcxQkQwMjgxQzJBNjZGMkQ4MDIx
-QTVFQjI1MDBBNzBENzNCNTU1MTlBQUI4N0RGRDk0MTQzQTYyM0ZCMjUwRDBDRAozMUIzOEQ4
-RUQyQzVFRTVDNUE3OERCMDIyMENDNUEwODEwMDNGNjhEODM2N0YzNTAxMTVGREIyNEYyQTE5
-MUFGRTg1QjlGOEM5REE2NTQKODRDM0ZEQzk5NDg4OUY0MkQ1NjE2Mzg0MDRDQUY4OEI4MzFF
-NjVENkQyNjIzQUE4RTgyQTA1MERBNzI3Rjg4NkVBQTdEQkM0MDEyQUNBCjUxRkIxNUNDNDgw
-MTZBQUY5RjgyMDEyRUNDNkIzQTRCNUM5RjYyODc5NTg1OERCNzI1QjgzOTc3MjI3NDlDMUJG
-MDY4MjY4M0E4Q0Q2Qwo1NTE4NUEzMEMzQTIxOTEzNkM4NTMwQ0MzMkM4RTU3Q0QzRjY2Njc3
-NTQ5RUYzQTlDNThCMDM2QzJDRTIxRUEzQUVENTg5MDAyMzAxNzYKOEZBMUNGRUUyQTVBRjQx
-NEEwOUY1REMzQ0E3N0M3MEFDMTU3MjBCQTA4QjVDNDk4QTVDNkY2QzUyMUMzNjQ3NURCNkU3
-Njc3ODE5Mjk1CkFFRUY5NUUyRkM4OTFFMUM0NUNFNzI5QzhBMTAzMkUwMjIwMUMxRTExMkRC
-RDc0QzMyMDNFMkZCRTM4OTMyMkQyNjZEQzJFRTE1NTE5RAoxRTdGMDkwN0M2MTVGMjI4NzMz
-RDI0MjdCNTVDMEQzNzM1QUYyNUExNUYwRUIwQTdGMzM3NDc1NTQ1NDg2OUNGOEQ4MjVDOThC
-OEVGQTIKNDVBNDRGQTcyNkFDN0ZEQ0NBMUI4NTg1QTZFRTY0ODk3NjQzMTM3QjY1NjhDMEQ2
-RUM5ODU5MDJDODcwNzgzRjI2MDJENTcwMTc2NTkwCjBFNzlGQzdCQzVBNDBEQzI5RTk2RkU2
-NTU3NUNDNjNERjFFNEYzOTQyNUIwRUMxMENDMzcwNDVBMEI1RkFFRDI0N0MxN0VGOTE4MDQ5
-Mgo0Qzg4OEEzOURBQTFEOEYyOEYyQTY4MkE5QTUyMkQ1QjhBRTY2NjhDMDJFOUUwNEUyRkRE
-OTM2RTJBMENBRDFEQUMzQ0NENkUzNkYwQUMKMUQyNkY5QkIyNTZBN0FCREQwQjUzMkI3QjQ4
-N0MxQkNCOTNBNjExNDgyMUExRkM4NUVBNkRBRTRGQTg4OUY1NTU2ODBBOUVCODkzQjJCCjhF
-NjBGOTk3MzQzODNFQTA2MDVBNDhBMkJFQTA3NTJEMEM3QTQyQzM2RDBFQzI1MkE1MjJFNTUz
-NjFCRTQ0MDlCRURCQkM1NTAwNDI4OQpBQ0VGQzhFMTFDQzk4OTYwOTUyMUNGOEY1NTYxMkYy
-NTAzMEM1QTM4ODM0MEZDQ0E3OTFGMUU0QzE0RjJBRTMzMzM1ODFCMEQ4MTkxMUEKQTA2RDIy
-RTQzQTVDRDU2NEU4MUVGQzA5OEYzRDhEQ0QxMDdEQzg0QjI3QjZDQUFEQkY2Q0VCNzM1Nzgz
-Q0Y0NTM5NDNGNjA4OTc2NjBDCjgxOEUxNDU3MDE3QTU2NTEyREFEODBDNjQ4NUY2NzQ5NzI0
-QjgzRERERUVFMERDNThBMEZGRjlFQzcxRjBGQ0NEOTNERTlCMkRGMDcwQwo3NjZDRjFDRDMw
-NjI5NjJDRjFBRTIyOTlFQ0Q5MDkyNEE4RDdDNDg2NDFBMDc2NEQwMDBEQkNGQ0JFQTMyMDVE
-REZGNjQ2NUMxNDZFQjIKMkU5OTA3OEVBNkNCNkY2MkQ2ODdCRDczMUU1NkVFNzA4MTU3MDkz
-NUZCNDNGMzlGRUVFOEY4NkVGOTEwRkYwQjk0NENFQTg3ODk5MEFDCkY0NkM0ODZCOTc2RDhE
-RkU4OTA1QkFDNkYyQjAxQzY5NTQxNjZGNTA4NkM0NDgwNEM3RkY2NDBENjg5Njk3RTFCRjZF
-Q0QyRDZGRjIwQgoxQzY5NUM5NkM3OEI5MjM2MzBCOEMyMDY0RjRDRjU3NDI0OUJEODEyNDk4
-NUVDQzBENzYyRUQwQkZCNTJFMjA0MkVCOTAwMDEwREFCMTgKMTM1Mjc0MTA5RkExMDE1Nzcx
-MEZGM0I2OTVGREEwMjExRjJEN0U0Q0Y3RUEzOERCRUQ1ODVGRDRBNUE2RDRGRkY0NjBGQTJD
-MjJBQjE1CjA1MkQ0MEVGNjBBMzVGMzYyNjU2NDI1MDJGRDBDMzdBMjY4MTMwMUM4NjA4MUE0
-MDE2RTk4MUUzRjZBMTg0QTUxMzNGNEExOTZGMzVENgoyMzQ0MENGREVBOTlGNThDNTFBOTc0
-QzE1QTNBNkI5NkVGQ0EyNUQxN0IwMDgxRTY0NDFBQjJFREZBMjU0ODU2NUI5RTcxNjQyMjkw
-QkQKN0MxQTcwNzdEQ0IzNDYxNkE4RkZGMzVFRTRFQUUzNjI3RDJGMURBRjUyMDIzRTE3QjE4
-NEVFNEY3NEMyQjZGQkE2M0QyMUZBMzQzM0YxCjQ0QjUyMTU2NEI4MUZDMkIyMEQ2NDIzNkRF
-N0ZGQzA5NzgzNUFDM0Y5RTMyMzYyRjA0RTMwNjFERjg4QjZBOTkwMUMzMTg0MEUzMUJDMgpD
-NTkwNzA2QjRCNzM0NDE2NTQzQzNCMjQ3N0U4MERDMEY0RkU5NTE4N0IzNkU1RUJFMDIwNzUz
-NTBGRkY4NjQ4NkM0ODU0NDNENDhEQ0QKMUZGNEFGMTg2MjQwMzAxMUVBNjMwQTA0MDM0RTBB
-MzRBQTdEQ0QxOTI2QTJBNEExQjUxNjBCNzhCMzEzNDQ1MTYxRjBBNUJBNjU2RDBCCjY5QTI1
-RjlDQTMyQkFEQzJBQjBBNTA3NkQ0QzYzNTdDMzkwM0E0RDQ1NzQxRDQ0QTVFNDAwMEY4NTEw
-MkZFRkY0NTEzNzU5NUM0MzhCMgo4RkMyQTVFNUVDMkE5REYzQjQ4QjA4QTk5RUMyRUE3MTVE
-RTIzQzM3QUE2MDNEOUZDNEZENzZBQUIxQTM1ODMyNjM4NzY1NDRGN0FGQ0IKOUI2OTlDQUE1
-MTc1NUIxQzQ4NzFBODc0NkZGQjYxODMzMzlBRDg1M0MyOENFNzIwN0U3NzJGMzI4NkY4MDE5
-MDg3OTVCRDhDNzAxMDMwCjBBRjE1MzQ1RjU3NDY4NEQ4NzgwN0E4RDBCRjdCMDE1MDMwRTky
-MTE2RTVBMDlDREIzMTU0NjBCQzNCNTk4RDU5RUQ3RjNCNTUxQzFGNwpDOTYxNTJERkY3QkM4
-RkQzNTZCMkUzOTFCMENCOTI3MEZBRkI5ODZFMTFDOEVBMjM1MEI2NzJCRDZBQTM2RjA5NjdG
-NTdERkU5OENFQkYKQTlBQkZCQzdCNUQyRUVFRTk5NTM5OTUxNjk5QkY5RURDNUNGMjFCNEU3
-QzY2QTkyRTFDNDhBMDIyMEE2REUxREMwODQzNUJFOTRCN0VFCjkyQUQ2RDQ4MjI5NjNGRkY4
-MTU2RTlFREY1MjQxMzJDMTdGRDIzNkUzNTU4MERENkQ4MUEyMDFCRjgwRjJEODkzQzlENTZC
-NTM2RjRDRAoyQzA2M0MwQUE3MzVDRTg0NDEwMTdCNDk2MDI3NTNCNzc2QTI4QkE1MEUzMzQy
-NjgxQzY2QTg4MUJBRUQ0OTRDMzFEMDY1NzA0OUU0NzkKMUMwQjE4RjcxOTBCMUNENEZGQkQw
-QTA0NUM5NzA0Q0FFQTkyOTJGQkE2QjYyQ0ZBMkU1Rjg2NzRCQjE0QUY4NENCQ0E0MkZGM0RC
-NUNCCkI1QTM3RjIwOTI2QjE3MDY2NzExMTYxNjMwOUUyQjBBNDQ5NEFCMkY2MjhDOUZDMEQ2
-MjZGMDJDQzlBQTg5NENEMkU2QzRGQkU0MDcyNwozNzE2ODA5MUFCOTUzNkUzRUU2RDBENzNG
-NTUxRTMwNTM4RDdCRDdGOTE0RDlFODE2MDQ0QjNDMzdCQjM3QjIyRjAyMjFBRDVGNzE1QjYK
-RjEyODhEN0U0REYyRkU0REFGNEM2NUQwOTdCMkE3NTdGMEVBOTc1NjVCODQzN0I0MkY4NjZG
-Q0MxQjZFRkQyRUZERThBRTlEODg4MTRCCjVCQkRCQUJBQUZCNjA2N0YxMzgyRUQ1QTU5Qzgw
-M0JFNUE4RjM3RERBMTk5MTc3RTFBRDBFQUE0OEUxMjQ5Mjg4QjY1RDI4MURFQjIxQwowNTFG
-QkVBNzE2NUFFNUVFOERBOUMzNTg5NkI1MDA4QTY4M0M5NkFDQjQxRjg5MURBRjZCMDdBQkQ4
-RjhDRThDMEI2MEYwMjQ0RDRGNDcKRkMzMEY4NEFEMDc5Nzk1RTZDOUNEMzVENTI1NUM2MEU4
-RTBGRjczNkVFNThCQkJBQzAxOURERjM3MDk5MkY5OEQwRTU5NUZBOTJFOTExCjc2NTlCNzY2
-N0VCQzEyRDJCMDExNThFNzgyMzFFNjg5MzZBQzgwMDNBMUI2MEIyMEE4NUU4OUY2MjU0NjEx
-MEUwOUE3NTE0QjQ0N0M3NAo0NDdENkM3NzA3RkVEQTM2MzZGM0IwMEM0NzBDRTBENEEyMzMz
-NkM1NkJCOEIzNTMyQzNEN0I5RDdFRTRBOTQ2ODRERDc4Qjc0NjI2MzQKMUY5NjgzQUQ0RDgw
-QTM1OEI2ODRGNTIyRTg0OTc1RDEzOTZGMDE2M0E0ODU4RkEyQzE3NTQyMTk3N0U2MkVCNTFF
-N0E3MzM3NThCNzZDCjZGMzc4QkYyMzU4NjBFODA4RDkwNDMzQkZGREUwMUVGMDk0ODAzQ0RC
-RTU4NTNENkI3QTRCMzBBODVFODNGRUY1RjQzNTNGQzFGODE0MwpFMTNBMjU1NjAwMjE2OUY4
-NjA0OTQ0NkQ5MkM1NDg1NkQyNUE5MEYyNzBFRjk2MzYyN0JDNzg5MEEwMTU2QzIxRjNBMkFG
-QkRDNDVCRDAKMEM3QTRCQ0U2QzA0QkJFMTkwMzJDOUNGNzJFMjYzOTVEOUEzMUUzQzVEQkQw
-NjFDNzEwODI4MzgzMEQ0Q0IwQ0VFN0Q2REVGQzBENjQyCkRFMzgzMzNCQjcyMTMyQzlFOTU2
-RkQ1OERGNEI0OEM3NEJBRTVEOEU5NzYwQUJFQTk3NTIwOTk0QTZGOThDNDJDMDE3NjAwMTFC
-MTlCOQpFM0RDNzk3ODlBOUJFNzUwNTI0NzdDOTZGNzgxRDMwOUM3Q0E0NDkzOUEzRDBBNDU4
-RUYyNUQ1NDc1Rjk5MzgwNDkyRTUwOENDMzZENEEKMkJCMUFGODdCOEQ3QjA2Mjc1MEQ4RkMx
-Rjg3Qzc3NEE0Q0Q1RURGQTBBN0EwNEU3RjlGMjczRjkwMzE3RTJCMDE3NEMzOThGM0U1ODNG
-CjA4NUFCNEU1ODIwMDg0NzAzNTI3NDM1NzJBNzZBNkVBQUEyREUzRDBGQjI1MTdGQUE4MzJF
-RUYwODc3MjFEMjA5MkZBNDNDNjE2NURBQgpGMDkwRjU5QkY5RTFERjJFQTQ3MTcyMTEyODVC
-NTFDN0NFQ0YzRURCOThCNEY0MTdDQTAxNTY4ODhGNEE5NURFNjdCNzMyMTkyNTZFRjUKNEY1
-NTMwMzhENERCREM2NERGN0I3MDRGMkI4RUE3QTM2RUE1QTQ2NzBFM0ExMkNFNkUyNjg2REI4
-RUU2NTFDNkY1RjMwODcxODM1MzA0CjU0Q0FEQTAzNjMwREJBQjQwN0I0NTcyMzg0NkMzOTlB
-MkU0N0M5RjdFQUM5NUM4NkY0QUQyMTE5RDQ5QjYxNkQyODIwNUNCODgxN0U0Nwo0QTkxQ0NC
-NTg2MjlCQzlCMkRFMEExNDNFM0VBNzBERTI0MjlGRjgzQTI5NzJBREY0QjhDRUUwREJGMEIy
-MkJGNDdBQUU2NDM2MjdEQUEKNTY1RkY0NzNDNEYxRjdCREZEOEQzMjBFQ0U0NzIzNTJCRjAz
-NzE1Mjg1NUZCOTA0NjcwNUQ4MzE5RDc4QzNFOEQwRDZBMDk1NTY1QzRECkFFQjJDMkE2MjFF
-RjgxNjE2RkVBNDZDRjhCNTFEMEIyM0E5QTQ3QTlCNkE3MDQ2RUMyRjUyRTFBOUYxRUE2MTI1
-NzZFNkIwMjZDREUwMgo5Q0IxQTAxNjhEREU0QTcyOUREQkRCN0Q5REREMjUzNTAwQzY0NEUw
-RDRENjgwRjM3QTA3OTMxOUJERUJGQzlDMjQ3QzY3NUU4MjAyRDIKQjA5NjY5RTNEOTBGNkYy
-REZDN0M2ODk5RThGQzlFNDgxNjdEMjkxQkE5RDBCMzNCQTBGMUYzMzFBQjY1Nzg3MzRGMkE0
-RDI3QjlCRTQwCjkzQzFBMTM1MUY5NTBFOTlBODA1RTJGMTZDOTAwQzYxQjdBMUZDQjNCM0I2
-NkY2NkM1RDA3NDAyMTU5QkNEQkQxNUYzMEM1OTkxNzMxNgoyNTVCNzdFMEVCQUEzQjRGODFE
-NUFFRDQzOEIzMkJGODE1Qzk0NzcyRkREQTEyM0VBNEJERjI5MDgxNDIyQ0E5MzRBOEJFRkJB
-OUZBQzkKM0VCQTYxOTQyNjVBQzU5RkJFMEI1QkIzQkIwNTZFOTYwNTVBOTYxRDU2MjlEMENB
-ODhFRTBBNjcyQjk5NDY1NDJDQTFBRTgzRjFCQUQ1CkJFRUM1NzMzNkU0OTFFODA2N0VGMjYw
-RUI4QkRFNjM0RTgxNjNEMkEyNjNCQzgxNTk2OERGOUVCNzc3MDQ4NjUxOUMxMzIwN0UzQURB
-MAowOUE3NTgwMDU1RDdFMDRGQjcyQUUzNjRGQTUxNDQxMjJDRDdBNTBBQUYxODcwNTcxQTBB
-N0YxOUI1MjgwNTk1NkM3ODA2MkIxN0ZCNzEKNThBMzE5M0Y3Q0VFQTk2QTE4QTA1RjZBRTJF
-RDQ4NDgyMEM0MDJCRDBERkRGQUVBNDgyMzhFMzdGNDI4MzcxRkVGNzlBMUI5M0YxRjJCCkJD
-MDJGMkZEQUExMjZEODkwNEU2RTRDRUVFQUREN0Y2RUQwMzZBMkU3RDFCNkY1REE3RjU5OEZE
-Q0M3QUM3QkIxNzVERUM0NUQ0RkNEQwo0QTg2RTJFM0E5QTUxRDAwQjMzOTQ1REM3RTM4Nzcx
-NTMyRjNBNzVCOTAxN0FFQkUxRkRENzQ1MzU2RUVCNTRDMUMzMTBFRjZDMUI4NUQKQjBEMDlC
-MEM2MUJFM0FBQjA4MEI1OEUyNzkzODNEODYyNzk2NjgwMjY4NjI4M0I1MDcxNDMwMjJCQTI4
-MTE2NUJEOTk1NUM4MzNCMUZDCjY5QTNBMjA3MUE1RjVENjY0QTJFN0U5REJEQzg1QjY0QTQ4
-Njg0QTJEQzZFRTk5MTNCNTYzM0E5OEYxOUE1NDZEQ0E2NzI3MzYxMDEwRgoyMTdFNjBBQ0Qx
-OTQ2RDBEMUEyQjBBMzFBNjEwM0Q4RTc0MzhGQUY1NTQzNDExOTJFMkIzM0ZDMjJDNTc3NTc2
-ODBCMEM0NDE0N0FBMDkKMjdDQjQxRTQ2NEU5NEUwRTBERDhFQkVEMTg3M0Y5RkRDQTMxMkE0
-QUJGMTQ2NDgyMkRFNUU2Q0E3MjNCOEIyRjNCMjNCNzM2OEIxREEyCkRBREU4QzJCNThFRjcx
-QjA2OEJFQkEzM0RFRDFCMjc4RDNCODFEOEFENDRERkJBQjcyRDRBQURCQ0FDMUQwMUZGQTkw
-MUNDM0ZEQzU2RApEQkVGNDBCREVDNEJFQUI2NDkxNkY5Q0ZERjIxRjVCMTE4NDMzQjY3MkJF
-MzA4MjY3RjFBOEFBRTg1RUYyODA4MzRGRjhGQzYxMzhBMkMKNDE3NzNGQkEzNzYxMjUwQUY3
-NDRCQTA2ODZCNkJFOERGMzY5NzQ4Q0IyQTMwRUMzMzQ0OEFDQjFBNzA0RDFCQTAxQzIzNjVG
-QjEyMDdFCjk4REVGRENDNjFDREE1NEIxMjBBNzQwNjFGOEIzMjQ0RDEyRjZCMzFCRUZCRTJB
-QzQ2MjlFNkI4MDA5QzgyMzlENDI3REIyQUM5Q0M1Rgo3MEY1NDg3MEQ1OEMyODZDOERDRTBE
-RTg5QjZFMkQwQjYzMTlBRDFBMTBEOTFGMTNDOEZFNjFEN0EzQjJFMUVBMTlFMzhGMTI3MzNC
-RjUKMzczMkI0RjNGQzZBOEUxMkZCMDFDMEYwM0MzOEY2NDVFODFFNjRFMTYzQjRDM0UzREI3
-QjZERTAzMjFFNzg3MjZDMDc3NUUzQUYwRTY1CjU0QjAzN0IzMTkyQUJGMUQ2ODg4MTJCQkJE
-NEU2NDMzMDFCRkJERkUyN0RFNEM5Q0VEOEQ5QTcwNUM5NEEyMkY1OTlDRDRBQjcyRDUxMgo0
-MjNCM0Q0Mzk2QjQyQzkwMUM0MkI5NThDNDY4ODI2NzI0NDk0NDBGMEM3OEJCMzMyMzY4NjA3
-NzBCOTYwMDhENzg2M0QzNzREMDVDNzkKQjIyMUIyMDMyOTA2NDYxM0E3QjdGRTE4MjhFNUE4
-MEVDNDVDNjRFQjA4NTYzNTc0Rjk5MkI1NjczRTUzNDU2Q0EzRThENEZEQjgxRTE1CjZBODM4
-NjlCQTk1QzhBNkU4RUFCODA0NDM4RUI1QkM1QjZCNzNGRDQ5M0UxOEU0Qzk1RTIxN0I4NDdF
-NDIyQTk0N0Q5QURCMTRGRjBEMgowNjZGNDMyNUE1MEJBMDdGNjg4MDJEODZENTE2NTNCMjY0
-ODMyQjRENjEwMjEwN0ZFMDQ5OTRGOERCMDQ2NEMzN0YzQjBEQzg3RDQ1QUQKRkNCRjk1QjFC
-QjIwNjIwRjA3QUU0MjBBQTY2RDc1ODVFRTg0QTNBQjczRkM4RjFFNUZBQjNDRjJGRjM4NERB
-OTY2OURBOTFCMDEzMkQ2CjlCQ0E3QkMyMUVCN0FGRDgyOTAyQ0NEOUY2NDI4NDlCMEFCNjIw
-QTkwQjNCNTc1NTRBNTdDMTdFRUY1MUE4MzEyRjQyODAyMkQ1RUJFMApGMjNCNTJDMDZBN0Mz
-RjE3RDRCQzU2NzAwQzY3MDFGMkUwMDNCRDEzNDNCNDE2QUUzNkNCRTZENkQwNjJFQUNBRTQ1
-NjlGRDU1QjU5RDEKNTVFQjJFMDgwMUQ4QzgyMTIxMTNBOUJCN0JBNUJGNEFFODlENDM0QjJC
-ODM4QzkxMUQ4NDU0MENBRTFFMkJDOTVERDI4QTI3OEYzNTcwCjQwNEQ5MUQzQzE4QkU0NjhF
-NkY1NEJBNkI4NEQ2MzA3QTJERDU1ODdEQUQyMzBBQjIzODNFNjk1N0U5QUMxQTc1RUM2REIw
-ODM1RjI0OApDOUVFNDgwMzE4RTFCRkIwMEFCMEVDQkIxRjE2MDMwMEUwQjZCMkM1NjJEMUI4
-NTZGNTQ5Mjc1Rjk4RkUxNDgwQjk0MDlBMjZCQjU1REQKRjVFNjdBRUYxNjI4OEIzRjRDOUZF
-QTU4NEE4QUE2MTY2NEI3M0JFRTBBNjJBNUQ4QkFCRjE4NDRGOTdGN0FCRkI3M0IzQ0QxOTAy
-NUY5CkZFN0MwODlCOTYzMEJGNTVDMjJERDE0ODQ5RkIzNTQzMTIyQ0ZCNjY5QjUxNTMzQzI5
-Rjc4RTUxRjUzQzQ5NEIyMjAxQ0Q1RkRFQTQ4OApGMjU5QzU0Rjc5MTJFNzY1MzYwQTBEMTQz
-QjU5RjQ5QjkzNTAwNjA2NjIwOUQxMUZGOUY5NTQxRjExQUU0RjdDNzBFQ0M0RkY3OEZFOEUK
-MDIwNUUxRjk3RDkwRkFBQUQ3RDEyRTIzOUMwMDlDQjk3QjFBQTdGNzA3QjdEMDE4RjEyNTYz
-Q0ZGNjVBQzJGQjE0RDdFQTYzOTAxMDYyCjJENUUzRDJBNzRDQjhFRkJDQTM0REIyNDBEMTBD
-OUZDMUYyRURDRDQ4Q0UwOThBRjFGQzAxQzNGQjQ5QTI3OTU3NDA1REE4OTMwN0ExRQpBODc3
-RTFENEIwQUZDOThDRTAyMzVBQzJDMjFEMkQ3M0I1REJBQzY4QTBERDA3OTZBQ0RBNzZBMTky
-ODQxMkVFQTUwNTNGMUUyRUM3OEMKNjVENDQyNzdDMjU4QTlCMjExRUNCOEEzRDQ5QzM0Qzg5
-QURBOTk0ODJBREQzRkNGNUFDNzQ5NUFDNDgzRjkyQ0M4MDc0QUY2QjU3OTcyCjZCNDk3RDVB
-NDM3RTdEMzdCNENDNzkxM0ZFMjMwNDdEODg2MTUyQzA0MUFFM0I1RDcwMDYzNjQ5QzhBQTcz
-MzVBRDNCRkMxMDVCOTE0MApDNUM0QkVGN0REQTMxNTZFQjg4NDFBMDcwNjRBQTJBMEVBNUU3
-RTY4MjhBNjZDQjIyODRBNkQ1RDQxODlCNkRGOUJFNzQ1NTVCODgxQjYKRjgyNjkxN0IyRDA5
-REY2MzNGQ0FGQTUyQjZFM0E4QjBFNjcwNjIzQUU4MjVBNzQ2QkI3RUE5RUYzRjUyRUUwNUYw
-QTdFODcwQTYxNDAxCjk2RDUwQjBGRTIwNjQzNjcxNEI3NERDN0IzNjczRDkzNTZGODg1REFB
-N0Y3OUE3MzY3NjkxMkI4NDU3OUYwRjQ5NzhGMzI3Q0NCRTA2MwpEMDlEMjJEQjAxMjIyQUZC
-NDQzNDA0NUM5MEExN0QwQjUyNjY1Nzk1ODA3MEY3QTZBQjU1NTk2MURCNkQ3OEY0NzkzMzFF
-MzczMDVENUEKMjA3MkFFMTk5QzlDMzFCMTJERDYxRDEwRTMxODg5RTZERTVCRkRCQjUxQzkw
-NTQ4QkY3RjUwMUJEMzNERDMzQjVGNjc5RjhFODQ2MDA3CkJFMDlDMzkwNTBBQUYwMzQ2NEE1
-N0NBNzBGRDA4M0UyRURDMkJBRjVERDNFMENCMzc1REQzQTI3ODI4OTgyNzM1MThEN0FFMDlC
-NUFGRQoyN0YyNTYwRkQ3Njg5MTI4MkY3QjY4OTA5QzZGQjlGNTQ5QUI5QjRFNjY0Q0EyNTlF
-MDY1MkU2NkNDNThDMjUwRDI4NUZEMjUzNTY2MEQKN0M5RjRFRENGRDg3NEY0QUZEQzY3RDFC
-OTA5RTA1NzZEMTU5REU2OUZCQjREQTMwN0ZFMzdDQ0IwMUU3QjdDNjY4Mjg3MkZBRkZENTkw
-CjJGMzFCQUM2OEU2OENCM0EwM0JCODI0QjVGMzU2MTZFQzBFQjQzNDI3QkU3QjM5NzY5MDZC
-NkU3MkY5RDcwQjhENjk3NThENEQ0RUQxQgpEOUFCNDA1QjBFOUUzMjQwMEVCNkM1RTdGQjAw
-Njk5N0Q1QUM1MjY1RkI1NTcxREU0RDFFM0UzMTIzQTcyNUYzNzE1M0M4NzQ0Mzk0MDcKOEQx
-Nzg2QjlDMjQ2MzM5OTAzREYxODU1NjQ5RkYxQjk3QzkxOUE4MThBM0M5ODZBRUYyOThGMkM5
-MDFGNDdDNDRFNzI2QkNERDE2QURBCjJERTQ2N0YzNDhGMjczMzY0MjQyRTgyRTZDNzAyQzc3
-MUI4QjA2MTIzODBCQkRCRTI5NzYwRjE5MEVBN0VGOEYxQzJCOTk5MUI3MDFEQwoyRDE4MzhB
-QTgyODI4NTZGM0VGQ0VBMjc0NzE4QTM5M0IxMjlDNzY4RDUwRDcxQjU4NDlFQ0E2OENCMTMx
-NkZBNkQxQjgzQ0E5RkZCQUUKQzQ2ODE3ODM5NjI1OEUwNzczOTNGMEVBNkVGRDIzOUM1NTRB
-NzIyNTIyOTBFQzFDRUQyNDMwNjJCMUM0MjE0NzMxODVENEUwN0ZGQkE0CjExQTJBQTE2QTBB
-NjRBQTM1NTBGOTdENzc4QkQ3RkRBNjk2MkJEQTBCRDk2RjM1OUVDRUVEREEzNTA2MjQ5RkQw
-Nzk1RUFEMUI0QThENwo2OEJGQTE5ODk1NUYzNjBCRDFGNTdFRDlEOTM2RTFBNzY1RUIyQTEz
-RkQ3MzkyODc0RDFBRkI0NjE2MDBEMDc3QkVBODMxNzVGN0JDNEQKNzMyMzM0Q0U2RjBDODU1
-NjQxNEMzNUUzQThGMjYyNkVDRDg1MjM5OURGQjc4MzUyMEY5MTgwNzgyMkYzNEJGMUM5OUFD
-NUE4OTU5NEU1CjVDRTI1Q0E0N0Q5QUI0MTFENzRDNDg5ODQyQzg1MTA5QzEyQUIyNUIwMTA1
-RjZEODE2Q0Q5NjNBQjUzMjMyM0Y5MjM5Q0IzODYxQkEyMgpCMTExMzlGMzVBNEU5Qjg0M0Qy
-RDlCODMyREM4MUNFQkJCMDY0MDVCMEY2RjE5ODMyRTk3RUJENTZCNTg3MzlDODNEMkIwMTVD
-RUQyNzkKMjc2QzlFQUMwQzFEOTJCMTA5ODZBQ0I0MTBBNDZEMEMzQkQxNkIzNEI0QTQ4QzhF
-MkQ1RTQ3NDYxOTU5REIwM0QwRjJENzZBMzc1NTM1CkFFODgxOEVBRURFQzFFRUFEMTgxQjE5
-MzBDNTgyODc1MUZEMTAwMkExODA4N0EwM0QyODc0RTIwRUI3QzQ5QTAyOTAxQzkyOTczQzIz
-NQowOTAxREJEN0YyOTY1QkIxN0VENzhGM0NEMTI1NjhBRjE1QkYwNEM5RDM2NjM4MERDM0Mx
-ODRBOTdFNEE3MkU5RjhDQzAyQ0ZCN0VFN0YKNDk1NkNBOTI5QTZFMzJBQTJCMjgwN0FGMzcy
-ODk0QUYyRTlDMzdBMzcyRjUxRDlFNDVFNjg2MDFGRjZGMDY1MjQyMTBGMDU2N0I3NzlDCjk3
-NjYxOEEzMEI1OUQyNjlCODA4NzQxRERBN0IwMDM2NTkwNzIzNzQ2OTExMDFEM0QwOUQ1MDVD
-NjBBQ0JBRjdDMTIyQkY4RkQ2RUFENQo3MzI4RTYwQjY5MTY4MDgwNzE5QjZEQkZCRTY1QTMx
-QzI3RkEzQzQ1NkYzQ0ZGNEJFQ0Q2QjMyMDQ4Q0IyMEJFNDc3QkZEMzM3MUEwMTQKMEMyMkFF
-RkU5QjEzQjBDNzE4OUFCRkI0MzY5OUU0M0U1QjJENEFENzMxNjAxMkY3NTlFRTZDRDQ5ODI4
-NEM4MUFBNUFCQTgxOUNGOUY0CkM4MzNDN0Y2MkIyQUU3Nzk0RkU4ODhGMENFMEYwRDdGQTIx
-QTZDNkE4Q0RCMUFBRDgwMkZFNkQ4NTc3N0FEQjZEQzFDQzk1NTg3RjJGRApBODRBQzI2NUEx
-ODQ5RjY2ODczRjE0QkU4NDc1M0M0OTk1NjI1NzlGMjM2MTc1MUZCN0FDODA5MTA3RjAyQ0Qz
-RDk1M0U0N0VFRkVFREQKMzgxNzhGREE5MEEyRkQwMUI3RkFFNTIzOTVCOTcwQUI3QjRGOTIz
-MTc1RkFFMjk4MjhDRkREODI0RTIxQ0U5RkNDQkRCOURGOTg0QjFCCkY2NDBEODk5NUMxRDMy
-REM2NUFGMjhBODk5QzVFOTdCODI4ODg1NzA0RTY4QTBFQUY2MDU4MTkxQzFGNkQ3QzY2ODdG
-MjAxOURFOEE0RgpCNUY2NUEwNDY5QkQ4MjNFNzdFNkVGNkRGMTc3NTE3QUM3NzRERkU1Njg5
-MjNDNDc0QzlFN0M1RkNFQUE3RUMxMjQxOTYwMDkzQURDOUYKM0VDRUZBN0IzMzQ0RjVFMDY0
-QjhGRjAyM0U5RTFEQzE4NTY2Q0IxRkY5NjBERkJFNDcwRjQyMjIyMTBDNUE0MUVDM0U4RDRD
-NTZDRjlDCkI5OUU2OENGQjBBMjZEOUQ2OThEQkJFOTVENDA3RkJDNzdGOUFCM0UzM0I5NERE
-RDIyOTlDQkU0MEIwRjIwODY3MkFBRkJDMzZBQkYwNwpGMzlFQ0VFQ0UzQTJBRTBFREEzNEE3
-OENCMzg5OTM2NjhCNjA5MDlGRjFBOUZCMTBFRTc0MTZEOUExNkE3NzExQjc2QjdCQTAzRDAx
-MEQKQUUwNDU4MUZFMDFBMzc5NTM2RTRBN0M5MTNCNzQxRThBNjEzNUI2Mzk4MzAwQjIyQjhF
-MDdEM0IxNEE5M0JBNzYxOTVBQzAzQTFFQjFGCkUwRkUxRENDQ0QwNDhEMTYyOTRGMzY1MTc4
-RkE4NTNCRjc2RTdCOTIyMDdERjI3QTREMUVFNTg3M0M5QTQwRUJCNDJFMThDQjdERTgxMgox
-QkE1NEE0NzlFQzk2QTcyN0VFNTgxREU1NUY0NkY1MzZDRDk0N0ZFRDcwNkIwQzJDQkNCMkVE
-NEMyMzk5RkM4RDRCNjQ5Q0E1Q0I4REQKNkIzRDhBRDY0RDZCQjM5NUQ5NDVFMTMzRTI0QkE1
-NzM3N0U0QjgyQjc3QzcyOUFDN0Q1RUU5MTUzQjJFMEMxQUY0MDE0Q0RBODY0NzZGCkVBRjFF
-NTZCN0Q4NjQyMTgxNDA3MTg4NkVFMzBERDhFNkVGM0YzMUIwQjE3OTM2N0Y3NDVBNTI5MUND
-NjMwMEE1MzVFODI5MTJFODRCNQoyN0EyODNERDEzNjNDOEQ2QjUyQ0IyRkMyRkVFNTlEOTUw
-OTM5NUEzOEE0NkYyMzVBMUI0MzM4NDNBODdDMkYwN0E2NkJDMTIwMDY2QUUKQ0Q2QkMwOTM2
-ODA2MDUxMDAxQkVFRDFBMTM1OUU2MjZENzdBOTc4MjQxMjE5N0RFMTcyQkEyM0QwNzFFOTMw
-RDEzRTBEQkNGNTlDM0U2Cjc5Njc4MjlGNkM5MEI1MDBEMkQ3NkFFM0ZCNUU2QzkyNDBFRUU4
-OEFGREU1RjJDQ0IwNEIwMzZCN0M5RkFBRjY3OUU2NUM4Q0M3QzAxMwozMzlCNTZCRTI4NUQ1
-Rjk4NTQwOERBQzAyQUVGMTBBODY1RUQxRkQzNENGQzAzRjA4N0MxNzU1MDlCMkVFRkIzNzQ0
-QzU4MEIzMUIwOTcKMzI4RjM2MEU5OUE0ODBGQkQ3QTg3N0REQkU3NThFNjU3NDlBNzUzRUQ4
-ODAxRjY0NTA0ODhCQjgwQzUzMDNCMDUwMTFFRjVDNjgyMEY1CjAwOEI3MURBM0U2Mjc2MUI1
-NTk4NDNDNTlBQkI3RTk1RTQxMzY4OEM0MDkwMzUzOEY0NTI0MzBCNjVCQzFCOUNGREM3NzA1
-MUJBQUU2MAo5QzQxM0UwMzcwRTY0QjU3QzU5RTdFMDJCN0IwNzc2OERBODQzMjYyMjFDNjFF
-OEFEQzBCOEY3RTNCM0YwMjg5NzMzMEY4Mzk3QkEzMTkKOTRBMDc1MTE5OTk5ODkzNTA1RjVC
-NjY1QTkzNDk4RTk4Qzc4RUZBOEFCN0IyNjdCOTlDN0UwNzBDRTJEMjY5MjkwNTI0OThCRTMz
-NkJDCkVFN0E4MUZENDQ4NTcyRTMwMkQxNzc5QjQxM0E4QUFBRkMxRDAwNTQ2MUUzREQ2M0I2
-NEVENjk0Q0VBODJDQTk2MTg0MjFGRjQ2NUI4NAo2OTczOUE1RjJCREQyRjgwRkRDQzY0QTJB
-NkI3N0IxNjRFOEYwNDkwQTNGRTcxOTc5NzFDMEUyN0JEMTQ1OUM3Q0I3NTZCNUEzNDYwREIK
-RjkxNEM4NzM2RDdGRDc0QTQzNzE3NDFGNjcwODQwQzdDMTU0RDcwRUJBQkIyQjA0MERDODY0
-NDgzQ0JBMUFFOEI2MzBGMzg2OTlCRThDCjAzMTZCRjVFMjVFODFBQ0U2NDgyQjA4NEU3MEYw
-MDBENjEyMUYyODA0MzdFQTBFNDNCM0YxNEI1MDUyQTYxQkYwNkMzOTc0RTc1M0ZGNwo1NTdF
-MTFGNzBENzBGRTI5NjUyMzhBRjE1REUzQTRBOTY4NDI3MTM1OEU4MTM0N0FDREU4MjQ0ODBE
-NTEwMDYyMTE4NDA2NjFENDhFMEIKNzU4NjYyMDg2QzU2ODgwNjVBN0M1QzAzMjE3MTI0MDcz
-NDk1RTNFN0ZFRDcyMzgzRkNCOEFBMjQ2RjI5NzM5RDNBODNEQUFGOENCOTY0CkEwMjNERkQx
-MzFGMDIyMTIzQkZDQzc4MkNDMjM3Q0Q3QzhDMDYxMUFFMUQ4RkQ4Q0MxNTIxMUZBRUUxM0Q2
-OTQ4N0Y5OTY5NUZDMzJGQQoyRDJEMEVFRkEzNjcxRjU4QkU1QTEwNTE3Rjc4N0ZGQkEwNTBC
-OTQxMEQwREU0RTRBQzJGNjcxQTIzRjFBMzczMEY5RTUzQ0UxRjA3M0YKRjZEODI0RkQ0Qjc0
-MkI4NTA5Q0VDNzNBOEJDM0Q3OTAxOTgxRTVDNDYwNkU1REYzMUNDNDIwODIzNUZBMEIwRUQ3
-ODREMUI0NzE3MkY1CkI4QkUxQUU0NjBGRTE0NUYzREFEMjgzNTE2MUMyOTY5NEQwODc0ODdE
-QjdBMjNGODFBMjE4NjI2MDlFNzU2N0NEOTIyQkM0MzkwRUIxQQo2OThGMDcxOUFCNjZFQTAw
-MUU4OEY5NzE3NzY1MTY0RkY1ODJFNzVCOTM0Q0Y2NkVCQzE5MjFBMDBERkU2NTI5NDA1MDBD
-NEM1OEI4OUQKQjZBMzQ4NUFEODA3QjkwNTM0MjQ5NjY4MzM4NDdCOUQ5QkIzMDk1MzBBODFF
-MUVBODE4MDI1M0UxMDhFODRFRTcwRkZGRTgxODgwODcwCkVGNjk5MDhERjkyQTQ4MDMwQkY2
-MjQwMzA2NzQ5NEMwOUQ5OEE4OTYyNDBFODQ4RTNEQzQwOEZDNDVEMjM3Njc5RjhDNzE1QkU5
-QzAzMQozMTdEQjg4QThDMUUzOTg1NTgwQkVFNEI5QzFEMjA5NENCQjYyRkU2QTVENkM1QTM3
-QzM4RjgwQTQxMEQyNjdEMkQwQkQ1MDJGNjFDODkKRTkzN0M2N0YxNDJBRTg3RkRCMTM1M0NE
-RjI5MTA2RjQzMkY5REEyNDEwRjY5QkMxQjJBOUYyRjZFNTZGM0JFRDJDMzdCQUFDNEE5NUJF
-Cjc3NDZBOThCRDlBREYzRjQyRTgxQjc3QzcyQUJBNzM5MTk1QTE4ODUyMTQ1OTY0QTE4RUVF
-MjQyRjFEQjg1OEZCOTc4QUVEREVEQjVBMApDNzM1RjEyN0U2RjI2QjQxNDY3MkQ3MjdGRDAx
-NzU0RDFGNEU2RjFGNzYzRjZGMTQzODBEODNCRjAxQkZDNEU1MjVBNTEwNTc5QzVBQjcKMzA0
-MEY3RUZCMUJBN0UwQUYxMUQ4MTQ4M0UyOTVDNDY3RjU3NjAwRDlDRUIxQzkwMzY1MTNBNTFE
-RDJEMjNGRTVCNDYxQjlBNjExOEY2CjhCNTA2QkREMTM1N0ZEREIyNTREQ0JEMkYyODhCNERF
-ODlDMzA1RTAyQjY1NEVGMTFBQTBBOERFNTI5QjA5M0JERjc1QkJGNDk1QTU3NApGRTIyNzND
-OTgwMzZFM0Q5OTA5NTZDM0ZCODMyRDhBNTJFODQ4NjQ1RjFGMzcwM0E5MDdCREZFNTIyQTBF
-NDBBNDZGNjJDNjYxQzBCNzUKRTkyNjZDOURBREQ4MTFFQzhFRDZENjc1MUYxREZFNEUzMjdD
-RENCMEIzOTYyQzZBMkI2RDVBQTc4MEEwRkRFODE5QzE4NzAxMTFGNzg4CjAxOERENTNGMUE3
-NzI4QjQzMEVBRjFEOTU5QjNFMUE1MUFGMjZDQ0ZEMjZFQUU5QzQwODNBQUFCMjgzRDFCREY5
-NERCRkUxNzI1NUI1MwoyRUFBRkUxQTBCOUZCOTUzNUMzQTc2MTJDRUQ4MTg2ODU0NDdEMDRB
-RDk4M0MyOTlCRTBGRjEwMTIxQ0IxNjcyNDRBRjgzM0JGQTg0QTUKNTg1MzcxOEQ3NUZENTFG
-ODNFRUJCOTk4NDA3MDE1NzlDODU2NTU4OEMwRkI0MjkxQjlCNUNEREYxOUFGN0IxQzY3OTNE
-NzRCMERDODBFCjQ2OEFCMzU2NzE1MjY1MDU1MDUwRjRBQjU1NTY3QzY5QkFGREQ3RTYxN0U5
-MzVCRjY2ODJGOUUyQzRDQzI0MzI0NENDMjQ3MjY3MDE3NAo2QkEzRTc0M0E5NjAzQzQzMDk1
-QkI4RTZEOTg2MDA3MTdENDUyQzVEQURCMjM3MDM2ODg5Qzk3NzhGN0JCOEJCMTZENkMyN0I5
-RDg0NDcKOEU2OTA1QjUxN0JCRjYyNzQ1NUNDMjFBNTI0NTJENEQ5N0JDRTRDQzM4OTkyMkRF
-RDFFOTUwQzY2RjgzM0NBMUVDNEIxMzVDQTUwNEExCkYxMjA5OTUzMzhEMEMzQTlBODFCRkM4
-MUQ2M0ZGOUU2QzUzRTRFRjZBMDdDNTExMjE0RjVFNEQ3QkI5REQ2MDMyNDU0NTQyQUI2NDlG
-Nwo2RkYxREEzOEZGRjk4RjlEMTA0RjVFMDM4QzIwNzRDMkM0RDk3MkNGODREODEzQzVENTEz
-NkFGRDIwNEQxMENCRjJCNTg2NTA0MEMwM0IKMTg4OUFERkQwMEM4QUUzNjEyNTQ4NTY0NzZC
-ODFGRjg3MDRDOTRENkVEQ0U3RTlDNjQ0QUQ2OTc5MUQ1MTk3OEYxRTE4RjdENDNGMzIwCjAw
-RjYxQjA2ODM1MjMzRjlFQzczQUExRUZCQjEzNDU4M0MwQjJERTM5ODM3QTVBM0I2NTI4MjlD
-RTNFM0M0RkMyOUMxN0MzNzkyNTY1OApDQUVFRjUzRDU5N0M2NzVFNjA5QzE5Q0I1OUEwNTIy
-NEY0N0M3N0Q3OTlBN0VDNUJFMEY4RUU5NDI3MUFCNEUwQjJDNTU3MzdGRTVFMzUKNjkyN0RG
-QUYyRTc5RjgxNUMyRkNCOThDMTk0RjI3NjEyNjg0RTRDMzM1QjhBOTVGRDc5RUE5QTVDNTlG
-Q0I3NjFBMEQ4NUMzRDFGRTI0CjE4NjNGQURDQjdCODMyRkZGOUIzQjg5MkExRUUxRjAwQkNC
-QjUyNDIwMzVFNDBENjc4Rjg1NTJBQjQ2MTA1MzcwQjVEREM0OUQzMEZGMQpFMzhDMzg3ODEw
-MjQ5OUVBOTc4OUE1RTE3NjcwMTE3Q0Q0NDQ4RTVBMDREQTY4RTY2NzA1QzFCNUVGQzc0QjUw
-QUI1NTY3MDA4MzQyNTUKMjkwMjlDQTA3RDY0NUJFRjMwQTBCMTRFMTczOThENUJGNEZFOTBB
-ODE5RUEwMEIwN0ZCREM4NDU0RjkwMjIwMzg2Nzk5Qzg5RDNGNTU2CkJENkIwREYzMUNFN0VC
-NkQ2MzdCQUM1RUNFRjQyRDRDQkU0MzdDQThDM0U5NzUwQ0ZENTk3Q0Q1QTY2MTE5QUU0NURF
-MzQxODcwMkVCNAo3Q0Q3RUNDOTAwRTIxODNFMEQzQzlDMTM5QjhBNzU1MUI5RDVCREJCNEFC
-MTdFRUQ3NjVEMUNBQkZBNEIzRjUxMzQzNzhCMzBGREY2OTYKRkUwNjBCNkQ4MjNBN0Y2RDM1
-Qjg2NjUyNzYxMEIyOUI1RTY5RDU3MTFGQzgzNEUyQzYwQzExODU3ODg4RUJFMkFBOURDREI5
-ODVBRDVFCjQ0MDA3QUVCODlFMTFEQTA4RjY2NkIwNDk0QUJCRUU0QzAzNDg2OTJBNkE5OTAy
-QkI3RTREMTQ3NEU0OEE0MTA5MjhEMjE1NTk4Njk2OAoyQjQ4QkFBQzEwMDkwRjJGODU4NUQ0
-NkJCMTM2MTIyMjAyNDE3NjM3NjY0MzNBN0YyMzU5OUE0NjJDNUUzOUFFQjhEQjcxMjk5REM4
-RUYKQTI2OEVFM0IwQjhBNTIyQjVBMDg2MTk0ODNBQUQ2QTA0Q0YxMDdFMjY4REE2NzUxQUIw
-NDk1NDI0MUNBQjg3RjY3OUZDQjA0MTQwRDFBCjdCNEU2RUI2QTc1Qjc2NTI1QTg2QTFFNTI3
-Q0U1NkM1NDZFNkRFM0Y2QzQyQzE3MTUzN0M4Qzg2QjA0NkFGQTMzOEFBOUE3NkM5N0ZCMQpF
-N0JGQjE2MUZBNTdFRTM4QjNBNzVDMjNGREM0QjQ5QkJBM0MzNEUzNDkwQTBBMDQwRTU1NjlF
-MjQ1NkFFNDBEMjg5NDY3ODQ0MDhFNkYKMUM3NUQ4QkY4MTMxOUUzRDNBOTQ2QjI4NjdFODg0
-QjU4RENDOTdGODQ2Njc0QUM5M0YyNTcwMTI2NDgwQTA5MzJEMUNDM0RDQjk0RUM2CkU5MUFF
-MURDNEM0NDJBNTZCMTVCRkMwQjIyQUU1RTg2QTQwM0NCOEEyRTdFQUFBQzk5NkRBOEY4REE1
-RjdEMTQ1ODMwQzA2QTdCNTBFOQo5MTNBOERBRjYzRDU5Njg3MUMyMzJFQkFBQkZENkNCQUZD
-OUFEQkVERUQ4Qzc2NjJFQjM5QkQzMDZBOUUzOEM5Q0Y5RjcxRkQ3MThGQUUKRDg4QjQ0MDlF
-NjRBRkY3QjZFMDdFQUQ4MUQzQTUwNzEyMTkzRjlDQzIzNDMwM0M1NUNGREZGQjBBM0E3ODI5
-OTQyQzRGQzU1QTg5Njk3Cjc5OTYxQUM1M0NGMUZCMjU2NkE4NTEwQUQ4MTA5ODlENkNGOTA2
-N0E0RDcyQjIwQzBFQjFFOEY0NDAzOTRCNzFBMDgzRjg2NERFQTJCMAo0NzZCODA3NDU5QUVC
-NzdEMERDNjg0NTRGMjI2RDA0QzNENEJFRTU0QzlEMUY3RjkwMTNBOEFFMDFFMzc0MzVDQjkw
-NDcyRjM1Nzg2RTYKNEZCQjA3NzFCREIyRkNFMEFEMDU3RjkwN0RFREYxOEE5RDg3MDZBNDhB
-Mjg4RDgyQTQyMUQxMjZEQjQyMTExQzdCQ0EyMzMzQzdCQTkxCjBGNzlCNjczQUMyN0RDMkIx
-QzA0NTI2MjFGMEJDOEVBRjg4QzdFRERFRThFQTg4QTMxQjNCRDdBRTUwOUQ2ODk1OTEwMkU5
-RkYzQ0ZBMwpDRkU4MUJFREJDQ0RBNkE3NDJDMzEwN0Q1N0ZEQzkzRDRFRkIzMjhDODBBNUY2
-NTJCNEM1QjYwN0E3RDM2ODVEQTVGREQ1NEYyRjBEMjYKRjJCM0Q3MTk4NThFM0U5MDJCN0ZC
-NDlFMDZCMUI1REM3QTNBM0MyQ0U1RERDNDcxODE2QzczOUFGRThDNUE2MTdGNkExMDlENkQ0
-MTJBCjI5OUI3OEFGOTk3MDdBNjZENThFQzQwNjE1NUJGOUUxMzQwQjBDREM3RUNGQjRGRjFB
-RDNEQjBBMEQwNTE5RkJCNUVDNjUxM0Y5ODAxMQpERTBDMzdDNjVFOTdDQjdDQzZENjhDMjI0
-QjFENEFEOTZFQTk3MTI3MEJDOUMyMzA2RDBGQkQ2MUY1NzlEQjMxODI4OUVEQ0NCNjUzMEMK
-MzY4MzRCMzk2MERGMzhCQ0QwQjdGNzIzOUU4NEEwQTY0RUM2NEMxQzZDQ0MwODdBQjY4NTg3
-MDg2ODdDOEQwMDgzMTY4NjM5MTczMDZBCjlFQ0ZCQkY3MjYxRkNBRTc3RTEwQUExODExMkVG
-M0M0NjNDRDg2QTZCOENDQkZGOUU0OTdDOTREMTQyRjQ0NDFDRDMwREYwNzc3QTExNQo2RTM5
-NkVFMDU0QjBDMzAwMjFGM0REOUI1Q0RBRUM2NzU2NDI2NEYzQUEyRjEyQTU5MDBGOERBRDg1
-NTQyRUFFMDM0NEIwODZBNkYxN0QKMjhDMjNGRDlDQTJGRkIwRTc0N0I4RjdCNDdBRTk5NDY5
-RTVBRTg5QkM4RDNBRjgwNkMzN0QzRUJFRTc5ODI4Q0VGMjYyMjkzNjUwMzcyCjgzQzk2NDI4
-QjFBNDY4NjUzQzFFQzk2QTMxRkRFMjc5NjgxMzcxQzI2M0FCNUExOEYwRUE4NkU0NzExMUVG
-MDcyQzcyQUVDQUMyNTg0MQozRkQ4RTgyOEY1Q0EzOENDM0ZGRkI4NDcxNDhDNjhEQ0NBOTA1
-MUNDQzVBOTcxQzgzRjMwOTg3Qjg3NEM2NjQyNEZCOTEwQjU1ODgxOTYKMjY3MTk2MEE3QTk1
-QTBENTM1RDAwNzk4MEE1NkU1QUIyQTJDRDA1RTk5NEIyQzcxNTU2RjM4OTY0MTYxRDQ5NjUy
-NzVFNjcxMjMzOEM2CjE0RDQ4NDZGRDg2QkZGQUI3QUU4RDJCRTFDNThDMjU5RDQ2RjdDRDQ3
-REIzMzEzNUIzN0UyQ0ZGQTc1N0M5NzZGODYxN0I2QkIwMDdCNApFQzM5QjI3Nzk1ODYxNkRB
-RDEzQzBDOUZFRkY4OEY0QjBBRTFEQUY4NzdENzEwODE0NzRERkE0OEY2RjI1NzczNDBBODVF
-RjcxQzRDRDYKODY2NUQzNTUyMjlFODRFMzA4RDc2MjI0M0JDMEVEMzg1RjE4QUMxNEVCNjZG
-RDMxQUI2RjI0RkQ3NTYwOUYzODlCMDdDMDJGQUEyRjM3CjZBODg5N0MyODY5RjBCNENGMTYw
-N0RFMzhGRDQxQ0ZGMTcxQjBENEIzOUNFMkEyOEIyQzM5NUE3RkNFM0UwNEYwRDdBRTZGMEJC
-NUQyMwo5RTYyMERERTc5QjJDRkQ1QkRDQjU1NDBCQkYzRDJGN0M1QUJCMUY0QzM3NkRCMkQx
-NkJFODIzREVDNDhGNjRCRjkyOEVCODlGMURGRkIKMjI4NDVCRjk3NzQwQzAxRDU2QjMyMTMx
-MkYyNkNFODkwQ0ZGODk4NUQxNjNGNDA2MjY4QUU0MzE4QjEwMzEyNTA4OTMxOTI4N0ZCMTky
-CjNGOUZBQTg3N0RDM0VEODYzODYxQURDRkNEQUU3NjE4RkFGRkFCMzU4MTExREU4NDIwQTVC
-NkU1OUNFNkExQjQ4N0E1RURCMjhGQTgxMwo2RkM1NzMwNzdCOEYzNkZCMDAxN0UzMTE5QjU2
-MDIzQjJFMEUwRjI4RjQ0MjNDMTFBMjY0QjlCRUE1RTY0NDZBRjdFOTA5OUIxNEZFQ0QKQjI5
-QTBGODg4NEE4ODI4MDg3QTYwQ0ZCNjlGQkY2MzM0QzVDNkU5RDc1NEVERDQwM0JGRTAwNzU5
-NjFBRkY2RTk3NDVBMDQ3RjY3MTBFCjREOTRFMkM0MzMxOEU2RUQwQUE2ODBCNzA3Qzc2ODU4
-OEE2NzE2NjYwQ0I2NjM1MkM4RjZFNEI4MDA5QkI3NjE2MTFENzU1RTcyMjM0Qgo0NUJEMzVE
-ODRGNTc1NTk0NDFBNTcxMzk5ODMwQ0U0ODUwMDhDMkNEMzVDMkY1MEJFMzhERTc0NDNGRTE4
-NjI3NTZFNjU3NzYyNkUxM0YKMzhCMENGQjVFOTA0QzZBNTExN0UzNkE3QUVBNDFBMEJEQUND
-MjVCMERDQTYxMzgxQUFFMTM1OUE5OEQzOThCOEMwNEVEMzA2MEY5RTY5CkE4MTY0MEJFRTZE
-MkQ5N0MzMDAzMDY5Qjc2M0MxQTAyNEY0NzZDODIxNTU3Njc2M0Y0QzhFQTYxRDUxODJBQTNF
-MzRCMDNFODE0QzhBQQoxOEE5NTBDMEY5RjVFNzIxMkJCMDgyM0E2OTc3MDlEQTY0MzNFOUUw
-RkM4RDg2RkZCQ0U5NEQ4QjBFMjQ5QTYwNUU0RjNCMzhGQzA0OUYKQkJGNDAwRTlBMzIwRUNC
-RTEyN0FDNTBDQUE5RkIxRjVBQzEyMDdBOUU2RTdCRjQ0REM5NEQwMDg3MDlFNjk2NzExQjg3
-RUY3NDVFMTdBCjhENUIzODYxMUQ4M0U1RTI2RDg3MjBFRURGNEFENjQ1NUU4Nzk0MzI2RTNE
-Q0NCMDQxNjc5MzVDQjczOTg0QzcyRENEMDM2QjI0MTkwRgoyQjRGQTY4OTZFMDFCMDE3NzdE
-QzYwMzJDNzAxNzEzMjgyOUZFOUIzNzBDNDlDMjU2MjA2MDBBOTk5Rjg3RjFBN0M3NzkwRDA0
-N0Q5NjAKNEVDN0EwNzQ2QkZEMEQ4NUUwMkE2MjZEMTUxMzA5MjE2OTlBMzNFRDM5RDE4NjM0
-RjU2RkM4MTQwMkU1ODlFNjY0NEQ2MDU0MTJFNTNBCkZCMzY2RDVBOTk3N0UyMjA0RkY3REM5
-NDlGQjc1ODdFNzY5NTBGMDEyN0NFRkY4RjNDQURBQ0Q2N0QzRDNCNDQzMEUzNzVFODBGM0Ux
-Nwo5QzMxRTY5RDMzRjIwMzRENjJDRUY5NzExMkEyMjMwQTRFQUFEQ0EzNkM3MTU3QzQ4OTQy
-NDVDNkQ2MDc1M0FBQUNFQTYxNDlGNTY0NkQKQkVBNkRGNTc5MThFM0NFMjBBMTg0RDY1QzIy
-RUYzN0U2QzFDN0I2MTg0NTc0M0NGOEM1MkRFNDJEMTIxNkMyMjg3MEMwRTdBQTJGNUMxCjgx
-RjdBMTVEREM1NzAyMEEzMEFGRjhENEY2NDYyQjM4REE3RTcyQzFFMjkwMjFGMDI3NzIzNUY4
-QTE5OTA4OUI1MzY1RTdFNjdFNUIwQQozRkE2QzIyMDkxQkEwRTk2RUNGNDlENzE2MUQxMzRC
-N0ZEMTcwMTM1MEZCQjJGOTlCNTRBNTFCNDE4QjU2N0I1NjQ3RDdGOUFEN0I0RUUKNURENjcw
-REY4NDY5RkMxODc3NEU4QUI0RDZFRjRCNEY1NzUxQ0YwMTIyMEFGQTVDM0RFRkE1Q0ZDQzI5
-RjdDMTgxQjY2N0ZCOUM4NjMyCjVCRjRCQUMxMEFGMjM4QUIyRDJBNzQ0QTUwOTQyN0Y2NTRG
-OUI4NUZDOTA4RkREQTYwQjMxQ0M5MkU4MzdBNzhEMzg2ODRDODRERjM4QgpGMDE0NDMwQkM0
-OUEzMDQ0NTdCMkU3RDlCNzM5QjA5MDJENkJFQTA0OTJENkMxNDNCN0RDQjQ2MkJEQTdERjBD
-NTRDM0M3NkE1MkUzNTUKNEYzQTE3NDk2NTZEMTUyMDEyMTk0ODEwMkFERTYwNUU2NTk3OTM2
-RDdDQ0NBNTFBQjdEODBBNERBQUEwOTk5MkI5MDVBNDkxMDk5QUM3CjEyMEZFREE4OENBNTYx
-QTE5OUNBRjNFQ0Q2QUVDN0I5OTk5NEE4NDE2RUVGQkJGOUExQkRDRUM2NzFBNkIzRkY4REVD
-NTlDOURGRDc5NQpEREIyNDkyNDdCOTE4QkU2MzdBMjA0QzI3NUQ0M0RCNTUwNkVFOERDNzg3
-NTI1QjNFNjc5Q0NDRDNFRDQzQjU4MDk2MjgxRTJCQUIzNTgKQzUzMDM0NjVFNDZEQkVGNjk3
-QjVERDMzRUY4QTY0OERENzA1MzIzNEE1M0IxNzk1MzlDNDU1RUI5RTFBMTdCNzJGNzA3RkUz
-MENCOTVECjBDMjg5MTFGODY0MzM4OUNDNjk5NUM1OEM2QjgzQzg4QUZEM0M1OTQwNTJGMzcz
-Njc4ODJDMjZBODkzNkE0NzlFNDI2OTk3RDg5RkUwQwozQUI5MDkxRTQ4MERBRjkxOEJDMjZB
-ODdDQUVGN0JEMUM2NTgyQzczRjc1Qjg1RDU5QjcwOEQ5Qzc2Rjk1MzM3NjM0MUNCQUZEMjBG
-MUMKODg3NkY2RUU1MzhGNjEyODNEMDNGREFCQjNDQjI4ODhDNUYzOTQyQTY3MDUxN0U4RERD
-OThCNjIwNDM5NzAzOEI5NTFFMDIzQjQ2NTFECjhFM0YxOTczM0M4RDY2MTA4MjczNDg4ODFC
-NTcwNTcxRkEzNTlDODQwNTY4REVEQkFGRTk0MUI5REM3REFEOEMzRTFCMTkwNjA2NDIwRQox
-REFDRjM5NjUzMzdDNTFBNkJFQUYyRjJFNUVDNjBDREY4MzlFMkRFQzlCMTMwQzIzQkVFOUY2
-NUI0NjYyNkQyMDI3M0EzQTVCRDM5RTMKQkIyNDdCMURFMUNGOTI5NUM0MDlCOTFBRjQ3QjM4
-RDQ3MjAwRTBEQ0QzMTdCNERFM0FDRDc1MUU5NjdBQUY5REE3RjZDMDI2RDAxMTcxCjNFRTBG
-ODc1RUZEN0IzMUI3M0FDRDY2QzZCOTU5NDg0OTJCNTRBN0I5ODY1QjNGMzJERDcyMjkxM0Yz
-RDlFRkI0MEU0RjAzRkY5RTkyOApBQUUzQUMxQzRGMjM5REQ4OEJBRDUwQTJCQjQ0MkQxQTA2
-NjFCM0Y0N0NFMkJDQ0YxQTc2QTg2MDRDNzkxMDg3M0JERTJDMkVGQjQxMTIKNjBDOThDNzUx
-OThFREY1ODQ2RUY2RUJDMUJGOTQyNTBEMzRGNjQ2QTQzRDAwRTNBNDJBQ0M0RTNFMUE0NEEy
-QjBCN0ZENzQwMDNDNjFGCjAwQUJDOTExNEI2OTM2QTUwQzY3NTQ0RUY2MkZGQjJGMTlDRDFF
-NUFDNTVFQUVFNTQ3QzQ2RUQ5MUExM0M3NjAyNUFBN0FFOTVFMEIwQwo0RDI0MDhFNTNEN0VD
-NDg0MDlEMjFCMkRFQkIwNEM3MTIxNDg3QzUwQUM3RkE4NzkwQTJFRDU3N0E5QUI2RTQwNjNG
-MURCN0JEQzc3QkIKNDU0MkVDMTU1NzNDM0YyRTNDQjc2N0RFNTJERTJEQ0NFMDRGMzhBNThG
-MDZGMDhGMEE1NDFBOThEMzUzOENCNDFBQTVEQUIwNDUzOERDCkVBRDFCRDZCNDFDNzE1NDJF
-Q0Q4MzRGODIxODRBN0Y1MUE0QjUwQjU5NUU1MEUwNEE1MjM0MDk0MDQ5RjEwQTFFOTFCQ0E4
-QzJGN0JGQQpBQjYzOEJCQURGNkREMDJENDlCMkNDNDA2RTlGRDQwQjczNEJBNzcyQTA0MjlC
-RDk5Q0NEMDFGMTEyRTFFRTk1Q0I3RTlGNDhENUE5QkEKNTg0NjM2QTAzQjUyRjk0RkJDMDcy
-NEExRUQwRTVFMDUyMEU1QkFBNDMwMTc3M0VCOTg3MDlBQjAzNUFGMjhENjE1MjMwRDNFRTBE
-RURGCkNEMzMwNTZDRThDMjJBMUZDOEI3QjNDMjI1NkJGN0I3QzdDOEQxQ0Q2NjlBQjM1OEU1
-N0ExRjZBNDAwRDE4RkE1OUZENURFQjBDMjYwMQowMkM1OTExMjIxNkJDNkU4QzA4MTdFQjVC
-RTM0MjBCQTBDMkE0MzYzMDIxRTU3RkY4M0YwOUI1MDI2NTI2Qjk0OUJGQTMzNDJBNzBEQzgK
-ODFERDU4ODgzM0JFQTUzRTA2RDI5MjU0QjQ4MDIwMThCMDAyQjA2QjYzMzc0QTZDNkYzMzU1
-NjI0NzlEMDM0N0RDN0MxNEUyRTM4NzJCCjRDNEM1NUUxOThFQTI4QjM1QTNCOTRDRkE4OERE
-M0Y1MkMzQzE5MjQ3NUI2QzhCNjk2OEI0OUQyRkIxNjIzODU1RTFEMTY2Mjk0RTFFQQpDODMz
-N0IzREY5QjFCM0YyODExNDI4NkZBMjRDN0E1NjczMUYwNTQxN0M0MDg3MkRGMDlDNTVDM0U4
-MUQ5M0M0REQwMTdCQUM5QTJDQjcKNEFCRDEzRTk2MjJEM0M1MzNFQzYwQjRBNkMwM0UyNTNB
-M0U1ODZEODMxRDcwRTQ3NTAxQTFCNTIxRTJEQTVENjdCQjE5NDk1MDNDQkMxCjY5M0Q2OTM5
-MjUxMzA5MjhCQUVDNjM5RjgwREI0MjBERjEwQzg1NTMzODVFNzlGRjc1RDhCRDk3MDA0MTQ3
-NDc1NzE4NDAyMEZBMDNDNwo5N0VDRTEwQzhCNTRFM0FDNTZGMzMwMTQ0RjIyNTNCODE2NDQx
-RDc1RDBFQTU1RDczNDJFN0NENzRCM0I1MzExODk2QjQzRjRCRDFERDMKODJBNkE4QTBDMzc5
-OURGMjRCRTRENjU4RTZBQTJBQUM1MTIxNUMzNDk1QTc5Q0EzMjM5MjdBNjkwMzQ5NTlDQjAx
-RDU5NzhFRTFEQTlGCkIyOTg4NDVBNEEyQjQwRUZERjdCODU5OTYwOTQ3NTZDOTlEREEzQzgz
-NUVBQzM5ODI2QzA0OEZGRDVDNUM1ODJEODY5ODE4ODA0ODI1NAo2NjM4N0VDMUNCMTZCQzUw
-NjUzM0Q2MjRCRjIzMzNDQTU2QzM3Mjk1QkJENDFFQTVDODdEQUVDODBDMzY4N0MzN0JDM0U1
-MTRCQ0U0OEYKQjRBRkU5QkI1QjE2RTM2MzIxQjFDMEEyOUE0MjNBRDlBREYxNTcxOEJDOTQ2
-RDcyMEFGNUMyMEMxOTIyQTY4REEwRjM2ODM4RDAyREJGCjdDRjREMDE3QkQyQ0JCOTZBQjFC
-NTRCQzhCNzUxMzAxMDlBQjU3Q0U0RTEzNzEyQ0ZCNEZGMDk5Q0JFODI4MkMwN0QzQzYxNDE3
-OTQzMwpCMjYzNjk2RTdFM0U0NTQzRTQ4OUE5QkJERTBBRURFNkVDMEYxNzIzMjE0QUMwQzFD
-OEY2NjJEQzA1NTg2RTc1NjRENDA1RERFQTlCQjAKOUQ3MjdBRjVFNzVEN0E1Rjk3MEZCNDEw
-RTFEQUQ1MkJCMTNFNzlGQkZENzMzNDAxNTBFMkZBMDhFQkE5NEM1OTEwMEQ3Q0M3NkJFM0RD
-CjVBRjRDNTgxMUUxNzVFNERBM0M4NTczMjA1OTNDNUUzOEQ2NkU1NjVGMUMwNkZDRkU5QTFC
-OEM4ODVBMDFFQzMwMjFENEEyRTZBN0FFQwoyNENGODMyQTZFNzMxNzMyODM1RkMwQjY3RTRE
-NzI2RDhGMjJGQkVDRTVBQTY0RUY5NzI0MDdEQjQwN0VDOUY5ODc2QUFGRjJGQ0FDMzUKNEJB
-RkU0N0ZGNzVGMDZBMTdEMkZDMEIwNUEyOUVEOTYzQzczRjA0NjFBQTU5OUUwMDUxRTQ3RjU4
-NTRDOTc0NzI0QTVBNTNCNzM4OTA4CjI0RDBCNDU4QTI5OUE5OTQ4MDc1OTZEQ0VGMDdBMUU0
-MEM1RkU3NTU3RTk0OTlENkJGRjc3NEI3OTE2RjA0RDU4NEI4MThGMERBMTI4QQpGRjg1NkI0
-OTQzODVGOUE5QjJBRURDNDY4MEE2Rjk3MkUyNTQ0Q0EyNEU5NTI3M0QzOTRGRDVCRThEOTA4
-M0Y5RUE4MUE4RkJGNDRFRTIKOTQ3NzE3NjdENkZBRTYwNjE3Qjg5OTc0MTdFQzZCQzc5NkVC
-MDIwOUU2QjhEODc4REFDQTY0MUVDMzI5QjBBRjk0RTMwM0EwQUQ2MTFECjVFMkMyQzhDOTAw
-ODU3NzMwRDFFRjExRTIxOERGN0YwRUFDRjdFNTVGMTBCNUY3QzU2RTZBRjQxNEIwNjA0NTND
-MEVCRTQ4MTE4Qjk2NAo1NkQzOEM4QTkyM0Y0MkFDNTc5N0YxM0M4Njk1NUY3QzFGRkUyOTg4
-MUFCODI0NDkzNzdGM0M4RTlFMDg5NjdCNkY2NkZFOTI1RTlCN0QKNDc0Q0Y4MEJGNEY5QTI0
-RTQxNTgzNDg0QTBBRURCOEVEQjAwNzVERDNCNzU2OUUzMjYxQTE3MDZGOEE5NUM2NjIxQzYx
-RUE5OURDNjcyCjdCRjUwQ0E3NUUzNEE2MTJEMDA0QzdDQjgxOTQxQUE0NTBGQjgyNkVGOUE1
-MUFGOEQzRkExN0RGMUExODRDRUZBRTMzRjlDN0U2M0JENwowNDUyNzk1NDIwMEZFNDM2MjIw
-RjJDQUNGMjM0QkIwODhCNURFRkI1MkIyNDQ5MjM4QzA4NzVEMzk1RjhFMjJGRUFFRjA5NkVE
-QkYzOTIKQUZENkZGNkMwN0VEMDQyODhGQjczQzQwMUUyOUFGQzJBNzZENEMzRDAyQzRGNDg5
-NTVBOEYzMkQzMjM4NTczMzNBQkRGMzAyMkJBRUEwCkFFNkU0NTMxQzE4QUNGNzUwNDE2QzU0
-QzgzNEQyNUUyNDYzMzNDMTM0NTZGMkI4NjZCOTU4QjkyOUFCQjhFNDk3OTE3NjIyMzY1QjVF
-Mwo4NkZGMjM1NTc0ODc2NzY3NTg4Q0IyNEE4QzA2RkUwRDQ5NUFBMzI4MzVDQzYzNjVBNDgx
-Nzg4RUEyNDk3MkZCOEJFMTI2NTlBQ0Q4RjIKMjg3QzIzMTM5NjY0NzM3MTM1MTQ5ODY0N0NF
-RTlGNjJDMjY3MEU4RUY0ODc4ODUzMEJCNUIwMDZEOTNBMjlDRDRBMkUzNTREMkM4NUFBCjBB
-QjJDODAwQUFGQzgxRjI0QzgwQTU4QzZGQkJCODlBODg3MjYwRDAwQzU5RUY0MDIxNzZDODBE
-QjNDRjQ0QjBBMjgxQkM2MDQyQkRDMwozQUVFODhBRDhBNTc2NzRGNjUyOTAzODZDNzMxOTMz
-NDYwODJGOTQ3N0VCMDRBOTIxQjNFRTk2MDM0OUJEQUI5RTUzMjZCNUM1N0UyMjMKNTI3QjFB
-MzE3MzE4MzM5M0FERjg2MjY3RjEyN0I1MkM0OTMyMEI2RUQzNjI4NUU4QURBRDA3QzBDOTFF
-NDc5MzczNjk4RTcwOUExODcwCkMzQjlGNjY1NURGNEU1Qjk2RTkyRDBFMkYyQTE1QzVENkYz
-RDg4QUNBRjZGOTVFOUJDQzUyMjQxNzk5RUI3MTFEQ0UxNUE2OERENTI0NAo2RTgzMkY1MDA4
-NzNCMDQ1QUFCQUI4MTZFQjY4RkFBNzVFMEUxOEI1RjMyMDAyRjI4M0Q2QkUxMjE1ODI3NThD
-QTU5QTY1Q0E0M0MyOEEKNjhCQjlFNDA3RThGNzY3MTUyQTM1RThBOTBFNkE2REVFQ0JFRkVG
-QTJDRTc3OUJDQ0I5Nzg2MjI0MEZBNzJCOTJDMkUzNDI4Mjk0REM1CjRBRDRGN0M2NjExRTJE
-NkIyNURCM0VCNDk5NUU4OTRENUExNzg2M0Q0Qzg4MzA0RTc3RUY2OTY2MzNBRTZGMjI0MzQy
-RDM5MUY3RTNEOAoyRkRDMjRFMjg4N0Y0M0Y0ODM0RUJFQzNGMkIzMkFEMTMzOTk5NTgyMjU1
-M0FDNjhGREE5NTFEQjRCQzk1QjAzNTVBOTk2MTEzRTQ4MDAKOEEzODdFQjhDRERBMEM0RDBC
-MjQwOUJGOUNFRTJCMzdFMUY2RjRCNTVFOUJFMjA5NkI4REI1QTYxN0YxQ0ZFMTJCRjkxQTIx
-QkFDOTIxCjQ1M0U0MkU0REQ1RUNCNUE0NzkwNzhGRjg2ODhCQ0ZGNTZBNENENTA0N0FCRTFC
-QjREM0VBQTlGQTAzQ0Q0OEZCNEEyODNGQ0U2RkZGMQoxODg1REFFNkFGQkYxQzcyRTgzOTk5
-ODhDMEVFNjAxMERDNDFERDU5NjUzMEZBNzZFQUU1NjYyQ0ZGQTM1MTQ2QTc1RTU1NDQ0MDQ5
-REYKMUIyMEM2QTk5RDgzOEI2RjhDNDExQkEwMjJENTBBQ0M4NDdFRjk0RTUyOTA4RTgzQjYy
-OTNFNzE5QzQzRTJDNDJDOTUzQTdFQjEzOTVGCkQ1MkFBMUI2RTY2Rjc3NjRCNzdDQTNFRDM3
-QzYwNkVGQjkzMTdDRDI3OTI5NDEzMzQ1Qzc2QUVBNDYxOUMwOEE0QTAwRUY3NzAyMDBCMgo2
-QkU3MzgxNTk3MDk2MUFGN0YyRjc5MTRCNjRGODRBMUJENDNGOUQxODZFQ0VBODY1NkI4RUJE
-Q0M3RUZBMzVBRDM1RDVFQkFCMENBMDIKQTE5OUJGM0Y3NTE0NDc4RDg5RUJBMDdCMjgyRjAw
-QjU1QkVBOTBENEU4NTQzRkVBN0U2RDQ4OTk0NDA1NDg4MEIwOUVBREE0MURCNERCCjA2NTlC
-OEQ5NkNFRDY3QzhBN0MxOERENUM0MUM1MEQ4MTQ5RTg1QTkwQ0MxNzg3RTg2Mzc1RUNDMzg2
-MzY5NDIwREU3NUFCNDRBRUJDOApBMUQwMzREQzgwNDU0NzkzODlFMjMxODgyQkU2OUMxN0VF
-NTdFQUJFMDA4NDhGMTJENDA0RTBDNDQzNDBFMjFGQ0RBOTVFN0E3NTE1RDYKRjYwNkM2MDBB
-NDg4MzM3QjRGRTMwRkRFNDBCMTlGMzI5NEE4MTAyREJGNTcxMDlGNDk0QzI0NTlFOTMyNTc2
-NkRDNzEzNzVDNDE4QjExCjRCMDA2MjBCQjdFMkIzOENFRkE2NzkwMTAwNjlEQjVDNkI0Q0VC
-N0QzMTcxNkFDMDVFMEFCOEM0MTFDODk5MThBMTlGODk1NzhEN0JDNQoxMENBODZCQTk5NkY0
-MjYzRDJCN0M5OEFCNUM4QURFOEU3RDVCOTZENDY3RUE0ODQ5NThDOEI1MTRFMTc1NzQxQUY3
-MTUxODdGMEU4MDcKQjlDNUIxOUI2MzJCQjQyQjc0NTE4NzY4MTcxNDUyNjg3N0VCRkI1NjhC
-MzEzM0Y0Qzg2RUMzREUwQzZEN0RBRTE2NjBGMUUxMDQ0NTIxCkNFREU2QjhFRDNCMDNDMTYw
-MzFBN0RGQzY3QzMyQzg3RkE4M0E1RTI5ODk4Mzc1QTVBNUMzRjIwOEJCM0NBNzE4QUQwNkQw
-RTdCRjJEMQowN0U3RjY3REM2MzlDNUQ5NTZCNzlGQjIyQkRDMzcyODQ2NjQ2RjYwNzYwODU1
-QTRGOUYxMzVGNkNCMUJCMEVGRUVEMDAzM0IwOUZDRjMKQTM0RTFBQTc2NTYwRjM2MTE1N0Uw
-QzJBMTY3NUJEOTRFMEJERDFDNzI5M0U3Njk5NTE2QTEzMDRDRDNBMERBNTY0NkFDQ0M5NTQ4
-NTZCCjNBNjJEMzhFQTg3OUVCMEIwNzI2NDQ3RDBFMTk4NTM1MTI0NTUxQkY2Rjk4MjEwNTRE
-OEI4NDVDNDQxQTlDMjQ4MUUxQUMzRTU0MkFBQQo1NTM2OTFEN0Q2RTRCMzAzODU5QTUwODZB
-N0FERTE4MTA2RjE3NDc0NUYzOEY2RTMxODJGOTI2MEZFOUU5QzE5RUVGNDUzNTlENkI5REYK
-REQwMDMxRDFGODdEQTg5MTUxQjFCRTRBRjU0QjY2NzBFQkQ1NThCQjMxOEYyMTg0RUNFRTkx
-NTJBQ0EzNUUwOTk5NDBGMDk0QUEyQUM3CjU2NDgzNUU2OUU1QzlDNDdEQzdEOTYyNUFDQjFE
-NDI0M0ZGMUQ5OTNDRjg1NDYzOUMxMjZERDhDRTIxQTAyMjQxMTlBQ0E3MzEzNDZBNgo0QUM4
-QzE4QUEyMkZCMUExOTY4QjBBNkIwNUNGM0ExRDVCMjREM0VBQTdDOEQyMzc2RDQyMjkwMjY0
-M0QzRkFCM0Y4RTdEQzhCMjQxNjEKM0RCQUJCMTcwMjM4QTFBMTlCNEM4QTQ3MDNFMkIwQTJB
-MDMzRTcxNzIzRjU1N0MzMTREQjQyQjE1OUU3ODRCMTgyMkJFMUY5OTBEMTY3CjBFNTIyQjlG
-QjFCM0E2MDJCMTBBRTA4QThFN0UzQjJDRkU1MTIzNkQ3NkI3NDQ0NTZFNUE2ODk5NTI5NDc1
-OEE0MkYxMDA0RTg4NjNDQQowRDNBRTQ1NUVDQUQxMzUwMTY2OUExREI0MUY3RTg1M0JCMTUz
-MUE0Qjk0OUFBNUJGMEE1RTQ3OEE1NzA1RDVFRTQ1MTA0NzYwQzcyN0EKMDY4RTcwNTdBODA4
-RERBMzBDRkJDMDMxNTdFMTQxQUM1RTlFMEEzMTU5NjdDMjExN0VFREIzOEY5QzY2QTM0RTEz
-OEIyOUUzREU2QTAzCkMzNEQwQTM3NzQwREQwNEVGOEY5RDA4RTU0NUZERUJDNTcxMDQzQTAy
-MTY1RTYwODYzODlEQzdCQTNCRkZBNTJEOTRCRDRDMUEyN0I4NQo5QjhFQ0M2Nzk5NEVCRDM3
-MDI3MEI1OTk4QjhGMjQ2RUE0RkUwRUE2OTYzQUUzRTMzOTg4NDVBNjI4NTYwNjhBOEE4NzhC
-NkY4OTRBN0QKMjgwNDFCRDMwQ0Y0RjBCQkI1MDUzQUE3REQ4NkEyQjk0RjM3OTRDNzhGNjE1
-QzY2OTI3NDYyOUYzOTJGQjJEMzIwQkI4MkVEQTk4NDVBCjY2QjBFRjAzODQ5ODVCOTM4RkU4
-QTNGNDdCMDBDMkRDNTc1OTQ5QjhCOTMyRjNBRjQyM0UxN0Y3MkJDM0JCOUI2M0E4MTk0NUNB
-MTMzQgpDREE1RUJDOUNCOEI4Qjk2OUFEQjVDRTYwQ0E2Rjc0NkM2M0RBNUM1MTZEQjQxMEY4
-NkRCRjg3ODkwMkU3NTNBMzM4RDNGQjA4QzYwRTkKNDFBQzMwNERENzY3QkY0N0Q0OUJBN0ZC
-QTExMDM5OEJFMjFFMEY5RjAxQjZERjRDRDMyNTZBNzgwM0U1QkE5MzVERDZDREUxMTc1MEQ1
-CkRFRTA2MDdDMTRBOUE0REQwMzdCNjg1RjgzMDA5NEM1QkFDRDIyODNENTg1NEY1MzYwRUND
-OTI0MTA4RjRDMTI5MTc2QUY2RTYyNDQ1OApCQUM0MUUwNDM2OTEyQ0M1MjgxRUE5NEFGNzkx
-MjE5RjFEMDRDQTMwNjlGMzBCNTBBRTc5QkQ4Qjg1NzZCOUFCNzZFNjAzMzc4N0NFMzIKM0JE
-MjUyNDBDMDBGQTAzRkFBMjUzQkQ4M0VGQjhGRUNEMkRDNDVDMUZEN0NDMTk0RkI2MUNCQkVD
-ODgwNDdDRThBRUREQkQ5MjA2NjZCCkMyNjc2RTIxQTM5MTk5ODZGRDU2QUY1NDQwMjgwRTcw
-ODNGMDQ5ODdGMDI3MkJFRUNGOEYzQjUyNjEwMDcyMDM3MDJDOUY4MkI2NDBBRAoyRTZFQ0Y5
-RDBCQTgxRTVEQUE5NTY4OEQ2NTQ4NzNEQzkxNzdBMkU3MTYyREQyMUE3QjQwQ0IzQzg1QUI0
-OTQ2OUFCRjhGMTMzRjgwOEIKM0MyREEyQTUwMDhFMjVBMTNBNkQwRTQ5RkNGRkMwQzhEM0U1
-QTI1N0E4QzhENkIxMTI0RDcwMTdDQzAyNjNDRDk0RjUwRDMyREFFMTI1CkM2NkEwQUE3MTc4
-MzlCREFGQkU4ODkwODNDMDFENUU0MTk5NEI3Q0Q1MkU2M0E1RkJENEQ4OTYzMUE5M0IzNzcw
-NDBEQUU5OUM1QkRCRgo2OEMyMTQyRkZGM0YyQjUzREQ1RTE4MkZGNkFEMzRBMEJGNkRGMTlG
-NThFMDU4NDUwMTIzOTgxNTQ5NURBRDE0NERDRTc0ODc0NDg5OUEKNjU2MDAwRTI4M0EyMzdF
-NzRFRDU4RTI0NTJGMUI2RTczQTJEQzYyNkMzRTUyMTU1MDM2ODIyOTg0RTVFNzJDNjY3QzJF
-M0Q3OTBGRkFCCjVDMEE0QUFFMDMyNTg3MkFFOTQ4ODQzNzc2MkY0QzcwQkMwQTM2OUMwOTFF
-QUI4QTNFOEY0MDQ0NjRCOTlEMjZENkMzNUIwNDJFMTBEOAo5N0UwMjlBMTA0NDMwNzRDRjcz
-OTQ5RUFEMERDQjdFMEI4RDM5QkYzODA2RjM5RDNFM0MyMDQ1MjdDMTcxOThGMjFGQzc2RkE1
-QUJENkEKQkFGQjIxQzk0MjE0NjQxM0YwM0UwQ0RFMjQ3QThDQ0Q3QzcyNkU5OTM5NzZGMkQ3
-MzBFNDMwNTQyMjlBNDVDMEZFQzA5REJDQ0E5OEZFCkMyQzQ5QjJDNkIwMTVEMzQ4ODEyNTRD
-RjExMjQ2NTIxRDc4NURBMTJDNDhBNDczMUMzQUYxMzUzRjk5QjBEQjk2OTUzRjVFNDJCM0Mz
-NwpFQTQ2MDg3NkZEN0VCMDM2RjdCQzVEODYzMDM1NENBMTg5MDFDNTYxQTQ2QTlFMjAxQzMw
-RTYyRjIzRjNGN0IwRERERkY1OTZFMTNEN0UKMDBEMjU2RTY4MzM0OTVCQUZERTcyM0FGNTlF
-NzBEODQxQjUwMjgyNjFGQUM3MjNBRTRFMzdBREFDQjAyNzcyREZENjMyMUZFQjY1NzI5CkQ2
-NUNDRDU4QjMxMkZBNjg4NDNBQ0ZBQjdFREQ3OEQzMUFEREI3MzRCNjQ3RTg3QzdDRTI1QTA0
-MzZBMEQ0OTQ5OUZBMjcyRkNDODhGMgpFMENFNUQ3MzgyRDhDQkY3OTMwNDY3QUEzQzJCMUJG
-NjdFNjgzNTczREVCM0VCNTdEOUVFQTVFMTg1Nzg2REM5NzIxQTRCOTVBQ0YzMkYKMDlENUFE
-MkMwNjYyOTE5OEQxNUE3NEZENDFEODk3MkUxRkQ3N0NCNzFBOTMzRDIzNUUzN0U4OTNFMEE0
-REUxRDUwNzE3RTEyNTM2NUE5CkNCQzJCODI5MUQ3Mzc1QUUyMzQwODMzOTM5QkIwRjEzOUZB
-MzkyRjI5MzQ3Mjc2NkEyRUQ0MDUwOTVCRDk5MDY2MENDNkY0MDk1NEU5Ngo3MUY5NTU3RDU4
-NDI2NkM2RjNCRjQxRjRGRjZFMEJCN0FCRUIyNzJBRjk5RDBBNDQzOEJEQjRBRjY3ODlCOTA0
-MzFCN0RFRENDQjBENUUKMzVCRjg3MjYwMDY3MEIwRjE1QzE5RjM0QkNCRkM1OUM0QTJCRTM5
-NzhGNkExODREQjRBNDc0NUI0MDFCQUNCOEM3N0RCNjJEM0FCQjg1CkZEQTIxMjkxMjMyNUM1
-NUM1QTZEMzNBMjRENzZDN0JGNzJBNkE3MTBEQUE3MzkyQTdGN0NCMEE2MzM5NTA1QUM5MzVE
-MzQ2QzlCNUUyRApEMkU4NTYwODM5MkIzQTI1MjM3MzM3RUM4RjU4NTZCRjNGM0VENkUxNTE0
-MDUzRjRGQUNEMTJBOTREQUZEMUMxMjI0OUE2N0UzRjA4MDUKMDhDQkU2OTE2QjJERjNEOTQ3
-OEM3MzdBMTQxQUY3QzU0RTg4MzJERTgyMjgxNzM2NEVGMzYwOTY1OEM2NTkyM0VENjY2RDg2
-MzgwQjk5CkFERjdFQTAyQzlEQUUxMTFEQ0YzOTk4NzhDRUE2MEY1RDVCN0MxOEQyNDRBRTc2
-RDZCOTc4QkExN0REQjcxRDNERkMxMjI1MjIwMkIzOQo2QjAzRTM2RTM3NkE1NEUxMzA1QTAw
-RDA3NDQxOUE4RDA0RDUzQzNEQTgyOEEzNkM4RjQwQzQzOUNEN0Q1OEE0ODk2MkU3QkU5OTJB
-OUEKQTgyRUM4NTM3QjI2OEFBMTNGRDFCODgyNzVEODdCRjAyNDREN0I2MTUzM0IxNjczMEJC
-OUVGQTY0M0E1Qjk2QzRFOUMxMDc1NUE4NUE0CkY0QzcxQUM0QzNEREQzMDhERkZBMDY2MTYy
-QjhCN0Y3NUY3QkVDOERBNDBDNTE5NEI3NTk3MzYzODEzNDlBNjIxQzQwN0EzNEI5MDg4RQo5
-RUJFMzQ2NTA1ODJDRDc1OEUyNjk4NDczMjhBQzQzRUI3OUI1NzI1RkQ3RTUxNkI4QTk3NDI4
-OUQ4QzVCRTkwQzMwMTMyM0RFRUZDQzAKQTE4QUY2NjMyQUE4QjgwQzhEMTg4Q0VDMjc1QTkz
-RjY4Q0Y4N0ZCN0M2QzE5QkZGMkMwNzAzQ0ZEMTVFQ0NBMTYxNjBBQ0Q2RTNFMTZCCjAwRkJD
-Mjc2MTZDRTAwM0ZGOUE2MDU2OTYzNERGNkQ0Mzk5N0E0REMyM0FGQUE4QzJDRTlDNDQ2QjY3
-MzU4MUZFOUYzMEE5QTIzMjNFNApDMjhDN0M5RkJBMjdBM0I1RUFGQ0NBODJEODVCMDVDREI2
-QjM5QTdDNkIzNTg0RjQ4RjRFM0ExRjAxM0FERTQ3MDIzODMwRTQ3RUQ4QzkKNUNGRjNGNjQ4
-QzM4QkVBMUFGOTEzNUUxNkM4N0E0MjMxMTk5NUUwOUU3RkI1MUYwNkE4NzEwMkJGQTgyNjND
-MzIwNjdCMjZCMDk0MUM4CjRGMkY2MjAzNUQ1OEU5MTUzRDg5RDgwOEFCNzE1NDVBMUJBREFE
-MTgxN0QwREMyODM2QzYyMDRBMEEwNDE4QTJENjJFRkMyRkFBNjNDNwpBOUQwQTVDREFBNUYw
-RTQ5MTI2OUIxMjdCNUM3MTZDM0Q1Q0VFNkJBRTdGRDhDNEY4NkMwNjMyQUU3NTdBRUE1NUYx
-NUNDMEY5NUQ3Q0MKQzQxRUU5QjFBRDkzNDlDNEY4MUYwOTk4RUQxMEIxRjY4NjI3MkUzNzM4
-NjBBQzJFQkI5ODZDMjU1OERFOTg5REZBRDk1REJCRjlFQjU0CjU2Mzg0QTAwNzhDMTMzRTkx
-QUM5Q0Y1MzY1QTFFNzMzODM0QjA3MDFCNEZFNDM5NjQ1MTdGMEFBMUMwMTFCQjZBNzAyOUY4
-RDVBMjMzMwpCNjdEQTNFMDE5RjBEOEQ3RDUzM0FEMzI5MUMyQ0JCMUVFOTIwRTk1MzEyOEQw
-NkJCQzUxN0M1MThBRTlBMkRENDlCOTMzRTkxNUFFRUQKOTgxMEM2MTkwMzVBQkY5REMxNDdG
-NjUzQURCMTI2ODE2OTAwMkUwMzJBNDI1MDEyMDBBNjg1RDE5MDcwRjEyRjkxMzdCQjFEOUYy
-QThBCjQ1QzVCNTJGNTU3NzMwNUFGOTREOUM1MTFFNUU4MkFDNjdBMjIxNjQ4MzM0NzFDQkI4
-NjY4RERDODhEOUM1MDA5MTcxODNDNUUxNEE4MgpGMUQ5QTBBQTNERjJEN0JFNERFODQ0QkVE
-RTU1NzAwQTI0NzhFMTIxNTU1QzdGNjUyOUZGQkIwNTIwMjZDODA3NzZCNDQ3RjFGNUJFMEUK
-ODVBQUYyQ0YwOUJBM0IwOTE3MjUyRDY4RDY3MTAwNUQwRkEzMjhCRDIyNTU1M0Q5OEYyQzQ3
-NkUwODBCRThFMDNBRjRBNzY1MTU2M0ZCCkZFMDhDMjMwRjNBOTU2RjJGQUY3QUJGODY4QzA4
-Q0UzM0E3RkVBREJCOEU2RDZBRjM4QTgyMUNDRDhCNEVGRkMwMkZFMjNBMzdDNjkxRgo2OTI3
-RDQ1RjU3MTBERDVGQUM3NTA1RkIzQTBEQzMxQzc2Njg0MkI0ODJCQjc3RERCMzk5MDM0NkY2
-MjdFMEUxNjU3REE4QUJDOEVBNzcKOTYzRDZDQjgzOEQ5QzRFNThDOTQzQzNBMjcyNTgyQjNF
-NjM3NzEwNzBBNkY2MkJCRTdBNEIxMUI4Q0I1NTA1NDdFMTdFRDVERTZFRTE2CjFCRDkxMTZD
-QkEwRTBFRUU5MTBGOTg5NDhGNzQwRTdBNTQzMDE3NjcyMkJCQ0RDNEFCNjZCRDM1NDE0NDNC
-MDk2MDYzQzgzOUU1M0IwNQpBNTVFNzIyMzVCRTIyM0QyODZDNDMxOUZENUE1MTYzMjVDOEJE
-NDgwRDE4NjdGMjAxMzU5OTg0NEZEMjQ3OEIzQjUyNTQyODE1Q0U5NDUKRkZDOEZCRUFBRjlC
-MDcyQ0I0OTg4MjUzRUY3MEU0MkExRUQzMTVGRTJDNzU3MTM2N0U1MjE3QURGM0FFNEZCNjc1
-NzVDRjQ5QjFBMjY5CjE1RTY1M0I1QTg2RTNGQUUxQzdEMDRFMUFDMjFDQTVEN0U3QkRCRUEw
-RjU4Qzk5NjJCNDBBMTY4RkQ3QTI0QjRCRjEwOTY0NTQ4MUVCMQoxOEQ0OUJCOTlCMzU0MTc1
-NkUwREFDMEUyMzI3RDFGQUNBRUQ5RjdBNzY5M0ZDMUExNUE1NzE1RjFGRDFCRkJDQTdEMjMy
-RkNGOTY2M0YKQjBDQjM1MjU3MEE1ODA3RDE3MEU1QjZDNjcyN0Y3ODI4Rjg3RkRDOUQ5MzAx
-QTg0MkM1M0EzOEM2MkM4MDRDQkQ2MTE5OTJCM0ExQzhFCkM3MTAzRTc2Mjk0RjdFNkE1MDkx
-NkI4Q0VBODJCRTVCN0VCNzc3QUIyRTdBOEM5NTU0MTRDOEM2MUVBMzMwQkQxOEM3NDFENUVC
-NkUxNQpBNkRBNDZCMzAzNDVGNEQ1NkNFQTU5NUNDNDgzOEJCRjk5MzM5QkNFODI1ODIzMTY4
-NDc1MTNDRUY0M0I3REVBQUExN0M3RjNEQjgyQTEKMzQ3MUNFODFCRjc4OTQ3MjFCODBGODE2
-NUJDQzNGNzYwMUQ1RDNERjE3RDJGMzdDNThDNUU5RDg3RjM5OTBFODM4RTU1RThCRkY3MDg3
-CkJCNzlBMURGQzMyMTYwMkIzODZGOThEMUQ5N0NCQjA3RjZEN0IwNkY5MDBBNzdFNDg0N0ND
-RDY4OUIyM0MyNzdFNjQ3NjMwMEQ0RDlDRQoyQjVCQjVDQTIwNjJCRkYwRUYyQkIzRDRBQkUy
-QTlGOTkwRENGNzQ1NjhEN0NEQjcxN0U0Q0RCMDdCOTc2MTQ1MDhFRjM0RUU5MDFCQUIKQjQ3
-N0Y3NUM0MUIyQUFFQThGNDZCMjE4REQwREU1QkQ4MkYxNzE3Rjk2RTE0QURGOEQ3MzY2Mjc0
-RjNDMDc3NjgxRTBDRjMzQUREOTUzCjg5MjJENTM5MDc3QzU2NDMxOTA5RUU4QzFFRkY3NDY3
-QzlBNUUyMTUzNTAyNzg1MzRFNUE5MkM2QkVDNzJENEMzNEQ4RDEzQ0M1NDVCRQo1NDNCQkMz
-NzE0NDNGMkQzNDY3MzdBM0MzOTBBMEY3RTI4NEQ5QzQ2NjlEMzc0ODM5RDNFRDhBNDAyM0Yx
-Rjk5RkQ5MzU5ODc1NTAwNUIKQzJBMzRERkNDNEQxOUNCRDQyMkVENEU4NTdENDE5QkUzQjlF
-MTJFMDFEMDMyN0M1MUQzNTg5RTgzMzI1ODk2MDE4QzlCMDQxN0ZEODc2CjBBRUJDNUUwREM4
-MzY3Q0JBQjExQjI5ODlGNEVDQzFBRUY4N0Q5MzU3MjI5MTJGMTgwQTcwREZDRTk0MERFMzg4
-MkE0MTZFMjlCQTE0QQo5Qzg2RTc3MzgwQ0U0NjQ1ODNGMzg1RkYxNkY3RkJEQjYwN0FBNzQ1
-NURBNzBDRDhBMEQ5NzE0OTYzQkY3OTFEMkQ1RTJFNTUwRDEwREQKMTA1Rjg4REFCMUJDMUY2
-ODhCMUVFOEI0MDE1MUU1MzNCNkQ1NkZBQzNBNEE5OEJBRDg4MDE4NjQ3MDlBRkY2REZCM0Qz
-RUVENUE1MzJCCjgzRTkxQ0Q4MTI1QTdBN0FCNjY2OEYwNjZBQjc5NjgzQzZBM0YxMjlDNUFE
-QTk0MzFCMDZBQkYzN0E3MjQzODBDRUEyNTFENjdCNUZEMgpCOUM5NzMzNDI5N0I5REI4RTg1
-Q0JDQ0QxMzkxMUFGOERDMjQxNUQxRDhFNzgwNDgzOEQzRDAzRjlEMTQzQjkyM0Y1QzVCNThF
-MjhCNzQKODIzODY2NTA2NUExNUE1NEI0M0NFOTYwODlCOEU3REI5MDY5QjJCNTMyMTBGNUEw
-M0QxRUNEMkY4M0UxMDQ0QUE1NjFBRTY1NjgzQTQzCjlGRkEzRTFGQjYwQzFDQjY0RjMyRkE3
-MUUzRkI1NTdERjNDQUJEODdGRDJGOTQ1RUIzQzY5NjAyMjg4MDhFMUY3N0IyM0RGOEM3QjVC
-MQo4ODlCQjRDMjczOEVFNUQ2MDc3NTlDMzNENUQ2MTc0MTk0QUE5RjhGOTBEOTY5RUEzREFF
-ODM0QjM4MUEyRTA4RTVEQzlFQjU0MDY3OUYKOTRENDkwRjc3M0ExMDlEMjYyRTA4Q0FFNjBF
-MkU1NzY5MEU4Q0Y3NTZGOUFDMTEyODQ0Q0FDRTAyQUM5NkY1MTIzMUZEODNCQjlGRjcwCjEw
-MkZDRkUzRENBQ0M4QkY5RTk5QkQ3QTlDOUNEOTI3OUI2NEIzNjAyNDQyNjI0RUZGQTYwNjMy
-NkJGOTZEQjlFRUREMTZBNTE1NDUyQQo3RjI1RUQzRTc4QUNFMTVGRUEyQ0Y5RjFEM0M2QTA1
-NDFENDQxQTlEOTRFRDlGQkU5NDdBRjM1QjcwQjIxQ0RCQzAyNTI5QzI2NTA3MkMKOTk2NDJF
-REM4NzhEOTJBNzY2NEYzN0Y1RDlEQzE3M0Y2QzI4RjkwMDU4NkM0ODk2MDI0MUUyOTMyRjEx
-Mzk4NEJBNTM0RkUyNDU3RjQ1CjE2RTdGRUJDN0E3NjczRThCQ0Q0QzhCMDVBOEQ5QzczODE2
-NEE0M0RCN0Y1ODFGQUE4NzI0RDEyMDM1NTczQkU4MDBDMDMyQUFEQjIzRAo5QTI3N0JFQzM4
-N0UyOUYyMDFFNUY0MDkxQTREQUE0NzkyQUJGRkQ2NTc2MkU2NjM3RTM1NUI4ODM0NzkxMzcw
-REI3OUZGQkFFOTkxMDgKOTIwMzZCNTcxM0Y2NEEyODc1MDkyODI1NjE2QzY0QzY4MjdCRkM2
-MEY4QzBEMUVCMEZBRjA1MTYzNDhBNzg0NkI2NTdDODA5MDMwMTEyCjFGRTNCMEYxRUI5OTJB
-QkU3M0YwODQyQTVFRTEwRDY0MzY0NDc0NzEwNDRFQjdEOTI0N0IxNjlDM0Y3QzM3QjUxMDlB
-NUU3NjUwQUREMQoxNkU1MkMyMTAyMkZDOTkxNzU2QjkzRDIxMEM2NUY1QjdGNjdDRDM4QjQ4
-NjNGOTBEM0ExNzQyODc1REY4RTZCMjREOUUyN0Q3MjY1MjEKNDMyQ0JEMjI1RTBERjM2REMz
-M0I4RThCRUQ5RkU4OTdFNzcwOTg4MzJCOTE1NjcyNURDMzhFRTgyNTk1NDgxQTc2RDE2NkIz
-NzA1NUVFCjg0RUVGMTg5OUQyNDlERTQyODBGN0YxNUM3NkMwNDQ1NjU5NDlFOUU0RDQzOEYz
-MjdFMDUyNjVFMzRGQUY4MTJFNjYxNzcwNjU4RjJGMgpCQkJGQ0M5MzNBRURBRTdCRTE3QTQw
-ODgwQTE1MzQwOUMzNTdGODMwRjFGODQ3RDkxMTExMzU0NjhEN0EzNkJDQjFFNjlDQ0ZGNTdF
-MjYKMjBEOTdEOTg4NjY5RDczMkE5QTRGNEVEMEIxQjZCNTQyRDcyOUM5RDJGRTE1REQ4NTg0
-RUNENDU4QTEzMDVEQzcyOUM0NzcxNEI2REEwCjMzQTBEMEUyMjE1NzAzOTdGNjFFNjdDMDU2
-RjY2RUY1MEJFNTkxQTZEQzNFMzI0NjkwOEI4RUY0OTczRjc2QzQ0MDNCMTcxNzVCMDQ2RAoy
-MzBGMTdCOThBMjE3RDM0NkYwNzk2QTc3QjZGMTlCNEIwODg5RjA5QTAzQjRGN0JFRjNCMjQx
-MjE4QTg1QjVDMzRDNDQyMEI4N0YwRTgKQUQ5NDJEMEEyMzJCNjZGQkJFNDlEMjg2NEY3QUMy
-RTU2NTJDQ0U5MUMwRkE2RkFFNzk5NzFGMkQwMEU5NzIxNTFCNjExOTExOTBGOUU2CjlDQzdB
-NTFCNzc3N0FGMEVGQ0FFMEIyRkJCNjI2MjM1RDBCOTQyMTM0QTg1RUQwMTY4RDJFMEU1ODY1
-NEQ5NEJDRkFEMUQwRUFBREMwMAoxMTkzOTA1MjI1OUYxOTMzMjREQkE0NzlCRjU3QUZERTA1
-MjM3QTA4NDQ0ODg4RjA4RjlCQTExOTE3NUM3NzY0MDI0OTBEQjI5RkE5NkUKQjBCREM2ODRD
-QUE4RTBDQjQ4RUNDMEY0MEEwQzhGMThFMzdFRDA0MTIyMDA3Q0U0RTExRTFGRjM4OUVCQzdE
-RTlGMDc4ODhFQzFERUI5CkE1QzA4M0U1NzgzMEMxRDMwM0QwMzQ3M0NGNjQ5QzgzRDAzQjE3
-MDQ1RjNCNzRBMzI0NThGQjk2QzU4NTZGMDJCNzI4MjZCNjRENDg2NgoxM0M3RjA3RDJBMzQ0
-MUM3MTU0MkVDQzU2RDY1RjJBODBCNTc0NDYwOEQwRENEQzE0MjA0QkMwMEVEOEVGQjY3RjdD
-MzE3OTQwMTFDMDMKOTNDNjQ1ODVFQzhCNzQyN0I4MjQ2N0VBMzJBOTAyRkExQkRFNjkxRkM3
-N0NDNjE5NTJDNzJGODZCMkZCQTI0MEQ5RDBDQzU2NUQ4MDA2CjRCMEQ5NTI1Q0UwOUZCQzFG
-N0E2MTA0RUE1RjVBRjlDQUM0QTFDMTg5MkJGNzhFRDU1MDBGQjVBRkVDMjk1MzJBRTdFRDk5
-MUNFQzI4RApGOUIwNzZFOTVDNjRCOTFFMEQyNjJENEVBRkUxQzI3RTI0NEMzNkI1Mjc2NDY2
-NTJGNTRDMjNFM0JFNTlFNkEwQTJCMTIzQkIzMTAxRkQKRDkxQkIyRjNCMzEzQ0EwQjAwQjEx
-MzJBMzg4NjE3MkFEQTBBMjM0RDgwNUNEOTVCMkQKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAow
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwCmNsZWFydG9tYXJrCiUlRW5kUHJvY1NldAolJUJlZ2luUHJvY1NldDogc3Rv
-bmVzLnBmYQoxMSBkaWN0IGJlZ2luCi9Gb250SW5mbyAxMCBkaWN0IGR1cCBiZWdpbgovdmVy
-c2lvbiAoMDAxLjAwMikgcmVhZG9ubHkgZGVmCi9Ob3RpY2UgKENvcHlyaWdodCAoYykgMTk4
-NywgMTk5MCwgMTk5MiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMg
-UmVzZXJ2ZWQuSVRDIFN0b25lIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgSW50ZXJu
-YXRpb25hbCBUeXBlZmFjZSBDb3Jwb3JhdGlvbi4pIHJlYWRvbmx5IGRlZgovRnVsbE5hbWUg
-KElUQyBTdG9uZSBTYW5zKSByZWFkb25seSBkZWYKL0ZhbWlseU5hbWUgKElUQyBTdG9uZSBT
-YW5zKSByZWFkb25seSBkZWYKL1dlaWdodCAoTWVkaXVtKSByZWFkb25seSBkZWYKL2lzRml4
-ZWRQaXRjaCBmYWxzZSBkZWYKL0l0YWxpY0FuZ2xlIDAgZGVmCi9VbmRlcmxpbmVQb3NpdGlv
-biAtMTAwIGRlZgovVW5kZXJsaW5lVGhpY2tuZXNzIDUwIGRlZgplbmQgcmVhZG9ubHkgZGVm
-Ci9Gb250TmFtZSAvU3RvbmVTYW5zIGRlZgovRW5jb2RpbmcgU3RhbmRhcmRFbmNvZGluZyBk
-ZWYKL1BhaW50VHlwZSAwIGRlZgovRm9udFR5cGUgMSBkZWYKL0ZvbnRNYXRyaXggWzAuMDAx
-IDAgMCAwLjAwMSAwIDBdIHJlYWRvbmx5IGRlZgovVW5pcXVlSUQgMzg3NzcgZGVmCi9Gb250
-QkJveHstMTc5IC0yNTAgMTI5NyA5NDN9cmVhZG9ubHkgZGVmCmN1cnJlbnRkaWN0IGVuZApj
-dXJyZW50ZmlsZSBlZXhlYwpFQjdFRUI4OUJCOTQ2RjE0MzczOUE4MzUyOURFMzM4MUYzNzg0
-Q0MwNDlEOUEyMzJFN0UwODg0RjBGMjc3RThDNkU2QjBDOTVGNUUzQ0QKREZFRkYyRjQ2MENF
-MDZFMkZDODVDNjg3QjI0NTJGNjY2NDkzQUI2QzU1QTIwNzVDNjFGNERBRkZCMDU0NzYzQjk0
-OTJFNjI0RjVFNEEzCjhGMTFFM0JDNzZFRERBQTVDMjI4QkNEMjBGMUJGMjI4M0U4MTMzRjA3
-RjVBQTkxQkZGOTY4MDg5ODVEOEMxNzM2RThCQzc1ODc4MTMzOApGMTJDQzYxODgxOUQ0NzZC
-NzY3NENCRjZBN0IzRjEwMjVBNzI5MUM3QzA3NEIzMDU1RjI4MjQ5ODQ4NEM2RjBGRjhGNjQx
-RDBDRjZGRjgKOEUxQUJEODMyOTYxQjg5OTU4MzhDOUMwRjZCRDA3NTkyNDUxMjg4NTQzOUI5
-MzY5QjM3QUJEOUY0NzRCRjg2NDZCRjlEQUQ1QzVFQzE3Cjc5QUI4REU4MkMzRDA5OEU2QTY2
-MzdEOUI0Q0M3MTc0QUJEREVGQkQzMTgwRjBFNjJFMUU2NTBDRjJEQURBQTdDN0E2QjE5OTFF
-RjlDNgpCNTA0NjY5M0FGRDhCMUNFQzcwRDg1NDA3MDI3ODY0RjcxNEU1OTlERjlFNEU2Nzc2
-Q0Y4NDY3MjE0REFCNjkwMkVENUI0MEZBRTQyNDQKODJFRDQ1QTdCRUNCMjY5NDE3MjcyODFG
-OEUwQjNDMTVFQzA0NTEzMzQ0MDA3MEFENzI3MzZGNEQ4N0E5NjMzNUNDQUY4RTZBQTM4MjI5
-CjhDQjdFREE0OUY5NjNBOUUxMTlDQjcwQjk1MjBFNUQ3QUFFREQ1NDk4RjBFRDFDOEIzOTAy
-NjM3RTcxNzM0QTdEN0UyNDEyRDVFQjc5MgpCN0I2MEJBOTM1NTYyOEJFRTNERkRBNUU5M0Iz
-MDI2RUMyODg2RDQwQjIyNjg1QzhFOUJFNUUzOERFMzFGQUI1NTFBOTc4RDA5NUM1NUMKRTNG
-RUM0RDZFRDY1QzcwOEYzNjc2RjRDRTVGODNGNjE0QzAyQzhGMTA5RjFBN0ZFOTNDNjAzMEQz
-MDMyMjdBRjBFRjg0M0M0NUYxNUIyCjI3OTc4NTJDRkVBMjZENzlBRTI5MzRFOEI2ODM3MzJC
-MzA2RjkxMjVBREFBMUE4MDJDOEI4MjYwNUQ3Mzk1RDBGMjJDNzdDRDFCMjBFMgowMkJDMDgy
-MDE1RTI5M0M4RjFEOEQ3OEEwRTQ1NjU1NDAzNzFFQjNCNTEyNTZCQTcyNzZCMkZBQkEyQ0RG
-NDdEMzRDNDQ1RDAyNTVBNEIKMjNBODhDQjQ0M0I5OTc4MTNFQUNFQkZGNTFGNUI4QzlCMUI4
-RUM1OTY4QTE4Q0EyNkJEQUUyRjAwQUUwMzREREJFNERERDU5OEVDRTYwCjUyQTlCQUVDNDIw
-RkUyNzhCMDhGNjRCRUYxMDY5QkQxRkQ0QUI4QjJBMTNFRDNERENGRjgwNzY1MDFCQzhBMDE1
-NjcxNUVDMTMyRjYzNgo3MTFFRTlEMEQ4Qzg5QzkzMkVFNUQxNkY4MDk2QTlDNDU2RENFN0Y1
-OTUxN0Y4NUZBNDA5QjYxMTBERkMyMkEyMzkxQTAwNTQ5MkJGRjAKQzg2MTBBOTIwNEQzOUFF
-RTUxMjcxRDM1NUNFMjAxQTU3MTk4NDIxMTJDODg2MzJBRkIwOTdDMzY4RUFCODk3REMxOTU3
-QjAyOTYyRTJCCjNFNDczMkY2NTI3QzI1QkM3NkFDMDQzQjczMDBDQjE1M0Y2OTcxQzAzMzVG
-RDNDNkFFNUFGN0M1REE1NjIxRDAzRkFFRkQzQjhBREI5OAo4MjcyQzYzODA3MDgyMTBCRjE0
-MDgwOUU0QTE5MTE5M0YzNTQ3QjJFNEQ0M0Q0RTk4MUY3MTQwQjk0NDczQjkzOUJFNDU4RTNC
-NjlCODkKMzNBREJCODJEQTgwQkEwMUIyRkY5ODc4QkU5MzhEN0UxRTRBNkU3OUIyMUMwQjUz
-RUU1MTBENjM3N0UxNzhFOEUzNTU2MTI1RTQ0RDk3CjMyRUNGN0E3QzU5MUFEMjhCOUM2NTE2
-MjlDQzVBNTZCRjYxMUUyQzIxOTlERUM1N0Q2MUMwOTlFNURDRUY1NTI3QjlCMjI5OUZBNjRE
-RgpCMzQxMDE5M0I3N0NGNjAzQTA3M0QwNzg1RTFCQTlDQjFFM0YwQUI4ODU5QTg3Mjc4NzY5
-QkI2RkNCMEMwMUVCQ0I0MEY4MEJFRUM0RUUKMDI4M0NCNDgwRTJCMzE4NjNDMjEyOEVENUFB
-OTU5NDRFRDc0ODgwNUY5QkJDNzBGQTc5RjdBNDBDMTc1RjhBNjU1QzExQzAxRkE5QzJCCjlF
-MEE2QThGRTVBRjVENkUzNDJFRDE1MDRCQzMzMkVBMEYxNzg4MDgxODA4QUI4QTQ5M0EwNzhB
-RUNBQkFCQjdEMEQ3MTgzQUQwQUJENgo1NzYxMTk0NTZEMEI1MEIwQUM2QzZDM0RERDQ0QzY0
-RDREMTFBNzZEMkMzRjVGQzUzRTYyNkIxMkU5MkQyMkI3NTdFODk3NDlBMUNFMjYKMkM4MUY3
-NjQ2RDlGMjRFRTAzNTBDMzA5QzBEOUE2NUQxMzRGQkQyMTZEM0VDRUI1NDg0NUJFNkZBN0Q2
-N0UyREQ2QjFGMTI2MkFFRUYwCkExMzRBNkU2MzlBMkUzQTZDODExMDAwNDA1N0JGOURBNDg3
-MjhGNTBENDg2MTYwMTIyRkI3REU2NTg3RDQzMjU4OTYwMDM2M0NCNzYyMAo3MjhFMTA0MDVD
-OUI1Q0Q3NTIwRjQzRjY0NzJGNENGNzFGREY4Q0Q5NUU3ODk1MDQyMkRFQTgyQkJBRDJBMzdF
-RkMwMUI3N0MyOTYwRUQKOUE2RjIxMzMzNDE4M0MzNEI1QkM4RjkwNUJGMzVDQTE2MDRGNTkz
-RjE5MzlCNzU4MjQyM0IxOTg2NEYzM0M3MjBERTZEM0IyM0IzRDgwCjY3NDc2MUNBNTlCMTU2
-MUY2MDk0RTQzMzcxNEVEQjE3NTIzRDI5MzA3OTUwRkU2N0IxMUZERTJBQzFFNDgzMDNEQkZF
-RjA2RUYxQjAwQgo1NzIwMUQ3Qzc4Q0E5RUMwNzk3NjAwMjE1MTMyQUJDMzVGQzgxODQwOTIw
-QTMxMUU4QzdCM0IxOTFDMjBGNzZENjY4RDA4MzhFNUEyQkQKNzEzRDhGRUFCNjhDRUFDMzY1
-QUZFQjk4NzQ4MEM1QTc0MkIzRjg1RDJDNkIzRERDNDZFMkJDMUMyN0IzMTZGNkMyRTk0NDg5
-RTZENkE4CjkwQThDMjJCNzFBNzRCODk3MjEwRTE0M0JGRDE3RUZGNTU4QkI2N0VGRDIxNEY2
-OUJCQTJBMzQ2QUY5NTMzODQwOTMxOEE5Qzk1RDhGNwo3Njc0OTg1NEE3Q0M0QUVGNDA0Q0U0
-MTUyOUMzMThDMjE2NUUyODIwREJBNkIyMEU2QzQyMzE4Mzk2NTIyRkFCODAyNzI4OUE5M0Iz
-MTYKOUZDM0VDRUFENjFEMDk5NTNEMjA2QTgxNjMwQkYxOEI2RjExRTI4Qzc0OEY3MUI1RkQx
-MDVGOTEzQkUyNkZDRTkyN0YwNjExQzdEMjAyCkFBQkE3MTRCNDdCNzU0RThFOEFDQTU4Q0ZE
-NzQyMUM1Qjg3OTNDODMyMzZEMzc1RUY1RUM1OUJDNzFCNUE2M0MyRDRGRDAxQUI3MjA2NAo2
-MzRBMzU5MkJGMTIxNEUxOTJGNTIzODlGNkFCNEE4OURDNENCQzFBOUY0QjI2N0EwQkNCNjEz
-NzQ4N0Y4MTNFRUEwQzYzMTBDRUVDRDcKREFCNzgxQThDMThFMDhBMUIyMEJEMkNERjU4REM3
-MkM5RDU3RUM0NzIyNTRBQkZCMTU3RUU1NEM5NjkxNTBERDk3QTMwRUM3QTc4QjlDCkY4QzE2
-M0ZBNjE4NUIxRTM5OUNGRDBCOTMxNkI3MEZDMTFBMTUyRjcxREM0QjlDOTAyQkQwNUYxQUE3
-QTY1NUVDQjFFNjlGRkJGN0NFRAo3MUI2NjQwQUE4QzUyOUFGODIyRkQ0RDE3M0NBQ0Y2NkRC
-MTlGMzVBQkEzQUVCQ0REQ0VFRUEwNjFCMDYwMTE1NTNCODZBMTI5MTg3RjkKMjZEMThGRDY0
-NDY2MDAwMUM3QzFFQkIwMkMzMzQ0RUYwRTg4RjkzQURDOEYzMzRFQzRBQkQxNUQ0NUMzMzIy
-MUE1QkJFRUM0OEEzMjEzCjJCRUMyNTdGNEExNTRFMkIwNDAxNDU0MTM4QjgzNDhDOUI1Mjc4
-OUUxRUNCNUMwMUY3RThCMEVBQjJBRjM5QjgxRkY0QTdBMDY5OTY0MwoyNjdENzhDMUI3OTQy
-NDNBRTdFNEE1RTU5NzJEMjY1M0JFODUyOUZGM0FERTE1QjhEMkQ5Q0VEQjVCMTI3RThFQURE
-NzREMkU0NUZCNEIKNDcwNEIyQkM3REM2QjkwMEE2NkI1RjE5RjRBOTJERjkyRDM0MzNBNzEw
-NEI4NjlFMzFFRUQwMTEwMURBRjlBRDVFNDI0QTg1NUNCRDJBCjlGMjQwNDJBRUY3NjcxOTYx
-NjY2NzRBRUE5QjREOEI4NzFGODRFQTc3NkVDREY1Rjk4MUFFQkI1OEQxMzlCMzNGMTg4QUIy
-QTk5QjgxNgoxRUZGOEQ4OEU2QTU3QzQ1OTU2RTdFQ0RGQUQxRDM1RDZGNTFCM0JENjJGNjlF
-MTVGRUE1NjQzNTVBMDU1NjNBMTMzREFFM0U4MjUxQUQKNkJCRTVDMkU1OUNEMDA2RDhGODdB
-NTFCQ0UwNzJCQzQwMDk4REUwQkRDMzA3OEMxNzA1Q0EyQjUyQzdBMzYyOTc2MkY1OTk3QzYy
-RUI3CjkyQUQ1MkU1RjUxQTAzNUE5NDcxMTBCNDFEQUYyQzNENDBGNDVFNUM3Q0RFMDlCNTM4
-ODBCMTYxNTkwQjcwNkRBRkQzQTk4NDM2RjgyRQo3OEU3RjdDMERGQ0I2ODA0QjcxOUVGMEFF
-NzY2MzdDMzhEMDJGODA3NURDNjNGRDQ4RDg1QUE4RDY1OThEQTFENDg5QkRBMkJEOTEzN0IK
-NTZFRkI2QkIzNzIyMUY3M0RFN0JCRjA3QTFFNkQ0NjU3QUM1NkVFMkJDQTUzNTY1QUJCNTcy
-Qzg0QTBEMDIzQUM5NDU2ODFFRUU1QjhGCjU2Njc5RTU1NEI3MTNFRjI3N0Q4NDNDRDk5NzJB
-RkU4NTFEN0EyMTM4MjRGRUJDQUVGMkYxNTlEMUQ5NDRERUZEMEM3RjJGRjAxNDU2OAo1QTBG
-NzcwOTM3NkZBNzc1NUZBMEU5RTJFQUY1ODI3RTJGMjNBNDUyNTAyRjBDNjlDNTFBOTJCRjAx
-QzNDQ0Y5NDdCNTYwNDE2NENFQjAKRjY1MTkyMjQwMTdEOEYwQUM4ODg3QzZFODNGMEZGQ0JE
-MERBQTU3NTIzRDIwOUVDREMyN0M2Q0RDNkE3MDlEMzg0QUMyNEZBMzM1MEYyCjcyNTkzQzVG
-QzA1RkNGQjRGMkVCMEQ1NDI0Qjk1OEYzRTVCODNEMjQ2MkM4RTMxOEE5OTRCNTBDMUUyQUUx
-RDBGRjc5ODgzN0M2RTVDOAoyM0Q0RDZGOEQzNDA0M0NGQjJGRTlBOTQyNzExOTgyQkMxMTRE
-MTQyNEI3RTM1OEYyOTdCMjI0RERDQzYzQUIxMzAzREM4Njc1RjEyQTcKQjM4ODM4RDhGMzQ5
-NUQyMEFGM0Q0NTIwMjYzOTdBMDAyRTExMkI4MjY2QUE3NkFBNEM4MDY2REY0MzY0N0ZCMkRC
-Rjc0RThEMzcxNDY2CkVGNkMwNUJCNENGRjM2QzNCNDZENjYxQkQwQkVEQ0E3NTNDQjA2REYw
-N0VDM0U4RjJGMzk0ODhBODdBNzdCOUZEMERBNDc3ODdENEU4NAozOTA1REVBQzJBODNGRUVG
-QUEwQzJGOEExOEQ3NTY4NTVCM0ZGMDIxODhGREE2RjU1NTE0MEUyMjM1MjgxRjFFQjBFRDBF
-MEY2RjI2NDUKQzM2QTQyMzU3OUE3RUQzNTI3MzhBQUQxQjU5RkRDNzI2MjMyNkU1ODBEMzky
-NkE2QkNGQjczM0RGNzBGRThBNTVDQjk0OEI3QjlDQTVECkZEM0VDQTU5OEQ3MjM4MDMzMjE2
-QzAzODQwMTgzMTc1OTJGMjZFMTcwODU5MTc3RDZFQzI4NUQzNjhBNzI2MjAxMDVDNEY2NDc1
-M0JCMwpDQ0RERjc4MTMzOTUyNDQ4RERFQUYxRDk5RDQxM0EzMTkyNTU2RDVFQ0RBNjA1RkY3
-NUVEMDYzNUQ1ODc0RjNEQ0NBNDZGQ0JCRENDNDYKQjg4M0Y3MTZCNkM0NDRENzhDRTI2REY3
-NDJBOTBEOUM4Njg3RjRDN0I5MzlGNDZBQ0NDNEQ5MjgxQzIxREMwMEE1Qzc0NENDQjU0Q0U1
-CjkyOTIxMjlGMDI3QUUwNzJCNDhBQjJGNTUwQzFGQTRCMzZCOTkwMTgwRjZFQjZFRjg4NzY2
-MEQ1MTZBNUFEOTA1QUFBRDk0QzdFODkyQwpFODAxN0NBQjQxMDhEMUZGOTQwMTA2NjJERUQ2
-NThDNkFCN0IwMjYwMEY4NEZFN0Q5OTA3REIyMTNDOTFDMzI0QjI1MTVEODMxRjk5QUUKNUEx
-RTBCODUyMUI5RkVEMTIzMDlFQTBFNkFBMTNEMUNEOUE1RDZBNDk0M0EyNjQ3M0FBMjNGMTc1
-MzQ5NDkwQTRGOURBNzk1QUJFRTE2CkIxNEY4QkFDOEEyQUQ2QzY2NDZBRTJCNDgyQjhCMkRD
-MDE2QUIxNDI5REFBNjk3Q0IzMTVDQjE1QjU4N0ExQjQ5MjdGMzQ1Qzc3ODYzMQo5OUREMzQy
-RDJFODVDMjE4Rjc0MUFCNDRCODIxOTc4QUM4NjlERTI1MzQ3ODg2RDE2M0E4MENDQ0UzRUJC
-ODQxQjdENjZGOUY0RTE3MDYKRkE5MERDMkEyNjFFRDQ5RDY5QUEyMUU5NUM0RjIwNDM2MzU5
-ODc3RjM5MEUyNkVEOEU3QUZEMzcxNjMyMDFCRTQzNEI4OUFBNzE0NEI4CjNFODk3N0Q0MEQ4
-NzNDMTVGQ0QxMzZFNzExQjEzMjkyQzhGQTBCNTk0NTk4RUNGOERGRjVBNjk2RUU4Njg3NTRD
-NjI2MjgxNDQ0QzMwRAozMTY3REJGOUI5NDQwQUUwREI4QTkzN0VBNkExMTgzNEQ0NzI2QTVD
-MjEzODhDOUFCRjU0REE4MkZGRURBNUI3MkZBNTNFNjcwNEM5MTYKMzg3QjhFQzM2MDg1RjQx
-OUEzQUM3OTZENENBRjRDMzIxRUM1RjVCRUQ3NjEyRjVDODQxMEY5RjRDNTg0RTc2MkM0RkQ2
-MUIzNjk2NURECjZEM0M0QTU4RjE1QkZERjgzQzU2NUY0NTdGNTZERTNGOEJGREUzNkNGRTk2
-NEE3MEU4RTA1RDMxQTZDQjg3QjAzQTRBOENFRDk4MDU1MQo1QkM3Rjg1MzVEMjNDRDc1M0NG
-OUQxQ0RGOTBBNzE0MjA0NUU1Q0VFQjlEOEJDMkE4RUUyRjRCN0E0OUNGNkQ2QTBGRkEyMDRC
-QjU3ODgKRjdBQzVCQTU3OTg1QkVGQUE5ODMxNTA5NzRGQzEwNDhFODI0RDg3NTA2Qjc4NzQz
-ODdGRUQ2ODIwRjBFODEyRkE1MzZERjVBRjRENzgwCjQ0OUJBNTREMUIyQTQ0ODlFMEY4ODE1
-NTcyMDBDODBBN0U5NjA1Rjc1MEJGQzkyQTMwQTM4OTQzRkY2QzREMzk3Mjc5N0M5N0M5MzI3
-RQo3RTREOTc0RDQ0MDQ0Nzk0QjM2NjdDRUYwODcxQ0VFODA3QzcwQzhBNzI3REQ5Mzg0NEI0
-RUM2MzZBRjIyMDhCMUY0RjQwNzcwRjQ1MTkKN0M3QzNCRDM2QjBFMTY2MkZGNTA3RTY3MjhF
-ODZEMzU5OTU0OTgzOTcwNzM5N0UxQjZFODM3RkI1NkU3NDdERTY4RkY4Q0NBQkM4MzU4Cjk1
-Rjk1MTc4NDI4RDE2NUFGRDlFNjNCNEYzMzI3NzczMTQ2OUMwRjNCQTJDRjMwNEVGNjk2RTcz
-MzQ3Q0MzMzZGNTM4NTgxRTRFNkZEMwo4N0ZGQjNBNTE2MDcwNDU3N0UwMTE2RTUzMjdBRjEz
-MDIxOUFEQTg1QUM1MkNERTA4ODRGMEY3MzU3NkYxNTA0QTAyMEM3NTJGOEJGODMKOEJDQTFD
-NkVEMEIxNEIzODFGQjAyQ0NBRTQyQzY0QThBNjVBODJCM0M5RUM5RDg3MTZDMDg2MTIxRDhB
-NkIxOEYwRTQxMUJGRTE3N0NGCkIxOEY5QjlCQ0Q1M0MyQUNGOTc1QTE4NzJDRkFDQUUzMDg5
-ODQ0QThBM0I2QUUwMkVEM0RFNEQyMDc3QzdDMzc3Njk0NkUyQTVEMEQzRAoxOTA3MkRCQzE0
-ODQ5OEYwNEYyM0Y4QjE3RjRCMjk0RUM5MzlGMzZGREUxREU2ODE0NTNCNzdGN0ExQkZFMkQ3
-ODQwQTMyNDgxNTI0QUIKMzE4NkIwNkNGRUE2RDc1OTM1NTdBQUE2NDA2MThGODNEOEMyMkYz
-RTA1NjQ1QzQ3ODVBRUE5NEE3MzZBQzkyQkEwODkwMkZDREQwODk1CkVCRjk3NTM3MUVCN0RG
-MDEzQTU5RTUxRTMzMzcyN0VBMTYwQjVGQ0NBMDAzRTI3QkU3Q0Y2NjVGNENBNEJCRTdCMTRG
-Qzc1ODE1RTA1MwoyMERDRUFDNkQwMzJENzE0OEI5REJFQTlENjI3MjRCNUM1MkQ0OTk5MDAy
-MDdEQUFBREMwQUU5QjJDQ0Q4MUI0Qzk5QjkwMUIzNDg4QkEKMEVDQzI3NTE0QTczMEFBQjU4
-QTdBNjA5MzdCNTVCRTNEMjlGNjhCNUI5Qzc3NkRDQkY0QkM3MTNGRUEwOTFCQTYwODNDQjIw
-QzlDMEIwCjE4RDk0QzEwMTIyREQ0Q0M3QzA0MjE3MUIyNTU0QTg0RkQ0ODkwMDlCODZGMDgw
-NTI2QjgyMDczRDk4RDFEMzZDNDExMzg2MjQyRDYwMAoxMEE1ODQ0QUY5MUREM0M5NTUyMDVB
-QjBERkM4Q0FBMUIyOUMwRkJEQjBFRUJDNjk4MTVEOUQzQzcyQjUyNTU4MjQzMUM3MDBGMDk1
-NzkKOTBGRUMyQTA2RTMxNjc5Nzk1RkYwQjBGODNBQUY4MzRBQTI0ODYyRjA1NzZEMzA2RkRD
-MjdGOTAzMzBFQjA0MzA1NDhENDVFRjc1Q0YxCjg1OUJBOTg0Mzk1ODNGOUZDREMwMkRBNDI2
-Qzk4OTU1RDYyNDZFNEQ1RjE0NzFDNEFDNEZGQjE5NDdBQzlGRjdGQzBDQTQxRkJGMDFEMgoy
-QjgyOENFQUM3MDMwQTZGNTZGOEIwNTc2NDQ4OTY1M0E3NzE1OUFCQTRERUU0MkIyMTEwQTY2
-MzREQTE1NDIxODhENUU1NzcwMjE5NTAKNjk0QjU3MUFDMzU1MEUzQkMyQ0IzQTgwMkEyRTgz
-MEEzQjVDN0RCNzc1MTZCRkFDM0E3QzgyN0Q3OUFCRDc1RjEwQjdFQTVCQ0E1MkI2CjkwRkQx
-OUUwNDI2RDI1MjZGQzU5MUEzNDU0MjY2QjRFMzgxMTREMEYxNjUxRERERTA5OTVDNENFOUE2
-REY4RkIwRUYwMkU3NDUzNUMzNApGMUY1NjNFQzk0ODIzMUNEMTU5RTJDMTcyQTg0NzNFN0Mw
-OEJDNTlGRjNEMDgxMEMwRUMwRDFEOUQxMDM4RTg4MkYwNUM3RTNBMEJFMUUKRjk4RjlERDJB
-NjBBRjk4QzJEQkYzMkI5RjUwMDNGRTNCMDlCQTAxQTc3NDRCRkE4QzM2OUI3QjdGNzNDQTY5
-MTVDREVFQkExRDcxRjg0CjlERjREQTIzRkUwMTk1REZCNkFBNDcxRUExMDlENkU0RDdFODAx
-QUM3N0NGRjczRjRFRDU4OUQwMDkwNkFBMDg0NUI4NEQ0NEQ3ODE4OAo5QjRCNUI5NDc1OEYw
-MTNFQTE0MTE3MTUyNUFFMTQwMDQ0QzhEQ0RCMzc0NzZCRkFDOTI2MjhGQTE3NzIzQ0M0MzRD
-ODIyRUYzMDdCRTIKNEQ3Mjk1NTIyMEI0REFCRjM3OTU5QjQ2QUQ5QzUyRkMwRjVGQjNERUM3
-MkJFNUY1RTVGMEJDMUNGRkMwOUQ4REVGNUNDNkJDOTRBNDU2CkYzN0FBQUQ5QTYyRTcwNUI2
-REQ4NDRDNTY0QjI3MDhCRDhCN0ZFNUYzQzYyMTA0QjM0OUEyRDg4RkMxMEVCQzFENDkwMEE1
-RUY2QzUzRgo4QzE4MjUwREJDNEJDNTExNzMzNjRCNjAzM0UxRTVEMzU0M0FEOTVFREMzQTA3
-QzYwMjczRTlCMDUyQzYwMDQzMUY2M0QxRTRERTBCRkMKRTg2MDUzN0JFMDUzN0EwQTJDOUJD
-NTM5MTE0QkREQjVBMzk1MTQzN0Q4Q0NGNDU3REQxRUMwQjBGRkI3QjlBRkIyNDA1QUZGRTMz
-QUE4CjVGMzNGRDA2Q0Q3MkIzODJEMEE2QzZEQjQwQkVERDNBMTZDNjhEQjk4QUU2QUQ4MkNC
-QjYwRDFCQzIwREE5MzJCRkE0RkE3MDMzMzQ1OQpBMjhEM0I5OTk2NkI5QjRGMkU5OTNFOERF
-NzgwQjg5MEFCRUEzN0Y3MTQzRjk3MDJFOTlFMUY1OUY4RUUyN0FCMTVDQ0NDMDUxNUEyQTQK
-N0RGRjU2REQ4QzM5RTE0NDI1RkJCMkIzMzExNUQ3ODY1QURCNjY5NzNDRDE0NDQ2RTUzNTBC
-MjgxQ0EyRDg1NUQyMzEyRDNERjVGNThFCjY5ODU4Q0JCQjA1ODA5NjQ4NEVEOENBOERCNTM0
-RUYxMDM4MzRCOEVGMzM4MzRCODE3OUQ5QTYxNDNCODhCMjQ0RjVGODc3MzcyODQwNQo4RDM1
-MTg2QTgzQTE1Q0RDOUNCMzJDOEE1ODg1QjVFQkE0RjczQjgxRUE0MTI4RDI0NDgxODcwQjcy
-MjNBMEYwRjI4ODhFNzdEQzAxQjAKMkFDODMzNzg0NkMyQTUwMzU3MjQwMzFENzQzN0ZEMTE4
-MDYyNjBDMkJFN0VGNjQ0MDlFN0E3NUFEMDQ3RjdBRUIxQ0UzRkNCRDUzREVCCjBGMzlCQTVB
-NjNCNkMwRUY5MEM5QTNEMjE2ODMzOTZBMjUwQkFBMzdFRDNDODFEQkRGREIyMjUzRUMwQjA5
-QTE4OEQ3OTExNjgyMjJCNgo2QTA1RjAwQzEzM0Y0MjIwMjM5RjY1QTg4MTEyNzE3RThCMzE4
-RTkwNUJGMjhENThFRDE4NDkwODQ3MTlGMUZCMDE3NkQyNkM1NkFDODEKMjg2ODBEMUFEMDdE
-M0VGQzExOTI1REM0NUNCNzg2RTUzRjEzNUI3REJCRjYxMDU1NEI2RDlCQzBCRDM2MjI2RTU1
-QzIzRkM4NzM1MUEzCjNDMjQxNkM4RjI4MTdCM0NBNjlGQjBEMzMyQ0VEOEMwRTMzQzZGNDBE
-QkY4NURFRUQxMEE3RTlFMjk0ODUxM0YzMTkwREVFOTMxMzJENQozMjA0NUNCRkY2RTQzREEx
-NDVDREUyRDU2MUUzQkEwNzhCNzJGOTUwQTgwMTcwMjVBQTVGMkZDRUUwOEFCNEU3OUQ4RDE3
-RDQyMkM5NzgKMTY1Njk4OEFENjIwNURFNjkwMzVFREJFNTE2RDdFNTJBODI0OUI0RkVENEU1
-RDE3N0Q4NzE4OEZFMzUxNUM1MUIwOUU4REE1NzNGQzFGCjg2QjMxOTNFRTkzNUNFMjdFNTIx
-MzE3MjBEODI2NEM1ODBBQzA4NzIxODI2MkIzN0ExOTRFRTg1ODlCOEFCMzA4NTQ1QzJFNUFF
-MjNCMQpCRTRFRTNCQzlFOTlDODg5MENENEExN0NDQ0VCNzQwRjc2NkQ5MTk1REZDOTU4QkM0
-Q0VCRDI5MUQwNEZFNjkxRENDNEJBN0RDMjBDQjYKMjkzOEYwQUE5QzRBNTFGQTdENkUyMTNF
-MUIzNkIwRTMxOUYxRTk4QkJERjI5OTlDOTMyNUVBRUI4NjA2OUYzMTU4QzJGMkU3OTM2NUYy
-CjI4QkVGMEQ5MDk0OEQwN0U1M0I5QzQ1RjgyNkY4QTg3ODNGNDlDRjAzN0Q0Q0IyQzkyRjJG
-NkU2NkMxMDQzNDNBODk5NUE4NkUzREMwQQpBOUE2MjU3N0ZGREVDRkVDQTJEN0QyNzgzM0U5
-MDNGQjA0OUI5MTc4M0U0MUQzNUQyMTZERjM2OTdGRjAzQjUxRUMzQUNDQTE3RTkxODcKQzM3
-MjM3NzQ5MDgzOUU0OTAxMzZDQjMzNDNDODdENUEwNEFENkMxMzdBNUZDRUFBOTFGQ0JFQ0Ey
-NjI5QzEzMkNCMkJBQkUzOTA5QzcwCkVDNTVBOEZGMUREQTA1QjhCMkEwRDJBNTFCQzc0MTFC
-NkE2RjM1NjA5RTZFRTBDNjA3RENDNkVBRjk1RTQzRTYyRjEwNDJERDBEQUY5MQpFOUFCQzIx
-MkQyRTJBOEZFRUFEMEQzMTBCQzhERjQzMjAyODkxNTQwQkYwN0ZDQTJFQUQxQTI0QkNBRTVF
-NEE2MTdFNzI2QUM0RTkyMTUKRTAxRjdFQTJDRjc2OEI3MTU4MTEwRTNEMTYwMTBEMjdCOTUy
-RTg4QTMyRTQ0NTc0M0M2QkY1OTg0OTcwRDUxODk5ODIyMUNDOTVBNDdBCjlGNjI3QUYwREUx
-NDc5M0M5N0MxREU1NUI4NUEwNjI4MTZBREFERjIzQ0VCQzQzOTE2QjFDOTY2RURBQTE0MjRC
-MjNBNTUyRTUxNTA0QQowOEFGQkI4MTgyRTlBMTExMjRFMTI5MjQ0QjE5QzdCQUUxQ0FBRTJD
-RTM0OTA2MDc1REJGNzRDQzg3RTQ3ODI3MjU0MURGRkZDRDMyRTMKQzA3Q0Y5NjBGNjU0RjY3
-NDQ1OUZCMTM2RkU2RDE4MTIxRkVEODdCOTBEQzA1QzI0NzhEQkQxMjFEM0E0OEE2ODdEQTBC
-RjVBODgyQTAwCjE0OTBCODNBQkM5MzJDQzAxMUU0NThENjRBNkUzRDJDRTBGNUM5QjFENjlC
-QzdERTY4Q0EwREYzMTczNjJGRjgxQkQyN0Y2RkQ5OTYxRgo5M0Q5QjExNDk5QjhFQ0I5NTQy
-OEVBMDA3QTQ2NDlCMTYwMzNFOEQ1OTFGRkM3QjRDQjZFRTA3RTZGNzA2ODc5OTZBM0QyRTg1
-RURDMzEKQzFERUVCNUQ4NEMxNjkwNzlDMTYyOTc1NDBDQTBDQkExMzA5MjRBQTdDQjc1QzM1
-N0I1OTJFMDhFNDc3MTYyMDVDRUM5QTAxNzhGNTRDCjkyOEEzMENERjVGMkU5NzZGRjAxNzQw
-MTI1MDhGMjZFRUQwMzQxN0UzOTczMzJGRDgwNkUxMUI0ODY2NDlCRjE3RjJFRTlBMEI4NjBB
-QgpDQTQ0QzMxNzg0REYyNUI1NjgyNTc5MDg0N0NCOTQxMUIyNDg4RkJBQUYwM0IwQjBGQTJD
-QzFCMEM1RDMyMEI2OUZGOTg3MTNBODc4QUIKM0Y2NTZBQjQ1RkM1NjFGNjFEMDA5MDMwMUZF
-N0NBN0NFRUU2Qjc2RTU3QUIyMjNEMTNBRkQ1ODQzODREMEJCNUYwN0U2OTkxNTUxRTFECjJC
-M0M1MjMyMDM5Mzc3QTY2RjExNDNEQUYyNUU4MjM3NzRCODY4OTcyOTE3NkNFNTRGMEQ1M0FB
-MjFFN0JGNjQ1N0FCREE2NzEwRDU5MwoyNDdFOTNBNUNCMjNDMjRENTNFQjBENkM3RkQ3M0U5
-NEJBMTVCNkQ0NDNCMTBBODM4RDM0RDk2NkFFQUU4MUI4QTIwODk1RTM5QjgxOTgKRDA3REY4
-NUZFOUQwNjM4QjI3NDU0RTU0RDg0OUM4M0UzMTQ5OUM3NUIyRDJFODUxRDVCODk2NjA4MzYx
-RkI1NjIzRkMwRkE4NUMyNjMwCjI5OEI3NUQzQkYxRDUzRDc3NjIxMTlFREFDQzM4RUZBRTQx
-MjZEQ0YyOUIzRDcxQzBFRkM3NUFBMkRGMUU5NTY3MkI2QzdEMURGNzRGOQozODhCN0NEM0NC
-MjFGQTQ2RjAwMEUzMzBEM0E1NTYzMjZBNkYzN0FDREUwMDQ1QzBEOEQwMEFCRThBODY4RkI0
-RERDMjFDM0REOUM3RDYKMjJGMEI4MDE2NUNDNEQ4NDIyN0I3QUU5OTI3QzkzNkRGN0ZFOEY4
-OTNFMzE5QzQ1QkI5RjlEQzVFNjFEMzdBRURGOUU1MjJDQkJCMjBDCjI0MDVBMTM3ODQyMjY2
-QjQ4RjJCRUREQ0I5MzIwNjY0QkRENjY3OUI3MjAzMEUxQjAxQjVFNjk3OUM1OTJENjQ5Q0Ey
-REE1NkMwMTlCQgowOUY2RTEzOTgwM0FDMDEyRDMyOTNCMUU0Q0M5MUU4NjI4NEFBNjg0MUI2
-QjlFQUQzMUQ2NzI3MTQwMzlENzMzMzZFMDIzODk3MzJBQkQKQUJCOEMxNDdEQTlDRjQwNzEx
-NDA1QTEzMjhFRTE5RTBFNkUxRUE2NURGQTg5MjE5OTRGMkJGMzEwRkI4NUEwOEY0QkFBN0ZD
-NTlEQkRECjM1MDAwNjIwMERGMjdDMDk5RjIyMjk4NjJDQTVFOUMwODUxQkU0RTMyRDAwNDc1
-RjI1ODMzNDM1OTAxMEQ4MTc4Q0E0REJFRTgyMjMyQwpEMjFDM0NGNjY2QTBFQkY0QkQyMDMw
-MEMwQTcwMDE2ODA3RTQyRDE1RjlFRTI0QTE5NEVEMDRCNEM2QUVEODg0REM3MDg4QjZFMzc4
-NTEKRkFGRDdBREZDRjdGQUJCMEU2MzM5NDZCOTAyOTE2MEYxMEI2MjYxMzI4OUI4QzQ2QjJC
-NzRGREQ0N0JENEY0RTdCNTNFOTZERjhGOUMzCjY5OTI1NTA4RDM0MkUxNUE0RDA5NDNCMjIz
-NjVCOEQ4RjlDQjhGNUQwMERFNkE0MkZDRjlGRjQzRDM2NEMwMkRGRDJGNDRGNzI4MTlFNgox
-NkI3ODhBNERDQkVDMUI1RjlBRUJERTRGMzhBMjU0QjRFRUE0QTM0RENBRUE4NURDQjdGOUYy
-QkY0N0JCODdFOTU1MjQwMkMzNzI2MjgKOTU2RUU1OEEwMUU4NkJBRTFFMDgzRDcxMjlCNzgz
-N0Q2RTU3QjdERThDMTc5QkRERTY1MjREOUY3NTYxODcyNTAyNjg1NEMwQjFBMThGCkE2NjJD
-RDYzMjQyODVBRjY1RTREMUY4NjY1RjE1MzhGMkQ4NUZGN0Q1MDJCM0JGRDREMzEwQTMwODhB
-OEVFNjc4MEQ1NDFEOUFDNDY4NwozMUEyN0REN0RBODBGRUJCNkY2MEMyN0JCQ0EwMkRDOThB
-QzU0MENGNDVFM0I2RDUyREU0NkI3QzZFOTg1MDhERERGQ0IwMjBBQzU1MzMKMTJGMDhDMkFC
-RjI3QjZDMzRBRDlGODQxRUI3ODM3M0YyRjM2N0EyOEVFM0UyMUQyQkNGQ0U0QzE0QzM0QzM2
-Mzg5NzhDNDBCMTM2QUM1CjhENzQ3RUUwNkUxOTdBQjA3QURGMzcwOUU3MzgzM0JDNzg2OTE3
-RDNFQzA0NjVFRTQ4OTQ4RTM5N0Y4RjcyNTZFRDREMjYxNzk0QjI4RQozOUQ2RDRFRkZDRUU2
-RENGMEMxNDI1NkRGNjgwMjZCQUEwRDUwQTczN0UzMDM5MjNFNkQ5NTZERjNGQ0UyOTgzRkY0
-NDNCQzFFRTE1OTUKRUM1N0U4NkUzNzcwRjczQjgwMkExNTJGQkNGNkI0Mzk0RUUyREIzMERB
-QkE2OUYwMTI0RTZBNzRCRkVENzcxNUU0NjkxNTBDMjU1M0Q2CjRGQ0I1Njc4NkQzMzRGMzM1
-RjRFQzY4MzZBNjEzQTI2MTUyOUZBODVCNTM0Njk1ODVBNjgzQkI5Q0NBREMyNEFDNTdFMzVC
-QkE2QjA4NgpGMzg4MTE2MTMyNzkwNkIxODVFOTU4RTcwMEE3MEJFODI2MjdBOEY0RjQ5REEy
-MjAyNEJENUY2RDBFRjMzNTdFQUMyNDE0NjE1RDRFRDIKMTMwRDNEOERGMjNDNTJEMkI1NzM3
-MkJBQTY4QkYxOTAxQjg2M0U2QTM2RUEyMzA5NDk3MUJDRTI2MkZERDVBNjhCMEIyMEYwRTlG
-RTBCCjBEQUUzMENBNTZGQUQ5NEM5Q0U0OTg3NUE0RDA2RTc3NENEQzQ2ODQ1ODY2QkNENjEx
-MjI4ODdEQjg1QjIwN0UyODgwMzUzNTY4N0UzOQowMjhGODJEOTQzOUZCNkI3RjM0RkZGMUJE
-OEUzQzhFMUM3REYwM0RGRjhFM0MwNjAyODQwNUYyRTZBQUY5N0E1NDA3NUIyQTFFQkNFNjEK
-M0E1Q0Y3QzczMDQyRDc0ODI0QTA0RDVCMjA2NjczMDM0OEIwN0YxODhBODcyNUVBQjBGMDc2
-QkVGMjVEQThCODJCMzZCMDYxRjg2NkE3CkJGMjNFNjA5NzgwQThDQTZDMUU3QTUyQUEyREY0
-RDVFQTIyRTZDNjQ5MUI1QzRBNjQ4RjM3ODM4QTdCMUY3QkREOTg4NDA2NTMzNzJBMAo4NkE3
-QUZENTZDRTJCOTczQjVGRjIyNEUzNDkzMEFERkEzMDcxREJEMzM5NjE4QjI0NUFEMjdCQUZD
-ODA1QkYyQTQ5QTRFMjk2RjE3RDkKRUIyNTcwMEY4RThGMEM5RTg1NDhGQUJCMjNEMkNEOENF
-QkU4NjIxREZCNjYxMTVFNjA2MzBBMUZBRTM4OTdGRDcyMjY5QjI3NTAzODQxCjU5NDNEN0Ey
-QjU3MjlBNURDODdFMkY4RUM4MjU4NkQyQTI5NzkwMzNDMzE4OUVFNUNFQ0M5N0MyNzZCNzUx
-RTdBMjY5MDQ3QzBCNDczMQo5RTM4QzhBNUVGQ0ZCMEJEOTBDNTQ1NTYzOTcxRjdEREZCNzZD
-MjhERDVEMjk3Qzc5MDdEMjBDN0QwMjBGMDQ1NTdGNTU3QUQ2NkU1MUYKOUQ0MkY3OTY3MzY5
-OTdCQzY0ODg4MzE0NENERDlFQjQ3NzQzMUFCOTU4M0M1OEE5NEZCNzM5NUU1RjdDQzBGRjk0
-MzRBOTdGNTkxNTgwCjQ4NTA5QjcwMDgxNjhCNkU4NzdDQkZFMTQwODNDMUNDMkIxOTdDRENE
-OTMwNjhEMDM1MTAyQjAyNUQ1MkE4QUE0NzIxRTAxOUREMDJBNwo5OTNFNUM3NEE2NENDNEQ0
-MjJEQzAzMjEwQTI2NEY3MzU2NTE0RjEzQjU1NUMzNzM1NjZBNUQ3OEU2MjcwNjVBRDM2QzI2
-NTEzMjQ2RTAKMDFDOUMxNTk1MjM1N0E4RDhFNzU4MUVDQzhDMEE4NkE4ODBDNzNBQzUxOUJC
-MTBDMUI5NzIwREY2NTAxRkVGRENFNTVDQjFDREJERkFECjQyQzNGMjE0OEVBMzU4NjFDMzkx
-NDc4QjlBOEQwNThGQTEyMUI0QTI2MzlFN0E2MjY1NTBGNkUxODkyMERBMDc5NDBGNTczQUEy
-OTlGNwowNDNGM0VDQkZDNjI2QzE2QkVGOTJEOTM0Njk0NkEwRTdCQ0FDNTI4QUUyNjRFQTM3
-OTczMjk1N0FDMzVFMkM3REVGQjQxN0ZERkJDRjQKQjI5Q0FBRjExMzM1QzFCREFDNTBEOTVD
-MEEzRjA2RTM2N0ZBMENDNDgzMTdBQ0Q3MkRBQTM1QTc2Q0EzQTFBQzI5NzVCQTNFMzY5MDE1
-CkY0QUI4Q0FBRTlCODA0REM0MkI3RTE5RUY5QjczQzNFRjM5NjhCNENCRjRDNzA5N0E0QURE
-RjgzNTlEQUIxQzZFMkM0NDA3ODhGOEJDRgpEMjcyRDgzNjZDMjMyQjcwRDUwRTIwOUU3NjYx
-MzRGMEMxRjFFQ0RFRjI1RTA1MjAwRDlFNjZGRDZEMEU2QTZERjVDRDFBNjJBNEU3RkIKREI1
-NEI0OTVDREU1REIwRkRBODVFREE0RDYyODM3NEUwRTZFQTQ1MUVBRTY3NDU5RDkyQUM4NEUz
-OEZGQjUxNTZEMUZDMEVEMjY0RDlDCjA1MzE5Mjc2MzYxRjUxOTJCM0ZFM0FDMDUyMTU0RTI0
-MjVENzc2NjZFMzg3Qjg4ODQxRjJBQjgwNjJGOThDQzExQUVFNTg3MTdCRTg2Nwo2QzI2RUQx
-RDA2ODM5RkI4NjJEMkQ2RjE0MjE3RURGQzQ0RDM2MjgwOTBENEU0QUU2RDhEMDhDMjkyNURF
-QzYyQ0MyREVFNENERURBNjUKRjFGQ0IyMkQ1MEQ1NzM0OTU2NjkyQ0JCQUYyNUE1MThEMjEx
-MkY1NEU2RDM4RjlDMkI5Q0Q2NkEzOEJDQTBFODJBQUUzRERFNDVDM0FDCkU3NjFCOUExMkIx
-MzU3NzI1ODlFNDI1QTNCNEUyMjlFMEU4MjQ5MDY5MzI4QjZBMjIyQzQ2REFGNEY3QzYxRkRB
-QzE5NjdDN0FGNkUxMwpDMzgyOTNGNEEwQUUzREY3MDBFNDBDMkRFOUY4QkM4MDI2ODZGMjM5
-RjdGMEM3QjQ3RTAyNjFGNEJFOEI1QzE3NEVFODZBRkIyNDhGMDgKRDBDRDk0NTc4ODY3RjQ3
-MzE2MTcwQTkwOUMwNTAxOTkxNTM0M0M2QzRDRTBDOTk0QUExMDVGNzBFNThFNTc2NTY0QTRC
-MkIwODk0NEQzCjE4MENFQkU2NkJFODk0Qzg0MkMwOTZGOTJDQTUzRTY3MDRDOTE2Mzg3QjhF
-Mzc0RDFCNzE3NjFGMzkzMDQyMkIwREY4QTRFMjQ3ODVDMQo0RUVFOTIwRTNDOEQ2OTcyNzk4
-MTRBNkQwMjc2RkVDRDY2RURGMTI3NDExQTA3RUY5RDIyRUJBRkU3QUY0M0M2QjYxMjJDQjBC
-MTREREMKRDMzNjdDOEFBQzU1OUFGODkzQUU5QkI3M0Y3ODRCQjEwRTY2NTdGMzQ0QUQ2OTMz
-MEMyNEE0RTNDNDQ2RTg2RTA3RjVCNTk2RDJDOTg0CjRDMjRDQkRGNTFDQ0FFRURENEQ2MkZG
-NDhDN0Q5Rjc0QzkwNDUxRkM5MEY0ODVGMkMyRjZDMTI1NTU2QTU5OTJCQUQ4Qzg3REZGREQ5
-QQo3QzA5MkFEQzlBQzIyMjBDMEVDQ0JBQkExQjRDNDk0QTRERjQwQ0U2QkM0MTJEMzdEMjdG
-QUZDODNGOTU1NEM2NjRCN0UxNUIyQzRGOUEKNkJDRTE3MkZGREM4ODVDOEQ1QTZFNDMwOUQ0
-NzAzMUNDMUE1N0QxNUNGMzBGNDEzQzcwMDQ0NUExMTgwNTg3ODM2Mzk2RUNGN0E0NTI2CkJC
-MEFDQTUxRjI5MDZDRTE0NkY4Qzg0QTFCMUZFMjQ1NEVERUUxNjU3MEQ1OTRFNzlCODk0Q0ZD
-M0FCMTYwQTAxOUU1MDczNDdFNzYzQQpCNkNEM0FERjQ2MzkzRTA1NzlCQTQyNEREODUwMjQ2
-Qjg3MkU4ODE2OUVGRkQyNkU1OTBBMTkyRUYzNTM1REZGRDdDNTQ3RjIzNTgwNDIKRkM1Qzk4
-MzhCM0FFRDAxRjEwOTZCQkZBMzU2NUFCRkZCNkYxM0RBMDg4MEI1NjI2NjJFRERCRDE0RkU3
-MTBFREJFNjZBM0VBMUZEODA0Cjg1REE1MzkwRDNGOUFBN0QyRkM3QTZDRTY3QUQ3OEExODFC
-Qjg1MjRCN0QyMjQzQTIyRDkzNkQ2MzFGRDNBMzhCNkQ3RUU0MjEwRTNGOQo2N0U1MzZENzI0
-QjVFOTUwNkYyQzJGOEVEOTg0RDBBNzZCMjhDRUY2MTgwOUVGNDlEN0MxOThCRkVCQkI5MTIz
-MzAyNjUwNEE1NThDRDQKN0I3OTg1QTE0NThCMTRBNTcwRjJCMjJCMTk2QUEwRTkzOUQ1RjhC
-NDQzOUM1M0Q4QzE3ODY0Mzc2QzUzNzUxMzI4RTM5MUJBMDlEMjU0CjA2MkFBMjZDQkE2MzRE
-QUZEN0VBQjRBMjA2OTdEOUQ2NkVGNTlBMzcxOEZGM0JDQTBBNjlBMjAzRUUwQTcwQ0M1NjQy
-NjRFQkY0NTY3QQo3MUE5NTg5ODYzNENCNzY4RTg1QzFDOTQxOTRFNkM4QjAzMjA3MzVERkRF
-Qzg2MEQxMTBBOUUwRjBGMUQwQjM1MjhCMjRERTVDODUwMjEKN0YyOEQ0MjAzRjU2MEJEMTlE
-Q0YxNDVFOEEyOEY5MDY0QzI0NTlENEZDODBBQUE4MUFFMTJERTRCRTEyNDIwNjQxRDFGODJE
-NjA0MTZDCkREQ0ZFNzgyOTg0OTU1QTEwQjU3NkZEMUEzOEMxNjUyNDMxRkJFQTBGNkEwMEM0
-M0RFRjUwNUIxNTc3N0RCRkZDRENERUNCQ0I4NDZBRQo1NzAxRDRGOTRDQkQ4MzVDRUI5OEJF
-RDZFRTczRTEwMUNDNTU1MDE2MzdFRjYwMDkzNTc3MDk0OTNBM0IzQTEwOTJGMEFDODk2MzY5
-RkIKRUVDODg3QjJEQzlDRjUwNzkyMDYzNEE2QTdFQTQ5QzVEMDZENkE3M0QwNkZDRDg1MEI0
-OTM3NUEwQzZFOTRDREVBQ0ZFNkEzNDVEMEYwCjIyMjBFNzFGRDI4OTA5M0IwMzAxQ0U5RDNB
-MDAwNjJFMUIxNjgyNUY2QjQ0OEUyQjk3NjMxQkY3RUZFNzRBRkY4MzE1NzFERDhDNkQ2NAoz
-NDBEMkQ3NDk4M0VGMTkzMUIwRThCMUQxOTE0REJFRDIyNjM4QjQyMDJFNDE0QkRDMDkwQjI2
-QkYzN0U5OTAwRDg2OTFDRUU4MkJCMTUKQ0IyRkJEN0Q4NzEyMERDMUJDRTYwODZFNkNCRjZF
-NUVDQUEzQjk1NEQ1RkIxNEY5ODdGMTc4QTQ1MjBGNkMwQkQ2MzFBM0M5RkMyRDdBCjI3QTg3
-RkQ2NDY2QzcxRjk5MDkzRDQ1N0IyMzc4MDc0ODBBMEJCRjlCM0U5QTkzMkYyQjU0RERFMDY0
-REY2MDg4NTVCNTcyOTMzNDRCNgpFRTY3ODE4OEM4MjBBQTk3NENDOTNDREQxOUMyQUZBREFC
-NzEwOUNDMzU3Q0ZCNjMzQzNBQzZFOTRDMzc3NjA0QTk3MTQzQjJDNDZFMzQKRUJBNjI0RjlF
-OEQwRUUyRjcwNzMwOTMxRDE4RUY0OEJDMkU5RDg5QkNDRURGNDQwQUQyMUJBMEFCQkYwN0Yx
-RjNBRUU5MUM2ODBCQjMwCjM1RTExN0ZFQTE4NzY5OUM2NDMyNzk1NTM2NTI4NTlCNEU0RjE0
-RjEwOEVDMTdDMTNCQzRGNEYwRjFBNEYzRUI4RTEwNzA3MEVERDgwQgo2NTQ5Njg1NzBEMTBE
-RDk2RTNBRjNEMUNFN0U5MTg4MDExOUMwQzEzQkExOTU5NkIyNzYyRjAxOEU0QjUxMzFDOTI5
-QzdCMjEwREEyRkMKMTYxMDBGQ0Q4Q0RBMzYxRENGOTFDOTQzMUQxNUNERjE5RUE2MTkxMkRC
-OTEwMDFBMEFCRTYzNkRCQjMxQkFFRENCNjVGOEQ0MEM3NDM1CkNFOEExODgxNjlGMDBENUND
-QUIwNzUwRUEzN0QyMEYxODM4NjA3MkI1RTA1M0REMUYyQzFDODE1RTUwNDMwRDA4NEQyMjZF
-MTA4Qzc4MgoyQkU0MDI1QzdCNkZBRkE0NDkyRDFBNkI5QUVDOENDQkFEOTYzOThBM0EwMjgx
-ODEwNTlEQzMyOTAxRDlCNjVBNENCQzk3MEMxMURFQTEKNDU2NEM4MzJGNDFDNUMyNzhEOTdB
-QUU4OTlGRDE1ODFGMDI5NUVBOTA4Q0RDNDVGQkZFNDY5NzMwRjc2QTY2NTcwNUIzRkE4QUMz
-MDFCCjQwMzBBREM4QjA4MjA2NjkzRUNDQ0U1MDlGQkM5QzQwMTYzOTQ5RTQ1RDJFMDcyQkJE
-RjZFQzE3QjU2RTM5QjQ5QzU1NjVDNDkyODgzMwo0NEY1MDdFOTI2ODRDNjRCRTI0RDM3MEZE
-MUJDRDJFODA0RkMzMkM1REMzQzZDRDJEMkM4QzQyMjE4MjBFN0RCRjI0Mjg1RTBERjc2NjMK
-QTM0OEM3QTkwQkJFQ0JERUYzMjFEOTEyOERDRkQxNjU3NjgwQzA2Njk2MDg0QTJEMTc4MkNG
-QTRGNUYwQTgyQ0M4NTkzMDE0N0FCQ0YyCjYwQkM1NDE4MUE1MEFCMTJCREY1MjQ5NjUwNDE1
-QTI2RDA5QUExRjU1QTBCQURGMTJCNzYwQTMzM0QzRDM1RjE1REFFNjhCRTU4NTYwNQo3NkRB
-NkU1NzI3MTFGMDkxOTJCMUM1MDU3MkJFQTYyM0VDODZFMzNEMkQ1MTU4NTE2MDk5MjMwRUY4
-RDRBMDNGNEFFMjlDRkUyRTQxOUQKQUJFODlDMkVGRjI3Qjc5QTAxMTc2MTU5NjFGODQ3NUY5
-QUQ3MEQyQ0E2RkZEMkI4Q0I2MjlBMjE2NjEwNjE1OTA5NUZEQTc4ODc4MDgzCjM4RTM0OUNF
-QjcyMDY5REFDNzQyRkM4MTI2NzM0N0QwODhDRjlENzZDOTkzRkU3MDc4QzhGQ0YzNjcyQzU2
-ODhDNkY2Q0FERDZDMTgxOAoxN0VEQzZGQTY3RjFEOEI2RTQyODYwOEI2NjdCRjY5QzdEM0Iz
-RTA2RTc2Mjc1NkNEOUEyMDUxMDI3MjlBNjJCRDBEMDY1NzkwRTQ4MTQKQTJCRTgyNUJCRTI5
-NDY3Q0YxMzQzOUFGOEREQkQ3MTJDQUVENTFBRTgwMjNFRTJFRjNFODJBMzIyMTFDMTUyQTNC
-MDBGQjU5RTNBRDA2CjE2OTExN0ZBMDU5OTk1Qjg1ODI3QzcwNzM2RTVDNUI5MkE3QTA1MEFG
-NTg2RTQyNzRFMkI4RUIzMDFCMUE0NEE3OEJERkI3QTFDRDVCRAoyMDQxOUI0NkE3QkFDNzJE
-OEI3NkFCNzlGNDNERENGNzM4OENFNjk5NTNCMDcyMjlDQjA4NTM3ODQxNzUzQTc3OUY4REIz
-NTA1OEJDQjcKOUZFMEI5MkM5NUVGMkY1QkI0RkY5MkExN0NDQzE3Qzc1NDdFRTgxMkJFMDJE
-Qzg3QTk3QjcwQTA3QjQ3RjI1MDk2Q0Y3RkIyOEVFQTk1CjkzMzMyRDhGRDRDMDU0OTlDMEYw
-QjVEQzE2QjYwNDg2Qzc5NDVBMjRDOEY1RUYyNEVDRjI2QkUzN0RDMUJEMTZDRTA4RDlGOTZC
-QzQ4NQo3M0MxRDdBODg3MkEzOTBBNEZENUUyMzc2NTg0NUM2OEVENTk0NTZENjZFQjRCRTY5
-N0Y0NTRCNzFCRjZFOTc2QkZEN0M3ODE5QkRGQTEKNEQ4REQ3Rjc3N0I0OTk3NzNBQzQ1Nzkw
-MkRDMTMwNTQ0QTMyOTU3RTcyM0FBRjBFRTgzRDQ2REM2QUMxNTc4RUUwM0M1NUI4OUYzRkRC
-CkFGNjBDOEFEQjVDRTEwREFCNjAwQkRFRkI1Rjc5M0IwQUQ4QTQ3NTdBNjVBQTQ5M0JCQkJC
-NjAzQ0ZEQURCMDg3OENEODMwNDMzNzBCNQo3RjFDMTlFMDJENUVDNDNEN0YyMTI4QzhGQzlC
-MkFFQzRDOENCMzg2REFCNjAyOTY5QTA2RUQ0OTk5NTRDMEZBQUEyNzNCRTE3QzJDNzAKNTk4
-OTVBNzk2MUM5MTA1RkVDREMxNTJBMUNERTY4MTRFQkE2RTNCRkJBOENFMTEwMzkzRTEwNDZG
-RDUxQTEwM0JFMTk0RjRCOUI1QkY3CjEyMzk2REJBMDEyQkRDQTBFRDM4RjYxMzk0QkRBODg2
-MkRDRDcwQzgyMEQzMDFBNDAwQjU3RjEwRjExMTdBNEIwOTM3M0U5QkY0QTcyQgpFNjIwNEMz
-RjU2Q0I5NjYxQ0QxNzVGNzJCMjM1MUE2Q0FBNjQwMUNCNTY5Q0UzMzM5NDI5MDE1QUIxQzY5
-ODRGNTE4QzZDMEQ2MDY0RDcKQTNEQUY2RUVGOTQ5RUM2MzNBNjcwNzBENTg3MDdENkU2RTAx
-RjI2NkQzRjU1MkI3NzcyMUEwRDU5RThEREM4NkY5ODgzMzAwOUQ3MzQyCjhGRDM3Q0JCMERF
-OUM4OTRFOTk2NjI4MTlDMTk2RThBOUZEQ0NFNDdDNEE0QkExRjFFRDFEOTBEQzIzMEE1NDBC
-MjZDMjE4QjlCMzBFMwo4QzIyNkEyM0IyODgyM0RDNkQ4NEQ0OUE2RTM0NkNCMkY3RjlGNzFG
-QjEwNkE1REZCMzZDMTZDREZGMUQ2NTFBOTc1NkJCM0IwRjAwRUYKMEE3MEQyOERFQzc4MUZF
-RDVBRDQxNzg0NDY5RTg4RUNEQjg3MENGODhDRTk5RkY4QjhDOTk0NzgzMDBBMzFERTgxMDU0
-NTVDRDVBNkI3CjZBM0RCQjUxOUM4N0MxQjYxQjE1RUYyNTRCMzg0ODI4ODk2ODc4OUMxRjVE
-NDc5QjEwQUQ5MjcyRkI3NzQzNTc2NkJBNDBBQzk4ODkxMwowN0Q4QTQwQzE0RUQwQjc4Mjkz
-NDQ5MUFDQzgyQTI4NEE4ODZEMjA0RDQ1RjFENTcxQUQxNDNBQ0E3Qzc0ODFGQ0FEQzIzNjZG
-OEFBMTQKREUxOUI4MjU3NEIyRkQ5RUVENzE1M0E1QjQ3ODc3RDNENTc5Qzc0RjhCOTFENTE1
-NUFGMEYzNDg4MkM5RTJDN0VCMzIwNkIxQjQxMjA5CjlFNzc2RERENEUyRTI0RkRBQTk4NTU3
-RTdDODczNDdGNTZFMUIxRDZEQjc4NjE4NDg5NjZCNkQwREQyMzJGQzJDQ0Y4OUVCQTUyNjAw
-RgoyMDg0MjMxN0JCRjRGOEI0NEFDNEFDQkZFMEE0Qjc3NzIyODIzN0U1MkQyMkRFNEEzQjhF
-M0FEM0Y4NjQ1NjdGNzg1NzUwQjIwNjRFQUIKRkY5NjU3QjM2MjJFNUQzOUY2QkFERkNCNjkw
-M0REN0RBOTM1MDE4Q0IzNkM2OTQ1NkQyQzgyRUQ2OTU0RTQwNjk0MkQwRUUzMTBDQTM0Cjgw
-MzMwOTYwM0Q3N0JENEJBMjQ4QzAyRkNFMzM1QkE5NURFQTk0RkY4NEREODA1NDI5NjZDNTAw
-MEI2MTBBNTU5MThBQzJDQTg2RDgzNwowQzlDOUY0QjU0MTI4NzU1NUQzQjEyM0EyN0E4MzU0
-NURGMjhDNzk3MEZCQkRCN0Q3MjE0QzcyN0FFNjg3RDAzNDg1RUE1NTVCNEJFREUKQzQ1ODhG
-NDFGMTE5NUJBNzUxOEM2NkZENDU0QTk1REE2QkYxNDQ0QzA2QkZFQUE3NTQ3MEZDNUE5MTk2
-NTY4QTlGQzczREIyODQ5RDk4Cjg3MUNFMDA1NTMxMjg0N0YzNzZEN0MxMDVCOTVGQjQxQUFF
-NjI5QkZFMjQxRTUyQUI5MTNCQUE1QTRGNjc1Q0RGMjU2NDYzMDA0MTYyNwpFMkE5RDhDQzE0
-NDg5MDgzODY0RTgxMjFEREYzMUM2QkU5RTBDMUYyOEYyRTQzNzE2QjQ4QjJDODUwQTZBRTRE
-RUZFNEM3MkI0M0ZGQkMKN0FEQzMwNzQzNzA0MUY5MDg3NjNCQzg3NjJDNzM1QUQyODU0RkM0
-OTY0Qjg3ODlFRDgyNUI0NjhGQTcyRDJBRUE2RTBGQjQ4N0U2N0IwCjhDMzAxMTlBREQyQzBE
-RURCMDczOTg3MEVBMDIwQzNBRUZDQzMwNkI0NjU3RUY3MjdDN0I5RDQ0RTlFRkE5RDFFOTRF
-RjQ1RjA0MzJBMAoxQ0EzNERGMzcyRDEyODY2MzlEM0Q2MjFCQkVBMEEyNzlERTE3RkFCQUNG
-N0MzNzAwRUUwQUI5NkI5MUU5QzY1RDAwMzA3QUY1QjdEM0MKQzVGRTQ0RTc0OUNDOTk3NDVF
-QkMxREFENEVFNEZBMzIwOUE4RjZCNzlENTFCQ0IxNEQxNkU3MTZFNTczNDlDQzcyNzBGNzU2
-M0REODkxCjFGNjFFQTNENTg3RTBBN0FCNkQ1RjUyQzUxQ0VFRTUwMEUxQTVCODdFNDY5OEY4
-NTg3MkE3OEQyNjhEQzU4OUVERjIzNTk1NTk1NzZCRQo2REZDMTdBQ0IzQUYyMUNDRURERTlF
-MkVBQzU3NzkyMUQ0QjY2NENCM0E5OTE2MjE0RjE0RTBFRTBBNUE3OTRGNTJBRUIyQTg1QzFG
-REMKNzU0NDhGNkU4QjI4NTgzQzg0OTk1RDIzNTM0NTk1MzlGREJEM0E3ODcwNDA0N0E5Q0E0
-RjhCRkVFOEZDNDE0RTZCQTg1RjBERjFEOTdECjAyMzREQ0UyRUQ2OEVFMEU5NkVENTcyQjY2
-RDFEQUZEMkREMkYwRkU3QkVDQ0I0Qzg1MTI5OEZEQjlGODk0Q0FEODU4QUY0OTY4Q0Y5Qgow
-MDFGQTE1QUU0QzdFMzhGRTI0NjAzOUZEODM0Q0NFRkM5NDY1MkVEMDEzQUU2RDRGQkY0QTQx
-OUM0RDFBRUUxOEFENjgxRThDQzg2NzIKNEI5RUIxQzVEQjEzRTgzOUIyMThCRjZCNzFBRUY5
-QUIyMzBEMzdEODQ5NEE2OTcwNUM0NzBBQ0I0Nzg3NUMzODgwOTQ2NTQ2QTU2OTQ0Cjk4MTYw
-MkFDMjJCMzc5NDdCQ0QxQTM2MTRGODY5NURFMzE0NzM4MzMwMkMwRjFEQkQzQTQxREFEMzYx
-MzgxRTI1RjUxQzQ5MjI5MjJFNgo0NTU1Q0E2M0IyRjUwNkU0QzFFQTdGQkNENzA3QTFDMjg3
-OUVFNEU5RUM0OEMwQUI5M0ZBN0MxQzlEOTk0MDk2MUI2RUU3M0JBMjlENDgKMDdDREQ4Q0ZF
-MDVBQUFFNzI0QUI3MThCMkYwRjNFNkM1MEY1RjUzRDlCQTU3MkZDMTRFQzYzODc4QUVDREFG
-OTkwQTdGNTBFQkMzMUE3CjE2M0E1MTdGMTE3MjFDQzg2MkY1MTU2QTY4OTIzNDg2MEJBMkNG
-RjE5RDZGQjMwRTYyNzJGOEFFOTkyNUNBNkJBOTVGNTQzMjMzQjYzRgoyRUU3NDZFREQ3MjVG
-NUYyRjUxNTE2RjFERjE0MzlGOTA2MkExQjJCMzIwNDQzNEYyQzIxODg4RDM4QTRGRjY3NkE2
-Qjg1MEUzQTY4MTcKMDQ5MUY1MzIzMTE2RUExMUJFMTBBMDQ5MDQ3MEY1OTIwNDRDRDQyQUVF
-MTc0OTFGMjU3NERDMjI5MzJFNzU4MzE5MEU5M0QxODJGRDcyCjVGRDZFRTAxQTYzQkNCMDE0
-MDE5QTY5MDI3N0U4RTQyMkNGQTRCMEE1MEZBRTA3MkUzNkY0QzZGMTQxOTNENTQ0RkJFMjE2
-QTc4QTNBNAo2ODlBNEM2RUNCOEJCMTQ5Q0I4RjZFQjZEQjAwMjk0MDlBNDhDQjdCNDU0RkRE
-Nzk2RDYzOEE3RUM3NDNBMTVFQjVFRTY1REQ5M0Q2QTIKM0RGREEwNEI4QjA0MEI4NTZCNzY2
-RkVBNDY1RTdBQ0QwNUNBQThBM0YxM0JBNEQyQjA0QUU1NTM5RDQyNEJGQTM0MjI3MDkwRkQx
-ODMxCjdFQUFBODM1MjhCM0Q0MEU1QzEwOEUzOUVCMkVDRkYyMzFEQTE0RTk5MDNFRkVDRTgw
-NzEzRkRCQ0JBQzkwNzczNDRGQTg2RDdGNzczMgo1MzVBMjZFQkQ4OUE4MDY0OUIyNkYyNDdD
-NzEwRDcyNTM2MTI3OEU3NzMxODcwMDk1QUFFQkNFOUI5QzA0QTczNjk4QTI4Q0U1MDlGOUQK
-QTFEODhFOUE4Q0VDQ0QwMjAzQzNBM0I4REJGQzU2MDYzRUNCMTdEQUU2MEMyNkE4MDgxNEY3
-MUZFMTJCMjNFQjE1QkE1NzQzQjRGOUUxCjI0RkNEQzk5RDQ3RDhBNDQ5QTRFN0JCRTdERThD
-QTM2RDk0Njc1NkREMEI5NDQzOEVFODBBNjc0M0U2ODNCNTcyMjNFQzZGMjA2MkIzMQowNDIz
-MTNFQ0UyQThFNjQ2MzYxRUU1RTI3OEVFNTk3RDc5Q0QxNkRGREMyNDAzNEMwRjJFMDNDNTRE
-REE5MTMyQjM3QUQ5M0Q1OTg2NTEKNTlEREE3OTNDMkNBRkM3NjUyODdGN0I5NDMxOTFCMDY4
-QjUyMENGQUNDMTM0RjQ3RDQ1NDEyMUVGMTc1MzA2NTY3ODc2MEQ5QTZCOTI0CkM5MEQ3QzlE
-NDMyOTY3RTRERTA2QkM1QUVFMTI1NTREQkNCRTM2NjE5QzA4NjVCMTlDOUU5MzlGMjg2Njc3
-RDQ2NDlDNjJEQzc5QUFCNQoyNEFDOUI2QThDQ0E2NkM0NkM4RUUyRTVEREQ0RTExM0I4QkMw
-RTM1Njg2N0IwMDFBQUQ5OTJGMUM4NTk0MENCMjU3MzYyMUM5OTg2QjYKMkU4MzBFMDgyM0ZB
-NDZGQjY0QUU5RUE3QTY3Q0VCRjBCOEFGNUQzQUQ2QUIzNjZFNTJENjBCNTAzNjIyMkRGNjVG
-NTA3OEY3MDIzNkExCjI1QTY1QkZDMzQ1RjZBNDAwQTgxREVFQ0QwNzE4M0ZCNUQxMEEyNjQw
-RjZEMjFEOThCOEMyRTA2NTBDMkREQjhBRDUzOUI3NzE5RDAzMApCMjIwQjkxRTE3RkYzQTVG
-RkZERUU0RDY2RDBDNDU4NkQ5RTRFREQxNUE2NDM5M0RFNjEyQThBMjA4Nzk5MUE3MjZDQkI1
-OTE3NkFFM0IKRDQ4Qzc5RjBEN0M4ODRFODMzREFCMjk0NDk5NTA5ODI1N0YzMDBEMjdDNDUw
-NEUzQURBNzFGNENEOUMzMDZEODJGQTE1QzExRkM3MDk4CjFFQ0RCNTlFOERDNTc4Nzg4MzE3
-QkJDQUJFQTc5REE4ODgyOTA3MzREQ0VCOEU1RUQ4RjdENTFDNjQxMDQyODFFRTAwRDk1MDc3
-RDRBNQo4Q0U5MDJBOEQzREI2Mjk3Q0ZCQUI5QjRFMEVGNzdEQjMyM0UzNEE1MkIxQTkzOENF
-OTUxQTE5ODk2NDBFQTQ5MzVBNDcxRDEwNzQ5RUYKNzI4OTQ3Mzg2REE1RUFBOUJFMDExN0U0
-MENGQ0Q4MDVBREMwMUVGM0IxNTI4MTlCQ0QzMzJERkU1RkFDRTE2QzIzNjY5MzcxRTYxMDgx
-Cjk0NzgzNjE0Q0Q0NkE2ODg1RTU0M0MwMDM1NUIxQjgxQUM5MTdEMDUzMjVGRDM5NUJGNjE5
-NTg3NkQ0RjQ2Q0Y3MzlENzQ4MjY1NzYwNwpDN0FFOThDN0RFNkQzOTdGNjA1NURGNjdGMTg4
-NDgzNkUyRDY4NUM4MDY0RDgzNEE3NzE4RUI0MUE4NDNEOTk0RTA3MEQ1NDg4RTI4NDIKM0Ez
-MDA2OENERjAxRjg0QTM0RUEyQzQ3QTQzNDFGQTk4QzkwMTFGQUVFNTFDQkQ5OERBQjI1Qzk4
-Qjc4QzA5NTdBMEZGRDAyMkJDQzk3CjY0MUY4NThEQzQ0NTcxNUFCNDYxMTE2QUU5NTY5NTNG
-MjA0OEZCMUE5OTBENzc1MkQzRUYxQ0I2NzY5NzU4MzY4MUY5NkIzODVGRDg3MAozQ0UzNUVF
-RTYxMUU4MERGQjBBOTkyRjg3QkVCNUI3MjRFQUIxMzBCMjU1M0Y0QjA1OTlFNzk1QzQ3NDNB
-QjMxMjQ2MEI2NUNENTNERkMKNjQ4RTg1M0MwMzJGMEE5RDc2MEYyNDFGNjE3NDcxMENEMTYw
-MkNENzhEQzQwNTMxNkIwREE0M0Q1RTJENEVBREExRTM2ODhGMzJDNkI5CjRGMDJFRTI5RUQ3
-OTg0OEM0NTk4OTExODc0MzI5NTdBMEY0MjhEMjU2RTAxNUU4NkMxMkU2ODY5NkFGQTREODkw
-RkI4NDIyNTQ4MjJFMAo3OUFBMzIwQkMxQkQ0ODBDMEEyRjI3NkQ4MzNGQjNDOUQ4NzQ2QjUy
-RUVGNEQwREMwQjYzRDAxRjYxRjk1MTJDMERGNkU5MTFBNDEyNUEKQ0VBRUY0OUFDNDg4RjFB
-Mzk1ODQzRjc2MERGMDE4MzgzMzlBQzVCNTNFNzYwRUJFMjU2QTA0RjA5MkNDRUJBRkQ5MjE4
-QURENDE2OUUxCjgyRDJGMjA3NTMyMDA4NTlBNzc2QjIzNkU2RTU0MDBDNDI1NUU3Q0REMjJE
-MUQ2MTM1NDgwRTE2NTkyRkI2ODAxNDJFNUFCQjA5QkMwRAo3QjY0M0JCRTA4ODhFRTVENUEw
-MDA4ODE1NzQ4QjIzNTZFNzE3ODEzQUIzQUVCMjBBNThDMjkxQzQ1NTkwODNFQTU0N0U2QkRB
-MDc1MjEKMzQyQUUxRDQ4OUYwRUM3RTlBQjRBMjRBQTk4Q0M0NDhBRjNBMTk4OTEwRTQ2Q0Y4
-MjlDQjM1MTgyREI1M0NDMDRFQTAwMEUwNUY0NEJCCjQ5NUE2Nzk3MzZFMUQzQUQ3ODg1OUMx
-OEE5QzgyRTlCNkRBOTZBREY0MzlEQUMxMjI2OURFMkI3NDU4NDE1MjVDNUIzOURFRjNGRjRE
-RQo0MDVDN0ZGQTMwQzI5QkY5RUE5NzlCOTc0MUREOUMwNzIwQzI1QkU0MkRGRjEzQkFEOTEz
-MjdEMTVGQ0Y5MEU3NTg4MjAxQjY0QzJFNzMKREU4MTM4NzM3RjFCNDc0MEIzQzU0Qjc4RkI0
-NTgwODE1QzVENDdBQjE4NzBBNTQ4REJDMjBEMTE4RjhBOEE3RUZBNUQ1MzgzRDcwNjlGCkUw
-QTNGN0VERTQzQUYxRTQxMUYzRTQxOUYxOEYzNDdFRDUxNTNEOUI4QUIyRUI1ODRERjJBODc0
-NzA2MDE0NUMwNzRDQzJEMzA4RkVGQgpCNjM4NDFFQUZFNTZDOTA1QjRBNEIxM0E5RkU4MEU5
-Q0JERTQyREZDRUU2QTNGNUJDOTg2QzJDNzQwNDAxQjQ1MDkzOUE2RUM0NEU1OEMKQ0JBNzk1
-NUI3QTI5RUQzREQyOEM3RDYzRkJCMDRGOEZDODI1QTYwQzYzOTlEQTc2MkQwNDVDNTE4MkYy
-NDBBOEVFN0FGNEY0MDQwMzkwCjk5NDJDOEY1MzNCM0JDNUM3NjNCMERDOTVBODM0RDFFNUVG
-MEY5MEJBRDA3RUMwNzM4MEU3NUE5NUY1N0I4QzFDNDZBMjhFRDZBNDU1QQozQ0RCMDVDNTY5
-ODFEQTEwMDY4RUIwQkQ5RUVGMEIzQjMxQTc2RjY2MEU5RDM0MEQzNzdCM0Q4QjYwNjhBNzIy
-OEY3Mzg2RDhGMEQ0MTAKMzcwMURERkNFNUY2NzhDQkY2RTcwRkRBQUJBRjg2Qjk1RTJBNzMx
-NDg3REYwNkI0RDAxMUUzODEyMEJFQ0Q2QjhDOURBRTIyQzk4QzM5CjFGRjhEMDE5RkFDNTc4
-MDY5RjZGOUVBRUVCRERDNjdBQUJENDEyNjc2NEQxNkI4OUU0RjhBOTlDOTNBOTYxQjkzMTIy
-QTREOUIzODlBRQoxQzY2NEMzMzg4RTFFN0Y5MDcxMzIxRjVBMjJEOTE4MDJCNUI5NkJCODlB
-QjdEMEQ4NTMyNDhCMDFFQjc3RTUyQjI2NDYzQUQzMTdGNzgKNDdDNjI4ODFGMjFEMjU3OENC
-QjI4NTVBQTAyQTUwQkVGNTU3OUQwOUFBRUNBRjU5ODM1RTlFOTQ5MjQ1QTFDRjUzOTgzRTY3
-Q0Q1RjdGCkNBNURCQTVGNEJBNzQxRTdFNDlDNDA2NTIyQzM4MEE1MEEzNjMzMzQyMDQyRUMz
-MkY4MENEQ0ZENzI1QzkwNzJCMjcxQUM4MzcyMkY3Mwo0QjNBOThGN0M1MTZDN0NEQTgwNkEx
-RkFGOTdDRTQ2MjEwQzQxNTNBODQ0QTM1Mjc5MUU2QUU1OTQ2MTlGNTFDNjU2Q0YwN0I3ODNE
-NjEKNjRCRkZFRDg4MDlBMUU1MDJBNTMzQ0EzQzEyNzI3RkZGNDg1MkMwOThEMUMyRjBGOTI1
-QjNBMDI5RUZCNkZGRjgwREFCOERDRjdDOUNBCkZBNUY3RDk1OEE4NTA0REJFMkU3QTJDM0Yy
-NjFENzM2Q0Q0ODk0RkUwMDA5QzZDMjRCQzdGN0E5RUZEMTJFNkFFQjREMUE2MEFENjI1Nwo0
-QjhGOEI3QzU0OTU0RUQxQ0FFOTU1MTFGMTY4ODZFNTEwOUE5OTMzRDg0RkYyNjZFQzREOTRE
-QTg5NjE5QzgyRDM3NkE2MzUwN0NGNEUKMjMzQkM3MEJFMEQ2NjBCNkVCNDcyRjRFQjZCOEQ4
-NUM5NjEwOEM1RDAyRDBEMzlBNkQwMjQyOUQ2MEQwMTBFMUMxM0E4MUUxQUIwMDEyCjlGRERC
-MUMwOTAwRUFENzg0NUIzMEIxQ0M3OTU1MjBBMzQzRTBGQUI4QkNFNEQ5RjY0MkVDN0Y1MTg0
-NkY1RkYzQjg3RUVDNDA0MjNFMQpBOTE5MzFGREY3M0JBRkRGMzgzRTU1QjI1NTU2NjY3OTk3
-OUYzN0UyNTZENjA2MTIxRjBDMzExNkJFRTAwODk3QTdDMUMyOTgwQzc4NUUKQTM3RTA1RjJF
-MzA3MDE4MUYxN0Q4REY5QzEwNDAyMjE5NzBGNjI4MjAyQURGQkNFQTZDQ0VDREE2MTYzN0U0
-MEFCQUQ2QjBGNjM5QzIxCjczNTI5OEYzNUVBQkQzN0ZBRDMxMjYyNDczMDlFRjk1NzBBQTRE
-N0YyQUZGOTU5ODk0QzA4OUQ3Nzg3OEVCNUQzNzA1RjhGQ0I3NDhBQwowMENENzc1MzVCNjcy
-RkZEMzZFMTYyRDg1MzcwMTM5QzBGOEU3NjQ1QTY2NUMxRDIzQzZDNDVDMENBMDZBODlGMkNG
-MkYyM0MyN0E1RkQKMDcwRjU3NTQzOUE1RkY4OEQ5MjM1REY1NzlEODU0OTYyRTAyNUMzNDcw
-NzcyNTZBNUY0REQzQzVGQUUxMEE1QzI4MDFGOTNDMDhFMDIyCjk2MDBDRTVDQjAwMUNCRjcx
-RTgxM0UxMTZDNTYxNDczMDQ5NzZDQzI1ODAxQkMwMjM5RUU2RDEyQUYyRDJBMTBFNzI4QTRC
-RUMyNDlFMApCRTUzNDIyNzJGNkE1MDgyNjQyMjZDQTg0NzlCRDk0NkUyQkVENDA1Mzc5RDA3
-NDhENEE3MDdFMEVGRjYxNzVENUU1NzExN0EwNEZEOTgKQzAzNDA1MzgxQUY0NDMzM0ZENzM0
-NkREN0Q0NkY3MUNGNUFBMUE4NzIwNUVFRjhEN0IxQ0NFOTcxRjlCRERBNDY3NjI5QkUxNTU2
-Q0E0CkZFNDc5REQ3NzM4MEYyMkU5MzY4NUMxMkQ2NDFFQzMyMjdGQTk4QzkwRDkyNjVENzUw
-NEI3Q0RCM0NDRDA5MkY0QUUwNDg3RTg5Q0E3NQpEQzAxN0RBRjlDOUM5NDc3OEZERkM3Q0Yy
-NDE5RDMxN0FFRjJENzA4NTdFNTI3QTVGNDlGQTI2RkYzRUU1NzdBMEE0NEVGNTQxQzdENjQK
-MDYyRjdERjNFRkJCRDBGRDdCQTYzRjVENEYxRkZGNDAxM0YxNDkyMTU1MjFGNUU5MTA5MjU1
-M0YyOTczRTBCRTFBRkY2QjU4NzZFRTYxCjNBMDgxOTE3QTQxOTgyOTI0NTVERjdBMzM3OTU0
-MjM0RTJBNDQxMjc1RTVGNEE0N0VCMTlCMzM2Mjc3OEJBNzA4Nzg4NDdGNDc4RTM0MQpCRTA5
-MjU3REQ5ODIzQkIwNTg1MTJENTg4RkE4MjY2OTExQzU4NDZFQTVBRkM4ODY1NDk1Mzg3MjFF
-NDc3NUVFQjgzNTRGNjRFMjBEQUQKNEI5MTI5QzZFOTM3MDI0MTQwOEJBNEFFMUUwOTA1OUEw
-RjJDNUU0NDQzRkFGRkM3NjJEMkVEMkNBQzlGNkVDMjQ0NjY2MjEyMTc4NDQwCkEyRDMwNzRB
-OEI1RENCRDgxMEZBQzUxNjI3QTgxRkM5RDQwRkMzMjU4MUNDMUJBNDM4QjUwODY1MDUwNzY1
-RUFBRTFGMUU5OUMxRDg5QQpBNkNEMzgzOEE1NDU5RkJGOERFQTIwQzk1MzE4MDFDMDM3RDUy
-ODhGNkNFMTlBQjgwNzNCNTk1MUQ3Njk5RDNEM0M3RjkzN0I1QjUyMUEKMzVBRTEyNzkxMTAy
-ODcxQTBDMjdBQUVGOTYzMTE5MjE4MkE1QzQwQjlDODM5NTlBOTYyMDc4MDJERUU5MjYxMUZG
-Mzc3ODY2NERCMUFECkQzMDlCRkFGNUVCQUFFNEI4QTRGRjAwOEMwQkU0MkYxMTUxRTlEMUY0
-NjBDQ0YwMThDNDI3MDNFMUEyODM2Q0NEQUJGMjZCNDc0NERFRgo5RTExMUM0RkI4MUZFODlC
-NEI5QkMxNUUyODgwODU3RUIzNEIyMTk1MkM1NUY4QzYyRTgyNTRFQzMwMEZDRTFDRDVENDY2
-NTdCOTAyQTEKRDgxQUNEQUU5MkU0Q0NEQkU0QzM5REY3NDdCRjlDRjhCMUNGQTMzMTRDNDUz
-RkRFMjNGNTJFM0FCMUFGRDY2QUZFMTJGNkRENTNGQzVBCkYyMzZGMTIyOEVFQzlEQzhDOEFE
-RTgxNzMzRDZCRkFCQTY2OTg5RURDNjc2MjQ3NUYwRTcwMjI4MDA5RDEzMDFERDVBQzY1ODNC
-RTEwOAozN0Q5MEVDMUQwRTRDNTQzRERBNjY0NTk2OUZGMzRDN0JBMjFERjJBRDNCOTUyN0VC
-MTA0QjcwNDk4RUU5RTYxRkZGQjJGQjM4NDM0MDQKRjhEQzMyMkM4OTQ2MzU5NDY0QUMwNTcz
-NzBDNzZBOTBFRDNDMDI1NEQzOEVGQjUxNkI4Qjk5RTE1NjA4NTdFQkI1Q0I4ODU2NkFEMjY5
-CjU2NjUyRjFEMzM0RjAxRkM4RjAxODU0NkE3RjQ5RkQxNzEwM0JCNUVGMkE2QTNCNkMyNkY5
-Q0VCRkZDNzQxOUQ3MUY2MkFBNUIyMjJGOQo5M0VCNUEyMjdDNzNFMzEwQTNGMzRDMTlBM0Y3
-Q0U5QTEwNTM2REU1MEJEODFDNDExODIyMkMxNjNEMENFQjhBMTZERjZCNEVCRjJCMDYKODQw
-REVEMDgxMDZGMjhERjkzRTMzQUMyQzQwNzVCNDM3MjM2OTBGOUM4OTBENEY5MUNGNUFDODc0
-QjRDQTdCQ0UyRjI5NjJFNTMyNTI2CkY0REFCNzQ0RjgzQ0Y5MDVBQTQzNzdCRTZGMDU3NThF
-QjQ0NjEyQkNCRDUyQTU2OTJCNjBCREUxMDU4NkExMTEzMDA1RDkxNUE3NERGQgo1RTQxOTIx
-MEIyRTVBODZFNTgxNEVEMzRENURBRUQ2RUVDMzgwMjg1MTE2OTYxNUI2QTI3NDRBNUJDQkE1
-QjY3RTkzM0ZFMkQzRDczOTgKMDU2RDdBMzE2QTRDN0QwQTc3OTA0MDVDN0EzRDA1MTdFMTc0
-ODMxQUE3OTgzQTg3RkJCNEM1RDI0RjJERkZCRjg1NzdBOEIzMEEyMDlCCjI3NDY2NzMyRjYw
-MEI2MEZGNTAzQUU1QkNFRjA4QjI5QTk3MTVFREQ3RUJDM0RBNEUxNTIxOEI3NkQ4RkQ2MDY2
-NEI2MUUyQjY4MkIxRgo1NkNFNEI1QjEzQUMxQjBFQTRFREQ2QUQ3NzI0NEFCMTY2QUNDMjNC
-MTAzNzkwRkNGMzJGNDFCN0MxRTE1RDc4NkE4NUJEM0I4MUE0NEQKMzc3NDM4N0NGQkQ0MUI0
-M0I0Njc4QUY0MjE3NEVENzZCOUM3MEY0QkMxODNEMDFDNTI1RUNBNzU2MEE3REMxMkUwODA0
-RjhBNkZDRTA1Cjc2MDM2MUI5MEExNTY5MTVFRkI5NUNGQzU1QUQ0REY5OUQ3N0E2NTM3Njg2
-QTJBNjBEOUY5MjZERDlCQTNGQkQ4QjY1MUQ1QjY5QkZENQpBQkVEN0QyQzhCMzI1MzlENzUx
-MzQ2MTU3NjFGQUY3ODNBNkVFNEMzMUI0NzIwNDgwOEM5MTU2QTZFQzJENzAwNDlEQjM1QTcy
-MDc0NDcKQjM0NkRBMjQzNURCRjQ2QUY3QjI0QzZFNEJFMUI3NUIzMEU1RjY4NjgzQTAzMDUy
-QjA1QkIyREQ3NUE1MTI3Q0VDNEZFMTEyODRGMDNDCkE5QzQxMDJBOUJCMDEzMEVCOTk5MzNB
-NzQ3OURCNTk3OTYwNjQwQTNFQjkwQkYwRURGODlEOTNBOEI3MzkyMUU5RTdDNEY3ODJFREZC
-MAo3MjMzNzcyRDIzNDNEOTBFMUU1ODFGRjIwRjUxODFDNjdFMDUwQTE0QUU0MEVGQUExNkZD
-RDYyRkQ5QUFENDE5RTMwMUQ2ODkzRTIyOTEKOEJCQTMxMzQ1QTlEOTQ3MjA4RUEyMzkyNEI5
-MjU3RUU3NTNBNzEwNEU0MUVBMTBENzJCNkU3MkU1MDcwNTNBRTM1QkMyMEFFNUYzNjlFCkIw
-RDc4MEU1Mzc0MDY3ODBBNTVBRTdDMTEzQTgxRjRFMTAwOEZBRjI3NkY1OThFMjc2Mzk5QjRE
-RjExQUZFNTFDRjhEMjJBMzVCMUJDRAoyNDdEQTcwMzc3Q0JGN0E5NkU4RENFQzE5NjU4Rjg4
-RDZBMjE0RDNGQUQzNTZCQURDNjUwQTQxQjM2RjEyQjExRUM5QjE0OUZCNkE0OTEKMTBERUYy
-MDNCOEY4NjcyRkNCQTMxNzk3NEYxN0VCQUYyQzgxQ0IzOThBMDZCNjJGNjM1RUUwMTBFMTk0
-QTM4RUQ0QUIzMEM3RTcwNzlDCkFENTFFRkJBOEUwNjlCODExQTM1QjQ1OUIzNTM3RDY4MDFE
-NzQ3QkZERUM1Rjg5RjQ2NUZEMjk2Q0UzOTZGODk0NDkyMkQ1RjgyQTEyQQpBREZBRTM0QjZE
-NzIzODI4QzhBMzAyOTJFOUU4QUQ4RkI4RDk3QURCRDlBQjIyRTVFNDU1MjNCREZGNEMxNzIz
-Njg4MTYzQkM3RUNEREYKNDQwNTJCNjk2MTY3QzBBQ0ExQjRBODExMzVFMEI4MzdBQ0NEMjJE
-QUJCNURGRTQ2NzY1RUQ0QkMwNTU2QjdGQjI3MjM5ODEyRkQzMDg5CkZBNDgzRUFFNjBDMTBD
-RTZEM0I4RkIwQUUzM0YwNzAyMkY5NkUxQjk1REM4MThDNjdBRURBMUQ0MUJFMTE3MTI1NDhE
-MDU2OEEwNjJCNQoyNkE0NTY5QjlCQjVGNkVBRUMyRDE3NkY5MjRBQkZDOTk3OEUzQUZDNDI3
-RUIyQkE0NkM3NjhGODNFODZGM0I4MTc4NzA0RTZBRjRBRDIKRUE0REY0N0U4OTg5RjMyN0Q4
-NTgxMjc5MEVBODg4Q0RDOTIwRDE1QjgwRTUxRjdDRkM0NEExMTg5MTI3RDJDOTQ2OEQ1MDIz
-MUNBODA1CjAzREYyQzIwMDdFRjI3REE5QzQ5OEM3NzhGMzgzNzczNUVFNUVEQUM0N0Y0QTAx
-QzJBMzkxQkUwMjMwMDQxNTY2NTIzNDlGMDYyQjFFQgo1MDRFNUFCQzgyMjgyQTQyM0U0NzM0
-MjAwMjAwOTc3MEQ2NDZFQTUwRjkzM0YwQkM1RTYxNDNGQTRCMTczM0RGQzZERjZFRDdERTZE
-RDQKRkI4Mzg4QzdDQTgxQzkyMTBFQTBBOThCMDI3NUI3NEEwRTBGNTEwQzkwREY3MUM5M0Iz
-QTlGREI2QTg2REZGMjkyMTM4MjM1MkM4RkVFCjFBMEEyRTYwMDNCMDA1NDY1QzFGMzFCNjY3
-RjVCREQ5QUNFNzQ1MzFEMEZERDU2Q0VBQkJCRjVFMEE1NTYzM0UyOEY3NTBBN0MyNTcxRAoy
-N0ZDQkUxQjAxQzM4N0Y2RjM2RDIyNUEzMEM2OEJEMTg1ODQzRjQ4N0MyRTk4QjU2MjlBNjI4
-N0NCQUYyMjY3ODgwQjJGNDg1OTYzMjAKRDdBMUVDODdEQ0U1QzUyODNFMDM0QUY1ODJGNTky
-QjdFMEIxODUyMDlBQjA3NDgwQTk4RTY3NjYwM0Y3RjkyRjk2RjlBRTZFQkU4MEE5CjVFNjI1
-RUY3RjRCNDY5NDU4QjJBN0RBQTRCOEZBRTkxMDM2NTI2NjNGMzUzQzM1Rjg4RkZGRUM0MTI5
-NjgwOUQ1MjEwNEUxRDYyOTk5OAo3MzVFMUNBNEQzNjQ0MkJCOEJENkMwMkVFNkUyNzM3NEIy
-NUNCQUU5NzA1MUZERTdFM0VCODFFQTdGNkQ4Q0JEREE0NUYyOTIzMjQ1NkQKQzFDNzBCNjA4
-NjlENjNBNTA5RTlBQTMzREQwMDE4N0JFRDVBQTEyMkFDOEFDQUU1QjVBMDJDODVBNEMwQjY4
-MTkzQjJGNDM1NUVBNzc5CkRGNDRGNDg4MjcyRTkyMjk3REYxQzhFN0ZBRUNDNEVGQjAzMUUw
-MjMyRUMwMzJGMUVDRDRGNkMzN0I2NzA3QTI4RjFDRjlBMjY4M0ZDOAozQjk3MjVGMTk0OEQw
-MjA5MzEwNjVDQjUyMUIzNDkzNEQyQ0VGRTk0NThBMUNDN0VDNTUyOEExODNGMjcwQUFDMDhD
-RTgxODRCOTA0ODIKNjIyMUNCQ0E0REFGRENFODgwRDM5MUQ2QzREODI4OUJCNDVFQ0M3M0M5
-NERFQkFBQkJDRkQ1MjlFRDlCNUZFNTVFNUQ2QTQ4RUIwOTY5CkVBMDNFMTVCOEQ3REE4RDU0
-Q0IxNUUwMzcwQzhFMzlDQjgwMTU4QzZCN0Q0MEMyOTUxRDczMzQ1QkYzRDgyRTQ5Qzk3NkEw
-RTkxOEIxMAoxQzIyRkZENTUxQzY4NUEzQzdBRDE3REM5OTE1QTgwODE1RUIxMTQ1NTBFOUJB
-REZBQzJFQUQxN0MyOUQwQzgzNDg3MUNEODg1NjNGOUMKQzJDRDhCMTkwRDAyRUUzNDZBODJD
-NTM3REYyOTk5NzIyNTg0QTk1ODQ1QkIzNjdFNEY3RDY3NUZEMDY3REM0MkZFRDU5NTQ3M0M5
-QjU1CjE5MTFBNTRCMTRERDEzMEJDN0NBRDc4QzQ2OURCQTk2NjA5NkZBNjlGQjkwMjdDMTU0
-MkI4Qjk1QkRBNEZDMjI2ODNEQUYyMkM4RUJBOApFMzU4OTI5RUFFNkMxOThDN0Y5NzMwQzVE
-M0JBRDYzMTk2NTE1QzRCRUFBRDI3QzI2ODQ0Mzk4QkQ2NEQ3NTBCQjA2QTI0MDM5N0JDOTEK
-NDkyQUNFMERBN0Y2MDUwQkJCMTU3NDBEQ0JCRkMyREM2N0NDNzQwQUU4RUU5MTUxOTI3MTVC
-RDQ3MkE0NUJCRjMzQUE1RTNFOTNGRTZGCjZDMzlFMDlEOEVGMzA2OEQzRTdEMkJFNzY4NjMy
-QjZDMkYxRjJCMEYwODg0NEM1QkQ3QUYyRUZBNkNFRDI4NTY0Njc1MEY3MEVBODE5QgoxOEIw
-MzcxQjNERjdCQzREQTJCOTBFOEZGQjlFM0RDMDY2QjlFQ0RGMDFBMDJCREJEODgyQUI4OEVG
-RDdGQ0YyNDY3RDRCOENDMzIwMjQKMUZENjhDNkM5NzQyQzVFMjUwQkE2NjJBODU2REE3MTk0
-QzBBREUzNkJERkIzNjU2MkMyOTEzMkRFRDNCQUEwQTg3QTc2MTY2OUNFM0IyCjU2RTExQTZD
-QzQyQkRDNkYwQUUwOUY4N0MwRDdGRTY4OEVGODk0OEY2OTIxMEFDQjE0OEE5M0Y1OUZDMkVG
-NUIyMUI4RTgxQjcxRDE4NQpEMzdFMENGMzZCMkYzM0JCRDc3Q0QzNjA0N0U5OTg4NzA0QjA2
-MjlGQ0FBMzE4MDAwQURGQzRCMzcwRkE1QjIxOEExNjFBRTdBOEQ5OUIKODg5MDcwMjlCQzgz
-MTM0Q0U5RjkyQjIxNzM1QkExNUYwRkU1NDdFQTc5RjVCMkQ4Q0M5NkQxMEUxQjAzNzNBMTNF
-RDE4NTAwRUVGNDYwCkRERjJDQUVDQjBGNDRBNEY4OEE2MDkwRDY2MEU4NzlBQ0MwM0ZEODVC
-NDkwOTA4MkRERkI3QzkwNDI4RTJBOUZFOEI2MDM3N0REMUVDQQozRDA4ODVDNTQwMDQ3M0NG
-MjEyREZDMkVGMzA5OUM3M0EzN0IzODg2REE4QzEzOUZCRUZGODQ5MTE2ODdEMURBOTYzRDBF
-OTY5MEJFRTMKRjE5MUE1RTFGN0I5RDNGRUIwQTQ5N0FDQUNFNjhENDI2NjBEOTRDRUE1ODI1
-QTE5QjY1QzFBMzk0Q0FBRUI2OEJFRDVCODg2Rjk0RDcwCjg0MDdDNkRGRTgxODQ0OEE0OUFD
-M0E5QkUxMEM4OTkxQkZBNURBM0M5NEJGNjA4RkVDQ0MwNjA2QkY2QUEwRjFFRDFBRUZFRUFE
-RjBBNApENTIyNjUyM0M0QzZBNzdGMEZDOUE2QzczMTg4MjZBQjhGQTI4NjMyNDIyOEFCQ0Qy
-NkQxREYyRkZGMTY1MEJENzE4NzlBRTVEOTIzMzcKRUI2RUFCRjlBNTk5MzA4ODk5NzUyMjE5
-RkY4Qzk3Q0E3MkMxMTI0NkREMTExRjM0ODY0NkYyM0E2Mjk4MEY2NDQ1RENDRkUwMzVBQTRD
-CjVCMkU5NzNBNzg3RUY4RURBMjYwQkY4Mjk4Nzk0Qjc2RkVGN0Y2Q0Y3OURDQTkyM0Y5QURD
-MkIwNTI0RDlBMkQ0RDQyNjlFQTcwOUMzOQo1RDc1RTNGMjNGOTJGRkRDRjdFOEJGODY5MUQ1
-MkRGMTMzMjk3RTRBRUI5QjE2NjhBQzA5NzQwOTQyODQxMUM3ODg3NDI3REU5QzAzQUMKMUYy
-MjlCQjk4MzMyNTI1OEUzRDM2RTkzRDMwMEYzQTMxRTFCNDg2MUExQTMxRDYxNzMxMzU5MDQ0
-RkIxMDc2RTk4QzJDQUYyNEM3N0QyCjQ1OTM1NjE1NkUxRDk1NzBEOUI3RjhFRDMwRTE0Qzk1
-RDg2MzhBRjU0MTBFQUUzNEM0MUEzNUU1NTI4MDIyNDhEQTkyM0JFQUExNTNCMQo0RTYyNzM1
-QkQ1RTA5RTIzRTU2MTZGMTBGNUI2NkZFMUQyMzhFQTU5RTI5M0YwNDU5MDQzRTQyNTM4RTE3
-QUVDNzZCQjA5QzRBNjM1M0MKMzBFNEI3NTZBODlFNDBCOUQ5Q0E2RkUxRDQwNTY2NzY5Q0M2
-RkUzQjE0NDI4OTk3RUQ0QTI0QjIzOTYxRUYyMUE2MUQ4NzlBMjk2N0RBCkNGRjkwOTE4MEY1
-MjYwNEFGOEM0QkQ0N0Y2QTk0NzRDNDJBNzUyODYxRTgzMkI3QjkzMTYxQkMxMjI0Qjg2NzNB
-NTNCREM3RjY2M0JDQwpEQzcxQTlBQ0FBNTk0NDg2NjA3QzE4MEMzMDM4NDg4MUMzMjQ1NTQz
-NTc2ODVDMTQ5QTBEOTZBRjZBMzdFNEUzRDIwRDUwMjFGMTEyMzgKMUQ0Q0IxRjg2NzQwMzUw
-NzFGQzYzNDYzODA3NkMyNDgwQjBFQUNEMzA2QTYyRkQyMkVBODU5OTAzRjJGMzBGMUY5OUM4
-N0YzMjQ1REZFCkE0QUI1MTQxRDI4MEM1RUVBRTY5RjQ0RDQ3RDM1OUEwMTFBMUQwMUZFOEJF
-QUYzQjQzNDc4RjhCNDdBNEYzNzUwODg2MUEyRERENzcwOApCOUQ0NzQyQjZGRkExNTZCNjRF
-QkMwQ0Q4RkY1NjI0RkI4MDkwMkRDRTU5Qjc4MDZBNDNDODYyMDA2ODY5RDBDRkNBM0VCMTM0
-NzM5NTIKNDkyQ0ZEQURFMUU0NThBNTVEQjA3OEIxRUY1OERDNUQ2QzMwM0VBQUE0MTVGNDNE
-RTlGMTlBNTA4MTQ3RkFCRkZCRkFCNjk4NjJFNTI3CjE5NTIzREYwMUJERjIyQ0E3NzlENTg3
-MDU1RDM3NTM5QkJGOEQ4QkQ2ODUzRTRFNjk5RTY1RjdFQzZFNUQwOTY2MDFEMDkzNDBCRDEx
-NgozODU0NEE0NUFENkU1ODY2M0ExQzQ5NURDQzFGQTc5QzgzNTFENjlEMjk4QjQ5ODM4MkFF
-NDcyNUYxOEY4NkYzMTVDNTg4QkVEOEJGQ0MKNjY1NUNGMkU0QUJCNDM5MjgxRDE5OTk5NEJG
-MjFFNDdBMkU4NERCRTM3RDM2MzdEQjMyRTk2MUI1QzQwQkVEQjM0NUM4MjE5N0QzMjRDCjM1
-MEJDMzQ0RjJFRjkwRTZCNDk2QkRCQzFCQjRBMzU5QjcwNjMzQjBBMzUwNzZGQjg2QkUxMzQz
-Q0JEMzlFNkRENzc2NzFBRjY3MUNGNAozNjRDMUNEOUJDN0JDMTUxRkMwRkVEQjEzNzkxMUNB
-NTkwRjM3N0IzNTk5MDA5OUFGMzc1NkMxRkYyMTg2NTZEMTc2OUIyRTVBREU3RjcKNTcxRTcx
-MzJDRkJFRkI2RjBCQ0Q5RjQxNjRDMzM3MzhDQTYyOTM0RTEzOEVFNUE1RkE1RTgxQzNDMUUw
-NEQxQzFBQ0NBRUFEOEQxNUFDCjRGQ0JCMEZGRUJFNTc3MzQyMjcyQThCRTVGREU2MDY4MzBD
-MDI4OUFEQzQxNDE4QzcyODJCMENCNTIzNEQ4Qjc1RDY2ODgyM0EzMkI3MwpFMTQwMjI4RThF
-ODAzMTE1REYzOEQxRDYyMTM3MThCRkJGQ0IyMkIwNDA1MTA4QTVDOEJEMzAwOUQ2MEJGRUVE
-MUIxNUU3QTVEMjFGMTEKOThGMDkxRTExQjgzOUMyQkE4MDlBMjI2NTJGNTdCMzAwN0RFRTY4
-MjdBQzIyQTk2NTU2Mzk0Q0Y5MDUxQjkxQjFDQzQyQTIwRUFGQjhBCjJEM0Y5NUI3MDkwREE3
-OUFBM0Y0MzQyMDQ1RURFMjQ3QUM2M0Q4RDgwMDZGRTRDMkE2MTdDOUIwQUVCRjI3NTMwNDI0
-NzM3NjJFNTA1MAoyMDYyNzQwOUFFOEY5NzVFMDU0N0MwN0Q0MTQxMDVBQkZFRTQ5Njk4NUMz
-NDIzRTFGM0FDNzEwNzZGQUFEOTc3ODNDQTQyNTA5NTFBQjMKMzc5QjQ1NjJGMkE3NzQ0RjQx
-RkM0MEUwNDVBNzk2QTNDNzU2OTgxRDdGMzVBMzhCNkE1N0MxMkI4Rjg3NzJFRjA3NTM1OTFD
-NjVGNjMyCjcyOTczMkVGRTdGMDUzQzI3QTREQUM5OTA3RkVCQTA0MDNDRThBOTAyRjcxQTI3
-OERFOUE1NjE2NDYzMjU2OTE0QzFCRDExN0E2NkI4RAo2MjkyOEEwMEI3RkJCNjZFMzMyOTlE
-NjczQjY4MkJEQjZBMzA3OTBDMkEyREQwNkYzRDgyRTE5Q0Y0OUMxQjlDNjc2QTQ0MTNDRDRF
-NzAKNzE4RjkyRkMwMDg5QTcyNTcyNjhGNzVDQjNFNTNGOEQ0NzgxQzM3RThENUUzN0QyQzkx
-OUM2MTlBMzNCNEM3MTQxQ0E3MTA3RDFEQUM3CjY5MDE2MzU1Qzg5QzFERjJEQjc4MjcyM0I3
-MTM1N0NDMEFGNjc0RjBGMzZFMTg0ODUwODhBRDA4QjhCOTk1RDVBOUNERkQ1MDcwQ0VGRQoz
-NzQyNEMyOTA5QTM4QkQ2NkRCRTY0NDAzOTZEMDJEQzI5ODBGMUMwMTNFOUMyQzE2MUY5MjdD
-N0I4MDNCMzRFQjdDNTdGQjIzNDlGQjIKNzg4NTE1ODg1QjdCMkU1QkNDNzAwMUExMDhGQkQ0
-NzNGMzQ4MTBDMjc3NEU1NDkzNTAxRkEyODgyQkE1OTg1RUE5QUU4NEFEMDc2ODA3CkFFRkVG
-QzgwODFBQzhCOTlGODgzNzE5N0VFQkQyRDczNEVGNzgwODZGMDIwMDkxRjQ0MDQ1ODIzQ0Y3
-MDQ2MkE4NTZDNTkyMTU4M0RCNgpCMjA5NDczNDk0RTc4RDFEODFGMjg1Qjg1MDA1MkIxNzg0
-MzczREI2MkZBNkNFOEVERkI3MEVBQ0U0QzJBMDFDQ0E5QkI4NkVDNjFFNTQKNUU0Mzk5NDY2
-MjMzRjc3MTQzOTJGNTNFQUY4MjM3ODhFN0Y0NzVFMDY2RTcxOEEzQTU0QTgxODA1MDU4QjMx
-MjQ0NzM5QjlFM0Q1QkFFCkQ4OTY5MDFEOUYwMTRGRjYyNzI4ODQ3QUI3MTlBRDJDQTMzMkQ5
-OEY5OTUzMkQ3QTkzQzcwMzAyNzFGNUJBNTIzMDA5NUJFRTgxMDZBNwpEMzNEMTZEMkQzQkQ3
-NjA2NEFEMjY0MzE5MjJCN0NGNDMzQkNGM0FGMDJDNTNDNTlEMzk4NzI0NzgyMjdFNjQ1ODI4
-RjJGRjFDNEIzQjUKOUJFRDlGODA2MUM3NEY3OTM0OEFENjM5QzRGM0E2N0UyN0ZGOTk5NTlC
-OTA5RTNBRERERjk4NUI3MTkzNTlGODAzOTM4Nzk4RTM2REU1CjY1NTQ0OEU2NTQ3MkNDRTJE
-NkE3NTM3QTVGODU1QTUwNDZDNUQ3QzY0RDc3RjYzNkUzMTg1OTJCMzA0MDk4MTExMEU2NjRG
-QUJCNUZFRQpCOUIxNEM0OEQ3NEU3QTQ1ODIyNzREM0JFMDdFOEQ2N0MyRjI5NEQyNTkxNzk2
-QTI4ODBDMzI1MzA2MEJBMjZBRkYwMEM1MDNENjE0REYKNzJCRjhCOTFFODBFNzIyQzVGNEY3
-NDk2QTE3QUQ2QjUzNTdERTAxQzVBQzgxMzZBM0Y0QjdGNzIyRDA4RUFGQjM0MTlDQjc2NjM4
-QTI5CkJERjI0MkJDNkVENEZCNzEyN0Q3NkY1MUI4RTc3ODUwQzc3QTNEOUZGRDk0RTgxNERE
-MDcyQzZBQUU5MDFGMUNCOTk5NjFFNzkzMjRENApBRDBEOTdDRTAwRjdBNENEQ0NCRkQ3RDVB
-OUE4MjI3MEIyRkM3RTg4NzU3NzQ3RkVBRkU5MTdBQ0M5QzA3NTA3RjJDODc1MzA0NjVCMkYK
-N0JFM0I2MjA0N0YxMUVFQjBGRTc1MTNDOUE3RUNCQUVGREI2NzhGMjk1Q0JGN0I1NUNERDA3
-RkRDMTFBOTc2NEEzMUMxQTc3ODg3RDNDCkY5QzEzREY3RDk4N0U3MjVDNEJEMUU3RjgwQTg0
-MzhGNTRGQzM2NjhFMkNDQUU0MkE1OEEwODM1NDgyNUJCODdCRDE0MjRBMTkxOTk3MwozQjQ5
-QjZBM0E1NDY3QjNBOTlGNzBCNjNFRDM4NTQ5MTY4REQ1RkVGMEE2NjIwQkQ1QjgwNTA5Njgz
-NzdDN0VDQzRERjZBNDNDODUyQzUKNzIzMzlDMEU1NEY5OTU0NzI0MEFBRjk0ODdCNzQ4Q0E4
-N0FCMjI3OEIxNjIyOTE5OTE1NTZERkRDQjU5NUMyOERCMDVENkQ1NTEwODI0Cjk2MTNEQ0FE
-NzE0NEExRUM2REEyNTlFMTZGREFDRTcxMjJDRTFBMTcxRkEwMzQ2QTkxNTVCMjVEQ0E4RTZC
-QTczMDA0NTE4OTFEQzIxQwo3REI5MkUzQUQyMTgzQkI0RERBNzBDNjY5RjFGNTVGQ0MxOTFC
-NTk4MjNCMDE3RTU1RDE1RTlDMEVCNzk5QkJBREJCODkzNUFEOTBDQkQKRkJBMTU2Q0I1MDNB
-MjMzM0E0RUJBOTJDQTJEQ0U5MkM1QjY4N0E0RTQzRjczQkI3RjA5QjYyRkE2QkU3RTE0OTUz
-MThDRTRFN0JBMzQzCkQwOEE3Q0I1M0UzMkIwNUY2M0Q4MzZEOEI1NjI5NjUxQUE0QzJEQzY4
-QUYyRTEzRjQ5Mjc2NDUwRjY2QjU2QzFFRjI5OTYwNENGMDkzMwo0QzdCMTU0QzkyM0Q0MTA3
-RDA1NUFDN0VGMEYyODQ3OEZEMDZDNTRGNjYzQjE3MERENThBNDFGMjkzOTA0RUM3QUFGNkM4
-RTRERkRDQzMKN0IwODcwMkJCRDhGRkIzM0IwMDcwNDRBQ0VFN0FDRTM0NjRENTQzM0E1M0FG
-QjZCN0VFNzU0Q0VEODMwQTFDNTQwRUI1Nzc4QzIyN0M0CjVDQzdCRkI5NDg1MDU0NERFNkMw
-RDE5NjA4NzQ1NzQyODRCMUQwMjU2QkZCN0U1NDgzRkRFREFGMzFBQ0Y3ODIyQTJCOUREMjdF
-QTFBMgpCQTg5MUQ3MkM5QUUyOEYwNzQyMTFENTI4NzU4QzZFMTY4RkJCQjEyNzQxOTkyODlB
-Q0EwMzdEMUE2NDFBREVEN0YzMDBBNEIyN0M5NTQKNjNCRUY4QTlCRDQ5RDQ5NjMwMDY1NUMx
-QUNCNzBBMkEzRkY4OUUwNjVCRTc5RjVGMjkyRUM2RjZCRDZGODk4N0I3QThFMkY2NjQyRTkx
-CjE4QUJBQjcxREM3MDU5ODFDMzBDNTFDN0ZFNkExMDgyOEE4RUZFRkM0M0VGQ0JCNkJDQzVB
-ODQ5MkUwMTY5RjAzNDkyOTY4RDdGMEVBMQpDNDMzOTUxOUVFMzZBMUU5MTAzNDY3MEE4NUIx
-OTNGNURCNjAzN0M1OUI1RTQ2MTgzRkZFNDY4QkRDQjc5NDkxOEJCQzhBRUIyQkE3MTUKMDkw
-OERBMEI2MzY1M0MwQkRDQ0Y4MEJCNjRGMzZEMEU1RThENDY4NUI4MENGQzdFM0U2RjREQTRG
-REQ0QkI4Q0E4REU0QUJGMTY1MDNCCkQ5RjZDM0MzQjZGOEY5Q0IyOTJDOURBRUZDQzY4RUZB
-QjE2Mzg4QUZGOTIyQjMyQjUyNTdCMDMzQzlEOEZDMDc4QUQyOTZENDlDQjhBMwozQTMyQUYw
-MUZDMTkyQkE3OTJDM0ExNUU2QzVCN0E0QUZCMUMyRkIwMERGMTgwNzYyMjk1NTBBREQ0QTk5
-MTAzN0M1RDkxQjdDRkQ0QTMKNUQwOEU4RkE4NUQxNkNDMkM0OEYzRjMyQkE4OTRDQ0JBMkM2
-QTNGOTY0QkRDQjhCQzRGQjkyMjZDN0Y4ODk5OTAwQzI2N0M3MEUzRUQzCkMwNzk3RkQ3Mzc3
-RDMwNDRENDNDMEU4MTcyQkIwRkI3NDZBNzA2Mjk2RDcwQ0QyM0E1Q0UyNTg4NTE1OEM4M0ZB
-MkM5RjEwQUMxRTBCRAo4Qzg4REQ2RDU4MTI4OUNFMTRBQTg4QjEwMkE0N0Q0RTUyNTQ2RUM2
-RkZFN0U4NDUwQUZFM0YwMTcwNkIyRTNBRkREQ0NFNERBQUI0MzEKNTYzOEUyOEZBNDY2ODQ1
-OENBQjI0NjY3NjhDMUYzRjg4ODFDRUE5RTlBN0VENTdBRTdBRkI1M0RDNTkwRTYwMUFEMTFF
-Q0EwRTVDQjJFCjRCRUE4OTVGNjI3MUI4NzVEMDlFREI5RDVCOEQ5MjY0N0I2Nzk1NDgyNEYw
-QUQ0REYxQ0M5RTgyRjk3REI2MzhCQjE3MzIyRUEyNkM2RQpDNEE1RTAyNDMzRDExQjZBMzdE
-MkFDMTBEQTZEMTAzNUIyM0YxQzZDODBCN0MzODJGMUVGQUM0NjIyQzA0MEQxMDhFRUU5MUMz
-OTdDQUMKRTFFREM3NjFDMUVCREFGRkNENjEyN0I0ODYyMUU2NjZBNUE1QzMzQTNCRDRGNTU5
-QzdDMkNBN0ZGM0M0QkREQjI4OEEzMDQzRTA5NDQxCkQzNUNCNTRGMTIxOEZGQzQwOTdEMUZB
-NjA5MTExODk0OTZBMTZCNDBEMzRFREE2NEE5MjI1RUYwMEI4NzU4ODUxMjdEMkE0NDFERUNF
-QwpCMkJGNkYxNEY2QTM4MTVBNzgwQTRERkNCNjIyN0M3MzU1QjM3N0VBNjFGOTI4RTk0NDg2
-Q0RDMEQ0MkVFOTI0OTRENTA2M0FCRTJEQ0QKNEQyOUU4OTY3ODM1QkU1ODk0RDM4RjA5Mzk5
-RTcwNDE4RDIxREJEOEFDNjc5MzY3RUE5REVGQTcwQkFGNjI1Rjk0RjU2Q0NEMURBNkRFCkFD
-RjU4M0U5NzYzQkNEMEVCQ0Q5RUU1ODEwQ0Q5MzMwRkVBRjVGRTYwQkUzQUY4QTE1QTFENThD
-QTJBOUIwNzg1QkMwOUFCQzUzRjg2QQo2NkNDQkQ4ODE1RjNGOEI5QjE4Mzk2QjA0NURFM0I0
-QTAwRDU5RDQ3RjUyQjUyREU3QTUyQUIyNkY1RERBMDVFM0I5NzUxRUUxMUE2RjcKOTI2NjU0
-RkM3RjkwOUVCQjc0MjMyOTUzODUwNDRCOEM0NEEyMDMyMDMxRDQ2MjA0OUZGRDc3Q0E4RjMx
-Nzg3MjY4RjY0RkRGMDAzOTdBCkE4OTQ5NDMwOEFEOUVGMTVEQ0VGNTVCQTBDNUFDNEU0NDM1
-QTUyRDIyMjVCRkVCNDM4QzkyMzBDQzY5MTJEQjE4RkNEMEE2RDdENEM4OQpCQjZCNjk5NzRC
-MENEQzI4RDA5NzRDOTRDMDVBNjExRUVDRTg2NjE0MEEwMEY0QkY5ODI4QzUzNjNEOUE2RkE4
-RkM5NzQzNjgzNzAzNzgKMkVFQzE4OUI0QUI5NjBBOEJBNzVFRjQzMkQ3RjdCODA1MUIyRDAx
-MkZGNzZGMUE1NUJBQkExNkRCOUVFNUM5QkRENTdEQTlBODdBQ0QxCkQxODcyRUI1Njc3QTE0
-Q0MyMEY4MzczOUQ5NUFBRDBCM0YyNjUwNjk3NkIxQzgyMkFBOENCNEE5Njk2MDIyMENCMjQ1
-M0RGQkI2RUU2Nwo2N0ZDNkMxNTRFQTkyN0ZBMDFFNjk3RDJGREU3M0Y5ODQwMDQzNDgwQTU4
-NDMzN0U3RjQ2NkY1MjQ4NTcwODQxQTczNDRBMzcyMzJDQkIKRjA4OEVDQkJCQTlBREE4OUE4
-QjhEMDBFQTdBRDhGQTAyQTRGNzlBRjIxRkI4RkM0ODc1MjhFM0Y3QjMxRjExQzNGMjY0NkZE
-NzgxNTVCCkZCMTAyNDU5Nzg1NTREOEM5NUJBNTk5MjUyODE1QTQ5OTVBNTA3MDI2MzQ4NzU4
-NjI2Q0EzODZGMzE3NDhGNzBDMkRGMTQ4MkI2Qzk4Nwo1Q0I3NTQ2QjNCMUI3NTZGMzE2OUVB
-MzU4OUExRDBBNTQzRkIxNjU3OTUyMzQ0NjQyNDNBNkRFMTJBRkE3NkQ1NzdFQTU1QTRCNzY0
-RDAKMjFCQkI0RjIwM0VENjZBNEZFQzNCNTEzMzNBNTc3NzZBMjEyN0RGQzU5RUUyODIyOTIw
-MEM5QjkzQTFGRDFFODRCOUQ1QkE4QTIyRkMwCjI0Qzg0NEZGODM1MTI1NkVCREEyOENENzhD
-OURDNzgyRTVCQjg1RDE4OEI0RkFFNkE0MjdDMjUxQkUyQzc5NEQ4Qzc3Q0EzOTI5NjAzOQo5
-RUJDOEJFODREQjlDNzgzMTlCRDM4QTQ0MTE1OEE5OTlBNzRCMDRDNEM1MjQ2RDY5ODJFRjdE
-Q0Y4RDhBREIzMDRBODUxMTI2N0ZGQUMKQzFBQkU0NkM5RUUxQ0JDQUQ2MzY2NUFDNjA2Q0FD
-N0Q1NkU5QkMzNjA5QjNFRjcyMTc2QjQ5QjYzQzkwQTAxMzBDRDE4M0I5MEE2QTQwCjc5NkU0
-Q0I5MDkxQkJBMEZGQzhEMEY4Q0YyQjAxNjgwMEIxQjQzOUI1REI2RkVBMEMzOTlGOEMxQTIy
-QjE4OTZFMDQ4N0EwODQ3NkY2NQpGNTA1NzE3QUUyQkNBMzEyRUM4OTFCQUY5NUI0M0Y0OUM1
-RjcxQzNCRjRBOEIzRTBFMzdEOTNBNzBEMDZDMkZCQkJERDc3RTdBMDYzN0UKQkJEQTI3QzI3
-QzUzOUVBM0FENzkzNkU0NTQ0NTgzRENDRkJGQUY3MzdBNjE1NTdCMEZFRDUyNDcxQjVBNTcz
-M0ExNTU4QzlCNTNGRDU3CkQzNjEzMDY5NDVBNjE1MEQxQzBGQzVFREY1MjFGMTdGNEQ3MjQz
-NDhENUVGQjg2RThGQTgwOEQyQ0YwMTk3N0I0MzFEM0U5RjRFOEEzQwpDQjFDQ0I0QjE3NTBD
-QTI5MzZBMzYyQTYxMEIwNUM3M0UzODJENzYxMTgwMjRFNThFRDUxMkIyMTJCMURBQkVFQ0RB
-NzE5NkM3NUJERUYKMzA0OTQ1NTI3ODk1NkY2MEZBMDBENDUwNzI5Q0NEMEYwMUI0QTYzQUQz
-MEQ5MkIwQzE0QzE1OEIxODM2NDdCNjU1QUVERUE2MTJDRkEwCkJFODlGNzlDMjJGMUYyRDZB
-QUIyMENDMzgyMzU1QjExNTlEMTZCN0MyOUVEQkYwNkU2ODMxQjM5NUVBN0E0MTAyQzk5RTQw
-MEY5MTFBMwpGMzA2NTg5QzVERTZDM0ZDQ0Q0MDJCNEUyNUU4NUM2NUIzMDFDMzk2QURBMDlE
-NkE0NTc3RjM4RDIxRUVBNkZCQThENTBCNUZDMzFDOTUKNzQwQTlBNzQ0NkI5RkNCNUQzN0FE
-QzMwMTAwMEFBQkM3RDhFQThERDU5QTYzREEwRkE4RjcwMzhCQjFEOUIyOTQ4NjM1NDI0Qzgw
-QkQxCkNBRkNCMTFGQkI4NTQ5N0JDNEMzQkNBRTJBMjRCOTM3M0NCRDAwNTY4MTgzNUQ2RkE3
-Nzk4QTQ1RkIwMUM1MURCODQyQjZENDczNzkwMQo4MzQ5QUU3RDhDNUE0ODA1MDI4QjFEQjRG
-NjM0ODY5QTNCQ0EwNjAyOUU4QkVBMDI4MzIzOTc2MjdEREZFOEJBQTQ0QjA1RDVFQjU1QjkK
-MjY1NUEzODdFMzQwNzMwOEUzNEFEMjAzOEM3ODAzNzk5NTMzOUUwNDdEOTMxMEI4RUVBODVG
-RTI3NTYzNkQ2QzVDMTk1ODY3MDFGQTIxCkVCQjc0MzRBNDkxNUNBNzFCQjBFODMzQzE2NzEy
-QkM2M0RFOThCNTIwOUIwQTczMDE4MEM1RDYwMTJGQTgxRUFFMDAxRTFDMUUxNEQ4MAozNENF
-NjQyQTMxRUZBMTJCM0ExNUVBNTNCRDg5QzQ5MkNENjY3MDUzOEI3QkZEQ0M2MjlBQ0JGQ0FF
-RTRGQzRDRUEwNzBDQ0ZDQjc1NjAKQjRGOTMzRTNEOUQyNTlGNzBDQzM2OTc5MDE5MjlBMUYx
-NjA1RUU4QTBFMDFFRTg1RDRGRkZCMTY3REU2RDkxNkYyNjMwREVCOENGMzE3CkY0OTRDNENB
-QzNFRTczQkUzOTJFRjk2RkJEMjMyRTRBNzc2MDIyRUUwNDE0NjU1MkYwRTFENjZCNEJDMTQz
-MDI5ODZGQ0VGNzZGMUI3RQoxOTY3NTNBMkI0QkNBODdGODA0ODk2QjczOTJGRjhFNTE4MzQ0
-ODg5OTYxN0YwMjAzODZFNjg4RTdFMjYyODZDRTVEMDYwQjAwQjQ4NUQKRUQyNjREMTkxQTVC
-NTI4QTRFNTE2ODMyNjQwMzU0QzMxRDYxRUM0RjdGQTcwMTI1QjVDNjM0OUZERTMwNjk0RTk1
-MDRDMEEwODBEMjUyCkI5MjIzMDU4NzRGMzkzNTRBMEZDMUExOTYwMjFFMjlDNTE2RDYyQTc4
-M0FDMjU5NEMyOEY2OUY2ODAzMzE0RjY3NDVBRTY2ODVFMzgxQgpGQUY4M0YxNEI4NDY0RDdE
-QTQxOThCRTQ4RTc2MDExQkU2QjMxNzFFQUQzNzBDQTY5OUU3MDc2MDcxQjJGRjE4NTZGNkJE
-QzYxRjNGMDEKMDM0QURERERGNTZDQzQ5MTRBRDc0MjgyODU5QzYzMkI5QjE0MjkzQ0RCQkQ5
-RkY4RkQ0NDAzQ0ZEQjc2MUQzQ0JFRkY4NDM5MUUzRDVBCjA2QjVEOTMyREVGMDg2MUVCRTZE
-RDg4NUM5QzMxREE3NjVGQ0YzNTg4NDczMzNDOTY2RkQzOUU1MDAwRTk4MzVBMzVGM0JBOTNG
-QTIwQwo0QzQ1OUE4RjREQUVERTJDOTlFRkJBMTNFQzBCODJBQjU0NkNGREY3QTk3ODc5NjQy
-RDk3RjY5QzIxNzM3QjIyMjgzQjYzNjQ5NEM5RUEKMTI5QTE2MUJEOEM5REQ1NjVCRkIyQTM1
-NTAzQjVCRjhBOTVBQTY5NjI3RTJBMUJCQkJGNUJCRUFBNzRBNThDQ0IxMUY3Q0ZBNDIwQjVE
-CjcwQjNFMzkyRDU0QTUyRkU1OUVDOUEzMDE3QkQyRDgzQjRFOTBFMjREOUZDQzZEODE2RTk3
-NTU0NEI5NkJCMUY0NDQzQ0RCODE5MThBNwo3RkREQUIyNUQ5QkY3MkQyMERFMTc2ODkxMjFF
-QzU3NTdCQjE4MzI0QUMwRDVGMzI0REJEODlCNzJGMjI3MUZBMzYyQkM4Q0NBQ0ZFQ0QKQ0My
-NTMzMUJFOEFCOEZFRDQ2QTZFNjkxRjNBQTZCMDcwMUY1ODJDQTg3NTNGNjQ4ODI4Q0QzRkFC
-NkU0M0NDOTJBOTI0RjI0NUZDNjA4CjM1MEY4MkNBRkY3N0VDOUUyRTI0Rjk4NTQzNkVDQTRB
-RDg0RUIyNDQzNUE1QzRCMzMwMTk4QjIzRTgyNUQxRUNDN0RDNTU4Mjg4NkU5MApEMkVBN0NC
-QUM5MDM3QjExQjE1NkFEQjgxMTBCNkZCNzk1QkZDNkQzOTdCMzlGRjc5RDhGQkJENDJBMDBD
-NjAyMEM2M0IwMTFDREUyREYKMjY5RjQ3NTRFODlDRjNGMThGMkI5REVCRTM4NTBBODZBQUMw
-RjUwMDZCNTI4Q0UzMEJGRjA1NTExMEQ4QUZBNjg4QkEzQjlGMEQyNEFFCjUwMTQzRjA5RDZF
-RTY5MjZCRkEyRTQ2MEI1QjNDNDg2RjM4MTBDNUNGNjhGNjdGRTJBOUREN0ZFOUIzOUJEQkIy
-NEQ2RTU5RDEyMTA4Qwo1MDE2MDA3QkI5RkMyMjc5MTYyMkMwNDQxMzJCRTZCQjhGN0Y5QzI3
-OEM3NTVERUYwMDRFMzEwRUFDRDhGMzk5MzNBNkRGNTZCRUJDNUYKQjcyQjREQzMzRUIyNTVC
-NjQ1Q0VERkVEQjkwMEI2RThCMUZBQTRFRDE1MjIyMkEzRTZGRUE4RDhCRkM3QzQ3N0VGOEQ3
-NTU3QjcwRTQ4CjY5M0Y4QzBEQ0QxMThFRjU0NEU3ODJDMjNERDNBQTNENjZDOTA4NTFBQzA1
-QjU4MTg4MzFFM0FBRjFDNERFOTUyOTI3NURGQUNBRjQ4QQoyQTg3QkVCQ0Y0RUU5NDg0MTUz
-NDEyMjc0NjFEODYyN0QyMTg3Q0M5MTg0REQzMzQzRjU1NERFQkIyNjhCNjVBRDgzMTQ5OTZC
-Q0FENTUKRjc1QjU5ODNGNjJFRkRGMTBDNTgwQUU0NzhCNkMzQzkyNTk1NDkwQTlFM0FGOEQy
-NzkyNDZBRkZGQ0EzRjNGN0U3OUZFRENCNjUyQ0ZDCjU3Q0MzMUI4OUUxOEFBNkM1RjgzOURE
-QzNFQ0NFQTAyNjQ3OTRDQTMxNkVFRTI0QTkzQTI1RTJERDEyRjAxMTVCNkNCNjUwMjI3RkIy
-NgozMEFGNENGNTVGN0FFNDcwMTMxMEUxMTYzNkEzOUM5RkQxRDM0MzY1MjRDNTdBQUY0MDlE
-MjQyNzZEQ0MwQTVDQkU0N0VBRTYyNEQ4MTQKQTNBMDk0QzVDOTYwQzM1NjY3NzhFODUwQkEw
-NENDQjU4RTUwMTZDQkUzOTlBMjAxQjc4OEE0NDhGOTk2OUNCMUM4OUVCRDk1OEFEODNFCjRF
-OUUyMDAxRDVBNzEyMEU3M0RGMEQ3MjJBQTNEQzFDRDA2RjExQjJGOEU5MTFCNzk0RTUwQjUw
-RkFBMjlCNDlBRTAxQjVDMzYxRjA4RQoyN0JGRjhEQkMxNkY0RTRFQzAzNEIzQUIxNUYwNkMw
-OEM5RUY0QjVCMDU0MzI3QkIzQTVEMjVFNDFGM0VERDUzRTJGRjRFRjM4NDEzRUMKRjVFNjkz
-MjI1QzI1NUE5RTFGNDA2MEIxRkZGOEUzODM1N0QwNjU0OUM1MTdGNDU4QjYyQThFMTIzOTg1
-OTg4NzI2REI4REUzQzlEQjM3Cjg0ODBERjBENzMxQjEwMDk1MTY0Mzc1MTJGMkM3Rjg5ODYy
-ODMzMEIwQjJCMjk2MENGODE1QUFEOTE3MUU4MDk3QzkzM0VBRkNBMDI2QgoxRURBMkZENUUx
-RTVGRUExQ0Q3NjA0MTI0MjM0Q0QwNEY1MEFCNTlEQkZGMTMxODQyM0U0RkE2RkNDNkI3RTkx
-RTRGQkRBMTQ5NDA0RUQKRThFMTM5OTNGNjVGMTJFRDgwQjYzRkIxMzc3MTc5OTBGNDUwMkE2
-MUMwMERBQkQ5MzQ1RTk0RjA0MzEzM0FCRUUyMkQyQjdGRjBERjIxCkM0MTk1QzNFMkY3QUJE
-NjM5OTQxRTQ3ODgyNDcwQTZDQUFEMEI0QThDOTZCNEU0RTFEQjkxOEI4QTkyNkFCNDBFMTg1
-OUQ3MTlGRDM4MQpGREEzRjE0OTAwNzZFQUY1RDE3MzExQ0JCNTlBMjZEMTk4Q0YwMzZCNUQ2
-QTU1MTY2NEUyQzIwNkM5MTBGOEE3MzY5MTgzQkI5NTMyOUMKMDk3QTdEQ0I5OTI1MDdGNDc5
-Q0Y1NDZENjQ1RDUyRjJCQkI0NTJFQkNBQjQwRkQ0MTA5NDY0RDE2MEI5N0FDQUYyMjZERjc2
-M0ZCMDI0CjlBQzk3QjcxRjczNUNCRkE1NkQyRTZBQ0Q3NzEwQ0U5QkMyMTg5RkU1M0Y1QkI0
-MUM1OEMwRkYxQTFDNTQ0MkZEQzc2RDIxRTYyNzNGNAoxODk2RDczOTRDRUE2Qzc1MDA5NTBB
-Qjg1RkFDNUM4RDRDRjE3NjY2ODBBMENGQTI0M0EwMEI3REUyRDE4MERDRDE0MTdDRjI1RDdB
-MzAKNUExQjE3NTM0RkQxRDg1OTVGRTcwNEEzNkI0MDJGODY4RTUzNEZFN0NBQ0FEMDM5RTEz
-Q0ZGNENFNTlEMzgyQzEwN0ZCOUREOTg2MjNBCjBGQzA0RjkzMzcwMTAwMzFBQTQ3Qjc5MzhG
-MTExMzM1RUI2OEFGQ0M4NkU0NzdENUU3NkExRTQ3NThDNzMxOTkzODk0NDg1MEU3MTMzMwow
-RjIwRTlBOURGOTY5MTczMDE4Q0ZGNTk0ODcxNjc2NDIwMTM2QkIxQTNFMENDODlDMjMyN0Y2
-OEIwQTQ4N0Q5NTQ2M0QxODNFQ0NGMDcKNEJBNjg3MEVBOTMzMkZGOEIyNjRBQTc3OTY1MEEw
-MEEwNENENUQ0NDNDQTA5NDUzREM5NjFEMzE5M0JEMjIyRDFGODBCQTBCOUM0MTYyCkQyMENC
-ODAxQjFENkU4REQzRDk3Q0YwNUI4NDFCQUIzREYyMkREQkIwNkRENkE2ODJDNkExRTNDRTU5
-NUEyOENBQUQ5ODQwNzU3RUM2Rgo4QkU2NkQ2QjlDQTNGNkVERDVCRUI2MzI0ODczQzBFQzdC
-OEIxMDg3MzFGM0U2QkM2NTg4RDY5RTRDNzU3M0Q0N0JCREQ5M0QwM0UwNTAKMDc2QjlBMEVF
-QkQ3QzAyMEJEQzY0MTI3QUI1ODQyNDI5MUIxQkM3MEE5RjNEMzI2QzY3RDkzQUQyNEY2N0NF
-OUFFNkJEQzgyOUQ3REQxCjYxRUYzQzFBNDc5OTFGNTRBODA3QzA4QUUwQUYyNEQ2Qjk1MkU2
-NkNCOEU5MTk2RUEwMEYzQUZEQ0IxNDEzQTMzNzYzRTI0MTA5NzU5QgpDREI1OUMyMjU3QzI4
-NjRDNDU4NzE5QkUxN0Q5Mjk5MTFDN0ZENzIxNDg4MTU3OTFBMTJFQzJEMkEzREQ2NDA3MzMw
-Q0UwQjRERkMzQTIKNDQwRkYwRDY5NzRCOTJCODFGQkYwNEIwRkM0RTQ0MjlCMDA5QzM4OEZB
-OEZERUEwMjlBQUQ3MDE1MUY1QkY3NkIxMzkzM0QzRjU1QjVBCkMwMERGRENFQTkxQURDNzNE
-M0RDRUYyOUVDMjYxRTA3Qjk2NDIxRTY0ODY1RkRFMUY4RUZCN0I1QUIxMjczRDVDMkJENTI2
-MUFDRUFERAo3ODUxNTA0RDE5QTkxRjI5NUQ2NjRCNDQwQUE2MTYzNkI2MkQwMkEzNDFDRUYx
-NDU5MjBDMzk2QzQyMjQ0Q0YxM0VCQjIxRDRCQzg1RDkKOTVBNTc1NjNDQkEwRDREMDQ2QUMw
-QjBEMUI0MEQxQkNEQjI2RTVBQjg2QTE3MjAwMDU1MDRCRTNENzNFRTIyMDE4RjM2NDJCMUQ4
-Q0Y2CjQ1OTZBMTVBQkE4ODg5MTZFOUYxMkJDQjE1RUI4MjMzMzdERTkwMDE1RkZGNUQxQjg3
-REU4NDQ5NUY2OTZCQTdFMTcwNEI0MjgxMzNEQgo1NDkxNkE0QkI3RTMxQkYzNkNDNzRBQzFC
-MUMxQUFDQzE3NkU0NEI0NUNFNjg2NEVCRjcyNEQyODgxOUNBODBGQ0QxQkNBQzlDNkU5MkMK
-RTYyRDMwNEUyRDE4QTNDODgyMDc0REVBRkVERjFDNTUxMDRGNjI5NDgxRTZFNDJFRTQ1MDcy
-QkJBQjMwNzRFQjVBQTFENDk1OEJGRkI2CkU1NDFGQzE4NDlFNkY1NDAyMTY1RjVDNEY3NTBG
-NzJDRkQ5MEJBMDNDQ0VEN0M1MDE0NzQ1QjBGOTY0MkUyNzFGQkY2NjQ1QUY0MzBEMApFOTI5
-ODRCQjRGOTZDOTkzRTMxODZDMEQ4QzI4OTdCNjkyQzBBMEQxOThGRjlFNDRDNjQ4RkMyNzIz
-RjhEOEE1NDdGN0VEMDhFODlFMDIKQzAwRDI2QTUwQkM4QTFDNzE0QkRFNTM0NTgwMTc2QzdG
-NUQzMTUzNTE0RkNBMjNDMkQ5Q0YzQjZFRkY3Q0Y2ODM3MTJCQjdBQjNDN0QyCkEzRTY2NDI3
-RUQwQjYyNUMwODhBMkE1N0VFQUEyQzQ2N0ZBRjBBQzU3Mjg0OTU0NTFBQ0EwOEFFNTUwNkY1
-NDEwNDExRDJCMDkxMkQzQQpGNkEzOTFGQzdBNEQ3MTA4QzFCMkZGMEQxRjlEMDlDMjM5NkNB
-ODVFQ0I0ODg1QjM4NkY1RkY1MDYxQUI3OEQ5RDkxNUIyRDNBQTA1Q0MKMTkyQ0UyNzUxQjhF
-MUM5OUIwNDNCMjQ5NTBGMjVENThCRTkzNzdEQzFCOTE5OEM1REZCNUZENkEwQjkxRUI5MEE1
-RjAxMjU3QUJCMTVECkRFOEIzNzVCMERENTVDQjE4QjhBNDI1OTQ3MjQ4NDRGQkI4OUZDQTIy
-MTU1MzZCRDlDQUQ4NjYxQ0E2QzkyRTMyQUQ0MzJGNTgxMzgzQQo5MENERTA1RjM0RkFBNTg1
-RkRFN0RBNDI4ODlFQjM0NzUyQUIyNkQyMUQxMzkxOEJCQURDMjNEOUMzNUI4OEM2RkRFMzFF
-QUMyQTQyOTUKRjQxNTlDRTFDQzk0MkI5ODMwMTI5QTFCOTQ3NEYxNTRBMTc1RjNBNzFEODZG
-MUJEQjRCQkYxNTA2Njk0ODk4NEI0RkU5MDJDM0Y4RjNDCjBBNDZFNkE1MUQ4NjA1NEQ2ODND
-MEExMUVEMEYxNTFGNzkwNURFNzNDNTg5MzM5MTUzRThCNDcwOEY2RDk0Q0UwMjU4MUM4MzdD
-NDFGMgpENjU1NTZGNUE3MDZDMDZGRkFENDM2NjlDQ0REQjJGRkZCRTAxRENENDYzODBFREMx
-NkUwODk0NUVCRDc0OUFEMkFFREQ3Q0JDN0MyRTIKRTNFNEY2NjZBQUFFN0E3MThBQjVGQjZB
-NjcyOTdEOEY5RkY3NjhGRDIxNkU0REI0NjQ1MzgzRUM0NTJGMzNDMTA0M0IyM0VEOTc4M0M1
-CkM3NjMzMTAxN0VERUE4MkUyOUNDQThGNDM2REI3MzE1NkE3MTMzM0U4ODUxQ0JDQUYyQTcy
-MUI3QTU3ODAwQ0Q3MkFBREY0MEI2NjIwRgpCOTMyNDM1QUZFM0ZFOTg2NzIwRkU3MTNENDI0
-QTNGMEU5MzYxNjg5NjBFMTcxQjlCNUI4NzIxQjY5OUMzOUI3MEU0MkM4RTA0MzBFNjYKOUJE
-RDI4NzBCN0M0QzY2NDQwQzEwNkRCREJBNzY2NTgzOEY5QzZDRjY3NDZFMTVEQjcyNUY1MDBB
-RDNEM0UyQkEyQzc5OTdGRjBENTEzCkM5MUJCNUM0ODI0RDUxQjg5RTdGRjNDRTI2RUVEMzVF
-OUEyRERBNzQyMDAyNkQ4OTY3NEY3RDMxODRFNkM3NkQ0QjZEMzJGMjhCMTcwQwpBOTI4QjU4
-Q0E5MjVFNjlGMDRBMjJFODVFMUVCQjg2MkM1QUIwOTk2RjA1QzYyRTZEQThEQjBCNjE5NUI3
-MkQ0NzNFQTIzQ0I4Rjk5MDAKM0M3RjM1RDUxRDQ4MEQwNTQ3QkFCRjk5M0I5MjM1NDkzRDQ0
-NzIzMkIzNjJEMzgyRkY5MkJBMTM1NTlGNjlBN0U5NUMxNzk3NkE1QTFBCjk3OUVBNjg3MjI3
-QkQ5NjlEMDZFNzMwMThGQjA5NzMxOUZBNjJEN0NFQzhCMDQ0MTlEREI0NDM1OTcyMzgyQzA0
-RkY5QzU3MDVERkJBNgo1NDg1NjFEMzFDRTAwNDU3NTU5NTM0RTUzMTM3NzE5MzE2OUE4NDQx
-NTJDRDA0MjIyM0I0N0I3MTY2QTZDRUVEMkI3NDZBQzIxMjUxRUIKOTAwRjkzRkM2RjYyNUQ4
-RkRFNkUxRDUzNzQ5NTBGNERERDgxNzU0OEVCRERFRjIwMTIzRkNFRDRDM0RGN0E3RjdDRTY1
-RTlCNUZDM0Q0CkYwNzlCMjgxRDdDMDNEQ0JFOUI4RDg3OTM1RDQyQ0FFM0VDRTU0RUVCRTQx
-QzAwQ0ZDOThFNjQ3ODA5MzVBRDY3NTk2MkJFOUREOTkwNQo5QkMxREI1OTdERTc3OEMxNjhG
-NDQ5MkMyNjE2NzA4NTAzMkU1MTE0ODRBQ0U2RkRDOENGODg1REUyMDBGRjBBOTkwMjI2RDA2
-NDBCRjMKRDc4RjUzNTc2ODc1MjAwRTg1NjA4OUIxMUE1N0E2NTdEMzdFMEJDNUI2MDQ2Njcw
-Mzc3MTE0Mzk2QjhDNzQwQjVDMTY2RTE1QURENUYwCjlCREQwQ0MzQkQxMUMzNDJCNjlDMkQ5
-MEU1NTA3RDgzRDNGNkZEM0RDMTQ0QTJEMkM4MEEwMkY0NTUxNDNGMTU5NDlCODEzNzRCRDQz
-NgowRTM1OTFGMEVFMjYwMjMzRjg0QjUwQ0FBQzUwMTNENkFCNjEyODM3MTE5QUMzQUJCNkIy
-REJGMEFEQzA2RUI0RDQyOTVFNDhGMUI2REYKNjBFNkM5ODMzMkEzODBCQjk5N0I3NjlGN0M2
-OTk4MjdBNkVBQ0I5RTE0Qjc5Q0ZCRjgzRTExQUE4Qjk2QTNFRTkwQTJBRUQ0MDM1Mjk2CjA1
-ODM0RjE0ODlDQ0U3NTQ0M0U3NTM4MkQxQjQxM0Q4RTBBQjRGOEFBN0M2OUEzRTQ5OUZDMDA3
-N0RGQzlDOEFFMTU1RjVFQjQwMzU3OQpCNjI5M0U4MEJFMzcyMTk3RjMzQUUxNkIzRjQxRjc1
-RkQwMzUwRTMyNjdEOTYzRDdEMzlBQUU5RjY3NDFFQjFEMjQyQjNGOUNCMzk5N0EKMDU3NzQy
-MUI4MTYxNjRBNTI1OTQ1N0Y1NjcyNEU3RkQ1NjJBRTY3MTM2RDVCRjc1QUFFOTI5MzRGNzMy
-NDBDOThGMjg5QzU2NkI4NTgyCkVGRkYzNDc3MUU5QTFDMDRGQTAxQUE5NkMyNThBM0M3MDU1
-MDg3NzIxOTgxRjQzNDNDQjg3RjA3RkQ0OUI5NTc2QzRGOTQyOUJDRUNBMAoyMDAyNzk4NzYw
-OUY2QTQ5RDczOTg0ODE5Qzk0MEFBMTcwMUE2QzcwMDg2QkRFNzIwRTFGQ0IwQzZGRkYxNEUx
-NTk3OEU0NjJBM0Q1QUIKNEQwRjIyMkE5OTBFRkI2RDA5RUM2N0I0NjdFRkM4ODI3NURGMjU5
-OEY1OTUxODZERTkxRjM5OEFEOENBM0QyMzJFRTZGQkJGMkI5NTk1CjA3MzVFMEY2MjVCNzA5
-Q0Q0RUQxMjZDMDYzODk0QkZBNUZBQzRGNEI3QTgwOTFGQjlEOTREMjk0RTNDMjg0NzgxNDgy
-MTg0RDlBQUJEOAoxRjcyM0IxRjlEOEFCMkM3MTU3RjhFNEE2MzZGMjUzQ0NFM0VBRDE4QTBG
-N0Q4QzM4Qjc2Qjg4OTEzQjhFOERGMTIxOTAyQkNBMUVFOEMKNENBMkIwNUVGQjVGRkQ4QzFF
-RTQ3MDI4ODVFQkU5Njc1NUEyRDU4MTM3OEY3MTY0Njg4NkRDMTQwMjE2RDEzQUQ0QzNCM0Yy
-QzBEMkNDCkQ4RENENEQ5RUY2OTk1MTM1RDYyMTRFQzRFM0Q2NTNGRUIxMUMyMkY1RUJGRjQz
-RUU1NTIzMEE4NkI4RTc4RTMxMkI3QUJBQUI3Qjc0OQpGN0M3MzcxODUwNEIyODY4N0FFQUY3
-MzFGQjgzRUE0QzBCOUI1NDc3Q0M1MkE1RDBCRDQyNTJGQUIwOTVGNTU4NTUzRkFFQTU3ODRC
-OTQKMTY4M0UwRERFNDNBM0M3QjE5QTZDOEE0RDM5RkRGQkU1MEY5NjcwOTVCMjAyRjVBMTg0
-MjQ0QzMxQzIxNDlFNzNDQ0U3RTBEMzJGRUUyCjU4NDI1RDBCQ0VERjlCRDJGQzI0OTYwOEM2
-RUNCQUQ0QjdFQUE2NEQ3RDAxRjMzM0FFMzM0RDE3M0U4NTlGMTYzMzk2QTg4QTFFMDlBMwo5
-NkY0N0EzRkQ0NDU3MzFGMThFQTdCRDI2QzYyMUUzNDlFMzE0MTU5Qjk5REM0NDMyQUJDOUZD
-MkU1Q0JEOEUxNjJEOUNCRkM3RjVEOEEKOTBCN0ExOTVBN0I1MTdBOTFCRDhBRjUxN0VCMjZB
-OEVCRkUzMENFNjY3QkMzNzY4NzBFNDA1RjRERUVBM0NGNDMzMUIxQTg5QjE0MkExCkRERjM0
-M0I1MjQxOTUyODYyODA0MEQxNzNFQjA4MjhDN0IwMEJBNjJCRjVERTQ5NTZCMjNGRTYyRjU1
-NURDNkVBREFGRTE4MzE1RjI2OAoxNUQzREUxQUQ1Qjk4MDhGM0EwMTZEQjY2QjE5Njk5OTJC
-RTdDQzY3NkVEQzI2Qjg3QTExQTg5Mjc4QTgyREIwNEJGNDFDQjIxQzgwNUYKMkQyQ0JCOUI0
-RTc4MUY2QjREQzc1NTg4MEVGMDU0Qzc0ODcwQjg0NzMzMkIzNDRERDA1NkYxQTNENzMxOTE2
-MkU3ODJBNjI1RTExMTBBCkM4MERFMTBDQjI2RjdFNjcwQkY5OTdFRUVCQzMxQzBEQzg3NUJB
-NjdCRjdFRTk2QzcwMzQ3REZFMDJGQzY0RjRGNzYzMkIyQ0QxRDgyRAowMjZBMkQ3QzE0NTM2
-RTdDOEFERDE4NDkxQ0YyQzAzQjk0QkRGNEE1NDUxMUI3QzlBNTE1RjNFRkJGMTIwNDkxMTEz
-RTdFQjU4RkVEMDgKMUYxNkJFMzJFRTdEMUJENjRDRDEzNDgzNEYyMDZFNjM2RjlEQTFERjdF
-MzkzNjU5ODIxNDkwRTkyQTgxQ0FEODc1NzM2NzEzRDZFQjI2CjkzRTA5MDZDNDM0NzY5OUY1
-NjMyQTdEM0ZFRTYyQzVCRDA5NTY0QUVCRUNDMEEwOTUwMEYxMjE2QjJCQ0M4RDlBQ0NFODU5
-MTBCQzQwNgo3MTY3MDExN0VDMjc5REQzQUUyMTIzMjlCNTBFNTVERTFERkE0RDM0RUVFQjUz
-M0FGNTQwNzMzMUNFOEZDQjJEMzlGMkRDNTk2NTRGQkIKOTBBODE0NTY4OTE0NTQxNEE5NTk1
-MUMyRTQxQTY0Mzc1QjNCN0M3RUZFODUwRkMxNTJEQjIyMjZGNTExOTA2Q0IwMUM0RDQ4N0RD
-N0Q0CjY2NzY3ODQ4MkRBMkEwQjU3NzI4QkJCRTA0RkQ3NDIwQzQ5Mjg5ODMxREM4QTYyN0M4
-MjIzNkIzNzY0RENEQTM5OUQ1QzhFQjBFMDkxNwowQTFDQThFNDNCNENDMkMwQUJFQzVCNjBB
-MEFFRTVERjczOEI3NkMwOEIzNTQzNzJCQzI4QTFFMzk4MTU5QjlCNjg2MzQ1OEVGNDBCREIK
-ODEwNzMxQTQ1OTk2QTY0RUM4MDg4OUI5NEExMkM2QzVFM0NGQ0U3RkVFMDkzMUFEM0JFQUQz
-MUM2MEUwN0I3M0IxODI4Qzg2OTE2OTc5CjU0NjAyQUE2MjI2QTgzMDkwMkJCQkNDOEQyNTQ5
-NEE3QjI0QTY3Q0UyQjI1OEE4MDUwQjk2NTlEM0ZCRDNFM0IwNDk5QTdGQUQ5MDg1MQowREFB
-NEUwQThGQzM5QkE2QTg3MTkwNUJFQzM1MzUwMzJCRDJGQzY0MUY1MzI3NEVEOEE0N0I4RDhG
-NjkzRTcyMkUyODQ4MEIzM0FGNzkKNzgwRjI0Njk3OUMwQkE5MTEyMDcxRTQ1QzczNUFDMzhF
-MEEyRkFFNjFFRDhDRUM0ODEzMDY1RUJEMUVCMzFGQjVGMERGMzczMjJCM0M0Cjc5RDZEOEFC
-RTdEMzAyMkUxQjEwOTkxRjlEQjAzRDMzOTRCRDcxQUQ3NzYzRDhBMjg3QTJGMTFBM0Y0Q0I4
-N0YwQTREMURGQzExQzkzNgo3NzY5NjYwQkYwNjA5NjUxNTRGQkMwMjU1RDZDRDQxRTc3QUJG
-NTI4OTIyODA5RDE0MUE4MDY3OEIxRjU2NDg1MDkzNzM0MjAxMUMyQ0QKQTcxOTNBNEJERENB
-M0ZCMTc3M0ZFQ0Q0MEIzN0YzNjc1MDdFQkUyQzRGNjk3NzhCRERFNTRERjlFRjcwNTgzREM5
-OEY4MEVFOTg0RUNGCjI5NjQ2NDY3QTQ4MTE1QjVCNDBEQzJDNzI1MTAwQTVCRENGODUyNEVF
-NjFCODQxQTQ1QzE1ODMyMzZFRDdCRDk3RjM3RTBBOTQ4NjkwMgo1NUE3OEE0NTYzRjI1QkJD
-MTk1N0UyNjdCQ0MyOTMyQjU5RUU5RjYyRkQ3RUMwNTMwNDFBRTkwQTE2NUU0REM0MTJGM0I1
-NTI1OTMyQTAKNUQxQjcyOUVFMDQ5RTk1RkQ3RERGQzQxMjg5RUQzMDU0MzBDQjlBMEJBMEUy
-OTgzQzQ5NjZBRDFFNEM2MzRFNjc4OTlDMTVDQUU4NEQ2CkM2QTBDMkQ2QTI3NDJENzQxRUU1
-RkI4OTdFMDA0RkE2QUE0OEFCQTczMzJGQkRGMDk3MUE0MTQ4RkU3M0FGNkQ0MDk0ODg5QTg3
-QUIwNgpGRUZCOTdFMTFFRDc4QzNGQUQ3NjM3NkMzNjIwREVFRjgwQkJGN0IyODYyOTAxNjVG
-NTlCNzhFMjFGOTZGQzJFRjAzNkQ2NUIwMTU4OUMKMTREQzMwMENBMkJFRjVFNUM5NDE0QTRC
-N0Y0RTI0MzRERkNCQUUwNTEwQzdDQUFGNUY4NkE5MTdCRENDODVBMEM3RDBCQ0EwQUNFRjQ4
-CkU1NEJFMUQ5NDMzMjRFODI2RTFFOUQzRjBBNTREMzY0NzRGNzQzMDBGOTRFMEQ3MzkxQTEz
-ODg0NDQwOTE1RDFGOTFGNUJBRjMxMDIzMAo5REMxOEEyQTc1RTg3REE3MjI3NjRFNzk5QTEx
-Q0U4OTgzMzIwNUI5REZGMjU5NDhFNUQxRjNBM0NCMUU2MTFDRTI5OURCNzM0M0YzMjAKMDBG
-MjZBMTBDNEU2MzU4MzU4QTVGNjU1RDE1RDM4MUE2RDk4MDAyRDgzREUyOUIxQUM5NDNBNEM2
-RjQyOEQ3NkU2MDc3MDJCNzc3NENECkRBQTNFRDcxMUYzNTJGNUE2NURGMDFCQ0IwQjdCMjVD
-RjgwMUUyNEE0RTM5Nzc4NDBEMEM2QzQyRDcxQzc1QUFBMDBGMjY1Q0QyNTlCNwpDQTBFQzI3
-Q0YwQjEyMDM5NTE1MkYyOUVDMTczNEZFNUY0MEFFQjRCQ0NCNkQ5QUEwQzVEMzhGRTczMjRG
-RUVDQUM1MDEzNDQ2RUIzQkMKRTdERDQ2ODA0N0QwQjc3MDVGRUM4OTg3MDA3M0U1RUY4MjlE
-NEI3ODJBOEM2N0UxMzRBQ0ExRkQ3RkY0NDA1RTFEMzk5Rjg3NkY5MzYxCjRFRjg4RTJGNjVF
-MTNCMUNDQjBEOTE0OUM1OTEyOTM5MTg0MzE1MEFENDkyNUNEOTVBM0NEMDU3ODdFREMyMzZC
-NUZCMDA3MkREQUIxNApBMTQ4MDUzQTRFMDYxNjk5ODA0OTBCQTBFNUI4QkQ0NkRDQ0QwNjNB
-RURGMTlCQjRBQzZGMTM5NjI5NjQzNUM0OTc1NkQwNDNCMTFDRUQKQ0U2NkU3MTEwOEZCNkE1
-RjI5N0E0NzZFRjQxNEFGNzVEODEyRDRFNDgzMEE4MDg5NDgwOTIzNUVGMUM0MzUyOEQwQUZF
-MzkzODcyOEE5CjU2ODUwNDlEMzE1NDhDQjVGQkUyODFDMzUwMUQwNTBFOEEzRUE1MjVBNTU1
-MDZGRkEzMUYwMTY0OTE5QjMwQTlCNEFGQzcwMjI1MDQ4RQo5MzUxN0UyMzRCMEQ2NzFBOUY3
-NEFFOEREMTU1RDM1REQ3MkM2QzhGRDM1OUI1MDIzRUY1QkM3NEE1OUQxNTlFMjZCQTY4RjNE
-MEQ3RDEKRDkwRjFCNjRBNENEMjcwQzFEQjY3ODMyQzgxNEI0NEFBQjI0NDdEQ0IwMEY3M0Mx
-REQ1MDgwQzc2MTYxMTFBQ0I2Mjg5QTAzNjJCNUZFCkMzOUIwOUQ2MkY5MjRBOThDMzdGMUMz
-RDNEMThCNzAxOEU2RjZENkY4NTE0MzZBRjZDRUI2NjY5MTQzRDMwQzg1Rjk1OERCMjc0NzIx
-Mwo3N0I1QjczNzM4Rjk0NDI1ODYwMDhDMzhCODQzRTlBNTY3RjdFQTg3NkEzQTMzRTE4MjdG
-MTJCNjc1MTZBQjJBNjc4RjEzMUQ4RkFGNjIKREY5MjNCRDZDNEM1QzJERTBCOUIyMjk1NDFB
-MDJFOTE4NUFCNkM3QTU2RjREQ0ZCNTkxMjg4ODFEODdDN0E4ODY2MTQwQUVGMEM2QzRBCkIy
-NTNCMTkwRTA0OEEzMTBGNTI0Q0U0NTNFQkE3MEQ5Njc2MjcxNDM4NDNGQzREMTlFNEU3MUND
-RkQzRkE4NEI3MkM1MUJEMjExQjJENgpFOTY5NTFFQTNBQTFFOUI2NkU1NUUwMTE3QTQzRjBE
-RjhFNUNBQUZBQTZCRkQzOEM3MUQ2OEFFQjg0QkUyQUEzQjhDMEU0NTE0MDU4MzYKNTk3MDNE
-Nzk1NjhCN0RFOEQ5NTVEMUFGMzE0NkY1MTRFNUQ4N0NDRUU5RjMwOEVEODAyQjQ5REFGMzQy
-RjhGNDU1NTMwOUJEQzA5QjNCCjlBMUQxM0VGM0ZFNkRCODc1Qjc3NUFBM0EyN0IyQzFBQUY2
-ODM5OEQxRDdFQzg3NTBCN0JDRUMyQjc2RjI3RUIxNkY1RTQ5NkRGMkEyNApEMTRCNkQ2QzM4
-MzA2MTZFMzI2QkQwQzQ1MDBEQjE2NDc0RjU3MDNDOTU1NkU3NjBFOTNGNzEwMUUyNTFEMTRG
-MUU0MjVCQThCQjczQkEKMTJGNTc2QTc3OEJERUY3NzQyQkVCMjI4QkFFRTU5RDQyRTA1NjU2
-MjgxQzQ4RTk4MkZEMDY5OTE3ODI1RjJBMDZEOTE3QzM5QTZFOTkwCjYwQjU3MDM3QTg3OThB
-M0M5QkJGMzYxQzgyNkY2RDBFNTY1Q0Q0QTQ2NTc3MDkwODI1OURFQ0E0NTJENDU5MjJFODdE
-QkNGN0NDOTY4NwpBQzdBMkU1N0IzOUI5QzkxNkMwMEVFRTM0MjJCNzk1Mjk4NDdBMTFFRDhF
-M0VBNEJENjUyMjQwMzM5OTU5QjE5OTYxMDc3MjE5QzdEM0QKN0FBMTUzQ0UzMzRCOTI4OEE0
-Q0ZDNUJEMzc4QzhEMUFCNDJFNkRBN0FGRTlBM0RBOTI4MzJBMjM1RDYxNUFBREI0MTRERjMz
-QTc4ODBDCjQ3NTc1ODdDQ0RDMjk4MTM3MjExNjQ0NDY2QzA3NzYxOEI2QThCNTQ0ODRENjI0
-MDBCOUNGRUNCRUFBMUFCQ0RCN0VFNzgwMjJERjQ2QgpBM0JGNEUzNkRBRDc1MjBBQzE2REJC
-RDg5NUZBQTg5Q0UwNkEzRkMyODMxNTNDQzg2MkRGNTQxOUFDQkMyN0RGNTNBMUMzMkI0QjUw
-QjkKMzRERDc1MzIyN0FBRDM1REFDMEY3Nzg1NTUyNEJFOEJBM0MwQzExNTExRTlFODVBQzRE
-RkM5RjRCQjk3QkRBNzc4NjRCMTYyREJCQjM2CjJBOUMwOEI3NjA0OEE4OEU4OEZGRDA5ODdD
-RDA5RDE2Njk1NEM1OUNDQjY2QUM2MUE2NTFFNDJEQTg1MUQ3RDcyNzNFNjBGQThEQzMzMApE
-MTFBNkQ4MDg3Q0IyNzY1QUYwODVDMDlDRTA1Q0FFODlCMTEwQzZBRDJDNDUyRkQ0RUQzMjZD
-QjY2QTQ4RTBGMDlDRDZEMEM1Mjg3REQKREZFRTlFNzM2OEJGNDFFMTkzNURCQTIzMjY3Qzk5
-OTc5M0YyRUY5QjhERjgyNjBBNzM2NDJGMzIyRTNCRjBDNzlCMUVCOTk4MDc2RDA5CkRFMTA0
-RjE0NkU2RUE2RUZFRkQ4NDI2MzU2MzFBQjJBRTM2NDYxNUNEMzI4OTRDQUREQTJFNjc5MzU0
-QkI0QURFREEzNTc2M0ZDQjE4QQoyRkUxNzQ3NjJEMzE2RjEwNzkwRUE4ODhDRDc2NzI2REEz
-RDEzNDU4RTdBNjY4OUExNDlCNTcwOUI0NTU4NjY1Njc3MTJEMjFFNTgxOUMKNUE3QjhDNEZE
-OTUzNzdBMjhCNzMwMzNFMTBBQzQ4NkM3MjA3NkE2MTY4MTNGMDU2QjFCMzlDRDkyNzlCNjRC
-OUEzODJCNTA2RjNGMjUyCkZEMEY1MTA3QjlDRjM2RDc4QjVFRjYwREQ5Nzg0Q0E3MEUwQkRF
-RUZGNjc3RjUwRjUwNkVDODNFRjMzRjgzMjM0NEFGQjY3RjlBQjREMwozREIyNEJFM0Q3QTAw
-QjhBNjBFRUNDN0VCNUZDOTEzQzA1RjY0MUM3MTU0MkVDQzkyMjlGNjc4MDlCOEFBMDE3NUVG
-MzFFQ0RGNjgyREEKMzkzQTkzNDNGQTE5QzRBQUI1MkU4RkQzMTBGMUEyRUE0OTg3RUY2RUNB
-MEQ2RUFGQTQxNDU0NUFGOTkzNzZGQjEzQkQ3NDREMUEyRUNFCjMwRTJERDQ3QjU4NzhERTVF
-NjMxMkVBNzZENjk5QUQ2QzIxN0JBRENGNTM1QjQ2RTJFQjc4MDBBODREMzA4M0E2MjcwQkIy
-QzVBNUQxQwowMDU3QjQyNDUzMUVCNDhFRUIyOUU0NDVCMUJBQjI3NjM3RkQ0OTU1NTM1RjYy
-QTFFRDU5QzgwN0YzODE2RDQ2QTk2QUEzQjAxNjAxOTAKNUZDN0YyM0FGMTc1Q0NEQkFBMDYw
-RUQ2Q0MxQUFFMTU1RjE4QzBGQTBEODQzOUJEQjczQzM1QkY0MTU3MTE0MkY4QzhBNjk2Nzg3
-MDQxCjk5QjMwMkM0OUFGMDJDNENEOTI5RDJDQTdGMDQwM0JDQ0I2QkE4QjNERDEyQjA4MUE5
-NjEwNDg3NDM2Mjc0RjBBQzhDMjFCNzIyQzUzOQoyMjYxMTAwOUI4NTgxMzUyRDk4OUVFMDY1
-RkIyRDFBODE5MUMxQjBCNzEyQzcwMkM0RkI1NjZBMTlGMzgyQjRBQzhFODQwREMyREM0NTYK
-QkQ5MUY3QkZFMkYxRUIyMjVGNkFFMTU2MkY2REU5RDRENkQ0NkJCMjQyNjEyNkFCQTlFN0JC
-RDIxRjE1OEIzRkE5QTA0MEExODUyOEQ1Cjk0NkU2QzVCNDMyMjA3MEIzOTI0MDNBRjE4Q0Uw
-REU5Q0EwOUZGQ0VENkY2NkY3QzY0NkMzREYxNEY1MTIxQjM0RTQxREJCQTY1MzM3MAo1NDk3
-QTQ0OEM0MTE1REYwMUU3REY3NTNFRjYxRDlCODYxODc5NkFBMjZFMEE4RTc4M0E2REYKMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCmNsZWFydG9tYXJrCiUlRW5kUHJvY1Nl
-dAolJUJlZ2luUHJvY1NldDogcHBjb2QucGZhCgoKCiUgR2VuZXJhdGVkIGJ5IEZvbnRvZ3Jh
-cGhlciAzLjUKCiUgQ29weXJpZ2h0IChjKSAxOTg3IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3Jh
-dGVkLgoKJSBBREw6IDcxMiAyODggMAoKCiVGb250RGlyZWN0b3J5L1BQQ29kZSBrbm93bnsv
-UFBDb2RlIGZpbmRmb250IGR1cC9VbmlxdWVJRCBrbm93bntkdXAKCiUvVW5pcXVlSUQgZ2V0
-IDQzMDM3MzggZXEgZXhjaC9Gb250VHlwZSBnZXQgMSBlcSBhbmR9e3BvcCBmYWxzZX1pZmVs
-c2UKCiV7c2F2ZSB0cnVlfXtmYWxzZX1pZmVsc2V9e2ZhbHNlfWlmZWxzZQoKMTcgZGljdCBi
-ZWdpbgoKL0ZvbnRJbmZvIDEzIGRpY3QgZHVwIGJlZ2luCgogL3ZlcnNpb24oMDAxLjAwMCly
-ZWFkb25seSBkZWYKCiAvTm90aWNlKENvcHlyaWdodCAoYykgMTk4NyBBZG9iZSBTeXN0ZW1z
-IEluY29ycG9yYXRlZC4pcmVhZG9ubHkgZGVmCgogL0Z1bGxOYW1lKFBQQ29kZSlyZWFkb25s
-eSBkZWYKCiAvRmFtaWx5TmFtZShQKXJlYWRvbmx5IGRlZgoKIC9XZWlnaHQoTWVkaXVtKXJl
-YWRvbmx5IGRlZgoKIC9pc0ZpeGVkUGl0Y2ggZmFsc2UgZGVmCgogL0l0YWxpY0FuZ2xlIDAg
-ZGVmCgogL1VuZGVybGluZVBvc2l0aW9uIC05MCBkZWYKCiAvVW5kZXJsaW5lVGhpY2tuZXNz
-IDM2IGRlZgoKZW5kIHJlYWRvbmx5IGRlZgoKL0ZvbnROYW1lIC9QUENvZGUgZGVmCgovRW5j
-b2RpbmcgU3RhbmRhcmRFbmNvZGluZyBkZWYKCi9QYWludFR5cGUgMCBkZWYKCi9Gb250VHlw
-ZSAxIGRlZgoKL1N0cm9rZVdpZHRoIDAgZGVmCgovRm9udE1hdHJpeFswLjAwMSAwIDAgMC4w
-MDEgMCAwXXJlYWRvbmx5IGRlZgoKL1VuaXF1ZUlEIDQzMDM3MzggZGVmCgovRm9udEJCb3h7
-LTEgLTI4OCA2MDYgMTA0Nn1yZWFkb25seSBkZWYKCmN1cnJlbnRkaWN0IGVuZAoKY3VycmVu
-dGZpbGUgZWV4ZWMKCkQ5RDY2RjYzM0I4NDZBOTdCNjg2QTk3RTQ1QTNEMEFBMDUyNTM5MkVF
-Q0FDMTYzRTU4NEE5MTA0RDk5QUQwQkMxQjFGM0Y3MTIxRDFEMAoKRjJDNjBERDIwNkIwRDND
-OEM0NTA2MjBCNDczMjBDQTBBRUI4OTM3NTExRTQ1NkFBREU4RTY2QjMwMUIxRTNFOURGRTE3
-RTJGNzlFQ0ZFCgpBNzA5RkYzREFFMTlCNEMxNjlERjY3NzNFREE0MTREMDI5MTVBNkYwRkFG
-OEIyNEZCQjA3NzdDNjk3QkU4QTM3RDYzQTM5MEFEOURBRTQKCjk1QkI3RTYyNjcyMUZGMkZE
-M0ZCMTQ3QzgwRDIyQkVBQzM3QzI2MjREODE4RDU4QzhERjAyMDlGNUNFNzZBQ0RERTU3QTMw
-M0Q5MDQyQgoKRjBBNjc0RDA5NTY5N0Y5MjVGNTMyRDE4MTRCRUE4RjhBNUI1MjIzQTMyQkM0
-QTk1NDAyRjJDODQzMTgxNzU4NzUyRkMzMzA5NzBFODE3CgozOTc3NDE4RUI0RjY0RkQ1RTQ1
-NUMzRTQxNjVDOUFCM0Q4NTA0RDk0NkY2QjVDM0Y0OTI5RDQ2M0UxRDZFNkI1ODEwREFENkM3
-QTY1MjkKCjBDQzZEQjk2MEExRjk0MzQwMEE4RjYzNjREQjM3NDJCRTk2QjVDQjRCNzhDREM1
-NjM0QTlFQjNDNjJGREM0ODFDOUMxMDFFMDQ1QzYyOQoKM0NEOUQ0OTFCNzc0ODJEMzI3OTdG
-NENDMEJGRjIwNTc2QzI2MDVFQ0FEQURENzc1QjIxNjVGRUYwRkZBMEY0RDg4NTIyRDFCRkJC
-MDVGCgpCQzUwNjJBRjU0QkIzRkUyQzBCMzcxRThDN0JFQTBDNjQ0QTMyQTNEQUZGQkMwOEJC
-NjNBOTdDMThBMjY2QjMxMEIxQzFCOTIwOTQzNDgKCjYwNDc4RDI4MkQzOTQxMjNBRTA2RDhF
-RjQ1NzI3OEJEMjZGRDZFRUY5Qjk1QjVDQzdEMzFFMUZFNDYyRDhBNUZBQ0FGNUNFNUY0MkI0
-NQoKRTEzOTVBM0RDNjBGMzdGNUNDNzUyQ0Q4MTkwNkYyOEQzOTUzRDYxRjU1MDc1MDgxRTE0
-NzQ1RkRENjU5QjVCMEEyNzFDOEE0MjNBMEY2Cgo3OEIxQ0UyNEU1NzNBMjRCMTBBNUJDMzc4
-QTlFNDQxMDI5OEVBREQ5MEMxNTk1MjVCMzU4RjcyMTQ5RDI0MjkxQzkyM0YyQzkxRDc3QTEK
-CjMyMzQ3RjVGNDcxRjExMzlCOTkzOEU4ODBDQzVCMzQwOUIzMzg1OUZFODcwRDI4Qjg4MkI5
-NkQ4QjUzN0JGMjI5RURBRkRFOEMzRjZDRQoKN0NGNTFGMThDNUI1MEUzMTVFOTNFNDg5NkI4
-NUQ5OThBNDNENDdCQzI1NjAxNjAxMzlGQTA0ODEzQjNDQzVDNENBRDUyN0E4QkY4QTIxCgo3
-NTFEMUZGMDMyNjEwNDEwODY1REM0M0M0OTkwODBFMzE2MkMxQkY3NDA3N0Y4RkRENDU0MThC
-QTdENjkwQzIzRkVCRTVFOURCQzdERkUKCjBBQkJBNDMwQUUyMDZDMTY2RkRDQ0FDRUEzRDRE
-MzQ2RjkxOUZGODI5MzExMUZGNjI2NDYxQzI4QTlFRjIwNzJCMjk1N0Q5OEExMkI3RAoKNDA3
-MkVBMjhGMDc3NTVBRTlEODNCNUQ4NkRGNEIyRUM4MTAyM0JEQjVERTI2MkQxQUYzRkQ4NDRF
-OTQ5NkZCRkNCNjFEQTIwMzg4OTA5Cgo3Q0MxM0NBOUJDNjk1RkY4RUIxMEI1OUFERTUzODRE
-MkZCRTBFNzQxRjk3REQxMENGQ0YxNjhERjM0MzA3NUYzNEY2M0MyNTgyQTUzQjkKCjJDRUFD
-NTcyRURGRkVGNTRCMkY4RkY1RDYxN0FDRURERTU5MDQ2QzREMkQ3QUFFMEYxNDdEOEQyRkMz
-NzY5QUUxNTkwNERFREU2Q0Q0RQoKMUE5NDRFNUFCQUIxODE0NTBDMzZDNzRCOTNEOENGRkVF
-QjNCNTg3NkY5RkE3QjM1MzBBMEU2REY5NjcwRTJCQTlDRTc2NzVGOUYxMzQ2CgpFRjNGNUQz
-ODIwMkE1MEE4Q0Q2QUQyMDMyNTBGMjkzMkVGQzA4QzhBNEY3ODk0QTREQzFDODBGMkIyQkIy
-QzcxNjgyRDIxOEQxNDgxQjEKCjE4OTY0RjMzQjE2RjVCRDM1MjJEMTZGOUYzNzM5RjA2M0Q4
-RDA1NDYzMDM3MDYwNDMzQ0U1RjJGODQyMzFFQkZEMUEwNTI0NDk3NTU1RQoKNDE4NTZEMTcz
-QzcwQUUwRTNEQjlFMUJGNEMyQ0NCOTQ1OEIwQzRGRjM5M0JGNjJGQkU0RTRFNzhDNTNGNjc2
-MjlFRDM3OEVENjk1OTE2Cgo1MjA4M0JGRDQzMkQwNUY4RkNFQTBGQUE1QkMxQjRDRTlFRjY5
-OEVDMjM0NTg3MTk0NERGN0FBNEM0RkMzNjE2QUQ0NEU5Nzg1RTJCNDMKCkI3MzgxNTlDODQy
-NjFGRkQwNEFCQUQwRjgyMDMzRjFEMzY3NzM3RjA0RjcwQ0IyODEyNjMwRDE3MEEwOEU5RDY5
-NzZGMTM0ODM4RTIyQgoKODJEQzYwQ0I0QjkzMjE1NTE1REY1QUUwQkREN0Q5RjE1MEIxMzY0
-QTQ5Rjg4NkY3QjE5NkRENEEzNTg3MTVDQUQ4RUMyODJGOTA2MkEwCgo2RDZGMkNFMEJFMUZC
-NzE4RjRGMEMwMjQyNDE2RkRBN0E5Q0ZBRDFBNjcwMDFERjdBQjdBQzM4NDBGNzc2QTQ3RDA1
-MTlBNzExNjM3NEEKCkQ3NjIwQ0Y1MjdERTYzNDM5NDhBN0NFNjc2MzMxMUZDRTdGMzE4MDMw
-NEMzREY1M0NDRTdERjg1RTlCMjFBOEE1NkVEMkNCMDA3MEM4NQoKNTY0NjhEQzZENkVDNDc1
-OEYzNDQyM0Y2QUU5RjFGOTczRkVFMzk0NzY5QjVBREE0QTA4QzkwQUFCRDVEMDdFMEYwN0U4
-OTM1ODAxMzdECgowOUNFOTRBNkNGM0I4Q0QyQTY1MEE2RjhDNDJGMzNBNUJGMDJBMkYwNEND
-MERBMjI0RkVFREZBNTlGMzEzRThFNUJBOThBMkI5NUM1OUUKCjA4MTA0N0VBMTcyREE4NTY5
-MzQ1QTYyRkMxMkFERTE3REVFNDk5Q0JFMDhFQ0Q3QjE4QTc5NTUzQjNGMzkxREQ3Qzk2OTlG
-RjIwOUI0QgoKODE3NEQyMTdERUMzMjhDMEE4OTM5MTk3RTZDNDBDNjE1M0Y2QTQ5RTY5QUQ3
-QTczMzMzODZCMzAzMDNGREFEODY4REI1OEE5RTVBMTNDCgpBQzU1RUI3NkEyRDI0MUY5MzIz
-NDUwOEI0MzZEMDA4MTc4M0U2NEI5NDMxMjYwMTE1NzIwRUNBMTAxNTZBRkM2NzZFMDEyQTcz
-N0VGQTUKCjBFREZFQTM5NkUyQzEyNUNEQjc4QkVDMjY2Rjg5NEZFODE0RERGQkQyNEYyRDFE
-REQ2OEE5NzczMzM0RkQzOUU3QTcyQzAyM0VCRTBDQwoKQTZFNUQ2RTBFM0M2N0YzMTg3QjRG
-QUI5MDYzMDJFQjgxMEJCQzVBQ0RFQkQ0ODJFMDBGMjgxREFDNEE4N0M4M0ZERjA4RjJFMTVC
-RDE3Cgo4QTc3QTQ3OTJGNjlDMjM0ODZGRUQyMzQ0REYyNjA0M0Q3NkY0QzlCQkY1NEIyQkY0
-MjUxODA0NDVEOTU2M0Q5OUREOEZFRTNGOEQyQzEKCkE2NjBBQUVCQTZFMEFDRkFCNUNBRkE3
-NzQyQUJGMTcyNDRFQzlCRDQzQjc0RTY0NjU5RDAzMzY5RjI1Mjg1MTM0MDk3NkFBMThCRUEy
-NgoKMkI5Mjg3NTY2NDYwRUQwNTQ5MjNEODI3OTdBMzFDM0U0QkQxNEZDREY5RjMwQzk0QjUw
-MzY0MzY4QzFCQjE4QTEwQkNGNDczMjVEODMzCgpGM0RERDgxNTcyNUY2MjhFOTI0MkNDNjIx
-NTU1NTBENTRFMUI2OThGRTY2REYyOUI3OTgxNzc1N0UwMkQwNTE5MENFQTVCNzhDMzVEMDUK
-CkZGODdFNUIyQUNBOUU3RTkxRkQ1MjMzREFBN0Y1Mzc4OTE5QkQxMTAyOEYyNTQzOUUxRTM1
-QTVEREREOENFNzEwRjRERTE2QzFDQzBDRgoKRkIxQTlCQjlGMkI4NjM1NjA5REU2NDc5RTgz
-QkVFOEZBQTRERTNFMjg5MzJCRDE4RTA3RURDMzI2QjE0Mjg5MDFBNzdBM0QyM0U4QjcyCgo2
-Njc5NkNEQjhCNUIxODBFNzc5RkREOURCNzNBRUU1RjQ1RjcyRkI1NUNFQTZCOUU1MkEyRjcy
-NDk3QTBEOEMxMkM0RTE3NjA2MEYzOTgKCjc1ODRFNUMwQThGNkI3NDkzNTM0OUMxNTNBRkM1
-NjQzNEYyN0YwRTI0OENCRjlFNjAwOTkwMEE3QjIzMzE1QTBEODM1Q0EwOEREM0EzNAoKNjk3
-RjM4MUUzREY4Q0U2NTVEQzNCMkQzODNCMDAyREVCNEU4N0IwQjdCRTE0MTMwRjU0Q0MzQjQz
-M0NDQ0M5MDM0RTAyMTcwOUI2RjdGCgo4QzI1REFBRTY5MkJDQjM5OTU5NURDQjAwOTc4RkFF
-MzQ1NEQ0OEVBMTA1MjM2OUIwRkJCNEIzNDBEM0FDNkMzMjc5QUFCQzY1MjZGOTkKCjM2MkM3
-NjkzQjBDMDE2N0E1MzlDRjRDOEVFN0M0QjZGREJFNjIzNUQwNjY5RkY1MjVFMDVFMTI3QTBF
-MkZCRURBQUZBQTgyRTg0M0VFOQoKMENDMzJBOUE4MEVEOTg1NDJFMjNENzgxOUY1NTUxRDhC
-MDY1NjI4RDQ1MzIwODFCMDBCNzI4Q0UyQzY3ODU1MDQ1NDc1RDlEMTQzMkMxCgpDODNGMTJB
-M0E2MjhEMzAyNjk3QjQxOEQ2Njk5QzlFNDM4MDcwNEQwNUMwMjcwQTczNjAxNUE1OUIyQzRB
-RjJFQzM4NENGMEYwNTQ5NkYKCjAxQzk3N0ZEMzlDNkU3NzhGMzhENUU0MzhEQjVCNkIwNUUz
-MzNBQTZGNEQ3REVFQ0M2Q0I0QjA5OEUxRTUxMzhFOTgyOUQ5M0IyMUYwNQoKRkNEM0I1QTMx
-NkJCMzQ1MkM1MTZCMkI4OTM1QjFCRTgwRTY0QTdBNzIyN0JFNkFFODQyQUYxMUJGQUYzNzJB
-RTRFNDFGOEQ5OUQyODEwCgo0MjdGNzA5Qjk3RTNDQzBERTRDOENGNTlBNEI1OTU4MkY5Qjkz
-ODVCNEY4RTgyMjEwN0E3OUNBNDQ3QjlGODg1NDc3REM0QjY1QjdCQUMKCjMwQTQwQjUxNDFB
-OUEzRkJBRTk5RjY4QjI3QTNDRUNCNzQxOTEwM0JBREI3NzBFRjYyN0IyQUUwQzRGNkYzNjhC
-MUM1QjlBRUYwODA0QwoKRkVDRDgyMkQ2RDhFREU5RjQyRTE3RUUyQTZEMzg1RkIwNkVCMTdD
-MURGRkEyNTYyNkU2Njk5QzREM0I3OTFGRDY1RjJFRTVENjlERkJGCgo0Q0M2RTA2RjdGNEVE
-RTY0MkIxNjM2OTlCMjM5ODMwREUwRDEyMEUxRjQ5NkY0MDI2QTMxRDQ2OUU4NkMzNUIwMTMx
-MEQ5QjUyMUY1RDgKCjYxNEFEMjgxRjE1OUUxOTdGOEE2NkM1MzI1QTI5NDYyMTZDQ0NBOTY5
-QzRGNkQyRkMwNTA4MEJENTBBQzNENDMwMjZCODlDMkU2NDBBMwoKNTk2NDU1NUEwNzM0OTUz
-ODhENDg3RTkxOUM3QTQwMDg2MjE3QjMyRkU4QjUyMTVBMjEyMjA0RDQ0NzI4RTFGMjQ1Qzkx
-MzgwNjY5M0MxCgpDQzhGRUQxMkJGQUYxNEM0REU0REUwQkEzMkQ3NkFGNTJGNkIzMTZFOUU2
-NDUzOEE3MkJENDYxREQyRTI0MTU4Qzc1MzYyMDMxODAwQ0EKCjIwRjcwMzg3NTQzQkNGQ0ZF
-RUYwRDFCM0U3RTEwOEUxMDZEOEIxNzJCNEJDNDBGODNBRTRENThDRjhDQ0IxMjMwRDY5ODFB
-RjAwQTcxMgoKOUZBMUFEREMxRUVERjIzQTMzOURGOTNERjQ1QTNGQkQ3ODI5QkQ4NDBDRTg2
-RUEyQ0EyNEUwMjBBMEZEREMyNDY2NEVBNDJCRDE1QzMyCgpBMkNEMUQ3QzMyN0NGMzI5NDgw
-QjcyMTE5MjZGREY0NEZGMUY3M0ZEMjQ4RDk4MDk1NkNFMTcwMjcxQzc3REVFNTcxNjRCQTJG
-RUQ1MTMKCjVDMzc3N0UxMDk1NkM5RTM4MkQwMkI4ODgyNjFCQTIyRkJBM0Q1Mzc0QkQyMTMw
-MDEzRkYyRUFGQTRDRTRDMTIzNURENTEyOEZEREFCMQoKNjMwNTlGNEE3QjkxMUI5NkM1ODc1
-MjY1MzNCRTcyNTU3NDlFRkI0MUFEMDMyQ0MwMENBQTIwQzI1MzFFNERDMDlFQUM0OEFGQkUw
-NDI1Cgo0MzFGQzI5Q0E0OEEzNzQ5QUM5QjAxMkNCQjIwOUY3N0Q5MzE1OTlFRUM4NjQ1RUYx
-ODc5M0U3OUQzNUM2M0Q0RjFBNzEzNDI4NEJFNTAKCjAwREZCMzJFQUY5MDIxRDNDOERFQzJC
-MTE5RTM3NkIzRjJFOTQ3MzFCMjNGREJGOEJGNkQzNkFEOTE3NEY1Njc1NkI5MDIwNzUxMTI2
-NwoKOERCMzBFRjJGMzRGNzkyMUFFRUIzQTAwQjZFQkU2OUQxOEY2RDFEMTBDNUI1RjVDQTVG
-MzdGRUI5NzU0NjE5MUYxN0UxRjg5NzYzN0QyCgo5QUMzNjYxNDhBOUQ3RjA5QjA2MTRGNjMw
-RjgyOUYxNTVBRERBOEU3MDRFQzVDNDlGOTYzQkFFODlBOUE2NjExMTc3NjU1RUI4NUQyQ0EK
-CjAwNzVERjU2NThGRDY4NjQxQUE3QjMxQjhFMUVFQzhGNzE1RDZERTlENDIyMjc0QkNEODM4
-MjA4MkQ2MjVCQzgxMkY1REMzRjg2RUMwQQoKMzc2QkI1OTZDMjMzRjAxQzZGNTQ3ODA5MDk2
-NzE2OTRFOTAyQ0MxQjk2RUZCMEFBRjJCNDJCQzhCQ0EwMUZGNkRCMjM0OEVGN0RBRDNFCgo3
-RTk2NjExODlGQzI3RDY5MTIyNDQ3QkY4MUY5NDY2QTczRUYwNEQ0RDRCQTYyOEI2M0JGQjg0
-QUU4OEI0NzI5NjVFQ0FGREQzNEY3QUYKCjhCQ0E1MTA3N0MyQ0YzNjRGMTUyQTY1MzQ3NDg4
-QkNCOTQ4Rjg3RTk5RTEwRjQzMEIyQjA5NjRFRDYxMTRDQjY5QUM4MTg2RTQ4NkQzNwoKNkY1
-N0M0MzhCODk1OUMzNjBGQkMzNTUwQTNGQzZCOTczQjYwM0Y2NEQyRUY5OTQ1NUM4MkUxMTA3
-NDM0QTBFQzNFRTRFMUZDMTEyOUE5CgpGRjEyQTIzMjQ2QjQxMEM3NEUxM0ZGQjA3REZCNkE2
-MjI3QTczQTBCNkI0NTE4QTBCQTJGQjYwMDdCMjFBQTgxQTdFQzc0N0M1MjVGMkEKCjhFNkMy
-NTY5QTlFOTUwRTBCQUExN0E1QzlEOUExRTUxNTUxNDdFRUE0RERFODMxQUQ4Q0Y2OUM3ODE0
-RDc2QjUwMzkzM0Q5MUFBOTNFOQoKQTk3NTA4QUFGMjk4MzlFMTc3ODk4RDc5QkZEMjc3MDA1
-ODE5QUQ4N0Q5MzM4Q0FGMDJBQ0FDNDRGODkxRjkyODEzRTdEQTY5QzgyRDdCCgo2RUE3MTc1
-NjRCQ0IxRDQ3MEIwOTBEREJCMUVGQjMwODYxM0FENjFGNUQyNzMzOEZEQzgxNzJCMjU4MDA5
-Q0I3QTVGRkI4NzJFNDNDODgKCjIwRkMzQjhEQUUyRUFDRjg3MEQ3QzVBODhENDI2MTk4Mjgw
-MEFBQjM2RTk0OTY4QTRDNUMyNEVDNUIwRTUzODE3MEU4QzZGOUFENjFEMwoKRTZDNzEzQjYz
-MTlFOERCRTcwNzRDQzIyMjg3NzBBRTUxNjQ5MjI4QTlGQzE4NEFGQzFCQjdDNjc2MjhGRjMw
-MzYwNDU5MzUyRUFENkI0CgpBMkE2OUEzRDM5MTgyRTU2Q0JCMjg2NEEyQzExODBBN0M3NzdF
-NzI2OUM1NzQzRDVBNzM5QjUzRDNBMkM1QkJDOUFCRTgzMzdDMzU2NzkKCjZCREE0MDEwMUQx
-MUVFQjQzQkI4RUJGQTczRTRFNzAwN0EyRUE0NDNBRkVEQTY3OEUxQjE0QTJBQTJBRTZBMDZE
-MTIzOThFNjhENjM3MQoKQTQ1Nzg1OUMwRkYyNUE4MUM1REVDM0FGNDgyNzJDQzVGQUMwNDRB
-RjJFNzFENTEwRTVCQUFBQzhBNTA1NDJEOTM3OTg4MEFFN0M5RDJECgoxQzgyMkI1NDc3REFG
-NTE1MEI4NEZCOUExQTA2MkM5QUVGOUMwM0Y4OUUwMjY5NjM3RjA1NkJGNjVBOTJDRUFERTMx
-RjJFM0Q0Qzk1ODkKCjA3MDFBNEEwNjQ2MDVDRjc5RTkzM0E4NTE4NUI1MEQxNEE0NzY2NTYz
-QTk1MkQ1QTNDOTlDMTZDRTdBNTBCQTY4Q0VEOTg1NDlERDM5NQoKRjY2OThCRTRGNzk3NkFE
-NUEwMEU3MzdBQTMzQ0E1MUY0QzczMDhCNjZCMTBCRjYzNkIzQzREQzg4NjZGMTUwOUIwODFC
-MTc4MDU5MzQwCgpCRDk4NDlBQjQ4N0NBQTAwNEI4RTYwMjQxMTI1NDU3QzkyMjM0MEIxQkM4
-MTc4ODVCNzAzOTE0QjBGQzU4RjEzOTEwMTZGRTFFM0RBMDQKCkFCNUYyMDU2QUUwREM4QTY4
-MUM4REU2Q0Y1RkExMjVEMkM3RjU5NjdERTg0MUYwNzZBRUU4NzkxRTZDMTdEN0Y2OThGMjA1
-MkE5QzY0MQoKMDQ5MjRGOUZEODVCQkFGNzdEOUVFODcxMUYxNDdENzMwQTZGODlEQjI5NjVD
-QjQ1MEYwODIwNDAyQzJFNTJDQjU3OTc3QkEwQTc3RTBCCgo3NjgyODQ1RjNFNDI2NkI3NzMw
-NEYxNjNBQjJDRkQ0OTQ5NDkxN0QyQzU5NjNBNzA0Q0ZFNDZDNjQzRUE3RUNFNDQxRjgyRTI3
-MjQ0NEEKCjgyNDJCRkE2Q0I4MTNCNjYxQ0M5NDMxREE5QzFFMUU5QzZBODYxQzZDMEVCMzA1
-M0QxRDYyQ0I3NzQyMDlBNzU4NkY5Njk0QjU1OERDRAoKNjI1QjU1QTBFOUZCQ0U1QzE1QTlB
-MDAyQkM5NDc4OTA4NTUzRTk1MzAyQkFEMUU0REM5QzI1MEFFRjE3MDQ5NUZDODk4RkRFQkEz
-NDVCCgpCNEFGNzA2MzM0Q0VDNTA5MUY4QUM0QTIzODIxRDBGRURDNjE2N0ExNUY0NTYzM0Ez
-MEREQTg4RUMzQzhDNkUyMzVBNUEzQzFCRjFCQkYKCjAzQTg5NkNENzgwNEMyOTdENkJBRTEz
-NERGRTRFMzg4ODcyQTA1QjkyMDM0QUU3MEREMENFQkNENTcxNjU1QjE1MDc4QTI3MTlBQjMy
-QQoKNTI4RTYxM0YyQkUzRDVBQzVGM0M5MzhEMjNCQTIwRERGRjE0MjI1NjA3MjZCNjJCQ0Ix
-QjlFQTA5REExQTI4RURCNTVGNUNBMkQ0RTA1Cgo1MEUxMjMxMTU3QTgxOTc4RTdCMDVGQ0VC
-Qzg1NUU1NEE5MzZERDQwNTNBNDJBQkFCRjgyMEUzRTREMzcyNzg5MDlFRDQ5RTQ5QzYyMTMK
-Cjk1NzU4NjJFREI5ODNCRTRFQUZGQTZCOTQ2Q0Y0REUwNjhGRUI3NDA5MjdDMTk5MzVEMjVE
-Q0IxNUU4MTc4NDcyMTQ3NzRGMjkwQ0YwMwoKRTg2MkU3NjMzNUNEMUNFNDYxODhDQTM5NjlG
-MEIzRjlGMURFMTc0QzlFNDgwQzQ3ODJDRDVERDZEQTRGMTlCNTFGNUYwOUI3OENDQkQzCgpE
-NUFDODBERTg0OTI3OERENUE4NEJFMEY5RDY3MjI5MTEzRkM0QkNDNDgyOUY4OUVGNjFFOEVF
-QjkzRDQ4RjI2MzA5ODA3Mzk5NkNFNzIKCjA1NDM1NTg5NTg4RkJERUE5MUMxOEY4QkY1M0M4
-MURDRDEwQzc0QTYxMzlCNUE2OEVDRTdBQ0QzQTQ4NTcyMzIyNERGMDAxNzdCMUQ2QwoKNDhE
-N0Q5MkQwQTVBOUU1NTBENUUwNjE3NjVCNDk2MTZDNjUzMDU5MTZFOUMwQzUyN0Y2QThFQjZD
-RTAzMUVCODgzMTFBOTY4NjE1OEFBCgpCNTI2QkRDN0IwRUQwMUVGMkU4NEU0OTVEMTBBNTBD
-N0JGODc1MzZDNEQ0QkZBQzIyQ0Y5NUM1ODQ2MkE3REVFOEU2NzE3NTJFOTg0MjkKCjhERUQ2
-NDQ1MkFCODQ2M0E4RDREOThDQjdFMjEyMURDRTY4MEQxM0NENTJCNENBREM3Mzg2OTJGNkM1
-QzMyQUIzNzhDQjJGRTRGRkQ2OAoKMTFCMkY5OUE2RDBCQjlCREVCQ0RDODI3REQ3NzYwM0JB
-NTgxNDIyNkYzOURCOUFBODNBRTJCOTFDMEM2MDIwRTkzNDE5MERDNjEwMTM2CgpBQzZDRkM1
-QjZCNUU4NkE2NkRBMjU4MjQwNjM2NEZEMUFGQjE0MzYwQ0ExNkVCRDRGRUU2REQ1QjVDNDJF
-N0FEQ0RFOUI1NDY2MUNEMjUKCjE0NjRENUM3Rjg5QjYyQzk5RURBQTY5N0E5NkFFODVDMUQy
-ODBCRUE2RjcwMDExMEIyRTM5QzBEMDlCRDE0QTU0OEQyOTc4ODgxRUYxQQoKMzhEQUZCMTk3
-QkQ3OEQ2MkExN0MzNDM4NzNGMjc5RUE4NDE1NUQ3OUUxNzg4N0M4QzU2QjhFN0RFRDM4RDA2
-NEVCODExQTk1M0JFQ0IwCgozOUM5RUZBNDU0MjRENjQ1NUI4NjlFRUE1QTI1MkQ5NDBDRjBF
-NDNENTE2MkVFNDA4RTc1RjJFRjBCRTJERkNFRTY0NDhEREE1MjlCRTcKCjU3Q0U0REUzMUI4
-MEE0Njc2RDIzRkMwRTkwMUI4OUNGMDJBQTA1NjJCRTY2MTg1RjkxMDM3QjFCNTY4MDlGRjEw
-NDZBNkZDMzlDOUI5QgoKN0VDMjdCQTRBREYyMzg3NjBBNTc1QTQ3MjI3M0JCNjRDNUUyQ0I3
-NzYyMDdGMDAzMTVCNzM1MzRBNTM5NzY0MDA5MzcyQTc0Q0M3NjEyCgo5REE2MTg4QTM4Mzk2
-N0RDMTE2NUMwN0M3QjFGOTNCMzlDNkMyMDE0NDkxMDZBMEVBMTI3NjYzNEE2MTYyQUFGQURE
-MjFDNjFDMUQ1NjAKCjFCQUE2NzkwMjc4NUNCOTBDODdCNjExRDNBNkEzQjk0NzAxM0JBRDhD
-NjBBM0Q0RDMzOUEzMDI1QkVDNzRCNkREMzg3QjdBRkFCODMxQQoKODdCN0E3MUEzN0QyNTE1
-MjNDNDg2NDJCMUQ0NzlEODM2OEVCMzFGOEJCODM1NUVGQ0NFNURERDEzMjNGQzk5QTU2QjEw
-ODlCNzUyQTEzCgo1Mjc3MEJDN0UxODIxQTM5ODg5MEIzMTY1MEU4RUUxNEIwRDQ5QkFBOTI0
-NThDMTVDMjk0MUU0MzQ3ODdFQzRCRDAzNEM0MEJCMEUyMDkKCjZDQjI5QjE3NTM4NzcyOUFC
-RjA5NjJFQkQwMjQyNEYwQkI1MDk2ODdCMDNBMzlBM0JFOTY1ODc2MUYwNzAzQzVEODM5QjYw
-QzRGOThGRQoKRkJGQkFFMDcyMDJFMkNBMjJBQUVFMTQ1RERDMTA0MDkwMTBFMkE1OUI5MzQ0
-MDFFQUY2N0I4RUI0OTlFQ0I5MkIzNzVDRkU4RDU0MTI1CgpDQjZCMjBDOTk2OEJBRkM0NUQx
-QThCQzY1RDk4RDdCNzAyRTYyNDc5NEVCQThDMUVGQzk0MzNGRjJCQzM5NzJGNTdEOEZBQkYy
-N0NFNDQKCjJGQTMyQUI4M0FFNURCQURBRTAxRUREMTgzNDAzRDI3MkFFM0ZDRDc1QkNDNzUw
-QzkwREY3RDBCNTI1NTUxOEFBQjBDOTJEMzBBMDE2NAoKNTlEOTgyMUJEN0UxRDRDNEY0NjRF
-MTlCMEFFQjc4Mjc2MTkwRDcyNkMxRDc2NzQ3MDhEMEE3NENEMDU5MjBDMkE4RkNDQzg1ODFG
-RUI5Cgo5OThENzM1RDgxMTYyMzc4MEYxMjlGMEFBQUYxMTNGNzVFQjI4RjM4M0M5QjhDMEM3
-QTIyMjFDM0E0QkY2NDE5NjFGMzhERTlEQUJEMzMKCkE4MDNFOTQzNkU1Qjk4NDI1MDM1ODFC
-M0Y1NDQ1QUZBMDM5Q0IxMEM5MzZDOEIwQzA4REQ0OUJFQUUxMTkwQUQ2MTFGM0YyM0ZBNzdC
-RAoKNzFBODBBMUY5MUI3RjM3NjBGNUZBMzVCQ0Q3NkQ4MDMwRkFDODcyQzYzNzIxN0IwN0NB
-QTQ1MkM3MkRFM0Y4MDVGNTg4MjBCRjFFQ0NFCgoyMzEyMjlGQzVCNjhFNUYxQjIwMjU5REM5
-MkFGNDgxRkRBOTJEMDdGMjc2MDc3RDc4M0FBNDUzNDk5MTVCNUY4MUM4Qzk2OTczOURCNTYK
-CkY0NTIyRDAyRDU0N0RDNzYyNDBENjlDQ0YyRDY4NDI0MjAyMERFNjBFQ0EzN0Q3RTI4NDZD
-NTA0NUY2QjJEMTA1QjdENUEzQ0E1REU2RQoKNzNBNTY3MTVENURFNUYzRUVFMzU1OUU2NTdB
-NUVBMTNDOTcxNkUzQTdBQzBERTI1RTE3MjBENTJFQ0U4QTg0RDVEMUFFQTA0REYwRjdECgpE
-ODQ2NTQ5QkFFQjVDNTAzMkNGM0MyNTFBNUE2M0E5OURGMUEzM0QwNTQ4QTcyNzM1RkQ5REE4
-MjY3QkI0QjU3QTVDNThENDQ1N0JCMTIKCjQyQjUxNTI3MDNFNjJCNjRDMDJBRkE2ODJDNjVD
-NDExMkIyODM4RDlCRDhDRUM2QkQ5RDFCRUE4ODJFNTA5MDA0NkU5RjIyMDg3RTZDQQoKQjY5
-RjUzMjVGMEM2OUE0ODc0RUU4MjBEMThCNjREQ0NBQURFNkVEQkEzQUM3NThFNTRBN0M5QjZF
-REJDNDA1NTBEQkQ0NzU4MDE3ODQyCgoxQThDNUI2OTY3RDg1OERCOTgzNjE4NDQ1OUUyNjM0
-MEJDQ0E3NjM2QTg0QjdCM0NDOTU5NkE5MDc1Mjg0NTVGNDY0NkI1QkQ3ODlFOTQKCjlERDBE
-MUY0MEMwQUYyMUUzOTcxOTk2RkFBRkZCQ0MxNEUxOTAzMDkyNEQwRDM4QTk0OEVBNTUyOTcx
-QkE2NTA0NUYyODE3NTY0RDU5MwoKNEMyOTkwQzZDQ0RFMjYzMjlGMjNEOEIzNjlGM0FBRjc0
-QTEyNUNBMUZENTUyQkM3MTIyRDIxMTA5RkZCMzZDRkUzODdGMjJDRDA5Q0QzCgpDQ0Q0N0VG
-REY3RjY3MTM5N0NERkNCM0Y0NTdCMkU2RkQyRTIyNzNBQTI2OEM0QzM5NEIzNjE0NTEzMUVG
-MkQ0RDEwNzI5RjY0QUJEQzUKCkVCQzdCMjBCRDA3MkVDMTcwNDMyOTgyMjgwMzQxNzM1Mjk3
-QTdDRERDQkRFRjg0ODNGMzRBRjdBNzk3MTYwNDAyQjEwQ0NBMUM3OEFFMwoKOUFCNjE3MENG
-NkREQTE5RUYwRjIyQkVCMjgzMjc3RTA2NTQ0ODgxQjZCMEQ1MjU5MzZBODRFRTkxRkUwQkE4
-QzI5ODVCNkUzMkFGOTRFCgpERjMzRTZDQzcwNDA4RjNCQzY3MDcwQTkwRTA2NDFCQzY4QjhD
-RThGREI0NkJERTJGRTgwQkQ3MDcwRjBBOTUwNUIwOTU5QjE1MDlFODQKCkNDNjY2Q0E3Q0U0
-RUVCNjMxQjZFOEQxOTgxNjYxMUI1QUNFOTU3RTEwNENDRjM0MzlDMkMyNzc0MUNFQ0E2RjI5
-NTZCMEM1RTBCRDdDMgoKQjQxN0MzNzVCNjMwRDRDQUVGNDI4QTg4NTg0QTNEMTk2MjMzMEEz
-MTZCOTA1OEJCMTMyNEZDRDkwODc4MUFEQjQ3QjM5NDI1QTlGRUY3Cgo2QURBRjQ5OTc3NUY2
-OEY5OEY2NUVBRjgwQkJDOUQ0MDE1RDA1RTgxNkQyRUY5QTFGQTkxQjAxRTA1QjY5QjlFMUJG
-NzUxMzBCNEM3RDkKCkFCMjlEOTVDMDdBNEMzRjJERTAwQzdDMjEwOEY3QkREMkYxMDNEOEE3
-QkUwMkFGRDEyRDFFRDI2QTAxQUVGNkIxOENENjMzNjc2NTg5OQoKODA1NjE4RTA0MDVDMThD
-RTdGMDZFRkQ3OTZFQzk1MzJFQ0FGNjk2NkY3NkVFMzM1NDE5NDU0RkY2NDdGRjE0MTYyQ0ZF
-MUFDRUFEQzE1CgpBMjJGRDRFNkRDNzhBOTNENTFBNjA3NjU1M0MyRDcwNzM5OUQyN0U1QUY4
-ODI4MTNCRDMyNDhCOTExMEFCQTNDREU4RDNFNkJDRDIzRjEKCkRBMTQxQkU2RDQ1QTlFNkUz
-NkZBRTFEQjBDMDgxOTI3MDY3NjUzNjUzNkVBMTNEQTRGMDdENUJCNjI3N0Y3RTRDNjA5RTRF
-MTZFMkVBQwoKODgwNkYyOEY0MTkxRTcxMDk2RTI0OTVFNjREQjIzOEUyMEUwRDEzMDFCM0Yz
-NEQ5RkI0RTZFNjEwNkMwM0I2MjQwRTEwQzBGRDAxQjZDCgozNTJFOUJCOTMwMEMyNDZEMEMw
-MjBGMkI0MThENzZBMDQ1Njc4NEU1OEE3NUFBNUM3MjVFNUY5MjY5MzkyQTkwRDE4NURCREI1
-Q0UyRkUKCkFFMzFFQ0RCM0I2Mzg0M0FCMjk1ODI0MUJCRkVDM0MwNENFMEFBMTQ3QzUwNEE0
-NURCRTA1NTAzREQ0OTNBMDM4NTdCQ0Q3RTRCMzdBQgoKRTg1NzI4OTJBRkY0RTI3MUY1MTBD
-N0UwNjQ5QzU4QjNFM0NGNzVCOEMzQkMwOEVCMzRBQjVGNzY1ODEzRTk5Rjk5QURFMjU5QzQ1
-MzI3CgoyNjcyRjlEQzI1RjAzMTc5N0M0MjY5RThDQUVDQkMzRTkyRDFBNTlGRDEyODVCNDY1
-MDBGOUEyRDY3OUVCRUNFNDgwOTQ1RDc5QTUwQjkKCkQ1RDFBRTkwNzI3RERGRDZGOEM1RUIw
-M0IyRUE3MEMxNjk4MjhGQzc1NUJDNDE5M0NEMDI3RUI1MkVBMkRDN0FGMDlDMDg2NTY5NTEw
-NgoKNUJENzhBRjU3QzI4OTY5NzY1NUEzNDMyQTQ1Nzc5MkJCQzg4OTQ5QzQwRjRCREMwNzE3
-OTM4NTNGOUU4Nzc3ODM5QzdEN0Y5MzYzOUNGCgo0MkYxRTQ1MjBGQ0JDQUVCQzNCQ0M1M0M4
-MzMzNDAzM0MyNUU1MEM3MkEzQkUwRjMzN0NEMTQ5OTYzMjZDMTY5QjM5MjFFMzQ0MkNDREUK
-CjFBNDQ0Qzk0QUM4RDJFQ0U2MzI5MDhBRUQ0QTE2MkE3NDAyMTU1NUNBNzNCMjM1NzE1Qjk2
-NUNDODY3NzI3RTQ4QzNCNkIzOUI5ODlFNQoKMzNCOTJCQUU0MEEwRkFERkM4QkNFODVEMkE3
-RUI2QTFDNENFRTIxNDcyMzQ1NDIxRjlCODBDNUVFNjQxQzkxMjk1NDQ4QTUxMzA2Q0FBCgo0
-MTkxNkRFOURCNEE3OEM3MzgxMDY3MzE0QThCMzlCMTNGNTQwMjI4ODIyODY3MjRCQ0EyQzEw
-Njg3OTg4RTRDNEREQkVGNUUyRDM2RjQKCjM2QzlGNjQ5NUUwRDQwQUI2RjM1RTdEMEQ1Q0I4
-QzJBNzUzQjRDMzU1RDBDREFERjQ5RkJFRUJBNTIzOUE5MEE1NkQ4MjZBOUJFMTJCQwoKNjI2
-NzdGMDdDQjFDQTVBRDNBOEEzOUUxMDU3N0U1RkQ5NUU4MkYyRUVDQjRENEY3QjU1REZGODM1
-NjYzODIyODUxQjdCNjZGQjRDQTRDCgo3NTg3NjM0MzdCRDdGRkE5NTU5MTRCMjY3QzE4QTU1
-RDdDOTEzQzRCOEJCQUNFODg1RjU4MDZCQTcyNjUxNjcwMDMxOThGM0MzMjM2Q0MKCjk4MkVC
-QTc4RDAxRjQyNzBBRjU2MzYxMUI4NEM4MzlGOUY0MTRBMEZEQjRDRTBFM0FDMEE2NjI5Mzc4
-NzQxQjU5OTNCNDBDQTE5MDI0MwoKQzMwQzU1NzU5Q0Q1NDVCMjg0MzQwNDk5NEQwMkVEMjcx
-RDgwN0IyMTJENEQzOTA2NzYyNEM1Njg1RDA0OTM1RjdDOTM2RURDMEQ2RjlECgpEQTExMjIy
-OEFGMDUwOTc3ODBFRjZCM0Y3RTM3NjVCN0QzQjlEOUIyOTI0MDBEN0U5MzFDRjk4Qjg0RTVB
-RTUxRDZGRDc0MUU2Rjg0MDEKCkQwMjYzMDlERkE5MjUxMENEMjI1NEVCMjM0RTZCMkEwNEFF
-Q0RGMzlDMDMyMjdEMDcwOTZDNEJFQTU3ODY2RDkxMDk5RThDRjVGMEUxOQoKQTU4N0E0OThE
-NkJCM0I0OTJFRENFNjAwRTQ2M0EwQjZDRUREMEMzM0MyNzBGOTlGRjEyOTA2RUVENjYyNUM2
-MTQ0MkQ3QUUzQTgwNjBECgo4NTEyMTkyMEU2Qjk0MEVCOUU1NTAzN0Y0MEQ5NzdDNjc1REY2
-RTgyNUNFNDZGRDlBMUEzOTM4RDlBMTQ3NkMwRTBBNTc1MjcwMDA0RDAKCkI1NjEyNkM1MEE2
-MkZDMjExREUyOEQzNEM0MDRCRTAxN0E4MjMzNTI2NzY2MDlBNTAwMDE4MkVGQzNEREE2N0Qw
-M0ExMkNCQjI1Qzk5QQoKNjE4MkM2RDNEOTJDQkJCMkYzQjJEM0YzQjdGQzkwREYwQzYwMTQ0
-QTIzM0U3MUVEMjJENDExM0VGRDk1NDIwODE4MDJBQTdBNjc4QzlBCgpGNjgxMTc5MEFDQjM2
-NTRERkRGODI3MTQ1OTg3NTZFMzY1MTgyQTdCREVFMzExQjc0NjhGRTA3QzJGOUI4MjlCNjVG
-Mjg3RDU1NDQwRkUKCjMyMjQwQ0NFNTIxRTM4RDcxOTk5QTg0QUJENkY2QzFGQUMyMzk0NUJE
-RTk3RDFCMkVFODIzNEEyQTEyRjRGNjFBQTkzMTZDNzk0OUQ3NAoKNjYwQzQ1OUUyQUYyMTY5
-OUZEMzM0RkI0MUQ1QTJDQjg2OUE0NTU1MUJFMDYyRUYzMzYzODA4QUNBNUI4NjFDNUNDMDVB
-MEY3NERDNjIwCgpCNzYyQ0YxMjYwMTAwRjdBRjQ5NzU1NUUzQTM4N0RBOUI4MzZGMkIxRkE0
-NDY1NENENUI5QzNDNkYxMUQ1QjU1NTJFMkQ4MjRCN0IxRUQKCjlFMjU5N0IxODQ5REZBQzYx
-MDQxMjg3RTk5Njg1NUIwRUNGRDIxRUVGNEEwQUVEQjQ5Mjg1NjlEMzQ2MTNDNzRCNDZEN0Y0
-NkI1NUVENwoKNTUzMjIxN0JDNzdCMUUwNzVBNEI1Rjc4MkQyRkU1NzQ4RjEyQjUwRjcxNDZB
-RUY1MDZBNDFBNkEzMzY0ODU0RDhBRTRDQTE4NDQ4NjI2Cgo2MzY4RTE4MTg3NDE0ODk3MEI4
-OUFGNzU5NjdFNjFFQTcyMTIwODFGODVBQjE3REZERURDNkYwRkFGN0Y0MTVCM0NDREU3NTY4
-OEU4NUMKCjFEQzkzOUQ3Njc3NTVEQ0JBNjIyQkRCMzYzMUUxMjBCRUZCQTM3MzNGOEJEQjBB
-OUQ0REY4NzM3MjQwMzg1QTZFRDY0MkEzQjZCRkNFMgoKRDNCMDZCMTZGOTk0Q0U0OUJEREYz
-NTVBNUU4RjI4QzREQ0I2QUZBRjYzNTRBOTdENDkwQjU0QjhCRkI5RUUyQ0JGNUFBRTY2OUUz
-MTQ5Cgo0NDYxRTcwQTYwMTU2NzY0RjI1NTIwRUExM0YxMjYyM0YzMjgwMzQzODIyODc2NjYw
-QTdGNjYwM0I1OUFDMzlENDI1QjM4MjE3QUI0QkQKCkUxMjEyMEVBNjExOUYzMkUwODBDREU0
-QUU4REZBMjFFMjNEQkZBQjAzNzQyMUIyMEMzQTUxRjRBRTJGQjVERjQ1ODVFRDI4OTE0NzQy
-NwoKNjgzRjQzRUNDODIyRTA2ODhFNkFCNDc2MTkwMzhENEI5NDA0Q0JCRDkzMjRCRjMyNzcz
-RThDOTVGOUNEQjBDRDY4NzQ4REYwNjY5NzBDCgpBRDJCRjhFNDQyNDk0MENGNkM2RTQxREYy
-QkEwN0RGNDA4NUEwRTZEQTYwODBGRDQzRkZFQTBBNzFBQTdEMDAxNjlEODI4M0M5MTBCQzYK
-CkYwMDY0NkRDOEZBNjUyMkM4NUJGNDZBODYzODM2RjY0Q0U3M0E2RkJDMDUzOEUzMEJFNjM5
-MzBCMEVDMUU0QUM0MEExMjIwQTk5NjQwQwoKMzlGODExQzQyQUI3ODMyNUFGOTc0QTI3QTBD
-MkExQTI3ODVBMzZFQzMxNjA0OEU1Njg2N0ExRjg1Rjc4QjM2MTcxRjEyNkI3N0MxMTRDCgpC
-N0E4RTA1QUQ5MkRDNjg2MEQ1ODkzOTY0RTg5ODk5OEM2MzgzNkNCNUNBQ0UxRUVBMUM5Qzgz
-N0ExRTIyQUZEQzRCMzVFMTQ5RkIwRTEKCkJGMjQ4QTI1ODQ3NjA0REQ2OTYxREYzQUVDRDFB
-OUY2MUMzNkUzRTFFNEFFMUI5RjI4RkFGMzUxRkRBMTEzNjY0QkJGRUNFMEI3QzVFMgoKMzE4
-M0Y4NDI1QkU2OTA2QTU2Mzk4RTMzOTEzMDMzRTUxRTA2NDA4RTAwMUQ5Qzg2MkUzNkE5MzAz
-OUFGNDdGNUYzMDFCNkI1RjM3NzVCCgo0QjJENDI1OEI4NjY1NTkwMDEwNjZDNkVGQzQ4QzU1
-RjRDM0YwQ0RERDhFRjUyNUVERkFENkZDMDYyMTM4MTlBOUJBRTJFNTU3N0Q0MDQKCjZFNDY1
-NkJBMkYzNDIyN0M1RTM3RjBENzdFOTY0Nzc5QUZEQkM2ODQwNjE2Q0YwMjkzNkYyODFGRDM1
-M0YyQTVEOEU3ODE0QUM2QjI4QQoKNzFCQjU3MjUzRjg1MjgxMEI3RERENTU5MEE1MjJDNTBC
-NTZCRTI1MURDNzY0MUUwRDFFMjcxRjhDNENDRUJBQjY1QjZFNzBGODZBN0M4CgozMkQ1NUFB
-M0U2MURDQUU1MDRFQzRBQ0RBN0MyNzRBRkU5QkM3RTc1NjEwQzg2MUFDRERGQTVEREM0RThF
-QkNBMjRBNzcxQkYwQ0EzQTkKCjhCODhBNkVDRTUyRUZBN0M4RDU1Q0YwRUU4NTBBOTlDOTIz
-OUE0NDY2QjU1OEI2RDAyMEZCRUE4RDIyQkM2QUFFNDI5MkI5MEM5QTk4MwoKNkY3RjRDNUE1
-ODhFNkNDM0RBMzMxM0Y1RkVCRDRFNUQyRjdFNDU0RUJDQzk5Mzk3NDJDNjdFN0MwMUU1MTBE
-NTA3RUMzMEM2RTZEMzQwCgo1MTBFRkYzNDkzQjIyMDlBN0FDNDNCNDg0OTIxODcyMzE1NjU3
-RDNCQUY1OUNBRTM4REVBNDhGMzk0RTRERjNBOEM5MzBDNjFDNTQ2MTAKCjMwMEQ2NkE0MjNB
-NENFMjM5MkE3QTQyMjg4M0VERjA4NzY2MTE5QzJEN0I3QzczODQ4MjFCRDZGQ0QxQjc3QjFC
-RUMxNERCMTVGMTA4NwoKRTg5QURGNDY3MjMxMUZGMzY4RUFCNjBDQkI2RUNFQUQzNEE3NTA3
-QTc4MUIxREFENTU3RUQxOUM3QTVCNUUzMzQ4NTEyNjhEQzIxODI0Cgo1M0NGQjdFRjQ3RDE1
-QkFDQTY4NDUzMzAxRTk1MTI1QTVDRDM1RkRGRjFFNkVEQjg1QUU3QzIyODE4MDQyNEEyODQy
-RUQ0NzVCMzFBRjYKCjI0MEE0ODBCNkY2RDdEMzY1MjgwOEY4ODcyRjg1OTg0Mzg0M0Q4NjJF
-ODFFMzU5NEFDM0FGNTc3RTc5RjY0NzMyMjM5MkU0RTYzQ0MwOAoKOTM3QzI5NzZGRjc0OUUx
-NkM1OERBMzlCOTAzNUQ4MDJEMEYwQTlEMUREQUMxODk0RkE3MUJBM0U0MTg0OUMxMzM0NDUx
-OTFENDFEMjVDCgpCMzdBODMzN0M4NzZBNTk3M0VBMTM1NjczODlGRjg5QzY2OEUwRDEzRTIy
-NTk2NEREREMzREJDOTQ5QjQ2RTBFNzVBMkJBQkI2RTJBRjQKCjUzRjY1QUNEQ0Q0NUEzOTRC
-RjIwNjMwODAyQkQ5Qjk0MTg0NTlCQzc3MzZFMzcyNDRGOTIxNUYyRDZGNTM0RkVFQkIxRjg0
-MTk2MjczNwoKRDQ4REE3RDZCMzBBNzFCQzQxNzNCNkUwMEFEQjRFRkJBOTFDRTYzMzJDQzUx
-N0IzOTcwMUUwNzY3MEQzRDFBOUE4NkE3MTAyRTZBODBECgpDMUVDNkNENjQ0RjU1MTFEMDkz
-OERBMDk2RjgwQjQ5Q0EzNDQ0QzBEOTZERDc5RDNGODgzMkQwNDEwRjA0MzAxMjhDNjA1NkRE
-MDlGMzQKCjRDRDdFOEQ3NDM3ODlCRjNBRURCODE4MURFQjFBMjExQUE1MzIwRkNGNzkwNDg5
-NzMyQ0U2QTk4MkIxNDAzQ0M5RTJBRTZCQjlBQjVDNgoKODYzQzMyMDkyOUIzODYxQUMxMDEx
-RkE2MkM0NENBMThCMTBDREQ5REVEQ0VCNzNFOTE0NUI3M0M0NzFDNkY4MjhERDE4ODgwNEY5
-NkVGCgpEQzNEMjI2QTJBNUQ3MTU1RjdGOEJFNzgyMUREMzlFRjQ1MEI1REZCMTREQjZDNEY1
-NjhDQURDRkVEOEM3MDI2NzVCQTFDMDRDRTZENjIKCjgzOTcyN0ZFNkY4QUVGNTk2OTNCQTM4
-QTJCOTAwRDBEMDJDNTZEMkM2MzI4MzNEMkQzNjBBREUwN0FEQ0Q0Q0JCNjIwNTE3RDdEMEIy
-OAoKRTM0NjJFNkVFMkQzMDg1NkJEQTUzREY0RDk3RkFCMDU5QjA2NTdFODE1OTIxQUNCMTZF
-MUFCNkNDNzJGQkFGQjkyOTBBMUVENDMyQTMyCgpDRUY3RDhDQTE5Mzg1ODI3ODVEMTJDOUQ5
-QjEwOERDNTY0QTlGODBCOEM3NUI1QjAyQTFFMUM5QzVCNzkzNTI2Q0JCQUI5MDQyRjQ3OUQK
-CkFCMUQ5RUU5QzE4MTg0NjkyQzgxQUZFMkNERUYyNkNBNDE4ODAwNDc0RTZCNzQyQkI0NUNG
-MDJBQkNEODZDNTJCRTEwQzc3N0RGRjk4MQoKNDY0RDYyNEE3QjZFNDU1RjZGOEQ1QjdGODRG
-QUJFMjg4REUzRkM0Q0U0QTIzNzY2RjNENzcxNDYzQUIxRTU1NUYyRTFFQ0I2MUI2QTJDCgo5
-ODdCNDNDNTNCNjM2REQ0NjZCNTdFRkFEMDk4MTFDNzI4RUQzMTNCOTUwNzg5QjI2MkExN0VB
-OTMyQTc0NUVGNDNBOEVGREExNkQwNUUKCjlCRTQ5RDNCMDVEN0VFNjMwNDM0NjQ1QUQyNDVC
-QkI1NjAwQjhBQUNFMzI0MUYzNzA2QTNENUI5RUZGMEE3OTNDNTZBODY1MEVDNENDMgoKNTVF
-NEEwMDEzNTZCRjcyODEwM0Y1OTg5MDU0MERCOUIzRjJDQUNGNzg4NDk1RjYzQkFGMUQzNkI0
-RkUxMEI4NjI4N0YyMTM2OTVFNDhECgo1QkUyMEVFNzAyNTIyMkM4QUVFNEY1QTE3RDc2MzMy
-MzI0NjA2MjFGN0YzOTVBMjI1RDk5NEFGRjhEMDZDODM1MUZDODNGMEM3RkJGRUUKCjMyMzUy
-QzFBM0UzNTY1MUQyMTk3MTMwMTlDQkZGNzhFQkMzQjE0QzVDM0UyNTY5NUJDNDQ1ODIwMDhG
-QzA1M0Y2RTdGQTgzNTlFODU1NAoKQTdDNEVBOTA2MzIyNTkzMDJFQ0ZCOUI1RjFGOTcyMUEz
-N0VERTlCNkFDRTc4QkQ3QzY4QzczQTk2MDM0NkQ2MDhDRkY3MTUyNjgxRURBCgo4MTY1NjU0
-MUFENEVGNjRCNEI4OEZCRTk4MTA2QUZGNkYyMDUxQTg3MUY3QUFDNTMzN0E4QUEyQTE2RjU5
-QjEwNDQ3RUFERDA4NEZCMDMKCkMzNkU1RjBBNDc4MUU0RDgzNDAyOTQ0NzE0RjE3NkZDOTQy
-MEUyMUVGM0EyOEZFNjVDQzlDQUNBRTEyODQwMUJBQjRFMzMyMkQ2MzAxQQoKMThGRUM1OTVD
-MDVCQkY1QzQ0QzY1RDAyN0ZDMzY5OEY2NkEwN0E1Njc5MzcxMjNENTlGMTZCOTI5MEI3MEI4
-MzhGQkQ0QzZEMTJDNDYwCgo2OTMwOTg4MURERTUwREUwMjI0RjEwMjMxQTBGQkJDMTlGNTdF
-N0I2QjI4ODYyMkY0MDY3NkQ1M0Y0REFFMjdDNkUzMEREMzE3NTlBMzIKCkVDMDMxNTg3NURC
-Nzc5NDg2QzlCNEY3MzM2NTE2QzUyQzUzN0Y2RjI1OTUwREM2NzFBRjNDNzQ5RTIzNTdBNDhF
-OTlEMDMyREFDOUY5MAoKMjVCMTYyRDY3MkEwMTkwODg0MkIyOEMyQTlFOEZCMTNCQzU0MTFD
-QjEzNzVBM0IyNTg3MUU3NzM3QzJCMUZFRTRENDM5NDlEQjE1NjdECgpFMkFBRTQ0QzE1MDU4
-NzE2OTAwNjIzNTgwODgyOTRFNDkyOUQ1NTI4NDdBNkE5NEEwNzVCN0QwQjg5RDdEQkE2NDVE
-MjZCODZGN0Y3RjYKCjQwRDdBRTRCNDc5NTZERDVBQTA1NERFMTk0QTU3NTZCOTUxMjJGMTgy
-RDFEMDI1MDRCRURCRUUwQUNFREFGQ0EwREFEODQwOTI1ODJGQQoKMDYwM0YwMjUyNDAzNzVC
-MTFFOEMyNTJBNTQxN0ZBMUFBNEM5NkREMUM0QTM2OUMyRTU5NEIyMDg5QTNFRkI5RDkzNjIy
-NERFMjVBNDIxCgo1ODg3MThFNjE3N0M4RTMyMDY3OUVBMUM2MzlBQkQzRTRCQjY1M0RDMTdB
-RUU1MjY0RTk5MUJGRjYzNzY5QTdDMDdFRUY2QjBFNkMxQTcKCjM3MUI4ODlCOEJERDE0REE0
-M0VFQjI1MkZDRDgyNTU1NzUyQzI1RERFOTJERUExMUUzMTAwQzhCQkIwRTJEOEQzOEMyOUU3
-RUQ0MjMzOAoKOTgxMUMyMUU0QkQxNjJGRDc1QUIxQTBFNUE1NzkzNTJDRkRFOUNDOEZDRDNB
-NENDMkI1QzREODRDQjVBNkUyRTUyQTUyQTNEOEVGNDQ1CgozN0M2RjgxMjY5NERBNTExOUNF
-OUI3OEEyQzVGMTI0NTRCMUJBOEFENkJFNUQyMDg4OTA2QzNBMTFBNENBODBCMjEyMDQzNEU5
-MkI1MjYKCjE3M0QwN0M1MzBFQUZGNjFBMjcxMkY3QkNFMzYxODE5N0I4QjYxNzVDRUFFOTMx
-ODZCNzMwOENBQTkwQkQyMDA1NEQ5RjQ4RDEzQjQwRgoKMkNCODFBMDhEMjAyMTk1RjNCMDNF
-QjdFMTRBMTdGNTQxNUU0NEM5ODFENDdFNENFQkQ0NkZDMkNFODJCM0QwRjRFQkQyNDI5ODVB
-RTUxCgowQkI2RjNDMUE3MDJFODZFQ0QyNzhDQTMyMjU3NUQ3NUVDRDg2ODk4RjAxMzQ5OUQw
-QTdGQzFGQzEyN0E2QTY5NDYzQkM0NDA5N0Q0N0UKCjhBQkM1MEVEMzZFNEVGRUNCNkU1NTUz
-QzM1Q0I2Q0Y2QkI0Nzc5Q0YyMkY1RjY5NzBGMTVGNTQxNTlGRTVCQUQ3RDU3QjVERDVCNUJB
-MgoKQjJFMjUwNjlFRTc3QjA2OTc3QkVGRjE4RDIxNTk0RTZERERFMkQ0NEM3REYxMkE4MDEy
-MUZCOUEyM0JGQTE2RjRBN0VDN0FDMkIyQUE2CgpEQkM3NTE1RTE4Q0UzOUJBQkMwNEFDQjFD
-QjhDMEEwMUEzQUYxNjkxODFDNDdBQUNBQTBGMEQ4MDNFRTRDNDBGRjBDMEZBMTA5NjMxMDIK
-CjMzMEYwQkEwNTZERUVBMDJBMjQwNTY4RDhERkMzRjAxREJDNDJEQTJBQUQxN0NDOUE1RjFE
-RjEyREEzM0JGNUNBRjhCMjJCRDUyMURFMgoKRUEyQjgzMTEzNTQxN0U4MDQxMkIyNDQ2NDRC
-MEU2REE0MEREM0U1QzJBMjgzQTc1OTUwRjY4NjE2NzcxOUVBNjlBRTFEQkIwMEQ3MzU2CgpG
-QUYzMzEwRDI0MDY2RDQ5NDFFRjcwNjg2REM4NTlDRDUzM0JFQUZFOUQ1QkI0RTQ3MEYzOEIw
-OTEwNEZENkI2M0ExQkM2MUNGQjI3QjYKCjcxMEVGMDkyREVBQzc4MzEzMjQ5QkY2NjYwOERC
-NTA3RjA4RDhCOUNCNTVCQkVFMUNBRjc5QzgzRDYxNjY0ODE2M0Q1NkRGNjM3RTUwNgoKRDA2
-Q0I0NUNCNzBDREFCOTBDRDg3RkVEOTM0RTBBRUFEQzhDNTZCNzBDNjg3QjQ0QzMwQjg0Mzc2
-QTAyQzA0ODcwRTA2OTBGN0Y0M0M5Cgo2NTM2MzI0MDkyQzdGNENGN0I2NDk5MEVBNEM1REI0
-NTZGREQ3MzQ2RkNGNTUxMjFBNTI2NUE0QjMxNjlGRDVEOEFEQzE0QTE3NUY3NUUKCkY4RTg2
-REFGNzBGQzRGMUU3QTAzMTgxQURDNkYwRjlDREU0MkREMkI0QTg1M0U4MUU5QTQwRTE3QUU4
-QjBCOTVGQzYwRTYzNUM3QjQ2MAoKNDc3QjU4MkU3RjQ1QjAwRDc4QTQ3MDM0MTRBNUFCMkEz
-MzQ1NkRBQjcyNDc1MTNDQUNDMTM3MEEwMkQzRTBCMUJCREY1OTkxMzg1RkEyCgo5RTAzRjdD
-QTIxREMxOERBRjYxMkZDQUZBOEUzNURCMzY2Mzg1MDE4MUUwNDY5NTQ5Mzg3MTVCMjRDNEYz
-RjU2OTQ0MkI1ODE0RjIyQkUKCjg5QzYwRDkxMjQwOEQ1MDUxRkFCOEM1NzcyMkZGNjk0MkQw
-NDVBMkQ2MkIyQTY5Njg2N0RFRjM5MTVFRTE5NzM1NjFFOEVEMTY1NEI0OQoKM0U5OUIyNzc1
-NjA1MDY2QjM2QkQxNTZBMTM0N0UwNkIzMERCMTI5MjE0QkVCRkVFRDg4MEMwQjU4MjkwQzVG
-NjI5NUQyNDNFQzQ2QzZFCgoxMjJGNkUyRUVGNEM3REI1QUQ5RUZBNDkzQ0ZCMDExNzNDOEM5
-MkE3NkE1RjkwMERGMDIwMzAzMkM0OTAyMDhFRTVFOEMwMDg4NzA0QTYKCkJDMUQ2OUI0Q0Qy
-RkUxMjJGRDhERTU3OTgwMUIxMTBDNzZGRDhGQUM4OEMyNDU1OEIxMjdCQjkwNzQzRERFNzFG
-REU5N0IxREFDN0I5NgoKNEM0RTVERDhFQUQ5RjBFOTlENDUxRUQ5MkI0RERERjhCNzY2NDM3
-MjdGOEQwMTFGM0U1MjdBMTZBNzAzQ0Q4QTU5N0YxODY4NUFFMDBDCgpENDQ5NDRBNzdCNjlE
-MDkyQjNBNjFFQzk0MEREOEY2NEMxODUwQUY3QzhEMTdCNjkwMjM5NzA3MDAwQkExQTBDMEMx
-RDIzNjQ4ODM4QTIKCjFDMEJGRjkyNDBFQkE2REI1ODMyMjE0QUNDOENGMDIyQkFEMzA1RjY1
-OTRBOUM1QjdGQkZDMzg4MTk1OEExNzBCMDI2Nzg3MEU0QjgzMQoKRjY4OTUxQkI5OTUyRjc5
-MTA3QkNERjI0QkE0QjQxRUUyRkMzMUMwN0U0QTRBNzM0MEIzNkIxQ0QxMjE3ODlENjMzQUE5
-NTg1NjNCODBGCgpBNkNCNTZGMTFFQUM1QjQ2ODgzOUU5NTY2NkE5NkI3REY5RDNFQjE2RjU2
-RDY5QkQzREQ2REM2RDM0NDU4QjNENTZENTVFRTlCQjJFNTIKCkVCMzU3ODg3REIyQjhDMTJE
-MDY0RUYzMUUyQjUzRUM0OEE0OTY0RkVGMDBEREYwQ0IyNkU2QjJGRkE1RjU4NjY2NDlCQzM0
-MTVDMEU2NQoKMTBDMDk4MTQxNThDOEIzOTFCNzRBM0Q3QTA3RUY3Mzg1MTkzQkNCQUFGMjZF
-RDA4NjE5MUZGQjgzMjhCRjM1MTFCNENENTRDNjM2ODc3CgpBOTE2ODY2MTc0REYwMjYwODAx
-NjM5QjMwMjRCOUM5NjUxMTZCMkE2OERFQzhFMTcxQTYyMEFCNDcxRjY3MzM5MUEzMUIwODE2
-NjVGMjcKCjgyNkU5QUMyQTMzRENCMDU2NTEzNEU0MDdDNjE4NzE1RTE0NkNFQ0ZENThFQUY0
-MEQxNTc1QTgwNURGMTJCNzFBQzNEM0JCQTQ5MTNDQQoKRDg0MTg1QkI3RkRCNkEyRURDOTA0
-RUMwRkU4RDk1MjU1RkM1MDE3NEE1MDZERjkzOUZDMEZFOEM2REQ0RDI3NTY2QzMyNTY5RUEy
-MzM5Cgo1ODNENEZBQTgyRTAwRkY5REI4RDMyMzVEMDBBQzNDMUFDNTgzMDZEMkUwMkQ2NUQ1
-NERFRTZERjZFQ0YzMzcyNkUyNDQ0RjYwREJGQTMKCkRGRjRGNkZENEFFODgzNzZCNTA3RTcy
-MUM5RTlGRTAzMEQ3N0I5NUFCMjlDNkRCNzAzRkE0NTUxNUE0MjRCMjEyQUNGOUQ2NThEODQ4
-RAoKMTIwODgzREVFRTc4MzQ1QTM1Njc5QkY4MkQ3QzI2Mjk3MjU5RDg2OTdBMEMyMjFFMjZD
-NkVBQkYzQTcyN0Q5NTEyMjFDRUU3NERGREYxCgo1QTMzMzYwREVBMzZERDAwNjM1MTVCNURE
-MTdDMjA0RTBGNEQ0OTM1RkQwQkJFRTc3NURCRkZBRTIzMkFBMDE4QTA0QTVFNTlFQzYzREQK
-CkREMEI4QjExNDUwRkZGOURBMEQ0ODk0Nzc4ODc3RTBDNjNDODI0ODlEM0Y3Q0Y2N0I2MUVF
-MDhBNjExMzBGQjc3RTE1QjUwQjdFODdBNAoKMkY2RjgzN0Q1MEZBMzY2NTUyOERGOTE2QjE4
-N0IxMTk1NUIwNDI0QTc2MDNGMUY2REMxRTJCRjQxRUFDNkU5OEU5RjBGNUY0NDU4MEEwCgpB
-QjhDNjQ5RURENEY5NjBGNDc1OUNCQzI5OTVEQjBDMEUwN0E4Rjc3M0VGOUY1OEVBNTQ0Mjk3
-NzlCN0QwODVGQjQ2QTUxOUNBODlCQ0IKCjAzNDBBRjg0M0VDQjM3QTgyMDhCNzczNkFDMjc0
-ODExNzI3MjhDMzYwREIxN0NGRTgxRTM2MzU3OTRDQTkxOEMyQkJENjY1NEQyRDRCNwoKNDAw
-NjA1M0VFMTdEMUREN0VGQjhFQTg4MkNEMDU1QkI1RkM5QkFBQUVFNjMwODlBNkYyMEJGODhF
-RDlFQTY0M0FDMjdEQ0U5QkMxRjFBCgpCOUYxNUI0MDE3MkM3RTRDMDYwMkQxM0QxMzIxNkNG
-MEYyRDU3RTUxQjc1MUFGQ0Y4MTYwODM1RkQ0RTNEMjFBNTg4OTg0MDE0MjU5NjEKCjY5Mjcx
-RTJEQzk1RDcyRTZGMDc1RjQxM0M5NkRCN0REMTdCM0ZGMjYwODgwOUQwODc3RTIxMkE3RDFE
-MTdFNzRDQjRGRjQ4QjY1NjQ1QwoKQjgxMjZEMDVBRUJCRjFBNkVEQzcwNDc4N0NDRjU3RjlC
-N0NBQ0Q3NUY3NDhBNUE2QTFDNEVDODYzQ0VFQjJCQjFEOUE0QTIwN0I0RTBCCgo5MDEwNjBE
-MEUzQTk4Nzk5NzBBRTk4NDY0RDhENjdGOUI0RDdDNkU1ODJGMDMwQjhEOEQ2MkUxNUZEREJC
-QTI1Q0NBOEE5RUZCQzAyRUYKCkMzMDRDQUVFOTAyNjcwODE5NDYzRENCMDQxNEIzRDE4NUFB
-NkREMzcwQjgxQ0E5MTQ1Qzc1QUQ0RjdBNDc0MTFGMkJEMENBMTUwNzQ4OAoKMTE3ODY4NDU4
-QzA4MDIwMTAwNzhDQjRFQzJCRTAzMDhDOURDMjJBRUY1QjJFOTI5NEVDMDBCQjU1Njg5MTYx
-NjREQTE4Q0U2OUQxNzBGCgpBMzY0MUQyOUQwREZEMDhCNUFGNkUxRjE5NTFDRDkyNTdDMDY5
-OUIzRkMxQjZDQzE5NDIyRjQzM0NFQkNDN0NDMUUwRDMwQ0NBMUM2RjIKCkQzRkZCMTM4NEY1
-QTFEMzI2ODFBNURERjQ5OTMzNjI5RjdCMDQ0RTQ1REQ3NDhERTg1MDkyNTdFNjg4RjFDQjYz
-N0ZCNzY2MjY5Q0JGRQoKRTIwNkIyQzE1NjBDQzNBODQ0NzBDRENFOEZBMEM3NDI3NERGNTA5
-NEQ0MTNENUE1MUQxQUJERkFBNjZEOUM5REQ2MjdENzJDMjlBOUQyCgpCMEEzNTUyNzg5Nzc0
-MTEwNDgxRkYzRjdFMENCNTgzQzdBQzU2MzRGMDkyMkM1M0ZEODE2MDE0OTdFOTZCODEwMDhE
-OUM1QjQ5RjRFRDQKCjAxRkMyQ0RDOTc0NEMyRTMxOTQxQkIxREEzNEY2RjZDQjYzREMyQzIz
-QTRCRTE3RDNEMTNENDEzMTg4QTJBRjc3MTQzMDIxRDM3NkU2MQoKN0VCMUIyRDMwQ0Y1QTFD
-MkM3NkVFREVCRUI3MTBDMEM0MTU4OTU4QzNEMkJBMjg5ODk1Rjc5RTNERDQ1QjAzMEQ5MEIx
-MjY0MDk2MUI1CgowMzBEMUZGQzYyMUI1NEE4NjkzNDkzQjVGQkREMTkwNTEzMkVEMjZGOTc5
-OTM3MEE2N0IwRDkwRjdGOURGQjA4MEUxNDFGNjQzOTM2Q0YKCkRBODEwRUU4NTIwMTcwNEEx
-NUI5MkM0NDE5RDY1QzBCRDFBREFDNEYxNTc5NThENTJCNTI4QTg0QkNDNjlGNTdBMjUxMjNB
-MDREMjIwMgoKMzE5MDY3QjhCOEU4MEZFQTgwRERCQTlGQzA3NUFFREM0ODBFODIwOTExMUY5
-NDQ0NzQyQTg3MDdGNTc2QTdDN0ExRERCODk0QTMzODEzCgpDMkQ2RkZBN0IwOEUyRERDMTMw
-OUVFMjBCMUQ4MEJDMzg3RjlERjFCQjc4NkJGNkU4MjY0MEQ3NzVGMDg0QUJDQjg2QzA3REYx
-NTQxM0EKCjA0NzVGMjZGRjYyOTYwQUREMUI5NEYyMEZGQjJBOTA4QUFFMkM3OUFDNEVDMzg5
-OTQyNTg1NUQ4MDI2MkIyNzU4RTc2QTQ0ODhEM0E0NwoKMDA1OENFN0JCQkU3Qzk5MTE4MzQ5
-OUVCRDJDNTUwQzI5MThFREFCNUJEOUQ0MzI3M0M0NEREMTkyMDI0RjczNDY4QkEwRUFEMjgy
-NUQ0Cgo5OUVGRjRBOUIxQzJGQzY0QUUyMjIyQTE3MTE2QzFGOENENjE2MjJCMDhCRDU3MzAz
-NkM0ODk1NkMzNTEzQTZBM0I5RjA2NjkxNTM3OEMKCjJBNDFCMzE2MzY4OTk1Mjg0N0FEQjdG
-NjI0MzAzNzg1RTlGNjFBREQ3QzJFNjQ3RDJBMTcxQTVBMDQ3MUU3NkM5QzZERTQ5MDlCMDE1
-RQoKM0JERkM5ODM2REI4ODQ0OTJGNUM5Q0Q3N0Y1RTI5REJCQzgwRjVCODM2Njg0RTgyOTAw
-RkFDQzdBMkNDMUQyMEU2RkVFNjBCRUVBRTkzCgpEQjk4REUyMzhCNjZEMTNCREM4NTg1OTA2
-NTRGOTYwRkQ2QUFBNzc5RjAwREI3NzM2QzdGMTg4MDhGRkMxNjdBRTMyNDIxRkI5NzVFOTQK
-CjdGQzQ5QTIzMjBERENDNEI2ODQxRjU0RUEyMjhBNTgzODNENDIwQTI1QzIxRTg1Qzk5NjY0
-QzhCQjIwQUFDNjYzOTBCQTQ2QjQ5QkE3QwoKNjgzNEU4RjE4Q0IzMUZEQjkyRkNBQ0YxMUZG
-MUE5QzUzRjA2RDY5OTJCMDZCRjBDMDFEQTIwODJFNkVBNzA1MjI0ODQxQTdDNkFEMDJCCgow
-MTVDMkFBRDE5QzhCQkYxQUUyNTA2QjA4RDU3Q0ZCQzBCMjkxNDAyQkRBNUM5NTY5M0FENjU5
-MDJGOTZCOTEwRDQ2NUNCOTM1Q0NBRkEKCkQ3MzFDOUYzMEI0MEVDNTlBRjEyNDQ2QzE4MDBD
-ODBBQzYwRjRENENFNjhCODA0NEI1NzI1NzI3QjMwODlBQkJDNkU5NjMxQTRCQTVGNgoKNTg5
-ODkxQTIwODVDNzRFMzFBNEEyQzRGMDU3MzgwMDE2RjUwODNBRkFCNkQwODlFNEVEQTE3NzA0
-NUJGREYxNjgyRTg0OEJFRUYyRDFBCgpGRDRGOEY5REY2ODMxRkNBMjJDRDdDNEEzNTFDRkU3
-NzA2MzVEQTIyRkQxMUIzMzI2RkY5QUE3OURFNzZFQUZFOTlCNjk5RkYxQzczQzcKCjEyRUJG
-RkMxRDg0QjAxNDI5MTRFMURGRTk5MDYwNUU3M0NFRTdEMEU4OEIwNDk4NjA0QzE3OTY2RkYy
-M0M5MjJGRTcwQzUyMjAzNjIwMAoKRjVCRUEwODFDREY4QkNBODU1OUNCMjJGMTA4REI1MjdB
-QjZBQkFFMUI0NTI5NjdFNTBGNzEyQ0NDQkQxMTI1MEM1NTgyNTc0MUY0NzY3CgowNDM0MTFF
-RjREMDJBMUIyNkU2MzNDQkIwOUUwREMzRTY4RkVBMzNBMjU3QzI2QkMwMjI3NjlGNzFGMjY2
-Nzc3NkE1Nzg4N0REQzA1QjAKCjY5QzE0MjRGOTA4RDhBRjg1OTY4MDU1NzM5RDBFNzY2REE5
-OTdCMkU1QzUzQjkwMjJDRkYwMUIwMDRFQjBGREQ1OUJENTlBMDMwRTZDOAoKMjkxRUU5RDc3
-MURBQkJENTVFRjc4QjZGMkM0NkI3N0E3REFGNDI5MDM3QjQ1NTM1ODY1QzdGMjE0N0Q2MDQ0
-OTFEMzk2NDdFNEZDQ0ExCgpCNTY2OEIxMDA2QjBDOEY2MjE0RDdFNUVCNTUxOUJFODQzOTI3
-QzNCRTRDM0MyMzZGMTAyQTFBMUVFOEI4MkU1REYzNEJDOEZGREFDREIKCjc5QjJEQjkxQTUy
-RkVFNDg5MkY3RjI0NTJCOTAzREQ2MzYxRUNCQUIwNzEzOEYzNTY5NTlCODMyODE5Qzg4QUJF
-OUE2Qjk5OUJBREEyRQoKMUEzQzMyQjA0RjczMUU3NUM3Mjc0NzJFMjMxQjFCRDc5RTA0MEJE
-QjcyMTc1MzI3MjUwOTA1NTcwRkNEOUQ5RDcxRDYyN0Q3OTE0QUQ0CgpGQTUzNkFBNjQ2MUQ1
-RjUxMkUyRTFFQjc0NzVBRjZBODNDMTA5MzA1NjhERjQ4QkYyNzk0NDkwQjFGRDcyNjk0NzNF
-OEU1NkRCODEyMTkKCjUxMjdFRDc4RTUwMEFCQ0E5RDI2MDNFQjQ2MzI0OEIxQjNGNkVFN0Uw
-Qzg3MDA4Mzg0OUFDN0Q4M0I4NDhFODE5MTc1QzQwNzVCREY1MQoKNDA5MDE3NjFFOTUxRUFE
-MTlEQkUyQUI0OTFBRDlFQjVEMTI0QTIwQ0JBQkJFQ0YwNUZBQzdBRDYwOEExQUNCQ0U3RkQx
-Qzg4NDhFNjE0CgpGQzk4OUEzMUQwMDEwRUMzQTExQ0Q2Nzk3RUVFOTQxRDA1NDZFMEE1OTRB
-QUQ5NTczOEVBMEJEMEJEN0Y1NUNEQzBCRjhEQTA4MkMwRTgKCkNFRjM0OTk3MUQxM0NDRTky
-NDZCNzRCNkM1NTI0NzlCMUU1MUM3QjMwOUFDMDI1ODk3RTkxMEIwMDc0NkMxMzA3QkUyQzUz
-MTIxN0UwRQoKNzZDRThBNDcwNzJEMDhDREExMTZCNjVFNzU2ODE1NEJCRDJENjdGNTcyM0Mx
-ODdGRDQ2RTU0MTk3N0FCQkE2NjJCQjA4MDc5RDkzQkVECgo3OEU5MjRDMjQ4MkIzOTg2MUZC
-RTFBRDMzOERERjEzNjQ3MzZCNjAzMERCMkZGRjFFODk2NURENzYzMTI3NkQ1MTZBOTZEREZG
-Qzg5REQKCjJEMzQ4MDQyMkFGQjMxRTlBQjgxRUYxNTU3QUM1QzcyMzA1MTA5NkM0MUVBN0Q0
-MEJDN0ExQTI5MDJFNzgyREY4ODcyREUyRjI3Q0MzMAoKMEM2NDVENEVGODg2NzE2RjI5OTk4
-MTVDMUFGNjM3MkMzNTlCRjg0QzIwOUM0MkI5MzkxODVDNkNCRTE0NTEwQjlEQzAyOTk3MEJG
-REFECgpCRkM3RTJGNEZCMEY1MDYwRDY5Q0ZCMEZGNzEwMjY5NDlCQ0MxNUZDMTc5QTREQzlC
-Q0E2NENDNDQwN0I2OTRFREJDNTQ3MjAzMjNFNEEKCjI3MUFEMzg4NTI5QjA3Q0YyM0IyMTg4
-NkRFN0Q0Q0U3MjFCREQxMUMxOEM4Q0QzRDFENTI2MTk1NDg0MEUyREVGODcyRjBDNzExQ0JB
-RQoKNTE1NTk1N0JEMkU5QzRGOTI3QjdFOEZDMTlCMDQ2MDhGRDQxMUMxMzAxRjQ2MDkyQTYy
-RjNGMEE1MjU0MzZEOTkxOEFEOUM0N0E3NjcxCgpGNDBBQTMxODk2QzZERTgyN0RDMTJGQjdF
-N0M3QjVBOUVBRjkzMUJFQkYxQTRBQTRGMjhGOTI4N0MxNkFCNzgwODVBNDRDNTYzMzg4NjMK
-CjkyQTkzNjBDMTg4MzgzRTMzRkY1OThDQkNFMzQ3MDNBQTREQjg1QjYxQjRCNzlENTM4N0Q1
-NTc2MTI4QjIyOTQ3OTc2NjE3QjY2RkE5RQoKQzNEODBFOEEwRUZFMjU3MEZCNDYwMDYwQkRG
-QkZEODFGRkE4QTg5ODZGNTZEMjY2NTJBQjI5QUQ2RUIyQTQ4ODFGQzQ4QjAyMzEyMkM5Cgoy
-MkRBRkE2NTMzNzExMEM3NjQ5MENFM0Y0MUJBNEFBMDVGNjNDNkZDQjMxQUE1QzM5OUVEMDFG
-RkYzOTQ4QUI2OTBCRjAxQTNBMTk4MUMKCkIxMjBERDVCRDFDNDVEMkM1NzI5NzY4OUFFRTQ4
-MDY4NUJGMjNGRURCRjY2NTE3OEExQkI1NEY5QTVEQTIzRjcyMzE0RUM5RkQwQzY5NwoKN0ND
-OTYwNzg0NjFFNDg2MjVDODdBMjlEMEQxNDRFMjdBMUQ0RDc2RTE4MDI0RDBGNkU5MERCQ0VD
-NEExM0I3REI3NUE4RTk1RTcxNURGCgozRDczMDA3MDcxRkIzMEZFRTlGNTUyRDk2OEJFQTlC
-OEZCODIyQ0NENkREMzM4M0NBOUExRTZGRTgwODhDMERDRUE5QTVEMzhDMDQxOEUKCjg4Njgx
-MTVBMkJGRTZEMDU1NTgwQUZFRkRGNzBENTEyQzg0ODhDM0MxMzg5RjI2QURGQzc2NzMzMDQ1
-MUY3N0QyMDYyN0Y5NTYzRTkxOQoKRTUxODJFRDJDOEUwN0RBNTQwRUUyQzY5MjVEMUU1QzZB
-RTVEMTBGQUE4NERGRkU5MEFEOEI4ODJGREQ0MzFEREZFMzZCNTEzNjE0NTQzCgoxOEZCNDdD
-MzlGQUNBNEQ2NjE3ODU5MjBBOEJCRUJCRDcyREJCQ0FBQzFCNjZDOTQ0QUVEQTAxOEJGRjhG
-MTVDRDU5MTdCRTRBMUM3OTkKCkQ3Rjk2QzY5QjVCNzlGMTFBQTM2QUNGQjlBMzk2MzlENzUw
-NkUxODgwMEE4NjEyRDFEMkM5MThGM0NENEI5NzdDMUZDRjE3NzE5MThDQQoKN0NFNEU1NTBB
-MjREQzBGOUE0NTk3MUIyN0FGMkQ2OEE4NjQxQTRBMjA5QjRGRDcyODU3NzEwQkU2MDY2QjVE
-QUIyMzE0NkFDODY4MDQzCgpBMDRFODE1MkM1MUNCMEZGN0RGRTQxNTc2Q0ZCNDI5OThFNjNG
-NzkzQTMzRjFCNjEyODBCQjYxNTk3QzBFM0IxNzZERUQyOTk5MTlFNzIKCkY2RjNGQTRDMTM4
-RDIwRTQwQjkxOTg4RUY5REZBRjMwNzA2NEM5QzMwN0M5RjRGMkU5QUE0RDUyMTU0RTdCREQ2
-MTk2OTg3QzZGNkU4OAoKMDU0MzgwMjM0NzQyN0ZBRDlFQUYxQzg3OTkyOEE1NDA0REYyNDBF
-ODY1MzgzREMwMDc1ODFEQzI5QjI4RkMxOEYxRTZCQTg0MENCMTlGCgpFNjM5QzY3MDcwQTEx
-MEIwN0RCNjUxOUE1QTA3MjlBN0RFODJBM0NEREIwMzc2NUUxQTdDODE3RUM2MjIyNUE3RDI4
-NTAxMDFFMDdEMjIKCjlDN0NCQ0UwQjQ2QTJCMzM1Q0E5MDM3MkRBRENFRTk4NEJENzVCMENF
-RjEzRjFDRjcyMzdFMTU5MjVDN0I1NEIyNjEyMzZFMjYyMDg3NAoKQUNFRkI1OTc4QzAwRTA2
-NkEwM0E1NzgxNkE3M0Q4RjU1OUZCRTAwNkE5NDRFMEYwMjZEOENDRjMxOTg2NjY5M0I0QTYy
-RkY0ODEwQTJGCgpEMjlBQzM1RjQyOUJBMDQzOEE3NDcyREE3NjUxMDkzN0Y3OTlCNDJEOTYy
-RjNGMTk2RTE1QjIzMzU5OTZBOTIzMDRDNEJEREY3MTI3RUEKCjJGMDlGQjdDNzc5NTI1MDI5
-QjBFQzg2Rjg2QzdFNDE1QjgxRDUwNDI3MTRGREZCRDI0NTdGREJENUFDNkMxRDQzODJENTkz
-NTg2RTJFMgoKQUU5NjYwNTI5REQwRkY3MkQyQzc3QTlFNEI3NjY4OUY4RUU1QzlCQTcyRDMw
-MDI3MUI4Q0IyQkJCMzZGMTBGNTczMDkzNDRDMzExNEQyCgozMTc2MkZDNjhCQUE1QzQ4MkIz
-MzhGODQ3RTRFRjYzRjUwQTlBNzFCQkREODIxNEM2N0E5RkRDRDFDREU3MkNGMDcwMzc2RDgw
-QjBCRkMKCkJFRkJBOUM5MzA5NDJEMzVFODRDQTI4RUEyODU3QURCQTIxNkQ4OTc3NUU0NUZG
-QjQ3QUMyOUI0MTEzOENBMDNCRDc5MTIyQTc4Qjk5MQoKNDMxNzE0NDA0MjIzQjBEMDFFRThG
-MTM4MDBDODM0NkFGRkZEODYzMUQ0Q0IxQTZBRjQ2NTNBNjg4MTlGQzI1NDU1OTFEOENCQTg1
-RTNFCgo2MjBDODE2Rjg5QjhBQTU0MzkyMzEzOTg1OUUwRENGMDgzMEMwMkJFQTIzNkU2QUM0
-MDA2OUNENEJDQ0VEODg4NUNEQTY4REJEQjkwNzEKCkNFNjFDNjE3MThGRTMxODA5MEIwQzJE
-NkNEMTA1OENGOUY5QTA2QjgxRDExNDIxNUYxNUQzNDExMzI3QkQ0OEFBODQ2RjE4RTMzRDlB
-RAoKMTQyNUNBODQ4N0FGQjMzQkY5MDBCNEFCOEQ5REFFNTQ1QTRFRjIwM0Y0ODQ0RjcwMDFD
-MDRFQjNFNUJCRjY2ODgyN0EyRDEyQkU0MjA5CgozMUNERTRFODFBM0FFMDUwMUVFNEU4RTdE
-QTExNkRCNjQ0MTE1MkZGODlGMDQ1MTUwRDNFRTc5MjlEODhFMzQ1MTAyRUE3RjIwRTcxNEEK
-CjA0MDVCNDE1OTcyQjE2NTBENUM5MjAyMDY2QzgxMzcwM0QyMDI0NjlGRDBFRDM0ODM4NzVE
-MkNEOTU1RTc1QTg5Mjk5MUU0NDZGMTQxOAoKNTU1ODQzMUEwNzZGRjQ0MEY0MENCNTlEMEE5
-RUU0MDY4N0FFRTFDQzczMzZCOUQ3QjlBQkYxNzJFNERDODYzRjE1OTFENEQyNDI5MEFBCgo4
-NTgwQUYzQTNFRDVCN0U3OUQ4RkY2REFCNjgxMUIxMDI3RkRBODg3NDY5ODc3MzA0RUYxODAx
-RTgxODZBRjk4OEQwQ0I4OTJFRkY3RjAKCjZBNTQ4RkY2RDVBNUEzODJGRkMxQTMzOENGRDYy
-REVDMUYzODlBMDFFMjZEMEYwNTI2QUIyQjE1QTcyNTJGMUVCMDNDMTg4RDBGRTczQgoKNkY0
-NTI0QjRGNDM3ODQwNzA0MDQwQUFFQTM4MTU0NTI2MDM5RUZEQjY1MTMxM0VGRUYxNjgyRkQ4
-NDRENkI4MTI2ODQ0RkQ2QTE5NTg3CgpBMTM0NTUyODMzRjdBQTdFMzY4MUVFRkZDMjU4OTY3
-N0E0MzYzRThFOTU0NjlGM0M2NjU2RTc3Q0Y2OTU3MkQzNDA4RTlCNkQ4NDM2RjMKCkNEQjky
-NkEzQTU3RUE1NDI3NjA1MEM0QjNDRDg5NjQ2Nzg2NjdBQzA3ODVDOUU5MDA5OTExMTc2MjdE
-NDM1RkYwMzhGNzk5REUwODlFNgoKREYyOEUyQTQwOTgwRDdGNzI1NkZBQTI5MjhFQkExMkE4
-RDZGREQ4MDU1MUIwQ0YzQUE0NDJEODQwQTExQzk1MUI0NDRFNTE5QzE5RjJGCgpEMEYxREU0
-NzJGQUMwRTJFQTBCQTg5OUEzRTcwMzEzRDI4QjQ4QTZBQzM2MkY5QzdFQTVENUFDRjVEMDQz
-NzZERTZDODg0MzZCNzYwRkUKCjhCRjY5NEVDREQ2QzM2NkFDMzFEMzQ0NjkwMDBGQkYzMUJB
-RTlDMTRGQjIwMzBGMTVBMjk2NUI5MTcwMjE3ODBFQzQ2OUYwMEIwODI4QgoKRTJGQjk4RTU0
-NUIyRTQzMDkyMUI4NTUwMzZDQ0ZFQzZFQzlCNEZGMEVCQjY5QTkxNDk1MzgzMTU0QUI4NEYz
-MzFBMzIxM0JERDk1MTU4CgoyMEJFREVGRjQ5NzVFMDc2QUE4QkQ5QTQ4OTlCNUJFN0FEQjI3
-MUMxNzgyM0IxODQ4OEQ3QjM4N0IxQUZDNzEwNkM4N0QyMTlEREY5NkEKCkU4NjZGMUIwNjc2
-MDc2NUJCMkFGREREOTUyRkUwQkNEQkI2MzE4MzQ1RjhEQUQxQTc4MkFBNTM2RjcxNDhBREMy
-RDNCRjVFRjZDNkE2MgoKOURBQzVBNDlCRjE4RjlGMjFFOUFEN0RFQkQyMzdDMjI5Mjg2RkUy
-MzcwNTYwMTM5NTY5MzM4RDQ1NUQ4RDNBOTEzRDMyOUU4MDcyRTYzCgpBMDc2NjAxNzZGQkVG
-RUI5RDg4RkMxQzJEOUQ3NkM1MUNEMzA3ODFFNEVFNTlGOEJGNEY0MzZEOUFBMTNBMzlDRUQz
-ODdDQjU3MzI0RDcKCjI2QUJEQUVCMzBEQjFCMUUxNDc2OUY1RjREQzcyQURDOEJENzU3OTA2
-RkM0NDNCRjZERkREREYyQ0RBODY2NDAyMzYzREZEOUJFOEI4OAoKQTY4REEzRDBFMEIzQkFB
-NDA0QTk3RjU1MUEwQjZDOTBEMzQ5RkI5RjE3REU5NTVGRjVGQ0Y4MDdDMzg4OUZFMTBEQ0Ex
-MUFDNzNFODU1CgpCN0Q5MkEyNkU2NEJFMTk3MUFCOTM1ODJGN0Y1M0YxQzdCMUZFNDAxRDdG
-MEVCMEVCMTIxMjY2Q0ZGNUUyM0IzMzMyRDhCNDEwMkE0Q0UKCkYzMDYzNEM3MTA3RkY5Nzgw
-QThCRkVGRUIxM0ZFNUVBNzhEOEU1QzlFMkU4OEUyMjM1M0QyNEZDNDU4ODlDQTEyRkZBMTRE
-MzcwOTAwRgoKMjU3QjE0RTc2MUQ0OUM3NEZDMTlCOTc0MTIxMjBFNEJFNEVBRDA5NDM5OEU5
-MkJGMURFRjREMzRFMURDMjU4QTg1QkM2MjM1NDdCODcxCgowNEZCQjAyRjQwMjIwNDAyNEE2
-NkJGNjZFREE0REI1RjY2N0ZERkQ3QzBDQjZGRkQ3OTkyODhEQjExMEVBMUZFN0Q3QzNDRjNB
-MTMwQjQKCjI5RDI0NTBEODc1MDdFNjhDNjhGMkYxMzBBMzQxNEI0NDc4QUZCMUVENkJENTVB
-RjY2RUM1M0U2MjdCMEYyNzY0OUQ1QzVBQTU5QTc5MQoKOTJERTEzOUFBQzg5QTM3OEYwREEy
-MkEzMjhCQUVENTkxRDY2MDM1Qjk1OEIzMzk3MUI2N0Q3MzZCMTE5NzMyQTUyNDQ1NjJDRTkz
-MkFECgozNkVEOUM5QkY5QTA3NTZERDYzRTkwOTUyNzExNEQ1ODA2MTg3OTUwOEI5QzA0M0E3
-MDE4QUMzRjFCQ0ZEMDcwQzdDNkRCODc5Q0JDNUYKCjMwNUJDQjI0QzE2RjQzRDhFOUI3N0I1
-RDJBMEQzNzM3NTM2RTY0NTA0OUE2NEVENTU1Qzk5OTA5QUY4MEY2MEIyRjIzMDdFQzU4RUY5
-MQoKNDc5RTFDNDQ3QTU3RUZBNUFEMDY1MkY3OEY5NTJFNjUwOEE3NjhBODhGOERERUM4NTQ5
-ODY1QjkyNjZCNTREMDNBRkIxOTI5RjcxREQ1CgoxNzdEMDVEQkRCNDU1M0E4QzNFQkExMUYy
-ODREOUY2QzhBMjM1MzcyRjc1QzlDMDZBMTM1OTczMzk3OEFFNUY5NjUzRjAxNTc0MUU2NDgK
-CjI2RUI5MkY0QUU1OUQxMTQwNUE1OTk1NDQ3NUQ1NTlBQ0I4RDA5OENENEMwMjZBOTVENjc4
-QUZEODVBOUYyMDMxRjZEMjQyQTI4NTQ4NgoKMTM4NUNEMkJFRDU1QjZFNTQyNjFBRDNBOTVD
-NkFCNDYyNkZCQzVENkM0RjZBNjA5OTI5NzZENDA2RkVFQ0RCNzkyMjExQ0ExMzNDNDMzCgoy
-OEY4RDQzRkFGQUI5QTQ0ODlERDFFMUU4ODg0QjRCQTBCMjU4NjYwRkI4QjhCRUEyMThERTBB
-N0Q5RTVEQ0VBRThCQTFGRkEyMzYyNjgKCjdBRTQ2MzMwM0UxNkM2REJBRDNFMkZCREMwQzkw
-NEI4M0RCQTkxMzRCM0M3MkVDMUZDRjY4NTVDMDhFOTczRTAwQkE4RDM3RTg2NEVGMgoKMEI2
-NzQ4QTY2MjVDODU0MTE2QzNFMzJENUIyNEY1ODQ5NjNENUI0OTJGNjY2NkEyODREMTZBMkYz
-RTMyRTVENzc5MkRDQzFFNTYwNUI0CgpDREJFNEUwRDYyREZFODRCMzUxQjI0QTUwOUE1REM5
-RDFDMjEzMkI4MUM2ODIwOTZERjRFRDdDRTZBM0Q2REM1MTdDNkZFRTgxMDNEQTcKCjNCNUQ4
-NDFEMkI0QkJBQURDRDdEMTMxNkVBQzY4MDlGNzZCOTlGRTE2RUE5MjI3Mjc4MkFFMzkzMEYx
-QTAwNTIwNzhEOThBQTE3MzY3RQoKNzA0MUMzODNDNzMwRUUwODVENjA4OTE2NEFBREM0NjM3
-RDNDQzZBNjFGMjkyRTU4MURCMEQzN0I3RDEyMTRBOEYxMjg1MkZGQjYzNkQ3CgoyRjJGRDlF
-NkFCMkFFMUY5NjdFMkE3NTBBQzBBRDM2NEU2NDIwNzY2OUEyQkFFQkQxOTFFNDk0RDFCMDg3
-NDQ4RjZEQkQ4QjIyOTNBMjcKCkMxMTVFMzRERUVGM0RGNzlBRTFBQjMzMjAxRTBBRDY1M0FD
-QTcyQ0MwNkFEMTU1NzUzMTRERTRCNzYwMDlGNzYxQjhBMUM2Nzg4QTY3MgoKMkQyMERFNDYw
-MjY3NzIxMTdGNDIxNzFCNUQwOUU1NDE0QTU0RUE0NUQ3NjBERDNGRDQ3RkI1NDU4QTc4RTVG
-RkM4M0I1OUFFRTRGOEMyCgo0MTA2RTBENzZCNzE5RjdDMTI5NURDQkM3MUFENDZERUY3RTI0
-NzJCRTkyMjA0N0Q4QjYzM0QzODYxMDJCQ0JBNDk2NEE5MEE1MjQ3QzAKCkQyNENDQTI5OEQz
-OEEzQzUxM0QyNjBFRTQ4MjFCNTgzOTE5ODQyNTMzODVCQzYxNDI5NjU4RTMyOEQ4NkRDNjFC
-NUZFMDQ3NzA1QzhERQoKQzkzMTcwRjkyMzc2QkI0Q0U5NEI0QzkyQjhDRTYzOEZFQzE0MDgz
-MkRGRDg1ODM0MzBFRTM5MTM3MzQyQ0EwRjUyOTczN0E4RjlFMTg0CgoyNjRBRTJBMUUxNzIz
-NzdFOTMxQzZBOEMwMTQxRDM2RjY0NDYwMTFBOTcxNUQ0QjZCQkUxRERDQTUzRTNBQzcyQTcx
-RjYwRUQ4NkVDNkMKCkZEQTIyN0UwNTUzNDk5MUU3NkU5QUE0ODUyMkVBNDI2MUY0QTU2NzAy
-NzZDODA0OEE0QUI5NTAwNzE5RDkyRjA0MDgwRDMxOEIxNTZGRgoKRkMyMTZCQzFCRTAwQzhF
-MzE2MDc1MkJGNUIwMjlCQUE4NTc4MEM1MUM0Q0ExNjJDNzg0MEU3NDUwN0Q0MzNDQzlENzFD
-NjJCNENBRTE0CgpBM0FCNEFEQjI3MjlDNzUzOEIyRUNCRUM0RTY5QTFGNzc5MDNCQkM2OENG
-RUQwQkUwREVFOUM2OTBFN0NFNzRCNUJCOUMyN0E1RjExNUQKCkIxNzAxNUMzOUE4RTYwNDM1
-RTAwMDU2ODc5NzQ1QTQxNTUyRjk1RjdBNTQwRDUzNUEwMkYyOTA2MUFFNUQzMERERUI4RDMw
-RDlGQzJCRQoKQjA0Q0Q0OURGRDIzNjNDNEM3RkU4Mzg0RTkwRjk4QkE4QzI2MzgxRDlEMzQy
-ODAyOUNCQjk5MzNBQjQ3MUNFRjE4RjNGOEVFNTg1MzA5CgoyOTczMUVCMTAwOTA4QkJDMUYw
-NzRGMzk5QUEzOUNDRjVEMTJEQTM4Q0EzOEY0NjRDOTU4ODg3QzE1NUE0QTc3QTAwMkY5MTA5
-MEREQTIKCjAwQjgxNUFEMUUwMkMwM0Y0NDg0NDYyOEJENzAzRTJFMEQ2QUI1M0M4MTkzNzNB
-OTRBREZGRkE2NTc5MTYwRTY5QUQwRjFFQzEzMDkzMAoKMjJGMEI0RDJGNzEwQ0ZCMEY3MzRC
-MDFGNjI1RTQwN0Y5RjdFMEYxNDMxMzFDMTcxM0Q3NzAxNDQ2NjRFQTk4OUJFMEI5RUNDM0I5
-RkIxCgo0NUMxMDQzRjAyQjQ4MUQ4Q0FCQ0YyMURDMTM0NTUzRkM0QzFENDM1M0U3MTgwRUE0
-Q0IxRkNFQUJFRjc0RDZGRTVCQkVBQzdGMzBCMDgKCjFEODhFQjBBMDYyNjYyMkE1NTdERjZF
-ODYwRTU0NTM3QThGRTBEMkVEMEI5NzRCOTk0NDA2QUU1MkQ0N0U5NEZCOEUyOUVGNkIwMkRE
-OQoKNEEzN0RDNzcwREE4NTVBNTlCNzRCQUFFMTY4NUJBM0VBRTI0RkVGNTVCMDZBNjAzNkEz
-RDRGNTEwOUYxRUQ0QjU5QUE2MjE4NjI5QzFGCgo0NTUxNDU0Nzk2MTFBMkI5RkE4M0E3QUIx
-QzhBODBDNUJBRURFMzdFN0JFMTk1QzY4RTM2RkQxOEUyMEJFQzc4N0JCMTNCOEUxQzk4MDYK
-Cjc0N0Q4NUM2NEE0MjE4MTYzN0U4NkNBMjhGRjEzNUNFRDIyRTRENDUzNUNERTc0RTJBRDRD
-QTkzRjlBMzBFNzk0MEYyOERCNTlBQzFBNAoKMUY4Q0ExMkNCOTY1RTBCQjVDNDVBNUYxRDBB
-NURCQ0RBMjEwNDMzNzMzMzg0QTc1Q0JBOEVCOTNCQ0ZGMDVBRUUzNDQ0NTg3RkYzMUNGCgo2
-NDk1RkY4Q0FCNENFQ0ExNkZFQjBDODFFQjQ4NTcxRDMwMDQwQTkwQ0M0MjIwNDNCOEVBNzMy
-QTREQUZFNEU1NTIzNzQxNTMxMjRCNEUKCkIzRDM1QzU2RUU1QjRBMTQ2MTExQkJDNkQ5NjMw
-REIyQzlFMDREMjZFQkRBREI0NjEzOUMyNTkzMTlDN0M5QTc1MEZGMjk0NTEzNDY3NgoKODdE
-RTY4QkFCN0JBNkRFQ0EyMkZDQUYyRTVGMjA4NjdBOUMxN0FCM0UzRENBQzAzQThEQjg5NkQy
-QzAyNDNFOTU2NTI1Mjk4NzU1MThDCgpDRTA1MEE0OURFMzRGNTlGM0EzNDIyQzNDNkU0QTU3
-RkIzNDNBMDQ1ODg1OEM2QjY3NkY5MjA4NTdFQUJEOTk0MTkyNEM1NzEwQzY3NjgKCkM1QTAw
-ODFGQjhGNDdFOUJDOUVDQjcwMUJGMDk3RjAzM0M0QUFDM0UxOEIwMkVGOTIyMjg2N0QyNUZE
-QThGRDI5MUY5MzBEMTYzRjM0NAoKNUVFMzhCNDRGQURDMEU4MzBGOTM1NjBFMUJBNTJFQjlD
-RTlCMzc1RTlGMERGRDYwNjI3QkZDODM2OEJDMEI3QzRDNDQzRDhEOTE5MDdFCgo5RkRDRDA2
-NjZFRTZBOUQ5NjQyODA5MzE0NjUyRUZENEU1NzY5QTE2NEI1MERGRjg0ODZGMjA4OTAzQ0U0
-RjUxNzZDODZDMzY0MkRCNjAKCkFDM0ZBMkRFOUMxMDRFMzZCQjc2RDU2REE1OTNGQjc5NjAz
-NkMxN0EwNEE2NUYyQkU4QkI5QjM3MDU1RENENkY3OUUxOEFCMDBCRENCQQoKQUFGM0ZBOTVD
-NDlBODRBNjlFRjRDMTFENjA2NThDMzUyMDVEOTdEM0FDMzAwM0I2NTkyRUUzNjZBMTZBQTBE
-MUY5RDMyRTlFRUI1Qjg4CgowOEFGRDYxMjNDRjc1NkM1MjRFMTVDN0U1REQwRkU3Q0ZFQTEz
-NUJFMUJFODUyMDFFRkVERjYxRjA0NkM2NTJBNDhENDM1QTJGNjAyNEUKCkEzMTBFNEZEM0NC
-RUUwQTlDNkIxQ0QwMkIxRjNBMUM4Qzk3M0M1RjI4MUM4NjE5NDUwMUJEMDNFQjVDM0UyQTMw
-QzlFQkI4RTRFRkIxNgoKNjNFRURDMDk2OUM0OEM2NzI0QTVDMTI2RTA1Qjk1NzlDMDMxMDg2
-OUREMUVDODhBN0JGODU2MkVFRDk5QzU3QzExNTQxOUU2NTk5QkE1Cgo4MzIzMzI0ODY3RTJC
-RDZFOTcyNjMyMzgwRDJEMjcxRTMzMkM1MkUxQTg3QkI0NUM0RjY2QzlGODM2OTNFNkE5QTI1
-QkMwQjFCQjc1NzAKCjE4RkVFMjYxRjhENDUyOUQ5M0YyMzI4OUMwQjc1Q0ZCMEJCNkE1NTU0
-NTcxMkM5NDU3MDdGQkMyOUNCQjcwQTRDOUMzOTc2QzFERDBGNgoKMTcxRTU3OUE3NUZCQUIz
-ODIxQTJDNURFNDVEOEMxN0VBMTZGQTRCRTEwNjlENzU0OUU1N0U1OTIyQkZBMTgyODZBMUJB
-QUQ2NDQxNjFBCgowMkFCODQzQ0Q1NjI2MDI4QzNFNkE1MkJEM0NEQzc1OTk2MjdBNDlBRDQ4
-ODBFQTVBQjU2OTM2NjU2QTg3QkFEQjgyOEM2QzkyMDBFMjgKCjI3MEQ4MDQxMjY5RUQ3OEE2
-NTU3MTgwOTlGMDk5RTlGMTdGRTI3QTcxREYxNjFENEYxNjA2MDkwRjE5MkU1NjFBQ0E1RjMy
-QjgyNzg1NAoKMjYxMTYzMkYyMUNDRUIzMjI1MzM0NDI3RDlFQUY5QUQzRDk2OTZBQjNCMDU5
-NjU5OEQyREExOTEyRUFERDJBN0QwODU5QUIyNkQ2Q0ZBCgoyMjc2Qjc5QzgyNjM1M0NBQTBF
-QTM0RjY5MEQ2Mzk2NzY4RUZBOEJEOEE2NUNBQjQzMjMyNzIzMzI0Q0QwNUZDNTE3RjMxN0Q4
-QzVFMEMKCjgwOUZGRTc4QzM5M0Y3RThCRDg4MTQxRDFBRkFFODg1RTAyQkIwMjAzQzdENzI2
-MzEwRjZFRERERThCMzhDMUZGRkYzNDJENEU4MUVGQwoKMUNDNjhEMDcyRjY4QTBGQUMxNEJG
-NUE5MEVCN0YwNzYwNDQ3OTQ4OUNDNTcyMDk3OTY5NjlENjJDOTIxMzRCNTlBREYyNjRFQjFC
-MTU4Cgo1NkFGMkIzMkNDNzY5QUNBNjcwMzUxRUFEOEQzRTU5MTE3RTYxM0E0RkQ1ODQ1QzM4
-QUEwQUQzNzUxOTZGMjYyODkyMEYyOTlCOTRFQzIKCjM2Mzg0N0NBNDcwN0E5NTA2QzhERTRF
-QTlCMEMzOERBODg1NjdGQ0VENDBCQzk0RTc0NjVDMzlEM0Y2MjdFRjcwNDI5NTQ4QzM4QzJF
-MQoKRjAwNzAwNURGRTdCQUE3NzAxQjE4M0EyQ0ZERUIzNkNGODQwOTEyNDJBM0NERDhDNTk0
-NzUxM0JDRjdGQUE0NjJBOTJGMUU4NEIzMTk2CgpFM0NGQjAxOTMyMDQ4NUZFRDdEQjIzMUFD
-QkM1NkMwRUVGQ0YzNDQ1MjVGMERFMTUwQUE4OTMzQTREMUFFRkM0QzI2OTlDNEIxRTVGQkMK
-CjE1QUEzQTg5NDAyM0ZEM0YwQzc1RDc5N0U3MTBGQzFCNDFDNDhCQUM2RjVBQTBCQjJDQjE3
-OEI3MDVDMTAzQjY4RjdFODQzNkM0REQwMgoKRjA1NEMyQjRCNkMzODczNkQ5OUM1QkQ4QzU3
-QUZBRTY3NkZDOEI0RjA3OERCODNFRTZGRUEwQzk3QkQ0MzQwNjFCRjU3MkY2NjE1QjM3Cgo0
-MTlFRjUyNTBFMzJDNEYwRjQ4RUU3NzlFNTAwRTdFM0M0RDJBRkY2OTlBNDA3NzQ3M0EyOUNF
-OEMyQTJGQjkyNjQ2MTA3NTc2RjQyRTQKCjhERTEyMzNBQkE0NzIwNTY0REU2ODk5MDQyNUQ2
-QjQ5OTBGRDE5ODI0MzI3NzQ1N0E0MjY5MzQ1N0NDN0FBRkIzNTgxODRGNkFBQTRGQQoKMUZF
-QkM5M0M1NzMzODEyQTFCMzA4REE1MDlGNDczNzYwRDFGMkU4NDZGOEVCMkQ1MkZENTVDQjIy
-MEY0QzE5ODIwNEJEMjFFQTJERjBCCgozMTQzNDYxNkY4NkQ1MjlERTVDQkNBQzUzRkRCN0VF
-QTY5NzI2OTFFOUI4OTgxNTIxMDg3QzI1RjE1NzQ1NzZCRjc5OTU2OUUzNjk5RUIKCjc0NjE4
-RERGQ0Q1RjAxRTZCQUIwRkY1MTNFQzdFMkIzMDAzMDA2RDk2RTQwOTVFRjUwMDkwNDRBNUYx
-QzNCMDA2QUVCNEQxNUVDREU1RAoKNTNDMUM3NkQzNUQ4N0FGMjAxQkI0N0M5NERBQjFCQ0Mx
-ODJDNEY0ODc0N0FBN0UxRUQ5OTFDNEI2MkQ5RjlEMDhENDI4M0VFRDVEMjg4Cgo3RUUyMUI3
-REUyNDlGNzMxNTA5RkI2QjkwODk1NDNGNDc5MUM0MUYzQkMwRUVGQTE5NzkyM0RBODYzMDhE
-RUM4RDYzMkJFMDIyMTI5NEMKCkE0QUVEMkY2MUMyOTdEMTY3MDQ1RTVFNUEzMDEyRTIyM0Q2
-QzM0ODg5OTcxMkM1NTA2MzgzNTFGMTJGRUIzRDY3MzY4OTU5RUFBOEIwMAoKOTA5OTZFMzlF
-RERDNUIzQjE2ODRFMkRGNERGQ0RCQzg5QTZBNkY5QjBBRkNDQjIxMTUyMTczMTZBNDg4MTJD
-MTY4QjI0MzczNEI1N0I5CgpDQkQ3RjA1QTFDQ0U5RTMyNUYwRkJEQTc5MUVBRTdFNjY2RDFG
-RDdGMkQ1RjA4NTE2NUQyQkIxMDM4NzUxM0FDRjlBOTAwRjg0OTM0Q0UKCjkzQTY2Q0QxQkVE
-M0Y5OTA3MTRBRDkzOEJBODU3MkE3MUU1QjI1NTdDMjk0QzFEMUEyMEYyN0U1MUIzNTVGQjM3
-MTEyMzQ1REMzMzcwNwoKNzNGRTc1MEQ1QzIzMzA3ODFFMEEwNTYzNkRGMEYyODMwNDZCOTcz
-RDFCMTI0RDkyQTIxQTNFMEFDRUE4Nzk4NDk3MDBENTkwMTA5M0YyCgo3QjNGOTA0NjBEODIx
-OTRDREIwMUEyQ0YzOEZBRUY5NjQzNzRFQjExRDBFMTUwQTIyOTdEOENBNEE1QTVDNTVCRUE5
-M0IwMEVDQzkxOUUKCjcyNDZDMjg5NDA0Q0FEMzQ2NkVGNkJGMjgxMENGMUVGNzQwRDI4NUQz
-MzAyQjVCMzM2M0E2MDc0OTE4NzFGQ0QxODFFOENFRDVDMEMzMAoKMTlGQTMzRjE2NUNEOTYz
-MEQxMzA5MTdDMkEyNDZGMkQ1MDAzNjU3REJCMkZBOEE3RTNGQTg0MDQ4MkNGMjFFNTc0QUI3
-NEI5RUI1MDI3CgozODdEQTQwRkIzRUJCQTE4OTQyOTdDRDM1NkUyMEFDRjdEOTU2QTNFMTQy
-MjQ4QTU4OTlGRTk0MEEyNUJENUM4MTJDMEU4REM5MjNFRkUKCjI3RTQ5NjQ0OTM4RTNCRDk5
-QTA4NkFENjk3RjBBQzc1ODM5MEIzNjRCNTJDMDQ5QkIxQjMyMzc2RjNBRUZDMTVDQjREQjMz
-M0MxNDhCRQoKOUNBNUMxOERCMzhCOUVCMUYzOUYwN0MzQzJFQUUyQUZCMDIzOEY2ODc1ODNF
-RDdGRTA0RjU1NjMyNTQxQUM1NzJFMEJCN0M3NjU5QUEzCgo5OTlEOENBMTJENjI2N0ZEQjBG
-MUNENzIwQzE3NENDMjhFRTM3Qzc4Q0Q4MDNCODc2QjgxNjgyMDVGMzY2ODdDMTJDMEEyRDM1
-RDFERTQKCkI4NkY0RTg2NUE3NDFFODJFRUE5QzhFNDM4M0FFQzU5OUQxREI4NUM2QkYzODgz
-QzMyMThCQkMwQUI2NDNDRDUxQjhENTFBMzQ0OTJGMAoKQ0I0QzFCQTQ3ODE5MjlDMjc4NEMx
-MUY4NERFNjk5QjBDODRDMzVBNTA0QzM1RTY3MkU5NDFGMUQ2QkE1NDk2MEY2QzUxOUYxMTAy
-OERECgpDRjBFMDk5MUUxOEE3N0Y3NzJDNDNDRTk1QkRFRERBOUM4RDg1NjMzRUE2MEE3MzU4
-RTA2NDVENEI2NEY3NTFCMTFBRThBRTI3RUNCMTcKCkNCMzg1REUyNTlCQTFGRDc4RUE4QTU1
-REJGRUNDMjY3MERBM0MwMTQwNDc5QjYxQUNEOTlBNTlBREM1MDg0OUM2QUE3ODdDN0E5Qjk3
-NQoKRDg0RTJBMzA1MjlBQjhGQUUwOTk1REQ2NkJCQjVDNjA1M0UzQjk2QzU2NzE1NkE0Njk2
-QjE3MzZDMkY2RTE4MzRCOEI4RUU0MkNEQjkwCgozMTU2OTJENkJFMjk5RDcxNEM2RTQzQ0Ux
-M0RFNDI4MkIyNjFDNTE4OEVENkM2RDg3NUI4RDMwOEQ4NDQxNTJCRUIxNUEzQjE1QThCNkEK
-CjkyNERDRjcyODVGQjg1ODk3MzY3MUI5NzJBRUVFNjc3NEE1NzUyNkYyMUZDN0VFRDgwNTY5
-M0EwMDdCMkI0MzY5NEQ1RDMwQzlEQTYwNAoKQjNGQTYyNzgxMTRERDk4NzQ0Njk4RDg4NUZG
-NzE0NzQzQkJFN0Y4MUYyRkJBQkU0NTRCRkZENzRDQjYwMUFFMTA2QUFFNjFFMDk5NDg2Cgox
-NzU0RTRDRjMxMkExRERDN0JEMEY4NUQ4NTREMTVGREJCRjI5NjMxN0FCQjBEMEIyODI0Q0VD
-RTM2MkUyMTM3QTJGNTc5MjI3OUVGMDUKCkQwRkE2QjdEREQ0RkVGNjlGRkY5N0FEMDdGQTk1
-RjNDQjM5M0M0QjBEQjIzMTE1OTZBQjYzOTc0QjZCNzYxQ0M5ODQwNzczMUFGRjJERQoKMUE1
-MjI3NTMzMTVFREMwN0Y3MkNDNzNCRjdCNTVENzY5RTAyNEEwOTcxMEYxNDFBMjFCRjk0RTlC
-NzFDODgxMkNERDhDN0Y3QzNBQzYwCgo2MThFQ0NFNEFDODFGN0Q4NkI3NUUxMjY3MzZBOTA0
-MjU2RjU1NThFQ0U0MUE0NzFFOEY3N0I1RkJEMUZFMkZGNENGMEZFNTY4NjEyMjMKCjI0QzFE
-MTNDQUYxNTc2MzA2QURDQUMxOTI3Njg2MTM5ODgyNjA5RkNFMzM2NzE3MUZCRDBGMDE3RENF
-REZDOTA5QjQwMzk2NDNDM0ZBRQoKRjU5NDZFQTMxMzEyNDYwQkFBNDU4RjVBQzNBM0U1N0U1
-MjQ3QUEzOTBFQ0E0RjI5RUEzMjMyNEYwNkFBM0MzNzZDQjVDNjgwREQxNkYzCgo4NDM0NTY2
-REM1NEU3RDRDNkQ2MzkwMTI0QkI2OUVGNkQ5QUIyNjVEMUVEMkM2ODMzNTg3MEIwOURGNTdD
-MTM3RTYwM0EwRjhEMjZFNzcKCkE0QjE4QjdFNzIyNUIwQTkyQUY5MkM0RjIyRDQzQUUwNTNF
-RUNBRUIzRjg5ODFBOEVEMTNENTA0RTY0NjdEMjY2QkY3MjQ0QzBBMUEzMAoKQTU5NzAwQzFF
-QjlFMTgxMzEyNjNBRjUxQTk0NjBDMUI3NTMzMTZBMUJDNTg3RkFGRTNCNUE3RUM2RTg2NjI2
-RDVGQkU2QkEzMTEzRkFECgpFNjc2MzFCODMzMDE0MjRDQTI3QUZDNjE2NDQxNEY4MjYyRTNG
-RTI4MjcwRjhBREE5NkFGMDIzMkZGQUZFNjREMzdGNTEwNzQxRUFCNEMKCjExNkUwOTc4MEEy
-QzY0QUI4MkM2NTVCMUVBMjIxRUVGMjU3QzY2NzkzOEUzNEE0Rjk1NkI3REQ5NTFEMTBEMjM0
-NEQyMjhERjJCNTlDQgoKRTlBQjcyODIyQUNFMjcwNzg5Rjk3MjQyNkQ1NkEwMzY4NkVBREUy
-ODQzMUMwN0IzQkQ3M0Y2QkUyMkZERjc2ODhFM0I3NzEyOENGNzRGCgpERTk4NzM0QzMzOTBF
-REI3ODc0MEYyNDQ1MkFCQzU0NUFEMDgwNTdDRUYxMzIzMzM4QzBDRjNGMDIxMEE5RDUwQ0Y3
-RDQ1OTFEMjJEQzQKCjc2RTQyOUI0NjJCNzZFOTY1NTgzMTQ2Njg0QjBFMkE4QzZENDBBQzdG
-NDJENTk1NDc4Qzk0QzAxRjlBRkM4QTFBREJFMkQ0QjEzRTAyRAoKRDUyQTE5ODg2QTM5NzhD
-Q0YzQzlDOUUzOTFGRDY2MDM5QzU2MjI4MzlDQzYwMTIwNDA4ODM5RTU1NTgxMzZDNTdFNEJF
-QTI3NjFGMzhBCgo2RDAwRjQ5NTEyNjczNzdGMzY5Qjc3ODJDOTJEN0JGMDBDNkY4MTI5NjJG
-ODZCQkRBQTQzREE3REY0NjgwRUU4NTJGNEVGOUQ4MkJCMzQKCjVCQzFGOEY3NkE5QjdDMDk4
-MjAxMDhCRkUwNTRDODBBQjU2Qjg4QjQzODQ4OUQwQ0MwOTcyMDgxMjU1QzlFRkFDREFBMDhC
-QzgxRTBCNwoKRTA0QzIwMUExMjEyRDU5NzYyOEJCODI4OTRFQTcxMUQ3MzkxNjFFNTEzOTk0
-QTY3QzBDNjM1OTcxMTc3MzZDRjFBOTA0OEQyNDRFMDlECgo0ODA0QzEwNDgzRDA0NzQzM0Yw
-QTY5MjU5RENGOTk5NTU4QUZGQjY3MzlEMzcyMjIxRTQ5MEVBOEIxMDZEMEFGQzc4RUFEOUJE
-NTBFNTIKCkZDREFDQTRDMEYzRUQxMzY1MEI3M0VDNEY4RDBDNkM0QjBCRTI5OUI0QUIyNTNE
-RDRBQkNEMjhBOTZGNzYyQ0U0NTc4N0ZFRkE4OUQ3RAoKRjU2NzVEMERFMDkyRkE3MDk3MTk4
-NTM4RjAzMUE3NUJGQTJFOTFBNjREMTIwNkFCNTlDNUZEQkMyNEM4MEZBNTRDRDE2OEUxOTU0
-MUVGCgo3OTczNkZDNkQwMDg5NkQ3NUM2NEU3OUQ5M0M2NjU4QTAwMkE5MUI1QkFDNzE1ODM1
-MThDNjA0OTczNjUyMjIwQ0YxQ0I2MjZEQUQ4NTMKCjhDMTY2NDVDNjk5RjU3ODVBODYyNkJG
-MUE2MkZFQUI1N0NCMjYzODgxQjEwMjg5MUI1RDg4NkIwOUY2NzhBRTgwMUNCRkZBQ0EyOTA2
-NwoKQzExMjZCQjAxMzZBQ0RERTgxRDA3RjJGOTE5OUZFNDM5RDM1NTNBODE1MkU5RTJDMzFF
-QkEyRTA3NTRCQkJBNzJEQ0Y1MjVBODVCMDhGCgpGQzUyQ0FCNzEzNUUyQTNDODQ5REZCQ0E4
-NkZBMEMyMjE3QjlDRkY3NTU1NDJGQjRDMTQ1QTU2MTY5NkQzNTYxQjVDNTNGNTcwRjYxN0YK
-CjYwQ0JDMzFBMUVFMEY1NzAwOTlDNEZDMkM0NzAzRTFCMkFFODZDNzJBM0VGOEExMzhFRTlD
-Q0FDMjgxNDUzM0RBMjBFNEFCNUQxNzBEOQoKQkIyQTJBNEZFMUMxNEE5NUUxOERCRjNFRkIw
-NDAwQTgzNUVDMUY1MDAwNENCREE4RkZFNzMzNDcwMjdCOTE1MUMwRTAwMTExQzNEQjNCCgox
-NTQ0N0QwMDBDQjBFNkZEMEZFOTg1QUQ3MEFFNTI0M0VDOERDQ0UxRTVFNzAwMTgwODdBMzZB
-NzI1REUxQTZCNkVBMDJBOUNDMzIzQ0EKCjk0M0JDRkM1NDZCNUZGNDNEM0VDMzE1ODE3REQ2
-NTkzQjZBQzdDNTIwMzVFMDY2Mjk1MDlFQkU3Q0Y5QjVGOUIyNEUyOTFDMDY5NTJDOAoKQ0M4
-QUY5QTVGRUJERjhEMTZCMjJEN0JCNTE4RTExOTFBMUUwREJBNjgwNjZGMUNFMTU5QzVFNzYw
-OUVDM0FDN0Y0QTA1MkVCRTVFMDI3CgowNzEyNENERjg0MThEQjlDMDI2NTYzNDAyNzY0QjQ0
-QjBFOEFGMzFGMkJENjBEQTYwRTQyQzBCMzI5RUUzMkMwMzQ0RDQwOUUxNTVGRDkKCjNBNkYy
-OTk1Rjk2NURGNjg1NTIyMkFCMDk5NkIxODVERUM0NzkwNjQyQkExMEQzQjk3QjEwMjhEOUFF
-Njk0M0I3REU1RjJDN0E5RTE1QQoKRDY3MEZEMzUwQ0I3QTYzMzE2REY1MDk1MDc3M0FGQkJG
-N0Y3QkZDOEJDOTEwRUYzQTk1NTcwODgzMEMxM0M5MzFFODVDRjdEMTY1REFCCgo3QTkyNzgx
-MDk2MzMwN0ZDQzIyNTRBQzJDQzlDRTVCODMyOTNBRkRGQjlBNUREMDA4MDBBQzY4QjQzMUMw
-OEIyRTkyQkIyQkZCNkZGNTUKCjZENzA1MTJDQTA5OUJGODQwQ0VFNzBDRjE2MzEzMUJBRkRD
-MkQzNkY5MDg5RTA5MERDNjYwQTk0RjE3MEMwRUQ2RjVCQjZFRTJBRDc2OQoKQkU5NTFCNDBE
-QzFFNDYxODBCMkU1NTcyODlDOUYxM0NCRDlEMzMxRjIwODQ2MkEyMEMyNjk2MjlBRjdFMTgx
-Qjk3NzYzMzVDRDM0QTlFCgpBQjRCMUQ4MTk2ODk5QkJCRTk0NkZENTZDODE4MEM0MkMxNzg1
-MzZFNzJBMTMxQTREMDg3QUNEMzhCOTY2MkNGM0UwQkMyQzA0RTkzODQKCjgyNjNGOEQ2NEVE
-QzZCM0M1MTFDMzBFRjRBNzgyREEyN0U1MzBGOTZBQTBFMUNBNEQyOEVBMTA2MkZGNDY0MzA2
-NURERjk1OEREOTEyNAoKQkQ5NzVEMjdENkJDNzlFQTNBMTk2M0I5OTMwQjVEQzAyOTdBQjlF
-M0YwMjc0NUJDRkVCRjgzQkI5REFCNDZFMkQzNDIzREVGQkYwNTI3Cgo3MDEzRDZGQ0QwOEVB
-QTU0MDdDQ0VFMEY5MUI4RDZCNERDODlFM0E0Njc3NTlCODFDODEzNzk5NTJFMzYyMUQ1N0U4
-NkI3OTYwNUVDMTAKCjU5QTlENDZCQjMwMUVCQkVDQ0NCNjE1REY5MUQ3QTBBOTJCMTdFQzRD
-ODcxNkM0RjFFNjdERTdEMDY5RjdDQTFFNDU2NkY2RDlEQjk2QQoKRTNCQUFCRkNCNkUyREY2
-MDA1MTgyQjdCQkJBN0Y5NkY5OTMxNUNBNzZFMTI0OTdCQjc2QjJDOTRCODU1NDNGN0YxODE5
-RDNGNTNGMkNECgpCNkRBQkNDNUM4RTdCODA5OTVEQ0QzRDA0QTVGNDdFRjMwRDcyNUVCNjE1
-OEE3QTMyRUMxN0Q0OTcwQTExNTk0NTVCMjMwNzU3NzREQkEKCjk1Q0YwREY4RjE1RkNCNEFB
-REU4MEM4RDBDOTI3NjI1OTc0NjFBN0IwNDM4NEFDMjU1NjQ4NkIzQTUyMUI0NDcxODkxMTA4
-M0IwNjIyNAoKM0JEMUQ1NEE0QzhDQUI0M0QyMDdGQTQ2NjFBQUM3Q0Y0QTBBNDIxQzAxMTEx
-QTAyQUVBQTNBOThFQUYzOUIxNTI5OEVCNzVFMTZDM0Y2Cgo3QkUwODk0OEYwMTZDOTIyRUY3
-NDg5QjMzNjk4MTc3ODBDN0ZCQTE3MTJCOEYxMjYwRUZFMDJGMEE3RjExMkREMEU4NUM2MjAy
-NkNGNjMKCkMzMDYzM0YxQzU1ODQzQUI3RUJDQzM4RjM4RTI1MTdFMzVEMjU3RDcyMjBCRkY1
-QkUyQzZDQ0UzNEJCNzNFQzIyNUNBRDE4MkU3MDJCMwoKQzAzNzQwRDU1OERGQ0JDNUZDRUQz
-REIxMEFFQzdBRjFFNkFFODRCNTRENUQ0Q0E3OUY1NkRENjkwREFGQzVBRTdGOTM4M0VDMjIz
-MkQzCgo0QkJEMkIxMjVDQjc4RTJCMjAxMjcxMkIzQzUxODQ5ODY3NjY1Qzk4Q0EyNUYzRTZC
-OUUwMkVDODlCNUIzNzZENzkwNUY3MzAyQ0Q2RTIKCjhDMzM0NzBDMEIzNDMxNjBCRjBGMUIz
-QTlDQTBBNDdCNjA2NUI2NTM3QUZFQkMxQ0JDRUY3OTUwODNDQkM5OENFQUY5QTYwRDlDRUY4
-RQoKRTZGNDg3Q0VDRDg4NDg0QkI0RjE0OTgwN0NDNEI4OTZGNTExQzJDNTMwRUYyOTJBQTUw
-QTlENUU1NUM5MzUyMDkzMDBBRTYzQTE1QTdECgo3RkREMTE3OUIyRjU3NTI1QjcwRjZFRjQw
-MDM2QkQ2NkI2QzI2QTk5ODA3N0Q1QkI1MEJCQzEyMkI4MDZENDVBQzI0OEI1MkNBQTZFNEYK
-CkI5RTAzOUUzMEJFQjc4Q0RBRERFODEwNTM0NzUxRjdBMzIzNTZBNTEwNjVDREU1NDI0NzUw
-Q0VBNTc5RDAzNEE2QzZDQkNCQTJCMjYzOAoKODlCNzY3ODc5REFBQTk5MjNGMEZBNzY5QURC
-NDc0MzczQ0Y4RUFFRTdDQjQ2NUY4NTlERkUxRTcwMDg1RjVGQzk0NkMzMTM1NEYxRTI0Cgo0
-RjMxQzdFOUI1Rjc5MDNEOTJENzM4ODZBQ0FFNzY2NkYyQ0REMUNFM0FBRjY3MDc5REM0RTkx
-OTExOTIzMERBNkIzNjlBQURERjI0MEMKCkU5MERCQ0Q4QUIzOTcyQ0UwOUU1NzEwQjk1OTYz
-QzZBNjJFRTU2RTA5MTY0RUZBNzdBQ0E3RTBFQzVGQ0VGNEQzN0EyREJDNTRBOTc4MwoKREI5
-RTIxMDQ1ODYwRDU5MzIxNzQzNTIyQzdCREQxNEYwNzNERDU1QjYxM0Y3RjE1MDY1RUY5NzQ1
-NkQxQzkzMEU2QjhGQjVEOUVDNDRCCgoxMTEwQUMwNzU0NDM0NTlFRjEwQzQ4RUY4RTRGQUM0
-NDkzQkU5NDlCNzVFRDBFQkJDQ0IwM0UwOTExNDRDMThGMUVBMDIzOUY5MEZENzEKCkUyNEIy
-QzA2QUYxM0JCRERDRDU4Q0VFNEM1QTI5MjZDODczMDk5RDE4NzIxOUQwNjdGRTcyN0I2MUMx
-ODU5NzE2QzNERjA3Q0YxNENFNQoKN0Q2QTc5MjVFMzI5ODQwRDY4RjBBRDYxREIzRkVGOTFC
-MjBEQTQxRUI2RjI4MzUyQTlDNDlGN0ExNDFDNkY0MzA1NkE2Q0ZDMjU0RTRBCgo0N0EzRjk2
-N0FGOTcxNEY1MjQ1OUM1MDM5Q0UxMDU3OTU2MTIxNTU1NzZCRTA4MDcwMUE3N0YwMDI2RkRE
-QjJEQTVCN0Y4MkQxQ0FDMzIKCkM0RUY2MDI2ODg3MDU2NkE2QzNDQ0IyRkNDRjBFMTFBQjYw
-RkQ2NDREQUNBNjk2ODk1RkZBMkNGNzIyNzBDMTkwRjQ4MkVBRTU3NTNCNQoKQkZDRDFBRDZF
-MkU4QjEwNTM1REEwMTI5NTREMDg1QzlBMTRERTk5ODk4NUUwOEYxNzQ0NkQ4MTU5REY2MUUw
-Q0RBNjQzNTE0N0Q0QjZECgo4QTJEMkIxMTVGNDlEMkUxMEFEREQ0RUI2NkNBNDIxNjFBNUU5
-MDA1QTczNkQ5NTQyNDRBQjNENjUyMDc0MUNGMUUzQUM2MzkzMEY0MEIKCjMwNDhGNzgwMUUx
-OEFGRTU1N0RGQkY1MEM2RTJDMTBENEYyODVGMDVCMkMyQzU3NEQzMjdDNDNBOTE1MDFFNkFD
-QTQ1MDQ4QzBEQkNDRQoKRTk2NkMyOEFERTc0RTQ2MUJGRjFDRjU4NEY0MDZFMzJCQTQ3M0Uw
-NzQyQjQzMjlBNzY2NjNEOTJCNjgwRTgwQTRCQUVDQUNDQTgzN0ExCgo4Qzk4RDg4RjEyMDM5
-RDgwRTZBOEI3QjBCMjA2QkZGNjJCMDczQUI1OTYxQkVFNDVEQUFEQzU0OTMxOTM3ODBEQTgx
-NzkyQkY0RTc2QjAKCkE1NTQyRTVDOTczOTE5RDBFRTFEQTFERTVBNUZBMjY5ODYyQkIwRDQ2
-OTQ2NTI4NDlCNjEyNjgxQ0RDQzc1MDVDQUM5NUI4RkQ3MkUyNgoKNTFCN0U0Qzk1NTYwODA2
-MEZEMUI1RTRGOEFCOEFCQ0E2ODA5RkZFMTUxMjAzQTVDQTkwNTg0OUY2MjlCREREMTQ4OTlB
-OUJCRTNCMTc1Cgo4QUZEQkZCRDgyRUNBNUIzNUYyQzJCMzVENUMyNjdFODJFMDA5Q0REQzZC
-RTM1RTk5RTc5MThBNjlGMjhEMUI3NzM4QjkzOTE2RkI3QkUKCkNBQ0I4MjcyN0UyNjM0NTNG
-NDFEMUNBRTVGMzhCNkMzNzA5RjAwREU0OTU3MzEzNTU1M0RFRjc2OTlGQTZGOTY0MTZBRDU2
-N0Q5NzFCMwoKMTg5MzcxNEEwOUI1QjM1NkQ0NDc4MzM5M0ZBMURGN0VDNkZDMzNGRTUwMTg0
-NTRFQkJENUIyQUNGNkFBNjA4MDU2NUZDRTY3NEYzREExCgpEQkQ3N0RBQkYwREM2QjM0RTE5
-NDlCQTJDMDEwQzU0ODEwMDlEQTQzMzdGNzM4M0QyNjlERUQ3OTcxMUEwOEU3ODcyMjhFMDlG
-MEMzREUKCjk4QzBFRjgyNzE1QzRGQUJGQkM3NjA3NzVCRkQxQ0VDN0NDQzgxNjMzMzEzNDFB
-N0QwODIwOUQzRURFNDVENzhBQjJBMDVENTcyNkUyQgoKRDY2OTA0M0UwMkFGMjc0Mzg1RTE2
-MTNGNkE0MkU3RTlCOTRCNzY2MkE1OTA0QzI2NjlDODI3MjcyQUJDOTZBQkUzNzZERjcwOTRF
-RDJDCgoyMUVDNTAxQ0MzMEU2MzFCMkNEM0IwRjRCQUI4QzNDRjIwMjUxMzBBOTlCOTNDNzA0
-REYyRjAxNUE0Njg3NEI1QkNDOEU2NTYxOUZBNTAKCjBEMUFFMkJDQkQ0QzI3RjkyNDQ3Q0Q5
-RTQyM0VDNUI2N0UzNURGMDRDRTMwQUNENjYyOEExM0ZBMjBDMTRCNTE4REQwMzAxRDNCRUFE
-QQoKMEE5QzE0QjhEQ0IyNzgxNzBDOTdFMTA3QjRCQURCQTFCMjVCMTdGMjY4RjhCNTJCODk1
-NzU2Mjc0NzhFMjhFRjU5RjJEODU2QzhDQUE2CgowMzc2QzUzRTk1QkE4NTRGQzA1OUVBOTM4
-NTc1Mjc2Q0U0NzE2QjdBMTlDRDk4MDk5OEFBQTc5RUM4RUQ1N0Q1NkVFMkVBODBEMkFCN0MK
-CjlCMTgxMDBEQTJBN0VGQTcwRUQ0MEEzMkFCMjkyMTI5RDg5N0FEQ0QxQ0VCRjZCMzBCQjc2
-OEFDQUJBQ0M0ODBBRDZCRjFFNzAxRTMzMgoKQjFBOTc0NkNFREREMTI3NDQxQzY5NUMzQTQy
-NEE2REQ4NEJGNjg0QTkwQjAyN0I2OEVGQkRFQzk4QUE1QjlDRDk3RkFGQUFBRkMxOTVECgpE
-QzU0Njg4NzZCMjhGNTZFMkYzQUFCNzREOTczNjY0NDFCMjhDQkFDMEQzMjhFQjhGRDk4REYw
-NkU5OTgwRTIxQ0E3RjYyMzQ1RjAwRDMKCjhDQTgyQTFDQkZFOTU0Q0Y4QzVDNzcwMTdBNUU1
-Q0I2RUNFRDkwMjIyQjVCMTVENUQ3MzEwQjNFMjRBOThBNjQ2NDRFRUFFMEIwQ0IyMgoKQkRD
-N0ZDQzk4M0NBOTQxMDRDM0FGQUU3MUE3NUEzNTEwQ0VEMUMyMTAzNzlFMjg5QzcyMUJENEVG
-RjgyNjczNTY1Mjc1ODI2QTQxRUE1CgozMDA4QkQ2QzE4ODJFOUM4MjM0NkRBOTFFOEREQkYw
-OTJFNzhCRkMwMDlBMEJDQjAwOTdFOTc3ODgxQkYzQzgxQkI2REUyNzg0QUZFRjkKCkJCMEZF
-NTJDQTkxQ0IxRUJCRjAxMDI0QjFFRjk0MTE0NDIyOUIwMTI3NTk5Mjg0RkJGNkVBNzgwOUJG
-MzZGQUJBQ0ZBQkUzRkJBNDFBNgoKQ0NERUVBMUZGNjY1NjgwNUNEOTQ1NDM5RTM2Rjc3MURC
-RjU2Rjg1QUM2Qzk3NTlGRDc3NDFGQ0EzOENDMzYyODExOTYyODgyNDI4QTlBCgoyOUY5RTc4
-ODMxMkI2NzUxRTRDQzZBRjE1Q0I1MTdFOEYxN0EzMjBCQTQzMzVENEM4NjlDNzZGQ0FFN0JE
-RTU5MzM0QzcyQjU3OEIwNTUKCkFGNTg1MEQxOTE5OUYyNjM4OEI0NkQ5RTlGMjk0MERBQzNE
-OUE0M0Y0NUM1Rjc2NDNDQkEyRDM5MTY3MjUwOTEwMkE4ODNBQURCOTk4RAoKMUNCQ0I4ODhE
-NUJCNzFENzQwNTgyRjdCMkJFMUVERTdENkVGNEE5MTREREY1MzY4RDU0N0RBREEyQkU1NTk3
-MTYxOUFGRThEM0E2NzI4Cgo4QzhGMEE3RkU5RUM0NEU0RTAxNjA5MUY3QjE0Rjc5RTgxQTRD
-RDhDMjU5OUY2QUU3NzYxMzZEMzgyMjJBRjFGNjFFMThCRDhCRDZENkQKCjIzMTkxRTJEM0FB
-NjMyMTdDOTEzQzhENjJBMDk0MDUxNkU3MDk5NkEzMDQ3MzYyMUI4QTI1NzQ2NUQxRTZCMjk2
-NkJBRDhCNDQ3RkE4RAoKOEUyRUMyQkUxNUNGQUM5NjM3QTVCRTE5OEQyRUZFNkQ4QzIwNENE
-REY4NTM5OUI5OENBNjkxMUM5QzhFRDVGMjQ4RjA2Q0M4RTlDMjdCCgo2RUJDQ0M4QjJFNTRD
-NEQxNUNFNDZBNkJGMzgxMkNCREQ2N0ZGRTJDODMzNzBFRTc5MkZCMTdDNjNDNDIyMkZCNUVB
-NUMzNjNDMjk2QzQKCkY5RDE3NEU2MkEzRThCNkI3RkUzNUJGNDY2M0UzRDgzRDkyMTQ4Njkw
-OTQ0MUYxRkRDOTU5OTBDOTE4OTgzNzA5NDQ1NUJGQUQ5ODdEOQoKMjIwRTQ0Q0JGRjJFNDk2
-OEUzRDdEMUQ3N0FGQ0U2Nzk2NkI4RTlGRDExRTEzQTY2REU2MUM1RjIzREQwMEM2QzQ4QUUw
-QUQ3REU0REVBCgowQkJCMkM2MDRFNDQzRkI4ODQ0OEZCNkZDNjFEOEFFRUJENTJDNDkzN0Y1
-RDI4RjYxMUE3NThDMTExRDFENTdDQkMyNjJEQkQwQkM4REYKCkExMUUyOTlDMjgyNDBFREE2
-NDNDQzA2QTEwMUZDMEU0NUEzNTE4RTM0RjhCRUJDNDk2NERENUE4NDY3OUYxRTRDMEEyOTI4
-NEZEMkM5QQoKODdFN0RDMEQxRjNEQkY2OEVCMTc3QzlDMUNENjc4MUEyMzM3MkQzRkJFNjU1
-Q0M0REZFQUM1MTM0REVFRENDNkYzMzAxNzY3NjVENzkxCgpENDk1QUNFRThDQjZGQzE1RUQ5
-MTNBMjg3MDZCNTM4RDlGOTdFOTg2QkM2MjhERUVCMUVGQzgyMDkzNkU0MzFCRDVEMDkxNEMx
-RTA4QUYKCkQxNzk1NzE2MDAzNTA0ODhFNDM0MkY3Mjc3Rjc4OUE3QkRCOTc0QTNEMDZERDlB
-Q0Y5QkM2NDVGRDExQzI1M0E5Mjc3M0Y5NUNERjRBRgoKOTExQTdERDgxMEE3MTc2MTdDRUY0
-MjJGN0UyMDc5Q0EzNUQ3OTk2RDVENTJBNTBGMjIwRTlCMjZBNjVBMEExN0I3REE0QTg2NEZD
-QzJDCgpEREY1Q0MyNkZFMUU1NTFBMjAyRjYyNTk0MUJBQTgwOTNBNDBFNDJGRUZGQjE3RDAy
-NjIyNzdBQjlBOUU0MTcyM0FCQzczODE3RkFCNzMKCkE3QjU5RTMwNkMxNDhFMkU5ODY1RENB
-MERFMEEwM0U0NkVBNjkzOEI1M0UwMzA2OTRGMDJGMUNFMEY4QUZGN0E4OUZBRTMzQzhDN0VB
-NAoKNzJBQzNCQTg2ODBBQzA2RTYxQzYwMDI2RjFDNTg5RTgzODFCM0E1NEE4NjE1NTE1NkQy
-MDMzMkZGMkU1NTczNzU1RjBCOTgwOTY3QkI2CgpCRTg2QTg1OEI2RUM0ODY4NjJCQTcwMkFE
-MTE3MTg1MDgxQjIyQTAzNTlDODExQ0VGQ0U5NzE4QUMyQzM1MTJBNjVBQzYzMjgxQkMwMTgK
-Cjg4ODQ5RDk5NkQ4RTFBQTEyMDAyNzMyQ0RFRjBCOENGMzkxMUY3MUQ5MDVENTJEOUJFRUNF
-Q0ZBNEEyREY4MjkwQzhBNDcwMjFBNkZBMQoKMTQ2RkYzOEU2NDI0RTU4OEI0QjRFMTAwMzFG
-NjBDNTEyREYwODJGMDlCNTM5QzE4RDA4RjE4QTQyMzlGQTlCNjQ4NDhDRTMxOEIwRjlDCgpC
-OUY2QTI4RDZCRjFFNzg4QzE2RDZBN0ZCOTIwMTY0MjIwNjA0NEY0NzBEMkFFQzM1REU4NTYy
-QzE3REQ3RjUyMkFCNzMzRTc5NkI4NzAKCjRFMDU0ODVGODY1MzU1RTU1RUVFQ0Y2MEU0QTJC
-NEU0Q0ZBOEU5ODIyNjg1Qzg3QTYwNTYyQUMxNDU5RTI0NkM3REExN0YxNzRFOUUwNwoKMjEw
-MTk3NTE0NEVFNEYyNENERTZFRDkyNTRGQjhBREVCNDE1Rjg5NUQzQTcxQzY4OTcyNjI4QjM5
-QTA1ODgwM0RCODVGMDdCQzQ5MkE0Cgo3MjI4M0REM0QyN0RCMjM1OUY4ODFFMTAzODMyNEIz
-OEZGN0M0RUVGOTFFRjFBMDBCNzQxQjUxMTU4MTk5NzM2NDczOTg0RDIwODAwOTkKCkNFNzM3
-QjAzMzI1RjM5RDc3RUUyRDVFN0JCRjEzMDEyMDdGRUI5NjNFREQ4OEI1MkVBRTQ5MjBBMENC
-NzU4RkNEQ0FEMDQxMTIwMEE0NgoKNDhFNjU3QzI2QTQxRTc1NzdEN0U4NzZBNkE5REUxNkIy
-ODc5QTZDQzZEQkY4OTQwQkE0Q0Y4NjE1Nzk1ODZGN0FCMjM4MUYxRDI0NDA0Cgo5MEJGRDNG
-RjY3NDdGQTkzRjNERUQ0NjcxQUVDREYxQzQwMzQ0RTc1QkM3NDFDQTc4QTIwNzkxMTRDN0E5
-NEFEQzU2MDI2NEU3OTQ2NEEKCjJEREJBNEQ0RTc4NDhBMjU1M0ZERTFDQjUxRjUxRjlFNkYx
-MEFCMUFDNEFDNEQyRkRGNUQ0OTJBQjlCOEI3MUM2ODM0RjBEQzNCMjM5QgoKRTM4NjIxNzg1
-QzYzREY2MDM4Qjc0RDdENTM3QkNCNDExNDdFQTg1N0JCREJCQTQwRUE1NTUwRUE4NTkzNTQ1
-NkQ0QkM5NDVDN0Y1NkVFCgpEMzc1RTIyMDg2Q0FDQTc1QjNFMTk5MTI1MTE0RUU5RkE2NTZG
-RjVFOTAyOTU2NkE3MkU5QkE0QzJEQjVCODNBNUNBNkNGMkUxMzY4QjkKCkI4QjJEMEIxRTJF
-RDZFRThCNkVDNTZFMzUxODAxOUQ5MkI2QzA2MkE5MkY3N0MwOUNBMTkyRTFFNTI3NjI2RUVD
-NzhFNTUzODc2RUZBQQoKMENERjE0RUFGOTI1MTJDNzFGRjZGMDBCQkM2M0Q4QkM1MDkzQzBD
-MzQzQjkyN0E0RjIzM0MwQTFFRDc5NjE0MjZEN0IwMjk2Njk4RjcyCgo1MUMwNTFFM0YyODIz
-MUZEMzAyMTQ4NUUzRDgyMjhDODYyOTkwNjRBQjlEQUQyRTYzRTU5Qjk5NUE0QzZGQTBGNDUz
-MTE0RTgzMjMyRjUKCjk4Mjg2NkQxNkVBMUYzNTQzN0M2NDgwN0Y4QTcyRkE4RENEQTREQzMz
-QjMxODQwRURFMjJDQzgwRjlDMzJGMDhGMTE2ODNFRTY5NjIwNAoKNDU3MjgwQjM5QTI4OTFB
-Q0UzNDMzQ0NFQTgwNDY1RjBDMDdCRTI3MTE1NDczRkJCNDExQ0NFQjhFM0U1MzJFODEyNUFF
-QTAwMjZDRTRECgo5RjUwNTREMjk2OTc0RjJEMEE5M0QyRTY1MjZFODhDMjY2QTU0RTkzNzA5
-NzU3MkYwM0I2NkREN0YxOTM5QTgyQThGNDc3NUVBQjFDQjIKCjQ3RTlERkVBRTAwQzhBODU5
-RjM5MTAzQjE0OUNBMzNCQzZGOTMyMTAzNzM2RTcyNzQyMDIwMUYzRDM4OTU5QUJBRUQwOUQ5
-RDBCQTE3MQoKRjE2MzQ0QTQ5MzIwMDYyRDRCMEMzMEI4MjQzNEE2NDgyRTIzQjA0NTVFODIy
-MzU4Qzc2OTQxRTJFQzZBOEY1NzQ3NTU1NTFBNzcxNzg2CgowNzAxMUZBMkY0RDBGRkE3QUJD
-QTY0MjA1QjQzMDFDQzhDNDdCMUNEMDM1OTQ3QkFDMDBDMjZDMTI1NUVDMDFBNkQ5MEM1OEY3
-NjBFQkUKCjdEN0I0MERCMjVFOTc4Q0Q3MkNEQjhDQ0QxMzI1NUQ1REVCODY3MDQzQUMyMjFD
-RDMyRDc4RjYwRjhEOUFDRkM5NTM0MDU0NkREN0I3RQoKQTZDQ0ZBNDgxMDUyQzU4QkI0MUIz
-NUREMDNCOEQxQUNDOUJEOEJDMEE4QzgwQ0E3MkQ5NjE3QUE2QTE1MTcxNTI2MzU3NEY5NjY1
-RDYyCgo5OTg4MThENzU1Q0Q1MEEyRDkyREY5NjZDMDVEMjhFQTAzRkI1QUU1NzA5QjkzNDk4
-RUY2NkVBMkQ5NjY4MTAwM0U5RjMzMTYyMDBBMTIKCkRBOTY5NjRENkIwQkI0MjA3N0E1MzA2
-QjcxM0M0NjM0OUMxOEVFNDIyOEVDMUE5QzI5QzEwQkE1ODIxOERGNTg3QkQ1MzRGMDhDMDQ0
-RAoKNkYwOUE1RjEwMzY0OEJFRjA2MzM3RDM4MzQ3MDlBNjk4MThGM0Q2MjM0QUNDQjRBMDY4
-Rjk2MDQ4ODE5RDFEN0EwMjNBNTY5MDNGODk0CgpEMzc4MjgxQkZBMjMzOUZFMUE3NDgzQjcy
-QkNBNTJGNjMwNUE3NEExNDIxMTYyQkJBMTI1MzYzNEVCNzQ1MDE0OURGMkZFM0UxMEM2RkEK
-CjEyMzVDMjRGODJEQUNCREFGMTE5ODZEMzY1NzA2N0FDRTFBOEUyREUxMDRFQjRFMTAxQjY0
-OTFGQkQ2N0VDNzA1NTFEQTU2OTRCRDEyMgoKRTM1NDQzREYxNjREMEJBQzQxM0REM0RDMTc4
-N0FCOTJGREVCRjA4MDY5NDIxNjNCMjZFQjNEMTQyQjAzRUVGMzU4MUNEM0MzMkU1M0MzCgo1
-NzIwNUFBNTIxNEQ3MjNFNENFNjkzOUE5QTA5MzMyOUM1MzU2MjFBRDBFOTAzNDExRjc1NUU3
-MTUzNkM3RTM3QTYzQjk5NTJBOUFCRTkKCkU4OTJBQ0RDMjQ3MTZFQzkzNjYxQkI5RjVBMzI3
-QUQwOTg0NjREOTJBMTgwNDc1RUFFNUYyMDlGMEVCREZENzk5RjdFOTgyN0Y2NTdGNAoKOEQz
-OTc4N0FCRDQ5NjQ5MUM4ODkzRTFDMDYzM0U1QUMyRTRGNzVBNUE5NjBDRDUzNUYwRkM5NkU4
-RjRGRTU1NTc5NUM5NjA1NUUwNUY3CgpBMDVFODJGNTM3NjUxMzQ1MjU5MTYxOEZCQjk0ODYw
-RDkwQzcwMUJDODUyNUFGOUMxOTY3RDk3Qjg1M0JBNEVENDhEMDk1RTk5NUY3N0IKCjE0MEM0
-RTE1NjlBRTQ0REQxMkFBQkM2ODgwMUMwMTQ5ODdGODhEQ0YyQjAxOTFBRUFCQ0VEOTBDQUMy
-NzVCRUE2MTczODdEMEY3QTFBRQoKNThGQ0RCQUI1RDc1MkQzMThFQTE0ODJCRjU4MEY3RUFG
-RDg4MkI2ODY0QkYwM0NCMkU0RDU5QzE3OUEwMTQ2QzFCQkM3MDFGNzhCNzE1Cgo1RjMyMjJB
-RDBDMUU3Njg2ODEwNkRDQ0EwRDVEQjYwMkQ4M0NEMkRDODcwRUU2RTQxRjU2MTA4MzVCOEYy
-RkUyRUM3MzBFRjlERTBCQkIKCkZFRjQzMDhBOUFBMDM5MkJGMERGMUM5MkNERTRGNEFERTk1
-REEwRDEzOTUxNDc2NTU5Q0QzQjRCN0RFQTE0REY0NDU5N0E5OTY5QkVCNQoKMzNEODdDOEMx
-OTUxODIxOUM2NDc2N0RERkE1RkFDRjE3M0Q2NENDRjk2QTM2Rjk2MkQ1M0VFMTU4MEI4MjNB
-RkNGOUU2RTI5MDQ1NEZECgoxQzZDMzFDNDVEREU0MjIwRjA0RjNEODUzNDNBMkIzNEVGRUE1
-MjkzNjRENkNGREU1OEE1RjIyNUY3RUY1MDc2RURDMjIzNTBGODYxNzYKCjYwREM4RjlENzJF
-N0VCODI2QTVFODNDRDFCMkYwREFDREYwMTk1QzY3RDRFRTcyNjg3MDExMUYxQTg3NjZENzNG
-RkM4OTQ0MDA0NjQyMQoKOTU4NDc5RDU2RkQwQzc4Q0E1RUE3ODAxRUI2NDVFNTkzMjI5MDMx
-ODIxQUFDNDY2NEI1QzgxNEE4OEY1OERDQkQxQ0Q0NEY4MzM2NEMyCgoyRkI5RUJFRURBMDlG
-OTc1Mzk4NDNGNTREQjdGRkQ0QUIzMjE2REY2QUMzMDVGNUQ4MEVDNjMyNTBDMzNFNDAzMzg1
-QUUwMDlCNUFGMUYKCjVEODMxNTQ5QjJBREQ1RUQ5NDZBNjk0MDkxRDE0MEYyQzAyNEZFQTIy
-QkVBMzY1RTdFRjdGRjZGNjBFNUYzQjM3NjlCNjY3RDJFRTVBMwoKMzU4REQ1NjAyQkNFNjE5
-NkNGMzJFQjAyNzA5OTBGQTA1RDk1MjM3MTJBQkM4RDhEMjRCNURCQzc3RjA1RjVBRjc0QzE3
-NEQzNzUwNjFFCgpBNUY5N0RBMTJGRDM0MjIzRDg0RDE0QjU0N0VCNDlCNDBDQUNFMTc1NUE0
-QjA5QUFBRTFBQzMxQzVGNjJCNTc5MTFEQTgxQkQyQzNDNDcKCkZBRENEMjIxRDlEMDRDMkI0
-OTQ3RTY2NUEyQjNEMkEyMDdEQ0IzNTIxMzM3NEMxMDNBOTEwREY4NTA1QUNFQ0IxQ0Q4MzQ5
-Q0YxN0FDQgoKNUVBNDYzRjA0MEVENzY0OUM3MThDRUMyMUM2QzgyQkNBMzBFRTZDRUI3OUMw
-QTZGMUZEQkUxNkJBMDlDRkFDMzRGNzMzM0VEMUQxODlDCgoxQzBEODcyRkQzMTgyRjMyOUFB
-RTNERjcyQkEwQTBDREJFMjY0REFCMUFBODE5OUNGNUJDMTU2NzhEQjIxNTY1NzkyNUM2OURF
-MDUzMjcKCjEwMjk3MDEwOEI0QTVDNjdDMjgwRkQ2QzUwRjczMUU4OTY3MkJCQTc5QUVFREQz
-RTYyMzc0NUU1NzY0NTJFQjZDMTU3MzNFQzYyQjNDOAoKRDNENTZENkZBMThCNTBBMjFGNkYz
-MThDMkMzNkI1MTc4RTJEN0U0MzhENjU5MERBMUM4RkNCRkRFMTc3QUQ0OEU2NjczRTFEQUQ3
-QjYwCgpGNDQzOEYxQUIzNjBGMkQ0MEYxQTMwQTBGODdEN0JBRjUzRTZFRTc4QkJGNUI1QTk1
-NjVDQUJBRDdFODI1RDAzODQ3NDMwQzY0MjJFMzkKCjlGMDg1ODAxOUFFQjMwNTZGMjI5NEVF
-OTZFNEU5RjE4MkVDNDVGRkM0RUE5OEUwRDQ5OTk4N0ZGMjE4REM5NUQwNTFFQjMwRDY1QjA4
-OAoKOUNBQ0E2RUM3Q0Q4MzExOEFGMjFFNEQ3N0UyQTI1QjIxRjcyMTEwNTk2MDAyNTIxMzEz
-MUJCOUUwQkNFRkQ4REQ3OUVEMUJDMzlCMEI5CgowN0E0RUQ0NTZBOUM1MURERTM0MzAwMTBF
-QzExRDM5QTUzMTc0NTFCMzc3N0NDNjBDQTlFMDJBNTBEM0Y2NjA1NERENjY4RDAxNkNENDcK
-CkM4MEVERUZENEEyQUJFODUwRDQzMjIyNDNGQUU1QjE2OUNERDA5QkQyNTNGM0YyNEFCMEI2
-OUIyREJFOUE3OUU3NkNEMzkzQjcxQjk0MgoKNjc4ODNFOTMwNkU0QUMyNUZDN0M5QkY2NkRD
-Njg1QjUxMzQ4QjAzODJGOTcxMjQyQTc2NDc1ODQzNzY3NUQ3MDZGREZENkMxNEMwRjBECgpE
-RUQwQTVBQUNDMUEyM0NGMTFBQ0QyRjNCMzA5OEIzRDJCNEYwRDM0QjA0NUQ3OEY5ODg3NEVC
-MkNDQjI1MTE1Q0M0NzY3MkM5NzA4NDQKCjI0QzY1QTY4QUZEQTk3N0RCQTlFNTE5RjI4MEMz
-MjQ1QUY4RTg5RDBBM0FFRjMzNDQ4MDA1NkExRjIwM0UxQkZBMDIwOEJBQkQ5QkJGNQoKMDQy
-M0U1NjlGNDlCRjRBQUI0NDI1RTlEN0MzQzFGRjlEQ0Y2RTMyRTUzRjg4MUYyRjg4MEUxQzAz
-MzZEOTUzQTBEMDY4QjdEQTMzRTE2CgozRTM1REEwN0I5QjVBM0I1QjlDRDI2NkI2MUUxRTQ0
-MjMzMTFBMDM3MDk4NDAzMDlGRkREREZGMEQwMDM1RTJENEY1NzkzRTZFOTE2RjMKCkRCQkRF
-QThFODZDOEM3MzgxQzE2Q0M2OTAxQkE2QzBEMDZERDBGRjY0M0FFNkI1OUNBNTUwNjc5M0Qy
-QjAxMkExOUNERTdBMEQ4QjgxQwoKMkZBQ0VBQzMyQkIyMzgwQzExNUY5QTUwRkVGMkU2MEFG
-NzU5MEU0MjEzODU5OUY2RTc2Mzc5MDJCMTA1NzFDNDE1OUVFQTdCMDU4RTRECgo3MzkyNTMx
-REQxQjJBM0IxQTVCQjE3ODQ1NENGMzY1QUVFNDk5N0RFODI2N0RBQjIzOUE4RERGN0FCNjlG
-OTJDRTgwNUI1NkMzMzY4NjAKCkMyNjUyOUFDNkZCOTg3NDg4Qjg0NDk1Nzg3MEI0MEUyQThC
-M0IyOUZDM0ZDQUVGMEIzQTZDMDI1NzBGODY2MUY0RTRFNDU1QUZBMUFFMgoKNTIzMTZCRUNC
-MkM4OEZEMzRDQ0Q2RjZFRUM2QjcwM0ZCRkZGNUJEQzhCQUYwNTZFNTU5MEYxNkJGOTM1NjQ3
-MjI3NDFGRkYzNDRDQzhDCgo4NkExREU4QUZBQTRFMkY1OEI1RkQ5MTZEMTYzRDI4NzMyNzU1
-M0VDMTAxMjE4M0M0NkRDRDkyMDAwMTEwNTNFRDREREY3NzQwMzZDMUMKCjVEQ0Y5NThCOEUw
-OUI4NkNBRTI0RTQ0QjRBQkNDQjA1RENBQ0EwQ0Y0QjgxOTk4RkI3M0U0RTQzNTgyRDJGMjA0
-Q0E4RDk3ODgyREZDRQoKRUVFRjY0M0FBMzlCNUQ0QzlFQjNFQzM4ODZBOUQ1NEU2QURDQzI1
-NDlFNTNBRUJBNzBDQTRDRkFCNDY1RUMwRDMzNkQxNTg3MEEyNzM4Cgo3MjgxMEMyNEMwNzlB
-QUI4OTNBQzUzQzNBMkI0MkYzOUE0OTM1RTEwRjFCM0YyOTlFOUJCMzQ4NkQwMEVENjZBMThG
-MDNCQTJEQ0JCMDQKCjMwREVDOEQ0MEQwMDc3Njg2Q0NCRTUyRkM1NTBFQTk2REExMDIyM0Qx
-RjFGMDk4NDQ5NjQzMzY0NjE1QUU5OEJDMjZEREFGMkQwMjUwOAoKRjY2QUM4MUM3ODE2MjVB
-MjcyQkM4MzYxMDY0MjJGQkMzREE0QUMxQ0JENzc1RTRBQzEzMzgyREM0OUZBNTQ0NDVEODJF
-NkExNkJBRjgxCgo0MDM1QkQyQjBDOUY3RTVGQ0RENTBFM0I4QkUwRUNFRTM5QzVCOTgzREZF
-ODQ2NDUzOTJDNDBFQUZDQUFFMDdDMTBFMjA5RkQyMjgzODAKCjVDQUQ3Qzk4OUJERUUyQjMy
-ODdEQjZENzI1ODM4NTEzRjNGOTVFNTBENUEwOUZDMzRDNjIyODVDMUFENzQzRjBDOUFENDg1
-ODYxNzQwRgoKNDYyQUQ0MjZENkNDOTc0MUNEMTREOTdERjc5NTMzMDMyMjE3RTIxM0M1NzJB
-RDlENkQyRTE3OUZCODc3RkM1Q0NFRTJEMTZEQzQwMTk1CgpFM0M4Nzc5QTg5QjMxNjRCQkVD
-MjA3RjQ0RkY2NjUxOEU0OENGOTZCQ0NGQUY3QTE4RjVGN0UwRkJCOTRFOEQ0RjVGNUE3NEU5
-NUYyOTkKCjEwMTYzMkI1QTI0RUUwNDExNzVBMDcyNUQzMENCOUQ2RDVDNTdDRjQxNDY1QkQ2
-M0VDQjhBNjVDNDAwNDQ1QjA5NUQxNEExREY3MjZFOQoKRTFGRTcyRjVFQjI1RjQyNjEzMjc4
-Mzk4NEZCQTJBQUU5NjUxMDY3MjhDOTlGNkIxRjdEN0JBRkNBQkU1NUYwOUM0NzZEQTEwRDI5
-NDhFCgo0Q0YwN0U2NUQ0Qjc4REE2RjlFOUJCQjU5MjFCRDJFNzUzQjhCNjkyQzMxNUZFQjJB
-MTBDQTExNzU4NEE2NUI2MTYyMzYwQ0ZERENFRjkKCjE3RUJDODYyMjI5RTJFQUE5MDk3QUVD
-RTlBNTkxRTlCQURGOEM2OUJDNUVDMDI2NzREMkI1OEI3QkM3RjVDRkRGRENDN0EzMzdCRTUy
-RgoKNkNFRkFBRkRFNUQxMzk0QTM5QjFDMTg4RjkxQURFMUVEOTQwRjUzOUQ1MzEwRUJCNUY3
-RTFCMTFFOEYyQjA1MjJGQzY3NkFFNzcyRDkwCgpGNTVDM0RCOTU4OTQ2NjcxN0YzQkIxQUU2
-MTYzQ0NERjc3QkMwRkQ2MUY4QkVDRTc0OTFDMTNGQTZFRDhGQUI5RTAyRTM5RTRCNENCQjYK
-CjNCMTVFNUNDRDQzODFCMTU4OTlGNjAxMjEwQTM3NkM2MjQ2NDg0QjA0NkI2RUU2MTlCNDM4
-NTNEN0FEMTMzRTQyNTI2NjJDNjE5MEUyMAoKNzZBRDg0NjE0NkEwM0NBQ0ExNDRDMDE4Qzkz
-N0ZEQkFDRENDNjgwOTk1MkZGRDk0QTZGOEUwQzgwNDJFRjA2MEY0MTgyRkU3NzlEQjAxCgpD
-RjhCODBGMzU0NTEyMkZGNkRCNDI5RTZFQUFEM0JBOUE5MjY3QTYyMjdEMzM3RDYwMjc0QUIz
-NjFDMDgyQTU1MUIwQjdBMzJFQTdDM0EKCjZFMzcxRUE2RUE5NDc5QjQ5MTFENTg0MTQzMkUy
-Rjc1QkZGMTA5OTI3Mjk1NUQ3ODY0RERCRjRDODhDMjlFMzNEQkEwQTkwQkZFMzNGNAoKNEVD
-NUM2MEEwNzUxNEU3OEY5QTcyRjgxMjdBM0E5RUMyQjU3NUJDREIyMzAyQjlBRDY1NDk4NjJD
-MkExRjRGQTk5MjVCNDg0RDJCMUQxCgoxRDVFNDYwMEQ5N0ExQzY0MjUxRDAwRjRERUIzN0JC
-OTY3MTgyMjZBOUVGRDZFNkIwN0U1ODA4RTM1RTFEMTAwNjVDNkFGNjRCRkRDQTUKCkQ0MTNB
-RTMxRkQ5MjkwNUVGNkExNTc1MzkwMjgzNzEyMEExRjk3OEVFMzQxOTEwNjY1QTE1RjREQkJE
-N0MwNjg4OEExMUEwQzY0MDY2MQoKMEFDQThFMDI1RDM4MUE4RkUyOTMyM0RBNjJBNkQ3MEU4
-RUQ0MzRBNDhGRkJEQzk2Q0M3NjM2NjQxNDdDM0RFRUM1ODQ0MDg1NEFERDQ0Cgo4QzRGMjUw
-MzNBQUMzNDAxNTg5OTgwQzk2OEIyQUUxODk2QjRDNDk1RUY3OThDQjQ2NDAzRjIxRTE5MThG
-MkQyNTE2NjZENDNEMDlDOUMKCjNGMUE2NUQwOEJDNTU3NzFFQjNFNkU0MDgyQjdGOUI0MjQ0
-MDc5NDI0MEIyNEFFQzlGNEI5RUNBMEQ3OTIxOUM1MzQwNTkxN0Q0ODEyMwoKNjk1ODhDMjMx
-MzNDOTg1OTg0RUM0RUExN0JCMEI4NUVFQTdGNjI5QkM5RTJFMTBBNUU4MjlFNzcwQjg4MTA3
-NzY3NzlBMzNBODMzQTRECgpERDI0REU2NEFCNkNENUEwODlBODJFN0YyOTNBMjQ4NzRDOEM0
-MTI1Q0U0NUU4NkNFMjYzQUNCQjEwOERFRjY4NTEzOTIwOEE1OTJBMjcKCjc3NEYzRDdCOTIy
-NTBGRUI0QTIyODgzQ0M0MDNDNEQ5N0RCQTY3RUQwQ0VGQjI0NjgwOUJBQUVGMjAxQTU0Rjky
-MUQzNEQyMjJDNTY4NQoKNzA5QURCRkM5NkE3Nzc0MDM3QUIyRjI5OTVCN0M5M0QyMzA4NjMx
-MjgxREVGREY2QTY1N0JBQjA5RTE5M0QwQzlGNzU5QjAzRjNGNTBCCgo0QTVGNEJGMzlGNDEx
-ODM0MkY1MTg2QzRFOURFMjlERkZDQjdBNkQ2M0UwQzMwNjc3N0JCOTI0MzY0OEExQkUyNTY2
-MEY5MTg0REY5REQKCjMyRDFGQkYxMUQwOUQwOUU3MTg5OTUzODI5MTc5MEY4ODlFNUM3RUEy
-MzI4RTVGRkQ4ODEzNEQzMzcxOUJGRTAwNDhCODBFODVDMDhBMAoKQkYwQzUxM0QzRkY3Qjg3
-MEE2N0U2RDIyQTA2QzdCRjE1RjgzMkYwMUZEOEE0MzUwNzRBQUExQTNCNDBCNEM0QkQzNzRD
-OEY1NjZDQzVBCgo2NTI3QTQ0N0IwQjIyNUMyMTZGRDE2RjRGNzQwMjE0MEQwOURBMTA4QzBG
-RjNEQTVCMjYwMTJCODNGMUQ3MDgzRkUyNzM0NDRERTk2MzkKCjA4OTY5NUJFMjAxNzYzMTgx
-OTk2MUE2MzU2M0RFOTRFQUFBNTAyNDYxQzEwNzY2QTdDQTk0NzRBNDFFOTI5N0FGOUM4ODBE
-Q0ExNkUwMAoKMUE5ODE3MEQ4RDYwOEI2MzI1RkU0MjY5OUNDQkZEOTM0Qjg3RDIzMTUwNDc5
-NjRGQkYxMUZBRDJGRDhBMjg5QzExNjA2QzI1RTk5MDIyCgo3MDdDMDNCMDk0NUM0MDc2NzdB
-NzEyNjM1QzNCNTBEN0ZGREQ3QTUyREM4NDlBQzkyNUQ3QTlERDYzNkFFQTk3NDk2NzhENkFC
-MjI3NEIKCjYxNzY1NDhFM0U3QzM0QkI2Q0YyODk4NDlFQjc3RjdFMTk3NjI5MTM3NUYwNEIz
-RkYzQUEwMTFGOUEwQjBBMEVDODE4M0E4MjU4MUJERgoKQkVBMUJFNEQ2QUM1NTZBRTgyODEy
-MTZFQTBBOUNERTc2NUU2ODBCQjRGQ0ZDMDc3MTk0Q0VCRkI3NkY2MEZDNERDMzdCNzdGQUQ3
-QzQ2Cgo0NzQxRTYzRTY3MzE1NzQzNUZCNURBQkQxNzAxOTgyODBBMTdGNDg2NEQ5MkVCMDQx
-MjE3NDQyN0VCN0I5Q0FFRkZEN0RBRjM0RDJENzUKCjU0OEQzNUU1NzgzRTU1NjBEQkJGNURC
-RjczNkUxQzEwRjI0QkU4M0Y2MEE0NzYxNUM0MjQ1QTc4Mzk1RTBBODNFRDBBNzc3REZFREQx
-NwoKMjVGRjU3MzQxNjc3ODRBMTc0MzIzOEZCQTU4OEZGOTMzRTRBQkU1NzNCRjE3RUJBQzAx
-MzIzMDlFNDU4N0QyNDJCQUU3MTZFMDkzODY2Cgo1NDA3Nzg0NDAwNTA4QTA1NTZDRTBFMjMz
-NDdDRUEyQkI1NTAwMzlFNjVFNDMzRjVFNTY5RDFCRkVCNDdDRDAwNjgyOTM5MjQ5NTk5MTEK
-CkIwMDY0MUE2OUVFNTBENkJBQ0FCMDU0NTJDNkExOTNDMDJDQzlCMzZCN0ZBMzEyQUI1MTc5
-NEE2MzlERDc4MUYxQzhCOUUxQzBBQTk5NQoKMzM5QzQ5NTU4OEQ4ODE1MzY2MTEyMEE5RUQ1
-MDAxMkE2NTZFRDBDOUZGNDgxNjM5QTUxRUEwQTAxMEIxNTYxRjkyQ0FFMTU0MEMzOEZGCgpE
-QjkzNzNBNUM4MzY0M0ExMzVCNjU3MUQ1MTI4N0EzMTYxNkY2QUYxMDVCRDE3QzlCNjRCNkEz
-MjVDODhGMzBFMTQ0RENCOUQxNjBGMUMKCjI2RTNERDY1QTZDM0RDMTU1MDUyRUJGRjUxQjUx
-MzgxRDAyMkFCMURGMUMyRjM0RENBREM2NTYxQTI1MUJBQ0EwQkExOEMzQjMyMEZBQwoKNTI3
-NUM3MEQxQjVFMTNENTcxOUE3QkQ3RDFFQUIzRUQzODJFREM1Q0YwNjJBMDYzQURBRURERDE1
-Mzg2QkFGRURGNjBCOTM1Rjk0OERFCgo3NTA2NEU5NDMyMkYwNTYzOTVFOTVGQjcwOTgwRUY4
-QzlFQ0QyN0IyMjJBNDk5MDg1OUEyQjhGQUM1MUYzREUxQUM0QkY3Njc3Q0VFMjYKCjAzMjY5
-REI0NDgzMTkyNTc3OTRCOUFENUU3MDg1MDVEMERBNzI4N0Q1MzBEREE5NTlFMDhDRDg0RkI5
-NzFCOTlCOEQxOTY4ODA2RTdCOAoKQjAxRjIyOEE0RTlBODkzNEU2NjFGNDAzQjYzMTY0QTg0
-NzEzQjkwMTI2OEMzMUE4MDYyQzAwNUIwMEU2Mzk4MUU5NTNGQTNFNkZBMEY0Cgo3OEU5RDBC
-M0REQ0FFQkIwQUEwRkFFNjU3QkUzMEFFQUMxOEJDRTdDODNDMkM2OEIwRTMyQ0JCMTU5Q0Ey
-NUI3OTkzMDQ3NzNCRjg5NDAKCjA1RkI4OTNDMUQ2Mjk4QTkxMUIyREYxNzE3QTFCOTJDQjdB
-MkVENzc3MDcwQjhFMjkzRUVGNEM3MDAwRTlFNDk2QTcwNzAwMEJBMUEyNAoKQkUwRjc4NEZB
-OThCQTU0MzU4NTg0NUIwOUQ4NTVDM0FFQTYyMjcxNDA4M0YwQjFGMDUwMUFFNzRBODQ5MzQ1
-Q0VFMTlFMkI3Q0Q2RDA3CgpFQTM2ODFGMDc3NzRGMEY4NDQyRTdFMzgwNDBFNkUyMTFENjkz
-OTQ0QTMwRTI3RDYyNDIxODFDMjYyNkFBQTRBOEY1NDEyMTVEQjE4NUQKCjU2Mzg0RUI5NEFC
-MEQ0RURCNDk2NTVENTVEQUI4OUY1MjY2MzA4ODg4NEQyNDk0N0NEQ0MwRkQ4MUEwOUFGMDQ1
-MEM2MEZDNjY1QzczNgoKNDlERUU0OTIyRTAwQzNFRTk0M0EwMUZCMDVGMjk4MzM2N0U2QkZD
-NEJDNDE4RDdBNTFFMTQ1MjdCRDBGNUEwQTk1NUM5NDI2RjBGRDU2CgowOEMwMEE0NjREMUFC
-NEI0Njk2OTU1ODYyNkFGNkFDRTJEOTlFQkVEOTMwNjI4NzIwQkRBRkRCNTlFODk0M0I3Qzk1
-OThGRjk0NzgyNjkKCjQ5RDU4NkFBRjE0RjE2OURGRThFQzlEQTQxNTgyRkY0ODMyRkYwMTY0
-MkJFRDFFRjI0NEQ0NkMzMDhENDY4NzgyMkFDQkMzREVCMkUxMQoKMzQ3NDczQTc0Q0ZGNUI1
-OEJBMjdEM0QzRDM2QUEzNTQzRjJEQ0EwNDFENDJCNjBEOEM5RDc0ODNGMTM5ODNCMkUzNzIw
-NzhFQkRBREJBCgoyNjVDNjdBMTIyNDNFNDlDMzUwOTYxOThCNTBEMUM1RDQ1QUFFRUE3MkU0
-QkM2RUM5MjMzOEUwMUNFQjg0OTFCNEI3MjY4MkMzNUFBRkYKCjkzNUY4RUE3NkM5NDJFRTRC
-QkIzMUM4RTQ1QjE3QjgyOTY4NkMyM0Q2OEY2NDQ0MkZBOTM1REVEMTc1Njg3QjVDMDQyODU3
-RUEwNzY1MQoKMzI0ODcxQjdFOEVEQzU4OTgwNURGOTcyRkJDRjc5RTkyQUQxQ0FBMUFDNjMz
-NUQ5MUYwMTE5Q0FCMDQ2NjIwQTgwMjQ3NUZEQzc1RTUwCgoxRjJFNkI3Nzk1NEJFM0VBOTZG
-MTFFMTc1NjU3MzRBMEVBNzAyQTRFODE4OUQ5NTc5NTAxNUY4QjBGN0U5Q0FDNDQ5MkJGOUI4
-RDAxMDIKCjU1Njg1MUZENUM2OEU1ODlGOTlGQ0Y1MUI1RUEwREJBM0QzODg5RUJCMjAxM0FE
-QUIwMzU1NzQwQzg3NTBCMTgyODUzMjhGMDFEMkRCQgoKMUIwNzY4QzJGMTUxMzRCRDZENDJE
-NDNFMzRBOUYwQTg3MDYzNkUyNkYyNDU1RTNFRDkwMEY2NkI4MjU1RjNBRjBBNkYyMjE1MjZD
-Mjc3Cgo1MERDQjg2RDVDMkM5RUQ3QzgyNkI3RUYyOUExMURGRTQ1QjBBQUNENjc0MjA4MUQy
-RDgwRjc2OUFCOEI0NjM4QkE3MUJDNEQ5ODc2MDAKCkRENEQwNENDNTJCQTI2RjQwNzQ0MUUx
-QURERjRENzI3M0E3NTE2RUUxODlBMjU2N0VDOEU1NUQxRDMwMTlDRjcxN0ZGQzk5NjU1N0JD
-NgoKMTE5OUJERDUyRjcyRUYzMTg0Njk4NzQ1NDI3Mzc4QTU4QzI2NkZGQUQ3NDZCMzk3RjA1
-MjhDNDM1RERGRUUyQzYxQzhFMjRDNkZDQkNCCgpBMzBDQTJDOTRBOEEzNDFFMEI4ODc5RDY4
-NjNDN0E3RkI4MDVGMTJBMjUzMEJDOTc0N0I2QkZBN0VBMDU3REE0MUFGQ0Q4MDQ2RUNGMDQK
-CjZDMjU1MkRBNUU0MTlGMTVFNjAzMzlBNkVDNTQ3MzgzQzRCNjM5RkM3QTdFMDg2RUE2OUJB
-NDk5RjVBOTUzNTQzQ0U2MjBFMTU5RDFBOQoKMUJCMkM2QUQyMkQ2Rjk3NzBGOUQyQ0Y3MTlE
-N0FENjg0MTdDOEYzOEU5Qzc5MTEzMzBFQ0EyRTM0Rjg0M0JCOTdFNjk4NjkzMTZEOTkzCgo2
-NDlGOTE2OTRGOEZCOTY5NkRGNzUzMUY3QjMzMjRGOUQ5QkZCNTJFQkMyNzYzMjBDNTgzMkFC
-RDlEMEEzREE5NEQ4MDEzREI5MEVBMkQKCkYzNUQwRTFDQjM3Q0Q3REIwNUZGQzUxNEY1MTBF
-Qjg5MzVCRjU1QzBBRjY0NDA0NjRCRkVBMUQ5MkVDNDRBODIxREE4MjJFMzg3MDUzOAoKQUVD
-QzE0NkQzQ0RENUNEQTMyNEJEODJDQzkwOTlDOTBGMkQ1NENEMTI0NDM1RTI3NUFFQkNDQTA4
-MzhDN0ZDMjUwMjhENTZEREJGQUJFCgozMEIwRkJCMUVCN0M4QkQ2Rjk0OEQ1RkE4QzRGQkEx
-QzEwMTIxRkIyMEY0OTBBNTdDMDEzQzY1NDFDNTZEMDg4MkEzNzMzOTI1MjI3NEEKCkIyNzc3
-RENBMDlDRUM0RTQ5OTkxMURDRTQ1MzJBNkM0RDM1NDY0Q0U1QzE1ODUzREMxRDI5RjAyQkJB
-NTY2N0I3QUQzQ0IwNTE4QTkwOAoKMTk2MDM1NjE4MUM0Mjc2MEMxMENFREJCNDY0MTdGRTBD
-RkUxQjU0NUNBOEIxMjlCNjdGOTI1NDY4M0FCNUY4RjU2ODRCNTBFNzAyRDBCCgpBMjkzMjU4
-RDgxRjA3NTU3RTgzRjZFRENCNUY1MEIwQTlENTdGNkE4MDIxNzg4OTYzODNFQkIyOEQyNzQ5
-REIzOTdDRkVFQThCM0FDN0QKCjE4NjFENDg5RTdEOEUwMkIwMUI0Nzc0MjlEMjgyMDlBMTY0
-ODczMjdEQzNDNTMyRTM1RTRGNEFCMUQ4N0EwRTFBMEY4NDAyQTA2N0JCQgoKMzBENEQ5OTJC
-NUYyOTk3NDQ1MjAxQzc4RERCQkIzMTgwNkVFMzAyRTk2RTM1M0RCMzBFNzlBMzQxQjM4QUYz
-MjQyQjNFQzg3MDFBMzgxCgpCRDRFRURDNTY1NDIzMTMxMkQ1RDREMjU1NUEyRThFMkMyRkI0
-QzUzNjc5NTgxQjU3RURCNkYwMUM3QUVERTAzOTlDNENDNUVGRUM4OUQKCjAyMTMwMUI5NkIx
-NjhFM0QzQkExNUUwQTJDMjUxNkVEREYyRTlCNzhCQ0U5ODNDODIwMEIxOEFERUM1Q0U2QkZF
-QTAxOTM5NzUyNTc3OQoKMjM3OEM4QkY4NDFCRDMzMzIwOTY4OTFBM0Y4MkRFOEZENDYwRjQz
-REM3NUNDQzU5NkI4MkVERjU0NkY4QUMwMjVFRDMwREE2RURERTQ0Cgo3RUJFNkEyNzE3MzlC
-NTFBQUY1QUY1MjQ2MEE4Njk0MkQ5NEYxRDkxODE2RDJDRkEwNTlDMDRFM0U3M0YyNzg0MTg0
-OTJENTQ5ODlFQjcKCkNFMUZFQzlEMzExQUU2OTE4MDM1MTQ0RjA3QkY5ODc5MDlENkJDQzJF
-RDg4OTE3OEVBQjdGMzNGNTg5QTcxMUNFNDkyODI5N0Q5RjM3OAoKRTUwNzc1MjAyMjE3RUZD
-RTgzQUEzQzgzQjczMUMxRjk4Q0U0QTc4ODE2RTdGNkQ5RUYyQzU4QUQ1Q0YyNkE0Q0RDODQw
-NzVFQkYzQTVGCgpEOTc4REFFNkU1MDcyNjY3MEFBNjgzRkQzQkQ1MUQxRjJBNjZBMTVENDJF
-Mzc4OERGNEM1M0YzQ0E2RTJDNTlBMEYyQzFENkJBRDM2OUUKCjJENDY4QThENUZCOEQ4MkM2
-Qjk1RTFEREM3NTA3MUU1NjNFOUI0M0VCMUYyRjdCNjhENzZENTRFNzkxRDgxQkQxMUIwRDRG
-ODhCNEUyNAoKQjhFMDhBMDQzNTBEMDNGNTc3RTIyOEQ3MzE5QUJDREZBNEEyOUE3RkE5RkIy
-RDk5QzU0NTBBNjlFQ0Y0NzQ4RjYwMUYxNUZCRDlFRDg0Cgo1QUVGQzAyOTU2NUZFM0E5ODg1
-N0YxOTdFNEI0QTJDM0M3NzEyMUJBMkQ3ODUyN0FEQkM1MDEyMEI5OTY2NzgxNkZBRjVDNjVE
-MkYwQzEKCjU5MDFCMjk2OEREMkRDQzUzMzVCRDVEQzg3MEU2MzdFRkNDRjM3MjZGQkFEQ0Y5
-OEY3MkMxNDM5MDkxMDlEQjFCODkwMTdBMDI2RjQ1NQoKQ0QzN0Q2NTZDODJBMENBMDdENUU5
-QTMxRjI4QkIyN0UyN0M2NUIyQjQyMkJEOUVDMTJGRDBENkI1MDQ2Q0Q4QkM3RDI3NjA0RDNE
-MTQ2CgpDMjNDNDA5M0Y2REY5NDAyRDMxNzU4RDY3N0M2QkI1QkMxRjU5QjBCOEE2OUUyOTU1
-MTZDNjQwNzIyMTk2MDUyNzkyREM0MEU0RTNDNDgKCjAzMjY3Mzk4RDYxNDRDQjVDMjA2OTk5
-MTA3RDY3Rjc2Nzk0QUY1MDFEMzVCOEI3NzQ4MjM5NUY3Mjc5MEQ3ODhCMDc2QTQxNzk5MUJD
-MAoKQzRBMzYwMkYxOUYyQzA0MzE2MTY5MDFEQkQ3MjY4MEE5NTkxRjMwNzQ1QTZENEY5QThE
-NEI5RDY5MTE2QjRFOENCRUQyRkI4RjA4MjQzCgoyMjE1NkE2MENFMkZDQTgzNEI4MDVFMkY4
-NjdCRDA2QjY5QjU2NkUwOUVGMjFDM0I3QzJCM0U1QkEzNDEwOUM4QjY0RjdCNjA5REY2QUYK
-CjAzQzIzQ0VFQTRCOENCMTIzQkU3Qzk2MzdBQTQ2MTlDMjkzNDhBMUU3MTM4MkM3OEE3NkI3
-RDk3RTFDOTFFNjMyNzhEMjU3RTJFMkVBRAoKOEQxNkY2MkJFNzQxRDU5RUZGRDYwNjY2NkFE
-QjdCQjBBMzE5QkJDOTQ1MEMxMUVERUJFMzM3QzVFMDUzQ0ZDNTgxMTJGOEJFNjdFQkM5CgpE
-N0U4N0E3Njg1MTZFMUE5NzFFNDE5RkQ0OTAzMTQzQjZFMUI1RjlDRjQ3NTVCNUI1QjlFQTJB
-RjY2NTJBMzc2QUFCNkZENTRERDA4QkQKCjMxRDNEQTlDMEJBN0MyODgwMUMwNDhCNDNENEJC
-Njg5QjNFMkE3QkJDRUU5RTlEODBEM0JENzhBN0Q0RDk0ODkzMzc5QTcyMjhFRTVDQwoKOTMy
-MzMwQjUxQjBEQUQ5MDlEMDZERjRCOUZGOTI1Rjg3NUQ0RUUxRUIyNjkyRUNGMUEwMDI0NDE3
-MjczOTY5OTEzQUQyNUREQjhFRDExCgpCQTI0MDFFNURBODNFQzQ1MkM3OEZDNDlFNUJBM0FG
-OEVGMEFBRTJENTVEQkVENkFCMjFCNUM5MzU4QjFDRTA4QTQ1RTg3QzEwQzZGMzEKCjgwMUY4
-MjNFNkJBMEFEODgwNjA2NURFQ0JGRTAwQjlDOUFBM0YzMDBCMjc2NUQ0RDRFOUM1RDJBRTg3
-QUYwNUZBQjIwN0NCNUE5MDFEMwoKREI1QjI4NDA0OEE4QUEyRjBDOEY1MEJDMjk4MzU2NDQ0
-RDI2NzJCNkUxMUFERDEzNkU0QjY5MjZGNDcwNzYzMTA5RkVGM0FBRjFFMjEwCgo4OTVDQkY3
-NzEzN0E2MTQyRUVFOTU4M0QzMkMwNkJENzgwNTUwMjEyQ0M5QkNBMThCNDk0QTBCMEEwOTVG
-MjNFNEVDMkNBNjIyQ0Q1NjUKCjQ5RUQ4QUU5QTgyQjRFNjBGRkQ3QzczRjZEMUM0NjIwOTRG
-NDk0NkUxNjQxOEQwMjMyMDhEOEJBRjQ0NUUyN0M3RUQ5RjM5QTdGQzExQgoKRDRBNThBMEJD
-OTk2N0UxQzU4MUVDMThGODY2RjVBRUI4Njk4RTcxMDc1MEZGNEEwQ0Q2OTVDMzE0Q0EyNDgz
-QkYzRjVERjE0ODg4RDU3Cgo1ODc1ODc4OEYwRDNEM0FGMzU3RTA0RkM0NURCNThFREUxNUFE
-NjRDN0YwNjM2NEUxQjJDNjREQzE0Q0MwMzQ2QUQyODU1NzgwQThDRTcKCkZBNTM5QUYxNzI4
-NDgzRkZDRTgyQjM4OUM1NDZFNTU0RkU2MzE0MDZBNzkxQTAxQTFDRjg5OTU1NUUzNDYzNEI1
-MkYwMzlBQTk1MDg2RQoKRDY0QjUwNTM0RENBNTQwMTJGREY4NjdBNDE3M0Q5N0Q0MjBFOUY1
-Qzk3MDY0MkNCMTJBOUZFOTBBOTc1RUU3QzNEMjdDNDM1N0RCOUU4CgpEQjlBOUFGNzhERkM1
-QzA1NDNDOTI2ODU2QkQ0QkRBOTgzMzg4NzVGRDk1QUJBREEyNjBDMjE4NThCMzc4RDAzOTFG
-NkJCRjE1QUIwQkQKCjcwMjVFNjU3NTg4RDlFNjM2NERFMUVGQTA4ODEwNzgyOEZBNDI1MEU1
-M0U3NDg3RjhCRjg5MTk2MkYyNzgzRkUzMDUwMDJDRUQwM0QyNAoKQ0VGRjVGNkU5QzNFMzIx
-MUUwRDQwRkU3QTlFODMzMTRGQjlGNzJGMURBQTdGRDVCODdFNDQ3NUZFNzhGNTQyQ0QyMkFD
-QzRFNDA5MzNDCgoxNUNCRjE2QjI0MDA0MDQxNEFBRkY4MjkzNzFBNjdCM0Y2REFEQ0I3Mjgx
-NDEwMDM1RTcwMjRCNTY2MDQzNTZGOEQyNEQ4NzlDRjRCOTIKCkMzMTJDRTU1MzhDMjdEMzI2
-RDU2Q0RBMkRCNTJEN0JGQTAxODRFQUJDN0MxMTYwRENERTY1NDQ0QTFGM0QyOTM4N0E4RTJD
-NDFCNjMyRQoKNzc4ODEzRDNGMUUzMzVGOEEwNEYyNzdGMTQxNkRDMzA0MzE1OTU4RTM2NDFB
-N0Q3RTVFQ0M2OENEM0RENTQwNDNDQUZBQ0I5QjMwN0M5Cgo1OEQ2MjM5RTY3NTQ5MjBBMEM4
-MDgwNzgzNUEyRjEzN0FDQjNEMUY4MjhFQ0NCQkREOUE1NUFGQzY0NkVGOTNFQUMzQUZGMTEz
-NjU2N0UKCkRBOEY3NDFFMjQ2MDRGRDQzMjJCMjBGQkEzOUUwMzc0OEJFMDI3NERCQzZBQTg5
-NTdEMzBENzg1M0VCOTZBNjVBOTg3OEREOTRFMjU5QwoKMzhDM0ExNDRFMTI2OUNBQ0E1NkIw
-Qjk1NkM1QzQwQTZCNTk2NDI2RjQ5NUU0MzhBQkYzQTU0QjRCQkYxNjEyOTlGNTk0RUMzMDVG
-OTVFCgo4QkZGMkZCNzg4RTA2NjQyMEI5QzZFRjcyRjZDMjg1MzZENjZFNkYwMDMwOUJCNjlF
-Mzk2RkM4NjQ2MjZFNjdFODREODhERjRFNzQ0MjIKCkE4NDZDMjk4N0NDMThFNzBBNUI0MUUy
-NkI4OTdGMkRFNzlFRkRBNkNEOTlGNTk0NTY0REE5NDZFQzEzOTcyQUI2RjdERDczN0RCQjE0
-QwoKOTQwOTI4RTc4MzlERkNDMDM1MkY3RkY2MDU3NEM0Mjg0Mzk4MTU5RTQ3RDA0ODdEMkQ5
-NEQyMUU5MkJBMzVCRkYwNEZDNzRDNDM2NTJCCgoyNjQwNTEzMzcxNENBMTJBQUYyMTFFQTJF
-N0MzOTdBRjExRTlENzc1QzYxNDYyQTc0MkVDRjk5OTJCNjlGRUQwQzE1MkZFRDVBQTk3MDcK
-CjI0NzlGNThGOEQwRTI4MjlBMUY3OUE1MkVDN0EwREEzMTJGQUU2QjIwMTBCRjcwRDBBRjhD
-Qjk5OEY2MjZGRDI2RkUzQzUzRkU0RENFQwoKOTE2REYwRTlGQURGQTI4MDJBQkU5NDRGMEJC
-RkQxNjZDRDM5RUJBRDNGQTRDRTJDOUFCRjAwNzg5MzY5OUZGMkMyMTA2MDA0RjNGNDc3Cgoy
-NDIwNjhBN0ZDQ0FFNzlCODc5NUY3Mzk0MTAyNTM2RERFRkMxQ0JENjYyNTE0MjMzQjVEQ0VG
-MUMzRjcxNTYzN0JENjk1QjFFMDcxMzYKCkU0MDAwN0M3MjM1Q0NEQ0E5OTFCQUYxNzNEOTE1
-RDVDNUYzM0M0RkRGNjUzRDUxMTY2OTk3QjZBMTRFOUQyRjFCQzI4OEIzNEU0NEREQQoKQThE
-RTU1QUE4NTYyNzM3NDk4OEEwOEQ5NjVBM0UxQzg0ODdDMzEwQUYzMkQyQzBCOEU1RDM3N0Q0
-QjY3NTI5NTRFNERFRkU3MkZENzAxCgoxNjE1RDdDM0VBMjVBNjczM0VGN0VERUFBQkM5OTk2
-RDdGNkMyREQzQ0E2MkEyNDdFMkUzREE4MTE0QUIzNjMwQUY4NzI4QTk4NTRFODQKCjQyOUEy
-NzYxMjZEMTg3NTZFMTI0NTQwOTVFOEQzMEJFRTVEMzMyN0FFRDU5QzFCRkZGQ0NBRUJBQjAy
-NDQ0QTM4QTg5REU2REQzQUQ4OQoKNEVEN0U0QTVDNzYxQzhCQjc3Q0EzOUY0Q0MzREE3QTcw
-ODUyRTI3RTg4QTRENjIwMEU5MjJBRUY1OTNGMDkxMjI2M0NGNDM4MUExMkVCCgpEOEY5NEFF
-MjJFQUJCRDIzOUVDNUU3QUYwM0VBOTEyMEY0REMyRTgyNTNENTU1MUNDRThDQTYzMzY3MTRG
-N0I0QTRDNEI0Q0U1NjVGNzEKCjI2ODVFMTM2NzZBM0I0ODgzMTE3Mjk0MzJFRjI0Q0NGOEJB
-NDgyNjVBQkVFREIyRkJBNTNGRjIwODdCQjlDQjk2ODJFOUREQzk5OTE4QwoKMDA4RkIwRUIy
-OEVCMUI1RDlGRTY3RUE5RDJENEZERTFBOEZFMUQ4N0NCODJGODEyNTg1MEE2MEQ5MjQxNjFG
-REQ0RTdFN0RBNTk1NDMwCgoyMzM5Q0Y2QzYxOTQ4OTQ4NDVDRTVBREJDOTc4ODNDQUQ3RDM2
-OTU3NDY4NTZBQ0YyRUZBMjFEQTVFQUQzM0Q0RkY4Njk0Mjk4RkY4QTUKCkFGRTlDQkIxQzZG
-RjE3NDMxNzlGM0VFODJBQ0U1QUQyQkY4NjQ4OTM4M0E5N0YwNUZCQjE4MDk4ODlEOUVBMzM1
-NDRDMjYzMkYzM0VDMgoKNzExOUIzNjcwODI0MzMyRTdGQkNGNTlDNzFDMDgwQThFNTlBM0FE
-Q0EzOTI1QzY5RDRCRjE4RjFFMkIxRjdGOUMxODRGQUY3QjQ3REYyCgoxRDc5MDVCNzhFRTkx
-QThCRDczM0Q3NTVBMDQ2NjI2QjI1ODY1MTZDRDM1MjdCNkVDMDlBOTA3ODRGNUMyMkJFNTQ2
-NUMyNDk2MUU0MjEKCkI4RjMzQTE0RjI4MENFN0JCMEIyM0Y5NzAyMzYwRjU4QzM3RUU0Q0E5
-OEFDQjQ3RTNFRjhCQjFBOEE3M0Y5QjA4MzU4NjMwOTQwN0JDNgoKMUIzNEQ2N0E1NDE1N0Uz
-NzI4RURFNUE2QTlEMkRBODExQkNBNTIxRDk3QzY2RkI0NEM3NzI1QjY5QUFDMzU4NTI4RkJE
-QjY3NEIyNTU1Cgo3RjAyREFBMTlFQjRFRkM3MTQyM0M4OUY4Mjc3MzcyQjAwREI0NUU3ODNE
-QjI2MUJERTZBNzM3RjY5NzIwMThFNThGQzM2RkFCNzJCODIKCkU0RUI0OEJBNDVGQkQ2REE4
-MDc4Rjc1OEZEQzExNTVDMDZCQTdCQjQ5NjlFQjgyQTVFQTYwN0YyNTdCMEJCNjQyQjkyMzVD
-NDE0Q0JDOQoKREM4ODJFNEIwMDEyQjlBNjAyNEI1ODRGRTY4QUJDQjBGNjBDOEJDQ0Y4RTE4
-MUFDQjc3ODNEQUVDOTlCQzdBM0E4QUYwMjhCRERDRDBGCgo0MTBDOTQ1RjA3NzkwQzA2RUE2
-Mzg5OUYyMDEyMzI3QUQxNjA1NjJERDAzOTBERTU2NEQ5MDA0MEFDMzAzNzU5OEM0NDQzRjA5
-NUZGNkEKCjNGNTI1MEQ0QkUwOTQxOEVBNDMxNThCMjc2NjFCQzI1MDBFQTdCQkYzQjkxMUM0
-N0ZFODU0QTgxOTIxMzgxMzY4NERDNTk3RkU1OUFCMwoKRURCNEIyOUFFMUU1MUFGOERGNUE5
-N0VBNUIyQTM4NUIwMjE5Q0FBMjQxM0U3N0M4RkZGMEFDMTE3QUQwN0RERDEwNTQ0NzRFRjA4
-Q0UyCgo2OTg2Q0I3REUwMEEwMTA4OTM0N0UxNkYzNkMwNkQ2MDgzNjQyRUJCREU0MDJBOThB
-QjQ4Rjg3MTc3QUY1RjZCOEYwMjM0RTMzRkM5OEIKCjAyRTNDNzhDMDgxM0E3NDY3N0FENTI0
-QTMyOTIzM0E0Qzg5QTY5MUQ3NTY5QkM1RTI1QzVFNDZEMTYwRkNDNjlEOTVBOUIxQkM0N0ND
-OAoKMDY5MTdFRTQ0MTU0NkZBMzQ1MEE5QjMwQ0M0QzRCQjRFN0NCNDYxRUNGRUM3MTE1ODkx
-QTI1MkRFQjI5RjIwNkQxRkI3MzMwOUI1MjU3Cgo2QTlDMUZGQTQ4QzgxNzM5MTY3QTkzMzk0
-NjA0QjFBOTFFODZDQkJCNkQxNjRFNUQ3NjU0NUM3NTE1MkRFMkUwQjRCMDlGNjVCRUYzRjMK
-Cjg1Qjg0RjI5RkE3RkQwQzk0MzRDOTM1MzNEN0VDQzRERDhFMUFFREFBOEIxQTIzMUVGRjYy
-NjZCNjYxRUU1RjRFQ0Q0REVFQjE1NEZBRAoKNzAyNkFDOEZFRTY3MDgzOEFDOTg2RDQ4QURC
-QjE2MEE4NzNGOUNDOUY2ODdGNEY0MEE1QjZBMDgyNzEwQTYzRDEwRjkyMzkxRjM0MUQ1Cgox
-MTQ3N0FGQzg4OTk0RTQwMTZCQ0Y2RDFFNzYwMEQ1NUFFRDZFMDJCRjAxQjVDQ0ZCRjBERUZC
-QkJCNjk3RkVBQjNDOUIwMTI4ODJBQkUKCkUwMjQzMzIzMzBEQjAyQ0U2MUVCNUM0M0M1RUJE
-Rjk2RkY3OTkyNDlCRjY0MTAyRkY2NzBCOERCQTI5RjQ4MTVDMUE0RkJDQ0YyM0IxNgoKNUFE
-OUU4RTU3RjU5NkE4QkNGNEMxREQxMEVFNUEzREQxMENBMjBCMTY3NTgwOUExRDI4QUZGODVB
-NUM0RTkzRDUwMjBEQzdBNDVBMDUwCgpDNzIyQUY1M0Q0MkVFQzI5REZGMEU5MjRGOEE1NEY3
-NUY5NjExRDZERjA1RTFBNDM2QUMwMUJFQzA5REMwMTQzMTU2RkZENDdGMzIyNjUKCjlFMEY2
-OTY4RkUyRkQ2MzA3NEVFNzdCRkU4QTRBODY2MTMyODMzOTMwRTEyOEM5MUIxQ0NFRUM3MUJD
-MDJCQUU4MEREMjU5ODQ1MkNCOAoKNEIwRDc1NkU4RDBERENBM0Y2NEQyRTY0QUIyMUM0ODJG
-RkVENkE4NTlCQzNCNUQ2MUYxREI4MTJGRUUxQUYwRDQ4MjIzOUZDQjhBNEM5CgpCRUVGNjMy
-MDY5NjM3QUQ0ODA1MERBRTAxMkY5MUFCNEEyNDQ3NTE0MDNDOTgwQzUwRUU0NEJFMzhEMzNE
-NzY2QTI0MjQyNjg1OTdCQkUKCkQzNkUzOUI1OTU2OTNFRkEwMENCQjY0ODIzNzJCMkMyMEVE
-ODk1NjM5ODNDNkNFREQ1RDI4ODE5NkQ0OUQ4REZFNDY3MEM0QjVGNDU3QwoKMjFDQUY5RDg5
-Q0E3QUM5RTAwOEIzRjg2Nzc2M0EwQTIzNDk0RDRGM0RFMjI5Rjk4M0ZDOUExMzM1MjVBNUJB
-MzNCQUIxODRCNzNBQzQ0CgpBRDg1MTAyRkYxQUE2OTE1RDYyRUYxMEI5OTJFOUI3MTU0QTZE
-Q0NDNDc0REYzNkZBNjY0MUZFNzQ3QjFFODBGRUE4MEREQkE5RkMwMDgKCkE3MUUxNTUyQTMw
-Rjg3OTU2QTZGRTI5OEQ1NzM3QkNFMjg1REFCMUY3NDY2MjJCNjE0MEU1NjMyOEREMEIzNDNC
-QjdGNkVBNENCNzNBMQoKQUUxNDQ4Q0NEMUJCRDFBRTdCOUY1QUVFMkE5NkM1NUQ0QjUxMUIy
-QzM0ODlEOTY0RjZDQUZCNzA1QjE1ODcxOTJDMUI5MzYxM0RFMjYxCgo0OUY2MjNBOTc5QjFG
-QzhGODQwNTkwQ0YyMkRBNkJENTYyRTYxQzExNkQ2QzVCNTQ2MDAyOUNCNUY0NkMyNjYzRjgx
-NDI4NEY1MUMxOEMKCjBBQjFGOTk0QkVGMDhDQzc3NUI4N0UwNjYwRDhFMzk2RTQ4Rjc1NDY3
-NjgzNjE3NkI1NjgwMzREMjZCNUUzMkY5QzAwQjVGQzA2Q0JFMAoKMEMxMDA1OTU3RDIyQzc1
-REUxNEM4QTY1NzA3RjgwODFBMTI5NTVENEVBNTY2M0Y2QUI4MjNFRDNDNzA5NjI3Nzc3QkI3
-N0FBQ0YzRTlGCgo3RDQ0MzAzQUU3OTMxQTAxQUMzMzQ2NDkxMTk0NkZBNzkyNzA2QTM4QUFB
-NjQ1MDI1MjZDMDY1NDhEMjIyNkIxMEZDNDVBQjMzNzhFRjgKCkEyQjdBOUU3OTYwRTA4RDcy
-RUUwOEU3MUU2M0UxNDlFQTU2QTk0MUVDQ0E5MzhEN0UwRTRBOTQ2OUI4NUZGMzIzOUYyMEUz
-RkU5MEE5RgoKMzU5QUFBQjc2MjNDOEZBMjFCQ0VEN0I0MUQ5Mzk3RTdDOTc2MjdDMjBFMjI5
-RjI2OEQzRkNCRjU0M0RFQzczNDI5NzE1M0U5MTY1NzRDCgpDNDcyM0NFNTQ4REY4Q0MxODdB
-NURGMzg0NDg0QzgxQTkyMUE5MEU5MUU2Q0NBMEY5Q0IxMTI3RjAzQ0JDMEUwMTg0NzYyNDI4
-MTJGRDQKCkM3NUEyNEU2NzVFQUQ3OUY2MjYxNTA0RTcxQ0NBM0U1MjM1RkM3RUI0Nzk4MjU0
-MEFBNUE3NTREMUUyOTYyMTM2OUQxRUE4RURGMEJFMAoKOEQyMDk0Mjg4RDAzRDc3Q0ZFQTg1
-RjA0RDE3QjNGNDFCMDdFNkU1NzY0OTBCRjEzMUQzRjc4MjI3RDU2OUYzNjkxRjAxMzVGREQ2
-RkYyCgpEMkIyMTJEN0Q0MTIxMUExQjdFQTJDOUZFMkQyRkI3OTA2NURCNTMwMTQ5ODgwMkI2
-RTFFODE5NDRDNTc5OUFBNzhFM0RDNkZDNzFCOTkKCjVBOEM1Njk1MDFENEYyNDQzN0RGM0I1
-MTBBMjM4RkJBODEyMEFBRkY1ODIyNzI4NUM2QTEwRDA3NTZGMDRFNTE3MTBEMzRDNUIzRUMx
-MQoKNjMyQTg2QkREREE4QUExMkE4QzVGNDg5NDhFMzY3RkU1RURDRDNEOEVCODVFM0QyOTU2
-MDJERTE5QkMxRjVEQUU5NkUxQTdBOUNFMTkyCgpGOUY5REFEMEI5MjFBOTU3MkVEMUQ5MkRB
-QTlBRkFDQTU3NjE4Nzk0MDBGQzFGMTFGM0FDMEMxRDNFRjlCRTVFQUU3RjdCQzk2M0NDMUYK
-CjE1QTNEMzZCNEE0QjI3MjVBQThEQkM3N0M2MTkwNUVBODIwQUEzQ0MxRUFDQUZCODE3Q0E1
-MzBDMzJGNkQyODFGMEY5QzQ1RjE4REU3NwoKMDlBQkYzMDUxQjU4QjVCODU3MzUwQkNGN0Q4
-M0Q2MjFCODlBNjkxN0YyRDMxRkNDQTMzRDdGODQ5QTc4QTAyNDExQTE2ODA1QjU0MkNCCgpC
-QjlFQ0EwODdDRjMyMERDOEE0RTRFRjZBMUIxOTEzQTU0M0U2MkQzNjExRkQxMTk0QjAxOTk4
-N0ZDMUI0NTQwMzdDNzQ3NzNBQTVEQjgKCjNBOTE2QUZCRDU4N0MwM0NBRTJFRDdCREU0QTcz
-ODcwNjA0MUIyRDIzMzIwMzlBN0RDQUZDQzQ3REFCQURGRUFEMjdGQ0Y3MDcxM0RDMQoKNzUx
-QUUzNjgxMjY3OTYxRUUyQ0NBMUIyMTU5OUMyQkEzRjM0NDhERjRCRDBCRjZEMDFEOEVEMkIy
-QjcwRTZBNDI1ODZEOTg1REZGRDcwCgpBNjVCNjVBQTJDRTVBQTE2REI2RjVCOTIyODQ0NDlC
-RDdDNzJEODAyQjM4NENCNjNFRjdCN0FFNTFBQ0YxNkJFNTc1MDY4MDA1RUExQzEKCjI4OTk4
-NzNFOUZBNzZDQkI2MjY2MzJBRjQ3QUQ3QTBGQjNBQTY0OTlERUZGNTQ3NjI5OTEwQTFCMzAw
-NzhGMjNDNjUzOTY0NDZDNTM5OQoKODRCQkQwRTQxNjQzMDc5OENFRjgxOTZEMDkzRTMxQjVG
-QTY2NTA1NzRGMzBEM0ZDNDc5MTc5RjAwQTM1MDcxOTlCREU4MkJDNzE3M0IwCgo0RUM4MDE1
-Njc1QUU0MkU5MkUwQ0MwRUY3RDlEODA5RURDNkZEQjEwMzY1OERBNzhERUQwNzVGQzYxQ0Qy
-Q0FFNEVBRkYxNDU4RjEyNjEKCkQ5QkUyNjE2NDJERjMyOUMwQjBEREI1NzEwM0MzOEU4MjNF
-M0JGMDlDNTk4ODEzODhBQUY3RThFOEJFNDE5MEI4MTFDRkY4M0FFODRCOQoKNjY0QUNCMzA4
-QUFFRTI0MjUzREIwQTU5NTIwM0JEMzA1QTE5RjJBNDFBMDU0QTYxNkNGMDI4NTBBRDREMDAw
-NDVFQzAzNDc5MkE3MDEyCgo2RTdGMTBDRDM5QzkxOUM1RTZCNzdCMkY2MzEwODI2NkFDMzg4
-MkI2RkU1QUNENzMwQzRBNzlFQjQ1NDk2MDREMzFCNzBCQjgxRjlEQTMKCkIzRDhCRkFFMUMy
-QTdBMDAwQTU4ODRDRUMwMjVGRjQxN0QyMDM2MkE5Mzc0RUNGNDA5MzZFOTNFQjc3MzYyQ0U2
-NjM3MEYxNjkyNzEzNQoKNzRGNjBFOTU2QTY5Q0ZCQjcwQkI1OUEwQ0M0OTdCRENGOTEwODc0
-OEI1NDY2MEFCQUYzQUY3QkM1N0U3MEJBQjE5QzRFQzY3MzgxQzBBCgozNjcwOTA0MkFGRjk0
-MDRDRDYwMzlDQzIwNzdDOUJCQTU1MjQ5QzY1MDk3OTc4RDIwRTVBRTlDQ0UxQTI3QTc0NzUy
-RUJDRDRDNTM1NDYKCjNDNzRCOEQ2RUExODdDMkQ1NzVFODlENUNGOTAzOERBQkE0RTVCNkIy
-NDBDNUE4MjYyMzVGREFFMEYyMkU4QjREMjlFNEE4Q0RGNEVENgoKQTkxODc2RkYwNkY1QTkw
-MUI2RjM0QzlDODEzMkUyN0FDMDFCNkI1N0FFMUIzMTJGQzFDMjc4MEU5NjMwMjg2QzkzM0ZD
-NUFEODRCQ0UyCgpDRkQzRENFQTFDN0Y2MjFBMUM5Njk1RDY1ODk1QzMyRjkyMjZEMTRFRjMx
-QjQ2MUZCQjk4RDRFRDNDMkVFNjI0NzdENjY1Qjk5OTkzQTgKCjBGNDI4ODVBMTJFNDU0Q0Y4
-RjQ1Qzk2RTAwMkJBREM3MjE1REUzQjEzNDFDMTFERDVCNzgxNjdENzZEMTM1NDYzMDdCODkw
-Rjg3QTE5OQoKRkMyQ0RCOTUwNjRCQ0VEOEZDNUUwQjUwMkU3QTU4OUVBNkNDMzZGMkI5MzVF
-MDVENkI0Q0JEMzhFMEMzQkI3MTQ0MUYwNUZEMUYyMzRDCgo1NDkwNTRBRjdGRDgwNjUyNzdB
-RkRCODkxNDlGREI2Q0Y2NEE0RTUzNzVEM0VBNjA5RDkwRDk0NUU4N0E4QTJBQURGN0Q1OTY2
-N0FERDgKCjE2RThDM0Q5RjkzQjA1MzQ4OEY0NDA4MTc3MDQ4RUE3N0EwNUY4QjM4M0UyNDkw
-MjJFRDM4NTNENkZBRkQ4NzVGQTM5NzU5QUQzQkU3QgoKRUE2QTI4QzQ5MzEyRDY4MjBFRjJC
-RUFBRUMyMDU4Q0Y5NzU2QzlFQUU1MTdGQzA2QkZCOTgxNDEyNjZENzBGMUY2NTFCOTBBMDY5
-REVCCgozQTJFNjU4OEQ5QkZDRUIzRjRCNUE4RTMwQzJFODI4MjkzNzZCRUM5NzlBNkJDRjNF
-NERDNjlBNkZFN0JCQkYwNUI2NjM5Qjk3MTkxMzYKCjFBQUEwOTlGNEJDNDA5QzE3OUUyNTI0
-NTJFOEM4MDJBMTUxN0Q5QzZGREEzRkIzMDZFQ0JCQUJCMkREMDcxNzQ0ODQ3NzY2ODdGNEVC
-RgoKOUEwOUFCNUYzMjE2RDlFQjg1NTA4MTI1QjIzOUZBMjI4NjdEOEM0N0QyOTE5MzkwRTZG
-NTYwNkRDOUREQUMyQTJDNEU0NDVGQThGQ0Y3Cgo0RTczQjA2QzZDODgwODVCMTE2RUUyODc2
-RTFEQTgyMEYyQzRBMkVDMjlFMDM2MDY4RTVFNTJCRDgyRkJFRTQ3RDY3MUIwNDBENzU3NzIK
-CkE5MzMxNEFGOTI5Nzc1M0EwMTIxMkZEMkE3NjI0REY4OUEzMDZBMTk0MTI1OTI2NjI2NDkx
-QTNBRkI3MENDQTVFRDBGQjE0RjYxNjlBNwoKMzRGQUNDM0QxQkM2OTM4NzE5ODVENTFCMDlE
-QTc1REU5MjdCMEY1RTU5OTZCQjNGRTM4NTMyMjUwRDc2QTZCODc2NzhBRjEzMzMxQTBGCgpG
-N0EzNzcwMEJBQjMxNzFDNTExREVDODhFOTk4RDI1MDBGRTBENzJEN0U2M0REMzVBRkE5ODI2
-NjQwNjVGRDJGREM1OTk4QzlERjhFNTEKCjY5QzNGMDM1Mjk5QTVEN0M1NDQ5MEIxNzVDQTQx
-RTQzODgzODM5QTZDOERERUM4MjEwQ0UxMzE2OTU3NzdBNjA2MTMzRTIzRDM2RTY0MwoKMzMw
-REUwRDcyMDVENTNCODhENkVDQjVCRTZEOTU3OTBDQzdFQjdBMzNGNTQ1RkEyQjFCMUZDRDdF
-ODg3OENENkNCNUUwNDJERUU0RkUwCgo4NzlDQkI4RjBCMjFDMTU1NTg4QjA2NzJEQzZDOEY4
-MzI2NDhFMjk5NTE5MjU4MDE2MzE5QjNCRTcyNUQ1ODY4NEM0QkU1RDY5MkZENTAKCjI1ODkx
-MjIzQTU0RkUzNEYxMERFODE2QzQwRTVCNDk0NzAwNkFDRDgzNURDMDFCMkFGODRCRjQzODBB
-MkQwRDU4MEFDMzg3OEY1RDQ3NgoKREUyNTY0RjMxNTIxM0Y3RENENjY3ODUyNDA5NEU4NUNB
-NDlCQTgyNDk5QTVDRDY5QjU5Nzg3MUVDQ0ZCMDVDQ0M0NzkxQjhCQkJFNDVECgpFODIwRTFG
-NDAyODg1RDk0N0YxQUU2MjI1NDUxRTVDMzNDOEU2NUY3RDc3MTRDNkE2RTU5MTMxRTg1OTlB
-NEIxNkVCQkVGRDJBODZGRTgKCkUyNkQ5Qzc2RTM1Rjg1RkQ5RjhEQjZFRDM3NjBCMTIyMjRF
-RDM4OTc0Q0EzOEY4OTRGMDMyMkNFRjg2MzRGQ0E2RjRDNTY0M0I1RUFBNAoKRDlFNjUyNzRC
-QjVBMkEzODFEQkU4QTEyOEJDODhDQjRGNkUwNEMyQzVDNDQyNUYzNDc0NzlEODYxNjRCQUEz
-RjE5MDAwNTA1Q0JCRDI4CgpCNTJDRDNDOEEzMzc3NEY0NTk5OTEyOUY1MUE3QkYxOEE1NEI3
-MTczOEM1MzRDNUZBQUU1MDEzMTVFQTU4NjlDNkQxQ0ZDNjdEMEFCOUQKCjU4NEI0MDI5NDQy
-NUFCRTM1RjJFOTIzMDI1QTcyMjc2Mzc4NzZFRDNCNzQ2QjY2NzRENTJDQzREQTY3OUQ1MzE3
-REVGMEVENTdCM0M0RAoKOTMwQTk2QzBGQjY5MkRERDJDQkNEMTEzNzk5RkM0QzgwMTQ3MTk3
-QjdCQzlGOTUxNEFBMEE5NkUwNzhDMzYwMUIzMkE5RjY5MERDM0FFCgo3MEY0ODFERDQ5Njg5
-OTVBRjY0NUZDMEU5N0FBQTIyQzk5MUFDMTFCRjNBNThERjQ2RkY4NENGOEI3NkUyNDhCMjNC
-OTk4NTAzOEU3MzcKCjBGRTY1RTBBRTU1Nzg2NUYwRUVDNjNFRDdGNEE5NjQxQ0YwMjgxMEUz
-NEI4NzY3NUZEMDhFQkM4ODAzNjg0OTFGQzZDN0QxQzlCRDI3MwoKNTU0NEJEQzk1Q0UwREEz
-RkYxMUJGODhFOTY4MEE4QzhGOTFFRkQ2NUZEMDRDMDA5NERDOTRDMjlEMDA2NzM4Q0QzNDBF
-QUUwNTg1RjBFCgo2NThERTJEOTkwNzIxODYxMkIyMTcyMjhDREZCOEZCNDg5QUVCRjdENUMw
-NUM1OTYyRjY3RTBBMzk5NzRDNTY2NUIzMzIzNTNGQUUzNDEKCjlCMTA1ODM5ODQ5Q0RCODQz
-RTkwOEVGMTg0RDBERUEzRjRCMUM3NjY5QTk3QzAzNUE4NkZCRUNGMkQyREE5MDVFNjgzODMx
-MzE5RDYyNgoKMzg5NUREQkUyMzhDRDU0OTNDNzlGOUVBMTk5NTg1NDVGQkZGOEIwODhFODZG
-NkQ4NUJBQjZDRDdGQTAzQ0I4NkNCM0FCOTA1MzI5QjZCCgo1Mzg0NTZBMUM2OEEyNjBDMTM3
-RTQ5N0YyRDdBNjI3QzM4RDU3MDMwMjcxMjA5REJFNEJCRjJBNDg0NzQ1RTZGQ0I5RkE5MzBB
-REJCNjEKCjlGNjQxMThFNzc2MjA5MjU0NDlERDZCRkE0QUQ4ODM4QUY4MUJFREQzRkU5RDBD
-MTVFMzdCQTQ4QjMzRDYyMDFDNjcxMEJDQzMwNjRCMwoKMTZCNTM1RTA3QUZGRDYwNjVDRDVB
-MjczOURGRDA2MUMxQzQ2NEI0QUM1NTI2QzRFOTNENEYzMkIxRDA5Q0E0MjAwREFDQjc5REM4
-REYyCgo4QUVBNkMxRTlCRTI0NDYyMjJFOEZFMTQxNzg2RkU1MTQ2QTMwODAxQzA0NDlEOUU3
-MTQzMjI2OTQ4ODYzRDU0MDI3MTBBRkVDNDNGOUMKCjMwRDg1OTE1RTAzNTRCOTZFOUJGNDM4
-RTYyRjlGQzNFNzRCNTU5OTU1NUQwQzcyNDgxRkNGQkI1MTM2RDRDMkUwNjRGOTA3OUU3MjU1
-MgoKMTVDOUU0MTY2RUUxMzBCQUQ4RUEzMTU5RjE1NThFNDhBNEQ5OThEQThEQTFCMDAyQzcy
-RUZDNEYzOEU4REI3Mzk2REUwMzFERTU0OEY5Cgo3NkRFOEUwQzExQUQ0Q0QzOTZENEExMUM1
-QjczQzhFMDRGRTA3NDZBQzMwMEQyQ0QwNEQ3RTlDRURDMUQ3OEZCOUUxMkE4NEVFMjI5NkQK
-Cjg1NkI4OTA4RUFBNzIyREJDRDlDN0U3MkEyRUE0NTc1MUZFMjM1QjQ4ODc5QkE3NjEyOUY0
-MTIzMUZGM0I2QTMxQUE1MUUwRjhGQkNEMQoKNjVCODhEQkI3QTM1M0YwQjA0QzU1NzI5QkQz
-ODUxQTRGRjMyQjc1QUVENTlDQzlBRDQ5ODUxMUE2QzEwNUU0OUYwREZDNTY4N0U4MjkxCgpD
-MzBBNkE4MjZERkQzQzA5QTBDQTg3NkI0QkU0OEEyMjJDRUNCQkEzOTBDNUREODNCRjUxRTZE
-MUM3MkFFNDYzQUNBNUFGNURFOTNERTIKCjU3MjdBNEQ3MEU3QTI2N0ZCN0EwQzEwRDVFQzM0
-MUNERkFEQkQ1NjkwNUU3NEJCMDJGNDQ2RjkxOThDQzhEQzkwM0M1MUFCQUJFOThGNwoKNkU3
-NTg1N0UxRDhGMTIyMDEwOUE4QkM1NjVEMkNFQjdFM0I4MDlFMTZEODlBODNEQ0EyRDlERTBB
-MTU1NTIyNTAyRkQzNkU5REQ4Q0M5CgoxNzU0MEQ0REVDOENFMjA5RjEyQzZENjA3ODQ3MEE2
-RTVENjVEQzY4NUMzMEVBNTgxRTNBRTUzQUZDODcyOTkzOTQwRjBEMEM4OUZGRDQKCjFGNzRB
-OEZBNzMwQkJBODJGMDI5NkE5QThGMTMzODEwQjRCREQ4OTAzRTcyMkM1Rjk1QTg4N0I0MTMx
-RThDNkFGQ0QxNEYyOUZGNDIwMAoKNkYwNEFDRDBGMjU3MEMxMDNGMTU0RERENEE1Q0YwOTE2
-OUFENTY1NDI4NTUxOTUwOTFDMDVCNzEzNTIxMzRBNjU1RTZCQzg0RjM3NjQzCgo5M0ExMDYw
-NTdCNzNGNThEOEU3Rjk5REM5QjBCMTZFMUJFRDQ4NDVDQ0ZBRTYzMjUwMjk5RjBCNDU2QkIy
-Q0M4QjkwOTk5RTYwNzNDOTIKCkE5RUZEMjRCQjJGMjM5ODQ0RTQxMkExNUM3NzgwQkUzQTYw
-RkYyQTY4Njc3OTQ0MEIxMUU5REUwQzQyNTQ3QjNEODlCMDU1NjI5QzI2MAoKREE3OTg5MjJC
-QUE1NUZGRkYyRDEyNTNBODVEQTkzODlDOTI4NEEyRTQ3QjYxRjlBNUNCQjIwRTlFM0M5MDZB
-QTk0QjIxMTY3N0YwNzE2Cgo3MDdDMjhDMzk2NzY5NDMzMTRFNTJGQzI1MERFNDlFOEEzREIx
-RTA0MjQ0M0I2NjU2OEFBMzdEMDcwOURGMDRFRjEzNjJFNUI5QkYwODMKCkQ1OUNEM0JDREZG
-NTBCQkIyNkI3QzhDRTM1QThDNERFOTZGMkU0MERCRDlEM0NDMDRDMzk4NDE4NDRGMzBCMzFE
-RDI1ODI5QkVCQjczMQoKOEQyRTFEQjI5MDk2MEY1NEQxNDk4MDk1RDIwQzZGMDVGN0RCNTdB
-M0E5RkRDRTVEMTU0RkZFQkYzNkVENDE4QkY1RkMwOTY1QkY3QkVCCgpEMTZBQThERDMxRTU2
-MjA5NUIwQ0Q3MjFGODM0OUMxNDc2NjkzRDhFRTM2OEVFMTQ5QzNEMjQzNjk4RjU0RkJCNUNG
-ODNGNjVBNkYxNjkKCjNCRjE1MDE3NzU0MjU5OTk0Qzk5M0M2NzZENUQzQjVFMEU4MDVBQkQ1
-QjUxNzVFQzU1QzNEMUFFRTZFRTc2OUJCMUM2MTQ0MjZEM0UyRgoKMkEzMTY3RUFGMkIwQUY1
-QkI2OEYwMjRDMzUxMjU0ODdDM0FDNjcwMjI3RkM0Qjc4MUJFMkM1RERCNjMxMEI1OTgxN0FC
-RDgyRDVFQUZECgo1QUREN0JBNEVDMEM4OURCQzY4RDAzQzEyRUZCRkMwNTEyMTgxNzk0OTRC
-MEIwMURBNTIzMTY1NzE3RDFERUI3MDY1NkM1NzNCRjcwMDIKCkE2NkNBRTRFNjlCNDJBQjc2
-RDIyRTZENUMyREEwNDMxMDM2MDRGMDZBMjk0NTkzMEY0MjFBRUY5QkIyOEZGMTA2N0MyOTdB
-NkQxMEU1NgoKNjIwOEExRTAwMUJDOEUyNTE0REM2QTk0QjU1OTAzOUYxMDM4MUE1QjAzMUNG
-QzczQjk1OUZFMUQyNzBFMDdGQkMyQzREMkFDQkU4OEE2Cgo4OEUxQUE0RDlGNDQxQjgzMUI2
-RTFFODNFRDRDMTAwMUIyRjM5MzI2NDk0ODIzNTMxMkU4M0YxMkZGMjRBMzNBQThBMzMyMjky
-RUJFRjgKCjk1MjY5Qjc5MzU2MjczMDQ4Njc0N0FGQjc5OTM4QkE3OEJFRjkyNUNFNEM5OTRE
-MUQ1OEM1MTE1Mjk2RDI3RDcyNzVCQzQzNThBOURBOAoKQzhENTIxQzJCNTVGNTA1N0MyODU0
-Q0JGQUUwQUQzNjFBRUQwODNGOEE2MzcyM0Y3RTUzNUM4NEZFMjU1MDQzOTg0RDVBQzM4OUY2
-NTUwCgoyMEEzRkJBRTQ4ODMzNjZBRkZCOURDN0QzN0Y0QkU0MkEzQTQwQUE3NDc3MjFENzYz
-RjNFODIwOTM4NUY4MjNBQzFENzA3NkRCODFDOEEKCjAwQTMzOTk4Q0JCMkU1NzREOUM2NTU2
-M0U0QzI0NDI5REZGQzBCOTkyQkYzNDc3QTkwODkxQUQ2QzY3QkYyNkFDMERBMzNFRDNBMjZC
-RgoKOUE1MjNERTRBOEEyNEE0RUVDQTM1ODFCQkJBNkIxODI5NjFFQjdBRjRGQzJGNTY5MDRD
-Mjc4MzdBMDAzNzNDMEE0OUY4MTIxQjlCRDIxCgo5N0YwQkM2NTU5MkVFMEYxRUIxREY5M0U4
-N0Y0NTE0QkM1RDc2MDU3NkUzQTM5QjE4Njg0NjgyQzBERDg0OTZGQUY5MzlENUZCQzkwN0MK
-CkY3NzY4Mzc5MkRERUI4NkFBOTAyQzhCMjIzRUQyQ0Q5NUQ5QUQ5REJENTIyMTVBQTA1RTY5
-MEZBMjI4MzFFQzFFMjMwOEM5N0I4ODJBRgoKMkYxMEQ1NkRFMDhFQzUyNkI0RUQ2OTZBMTYw
-RTEzOUI1NDA3MjY4RjFFMTdBNzEwQkE0RjcxQTgzREY1MzE1NkE5NUIxMjI0RTVERDE2CgpC
-NEYzRUFERTA3QjU3RDlGQTA2NERENDg3RjRFODRFQUYwNEM2OUNFRTJCQjhEQjg0MTE4NDlC
-ODgzRUQ4MTM4RTIwMjNCODJDQ0EyMjIKCjgyM0UyNEY4MEI4ODE2OTM1QUMzMEJDRTE4RTkw
-NTZCNEU2MDk4QzdBNzhBMjUyOTczQUExOUE2RkQwQTg3RDQ4NjE3MjkxQzNFODZDMwoKQzYx
-NDBDRDIyNUIxMzkwNzBCMkU1NUY0QkYyQkQxRTc1MkREMkY3QzJDMDE2MzkzOEIxQ0FERTZC
-ODBFRTBFNEEyQUI4MTE2MzkxNTdCCgowMUU4QjExQkIwMkY0QzNEMDlGODZGNkExNzhEMERF
-NUZERjgwNEYxMDJGNDhENjZGNTg1MENCNjg1NzQ4RkMzREU3RTBBNjU3RUI3N0UKCjczMTFF
-OThDQTgwRDk2RTdENjBBNkExOTIxRURFODU0NDE1QzM2NDQ0RkMxQzRFOTBBQUEzMkQ2NzVC
-RjZCMzZFQTg3ODE4NjE2RUE4MAoKMENEMTI1OUVBQ0VBNDEwNUYxRkFGMEQzOEFBRkMxQkM0
-MjdBNEIzQUI5QzgzRkIyMkFCRThCQzJFNjA3QzFFRTVEMzg3MjAwODFFQzRBCgo2M0EyMTc0
-RTRDREI0NkVBRURDMUQ1Mzc3MUU3MkM3NjNDN0VGOThGOUNFOUU2RDkzQkU5OEU1MDM1NzFD
-QTE5OTEwNjY3RTk5MDBEQzEKCjY1RDc4RUFEMTBGODc0OEQyQzZDN0JEOUFBNTU3MURGNzk4
-QjYyNkUwQ0NEMzkxNDE1RUYyMkQ3OEFERkIxMUFDMTgyMTQ3QzUwQTE0QQoKMTUzRkIzRENC
-MDkxRDM3MjkwODkxQzNEMUM0NDAxMjcxNkU4NEU3QUEzOUI1NTA4OUQxMzM3MTgxOTUwREE1
-QkY1MkUzOTcwN0UxQTc1Cgo0MzU4MThFNDRGQzAyNjlGNkZBNEUwMzRDMThCOTRDQzBDNkQ0
-NzUwQjQzNzJEMjhGMjRCOTgyOTI3RTVCQ0M5MTBDNjZGODI2NEY2QUQKCkI1REQxMUFBNDY1
-MzRGNkYwNTdDQ0Y2NTBFRkQ4RjFFNTY2NjdDN0I5OTU4RDU2MjlCMjI3RTEyMDM3QzA5OEM3
-QUI1RDU5ODZCQzBEMQoKMkFFNUFFNTUyOTgxRkZCRUExQzAwQ0I2Q0M1RUE5ODhBMjk0NEM3
-RjNBMjM4ODg2ODMxQzQ4REM4MUYxNzlCOUY4RjY4NkQ3RDBEMUFFCgo0MzZBMDg5N0FBNjI1
-NUQzMDQxQzFFRkU3RkM2QUVFNjVBRDg2MDhEQkFDQjJDNDBCQTNDOEUxNzhFOEYwQkMwNEQy
-NzM0M0UzOUMzQjUKCjkzNDk4RkFDODg1NkVEMzE3QTE1Q0VBQkIxRDk4ODBEMUExNTZCNENB
-MEUyQUU5MEQ0QTQyRjIzODM1MjNDMjFERUNFN0QxQTkyRUVGMgoKMDlFODExRjQ0QzQ3MDFD
-MTczN0U3Qzg5NTFDMTQwRjQ0NkFDMDk5MUZDQkFDQjlBNUQ4QTlBMzZDMjlBN0RGOUZDQjU0
-MDUwMzRBOThECgo1NTY5MDBCNzIzOEEyOUU0RDFDNDY3NzBGQjg1QTFDOUQzNDVGNTREM0Yw
-MUZBOTY2RjZBMURCOTIxM0MyMTQyQUU2QzZFODgzQkE1QTYKCjMwN0Q0MjhBNUFGQzBFMDlB
-QzI2MTcxQUU1QjM1OEFERDExQUU2NzAyMDk1QkY4MzJBMzVDMzNBMjZFMjJDMDZCNjBFN0Iy
-MTdFNDM0NgoKMDk3OTM5OTI3MEY1NTU5QTM4RUE4Njk4NjMwNjIxMUJGMzdEMDFCQzA5OTBD
-MzhCQzRDRUIwM0M3NkE5RUU5ODRBNkJFMTlFMDk2RDMzCgpDRDVEMTk3N0REMjM3Qzk2MDBG
-MThGRkVEMDRCQkJFRkYwMjRCQjA2MkM3M0VDMTJGQjAwRTVFMUQ1RUEzMjE0OTA5MzQ1NEVG
-MjcwQzEKCjRGOTQ0NDZCNTVDRTU2QzlCNzAwQTEyQUU3MTE5RTc4MTJBMTQ3MkJDNzBCNTJC
-NjdFMzA2MDhEOERBODEzMzFFQzlFMEYyNTg3QThGQgoKMzRGM0RGM0RGMDQ3NjA0NjgzMkIz
-NzFGMjEwRjZGQzgyNjhDNjdGMDdBREVBRTAyNkNGQzE5MjFCQUU0MDUyNjgwQ0ZDQjM3MzA1
-ODA2Cgo1MjlFQkY2M0Q4MzI3QTFEOTI0QTdFREVFMTk1NUI5NDQ1MTBGRUM5RTI0M0M4NzJG
-MTBGNTMwMUIxRDAzQzJCQTI0OEI1N0QxRTEwMjQKCjJCMjY2QTlBNjE2OTFFMUU5RTA0MjFB
-ODlFMEQyNjdDMUM4N0RFREExMUYyNUVBQjg2QTY5MjBCOTBEQTYzREE1MjQ1QUY2MzlDQjY5
-RgoKQzRFOEYxMkM5MUNBQTI2NjEwQTFCMzIxRjkxRjkwQzc5NzcxQzkxREM0RDJGNjg4Nzg2
-OEQ4MkM5MjhFNDU3NEMwQTM5NUNBMUZENTgyCgo1NDlENjAxRjkyNzRBRTU1REQ2RjE0NkJE
-MkE0NDQwODg5NDdFRTlEMTkxRkM1QUQ5RjVDRTUyRDNBMjY3RkIxNjVENTVCRjcwQTZBODIK
-CjEyMzQzRTczMjhGRUZCRjMwODNBRjUyOEZFQzgzOTYyMjg2NzhBRTIxNTM1NTdGOTMzOTlE
-RTU1Qjg4MEIwMjBBOTIxNjg3QjRCNDcxOQoKREUwN0VDNTdGMDBCMkJERkUwMDNBOTVFMzIx
-MTExOUJDNzJGNDY4QUVEMDBFRDkyQTE4NDNBMjhBRTEwNDE3NTIzMUY4QTI0NkJEOEM1CgpF
-MEYyRkVBREY2NDM1NDdFRDMxMjBCRjQ5NTBGQ0I3MUFCMzNDNTkwQzc0MDA2QThGODI5RDQz
-QTlDNzJFQURCQzdFOEE0OEVFM0U0RUYKCjJDRTg0N0QyNzVGMUQwNkIzMDVEQ0EwQTdGMDIz
-NEQyNDFBMTg3QTNBOUQ3Q0NGMzkwRUFEMzA1RTVEODkxMTBCNUQwNDUzQjJFMjlERAoKMkUw
-RTUzMTNGOEU1RjgyNERENTJEQzUxNUM0NkE0Q0Y0RTdFNUQ2MjJDNTkwQTg4NTRDOURGRTcy
-NENCMzc3RjI2ODUwODY3N0I3MDFGCgo0Q0RDRkYzNTAyRDA3MkU1OTdFM0Y5RDVGM0RGRUQ4
-QkNENDJBQTdFRkE5NkI2QTkzQTQyNjQyMDg4MjAzQjA3NUVDNUNCOTczMkVEQ0UKCjQ0ODM1
-MThFQTZCQzA0QTlCRDUzMUZBOUQwRUQ2NTI1NkVBM0ZBRTBCMTQ5M0ZGMkNCOEZCQTRDN0U1
-RDhBRTFDQzI0NEM4MzRFMDBFNQoKNjk0NTk0RUU5QTVBOTMyNUM4RkU5NUMyRjZGRjg0OTQ0
-NkU0MTc5MThEODhFMDBFODZENTk2NjRFMUQ5NjUzMTBEMzU0MTk5QkVEQkFFCgo1MzY2QzE4
-M0RGMUQ1RDFDQ0E1RTY0QTQzNEM1MDY3NUNBNEYxQUNBOTcwNDIxNUJDNUExRkNENEMzQTI5
-NkNEMjIzODlERDgwOENDRDAKCjg3QUFCOTIxRjVFRDExRjM0RDJEMDMzNDg2MUYyMTQwODNC
-QUM5NTQxQzA1RDc4QUJFNUFCOURGMjUzRTdFQzQwQUIzQThFNjlDRTczMAoKQUVBQjYxMEVG
-OTJBRkVCOTM3MzNDOUNEOTU5MEIxQjFEOEEzQTVFNDREMjJCOTUyOEU0MjlDREU3QUM0MTIz
-QzBEN0E4NzM5RUQ4QkM2Cgo3QzU1ODNFRUQ3OTAzRkEwMzk1MTcxRUZGNDQ5NzNEQjFDRjA1
-MkRGRjgzQjREN0ZDQjZCOUZFRjdFRjA4QTREN0MwRkFCODQ0RjJGOTAKCjQ4NTEzQTZBM0Qz
-OUE0MDdDMzNERDUyMTQwOTcyNEE3OUY4RTg4REQ2ODM4Mjk4RTE3NDczODI5QTIwNDk1Qzg2
-Mzg2N0RCOTcyOUY4MwoKOTJDREVDRDI5MUI2MDFBQ0I1NUJDRjlCQjE4RDg3MzM2NEVEMDNG
-NTE2MzFFRTg4NzI0NkQ1NDgwQTFCNjAxRkM3OTJEQTZCNkQzOThGCgpGQjU4MEEzMkU2NTlC
-QTRCMDc2NDY1NDAyMzQyNkUwRjVFNTEwNDU5NDNEMkVERjA1NTdERkM4RkVGMjg3Q0I3N0I4
-RUEzMjA4RTI0NjYKCjMzMEU3NjJDNTNEOEYxOUUxNzM3MDhGRUM0ODRDQTZFRjA5MEEwQTY1
-QTE5MDM3MEE4MDMwRjg0Q0Q0Q0Q2OThGNjVFODEyNDhFRDEzRgoKOTFBMEMyMUMzQjBEN0M2
-MzM3ODg3QkJDQTlFNUQ2NUNBNjUwN0M1ODk2MDM2N0QzNjgxMEU4MTNCMDYwRUY5QkU3RDM0
-RDRBQzE1Nzc0CgowNkU5NzY0MEYwNEI4N0QyMDNERjQyQkQ2NTEyMjlDNTY2ODFEMjk2REEx
-QkE3QzA5QUYzODU4M0MwOTBEMDQwOTgyOEY0NDVCNkE5REYKCjQyOUEzNzRDRjJERUU2OEZE
-QjVGQTRBMkJERDREMkNDMjVFNDZGRTY5QUEzQzM0QTU5MjI4OERBNERDMTcwMjU5MkZCMDUy
-RERGMDBEMQoKNEFGRjRGRkNFOUU0Qjc0REI0MTBFRjk5MENGRjYwNkJFQjZCOTBBRDM1RDMx
-NzlDREZGMjg1NTgxQTNEMTYxRDk2RjRERTY5RTVENDBFCgpCMzQ0RTVEMjNENkYwQjQ3QUJB
-OTJEMEEzRUZGNjdDOEYxNkQzM0RCQTRFRkY4OUM3M0IzNDQ1MEQxM0I0OEI0RjA0Qzg3RDE2
-N0ZBOEYKCjcwRTlBQjE3RDYwM0M0QzFBRDA3ODczQkYzMzY3NjBFNjU1Q0JCNkFDM0ExOTdE
-NjI1NTFBREVBNUI3QzFFRDUzMDNEODU5ODAwMEZDNAoKQjlFNzM4RTI2NzlGNUFBMDhERjA3
-QkE5OTQyNTMwMDAzNjYxNTdGRUJDQ0UwRUE0NzVBQTAyMkIwNDY0NjExODdDMUVDRDg1RkRF
-Qjk3Cgo3QjJERjQ5NzBFRTAzQzk5RThDMjQ4MDQ0ODREN0I3QTQyNkFDRjgyQjA1QUZFNTFE
-NTA4M0NBRDY4RjE2MEFDQzkwMzNDQjc3MDZDQkUKCjY4RDQ0OTk3RUQ1NEREMEQ3NTIzQTAz
-MjAzNkVERTUwQjIyMDBDRDQ0RjlCODlBMUREMEY1NDFEOTc3QTE3QUQ0OUU0RjgyRkVDQjlF
-NQoKRkY3QzUyNTE5Njc0NkU4RjQ5OTA2QjlCMjAxNEJGNkUxQTlBNkYzNTZEQ0I1Q0JEQjQy
-NzM5NEZDQUQ4NTg4RkYyQTBFRDY3NDMwRjE1Cgo3NUIyRTE2MTdGN0Y3REQxN0U1RjEyRTA0
-MDY4MzRCMjgwMDJEQzdFNzRDMkM0RUJBQjQ4QUZGNDMwNkNGQjJEMTczMDFDQkIyMzhBQzMK
-Cjg1QTQxNENBODRCOTg4QzVFQzVBRTI5M0YzQTZBOTQ3RTcwRUM0QzdGMDk1NkFFMTIzRUI3
-OEU0NkM4RjlCMkU3REZDNzVEQUU2RTUwOQoKMTk4OTIyNDkwMTRCRURBN0ZEMDY2NDVFNkRC
-OTE4QTYwOEVGNEMzNzNFNzE3OTkyMURENkZEOTQ4MzJDMEZEOUMxNUY1NkY3ODQ2OTRBCgo3
-Nzg4RkIzM0I5RkJBN0VCOUIxQTE5Q0ZFNTc2Q0E5OTNGMEZGQzMxMzk4Qzg5MTY3RDVGMUQ2
-QkQ4ODY3MDFCMDdFNzg3ODUxOTEwRDYKCkIwQkY5NkI1MUNDMUM4QkQzRDBCQkEwMEZCRDAw
-ODU3RTQzMjlDMUU5MDkyRTIwRTQzOTU5MDlCREJEMzM0QjAyNzI1MEJBODU5N0Y1NQoKNzlE
-RkQ1NUNDRkI1NzIxRkM3QTU1NTQxMkFCRTQ5RTNEREJGMDlGNzIyMTIwRDY4MUI2QjE5RkEw
-MDI2Q0RDMzA5Nzg5NzZERTgzODg3Cgo2OUM2OEIzQzMyMUI2MTEzRDNBRTMyRkQxQkRCN0Mx
-RjFGRjhGNEREQUU4MUZGQzEzMUFCODMxNkZBQjMzQjZGREVCRUVFMkYxQzQ5NkEKCjgwNUU0
-QjkyMEYzODE2QkRBOEU0MTY3N0RFMzZFRTQxM0U4MEM1MDBCOUZFNEUzRUVBRDAxMTQ2MzBC
-QjFBOTU1RDBGNUM3NzYwMTgzRQoKNjhDMjI2MDYwQjA1MTcyOUY2RTFGNDZDNzUxNjgzOTJE
-MEFERkNDM0RDNTJGMjkwMzg0OUM1QzFGMUNDNEEzOTQ4NkZEODQ0MDExMTJECgpDMUY5NEVC
-RUFBM0EzQkQ0RjI4Mjk3OEFGOEMyRkRFQTMzNjRBQ0IxMTIxRUI1RjU5M0YzMzJEOEJCM0Uy
-ODA1MzBGOUIxQTU4MDQxQkUKCjYzNTA3MDQzOTExOTBDMjRCRjBEQUEwNUZGODc2OEYwODRF
-Njg3MDQwMUZGMzQ2QUM3M0VBQzhBNjkwNjI5MEFCMkJCNThBQTdEMkMwQwoKOTAxQkZENzE0
-QzQ1MTg4Qzc1MDk2MDU3QUVDRTZDRjQ1M0I5ODUyMEFBNzM0NkU0MkU0NDk1NDlFQkRFNEI3
-MEIxNkY2NkY0ODY1NUI4Cgo3RjBFRDQ5MzVEMTA4RTkzNDlGNTdDNTc0NUVERkEwMkQ4M0VB
-QTdFRTdCRTdEN0ZBREJFNjZENjI4N0E2MUNBQTFGNDY4REU5REY1OEEKCkRDRDdENDY2N0Ez
-NDFGNjc0OEEzNUMxOTAzMTc2N0NDMkUwQjI1QjYwMTBDREIzMURERDNBODE0MTBCNzgyQjRB
-NkNCNUM5REVCM0IwOQoKMjZEMkU4NkM2OUM2M0JBRjE3MDU1QUJBNUFGMzlCMjM3QzUzRDNB
-NzlDNTYzOUMzQUM2MzhFMTU5MkE1Qzc0MkIzRjdBNjVDNTU3Rjc2CgowQ0EyRTY4QTBCQjI3
-RDBEQjQ5M0RGNTM1M0Q3NTg0OTMwNEYzQjE1RDQyMTE1RjU1NzE3MjAzODE3RDFGNkNFNTU2
-NzM1OUNDRTcwODUKCjM3MUJGMjNBNjA4NTFCOUJDN0RFRTE5QkJFNDBCOEJGRUVCODVEMjBD
-Nzg4NkNCODlCMjFCRDRERDU3NDE0OTU4RUNEM0I1Q0NENDBGNQoKNzgyNTM3MkNCODkyOUFE
-MjY4MjFGMjgwRkM1QkYzRjkwOUI4NDU0MjQ4NjY1RjM5RTg3QUMxMjY3OTAyMzU2MUQyRTRD
-MTcyMTVDQzgwCgoxNjM2MDBGQkMzQjJBMzYzN0ZFOEFFQzdFNkU5MTQzOTM5QTk2RjlBRkY1
-NDQ5NDRFRTkxNEJBMDU0RDZCNUQwMDcwQzE2Qzk5RDNFRjEKCjBBNUNBNjM1QzgzQTE1NEQ1
-Nzk5QjdGREMzMTE4MjdDOUU5REQ2NTFDQkE1REUzMkEzRUNCNDMyN0JBRjA4RDkyNEVFREJB
-MDU5QzMzQgoKM0U3RURFMTU5RTgzREU3MUVFMDg5NEMyQTcyMDE2MThBQTM5RjM5Q0MzNTc0
-REZENjQ0Q0I0MTYxOEE2NjhCRDhEMUJGMDdGQ0UzQUIyCgo4MEUzQUFDQkQ5RkNCOTBDNEQ4
-QTQzQkUzQjcyQUVCOUU2Nzg1REVDNkUwOUE2Q0JERDk1QTJBQzdBMEJCRDQ5RDg2RDI5QjA4
-RThGMkIKCjk5MTM3QjJDMzFFREMyN0RFRTZBN0Y1RkFBMzlEMUZBRjBCREI5RTA0N0M4M0ZF
-NTk2Qzk1OEEwMUY4MzUxNDkzNjlCMDY0MUY4RUE2RgoKRjBEQjMwM0VCRTU3NzI0RTZCMTA0
-OEZGRDdGMzE2ODJEQUZFQkMxMTAzODUyMjczREQxOUJDOThDMUM1NDUyRjg0MUQ1RUQ3QzJG
-NzQ2Cgo2ODkzRDIzQ0M1RDZEQjQ1QjUzQzkxNTA4NDVEN0VCM0Y0MjI3Q0I1MzYzRTNBM0JG
-NURBRkQ2OEQ0MTVFMjgzNkI0QUI1MzYyMTEyNUYKCkQ3Q0JENkI1NTFCM0QwQkQxNEQ2Mzc3
-REFDRDQ3Nzg3NzM4RUYwQkU5OEY2ODdDNkNERENFRjBENzgwQTFERDhDRTA4QkM5QzAxOEU5
-NQoKQUU0NDQyNEFGMTA4MEY1RDI0NUQ0MkEzQTRDMTdEM0UxOUNFMzQwRTk3QzcyMkJEN0VD
-NTVCMDk3MzVBQUNGMTNGQjJGQjk5MDY4MDJECgowQjM0Q0FCMUMwMjc1OENCNEZFMzFGQ0Yy
-NzU4QjNBNkNGODM1M0UzQzUxRjM5OUFGM0VDQUMyRTEwOUM5OTlCRDE1REYxMTQ4RTM4RDEK
-CkEzQ0VGNjQ3MjI1Q0E4Q0M0NUI5NjJBNjc3MzFDN0RBQkQ5Qjc1NkRBRUU3REM1RTQwNzRF
-M0REODE4RTNERTkxMUMxRkZBOEI2QzFBNQoKNEYyNzlDODcwNEE2MUM2Mjk3MzNCQkYyRjIy
-N0YxNzE1MTJBRDdGQjVFNzJCMjY3RUIwQTdCNkM4NkMwRUU2QkVDQjQxNkE5QzQ4NjdECgpD
-MzcxNjgyNjQ0OERFQzNCOEIyRkMxNzJGRUY1MkMzOUEwNTc0Qjk3NkI5RjNCRkM1MzQyMkEy
-MDMxM0YwQjA1ODYzOEVGMTg3MDU4N0EKCkEwMkQ5QzRCOTZBRjRGNTUzNjU2MkZGRjI2QzFD
-QkRFRkFCNUE2Q0U4MUYyNTA4NEU5MDJGNTZCODQwMzE4ODQ3QjVFMzE4ODM2NDdBMAoKMzA2
-MzY3M0JCMkQwQTdCMkMxMjhBRkQyNjFDNDM0RDFENENGQjA4QzUwMDgxQzIxNjkyN0MyODk1
-NEE3OTE0OUFGMTExNzA1RTU3RkZCCgpGOEM4QTEzOEFBMzQzRjE2RDU0MEUxMzhFQ0I5ODE3
-RjkxQjA0MEZBNjVEOTBBREE2NDJERkM5OEU0MTREM0M5MDlCRUJGMUE0NDJGNjgKCjBBRTky
-RjgyOUQwRjEwQkQ5OUJDMUYwMEU3MzQ1RDA1MTMzQ0EyRjNCQUVEQ0M2M0VENkREOTJEQTg2
-REY0Qzg1QzlENzdGQjRCMUQ5NQoKRTY0NDkyQ0MwRThGMDQ2OEQzRTU1RDExRDk3NTk1ODc2
-Q0MyMjI1NDE2RUIyRDEwNDJGRDhGQTA3QTZGREQ0MDhGNjE5QTBDODRCNjVDCgoyMDg3NkEz
-ODYzOERCRkU5NzNFRDdEQ0I2QThDRTdFQ0FDMEJDNzEzNDlBQjJERkJDODY4MkMxRDVFOEFD
-OEZBQzg2QkE5NUE0NkUzOTEKCjExMzU2MDJBMTQ3QzcyMDVDNEI0OTUxOTk4QkIxRDcwQkM3
-RDMwRTcwMDRGM0M4MUNGQTRBMTM2NENBMUNCNzI4ODU5RjU3MDk1QTA2OAoKMzNGQTU3QjJB
-RTZBRTAwNDU5MkFFODdENkE1N0JGRUU0QkZEMzlCNzdDMzQ0MTZFMjMxNkE3MzlBMjcwODRF
-MkZEQjlBOUE4QTI2MEIxCgpFOTI4RDE0NEZCNDNBRTVBODlCMDU5OTczODBFMzA5ODdEMzE0
-MTRFQzkxNkUzQkQzMzhEMEQ4OTk3NTI5QTE3QkVEOEFGMDFDQUQ2RDEKCkNENEVFMDZDQjZD
-MDU2M0U5MUI5MTk5MDNCQjVDMEVGOEM3OUFDRkJBN0NEMERCODk4NDYwM0Y3Mjk2NzJEQzQ3
-RjZEODQwRDkxMUJDQwoKM0ZGM0YyMkY1NjFBQTVFREEyNzgzQjVERkY4REM1NzNBMDZFODM4
-M0MxQjc0MjAwMDNGRUVCRDc1NEI2MkJDNDYxRDMxNEIzODNENDgzCgpDQjMzNjYwQjY4MUI2
-QTA0MjRENEMxNkI3MzBGOTc1OUQxQzVCOENEQzc2OUQ5NkU2NzgxNzAxNkNBNTM1NkM4RDQ1
-ODM2QzI5N0U1QzAKCkNGODA4MThFNURERjZGRDZCM0Q5NjIxMkE2RTNGMTI0QUIyQjIyODFD
-N0UzMkI1QTExRjczN0M2Q0Q5QTg4NkIyREJDRUZDQURFNkQ4QQoKRjhBMzkyNzA1QjhFRUIz
-RUU3NzE2QkU4NjVDQTk5NDYxNTg0MDIzMzNFNDM0NUExNDNBQkNDMjRGRkI5MjgwRDIyQTJF
-NTM4RkM4QzA4CgoxNEE5RjgyQ0NCQkIzNTBGREUwNDdERjkxN0UzNEI3RjlBM0Q1MjBDOTc3
-NkE1MDEyMjVERkI4QTU0NDBGOTE5ODAxNTVDNjlENjlDMUUKCjhCNzcyQUMxQkVERDg3MEY1
-MTZBMjU2Mjg0NDVBNjg3OTNFQjQ2RkYzMjdFMjMzREUyRUYyNDI4NTA1RDc4RkJDRTFFOTMz
-NTAwQkMwOAoKNzVFRjJBNjU5MTA1QkZCODRENjJDRDg4NDlCMTNBMEEyQUM1RDMyNzAwQzY2
-MDQ2MEJCQ0JDNTA4QTY0NEJDMjFDMDI5MTVENDREMDcxCgpFNjk5NzU1MkYxQTQzRTc3MUM0
-MUQ5QTcwRTUyRkFGQUVDRDczQUY4RjUwRjdGMzhEODVGOUU5NjhFMTc4RkVFNjg2Rjc2QzE3
-QjVGQjUKCkMxMjM1RTc0RUM4MTI0MzMxNTU4NTY2NzdDOEEwMUNFMzI5NzE4QjAxRTg0Njkx
-NjVCNTREQjZEODYxNjU4RTA3M0Q0MDdGQTdEMjk1RgoKNjlERkJGNENDNkUwNkY3RjRFREU1
-QzlGRTA0OTA3REUwRUFGOEJCREI3M0FFMjQzMTNGMTQ0MjYxNEZBOTFDRUNERDFGRUVBQTM2
-RkVFCgo5NjkxMzFCMjAwMzM0RUVEQTQ3QTdCMDI5Qjg3MkE3OUVCRjdDQkQxMDgzODhDOTBB
-Q0MzQTJFMDMyOEVENzAxMDZDQzVEOTYyQkE3MkIKCjRGQTFENUUwMUI3NDc2Mzc1MjI3Q0FB
-RDA4Q0M2NjlGN0VERTM5OEZDRDQ4RTRDOThBNkZFNTkyQzYwRDI2MkQ5QTgxNEYzNjQ4NzFB
-RQoKOEI5RDg4MTAyOUNERUJFQTIyODA1RTU4QzFBQzg4RUEzRDJBMTRDMDZDOTlBNjk5NTIz
-NkNENUI2Njc1OTUyMUQxQzYzQ0FDMzNFNjMxCgo4Qzk0NDFCMjBBRTUxRjZDNTQ4NENENUM5
-MjMwMUNERURCQjZBQkQzMkJFQ0MzMjczOTIxOTAwRDEzMzAzMjIwREI0NjA0MkM3MjAzNDgK
-CkY4RjU2NjBDOTYzNTQ5OTRBOUY0QkM4ODE0RkQ0REU3ODY1MjZFNzYyOUQ0MUY1MjNGOTJF
-NjEyRURGNjRDMDgxMDYwMDQ5MzM2OUYwNgoKMzJBQ0U0QkFCRTQ0ODhGQjIyOTJCRjZCNTYy
-OURGNTA2MkZEN0QyMDM4Q0Q5ODU2QTEzNDMwRkNGN0U5NDQwMjY3QUUwN0E0RURFRkEwCgow
-M0I4M0RBMzY3REJCQzMzRjQ0OUY5ODdBQjRDOTBDNkI1NEYyRkI1REM2MTRENTBDODAzRTZB
-ODVGNEJEQUQ5RjMxQzNDODNGOEM4NEQKCkI1MTk2MEY0Mjk3OEY1OTc4NDc1NkZGOUQwNEMx
-NDg5OUM2MDE2ODE2MTUzNjBCMzQwNzdFMTEwQzZGQjVFQjdFRUM4MUZEMjFDOEFEQgoKRjUw
-ODZCMDI3RDExREI4NTMzMjQzMzk0MDNBMTU3REQ1OTNDMEM0ODJDRkQ2RTQxQUQ1OUU1OEM5
-QTk0ODFBMzkxMTUyMTUxQzUyMzJGCgpGQzlGMTY0NzU3QTA4RjVEQkZENUYyMzlFMjE4OTE1
-RjQxMDE5N0Q1OUFEODRCNDNBQTM0QjU3N0U5RUVDRjY5NDA4NkFERkRCNEU4QkQKCjkyNTU1
-NTBEMEU2RENDMEY3RjIyQzM0RTYzNjc4NTQ1RjJCMzQ0MDBBQkU3RTRFMzEzMUQyMENGMEIw
-MUEzQTI2NkVDNDU0RTNGNEQ1OAoKMjRFNDY3MzJDOUIzMDRFQjRCN0Y2QUU2NjBBMERFRjc0
-RUI3QTM1NjI0QzRGOEVCOEQ0NjdBMDE3NkRFOUFFNDU3RUY2NzBCNTU2NEMyCgo3NDlCNTQ1
-QjI4NEY2MzA4N0EyRUEwMkNBOTdDMTE0MkE3RTZFODFBQzdGNDQxRDVDNEFGNjhGMzdFODUx
-OThDQkJBMkQ1MDlBMzZBOTIKCjk1RjAyQTRBQjZDMDhFMDAxRTY5MTU3N0ZFNzUxMkI3QUU0
-MzdCQTIzRDAyM0UyNjMyMEZERUYyNjJBNUI3QzMyQzUxQUFFNTQzNzk4MwoKMTA4M0Q1Q0I4
-NDc4OTYxOUE2MDVBREFDQjVDRDBGQTVEQkUyQTREQkI3QTUyODdDMTUxNjk2RDJERUM2QkUw
-QUIxMTIyRjE5QzAyNkM4Cgo5RkU0QTQ5QkE4Mjk4QzA1Mjg2NzczMjZGMEQ0MUNGQzJCQjY3
-RUE5REVGNzA3MjJENkUzREYzRTczODY2OEY0QTlDQjJFNkE5N0U4MUIKCkE3MTdCNTk3MThB
-NzgxOTJDNzBFRTlFN0VBMDZDQ0RCQjQwRUE3NzExRDA1REVFMjY0RUNBRjlDQTQ3Q0E1NDJF
-QzVCMTdEOTY4Q0YwRQoKRTMzNDI3MkRFMjY0QjI0M0RCRUM0OTBBM0ZDQzNBQTM0NjM4REI0
-OUMxMkMyNTc0QkUyMDZGNTMzMzE0MjlFMjQyMDYxRjAyOTM5OUQ3Cgo0ODUwRkFDMkIxNEM2
-OUVFOERCQjYxODdENzgyQUEwRjlBNDBDNUI0QzZFNjYzNDc0RTdCRjQ1QzMyRkQ0NTkzQkFG
-NzIzQkRCOEI4NjYKCjMxNUE4OThFMUQ0MjlBOUJBODlENjE4ODM2NDMwRkY2NjAzMTM3MzM0
-RTdDOUYwM0U3REI3QTY4Q0Q3OEExRkYxMTU2NkQ1NTA2M0EwRAoKM0JGMzBBODc3MjcxMzBF
-N0ZCNTAyOTM3OTRBRjVCQzQ1RjU4MThFODk0OUExRjRCODA2OTI0QkY2MjlFQzQ0M0M1QUE2
-RTE3M0JBMTI2CgoyMkEzNDZEOEIwNzFGOTFFMUQzMDVEMTU0MEZBODNDQThERUE3RjA5REM4
-MDMwNUI5RDM5MkJBMzFENkU3MTcyMkQwQjk0N0MyNkY3M0EKCjcxNjYxRjgwMUE5RDA4QTdE
-RTYyODg2QTM5MDM2MUZERUEyMkYxRkU2N0VFQzIxNTNGOTk5NjUzREVFQzY4OEYyNUI0QjlE
-NThDODE1QwoKQTQ1NjgwNDM2MERFMjk0QkZCQkZFNUQ3NDVCOTQ1MTFDMzA0QkQ1Mzg4RkJC
-ODREQTRCMzFFNjUwMTc4Q0MyNTczMTY2NzRDNUEzRUFECgo5MDgxNzcwRDg4NjgzQTEwM0ND
-RDEyOTgyNDY1QTdDQUExQzkwM0NFRUNBNkVBQTExNjk2MzdCRDM3MEYxOTAwQzkxNDNGQzMy
-REY0NEIKCkJCMkQ2QTRDNEM4OEVERUVDMTZDNTk4NTQ1MjA4NDAxRDA5ODUzNDdBRThCMkEx
-NkY5OEJGOTJDQjQ5NUQwQ0FBOUYxMzdERDUzNEQ4NwoKOUQ4OTAyREYwQjQ0ODQ4QjNFQUMx
-QzM4MUI4QTc3MUY5RjgyNkExRDMzRDEyRkQ0NUMyMjBFOTREMUMxOEI2MzBDNDZENDE2NTlG
-NDg1CgoxNkJGNkMxQTUyRTE5NTFBRUQxMTVBRTlENEM2NUJBOUY3RDQzNjgwMkE1NjczOTIz
-RTY1RThCQUI5ODVEMDk0ODQ2MDdENjk5NzkyOUUKCjA5RUIxREJBMURGQjMzQkEyOTk5QUM2
-NDYwNzM0MzEyQzY4Mjc0NjdDNzBFRjA2MUZGODUwOUNEOEQ3OTE4MEZBMEM5MkEzMEI4RkY1
-NAoKNTlFRDEzQ0Q1MTU4QUYzQ0I5MTNEQUI0Q0I3MEFCRTE4RkUwMzY2MDAzNDk5MDIwRjk5
-NkI3ODdGQzVCQjRBNzY3RUYyNUUzNDE3QjRGCgpDNjZFQzc3MDZFNjg5QTU1MUIwRTRBQTE1
-NzU2NUM0QUM1RUE0NDUxMUQ5MDg0Q0I0NUIzQTVGOEVDMUM4MjdDQTQwOEIxNjIyRTUxNzAK
-CjNBNjcyMEQ3NEQxQ0I0NUI1QzRFQTU2MDc2MjAzRjMyMzVCNUQxN0UwMkYxOTU1MTFBQzNC
-MUQyMTNDMDFCNjA0NTI5NDc3RTMwQjFDNQoKNzc1MTgwODY3NkMzRjMxMDM5MThGQTIyNEIz
-QzJDNjVFMDMzOENDODFFMTFBOUFDRDJDOUY2Rjk5NTA0MkU2NTRDM0RFQTI2RkMzQ0YwCgpB
-MDk0QkFGNjM4MjJDQjMwMDRGMjc4NkVFNzRDODZGQjhGQzY1NDJCRUY3MUQ5NjE4M0ExQTRD
-OTRGMDFGOENEQjBBRTFEREFEMTkyRDYKCjFCN0FENzA4RDM0OThCMEVFMTIzRUQ2NjIyNTk3
-NkU5MTI2N0Q0NUMxODQxNDhDNjFGOTlCQ0ZDMTFERERGRDIxRUQ3NkQwRkM4NjFCRgoKNzkK
-CjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAKCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCjAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCjAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAKCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAKCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCmNsZWFydG9tYXJr
-ICV7cmVzdG9yZX1pZgoKJSVFbmRQcm9jU2V0CiUlQmVnaW5Qcm9jU2V0OiBzdG9uZXNzYmku
-cGZhCjExIGRpY3QgYmVnaW4KL0ZvbnRJbmZvIDEwIGRpY3QgZHVwIGJlZ2luCi92ZXJzaW9u
-ICgwMDEuMDAyKSByZWFkb25seSBkZWYKL05vdGljZSAoQ29weXJpZ2h0IChjKSAxOTg3LCAx
-OTkwLCAxOTkyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNl
-cnZlZC5JVEMgU3RvbmUgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBJbnRlcm5hdGlv
-bmFsIFR5cGVmYWNlIENvcnBvcmF0aW9uLikgcmVhZG9ubHkgZGVmCi9GdWxsTmFtZSAoSVRD
-IFN0b25lIFNhbnMgU2VtaWJvbGQgSXRhbGljKSByZWFkb25seSBkZWYKL0ZhbWlseU5hbWUg
-KElUQyBTdG9uZSBTYW5zKSByZWFkb25seSBkZWYKL1dlaWdodCAoU2VtaWJvbGQpIHJlYWRv
-bmx5IGRlZgovaXNGaXhlZFBpdGNoIGZhbHNlIGRlZgovSXRhbGljQW5nbGUgLTEyIGRlZgov
-VW5kZXJsaW5lUG9zaXRpb24gLTEwMCBkZWYKL1VuZGVybGluZVRoaWNrbmVzcyA1MCBkZWYK
-ZW5kIHJlYWRvbmx5IGRlZgovRm9udE5hbWUgL1N0b25lU2Fucy1TZW1pYm9sZEl0YWxpYyBk
-ZWYKL0VuY29kaW5nIFN0YW5kYXJkRW5jb2RpbmcgZGVmCi9QYWludFR5cGUgMCBkZWYKL0Zv
-bnRUeXBlIDEgZGVmCi9Gb250TWF0cml4IFswLjAwMSAwIDAgMC4wMDEgMCAwXSByZWFkb25s
-eSBkZWYKL1VuaXF1ZUlEIDM4Nzk1IGRlZgovRm9udEJCb3h7LTE1MyAtMjUyIDEzMDMgOTUw
-fXJlYWRvbmx5IGRlZgpjdXJyZW50ZGljdCBlbmQKY3VycmVudGZpbGUgZWV4ZWMKQTYyMzkw
-RjJCNjAzNzZERTI1RTZENjNDRkIyQkUxOUMxODVFRTY0QTZCQUMyOUMzNTMyOTUzNTVFMjk1
-M0NCM0FBNjY3MUI4Qjk0OEZBCkZFNjJEMzRGMERDN0Q2MTc4MTlDQ0NDRkE5RDI3NkM3MjM5
-MTRGMjhERjlGNUExQkJGNjQ0MTA5MjY2NDExQTZCOTlDQUJDOTIwOTcwRgpFRjE1N0FGNEY2
-N0FGRDZCODI1NkQzMEI2RUMyNDlEM0QyRDMxMzExRjc4MUU1MEE2Q0YxQTY3NzI4NTI5MDgz
-M0U5NjA3MkQ4RDFFRUQKQjhFNzQwMkE1ODhGNzgxOEEzREYyNEFFQzZFRjVCQTZBMzdEMUY0
-NzhBQjI2NkFEQzJGMTM5RkE1QjA2OUVENzgwQUMyMzdCRDJENTYwCjU3QURFMzUxQkIxN0RE
-REE3MDY1MjBCRUMzODY4MDZFM0QyMEFCQjMzRTcwM0IwMzgzQ0U3RUJEMjBBRUE0MENEMUYz
-QUY4MERDNjNCNwo1NjcyQkI5NzU2Qzg0QkQ1NzIxNzFCNzE3OTc0NTAwRkY0QTE4QUVGMTlC
-MUM3ODdBNzQyRTZCRDUyMzlENENFMUVBOUY0M0Y0ODgxQjYKMkEzNkMwMTYwOTk0N0U5N0NF
-RTk5OUIwRTU3Rjc1MkYwMDkxQkNERERDRTZGQUNERjM4RDk4NzI4RkEwNjlEMzI2QjBCRjNG
-MDMwNjFCCjhGQ0U4MEQ3QjE3RTY5QkQxNkYwMzQ3NTBCRjUxMEI5RDM2QzE5M0U4NTM2NDNB
-Nzk2OEUwNDNBMEI2QzY4MzQ4Mjk3RTUyQjcxOTREQwo4NjM5MEFBMEEzOTQxNEZCOUYyNzhB
-NzJCQjREMzhEM0RFNkYzMTFFRTBCNEVDMEMzOEFCNDkwRDNCQUVDQzVGOUM5QzNDRjk3MDEy
-N0UKOEMzMUE2NTg3RjdCM0EyQUMyMDZCNjBEODFCQ0E4MkQ3QkY4MDM4NDlCODZEOTg3RTVB
-MEY0ODdBMjUyNTJEOUY1RjI0RkY1MkVCOUZBCkU4RjVERDFENEYxQUU2QkNEN0YxMTk5NzBE
-ODM2NjI4MjRBMTdGNTE4RjNCQTdDMEUzNTU2MzBFQ0YxNkQxQjI5MzBBQjcwMEY4NTlGNQpG
-NzlCNThENUFBNUFGRDA0MzQ1MUVGMEUyMTg5NkU5QkFDNjk3Qzk5QTAwNkY4NTAyQUFFMEYz
-MjU1N0JERjlDM0U4OEI1ODY2QkYyODAKQUZCQjYzMDlDNEE2QzU2RERDOTNDQkRBNUJBRjlE
-NEM5QzMzQ0M1Q0M5NjE0MjM2NDI1QjkxNzAxNTFDM0JBNzBGQUEyQjg4MjJGOTk5CjI5MDJC
-MjNFMTFBOERBRTk5Q0E3NjU2NDlGRkZFRTczNENENDVBMDk2MjQ2Q0M0MThGNERBMTA0QTBF
-MzYwRDg0QUY4NDEzQUI2MzE1QwpGN0IyRDkzNDU4RUZEMkNGNzVDRThFNDI5QjRGRDlBMEQ5
-RTI2MjVCNTZCMjMwN0M1QkFBOEFBNDIwOUFERjNBRUZGMTFDMkZGOUNEQzkKOEJDNTVBODFB
-RDBCODk3NUQ3N0I3OTI1OUVEMjZERkRCN0I0OEU2QUMyQkRBOEM1REJDRDU3M0JFOEJGNzU4
-RENFNTUyQkQ4RDdCOUM1CkMzRUZGRUVDMEZFQTAxQTM1OTZDMDM4NzUwREJCREUwMTlERDA2
-MUFBQzc1QzZERjgxRUEwNUQ2QzZCQTk0MEVGRUJEMDkwNEVBNjRBRApDRDlBMjk5RkMyQTY3
-N0JDMTY2QjkxMDE0NjcwM0M0QUM3N0EzN0QxRTM1Mjc1REYxM0YwQzg5QjkyMUMyQjMzOTA1
-REZCNzlCMjE0NTUKQjc2Q0M4NEQ3RUZEQ0NCRTlFQUQ2QzQ1NDhBRkYzRUE1OUE3MDAzQTVC
-MEJFMzU5QzhCNTk5MERCMTU0NTE3NDhEMDBCNjY1OEYxQzFECjNDMDJDOTAxMEU1ODZFOUVE
-QTc0MDNFMDMyODhGOTM5QzVBNTZFNTZCMDM4QkRFQTNEQkRERUVENTk5NTNCNUQ1RjNFQ0RC
-QjlBN0IyMAo2RTk3RTE5RUI0ODZFNjY2RDIyQUY4RTgxQzY1RUNBMDA1NTk5Mjk3Q0MwOUI4
-M0RBRTEyQTQ5NTcyNTJBOTI0NTJDODI5QTMzRTU4NjQKM0FFRDZEMUE1NTM4QkFEQjcyMzM0
-NkYyOEMxRkZCNTU3MzdBQUMzQjZCOTVBQUIyQkZDMzFCOENGRUZDMTIzOEYzNkIyNEI1RTBB
-RjRFCjIwMURDNEI0RjhDNTg0Q0VFMkI2NkE4QkZFQzc1NUNFRkRBQ0M2QkQ0NkQxQURDOTM1
-M0JCNENEOUY1OTg2N0E4Qjk3NTBCQTBEODM2Rgo0MTI2QkZCOTYzNjA1MjNERDVFQjQxQkRF
-MkI2NDQyRDUzQjZEQjM4MjVBQjE5QTVCODEyMkQzOUFENkVEREZGREJFOTU5QTE0OUU5RjYK
-NTUzMkZDNzBDMzJGMjk3QTU2RjQyODhFMzU1RDlFOTE2MjI1QzgwRTQ1NjRGRjNBRkY0RTA0
-QzY1MzQ2QkY5ODM4MjJDRjA0N0YyN0U5CjU4QUZFMDQ2MzMyRjVGOEYxMjJBNjg3RkQwQkRE
-ODEwMzIzMzE2OTlDNjBFRkY0NERBRDdDRkREOThFQUIyNEQzMTQwMTMyMDk0NjdENQpBODA3
-ODYzNzVBQjkyODVEN0U0REE1RDBCMzJBQ0MwQUI5OTBCNDQ0ODgyMkFGMUQxMzI1NjNDNTc5
-QzI4QjM4NjIyQkNFNDg5MTlDMjMKRTQwMDJENjU2M0QzNjUyMzZBQ0JCQzI3ODU0NUNFMjhB
-Q0MyOUE2REU1QTkzODBBNEFGNkQyODYzQzAyODNGNzVDODY0QThCNTg2OUJCCkZERUNBMjVF
-MTdFQkYzQ0U3OEMwOTAzQjM5M0EwMjRDMzgwNzIzNkM5MkI4OTYxMUI3MEVCQkI5NkQ2NzIx
-MzJDRDI4QjBBNDAyRjk4RApENjQ3NUYyRjlFNDcxRDlDRjFEOTY1RTU2RUE0RDBENkVEMzM0
-NDEyMEQ4RDFBQkREODg4N0VCODM5RjdBMkE5RTBEQUNCRjI1NTU4NzQKQTkyMDBBMjlDMDgx
-RUI0NTYyRjEwOTU4MzUzRkI3MkYyRTA0ODZGNDc5QURCRDQ3NjcyODRFNjMzOUJDMkRFQTZB
-MDU1NTYzNjZGQUM3CkQ4QzE5Q0JDN0NGNDE1MzA4RkMzM0FDNjc2M0UyRjQ1MEVCOUZGNEI4
-NkNBN0FEQjJBN0JFOTAzMzI1NUM0NDU5MzZBMkM5NzBEMUZBMwoxQkJENjUwRTEwRUVFQkIw
-MTgyMTJFQUVDQzRENEQwMzA0NkNEMTRCODYwQkM2QkM3RkVDQjRDNzBCQzYwNDU2Mjk1ODAz
-Mzk5Nzk1REEKRDE1RTVBN0YyQTNCOEVDN0JGRjk1NThBMEVGRERGMTc4NzUyRDdEMkJFNkRG
-N0NDMzIyMTJFN0YzQzYzMkI1QUJDRjlGNDQwQ0E0MTk1CkU1MEYzNDA3REMwNUVEOEVFRTND
-NkVGNUQ5MjdBMzA0MDYzRDJDNTkyNzU1OEUyMTIwODcyMzFDNDg1QTExODQzM0JFQTVEMDMx
-NEMzQQpCM0RBQTI2MzE2MTczNjdENUE4Qjc5Q0YwQzFFNzk4Mjk1M0M1NzVDMzYzRkFFMkRE
-MjAyMDdENUY1NzM5ODAzNTgyNUJBQzVGQjAyODAKNDdDN0Q5MDdCM0Y5NTI5QjlCQTM3MjQ1
-Q0ExRjUwNDg4Q0I0RjMxMDYyNjBENEMzMjREMjNFMDYxQTJFMkU4ODk0MUQ1NjYzM0I5OEM4
-Cjc1RTkzNzcwRkMwQjMzMjA5MjQ4QzUyOTA1MzlDMjNFQzNFMDcyQUIwNzk3MTlEMzQxN0VG
-RUM3MjcyRjQ5NkYwQ0VEMEFGMkE1OEI5Mwo0NUY1QTc3OUFBNTRBMEIwNUY4MERCMTkwOEY2
-RjRCOTFDMERGNDFBQjU2RUNDMEI1NEVBOUJERjY5MjlCMUM3OTE0NzVDRjA4NjRFNUIKQTAw
-RENBNjIyODBGRkU2QTRDNjI2MjkxMTdDOTg5RDMzMkZGQkMyNTUzMEJERjRGMDg1OTI3NDE2
-NTZCNjBEODJGMENBMzlBM0NGMzc0CjVBNjI2NDc1RDFFOTc4MzM3OEU5NDA2NTlBQkE3MjEx
-NTg3REUxODUwNEM0QjMwMEY0MDQzNENGRTcxOUNBM0NEQzNEODlCQjIyNkY1QwoxRTM0NUEz
-QzkxODY3MTZFMDNDMjIyNDQwRUM1QTlEOUI1ODVGOUQxMEY5REExOEE5NEY5MjdFQzMyRTcz
-RTg0NDlGRkUzOTJGNzAzQjQKMThCNTI1RjVGOEY3NjVDRDYzODI0ODk2REMyRjgxRkE3NURC
-NzMzQTQxNzI0N0Y5OTBGRTZCRjA4NjFGMUI0NjNFRUYxQjcyNzA4NUFBCjM5RTM2QjQ4RjY5
-Q0QyQUYyRjA1QTNEMzI4QjNGMDU2NTA0OUMxOTQ4MTI4N0FEMDUxNUE1MkIzMjNDMTQxNzg5
-RDA4Q0UxNUQwRDc5MgpGRjJFOEY0OThCQTRERTA5MEI2NjAzRDcyNzBEOTkzQTE1MjIzMkY0
-RDBFMzc3MzlGRTI2OUU0MEU4RUE5Mjg3MjE4MEI2NzM0NzUyMkIKRDkzQURBM0MzQjQ0MTQw
-MDQ3MTFDMjUyNzZCMUQ4NDU1NzExODFGRkI0RUFDNDdFQjJCM0U3NDEyNTkzQTgwRDBBQjk1
-M0JCQUZFQjY0CkEwREE3MzYwN0EyMDdCOEUyQ0YzRjFDQjQ3Qjc0RjFEMzFCREZBQTVGNkU1
-NTZEMjcwRTAwRERGRUZERkRGQ0QwQkQ1OUNEMDNDMjU5MAo3QTRFQjBFMkNCREUyOTRBRDI3
-NEYyOTY0NkJDQkNERTQ0QkU4QUVENDFFODc4NTU3RjMwRTgxQTA4NDJBQjM4ODYzN0Y3QTIx
-MkU5NTMKOEFCMjExOUIyOEM1MUZCRkU0RTc1RUExN0FDMjMzOTQ5QTIzMkIwMTVGNzQ4QTVD
-NTFCMzBBREIwOTE4RDY5RUM2NDFCQkFBNTc0NTg4CkNENDVBQTc3OTFBRjg4QUVBQjRGODJG
-RkEwOTI5QkE3MkFERDRFQUE1OEEwMEVFRjc4MDAzNkI2NUQyNzlBMTAyNDA1MTVBQ0JGNjk2
-Qgo5MEY5MTlFRDVEOUNEOUI2NUQ4NTQ1MDM1NjUyMTI3OEQyRjgzNjcyMjhDMDk1MDdBNkI1
-MkFFNDEzMTgzNTIxQkQyNDU0QTc1NUUxNTAKNzg0RTQ0NkVBRkUzQ0IxMkYzNUE0QTkyRDdG
-NTUzNDI2MENCODRBNEQ2MTk4MEM1MzVEMjNGRDA5MTcwNkIyQkFGQzYwMDQ3RUQxMzg4CjJE
-M0RDMDBCQjFFMDA2QTJENjc4Q0ZCM0MyRjI5MjFBMzBBODA5MEYzMDNCQUI5MjI1REMyNDFG
-OUNDRkRDMTg2MEEwNjJFQTFGRjQwNAo3QTI3MDZGNDJDMUFCNzg5MzMzNDU0ODg3NkVDRUVE
-NjIxQ0IxMDVEMzBFMDNFRjBGNUYyNzAxODI0RDFDRUI1OTlDNDdERTlDRTIyNzQKQTQxRTNE
-NEVENjhDNTZEODEzMDg3N0UyMUVFMTYxRTg2M0NGMjc0MTNGREMwQTlGQkFDQzZENTE4QTc2
-N0NEQzcxMDJCNzg2RkFBOEJFCjQxM0Y2MjUwMzFDNzk5MzQ4NzlEOUYwRDBFODJCNTMzOUJF
-NUVGOTcyRjRCNTQ1MjkzNzQzRjBFMzE2NDdCNkEwMjI1NTBCMUNDRUMzMQo4NjI5N0IxRThF
-RjlBMEFGNzZENkIxNDRDODRBMkZGRDVBRTRCRDRCQkU2QkUwODRCREI0RTUwMzIxNjgzN0Qy
-MjlDQjgwRTRFMkNDNkUKM0JBNzAyQjNFMjNCQUUxRTk2MzA5RDkxOUEzREJENUYzMEQ3OEM1
-NzU5OEVEQzNCRUU0QTgzNzRFNERCNzYyM0UyRTZGMUMzMjE1QjM2CjMxQUU1M0EyOTExMjk4
-QTk1MjYzMUQ4ODg4NEE0NzdCQTA5RjUyNjA3MEFFQjhFMEU5RTFGRkI4RTY5NERDQjJDQkJF
-NEU1MzFBNzU3NQpERTlEMzVCOEVCODdERDVGRTQ0RDQwNDRCNjc0QkNFQzAzOEY1RDREOTMy
-NEM1RENBMUMwNTA1REIyMDQ5N0MyOEYzNDVBMjgzMTNCMTEKMEJFMTlCRjRDMTJBNDI0MkZE
-MDFDRTM4NTM2MkMyNzNENEEwMUYyMzQ2NDJEOTY4N0RDOTMwQ0Q2NjI2MzM0NDE2MUVDMDhC
-NDlDMzBBCjBFMzkxNzZFMDcyNzJDNUZGQUQwRTNBMzQ4OTI2MUEwNzBERkVEQ0U5RjI3RTVE
-QkM4REFGNjk5MzQ0QzA3MEI2QzAzMDMzOTIyMkRFQgpDMUY2MjVBRjZEQjg3NUM2OUZFREI0
-RDYxMzU4MTEwMDUzNTRCMjZGQUYyODRDQTJCOTJGNzM5OEUyNEQ4ODg3QzhFNzBBMTUxQTA1
-MzgKOTg4M0VDNzdFQUU2RjJGN0Q2Q0ZBNzdDNTJEODFBQzIyMUVCNjcxMUVFNUYxMUM2MjFF
-QjNBRDJFRDU3NTVGN0IwNTVDMTk3NDRCOTM3CjRBRjk4QjlEMTc4RkY3QUY0RUFFMUY1NEY0
-OUI0QzlCNzZBMzk0N0Q2NDc5NDFBNUMzRkI5QzNFNUI1QzU3RTRFREVCQ0U3ODMyQjE2QgpE
-RkU3M0ZEODQ1ODJFMUFGNTdBMzkzNDA0RkJEQjA3REY0MzQ0RkY1ODM3RDgyNTgwNEFEQkY1
-QkY4NTY4MkQ5QzIxNzdBREEyNjE1MDEKMzlCMDVBRkU2NTY3ODc1M0VGRkNBRDRGODcxQTND
-N0NERTkxOUY3QjY3N0Q5M0FERTE0MUYwNzc4QzFEQTBEMjVFNEE4MzY3MDg5RTA5CjhDOEU3
-NEVCQzcwQkI1Q0I3Qjg3MTdBMkYyMzQ5NkJDMjRCMDAwODVFODMwRUFEQTQ0QjUyOEU4QTBD
-RUJGQTg3MDE0MDU5OEYyRjY4MAo0MEMyMzdFRDkxNUQ0RTlDNTE1OEIxRkI1RDhBQ0UzQjY2
-RTQyOUU2QjUwQzIyRkJDNEQyODlBMTVCRkY1MkJCQ0Y3MUZERDM2QzY2NzkKNUE5REE1MzAz
-NjU0Qjg0RUREMjdDQkYxOTlBMkM1NjRGMDgwRDhGNTc4MUQzOUEzMkIyMUJFQkJDOTc4RkY4
-QzRDMzY5NEM0Mzk2NzI1CjY5ODExRDYwQTk1RUMzMkEyMzJGQzBERjEyNzZEQTBERDZBMjU0
-OEZGQjZDQUQyMTk3QkEzQzcwNEQwQTY3RkI4M0QwNTA4N0M5QzFGMgo5NEJCQ0YwRjcyRUVF
-OTE4MzNCOUE2MjVDNkE3NDlDMzY2NkM2QTc3NzAxMEUwNUYyNkFGQ0NDQzFBNkQ2Q0EyNkVE
-QjhEMTJBNzEzRUEKNDNGMENCOTY5MkU2QUFGQjI0NzA3ODdDQjIwN0Q3RjNEMjk3MTU4RTRF
-MzdDQ0ZCNjdFRjAxMTc3QzM2QkFDRjU1MTI5MTlFNjJDODg0CkRBMTU1QkZFMjU3QjgyMEFC
-MzZFODhBOUY4QkQ1OTA2NDJFNkVFMThEMjk1QTUzQjg0MzQyRTdGQ0ZBQzY0QzIxRTY4MUQz
-QTk3NDg1Ngo5QTFFMzNGQjQ2MzNGRUIyREU1NzI3ODcyMjAxNzYzQTVFNjQ5OTkxNjY0QzQw
-Qzc2OTA3QUM4NzZERjU2NjkxMUY0RjE1MUM4MTUwOTEKQkYzMTE2RUU3QzYwQ0JEMzc5RDM3
-MzdDNDJGQzM1Q0VGRkQ3MjU0OTJBODBGRjBBQTE3RkFGQ0NCRTVEQkQzMEIzMzEwMzE5NTcw
-MTgyCjAyRTkxRkYzODEzRTVCRjQxRjc5ODZCQjk3MDgwOEZGODAyQzAyQjMxQjg5NkNCNDgw
-QTUwODIzMzRCREY5QTM5MENCMjBFRjAzQzFCQgpGQjY0Mjg4QjI0NDY1NUFCOUVDQjhCRjhC
-OUVBNjE1NzFBQjJGRDNCMUUyOTE2RDM4QzI0N0MyMUY0QTRBRTAzRjdFMUNERDFBMjgzMDcK
-MUFFMDM1OUI5NjBGRDlDNDVBRTM5Nzk0RkNFNUQ3M0NBMUE1MDdGQzZEMEVBMDZDRUVEMTdB
-NDA4M0E1QjZBRDRBQzYzQjlFQ0MwMzc1CjBCNzk5RjNCQjZGODZFMTkwQkZENDdDRTdBNjk3
-QzZCMUM4OUMzQjU1QzJFQzA1OEYzQ0ZFRjJFQjUzQjM1Q0RFNzc0OUU3OTUzMUQ4MgowQTE1
-ODNERjM4QjJGQzBBNEVGREM1QzMwQUE1RDFERDc3REQ4MTk2REU1MTcwMTAxQTRBQzhDOEI5
-RERGREE5M0U5RkRDMDdGM0Y1NzIKRTE1NzdBNkUwQkIwM0Q1QkVEQzVCM0FGQUNERTFGMDE1
-NTM0Njk1OTQyRTlGQ0Y2RTNDOEQ3QzcwQkU1NjczODg2MkUzQTYyOTIyMzkwCkYzMUFFNTM5
-MUQ1NUQxMjU2ODBGM0ZDMERDMzkyQzdGNjk2Q0I5Q0NFNkVERkYyMEEzRUE0QzM4RUMxNkIy
-RDMzODkzRTE0OEREMzczRgpBMzA5MEFBMDFGRkQzQTM3QzFCQzgwNTMxQjQzMTBBQTQyQjdC
-MEZCRTAyNzYyQTY1NkM2OUExMjg1MDAzMDkzMTU4Q0MyRDEzMDU0RDcKQTE5MkRBODg4Mzgw
-QzgyRDRFQzAxQTc3RUU5NjJCNzhEMDUzNzNCMzdBQzU4OEJENUY4RkNDREUxOUM4MDBENjg0
-OTlFOUIwN0JEMzI5CjcwNjkxRUI2QUIyMUZGNENFREM5NEM5NkU1NTcyMDcyOEI1RDU0QUU1
-RjhBNzkwNUQ2QjE4RUJCMTg0OTkyQzJENEI0RUQxMjA0RDZGNAo1NkFCNjQ4MDc2QzI0ODY0
-QThBN0UzRUNBNTJENUM3M0U3NjBBNDQyRjFEMUExNjJGMTU1OTM0NDJFMEMzNzg1NUI1MUZF
-QUFDQzRCMjAKOTkzRDlEOUIzRUY2OTNDQzY4Q0E3NUU0NDlGMUUzMkIwMDIzMUE0ODRGMTEw
-QUFBMjA2NkE0MzQ4RDhEQzVENkFDMUZEMzc0RTQwNEFCCjk2RTMwOEJCMkExNTk5MDFCNkFB
-RTEyRTFCNUI2Njc0QzBEODIwODQxQjQzMzVDREYyMEYyQzY0Q0NGQzdFQjA2NEZBMEEwRjA3
-QjEyNQo4Q0Y5RkE2REU5QUY1N0IwRUNGMDlFMkRGRTk2RjhGNzhCODNDOUY2ODlGMUExMEQw
-QkQ4N0ZFOTkzMDcwMTU4MzE3MUZGREMzMEJCN0EKQkFEQkFCNUIwNzkwODZBNzk0M0EzQzZF
-RjVDOUY2NTJGOUJGMDM1OTE2Qjc2NzY0QjdCNTNFRUVFNTREOEEzM0Q1ODQ2RkM2QTZCNjRF
-Cjk5RkVGNDNDN0ZFOTBERkVCRjgzQ0U0MzU2NjEwQzY1Qzc3MTQyNkU3RDI4QkI2MDBFNzQz
-QTU3NUY4OEU1QTNGMUE2MUI1RjUzRDQzMQoxNTE1MTZCOEQyNDdFNjQyNTc0QjQwOUNFNDE5
-MUZCNkVBMDQwNTg2RjQ5RkQ5MTE2RkNDOUI2MDJGNzZGNjI5OEZBNzQyMjFCMzUwRUIKRjY5
-RjY4NTREMEU4RTJFOEJBNTBEMkRDRjdDMDREM0I5QjYzQzcwMjIwMDYzNzFEQzNGQjhFMTE0
-RjQ0QTUwMUMyOEE1RDYzMzgzOTI1CjM4OTZDM0NBNkE2NUE5QzBCMDk3NkE5QzVGRkYyOUVF
-MUQyN0IwQjZBMUNEMkEzMzkyOEY3NzlDQUI2NTQxODdGRjAwQ0FBRDBGRTI3Qwo3OTNGNUIx
-QTFFQUFEQjc1NzRCMkIwMDdEOUFDNUYzNDFFOEFFNDcxMDg4RERGQjZDREFDRDA0MzdEMUE3
-NUZENzUzMDE1MERFNDA0MTkKRTE0NEM3NzcyQzU4NjZERDA5RkZERjkyOEVBNDk5MTk2M0Uw
-QTU3ODQ5NjFCNDY3MTEwRTRCMTI2RDBGMDVDQUNGM0FFRENDMDBCNTU5CjlDNzg5MTc0Rjk2
-RDIwMThBQ0M4QjU4QkNCQ0I4MjdENjk0QjVBNEUxRjhDNDMxMEY3RkY1QzUwRkIzRTc3NDE3
-M0QyMUVDRDREMjc2RQpCMDJFMDhBNjA5MUQxMjAxRkMxMTc2RjA0NjQ2NkU0RDY4NTY5MkQ5
-N0VBQkVEMzY5OUFDNzQxRkQ1MDZDMTBCOTBEQ0FBNkI5MzZFNTcKMkE0RDdFNjg2MjE5OEIy
-OUFGNTcwMTAxODg5NDFDQzc2NjhFQzZDRTg2MEY0MTZENEFCOTVDNDRFMEIxNjg1ODA0QkZC
-MzI5OTE5RDJDCjBBRDk4Mzc1ODdBMzgwQzZGQTNGNjA1RUUzQzg0QTE0RjRFOEU1NzAyQTFG
-NTA1NzMxN0UyQzNBNzBDNERBNTNGRjE3MDNCRDg4QjE4QQowN0E2OEMyNjIyQkEzQUZENjEw
-QTRDM0FGNzNCN0VBMDk2NUIzNEM2OUFGNzIxNkY5RTlBMDBDQjYwOUFDNDU2N0VGRkVBQjI0
-NUFGRTkKMDI1MDZCODExMjI3QUYwMzZFODk4NUEwRDg5MzFCN0RBRDlDMEREQTAxQTg4QkQ1
-RTQwQzZERkUzRkFEN0QyNjhBNDFEOTNFRTM4RDJDCkI1QjhFQ0Y2QjdGMjk1RDEwN0IyMjE3
-QjA1NTVBNDM5RTk1ODZCMkIyNTI2OTM0REM5MjJDNUQ3NUM0QTU0NjlGOEIzQUNCNzIyQkUw
-MQozOTMxODQyOTEwNUE0RjVBQzI2NTdBQkI0QUYxMUVENjcyMTNBRDE2MTIwRUZDNjAyNjQ4
-MEZCMTVBRUMyOEYzQjBDMEFDNUI4MkFCNTUKMzIyQTlFMEU2REUzOUFDMTAzQzFCNEVFM0Y2
-MjM1RUQ2RDlBRjBBRDRBMjk0OUM2MUMxODI5NzhEOTk0NjREQ0U4MTQ2MkE3NURCRTlCCjM2
-OUYwREFFQjY2Nzk0ODcyN0I3MjFENEI2QzdBRUIwRTcyRTg2ODk2QUM2QkUzRjg5NDhFNUE4
-QzNBMkEwNEZCODg2NzUxNUFEQjkyQQpCMUQwQzc3QjVBMjlEODcxQjZFMzQwNkQ0NEI2QzRB
-RjRBMjkwNzQxOEJCOTlGRjQ5MTJGRDVFMjE3MUQxNDFCMDlDMzgxODU5NTA3MEQKNTgwNDEx
-QUJDMzg2MzI5OTkxRjREODZGQzdFREFBQkM4MTdBNzRCRkZFMzkwOTMxMTVGODI2MzQ1QTQ4
-RTk2NjY3NEIwRDMyOTBBNkJGCjFCNkY2MzREMDAyRjdFMTdBRTdDMDY1REM2RkI0QTE4ODk3
-RTJDMjVDOTZCOUIzNEE2QkNFODhBRjFGMEQyQTgzRDg3QzRGN0VCRUNCMwo5RjkwQUMxNTk0
-RDM5NUY3ODVDQjBGREE0QkNCN0UxNkNDNzhFNTgyNTI1QzVFQTA3M0U5NjExQkI1QjcyOUEz
-NzJEQkI4MEVEMEE1M0IKN0Q0NEUzNUU2NUJBNUI1MEUzODNGOTMyRjdEMEMzOEI0QkNFNDND
-N0VFRjRDQjFEQjE2QUQ1QzNCQjc0MUFFNzNERDAwQzBGNUY5NDlFCjFDNEZFODc5RTdERERD
-Q0Q0NzUxOTc5MTdENERGM0NGNjJDQ0NGQ0VDQjMxMTM3QjBEODA3QUNBOUEwMjQyODk4RkFD
-OTU0QzM4MjIxNAo2NkJCMzZCQzU0QjFERDZCOTI3OTI0QTVCRTFFRjY1QjY2OTdGQzZGMEI2
-MjFBQjU0OTlDMDNDRTRBRUUzQ0Q3REZEMUNBMzY5REZFRkEKRjQyMUJBMDFBOEQ1Nzk0RjYz
-QjA1NjI1Q0UwMjUxM0I0Qzg0QjhDMDE4OURCMzM2OEU3QTc1NjhCNDIyREVCMDdEN0UzNEQx
-MEQzN0EzCjFDRjU5MTExRkE1NEU0OTA4NjdCQkI0NUVFNjM1RDRFNjkxMTZGNEYwMDgxMjBG
-RUVDNkZCN0I3RkRCNUY5MjEzODFDQzUyMEM4MTZENwo0REMyOUVCRUFGNDFFQTYyMzA5ODJF
-NDg2RTQ5MTZCMjg1Q0M2NjU2RUI3RUIyQTFFMTM4MTdFRDIyRkUxMTlFNDk0NTJBQTBCRUE4
-Q0QKREYwNDU3Qjg0NTBGQUE3Q0E2ODYzQjQ3QjI5N0YwMEFBNkYwMzk5NDFEODk2MjYxNTNE
-NUZFN0Y1NEVEMDJGRDAyQkQ2OEVBQjQwODM2CjU1QzExMzA2RTM4RTg5RjQ4NTNFOTExNjk2
-ODk2MjMyRDEyQTA4MDAxMTNEQzAwNjZBRUFDNkUxMEFDNUNGRDU2REJDNEJCMzZCQUFFQQpC
-MUE4MjFDRDdERDVGRUYxNzg4NEY0NkJFODIwNDBCNTM3MDVEMzU0MUVDRkZGNTdGMzc5RTlC
-RTYxOUY1MjQzNjAxN0Y2QzY3N0UyQTcKOEMxMDVDREMyNzZBN0UxMjIyNEJGMzAyODRBOEJF
-MUFFMDYyMzFDRUU4MDM5OEYxNjA0MEZDNzIwOTM0RTMzRTQ2RjRFNENGQjQxMEQ2CjJCMzdD
-OTVDQ0Y2QTVEMEIyMDU4NjVERkQxMzQ1MjA0QTNEMkFGNUFBQkU2QzVDRkMxNkU5N0ZDM0NG
-MjdCQUFGNTRGNEYzRENGMTM4OAoxQzk5MTZCOUJBRjhEMTYwREI1NTczRjE2QzVBMUY5NURF
-ODhGODc4NDYxQkZFOThBQ0YxMzdDMTQyNjhERDg4ODJCMjBBMDg1OTkxNEMKRERERTI4OTlD
-QUFBNDE5RjU2MUMwNEZGMERDMjkwRjQwRTMxOTIxMDMwMEU5MTYyODgwMUFCQkQxREZGQkFE
-QzY4NTA0MDI3MkRGRTkwCjdGM0RDMEMwQTVDNDE5RkQxN0ZCRDRFN0I2MERDMUVDMUI2OUQ4
-M0Y0RURFOEI4QzZBNERDRkQyRDQxOUJBODhCREI0RDlDQTA1MDRGNgpEQzI4RjUwNzFFNzNE
-MkJBOTVEMTVCOEFGMDE1MjdCMjMyMTgzN0NGMUY2NkRDQjU4QjYwNzEzNDlENUVDOTUxRTk4
-QjBBM0UyOTQ1RkQKRkE5MjhENjM5M0Q4NTIwMjRDRTBEOUY1QUQxQzBENENEMjc1MzI4RjEy
-NjNBOTY1QjUzOUY5Rjc3QTExRDk2MDFDNzBGRUM2MTA5RTNECjUyNTI2OUI1NEFDN0FFMTBB
-QkQ3RTlERkU2RDJDMTE2QURDQTA0ODg3RjlBNjEyMzZCMkI2Q0YwN0JGNjYyOUI0RjkxMjcy
-OTIxMDA2RQpCNzNDQTY2OTU5NDM4MjhDOEI2QjZBRTZDNzRERTI2RDAwODc0QjBDQUMyN0I4
-QjZDRTJBQzI5RkNFRjJERDA2NTIwMTEzNDgyQjlFOTcKQjBBNjVCQkUxNDU3MkU4RUQ1RDY5
-OEM0QjMwQjMxRUY0QTY4NjU5Q0IxNzhEQzc5QUVCOUMzN0EwNjkyODBGMTBFODM4MDc1RjM4
-M0IzCkU1OUI4RkE2RkVEMUU4NUFFMjYwQzVDOTYxMkY2NTcyMkE2RUVBOUUwRTkyMTg4NzM4
-MDE5QTNBQUQyNUU3NDY3OTFERDhGRDkyQUUxNQo4MThCRDI3OEYyRTI3REY2RjVFOUY0MTBF
-NDE5OTM1RTg4Mjk5OTBDMUE0NkJBMjkxMjQ4M0Q0OERENUJFNTRBNDJGRTMzNjA0MTdBQzQK
-ODZEMTk2MzM4NjdFQUNGOENERTU4NjVGMkE1REJDRUJFQkJCQUFFQTY3MEFBRkM4NkVDRjIz
-NEZBQUU4MjVBNDcwMTQ5MTNCQkMyOUEzCkZFNkY0QjhBRTA5RjYyRDJGOEI2RTU0RDVEMTY5
-MUQ4QzFBREU2RUJBREQyNjhEQ0ZEREM0QTU4NDg0QkE3MkQ2OTcwRjREQTc5MDVFRAo4MDcw
-OTYwMjI1RDczQjc3OTIzQzVEQkJDMzU5RTM0ODIyMzQ4Mzg3QzMwOUIxN0U0RjM2MzI0QTJF
-QTFDMkYzMDVENkUyQzc1NzNBQzYKNjMwOTFGMkY4Mzk2NDU4MzcxQkI2MkIxQkEwNDFENDE4
-QkNDMDM5NEI2OTc0QUFGNkJFMzdFOEU5QUE3REE1NDNFREU5RjgzRjZERTA2CjE3N0U2MEM5
-ODY4MEI4RTRENkRGRENDOTIxQjZGMDQ0MzY2NTM5QkFBOTgxM0E2QUNENDhEMEYwMjI5QkI5
-M0FGMjQ0REQxOTFBMkIzRgoyNkZFMjhCQkY0Q0E5QkE1RDJFMTdDRThGNDVCMzVENTk1MjIw
-RTQ2QkRCQ0M0NzQ4NDkxMTg2OUU3MDBEODIyOUJERTJERDQ1Nzc1QzgKNTY3OUE3MzBDMDA3
-NjZFQjhFNjlCQThBQ0QyRDkwM0JGMDFCOUY4MTY0RTNDQzdDOTU0NTU5MEM1NUI1Q0MxNzMz
-QkNBQkE3QjA3QTc2CkVBNjFBMDMxNUEwNzdBNTM2MjZFQzU2RDFDMkRGMzM4REYwOUI0REQz
-NzVGQzE1MjYwODA4QzJEQjRGOTY1OUQ1MkY1NkQ0NzRDNTg4RQowQTc3NTc0M0E3MjM4NDYx
-MDQyQkM5QzQwRjFDNEY1QUM2NDBGNTQ2N0RGOEMxNzFFNzRGRTY3MEIzMzFFNTdENzc5OUYw
-QThENTE5RjQKODhCREEyOTlBQUQ4NjYzOEE5OTgzMTcyRDA5RUM4QUNBN0I3QzA4MTlDRTc1
-MjhGQUYzOTQ1NjlFMDRGNTRENUE2MDg2RTc1ODhGQUZCCjY1QUY3RTY5MDRENTQwOUI2MkRB
-NTdBMkMzRTI2MTg0RDY4RDVGRkYyOEU4QTAwMjdFQjVDMTI4QzlDMTJGMUMxQ0RERjA4RDhD
-OUQxMgpFMDU3QUQzMENGRDkwRjNBMjlDRUY0NTI1RUJBMDUzOTYzNzBEQTkxQTc4MDJBNTFF
-NDBDMzMxRjVERTJERjRBMzk1NThDRDY2ODI2NDAKMDNEMTc0QTQyQzUwQjZBNUIyQUI3MjAx
-NkIyQjVFMzlGQ0JCRjUwMjlEMzk3MTJCRTAzMTcxRjEyMDhCRTVFMUE5NDVBRUMzQUZDQjlB
-CjdBNUU2MDU4RjcwQzNBMUMyQ0RBNzREQjBDNDNBMDk0MjJFMTFDRDJBNTdDRTRDQ0YwRkU1
-OEU1RTJFN0UzMDUxRTQwMUMxRjM0NjA2RQo2MTZGRkI0RjQ0NDJEQjE0MUI5QkU0MjZCRkJE
-NDNEMTQ1ODFFQTQxMjhEMjQ0ODE4Rjg1QjY0MjRDODAwREMxMTdENkI3QkQ0NjkzMjEKMEQ3
-MjU1MDM0MEIxREQxQzQzMkIwNUVDNDE0OTIyQzg5OUI3NTU1OUQyNUE2M0E0NDIyM0ExNDlB
-REI1NzRFQTUxNTMyMEU2NzhERjY2CjZBQTlENjE5QjNDNDgzMUIwMEY5NkYxQzAyNzEyQzM5
-NTM4MUNEMDM4M0I2M0JDNTNDMUZBNEM1Q0Q0RDAwODYyRjY4MTlCNDkxRDI2MAo0QTRBRTQ5
-NTVGNzYxNUQ4N0MyOTgzOTZDODI3ODA3NUZEQzAwOENBQzI1NDczQzlGOUNCMjhBNTA3NDUy
-QjdFQURGQTU2QTNEQUE3QzkKMTZBRDRGMDkwMTIzQzhDODg1RDlEMUVDQkZGOEQwNzRDOThC
-RThGMThDMEZEQzI1MTBBNDMwNUU5Q0M4QkE1NzEzNzRCQkI3QkJGNzVDCkYxQ0M5ODI5RDVB
-MUEyNTJFNDczMEQxQUUzMjEwQUIwNzRCNjdCMDBDNTQzOTEzMjhDRTExNDdGMjA1NTAyREZF
-M0E2RUM0N0E0RDYzQQpCN0QyNjM3QjJEQjEyMUU2M0ZBQzFGRUM2ODg4OEEyMDAxODQwQTA1
-QUM5MEIwN0I1NzdFMTFEOTc2NDQ1MTczOTRBRUMwN0NENDBEMDIKQ0RCOUJFNTY3REEzRjQx
-MzVCMDI1M0Q1MDNENTBFQzU2NkY0MjIxODJEQTE3M0FENjJFMkI5NEQzMUE1QjRGMjA5OUY5
-RkNBMjUyMjQ2CjY4NjJCRUY2NTg1RTFBMTg5NTY1OTU4QjM4QTY0Q0ZFQ0E0QkU1MTVFNkUy
-QkQ4QkM1RUU0NEZDQTU5M0EyQjg2ODU0NDMyMTk0OEU3RgpBNEFGQzFGNUEyODY4Q0ZGRTM2
-M0M3QzZFODgxNjU0NDRFMTNDOEM0N0M2NUU3MkM5QzhCMjhDQTQ5NkI0OUEyRTQ2RDgxQjUy
-QjQ4QzUKN0IzQzgwMTFCQUI4RThEQzlBMTQ3NjcxNTNDQ0Q4RkY0QTIxNjZGQjAwQTYwNDAy
-RkUwQUUzRjA2OTFCNTcyNzY2RkE0QkNFNjA3NTA4CjNCMkIxQzNFMTZDRjRDOTEwODQ2MkFG
-MUU2QTQ4RjREN0ExQTQxNjQ1RkEyNzY3NzI4MTAyMjk0OTUwMDQ4M0I0NkJBMjNGMTc1NUI1
-RgpFRjA1NzhFNUYyRTVCRkNFRTJGNzEzQjMzMjRBODM5MEFDRTE5MUQ1MTQwODAyMkMzQzhG
-M0EyMDc3NjZFQUNDMDVBMTRFM0MzRUI2RTQKODVGRjg3Q0U0QzYyRkFFM0M2QkFEMEQyNkFD
-QzhFN0U1ODRBOENEN0EyNUE5QUZCNDJEQTYxMDZGMDdBNjVDMjYxNjcxMjAyQURBRDY5CjU0
-MkVDNkQxQ0M1QjFFRUI2MDVFNDc0QkM5NDlCQTdCMkU4QTY0RDRGNUJEN0JCQjMyNkMwNkY5
-NjMwRDRGOTlCOTcyOUNGNDIwNUQyOQoxMkJFOUNGODFGQjExNDU0MUVGOEQ3RDVDRTRERDE5
-NTFDQkZCQjVCMkZGNUE5ODk2MjAyRDQzOEM3MjI1QjhCMEY0Qzk4NUI1QTk0Q0EKMDk0NDhB
-NDZDMkUzRjA0Njc0QTU5RjU1QkE5ODUxQkE2MTQyNzM4MDkzMEJGMjc0N0NDQTdDQjkzMjM4
-ODU2MTk2OURGN0Y1RDk1NDVDCjUxOTVFNTJBODQ3RUYyQkY0RkUzMzI1NTYwNkJBRjNBRDY5
-NTU0NENBMEZBNzY4MTAzNDUxNzY0MEQ1NjExQUUxQTVGMTE3OENFNjk1QwoyMjNFMjlDNDFB
-NDAxNzc2MEYzNjUxMTIyQjdCREE0RTk2N0JGNUQ3NkZCOTM5ODRBNTI3NzNDNTE4QkJDNzFE
-QjMyRkM1MUZDQzJGMjcKQkY1OTYyMkM4OTA3MjQxQTE2RDMxMDc5QUFGMUYzMTAwNDFENjND
-Nzc1MDg3MkY4RkUyOTRDMDZDNDgzODUyMzk5NDE0QTAzRDRCNjg0CjQ0Mjg5NzE3QjNEMDk3
-MzI0RUE3OTFCOTYzQTI3M0QwMzMxNzE0RjFGOTEyRkQ2MjYyQjgxRkM4OUE1MDUwQTVGMzQx
-RTkxNTAwQ0IwMApFOTcwQ0VFMjJDNkMyOEVEMTUzQTQ0Q0Y0M0U5REE1NUZDRkVEOEI5NTNG
-OTQxMkExRkU0NzcxMDREQjNCQzQ2QTg5NzY4MkI0OTEyQUYKMURERTdGMjBBNkI5QTQzNjUw
-NjBDQURCRTUzMTZCODA1QUQwQzVDMzJENTVCODQ1OEM0N0I1RDQ3RkMxQjQxNDBFMEY2QjQy
-Qjc4RkMwCkJEMjYyMzEzRjk2REZCRUY5RUZBNUE0RjU5MEJDQkEzQzQ4NEExNTFDMDUxMTNF
-NERCOUM1NkZBMTg3Q0U1RDA3QkZBNURBOEVCREU4MwozRTc1QzZBRThEOEU2NTE2NTRFMTEw
-MDgxNzJCRkJFQzBDNTlGODNCQzFENkFEOUM0REU4RUVBQjc3OUMxRjhEQzQ3OUVEMDg0Qjc2
-RDYKRDU4MkRDRkUwOEJDNDM5N0VENzFGMjU2MjU3NTIzMkQ5QjQxRUEyQjVGMjM3MjJEQTQw
-MjMxRTlBQjg1Njc3QzI5QTZCQzM3RkMzNkU0CkRDNDQxNDY2MUNDNjI3RUJGOTRBRjJCMTND
-QTU3MURCRjAxMDVEMDg2MzJDQkY2NDBCRTFBNkY0QjMzMDQ2MjM4RDYyRDExODk2OTJBMwo2
-RUMzN0QwMjk5QjJCNDNEOERDQzA2RDM3NEVBRjBCNUQwMDBBOEIxNDRBOTU0QTM3Q0I3QkE2
-QjdBQkEzNjE3QkUyRjcxOUZCOTU0MTAKNTE3OTg5OUZEMjE4N0JDOTA2RUQxOUQ1NEQ4QkFE
-MkI5NzBFN0I2MkFFOEVFMUIxNzk4OUUyNkYzNDBCREFFMTg4RjdGRjQyMTNBMUVECjc1OEZF
-QjBERTMzQTMzRkNFREQzQjg3NDc5MUI2REE1RjYzQjkxQTJFRDVEQ0Q2NzE4MEQzNzQ1NjJB
-MkFEQzczMzU5Q0U5RURGODhDRQo4MjRBQUMxNTA3OTQ0MUE5NUQ4RjBFQUFBMThFNkNGRTQw
-MTYzMjZBNzVBNzZDMjEwMzQ3QUNBRkJCOTBDM0UxNEM3NzMyQzhGNUNFOTcKQ0M0QTlDQzZF
-MkYxNDQ0RENEMTcwREIxMkE5QkY4MzJDQTFBMjM4QTI5QzYxRTUxOUU5RjAwRjBGNTA5MEU4
-NDkzM0YzNUZCN0U3MTdCCkI2NDk5MUVDQkU2NTBFNDg2NEIyNEFDQTkyOTc0M0VCNzc1OTFG
-NjQ0ODc3ODlFQkZGMkEyQkUzOTlDNTA5N0Q2QzY3M0I2QzVBMjE3OQpCQjNFODQ2RjQ5RjJG
-ODNGM0IxRjM2MEZCQjJEQkE2QUE0QTUxNkVBMUJERUQ1MEE0OTdBREY1MjBGMkQxODg0NkJC
-MzBBRkExQjczMkQKNzYxQjY3NjAwODBCNDQ4OTYzRDc3Njc2RDlCQUNDMTI3RTVFMDMzRTRG
-MTIxNUYwREZGQkY3NDI0NzQwNEIyNzYyMDFDMzlEMTg3REI1Cjk4ODZBNTk3RTA0RTRDQzA1
-REJBNTAwQTI0QzlGMjIzN0Q1QkREOTNGOTA4OUI5MkM2NTNFNDdBRjhFRjAwRTYyRjVGMjJG
-RjhBQUREQQpDQ0YxQ0VFRTYzNTBGMzM0ODc5MjkxMkRDNjEzMUZGQzFEQjkzRkZDQUNGNUI4
-OEM5NkY1REVFNTcwMDA4Q0UzOUIxRTAwMkEyNEJCRkQKQzNCMEEwOTc2N0IyNDY0NDIxNkJG
-ODkwNUUwMkVDMUZFNjQ3NzU3NUUzQzQ1REE1QTA1QkU0NzVDMjBEQUE3QkNBQkI0M0I0QTlG
-MTZFCjZDNUZGNTQ4M0UwRjUxNzhFMzIwQ0EzOTM4NzM2Q0YzMjU2OUI2MUJFNUJCQzcyNEQy
-QUUwRjk3MEFDODhBM0I0QUMyREJBOERFOEVEMApENDJEMDIxNUQ0N0NCNDlFNjlGRTFEN0Q3
-RTQwRTg3RDAzNTRDODM1RjQ1NzM1NzYwQUMwMkExMzI0RUQ3ODE2RDk4MzhEMjg1NzgwOTgK
-REUwRjFDNjUwNTEzM0IwMDAxNjQwODMzMTA1NzNCRUNBRUIyMENDODgwRUU1OTI4NDVCNkNC
-NEQzRjJDOTRERDA2RTNBRjQzMjQyNDk5CjU2QzJERDUxRkUyRDIyMDhFMzJGQzhBODM3QjQ3
-MDVCNzFDQTY4RDcyMTRFOTJGMjk5NjA2NkFENkJBODY3MkEyQjA5NjUyQjNFMTg2MQo3RjZC
-MUI2MENFMThGOUVFNUJFQTM2MTZDM0VERUI5QUI3OUVEN0RCQ0ZGMDVBRTZDNUUwM0YzM0M0
-QjIwQzVEMkFDOEIwNDlCMDlBODAKMUVBODNEM0UxQ0M1QzNDQkY2MDhCMzlGRjI2NjIzNjlC
-ODU0NzhFQkRENDU2NUFDN0U2RDc5Q0RDRTBBMzZFOTEzRkI2QTZBMDk4QjRCCkExNkVERDdC
-RjE0MTVEQkMwQTMxREUzMDkwOUREQjU4OEM1NzNGQTU0QzNBN0M3MDNENzZCRTk3NTA3OUI3
-ODEwNzNDREZENjBFQUU2OQo2QkY5OTFCNjlEQjU0RkUyNENEREIwMkE0NENBOEMzMkYwOTM1
-RTc3QTVCODMzOUY2MEZDODYzMEEwRTkyMUE0NDQ2NDNENjg1MDFFMjUKRjY0ODEzRkQ5NEFG
-NDVGOTA0MEIxNDhCRjA1NjhDMTk2M0Q5QjI2RDcwOTk1MTY5NDgzQjAxMUQ4NjVERDI2NDIy
-NTMyMkM0NUZDNjVDCjUxNzJERUM3MEQwQjJCNzkyNTk0QTlDQUNCMjFBMjI1RThEMDc5MDhB
-MDUyQUU0RjBGQkQzOTE4RjdGOUFCMEQ3RDJFQkRBNUYwRTA3QwpEMDQzMDQ4QzVEQThGMEEz
-OEMyMjVEMkMxNUE1RTAzNjg5MDQ5RDgwNDYzQjdDQzM1QTU0RTIwMkZCMjMzMzcwN0UwQTM2
-ODJCODUxNTAKMUJFMTU3MTVBOTRBQUZEQjQ5QkY2QkU1RjgwRDgzRkNBQjI4QjBCODAwRDY4
-NUU2NThENDEyODZENEJENDIxREYxMDQyOEM0MDU3N0FDCjM2Mzg2RkM2Qjc2RkJCOThCRkI2
-QTEzRkI2RkE0MEM2ODM3NjgwQ0ZCMTUyMEMwNzA2MjU0RkNFNjIyRDE0QUVCRjU4NzgxRTBC
-RjJBNgoyMjJGNTRDNDM3MDRENEUzNzBEMEFCM0M5MUY0RDU1MDFEQ0Y2OUZDREI4QTA4Q0Y3
-NzA2REZBNDU2QTExOTEzQzQyRjYxQTgzMkFFQTgKQjE4OTQwOUUxNDY1NTczMzhBQjA1OUFD
-N0JBOUNGRUVGMkFBOTY5QzU1NjFCNjc3NDE0QTkxNjgwNjQ5Q0MzREFGRjU3NkZFNjg2RjlB
-CkI5OTMxQTc0OUFEMTdGNkMwQzkwMTIwQUY4QTk1ODQ1MzVGMUYwQjdDMzExMzRDMDlDOENC
-MDdEODU3Mzk1RjAwRDk4Mzg0RDhCRkFGQQpGRTI3NTY2QUY5RTk2OTE1ODcwQzg3NDk5RUJG
-MjQzRDhFRTgyOTFFNjBEQzczQzhBREMyODg2RTREOTgwOEEzOTk2NEQyNEI4RUEzMEUKRjkz
-QjA0REZCREE1QTVCODY4RDI5RTM5NDUwMzBBQzBBMzk0RUM0NjU3QjRGQUQ5RDJFMkM3OTY1
-REM3RUE5MTZBM0UyMEU2N0JCQjdFCjk5RDUyNTU0RDIyNDkzOERFQjM1QjExNjc2RjkxRjVF
-RDI0QkE2NjcwRjU3NDUzN0JGQkNENDAzRjA5MjEyQzNERkMzQjhGNEREOUVFRgpERTI3NjU2
-QUZBNDFCNjlEOTA5NEZEMjM3NzlCMzdENkU1NERGQjZBNjU0OTIzQUE5MDkzMDA2QjIzQ0NE
-RDY4REUwRDZEQzZFOEIyMzIKNDY0REYyNTQxMkRBMzI0ODZBODE4ODc0NTA4OTFDRTQ5MTcy
-Q0YwMDMzQzNDRTAyMDZCMDJBOUJDOTRGQjYwOTQ5MUJEM0I4RjJEN0Q5CjA4MDEwMkFGNjg0
-RUY5MzkxMzE2MEEwN0ZFNzg3QjFGRTg0M0E5MDY0RENFNUUyOTYxMjEyOURGRUUwNTU2NDZG
-QjVCRDc4MDE5MDU4Qwo4RTMyRjI5NzIxNUFDNjMxMzAyMkM0MEZGNEJDOUEzODUyOUNFOEY1
-NzREQkM1NERDRUMwRkIzN0YxRTk5QTUwMTY2RjhEN0ZDNDBBRDkKMjgzNDgyOTUyRTA2OTJE
-MjFDNkI4RkQ3NTkyQjQ4RDc3QkQzNDg3RURGRjY5MzVEQTlGNEE5MjZCNUNCNjI1Qzk5NEIy
-MzY1QTM5Njg4CjA5NUI5QzQ2NjMyNTRDNzMwNDYxN0QyRUQ3OUYzMzNGNTc2OUJFQ0NGMEI4
-ODI4N0YxNzA4RkZBNzIxMUJDMENGOUJCNTcxNUVEQjczMwo2RjAwOUE2QTc5N0VCMzY1NkY4
-QjgyQUM5MzA2OTVBNTExQjhFNDVFMjAwQkE4MkI4MUYzMzc4QkJFMjE5NkI0QjZDRkExOUI4
-MjlEOEYKOEZEREE2MDA2RUUwMjg5NjVDMzRDRkZDNUQ3MUVDRTFFOTg2NEQ1Qzc3MEI2Njgy
-OEI5Q0Y4NzgzQUMxNDEzMzcxRkUyN0ZBRkFGNDZECjk5MjA0N0Y2NEMxRkJDREE1NUZDNjUy
-NUZFNUNGMTZFNjgxRkNCNkYzNTc4NkUyNjIwMzRFMUIxQjRGMDlDQzRBRjNBNDc4QTMwQjQw
-OAo0OThEMTkyQzYyN0IwNkFBRjBEODhFODdENEZFMTNEQzE0QTlBOEEyMEY5RUE0MDRGOERD
-ODlDMTIyNDIzRkZCNUIwRTNCODhGMjVDNEEKNDRDNzk5NDQ5RDEzQjE2OUUyOEE2MEM4NkUx
-NzM4NDc3MjU2Q0UyMkUwMTZBMDMxOUI2MERDOEE5RDA0MjZCRTEzNzYxNjk2MkJDNzM2CjZC
-RTY3ODA5NDI5NTVCRERFNENGNENFRjMxNzdFOUZDRTU4RTcwNkIzQkI4QTAxM0JBRUUzOTUw
-NkU3Mzc4QTlDNUExRjlBQUNBMkVGOAoyMjQxODY1NDI1MDFCNzY1RjAwMkI2QjM1QTc5RUQ3
-QTJBNzdERTExOTIyNTBBM0QxMTlCNjg3RDBBRDJDRDI2OTM0OEM2NTA3NUFGQUUKRDhERDgy
-RUNFRjUxRENCQzE4QzM3NEQ4QTA5MkQ5OUJBRDNBQjVDMjlBOEZEMjhGQjQxQzAyRUYzRTRE
-MDk1QjcwODJFNkQ1RUUxQTVFCjQzMDZDOUU4NzdBN0JFMzQ4RkNBMjQwNTI3QjRDMzQ5RkY3
-RkY4NDkwMUE1RDIyNDI4QjI3QUMzNEI0NEVDNTA3NDQ3NjQ0QkJENTUwMQo4RkJBMDFFQkEz
-NjkzNDE4RUEyRjY5MDZFRjNDMTU3N0Q5MUI2M0NEMEJEMkM1MTk1OTdFRTA3RDk4Mjk3OTQy
-RDgwQjBCNjVDMjU5ODcKOTQ5MDgzRkIwNjQyREZGQkJBRDc0QzIyQzNDMTAxMDJFNTdDN0FD
-MERGNDA5OUM5Nzg3M0RFRjcxMzk0NEJBRUI5MjAyODdCOEUwOTNBCkJDRTUxQkQ1MkNFNDVE
-QjNDNkE3MzdBNTVFMUEwMEFFQUI1MEU3MUY1RDVCMENERkU2MTU1MURDN0NDM0JEMDM5MzRE
-RjI3MkJFMTk0NApFRUM2MjFFQUMwMkRBQUQ4RTU0RTA0REREMkMzRjAyQ0VBQ0M5NDdDNzk5
-NDI0RUZEMUE2Qzc1QzdBMzVCRENBRDFEQkNCOUYxOUJDRTQKMTJCQjAxOUNCQzc1MjU1MzZD
-NUNFMjFFMzJFOUI5QUEwNjg1QzdEM0JGRjNEODJFRUZENjg0RThENjNBNTI2MDE4RjQzMDVE
-MTM3Q0Y0CjZCOTdCREZGQzFFMjhCNzc0NUM4MDgyOTNDMjRDODQ5QzlDNjFFOTNDQzY0RDk5
-ODIwRkZCQzVGMUQ5RjAxNkREQTYyMUM5N0ZBODQxOApBMDQxMEY3OERERjQ1MzE4ODU1MDk0
-NjRFNTVDMkVFQkUyM0FEMTdDNjA5NjE2OTk2NjhFRTc2QzZFNDRFMEQwQkNDODM5QjgwOEFC
-REMKQjZGQkI1ODZDODdBOTU3MTM2MjE2OTUzMzE1OTgxQUZCMjA4OUMxMTA1RUYwN0RDNDdF
-NUIzNjcwRUMxNjY0Q0QxMzcxOEI4REJCQzUxCjc0Njc1MEFBQTM3NEU3MUQ0QUJEQzMxRjhF
-OEFDMzgwNEU5MDg1OTdDQUI4QjNFNzBFQjQyQUM2N0EwQjVCMUUyRTYyODc5NkJDM0E2OQpG
-M0RGQjYzREI3REU0RTQwNDExQ0RCRjk4Qjg2Njg4QUY0Q0NEODY0N0FBRTRFMUQ2MDhBMDBF
-MDgzNEU3RDM0Q0ZEQUQ4Qzk1REYyMUYKQUY2MjQwNDY0M0JERTM3MDA1MTRCRERDODFCQjM0
-REY3NUM3RjhFREE3MDRCMTQ2RDIwRTE0RUJDOThCOUQwQTExMjE4RUM4NTc4QkY1CjIzOUU1
-NjMzNjA1Qzc2OUVGM0VGNjg1NUY0OERGMTZERDhERTUzMjBFMTg1MUU3QzE3MzExQ0VCMkY5
-QTI4MTE0MjRERENDMEU2QkQzNgpFNDVCQjUxOTFEODkwMTk3NjU3QjY2RkVFMDVCODNBQ0I4
-OEUxMkJFMUE0OEQ2Njk0OTE4ODA4MEEwRjJERjcxREE3QTJFM0IwNzJCMjMKRkU5NEYxNzYy
-MTZBRDVGOERCQUNFMDc5MTA2MTA1NkU1QkE0MzY0QkI3NDI3M0E5M0I4NTNEQjIzRTM5NjEx
-NkI4QzFDM0YzRjhDNTQ1CkE0MkYwMkQ0NURBN0REMkVBRDM0QzAxRURFMTYzRkM1Qjk0MDBD
-MEQzOUJGMENERTFCMUZDQ0JCNjhENDdCNDQ4ODVFQjBBQjE0RDIwNQpBMzBEMUYyRTRFMTgy
-NUQ5NzQyREEzRUJGNEU0N0Y2RjJGNzUwNTYyNDAwQzU0MzMwRjc5MkE5OThGRkMxNTg2NTA5
-NDBDMEIxMTUyODIKRDhDMjJDRDM0RjhDRDUzMkVEM0I5NEE1NDk2QzMzQjM4MDJBQzVENjI3
-QjVGMEE4NzA2MzExMTkxRUM0MjUyNTQ5RDgxM0M5MkEwMUE5CjgwNEIzOTQwMjY2MEI0ODkw
-OTVGOTQ0MUQ5NThGRTM4NzNDRDZFNkZEM0VBOTFFREZGRkZBQkFGNDYwQjcxRjFDMUVCOTcw
-M0E3RDlBQwpBQUEzNDMzN0MzMDZCNjdFNzQ2MEFFRTFBRjAyRTdFMkU0OUEzMzI1OTlCQThD
-RjIzMDlBRjI3MDM2MzFCNEQ5MUNCRUQyNkFGNDk0MTAKODMwQ0NBNzAyM0E3NTgxRTJBREI5
-NzM4N0E3REJBMjMxODlBQTk5M0I4NkJFREVGNTlBNzJGMjQ2QTRGNThFQkUzNTQ5OTJEOTE1
-MTRGCjEzMEFCMkMxNjc3MTdBOTdENjQ3QTE1N0JCNkIxRDk2OEFDODZDOUE5N0U4RkJERTlC
-MkUxNDFEQTdBMUVGQ0UyMTM5RDEzRjBCNzQ4OQo1MUNFNzNCMUFFOTNCMTlFOTNCNDU2QzQ5
-MTM2M0UwNDVDRDVBNEM3OUVBRTUxNzRGMzMyQTM2QTlCQzEwMDFCNzkzMDIyOTgzREEyQTEK
-OEE4QzdGQUYyMzZEQTg4NDE1QTRDN0EyNjJDQTcxNEUzNzNBNzMzM0IzNjZBQjM1QjlFMzlD
-NzM4OUE5RDNEQzM4NUVFOTUxRjY2ODc5CjE4OEM2QTUwQzNEOTU1NkNGNzBDMTlGMzMwOEVD
-QUUxMjAwOUMzMjRGOTNGNjlFODIwOEEyQThFOTY4NkVEQkIxNDFCMTAxMDM2OEFEQQo3OEVC
-RjNFNTJCRjA1ODI3RTQ1M0E5QjIzMThBN0EzMUI2ODExNDg0MTk0MzRDQjczOEE1QTM2QTlB
-MzkwNURCMDBGNDU5QjI2NUM3OTMKNDEzMzFBOTY2MTM1MkU0MDE1NzIyMUJGMEQzRUU5QTNE
-N0UxMDlCRDJGQUVEM0ZERkY1OEM4QjE3REQ4RDQxRUVBNzgwQTA5MEI2QTYxCkU4NENDODRF
-MEI1QTA3QjdGMTc2RTNFM0IyMUZBNjdBNkU1MUIxNTREQjE0MjJBRUJCM0YxMURFNTdFM0Ey
-OTI4NDQwQkRCMTAwNUJDOAo1ODU5OEQ4RDc3RjMwNjI4REUyNThGMjY2NzRDQURDMkFDMUUx
-NTA5ODFERTVGQ0RGOUE4MTM0ODU5RUZDOTUzNTI0QTgzQzFFNUY0QjcKMEFCODI2NzhEQTg3
-OThBQjU1OEMxOTgxREM2NTU0NUU5NjY5QUVDQzIxRUZGMEY0Mjg3MDlGQzQ1NzgzM0U1OTNB
-RjU4NDQzNUM2RDQ5CjcyMzlFMkU2RkU5Rjk5QTQ0NTZBQjhDQzU0MDU2RkUxQUJCOUM1OTFF
-MTFCOEUxRkE3MkFCRDFDMDdGMjNCQzY1RDgzQkRGMjkxNEYwMgo3NzExQzFCNTQwNUZDODQz
-NzFBOTA1MEZGOUI4NUYxMzM4Q0YyNEQ0NERCMjgwQTI4NEY5REZEMzY4ODE2MDI3QzlCMjFG
-NDFCRDdCNDMKMUFBNzM3OTc1ODVGQzkzQzBBNUVGMTM1M0I5MDEyRkRBQjgwRUE4REE2NDhB
-MzJCQTY4NDQzN0U5MDQ3OTNGQTRCQTM3RjgzQTg2Q0RFCkI5QUI0RkUwNkI1REIwMTcyMDEy
-Q0YyNzYxM0ZCRkVGRTEwOEI0NTlFRjEzQUJEMUYyNjZFNTkyMUI1MUFEQjM1MjM1QTkwQjhF
-NjQ2QwpGQzk0QjhBMkQyNUUyOTUwNTU4MjdCNzM0RDk2NUU5MUI1NTIwNjAxNDE1RjkzQkEw
-Q0E2MDc2N0M2MEFFQUFDODI2NzhFNTlCQUU5RjAKOEMzM0M5MjU3NjhDREE0MjMzNjkwMDZC
-NkE4NEU5RUNGNEE5NTc2Qzk0RkJERkRBQzMyODFFMTNFODg2MDNEQTk5MTNCQTFFMTQ4QTZG
-CjlERENEMTlFMjRFMzlCMjIxMDAxRjZDODI0ODA2QTA0NzQ3Q0IzMDVGOUZCN0IyMkFDNkM1
-RUIxOEU2ODQ3Mzk1OUE1REIwRkVCNUVBNAozOEFBOEQ3MjkyQUVBRkZFQTg5RTlBREU0OTAz
-NEUwRjAzQzJFRERCNTdEMTVDMTEwNkYyQzUwRkMxOUUyNzYwQjhDOEQxRjNGMjFDQzIKMzA2
-NDg1QkY0MzdCQUU0QjcxMEZDNERBM0E3QUE1M0Y5QTVCMEVDMTM0ODg2NDk0NDgyNDkzNDhC
-N0ExNjE4RjU2NDU0MDRFMDRFQjQ4CkQ4MDlEQzBCRDY4Q0IxMkFEMjJGNEI0NkZGMkU5Qjg5
-OTJCODEyRjJDRkM5RjZCNDVGQUM0QjYxODA0NzlFNzZGRUFDNzk0NkZENkRBMwo5NjUwODVD
-QUExNzZGREE5ODgxMDM2MjIwRTI4OUY2MTI0NjMyMzY3Q0Y3NjYwRTBDRjUzNDFFNjc1QTNF
-NzkxNDM5MjQyMUMxQ0E2NDcKMTAzRDRCOUREMDI2MzM3QzRGQzVBMTQ4QzM5RjIzMTE1MUQ5
-RTBDRDQ0MTNERTAzMzc5Q0YwREQxMEQ4MjlCOTVDRkY3MEE4OEJGNTQxCjZCNjA4ODUyOUIw
-NDAzMUMxMkI3NUU2MDFCRDcyQTFDMUNGQzUyQjVEMzc3QzVCODA0OTAxMDVBMEJERDVCNkZF
-NTgyMUZGNzdFMUE3NApERUU1QUZBNUFERUY4RTQ3Mzk3NTM2MDk2NUM5N0JGNDhDRkJGN0Yw
-NERBQzc4NzhEMEIyMTkwQTY2NTk2RTEwOTM0RUJDMURBNTU3NUIKQjU4NTFEMDRDMzRCQUIx
-Nzk3OUIzNURGNTZGNUUzREQ5MTRENkRFMTlGMjIzMTA4NTQ1MTNDMjc2NkFCNkE2QzU4NDgx
-QjA5OTNDQ0E4Cjk1QjczQzNENDU0MTQ4MDNGREEzRDQxM0Y5MjIwQUUxMDA5N0ZCRTdBOUE2
-Q0REMTUwQ0EwRjg1NzVGODgwNkI3RjhFMzVEMTdEQkEwRQpDOUI1QjgyN0I4QjI4RTYzNEQ0
-REZGNTg5MEQ0MDI2OEM5NkE3NTJBOEQwM0VFQjExRjA2Qzc3MzZFQjYwOEIxMDFDMjFFNzFD
-RUVDNzAKNzNCNTRDQjYzOUMyM0QxMTM0NDM5M0ZBODU3QUJFNzJCREE3RDBCOEMxQjQ3Qzky
-QTE4NTE0RUE0NDQ2RTZCQ0YzQzcxMzA1RTUzOTYzCjlBMEFFOTY1RDhFMEUxNEI1MURFNzk1
-MzFFQTVDM0ExQzBBOUY4QjhDQkU0MkEyNDE4MEUwOUFDODExQTg1ODExQTUzNkM1NjhEQjM5
-MAo4RjExN0Q1QTA2QzA3NUM0NTJDQzIyMjZBOURGMTU3RDg0NTcwQTY1REU2MTE5Q0Q2OUJD
-MDkzNkEwQTRFMjQ5NTMzMEEwMjNFQzZDNzkKRUI4ODQ1NDU0QTg4QURBMUQyMkIzMTQ3QUQ5
-NzI1MzdDRDZDOEI3RjFENDFCNDEzOEZENkU4OURGQjY1RDEyQkJBQTI1QzBFMTgyMDc3Cjc1
-NUFGNUYwQjQxNDdERThEMThDNTlGRjFFQjQ2NzdGRERDQUYyRkVGQ0M0OUMwQjMyMDZCQTI2
-MTYxMThBODZGODVGQ0RFNDEwNThDQwpGOEJBQzkwNDVBRUNDMjkxQzVBRkI0QjkyQjA2NzMx
-NUJCQTM4Mjk1QzI1NkZERTlCNEQ3N0I5OTQ3MERCQjBCOTI0MEU2ODJDRTlERkYKQURDN0RF
-QTM0QkUyNDBGNjQzMkRGMjkxQzE5QzFGMkE0RkZGMjA2QzA4MzJCRTYyOEVGMTU2NzJBMzA5
-MUI3QUU3OTY3OTgwRDEwRTAzCjZFQUM2REE1NDBDMDk1MDFBRERGOTg2MEM1OUU2RDcyMUU1
-NTlGM0JGODBCREQ5RUQwRjVFRTNFOTUxMzBBQ0Y2QzRFQzcxNjFCNzE5MApDQTREOUY3NEZG
-REMwNjBDQzM5RkEyMDgxMUM2QTE3MjVDREMyRjYxQzA4MDAzNjE4MUFBMjZDNDNFMDU2RDhG
-RjI2NjBGNDkyQzk5ODkKMzUxQjM4NDRDQzIxMEZFRjA2OTQyNjUyODJEQUZCQkI2QUFCRkRG
-RDYxNDhCM0YyOTgyOTkyQUQzNEJBRjNFMzRCQzFFMkRBRjJGNDVBCkJDRkY5QTk4ODg0MTIx
-NThDNzNGMDI4OUY0NEY3NzkzQjA5QUUxMUQ3Nzg4QjJERjI1MzlFQzA5RjBGQzdFRTkxREZD
-ODM2MDcwQTM4RApGMTJERTFCODY5MDE5NjY0OTdBRTBFRkIxQzQwM0Y4MURBNUNEMzcwNDFG
-MDI0MkI1NTcxOEE5QjQ4NTUzNDVFQUY0REZFQjZBMDAyMEIKMzk5NjYxOENFQzU4QzA5NDhC
-OEQ2ODA0MkE4NzM0M0U4MUZBQTgyQTIwRjE1QUZEQ0U2ODU2MjgxRDgwRTcwODI3OTlCNjU0
-MzU1RUIxCkM1MTVCMEVEQjg0MkYxNTNBMzBFRjEwOUYzMjgwRUVBRTcwQkQxMTA3OUIzRjMz
-OUUyMThBNzdBNUU3M0U1NUY3NzM4QTBDODFEMjVGRApFNUEyNEVBODk5RkFEOEQ3RDVGMTU2
-QkNBOERGMDE5QUIzMUJFMEJFODk4RDUyMUQ5M0UwMkJDQTUzRjdBRkNCMTgyNUEwN0JFNzY3
-NUQKNDRCQjg4NjgzNTQ0MTZGQTNDQjA3MkUwMzJFRDRFMTQzOTdEODk2ODlEOTk4QUIzNTQw
-RjM4NTFGNEQyNzFGMDk1MDI3MEE3MjZBODg1CjVGRUI1NThBRDM1MzMwOEQ1RTE0NDhCMzQ4
-N0Y4OTVDRDAyQTlGMUZDRjcxNjREMzI3NDdDRkJGRDdCQkZBNjM0NzBFODRBNDBFQ0Q2MApE
-REQ5RDRBMTQwQzE4MThDOUIxOUE2N0Y0QkE3RDRDQzk1ODI0NDVFNThGNEE5RTcyQkUzRkE2
-NkYwOUZFQkREQzQxQUU5OTU1MjU4NDAKOTRCMzcyQ0ZGM0NDQjc2QTZERUNDMjA5OTFFMzhD
-NDlCNzA4MzRFMTY0OUNBREVEMjlDN0EzMzY4QTkzRjE5RDE5QzhGN0JGRUU5NThDCjAyMUY1
-NDczMUU1RTYzNzkyOTJDMkVFODg5ODA1ODYzM0RGMTlCQzVGNzQ2M0I0OEJDMTJEQzJERTky
-QzNBRUJFMkU3RUYyNzMxNzJBNgpCMDY0QjYwNzNCQTc5NTBEOUIyMDMxMTk0MTE0OTRFNjk0
-MDk4ODAzODQ5Q0YzQTI3NTdBREQ3NThDNzI2MjkxNDA3MDg1RDE3QjA1NEMKMEI1QUIzNkI4
-NDNBQjEwRTQwQkMxRDU1NkU0MkY2RDEyQTQ5MzRBRDk4QUExRENFMUYzQjVFMzZCM0NGRTk2
-MURFOTFFRjZEMjQyQUExCjkzRDIwNTgyNzk4REU3MTQ2OTY0ODQyQkE0OTkzNEQ4MTE3NTM2
-QkNEQUExQkY0Q0ZEMzlGQUQ1NkZEMTEwMTI4NTA2RjM5MTFBMkY4MAowQ0ZBMkFGMkI2RjdG
-OTMxNjQ1RjhGN0E0OEEyOTM0MUJEN0Q1MDM1MTM2MDBFOENFMThBMDg2NTc4QzE1OEJFRjQy
-MjIxNDFCQTFBQjkKNzQ4MjkzNDgzQUI1QkE3NTA5NENBQzY5RDZCNDhEOUE1OThBMjI4NDMz
-MjJENzFGRTRFNTREMDE2Q0JEMTM5RjFGQjM4NzMwQTEzN0MyCkI1NkZEQzM4RkRDRjRCOTEx
-QUY2NUQ5NjY2RkU4NzFBMDE4NEVCM0M4Njc3QUM3N0QyMEI2NThEMjExOTU2QjEwMTM5NkM3
-MkM2MzgyMQo1QzIxRkNGNTE0NjE1RjdGQkU0RUVCMTdEQTlFNzlBQTJEREI2QkNENDg2QTVC
-M0RCNTIyQzQ5RTc4MTU0NzQ5RDk2NTZFQkRFNjMwMDcKMjFERENGMkQ3MzhFQzg4Qjk2RTIw
-MThBNzZCQjQ3RjcxRUNDNkQyRUEzMzA3OTZCQ0U3OEMxNTAyQUUwMzNEMUI5MzZBQ0Y0QjE0
-RkE3CkRBNjY1QTk3RTRGQTNBQzA5RjlDMjY5RENENTQyMkMyMEI4RTVFMUU0NTMyMjY2MzA0
-MURBMDFDRkE3Mjc4N0U5MDNENEQzOTc0NzkwRgpFRTIyNjY2RUNDNkM4OUFBRDg5RjAxRTVD
-NjgzRDMxQjY5RDI5OEQ1QzgyMzQxRTE3NzM3NDEzQjQ0QjhDREQxMjE3MDVBNEJDNkJGNjcK
-MkNFRUVCN0M5RjhCMTNFMUVDQjc2MEE3RUZGQzFDRTYyMjQ5REFBRDFBNUYwMkQ2NUZFMkRE
-OEQ3NkI5NjREMUVBOEJBRjlBQTI0MjhBCjAyMENFNkFBQTQ4MDM0RDBGQ0UzNkNBRDk4MkE0
-NjQyOEQyQTJCMjc0MURFQTY3NEMwMThDMTI3MTMyODlBODlBNjA4NjA3MTk0NjNEMApCMzVD
-NzZGQkZGOUMzOUE3M0IzMjc3QjM1NzQ5M0M3MDRFMUJGQkNGQjg2QkY1NjZBREY3MEYwRERD
-NUQzRTAxQTA0MTM1MTEzNTg5MjQKMkNDOERCMzEwN0UyMjk3MzM5Njg2MDhCRTAwQURDMUUw
-REU4MDQyN0M2NUM3NEY2OTZCRDI1NkE5RTc0NzMxRUZBMTgyMDI4RDAwRUY4CkU2ODZBNTM2
-NzZGQkFFOTg3MEU5M0NEQjdDM0FFNkFDOUY0RjYyOUU0MEQyMDlFRkJCMjk2MUY4OUFDQ0RF
-ODE3QzQ5MDZERTIwNTBFNQpERTk2NDZCMjE2RTMxQTRGQTAyRjk5NDFBOUExMDRGNjU2ODA3
-OTY5RTVFRDRBNjM5MDAwQzdCRUNFQTU0OTlCNkJFRDEzQjAwQzdGRDEKMTQ3M0JGMzIyQjNB
-NTZCQkIyOTBDMjMwQzY3RkQ1MEVGQUUzREE3QzJEOEZEQTI3QjBCQzY2OTQxRjgwMTJGRDRB
-NDBEN0U2NUU3Q0RECjQ0OThCNjNDNDUyRjE1OUJBMTdFMkI5MzhCRkEzNDM5QkIwREM3MUY0
-NTUxRUI1REQxOTZDOEI3QzBBREFFRDFDMjU1ODgzREZCRjkwMAo5NDc0MDI4MzI5MTY5M0M5
-REM3N0M1MTRGNDUwNTUyQzY2MTIyMjI1MzhDNTJCNjQ3NEMwNzdENzFFMTM2OTI2M0VDQjQ5
-NDgxOTQ1MTQKQ0RBNkE0OTFFQkE0NjRDMjYyRDkwQzExRkQ0NzA2RDM5RUI1RjNGNEVFRjI3
-QUFGMTUwREYyRUVBRDdFQTA2RTk5MzU4QURFRTBGMUQ1CjlBMjREQ0VEMkZCNzJEQjg0OUY0
-RUFDRDUyMzkzQzZFQzg2RTlDREI3OEQzNkI2QjMyODBCRDdCMUMzREYwOERCM0JFNzM2ODcy
-MzJERQpBNEI2QjU4NUNCQzM3NDgxNjRDMDU1RjNEN0Y1M0MzM0Q5Rjc2QjVEQzdBRDc0MjYz
-RUMzNjJEOUUyRkE5QkY5RTQyNDdCQjkwMEM0REMKNjBFOUI0ODk4NTMwRERFQUZFMkUzMTY4
-MjdFMUNCMTNFOUU3Q0Y4OEQ5RkUwRTUwNDNBNTVCOEE1QjEwQ0U2NTREMkQzMTUwNDEzNUE4
-CjVFQjU2NjY5MUI0ODEyRDZFMDVGMzRCRTJEQzZDMUJGNzBDQTE5QTY2MzMwMDA3MzJGRUJD
-RTBFQkY0RTI4NzIxQjc4QTEyRjIzRjc5RgpBRjQzRjJDNjAwRDQxRUI0RTM2OTBCN0VBMjRG
-QzFBQTMwOTJCNUVBNUFBOEY0NzlGNEY1NEIyQzc3MjEzNTE5OTJDMTE0QjhBNzk2MzYKRkQy
-MzVFRTkxRDZCNUIxQkQ1Q0Q5MThFQjM0MzZDOTI5REMxNTFDQjVDNDJFRjRGNjJEMjE2MDRG
-MEYxRUIzRTAxQUE3ODQ4N0I0QjkzCjg1RDBFMDlCOEUyNTMxRDkzNkY1RDNFRDREOEMyNDRC
-ODM4QjhFNzI0MTZGOUQ0NzE2QzQxQzg5RTI5ODBEQURBOTJCNTBBQzk3NkQzOAo3RjlFMzIw
-Nzc1RUMxRTlCMDlBQzkzOTE0RTAxQTcxNTY2Q0E5MzQzRTg1M0NENjNGOUMwQUNFMUZGQzQx
-RTAwQjUwMDNBQzVGQjY4QjgKMERBRTVGQkVCNkNEODQxOUUyNDM0REJFNDBEMDE3RkJDREY2
-MTdGM0E4QjkxNkVFNUQ4QUNEMzY4OUE5RkE0MzhGNTRDNUFFNUMwMkUxCkNDNjYwNEMwMjE0
-MDBBNDM3RTcyOUM2RkE5QkVGNTVBMDQ5QzcwNTZERjkxQzY4REEwQzJGNzk5MEI5Nzk5NEEx
-MERDRDQ5MjYwRkNDOApCQTMxNTIzOENDMkRFRkQwNzY1MURBOTc1REVDMTg4OTcyM0ZBNTAy
-RTRCRkE3QURERDI1MTM4Qzg0QkMwNDlFNEVEMjU4ODVCOUFBNjYKNEJBMThCMjM3NjRDM0FC
-NDEyMTNBNDMzOTNFRUI2RkI4MzlBRjI5RjlFNEI3QUY0MzE3RTQ1NUM3RjM3NTQzQzY2OEFG
-OUI4QjZEQUFDCjA2ODM3MEU3ODdCN0Q2NEFGRDBFOEMwMTBDQ0U5QkIyQzBENjdBNkQ4Q0Ew
-Q0NEMkY2REUzRkJDREUxQkM2Q0Y5RjdBRTg5M0Y5M0FFMgo5QkJFOUFFNjI5MjFDMTc2QzlE
-ODdEQ0E0NjA4REFCM0E0MkVFOUMyRTFGMzE4MEQyMDBDRkMyQ0M5NzA2Mjk1QkYyQkM1QjQx
-Rjc2NDEKMUUwNzNDMzZENTAxRjdCMkYyQTQ4MkQzREU2N0ZFMkE2NUFGNzJBOTA5NTM5RDEx
-MDlFNzA4MDBBMDEyNjMxNTQ0MTQ2NEJBNUQxNjg1CjBEMDQ0NTU3NDZCNEJCREMwODVFN0Qx
-NUJGMkNBNUNEOEU3MTdEREU4NDE1QzE3NjYwNTc0NzNGNTNGNzRFNTQ0Q0FGQkExN0Q1QTRE
-MwpGNzg0MzgzRkM1Q0FGMTUzMjYzNzk0QzhERUI5QzA2MTU3NDA3QTBENjVCMERGRENDMjAz
-ODFDQTBCNTQxMjBFODc0RDgxNTRDQkMwMTYKNkYwMTVBMjVDRkNERDUwQTc5OTI5QjJBOTM3
-NEJCNzM0RDNGQ0U1QTcyRTI3MDA4OUNDRjZFQ0MwRkFFOTNGQTczOTdEQjc5QUM5MzAzCjE2
-MUJFQzUxQjhDNTk5ODgxNzA2QjEzQTY3MzI0RjAyOUY2MkRBQkU4QkQzOEQ2RkM1NDAwRkUy
-OEVCOTAwMzNDRkQ1QTFDNEEyMjcxQwo4Mzc1QUE5OTUxOTJFNDkxNDM2RTk2QUM0NzREQzNB
-MDU1RTVEMERCNzUxMTZDODhFM0U0QTI1ODEwQjE1RTgyQ0EwRkFCNzc1NDYzMDUKN0FFQzZE
-RkRCNTY5QTJBQkJGNUY2MUVCRkI1MzVDRkNDNDUxREVERDEwMDFEQzg5MUE3M0JCQzM3MjY1
-OTI1NDNEMTVBMkM5MEQ4NzQ0CjAxQjk5NkI4MzlBRjVBRkU1QUQ4NUEyNzgxQTc2OUQ2OUIw
-Nzk0ODZENEI1QkRDMTAxOUNEQjY5MDQ2RTQxOTJFRjY3RUYzMDA0NzE1RAo3RTJENDhGRDEw
-MDBEQTkzQzJEN0E5NjNGQjgwRUY0NUEwRDUzRTcwNTVENUE4RUI4NzJCRDkxOTFDOEFBNTQ0
-QjhCRjJGQUFENjg1MzEKMzkwOTI0OTU3MTY1NkE2M0VGMTEzQUI4OUFBRjNEMTJGMUEyNzkz
-MTk3OTYyOTEwRDQxQzVDNjkxMDAzNDhDNUI0ODZFQThDMzU0MjlECjExMjI1MTQyQTcwQTU3
-OEI1RDRBRkVBMzNENkM2QTZDMjBDRUU4N0NCQTlDQkMzMDgzNTA2N0VCRDYwMkM0QjdFQTND
-N0E0MUNGODA2MQpCMzM3RUU5QzRFMjc5RTIwMEM5MjRCMURBMEQ4MUM3MEJFMTgzMDQ4N0RF
-OTYxQkI4OTQzMDA4RDZGQkEyRjVGNUMwQTBFMzE5RDBFRTIKM0M0NThBNjlENjg3RkFBNUZE
-REE5ODVCMzU5M0NFQjc1RDA5OTg3MzZFRjI2QkUyREMyRjdFQ0Y0MTdBNUQxNDBBNTE5NTNE
-OUYwNkI2CkY3RUVGRTVFRjFCMTNEQzUyNUVBRjhBMjAzRDQzNzExNDQ1NDhEQjhEODQ5MDA1
-QkQxNzUzNTRCOUUwODM0MjEzRUJGMjU1ODE3NjVERgo3QjREMjIxNDU2OEM3OUEyRTBFMkRC
-NzlCNkQ5QTMzMEI1RDU4RDkzMjNDQzIxNjU0RUNFQ0JERjdCQTM2QUJDOUYzMDI1QUE0MTRB
-MTIKRjRBMDgwMzRBRjQzN0JENEExODQ4MTFCOEM4NjFEMjFENjhDODlFMUQxOEU1MUFDOThB
-MzA4RjkxRDdDREU0MDI0NDlGRkZCNEQ5MkFBCjdDQzNFRTI1RENEODFEMDM3MTJDMENCMTY2
-NkRBQTU2NjlDNzU1MkMxOTY3OUEyRjEzNjdBMjIyNjM0QTNCM0VGRjdDQjIxRkJCQzBGNgpC
-QzM3QzYyQkFDN0ZDM0RBMTk1MzMzNDRFREI1Q0U1N0M4Q0REOEE2NjM3QTc1Q0JCRjgxMDBC
-ODA0OUMxRjFCRENCNjk1RkUwNTJBMTMKNDc4RDVCMTZFMDI1OTc1RURBMDU5OUU2QkU3OEYz
-NDVDQ0Y5OUEzNDk0RjYxMEZFNDYxNENGNkQ3RjQ5NTE2N0Y4NjI0RTVBODM3MTU3CjQxQzk4
-RENDRTQzMkE3MDIyMkY0QkRCMkM5NDZFODA0QkY1OTAxRTQzMjIyRDg0RkRCQUNCNTA1OURE
-OUJDOUE4NzRDNDk4MjMwRDNGMgo1Njk5RjY0N0M4NzNENjAxNzQ4ODk5MEMyNUY0QTg0RUM0
-QzM4QURENDZBQkFCOTNBMDI3MjIwMUNFM0ZBM0IxQ0YyMzlGQ0E4RkY1MTkKOERFNzQ3NDUx
-OENFMDVGM0YwRDlFNzJEQTQ0NjU4OUNEN0MwODRCMzU2N0QyM0JDRTMwNDlGRTU5RjA1RjU0
-MkEyOTcyOEIwOEE5QkQ2CkU4NTNGMzYzN0E0Q0M5ODY1MTk2QTI0QzlDNkMzOEI5N0UyRDIw
-MDVDMkNEMzk1RTk0MjYwQUE3NTMwQTZDMTM2QkJDRkVDMzMzRDBGRQo3NDAxNEU2RkY5N0JC
-NzJDRDA3NkFEQTIxQjk2MDQ2MkIwRUM3MDk3QTc4MTJFRTMwNDRCMTUyOTNBMDJFM0UwQzcx
-Rjc2RTEwQUNEQTEKNzNGMjlDRUNENkQ5QUFCN0NGQ0EzNDA1NzcyNDYzQ0JFMkJBNkQyM0Ey
-NzA3NTVDM0M3NDBBNUJDNEFEMjdDMzVCOTU5MzJCQ0Q4QjgxCjVGMkU4Nzg2QThGRkE3NzQ2
-REE4OTFDODNBOTYyQTNEODhBN0I2MkM3MjBBMEM3MzYwMzk3QTRBQzc5RDMyRUYwMjBDODQz
-QTFBRDg1NgoxNEZDRUE0MjdEN0Q0NTJFRDZEMjUyMjdCRkQ2QTdDNDkzNDBFMTc4OTA2QTA5
-RDYxNjMzN0ZFN0EzQjQ0ODU0QjdCNDQ5QTQ4NTZGNkYKQUQxNTczNjY1MTc4NTA2NjZGRUYx
-MjdFRTg3RTk3MjM0QkU1RTgwNTlFMTk3NTI2MURBRTM1MzA4RjMxQzNFMTREQkFDNTZGRDdD
-MDU1CkJERUEwMjgzN0ZBNDE4M0YxNThGODcxNTA4MjFEQTUwRkUxQTU3QTc2NDg0RkFCOThG
-ODA4Qzk4QkRERDQwNjYxRkFEOEJBMDBFNjRDOQoyNTE3RTI1OTE3OUVDNDBERjlFQjAwNUY1
-MTdFRTcyQkU3QTNGM0YyMjc0QzZGRkUzNzEyQTRCREFBODcyRTE5RDkzRDhDMDEwNTY0NzQK
-NDFENzJCMTYzQjQ2MDk0Nzk3N0Y5MzIwNkNEQTAyODJENjNGM0I1REIwRDg5MTFCNUY5MjFE
-NTA1NDA4MUI0NjBDRjZCMjEzRDI1NDdCCjI0QkM0NkNDREJGQTNFN0FGREU3NDUwMUI2OEEz
-MUJFNUVDRDAxMUY0Q0U2Q0ZGRDNENzYyQjJEOTAwMDVCQTczMkYxNTU4MUFCNkVGMgpFOTky
-NjRBMEUwNTVFREYzQTJEOEM5Q0ZDRkMwOTg5QUJFM0IyRTlCOEZGMDhBMkJBMUVBRTFGQTky
-RDQ5QkRFNUM0NDdDNUMxNTZDRjAKRTVENUVGNEE0NUExQ0ZBNzI1NTRCMEFENzc1MjBDNzI1
-NkZEQzJBNzA1NjQ5MkQ1MkQ2Q0I0NUZFREQ1RDYyN0EyODk1NjM5N0IwODY5CkFGQkZBNTNC
-NUQzRDExM0U3RUNFQTA1MUEwRTNGQUI3Q0Q4RTYyQkRDOTRGOEI0ODJFREVGRTNGQ0Y5RDM5
-MUU1OTc3N0RFODFFNTYwOQpEOTJFQjcwNDQzNUIyOTFFMzFDQUE2ODVFMjFBRjQ5MUFEQ0Iy
-RTJDQjY3RTQyODAzQjlCODRBNjQ3OUMxNDkyMDZDQjU3NTAzRjY2NjkKMzIzREJDNzE4MDA4
-NDREMDVDMzM1RDk2NjM5OEI0QkFCMTIwNzk5NjU3NjgyMzZEMjk5OTRCOUI0RTNCNTc5NEQ2
-QTg5NzZEMkM4N0E5CjFBRDMxQkU1RDk2MDNBN0MzQTA2MUMzRUM5ODI3RTZFNDhEMTA1RjA5
-M0NGMTFFMTg4RjIzNjgxNUQ3RDA0Qjg3OUFGQ0Y0NTM2QzlENwo5OTcyMTgxRjNCNzc0MUU0
-OEM3MDgxQ0ZFRjVBN0NGMEUxOTI3RTgwREQwOEUzRUEzNjEzRjVDODY3MTc1M0EwMDcxOEJF
-NDJFQTY3NDYKRDk1MzJENUE5QzZDNzA1RkJBMTY4MjJFN0E4NDdFOEIxQzE3ODAyNDc1NEI4
-MTJGNkIwOENCN0I2NzlCNUNFMjlEMDQ0RTlBMkY0MUU3CkNFNkRFNkIwODhCM0MxRDNDQTg4
-MkVFNjY5MkNCMThERDlCNTA3MENBQzIyNEM5NUJEM0JFMEYwRkIwNzIxODk0N0E5QjM5OEM0
-MEQ1NQpEMEUwOUFGQzc4OEQ0MzM5MkYxMjJERjNDRDc0NjEyQTIyMjZGQkQ3NEE1MEM1MzQ1
-NkQzNDRFMzcyNUUyMURCMkUyRTE5NkZFMTUzMkUKMEVBNUNEMzc3MkM5QTBCM0EzQUU4QzND
-NjRERkVBRTRDMjFEMTJGNTcwQTkyQTg0Qzc1QTg3ODA4NEVCRkFEODcwQzFBNURBMzcyREVB
-CjQzM0VBRkQ3OUYzNTBFQkIwRUUyMDgyMkU1QTUyQzkyNzMwRkQyQTBEMDhGOUEwMDRERDA4
-Nzg1M0E0OEQ0OTUwN0FBNUIxQTEyN0QxOQo5MjFEQkNFODZDREQ0MDdCNUI0MzU4RTA5OEFF
-RjMzNEE5RkY3RTRBQjNERTk0RDM0MTRFNDdENzU4QTRGMzc5OThCQTYzMjNBMjczODUKMERC
-MEQ0MUY5NTgwMzQxNTcwQTRDQTcxNDlFQzZFNEY1RDk1MkU1REY4MDI0Rjg2RDJGQjk2MkQ3
-QTcxN0FFREI3Qzk1OTY4RDNERDQxCkRFNDVGMzgwODM2RjAzQjkyMjg0MDFCNUEwRUE4QkE2
-NEQ3QUI2MEM1QjQ1QjhBMjUwNTBCOTg1RjYzRjY2QkFERTZBRjE0OUMwQkU1Mgo1OUQzNjhF
-RDE3MTZEMTI1QkY2QjU1ODdENDQzQzZENUVENzI1N0MyOENBQTc0NzEyMDU2NUZEREMwMDc4
-RDREODA1QkE5MzcyNDQ3NzIKMzc5MjdBODIyQUI2RTA4REFENEE2NzJGMjhDMEExMTU5RjA2
-MUY0NkU0MTYwNkExRTAwQUQwQzlCRkRDMERCNTcxMTQwODNFMzE5QTcxCkUxNTBGNkYyQjVB
-QzI4OTQyNUY2QTdBNDQwQTgzMjAyRDRBQThCNERFNzQ5MkE5NUZEMzQ3QjI4MUQ3RURGNjM0
-Mjc1NjUxMTc1OEQ2QwpGQkFBRTVFMDczRjVEMTVBMzc4RjM2REQxODk4RUNBRTQ1ODBDM0JG
-ODlENjQxNkNCNTIxNTA2Rjg2QTJGQUZBMDRBOTFBOTNCMTkxQjAKQUJENUQ3NzI1RUVEQjJC
-NTk4M0MxNzMzM0I3OEQ3REM4NEVCRkI3RTRBODQ5RDNERUIxNjc2QTQ0REYyMTUzNTkzMUZD
-MTZEOUQ4MThBCjBDNUE4RkU1RTQ0Mjc5RTEyQkMxQ0EyRThCMkVCRjkwNTc2Q0VCQTk2NTZF
-MkVCRUQ3MjU2NDNBQjI2MzQxRDlEQTA4MEVFNTcwOThBMwoyNkI2OUVFNENFQzVFRTY4NEM2
-MUQwMzg3NkZCRUVCRTY1MUQ5ODA3MzhDQzIzQ0NDQzczNzYzMjgzMTRGNUE2RDEwODM1NTI2
-MzE2MjcKMUMwMUE1MDE1MEZFODU0N0I0QkNBMTgxRTFEODg3RUVDNDY1RTJBRjNDQTI2RDRG
-RkE2OTlCMEVDQjlFQUIwREE3MUE1OTBBQTFDRUNBCkZCOERCMENDREExOEFBNzYzMzVEQjc4
-NzRCREM0OTIyNEQxREEzNjMwMTFCMEY3MTg3RDJFMEQ4RkQxOTE4OUE1QzgyQzRGRkFDNENC
-NgowRkE3QjA1MjFCQTUxOTREMTIyMkQwNzc5Qzc0RURDRTY3Mjg0OEMyNzVDOEY4RTlBRjM5
-RTBEQTNEOEJFOUIxQkQ0MTE4RDlCMTFEQTkKRDIzM0Q5Q0JFOEM1QUU1RDJBNjBGRkY3RDI4
-NTY1QTY2MEQyN0Y1MTVENkZBMDg5N0NFQUQwNEM2RDZFMjUzRTBFRDVFNTZEQzFGMDA1CkZD
-RTJBRDYxOEY3OUNEQTY4MjY4NzVEOTEyNjJDQzZENkE2NEJGRDcwRTdGREM5NjVDQkE5QzZC
-RDZGMjUxNzQ4QTVBNDJCRUU0QUIyOQowRTAyNjJBNERCNTgwMjQ5QTAwQzY5RDFDQkRENDlF
-M0FDNzAwQ0I5NzNCQzkzNThBQkVGOEExMTZDQjVEOEQ0NjY4QzMwMkVCREYwNkMKOTUwNDY4
-NEQ3RDE4RTUyMkY3QzQyRUM2QTc3MTcxNTUyQjg3M0U3NTNDMUExODg4NjY2RDIzRTZGOTIy
-NUQwOTJDNkRCRjZBMEQyN0M3CjY5MzM2MzJDNUYxQzVFMDFDOEUxMzlBOUVCOUJDMDg0ODI4
-Rjg1MDk1QkQ5RTZFRkEwMjI0Rjg2OTc3RENGRTY1M0YwMEFBNjkzNjIzRApDRTA0NjkzQTdF
-RTIzODRBMjg1QTZCRDdBQzg3NjcxNjZGREU3NTE5NEUzMjZDQUY0NDdGRUJEMjQyQ0JGQzcx
-QjYzNzQ4NkY5OTM0QkQKMUFBOEJGRTNDQjg1RjNERDI1OEUwNzlFRTkxMEFGQTY0NzcwRDVF
-MzBDQTlCMjg5QTREN0ZCN0NGQzQ4QTcwNDA3NzREMzZFOENEMDYxCkFCMDZGQ0Q5MjM0RDUw
-MzJFRjY4QUZDOTQzODUwRTUzQzFDMzk4MDAxNzU2M0M2N0U4OTM5M0I4RUU0RDkzNTg1QTRF
-RjE1MzNENUYwQwpBNDBGQUI2RUJFODcyMUY1OEQwNUFBNjlENjA2N0MyRDZDQjAzRkRGMEI4
-M0RCREI2OTZENEQ0QUFGMzEzMEE5ODcyOURBNThDQ0Y1NDYKQUIyMjAyRDBCNEFERTZCNDg0
-NUExMjAyRDNGMjQ1NkUzNEExMTAwRkQ2RDQ0NTIwMzE1M0ExRDExRjNBMjUxMUNEQTgzQzkz
-NkFFRjNBCkIwNUI1RkIzMkI3NjAyOTE1M0I3RkJFMDIwNTdBRjY5OTNGNDcxNDlFOTAwODBB
-M0FGN0NCMjk3NjIxNDhENkY5NDUyMEEzNDNFNTI1RAo5NjQ2QzBDNzlGMUM3OUU3NTQ3MEQy
-MzJFMkIyQ0NDMDRBQTg5OTA5MDlFMEQyNkRDNTQwNTgyQjY5OUE3MUJCNTE2REMyODYwQ0FG
-NEYKNkYwQkZDN0I1MjkyMDUyREE0MURCOTJCQ0QwMzA4NjNBMTE3Mzc4QjkzREY3Q0Q5QjAy
-NTI5NjRCQjREODAwMDRFRjhCMzAxMUU5NTUwCkRBQUUyRDI0RjJEOTY1RTkwMzQyRDg0N0Iz
-Njg1REIwNTYzMUQ1NTBDMUZDRDc2QzNCMzkwM0VDRUJBMUEyNDk2RjBERjI4RjRGQTM2NwpD
-OUE5RkRCNDhFNUUxNDEwRTgxNUQ3RTkzNTExRUY3Qzk0MjI0Njg2QkJFODI3QzgzM0U0QzEy
-MTc0N0FGNzlDNjlBMjdBMERDRDk4MkYKOTFBRjBCQUY5RUYzRjk5MjFCNzk1QkY0MkI4MTdE
-OTNERDREODE2REM2OThEMDYzQUZCMzA2Q0MyMDAwQjM3QUU5MzEwNUFCMkU2REFFCjMyRjlE
-RjQ0QzA5RTc0NjZBNjJCMkFENDhCMjE2Mzc0NjEwOTk0Q0IxMjA3MjREMDAwMEFCNTRGNjgz
-N0RDNjRFRDRGNkNFODY4NEIxNAoxNkQ3RURCOUQ5QTM5OUQzOTI3NEZFRTZGRDQxRDhFNDEy
-QjE1OEEyNkMzMDRGQkQ3Q0UwQzRGOTZEMDFGNUFCOEEyMEIxRkM0RjAwQTkKRDMzQUFEMkM2
-NTZCMzEwNTMxOThFQjQ3MDQ0NjBENDc2RkYyRjUwNTMyMTIxMjkwM0ZEMjFFMjA1OUM0NzA2
-NDMxNTJCOTlCMkU5MDNBCjQ5MUU4RTM5NEJCQ0IyQzA0MTFENkQ4NjIxMEQ1QzNBNDNCRkMy
-RTAxRUFGREVBNzEyRjZDQ0NBQTkwQURDMkEzNThBQzYyNzE4RDQ4MgpGQzMxOTE0RTAxNTc3
-MzMyODNCQ0QyOURGNkQyQUZGMDk0QzI0OTZCQUI2QUE3MjI2NTIxNUE0QkUzNDM2M0VCODc5
-ODg5RTc3MjdBQUQKMDU0RjkwMTcyQzFENjg1OEM4QTMzOERGNkMxRUZDRDY0RENBOEFDRjQ2
-MDM4RjQ4MzkyRTc1REQwQkZCQ0ZERThFRTA3OTFDQTJDMEEyCjhBRkQxNkFFNTYzODJBQ0NB
-RkVFMkJERkU5N0RDRjM4NTMyQzE5QkM1RTM2RjlFNUQ4MjgwNkQyNjE3MTI2N0JFQ0M5RkVB
-RkYzMDAwQQowMDU2ODY2MzNGRTI1OTY3QkVEMDA5Njg0M0M0NjRCQ0EwMzMxNEYxQzU5NzFG
-REVDOEUyNEI4MEQwRkQ5N0I3RTU3NjNCNDI3RUJEMjYKRkQ4QkQwODZBMkM0NUZFREYyMzIx
-OENDRDM4MUJGMzY0RUZDQUFCRTA0REE2Njg3MjQxODA1RTM3QUU4NjY3ODZERjk4QzYyNzQ1
-RkNFCjlFMEQ2MzMyRjJCQjkwQzBCMkVGRjE0RDA4RThFRUE2QkNERjY1MEQ4OTk2RjQ4MzU1
-RDI2Q0ZCQjg1OUNEQjQxODk3M0E2NUFFMkMzQQo3Njc3NThBQjI4OEEwMzg4MDdGNEY2NDY5
-QTgyM0E5RUFENzQ2NTYwMTMwQTJBNTMwOEFEMEMzNjc1Q0E4NjQyQjJCOUZGQ0E4MzgyQzYK
-RTYxRDc5NTlEOUJCMzY5QUZGQUQxQzY5QkUzMUUwMEYwQjIzRkI4REY0MDdDNUVDNjhGM0JG
-Mjk4QTM1MzUxODQ0RUI5NjUzQzgzQTAxCkVEQkVFNzVGNzkyQzUwMkRGNTMyNTcxMjFEQzhB
-OEYyNjcwQUYxRkM3NDcyMjlCNTNCNzEwMEQwMkU3MzgyMUUxNzZDRjVCNzUxOEQ1MwpCNDIw
-QjFCREE4QjcwQ0VBRTgwMUQ3NDVDNjYyMzFFNjI3OTcwODRDQjMyMEREQjAyMUJENTgzMEJB
-MUQzRjQ5RTAzODY0RTZBNkNEMzUKMzQ1MTFGQkZBRThBNEVDNEUzRUM4MTcyMjhDNDBGN0Y4
-N0Y1MjQ3OTBDNEEzQzRDOTBDMDEwQ0Q5NjUwMTYzNDUwMThDMjdBMTMyNUFGCkU3RjhGNEEw
-RjAzNDI2MzJEMUM1RjlFNjcyOENGOTMwRjc4OUEwRjNDNzQwRkJFODgwMTVFMDUyMTY4QTBE
-NzIyQjE2MjFFRDcxMEJBNgo2ODQyQkU2OTFFOTFGMzNFRkIwNzA4RTNFQTE4OERCNDJFOEY0
-QTU0Rjc3RDYxNzI1NzMxRkEyRTJENjFGMjQ1NzQ1QUMxREJFMjMxQjgKNDYwQzMzMjNDRUM2
-MEJEMUNFOTJDRTdEMUEyNjQwRDE1OTREMjQ2ODNENUUxMzkxNjRBMjY1Njg1NDRGRDg5RjE0
-NEY1NzkwNURCOUI3CkVGODFBMzZCRDkxOTk5Q0NBRTIxOTJGQzg3Qzg4RjMzQjAxQzYwOUE5
-ODFENjc1QTNBRThCMTNERDA1RTI2MjI4MDg4MjZFQ0UwNUVFRgozQTM2RTI1RDkwRUEzNzIz
-QkYzNEJDNkQ4NkNFOTVFREJDNEREM0QwODg4NjlCREIxMDVBNTMzNEI1MTA4RkFERjFGMzM2
-NjA1QTczNEYKMTcwNDRBNUVBQkY0NjhGNDI1OEY5RTlBM0U2OTU1MUVDRjBBNEU4MTI0RURC
-MTc4QjgwMEQyNzA4Qjk1QzI4ODJBNzU3NTY4Q0NDQzczCkM0MDY3MUJBMUI3NzM3RjU1REU2
-QURBQ0I4NEU4Nzg4OTczODYwM0E2RDhCQTBEQjFENEM1QjM3MzBDMTY5REEzNTAxN0Q0Nzc3
-NThFOAo5QTMzRkNGMDA5QkU1M0Y5NTlDM0YyMjk3Mzg4N0U5MjA0MjdBOTY4NzMwREI4NTc2
-QTA3QzgwMTk2OUY4OUM5MzMzOEE2MDVCOEE5NjEKNTRDNjIwMzZFRjkwOEM4MUU2NURCRTQ0
-MTAzMTk5NENBQ0IwNDM3NTVFNzZBMkU1NUJCQUY2NjI4QjFBRUJGRUM4MUVCNzI3NjYyRTFE
-CkM5REZENDE0OTIxN0RGRTYzMjYwNkFERDkyRDJDQTRFMTQ0NDNEQzAxQ0ZFN0VDMTY2QTRB
-MkJERTNBMDZCQ0RGMTY1MDBFMTJDREQyRgo2OTgyRjE5RTk5NTFBRDgxMzAyRDJEMEEyMEYw
-NzBFNzVDMEEzRURFRjQwQUVCMTI2REFGOTgyNTBGNkYzRTM4RjRCQzFCNjI2RTk5REMKNjQ3
-NjQ0QUU2RTRFQUI0OERBMDQ2QzgyNkFDN0ZFQ0U0NjZDNjNGNzVCODcyRUU3MUY0RjNBMjEy
-MkEzODNCRUZFNzEwMzEwN0E2MTY5Cjc2QzRGQUVDQjE5RUJCODUwODQ0RkJFQkJDMTYxNTA2
-NzE1QzM1N0IzNUI4M0RFRTE4NTJCNzI2OEM2NUY4N0Y0QzJGOTZDM0ZFQ0UzNwo4OEE5MDJG
-NDY1NzFGMDk5NEE2NTg2RTdFNTgyQUFDRDExRUY1RUFBNjkwOTdDQUUyNEM2MTBCRUIzMDMz
-ODdDQkJBMURFMEQwNzVGRjkKMEJENEJFN0UwN0M3OTVBMjQ4RkUzMjFCNDY4RTAyQjg0NTcz
-RDc0ODZENTlDQ0RGODMyNUY5NDAzM0VDNjMzRDJCRjI4NjdBNDJDMEQxCkUwQjA3NDVFRjhE
-OTA0OUQxOEIyQUIzMTcyMDkzNzkzRjRDQkI5REE4ODhBRDQzRkMyMkM5MzNGRjVDNERFRTNE
-ODkwQUUyMUIyODBFRgoyRENCREFBMDNBRTRFQUI1MkY4MUExNDQxMkYyNkQyRDNGMEQ0OUM4
-MzM1RDhFQzRDQUE2QjM1OTYyMzhBMjhCRDYyMjYxMDk0RTc4REUKQkIwRUQ1MUNFQkRFMjU4
-NzhFMUFGNzA1QzYxRDM3QTcxRkY2MEFBNDdGQTM5REI2RERCNUVCRUIyODE1ODRBNUU2N0I5
-NzE1MDI3MTZFCjY2OEZDRDJBNzU4OURBMDc5MTdBMDQ4Rjc5NkJEMUM4NTEyODk0RjlEQUJD
-RjcxMkM4Q0ZCRDlCNUM3NzYwQzZDQkIzQkM2MDMxRjI4OAoyMzVCRDc5MTQ3NTkwN0U1QkND
-NkIxRjMwMDA2OUVCQ0RBQjFDM0RDNTJFNDlENUM4RDk1OTk0Rjg4MEM1NDE1MTI0QkZERDY3
-M0M0OTIKQ0I2RTc3QzhDNDRFRkEwNEY3QzVGRDM1N0NEQUQyM0NBMzY0MkFCNDM1OUE1MkRG
-RDIzNDEwNzJFMzY4Q0M3NjEyNUMwQkQ3NjA3QjExCkE3NjA3RDM1RjFBOTdGMEIzMEJCNTZE
-NEZCREZDOUZGNEJCNERDRjdENjcwRTdGNTYxNUFFRDZDRTBCRkY3OEUzMTgwNzY3QzQ4QUJC
-NgoxOEY4NUNGMTMyOEFEQTIxRTkzN0ZERjBGNEJFREY5Njg4ODcwNzc1QUQ1NUEwQjE5QjIw
-OTQ4QkJCQTFCNzVDMURERUYwQzIyOTNCNEQKQUUxRjU0RjRBOTlEOThGOUI0MEM5MTU5OTBB
-NkEwOEQ1NDY0QUZBMkYzM0IxODZEQkQzODJEMDFGOEI3RjQzNDE5MTQzMTFDQkUyNTA3CkRB
-M0Q0MEEzMzM4OTBFMDgyMzZEQkI0MDYwQ0VCRUJFRTQyN0E0REI4MTY5RTc0OENDRTc5MTdD
-NDYzMkZCODU0MzRDMkFCNzlERUEzNgo1Mzk0RUE0NjE3MjBBRkUyNkI1MTM2N0JGQkJCMzEw
-QTNDQkRGMDUwOUVDNzVDOTdENkVDMTU0ODlGM0UyQUQ1NEQ1RTc2RkZBRDY4MDkKQzg5OTI5
-NzVEOUM2OTRFRUYxN0VDNTJFNzhFRkMzNjY5QjU3MEQ2OUFDQ0U2MUU1QTdENkU3M0ZCMzc4
-MjNENjRDRDlBMTZCREI0ODVCCjk2NDJBQ0YzMkJFQzNGRkM1OTNFMDNDM0NCNzE4NjdBMENC
-NTdERDEzQTkzRENCMDkzMjc2RTg1RDE1M0NEODM5MjBENTYwREE1MEMyMQo0NDNDNzJCNTIx
-REE1NDZGMTI4NTdCQ0ZENUQzNzJFNzFFMEFGMUM5OEVGNDgyRjA0RkUyQTFCNTc3NTA1QzYw
-MkYwNDEzQTcxQjA3MEYKMTMxRTlERUY4Nzg2OUZDMjE5REU1OUExQ0MxOUFFMzhFRkVGREUy
-QjY5RjUyNzA4QjYwRTQ4RUY2ODZFQjM2MkM2OTBERTVDMDMxRDYyCkU5QURBNzQ2OTI5NzUz
-MUJEMDFGNkUzOURDNzhCN0M2ODMwQUFEMDQyNzdBQTk4RUJBMUQ4MkZDMEMwMEY1QTZBMUUx
-MDhDRDY4MzVGNQo1MzM0NkU5MjFENzI4RjFCNEVDMEI5OTMwMjU1QTY4RjNFOTAzMUYzNjBD
-Q0JERjAxQzk2ODFENjAyQTVCOUYwQkUwNTUyNjlENDE5QUQKNzNGRkY1MDREQkQ0OTUzQ0Ez
-MEQ0Q0M1QjRDNTdFNzkyMUQ2RTY0OEU1NzQ0OUUxODlDRjc4MjBCQUQ0Mjc0NTU1Q0E0NUM2
-NkVGMERDCjM0REU1MkQzODM2ODEyMjY0OTg2QjQ1NEM5NjEyQUU4RjRCMUE5M0M4NkI1RTRC
-N0RFMzA0QUZCRjA4MEJDQUVGMUM2MkZFMzVCQjNCRAozMzU5MTBGRkQ0OTY3NjBDRkZEMDAy
-QTIwNjM3QzQ1NjkwNDY2RURFODVBNEYyODk2NUNBQzVDNjZGMzIzRDM5NjBERTgzODlGMUE3
-NTgKMDI3QkQwQzMxODhGMjQ5RkQ2MTU0NUMxRUI5RDc4QTBFQkQ4MUU1RjVDMkM4NDQ1RUU4
-MkMwQ0I5NjlENzg4RjFGQTI2N0IxODk5M0ZECkFDRTk5QjIxQTIxNEM2OTY3MEM3N0Q5MjA2
-MTcwNzQwNTlEOTI4MTlENzlGQjRCQjQ0OTdGNEUyQkUxRDgyNDNBRTBERkREQTA2MDNFRgpF
-NTFEMUYzRDQ3MTM1RDM1NEQ5RDdGNzU2Q0FDNzJFMzVCRDRFOERFQ0IxQUJENTNDRTJBQkE1
-REMxNTI2QTEwREE2OURBMkZCRTkzMjgKQTMzNDM4MUUwQ0I5MjkyNjY3NjU4OThGRDM4Qjc0
-MDM5NzY2OTg1Qzg4QzJCQjlDNDQ4Qjc2NzI2NDM1M0EwQkM2M0IwRkQxNjQ1RDcxCjAyNkRG
-MkMwODQ0OUE5RjMyRjI1QzRGNDMyMTE5QkQ5QTcwMTRBRTNCNDNERUJGNjIxQzlDQjkyMzQ2
-QUNFRUI1QzJCNTk5RDU1MzcwOAoyRTA1NEMzQTU2ODBBMDgxOTFEN0I4Nzk5MUMyQURCMTky
-QkQxMTU0NUJBOUY1MDk2Q0FGMkREN0I3RUIyOTBFNzBBQjRGREQzOTg5QTYKQjdDQzEyM0RE
-QUUzMjhFOTIyMTAwRUQ4QzdGRjk1ODY3RTlBMTY4RjFDOTc1MjU1N0FBMDIzQzgxNTRFOUJB
-OTcwRkEwMjE5QTk4ODlBCjVDQThEMDAxQUVDQUJDNENBODQwMzIyQkU5RUM5RjYwNzJFNkU3
-MzYzQzI1ODc4OUQzMDk2ODc1REQyMzZDQzAyQjA3OEIyMjQ4NDc2NwpEN0EwQ0U4NzM5NDUz
-NkE3OTZBNjQ5ODcwOEMyODdEQTk2OTFCMTQ3MkQ0NTk3REJENDlGNDIwNEEwNTE5MTI2NUY4
-MzZFQUFDNEU1RTEKQjFENzY4N0JFQzYzMEMzQ0E3NDRBMDQ0OTkzQzAzRDRCOTM1RTFDQzcz
-MEZDRUE2OEEyQzBGNUNDRjUyRkMxQTI3NEFBNjdCM0I2MTc3CkY0Qjg3RENFRDQ4NTZFMTRG
-RjAwRkJCRThEQjRFMDI3NzUxQjM2NzcyMkVEMEIzOUNDODgyMTYxNzdGMkNBOTU1OTU4Q0NF
-MEE5RkU4NQo3MUNGOEExRUJGNjREMkJCM0YxNzdGM0YwRUJBNTgxQUY5RUQ3NDZFMTZDQTlD
-Q0MyQjVFRUNFRDdBMEEyMjU0RTc2NkIzNkFCODRBMjUKNDk4NzcyN0YxMzBBQTM5MUI1Q0My
-RkJCOTg1NEFFNjY4NzZGRjA5QTM4N0Y5OEVFRjM5RDNEREE5NENBMkRGMTQ5RUJGQjU5RUE0
-RDRDCkNCQTVCNUY0NjRDNEMwOTRDRjdEMUY4OTcwRjhGNUJGMjdFNEM3RUM5OUQ1QzhEQjFD
-QTU1RERDNkRDNUM3REQ3MkI2MkE3RTVDN0IxNwpENTM3OUE2Q0QyQjZGNjY2RkY2Q0RBOUJG
-NjkwQTg4MzlFMjM0RURGNkU4MUJGMzk2OUYwREFFM0NENjlENDhBNkY1QjBFNTc2NjBCQTQK
-QjU3NDA2Q0U0NkUzQzM2QzBEMzQ4RUI0NEMxMTE2ODc4NDQ5RjkxODJGMjNCQ0I3RjMzRjk0
-NEQzM0QxNUJFODNFRjM5ODlGQjk5MDlDCjNENURGMzQ0MkQ3Q0I3RkY1OTJDRTlBRkNGQkY4
-QjFDRTYzQjAyMzA5MjEyOTY5RTM5QjlDMUE5MzM2MjhGQjM4QUI3NTY1QzMzNjJGRgo4MDNB
-MTU5QzgyQjBGQjZEOUM4RjFFN0JDRTBEQkE4QzQzQzhBMjY5REUyRTY4NEM5RTIwRkM0ODE4
-QkVDN0YzMDdCNkQzNDY2MUQ0QUEKRkY4QTM0QUIzMUEyQjNBMzQ5RDcwNkEzNDgzMUJDNjFB
-REI0MTRDN0I3NUI3OEQwOEE2Qzc0ODcxNUI3QjJGQzg0RDk0QjczRUFBMkQ5CkYxREM5N0U3
-OEEzQTREMzM3NTgyMUZDQkY4MEUxRDMyOTI4OUNENjk4REVGRTAyMURDMkM2MjBEMTU1OEYw
-RDI0NDRBQUE5QTE4NDE5QgpDRjJBRDA3NTI5RDMwN0NGQjExQUNEMDhFRERGOTM3MURDRjU0
-MEIyQjlBQjVEMDA1MDY4RTUwRUJCNkY5QTBGQkU5OERGNkFERTNENEQKRjJGMDczM0M4QjA5
-NDIwMkFFNzQ5OTUzNDk1RkVCM0U5RTlBNjQ1NjQ3Q0I2NzU1QjU5RTczNDlBMUUzMzhDNEZB
-OEU0QkZFQUY5NTFGCjQwN0VCOUY5Q0YxNjk4QzFCMjUzRDQ3MUZFNTUzRDhEQTBDMjE4MjlF
-QzEwQ0JGQTdFNDQxMURFQzcxNjc1MzFCMDA2QkYxREMxMUU1Qwo4QkI5Njc5M0I2OUJCNzgw
-ODFENjc3REIwOEMzRkE3MEQwNTAyMTlERTExNkMwNUIzRkZEODg4NTM0OTZENzNDQTA5NEUz
-RjM3M0MzOUQKRjhEOEYxNkJCRjlGODU4Q0U0MTZEMTc3OTdFRTdGRkVFQkIwNDI4QjE1RUFE
-RjdDMkRDMERDQjY1MzJDRUJEQTFDMDcxNjk4MjAxNzBFCjEzQzVGQzkwREU5MUM5RDk1RENC
-MjM4MzEzNzBBNUI0Qjc5OEYwQjc0OEMzQjgwNjQ1RUM0Mjc5NjVENkEyNEZFNzEyRjE5OTQw
-NTgxMgpFRkVFQjhEREJBMkFBOTFBQjg3RUFEMzQ5Qzg3MjQ4MTIyQjUxMEEwREYyN0VFNDY0
-MDg0MTZEOENFREI3RTY5RUUyMTM4REQ5NUU1MjYKMzdENDQzNzVBQkYzQjlDMjY2RURERDgx
-QzU2MjUwMUFGRjBENDI0MTMwNEEwNEU3MTM0NkVEMTc4Mjg5RTFGMUNFNjE3NzJFMUM3RUMw
-CjAxRTk0NTY0Q0Q1QzlGM0VENjQwRDhEQUY2QzEwODJDRDg4NDQ2NTNGNzhGODAwMEFCQkM0
-RjM0ODI4MDg1MjkxODkzRDY5MDQwMzU3Mwo4ODhFRjgzNDdGNjcyM0E1RjVCN0I0OUFGNzRC
-OTNGNzMxQzgzQkU2QUFCODMyM0QyMjY1OTMyRUQwMDA0NkI1QTgyNUUxNzI5RkJCQjEKQkEx
-OEQ0ODQxM0E5RUNEQTQwMEU3NTcyMkUwMUM3NEQ2QkU1REYyNkIxN0RERjEwQzM3MDA4M0Ey
-MEVGMkQxMDgwQkE5RjJDMkU3MURDCjlDNzhEMDIwMkI5RDgyRURDQzdCQTNBODk0MEFCQkE1
-MUJFMTA1RkQ4NTE2RDhDMDkyRUI0QkM5Mjk3NzY4MzUxRkEwQkIxMzcyMjUxNgoxMTBCMkM3
-MkZCNzMxNjQxQjNCMTUzNDdDRDY4Qzg5NERDRjIyODFEN0EwMjhCRURCNkQzMDAxRDFENjJB
-MDBBMjYwOTg5NTExQzhGQTgKMEMzRjE1NEIxMkI2M0JBN0I2MzlFNkExMTE1MDREMEIwODY1
-QjA4RjBEOTk3MzUwMEMzNjY0QjM3NDkxNjc2MEY4NTg4QzFEQTlBNkFGCjc0RTk4MjcxOTRB
-ODkzRDBFNDE5MTY0NTIxQUM3MkIyRUY2MjZFNTQ0QzM0NjFGOUEyOTc5MUJBNjk4MTQ5NDRE
-REY3MDMyRDJEMUJEMApEMTczRDE4RDNFMDZCQTA4QzIwOUIyMEM3MUJBNzc2QjdGNDQyNDAx
-ODc5OTZCM0Y0QzQyQTc5N0NGNTBGMTUxMjA0N0E2MzU5QkU0OTkKRjY1RTYzOUQ1OTg3N0U3
-MjYzQkIwQ0UyNUIwMDVFN0EzODcxNzM0ODNDQUFGRkZBMERBNTNEREI4NkNBMTJERENBRjhF
-NDE1RkZENTlECjFFMDA4NTVGODM3Q0MxMDg3RjE4NDcxRjIxNDZFMEUwQ0MxOTAxRjlEMUI5
-NjhDMTNCQTIyMDlERTQ1RkE3RkE0ODYzQjE1OUVGQUMyOQo5ODJENjREQzYwRjI0OERCMTZG
-QTlGMDhGOTk1OUU2RkIwMTU0M0E3NzY3OUFGQjcwNUI3RTAzOTk1RDMwOUI5MDFCQkY5ODYw
-Rjk2QUQKNzcxNUU3RTNGMEI2NjM5NUM5NTNERDIxMzgwRDhDQjFCMTc5MUYzNTNEMDZDQzA0
-NUM0NTdBRDJGRUU1OTNDMzJENzdERkU2M0ZFOUU1CjlGMjU1NTY4OTI3MTRGMkM1RTMxOUM3
-RkMxMDUxQUYyRTY5QTBBNTU3RjI2QzQ2QTlGOUI0RjE3NkM1Q0MxQjEwQUE0RjAwQ0RDRjc1
-QgozNTQxMTU0ODE4MzYwRjYwNjM0OTFCRTEwMzExQkFFQ0MxRTI3QzM4RjczNDlCNTBFQ0Q3
-MkI4MUY1QkRCQkU3QzJGMjk5NEJDRjg0M0EKQjA2RkYzRkM3RDM3RDZBNUU4M0ZCMkI0MkY4
-ODRFM0JCMTREN0NFMUIxODExNDJENTU4NzYyREQ3Q0E1MTFBNzlERjk0QUNFMDgwRDkxCkEw
-MDE1MzZCRTA4NDhDQkI5QjU0RkQyOUIxQUQyOUFCNUM3Q0FFNTI1N0FEOEQ1NDYyREEyQTlE
-MjE4NzI2N0NEQzVENzFBRTQ4OTlFQwpGQ0JENDA4MTc3Mzk2RkM1NTM4ODRENTBFQkI4MkU1
-RTQ5MEE2NDZDRTEzM0YwNkZDQTI2NzMzQTVCOEFGQzEzREU1RjNBQ0JGQ0QyNjcKQUJFNjQ5
-MDc5MEJGOTkwRkEyNThEN0IxRjVFNTEzQTkyRjU0MzhDOTlEODE1ODUxMjAwMTUzOEMwODUy
-NTlDRTg1NTJBNjE3ODU1QUZGCjdFQkQ3MURERTNDMEMwNEIxNUFGOThGNzc2RTAwMTIwMERC
-N0U5NEQ1MEU3ODEyQTVEMzIzMTVBQUZFQzQzMEVDMTE2Q0E0MTQ4OUM4Nwo4RTE5REU3NjhB
-MkVFMzkwRTYxMEY5MkVDRUZFRkI1RDYzMTEzMDc4NDIwRUU4MDcxOTRBMjE4REE1NEQxODZD
-NDEyQzk5MDZCQjcyNUMKRDQzODBGQkQ3MzIzNkE3Mjc4OTVDMEJFNjcyRDVFRjQ5RTVDMjcx
-NDQ1NDUwNEU4N0E4RDFCMkFDODA4QUQwOUJCNDdBODE2NTEwNUNBCjI3ODEzRUM2NTExODVG
-NjNDNUE5RUZDQzlBNzUxNkRGNDEyNUU0Mzg5MzYyMkJEQkJDODk3M0M4QzMyMTgyNEFCMUVB
-NTMwOTBEQTdGMQpCM0VGOUFDNEJENUY0RjdENjUzMzlEMEIzMjg4NENDMTQ4MjZFRjQ4NjBC
-MjhFMEIxQ0MxMTlCQUZEMEVGMEJCODkwQTAyMDcyOEREMUUKRUYzRDg5OEUyNTYxMEFBQjVG
-Q0M4M0M5RkQ2NzczODczMDVENEJBRjY1QTdDQzlDQ0ZEQTE3QTQyRTI0QkE2MjU1ODBGMDcw
-OEZGOUI5CjlBODdDREY4NzQ1MkU4NzY0NENEOUY1OUFGMTZBOEU2MkE5Qjc2QkMzMzg1Njky
-RDREM0MwMjk0RUM3MUUzQjY2MkQ1M0JDQzk1MjkxQwozNTEzQzU1NTk0RkFDOTZBQkNGODZB
-NDIxNjc0QjkyQTg2MTAyNTFEM0Q2RTBCQ0Y2MDczOEZBRkY2NEQyMDI0NTM4RkNDNEZCQzU4
-OEIKODQzNjY1RkM0RkM2NEY2MDkyQzZFRTdCNjgyQTNFNUZBMjcyRTM4QzhGQUExQ0ZFQTU1
-RUYyMzVGNUQ2N0Q0OEE0NkEwMEZGNThFNDdGCkY5NjI2M0Q0RkVGOTJGMzMzQzcxQUEzRDZF
-MEQzRDAzMjVEQUIzM0Y2MDIzNEU5ODBBNUUwQjhEQjc3Rjg1RDYyOEE2OTNDODFBNTMyRQpC
-QTdCOTBDMDcxRjhCN0JCMjYxOTQ3RDQzRDcwRjdCNTRFREJEMUQ2RjMwQjg1MDkwMzVGQ0Yx
-OUYxQUQ4Nzc5QzkwODhFQ0M2RjlEMUQKRUE0ODY5NEVENUY3ODE0REZBRERDNDMwRUIzNjFD
-QjI2QjlBRUI0MzBDMzFCMkQ4RUNCMUQ5OTVEQ0E5MzlFMjYxM0NCNDhDMEJGNDAxCkYyMzY5
-MzI5QzIxNUIzODE0QkQxMzVFNTczNDcxNTI3OTU4QTNERDg5NzE2OTRBMDJCODEyQTMzRjRG
-NTU4OEYwNkNCMEZFOTQ5Q0IzRgo2NDg0NzVBRjhDNzc4RERCRUUwQTdFNTIyRkM5MzA5QTY0
-OTY0ODk4NTZCRTcyQjkxRDY0MDhDQTdGMEYzODg3NjdDOEE2QjA3MTAwNjkKMjMwOTczNTNF
-RjkzNEIwQzZBOTY0NjA1NEIwNkI0RkZCQTYzMjgxMzY3NkNCMjRDRUVDM0UyOEQzRDYzQzhE
-MTNBMDQxREZEQ0UwMTU4CjcyQTRFMkRFMkI0NzM1MzYzQ0UwOUUwNkU0RTdGOEY2QTlFQ0Uw
-NkY4QkY4MjkzN0E4RDg5MzA0M0I3NDM4ODMyRjE3RjlENUU3QjA4Mgo5MkQ2OEQwRTA2MTdC
-MjJFMTI2RTc0MEUxQjY3RjM1OTVDRUFGQkE4REY0NzA1OUVCNkFFMUZCMTVGMkRBNUE4OTgx
-Q0M5Qjg4MDU5MjkKRjE1NjQ1NTVDRDA1NTYxNENEOTRBNURCNTQ4N0IzOTYzNkRBQzRGRkJC
-REQ1OTY2NUFGREJDNTI1M0I0NzUzMTZFRUE2ODg4MzA5RjI3CkFEMTRDMjMxNkY5OTczNzJE
-NTY4OERGRDgwNEY2QjYwMzRCNTc4ODVCNzY3MDVEMkUzNDg0Q0FBNTA3OEZFOTU1OTIxMThD
-NDUzRkE2NQpBOTlCRkYyOTU2NzFDMUU5QkQyRTZBQUJGMUY0OEE3MTUwMzYxM0QzQTk4RkIw
-NDdGQjUyNzhBNDU2QTZGREZFMzI4Q0VENDlBMjEyMUYKMEQxMjg1NzAxRjc0MDBBOTZENkYx
-MUZCOTlDNkE0NTZDRjFENzkyQ0VENzI2NTJDQUNGOTNCNjBCMjczMDA2QzgzREIzNzQxNDQx
-QkI5CjM1QTU0ODFDRUNCMjU0RjQxMDEwM0E2REQwMTg4MjA5N0M4RDE5RUZFNDk5MDk1MUND
-QTg4Mzk0QTBGREVFMUQ3NjNGNjM4MTM5MUM4NQpGNzhCOUEyOTg2QUUzQTQ2MjJFOUZFQjU1
-QjM4RUNGNEYwRTBGODNEQUZGMTg3QTczNEM3NTJGNTc5OTA2NjY4QTc0NUQ0RTdEQUM3QjIK
-Qzc3MzFBNjEyNTJFNTFCOEZEODVFMDc3MTc0QkQ5RTYyM0Y3QUZCNzhEQzEwMkNDNjM2OEU4
-RTExNTQyM0Y0Q0QyQ0M0MjEyRjQxOTlECkM1RDZBRTc1NTE5MUQ2RTZCQzA0MEVGRjlERDM4
-MUMxNUZDNDY1OTk5MkZGODk5MEE0ODQ3QTRBMTFCNTBBMjQxMDMxMTk0MjI5QjU0RgowMEIx
-RERCOUQxQUM1NzU1Mjk2MjlBMTYxQTBGMUM5OEIyNDhDNjA1RUQ2Rjg1QTlFQUQ2RUZCMDk4
-RUVGOTgxMEMzMjBBQUQ1MzA5MDEKNTEyNUUxRDU4ODdDMjVFMjIyNDUwQTBDNjA2MTE2RjFE
-QzJFRDg5RDNGMkQzQTZDNjY2MTcxMzcxRTU5RjFERDFENTg5MURDM0FDMDJFCjU3MkIxMzVC
-QURDQzQ1M0VGMTI2RjE1Qzk4NjQ5OUNGMUYzREM3QjlGN0M5QUE0NzM5OTAyMkNGOURGQTI4
-ODk5QzY3OUY3NkJFMkIwMAoxRkIyODEyMDg3MTlFMjNDNTMwMTk0MTc4NkUxODczQ0Y3Q0I0
-REEwRjVGOTI3NTM2MjRDN0Q4MTU3NjgzRjZFOTU3ODA1RUY1NzA2MTgKNkU5RUIwOTE2MkY5
-QUFBMDRENzkwNzk5MDI5NkY4OTlGMTYyMUE0OTc2NzM0RjlEQ0FFMTFDQ0Q5NjlGOUFEQTY2
-OUQ4NkFDRjFGRDcxCjk4RDIzQTFCRTM5MTVEOEFERTI5RDhDRjY0MEQ1MzQ5RkQzNzk5RUY0
-NUU2QkY4NkZDNjBBMzg0QUM3RDZGNTA4Q0QxN0E0QjI3NEIzNwo0QjM3NjQ1QjI1RTM0MzA0
-QzJEODJCMkEzMTE3MEZCRUIwQTY4OTY2NzkzNjc0QzFCM0E0QjZBMTE3QkIyRjFFOUY3Q0JE
-NTJFNTkwRUQKRDMyQkJFNENDMEY3NUQwODYxRDM3NjUxNzU0RDNCQjFGM0ZBQ0VCQkRBNDIz
-NTVEMzAxNTEwQzlEMUMzNUI4REIxQUNFQjVERjM1RDZGCjc2Q0NGQUM3OUYzQkYwQzVDN0Y3
-OTdDODk0RkVEMzY1MjY3QjBBMzM1MTRCOEY3NjAwNDI0Q0M3RDZFN0ZCQkUwQjBEM0M4QjZD
-QzhFRAozQ0UyQjQ1MjBFMkZCRTM1QTE1NDEwN0U2Qjg0Q0RGNDY4MjhENjcyMEY2MjIzNUFF
-MjQ1N0QwRENEQ0Y5MTAxMEJGMTVEM0NBRjk1QjQKQTIzNjAxOUJFMEFFMUEyRThGNzhGNURF
-QTU2RkJGMTAxNjIzNEY3NTQyM0QzMDdCRTQ5MUQyOUY2QzI3RUZEQzExQkNFMTgwQjIwRjM5
-CkVGMEM0QTlDNzJGOEFDQjYxREI0MjVBNTM3NjMzMERDRkRBQzcwMDkxMEFGM0JENzY3QkM4
-N0M0Qjk2OTFDM0RBRUM4REFDN0MyMjZBQwozNkFGN0U0NDRCRDMwRTExRUFGQkM4QkI3NzE4
-MUVFQTMyNjRGQUI3RjYzMTQyQkVDREYzN0I4QTVGNjM4MDcyNDlFNjE4NDU4RDI5QUQKMEUx
-RkVFRTU2N0VBRTFCNEI1MTNBNDQ3RTgyMkE2ODhDNUQ4N0Q2NEM4QUNEODA0QUQxQzgxODE1
-RTI4N0Y1MEJGNTYzMENDNjMxQTkzCkY5NUM1OUNCQTU5NkRCQUUxRUU4NTAyRTMwNzNENzY1
-MjVGQjJENEY5NEM1MjAzNTY5QjAyRjk0NTkzNzc4RTg3NzVBODdDQkFEMDhDOAoyNTZDNTFB
-MTlDRjM4MUMyNDE4MEQ0OTgwRUUxN0U5NEIwMUFDNzYxRjkxMEQ2QUFGMDlDNTAyN0I3OTI5
-M0ZDODdBMURDM0NCNzA4MEYKNkVDMEFCNzYzQ0RGMTRGNkQ3QjE4OTlENTI5QzQyQTI2MkI1
-NzlBM0JCOTZCNjkzQkQ3OTNGMEJGN0FGQzhEMUI2MDI4OUJGMjM5MjI0CjM1Q0MzREU3OEVB
-QjQ0NTQyRURFQTBGMjQ4Mjg5MjJBNzAyRTdBMTFGQ0Y1Mjk5MjVGRUFGRjUzNzUxNTAyRjk0
-MzRCNzI5NzhBQjdBMQoyQjY0RTdCRDZEQTk5MTdDOTE5NkVBQUNCMzk5OTIyNTUwMTQxMEM4
-MTg0NzJCMDk3QzcwODUyM0MzMTBBM0ZBQzc1MjFCRjZBQjZBNEUKOUUxREIzOERGNEQ5M0Y5
-QzEyQkFGNjdCQzhCNzBBRkQ4RDA4RkQ2Rjg5OEI5NjYyOUE5MTNEQTBERTY2OTY3OEZBMUVF
-NzA4NkExQzNDCjBENDVBRDVDNjM0MzNDNTc0QkREOEJBNjI1ODk3MjYyQTA2RjVBQTQ3RkRB
-NzE4MDU4NjhCOUJCRDc5MTREN0JFNjk3QkM5MEM3NDc4NQozMERCRTVGNTU3NjA1ODc2N0I1
-QzMwMkNDRjdEQzY0NjBENDRGQjYzNUI1QUI1OTVGMjE2QzEzRTdBNEQ1NDAyOUMxRTkyODE0
-NDRCNUUKM0IxRkIzRDhDN0Q3MkJBMDIwMUM1MUY0QUJFQjlDQTI2M0Q0QUVEODZCNUIwQ0VG
-RDBFQjE0MkZBREVFNDBBOTUwQ0Y0NDFGNTQ3QjdDCjcxNDI3QzMwQ0EyMkMxNjFERTEzMEFG
-NTIxMEU1QkQwRDU4QUZENzQ4RDU3NEI0NkEyQjRFQjRENkNDRDMxRjREQUYwQ0NGOTRDN0RD
-RAo4MEIwMjY4RENFNEU2OUQ5N0U2RjNDQ0I3MzE1MzY1MjhCNUNGRTlBQzAxMzM4NzFDRUFC
-N0ZENkIxRURBNEZDMTlGOEIzRTdEOUE5MkUKOURCNTBGMTk4Qjc5MkExMzk4NkEyMzY4REUz
-M0NDRTcxN0FERTVCMEZDNkY3NkJFOEI0RURFNkFCMTU3RTAxNEM2QzQ4Q0ZBQzVENTA3CjUz
-MDY3RTkzMzBBMkZFNzczN0EwQThGMjU5RTVGRkE3QTAzMEQ4NUZFQjg1N0Q3ODU4NjZDQThD
-NkE1MDQzRUNFNEMxQ0YzMEU3NkMwQQowNzFGRUY4RkIzMENDOUJGMjZDRjVERDhBREI4N0Ew
-QzAzNDk0ODc2QUExQTJFOUFFRkFBNDVBOThDRDcxRTc4NjA4Rjc1MjNCNkQ2ODYKRUJEODA0
-OEJDOTZGOTEzOTdBNENBQjFENUE0OTZCNDMwNDJDNURFNkMxQzQzOUI4RDA5RjYzODFFODhG
-ODI1QTA4RTgxODI5N0FBMjdDCjFEMzdGRkQ1NDFGNkE5RTVENEI3RThERDhEMTNGODI2OEM4
-MzEzNUM5NjMxQTYwM0M2OUREMjJFNkQzQjc2MDYzRTVCMEJGNzE1OEM5QQpCQzlGQ0NCOTQ2
-QUMyNDk5NTIyOEM0OEJEMDMxRDBBOTU5OTQ0MTgxNDgyNzM5RUZGNkNGMjMzMEE2QTZDNkZC
-OTA2RUIxMjNFNDQ0ODgKRjQyQUMyQkUyMzdDQjMwQzQ0MUI1MDUxQzAyOEI5NEQ5RTZCN0U1
-N0Y1QTNGRjU1MDQ3NTZEN0VDNDExQ0Y2MTA3Mzc2M0E1RTcyRkM5CkREQTZFMzM0NUY1ODY0
-NkI2OUVBMTQwRTFDNzExRDc5NEUwODM2MjNCODRBNEZFMTEwMjU2RkI4NTQzRDMyQTJENTUz
-NUI3REEwQTczQgpEMTcxMDQ5NDEyRkVENzlCODRCRUI1Njk2MkUxRkZFMUExMkY5QkU0RkJD
-NzJDRkRCOUVGOTJCRDYwQjIwMEFFOEQ2NkFFQTMwQjE1OEYKRTlGRTI3OEQ4ODMzMTExQUM4
-MDVFQ0M5MEQ2NTkwOTc4NzczN0UxRTFGRkM4OERFMDdCOEQ3OTk5NkM5RjU2ODVGNTcxMDJD
-NjVEQTYxCjk3NTEzRjg1QjE3MzIwMEUzMjIyODc2QUFCODM5NDFDQjA2NkUzQzY0MkFEMjM5
-NThCMDBCMTc1MTZBMkNDOEQ4QkNCMEM4MDJDRjM0RgpBOTc4NTFDMDM3RTY1NkMzMEM0NDZD
-NzQwNDIyOTkxODMyMTI5ODg5RUFCQjM1RjU2NjFBNDMwRTVBNTAzRjk5RjUzODFDNUYyNjY5
-MkIKRDhEQjdFOUY2RDMxMkEyOTdCNjk3RTkzODMxQTA2RjM4NkFFMkJGQTJCRkQ5MzYxRjJF
-MzY2RTE4RUJDRUU1NkI4MkMxNkIyREEwMDE3Cjk1Q0NEOTdENjdBQ0NBQkQyMkRERjAwODk4
-QjNDMzlDNzQ0MkYxNDg4NTUyQkE0NkQ0NjM0Q0IzMzBENDI4QTE5MzUxRTQwMUY5MTgxOQo3
-MDhBODJEODU2REUzQzI5MTgwRkRDNTZDNkNDNzAzODMwMkU1NUZBQTVCNzc3RThDQzZDRjRC
-RTJBREJFNTlCRDI3MDY1OEYxNjhDMTEKMDk2MTc4QUMwN0I3QjgzMEMwRTc4MkQ0MUY5N0VG
-MjIxQjdCOTFCQkNCRDFFRkUzQTdBQzNCREMwQ0Q2MUM3NDYzOERGNDEwQUE1M0VCCkFDMzVB
-MDc5RDZEMzkxNEYzODBGNEEzNzZCNTA4OTJBRjIwQ0YyOEY0RkEzNTVDNjM2NEM2MTRBOURC
-MDkyREIzOEQ3NjgyMTFGQTE2QwpBOTkxNjg0REZDOEYyNTdBQjBBQjNGMThGM0Q3Qzg5OTM0
-RkNDRUMwODlFNjcwOUJBRDM3QjkzNUU4NzVFMzRBRTVBRjQ1NjExMzhENTQKOUE3MjVGNEFB
-OTJBNjYzNjREQUQ1MEQwMEIxRTI1MUZERUVBOEMxNDVERjFFQ0Y3NEQ1OTk4MTk0OEM2QTM5
-M0Q3REUzRURENzMxRDJGCkVGREUyOUQ4OUU5QTREOTRDNjk4MzUwNTBGQzNEODUxM0VEMkMz
-OUU5RkJGRkJCNzQxNDM3REZCNzMyNzdFMjI3NTIzQTQ1RTYzNjJEOQoxREQ1NzM5RDgyODIx
-Q0UwREQzOTYzRDBBNEYwMTU2M0E4MkE5NEJDQTQyODI1NjNGMTM3MTMyMjk0M0EyODZGQjY3
-NzQyOTUzQjkxNTIKN0IzNzdGNDkzMzQxNDFERTI2QUQ1RDE3MENBRTM2NzY3QTM4MEE3OTRD
-NzU1QTcwOEUzMzk2MzVEREQyRjZFN0ZFQjREQzg1MTUwMkU2CkY0NTAwQ0M4M0RFMkYyMTYz
-MDREMDA5NTE5MEUzRDQwNTY0M0Q2MDk5MjFBNkE4OTVERTZGMkVERDAwM0NDNEQzMEE1RjEz
-MTgwMzgyMgo1RUU2RTA3MjM3NEJGNzU1RDVDMEQzQjU5ODg4RjVCMDZEMDE2N0JCRTBBNkM1
-RDhFNTUwNDAwMEU0Q0I3MUMwRjE4RTAxQ0Q1RUU3NkYKMTAyREM3NzA4NEQyRUZDRThEODVB
-OEMyQzM4ODY3RjEwQzk0NUM4RjEzQjEyRjE0NzBCMDI2MDYxMkM2OUQ0OTRBQzA2RDkyREQz
-RUVFCkEwQ0ZFMjVDRkRGMDlBRThDOTZFRDMyODM2RTI4RTU1ODNENjBBODQ2OUFDMjIwQTRF
-RjYzMTIzRDQ5MDU4OTBFRTQ4QjYxN0M2RjE2QQo3OTc2QkM4NTVBRTBCQTEwRTM3MjYxQUI0
-NzUyQzZDOUJDNDNGREMyMEYyMzU1RTA3QkRGQ0E3MEY3RjE1NzQ0QTk3MzQyNUE0QjdERDIK
-MjZBMTFGQzlENDBGQzM0QTM4RUYzQTA1RkVDRUNCMjlEMUFCNEJFNzNDQjE0Q0IzRjZENDM1
-NDJEM0E0ODIxRDYyNkEzRDVFQTE2OTFECkMzOUY0RTA2NkMxQjZDMzMyRTc2MTFGMTNFMjdC
-QkI2RDcxNDdBQ0RCNTczRTlCQ0VCQ0Y3RTM1RkQzMTQ5QkIwMzYyRTcwMUZBQzI4RAo3RjRE
-MTE0QTM1OEQyODZFNzUwRjM2NENDMkZDRTM2RDNFNkU5RERGNjczOUZBMUQxNzEwNDM5QjI4
-RjE1OUFENkM1M0FGNjNDRjFEOUIKNDNEMjNDRjZCOEJBMkE2RjBFQkNFNTBDNUI3MzBDQzU1
-MEVDQUM2MzBBMzI4QkIyNjlFMjZEQkVEQTVGQ0M2QzFBQzE0RkU1NDg1RkYxCjg5NDVENkMz
-MzY1N0U4NjgxMkUxNDgzQUZERENDRTREQTFGMkNDRDE4NzAzQ0FFMzlBRkQ3MzJBNEMyNkQ2
-NUUyOTY5OTg0OEMyRTM5Ngo2NEJDMTI3Rjg4QkI3NzRBMzA4OEFDMEExNDE0QjBFNDRCMTk0
-RUVCQTIwNTUxNDAzNzRBQTMzOEQ2QjlENDlCNEJCQjY0RkM4NTkwMzEKOTU4OUQ0MTY2RUYz
-OEYxQjVERDhFNEVFQzJCMzkyNTFGQTE1NkI4RDAwQzA3MzUzQzJCMDM4MzIyRDEzMEZDOUVG
-RkE2QkVGRDQ3QkZECkQ2Q0MxOTI0QUU1MDQ2QzA3N0FBQzgwQjI5Q0ZGRUVCODI1MTg3REIx
-QjcyQkZCNDY4OTY3M0YxMEVCMERBMEFCM0I2M0E1RTJFOEM3QgozOTg1NDcwMEYzNTM0QUY2
-ODU0RTBDMzgxQTA1MTMwMUQyNEQ0MTgyQTlGRjc0NTQzNzYzOUE0QzYxQUM3QzA1MDVENjIy
-NjNBMjlFNUYKRTBDN0REMDcwMjQ1OTA2MTMzMEZDOUY3MkRGNDMzMzZCQzFGNkFBMUI1NjMw
-RTc0QzZGNzIzMDk4REQyMkI3QTFERjlENzEwQzEwRDNBCjk2RjkwQTM2NjkzRDk3RjExRjI4
-NUNFM0E0QzdDNzk5QjNDM0YyOEZDOTk1MDRENTQ0NzlBNkMzRDAyN0I0OEQzQjMxRUYyM0ZB
-MUExMQoyNDg0MDA5MkE0MUU3MkUwOEMzMTQ2RTIyQjExMDM0NkIyREE3QkRCNzU1MDU2NThF
-NjZGNDkzQkNDMTI1MEE4QTdFQjQxODM2QTI2NTUKREEwRTlGRUQxQUIzQUI4MDY1Njk1ODcz
-Q0NCMzU4MzIyQkZGRTU0OEExN0Q3OUZFQjRDRjRENEU4QTEyRTZFRDc5Q0QwMDY1RTE4MDRC
-CjIwMUE0NUE2Rjc1NzgwOUQ1Q0U4MTBDMDJBM0VBQ0FCQzhDMjhFMUM3NjY1MDFCODg2MTUy
-QUMwMjdFNzVFRkVFQTdFMTgyN0ZGMjc2QQozOUVENzkxODFDRTNCMkQ5NDE0NTcxMENCNTM1
-MzhFOEJGM0IwREU1Q0QzRUEwRUM0RjdEMkJCOTE3QkVCNUQ4ODU2QzkzNUEwMEE0RTMKNEZG
-QjIyODQyMjc5RDdCMjk5M0I0MjEzQjAxQjcxMTA4RDJCNjUxNkYxQzIyOUZFODNDRUI5RDMz
-MEI2NEE5Q0I5ODg0MzM5QUQ1MEYyCjE0ODkxQkIzQUE4OUE2QjYzMTkzRTU0RjY0MUQwRjg0
-MTZEMEQzMkExRDlFODQ5QjUxRUYxNDE0QTcyMTRBNjVERUFBMzdDNjU1OUNGMwpBOEUxNjI5
-OUY0MkVDNUNGQTMyNUI4QjQwNzEyNTE2RTdDOURENkQ5RTNFMUE2MjU1OUZBRjJBNDlENTAw
-MkY2REQ0MTEzRjVDRDU4RDIKQTAzQzhEQUQ2QjE4OTYwQTgwNkEzMzM1QjREMkE0QThCRDdD
-MDk0MjFCN0I1REZCQkJBQTU3QTEwRTNCODAzNDc2OEE2MzQ1NjVDRTQ0CkI2QzBGODRGQjVB
-QzRERDZDMTkwNUY1NDRCODMwREYxNEU1NkU1QjhFMzNDQzc1OTE3RkNBMEY0RjhDODc4QUJG
-NjA3RTk3MUY4QUE2QwpFNkJBMjRFOTcwQTdBRTcxMEU1NjMzMUQzRjlCQjdDMkVFRkI2QzA5
-ODM1REIyM0YxRUU2OTQyRTQ2NEI3QURCMUM5RTA4Q0U1MTk0RTQKOTQ4MjIzRDRDMzQ0NUQ0
-RDkxQTlEODg0QkM1N0QzMDVDMUU3MTMzMUZEODY5RTQxMkZCQkIzNzAxQUI5RjExNDgzN0FF
-QzczN0MxMEJBCjYyNEYxQjIzNEFCRUJDRTA1QjZEN0RDRjhDNEZBNDQ5NTJEQkM4MjVGQzQx
-QTkzNEQ3MUEyM0I0NzUyRERBRDI4MEI1RUM3OTkyNzhCMApBRUU1QkI4MzA1MUI1REE2MEYz
-NDk1MUZBN0I5MDE4OURGQzBENTNDMEQyQjczMDNFRjA4MzlFQUVGMEEwOTZBQjQ0MkU1MTc2
-RTkxRUEKQTc1NDQ2NkQxODA3QjEyOTBEQTBEM0IzQTY3NUVBMkVGOUQxQUQwMkQxNzcxOTVE
-NjcwQUIzNjhFQkE1N0M0Qjc1QUJDREQ0RDYwM0I3CjdGRjg5MkUyMjEwRERFREQ0MjlENkIx
-MkZENzA3OEEwQTA0QzAyQUJDRjEwQjE2OTY2MEQwQTdFMTg0Q0FBMkVGQ0RDOThBMjIxMjY5
-MgpFRTA5MTQ4OTUyNDhGN0ZCQjY5MENFMkE0NjVBQzkwOTcxQ0Y1NzI3MUVENERFNzc3RDhC
-MzQ1MjU5QUIwMkIwREFDQTk3RTE4NEUzMTkKOEFCQjVEQzMzRTlCQzZGOTI3NDRFQUI5REI1
-QzIwREZGQTM2QjZDMENFMTA0MUFCQkEwOUU1MEQ4QkFCNkI1QjM1MjBGQjM0REY2OEVFCkI0
-M0I2NzQ4NzkyMDFFQTk1REU3REE4NTAwREVCRjI1M0Q1QTgxREQxM0FEM0U3Q0JDQjMwMjAw
-RTAwM0MyN0JFRTE0MUVEODU2QzExQQoyMjEwRDEyQjE0NzA4MDQ3MzNBRTg5QTAxODAyMTFG
-ODFFMjVDNDIyQTk1NDA2QzhBODc0Mzc5OEI0QUYxMDJFRkVBNDdCRkMyQ0MyREMKMzQ5NTk5
-QTRDMDAwMzdBOUVDMDNEMjgxMEI1MEE1MkFFOUU1Q0VCRUEzRTJCNEI2RUFDMEVBMDYwNDZB
-RjY5Q0Q3MThCNTcwNDREQkYwCkRGNUVBMzZBOUI4REM1MTAzN0MzMzk2QjJEMDk1OURFOTdB
-RkQzNUMxNzUwM0ZBMDJBMzEzRjVGRkQ1MEJFRkIzODNFOUJCNjcyQzUzNQo1NDE1NDcxMEJD
-QkFEMTcxQTY1NEM4NzlGNTAwQkI3REFEMTg5QjFFMzA3MDAxQjA0NkQ5OEMzNzM3RjkwNjIy
-NjM0MjA3MkRBN0I3QTIKNEZBREFCNTM4MTQyNkFGRTQwMkM0MkIzMzg2Mjc3MDk5MDBFRUJD
-NzdGOTA0NTk0OTJCRTI3MDQxQTEyNkFBRDlFNDRBMTJDRTAzQzgzCjA5QTQwNzE2M0EwNEY2
-NjdGMjU2Q0ZCMTA2NkJGMDNGMzE3MTc5RTU3QzI3NjJERTQxN0M1RUZBQTg4MEIzNUU3QjQy
-NEJFOTZDRTBBMQoxNjYwRjg1QjhGQ0JBQTQ1RThGMjI2MjgxNEFCQzg2QzU4ODY0Q0YxRTg0
-M0YyNzMzNjQyQzcyRDlBRDEzNzE4QTlBODFDMUNCNERFRUYKMTMwNjE0RTkxQjg4NTJGQzY3
-OTNCQTBGNTVDNDI4Njc5NTFBMUUzOUY1RERCMURGRDMwMjcwNDM4RkYzNjM5NzQ2MzM4NjJD
-NzUzMzVECkJCNjAyQzk0RkEwMzc0MzREQzMxOUU2QTAwMTkzNTAyMDA3ODJDQ0JEQzk2OTEw
-REQxOEZCQTI3MTFBMjUzNEIwODA4N0U4M0E5NkM5MQozQ0I4NTZGRDQ1QUEzNjU4Qjc2Q0U3
-MDQxQTU3RDQ2QjAxOUM3NkIzRUNBMEQ3NTdBRkQwNTM0QjdDNkNFRjI5Mzk5MThDRUI1REM1
-MjQKOUI1NjAxQ0EzN0QwRkJFOEQ5MEVBOTMwMkRGOTk4RTM3QkFFRUNFNjMwRjQwMTlGQThF
-NjAyRDQ2MEQ2RUI4NjgyRDExNUVCM0YyQzVDCjhBQjM5NjM5RTFGQkJCMTEwOUEzMURCNUEx
-OUYxMTYwNjg1MThDM0M5OEZCNEU5MTE0NEI4OTNBNDAzRTY2MDFENEQ4MURCMUMxRjAwQQo4
-MEU4MzcxMTZDRTNFREQzMTMxMDBEMEI4QkZEMzE5M0UyMENBOTBBQzNDQjEwNzczM0I2NDk5
-QTY5MEYyQzhEMzM2RkIyOUUxNDQ0NzAKMkE1MjE3RTFFOTE4NTJGNUVFMEIyRjMwQjYxQ0Y2
-NjExMDlEMEVENjY4N0Q3REUyRkNFOTA2MjJEQ0RCMTc2Q0JGMThDOTg1MkZGM0MyCkIwMkY5
-RkQ3QUFBQTY5MkU5MTYyMzQ5RTc2NkVDMjlDQjk4MDM0RDNBODczMUY0OTEyMTkzRjFGNDgw
-QjY1N0JBODRFMjgyNTQwRDJCRAo3QUZFNTQ3RDEwOTM2QjE3MzlDQkZFRDIzOUE5QzNGQjhE
-RjUyRTlCQTFGMzhGRjBGMzRFNzAzQjE2Rjg3QzQ4RUM1MDY2MjA3OEZBRUYKOUZDNEVGNDUy
-NkY5MDc0MEZBRDY0ODFBRDNCNEI1Nzk1QzlFNTdERkRFMDlERjI0Q0U4NzczQjFGQjRDRUYx
-Qzk1RTczREE2RjcyMDE4CkNBMEUxNkRCNDJEREZFMTZDNjY5N0ZFNEQ3RTBBQjUxN0FCMEE5
-M0M4NUVGNUU3Q0UyQzQ0MTM3QTZBQjE1MTU5NzM4NzI4QzZGQzJBNQpCRTNFNzk5RDVDODMy
-REFDNjAxNDc3QzlGRThDMjRGQjM2OEFEMUM2MDkyQzBEQjZGNTE2Q0M4NTU2QTQ4MUNEREZG
-MUQyNjY0MDY0N0QKMDE1MTZFMzgyNzVFMjdCMjAxMzQzNEU0REY4MzMzNUVCMTY2Mzk1NDA1
-RjlEQ0ZCRjZDMkNFODg2REQ1OUIxQUU2MDU2OTA0OTNDRkIzCjcwOEJEMTI5NUExMTRENzlB
-MjZGNzRDQzExRjQ5RUU5MEVFOUEzNjRCNTE0OTY3QzBCMzc5RTY3NkJFMDBGRjAwNzNDREYw
-Q0NCNTc1NgpFNjZCMDRBQTBGRUU1RUUzNzZDMDI1OEUyODQxRDkwMTc2Q0M2Njk0RjVDQjYz
-NjlCRkU0NDUzMjM2QjRGNUFEREY5OEI4NkM2QzhGMEIKNzQ4MzJGNkJCNjY4NDA1MEQyMkNC
-MjhDQ0Y5MDg3QjU5QURCMzA4Mzg5MzBFMkJEQjFGREI5NTVDNTYwRDRENjE3RUFFNzkwNjRG
-NzQyCjdGMURGM0UyQTIwRTQxM0M3QkEzRTlBRDI2Q0E4MTQyOTVGQjMzMUQxMDgwQjQ1RjAw
-NjUxM0YzNTlBQjgyMkM4QzlBRkRFMEIyQ0UzMAo4OTM2QTY2RkM1QzMwMzM1NjdDNDg5NTY1
-QTU4NzY3RDI1MUQyOURGRUU0NEVFRERDNTlERUE1MDQ1N0EyNThGRTY4RjdFQTYxMjA4QzMK
-MjM4QzdFRkQ2OUYwOUE1QzhGQ0Q1NTczODBBNkI0QkQ4MkQ2NTlCMjZDQjREQ0YxODBDRjAw
-NTdEMTIwRDZBNkUwREMyOTFDNDBEQUUyCjgzM0Y0RTg0QTE4RjEwRjJGMzI5MjRCRDkzQzVD
-NzBDMjA3RTU2MjBCNjBFMTcyRTIzOEVBRjAxOThEN0ExMjQ5RkZCNzg4RDZDMUFBQQo0RTdE
-MEI0MzNENThDNzlBRUIzRTVDQUM3NTFCNzhCNTVFMkMyRjIzODJGMkYwNEE3MUMwNDRCOTgz
-MzBFMTZEOUI3NDQ4MUZDNTU0OTYKQUYyRkZGNDA4MTU3RDk5MTE1QTM4QkYwNzY3MDM5MjEx
-RDY4NDEzNDVCRTNGNkQ2MjRFREFFQTQ2MDJCQ0JDM0E4N0M4MDEzNTk1RDlECjA5RTcyMDcx
-OTdGRTg3RkQ1ODUyNDQwNjA0MThFQjJDQjA5RUYzNjlCNzg1RUE4QjQwMTc5ODY5NUI0NzNB
-QjU4OTY1MDU3ODg3RUZGMApBNjU4NUIzNjI5RTg3RDcwMEM4RTA4MzVGMUUzNUMyODBENjFG
-QjQ5ODcxRURFQzdDNEU1Qzc3MEMzRDhERTcxN0ZERkFCN0VBQ0Y3QUEKRTc4QTFBNEYwNzcy
-RUUzODM0NjQ4MkYwMjFBOTU2ODhFMUQzMTIxREQ4MEE4OEEzNDkyNThBQ0NEOEQwOTRGNDAz
-QTY3NEUxNzEwRjYxCjQ2REU5NTA3QzczRDUxQzc3MzU0QzQ3NUIzN0YzRTI2NkFERUYyRDcz
-OUExN0VBNUU4QkE1RjY1QzMxNEQ1NzU3OUJBRDc3RDM3RTc2NQpERjE5NkZFMTYzOTdDQzU4
-Q0Q4QjIxQzIxQkYyRTkyQTBEMEE0ODkzRDY3OUFDOTAxMjc1NzYwMkVFNjVBNzBCOTNDRUE5
-RDAyRjhEQTIKMjlDNzgzNDc0Q0NBQjNGOEQzQTA2QjJERUVDQ0FEMjdGNjIxRDY4NTI5MzJE
-NDNGQUI4RDgxMTY3QTQ3RDE2RDg2ODM3QjY4QjkxMEZFCjNEOTdFMDcyMzlCNzY3RkVGRTY5
-Mjk5MEE0RjM2MDBGN0JGQzU1QjdCMTM3MDczNDY3RkI3MjJENDVFRjU5MzYyQjExQjdBQTcy
-QzEwMQo0MDFGRjUyMTZGNDgzMjlFNzIxN0FDNTcyQ0M3MzZCNzdCQUQzQjg2M0ZENjIyRjQ2
-Q0Y1NDdFQkFDMEVENjNCQzBBRjNEQzg2QjgxNkUKRDFCODYyQTBBMTcyNTM5QUZDMjNFRDYy
-MDE2MjdCRDE4QTMxN0Y2QTJDNTc5NzU5MUVFRDU0RDlBQzdFNTMzNjQwMkRBNjY5NjVFMzEx
-Cjc2OEVFNzREMURCQTQyRkJFMkM1OTg0OEY0MDVEQjlDRUEzOUM3QUYwRDEzQjZGMENCOTkx
-NjBBMkNCRUQwRUNFNTVCMjE5ODJGREI3RAo1OUZBOTk2NDlFRjdGMDBBQkZCOUFGNzY0REVB
-REQ2MERDM0JFQTk5N0MxODJBOUU1ODU3QjFBOUUzRDEzMDVBNTdGNjA4ODA3QTEyRDkKMDQ1
-MjM2QzE4RjE3NEE2M0JCMkY2NkYwMDY5MTVGNzAxQTdGNkJFRDMxMjBBNjM0MzhCNUIyRUY0
-RjdERjRBNUY0MjJGQzFFNjFEMzk1Cjg4RjBBODY1QjcxMEQxRTkxNjVDRjZEMTUyMjEwQzcx
-NjVCMzkyRTM1QjcyRDEyMzlBMThENTlERTMxQTA4Njc2Njg2RDRDNzM5RDUwMApEMTVEMkRC
-Rjg0QzBDMTg4ODBGNDFCRkQ3NTdDM0UyRDE1Q0Y2OEEyNDQ0Qjg2M0Y2RkZBM0M5NzY1NjM3
-NDYzRkQ5MjEyQUJGRTFCNUYKMDNBODgyRTQ2RDQyMzYwNTJEM0EyNzBEMjVBMjY0NTdBNEM5
-RjM0OEI2QzhGMDgxOUYzQkI1QkE1NEIwOTA3MTMyNjM2OUFDMkU3Q0EwCjY2RDQ3MkY2RjdE
-RjdENEQxRUE5RkRERDA3MTc5NzNBNzIyNTdERUQyNjBGQ0Q5OTJDMDgzMDU4MUVCRkQwMkNE
-NDk0MUVBN0VFQzRCOAo1QzhFQ0NEQ0NBNzc3RkVCMDI0Mjg4NjA0MzUwRDUzRjk3Q0UyM0E3
-QzJFQzI5MkVCNjlEM0IyQjc1REE0N0M2NUMyQzBDRkUzQkUwOTcKRjkyODdBRjlDOTI2Mjky
-Q0U5Mzg1QTQ1RENERDAzMTRCMkRCREU1QUFEMkU2QTYxOTY0RDk2RENBRTIyMTdCQzRCNUEw
-NTZBRTI0RkFECjRBMDcwOEY2MzU5NEJGRjQ4NkNEMThCNTVDNDRBOEZEQTcwNTRCMEM5QTIw
-RjNDMzc5OUI4Rjc2NDdEREQ5QjFFNUE1RTY1NzlCOTVDOQpFQTRGM0UwREU4NTU2Nzg5RkIw
-ODBDNzAxOTEzNDg0MUY0NEI3QzlFNTI2RUY4NThGOEVENUMwMTEyQ0ZEMkUzQzFDMUYzODJC
-NzY2RDcKMzEwNTI5Njk2QUE3QTUzM0Q1QjBCNUQzNTMyQzExQjM1NjJDNkRBNzEzREVCMDRB
-NUJGMDIyMDU4NzcyQzk0Q0IyMkJCNEZBQTMyOTVGCkNDQTYwOUQxOEVBODUxNDZBODlDMDQ2
-RkM2MEIwREE2NUE0MTZFMkE3MUFCNUNGOEQ1MzYxMzhGMkE4NUREMDRBRURBNDJBRUY0MTc1
-NAoyMzJDOTJGMUY3OUIzMDNEQjRGMkVDREQzMDE4RDlDNjgzQTRCRDdENjBBMTU4Q0VBRTcx
-RDVDMjMxMTY1OTYyQkMzRTg4QzJDM0MwRjIKOUNBMkVGOTA3MEY4QzBFOTlCQzlGMzY1MkZE
-NTU5OUJFMzkxMTc1MEJDQkE2RTVDNTkzNEVERUI2Qzg1MDc0QjExQTg5NUE4NzRFQkIwCkU1
-OTA0MzQ5OUQwMjZBNkMwNjJCNEY4NkZGRDRFQUQyQzlBMzFENEU2M0QwOUVBMUYwMEM1NTY1
-M0E1QTY4NzE3RDBCQ0RBMDk2MUVENwo2MDgzOTg4NDFDMjZFMzA3NzQ5QTVDMjc2NkIwRDU2
-NzFBRDc0MDdDMDY5NjU3N0RDMDM0N0ZGRThDQ0UwNzcyNzUwRDRENkUxM0E2OTAKRTRBNUVC
-OTM1RkNDQkZDQkNBNzUxQkZFRDU2RkUzOEExODEwMTZGODdBMDVCOTA4NzNGRDhDOUQ4NDM3
-NDg2NDc4OTRBRjFGQzJFNDhGCkU0MDhGN0JBNENGQzlDMUE4ODk4QUM5OUVEMjMwRTk4NTE3
-M0I4MjlEQzJGRDIxRjM1QzUwMTAzQzA1M0REQ0M5Rjk4MzU3MTkxQ0UxRQoxOUQ2NTY2NzI3
-OTk2NDYwNzgxMDY5RUZGMzNDQTQ1MUExMDg4RTgxOTU2REVGOEU4Q0Y5OTdFMjkyRkJDNjNG
-OTlBODRBQjJDMjNBNTIKMDk5MjI4MzZCMDcyQUZGMTdFQzAzNDNDQUQxQjg0Nzg1MUNDMzE1
-MTBDOENBNTk5MTNDQzhERTJCMENEQUY5OTg0NkY3RjM0MUUyM0UxCkM3NzI3NTUwRUYxMTQ3
-NjQ3MkIzRDA4MkVDQzQ3RUE3RTJCNTZBNzQ3RTZBNzc3N0UyRTFBRDRGNEYyMjA5QjUzMjlG
-NDExMUQ4RjdFNQozODNENzYzODJGOEI1RkEwRDY1RjdEQjQ3QTFBMDgwNTY3MDIzRUUyNzA4
-MzNDQkQ4OEIwMEVCNzlERjQ5MTY3NEI1NzQyRDI3RTY4NzUKRDY4QzEyNzI2MjY1NzYyNDc2
-NEFBRTVCNkE4Nzc1OTY1QTE3OTg3OUQ0RUNFN0VFOUQ3N0JBNkRDOEQ5MTcyMTZGQUREOUEy
-NkNBRTlGCjlGNUIxMzVGNkI2QUEzRENCQzc3MTVCMzNFQUY3MDcxNzU2MUU2QzIwMTUxM0FC
-MjMwMzM3NAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKY2xlYXJ0b21hcmsK
-JSVFbmRQcm9jU2V0CiUlQmVnaW5Qcm9jU2V0OiBzdG9uZXNzYi5wZmEKMTEgZGljdCBiZWdp
-bgovRm9udEluZm8gMTAgZGljdCBkdXAgYmVnaW4KL3ZlcnNpb24gKDAwMS4wMDIpIHJlYWRv
-bmx5IGRlZgovTm90aWNlIChDb3B5cmlnaHQgKGMpIDE5ODcsIDE5OTAsIDE5OTIgQWRvYmUg
-U3lzdGVtcyBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLklUQyBTdG9uZSBp
-cyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIEludGVybmF0aW9uYWwgVHlwZWZhY2UgQ29y
-cG9yYXRpb24uKSByZWFkb25seSBkZWYKL0Z1bGxOYW1lIChJVEMgU3RvbmUgU2FucyBTZW1p
-Ym9sZCkgcmVhZG9ubHkgZGVmCi9GYW1pbHlOYW1lIChJVEMgU3RvbmUgU2FucykgcmVhZG9u
-bHkgZGVmCi9XZWlnaHQgKFNlbWlib2xkKSByZWFkb25seSBkZWYKL2lzRml4ZWRQaXRjaCBm
-YWxzZSBkZWYKL0l0YWxpY0FuZ2xlIDAgZGVmCi9VbmRlcmxpbmVQb3NpdGlvbiAtMTAwIGRl
-ZgovVW5kZXJsaW5lVGhpY2tuZXNzIDUwIGRlZgplbmQgcmVhZG9ubHkgZGVmCi9Gb250TmFt
-ZSAvU3RvbmVTYW5zLVNlbWlib2xkIGRlZgovRW5jb2RpbmcgU3RhbmRhcmRFbmNvZGluZyBk
-ZWYKL1BhaW50VHlwZSAwIGRlZgovRm9udFR5cGUgMSBkZWYKL0ZvbnRNYXRyaXggWzAuMDAx
-IDAgMCAwLjAwMSAwIDBdIHJlYWRvbmx5IGRlZgovVW5pcXVlSUQgMzg3OTIgZGVmCi9Gb250
-QkJveHstMTc5IC0yNTAgMTQwNSA5NTB9cmVhZG9ubHkgZGVmCmN1cnJlbnRkaWN0IGVuZApj
-dXJyZW50ZmlsZSBlZXhlYwowNUQyNTQyRjlGNzVFQzA4MjJCMzZCRTZGMERFREZDOERFQTQ4
-NjgzMDg3OEI5RUZDMDg2NTQyNTA5M0UwQzJFNjlENkYzM0NDOUFFMjMKREY1RURCQzFFNUQw
-NzlGQjQ3NjRCOUY1NEMxQ0IxMDBBOTM2QTQ0NTA2NUNCOTdEN0NFNkMwQzQzNzBCM0FERTU3
-N0FDRDI3M0VBRUQ2CjE1QzQxMDQ4MEM4NjNDQjc1RkZDRTBFNzJFREI1MDM1RDk3Njc0NzMx
-QkJCOEU2OTRDMDMwMkU4NEM1Q0E1NUY0MDVDODNFMDZGQTQyQQpERUFBODlDRTIxREREMkJD
-OUYwNDhGNzUwMUMyMTI0NTY2RDU1QTgxRTE2RUJEMDQ3REE2OENDQUJEQTlENTJBMzg4MDI5
-NUZEMDU3QzgKQzc5MDBBOEEzMUJBN0M0OTkwNjgwRkYxRjc0RDU2OTlDMTlEQzgzNTk4OThG
-N0EyNTE5NkZEQkU1REE2QTBFNUM2REI3NEI3QkJFODhDCjU0MkZDMEU0NThENjRENTIyMzAw
-NzlDRUIzMkM2NjQ0QTg4MDk0MzZCRDEzMzIwN0ZDQjFFNzE2NTM1OURFQzY1M0M3RUU2NUFF
-ODBBMQo5MkM4M0I2Q0YzMTBGNzRBRjc2MDQ5OURENjdBNERDRTk3Q0NEMURENTM4MzA4QkZB
-NDZBOTkyQjE4QzAyQjhBMzMyODY5RTY3NzUyM0YKRTdDMjU5Nzg2NUYzNTJCMkJFQTQxNDAy
-MDIwNDc2MjEyNjc0OURDMDk1Q0M1NUFBNzZFOUM2N0E5NzY5MkQxNDgyNkRCQkJERjU1MzhE
-Cjk5RTE1RDRDMDgyNzI2OTE2MjcwMzMzRTM4MEVDNkM3MUIyQjc5QTVEMTVEOUI5MjhGNjNB
-NDhDNDMxNEU1Q0MzQ0UyQkQyMzUyNTMzRgo1QkJBM0RFQ0U3NTI2ODE0MTM4QjUxQjg5ODY2
-NkU4MjMyOTFEMDE0MkVENjg5QUEzNkIzMjZGQjQxRTY3REMyOUM0NkE3Q0JDRjU2M0MKNjNC
-NTI2ODBDOUJBRUUyQkI1NTQwOTU0N0RDQTY0MDMzREFGODAzQ0NEMzJFMzc2OEZCQTA4NTQz
-RDgwQTkzN0Y2MUI4Qzk1OTI3QkMyCkEwOEY0QTI1N0QwM0FFRjAyNUYzODc3Qjc5OEU1NURG
-RUExN0EyQzNBNDg0QkM2QzZBQkQ2MEEyNzIzNDQ2RTJDNjdGRTBCQTE4MzFFMgpEN0Q0MkVG
-ODY0MzkyNjM5MTdDQTE5Q0Q4RjVBMEE2NUFBNzAwMzM0NUQxMzc0M0U3NTdBN0IxRDlCQkNF
-QUI2RkUwMDIyQjRBQkMxN0MKMTA4QzkxM0IxMDY2QTdCNTIxODg2MUVFMjk0MkUzOUUxREFC
-Q0UxRDE2Q0I2NjZCMTRDNzQyMUI5QTU4RjFEQUE1MTlFNkU5NjU3MEQyCkFDMTg3NDQ2RjY3
-NDM4RjU2RTFBODBERjdBNzJBNkE3NkNGQzI3RkEwN0QxMEI2MjRFOEUxQzUzRjcxNzIwQjMz
-NTFBOTY0OUE2RjI2MQpGQ0NERTZCQzYxQzA1ODdFN0NDNjIxN0Y5OEQwNDk4NkVFOUFEODZC
-MEJFQjA5QzI0QkE3QTNGNENDNjY0ODJFQzdGRDYwRjREOTNENEUKODIyNzI2MTYzOTIxNjZB
-RTA5NTgyRjFBNjE0NkFGOTkzMkRGNEFEMkM0NUZCNDY4QjVEMkI5RTExOUU5M0I0RTE4RUU5
-NjNEQUYxQUY2CkZEODc2QjM2MkIzMUUzNkJCMEE4NzZBNDlEODJBRTg5RTBDQUMxM0RFM0RC
-RjI5RkI5NkM4Nzg4Q0JDMDExQ0NDRjA0NzM0QzFDQkE1QQo2QzE4MzQzRUExQjBEQ0U4MDgz
-ODJDOUZGQjQ0RjFBNzc1MkM1RjlBQzZFN0RBQTU5QzA4MTMwMDM0QThDRURDQkE4RDQ4ODgx
-RTc5QTEKN0JGNTc0OUYxMzYwNzhEQTlGRUM5Q0NGQjA5Qzg1QzYzRkQ5NjRENzIyQURCMzJC
-MTA0MERCOTFCMTUwOEU0NjBDRDA4RkNCN0E5RTQyCkI3NEFCMDlFQjNGODM2Q0Y0NjY0OEJE
-RDkyRThERDJENDhGOEVFOEY4MEZCMUVFRDI0RTkwMURDMjk0REQwMjREMjVBNzI2NDIyMjVE
-MwowMjhGRjY5RkJBMDQzOTJGRDQxNUI3NzVGMEIxMzJENzVENTZDREU5QzBDRUU0NEMyOUY4
-RjE2OTJFRTAwMkE5NzNDNTExNEIwM0FBQzYKRDFBQzAwOTE4NEQ1MDc5MEQ4M0NGODAzRjJC
-MzZEOTRBOEQ3RjNFMUM1NkEwQzkyNDQ0N0Y1NjkyNUYwOTM5NUNCQjFERTM4QzVGMTNDCjFD
-N0Q1NjNDNDNFRkY1RTg1MzhDMkJFMTJDOEUyMTRCNzc0MDAwRkU0RTI3NTFEQzZGM0UyQ0M4
-REY1RTQ2MzNFMDkwRTRDMzRDMENDNgpGMDZCRDgyOUIxMTA1QjUwNDI5MjA1QjJDNEJBMzI0
-ODAwMzVDRjUxM0Y0MDM5QjY5RUI0NzVGMTZFQTQzOUUyNzdENUNCOTNEN0JBMTcKNDE2OTZB
-REJBMDY5REYwNDYyMzIxNjkxMzQ5ODBERjEzRDJDNzVGQUY1NzU4MkI1NDhGRTY3RjcyMTVE
-NzY3MzA3NzE2OEI3MzNEQ0ExCjUxQjBBNzU5MUMxQzJEN0IxRTkzRTQ4NUY1NDc5OUFFMTEx
-RjI3MkM0OUFDRkRGNjk5Mzk5NkE3QzU2OTlCMjUwQ0QyQTlEODJCN0E0Rgo2MEY5OTA4NjVB
-NUEyMUMzOTRBQ0M0RDYxQkUwRDlEREJGOERDMjUzRDE1NjI2NUZBQTVFNTE2M0RGNzM5RjAx
-M0MxQkU1MTlGNUE2MTYKNkZDREMzOTM4RTE0RDE3RDdCNENFODc4NDgxRDVEQzJERTU0NUND
-MjlDODhDRjA0M0VFOThDNEJGQTZFNzQ3REM2MjYxNTJCNjgwN0E1CjY0MEVBMzlDRTY4MDI1
-NDFFNUI0RTgwRjZBQUI0MUIxM0Y2RThDMDkwNjU1NjI3OTU3MEQ3QjNDNTUwOTIzN0VGRjRB
-OTg2ODAyOTVFRAo3QkQzNzg5REQ1MzJFMTJDNDdFOUQyNkFCOTgzMTY4OEU2QTlEOTg3MTU0
-MTlCQkE3QUUzOTBENkVFRTdFOTEzRTk4RkNCQTZCMjY4QjYKQzk1ODQyNEQ5OEJBQjE4Mzcy
-QzkyNUFEQzUzNDE1NTA4QUU0QUZCRjIxMkQ2NkEyMDA2NjkyOENEODFFNUZGRTVBQkEzNDgw
-MjUyMkI4CkM0OUNEMDBDRDBGNzE1Njg1OUYxNEEyNTQ1NjY1NzhCRTFFMDk4NkE4NjczOEJE
-RDdFODFFQjgyNDlBM0MyQjRGQzUyMjg4NkMyMjIwOQowMEJEQjk2RURBOTcyNTU4RUYxOEU5
-NDA4RTZGQThCNTlCNUU1NTdDREJDNkI5MDA4RTAxODA4OTk3NkE4MzE1NzYzN0VCQ0ZCNjBF
-NDYKMEJFMTJGOUU5MkZBOEFFMzg0RTJFMjdCNThBNERENDZCNkFFRjA3OEYxNzQxMEI2NDI5
-NkJDNDNCRkYxQUE3MjBBQzBENTc1QjBBNEE0CjY4NUY1MzNBODQ2RDFDOEU2RTNGMEE4OTI5
-REE5QTRERDAzOUFFQzA5MDhFRUU2MjlCMjhGODUxNjgzNkREQTg5QUE3RTAzMzk3NDc1OQo3
-QkFDMzJCN0Y2NUE0N0U4NzVENjU3NTkzMEU0NTYxQjEwNzdBOEI2RDRFQkE3MTBBNjBFQkY4
-QkQ3RjkwRDU5NjZEREYyMTc2NzY4MzgKQzcxNEI3RDBBMTAxM0NFNjQ5NjI5Nzk3MzM1RTRG
-MUU3MzZBNDUyRkYxMDVGMUUzMURCMUYxMDVGNTFDNURBQ0ZFMTREQUU1QzM4NUI5CkE0OTNB
-RjIyOTI2OERFMzEzRjAwMjc1RjZFRjRFOTk1RDhFMTA0MTMzRUNEM0JDQjEzNzhCNjlGRTBE
-REIxMDBDRDQ0ODFGM0Y3RkZFQgo2QjY5NjA5NkJGRERFRUYxMjY4QkQ5QURGNjgxQjU3Mzgx
-ODk2Rjg1MUVCMTI1MzRGQjA1RURDODlBQ0U1OUU3Q0RCRUJDREQ2MjI5NTMKNEUxMkJBMEM2
-NzUyNjA4NDE2MDlDQjY1NkIwNUQzN0NDN0ZDQ0JDQzkyQkVCQzRDMkMzMTEyQUUyQ0VENTU5
-MDUxODQzOEIyNzc1REQyCjc4REY4NDdCNUYzNjc3OTM0MDk5QThEMzRCOThFOUY3OTNFNkM4
-NkM3NkIxQ0IwRTQyRUM0RUEyRTlBQ0IyMkVFQkMwODQwMjZEQjE2Mwo0MEY4Q0Q5Q0UxOTRE
-MkY2RUEyNDAzMjU1REEyMThFQzMxRUYxMjg4OEQzQzRBQ0U0Qzg0OTEwQzZERDE3QzgzMjE1
-MzNCNjU0OTZDMEEKNjdFRjlBQjhCQjQ5RDhBOURFMTA2OTREMjFGQTY3OUFFREZENTZERjE4
-QzkxNUZEODJCM0VBQzVGMjc5RDRDQ0JGMDIxODNERjRFRUY2CjExRjUyNjYxMDhBMDFEMDU0
-MzIxRTZGNTkyMkYyRTFGNzhENDhEQTk2NjU0OUYzN0VBODc2QzcxQkExMDlGRTgxNzE5ODIy
-MzE1QzJENApFRERDMEIzQjBDMjU2NEJGNkQyRTJCQzNBQTAyMEI0NjJGMEE0MkM1NjJDMUZE
-MTM1REI4NEE1MUVENjc3RDJFQzk2MkM4QTg2REY5RjEKMkI0NDg3QUY0NTU4NDYwM0Q1MTdE
-NkJEMDRCNjY2NTlFQ0RGNDQ2Q0FCNzFENzY4QTlCNEIzRjU4MjkzQTZERENBODk1MzA5Q0Mw
-NDVGCjk1MUFFMTEwNzdGRDFBQUY3OURDODBDMENBQ0QzNjJFQUYxNzQ0NDU1REI5NjRFQUQy
-RDY1RjAzQjRGN0EwMUFCMkZCNDFBRjA4NDAxMgpDMTk5NzM4QUVGOTM1Q0Y0NkU2NTlERjg1
-MkE3OEQzNDMwNjMwMTRBNzUzOTlGNUZFQzkyQjc1REU3RTA0QzZFNDJERDZENkNGODREMzUK
-ODIwMjk3QjdEMEE0RTA3MkQ5RjU5NDRFN0VEQUJGRDRFMzA5MDE2QjZCQjM0NTBFMjk0MkRE
-MTMxRTc0MjBBQTJDQTNFNzY2QkU5Q0I5CjQ0QzI4MzMwRjJERkUxNTE4QzJGQkVGNzg1QUY4
-RDkwODBFRUYwRjlFMTU1M0MyRTg1NUFBNjhFQTcxRDhGNUExNjgxNUQxRjIxMDQzMAoyNUU4
-OTNFNDA4QjAwNkRFNDMyRDlBMUY1RjNFNDU1MzE3ODVCM0Y4Q0U2QjE3NUUyRjM5Qjk5OTQ1
-MzgyRTYzQzNGMzFDNzQ4QkZDMjYKQjdEMTQwNjAwNDMwMTdCM0VEOTNFMjdFMTcyOEUyNjQz
-MDNCMjFCRTNGNzhERjQ3REFBMTM5NTM2MUJBMEI4NEJFQ0YyRjg1NjhBRDI3CjY3MzE0QzBC
-QzgwQTlCNzMzRDk2NTE1Q0Y1ODZDRjAzODYzMDcwN0QyOTMzRUFGNjY0NjY1Qzc2OTI1NjNC
-MkI4NzA3QjJDMjFFQUZFNwozM0M5NkM1Q0JGNzk3MEMxMzEwRUFFNjcxRjk4OTMwOTE3MDZG
-QTEyOEIyREFBREE5NUYyNkQwRUIyOTk5QkMyOTRBMjJBNjE4ODNFMTkKNDIyMjgxNTkyOUQ3
-REYwNjgzQjVDODA1NkM0RDFGQTBFMzcxNkMxNTVEMUFDRDIyNUQ2QjY4OTc2RUUxQTQyMTcx
-NTkyQTkwRUJDMTBECjkzRkQ3MzVERTBGQUFCNjkxQTQwOTgyMzkyMTNGOTdCRjgxQThDRERC
-NTg4MENCQTcxNEYyMjIzMEQyMDhBRDk2QjlCNzMzMDVCOTBENgpDOTQ2OTdEM0FFOUZFRTVB
-NTI1MDNEODQ0Q0RFMUZDMTUxMTI4OTdDNjJBOUM5RUZCQzNENzc1QzQwQkFGNzg0NEFGNzAz
-NDY2OUIzMzIKNzA1MzNFQTcxQkYwQTlDMjdCQzAzQTAyRDcwNDA5MjZEQTFGMTA5MDZEMjZF
-NjQzMTYwNjkwN0U4NTIyQkY2NTgxQTMxMUExRUYxMDc1CkI2OTcwNTNCNTkwMjBCN0ZGODNE
-MEZDQjBCRkRGMTQzRkE4RTY0NUM1MzQwQjkyMjZEMUZCM0QwM0U4OTJCQjI0RDdGNTQzOEQ3
-Qjg3RQpGRTMzNzM0M0MxODc2Q0M5OTQ5NTcwN0Y4N0Q5NkUxMjM0QjU4QzcxQTQ1MEY2MkNB
-NUNFM0I4OTVCNTIzMjhBQzE3MzlEMzk2N0RCMDEKMjZFRTQ3NUI1QTYwOTk4MkMzMUI4RkYz
-NTJFOTU5RTQxN0U5MDdENUI5QzA3NkEyNzAxODg0OUFDMTBFNjExM0MxQTBGODE2NTgyNjgz
-CjcyNzQ3N0NCQkNERTEyMjJGOUVCQkI1NjQ4RDI5NTE3RTcyNDk2RDFGMEE0NENDREIzNDEw
-NkE1MzUyMUVFOEY2MTM1OEEyNjcxMDVFRgo0OTU3Nzg5MjM4OUJGQjcwMTUyMEFBNzNFNkI4
-MDcwREU2MzRCODUzRjNBNjE4MThBNEI4QjMzMjY0NDE2QzFDM0M4M0ZDMEM4QkUwOTEKRjMw
-MjUyQTg2OTFEMTkzNDU2NjIwQjNCRjQ3MUQ0Q0NFOTM5NzU1OEM3RUFDODEwNEM4QzZBMTND
-RDcxNkQ5MTYyMTFBMTJDNDQzRjJGCjA0RUYwQzMxRkFBRjA0MzcyOUI2MTU5QjU3ODI2Q0RC
-REQ2MjA1OTMyQjI1MTA4OTM4NUU0RTMwQzRENTE3NDRBNDVEOTZGQzI4NDA5NwoyMDA3RUQz
-NTNENjJEM0NEQjZGQzc1NUMxMUJFOThFOEZGQkI0MDU2MEM5M0NCQ0VDQkE3QzA5NjkyRjgx
-N0RDRTFCQTQ1MjZBODExNzkKMkYyQzE5QTE2OUM5MUMwMjU5MzhFMkIyNkE4MDM2ODJDRDk5
-MjE4NDRCRjlBQUIxQTE0NTE0QkQyNkYwNDZFODc2OUQ3OUIzNjA0QUJFCjBCNzg2RjYwRDQy
-NEIyQzYzMjM1MjBBOTgyRTkwNkNDM0U5MkQzQjUyQUYwNDUzMDcwOERENzgyMTM0RjQwNTJF
-QkY5NTMzOUY1MENGNAo1NDk2QjcwQjUyQjU5Q0I2RjU0REYzODJDRDlGNEJCMTFGNjI5ODYx
-MTMzQjRGNTg1QjgxNkVGMTk3QjYwQzVBMkQ5RkNGN0UyMEJGRUEKMzY2QjQyRDVGOUIyQkIw
-RjY3QjA0NUE1QjU3QzE4NUY2MjFFRUM5MTkzMjg1NUUwQzkxNzcwQTVFNEZCREU0QUJCOUNE
-MTM3Qzg4QjRFCkU0OTlENDMyRkE2REIyQjg3QzcxQTAzQUQyM0JFRkJCQzVBOEZCM0UyMTMw
-RjQ1MUIwQTBERDQwRTg0NzgzQzI2RTU3M0I0M0IxNTYxNQo0RjdFRUI4QjM4MUUxRjk3QzU0
-QzQ4RUI1QUQ0QTE1NDUzOTFFQzNGNjY1MEEwRTQzRjRDMjM3NTBERDU4MTU3QUZBQzczOEMw
-N0QyOTYKRUI5QUZBQjBDMEZBQzM4Q0U4NTY2MjkzQzU4NEIyMjU2RTc5NTQ0QTVCMjQyODM0
-QkRCMzFBODY0NkRFQjA0Qzk1RUU4MEVCQzJGODQ1CkJFMDUzNkE2MjlFOEEwRDIzRDM1NUNF
-NEQzNUU1Rjc0QTJENEUwOENBNkQ0N0NGQjFFMEY0Rjk4RUREMkVGM0RDNzc5QjY5QkFERUVG
-NgpBRjA2RjFDNkNEMzZFRUQxQzA5RTgwMENENzIzNjg5QTAwMTAwMEY0MjAxRDM2NURBNTU3
-RDExRjA1N0U4NTg1MjBERTc1RjVDOEYzNTQKNjlBOURERjVBMjlEMzY1MUVGRkZBRjRGREJF
-RDJBOUMxMjc1REI3NjRBQkE2RkY3NEI3ODlERDY1QzhEMDgyRDlBOUZDODAwODczMTMyCkZG
-QUM5RTc4MjI5MUVFNjY5NkQ0ODNENDFDMTM5OEU4QzY1MzA2REEwRDMwNkJCOUVDNzEzQUZC
-NEMzRDU1QTRDMzhEODY1MzgxREZCMApFNjMwNjI4RkJCN0NGNTE5MjJFNTQ3RDg5NzUzMDFF
-MkE4MUUwRDQyOUZBRDFDNjU5OTM1NDRBQTU0MzFCODgwQkU0RjMxNEM0OTgxQTMKRkVGQjJB
-MzdCQzFCRUZCMjY3RkVDNDc3Mzc4MTlDMTRDMDQ0ODY5NDNDQzE0MzIxMzVCRDg0NEEzNDYx
-N0VEN0U0MTQwNDMxQUFFOTQ4CkU5ODlDNUM3MkI2QjA5MEFFODg5QjYyNjYyRThEMzBEN0M2
-MzMxMTBGMDg2MDBGOEYzREVCQUJFMUI4MjcyNTcxQjE1NTBGRTM1QzI1Mgo4MThGODU2RkZE
-ODIzMUU4MDEzMjFDRkE0RTA4OEQxRDZBNEY1NkYyQ0E4MUE5MDlEMEQ1NjVCMzNGNUIyNTc0
-RkM1MkZDQTExMDdFNEUKOTRFNzIzN0Q5OTREQ0EwRTVDMTMzNDhCNkVEODM1QUQ3Mjc5RDc4
-Q0UyOTBCMzhGRDQyODc2RkNFNDQ0NzFBRTZFMjBFNjM2OUM2MzhFCjZFNEI0OUIwMEI2ODQ5
-N0Y5MTJGQTY1MTgwMTZBQ0U2RENBOEU4NjUxODRDRDU2M0UxNzEzRDdFQURGNjRFNTJCQkQx
-M0NFNUNFNTRGMQo5RUM1OTc0RTlGNTlEMjg3Rjc2RjAzRjc1NkFCNDJGQTNDREZBQ0E3OTc5
-MjY3OUI3RUNBNTE2RDE1MzJBMUJGMUFGMkIwNDAwMkEwMjkKQUM4REMwRjM0NTI3RTkxN0Q2
-QTU1OTk3NERGQkY5QTVFMTNFMkUxRUQ1MjZGN0FFMTdCRUEwNDY0MDcwNUNBRUIwNUYwNjU0
-NEExN0Y3CkI0NEJGNTRCNkI4MDU5NEQ3MUFFREFBRDE3MDc5Q0ZFMkI2QzY1NzQ0NjU1NDE4
-QjE1MjdENTFENEM0NUU1RjMyMUQ1MjQ2OEMxNjhGQwpBNTE1OTc5Mjg3NTY2REZGMjZDMDYx
-RkZENzAzOUMyMzJGRTFBQ0Q5Mzc3QzU4ODUwQzk5QkRBRTE0NUY5NDlGNEY1MDRENzRFNDI3
-OEIKM0NCMkVFNTMyNTJBRjc4MDVGMzE0M0YwOTk5QzhDMEQxN0NDRDJFOTIyMzc1RTU2M0VB
-RDY5OEQ5QUU2RDBEQUJBRTVBODM0MDQ5N0MyCjEyMzhGOUZDOUZDMDVCNzZBNDdEQTBDQ0ZG
-OEQxMDhEMUExODhGNURCNTc1RTVDMDgyMTlBMDRDRjc4RTA2QUYxMjRGQjNGQzNCNEU3OAoy
-Njc3RjNDMDlGOUQ4OTJBQjI5NEI0RUExNTI0MUNFMjg5OTUxNEVCNEQxQkNGNTFEMjk0NzM3
-MDg5RUI0QUM1NkFDNzg1MkU0OTgyMTcKN0I4MDQyNDExNzczNTM2NzA2MzczNzZENEQxQkU0
-RjEzQTYxMDdBNkE2RTVBNzM2NzlFNjg3RjU1MTI4MDFCMDdGNjc1NjhGNzM3QjNFCjAwRkYx
-M0Y3RjhERTlDNzNFQjNBMjg2NUIwNzA5NEFGNkZDODcxMEJDQkY2OTE1QkUyRTI0MTZCOUE4
-NjZCRkM1MTNFMjlFOTI4OThGQgo4MEY4MTEzMEU0QUI5RTVDNUQ1NTk1NzZCRUU0QUU1QjAx
-QkQyODc0ODI0MEU3QjJENzQ0MUU1NzA1M0Y5MzQ2MjhBOTlDQUM3RjRDNzIKRjBBMzQzQjc5
-MzdFMjk1QkJBQjlEQUU1Q0VGREQxMDNERkY5MzVCMjQ1NEU0QUUwQUYzOTc3NkEzQzBGNDA3
-MDFERkVDQjI3QzZEREJBCjREOTc5NzJDMDMxMDlBMjA5QzZGOThDMUU2RkQzQzgxQUY1Q0ZD
-RjUyMjM4NjZBNUU1ODUxNEZFOEQ1REVDOTU5NDU4NjVGQjZGNkZCQwo1MUZEREREQURBQjFE
-QkM2OEYzNUY3NTY0MjZFQjI5QTZBNDE1QUVDMTFEMkVDMDlCQzUyMzcxM0VENDQ0NjZGQkEz
-RkRERUE4NzNBMTQKODVEN0MwNDJFNDkwQkVBNzUxMkQ0NjcwNUE5Qzc3QjUyQkY1NzVCQjFD
-ODQ5Qzc2RDBFMzIwMzNBOUY1OUM2MkQzNjQ2NzI1NjI3Q0I3Cjk0OEMyRjcyRURBM0Q1RDI3
-RTgzQzJGMzc5QjEyQ0JCNkQ3RUQyRENGM0JEQTI5NzI4Rjk5MTI2RTU2QTM2Q0M5RDdGQ0Q4
-M0YyQTRGQQpEQkQ1QzE4ODM3OUNDNkE1NjA3M0Y1N0U3NTIyMUU1QkEzMjhFODRFQkI2QURD
-RDlEMjU4REUwM0U1RUQ4MzEyM0RCMTk2NDUxMUI3OTIKMjczMEQ2OTJGOTZCMkU5MzI3M0FD
-MTQ4RUNGMDY5MzYyRjVFQUJCREQ2QzU3N0QwREQxRDcyNEJEQkQ4MDQyNTBEQjJFQjNBMkI1
-RjQ0CkU3REZBQzU0NTdEMTE3RjNBMUIxMzJBNjhDNjFBMzUxNzlCMzM0OUExRjQxMkMwMzIy
-Q0I0MTUyNTZGRTUxN0ZDQjBDMjA2Q0Q1NzZEMAoxODFDRjFFRDNBMDY4NDQ0RjJBMTlEOUVF
-QjUzMjRDRTA3MTQ3MkFFRTAyRTIyNUM3NDc5MTMzOTJFNDMzMzFDNURDOTZCQTk4NUUyRTEK
-NjA1QTNCQzA5RkM5MkNEQkU0QTUxNkUxQkQyNDhEMzRGRDg1MDIzRjlENzM4RUUxMEIyREMy
-M0VEOEExQTJGQTIwN0ExQTQ3NEI5NEEwCkI3ODY5NEQ3QjlDMzg2MzAyQjJCQzcwMjk0NDJF
-NTc0QjYyNThGOUJBQUQ4QTA5OUM1MDAyQkUzNjY2NDlBNzcxQTk0QTUzM0I0RDMzNgo2OTVE
-REQ1OTlERkI0RkE5NjNCMDQ2MjhDNTJENkREOTM3QkJDRUQ0MTdGREZFOTI1Q0E1NEI5Q0NG
-NDRFQzc4RDJDRUE5QUZBQkJBNkEKOEQwRDc0NzlFRTYwMjA0Q0YzOEQxRTlCNDI1QkQzQkQz
-NzUxOUQwRDY0RTE1NENDNkNBRTdDRkM3MjA5RjRBRjRFNjZBOURGQkQxOTM0CkU4MkQxMjA5
-RTEyQzQ0Q0JERjRDM0U5MDI5MzFDNkM5ODNFNzEyREE5M0Y0NURFNzlBNThCRUY2RTc0MkVC
-NjNEN0QwQzE4N0Q0MDM3Qgo5QzFGREUzRjIwNDUwOUVEQ0RDQUE1MDc1RTNCOEI0QzVFNjJD
-MThDMkZBMDEwNDBBNEQxNTNDNThGMEQ2QUE2NjMzNUFDRjdDNDU1RjUKODU1QUIzREIwQTEy
-NDEyODc4NTY1NzREQjE3MERBMEM1NUE5QUUxOTBGREJGMzA0OTk4N0M4Q0UyNkM1MDFEMEYz
-QTE1RTk5MTVFQjVBCjlBRTRBNDk4NjBEQTkzNkNDNjEyMjhBMjFDMzQzREY2QjBDQ0UzMjRG
-QTAwQzMyNjUzREUxNkY5QkJBRTg1RTlDNzY3MzE1OTQzNEQxNAoyRTI1OTI4RDJFQUQ4MDIx
-QkZCMkRCNEYwQUU5MzkwMDU3N0M1OTM3QTdBMEUyOTI1NDZDNjZEOUQzMDc1OUVGMDYxMjA2
-MDQ2ODlGQUUKRjgwODUyMkJFQzU2QkE2MjYyMUY3MjhFOUE0QTREMzFEQjdGN0Q4MkREREZB
-QjEyN0U1MEU3MkY5NUVGQTQ0RDQwRUQ5QTgyQTFBM0QyCjE0QUUyNzU5MzBGNzk1QUQ3NDM3
-NUE5ODlENzhFRjBGM0IyODEzOEQzNUEyMEY1MTZDODU0NjA4MUJBNEJDRDZCNDkzQjQ5RkFC
-NUFEQgpDODQxQzQ4QUM4QjIyRURCOTEzMUJCQUQwMDQyNUQzNjAxRjQ5MjhGNzJGNjBBRjZC
-QTI4NDVERkYyQzFDNDZDOEMwOTE5NDgxQzJGMDIKNkU3MTYyN0EwRUVBN0MxMjMzQkZDNjdC
-MTZERUEwMEFEMDUyNEZGMkZEMDRFNDkyNjY2NTJEREE3NDJFMjc3MDUwNEMyMjQzMDAwNEFF
-CkY4Q0Q5NEU2RTU0RDFFODk4OTI2NEI3QzIyRDc3MEQ5MzYzODk5Rjk3QTkwMEI4NjM3QzQy
-Q0JFOURBMENBRjk3RDY5RkYzOTkxMDkxOQoxNTVDQzY4RkM4MTIwOEY5QzdFOUI3QjY3QkJF
-RjAyRDY1OTMwNDQ0RTkzMTlEOThBM0MwNjNFRTU2QjkwN0NDNUIyQjA1NDk2NUJEMjIKMDc0
-RkY2MUY4Rjc0RUQ1NzM0QzQ2QkU1MzJDOUJBODgzQzU1QUE1RkFBRjVFRTgwODUzRDFCRjA2
-RTI2MDY3OTczMkU3NzEyNjE5QzM5CjlERkM0MjI1RTcxQjg3OENCNzU4QzZDM0RFQjUzNDdD
-NUFENjRBMjJGMEM2QkYyQzY5MkY1RUMzNTRGRTlFRkI5NDBBRkVEQzUxMUY4QgoxQTEyQkQx
-OEMxRkYxNEIzNTQ3NDhERkE0NTUzQTM5NkREODQ1NzIzNEZCMUQ2QkJGMkU1OEVENkE0QkU1
-MzU2RTM0MDJFNjk1MzFCQ0UKMEQ1N0U3NjMyRDJEM0Q5QTdFN0I1NDQ5OUNCQUI4MDc1MTQz
-MzBDNTY2RDEwNEM0OEE0RkJGRDdGMzY3NEVERTY0RDY3NERGMTI2ODU2CjExNDVGOEQ2NDlD
-RkYxQzA2OTQxNDY2Nzg2N0VBN0I2NUEwMTI2NThGMTM3NkU3RUFCNDUyNUVFMTc4OEIyNUMz
-NDg4NTA4MDlFNjFFOApDQ0REMkZGNzA4QzFBNjFFRTBFMkQ2QjVEMUI4NUIyMDk1MTg1NjY4
-QjM3ODM2RkNBRUMxOEQ1NDQ0RDBDMDBFQjZENzVFODExRDNDNTAKOURGRUVEQkU4NkI4MDUy
-RDAwMjFCMTg3QTkzRDFFQTFGRTAxNDdEMTFENzVEQjVCNjM1MzY0MTBERDc0MDQwRDc3Rjkz
-MDI5MkQwMEUwCjgzNTFGN0RFQjYzRDk4RDU1RjExQUU1QUVFRUIwNUQwMEQ3RTdGREQ3NjlF
-RDMzRjFDNjFCRjA4N0MzMDBCRjhENUJDRTM0QjQ3OUQ2Mgo4MjMxQjlBQ0VGMTlFRkNGNjc1
-QkI0RUMyODMzNDU4QTE1MUMzNDBCQTVEQUI5NDk5MTdDQ0Q4QzQ1NUQzMEY0MzMzQTgzNDUx
-OTc4NUIKNTM5Mzg4NjVGQ0UzRDdENTI0QzcxNTJFMDNERTJGODREODJGNkY5MDY4MkIwMTk4
-QkY2ODhCMkE2MzIxM0NCNDMyMjk3QUU5MkZDQjU2CjdEMEMzRUEyMkMyOEMzNzNEMzQ0OEQ0
-MDI3MTlEMEM2OEMzNjg2Q0JBRTRDNDVBNjk1OEQxRTg5RTYxRUE4RkJEM0QxRjYzMzY2QUM1
-OQo5NDkwQ0MyMTE4MTQ4MDE3QzcyRkIyMzlGMTU0MDIxNjM5N0RERjM2RTQxREM0OUJFNEYz
-ODM2QjA5QzY3NDQ1NEMxMDQ0QTAyNzA0RTYKRkY3RkNGNzhBQTg1QjEwMDNDMUIwRUIyQjUw
-MjFGOEYyNjQwQTY4RTQ3OTlFNzVDRjQwRkZGQzIxMkFENTYwMTMxMzMwNDg5NTU1QTQ4Cjgy
-OEVFREQ0NDBCREZGM0ZDQkM4NjAwODA5OTJBMzM2N0U4NTBGOUQ5RDIwQUYxQTAwNTVENEFE
-MTM1MDUyNDU3MjVCQzNERkQ3MjYxQQpCNzc3MENDNDFDNkI5MDg4NzJGRjk5NzU4REY3RUEx
-OUNDQ0I4MTIwQUVBMzJDNUU1Q0VBQ0MwNUEwQzQwMzAwQzhCQkEzRUExNkFDRDcKM0M5MzMx
-MDI2RDg1MEZERTgzOTk2Q0EwM0Y2NDJGNURFNTQ4MTg1NDAwMTRFRjY1NTcxMTkwMzk0RDk0
-RkMyOTczQTZDOTJDRjY3NERFCjJBRDlEREZFQThCOTNGNTU2RTU5QjYxQUU1NThFNkU4Njgy
-NEYyM0Y2QTBBNzJGQzc5QTQ4Q0QxNEZEN0JDQzc2MDExQTM5RDhDQzlBRQpGOEU3MjQwMkRC
-OTZERjBERjQ4ODg1ODgxRjUwOEM3QzU5QUY2RDA2MTAyRkFDODQ3MTg2MzA4NzA1MTZFRkM5
-NDI5QTNFOTUzNzY5NTYKMzE0RTY1QUJBMTI0RjkyQUUxMTY4MkY5Nzg4RTQ5MzM3OUY4M0ZB
-REYzNDA3ODMxNTBDNTE3MzlFRTg3QTg2NkQzNTJCOTlFNkMxRjRFCkFEODE5MUI3REJGMzY0
-MjYwQ0VEMzI3NEEyNjFDM0FBRjkwOEQ0NzNDMjE3NUQxNUFBOTMyRDg4RERFNTdDMkVBRDI3
-QjREMEYwNUM5RQo1MTM3QTQwOTMzNEQwOTU0MTgwQ0FCNjQzNzIxNjYyNjZGQUE1QTIyNTA2
-RDg1QTQ5MjhFMjQwQUZGRjMxOEVGNjNCNDVDMjZEMjMyMzcKNkM0NjVBQzlGQ0Y2NEQ5REND
-RjEzQjZENTEwM0MxRjY2NTc0Q0NDOTY4RUUwRjZDQ0E3NzNCMjhENTNFRDk0QkI3QjQyMjg3
-QTZEM0VDCjEwMjE0M0Y1MjcyMENDNTM5NkVBNTI0NTc1QzFDREI0Mzc0ODcyODhCNTU4N0Qy
-NEJGRkYxQjgyQURENDVBRkVDQjRENzQ3QTYyODk0OAo2MjNFNjE2NjRGMzY1NUJCQjFERTc4
-MkI3QUNCRjI1Njg3NURGNUZDQzIwQkI3NTA2OTEwRDEyQkU3MjkxRUEwNjQ4Mjk4RkQzNjE3
-MzcKMDQ1OEFEMDg5MTcwQTAwNTk0MjYzOUY3QUU1QkU4RDFGQjZCOTU2NjJGRjA3NEZCQ0Y5
-Mjc3NkU2RjRDN0QyNDFEMUVGQUVFRTQwRERGCkU4RDg4REMxRURFM0Q5RTA3NjhCOEUwRkQz
-OEJDRDkzMTBGOEE3NENDMEM2NzFCMEZDRDQwNDczOUZCQzY4QkIwMkIxRDkwQkM0RDkxQgpG
-NUMyNEU3MkQ5OEQxRDM2QTA2MTFCQTk5NjFCNzRDQ0U0MzQxMURBNUJGMjY1OTQxNEQ3NEJD
-RkU4RTI3N0VFQzRBMTFGNzEzNDJBOTcKNjI5MUM1MkEyMTczN0YyMjQxNzhCNjE5RjA0OEYy
-QTQ0RTlGNDJCRDU1MzA4NDZFMTBDNEYwNTYyNDAyNkUzNTVGRTYyMzIyM0RCRjQyCjkwREQ1
-MDRBREM1NjA1MUE5MjU3OENBMkUwMEJFQzEyMEUwODEyRTBFRUVFOTM0RkI5RTdGRUE2QjQ5
-MjVCNEY1MTE4RjMwQzVCRkYzNQpGOEExRjA2OUIxRkNDMjQ2OTQ1MTlGRDlFODE3RTAxNzk5
-RkUxRkI5RkZCREQyODIyMjY2M0E3NEU5QUEyNTNGNTczRkIzNjMxQkFGRUMKRDMyNzUxNEE0
-Mzk0N0YwNEYzMUJDQjIyQzk4Q0Y5RTA1MDczMkJFODU3NEJDRUVCRkI5OTM4QUE3NEZDNjhB
-M0IyRUNENkFDQ0RGMjJECkU5RjQ2QUMzNTg5QUFCMUMzNTI1MzhEQUEwRTFDQTMyMDY5NEY3
-OUQ3RTVFNjkzNDEyOERFN0VFM0UzMzI4RDRENDk0QjVFODVFRTQwRgpGMjAzMkU0NEFFNTg3
-NzBFNzgxODgxNzdGQ0YyM0NERDIwMDI4MEEzOUVEQjc2RTREN0JBNkY3MjhDRTg3ODQ1MDdG
-N0RBMTY0RjA2MkMKMzQ5RTMyNUMxNDU5NzZEMDEwMkU2NURBMTcxRjk1QTA0QTNENTUwRUUz
-REVBQTRBNTY0NzY3RUNGM0U3RDBENUQyQkQ2RDA2Q0ZBQkM0CjFEMUJFNUE1RjFDNDc4REUw
-ODM0M0YyRDlENkE3NEJFQTNEQUM5NTNCRjM4MTgzRUI5QkY5QjE4OEY4ODQ1OTQ5NkJDNzRB
-M0VGNjUxNAoxMjMwN0FGNjlENjhBMUJEOTY3OEM2NDJEMTFCNzVBN0I1QzExM0VBODAzNjU4
-MDU5NkZBMTkzRjJGRTQ1RTUyMjc0RjIwNTgzRjZEMEUKN0Q3QzE3Q0EwOTAyMkQwNzU3M0Uz
-M0Y1MjM5NEZGNDk5RUQwNjdFRERGMTIyQTRBQTQ0QjlCNENENTNDMDQzMDRCRDUzQkRCNzM0
-RDc4CjU4NjY4OTFDRkNDQjVDQzRBQkMyRUEyQkU2RUI0MzJCQzBFQjIyRDlFQzQ1QkQzMUVD
-MTEyNDRGOUM3QURGODFCQ0EyOUE3MEVFRTQzOQo0QTNBQzVDMkJDQkQyRTgyQTI2QjA2QTM0
-ODU0MkE0QzU2RDc3OEQyREZGMjk0NEI1RUUyQjJDQzMyNzYyRkVFQTJFOTVEMTgwNzU4NDcK
-NkUxOEU2NTk2QjlBQkIzRjM2NzQ1QkQ4MjI4RUMzNTZCRDhERkU4OUY4MTgwMjc3QzUwRERB
-ODgzQTU5RjFEOUEyMTcwNEVEMDE5MDcwCjdFODdEMzA2NzI5NzNGNEVFRDZDNzQ0QzJFNzFC
-QTM1RTg4N0MwRUExNTAzQTk0MUVBMjA5MDIxNzdEQjFGNTA1NDE3NUEyMTVBOUQ0QgpGRUJF
-QzUyMUIyMkY5QTI5MjRGNzZBQ0JFNTczRTIxNkIxQzk3RDVEN0VEMzIyREZERkJEQTEwNDlB
-MjE5RUUzNzM2QjlCNzYzNTM4Q0UKMEIxQkUzRTI1MzE3NUE1MTVEQjBFQjg3N0E1NDdDNDky
-OUM5RUZCRjREQkM1ODZCQjA3NkVDRDc1NzU5MzBFNDU2MUIxMEE1NkUwRjkyCjE2NUU0MTVG
-NzhBQ0FGMUE5OUFGNEExQTg2MjVDRjAzQjZGRTU2NENFQUE2Q0FGMkZCMjQ3NTQxQ0FCQTI3
-OERDMTk2NkI2REExOUExRQo5MTUwMjQxODQ4MzJFMzMxMjlEQUE4RjM3QzU3RUE4RkE2NkIx
-RDdDMUUwMzk0NTYyN0Y5ODA3NTEzRUFBMEY4N0NENTU2NzY0NjA2OTIKRTc2QTcxODg1QTFB
-MzdCRkMwQUJGREVERkY2NTVERUQ4QTlGQzgxRjU3OTEyRUE4N0VENUZCMjhFNkZCRjI4M0ZC
-NjgzMkMxMDcwNEZCCkIxQjQ2RDdFMUJFQzcwQjVEQThGNUNEQjU4RDE5RThGQUFCNTcwMkEz
-QTcyNkVCMDc3ODk1RDM2Q0I2MzM4Mzc4QTM0MTI5MjIwMTZFNgo1QzQ1RDc3QzNENzQzOTcw
-NTk3MEM1NzcyREVFMDI4MjFGMUJEMjM2QUZEQjk5ODJDMTk4NkRGMTYxNjY1RDdBOTI3NDEy
-NTA3NzAwRkEKQjJEODczRTc3QkY4MTg3MTNBMjU3RkM3RkMyOUREN0Q0OTg3MjQ5RDUzNUUz
-NTgyODEyQ0NFRjNDRTcyQjYwRDIzRjMzNDM2RDFEQTQyCkJBNjA0OTY3MTk3NzQ3ODNGMzk1
-QzQyQzFCNDRDNzdGNkE2NjYyMEYxRjkyMzY3QjU2Nzc3QTU3QkFDMDI0ODc0NjgwQ0QxMDQ5
-RUUzQwo0NThCMjQyMTA2MjdDNzQ1NTU5MDg3MDMzRURGMENGRTE0NDg1RkI3OUQ1NDE4ODhE
-OTdDQkY5QUU2QkJFRjlDRTBEQzAyQkJCQzgzQjQKQzJCQzI2MzEzQ0NFNDYzNzFDNjBCRkMz
-Mzc1OEM2QkQzMzQzQzA5ODRFNThENENFNTEzMzUxMTg5OEQ3ODYwREFFRjA0REFCQzQ0NzMx
-CjdBRTNBMThCQzg5ODgzMzEzMENGNzJFREQ5MUE0RTQyRDg1RjRCODk3RDBGOUU5REI0NDc3
-RTczMDYzMTg5MTYxOTE2REU2RjM0RkY3MwoxMUZBNjk1QUZBMkY4OTczMzRGRDgxREZGQzUw
-NUJFQTVDMTNBM0FDNzkyNTY5QzY5MzU2MTFFOTVCNzRENDFEOURFMzYxNDA2MjA5NzkKMjA1
-RkE3ODU5RTE1ODVCMTEyNERGRTRCMDREODgwNjE1Q0MyMTk4QTY3RDQ3QjY0ODUxQTY0MkY0
-MENDMTZBOEU4QUUyMDJFRUM1NUUxCjAwOEUzODc5MjQxQTYxRTY2NzNDOUVERjc3RUZCMkE0
-M0Y3RTg1RTE5NkJFQTAwNDM4OThGRUQwMUZCQUFBNDc4OTRFRTczOTJCMURCNQoyQjk0MzNE
-ODg5ODA0NjFBN0Y2QkVBQkU2Qjc1MjYwMEI3NThGMEYyNTI5RUEyNkQ1N0JGMjg5NDkxMEFG
-QzY3RkM2RDE5MEYzNTkwNTgKNTE3NzY2Qzk0MDNCNDA0RDUwODY1Q0Y2MzJGMzcxQUE2NzMx
-OUI2MjYyRjA5QTkyQTY1RTg2QUVERURBQzUwNEJBOTAxQjhBMTlGQTE0CkY3QzY2NTlCMjA5
-ODQ1RTk2NjU0NzQ5ODFFRjk1MTMxMTVCOTNEQTE2OTkxQjVFMzFBNzBERjAxREIwNkQ0N0JG
-MDg5RUIxODRDRTAzOQozQTFDMkMwOEEyQjA1NjI1Q0UwMjUxM0I0QzgyRDAyNkM5MDNEQ0NC
-MzEzNUZFODhBNkE0Q0VDRkQyRDU4MDhDQ0M5OUJGRkM0M0RGOUMKRkEyRUZFOTg3NUMzNDkx
-MzIwRDYyRkEzQTU0NTU4RjI5OEUzODU0REMzRkM4RDYwRUIwOUM1MzRFNkExNDEwMkY0OTUz
-QUY3OUE1N0U4Cjc3NDhBMkUwMUM2ODNCOEVDQ0ZFNEFBNjgxRDk0M0MzNzU4RkU3MDYyNTIy
-N0RFMjE0Q0NBQ0QzNUYxNUI0NzgyMTAwQkEzQzBBRUQ0RAo1MjM2ODE0MzhBRTE5NUQ1QjU4
-RDRGNjFCOTgwN0VGQjEyQjE2MkZCREVFNjNDMjJDRTA1RDk5RTRFMjg5RUYwMTQ2M0RDQkQ3
-NDhEOUMKNkNBMDI3MERCMTExNDk1QjBFN0JBMzc3Q0IzNDE2M0RBNkUzQjdGNUZFODlGQzlG
-RUQ5OTYwRjNFQjlGQzQyRjFDRDM5QkZBQzhBMzZCCkYwRUQwQ0IzQjZEODUwM0U3ODQzMkVC
-RjQyQzBFQzZENjA4MjQxRERBQjJGMzI1NDBBQjIyQ0VGRERCQkIxMDA3NzE1NDg0NkFENTI1
-Mwo4MzU1NThFMUEzMEM0MjZGOUU3QTQ4OEI4OEMxNjk5QURERTY5RjA4MjEzNDJDNjAwNDJE
-MENENTA1Nzk5QkYxQTREODZEOTREQzQ5QTMKMDQ2MjM2Q0RGNDYyQ0E2MzY3MjIwRTA0MUZG
-OEVGRTE4Q0E2NUI5ODlFODY1RkQyMzdBN0UxMjBFRUU5NTkxNTI5NUY0RkI4RDA1MDhGCkE5
-OEEyQjc3MzdENjA4ODA0NzUyMUU2Qjc0MDMxMUJBQTVGRjQwMjc1NENCMTE5M0MzMjlCN0E3
-NEFGNUFCRDU5NkU1QUI2NkMyNDJDOQpGNkY4OURBMTIwNjVEQjAxQUZBRTMyQTdDQzYxNTZC
-OERGRjk0QjcyQzhBNUY0MTVDNzM4OTYzQjExMkRGOTk2MTY1RjUyQ0M0OEMyQUUKRkM5MDMx
-Nzg5MzEwNDRCOTA5NUEwOUE5NjkxNjY4QUFDQTkxMThENjdFMTIyQjcwQkMxOUE1MTE3NTk1
-NDRDRTNBOUJGQ0I3M0E2NTA0CkQ3N0UyNEEzNTBGRTUyRkIwMTA3QUVFMTJGNTlBRDMyQzEy
-MEIxMjA1QjY5RDAxNjVFN0JGOThDOUYxN0EwNERENDY2NDlFRjdFMzYzQwo3RjUyRjU3M0Ex
-Qjk5NzMzRTUzMDNCRUQxOUZBM0NGMzA2ODc5Qzc0OThCMThFRDhFRTAxRThFODc3MTVBNDRE
-Q0VDNUQyNTlFOTU3NjcKMEE0NjlEM0M0RTVFQzIwNDNGNkVFMjg4QUNFMUUzQjM5MDg0NTI5
-NDU1RTFGODM4OTE4NkY3NjYyRjk2RTNFMUIwNTMwNzNDRjA0RDJGCkYzMjJDRkRCNjI2MzU4
-OEIzODAyMzI3MzE4QThEQ0I5QTYxQzlEMUIxREQyRjgwNzBGMjE0REZCMjE5ODY1MEQxNEE3
-N0MxNEZDMUFBNAowNkVDNDg3MTQ5Qjg2Qjk5N0RBRjIyRTMwQ0FFOTY4OTcxNjY0QTEwQTBD
-QzM0Njk2MUZBNDkwNjJFNjE3RUQzREQwREY3MzdCNDE0MzcKQjFEQzJCMDY3MDg5MEY5RUQ5
-N0U0MDZCNDZBOTRCMDVBNTM4RTgyNDA1NzJCQ0NFRkRFMjFGNDFBNjY1MjBDRTVFQ0REM0Mw
-Q0NEQjNGCjE5MzMyRkQ5NDY1NEE5RUI3RDdENTE3NTAxMzA5NEFDNzlCOTJEMUZCMEJBODZG
-MjA5QTMyODNEREE5REIyNUI0RjVBMEEwM0U3MkZGRQpBNDVGOTE0NzU3RThDNTBCOEYwRjgx
-NzZGQThDRjQ0QzI3MUE1ODRGN0JFNzAwQTBEMzY1NzJGQUUwNUVGNkZGMjNDOEJCMzNFRjZC
-QTMKMzE4NjU4M0U0RjU1RDEyNTYwNzJCNTNCOTEwNDdBRjc4NjhCMzFDQjYxNTBGNTQ1NkZE
-NEZGQjhCNEIyRUMzRUUxMTQ4RThEQjM0MzUzCkIzQkZBNEY4NEI4QzMwMDFFNTc1MzcyQkEz
-RjdCREYxQkI2QzRCODJDMkZBRDc1NzVFMTJFMjg3RUI5NzFFRDNEOTE0MDQyMjExMzdBMgo1
-MzAyNkM4OTg5RkM0NzIxNDNERERFOUUyRDQ5QTQxM0YxRDZBNDA5MTc5Q0RDM0NCRjU0NEEw
-OTNGQTA1OTg1RTBCRTcxQ0Q2MDE4RDQKMjEyN0QwQUVCNDM4OEZBN0FCQzg1NTgxNzIzOTY4
-ODVBOEE0MkYwQTBDNzY4QTRCMEVDMkI0RDE4NjJBRkM0RkYzNjNGMzY2OEEzM0JCCjZGNzg4
-QTVEOUU5Q0VBMkJGQUREN0E0QzYxMUJBMjE3RDE1QTFGNkJFQjEzNUY4RjdDOUZCMDExNjQy
-QjYyNDAxODE0OTRBNkMxOTJBNQo3NTY3NjZGNjJENzMzMUMxNDJDNTUxQUIwRTY0RUQ4Q0JD
-NTdFRjNDMjk1RERGMkREQkQyNjU4MTY3NjFGMTk5QUJBMUQyRTUzNDk2ODQKOTRFNjc2RDEw
-NDYxQzM0MTM2RkI4N0I5RkRDODE3REI3MzE0MTkyNzgzMDFERjg2QzkxRDIxNjYyQkZCMzY2
-MTVENEY4NURGMzc5M0UyCjlCQjRBODZGMUFFREMwNjFCMTU5M0Y1OURGMTMzRTRDOTdCNzQ0
-RjZBQTE5RUUwRTIzRUQ4MjZEMEFBQjVFQzQ3OUYyRjEzMUREQUUyNgowRjQ0ODJFODIxNUYy
-QTA2QzMzMTUyRjFFMjZFQjRGN0VGRTg2Mjg0NkEzN0EwODRENjA5MDIxNkExQTlFMTExRDQx
-NjYyOUFBMzczNzUKQzQ5MjRGRDk2RTg3NjczQzVCNDFGNjI3RjVDMUJGNjgyRTZDNDExNzI1
-Q0Y1NDE0RDdFRDQzMjhCOTRFQjhFQUQ5RUE5OTFEMEYxMjBFCjg3MkNEMTM5N0QzNkQ1QzJE
-QjAzMTY0RjJFNUQ0MTQ1MTlGREI2MUREQjNFMjdENUJDNzAxN0NBQkFDOUVCNjdCQ0I2QTVG
-QzQ1MUMxMwpFN0EzQjk0NEMxNzk1QURFNjE4OTQ4MDlCMDg1QUI0RDhDMDQ2NDg2NzE0RDA4
-NjA0M0M4RTUwNEI1NzQ3NkM1QUZGREU4NDczQ0I2RjIKMkRFMDZCRjZGRUZEMzY4RDZGOEQw
-RTAwMjkyQjgyNUVFRTE4RjFGRDNEQjM0REEzNDdGMUIxM0FCRjE5RjIyRjEwMzEzRTZENjQ2
-ODA5CjkwRTRCOEQxNjY0OTkxMjhCQTE0RDJGMjIwMEM4NjA0NUM3MzFCOEVDRkQ1MkIyNDAw
-QzJDRTFCREYwOTU4QzRGQ0U4M0VBQzRCNzU3RApDREUxRjVDRjQ0NTVGQ0IyNzI1OUUzQUEx
-MDJFNENBNjQyMTIyRDVEQjIzN0JFOTE1RTYwNjg1MEQ0N0NENzdBQjA3QkU3QjY3NkRDODYK
-QjVFMENFMUZGRkIxNzdFMkE4NDAyM0Y3ODQ1QjVCNTcwMjI3NDMzNjM4REExNzNDMDg2NzMw
-QzJDNjQ3MDk2NDczQzIyREU3QTQ3RjFDCkMzM0UwMDQzNDk0NkFEOTg0N0E1NUE2RDU0Mjk1
-QkE2QjJGODBFODBBMDU1QTAyQThFODBEMjg2ODVGRkEwQjc2NjQzMDUzMUFFNzlENQpCQ0Ew
-QzY5OTYyNDUwMkI0M0EzRUExMEQ4RTNGRTYzQUZGRDc1MTgyOEZFRTY5QzA3NjlCRDMzMUZG
-MkY0MzY3RkM0RjhBRUIyQzA2QjgKN0NBM0QyNTFEQkM2RTgxRjcxNTk4NjI4NDU3MTIyNDhG
-Qjg2QTBGNzNCNzY3RUE4Nzg0RUVERkI1MzhFNDEzMzRBOEY0MjgwQjY0RTM0CjlDMjI2MEIx
-OTE3NjU3NjUxREVFMTBCNzhDNjBFOTQxQUM1Njk5MkJENjFCODQyMDBFOTQyRjM0MUMzN0M3
-RDczRDlGMkFGRUU4NDVBMQpBOEVDQURGNkJGM0RENzdEMTc1MTdBQTk5RkQ5QTBDODdFNzM1
-Rjk5OEMyQjA1NzE2NzQ2MTU5RUZCNDM5QjYxOUM3QUFCMDJDNjA3RTIKOTExQTIwM0ZBMzZD
-MTVCM0VDRUNDNkM3MjAzN0Q0OUYxNUU1NTBGREJBNURFNkE3QkFBNzFBRjgzNDU5RUQyMEEz
-MzEwMzdGMEUyNUQ3CjE3N0NEMTZCNENCNTcyQzIyNTc3MDBGMTUwRjAzRkU5RUI0NEU5Qzg0
-MEVBODFCQzFEOUI5RTZGQUNGNkQwNUMwMUMxNzA5RTVENzhGMgpCRkJFQkJDRTA4QzVFMzIw
-NjdDREM3MUZENTAwNDJGRjI1NEJGNjJFNUUzOTIzQjY2QUNCQUM0M0RFQjY1NDFFRjk4RTFD
-RDlCMTIyREYKQzM3MUNDQjk3MEMzNDUwMDY4NDc4ODBEQzY4MTRDQ0VDNUI1OTU1QjYzNzg2
-QjRFQTIyNUNBODFDNUExOTQ4N0M1MThDOEZEOTg1NjhGCjEzQjc5RURFQjQ2NUNDMkIwRkZC
-RjUzNzlDNEEyQzBGQ0ZCMDE4OTk1MTA3MjI0REQ0Mzc1NEU1NUY3MDE3RTk3M0Y0RERGQzJB
-MTREMAo5N0M4QzVEQkQ5MkE1RDE2MUMyNUI2NDg4RDUzRTUyQzRFREFEODkyMDNCMEEyQjUw
-NDhENTVFRTlFNTc3RkE3NUU0NkU3NjQ4QjU0MzAKMDk1MjNCRTZENjY2MDNGN0EyRTMxN0ZB
-N0FDNDRFNDUzNDJBOTc3RTc2RDUzODRCNjc2M0ZFMjE4NjM4M0YxMDcxMUYzNkU1QUFCODAx
-CjExQjAyNjk5MDg1QzMyMjJGNjYyMkMyMDFCMUMxRjk3NTcyMUNFRTg2NDE5RTlERjM2NUYx
-NjAzNjQxREY3QTU5MDVCRUEwQzU0RDNBMQo4QkRDRTBDODkyQzhDRUFBRDFGNkFFMEU3MjdC
-NzkyQUFFREIzMDM5MENENEMxN0QwNzJCODI4NTlDMEI2RTY1NzRFOEYyQjRGNEFFMDMKRENG
-RDI3OEI5MERFRDc2NEMwRTZGMjYyQ0NGQUQ3MjU3QzdEMkUyNzMzRDBFOUJFQzNDNkRGMEJG
-Nzc5QjUxNkU0MTUwNkJDMDg0OTI4CjM3MjRDODc2NjgyQzFDNkYzNjM0MEFFODA3MkFGREIx
-RjcxMEMyODEwRTgwOEM4RTc4OURDMzk2MjE3NDk3OEUwMjBEQkMxQTE2RjEyOQpBRTExMEU3
-QzcwMTYwMUQxMjA3MDJCMEFFQTk4RkUzQjlFQTI4Q0QxNzVCOUU0NDU5MjBCQUYzMkJDQkIx
-MzY1MkJCMzNCNjIxNDc4NTkKNzY1Q0QxNUI1MUE2M0ZFRTYxRkY5MkY0NThBQzI4ODQ5QkFC
-Nzc1RkQ0MjEyMzY1OEYzMUY2REMwRjg5NkYyRTM3Q0IwQkQzMTBCMDk4CkU3QjFBNkY0NzNE
-MDYyNEUzRDhFQjdCQjkxRTAwQkQxNjRBMDg4RUFDMjA3RjBBREUxRDkxNTBENTQ2RTAwRjND
-RDAzOEQ3OTJGNDJEMQo5NjI1QTE0RDMwRThCOTcyQjI2MzQzM0JDRUQxOTVFOEZFNEYyMDBD
-NjcyQTFGMTY3Rjk2OUIyRTA2N0UzMkI3RDY5NzY1ODIzNjIwRDMKRTY4ODk0QkQwM0MzRDVF
-NjE0RkFFOUIxNzNDMjFBOTQ2NDUzNDI4QjIyQzAwOUUwQkQ0QUQ2OUQ5NEJDRTc2MzAzNzc1
-RkFGNzRDMTUxCkE2RDBDNUEzRjg3MDNDRDVCREZDQTJBNDY5QkY2QTQyQThGQTg2NzgzOTBC
-OUJENTE2Qzc2QzJENkYzNThDMEEyOEJFQkY5NzFGNEM0RAoxRDgxQ0QxNUQ5MTNDNEUzQzFG
-OTM0ODQ3MDgxQkIxODk3Q0ExOURBRjg3QjlENUVDNzJBN0MyNkI2NTU2MzUxNERDMTYyQ0Mx
-MjkwODgKMENGNEZDMEMxMTVDRjI3NjgwNzVDQTA3QjA0MzQwRjIyOEU4NjJBNDBGMzVBQUQ0
-NDg0QjEwOUZFRTUwRTI2NjU1QThDNjk5MjA1RDcwCkMyQkU0RDIzNjhFM0Y3RjkyN0Y2NERB
-MTQwRjk3OUIyOTlCNTBEQjFCOTIyNEU2NzUwQTdEMUFBOTA5QTQ5MjFBQ0JFMUY0N0M4QjZC
-NwowQ0Q0NkVDOThDOUJENTZDMzVEM0ZCNjFBRTlCQ0QzQ0NDMzkxNDFDOTI3ODZCOEM3Q0E2
-MUUwNkI4OEI5QTE3NDJFRjZENUNENDE3RjQKMjgyRjIyMDIxMkQzMEVGOTdEQ0NCNzBDQjEx
-NTNFODkxMjEzMUM5RTJFODlCNDkwQkE5OTY3Q0VEQTA4OUFBN0Q3RTI5MjVDNDAwNUFECjU2
-MjRBMjk0RTYzRjU0MjM1RjU3OTQ4OEE3MDVEMEQxM0JDRDY2ODI2MzEyMkNDNTkxRDI0MTdD
-RUUxQjFDMjIwQkY0QkU0NTcyMkYzQwo0ODkxODU4RENEQ0Q4OEI2N0FBOUU2OUQwNDVGMjU4
-NDFDMEQ4QTRBOERFNTA3OEEyMjA4ODQyNUE2MDI3QTlGRDEwNjNGMjI0MzYwMEIKQUFCMzQ3
-OTgzMzIyMEQzOEYzNjVDOTVFQUQyQjhFMzdFNjc4NEVBMjlBNEQ1NEM0NDQ1QzUyRjM5MzlC
-MUE2MUYwNUZDOUU1REE4RkMwCjg0QjlCNUZGN0FDNzZCMDdFQkRGQTZFQUQ1RTcwMjEwQ0Y3
-OTU3NjhFQTY0MDhERjRFN0VFRkE1RkJFRUIzRkZGMDM1N0Y2MUVBNjA2MQowNjYxOUMxNEVD
-NkU0RUEzNDdBQzZGOTZGM0M4NTI0NTk5NjVDRDI5MzI4QzNGQzE2NEY1NzBBNjQ2RDUxNEEx
-RkJEOUMyRTA4QTRDNDEKQTA1MzlDOEQ1QzA4NDlBMUM2MTczRTREQzlCMkIwMzlGN0I1QUFG
-QjQ2QTk4QTdBOTQzMUQ3MDM4OEQwNkFCOTBCNThCQkFFQzg2RTc1CjE3RjI1Qzc2NzRBNjMz
-MzI0RTFDREJCQTQ4MjdBNzc1QkQ2Q0ExQTlBOEFDMjRBNTFFNkZEMTYzQ0MwQjQ3QTAwQUQx
-MUVCMDVCM0FGNApGOUY5NzFGMDRGNDg2NUVBQkZGOUVGNTk5REIzOTgyQzYyRkI5MTkxNTkx
-NkQ4N0U0MDQ1ODU1MkVERkQwMEExMEZEQzc1Rjg2OTM4QUQKRTM4RUNFQjgyQ0JGMjk0NEFC
-QTlFOTlCRUI5ODU2RDU4QkVDOUYxRTBGNTJDNjRCQzJCN0IxOUQ5QjI5OTlEMTZDQUUwMkU1
-RDEyRkJBCjYyQjlBQkRDRjk1QzY2NEZCNDU1MEU4OTBBRjczMkU3RUYyNzhBREI5QTk0NUVB
-QjE2N0ZERUU1Mjk5Mzk4Njk0OTU1MTE1OUIzRkJEQwpFODc2M0U4Nzk1OTg5Q0Y0NkRDRTdE
-NTNGOUNEQzcxM0I3OURENzVGMzhEMjY4MTNBNkIzMUZFMEU0ODc3NzQwMUY2RkQ4NkRBNURD
-MTgKM0Y5NjI1REQzMEVDNzUyODJCODMxQ0MxNTFGNEE5MDQyNkJEQzQzRUYyQ0VBMzc0Njgz
-NjM1MTlDQkMxMEVFREU3NDUzRjdGQUNBMTJDCjBGOTI3Qjc4OTIyQTgxQzNFNzgyMTJEODlB
-RUE1MDA2Qzc4OTQyNUEwMUEwRjM4MkVCMzVFNjFBMTU4NDZBN0M5MzRBQTFGMTY0RDQ0RApF
-ODA0MTg3NDBDQ0E5MzY0QTlDQjk2Q0QwMUJGQzkxQzRCQjM1RjBGODU0MjM1RTk4RThERkVB
-RTdEREQ3QUJDRDE4QUI4NEU3OEMwMEQKRDM5QTRGNTNCNTJCMTRFNTcwRDlFNTM3NzMyOEY0
-M0JERDgyOTM2RTU5OTJBNzQ1MTIzQjQyRkZFQkJCQ0YxOTY3NDRGMTkzRjU3QTQwCjM4QjVB
-RjNENUIxNzY5QzEwRUI5NDdCNEMyRDZGQUM1NzhBQkUyQzRFNjgyRjYzOTcxRUY1MzQ2QzYy
-REVGRTE4NERGRkMwMzlDMjMzRApBQTk3N0NFMzIyNERDOUU5ODlFNDlGRkNDQzczQkFEQUU4
-NUIyQTlCRkRBNEY4NDgwMDkyMzdBQkM0ODE5OTNGRDdDMzU4QUFFQjYyRTUKMjY4NUM0NTk3
-QzlCRERDNTVDNkNFRUExQjQ0QTJCQzBBMjcwNjFEMDhCNEVGRDhCOTc2NjRDRjJGQjI1MUI5
-NEQ0OTAwRjEzNUE5NTJDCjQ2RjVGQTEzQTMwRjZBQTVDMTE1MEExODY2NzhCNjEwNTI2Qzc2
-NDA1NEREQ0I1RkZBQUIwQjMxQTkyQjhCRTFBQzYwRjU4MjlBOTI3RgowMDZGNjE5RDEwQjU5
-RjU5RjEzN0ZBNjBEMDFFRDZFRTcxRTY1NDRFQTdDRjhDOEY4MTA3NTc2N0Y3Rjg4RDdBMjQw
-MkVBMzNGOERGMjAKOUE4MzQ1Nzc2Q0RGQUQzMzE1RkFGQ0Y5NEE5Nzc2QkIzNDY5NzI2MkQz
-ODU2QjhGNzJFMjM4RTgzMzFGMkNENEVCRkEyQ0QwQzJGNjMzCkQ2N0NGRTAxMkUzMkY3RTFG
-MTk5OTgzRURBRjM5NDE4OUU3MkQ2Mzk4RjQ4Qjg5ODg2NjhGQkUwQjZCMUYzMDdBOUQxMjdB
-QjY0MDc2Nwo2OUY3ODU2RjI4QjhGOTc5MDkzQjc1MkE3NTNBRkI1RTUzNzFDNjYxOTJEODg0
-RkZGMDBBOTdCMzBGRUQ5OTFBNDZCQjdGOTgyQjc4NTgKNjhCRkNDRTc1OTNENDMyODYxQzU1
-QUE2QzQ4QTJFREE4RkFGNEY5RDIzRkVCNUZEMUY0NzdBRTUzMjIzN0EzNzJENDI1NjY0OTcw
-QkQ2CjY3MDgwNzc1RUI5QTNEMDgwQjEwNTkzQ0JDMjcxRkE5RDhDOTVGOUE3Qzg5REFBNTRG
-NzgxNUY3QzcxMjZGNjQwQ0Q3NzNFNzAyMDM3QgoyRkNGQ0ZGOEJFOUM2QUVCQkVGOTVBNTA3
-OTBEMjVEMUIyODlGMjVCNDNCOTU5RTlDMkY5NEYyQkI2NjM4MkYyOTlGRjVFODhBQzAwM0YK
-MkEwNDA5NUFFODA4QTZGQzgxMkMzRjQ4OEI1NzgzREFDQjU4QUJDMTVGODFCODQyMEMzN0I3
-Nzk3RkY1NTFCMTBEQUMwM0ZDMTk1MEIxCjczNEY3NTNBNzIyRTlFQkFBRTVGQzYxNDBEODAw
-RDFFMzY1NUQ4OUI4OTcyNkJCODEwMEMwMEU1N0ZCODVEMjI5RTY0RUVGNTBDRTAxMAoxNjk5
-RTcyMUI5NENGQjQyRjNDQ0RERkU4NzZCMTBCNDlBN0EzOEZFNjlGODU1MkQ2MzFERTZDRkE5
-RjBDQ0UzMTQ0QUVENkFEMDAyMTQKMzZFQ0Q5MDQ0QTNERjJCOTk0NEJFNDkxQzNGMzI4MkMz
-OEFEMzgzOUJFRUM5NDg1QjMwNTgyQzlEOEMyMDk4NkE5RDJERUJBNzYwQjE0CjZENTQxODQx
-RDQyRkE5RjQ2QzMyOUM1Njc5QzMxQkIzMkY4OUI3RTRGQjgxN0EwMkIxQ0RDN0VDRUVFQjg0
-ODE4QjYwNTQwREJDQ0MwRgozMTQ0QzY3MzMyMEUzRERCRTZFMzFGMTY3NzQ3OUI3NUMxODk2
-OEI3NjZDOTI0NDYxNDgyQjM1NzU0REREQjlFNDNDODFEMjI2QzkxREQKRTIxNzY4QTU0Q0Y2
-NEZFMjk5ODAzMTdDNjg2NEZBREEyMjhEMkE5NzIxNTJFRDE0MTJGOTQ5OENFNjBCN0MzQjUw
-Qjk4OTBBRUQ3MjNDCjc5NTkzNDQwOUM1RUIyQzcyN0E4ODcyQzZBMERBODIwQ0NCQjUwNkNG
-MEQ3OEFGQUQ2NEMwNjg5MUE4QjU3MDczMkFGMTJGNjBENDU2RQoxNzg3MUU1RTNFQ0RENkIz
-Q0JEOEY4NjIzNEMzOEU0RkQwMENEMzk0NTc0MTlBMTY5RTU5RUY0RUU2MjVERDQwNzQ4QkFF
-NDdDREMzOUEKOUJBQUY0QjY1RkM2QzU1MTFEOTA2MURBMzUyRTk4MTg4MEY2MzQwRDZCNkEy
-MEI4Mzk3NTQ2NjNEMjZGNkY1M0VGQ0Q2RUE2RUM5NjNFCjU4MUU0MjMzMUIyMzY0MDlGMkY5
-OEM0MzQ0NUJBMEQ3RDBFQUE1MjE1MDYzNkFGNzM1QkZCNkM0NzVDOTA0RkQ0NzU0MDM0RUQ1
-OEUxQgpCNERGQUM4MjRCMzY2OUQzQUM0NzNCRDgzM0IzQ0U4ODkzMjM5ODdCRjFFQjNDQTFB
-MDg3MkVENTM4ODQ2MEYzNjBGRTlEMTQwMEZDOEYKMTA4MzM5NDZGNjg4MzI5NzhCMEY3NUNC
-MTRFOUZGNzVFN0M1Qjk0NjQ1MTJCRkQ1RDVDNEJEREQ3NTMwRkFFMEIzOTc5NDhGRDU3MjFB
-CjBEN0IzOEZENUI2N0NBRTE2NkVBMkREQ0RGQTFBQkY0RjhFMTE5NTkxM0QyMjJBQzNBN0NE
-NUJBOUMwNzMwNEZDNDc3RkQ5MUZEMzVDQgpDNzg0ODI2QUZFRDVEODBBQjdDOTY4MDM2RTg2
-ODkzMDUwOEY0RjFDNkQ3NDg4MDk0Qjc4OTkwQkE0Qjc5Mzg0QzRFNTVFMDlGQkQyOEUKQ0FE
-Nzc2NERGNDA0QTE4MzJCMjQzRUZGOEIwRjM0NEY0NkEzRDc3MkU2RjA1MDdBNTBDRjEyMEM3
-NERENjY3NERFNEE3MjUzMUEzM0U2CjI4QTVCMUFDMDc5QUU3QTQxRDYyQzcyM0Q5MEI3QTNF
-OTk5NDg2Q0RDRTJCNjRCQ0FGNzQ0M0JDQzM3QTk0NDVDMUI0NjgxQkQyNkREQgpDNDUxNjU4
-QTE5ODFCMzI3RERGMDBFM0M5QUMzNDczNTYwNTU5NTQ2NjQ3MkMzNDYzNjc0OUM0MzY3NzNC
-QUExNTVFNTFBQ0U1N0EyOTQKNjI4MTJEMkY2RTM5NkY1N0U4QTZDRjVBNzM5MzA4RkQ0NzhD
-Njk1MjhEODZCM0NDMTQ0Mjc2MTUzMUQ2QkIxRkY0OEE1MTNEQUExQkVCCjYxN0E0MThBRjY5
-Njk4OEUyOTUzOEQ5RUYwREQ4RTE2NTg4RDkxNTdFNjE5QUUxMjI2RjRDMkYzNzE0NkRDNkE0
-OTY4NUM0OTI1NzhGMwpFRUQ3QjhERUUyRkNFMDM0NjBBRERCOTFDMzdGN0EyOUUyRDMyNzYx
-OTg3NDBCNzNDOTMxNjFBNzVGRTBEODNGMDJFQ0JGMUI1QUVEOTMKMDg2REEwNTQ1RUYxMDAw
-MDcwNjMwNUQyOTExRUUzOUFEQUNFQ0JFMDZDMUI1RkU5NDFFQThCQ0M2QzJCNkU5NDg1Njc0
-RTdEQkNFRjNBCjY1RThGQjU5RTI1QzI5MUFFQzMxNThBRTlEN0MyRkE2NjEyMjRCMkNGQjg3
-OTcwQTg0NTM4RjAzNzBFRDZERTRBQzQzQkUyM0Y5MTRBNApENjdGQzcxQUQyN0FERDM4NENF
-OTA5OUM2NUFEODk5ODA3MzVCMDQ2QzlGMzdDREIyOUJBNUJGQzM1MzBDQjE2NThERkVBOTRE
-NzAzNjAKRjYzNzgxRDg3RjQ1MDE4NzU2NDczNDI3OTFFQTYwOUZEMUNBQzhBMzM4QkMyNUQy
-OTZBODBGNEJFMEEyNEE4NDdBQkU3MDhCRDhCN0VECjE1MEMzRTA3MUJGMEY4NDY5QTk5NDA3
-MkRDRkMxNkJCQTkwRkIyNEE3MUNFOEU3Rjc2RUNFOTVEQUE1QkYzRTc4RDBBRkMyMjQzNTc1
-MwpCOTRFQTM5MENEOTVDMTlCRTZDNzM5RkNCMzdGNzA1MUE4Nzk5MTU1MDdGNkY0Q0E4NUNC
-OUM1QzlCMURFNkVEQzFBNTlEMDQ2M0VDMDkKRUJEQUFDMkU1OTY5NjU4MTExMDA0NzExQzJD
-Mzc2OTYwOUJFMzVGODQ2MUJBMzBCRDdFNjgzMjE1MDVBMTRCMzBFMEJFNTRCMjlEREE2CjRB
-Q0QxRDE4NkU1N0YxNkExNUExMjExRUFEMENDMzE3QjhCNzcwNTA2MEUxODE0MDM1OEY5NTBC
-MDUwQTIzMkUyRTI0RkRERjc0RjkwRApGMUQyODhGMzE3MUEzODM1MUExNDFERjMwNUIzRkQz
-MkY1QTQ3QzI1MzM3QzI1MjE0MEQzRDUyOTcwMEEzOTFGNTE3NjEzNEY2RTQ3NTIKNzQ1MkY3
-NkUxNkI5RDUwMjVBMEQ5QzRCQzBBODg3M0E5RDhCQTRBQTBFMzIzRTFFNjM1RUU3MTVFMDlF
-Mzc4MkE2NEIxQjU3OEM0RkIwCjQ4OUQ1OTQ1NThBOURGREVDNDc5QTk4OThCM0QyMDAyRUY2
-QTNGMEFBQ0VGQjRGNENEODI2MTE3MkMyN0QxNUQzQzhBNkQ4QkJGODU1MApCNUE3MjY3MkE1
-MTNGMzQwNDkyNTM2QTFDNTdFQkExRTU2MTM4QTZFQjFGQzEzOEJBQTFERUUxNEQ4MzM0QkEy
-RDgzNjhFMUIxQkFFREQKRjQ0MTM0OTA3MjNFMjQ5MzM2NTlBMkMyQUE3NjkxOEIzNDdBRENF
-QTJEQTc3M0Y0QTkwMzk5QjBEMTJFNkQ5Njk3Q0NBOTc0M0QyQjlCCkIyRTM0Nzg0MUFGMkZG
-RDNCMkVDQjJGNTJDNkU4NEUyNDlBOTgxNjQ5NDAwOTNDNkIwRjdGM0VEQzEyRkRCMEUyODQ1
-ODMyMUVBNTM5RQpENTNBQzVBOEE2NTgxRDEzODk5NjY2RTM4N0Y0NTYxMUU2REY2RkI2QTkx
-MkRGMzQ4MzdDRDAyQTdDQkQ0NDlEQjZENzZBRThFMEI5RDYKNjc0QTc4RUQ4MzFDQzUyQjUw
-MTc4M0ZGNjFCM0Q2MDEyQzdGRDA5MUY3OEJFNTY4QTJEOUNFNEYzMEZDNkI1NzYyMjk1RENC
-REExRjUzCjU0NTY5RjM4MTM4NjE4NzE4NkVFRkE1OEU1ODNEOTQ3NkE0QzJDRURDNkI5NTIz
-MTVCQzNBQUE2NkFDNEEwRkYzNERDNDYyNjhDNUI0Nwo3Rjk4RjE3MEI1Q0E0Q0U5MTg4RkI1
-QTdERTlCNkM3MDZGMEUxMzY5M0VERDA2QjM1OUVGOEI3MUM5Q0Q5M0E1NURGRDlFOUZGQkRF
-NDMKQTg5OTJFNjFFODAzNzg2NTMxOEMyNjg1OEZENTc3MDk2NzMwMzM0QkY2NEQxNjBGQkFC
-NEI0QTVEMEUxMjZFMUY3NEY4NjZENUI4NERCCjNFRDAyODNDQzQ3MUVENzQyMEQ1QzcwMjk0
-MTcyNTZDMzlBM0RBQTYyODJBODdDNDJFQUY4NUVERUQ5MkQ5RDJDNjhCNzUwOEY5QjQwMQo2
-QzFDNTI1NzZGMjBBRUJGMTdENEZBQzVEMkMyNkMzMEU0RjBCMERDRjgyOTE0QTI5NEIwMUE3
-MTFBMDY3MDI5NDZBOTA4NzZBRkQ1MTEKRTREQThCMUUyREJENjI3N0Y0MkJDNzdENkU1MURD
-RjVGNjgyMjE0RDc3QkREQTM2NjMyRDcwMjRFMDVEMDFBODAzMzZDM0JCQTVEMUVFCjY2NjhD
-RTE2QUM4QkMxMUFDNTA3NTM3NjU5MEVDOTk4MThBQTc0OTU4QjgxODI0N0VENzMxM0IzRDA3
-RDBENUQ4QzMwMzQ4M0YwRjBCNwo1QjQ2MjQ2RjYyQUVFQzdEQzAwRENFMDdGNUM0NjU5QjE4
-QkYwRDE1NzczNjU3NTAyMjUyNEI3MTg4RjhCRjVCNUY0NjE1RTUwN0M5QzYKODYwNTU3MURG
-ODFBMDA3MTVCRjNENEY5QUI2QkM1Q0NGQ0MxMDQ5NkZEN0VBRTgwRDY1RkM5N0E5QTVBMUI4
-MkQ4NUJCREVFQ0ExRTk0CjBFRDM5QTQ5QzVDRDMyNjNGRjA1MTQ1NkNDNzg1NjYzNDM3RDU2
-REY2RkIxNTM5QzQ2QzM1MUZDMEZFRDRGNkMzQjUzRTFENjAxMEY5MQoyQjkyNURGNkUyQTI1
-QTdGREZFQjhCQjZGN0ZDMjgzOTQ2N0VCMTU2NjhCMjE5NURFMjA4M0IxN0NGQjlBNkIxODIy
-ODMzREI3QkUzQTIKREI2QTk3REVCNDg4MTNDMTNENEJCMkQyNTc0NTlGQTcxQTY3RDFDQTU2
-NzJGMDEyMTFFRjlBQkIwQzE2RjM3ODQxOEYyMEM3N0Y1Rjc2CjJGQTU2QjBGODREQTc5RUJE
-RjcyOENEQjcyMjc3Q0ZCNDQ5Mzg3OTlDRjMwN0U2QURGQThBQTU2NDUzMDcxNkQ1Q0E4Njc3
-Qzg3MTBFQwo4NDZDNkU4N0U2M0JDOTYyRDU5MTE3QjY2MUQxRUIyQjE2QjhFMTM0ODREQzFD
-N0U2REYyM0IyMUM2QUM0QzY5QkY2MUM0MUFDRjU5M0YKRDM2QTkxMTk5NjlGNTA3NUE1RDQy
-OEJEQjQ2NjIwQ0I5QjNCRDE2RUQ0OEUzRTc4QzhBOTAwRkNEOTc4REYyMEQxNkUyRjg5NUIx
-NDlBCjUzRkU3QUUxQTE0QjA5MDFCQTNBOUMyRkVBMDAyRkFFM0REMjVCQTBDMUMxOTE4RkNG
-MUM4NTc1MUM0Nzc4QjhENEZGNzFGRDQyNzVFRAo5QzNFNzExRkExMkQ1MDNCMEMwNTQ2OUFF
-MkYwRjgyRTlENkY3RTFDRjBBRDVCRTFCQTM5ODVDQjU4ODUyNEFFNzcxQUQ5NDJBNkMyQkQK
-OEJCRjA4RTlDNzdFQTRCREQ1NDgyMEJEOEEwRkNCMzVBNUM5M0MwRTFBM0JCNTA3RTAwM0RC
-NTk0MUI3OTUwOTQwQkJBMzIzRTQ1RkRCCjMyMjU4NUQ0NzkyQjVCRkE5N0JFRUMxMzhENENB
-NTZGQTMwMjJEM0FEOTlFMzBGODA1NTdEOUI1MzE3NDdFOUY0NDI5QkE5ODA5Q0IzMApEMjAw
-MDVCQzI0RTNBMzQ4ODE3ODUyNjQ2NEU4QTk1MEM3RDA0Qzc4NzIyNUZCNkRGNTFDM0EzODIy
-OUMzM0ZFNTI4NDhGNERERDk2NjUKN0I2MUZGOUUwNjkwRUE2QkI5NjNGODc5RDE3MEYyRUZE
-NTkyRDEyNzMxODkwQkFDOUFEMkZFQTQwN0IxNjFERjE5RUIzMEQ2QjgzM0MyCjdBQ0JDRTU1
-RkEwNTU2RTJGOTkxNTY0QzE1QUNBRTIzNjQ3QzU3QkYxODg1QzFGRDBBODBDMUE5RUYwNDRB
-RjFGNkM2QzIwQjNCQjVDMwowQjk0QzM4RjcxODY5NkMxMjdGM0QwQkJGRUI2NEY2RDJDREQ4
-MjYyMDY0MEQ3RTFBN0JDOTU0RDk3RDE5QjFCQUQ3QjZFQTg5NjVFNzcKRUY1NEI4MDYzMkI5
-Q0Q5RjhCQjYwMjhEQUVFNDBENTk2NTI5OTQwN0EwMUUwOUNDQTExQ0M4MzBCNjYxMzVGODBE
-NUNGRTZCQjRDQjNBCjZDOEZEQzMwOUVBQTk0MEIxNDAxQzI2OEM2MzVBRjcxNjdCOUNDQ0Yz
-RTdCRUJBODlGNzNCNzIxMDAwRjhCMEVDMTlCMEY1NzJBNUI2QgoyNjJDOEZEODYyREUxMEJG
-OTI4NTRGRTcwNUE1QzU5MTFBRDZEMDFFODNCOUYxNUEwQjdGNDExRkEzN0RGRDY0NjA4RDA2
-MTFGQTc1RkEKMzU1NzM3RjBBNUYxQTI3MzZEMDcxQUZCQTMxQTJBQzJGNDFGODc0OEE5QUMx
-RDYxQUE2NDNGRjEwREY5QzdGMDMxMEI4NjFGNzRCNTA0CkM1MzczOUJGNDU0QzBCRkFCMDc1
-NTJCODU4NzlEQkZFNENEMzY3QjNFOTZBREUwQzM2MDRBNEFDNDRCQTQ0MDA1NUQ1NzJGMDZF
-ODZFNAozNzVFODhBNDdEQ0UzOTFFRjhERTBDNzMwRDM0MEFBQTJCQjJBNDg2NTE3RDdBMzBG
-RUY4RTQ5QjcwMDk0Mjg0RkIyMDA3OUJFM0M4RDUKMDQ5RjBCNjMxQjc2RDJERjk4NjUyMDA2
-M0UwQkM2QUM5NERCQkNERUY3OUFDREZCMDIyQ0I1NzVDNTdBRjhGNEFDQTUyRkQwMEYwOEEy
-CkJFQkRERDVDN0NFNUYwMTIxRjI4NjFCOTVDNDE2RjgyQkUwNjc3OEQxNDI3NUQ0QTQ4NjY2
-NUE2MzlERTFCRTg3MURDN0UyRjhGMERGQQozNDBERUJFMDNGOUMzMzYyMkIwQkU2N0RDRDg4
-NzYwQ0YxNTczMjUyN0IyOTEyMEJBRkYwOURBQTA5REE0NUUzMkRFNkI4QTIzMzlEMzUKMEM5
-NERBQTQ3RDBDNzQ5QzI1MENFN0NCMjExQkIzOTBDNTIxNDA0RTY4RjhGRkYxMEQ4Q0MyRUMy
-OTNBMTMyMkEzQTZGM0UzODE4RDBCCjI0OEE5MEQzODYxMjA2MTMyOERFNzRBM0QyMkQwQkU0
-Njc5NzRCQjdEM0ZCOUExOTM3QUMwOEEwOTU1REUyNzg3NjIzNkFCM0ZCNzgwQwpDQ0NCQjA0
-MTlDODE5ODJERTY1QURDRUVFRjcyMzBDRDQ0MkM0QzRBOUMwOTNBQUUzNUEwMjc5N0ZEOTZB
-QzQ5Qzg2OTRGQzcyRDBDODgKMTQyMDExMkMyNkZERUJFRTdBMzA1QUMzNkQwNjU4RjAxRTFE
-OEU2ODU0NzlBQTg5MjRGM0ZFNTA4ODY0MkMwMjY1OENFNjk2ODk0REU2CjAwNENGODFDRjYy
-OUM5REJERDQzRUE0NERCQzc1ODkzNTgzOENFMDlCQjFGOTEyNTBERTIxRjNCMUFENTVGM0JE
-QzhFNkM5NTI3MURDQgo3ODExRUZGRUJFOUNGMzM4MjE3Njg2OUIzQTYxOEUzQjdCQkFBNzIx
-NThCNkFDNTc0OTExOEREQ0YwMzBBRjAwRTc0NjI0RjE3RDQyMkEKOTY5Q0VGQkYxMjdCQ0E5
-QTMxOThDMkJDQTBDOENDQTg2NkE4MDkxNzJFOTBFNDY0NzMzQzlBMjcwQjFDM0QyREZDQTdG
-RUM1OENENzUzCjlEMDc3QkQ3NDRCOTRDOTU1NDQ1M0JBOUQxQkY5RTZBQUE3MDA1ODQ2RkQ0
-QjU1Q0YxNUQ2MEMwNkMzRjI0NDU3NThGMjhCRDMzNUUyMwo1NTU2QjVDMDFBMzhBNzMwNjA3
-QzM1MTc2OThCNjNBRjY5MjQwNzRDRTQ5RjI5MERGNzNDRjQyOUU2REYyRkFFMzdBMkNCQzI2
-MjRGOUEKNkQwOTI3QzlENDUwQkRCODFDMzUyRkJFMUQzMTg3MUU3REREQkExMzU4NTMyRkUy
-NTMzNzFDOEQyRDhCRjhDNENBODYzNjc2RDE1RTU3CkM1MzIxMzY4RkU0RTcwNDI5MzdFQzU1
-MTM4QzRBOEMyN0E2RUEyNjJDRDBEOTFDMEQyQzY4NUMwQTA2NkMyMUVDMDIwOUUzOTFBNUUy
-RAo0OUUyQzQ4RkM1M0VFNEJCRUNGRjA0QTdGODc2NjY4MTgzN0E4NTIzOEVGNEI1QTk2OTJG
-Mjg4MzBDQzU5RDcwQjVGREEwM0Y0MkUwQUMKNThBOTU1RDE4RDM1OTYzMzNDODE2RjU5RDlF
-MTQ1MDk1QTgzNjE3MDIxQjQ3MDU3ODg1MDg2QTAzNDhCNTczNzY2Q0U4M0E4Mjc1QzIzCjZE
-MEZENjZGOTQ1QzM2NDhBMTU0QzIzQUZCQUFBNjZGQURBRjFGOEZFMTE5MjFFNDkxNzU1OEQw
-MDFGMjZGOTg0RUZBNzVBMzdGQ0RGRgpDRkUzOEJDM0E1ODdENDlGREQwMTI2NTNFQzk3OUU2
-NUI4QTUyRTQ2MTc3MkE2RjBDNTBDRDlFMTk0OEZCRkVFQjlGM0IyMTdCNEZGN0MKRTVGMkM4
-NkYwMTFCOENGRkEwMjc0OTlFNUUyREE5NkQyQzFDODNFNTE3QjVCNkVEMTkyNTI1OUU5N0ZD
-REJDQ0YxRDg0RDBBNjNCNEY4CjA2QjNFRUJFQ0JGNkIyNUM1MkY3OEI4MUFEOTQ4MTQyNjY5
-OTkwRTgwMDQ3QUREQTNDQjBCOTEyNUYxRkM5OUYxNDE1ODFFMEY5OEZGRQo5MTAwNkU4Mzg2
-NkFDRUU5QkQ0OEM1RDc5RDg0NzZCRkU2NzBFQTlBNjBCNDcxM0Q4RkVBOUExQTc1REJCQjND
-MzZDNjlFMkU5RUU1OTgKMzM0NThGQjk4N0RFNUUwMDczM0M5NTRENjEwREEzQzUwNEE2NzhE
-QkYyNDhFMDYxRkQ4M0RFNTA3RDQ0QkFEOTBEOEE0REQ1RDlEOTJECkIwQzYwQUUyQTcwNkY3
-RUY2RkE0RDE3RTFFRTFGNDdBRDVBMzk5RDVENTNEQkZCQzY1MTU0NEVFRDlFMzk2OTI3NDlF
-QzlEMDk2QjdDNQpFNDYxQjhBQUYwMzlGNjYzQjA5MkI0RDJFN0EzNkMxMkEzOUE0MTlDQTZG
-M0VGN0Y0RDFEMkFBMTM4N0I3MDEwMzBBRTk0RUQ4Mjg4QzMKQkJBM0Q0NTE0ODg2QkVDNDZC
-RDhBMjUyOTJBOTE5RTk4OTNFNzQ4NzUxMkRDREYzQjgyNjlGNkJBQ0I1QkIzOENDRjA4MDFD
-RUE4OTQ0CkYzODIwOUJCRUZFMTc4OUIzMDA2OTI4MDExOUM2N0NDOUJFMEY3N0IxOTM0MDQ2
-NkQyQTJCQTJDNEI3NUYzOEE0RjhBQUE4MzJGMzA2MwpEOTNDNTE0QjdFMUQyMkE2RDYzREE0
-Q0Q3QUVDNDZEQ0NGOThFNzg3QkU5MzI0MENCRjI4RTU2RUI3NTdCM0E4QUI2ODQ4NkVDMTUx
-MzQKMDg2ODBFMEM3NjVERDA2QzYzMzlFODdGODYzMzY1M0E3NTgxQzUyRkU4RDA3OTg2NjRG
-RUU2MTkxRjhDQjVDQkM5MjU4RTMwRkFCMjExCjZBNjM3Mzg5MEJCOTU4ODRERTRCQUVDRDU5
-MDIwM0VDNEQ4NDI4MDA3MTkzQzExMTMwNzBDMzlEQUNFNTg0RjE5MzYzQ0JCRjREQjRFQwpE
-ODcwQkE3ODAwOEIyQkEyRTVEMDEyNEQ2RUUyOEFGQ0FFMDA5N0E4Qzc4MzZERjVGNkIyQUNF
-ODgxOTA1QzU3NjVDNUQ3QzY4RkVEMDAKRDcxQTVDNzEzMzM1OTQ3NzEzRkRENDlFMTE3ODY2
-RjAyQzFBNDU4OEZDMTUxOEVGNkUxQ0Q5NDA2Q0ZBRDZCNUE5RENDNTA1MTRGNUJBCkYxQjUy
-NTlDOTNBOEQ5MTdFQTc2RTM1N0RFRjJCOEQyN0RFNDA4ODY5NTkyMjA4OThENTk3Njk1MjNB
-NzRBNzM5NTU4NDJDMEI0NDYzNAo3QzlBMUYzMzU0NTRBMjNDNzJGMDkyREEyQUM0MDRDREFE
-QTk5Mjg1MzAzOTM4ODA5ODg4MTBFRUY3M0Y4MDA4MDAxMUYxRTZDM0EyN0UKRTI4MDREQTVD
-QjNFMUREMENFQTRENUI0ODRGNjMxRjYzNDc0QkQ5RUZCMjc3QzEyQTFGOTJBMDcxQTUyQzVF
-OTg2RTg3RUU2OUE1NjdCCjQ0RTZFMTI4OEUwM0Q5MDIzQkE3QTIyMjIxNjhENUZBQjhENDcy
-MTFGN0M1MkVFMTBDNURFQUJBQzk4RkQxOTJCNjA5MDczRjQyMjVGQgpEMDM1QUVGREM0QzlD
-NkEwNDJCRDBBNkQxM0FGMjQxMTE3RTlGMjBFOEU3Q0IyQzA2ODUyOEQyMUQwRjg5RTM0MkI4
-OTJBNEE3MkZCMTgKMTk1RDcxNkFEMDI1NzFFMjEzMzczQzYwOEUxMzAzOEQzRkI0NzRDMDYz
-MDk5OTMzOEQ2NUM2MzdGRUNDQzVGMUFGNEVENUY5MTkwODk0CjU4NTk4OUM2OTBBODNDNjNB
-MEVFMDdBQkNGMjIxNTA1NUVENjY1RDU0MjMxMTEyMThGQjkyNEMwQkNDQUU3QkUzRDYzNEM5
-NTEwRDExOApFODdCOEFCM0I3RDkyQjgwNDRGRjE1QjdBMEM4RTFERDhBOTUwRDk0OTU4Q0Qy
-MDgyRTgxMDFBQkE3NDQ3QjAzOENGMzlEMzA5OUE5NTIKN0U3NkIzQ0QxQTU3MzZGNzZCNDRG
-QjE2REU3ODYwNjNDQTUzRDdGNzJDMTczMjZEQTVCMjU3RDczQjZEQjgyRUQyMjRGQkY4Q0Q4
-QUE3CjQyQjJFQTUxMjYwNzJBQjcwNkVENkYwMDhERDdCNTlBMjc0NDEyQkNGNkRBMjhGOUEz
-OTA5RkJGREFFQ0UzRjhCQzMwMkE5NEE2RTM3NgpCREZGOThFMkI5RTVDNDc2QzAxRkNFOTBB
-NEU5MjE3NkVDODhGREUyQTA5MTgwRTBFMUEyMUY1OTc0MTI0ODBCRjE5RjREMDJDRkM4N0QK
-OTUzNDNCREIxNkYxREExNUJBREZBRTk0MUEzMzFDREFERjQyRDU5MUYwQ0I1OUYxMTdEQjJB
-MUJCMjJEN0MyOTk5MzZDQjZERjM3QzQ3CkIzN0Q0NTcwQzUxMjE0MjgwMUU4MTBCRjgyOTc4
-Q0NGQkEzNTc2MUM2NEZCMjM2RDdDQkEzNzU1QUJEQjJGRjVGOTRDRkQ3NEZGMkM1OApFM0I5
-RUIwMkNCREM4RUIzRDFDRjI1RDE0NjBDM0Q4QUMxRkFCNTI0MTBGQkJCQzMyM0QyQzFBOTlC
-NTQ5MDZFN0FEQ0QzMzc0OUYzNDcKNTFCOUNBQ0M5NzI2OUFEN0E4NzlDNjQ2NDg5QTE3OTQ2
-NTdCQTQxMjdGOTRDRjhFMjY2Mjg5OTc5Q0RFN0EzMjI3NzQyRjFGNDk2N0YyCjVBNDlFQkFC
-NUUwQjNGRjRENzhENTU4REM4NkI0NDY1NTNBRkZGNzVCNzU1OTAxNTdFRjRFNEI2NzBENEQ1
-NTA4RUQ3OTBFMzk4ODRCOAo5QTA4ODFDQUYzMjREODQ3NzJCNTNBRTQwODBBQzUyREVFMjlD
-ODUwNkZFNkYzQUZEQzlBREM3RDE3NzVEQzU5QzgzRDA5RDlBRUREOUYKQkM4NDk1NDVEODBC
-MTFGRDE1QTRGREYyQUNCQzQ5NEVFMDAyNTlBQzM3RkU0OTdDNkYzNUE0RUY1MUIyNUM2N0M1
-MjEyQUU1MDQzMEVECjhENkJCNzNGQzg5RTM0RjJFNzYwMjk2MDQ3QUZBQjlCRkU4OUJEMkZB
-QjQ3RTc2MzlGMDRERUJCOTIyMDg1NzhFNkJBMDI1RjE4MDQxMQoxQUU3OTg1OTY2QTVEMkFB
-NzA4NDY0MEZEN0M3Rjk2NTc4MzIxRDc0RTlCNTA4OTAzRTZENUQzQzE2Q0QzRkM5Nzg4RkY0
-ODdCMzE2MzIKNUZFMDQ0QTI2MkNCMTRENEI5NzI1MEE5MzUxMjRGODAyNEQxMzQwRjU4RTZG
-RDZEN0IwNDExRTNBRDE5RTYyNTIyOTA2QkJEQzk0MjhGCkUzMUYwMEUxQTBDRDk2REJFOTNG
-MUVFNzMxMTlBRkU3QzcxRjA1OUE5MEQ5RERCQUZFMDBBNDE3M0UxRkNGNzRCQTk3RkFFMjhF
-QzhFMgo0NUI5NzJBRjEwNkQxRkMwRUQzNTc0RDFDNzEzRTBFOTU1QzQ5MTc3NDVERTE2M0Ux
-MkIzNDVCMDBBODMyRjdGN0I3MENGQ0VCNzZGMUEKODhDMENGMDUwRUM1RDJDOTMzMUJBMEQ4
-NEI5QkI5RDBBQ0U4NUYwMjE1NTNEREIwRUYzNDg1QjA1NjQyMTU4NzI0MTg0NERENjQ2MjNE
-CjMwQzdFQTkxQjU2ODVFNjFENkQ3MTNEMDg2N0Q4RkY5MDRFMjU0RDg5QjNBNkY2RTQ0MjM5
-RThBRkIyMTBDMkE1RDc0MUUwOTc2QkFDNgo1RjA3Q0ZGNjExMTUzRTJERDgzNzBENEU5MjQ0
-NTlGNTcxQ0M5RDhCOUM0QkE1NkMwQkY2QkMxRjZEMjBBQTA0MkNEQjBFREQ2MTcxNDgKMjJB
-N0E1N0YzQjcwMzBBOUQwNTVBOEI2RDVDRUM4RTgzRjQ3MUQ2OTIyNzhFQUExMzhGQzM3MUFE
-OThENzcyRDIxMEIwRjg3NDc5OUNDCjlEN0YyOUMyMzQ5ODk3QjdDNzczNTNEODZDRTREMTdG
-OTcwNTMxQTU3RkRCN0U3NjQyNzAyRDg1M0FCOERBNUY1ODA2OTAyNjJBQzAxOQpCQzI2NzJB
-NTIzOEZFNDNCRDJGRUZGMkQyMzM4RDcxMDI4RUExREExMEE5ODdFNjEwRjBDNTI3RDZDNUU3
-RDA5NjBBQUY1RDhBNzdGRTkKODhCMUMzMEM2QUU0MUEwNzNERTdERTIwNTNCOTkwMzEyMTRB
-M0M2OUU2NjMwMUIyQjJDMTI3NzBDMDcwRjgwREM5ODZGMjU1RDNDNzY2CjdDNEFDMEM4NUZG
-NjUzMTkzQ0U2MzY5QzhBQTgxNDNCOTlBRjhDMjFGNThFMDhBNzdDQjU3NTM2OUU0NTVFQjA5
-NEY0RDE4MEM2NDVDMgowMzY4NDc3MTI5Q0FFNDhDMzZGNDM5NkU4MkUxODkwMzMxM0FEMEYz
-OUU2NjY0NzlFODhDN0NBNEY5OTA4OTEyMDEzNURCQ0NFMDQ3RjEKOTdGRUE5MkMxMThBMEMz
-RjkzNkU0RDEyQ0Y0NjlGRjJDMTU0NkM2NTU5RUNERTZCQzlFRDk3MUNFMkFDRUVFNkI0NTQx
-Qjk3REI0OEMxCjQ5MTY4OUUwQ0Q4ODNGMjIxQjU4RjJFM0MxMzMzNjE3NkExRDJGRDMxNTI0
-RTRFNTZENURFMDE1MjdFQTNCRjU5NkE5RUM0MTYzREM5RQpFMzAwRDZEOEZCMkE4MDZBMjU2
-OEZDRjE5MDkwM0Q1RkYwODQ0MkMxOTE5ODBBQkNFMzAxNzhCQkI3QTBENTFEQzJGMzk4NTBE
-MkNFNTEKOEY1REFDMTA1NUNEOTNFQjFFNjdBQjI2MjQ2MDY0NkEyMzVBMTRCNkEyRTJEQzFG
-REY5MDc5ODc3RDkwRjE5OTdBMDFEN0VDRTFFMEFDCjNDNjk5NzlDN0E5MkQzMThGNkI5MzA1
-MUNCNTVGMTk5MkEwQTczN0EzNTIwQzU1M0FFQUJBREMxN0ZGNTYwM0YyMzcxMkUzMTk4NUU0
-MAoxNjdFQjMzOEY5Rjk2NDQ0QjkwODcyM0M1RDkwNkI2NzU1NkIwREMwODhFODA4QTIzOTc1
-NzMwNDY3M0RCODYzNEU1QjA0OUEyNUJBODYKMjQ5MUVCNjVFQjJGRDFBQzE3OTNCQzk0RTgw
-NkIyMkYwNjAzMTkwMkJCMzdGNzVCMTZFMTJGQzI4NTkzRTE3MUY0NUU4QjVDMDc2MzcwCkVC
-MjUyMjc5MTAzOEM4NjQzNTRDNDk1RkE2NzY0MEZBRTYyOTZDOTUzQTAwNEI2OEJBRkRBRDYx
-RjlDMDk1NzY4RTQ0OTZCMzEyMEVCNwo3MThEQ0ZFQ0QzQjZENkQ1MDZGMzI1NjFFNDM1RkYy
-QUQ4M0ZEQ0JCNkNERUEwNjY5RjAzNDVGNjUxNzEyRkUwMDBEODA5NTIxNTFDQTgKQ0JFNTc0
-QjU4MjhGQTdEMjU5OUE4MkJENkI0NThCNEY0NjJBNkMwOUYxRDdGMzM1QUM0RDg5MTlERkM4
-RDJCRTczMjg0NjkxQTc4RjgzCjYwNUUwRTE4MTgwMzBEQzY2NkQ0NThFMTY4RjM4OUY5REM1
-MUE3MUYyMzJDNEJCM0YxQ0VEQUMxN0U5QTc1MUQyQTQ5NkE0OUJFOTRBOQpEODA2NjU2Q0ZE
-NjIwODQyRkI3NkJERUUzOTU3NjEzNkQ3RDNCMkREOEIxRDJGRjlBNkEyODhFREI0MTI4Qzcx
-RkYwQThCRTJEMTQwRTcKQjJERTg5M0JEM0YxODc4NjMxNDAxRDEzMTU2RDY5OTJGQThERjI4
-Nzk3OEE4QUY1MDUyQTMzRTdGQzY4RUI5RDI0ODdENDdCMEFBNDNFCkIyNTYyNTk1M0ZFRDZG
-NEFBNjQxNjA0MzY3RTMwRTk0QkI2NkNDNEVCM0VBMjQ5N0RGRTdDQzA4NzRDQjAzMUEwNjM1
-QUFCMkFDQjUwNApFNzBGRDlEOUMxRjFENjM0RDA0MTQyNTY4OERDNkQ0NjY5RTlBQ0M1MTRB
-MDhCRUM5OUE3RjU5MjhFOTg5NDNDRUM5OTY4QTA5QkY3NTcKMzhBQjQyRjUwMzA4NDA3Qjk1
-REU0QUQ2OUVDOUVDNTJEMUU5QzU4OUY4QjUyQjUyMDkxQUUzODcyODEyQ0Q1NUY2MzNERjY3
-MjA5QTI1CjlGRkFCMDU2OTZCMzQwOTZFRTc5QUVGNjRCNTlCNTg5RTJCQjQ5RTI5MDhGQkEz
-MDkxNjdEQjY2RjdGNUQ0N0MzODczRTdCRDIxM0IxQgo0OEU5NjYxNDVENDBERkMwNTQxRkU0
-RjNDMzgyQThFMTVBRTgzN0RENEM3QjkyQzUzRTcyODVEQjFGRTMyRjYwNUI4OUFCNzFEQUQy
-MjkKRDQ5MjE1MzREQUIxNTFFNEFGMzI4NDBGMzNCOUM3RjM4NjZFQ0NCNkI1M0QyMzI5MzRD
-RkQ5NEM4QzU5QkE4N0Q2MkJEQTg1OTQ3MkQyCkIzQ0YyODNFOTQ3ODNCMUQzQkJEMUIzNUFB
-OUMxMDk3NDAxMUJBODU3QTg3NzI0NjJGMUIyQUU4MTMwRTEyNjNCRkNFNDE0ODlGNTUzMgoz
-Q0YyMDdGQzZGOEIyOTlBRjU1RTY3NjJDQTkxODM3NEZFQ0NBNkI1QjU1RjI3MzJGRDkwOEQy
-NUFBQzNFNzAzQTA1QzBENkE3MDI4OUUKRUQ1MzI5NjI4RTk2ODk4OUFCM0ZFNjM0RjQ3MUVE
-RUNBQzhGNzA1NjY4NUI2MURDRUM0NDc3MjA4OTQ4MkFGQTNDRjk2MjA0RTA0NDBBCjA0RTU3
-MEMxMDVGMUE3OUY1OTJBQzQwRjU1NTlGQTBEMjkxNzhGNDI0QzBBMDUxQjkyRTQ2ODRCNkU5
-MERFNDYyMDgzRjMzQTdBMDhCNAo2M0UxMkJGRTk4QjJEQzYwMjFGQTYxMTQwRUIyNTdGQkQ2
-NkYwODVBQUFENEM2RkIwQzA4OUIxRkVGOTFGQTgyMEI3QTJEQ0RBNjE0N0YKQUE4NUM2Mjc5
-OTkyNzQxRUNBQTYxRUI2OTEzRjQzN0NEMEU5RDk0QjU0MzE5QzEyQkE2RUI3MUQ4NzkxRDA0
-RDQwREQzODY1NThGRjlFCkRFMzg4M0MzMjQ1MjhFRjNGNDI4RDAxQTE3NUI3REVEM0E0OEQx
-ODQ0MjBEQjI5RTM1MkQwMjVGRUY4MDRFMTYzOTZGMTg2RkI2ODc3NQo1RjZDOTI3N0EwNTU1
-QjFENEZBQkFCMDJBNkQ0MEFGODhCQjVDOUQ4MkMzMkU1NzdDQUQyMDU0RkRGNjRBREFDNzgy
-RkJEMzE1OTNBNkEKNjVEQTAyRkJEMUFCRDc0MkM3M0I3NjM0RkU5MERDQzY4OTQ4OTc4MEEy
-OTdCMjlCQjNDMTc1QjM0NDhEMzMxQjczRjMwNzc1MUNFRjk2CkJCNkMwQzQ4NDAzQjFBMEM3
-OTc3QUQ3ODM5MTExNDg2RUZDNTBBRTJGQTI4NjY2QTBBRDY1N0Y2ODYwMTg0NjQwMDE4MTFE
-RjU5NkY4QwpFNEFEQjI2QjJGNzE3QTJDNTIwQUEwMzNBMTg0MDQ4QUJEOEM5REI1RDBENTE4
-QjAwQUVGRUMyRTZFMDUwN0ZDQUMyRDVEMDlBRDk0MUMKOEIwNEQ2MTIzM0M0OTc3MDY0MEJF
-RjdDRTBCMUUxNDI0RjE5MTY4MEEwRkM0RTkzQjVDRTk5QTQwNkUyNjJEMzI1RTk1MkQzRjk2
-RUU1CkE2N0UyMkM2ODYxNzA3MjZBODZCNkM1QzcyRjhBODUxMUFBNkY5MkJENTdDOUE3NTI0
-Q0U0N0RCMTIwQUU1MDZFNTc3MTA2REFDRTgzQwo1MjU5NTEyNzEzM0QzMTAzOTc2NDZFM0U3
-NUEzQjlEM0IyRjQ5QzJFN0RCNkIwQjBCRTdGMDM5MkI4OTdCRENBMjg0NjFBMjcyRUQyQUYK
-RTU1NEEzNzVDREI1ODY0OUMwN0U2RkI5RUQ3RUU1NzFGQTQxQjhCMEE3QTZFRTAyNjY3NDQ5
-RUQ4QzA3OUI2ODg0MzhCQjBGQUYyMTY5CjQwQUE2NjhDNzc3MUQ4NEQ0RkFCRTY3QTg5MzA0
-OEMzRUVEOTAxODJDQzIzNkNFQjNBMkVGOTYwQTkyRUZDMjgyOTY0RUZENDAwRURENApERTdC
-ODZERjhEMThFODEwMERBOTQwOUNFMzFGRTZCNzM2MEQ5MjM4REFENzU5MEZCREUyRTY2ODZD
-QUE2MjBFNUI1Nzg1OTZFODEwRTYKQUUxMENBNzM0QUVFNjVGQUNFQzM4MjcwRjcyQTQ4NEM2
-Mzg2RjM3QkM5MTIyRDAzNkI1MzE2ODJCMTZDQ0U4NEMyMDM4QTU4MzI0ODI2CkQ1RkU5MTJF
-RjRBMTdCNTkwNzVDOEZDQjJDOTQ5OTAyQ0JDM0Q5NDhCMUY4RUYzRUEzMUY2Q0UwRTQzNTJG
-M0Q2NDNERjY1MTE2OTc5RgpGQjlDNkJDNDAzQ0YxMjNBRkQxMzM2NDk0N0Q5QzFCOTVFQ0Ey
-MThCMTdGOEM1MTUxMDhCOTUyN0U0MzkwQkNFM0E5QUMyQzIxMDA3MDcKNkU5N0E0NTMxN0I1
-QjU2RkIxQzU4Mjk4NUM4NTNBNEMwQzg4RkUzMUJDMzJFNDk3REU3M0M1N0ZCRUZCRTkxRTU0
-OUMzQkExOTQ4NkIxCjYwQjVBNUMzRTA1MzAwRTU1M0U4MDM2QzREODMxRjRBNjVBRTlENDg5
-QkUwN0VFNEJGRENCMzU0MzAxNUMxNzNBNDE2QjE2OTYwOTNFMgpEQ0FGOTQxMEY0QTJEQTA1
-NzE2MkIwMTkzRDNDMDNGNjAwMTA2Rjc2N0UyNDUxOTFDQUZCREJEQTA0OENGRTgzQzQ0MUUz
-REQyMjNFQkEKMDg2M0JDQUI2QTlCQjY0MzY1Q0VGMTlDRDhFQjFGMzI4QjE3RTJBMzUzNjQw
-N0RCMTg5Q0I1RDRDOEZGQUI5Q0JBQzA3N0Y0MDQxRUI5CkE3M0FFQ0ZFMTY2ODkxNTcwQzA3
-NDdFOTRFNEVCRkY0OTE0RjFCOTg2MzY0ODE3MjMxNDcxQUVBNEQyMTM2RkUxNkE4M0JEN0NB
-RTkxQgo3MjE0OTlGNDBGN0Q3QUE2MUZGNzg2NEZEQzUxNENFOTFFQzg2MDhBMTM1RDhEQUI1
-QjBGQzk2RjcyMzYyOTk0RTVFMjBFMzI4RUJBOEUKNThGMERCODgzNUZDRDM0QzE3NTdCOTlB
-OTgyMDJBRjQ2REUwODc2MUMzNjdCMkM4RkZBRDMwNjNDRTJGMTQxOURGOEUwMUNFMkFBOEND
-CkM3MTQ4QkE3NEFGQzQ3OTc0NjQxOUNBRjIwRTRFMTk1QUI4QkE2OTUwQzI0REYwQkE3MzIx
-OTJGRDYxQjJDRkI4QTY1QkI5QjgzQTlGRQo5Q0FDNjdGRjExQjU3QUVCOEFBMUNGMjlGMDVE
-M0E4RDVFRUNEMTU2RDY0MjNBRENCRTM0QzJCRTlFNkU3RDZCNUY3NTUxNzYzQzVEQkYKQUZC
-RDAyMDIxMzEwQjVFMzY5OTQzNkY4NkY0NDlBMUI4QTlDOUU4OUMzOUY1NDFGRUFBM0VGMDQ1
-RTJFNTA4ODM4ODYxOERGQ0Y1MkE1Cjc5MjFGODhENkMyRDJEQzJDNTAyNzRCNDZFQTY5MDBE
-Mjk1NzIwQ0NBM0IyM0RDNTVFMEIwM0MzMEE3NENCOUM4Rjc3RTk1QTNCRUFEOAo4Q0Q4MEI5
-MTE4Q0YwRTI5NUNGMDJBRDBDQkQ0ODRBQzM1QzgwNDczNUE1NDBFMTczRDQ5NTVEMDMzRUJG
-MjhFRjYyNTQwMzUwNTE5OUIKRjFCODJGMzU2NDhCNzAzNDU1NTBCQUMwNkYwMTY5NkM0Qjgx
-QzI3QkFFRkE1RTdBNkEwQUNCRUVGMUQ2RjgzQjA3MDc3ODdEOEU5OEZBCkRCRjY3Qjc1QUQy
-NjUzOEQ3RUVGQUFDNTdERUM1MDcxNThERTNFQTM5RDNDODhEM0FDOUU3M0FFOTg4QjE3OTBD
-MzQzRTQ5RUJGMDA3MApDMzI0NUZBNEJFMTQ4MEREOUUwNDEwODdGODdBRDA1MjA3OTFEOUJC
-MjBBQTc4RkVFRURGMDc3MkUxNzQ5RjVGRDRGMEZENDYyNjVCNzMKODE1Q0NEQTE5MTczMUY3
-RTk3M0VCNjk4RDNGRkVBQkI4Mzk1NkVDNTVENkE3NTE3NjQzOTA2MjI0RUE1Qzg5NjJEQjY5
-RUIwRUJCRDM4CjY2QkM4RjQ5NTFGOUM2Q0MwQzE1NkY1MTREQzZDQzkxRjRFMEFEOUFGREE0
-Q0UzRDRBNjdFMUQwOUQyOUQ5QjdBRTM4NkNFMjQyOEFBRQo2MjU1QUM2MTZGOTY4MURBQjA2
-RUNFNzIyODJCMDgwNkQ4Mjk0N0MyQTY4MEU4QTNCNTZCMDUzOEEzOUFCNEM1NUI5REIzMjk2
-OTcyMzQKRkVEMUZGNDI5OEREQkI3NThGNUI3OTk3OTEwOUE4QTM3Q0U0OTUyNTEzMTFCRkZC
-RTlFMDY2MEI4MEM0MUY5QTYxQ0Y5OTRGM0VEQTM2CkRCRDY3QTFFNDRGQTlDNzc4QTM0RTVD
-OTc0RTgyMDg3OTU4QjIzODE3Q0Y1OTQ3MThGRkZGMzQyM0RCMUZFNUU3QUNENEM0OTIyNDAy
-RQoyMTc4NTMxQkQwNTc0MDYxMzRFOEY2NUNCMDg4QzNCOUQ0MERDRUE1QkU5QUFGNUNDOEUx
-ODE4MjI2ODUyNDQyQTdGOUU1OTM2ODhGMTgKMUNBNjY1MUQxMDczQzQwMkVGREI0OEYwQTE3
-N0U2NTRCOUNERjE4QjNFQjAxQjhCNzBFQjM2OEZBMjUyMDZEREE0QUFENDEzMTUwM0VECjcy
-RjZFRjE2NDcxMDE4MDVBMDYyMTQwRjA4Qjc0Nzk0Q0VBNzI4MDg3RDUzMkE1Qzk2Qjg5NjYw
-RTY2NDAyNEQxRjBGQ0Y5NjQ0NzI2MQozMjczMzU4MEQ5RUFDOTA0NjZBQ0FBNDdGMEJBNTEx
-M0I5RTQ2MkM2NkY3QjE3REQ0NkY2RUU0RTFDQzQ0NkVGOTI4N0E5NDdGRUE3QzMKMEY0NzA5
-QTcyQzg4RTdDOUJFQUE1N0ZBRDJBN0ZENTNFRURDRDkyOUQ3MDEzODAzRjQ4MUY5ODI3MzdB
-NkNDMTg3OUU1RDMwODBFRjhBCjRCNjc1OUU3NUE1NjQ0M0Q0OUE4RjJDQTJDQzU1RDFGQjJE
-QUQ1NkQ1QjVBMEQ3QzNDN0QwQTMxQkZDN0JCMzc3RkI1MkRDRTJDOEU5OQpDRDM5MzhEQTM3
-MTc3QURFN0YwNjlFOTJBNkRGODc2NzM3N0YzMDIxMzY3N0VGMUMyMEIwMEE0RjVEREY4RTEy
-MTIxQUE0ODE3MUY3RTgKREVDMDNEQkVEMUM2NTA2Nzc4NEE3OUYwMzg5QzE3MzlFNjMzQkE5
-RDI4RUUyQ0E3OTIzMTQ0NzAyNTVCRTcyNDhENDBFMzU4N0MwQTBCCkI2REIyNzdBNDFCRTk1
-QUU2MzkwMjczRThBMEIwN0ZCMTNFNUI1MzBFMjcyMjdGNDhEMTI5OEI0MEFEREUyRTcwMzVG
-OTREMTBBMkE1MApBQTNBM0NFRUQ2N0FFMDBCRUVBQjJEMTYzMzk2RjNEQThGNjg4MjhGQUI5
-RDVFOTYxNUJEMEEzMDJBRkU5Nzc1RTY4NEJDOTcxMjFEODAKQUQzQjQyQzE4QzM3RkIxREFE
-NTkwM0I5N0U4OTIxNjBDNzQ2NDgxM0Q4OTE4NTZFMDhFMUFDRDI3QTQwNzYwQjc2MjdBNDlG
-NThGN0VFCjhCM0QzNjYwQzNEQjY3NkI2QjlCNzFERjI5Njg3NTBCOUYxQTgwREQ2MkVFM0JE
-MzJDM0I0N0RDQzZDMTQwRTVGMTFCMjdGNjBGNzkyNwpGMTg0MEU5QzZFQURCMkQ2RDc3QTFD
-NERFQjBGQThGODkyQjQ0RUE5MUFBNDA5NEM5MDgyNTBCNkY0RjZBRjJDRDU0QUQ1MDIzODRD
-OUMKQUExMTlENEQwNkRBNTUzQjAzRkI4NUFGQjQwMEY3OEFDOTJEODc4OERBQTU1QjFDMzE5
-NDQ1NTZENUFDRjNBRTZCNEM1ODA2NkU1Q0M4CkQ2MThBOEE0OUI5ODRGNzAzQzc5Nzc1NTE0
-NUVCQzg2NjJBRURGODMxMzUyMkRDNjhDNkYxNEMwNTM3MDhGQTREREJBNjg5QzQzQzc3RAow
-NTA1NkQ4RTU1RTRBRkZFMTg5NkUwQTZDMjZGRjAxM0VEMzRFOUZGNjJBRDhDNzM3OUY2MTg4
-Q0QxRUM4QUUwRUY5OEZFQTA5MDhBQkQKMkJCNzIxMTlFQjRENEM3NDcxNTIwNDdFMjZBRDRC
-MTRERjc1RjA5QUFBNjE1N0JGRjBGQjhBQTIyMEQ5NkYyMzY3MjgwRkYyQkIxN0MzCkE5QTcz
-ODQyOEJGQzIzMTg3NTdBNzBFODBFNkZFODU3MDc4Nzk2OUM4QUVFQUM0MkE3NTY3N0ZEREU5
-OTU0NzY5ODZFOUVDMjZEMTdGNwpGQjVGM0FDQkQ1MzVGREQxMzg1M0RCM0JBQUQzRjJFMjQz
-NzBBNEU4ODM3QjNFQjQ4M0MzOTU5NDU3MjJCMzVERkQ3RTJGREI0NkYyRUQKNDQ5MDlDNURF
-REE3MzJDMjAzOUVENjA5ODkyNjQ3Mzk2OTAzMjBFMDM0QjIzRUNFRjU4MjhCQjk2RjhGMkJB
-NDM5N0M3QjY4QjdGNzJGCkY4Mjg1MTE4NEZCRDJDNEMzOTJGM0I1QzU5RTVCNEVERDgzMzUz
-Q0I0N0ZDRDQzMkFEN0FGQzNDN0UyNkI1NTkyOEYwMDY0OTkzREJGRAo5RkE3RTg5RDY2NUM3
-QTA0MUMxOEUxMzA0RDVERTYxODAxQTBEQ0Y0NEQ3RTMxNzk1NEFCQTZDOTQzNjU2NjEzNDcw
-MzBDQ0ZDREZFNjcKMTlFNjcyMjE0NUYyQ0Q4RTFEOTJBRTFENzhDNjBFMzAxRUVCRjk0QjYz
-MTAzMkUwNDUyMjA2QjFGNDc4QjMzNjNCN0I2ODNFRUFGODIxCjNCODE1NkQ5NUVBODhDRDY1
-RTY4NDRBRkFFOUJGNTlGNjE2NDlBRkU1NDBBOUZERTY5MEZENUY1QzMyOEUzMDJDOUVCNDM0
-NTZBRkMxMAo3RTMyOTZBRUY4MTMwM0ZDQjlDRjE4NkE2Qzk2RkRCNzUxM0QyRjZGODRCRTNF
-RTE5NUZFMThGRUE2RjJFREMwNEM0NEYyNjZEODIyMEMKQzIwMUE1Qzg0QjlBODFDMjQzN0I4
-RDJFODVFQjc5OTJGOUZFRTk1NUZCMzE2RUE2QkQ0MEU3MjkyRjY3MzNCOUM1NjFCRjQ2N0ZE
-RjUyCkI3QzU0RDNCMDVENkQ0MDRGMzM0ODc0OEUzRDBGQTQyRTVCQTdCQzI4MTExMzlBNzE2
-MjE4MUI1QjEzRTk5MjE3MDFDNjBCMEZFM0YwOAo5RUZEMzlCRUYxOUU0QzgyMTZFQzU1NjIy
-NTMzN0NCNTA3MDE2MTJDODZFQTFFMEI4NUI5NDQ3RDMwQTg1MEQ5QUYzNUUwMzlBMTE3N0YK
-RTQ0MDIzRjM0NURFREVBREE2OTNFRjBGREMyNjQ2ODQxMUFCQUM1RURENDNEOUI4MUI0MkY2
-RTREQUMzNUY0QzY4QjI1MDk2MDA0MDI1Cjg3RjRBRDQ1ODI5NDcyMEVBMDAzOEQ3NTA5MkQ0
-NDk5ODA1ODRGRTcxMzZFMjJGOUMxNzA0NzdDQ0I5N0U1NDNDQjk5N0Y4NDMzMUEwRQo1QUI1
-MDUxQjcxNDNFODZFODBEMTNGMTYzRkU5RDBCOTBFRTlDNjYwNEI3MTM5NzIxMDMwMEExQTA5
-OEU3MEEyN0M1OTE5NDFBMjA0NjMKQzI0MkYyMDg3Mzk2OTU0QkY5MTkzRTYzNDk5OEFBRDRF
-RjYyQzRFQ0E2QTVBNkI0RkE3NTVFOTY4MEY0MjdEODZBMDZCRkU1OEFDNTE1CkFCRjc1QUMw
-RDhGMjg0M0IzOTY5OTg1MDQwMkQ4NEVBNjIzMUQ2OUE5Rjc0RjdEQkIxMzExMzU4QUI2RUFG
-OUI5NjVGMjEzNTI1N0YyNgpBMzI4NDgyRTQ3OTIyRjIzMzY0RkVDNjdEQjEyM0IwNzMyQkJB
-QUFBNEY4OEI2NkQwOEQ2QUIyM0NDOUIxMjNBRThCNjUyMzc4NzQxQzkKNURFQUFCOEM1NTM4
-NTc4ODNDMzc4OTBBQ0RBMDdEQTY5OTZCM0JCMTFFOEFBQTU2RjdDMEJGOTg5NkNFMjA3OTI4
-QkE4NDc4Rjk5RUQyCkZGNzI5OTY5NTA0REM1OTAxMjY1MTg0QzU2MDZFRTE3N0ZCNUFERUFD
-QzdCMDIzODhENEU5NjBGMEVDNjc0NzI2NDEwRDA5OUI0OTBGQwo2Qjg1MUNGOTA4NUQ4QkQ3
-MzZGODJFNzZERjZERkZGRUY3OTIyMUQwMDM3MEM2RUVEOUMyM0VGRUQ0RkUzQUI4NUQwQTUy
-QjMyQjBDM0IKM0ZENTk4N0EzOUIyQkYyQzg5REY4NjdFMDdBM0M3NjdBMjVGNTI3OTEzNkUx
-RjJFMEI4NjM2RjlFQ0E2MUYwMzc4OUQyQURGM0M5NzM5CjVGQkE5MTVEQTA2OEI5NkFGOEM4
-RjEyRjFENUU1MDlCODczNTc0QUNEMzRGMjU5M0VDMzA5Q0FEMTQ1MkJEQ0JDQzNDMzBGQUE3
-RDAyMwpGNDRGNzQyRUQ2N0NERUQxOTFCOEM2RkQyNkZDODVFOTI2M0QxNzRCOURFOTgyMjAw
-RTk0QTZFNEY2M0ZCMEVENDM5OEQ0QTM5MDZENzAKNzk2QTI5NjQ5RjcwRDc3QThENjNCMTk3
-MEQ2MDlCQzg0QjkzQjFFNDU4M0ZCNUQxODQ5QzQ2RDZDMDBCOTY0M0VENjM1NjI2QTM3MDg4
-CjM2MTg0RUYwRkI2RDBERTVENTM3Q0QzOThGOUE5MzYxQkIzM0REQzE3NEUyRjlDNEM2RDhF
-MDU2NDhGMkRFOTZGQTcxM0Q4NTAyNjc4RApENjRGQjlCNTU5N0Y3ODc3OEEyMkQxNzQ3RUY1
-QjQwOTEzMzkwRUQ4RDI3MDRBODMzNjJBRUVGRDkwQUIzOTM5NjI3MzgyNkJFRDI3RDkKOEZG
-NkI0QUY5NzAwRDNBQzU2ODhCQzQzMjdDOEVCNjk3M0I4NTIxOEMwRDAwMDIwQjU5QjU3REUx
-NzM1QTI4MTUzNzI2NDY2MjUwNzZGCjUyNzhFODI3MTc5RDA4MzcyQjlCQTY3OUVEOTJGM0ZE
-NTVDRkY4QjY5RUJERjdGODA5MzcwMzM4NEU0OEQ5NzRBQTY0QzVDRjg4QzFEQgoxMDNDQURF
-MDUyRTgwNjA1RTcwRjZFQ0IzMkM0NjM5Q0E0MTM3NDRDQTk1RTI5Rjc2REU0ODBGOTg4Q0Yy
-QjUyQzFEQjc4MDU5M0MzMTAKN0E0RThDNzkxNERBRkM4MkI5OEY4NTM5ODFGQkI4OTZERjkw
-OUJBQkM5Q0MxQTFDMDA4QzNFQ0ZGRERENjU2RDQ4MUQ3REZFREM0MkZECkM3MTkwNUYxNUY2
-NjVGODAwQUFFQzY3QzAzNDAzQTE1M0Q0NkIzMDVBNDVBMUUwNUFGRTQwQkYzOTREM0M4QTA3
-MUNENUVFQkYzMDVGRgo1QTM3MUJEMUYxMTc2NzBERjFBNDlDMkI1RDFDQzgzREIyMUZENTM4
-OUJEQzI2NjAxNjI3RDcyOUQ2RDJCQjE4QTg0M0YzNjFDQ0VDNzUKRDE1MUE4Q0FEQ0YyRTQ5
-QTMzMzE2MTY1RDQ0RURFMkNBRkIzMTc5RTBFMkFCOEI1RTBBM0RDMDUwRDk4NkQwNzNCQzc0
-MTNEMDM2QUE5Cjg5NjI4NjcwMjJFQzIzNENEREYxRUI2NzY5MDU0RDhBMkQxNjVBODczMTY0
-OTQ2QzYxNENCOUFFNDgxRTZCNTVCMjgwMUQ5RDYxMTRDNApGM0NDMTY4MzM5OTlFNjY2MkZB
-NjNCN0ZGRkZGQzIxQkQyMDlCNjlGQ0VBMUMyNkI5MDUzNjIxMDU4MDdGMTJDOUU2OEY5RkEw
-MTJFNkQKQzhEREYyMTk2OUQzOEExOUVBRDEzQzVENDk0MDdEQjUzODBBQzQwOTAyMDQ0MTQ5
-MDcwRjlEN0QyNTE4OTVDQzVGOEE1OTdGNDVDRjIzCjc2OTJGQTdGRjMzMzU1QTMxRTI2RTdC
-Qjk3Q0NGMEUwREQyQUEzNkFCMjEwMjY4ODM2RTgxOUU0NURFODUxOEM4RUU1NEUxNzE5QjQ4
-MwoxRkY1RDkwREUwM0M0RTRDODY0MDU3MTQ0RUI0NjU0QjkwOEVCMDUyNzcyMTYwQzhFQ0Yx
-Rjg2MkMzRjUwNDUwNEY5RTE1NjI4QTRBNEQKMTZCMDFGNTQzQzY3N0FEQTI4QTEzMkY4QkY1
-Rjc1OENDMDg2REVFN0MxNDZCODNCNEM2NDc2QzNBNTUwQzYyMTg2NzVGNEMzM0YxRUNFCkRD
-QUIwQzMxMTJCRENGREQ5NEEzMDMyQTczQzYxMjQ0NTEzOTdBMDhFQUYxMjkzN0U5ODA0MjVE
-RjQxMUZBNzYyRTc4MTc3NTVFQjM2NwoxQTk5OUE3ODVENDEwMzAxMTQ1RjdERjQxQ0REMUUz
-QzY0MkVENjRCM0UzQTM1MkQxQzY1RUQxRTYyQjJDOUY0MEM5Mzk4Q0IzMEY3N0YKN0VBODhD
-REVENUE1RDUxMTA2RDgxREEwMzQ3NUIzRjI1MjVEQTFBRDRBRDU1Mzc5NjgyODY4RTRCMzc4
-OTdEMDRBOEJBRThCNDc0QThDCjYwQTUxNjk1MDc2RTkxRkFGMkZEM0U2RkRBRTdBNjMzRUM1
-QTgzMjQyRTIyNEUxNTQ2RUJEMEE2QkU2QTFDMjE2MTlBNTIyNkJBNDZERQpDNEE5M0UyMTJG
-RUEwNTMxQzc0MTE1QkQzOUM1MjY2NUU1MTAwMUQ5RDBDMDFBQjY3RkY3RTNBMjVENEQ2NDRC
-QUJDMTdFQTAzMDBFRDYKNzBCNUJGNjVERkI1RjNERUU0NTE4OUYxODVCNDk0NDk4QTZDMUVE
-MzM2QzYwOTAxQThFMzZBQjk1RjU2Q0I1MzQxMDkyOERFNjgxNkUzCkNBOEZDQzQ4QzFDMzBC
-ODZDQzZFMkIzRTI2NUVCRDRDNUM4ODg1NzRBOTk4N0EwMzcwNTNCOThCRDg2QUQ0MjlDRDc1
-MkM5MkUzODk4Mgo0RTlDMUU0NDE4MjhDNTNDQzQ5NUJFREFCMEZDQzY1NjEyRjRCQUNERjc1
-NjZEQzJEOTc5NDI3NUQzQzY0RTg4RTRBNzA4ODZGQTZDMDYKRjZFNkNEQTI0RjRDNTI1OEQ1
-NkUzRTBGNjQ3MzI1QzE3NkQyODI4NzMyN0I2NDg2ODE4MzM0QjRCRUZDOTIyNkZEODI4MTg0
-RTEzQTdCCjQ0Q0RFMTY2RTEwRDQ0RUM3NEVCMUZDMzM2NDcwNzE3QkU5Q0M1N0I2REJBRUJB
-MTE3NzMwMTI0REVENDEyNzBBQTdBMjBEMkNDNUU4Mgo2RjhFM0E1NkIyNDZFOUVGNjJDQUND
-N0U0REZCQUU0RkMxMTdENkNFNkJENzQ3RkFGN0U2NUZGQUIzMzNCQUZDMjc2QTg2MTVFMzZC
-MkYKOUQyQzI0NTcyOUNGNEYzN0E4NUI2N0NCNzFDMzM5OTg1MDNDNjE5MzIxQTNGMUU5NjVG
-QTYwQ0VCMDQwOTc4MEJDMkM4NUUxNDFDMDQ0CjFBNTJEQzEyRDAxNTgzOTMyRTg3OEJDMzg5
-ODc1NkM4QjcwNjE1MzEwQUI3MkUwMDMyRDU4NDUyRjA4NDQ1NTNEODZCQzQ3MTBCQTc1NwpF
-MEY4QjM0NkYwOENFRjVFMTFBRUFDQTA4RUQ3OTIzMTE2NTkxREZGNzlBMjAwNEFFOUUzNjQ3
-NkNENTIzMDg1RTUyQkY1RjU4NEU5OUEKQThGOTg0MTZGMTFFN0JFNUNGMEVEMTlCOUVENTNB
-OEY1RkFDQkNGRTY4NEM2N0FBNjE1QzU4OTY5RkM5Nzc4QzE3MEQ1QUE0QjQ5NUMyCjdGQ0U5
-MkQ0QkJCNEE2RERDQzAzRDU3RkVDQzYyNUJBRTFGOEVGMUJCNDUwQTYxNzgyOEFCOTQ1Nzc1
-QTlBNDUzQ0U3OTFEMTE4RDdFMwo4MkRDMTc3N0JFNjVFNkU4QjdDNUQ2RDUzQkVBMzFBNDg0
-OTMxNEU2QUQ1NzY0MzdBRDdCRjcyNENFQ0IwQzVGODJFRDBDQ0NDRTZBMkMKMDcwNjRENDg1
-NzAwMUIzQkM5MERGRDNDQjU2Mzc1MEMxRjg1RTFCRUYxRDUwNDM1MUUwMkYxMzZBNjg0NkYz
-RTM3NjZDRTgzQTgyMEI5CkIwMEU0MDMwRTBEMEFFNDZEMTI1OUVDQzBGMjIyRkMyNjFBNTlE
-NDU4RkM2OTBBNEYzQUE5Q0YxMzBDNzUwODk3MDZCQjQ0RDBFMTFBRgo4MEFFRTBEMzBBQjI5
-QUFFMEM0RjE1REMzRUFDRkRCMTdGMkMzOThCMzJGMUJFRjM3NjAwM0FCQzVDMjBBMDkzMjAz
-RDQ0RDNDMUQzQzkKNjczMEEwRTJERkZERUJBMzMyMjY2Q0UwNkYzMUEzNjgyMjMwNTkzQjE0
-NDFENTI5M0YyNTE1MDlCMDZGMkE2MjM5OTdBNkYyRTlFNEI4CkY5OEVGMEZDRUI2OTNBRUJB
-OTJGRTAxNzY4RUI2NDE3NjEwMjI4RDVGMTY0Nzc1RkMxNzU3OUQyMzFBQzNGMzdBNzgxQjk2
-MEIyRDI4RApGN0FDQTZEQkU5NDg3MzE3OThBNDI5QThCMTNBOUU1MEI1NUEzOUNGRDI1Mzgy
-MTRDNzlDNkE2QUVBMzFCNEE2RTAwQ0MzMUE1OUE3NzIKMkI4NTBDQzBFNTZGNjI0RkNDOTUz
-OEVBNTUzNkExMTI5RDNBQTVBMjk4MkQ0QTA5QkU0MTJFMTAyNjMyMjVGREE4RUExRjhFNDJD
-NTdGCjBEQUI0MDI1NTFBMzUwNERDQzQ1MDUxNkZDOEJFMzBCNDgzNTg0OUE5NjlBMzA5ODZG
-QTFENzBBMzUxNTlEQzM4MzhFRDY5OTcyMUYxMAoyNzU4NTMwRkI0REM3RDA5Rjk0OTFENjY1
-MTc1NUVCMEEyMjk3QjRBQ0JEN0QzOUE1RkRCQjE4QzA5ODYwRUJCOEI3NThBRUEzNDkzNEEK
-RTM5ODQwMkRCMUU2NzgzNjhBQzQ0RjNFREExRDBEMEQ5RDRGNjIyMDk4QTc5NTRERTlBRjQw
-QTRCQjIxMjAzNkREQThBNTQ3ODgzRjA5CkVCNDkyOEFCQjJGRTE2QjIwQUQzQzREQTFFNDMz
-REExQTZBNzlEQUFBRjAxNUFDNTc5ODhFNzU0MjhEMEZBMEYyNDM5QkFFMkQ2MzJDMgo0NkM5
-NTE4RDAyRDhBRkNGMkJDRDQ4QjZFRDRFRDcwQTZFODRFM0I0MUMwQzRDMEEzNTA0QkJCN0M4
-QjFFQkY4ODEyMTFCRUIyRDZGNUIKODIxQTc3MzIxMUE0Mjc1QTg4QUNCNjgwMjg5OUVFRUU0
-RTc0OTM4M0Y0QzhCMDVDMzY0QTBGRDUxQzBCRDc5QTI5QTQ0RDc5NjE0Q0E1Cjg4MTQyQzk1
-NTM5NEUyRTY5NDdFQjI4NTY4RTg0RUZGQkMxRTUzMTI2QjBBQTY0OUM1REFCOUZEMzgxMkE4
-MkYzNjkzOERCNDIzQzc0NAo3ODdEQUYxRTM2MTVCMTQzNDZGQzI4NUFGQkVGRjU1NjE5Q0E5
-QzQyRkZFRjcyNDlFOTYzQTQ5NDBCQTU1MjNCNjM0NDAwMTQ0NzA3MjMKRDk4NjgwRTk0NEM2
-MUQ1MkMyNEM5M0Q4RDMxMENDQ0E1ODNBQzUyMjI1N0Y5RkQxODcyMzlDNUNEOEY2QzhGM0VE
-OTE0N0VGOTc1QURBCjY5Qzg4QTZFOTgzN0ZDNjBFQkQyM0JGNjM1M0IxOTFCOUE2MEQzNUU3
-ODNEOUM0MDRGOTI4NjBGQ0FDQ0VDMTNBNTIwRDg3NDQxM0RGQwo5RTQ5Qjk2NjVDNkI0RTU3
-MURBNUY3OTg2NjE0MjhBNTlCM0U4NURBNUMxQ0Y2OTI3OTRBMTlBRTMzOTIxMzQxRDIxQkI4
-RDQ3ODFEMDQKNzA0RDMxRDM2OThDRDYxOUUxOEY2NzFFNzY3MzA3QUFCMDUwOTVBNDdCQURE
-OEE5RjMxMTlBM0JDRUZDRkI5NkI2N0YxOUMyODVDRDQ1CjA0NDc5QjI1MUQ0QzE4NDg2MzZG
-N0FGN0U0RTJGMzQ1MDUyM0M2NkMwNkFCQkY5RUJFNTcxQkY2MDc5QzUzRUQ1OTk2ODRENzAx
-N0Y1OAozM0NBNjAzNTcyNzRDNUQ3N0JBODQ0NjEzOTU1REM0MUYxMjU3Qjg5MzREODk2MjRD
-NjYyOTdBQUE2MEZBM0Q4RkU1MUI4MDcxQTU1QzAKMkI5NzRCRjcxNEE0Nzg3MTU0RTJCRTM5
-RUVBODNDOUNDQzc4RTE3OUJFRTQwNDkxQTdCMUE2OUU5NzY5MDY1MTczQzg4OERBMzJCQUU3
-CjFDNDhBNzVCMUVDQTM0NDYwQzVFN0ZBRTVBNkEwODk3QzcxNkE5MzhFNTAzRDc1NjlFRUUy
-MjY3MzE0OTM0MTQ0REVENDhBNzM3NkRDOQo5NUYxQzNCODlDRTc5OTQ2QTM5RkY0MjhGMTZD
-QkY2NUU4MDA2QzlBMUNCREYyRDc1NTNENEI3MUY4ODQ0MDg0MTU5NjRBRTYwODM5MEIKQ0Ez
-OTAxNzA0RTM5QTY4OTI4RDgxMEM4ODE1Q0Y3QTg2RkEzREUzMjZDQTdENTA2RkVFNDFDQUU0
-NzczMUIyODM0MDQ4RDI1RkE1RjkzCjc4RjQyRjMzNkY4OTA2MkY0MkZCQzRFQ0U3QTJEMDA1
-QTcyMjA0RjI4RjBGMERFRUZEODNBN0UyMTIzRkQ4Mzc0RTlCMjQxMDlFMDBCRQo3MTczOTVF
-QkNGMDY5MjkyNDIxNkUzQkYyODFBRkQyNTRFMkE2OEZDRTEzNDQxOTYwMzE0NTVDODZFMzgw
-MENGNDJEQjEyRjg0RDAzQkIKRjlEQ0M3MDQ0NkI5NEFFMkY2N0NDNDg0NzM3OEYzM0ZENzQ4
-Qzc2QkQ3RDcwQUU0RDAzQUU2QzAyMzBCQ0E4MEU0MzZDMjEyNjk0MEI1CkNDOUFGOTJCQUQz
-QjdENTJCQjMwQTI0ODYyMDg5NjQ0QUIwRTg4MTU4NTZCNEFBRTZBOTMwMjQwRjhCNkUzNTdB
-MDQwOTA3QTNEM0YyRAo4REEyQkRBNjI1RjVENEEyQzJEN0RDQkE2NjNFRTU4RUYyODVGRTE0
-MEJGQTc1RDI4RkNGRjkxMUU0RjE5ODE5OTcwMjY4NDk0QzgyODUKRUJCOUU4NUE2NjIzMDJE
-OTFENUI1NzI1RDUwOEY1NUMxRUZEMzA5MDMwNUE5MDRCRkMzRDlBN0NBOUQ4MERGRjFFQTQz
-NUE4NDY0MzdGCjg2REJDQTQxQkUyRjVCNEM2MzU4OEUzRkFBM0FBMzRFRTE4QUI3NzY4MEY1
-NTFFMEU4MUY5NDgyMkVEMzYwNkEzNjQwOUZGNjAxQjdCMQoyRDU4OTNDMjA2Qjk4NUYyMzRF
-QjIyRDgxNDRERjE0OEU3MzA4MUE0RUE1NzMwOEQ1Q0U2ODA2MUIyMTM4NjJDRjgwQzg3OThF
-RDQzNkIKOThDRUY1OTE1NkNFRDIzQjA3MThEMjQwQjk5NjQwNzRCQkNBNUVCMEJEMkE0RjE2
-NjUxNzU1MDc4QzI4ODUxRDk1NzVEQkIxMzdDMkY0CjNCNEFGQkM1QUI1MUY5MjFCRDZENTBD
-QTFBMTJCMkYwMUMwRDY1MDEzMjRDOTI5RDJEOENCNTZBODNDODJGQzUwNDFBNDI3N0EwN0VD
-MgowODYxMkIwOUJGM0Q5NjNEM0ExOUNBODI4MjJEQUE5OTY5OUNDMDY4Mjg0ODc4ODI5QTI3
-QkU5NzhDMDMxRUY0Q0IyMUUwRjg4ODZGRUIKNzBCQTBFQzRBNkE5MDZFRkIwMkI5RjAzRDAw
-NThFRDc1MThGNzM0M0QxQTZFREZGNkQzOTEyQTgyOTM5QjNDQjA2QkMzNEY5Nzg1NTVFCjc0
-OUFBOEZBMjRBN0Y5RkMyRDU5NDA4M0QxMzlGRUU4NEVDNjUyM0Q4NzgxNzJEOEU2NUJCRjVG
-QUQ0OTAwOTAwOTRBNDk0NTZGNENFQQpFRkU1NDEzRjkzRTUwRUQyQUMzQ0IyRkE1M0U0OTg2
-NzFGMjc0RURFNTdCNDUxQzU0MUIwNDQyODJFNEFGOUEzNzYwNzYyRUFFQjA4MzUKNzQ0Nzcw
-OUMzMzExRTA1OTc4RTRFRThDRkUwODAyRjUyRUQxOEMwNTE2OTBGMUJEQkZCMEFCOEZEOTAx
-N0ZGQTcyOEJFREJEQjI0MzBBCjE0Nzg0N0VDMzcxMTIzMjI5N0IwQTQ2M0E3MDVDNTNBMzZE
-N0M2RkMwODk0OUJERTM0RDQ5NEY1NTAyNTZFQjFFMDgzQkJFN0Y1QzcwMwo1MTRCMTZBRkY1
-RDE5MzBCM0RBQ0E5RkNEMDNDRDA2NDA5RTUxRkVBOTBFOTUwQzZEOTNBOEExRTBEQzdCMkNB
-MjI4RjU2RUMyMDY4NjAKQzg2OTc1MTYzMjdDOUQzMUQyM0Q1OUY4MEZFMkU4MTcyNkRGNzFC
-NDNENjdFOTREMDBFODQxQjVCQzE0NDQ1REEyRTE5NDcwMEU1QTYwCjk4RUZEOTk4MzUwN0U4
-QUE0Q0ZDRUVDQzhCQjQzRTQxNjcxQjBBRTg4RDhCMEY1Mzk3RjIxNjhBMkE3RjVDOUI5RjJB
-NDMzOEFDN0Y4OAo3MDFERTQ4OUFFNTkzMkFGMEFFOUU0ODE3QzRDNzJBQkVBNzQwNDg5RTM0
-NEJEQ0JEODMyQTNBOEI2QTlBRDVCQ0ZBNkE5MzU5NUQyRjgKRTJBNzg0RDMxM0UwNThDNjBG
-NjI1MzUwMTM1MzBDNzdCODU1OUNFOUE5MUYyRjE1NjlFQ0VCNzY2MkMzNENCODZDMEIxNTc5
-QzgzQTZGCjcxQjNEODBDMkZGRUQzQUFCMkQ3NkU3MUVGQUYzMjg3QUM3NzEwQjk4NzlENjUy
-OThEMjhDRkU2RUUxRTM3MTRBOTYyNTlENzJFQ0I0NAo4MzhBRTk2MjNDQTlENEY1N0NBQUZD
-Q0M3RUJFMjkyQzFEMjk2MEE1MURFMUI0QUQ5NjA2NTBERjE3OTExNUJCQzNCNzhCRjVEOTAw
-ODYKQTUwMzgxOEFFODc1RjAyNUJDNTAyNjA2MTQ1MzUwM0QzQUE1NzlDQjBFOUM4MDlFMzFF
-NzUxMjQ4MEJDRTRFMENDMUM2OUVBRTNGMjAyCkIyRDlERUMzRkMwQTIzRDExQjkwNkNENzNF
-NUI3MzU0MjIzNzE0MTMzNTBGQkZBRkEwNTE1ODRFMTQ2M0E5NDgxNkRCNkJCNDhBREUxNQo1
-RDlBMUYzNjZEMzI0NkUwNjQ1QkZGNDk1OUM2Mzg1MzQ0QTlBOUZGRDkzNUE0MTNBMjdCQkU2
-OENFRjM5QzY2REYxNEY1NkUzNkZDOUMKOTBERTIwRTgyRTFFNUFBRUJCNDQxRUU2OENGRDc2
-NkY0MTBDMTYyMkYyQzFENzJDQzQyOEYxMkU5OUUwMkQyQzczM0YyMzhCOTkwMkY5CkNFMUQ1
-MDJEODUzNjRBMkM0MDk2QzRGRUIxNjM5Q0M5RDY5RjkyRDEyQzdBRUU3OEQwNzRCODgwOENE
-MEJBQzgwODZDNDAxQjBGNENENQowRTQ5MzA0RUNBODYwQTQ5QkZGODg3NEYyMzE4NTYxNjg5
-QUI1RjdCMkU1RjFDNTI3MkZCNzVENUVEMTlFNDEzNkE5MUEzQUY5MDU4NTYKM0Q0QjgzODY1
-Q0YxNTA3OENCMEMyQjk2N0UzQUE1NDlEQjU5MUEzRUEwQzE1MjFERDdCMkUyMjJDMTcxQkY4
-RUJFNzY1QTMyQTRBNTc4CjRDNjExQkEyQzYxQjI0MUYyQUZBNDBFNDk3MTJDOTE5NDAxOTY4
-RDg0MTk3QTczMUI3OTlENTM5N0JEMkI5MzczMjlEMjk5QzhGMDA0NwpEQTQ1MTk5MkU2MDZC
-RkUzMEE4RTE4MTQ5MDdBODdGRTg0MTE5QUZCOTM3MDNEOTc4N0Q0QzFDNDEzRjVBNzYyMzZC
-NzhBRUNEN0NCQjUKOTA0MDhBMzEyRjYwQkMxQkI2MzQyM0UxMDMxMkM4MEExMjFBMTU0NzIy
-OTk0MTM4QkZCMTZCMDM5M0EwN0FGRUM3MTZFQTY5NzcwNzFBCjIyQUIzRUQ2MDBBMDk0RTVD
-NkRENzNGNkQ3RjBBRDEzMjM1NUU3QUVDNEUzMDFFODIxRTExRkFBQTY2RDcwQThFM0FDNTI1
-M0FFRTU1MgoxODZCNkY2Mzc4QjYyQzE0RUM0MUFDOTQ1MTUxM0E0QjI3QUVCRDY2OTU5QzQx
-RDc3OEYzRUU4QzY1OTdBMEUyQTQ4QTRFRTlEMTRGMkQKQTM4MDI4MzBENzkxQTNEMDQ1RTk0
-MDcxMDcxRThCRUE4MjMzODA1QkJGMzU5MDZDRTc2REQ2OEYwQjczOEEwNDI3MDhENzk2RUI0
-RURFCkMxN0NBODYwRDg1NzgxNTdEODVGNTUwRjMxRDNCRkE4RDI4Qjc2M0U5QzYzNEY2MUY0
-MkZEOTc4RUMxMjVFOTBDNzFFMkY1MzdFRkFGNQoyODNENEY5N0U1NzJGMTY2NDkxMkY2MUY2
-OUExQkM1MzE0MDc2RkE1MjExQzQwMERFQTNDNDEzMkFCOUNCODE5MjA4MEQ3OEI3RUMzOUQK
-MTRGQUFBMTUyOThBQjZDODBBODAwOTU3QjJCREExQjI3MDVGRTZFRkJBMENFNTg1NUY3RTc0
-Njc5N0Y5NjQ3OTlFRUM4NjY3NUNDMEVCCjMwQjQ0NzgzOUM5OTcxM0QwRDRENjY1RDBGMUJB
-QzY4REFGMjY2MjY3QTU3QUYyQ0EwNjZGREU5NjAwRTQ2MjM2MTNCNDU2NEM1OEE2Qgo3MzQz
-QUI5REI0NDZEQzdGRDQ1Nzk1RkJBQzlFN0E3MDMxQUVBNzhFQjg1MDdCQUNBREJGRDkzOTBF
-QjkwRkMxOTgzOTFDQTdFMTVDQzIKOUI3QzdEQzY5NjRFMjEwRkFENzgwOEU5MjM5N0I4NkUy
-NTUwMDM1NEZFOEY3NDlFRDRDOUE5OEE0OEI2RTVCRUZGMkIyRDZEMUFFOUVFCjE5RjgyRTFB
-MTQ0MTkyQ0U4N0UyODczMUFGOERGODJDREQxOTUzRDczQjYzRDU0NDE2QTg3RjRGQjkyN0Y2
-Qzk5RUE4RUI1MjkxQjEwRApDNTE5RTVFNjBGOEM1REIwNzFGNDZGMUEzMDhCOEY3REZBMzUz
-QzZDRUYyNTc4MDM0QjMxQzNCNzUzNzU2OEI0QzIzNjU3Nzc1NTAzQ0IKMkY5RTgyOUQ4QjVD
-Rjg5MkVDNEQ0MDVGMjE1QUI0ODA1NkMxQURDOUUyRDcxOTU0NjNEREJDQTE2OUY4NDA2MEM2
-QkE5RDg5RDNDQzAxCjBBNThEODQ1RjY4N0IxNDhGMzVDMTdDQUU3RDYyN0U2MzYxNkMzRUQ4
-RTNGN0ZDQTFBMkE4OTRFMEExMTkxOEYyNUM5N0M2MDhCMDJDOAo5NEFFQ0REMzk4MTU3N0Uw
-RjU1MDE0NUUxOEZEOTlFRTJFQ0RFRTk0MEM3MTY2QkVGRjYwNzcxQzA0QzgwOTNBMEU3NEJE
-MzA1NTE3OTMKMTUzNThDMjIwM0FERDg4NTMxM0I5QzRBRkUwMzFBMTUxMTZCNERCNTY0MTg3
-MUY2MDc4QkFGMTMwNDU3RDUwNTQ3QTBGQzQ4NzJBOUVDCkM0QzhCQUI5OEFFRTNFQURCNzI4
-NTIzRjVBMTEzN0REMDQ2Q0Q0MzhFM0Q2QzFERUZERjUzQzY2N0E3NjU3MEVDNUYyQkVDMERC
-RDY2OAo1RTE4QjIwNDY4NUEzQzI5ODI2RTc5Q0U5ODU1NTI5NUNEMUIxN0IyOUI0NkQ1MkFF
-MjY0QzVENzEzREY5MUUzODE2MTcxN0JGMUJDNTIKRkNFRDRFRjBGOUU4RTczODQzNTE1MzBF
-NEUxRkE0MkVFMTk0MDNFNjREMkI4QzMzNUU0NTg1QTMyRkVDQzdEMzg2MDgxOUVDQzQwNDg0
-CkVBRjczRjNDRDg5QTU2QzdEMkVGNDM5QzhDNEU3NzNDMTM2ODk4QUQ3NDkyNDQ0RkRBOEZE
-QjhDMzUyMjM5NjlDQkU4OEJCNTk5OEMyQgpCMzBGNDYwODFBNzA2RUNBNDYzNUIxNkIwRURF
-ODk5MDFCM0E3RkEzMEE4N0FDNTlGMEUzMjQyMzE0MjI5MjY3NTM3RjlGNEJCRkI1QjYKMjlD
-OTY2NUFFMDlCMEEzQkJDREZGRUEzNTQyMkU3QUNENjc3Njc4NkJDMTY1ODExQTQ1N0FGOEZE
-N0JDRDQ2MjRGQ0VFQ0M4M0IyNDE2CkIyMjVBNjA0N0U2MTAzQkI3MzdBNjY4RTZFREJDODgy
-NTMwMkUwMTNCNzM1NDNBNjExNDEzMkNGRkZFRUNEMUY5QTlFMkZBNDQ5QkNGOQo4NUJDREJG
-RERCMEFGNDlFMkU0MkFDMjUxMUQ0NzY3QzlDNjMxOThGMDNFRjM3MzNGMzk2NUEyQzA1NzUy
-ODY0NDE3OTc5MzkxMERCQTQKRTc4NzQ5RkMyRDJERUZCQTE5NzRFM0ExNkMwNkI5N0MzMkIw
-REMwQkNBQzRCNzY1NjRGN0ExRTY5NTlCMjZDQTM1QzgwNkMxMUIwMkE5CjhEMzI2MjlGM0ND
-N0M5MDc4NkRCM0UxQTcwQzdGM0M0MzkwNjg2MDYzMEJFQkYxNENBQkY4QjZENjk0QjI3MTM4
-RDYzM0EzMzhCQTFBNgowRUYxNzBEOEVGNDk5RTNGQjlENThDM0M3MjNBNDI5M0Q0MjQ4QUM2
-NTc0MTg4NEQ1OTI5Qjc3RUZDQjM1Njg1MDBBOTkxQzAwQjU4QUQKMkJENkM0RDdERDAxN0Iw
-NUQwMkZGNkUyMUUxQzBGRTI0ODI0RURGMDg5NDVDN0M2REIwRUFGOTcyMDBEM0YwRkYzREVC
-NjQwNUE1RTlDCkRCNDYxMDgzNzc2OUYxREU1NDNBMTM3Q0IyNTA4MDUxRTk1QzMyMjMyOEU1
-NTBCRUM4RTcyRUY4Q0VFRjZGOEVDODUwMzI2Q0U5MTlFQwoyRDY2RDk2MUEzQTg3MkYwODYz
-NDBCMDBFRDQzRTYzRDcxNEYyQjI2QkY0OEQxQTkzNDQxMUQ5MDlCNEMxQkYzQjU1MTI2Mzgw
-MzYzMjYKNUUyQzQ5ODQzNDAzRUJDNzNCM0Q1QkI5MjREMjg1RTlGNEIyREEzRUQ1RDI1REY4
-NDBGOTVBMDg5RUQ2NjRDNDdCNEVEMjA2N0U3MTA3CkQ1QTgzQzVDMjVFOTgxREVDRUY1QzQy
-RkM3RTdFMjEwQTE0MTVGQTQ3N0E1QkE4REY2MDJFMDRCMDI2MzAzNzU3Q0NDRkY2QzJFQUY1
-MwpBOTVGNjIxNDY5QkI1Njc4NDJGNzBDMkQyNjExOEE2QjAxN0FBMkQ4REVCNDlERkJBNzVF
-OENEQTFBNjk4MDQwODA3MUE4QjMxNTJCNjIKOEI1REI3NDc5MDMxM0NDRDBFQ0VCQTBCRDg2
-MzJDNzE5Mjg1M0E0MUJENDQ3NTkwMDlEMDM0RjI1RUIxQUQyN0ExMjYzMDEyOEFCNEFFCkE3
-RkMzQjM5QjZCQTk3QURFNDBERDJCNzZBQjEwQ0FEQzUxOTc4RDVGM0YzNjZBRkNGQUJGQTAz
-MUFBRkFCQzFCODMwOTU3MURDRTdFRQoyMDcxMEY3MjgyQzc3REFEMTZDMTkxNzg2NDEwOUU0
-MEQxQjc4OTM1NkU0NUY4MTgwMTI2RkM2Mjg4NTBBOTVGQUZEMzQ2QjlCMzg2RTIKQzVGREFB
-REI4MDg0NDM2MUM1RDY1REFGQTlFMzA1MTM2NjI0RTdBRjc0NEU4QTY4MzE2MzlDMDZDNzRF
-MURGRUU0OUU1MkMzRkM3N0ZBCjYwMUYxOTREOTdGQkY2RDhFRjBGOTQ4RjgxOTc4NTRDQjVD
-NzUwOTM3NTY2MEVCMUFGRjJDMzg1OTY2MjI1Q0QxRjc1NjY4OTUwMzNGMwpDNERFNENGMDA4
-MUVFNDcwRjRBQUQ1M0YzMTY1OTM5Q0UzMjEzMjUwOTY3MUZDMTY3RTgxNjhDOERFRjZCNTk1
-RjdFMzJDRTZFREQ4MzMKOTc2RjI3NTU2NTQ1QzgwMEI0MDBGMzExNzM1NzBBNTRFODI0Q0E4
-NDA5MzM0NkFENDM3NjEyMDRDMjY0N0Y4QTEwNUE1NjQ2RTdBNUE0CjA2OTdCRUZCNUI1RTUw
-MzU1QTg0QjlGMEFBRTM0RUREQzM3N0YzQUIzQTZEOTIyRTJCQ0U5Q0Q1NDIwMjE5RDBENURG
-OEIxRDI2QTcxOQoyRTIwRDdBMUNFQUE0MzNGMDU4RTM0ODc5NzQ4Q0Y0Q0JDMUU2QTY3MjUx
-MDJEMzM3NUVGM0Q2Nzg1QTc1M0Y3M0U5MkY3ODU5MDAxNUMKMkIzRUI0NkYxNzNBNENBRDZF
-Mzk3REIwQzMwQkUwRUU1N0RCRjI3NjIyQTIxRTZDNDY1QzVFRUM0QjA3MTEyRkMyRDMyNTky
-MTRFMDM0CjIyOUUyQ0FCMTA3NkNGQTJDRkJEMDkwMkNDREM1NDkyQTNCNEMzMjMzQ0Q0RkU2
-Nzg2MDc3ODk4RTQ3NDExMjU2RkVEMTk3NjZCNUMxMgoyRURBRjAyMDZBRjA2Q0Y4MTU4QTM4
-QkE1NTRDMUYxMDI0RDc4MUJBQ0FCQ0RBNzM5Qzg3RUNBRkExMzIzMDExNjA4MjJGM0M1OEMz
-QTQKQjc2MDQ2NEE4OUQ5OTBBRTlDQ0VBNjdEM0E1NDA2MzU1RTUzMzlGNjk5QUM2QTc3NUYx
-NTE3MjkxNEU1NUUyQzhGOEJCMkVBRjJGREE3CkU3RDc4NDExREFGRTYxQTE1Qjk4NThFOTgw
-MTgzQzEzRjA4MkM2OUQ0RTk5NkRDNTlENUJDNTNBRTY2QzUwQjI3MTM1MTBBNTM0NkZDRQpE
-QzNBNTNGRjczOEIzQUI4RjZFN0YxMkRDRTAzNDM5NENFNDA0OTBEOTVGRDlGNUY0ODRCNEU5
-NjVCMUEzOTk5NkUzRjBERDZFNUZBNkIKNUMyMzhFODU4QjkyRUI0RTlGNEZBMzMxMEY1RTUx
-MzVFNzVBNzgwNjYxMzQxNEM2RUI1MTkxNjQ1RkREREU3REE5MDkzNkUxRDRBRDRCCkIwOTZF
-NDdBNTU3NTA5NEFBQ0VERjdBOEFFNDZDMTU3MkJGNkMyNzNDREM3RENEMkU5ODQ1QUZCOUU1
-NTMxRTkxQzIxQkEwRkQzQUZGNQowMjE1NTY1NDcxM0VEODA3QUY3RDU1RUY1MzRDQUU3NDU2
-RkE2MDhBM0MyNzAwMThBODVEODA1MjJFRUVEOTg2QkFCNzFDQTJGRjU2RjcKQTVCMUREOTIw
-NTQ4OUJEMEUxOUMxNEM1ODVGNTY2MjJFRkE5RERBQ0RGM0QxQzk1NkIyQkZBNzQ2OUVCNTEz
-OTk4REQ3MUIwQzg3NDVGCkY4NjY1RjI5MjY4MjVGRTEKMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-CjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwCmNsZWFydG9tYXJrCiUlRW5kUHJvY1NldAolJUJlZ2luUHJvY1NldDog
-cHBjb2Rib2wucGZhCgoKCiUgR2VuZXJhdGVkIGJ5IEZvbnRvZ3JhcGhlciAzLjUKCiUgQ29w
-eXJpZ2h0IChjKSAxOTg3IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLgoKJSBBREw6IDcx
-MiAyODggMAoKCiVGb250RGlyZWN0b3J5L1BQQ29kZUJvbGQga25vd257L1BQQ29kZUJvbGQg
-ZmluZGZvbnQgZHVwL1VuaXF1ZUlEIGtub3due2R1cAoKJS9VbmlxdWVJRCBnZXQgNDMwMzcz
-NyBlcSBleGNoL0ZvbnRUeXBlIGdldCAxIGVxIGFuZH17cG9wIGZhbHNlfWlmZWxzZQoKJXtz
-YXZlIHRydWV9e2ZhbHNlfWlmZWxzZX17ZmFsc2V9aWZlbHNlCgoxNyBkaWN0IGJlZ2luCgov
-Rm9udEluZm8gMTMgZGljdCBkdXAgYmVnaW4KCiAvdmVyc2lvbigwMDEuMDAwKXJlYWRvbmx5
-IGRlZgoKIC9Ob3RpY2UoQ29weXJpZ2h0IChjKSAxOTg3IEFkb2JlIFN5c3RlbXMgSW5jb3Jw
-b3JhdGVkLilyZWFkb25seSBkZWYKCiAvRnVsbE5hbWUoUFBDb2RlQm9sZClyZWFkb25seSBk
-ZWYKCiAvRmFtaWx5TmFtZShQKXJlYWRvbmx5IGRlZgoKIC9XZWlnaHQoQm9sZClyZWFkb25s
-eSBkZWYKCiAvaXNGaXhlZFBpdGNoIGZhbHNlIGRlZgoKIC9JdGFsaWNBbmdsZSAwIGRlZgoK
-IC9VbmRlcmxpbmVQb3NpdGlvbiAtOTAgZGVmCgogL1VuZGVybGluZVRoaWNrbmVzcyAzNiBk
-ZWYKCmVuZCByZWFkb25seSBkZWYKCi9Gb250TmFtZSAvUFBDb2RlQm9sZCBkZWYKCi9FbmNv
-ZGluZyBTdGFuZGFyZEVuY29kaW5nIGRlZgoKL1BhaW50VHlwZSAwIGRlZgoKL0ZvbnRUeXBl
-IDEgZGVmCgovU3Ryb2tlV2lkdGggMCBkZWYKCi9Gb250TWF0cml4WzAuMDAxIDAgMCAwLjAw
-MSAwIDBdcmVhZG9ubHkgZGVmCgovVW5pcXVlSUQgNDMwMzczNyBkZWYKCi9Gb250QkJveHst
-MjggLTI4OCA2MzEgMTA0Nn1yZWFkb25seSBkZWYKCmN1cnJlbnRkaWN0IGVuZAoKY3VycmVu
-dGZpbGUgZWV4ZWMKCkQ5RDY2RjYzM0I4NDZBOTdCNjg2QTk3RTQ1QTNEMEFBMDUyNTM5MkVF
-Q0FDMTYzRTU4NEE5MTA0RDk5QUQwQkMxQjFGM0Y3MTIxRDFEMAoKRjJDNjBERDIwNkIwRDND
-OEM0NTA2MjBCNDczMjBDQTBBRUI4OTM3NTExRTQ1NkFBREU4RTY2QjMwMUIxRTNFOURGRTE3
-RTJGNzlFQ0ZFCgpBNzA5RkYzREFFMTlCNEMxNjlERjY3NzNFREE0MTREMDI5MTVBNkYwRkFG
-OEIyNEZCQjA3NzdDNjk3QkU4QTM3RDYzQTM5MEFEOURBRTQKCjk1QkI3RTYyNjcyMUZGMkZE
-M0ZCMTQ3QzgwRDIyQkVBQzM3QzI2MjREODE4RDU4QzhERjAyMDlGNUNFNzZBQ0RERTU3QTMw
-M0Q5MDQyQgoKRjBBNjc0RDA5NTY5N0Y5MjVGNTMyRDE4MTRCRUE4RjhBNUI1MjIzQTMyQkM0
-QTk1NDAyRjJDODQzMTgxNzc2RUE2REQ4RkY5RUU1RjM0Cgo4OTA1MUZFMzRBRTg5OEFDRjMy
-MDE0MzNDQ0NFOEI5M0Q1NjI3Qjc2MTE0Rjk5OUM4MUEwQzU1NDU5OUYxMTVDODlBRkE5MjIx
-Rjk2M0IKCjZBMkRBODkzNDI2MjEyNDRBQkVCMEU3OTRDODg1RjMzNUU0RUY4MTg4QzRCMTVC
-MUU2NjMwQTQwNURBNTA1NzhEREIzN0M5NkIzQzhBNQoKNkE3RjcwQjU1QkMyMzYwNkVDMDND
-MjMxQjIzODBBODNFMEYwNDY3QTRDNkY4NThBMDU0OEFDNUFBQzJGMTExN0U3QTRFQTdBOEM1
-MkQyCgowMUIzMzYyNkMyQkVCQ0NBNkREOTIxMUQ2Qzg4RjYwOUJGMkM2QjEzM0U1NUZDRTZE
-ODg2MDA5MEFGQjNDMDY1ODM1RDdCNEYzNEFGRjkKCkQ4RTBGNEUwODQxRTQzNjdGRjg2MDQw
-OTI3MDRFMUUzNjI2RkU4Q0I0QTQ4RUIxM0U0NUNCRkVFQ0JERkNCRkNCRTY0MzIzNTY2QzQz
-NwoKNkFGODU4QUNEOUFDREM0MkExQzkyODVGMjUzQzMxMTMxMjJCQzlBQzQ2MEUyNDczNTgx
-RjlDMUYyMTBCNkZFN0I5RDQ4NkU2Qzk2QkNECgowQ0Y5QzUyQTg5RDJGQTJEMzBEMTREMEZD
-QzlBMjQ3MEEzQjkxQTBDQUE5NjIwQ0IzNzZDNDE3NTczODYwMDcxMzMyQkYwMTIzMDU0ODgK
-CjIyODlDRjJBNTI5MzRGQjdGMzJCQ0Q5NDMzN0FEMUVGRTU3QkVCNDNFNEE2NjFGRjhFRjVE
-QkEzOEZBM0M5MjRFODUxN0FFQzExNDEwMwoKMTFFNzlENkRGODYxMTU5QUM3NEM5NjIwODg4
-RURBM0FGNENBMDhBMTU2MjNCNUYzRDFBRURBODhCMUJDQ0U4RjA1NzE3M0MwMzM3QzY3CgpD
-QTJBNTk5RjFGNEJBMDM5QkJCMjYxNzlGNTRBNTdBODc5N0E5QzRFRkFDMjI4RkVERjFFMkM1
-MEE5NTFFQjE5NzcwNTI1QUYyQzY4NTAKCjU2NjBBNkM1RjRFN0M3QUIzOUQ1NzU1RERERUIx
-QkM0RDA0RUIxMENDMDlGOTA3RTZCRkJCNjg4MDdBODc0MzkyRTQ0M0M5ODY3MDQ2RgoKNEIw
-MjBFNUQ3OUJBNDUwQjYzQkRDMEZCMzhBRUNERUE5MTI1MTY3M0M1MzI3RUVCNzQ4MjE1MDU5
-OTNBNDkwMTMzQjczRjdBNEQ5MEY5Cgo5RDRCMzc3OEU1MDI3NDc2MkZEMThFODdGN0NBMUQw
-MDlEQkY0RUE4Q0RGREFDMTQ5NEI3RTc4QzE3QjQzQTlEQkNBRUUwQ0Q1RkZCRDAKCkUwNDQz
-REI1Q0I3MEU3MUQ3Qzk1QUEzNUI0MkNGOTA4MzA5NjlBOEM4NDgwMkU0OUVEQTk1MjhCN0Qw
-RkREOTE3NUE2RDQxRjdFMzQ5NgoKN0IyRTkzODE1OTU1QTlCMTRCMzREMkEzN0U2RTg4Rjgw
-QzdDMTFERDM5QUNERkIxRjEwQTEyMzdBMEZDQjFCQjM3MjIxRjcxNjBBQ0ExCgo5MDM3QUY3
-OTRBMzE4MzU1NEMwN0MwM0NGOURCM0ZBQ0UzM0EyRkI1ODRBMzBBODE1NzhFOTlCNkE2MjU4
-NjFEMkQyOTU3RDVFQjg3ODkKCkNEMDkzNEE0MUZDQTIzQzkzNUJEQjcwOTQ4NDhCMEZCQkM1
-OTIwNjdBMzRGQjNBRDU2NEJFNzFEMjAwNzRDMkE0QjYyNDk0NUFDRkM3MQoKMTMxNjk0QzQw
-NTZFNDY0RDQzRTMyNDlCQTFGQjEwNkRBNkU2N0JCQzZEQ0Y1NDI4MDFDNzM0NDZBOTIxQURB
-QkE0QjRCQ0ZFNjM2OEU0Cgo1NDM3MzlBMUFCMzUyQTU0RjczNEVDRDNDRERCQzg5RjAxNEY1
-OTY4MkUzQzUyMUIzM0NBMEY5RkJDMjM3NThEQ0IzNDQ2NzI0REM0RjIKCjQ1QjZEMTIzRTkw
-NDQ1MUQyMDMwQjBCQTJGQ0JCM0U1ODcxMTc3OTk0OTc0MEFFRDFGMkUyQjM2Qzc4RUJCQ0NG
-QkNCQjZGQTI1RUZERAoKMEE5Q0EwMDBDNjdENkJFN0IwQjM2MThFMTBFQ0YxRkE1Mjc5QTdE
-MTY0NjJGNTM4MkFGMTA0QjUwNDM3NzcxOTRGMDEzOENGMDlERDJFCgpGNTNEOEY0NzM1QkJB
-OUIxNDkzRkIyREVDNEQzM0IzNUNGMTg4MTNGRjZCRjlFOUVFNzhFMkFGOTM1NjZGMEZDQkY0
-RDZCRkE3Q0EzMDcKCkU3QjI5QkFGMUI0RjQ3NDNCMTQwNzRCRjkxMDU1RTNGRjg0QzNBRjgz
-QzY2NDIyNzFCQUQxNDMwQzdBRkI5NzY4MzJFODg0NzFGQ0QxMwoKQUNGRDBFODY3RjVCRkNF
-M0NFRURCRTYzRUEzM0E0NDBCMUEyODExMUUzOUVCRUQ1RDA4QkMzOTU3Qzk1QzMzQzJGM0JB
-MDI3MDA1Q0Q2CgpGREU2MENDNDQ3MTY1N0ZGNkZBREQ4OTQ1MEFBQjVEQzk2NjgxOTVGQjlE
-OEY3NTEwRjEzQ0M4RUVEQUE2RDA5MTU4OThDQzYxOURDREUKCjhCQUZEMjU3RDZCNzRGMUVD
-QzYyNTk5RkYzNDU3MDJBRUM0RUU3QkEyNDJDNzNDRjhBMzYxQzcyNTk1RjY4MjQyNDBEQjEw
-RjUwQThBMQoKMkU2MDU2MzZGREQ0REVDOEM3RjcyNDdFMTkyNEREMTNGRTA5NTM2NzdFODZD
-RkNCOEExMEYxNUU2MEM3OURBMDE5RkZFMEY3NDg0OTdGCgo4RDdEOTJCMDdGRDI5NDZCRjkw
-OEFGMkI2Q0E0MDI4NUM5NjZENzc2N0ExNEZGODVFN0Y0M0I0OUUwRjhFRTFEQTZCNEU2NjYz
-NDcwMjYKCjQ3NDNFMEFDODcxMzc5Q0Y4QTA3OUVEQzY1QzFEODQ4OTYzMjk5OTBCNjBEOUEz
-M0M3MjRFMDE3NTZEREJEOEI5OTA2QUQxOEQxRTExQQoKMDk1MDg1Njc1QUY5NzIzQzBERTQ2
-Rjc4RTA0NzkwOTE2Q0E4OUI0REQ1RUE1NzYxOUI1OUU3MUJBNTMwQjY5NDU5ODY0OEQzMzJG
-Qzc4CgpFREIzNDM1ODgwNUI2NERGNjBDNUQ0N0FCODJGM0FDODdCNTM4NUMzOTExNkIwMzAx
-N0MzRTRCQjQ1NTZCOTZERTVGMjY2QjM3OUVDNjkKCjlGNEZDOEE5Rjg1NEM0MUU4QkIwM0M5
-QkQ3QzAwMzg4M0E5MDIyNjk5MkM2N0IyRDAyREJBOTIyNDJCOTREMjE1NjZDODNGQUMxQjRD
-MQoKMkFERTZGRkFBMDQ5QkY2ODA1QUU3NkE2QTZFRDQ4MTQ0REFDQUJEQzhEMkYzNUNCNUMw
-ODE1OEE3M0EwQTEwMDY2Njc3MzhDQzQ3MUU4CgoyOUQ5NDg3RTIyREZFQzMwREI2REQyODE5
-MzFFOUJFOUM4NDg1OUQ2RkE5MzJBNzZGOUQ4NUExRTk5QUZCNUY1OTA1QkZFRDZGRkQ3NjIK
-CjU2NTQ2NDk3NTdFQjY0MEI1QjNDMEQxODAxOUJFQ0Q2MjkxNjIwOTFCNjkxNTREQzBCREEx
-RDA4RjA3MjdBQzg1MUJCNDM1MDNFRTM5NgoKRDM2ODI1NDFBNzMwRUU0NTBDMzBGNjYzMTg3
-QzNCNTAwNEQyNDE3M0Y5NjJDRkVBOEUwNEY1REQ2NjRENUY2REQ1MTUyMjRGN0UyNTZBCgo0
-RUEwN0I1Q0E4MjM0NTZENzU3MDg5OTgwOTcyNjdCRTVENzdEMjBFNzFCQkEwQkVBM0YzMjc4
-NjVBN0EwQzU3NDYyODlBQTY1M0VFMkQKCjIxNTdDMkFGMzMzMEE0NTU1N0Y1RjgyNUE4RDc1
-Mjg0RkM2OUJDMTVFMUY3M0FDMEY1QTExQjI2RDQ3MjEwRDE5NUY1NTdCMjY1RTlFMwoKMEY2
-QUM3N0M1RDNBQjA4NDc0M0U2Qjc1ODM2NTc1N0I4MUQ0MzA1NDlFRjUxM0U3OUFFQkJBNTM5
-QTc0NUYyNEQ0OEFFOEU3MjhGMDI4Cgo0REYyODk4NEY1REIxMjAzRjBCRDY2NjI4NzU2NTY1
-MzkzRjE2MjkxOTFDNTAzNDdDMEE0ODIwNUREODA3QjBFNkNGRDM1M0UyMkJBNDMKCjFDQzZB
-Q0Q4QzZCNEU5N0Q2OTFGNzQzREFDNjlDRDA4ODFBQTgxQ0IzQTQ4QTA4Q0FGOUMzMkU0NDAw
-QTc3Rjk0QTUyRjlBQjE4QjRFQwoKQURDQTRGMDczREE1QjNCRjQwNzlFMDEyNUIzMDY0Njg1
-RkI3ODNFMTU2NUQ0QTc3NzkyOTBCQUE3MzQwNTJBRTc5OEY1Q0Q3NUM5MTI3CgpCMzM4QTQ5
-RTJDREZGRDlGMEE0MjlGNjYyRDE3MEFBODg1MTI1MDcxM0UzRDE5OTI4RDk3NEI5QTdDRTY5
-ODdEQ0NCMDdBNTNBQ0MzMkYKCkQyMTc5OTFDODBDNTgzNEJCQUE3OTZBN0Y5QjIwNjM2ODU0
-MjIxODcwMUQ5MzI3OUUxRTE5N0Q2OENCMEZEMDMxM0Q3NjcyQTEzMjdGNwoKMDYyNTBGRUE0
-REQ0QzYyM0NENTY4RjFGNkJBMDQ2OEQ1Qzk4QjRFOUM5NjNFOUU5QjIxQkU1ODkyMjc1MEE1
-MDc2NDQ5QzhCOURBRUEyCgoxQzQ2RTIzODRFRjg3MUM5NDU2RUNDNzM5QzFCM0NDQjVBODVD
-REI2NkU5MDEwOEM4NjBCMTgwRUM3RDRERDc2OTIxNEZBOTYzRjI2QUMKCjY2RTI4RUYyREEx
-Q0RFMjFCM0VGOTM3MTRFNDJFN0FBRDUzMzQ2RjIzRUUzOTg1QjFBM0Y4NzFENDlDRDU2QTBG
-MDQxRkQxOUE0Njg4QgoKNUMxOEIxNEM5M0FDMkQzMEU1NUI5MDJBQ0MzNURFNzlDNkIzRDNC
-QzhERjZFQzM1NTcwQUYzNEQzNDcyQzI0RUVDQjRDMDdBRDdERUVDCgo2NDI5Rjk2OTQyQkZB
-Q0E0QjdDRkRCQkNFRTZGQ0I4RDVCNTQyRTI4OTU5OUY5RkUxQzJGRTJCMUUwRTE4RjEzNTcy
-MkNCMjExODkzM0QKCjc3NDM2NzNERDhBREEwQUVBRkMyMEMzNkUwMTU3QjcyNDc3MUIwMERD
-MkZDRDgyMUMyNkVBREY0MjlFQ0YwQTI0Q0U4MDhFRDA2Q0I4MAoKRURERkZERDgzMDBBQzVG
-RUI3QzFCN0NCNTkwNTREMUE0RjA0MjY3RUZGMDMwRTE3MTUzM0FDRUE4NjlFOEU5Mzc5MkQz
-MzlGQTk2QzZECgo2NDhBOUQ0Q0M4OEM3RDBDMUIwMzZEQTdENDUyMDA3QTUwRUM1RjBDRjhG
-NEM2MjJDNzA3OENGQTNDRjRCQTQyNEE2MzkwNkJENTEwRTAKCkE1ODBDMjJBQTFGMDI3OUY5
-QkUwM0I3RTFCNkM3MTRBQkZBMkZERjRFQzhFMTQ3MTQ5NzBGQUYxQkNBNDlDNzFDOTFDNDZC
-MkYzMUE4QgoKQzMzODE4MEFGRkU5N0UwQTRGQTZCQzlGRTQ3NTBBODQ2MjBFMkNGMjNBQUJD
-NkNEQzQwOTcxNDA0ODBEMkEwOUMyMzFCRDMyNzM4RDU3CgoyNkJGMTI0MzU2NDBDMzk3OENE
-NEM4NTU0ODRENkNDQTQ0ODI4MzRGRDc2MUVBNDE1M0IxOTg0RDA1NzhCNzc2Q0RCMjFENDg5
-MTgwMTIKCjg2QjY0NjY0OTI2MDhERTc5N0E3Qjk1MUE5NzlBMkRDQkVGRkQ2OTI5N0M0NkYy
-QjM3MkY4RUQyQ0NBRTkzNzJCRDRBRjY0NTVEQTcxQwoKNjVGRkFFQTZFODQ1MjNFRDA5OERD
-NDlENTYwQzVENkI2MEJENUMxOUYwRTYxQkU1Rjc4NTk2NjUyOTUxNTBFMTUyRkMzRTg4NTgw
-MEQ4CgpDODMyNzU3RUQ3N0Y3QzUzQjMwRkQ3RUZCN0MyMjU4REY2RUYzQUZFMjMxMDlEN0Ez
-NDJGOUIzNDhGRDZGMzZFRjYzQzk1NzFBOTZGNkYKCjhEREExNzgzN0U3MkE2RkUwNTk4RkZC
-OEUwRDVDMjIwREEzRDM5Mzg1MTA5MjNDOTNEQjcyQjI1NzI2QTU3ODg1RDQxOEU4RDZDMDQ5
-QQoKRjZFREUzQTFERkNBOUIxMEIyOEVGNkYxRDA3N0Q0QjM3NUQ5Q0IzM0NDQUJEQkU4NDlG
-Q0MxNThFNjAzRUNCRTdBOTA2MjI1OThDOTlFCgo4OEIzMkMyREQ0REU2MTRDQ0ZCQ0ZEOUMy
-NzI2REMzQjI2NTQ0QTM5ODlGMUU0NzM5OEZBNDZFRDkzNzhGQjA0OEFERTJBNUU0RDM2MjAK
-CjcwOEFFNEIyMTBGQjREOTdEM0Q2RkE5RkE0NDAzNTE1NTg0RDg2RjdDM0NCRjJGNzQzQ0Yy
-QTYzMjAxQUNENjdFNTg5QjZGNTRCQjA1QQoKNEVCODVCOTEzMjhCOUYyMzc1RTU3MTYyMjc0
-MjY4MURCNEY5NDQ3QTJFMEZCQzRCNENCNTFGRDdGOEJERTRBRDJENTI3OEE0NzJEMkJECgpC
-NUQ4OEI3Nzk4MkIwMTc4NkMwMzVCNTdGODVFODlERTQwRTYzNjg3MjhCNzI4M0Y1NDJGM0E5
-M0QzRjVBN0IxRjZDOTgyQkI0M0E1QjIKCkZERUVGNUJEOEM2MTgzMTg2NTM0OUJENkQ0MUVC
-M0QyQjBGOTRDRDEwRTZENzVDMzcwNjY3ODMxMTE5MzExQjk4ODhEMEJFOUU4NEJFMAoKRjE4
-MDk2MEFGREZDNjVBRkFEQ0EzQTlDMTQ1Njk1Q0RGOEM4QUY5MTUwQjdCRTA5RTVDMEVFNjRG
-QTUxMUIyQzhDNkY1QzFCMjA2Mjk3CgpFM0M3Qzk3MzM4NzVERDM5NzZBNkQ3QTJDRkZBNUNB
-RTgxMEMwMkZDQkYyMzQ5RDM0NjM3MEI1Qzk1RjAwRkM5OUE3RkJDOTEwODNBNkUKCjQ5MDFF
-MjFGOTkxNTlCQ0Q0NjQxOTY2NTFEMzlFNjIwOTU1N0I1MkY2MDRGQTYxNDQ0MzdEQUNDNURD
-QjkyRkU4RjgxOTEzQjJFRTNGNgoKQjQyMDZFMERBNkEwMUYzODFEMzQyNDI5MDI2NzhCQzY4
-RjREOEIxQUU3RkExMUE3OTlEMDZDNzJBMzc2MTk3REIyNTI3RjQ1RTJBMUQ4Cgo1MEQ0N0Q4
-MzVDRUM4Rjk2M0E2RkYwQTgwNzc4RTQ2OTE3RTZEQ0REODQxRERFOTA0RTNGQTk2MUVERkI4
-RTZBNUI3QjQ3Mjc1NTgxRDQKCjFFRUMwNDUyREIwMzIxODlCMEY0MDIwN0IxMTYwN0QxNDI3
-RDUwMjExRDc2OTY2MTIyODMyQzk4MEY5Qjk3MTVERjJBMjVEQjhCNzk0MAoKOTc4MzU2NUEz
-QTMyNUM1Q0E2OEEyNDhFNzE0ODk0NDg0NEVFOEEyQ0RCMkFDRjdEOEE0NjI3NzU1NTVFMzQ4
-OTE0REYzMjM4RjBFRUEwCgo2NTc2MjNFRTY1QzI5QjdBRDA3QzhCNjQxM0Y3OEEwQTRFOUZD
-NTMwN0U0MjczMDVDOTVGRUYwOThFNTNFMzA4NzAzRDc1N0YzN0YxOTMKCjc0ODlBRDExMzE1
-ODIwODdEMjRCRkY1MEE5MTZBMEY4RTZFNzFDMzM1RTUwQjMxNjUwQ0IyRkU0MjM4ODQ3M0M1
-NTIxMzM0NjczN0NGMAoKQTVEODgwRDBBNTZFM0UxOUI3NTM0MTFFOTIwNDVBMEU1QzAwNzNG
-Mzc4RTkwMDJEREJFMEIxMEVFMTc3RjMyRkQ5ODcxQjk4RTAyM0U0CgozQUEzNjY2RjQ1OTQ1
-OTFGNkFBRDhDM0ZGRDM3ODA0QTQ1MUYyMUM4NkU3OTRFNjU3RkY1MEY1NDlCOUYzMkU0QjAy
-ODFDMzZBREVBOTEKCjg1NDk0NDYwNjE3NkE2QjNCN0M1NURCQ0I1NjBEODJENTdEMEFDMTM0
-MUYwMzI0MEFDNTZBMTVEODc4RURDMTEzQTYxMjc3QzRERkU3MQoKREI4NUM2RDgyNjU4MTA1
-MDUyRUYwRUMzQUY4NzNGNUYwRDE4ODFCOTdDQUYwQ0U1MjE2N0M4MTlGRTAxRTAwREU3QjQ0
-ODg4N0EzMERFCgo0NTNBMzhCRkUzN0NGQ0NBNEY0MUU3RUVBNUE0MTVGMzMwNTJGRUU2NEY3
-RDIxMDhDMDlGNzlFOTdEQkE2OTk4QTNFM0Q1REMzN0EzNTIKCjkzMzNDRkIyNTRGQkNCNjJG
-OTBBMEE4MEJEQjM2MDZGRDk0QTVENjlBMzJBNUVBMDA0RTk0RTQ1OTc2QTUxNEJCQ0FDMDQx
-RENDRDU5MwoKQ0E2NzNCQzNFRTFCOEU0RjkwNEMzQkJBMkUxOUUxQjU1NTE4QzdENjlCNjYy
-QzExNTg1OUQ1MTEzN0ZCRjJEM0RDMDE5QThDRDZFNkEwCgpDMTRFNDMxMUIxNUZBNjcwMDkx
-QjlDRjhBQkIxQzE5NkI0RTBGQzgyNEJDMkVCQTc2QzYyQTIzRkU4QzhBMzhEMzEzRjk5MkZG
-QUFCMzAKCjU5NDc5OEVFOUM1QzIxNkQ2RTk1NDExQTgyNUZBNEYyOUFFMDVFMEQ4ODNDMDdE
-MjRDNEY1MTA4ODM5RjEzMTM5NTczMURGMzk0ODZDRgoKNEQ4RDY2OEI4NUY3QTU1REY4M0Y1
-RUQzNUY5QjQ5NEIwOTg5ODc4QzMzQTA4MTdCOEM3NTM3Mzg4QzVDNkE2NTgwMTQ4NjZFQzA3
-RDU0CgpDODlBODBBRjgzQTdDNERBMjFERTQ0NzIwNkRENEMyRjIxQTM5QzhDRERDRjNCNThB
-MzMyODA1NzE0RjgyQjFFOTY2MTgwRjVFQ0E5NTgKCjI3QUNEQzQwQTRBNkVDOEZEOUJCMDI0
-RDMwNjhDOTRGRUYyNUU0RDYzMzdFNDBEMkEwMDI0OTRFRURDNzkwNUU2QkFFMzg0MjZCMzQ0
-RgoKNUIzNkVERThGRkU4OTQ2NTI0MjJCMTFBMzIwMjg1OTE2RjRFRTVENjFFNUVDOTg2OUQ0
-OTcyOUEwQ0FCMTM4NzNCQjNFMEYyMEZBNTE4CgpCODEyRTVEMjRBNjQxNzk2RTM4QTE3NjZE
-ODA1QTg5RDlEOUZCNjQyMTQzQzM3N0IzNjVFQzQ1QkE2QzE5M0IzMTI0QzA2OUM1MjU1MTcK
-CjZGMzVFQzg1NTQ2QzE5MzNGMjVCMDkzREQ1NkM3OEFEODZFNTAyQTIzNUQyNzczQUJFM0I3
-QkQ0OUUzREM3OEE2QUVDRjIwQ0U5REE0QwoKODdBRDdDN0U3NUJCNEFBQjc4Nzk3RUI5Mzgx
-OUE1QzhERTY4NjM4RUZGMjgxQjE0MTY2MkE0NjMxMzVEREEwRDJEMjM2REYwRUVCNzA5CgpB
-QUQ5QTU0OUNBQkJDQUM0RTU3N0IxOTU1QkREOEJFQjQyNjUwNzgwQ0UyQjFFQUE0N0MzNTk5
-M0UxRTFGMDUwNTExNDVBOTRDODlEMkYKCjQxNjJCRkUyM0EyQzkxQjc4NDQ4ODVBRDM0NkJC
-ODhFOUM5RjhGQUVERDIwQjZENkU1NEE5RkNGRTNDMTg1NDAxRUZFNThGMjlDRDRBRgoKOEQ5
-REVBNkVCRkY0MjdFOUFFMThEREQzRDFCRkZFMkExN0E3MTM3QjU5NkUyMzlCNzQyNkNFMzhC
-NUM0OEM4MUQxN0ZGODU0NjJCNjQ4Cgo3MEEzQTdDOUYyRjNBRUU5ODg0RDAzQ0RGMzg3Rjkw
-QzVDREI4MDdFMjIyQTc0NEE2MTczMTcwMzg3MDdCRjMxMzBFQ0FFMjY3OTI2RDEKCjUyMTU0
-RkI0MjNFMkZDRkM0MzhBQjY2MDczODE0ODg4MkJDNjg2REI1NkM1MEQwOTJENjA0MjhEOUIw
-MzcxNzA0RDNGQjhGQkU3NUQ1NgoKOUUyMkIwRTlENzY3QTVBOEVCNzcwMkMzNEY3MzIwQzMw
-RkYxNDJEQ0VCOUQ5MTU3Njc4NjQ1QzUxMzkxNjQ3RjlGNzMyOUIzOUMyNDMyCgowMEE4RDA1
-Mjc5NDBGOERBMzdBMzAwQzAxODJDRjc2RjMyMjBCMUU2MkVBQzE4RThGRTBBOEM5M0EwQTVB
-MzczMzg2RTM4MDkzQjgxQkQKCjNFQzNDRkQ1QkYyRTg4QzUxMzIxRDQ1NDA3MzMxNzM1OTI2
-NjFEODVGMUFGRDA0NzM5NTQzQzM5N0UzNjhDNzM1MDA0NTYyNjRCMjYyNQoKMzdCOEVBNkQx
-NDdEMjY0RTQ4RTY1RkM2Njk0RDI3N0U1OTcwQjBGQjQ3MUQ3NjI4MEE3NDAwOEIxMENDNUEy
-MTZFRDA3RjIxQTI0QkQ1CgpEQkNFQTVBNEUwQURBNDgzRjA0QUNENzY5N0FCN0EwQTkwMUMw
-MTkyNTgxRDRGQUJCQzI0NDg5RTNDRjUzNTczNzA0MEIwQzE1QkYyQ0EKCjk5NzAyNkZDQzM3
-RTM2MDg4RDUxM0NDMjBCNjhDOEQ4NzA5RTVENTgxMUI1QzUxMEQ2MTkzQTgxMzIzQTI3MTYy
-MEQyMzlDRkEzMkY5NgoKM0FGNUYzQjU4NTdBQzY4MEQxNDkxREUzRjIyQThCQkQyOTUyRUVF
-NUI0OTYzN0YyNEJERTkyQjVBOTk0Q0Y1RTAyNzFDQTlBREI0N0Y1CgpDMjk4QTM5MUJGQ0I2
-MEM2MzAzMTJBRTg5M0FDNDhGMjAyNTY4REUxQjQzREQ5ODZBMzhBMEY0NzhBRTY0NjVGODNC
-MEZEM0FCRDdGRkUKCjNFRTA2QkY4OEQ1MDE2QkVFMkU5MEQ0MjM4NzIyQTYwNDQ0ODcwODc0
-OEQ2MDgyOTVFM0I0MzVCRjJCNDdDOTFGRUYzODVGMjczMUU5NQoKMUY3M0ZBQkNDODhDRUI4
-QkE0OEEwODdCRUEyREZGQTkzMDFCNjBDNEFCNDI2QkRDMTA0QTI0MTFFRDgzODA4NUZDMDZD
-RTNFNEU2OTA2Cgo0RDdFRjNGMzAxREQzQ0EzRUFFRjQ5OEU2QTdCNEIxQTM2RTk3OTBFN0Y2
-OUVDRDVFODk2NzA1MDgzNUNFNzc5RTNCNDQwMTRDMjdBQzAKCjQ1NkE5NkI5RTI4QzcxRjMw
-MDMxQjQ5RkIwMERBMTk1QTMyQzQxNzVCNkJGQjI3OUZFNDM1RUU5MkQ0RkQ1OTYzRTQyRkU5
-OUQ5NTQzOAoKNzQwMDcwNkMxNzU2N0IxRkI2NUM0RTkwQUFDMTBDQTYyODAzMkUwNDkzQTk3
-MUJENTVEODNFMUFENzBCMjQwQkZCNkVFRERENjI1RDRFCgo0Q0Q2RDQ4OTU2NjhCMTQ0NkRE
-RDIzNUU4REU0NEI2OTRGM0Y5M0FBQzJCQzBEMDRDODcxRkZCRjVEQkExQzdFRUUwQkY2NkM5
-NDlBNTgKCkIxNkY1NTQ5N0U4MkFDRDQwQkUzNTZDQUQzRUJENzA3QzAwMjBBQ0Q0MTBEQzZG
-RkM3Q0M0NjA1MjVDMjAwMUEwQjRBOEI3QjExNDkzMgoKM0E2NUZCNjVCQjdDMjBDQkEzMDVF
-NTNBMzEyRTk3MTlBMTVDNDVDMzlDODVBNEYxRjAwOEMzNjFCMTc1N0RDMEJEOEMxMDIwNEIw
-MjE4CgpBRUFFMjlEM0ZDNTVDMTJFOTk4NUVGMzZBNDUwNDZGNDY2MDY5MjQ2MzZGN0Y3NjQ4
-MEZFRjdGOEQyNjRDNzMyNjZDMDVBNkRFNjk5QjIKCjM3RjZDMURGNzc3MzA2QkVGMUUwQUM0
-OEE2QjE1NDhFRDQxQjdFRENFNzA2Q0M4QTY2QjNEOTQzNzIxMEM5RkNGQUM5NzhDOEY5RkVF
-QgoKOEUyMjBEMDI0QzA0REFDMkNFNjJEQzhBRkJFN0FENDU0MEI1RUQzNjY4RTdCNTlGQkEy
-OEE3RjhEODIyREJFRjg0REZEQjcyNTY2RUM1CgpENjIyM0ExNjU5NTk0NDNBMkY5ODBGNkQx
-NkM4MTg3QUQzMjFDMjdBQUNGODg0MzM2RjdEODE1NEQwNkZBNDZFM0ZGNTFEMkRDMjYzMTMK
-CkZBODEyRjlGMTUwN0ZENzVCODA0MTFERUY2OUZFMjY4QjlBNDU4NzE5NUU0NUIxRkVBQ0Iw
-Mjk1QzYzQkE4QTRDRkQ0N0U3QzcxMTUxMQoKQUVCMDBFOTNDMEIzNTlFQTBERkRBRkY1REZD
-MDg1NEUyRkM2M0FFRkQzN0RGNDczODU5QzA0MEQ2RThEODJGNjQwQzE4MTVEM0Y5QTUzCgpB
-QjNFMUQ1RTFGMEIwRTEyNTUxMEYyQzZENTAzQzRDQTUxOEJEMzY4OTJCODNBRDMxQjM3MzQ4
-MDRGNzI2MDA1NjJGOTI0NkZBMkI1QjgKCjU2QkQ1NTIxMkNBMjdENzAwQTc5MTNBRjUwNUJC
-RUI5QkMzQjJFRUMxM0Q3Mjg5OTk3QUJFQzA3ODgwOEM3OUY2NTkzOUIwN0EyNjE5QwoKMEVG
-REU2RkY3QkFFQUVCQjNBNEEzMjE4NDZGNjM5QTcwOTZFNEY3Njg4RTUyM0RBMTkwMUVBM0ZG
-QjZBNzExMTBCNkNBMkM0NUQxRkM1Cgo0OUFDMzJGMDNGQTVBQTc5MTVFRjQzNzcwQTEzQUE2
-OEM0M0Y0RkEzREVENTVEMjk0MEY3NjY0ODA3NkQ5NTVCNTA5MjE3MjU0MTI4RjcKCjQ2QzNB
-MkFDNDdENjgzRkJGQkUxMjA1NzQ1NDQzNTk0MUNERTY2MjIyMEFBN0IzNTZFNDcxOEQ1OTFC
-ODFBMDZDMDREQ0E4M0E4MTRFNQoKQUZCQkI3NThFREYxRThERjFCRjYyMkQ0RTRCQjYzN0Uw
-MTdFNEU2NkY2MDY3Q0VGMDY1MEVFRDMxQkNCREM2OTQ3REFEQjM5ODIzMjlECgpFOTAyRTUy
-MDYyQ0VEQkVCNzc3MTU3MzVFNjk4RTQwNDQ4RkVDMDA4NDJCQUUzQkFBMjA3RDJCMjhFRDNC
-RkUxQzFGRTQyODQzOTQ3MEYKCjRFMUQ4MzU4RTM1RTRCOTdENjFFQzZBMTI4QjQzODNFQTAy
-NzZBOTQ3QkM5RDE2Nzk0QzNBM0Q3REIwQkI1OUZGNjQ5ODc1RTBBRkE0MwoKRTY1ODZGOEI0
-Q0E5MjFDMUFBRkMwRTJEMUM5NzBCMzgwOTc3Q0JBNTA1QjNENTMxRjM3ODkyODJFMjFEMUI1
-RDlEMzM3NkVBRDdFNEU0CgowMDA4NUM0N0NCODU4REE5NjBCNTVCRUEwN0UwQjAxMkJFM0Y1
-NjIwREJBMTY3QzEwNUI5NUZGOUI1RkREMjhENTM1NEM4NzdFNTY3MTAKCjFENDVGOUFBNDcx
-RDI3MTgzQTU1QUI5QjM0RDYyNjgxNUQzMkNEODI0QTRDNDY3NzJEOEZDNDkzMTM0MUUyMjcz
-MDlFODMwNzgzNUZEMgoKNTM1OUExMEY4NEFENTc0NEI4MTgxREFENTkxNzZCNkI0NjY1OTVC
-NDIzMzE2ODNGNTc1NDZBQ0E2MDEwNjY1NEM5QTFFNUYxQkQ0N0RBCgpGOUY5MzU5OEU3NUNG
-MDMyMTk4RDY5QTFDNEIxNTJBMjk1ODYyMDk5MDNDN0JGMTI2QkRFRTVBMzgwNkJBMTc2NkJC
-MDJGNUQ3NUUzM0QKCkIyQjAxMTEwNkZDM0M5NjRGOEZBQTlFOTg1N0JDQUY5MDM0NjNGQTdG
-QzM3Mjk0RTRGMEZGOThCRUEyMkZCNDRGN0FFNUU2Nzg5NjU4QgoKQkFCNUMzMEQ2QzMyRDVF
-MjRFMjY4QjU0MzUzRDEyNDVFRDc4RDFENzM4NUVCRUVBNDlFQ0U0OTZBNDI2MUY5OTJGNjdC
-NjY0Nzc2RDZFCgpDQTFDODM1MjQ5OUJGM0NFRUYzNjVFMTUyNTgyRjk4NTkwQjhEOTAzODY3
-QjY1NTcyMDBCMTA3MEQ5MUVBMzJFRkRBQjA1ODA1NTlFQjUKCjU2QTgzNUY3NEJGNDU4Njkz
-RjA5MzM4OUVFMUQxQjFGQzFCRDJBQzExNDZFQTlDNUU0QjE0QkYyNkFCM0VGQTBCQTBBQTE4
-MTNFNkM2MQoKQjcwMTFBQzMzMEIyOTNBNUNDRERCNDE0MTJGOTdCQTAyRDM4RTUwMkQ1OTY5
-MTJEMTY1RjZCMDMwMDIyODg5MTIxMERCNzAwRTk3NUJCCgo0NzQyNzM4OEQ1RjMyNDZEODBD
-Qjk3MDNGRTVGMkIyQ0Q0MDg3M0FFMDUyMTg1MEQ0RDY1NjE3NEI1MkYyNEMwNkFGMUQ5RkU0
-QUJCRjkKCjhCNDMyQjYxNTBCMDcyNUUzMjhFNTRCRTM4MkExNkQ1REY2QzQ3RDlERDE0NzUx
-Qjk2RTJEQkNBRjRDOTg1ODMzNkY1MjcyMzhFMjYzQwoKNTg3MzBDN0UyN0RBMUIyMUFBREJC
-NDgxNTRDRTVFOUM5MjY2MDM5NEQ3MjgyRkMwNzkxN0M5MUQwRTkxREFFM0ZGN0RFQ0ZENUU4
-MDgyCgo1NjNFMTY3M0ExNUNGQzA2OUUwOEQ1NTRFM0I4REY1NzAyMDlENTY3QzY1RjNEMjZG
-MjUxQjQwNUZBRTVGNjEwNjYzNzcyOEJERUY3MzUKCkVDMkQ1RTdBQTNGMDA0MzRFQjU4QzMz
-MDdEMjIxQzEyRkVGNkQ3NDFFRDg3MDgxREQ2QjkzRDJFOTI4MkQwOUE3MjYyRUZGQ0NBRkZE
-RQoKQ0VFOEM0RTk0MkFGRkQ4MjE1Qjg0RkE1N0Q0MUY1ODE1RjNBMzE5MUJDMzc5RURDNDU0
-MjUyRTY4OEVCOTc4OEE1NTFBMTc4NzZBRjFCCgowQTVFRDVBNjJFOTJFN0RFMzMyRUQ4OUE5
-QjRGNDA2NTUyRjlCNzA2QTZGQUQ1OUE0MzNGNzJBQjZENDQwMUUyNUNDMzdDMEZGOTE3MTMK
-CjRDODM4RTVDQjNDRDVBRUI4NTU2NDQzQjFCRjUxMzkwMEYyOTNCOUJDRjMzRjk2NjA4RDFC
-MTA4Q0Y5QkM3REU5NUY0QjUxOEE4Njk4NwoKMjhGMjA3MjlENjBFNzVFNTM0NzY4NjgyMjBC
-NjRFOTA1QkJGQkU4RTI2ODA4RUFFQjBBNDZBMUUwOTZFRjg2OEVFNDQxMEVCQzg3RDM2Cgo0
-NjAzN0FGQzZEMTc3RjQyRjhEQUI4RDVDODgyMDBBRUExNDM4OEFGMDlFQUY1Q0EyNEQ3MkEx
-NzJENjU0QkUxOThDQjQyNjk0OUM0RTMKCkQyM0M3RDQ5RjRBRUU0RDIwMTI0QjU4MzA0ODBE
-MEE4Q0QwRjdFRkNBM0ZEMjUxQzYwOUQxMjREMEJCNEU3QTZDRTg5RUE3QzkyRTBFNwoKQjlD
-Qjg3MEUxMjdFMDMzN0EyRTY0NUFFQzI3RDFCMEQ4NUM1N0QyN0YwRjdBQTFFODQ5Q0YxRjRF
-OUJERjAyMjk3QzNFNjEyOTAwMTBECgo0RUIwRjMwNjk3RDMwRUNDRDFFREUxNzY2QkMxMzdG
-MkUyQTNEN0NFRDI1QjFCQTI1OUQxMDBCQTE2QUMzRDI5QzAxREY4M0RGRTVCMjQKCkRDQzlG
-RkMyQjgwRjYxRTkxRDJFNDE1NjAyNDFDMDBFNzlEQTk3MEEwOUQ4QUEyMjlDQzJGNUMxMTRF
-MDcxM0VBQUI1NjA0NDJDQ0U3MwoKOTkzRUI5ODgyRTdDMDI5MkYyNDhDMDA3MTdFM0ExREE0
-NkFCRjNGQzcxNjIyNkVBQUUzNUU4RjIwNzI2QjFBMDQ1QTIwRjgwQjAyNDczCgo4QjdCOTNE
-MEU3OUM2RkExMTc4MEE2Qzk0RTY0REU1M0ZFQUUwMTlFNEQ4Mzg2MDdBMDVDNzc0NkEzMzg1
-Qzk3MjhDQTI5RDhGNjQzNzMKCkIyNTMwNzI3MkE3NzAyODgxNUQ4MDQ1MTA2MUIwMTBFQzhF
-ODJCMEI3MDI0M0Y2NkI5N0FCRUQyNjRGN0I1M0IxNjNERTgyMDQ3OTZCQwoKQzU5M0NBOUJF
-M0Y0M0UyNjcxM0RDQkQ5RTM0NDlGRDMwMEY2MTExQTUwRUREMkY5Q0NCQzZEMDAxMkE5NzNC
-NUY2QTE2NTEwNzRGRDE0Cgo3NkJGNjk0NTY4NzBDNTIyODU5OUZFN0NDMDk1OUY2ODA0NDk3
-QTI4RTNBQUIxMjkwMjQ4MTZGQkQzQzAxMDFBOUI3MDlEREUwQTkyQUIKCkYwQjI5NDhFMDk2
-NjI0RDA2N0YxN0E4Q0YyRTgyNTFBNDA5NjlFODU3RDg2NzM5ODgzQjZCNDY5NjdFQUMyMjg2
-QkQ0NTFGMjZCNEExNgoKMDI2RkM1RjNBMDg3RjRCRTIxQTkwRDMzNkI2OUM1MTE3RjNBRDUz
-MkFGNkUzRkU5QzhBNDg0RDM3MkExQzhDMUEzNDIyNjREM0MzNzgyCgo0RjNCNTgyRDI4ODU2
-NDJEMkIzNDQyMTIxQTdGM0JGQ0JDQTM1RDA5REFGQzRCOEFBOEJBNEUwQzExMzlFM0YyOUFC
-RURFQTgyNzMyRDYKCjM4MTBGN0ZCMkE0NjJFMTFBMzJERjJFNzQ5MDRBQzdDNTcwNEM1NDVG
-RDZEMDhENkQxRjZGMDdDNjlCRDU0MThFODJGNkIzM0MzNkE5OQoKNTA0NEJBNjYwQURERUIy
-NEM3QUQxMDg4OUNCNzg1MTY5OTYwRjhFNkVFRTlBMzIxQkFBNzg3OTRBRjA4NjBEQjUyNzAx
-OTNDREM5QzBECgo1REFDNDVBMUU2N0ZENjA2M0ExOTk4RDA2MjRBNUREREVCQURDOEM0MjMx
-ODkyOTUzNUE2OTM2Nzc2NzNCMjRDRDJDRDI4NjkxNDhEQkEKCkMxRUE0ODZERUIxQjBEODNF
-Nzc4NUYxRTFFRTY1QjlBRTNDODM5Qzc0MjcxMDhDMTNDNEI3RjY1N0JBOTY2OUQxRkQzRTNC
-RTVGRUU1MAoKQUEyMDk0NkVFMTczQkRDMEE5Qjk0MDc0NEFFRUEzODQ3RDU2REU3RTg2QURE
-RDZGNjMwMDBDQjA0ODQwNzA3MEFGNjVFNEJDMDk3MzQ3CgpDRDgyRjYwODREMjBDNTI5RTM1
-NDkwNDkyRTUyOTNGOTc1NTRGOTk3OTQwNUNDNkZGN0Y4MDFDQzNERUE1MERBRjlCRkVGRTg2
-MjNCMkMKCjhDNzU2MDc2NkM0MTE1RUVGQTQwQkY5ODA2NDdGNkQzMTg3QTY4OTI5NDA2MERG
-QzIxNEUyMjQ0MTA0NENCRkJCMkI2Mjc0RURENDRGNQoKMjE4MDU3ODY5QTQ2QzUxNzEzOEU0
-Rjg0OERBRDY5RjI0MjA4ODk2QzhERjg2MEYwRkY3MUVGODkzMTBGMkQ4MkVCN0FDRTZBNzI5
-MjhCCgowN0NDNTdBMkRGNjQ0Mzc2MUQ5MTI4M0I1OUJEMDA2NjUwQ0RGRENFRjhCRDY0QTBG
-NjI2Q0VBRDc3MDU3MkQ0ODlFOTE2QUZBMUFDMjYKCjhGNkQyMkYzRjM3QjYzOTI4NDcyQjgx
-RUJEMjg3RjY2MTk5MDBBQjVCMjkxQTA0NzkwNkFBRUUyQ0Q5M0Y3RkRCRjE2NThERkVCOEQ4
-QwoKRDdFRjk4N0QwRDEyMzVGRjhERjIwMkY5RTgzQUQxNTQ1MDA5MDk5OTZGRURFQ0RFMEVC
-QjJGOTVGNjk4MDVFRjFGNzc0RDREMTQzQUFFCgo5QTUwQjY0QkQ1MTREODNEMDBGMDU3MTVG
-MTYzQkM3RjY0QjkwNjYzQzU5NzFENkE1MzkzQzFENjAxMTk3OEVFRkZENTdBN0I5M0ZBNTcK
-CkU2Q0UxQ0JCQTMxREQ1MTA2OTZBMzQ0RUJERkFDREI4N0FGREI2RjQyNUJDQzEzQUQyNDVF
-OTI2NDQ2Nzk2MEY5NTFBRDc5N0FFOUQ5RQoKNjMxMjY1RUQwRjEyRDRBQkIwRjYxODlGRDk0
-MzNBMjM2RjAwRDAxRkEwMzhENUJDRkIzREY2ODM5NzYxMDcwOEE3NzdGQzMwMjFCNjg1Cgo0
-NDg0NDVEMzI2RUE3NjQ5NDA2QTg4REEzOTI4NTdGRUE2MTU2Njg0RTM1NDdFOEM3NTdCQzM4
-MjIzQzBDQTI1NjlCRTQzOEQwM0I1NzUKCjcwRTgxNUQ1OEJEODJDMkVFQzg2MTAyMEMxREJG
-MDczRUZEOUM4MTM2QUJGMjYzNDYxRDNBRjc3RDA1N0Y1MDIxNDkwNERERTUxQzNBMAoKNjFB
-M0ExRTFDRkU0MTNFOUExNDhGMDVBODEwODYwOEVGN0ZEQjk2RjM5MkU3NEVFQkM1QTREMzU0
-QkEyQUU1Njc4RDI4QUVDMDE0OTc5CgoxMjg2MzA5ODRFRjNENTU4NkRCODc4M0YwNjAzRDcy
-MTA3ODJERTk3OUMwN0JFOERENTg5QzcxMERENDQzOTQ1NjlCOEJERTc3MEJEOTAKCjM1RkFG
-M0NGQTQ4MDcwQzVDREM4Q0JFQTJCNUFCMjYyMEQ0QzQwODE4QUQ3NDA5NjZCNzMzQjk5RThD
-QkFCNDkwOUY1RUY1QjU1NzVFRAoKMEE4Q0U0NjM1RkJFOUQ2OUU1Nzk5OUIyNzM5RjI4MUNB
-NEJFRUQ2RkYyOTQ4Qjg2NzA0NDZCQkIzMEQwQkE2Njc5QUEzOEMyREEyQTMwCgo5NjA2ODdG
-MkRDRjBDNzQxNTM5MTAyOTY4QzhENjU4MkU1NTk3NDgxMTYzMEIwRkQyMDkxQjYzNDc3NzQ3
-RjQ1Q0EwQURDMjMyMjFBQjQKCkMyRTk0RURBRDZGODYyMTE5RjEyN0E3OUEyQkMwNzMyNTRF
-OTQxQjM3QjgzMEU1RkI1MDRCMjZFNTgwMzIwRENGRDVCMkQwM0E1QTZCRQoKM0M5MzUwMDMx
-RDdBNThGN0IzNTFBOUY5MTdBREVGQTcyRDgxNDkwQjMyNUM0QzFFMzkxNzVEMUQzRjczOTRB
-MDA5RDA0QTdCNzA2RTFECgozQjZGNjFCRUEwOTZDRjREQzUwRTRDNzI5OTk2NjdFRUM4Njkx
-MjVCM0VCMTUyRTNFNzI0MDk2OEY5QjkzQkRDOTFDQzVFNjI2NTREN0IKCjQ2RTJFNjBBNEQy
-MjYwMzIyQjU2M0M1NDNEOUUxNzFENUYxRTgxNkU3MzIyMjcwOUExRTJGMTQxMTIyMDkwODk1
-NTREREVFMTdDQ0IxQwoKRjA2NkQwQUExMzg3NTI0RkM0QjJCQjQ3MDcxNDA3NDI4OTAzQTFC
-OTcyMUQ2Q0U0MDQ2RUMyRkU0M0I5Q0Q5NDA5QkFDNDFCNzZBMjdCCgo4RDRDRjNEQTQyRjlE
-RDhBOEE3NTFEQUQxMDNGMTY5QTE1MjREMDc4MDAyMkY3NjRDNDlGRTlCNDRBRjgwRkFCRkU0
-OEJGRTQwRDYyRDQKCjFBQTA2MTgyNDVBRDdCRkFEN0MxMDVBM0MwNjQ0OTNCMTA5Rjc2NUVC
-MDZCRkY1QzFDODEzODI5NkM2MzVBRDYyNThGQjA4OTRDMkRERAoKQkQzN0M0NkZEMjIzMTFE
-MjY1QUU1MENGMzkxQzg1RjZBREY1OTE4MUVFQUI1QjY1RDFGODExNDlBQTU0MjVCMUMxMUE0
-MzIwMzJDQUEwCgozRUIyRkE4MjA0RTlCQjY3MzY5OThERTlCMTJFOUUzN0VDNjUxNTYwRjRF
-OTA2QjM0MkE3MjVFMjEwMjFCODJCODQyNDlENUMwRjZEOTYKCjMzQzQxOTYyNzlFNTY5REIx
-NjU4NTg0M0Q2NUZBRDBCNUQ4OTNCQjBBOUQzODEzMjRGNzZCNjFEQTg4REI4MTg4RTU5QzRC
-QTE1RUU1RgoKQjI4OTJFNzI2MEY5RUE5ODYxRTQ0OTIxRUNDMUEyN0Q3OUIyNTA1MDYxNTg1
-MkM4MzhCQzNCREI0RDlBM0I4MUFCMkRGRTc2NjdFMkFCCgowNTkyRTREOEFDNDE3MjAzMUUx
-Mjc2MEYxNEFFMUMwNThGOTg2QTIyNjk5RTAyNEU2QzZDQjUwQTQzMDY2RjFBMDMwNEFBNjdB
-QzQ0Q0IKCjM3OTgxNEM3OTExMDNCNkMyRDRDMTQzOUZDMzA0NkI2MTFGNjMyNkE1QkJFNjk3
-Mzg0QTk3NkQwRDAxODE1QjkzM0VCNDczNDk2NkQwNwoKRTFENTA5NDcxQkZBRUVGQkQzRjk2
-ODlFQUY4MkIwRTlBQURDMjM2OEFFNTJBQTQ4RjAzMThBQTFCQ0M4MUMzRjJCODlENDhDMDhB
-MUY5CgpCQTREN0NFODZDNUU5MTNBODdBMDU2M0Q3NzkwQzQ3MURENDdDQkRCMjczQUEzN0NE
-NERFNkJGREJBNDA3NDgzREUyNzVGRjU3RkFGOTMKCjIyNTkxQTg1MjNFNzdBMzM0M0NCNjEw
-MEFGQjYwMzUyMjNFMDVFRjM1MzAzMTM4ODVGRkM2M0E4RDcyREUwOTlDNTBBNzc0QTYwMzA5
-OAoKNTlFRENCM0M0RTQyNEM5MDczRTBCNUIzMkQ5ODhGQUQwNEVCNDg2RTY1QTNFQTdGRjdE
-QjNEMkZERkFCQkM5MkRGNkM3NDJFQjZGMDlECgoyQTc4Mzg3REMwQ0E4NTYxNzQzQ0I5QzhB
-RDk0OTQ3MkRBRUM2NkFDQURENDM1QzgxOEQyODEyNzc3MEE4REEyQTUwOTBDRUNDQkUxNkEK
-CjUxNkQ3OTg1RDdBNDlDN0VFOUQwODg1NDQzNTAwOEFERjI1MDQxRThCQTU3NDQ1OTFBQjdF
-MjJEMzcwNUVBQ0JEMUQ5QzYzNzhGMTcyRAoKQjgyQjJDN0JDNTEyOTNGNDAwNjQzMDZGNjkx
-MDNFNkEwQkMxQzEwNDZDMkEwQUZBMkUwMzg1NTBDMTk0MzU0RUI4RTI2MzA4NUU1MzkwCgo3
-NDlFMkM5OEY0M0VBNjhENDY2RTQwQzVGRUZFNjc2NDkzOUNGRjgxNzgxNEI4NUJBOTI4QzU4
-NTlEMjA3MDlENzhDRDUwQjk1N0U4MDkKCjBGMzdDQUUzNkIxODFDMzdFODBFOUU4NjkwRDJC
-OUYwQzM0RDIwNEI4RTRBNUExNjRDQUYyRkE0RkM2QURDRDc3NTA5RUFBNTIzNjIzMwoKNkU5
-REJGRDFGREExQ0YzMkE5RTk4MERDQkY0QjdDMzM4Q0QxODM5OUFDRTUxMDg0MzU3NjdGRUE4
-NDE0NTg1REU3QzNFMDg1OTBCMzdDCgpDQTAzMThBODJDNjlBRERGQ0VBRTE1NkU1RDFGRTNF
-Rjk1MjY1MTVGRUZGMzU2RTAzNTFDREQxRDNBRDM0MEU3NzI3QTQ3ODI2NERGMkQKCjQ5MTI1
-OUYwNUE2NTA0MDkzOTQ5NTAyRThEMTAyNTA1NTZCODdBQ0JDQTdFQjkzOEM2MkJFMEQwRERB
-NEQwMkE5M0UxODc2OUI4OTVDMAoKNEU1RkMxQjIyOUZGNEEzRDcwNzBBMDg1NjI5MEJCRkYz
-NDYwQzVFMUFGOTIzNDZFNzg3OUYyN0RDQ0Q4QTUzMzg3OTE2NTZDMzc2MTI4Cgo0MjFEQTRC
-MDdBNUY5NjE2MEYwNDIxQUUxMEMxRjE2NzVEMzk2QTgwNjM1QjdDRDFCRkE0Q0M1NjQyNjNE
-QTVDMEM4NEYzNzg3REM4RDAKCjhBQ0FFREUxMTQ4NkMxNTVCQjFCMTY4MDYzMDNCOUQyMTk3
-NENBMTk1MTZDNjM0MDJBOEYwMDY3Q0VEQUY2ODJFQjJBMjEyNzM0OERCQgoKNUE2NjJCNUU4
-N0E1Mzc1QjM5NkIxMTUzQjg0MzMwMzUwMUVEOTM1MzRERjdDN0ZDQTA5RUZCMDI2MTMxMTE1
-NUZDQkEyRUE5NzY2OEE0Cgo2NUE3NzUxRjkxQkNBNTY2RTQ5NDY1NjVCQTFENjY0Q0Q4RkVE
-MTlFODRFNzU2MzIwNUREN0FGNzdFMkE0Q0JDNjg0NkVGNUFEQkQxMUYKCjE5NThFMDg2RkQ3
-NjczRDVBQzk5Nzg2N0VCMDIxNzMxNEYzMkQ2MDM0MkZBQUZGRkY5NTdGNjBEOUIwQUM1N0U2
-MTExMzdBQzY5NURFRgoKRTMxM0JFQjUzMzRCODM4RjgzQTU0QzNFRDc2QUM1NUM2NzU3MUYz
-NjdBNDA5REEwNTJBMDM1NDgzN0JERUU0RDExQjQyNkRDOURDQzc0Cgo2MUE2RjQyMkI5NURG
-Mzg5NEEwMDJCMDJCRERGRTNGRUJBOEQ4RTNCQjc1NTZGNTAxQTgzQTEwRkIwMTM3RjQyOEZD
-NTIyMjYwRTBBNEIKCjE2NTUzOTk0OTBEQTgzQ0NFQUNFRDE0OEFGMUY0NDdDOUJCRkUzQjE1
-OTM5OUM4MkVBQjI1N0JFNTY4QTREQUQ2OEE2NjRENzM5NzM0MgoKQUFFN0QzODIyM0NEOUFF
-RkNGRTVFMzk5RjFENzA0MDRENDcwQTFDRTEwRDQ2Q0FGRjVENTIyMzUyQzUwREI4RkFCRDcz
-NDhGQzZDRUM4CgozNEQ1QTgyQzA0RERBMTA1Rjg1RjQ1MEU3MzYzRTRFOTg5QzY3MjVFNkJC
-Q0Y3QUE2NjgwQzk3RDEyOEZBQUY0RDZFMzg1OUYwM0IwRjUKCkEzQThBNzBFMEM5REFFRTg0
-QkI5NUY0MTkzMUEzMEFBMThENkM1MUQ5REQzRDNCMEFEQzdEMEI1RkYwRDBBODg5QTk0NEM0
-NDY4Rjk2QgoKOUU1OTUxNUJCQTVDODZCREM1Mzk0QkM0MEI4MENCREExOTg1N0U5REZGNDFF
-NzU4MDJEMkEyQzAyNDcxMjJDRTk0QTdENUREOEY1ODQ2CgoyN0FDQTBCRTVDMDQyQTAyRkI3
-MzYyQzM0NjE0QkNEMTczNTBBRkIxRjBFRkRCMDlBRTJGMUMzN0ZGMjFFMDA3Q0Q0REYxNzI5
-QUQ5MzIKCkZBMjBBOEY4NUMwNjIwMUY5NjIzRDk1OUI5RTRBOTBDRDA0QjZFNEFFMkMxNzk1
-ODI4QjAyMkQ5OTBEOTM5RDVEMTk5MkNCMkRCODA3RAoKMDcyQ0VFNTgwRkE5QTc5RjA3RkQ2
-QzQ5ODBDOTk3RUM1MjRCNTdCMzUwRENFNEY5MDEzQjVCQjA3MTY1REQ2RkExOTAyODY4MzI4
-RkE4CgowRDNDRDc3MEI3ODM4MThERTUwOEU1OTM4M0M5NkEwNUZCQkE4NDA4MzFFMTI5RjBE
-QkREN0I0QUIwNTgwMUU5OUU5NjhFRUI3QTAxMDYKCjVBRjA0RjExQzY0MUNBREJFNzQ1RUI2
-RUE3NkNFRTFBQTg1MjRFNDA1RjIzQTlEMDY4Mzk3NEE3ODg3OTI5OTYwMEJERDA5MjRGQkYx
-OAoKOTA4NjI1ODcyQTYzQzM4QjREREJCQzhDNzY0RUJEOTlGMDg3N0ZBREI1OUI1RjFENEZE
-OUZEMkZDMUZDOEM0RjA2OEI3QjIxQjM3ODdGCgo3MjhDRDhDRjVGNTJDRTRBNzYwNzQ2MjQx
-QzRBNjk2RjZCREJBRDU4QTREMzUwNDFENzQ0RkJBQkRBMkY4ODNDQjQ3NUU1Rjc1RDFFQ0IK
-CjkwNTZDM0U1Mjg3OEZBMEREREFBMzAzNTc5MDY1NDNGODQ0MEQxRkVCQzAwMDI5NzY3NkUz
-QzVBRDQ2MkY4MjVGMUQzMDJBMkM3MDIxRAoKNUE2MjU5NTM2M0E3OTFBOEVEQkIyMkVEQjlE
-Qjk2OEJBMEVFQjRERjY2RTQ2MjJBMDRFQjlGREIwNDFERkI1MjdDRDQwNEQ2MkU0ODk4CgpE
-NUU3RUQ0NjRCMEMyNEQ1OERBRkNBN0U4OTE0ODEzNjM3NjFEODAzQTk0NTdCN0EyNDAzRTE4
-MTZGQzY3MTY3NTcxRDQ0RTI3NDY5RTcKCkIxQkMzQUI4NUNBRjgwOEJCNDA0MzUzN0QxQjgw
-Q0M0OTA5NzBEODdBMjA4NTdEODY4Q0JFOTAxMDc2NDE5NDM2QTRFM0M5NUM3QzlCNgoKMEUz
-Q0VBQzdEQjE5ODU5RURFMTQ5RkYzRjA3QkE1ODZCRTEyNjk4RjVDMENDOTgxNUZGMkE2QzYy
-RjdERDk4REFDNjM5MDg0Q0E3MDAzCgpDOTlCOTE5NkNFNkE2REM1OUNBMEIyMDJDOUFGNTQ2
-MjBFMzhBMDcxMkFBQzZFMDFEMjcxMUQ0MEQwMTJGMTVEQ0M1MTY0NzcyMUQ0RjcKCkYzMUUy
-OUU2Q0Q3RUJCNTk4NDJCMDFCRkY4QzdDNDI0RjBFNThENEZEMTVENTZEQUU2MEE2NDUwQUYy
-MjU0RDM2OENDRDA5Q0MzRkE5MAoKMTIzQzQ0RUQ0RERDRDdGMDlENDZDMTM1NEU1RkMxQTZD
-MTkwMUVGQkRGQkQ0RDZBRDgwRUU5NUVBMUI3MjZCMjMwOUMwNzIwNDI0Q0QyCgo1RjcyRDlF
-NUJGMzhCNTEyNzFGRDIzRUVBOTMwMTMxMTRCMzU2MzcwQTNDOUQ0MzhFQkZBMDU5MDE1ODY1
-NEUyQTNCN0Q0Qzg4NzkyMUMKCkY2NTM4RDFCQjI5NENCQUM3NUNBNjZDQ0RERjBCN0Y3REYx
-NzQ4OTQyQTkwOEMwN0VBMTNFNkI4MDlCMTM1MEI5RDczQ0VDQURDOThGQQoKMzU5MzNBODFB
-MzRCN0E2RjhFREM3REMyQUY2MEIyRjA2MzI5NjJCNDAxQUFGRTA2Q0JDOEVBNERDNjM2NDA2
-RjJDRUQ1RkFFN0FEMEQ5CgpFRDUwMjM4MTM4NTVBODMxMTk0MjNFNEExMTRCNDEzQzNBMDE2
-OTY5QTc0ODFDRTQ1RTRFMDYxRUQ5OTgwRkQ5NjE0MDRCODk1RDVBN0UKCjE2N0I0RDMyRTE1
-M0RDNzc4RkNGNURBNUVERURGNjhENTcwNzY3MUIyM0RGMjg3MUM2M0ZEQkQ2RjlCOUJDQTlF
-N0JCNzc2QjM3MTA3QwoKMzg0ODQ0NTNGMjRCNEEzNDIxQTIxRDg3OTdEQjgyMjIzNkNBMUEx
-NUQ4NzE5NzI2QzU5RDUxRjczMzIyNTlFN0NGMjNGMjhGMUQ5MDNGCgoxMDBGOUIwRThEOERF
-NTZDQTNBOTlDQTVCNDBEMDYyMkNDNEQ1QUU2QkE3NzExMkNFQTc5QjEwRDBENUE4MDhEQTIw
-RDc2QjU2RkM0OTkKCjIwNjU4N0Y2QTBFQkVDQTEwQUY3M0Y4RTA5MUQ4MjYyMkJGQUJDNTJB
-MjhEQ0M4QzI5NUEyNDA0MTg2OUU2MzYzQ0Y1ODk2NzBEMzQ3MQoKMUYzQkU2NEQwMkM4NjEw
-NTlGQTlEMTAwODFGRDJBMEVBMTM3QzM5QUNGQjJBODNEQ0M5NDg2MTk1RTQwRTk5QzBGMjg0
-MThCMkMyOUMyCgo5QzAxQThDRTREOThGMjlBMjJFNThDQUE1MUU5RUNBRjRDQTg1RkI1OUUx
-OEMyRTUzODczQTY0MkUzMUJFOEU0NzU5MURBNkVDNkQ3QzQKCkUxMzA1NUI4RDA4RDZEMUYw
-NjA4QTEwODBBMzg4MzEyODBDOThEN0Q0N0NGRUJEMzI1ODQzMkFDMzk2QkJGOTVCNzdFOTQ3
-MEJBNEI2QwoKOUEwNTJDQzhFQkQ3Mjc3QzNCNzg1MTRCREM0OTE1NzBCN0Q3QjQ3M0MxNUND
-RUVDQjREMzEyQzc3NUJEOEQ5OUU0NkVCRUNGNkMzNTMzCgpGRkZEM0U1QkVGOEQ3Qjk0MjQ0
-NDc5OTlBOTFDRTE4ODA5MThENzUwRUEzNDVFNkExMDc3MURCRUJEQjFCNENDQ0UxNDc0QzA3
-QTlDNEUKCkE4OTQwMTdCQzU5MzAyNENDMTZCNTk1REJDODM1RjRFRThEOUFERjdGRTg2NzFF
-MEJERjM2NjEzRkU3ODQ0QzU5OEE3ODlDQTc4NEI5QwoKOTdBRDIzNjFEN0NEQ0IyRTlCRDQ1
-MDMyQTM4RDZCMEVGREZDOEY2N0ZFRDhFQjNDREUyODBEODFDNkRDOTM0OEJENDhDQzU4MEQy
-OTU4Cgo1NjU4QUNENEMzREJGMkQ3RDg1QTc4QkNFOTUxMkQ3RjdCQzJFREY3Qjc2Njk5NTQ1
-RjNCMUJDQzIwMkY1M0M4MTIzQjE1RjQ2RDhGODgKCjEwNzBGMTIzMkNDOEZEMjEyRjE1Nzg1
-RkVDRkM2QjgzQzBGNDM5NzE2QTg1OUI2NDIzOUMxRkE4ODBEMzJGNjIzNzZFRUIxMkVDNkMw
-MAoKMjM1QzlENTUwQUZFODRDOTgxMzI5QjRCM0RGMTdCQzBFNTdFNzJEODkwNThEMUQzRTZF
-REE5MUVDRkVDMEVDRjBCODAyRDQxQjRBRkNDCgo4REQyNTBDMTNBRUNFREVBQTFBMEE2RUUy
-NkYzMzUxNTcyODQ5RkY1RTYzN0E4OThEN0IwQTA5OUQ4NzAxMkUyNzQzOTZBMjdFMjlBMjEK
-CkRCMjk1ODRFRDcyRkI2MTRBMzE3RTQ3QzYxNzdBOUZCQjJFNTMyMEJDRDkwQ0MwODZCN0RD
-REU2RUNFRTAxRjU5NzczOEFBRERDN0Q5RAoKMzNCMDJBMDlDRUNBMkEzODlGMTZBQURDRDJG
-QjAyRUYyNTdCQUIxMjY1RUNEOTdFMjVGMERFMUM4RTc1MjZGQjVGOEMzMjhGRTM3MDc4CgpB
-OUQwRjMwRDgxQjkwQTk3QTc1MjUwNUM4QTJGOEM5QzcyMjZFMjQ4QUZDNUI0MzE4RUI0MDdC
-NkE1RENFMzNGRjUzMDk3OTQwNzM3MzcKCkY3MkNCNTVENzNGRjY2RUUxQzA1NUI5QTNFNDkz
-MDJDMTFENzI0OEYzNkNFMjU3RkIwNTE2NzQyNzRENTFDQTRDMERFMUY5MjdBODgyRAoKRjU0
-QzU2N0I3M0ZGMUQzODU1NkNEMjI3MTZBM0YyNjlCOUZEREQyNjFGQkFFNEE5MTZFMDgxOEVG
-QTVDMTkzQUEwMDQ1NkRCNkY3ODQ1CgpGRTQxRjcxNUE4QzAwMDBFNkZBODE1MTg5NUIzRjIx
-REQ5QkVGOThEOUNGNjc0QTYwQzhBMTA4ODUwMkM2RTA5ODk5RDY0NTZGNEFFQzkKCjU4NzUw
-NjhFMjlFMjE5OUVDQ0I2MzJGN0E0NTkzMjQ1MTJBM0JCRTZFNjUxMzIyNjNFRTNBNEUyRkI0
-MjA1NTgwRjVERUUwODNGRDg0RAoKNDhBQkE4RTNDRkU4MUZCMTQ2NUQzMDI3RkM2OUMyNjA1
-OTRFRDM4MEM0N0I2QUUzREMyRTM1NjYxOTA2RDk4QzAxMjZGQjdBODBGQTNFCgo5QTJERjcy
-N0FFMzYwNDhGNkIwODNEOEQ4RDhCMUE4MDI4QjA3M0I5NkNFNEI1NDQ3MDUwNjY1QkQ5MjZE
-NUExMTUxRjNFMENENjNDNjAKCkZBNzdGRjI3NDZENEE5RTNFMEYyOTU3NzA0MDhDRjM0ODY3
-MkVBQzQ3NzI0NTgxMjVBODk3NkJBQzc1NDY5MDI1QjVBRThCQzU1NTQwRgoKNDEzMDhDRTMx
-RDI3MzY5MEM5NUQxMTczRjA1RDk1M0ZCQTI5MDJFMzY0ODg1RjgyMUUxNEZCODE1M0M3NDlF
-RkYxMDAyNDdFNEFCMzE1CgozMjFEOUMxOTJFNjhCM0ZEN0I1MTU0OUIyMjI0MTgzMTk1QTU0
-OTAxNkQyQTRCRjk0M0YzNzE4NDc0M0Q2RTU1NzVGNUExOTJFMjMyOTAKCkNBMjI3RTI5RjlC
-RjE1QUJGNEZBRDM4OEE5RkI2ODlBODA3QUFERDQ0MDQ4MTkzQjVCNUI4MUNBOUY5RDcxOTU4
-MDNBRTAyRDFBNkE0OQoKMDAwNzRFNDczMTM1NTRBNEYzQjg0MkYwODA1MTBDRTI3NjQ1QjY1
-QjU3NzYxQTM2NEQwRjg5MDExNUQ4ODM0RUVCREZBMjQ3OTIzQUUxCgozM0FFREY4QTQ2RjFE
-MUQ0MTAyOTZFMjVFNzlDMDFGNjY0MTM2RDhEMjE5RDMyNEZBOUIzMzQ5QjFENUQxODBDMDI1
-NDgxRUY5RTdCRjEKCjEwMEYyNDJFRTE2RUY0MzMwNTQ5MTNFMEVDRjI5QzRBMDgzMEU5M0ZB
-OTg5OEY3QjU1MDVGODdCRENDMDIxMDE1MzFDN0M5QzEwN0JFQgoKMEJERUNBRTVBNDlCRUI0
-NUQzQkMwRDg2OUI0NDFCQjQxQTY0QTIyOURGNUE0MENGMjU4QjAxNzgyMDNGOTEzMThEOTdE
-NTI5RDkyMkU4CgpBODJEMzZGMzRGRkY5OEYwQjBEQzA5ODQ5MDNCOURGRTg2OTMyRDk2QkMx
-NkM3NjZGQkFBNEVFODQ0OUREMUJBN0RFOUFCRUFENjg5ODkKCjhCREMyMTU1MzYwQzYzMTQ1
-ODU2OEU2M0I5MjlERUY5ODNDNkU1NkI1NjMzOTRCMjVBNDRCMjVERkUyQ0JGODYyNDREMjY2
-RTQ0QjZEMgoKREExOEFDQjRCMkY1MzdEQjY0MTEwRkM1MTg3RUNFMjBBNTE0Q0U2MTIwOTk1
-NkE2NTU1QjM1ODE4RTQwQTcwMzZCODQwMkM2RTdGOTU3CgowQkE2OUJEREZEOENEM0M3NzQ3
-OEVEODQ5MUMxQjcyMURDNjYwNzhDNTkwOTdGNEYzMjhCQTQ1RDc3MTFENUYxMDVBQjhFNUMw
-RDNDNUMKCkY4OENDODVBMkFEOUQ2MUIzOUI3RDVCRkQ0MUREMjI3RTUwQUM4MjQ0QTAwRDlF
-RkQ2QzEzNjc5QjQxNUIwQTBEQUZFRjg3RjJEMEU5QwoKRTFGRDgzNTczNkRGODY1QzE1MTYy
-OENEOTUwRTdEQkMyMTZBQjM1OUQ0NTc1QkM0NkQ2MTBENkQ0QTBCNTAzNTE5NjY1NDFENjBE
-MDc1CgpEOThDMUUyOEEwNjAyRjA4NzZDMzg3NzA1MDI5MkUyNDY5QjY2Qzg0NzM0MjAyNjZB
-QTg1NTVGMzlGMDFBOEMxRUEzNDNFM0I0MkUxQTgKCkYzNjJERUMxM0U2QjFDQTIxNTBCNTRB
-Mjg5NkQ0MTNDQkFCQzM3NTE1NTg3NDAwOTk0NjYyRjlEODkyQjFFQ0M1NjE3RDMwOURFOTk1
-QgoKRjg4MUJCMjdCMEQxRUI3RUM4MzE4QURDNzY3QTc2RUNFMzY5RTAxQkE4REIzRTQ3OTdB
-NzhGQzgxQTA4NTJEQzNGRjM3NThBNTE1ODlECgpCQjBDODk4MUNCRjc0MDc2RTgzRjQyMTA5
-REI4RTExQzlGQTA0MkExM0Y3ODY2RDM0MTM3RDAyNjgxQ0NDMkE4QTI0QkRBNDZFOURCQUMK
-CkJGOEQ3NzFCOUVGRUE0MTYxNjg5OTJENEEwQzU0ODk4NDhDNUZDRUVCNkZFRUQyNjBERjlE
-MzlGNTc2RUUwODQ5MkI1QkUxOEUzNEQxQgoKN0M0RjA1QTgyOEIyQTgyMDU2MzQ0MjhGMDE2
-OUI1OEM5NUQ2MDE5Qjg5OUZDRDE5MTBCNDUxOEQwQjYyODYxRkMxODAzMDgzNjE3ODU4Cgoz
-RDMyNzM1NTVENTQyMDZBQjk2MjRERTQ2NThDQ0FGM0ZGMkRBOEREQjA3QTAwNkY1NjlGMDVB
-RTBFQzVFOEJCQTY5RTMzNkI1QTFCQjAKCkE2MkM0REVBMEFDRkFCNjk0Mzc0NDg0RUIzRjUz
-MTgwNTQ0NTAyM0NDQjJBNTg4MzJBQTkyREE1MzZGMDU2M0FGQzMxQjBDNTM5QzU2NgoKODI2
-MzMzNjZCNEQ5REQ4QUZGRDA3MDcxQjhBMTcyMTIzOTAxRUUxMDRFMEE2QUUyRTNGRTdBRjIy
-RjIzQzNFNDQyMEYzQjFDMjZDREZGCgoyNTUxODZGMTAwMkZBNzgzNkJENDk2MzdDNDgwREY2
-ODZGMkZDRTgxQzNDQUQ3MkVFQzkxMDQ2QTNGMjU3M0YzQTY4NDQ0MThGQTQzMzMKCjk2RDI0
-QjQwMjcyRTNCNTgwQjY2RUZCMkFEQTRERUZBQjZEQUQwM0I3QzJCRUQwOTEwOEEzNTNGQzY4
-QTc3MDE0MzY1QkNFRDU3RkI1MAoKNUZDNzVGNTlDMjQwMkZEQzI0QTg4NkNGN0I2NEI5RkEx
-M0FCMzgwRERBN0RCRjI3QjZCMDRDN0ZGMzdGNjFDOTk5N0I5Njk2NTRGNzVECgpBOTkyOTM5
-NTM3MUJGRkIwRDVCNEZGRkFDMjc4QzFFM0QyNkU5RDAyQzgxODkxRThGQUJFRkY5OTM1RkIy
-QjZFQUEyMjVCNkEyMjNEMEUKCkQzREE3MDE3MzIxNUQyNUQ3QTNFRTI5OEFDOThCOUIzNDMz
-QTcwNjBCNTJCOUIxNzgzRjg1RTE4NjAyODMyMjI4RDEzOUE4NkIzN0MzQQoKRkZFODVGODU1
-MjQzN0RERUY0NjlBQ0I0OEI4NkZCNzMxMzc5RUIzMTk0MEI2ODM1Q0Q0N0M2NDA2MDAwODJG
-M0VCMkU1MjZCMjJGNDlDCgo1MDQ3MjFBMzI5MDZEQ0Y4NDg4OEU4RDA2MTI0MzU5OTRENzQ3
-NUUyM0IwRDZFNkY4MjlBNTk5NzgxMkU4QjUzREIwMzExNjc2N0RDQzEKCjkwRjM3M0UxQzU4
-QTc4NjU2NEFCMjg0NkM5NUNFM0E2M0RBMEM5QkY3QjVGNDFDMkExNjIwMUUyRjIyMzJCRjA1
-RTRFNzAxNUUwQjg5OAoKRTQxMEM3OTM0NjE2RDQ5OUIzNUU5NkU0RkI3MzgxNjVCOEVENjcw
-OEY5MDI4MTE0RjNFRkJGNUI0QzkyODg0MjJGMjA2QUQ2MzI0QUVDCgoxMjBBM0JDMEFGQjFF
-QkJBNzYzOUM4RDAyMDlEQjJDNDMyMTU1RUQ3MTI0MTEwRjM1OTlEOEU2Q0I5MTY3NDM1QTA2
-MDU3MzA4NzQzRDcKCkRCMUNCNUNBMUYxNzc0RkQ0QUEzQkU1MkM3QjhCMDQyMzRDQjRCOTIy
-OTNEQTI0QUNCNUMwM0UzOEFENEFDRjJENUJGNzgzNzhBNTJCMQoKRDA0NDNBNTQ4RkFERTJB
-Q0Q2QUREQ0EzMTU2NzREOTE3Q0JGRkRENDhGRkQ0MzYwNzIxQTlGM0ZBMEY5RjlFQUYxOTQ5
-OTZBMzNBNTI0CgpDOEIzNzRBQUNFNkEzNjRGMTU1NjA4ODZGNDM3OEY1Njc5QUYzOTNDMTk1
-QzU2ODE3Q0ZDMjZBREE5Njc5MTgwMjc0MzAzREREMzhBNDEKCjgyMDk1NDcwMjc3NEExNjAy
-MjdDRDQ5NkUxNDc4NTlDRjI1MjM0NjZGODk1MUQxQkRFNzlBQTdEMjExOTVCQkVCRDJERjNE
-QkQxMjk0MgoKMkExMTI0MUZBODAwOUY0MzQyMUJGNzk3MzA0NTM0M0JDOTU5Q0ZFMjI1MzBB
-OUMzQjlBRTVGMjcxQkM5MjczNzU2MTcxQjE5ODg1NzkzCgo5N0Q0ODYzMTMzQUY3ODJBOUIx
-NUIyNzE0Qzc3QzZGRDU2MDc3QzAwOTAyQzA1NzE4NEFEMDFCMTBCNTU1NkE2RTA3QjZCMDYy
-NjQ3QUIKCjIyQzc4MzUxOUI4N0UyRDlBMkJFNjg5RTMyQTk1REZCRDI4NjVFNTg1Q0ZCMDEx
-NkE0MTEwRDQwREFGQ0QwREQ4NzcwOURERUM0MEI4NwoKNDQzM0IyOUNGNkFBOUY5NDA2Q0U2
-MkZGRUEwN0E1OUFGRUYyOEU0OUU3QkJBMzJDN0Y2MDY2OTk1NDE0RTlFRTVFMjA0OEEyOTgx
-NzdBCgoxM0RBQzAzRTVERjk0MzM0RUI2RTEyNEU4NkU4Mzc4ODA3NDZEMkU2M0QyQzQ5QjRE
-MEQ1ODcyOTkxNDMxNDQ3Q0U4RTI0MkEzNURFMzQKCjZDMUQyRjNERTc0NDNFQTA1QzJFQ0FF
-MjUxOEI4ODNBNTVERERCRjUzQkQ2NEE3MzUxOTMwQzYxMzdEMzUxRDRBODg5MDhFMTMzQTkx
-NAoKNEVEMEQyMDAxRDdCRjhGNENBQjQyMjQyRkQwQjM4QkU5MEZBNzY4MTZEODE2Nzk3QTcz
-RDNCOTg5MUEwRkIxOTUwNzIzQkJDQjk3RTE1CgoxMTE2RTdEQUE1QjE4RkVEOERCQkJEMkZG
-QTBCNjExNUUyNTZFRTY3NTVFMTcyREUwQzhGMjUxNUE0OTRFNjk4Q0NCREU4MUQ3MTA1MTQK
-CkFFN0Y3MzI5OTIwOTY0NTRCRkE3NjE3MkVBMjU5REQ5Q0IwRkE1RUMxQkUxMDUwQzE1NTNC
-MzRFRTlDMjA2QjU0MERDNEY1MzE3M0M4OAoKQjgwQTg4QjE4M0I2Mzk0OUNDQkNGRkM2NEUw
-QjlDMkE5QzRCQzgzOERCRDJCNDhBQUFBMUJBN0I0MEVGNDMxMUUwQUVBNTFFOEJCMkRFCgoz
-NTA4QkU0M0UzM0Q2M0QxM0JFMzNGRjk1NDYyNTlEMEVBNTQxQ0RDQjQ2MzIxQUQyMjc3M0RF
-NzU3MjY4MjNGMzJFQzFEMzdFRDExMjIKCjY1QkZCRDQxNkQwRUY3NDNCMDQyMEI3M0UwRDcz
-RTFFODEwMUQ1M0U2MzI3OUZCQ0MwM0I1ODBFMDAwNjYzNDg0NDA1Njk3MDRFMzJDRgoKRDQw
-QUVEMzUzRkZDM0VEM0ZFMkQwQTE0NTg2N0VFMjdGQ0IxODRFNEZDMDNBRjVGOUYwMTc2N0Y5
-QjI0NTYyODFEMzI2REI2MzlCQ0E2Cgo2MjIzQUJBN0NDNjNDRDY3OEY2NjNGNjFCMDQwOEYx
-QTE5NzZFREU5Rjk2RkNDRkJDQjBBRDI5QzhFMjdDQ0Q4MUNDNkM1RTY5N0IzMDQKCjk3REQ1
-MUYwMEYzRkU3RkUzM0Y5MzFBMTdGQjc1NDAyNjNEN0Y3NDlBMzQwMDdEMkM3Q0IyRUU1N0Ew
-NzVDNDMzM0UyMjE0Qjg2NjY2MQoKNzQzRTQ4N0VENzYxQjg3NzRFMDc2QUNCRjlDMkRFNjY5
-OTJDNzAxODlBMUVFQjYxQjQ5MDY4RjQxM0NCMzg1MUUxRUQxODI1NzQwN0I4CgpFQ0I3OEVB
-MzgxRDVFNDIzOTA3QjE5NEU3RkQ5REE5NTBDMUE1MDJBMEE2MUFCQUExMkU3MTEwMjc5MkY3
-Q0YwNUFFNjVBN0M2MzFBOTYKCjM3Njc5QjJDNEJDNjUxRTIxREVGMjJFRTMzOTIwNERCNzIy
-RDFGREIxMTlGOTc5OEM3MThFNEVDOTQzOUM0NzJEODlEOTk2MTJGNzFDOQoKRjQ5ODkwQzU5
-NkMyOEJBMzI0QzVBNzk1MzVBRDc3QTVFMzZFMTg0MUY4MjlEQjc0NzdDQzYzQTk0NERDMTZE
-RjI3M0QzNzZCMjMwNjUzCgpDNTBBOTdGNUI5NTkwREEzMjUyMTBCOTM1QjY4REIwMUI4MENB
-NjU5NkVEMkFDNUJCMDI0M0ZENzVFRjhGNjg5MUVGMEEzQzAxRUJGMjEKCkZEOTZEQUY0REFB
-ODNBNUE4OTQ4NTQ5MEE2RkM5QkM2OTNCMjhCMDU1M0VGRkZFNTc0QThCM0M1QkJFQzM2RTY1
-N0MyQ0RGNERGNDVGMgoKNDdDNTlBQjFFRTU5ODA3MjVDNTFDNDNEQzI4OUUyMUZFNjk3OTFE
-OTQzNkI0OURGQzEyMkM0NEJFOTE4NzMzRTcwRTM4NDRDRURFNjMzCgo0OTMyQzUyMDc4OThE
-NzA3QUZDMkJFM0FFMTMyMkNFMEJDOEE1OEY4MTAxMTY2QjA0OENENkU5NEIzOTJBNTRCQTg4
-MTE1RjA4QzEwNjYKCjRGNDE3MDI1QjhBRDI3NTZFQTYyQzk5NDU5OTlFNTM2RDE1NzZCNUUx
-RDMzMjdENTE2NjA5RDFCMzcxQTBFOUIwQjlGRkE5MzRCODU3OAoKMEQ1MUVBMkFEMkFFQTlG
-REI2NDE5REQwNDg1Qjk1QUY5MEEzOEIxRUY1RjY4QTFDQzVDNzMxOUU0QTUzQkQ5QkREMjA4
-RkNENTlCMjY0CgpCQjA1REYzRDdFNTcxRTgxNTQ3RUE0ODE1NjgzQ0ZGNDMyMzQ1RjcxN0NB
-RjNFMjBFNjI3Q0IzOUI5QzQzNEY2NTlBRjk3NzYwMjMwQzgKCjREMEM4MDlBOUY4NkVDNzIx
-RkYxMTNEODREOTRGQTJGMzdBQ0E5QThDNEM2QTI3NjNFMkYyOEM5QTdDODIyMEZFN0Y4QTk5
-MjA5RTA5NAoKRUQ2MjFCNjg0QjY5RkRBOTE5NEE3Q0NDRDUxRkE0OTkzM0VBMTU3MDYxRkEy
-M0RENUZCOTAyNjVFNEVDOUE4MThDMTM3OUQ1RTUwODA5CgpGQzdFRUUxRjEyRDVCMURCMzND
-NkMyMURGMTFGMEQ5QjQ5QTNBMkQyQTlGMzlFMDU2QjA2MDRCNkZFMEZBRTZGMDlCMThGNTlC
-MkMxOTcKCjY1OTJFNThCNzQ2RDNBOTlBRjU2QjFENUYyQUY5M0E0MEU0M0NGMzBFMUNBMTg0
-RDFFODk4Qzk0ODAyRkY5QjIzNjVBRjM4RDBDRURFRgoKNjM4QjIxMDkzMTc3MkJDMTkwRTRE
-NDBGNEM1QTEyMTJEQjk1RUE1OTZEQjY0QzdDMDYwOUM2ODE0NDU5REZBMjI4NkVCQjVFRTE3
-OEZFCgpDNkFGRkMzQjlCNTIwREI4RERCNEVCNUQ0MjIyRDg2OTc5OUZEMTk4QzVENjRFNEYz
-ODg3NTgzRURGQ0EyQjhGNTExRjkwQjBEMjlGRDAKCjQwRDE0MjdGRjEyRjA5NjY0NTkzRTdF
-RjFDMEI0MjZEQzQxMDYxRjM0RUNFNjkzNjdGODUyRkNENzIzNDk5RTU2NEM3NzYxNENFMjQz
-NAoKNUMwRDQxMDExQUFFNzk2MEFEQ0QzRTJENjNFRTE2MTc3RDE5ODk3NUVGMjg4ODQyRkE1
-NzE0QUZGOUU1MzM1OTc4NTVBMDgyN0ZBNDQ0CgpDQzY4N0U4MDI3RUM5OENEQjM2MDZGRUM1
-QTA0NUUyQUM4N0U5MEVBMDA1MDc2ODY5OUM5NTk4MDU3QjUwMzEwRDM4N0U5MTA1NUU5NzQK
-CkFFQkI3QzkxMzZDNjk4NkIyNzlCQkU1RTA1QUEzMDkxRTk3QzcxMDRFMUVFQjBCQ0U5RDM0
-NDhEODY2NDQzNDBBMEQxMUQ5QUM0QjZDQgoKREI0QkU0RDZDRkYxMzA4MzNGQUU0RjAzMjQ5
-QzQ1Mjk4NTcxNDU1NDgwNjAzRjVFRkUyQzE4OTI4NzU3MzdFRDFENTYxQzM5Mzg2ODlFCgo3
-Q0IzMERGNUUyNkQ0NzkwODNDQTYxMDE3NjUwNTkyQURCMDFCRjZERDEyODA3QjY1RjJCRUI2
-QzhGQzk0OUFDNUExRkZCRTgwNzk4MTcKCjkzNEJDODg5N0UyNTFGNEM2QjI3RTdCNkI1MjQ3
-RjVFNDhDMzlDODRBQjhCNzBCMTRBODY4NTUzQjVGMjA1Rjc5QjgxNjBERURFMjE3MgoKQTBG
-RjA3QUVGMDczNTc4MDczNkU1RUJFRjdFODE4NzY0NTU3ODk4OTUxOEUxMzM3RDM1MkJEQjE5
-MkFGNjE4NTg3NzhEMjFEN0I0NEE5Cgo3QzI2RjQ0NTY0ODUyNzg4NTU2RTg0RDYwNjE5RDFD
-Qzg0RTRCNEEwRjQ5Q0FEOUI3QjcxMzkzMEM5NTdDNjMyMTE3Njc0QzUwMzEyMEYKCkM1NjRB
-MzMxODU2MEMxQzU3Q0M3NkY3OEI4RTFGQ0E0RTI0RUZFMDc4RkRFNTFBMjREMTJDRTFCNzk5
-QTA3MjMwNDQxQTA4RUFDRjBDNwoKOUQ1MTQxNjlFNTQzQURFOUI5N0VFRUZCQzZDNTBDRUEy
-MEQ1QUY0ODFFOEYyRDVCNjIzQzQ0NEI0MDlGQ0IxQ0FFRDdDM0VBNzc1NEQ2CgpBRDE0QkJF
-MTFENzA3RDZGRDNBNzAzODRFMjc1REQwNkE4MDk3OTNCODczRTY0NkJBMTQzQkU4MTY5NzEx
-MzlGNjJGRTAwN0MzMTNGN0MKCkM3MzcwRTFBM0VGRDE4RkZGN0JERDhCQ0MxQzY3NzYxQTZE
-MUVBRUNDN0Q5NTNDNTg1OTZDMEI1NDExM0M4RUI1MjJGRTZGRDgwNjhGMAoKMDJENjBDN0VF
-OTI0OTFFMkY4RDUwOUE2RUI4NzIxOTdDOUZFRDk2RDk2M0M2NUZDOThGM0RERkEzNzQ4RDMz
-QTJBODJDMjJDQTRERkI3CgpEREQ0OUY3RDYyMkU4NTlGRThGMERERjk1MTQ0RTZCQkU5MDYx
-NjdDQ0VEMEQ2NUVGMDUzMzJFNTlENzM5MDY2ODU5ODA5RjA3OTVFMDcKCkRGOTA2NDk2OEM1
-NjQ4MTM0RjUyNzMzN0NDNUY2MTBENUI5NDFGMEFBOTc1RjY4MTdCOTIwQTMxMThFQTYzREU3
-RkZGM0Q1OUJGMTQ1MQoKRTI0NzRCRkU1N0M5NEUwM0FDNDE2Q0ZERkNBNTU5NDgxQkI1ODdB
-OUY4MzY2MjYwQTg4NEEyMkNFOTNGQThBMTcyQUI3NzBDMkRDNUIwCgowQjczQzlGRDlGREY1
-RTI0MkJBOUI4NDVGQTREQjlDRENBMjE0OUE0NDc5RUE3N0U2OUU5RjM3NDJBQjU3MTE1MTdC
-RkNEQjFCM0MxOTQKCjcyMzFDNDM3RDlFNTBDNDIyMThDMzU2OEFDRDk1M0Q3NDJEOUUwOTNE
-RUZEMDRDMDdGMkQ1RjE1MUQwMEIxQ0FEMDg2RUZENUIxMDQ0NgoKNzQ4NTI0QzA3MDEyM0Yy
-MUEwOUVFQTgzOUUzODE1MjdERjk4REUxQjczNUMxMTExNjI4QTBGQ0Q3NUFEODYzQUU0N0Ez
-NDIwN0RGMkM3Cgo4RDFBNTBFN0FGMzEyQkNDOTk5REU0OUJFMEY1NEFFNzMzN0IyQjVEODND
-NEY1NTA3QTUzNTVDMkNFMjkwMENERTUxRDI1QTQxQjc0MDcKCjIxMzQwNzQ3MDhGNTU4RERD
-MjJDMTRDNzQyNEE2MTFFMjgxNDEzRkVGOUE0MzhDOERFNEJCQTZCQzY3QTZGMjZGMEUxRUQ5
-MjU0NTEzRAoKMjBFRkUzNjFBNzQyNkIyRTlCQUQ0ODg5MTUyMjk4RUQzOTdDNkFFMUI3RTBB
-QTFGOTNBNEE3MTdDMTM0MzlCMDIzOTlDNzczREU4N0U1CgpBN0FEQTJCMTUxNDQyNDkzOUY0
-NEYxMTRFMEU2NjNBRUZGQkY3QkFFRDUxNjcwRDc4OUE2NzE4NjI1NjY3NzdDOTNFNjFFNEJC
-NUU3NDQKCkZCRkFFRDk0N0JEODk2REE5RTFDOTQ3QTFFOUQzMjhENkIyQjM4QjIzQ0YwRUQ3
-OEJGQzM5OUI5QkMzOTVGMDhEQkY0NTdGQUI2RTQzRQoKODQ3NDQ4NThGOTRBNzI5REU4NDZB
-QThFODg4QzFBMjE1QzIzQTI5N0MyRDdBNjlGM0M2MERBNTNFRDEyRkFFNjQzQTdGQzE1RkJC
-NjgwCgozQThFRDI3NURCM0QxRTAxOTlBNzFGMjAzQzhGRTFGNThGMzkyODkzMDNCRjdBRUU5
-MjhDMDkyN0VGMzRGMTYxNEMyM0M4OUU2RkUzRkIKCjEzQUI2RkI5MUVCM0RDNDcxOEE4QzAz
-MUQzQzdFQzExMUYwOUFDNzlBRTNGNjI0NUQwOTQwQTQyODRGQUNDRURBNjQ1QTEyOUE1MjQx
-RAoKOTFFODFCNjI3MTg5RTE4MDlFNEU0Q0I4NjkwRDdEMTY4NDVDMEU5N0VFRkQ3Rjg4RkVB
-OTU5RkI1NUY3MDgzMDY1OUNCMjAwMkM2OTEzCgo3ODcwREE2RTA2MTIxMDM0NEI1Q0M2QjlE
-MDNBQzdCNTQ0MUJEQUE4MUMyNTUwOEUzRDVERDc2NDVGN0ZEQkUxQzBFOUQyMzYwMDQ1QUYK
-CjJENzZGNDZFRTI2Q0Q3MDM3MTdBN0MyRTgzNDA2QUY2M0E0Mzc4RjEzNDAzNTc3MzVEMTNC
-NkM2QTFFOTQzNzA4N0ZBRTdDNDJFM0NDNQoKRUI4OUVCMjE4NERBODdFNkI1MjMxNjNEMTZD
-QjIyMUZCNTQ2QzAzOTc3NEYxQzdFNEMyRDE5QzY0OEZGMUQwNzg2OTFDQjdBOTA1MjRGCgpB
-RTBGMTk5MDI4OUYzQTAxQkU1QjRCRTMxNTQ0MTAyREIwNEVCNjQ5NTBBNkQ2MzNFNkREMUU3
-MEMxQjVCNTBGRTAwRDEyNzBBRjdEQTEKCkM1QUUyMkVFMEJDN0Q2M0Q2RUQ5RURCQkMyREIy
-MUE2NTdCN0M2RTM5Mjg0NTUxQjY2RTk1OUVGNjI0REFFMjFFRjA1OThFNTk4RTVGQQoKRDhE
-RUVFMEI4N0FFMUNBNzdDODkwMkNDODkyN0U3NEIwNTk5QjhERjg2N0REQjI4NUYzMDgxNzYz
-OTI0M0RCN0Y5NzE5MUZDMTVBRkNECgozNEZFRjhBQ0ZBRjkyNkFFNjBDMTNERjcwQURFRUU3
-MEI0RDJERUY1NkRENjg5MENBQ0EzOUU5NENBQ0IyRTAxQkRDRTFBMjlFOTY2NDMKCkNDOTMy
-OTAyOEM5MzFBNUY3NDg0MjYwMzJDRDU4NkU2RDc1OTAzM0YxRTQ2ODMzRTkzRUZDQTBBRDg5
-NUNFRjEzMTEzODBCODc4MkI2QwoKMTVFREZGQzczNkE5MzlDNkNBNTNCREY2NUY4ODQ4NEU0
-MDUzQjA3NjM1ODc4MEQxNTQ5Q0Q2RkQwMjM0NTg3QTQ2MTZBMDA4RTZGQUE3CgpFNUQ5RUM0
-NThGQjI5M0IxNDNBRjA4NThBODUzMkZDNkI5RTZGNjk3OTdDQzI3NTQ4RjE5NjE4NzdCOUM3
-NDkzNjJDMkUzQkQ0MTA1NkIKCjY4RTI4NDI2NzE1NkM3MkE4OTA5QTg2MDM3RjZBNzU1QTgy
-REYzNDk5OUM2OTU3QzQxNTIxMkQwNjBDMTUxMTRENUZEQUZERjAxQjNERAoKNTYzNDI4QjQw
-MUU4NTEwNUQ3QkREOUFBOThFNTQ2NzA1NjEzNTREMDgyQjVBRTNDMzcwRUY5RTJBQjFCRjhB
-OEUzQkY2MUI0MzQ4QzBDCgpDNkFEMjc5NUI0NTNGOEY4MUQzNkRCQTg4NDcxNDNERDk1NTIw
-M0M5QTBERkEyM0UzMkVDMjM1NUFGRDY2NzhBMkIwNUZFNkU0NkNEQUUKCjNFOEU4NUFEQjRB
-QjcxQjdGODREMTI2NkVDOTJBODQ2RjA4MTcwNjk0QUQ2NjU3Q0E0N0Y1NjA1MzVEMEZGNTcy
-NUM0MUNEMEZCMzIxOQoKQjlCQ0E1Rjk1NDU2NTgyNDhENzk4OTZBOEI1RERGMTk2OEQ0RDk1
-QTM3RUNFQzdGNDRGMkE0RDY4ODgyMTRGQjE5NTQxQURDQTY5RjcyCgo5NEJFRjYyQzA1MjBF
-OTVDQkE0QTJCMTREMTJCQUQwMDRFNjQ2OERDMTM2Qzg5QUM1MDY1NzE5QjkxNzVCOEExMTky
-QzgzQTQzNTk1QjIKCjY2QTE5NkU4MjBFQUM2Q0EzNTQ3Mzc0RkIzQkYyM0NERjE0RDkzOUI2
-N0RGQzVERUE5Rjk4RDgwNTQ1QkY5M0NBNjcyNDBGOTdBMUE1QgoKQ0QxMzdGMkE0MkJERUU3
-NTUyOTY4NjIzRTZDQTY1OUZBNDJFQzVDMkNCQkVGMkUyNzA2RDA2RTBFMkNFQTIyNTQ4MjIx
-NEI5QjZDNDVECgo5N0RBRjI0ODk5RUU4QkM2RDhBOTgwRTU2MjEwNzVCOUNFODM3QjcyNDM0
-MDA2NkI3NEMwMTNFOEFEODA2MjQxREE1QTE4QkMzRTk2NTcKCkVGRkQ0QTE0NDM3MDRCOTBG
-RUFGRTBBNDA3QzdDMkU4ODBGRTk3MDU2MEJBQjA2NDkzNUYyMDlCMTk3MUUwM0MzM0IyQjM3
-QUZCNDQyOAoKMDFBOUM0RDYzQTZBOTM5MTBCNjA3RDQyNDQxNjYyMDU1OUU3Qjk1QTUwRTg3
-OUE4QTA2MDdBMkNGQUIyNkQ0MDg1OEI5NTVDOENCRTRDCgpDNTVCNjczNkYyMEVCNzQzOUIx
-Q0I5NkNGMDBFOTE2OTA2NTkxNDdDN0QxNjA4RTUyNjBBMkU4NEQ3NDlEOTA3MDhCRkRBOTJC
-RDU4MzQKCkZDMjI2MTlBNTE3NjREQjREOENBRTY0NjNBQUU4MDUwM0Y0MkNCNEU3ODMwQkU3
-OTZFNERDQjEwQTFFQURENjM2Qzc5REQxQzE3NEMyNgoKREQ0NDgzMEMzOEU5MkJCMjVERkE3
-MERGQ0JCQjJEMEI2OTJEM0M1OTE3RkI2NjlCQjM2QUIyQzJDMjZBQkYyQjM1QzBCNTgxRjc2
-RDc3Cgo2NDY0NERGODlFRTg3ODYyREUzRDVCQzFFREM3NDkxMkU0RjI3OTk4MzYwMjNFRjg5
-RTVFODE3REY2MjUyQjRGOTUzREE0RkQwQkMwMkEKCjRFMjJGQTc2MjA0ODgzN0ZBOEM5OTQz
-OUJCMUZDQkY1RTIxNUI1QjQzNjg1NzVFOEQ2NzY5RTNEMDFBOUEyNTJEN0IyMDMyN0I5QjMx
-NQoKOTVDMDFCQUNDQjY1QTM4RkYwNEE1NjEzNjk4QUYyRkE2M0IzNkJDNjk0MkVEMjQxRTFF
-Q0VCN0E5RjJFOEUzODFEMzAwMzI5Q0JENEUzCgoxQjE5QkEwQUZGNjQxNTU2OUY4Nzc0QjI4
-Q0Y5RTZEMzQzNDEzQUEwRDQxREMzQzNGNjg2ODQzQkIxQjdEQUEyNDJBNjM1Q0YzNDUxMzcK
-CkIzRkQ0QjYxNjJBOURFRUE2QkZGMUU3MTlERjYwMkE4RDc5Q0Q1QTYwQkIxMUYyNkQ0MzdC
-RThCNEEwMzlENkMyRDY0QUJFRDUyMEMwNwoKRjA5RTgwMzdBOEQ3NkQ3RTNBQkI1OTQ2RDQ4
-MzdGMUIxMjI3NEQwQUZBQjI5QTQ0RTAyN0IyQThDODE1NzRCODQ2QTdCQTk0NzU2QUQ4CgpG
-MzNEMkI3NkM3OUZFNEQ5NENCMzc0OUE2NEVDQUQ4QUU5RDRENEVFMjE5RDVGRTQ1MjRFQzk1
-Q0NCODlCQTNDNzNGMjE5QTg4RjY3NEIKCjJENDBFMkM1QjQ0OTc5MDNGQUVBN0JDM0M3RjIy
-NTkwRjhGMkQ2QjYyMTUxODg1MzgyMTUwRTk2MTFCQkMzM0Q5QURDRTY5NUZCRjk0NwoKMkFG
-NzlFQkVBMDkxNjlGQTAwNDdFMDlEOTQ5OUQ3QTk3N0VENzRFNERFRTNCRkVGMUVGRTAxOTNB
-QUFGOUI4QTJFMjg1QUNFNjNGQ0IwCgo0REQ1QUE0RkQzMTFFQjgwMDVFODFERjk3MEQyQzM5
-MjdCOTMyN0M0MDkzMjM2QkM5OEZFQUM4RTEzMDAwMTIzOUE4MUM0MjZENDc3QzcKCkI2OEFB
-QzQ2NjgyMEY3RTY1NTI1MTU1MENDOTc5MDc5RjMyMDBGMTJCNkRDMzVDODREQzVBMTlFQjA2
-MzBCQkYzQ0JCMjUzOUFFRDM3RgoKNEVBQkM0NjRDQzVBOEJGRTc1NTkzQzdGM0FBNUJFQkE2
-Q0VFMUFBMkRDNDNFNDBBQTgyMzIzMkQ2NjcxNEMwNThGMzZBMDEyQTkyMkVCCgowRkEwQjU4
-NTEwQzEyMzkwMDRCODQ3MzBDMUM2OUFFQjRBMzgwODRCNkU0NjVEOUVBMDQ1ODBCODExMEM5
-QjFCMDIzQ0JEMUVBNDQ3NTMKCkY3Qzg3MzkwQTg4NEJGQUM4MjVEODRCOTNDRTRBQjUxMzYy
-NjRCOEExRTBDMzE2NkU5NEU4RUZBOTA3MkExMEFGQjc2MEZGMjI2NTAxMgoKQTI1NEYwNzU1
-RjgxRTFFNDJBQ0UzQ0YwM0Q0NDNEODFGMjM3RDdERDk1NTVGMjQ0NzE1NURENzZEQzA3NkYz
-QkZDNDkyMzkyODI4NzA1CgozRUU2QkUwNURERkUzMEFGMjAxNkZFQTUzMTU0QUNBOTFBNjA4
-OUU5ODA3NDU1QTUzNjc1MzA3OEI3Mjk0NDExNzUxNDUwQ0U0RUQ2M0QKCjBEQTRDOTkwN0RB
-MjEzNkRFOTZBNTI4OUI3ODMzNDZDRTdFNkREMkMxRDg1Mzk1RjkxMzczQzEzOUIzQ0ZGQzVE
-RjFBMkM0N0YzMjUzNwoKMjMyNjkxODIwQkU0OTdFODE4QkNBNTYxMzQ1NzA3QUQ5ODI0OURD
-NDAwNjJFMzBENjQ3RkE5NzlFRkFGNEZBNTBBRDlDQzI3MEQ0N0VECgo2OEUxRTQ2MkY1NEVC
-NjlFNkQ3MzRDNkREQjQxQjVDMkIxRDYyODFBRDNCOUY0OTdCM0I5NkQwQzk0QUY5MzhFOUU3
-ODVBOTZERTVERUUKCjlBREZGODM0MDYwMEIzQzE3M0I2OTM5QjVCMDZCOEYxMzQxMjc2Rjcy
-N0VBMTY5MzMxNTFEN0RBOEYyNTQ3ODZFQkQ2QTAzNzJCMTBFMgoKNzkwNThEMjMyN0YyNjIw
-QjAzOUM5NDUzRUZBOUI4NTlCQjVCRDQ1OUU3Q0NDQzM2QjgwMjIxOTMyNjY4NDAzRjYyQkQw
-MEQxRTMxNzU4CgpFNjQ3RkVDMUZCODE2QjZDNTI0NTFFNkZGQzUwRUE4RDUyMjc3MTc4RTND
-NEFGNUIyQTU5RjM4M0IyNzFGRDEzMkUyMTY5NDVCNjlBMzQKCkIxMzY1MEY1RUVGMTI5QTk3
-MkE2OTVGRjJCQTEzOEUxMDkzNUE1NjRBRjkxOEE2NkMyRDUxQ0Q5NDJERTdGODQzMTI3QTNE
-QjgyODc1RgoKMUExNDY2MkIwQzNBMTVCRTRCQkUxRDg3NUY4Q0JFNTRDNzQ4OEY0MTMxMDc0
-ODIyRkQ0N0M1OUFBNEFDRjE4REE5NzE0RTI2MTlDOEQxCgo4QTlFQkQ1MDk4QUFBQTExNTBE
-ODM2ODFBNkU4Q0NCMDcwNzg0QjEyOEY3MzZCRkI0M0NBRjVGMjM5RTk5MzQ4NzhDMDIzMjhC
-RDMwODQKCkNGNTJFRUIyMEEyNkJDMzZFNzZBOERGQjM2QzlDMTM5N0IxNkQxNjIyNERCQjlD
-NjRBREVEMTkxRTBFNTNDNjFCRTdEMDU2MzU1RjIwQQoKMUFENEVFMzhFMUVDOEMxOTI3QzJD
-QUZEMzZGRkFDMjQyNDBCRjA3Q0UwMUZGM0I1Q0M1ODY2QjRBM0ZFRDBCRUI4Njk1RTIzQzFF
-MTZECgo2REUyODgzQjhBNjZBMjQwMDMxM0IyNjNFQzJFRTYzNDhCRTAwMkJFMEFDMkI1QjQw
-NkUzOTJDNTNGRDQxQTE0NEY3RkYyNEJERTk4OTIKCjdBRUQxN0JERTYyMEQ1RUU4RjA0OTVB
-OUU5MTVGQzBGN0ZDNjlGODY1NTAyM0YzRDAwRTMzMDkzNDIzNDBBRkQzRjAwQ0U3NkQ1MEI0
-OAoKNUUxQUY5RENBNEQzRjJBNDBGN0IwMjU1ODk0OURERUI2REQ2OUE1RTY3QjhCNURBQTM5
-NTZFRjk3RTcxMENDMUJBQTc0NzZCOEI1MzRECgo0ODU5NjI0MDU1NUM3QTIyMENCMDI5NjY0
-QUQyNzRGNDc4OTAzRTk0QUY2NjAyNkY4NTYyQ0Q2QzE5ODM3Q0U5MjY1Q0I2QUU1NzgyMTcK
-CjAzMzZGRjRDN0EwRUE1QzI4RTA2OTAwNkNDNzYwRDNCNTM1ODY3QkQzNzZDMEU2QkZBNDNB
-OURFNUY2RDg4ODIxMURCMDZCNkYzRTVERAoKQUE2NjY2MDlDQTdFMjI5MUVFMDU5NjczMUU0
-Q0U3OUYzNEZFMDU1OUFFOEUxQzI5RThENjAwMTVBNDQ1QzM0RjhFNjQzQjUzMzcyRUIwCgo1
-MzMxRTU4MTk3MDk2NDc4REZDNDlCN0YwOTJBNjIwOUEyRDIwOURDMDJFRUIxQjdEN0IxMkU4
-OUEwNTUxQzA2RDFDM0YzNzkzRDc0NUUKCkJDNkQyRDZDNTc2MjhFNUJERkFFMDk5MzY5NzZE
-N0M5QUZCNjUzQ0U0RTZFMTk4NTcyQ0U0NjE4MEZGOUVCMDA5Q0ZFNDUwQkEyNkJCNQoKNzA1
-NTI1MDUxNjU1QzM1NUI1RDYxMTQ1QTdFRTA2REZBNDg3QjMxMURFNzJBOTc1OTQ1RkJCNjQ4
-MTA0MzRGOEQ3MzlGRTk1NjMyNjAxCgpBNDZDNkM5NUM4QkUzNjUyNDVBODlDRjc2MzQ3MzVE
-QTE0Q0M2OEUyM0Y0RTlFODJBQzBFMEY4NUFERTg2MjhCQTFCQTRGOTExOEY4MDAKCjcyMzc5
-OTAyODBDMTkwNjFBMzA1Qjg3QkRFNkZCREFCRTcxQTcyNzQwRTMzODkyNUFBODcxQzkxOEQ5
-MjdGMjhBQkIxOUZGRDJBMTI2MQoKQzgyQ0QzQTQ3Qjc2MjQ4ODI4MzAwRTE0RDcxQzc1Qjc3
-NzM3NUQyOTcwREYzNDVDMzdGM0JFMDFFNTZBMDQ3Qzk5RDI3RjQxRDgxREYwCgo0M0MxMTAz
-MzUyRkJBMTk0RUFBQTUwMDU1REFCMDcwMzQ2QTIwRjM5RkIwMDdCRUJBMzQ2MjczMzdDMUI3
-MTQ2NURFODJEMjIyMTE5NEQKCkQ1QTYxQjY2NjY4M0YwOUUyMUY3NjQxOEE4MDg2RkE0QjJB
-REYwQzk0RDVBNzAyQTJCRTZCQkE3MUQyQTlGODc2N0IyQTM5MDIyOTQ1MAoKRUI5ODY3QkVB
-Njg1OUVBRDY4NkM2MUZCNTIxNTcwMzZCQThGNjI0NjhDQjkzNEUxMERBMDdDNDM5NDJCOTY0
-QTkyQzI3OUUzREYyNjM1Cgo1NDFGRjQwM0NDNTBGN0RBRjFGMTE0Njc4M0IwRDI5MDZGNjc0
-MjczMzg4MDg1QTFGNjk3RTZERDgyMTY0OTU2OUI4Q0VBMjkyMDgzMEUKCjk1QTk2NjM1OEZD
-NkJEN0Y4QkEwQjkzNDk1RDA1NDk2N0I0REJGOEQ5MkVCMzM3RjUwQkUwREQ5QTAzQzIzRDJG
-NUI1RDlDNzNERkE0RgoKN0UwMTEyNTQyNUVFNjJFRDlDRUY3ODEwQzg4NTUzQ0M2NzFBN0RG
-OTI5NUY1MERDNDgyNDQwRTQwRDY1RDA5M0ZCNUEzOUM0MDg0QjVBCgozOUE3QzEzQjQyNkJE
-OUJBNUU4REUyOUZFRkNGMDM5MTVDNERGNTcwQ0ZEODU0NkIyNzRCODc1RkQwRjgwRjU3RjFB
-MERBNjlGMDlEQ0QKCkY5OEQyNzlDMDAwMUFFNkRFQUNFMzJFM0IyRDM0NDM1MjRDNUZFMUNE
-Mjc3MEQ3Rjg3MzIwMTQ0MkIxQ0M2M0YzQ0MzM0QyRURDMEUxNAoKOTMyN0FFNkM5RTk3MjBC
-MzQ2QTNENzgzQTBFQjZEMzlFMTBDNkQ4QzQyRTMxMEMzN0FFMDZCRTc3MDU2RjU4RUQzOUQz
-NUJCMkJFODZFCgpFQzBCQUFCRTk5NjgyREU0NTczMTZCNzIyNkUwQzk2ODgwN0QzMzc3MkEy
-MEQ1MDY1ODM1M0QyQTZGMDgwNEU2RjIyNTg0QUY1ODg3RTMKCjZBQTRFN0VGOUQ0NzAxNTNB
-MTE3NTlBRDQyREE2RUI5RkMwQUI1NDk2NTQ3Q0FEMEVCNzI0M0QwMzcxQUYzMzBFOURFRjNC
-QkRFMTE1QgoKQzMxMkQwNzg0OTMyQkU2MzBBQ0YxODUzQkM3Q0I5NzI0RUY5MUI1QkJDNDJF
-RDIxMUE5RkJGOTEwNUVENTBEQkVDNjFFRUEyODg1OEU0CgpCNTc5RUYyOTI5RjI4NUFDQzEw
-MTMxMUUxODJBMjdEQzhGMDVBOEJCMDc0QzU1OUMzNzA4M0Q1QUFEQTIwMkIwQkMzQkVBRkI3
-ODMxRTgKCjc5OTE2QzVGQUExMTZCRjRCNERDNjhERjk0NDAzREIxMTM0RDk2QTcyQTgxRjcw
-RDJGMTZGQUM1NzY4QjRCQjQ1NEM4RENFRDIwMkEzMQoKMjIxQjI1QjJFM0Y4REM5MTJDMzhG
-QzgwODdGMkM4OEIyQTU0Rjk5MzdGRDI1NzExMEFCNjNGRkVEMDFEODVENEIxMTYxRjA4NDIw
-RjIyCgoyNzI1RkVDNEI1REM0RDJBRjY1QThFREJEM0I1OUU0QURCRkMyNDc4RTk4NTBCNkFC
-QTg2ODU1M0RDQjIzMzEzQkJGNkQwM0QxNzhGRjIKCkZEQ0YzMzkzQjA1MUY3OTlENkM2MEFC
-N0Q1N0Q2MkZEMjNBM0YwNzY5MTU4ODJCOUJFMUUzRUQwQTNEQTg5M0Q2QkI2OUE5QkQxNUM4
-QwoKNjA3RjAyMTNEMzQ2NzNGOEZFREE4MTg3REY4QzI4RTZFNEE3QjFGQjkyQjExRTkyMjk0
-MjAzQTM2Rjk1NzkwRUFEMUI0MUNDODMzNjczCgozRkI2QTAxODkzNTZDMTY2MzZCRTk2NUEy
-MEU4OTU5NDc0ODM0Nzk0RTREODM2MzQ0M0NBNDY3ODkwMTE0MUQ4QkZEQ0MzMUI5NEJGRDMK
-CkNGOUU1NEM1NjY3MjNCQjUyQkZDODY4RUMwMkFFMkI5NkM2NTdGQjRGRTlGQkJBRUFCNzAw
-MDc1NTg4Qzg3NEY1NTlGM0M4NUUwMDdBRAoKQ0Y3NkIzRTAzNzJFRDk3RTNFOTc3NUNGQ0U4
-OURCNzlEMzk2OERFMkYzOTZEREY0QzZGMkI2NUM5MDlBMTkxNDMxRjVFMjEzNEJCODg2Cgoz
-QTYyMEUyRDUzNzcxOUQyRjgyRkJEODAyQzM4OEVBNjZDNDU0QjhERUMyN0I3RDY2MjRGRkFB
-MzFGODVDNUIxM0RBOTQxRUU5QTdDOTMKCkE1RjlFRTNDNTM3QjcwOTY1NjY5NjkyOTg0MEND
-MDVEMkU2MEIyODVDRTExNDAxOEYxOUQ4NTZERTZBMTQwODI0NkMzQTJFRDA4NUFCRQoKRTEw
-QzdCN0QxQTgwODBCREUyQUFFQzYyRjVEMzBDNkVFREI2NzMzRUI5N0I2MjY0MzVDOUNBQjVG
-QjU2ODEwRTNFMTkyNEFCMTcwMTAyCgpBRUIyNDY5OTY2MURCMjdDNUE5MkY0MEU0QkQ0QTg4
-Njk3RUE2MjNBM0YyRjgwRTNGMjE3RDU5QjUwNjQ5MDg1NzUzRTlGMTZDNTVCRDEKCkM0NUQy
-QzU3Mjk3Njg5RDEyRjU1RjYyRUEzNDhCNUZGNjU4MEI0OERBODVCOUJBMDU4MzQ5MDI0RDFE
-REM3N0JCQTAwMEFDMEMyQjYzNQoKREUxMjJFM0E5RUVDMzQzNEJDOUI5N0IzNTQ2QkM3ODUw
-QzNBNDcyMTAxMDAyQ0YwNUFFQ0VENjg4QzM4RDVBQjgyOTY2RTQ1QUM0Q0Y3CgpGRjI2NkFF
-MEY2ODY2OUI1RUE0OUM2NUE2NUFDREJGOUE4MzA5ODhCQjYyNUE4MjYzRTU3MEVBMkM2RDZB
-Nzg2Mjc3MzQ1RUU3QkQyOEYKCjY3NUFBNjQ3NEFERDc4RTAxNkQ1OTlCNDE1QjA1NEY2N0VC
-MURFOUJFNTc3MTBERjIxMjI0MDVCNDgyMDE4RDI0OEIyOTYxOTg2MEVBMwoKQTI2OEM1ODY3
-NzU3NjFFNjI2NTFEMUJDQ0QzNzc1NjQ3REZCRTg0QTk3QzRFQjY2RDIwNENFODM5QjZERjgx
-RTg5NzA4MzRDMTkzRkFCCgo3M0ZENDBGREFEMjhEMjQ5QzNBMDg2NzU5RDBGN0EyMzQ1N0I5
-MTI0MEFBMDQ1RkI0NTBFQkYyRjVERjI0RTUxMjNERkZCQzdBNjMzRUYKCjcyMzA4MUFDQkJF
-QkQ4RDk5QzQxQjdBQkQ2QzFCM0NCQjUyRUNBNDk3NkY3NDg3QUQ3NzgwODA1MkQ4MUNFNkYx
-MjgxMDk4ODFDMzJGMwoKODI3RjVFRjU5MDIyMzAxQUU3OTE3QjJEMkU1QzU2RkM4MjM4NkND
-MUUwNjg0RkI2QjQzQTY3QjUxQUU4QjEyRTVCODJDNTIxNEVCNzk4CgozOEEwMDRBNEQ3MDRF
-MDNCQTY1MDM4Qjg3Mzk5RUUxRjkzRUE0Q0RGRkQyQ0JGQTBBRTFDMUU4MTA3M0JEODgyMDIw
-MTVFQjlFRDU3MEUKCkRCMzNFMDE3NzczNDNERTNGODU5OEVCRjBDRTFDNzlGOERCRjQ5QUM5
-QTZFMjZBQkU1NkQ0RTM2RDc0NTJFNkJGN0NEODFBOTkwQjZBQgoKQjA1ODI0QkEyQzI5ODhE
-NTA5RTk4RTlBOUVDQ0UzRjg2OUUxQTMwMUU3QThENjlDMjkzRkM2MDUwNkM3NjJBNjVFNjZB
-MzMzNzMxQkI3Cgo3ODg2RTgyREZGQUIxODdFMjY0QkI4RTkzOTEyNTI0NEE2NThEQjBFRjcy
-NzQyODk2OUM4NkU0MjQwQjg2MDNGNkNFRjc0NjdCQTUwMEIKCkZCMkEwNDYxRjg5MjlFNjUy
-RUI3QzY4NEI2MzU2QTRGMUIwMTMxN0JERTRDMEUyNzhCQzlDMEQxOUQ3RjBGMTA2NkI3OTE1
-QzE1NDgyRAoKMzQ3RUEzMTMyMzkzOTA4ODQ2NDVCOUQ5MjE2MDk2MjU3QUExOTk0MjU5NDRC
-ODhCOEU2MEQxQzlEODE4RTZDN0ZBNTc0ODRFNTczRkFGCgoyNjgxOTAxQ0ZGQTdCMDM4Mzcy
-NTFCRENBNDI5NjM1OTdENTlGNUM0N0NDRjRGRTYxOTYzRDY5OTdFODhEQUE2QTgwMTg5RjU0
-MTA4QUQKCjkxQTYxNTUxOUVCQ0FBMDI5NENFMEQyQTNENkQ1MUJBMjNBQTUzODU2MUFBQ0Ix
-ODU5RjlEOEU3QzdGQkVFREZGQTU5RkRBMzBDNDkzMAoKRjNDNzAyODhBRTNCN0RCNjgzNTYx
-M0Q3OTc1QUZCRjEyNTRFRDgwQTI5M0MyODZBNDAwRTc0ODE2RDA3QUVCOTI3NzMwQzM5N0VC
-MUNGCgowNDExNTNGQzgyMUVFMzU3Q0Y4RDlDMUM1NUNBMUI1NzhCNjAzQTk5NDZFOEI2MjNB
-QjY0MkYyMjcwNDFBMThBOTg3QzhBODI2QjhFNjcKCjdGOERFRjVCMUE3QTg5NkYyRDA0Q0Ex
-OTcwM0E5NDkyQzM1NzQ4QTBFQjM0NjE0ODQzQ0I2NDM1RTM2NjUwQjFEMDMxMUQ4ODYyRTc4
-RgoKQTg3MENCQ0Y2QTFBNkRBMzFGQzFCQ0JFOTdCMDJCOUY5RDA2Mzk3NUE4RjRCNjgxQ0VG
-OEQ3MTcwQzFENjZDNDFCRDhCQkVEN0M0REU0Cgo1RUQ4RUE0RDVEREUwRkJDOUIxMTM0OUFG
-RkZBQkY4QzdDNjJDRjcyMDY0RjkzQ0QzNkVFNzgxRTQ1OTM4NTEzRTY1MTdEMzI1MTM3QjMK
-CkM4QjA3RjZDODVDRUM5OUZFRTczQzE5RTMzMTlDNERFNTQ5NzNFOUYyMzdGRDRGNUY1MjJB
-MUUyNDdEMTNBNUEzRjc2RDlBMjIzQzFEQwoKMDVERDk4QUYyRjI4NzBEREVFQ0QxRDE3ODE2
-RjYzNjJCQTRFNEMzRTc2NzgyMzQ5NjI5N0JENjBENUFFNUYzQkIxNkM0Nzk0NkUxQjlECgo1
-OTlFRTE5NDVERTgxODk2QzIwRTBFMUVFNUJDQ0EzQTgxN0YxNDBEQUI5MTA2QzZBMzkzOTYz
-NTY0NDBFMjhDOEMzN0YwOTA4M0MyQjMKCjhDMEFGMzIyQTVBNkU5OTExOTYzQkNCNjc0RDYz
-QkZERjA4RkUyQTczNzhERkM1MjkyQ0FGMjlFMjlGMkM2RUZGMDAyOTlFMjM2NzNDRAoKQkY5
-N0I5MTlFNERFQUI3NkE1MkJCNTg4Q0ZGNDg5RDZDOTg0QkU2OTQ1MTIxNTU1RDJEMTFENTc2
-MDkzNUExOEM3RUQ1Nzk0QTg1OTBDCgpBOUVFN0NDNzE2RTEyRTVFNTA2MDRFNERFMjZBRTdF
-ODE5OEVGNzIzMjNCOEI0NDlDNzA1OTgzMUZFMkIzMkMwQjdFRDRGOTc3RDQ1NUEKCjc0QUM0
-MjMzNUY5MkZBQkZDNjlCRjc5OEYzNTA1OTg3RTEwRTZFQTRCMUVCQTdEQUNERjJEOEY3NkEx
-NDAzMTY5ODUwNkY5MjA0MzlCNQoKNTQyRTMzNEZCMzg4MEJFQzc1NjA5OTI2RUU5OTUyOUM0
-RTkyM0UzOTM2OUQ0NTNBNEM4NkNBRTI0MURBRDQ5OTk5ODE5QjZEM0NDOEVECgo3Rjk5QzQ4
-MTZERDAxMDY1REQzODVENDdBNTZCM0ZFRDM2RTFGQjI2MTc0RTA0Mjg2NzdENEJDNTM1QTJD
-QjM1NjQ2QzE3QUM2MjE0RjkKCjNDNjhDN0I3MDJEMTY4QjQ0MzlGRDY2QTQ0RUE3NkJBODA1
-MTgwNTM1RUIzMkRCQkZFQzI5RDRCNDUzMzE3QzZGMzVFMjFDQjQ4MjQ5MAoKNzRGMUM4OUIz
-REM2QTUzRkU1ODhGOERCNDA4RUJBMUM2MEM5RjJFQTAxM0YxNTE3QThEQjNDQzlBMDk3QTI2
-NDNDMENFNTNFRkZFNUE1CgpFNUIyNkNGNDBEM0E5MzI0RjBCRDM1QjZGNTI2RTgzRDJBMzgx
-RTk3NkUwMEFGMTRFN0Y0RkUyMkFEQkI3MTIzNkE1MDY4RTI5N0M3RDcKCjA5OTQ2NzJEODZG
-RkJEQkVENDU0NjU5RjU0Q0FGNUEzNjRGRUM4MjY1QUJBOEY0RjJBMDQ3RDU0Qjg4M0U4MUFE
-NDhEMDk0REU3OEEwQQoKRDEzODlGNUY3QkQwQjM2QjNGQTExRjg4NjREMjFFNTdGNDUzQUNC
-RTJBODkyRUI2RjEyNkM5ODgxNzk5QzAyMTUwMjQyOEIwQkY0ODNECgozMDQ3NzdEQzBBRkI3
-QkFDQ0ZBNDJBQUU0MzEyMUEyNDVGQUQ0Q0UyMzI0ODEwMkNBRjkzQzcyMDE2OTQyQjU1NkNF
-NTlBMjg1NkJERDgKCjdDQUI5QTIyRkM2OTBCMzBFQ0Y4OTI2Njk5RTEwMUQ4Rjc0RDk4RjI3
-NTlFODE5MTQ4RTU0RUVENjM5MkYwQjIyMDMwQUZBNjU1RTA3QgoKRTZCMEY2QTU4MjY2RDVB
-QUQ4MzY1RDI3OUZBNTE1ODRFRDRCREY1RTk4MUUzMTczMjg2ODc4OTM2MkExM0Y2OEQ3RUVD
-M0VDQ0Y0NkQ5CgoxODU3NDgyRENBMDE4OTQ0QUFCRjk5M0Y5MDYzNUM2MDI4MDEyMjQwRDhD
-NjcwQkU0OEU0QkFEMjlCQkMxMThEQTBCNzMzRTIwMTk1MDIKCjA5RjJDNjA4Nzk4RTNGQzZD
-RDM2OTlCNjFEMjA3NzUzQTVDN0UzMUQ1QURCNjEwRjdBOUZGMzZDNkU3MzQ0MjU2OUYwMjVF
-QTVFOEE0RAoKRkE4OUU0M0YxMEI0NEM5MDcwMjQzMTZGMDdCNDE4M0IyMDJFODY3N0Y0NDQ5
-NTIwQ0MwNjM2MUYwNzVCQ0MwNjVBMEM0OTExMzczMjgxCgo4OEZBQzcyRUMyNEI5QjUyNTAw
-RDEwMzczN0Q0MEEzMTFENTc1MkVCQTVGMDZFQjU5M0I1NjE0N0Y3MDg5MTRENDc0QjdFNjdF
-QzQ4QzcKCjMyRDQwQUI3Qzg2NzFFMEM4MDI5NURFM0IyQ0U2OUM5NzU5QjUzNjUyMEVCREE5
-Mzg3MjkyMTRDNjhGRkVGQ0ExMTlCODY1QzJBNEJBNQoKMTU5ODYzMjNBRDE0OTYzNjc5MUFE
-MDBCMzI4RTBFMkQ0N0FFQ0Y0MDZBNDNEOTRGQzg3Q0Q1MEFDNjVDNUQ0RTU1RUIyNEY0ODkz
-OEUyCgo4MzA1RTFERjBDNkFEQTQyQ0E0NzY5MTI0Njg2MEY1MEEyQTYyOTJGMDU5MEQ2RjhD
-NDA3NkYzQzYzMjVBRDI1RkFBNTZBMzYxQzAzQzIKCjAzNjk0QTM5MTAzREQyMDlDMDRCODVF
-NUI3NDBDRUMyMjI5OTNDNjc2NzUwQkY5Mzc0NDhFNEIwRUZDOTQ5MDNGQTA0QTY1ODk1MTEw
-OAoKREREQzNERUNDQjdCNzFCNTQ0RDAzMEU2RERDRERERDVEOEFCQkU5MDg2MkU4Q0I0RTY1
-QzI5OEYyQUU0RDZBQjc3MzA5MUY2MzdDRjhDCgpDQTc1NTY4RTQ2QzVDM0Y2RDgzNzk1NEU3
-QzFFNEFFRDNDNDQ5RkJEQzg1QTMxQzg3RDQ1NzQ4NUQwQzFGQjRDOTc5NTc5MjVFQUJDQUYK
-CjgwQUFCOTYwNzg4MUZEMUVFOUREQjk4NjkyNzNBNjlBRTI4RUU2N0U2OTRBN0FDMTVCMzhC
-Q0FFNzYxMjBFODRBM0E1NzA0NjZBRjg4QQoKQzE0MDI0M0I5MENFMkEwQTIwNkY3MjZBQ0Ex
-MDNENEFBREVGOTdFNUI1RTRDNzUzRkIwODM4MTgyMEVDODA1NjI4OEJDQUY4NkRENzE0CgpC
-QzU1QkFFODBFODY3MDgwMkEzMEIyNDM2MUI0ODMwRTU1NTYzQTc0RTVEQjk4NjJDRTBDNUFF
-OTcyRUY5MTg4QTlEOTYxRUNBNUVGRTQKCjQ1REQxMUZGMjQwQjE5NzY2RDI2MUNBQzMyRjJG
-QTI0QjhERjk1REQ5QTVBRTZCQzVBQkQ2NkUwODgzREU4MURBQzgwOEVDOUU2NEQ4MgoKMDZC
-RjM0RDNENDE4Q0QxNTAyQzFCRjg2NUZCODkwNDZCRjIyODMyM0M5QjI1OUZFREM0NEEyNEI0
-MUFGRjdENEU2MjI3RjMzQ0JDNTlECgpCQjMzNjMzRDMxQkEwRjY1NEY0ODc2MkRFNUQ3QjBB
-MDMwNzlFNjcyMDZDNDY2MUJDNDEwRjNENUY0NkRGMTAyNzQxQzU5NDlBRjYxQzgKCkJEQjg1
-NTJCQTAxQUVFQkFBMTgzRUQ1NzY4MUZBMkZEOTJERDRDNDBFOEFCMTBBQUQ0ODU3ODg4RERF
-RkE1Qjg0OTAxOTFBNjI5QzBEQQoKNkYwOTk2MDdGODVFRDEyNDE3RTg3OUQ3NzBFMDE2RDI5
-N0VEMzFFNEQzNjA4MkI2NzAwMkY4MzM1NjEyMjdBMjg4OTFCNkQyQkRDM0NBCgpDRjNGNkNB
-M0Q4MzNFOEIxRTU4N0I0OTAwRjVCQ0RCMjk1REQxNjI2QkZDRDVEOUJDMzFCOENBMDg2RTI2
-NEYyNTU5OUJFNDJFMDdENTgKCkFEQTZFMDU0OTcwRERCRUJBNThENzE4NUVCMDAzQUFBODY5
-MTM4RkIzMUVBNDc3Qzg4MUU1NTZBMEIzNTg0MUFDMDk1RTIyNjUyM0IzMgoKNzczRTEyOEY1
-NDEwNjhBNzdCNDNGNjFCQTc4OTFGMzc3ODFGQzYyN0MzOTU4OUJBNERCQ0E0REQ5OEM3QkZB
-MzExQTdDQjZFQkM3RUYwCgpBMkEyNTM5M0Q3QkQ4NEQwMEQ5NTFENENGOUQ5QTE4MzQwMzg4
-Mzg4MzBBNTAzNTJERjY4Qzk3MDFEMENFNzU4NDYyNkJBMUFERjFEMDAKCkI1OTJGMzQ4OTdF
-QkVDNjI4MERBNTIyM0U0NkEwREI4NzVDQjEwQkI3NzJCN0NEMTZGMjZBRTE5Q0IxRjJFNTU0
-Mzc0RTg5Q0Q0RjdGMgoKNzQ4NUQ5MTY5RkQ0ODM1NDMxN0IxNjQ2NTc4RDk1NjU1MzQzMEJG
-RjIwOTAyMTdCMTVCQUI1NTBBOEUwRjM2REZENjA4OEE1RTlENTJECgo2QjUzMDNEOUUyQzBB
-RUI2MDc3NDkzODRERjBDRTc2NjQ0MzM0RkYzNkMzNTM4N0Q3NkZGODVCODA2NDQ2MEMyOEZD
-ODk1QUEwQjk5OTQKCkMzNjcwRUEyNkU4MzM1QkYzMzFGNEI0MDY4MzZDQjdFQTQ1NzI1ODkx
-MkM2REY0ODA0MjA1MEM3RDMzM0JDMDJGRUU0NzQ4OTA5RkI0NQoKOERENUQ1NUU3RkQwNDQ5
-N0NFMzREQkU4MkU4OEQ2QUU2NDEyNTA4NjNCOEE1N0IxMTYyNEU2MkNFREQ4MEUwNUZFQkFE
-QkE2NDY2MzYzCgpFQ0VDQjkyMUQxMURGNTkzOTg5MUU1QjVDQUJCMzZGQkRGODIyRUJGMTdE
-OTUwRUZGM0Y0RTg1MENFREM1RjBGRkZDOTdBQTE2MkJGRjgKCkE2N0NENzdFRUREQ0Y1RDVG
-QzQ4QTMwM0RFQjJFRTcxNkIwQzZGNTM0NjlFRTIzQjU1M0Q2NUZDNENERTAwNEEyOTQwQzcx
-RTRCQTcyQwoKMTQ4MkIyRkQyQUJGQzZFOEE4NzdBODA3NDg2RDg2REE2OTYxMUFERkFCOUU3
-NjUyN0U2QUMxNTAwNkUyNkRGRENDMzMxNEYyNEQyNzdDCgo1MzMwNTE2MEE5RUZENDM3MjI1
-OEM2OUU4NDU3RUIyNEFFMTYzQUU5OTdEQTY5MkREQkQ2RjlGNkI0QTBBODBBQzJDMkFGRUM3
-MUJFRTEKCjNDOEVERjQzRjdBNjIyQjJCRjBDODYwRkNENjQwNTcwNEQ2MEI2QzcxNjQyRjI3
-RERGQzA4QThBMDJDNjEwOEI5MDM2QjVGN0NBRkJBMAoKQkMwREQyRUU0QUQyQTNEMDYzRTJB
-QTA3OEZDRTIyNkIxMTQ2N0JBRjk5MjcxOUI1NURERjVGRkNFMkIzNDQ2NkQ0Q0JGQThGQzU2
-NDdDCgoyMjJFQkQxMUVFNjBCQzU2N0YwNUFBMzg3MDREREFGRUM4OTM3NDY5QTgzRDA5NjQz
-RjdCNzk4RUIyOEU1REE4MjNCOUEwNkI3QkM4QTUKCkMwNURDNzA1RjBBMTE5NEZFMTdENzk0
-ODk0MDM5NTYxN0FDMjVCQzkyMkIzQzgzOEM1MDdDMUNBQTk1QjY1QTJBNUY0MTkyOUQ3NUQz
-QgoKMUVEQzI2MTkzMENFNDExNjMyMTlDODgyNzgwM0VENUFDNTBCRjg1QUY3QzY5RDU3Mjg2
-RTUxMjBDMEYwODExNEJEQzMyNzhGQ0RGNzc0CgozRkM3RDhENUVBM0I0RDNGMkIyRjNCN0I2
-QzRENjJEMjBBN0Q5OEFBQkRCOUI5REQ3NzM5NTYxQjE1RkNFRTgxMzlCODFFRTYwMzMxRDAK
-CjkzOUU5OTA5OUYyQjE2N0EwQUFBOUU4NUQ4MDMwNjJFQ0M2RUQzNjkxNkM3NUVCNTgyNDND
-MjgyNUJFOTdGMzAyMUQyM0Q3M0ExNTYxNQoKMTJFQTkwNEE5NDkyNEFFMUI2NkY1QUE2MEFG
-RTNFNDdFNUEzN0U1QkM1MzU3MkJCRDU3OEFFOTIzQzU0NjVGODI0MDU2NzAzREQxQTFGCgo1
-RUZBREQ1NTdDRkEzMjJDNDZCQzk0NDE5OTE5MEM5QUJCMjYwNERGMkE3QjU1NDgwQzVENzAz
-NUFGQjdDN0E3NDU5QTBBMjM2NTczQjkKCjkxRjQ2MkFERUY1OTUzQUIyRjQ1Q0Q4MzdEQjIx
-Q0FEQTZEMzlDRkZEQkEzNTU0QzE2NkJBN0YxRkQyODk1M0ZDMzhCODUzNjI3RkEyMQoKNzU1
-MzcxNDRBNjYyNzAzNUE1MTJCMkQzNkRBNzFCREEyMzQxMzJEN0MyQ0VDNEYyOTc1MEMxNEZC
-ODE5NkQyNTZGMDU5MjJGMjZBM0RBCgpFMjJFNEUxNEI1MjE5NkY4Q0Y3MjYxQ0UwQ0JBQkRB
-QzFBMkMyRTA1NDFCMEFCQkM4RTA5QjE3MzFEREVCREQ1NDFEOTU1N0FGQkQ5MEYKCjNEODRB
-ODc4OUVFRDU5NkY2REVGRDM0RTQ2NTFCN0ZGOURFMUNDNDE5RkM3RkFGMUEzRTdEN0VFMTQ3
-RDYwNjg2RUZENUY1NUY1RDkxMQoKRUZERDU1QzRFMEJBNjQ3QUQ1OTlFMENFMTQwNUY3MTY2
-OUZBQjY3OTFGNDY1RTdGQzFDMjQ3QUI0RTUyQzY0RkIyRTZBMThENDQ2M0I5Cgo5NUNGNjM3
-OTk4Q0I5MUJFQjFCNjhBOEMzRTQ0NjBGOEYxRTM1MTY5Rjc4RkFDMkQ2Njc3RTI0Mzg1NEQ2
-RjZDODY4NUU1MTk5RDhGQjcKCjI1RTM4M0NGMzM4QjI3NkZFNzg1OTU0NDM0RUU4NzY4RkI5
-NTMxMUQ0N0ZEMzI3Mzc1MUU0Q0RFQ0YwQ0RFM0Y3N0E3NTEzQjM5RTMxOQoKMTg2QjQ0OTUw
-MTZGQjk3QjREOTk2RjRGQjg2QUZEMDBFQzlGNTRBQzQ0QUM1MTlCQkE1REVCRkQ1RjM5Mjg2
-ODE3QjI1Njk1NzUwRTFBCgo0RjIxMERDOEMwNkE4NjJGMUY4OENFM0FEN0Q1NzY0NTgxRTU4
-OEQ0NzJCOEI0MDdDRDA3NEE1Q0NCMzlENkUxMzhGQzNFNThDOUMwOTYKCjRCOEMwMTk1ODQ3
-QTdCQzBFNThFNzk2RUU2MEExMEZFMDAzRjI2MjMxRUEwRjBFQjdFMTAwREQ2ODkwRjZBRkI4
-QzIyOTAyOTBBOTdERQoKNEVGMUY1QkZGQzA3MjkyRDJCNEQyNjE4QTQzMEZGM0UxMTVCRkIz
-NTExNjgzNTg5MUVFREVGNEQ5NDU2RENDOEEyNURGNTQyOUJEQjUyCgo3MTUxQ0E0MjU3MEY0
-NENGMzZENkZEMzFBMTBENTg2MzFGNTk2NjU3OTQ5NUQ2MjE3QTIxREM0MzZCN0UyNkFDRTFD
-MDNFNjJDRUFFQTAKCjdDMDlBNjcxMUZBNkI3RjM0NTA0QzRFMDc5OUU3OTdENEQyNzc1RkZE
-MEU5QzJDRUQ5RENDOEY2NEY4NjM5REY4QjIwRUE5Nzk3MDhDNQoKODFCRkM1NEYwOEJBQkU5
-RjUzODRFMzU3ODg1QzU0QUMzM0UwRkVEMjcyMTU0ODQzNjMxQ0UwM0VGRDkzREYwMUQxNjAw
-QkU2NTg3N0IxCgo1MUM0MTIxOTM2NzY0MUVEMDE5MkUxMkYyNkY4NzFCMTNFQ0IyNTgyRjc1
-Q0E3RjFCQUIzREYwQjg5OTQyQkFEMDM2RTlBQzdBNEM3MkQKCjZFQkIwQkREQkFGMkY2RjlB
-RDI4NENGRERGMjkzNEI0RUI4NkU5NDk5OUQxNDMzRUZBMkUyNzgzOTREREY2ODYxODhBQThF
-NkMxNTE3OQoKQUEyMzJBQUQyNEQ1MDM2QTM5QTQ5Qzg0QkYzM0FDODY0RkQ3NkJDOTFEOEU5
-MTVGMEE2MDRCOEE0QUE5OTgzNkRFRTAxRDcyRTA2NTk2Cgo4OEZCRDE5MTk1RDkyRjVDN0ZE
-OThDODY4MDRFN0QzRjdFODE4Q0M2MUIzNzdFRDQ4QjVEQkQ3NDQzNTE1NjRGRDRFODJCNkRF
-QjFBNzMKCkI5NjQ2ODQ5ODVGQ0JBQjk3QUM5MDNEREU4MTBFMDFCMjdDNDQyNjdCOUQ2QzND
-RkRBNzQwMENCOTIyRjZEQ0M2QjcxMUMwNDVDN0MxRQoKQkEyNzZFRTkxNTkzNjY0M0EwQTZD
-RUI0OUMwREVBODdCMEQ2N0I0Mjk0RjIxRjMwRkZENTk2MjZENzc3RDVFNjNCNTQwMEIxRUI5
-MkE0CgowM0NCNjg4QjUzNDFDNDBBNjlDNEQ0MTNGRjRCMzE3NzUwNTMxRUFERDExRjg4ODUx
-RjYzNDU2NjlGNThDNTNFQzhCNzY0QUE2NjZCRDYKCkU1NEI0OEU0NzQzQjJFRUMxM0Q3MTYx
-QzUyMDM0MzNGREFERDlBNENCM0U2OTY0MUQzNzk1QTJFODEwQTQ1QkRBRTM1MzJCOTdBNTJD
-NAoKOURCNTUyQTg3NkMxQUJBQUIyRTNBQzEwMkM5ODc5RDIwM0Q2MkIxQkQ0QzIzQkM1MkUz
-RjBDOTRBNTU3OTU5QzZDNTc1MTU1RjdBRjY1CgowNTQyQjVDMTAyNDdDREI1NDA5NDU0QzZC
-RDdGNTZDMTMyMzBDN0Y1Mzk1RTIxMUNGMkZDRDg3MkZCQkMxQUNENjg3MjA2RUU1OUQ2QkIK
-CjRFRTYzRTI0NDE4NjlGODc1QUUzNTY4MDM1NkVGRTVBMDhBQzUwNENCQ0YzNkY5Nzc0M0Yw
-Njc0MEU1MTM3RDE3ODMyREExNDI5MzNGNQoKNzA5QURGNkRGNTE3N0E4NEQyMkJFREU0Q0Iz
-RTZEMzBCMTFCM0M5MUJEMEQyMDIzNTJCREM3NjcxMDZDNEE4NzE5REEyQzc1QTM1NUMzCgo1
-M0M2N0NDNTM3NzVFRTE5MkUzMTU1NEFFMDIzOTlFQzNFNUNFNzc5QUVENzdEMTEyRjNDNzA1
-OUQzQzZBMzE2MTc5RUYzQzNBRTA0RjIKCjNBQ0E0MTEzODdFMUU5RDA5MzBFOUMxRjM3NTIz
-MTVENjMxRTU1NjkzNkNDQzZFRkVFNzdEQ0I3RTcwNTc3OUY4MzAyODQ4RURGRkU3MAoKRDEy
-QTVDN0JFMjNDQjZFRDY1RERENDdGMEUwRjA4MjE2MEEyNTM4RTFCMDMyQUFFMTdDOTdDRjdG
-OTcyMTc5NzJGOTk3Q0IyMEFGNzFCCgo4OTdCMENFMTlDODk3MkE5MDlFRjEzODA2OTJCODJF
-OUIwOUMyNTdBMENBNUNFMDdGMjcyQjU2QkQzMjFEOUVBRUVERUVCRDA4NjM0RDYKCkI5RUMw
-MzMyMEQyQ0UyMDhEODIzQzBEMDJENUJDQjlBOTkxQUY3ODRGRDcwNUNBMzMxNjYyNjIxRDNE
-NzkzQzhDMzExRjc2NDVGQUMwMAoKQkM4Q0FBRjc0RjNGQjhEMzMyMzYzOTA4MjYwMTU4N0I3
-ODE2NDk5RkE0Q0Q5NTY2MjhCNzgwNkNDNDA3ODE1QkEwQ0I5RTI2MTQ1MzAwCgpBOTE1RjdC
-NTQ2MjIyRTVCNDk2OUJENDREOURGNTE5NEQ3NzE5QTBBN0JGNzJCMEZBNERCQThCMjNCQTAy
-REM4NDQxQTlFNEM1N0M3REMKCkNDQzJGNUJFNTk3ODZGM0Q3OUQwNzBDMUYyRDAyMDAzMTYw
-QkU0QjAyRTY3NjdDNTg3Njk3M0M3ODZFMTBGNTY3QTExMjhDNjc1REVCNwoKNDYxODNEQjM0
-REFFMjk4RTA3RjBGNzhBNDhGQkNCRDZFREUyNjk4NjM5QUJDMkU1QTFCMkU0NjdEOTNBNjlC
-RDJENjdGNDFGNjI1OTNCCgo4MjQyQzRBNDA2OEJFQkM0RkE3MTY1QjYwQkNEMDdBODc1MjU3
-OUZFNDZDRTdEMDQ5NEIwNkQwQ0MyRTc1NjhFREVENjBEMEY5Q0JFQzkKCkQzRDQwMzJFNjUw
-NzQxQkMyMUE4Mzk2MjcwMDE0NEYxQ0JCNjhBRjI1QkUwQzBENUVBQTlERThERDhBNjhEQTdF
-MEY2QUZGMUJEOEZCMgoKODI3ODIyNkEyRURERTdFMEIzM0JBNkQyQTA1MTRENEY5MEI0OEZE
-NjMwMEZGQTlCNzQ3OURDOTM0QkYzQUFBQUI5NUIyQUY5NTY0RTlECgo2RUMzOTk1N0U3NzJG
-QzVGMjQ4MTY2Mzc4MjBCNjhCODgwQ0Q4NENCMEM1MEI0REEyMTJBMjBFOTA0RDM3QjM2MEUy
-OUREQ0EyQ0ZCNTcKCkVGMjM5QTVGQUU3Rjk2NEM3MkIxRkFGNjQ5NzJFNDk2OTMzNzAxOEQy
-NkM5Q0I5RDY4QjZDQUM0RTNDRDJEMzg5MzE0NUM5NDMyRkM2RgoKMEZGOEMwNjJDM0YwRjFD
-M0FCMEVEOEQ2QjU1MDVCRDE2RUU2QTE1QUFFNTdCQ0UwNzMzMzQ2NTUwMTg2N0YyREVGQkJF
-MDI3NEU0NjczCgo4RkZFOEJEMUI0MjExRkVGNEE4QzI4MjA4RTk4Q0I0RDcyREVDNTU5MTI3
-QUFEQUZFQUNCQzBEOTg4MTcyMzkxODBCQ0I0M0REMjM5RjYKCjkxQTNFRURFNTE1QTMzNzBB
-RjU3Mzk4NDFBQjlDOTFEQjc3QjkxNDQxRTRBNkYwRkUxMTNCNERDNTA5RTRCQzk1MUM4MDBD
-RTc4ODUyNgoKOUU4MzZBNUFFNTk1QTcyNzdBQUM4NTEzMzBDRDNDREFFNERENDU2OTk5NEUx
-RjRDRkNDNzVFNDU5QkM5RTFCQzdGMjE1QkMyRDY5MjZGCgo1REQ1MDlBMDlDRjIyQzUwNkVC
-RjIyRDIzMDQ4NzBDMzkwNUQ5NDYwOUY4Mjk1RDBDNTVCNDAzQTc1NzJGRjRDMERBNjAwQTc0
-RDM2NDEKCkRFNERDMENGMTRBRTM1MENFOTRFNzEzQTJBRDgzMTQyMkYyMTcxNzc3MTg3ODQw
-MDY5RjQxNENCRDMxRjM2NDhGODgyODdDNTBFNDI3NwoKMzIwNTRGNURGQTFGQUJFQTU3RUVD
-QjhGREM4MDE5RDM3MzM2RDhEMEU4NDBGQ0VDRDBGREYxOUU1NkEzODZDMzUyMUUyODcyNkMz
-RjBECgpCNkRBNDkyMTBGNzJDNjZCQ0MxRTVDQUIxNUZGMTlBOEIyNUM1NDQyQTBGOUUwRDQx
-RkFGODI0MDc4RkM2RjZFQkIzNzc4QzZGRkRFNjkKCjhFRTAyMUMzNTNCMkEwMEY4MzkwM0Uw
-MDFBMTcxNkU3NTMwOEEwOEE4QTg5NzhDQjRBOTlEMzc5Qzc2NjI5RUVGRjY1QjkyNkVFMzMz
-OAoKNTQxNDRGNDNCMDRGODM4QUI1MDAzRkMzNjUwNTMyNUQzRTRFNEI1RkI3NUExMjIxQjMy
-RENBQzRDRkQzNTg4RkUwREEzNEFGM0FBRkFDCgpBMzk1NUNBQTA0ODU2QTE5NkFEREExNjE3
-MUFBQjdFMjFDMzRDQzQ0Nzc0MUU1MDZGMTUzQjdGNDY2ODcxMzQyQUM3MkQ3OThCNjM1NzIK
-CjNGNDk0N0FGODRFNjc5RDRBOTE0NUVDMjYwNjRGMDIzODhDNzMxQjJEQURBMjY5NzdDNTZG
-REUwOUJCREUwNTFBRjg5NUE5Q0M0QTgwQwoKRTlBQUU3OUYwNkJGOTEzQ0JBQTY5RDQ0NUIx
-MjAyM0FGMUE3QkZENTg0RDQ0Q0NFMDRGNTBENzdFOTJGMzkyOTRBQTFCREIwOEZDNjU2Cgo3
-MjE4Q0I3RkEzNEEwOUUxNTc0RjdBRTQwREU0M0ZGQjcxNzYyNUYyQzU2MjlBRkQ3MUFDRDhE
-ODBCODg4MzJDMjREOERGODIyNzlEODgKCjMyODExQUZDRDYzNEM1MkUzMjFBNDc3OEZGMDY2
-NTA4QTBBNjNDRkIzOTA1RUE3NUY1ODIxREQ1NjhCOTBEMTEyOEJCQkE0NDIyM0M3RQoKNzVE
-QzhGNzgwNTY4RkIyRTYwMzk2MjEyNUNCMDJDMUE0OTJGQ0EwQTAwOTZBNUJBOEI3RDBDQjEw
-NTFBOTRFRjYxN0RBMUU1NzcxQjBGCgpEQUNEQ0Q4NzdEMDY5OUUwMTY1MEY4Q0FFNzAyN0Ey
-MEFDMzA4QjdCNzFGOEQyNzA5Q0VEOTgxNTQxQjUwNDU2RDdEMTcyNEQyOEZEQzcKCjRCNUZE
-MDVCRjcxQTk4REJBMUIyN0QyNjk0MzZDOUJDNjY4RkVDQkE4RDY2MEREQjdDRjdGN0Y5NjFC
-RUYwNUZBNjJFNDk0MjE2MTlDNAoKNENBNzIwQzI0MjZBMUQ0ODZDOTVFMDI2NDE2REQ4NTM0
-Qzg1QUEyMDBGOTVCOEVCRDRBNDUyNTQxNjI5RTFGREUyRkUxMUQ4NEQ5NjlCCgoyQUEwMUE5
-QjdGNTQ2QTY0RjU5ODE4M0MyM0UyNkQzOEQ4NkY0N0UyOUM4Mjg5QzVBQkVBRjFENUFDQUJD
-RTEwREU0NkM1MEUzRDI1RDkKCjgwRDA3OUU4QkJBOTk1MTVBRkQ5REIyNUNBOEQzNDk4NEQ1
-RDk2QUJBNjVFMjg1MDQ4MkYyNjREODMxNkVEMzg2OEQ1MzU3QUUwMkFFNwoKM0NENTI4MkRD
-MTkwOEE2NjZGOUVBRjE1RkJCMkUxOUQzRUEzNTA5QzU3ODFFRDA2OTBBMjA2MjFCREQzMUFE
-MkQ4MEY3Nzg3QzVFNjc4CgpCNzE3MUI5NDVDNUFFRDc5MThEQzMxM0UwMTE2NTNENEFCNUNB
-MTUxQjQ4MTQ0QTBBNkIyQzJEQ0ZGMzYxRjcxMTgxMURCNkYyNDlCRTcKCjY1NzlBNDNFRDM2
-MzMwNkQ2ODExRDZFNTgwMUQ2QTg0RDRDODkyOTU2RjBEMDBBOThDQkY1NjhBNEJFNDgxMzI1
-QUM5RjA5NzJGQkQ1QgoKNkNFMzIzQjBGQzQzMjI4ODUwMTI3NkJEREE0RDUwNTA1QkNFQTQ0
-QTVDN0RGRkUxMThGMUVBOUZCMEEwMUNFM0I3RDhEMDQyQ0I4QzQwCgpGQTMxQzBDN0Y1RDY1
-MEQ4NTZDNkNBODY0QkUzQkI0NkQ4ODc1MkQ4MUVCMTUwMDkyM0Y5REI0N0M4NkI4Njk5OEM4
-QjFEQTcwNzc2QUYKCjcyQkQzQ0VFMkYyMkZGN0YxMzJERUVERjhFMUZBRDk2RDI0Mjg2MzI1
-MkYwMzMyMkI0NTg0MjhBNUQ5OTY4NTJCMUE4NjJDNTdDRjA4NwoKQzFBREU5ODAzRkFGMjRE
-MjVFRDU0QzlDQUUxQzMxNzVFNzUyRUJGMERGREQzRENFMDAyQkJFRUQxQTE4NUYyQjk2OEYx
-Nzg5NjQ1RDEzCgpEODNFM0ZCMTVGMjRERjQ0RTg1QjMwM0YzMkM2ODE3NjJEMjNFRDgxM0FC
-Qjc1NTUxQTMyQzhEMzVDNjBGQjM3ODRFOTI2QUYxODdGNDUKCkU5OERGMUZFMTdFQTkxQUQw
-QTExRUJDRjE0QkIyMkJGRjE5QkI1MjQ1MkU4RTA2Q0UzMjJCMjk1OUNFQUFGRDk5MjA1NENG
-RTk1QzdGMgoKNDVGNTZFQ0JBQzA2NTk1RjQyMDJBNTI3MkI3QUZDRDQwQzk5RUYzRjc4REM5
-RkVCRDU1MkRENDkxMzU3MDQzODM1MUNCNzZFRDY5MTQ3CgpCNDZBRjU4OUU3N0RDNDJFRjAy
-MTgwNDk0MEFCQjM5NUY1NDlBRTc2NjFCMEUyOEUxODBDOEIyNEI4MkJEQjc3QUExN0Q4RkJC
-MUJGQkIKCkIxNkFERDVCNDhEQThBQ0E4MzIxQTY2QjYwNkU2N0YwRDY0MjE1QkMzRTI1RTc0
-RTI2RTY5MDhEQjE5RTk2NkY5NEIxRjNGRjg3MjY0MgoKNTM4MEZENzIyQjAyQzI1MUQ1N0Uz
-MDEwMTZGMjlBOTg0MTZEOTBCMTk0NTgzN0UyNjVBMjg0RkYyQjhENjU1ODkxRDc2OURBQUQ3
-NEI1CgpFQjVBMzI3NEZGOTE0MEQzNkVCRkQwOEE1QkY1NzlCRkU1QjNCQTk2ODU2QUJDN0M0
-ODcxQTBBOEY3NkQwNzM0NzI1RjZGMUQ0MkVCOUIKCkIxRUM4NEFFMjkwQkJDM0RFNjAxODAx
-MDAyQjhFNUYwNzVBMTVEODFGOTU4RUE0NDZERDJEQjhGNURBMTBFNzcyOUFFRkY5NEQ1Q0RF
-OQoKOUU0QjkyMzcyMjU2N0I4NkVDODE5OTlFRkEyRjcxM0U1OTdBRThEOTcxNTg2REIxRkI4
-OUFDNjNEM0Q0QTYxMzcwNTNCNEI5QzkxODZECgoyOTk5NEY1RTRDNzAxNzIxNTNCRTM3RTNB
-QjFCOTM4OEE2NzY1QUNEMkIwMkVGQzhERUI1MDY3MEVFRjc5RkRCREIzNDk0RDMyRTk2ODcK
-CkExOTNBRTZEQjJCN0I3M0M0Mzg3NkZGMzJEOENFNjQyMDA5NkQ5QjdGOEE5ODUwODEyODgx
-QTFFMTgwNTRENTdCOTg0MDNBMzIzRDA1RAoKREZGNkNEN0FFNTlGNEVFNUZFNDY2Q0Q2M0My
-N0Q3RkI2RkI2Mzg4NUQwNUY0QUM3NDk1MTM5MkYwQkFBMjdCMDhDRjg4Njg2MEQ0NDg0Cgo0
-MTVFMURCOEVEQ0FBMzlDRTc1OEY4RENCODBGOTYxQkQ0MzA2RTRBNDYyQUQ3QUEzMzMyMTk1
-MDAyQjMyRDUzRTVDMjEyQzAxQzk5NDkKCkZFMzBFOEEzRUVENjc0N0U3NjU3QTU2NzYzOTAw
-NkYzQjQxMTk4NTQ0NEFDM0UxQkQxMzMyNDFENThERDMyQTI3ODAzMzQzRThEQTk2OQoKNjBB
-Rjg1MDEwRTlCM0IxNkFDNENGRUQyOEYzNTAwRDU1OENFQTUwQzUwN0Y3QTg5QTdGMDY5QjFG
-QUU4NzM1ODRENkNGQTBENEYxQzI5CgpDNDYyMDdFQjY3Njc4MkIyMDNDNTUyNzlCNjc3NzE2
-RDc1NEUwQzE0RjE1NzExOTc1MDU0RDk0QURDODIxMEVBQ0QzMDIwOEUwRkNFNDcKCkY4NEUx
-MjBDNTQ1REMwRjFBNDg2MTE5OUQ0MkU1QTgwOUI1MzFENDJBQjA5MkM5QzQyMTY3REI2MzAz
-QzVBMzM0REUxOEREQTdFNzlEOAoKQURDNTQ2QTgxQUY0QkYwMzY5NTY2MkE5Q0ZDRkU2RkE0
-NjlEQUM2MDU2MjQyQThGRUI4NzkyOUY5Nzg5MDlDNkQ0QzkzREQyRDYwQkUxCgo2MEZFRkRB
-QjkyNjM4ODcyQzNFNjUxODc0NkMxQjFEQUUxN0FBOTY3REU3OTg3Njk5OTYxNTA3NUIyRkZE
-QTY3RUU5Qjc0M0UyQ0Q1NjAKCkVCQkE1NjA4QTk4QTA1REEzN0Q4RjIxQzE2MThDMDJEOEU5
-Nzg0MjNEQTgwRDdDMzhDRjU2MjYxMEU4NUREMEYxNzc1RDgwMjFDOTQzMgoKN0NCQjFGNUMy
-MEVBNDFFOENBMTlBNEU2RDUwQTNCRDUxMjlFMjExMDFFMzEyQTlDOEY0NzBFMUVCMTJEMDM4
-RTVBRTRERTUzN0Y0MzI3CgpCNzcwOTE2NjdEMTk2QzM2MTJCQzY5MjVBMjRFNjZFMkJCQ0ZC
-RjZBNEM5Mzg0NTdGRUUzNkRDMUZGNzRFRDdBOUM4RjY0ODNDNThGMkYKCjI3QjcwNjVGMzU2
-NjMyMjdFRTQ0OTJFM0YwNkI2MDcxQ0VBNDU3MzlBQ0I5NDNCRjBFRkZCQ0I5OUQwMzIzM0M1
-MzEyNzAzRTc0Q0ZBMwoKNTI4ODE4MkQ5RjM3MUUzRjIyMjU3OTY0Rjg2NDcyQUFFQkE4MDYx
-QkYwMzlDOThDMEI4REYxNEM3MEZDOEEzMTNEQ0RFQjk0M0U2MjUzCgo1MjM0QUVFNjI4QjlG
-OTc2NjBBNzY4Q0ZDRDA0NzAxQTBGNEM4MThCQTVDMDIxOUU3MEIzNzU3MERCMEQ2MjVFNERF
-M0YyMjBFRUFCMEYKCkExOTQyMkExNzEyNEIwOThFQjRDOUM5RTcxRTJBQTBCRjUzNkE4MTE2
-MUMyNzg4OTczRUI1NkNBMEE4MDY0RDYwMjVFNjRDNTcyNjUyMwoKMjY1QzJFNkFFQ0YyRTA0
-NEQwOTY5NTA4Q0ZENERFQTdBQUZBNzE3N0ZCNzk3QTVFNTgyMDVDMDk0QkU5ODVGQkQ0Q0NE
-MkQyNDlFQ0Y0CgpCMkQ3NjY4OUVDMzNGNjQ4ODlGMkFDNDAwOTJGNDdCOUJDNkQ1Q0VERDFB
-OUY4M0EwODMyMDk2QjgxQkY3NjI5RTQ2NTkxQzEwOUY1N0MKCjQwMThFQUFCNzhGRTcxNkQ3
-NkVCM0MzNTEyOUJCMTYzQzEzRjNBQjc2NTFFMzg5NzEzNTEzQkU2NkEwNkUwODJFOTBGRDJC
-QjBDNUNDQwoKNTFEMjI5QjNCRTVBRkREMTc1REM5NzkxRUFDMEMyQkE0QjMyQ0IwNDI3QUEx
-NUJCNTA2QkQ2Nzc5MDdDRTQzRDU4RjkyOUMwRTcxMUY2CgpGQzk1Nzc4NTE1QzI1RkU5Qjg5
-MkJDQjg0NDhFQzZFQzBCRTQ4ODYxRDFENTdFMEIzNkY2MkNDRDY4N0Q4MjQwNENDRDUyQTM4
-QUYyNjYKCkU0MkQyMDE5NTMyNDlERDBFODQzMDhDMENFNEE2MDU2QjA5NTJGMjUwODRDNjg0
-RDNFRjIwQzYwOEZBNkY0QzRFM0ExQTI3NDMwNzc0NwoKNEU5MDNFQzQ2NzM1NDI5RkNFMUUx
-RUJBMzYzRDUwOTM4NUFDMDY3RkVFMTAyNzI4MkY2QzczNTc2OEI5NjVGMjZFNTQyQzRBNjZB
-NjJDCgpDMTM0REZGOTRDNjkyNDAxRkI5NkU2M0YzRkRGQkUzRjUzMUEyNjQxNDI3NUNBQUFC
-MTQ2OEUyQjQ2MDQ5Q0IzOTk4OTUyM0QyMjY4REEKCkRCMUI5REY0QkZBRTk0RjA2RjcxRkIy
-RkJDNDk2QTY4N0U2MkNFODY1NzJCOUFDRUQ3QTZDNjVGOTg1MERBQTUyRUIyOTZGN0RFMzMy
-RQoKQzQ0RkYxRTBFRjJFMjI1NkExQjUzQkQ5QzU1RTc1QjgxQUE5NjgzMEIxRUREQTM5NUM2
-RkE3NEUwRDJENTA5QTVENzcyMDRCRTdFMTdGCgo4RTRFRTZDQjE3NjM3MjgwMDI5OTFDNjgz
-NTdBRDM4ODJCOUMyMTZCOEE3NTc0NkUyOTY4MEI0QTgwNzM4NjM2NEU4RTVDRTQ0RkQxNjMK
-CjREQzFFRTVCQThGOTVBQzIwMTM1QTQzNDRFMUE5QTM2N0ZENDc0QzM1NzI4MThGRjY0M0RC
-Q0U4QzhEMEMwMEREODAwQ0E5RUFDNTgyRAoKQzVFRjg3QzREMTM0MDg3NTlEQkFCNEU4QUFC
-RThFNzdDREUyQ0E4OUJCNTgxRkY1N0Q3REQyODRCQjgyOTc5ODU0NDREQjA3NEQyOTlCCgoz
-QjcxQThGOUI1ODZFMTUzQTIzRjc1MEI2NkYzOTZCNjMxMkNEMjIxRjQ0MTcyQTZCQTIyNDQ5
-NTgyQTkyOTRFQ0RCREZERjA5MTdCNjYKCjBBMkRGQTFFNjQzMTg4QTAzOTVDMkU3M0IzNUZC
-RjI1QTk1N0E0NTY3OTFBQUJFNDcxM0MyQkQzM0Y4MkUwQjNEQTQxRDE0MUZERjI4QgoKOTRC
-NzJBRTA4QTBEMzk4Mjg2NEU4QTU2NUZGRTVCRjlEQjRBNDlGNzIxRUQyOENFOTREQzI3REFG
-NTAzMTU0QjJBRUY4RDRDM0I1MkRFCgpBRkE3OTRGQkZBNjM5NDFFOUFBN0YxNEQ4RkQ0QTM5
-NzFEMzk5QkRBMDc5Nzc3NkQ2OUMwRjY1RkRFQjA5RjU0RkI3MzJDNEVCMjRBMUUKCjc0REYz
-MEYwOThDNTlCRDg1M0U0QUVGM0RENDcxOUQ4ODNGMzhFRjQxMzFFQUQ4NERDM0UyM0I3QTM1
-ODI1RjM5RjYwM0ExRjhGMTBCNgoKRkI3RkNBRjUyQTFBN0UzMTVFNEE4QjlEQjk1NjhDMkYy
-MzQ4MkU5NjQxRjgwMDczMzMwRThEMUIwMjgwQUEwOTc5M0YxRDkzRDhCNUNCCgo3ODQxQTFF
-QTlDOTIzMjc1MTAzQjYzMjE1QjQzOUY3QzIzQzJFRTJBNENFMzhEQjBCN0ZCQUVBQkI0NDEy
-M0YwRkFDOEE1RkYxREQ1NTUKCjFGNENGN0IzMzEzRDZBMzkyQjU4QkU4NzJGQ0UzQTg2N0Q1
-MDI4MzRCNTZBQjE0MTgxNEJEMDQ1M0QwNDhENkQxMTRGOTM4Qzg1MTRDQQoKNjIwNjA5NzhF
-OUI5NTRGNDVGRDY4ODQ1REFEQ0Y1Qjg5OTJCRTQ5QjI1MDIyQkY2NTlBMDZCNjVENEU3MTgy
-NTY1QTNEOTAwOUI2MkUwCgpEMUFGM0U4OTdEMzVDRjc2RjVBQzY5NzUyREVDQzdFM0FFMzk4
-ODMyRjRFQzQyMDhBMTI0OUYzMTc1RTY1OTY0RjRFMTgzQzhERTJGMDcKCkFERjM3Q0M3M0Ex
-MTE4OTBBQTA3RjEyQjlFNUZBNTNDQzNGRUMyQUZBOTgyODFEOTVEQkJEQTVBRkU3NzA5ODU3
-Qjk4RjIxMTc2QzM4MQoKNUI3NjVBRDgwRTM4NjU4RUE4OUE2Rjg4MzU0QzNCMUM5MDY3NDlG
-NDc3MEYxRDk3QzE3ODU5OThENTkxQzAwMUM0MzdCMjMxNTA4Mzk4CgoxREQ5MzNDMTgyRjNG
-RUZFMjJDNkI5ODE3NzE1QkQwQjA5MjlBMUM5NkVDMzM0MkMzMUEyNTgyQjlGOTAwQ0RENjBG
-MDgzNURCNzE1OTcKCjRERDA4NDQ4OTNDMTNEMTI3MjgwOTM1MzEzOTAwODJCRjNFRDFENEM3
-RkYzOTlDQUYwMTRCRjk5Njc0NTE0MkJCM0I0OUNDRTY0NjEzRQoKNTI3NDI1MkREMzZDOTBD
-NzE0RUMwMkU2NTYwRTBBRDVFRkU1NDEyQjY3ODQ0MjFBN0MxMkE0QzBFQjlCMDc5RTBBMkNB
-REI1OTUxQTkyCgpBNjc4MzA1MzY1OEFENDcwNUYzMjFBMzI2MTY0Q0ZDNzE3QTIxNDUzNEVG
-RDQ5MDk3NjcyQTkwNzZCMzQ3MzU2MEZDNkQwQkMxREU0NzQKCjcxM0Q0MUY2OEI4MDRERjk5
-QURGRDJFMTkzODIzMDU5ODlFMjVGREUzMzM1NkUzRDhDNDU3NEJBNDFGRTEwN0JFMzREMzIy
-QTFDNTBCNwoKM0I5NjQ3MDdEREE0MzgwMTcyMjZENUJCNEUyRkI0OThENTBDOUE3Q0U5M0U2
-RDUyNDczNjgxMDA4QjczM0Q0OTRCQkVDNzY4M0ZFRDhECgozMUYyMDE3MjMxNEI3ODFGRkI5
-RkI3OURFQTYyODEwOTM0MEM5MkFDRDk2N0Q0NjczMTI2Qzk1RkE4QzZFMkE4MDM1QzkxOUMz
-REMyQ0QKCkE2Nzg3RENEMDQxMjIzQTFGNTU1QkYwMTFCRjNBMDAyNEQ4RDM0MThCNENGQTY4
-Mzg5RkJDNTQ1RTFCMzdBQTEwMkQ5MUVGNDAzOTdGNAoKRTJDNDU2NEZCRDRDQzM5NEMwQTEx
-NTNDM0EwRDUxNDMzNzI1RDM1ODI1M0IzNzU2N0VDNTk1NjA5QjJCQzBGRUEwQUU2NURGNEUx
-RDIwCgo3MzQ4MUVBQjUwMzVBN0I5MTM3N0U1MEMxOUEyNjFFQTBBRTlCQ0ZFNERDRkM3OEU0
-MjY2NDZENjRBNTQ2Q0MwM0E4RjI5QjZBNTEzRjgKCjg0OTZFRjIwMUQ3QTlBMzM0NTQ1NEE0
-OTdBMDZGNTdCQ0YwNjBDODA2NDQ3MkE3QTZDMTU2RkZCOTZBOUNENjYzQzgwN0Y0REZDNkI3
-QwoKN0RGNDJBOTVGQzkxRkJFRjRFMjdEMUFCNjAxMEM3NkIwMTZBQzFFRUNCOTgxODRFNTAx
-Qzc3NTA1MDA4MTlGQTRBMzZBNTBFQUFGMDlDCgpBOEEwMjgyMjAwRDIzRjc2OTQxOEU4NDIx
-QTk0MEI4OTQyMDg4NjBBNUZGNTI1RURCODA0QUFBNDU2RUVCRENBMkQ1N0Q1RTQ1RURGMTYK
-Cjc1QjNBNjkzRjFEN0E2OTYxNzI0NDIwQkJBNjFDRTkxRjVEREM5NTNDNjk4RUNGNkNEMTg1
-QkI1MTBCMDVFMDU2Rjg3RTZFQTcyOUNBQgoKMzgxNjhFNTdBNTIxNTNBNUJCNTkzOEMwODU1
-MzNFNTBFNkZERjMwQUU0QzVDRDVGNjFCMzFCQTA2RTVCMDY5RDc2QTk1Q0RDQzY0RTdECgpG
-Q0IxNjJERkVFNDgzNkMzOEFCMTZDRENDQ0ZFQ0YxODEwRUU1NjFEQUI1RjVBOTA1OUQ2MzIx
-RUYwOTg2M0ExNjI3RjVDM0YzMzlBNUIKCjU0Q0Y2MjdENUM0NUI3OTREQUM0NkI5RTU3RkVB
-NDg5NjAzQTlEMjMxNUNCOUE0MkNCMjRBQkI3NTU1NUJGREQyMTQ3RTBEQjBBN0Y1OAoKMEJE
-RTgxQzdDNzBDM0ZGNkZENkNBMzA0RDcxOUMxODlEMEQ3RDk5MUNGM0U4N0UxNTI0MDQxMUZB
-OTQyMzdCOUZCMTQ1RkRENDM4MEZECgozQTVFRTE4NDNCRjU1QzZDOUY2NDBGN0I5RTQyQUFG
-MUQ5NkZGQzQ0RDUzNzE5QjgzRjlDMTFDRkRGRkU1MUJDNDU0RjUwRjIwRDRGNjIKCjU1MTZG
-RTRGRkIxRUU3OThDODVBRkRBNTMzMTkxODVBMkNFOTRFQjM3MTcwQkQzQjk0OTU4MkFDRjIw
-RjQzQjBGMUM0MjExODQzRDUwRAoKNEMwRkI2MTUxMDdBNTk4NUYyQ0U0OUNFMkY3QjE1OUM0
-RTU2NkU2MTdCMUM0NDYxOThGNDhERUUzRDMxRTkxOTRBRkNBNzFDRTI4NzBDCgo2NTI2QUIx
-QjA2MTRDMUI4OTRGREMwREIyRjIzNTYwODJCOEMzMTFDQkJGQzQ0MjJBRTQ1QjkwODUyMzI2
-REU5OEExN0NBOEY1RUI5RDcKCjQ5MjQwNDkxNkM2MTM2N0JCOURGNEZBQUMyRkUzMEM2QTcz
-OUNERDczRTBBQTFBQkQxNEJCMkQ3NjYzQzg2QkEyNTk4QUY4QjU1MzYwMgoKREY1QTAzMkNG
-ODBGNzlEREQwNEQzNjMwREVENDdCNDhFNThFRTc0RUFDODFBNUJEOTAyMzY5NTRBMDJEOThB
-M0RCNzA1REZCQ0JEQkQ3Cgo1OThENzc0QTI5MjAwNjMyRjU0NkExNTlBMjY1NkI4NTk4MkZG
-QUQ2RTI2NjgwNjk2NjNDRTAxN0QxNThCN0NCQzEzMTBCQkI4NjcwNTMKCkIzMDBFOEZGNEE1
-QkNGMjg2RDZENzdDRTVGNTg5MEQzRTNGREE3MkM1REEzMEQ3RDcyQ0EzRTA0MERFQzM3OTJG
-RUZEQTcxQ0VEREJGOAoKNThGMTczOTZCRDVCOERDOTlFREMwOUU5QTJCOTg4NzdBQTc5NjY1
-RTFFNDNDRkYwMjAzMEJFRkRFOUUxNDk3QzgyMkFFNDU4QkI2QjE1CgowRjZBQTQ0RDcwNjRF
-NjgyOTRCQjg0Q0MzNDUzNTA2MDA1M0QzNkE3NUI3NUI3REU2NjREMjgxNDA2RkYzMUJGQzkw
-NzE3NEI3NkZDNTEKCjExNjQ2MDJFQUVDMDlBRDE5QTBERDI0RjAwM0MxN0ZFMzc3Qjc1Q0RB
-ODk4QTM4QTQyOTFFRTUwQzVEOUM2OUY0QUNEQzIzOTQ3Nzg0OQoKQzYwRjAwOTk4MjJFREQ2
-RTNCQjU2N0FDQzE3MUY3QUM4N0M3NzVFNTZCMDc5MTQ3QkZDQTgwMjA3NURERDgzOUI4NjlD
-NEE3MUY2M0I2CgpCMkM2NUU0QjlFQjFDQjhCREY1NUJENkVBQUUxRjI5MEI1MkQ3MTJDMTRG
-MzY1RDM4MDVFMjlBM0I1NjQzQkI5MEVBN0UxQ0Y4RDlCNDIKCkZEMDlGRkJBMDZDRTk5NDE4
-ODVDQTZGOTFGMEQxQ0ZFOTFBOTRBOUJDNjE2NDYzNEZEN0NBMkFCODg5NTJGQUEwRDI0OUZD
-RjQ3RUQ4MQoKQjlCNTIwRUQ5QTU5Q0VCQTg5OTM5MzJENjdDNEY5QURCMjc4NzFFNzExQjdG
-MEYzQTQ4NDU1MTBDNDIzODQ1RjM5NkFDMzkzOERFODNCCgowMzA0MDU0MTkyQTc4OEUzNDNE
-NTEzODFFNjIyRTVENDZGRUFENjdEODUzQkYxQzhDMjY5RDkwRDIxQjYyNjc0MDlBMjBFMjRF
-Q0VBNUIKCjFFMDgzOEE0MzQ1ODU4MTRDN0U1MTI4QkU2RDBDMjQ4Q0FBMjAxNDE2NUE4Qjk3
-QUFBNkJBOEEzQkQ4NjgzNjFFOEFGMEMxMjBFQURCQgoKQzIyOUVFQTc4MjI3MTg4QUIyMkQ4
-RTg1RjYzODM3M0U3NENCRUE3MTk3QkFBOTg0N0Q4RUJGMTYxNDU3MjZBQTcwNkMwQkE4MUVE
-QTdDCgpGRjdFODhCMzlGMTk2MDkxNjU2NDAyNDZBNEE5QjdGMjYxQTVDOTNBNUFENjREOTMz
-QzRBOEVGOUQwMjZGMjI5N0YwRUZBRDU5NUQwRkMKCjg3QzEzOTNFQkI5NTgxRDkxODE0QzQ3
-QTBBM0IwNkU1Q0M0NTBDQzIyRUUxQjIwMTc1MjI1ODQ1M0Q0RjE0NTU2N0Y3RDgzQ0Q5OTky
-MAoKQjVDNUMxOUIwQzhCQ0RBNjk0ODI5OEI2NzcxQTUwQ0FGRUM2NzNGNDRBNjA4MEY4OTg4
-MEVGMEY3NjZERkU5RkUxRDlDODUwQjBDQjdBCgo2Q0NDQTI4MDY5OEU4MzI2NDlDRjYwNENC
-NTQ5Q0FFQjMxQ0Q4MzU2RUQxMDZGMzY1MzIxQ0U2ODA5RTJCRjI2QzE4NjQ5N0NERjJEMTgK
-CjY5ODc2MkU0NzQ5QTkwRjZDMUQ5NUI4RUE3RUM5NjMxOTExM0M4NzExNjExODEwMEZDRUEw
-RDU1MEYyODMyQzU3QThCRjVFMUUxQzg0NwoKRjBDOTBFQjExNEM3Q0Q2QzNBQzJDMkM1RDdB
-N0I1NjU5ODczOUNEMENFRENGOEQwNjlFREM0MzdDN0NFQUU1QzBDREZENDZCQjU3RjIzCgpC
-RDBENjFCMUFDMEI5MjA1RkYzNDE5NDYyOEQ1RkJFQTZDRjU2RERFNDU5NDNFQTE4ODgyNTEz
-ODM0MTcxMzc5Njg3NEUxMDg5Njc1N0QKCjkzRUQ5OEU3QjYwQUQ4OTBEQjJBQjY4MjMzMEFF
-OEUxNTU3MjQ5MDAwMUM5MUVCMkE4RDdCNTZCMzNCQzdFMDU5OUQ0REQzQTU2OTJEQwoKRDJF
-MDVGQzVERUZFQjkxMDI1MDUzOTJBMDA4QUNFRTc5Q0U3QjJCRTJBMkIwQUIxRTc4M0YzNTMx
-ODNCRTBGQzlEMTlDMDA0NzRFMENCCgo4ODE3MzUyQUQ3NTVDNjMxNDVEN0M5NjVDMEU3NDJG
-MTkwOTY1M0ZBRjMwQzQxODc1QzZCN0VEMzQyMTQxREI0RTc0NTEyRUZDQzVCNjQKCkE5MTQ2
-OEM4OUE4RTY5MkYwRUJGQkI0QkFBNjI2NEUzMTcwMjgxN0M5QUQ4RUI4QkY3NTEwNEU0RDRB
-QkRBRDFGRDVBODExNjZGQ0IxNwoKQTU0RTcxNzY3MzQzRjM2QzQ3RDQ3RkRFMDdGQTNCN0Y5
-NDNDMjA3NDYyMkJGQUZCRTc1NjAzQTBBMTE3QzFCRDY3OTExMzkwMDk5MkRFCgo2M0MwRkZB
-RDA2M0I2NjlCQUJGRjA0MEYzNzJCMDNBMzAzMEQxRDFBRTA1MTg4QjczOTMzMTI3RThFRTcz
-NjI1RkM3NURGMTEzOEYwNTUKCkM4MTVGQ0E0QUVEMDg3M0NCNkJDMTM0MTQ3MzFGRUZEN0VG
-RTUyRTNFRjgyNEM3NUUwQTA1NjFERDBEN0JGREM1ODA4RjFCNzhCN0Q5RAoKQjU2MkIzRjA2
-OTdBMTEzNzlEMDg3RDQ5Q0JBRUJBQkZGQjYwNDAyRTM1REM2RkQ0RDIwRDNDMkZDODg2NTEy
-OTFDMzc5RTRFOEYxQkMwCgo5MjRCQTQzNUVERTc0MDEzNzU4M0NFNjI0MUM4QzJGRTREQ0FB
-MTcxMDNDOEM4RjQwQTM3RDI3NDI4RTgxQjM3MDc4OEZBMzBDODE0QkQKCjE1MDFEMDc2NTRD
-NDcwRkQ1RTk0Q0YwQzBDNTJCNUZENkU1MTBFQUIwOEQ4ODY5QjEwODg0OUI5MDAzRTdDRkU4
-QTI1NkRGNzI2OEVCMQoKREJGNEFERTlGQUZBMDk2M0IxQTZBOUI4QUQ0MDAxMUU3MjFCOTky
-QTlGQzlDOTk4RDI2NDAwQUJBOEM1QjlENTIxQzI4NjQyNzI4MDYzCgpEOUQwNjY4QjJCNjM5
-RTYyNUQ0QjRGMkZBMzc4NkU1N0U3OTM4Rjk5NUM4OTNFN0QzMzI2MjE3MTZDNjk2ODAwNEY3
-QzMwMjg4OUM0QkUKCjQ2MDQ2OTgzMjI1QUUyRDFCQzI3NjY4Mzc0NDgwMERGOTY4M0U5NjBB
-ODY4OTMzODc4OUVEMkQyRkVBMUQ2Mzk4MDRFREQ2ODYyOTVEOQoKMDEyODEzMDk0MEFGMjUx
-RDZCNzgwM0YwQUQ5NDFGM0YzRDk5OUM1NDU5QUFDNTc2NUM3NDNCRUI4Q0IwMjQ2MUI1NEVF
-MDI4MUE2MDA2CgozQUE3NjIxODdEM0IwM0VERDNCMEIxRjRFQzQxNkRBMjBEREQwRDg5Q0Yz
-MDJGNjM3N0NBNzNBMzZGRDQ0RTg2QzREQzZEQUUyRjVBNjQKCkFGQUM2MjUzNkNEQkEyQzg2
-RDZBQzFDNkFDNjc5RTUwQjU1NzA0NUIyRUI4MDJDNEM3QUVCRUQ0MDYyM0IxN0E5M0VEMjRC
-NjVBRkEwMQoKMEMzRkQyOTdCNTJCMjY0NzM1NUE0MTFBQ0VEMjU1Q0Q0RUUyRUQzOTdCM0RC
-QkE0RkMyNzQ1OTYwNDkxQUU3NkY4MjZFQjlDMzQ0MkExCgo2NjFENjU2QzI3QzQ4NkIzNTY4
-QTYzRjBENkRCNTcxQjE3MzgwNjUyMzMzQzJEMjYyQTY5RkUxQUMwMTZENkQ2N0M4NTRBMUFF
-MEQ3MkQKCkVDQTJBQTM4RTZBM0EzRUY1MkI0RUZBNTZCMTkxM0MwMTU0QkMxNzIyMDE2QkNC
-M0JFNUI0RUI1MTYwREM5Q0JDMDY4QkEzRUVGMUY2OAoKN0I2NjNEMjU3ODlFMDNENDY1QTg4
-QjkzQTQ3NDA0QUIyQ0FCQjI0QUVBNDMzN0E3OURFRDY5Q0VDQTNFNTYxNkYzQTFCQzZFOTIz
-QjIxCgoyRjU4REZBNDE3MzA1NDNEMEU0ODRENDM2MjFFNjk3REQwOTFEM0JFMTQzQTg1ODk1
-ODI0QzEzRkU1QjJGQzJBRUM5Q0U4QjQ4OTkxOTcKCjgwMTlCNkFBNzc3QUI1RUIyNEZBMzUy
-Q0EzMTdDN0M3RjFFOTU0OTUwMURDRTRDMDE2QUIyMkNGM0ZFNUYxQjkxMUM1RkZDQkJDNzk2
-OQoKMkQ1NEFCMEIwQzkyQTVEQzczQTVCRUIyOEZGOEQyOTYzQ0Y2NkFGRDk4MUVGRkM3QTEy
-NDY2NTNFMDdBNUEwNzE0NDJGMEY1RjcxOUI4CgpENjAwMjJEODI2NDM1MjdDNDI0RDc0RjEz
-MDU0NEZDMzYzRjlENEY3NzFCODQ2MzM3OTAyQUFFOTAxQzg4MTEzMDU1OUNGRUM1NjMwRjMK
-Cjc2N0ExRTEyMDBBNERFMDgyNDI3QTZEMERGRDRDQUE1OURBNTEwQzczRjdFRDE2NUE3RkNB
-QUFFMUI1NDFGMTc3OEE2QjhGRTIyM0YyOAoKNTk3NzQzOTg2RkY4MEMyMTQyQkI5RTM0Nzg5
-MkFGN0FFRkVERDI5QURDRUFDMTQ5OEIzMUY1RkNFRTk0QkI5RTQ4NzUwRUNBRjdERDUyCgpB
-MzlFNzkzRDk5QzAzRDg3NUI5MzMwRkIxQkUwODVCOTY4QzNCNEVERkEwRjA1MENGODQ0MDVE
-M0E0MkVDODczMkFGMERBQzlDODY2NjEKCjMzN0I3MDkyOUNCNDg1MDI4RUVFODFDMEI0NjU4
-NDJFQjAxREYxNUMxRUMwQkJBNTgwNUZGM0U5MDA1NzZFNzQ5MTg3QzBEOTRGQUVDNwoKRTNG
-OTNGMUYzMEQxMTI0MkU3RjY1RkUwRUVGOTE2NzY0MTlCMkU0MzIyM0MwMDYxRTQ2QzQxRkNG
-NUZDODJDMDExRDI0OTBEN0E4NDBGCgpGMEE4REQ2Q0QwQUIxQ0E4MUMyNzNFMTYwNEE5RjU0
-QUM2RUE2QkUwNEU2RDE0RkVCMTRERUIxNERDN0NERjU4NzhGMzUyMjRDNUVBN0QKCkVDNzZD
-OEM1Q0RGODE2MTY0QkI0N0Y5QzYwMjBEMzcxRjMwNDE5MTk4QUY0NUJBRDU3OTJEMTQ4Rjkx
-NUJBRjBERDA4NDExNjlCNzdFNAoKNUFCNTBDREY1MEI5OEI0QzU0Q0QwQkY5MTI2OUQ5RkE2
-N0Y3NEVGNzFCQ0M0NjJBQjlFQzcxOTM5RDM2MUVDMjBBQjUyQkQ5MDZCREE1CgpGRUQwMEQ0
-MjBFMzJDRjMwQUZCOTUzQzREQUFBODA3RDVBNUQzRjI0QTM1M0U5QjBFRENBQ0VCRkM2OUEy
-OUU2NUE1Q0REMUI2MUZCNjYKCjUwMDNGQ0JGMzcyRkFBQTA2MDE5Rjk5NDVGQkYzMkQ2MkM0
-NjFGNEY0RTg5QTQwMEY5RTBCM0E0NkJEQ0E5OUVFQTFBRUFDOTJCM0VDRAoKQzdCMTQ2MTYz
-NDVEOUEzRkQxODM3RkEyNEY5MTY4ODEwMDRDQzI3MzUxQTEzMTQwMEQ3NjM0RUNBRTdEQkZF
-RTQ1NTNDODZBOUIxMzYyCgpFM0JFRjQ2M0QzQjI5MjNCNDVGNUQ4MjQxRjQzNTMzRUMwRTgx
-MTY4RUE3NkRDMjhEQzIwRjZBNzE1MDhFRjFDMEVCNkI5NDZDMjIwREUKCkZBMjY1RjNFOEYz
-NUVCQTM3NEQwODY1NTM5QjM4NTdDOUEyMUIxRDQzQkVENEVGRjc1NUIxRTJDMkVCREVGMkEz
-NjUyRjE5NzI5REJFMAoKNTlEOTRGQjU0NDhCRTFGOEVGMjA1RTA3MDE5OUY3QzFENTUzOTQ5
-NjhBMUZGNzQ1QUU5MjVFRkI3MjM3RkY3OUZCQUE3NzczMUM2QzQ3CgpGNjg2NjgxNTAyMEFB
-NDFGN0YzMDUxQzdFRDAyODUxODYyODUyMkFFODBGQUQ5NzJCMEE5ODhGNTc5M0JFOEQ0MjE0
-NDRBMkQyQzAwNjEKCjhDNjA2MUE0Q0U4MUE4MDdFRDgxOTg3MjQ4RDYzN0I1MjVDNEUyQTNE
-MjRFOEFCNkVCMTFGRDM2RTlCQ0ZFNTQzMkU0NkI4OUIyMTkyQgoKQUU2ODVEN0VFRjQ5NEM4
-MkE0NUVBQkExMzYzRDJGNEI3OTczQUY1QjIwNTBCM0Y1NDcxQjIwMjc1MTFGODE2RjFBMzc3
-NTg2MTY3M0Y0CgpCMjkyRTM0MjUyMzRBNDFBM0QyNzBBMEQwQzAxMzlDMTA1NzMxQTZGNUY4
-NDU2ODVCNzc4NzZCNDZGNUFCQjRERDY0QjY2OTMyMzk2N0UKCkQxMUU0MEUzQTE4MzdCMDYw
-QTY2ODVGRENFNThEMkREMzFEMEM5QTlBQzY4MjAzRTc4QTc4N0ZDNjUwOEI0NjA0REY2MDlE
-MTREN0FGMwoKMEUwRDJDQzA3QTQ5MDUzMzlGN0FFNDUyMkQ2MDYxRkE2QTdFNENCN0E1QThC
-MkI1QzQ5RDdBNzJEQTQ2ODkyQUIwQzgyQUY3RDNBRTFFCgo2RDg4MkJEQThDMjY2OTg0MjMw
-Q0NDQjk1QUQyRjVBMEUzMzY4NUJCOTNERkE2MEQ4RkY3MDNDNzY4ODdDMzJEOTNFNTNERTY0
-OEM3MkYKCjI1MTI4NTY1REY0RjQxMEQxQjJFOEM5RDU2OUI3MDZDQjk5NTQyQTI3QkE2ODVE
-RjA5Qzc1MjI4NjAyMUMxOEY5QkQyQjlDNTgyRTgyNwoKNzQ1RDY5MDFERDk5QzQzMzZDMDI2
-OEMwRThBODVCRTlDNTIzREExRTREMEJBNDU3MUVBREU4MEM4OEExNEJGNEU3NDUwQTFCQ0VB
-MUJCCgpGRjk1QkRERjJBRjFCRUZFQkJFRTc0MjlBNEZGQTVGNzJGRDQwQTdBQzFCNzBGOEVE
-QjgzMjVBQThBNjExRTM3QjBCQ0RDODQ2QzZDMTMKCkNBQTlBODMwRTFGMDkwMDU5QzZFMzQw
-NTM3OERGOTBDMUFGNDgyODg0ODEyNjhEQjJBRjg2MkFGM0FGN0E5QzcxRUI2MERCRTgxOTgz
-OQoKNjA4M0NEMkY1NDVDN0Q3OEEzN0I5MENDM0I5RjM1QjMwRjhENDI0RUFDMzc0REVCOEVD
-ODkzNzE1NzkxRUU4QjBDRjhGODk5QTQ1ODJECgpDOUYyRjczODIzMkI5ODNBRDhBNzc4NTVE
-MUU2MTA2NUM0NDcxRUYwQ0RGNzJDMEM4QUM2QUFBRUVFMUE3NjdFOEY3RjAwMzVEQzc3QUIK
-Cjk1QkMxRTJBRDM5OTE0REYzRTEzNzI1RDhDM0I1REU3NDdCMEVERjFGRjNGODBGRDE2MEQ5
-QTIwNTVCNEYyRkYyMEY0NjI2QUI0MTk3OQoKNUUxRkIxRjM4MkEwNzYzOTM0MkE0NDM5QTZF
-MkYxOEYzODMyQkFEREU2M0RBMUQ3OEZCNjM1NTcyNjFDNkM4NkM2RTk5RkM5RDI1MkQ4Cgo5
-NUE5QjY1Mzc4MkE0Q0FFNjFBNkRFNTEyQ0U5N0VDNDY0NDJCRTI3NzQ2QTkwNDc0ODAwNzI1
-RTk1MzA3ODI1NzM5NTkyRDU4NTA1NEMKCjA3NjgwNjgwRjFCNjBEMzdENjRBNUIwQTY5Qzg0
-QkZCMDVDQUVGRTk0MUFGRjk0Q0QzNTdBNTNDOUMzRTI2RkVEMjIwNUIxMUY4MkY3OQoKNjRE
-RkQ4RkYxNkQ1QTNDRTEyOTA1OTQ1QkY0MUM4QTU2QTU5OTg3NzYxNUIyM0U0MzZEQUVCQzcx
-QjQ1QkYwMTYzQTRFNkQxMzIzOEMwCgo0NzlDM0RCOUVDOTlGRjBCNzRDRDIyMjQ4NjUxRjJF
-MUJDNzg2MEVEMDMzNkU2QzA3OEQwRUQ0RkM3MkY0OTREM0YxMzY1MjhCMjVDRjEKCjUzRDQx
-REVBQTA3NjFFQzFFOEYzMUY5MERGMUQ3M0VCM0E1QkE5QjUyRDgyOUVEQUU5ODAwMEI2MTE2
-MDcyQUVGRUFFNEQ4NjFFODkyOAoKRkY5REUzNzZDODU2RUJBQjFBMTg5RjQyNDgzMThBNDRD
-QzNFMDczQjg1NUExMzkxNjA3MzE2MkQ3QTI2QzA4QkI1NUJCMzlBMTIwMzNGCgo5M0I1NURC
-OTdDRUFBQUI5NzVBNzM3MkMxNUQzMkQ2NjU3OEE2NTM5RUQ2MTA5N0Q0RTAxOUNBRTMzMTE5
-ODcwRTk2QzNFNDA5RTQ0QkEKCkU1RjlDOTJGMDQ0QkNCQkQxQjEwNDFDNUM2OEM0NUI3NjZC
-QzFGRTUxQjU3RDc0QzExNjgyRTZGQjYyNDVEQjVCMjQ4NDBGRjFBRDA4NAoKNEI5ODM0MkIx
-N0UxOEI0MkI5RkY2MTQzMEIzQTcwM0Q5N0VGOEZDNzVCNUY4NDYyRjQwNENBQ0NEQjJFNkQ5
-NDdDMUZDRTdEQkIwMzg4CgpEQ0VGRjUxMEIwNjIxNkMyMThCRTM4Rjk0NjA3MjZGQURDMTlE
-MTMzRTA0NkM5MDU3MTk4QzFDMjVERjg1RDQ1RUFFODRGM0E2NkQzMzkKCkQ5QTFDMENEN0ZC
-NkE4QzcwNkE5QkEwNjJFNjQxNUJCMTFCQ0ExOTIzNzMyQjJBOUJBOTg0RkVBNTM0OTA1NDdB
-MDMwNjM2NzNCQjM4NAoKRDc4Q0Y0ODc4MkFENDUxMTFFRTkxQkFFQzIxMjhERjFBMjczRjkx
-NDNBM0QyOEFBM0UxRjIyREI3MjIwMDkyMDQ3RTIyMjY4QUVBMjE5CgpEMDAzNzY3N0E1N0FB
-OTg0MzJFMzc0OUZENTc3REEyNjI4NUFEMEU2N0UyMzFGNUUyMDgzODVGNDc1N0QyMTdDNzA3
-MDY5MkU2QUVCMDQKCkVBRDg1RkM5ODFBRDU4NkEzNTI5Mzg1NEMxNDdBNjIyMzBBODc5MDgy
-MjU4OUM2MkMxQkMxODJGOUUwN0I3RTBDNUIxRDAyRTlBNzNDRQoKMjIyQUVCREIwQUFEQUFD
-QTk2ODVCMTJEOTE0MjIwNjM3ODU1RjkyOEIxQzk1MjUxMDgwREMxN0JGRTY3NDkzOEQzM0U2
-QzkyQzA0N0YxCgpCREMyMkVERTUwMkFFRUI3ODBENkZFNzgzMDRFMEFFQjQ3RjM5QTdBQTAx
-QzhCMzA3NEZBMEE0MjNCNjAzQkZCMjlEOTlGMUMxMjVFNDEKCjQyRDMxMEZGRkExNkNCRjhF
-QzdDMkIwOUU3QjA4OEZDMjIyNzA2OTkzQkI0RUY0MUM5MzI5Q0YwQUMxRUY2MERCNUJDRDhB
-N0ZFQUMxRQoKOURDMTExNTQwQTdFMTYzM0YzNkIwRDk0Q0IwQjE1QThFMzA3Q0ExOUIzQ0Q4
-NzdCQUM3QUI5MDM4Q0VCMjkzQ0ZBMEVEQzA1M0FBNENDCgo1MDQ5Q0YyMzlBMDg0MUM2Mzkx
-QTFFRDUzN0I0OTY1NUVBNTM5NTQ3NzY0NkJBQUQwNDJBOThCNjFERDI3MDk3MzY2NTQ5N0ZE
-NUNDNDIKCjRCMzBDMzkxMUM1NTg5MjMxNTU5REJEMUZCNzEzRTFBMzg0REM2MkExNjgxNjU1
-OEExNUNGQ0E4NENGNEJBQTI5ODM1MTA3QzExM0I2MAoKMDRCRDg4RTFENEI2RjBFRjAzNTA4
-M0FFNTgwNDA3OTFGODI0OUI3NjRDMzQxMDY0RTk1RDc4OEI5MDY5NUUzRkE5RTU0N0U0NTZG
-NUQ0Cgo3OTk1MDQ2QkM4MUQ1NDczRTY2QzM3NEZDMzYwQjQ0MTA2NzBFNTI3QkM5NTMzMkQ2
-RkU3REI4QjhEQzQ3QUM0NzJGMzdFODMyNDBBRkIKCjM4MDBGQ0Y1QUEzMjc5RTY3MkIzREE2
-M0ZEMjIzODRDQ0Q4NTJDMjUxNjI3MTg5MkU5MjNCOTkzMkI2REQ0MzJCRTQ5QzkwREMwQjU1
-NAoKMjNFREVGRDYwNEEwODk2MzE1MTY3OUE5NEUzRkIzRTY0MzQwMzk5RjA3NUEyMURFRjc4
-NDNDQkRDOUQyRDM0N0Q1OUNCMDcyRjEyOTYyCgo3QkU3ODI4QTZFOURGNDY4NzcyMzVEMDM1
-RENCMUIzOEJCQzQ0QkEzRTdFOEZDQTM5QjVCMzRDQzY0OTE1MkQyMzA5NUY5M0I3NEJCN0EK
-CkVDRDNCQkQ3RTQwODc4NTRDQjQ3MTMyNjc5RkI1NzNBRkUyQTA5MUZFQzI5NEIyQjlFNzMw
-NjI1RjY4MjkxRUU3REMyOEMzRDU1NDAzNwoKRjYyQjMwQjA1MTIxQTVBNTVEMzcwODFCQTRF
-NkRGM0NENkU3MzQ3QzgwNzJFNTE4MjUwREM3MzA1NTU1NDg3QkEyMjlGN0EzNUNBRTdBCgo3
-RTUzNDE3QUI5M0U5NjMwRjZDRUQwNEYzQThDMEIzQjU0MTdEQjlFMUQ0OEM2M0VGMzRBRjVF
-RkQ0RjEzQUI3Njk3RjdEQkI4OEI0MzcKCkEyNjUzMjA3MEU4OUU0MThBRUI1ODc1OUNBMkVB
-MDQwM0MzRDRFRTIyNjBGMURCQjNDRTlGMUYwNkVFNEI5MTQ3RjlERTk4ODMyNDc5MQoKRTFD
-MTExODc3QTY4MjVERDA4RTg5MDJBOTU1NUQyRkM3QjhCNzQ2QzRCMjE0QUI0NzIxRjZBODI1
-MUNBNEQ2MkY4RTMzQ0I0QTdFQjc4CgpDNkM1NUYyMTUzMTQ2MTJBRDg5RDVEQkQ4RDVGNjE0
-QzhERjU4QUE3OThDN0M5MzI0RkQ0MzVGMDU5QTFFOTRFOTBCMkJENUVERkJEQjEKCkZEQzkw
-NkNFQTlGNUNDMTIwNEEwRUU5RkIyNDRBQzQ4QjNGODU1OTNDNDVGQkFDMkRCNDI3M0FDODFD
-NjhFQkNEN0I5NUUxM0IzRDhEMAoKODczOTlDNUVCQUQ4Njk2MzQ1M0U1NEEyREQzQkNEOTFB
-REVBOUYwQjEzNDU3QjQ1NkVEOTQzMkM5RUMxRjRBMzRBQjBGQTgyMzVDMjZGCgoyMzgzOEQ1
-MzI3NUNBQzE0OTFCRDhBNDUwMjY0NDZGMzlFQUZGMENBM0NERjc4N0QzRjc1RURGMEQ5MDI2
-MDgwMTYzOUIzMDI0QjA0RkIKCjREMERBMDNENEZENTZBMkM0NUFBOTQwNjJEOTIzNTQyMTJC
-REI3RTYyREI1N0JBMEYwOEVCMzcyN0Q1NDUyRTVCNzBCNkYwRkFFQjBDNQoKQjhDRDk5MDEx
-RDk5MjUxNEQ1QzFEMTA4RTdFNkUzREVCQTk3NTNEOTZEREUwMkJEODdGQ0M4MzBERjlBRjg5
-RDk3RDZGREQ5QTZDNzdDCgo0ODlFRTA2QTFCNDUzRjhBN0IzNzc2RjExRENCNzFDOTMwNDg5
-OUEyMkZGMzkzRjhEQTU1NDYwQ0REMkVBMUM4QzcwRjQ5MzFGQTEwOUQKCjUxMzlFREQwRkM5
-RTMyM0QwRjhFMzIzNDQ5RDEyNDcwMzE2QTFENTAyMkREODU1RUU5MzU3QTM1QzA2NzNBMDkz
-MDIzREY5ODhGNTJCRAoKNjQzODU3NEI1RkYwRURGQUFGRTEyREYzNzQ3MzAwNDU2RUNERTI4
-MTRCNUNCMzlFQkJBQzgxOThCM0ZEMjFEMUZFNDdEN0U5MzI2QTY3Cgo5OUFCNENENTA3MjU4
-NEY3NzRFOTVDNTVFQzk2N0FENkVCQzk0QzQ1RTNFMjU3MUY5ODIzNzkyMzRFNUZCRkNBRjY2
-NkFERjZDNjQ3NjMKCkI5OTQ5NjQ5N0E0NEExRTMwMDkyODczNkI3NzAxMTAzOUEzMUNFNkJB
-NTY5QjE5QUI0NDdBNkYxQzk1RDVDQjQyM0Q2QTZBOUZDRUI3NwoKNEMxODRGNDVFRTYxMDVG
-NzAyQjI1RTY1ODYyOTZFRTE3N0E5N0Y1QzUwODM5MzIwNkExNUM0MEJGMUVFOTBDMURBNjU0
-RUExMkJCNEU5CgpDMEYxRDgwNzRFQkYyMkJDNEZGRTk0REIwMEJCQzAxREE2OTJEQzZFNzJG
-Mzk3NkM2MTg0QjdGMTcwNjZCNkMwQjkxMzU3NzcwNUVGRUYKCkYyOEM0MzBBMEQyMEU5Q0ZC
-RjNGMUJBMkYzNzhGREQwN0NGN0M0REFDMDIxRkYwQTY1RTgyQTc4NEY1QjREQjA2MTQ0MDAz
-MjAwN0UzQwoKQ0JDNDkxOUI3NTYyMzVEQjc5ODhBMTdGNzZDOUYxNjczOUYzMjAyMTAyRDg0
-NDg0Q0JCRkU1QkMyOTI3QjAyMENDMTIzMTIxRUUyNDdBCgpBMDNBQzA4NTlCNTQyMzFDMzQ1
-MTE2MzE0QTQ1M0UzNUUxQzBFOUZEMzA0MzQ5MTU2MTZGMUI2Q0E0MjA3M0Q1M0VDNDQ2RjRE
-RTY1QTAKCjQwNjAzNjdEMkFFNjFGNEI3MTk0NUQzRjAwNDM4RTk4QkU4NDBBQjQyNTRBNTVG
-RjczMEJEODk3RjU5MkM1MzA4QTQxMzUxRUUzOTY1MAoKRDcxRDI0QjhGMjUwMDM5MkI2OENG
-ODhDMjVEQzM1N0NCRjBBNTE1MTI0MzM2QkJERkU0MkE5REEyQUU1QURDRjVGNzRCNEI2Mjg1
-QzBDCgo2QkYzODI4M0VDMENCNDg5ODFDMTQyRTcwNzI3MTM1MDZCNkEzOEU5OTFCNTA3REY4
-RjA5MjdDQjg2Q0M4NkM3MTAyNDQ2RURCQjlEQTQKCjAxOUNBNDc1NEZCNjczMjQwMTk4MzdF
-OERCMDlDNEZDMzNDRkU0MjNEQTFGMkZGMzJDQzM0MzQwOUMyREQ3MUM4MTRCOTMwRjU5RkUy
-NQoKRTgxQUE4RURDOTdCQ0IwNUMwM0E1MUM0ODQzODAyMDgxNkVBMzFFNkNFRTU3RTM5NEY2
-MDE5OTQ1QURFM0Y5QkJFNTIzOEY1QUVFMjk3Cgo4Mjg5NkVBRkRCNDBDQjQyODc2QkNBQjZG
-MzdDQkY4QzA1QjlBODRBRTlENzIxNTc3NDY4MkMwRjMyRTIzRkZFMEQ2MUEwNENCOUU3NEQK
-CjFEMDRCM0FGRUFBRUY3Qjk0MjUxNTc2QjgwRUI4RjE1NjE5QjQwOUFBRDQ1NDYxM0ZENTBB
-QTdENEYzQURGRkFCNzMzMjU5NUVGQUNGQgoKOTY1NTAzOUE4RDEzNTE5REY5RThCMjU5RTM0
-MkY0NTUwMUZEOTQxNEQ5QTFDRThBMURCMjE3MEMwRTYzNTQ5N0E1NEJERDI5NkU0NDE0Cgo0
-NkRGQzE2MzExNjY5QjgxRUFBOTlFRjlFOUY5REM2MTczQURFQ0E0RTlGRDFENEQ5MjRBNkZE
-RjFBNjE5RDgzRDVBRDc0NUJFMjJDRTAKCjc0QUE4MEE5M0ZCODA0MjQxNTczQzRBQTk5QjQz
-NUMwQzU1M0I2QTM0QzFDQTI0MjBENEFENUFFQ0YxMDFEMEMyMjAxMTdGNTJGRUYxRQoKQTZB
-N0MyRTZDNUFDQjEyRjRDRkUwNDM0RDM4QTdCODBENDU3Mjk5Q0FBN0JFQjIyNDAxRjZGNDFC
-RkNGRjFCNzMwNzREQjIwNEFBNEY3Cgo0QkYyMURGMDJGQkNGQ0VEMzI1NDUwQTMxNkYzRDBF
-MTlBOUU1NzhFRkY2RTM2QUU5QjlGQTgzQUMyNzYxRDlCMDc5OTc2MDc3NDU1NUEKCkNBM0RD
-ODdGOEZFRjA0RkY0MTcyOUFDMzZFNzg3MzBBQTRGREM5QjIwMEREMTlFNTVBMkVFQjI5MTRC
-QzRBN0FCNjY4NTc2RTg0MkZFMgoKNEJDMzE3MUFDNkZERTNCMTJDQTBBNUNFNDczQ0E5QjE2
-QUFFRUYxRTAzOEYzQ0QwQ0Q0NkZERUNFOTJEMzE5ODk1MjlBRkY2NDBFQjc0Cgo0NTM0MjYy
-QjFDNEU3NEJFOEUyM0QzOTRBNDkyQkRFRUZDN0NGNTQ5QzI5Mjk4Q0NCOTNDOTlGNUU3RUYx
-MkYwRjMxRjk0QkRENTU3MUYKCkExMzkzRDY3NUYwRjdGRDU3N0YxM0I4QTY1MDYyN0I4M0Qx
-Mzc3RTFENUJDQTUwMkE5NzdDQjU2QjMyMzhEOTA3MzM2RDM5MjAwNUJGRgoKOTJGQzk4RDk1
-Mzc3MkRDQjI1QTMzNTNEMDdCN0EyMUUyMTc0NEE5OTY3MjVFQkFBMUM0RTkzNTlEREIxNkVB
-MzBGOEI3QjA1NEY0MzM4CgpEODBCQzIzMTEwMTgwMENGNTEzMzI5REYwNzNCRUUzQTlFOTlB
-Q0M2NUM0NjYxNjYwQUFBNkIyNDY2RTA2QkU5QzkxMjNBNjYzRjlCRDAKCjQ3MDVBODc0Mzky
-RTQ0M0M5ODY3NzhGREU0REJCMkFCMEFBODU1NDcxRTZEMDFCQkU3QjIxRjAwNzI1NDU0RkUy
-MTc0NzA4NEVEREE5NQoKQTIzQUZBQjkxMjg5OUMxMTU1Rjk0Q0RFRDQ4QzAwM0MzRTA2NzU1
-RERERTQ1QkM4Njg4NjVENUI1RTZCMzNGNDQxODQ4RUY5MTUxNDZBCgo4NDNBMUIwRjgzQkU4
-QTNCQ0RFQzhGN0MzM0QwQTZDODBDMTdBMzlDRkQ5RTQ2NkE0MTMwODYyQzhDOUM2MjEzNTkz
-RUQ1MTNCODJFMTIKCjc3MzlCMThBMjZBMzE4ODRDOTlFNDNDQjY5MDgyRTcxMDY3OUZFOUVG
-QTZFNTdFRDA2Qjc5QkUyQUQ2ODRFQTI5Mjc4NDNCMjg5QTFENQoKRTU0QkM5QjVDMDNFQTUx
-RjUxNTBCMUIxRTg3OEQ0NjdFNjA2MkNFNzg1MDUzRjFCQzAxOTIyQkZBMEVGMTUyNzc1OEYy
-REM1Qzk3RTg0CgpENjQ0MDg0MjRBNThCMDY5RUMxNzMzOTA4NDRFMERDREUyQTE0RTg3NEJC
-OTlENEEyMzdCREVFRjI4NjcxNThDMURDMzYwRUU4RDFDQ0EKCjM1NzhGOTQzNEE4NTZDMDY3
-MjJDRjlGRUEzMEFBNkU5MjNFQjdGQTFFNDY2OTczMjQ3M0YwNEE0RjIyMjgyNzgyQjE4QjUz
-MEM1MDYxNgoKODA3QkJCMTI1MEU2NENFMjlCQzhFQUQ4MDIzQTQ3REZENzMxMjU5NTJBREYy
-MThFMDUwM0U2QjI2RjA5NjI5NzU3NzczNTExQjk3NjYxCgoyOEJEQjU3RDI2NDRDMUFBOTQx
-MUMyQkQwOUExQzE4NDY0OEVENDM1RTYxRjBBOEU2QTNDRkUyQjE5Rjc3NTY2MDRBMzJDQkQy
-N0RFOUUKCkIwODNCRUE3QjlFNTA1QUI3MkU4QTAxMUJEM0IzOEQ3MTk0MzA0NEQ1NTJCOEEy
-QzZBOTUyOUM3NEMwMzQ2MUJBMjMwREMxRkExNUJERgoKOEVFNUU4QzAwQUEyNTE5RjI3NjhD
-QjQxQjI5RUU1MjE4NzlFNEY1RDMzMDIyRTRGNDRFOEJBNTREOUU5NTJENzMwQzYwRTI4M0Mw
-NDU2Cgo5QjJBN0UwMjkzRTYyMkRCN0FGMDM3NTlGNEY2Qzg3M0NFMkQzODlDOTkzOTg1MjRF
-OEEyNzdFMDEyNEY0MkE3MDFFQjk3NDgyMzI2MjEKCkFDNTBDRTcwQkFGNkRFQkE0Q0RGQjQ3
-MzMyREUwOTBGMUU2NjE2RDc0NTdBQjAxQ0Q5NjAyOUY4RTY5MDIzMTg4MkY2NTNGMjZGQjJF
-RAoKMDdEQzQzRTk2REVGNzBGRkRERjVGRjA4MDJDODdGNjBGRENENUMyNjNBOEFBQ0VERDc4
-NTQ1NEM2M0Q3RDFFNEYwNTUwMDgxQjMwQzFECgo0NjBEN0U3ODU1NTQ4QUNENEUzMUJGMTA4
-OTNFNzkzQ0E1NkE5RTJCMzZFOTVDMTdFN0IxQURGQjgyNTgyN0ZFMkE2QzAwODg4QkY2OTIK
-CkZCNjA4QTRCNUIyMUFDQjVFNTM5NjY3REZBMjQ3QTdDMTA4MTE4RDczRTQ1NTgxRTUzQTMw
-OTI0MDYxRUM1M0QxRThDOTY1MjdGRDIyOAoKOTEwNDA1NzhFMTBGQTlCMUI4OTcyMzAyMTRC
-NzIyNEFBOTVCQUZEQkE2REI3REE5QTY1QzZEMTlCQjQ5NEQ0QzEwRTUwNDI1RTg4QTA1Cgo4
-REYyOTYzN0JEMzdERTg0ODI4MTZGOEVBNTcxODYzOURENUM4MDY3MUU1MkI5RUU5NjQ3MDIw
-NEYxN0M5MzhCODYxNzE4NDMwQUVDODQKCjA0QTY3RTcxOUVEQzJDRkYxOTk2QjcxRkZFQkZF
-NzQ1QzVBMzAwNzU0NUNCNjg3MTZCMDQ5Mzk2MzNCNkVBREY3NjZCRDgyQUI4QUE0QQoKNTg5
-MTdGNjZCMjA4NThFOEI4MjQ0MzIwMjhFQjVENDRCMjBFQ0Y5QTM5NEE3RDJDRjBDMEFBNjY2
-MkM5MzQ0MkM4RTA4MTg1MkM3NzhDCgpFOEIzRURGNjc0MkNCQjgyNDEyNDc3RkNERTc2NjhB
-NDMxRjI1NUEwOUQ4OTU1OEQ2QTk1REI0QzE2RTRBOEVCNDA0MjFGQkE0ODREREEKCjYzNzFE
-RkZBNjI5NzJGRUU2OTZCQzFDODdDQkM4QTBBNzg1NEY5QzUzQjUyMTQwQzQxRjNFNDFBN0NB
-NTgxODgyMUFGOTZDN0RDNDE5NAoKRUMwQ0JDMDhCMkU3QjM0NTdGRUEzRTUyQzQ2NDY3RUJC
-ODRDNzM5RkI2MUJBRkYxRUEzMzQxRTFDQkI1NjNCOUI4QTMxNDc0QUE4QTBFCgpBRUMwNEM3
-OTJBRThDMUVEQUI5NzE0MjI1OUZGMzI1OTE4RDUwM0E4ODRDREY2NjVEMDQ5NEZEQ0Q2RTg5
-NThGQTAyMzczQUMyOEFGQTIKCjYyRUMwODdFQTRFMTIwRDIyRDI5MTA5MjgzNDAyNUI4RDVE
-NUIxRkUyMjg4NzAxNzE2MEMwMEE0OEJGN0VBQkZCQTQzNkUyMjg2RUY2OAoKM0ZENjQxQjFC
-REVBMDVBMzY0QjYyRTQzNEI5RTI4QTE1RkY5QkE5RUM3RUUzRTI4MEZGQkM3OUZENDVBMjlG
-NDFCNDBGMDlDRkMyOUIyCgo2ODhENjYyRjE1NjI2MTkxM0IzRkEzNTZBMDVFRkM5RDZDQTEy
-MkZCMjA4QjQ5QkIzOEVDNzU0Mzc1NENENjBCQjY5QzQ1MUUxQ0VFOUMKCjE2QTZDODkwMEY2
-QUM0NEVCOEU4OTU2QjlFOUZDNDMzMzlGNkFCMkVGRDY3Q0M5OTQzRDNFOUI5NTdFMkFDNzA3
-RkI5QzAzNUI4OTMwMAoKODFEQjI0QjZBODYyMTg5RUQ3OEM2QjI2NUI1QkE3RTBGNEJFNTIw
-Q0EwQzZEMEFBNEUyRjA2RjJFM0NCMTAwMEI2MjQ5NEU5MjREMDNECgowODFGRThGQTgwNDFF
-NjQ1NUUwRDJCRTE1RkQ1RDk4MzlGOEU5RDFDNDQ5RUZCRjgxMzQwNDU2QTdDMTFEM0FDQzFG
-MTdFQ0Q2MDFBRDkKCjgzRDIyOEExNDQyRkU5MzRFNjFGMkZFQUFFQjIyMkE0REM5NzRBNDlD
-QThBQTY0RkE1OEEwRTlDQzY0RTFEMTlFOENCRDM3RUE5OUU2MQoKQ0MzNzM5OUNFN0E0QjAw
-MkYzNjEyOEQ5MEQ0OEREMEQ5MjlDMTUwQTlCNzkxRTEzODA0OTQ3MjM3MTJENEU5NjI3Njg5
-QjIxQ0FDRkY2Cgo1MzVFNkZGQUQ5Q0JCNDVGRjQyMjUxREJGRTRBQkM5NjAzQUNDNDQxQUFB
-MjNENkQ0Q0M1MTU5MjhBNUIxNkE4RThFQTI2NUEzRDUwRUQKCjE1NzBEMzhGQThDRjFGNTJD
-RUQ0NEFFMzJDNjY5QTZBMzM0MDYxRDRDMTdFRTk1OTRCMThFRUQxQ0Y0OUM5REMyMENFNTlD
-Rjk2NjkzOAoKM0E2MDM1QjgyOEFFREE1NENGOEVFMzVBQjExQURFMENBQTAxNzEwM0VBMUEx
-NkY4Mjg5REM0ODFGRTdBMDI3RTlENTYxNzBGNkFCNjE4Cgo4MUZEOUU2MzE1RTZGNEFEODUz
-MjA5QzA3MjAxNDAyMzdFM0M0NDRCNzE0QTQxNzc5NDk3NUI5NDI0NThDMTk2NUJGOEJFRDQy
-MEZGMkUKCjEyQzBCQjZFOTc3NjI1QUYzRjEwQTE2MjUwRTYwMzNEQzQzOUQ2OTYyQzU5Qzc3
-RTVEOUI5OUZBRTZCREEyMUIwOUI4MkU0QTgzMkJDNQoKMDRCNDA2NTQwMDY5NzI2MkNEOTlB
-OUMzODI1OUJDOTUyMkE2NkMyRTJGNEVEQzg5MjhDQUFGNzdCOUJGMDUwRTM2MURCRTlENERF
-N0UxCgo3N0Y4NEM4MTVGNjY4RjhCQzJFRkJEODZFNEM1QzVGNTVDQTlEQzUxNEVCMDdDRTQx
-NUJGNTZFRTM3MjMzNURFNzNEMTJEQzlFNjdCQkEKCjZFNURGQkJCNzg5N0Q0QUEyMTRFNTFG
-QTMxNEU0OERFQURCQTk1MTMzMENGQzU0ODE4QzAyMDU1Mjk1MjA5MjZBMjA3NERGNjUxQzIw
-MAoKQkFCOTk3OTJCM0ZCNTg5RkE3QTgxRkJCNDE3Rjk0QkIwNDc4RkY1QTBEQ0IzQ0M2NDlD
-MDBERjU0Njg2RDc2QjZBRTYxQUQwQkZGQTk2CgpGNDVFRkJEQjdFQUY4RDFDQTM0OTI0M0I2
-MTI2QjI2QThFRkEzNkJGMzA5MDRGRERGNUQ1RkYxMDJENjdFNTUyMEIzMzk4OUQxOTZENzAK
-CjAzMjk3Mzk1OTcxNzkzRTBDMjBBM0MxMjAyOUVCMENGQzgyOUQzN0Q3NzU0NTJBOUM0NDc5
-QkY2Q0U5QUQ5QzI1NTI1MzBERTk2MjhBQQoKNkVBNDZGQzFFRjE5REEzN0Y3RUI3OUREQTA4
-ODE4NjgzMkM4MTc2ODY0RUM3QkZDNUUxOEU1RTc1QzU3OTk1Qjc3NjE0Q0EyMTNDMEQ5Cgox
-RjYxOEMyQjg5OUU4QkE5MzA2NUM0NzA0NzVFMEU5MTREMzk5MDhDNTI4Q0EwQ0ZCMTc5RjdE
-ODhCMzY5QjBGRTYwNzAyMEIyNjg1RkYKCjMwOEQ3NzlGMkUyMkQ5MjkxQTJCMkJCNTc0NUU3
-MzExODQxRjk1REI4RjkyOTU2NkEzQTdGQzM2NDI1ODkxQUZENURFOTk3QTIzRjhCOQoKOURF
-Q0ZBQTFFQjBBNjUxNTU2NzdCNUVCNTEzM0RCOEYzRERBRDA3NDVEQTlCQTU3MjUxOUM5MTVC
-MzUzOTg1Njc2NzM0QTgyOEM3MEE0Cgo2QTkwM0E0OEY5MkM4NDNDM0M2QkY0MjYyM0M0Mjgx
-REIwQjQyOTQyNDNBODMwRUJDQzRCNEM3MjJCOUQ3OTVGODc1QkREQTMxQUY3REUKCjY4NjQw
-NzMwMTg1MzYxRjJCNzA0RjBDM0FDRTAyMUEwOEExMzM5M0U5NUYwQzE1M0FDMzA1QkQzRDZC
-MUY5Q0QxQkZENEU5MzBBRTdDNgoKNkQ5MkRCQUUyMTg3OEQzMDdDNUIwM0FEOUFDMTEzNTgx
-RTU2MjVBMDVEMTk1QTUwM0Y4NDYwQzAwMDkzQUQ4QUMyMTU1ODk4RDY0RDU2CgowN0VGNDAy
-MjY0MDU4MkM5NzI2NUEyRjBENTc4REM3QzMzQjJBOEEyOERDMTFERjU1QzkwRjJDMzlGRTZC
-RDI5QTVFMEMyQzlDRDgyQTMKCjEzNkY2M0U2MDNFNTM3OTEzNTRFRkE5M0FFM0E2MDkwM0Ez
-QjI4NEQwNTU1NjAyMzUyMTk5MDQ2RjdFNjM4MEFEMzRFNTkzQTQ3M0Q2RAoKREUyQjI4Q0ZB
-RDNBNzUwNDEwODNBRUU0RkIxMkQ5RUI0QjA2OUU0MDVCQ0ZGRjVBOThFM0MyMjIzQ0FDODhG
-NzczQTVDMEVDQkIxNkNGCgoxMkE0ODM2NDE4NjIwMDkwMzdENUM1NEE4MkZERDkwRDQwRDhG
-RDY2M0VCRUM3QzkxQjU5NDdEQjJGQkY0NzE4QTYyN0IxMEMwNzgzMDcKCjY5OTE0MjM3NDcy
-NTEyNUJFMEExMURGODkzRDg5NzVENDNCREY4QUZCMTQ3NkEyREZCMkM4MzgxRTEzQ0I2OUE4
-QjQ5NEE2QThCMDAzMwoKOTI1MzMyM0UzRTI4NUUwNUE5ODM1RkNGNEZFMkFGQ0Q0RDc4MkEw
-M0ZGODMxMUYxNUE1MUU3RjUwMzg1QzRBMUVGQUEyMzk1MEU3OTE5CgpEMTA3RjgxQzlERTlE
-NEExMEY2NEVBRkJFOENBRDg1QzAyODdDQzRENEU4MTVCNTYxNDkzRDc0RkM2MkZFRjcyQjVB
-RTA1ODEyMDM1Q0YKCjREODg0MTk3NEQ5Q0U0MUI3MTFEQTQzOEQwMEVDNjAyQzkxMTI3NEY3
-QzdFMERENUYyMzAzNUM1RjE3MzdFQjE1MUQxMkJDQzczNkRDRQoKNEIyQUNCMjU2OTdENzlE
-RkQ5RjU5NEI0REFGMURCN0Y1NDBFMTFGQTlENEExNUM4NjhDNTk1QkMzNUI0Rjc0NDkwNjI0
-MzY1OTQ4MTQzCgo1MUE3NzFFNDg2NENFQkQ2RTkyMzc4RTcwOTQ2M0M2RkU3QkVFQkUwRjMy
-NTYxM0JEOTMwOTRFRkVDOEJBQUM4OTc3MkZCRkU2NTQwNzUKCjM1MUU2MkI4NDRCODAxMzFF
-NzUxQUM0RjM5NTA1REIyNkM4QzM0NDIyQzY2QTQwMzE2QUZCMTk4NjQ5ODAyMzE5RDFGRTRF
-MUU2NjA0MAoKMUFCMjM0OTcxMjA3QURFRDZCNEE4MDZGMENGRTk3MUQzNTc3QzdFQzgwMTM1
-NUU1Rjg0QUNCM0EzM0NERjI5NkNCMzNDRjQyRTc0QUNDCgowMDMxMTdEOEY3MDBGQkQ4NEYz
-NEVCOUFEQTM4RUUwNzE2RTFBQzhBQ0U5ODgyQzEwQkI0QjM2MzNBNkQ4NzdERDY1NzhDMURC
-MDM1QjYKCkREOUU0RTJCMjM0OTM1MDA4NUUwNDI4QUFBQzE3NzU5NzcxQkM0RUREQTFBMkQ0
-MEZFMEIxNUI2NUE4RUJCNEMyOEE1MjZBNDlDNTZEMAoKQzI0RkQyMzU2NTNDNzhGMkM0MDM3
-OUFFRTc5MzkzN0VENkYwQkY4RjRDQ0E4MjVDMzA1QzBGM0ZERUVCREU4QUJBNjM1MkYxREJG
-MDQ5Cgo1NURGNzY5NUJGQUE1OUUxODk0QzFDNTdDQkUyOUU0OEVDMkY0NERFNzdFM0M0NDlF
-MTNBMjUzNTkxMjY5MjVFNEM2QzQ2NDlGMDQzNkIKCjAxODg0NTFFNDczNTEzREYzNEM0RkIy
-QTlBMzcxNDFFMjc4MTFDNkIzMzk1MkQ5QzNCQjAzMzZFNjIyREUxOTI2NDlDNUJDQjc2MTcw
-MAoKQ0U5NDIzRTlCNTJCMjBCN0UyOUI2Q0E0NzAyMjFENTkzQUMwQzVEODk1MUVFMkE1NkZF
-RDk5QThBM0QwMTg0NzNDMENBMjhFNEE0ODMxCgpENkE4NjFBNzZDNzE2NTMxNEJGN0EyOTlE
-Q0NCNTdGN0Q0Q0UyQUVGRDk5N0FEMjFDNTU2NDdEQkU0RjBGQkJBMUY0MTM2NjdCMTk2MDQK
-CjY5RkU5N0IxNDRCRjJERDgyM0NGMjNFMjIzMTNFOEI4OUFCMjVDRTlDMTc0NkYxNDFFMjA0
-NkRFMjE3QURCRTE4QkNDM0JCQkUwNDY4RQoKMDNGMjc3RDNGOTVCNTZDQUY4RTJDNTFBMEFB
-RURDREZBMjI5NDY2NkE4NTMwODhFRjk3QkMyNzlGQjUxRkE3ODQxOURBMEFBODNCRjZECgo4
-RUFDQjgxMThFMDQ2MkUwNDAxRUE4MzAyM0RCQUU2QUQ1NDIwQkJEMjVFM0RFQTQ2RkIzQjdD
-OTM3NjM3M0M4RTM2MkU3NEIwMUFFMEMKCkU5RDU5QzY5NDVFMTA4RTBFOTJDMjNGNjI2NjFC
-RkE1NDcwMEUyMDM2MjdCQ0FEMTFFNzg5NUFENTlCRTE4NTlBOUZGQjZGN0IwMTY4NQoKMjND
-QjExMTU1MjMwMTkxNjEwN0Q3RDJBNDAzNTQzQ0I4NEFFRkU0MDRCOEYxNzBFRTVCNDA4OTgx
-QTg4QTY1QzMzNUIzRkMzNDU0QzAwCgoxNTNGQTkyQ0M0NDJCRTA1OTA3NjZGNzY1RTMwRjgy
-RkQ0MTQ5OURFNjg4REFFMjc0OEQ1NzA5QkE0N0E4OUU4MjU4MTNCRUY0REE2RkEKCkVDNUQ3
-RUY2RTlDQjA5MTNCNUJDNkE2Nzc2QkY5QUM3NjY4NDg1REU4OEU2MjY1RjVDREYwQTg1NEZD
-ODZERUIwNzBFNDBBNDFBMTI1MQoKMTI5MUUxQTY0MTlDNzY5NEVDQTVFQkFDOURBQ0VBQzMw
-M0MzRTlGRThBNjJBNjQ1MjFFMThCNDlCNTZCM0VDQTZFQjBGRkExNDhCMkY1CgpFNTU4ODU3
-NDI2NDI0Mjg4QkI1NERFMTU0NTNFMUIzMjFENEIwNEM4RDcyOEIzMEI3NTZCMDU5N0FFNjFG
-OTI0NDdCM0E3NTcxMzE1MzkKCjg3MDFBQTRGOEE2QjQ2QjQyODNENTBFMjZGNTc3MEVDNjQy
-NzU5MkYxNkE2NkNBQTgxOTlBRjg0RkYwNUEyNEE1RkJGRDE1ODhCNjExNAoKRTI0Q0RGMzlB
-OTlFN0E2Q0QwQkNENDRFMEU4Nzc2Qzk0NjVEODZDQTNFM0NERTM0QjMzRDMxN0VDNzVEOTUz
-NDExQzkwNDUwMDAzQjBCCgo5NDE4ODE2ODZDOUI0QTMyNjBDMURDNEZFMzFGMEE1MzU3N0Q0
-QTQ3NTBBQzdDREQ1MkVCMzI3NEI2MTU5N0RENUMxMTFBRjQ0MTQ1NkYKCkUwOTA4MjFCQzdC
-Mjk4MDY3MTRDQUMwRUY1QjhERTJEQzgxM0Q0MkNEQzg1MzBGNkVCMUREODI2NTdFRTFCNkRD
-MzlCMEUyQkFEQzE3QQoKN0ExM0U0RURGMkE4OTNCNDFDREE3NTRENkVCNjg0RDZBOEQ0OTZE
-RjMzMTQwMUZGQUZFREFGM0ZEODBCRjFBMzVDMkVDQTU0RjQyQkE0Cgo5REI4QzdDRDczRDgx
-RjVGMTA2MDUxNUQ0N0U2RkMwODcxN0I5RTkyOTlCMjU1NTM2MjQxREJGQkM2NzM5NDVBMzg4
-MzlCMzVEOUM4RUEKCjFBQTQ0OUNEQTgwODA1QzRCMTRBNTQwODdFQUU5RTRFQkYwRTYxQzgz
-QTFCQ0M2QzgyNDMzMTNGNUM2RkJGRkVDRkM2QkRDNDM2OERFRQoKN0FGRDQ4OUZENDhEQUZE
-MzRDNTlGQTZEMkRGQUU3RTJDOEM5NUJFMDVEMkFBQkE2RDk4OUQ0MUM3RjBBNDMwN0QxMTg4
-Mjg5NjNGMkNGCgpBNjUyQkNGQUMzM0IyMjk5MUU0RjZEODBEODUxQzA3MjIyMDU3MDIxNTVF
-REIwMDA1M0I1REFFQzUwNzQ0QUU1NUU5MTg0QkVBREE4M0IKCkY3Njk2NEY3RDM5NEZDMjdB
-QjgyREExQTY1RkRBNTZEMzY0OEQ5RjVBQTFGRUZCRkE3MUJEQzRCNjZFOEM0QTlERTQ5MzVG
-MEZDQkU0NwoKOTU4NDkzMTYxNjk2NDgwREVEMzMxNEI3MDc5OTAxRkU1QUVCMTBGODlEOUYx
-NTNENjU0QTBGMEU1OEQ3MEI5MjJBQ0I5NjlCRDgwMEEwCgpGM0NFNDIxRkNFMzczMTlEMzc3
-RDkwMzc0MUE2MEY4RDgzQUU4RkFCMUM5OTlCRDhDMzkxMzE2QTFDMENFNkIzRjE4MURFQTNE
-MkFGQkYKCjAyQUJFMTIzNzkzNDE5NEU5RjQyQTk3M0FCNDk3MUQzRTNDQjYzQURERENGRTlB
-NDdCRTc4RjI0NDY4RjgzRTY1MkU3RTY3RDg1M0Y0RAoKNTAyMEQ3QUNEQkVEMjUwRDFDREJF
-ODZENTgwMUNENTY5MTNDMjBGODEwMUY1MDlDOTBGOTcyNjNGQUM2RkZERDZDODcwNUNCQTBF
-RkZECgo1RUVBRTFCRTExODQxREM0ODQwMUE3QzQxQTVGMEVENTlGQUMzQ0RGQjhBMkRGRDJB
-QzBGM0MxMkNDMEU5NjRCMjVCMzQ0RTFCNjI0NkEKCjI5MkQ0RTlFRTZGQTE4QkY3MUYxQkI3
-QTkxRUI1QjhGMEUyMEE0RkQ4NTkzQjgwMzMzNTk4MDIyNEQzNzI0MTdFMzY2MkQ5NjMwNTUy
-NAoKRjIwMEI3MDE2OEFBM0I0ODVCRDgzREY3QTQyQTU3NzE4ODJGQTU5OUYwRkFEMzZDOUI0
-NjMyRTU2RDc1MUZFQjU3OUY1MzBBNkE0QzIwCgpBOTA5NzY1Q0FERjkwNjVFNEJDODBCQzUy
-RkRBNkEyMTg2RTIyQjI1NTkwMTdBNjI2RjIzMDUyMkRFNzA4MjE5MDEyMzUxRTkyMDVGNkEK
-CjQ1RTk2OEQ5NEQ0MTE2RUY1NUUxM0VGOTIxQjM3NDBDREY0NTU5NjIwNkJEQTI3MkIxNEE4
-QjJGNkM2RUQ3NDRCQ0NDOEJGRUFCOUI1MAoKNjA4OERCQjU3RDhGRUM4MzdCNEIwMEY1Nzk1
-OUVGNTE1Q0U4QTk4MDJGNTRBRjFERTAxRjA3MTE0NkQ5QTY4QkVCMzgyRkUwM0REN0RFCgpB
-QTAwQUEzMkJENTUyRDJGRDFCMDlFOTJFMzFFMzYyMzQzNEE1QTM0RTcwMkVEMDM3NUUxQTk3
-RjhCMDlBQTUyREM0RkFCOEExNUYwOUYKCkFCRjBCRTQ3QUQwM0Q5OTcyMzZCNkI1NTZBRkE5
-QzRBM0U0MTM1REI0OTU2REIzOEY5MTQ0NDZEN0UwRkM2QUEyMUQ0MjMyQjBCRjVFQwoKNjZG
-NDMyMTRFRUZDOENGOTg4NTRCQkQ2MjU2NjgxNDQ0Nzg5NTlBOTgzQTAxRENCNEZBMkJDOEZD
-REUwOEYzRDREQUI0NzRFMDVDM0FBCgo4MEI5MUZFNEY1M0YxMDNFRkRGQjFBNTA5Njk2RTBC
-NjY4MzBERTQ2NkNGRTgyNDMyOTJERTM0RDRFOUFBRTUwRUZENTM5QzEyMEJCM0QKCkMwRjdE
-M0VBRDFDMDMzRUY3RUFCQkUxMjk0Mjc2QzBGNzhDN0MwODlDNzZBMTAyNDg3MEVCQjA5RDQ5
-M0Q5QTRGMTZBM0U2NUI1QzVDOQoKRjM4MERCRjUzNjVCQkU4M0FFMTNBRDRFOTZDODUyMjc0
-RkE2Q0M4MzcwQ0U4RkFENDU0NDlEOTA1MEU3RDJFQUYzNTJGMTY5Q0M3RUZBCgo2N0IxQkJF
-Q0U0ODVDMkRDQjYwOEFBN0IyQjZGMjc2MkI3RTQ2ODJCQ0MzM0VBMEUzMDVDQzM5NUEzRDdB
-MkMyRjdFMEVGQ0YyQjEwNTUKCkYzMEU2MzE3NTdCQjVCRUEyMkQ5MDc0RkYyRDczNTg4RjlF
-OUREMTI0NzdENDRCRUVDQjlBMDNERDU0MzlDNDcyQ0ZFRURFMkJBRUQ5QQoKRkJENjdBRkY4
-MDY3NTlCQTBBRTM0Q0RDQjEyQ0E1MjMzMkM5MzI4NjMzQzQyRjE4OTRERTVGOUVDNTAxMzZB
-QTEyOTNDOUQ4OTM3MTYwCgowREZCMTRFMkU5NTQ5MDg1M0IwNjAxQUM3NTIyQkU4RTUxOTc4
-NkM4N0FBNUUxRUQyQjk2Q0UyMjEwMDlBQTlDNTVCQzYwQUVBNEU4Q0UKCkZEQjk3N0IyOEYw
-NTUxQzMwNkMyMkZGNDAxNjcyOEJBQjc4OUI2NUNFMDdGNjExQjlDODQ4MDg4MzdGODc2NUU1
-RDk0QjlDODY3QzBFMwoKQUZCMEVBNEEyMUEzMjRDQzBBM0JDMzUwMUMzOUE5QkE5MjhCMDlF
-OUE4NzQwODMxNERFNjNCNzgzMzkyRDVCRDlCM0FDRjU2Q0NENzBCCgo0OTMzQzE3MjQ3MzIz
-NzlBNjE2MDEyREZGOUE5RTE0RDVBNTVGNTBEODQxMzMzOTU4RDZGMzZCNTY5MjYyMjhGNDc5
-NjQyMUU0NzA3MzUKCjRGQUI3NDMxODk5NDQ1MTE0QkNDRTVEMjcxMTdCRkVBNjVFRTExMTg1
-MDU3NjUxMzJCNzgzM0ZFOTk3ODg5OUFBQTFCRTNFM0Y4QUZDRgoKMEU5RTExNDBBMjZGQzlD
-QTE1NEE2QkJCODRDM0U1RkQ2Q0Q4QjgyNzMyQkUwMTc5REVCQUNBQzUzNDBDNzk0OTNBMThG
-QTJFNURGNThBCgo1RjBDNjU0NkY1QTU4MzZCRDYxQzkwNEE4RUJBRjE2Q0Q5MzNBOUJDN0ZB
-NzJGQTcyRjMxOUEwQTZFRTg2QUQyM0M4NEU2NzJEMThDQkIKCjA2OTZGMjJFMUM2OUVDRUZE
-MTVGQTUyNzA2RTVEQ0YzQ0I1MzExQjI4RDlBNjE0NDQ2Q0UwMzM1NDdFQzBFRjVGRkFFQ0Yy
-QTA0RjFBNgoKQzNERTkxRUQyQjNGQkE5NERENzc5NkU0NUQyNkFCMDBCOTlCM0UyOTU3NTFC
-RDY0NzNGMEJGMzZFQkNBMjhGRkFCMjQ1MUU5M0RGNEUwCgoyNkJGMDg0NEZBQkM2QTEyRUYx
-NUVCQTY0QTVDQTBFOTdDNkREMDZCOTRCQTFDQjI5REZDREFEOEMyMDNDMUNCNkY3QTFGQUY0
-RjNCNTgKCjVCREQwQkY5MjI1NDlDQjQ1REY4RjIxOTZDNzA5RjJCOUEzNUE0M0RCMDA0M0Uy
-QkQwMjg3QTNDMzEzRUUzQzMzRjExOUYwOUE1NjE5RgoKQjM1MEY0MDExQTkzMTAwQ0VFMDg0
-N0YxQkRFMTJGRUU4RTMyM0M4RkFFMzRENTM1REI1QTBEQzg0NzVERTgyOTlFM0M5Q0Q2RDhC
-MENGCgpENjQ4MTYxOUM2OEU3N0Q5MkZBMTBEOUVCQ0MxM0U0NzRBRDIyQjFGNDdEM0YzNjJG
-Qzk2OENGQzFCNUI1MkVDMjRGMTlCQTg5NDk2N0UKCkVEODExRjM3NTI1QzI2MEFGRTBFMkY5
-QjMwMkQ2RkZEMDE5NzU0RUJDQzE0RTA1M0E5RUVEMTkwNUY0MDJCQTdCRDNEOEFGQjA5RDJB
-OAoKRTk0RDBBREJDM0MyQURGQUZEMkE0MDUyMjU2RDU4QjIyMUQwQTIwOTk1RjlDMzk0RjNB
-M0FENjQzNkNGRTRGMDAzMEM3RThDMjA5NEUyCgowOTJGNTE5MUMyQzcyMUNBOTQzMzM2OUFG
-QzIyMUQwMTg3MkJGNjgyOTg2Nzc4NDFBMDY1Njc3MjY0OUU3RUJBQUM4QjFCODFBMzhFNzUK
-CjVCMDJEREE0RDA4QjJGMzU3QzBDMTBFMTA2MDYzMkZGNzRGN0VERDVDRkU3RjlEQkIyMzJD
-M0EyMzFEMTI4QTMzNjhDNEQ5ODcyNDA0RAoKRjQ1NzE5QjNFQTA0NTU4MzZCODkzRjA3RTA3
-NzYyRjBBMkZBOUUwMTEwMTBBMDg3MjM1M0YwQ0QyMjQzRTE4NjBFQzMzRjcyRTE1RUIyCgpF
-REVFMUE5MTM5N0ZFNkQyNzI5RkVEMUIzQTY2RkQwMDlFQThERERBREQxRkZEQzhDRDM2MDM4
-NzZGOEQwQzdBRDYwMTY0QTk2QTZDNzMKCkI4QThCNTA5ODVFMUZCREEzQURDNTAwMThEMzQx
-RjI4NTAzNkI1RUUyNTVEOTc1RjZDM0I1Njk4QUM0QTk0QjIzMTdCQUM2NTg4OTc4MwoKNERC
-N0JGNTJFOUI4RDIwRkQ0OTgxNTE1RkJFRjIzOTYzQTdGODYzNkQwODk3RTdFQTg4OTAxQ0ZB
-RTFGREQxOERBODZDMjQ2NTA3QTM0Cgo3NjcyQUJCMTE2RUQ2MDVBQzlCNEI2RTg5OUI5RThG
-Njg2NzE0MEJFODlERjVDRDUyQzY1QzI3RTg2MDE3MEFFQTZDQUYzMDNDODYwQTYKCjgwQTg1
-Mzk0REU2ODk2Q0Y5MjhCRUQ3NjE3MUY4OTA0QzVCQkY0MTk2QkFEOTA2NTY5QUM1QzcwNTdF
-RDEyMDFGMkFFODM5M0NCRjcwNAoKMDA5MTI0QTZFNTIzMUQzMjNDM0ZDRTZDNDhDQTIzOUYx
-NjlERkY0OTZCOTUxMzMyREVCQTVGMDZDRUU0OEI2QkNGODI0RjBGQjRCRkU1Cgo0QzExNDdC
-RjIwOEMyQTlENDQxMzJEMDg5NUZBN0E4N0Y2RkFENzgwRERDRjk0NTQ1RjcwMzBFRjE4MDhC
-MzBFQzY1OUZBMkI2RUEwMTEKCkEzQzA2MDcwMzg4QkJBRUJFNDVGOEVBQTc1RjcyQkE1QjRF
-NTYzODBGQjdGQzMxNzlCREI1NUE5QTdDQUY4RDdGQjYwRUFENkRBOTM5QgoKMDlFNjkxNTk0
-MzI2NzFDODhFMjJCMzREMTE1QjZERUM1NDk1NTQ1NEQ2MjI4NTcwOTRCNzBDMzM1OUQ2QTIy
-QzIzOUZFMDM4NTNDRkQ5Cgo5QjdGQTczRDRFRTNDRDM0MTI0NDg2RjAxRjVDRjA1QTQyM0ZG
-RDc5NEY1NzdGNTBERTY3NzY3NzkxMDdCRDU4ODA4RUVGQTI0REUxQkUKCjk0QkIyN0Y4MkEx
-OTA2OEQ3RjlEQzY5NUVDODQ3MzM0MUY3M0ZFRDYyNkE0QTZFODlCNThENEVEMjAyNEY3OEFD
-NzY3ODgyOUZBNDBCNwoKQzhBQTc0MDBFRTNDRUZFMTI1RjY0RTFBQjQ5Q0U2N0ZBMkYyRDFC
-ODFGQzMyMkFBNjRGMTY0NjNDMTM0QUY1MUFBOUMzQTE1NEM3RkQ0CgozMEJDRjQ1MzFFQTlC
-NjIxMUY5MjAwNkFDMUM2MTg5NEE3REQ1QzM4RTZDQjhDQzY4RDZBMDVCQjk1QjBCREFGNjY5
-NzFEMzU3RUZDQUQKCjg5QkNCODEwOTQ2MkI3OTY5MjczODk1NjdGNzk3RTU4ODIzNzA2QUIy
-MjRGRjkyN0E3NjE2RjBFNDUyN0Q5MEIwREI5Njg5RDg1MEQ0QgoKNEYxNDcwODBDQkJGMzQ5
-M0U1NjRBMUNDNDM2MjcwNzVFNzlCRjNDMzA5MUU0NjUwQjhFNjA3RjRDQ0NCQ0FGQ0QzRjc3
-OEI3QTE0NjRCCgoxNEE0RTIyOUZENDFCNUJDNEE5ODg4MEYwMDhFRDYzRkQyNUFFNDUwNEVF
-OEJEMzhCNjQxRjY1RDBGM0Y2NTk2MUFDMzE1RjRENjgxMzkKCjdDMjQ3MEU4ODgxM0JDRkM3
-RTQxRkRBOTlBRUZFMTcwRTI3NEQ1M0REM0Q4NThEOEJCREExNTRCRkM5MzQ4MkM2NUZFQUU0
-QUQ3RTlBNAoKN0FDOTUzMEYwQTgyRkY0NkU4QkYyMkVDNjRCM0E4QjY5NTI3RTkyMjQ1QjNC
-MjcyQzMxMUZDRjk5NDZFOTM0NzZEODM4RUMwQUU1NEVBCgo4Q0I4OTkwODc3OTRBNjdFNkI0
-RTk2NjY0QUZERDYxOUZDMDc0RkEwODlGODNBMDJGQTRGQ0JCNUJFNjk4RTUwOEY4N0JDMEY0
-ODA1MUEKCjhBQTRERTNFQkYzRkQ5M0FCQ0Y1OEMxRkI2NDI1NzAyN0FGOEZENjlCN0NFRjA3
-NDk4RjQ4RjM5M0I0QjRFOUJERDY1MTkzMzJBNzgwQQoKRTcyMTUyQ0UxNjhFMzk5RTc1REI0
-NDE0NjE4QjlFRkZCNDk4NkI4NUE5NENCRDBCOTEyRTNENUNEREJBNkI3ODRFQUM2NjA5NjlB
-ODNDCgpDRjNBRjkyOEI2RTg0NTg2QjVGMUNGMzUzRUZERjAyMkRBNURGMTMwRTdGRkQxNjk4
-QTlBN0MyNkM4M0YxMzVGQzM5RTlDRUNCODg1NUQKCjk2MDFBMDhEOUU1QURDNTM5N0VFOUU2
-MzlBMTk4QTYxQTc5QjNDRjU5NjBBRkM0MTU4NEI1NkIwRUY1QzYwNEU0MkJERDAyMUU3MTZC
-NwoKMzcxOEFBN0ZBNzAwMkQzMjlGMjJFMzg5OEI1MkYzMTExRTk3NUQ1MDU0QzhDMUJDNDkx
-RURENjdDQUY4NzY1MTc5MDFDQjc4MDVGQTg0Cgo0Mjc5NDM1QjI2QTJCNTRDMDg2RkU0NDND
-MDc5QTM3M0I2MzA1Mjg2NjRDOEYyNjJEMTQ3RjQ0RjE5QjM3NjBENENCNEQzQTM4QjhFN0IK
-Cjg0OTJGM0ZDOTEwRTQ1QTIwMUZGQkI4QjNGMDZGODBDRDEzNUMzMjFFRjUxQjdBN0MzMEFG
-QjVBMTRENUVBODUxRTRCMjMyMzJCM0YwRQoKMjcyNjAzMTI1REU5OUM2QjE3NTVDOUQzRThC
-OUU5MkQzM0FBNEVFQjU1RDA3RDA2MTU4RkZGOTNCQ0VFOTIxQ0JFNkE5QjY2MDVCRTNBCgpE
-MUMyMDNBQjkwM0FFRDkwQTFGNzM1RDMyODQ2RUU5QkY3QUNCRDdCQzQ3OUZEQUQ4MjA0RjBB
-NTYwMTQ3N0UyQ0EwOTJDN0NENTc2NzEKCkUyQjE3OUI2MEE3Mjc5NEZCM0RFQkVCRTlFNDFF
-RjMzM0Y5NzAwN0JGRkRDMUExQzU1Qzc5RUI5Q0Y4NUFDMkRDQzIzNzAwRjQ4RDZFRQoKNjIx
-RDAyRkFBQjdEN0U3QzUxMkI5MzkzNjJBQURCMUFDREIyNUI3NUZFMUI5MzVGMTVGOTIyQUU0
-RTAzNjMyRUM5QUMxQ0NFMTEyRkQ3CgpDQzg1MTBCODY5MjEyMDlDRUY1RTY2RjUyQ0FGNEVB
-RkQ4M0U3NzJBNjUzQjBCMTBFQTdERTM4MTc0QTY0NTgyMjhGOTAxNDZBMUM1RTUKCkYwNTdE
-Mzg0Q0I1Q0U1MzFDMDJGN0JGMkJEMjA1MTdGMTgyNTk3MzEwMTU3QUVENjhDMjMyNUNDQUJD
-MjJGOUQzOEEzMkFGMTU3NTcwNwoKREVBNTEzOUUwMzYzNjc3MTYyREI2RUU5RDQ2NjE5REFD
-ODhEOUQ5NzkwMkQ1QzU4MzM5RkY5QjdFM0REQkRCNzIyNkRFRDM2QzFDQjUxCgpCNTBCQTc0
-NENCMkRFNTk2NDEyNjkxODg3OURCRTdEMkZBNjE2RkJBOUQ0RDI5NjUwMjFFRERBOEE4OEZE
-RkMwODg1M0RDMUZFOTk2MTQKCjE1Qzc0MUIyMUZBN0Q3OUE2RjAyODFCRDA1NEU0OUM2RjE4
-OTNBMkE0QjM3MDhFNzI3MkY0MkM2QUU4QTVFN0M5NUNENjg3OTQ2NjE1MAoKQ0I5OUY0MTEw
-QjM5MkRBN0RGOTE0MTk1NzFFRTMxQzkyNkIzNTcxREMwRkQ3MzAyRTI3MTI2M0M0QUZDRjc1
-NTM1MjU2NTFEOEQ1NTg3Cgo3QUE0RTEzMzMwOTJFRDUyQTk2NzI5OTBCRjM0QTFCNjBFQzI0
-MzI0MTUzMEU2N0U5RjFEN0NDQkJBMUI1MTFBMjQ3OTNGMjUxMUYzRTQKCjc2M0IwMkQ0MDg0
-Q0ZGMDk5QkQ4MzQwOEZFQUQwNDAzRTMzQTZCRUZCQ0FEOTU2NDIzMkZBQjdCQUJDOEJDQUY3
-ODVBNkVBNzRBQTg4MgoKQjc0REUyMjlBNkM5RDE0MEU2MTdGMTBFOTg4NDY3NzA0RDMxNjk1
-NjM3MTA2ODI1REUwRjMxQzNCQkFEN0VFQzMxN0MyQ0JGN0NBN0IyCgpFMjVBNTM2NUM4MjM0
-QjlDNTdDOUUzODUzQzdBNTgxOTcyQjMxODZBQTg3MDQ2QzA5REFBNDQyOURDQzU2QzdDRjdG
-OTc1MDQyOEI5NzQKCjQ5RTZEOUUwRUUxMDRCQjJFODBEMDU3OTdENjFDNzFGNzc1MUM1NzI2
-RTFGRDdDNDQxMTc2QUJEMzI2MTNCNkQ3RUE5OEI0MjYyRjlGNQoKNjY0QUE4RDRFOTQyMkFB
-MEY0NEM0QTFDNzlDMzIxNDBGNkYzOEFCRDBGRTlEN0NEODU5OTdBMzU3Qzk5OUEzNzY3NEY0
-NjAzNjA5MzQ5CgpCRUJBNEY4NkQ4MTgyOTBGNkQxRTc1Q0M3MDU1NUQ2OEE3MTdFQzA2M0I5
-MjkzMUYyMjc4RTQ2MEEyNEE1MzM3N0Q4NTMyMkZBQzAzQkEKCkQwMDhFRDY0MDJGMzc2OEE3
-NUNFRUY0RUJGNzM4NTJBMjUxMkMxNDk5QjNENDUwMkUwNUU5QzRDNzdEOTYyNzA4REU3RkI0
-MDYyNjVBNwoKQTdCMEFFMzhFODc5QkU4OTIyQzU4NUVGNEFDREEyQTQ0NTlDMjdERUFDNTkw
-OUFCQ0MxNTA2NEVCNkI5NzRFRUQ5NTcwMjI4NkY4QzA0CgpFNTkxODcyNDFFMzU3QkYwRkEy
-RjFCMUQyNTc2MzY2REQ5NkIxNUU0MDg5MTA0MTQzNUQzNTQyMzQ0REREQ0VBOTk4MkU3ODUw
-QkNGMTIKCkJGNjAwOTNGMEJCOTEyNzlFOEFDMkE0MERCNUM3RjA1ODY0MjJBOUI3NTE5QjVB
-MTRGMEU1QkU0OUJDMDgxODEzN0QwRDUxMkEyQkQ2RQoKNDc1ODU1RUFGQkVGNDcwMTkwNzIx
-QTZFOTA5NjZDRDhGNDdGODAxNzgwQjYxODFDOTJCNkQ0MDFCQjcwQTY0Qzk1QjEyQUU3RERE
-OTgwCgpEMzIzMjNFRjU2OUMwNTEwNUFEQzNBQjVERTEyN0I0MjFFRTE0NTNERjdGQzVCRTIy
-NzVFNTk0MUZDOUM3RkVFMDlGOTMxMDM5REE3MEIKCjkyMDYwNEQ0MDcwMzM2OUI0N0Q4MDE0
-RTk1RjgyNzU2MzIzNEQzMkEwOEZDRjhCOTkwNzNGQkY3RTg3QTM0RDdGQTFBRjlFNkI1QzVD
-MAoKODgwMjI1MEFDQjdFOTQzREExMDhCQjI0ODVBNDEzMjQ4MTlDRTg1QUQ1MUNBODNGQzc1
-NzVGRDVFOEVFMzUzQUI4QzZCOUMyRjNEQjhFCgpCM0RFRDQ1RjIyNzExMTkwMzIxQTJGNkY5
-NTA5N0RENkEwRUQ5MUUwREE1NEFBRkQwNUE2QjlEMzk5MjM5NTI1Q0Q4MzNFOUFBNjIzMUMK
-CkQ0RjgzNUI3MzBFNTQ1OUMzOTlERjc2OTNEQzRDMUNBRUZBRDY0MTZCQzk1RjhCOUYwNTMz
-QzBBMjdEODZCNDJEODQ4MEZDOTA4QUE5MQoKQzA0NjhGMEJGNzNDQzVFMjYwRTVGMDBEODJD
-NDM5RTlBNTgxQjE5QTYxQjUwMTQ2MDZENTdEMTg2RDlGOTQ2OTIxN0I0NDcyREIxNjA5CgpG
-RUQxOTQ5RDI5RkYzRTJFM0ZBQUI1MzZGRjc5NDlBMjYwNDJCOUZDNTQwOEI3QjA1OUVFMzVC
-MEUyODdGNEQ4Q0VFNTBFNTQwREI3MTYKCjY4MDJFRkJGMEZCNjBGMThFNUExRkE5NDJBNEUz
-RTY2RUU2OEVBNDRCOEZGNjZCM0IwNjY5RTU5QTgxQzYxNjYzMTI5ODcxNjRFNkRDNAoKREI3
-NTA5QjExNDQ0Mjg3QTVCRUM1QkVBOUZGNjU2RDVBNDJDMERDQjEwRjgzQjE0REYwMkJCRkU3
-MjlFOTgzOUU1OTQ4OTVEQTgwNDQ4CgpCNzYwRDdBQjVFNThCNjc1QURBNDIwOTg5MjlGQkVE
-MzVENjJBNTQ3MzdGRTZFNjEyNTY5QjhERTRFQjYwM0YxREQ2REJGRkU4Rjc5RDYKCkFFQTFC
-MDU5OTkxM0FBNzAwODNFQjk0RTI1MURCMjc3QkU5RjQ5MkU0RDEzQjJFNDJGQ0NGODI1QjM1
-ODlFQzRGOTQyN0JBNjU5QTU5QgoKNzNEQUNDM0M5RDJFOUNENzcyNjdERUZDRkRDRjIxMTdG
-NTIwN0FFQzQxOTgxMzBCMUI1ODU4NzVBNDlCNkUwMUM4QTVGRTVFQkM0Njc4CgoyQkRCQzQz
-OEJFMzJBMUNBRjEzNEU5QjUzRDgyNzYxRTlCNjgyRTBBMTk4QTgxMkYyOTZFMTkzQzI5NjQx
-MjU5Njk3OEREM0M1RUVGMEYKCkJFN0IzNTM1NjhDNTYyN0JDNjQ2N0M3NjdGOUVEODQxMkVF
-NDA1QzI0RjZERkU5NUFGNzI0MzdEMUFEOUI5OTJGRjMwNDU5RDIzMjQ5MQoKNjQ1RTg0NUZG
-RjAzMjE0OTQ5RDMzRTFBNDhFRjJBOTlEQjI5REU2RkY4MkU3MjA1MEUwRTZFMDhFODYzREI1
-NzBBREY1MTVEODI5MzFCCgpBRTcwNDM3RTQ5QzM5Nzc2Nzg3NEUzNDUxMzQxN0E0OTIzNEJC
-RDg5RjE5RkZDM0VFM0NEOUY1QkE3MTEyQTRCRUMwNzAxMkM3MDk1ODUKCjk3RUNBNUE1MDEz
-NjVFMzUyNEE1MDBGQThBNDNBN0JBOTBGOTFFOENENTgyNUY2NTk0MDgyNURFODBGNUVGMTEx
-OTg5NTJBMjU4QjVCQgoKRUM1QUEyNDRGODY3NEJFMTc2NEI1MjZEQjZCOUQyNDRDODg2OTgw
-QjI1QzdFRTRBQ0ZFQkY3OTM0OUUyNkYyRDJENjVGQTI4MTBEMUNECgo0QjM5MjMzRjk2Mzg1
-NDZBM0ZGMUU4RDAxN0VGNDU4RjE4MkNGMjI4MzkyQUQzMEE2RTdERjcxNUNEMEI1NUZBMzc3
-REZBNjg4MEY1NTQKCjM2N0E2RTM3MjgwNjVERjY1Q0FEMzBBRDkyNzk0Mzk2Mzk3M0Y2NTk2
-QzFDMUREMjlDMkM4NEIyMjRGODEzNjFENENBMkVEMkNDNjQ4MwoKQTU5RjgzM0NCOEE5NjRD
-MjgxQjBCQTJDODM0NzgzQzU3NTI5ODZCOEU3MDU4M0U2QzlBQTMzMTMyQkZDNjc5OThCOTky
-RjI0OUQwQUQ3Cgo2QzAyQkREMjkyNUIzOTUwMUE2OUU0RTAwREQzNTM0QzQ3NEQwNzE1Qzkx
-M0UyMzY2MEJCNzY1QzJFNUZFMzdGNDQ1QUM2MDVGNjJERTkKCkM1MzNFRTkyNEVGRTIwNUM1
-MjhDMzcyNDAzNjk2ODg1RERENkJBREFGNjAyOTkzRjNERjQ5OTU3RTIxQjJFRTQwOUFBNjMz
-NkE4MTAzRQoKQkNDMEIzM0I4RkZEOEM4MThGMkQyNUQyMkUzQjBFNEU4NzRDRjRBREUwM0Y2
-OUMxQjAxN0RBOUNFRDlFQUZDNkNCRDg2NzgwQzgxOUE5CgpDRTAzQzJBQTIwM0NBQkQyOTky
-NTFCOTA5MEYyNjU5QzMyNDVBODQ1QjUwRUIzNkJDQkMwN0FENkZFMEExOTFEM0U4QkQwQzlC
-OTcwMEEKCjcwNkVBMzAyOEU4MDU1QjU4NUE2RDhGMzA1QzgwREQ1QURCRTFEQTQzMzY2OUUx
-RDlGNDU5RUExMDVCNUY2RDc1NkE5RkYzREY3MTYwNwoKOUZEQTc3MzEyRTQ0N0Y3NjRDMEYx
-NzhCN0YxMjhEQTRBQ0UxN0Y4RDRGMjEzODY0QzJBQUZBQjBENUJDRTQwQTE5QUM5MkZGMjFE
-N0IxCgpGMUYzQ0VDMzM4OTUxRDcyOTIxNDc5MzdFRDBCREIwQ0VDMjU3OEQwQkZFMTJGN0Yy
-MUI0RDc2QUREMUY1NTdFOEE1NzYxMzk5NTkxQzIKCkQ0QTJDQjFGMEQ5NTY0NTg2NTY3QUU5
-MTY1NDUxREZGNUQ2MUUwOEYwNDIxQTg2MDZFNDlBNTUyRTE5RjhDQ0RDOTBDQTkyQzRCQzJB
-RAoKMkZDM0RDMjlERkY2RTU2QkE4NUQ4RTdCMDM4ODk2MkRCNUJCMTA3Q0JBQjRGRDQxNzBG
-MjRDMjFERkUyQTNFRjI5RERCODJDMDJFRjMyCgo0QjlEQjJBQzA5QzFBNUVBN0M3MUIxNTQ3
-NTczQjY4RkY4QzMyMTVCODAzQ0QzRURFMTIyREUxRDcxNDkyQkQzQjcxQzVBNkRFNTJENTAK
-CjhFOTg2NzY1NjBFRDI3MzQwM0I5RDY1NUYyMzk1NzkwMDc3MDZDMDc4RUEzRURDMTIwRURG
-RUNBRjRGMTMzNzlBNDUyNkZCMzczMUEwOAoKOTY5MENGNkQ3NEYyRTk1RTMzMkQxRERCMzZE
-RjQ1ODc3MUYwRjdCRjMyMUU1MjQ0NDdCNkUwNEFDMzMwMTFFODU1QTBFMjU1ODJGMTA0Cgo2
-OUYxQjZDMTkwODlBRjAxM0MzOEYyNjI0ODI2QTU3MzA2NDEKCjAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCjAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAKCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAKCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCjAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
-CjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAKCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
-MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCmNsZWFydG9tYXJrICV7cmVzdG9yZX1pZgoKJSVF
-bmRQcm9jU2V0CiUlQmVnaW5Qcm9jU2V0OiB0ZXhwcy5wcm8KVGVYRGljdCBiZWdpbiAvcmZ7
-ZmluZGZvbnQgZHVwIGxlbmd0aCAxIGFkZCBkaWN0IGJlZ2luezEgaW5kZXggL0ZJRCBuZSAy
-CmluZGV4IC9VbmlxdWVJRCBuZSBhbmR7ZGVmfXtwb3AgcG9wfWlmZWxzZX1mb3JhbGxbMSBp
-bmRleCAwIDYgLTEgcm9sbApleGVjIDAgZXhjaCA1IC0xIHJvbGwgVlJlc29sdXRpb24gUmVz
-b2x1dGlvbiBkaXYgbXVsIG5lZyAwIDBdL01ldHJpY3MKZXhjaCBkZWYgZGljdCBiZWdpbiBF
-bmNvZGluZ3tleGNoIGR1cCB0eXBlIC9pbnRlZ2VydHlwZSBuZXtwb3AgcG9wIDEgc3ViCmR1
-cCAwIGxle3BvcH17W31pZmVsc2V9e0ZvbnRNYXRyaXggMCBnZXQgZGl2IE1ldHJpY3MgMCBn
-ZXQgZGl2IGRlZn0KaWZlbHNlfWZvcmFsbCBNZXRyaWNzIC9NZXRyaWNzIGN1cnJlbnRkaWN0
-IGVuZCBkZWZbMiBpbmRleCBjdXJyZW50ZGljdAplbmQgZGVmaW5lZm9udCAzIC0xIHJvbGwg
-bWFrZWZvbnQgL3NldGZvbnQgbG9hZF1jdnggZGVmfWRlZgovT2JsaXF1ZVNsYW50e2R1cCBz
-aW4gUyBjb3MgZGl2IG5lZ31CIC9TbGFudEZvbnR7NCBpbmRleCBtdWwgYWRkfWRlZgovRXh0
-ZW5kRm9udHszIC0xIHJvbGwgbXVsIGV4Y2h9ZGVmIC9SZUVuY29kZUZvbnR7L0VuY29kaW5n
-IGV4Y2ggZGVmfWRlZgplbmQKJSVFbmRQcm9jU2V0CiUlQmVnaW5Qcm9jU2V0OiBzcGVjaWFs
-LnBybwpUZVhEaWN0IGJlZ2luIC9TRGljdCAyMDAgZGljdCBOIFNEaWN0IGJlZ2luIC9AU3Bl
-Y2lhbERlZmF1bHRzey9ocyA2MTIgTgovdnMgNzkyIE4gL2hvIDAgTiAvdm8gMCBOIC9oc2Mg
-MSBOIC92c2MgMSBOIC9hbmcgMCBOIC9DTElQIDAgTiAvcndpU2VlbgpmYWxzZSBOIC9yaGlT
-ZWVuIGZhbHNlIE4gL2xldHRlcnt9TiAvbm90ZXt9TiAvYTR7fU4gL2xlZ2Fse31OfUIKL0Bz
-Y2FsZXVuaXQgMTAwIE4gL0Boc2NhbGV7QHNjYWxldW5pdCBkaXYgL2hzYyBYfUIgL0B2c2Nh
-bGV7QHNjYWxldW5pdApkaXYgL3ZzYyBYfUIgL0Boc2l6ZXsvaHMgWCAvQ0xJUCAxIE59QiAv
-QHZzaXpley92cyBYIC9DTElQIDEgTn1CIC9AY2xpcHsKL0NMSVAgMiBOfUIgL0Bob2Zmc2V0
-ey9obyBYfUIgL0B2b2Zmc2V0ey92byBYfUIgL0BhbmdsZXsvYW5nIFh9QiAvQHJ3aXsKMTAg
-ZGl2IC9yd2kgWCAvcndpU2VlbiB0cnVlIE59QiAvQHJoaXsxMCBkaXYgL3JoaSBYIC9yaGlT
-ZWVuIHRydWUgTn1CCi9AbGx4ey9sbHggWH1CIC9AbGx5ey9sbHkgWH1CIC9AdXJ4ey91cngg
-WH1CIC9AdXJ5ey91cnkgWH1CIC9tYWdzY2FsZQp0cnVlIGRlZiBlbmQgL0BNYWNTZXRVcHt1
-c2VyZGljdCAvbWQga25vd257dXNlcmRpY3QgL21kIGdldCB0eXBlCi9kaWN0dHlwZSBlcXt1
-c2VyZGljdCBiZWdpbiBtZCBsZW5ndGggMTAgYWRkIG1kIG1heGxlbmd0aCBnZXsvbWQgbWQg
-ZHVwCmxlbmd0aCAyMCBhZGQgZGljdCBjb3B5IGRlZn1pZiBlbmQgbWQgYmVnaW4gL2xldHRl
-cnt9TiAvbm90ZXt9TiAvbGVnYWx7fQpOIC9vZHt0eHBvc2UgMSAwIG10eCBkZWZhdWx0bWF0
-cml4IGR0cmFuc2Zvcm0gUyBhdGFuL3BhIFggbmV3cGF0aApjbGlwcGF0aCBtYXJre3RyYW5z
-Zm9ybXtpdHJhbnNmb3JtIG1vdmV0b319e3RyYW5zZm9ybXtpdHJhbnNmb3JtIGxpbmV0b30K
-fXs2IC0yIHJvbGwgdHJhbnNmb3JtIDYgLTIgcm9sbCB0cmFuc2Zvcm0gNiAtMiByb2xsIHRy
-YW5zZm9ybXsKaXRyYW5zZm9ybSA2IDIgcm9sbCBpdHJhbnNmb3JtIDYgMiByb2xsIGl0cmFu
-c2Zvcm0gNiAyIHJvbGwgY3VydmV0b319e3sKY2xvc2VwYXRofX1wYXRoZm9yYWxsIG5ld3Bh
-dGggY291bnR0b21hcmsgYXJyYXkgYXN0b3JlIC9nYyB4ZGYgcG9wIGN0IDM5CjAgcHV0IDEw
-IGZ6IDAgZnMgMiBGL3xfX19fX19Db3VyaWVyIGZudCBpbnZlcnRmbGFne1BhaW50QmxhY2t9
-aWZ9TgovdHhwb3Nle3B4cyBweXMgc2NhbGUgcHByIGFsb2FkIHBvcCBwb3J7bm9mbGlwc3tw
-b3AgUyBuZWcgUyBUUiBwb3AgMSAtMQpzY2FsZX1pZiB4ZmxpcCB5ZmxpcCBhbmR7cG9wIFMg
-bmVnIFMgVFIgMTgwIHJvdGF0ZSAxIC0xIHNjYWxlIHBwciAzIGdldApwcHIgMSBnZXQgbmVn
-IHN1YiBuZWcgcHByIDIgZ2V0IHBwciAwIGdldCBuZWcgc3ViIG5lZyBUUn1pZiB4ZmxpcCB5
-ZmxpcApub3QgYW5ke3BvcCBTIG5lZyBTIFRSIHBvcCAxODAgcm90YXRlIHBwciAzIGdldCBw
-cHIgMSBnZXQgbmVnIHN1YiBuZWcgMApUUn1pZiB5ZmxpcCB4ZmxpcCBub3QgYW5ke3BwciAx
-IGdldCBuZWcgcHByIDAgZ2V0IG5lZyBUUn1pZn17bm9mbGlwc3tUUgpwb3AgcG9wIDI3MCBy
-b3RhdGUgMSAtMSBzY2FsZX1pZiB4ZmxpcCB5ZmxpcCBhbmR7VFIgcG9wIHBvcCA5MCByb3Rh
-dGUgMQotMSBzY2FsZSBwcHIgMyBnZXQgcHByIDEgZ2V0IG5lZyBzdWIgbmVnIHBwciAyIGdl
-dCBwcHIgMCBnZXQgbmVnIHN1YiBuZWcKVFJ9aWYgeGZsaXAgeWZsaXAgbm90IGFuZHtUUiBw
-b3AgcG9wIDkwIHJvdGF0ZSBwcHIgMyBnZXQgcHByIDEgZ2V0IG5lZwpzdWIgbmVnIDAgVFJ9
-aWYgeWZsaXAgeGZsaXAgbm90IGFuZHtUUiBwb3AgcG9wIDI3MCByb3RhdGUgcHByIDIgZ2V0
-IHBwcgowIGdldCBuZWcgc3ViIG5lZyAwIFMgVFJ9aWZ9aWZlbHNlIHNjYWxlYnk5NntwcHIg
-YWxvYWQgcG9wIDQgLTEgcm9sbCBhZGQKMiBkaXYgMyAxIHJvbGwgYWRkIDIgZGl2IDIgY29w
-eSBUUiAuOTYgZHVwIHNjYWxlIG5lZyBTIG5lZyBTIFRSfWlmfU4gL2NwCntwb3AgcG9wIHNo
-b3dwYWdlIHBtIHJlc3RvcmV9TiBlbmR9aWZ9aWZ9TiAvbm9ybWFsc2NhbGV7UmVzb2x1dGlv
-biA3MgpkaXYgVlJlc29sdXRpb24gNzIgZGl2IG5lZyBzY2FsZSBtYWdzY2FsZXtEVkltYWcg
-ZHVwIHNjYWxlfWlmIDAgc2V0Z3JheX0KTiAvcHNmdHN7UyA2NTc4MS43NiBkaXYgTn1OIC9z
-dGFydFRleEZpZ3svcHNmJFNhdmVkU3RhdGUgc2F2ZSBOIHVzZXJkaWN0Cm1heGxlbmd0aCBk
-aWN0IGJlZ2luIC9tYWdzY2FsZSB0cnVlIGRlZiBub3JtYWxzY2FsZSBjdXJyZW50cG9pbnQg
-VFIKL3BzZiR1cnkgcHNmdHMgL3BzZiR1cnggcHNmdHMgL3BzZiRsbHkgcHNmdHMgL3BzZiRs
-bHggcHNmdHMgL3BzZiR5IHBzZnRzCi9wc2YkeCBwc2Z0cyBjdXJyZW50cG9pbnQgL3BzZiRj
-eSBYIC9wc2YkY3ggWCAvcHNmJHN4IHBzZiR4IHBzZiR1cngKcHNmJGxseCBzdWIgZGl2IE4g
-L3BzZiRzeSBwc2YkeSBwc2YkdXJ5IHBzZiRsbHkgc3ViIGRpdiBOIHBzZiRzeCBwc2Ykc3kK
-c2NhbGUgcHNmJGN4IHBzZiRzeCBkaXYgcHNmJGxseCBzdWIgcHNmJGN5IHBzZiRzeSBkaXYg
-cHNmJHVyeSBzdWIgVFIKL3Nob3dwYWdle31OIC9lcmFzZXBhZ2V7fU4gL2NvcHlwYWdle31O
-IC9wIDMgZGVmIEBNYWNTZXRVcH1OIC9kb2NsaXB7CnBzZiRsbHggcHNmJGxseSBwc2YkdXJ4
-IHBzZiR1cnkgY3VycmVudHBvaW50IDYgMiByb2xsIG5ld3BhdGggNCBjb3B5IDQgMgpyb2xs
-IG1vdmV0byA2IC0xIHJvbGwgUyBsaW5ldG8gUyBsaW5ldG8gUyBsaW5ldG8gY2xvc2VwYXRo
-IGNsaXAgbmV3cGF0aAptb3ZldG99TiAvZW5kVGV4Rmlne2VuZCBwc2YkU2F2ZWRTdGF0ZSBy
-ZXN0b3JlfU4gL0BiZWdpbnNwZWNpYWx7U0RpY3QKYmVnaW4gL1NwZWNpYWxTYXZlIHNhdmUg
-TiBnc2F2ZSBub3JtYWxzY2FsZSBjdXJyZW50cG9pbnQgVFIKQFNwZWNpYWxEZWZhdWx0cyBj
-b3VudCAvb2NvdW50IFggL2Rjb3VudCBjb3VudGRpY3RzdGFjayBOfU4gL0BzZXRzcGVjaWFs
-CntDTElQIDEgZXF7bmV3cGF0aCAwIDAgbW92ZXRvIGhzIDAgcmxpbmV0byAwIHZzIHJsaW5l
-dG8gaHMgbmVnIDAgcmxpbmV0bwpjbG9zZXBhdGggY2xpcH1pZiBobyB2byBUUiBoc2MgdnNj
-IHNjYWxlIGFuZyByb3RhdGUgcndpU2Vlbntyd2kgdXJ4IGxseApzdWIgZGl2IHJoaVNlZW57
-cmhpIHVyeSBsbHkgc3ViIGRpdn17ZHVwfWlmZWxzZSBzY2FsZSBsbHggbmVnIGxseSBuZWcg
-VFIKfXtyaGlTZWVue3JoaSB1cnkgbGx5IHN1YiBkaXYgZHVwIHNjYWxlIGxseCBuZWcgbGx5
-IG5lZyBUUn1pZn1pZmVsc2UKQ0xJUCAyIGVxe25ld3BhdGggbGx4IGxseSBtb3ZldG8gdXJ4
-IGxseSBsaW5ldG8gdXJ4IHVyeSBsaW5ldG8gbGx4IHVyeQpsaW5ldG8gY2xvc2VwYXRoIGNs
-aXB9aWYgL3Nob3dwYWdle31OIC9lcmFzZXBhZ2V7fU4gL2NvcHlwYWdle31OIG5ld3BhdGgK
-fU4gL0BlbmRzcGVjaWFse2NvdW50IG9jb3VudCBzdWJ7cG9wfXJlcGVhdCBjb3VudGRpY3Rz
-dGFjayBkY291bnQgc3ViewplbmR9cmVwZWF0IGdyZXN0b3JlIFNwZWNpYWxTYXZlIHJlc3Rv
-cmUgZW5kfU4gL0BkZWZzcGVjaWFse1NEaWN0IGJlZ2lufQpOIC9AZmVkc3BlY2lhbHtlbmR9
-QiAvbGl7bGluZXRvfUIgL3Jse3JsaW5ldG99QiAvcmN7cmN1cnZldG99QiAvbnB7Ci9TYXZl
-WCBjdXJyZW50cG9pbnQgL1NhdmVZIFggTiAxIHNldGxpbmVjYXAgbmV3cGF0aH1OIC9zdHtz
-dHJva2UgU2F2ZVgKU2F2ZVkgbW92ZXRvfU4gL2ZpbHtmaWxsIFNhdmVYIFNhdmVZIG1vdmV0
-b31OIC9lbGxpcHNley9lbmRhbmdsZSBYCi9zdGFydGFuZ2xlIFggL3lyYWQgWCAveHJhZCBY
-IC9zYXZlbWF0cml4IG1hdHJpeCBjdXJyZW50bWF0cml4IE4gVFIgeHJhZAp5cmFkIHNjYWxl
-IDAgMCAxIHN0YXJ0YW5nbGUgZW5kYW5nbGUgYXJjIHNhdmVtYXRyaXggc2V0bWF0cml4fU4g
-ZW5kCiUlRW5kUHJvY1NldAolJUJlZ2luUHJvY1NldDogY3JvcC5wcm8KVGVYRGljdCBiZWdp
-biAvY1ggMTggZGVmIC9DTXtnc2F2ZSBUUiAwIGNYIG5lZyBtb3ZldG8gMCBjWCBsaW5ldG8g
-c3Ryb2tlCmNYIG5lZyAwIG1vdmV0byBjWCAwIGxpbmV0byBzdHJva2UgZ3Jlc3RvcmV9ZGVm
-IGVuZCAvYm9wLWhvb2t7Y1ggZHVwIFRSCmdzYXZlIC4zIHNldGxpbmV3aWR0aCAwIDAgQ00g
-dnNpemUgY1ggMiBtdWwgc3ViIGR1cCBoc2l6ZSBjWCAyIG11bCBzdWIKZHVwIGlzbHN7NCAy
-IHJvbGx9aWYgMCBDTSBleGNoIENNIDAgZXhjaCBDTSBncmVzdG9yZSAwIGNYIC0yIG11bCBU
-UiBpc2xzCntjWCAtMiBtdWwgMCBUUn1pZn1kZWYKJSVFbmRQcm9jU2V0ClRlWERpY3QgYmVn
-aW4gQGRlZnNwZWNpYWwKCiAvYXJyb3cgeyBzYXZlIDQgMSByb2xsIDE0IGRpY3QgYmVnaW4g
-L3kgZXhjaCBkZWYgL3ggZXhjaCBkZWYgL0QgZXhjaApkZWYgY3VycmVudHBvaW50IC9iIGV4
-Y2ggZGVmIC9hIGV4Y2ggZGVmIC9keCB4IGEgc3ViIGRlZiAvZHkgeSBiIHN1YgpkZWYgL2Fy
-cm93bGVuIGR4IGR1cCBtdWwgZHkgZHVwIG11bCBhZGQgc3FydCBkZWYgL2FuZ2xlIGR5IGR4
-IGF0YW4KZGVmIDAgc2V0Z3JheSBhIGIgdHJhbnNsYXRlIGFuZ2xlIHJvdGF0ZSAveHAgYXJy
-b3dsZW4gZGVmIC9tIHhwIEQgc3ViCmRlZiAwLjUgc2V0bGluZXdpZHRoIFszIDFdIDAgc2V0
-ZGFzaCAwIDAgbW92ZXRvIG0gMCBsaW5ldG8gc3Ryb2tlIC9iYWNrCkQgOCBkaXYgbmVnIGRl
-ZiAvdXAgRCA0IGRpdiBkZWYgbSAwIG1vdmV0byBiYWNrIHVwIHJsaW5ldG8geHAgMCBsaW5l
-dG8KY2xvc2VwYXRoIGZpbGwgbSAwIG1vdmV0byBiYWNrIHVwIG5lZyBybGluZXRvIHhwIDAg
-bGluZXRvIGNsb3NlcGF0aApmaWxsIGVuZCByZXN0b3JlIH0gZGVmIC9kcmF3dHJpYW5nbGUg
-eyAtMTQ0IDcyIHJsaW5ldG8gMCAtMTQ0IHJsaW5ldG8KY2xvc2VwYXRoIGZpbGwgfSBkZWYg
-L2Nyb3BtYXJrIHsgMiBjb3B5IG1vdmV0byAwIC0xOCBybW92ZXRvIDAgMzYgcmxpbmV0bwpz
-dHJva2UgbW92ZXRvIC0xOCAwIHJtb3ZldG8gMzYgMCBybGluZXRvIHN0cm9rZSB9IGRlZiAv
-ZmlsbHBhZ2UgeyAuOQpzZXRncmF5IDAgMCBtb3ZldG8gMCA3OTIgcmxpbmV0byA2MTIgMCBy
-bGluZXRvIDAgLTc5MiBybGluZXRvIGZpbGwKMCBzZXRncmF5IC4yNSBzZXRsaW5ld2lkdGgg
-MTggMTggY3JvcG1hcmsgMTggNjg0IGNyb3BtYXJrIDU0OSA2ODQgY3JvcG1hcmsKNTQ5IDE3
-IGNyb3BtYXJrIH0gZGVmIC9zaG93cGFydCB7IDEwIC0yMiB0cmFuc2xhdGUgL1N0b25lU2Fu
-cy1TZW1pYm9sZEl0YWxpYwpmaW5kZm9udCAxNDAgc2NhbGVmb250IHNldGZvbnQgZHVwIHN0
-cmluZ3dpZHRoIHBvcCAvc3cgZXhjaCBkZWYgc3cKbmVnIC00NiBtb3ZldG8gMCBzZXRncmF5
-IGR1cCBzaG93IHN3IDQgYWRkIG5lZyAtNDIgbW92ZXRvIDAuNyBzZXRncmF5CnNob3cgc3cg
-bmVnIDAgdHJhbnNsYXRlIC9TdG9uZVNhbnMtU2VtaWJvbGRJdGFsaWMgZmluZGZvbnQgMzAg
-c2NhbGVmb250CnNldGZvbnQgZHVwIHN0cmluZ3dpZHRoIHBvcCAvc3cgZXhjaCBkZWYgc3cg
-bmVnIDAgbW92ZXRvIDAgc2V0Z3JheQpzaG93IHN3IDEwIGFkZCBuZWcgMCB0cmFuc2xhdGUg
-LTYwMCAxMCBtb3ZldG8gMTIgMCAxMCBhcnJvdyB9IGRlZgogCkBmZWRzcGVjaWFsIGVuZCBU
-ZVhEaWN0IGJlZ2luCjM3Mjk4MjUyIDQ2MTc4Nzg5IDEwMDAgNjAwIDYwMCAoYm9vay5kdmkp
-IEBzdGFydCAvRmEKMTMzWzMzIDMzIDMzIDMzIDMzIDMzIDMzIDMzIDMzIDMzIDMzIDMzIDMz
-IDMzIDMzIDMzIDMzCjMzIDMzIDMzIDMzIDMzIDMzIDMzIDMzIDMzIDFbMzMgMzMgMlszMyAz
-MyAzMyAzMyAzMyAzMwozMyAzMyAzMyAzMyAzMyAzMyAzMyAzMyAzMyAzMyAzMyAzMyAzMyAz
-MyAzMyAzMyAzMyAzMwozMyAzMyAzMyAzMyAxWzMzIDFbMzMgM1szMyAzMyAzMyAzMyAzMyAz
-MyAzMyAzMyAzMyAzMwozMyAzMyAzWzMzIDMzIDNbMzMgMzZbey44MiBFeHRlbmRGb250IFRl
-WEJhc2UxRW5jb2RpbmcgUmVFbmNvZGVGb250IH03Mwo2Ni42NjY2NjcgL1BQQ29kZSByZiAv
-RmIgMSAxNCBkZjwwMDAwMDFGRkMwMDAwMDAwMDAwMDFGRkZGQzAwMDAwMDAwMDBGRgpGRkZG
-ODAwMDAwMDAwMUZGMDA3RkMwMDAwMDAwMDdGMDAwMDdGMDAwMDAwMDFGODAwMDAwRkMwMDAw
-MDAzRjAwMDAwMDdFMDAKMDAwMDdDMDAwMDAwMUYwMDAwMDBGMDAwMDAwMDA3ODAwMDAxRTAw
-MDAwMDAwM0MwMDAwM0MwMDAwMDAwMDFFMDAwMDc4MDAwCjAwMDAwMEYwMDAwNzAwMDAwMDAw
-MDA3MDAwMEYwMDAwMDAwMDAwNzgwMDFFMDAwMDAwMDAwMDNDMDAxQzAwMDAwMDAwMDAxQwow
-MDNDMDAwMDAwMDAwMDFFMDAzODAwMDAwMDAwMDAwRTAwNzgwMDAwMDAwMDAwMEYwMDcwMDAw
-MDAwMDAwMDA3MDA3MDAwMDAKMDAwMDAwMDcwMEYwMDAwMDAwMDAwMDA3ODBFMDAwMDAwMDAw
-MDAwMzgwRTAwMDAwMDAwMDAwMDM4MEUwMDAwMDAwMDAwMDAzCjgwRTAwMDAwMDAwMDAwMDM4
-MEUwMDAwMDAwMDAwMDAzODBFMDAwMDAwMDAwMDAwMzgwRTAwMDAwMDAwMDAwMDM4MEUwMDAw
-MAowMDAwMDAwMzgwRTAwMDAwMDAwMDAwMDM4MEYwMDAwMDAwMDAwMDA3ODA3MDAwMDAwMDAw
-MDAwNzAwNzAwMDAwMDAwMDAwMDcKMDA3ODAwMDAwMDAwMDAwRjAwMzgwMDAwMDAwMDAwMEUw
-MDNDMDAwMDAwMDAwMDFFMDAxQzAwMDAwMDAwMDAxQzAwMUUwMDAwCjAwMDAwMDNDMDAwRjAw
-MDAwMDAwMDA3ODAwMDcwMDAwMDAwMDAwNzAwMDA3ODAwMDAwMDAwMEYwMDAwM0MwMDAwMDAw
-MDFFMAowMDAxRTAwMDAwMDAwM0MwMDAwMEYwMDAwMDAwMDc4MDAwMDA3QzAwMDAwMDFGMDAw
-MDAwM0YwMDAwMDA3RTAwMDAwMDFGODAKMDAwMEZDMDAwMDAwMDdGMDAwMDdGMDAwMDAwMDAx
-RkYwMDdGQzAwMDAwMDAwMEZGRkZGRjgwMDAwMDAwMDAxRkZGRkMwMDAwCjAwMDAwMDAxRkZD
-MDAwMDAwMDM5MzU3Q0E4NDI+MTMgRCBFIC9GYyAxNDBbMTM1IDZbMTM1CjNbMTM1IDNbMTM1
-IDJbMTM1IDk3W3suODIgRXh0ZW5kRm9udCBUZVhCYXNlMUVuY29kaW5nIFJlRW5jb2RlRm9u
-dCB9NQoyNzQuOTk5OTg4IC9QUENvZGUgcmYgL0ZkIDE0NFszNyAyWzM3IDdbMzcgMVszNyA5
-OFt7Ci44MiBFeHRlbmRGb250IFRlWEJhc2UxRW5jb2RpbmcgUmVFbmNvZGVGb250IH00IDc1
-LjAwMDAwMAovUFBDb2RlQm9sZCByZiAvRmUgMSAxMiBkZjwwMDAwM0ZDMDAwMDAwMDAwRkZG
-ODAwMDAwMDA3RTA3QzAwMDAwMDBGODAxRgowMDAwMDAzRjAwMUY4MDBDMDA3RTAwMEY4MDBD
-MDBGQzAwMDdDMDFDMDFGODAwMDdFMDE4MDNGMDAwMDdFMDE4MDdFMDAwMDMKRTAzODBGRTAw
-MDAzRjAzMDBGQzAwMDAzRjAzMDFGQzAwMDAzRjA3MDNGODAwMDAzRjA2MDNGODAwMDAzRjBF
-MDdGODAwMDAzCkYwQzA3RjAwMDAwM0YxQzA3RjAwMDAwM0YxODA3RjAwMDAwM0YzODBGRjAw
-MDAwM0YzMDBGRTAwMDAwM0Y3MDBGRTAwMDAwMwpGRTAwRkUwMDAwMDNGQzAwRkUwMDAwMDNG
-QzAwRkMwMDAwMDNGODAwRkMwMDAwMDNGMDAwRkMwMDAwMDNGMDAwRkMwMDAwMDMKRjAwMEZD
-MDAwMDAzRjAwMDdFMDAwMDA3RjAwMDdFMDAwMDBGRjAwMDNFMDAwMDFERjgxODNGMDAwMDc5
-RjgxODFGMDAwMEUxCkY4MzgwRjgwMDdDMEY4MzAwN0UwM0YwMDdDRjAwMUZGRjgwMDNGQzAw
-MDNGQzAwMDBGODAyRTI2N0RBNDM1PjExCkQgRSAvRmYgODJbMjggNTFbNDIgNDIgNjAgMVs0
-NiAyOCAzMiAzMiAxWzQyIDM3IDQ2IDFbMjMKMzcgMjMgMjMgMVs0MiAxWzMyIDQyIDM0IDM4
-IDM3IDExWzY1IDUxIDRbNjUgMls0NiA1WzQ2CjUxIDY1IDE3WzQyIDQyIDQ5W3sgVGVYQmFz
-ZTFFbmNvZGluZyBSZUVuY29kZUZvbnQgfTMwCjgzLjMzMzMzNyAvUGFsYXRpbm8tSXRhbGlj
-IHJmIC9GZyAxNDBbNjEgMls2MSA2MSA2MSA2MQo2MSA2MSAyWzYxIDJbNjEgNjEgNjEgMVs2
-MSA1NVs2MSA2MSA0MFt7Ci44MiBFeHRlbmRGb250IFRlWEJhc2UxRW5jb2RpbmcgUmVFbmNv
-ZGVGb250IH0xNCAxMjQuOTk5OTk3Ci9QUENvZGUgcmYgL0ZoIDEzNFs1MyAxWzUzIDUzIDUz
-IDUzIDUzIDUzIDFbNTMgNTMgNTMKNTMgNTMgNTMgMVs1MyA1MyA1MyA1MyA1MyA1MyA1MyAx
-WzUzIDFbNTMgMTFbNTMgNls1MwoyOVs1MyA0WzUzIDUzIDQwW3suODIgRXh0ZW5kRm9udCBU
-ZVhCYXNlMUVuY29kaW5nIFJlRW5jb2RlRm9udCB9MjcKMTA4LjMzMzMzMSAvUFBDb2RlIHJm
-IC9GaSAxMzRbMzcgMzcgM1szNyAzNyAzNyAxWzM3IDM3CjM3IDM3IDM3IDJbMzcgMzcgMzcg
-MzcgMzcgMzcgMzcgMzcgMzcgMVszNyAxNVszNyA4WzM3CjcwW3sgVGVYQmFzZTFFbmNvZGlu
-ZyBSZUVuY29kZUZvbnQgLjE2NyBTbGFudEZvbnQgLjgyIEV4dGVuZEZvbnQgfTIyCjc1LjAw
-MDAwMCAvUFBDb2RlIHJmIC9GaiAxMzRbNDMgNDMgNDMgNDMgNDMgNDMgNDMgNDMKMVs0MyA0
-MyA0MyA0MyA0MyAyWzQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDFbNDMgOFs0Mwo0MyAy
-WzQzIDJbNDMgNDMgNDMgNDMgMls0MyAyWzQzIDQzIDFbNDMgNDMgNDMgNDMgMTdbNDMKNls0
-MyAzOVt7IFRlWEJhc2UxRW5jb2RpbmcgUmVFbmNvZGVGb250IC4xNjcgU2xhbnRGb250IC44
-MiBFeHRlbmRGb250IH0KMzkgODcuNDk5OTk3IC9QUENvZGUgcmYgL0ZrIDEzNFs3NCA4MCAx
-MTggNzQgODYgNjIgNjIKNjIgODggODggODQgODggMTMyIDQzIDg0IDFbNDMgODggODggNTcg
-NzYgODggNjkgODkgNzkKN1s5MSA5OCAxNDUgOTYgOTYgODQgNzQgODkgMTAzIDg2IDEwMyA5
-OSAxMjkgNzQgMVs0NAo0NCAxMDEgOTkgNjkgNzQgMTAxIDg5IDg5IDk5IDZbNDIgODQgODQg
-ODQgODQgODQgODQgODQKODQgODQgODQgNzYgNDIgNDYgNDIgMls1OSA1OSAzMiAzOVt7IFRl
-WEJhc2UxRW5jb2RpbmcgUmVFbmNvZGVGb250IH02NgoxMzMuMzMzMzM0IC9TdG9uZVNhbnMt
-Qm9sZCByZiAvRmwgODJbMzAgMjRbNDYgNDYgMjVbNTEKNDcgNzYgNTIgNTUgMzAgMzkgMzYg
-MVs1NSA1MCA1MyA4MSAyNyA1MSAxWzI3IDUzIDUxIDMwCjQ0IDU2IDQxIDUxIDQ2IDExWzcx
-IDRbNTUgM1s1NiAyWzMxIDI2WzIzIDFbMjMgMlszMCAzMAozN1s1NSAyW3sgVGVYQmFzZTFF
-bmNvZGluZyBSZUVuY29kZUZvbnQgfTM1IDkxLjY2NjY2NgovUGFsYXRpbm8tUm9tYW4gcmYg
-L0ZtIDgyWzMyIDNbNzEgNDZbNDggNTMgNDggODAgNTMgNTgKMzIgNDIgMzcgNTggNTggNTMg
-NTggODUgMzIgNTggMzIgMzIgNTggNTMgMzcgNDggNTggNDIKNTggNDggOFs2NCA5NSA3NCA3
-NCA2NCA1OCA2OSA4MCA1OCA4MCA4MCA5NSA1OCA3NCAzNwozNyA4MCA4MCA1MyA1OCA4MCA2
-OSA2NCA3NCA2WzI0IDQ4IDQ4IDNbNDggMls0OCAxWzI4CjI0IDFbMjQgNFsyNyAzNls1OCAy
-W3sgVGVYQmFzZTFFbmNvZGluZyBSZUVuY29kZUZvbnQgfTYyCjk1LjgzMzMzNCAvUGFsYXRp
-bm8tQm9sZCByZiAvRm4gMTM0WzEzOCAxNDkgMjIyIDEzOSAxNjAKMTE1IDExNSAxMTUgMVsx
-NjYgMTU4IDE2NSAyNDcgODAgMTU3IDFbODAgMTY1IDE2NiAxMDYKMTQyIDE2NiAxMjkgMTY2
-IDE0NyAxMFsxODAgMTgwIDE1NyAxMzkgMTY2IDFbMTYxIDE5NAoxODUgMjQxIDEzOCAxWzgy
-IDgyIDE4OSAxWzEyOSAxMzggMTkwIDE2NiAxWzE4NSAxOVs4Nwo0NVt7IFRlWEJhc2UxRW5j
-b2RpbmcgUmVFbmNvZGVGb250IH00MiAyNDkuOTk5OTk0IC9TdG9uZVNhbnMtQm9sZApyZiAv
-Rm8gMTM0WzE4MSAyWzE4MSAxWzEzNiAxNDkgMTQwIDFbMjE4IDIxMSAyMTUgMzE5Cjk0IDJb
-OTQgMVsyMTggMVsxOTEgMjE4IDE2NyAyMTcgMTg4IDEyWzIwNyAxOTQgMlsyMDcKM1sxODEg
-NFsyNjYgMVsxODkgMjYzIDJbMjMzIDY1W3sgVGVYQmFzZTFFbmNvZGluZyBSZUVuY29kZUZv
-bnQgfTI1CjM0OS45OTk5ODggL1N0b25lU2Fucy1TZW1pYm9sZCByZiAvRnAgMTQxWzI1IDJb
-MzcgMzgKNTUgM1sxNyAxWzM4IDFbMzEgMTAxW3sgVGVYQmFzZTFFbmNvZGluZyBSZUVuY29k
-ZUZvbnQgfTcKNjYuNjY2NjY3IC9TdG9uZVNhbnMtU2VtaWJvbGRJdGFsaWMgcmYgL0ZxIDEy
-OVszNyAzNwozNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAz
-NyAzNyAzNwozNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAz
-NyAzNyAzNwozNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAz
-NyAzNyAzNwozNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAz
-NyAzNyAzNwozNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAzNyAz
-NyAzNyAzNwozNyAzNyAzM1t7LjgyIEV4dGVuZEZvbnQgVGVYQmFzZTFFbmNvZGluZyBSZUVu
-Y29kZUZvbnQgfTk0Cjc1LjAwMDAwMCAvUFBDb2RlIHJmIC9GciAxMjlbNDMgMVs0MyAxWzQz
-IDQzIDQzIDQzIDQzCjQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQz
-IDQzIDQzIDQzIDQzCjQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQz
-IDQzIDQzIDQzIDQzCjQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQz
-IDQzIDQzIDQzIDQzCjQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQz
-IDQzIDQzIDQzIDQzCjQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDQzIDMz
-W3sKLjgyIEV4dGVuZEZvbnQgVGVYQmFzZTFFbmNvZGluZyBSZUVuY29kZUZvbnQgfTkyIDg3
-LjQ5OTk5NwovUFBDb2RlIHJmIC9GcyA4MlsyOCA1MFs0MiA0NiA0MiA2OSA0NiA1MSAyOCAz
-NyAzMiA1MQo1MSA0NiA1MSA3NCAyOCA1MSAyOCAyOCA1MSA0NiAzMiA0MiA1MSAzNyA1MSA0
-MiA3WzU1CjU1IDgzIDY1IDY1IDU1IDUxIDYwIDY5IDUxIDY5IDY5IDgzIDUxIDY1IDMyIDMy
-IDY5IDY5CjQ2IDUxIDY5IDYwIDU1IDY1IDFbMzcgNFsyMSA0MiA0MiA0MiA0MiA0MiA0MiA0
-MiA0MiA0Mgo0MiAyNSAyMSAxWzIxIDJbMjggMjggMjMgMzZbNTEgMlt7IFRlWEJhc2UxRW5j
-b2RpbmcgUmVFbmNvZGVGb250IH03MQo4My4zMzMzMzcgL1BhbGF0aW5vLUJvbGQgcmYgL0Z0
-IDEzNFs1MyA1NyA4NSA1MyA2MSA0NAo0NCA0NCAxWzY0IDYxIDYzIDk1IDMxIDYwIDFbMzEg
-NjMgNjQgNDEgNTUgNjQgNDkgNjQgNTcKMTBbNjkgNjkgNjAgNTMgNjQgMVs2MiA3NCA3MSA5
-MyA1MyAxWzMyIDMyIDcyIDcxIDUwIDUzCjczIDY0IDY0IDcxIDdbNjAgNjAgNjAgNjAgNjAg
-NjAgNjAgNjAgNjAgNjAgNTUgMVszMyA0NVt7CiBUZVhCYXNlMUVuY29kaW5nIFJlRW5jb2Rl
-Rm9udCB9NTUgOTUuODMzMzM0IC9TdG9uZVNhbnMtQm9sZApyZiAvRnUgMTMzWzYyIDY1IDcw
-IDEwNCA2NSA3NSA1NCA1NCA1NCA3NyA3NyA3NCA3NyAxMTUKMzcgNzMgMVszNyA3NyA3NyA1
-MCA2NiA3NyA2MCA3OCA2OSA3WzgwIDg2IDEyNyA4NCA4NAo3MyA2NSA3OCAxWzc1IDkwIDg2
-IDExMyA2NSA4MiAzOCAzOCA4OCA4NyA2MCA2NSA4OCA3OAo3OCA4NiA2WzM3IDczIDczIDcz
-IDczIDczIDczIDczIDczIDczIDczIDY3IDM3IDQxIDM3CjRbMjggMzlbeyBUZVhCYXNlMUVu
-Y29kaW5nIFJlRW5jb2RlRm9udCB9NjUgMTE2LjY2NjY2OQovU3RvbmVTYW5zLUJvbGQgcmYg
-L0Z2IDEzNFs0MSA0MyA2NSA0MSA0NyAyOSAzMiAyOSA1MAo1MCA0OCA0OSA3NCAyMCA0MCAx
-WzIwIDQ5IDQ5IDI1IDQyIDQ5IDQwIDQ5IDQyIDhbNTQgNzcKNDkgNTcgNDYgNDMgNDYgNjYg
-NDUgNjYgNjUgNzcgNDAgNDkgMjMgMjIgNTggNjEgNDAgNDEKNjEgNTcgNDggNTEgNlsyNCA0
-OCA0OCA0OCA0OCA0OCA0OCA0OCA0OCA0OCA0OCAzMiAyNAoyOCAyNCAyWzI5IDI5IDE3IDM5
-W3sgVGVYQmFzZTFFbmNvZGluZyBSZUVuY29kZUZvbnQgfTY2CjgzLjMzMzMzNyAvU3RvbmVT
-YW5zIHJmIC9GdyA4MlsyOCAyMFsyOCA4MyA0MiAxWzQyIDQyCjIyWzUwIDFbNDIgNDYgNDMg
-NjkgNDcgNTAgMjcgMzUgMzMgNDYgNTAgNDUgNDggNzMgMjQKNDYgMTkgMjQgNDggNDYgMjgg
-NDAgNTEgMzcgNDYgNDIgMjMgNDIgMVsyOCAxWzI4IDU1IDU1CjU1IDgzIDYwIDY1IDUxIDQ0
-IDU1IDY1IDUwIDY1IDY5IDc5IDUxIDYwIDI4IDI4IDY5IDYzCjQ2IDUxIDY0IDU5IDUxIDY1
-IDVbMjEgMjEgNDIgNDIgNDIgNDIgNDIgNDIgNDIgNDIgNDIKNDIgNTAgMjEgMVsyMSA1MCAz
-MiAyOCAyOCAyMyA1WzIzIDI5WzUwIDUwIDJbewogVGVYQmFzZTFFbmNvZGluZyBSZUVuY29k
-ZUZvbnQgfTg2IDgzLjMzMzMzNyAvUGFsYXRpbm8tUm9tYW4KcmYgL0Z4IDE3M1szMyAyNFsy
-NSAyNSAyNSAyNSAyNSAyNSAyNSAyNSAyNSAyNSA0OFt7CiBUZVhCYXNlMUVuY29kaW5nIFJl
-RW5jb2RlRm9udCB9MTEgNTAuMDAwMDAxIC9QYWxhdGluby1Sb21hbgpyZiAvRnkgODJbMzIg
-NTBbNDIgNDggNDggNjkgNDggNTMgMzIgMzcgMzcgNDQgNDggNDIgNTMKNzQgMjcgNDIgMjcg
-MjcgNDggNDggMjcgMzcgNDggMzkgNDQgNDIgOFs2OSA5MCA2OSA3NAo1OCA1MyA2NCA3NCA1
-OCA3NCA3NCA5MCA1MyA2NCAxWzMyIDc0IDY5IDUzIDU4IDc0IDY0CjU4IDY5IDZbMjQgM1s0
-OCAxWzQ4IDFbNDggNDggMVsyOCAyNCAxWzI0IDU4IDFbMzIgMzIKMjcgNzQgMzVbNTAgMlt7
-IFRlWEJhc2UxRW5jb2RpbmcgUmVFbmNvZGVGb250IH02NCA5NS44MzMzMzQKL1BhbGF0aW5v
-LUl0YWxpYyByZiAvRnogMTM1WzUwIDFbNDcgMTJbMjMgMTA1W3sKIFRlWEJhc2UxRW5jb2Rp
-bmcgUmVFbmNvZGVGb250IH0zIDk1LjgzMzMzNCAvU3RvbmVTYW5zCnJmIC9GQSA4MlszMiAy
-MFszMiA5NSA0OCA1OCA0OCA0OCAyNFs0OCA1MyA0OSA4MCA1NCA1OAozMSA0MCAzOCA1MyA1
-NyA1MiA1NiA4NCAyOCA1MyAyMiAyOCA1NiA1MyAzMiA0NiA1OCA0Mgo1MyA0OCAxWzQ4IDFb
-MzIgNTggMzIgNjQgNjQgNjQgOTUgNjkgNzQgNTkgNTAgNjQgNzUgNTgKNzUgNzkgOTAgNTgg
-NjkgMzIgMzIgNzkgNzMgNTMgNTggNzQgNjggNTggNzQgNzEgNDIgM1syNAoyNCA0OCA0OCA0
-OCA0OCA0OCA0OCA0OCA0OCA0OCA0OCA1OCAyNCAxWzI0IDFbMzcgMzIgMzIKMjcgNzQgNFsy
-NyAyOVs1OCA1OCAyW3sgVGVYQmFzZTFFbmNvZGluZyBSZUVuY29kZUZvbnQgfTg4Cjk1Ljgz
-MzMzNCAvUGFsYXRpbm8tUm9tYW4gcmYgL0ZCIDEzNFsxNDkgMTQ5IDJbMTY2IDEwMAoxMTYg
-MTE2IDFbMTQ5IDEzMyAxNjYgMVs4MyAyWzgzIDE0OSAxNDkgODMgMTE2IDE0OSAxMjIKMTM4
-IDEzMyAxMVsyMzMgMTgzIDE2NiAyWzE4MyAyMzMgMjMzIDFbMTY2IDJbMTAwIDFbMjE2CjJb
-MjMzIDE5OSAxODMgMjE2IDE3Wzg4IDQ3W3sgVGVYQmFzZTFFbmNvZGluZyBSZUVuY29kZUZv
-bnQgfTMzCjMwMC4wMDAwMDAgL1BhbGF0aW5vLUl0YWxpYyByZiAvRkMgMTQxWzQyIDJbNDgg
-MlszMCAyWzMwCjNbNDIgM1s0OCAxM1s2MCAxMVs3OCAyWzg0IDIxWzI3IDQ2W3sgVGVYQmFz
-ZTFFbmNvZGluZyBSZUVuY29kZUZvbnQgfTEwCjEwOC4zMzMzMzEgL1BhbGF0aW5vLUl0YWxp
-YyByZiAvRkQgODJbMzYgMjFbMTA4IDI5WzYwCjU2IDkwIDYxIDY1IDM1IDQ2IDQzIDFbNjUg
-NTkgNjMgOTUgMzEgNjAgMVszMSA2MyA2MCAzNgo1MiA2NiA0OCA2MCA1NCAxOVsxMDIgMlsz
-NiAzNiAxWzgyIDFbNjYgMjJbMjcgMVsyNyA0NFt7CiAuMTY3IFNsYW50Rm9udCBUZVhCYXNl
-MUVuY29kaW5nIFJlRW5jb2RlRm9udCB9MzIgMTA4LjMzMzMzMQovUGFsYXRpbm8tUm9tYW4g
-cmYgL0ZFIDE3MVsxMTIgODRbeyBUZVhCYXNlMUVuY29kaW5nIFJlRW5jb2RlRm9udCB9MQox
-ODMuMzMzMzMxIC9QYWxhdGluby1JdGFsaWMgcmYgL0ZGIDEzOVsyNCAzMiAzMCAxWzQ1CjFb
-NDMgMVsyMiAyWzIyIDFbNDIgMzJbNDIgNFs1OCA3WzM3IDM3IDZbMzcgNFsxOSA0NFt7CiAu
-MTY3IFNsYW50Rm9udCBUZVhCYXNlMUVuY29kaW5nIFJlRW5jb2RlRm9udCB9MTQgNzUuMDAw
-MDAwCi9QYWxhdGluby1Sb21hbiByZiAvRkcgMSAxNCBkZjwwMDAwMDAwM0ZGQzAwMDAwMDAw
-MDAwMDAzRkZGRkMwMDAwMDAwMDAwCjAxRkZGRkZGODAwMDAwMDAwMDA3RkZGRkZGRTAwMDAw
-MDAwMDFGRkUwMDdGRjgwMDAwMDAwMDdGRTAwMDA3RkUwMDAwMDAwMApGRjAwMDAwMEZGMDAw
-MDAwMDNGQzAwMDAwMDNGQzAwMDAwMDdGMDAwMDAwMDBGRTAwMDAwMEZDMDAwMDAwMDAzRjAw
-MDAwMUYKODAwMDAwMDAwMUY4MDAwMDNGMDAwMDAwMDAwMEZDMDAwMDdFMDAwMDAwMDAwMDdF
-MDAwMEZDMDAwMDAwMDAwMDNGMDAwMEY4CjAwMDAwMDAwMDAxRjAwMDFGMDAwMDAwMDAwMDAw
-RjgwMDNGMDAwMDAwMDAwMDAwRkMwMDNFMDAwMDAwMDAwMDAwN0MwMDdDMAowMDAwMDAwMDAw
-MDNFMDBGQzAwMDAwMDAwMDAwMDNGMDBGODAwMDAwMDAwMDAwMDFGMDFGMDAwMDAwMDAwMDAw
-MDBGODFGMDAKMDAwMDAwMDAwMDAwRjgxRTAwMDAwMDAwMDAwMDAwNzgzRTAwMDAwMDAwMDAw
-MDAwN0MzRTAwMDAwMDAwMDAwMDAwN0MzQzAwCjAwMDAwMDAwMDAwMDNDN0MwMDAwMDAwMDAw
-MDAwMDNFN0MwMDAwMDAwMDAwMDAwMDNFNzgwMDAwMDAwMDAwMDAwMDFFNzgwMAowMDAwMDAw
-MDAwMDAxRTc4MDAwMDAwMDAwMDAwMDAxRUY4MDAwMDAwMDAwMDAwMDAxRkY4MDAwMDAwMDAw
-MDAwMDAxRkYwMDAKMDAwMDAwMDAwMDAwMEZGMDAwMDAwMDAwMDAwMDAwMEZGMDAwMDAwMDAw
-MDAwMDAwMEZGMDAwMDAwMDAwMDAwMDAwMEZGMDAwCjAwMDAwMDAwMDAwMDBGRjAwMDAwMDAw
-MDAwMDAwMDBGRjAwMDAwMDAwMDAwMDAwMDBGRjAwMDAwMDAwMDAwMDAwMDBGRjAwMAowMDAw
-MDAwMDAwMDAwRkYwMDAwMDAwMDAwMDAwMDAwRkY4MDAwMDAwMDAwMDAwMDAxRkY4MDAwMDAw
-MDAwMDAwMDAxRjc4MDAKMDAwMDAwMDAwMDAwMUU3ODAwMDAwMDAwMDAwMDAwMUU3ODAwMDAw
-MDAwMDAwMDAwMUU3QzAwMDAwMDAwMDAwMDAwM0U3QzAwCjAwMDAwMDAwMDAwMDNFM0MwMDAw
-MDAwMDAwMDAwMDNDM0UwMDAwMDAwMDAwMDAwMDdDM0UwMDAwMDAwMDAwMDAwMDdDMUUwMAow
-MDAwMDAwMDAwMDA3ODFGMDAwMDAwMDAwMDAwMDBGODFGMDAwMDAwMDAwMDAwMDBGODBGODAw
-MDAwMDAwMDAwMDFGMDBGQzAKMDAwMDAwMDAwMDAzRjAwN0MwMDAwMDAwMDAwMDAzRTAwM0Uw
-MDAwMDAwMDAwMDA3QzAwM0YwMDAwMDAwMDAwMDBGQzAwMUYwCjAwMDAwMDAwMDAwRjgwMDBG
-ODAwMDAwMDAwMDAxRjAwMDBGQzAwMDAwMDAwMDAzRjAwMDA3RTAwMDAwMDAwMDA3RTAwMDAz
-RgowMDAwMDAwMDAwRkMwMDAwMUY4MDAwMDAwMDAxRjgwMDAwMEZDMDAwMDAwMDAzRjAwMDAw
-MDdGMDAwMDAwMDBGRTAwMDAwMDMKRkMwMDAwMDAzRkMwMDAwMDAwRkYwMDAwMDBGRjAwMDAw
-MDAwN0ZFMDAwMDdGRTAwMDAwMDAwMUZGRTAwN0ZGODAwMDAwMDAwCjA3RkZGRkZGRTAwMDAw
-MDAwMDAxRkZGRkZGODAwMDAwMDAwMDAwM0ZGRkZDMDAwMDAwMDAwMDAwMDNGRkMwMDAwMDAw
-NDg0RQo3QkJCNTM+MTMgRCBFIC9GSCA4MlsyNSA1MVszNyAzWzQyIDI1IDI5IDI5IDJbMzMg
-NDIgMVsyMQoyWzIxIDFbMzcgMjEgMjkgMVszMCAzNSAzMyAxNls0NiAzWzQyIDdbNTggNTAg
-NjdbewogVGVYQmFzZTFFbmNvZGluZyBSZUVuY29kZUZvbnQgfTIwIDc1LjAwMDAwMCAvUGFs
-YXRpbm8tSXRhbGljCnJmIC9GSSA4MlsyNSAyMVs3NSAzNyAyN1szNyA0MiAzOSA2MiA0MiA0
-NSAyNCAzMiAzMCA0Mgo0NSA0MSA0MyA2NiAyMiA0MiAxNyAyMiA0MyA0MiAyNSAzNiA0NiAz
-MyA0MSAzNyA2WzUwCjUwIDUwIDc1IDU0IDU4IDQ2IDM5IDUwIDU5IDQ1IDU5IDYyIDcxIDQ2
-IDU0IDI1IDI1IDYyCjU3IDQyIDQ2IDU4IDUzIDQ2IDU4IDZbMTkgMzcgMzcgMzcgMzcgMzcg
-MzcgMzcgMzcgMzcKMzcgNDUgMTkgMVsxOSA0WzIxIDU4IDJbMzcgMVsyMSAyOVs0NSA0NSAy
-W3sKIFRlWEJhc2UxRW5jb2RpbmcgUmVFbmNvZGVGb250IH03NSA3NS4wMDAwMDAgL1BhbGF0
-aW5vLVJvbWFuCnJmIC9GSiAxNDdbMjYgMTA4W3t9MSAzMy4zMzMzMzQgL1phcGZEaW5nYmF0
-cyByZiAvRksKMTM0WzM3IDM5IDU4IDFbNDMgMjYgMjkgMjYgMls0MyA0NCA2NyAxOCAzNiAx
-WzE4IDQ0IDQ0CjIyIDM4IDQ0IDM2IDFbMzcgMTJbNDIgMzkgNDIgMVs0MCA1OSAxWzY5IDRb
-NTMgMlszNyA1NQo1MSA0MyA0NiAyMFsyMSA0NFt7IFRlWEJhc2UxRW5jb2RpbmcgUmVFbmNv
-ZGVGb250IH0zMwo3NS4wMDAwMDAgL1N0b25lU2FucyByZiAvRkwgMTM0WzQ2IDUwIDJbNTMg
-MzggMzggMzggMVs1NQo1MyA1NSA4MiAyNyAyWzI3IDU1IDU1IDM1IDQ3IDU1IDQzIDU1IDQ5
-IDdbNTcgMVs5MSAyWzUyCjQ2IDJbNTQgNjUgNjIgMVs0NiAyWzI3IDFbNjIgNDMgNDYgNjMg
-NTUgNTUgNjIgN1s1MiA1Mgo1MiA1MiA1MiA1MiA1MiA1MiA1MiA1MiAxWzI2IDI5IDI2IDQ0
-W3sgVGVYQmFzZTFFbmNvZGluZyBSZUVuY29kZUZvbnQgfQo0OSA4My4zMzMzMzcgL1N0b25l
-U2Fucy1Cb2xkIHJmIC9GTSAxNDBbNjMgNTkgMls4MiA4NwoxWzQzIDgzIDFbNDMgODcgMls3
-MiAxWzY2IDFbNzUgOVsxNDkgMls5MiA2WzE0MSAxWzEwOAo1MCA0WzkxIDIyWzM3IDQ2W3sg
-VGVYQmFzZTFFbmNvZGluZyBSZUVuY29kZUZvbnQgfTE4CjE1MC4wMDAwMDAgL1BhbGF0aW5v
-LVJvbWFuIHJmIC9GTiAxMzVbMTc0IDFbMTk0IDIxMyAxMTYKM1syMTMgMTk0IDIxMyAzMTAg
-MTE2IDJbMTE2IDNbMTc0IDFbMTU1IDFbMTc0IDIwWzIxMwo3WzI5MCAyWzI3MSA2NVt7IFRl
-WEJhc2UxRW5jb2RpbmcgUmVFbmNvZGVGb250IH0xNiAzNDkuOTk5OTg4Ci9QYWxhdGluby1C
-b2xkIHJmIC9GTyAxMzlbODkgODkgMTE1W3t9MiAxMDAuMDAwMDAzIC9aYXBmRGluZ2JhdHMK
-cmYgL0ZQIDEzNVsxMzMgMVsxNDggMTYyIDg4IDNbMTYyIDE0OCAxNjIgMjM2IDg4IDJbODgK
-M1sxMzMgMVsxMTggMVsxMzMgMjBbMTYyIDdbMjIxIDJbMjA3IDY1W3sKIFRlWEJhc2UxRW5j
-b2RpbmcgUmVFbmNvZGVGb250IH0xNiAyNjYuNjY2NjY5IC9QYWxhdGluby1Cb2xkCnJmIC9G
-USAxMzlbNjcgNjcgMTE1W3t9MiA3NS4wMDAwMDAgL1phcGZEaW5nYmF0cyByZiBlbmQKJSVF
-bmRQcm9sb2cKJSVCZWdpblNldHVwCiUlRmVhdHVyZTogKlJlc29sdXRpb24gNjAwZHBpClRl
-WERpY3QgYmVnaW4KJSVQYXBlclNpemU6IExldHRlcgoKJSVFbmRTZXR1cAolJVBhZ2U6IDQ0
-NSAxCjQ0NSA0NjggYm9wIDAgMCBhIEBiZWdpbnNwZWNpYWwgQHNldHNwZWNpYWwKIGdzYXZl
-IC41MCBzZXRncmF5IG5ld3BhdGggMjc4IDEwIG1vdmV0byAwIDEwMCBybGluZXRvIDEzMiAw
-IHJsaW5ldG8KMCAtMTAwIHJsaW5ldG8gLTEzMiAwIHJsaW5ldG8gY2xvc2VwYXRoIGZpbGwg
-MSBzZXRncmF5IC9TdG9uZVNhbnMtQm9sZApmaW5kZm9udCAxMiBzY2FsZWZvbnQgc2V0Zm9u
-dCAyOTYgMTkgbW92ZXRvIDMgMCAoQ0hBUFRFUiAyNCkgYXNob3cKZ3Jlc3RvcmUKIApAZW5k
-c3BlY2lhbAoyOTkgMzU1IGEgRm4oUGFyc2luZyk4NCBiKENvbW1hbmQtKTI5OSA2NTQgeShM
-aW5lKWcoT3B0aW9ucykyOTkKMTU1NyB5IEZtKEZyb20pMjEgYih0aGUpZihmb3J0aGNvbWlu
-ZylpKGJvb2spZihlbnRpdGxlZClmKExpbnV4KWgKKEFwcGxpY2F0aW9uKWcoRGV2ZWxvcG1l
-bnQpZihieSkyOTkgMTY2OSB5KE1pY2hhZWwpMzUKYihLLiloKEpvaG5zb24paChhbmQpZShF
-cmlrKWgoVylsKC4pZyhUKS0xMSBiKHJvYW4sKTM5CmIoY29weXJpZ2h0KWQoXDI1MSlnKDE5
-OTgpZShieSlpKEFkZGlzb24pMjk5IDE3ODEgeShXKS03CmIoZXNsZXkpMzggYihMb25nbWFu
-LCk0MyBiKEluYy4sKWYodG8pZChiZSlmKHB1Ymxpc2hlZClpKGluKWUoQXByaWwsKWsKKDE5
-OTguKTc3IGIoQWxsKTM4IGIocmlnaHRzKWgocmVcMjU1KTI5OSAxODkzIHkoc2VydmVkLilj
-KFRoaXMpMjQKYihtYXRlcmlhbCllKGlzKWkobWFkZSlnKGF2YWlsYWJsZSlmKHdpdGgpZyh0
-aGUpaChwZXJtaXNzaW9uKWgob2YpZgoodGhlKWYocHViXDI1NSkyOTkgMjAwNSB5KGxpc2hl
-ciktNSBiKC4pMzQgYihUaGUpMjEgYihwdWJsaXNoZXIpNQpiKCcpLTUgYihzKTIzIGIocGVy
-bWlzc2lvbilnKGlzKWcocmVxdWlyZWQpZihmb3IpaChyZXByb2R1Y3Rpb24sKWcKKHN0b3Jh
-Z2UsKTI5OSAyMTE3IHkob3IpaCh0cmFuc21pdHRhbClmKG9mKWgodGhpcylnKG1hdGVyaWFs
-LikyOTkKMjMyOSB5KEZvcilnKG1vcmUpZyhpbmZvcm1hdGlvbiwpZyhzZWUpZihodHRwOi8p
-LTE0IGIoL3d3dyktOQpiKC5hd2wuY29tL2NzZW5nL2Jvb2tzL2xhZC8uKTI5OSAyNTQxIHkg
-RkEoTW9zdCk0MSBiKExpbnV4KWUocHIpbgoob2dyYW1zKWgoYWxsb3cpZih0aGUpZyh1c2Vy
-KWcodG8paChzcGVjaWZ5KWgoY29tbWFuZFwyNTVsaW5lKWUKKG9wdGlvbnMuKTI5OSAyNjUz
-IHkoU3VjaCkyMyBiKG9wdGlvbnMpaChwZXJmb3JtKWcoYSlmKHdpZGUpZyh2YXJpZXR5KWcK
-KG9mKWcoZnVuY3Rpb25zKWcoYnV0KWcoYXIpbihlKWcoZmFpcmx5KWYodW5pZm9ybSloKGlu
-KTI5OQoyNzY1IHkodGhlaXIpMzEgYihzeW50YXguKTYwIGIgRm0oU2hvcnQpMzMgYihvcHRp
-b25zKWcKRkEoY29uc2lzdClnKG9mKWYoYSlnIEZyKC0paCBGQShjaGFyYWN0ZXIpZShmb2xs
-b3dlZCloKGJ5KWcoYSlnKHNpbmdsZSkKMjk5IDI4NzcgeShhbHBoYW51bWVyaWMpMjUgYihj
-aGFyYWN0ZXIpLTcgYiguKTQzIGIgRm0oTG9uZykyOApiKG9wdGlvbnMpcCBGQSgsKWcoY29t
-bW9uKWcoaW4pZShHTlUpaCh1dGlsaXRpZXMsKWcoY29uc2lzdCkyOTkKMjk4OSB5KG9mKWYo
-dHdvKWcgRnIoLSlnIEZBKGNoYXJhY3RlcnMpZyhmb2xsb3dlZClnKGJ5KWcoYSlnKHN0cmlu
-ZylnCihtYWRlKWcodXApZyhvZilnKGxldHRlcnMsKWgobnVtYmVycywpZihhbmQpMjk5IDMx
-MDEKeShoeXBoZW5zLikzNCBiKEVpdGhlcikyNCBiKHR5cGUpZyhvZilnKG9wdGlvbilnKG1h
-eSloKGJlKWUoZm9sbG93ZWQpaAooYnkpZyhhbilmKGFyKW4oZ3VtZW50LikzNCBiKEEpMjQg
-YihzcGFjZSkyOTkgMzIxMyB5KHNlcGFyYXRlcykxOQpiKGEpZihzaG9ydCloKG9wdGlvbilm
-KGZyKW4ob20paChpdHMpZyhhciluKGd1bWVudHM7KWgoZWl0aGVyKWQoYSlpCihzcGFjZSln
-KG9yKWcoYW4pZiBGcig9KWcgRkEoc2VwYXJhdGVzKTI5OSAzMzI1IHkoYSkyMwpiKGxvbmcp
-aChvcHRpb24pZyhmciluKG9tKWcoYW4pZihhciluKGd1bWVudC4pMjk5IDM1MzcKeShUaGVy
-KW4oZSljKGFyKW4oZSloKG1hbnkpZyh3YXlzKWcob2YpaChwYXJzaW5nKWYoY29tbWFuZFwy
-NTVsaW5lKWcKKG9wdGlvbnMuKTM0IGIoVGhlKTE5IGIobW9zdClqKHBvcHVsYXIpMjk5IDM2
-NDkgeShtZXRob2QpayhpcylnCihwYXJzaW5nKWcodGhlKWcgRnIoYXJndilmIEZBKGFycmF5
-KWcoYnkpaChoYW5kLik0MCBiKFRoZSkyNQpiIEZyKGdldG9wdFwoXCkpZyBGQShhbmQpaCBG
-cihnZXRvcHRfbG9uZ1woXCkpMjk5IDM3NjEKeSBGQShsaWJyYXJ5KTQwIGIoZnVuY3Rpb25z
-KWgocHIpbihvdmlkZSlnKHNvbWUpaChhc3Npc3RhbmNlKWcoZm9yKWYKKG9wdGlvbiloKHBh
-cnNpbmcuKTg2IGIgRnIoZ2V0b3B0XChcKSkyOTkgMzg3MyB5IEZBKGlzKTM4CmIocHIpbihv
-dmlkZWQpaChieSlmKG1hbnkpZihVbml4KWgoaW1wbGVtZW50YXRpb25zLClqKGJ1dClkKGl0
-KWYKKHN1cHBvcnRzKWoob25seSlkKHNob3J0KTI5OSAzOTg1IHkob3B0aW9ucy4pZChUaGUp
-MjIKYiBGcihnZXRvcHRfbG9uZ1woXCkpZyBGQShmdW5jdGlvbilnKGlzKWgoYXZhaWxhYmxl
-KWUob24paChMaW51eCloKGFuZCkKZihhbGxvd3MpaChhdXRvXDI1NSkyOTkgNDA5NyB5KG1h
-dGVkKWgocGFyc2luZylnKG9mKWYoYm90aCloKHNob3J0KWcKKGFuZClmKGxvbmcpaChvcHRp
-b25zLikyOTkgNDMwOSB5KEEpMzMgYihsaWJyYXJ5KWYoY2FsbGVkKWgocG9wdCloCihleGlz
-dHMpZyhzcGVjaVwwMDJjYWxseSlmKGZvcilnKG9wdGlvbilnKHBhcnNpbmcuKTYyCmIoSXQp
-MzQgYihpbmNsdWRlcyllKGEpMjk5IDQ0MjEgeShudW1iZXIpMjIgYihvZilpKGFkdmFudGFn
-ZXMpZyhvdmVyKWYKKHRoZSlnIEZyKGdldG9wdFwoXCkpZyBGQShmdW5jdGlvbnMuKTMyMzIg
-NDY5OSB5IEZ0KDQ0NSlwCmVvcAolJVBhZ2U6IDQ0NiAyCjQ0NiA0NjkgYm9wIC0xODcgLTEx
-NiBhIEZ0KDQ0NikxMTggYiBGTChDaGFwdGVyKTI5IGIoMjQpODMKYiBGdihQYXJzaW5nKTIz
-IGIoQ29tbWFuZC1MaW5lKWYoT3B0aW9ucylwIC0xODcgLTc2IDM0MTMKNCB2IDEyOCA4MyBh
-IEZBKFwyMjUpMTAwIGIoSXQpMzMgYihkb2VzKWgobm90KWYobWFrZSloKHVzZSlmKG9mKWcK
-KGdsb2JhbClnKHZhcmlhYmxlcywpaCh3aGljaCllKGFsbG93cyloKGl0KWcodG8paChiZSlm
-KHVzZWQpMjg2CjE5NSB5KHdoZW4pMjIgYihtdWx0aXBsZSloKHBhc3NlcylqKGFyKW4oZSlk
-KG5lZWRlZClnKHRvKWgocGFyc2UpZwpGcihhcmd2KXAgRkEoLikxMjggNDA3IHkoXDIyNSkx
-MDAgYihJdCkyMiBiKGNhbiloKHBhcnNlKWYoYW4pZwooYXJiaXRyYXJ5KWYoYXJyYXkpZyhv
-ZilpIEZyKGFyZ3YpcCBGQShcMjU1c3R5bGUpZihlbGVtZW50cy4pMzMKYihUaGlzKTIyIGIo
-YWxsb3dzKWcocG9wdCkyODYgNTE5IHkodG8paShiZSlmKHVzZWQpaChmb3IpZyhwYXJzaW5n
-KWYKKGNvbW1hbmRcMjU1bGluZVwyNTVzdHlsZSloKHN0cmluZ3MpZyhmciluKG9tKWcoYW55
-KWYoc291ciluKGNlLikxMjgKNzMxIHkoXDIyNSkxMDAgYihJdCkzMCBiKHByKW4ob3ZpZGVz
-KWgoYSlmKHN0YW5kYXIpbihkKWcobWV0aG9kKWcob2YpZwoob3B0aW9uKWcoYWxpYXNpbmcu
-KTUyIGIoUHIpbihvZ3JhbXMpMzAgYih0aGF0KWcodXNlKTI4Ngo4NDMgeShwb3B0KWMoY2Fu
-KWYoZWFzaWx5KWcoYWxsb3cpZih1c2VycyloKHRvKWcoYWRkKWgobmV3KWUKKGNvbW1hbmRc
-MjU1bGluZSloKG9wdGlvbnMsKWgod2hpY2gpMjg2IDk1NSB5KGFyKW4oZSlrKGRlXDAwMm5l
-ZClnKGFzKWgKKGNvbWJpbmF0aW9ucylmKG9mKWgoYWxyKW4oZWFkeVwyNTVleGlzdGluZyll
-KG9wdGlvbnMuKTU1CmIoVGhpcykzMCBiKGFsbG93cykyODYgMTA2NyB5KHRoZSloKHVzZXIp
-aCh0byloKGRlXDAwMm5lKWUobmV3KS05CmIoLCkzMyBiKGNvbXBsZXgpaChiZWhhdmlvcnMp
-ZChvciloKGNoYW5nZSlmKHRoZSloKGRlZmF1bHQpZihiZVwyNTUpMjg2CjExNzkgeShoYXZp
-b3JzKTIzIGIob2YpaChleGlzdGluZylmKG9wdGlvbnMuKTExMSAxNDUzCnkoTGlrZSloIEZy
-KGdldG9wdF9sb25nXChcKSlwIEZBKCwpZSh0aGUpaShwb3B0KWgobGlicmFyeSlkKHN1cHBv
-cnRzKWoKKHNob3J0KWYoYW5kKWcobG9uZylmKHN0eWxlKWgob3B0aW9ucy4pMTExIDE2NjUg
-eShUaGUpMjkKYihwb3B0KWoobGlicmFyeSlkKGlzKWgoaGlnaGx5KWYocG9ydGFibGUpaChh
-bmQpZyhzaG91bGQpZyh3b3JrKWYob24paAooYW55KWcoUE9TSVgpZyhwbGF0XDI1NSkxMTEg
-MTc3NyB5KGZvcm0uKTY4IGIoVGhlKTM0CmIobGF0ZXN0KWgodmVyc2lvbilnKGlzKWcoYWx3
-YXlzKWcoYXZhaWxhYmxlKWUoZnIpbihvbSlpKGZ0cDovKS0xNApiKC9mdHAuciluKGVkaGF0
-LmNvbS8pMTExIDE4ODkgeShwdWIvciluKGVkaGF0L2NvZGUvcG9wdC8pMTExCjIxMDAgeShJ
-dCkzMyBiKG1heSlmKGJlKWcociluKGVkaXN0cmlidXRlZClmKHVuZGVyKWcoZWl0aGVyKWco
-dGhlKWgKKEdOVSlnKEdlbmVyYWwpZihQdWJsaWMpZyhMaWNlbnNlKWgob3IpMTExIDIyMTMg
-eSh0aGUpMjQKYihHTlUpZyhMaWJyYXJ5KWYoR2VuZXJhbClmKFB1YmxpYyloKExpY2Vuc2Us
-KWgoYXQpZih0aGUpaChkaXN0cmlidXRvcikKNyBiKCdzKTIzIGIoZGlzY3IpbihldGlvbi4p
-LTE4NyAyNTQxIHkgRmsoMjQuMSkxMzEgYihCYXNpYyk0MApiKHBvcHQpaihVc2FnZSlwIC0x
-ODcgMjYyNiAzNDEzIDUgdiAxMTEgMjg4OCBhIEZ1KDI0LjEuMSk1OQpiKFRoZSkzOSBiKE9w
-dGlvbiloKFRhYmxlKTExMSAzMDk5IHkgRkEoQXBwbGljYXRpb25zKWQocHIpbihvdmlkZSlm
-Cihwb3B0KWcod2l0aClmKGluZm9ybWF0aW9uKWYob24paCh0aGVpcilmKGNvbW1hbmRcMjU1
-bGluZSloKG9wXDI1NSkxMTEKMzIxMSB5KHRpb25zKTI0IGIodGhyKW4ob3VnaClmKGFuKWco
-YXJyYXkpZyhvZiloIEZyKHN0cnVjdCk0MgpiKHBvcHRPcHRpb24pMjMgYiBGQShzdHIpbyh1
-Y3R1ciluKGVzLikxMTEgMzQxNyB5IEZxKCNpbmNsdWRlKTM1CmIoPHBvcHQuaD4pMTExIDM2
-MzMgeShzdHJ1Y3QpaChwb3B0T3B0aW9uKWUoeykyNTggMzc0MQp5KGNvbnN0KWkoY2hhciln
-KCopZyhsb25nTmFtZTspZigvKiloKG1heSlnKGJlKWgoTlVMTCllKCovKTI1OAozODQ5IHko
-Y2hhciloKHNob3J0TmFtZTspMjkyIGIoLyopMzYgYihtYXkpZyhiZSloKCdcXDAnKWUoKi8p
-MjU4CjM5NTcgeShpbnQpaChhcmdJbmZvOykyNTggNDA2NSB5KHZvaWQpZygqKWgoYXJnOyk0
-NDAKYigvKikzNiBiKGRlcGVuZHMpZihvbilpKGFyZ0luZm8pZSgqLykyNTggNDE3MiB5KGlu
-dCloKHZhbDspNTUxCmIoLyopMzYgYigwKWgobWVhbnMpZShkbylpKG5vdClmKHJldHVybiwp
-ZihqdXN0KWgodXBkYXRlKWYoZmxhZyloKCovKQoxMTEgNDI4MCB5KH07KXAgZW9wCiUlUGFn
-ZTogNDQ3IDMKNDQ3IDQ3MCBib3AgMjIzNyAtMTE2IGEgRnYoMjQuMSk4MiBiKEJhc2ljKTIz
-IGIocG9wdClmKFVzYWdlKTExOQpiIEZ0KDQ0NylwIDAgLTc2IDM0MTMgNCB2IDQ0NiA3MSBh
-IEZMKFRhYmxlKTI3IGIoMjQuMSk4NApiIEZ2KHBvcHQpMjIgYihBcmd1bWVudClpKFR5cGVz
-KXAgNDQ2IDEwMyAyODIwIDQgdiA0NDYKMTIwIDQgMTcgdiAxMTY3IDEyMCBWIDI3NzUgMTIw
-IFYgMzI2MiAxMjAgViA0NDYgMjE5IDQKMTAwIHYgNTMyIDE5MCBhIEZzKFYpLTkgYihhbHVl
-KXAgMTE2NyAyMTkgViA1MDIgdyhEZXNjcmlwdGlvbilwCjI3NzUgMjE5IFYgMTE2MCB3IEZx
-KGFyZykyMCBiIEZzKFQpLTcgYih5cGUpcCAzMjYyIDIxOQpWIDQ0NiAyMzYgNCAxNyB2IDEx
-NjcgMjM2IFYgMjc3NSAyMzYgViAzMjYyIDIzNiBWIDQ0NgoyMzkgMjgyMCA0IHYgNDQ2IDI0
-NiA0IDcgdiAxMTY3IDI0NiBWIDI3NzUgMjQ2IFYgMzI2MgoyNDYgViA0NDYgMjQ5IDI4MjAg
-NCB2IDQ0NiAyNjYgNCAxNyB2IDExNjcgMjY2IFYgMjc3NQoyNjYgViAzMjYyIDI2NiBWIDQ0
-NiAzNjUgNCAxMDAgdiA1MzIgMzM2IGEgRnEoUE9QVF9BUkdfTk9ORSlwCjExNjcgMzY1IFYg
-MjQwIHcgRncoTm8pMjEgYihhcilvKGd1bWVudClmKGlzKWgoZXhwZWN0ZWQpcAoyNzc1IDM2
-NSBWIDY4OCB3IEZxKGludClwIDMyNjIgMzY1IFYgNDQ2IDQ2NSBWIDUzMiA0MzYKYShQT1BU
-X0FSR19TVFJJTkcpcCAxMTY3IDQ2NSBWIDE2NiB3IEZ3KE5vKWcodHlwZSlnKGNoZWNraW5n
-KWcoc2hvdWxkKWgKKGJlKWUocGVyZm9ybWVkKXAgMjc3NSA0NjUgViAxNjkgdyBGcShjaGFy
-KTM1IGIoKilwIDMyNjIKNDY1IFYgNDQ2IDU2NSBWIDUzMiA1MzUgYShQT1BUX0FSR19JTlQp
-cCAxMTY3IDU2NSBWIDI3Nwp3IEZ3KEFuKTIxIGIoaW50ZWdlcilmKGFyKW8oZ3VtZW50KWgo
-aXMpZyhleHBlY3RlZClwCjI3NzUgNTY1IFYgNDEwIHcgRnEoaW50KXAgMzI2MiA1NjUgViA0
-NDYgNjY0IFYgNTMyIDYzNQphKFBPUFRfQVJHX0xPTkcpcCAxMTY3IDY2NCBWIDI0MCB3IEZ3
-KEEpZihsb25nKWkoaW50ZWdlcilmKGlzKWcKKGV4cGVjdGVkKXAgMjc3NSA2NjQgViA2NTIg
-dyBGcShsb25nKXAgMzI2MiA2NjQgViA0NDYKNjgxIDQgMTcgdiAxMTY3IDY4MSBWIDI3NzUg
-NjgxIFYgMzI2MiA2ODEgViA0NDYgNjg0IDI4MjAKNCB2IDI5OSA5MzMgYSBGQShFYWNoKTM0
-IGIobWVtYmVyKWYob2YpZyh0aGUpZyh0YWJsZSlnKGRlXDAwMm5lcylnKGEpaAooc2luZ2xl
-KWYob3B0aW9uKWcodGhhdClnKG1heSloKGJlKWYocGFzc2VkKWkodG8pMjk5CjEwNDUgeSh0
-aGUpMjkgYihwciluKG9ncmFtLik1MCBiKExvbmcpMzAgYihhbmQpZShzaG9ydClpKG9wdGlv
-bnMpZihhciluCihlKWcoY29uc2lkZXIpbihlZCloKGEpZihzaW5nbGUpZihvcHRpb24paSh0
-aGF0KTI5OSAxMTU3CnkobWF5KWsob2NjdXIpZyhpbilnKHR3bylnKGRpZiluKGZlciluKGVu
-dClmKGZvcm1zLik2NQpiKFRoZSkzMyBiKFwwMDJyc3QpaCh0d28pZyhtZW1iZXJzLClpIEZy
-KGxvbmdOYW1lKWUgRkEoYW5kKTI5OQoxMjY5IHkgRnIoc2hvcnROYW1lKXAgRkEoLCkyNSBi
-KGRlXDAwMm5lKWcodGhlKWcobmFtZXMpaChvZilmKHRoZSlnCihvcHRpb247KWkodGhlKWUo
-XDAwMnJzdCloKGlzKWcoYSlnKGxvbmcpZihuYW1lLClnKGFuZCloKHRoZSkyOTkKMTM4MSB5
-KGxhdHRlcilkKGlzKWgoYSlnKHNpbmdsZSlmKGNoYXJhY3RlciktNyBiKC4pMjk5CjE1OTMg
-eShUaGUpMjEgYiBGcihhcmdJbmZvKWcgRkEobWVtYmVyKWgodGVsbHMpZyhwb3B0KWgod2hh
-dCllKHR5cGUpaAoob2YpZyhhciluKGd1bWVudClnKGlzKWcoZXhwZWN0ZWQpaChhZnRlcill
-KHRoZSkyOTkgMTcwNQp5KGFyKW4oZ3VtZW50LikzMyBiKElmKTIzIGIobm8pZyhvcHRpb24p
-ZyhpcylnKGV4cGVjdGVkLCloCkZyKFBPUFRfQVJHX05PTkUpZCBGQShzaG91bGQpaShiZSln
-KHVzZWQuKTM0IGIoVGhlKTIyCmIociluKGVzdCkyOTkgMTgxNyB5KG9mKWkodGhlKWYodmFs
-aWQpZyh2YWx1ZXMpaChhciluKGUpZihzdW1tYXJpemVkKWcKKGluKWgoVCktOSBiKGFibGUp
-MjIgYigyNC4xLikyMzU1IDE3ODMgeSBGeCgxKTI5OSAyMDI5CnkgRkEoVGhlKWoobmV4dCln
-KGVsZW1lbnQsKWcgRnIoYXJnKXAgRkEoLCloKGFsbG93cylmKHBvcHQpaSh0bylmCihhdXRv
-bWF0aWNhbGx5KWYodXBkYXRlKWgocHIpbihvZ3JhbSlnKHZhcmlcMjU1KTI5OSAyMTQxCnko
-YWJsZXMpMjEgYih3aGVuKWcodGhlKWcob3B0aW9uKWgoaXMpZyh1c2VkLikzNCBiKElmKTIy
-CmIgRnIoYXJnKWYgRkEoaXMpaCBGcihOVUxMKXAgRkEoLClnKGl0KWYoaXMpaShpZ25vcilu
-KGVkKWUoYW5kKWgocG9wdClnCih0YWtlcyloKG5vKTI5OSAyMjUzIHkoc3BlY2lhbCkxOCBi
-KGFjdGlvbi4pMzMgYihPdGhlcndpc2UsKTE4CmIoaXQpZyhzaG91bGQpZyhwb2ludCloKHRv
-KWYoYSlnKHZhcmlhYmxlKWYob2YpaCh0aGUpZyh0eXBlKWcKKGluZGljYXRlZCkyOTkgMjM2
-NSB5KGluKTIzIGIodGhlKWcocmlnaHRcMjU1bW9zdCloKGNvbHVtbilnKG9mKWcoVCktOQpi
-KGFibGUpMjIgYigyNC4xLikyOTkgMjU3NyB5KElmKTQyIGIodGhlKWYob3B0aW9uKWcodGFr
-ZXMpaChubylnKGFyKW4KKGd1bWVudCllKFwoKXAgRnIoYXJnSW5mbyloIEZBKGlzKWggRnIo
-UE9QVF9BUkdfTk9ORSlwCkZBKFwpLCllKHRoZSloKHZhcmlhYmxlKTI5OSAyNjg5IHkocG9p
-bnRlZCkyMSBiKHRvKWcoYnkpZgpGcihhcmcpaCBGQShpcylnKHNldClnKHRvKWcoMSlmKHdo
-ZW4pZih0aGUpaChvcHRpb24paChpcylnKHVzZWQuKTM0CmIoSWYpMjAgYih0aGUpZyhvcHRp
-b24paChkb2VzKWgodGFrZSkyOTkgMjgwMSB5KGFuKTE2CmIoYXIpbihndW1lbnQsKWkodGhl
-KWYodmFyaWFibGUpZSh0aGF0KWkgRnIoYXJnKWcgRkEocG9pbnRzKWgodG8pZyhpcylmCih1
-cGRhdGVkKWgodG8pZihyKW4oZVwwMDNlY3QpZyh0aGUpZyh2YWx1ZSlmKG9mKTI5OSAyOTEz
-CnkodGhlKTIzIGIoYXIpbihndW1lbnQuKTM0IGIoQW55KTI0IGIoc3RyaW5nKWYoaXMpaShh
-Y2NlcHRhYmxlKWUoZm9yKWgKRnIoUE9QVF9BUkdfU1RSSU5HKWUgRkEoYXIpbihndW1lbnRz
-LClpKGJ1dCkyOTkgMzAyNQp5IEZyKFBPUFRfQVJHX0lOVCkxOSBiIEZBKGFuZCloIEZyKFBP
-UFRfQVJHX0xPTkcpZSBGQShhciluKGd1bWVudHMpaQooYXIpbihlKWcoY29udmVydGVkKWco
-dG8pZyh0aGUpZyhhcHByKW4ob3ByaWF0ZSkyOTkgMzEzNwp5KHR5cGUsKWsoYW5kKWYoYW4p
-aChlcnIpbihvcilmKGlzKWgociluKGV0dXJuZWQpZihpZilnKHRoZSlnCihjb252ZXJzaW9u
-KWgoZmFpbHMuKTI5OSAzMzQ5IHkoVGhlKTMzIGIoXDAwMm5hbClnKG9wdGlvbiwpMzgKYiBG
-cih2YWwpcCBGQSgsKWUoaXMpZih0aGUpZih2YWx1ZSlmKHBvcHQncylqKHBhcnNpbmcpZShm
-dW5jdGlvbilmCihzaG91bGQpaShyKW4oZXR1cm4pMjk5IDM0NjEgeSh3aGVuKTI2IGIodGhl
-KWgob3B0aW9uKWgoaXMpZyhlbmNvdW50ZXIpCm4oZWQuKTQ1IGIoSWYpMjcgYihpdCloKGlz
-KWcoMCwpZyh0aGUpZihwYXJzaW5nKWgoZnVuY3Rpb24pZihwYXJzZXMpaAoodGhlKTI5OSAz
-NTczIHkobmV4dCkyMyBiKGNvbW1hbmRcMjU1bGluZSloKGFyKW4oZ3VtZW50KWYocmF0aGVy
-KWYKKHRoYW4paChyKW4oZXR1cm4uKTI5OSAzNzg1IHkoVGhlKWMoXDAwMm5hbClnKHN0cilv
-KHVjdHVyKW4oZSloKGluKWYKKHRoZSloKHRhYmxlKWYoc2hvdWxkKWgoaGF2ZSlmKGFsbCln
-KHRoZSloKHBvaW50ZXIpZyh2YWx1ZXMpZihzZXQpaCh0bykKaCBGcihOVUxMKTI5OSAzODk3
-IHkgRkEoYW5kKWkoYWxsKWgodGhlKWYoYXJpdGhtZXRpYylnKHZhbHVlcylnKHNldCloCih0
-bylnKDAsKWcobWFya2luZylmKHRoZSlnKGVuZCloKG9mKWcodGhlKWYodGFibGUuKXAKMjk5
-IDQyMzQgODk3IDUgdiAyOTkgNDMxNSBhIEZ3KDEuKTI5IGIgRnEoZ2V0b3B0XChcKSlnCkZ3
-KGNvbm5vaXNzZXVycylqKHdpbGwpZihub3RlKWcodGhhdClmIEZxKGFyZ0luZm8pZiBGdyhp
-cylpKHRoZSlmKG9ubHkpCmkoXDAwMmVsZCllKG9mKWggRnEoc3RydWN0KTQ2IGIocG9wdE9w
-dGlvbikzOTEgNDQwNyB5CkZ3KHRoYXQpMjkgYihpcylnKG5vdClnKGRpcilvKGVjdGx5KWYo
-YW5hbG9nb3VzKWkodG8pZihhKWYoXDAwMmVsZCloCihpbilnKHRoZSlnIEZxKGdldG9wdF9s
-b25nXChcKSlkIEZ3KGFyKW8oZ3VtZW50KWkodGFibGUuKTUzCmIoVGhlKTM5MSA0NDk4IHko
-c2ltaWxhcml0eSkyMiBiKGJldHdlZW4pZSh0aGUpaCh0d28pZyhhbGxvd3MpaChmb3IpZQoo
-ZWFzeSloKHRyYW5zaXRpb25zKWgoZnIpbyhvbSllIEZxKGdldG9wdF9sb25nXChcKSllCkZ3
-KHRvKWoocG9wdC4pcCBlb3AKJSVQYWdlOiA0NDggNAo0NDggNDcxIGJvcCAtMTg3IC0xMTYg
-YSBGdCg0NDgpMTE4IGIgRkwoQ2hhcHRlcikyOSBiKDI0KTgzCmIgRnYoUGFyc2luZykyMyBi
-KENvbW1hbmQtTGluZSlmKE9wdGlvbnMpcCAtMTg3IC03NiAzNDEzCjQgdiAxMTEgODUgYSBG
-dSgyNC4xLjIpNTkgYihDcmVhdGluZykzOSBiKGEpZihDb250ZXh0KTExMQoyOTcgeSBGQShw
-b3B0KTMxIGIoY2FuKWYoaW50ZXJsZWF2ZSllKHRoZSloKHBhcnNpbmcpZyhvZiloKG11bHRp
-cGxlKWcKKGNvbW1hbmRcMjU1bGluZSlmKHNldHMuKTUzIGIoSXQpMzAgYihhbGxvd3MpMTEx
-IDQwOQp5KHRoaXMpZShieSlnKGtlZXBpbmcpZyhhbGwpZih0aGUpZyhzdGF0ZSlpKGluZm9y
-bWF0aW9uKWQoZm9yKWkoYSlnCihwYXJ0aWN1bGFyKWYoc2V0KWgob2YpZyhjb21tYW5kXDI1
-NSkxMTEgNTIxIHkobGluZSkyMgpiKGFyKW4oZ3VtZW50cyloKGluKWYoYSloIEZyKHBvcHRD
-b250ZXh0KWUgRkEoZGF0YSlpKHN0cilvKHVjdHVyKW4oZSwpZwooYW4pZihvcGFxdWUpaCh0
-eXBlKWcodGhhdClnKHNob3VsZCkxMTEgNjMzIHkobm90KWgoYmUpZihtb2RpXDAwMmVkKWkK
-KG91dHNpZGUpZih0aGUpZihwb3B0KWkobGlicmFyeSktMTEgYiguKTExMSA4NDUgeShOZXcp
-MjQKYihwb3B0KWgoY29udGV4dHMpZyhhciluKGUpZShjciluKGVhdGVkKWgoYnkpZyBGcihw
-b3B0R2V0Q29udGV4dFwoXCkpcApGQSguKTExMSAxMDUxIHkgRnEoI2luY2x1ZGUpMzUgYig8
-cG9wdC5oPikxMTEgMTI2NiB5KHBvcHRDb250ZXh0KWcKKHBvcHRHZXRDb250ZXh0XChjaGFy
-KWQoKilrKG5hbWUsKWcoaW50KWcoYXJnYywpZihjaGFyKWgoKiopaChhcmd2LCkKMTEwNCAx
-Mzc0IHkoc3RydWN0KWUocG9wdE9wdGlvbilnKCopaChvcHRpb25zLClmKGludCloKGZsYWdz
-XCk7KTExMQoxNTg2IHkgRkEoVGhlKTI2IGIoXDAwMnJzdCloKHBhcmFtZXRlciktNyBiKCwp
-MjYgYiBGcihuYW1lKXAKRkEoLCloKGlzKWcodXNlZClnKG9ubHkpZyhmb3IpZihhbGlhcylo
-KGhhbmRsaW5nKWUoXChkaXNjdXNzZWQpagoobGF0ZXJcKS4pMTExIDE2OTggeShJdCloKHNo
-b3VsZClmKGJlKWYodGhlKWgobmFtZSlmKG9mKWgodGhlKWcKKGFwcGxpY2F0aW9uKWcod2hv
-c2UpZihvcHRpb25zKWkoYXIpbihlKWUoYmVpbmcpZyhwYXJzZWQsKTExMQoxODEwIHkob3Ip
-ZShzaG91bGQpZihiZSlnIEZyKE5VTEwpZyBGQShpZilnKG5vKWcob3B0aW9uKWgoYWxpYXNp
-bmcpZQooaXMpaShkZXNpciluKGVkLikzNiBiKFRoZSkyNCBiKG5leHQpZyh0d28pZyhhcilu
-KGd1bWVudHMpMTExCjE5MjIgeShzcGVjaWZ5KWcodGhlKWYoY29tbWFuZFwyNTVsaW5lKWco
-YXIpbihndW1lbnRzKWcodG8paChwYXJzZS4pMzQKYihUaGVzZSkyMiBiKGFyKW4oZSloKGdl
-bmVyYWxseSlmKHBhc3NlZCkxMTEgMjAzNCB5KHRvKTM3CmIgRnIocG9wdEdldENvbnRleHRc
-KFwpKWUgRkEoZXhhY3RseSlpKGFzKWcodGhleSlmKHdlciluKGUpZyhwYXNzZWQpaQoodG8p
-Zih0aGUpZihwciluKG9ncmFtJ3MpaCBGcihtYWluXChcKSkxMTEgMjE0NiB5IEZBKGZ1bmN0
-aW9uLik1MApiKFRoZSkyOSBiIEZyKG9wdGlvbnMpZiBGQShwYXJhbWV0ZXIpaChwb2ludHMp
-aCh0bylnKHRoZSlmKHRhYmxlKWYob2YpaQooY29tbWFuZFwyNTVsaW5lKWUob3BcMjU1KTEx
-MSAyMjU5IHkodGlvbnMsKTMzIGIod2hpY2gpZCh3YXMpaAooZGVzY3JpYmVkKWgoaW4pZSh0
-aGUpaChwciluKGV2aW91cylnKHNlY3Rpb24uKTU2IGIoVGhlKTMwCmIoXDAwMm5hbClnKHBh
-cmFtZXRlciktNyBiKCwpMTExIDIzNzEgeSBGcihmbGFncylwIEZBKCwpMjEKYihpcylnKG5v
-dClnKGN1cnIpbihlbnRseSllKHVzZWQpaShidXQpZyhzaG91bGQpZihhbHdheXMpZyhiZSlo
-CihzcGVjaVwwMDJlZClnKGFzKWcoMClmKGZvciloKGNvbXBhdFwyNTUpMTExIDI0ODMgeShp
-YmlsaXR5KWkod2l0aClnCihmdXR1ciluKGUpZyh2ZXJzaW9ucyloKG9mKWcodGhlKWYocG9w
-dClpKGxpYnJhcnkpLTExCmIoLikxMTEgMjY5NCB5KEEpMjYgYiBGcihwb3B0Q29udGV4dClm
-IEZBKGtlZXBzKWgodHJhY2spZyhvZilnKHdoaWNoKWUKKG9wdGlvbnMpaihoYXZlKWQoYWxy
-KW4oZWFkeSloKGJlZW4pZyhwYXJzZWQpaChhbmQpMTExCjI4MDcgeSh3aGljaCloKHIpbihl
-bWFpbiwpaShhbW9uZylmKG90aGVyKWYodGhpbmdzLik0NwpiKElmKTI4IGIoYSlnKHByKW4o
-b2dyYW0pZyh3aXNoZXMpZyh0byloKHIpbihlc3RhcnQpZihvcHRpb24pMTExCjI5MTkgeShw
-ciluKG9jZXNzaW5nKTIzIGIob2YpZihhKWcoc2V0KWcob2YpZyhhciluKGd1bWVudHMsKWco
-aXQpZihjYW4pCmgociluKGVzZXQpZyh0aGUpZiBGcihwb3B0Q29udGV4dClnIEZBKGJ5KWgo
-cGFzc2luZylnKHRoZSkxMTEKMzAzMSB5KGNvbnRleHQpaihhcylmKHRoZSlmKHNvbGUpaChh
-ciluKGd1bWVudClmKHRvKWgKRnIocG9wdFJlc2V0Q29udGV4dFwoXCkpcCBGQSguKTExMSAz
-MjQyIHkoV2hlbilqKGFyKW4oZ3VtZW50KWcocHIpbgoob2Nlc3NpbmcpaChpcylnKGNvbXBs
-ZXRlLCloKHRoZSlkKHByKW4ob2Nlc3MpaihzaG91bGQpZihmciluKGVlKWUodGhlKQpoIEZy
-KHBvcHQtKTExMSAzMzU0IHkoQ29udGV4dCkyMiBiIEZBKGFzKWgoaXQpZihjb250YWlucylo
-KGR5bmFtaWNhbGx5KQpmKGFsbG9jYXRlZClnKGNvbXBvbmVudHMuKTM1IGIoVGhlKTIxIGIg
-RnIocG9wdEZyZWVDb24tKTExMQozNDY3IHkodGV4dFwoXCkpMzIgYiBGQShmdW5jdGlvbiln
-KHRha2VzKWgoYSlmIEZyKHBvcHRDb250ZXh0KWcKRkEoYXMpaChpdHMpZyhzb2xlKWcoYXIp
-bihndW1lbnQpZShhbmQpaShmciluKGVlcylmKHRoZSlnKHIpbihlXDI1NSkxMTEKMzU3OSB5
-KHNvdXIpbihjZXMpMjUgYih0aGUpZShjb250ZXh0KWkoaXMpZih1c2luZy4pMTExCjM3OTAg
-eShIZXIpbihlKWcoYXIpbihlKWYodGhlKWgocHIpbihvdG90eXBlcyloKG9mKWYoYm90aClm
-CkZyKHBvcHRSZXNldENvbnRleHRcKFwpKWYgRkEoYW5kKWkgRnIocG9wdEZyZWVDb250ZXh0
-XChcKSlwCkZBKC4pMTExIDM5OTYgeSBGcSgjaW5jbHVkZSkzNSBiKDxwb3B0Lmg+KTExMSA0
-MjEyIHkodm9pZCloCihwb3B0RnJlZUNvbnRleHRcKHBvcHRDb250ZXh0KTMxIGIoY29uXCk7
-KTExMSA0MzIwIHkodm9pZCkzNgpiKHBvcHRSZXNldENvbnRleHRcKHBvcHRDb250ZXh0KTMw
-IGIoY29uXCk7KXAgZW9wCiUlUGFnZTogNDQ5IDUKNDQ5IDQ3MiBib3AgMjIzNyAtMTE2IGEg
-RnYoMjQuMSk4MiBiKEJhc2ljKTIzIGIocG9wdClmKFVzYWdlKTExOQpiIEZ0KDQ0OSlwIDAg
-LTc2IDM0MTMgNCB2IDI5OSA4NSBhIEZ1KDI0LjEuMyk1OCBiKFBhcnNpbmcpMzkKYih0aGUp
-aChDb21tYW5kKWUoTGluZSkyOTkgMjk3IHkgRkEoQWZ0ZXIpMjYgYihhbilnKGFwcGxpY2F0
-aW9uKWgoaGFzKWcKKGNyKW4oZWF0ZWQpZihhKWggRnIocG9wdENvbnRleHQpcCBGQSgsKWYo
-aXQpaChtYXkpZyhiZWdpbillKHBhcnNpbmcpaQooYXIpbihndVwyNTUpMjk5IDQwOSB5KG1l
-bnRzLikzNCBiKFRoZSkyMyBiIEZyKHBvcHRHZXROZXh0T3B0XChcKSlmCkZBKHBlcmZvcm1z
-KWkodGhlKWcoYWN0dWFsKWYoYXIpbihndW1lbnQpZyhwYXJzaW5nLikyOTkKNjE1IHkgRnEo
-I2luY2x1ZGUpMzUgYig8cG9wdC5oPikyOTkgODMxIHkoaW50KWgKKHBvcHRHZXROZXh0T3B0
-XChwb3B0Q29udGV4dCkzMSBiKGNvblwpOykyOTkgMTA0MiB5IEZBKFQpLTkKYihha2luZyk0
-NCBiKHRoZSloKGNvbnRleHQpaChhcylnKGl0cylmKHNvbGUpaChhciluKGd1bWVudCwpayh0
-aGlzKTQ1CmIoZnVuY3Rpb24pZyhwYXJzZXMpaCh0aGUpZihuZXh0KTI5OSAxMTU0IHkoY29t
-bWFuZFwyNTVsaW5lKTM0CmIoYXIpbihndW1lbnQpZihmb3VuZC4pNjUgYihBZnRlcikzNCBi
-KFwwMDJuZGluZylmKHRoZSloKG5leHQpZyhhciluCihndW1lbnQpZihpbiloKHRoZSkyOTkg
-MTI2NiB5KG9wdGlvbikyOSBiKHRhYmxlLClnKHRoZSlmKGZ1bmN0aW9uKWcKKFwwMDJsbHMp
-ZyhpbilnKHRoZSlnKG9iamVjdClpKHBvaW50ZWQpZSh0byloKGJ5KWcodGhlKWYob3B0aW9u
-KWgKKHRhYmxlKTI5OSAxMzc5IHkoZW50cnkncykxOCBiIEZyKGFyZylnIEZBKHBvaW50ZXIp
-aChpZilmKGl0KWgoaXMpZwoobm90KWYgRnIoTlVMTClwIEZBKC4pZyhJZiloKHRoZSlmIEZy
-KHZhbCloIEZBKGVudHJ5KWYoZm9yKWcodGhlKWcKKG9wdGlvbiloKGlzKWcobm9uXDI1NTAs
-KWcodGhlKTI5OSAxNDkxIHkoZnVuY3Rpb24paCh0aGVuKWcociluKGV0dXJucykKZyh0aGF0
-KWcodmFsdWUuKTMyIGIoT3RoZXJ3aXNlLCkyMCBiIEZyKHBvcHRHZXROZXh0T3B0XChcKSlm
-CkZBKGNvbnRpbnVlcylpKG9uKTI5OSAxNjAzIHkodG8paih0aGUpZihuZXh0KWgoYXIpbihn
-dW1lbnQuKTI5OQoxODE0IHkgRnIocG9wdEdldE5leHRPcHRcKFwpKWcgRkEociluKGV0dXJu
-cyloKFwyNTUxKWcod2hlbilmKHRoZSloCihcMDAybmFsKWcoYXIpbihndW1lbnQpZyhoYXMp
-aChiZWVuKWUocGFyc2VkLClqKGFuZCkyOTkKMTkyNiB5KG90aGVyKTIwIGIobmVnYXRpdmUp
-Zih2YWx1ZXMpaCh3aGVuKWYoZXJyKW4ob3JzKWkob2NjdXIpLTcKYiguKTMzIGIoVGhpcyky
-MCBiKG1ha2VzKWgoaXQpZihhKWgoZ29vZClnKGlkZWEpZih0byloKGtlZXApMjk5CjIwMzkg
-eSh0aGUpaSBGcih2YWwpaCBGQShlbGVtZW50cylmKGluKWcodGhlKWgob3B0aW9ucylnKHRh
-YmxlKWYoZ3IpbgooZWF0ZXIpZyh0aGFuKWcoMC4pMjk5IDIyNTAgeShJZik0OCBiKGFsbClm
-KG9mKWgodGhlKWYoY29tbWFuZFwyNTVsaW5lKQpoKG9wdGlvbnMpZyhhciluKGUpZyhoYW5k
-bGVkKWYodGhyKW4ob3VnaClnIEZyKGFyZylnCkZBKHBvaW50ZXJzLCkyOTkgMjM2MiB5KGNv
-bW1hbmRcMjU1bGluZSkyMyBiKHBhcnNpbmcpaChpcylnKHIpbihlZHVjZWQpCmcodG8pZyh0
-aGUpZihmb2xsb3dpbmcpZyhsaW5lKWcob2YpZyhjb2RlOikyOTkgMjU2OCB5CkZxKHJjKTM2
-IGIoPSloKHBvcHRHZXROZXh0T3B0XChwb3B0Y29uXCk7KTI5OSAyNzgwIHkKRkEoTWFueSky
-MSBiKGFwcGxpY2F0aW9ucylnKHIpbihlcXVpciluKGUpZyhtb3IpbihlKWcoY29tcGxleClo
-Cihjb21tYW5kXDI1NWxpbmUpZihwYXJzaW5nKWcodGhhbilmKHRoaXMsKTI5OSAyODkyIHko
-aG93ZXZlciktNwpiKCwpMjIgYihhbmQpaSh1c2UpZih0aGUpZyhmb2xsb3dpbmcpZyhzdHIp
-byh1Y3R1ciluKGUuKTI5OQozMDk3IHkgRnEod2hpbGUpMzUgYihcKFwocmMpaCg9KWgocG9w
-dEdldE5leHRPcHRcKHBvcHRjb25cKVwpKTMxCmIoPikzNiBiKDBcKSloKHspNDQ2IDMyMDUg
-eShzd2l0Y2gpZShcKHJjXCkpaCh7KTU5MyAzMzEzCnkoLyopZyhzcGVjaWZpYylmKGFyZ3Vt
-ZW50cylnKGFyZSloKGhhbmRsZWQpZihoZXJlKWgoKi8pNDQ2CjM0MjEgeSh9KTI5OSAzNTI5
-IHkofSkyOTkgMzc0MSB5IEZBKFdoZW4pZihyKW4oZXR1cm5lZClnKG9wdGlvbnMpaShhcilu
-CihlKWYoaGFuZGxlZCwpaSh0aGUpZShhcHBsaWNhdGlvbilnKG5lZWRzKWcodG8pZyhrbm93
-KWcodGhlKTI5OQozODUzIHkodmFsdWUpMjEgYihvZiloKGFueSlnKGFyKW4oZ3VtZW50cyln
-KHRoYXQpZyh3ZXIpbihlKWYKKHNwZWNpXDAwMmVkKWkoYWZ0ZXIpZih0aGUpZyhvcHRpb24u
-KTM0IGIoVGhlciluKGUpMjAKYihhciluKGUpaSh0d28pMjk5IDM5NjUgeSh3YXlzKWQodG8p
-ZyhkaXNjb3ZlcilnKHRoZW0uKTMyCmIoT25lKTE4IGIoaXMpaSh0bylmKGFzaylnKHBvcHQp
-Zyh0byloKFwwMDJsbCllKGluKWcoYSlnKHZhcmlhYmxlKWYKKHdpdGgpaCh0aGUpZyh2YWx1
-ZSkyOTkgNDA3NyB5KG9mKTI4IGIodGhlKWgob3B0aW9uKWYodGhyKW4ob3VnaClnKHRoZSkK
-ZyhvcHRpb24paCh0YWJsZSdzKWYgRnIoYXJnKWcgRkEoZWxlbWVudHMuKTQ4IGIoVGhlKTI4
-CmIob3RoZXIpZyhpcyloKHRvKWYodXNlKTI5OSA0MTg5IHkgRnIocG9wdEdldE9wdEFyZ1wo
-XCkpcApGQSguKXAgZW9wCiUlUGFnZTogNDUwIDYKNDUwIDQ3MyBib3AgLTE4NyAtMTE2IGEg
-RnQoNDUwKTExOCBiIEZMKENoYXB0ZXIpMjkgYigyNCk4MwpiIEZ2KFBhcnNpbmcpMjMgYihD
-b21tYW5kLUxpbmUpZihPcHRpb25zKXAgLTE4NyAtNzYgMzQxMwo0IHYgMTExIDE3MCBhIEZx
-KCNpbmNsdWRlKTM1IGIoPHBvcHQuaD4pMTExIDM4NiB5KGNoYXIpaCgqKWgKKHBvcHRHZXRP
-cHRBcmdcKHBvcHRDb250ZXh0KTMxIGIoY29uXCk7KTExMSA1OTggeSBGQShUaGlzKWMoZnVu
-Y3Rpb24pZgoociluKGV0dXJucyloKHRoZSlnKGFyKW4oZ3VtZW50KWYoZ2l2ZW4pZyhmb3Ip
-aCh0aGUpZyhcMDAybmFsKWYob3B0aW9uKQppKHIpbihldHVybmVkKWUoYnkpMTExIDcxMCB5
-IEZyKHBvcHRHZXROZXh0T3B0XChcKSlwCkZBKCwpYyhvcilpKGl0KWcociluKGV0dXJucylm
-IEZyKE5VTEwpZyBGQShpZiloKG5vKWYoYXIpbihndW1lbnQpZyh3YXMpCmgoc3BlY2lcMDAy
-ZWQuKTExMSAxMDczIHkgRnUoMjQuMS40KTU5IGIoTGVmdG92ZXIpMzgKYihBcmd1bWVudHMp
-MTExIDEyODUgeSBGQShNYW55KTI0IGIoYXBwbGljYXRpb25zKWcodGFrZSlmKGFuKWgKKGFy
-Yml0cmFyeSllKG51bWJlcilnKG9mKWkoY29tbWFuZFwyNTVsaW5lKWYoYXIpbihndW1lbnRz
-LCkxMTEKMTM5NyB5KHN1Y2gpaihhcylnKGEpZyhsaXN0KWcob2YpZyhcMDAybGUpZihuYW1l
-cy4pNDAKYihXaGVuKTI1IGIocG9wdClpKGVuY291bnRlcnMpZShhbilnKGFyKW4oZ3VtZW50
-KWcodGhhdClnKGRvZXMpMTExCjE1MDkgeShub3QpayhiZWdpbilmKHdpdGgpZyhhKWggRnIo
-LSlwIEZBKCwpaChpdClmKGFzc3VtZXMpaChpdClmKGlzKWcKKHN1Y2gpZyhhbilmKGFyKW4o
-Z3VtZW50KWcoYW5kKWgoYWRkcyloKGl0KWYodG8pZyhhKWcobGlzdCkxMTEKMTYyMSB5KG9m
-KWkobGVmdG92ZXIpZihhciluKGd1bWVudHMuKTU1IGIoVGhyKW4oZWUpMzAKYihmdW5jdGlv
-bnMpZyhhbGxvdylnKGFwcGxpY2F0aW9ucyloKHRvKWgoYWNjZXNzKWcoc3VjaCkxMTEKMTcz
-MyB5KGFyKW4oZ3VtZW50czopMTExIDIwMDcgeSBGcihjaGFyKTQzIGIoKilnCihwb3B0R2V0
-QXJnXChwb3B0Q29udGV4dClkKGNvblwpOyk0MTEgMjExOSB5IEZBKFRoaXMpMzUKYihmdW5j
-dGlvbilmKHIpbihldHVybnMpZyh0aGUpZyhuZXh0KWgobGVmdG92ZXIpZihhciluKGd1bWVu
-dClnKGFuZClnCihtYXJrcylpKGl0KWUoYXMpNDExIDIyMzEgeShwciluKG9jZXNzZWQuKTEx
-MSAyNDQzIHkKRnIoY2hhcik0MyBiKCopZyhwb3B0UGVla0FyZ1wocG9wdENvbnRleHQpZChj
-b25cKTspNDExCjI1NTUgeSBGQShUaGUpMTUgYihuZXh0KWgobGVmdG92ZXIpZihhciluKGd1
-bWVudClnKGlzKWkociluKGV0dXJuZWQpZAooYnV0KWkobm90KWcobWFya2VkKWcoYXMpZyhw
-ciluKG9jZXNzZWQuKTQxMSAyNjY3IHkoVGhpcykzOQpiKGFsbG93cylnKGFuKWYoYXBwbGlj
-YXRpb24paCh0byloKGxvb2spZihhaGVhZClnKGludG8pZyh0aGUpZihhciluCihndW1lbnQp
-aChsaXN0LCk0MTEgMjc3OSB5KHdpdGhvdXQpMjMgYihtb2RpZnlpbmcpaCh0aGUpZihsaXN0
-LikxMTEKMjk5MSB5IEZyKGNoYXIpNDMgYigqKilmKHBvcHRHZXRBcmdzXChwb3B0Q29udGV4
-dClmKGNvblwpOyk0MTEKMzEwMyB5IEZBKEFsbCkxNiBiKHRoZSlnKGxlZnRvdmVyKWYoYXIp
-bihndW1lbnRzKWcoYXIpbihlKWgociluCihldHVybmVkKWUoaW4paShhKWYobWFubmVyKWco
-aWRlbnRpY2FsKWcodG8paCBGcihhcmd2KXAKRkEoLik0MTEgMzIxNSB5KFRoZSlqKFwwMDJu
-YWwpZyhlbGVtZW50KWcoaW4pZyh0aGUpZyhyKW4oZXR1cm5lZClnCihhcnJheSlnKHBvaW50
-cyloKHRvKWcgRnIoTlVMTClwIEZBKCwpZihpbmRpY2F0aW5nKWcodGhlKTQxMQozMzI3IHko
-ZW5kKTI0IGIob2YpZyh0aGUpZihhciluKGd1bWVudHMuKS0xODcgMzY4MCB5CkZrKDI0LjIp
-MTMxIGIoRXJyb3IpNDEgYihIYW5kbGluZylwIC0xODcgMzc2NSAzNDEzIDUKdiAxMTEgNDAy
-NyBhIEZBKEFsbCkyOSBiKG9mKWcodGhlKWcocG9wdCloKGZ1bmN0aW9ucyllKHRoYXQpaChj
-YW4pZyhyKW4KKGV0dXJuKWUoZXJyKW4ob3JzKWkociluKGV0dXJuKWYoaW50ZWdlcnMuKTQ5
-IGIoV2hlbikyOApiKGFuKTExMSA0MTM5IHkoZXJyKW4ob3IpZChvY2N1cnMsKWkoYSllKG5l
-Z2F0aXZlKWYoZXJyKW4ob3IpaChjb2RlKWgKKGlzKWYociluKGV0dXJuZWQuKTM4IGIoVCkt
-OSBiKGFibGUpMjQgYigyNC4yKWgoc3VtbWFyaXplcylnKHRoZSkxMTEKNDI1MSB5KGVycilu
-KG9yKWYoY29kZXMpZyh0aGF0KWcob2NjdXIpLTcgYiguKTM0IGIoSGVyKW4oZSkyNApiKGlz
-KWcoYSlnKG1vciluKGUpZyhkZXRhaWxlZClmKGRpc2N1c3Npb24paShvZilmKGVhY2gpZihl
-cnIpbihvciktNwpiKC4pcCBlb3AKJSVQYWdlOiA0NTEgNwo0NTEgNDc0IGJvcCAyMzI5IC0x
-MTYgYSBGdigyNC4yKTgyIGIoRXJyb3IpMjMgYihIYW5kbGluZykxMTgKYiBGdCg0NTEpcCAw
-IC03NiAzNDEzIDQgdiA0MjEgNzEgYSBGTChUYWJsZSkyNyBiKDI0LjIpODQKYiBGdihwb3B0
-KTIyIGIoRXJyb3JzKXAgNDIxIDEwMyAyODcwIDQgdiA0MjEgMTIwIDQgMTcKdiAxMzk5IDEy
-MCBWIDMyODcgMTIwIFYgNDIxIDIxOSA0IDEwMCB2IDUwNyAxOTAgYSBGcyhFcnJvcilwCjEz
-OTkgMjE5IFYgNzg1IHcoRGVzY3JpcHRpb24pcCAzMjg3IDIxOSBWIDQyMSAyMzYgNCAxNwp2
-IDEzOTkgMjM2IFYgMzI4NyAyMzYgViA0MjEgMjM5IDI4NzAgNCB2IDQyMSAyNDYgNCA3CnYg
-MTM5OSAyNDYgViAzMjg3IDI0NiBWIDQyMSAyNDkgMjg3MCA0IHYgNDIxIDI2NiA0IDE3CnYg
-MTM5OSAyNjYgViAzMjg3IDI2NiBWIDQyMSAzNjUgNCAxMDAgdiA1MDcgMzM2IGEgRnEoUE9Q
-VF9FUlJPUl9OT0FSRylwCjEzOTkgMzY1IFYgMzg2IHcgRncoQW4pZihhcilvKGd1bWVudClm
-KGlzKWgobWlzc2luZyloKGZvcilmKGFuKWcKKG9wdGlvbi4pcCAzMjg3IDM2NSBWIDQyMSA0
-NjUgViA1MDcgNDM2IGEgRnEoUE9QVF9FUlJPUl9CQURPUFQpcAoxMzk5IDQ2NSBWIDM0OSB3
-IEZ3KEFuKWcob3B0aW9uJ3MpaChhcilvKGd1bWVudCllKGNvdWxkKWgobm90KWgoYmUpZQoo
-cGFyc2VkLilwIDMyODcgNDY1IFYgNDIxIDU2NSBWIDUwNyA1MzUgYSBGcShQT1BUX0VSUk9S
-X09QVFNUT09ERUVQKXAKMTM5OSA1NjUgViAxNjQgdyBGdyhPcHRpb24paShhbGlhc2luZylm
-KGlzKWcobmVzdGVkKWcodG9vKWcoZGVlcGx5KS05CmIoLilwIDMyODcgNTY1IFYgNDIxIDY2
-NCBWIDUwNyA2MzUgYSBGcShQT1BUX0VSUk9SX0JBRFFVT1RFKXAKMTM5OSA2NjQgViAyNzUg
-dyBGdyhRdW90YXRpb25zKTIyIGIoZG8pZihub3QpaChtYXRjaC4pcAozMjg3IDY2NCBWIDQy
-MSA3NjQgViA1MDcgNzM1IGEgRnEoUE9QVF9FUlJPUl9CQUROVU1CRVIpcAoxMzk5IDc2NCBW
-IDIzOCB3IEZ3KEFuKWYob3B0aW9uKWgoY291bGQpZihub3QpZyhiZSlnKGNvbnZlcnRlZClm
-KHRvKWgKKGEpZihudW1iZXIpLTYgYiguKXAgMzI4NyA3NjQgViA0MjEgODYzIFYgNTA3IDgz
-NCBhIEZxCihQT1BUX0VSUk9SX09WRVJGTE9XKXAgMTM5OSA4NjMgViAyNzUgdyBGdyhBKTIx
-IGIoZ2l2ZW4pZyhudW1iZXIpZyh3YXMpCmYodG9vKWkoYmlnKWYob3IpZyh0b28pZyhzbWFs
-bC4pcCAzMjg3IDg2MyBWIDQyMSA4ODAKNCAxNyB2IDEzOTkgODgwIFYgMzI4NyA4ODAgViA0
-MjEgODgzIDI4NzAgNCB2IDI5OSAxMTMyCmEgRnIoUE9QVF9FUlJPUl9OT0FSRyk1OTkgMTI0
-NCB5IEZBKEFuKWMob3B0aW9uKWgodGhhdClmKHIpbihlcXVpciluCihlcyloKGFuKWYoYXIp
-bihndW1lbnQpZih3YXMpaShzcGVjaVwwMDJlZClnKG9uKWYodGhlKWcoY29tbWFuZCk1OTkK
-MTM1NyB5KGxpbmUsKTQwIGIoYnV0KWQobm8pZyhhciluKGd1bWVudClnKHdhcylnKGdpdmVu
-Lik3NQpiKFRoaXMpMzcgYihjYW4paChiZSlmKHIpbihldHVybmVkKWYob25seSloKGJ5KTU5
-OSAxNDY5CnkgRnIocG9wdEdldE5leHRPcHRcKFwpKXAgRkEoLikyOTkgMTY4MCB5IEZyKFBP
-UFRfRVJST1JfQkFET1BUKTU5OQoxNzkyIHkgRkEoQW4pMjYgYihvcHRpb24pZyh3YXMpaChz
-cGVjaVwwMDJlZClmKGluKWcgRnIoYXJndilnCkZBKGJ1dClnKGlzKWcobm90KWcoaW4pZyh0
-aGUpZyhvcHRpb24pZyh0YWJsZS4pNDEgYihUaGlzKTU5OQoxOTA1IHkoZXJyKW4ob3IpMjMg
-YihjYW4paChiZSlmKHIpbihldHVybmVkKWcob25seSlnKGZyKW4ob20paApGcihwb3B0R2V0
-TmV4dE9wdFwoXCkpcCBGQSguKTI5OSAyMTE2IHkgRnIoUE9QVF9FUlJPUl9PUFRTVE9PREVF
-UCk1OTkKMjIyOCB5IEZBKEEpZihzZXQpaChvZilmKG9wdGlvbilnKGFsaWFzZXMpZyhpcylo
-KG5lc3RlZClmKHRvbyloKGRlZXBseSkKLTExIGIoLikzNCBiKEN1cnIpbihlbnRseSktMTEg
-YigsKTIyIGIocG9wdClpKGZvbGxvd3MpNTk5CjIzNDAgeShvcHRpb25zKTMwIGIob25seSlm
-KDEwKWcobGV2ZWxzKWcodG8paChwciluKGV2ZW50KWYoaW5cMDAybml0ZSlmCihyKW4oZWN1
-cnNpb24uKTUwIGIoT25seSkyOSBiIEZyKHBvcHRHZXQtKTU5OSAyNDUyIHkoTmV4dE9wdFwo
-XCkpMjMKYiBGQShjYW4pZyhyKW4oZXR1cm4pZyh0aGlzKWgoZXJyKW4ob3IpLTcgYiguKTI5
-OSAyNjY0CnkgRnIoUE9QVF9FUlJPUl9CQURRVU9URSk1OTkgMjc3NiB5IEZBKEEpMTUgYihw
-YXJzZWQpZyhzdHJpbmcpZyhoYXMpZwooYSlnKHF1b3RhdGlvbilnKG1pc21hdGNoKWcoXChz
-dWNoKWcoYXMpZyhhKWcoc2luZ2xlKWcocXVvdGF0aW9uKTU5OQoyODg4IHkobWFya1wpLik2
-MiBiIEZyKHBvcHRQYXJzZUFyZ3ZTdHJpbmdcKFwpKXAgRkEoLCkzMwpiIEZyKHBvcHRSZWFk
-Q29uZmlnRmlsZVwoXCkpcCBGQSgsKWcob3IpZyBGcihwb3B0UmVhZERlLSk1OTkKMzAwMCB5
-KGZhdWx0Q29uZmlnXChcKSkyMiBiIEZBKGNhbilpKHIpbihldHVybillKHRoaXMpaShlcnIp
-bihvciktNwpiKC4pMjk5IDMyMTIgeSBGcihQT1BUX0VSUk9SX0JBRE5VTUJFUik1OTkgMzMy
-NCB5IEZBKEEpMzgKYihjb252ZXJzaW9uKWcoZnIpbihvbSlnKGEpZyhzdHJpbmcpZyh0bylo
-KGEpZihudW1iZXIpZihcKClwCkZyKGludCloIEZBKG9yKWcgRnIobG9uZylwIEZBKFwpKWYo
-ZmFpbGVkKWgoZHVlKTU5OSAzNDM2CnkodG8pMjggYih0aGUpZyhzdHJpbmcpZyhjb250YWlu
-aW5nKWYobm9ubnVtZXJpYylmKGNoYXJhY3RlcnMuKTQ3CmIoVGhpcykyOCBiKG9jY3Vycylo
-KHdoZW4pNTk5IDM1NDggeSBGcihwb3B0R2V0TmV4dE9wdFwoXCkpYwpGQShpcylqKHByKW4o
-b2Nlc3NpbmcpZyhhbilmKGFyKW4oZ3VtZW50KWYob2YpaCh0eXBlKWcKRnIoUE9QVF9BUkdf
-SU5UKWYgRkEob3IpNTk5IDM2NjAgeSBGcihQT1BUX0FSR19MT05HKXAKRkEoLikyOTkgMzg3
-MiB5IEZyKFBPUFRfRVJST1JfT1ZFUkZMT1cpNTk5IDM5ODQgeSBGQShBKWcKKHN0cmluZ1wy
-NTV0b1wyNTVudW1iZXIpZihjb252ZXJzaW9uKWcoZmFpbGVkKWcoYmVjYXVzZSloKHRoZSlm
-KG51bWJlcikKZyh3YXMpaCh0b28pNTk5IDQwOTYgeShsYXIpbihnZSk0MSBiKG9yKWgodG9v
-KWcoc21hbGwuKTg4CmIoTGlrZSk0MiBiIEZyKFBPUFRfRVJST1JfQkFETlVNQkVSKXAgRkEo
-LClkKHRoaXMpaihlcnIpbihvcilmKGNhbiloCihvY1wyNTUpNTk5IDQyMDggeShjdXIpMjgg
-Yihvbmx5KWgod2hlbillIEZyKHBvcHRHZXROZXh0T3B0XChcKSlnCkZBKGlzKWkocHIpbihv
-Y2Vzc2luZyloKGFuKWUoYXIpbihndW1lbnQpZyhvZiloKHR5cGUpNTk5CjQzMjAgeSBGcihQ
-T1BUX0FSR19JTlQpMjIgYiBGQShvcilpIEZyKFBPUFRfQVJHX0xPTkcpcApGQSguKXAgZW9w
-CiUlUGFnZTogNDUyIDgKNDUyIDQ3NSBib3AgLTE4NyAtMTE2IGEgRnQoNDUyKTExOCBiIEZM
-KENoYXB0ZXIpMjkgYigyNCk4MwpiIEZ2KFBhcnNpbmcpMjMgYihDb21tYW5kLUxpbmUpZihP
-cHRpb25zKXAgLTE4NyAtNzYgMzQxMwo0IHYgMTExIDgzIGEgRnIoUE9QVF9FUlJPUl9FUlJO
-Tyk0MTEgMTk1IHkgRkEoQSkzNiBiKHN5c3RlbSlnKGNhbGwpZihyKQpuKGV0dXJuZWQpZih3
-aXRoKWgoYW4pZihlcnIpbihvciktNyBiKCwpMzcgYihhbmQpZSBGcihlcnJubylnCkZBKHN0
-aWxsKWcoY29udGFpbnMpZyh0aGUpNDExIDMwNyB5KGVyciluKG9yKTIzIGIoZnIpbihvbSlo
-KHRoZSlmCihzeXN0ZW0paShjYWxsLikzNCBiKEJvdGgpMjQgYiBGcihwb3B0UmVhZENvbmZp
-Z0ZpbGVcKFwpKWQKRkEoYW5kKWogRnIocG9wdFJlYWQtKTQxMSA0MTkgeShEZWZhdWx0Q29u
-ZmlnXChcKSlmIEZBKGNhbilnKHIpbihldHVybikKZyh0aGlzKWgoZXJyKW4ob3IpLTcgYigu
-KTExMSA2NTYgeShUKWUod28pMzggYihmdW5jdGlvbnMpZihhciluKGUpaAooYXZhaWxhYmxl
-KWUodG8paShtYWtlKWcoaXQpZihlYXN5KWgoZm9yKWcoYXBwbGljYXRpb25zKWcodG8pZyhw
-ciluCihvdmlkZSkxMTEgNzY4IHkoZ29vZCkyNSBiKGVyciluKG9yKWUobWVzc2FnZXMuKTEx
-MSAxMDQyCnkgRnIoY29uc3QpNDMgYihjaGFyKWYoKiloKHBvcHRTdHJlcnJvclwoY29uc3Qp
-ZShpbnQpaChlcnJvclwpOyk0MTEKMTE1NCB5IEZBKFRoaXMpMTggYihmdW5jdGlvbilnKHRh
-a2VzKWgoYSlmKHBvcHQpaChlcnIpbihvcilmKGNvZGUpaAooYW5kKWcociluKGV0dXJucyll
-KGEpaShzdHJpbmcpZihkZXNjcmliaW5nKTQxMSAxMjY2CnkodGhlKTI0IGIoZXJyKW4ob3Ip
-LTcgYigsKTIzIGIoanVzdCloKGFzKWcod2l0aClmKHRoZSlnKHN0YW5kYXIpbihkKWkKRnIo
-c3RyZXJyb3JcKFwpKWQgRkEoZnVuY3Rpb24uKTExMSAxNDc4IHkgRnIoY2hhcik0MwpiKCop
-Zyhwb3B0QmFkT3B0aW9uXChwb3B0Q29udGV4dClkKGNvbiwpaShpbnQpaChmbGFnc1wpOyk0
-MTEKMTU5MCB5IEZBKElmKTMyIGIoYW4pZShlcnIpbihvcilnKG9jY3VyciluKGVkKWkoZHVy
-aW5nKWUKRnIocG9wdEdldE5leHRPcHRcKFwpKXAgRkEoLCloKHRoaXMpZyhmdW5jdGlvbiln
-KHIpbihldHVybnMpNDExCjE3MDIgeSh0aGUpMzggYihvcHRpb24pZyh0aGF0KWcoY2F1c2Vk
-KWgodGhlKWUoZXJyKW4ob3IpLTcKYiguKTc3IGIoSWYpMzggYih0aGUpZiBGcihmbGFncylo
-IEZBKGFyKW4oZ3VtZW50KWYoaXMpaShzZXQpZih0byk0MTEKMTgxNCB5IEZyKFBPUFRfQkFE
-T1BUSU9OX05PQUxJQVMpcCBGQSgsKWUodGhlKWkob3V0ZXJtb3N0KWgob3B0aW9uKWYKKGlz
-KWgociluKGV0dXJuZWQuKTc2IGIoT3RoZXIpbihcMjU1KTQxMSAxOTI2IHkod2lzZSwpMzEK
-YiBGcihmbGFncyllIEZBKHNob3VsZCloKGJlKWYoMCwpaShhbmQpZSh0aGUpZyhvcHRpb24p
-aCh0aGF0KWYoaXMpaChyKW4KKGV0dXJuZWQpZihtYXkpaChoYXZlKTQxMSAyMDM4IHkoYmVl
-bikyMyBiKHNwZWNpXDAwMmVkKWkodGhyKW4ob3VnaClkCihhbilpKGFsaWFzLikxMTEgMjI3
-NSB5KFRoZXNlKTE2IGIodHdvKWgoZnVuY3Rpb25zKWYobWFrZSloKHBvcHQpZyhlcnIpCm4o
-b3IpZihoYW5kbGluZylnKHRyaXZpYWwpZihmb3IpaShtb3N0KWgoYXBwbGljYXRpb25zLikx
-MTEKMjM4NyB5KFdoZW4pMjYgYihhbilmKGVyciluKG9yKWcoaXMpaChkZXRlY3RlZClnKGZy
-KW4ob20pZyhtb3N0KWgob2YpZgoodGhlKWYoZnVuY3Rpb25zLCloKGFuKWYoZXJyKW4ob3Ip
-ZyhtZXNzYWdlKWgoaXMpMTExCjI0OTkgeShwcmludGVkKTM1IGIoYWxvbmcpZyh3aXRoKWco
-dGhlKWcoZXJyKW4ob3IpZihzdHJpbmcpaShmciluKG9tKWYKRnIocG9wdFN0cmVycm9yXChc
-KSlwIEZBKC4pNjggYihXaGVuKTM1IGIoYW4pZihlcnIpbihvcikxMTEKMjYxMSB5KG9jY3Vy
-cykyNiBiKGR1cmluZyllKGFyKW4oZ3VtZW50KWgocGFyc2luZywpZyhjb2RlKWcoc2ltaWxp
-YXIpZwoodG8pZyh0aGUpZyhmb2xsb3dpbmcpZihkaXNwbGF5cylpKGEpMTExIDI3MjMgeSh1
-c2VmdWwpZChlcnIpbihvcilnCihtZXNzYWdlLikxMTEgMjkyOSB5IEZxKGZwcmludGZcKHN0
-ZGVyciwpMzQgYigiXDA0NXM6KWgoXDA0NXNcXG4iLCk0MDUKMzAzNyB5KHBvcHRCYWRPcHRp
-b25cKG9wdENvbiwpZChQT1BUX0JBRE9QVElPTl9OT0FMSUFTXCksKTQwNQozMTQ0IHkocG9w
-dFN0cmVycm9yXChyY1wpXCk7KS0xODcgMzQ3NSB5IEZrKDI0LjMpMTMxCmIoT3B0aW9uKTQy
-IGIoQWxpYXNpbmcpcCAtMTg3IDM1NjAgMzQxMyA1IHYgMTExIDM4MjIKYSBGQShPbmUpMjEg
-YihvZiloKHRoZSlmKHByaW1hcnkpZyhiZW5lXDAwMnRzKWYob2YpaSh1c2luZylmKHBvcHQp
-aAoob3ZlcilmIEZyKGdldG9wdFwoXCkpZyBGQShpcyloKHRoZSlmKGFiaWxpdHkpZih0bylp
-KHVzZSkxMTEKMzkzNCB5KG9wdGlvbikzMCBiKGFsaWFzaW5nLik0OSBiKFRoaXMpMjkgYihs
-ZXRzKWgodGhlKWUodXNlciloCihzcGVjaWZ5KWgob3B0aW9ucylnKHRoYXQpZihwb3B0KWgo
-ZXhwYW5kcylnKGludG8pMTExCjQwNDYgeShvdGhlcikyMiBiKG9wdGlvbnMpZyh3aGVuKWYo
-dGhleSloKGFyKW4oZSlmKHNwZWNpXDAwMmVkLikzNQpiKElmKTIyIGIodGhlKWYoc3RhbmRh
-ciluKGQpaShnciluKGVwKWYocHIpbihvZ3JhbSloKG1hZGUpMTExCjQxNTggeSh1c2Upaihv
-ZilnKHBvcHQsKWgodXNlcnMpZihjb3VsZCloKGFkZClmKGEpZyBGcigtLXRleHQpZgpGQShv
-cHRpb24paCh0aGF0KWcoZXhwYW5kZWQpZyh0bylnIEZyKC1pKTQ1IGIoLW4pZygtRSlnKC0y
-KTExMQo0MjcwIHkgRkEodG8pMjUgYihsZXQpZSh0aGVtKWgobW9yKW4oZSlnKGVhc2lseSlm
-KFwwMDJuZCloKGluZm9ybWF0aW9uKQplKGluKWgodGV4dCloKFwwMDJsZXMuKXAgZW9wCiUl
-UGFnZTogNDUzIDkKNDUzIDQ3NiBib3AgMjI5OCAtMTE2IGEgRnYoMjQuMyk4MSBiKE9wdGlv
-bikyMiBiKEFsaWFzaW5nKTExOApiIEZ0KDQ1MylwIDAgLTc2IDM0MTMgNCB2IDI5OSA4NSBh
-IEZ1KDI0LjMuMSk1OCBiKFNwZWNpZnlpbmcpNDAKYihBbGlhc2VzKTI5OSAyOTcgeSBGQShB
-bGlhc2VzKTE4IGIoYXIpbihlKWUobm9ybWFsbHkpaChzcGVjaVwwMDJlZCloCihpbilmKHR3
-bylnKHBsYWNlczopMzIgYigvZXRjL3BvcHQpMTggYihhbmQpZih0aGUpZygucG9wdCloKFww
-MDJsZSlmCihpbikyOTkgNDA5IHkodGhlKTI1IGIodXNlcik3IGIoJ3MpMjUgYihob21lKWgo
-ZGlyKW4oZWN0b3J5KWYoXChmb3VuZClnCih0aHIpbihvdWdoKWcodGhlKWcgRnIoSE9NRSln
-IEZBKGVudmlyKW4ob25tZW50KWYodmFyaWFibGVcKS4pMjk5CjUyMSB5KEJvdGgpMzMgYihc
-MDAybGVzKWgoaGF2ZSllKHRoZSloKHNhbWUpaChmb3JtYXQsKWgoYW4pZShhcmJpdHJhcnkp
-CmYobnVtYmVyKWcob2YpaChsaW5lcylnKGZvcm1hdHRlZCkyOTkgNjMzIHkobGlrZSkyMyBi
-KHRoaXM6KTI5OQo4NDUgeSBGaihhcHBuYW1lKTQyIGIgRnIoYWxpYXMpZyBGaihuZXdvcHRp
-b24pZyhleHBhbnNpb24pMjk5CjEwNTcgeSBGQShUaGUpMjQgYiBGaihhcHBuYW1lKWggRkEo
-aXMpaCh0aGUpZihuYW1lKWcob2YpaCh0aGUpZgooYXBwbGljYXRpb24sKWgod2hpY2gpZSht
-dXN0KWooYmUpZSh0aGUpZyhzYW1lKWgoYXMpZyh0aGUpMjk5CjExNjkgeSBGcihuYW1lKWUg
-RkEocGFyYW1ldGVyKWcocGFzc2VkKWkodG8pZiBGcihwb3B0R2V0Q29udGV4dFwoXCkpcApG
-QSguKTM2IGIoVGhpcykyNCBiKGFsbG93cylnKGVhY2gpZyhcMDAybGUpZyh0bylpKHNwZWNp
-ZnkpMjk5CjEyODEgeShhbGlhc2VzKWUoZm9yKWgobXVsdGlwbGUpZihwciluKG9ncmFtcy4p
-MzcgYihUaGUpMjQKYiBGcihhbGlhcylnIEZBKGtleXdvciluKGQpZyhzcGVjaVwwMDJlcylp
-KHRoYXQpZShhbilnKGFsaWFzKWcoaXMpMjk5CjEzOTMgeShiZWluZyloKGRlXDAwMm5lZDsp
-aShjdXJyKW4oZW50bHkpZihwb3B0KWgoY29uXDAwMmd1cmF0aW9uKWUKKFwwMDJsZXMpaShz
-dXBwb3J0KWcob25seSlmKGFsaWFzZXMsKWgoYnV0KTI5OSAxNTA1IHkob3RoZXIpaQooYWJp
-bGl0aWVzKWgobWF5KWcoYmUpZyhhZGRlZClnKGluKWcodGhlKWcoZnV0dXIpbihlLik1Mgpi
-KFRoZSkyOSBiKG5leHQpaChvcHRpb24pZyhpcylnKHRoZSlnKG9wdGlvbikyOTkgMTYxNwp5
-KHRoYXQpZChzaG91bGQpaChiZSlnKGFsaWFzZWQsKWcoYW5kKWcoaXQpZyhtYXkpZyhiZSlm
-KGVpdGhlcilnKGEpaAooc2hvcnQpZyhvcilmKGEpaChsb25nKWcob3B0aW9uLik0NiBiKFRo
-ZSkyOTkgMTcyOSB5KHIpbihlc3QpMjkKYihvZiloKHRoZSllKGxpbmUpaChzcGVjaVwwMDJl
-cyloKHRoZSllKGV4cGFuc2lvbiloKGZvcilnKHRoZSlnKGFsaWFzLikKNTAgYihJdCkzMCBi
-KGlzKWYocGFyc2VkKWgoc2ltaWxhcmx5KTI5OSAxODQxIHkodG8pZihhKWcoc2hlbGwpZgoo
-Y29tbWFuZCwpaih3aGljaClkKGFsbG93cyloIEZyKFxcKXAgRkEoLCloIEZyKCIpcCBGQSgs
-KWcoYW5kKWYKRnIoJylnIEZBKHRvKWcoYmUpZyh1c2VkKWcoZm9yKWcocXVvdGluZy4pNDkg
-YihJZikyOQpiKGEpMjk5IDE5NTMgeShiYWNrc2xhc2gpMjIgYihpcylnKHRoZSlnKFwwMDJu
-YWwpZihjaGFyYWN0ZXIpZyhvbilnKGEpaAoobGluZSwpZih0aGUpaChuZXh0KWYobGluZSln
-KGluKWgodGhlKWYoXDAwMmxlKWcoaXMpaShhc3N1bWVkKTI5OQoyMDY2IHkodG8pMjggYihi
-ZSlmKGEpZyhsb2dpY2FsKWcoY29udGludWF0aW9uKWYob2YpaSh0aGUpZihsaW5lKWYKKGNv
-bnRhaW5pbmcpaCh0aGUpZyhiYWNrc2xhc2gsKWgoanVzdClnKGFzKWcoaW4pMjk5IDIxNzgK
-eShzaGVsbC4pMjk5IDIzODkgeShUaGUpaShmb2xsb3dpbmcpZyhlbnRyeSloKHdvdWxkKWYo
-YWRkKWkoYSlmCkZyKC0tdGV4dClnIEZBKG9wdGlvbilnKHRvKWgodGhlKWUgRnIoZ3JlcClo
-IEZBKGNvbW1hbmQsKWooYXMpMjk5CjI1MDEgeShzdWdnZXN0ZWQpMjQgYihhdClnKHRoZSlm
-KGJlZ2lubmluZylmKG9mKWkodGhpcylnKHNlY3Rpb24uKTI5OQoyNzEzIHkgRnIoZ3JlcCk0
-MiBiKGFsaWFzKWgoLS10ZXh0KWYoLWkpaCgtbilmKC1FKWgoLTIpMjk5CjMwNjggeSBGdSgy
-NC4zLjIpNTggYihFbmFibGluZykzOSBiKEFsaWFzZXMpMjk5IDMyNzkKeSBGQShBbikyMSBi
-KGFwcGxpY2F0aW9uKWYobXVzdClpKGVuYWJsZSlkKGFsaWFzKWgoZXhwYW5zaW9uKWgoZm9y
-KWcoYSkKZiBGcihwb3B0Q29udGV4dClnIEZBKGJlZm9yKW4oZSlnKGNhbGxpbmcpMjk5IDMz
-OTEgeQpGcihwb3B0R2V0TmV4dEFyZ1woXCkpMzMgYiBGQShmb3IpaSh0aGUpZyhcMDAycnN0
-KWcodGltZS4pNjgKYihUaGVyKW4oZSkzNCBiKGFyKW4oZSlnKHRociluKGVlKWgoZnVuY3Rp
-b25zKWYodGhhdCloKGRlXDAwMm5lKTI5OQozNTAzIHkoYWxpYXNlcykyMyBiKGZvciloKGEp
-Zyhjb250ZXh0LikyOTkgMzc3NyB5IEZyKGludCk0MgpiKHBvcHRSZWFkRGVmYXVsdENvbmZp
-Z1wocG9wdENvbnRleHQpZShjb24sKWkoaW50KWgoZmxhZ3NcKTspNTk5CjM4ODkgeSBGQShU
-aGlzKWQoZnVuY3Rpb24pZihyKW4oZWFkcyloKGFsaWFzZXMpZyhmciluKG9tKWgoL2V0Yy9w
-b3B0KWcKKGFuZClmKHRoZSlnKC5wb3B0KWgoXDAwMmxlKWYoaW4pNTk5IDQwMDIgeSh0aGUp
-MjkgYih1c2VyKTcKYigncykyOSBiKGhvbWUpZyhkaXIpbihlY3RvcnkpLTExIGIoLik1MyBi
-KEN1cnIpbihlbnRseSktMTEKYigsKTI5IGIgRnIoZmxhZ3MpZyBGQShzaG91bGQpaChiZSlm
-IEZyKE5VTEwpcCBGQSgsKWcoYXMpZyhpdCloKGlzKTU5OQo0MTE0IHkocHIpbihvdmlkZWQp
-MjQgYihvbmx5KWcoZm9yKWYoZnV0dXIpbihlKWcoZXhwYW5zaW9uLilwCmVvcAolJVBhZ2U6
-IDQ1NCAxMAo0NTQgNDc3IGJvcCAtMTg3IC0xMTYgYSBGdCg0NTQpMTE4IGIgRkwoQ2hhcHRl
-cikyOSBiKDI0KTgzCmIgRnYoUGFyc2luZykyMyBiKENvbW1hbmQtTGluZSlmKE9wdGlvbnMp
-cCAtMTg3IC03NiAzNDEzCjQgdiAxMTEgODMgYSBGcihpbnQpNDMgYihwb3B0UmVhZENvbmZp
-Z0ZpbGVcKHBvcHRDb250ZXh0KWMoY29uLClrKGNoYXIpCmYoKiloKGZuXCk7KTQxMSAxOTUg
-eSBGQShUaGUpMTcgYihcMDAybGUpaChzcGVjaVwwMDJlZCloKGJ5KWYKRnIoZm4pZyBGQShp
-cylnKG9wZW5lZClnKGFuZClnKHBhcnNlZCloKGFzKWYoYSlnKHBvcHQpaAooY29uXDAwMmd1
-cmF0aW9uKTQxMSAzMDcgeShcMDAybGUuKTY4IGIoVGhpcykzNSBiKGFsbG93cylmKHByKW4o
-b2dyYW1zKQppKHRvKWcodXNlKWYocHIpbihvZ3JhbVwyNTVzcGVjaVwwMDJjKWgoY29uXDAw
-Mmd1cmF0aW9uKTQxMQo0MTkgeShcMDAybGVzLikxMTEgNjMxIHkgRnIoaW50KTQzIGIocG9w
-dEFkZEFsaWFzXChwb3B0Q29udGV4dClkKGNvbiwpagooc3RydWN0KWYocG9wdEFsaWFzKWco
-YWxpYXMsKWcoaW50KWcoZmxhZ3NcKTspNDExIDc0Mwp5IEZBKE9jY2FzaW9uYWxseSktMTEg
-YigsKTM3IGIocHIpbihvY2Vzc2VzKWYod2FudClkKHRvKWgoc3BlY2lmeSlnCihhbGlhc2Vz
-KWcod2l0aG91dClmKGhhdmluZylmKHRvKTQxMSA4NTUgeShyKW4oZWFkKTI0CmIodGhlbSlm
-KGZyKW4ob20paChhKWYoY29uXDAwMmd1cmF0aW9uKWYoXDAwMmxlLikzNCBiKFRoaXMpMjMK
-YihmdW5jdGlvbilmKGFkZHMpaShhKWcobmV3KWUoYWxpYXMpNDExIDk2NyB5KHRvKTM5IGIo
-YSlmKGNvbnRleHQuKTc3CmIoVGhlKTM4IGIgRnIoZmxhZ3MpZiBGQShhciluKGd1bWVudClo
-KHNob3VsZClnKGJlKWYoMCwpNDIKYihhcyljKGl0KWcoaXMpaChjdXJyKW4oZW50bHkpNDEx
-IDEwNzkgeShyKW4oZXNlcnZlZCkyMQpiKGZvcilnKGZ1dHVyKW4oZSllKGV4cGFuc2lvbi4p
-MzMgYihUaGUpMjAgYihuZXcpZyhhbGlhcyloKGlzKWcKKHNwZWNpXDAwMmVkKWcoYXMpaChh
-KWUgRnIoc3RydWN0KTQxMSAxMTkxIHkocG9wdEFsaWFzKXAKRkEoLClqKHdoaWNoKWcoaXMp
-aChkZVwwMDJuZWQpZihhczopNDExIDEzODggeSBGcShzdHJ1Y3QpMzYKYihwb3B0QWxpYXMp
-ZSh7KTU1OCAxNDk2IHkoY2hhcilpKCopaChsb25nTmFtZTspNDM5IGIoLyopMzYKYihtYXkp
-ZyhiZSlnKE5VTEwpZygqLyk1NTggMTYwNCB5KGNoYXIpZyhzaG9ydE5hbWU7KTQ3NgpiKC8q
-KTM2IGIobWF5KWcoYmUpZygnXFwwJylnKCovKTU1OCAxNzEyIHkoaW50KWcoYXJnYzspNTU4
-CjE4MjAgeShjaGFyKWcoKiopaChhcmd2Oyk1NTAgYigvKikzNiBiKG11c3QpZyhiZSlnKGZy
-ZWVcKFwpYWJsZSlmKCovKQo0MTEgMTkyNyB5KH07KTQxMSAyMTM5IHkgRkEoVGhlKWQoXDAw
-MnJzdCloKHR3bylnKGVsZW1lbnRzLClpCkZyKGxvbmdOYW1lKWQgRkEoYW5kKWcgRnIoc2hv
-cnROYW1lKXAgRkEoLClqKHNwZWNpZnkpZSh0aGUpZyhvcHRpb24pNDExCjIyNTEgeSh0aGF0
-KTIzIGIoaXMpZyhhbGlhc2VkLikzMyBiKFRoZSkyMiBiKFwwMDJuYWwpZyh0d28sKWgKRnIo
-YXJnYylmIEZBKGFuZClnIEZyKGFyZ3YpcCBGQSgsKWgoZGVcMDAybmUpZih0aGUpZyhleHBh
-bnNpb24pZyh0byk0MTEKMjM2MyB5KHVzZSlpKHdoZW4pZSh0aGUpaShhbGlhc2VzKWYob3B0
-aW9uKWgoaXMpZyhlbmNvdW50ZXIpbihlZC4pLTE4NwoyNzE2IHkgRmsoMjQuNCkxMzEgYihQ
-YXJzaW5nKTQxIGIoQXJndW1lbnQpZihTdHJpbmdzKXAKLTE4NyAyODAxIDM0MTMgNSB2IDEx
-MSAzMDYzIGEgRkEoQWx0aG91Z2gpMjEgYihwb3B0KWkoaXMpZyh1c3VhbGx5KWUKKHVzZWQp
-aChmb3IpZihwYXJzaW5nKWgoYXIpbihndW1lbnRzKWcoYWxyKW4oZWFkeSlmKGRpdmlkZWQp
-aChpbnRvKTExMQozMTc1IHkoYW4pZSBGcihhcmd2KXAgRkEoXDI1NXN0eWxlKWYoYXJyYXkp
-LTExIGIoLCkyMApiKHNvbWUpaChwciluKG9ncmFtcylnKG5lZWQpZSh0byloKHBhcnNlKWco
-c3RyaW5ncyloKHRoYXQpZShhciluKGUpaAooZm9ybWF0dGVkKTExMSAzMjg3IHkoaWRlbnRp
-Y2FsbHkpMzAgYih0bylnKGNvbW1hbmQpaChsaW5lcy4pNTIKYihUKS05IGIobykzMCBiKGZh
-Y2lsaXRhdGUpZih0aGlzLClqKHBvcHQpZihwciluKG92aWRlcylnKGEpZihmdW5jdGlvbikK
-MTExIDMzOTkgeSh0aGF0KWYocGFyc2VzKWgoYSlnKHN0cmluZylmKGludG8pZyhhbilnKGFy
-cmF5KWYob2YpaAooc3RyaW5nLClpKHVzaW5nKWUocilvKHVsZXMpZyhzaW1pbGlhcilnKHRv
-KWcobm9ybWFsKTExMQozNTEyIHkoc2hlbGwpMjQgYihwYXJzaW5nLikxMTEgMzcxNyB5IEZx
-KCNpbmNsdWRlKTM1CmIoPHBvcHQuaD4pMTExIDM5MzMgeShpbnQpaChwb3B0UGFyc2VBcmd2
-U3RyaW5nXChjaGFyKTMxCmIoKikzNyBiKHMsKWYoaW50KWcoKiloKGFyZ2NQdHIsKWUoY2hh
-ciloKCoqKilnKGFyZ3ZQdHJcKTspMTExCjQxNDUgeSBGQShUaGUpMTkgYihzdHJpbmcpaCBG
-cihzKWcgRkEoaXMpZyhwYXJzZWQpaChpbnRvKWYoYW4pZgpGcihhcmd2KXAgRkEoXDI1NXN0
-eWxlKWgoYXJyYXkpLTExIGIoLikzMiBiKFRoZSkxOSBiKGludGVnZXIpZyhwb2ludGVkKQpo
-KHRvKWcoYnkpZyh0aGUpMTExIDQyNTcgeShzZWNvbmQpMzMgYihwYXJhbWV0ZXIpLTcgYigs
-KTMyCmIgRnIoYXJnY1B0cilwIEZBKCwpaChjb250YWlucyllKHRoZSlnKG51bWJlcilnKG9m
-KWcoZWxlbWVudHMpZwoocGFyc2VkLClqKGFuZCkxMTEgNDM2OSB5KHRoZSljKHBvaW50ZXIp
-aChwb2ludGVkKWYodG8paChieSlnKHRoZSlmCihcMDAybmFsKWYocGFyYW1ldGVyKWgoaXMp
-aChzZXQpZyh0bylnKHBvaW50KWcodG8pZyh0aGUpZihuZXdseSlwCmVvcAolJVBhZ2U6IDQ1
-NSAxMQo0NTUgNDc4IGJvcCAyMTU0IC0xMTYgYSBGdigyNC42KTgyIGIoU2FtcGxlKTIzIGIo
-QXBwbGljYXRpb24pMTE1CmIgRnQoNDU1KXAgMCAtNzYgMzQxMyA0IHYgMjk5IDgzIGEgRkEo
-Y3IpbihlYXRlZCkyOCBiKGFycmF5KS0xMQpiKC4pNDUgYihUaGUpMjcgYihhcnJheSlnKGlz
-KWgoZHluYW1pY2FsbHkpZyhhbGxvY2F0ZWQpZihhbmQpaChzaG91bGQpZgooYmUpaCBGcihm
-cmVlXChcKSlwIEZBKGVkKTI5OSAxOTUgeSh3aGVuKTIyIGIodGhlKWkoYXBwbGljYXRpb24p
-ZihpcyloCihcMDAybmlzaGVkKWYod2l0aClnKGl0LikyOTkgNDA3IHkoVGhlKWkgRnIoYXJn
-dlB0ciloCkZBKGNyKW4oZWF0ZWQpaChieSlmIEZyKHBvcHRQYXJzZUFyZ3ZTdHJpbmdcKFwp
-KWUgRkEoaXMpaihzdWl0YWJsZSlmCih0byloKHBhc3MpZyhkaXIpbihlY3RseSlnKHRvKTI5
-OSA1MTkgeSBGcihwb3B0R2V0Q29udGV4dFwoXCkpcApGQSguKTAgODM4IHkgRmsoMjQuNSkx
-MzIgYihIYW5kbGluZyk0MSBiKEV4dHJhKWYoQXJndW1lbnRzKXAKMCA5MjMgMzQxMyA1IHYg
-Mjk5IDExODUgYSBGQShTb21lKTMzIGIoYXBwbGljYXRpb25zKWYoaW1wbGVtZW50KWgodGhl
-KWYKKGVxdWl2YWxlbnQpZShvZilqKG9wdGlvbilmKGFsaWFzaW5nKWcoYnV0KWcobmVlZCky
-OTkKMTI5NyB5KHRvKTM5IGIoZG8paChzbylnKHRociluKG91Z2gpZShzcGVjaWFsKWkobG9n
-aWMuKTgwCmIoVGhlKTM4IGIgRnIocG9wdFN0dWZmQXJnc1woXCkpZyBGQShmdW5jdGlvbiln
-KGFsbG93cyloKGFuKTI5OQoxNDA5IHkoYXBwbGljYXRpb24pMjQgYih0bylnKGluc2VydClm
-KG5ldylnKGFyKW4oZ3VtZW50cylnKGludG8paCh0aGUpZgooY3VyciluKGVudClnIEZyKHBv
-cHRDb250ZXh0KXAgRkEoLikyOTkgMTYxNSB5IEZxKCNpbmNsdWRlKTM1CmIoPHBvcHQuaD4p
-Mjk5IDE4MzEgeShpbnQpaChwb3B0U3R1ZmZBcmdzXChwb3B0Q29udGV4dCkzMQpiKGNvbiwp
-MzYgYihjaGFyKWYoKiopaShhcmd2XCk7KTI5OSAyMDQyIHkgRkEoVGhlKWsocGFzc2VkKWoK
-RnIoYXJndillIEZBKG11c3QpaChoYXZlKWYoYSloIEZyKE5VTEwpZiBGQShwb2ludGVyKWco
-YXMpaChpdHMpZwooXDAwMm5hbCllKGVsZW1lbnQuKTkwIGIoV2hlbikyOTkgMjE1NCB5IEZy
-KHBvcHRHZXROZXh0T3B0XChcKSkzOQpiIEZBKGlzKWoobmV4dClmKGNhbGxlZCwpayh0aGUp
-YyhcMjIzc3R1ZiluKGZlZFwyMjQpZihhciluKGd1bWVudHMpaAooYXIpbihlKWcodGhlKWco
-XDAwMnJzdClnKHRvKTI5OSAyMjY2IHkoYmUpZyhwYXJzZWQuKTg3CmIocG9wdCk0MyBiKHIp
-bihldHVybnMpZSh0bylnKHRoZSlnKG5vcm1hbClnKGFyKW4oZ3VtZW50cylnKG9uY2UpZyhh
-bGwpCmcodGhlKWcoc3R1ZiluKGZlZCkyOTkgMjM3OCB5KGFyKW4oZ3VtZW50cykyMyBiKGhh
-dmUpZyhiZWVuKWcKKGV4aGF1c3RlZC4pMCAyNzA3IHkgRmsoMjQuNikxMzIgYihTYW1wbGUp
-NDEgYihBcHBsaWNhdGlvbilwCjAgMjc5MiBWIDI5OSAzMDU0IGEgRkEoUm9iaW4sKTI4IGIo
-dGhlKWcoc2FtcGxlKWcoYXBwbGljYXRpb24pZyhvbilnCihwYWdlcyloKDI3NFwyMjYyODEp
-ZChvZilpKENoYXB0ZXIpZigxNSwpaSh1c2VzKWYocG9wdCkyOTkKMzE2NiB5KGZvcikzNiBi
-KGl0cylpKGFyKW4oZ3VtZW50KWUocGFyc2luZy4pNzMgYihJdCkzNwpiKHByKW4ob3ZpZGVz
-KWgoYSllKGdvb2QpaShleGFtcGxlKWYob2YpZyhob3cpZih0aGUpZyhwb3B0KTI5OQozMjc4
-IHkobGlicmFyeSkyMiBiKGlzKWkoZ2VuZXJhbGx5KWYodXNlZC4pMjk5IDM0ODkgeShSUE0s
-KTMxCmIoYSlnKHBvcHVsYXIpZihMaW51eCloKHBhY2thZ2UpZyhtYW5hZ2VtZW50KWYocHIp
-bihvZ3JhbSwpayhtYWtlcylkCihoZWF2eSlmKHVzZSkyOTkgMzYwMiB5KG9mKTIzIGIocG9w
-dCdzKWcoZmVhdHVyKW4oZXMuKTMzCmIoTWFueSkyMyBiKG9mKWcoaXRzKWcoY29tbWFuZFwy
-NTVsaW5lKWYoYXIpbihndW1lbnRzKWcoYXIpbihlKWcKKGltcGxlbWVudGVkKTI5OSAzNzE0
-IHkodGhyKW4ob3VnaCkzMCBiKHBvcHQpaShhbGlhc2VzLClnKHdoaWNoKWUKKG1ha2VzKWgo
-UlBNKWcoYW4pZihleGNlbGxlbnQpZyhleGFtcGxlKWgob2YpZyhob3cpZih0bykyOTkKMzgy
-NiB5KHRha2UpMzYgYihhZHZhbnRhZ2UpZyhvZiloKHRoZSlmKHBvcHQpaShsaWJyYXJ5KS0x
-MQpiKC4pNzMgYihGb3IpMzcgYihtb3IpbihlKWcoaW5mb3JtYXRpb24pZShvbilpKFJQTSwp
-ZihzZWUpMjk5CjM5MzggeShodHRwOi8pLTE0IGIoL3d3dyktOSBiKC5ycG0ub3IpbihnKXAg
-ZW9wCiUlVHJhaWxlcgplbmQKdXNlcmRpY3QgL2VuZC1ob29rIGtub3due2VuZC1ob29rfWlm
-CiUlRU9GCg==
-
---==_Exmh_-1506175120--
-
-
diff --git a/tests/ui-tests/mail-atchmt-svg.msg b/tests/ui-tests/mail-atchmt-svg.msg
deleted file mode 100644
index 53335795b0..0000000000
--- a/tests/ui-tests/mail-atchmt-svg.msg
+++ /dev/null
@@ -1,418 +0,0 @@
-X-Mailer: exmh version 2.0.3
-X-Exmh-Isig-CompType: unknown
-X-Exmh-Isig-Folder: drafts
-To:
-cc:
-Subject:
-Mime-Version: 1.0
-Content-Type: multipart/mixed ;
- boundary="==_Exmh_280722180"
---------
-This is a multipart MIME message.
-
---==_Exmh_280722180
-Content-Type: text/plain
-
-
-
---==_Exmh_280722180
-Content-Type: application/svg; name="lion.svg"
-Content-Description: lion.svg
-Content-Transfer-Encoding: base64
-Content-Disposition: attachment; filename="lion.svg"
-
-PD94bWwgdmVyc2lvbiA9ICIxLjAiIHN0YW5kYWxvbmUgPSAieWVzIj8+CjwhRE9DVFlQRSBz
-dmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgQXByaWwgMTk5OS8vRU4iCiAiaHR0cDovL3d3
-dy53My5vcmcvR3JhcGhpY3MvU1ZHL3N2Zy0xOTk5MDQxMi5kdGQiPgo8c3ZnIHdpZHRoID0g
-IjI0MnB4IiBoZWlnaHQ9IjM4M3B4Ij4KPGcgc3R5bGUgPSAic3Ryb2tlOiAjMDAwMDAwIiA+
-IAo8L2c+IAo8ZyBzdHlsZSA9ICJmaWxsOiAjZjJjYzk5IiA+IAogICA8cG9seWdvbiBwb2lu
-dHMgPSAiIDY5LDE4IDgyLDggOTksMyAxMTgsNSAxMzUsMTIgMTQ5LDIxIDE1NiwxMyAxNjUs
-OSAxNzcsMTMgMTgzLDI4IDE4MCw1MCAxNjQsOTEgMTU1LDEwNyAxNTQsMTE0IDE1MSwxMjEg
-MTQxLDEyNyAxMzksMTM2IDE1NSwyMDYgMTU3LDI1MSAxMjYsMzQyIDEzMywzNTcgMTI4LDM3
-NiA4MywzNzYgNzUsMzY4IDY3LDM1MCA2MSwzNTAgNTMsMzY5IDQsMzY5IDIsMzYxIDUsMzU0
-IDEyLDM0MiAxNiwzMjEgNCwyNTcgNCwyNDQgNywyMTggOSwxNzkgMjYsMTI3IDQzLDkzIDMy
-LDc3IDMwLDcwIDI0LDY3IDE2LDQ5IDE3LDM1IDE4LDIzIDMwLDEyIDQwLDcgNTMsNyA2Miwx
-MiA2OSwxOCA2OSwxOCA2OSwxOCIvPiAKPC9nPiAKPGcgc3R5bGUgPSAiZmlsbDogI2U1YjI3
-ZiIgPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxNDIsNzkgMTM2LDc0IDEzOCw4MiAxMzMs
-NzggMTMzLDg0IDEyNyw3OCAxMjgsODUgMTI0LDgwIDEyNSw4NyAxMTksODIgMTE5LDkwIDEy
-NSw5OSAxMjUsOTYgMTI4LDEwMCAxMjgsOTQgMTMxLDk4IDEzMiw5MyAxMzUsOTcgMTM2LDkz
-IDEzOCw5NyAxMzksOTQgMTQxLDk4IDE0Myw5NCAxNDQsODUgMTQyLDc5IDE0Miw3OSAxNDIs
-NzkiLz4gCjwvZz4gCjxnIHN0eWxlID0gImZpbGw6ICNlYjgwODAiID4gCiAgIDxwb2x5Z29u
-IHBvaW50cyA9ICIgMTI3LDEwMSAxMzIsMTAwIDEzNyw5OSAxNDQsMTAxIDE0MywxMDUgMTM1
-LDExMCAxMjcsMTAxIDEyNywxMDEgMTI3LDEwMSIvPiAKPC9nPiAKPGcgc3R5bGUgPSAiZmls
-bDogI2YyY2M5OSIgPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxNzgsMjI5IDE1NywyNDgg
-MTM5LDI5NiAxMjYsMzQ5IDEzNywzNTYgMTU4LDM1NyAxODMsMzQyIDIxMiwzMzIgMjM1LDI4
-OCAyMzUsMjYxIDIyOCwyNTIgMjEyLDI1MCAxODgsMjUxIDE3OCwyMjkgMTc4LDIyOSAxNzgs
-MjI5Ii8+IAo8L2c+IAo8ZyBzdHlsZSA9ICJmaWxsOiAjOWM4MjZiIiA+IAogICA8cG9seWdv
-biBwb2ludHMgPSAiIDU2LDIyOSA0OCwyNDEgNDgsMjUwIDU3LDI4MSA2MywzMjUgNzEsMzM4
-IDgxLDMxNSA3NiwzMjEgNzksMzExIDgzLDMwMSA3NSwzMDggODAsMjk4IDczLDMwMyA3Niwy
-OTYgNzEsMjk4IDc0LDI5MiA2OSwyOTMgNzQsMjg0IDc4LDI3OCA3MSwyNzggNzQsMjc0IDY4
-LDI3MyA3MCwyNjggNjYsMjY3IDY4LDI2MSA2MCwyNjYgNjIsMjU5IDY1LDI1MyA1NywyNTgg
-NTksMjUxIDU1LDI1NCA1NSwyNDggNjAsMjM3IDU0LDI0MCA1OCwyMzQgNTQsMjM2IDU2LDIy
-OSA1NiwyMjkgNTYsMjI5Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDc0LDM2MyA3OSwz
-NjggODEsMzY4IDg1LDM2MiA4OSwzNjMgOTIsMzcwIDk2LDM3MyAxMDEsMzcyIDEwOCwzNjEg
-MTEwLDM3MSAxMTMsMzczIDExNiwzNzEgMTIwLDM1OCAxMjIsMzYzIDEyMywzNzEgMTI2LDM3
-MSAxMjksMzY3IDEzMiwzNTcgMTM1LDM2MSAxMzAsMzc2IDEyNywzNzcgOTQsMzc4IDg0LDM3
-NiA3NiwzNzEgNzQsMzYzIDc0LDM2MyA3NCwzNjMiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9
-ICIgMjEyLDI1MCAyMTksMjUxIDIyOCwyNTggMjM2LDI3MCAyMzUsMjg3IDIyNSwzMDQgMjA1
-LDMzMiAxNzcsMzQzIDE3MSwzNTIgMTU4LDM1NyAxNjYsMzUyIDE2OCwzNDYgMTY4LDMzOSAx
-NjUsMzMzIDE1NSwzMjcgMTU1LDMyMyAxNjEsMzIwIDE2NSwzMTYgMTY5LDMxNiAxNjcsMzEy
-IDE3MSwzMTMgMTY4LDMwOCAxNzMsMzA5IDE3MCwzMDYgMTc3LDMwNiAxNzUsMzA4IDE3Nywz
-MTEgMTc0LDMxMSAxNzYsMzE2IDE3MSwzMTUgMTc0LDMxOSAxNjgsMzIwIDE2OCwzMjMgMTc1
-LDMyNyAxNzksMzMyIDE4MywzMjYgMTg0LDMzMiAxODksMzIzIDE5MCwzMjggMTk0LDMyMCAx
-OTQsMzI1IDE5OSwzMTYgMjAxLDMyMCAyMDQsMzEzIDIwNiwzMTYgMjA4LDMxMCAyMTEsMzA1
-IDIxOSwyOTggMjI2LDI4OCAyMjksMjc5IDIyOCwyNjYgMjI0LDI1OSAyMTcsMjUzIDIxMiwy
-NTAgMjEyLDI1MCAyMTIsMjUwIi8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDE1MSwyMDUg
-MTUxLDIzOCAxNDksMjUyIDE0MSwyNjggMTI4LDI4MiAxMjEsMzAxIDEzMCwzMDAgMTI2LDMx
-MyAxMTgsMzI0IDExNiwzMzcgMTIwLDM0NiAxMzMsMzUyIDEzMywzNDAgMTM3LDMzMyAxNDUs
-MzI5IDE1NiwzMjcgMTUzLDMxOSAxNTMsMjkxIDE1NywyNzEgMTcwLDI1OSAxNzgsMjc3IDE5
-MywyNTAgMTc0LDIxNiAxNTEsMjA1IDE1MSwyMDUgMTUxLDIwNSIvPiAKICAgPHBvbHlnb24g
-cG9pbnRzID0gIiA3OCwxMjcgOTAsMTQyIDk1LDE1NSAxMDgsMTY0IDEyNSwxNjcgMTM5LDE3
-NSAxNTAsMjA2IDE1MiwxOTEgMTQxLDE0MCAxMjEsMTQ4IDEwMCwxMzYgNzgsMTI3IDc4LDEy
-NyA3OCwxMjciLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMjEsNTggMzUsNjMgMzgsNjgg
-MzIsNjkgNDIsNzQgNDAsNzkgNDcsODAgNTQsODMgNDUsOTQgMzQsODEgMzIsNzMgMjQsNjYg
-MjEsNTggMjEsNTggMjEsNTgiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgNzEsMzQgNjcs
-MzQgNjYsMjcgNTksMjQgNTQsMTcgNDgsMTcgMzksMjIgMzAsMjYgMjgsMzEgMzEsMzkgMzgs
-NDYgMjksNDUgMzYsNTQgNDEsNjEgNDEsNzAgNTAsNjkgNTQsNzEgNTUsNTggNjcsNTIgNzYs
-NDMgNzYsMzkgNjgsNDQgNzEsMzQgNzEsMzQgNzEsMzQiLz4gCiAgIDxwb2x5Z29uIHBvaW50
-cyA9ICIgMTM5LDc0IDE0MSw4MyAxNDMsODkgMTQ0LDEwNCAxNDgsMTA0IDE1NSwxMDYgMTU0
-LDg2IDE1Nyw3NyAxNTUsNzIgMTUwLDc3IDE0NCw3NyAxMzksNzQgMTM5LDc0IDEzOSw3NCIv
-PiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxMDUsNDQgMTAyLDUzIDEwOCw1OCAxMTEsNjIg
-MTEyLDU1IDEwNSw0NCAxMDUsNDQgMTA1LDQ0Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAi
-IDE0MSw0OCAxNDEsNTQgMTQ0LDU4IDEzOSw2MiAxMzcsNjYgMTM2LDU5IDEzNyw1MiAxNDEs
-NDggMTQxLDQ4IDE0MSw0OCIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiA5OCwxMzUgMTA0
-LDEzMCAxMDUsMTM0IDEwOCwxMzIgMTA4LDEzNSAxMTIsMTM0IDExMywxMzcgMTE2LDEzNiAx
-MTYsMTM5IDExOSwxMzkgMTI0LDE0MSAxMjgsMTQwIDEzMywxMzggMTQwLDEzMyAxMzksMTQw
-IDEyNiwxNDYgMTA0LDE0NCA5OCwxMzUgOTgsMTM1IDk4LDEzNSIvPiAKICAgPHBvbHlnb24g
-cG9pbnRzID0gIiA5NywxMTYgMTAzLDExOSAxMDMsMTE2IDExMSwxMTggMTE2LDExNyAxMjIs
-MTE0IDEyNywxMDcgMTM1LDExMSAxNDIsMTA3IDE0MSwxMTQgMTQ1LDExOCAxNDksMTIxIDE0
-NSwxMjUgMTQwLDEyNCAxMjcsMTIxIDExMywxMjUgMTAwLDEyNCA5NywxMTYgOTcsMTE2IDk3
-LDExNiIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxNDcsMzMgMTUyLDM1IDE1NywzNCAx
-NTMsMzEgMTYwLDMxIDE1NiwyOCAxNjEsMjggMTU5LDI0IDE2MywyNSAxNjMsMjEgMTY1LDIy
-IDE3MCwyMyAxNjcsMTcgMTcyLDIxIDE3NCwxOCAxNzUsMjMgMTc2LDIyIDE3NywyOCAxNzcs
-MzMgMTc0LDM3IDE3NiwzOSAxNzQsNDQgMTcxLDQ5IDE2OCw1MyAxNjQsNTcgMTU5LDY4IDE1
-Niw3MCAxNTQsNjAgMTUwLDUxIDE0Niw0MyAxNDQsMzUgMTQ3LDMzIDE0NywzMyAxNDcsMzMi
-Lz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgODUsNzIgODksNzQgOTMsNzUgMTAwLDc2IDEw
-NSw3NSAxMDIsNzkgOTQsNzkgODgsNzYgODUsNzIgODUsNzIgODUsNzIiLz4gCiAgIDxwb2x5
-Z29uIHBvaW50cyA9ICIgODYsMjE0IDc5LDIyMSA3NiwyMzIgODIsMjI1IDc4LDIzOSA4Miwy
-MzQgNzgsMjQ1IDgxLDI0MyA3OSwyNTUgODQsMjUwIDg0LDI2NyA4NywyNTQgOTAsMjcxIDkw
-LDI1NyA5NSwyNzEgOTMsMjU2IDk1LDI0OSA5MiwyNTIgOTMsMjQzIDg5LDI1MyA4OSwyNDEg
-ODYsMjUwIDg3LDIzNiA4MywyNDUgODcsMjMxIDgyLDIzMSA5MCwyMTkgODQsMjIxIDg2LDIx
-NCA4NiwyMTQgODYsMjE0Ii8+IAo8L2c+IAo8ZyBzdHlsZSA9ICJmaWxsOiAjZmZjYzdmIiA+
-IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDkzLDY4IDk2LDcyIDEwMCw3MyAxMDYsNzIgMTA4
-LDY2IDEwNSw2MyAxMDAsNjIgOTMsNjggOTMsNjggOTMsNjgiLz4gCiAgIDxwb2x5Z29uIHBv
-aW50cyA9ICIgMTQ0LDY0IDE0Miw2OCAxNDIsNzMgMTQ2LDc0IDE1MCw3MyAxNTQsNjQgMTQ5
-LDYyIDE0NCw2NCAxNDQsNjQgMTQ0LDY0Ii8+IAo8L2c+IAo8ZyBzdHlsZSA9ICJmaWxsOiAj
-OWM4MjZiIiA+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDU3LDkxIDQyLDExMSA1MiwxMDUg
-NDEsMTE3IDUzLDExMiA0NiwxMjAgNTMsMTE2IDUwLDEyNCA1NywxMTkgNTUsMTI3IDYxLDEy
-MiA2MCwxMzAgNjcsMTI2IDY2LDEzNCA3MSwxMjkgNzIsMTM2IDc3LDEzMCA3NiwxMzcgODAs
-MTMzIDgyLDEzOCA4NiwxMzUgOTYsMTM1IDk0LDEyOSA4NiwxMjQgODMsMTE3IDc3LDEyMyA3
-OSwxMTcgNzMsMTIwIDc1LDExMiA2OCwxMTYgNzEsMTExIDY1LDExNCA2OSwxMDcgNjMsMTEw
-IDY4LDEwMiA2MSwxMDcgNjYsOTggNjEsMTAzIDYzLDk3IDU3LDk5IDU3LDkxIDU3LDkxIDU3
-LDkxIi8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDgzLDc5IDc2LDc5IDY3LDgyIDc1LDgz
-IDY1LDg4IDc2LDg3IDY1LDkyIDc2LDkxIDY4LDk2IDc3LDk1IDcwLDk5IDgwLDk4IDcyLDEw
-NCA4MCwxMDIgNzYsMTA4IDg1LDEwMyA5MiwxMDEgODcsOTggOTMsOTYgODYsOTQgOTEsOTMg
-ODUsOTEgOTMsODkgOTksODkgMTA1LDkzIDEwNyw4NSAxMDIsODIgOTIsODAgODMsNzkgODMs
-NzkgODMsNzkiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTA5LDc3IDExMSw4MyAxMDks
-ODkgMTEzLDk0IDExNyw5MCAxMTcsODEgMTE0LDc4IDEwOSw3NyAxMDksNzcgMTA5LDc3Ii8+
-IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDEyMiwxMjggMTI3LDEyNiAxMzQsMTI3IDEzNiwx
-MjkgMTM0LDEzMCAxMzAsMTI4IDEyNCwxMjkgMTIyLDEyOCAxMjIsMTI4IDEyMiwxMjgiLz4g
-CiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgNzgsMjcgODIsMzIgODAsMzMgODIsMzYgNzgsMzcg
-ODIsNDAgNzgsNDIgODEsNDYgNzYsNDcgNzgsNDkgNzQsNTAgODIsNTIgODcsNTAgODMsNDgg
-OTEsNDYgODYsNDUgOTEsNDIgODgsNDAgOTIsMzcgODYsMzQgOTAsMzEgODYsMjkgODksMjYg
-NzgsMjcgNzgsMjcgNzgsMjciLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgODIsMTcgOTIs
-MjAgNzksMjEgOTAsMjUgODEsMjUgOTQsMjggOTMsMjYgMTAxLDMwIDEwMSwyNiAxMDcsMzMg
-MTA4LDI4IDExMSw0MCAxMTMsMzQgMTE1LDQ1IDExNywzOSAxMTksNTQgMTIxLDQ2IDEyNCw1
-OCAxMjYsNDcgMTI5LDU5IDEzMCw0OSAxMzQsNTggMTMzLDQ0IDEzNyw0OCAxMzMsMzcgMTM3
-LDQwIDEzMywzMiAxMjYsMjAgMTM1LDI2IDEzMiwxOSAxMzgsMjMgMTM1LDE3IDE0MiwxOCAx
-MzIsMTEgMTE2LDYgOTQsNiA3OCwxMSA5MiwxMiA4MCwxNCA5MCwxNiA4MiwxNyA4MiwxNyA4
-MiwxNyIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxNDIsMjM0IDEzMiwyMjcgMTI0LDIy
-MyAxMTUsMjIwIDExMCwyMjUgMTE4LDIyNCAxMjcsMjI5IDEzNSwyMzYgMTIyLDIzNCAxMTUs
-MjM3IDExMywyNDIgMTIxLDIzOCAxMzksMjQzIDEyMSwyNDUgMTExLDI1NCA5NSwyNTQgMTAy
-LDI0NCAxMDQsMjM1IDExMCwyMjkgMTAwLDIzMSAxMDQsMjI0IDExMywyMTYgMTIyLDIxNSAx
-MzIsMjE3IDE0MSwyMjQgMTQ1LDIzMCAxNDksMjQwIDE0MiwyMzQgMTQyLDIzNCAxNDIsMjM0
-Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDExNSwyNTIgMTI1LDI0OCAxMzcsMjQ5IDE0
-MywyNTggMTM0LDI1NSAxMjUsMjU0IDExNSwyNTIgMTE1LDI1MiAxMTUsMjUyIi8+IAogICA8
-cG9seWdvbiBwb2ludHMgPSAiIDExNCwyMTIgMTMwLDIxMyAxNDAsMjE5IDE0NywyMjUgMTQ0
-LDIxNCAxMzcsMjA5IDEyOCwyMDcgMTE0LDIxMiAxMTQsMjEyIDExNCwyMTIiLz4gCiAgIDxw
-b2x5Z29uIHBvaW50cyA9ICIgMTAyLDI2MyAxMDgsMjU4IDExNywyNTcgMTMxLDI1OCAxMTYs
-MjYwIDEwOSwyNjUgMTAyLDI2MyAxMDIsMjYzIDEwMiwyNjMiLz4gCiAgIDxwb2x5Z29uIHBv
-aW50cyA9ICIgNTEsMjQxIDM1LDIyNCA0MCwyMzggMjMsMjI0IDMxLDI0MiAxOSwyMzkgMjgs
-MjQ3IDE3LDI0NiAyNSwyNTAgMzcsMjU0IDM5LDI2MyA0NCwyNzEgNDcsMjk0IDQ4LDMxNyA1
-MSwzMjggNjAsMzUxIDYwLDMyMyA1MywyNjIgNDcsMjQ2IDUxLDI0MSA1MSwyNDEgNTEsMjQx
-Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDIsMzY0IDksMzY3IDE0LDM2NiAxOCwzNTUg
-MjAsMzY0IDI2LDM2NiAzMSwzNTcgMzUsMzY0IDM5LDM2NCA0MiwzNTcgNDcsMzYzIDUzLDM2
-MCA1OSwzNTcgNTQsMzY5IDcsMzczIDIsMzY0IDIsMzY0IDIsMzY0Ii8+IAogICA8cG9seWdv
-biBwb2ludHMgPSAiIDcsMzQ5IDE5LDM0NSAyNSwzMzkgMTgsMzQxIDIzLDMzMyAyOCwzMjYg
-MjMsMzI2IDI3LDMyMCAyMywzMTYgMjUsMzExIDIwLDI5OCAxNSwyNzcgMTIsMjY0IDksMjQ5
-IDEwLDIyMyAzLDI0OCA1LDI2MSAxNSwzMDcgMTcsMzI2IDExLDM0MyA3LDM0OSA3LDM0OSA3
-LDM0OSIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxMSwyMjYgMTUsMjMxIDI1LDIzNiAx
-OCwyMjcgMTEsMjI2IDExLDIyNiAxMSwyMjYiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIg
-MTMsMjE0IDE5LDIxNyAzMiwyMjcgMjMsMjE0IDE2LDIwOCAxNSwxOTAgMjQsMTQ4IDMxLDEy
-MSAyNCwxMzcgMTQsMTcwIDgsMTg5IDEzLDIxNCAxMywyMTQgMTMsMjE0Ii8+IAogICA8cG9s
-eWdvbiBwb2ludHMgPSAiIDIwMiwyNTQgMTk1LDI1OCAxOTksMjYwIDE5MywyNjMgMTk3LDI2
-MyAxOTAsMjY4IDE5NiwyNjggMTkxLDI3MyAxODgsMjgyIDIwMCwyNzIgMTk0LDI3MiAyMDEs
-MjY2IDE5NywyNjUgMjA0LDI2MiAyMDAsMjU4IDIwNCwyNTYgMjAyLDI1NCAyMDIsMjU0IDIw
-MiwyNTQiLz4gCjwvZz4gCjxnIHN0eWxlID0gImZpbGw6ICM4NDU0MzMiID4gCiAgIDxwb2x5
-Z29uIHBvaW50cyA9ICIgMTUxLDIxMyAxNjUsMjEyIDE3OSwyMjUgMTg5LDI0NiAxODcsMjYy
-IDE3OSwyNzUgMTc2LDI2MyAxNzcsMjQ3IDE3MSwyMzMgMTYzLDIzMCAxNjUsMjUxIDE1Nywy
-NjQgMTQ2LDI5OCAxNDUsMzIxIDEzMywzMjYgMTQzLDI4NSAxNTQsMjYwIDE1MywyNDAgMTUx
-LDIxMyAxNTEsMjEzIDE1MSwyMTMiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgOTEsMTMy
-IDk1LDE0NSA5NywxNTQgMTA0LDE0OCAxMDcsMTU1IDEwOSwxNTAgMTExLDE1OCAxMTUsMTUy
-IDExOCwxNTkgMTIwLDE1MyAxMjUsMTYxIDEyNiwxNTUgMTMzLDE2NCAxMzIsMTU0IDEzNywx
-NjMgMTM3LDE1MiAxNDIsMTYzIDE0NywxODYgMTUyLDE5MiAxNDgsMTY3IDE0MSwxNDMgMTI0
-LDE0NSAxMDUsMTQzIDkxLDEzMiA5MSwxMzIgOTEsMTMyIi8+IAo8L2c+IAo8ZyBzdHlsZSA9
-ICJmaWxsOiAjOWM4MjZiIiA+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDMxLDU3IDIzLDUy
-IDI2LDUxIDIwLDQ0IDIzLDQyIDIxLDM2IDIyLDI5IDI1LDIzIDI0LDMyIDMwLDQzIDI2LDQx
-IDMwLDUwIDI2LDQ4IDMxLDU3IDMxLDU3IDMxLDU3Ii8+IAogICA8cG9seWdvbiBwb2ludHMg
-PSAiIDE0NywyMSAxNDksMjggMTU1LDIxIDE2MSwxNiAxNjcsMTQgMTc1LDE1IDE3MywxMSAx
-NjEsOSAxNDcsMjEgMTQ3LDIxIDE0NywyMSIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAx
-ODEsMzkgMTc1LDUxIDE2OSw1NyAxNzEsNjUgMTY1LDY4IDE2NSw3NSAxNjAsNzYgMTYyLDkx
-IDE3MSw3MSAxODAsNTEgMTgxLDM5IDE4MSwzOSAxODEsMzkiLz4gCiAgIDxwb2x5Z29uIHBv
-aW50cyA9ICIgMTMyLDM0NiAxMzksMzQ4IDE0MSwzNDYgMTQyLDM0MSAxNDcsMzQyIDE0Mywz
-NTUgMTMzLDM1MCAxMzIsMzQ2IDEzMiwzNDYgMTMyLDM0NiIvPiAKICAgPHBvbHlnb24gcG9p
-bnRzID0gIiAxNDYsMzU1IDE1MSwzNTIgMTU1LDM0OCAxNTcsMzQzIDE2MCwzNDkgMTUxLDM1
-NiAxNDcsMzU3IDE0NiwzNTUgMTQ2LDM1NSAxNDYsMzU1Ii8+IAogICA8cG9seWdvbiBwb2lu
-dHMgPSAiIDk5LDI2NiAxMDAsMjgxIDk0LDMwNSA4NiwzMjIgNzgsMzMyIDcyLDM0NiA3Mywz
-MzEgOTEsMjkxIDk5LDI2NiA5OSwyNjYgOTksMjY2Ii8+IAogICA8cG9seWdvbiBwb2ludHMg
-PSAiIDIwLDM0NyAzMiwzNDIgNDUsMzQwIDU0LDM0NSA0NSwzNTAgNDIsMzUzIDM4LDM1MCAz
-MSwzNTMgMjksMzU2IDIzLDM1MCAxOSwzNTMgMTUsMzQ5IDIwLDM0NyAyMCwzNDcgMjAsMzQ3
-Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDc4LDM0NCA4NiwzNDQgOTIsMzQ5IDg4LDM1
-OCA4NCwzNTIgNzgsMzQ0IDc4LDM0NCA3OCwzNDQiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9
-ICIgOTMsMzQ3IDEwNCwzNDQgMTE3LDM0NSAxMjQsMzU0IDEyMSwzNTcgMTE2LDM1MSAxMTIs
-MzUxIDEwOCwzNTUgMTAyLDM1MSA5MywzNDcgOTMsMzQ3IDkzLDM0NyIvPiAKPC9nPiAKPGcg
-c3R5bGUgPSAiZmlsbDogIzAwMDAwMCIgPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxMDUs
-MTIgMTExLDE4IDExMywyNCAxMTMsMjkgMTE5LDM0IDExNiwyMyAxMTIsMTYgMTA1LDEyIDEw
-NSwxMiAxMDUsMTIiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTIyLDI3IDEyNSwzNCAx
-MjcsNDMgMTI4LDM0IDEyNSwyOSAxMjIsMjcgMTIyLDI3IDEyMiwyNyIvPiAKICAgPHBvbHln
-b24gcG9pbnRzID0gIiAxMTUsMTMgMTIyLDE5IDEyMiwxNSAxMTMsMTAgMTE1LDEzIDExNSwx
-MyAxMTUsMTMiLz4gCjwvZz4gCjxnIHN0eWxlID0gImZpbGw6ICNmZmU1YjIiID4gCiAgIDxw
-b2x5Z29uIHBvaW50cyA9ICIgMTE2LDE3MiAxMDcsMTgyIDk4LDE5MyA5OCwxODMgOTAsMTk5
-IDg5LDE4OSA4NCwyMDcgODgsMjA2IDg3LDIxNSA5NSwyMDYgOTMsMjE5IDkxLDIzMCA5OCwy
-MTYgOTcsMjI2IDEwNCwyMTQgMTEyLDIwOSAxMDQsMjA4IDExMywyMDIgMTI2LDIwMCAxMzks
-MjA3IDEzMiwxOTggMTQyLDIwMyAxMzQsMTkyIDE0MiwxOTUgMTM0LDE4NyAxNDAsMTg1IDEz
-MCwxODEgMTM2LDE3NyAxMjYsMTc3IDEyNSwxNzEgMTE2LDE4MCAxMTYsMTcyIDExNiwxNzIg
-MTE2LDE3MiIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiA3NCwyMjAgNjcsMjMwIDY3LDIy
-MSA1OSwyMzUgNjMsMjMzIDYwLDI0OCA3MCwyMzIgNjUsMjQ5IDcxLDI0MyA2NywyNTYgNzMs
-MjUwIDY5LDI2MiA3MywyNTkgNzEsMjY3IDc2LDI2MiA3MiwyNzEgNzgsMjcwIDc2LDI3NSA4
-MiwyNzQgNzgsMjkwIDg2LDI3OSA4NiwyODkgOTIsMjc0IDg4LDI3NSA4NywyNjQgODIsMjcw
-IDgyLDI1OCA3NywyNTcgNzgsMjQ3IDczLDI0NiA3NywyMzMgNzIsMjM2IDc0LDIyMCA3NCwy
-MjAgNzQsMjIwIi8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDEzMywyMzAgMTQ3LDI0MiAx
-NDgsMjUwIDE0NSwyNTQgMTM4LDI0NyAxMjksMjQ2IDE0MiwyNDUgMTM4LDI0MSAxMjgsMjM3
-IDEzNywyMzggMTMzLDIzMCAxMzMsMjMwIDEzMywyMzAiLz4gCiAgIDxwb2x5Z29uIHBvaW50
-cyA9ICIgMTMzLDI2MSAxMjUsMjYxIDExNiwyNjMgMTExLDI2NyAxMjUsMjY1IDEzMywyNjEg
-MTMzLDI2MSAxMzMsMjYxIi8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDEyMSwyNzEgMTA5
-LDI3MyAxMDMsMjc5IDk5LDMwNSA5MiwzMTYgODUsMzI3IDgzLDMzNSA4OSwzNDAgOTcsMzQx
-IDk0LDMzNiAxMDEsMzM2IDk2LDMzMSAxMDMsMzMwIDk3LDMyNyAxMDgsMzI1IDk5LDMyMiAx
-MDksMzIxIDEwMCwzMTggMTEwLDMxNyAxMDUsMzE0IDExMCwzMTIgMTA3LDMxMCAxMTMsMzA4
-IDEwNSwzMDYgMTE0LDMwMyAxMDUsMzAxIDExNSwyOTggMTA3LDI5NSAxMTUsMjk0IDEwOCwy
-OTMgMTE3LDI5MSAxMDksMjg5IDExNywyODYgMTA5LDI4NiAxMTgsMjgzIDExMiwyODEgMTE4
-LDI3OSAxMTQsMjc4IDExOSwyNzYgMTE1LDI3NCAxMjEsMjcxIDEyMSwyNzEgMTIxLDI3MSIv
-PiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiA3OSwzNjQgNzQsMzU5IDc0LDM1MyA3NiwzNDcg
-ODAsMzUxIDgzLDM1NiA4MiwzNjAgNzksMzY0IDc5LDM2NCA3OSwzNjQiLz4gCiAgIDxwb2x5
-Z29uIHBvaW50cyA9ICIgOTEsMzYzIDkzLDM1NiA5NywzNTMgMTAzLDM1NSAxMDUsMzYwIDEw
-MywzNjYgOTksMzcxIDk0LDM2OCA5MSwzNjMgOTEsMzYzIDkxLDM2MyIvPiAKICAgPHBvbHln
-b24gcG9pbnRzID0gIiAxMTAsMzU1IDExNCwzNTMgMTE4LDM1NyAxMTcsMzYzIDExMywzNjkg
-MTExLDM2MiAxMTAsMzU1IDExMCwzNTUgMTEwLDM1NSIvPiAKICAgPHBvbHlnb24gcG9pbnRz
-ID0gIiAxMjYsMzU0IDEyMywzNTggMTI0LDM2NyAxMjYsMzY5IDEyOSwzNjEgMTI5LDM1NyAx
-MjYsMzU0IDEyNiwzNTQgMTI2LDM1NCIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAzMCwx
-NTQgMjQsMTY2IDIwLDE4MiAyMywxOTQgMjksMjA4IDM3LDIxOCA0MSwyMTAgNDEsMjIzIDQ2
-LDIxNCA0NiwyMjcgNTIsMjE2IDUyLDIyNyA2MSwyMTYgNTksMjI1IDY4LDIxMyA3MywyMTkg
-NzAsMjA3IDc3LDIxMiA2OSwyMDAgNzcsMjAyIDcwLDE5NCA3OCwxOTcgNjgsMTg3IDc2LDE4
-MiA2NCwxODIgNTgsMTc1IDU4LDE4NSA1MywxNzcgNTAsMTg2IDQ2LDE3MSA0NCwxODIgMzks
-MTY3IDM2LDE3MiAzNiwxNjIgMzAsMTY2IDMwLDE1NCAzMCwxNTQgMzAsMTU0Ii8+IAogICA8
-cG9seWdvbiBwb2ludHMgPSAiIDQ0LDEzMCA0MSwxMzcgNDUsMTM2IDQzLDE1MCA0OCwxNDIg
-NDgsMTU3IDUzLDE1MCA1MiwxNjQgNjAsMTU2IDYxLDE2OSA2NCwxNjUgNjYsMTc1IDcwLDE2
-NyA3NCwxNzYgNzcsMTY4IDgwLDE4MyA4NSwxNzIgOTAsMTgyIDkzLDE3NCA5OCwxODEgOTks
-MTczIDEwNCwxNzUgMTA1LDE2OSAxMTQsMTY4IDEwMiwxNjMgOTUsMTU3IDk0LDE2NiA5MCwx
-NTQgODcsMTYyIDgyLDE0OSA3NSwxNTkgNzIsMTQ4IDY4LDE1NSA2NywxNDMgNjIsMTQ4IDYy
-LDEzOCA1OCwxNDUgNTYsMTMzIDUyLDE0MiA1MiwxMjggNDksMTM0IDQ3LDEyNSA0NCwxMzAg
-NDQsMTMwIDQ0LDEzMCIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxMywyMTYgMTksMjE5
-IDM2LDIzMSAyMiwyMjMgMTYsMjIyIDIyLDIyNyAxMiwyMjQgMTMsMjIwIDE2LDIyMCAxMywy
-MTYgMTMsMjE2IDEzLDIxNiIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxMCwyMzEgMTQs
-MjM2IDI1LDIzOSAyNywyMzcgMTksMjM0IDEwLDIzMSAxMCwyMzEgMTAsMjMxIi8+IAogICA8
-cG9seWdvbiBwb2ludHMgPSAiIDksMjQ1IDE0LDI0MiAyNSwyNDUgMTMsMjQ1IDksMjQ1IDks
-MjQ1IDksMjQ1Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDMzLDI1NSAyNiwyNTMgMTgs
-MjU0IDI1LDI1NiAxOCwyNTggMjcsMjYwIDE4LDI2MyAyNywyNjUgMTksMjY3IDI5LDI3MCAy
-MSwyNzIgMjksMjc2IDIxLDI3OCAzMCwyODEgMjIsMjgzIDMxLDI4NyAyNCwyODggMzIsMjky
-IDIzLDI5MyAzNCwyOTggMjYsMjk5IDM3LDMwMyAzMiwzMDUgMzksMzA5IDMzLDMwOSAzOSwz
-MTQgMzQsMzE0IDQwLDMxOCAzNCwzMTcgNDAsMzIxIDM0LDMyMSA0MSwzMjYgMzMsMzI2IDQw
-LDMzMCAzMywzMzIgMzksMzMzIDMzLDMzNyA0MiwzMzcgNTQsMzQxIDQ5LDMzNyA1MiwzMzUg
-NDcsMzMwIDUwLDMzMCA0NSwzMjUgNDksMzI1IDQ1LDMyMSA0OCwzMjEgNDUsMzE2IDQ2LDMw
-NiA0NSwyODYgNDMsMjc0IDM2LDI2MSAzMywyNTUgMzMsMjU1IDMzLDI1NSIvPiAKICAgPHBv
-bHlnb24gcG9pbnRzID0gIiA3LDM1OCA5LDM1MSAxNCwzNTEgMTcsMzU5IDExLDM2NCA3LDM1
-OCA3LDM1OCA3LDM1OCIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiA0NCwzNTQgNDksMzUx
-IDUyLDM1NSA0OSwzNjEgNDQsMzU0IDQ0LDM1NCA0NCwzNTQiLz4gCiAgIDxwb2x5Z29uIHBv
-aW50cyA9ICIgMzIsMzU3IDM3LDM1MyA0MCwzNTggMzYsMzYxIDMyLDM1NyAzMiwzNTcgMzIs
-MzU3Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDEzOSwzMzQgMTQ1LDMzMCAxNTQsMzMw
-IDE1OCwzMzQgMTU0LDM0MSAxNTIsMzQ4IDE0NSwzNTAgMTQ5LDM0MCAxNDcsMzM2IDE0MSwz
-MzkgMTM5LDM0NSAxMzYsMzQyIDEzNiwzMzkgMTM5LDMzNCAxMzksMzM0IDEzOSwzMzQiLz4g
-CiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMjA4LDI1OSAyMTUsMjU5IDIxMiwyNTUgMjIwLDI1
-OSAyMjQsMjYzIDIyNSwyNzQgMjI0LDI4MyAyMjAsMjkyIDIwOCwzMDAgMjA2LDMwOCAyMDMs
-MzA0IDE5OSwzMTUgMTk3LDMwOSAxOTUsMzE4IDE5MywzMTMgMTkwLDMyMiAxOTAsMzE2IDE4
-NSwzMjUgMTgyLDMxOCAxODAsMzI1IDE3MiwzMjEgMTc4LDMyMCAxNzYsMzEzIDE4NiwzMTIg
-MTgwLDMwNyAxODgsMzA3IDE4NCwzMDMgMTkxLDMwMiAxODYsMjk5IDE5NSwyOTQgMTg3LDI5
-MCAxOTcsMjg4IDE5MiwyODYgMjAxLDI4MyAxOTQsMjgwIDIwMywyNzcgMTk4LDI3NSAyMDcs
-MjcxIDIwMCwyNjkgMjA5LDI2NSAyMDQsMjY1IDIxMiwyNjIgMjA4LDI1OSAyMDgsMjU5IDIw
-OCwyNTkiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTA2LDEyNiAxMDYsMTMxIDEwOSwx
-MzIgMTExLDEzNCAxMTUsMTMyIDExNSwxMzUgMTE5LDEzMyAxMTgsMTM3IDEyMywxMzcgMTI4
-LDEzNyAxMzMsMTM0IDEzNiwxMzAgMTM2LDEyNyAxMzIsMTI0IDExOCwxMjggMTEyLDEyOCAx
-MDYsMTI2IDEwNiwxMjYgMTA2LDEyNiIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxMDcs
-MTE0IDEwMSwxMTAgOTgsMTAyIDEwNSw5NyAxMTEsOTggMTE5LDEwMiAxMjEsMTA4IDExOCwx
-MTIgMTEzLDExNSAxMDcsMTE0IDEwNywxMTQgMTA3LDExNCIvPiAKICAgPHBvbHlnb24gcG9p
-bnRzID0gIiAxNDgsMTA2IDE0NSwxMTAgMTQ2LDExNiAxNTAsMTE4IDE1MiwxMTEgMTUxLDEw
-NyAxNDgsMTA2IDE0OCwxMDYgMTQ4LDEwNiIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiA4
-MCw1NSA3MCw1MiA3NSw1OCA2Myw1NyA3Miw2MSA1Nyw2MSA2Nyw2NiA1Nyw2NyA2Miw2OSA1
-NCw3MSA2MSw3MyA1NCw3NyA2Myw3OCA1Myw4NSA2MCw4NCA1Niw5MCA2OSw4NCA2Myw4MiA3
-NSw3NiA3MCw3NSA3Nyw3MiA3Miw3MSA3OCw2OSA3Miw2NiA4MSw2NyA3OCw2NCA4Miw2MyA4
-MCw2MCA4Niw2MiA4MCw1NSA4MCw1NSA4MCw1NSIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0g
-IiA4Nyw1NiA5MSw1MiA5Niw1MCAxMDIsNTYgOTgsNTYgOTIsNjAgODcsNTYgODcsNTYgODcs
-NTYiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgODUsNjggODksNzMgOTgsNzYgMTA2LDc0
-IDk2LDczIDkxLDcwIDg1LDY4IDg1LDY4IDg1LDY4Ii8+IAogICA8cG9seWdvbiBwb2ludHMg
-PSAiIDExNSw1NyAxMTQsNjQgMTExLDY0IDExNSw3NSAxMjIsODEgMTIyLDc0IDEyNiw3OSAx
-MjYsNzQgMTMxLDc4IDEzMCw3MiAxMzMsNzcgMTMxLDY4IDEyNiw2MSAxMTksNTcgMTE1LDU3
-IDExNSw1NyAxMTUsNTciLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTQ1LDQ4IDE0Myw1
-MyAxNDcsNTkgMTUxLDU5IDE1MCw1NSAxNDUsNDggMTQ1LDQ4IDE0NSw0OCIvPiAKICAgPHBv
-bHlnb24gcG9pbnRzID0gIiAyNiwyMiAzNCwxNSA0MywxMCA1MiwxMCA1OSwxNiA0NywxNSAz
-MiwyMiAyNiwyMiAyNiwyMiAyNiwyMiIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxNjAs
-MTkgMTUyLDI2IDE0OSwzNCAxNTQsMzMgMTUyLDMwIDE1NywzMCAxNTUsMjYgMTU4LDI3IDE1
-NywyMyAxNjEsMjMgMTYwLDE5IDE2MCwxOSAxNjAsMTkiLz4gCjwvZz4gCjxnIHN0eWxlID0g
-ImZpbGw6ICMwMDAwMDAiID4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgOTgsMTE3IDEwNSwx
-MjIgMTA5LDEyMiAxMDUsMTE3IDExMywxMjAgMTIxLDEyMCAxMzAsMTEyIDEyOCwxMDggMTIz
-LDEwMyAxMjMsOTkgMTI4LDEwMSAxMzIsMTA2IDEzNSwxMDkgMTQyLDEwNSAxNDIsMTAxIDE0
-NSwxMDEgMTQ1LDkxIDE0OCwxMDEgMTQ1LDEwNSAxMzYsMTEyIDEzNSwxMTYgMTQzLDEyNCAx
-NDgsMTIwIDE1MCwxMjIgMTQyLDEyOCAxMzMsMTIyIDEyMSwxMjUgMTEyLDEyNiAxMDMsMTI1
-IDEwMCwxMjkgOTYsMTI0IDk4LDExNyA5OCwxMTcgOTgsMTE3Ii8+IAogICA8cG9seWdvbiBw
-b2ludHMgPSAiIDE0NiwxMTggMTUyLDExOCAxNTIsMTE1IDE0OSwxMTUgMTQ2LDExOCAxNDYs
-MTE4IDE0NiwxMTgiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTQ4LDExMiAxNTQsMTEx
-IDE1NCwxMDkgMTQ5LDEwOSAxNDgsMTEyIDE0OCwxMTIgMTQ4LDExMiIvPiAKICAgPHBvbHln
-b24gcG9pbnRzID0gIiAxMDYsMTEyIDEwOCwxMTUgMTE0LDExNiAxMTgsMTE0IDEwNiwxMTIg
-MTA2LDExMiAxMDYsMTEyIi8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDEwOCwxMDggMTEx
-LDExMCAxMTYsMTEwIDExOSwxMDggMTA4LDEwOCAxMDgsMTA4IDEwOCwxMDgiLz4gCiAgIDxw
-b2x5Z29uIHBvaW50cyA9ICIgMTA2LDEwNCAxMDksMTA1IDExNywxMDYgMTE1LDEwNCAxMDYs
-MTA0IDEwNiwxMDQgMTA2LDEwNCIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiA1MCwyNSA0
-MSwyNiAzNCwzMyAzOSw0MyA0OSw1OCAzNiw1MSA0Nyw2OCA1NSw2OSA1NCw1OSA2MSw1NyA3
-NCw0NiA2MCw1MiA2Nyw0MiA1Nyw0OCA2MSw0MCA1NCw0NSA2MCwzNiA1OSwyOSA0OCwzOCA1
-MiwzMCA0NywzMiA1MCwyNSA1MCwyNSA1MCwyNSIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0g
-IiAxNDcsMzQgMTUyLDQxIDE1NSw0OSAxNjEsNTMgMTU3LDQ3IDE2NCw0NyAxNTgsNDMgMTY4
-LDQ0IDE1OSw0MCAxNjQsMzcgMTY5LDM3IDE2NCwzMyAxNjksMzQgMTY1LDI4IDE3MCwzMCAx
-NzAsMjUgMTczLDI5IDE3NSwyNyAxNzYsMzIgMTczLDM2IDE3NSwzOSAxNzIsNDIgMTcyLDQ2
-IDE2OCw0OSAxNzAsNTUgMTYyLDU3IDE1OCw2MyAxNTUsNTggMTUzLDUwIDE0OSw0NiAxNDcs
-MzQgMTQ3LDM0IDE0NywzNCIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxNTUsNzEgMTU5
-LDgwIDE1Nyw5MyAxNTcsMTAyIDE1NSwxMDggMTUwLDEwMSAxNDksOTMgMTU0LDEwMSAxNTIs
-OTEgMTUxLDgzIDE1NSw3OSAxNTUsNzEgMTU1LDcxIDE1NSw3MSIvPiAKICAgPHBvbHlnb24g
-cG9pbnRzID0gIiAxMTIsNzggMTE1LDgxIDExNCw5MSAxMTIsODcgMTEzLDgyIDExMiw3OCAx
-MTIsNzggMTEyLDc4Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDc4LDI4IDY0LDE3IDU4
-LDExIDQ3LDkgMzYsMTAgMjgsMTYgMjEsMjYgMTgsNDEgMjAsNTEgMjMsNjEgMzMsNjUgMjgs
-NjggMzcsNzQgMzYsODEgNDMsODcgNDgsOTAgNDMsMTAwIDQwLDk4IDM5LDkwIDMxLDgwIDMw
-LDcyIDIyLDcxIDE3LDYxIDE0LDQ2IDE2LDI4IDIzLDE3IDMzLDkgNDUsNiA1NCw2IDY1LDEy
-IDc4LDI4IDc4LDI4IDc4LDI4Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDY3LDE4IDc2
-LDkgODcsNSAxMDEsMiAxMTgsMyAxMzUsOCAxNDksMjAgMTQ5LDI2IDE0NCwxOSAxMzIsMTIg
-MTIxLDkgMTA1LDcgODksOCA3NiwxNCA3MCwyMCA2NywxOCA2NywxOCA2NywxOCIvPiAKICAg
-PHBvbHlnb24gcG9pbnRzID0gIiA1Niw5OCA0OCwxMDYgNTYsMTAzIDQ3LDExMiA1NiwxMTAg
-NTIsMTE1IDU3LDExMyA1MiwxMjEgNjIsMTE1IDU4LDEyMyA2NSwxMTkgNjMsMTI1IDY5LDEy
-MSA2OCwxMjcgNzQsMTI1IDc0LDEyOSA3OSwxMjggODMsMTMyIDk0LDEzNSA5MywxMjkgODUs
-MTI3IDgxLDEyMiA3NiwxMjYgNzUsMTIxIDcxLDEyNCA3MSwxMTcgNjYsMTIxIDY2LDExNyA2
-MiwxMTcgNjQsMTEyIDYwLDExMyA2MCwxMTAgNTcsMTExIDYxLDEwNSA1NywxMDcgNjAsMTAx
-IDU1LDEwMiA1Niw5OCA1Niw5OCA1Niw5OCIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAx
-MDEsMTMyIDEwMywxMzggMTA2LDEzNCAxMDYsMTM5IDExMiwxMzYgMTExLDE0MiAxMTUsMTM5
-IDExNCwxNDMgMTE5LDE0MiAxMjUsMTQ1IDEzMSwxNDIgMTM1LDEzOCAxNDAsMTM0IDE0MCwx
-MjkgMTQzLDEzNSAxNDUsMTQ5IDE1MCwxNzEgMTQ5LDE4NCAxNDUsMTY1IDE0MSwxNTAgMTM2
-LDE0NyAxMzIsMTUxIDEzMSwxNDkgMTI2LDE1MiAxMjUsMTUwIDEyMSwxNTIgMTE3LDE0OCAx
-MTEsMTUyIDExMCwxNDggMTA1LDE0OSAxMDQsMTQ1IDk4LDE1MCA5NiwxMzggOTQsMTMyIDk0
-LDEzMCA5OCwxMzIgMTAxLDEzMiAxMDEsMTMyIDEwMSwxMzIiLz4gCiAgIDxwb2x5Z29uIHBv
-aW50cyA9ICIgNDEsOTQgMzIsMTEwIDIzLDEzMiAxMiwxNjMgNiwxOTAgNywyMTcgNSwyMzYg
-MywyNDcgOSwyMzAgMTIsMjExIDEyLDE4NSAxOCwxNjAgMjYsMTM0IDM1LDExMCA0Myw5OSA0
-MSw5NCA0MSw5NCA0MSw5NCIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAzMiwyNDYgNDEs
-MjUwIDUwLDI1NyA1MiwyNjcgNTMsMjk1IDUzLDMyMyA1OSwzNTAgNTQsMzYzIDUxLDM2NSA0
-NCwzNjYgNDIsMzYwIDQwLDM3MiA1NCwzNzIgNTksMzY2IDYyLDM1MyA3MSwzNTIgNzUsMzM1
-IDczLDMzMCA2NiwzMTggNjgsMzAyIDY0LDI5NCA2NywyODggNjMsMjg2IDYzLDI3OSA1OSwy
-NzUgNTgsMjY3IDU2LDI2MiA1MCwyNDcgNDIsMjM1IDQ0LDI0NiAzMiwyMzYgMzUsMjQ0IDMy
-LDI0NiAzMiwyNDYgMzIsMjQ2Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDEzNCwzMjQg
-MTQ2LDMyMCAxNTksMzIyIDE3MywzMjcgMTc5LDMzNyAxNzksMzQ5IDE3MiwzNTUgMTU4LDM1
-NyAxNzAsMzUwIDE3NCwzNDMgMTcwLDMzMyAxNjMsMzI4IDE1MiwzMjYgMTM0LDMyOSAxMzQs
-MzI0IDEzNCwzMjQgMTM0LDMyNCIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxNzMsMzM5
-IDE4MywzMzQgMTg0LDMzOCAxOTEsMzI5IDE5NCwzMzIgMTk5LDMyMyAyMDIsMzI1IDIwNiwz
-MTggMjA5LDMyMCAyMTMsMzA5IDIyMSwzMDMgMjI4LDI5NiAyMzIsMjg5IDIzNCwyNzkgMjMz
-LDI2OSAyMzAsMjYyIDIyNSwyNTYgMjE5LDI1MyAyMDgsMjUyIDE5OCwyNTIgMjEwLDI0OSAy
-MjMsMjUwIDIzMiwyNTcgMjM3LDI2NSAyMzgsMjc3IDIzOCwyOTEgMjMyLDMwNSAyMjEsMzIz
-IDIxOCwzMzUgMjEyLDM0MiAyMDAsMzQ5IDE3OCwzNDggMTczLDMzOSAxNzMsMzM5IDE3Mywz
-MzkiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTY1LDI5NiAxNTgsMzAxIDE1NiwzMTAg
-MTU2LDMyMyAxNjIsMzI0IDE1OSwzMTggMTYyLDMwOCAxNjIsMzA0IDE2NSwyOTYgMTY1LDI5
-NiAxNjUsMjk2Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDk5LDI1MiAxMDUsMjQ0IDEw
-NywyMzQgMTE1LDIyOCAxMjEsMjI4IDEzMSwyMzUgMTIyLDIzMyAxMTMsMjM1IDEwOSwyNDYg
-MTIxLDIzOSAxMzMsMjQzIDEyMSwyNDMgMTEwLDI1MSA5OSwyNTIgOTksMjUyIDk5LDI1MiIv
-PiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxMTcsMjUyIDEyNCwyNDcgMTM0LDI0OSAxMzYs
-MjUzIDEyNiwyNTIgMTE3LDI1MiAxMTcsMjUyIDExNywyNTIiLz4gCiAgIDxwb2x5Z29uIHBv
-aW50cyA9ICIgMTE3LDIxOCAxMzIsMjI0IDE0NCwyMzMgMTQwLDIyNSAxMzIsMjE5IDExNywy
-MTggMTE3LDIxOCAxMTcsMjE4Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDEyMiwyMTIg
-MTM0LDIxNCAxNDMsMjIxIDE0MSwyMTMgMTMyLDIxMCAxMjIsMjEyIDEyMiwyMTIgMTIyLDIx
-MiIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiA2OSwzNTIgNzAsMzYzIDc2LDM3MyA4Niwz
-NzggOTcsMzc5IDEwOCwzNzkgMTIwLDM3NyAxMjgsMzc4IDEzMiwzNzMgMTM1LDM2MSAxMzMs
-MzU4IDEzMiwzNjYgMTI3LDM3NSAxMjEsMzc0IDEyMSwzNjIgMTE5LDM2NyAxMTcsMzc0IDEx
-MCwzNzYgMTEwLDM2MiAxMDcsMzU3IDEwNiwzNzEgMTA0LDM3NSA5NywzNzYgOTAsMzc1IDkw
-LDM2OCA4NiwzNjIgODMsMzY0IDg2LDM2OSA4NSwzNzMgNzgsMzcwIDczLDM2MiA3MSwzNTEg
-NjksMzUyIDY5LDM1MiA2OSwzNTIiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTAwLDM2
-MCA5NiwzNjMgOTksMzY5IDEwMiwzNjQgMTAwLDM2MCAxMDAsMzYwIDEwMCwzNjAiLz4gCiAg
-IDxwb2x5Z29uIHBvaW50cyA9ICIgMTE1LDM2MCAxMTIsMzYzIDExNCwzNjkgMTE3LDM2NCAx
-MTUsMzYwIDExNSwzNjAgMTE1LDM2MCIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxMjcs
-MzYyIDEyNSwzNjQgMTI2LDM2OSAxMjgsMzY1IDEyNywzNjIgMTI3LDM2MiAxMjcsMzYyIi8+
-IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDUsMjU1IDcsMjc2IDExLDMwNCAxNSwzMjAgMTMs
-MzM0IDYsMzQ4IDIsMzUzIDAsMzYzIDUsMzcyIDEyLDM3NCAyNSwzNzIgMzgsMzcyIDQ0LDM2
-OSA0MiwzNjcgMzYsMzY4IDMxLDM2OSAzMCwzNjAgMjcsMzY4IDIwLDM3MCAxNiwzNjEgMTUs
-MzY4IDEwLDM2OSAzLDM2NiAzLDM1OSA2LDM1MiAxMSwzNDggMTcsMzMxIDE5LDMxNiAxMiwy
-OTEgOSwyNzQgNSwyNTUgNSwyNTUgNSwyNTUiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIg
-MTAsMzU4IDcsMzYyIDEwLDM2NiAxMSwzNjIgMTAsMzU4IDEwLDM1OCAxMCwzNTgiLz4gCiAg
-IDxwb2x5Z29uIHBvaW50cyA9ICIgMjUsMzU3IDIyLDM2MCAyNCwzNjYgMjcsMzYwIDI1LDM1
-NyAyNSwzNTcgMjUsMzU3Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDM3LDM1NyAzNCwz
-NjEgMzYsMzY1IDM4LDM2MSAzNywzNTcgMzcsMzU3IDM3LDM1NyIvPiAKICAgPHBvbHlnb24g
-cG9pbnRzID0gIiA0OSwzNTYgNDYsMzU5IDQ3LDM2NCA1MCwzNjAgNDksMzU2IDQ5LDM1NiA0
-OSwzNTYiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTMwLDEwMSAxMzIsMTAyIDEzNSwx
-MDEgMTM5LDEwMiAxNDMsMTAzIDE0MiwxMDEgMTM3LDEwMCAxMzMsMTAwIDEzMCwxMDEgMTMw
-LDEwMSAxMzAsMTAxIi8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDEwNiw0OCAxMDUsNTIg
-MTA4LDU2IDEwOSw1MiAxMDYsNDggMTA2LDQ4IDEwNiw0OCIvPiAKICAgPHBvbHlnb24gcG9p
-bnRzID0gIiAxMzksNTIgMTM5LDU2IDE0MCw2MCAxNDIsNTggMTQxLDU2IDEzOSw1MiAxMzks
-NTIgMTM5LDUyIi8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDI1LDM0OSAyOSwzNTEgMzAs
-MzU1IDMzLDM1MCAzNywzNDggNDIsMzUxIDQ1LDM0NyA0OSwzNDUgNDQsMzQzIDM2LDM0NSAy
-NSwzNDkgMjUsMzQ5IDI1LDM0OSIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiA5OCwzNDcg
-MTA1LDM1MSAxMDcsMzU0IDEwOSwzNDkgMTE1LDM0OSAxMjAsMzUzIDExOCwzNDkgMTEzLDM0
-NiAxMDQsMzQ2IDk4LDM0NyA5OCwzNDcgOTgsMzQ3Ii8+IAogICA8cG9seWdvbiBwb2ludHMg
-PSAiIDgzLDM0OCA4NywzNTIgODcsMzU3IDg5LDM1MSA4NywzNDggODMsMzQ4IDgzLDM0OCA4
-MywzNDgiLz4gCiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTU1LDEwNyAxNjMsMTA3IDE3MCwx
-MDcgMTg2LDEwOCAxNzUsMTA5IDE1NSwxMDkgMTU1LDEwNyAxNTUsMTA3IDE1NSwxMDciLz4g
-CiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTUzLDExNCAxNjIsMTEzIDE3NSwxMTIgMTkyLDEx
-NCAxNzMsMTE0IDE1NCwxMTUgMTUzLDExNCAxNTMsMTE0IDE1MywxMTQiLz4gCiAgIDxwb2x5
-Z29uIHBvaW50cyA9ICIgMTUyLDExOCAxNjQsMTIwIDE4MCwxMjMgMTk3LDEyOSAxNjksMTIz
-IDE1MSwxMjAgMTUyLDExOCAxNTIsMTE4IDE1MiwxMTgiLz4gCiAgIDxwb2x5Z29uIHBvaW50
-cyA9ICIgNjgsMTA5IDg3LDEwNiAxMDcsMTA2IDEwNiwxMDggODgsMTA4IDY4LDEwOSA2OCwx
-MDkgNjgsMTA5Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDEwNSwxMTEgOTUsMTEyIDc5
-LDExNCA3MSwxMTYgODUsMTE1IDEwMiwxMTMgMTA1LDExMSAxMDUsMTExIDEwNSwxMTEiLz4g
-CiAgIDxwb2x5Z29uIHBvaW50cyA9ICIgMTA4LDEwMSA5OCw5OSA4Nyw5OSA3OCw5OSA5Mywx
-MDAgMTA1LDEwMiAxMDgsMTAxIDEwOCwxMDEgMTA4LDEwMSIvPiAKICAgPHBvbHlnb24gcG9p
-bnRzID0gIiA4NSw2MyA5MSw2MyA5Nyw2MCAxMDQsNjAgMTA4LDYyIDExMSw2OSAxMTIsNzUg
-MTEwLDc0IDEwOCw3MSAxMDMsNzMgMTA2LDY5IDEwNSw2NSAxMDMsNjQgMTAzLDY3IDEwMiw3
-MCA5OSw3MCA5Nyw2NiA5NCw2NyA5Nyw3MiA4OCw2NyA4NCw2NiA4NSw2MyA4NSw2MyA4NSw2
-MyIvPiAKICAgPHBvbHlnb24gcG9pbnRzID0gIiAxNDAsNzQgMTQxLDY2IDE0NCw2MSAxNTAs
-NjEgMTU2LDYyIDE1Myw3MCAxNTAsNzMgMTUyLDY1IDE1MCw2NSAxNTEsNjggMTQ5LDcxIDE0
-Niw3MSAxNDQsNjYgMTQzLDcwIDE0Myw3NCAxNDAsNzQgMTQwLDc0IDE0MCw3NCIvPiAKICAg
-PHBvbHlnb24gcG9pbnRzID0gIiAxNDYsMjAgMTU2LDExIDE2Myw5IDE3Miw5IDE3OCwxNCAx
-ODIsMTggMTg0LDMyIDE4Miw0MiAxODIsNTIgMTc3LDU4IDE3Niw2NyAxNzEsNzYgMTY1LDkw
-IDE1NywxMDUgMTYwLDkyIDE2NCw4NSAxNjgsNzggMTY3LDczIDE3Myw2NiAxNzIsNjIgMTc1
-LDU5IDE3NCw1NSAxNzcsNTMgMTgwLDQ2IDE4MSwyOSAxNzksMjEgMTczLDEzIDE2NiwxMSAx
-NTksMTMgMTUzLDE4IDE0OCwyMyAxNDYsMjAgMTQ2LDIwIDE0NiwyMCIvPiAKICAgPHBvbHln
-b24gcG9pbnRzID0gIiAxNTAsMTg3IDE0OCwyMTEgMTUwLDIzMyAxNTMsMjQ3IDE0OCwyNjcg
-MTM1LDI4MyAxMjUsMjk5IDEzNiwyOTIgMTMxLDMxMyAxMjIsMzI4IDEyMiwzNDUgMTI5LDM1
-MiAxMzMsMzU5IDEzMywzNjcgMTM3LDM1OSAxNDgsMzU2IDE0MCwzNTAgMTMxLDM0NyAxMjks
-MzQwIDEzMiwzMzIgMTQwLDMyOCAxMzcsMzIyIDE0MCwzMDQgMTU0LDI2NSAxNTcsMjQ0IDE1
-NSwyMjMgMTYxLDIyMCAxNzUsMjI5IDE4NiwyNDcgMTg1LDI2MCAxNzYsMjc1IDE3OCwyODcg
-MTg1LDI3NyAxODgsMjYxIDE5NiwyNTMgMTg5LDIzNiAxNzQsMjEzIDE1MCwxODcgMTUwLDE4
-NyAxNTAsMTg3Ii8+IAogICA8cG9seWdvbiBwb2ludHMgPSAiIDE0NywzMzggMTQyLDM0MSAx
-NDMsMzQ1IDE0MSwzNTQgMTQ3LDM0MyAxNDcsMzM4IDE0NywzMzggMTQ3LDMzOCIvPiAKICAg
-PHBvbHlnb24gcG9pbnRzID0gIiAxNTcsMzQyIDE1NiwzNDkgMTUwLDM1NiAxNTcsMzUzIDE2
-MywzNDYgMTYyLDM0MiAxNTcsMzQyIDE1NywzNDIgMTU3LDM0MiIvPiAKICAgPHBvbHlnb24g
-cG9pbnRzID0gIiA5OSwyNjUgOTYsMjg0IDkyLDI5OSA3MywzMzkgNzMsMzMzIDg3LDMwMCA5
-OSwyNjUgOTksMjY1IDk5LDI2NSIvPiAKPC9nPjwvc3ZnPgoNCg==
-
---==_Exmh_280722180--
-
-
diff --git a/tests/ui-tests/message-browser.c b/tests/ui-tests/message-browser.c
deleted file mode 100644
index fb12b959d9..0000000000
--- a/tests/ui-tests/message-browser.c
+++ /dev/null
@@ -1,819 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*--------------------------------*-C-*---------------------------------*
- *
- * Copyright 2000, Matt Loper <matt@helixcode.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.
- *
- *----------------------------------------------------------------------*/
-
-#include <gnome.h>
-#include <camel/camel.h>
-#include <camel/camel-mime-message.h>
-#include <camel/camel-stream.h>
-#include <camel/camel-stream-fs.h>
-#include <camel/gmime-utils.h>
-#include "../../mail/html-stream.h"
-#include <camel/camel-formatter.h>
-
-/* gtkhtml stuff */
-#include <gtkhtml/gtkhtml.h>
-
-/* corba/bonobo stuff */
-#include <bonobo.h>
-#include <libgnorba/gnorba.h>
-#include <bonobo/bonobo-stream-memory.h>
-
-#include <widgets/e-paned/e-hpaned.h>
-
-static void
-print_usage_and_quit()
-{
- g_print ("Usage: message-browser [FILENAME]\n");
- g_print ("Where FILENAME is the filename of a mime message ");
- g_print ("in \"message/rfc822\" format.\n");
- exit (0);
-}
-
-
-/*----------------------------------------------------------------------*
- * Filling out the tree control view of a mime-message
- *----------------------------------------------------------------------*/
-
-static void
-handle_tree_item (CamelDataWrapper* object, GtkWidget* tree_ctrl)
-{
- GtkWidget* tree_item;
- gchar* label = gmime_content_field_get_mime_type (object->mime_type);
-
- CamelDataWrapper* containee;
- GtkWidget* containee_tree_item;
- gchar* containee_label;
-
- GtkWidget* subtree = NULL;
-
- tree_item = gtk_tree_item_new_with_label (label);
- gtk_object_set_data (GTK_OBJECT (tree_item),
- "camel_data_wrapper", object);
- gtk_tree_append (GTK_TREE (tree_ctrl), tree_item);
-
- gtk_widget_show(tree_item);
-
- /* If our object is a leaf, we're done */
- if (!CAMEL_IS_MEDIUM (object))
- return;
-
- containee =
- camel_medium_get_content_object (
- CAMEL_MEDIUM (object));
-
- g_assert (containee);
-
- /* If it is a container, insert its contents into the tree */
- containee_label = camel_data_wrapper_get_mime_type (containee);
-
- subtree = gtk_tree_new();
-
- containee_tree_item =
- gtk_tree_item_new_with_label (containee_label);
- gtk_object_set_data (GTK_OBJECT (containee_tree_item),
- "camel_data_wrapper",
- containee);
- gtk_tree_append (GTK_TREE (subtree), containee_tree_item);
-
- gtk_tree_item_set_subtree (GTK_TREE_ITEM(tree_item),
- GTK_WIDGET (subtree));
- gtk_widget_show(containee_tree_item);
-
- if (CAMEL_IS_MULTIPART (containee))
- {
- CamelMultipart* multipart =
- CAMEL_MULTIPART (containee);
- int max_multiparts =
- camel_multipart_get_number (multipart);
- int i;
-
- if (max_multiparts > 0) {
- subtree = gtk_tree_new();
- gtk_tree_item_set_subtree (
- GTK_TREE_ITEM(containee_tree_item),
- GTK_WIDGET (subtree));
- }
-
- for (i = 0; i < max_multiparts; i++) {
- CamelMimeBodyPart* body_part =
- camel_multipart_get_part (
- multipart, i);
-
- handle_tree_item (
- CAMEL_DATA_WRAPPER (body_part),
- GTK_WIDGET (subtree));
- }
-
- }
- gtk_tree_item_expand (
- GTK_TREE_ITEM (containee_tree_item));
- gtk_tree_item_expand (GTK_TREE_ITEM (tree_item));
-}
-
-static GtkWidget*
-get_gtk_html_contents_window (CamelDataWrapper* data);
-
-static void
-tree_selection_changed( GtkWidget *tree )
-{
- GList *i;
-
- i = GTK_TREE_SELECTION(tree);
- while (i){
- gchar* name;
- GtkLabel* label;
- GtkWidget* item;
- CamelDataWrapper* camel_data_wrapper;
-
- /* Get a GtkWidget pointer from the list node */
- item = GTK_WIDGET (i->data);
- camel_data_wrapper =
- gtk_object_get_data (GTK_OBJECT (item),
- "camel_data_wrapper");
-
- g_assert (camel_data_wrapper);
- get_gtk_html_contents_window (camel_data_wrapper);
-
- label = GTK_LABEL (GTK_BIN (item)->child);
- gtk_label_get (label, &name);
- g_print ("\t%s on level %d\n", name, GTK_TREE
- (item->parent)->level);
- i = i->next;
- }
-}
-
-static GtkWidget*
-get_message_tree_ctrl (CamelMimeMessage* message)
-{
- static GtkWidget* scroll_wnd = NULL;
- static GtkWidget* tree_ctrl = NULL;
-
- /* create the tree control, if it doesn't exist already */
- if (!tree_ctrl) {
-
- tree_ctrl = gtk_tree_new ();
-
- gtk_signal_connect (GTK_OBJECT(tree_ctrl),
- "selection_changed",
- GTK_SIGNAL_FUNC(tree_selection_changed),
- tree_ctrl);
-
- scroll_wnd = gtk_scrolled_window_new (NULL,NULL);
-
- gtk_scrolled_window_add_with_viewport (
- GTK_SCROLLED_WINDOW(scroll_wnd),
- tree_ctrl);
-
- gtk_widget_set_usize (scroll_wnd, 225, 200);
- }
- else
- gtk_tree_clear_items (GTK_TREE (tree_ctrl), 0, 1);
-
-
- /* Recursively insert tree items in the tree */
- if (message)
- handle_tree_item (CAMEL_DATA_WRAPPER (message), tree_ctrl);
- gtk_scrolled_window_set_policy (
- GTK_SCROLLED_WINDOW (scroll_wnd),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- return scroll_wnd;
-}
-
-static CamelMimeMessage*
-filename_to_camel_msg (gchar* filename)
-{
- CamelMimeMessage* message;
- CamelStream* input_stream;
-
- camel_init();
-
- input_stream = camel_stream_fs_new_with_name (
- filename, CAMEL_STREAM_FS_READ);
-
- if (!input_stream)
- return NULL;
-
- message = camel_mime_message_new ();
-
- camel_data_wrapper_set_input_stream (
- CAMEL_DATA_WRAPPER (message), input_stream);
-
- return message;
-}
-
-/*----------------------------------------------------------------------*
- * Filling out the HTML view of a mime message
- *----------------------------------------------------------------------*/
-
-static void
-data_wrapper_to_html (CamelDataWrapper *msg, gchar** body_string)
-{
- CamelFormatter* cmf = camel_formatter_new();
- CamelStream* body_stream =
- camel_stream_mem_new (CAMEL_STREAM_FS_WRITE);
-
- g_assert (body_string);
-
- camel_formatter_wrapper_to_html (
- cmf, msg, body_stream);
-
- *body_string = g_strndup (
- CAMEL_STREAM_MEM (body_stream)->buffer->data,
- CAMEL_STREAM_MEM (body_stream)->buffer->len);
-}
-
-static void
-mime_message_header_to_html (CamelMimeMessage *msg, gchar** header_string)
-{
- CamelFormatter* cmf = camel_formatter_new();
- CamelStream* header_stream =
- camel_stream_mem_new (CAMEL_STREAM_FS_WRITE);
-
- g_assert (header_string);
-
- camel_formatter_mime_message_to_html (
- cmf, CAMEL_MIME_MESSAGE (msg), header_stream, NULL);
-
- *header_string = g_strndup (
- CAMEL_STREAM_MEM (header_stream)->buffer->data,
- CAMEL_STREAM_MEM (header_stream)->buffer->len);
-}
-
-
-static void
-on_link_clicked (GtkHTML *html, const gchar *url, gpointer data)
-{
- GtkWidget* message_box;
- CamelStream *stream;
- CamelStream *save_stream;
- gchar tmp_buffer[4096];
- gint nb_bytes_read;
-
- gchar* message =
- g_strdup_printf ("You have clicked on this link:\n%s", url);
-
- if (sscanf (url, "camel://%p", &stream))
- {
- save_stream =
- camel_stream_fs_new_with_name ("saved-file",
- CAMEL_STREAM_FS_WRITE);
-
-
- do {
-
- /* read next chunk of text */
- nb_bytes_read = camel_stream_read (stream,
- tmp_buffer,
- 4096);
-
- /* If there's any text, write it to the stream */
- if (nb_bytes_read > 0) {
- camel_stream_write (save_stream,
- tmp_buffer,
- nb_bytes_read);
- }
-
-
- } while (!camel_stream_eos (stream));
-
- camel_stream_close (save_stream);
- }
-
- message_box = gnome_message_box_new (message,
- GNOME_MESSAGE_BOX_INFO,
- "Okay", NULL);
-
- gnome_dialog_set_default (GNOME_DIALOG (message_box), 1);
- gnome_dialog_run (GNOME_DIALOG (message_box));
- g_free (message);
-}
-
-/*
- * As a page is being loaded, gtkhtml will come across a few types of
- * tags that it understands (like <img src="foo">). In these cases, it
- * will simply ask us to stream the data to it.
- */
-static void
-on_url_data_requested (GtkHTML *html, const gchar *url, GtkHTMLStreamHandle handle, gpointer data)
-{
- CamelStream *stream;
-
- printf ("url _%s_ (%p) requested\n", url, url);
-
- if (sscanf (url, "camel://%p", &stream) == 1)
- {
- gchar tmp_buffer[4096];
- do {
- gint nb_bytes_read;
-
- /* read next chunk of text */
- nb_bytes_read = camel_stream_read (stream,
- tmp_buffer,
- 4096);
-
- /* If there's any text, write it to the stream */
- if (nb_bytes_read > 0) {
- gtk_html_write (html, handle, tmp_buffer, nb_bytes_read);
- }
-
-
- } while (!camel_stream_eos (stream));
-
-
- }
-
-}
-
-
-static gboolean
-hydrate_persist_stream_from_gstring (Bonobo_PersistStream persist_stream,
- GString* gstr)
-{
- CORBA_Environment ev;
- BonoboStream* mem_stream =
- bonobo_stream_mem_create (gstr->str, gstr->len, TRUE, FALSE);
- /*
- * If the component doesn't support
- * PersistStream, then we destroy the
- * stream we created and bail.
- */
- if (persist_stream == CORBA_OBJECT_NIL) {
- gnome_warning_dialog (_("The component now claims that it "
- "doesn't support PersistStream!"));
- bonobo_object_unref (BONOBO_OBJECT (mem_stream));
- return FALSE;
- }
-
- CORBA_exception_init (&ev);
-
- /*
- * Load the file into the component using PersistStream.
- */
- Bonobo_PersistStream_load (persist_stream,
- (Bonobo_Stream) bonobo_object_corba_objref (BONOBO_OBJECT (mem_stream)),
- &ev);
-
- bonobo_object_unref (BONOBO_OBJECT (mem_stream));
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- gnome_warning_dialog (_("An exception occured while trying "
- "to load data into the component with "
- "PersistStream"));
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
- return TRUE;
-}
-
-static GString*
-camel_stream_to_gstring (CamelStream* stream)
-{
- gchar tmp_buffer[4097];
- GString *tmp_gstring = g_string_new ("");
-
- do { /* read next chunk of text */
-
- gint nb_bytes_read;
-
- nb_bytes_read = camel_stream_read (stream,
- tmp_buffer,
- 4096);
- tmp_buffer [nb_bytes_read] = '\0';
-
- /* If there's any text, append it to the gstring */
- if (nb_bytes_read > 0) {
- tmp_gstring = g_string_append (tmp_gstring, tmp_buffer);
- }
-
- } while (!camel_stream_eos (stream));
-
- return tmp_gstring;
-}
-
-
-/*
- * As a page is loaded, when gtkhtml comes across <object> tags, this
- * callback is invoked. The GtkHTMLEmbedded param is a GtkContainer;
- * our job in this function is to simply add a child widget to it.
- */
-static void
-on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, void *unused)
-{
- CamelStream *stream;
- GString *camel_stream_gstr;
-
- GtkWidget *bonobo_embeddable;
- BonoboObjectClient* server;
- Bonobo_PersistStream persist;
- CORBA_Environment ev;
- gchar *uid = gtk_html_embedded_get_parameter (eb, "uid");
-
- /* Both the classid (which specifies which bonobo object to
- * fire up) and the uid (which tells us where to find data to
- * persist from) must be available; if one of them isn't,
- * print an error and bail. */
- if (!uid || !eb->classid) {
- printf ("on_object_requested: couldn't find %s%s%s\n",
- uid?"a uid":"",
- (!uid && !eb->classid)?" or ":"",
- eb->classid?"a classid":"");
- return;
- }
- printf ("object requested : %s\n", eb->classid);
- printf ("UID = %s\n", uid);
-
- /* Try to get a server with goadid specified by eb->classid */
- bonobo_embeddable = bonobo_widget_new_subdoc (eb->classid, NULL);
- server = bonobo_widget_get_server (BONOBO_WIDGET (bonobo_embeddable));
- if (!server) {
- printf ("Couldn't get the server for the bonobo embeddable\n");
- return;
- }
-
- /* The UID should be a pointer to a CamelStream */
- if (sscanf (uid, "camel://%p", &stream) != 1) {
- printf ("Couldn't get a pointer from url \"%s\"\n", uid);
- gtk_object_unref (GTK_OBJECT (bonobo_embeddable));
-
- return;
- }
-
- /* Try to get a PersistStream interface from the server;
- if it doesn't support that interface, bail. */
- persist = (Bonobo_PersistStream) bonobo_object_client_query_interface (
- server,
- "IDL:Bonobo/PersistStream:1.0",
- NULL);
-
- if (persist == CORBA_OBJECT_NIL) {
- gchar* msg = g_strdup_printf (
- _("The %s component doesn't support PersistStream!\n"),
- uid);
-
- gnome_warning_dialog (msg);
- gtk_object_unref (GTK_OBJECT (bonobo_embeddable));
-
- return;
- }
-
- /* Hydrate the PersistStream from the CamelStream */
- camel_stream_gstr = camel_stream_to_gstring (stream);
- printf ("on_object_requested: The CamelStream has %d elements\n",
- camel_stream_gstr->len);
- hydrate_persist_stream_from_gstring (persist, camel_stream_gstr);
-
- /* Give our new window to the container */
- gtk_widget_show (bonobo_embeddable);
- gtk_container_add (GTK_CONTAINER(eb), bonobo_embeddable);
-
- /* Destroy the PersistStream object.*/
- CORBA_exception_init (&ev);
- Bonobo_Unknown_unref (persist, &ev);
- CORBA_Object_release (persist, &ev);
- CORBA_exception_free (&ev);
-
- g_string_free (camel_stream_gstr, TRUE);
-}
-
-
-
-
-static GtkWidget*
-get_gtk_html_contents_window (CamelDataWrapper* data)
-{
- static GtkWidget* frame_wnd = NULL;
- static GtkWidget* scroll_wnd = NULL;
- static GtkWidget* html_widget = NULL;
- HTMLStream* html_stream;
- gchar *body_string;
-
- /* create the html widget and scroll window, if they haven't
- already been created */
- if (!html_widget) {
- html_widget = gtk_html_new();
-
- gtk_signal_connect (GTK_OBJECT (html_widget),
- "link_clicked",
- GTK_SIGNAL_FUNC (on_link_clicked),
- NULL);
-
- gtk_signal_connect (GTK_OBJECT (html_widget),
- "url_requested",
- GTK_SIGNAL_FUNC (on_url_data_requested),
- NULL);
- gtk_signal_connect (GTK_OBJECT (html_widget),
- "object_requested",
- GTK_SIGNAL_FUNC (on_object_requested),
- NULL);
-
- scroll_wnd = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_add (GTK_CONTAINER (scroll_wnd), html_widget);
- }
-
- if (data) {
-
- html_stream =
- HTML_STREAM (html_stream_new (GTK_HTML (html_widget)));
-
- /* turn the mime message into html, and
- write it to the html stream */
- data_wrapper_to_html (data, &body_string);
-
- camel_stream_write (CAMEL_STREAM (html_stream),
- body_string,
- strlen (body_string));
-
- camel_stream_close (CAMEL_STREAM (html_stream));
-
- g_free (body_string);
- }
-
-
- if (!frame_wnd) {
-
- frame_wnd = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (
- GTK_FRAME (frame_wnd), GTK_SHADOW_IN);
-
- gtk_widget_set_usize (scroll_wnd, 500, 400);
- gtk_scrolled_window_set_policy (
- GTK_SCROLLED_WINDOW (scroll_wnd),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
-
- gtk_container_add (GTK_CONTAINER (frame_wnd), scroll_wnd);
- }
-
- return frame_wnd;
-}
-
-
-static GtkWidget*
-get_gtk_html_header_window (CamelMimeMessage* mime_message)
-{
- static GtkWidget* frame_wnd = NULL;
- static GtkWidget* scroll_wnd = NULL;
- static GtkWidget* html_widget = NULL;
- HTMLStream* html_stream;
- gchar* header_string;
-
- /* create the html widget and scroll window, if they haven't
- already been created */
- if (!html_widget) {
- html_widget = gtk_html_new();
- scroll_wnd = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_add (GTK_CONTAINER (scroll_wnd), html_widget);
- }
-
- if (mime_message) {
-
- html_stream =
- HTML_STREAM (html_stream_new (GTK_HTML (html_widget)));
-
- /* turn the mime message into html, and
- write it to the html stream */
- mime_message_header_to_html (mime_message, &header_string);
-
- camel_stream_write (CAMEL_STREAM (html_stream),
- header_string,
- strlen (header_string));
-
- camel_stream_close (CAMEL_STREAM (html_stream));
-
- g_free (header_string);
- }
-
- if (!frame_wnd) {
-
- frame_wnd = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (
- GTK_FRAME (frame_wnd), GTK_SHADOW_OUT);
-
- gtk_widget_set_usize (scroll_wnd, 500, 75);
- gtk_scrolled_window_set_policy (
- GTK_SCROLLED_WINDOW (scroll_wnd),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
-
- gtk_container_add (GTK_CONTAINER (frame_wnd), scroll_wnd);
- }
-
-
- return frame_wnd;
-}
-
-static GtkWidget*
-get_gtk_html_window (CamelMimeMessage* mime_message)
-{
- static GtkWidget* vbox = NULL;
- GtkWidget* html_header_window = NULL;
- GtkWidget* html_content_window = NULL;
-
- html_content_window =
- get_gtk_html_contents_window (
- CAMEL_DATA_WRAPPER (mime_message));
-
- html_header_window =
- get_gtk_html_header_window (mime_message);
-
- if (!vbox) {
- vbox = gtk_vbox_new (FALSE, 0);
-
- gtk_box_pack_start (
- GTK_BOX (vbox),
- html_header_window,
- TRUE, TRUE, 5);
-
- gtk_box_pack_start (
- GTK_BOX (vbox),
- html_content_window,
- TRUE, FALSE, 5);
- }
-
- return vbox;
-}
-
-
-
-/*----------------------------------------------------------------------*
- * Menu callbacks and information
- *----------------------------------------------------------------------*/
-
-static gchar* fileselection_prev_file = NULL;
-
-static void
-open_ok (GtkWidget *widget, GtkFileSelection *fs)
-{
- int ret;
- GtkWidget *error_dialog;
-
- if (fileselection_prev_file)
- g_free (fileselection_prev_file);
-
- if(!g_file_exists (gtk_file_selection_get_filename (fs))) {
- error_dialog = gnome_message_box_new (
- _("File not found"),
- GNOME_MESSAGE_BOX_ERROR,
- GNOME_STOCK_BUTTON_OK,
- NULL);
-
- gnome_dialog_set_parent (GNOME_DIALOG (error_dialog),
- GTK_WINDOW (fs));
-
- ret = gnome_dialog_run (GNOME_DIALOG (error_dialog));
- }
- else {
- gchar *filename = gtk_file_selection_get_filename (fs);
- CamelMimeMessage* message = filename_to_camel_msg (filename);
-
- if (message) {
- fileselection_prev_file = g_strdup (filename);
- get_message_tree_ctrl (message);
- get_gtk_html_window (message);
- }
- else
- gnome_message_box_new ("Couldn't load message.",
- GNOME_MESSAGE_BOX_WARNING);
-
- gtk_widget_destroy (GTK_WIDGET (fs));
- }
-}
-
-
-static void
-file_menu_open_cb (GtkWidget *widget, void* data)
-{
- GtkFileSelection *fs;
-
- fs = GTK_FILE_SELECTION (
- gtk_file_selection_new (_("Open Mime Message")));
-
- if (fileselection_prev_file)
- gtk_file_selection_set_filename (fs, fileselection_prev_file);
-
- gtk_signal_connect (GTK_OBJECT (fs->ok_button), "clicked",
- (GtkSignalFunc) open_ok,
- fs);
-
- gtk_signal_connect_object (GTK_OBJECT (fs->cancel_button), "clicked",
- (GtkSignalFunc) gtk_widget_destroy,
- GTK_OBJECT (fs));
-
- gtk_widget_show (GTK_WIDGET (fs));
- gtk_grab_add (GTK_WIDGET (fs)); /* Make it modal */
-}
-
-static void
-file_menu_exit_cb (GtkWidget *widget, void *data)
-{
- gtk_main_quit ();
-}
-
-
-static GnomeUIInfo file_menu [] = {
- GNOMEUIINFO_MENU_OPEN_ITEM (file_menu_open_cb, NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_MENU_EXIT_ITEM (file_menu_exit_cb, NULL),
- GNOMEUIINFO_END
-};
-
-static GnomeUIInfo main_menu[] = {
- GNOMEUIINFO_MENU_FILE_TREE (file_menu),
- GNOMEUIINFO_END
-};
-
-
-/*----------------------------------------------------------------------*
- * Main()
- *----------------------------------------------------------------------*/
-
-int
-main (int argc, char *argv[])
-{
- /* app contains hbox, hbox contains other 2 windows */
- GtkWidget* app;
- GtkWidget* hpane;
- GtkWidget* tree_ctrl_window;
- GtkWidget* html_window;
- CORBA_Environment ev;
-
- CamelMimeMessage* message = NULL;
-
- /* initialization */
-
- /* Corba and Bonobo stuff */
- CORBA_exception_init (&ev);
-
- gnome_CORBA_init ("Message Browser", "1.0", &argc, argv, 0, &ev);
-
- if (bonobo_init (gnome_CORBA_ORB (), NULL, NULL) == FALSE)
- g_error ("Cannot bonobo_init");
-
-
-
- gdk_rgb_init ();
-
- gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
- gtk_widget_set_default_visual (gdk_rgb_get_visual ());
-
- app = gnome_app_new ("Message Browser Test", NULL);
- gnome_app_create_menus (GNOME_APP (app), main_menu);
-
- /* parse command line */
- if (argc > 2 ||
- (argc==2 && strstr (argv[1], "--help") != 0))
- print_usage_and_quit();
- if (argc == 2) {
- if (strstr (argv[1], "--help") != 0)
- print_usage_and_quit();
- message = filename_to_camel_msg (argv[1]);
- if (!message) {
- g_print ("Couldn't load message.");
- }
- }
-
- hpane = e_hpaned_new();
-
- /* add the tree control view of the message*/
- tree_ctrl_window = get_message_tree_ctrl (message);
- e_paned_add1 (E_PANED (hpane), tree_ctrl_window);
-
- /* add the HTML view of the message */
- html_window = get_gtk_html_window (message);
- e_paned_add2 (E_PANED (hpane), html_window);
-
- /* rock n roll */
- gnome_app_set_contents (GNOME_APP (app),
- hpane);
- gtk_widget_show_all (app);
- gtk_signal_connect (GTK_OBJECT (app), "destroy",
- GTK_SIGNAL_FUNC(gtk_main_quit),
- &app);
- if (!message)
- file_menu_open_cb (NULL, NULL);
-
- bonobo_main();
-
- return 1;
-}
diff --git a/tests/ui-tests/saveoptions.xml b/tests/ui-tests/saveoptions.xml
deleted file mode 100644
index 3fd7e57f96..0000000000
--- a/tests/ui-tests/saveoptions.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<filteroptions>
- <optionset>
- <option type="send">
- <description>Family email</description>
- <optionrule type="match" rule="from-address">
- <optionvalue name="sender">
- <address name="zucchi" email="zucchi@zedzone"/>
- <address name="foo" email="bar"/>
- </optionvalue>
- </optionrule>
- <optionrule type="match" rule="to-address">
- <optionvalue name="receipient">
- <address name="frank" email="frank.zucchi"/>
- </optionvalue>
- </optionrule>
- <optionrule type="match" rule="cc-address">
- <address name="zucchi" email="zucchi@zedzone"/>
- </optionrule>
- <optionrule type="except" rule="except-me"/>
- <optionrule type="action" rule="copy-me">
- <optionvalue name="folder">
- <folder name="SaveMe"/>
- <folder name="InBox"/>
- </optionvalue>
- </optionrule>
- </option>
- <option type="receive">
- <description>Helix Email</description>
- <optionrule type="match" rule="from-address">
- <optionvalue name="sender">
- <address name="primates" email="primates-list@helixcode.com"/>
- </optionvalue>
- </optionrule>
- </option>
- </optionset>
-</filteroptions>
diff --git a/tests/ui-tests/store_listing.c b/tests/ui-tests/store_listing.c
deleted file mode 100644
index fb7c2ae0f7..0000000000
--- a/tests/ui-tests/store_listing.c
+++ /dev/null
@@ -1,424 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Author : Bertrand.Guiheneuf@aful.org */
-
-
-
-/* A simple and very dirty hack written to test
- (and perhaps demonstrate) Camel */
-
-
-#include <gnome.h>
-#include <glade/glade.h>
-
-#include "camel-folder.h"
-#include "camel-mh-folder.h"
-#include "camel-mh-store.h"
-#include "camel.h"
-#include "camel-folder-summary.h"
-
-static GladeXML *xml;
-static CamelSession *_session;
-static CamelFolder *currently_selected_folder = NULL;
-
-static GList *store_list;
-static GList *folder_list;
-
-static void add_mail_store (const gchar *store_url);
-static void show_folder_messages (CamelFolder *folder);
-
-
-
-static void
-_destroy_menu (gpointer data)
-{
- gtk_widget_destroy (GTK_WIDGET (data));
-}
-
-static void
-_copy_message (GtkWidget *widget, gpointer data)
-{
- CamelFolder *dest_folder = CAMEL_FOLDER (data);
- GtkWidget *message_clist;
- gint current_row;
- GList *selected;
- gint selected_row;
-
- CamelMimeMessage *message;
-
- printf ("Selected \"copy to folder\" with destination folder %s\n", camel_folder_get_name (dest_folder));
- message_clist = glade_xml_get_widget (xml, "message-clist");
- selected = GTK_CLIST (message_clist)->selection;
- while (selected) {
- selected_row = GPOINTER_TO_INT (selected->data);
- message = CAMEL_MIME_MESSAGE (gtk_clist_get_row_data (GTK_CLIST (message_clist), selected_row));
- camel_folder_copy_message_to (currently_selected_folder, message, dest_folder);
- selected = selected->next;
- }
-
-}
-
-static GnomeUIInfo mailbox_popup_menu[] = {
- GNOMEUIINFO_ITEM_STOCK ("_Copy selected message here", NULL, _copy_message, GNOME_STOCK_MENU_NEW),
- GNOMEUIINFO_END
-};
-
-static void
-_show_mailbox_context_menu (CamelFolder *folder) {
- GtkWidget *menu;
- GtkCTree *mailbox_and_store_tree;
-
- mailbox_and_store_tree = GTK_CTREE (glade_xml_get_widget (xml, "store-and-mailbox-tree"));
- menu = gtk_object_get_data (GTK_OBJECT (mailbox_and_store_tree), "mailbox_popup_menu");
- if (!menu) {
- menu = gnome_popup_menu_new (mailbox_popup_menu);
- gtk_object_set_data_full (GTK_OBJECT (mailbox_and_store_tree), "mailbox_popup_menu", menu, _destroy_menu);
- }
-
- gnome_popup_menu_do_popup (menu, NULL, NULL, NULL, folder);
-
-
-}
-static gboolean
-mailbox_button_clicked_on_row (gint button, gint row)
-{
- GtkCTreeNode *mailbox_node;
- CamelFolder *folder;
- GtkCTree *mailbox_and_store_tree;
- const gchar *mailbox_name;
-
- mailbox_and_store_tree = GTK_CTREE (glade_xml_get_widget (xml, "store-and-mailbox-tree"));
-
- mailbox_node = gtk_ctree_node_nth (mailbox_and_store_tree, row);
-
- folder = gtk_ctree_node_get_row_data (mailbox_and_store_tree, mailbox_node);
- if (folder && IS_CAMEL_FOLDER (folder)) {
-
- mailbox_name = camel_folder_get_name (folder);
- printf ("mailbox %s clicked with button %d\n", mailbox_name, button);
- switch (button) {
- case 1:
- currently_selected_folder = folder;
- show_folder_messages (folder);
- break;
- case 2:
- break;
- case 3:
- _show_mailbox_context_menu (folder);
- }
- return TRUE;
- } else {
- printf ("Node is a store\n");
- return FALSE;
- }
-}
-
-
-static void
-message_destroy_notify (gpointer data)
-{
- CamelMimeMessage *message = CAMEL_MIME_MESSAGE (data);
-
- gtk_object_unref (GTK_OBJECT (message));
-
-}
-
-
-
-
-
-static void
-show_folder_messages (CamelFolder *folder)
-{
- GtkWidget *message_clist;
- gint folder_message_count;
- CamelMimeMessage *message;
- gint i;
- const gchar *clist_row_text[3];
- const char *sent_date, *subject, *sender;
- gint current_row;
- CamelFolderSummary *summary;
-
- message_clist = glade_xml_get_widget (xml, "message-clist");
-
- /* clear old message list */
- gtk_clist_clear (GTK_CLIST (message_clist));
-
- if (camel_folder_has_summary_capability (folder)) {
- const GList *message_info_list;
- CamelMessageInfo *msg_info;
-
- printf ("Folder has summary. Good\n");
- summary = camel_folder_get_summary (folder);
- message_info_list = camel_folder_summary_get_message_info_list (summary);
- printf ("message_info_list = %p\n", message_info_list);
- while (message_info_list) {
- msg_info = (CamelMessageInfo *)message_info_list->data;
- clist_row_text [0] = msg_info->date;
- clist_row_text [1] = msg_info->sender;
- clist_row_text [2] = msg_info->subject;
-
- current_row = gtk_clist_append (GTK_CLIST (message_clist), clist_row_text);
-
- message_info_list = message_info_list->next;
- }
- } else {
- printf ("Folder does not have summary. Opening all messages\n");
- folder_message_count = camel_folder_get_message_count (folder);
-
- for (i=0; i<folder_message_count; i++) {
- message = camel_folder_get_message (folder, i);
- gtk_object_ref (GTK_OBJECT (message));
- sent_date = camel_mime_message_get_sent_date (message);
- sender = camel_mime_message_get_from (message);
- subject = camel_mime_message_get_subject (message);
-
-
- if (sent_date) clist_row_text [0] = sent_date;
- else clist_row_text [0] = NULL;
- if (sender) clist_row_text [1] = sender;
- else clist_row_text [1] = NULL;
- if (subject) clist_row_text [2] = subject;
- else clist_row_text [2] = NULL;
-
- current_row = gtk_clist_append (GTK_CLIST (message_clist), clist_row_text);
- gtk_clist_set_row_data_full (GTK_CLIST (message_clist), current_row, (gpointer)message, message_destroy_notify);
- }
-
- }
-}
-
-
-/* add a mail store given by its URL */
-static void
-add_mail_store (const gchar *store_url)
-{
-
- CamelStore *store;
- GtkWidget *mailbox_and_store_tree;
- GtkCTreeNode* new_store_node;
- GtkCTreeNode* new_folder_node;
- char *new_tree_text[1];
- GList *subfolder_list;
- CamelFolder *root_folder;
- CamelFolder *new_folder;
-
-
-
- store = camel_session_get_store (_session, store_url);
- if (!store) return;
-
- /* remember store */
- store_list = g_list_prepend (store_list, store);
-
- //store_list = g_list_append (store_list, (gpointer)store);
- mailbox_and_store_tree = glade_xml_get_widget (xml, "store-and-mailbox-tree");
- new_tree_text[0] = g_strdup (store_url);
- new_store_node = gtk_ctree_insert_node (GTK_CTREE (mailbox_and_store_tree),
- NULL,
- NULL,
- new_tree_text,
- 0,
- NULL,
- NULL,
- NULL,
- NULL,
- FALSE,
- FALSE);
-
- /* normally, use get_root_folder */
- root_folder = camel_store_get_folder (store, "");
- camel_folder_open (root_folder, FOLDER_OPEN_RW);
- subfolder_list = camel_folder_list_subfolders (root_folder);
- while (subfolder_list) {
- new_tree_text[0] = subfolder_list->data;
- new_folder = camel_store_get_folder (store, subfolder_list->data);
- camel_folder_open (new_folder, FOLDER_OPEN_RW);
- folder_list = g_list_prepend (folder_list, new_folder);
-
- new_folder_node = gtk_ctree_insert_node (GTK_CTREE (mailbox_and_store_tree),
- new_store_node,
- NULL,
- new_tree_text,
- 0,
- NULL,
- NULL,
- NULL,
- NULL,
- FALSE,
- FALSE);
-
-
- gtk_ctree_node_set_row_data (GTK_CTREE (mailbox_and_store_tree), new_folder_node, (gpointer)new_folder);
- subfolder_list = subfolder_list->next;
- }
-}
-
-static void
-delete_selected_messages ()
-{
- GtkWidget *message_clist;
- gint current_row;
- GList *selected;
- gint selected_row;
-
- CamelMimeMessage *message;
- message_clist = glade_xml_get_widget (xml, "message-clist");
- selected = GTK_CLIST (message_clist)->selection;
- while (selected) {
- selected_row = GPOINTER_TO_INT (selected->data);
- message = CAMEL_MIME_MESSAGE (gtk_clist_get_row_data (GTK_CLIST (message_clist), selected_row));
- camel_mime_message_set_flag (message, "DELETED", TRUE);
- selected = selected->next;
- }
-
-}
-
-
-static void
-expunge_selected_folders ()
-{
- GtkWidget *mailbox_and_store_tree;
- CamelFolder *folder;
- GtkCTreeNode* selected_node;
- GList *selected;
- const gchar *folder_name;
-
- mailbox_and_store_tree = glade_xml_get_widget (xml, "store-and-mailbox-tree");
-
- selected = GTK_CLIST (mailbox_and_store_tree)->selection;
- while (selected) {
-
- selected_node= GTK_CTREE_NODE (selected->data);
- folder = CAMEL_FOLDER (gtk_ctree_node_get_row_data (GTK_CTREE (mailbox_and_store_tree),
- selected_node));
- if (folder && IS_CAMEL_FOLDER (folder)) {
- folder_name = camel_folder_get_name (folder);
- printf ("folder to expunge : %s\n", folder_name);
- camel_folder_expunge (folder, FALSE);
- /* reshowing the folder this way is uggly
- but allows to check the message are
- correctly renoved and the cache works correctly */
- show_folder_messages (folder);
-
- } else {
- printf ("A selected node is a store\n");
- }
-
- selected = selected->next;
- }
-
-
-}
-
-void
-close_all ()
-{
- while (folder_list) {
- camel_folder_close (CAMEL_FOLDER (folder_list->data), TRUE);
- folder_list = folder_list->next;
- }
-
- while (store_list) {
- //camel_store_close (CAMEL_STORE (store_list->data));
- store_list = store_list->next;
- }
-
-}
-
-/* ----- libglade callbacks */
-void
-on_exit_activate (GtkWidget *widget, void *data)
-{
- close_all ();
- gtk_main_quit ();
-}
-
-
-void
-on_about_activate (GtkWidget *widget, void *data)
-{
- GtkWidget *about_widget;
-
- about_widget = glade_xml_get_widget (xml, "about_widget");
- gtk_widget_show (about_widget);
-}
-
-void
-on_new_store_activate (GtkWidget *widget, void *data)
-{
- GtkWidget *new_store_dialog;
- GtkWidget *new_store_gnome_entry;
- GtkWidget *new_store_entry;
- gchar *url_text;
-
-
- gint pressed_button;
-
- new_store_dialog = glade_xml_get_widget (xml, "new_store_dialog");
- pressed_button = gnome_dialog_run (GNOME_DIALOG (new_store_dialog));
-
- if ((pressed_button != 0) && (pressed_button != 1))
- return;
-
- new_store_gnome_entry = glade_xml_get_widget (xml, "new-store-entry");
- new_store_entry = gnome_entry_gtk_entry (GNOME_ENTRY (new_store_gnome_entry));
- url_text = gtk_entry_get_text (GTK_ENTRY (new_store_entry));
-
- if (url_text)
- add_mail_store (url_text);
-
-}
-
-
-void
-on_expunge_activate (GtkWidget *widget, void *data)
-{
- expunge_selected_folders ();
-}
-
-
-void
-on_message_delete_activate (GtkWidget *widget, void *data)
-{
- delete_selected_messages();
-}
-
-gboolean
-on_store_and_mailbox_tree_button_press_event (GtkWidget *widget, GdkEventButton *event, void *data)
-{
- gint row;
- GtkCList *clist = GTK_CLIST (widget);
-
- if (!gtk_clist_get_selection_info (clist, event->x, event->y, &row, NULL))
- return FALSE;
- if (!mailbox_button_clicked_on_row (event->button, row))
- return FALSE;
-
- return TRUE;
-
-}
-
-/* ----- init */
-int
-main(int argc, char *argv[])
-{
- GtkWidget *new_store_gnome_entry;
-
- gnome_init ("store_listing", "1.0", argc, argv);
-
- glade_gnome_init ();
- camel_init ();
- xml = glade_xml_new ("store_listing.glade", NULL);
- if (xml) glade_xml_signal_autoconnect (xml);
-
- _session = camel_session_new ();
- camel_provider_register_as_module ("../../camel/providers/MH/.libs/libcamelmh.so");
-
- new_store_gnome_entry = glade_xml_get_widget (xml, "new-store-entry");
- gnome_entry_load_history (GNOME_ENTRY (new_store_gnome_entry));
- gtk_main ();
- gnome_entry_save_history (GNOME_ENTRY (new_store_gnome_entry));
-
- return 0;
-}
-
diff --git a/tests/ui-tests/store_listing.glade b/tests/ui-tests/store_listing.glade
deleted file mode 100644
index d551c90dbb..0000000000
--- a/tests/ui-tests/store_listing.glade
+++ /dev/null
@@ -1,489 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>store_listing</name>
- <program_name>store_listing</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>True</output_main_file>
- <output_support_files>True</output_support_files>
- <output_build_files>True</output_build_files>
- <backup_source_files>True</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <translatable_strings_file></translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeApp</class>
- <name>app1</name>
- <width>600</width>
- <height>400</height>
- <title>store_listing</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <enable_layout_config>True</enable_layout_config>
-
- <widget>
- <class>GnomeDock</class>
- <child_name>GnomeApp:dock</child_name>
- <name>dock1</name>
- <allow_floating>True</allow_floating>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GnomeDockItem</class>
- <name>dockitem1</name>
- <border_width>2</border_width>
- <placement>GNOME_DOCK_TOP</placement>
- <band>0</band>
- <position>0</position>
- <offset>0</offset>
- <locked>False</locked>
- <exclusive>True</exclusive>
- <never_floating>False</never_floating>
- <never_vertical>True</never_vertical>
- <never_horizontal>False</never_horizontal>
- <shadow_type>GTK_SHADOW_OUT</shadow_type>
-
- <widget>
- <class>GtkMenuBar</class>
- <name>menubar1</name>
- <shadow_type>GTK_SHADOW_NONE</shadow_type>
-
- <widget>
- <class>GtkMenuItem</class>
- <name>file1</name>
- <stock_item>GNOMEUIINFO_MENU_FILE_TREE</stock_item>
-
- <widget>
- <class>GtkMenu</class>
- <name>file1_menu</name>
-
- <widget>
- <class>GtkMenuItem</class>
- <name>separator1</name>
- <right_justify>False</right_justify>
- </widget>
-
- <widget>
- <class>GtkPixmapMenuItem</class>
- <name>exit</name>
- <signal>
- <name>activate</name>
- <handler>on_exit_activate</handler>
- <last_modification_time>Tue, 10 Aug 1999 12:06:35 GMT</last_modification_time>
- </signal>
- <stock_item>GNOMEUIINFO_MENU_EXIT_ITEM</stock_item>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkMenuItem</class>
- <name>store2</name>
- <label>_Store</label>
- <right_justify>False</right_justify>
-
- <widget>
- <class>GtkMenu</class>
- <name>store2_menu</name>
-
- <widget>
- <class>GtkPixmapMenuItem</class>
- <name>new_store</name>
- <signal>
- <name>activate</name>
- <handler>on_new_store_activate</handler>
- <last_modification_time>Tue, 10 Aug 1999 10:29:12 GMT</last_modification_time>
- </signal>
- <stock_item>GNOMEUIINFO_MENU_NEW_ITEM</stock_item>
- <label>_New store</label>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkMenuItem</class>
- <name>folder1</name>
- <signal>
- <name>activate</name>
- <handler>on_folder1_activate</handler>
- <last_modification_time>Sat, 14 Aug 1999 17:23:25 GMT</last_modification_time>
- </signal>
- <label>Folder</label>
- <right_justify>False</right_justify>
-
- <widget>
- <class>GtkMenu</class>
- <name>folder1_menu</name>
-
- <widget>
- <class>GtkPixmapMenuItem</class>
- <name>expunge</name>
- <signal>
- <name>activate</name>
- <handler>on_expunge_activate</handler>
- <last_modification_time>Sat, 14 Aug 1999 16:36:03 GMT</last_modification_time>
- </signal>
- <label>_Expunge</label>
- <right_justify>False</right_justify>
- <stock_icon>GNOME_STOCK_MENU_CONVERT</stock_icon>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkMenuItem</class>
- <name>message_menu</name>
- <label>_Message</label>
- <right_justify>False</right_justify>
-
- <widget>
- <class>GtkMenu</class>
- <name>message_menu_menu</name>
-
- <widget>
- <class>GtkPixmapMenuItem</class>
- <name>message_delete</name>
- <signal>
- <name>activate</name>
- <handler>on_message_delete_activate</handler>
- <last_modification_time>Sat, 14 Aug 1999 14:54:04 GMT</last_modification_time>
- </signal>
- <label>_Delete</label>
- <right_justify>False</right_justify>
- <stock_icon>GNOME_STOCK_MENU_TRASH</stock_icon>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkMenuItem</class>
- <name>help1</name>
- <stock_item>GNOMEUIINFO_MENU_HELP_TREE</stock_item>
-
- <widget>
- <class>GtkMenu</class>
- <name>help1_menu</name>
-
- <widget>
- <class>GtkPixmapMenuItem</class>
- <name>about</name>
- <signal>
- <name>activate</name>
- <handler>on_about_activate</handler>
- <last_modification_time>Tue, 10 Aug 1999 12:06:58 GMT</last_modification_time>
- </signal>
- <stock_item>GNOMEUIINFO_MENU_ABOUT_ITEM</stock_item>
- </widget>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GnomeDockItem</class>
- <name>dockitem2</name>
- <border_width>1</border_width>
- <placement>GNOME_DOCK_TOP</placement>
- <band>1</band>
- <position>0</position>
- <offset>0</offset>
- <locked>False</locked>
- <exclusive>True</exclusive>
- <never_floating>False</never_floating>
- <never_vertical>False</never_vertical>
- <never_horizontal>False</never_horizontal>
- <shadow_type>GTK_SHADOW_OUT</shadow_type>
-
- <widget>
- <class>GtkToolbar</class>
- <name>toolbar1</name>
- <border_width>1</border_width>
- <orientation>GTK_ORIENTATION_HORIZONTAL</orientation>
- <type>GTK_TOOLBAR_BOTH</type>
- <space_size>16</space_size>
- <space_style>GTK_TOOLBAR_SPACE_LINE</space_style>
- <relief>GTK_RELIEF_NONE</relief>
- <tooltips>True</tooltips>
-
- <widget>
- <class>GtkButton</class>
- <child_name>Toolbar:button</child_name>
- <name>new_store_button</name>
- <signal>
- <name>clicked</name>
- <handler>on_new_store_activate</handler>
- <last_modification_time>Tue, 10 Aug 1999 12:17:17 GMT</last_modification_time>
- </signal>
- <label>new store</label>
- <stock_pixmap>GNOME_STOCK_PIXMAP_NEW</stock_pixmap>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHPaned</class>
- <child_name>GnomeDock:contents</child_name>
- <name>hpaned1</name>
- <handle_size>10</handle_size>
- <gutter_size>6</gutter_size>
- <position>0</position>
-
- <widget>
- <class>GtkCTree</class>
- <name>store-and-mailbox-tree</name>
- <width>150</width>
- <can_focus>True</can_focus>
- <signal>
- <name>button_press_event</name>
- <handler>on_store_and_mailbox_tree_button_press_event</handler>
- <last_modification_time>Mon, 16 Aug 1999 13:06:15 GMT</last_modification_time>
- </signal>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>True</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
- <child>
- <shrink>True</shrink>
- <resize>False</resize>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CTree:title</child_name>
- <name>store_and_inbox_name</name>
- <label>name</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
-
- <widget>
- <class>GtkCList</class>
- <name>message-clist</name>
- <can_focus>True</can_focus>
- <columns>3</columns>
- <column_widths>80,80,80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>True</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
- <child>
- <shrink>True</shrink>
- <resize>True</resize>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>message_date_label</name>
- <label>Date</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>message_sender_label</name>
- <label>Sender</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>message_subject_label</name>
- <label>Subject</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GnomeAppBar</class>
- <child_name>GnomeApp:appbar</child_name>
- <name>appbar1</name>
- <has_progress>True</has_progress>
- <has_status>True</has_status>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-</widget>
-
-<widget>
- <class>GnomeAbout</class>
- <name>about_widget</name>
- <visible>False</visible>
- <modal>True</modal>
- <copyright></copyright>
- <authors>Bertrand Guiheneuf &lt;Bertrand.Guiheneuf@aful.org&gt;
-</authors>
- <comments>This is a very simple program to test Camel</comments>
-</widget>
-
-<widget>
- <class>GnomeDialog</class>
- <name>new_store_dialog</name>
- <visible>False</visible>
- <title>New store</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>True</auto_close>
- <hide_on_close>True</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>new_store_label</name>
- <label>Enter complete store URL</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>29</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GnomeEntry</class>
- <name>new-store-entry</name>
- <history_id>store_name_history</history_id>
- <max_saved>15</max_saved>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
-
- <widget>
- <class>GtkEntry</class>
- <child_name>GnomeEntry:entry</child_name>
- <name>new-store-dialog-combo-entry</name>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
- <text></text>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button2</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/tests/ui-tests/test-multipart-alt.msg b/tests/ui-tests/test-multipart-alt.msg
deleted file mode 100644
index aa0da18b82..0000000000
--- a/tests/ui-tests/test-multipart-alt.msg
+++ /dev/null
@@ -1,17738 +0,0 @@
-From - Sat Jun 1 19:00:50 1996
-X-Mozilla-Status: 0001
-Message-ID: <31B0F5D1.41C6@netscape.com>
-Date: Sat, 01 Jun 1996 19:00:49 -0700
-From: Jamie Zawinski <jwz@netscape.com>
-Organization: Netscape Communications Corporation, Mozilla Division
-X-Mailer: Mozilla 2.0 (X11; U; IRIX 5.3 IP22)
-MIME-Version: 1.0
-To: Jamie Zawinski <jwz@netscape.com>
-Subject: multipart/alternative
-Content-Type: multipart/mixed; boundary="------------outer"
-
-This is a multi-part message in MIME format.
-
---------------outer
-
-Here comes some multipart/alternative junk. It's rilly rilly big.
-
---------------outer
-Content-Type: multipart/alternative; boundary="------------167E2781446B"
-
---------------167E2781446B
-Content-Type: text/plain; charset=iso-8859-1; name="album-list.txt"
-Content-Transfer-Encoding: 8bit
-Content-Disposition: inline; filename="album-list.txt"
-
- jwz's tunes
- Last modified: 1-jun-96.
-
-This is a list of all of the music I have on CD, tape, and vinyl (including
-all of the old, embarrasing stuff...) This page may look a little funny if
-you aren't using a browser that supports HTML tables, like Mozilla.
-
- ``Publishing CD lists and tape collections evokes images of
- lonely, pathetic men who talk about their cats incessantly.'' --
- Paul Phillips
-
-I used to have this set up so that clicking on any name would take you to
-the appropriate entry of the All Music Guide at
-gopher://allmusic.ferris.edu; but they have since moved their database from
-there to cdnow.com, and in the process, have obfuscated access to the
-database to such an extent that this is no longer possible. In order to get
-at the discographies, you need to weed your way through dozens of pages, and
-there seems to be no even semi-reliable way to pre-compute the URL that they
-will use. Arrgh!
-
-The Internet Movie Database has an excellent interface for this sort of
-thing; I really wish more people would emulate that system.
-
-In this list, I've included links to various related web pages that I've
-come across; one very cool and well-organized database to which many of
-these links point is The Ultimate Band List; check it out!
-
- Jamie Zawinski <jwz@netscape.com>
-
-----------------------------------------------------------------------------
-
- * Act UBL Card: 4637
- 1988: Laughter, Tears, and Rage See also: rt66.com
- See also:
- hcl.chass.ncsu.edu
- * Age of Chance
- 1987: Kiss (single)
- 1987: Don't Get Mad, Get Even (single)
- * Alien Sex Fiend UBL Card: 5291
- 1983-1992: Drive My Rocket (comp) See also: cent1.lancs.ac.uk
- 1989: Too Much Acid? (live)
- 1990: Curse
- 1992: Open Head Surgery
- 1993: Altered States of America (live)
- 1995: Inferno: The Odyssey Continuestm
- (soundtrack)
- * Alio Die
- 1993: Under a Holy Ritual
- UBL Card: 1266
- See also: www.projekt.com
- * Alphaville UBL Card: 3056
- 1984: Forever Young See also: www.escape.com
- * Altered Images
- 1981: Happy Birthday
- 1983: Bite
- 1984: Collected Images (comp)
- * An April March
- 1995: Lessons in Vengance
- 1995: Instruments of Lust and Fury
- * And Also the Trees
- 1983-1992: From Horizon to Horizon
- (comp)
- UBL Card: 1867
- See also:
- www.ugcs.caltech.edu
- See also:
- onyx.dartmouth.edu
- * Anderson, Laurie UBL Card: 1494
- 1982: Big Science See also: www.voyagerco.com
- 1983: United States Live, parts 1-4 (5
- albums) See also: www.netpart.com
- 1984: Mister Heartbreak See also: www.c3.lanl.gov
- 1986: Home of the Brave (live
- soundtrack)
- 1995: Bright Red
- * Ant, Adam
- 1980: Kings of the Wild Frontier
- 1981: Prince Charming
- 1982: Friend or Foe
- 1983: Dirk Wears White Sox
- 1985: Viva Le Rock
- 1979-1986: Antics in the Forbidden Zone
- (comp)
- UBL Card: 1205
- See also: www.uhs.uga.edu
- See also: caprec.com
-
- * Anthrax UBL Card: 2710
- 1991: Attack of the Killer B's (comp)
- * Aphex Twin
- 1993: On (EP)
- 1994: Analogue Bubblebath (EP)
- 1995: Ventolin (EP)
- UBL Card: 5279
- See also: hyperreal.com
- See also: pathfinder.com
-
- * Arcadia UBL Card: 1259
- 1985: So Red the Rose
- * Armageddon Dildos
- 1995: Lost
- UBL Card: 2538
-
- * Ash, Daniel See also:
- 1991: Coming Down isvpc146.isv.uit.no
- 1992: Foolish Thing Desire
- * Archangel, Nathalie
- 1992: Owl
- * Art of Noise UBL Card: 1918
- 1983: Who's Afraid of the Art of Noise? See also: rt66.com
-
- 1983: The Art of Noise Have Closed Up
- 1983: Beatbox
- 1983: Daft
- 1984: Edited (picture disc)
- * Attrition
- 1985: Smiling, at the Hypogonder Club
- (comp)
- UBL Card: 4232
- See also: www.projekt.com
-
- * AUTECHRe
- 1994: INCUNABULA
- 1994: BASSCAD,EP (EP)
- 1994: Amber
- 1995: Garbage
- * B52's
- 1979: B52's
- 1980: Wild Planet
- 1982: Mesopotamia
- 1983: Whammy!
- 1981: Party Mix
- UBL Card: 2268
-
- * Babes in Toyland UBL Card: 3190
- 1989: Spanking Machine
- 1991: To Mother
- 1992: Fontanelle
- 1993: Pain Killers
- 1995: Nemesisters
- * Battery
- 1992: Meat Market (EP)
- 1993: Mutate
- 1994: Lillith 3.2 (EP)
- 1995: nv
- * Bauhaus UBL Card: 1235
- 1979: Bela Lugosi's Dead (EP) See also:
- 1981: In the Flat Field gothic.acs.csulb.edu
- 1981: Mask See also:
- 1981: Press the Eject and Give Me the isvpc146.isv.uit.no
- Tape (live)
- 1983: Burning from the Inside
- 1979-1984: 1979-1984 (comp)
- 1985: The Sky's Gone Out
- 1984: The Last Temptation (live boot)
- 1984: Rest In Peace: The Final Concert
- (double live)
- 1996: The Passion of Covers: A Tribute
- (various)
- * Belly
- 1993: Star
- 1993: Moon (EP)
- 1995: Baby Silvertooth (EP)
- 1995: King
- UBL Card: 1360
- See also:
- isvpc146.isv.uit.no
-
- * Berlin UBL Card: 4156
- 1981: Love Life
- 1981: Dancing in Berlin / Lost in the
- Crowd (single)
- 1982: Pleasure Victim
- 1986: Count 3 and Pray
- * Big Black
- 1983: The Hammer Party
- 1987: Songs About Fucking
- 1992: The Rich Man's Eight-Track Tape
- (comp)
- UBL Card: 2410
-
- * Big Hat UBL Card: 1217
- 1993: Selena at my Window See also: www.cec.wustl.edu
- * Bigod 20
- 1990: The Bog (EP)
- 1991: Carpe Diem (EP)
- * Bikini Kill UBL Card: 4444
- 1991-1992: The C.D. Version of the See also: www.columbia.edu
- First Two Records
- * Billy Nayer Show, The
- 1994: The Ketchup and Mustard Man
- * Billy and the Boingers
- 1987: U Stink but I Love You (flexydisk)
- * Birdsongs of the Messozoic
- 1980-1987: The Fossil Record
- 1983: Sonic Geology
- * Birmingham 6 UBL Card: 4348
- 1995: Police State
- * Black Tape for a Blue Girl
- 1986: The Rope
- 1987: Mesmerized by the Sirens
- 1989: Ashes in the Brittle Air
- 1993: This Lush Garden Within
- UBL Card: 1202
- See also: www.projekt.com
-
- * Bleeding Stone, The
- 1994: Silent Insanity (EP)
- * Blondie
- 1980: Autoamerican
- 1983: Best of Blondie
- UBL Card: 2070
-
- * Blotto
- 1994: Collected Works
- * Body Count
- 1992: Body Count
- UBL Card: 1277
-
- * Bowie, David UBL Card: 1098
- 1995: Outside
- * Bow Wow Wow
- 1982: See Jungle
- 1981-1982: I Want Candy (comp)
- 1983: When the Going Gets Tough
- 1981-1983: Girl Bites Dog (comp)
- UBL Card: 2301
-
- * Breeders, The UBL Card: 1242
- 1993: Last Splash See also:
- isvpc146.isv.uit.no
- * Brücken, Claudia
- 1991: Love and a Million Other Things
- UBL Card: 4636
- See also: rt66.com
- See also:
- hcl.chass.ncsu.edu
- * Buggles, The
- 1979: The Age of Plastic
- 1981: Adventures in Modern Recording
- * Bush, Kate
- 1977: The Kick Inside
- 1980: Never For Ever
- 1983: The Dreaming
- 1985: Hounds of Love
- UBL Card: 1032
- See also: actor.cs.vt.edu
- See also:
- www.jrc.flinders.edu.au
- See also:
- holly.city.unisa.edu.au
- * Buzzcocks UBL Card: 1351
- 1976-1979: Operators Manual
- * Cabaret Voltaire
- 1974-1976: 1974-1976 (comp)
- 1978-1983: The Golden Moments of CV
- (comp)
- 1978: Nag Nag Nag (EP)
- 1979: Mix-Up (EP)
- 1980: Red Mecca
- 1981: The Voice of America
- 1981: Johnny Yesno (soundtrack)
- 1982: 2X45
- 1982: Eight Crepescule Tracks
- 1983: The Crackdown
- 1984: Micro-Phonies
- 1985: I Want You (single)
- 1985: Drinking Gasoline
- 1985: The Arm of the Lord
- 1985: The Convenant, the Sword, and the
- Arm of the Lord
- 1986: The Drain Train
- 1987: Code
- 1990: Listen Up (double comp)
- 1991: Body and Soul
- 1991: Colors
- 1992: Plasticity
- 1992: Western Reworks
- UBL Card: 2307
-
- * Cave, Nick UBL Card: 1273
- 1984: From Her to Eternity
- 1988: Tender Prey
- * Chemlab
- 1993: Burnout at the Hydrogen Bar
- 1994: Magnetic Field Remixes (EP)
- UBL Card: 3774
-
- * Children on Stun
- 1994: Tourniquets of Love's Desire
- * Christian Death
- 1982: Only Theatre of Pain
- 1988: Sex and Drugs and Jesus
- Christ
- 1989: All the Love All the Hate
- part Two: All the Hate
- 1994: Sexy Death God
- UBL Card: 1218
- See also:
- christian-death.acc.brad.ac.uk
-
- * Chris and Cosey
- 1989: Trust
- * Ciccone Youth
- 1988: The Whitey Album
- UBL Card: 1087
-
- * ClockDVA UBL Card: 3999
- 1981: Thirst
- 1988: The Hacker/The Act
- * Cocteau Twins
- 1982: Garlands
- 1983: Head over Heels
- 1984: The Spangle Maker (EP)
- 1984: Treasure
- 1985: Aikea-Guinea (EP)
- 1985: Echoes in a Shallow Bay
- 1985: Tiny Dynamine (EP)
- 1982-1985: The Pink Opaque
- UBL Card: 1074
- See also:
- garnet.berkeley.edu
- See also:
- isvpc146.isv.uit.no
-
- * Coil UBL Card: 1388
- 1986?: The Angelic Conversation
- (soundtrack)
- 1988: Gold is the Metal
- 1990: The Unreleased Themes for
- Hellraiser (EP)
- 1990: Panic / Tainted Love (single)
- 1991: Out of Light Cometh Darkness
- 1992: Snow (EP)
- * Concrete Blonde
- 1986: Concrete Blonde
- 1989: Free
- 1990: Bloodletting
- 1993: Walking in London (single)
- 1993: Mexican Moon
- UBL Card: 1396
-
- * Cop Shoot Cop
- 1993: Ask Questions Later
- * Course of Empire
- 1990: Course of Empire
- 1993: Infested! (EP)
- 1994: Initiation
- UBL Card: 2889
- See also:
- homepage.seas.upenn.edu
-
- * Cranes UBL Card: 2400
- 1990: Inescapable (EP) See also:
- 1991: Wings of Joy busop.cit.wayne.edu
- 1992: Self-Non-Self
- 1993: Forever
- 1993: Jewel (EP)
- 1994: Loved
- 1994: Shining Road (limited edition
- double EP)
- * Crash Worship
- 1992: ADRV
- UBL Card: 1901
- See also: www.meer.net
- See also: www.tyrell.net
- * Creatures, The UBL Card: 1216
- 1983: Feast
- 1990: Boomerang
- 1990: Fury Eyes (EP)
- 1990: Standing There (single)
- * Cure, The
- 1980: Boys Don't Cry
- 1980: Seventeen Seconds
- 1981: Faith
- 1982: Pornography
- 1982: The Walk
- 1982?: Looking for a Forest (live boot)
-
- 1983: Japanese Whispers
- 1983: Lovecats (EP)
- 1984: Concert (live)
- 1984: The Top
- 1985: The Head on the Door
- 1987: Staring at the Sea (comp)
- 1988: Kiss Me Kiss Me Kiss Me
- 1989: Disintegration
- 1989: Fascination Street (single)
- 1990: Never Enough (single)
- 1995?: Give Me the Cure: 18 DC Bands
- (various)
- UBL Card: 1159
- See also:
- www.acpub.duke.edu
- See also: pathfinder.com
-
- * Current 93 UBL Card: 3465
- 1986-1991: Island
- * Curve
- 1991: Frozen (EP)
- 1991: Cherry (EP)
- 1992: Doppelganger
- 1993: Cuckoo
- UBL Card: 1355
- See also:
- quark.stack.urc.tue.nl
- See also:
- blade.stack.urc.tue.nl
- * Cyber-Tec
- 1995: Cyber-Tec
- * Daisy Chainsaw
- 1992: Hope All Your Dreams Come True (single)
- 1992: Love Sick Pleasure (EP)
- 1992: Eleventeen
- 1994: For They Know Not What They Do
- * Dance or Die
- 1993: Psychoburbia
- * Danse Society, The
- 1984: Heaven is Waiting
- 1986: Looking Through
- * Das Ich UBL Card: 2337
- 1990: Satanische Verse
- * Dax, Danielle
- 1986-1988: Dark Adapted Eye (comp +5)
- 1988: Whistling for his Love (single)
- 1988: Cat House (single)
- 1990: Blast the Human Flower
- 1992: Pop-Eyes
- 1995: Timber Tongue (EP)
- UBL Card: 1746
-
- * Death in June
- 1992: But, What Ends When the Symbols Shatter?
- * Definition FX
- 1993: Something Inside (single)
- 1993: Light Speed Collision
- See also: www.geko.com.au
-
- * Depeche Mode UBL Card: 1041
- 1981: Speak & Spell See also: www.cis.ufl.edu
- 1981: Just Can't Get Enough / Any See also:
- Second Now (single) www.coma.sbg.ac.at
- 1982: A Broken Frame
- 1982: live singles (comp)
- 1983: Construction Time Again
- 1984: People Are People (comp +2)
- 1984: Some Great Reward
- 1985: Catching Up With Depeche Mode
- (comp +4)
- 1985: It's Called a Heart / Fly on the
- Windscreen (single)
- 1986: Black Celebration
- 1986: Stripped (single)
- 1986: A Question of Lust (single)
- 1989: 101 (double live)
- 1987: Music for the Masses
- 1987: Never Let Me Down (single)
- 1990: Personal Jesus (single)
- 199?: I Sometimes Wish I Was Famous: A
- Swedish Tribute (various)
- * Dessau
- 1995: Dessau
- 1995: Details Sketchy
- * Devo UBL Card: 1088
- 1978: Q: Are We Not Men? A: We Are See also:
- DEVO! hartke.lib.ohio-state.edu
- 1979: Freedom of Choice See also: unsane.enc.org
- 1977-1990: Greatest Hits See also: rt66.com
- 1978-1990: Greatest Misses
- * Die Krupps
- 1995: Rings of Steel
- * Die Monster Die
- 1994: Withdrawl Method
- * Die Warzau
- 1991: Big Electric Metal Bass Face
- 1994: Engine
- 1994: allgoodgirls (EP)
- * Disposable Heroes of Hiphoprisy
- 1992: Hypocrisy is the Greatest Luxury
- * Dolby, Thomas
- 1983: The Golden Age of Wireless
- 1983: The Golden Age of Wireless (2nd
- release: 2 new)
- 1984: The Flat Earth
- UBL Card: 1961
- See also: kspace.com
- See also: rt66.com
-
- * Doubting Thomas UBL Card: 1166
- 1991: Father Don't Cry (EP) See also: www.eecs.nwu.edu
- 1991: The Infidel
- * Duran Duran
- 1981: Duran Duran
- 1982: Carnival (EP)
- 1982: live (live boot)
- 1982: Rio
- 1983: Union of the Snake / Secret
- Oktober (single)
- 1983: The Wild Boys / Cracks in the
- Pavement (single)
- 1983: Seven and the Ragged Tiger
- 1987: Notorious
- 1981-1988: Decade (comp)
- UBL Card: 1259
-
- * Durutti Column UBL Card: 4853
- 1988: The Guitar and Other Machines
- * Ebn Ozn
- 1984: Feeling Cavalier
- * Elastica
- 1995: Elastica
- * Elastic Purejoy, The
- 1994: The Elastic Purejoy
- See also:
- http2.brunel.ac.uk
- * Electric Hellfire Club, The
- 1993: Burn, Baby, Burn
- 1995: Kiss the Goat
- * Elfman, Danny
- 1984: So-Lo
- UBL Card: 1089
-
- * Emergency Broadcast Network
- 1995: Telecommunication Breakdown
- * Engorged with Blood
- 1993: Engorged with Blood (EP)
- * Eno, Brian UBL Card: 1064
- 1977: Before and After Science See also: www.nwu.edu
- * Eon
- 1991: Fear: the Mindkiller (EP)
- 1992: Basket Case (EP)
- * Erasure UBL Card: 1029
- 1984-1986: various singles See also: www.cec.wustl.edu
- 1986: Wonderland
- See also: rt66.com
- * Estep, Maggie
- 1994: No More Mister Nice Girl
- * Ethyl Meatplow UBL Card: 5232
- 1993: Happy Days Sweetheart
- 1993: Devil's Johnson (single)
- * Eurythmics
- 1981: In the Garden
- 1982: Love is a Stranger (EP)
- 1982: This is the House (live EP)
- 1983: Sweet Dreams
- 1983: Touch
- 1984: 1984 (For the Love of Big Brother) (soundtrack)
- * Executive Slacks
- 1986: Fire and Ice
- * Faith and the Muse
- 1994: Elyria
- * Fixx, The UBL Card: 4603
- 1982: Shuttered Room
- 1983: Reach the Beach
- 1984: Phantoms
- 1986: Walkabout
- 1987: React (live)
- * Foetus
- 19??: Rife
- 1995: Gash
- UBL Card: 2750
-
- * Fortran 5 UBL Card: 3469
- 1991: Blues See also: rt66.com
- 1993: Bad Head Park
- * 45 Grave
- 1993: Debasement Tapes
- * Frankie goes to Hollywood UBL Card: 3222
- 1984: Welcome to the Pleasure Dome See also: rt66.com
- * Freur
- 1983: Doot Doot
- See also: rt66.com
-
- * Front 242 UBL Card: 1059
- 1979: Masterhit (EP) See also: www.ifi.uio.no
- 1983: Geography See also: www.eecs.nwu.edu
- 1987: Official Version
- 1985: No Comment
- 1982: Two In One (EP)
- 1982-1985: Backcatalogue (comp)
- 1989: Headhunter (EP)
- 1989: Front by Front
- 1989: Never Stop (EP)
- 1991: Tyrrany For You
- 1991: Tragedy For You (EP)
- 1991: Rhythm of Time (EP)
- 1993: Religion (EP)
- 1993: Animal (single)
- 1993: 06:21:03:11 Up Evil
- 1993: 05:22:09:12 Off
- * Front Line Assembly
- 1988: Convergence
- 1989: Digital Tension Dementia (EP)
- 1990: Gashed Senses and Crossfire
- 1991: Caustic Grip
- 1992: Tactical Neural Implant
- UBL Card: 1161
-
- * Fugazi UBL Card: 2053
- 1989: 13 Songs
- * Fun Boy Three
- 1982: It Ain't What You Do / Just Do It / Funrama Theme (single)
- 1981-1983: The Best of Fun Boy Three (comp)
- * Fuzzbox See also: world.std.com
- 1986: We've got a Fuzzbox and We're
- Gonna Use It!!
- 1986: Love is the Slug (single)
- 1986: Rules and Regulations (single)
- * Gabriel, Peter
- 1977: Peter Gabriel I
- 1978: Peter Gabriel II
- 1980: Peter Gabriel III
- 1982: Security
- 1983: Peter Gabriel Plays Live (double
- live)
- 1985: Birdy (soundtrack)
- 1986: So
- 1986: Live at the Civic Arena (live
- boot)
- 1989: Passion (soundtrack)
- UBL Card: 1016
- See also: www.nwu.edu
- See also:
- www.cs.clemson.edu
-
- * Garbage See also:
- 1995: Garbage hamp.hampshire.edu
- * Game Theory
- 1987: Lolita Nation
- * Gang of 4 See also:
- 1979: Entertainment http2.brunel.ac.uk
- 1979: Peel Sessions (live)
- 1981: Solid Gold
- 1981: Another Day / Another Dollar
- 1982: I Love a Man In a Uniform
- (single)
- 1982: Songs of the Free
- 1983: Is It Love (single)
- 1983: Hard
- 1983: At the Palace (live)
- 1979-1983: A Brief History of the
- Twentieth Century (comp)
- 1990: To Hell With Poverty (single)
- 1990: Mall
- 1990: Money Talks (single)
- 1995: Tatoo (single)
- 1995: Shrinkwrapped
- * Glove, The
- 1982: Blue Sunshine
- UBL Card: 1159
- See also: www.dcs.gla.ac.uk
- * God is my Copilot
- 1993: Speed Yr Trip
- * Gracious Shades
- 1995: Aberkash
- * Grind
- 1995: Kittymuzzle
- * Grotus
- 1993: Slow Motion Apocalypse
- UBL Card: 5482
-
- * Pizzicato Five
- 1995: The Sound of Music
- * PJ Harvey
- 1992: Dry
- 1993: Rid of Me
- 1993: 4-Track Demos
- 1995: Down by the Water (single)
- 1995: To Bring You My Love
- UBL Card: 1221
- See also:
- www.louisville.edu
-
- * Psychick Warriors ov Gaia
- 1992: Ov Biospheres and Sacred Groves
- * Hagen, Nina
- 1985: In Ekstasy
- 1978-1982: nunsexmonkrock / Nina Hagen Band
- * Hate Dept. See also: www.iuma.com
- 1994: Meat Your Maker
- 1995: Mainline (EP)
- * Haysi Fantayzee
- 1982: Shiny Shiny remix (single)
- * Heaven 17
- 1981: Penthouse and Pavement
- 1982: Heaven 17
- 1983: The Luxury Gap
- 1984: How Men Are
- * Hope, Peter and Kirk, Richard
- 1988: Hoodoo Talk
- UBL Card: 2307
-
- * Kershaw, Nik
- 1983: Human Racing
- * Kirk, Richard
- 1993: Virtual State
- UBL Card: 2307
-
- * Human League UBL Card: 4631
- 1979: Reproduction See also: pathfinder.com
- 1980: Travelogue
- 1981: Dare
- 1983: Fascination
- 1984: Hysteria
- 1995: Octopus
- * Hunters and Collectors
- 1987: Human Frailty
- UBL Card: 4553
-
- * Ice T UBL Card: 2342
- 1991: New Jack Hustler (EP)
- * In the Nursery
- 19??: L'Esprit
- * INXS UBL Card: 1284
- 1982: Shabooh Shoobah
- 1984: The Swing
- 1985: Listen Like Thieves
- 1988: Kick
- 1990: X
- * J., David
- 1983-1986: On Glass (comp)
- 1985: Crocodile Tears and the Velvet
- Cosh
- UBL Card: 1215
- See also:
- gothic.acs.csulb.edu
- See also:
- isvpc146.isv.uit.no
- * Jesus and Mary Chain, The UBL Card: 1228
- 1992: Reverence (EP) See also:
- 1992: Honey's Dead american.recordings.com
- 1995: Hate Rock and Roll (comp)
- * Jones, Grace
- 1993: Sex Drive (single)
- * Jones, Howard
- 1983: Humans' Lib
- 1985: Dream Into Action
- * Joy Division
- 1977-1978: Warsaw (comp)
- 1979: Unknown Pleasures
- 1980: Closer
- 1980: Transmission / Novelty (single)
- 1980: Still
- 1977-1980: Substance (comp)
- 1995: Ceremonial: A Tribute (various)
- UBL Card: 1214
- See also: www.fys.uio.no
- See also:
- csclub.uwaterloo.ca
-
- * King Crimson UBL Card: 1323
- 1969: In the Court of the Crimson King
- 1973: Larks' Tongues in Aspic
- 1974: Starless and Bible Black
- 1981: Dicipline
- 1982: Beat
- 1984: Three of a Perfect Pair
- * KMFDM
- 1993: Angst
- UBL Card: 1452
-
- * Kraftwerk UBL Card: 1027
- 1977: Trans-Europe Express (EP) See also: wwwtdb.cs.umu.se
- See also: rt66.com
- * L7
- 1988: L7
- 1990: Smell the Magic
- 1992: Bricks are Heavy
- 1994: Hungry for Stink
- UBL Card: 1998
-
- * Le&ae;ther Strip
- 1995: Legacy of Hate and Lust
- * Lemon Kittens
- 1978-1980: We Buy a Hammer for Daddy
- UBL Card: 1746
-
- * Letters to Cleo UBL Card: 3000
- 1994: Aurora Gory Alice
- * LFO
- 1991: Frequencies
- 1996: Advance
- * London After Midnight
- 1989: Selected Scenes from the End of the World
- * Lords of Acid
- 1991: Rough Sex (single)
- 1993: Voodoo U
- 1994: The Crablouse: Variations on a
- Species (single)
- UBL Card: 2356
-
- * Lords of the New Church, The
- 1983: Is Nothing Sacred?
- * Love and Rockets
- 1985: Ball of Confusion / Inside the
- Outside (single)
- 1985: Seventh Dream of Teenage Heaven
- 1986: Express
- 1986: Kundalini Express / Lucifer Sam /
- Holiday on the Moon (single)
- 1987: Earth, Sun, Moon
- 1989: No Big Deal (single)
- 1989: Motorcycle (single)
- 1989: Love and Rockets
- 1994: This Heaven (EP)
- 1994: Body and Soul (EP)
- 1994: Hot Trip to Heaven
- 1995: The Glittering Darkness (EP)
- 1996: Sweet F. A.
- UBL Card: 1215
- See also:
- american.recordings.com
- See also:
- gothic.acs.csulb.edu
-
- * Love is Colder than Death
- 1993: Oxeia
- 19??: Mental Traveller
- 19??: Teignmouth
- * Low Pop Suicide
- 1992: Disengagement (EP)
- 1992: On the Cross of Commerce
- 1994: Kiss Your Lips (remixes)
- 1995: The Death of Excellence
- UBL Card: 1984
-
- * Luscious Jackson
- 1992: In Search of Manny
- 1994: Natural Ingredients
- * Lush
- 1990: Gala
- 1992: Spooky
- 1994: Split
- UBL Card: 2359
- See also:
- isvpc146.isv.uit.no
-
- * Lwin, Annabella UBL Card: 2301
- 1986: War Boys (single)
- 1994: Car Sex (EP)
- * Lycea
- 1993: A Day in the Stark Corner
- See also: www.projekt.com
-
- * M
- 1979: Pop Musik (7inch)
- * Machines of Loving Grace
- 1991: Rite of Shiva (single)
- 1991: Machines of Loving Grace
- 1992: Burn Like Brilliant Trash (EP)
- 1993: Concentration
- 1995: Gilt
- UBL Card: 1219
- See also: www.nando.net
-
- * M|A|R|R|S
- 1987: Pump Up the Volume / Anitina (single)
- * Mallinder, Stephen
- 1982: Pow Wow
- UBL Card: 2307
-
- * Manufacture
- 1988: Terrorvision
- * March Violets, The
- 1984: Natural History
- 1982-1984: The Botanic Verses (comp)
- 1983-1985: Electric Shades (comp)
- 1985: Deep (EP)
- 1986: A Turn to the Sky / Never Look
- Back / Deep / Rebirth (single)
- UBL Card: 1114
- See also: www.cm.cf.ac.uk
-
- * Martha and the Muffins UBL Card: 2529
- 1980-1984: Far Away in Time (comp)
- * Mary's Danish
- 1991: Circa
- UBL Card: 3727
-
- * MC 900 Foot Jesus UBL Card: 1229
- 1989: Hell With the Lid Off See also:
- 1989: UFOs Are Real (EP) american.recordings.com
- 1990: Welcome to My Dream
- 1990: Killer Inside Me (EP)
- * McLachlan, Sarah
- 1992: Into the Fire (single)
- UBL Card: 1389
-
- * Meat Beat Manifesto UBL Card: 3626
- 1988: Armed Audio Warfare
- 1990: Dog Star Man (EP)
- 1990: 99%
- 1990: Psyche Out (EP)
- 1990: Now (EP)
- 1992: Satryicon
- 1993: Peel Session (EP)
- * Medicine
- 1993: The Buried Life
- 1994: Shot Forth Self Living
- UBL Card: 1432
- See also: kspace.com
-
- * Mephisto Walz
- 1986-1992: Crocosmia
- 1993: Terra-Regina (comp)
- 1994: The Eternal Deep
- 1995: Thalia
- * Midnight Oil
- 1979: Head Injuries
- 1981: Place without a Postcard
- 1983: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1...
- 1985: Red Sails in the Sunset
- UBL Card: 1102
- See also:
- www.stevens-tech.edu
-
- * Miller, Roger
- 1987: Maximum Electric Piano
- * Ministry
- 1983: With Sympathy
- 1984: Halloween Remix / The Nature of
- Outtakes (EP)
- 1981-1984: various singles
- 1985: Cold Life
- 1985: Over the Shoulder / Isle of Man
- (EP)
- 1986: Twitch
- 1988: 12 Inch Singles (comp)
- 1988: The Land of Rape and Honey
- 1988: Stigmata / Tonight we Murder (EP)
-
- 1989: The Mind is a Terrible Thing to
- Taste
- 1991: Jesus Built my Hotrod (EP)
- 1992: Psalm 69
- UBL Card: 1100
- See also:
- csclub.uwaterloo.ca
-
- * Miranda Sex Garden UBL Card: 3007
- 1991: Gush Forth my Tears See also:
- 1991: Madra sksol1.physics.sunysb.edu
- 1992: Iris
- 1993: Suspiria
- 1994: Fairytales of Slavery
- * Missing Persons
- 1982: Missing Persons (EP)
- 1982: Spring Session M
- 1984: Rhyme & Reason
- 1982-1984: Best of (comp)
- * Mistle Thrush
- 199?: Silt
- 1994: Agus Amàrach
- * Mission, The
- 1986: God's Own Medicine
- 1987: the First Chapter
- UBL Card: 2045
-
- * Mission of Burma
- 1987: Forget
- * Morissette, Alanis
- 1995: Jagged Little Pill
- UBL Card: 3127
-
- * Morrison, Patricia UBL Card: 1062
- 1994: Reflect on This
- * Moyet, Allison
- 1985: ALF
- UBL Card: 3410
- See also: rt66.com
- * Murder Inc.
- 1992: Murder Inc.
- * Mussolini Headkick
- 1990: Blood on the Flag
- * Murphy, Peter UBL Card: 1235
- 1986: Should the World Fail to Fall See also:
- Apart gothic.acs.csulb.edu
- See also:
- isvpc146.isv.uit.no
- * My Bloody Valentine
- 1988: Isn't Anything
- 1991: Loveless
- UBL Card: 1912
-
- * My Life with the Thrill Kill Kult UBL Card: 3478
- 1988: I See Good Spirits and I See Bad
- Spirits
- 1989: K00Ler than Jesus
- 1990: Confessions of a Knife...
- 1990: Swine & Roses / Naive (KMFDM)
- (single)
- * Neither/Neither World
- 1994: Tales of True Crime
- * Neotek
- 1995: Brain over Muscle
- * New Fast Automatic Daffodils
- 1991: Pigeonhole
- 1992: Bong
- * New Order UBL Card: 1126
- 1981: Movement See also:
- 1981: Temptation / Hurt (single) topquark.cecer.army.mil
- 1982: Factus 8
- 1984: Power, Corruption, and Lies
- 1984: Blue Monday (single)
- 1985: The Perfect Kiss (single)
- 1985: Confusion (single)
- 1985: Low Life
- 1983-5: various singles
- 1986: Brotherhood
- * Nine Inch Nails
- 1989: Pretty Hate Machine
- 1989: Head Like a Hole (remixes)
- 1990: Sin (remixes)
- 1992: Broken (EP)
- 1992: Fixed (remixes)
- 1994: March of the Pigs (EP)
- 1994: The Downward Spiral
- 1994: Closer to God (EP)
- 1994: Closer (Further Away) (EP)
- 1994: Further Down the Spiral (remixes)
- UBL Card: 1046
- See also: www.scri.fsu.edu
- See also: metaverse.com
-
- * Nirvana UBL Card: 1052
- 1991: Nevermind See also: www.ludd.luth.se
- See also:
- home.earthlink.net
- * Nitzer Ebb
- 1987: That Total Age
- 1987: Warsaw Ghetto (EP)
- 1987: So Bright So Strong (remixes)
- 1987: Get Clean (remixes)
- 1988: Control: I'm Here (single)
- 1989: Hearts and Minds (single)
- 1989: Belief
- 1990: Showtime
- 1991: I Give to You (single)
- 1991: As Is (single)
- 1991: Ebbhead
- 1991: Godhead (EP)
- UBL Card: 1164
- See also: www.eecs.nwu.edu
-
- * No Doubt
- 1995: Tragic Kingdom
- * Noise Unit
- 1989: Grinding Into Emptiness
- * Nosferatu
- 1993: Rise
- * Numan, Gary
- 1978: Tubeway Army
- 1978: The Plan
- 1979: Replicas
- 1979: The Pleasure Principle
- 1980: Telekon
- 1981: Warriors
- 1981: Dance
- 1982: I, Assassin
- 1984: White Noise (double live)
- 1987: Ghost (double live)
- UBL Card: 1409
-
- * Offspring
- 1994: Smash
- * Oingo Boingo
- 1980: Forbidden Zone (soundtrack)
- 1981: Only a Lad
- 1983: Good for Your Soul
- 1986: Dead Man's Party
- 1987: Nothing to Fear
- UBL Card: 1089
- See also: rhino.harvard.edu
-
- * Orb, The UBL Card: 1121
- 1991: The Orb's Adventures Beyond the See also: www.hyperlink.com
- Ultraworld
- 1991: Aubrey Mixes, the Ultraworld See also:
- Excursions www.phlab.missouri.edu
- 1991: Little Fluffy Clouds (EP) See also: rt66.com
- 1992: U.F.Orb
- 1993: live 93 (double live)
- 1994: Pomme Fritz
- * Orbital
- 1993: Orbital 2
- UBL Card: 2049
- See also: rt66.com
- * Orchestral Manoeuvers in the Dark UBL Card: 5370
- 1980: OMD (US release)
- 1980: OMD (UK release)
- 1981: Bunker Soldiers
- 1981: Architecture & Morality
- 1983: Dazzle Ships
- 1984: Junk Culture
- 1985: Crush
- * Oxygiene 23
- 1995: Blue
- * 187 Calm
- 1995: One Eighty Seven Calm (EP)
- * 1000 Homo DJs
- 1990: Supernaut (EP)
- * Opus III
- 1991: Mind Fruit
- 1994: Guru Mother
- * Pain Teens
- 1990: Born in Blood / Case Histories
- 1992: Stimulation Festival
- 1993: Destroy Me, Lover
- 1995: Beast of Dreams
- * Paralysed Age
- 1994: Nocturne
- * Pigface
- 1990: Gub
- UBL Card: 1165
- See also: www.eecs.nwu.edu
- * Pink Floyd UBL Card: 1008
- 1973: Dark Side of the Moon
- 1975: Wish You were Here
- 1978: The Wall (double soundtrack)
- 1981: A Collection of Great Dance Songs
- (comp)
- 1995: A Saucerful of Pink: a Tribute
- (double, various)
- * Polygon Window
- 1993: Surfing on Sine Waves
- UBL Card: 5279
-
- * Police UBL Card: 1172
- 1979: Outlandos D'Amour
- 1980: Ghost in the Machine
- 1981: Zenyatta Mondatta
- 1983: Synchronicity
- * Poe
- 1995: Hello
- * Pop, Iggy UBL Card: 4345
- 1977: Lust for Life
- * Powerman 5000
- 1995: The Blood Splat Rating System
- * Powerstation, The UBL Card: 1259
- 1985: The Powerstation
- * Pram
- 199?: Iron Lung (EP)
- 1995: Helium
- 1995: Sargasso Sea
- * Prick UBL Card: 3683
- 1995: Prick
- * Primus
- 1991: Sailing on the Seas of Cheese
- UBL Card: 1055
-
- * Project Pitchfork
- 1991: Dhyani
- * Propaganda
- 1985: A Secret Wish, US version
- 1985: A Secret Wish, UK version
- (remixes)
- 1985: p:machinery (polish / passive) /
- Frozen Faces (single)
- 1985: Duel / Jewel (single)
- 1985: Wishful Thinking (remixes)
- 1990: Heaven Give Me Words (EP)
- 1995: p:machinery t-empo remix (single)
- UBL Card: 4636
- See also: rt66.com
- See also:
- hcl.chass.ncsu.edu
-
- * Prophetess, The
- 1993: The Prophetess
- * Public Image Limited
- 1985: Album
- * Rage Against the Machine UBL Card: 1424
- 1992: Rage Against the Machine
- * Romeo Void
- 1981: Never Say Never / Present Tense (single)
- * Blaine Reininger
- 1989: Expatriate Journals
- * Red Aunts
- 1993: Drag
- 1994: Bad Motherfucker 400-Z
- 1995: #1 Chicken
- UBL Card: 4619
-
- * Re-Flex
- 1983: The Politics of Dancing / Re-Flex It (single)
- * Revolting Cocks
- 1986: Big Sexy Land
- 1988: You Goddamned Son of a Bitch
- (double live)
- 1989: Stainless Steel Providers (EP)
- 1990: Beers, Steers, and Queers
- 1993: Linger Ficken' Good
- UBL Card: 1100
-
- * Ridgway, Stan UBL Card: 2904
- 1986: The Big Heat
- * Rosemarys, The
- 1993: Providence
- * Rosetta Stone
- 1993: Adrenaline
- 1995: The Tyrrany of Inaction
- * Ruby
- 1995: Salt Peter
- * Rump
- 1994: Hating Brenda
- * Rush
- 1984: Grace Under Pressure
- UBL Card: 1039
-
- * Sandoz
- 1993: Digital Lifeforms
- * Scatterbrain
- 1990: Here Comes Trouble
- * Scar Tissue
- 1995: Scar Tissue
- * Scritti Politti
- 1985: Cupid & Psyche
- * Severed Heads UBL Card: 1480
- 1983: Since the Accident
- 1986: Come Visit the Big Bigot
- 1987: Bad Mood Guy
- * Sex Gang, Andi
- 1994: Arco Valley
- * Sex Gang Children
- 1992: Blind
- 1993: Dieche
- 1993: Medea
- * Shadow Project
- 1991: Shadow Project
- * Sharkbait
- 1991: Blowtorch Facelift
- 1993: Crushits
- * Sheep on Drugs
- 1993: Greatest Hits (comp)
- 1995: Suck (EP)
- * Shriekback UBL Card: 1248
- 1982: Tench See also:
- 1983: Care http2.brunel.ac.uk
- 1983: Care (Y version)
- 1983: Lined Up / Hapax Legomena
- (single)
- 1983: Lined Up / My Spine / Accretions
- /Into Method (single)
- 1983: My Spine / Accretions / Clear
- Trails (single)
- 1983: Sexthinkone / Here Comes My Hand
- (single)
- 1984: Jamscience (UK release)
- 1984: Jamscience (Holland release)
- 1984: Knowledge, Power, Truth, and Sex
- 1984: Mercy Dash (picture disc, single)
-
- 1984: Hand on my Heart (picture disc,
- single)
- 1985: The Infinite (comp)
- 1985: Oil and Gold
- 1985: Fish Below the Ice (EP)
- 1983-1985: Priests and Kannibals (comp)
-
- 1986: Big Night Music
- 1986: Islam Grotto (live boot)
- 1988: Evolution (comp)
- 1990: The Dancing Years (remixes)
- 1993: Sacred City
- * Siglo XX
- 1983-1986: Antler Tracks I (comp)
- 1986: Fear and Desire
- * Single Gun Theory UBL Card: 1404
- 1989?: Exorcise this Wasteland See also: www.magna.com.au
- 1991: Like Stars in my Hands
- 1993: Burning Bright (but Unseen) (EP)
- 1994: Flow, River of my Soul
- * Siouxsie and the Banshees
- 1977: Peel Sessions (live EP)
- 1978: Peel Sessions 2 (live EP)
- 1978: The Scream
- 1979: Join Hands
- 1980: Kaleidoscope
- 1981: juju
- 1981: Once Upon a Time (comp)
- 1981: Spellbound / Follow the Sun / Slap
- Dash Snap (single)
- 1982: Slowdive / Obsession II / Cannibal
- Roses (single)
- 1982: A Kiss in the Dream House
- 1983: Nocturne (double live)
- 1984: Hyaena
- 1985: Tinderbox
- 1986: Through the Looking Glass
- 1987: Song from the Edge of the World
- (single)
- 1988: Peekaboo / False Face / Catwalk
- (single)
- 1988: Peepshow
- 1991: Superstition
- 1991: Kiss Them for Me (EP)
- 1995: The Rapture
- UBL Card: 1216
-
- * Sister Machine Gun UBL Card: 3612
- 1992: Sins of the Flesh
- 1994: The Torture Technique
- 1994: Nothing (single)
- 1994: Wired / Lung (single)
- 1995: Burn
- * Sisterhood, The
- 1986: Gift
- UBL Card: 1115
- See also: www.cm.cf.ac.uk
- * Sisters of Mercy UBL Card: 1062
- 1985: First and Last and Always See also: www.cm.cf.ac.uk
- 1988: Floodland
- 1988: More / You Could be the One
- (single)
- 1990: Vision Thing
- 1992: Some Girls Wander by Mistake
- (comp)
- 1992: Temple of Love 1992 (single)
- 1993: First and Last and Forever: A
- Tribute (various)
- 1993: Under the Gun / Alice 1993
- (single)
- * Skeletal Family
- 1984-1985: Burning Oil / Futile Combat
- * Skinny Puppy UBL Card: 1166
- 1983: Back and Forth, Series Two See also: www.eecs.nwu.edu
- 1984: Bites
- 1984: Remission
- 1984: Bites and Remission
- 1986: Mind: the Perpetual Intercourse
- 1986: Dig It (EP)
- 1987: Cleanse, Fold, and Manipulate
- 1988: Vivisect VI
- 1989: Rabies
- 1990: Too Dark Park
- 1990: Censor (EP)
- 1992: 12 Inch Anthology (comp)
- 1992: Last Rights
- * Sky Cries Mary
- 1993: A Return to the Inner Experience
- 1994: This Timeless Turning
- 1994: Every Iceberg is Afire / Deep
- Sunless Sea / Cornerman (single)
- UBL Card: 1437
- See also: www.starwave.com
-
- * Snog
- 1995: Dear Valued Customer
- * Soh Daiko
- 1990: Taiko Drum Ensemble
- * Some, Belouis
- 1984: Some People (single)
- * Southern Death Cult
- 1982-1983: Southern Death Cult (comp)
- * Spahn Ranch
- 1995: The Coiled One
- * SSQ
- 1984: Playback
- 1986: Insecurity (single)
- * Stabbing Westward UBL Card: 2415
- 1993: Violent Mood Swings (EP)
- 1994: Ungod
- 1995: What Do I Have to Do / Falls
- Apart (single)
- 1995: Wither Blister Burn and Peel
- * Strange Boutique
- 199?: Charm
- 199?: The Kindest Words
- 199?: The Loved One
- See also: www.iuma.com
-
- * Steroid Maximus UBL Card: 2750
- 1991: Quilombo
- 1992: Gondwanaland
- * Sugarcubes, The
- 1988: Life's Too Good
- UBL Card: 3419
- See also: math-www.uio.no
- * Sunscreem
- 1992: O3
- * Switchblade Symphony
- 1992: Fable (tape/EP)
- 1993: Elegy (tape/EP)
- 1995: Serpentine Gallery
- * Talking Heads UBL Card: 1012
- 1977: Talking Heads '77
- 1978: More Songs About Buildings and
- Food
- 1979: The Name of This Band is Talking
- Heads (double live)
- 1981: Fear of Music
- 1983: Sp eak in gI n To ngu es
- 1985: Stop Making Sense (live
- soundtrack)
- 1985: Little Creatures
- * Tears For Fears
- 1983: The Hurting
- 1985: Songs From the Big Chair
- UBL Card: 2763
-
- * Tel Basta
- 1996: Lickerish
- * Thanatos
- 1995: An Embassy in Gaius
- * Therapy? UBL Card: 2044
- 1992: Caucasian Psychosis
- 1992: Nurse
- * 13 Mg.
- 1995: Trust and Obey
- * This Ascension
- 1991: Light and Shade
- 1994: Walk Softly, a Dream Lies Here
- * Throwing Muses
- 1986: Throwing Muses
- UBL Card: 1357
-
- * Tinfed
- 1993: Synaptic Hardware
- * Tin Machine
- 1989: Tin Machine
- UBL Card: 1098
-
- * Tit Wrench United
- 1993: Full Employment
- * Tom Tom Club
- 1981: Tom Tom Club
- 1983: Close to the Bone
- UBL Card: 1012
-
- * Tones on Tail UBL Card: 1235
- 1982: Tones on Tail See also:
- 1984: Pop gothic.acs.csulb.edu
- 1984: Performance / Shakes (single) See also:
- 1982-1984: Night Music (comp) isvpc146.isv.uit.no
- * Trance Mission
- 1993: Trance Mission
- * Trance to the Sun
- 1994: Ghost Forest
- 1995: Bloom, Flowers, Bloom!
- 1995: Venomous Eve
- * Transvision Vamp
- 1991: Little Magnets versus the Bubble
- of Babble
- UBL Card: 5305
-
- * Trio
- 1983: Trio and Error
- * Tubes, The
- 1981: Tubes Rarities And Smash Hits [T.R.A.S.H]
- * Tuxedomoon
- 1980: Half-Mute
- 1983: A Thousand Lives by Picture
- 1985: Holy Wars
- * Underflowers
- 1995: Underflowers
- * Urban Dance Squad UBL Card: 4626
- 1991: Life'n Perspectives of a Genuine
- Crossover
- * Usherhouse
- 1993: Molting
- 1994: Flux
- * Ultravox
- 1978: Systems of Romance
- * Van Acker, Luc
- 1980: Taking Snapshots, Volume 1
- UBL Card: 1100
-
- * Vangelis UBL Card: 1023
- 1994: Blade Runner (soundtrack) See also: rt66.com
- * various
- 1980: URGH! A Music War (live comp)
- 1981-1994: Wax Trax Black Box (comp)
- 1982-198?: In Goth Daze (Anagram version) (comp)
- 1982-1994: In Goth Daze (Cleopatra version) (comp)
- 1982-1993: The Whip (Cleopatra) (comp)
- 1984-1985: IQ6: Zang Tumb Tuum Sampled (comp)
- 1984-1995: DEC ADE NCE (Nettwerk) (comp)
- 1988: This is Electronic Body Music (comp)
- 1990: From Across This Gray Land #2 (Projekt) (comp)
- 1990: Doctor Death IV: The Marvels of Insect Life (double comp)
- 1990: Red Hot + Blue (comp)
- 1991: Bouquet of Dreams (comp)
- 1980-1992: Gothic Rock (comp)
- 1992: Mindfield (Third Mind) (comp)
- 1992: From Across This Gray Land #3 (Projekt) (comp)
- 1992: The Cyberflesh Conspiracy (comp)
- 1992: Gárgula Mecânica: World Electrostatic Assembly (comp)
- 1992: CCCC: California Cyber Crash Compilation (Cop) (comp)
- 1993: Shut Up Kitty (comp)
- 1988-1993: Can You See It Yet? (Invisible) (comp)
- 1994: Mysterious Encounters (Cleopatra) (comp)
- 1994: The Crow (comp)
- 1994: Totentanz: The Best of Zoth Ommog (double comp)
- 1992: Hy! (Hyperium Compilation volume 1) (comp)
- 1993: World Domination Sampler (comp)
- 1993: Rivet Head Culture (comp)
- 1993: Artificial Intelligence (Warp) (comp)
- 1994: Artificial Intelligence II (Warp) (comp)
- 1994: Big Hard Disk #2 (Smash) (comp)
- 1994: Kindred Spirits (Bedazzled) (comp)
- 1994: Plug In + Turn On (Instinct) (comp)
- 1994: The Disease of Lady Madeline (Anubis) (comp)
- 1994: Natural Born Killers (soundtrack comp)
- 1994: Afterburn (Wax Trax) (comp)
- 1994: Chaos Compilation (Cop) (comp)
- 1994: Electrocity Vol. 5 (comp)
- 1995: Gothik (Cleopatra) (double comp)
- 1995: Godfathers of German Gothic (comp)
- 1995: Heavenly Voices III (Hyperium) (comp)
- 1995: Mortal Kombat (soundtrack comp)
- 1995: The Tyranny Off the Beat (Off Beat/Cleopatra) (comp)
- 1995: Forced Cranial Removal (Fifth Colvmn) (comp)
- 1995: Dreams in the Witch House (Grave News) (comp)
- * Vega, Suzanne UBL Card: 2088
- 1992: 99.9F
- * Vinyl Devotion
- 1994: If They Know You're Trying
- * Volume Magazine
- 1991: Volume: 1 (comp)
- 1991: Volume: 2 (comp)
- 1992: Volume: 3 (comp)
- 1992: Volume: 4 (comp)
- 1995: Wasted: The Best of Volume (double comp)
- * Waitresses, The
- 1981: Wasn't Tomorrow Wonderful?
- 1982: Bruiseology
- 1978-1981: Best Of (comp)
- * Wake, The
- 1993: Masked
- * Wall of Voodoo
- 1980: fpfpfpfpfpfp
- 1981: Dark Continent
- 1982: Call of the West
- 1986: Seven Days in Sammystown
- 1987: Happy Planet
- * Wang Chung UBL Card: 2245
- 1983: Points On the Curve
- 1985: To Live and Die in L.A.
- (soundtrack)
- * Westworld
- 1987: Rockulator
- 1991: Movers and Shakers
- 1991: Do No Wrong (single)
- * Whale UBL Card: 3790
- 1994: Hobo Humpin Slobo Babe / Eye 842 See also: www.vmg.co.uk
- (single)
- 1994: Hobo Humpin Slobo Babe / Lips /
- Eye 842 (single)
- 1994: Pay for Me (EP)
- 1995: We Care
- 1995: I'll Do Ya (EP)
- 1995: Hobo Humpin Slobo Babe (3 mixes)
- (single)
- 1995: Hobo Humpin Slobo Babe / You and
- Your Sister / Singer Star (single)
- * White Zombie
- 1992: Nightcrawlers: the KMFDM Remixes (EP)
- * Wilde, Kim
- 1981: Kim Wilde
- 1984: Teases & Dares
- 1981-1993: The Singles Collection (comp)
- * X
- 1988: Live at the Whiskey-a-Go-Go (double live)
- * X Marks the Pedwalk
- 1994: The Killing Had Begun
- * Xorcist
- 1991: Damned Souls
- 1993: Bitches (EP)
- * XTC UBL Card: 1044
- 1982: Waxworks
- 1983: Mummer
- 1984: The Big Express
- 1985: 25 O'Clock
- * Xymox
- 1985: Clan of Xymox
- UBL Card: 1295
- See also:
- isvpc146.isv.uit.no
- * Yamashirogumi, Geinoh
- 1990: Akira (soundtrack)
- * Yazoo
- 1982: Upstairs at Eric's
- 1982: The Other Side of Love (single)
- 1983: You and Me Both
- 1983: Nobody's Diary / State Farm
- (single)
- 1983: Situation (EP)
- UBL Card: 4309
- See also: rt66.com
-
- * Yello UBL Card: 1506
- 1980: Solid Pleasure See also: newton.space.net
- 1981: Stella See also: rt66.com
- 1983: You Gotta Say Yes to Another
- Excess
- 1987: One Second
- 1988: Flag
- * Yes
- 1972: Fragile
- 1975: Classic Yes
- 1980: Drama
- 1983: 90125
- UBL Card: 1038
-
---------------167E2781446B
-Content-Type: text/html; charset=us-ascii; name="album-list.html"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: inline; filename="album-list.html"
-
-<BASE HREF="/tmp/album-list.html">
-
-<H3 ALIGN=CENTER>jwz's tunes<BR>Last modified: 06-Apr-96.</H3>
-
-
-<TITLE>jwz's tunes</TITLE>
-This is a list of all of the music I have on CD, tape, and vinyl
-(including all of the old, embarrasing stuff...) This page may look
-a little funny if you aren't using a browser that supports HTML
-tables, like
-<A HREF="http://home.netscape.com/comprod/mirror/index.html">Mozilla</A>.<P>
-
-<BLOCKQUOTE>
-``<I>Publishing CD lists and tape collections evokes images of
-lonely, pathetic men who talk about their cats incessantly.</I>''
--- Paul Phillips
-</BLOCKQUOTE>
-
-I used to have this set up so that clicking on any name would take
-you to the appropriate entry of the All Music Guide at
-<TT>gopher://allmusic.ferris.edu</TT>; but they have since moved their
-database from there to
-<A HREF="http://allmusic.com/cgi-bin/mserver/SID=0/$amgpages=amg+main"><TT>cdnow.com</TT></A>,
-and in the process, have obfuscated access to the database to such an extent
-that this is no longer possible. In order to get at the discographies, you
-need to weed your way through dozens of pages, and there seems to be no even
-semi-reliable way to pre-compute the URL that they will use. Arrgh!<P>
-
-<A HREF="http://www.cm.cf.ac.uk/Movies/welcome.html">The Internet Movie
-Database</A> has an excellent interface for this sort of thing; I really
-wish more people would emulate that system.<P>
-
-In this list, I've included links to various related web pages that I've
-come across; one very cool and well-organized database to which many of
-these links point is
-<A HREF="http://american.recordings.com/wwwofmusic/ubl/ubl.shtml">The
-Ultimate Band List</A>; check it out!<P>
-
-<P ALIGN=CENTER>
-<A HREF="http://home.netscape.com/people/jwz/">Jamie Zawinski</A>
-<A HREF="mailto:jwz@netscape.com"><CODE>&lt;jwz@netscape.com&gt;</CODE></A>
-<P>
-
-<HR size=4><UL>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Act</B>
-
- <BR><I>1988:</I> Laughter, Tears, and Rage
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4637">4637</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/ztt">rt66.com</A>
- <BR><I>See also: </I><A HREF="http://hcl.chass.ncsu.edu/~phelpsgm/claudia.htm">hcl.chass.ncsu.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Age of Chance</B>
-
- <BR><I>1987:</I> Kiss <I>(single)</I>
- <BR><I>1987:</I> Don't Get Mad, Get Even <I>(single)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Alien Sex Fiend</B>
-
- <BR><I>1983-1992:</I> Drive My Rocket <I>(comp)</I>
- <BR><I>1989:</I> Too Much Acid? <I>(live)</I>
- <BR><I>1990:</I> Curse
- <BR><I>1992:</I> Open Head Surgery
- <BR><I>1993:</I> Altered States of America <I>(live)</I>
- <BR><I>1995:</I> Inferno: The Odyssey Continues<SUP>tm</SUP> <I>(soundtrack)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+5291">5291</A>
- <BR><I>See also: </I><A HREF="http://cent1.lancs.ac.uk/~unslost/guide/music/asf.html">cent1.lancs.ac.uk</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Alio Die</B>
-
- <BR><I>1993:</I> Under a Holy Ritual
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1266">1266</A>
- <BR><I>See also: </I><A HREF="http://www.projekt.com/bands/index.html">www.projekt.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Alphaville</B>
-
- <BR><I>1984:</I> Forever Young
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3056">3056</A>
- <BR><I>See also: </I><A HREF="http://www.escape.com/~dant/av/">www.escape.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Altered Images</B>
-
- <BR><I>1981:</I> Happy Birthday
- <BR><I>1983:</I> Bite
- <BR><I>1984:</I> Collected Images <I>(comp)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>An April March</B>
-
- <BR><I>1995:</I> Lessons in Vengance
- <BR><I>1995:</I> Instruments of Lust and Fury
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>And Also the Trees</B>
-
- <BR><I>1983-1992:</I> From Horizon to Horizon <I>(comp)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1867">1867</A>
- <BR><I>See also: </I><A HREF="http://www.ugcs.caltech.edu/~scottyt/AATT.html">www.ugcs.caltech.edu</A>
- <BR><I>See also: </I><A HREF="http://onyx.dartmouth.edu/~dupras/aatt/aatt.html">onyx.dartmouth.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Anderson, Laurie</B>
-
- <BR><I>1982:</I> Big Science
- <BR><I>1983:</I> United States Live, parts 1-4 <I>(5 albums)</I>
- <BR><I>1984:</I> Mister Heartbreak
- <BR><I>1986:</I> Home of the Brave <I>(live soundtrack)</I>
- <BR><I>1995:</I> Bright Red
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1494">1494</A>
- <BR><I>See also: </I><A HREF="http://www.voyagerco.com/LA/VgerLa.html">www.voyagerco.com</A>
- <BR><I>See also: </I><A HREF="http://www.netpart.com/phil/laurie.html">www.netpart.com</A>
- <BR><I>See also: </I><A HREF="http://www.c3.lanl.gov:8077/cgi/jimmyd/quoter?home">www.c3.lanl.gov</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Ant, Adam</B>
-
- <BR><I>1980:</I> Kings of the Wild Frontier
- <BR><I>1981:</I> Prince Charming
- <BR><I>1982:</I> Friend or Foe
- <BR><I>1983:</I> Dirk Wears White Sox
- <BR><I>1985:</I> Viva Le Rock
- <BR><I>1979-1986:</I> Antics in the Forbidden Zone <I>(comp)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1205">1205</A>
- <BR><I>See also: </I><A HREF="http://www.uhs.uga.edu/Adam_Ant/Adam.html">www.uhs.uga.edu</A>
- <BR><I>See also: </I><A HREF="http://caprec.com/Ant/">caprec.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Anthrax</B>
-
- <BR><I>1991:</I> Attack of the Killer B's <I>(comp)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2710">2710</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Aphex Twin</B>
-
- <BR><I>1993:</I> On <I>(EP)</I>
- <BR><I>1994:</I> Analogue Bubblebath <I>(EP)</I>
- <BR><I>1995:</I> Ventolin <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+5279">5279</A>
- <BR><I>See also: </I><A HREF="http://hyperreal.com/music/artists/aphex_twin/afxeffect.html">hyperreal.com</A>
- <BR><I>See also: </I><A HREF="http://pathfinder.com/elektra/artists/aphex/aphex.html">pathfinder.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Arcadia</B>
-
- <BR><I>1985:</I> So Red the Rose
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1259">1259</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Armageddon Dildos</B>
-
- <BR><I>1995:</I> Lost
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2538">2538</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Ash, Daniel</B>
-
- <BR><I>1991:</I> Coming Down
- <BR><I>1992:</I> Foolish Thing Desire
- </TD><TD>
-<I>See also: </I><A HREF="http://isvpc146.isv.uit.no/html/group/danielashglenncampling.html#danielashglenncampling">isvpc146.isv.uit.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Archangel, Nathalie</B>
-
- <BR><I>1992:</I> Owl
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Art of Noise</B>
-
- <BR><I>1983:</I> Who's Afraid of the Art of Noise?
- <BR><I>1983:</I> The Art of Noise Have Closed Up
- <BR><I>1983:</I> Beatbox
- <BR><I>1983:</I> Daft
- <BR><I>1984:</I> Edited <I>(picture disc)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1918">1918</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/ztt">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Attrition</B>
-
- <BR><I>1985:</I> Smiling, at the Hypogonder Club <I>(comp)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4232">4232</A>
- <BR><I>See also: </I><A HREF="http://www.projekt.com/bands/attrition.html">www.projekt.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>AUTECHRe</B>
-
- <BR><I>1994:</I> INCUNABULA
- <BR><I>1994:</I> BASSCAD,EP <I>(EP)</I>
- <BR><I>1994:</I> Amber
- <BR><I>1995:</I> Garbage
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>B52's</B>
-
- <BR><I>1979:</I> B52's
- <BR><I>1980:</I> Wild Planet
- <BR><I>1982:</I> Mesopotamia
- <BR><I>1983:</I> Whammy!
- <BR><I>1981:</I> Party Mix
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2268">2268</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Babes in Toyland</B>
-
- <BR><I>1989:</I> Spanking Machine
- <BR><I>1991:</I> To Mother
- <BR><I>1992:</I> Fontanelle
- <BR><I>1993:</I> Pain Killers
- <BR><I>1995:</I> Nemesisters
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3190">3190</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Battery</B>
-
- <BR><I>1992:</I> Meat Market <I>(EP)</I>
- <BR><I>1993:</I> Mutate
- <BR><I>1994:</I> Lillith 3.2 <I>(EP)</I>
- <BR><I>1995:</I> nv
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Bauhaus</B>
-
- <BR><I>1979:</I> Bela Lugosi's Dead <I>(EP)</I>
- <BR><I>1981:</I> In the Flat Field
- <BR><I>1981:</I> Mask
- <BR><I>1981:</I> Press the Eject and Give Me the Tape <I>(live)</I>
- <BR><I>1983:</I> Burning from the Inside
- <BR><I>1979-1984:</I> 1979-1984 <I>(comp)</I>
- <BR><I>1985:</I> The Sky's Gone Out
- <BR><I>1984:</I> The Last Temptation <I>(live boot)</I>
- <BR><I>1984:</I> Rest In Peace: The Final Concert <I>(double live)</I>
- <BR><I>1996:</I> The Passion of Covers: A Tribute <I>(various)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1235">1235</A>
- <BR><I>See also: </I><A HREF="http://gothic.acs.csulb.edu:8080/~vamp/Gothic/Text/bauhaus-discog.html">gothic.acs.csulb.edu</A>
- <BR><I>See also: </I><A HREF="http://isvpc146.isv.uit.no/html/group/bauhaus.html#bauhaus">isvpc146.isv.uit.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Belly</B>
-
- <BR><I>1993:</I> Star
- <BR><I>1993:</I> Moon <I>(EP)</I>
- <BR><I>1995:</I> Baby Silvertooth <I>(EP)</I>
- <BR><I>1995:</I> King
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1360">1360</A>
- <BR><I>See also: </I><A HREF="http://isvpc146.isv.uit.no/html/group/belly.html#belly">isvpc146.isv.uit.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Berlin</B>
-
- <BR><I>1981:</I> Love Life
- <BR><I>1981:</I> Dancing in Berlin / Lost in the Crowd <I>(single)</I>
- <BR><I>1982:</I> Pleasure Victim
- <BR><I>1986:</I> Count 3 and Pray
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4156">4156</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Big Black</B>
-
- <BR><I>1983:</I> The Hammer Party
- <BR><I>1987:</I> Songs About Fucking
- <BR><I>1992:</I> The Rich Man's Eight-Track Tape <I>(comp)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2410">2410</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Big Hat</B>
-
- <BR><I>1993:</I> Selena at my Window
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1217">1217</A>
- <BR><I>See also: </I><A HREF="http://www.cec.wustl.edu/~sad2/music/big_hat/">www.cec.wustl.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Bigod 20</B>
-
- <BR><I>1990:</I> The Bog <I>(EP)</I>
- <BR><I>1991:</I> Carpe Diem <I>(EP)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Bikini Kill</B>
-
- <BR><I>1991-1992:</I> The C.D. Version of the First Two Records
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4444">4444</A>
- <BR><I>See also: </I><A HREF="http://www.columbia.edu/~rli3/music_html/bikini_kill/bikini.html">www.columbia.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Billy Nayer Show, The</B>
-
- <BR><I>1994:</I> The Ketchup and Mustard Man
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Billy and the Boingers</B>
-
- <BR><I>1987:</I> U Stink but I Love You <I>(flexydisk)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Birdsongs of the Messozoic</B>
-
- <BR><I>1980-1987:</I> The Fossil Record
- <BR><I>1983:</I> Sonic Geology
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Birmingham 6</B>
-
- <BR><I>1995:</I> Police State
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4348">4348</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Black Tape for a Blue Girl</B>
-
- <BR><I>1986:</I> The Rope
- <BR><I>1987:</I> Mesmerized by the Sirens
- <BR><I>1989:</I> Ashes in the Brittle Air
- <BR><I>1993:</I> This Lush Garden Within
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1202">1202</A>
- <BR><I>See also: </I><A HREF="http://www.projekt.com/bands/btfabg.html">www.projekt.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Bleeding Stone, The</B>
-
- <BR><I>1994:</I> Silent Insanity <I>(EP)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Blondie</B>
-
- <BR><I>1980:</I> Autoamerican
- <BR><I>1983:</I> Best of Blondie
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2070">2070</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Blotto</B>
-
- <BR><I>1994:</I> Collected Works
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Body Count</B>
-
- <BR><I>1992:</I> Body Count
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1277">1277</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Bowie, David</B>
-
- <BR><I>1995:</I> Outside
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1098">1098</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Bow Wow Wow</B>
-
- <BR><I>1982:</I> See Jungle
- <BR><I>1981-1982:</I> I Want Candy <I>(comp)</I>
- <BR><I>1983:</I> When the Going Gets Tough
- <BR><I>1981-1983:</I> Girl Bites Dog <I>(comp)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2301">2301</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Breeders, The</B>
-
- <BR><I>1993:</I> Last Splash
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1242">1242</A>
- <BR><I>See also: </I><A HREF="http://isvpc146.isv.uit.no/html/group/breeders.html#breeders">isvpc146.isv.uit.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Br&uuml;cken, Claudia</B>
-
- <BR><I>1991:</I> Love and a Million Other Things
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4636">4636</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/ztt">rt66.com</A>
- <BR><I>See also: </I><A HREF="http://hcl.chass.ncsu.edu/~phelpsgm/claudia.htm">hcl.chass.ncsu.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Buggles, The</B>
-
- <BR><I>1979:</I> The Age of Plastic
- <BR><I>1981:</I> Adventures in Modern Recording
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Bush, Kate</B>
-
- <BR><I>1977:</I> The Kick Inside
- <BR><I>1980:</I> Never For Ever
- <BR><I>1983:</I> The Dreaming
- <BR><I>1985:</I> Hounds of Love
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1032">1032</A>
- <BR><I>See also: </I><A HREF="http://actor.cs.vt.edu/~wentz/index.html">actor.cs.vt.edu</A>
- <BR><I>See also: </I><A HREF="http://www.jrc.flinders.edu.au/ExpIV/">www.jrc.flinders.edu.au</A>
- <BR><I>See also: </I><A HREF="http://holly.city.unisa.edu.au/Lionheart.html">holly.city.unisa.edu.au</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Buzzcocks</B>
-
- <BR><I>1976-1979:</I> Operators Manual
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1351">1351</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Cabaret Voltaire</B>
-
- <BR><I>1974-1976:</I> 1974-1976 <I>(comp)</I>
- <BR><I>1978-1983:</I> The Golden Moments of CV <I>(comp)</I>
- <BR><I>1978:</I> Nag Nag Nag <I>(EP)</I>
- <BR><I>1979:</I> Mix-Up <I>(EP)</I>
- <BR><I>1980:</I> Red Mecca
- <BR><I>1981:</I> The Voice of America
- <BR><I>1981:</I> Johnny Yesno <I>(soundtrack)</I>
- <BR><I>1982:</I> 2X45
- <BR><I>1982:</I> Eight Crepescule Tracks
- <BR><I>1983:</I> The Crackdown
- <BR><I>1984:</I> Micro-Phonies
- <BR><I>1985:</I> I Want You <I>(single)</I>
- <BR><I>1985:</I> Drinking Gasoline
- <BR><I>1985:</I> The Arm of the Lord
- <BR><I>1985:</I> The Convenant, the Sword, and the Arm of the Lord
- <BR><I>1986:</I> The Drain Train
- <BR><I>1987:</I> Code
- <BR><I>1990:</I> Listen Up <I>(double comp)</I>
- <BR><I>1991:</I> Body and Soul
- <BR><I>1991:</I> Colors
- <BR><I>1992:</I> Plasticity
- <BR><I>1992:</I> Western Reworks
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2307">2307</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Cave, Nick</B>
-
- <BR><I>1984:</I> From Her to Eternity
- <BR><I>1988:</I> Tender Prey
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1273">1273</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Chemlab</B>
-
- <BR><I>1993:</I> Burnout at the Hydrogen Bar
- <BR><I>1994:</I> Magnetic Field Remixes <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3774">3774</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Children on Stun</B>
-
- <BR><I>1994:</I> Tourniquets of Love's Desire
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Christian Death</B>
-
- <BR><I>1982:</I> Only Theatre of Pain
- <BR><I>1988:</I> Sex and Drugs and Jesus Christ
- <BR><I>1989:</I> All the Love All the Hate part Two: All the Hate
- <BR><I>1994:</I> Sexy Death God
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1218">1218</A>
- <BR><I>See also: </I><A HREF="http://christian-death.acc.brad.ac.uk/">christian-death.acc.brad.ac.uk</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Chris and Cosey</B>
-
- <BR><I>1989:</I> Trust
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Ciccone Youth</B>
-
- <BR><I>1988:</I> The Whitey Album
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1087">1087</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>ClockDVA</B>
-
- <BR><I>1981:</I> Thirst
- <BR><I>1988:</I> The Hacker/The Act
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3999">3999</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Cocteau Twins</B>
-
- <BR><I>1982:</I> Garlands
- <BR><I>1983:</I> Head over Heels
- <BR><I>1984:</I> The Spangle Maker <I>(EP)</I>
- <BR><I>1984:</I> Treasure
- <BR><I>1985:</I> Aikea-Guinea <I>(EP)</I>
- <BR><I>1985:</I> Echoes in a Shallow Bay
- <BR><I>1985:</I> Tiny Dynamine <I>(EP)</I>
- <BR><I>1982-1985:</I> The Pink Opaque
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1074">1074</A>
- <BR><I>See also: </I><A HREF="http://garnet.berkeley.edu:8080/cocteau.html">garnet.berkeley.edu</A>
- <BR><I>See also: </I><A HREF="http://isvpc146.isv.uit.no/html/group/cocteautwins.html">isvpc146.isv.uit.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Coil</B>
-
- <BR><I>1986?:</I> The Angelic Conversation <I>(soundtrack)</I>
- <BR><I>1988:</I> Gold is the Metal
- <BR><I>1990:</I> The Unreleased Themes for Hellraiser <I>(EP)</I>
- <BR><I>1990:</I> Panic / Tainted Love <I>(single)</I>
- <BR><I>1991:</I> Out of Light Cometh Darkness
- <BR><I>1992:</I> Snow <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1388">1388</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Concrete Blonde</B>
-
- <BR><I>1986:</I> Concrete Blonde
- <BR><I>1989:</I> Free
- <BR><I>1990:</I> Bloodletting
- <BR><I>1993:</I> Walking in London <I>(single)</I>
- <BR><I>1993:</I> Mexican Moon
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1396">1396</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Cop Shoot Cop</B>
-
- <BR><I>1993:</I> Ask Questions Later
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Course of Empire</B>
-
- <BR><I>1990:</I> Course of Empire
- <BR><I>1993:</I> Infested! <I>(EP)</I>
- <BR><I>1994:</I> Initiation
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2889">2889</A>
- <BR><I>See also: </I><A HREF="http://homepage.seas.upenn.edu/~leer/coe/">homepage.seas.upenn.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Cranes</B>
-
- <BR><I>1990:</I> Inescapable <I>(EP)</I>
- <BR><I>1991:</I> Wings of Joy
- <BR><I>1992:</I> Self-Non-Self
- <BR><I>1993:</I> Forever
- <BR><I>1993:</I> Jewel <I>(EP)</I>
- <BR><I>1994:</I> Loved
- <BR><I>1994:</I> Shining Road <I>(limited edition double EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2400">2400</A>
- <BR><I>See also: </I><A HREF="http://busop.cit.wayne.edu/cranes/www/home.htm">busop.cit.wayne.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Crash Worship</B>
-
- <BR><I>1992:</I> ADRV
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1901">1901</A>
- <BR><I>See also: </I><A HREF="http://www.meer.net/~charnel/crashwor/crashpg.htm">www.meer.net</A>
- <BR><I>See also: </I><A HREF="http://www.tyrell.net/~coventry/crash1.html">www.tyrell.net</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Creatures, The</B>
-
- <BR><I>1983:</I> Feast
- <BR><I>1990:</I> Boomerang
- <BR><I>1990:</I> Fury Eyes <I>(EP)</I>
- <BR><I>1990:</I> Standing There <I>(single)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1216">1216</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Cure, The</B>
-
- <BR><I>1980:</I> Boys Don't Cry
- <BR><I>1980:</I> Seventeen Seconds
- <BR><I>1981:</I> Faith
- <BR><I>1982:</I> Pornography
- <BR><I>1982:</I> The Walk
- <BR><I>1982?:</I> Looking for a Forest <I>(live boot)</I>
- <BR><I>1983:</I> Japanese Whispers
- <BR><I>1983:</I> Lovecats <I>(EP)</I>
- <BR><I>1984:</I> Concert <I>(live)</I>
- <BR><I>1984:</I> The Top
- <BR><I>1985:</I> The Head on the Door
- <BR><I>1987:</I> Staring at the Sea <I>(comp)</I>
- <BR><I>1988:</I> Kiss Me Kiss Me Kiss Me
- <BR><I>1989:</I> Disintegration
- <BR><I>1989:</I> Fascination Street <I>(single)</I>
- <BR><I>1990:</I> Never Enough <I>(single)</I>
- <BR><I>1995?:</I> Give Me the Cure: 18 DC Bands <I>(various)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1159">1159</A>
- <BR><I>See also: </I><A HREF="http://www.acpub.duke.edu/~spawn/album.html">www.acpub.duke.edu</A>
- <BR><I>See also: </I><A HREF="http://pathfinder.com/elektra/artists/cure/cure.html">pathfinder.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Current 93</B>
-
- <BR><I>1986-1991:</I> Island
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3465">3465</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Curve</B>
-
- <BR><I>1991:</I> Frozen <I>(EP)</I>
- <BR><I>1991:</I> Cherry <I>(EP)</I>
- <BR><I>1992:</I> Doppelganger
- <BR><I>1993:</I> Cuckoo
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1355">1355</A>
- <BR><I>See also: </I><A HREF="http://quark.stack.urc.tue.nl/~conrad/">quark.stack.urc.tue.nl</A>
- <BR><I>See also: </I><A HREF="http://blade.stack.urc.tue.nl/~blurp/">blade.stack.urc.tue.nl</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Cyber-Tec</B>
-
- <BR><I>1995:</I> Cyber-Tec
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Daisy Chainsaw</B>
-
- <BR><I>1992:</I> Hope All Your Dreams Come True <I>(single)</I>
- <BR><I>1992:</I> Love Sick Pleasure <I>(EP)</I>
- <BR><I>1992:</I> Eleventeen
- <BR><I>1994:</I> For They Know Not What They Do
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Dance or Die</B>
-
- <BR><I>1993:</I> Psychoburbia
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Danse Society, The</B>
-
- <BR><I>1984:</I> Heaven is Waiting
- <BR><I>1986:</I> Looking Through
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Das Ich</B>
-
- <BR><I>1990:</I> Satanische Verse
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2337">2337</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Dax, Danielle</B>
-
- <BR><I>1986-1988:</I> Dark Adapted Eye <I>(comp +5)</I>
- <BR><I>1988:</I> Whistling for his Love <I>(single)</I>
- <BR><I>1988:</I> Cat House <I>(single)</I>
- <BR><I>1990:</I> Blast the Human Flower
- <BR><I>1992:</I> Pop-Eyes
- <BR><I>1995:</I> Timber Tongue <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1746">1746</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Death in June</B>
-
- <BR><I>1992:</I> But, What Ends When the Symbols Shatter?
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Definition FX</B>
-
- <BR><I>1993:</I> Something Inside <I>(single)</I>
- <BR><I>1993:</I> Light Speed Collision
- </TD><TD>
-<I>See also: </I><A HREF="http://www.geko.com.au/vrx/dfx/html/def-fx.html">www.geko.com.au</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Depeche Mode</B>
-
- <BR><I>1981:</I> Speak &amp; Spell
- <BR><I>1981:</I> Just Can't Get Enough / Any Second Now <I>(single)</I>
- <BR><I>1982:</I> A Broken Frame
- <BR><I>1982:</I> live singles <I>(comp)</I>
- <BR><I>1983:</I> Construction Time Again
- <BR><I>1984:</I> People Are People <I>(comp +2)</I>
- <BR><I>1984:</I> Some Great Reward
- <BR><I>1985:</I> Catching Up With Depeche Mode <I>(comp +4)</I>
- <BR><I>1985:</I> It's Called a Heart / Fly on the Windscreen <I>(single)</I>
- <BR><I>1986:</I> Black Celebration
- <BR><I>1986:</I> Stripped <I>(single)</I>
- <BR><I>1986:</I> A Question of Lust <I>(single)</I>
- <BR><I>1989:</I> 101 <I>(double live)</I>
- <BR><I>1987:</I> Music for the Masses
- <BR><I>1987:</I> Never Let Me Down <I>(single)</I>
- <BR><I>1990:</I> Personal Jesus <I>(single)</I>
- <BR><I>199?:</I> I Sometimes Wish I Was Famous: A Swedish Tribute <I>(various)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1041">1041</A>
- <BR><I>See also: </I><A HREF="http://www.cis.ufl.edu/~sag/dm/">www.cis.ufl.edu</A>
- <BR><I>See also: </I><A HREF="http://www.coma.sbg.ac.at:80/~salchegg/DM/">www.coma.sbg.ac.at</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Dessau</B>
-
- <BR><I>1995:</I> Dessau
- <BR><I>1995:</I> Details Sketchy
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Devo</B>
-
- <BR><I>1978:</I> Q: Are We Not Men? A: We Are DEVO!
- <BR><I>1979:</I> Freedom of Choice
- <BR><I>1977-1990:</I> Greatest Hits
- <BR><I>1978-1990:</I> Greatest Misses
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1088">1088</A>
- <BR><I>See also: </I><A HREF="http://hartke.lib.ohio-state.edu:70/">hartke.lib.ohio-state.edu</A>
- <BR><I>See also: </I><A HREF="http://unsane.enc.org/devo.htm">unsane.enc.org</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/devo">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Die Krupps</B>
-
- <BR><I>1995:</I> Rings of Steel
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Die Monster Die</B>
-
- <BR><I>1994:</I> Withdrawl Method
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Die Warzau</B>
-
- <BR><I>1991:</I> Big Electric Metal Bass Face
- <BR><I>1994:</I> Engine
- <BR><I>1994:</I> allgoodgirls <I>(EP)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Disposable Heroes of Hiphoprisy</B>
-
- <BR><I>1992:</I> Hypocrisy is the Greatest Luxury
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Dolby, Thomas</B>
-
- <BR><I>1983:</I> The Golden Age of Wireless
- <BR><I>1983:</I> The Golden Age of Wireless <I>(2nd release: 2 new)</I>
- <BR><I>1984:</I> The Flat Earth
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1961">1961</A>
- <BR><I>See also: </I><A HREF="http://kspace.com/KM/spot.sys/Dolby/pages/home.html">kspace.com</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/dolby">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Doubting Thomas</B>
-
- <BR><I>1991:</I> Father Don't Cry <I>(EP)</I>
- <BR><I>1991:</I> The Infidel
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1166">1166</A>
- <BR><I>See also: </I><A HREF="http://www.eecs.nwu.edu/~smishra/Industrial/skinny-puppy">www.eecs.nwu.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Duran Duran</B>
-
- <BR><I>1981:</I> Duran Duran
- <BR><I>1982:</I> Carnival <I>(EP)</I>
- <BR><I>1982:</I> live <I>(live boot)</I>
- <BR><I>1982:</I> Rio
- <BR><I>1983:</I> Union of the Snake / Secret Oktober <I>(single)</I>
- <BR><I>1983:</I> The Wild Boys / Cracks in the Pavement <I>(single)</I>
- <BR><I>1983:</I> Seven and the Ragged Tiger
- <BR><I>1987:</I> Notorious
- <BR><I>1981-1988:</I> Decade <I>(comp)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1259">1259</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Durutti Column</B>
-
- <BR><I>1988:</I> The Guitar and Other Machines
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4853">4853</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Ebn Ozn</B>
-
- <BR><I>1984:</I> Feeling Cavalier
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Elastica</B>
-
- <BR><I>1995:</I> Elastica
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Elastic Purejoy, The</B>
-
- <BR><I>1994:</I> The Elastic Purejoy
- </TD><TD>
-<I>See also: </I><A HREF="http://http2.brunel.ac.uk:8080/~ee92pmh/shrkindx.html">http2.brunel.ac.uk</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Electric Hellfire Club, The</B>
-
- <BR><I>1993:</I> Burn, Baby, Burn
- <BR><I>1995:</I> Kiss the Goat
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Elfman, Danny</B>
-
- <BR><I>1984:</I> So-Lo
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1089">1089</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Emergency Broadcast Network</B>
-
- <BR><I>1995:</I> Telecommunication Breakdown
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Engorged with Blood</B>
-
- <BR><I>1993:</I> Engorged with Blood <I>(EP)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Eno, Brian</B>
-
- <BR><I>1977:</I> Before and After Science
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1064">1064</A>
- <BR><I>See also: </I><A HREF="http://www.nwu.edu/music/eno/">www.nwu.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Eon</B>
-
- <BR><I>1991:</I> Fear: the Mindkiller <I>(EP)</I>
- <BR><I>1992:</I> Basket Case <I>(EP)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Erasure</B>
-
- <BR><I>1984-1986:</I> various singles
- <BR><I>1986:</I> Wonderland
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1029">1029</A>
- <BR><I>See also: </I><A HREF="http://www.cec.wustl.edu/~ccons/erasure/">www.cec.wustl.edu</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/erasure">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Estep, Maggie</B>
-
- <BR><I>1994:</I> No More Mister Nice Girl
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Ethyl Meatplow</B>
-
- <BR><I>1993:</I> Happy Days Sweetheart
- <BR><I>1993:</I> Devil's Johnson <I>(single)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+5232">5232</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Eurythmics</B>
-
- <BR><I>1981:</I> In the Garden
- <BR><I>1982:</I> Love is a Stranger <I>(EP)</I>
- <BR><I>1982:</I> This is the House <I>(live EP)</I>
- <BR><I>1983:</I> Sweet Dreams
- <BR><I>1983:</I> Touch
- <BR><I>1984:</I> 1984 (For the Love of Big Brother) <I>(soundtrack)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Executive Slacks</B>
-
- <BR><I>1986:</I> Fire and Ice
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Faith and the Muse</B>
-
- <BR><I>1994:</I> Elyria
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Fixx, The</B>
-
- <BR><I>1982:</I> Shuttered Room
- <BR><I>1983:</I> Reach the Beach
- <BR><I>1984:</I> Phantoms
- <BR><I>1986:</I> Walkabout
- <BR><I>1987:</I> React <I>(live)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4603">4603</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Foetus</B>
-
- <BR><I>19??:</I> Rife
- <BR><I>1995:</I> Gash
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2750">2750</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Fortran 5</B>
-
- <BR><I>1991:</I> Blues
- <BR><I>1993:</I> Bad Head Park
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3469">3469</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/fortran.5">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>45 Grave</B>
-
- <BR><I>1993:</I> Debasement Tapes
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Frankie goes to Hollywood</B>
-
- <BR><I>1984:</I> Welcome to the Pleasure Dome
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3222">3222</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/ztt">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Freur</B>
-
- <BR><I>1983:</I> Doot Doot
- </TD><TD>
-<I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/freur">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Front 242</B>
-
- <BR><I>1979:</I> Masterhit <I>(EP)</I>
- <BR><I>1983:</I> Geography
- <BR><I>1987:</I> Official Version
- <BR><I>1985:</I> No Comment
- <BR><I>1982:</I> Two In One <I>(EP)</I>
- <BR><I>1982-1985:</I> Backcatalogue <I>(comp)</I>
- <BR><I>1989:</I> Headhunter <I>(EP)</I>
- <BR><I>1989:</I> Front by Front
- <BR><I>1989:</I> Never Stop <I>(EP)</I>
- <BR><I>1991:</I> Tyrrany For You
- <BR><I>1991:</I> Tragedy For You <I>(EP)</I>
- <BR><I>1991:</I> Rhythm of Time <I>(EP)</I>
- <BR><I>1993:</I> Religion <I>(EP)</I>
- <BR><I>1993:</I> Animal <I>(single)</I>
- <BR><I>1993:</I> 06:21:03:11 Up Evil
- <BR><I>1993:</I> 05:22:09:12 Off
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1059">1059</A>
- <BR><I>See also: </I><A HREF="http://www.ifi.uio.no/~terjesa/front242/main.html">www.ifi.uio.no</A>
- <BR><I>See also: </I><A HREF="http://www.eecs.nwu.edu/~smishra/Industrial/f242/index.html">www.eecs.nwu.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Front Line Assembly</B>
-
- <BR><I>1988:</I> Convergence
- <BR><I>1989:</I> Digital Tension Dementia <I>(EP)</I>
- <BR><I>1990:</I> Gashed Senses and Crossfire
- <BR><I>1991:</I> Caustic Grip
- <BR><I>1992:</I> Tactical Neural Implant
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1161">1161</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Fugazi</B>
-
- <BR><I>1989:</I> 13 Songs
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2053">2053</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Fun Boy Three</B>
-
- <BR><I>1982:</I> It Ain't What You Do / Just Do It / Funrama Theme <I>(single)</I>
- <BR><I>1981-1983:</I> The Best of Fun Boy Three <I>(comp)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Fuzzbox</B>
-
- <BR><I>1986:</I> We've got a Fuzzbox and We're Gonna Use It!!
- <BR><I>1986:</I> Love is the Slug <I>(single)</I>
- <BR><I>1986:</I> Rules and Regulations <I>(single)</I>
- </TD><TD>
-<I>See also: </I><A HREF="http://world.std.com/~fuzzbox/fbpage.html">world.std.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Gabriel, Peter</B>
-
- <BR><I>1977:</I> Peter Gabriel I
- <BR><I>1978:</I> Peter Gabriel II
- <BR><I>1980:</I> Peter Gabriel III
- <BR><I>1982:</I> Security
- <BR><I>1983:</I> Peter Gabriel Plays Live <I>(double live)</I>
- <BR><I>1985:</I> Birdy <I>(soundtrack)</I>
- <BR><I>1986:</I> So
- <BR><I>1986:</I> Live at the Civic Arena <I>(live boot)</I>
- <BR><I>1989:</I> Passion <I>(soundtrack)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1016">1016</A>
- <BR><I>See also: </I><A HREF="http://www.nwu.edu/music/gabriel/">www.nwu.edu</A>
- <BR><I>See also: </I><A HREF="http://www.cs.clemson.edu/~junderw/pg.html">www.cs.clemson.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Garbage</B>
-
- <BR><I>1995:</I> Garbage
- </TD><TD>
-<I>See also: </I><A HREF="http://hamp.hampshire.edu/~temS95/garbage.html">hamp.hampshire.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Game Theory</B>
-
- <BR><I>1987:</I> Lolita Nation
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Gang of 4</B>
-
- <BR><I>1979:</I> Entertainment
- <BR><I>1979:</I> Peel Sessions <I>(live)</I>
- <BR><I>1981:</I> Solid Gold
- <BR><I>1981:</I> Another Day / Another Dollar
- <BR><I>1982:</I> I Love a Man In a Uniform <I>(single)</I>
- <BR><I>1982:</I> Songs of the Free
- <BR><I>1983:</I> Is It Love <I>(single)</I>
- <BR><I>1983:</I> Hard
- <BR><I>1983:</I> At the Palace <I>(live)</I>
- <BR><I>1979-1983:</I> A Brief History of the Twentieth Century <I>(comp)</I>
- <BR><I>1990:</I> To Hell With Poverty <I>(single)</I>
- <BR><I>1990:</I> Mall
- <BR><I>1990:</I> Money Talks <I>(single)</I>
- <BR><I>1995:</I> Tatoo <I>(single)</I>
- <BR><I>1995:</I> Shrinkwrapped
- </TD><TD>
-<I>See also: </I><A HREF="http://http2.brunel.ac.uk:8080/~ee92pmh/shrkindx.html">http2.brunel.ac.uk</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Glove, The</B>
-
- <BR><I>1982:</I> Blue Sunshine
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1159">1159</A>
- <BR><I>See also: </I><A HREF="http://www.dcs.gla.ac.uk/~lovelm/GLOVE.html">www.dcs.gla.ac.uk</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>God is my Copilot</B>
-
- <BR><I>1993:</I> Speed Yr Trip
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Gracious Shades</B>
-
- <BR><I>1995:</I> Aberkash
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Grind</B>
-
- <BR><I>1995:</I> Kittymuzzle
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Grotus</B>
-
- <BR><I>1993:</I> Slow Motion Apocalypse
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+5482">5482</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Pizzicato Five</B>
-
- <BR><I>1995:</I> The Sound of Music
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>PJ Harvey</B>
-
- <BR><I>1992:</I> Dry
- <BR><I>1993:</I> Rid of Me
- <BR><I>1993:</I> 4-Track Demos
- <BR><I>1995:</I> Down by the Water <I>(single)</I>
- <BR><I>1995:</I> To Bring You My Love
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1221">1221</A>
- <BR><I>See also: </I><A HREF="http://www.louisville.edu/public/jadour01/pjh/">www.louisville.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Psychick Warriors ov Gaia</B>
-
- <BR><I>1992:</I> Ov Biospheres and Sacred Groves
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Hagen, Nina</B>
-
- <BR><I>1985:</I> In Ekstasy
- <BR><I>1978-1982:</I> nunsexmonkrock / Nina Hagen Band
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Hate Dept.</B>
-
- <BR><I>1994:</I> Meat Your Maker
- <BR><I>1995:</I> Mainline <I>(EP)</I>
- </TD><TD>
-<I>See also: </I><A HREF="http://www.iuma.com/IUMA-2.0/ftp/volume5/Hate_Dept/">www.iuma.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Haysi Fantayzee</B>
-
- <BR><I>1982:</I> Shiny Shiny remix <I>(single)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Heaven 17</B>
-
- <BR><I>1981:</I> Penthouse and Pavement
- <BR><I>1982:</I> Heaven 17
- <BR><I>1983:</I> The Luxury Gap
- <BR><I>1984:</I> How Men Are
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Hope, Peter and Kirk, Richard</B>
-
- <BR><I>1988:</I> Hoodoo Talk
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2307">2307</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Kershaw, Nik</B>
-
- <BR><I>1983:</I> Human Racing
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Kirk, Richard</B>
-
- <BR><I>1993:</I> Virtual State
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2307">2307</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Human League</B>
-
- <BR><I>1979:</I> Reproduction
- <BR><I>1980:</I> Travelogue
- <BR><I>1981:</I> Dare
- <BR><I>1983:</I> Fascination
- <BR><I>1984:</I> Hysteria
- <BR><I>1995:</I> Octopus
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4631">4631</A>
- <BR><I>See also: </I><A HREF="http://pathfinder.com/elektra/artists/humanleague/human.html">pathfinder.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Hunters and Collectors</B>
-
- <BR><I>1987:</I> Human Frailty
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4553">4553</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Ice T</B>
-
- <BR><I>1991:</I> New Jack Hustler <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2342">2342</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>In the Nursery</B>
-
- <BR><I>19??:</I> L'Esprit
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>INXS</B>
-
- <BR><I>1982:</I> Shabooh Shoobah
- <BR><I>1984:</I> The Swing
- <BR><I>1985:</I> Listen Like Thieves
- <BR><I>1988:</I> Kick
- <BR><I>1990:</I> X
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1284">1284</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>J., David</B>
-
- <BR><I>1983-1986:</I> On Glass <I>(comp)</I>
- <BR><I>1985:</I> Crocodile Tears and the Velvet Cosh
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1215">1215</A>
- <BR><I>See also: </I><A HREF="http://gothic.acs.csulb.edu:8080/~vamp/Gothic/Text/bauhaus-discog.html">gothic.acs.csulb.edu</A>
- <BR><I>See also: </I><A HREF="http://isvpc146.isv.uit.no/html/person/d.html#davidjay">isvpc146.isv.uit.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Jesus and Mary Chain, The</B>
-
- <BR><I>1992:</I> Reverence <I>(EP)</I>
- <BR><I>1992:</I> Honey's Dead
- <BR><I>1995:</I> Hate Rock and Roll <I>(comp)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1228">1228</A>
- <BR><I>See also: </I><A HREF="http://american.recordings.com/American_Artists/Jesus_And_Mary_Chain/jamc_home.html">american.recordings.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Jones, Grace</B>
-
- <BR><I>1993:</I> Sex Drive <I>(single)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Jones, Howard</B>
-
- <BR><I>1983:</I> Humans' Lib
- <BR><I>1985:</I> Dream Into Action
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Joy Division</B>
-
- <BR><I>1977-1978:</I> Warsaw <I>(comp)</I>
- <BR><I>1979:</I> Unknown Pleasures
- <BR><I>1980:</I> Closer
- <BR><I>1980:</I> Transmission / Novelty <I>(single)</I>
- <BR><I>1980:</I> Still
- <BR><I>1977-1980:</I> Substance <I>(comp)</I>
- <BR><I>1995:</I> Ceremonial: A Tribute <I>(various)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1214">1214</A>
- <BR><I>See also: </I><A HREF="http://www.fys.uio.no/~bor/joydiv.html">www.fys.uio.no</A>
- <BR><I>See also: </I><A HREF="http://csclub.uwaterloo.ca/u/sfwhite/joyd.html">csclub.uwaterloo.ca</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>King Crimson</B>
-
- <BR><I>1969:</I> In the Court of the Crimson King
- <BR><I>1973:</I> Larks' Tongues in Aspic
- <BR><I>1974:</I> Starless and Bible Black
- <BR><I>1981:</I> Dicipline
- <BR><I>1982:</I> Beat
- <BR><I>1984:</I> Three of a Perfect Pair
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1323">1323</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>KMFDM</B>
-
- <BR><I>1993:</I> Angst
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1452">1452</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Kraftwerk</B>
-
- <BR><I>1977:</I> Trans-Europe Express <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1027">1027</A>
- <BR><I>See also: </I><A HREF="http://wwwtdb.cs.umu.se/~dvlawm/kraftwerk.html">wwwtdb.cs.umu.se</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/kraftwerk">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>L7</B>
-
- <BR><I>1988:</I> L7
- <BR><I>1990:</I> Smell the Magic
- <BR><I>1992:</I> Bricks are Heavy
- <BR><I>1994:</I> Hungry for Stink
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1998">1998</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Le&ae;ther Strip</B>
-
- <BR><I>1995:</I> Legacy of Hate and Lust
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Lemon Kittens</B>
-
- <BR><I>1978-1980:</I> We Buy a Hammer for Daddy
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1746">1746</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Letters to Cleo</B>
-
- <BR><I>1994:</I> Aurora Gory Alice
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3000">3000</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>LFO</B>
-
- <BR><I>1991:</I> Frequencies
- <BR><I>1996:</I> Advance
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>London After Midnight</B>
-
- <BR><I>1989:</I> Selected Scenes from the End of the World
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Lords of Acid</B>
-
- <BR><I>1991:</I> Rough Sex <I>(single)</I>
- <BR><I>1993:</I> Voodoo U
- <BR><I>1994:</I> The Crablouse: Variations on a Species <I>(single)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2356">2356</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Lords of the New Church, The</B>
-
- <BR><I>1983:</I> Is Nothing Sacred?
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Love and Rockets</B>
-
- <BR><I>1985:</I> Ball of Confusion / Inside the Outside <I>(single)</I>
- <BR><I>1985:</I> Seventh Dream of Teenage Heaven
- <BR><I>1986:</I> Express
- <BR><I>1986:</I> Kundalini Express / Lucifer Sam / Holiday on the Moon <I>(single)</I>
- <BR><I>1987:</I> Earth, Sun, Moon
- <BR><I>1989:</I> No Big Deal <I>(single)</I>
- <BR><I>1989:</I> Motorcycle <I>(single)</I>
- <BR><I>1989:</I> Love and Rockets
- <BR><I>1994:</I> This Heaven <I>(EP)</I>
- <BR><I>1994:</I> Body and Soul <I>(EP)</I>
- <BR><I>1994:</I> Hot Trip to Heaven
- <BR><I>1995:</I> The Glittering Darkness <I>(EP)</I>
- <BR><I>1996:</I> Sweet F. A.
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1215">1215</A>
- <BR><I>See also: </I><A HREF="http://american.recordings.com/American_Artists/Love_And_Rockets/loverox_home.html">american.recordings.com</A>
- <BR><I>See also: </I><A HREF="http://gothic.acs.csulb.edu:8080/~vamp/Gothic/Text/bauhaus-discog.html">gothic.acs.csulb.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Love is Colder than Death</B>
-
- <BR><I>1993:</I> Oxeia
- <BR><I>19??:</I> Mental Traveller
- <BR><I>19??:</I> Teignmouth
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Low Pop Suicide</B>
-
- <BR><I>1992:</I> Disengagement <I>(EP)</I>
- <BR><I>1992:</I> On the Cross of Commerce
- <BR><I>1994:</I> Kiss Your Lips <I>(remixes)</I>
- <BR><I>1995:</I> The Death of Excellence
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1984">1984</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Luscious Jackson</B>
-
- <BR><I>1992:</I> In Search of Manny
- <BR><I>1994:</I> Natural Ingredients
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Lush</B>
-
- <BR><I>1990:</I> Gala
- <BR><I>1992:</I> Spooky
- <BR><I>1994:</I> Split
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2359">2359</A>
- <BR><I>See also: </I><A HREF="http://isvpc146.isv.uit.no/html/group/lush.html#lush">isvpc146.isv.uit.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Lwin, Annabella</B>
-
- <BR><I>1986:</I> War Boys <I>(single)</I>
- <BR><I>1994:</I> Car Sex <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2301">2301</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Lycea</B>
-
- <BR><I>1993:</I> A Day in the Stark Corner
- </TD><TD>
-<I>See also: </I><A HREF="http://www.projekt.com/bands/lycia.html">www.projekt.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>M</B>
-
- <BR><I>1979:</I> Pop Musik <I>(7inch)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Machines of Loving Grace</B>
-
- <BR><I>1991:</I> Rite of Shiva <I>(single)</I>
- <BR><I>1991:</I> Machines of Loving Grace
- <BR><I>1992:</I> Burn Like Brilliant Trash <I>(EP)</I>
- <BR><I>1993:</I> Concentration
- <BR><I>1995:</I> Gilt
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1219">1219</A>
- <BR><I>See also: </I><A HREF="http://www.nando.net/mammoth/machines.html">www.nando.net</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>M|A|R|R|S</B>
-
- <BR><I>1987:</I> Pump Up the Volume / Anitina <I>(single)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Mallinder, Stephen</B>
-
- <BR><I>1982:</I> Pow Wow
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2307">2307</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Manufacture</B>
-
- <BR><I>1988:</I> Terrorvision
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>March Violets, The</B>
-
- <BR><I>1984:</I> Natural History
- <BR><I>1982-1984:</I> The Botanic Verses <I>(comp)</I>
- <BR><I>1983-1985:</I> Electric Shades <I>(comp)</I>
- <BR><I>1985:</I> Deep <I>(EP)</I>
- <BR><I>1986:</I> A Turn to the Sky / Never Look Back / Deep / Rebirth <I>(single)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1114">1114</A>
- <BR><I>See also: </I><A HREF="http://www.cm.cf.ac.uk/Sisters.Of.Mercy/Related.Works/March.Violets.Page.html">www.cm.cf.ac.uk</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Martha and the Muffins</B>
-
- <BR><I>1980-1984:</I> Far Away in Time <I>(comp)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2529">2529</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Mary's Danish</B>
-
- <BR><I>1991:</I> Circa
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3727">3727</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>MC 900 Foot Jesus</B>
-
- <BR><I>1989:</I> Hell With the Lid Off
- <BR><I>1989:</I> UFOs Are Real <I>(EP)</I>
- <BR><I>1990:</I> Welcome to My Dream
- <BR><I>1990:</I> Killer Inside Me <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1229">1229</A>
- <BR><I>See also: </I><A HREF="http://american.recordings.com/American_Artists/MC_900FT_Jesus/mc_home.html">american.recordings.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>McLachlan, Sarah</B>
-
- <BR><I>1992:</I> Into the Fire <I>(single)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1389">1389</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Meat Beat Manifesto</B>
-
- <BR><I>1988:</I> Armed Audio Warfare
- <BR><I>1990:</I> Dog Star Man <I>(EP)</I>
- <BR><I>1990:</I> 99%
- <BR><I>1990:</I> Psyche Out <I>(EP)</I>
- <BR><I>1990:</I> Now <I>(EP)</I>
- <BR><I>1992:</I> Satryicon
- <BR><I>1993:</I> Peel Session <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3626">3626</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Medicine</B>
-
- <BR><I>1993:</I> The Buried Life
- <BR><I>1994:</I> Shot Forth Self Living
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1432">1432</A>
- <BR><I>See also: </I><A HREF="http://kspace.com/KM/spot.sys/Medicine/pages/home.html">kspace.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Mephisto Walz</B>
-
- <BR><I>1986-1992:</I> Crocosmia
- <BR><I>1993:</I> Terra-Regina <I>(comp)</I>
- <BR><I>1994:</I> The Eternal Deep
- <BR><I>1995:</I> Thalia
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Midnight Oil</B>
-
- <BR><I>1979:</I> Head Injuries
- <BR><I>1981:</I> Place without a Postcard
- <BR><I>1983:</I> 10, 9, 8, 7, 6, 5, 4, 3, 2, 1...
- <BR><I>1985:</I> Red Sails in the Sunset
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1102">1102</A>
- <BR><I>See also: </I><A HREF="http://www.stevens-tech.edu/~dbelson/oilbase/">www.stevens-tech.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Miller, Roger</B>
-
- <BR><I>1987:</I> Maximum Electric Piano
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Ministry</B>
-
- <BR><I>1983:</I> With Sympathy
- <BR><I>1984:</I> Halloween Remix / The Nature of Outtakes <I>(EP)</I>
- <BR><I>1981-1984:</I> various singles
- <BR><I>1985:</I> Cold Life
- <BR><I>1985:</I> Over the Shoulder / Isle of Man <I>(EP)</I>
- <BR><I>1986:</I> Twitch
- <BR><I>1988:</I> 12 Inch Singles <I>(comp)</I>
- <BR><I>1988:</I> The Land of Rape and Honey
- <BR><I>1988:</I> Stigmata / Tonight we Murder <I>(EP)</I>
- <BR><I>1989:</I> The Mind is a Terrible Thing to Taste
- <BR><I>1991:</I> Jesus Built my Hotrod <I>(EP)</I>
- <BR><I>1992:</I> Psalm 69
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1100">1100</A>
- <BR><I>See also: </I><A HREF="http://csclub.uwaterloo.ca/u/sfwhite/ministry.html">csclub.uwaterloo.ca</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Miranda Sex Garden</B>
-
- <BR><I>1991:</I> Gush Forth my Tears
- <BR><I>1991:</I> Madra
- <BR><I>1992:</I> Iris
- <BR><I>1993:</I> Suspiria
- <BR><I>1994:</I> Fairytales of Slavery
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3007">3007</A>
- <BR><I>See also: </I><A HREF="http://sksol1.physics.sunysb.edu/~jng/msg/">sksol1.physics.sunysb.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Missing Persons</B>
-
- <BR><I>1982:</I> Missing Persons <I>(EP)</I>
- <BR><I>1982:</I> Spring Session M
- <BR><I>1984:</I> Rhyme &amp; Reason
- <BR><I>1982-1984:</I> Best of <I>(comp)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Mistle Thrush</B>
-
- <BR><I>199?:</I> Silt
- <BR><I>1994:</I> Agus Am&agrave;rach
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Mission, The</B>
-
- <BR><I>1986:</I> God's Own Medicine
- <BR><I>1987:</I> the First Chapter
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2045">2045</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Mission of Burma</B>
-
- <BR><I>1987:</I> Forget
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Morissette, Alanis</B>
-
- <BR><I>1995:</I> Jagged Little Pill
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3127">3127</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Morrison, Patricia</B>
-
- <BR><I>1994:</I> Reflect on This
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1062">1062</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Moyet, Allison</B>
-
- <BR><I>1985:</I> ALF
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3410">3410</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/erasure">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Murder Inc.</B>
-
- <BR><I>1992:</I> Murder Inc.
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Mussolini Headkick</B>
-
- <BR><I>1990:</I> Blood on the Flag
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Murphy, Peter</B>
-
- <BR><I>1986:</I> Should the World Fail to Fall Apart
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1235">1235</A>
- <BR><I>See also: </I><A HREF="http://gothic.acs.csulb.edu:8080/~vamp/Gothic/Text/bauhaus-discog.html">gothic.acs.csulb.edu</A>
- <BR><I>See also: </I><A HREF="http://isvpc146.isv.uit.no/html/person/p.html#petermurphy">isvpc146.isv.uit.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>My Bloody Valentine</B>
-
- <BR><I>1988:</I> Isn't Anything
- <BR><I>1991:</I> Loveless
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1912">1912</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>My Life with the Thrill Kill Kult</B>
-
- <BR><I>1988:</I> I See Good Spirits and I See Bad Spirits
- <BR><I>1989:</I> K00Ler than Jesus
- <BR><I>1990:</I> Confessions of a Knife...
- <BR><I>1990:</I> Swine &amp; Roses / Naive (KMFDM) <I>(single)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3478">3478</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Neither/Neither World</B>
-
- <BR><I>1994:</I> Tales of True Crime
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Neotek</B>
-
- <BR><I>1995:</I> Brain over Muscle
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>New Fast Automatic Daffodils</B>
-
- <BR><I>1991:</I> Pigeonhole
- <BR><I>1992:</I> Bong
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>New Order</B>
-
- <BR><I>1981:</I> Movement
- <BR><I>1981:</I> Temptation / Hurt <I>(single)</I>
- <BR><I>1982:</I> Factus 8
- <BR><I>1984:</I> Power, Corruption, and Lies
- <BR><I>1984:</I> Blue Monday <I>(single)</I>
- <BR><I>1985:</I> The Perfect Kiss <I>(single)</I>
- <BR><I>1985:</I> Confusion <I>(single)</I>
- <BR><I>1985:</I> Low Life
- <BR><I>1983-5:</I> various singles
- <BR><I>1986:</I> Brotherhood
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1126">1126</A>
- <BR><I>See also: </I><A HREF="http://topquark.cecer.army.mil/~roland/neworder/neworder.html">topquark.cecer.army.mil</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Nine Inch Nails</B>
-
- <BR><I>1989:</I> Pretty Hate Machine
- <BR><I>1989:</I> Head Like a Hole <I>(remixes)</I>
- <BR><I>1990:</I> Sin <I>(remixes)</I>
- <BR><I>1992:</I> Broken <I>(EP)</I>
- <BR><I>1992:</I> Fixed <I>(remixes)</I>
- <BR><I>1994:</I> March of the Pigs <I>(EP)</I>
- <BR><I>1994:</I> The Downward Spiral
- <BR><I>1994:</I> Closer to God <I>(EP)</I>
- <BR><I>1994:</I> Closer (Further Away) <I>(EP)</I>
- <BR><I>1994:</I> Further Down the Spiral <I>(remixes)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1046">1046</A>
- <BR><I>See also: </I><A HREF="http://www.scri.fsu.edu/~patters/nin.html">www.scri.fsu.edu</A>
- <BR><I>See also: </I><A HREF="http://metaverse.com/woodstock/artists/nineinchnails/index.html">metaverse.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Nirvana</B>
-
- <BR><I>1991:</I> Nevermind
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1052">1052</A>
- <BR><I>See also: </I><A HREF="http://www.ludd.luth.se/nirvana/">www.ludd.luth.se</A>
- <BR><I>See also: </I><A HREF="http://home.earthlink.net/~tomgrant/">home.earthlink.net</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Nitzer Ebb</B>
-
- <BR><I>1987:</I> That Total Age
- <BR><I>1987:</I> Warsaw Ghetto <I>(EP)</I>
- <BR><I>1987:</I> So Bright So Strong <I>(remixes)</I>
- <BR><I>1987:</I> Get Clean <I>(remixes)</I>
- <BR><I>1988:</I> Control: I'm Here <I>(single)</I>
- <BR><I>1989:</I> Hearts and Minds <I>(single)</I>
- <BR><I>1989:</I> Belief
- <BR><I>1990:</I> Showtime
- <BR><I>1991:</I> I Give to You <I>(single)</I>
- <BR><I>1991:</I> As Is <I>(single)</I>
- <BR><I>1991:</I> Ebbhead
- <BR><I>1991:</I> Godhead <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1164">1164</A>
- <BR><I>See also: </I><A HREF="http://www.eecs.nwu.edu/~smishra/Industrial/nitzer-ebb/index.html">www.eecs.nwu.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>No Doubt</B>
-
- <BR><I>1995:</I> Tragic Kingdom
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Noise Unit</B>
-
- <BR><I>1989:</I> Grinding Into Emptiness
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Nosferatu</B>
-
- <BR><I>1993:</I> Rise
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Numan, Gary</B>
-
- <BR><I>1978:</I> Tubeway Army
- <BR><I>1978:</I> The Plan
- <BR><I>1979:</I> Replicas
- <BR><I>1979:</I> The Pleasure Principle
- <BR><I>1980:</I> Telekon
- <BR><I>1981:</I> Warriors
- <BR><I>1981:</I> Dance
- <BR><I>1982:</I> I, Assassin
- <BR><I>1984:</I> White Noise <I>(double live)</I>
- <BR><I>1987:</I> Ghost <I>(double live)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1409">1409</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Offspring</B>
-
- <BR><I>1994:</I> Smash
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Oingo Boingo</B>
-
- <BR><I>1980:</I> Forbidden Zone <I>(soundtrack)</I>
- <BR><I>1981:</I> Only a Lad
- <BR><I>1983:</I> Good for Your Soul
- <BR><I>1986:</I> Dead Man's Party
- <BR><I>1987:</I> Nothing to Fear
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1089">1089</A>
- <BR><I>See also: </I><A HREF="http://rhino.harvard.edu/dan/boingo/boingo.html">rhino.harvard.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Orb, The</B>
-
- <BR><I>1991:</I> The Orb's Adventures Beyond the Ultraworld
- <BR><I>1991:</I> Aubrey Mixes, the Ultraworld Excursions
- <BR><I>1991:</I> Little Fluffy Clouds <I>(EP)</I>
- <BR><I>1992:</I> U.F.Orb
- <BR><I>1993:</I> live 93 <I>(double live)</I>
- <BR><I>1994:</I> Pomme Fritz
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1121">1121</A>
- <BR><I>See also: </I><A HREF="http://www.hyperlink.com/orb">www.hyperlink.com</A>
- <BR><I>See also: </I><A HREF="http://www.phlab.missouri.edu/HOMES/c512571_www/music/orbstuff/index.html">www.phlab.missouri.edu</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/orb">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Orbital</B>
-
- <BR><I>1993:</I> Orbital 2
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2049">2049</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/orbital">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Orchestral Manoeuvers in the Dark</B>
-
- <BR><I>1980:</I> OMD <I>(US release)</I>
- <BR><I>1980:</I> OMD <I>(UK release)</I>
- <BR><I>1981:</I> Bunker Soldiers
- <BR><I>1981:</I> Architecture &amp; Morality
- <BR><I>1983:</I> Dazzle Ships
- <BR><I>1984:</I> Junk Culture
- <BR><I>1985:</I> Crush
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+5370">5370</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Oxygiene 23</B>
-
- <BR><I>1995:</I> Blue
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>187 Calm</B>
-
- <BR><I>1995:</I> One Eighty Seven Calm <I>(EP)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>1000 Homo DJs</B>
-
- <BR><I>1990:</I> Supernaut <I>(EP)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Opus III</B>
-
- <BR><I>1991:</I> Mind Fruit
- <BR><I>1994:</I> Guru Mother
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Pain Teens</B>
-
- <BR><I>1990:</I> Born in Blood / Case Histories
- <BR><I>1992:</I> Stimulation Festival
- <BR><I>1993:</I> Destroy Me, Lover
- <BR><I>1995:</I> Beast of Dreams
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Paralysed Age</B>
-
- <BR><I>1994:</I> Nocturne
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Pigface</B>
-
- <BR><I>1990:</I> Gub
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1165">1165</A>
- <BR><I>See also: </I><A HREF="http://www.eecs.nwu.edu/~smishra/Industrial/pigface/index.html">www.eecs.nwu.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Pink Floyd</B>
-
- <BR><I>1973:</I> Dark Side of the Moon
- <BR><I>1975:</I> Wish You were Here
- <BR><I>1978:</I> The Wall <I>(double soundtrack)</I>
- <BR><I>1981:</I> A Collection of Great Dance Songs <I>(comp)</I>
- <BR><I>1995:</I> A Saucerful of Pink: a Tribute <I>(double, various)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1008">1008</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Polygon Window</B>
-
- <BR><I>1993:</I> Surfing on Sine Waves
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+5279">5279</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Police</B>
-
- <BR><I>1979:</I> Outlandos D'Amour
- <BR><I>1980:</I> Ghost in the Machine
- <BR><I>1981:</I> Zenyatta Mondatta
- <BR><I>1983:</I> Synchronicity
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1172">1172</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Poe</B>
-
- <BR><I>1995:</I> Hello
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Pop, Iggy</B>
-
- <BR><I>1977:</I> Lust for Life
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4345">4345</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Powerman 5000</B>
-
- <BR><I>1995:</I> The Blood Splat Rating System
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Powerstation, The</B>
-
- <BR><I>1985:</I> The Powerstation
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1259">1259</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Pram</B>
-
- <BR><I>199?:</I> Iron Lung <I>(EP)</I>
- <BR><I>1995:</I> Helium
- <BR><I>1995:</I> Sargasso Sea
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Prick</B>
-
- <BR><I>1995:</I> Prick
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3683">3683</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Primus</B>
-
- <BR><I>1991:</I> Sailing on the Seas of Cheese
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1055">1055</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Project Pitchfork</B>
-
- <BR><I>1991:</I> Dhyani
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Propaganda</B>
-
- <BR><I>1985:</I> A Secret Wish, US version
- <BR><I>1985:</I> A Secret Wish, UK version <I>(remixes)</I>
- <BR><I>1985:</I> p:machinery (polish / passive) / Frozen Faces <I>(single)</I>
- <BR><I>1985:</I> Duel / Jewel <I>(single)</I>
- <BR><I>1985:</I> Wishful Thinking <I>(remixes)</I>
- <BR><I>1990:</I> Heaven Give Me Words <I>(EP)</I>
- <BR><I>1995:</I> p:machinery t-empo remix <I>(single)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4636">4636</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/ztt">rt66.com</A>
- <BR><I>See also: </I><A HREF="http://hcl.chass.ncsu.edu/~phelpsgm/claudia.htm">hcl.chass.ncsu.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Prophetess, The</B>
-
- <BR><I>1993:</I> The Prophetess
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Public Image Limited</B>
-
- <BR><I>1985:</I> Album
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Rage Against the Machine</B>
-
- <BR><I>1992:</I> Rage Against the Machine
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1424">1424</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Romeo Void</B>
-
- <BR><I>1981:</I> Never Say Never / Present Tense <I>(single)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Blaine Reininger</B>
-
- <BR><I>1989:</I> Expatriate Journals
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Red Aunts</B>
-
- <BR><I>1993:</I> Drag
- <BR><I>1994:</I> Bad Motherfucker 400-Z
- <BR><I>1995:</I> #1 Chicken
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4619">4619</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Re-Flex</B>
-
- <BR><I>1983:</I> The Politics of Dancing / Re-Flex It <I>(single)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Revolting Cocks</B>
-
- <BR><I>1986:</I> Big Sexy Land
- <BR><I>1988:</I> You Goddamned Son of a Bitch <I>(double live)</I>
- <BR><I>1989:</I> Stainless Steel Providers <I>(EP)</I>
- <BR><I>1990:</I> Beers, Steers, and Queers
- <BR><I>1993:</I> Linger Ficken' Good
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1100">1100</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Ridgway, Stan</B>
-
- <BR><I>1986:</I> The Big Heat
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2904">2904</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Rosemarys, The</B>
-
- <BR><I>1993:</I> Providence
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Rosetta Stone</B>
-
- <BR><I>1993:</I> Adrenaline
- <BR><I>1995:</I> The Tyrrany of Inaction
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Ruby</B>
-
- <BR><I>1995:</I> Salt Peter
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Rump</B>
-
- <BR><I>1994:</I> Hating Brenda
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Rush</B>
-
- <BR><I>1984:</I> Grace Under Pressure
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1039">1039</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sandoz</B>
-
- <BR><I>1993:</I> Digital Lifeforms
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Scatterbrain</B>
-
- <BR><I>1990:</I> Here Comes Trouble
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Scar Tissue</B>
-
- <BR><I>1995:</I> Scar Tissue
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Scritti Politti</B>
-
- <BR><I>1985:</I> Cupid &amp; Psyche
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Severed Heads</B>
-
- <BR><I>1983:</I> Since the Accident
- <BR><I>1986:</I> Come Visit the Big Bigot
- <BR><I>1987:</I> Bad Mood Guy
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1480">1480</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sex Gang, Andi</B>
-
- <BR><I>1994:</I> Arco Valley
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sex Gang Children</B>
-
- <BR><I>1992:</I> Blind
- <BR><I>1993:</I> Dieche
- <BR><I>1993:</I> Medea
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Shadow Project</B>
-
- <BR><I>1991:</I> Shadow Project
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sharkbait</B>
-
- <BR><I>1991:</I> Blowtorch Facelift
- <BR><I>1993:</I> Crushits
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sheep on Drugs</B>
-
- <BR><I>1993:</I> Greatest Hits <I>(comp)</I>
- <BR><I>1995:</I> Suck <I>(EP)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Shriekback</B>
-
- <BR><I>1982:</I> Tench
- <BR><I>1983:</I> Care
- <BR><I>1983:</I> Care <I>(Y version)</I>
- <BR><I>1983:</I> Lined Up / Hapax Legomena <I>(single)</I>
- <BR><I>1983:</I> Lined Up / My Spine / Accretions /Into Method <I>(single)</I>
- <BR><I>1983:</I> My Spine / Accretions / Clear Trails <I>(single)</I>
- <BR><I>1983:</I> Sexthinkone / Here Comes My Hand <I>(single)</I>
- <BR><I>1984:</I> Jamscience <I>(UK release)</I>
- <BR><I>1984:</I> Jamscience <I>(Holland release)</I>
- <BR><I>1984:</I> Knowledge, Power, Truth, and Sex
- <BR><I>1984:</I> Mercy Dash <I>(picture disc, single)</I>
- <BR><I>1984:</I> Hand on my Heart <I>(picture disc, single)</I>
- <BR><I>1985:</I> The Infinite <I>(comp)</I>
- <BR><I>1985:</I> Oil and Gold
- <BR><I>1985:</I> Fish Below the Ice <I>(EP)</I>
- <BR><I>1983-1985:</I> Priests and Kannibals <I>(comp)</I>
- <BR><I>1986:</I> Big Night Music
- <BR><I>1986:</I> Islam Grotto <I>(live boot)</I>
- <BR><I>1988:</I> Evolution <I>(comp)</I>
- <BR><I>1990:</I> The Dancing Years <I>(remixes)</I>
- <BR><I>1993:</I> Sacred City
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1248">1248</A>
- <BR><I>See also: </I><A HREF="http://http2.brunel.ac.uk:8080/~ee92pmh/shrkindx.html">http2.brunel.ac.uk</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Siglo XX</B>
-
- <BR><I>1983-1986:</I> Antler Tracks I <I>(comp)</I>
- <BR><I>1986:</I> Fear and Desire
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Single Gun Theory</B>
-
- <BR><I>1989?:</I> Exorcise this Wasteland
- <BR><I>1991:</I> Like Stars in my Hands
- <BR><I>1993:</I> Burning Bright (but Unseen) <I>(EP)</I>
- <BR><I>1994:</I> Flow, River of my Soul
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1404">1404</A>
- <BR><I>See also: </I><A HREF="http://www.magna.com.au:80/~gunners/">www.magna.com.au</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Siouxsie and the Banshees</B>
-
- <BR><I>1977:</I> Peel Sessions <I>(live EP)</I>
- <BR><I>1978:</I> Peel Sessions 2 <I>(live EP)</I>
- <BR><I>1978:</I> The Scream
- <BR><I>1979:</I> Join Hands
- <BR><I>1980:</I> Kaleidoscope
- <BR><I>1981:</I> juju
- <BR><I>1981:</I> Once Upon a Time <I>(comp)</I>
- <BR><I>1981:</I> Spellbound / Follow the Sun / Slap Dash Snap <I>(single)</I>
- <BR><I>1982:</I> Slowdive / Obsession II / Cannibal Roses <I>(single)</I>
- <BR><I>1982:</I> A Kiss in the Dream House
- <BR><I>1983:</I> Nocturne <I>(double live)</I>
- <BR><I>1984:</I> Hyaena
- <BR><I>1985:</I> Tinderbox
- <BR><I>1986:</I> Through the Looking Glass
- <BR><I>1987:</I> Song from the Edge of the World <I>(single)</I>
- <BR><I>1988:</I> Peekaboo / False Face / Catwalk <I>(single)</I>
- <BR><I>1988:</I> Peepshow
- <BR><I>1991:</I> Superstition
- <BR><I>1991:</I> Kiss Them for Me <I>(EP)</I>
- <BR><I>1995:</I> The Rapture
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1216">1216</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sister Machine Gun</B>
-
- <BR><I>1992:</I> Sins of the Flesh
- <BR><I>1994:</I> The Torture Technique
- <BR><I>1994:</I> Nothing <I>(single)</I>
- <BR><I>1994:</I> Wired / Lung <I>(single)</I>
- <BR><I>1995:</I> Burn
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3612">3612</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sisterhood, The</B>
-
- <BR><I>1986:</I> Gift
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1115">1115</A>
- <BR><I>See also: </I><A HREF="http://www.cm.cf.ac.uk/Sisters.Of.Mercy/Related.Works/Sisterhood.Page.html">www.cm.cf.ac.uk</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sisters of Mercy</B>
-
- <BR><I>1985:</I> First and Last and Always
- <BR><I>1988:</I> Floodland
- <BR><I>1988:</I> More / You Could be the One <I>(single)</I>
- <BR><I>1990:</I> Vision Thing
- <BR><I>1992:</I> Some Girls Wander by Mistake <I>(comp)</I>
- <BR><I>1992:</I> Temple of Love 1992 <I>(single)</I>
- <BR><I>1993:</I> First and Last and Forever: A Tribute <I>(various)</I>
- <BR><I>1993:</I> Under the Gun / Alice 1993 <I>(single)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1062">1062</A>
- <BR><I>See also: </I><A HREF="http://www.cm.cf.ac.uk:/Sisters.Of.Mercy/">www.cm.cf.ac.uk</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Skeletal Family</B>
-
- <BR><I>1984-1985:</I> Burning Oil / Futile Combat
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Skinny Puppy</B>
-
- <BR><I>1983:</I> Back and Forth, Series Two
- <BR><I>1984:</I> Bites
- <BR><I>1984:</I> Remission
- <BR><I>1984:</I> Bites and Remission
- <BR><I>1986:</I> Mind: the Perpetual Intercourse
- <BR><I>1986:</I> Dig It <I>(EP)</I>
- <BR><I>1987:</I> Cleanse, Fold, and Manipulate
- <BR><I>1988:</I> Vivisect VI
- <BR><I>1989:</I> Rabies
- <BR><I>1990:</I> Too Dark Park
- <BR><I>1990:</I> Censor <I>(EP)</I>
- <BR><I>1992:</I> 12 Inch Anthology <I>(comp)</I>
- <BR><I>1992:</I> Last Rights
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1166">1166</A>
- <BR><I>See also: </I><A HREF="http://www.eecs.nwu.edu/~smishra/Industrial/skinny-puppy">www.eecs.nwu.edu</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sky Cries Mary</B>
-
- <BR><I>1993:</I> A Return to the Inner Experience
- <BR><I>1994:</I> This Timeless Turning
- <BR><I>1994:</I> Every Iceberg is Afire / Deep Sunless Sea / Cornerman <I>(single)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1437">1437</A>
- <BR><I>See also: </I><A HREF="http://www.starwave.com/corp/scm/scm.html">www.starwave.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Snog</B>
-
- <BR><I>1995:</I> Dear Valued Customer
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Soh Daiko</B>
-
- <BR><I>1990:</I> Taiko Drum Ensemble
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Some, Belouis</B>
-
- <BR><I>1984:</I> Some People <I>(single)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Southern Death Cult</B>
-
- <BR><I>1982-1983:</I> Southern Death Cult <I>(comp)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Spahn Ranch</B>
-
- <BR><I>1995:</I> The Coiled One
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>SSQ</B>
-
- <BR><I>1984:</I> Playback
- <BR><I>1986:</I> Insecurity <I>(single)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Stabbing Westward</B>
-
- <BR><I>1993:</I> Violent Mood Swings <I>(EP)</I>
- <BR><I>1994:</I> Ungod
- <BR><I>1995:</I> What Do I Have to Do / Falls Apart <I>(single)</I>
- <BR><I>1995:</I> Wither Blister Burn and Peel
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2415">2415</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Strange Boutique</B>
-
- <BR><I>199?:</I> Charm
- <BR><I>199?:</I> The Kindest Words
- <BR><I>199?:</I> The Loved One
- </TD><TD>
-<I>See also: </I><A HREF="http://www.iuma.com/Bedazzled/band_html/Strange_Boutique.html">www.iuma.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Steroid Maximus</B>
-
- <BR><I>1991:</I> Quilombo
- <BR><I>1992:</I> Gondwanaland
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2750">2750</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sugarcubes, The</B>
-
- <BR><I>1988:</I> Life's Too Good
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3419">3419</A>
- <BR><I>See also: </I><A HREF="http://math-www.uio.no/bjork/index.html">math-www.uio.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Sunscreem</B>
-
- <BR><I>1992:</I> O3
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Switchblade Symphony</B>
-
- <BR><I>1992:</I> Fable <I>(tape/EP)</I>
- <BR><I>1993:</I> Elegy <I>(tape/EP)</I>
- <BR><I>1995:</I> Serpentine Gallery
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Talking Heads</B>
-
- <BR><I>1977:</I> Talking Heads '77
- <BR><I>1978:</I> More Songs About Buildings and Food
- <BR><I>1979:</I> The Name of This Band is Talking Heads <I>(double live)</I>
- <BR><I>1981:</I> Fear of Music
- <BR><I>1983:</I> Sp eak in gI n To ngu es
- <BR><I>1985:</I> Stop Making Sense <I>(live soundtrack)</I>
- <BR><I>1985:</I> Little Creatures
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1012">1012</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Tears For Fears</B>
-
- <BR><I>1983:</I> The Hurting
- <BR><I>1985:</I> Songs From the Big Chair
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2763">2763</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Tel Basta</B>
-
- <BR><I>1996:</I> Lickerish
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Thanatos</B>
-
- <BR><I>1995:</I> An Embassy in Gaius
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Therapy?</B>
-
- <BR><I>1992:</I> Caucasian Psychosis
- <BR><I>1992:</I> Nurse
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2044">2044</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>13 Mg.</B>
-
- <BR><I>1995:</I> Trust and Obey
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>This Ascension</B>
-
- <BR><I>1991:</I> Light and Shade
- <BR><I>1994:</I> Walk Softly, a Dream Lies Here
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Throwing Muses</B>
-
- <BR><I>1986:</I> Throwing Muses
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1357">1357</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Tinfed</B>
-
- <BR><I>1993:</I> Synaptic Hardware
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Tin Machine</B>
-
- <BR><I>1989:</I> Tin Machine
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1098">1098</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Tit Wrench United</B>
-
- <BR><I>1993:</I> Full Employment
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Tom Tom Club</B>
-
- <BR><I>1981:</I> Tom Tom Club
- <BR><I>1983:</I> Close to the Bone
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1012">1012</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Tones on Tail</B>
-
- <BR><I>1982:</I> Tones on Tail
- <BR><I>1984:</I> Pop
- <BR><I>1984:</I> Performance / Shakes <I>(single)</I>
- <BR><I>1982-1984:</I> Night Music <I>(comp)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1235">1235</A>
- <BR><I>See also: </I><A HREF="http://gothic.acs.csulb.edu:8080/~vamp/Gothic/Text/bauhaus-discog.html">gothic.acs.csulb.edu</A>
- <BR><I>See also: </I><A HREF="http://isvpc146.isv.uit.no/html/title/t.html#tonesontail">isvpc146.isv.uit.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Trance Mission</B>
-
- <BR><I>1993:</I> Trance Mission
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Trance to the Sun</B>
-
- <BR><I>1994:</I> Ghost Forest
- <BR><I>1995:</I> Bloom, Flowers, Bloom!
- <BR><I>1995:</I> Venomous Eve
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Transvision Vamp</B>
-
- <BR><I>1991:</I> Little Magnets versus the Bubble of Babble
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+5305">5305</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Trio</B>
-
- <BR><I>1983:</I> Trio and Error
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Tubes, The</B>
-
- <BR><I>1981:</I> Tubes Rarities And Smash Hits [T.R.A.S.H]
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Tuxedomoon</B>
-
- <BR><I>1980:</I> Half-Mute
- <BR><I>1983:</I> A Thousand Lives by Picture
- <BR><I>1985:</I> Holy Wars
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Underflowers</B>
-
- <BR><I>1995:</I> Underflowers
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Urban Dance Squad</B>
-
- <BR><I>1991:</I> Life'n Perspectives of a Genuine Crossover
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4626">4626</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Usherhouse</B>
-
- <BR><I>1993:</I> Molting
- <BR><I>1994:</I> Flux
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Ultravox</B>
-
- <BR><I>1978:</I> Systems of Romance
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Van Acker, Luc</B>
-
- <BR><I>1980:</I> Taking Snapshots, Volume 1
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1100">1100</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Vangelis</B>
-
- <BR><I>1994:</I> Blade Runner <I>(soundtrack)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1023">1023</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/vangelis">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>various</B>
-
- <BR><I>1980:</I> URGH! A Music War <I>(live comp)</I>
- <BR><I>1981-1994:</I> Wax Trax Black Box <I>(comp)</I>
- <BR><I>1982-198?:</I> In Goth Daze (Anagram version) <I>(comp)</I>
- <BR><I>1982-1994:</I> In Goth Daze (Cleopatra version) <I>(comp)</I>
- <BR><I>1982-1993:</I> The Whip (Cleopatra) <I>(comp)</I>
- <BR><I>1984-1985:</I> IQ6: Zang Tumb Tuum Sampled <I>(comp)</I>
- <BR><I>1984-1995:</I> DEC ADE NCE (Nettwerk) <I>(comp)</I>
- <BR><I>1988:</I> This is Electronic Body Music <I>(comp)</I>
- <BR><I>1990:</I> From Across This Gray Land #2 (Projekt) <I>(comp)</I>
- <BR><I>1990:</I> Doctor Death IV: The Marvels of Insect Life <I>(double comp)</I>
- <BR><I>1990:</I> Red Hot + Blue <I>(comp)</I>
- <BR><I>1991:</I> Bouquet of Dreams <I>(comp)</I>
- <BR><I>1980-1992:</I> Gothic Rock <I>(comp)</I>
- <BR><I>1992:</I> Mindfield (Third Mind) <I>(comp)</I>
- <BR><I>1992:</I> From Across This Gray Land #3 (Projekt) <I>(comp)</I>
- <BR><I>1992:</I> The Cyberflesh Conspiracy <I>(comp)</I>
- <BR><I>1992:</I> G&aacute;rgula Mec&acirc;nica: World Electrostatic Assembly <I>(comp)</I>
- <BR><I>1992:</I> CCCC: California Cyber Crash Compilation (Cop) <I>(comp)</I>
- <BR><I>1993:</I> Shut Up Kitty <I>(comp)</I>
- <BR><I>1988-1993:</I> Can You See It Yet? (Invisible) <I>(comp)</I>
- <BR><I>1994:</I> Mysterious Encounters (Cleopatra) <I>(comp)</I>
- <BR><I>1994:</I> The Crow <I>(comp)</I>
- <BR><I>1994:</I> Totentanz: The Best of Zoth Ommog <I>(double comp)</I>
- <BR><I>1992:</I> Hy! (Hyperium Compilation volume 1) <I>(comp)</I>
- <BR><I>1993:</I> World Domination Sampler <I>(comp)</I>
- <BR><I>1993:</I> Rivet Head Culture <I>(comp)</I>
- <BR><I>1993:</I> Artificial Intelligence (Warp) <I>(comp)</I>
- <BR><I>1994:</I> Artificial Intelligence II (Warp) <I>(comp)</I>
- <BR><I>1994:</I> Big Hard Disk #2 (Smash) <I>(comp)</I>
- <BR><I>1994:</I> Kindred Spirits (Bedazzled) <I>(comp)</I>
- <BR><I>1994:</I> Plug In + Turn On (Instinct) <I>(comp)</I>
- <BR><I>1994:</I> The Disease of Lady Madeline (Anubis) <I>(comp)</I>
- <BR><I>1994:</I> Natural Born Killers <I>(soundtrack comp)</I>
- <BR><I>1994:</I> Afterburn (Wax Trax) <I>(comp)</I>
- <BR><I>1994:</I> Chaos Compilation (Cop) <I>(comp)</I>
- <BR><I>1994:</I> Electrocity Vol. 5 <I>(comp)</I>
- <BR><I>1995:</I> Gothik (Cleopatra) <I>(double comp)</I>
- <BR><I>1995:</I> Godfathers of German Gothic <I>(comp)</I>
- <BR><I>1995:</I> Heavenly Voices III (Hyperium) <I>(comp)</I>
- <BR><I>1995:</I> Mortal Kombat <I>(soundtrack comp)</I>
- <BR><I>1995:</I> The Tyranny Off the Beat (Off Beat/Cleopatra) <I>(comp)</I>
- <BR><I>1995:</I> Forced Cranial Removal (Fifth Colvmn) <I>(comp)</I>
- <BR><I>1995:</I> Dreams in the Witch House (Grave News) <I>(comp)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Vega, Suzanne</B>
-
- <BR><I>1992:</I> 99.9F
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2088">2088</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Vinyl Devotion</B>
-
- <BR><I>1994:</I> If They Know You're Trying
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Volume Magazine</B>
-
- <BR><I>1991:</I> Volume: 1 <I>(comp)</I>
- <BR><I>1991:</I> Volume: 2 <I>(comp)</I>
- <BR><I>1992:</I> Volume: 3 <I>(comp)</I>
- <BR><I>1992:</I> Volume: 4 <I>(comp)</I>
- <BR><I>1995:</I> Wasted: The Best of Volume <I>(double comp)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Waitresses, The</B>
-
- <BR><I>1981:</I> Wasn't Tomorrow Wonderful?
- <BR><I>1982:</I> Bruiseology
- <BR><I>1978-1981:</I> Best Of <I>(comp)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Wake, The</B>
-
- <BR><I>1993:</I> Masked
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Wall of Voodoo</B>
-
- <BR><I>1980:</I> fpfpfpfpfpfp
- <BR><I>1981:</I> Dark Continent
- <BR><I>1982:</I> Call of the West
- <BR><I>1986:</I> Seven Days in Sammystown
- <BR><I>1987:</I> Happy Planet
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Wang Chung</B>
-
- <BR><I>1983:</I> Points On the Curve
- <BR><I>1985:</I> To Live and Die in L.A. <I>(soundtrack)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+2245">2245</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Westworld</B>
-
- <BR><I>1987:</I> Rockulator
- <BR><I>1991:</I> Movers and Shakers
- <BR><I>1991:</I> Do No Wrong <I>(single)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Whale</B>
-
- <BR><I>1994:</I> Hobo Humpin Slobo Babe / Eye 842 <I>(single)</I>
- <BR><I>1994:</I> Hobo Humpin Slobo Babe / Lips / Eye 842 <I>(single)</I>
- <BR><I>1994:</I> Pay for Me <I>(EP)</I>
- <BR><I>1995:</I> We Care
- <BR><I>1995:</I> I'll Do Ya <I>(EP)</I>
- <BR><I>1995:</I> Hobo Humpin Slobo Babe (3 mixes) <I>(single)</I>
- <BR><I>1995:</I> Hobo Humpin Slobo Babe / You and Your Sister / Singer Star <I>(single)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+3790">3790</A>
- <BR><I>See also: </I><A HREF="http://www.vmg.co.uk/hut/whale/">www.vmg.co.uk</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>White Zombie</B>
-
- <BR><I>1992:</I> Nightcrawlers: the KMFDM Remixes <I>(EP)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Wilde, Kim</B>
-
- <BR><I>1981:</I> Kim Wilde
- <BR><I>1984:</I> Teases &amp; Dares
- <BR><I>1981-1993:</I> The Singles Collection <I>(comp)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>X</B>
-
- <BR><I>1988:</I> Live at the Whiskey-a-Go-Go <I>(double live)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>X Marks the Pedwalk</B>
-
- <BR><I>1994:</I> The Killing Had Begun
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Xorcist</B>
-
- <BR><I>1991:</I> Damned Souls
- <BR><I>1993:</I> Bitches <I>(EP)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>XTC</B>
-
- <BR><I>1982:</I> Waxworks
- <BR><I>1983:</I> Mummer
- <BR><I>1984:</I> The Big Express
- <BR><I>1985:</I> 25 O'Clock
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1044">1044</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Xymox</B>
-
- <BR><I>1985:</I> Clan of Xymox
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1295">1295</A>
- <BR><I>See also: </I><A HREF="http://isvpc146.isv.uit.no/html/group/clanofxymox.html#clanofxymox">isvpc146.isv.uit.no</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Yamashirogumi, Geinoh</B>
-
- <BR><I>1990:</I> Akira <I>(soundtrack)</I>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Yazoo</B>
-
- <BR><I>1982:</I> Upstairs at Eric's
- <BR><I>1982:</I> The Other Side of Love <I>(single)</I>
- <BR><I>1983:</I> You and Me Both
- <BR><I>1983:</I> Nobody's Diary / State Farm <I>(single)</I>
- <BR><I>1983:</I> Situation <I>(EP)</I>
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+4309">4309</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/erasure">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Yello</B>
-
- <BR><I>1980:</I> Solid Pleasure
- <BR><I>1981:</I> Stella
- <BR><I>1983:</I> You Gotta Say Yes to Another Excess
- <BR><I>1987:</I> One Second
- <BR><I>1988:</I> Flag
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1506">1506</A>
- <BR><I>See also: </I><A HREF="http://newton.space.net/yello/yello.a.html">newton.space.net</A>
- <BR><I>See also: </I><A HREF="http://rt66.com/ftp/usr2/lazlo/discographies/yello">rt66.com</A>
- </TD></TABLE>
-
-<LI> <TABLE BORDER=0 width="90%" CELLSPACING=4><TR VALIGN=TOP><TD WIDTH="60%">
- <B>Yes</B>
-
- <BR><I>1972:</I> Fragile
- <BR><I>1975:</I> Classic Yes
- <BR><I>1980:</I> Drama
- <BR><I>1983:</I> 90125
- </TD><TD>
-<I>UBL Card: </I><A HREF="http://american.recordings.com/WWWoM/cgi-bin/ubl?card+1038">1038</A>
- </TD></TABLE>
-</UL>
-
---------------167E2781446B
-Content-Type: application/postscript; name="album-list.ps"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: inline; filename="album-list.ps"
-
-%!PS-Adobe-3.0
-%%BoundingBox: 54 72 558 720
-%%Creator: Mozilla (NetScape) HTML->PS
-%%DocumentData: Clean7Bit
-%%Orientation: Portrait
-%%Pages: 31
-%%PageOrder: Ascend
-%%Title: jwz's tunes
-%%EndComments
-%%BeginProlog
-[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
- /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
- /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
- /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
- /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
- /two /three /four /five /six /seven /eight /nine /colon /semicolon
- /less /equal /greater /question /at /A /B /C /D /E
- /F /G /H /I /J /K /L /M /N /O
- /P /Q /R /S /T /U /V /W /X /Y
- /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
- /d /e /f /g /h /i /j /k /l /m
- /n /o /p /q /r /s /t /u /v /w
- /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
- /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
- /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
- /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
- /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
- /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
- /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
- /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
- /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
- /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
- /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
- /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
- /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
- /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
-/c { matrix currentmatrix currentpoint translate
- 3 1 roll scale newpath 0 0 1 0 360 arc setmatrix } bind def
-/F0
- /Times-Roman findfont
- dup length dict begin
- {1 index /FID ne {def} {pop pop} ifelse} forall
- /Encoding isolatin1encoding def
- currentdict end
-definefont pop
-/f0 { /F0 findfont exch scalefont setfont } bind def
-/F1
- /Times-Bold findfont
- dup length dict begin
- {1 index /FID ne {def} {pop pop} ifelse} forall
- /Encoding isolatin1encoding def
- currentdict end
-definefont pop
-/f1 { /F1 findfont exch scalefont setfont } bind def
-/F2
- /Times-Italic findfont
- dup length dict begin
- {1 index /FID ne {def} {pop pop} ifelse} forall
- /Encoding isolatin1encoding def
- currentdict end
-definefont pop
-/f2 { /F2 findfont exch scalefont setfont } bind def
-/F3
- /Times-BoldItalic findfont
- dup length dict begin
- {1 index /FID ne {def} {pop pop} ifelse} forall
- /Encoding isolatin1encoding def
- currentdict end
-definefont pop
-/f3 { /F3 findfont exch scalefont setfont } bind def
-/F4
- /Courier findfont
- dup length dict begin
- {1 index /FID ne {def} {pop pop} ifelse} forall
- /Encoding isolatin1encoding def
- currentdict end
-definefont pop
-/f4 { /F4 findfont exch scalefont setfont } bind def
-/F5
- /Courier-Bold findfont
- dup length dict begin
- {1 index /FID ne {def} {pop pop} ifelse} forall
- /Encoding isolatin1encoding def
- currentdict end
-definefont pop
-/f5 { /F5 findfont exch scalefont setfont } bind def
-/F6
- /Courier-Oblique findfont
- dup length dict begin
- {1 index /FID ne {def} {pop pop} ifelse} forall
- /Encoding isolatin1encoding def
- currentdict end
-definefont pop
-/f6 { /F6 findfont exch scalefont setfont } bind def
-/F7
- /Courier-BoldOblique findfont
- dup length dict begin
- {1 index /FID ne {def} {pop pop} ifelse} forall
- /Encoding isolatin1encoding def
- currentdict end
-definefont pop
-/f7 { /F7 findfont exch scalefont setfont } bind def
-/rhc {
- {
- currentfile read {
- dup 97 ge
- { 87 sub true exit }
- { dup 48 ge { 48 sub true exit } { pop } ifelse }
- ifelse
- } {
- false
- exit
- } ifelse
- } loop
-} bind def
-
-/cvgray { % xtra_char npix cvgray - (string npix long)
- dup string
- 0
- {
- rhc { cvr 4.784 mul } { exit } ifelse
- rhc { cvr 9.392 mul } { exit } ifelse
- rhc { cvr 1.824 mul } { exit } ifelse
- add add cvi 3 copy put pop
- 1 add
- dup 3 index ge { exit } if
- } loop
- pop
- 3 -1 roll 0 ne { rhc { pop } if } if
- exch pop
-} bind def
-
-/smartimage12rgb { % w h b [matrix] smartimage12rgb -
- /colorimage where {
- pop
- { currentfile rowdata readhexstring pop }
- false 3
- colorimage
- } {
- exch pop 8 exch
- 3 index 12 mul 8 mod 0 ne { 1 } { 0 } ifelse
- 4 index
- 6 2 roll
- { 2 copy cvgray }
- image
- pop pop
- } ifelse
-} def
-/cshow { dup stringwidth pop 2 div neg 0 rmoveto show } bind def
-/rshow { dup stringwidth pop neg 0 rmoveto show } bind def
-%%EndProlog
-%%Page: 1 1
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-219.1 706.9 moveto
-14 f1
-(jwz's tunes) show
-174 690.9 moveto
-14 f1
-(Last modified: 06-Apr-96.) show
-0 663.9 moveto
-12 f0
-(This is a list of all of the music I have on CD, tape, and vinyl \(including all of the old, embarrasing) show
-0 650.6 moveto
-12 f0
-(stuff...\) This page may look a little funny if you aren't using a browser that supports HTML tables, like) show
-0 637.3 moveto
-12 f0
-(Mozilla) show
-37.3 637.3 moveto
-12 f0
-(.) show
-28 610.7 moveto
-12 f0
-(``) show
-35.9 610.7 moveto
-12 f2
-(Publishing CD lists and tape collections evokes images of lonely, pathetic men who talk) show
-28 597.4 moveto
-12 f2
-(about their cats incessantly.) show
-162.6 597.4 moveto
-12 f0
-('' -- Paul Phillips ) show
-0 570.8 moveto
-12 f0
-(I used to have this set up so that clicking on any name would take you to the appropriate entry of the All) show
-0 557.5 moveto
-12 f0
-(Music Guide at ) show
-76.9 557.5 moveto
-10 f4
-(gopher://allmusic.ferris.edu) show
-244.9 557.5 moveto
-12 f0
-(; but they have since moved their database from there) show
-0 544.2 moveto
-12 f0
-(to ) show
-12.3 544.2 moveto
-10 f4
-(cdnow.com) show
-66.3 544.2 moveto
-12 f0
-(, and in the process, have obfuscated access to the database to such an extent that this is no) show
-0 530.9 moveto
-12 f0
-(longer possible. In order to get at the discographies, you need to weed your way through dozens of) show
-0 517.6 moveto
-12 f0
-(pages, and there seems to be no even semi-reliable way to pre-compute the URL that they will use.) show
-0 504.3 moveto
-12 f0
-(Arrgh!) show
-0 477.7 moveto
-12 f0
-(The Internet Movie Database) show
-140.2 477.7 moveto
-12 f0
-( has an excellent interface for this sort of thing; I really wish more people) show
-0 464.4 moveto
-12 f0
-(would emulate that system.) show
-0 437.8 moveto
-12 f0
-(In this list, I've included links to various related web pages that I've come across; one very cool and) show
-0 424.5 moveto
-12 f0
-(well-organized database to which many of these links point is ) show
-299.2 424.5 moveto
-12 f0
-(The Ultimate Band List) show
-412.8 424.5 moveto
-12 f0
-(; check it out!) show
-157.2 397.9 moveto
-12 f0
-(Jamie Zawinski) show
-232.8 397.9 moveto
-12 f0
-( ) show
-235.8 397.9 moveto
-10 f4
-(<jwz@netscape.com>) show
-343.8 397.9 moveto
-12 f0
-( ) show
-0 375.6 moveto
-504 0 rlineto 0 -2.8 rlineto -504 0 rlineto closepath fill
-18.1 348.8 moveto
-3.3 3.3 c fill
-31.5 340.7 moveto
-12 f1
-(Act) show
-49.4 340.7 moveto
-12 f0
-( ) show
-31.5 327.4 moveto
-12 f2
-(1988:) show
-59.4 327.4 moveto
-12 f0
-( Laughter, Tears, and Rage ) show
-298.1 341.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 341.2 moveto
-12 f0
-(4637) show
-379.4 341.2 moveto
-12 f0
-( ) show
-298.1 327.9 moveto
-12 f2
-(See also: ) show
-344.7 327.9 moveto
-12 f0
-(rt66.com) show
-387.6 327.9 moveto
-12 f0
-( ) show
-298.1 314.6 moveto
-12 f2
-(See also: ) show
-344.7 314.6 moveto
-12 f0
-(hcl.chass.ncsu.edu) show
-433.6 314.6 moveto
-12 f0
-( ) show
-18.1 301.9 moveto
-3.3 3.3 c fill
-31.5 293.8 moveto
-12 f1
-(Age of Chance) show
-106.1 293.8 moveto
-12 f0
-( ) show
-31.5 280.5 moveto
-12 f2
-(1987:) show
-59.4 280.5 moveto
-12 f0
-( Kiss ) show
-86.7 280.5 moveto
-12 f2
-(\(single\)) show
-123.3 280.5 moveto
-12 f0
-( ) show
-31.5 267.2 moveto
-12 f2
-(1987:) show
-59.4 267.2 moveto
-12 f0
-( Don't Get Mad, Get Even ) show
-189.7 267.2 moveto
-12 f2
-(\(single\)) show
-226.3 267.2 moveto
-12 f0
-( ) show
-18.1 254.5 moveto
-3.3 3.3 c fill
-31.5 246.4 moveto
-12 f1
-(Alien Sex Fiend) show
-112.1 246.4 moveto
-12 f0
-( ) show
-31.5 233.1 moveto
-12 f2
-(1983-1992:) show
-87.4 233.1 moveto
-12 f0
-( Drive My Rocket ) show
-177.3 233.1 moveto
-12 f2
-(\(comp\)) show
-211.2 233.1 moveto
-12 f0
-( ) show
-31.5 219.8 moveto
-12 f2
-(1989:) show
-59.4 219.8 moveto
-12 f0
-( Too Much Acid? ) show
-147.3 219.8 moveto
-12 f2
-(\(live\)) show
-172.6 219.8 moveto
-12 f0
-( ) show
-31.5 206.5 moveto
-12 f2
-(1990:) show
-59.4 206.5 moveto
-12 f0
-( Curse ) show
-31.5 193.2 moveto
-12 f2
-(1992:) show
-59.4 193.2 moveto
-12 f0
-( Open Head Surgery ) show
-31.5 179.9 moveto
-12 f2
-(1993:) show
-59.4 179.9 moveto
-12 f0
-( Altered States of America ) show
-190.3 179.9 moveto
-12 f2
-(\(live\)) show
-215.6 179.9 moveto
-12 f0
-( ) show
-31.5 164 moveto
-12 f2
-(1995:) show
-59.4 164 moveto
-12 f0
-( Inferno: The Odyssey Continues) show
-218.7 168.4 moveto
-10 f0
-(tm) show
-229.2 164 moveto
-12 f0
-( ) show
-232.2 164 moveto
-12 f2
-(\(soundtrack\)) show
-298.1 246.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 246.9 moveto
-12 f0
-(5291) show
-379.4 246.9 moveto
-12 f0
-( ) show
-298.1 233.6 moveto
-12 f2
-(See also: ) show
-344.7 233.6 moveto
-12 f0
-(cent1.lancs.ac.uk) show
-427 233.6 moveto
-12 f0
-( ) show
-18.1 151.3 moveto
-3.3 3.3 c fill
-31.5 143.2 moveto
-12 f1
-(Alio Die) show
-73.1 143.2 moveto
-12 f0
-( ) show
-31.5 129.9 moveto
-12 f2
-(1993:) show
-59.4 129.9 moveto
-12 f0
-( Under a Holy Ritual ) show
-298.1 143.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 143.7 moveto
-12 f0
-(1266) show
-379.4 143.7 moveto
-12 f0
-( ) show
-298.1 130.4 moveto
-12 f2
-(See also: ) show
-344.7 130.4 moveto
-12 f0
-(www.projekt.com) show
-431.3 130.4 moveto
-12 f0
-( ) show
-18.1 117.2 moveto
-3.3 3.3 c fill
-31.5 109.1 moveto
-12 f1
-(Alphaville) show
-84.1 109.1 moveto
-12 f0
-( ) show
-31.5 95.8 moveto
-12 f2
-(1984:) show
-59.4 95.8 moveto
-12 f0
-( Forever Young ) show
-298.1 109.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 109.6 moveto
-12 f0
-(3056) show
-379.4 109.6 moveto
-12 f0
-( ) show
-298.1 96.3 moveto
-12 f2
-(See also: ) show
-344.7 96.3 moveto
-12 f0
-(www.escape.com) show
-429.3 96.3 moveto
-12 f0
-( ) show
-18.1 83.1 moveto
-3.3 3.3 c fill
-31.5 75 moveto
-12 f1
-(Altered Images) show
-109.8 75 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 2 2
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1981:) show
-59.4 709.2 moveto
-12 f0
-( Happy Birthday ) show
-31.5 695.9 moveto
-12 f2
-(1983:) show
-59.4 695.9 moveto
-12 f0
-( Bite ) show
-31.5 682.6 moveto
-12 f2
-(1984:) show
-59.4 682.6 moveto
-12 f0
-( Collected Images ) show
-149 682.6 moveto
-12 f2
-(\(comp\)) show
-182.9 682.6 moveto
-12 f0
-( ) show
-18.1 669.9 moveto
-3.3 3.3 c fill
-31.5 661.8 moveto
-12 f1
-(An April March) show
-114.8 661.8 moveto
-12 f0
-( ) show
-31.5 648.5 moveto
-12 f2
-(1995:) show
-59.4 648.5 moveto
-12 f0
-( Lessons in Vengance ) show
-31.5 635.2 moveto
-12 f2
-(1995:) show
-59.4 635.2 moveto
-12 f0
-( Instruments of Lust and Fury ) show
-18.1 622.5 moveto
-3.3 3.3 c fill
-31.5 614.4 moveto
-12 f1
-(And Also the Trees) show
-129.8 614.4 moveto
-12 f0
-( ) show
-31.5 601.1 moveto
-12 f2
-(1983-1992:) show
-87.4 601.1 moveto
-12 f0
-( From Horizon to Horizon ) show
-216.3 601.1 moveto
-12 f2
-(\(comp\)) show
-250.2 601.1 moveto
-12 f0
-( ) show
-298.1 614.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 614.9 moveto
-12 f0
-(1867) show
-379.4 614.9 moveto
-12 f0
-( ) show
-298.1 601.6 moveto
-12 f2
-(See also: ) show
-344.7 601.6 moveto
-12 f0
-(www.ugcs.caltech.edu) show
-453 601.6 moveto
-12 f0
-( ) show
-298.1 588.3 moveto
-12 f2
-(See also: ) show
-344.7 588.3 moveto
-12 f0
-(onyx.dartmouth.edu) show
-441.3 588.3 moveto
-12 f0
-( ) show
-18.1 575.6 moveto
-3.3 3.3 c fill
-31.5 567.5 moveto
-12 f1
-(Anderson, Laurie) show
-122.1 567.5 moveto
-12 f0
-( ) show
-31.5 554.2 moveto
-12 f2
-(1982:) show
-59.4 554.2 moveto
-12 f0
-( Big Science ) show
-31.5 540.9 moveto
-12 f2
-(1983:) show
-59.4 540.9 moveto
-12 f0
-( United States Live, parts 1-4 ) show
-203 540.9 moveto
-12 f2
-(\(5 albums\)) show
-254.6 540.9 moveto
-12 f0
-( ) show
-31.5 527.6 moveto
-12 f2
-(1984:) show
-59.4 527.6 moveto
-12 f0
-( Mister Heartbreak ) show
-31.5 514.3 moveto
-12 f2
-(1986:) show
-59.4 514.3 moveto
-12 f0
-( Home of the Brave ) show
-157 514.3 moveto
-12 f2
-(\(live soundtrack\)) show
-238.6 514.3 moveto
-12 f0
-( ) show
-31.5 501 moveto
-12 f2
-(1995:) show
-59.4 501 moveto
-12 f0
-( Bright Red ) show
-298.1 568 moveto
-12 f2
-(UBL Card: ) show
-355.4 568 moveto
-12 f0
-(1494) show
-379.4 568 moveto
-12 f0
-( ) show
-298.1 554.7 moveto
-12 f2
-(See also: ) show
-344.7 554.7 moveto
-12 f0
-(www.voyagerco.com) show
-447.3 554.7 moveto
-12 f0
-( ) show
-298.1 541.4 moveto
-12 f2
-(See also: ) show
-344.7 541.4 moveto
-12 f0
-(www.netpart.com) show
-430.6 541.4 moveto
-12 f0
-( ) show
-298.1 528.1 moveto
-12 f2
-(See also: ) show
-344.7 528.1 moveto
-12 f0
-(www.c3.lanl.gov) show
-427 528.1 moveto
-12 f0
-( ) show
-18.1 488.3 moveto
-3.3 3.3 c fill
-31.5 480.2 moveto
-12 f1
-(Ant, Adam) show
-88.1 480.2 moveto
-12 f0
-( ) show
-31.5 466.9 moveto
-12 f2
-(1980:) show
-59.4 466.9 moveto
-12 f0
-( Kings of the Wild Frontier ) show
-31.5 453.6 moveto
-12 f2
-(1981:) show
-59.4 453.6 moveto
-12 f0
-( Prince Charming ) show
-31.5 440.3 moveto
-12 f2
-(1982:) show
-59.4 440.3 moveto
-12 f0
-( Friend or Foe ) show
-31.5 427 moveto
-12 f2
-(1983:) show
-59.4 427 moveto
-12 f0
-( Dirk Wears White Sox ) show
-31.5 413.7 moveto
-12 f2
-(1985:) show
-59.4 413.7 moveto
-12 f0
-( Viva Le Rock ) show
-31.5 400.4 moveto
-12 f2
-(1979-1986:) show
-87.4 400.4 moveto
-12 f0
-( Antics in the Forbidden Zone ) show
-234.7 400.4 moveto
-12 f2
-(\(comp\)) show
-268.6 400.4 moveto
-12 f0
-( ) show
-298.1 480.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 480.7 moveto
-12 f0
-(1205) show
-379.4 480.7 moveto
-12 f0
-( ) show
-298.1 467.4 moveto
-12 f2
-(See also: ) show
-344.7 467.4 moveto
-12 f0
-(www.uhs.uga.edu) show
-431 467.4 moveto
-12 f0
-( ) show
-298.1 454.1 moveto
-12 f2
-(See also: ) show
-344.7 454.1 moveto
-12 f0
-(caprec.com) show
-399.6 454.1 moveto
-12 f0
-( ) show
-18.1 387.7 moveto
-3.3 3.3 c fill
-31.5 379.6 moveto
-12 f1
-(Anthrax) show
-74.8 379.6 moveto
-12 f0
-( ) show
-31.5 366.3 moveto
-12 f2
-(1991:) show
-59.4 366.3 moveto
-12 f0
-( Attack of the Killer B's ) show
-178.7 366.3 moveto
-12 f2
-(\(comp\)) show
-212.6 366.3 moveto
-12 f0
-( ) show
-298.1 380.1 moveto
-12 f2
-(UBL Card: ) show
-355.4 380.1 moveto
-12 f0
-(2710) show
-379.4 380.1 moveto
-12 f0
-( ) show
-18.1 353.6 moveto
-3.3 3.3 c fill
-31.5 345.5 moveto
-12 f1
-(Aphex Twin) show
-94.5 345.5 moveto
-12 f0
-( ) show
-31.5 332.2 moveto
-12 f2
-(1993:) show
-59.4 332.2 moveto
-12 f0
-( On ) show
-80 332.2 moveto
-12 f2
-(\(EP\)) show
-102.6 332.2 moveto
-12 f0
-( ) show
-31.5 318.9 moveto
-12 f2
-(1994:) show
-59.4 318.9 moveto
-12 f0
-( Analogue Bubblebath ) show
-170.3 318.9 moveto
-12 f2
-(\(EP\)) show
-192.9 318.9 moveto
-12 f0
-( ) show
-31.5 305.6 moveto
-12 f2
-(1995:) show
-59.4 305.6 moveto
-12 f0
-( Ventolin ) show
-107.4 305.6 moveto
-12 f2
-(\(EP\)) show
-130 305.6 moveto
-12 f0
-( ) show
-298.1 346 moveto
-12 f2
-(UBL Card: ) show
-355.4 346 moveto
-12 f0
-(5279) show
-379.4 346 moveto
-12 f0
-( ) show
-298.1 332.7 moveto
-12 f2
-(See also: ) show
-344.7 332.7 moveto
-12 f0
-(hyperreal.com) show
-413.6 332.7 moveto
-12 f0
-( ) show
-298.1 319.4 moveto
-12 f2
-(See also: ) show
-344.7 319.4 moveto
-12 f0
-(pathfinder.com) show
-417.6 319.4 moveto
-12 f0
-( ) show
-18.1 292.9 moveto
-3.3 3.3 c fill
-31.5 284.8 moveto
-12 f1
-(Arcadia) show
-72.8 284.8 moveto
-12 f0
-( ) show
-31.5 271.5 moveto
-12 f2
-(1985:) show
-59.4 271.5 moveto
-12 f0
-( So Red the Rose ) show
-298.1 285.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 285.3 moveto
-12 f0
-(1259) show
-379.4 285.3 moveto
-12 f0
-( ) show
-18.1 258.8 moveto
-3.3 3.3 c fill
-31.5 250.7 moveto
-12 f1
-(Armageddon Dildos) show
-134.5 250.7 moveto
-12 f0
-( ) show
-31.5 237.4 moveto
-12 f2
-(1995:) show
-59.4 237.4 moveto
-12 f0
-( Lost ) show
-305.3 251.2 moveto
-12 f2
-(UBL Card: ) show
-362.6 251.2 moveto
-12 f0
-(2538) show
-386.6 251.2 moveto
-12 f0
-( ) show
-18.1 224.7 moveto
-3.3 3.3 c fill
-31.5 216.6 moveto
-12 f1
-(Ash, Daniel) show
-90.8 216.6 moveto
-12 f0
-( ) show
-31.5 203.3 moveto
-12 f2
-(1991:) show
-59.4 203.3 moveto
-12 f0
-( Coming Down ) show
-31.5 190 moveto
-12 f2
-(1992:) show
-59.4 190 moveto
-12 f0
-( Foolish Thing Desire ) show
-298.1 217.1 moveto
-12 f2
-(See also: ) show
-344.7 217.1 moveto
-12 f0
-(isvpc146.isv.uit.no) show
-435.7 217.1 moveto
-12 f0
-( ) show
-18.1 177.3 moveto
-3.3 3.3 c fill
-31.5 169.2 moveto
-12 f1
-(Archangel, Nathalie) show
-134.1 169.2 moveto
-12 f0
-( ) show
-31.5 155.9 moveto
-12 f2
-(1992:) show
-59.4 155.9 moveto
-12 f0
-( Owl ) show
-18.1 143.2 moveto
-3.3 3.3 c fill
-31.5 135.1 moveto
-12 f1
-(Art of Noise) show
-93.4 135.1 moveto
-12 f0
-( ) show
-31.5 121.8 moveto
-12 f2
-(1983:) show
-59.4 121.8 moveto
-12 f0
-( Who's Afraid of the Art of Noise? ) show
-31.5 108.5 moveto
-12 f2
-(1983:) show
-59.4 108.5 moveto
-12 f0
-( The Art of Noise Have Closed Up ) show
-31.5 95.2 moveto
-12 f2
-(1983:) show
-59.4 95.2 moveto
-12 f0
-( Beatbox ) show
-31.5 81.9 moveto
-12 f2
-(1983:) show
-59.4 81.9 moveto
-12 f0
-( Daft ) show
-298.1 135.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 135.6 moveto
-12 f0
-(1918) show
-379.4 135.6 moveto
-12 f0
-( ) show
-298.1 122.3 moveto
-12 f2
-(See also: ) show
-344.7 122.3 moveto
-12 f0
-(rt66.com) show
-387.6 122.3 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 3 3
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1984:) show
-59.4 709.2 moveto
-12 f0
-( Edited ) show
-96.7 709.2 moveto
-12 f2
-(\(picture disc\)) show
-161 709.2 moveto
-12 f0
-( ) show
-18.1 696.5 moveto
-3.3 3.3 c fill
-31.5 688.4 moveto
-12 f1
-(Attrition) show
-76.8 688.4 moveto
-12 f0
-( ) show
-31.5 675.1 moveto
-12 f2
-(1985:) show
-59.4 675.1 moveto
-12 f0
-( Smiling, at the Hypogonder Club ) show
-225 675.1 moveto
-12 f2
-(\(comp\)) show
-258.9 675.1 moveto
-12 f0
-( ) show
-298.1 688.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 688.9 moveto
-12 f0
-(4232) show
-379.4 688.9 moveto
-12 f0
-( ) show
-298.1 675.6 moveto
-12 f2
-(See also: ) show
-344.7 675.6 moveto
-12 f0
-(www.projekt.com) show
-431.3 675.6 moveto
-12 f0
-( ) show
-18.1 662.4 moveto
-3.3 3.3 c fill
-31.5 654.3 moveto
-12 f1
-(AUTECHRe) show
-96.8 654.3 moveto
-12 f0
-( ) show
-31.5 641 moveto
-12 f2
-(1994:) show
-59.4 641 moveto
-12 f0
-( INCUNABULA ) show
-31.5 627.7 moveto
-12 f2
-(1994:) show
-59.4 627.7 moveto
-12 f0
-( BASSCAD,EP ) show
-137.7 627.7 moveto
-12 f2
-(\(EP\)) show
-160.3 627.7 moveto
-12 f0
-( ) show
-31.5 614.4 moveto
-12 f2
-(1994:) show
-59.4 614.4 moveto
-12 f0
-( Amber ) show
-31.5 601.1 moveto
-12 f2
-(1995:) show
-59.4 601.1 moveto
-12 f0
-( Garbage ) show
-18.1 588.4 moveto
-3.3 3.3 c fill
-31.5 580.3 moveto
-12 f1
-(B52's) show
-60.1 580.3 moveto
-12 f0
-( ) show
-31.5 567 moveto
-12 f2
-(1979:) show
-59.4 567 moveto
-12 f0
-( B52's ) show
-31.5 553.7 moveto
-12 f2
-(1980:) show
-59.4 553.7 moveto
-12 f0
-( Wild Planet ) show
-31.5 540.4 moveto
-12 f2
-(1982:) show
-59.4 540.4 moveto
-12 f0
-( Mesopotamia ) show
-31.5 527.1 moveto
-12 f2
-(1983:) show
-59.4 527.1 moveto
-12 f0
-( Whammy! ) show
-31.5 513.8 moveto
-12 f2
-(1981:) show
-59.4 513.8 moveto
-12 f0
-( Party Mix ) show
-305.7 580.8 moveto
-12 f2
-(UBL Card: ) show
-363 580.8 moveto
-12 f0
-(2268) show
-387 580.8 moveto
-12 f0
-( ) show
-18.1 501.1 moveto
-3.3 3.3 c fill
-31.5 493 moveto
-12 f1
-(Babes in Toyland) show
-120.8 493 moveto
-12 f0
-( ) show
-31.5 479.7 moveto
-12 f2
-(1989:) show
-59.4 479.7 moveto
-12 f0
-( Spanking Machine ) show
-31.5 466.4 moveto
-12 f2
-(1991:) show
-59.4 466.4 moveto
-12 f0
-( To Mother ) show
-31.5 453.1 moveto
-12 f2
-(1992:) show
-59.4 453.1 moveto
-12 f0
-( Fontanelle ) show
-31.5 439.8 moveto
-12 f2
-(1993:) show
-59.4 439.8 moveto
-12 f0
-( Pain Killers ) show
-31.5 426.5 moveto
-12 f2
-(1995:) show
-59.4 426.5 moveto
-12 f0
-( Nemesisters ) show
-302.9 493.5 moveto
-12 f2
-(UBL Card: ) show
-360.2 493.5 moveto
-12 f0
-(3190) show
-384.2 493.5 moveto
-12 f0
-( ) show
-18.1 413.8 moveto
-3.3 3.3 c fill
-31.5 405.7 moveto
-12 f1
-(Battery) show
-70.1 405.7 moveto
-12 f0
-( ) show
-31.5 392.4 moveto
-12 f2
-(1992:) show
-59.4 392.4 moveto
-12 f0
-( Meat Market ) show
-127.7 392.4 moveto
-12 f2
-(\(EP\)) show
-150.3 392.4 moveto
-12 f0
-( ) show
-31.5 379.1 moveto
-12 f2
-(1993:) show
-59.4 379.1 moveto
-12 f0
-( Mutate ) show
-31.5 365.8 moveto
-12 f2
-(1994:) show
-59.4 365.8 moveto
-12 f0
-( Lillith 3.2 ) show
-113.4 365.8 moveto
-12 f2
-(\(EP\)) show
-136 365.8 moveto
-12 f0
-( ) show
-31.5 352.5 moveto
-12 f2
-(1995:) show
-59.4 352.5 moveto
-12 f0
-( nv ) show
-18.1 339.8 moveto
-3.3 3.3 c fill
-31.5 331.7 moveto
-12 f1
-(Bauhaus) show
-76.1 331.7 moveto
-12 f0
-( ) show
-31.5 318.4 moveto
-12 f2
-(1979:) show
-59.4 318.4 moveto
-12 f0
-( Bela Lugosi's Dead ) show
-160.7 318.4 moveto
-12 f2
-(\(EP\)) show
-183.3 318.4 moveto
-12 f0
-( ) show
-31.5 305.1 moveto
-12 f2
-(1981:) show
-59.4 305.1 moveto
-12 f0
-( In the Flat Field ) show
-31.5 291.8 moveto
-12 f2
-(1981:) show
-59.4 291.8 moveto
-12 f0
-( Mask ) show
-31.5 278.5 moveto
-12 f2
-(1981:) show
-59.4 278.5 moveto
-12 f0
-( Press the Eject and Give Me the Tape ) show
-246.3 278.5 moveto
-12 f2
-(\(live\)) show
-271.6 278.5 moveto
-12 f0
-( ) show
-31.5 265.2 moveto
-12 f2
-(1983:) show
-59.4 265.2 moveto
-12 f0
-( Burning from the Inside ) show
-31.5 251.9 moveto
-12 f2
-(1979-1984:) show
-87.4 251.9 moveto
-12 f0
-( 1979-1984 ) show
-145.3 251.9 moveto
-12 f2
-(\(comp\)) show
-179.2 251.9 moveto
-12 f0
-( ) show
-31.5 238.6 moveto
-12 f2
-(1985:) show
-59.4 238.6 moveto
-12 f0
-( The Sky's Gone Out ) show
-31.5 225.3 moveto
-12 f2
-(1984:) show
-59.4 225.3 moveto
-12 f0
-( The Last Temptation ) show
-166 225.3 moveto
-12 f2
-(\(live boot\)) show
-215.6 225.3 moveto
-12 f0
-( ) show
-31.5 212 moveto
-12 f2
-(1984:) show
-59.4 212 moveto
-12 f0
-( Rest In Peace: The Final Concert ) show
-224.3 212 moveto
-12 f2
-(\(double live\)) show
-285.2 212 moveto
-12 f0
-( ) show
-31.5 198.7 moveto
-12 f2
-(1996:) show
-59.4 198.7 moveto
-12 f0
-( The Passion of Covers: A Tribute ) show
-227 198.7 moveto
-12 f2
-(\(various\)) show
-270.9 198.7 moveto
-12 f0
-( ) show
-298.1 332.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 332.2 moveto
-12 f0
-(1235) show
-379.4 332.2 moveto
-12 f0
-( ) show
-298.1 318.9 moveto
-12 f2
-(See also: ) show
-344.7 318.9 moveto
-12 f0
-(gothic.acs.csulb.edu) show
-441.6 318.9 moveto
-12 f0
-( ) show
-298.1 305.6 moveto
-12 f2
-(See also: ) show
-344.7 305.6 moveto
-12 f0
-(isvpc146.isv.uit.no) show
-435.7 305.6 moveto
-12 f0
-( ) show
-18.1 186 moveto
-3.3 3.3 c fill
-31.5 177.9 moveto
-12 f1
-(Belly) show
-57.5 177.9 moveto
-12 f0
-( ) show
-31.5 164.6 moveto
-12 f2
-(1993:) show
-59.4 164.6 moveto
-12 f0
-( Star ) show
-31.5 151.3 moveto
-12 f2
-(1993:) show
-59.4 151.3 moveto
-12 f0
-( Moon ) show
-94 151.3 moveto
-12 f2
-(\(EP\)) show
-116.6 151.3 moveto
-12 f0
-( ) show
-31.5 138 moveto
-12 f2
-(1995:) show
-59.4 138 moveto
-12 f0
-( Baby Silvertooth ) show
-147 138 moveto
-12 f2
-(\(EP\)) show
-169.6 138 moveto
-12 f0
-( ) show
-31.5 124.7 moveto
-12 f2
-(1995:) show
-59.4 124.7 moveto
-12 f0
-( King ) show
-298.1 178.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 178.4 moveto
-12 f0
-(1360) show
-379.4 178.4 moveto
-12 f0
-( ) show
-298.1 165.1 moveto
-12 f2
-(See also: ) show
-344.7 165.1 moveto
-12 f0
-(isvpc146.isv.uit.no) show
-435.7 165.1 moveto
-12 f0
-( ) show
-18.1 112 moveto
-3.3 3.3 c fill
-31.5 103.9 moveto
-12 f1
-(Berlin) show
-63.5 103.9 moveto
-12 f0
-( ) show
-31.5 90.6 moveto
-12 f2
-(1981:) show
-59.4 90.6 moveto
-12 f0
-( Love Life ) show
-31.5 77.3 moveto
-12 f2
-(1981:) show
-59.4 77.3 moveto
-12 f0
-( Dancing in Berlin / Lost in the Crowd ) show
-247.7 77.3 moveto
-12 f2
-(\(single\)) show
-284.3 77.3 moveto
-12 f0
-( ) show
-298.1 104.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 104.4 moveto
-12 f0
-(4156) show
-379.4 104.4 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 4 4
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1982:) show
-59.4 709.2 moveto
-12 f0
-( Pleasure Victim ) show
-31.5 695.9 moveto
-12 f2
-(1986:) show
-59.4 695.9 moveto
-12 f0
-( Count 3 and Pray ) show
-18.1 683.2 moveto
-3.3 3.3 c fill
-31.5 675.1 moveto
-12 f1
-(Big Black) show
-81.1 675.1 moveto
-12 f0
-( ) show
-31.5 661.8 moveto
-12 f2
-(1983:) show
-59.4 661.8 moveto
-12 f0
-( The Hammer Party ) show
-31.5 648.5 moveto
-12 f2
-(1987:) show
-59.4 648.5 moveto
-12 f0
-( Songs About Fucking ) show
-31.5 635.2 moveto
-12 f2
-(1992:) show
-59.4 635.2 moveto
-12 f0
-( The Rich Man's Eight-Track Tape ) show
-231.3 635.2 moveto
-12 f2
-(\(comp\)) show
-265.2 635.2 moveto
-12 f0
-( ) show
-302.7 675.6 moveto
-12 f2
-(UBL Card: ) show
-360 675.6 moveto
-12 f0
-(2410) show
-384 675.6 moveto
-12 f0
-( ) show
-18.1 622.5 moveto
-3.3 3.3 c fill
-31.5 614.4 moveto
-12 f1
-(Big Hat) show
-71.1 614.4 moveto
-12 f0
-( ) show
-31.5 601.1 moveto
-12 f2
-(1993:) show
-59.4 601.1 moveto
-12 f0
-( Selena at my Window ) show
-298.1 614.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 614.9 moveto
-12 f0
-(1217) show
-379.4 614.9 moveto
-12 f0
-( ) show
-298.1 601.6 moveto
-12 f2
-(See also: ) show
-344.7 601.6 moveto
-12 f0
-(www.cec.wustl.edu) show
-439 601.6 moveto
-12 f0
-( ) show
-18.1 588.4 moveto
-3.3 3.3 c fill
-31.5 580.3 moveto
-12 f1
-(Bigod 20) show
-76.5 580.3 moveto
-12 f0
-( ) show
-31.5 567 moveto
-12 f2
-(1990:) show
-59.4 567 moveto
-12 f0
-( The Bog ) show
-107 567 moveto
-12 f2
-(\(EP\)) show
-129.6 567 moveto
-12 f0
-( ) show
-31.5 553.7 moveto
-12 f2
-(1991:) show
-59.4 553.7 moveto
-12 f0
-( Carpe Diem ) show
-123.7 553.7 moveto
-12 f2
-(\(EP\)) show
-146.3 553.7 moveto
-12 f0
-( ) show
-18.1 541 moveto
-3.3 3.3 c fill
-31.5 532.9 moveto
-12 f1
-(Bikini Kill) show
-85.2 532.9 moveto
-12 f0
-( ) show
-31.5 519.6 moveto
-12 f2
-(1991-1992:) show
-87.4 519.6 moveto
-12 f0
-( The C.D. Version of the First Two) show
-31.5 506.3 moveto
-12 f0
-(Records ) show
-298.1 533.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 533.4 moveto
-12 f0
-(4444) show
-379.4 533.4 moveto
-12 f0
-( ) show
-298.1 520.1 moveto
-12 f2
-(See also: ) show
-344.7 520.1 moveto
-12 f0
-(www.columbia.edu) show
-438.6 520.1 moveto
-12 f0
-( ) show
-18.1 493.6 moveto
-3.3 3.3 c fill
-31.5 485.5 moveto
-12 f1
-(Billy Nayer Show, The) show
-146.8 485.5 moveto
-12 f0
-( ) show
-31.5 472.2 moveto
-12 f2
-(1994:) show
-59.4 472.2 moveto
-12 f0
-( The Ketchup and Mustard Man ) show
-18.1 459.5 moveto
-3.3 3.3 c fill
-31.5 451.4 moveto
-12 f1
-(Billy and the Boingers) show
-145.1 451.4 moveto
-12 f0
-( ) show
-31.5 438.1 moveto
-12 f2
-(1987:) show
-59.4 438.1 moveto
-12 f0
-( U Stink but I Love You ) show
-179 438.1 moveto
-12 f2
-(\(flexydisk\)) show
-228.9 438.1 moveto
-12 f0
-( ) show
-18.1 425.4 moveto
-3.3 3.3 c fill
-31.5 417.3 moveto
-12 f1
-(Birdsongs of the Messozoic) show
-169.8 417.3 moveto
-12 f0
-( ) show
-31.5 404 moveto
-12 f2
-(1980-1987:) show
-87.4 404 moveto
-12 f0
-( The Fossil Record ) show
-31.5 390.7 moveto
-12 f2
-(1983:) show
-59.4 390.7 moveto
-12 f0
-( Sonic Geology ) show
-18.1 378 moveto
-3.3 3.3 c fill
-31.5 369.9 moveto
-12 f1
-(Birmingham 6) show
-105.8 369.9 moveto
-12 f0
-( ) show
-31.5 356.6 moveto
-12 f2
-(1995:) show
-59.4 356.6 moveto
-12 f0
-( Police State ) show
-304.5 370.4 moveto
-12 f2
-(UBL Card: ) show
-361.8 370.4 moveto
-12 f0
-(4348) show
-385.8 370.4 moveto
-12 f0
-( ) show
-18.1 343.9 moveto
-3.3 3.3 c fill
-31.5 335.8 moveto
-12 f1
-(Black Tape for a Blue Girl) show
-167.8 335.8 moveto
-12 f0
-( ) show
-31.5 322.5 moveto
-12 f2
-(1986:) show
-59.4 322.5 moveto
-12 f0
-( The Rope ) show
-31.5 309.2 moveto
-12 f2
-(1987:) show
-59.4 309.2 moveto
-12 f0
-( Mesmerized by the Sirens ) show
-31.5 295.9 moveto
-12 f2
-(1989:) show
-59.4 295.9 moveto
-12 f0
-( Ashes in the Brittle Air ) show
-31.5 282.6 moveto
-12 f2
-(1993:) show
-59.4 282.6 moveto
-12 f0
-( This Lush Garden Within ) show
-298.1 336.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 336.3 moveto
-12 f0
-(1202) show
-379.4 336.3 moveto
-12 f0
-( ) show
-298.1 323 moveto
-12 f2
-(See also: ) show
-344.7 323 moveto
-12 f0
-(www.projekt.com) show
-431.3 323 moveto
-12 f0
-( ) show
-18.1 269.9 moveto
-3.3 3.3 c fill
-31.5 261.8 moveto
-12 f1
-(Bleeding Stone, The) show
-133.8 261.8 moveto
-12 f0
-( ) show
-31.5 248.5 moveto
-12 f2
-(1994:) show
-59.4 248.5 moveto
-12 f0
-( Silent Insanity ) show
-135 248.5 moveto
-12 f2
-(\(EP\)) show
-157.6 248.5 moveto
-12 f0
-( ) show
-18.1 235.8 moveto
-3.3 3.3 c fill
-31.5 227.7 moveto
-12 f1
-(Blondie) show
-70.8 227.7 moveto
-12 f0
-( ) show
-31.5 214.4 moveto
-12 f2
-(1980:) show
-59.4 214.4 moveto
-12 f0
-( Autoamerican ) show
-31.5 201.1 moveto
-12 f2
-(1983:) show
-59.4 201.1 moveto
-12 f0
-( Best of Blondie ) show
-306.4 228.2 moveto
-12 f2
-(UBL Card: ) show
-363.7 228.2 moveto
-12 f0
-(2070) show
-387.7 228.2 moveto
-12 f0
-( ) show
-18.1 188.4 moveto
-3.3 3.3 c fill
-31.5 180.3 moveto
-12 f1
-(Blotto) show
-62.8 180.3 moveto
-12 f0
-( ) show
-31.5 167 moveto
-12 f2
-(1994:) show
-59.4 167 moveto
-12 f0
-( Collected Works ) show
-18.1 154.3 moveto
-3.3 3.3 c fill
-31.5 146.2 moveto
-12 f1
-(Body Count) show
-93.1 146.2 moveto
-12 f0
-( ) show
-31.5 132.9 moveto
-12 f2
-(1992:) show
-59.4 132.9 moveto
-12 f0
-( Body Count ) show
-298.1 146.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 146.7 moveto
-12 f0
-(1277) show
-379.4 146.7 moveto
-12 f0
-( ) show
-18.1 120.2 moveto
-3.3 3.3 c fill
-31.5 112.1 moveto
-12 f1
-(Bowie, David) show
-99.5 112.1 moveto
-12 f0
-( ) show
-31.5 98.8 moveto
-12 f2
-(1995:) show
-59.4 98.8 moveto
-12 f0
-( Outside ) show
-298.1 112.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 112.6 moveto
-12 f0
-(1098) show
-379.4 112.6 moveto
-12 f0
-( ) show
-18.1 86.1 moveto
-3.3 3.3 c fill
-31.5 78 moveto
-12 f1
-(Bow Wow Wow) show
-113.4 78 moveto
-12 f0
-( ) show
-300.6 78.5 moveto
-12 f2
-(UBL Card: ) show
-357.9 78.5 moveto
-12 f0
-(2301) show
-381.9 78.5 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 5 5
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1982:) show
-59.4 709.2 moveto
-12 f0
-( See Jungle ) show
-31.5 695.9 moveto
-12 f2
-(1981-1982:) show
-87.4 695.9 moveto
-12 f0
-( I Want Candy ) show
-160.7 695.9 moveto
-12 f2
-(\(comp\)) show
-194.6 695.9 moveto
-12 f0
-( ) show
-31.5 682.6 moveto
-12 f2
-(1983:) show
-59.4 682.6 moveto
-12 f0
-( When the Going Gets Tough ) show
-31.5 669.3 moveto
-12 f2
-(1981-1983:) show
-87.4 669.3 moveto
-12 f0
-( Girl Bites Dog ) show
-164 669.3 moveto
-12 f2
-(\(comp\)) show
-197.9 669.3 moveto
-12 f0
-( ) show
-18.1 656.6 moveto
-3.3 3.3 c fill
-31.5 648.5 moveto
-12 f1
-(Breeders, The) show
-103.4 648.5 moveto
-12 f0
-( ) show
-31.5 635.2 moveto
-12 f2
-(1993:) show
-59.4 635.2 moveto
-12 f0
-( Last Splash ) show
-298.1 649 moveto
-12 f2
-(UBL Card: ) show
-355.4 649 moveto
-12 f0
-(1242) show
-379.4 649 moveto
-12 f0
-( ) show
-298.1 635.7 moveto
-12 f2
-(See also: ) show
-344.7 635.7 moveto
-12 f0
-(isvpc146.isv.uit.no) show
-435.7 635.7 moveto
-12 f0
-( ) show
-18.1 622.5 moveto
-3.3 3.3 c fill
-31.5 614.4 moveto
-12 f1
-(Br\374cken, Claudia) show
-122.1 614.4 moveto
-12 f0
-( ) show
-31.5 601.1 moveto
-12 f2
-(1991:) show
-59.4 601.1 moveto
-12 f0
-( Love and a Million Other Things ) show
-298.1 614.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 614.9 moveto
-12 f0
-(4636) show
-379.4 614.9 moveto
-12 f0
-( ) show
-298.1 601.6 moveto
-12 f2
-(See also: ) show
-344.7 601.6 moveto
-12 f0
-(rt66.com) show
-387.6 601.6 moveto
-12 f0
-( ) show
-298.1 588.3 moveto
-12 f2
-(See also: ) show
-344.7 588.3 moveto
-12 f0
-(hcl.chass.ncsu.edu) show
-433.6 588.3 moveto
-12 f0
-( ) show
-18.1 575.6 moveto
-3.3 3.3 c fill
-31.5 567.5 moveto
-12 f1
-(Buggles, The) show
-97.5 567.5 moveto
-12 f0
-( ) show
-31.5 554.2 moveto
-12 f2
-(1979:) show
-59.4 554.2 moveto
-12 f0
-( The Age of Plastic ) show
-31.5 540.9 moveto
-12 f2
-(1981:) show
-59.4 540.9 moveto
-12 f0
-( Adventures in Modern Recording ) show
-18.1 528.2 moveto
-3.3 3.3 c fill
-31.5 520.1 moveto
-12 f1
-(Bush, Kate) show
-88.1 520.1 moveto
-12 f0
-( ) show
-31.5 506.8 moveto
-12 f2
-(1977:) show
-59.4 506.8 moveto
-12 f0
-( The Kick Inside ) show
-31.5 493.5 moveto
-12 f2
-(1980:) show
-59.4 493.5 moveto
-12 f0
-( Never For Ever ) show
-31.5 480.2 moveto
-12 f2
-(1983:) show
-59.4 480.2 moveto
-12 f0
-( The Dreaming ) show
-31.5 466.9 moveto
-12 f2
-(1985:) show
-59.4 466.9 moveto
-12 f0
-( Hounds of Love ) show
-298.1 520.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 520.6 moveto
-12 f0
-(1032) show
-379.4 520.6 moveto
-12 f0
-( ) show
-298.1 507.3 moveto
-12 f2
-(See also: ) show
-344.7 507.3 moveto
-12 f0
-(actor.cs.vt.edu) show
-414.3 507.3 moveto
-12 f0
-( ) show
-298.1 494 moveto
-12 f2
-(See also: ) show
-344.7 494 moveto
-12 f0
-(www.jrc.flinders.edu.au) show
-460.6 494 moveto
-12 f0
-( ) show
-298.1 480.7 moveto
-12 f2
-(See also: ) show
-344.7 480.7 moveto
-12 f0
-(holly.city.unisa.edu.au) show
-453.3 480.7 moveto
-12 f0
-( ) show
-18.1 454.2 moveto
-3.3 3.3 c fill
-31.5 446.1 moveto
-12 f1
-(Buzzcocks) show
-84.8 446.1 moveto
-12 f0
-( ) show
-31.5 432.8 moveto
-12 f2
-(1976-1979:) show
-87.4 432.8 moveto
-12 f0
-( Operators Manual ) show
-300.6 446.6 moveto
-12 f2
-(UBL Card: ) show
-357.9 446.6 moveto
-12 f0
-(1351) show
-381.9 446.6 moveto
-12 f0
-( ) show
-18.1 420.1 moveto
-3.3 3.3 c fill
-31.5 412 moveto
-12 f1
-(Cabaret Voltaire) show
-118.4 412 moveto
-12 f0
-( ) show
-31.5 398.7 moveto
-12 f2
-(1974-1976:) show
-87.4 398.7 moveto
-12 f0
-( 1974-1976 ) show
-145.3 398.7 moveto
-12 f2
-(\(comp\)) show
-179.2 398.7 moveto
-12 f0
-( ) show
-31.5 385.4 moveto
-12 f2
-(1978-1983:) show
-87.4 385.4 moveto
-12 f0
-( The Golden Moments of CV ) show
-231.3 385.4 moveto
-12 f2
-(\(comp\)) show
-265.2 385.4 moveto
-12 f0
-( ) show
-31.5 372.1 moveto
-12 f2
-(1978:) show
-59.4 372.1 moveto
-12 f0
-( Nag Nag Nag ) show
-131.3 372.1 moveto
-12 f2
-(\(EP\)) show
-153.9 372.1 moveto
-12 f0
-( ) show
-31.5 358.8 moveto
-12 f2
-(1979:) show
-59.4 358.8 moveto
-12 f0
-( Mix-Up ) show
-104 358.8 moveto
-12 f2
-(\(EP\)) show
-126.6 358.8 moveto
-12 f0
-( ) show
-31.5 345.5 moveto
-12 f2
-(1980:) show
-59.4 345.5 moveto
-12 f0
-( Red Mecca ) show
-31.5 332.2 moveto
-12 f2
-(1981:) show
-59.4 332.2 moveto
-12 f0
-( The Voice of America ) show
-31.5 318.9 moveto
-12 f2
-(1981:) show
-59.4 318.9 moveto
-12 f0
-( Johnny Yesno ) show
-133.7 318.9 moveto
-12 f2
-(\(soundtrack\)) show
-195 318.9 moveto
-12 f0
-( ) show
-31.5 305.6 moveto
-12 f2
-(1982:) show
-59.4 305.6 moveto
-12 f0
-( 2X45 ) show
-31.5 292.3 moveto
-12 f2
-(1982:) show
-59.4 292.3 moveto
-12 f0
-( Eight Crepescule Tracks ) show
-31.5 279 moveto
-12 f2
-(1983:) show
-59.4 279 moveto
-12 f0
-( The Crackdown ) show
-31.5 265.7 moveto
-12 f2
-(1984:) show
-59.4 265.7 moveto
-12 f0
-( Micro-Phonies ) show
-31.5 252.4 moveto
-12 f2
-(1985:) show
-59.4 252.4 moveto
-12 f0
-( I Want You ) show
-122 252.4 moveto
-12 f2
-(\(single\)) show
-158.6 252.4 moveto
-12 f0
-( ) show
-31.5 239.1 moveto
-12 f2
-(1985:) show
-59.4 239.1 moveto
-12 f0
-( Drinking Gasoline ) show
-31.5 225.8 moveto
-12 f2
-(1985:) show
-59.4 225.8 moveto
-12 f0
-( The Arm of the Lord ) show
-31.5 212.5 moveto
-12 f2
-(1985:) show
-59.4 212.5 moveto
-12 f0
-( The Convenant, the Sword, and the Arm of the) show
-31.5 199.2 moveto
-12 f0
-(Lord ) show
-31.5 185.9 moveto
-12 f2
-(1986:) show
-59.4 185.9 moveto
-12 f0
-( The Drain Train ) show
-31.5 172.6 moveto
-12 f2
-(1987:) show
-59.4 172.6 moveto
-12 f0
-( Code ) show
-31.5 159.3 moveto
-12 f2
-(1990:) show
-59.4 159.3 moveto
-12 f0
-( Listen Up ) show
-113 159.3 moveto
-12 f2
-(\(double comp\)) show
-182.6 159.3 moveto
-12 f0
-( ) show
-31.5 146 moveto
-12 f2
-(1991:) show
-59.4 146 moveto
-12 f0
-( Body and Soul ) show
-31.5 132.7 moveto
-12 f2
-(1991:) show
-59.4 132.7 moveto
-12 f0
-( Colors ) show
-31.5 119.4 moveto
-12 f2
-(1992:) show
-59.4 119.4 moveto
-12 f0
-( Plasticity ) show
-31.5 106.1 moveto
-12 f2
-(1992:) show
-59.4 106.1 moveto
-12 f0
-( Western Reworks ) show
-306.4 412.5 moveto
-12 f2
-(UBL Card: ) show
-363.7 412.5 moveto
-12 f0
-(2307) show
-387.7 412.5 moveto
-12 f0
-( ) show
-18.1 93.4 moveto
-3.3 3.3 c fill
-31.5 85.3 moveto
-12 f1
-(Cave, Nick) show
-87.4 85.3 moveto
-12 f0
-( ) show
-298.1 85.8 moveto
-12 f2
-(UBL Card: ) show
-355.4 85.8 moveto
-12 f0
-(1273) show
-379.4 85.8 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 6 6
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1984:) show
-59.4 709.2 moveto
-12 f0
-( From Her to Eternity ) show
-31.5 695.9 moveto
-12 f2
-(1988:) show
-59.4 695.9 moveto
-12 f0
-( Tender Prey ) show
-18.1 683.2 moveto
-3.3 3.3 c fill
-31.5 675.1 moveto
-12 f1
-(Chemlab) show
-78.1 675.1 moveto
-12 f0
-( ) show
-31.5 661.8 moveto
-12 f2
-(1993:) show
-59.4 661.8 moveto
-12 f0
-( Burnout at the Hydrogen Bar ) show
-31.5 648.5 moveto
-12 f2
-(1994:) show
-59.4 648.5 moveto
-12 f0
-( Magnetic Field Remixes ) show
-183.3 648.5 moveto
-12 f2
-(\(EP\)) show
-205.9 648.5 moveto
-12 f0
-( ) show
-298.6 675.6 moveto
-12 f2
-(UBL Card: ) show
-355.9 675.6 moveto
-12 f0
-(3774) show
-379.9 675.6 moveto
-12 f0
-( ) show
-18.1 635.8 moveto
-3.3 3.3 c fill
-31.5 627.7 moveto
-12 f1
-(Children on Stun) show
-120.1 627.7 moveto
-12 f0
-( ) show
-31.5 614.4 moveto
-12 f2
-(1994:) show
-59.4 614.4 moveto
-12 f0
-( Tourniquets of Love's Desire ) show
-18.1 601.7 moveto
-3.3 3.3 c fill
-31.5 593.6 moveto
-12 f1
-(Christian Death) show
-113.8 593.6 moveto
-12 f0
-( ) show
-31.5 580.3 moveto
-12 f2
-(1982:) show
-59.4 580.3 moveto
-12 f0
-( Only Theatre of Pain ) show
-31.5 567 moveto
-12 f2
-(1988:) show
-59.4 567 moveto
-12 f0
-( Sex and Drugs and Jesus Christ ) show
-31.5 553.7 moveto
-12 f2
-(1989:) show
-59.4 553.7 moveto
-12 f0
-( All the Love All the Hate part Two: All the) show
-31.5 540.4 moveto
-12 f0
-(Hate ) show
-31.5 527.1 moveto
-12 f2
-(1994:) show
-59.4 527.1 moveto
-12 f0
-( Sexy Death God ) show
-298.1 594.1 moveto
-12 f2
-(UBL Card: ) show
-355.4 594.1 moveto
-12 f0
-(1218) show
-379.4 594.1 moveto
-12 f0
-( ) show
-298.1 581 moveto
-12 f2
-(See also:) show
-298.1 567.7 moveto
-12 f0
-(christian-death.acc.brad.ac.uk) show
-441.4 567.7 moveto
-12 f0
-( ) show
-18.1 514.4 moveto
-3.3 3.3 c fill
-31.5 506.3 moveto
-12 f1
-(Chris and Cosey) show
-116.1 506.3 moveto
-12 f0
-( ) show
-31.5 493 moveto
-12 f2
-(1989:) show
-59.4 493 moveto
-12 f0
-( Trust ) show
-18.1 480.3 moveto
-3.3 3.3 c fill
-31.5 472.2 moveto
-12 f1
-(Ciccone Youth) show
-107.1 472.2 moveto
-12 f0
-( ) show
-31.5 458.9 moveto
-12 f2
-(1988:) show
-59.4 458.9 moveto
-12 f0
-( The Whitey Album ) show
-298.1 472.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 472.7 moveto
-12 f0
-(1087) show
-379.4 472.7 moveto
-12 f0
-( ) show
-18.1 446.2 moveto
-3.3 3.3 c fill
-31.5 438.1 moveto
-12 f1
-(ClockDVA) show
-87.4 438.1 moveto
-12 f0
-( ) show
-31.5 424.8 moveto
-12 f2
-(1981:) show
-59.4 424.8 moveto
-12 f0
-( Thirst ) show
-31.5 411.5 moveto
-12 f2
-(1988:) show
-59.4 411.5 moveto
-12 f0
-( The Hacker/The Act ) show
-302.2 438.6 moveto
-12 f2
-(UBL Card: ) show
-359.5 438.6 moveto
-12 f0
-(3999) show
-383.5 438.6 moveto
-12 f0
-( ) show
-18.1 398.8 moveto
-3.3 3.3 c fill
-31.5 390.7 moveto
-12 f1
-(Cocteau Twins) show
-107.8 390.7 moveto
-12 f0
-( ) show
-31.5 377.4 moveto
-12 f2
-(1982:) show
-59.4 377.4 moveto
-12 f0
-( Garlands ) show
-31.5 364.1 moveto
-12 f2
-(1983:) show
-59.4 364.1 moveto
-12 f0
-( Head over Heels ) show
-31.5 350.8 moveto
-12 f2
-(1984:) show
-59.4 350.8 moveto
-12 f0
-( The Spangle Maker ) show
-160 350.8 moveto
-12 f2
-(\(EP\)) show
-182.6 350.8 moveto
-12 f0
-( ) show
-31.5 337.5 moveto
-12 f2
-(1984:) show
-59.4 337.5 moveto
-12 f0
-( Treasure ) show
-31.5 324.2 moveto
-12 f2
-(1985:) show
-59.4 324.2 moveto
-12 f0
-( Aikea-Guinea ) show
-132.7 324.2 moveto
-12 f2
-(\(EP\)) show
-155.3 324.2 moveto
-12 f0
-( ) show
-31.5 310.9 moveto
-12 f2
-(1985:) show
-59.4 310.9 moveto
-12 f0
-( Echoes in a Shallow Bay ) show
-31.5 297.6 moveto
-12 f2
-(1985:) show
-59.4 297.6 moveto
-12 f0
-( Tiny Dynamine ) show
-141 297.6 moveto
-12 f2
-(\(EP\)) show
-163.6 297.6 moveto
-12 f0
-( ) show
-31.5 284.3 moveto
-12 f2
-(1982-1985:) show
-87.4 284.3 moveto
-12 f0
-( The Pink Opaque ) show
-298.1 391.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 391.2 moveto
-12 f0
-(1074) show
-379.4 391.2 moveto
-12 f0
-( ) show
-298.1 377.9 moveto
-12 f2
-(See also: ) show
-344.7 377.9 moveto
-12 f0
-(garnet.berkeley.edu) show
-439.3 377.9 moveto
-12 f0
-( ) show
-298.1 364.6 moveto
-12 f2
-(See also: ) show
-344.7 364.6 moveto
-12 f0
-(isvpc146.isv.uit.no) show
-435.7 364.6 moveto
-12 f0
-( ) show
-18.1 271.6 moveto
-3.3 3.3 c fill
-31.5 263.5 moveto
-12 f1
-(Coil) show
-52.8 263.5 moveto
-12 f0
-( ) show
-31.5 250.2 moveto
-12 f2
-(1986?:) show
-65.4 250.2 moveto
-12 f0
-( The Angelic Conversation ) show
-198 250.2 moveto
-12 f2
-(\(soundtrack\)) show
-259.3 250.2 moveto
-12 f0
-( ) show
-31.5 236.9 moveto
-12 f2
-(1988:) show
-59.4 236.9 moveto
-12 f0
-( Gold is the Metal ) show
-31.5 223.6 moveto
-12 f2
-(1990:) show
-59.4 223.6 moveto
-12 f0
-( The Unreleased Themes for Hellraiser ) show
-249.3 223.6 moveto
-12 f2
-(\(EP\)) show
-271.9 223.6 moveto
-12 f0
-( ) show
-31.5 210.3 moveto
-12 f2
-(1990:) show
-59.4 210.3 moveto
-12 f0
-( Panic / Tainted Love ) show
-165.7 210.3 moveto
-12 f2
-(\(single\)) show
-202.3 210.3 moveto
-12 f0
-( ) show
-31.5 197 moveto
-12 f2
-(1991:) show
-59.4 197 moveto
-12 f0
-( Out of Light Cometh Darkness ) show
-31.5 183.7 moveto
-12 f2
-(1992:) show
-59.4 183.7 moveto
-12 f0
-( Snow ) show
-92.7 183.7 moveto
-12 f2
-(\(EP\)) show
-115.3 183.7 moveto
-12 f0
-( ) show
-305.2 264 moveto
-12 f2
-(UBL Card: ) show
-362.5 264 moveto
-12 f0
-(1388) show
-386.5 264 moveto
-12 f0
-( ) show
-18.1 171 moveto
-3.3 3.3 c fill
-31.5 162.9 moveto
-12 f1
-(Concrete Blonde) show
-117.1 162.9 moveto
-12 f0
-( ) show
-31.5 149.6 moveto
-12 f2
-(1986:) show
-59.4 149.6 moveto
-12 f0
-( Concrete Blonde ) show
-31.5 136.3 moveto
-12 f2
-(1989:) show
-59.4 136.3 moveto
-12 f0
-( Free ) show
-31.5 123 moveto
-12 f2
-(1990:) show
-59.4 123 moveto
-12 f0
-( Bloodletting ) show
-31.5 109.7 moveto
-12 f2
-(1993:) show
-59.4 109.7 moveto
-12 f0
-( Walking in London ) show
-159.3 109.7 moveto
-12 f2
-(\(single\)) show
-195.9 109.7 moveto
-12 f0
-( ) show
-31.5 96.4 moveto
-12 f2
-(1993:) show
-59.4 96.4 moveto
-12 f0
-( Mexican Moon ) show
-303.5 163.4 moveto
-12 f2
-(UBL Card: ) show
-360.8 163.4 moveto
-12 f0
-(1396) show
-384.8 163.4 moveto
-12 f0
-( ) show
-18.1 83.7 moveto
-3.3 3.3 c fill
-31.5 75.6 moveto
-12 f1
-(Cop Shoot Cop) show
-109.5 75.6 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 7 7
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1993:) show
-59.4 709.2 moveto
-12 f0
-( Ask Questions Later ) show
-18.1 696.5 moveto
-3.3 3.3 c fill
-31.5 688.4 moveto
-12 f1
-(Course of Empire) show
-122.8 688.4 moveto
-12 f0
-( ) show
-31.5 675.1 moveto
-12 f2
-(1990:) show
-59.4 675.1 moveto
-12 f0
-( Course of Empire ) show
-31.5 661.8 moveto
-12 f2
-(1993:) show
-59.4 661.8 moveto
-12 f0
-( Infested! ) show
-108 661.8 moveto
-12 f2
-(\(EP\)) show
-130.6 661.8 moveto
-12 f0
-( ) show
-31.5 648.5 moveto
-12 f2
-(1994:) show
-59.4 648.5 moveto
-12 f0
-( Initiation ) show
-298.1 688.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 688.9 moveto
-12 f0
-(2889) show
-379.4 688.9 moveto
-12 f0
-( ) show
-298.1 675.6 moveto
-12 f2
-(See also: ) show
-344.7 675.6 moveto
-12 f0
-(homepage.seas.upenn.edu) show
-469.6 675.6 moveto
-12 f0
-( ) show
-18.1 635.8 moveto
-3.3 3.3 c fill
-31.5 627.7 moveto
-12 f1
-(Cranes) show
-68.1 627.7 moveto
-12 f0
-( ) show
-31.5 614.4 moveto
-12 f2
-(1990:) show
-59.4 614.4 moveto
-12 f0
-( Inescapable ) show
-122 614.4 moveto
-12 f2
-(\(EP\)) show
-144.6 614.4 moveto
-12 f0
-( ) show
-31.5 601.1 moveto
-12 f2
-(1991:) show
-59.4 601.1 moveto
-12 f0
-( Wings of Joy ) show
-31.5 587.8 moveto
-12 f2
-(1992:) show
-59.4 587.8 moveto
-12 f0
-( Self-Non-Self ) show
-31.5 574.5 moveto
-12 f2
-(1993:) show
-59.4 574.5 moveto
-12 f0
-( Forever ) show
-31.5 561.2 moveto
-12 f2
-(1993:) show
-59.4 561.2 moveto
-12 f0
-( Jewel ) show
-92.7 561.2 moveto
-12 f2
-(\(EP\)) show
-115.3 561.2 moveto
-12 f0
-( ) show
-31.5 547.9 moveto
-12 f2
-(1994:) show
-59.4 547.9 moveto
-12 f0
-( Loved ) show
-31.5 534.6 moveto
-12 f2
-(1994:) show
-59.4 534.6 moveto
-12 f0
-( Shining Road ) show
-131 534.6 moveto
-12 f2
-(\(limited edition double EP\)) show
-261.9 534.6 moveto
-12 f0
-( ) show
-298.1 628.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 628.2 moveto
-12 f0
-(2400) show
-379.4 628.2 moveto
-12 f0
-( ) show
-298.1 614.9 moveto
-12 f2
-(See also: ) show
-344.7 614.9 moveto
-12 f0
-(busop.cit.wayne.edu) show
-443 614.9 moveto
-12 f0
-( ) show
-18.1 521.9 moveto
-3.3 3.3 c fill
-31.5 513.8 moveto
-12 f1
-(Crash Worship) show
-110.5 513.8 moveto
-12 f0
-( ) show
-31.5 500.5 moveto
-12 f2
-(1992:) show
-59.4 500.5 moveto
-12 f0
-( ADRV ) show
-298.1 514.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 514.3 moveto
-12 f0
-(1901) show
-379.4 514.3 moveto
-12 f0
-( ) show
-298.1 501 moveto
-12 f2
-(See also: ) show
-344.7 501 moveto
-12 f0
-(www.meer.net) show
-415.3 501 moveto
-12 f0
-( ) show
-298.1 487.7 moveto
-12 f2
-(See also: ) show
-344.7 487.7 moveto
-12 f0
-(www.tyrell.net) show
-416.7 487.7 moveto
-12 f0
-( ) show
-18.1 475 moveto
-3.3 3.3 c fill
-31.5 466.9 moveto
-12 f1
-(Creatures, The) show
-108.8 466.9 moveto
-12 f0
-( ) show
-31.5 453.6 moveto
-12 f2
-(1983:) show
-59.4 453.6 moveto
-12 f0
-( Feast ) show
-31.5 440.3 moveto
-12 f2
-(1990:) show
-59.4 440.3 moveto
-12 f0
-( Boomerang ) show
-31.5 427 moveto
-12 f2
-(1990:) show
-59.4 427 moveto
-12 f0
-( Fury Eyes ) show
-114.3 427 moveto
-12 f2
-(\(EP\)) show
-136.9 427 moveto
-12 f0
-( ) show
-31.5 413.7 moveto
-12 f2
-(1990:) show
-59.4 413.7 moveto
-12 f0
-( Standing There ) show
-139 413.7 moveto
-12 f2
-(\(single\)) show
-175.6 413.7 moveto
-12 f0
-( ) show
-301.8 467.4 moveto
-12 f2
-(UBL Card: ) show
-359.1 467.4 moveto
-12 f0
-(1216) show
-383.1 467.4 moveto
-12 f0
-( ) show
-18.1 401 moveto
-3.3 3.3 c fill
-31.5 392.9 moveto
-12 f1
-(Cure, The) show
-83.4 392.9 moveto
-12 f0
-( ) show
-31.5 379.6 moveto
-12 f2
-(1980:) show
-59.4 379.6 moveto
-12 f0
-( Boys Don't Cry ) show
-31.5 366.3 moveto
-12 f2
-(1980:) show
-59.4 366.3 moveto
-12 f0
-( Seventeen Seconds ) show
-31.5 353 moveto
-12 f2
-(1981:) show
-59.4 353 moveto
-12 f0
-( Faith ) show
-31.5 339.7 moveto
-12 f2
-(1982:) show
-59.4 339.7 moveto
-12 f0
-( Pornography ) show
-31.5 326.4 moveto
-12 f2
-(1982:) show
-59.4 326.4 moveto
-12 f0
-( The Walk ) show
-31.5 313.1 moveto
-12 f2
-(1982?:) show
-65.4 313.1 moveto
-12 f0
-( Looking for a Forest ) show
-170.3 313.1 moveto
-12 f2
-(\(live boot\)) show
-219.9 313.1 moveto
-12 f0
-( ) show
-31.5 299.8 moveto
-12 f2
-(1983:) show
-59.4 299.8 moveto
-12 f0
-( Japanese Whispers ) show
-31.5 286.5 moveto
-12 f2
-(1983:) show
-59.4 286.5 moveto
-12 f0
-( Lovecats ) show
-108.7 286.5 moveto
-12 f2
-(\(EP\)) show
-131.3 286.5 moveto
-12 f0
-( ) show
-31.5 273.2 moveto
-12 f2
-(1984:) show
-59.4 273.2 moveto
-12 f0
-( Concert ) show
-103.3 273.2 moveto
-12 f2
-(\(live\)) show
-128.6 273.2 moveto
-12 f0
-( ) show
-31.5 259.9 moveto
-12 f2
-(1984:) show
-59.4 259.9 moveto
-12 f0
-( The Top ) show
-31.5 246.6 moveto
-12 f2
-(1985:) show
-59.4 246.6 moveto
-12 f0
-( The Head on the Door ) show
-31.5 233.3 moveto
-12 f2
-(1987:) show
-59.4 233.3 moveto
-12 f0
-( Staring at the Sea ) show
-149.7 233.3 moveto
-12 f2
-(\(comp\)) show
-183.6 233.3 moveto
-12 f0
-( ) show
-31.5 220 moveto
-12 f2
-(1988:) show
-59.4 220 moveto
-12 f0
-( Kiss Me Kiss Me Kiss Me ) show
-31.5 206.7 moveto
-12 f2
-(1989:) show
-59.4 206.7 moveto
-12 f0
-( Disintegration ) show
-31.5 193.4 moveto
-12 f2
-(1989:) show
-59.4 193.4 moveto
-12 f0
-( Fascination Street ) show
-151.7 193.4 moveto
-12 f2
-(\(single\)) show
-188.3 193.4 moveto
-12 f0
-( ) show
-31.5 180.1 moveto
-12 f2
-(1990:) show
-59.4 180.1 moveto
-12 f0
-( Never Enough ) show
-135 180.1 moveto
-12 f2
-(\(single\)) show
-171.6 180.1 moveto
-12 f0
-( ) show
-31.5 166.8 moveto
-12 f2
-(1995?:) show
-65.4 166.8 moveto
-12 f0
-( Give Me the Cure: 18 DC Bands ) show
-228.7 166.8 moveto
-12 f2
-(\(various\)) show
-272.6 166.8 moveto
-12 f0
-( ) show
-298.1 393.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 393.4 moveto
-12 f0
-(1159) show
-379.4 393.4 moveto
-12 f0
-( ) show
-298.1 380.1 moveto
-12 f2
-(See also: ) show
-344.7 380.1 moveto
-12 f0
-(www.acpub.duke.edu) show
-449 380.1 moveto
-12 f0
-( ) show
-298.1 366.8 moveto
-12 f2
-(See also: ) show
-344.7 366.8 moveto
-12 f0
-(pathfinder.com) show
-417.6 366.8 moveto
-12 f0
-( ) show
-18.1 154.1 moveto
-3.3 3.3 c fill
-31.5 146 moveto
-12 f1
-(Current 93) show
-88.4 146 moveto
-12 f0
-( ) show
-31.5 132.7 moveto
-12 f2
-(1986-1991:) show
-87.4 132.7 moveto
-12 f0
-( Island ) show
-300.6 146.5 moveto
-12 f2
-(UBL Card: ) show
-357.9 146.5 moveto
-12 f0
-(3465) show
-381.9 146.5 moveto
-12 f0
-( ) show
-18.1 120 moveto
-3.3 3.3 c fill
-31.5 111.9 moveto
-12 f1
-(Curve) show
-63.4 111.9 moveto
-12 f0
-( ) show
-31.5 98.6 moveto
-12 f2
-(1991:) show
-59.4 98.6 moveto
-12 f0
-( Frozen ) show
-98.7 98.6 moveto
-12 f2
-(\(EP\)) show
-121.3 98.6 moveto
-12 f0
-( ) show
-31.5 85.3 moveto
-12 f2
-(1991:) show
-59.4 85.3 moveto
-12 f0
-( Cherry ) show
-98.7 85.3 moveto
-12 f2
-(\(EP\)) show
-121.3 85.3 moveto
-12 f0
-( ) show
-298.1 112.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 112.4 moveto
-12 f0
-(1355) show
-379.4 112.4 moveto
-12 f0
-( ) show
-298.1 99.1 moveto
-12 f2
-(See also: ) show
-344.7 99.1 moveto
-12 f0
-(quark.stack.urc.tue.nl) show
-448 99.1 moveto
-12 f0
-( ) show
-298.1 85.8 moveto
-12 f2
-(See also: ) show
-344.7 85.8 moveto
-12 f0
-(blade.stack.urc.tue.nl) show
-446.6 85.8 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 8 8
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1992:) show
-59.4 709.2 moveto
-12 f0
-( Doppelganger ) show
-31.5 695.9 moveto
-12 f2
-(1993:) show
-59.4 695.9 moveto
-12 f0
-( Cuckoo ) show
-18.1 683.2 moveto
-3.3 3.3 c fill
-31.5 675.1 moveto
-12 f1
-(Cyber-Tec) show
-86.1 675.1 moveto
-12 f0
-( ) show
-31.5 661.8 moveto
-12 f2
-(1995:) show
-59.4 661.8 moveto
-12 f0
-( Cyber-Tec ) show
-18.1 649.1 moveto
-3.3 3.3 c fill
-31.5 641 moveto
-12 f1
-(Daisy Chainsaw) show
-113.8 641 moveto
-12 f0
-( ) show
-31.5 627.7 moveto
-12 f2
-(1992:) show
-59.4 627.7 moveto
-12 f0
-( Hope All Your Dreams Come True ) show
-235 627.7 moveto
-12 f2
-(\(single\)) show
-271.6 627.7 moveto
-12 f0
-( ) show
-31.5 614.4 moveto
-12 f2
-(1992:) show
-59.4 614.4 moveto
-12 f0
-( Love Sick Pleasure ) show
-158 614.4 moveto
-12 f2
-(\(EP\)) show
-180.6 614.4 moveto
-12 f0
-( ) show
-31.5 601.1 moveto
-12 f2
-(1992:) show
-59.4 601.1 moveto
-12 f0
-( Eleventeen ) show
-31.5 587.8 moveto
-12 f2
-(1994:) show
-59.4 587.8 moveto
-12 f0
-( For They Know Not What They Do ) show
-18.1 575.1 moveto
-3.3 3.3 c fill
-31.5 567 moveto
-12 f1
-(Dance or Die) show
-98.1 567 moveto
-12 f0
-( ) show
-31.5 553.7 moveto
-12 f2
-(1993:) show
-59.4 553.7 moveto
-12 f0
-( Psychoburbia ) show
-18.1 541 moveto
-3.3 3.3 c fill
-31.5 532.9 moveto
-12 f1
-(Danse Society, The) show
-128.4 532.9 moveto
-12 f0
-( ) show
-31.5 519.6 moveto
-12 f2
-(1984:) show
-59.4 519.6 moveto
-12 f0
-( Heaven is Waiting ) show
-31.5 506.3 moveto
-12 f2
-(1986:) show
-59.4 506.3 moveto
-12 f0
-( Looking Through ) show
-18.1 493.6 moveto
-3.3 3.3 c fill
-31.5 485.5 moveto
-12 f1
-(Das Ich) show
-70.5 485.5 moveto
-12 f0
-( ) show
-31.5 472.2 moveto
-12 f2
-(1990:) show
-59.4 472.2 moveto
-12 f0
-( Satanische Verse ) show
-299.9 486 moveto
-12 f2
-(UBL Card: ) show
-357.2 486 moveto
-12 f0
-(2337) show
-381.2 486 moveto
-12 f0
-( ) show
-18.1 459.5 moveto
-3.3 3.3 c fill
-31.5 451.4 moveto
-12 f1
-(Dax, Danielle) show
-100.1 451.4 moveto
-12 f0
-( ) show
-31.5 438.1 moveto
-12 f2
-(1986-1988:) show
-87.4 438.1 moveto
-12 f0
-( Dark Adapted Eye ) show
-182.7 438.1 moveto
-12 f2
-(\(comp +5\)) show
-233.7 438.1 moveto
-12 f0
-( ) show
-31.5 424.8 moveto
-12 f2
-(1988:) show
-59.4 424.8 moveto
-12 f0
-( Whistling for his Love ) show
-174.3 424.8 moveto
-12 f2
-(\(single\)) show
-210.9 424.8 moveto
-12 f0
-( ) show
-31.5 411.5 moveto
-12 f2
-(1988:) show
-59.4 411.5 moveto
-12 f0
-( Cat House ) show
-115.7 411.5 moveto
-12 f2
-(\(single\)) show
-152.3 411.5 moveto
-12 f0
-( ) show
-31.5 398.2 moveto
-12 f2
-(1990:) show
-59.4 398.2 moveto
-12 f0
-( Blast the Human Flower ) show
-31.5 384.9 moveto
-12 f2
-(1992:) show
-59.4 384.9 moveto
-12 f0
-( Pop-Eyes ) show
-31.5 371.6 moveto
-12 f2
-(1995:) show
-59.4 371.6 moveto
-12 f0
-( Timber Tongue ) show
-140.3 371.6 moveto
-12 f2
-(\(EP\)) show
-162.9 371.6 moveto
-12 f0
-( ) show
-300.6 451.9 moveto
-12 f2
-(UBL Card: ) show
-357.9 451.9 moveto
-12 f0
-(1746) show
-381.9 451.9 moveto
-12 f0
-( ) show
-18.1 358.9 moveto
-3.3 3.3 c fill
-31.5 350.8 moveto
-12 f1
-(Death in June) show
-102.8 350.8 moveto
-12 f0
-( ) show
-31.5 337.5 moveto
-12 f2
-(1992:) show
-59.4 337.5 moveto
-12 f0
-( But, What Ends When the Symbols Shatter? ) show
-18.1 324.8 moveto
-3.3 3.3 c fill
-31.5 316.7 moveto
-12 f1
-(Definition FX) show
-101.8 316.7 moveto
-12 f0
-( ) show
-31.5 303.4 moveto
-12 f2
-(1993:) show
-59.4 303.4 moveto
-12 f0
-( Something Inside ) show
-149.7 303.4 moveto
-12 f2
-(\(single\)) show
-186.3 303.4 moveto
-12 f0
-( ) show
-31.5 290.1 moveto
-12 f2
-(1993:) show
-59.4 290.1 moveto
-12 f0
-( Light Speed Collision ) show
-298.1 317.2 moveto
-12 f2
-(See also: ) show
-344.7 317.2 moveto
-12 f0
-(www.geko.com.au) show
-435 317.2 moveto
-12 f0
-( ) show
-18.1 277.4 moveto
-3.3 3.3 c fill
-31.5 269.3 moveto
-12 f1
-(Depeche Mode) show
-107.1 269.3 moveto
-12 f0
-( ) show
-31.5 256 moveto
-12 f2
-(1981:) show
-59.4 256 moveto
-12 f0
-( Speak & Spell ) show
-31.5 242.7 moveto
-12 f2
-(1981:) show
-59.4 242.7 moveto
-12 f0
-( Just Can't Get Enough / Any Second Now) show
-31.5 229.4 moveto
-12 f2
-(\(single\)) show
-68.1 229.4 moveto
-12 f0
-( ) show
-31.5 216.1 moveto
-12 f2
-(1982:) show
-59.4 216.1 moveto
-12 f0
-( A Broken Frame ) show
-31.5 202.8 moveto
-12 f2
-(1982:) show
-59.4 202.8 moveto
-12 f0
-( live singles ) show
-119.7 202.8 moveto
-12 f2
-(\(comp\)) show
-153.6 202.8 moveto
-12 f0
-( ) show
-31.5 189.5 moveto
-12 f2
-(1983:) show
-59.4 189.5 moveto
-12 f0
-( Construction Time Again ) show
-31.5 176.2 moveto
-12 f2
-(1984:) show
-59.4 176.2 moveto
-12 f0
-( People Are People ) show
-154.7 176.2 moveto
-12 f2
-(\(comp +2\)) show
-205.7 176.2 moveto
-12 f0
-( ) show
-31.5 162.9 moveto
-12 f2
-(1984:) show
-59.4 162.9 moveto
-12 f0
-( Some Great Reward ) show
-31.5 149.6 moveto
-12 f2
-(1985:) show
-59.4 149.6 moveto
-12 f0
-( Catching Up With Depeche Mode ) show
-229.3 149.6 moveto
-12 f2
-(\(comp +4\)) show
-280.3 149.6 moveto
-12 f0
-( ) show
-31.5 136.3 moveto
-12 f2
-(1985:) show
-59.4 136.3 moveto
-12 f0
-( It's Called a Heart / Fly on the Windscreen) show
-31.5 123 moveto
-12 f2
-(\(single\)) show
-68.1 123 moveto
-12 f0
-( ) show
-31.5 109.7 moveto
-12 f2
-(1986:) show
-59.4 109.7 moveto
-12 f0
-( Black Celebration ) show
-31.5 96.4 moveto
-12 f2
-(1986:) show
-59.4 96.4 moveto
-12 f0
-( Stripped ) show
-106 96.4 moveto
-12 f2
-(\(single\)) show
-142.6 96.4 moveto
-12 f0
-( ) show
-31.5 83.1 moveto
-12 f2
-(1986:) show
-59.4 83.1 moveto
-12 f0
-( A Question of Lust ) show
-157.7 83.1 moveto
-12 f2
-(\(single\)) show
-194.3 83.1 moveto
-12 f0
-( ) show
-298.1 269.8 moveto
-12 f2
-(UBL Card: ) show
-355.4 269.8 moveto
-12 f0
-(1041) show
-379.4 269.8 moveto
-12 f0
-( ) show
-298.1 256.5 moveto
-12 f2
-(See also: ) show
-344.7 256.5 moveto
-12 f0
-(www.cis.ufl.edu) show
-423.6 256.5 moveto
-12 f0
-( ) show
-298.1 243.2 moveto
-12 f2
-(See also: ) show
-344.7 243.2 moveto
-12 f0
-(www.coma.sbg.ac.at) show
-444.6 243.2 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 9 9
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1989:) show
-59.4 709.2 moveto
-12 f0
-( 101 ) show
-83.4 709.2 moveto
-12 f2
-(\(double live\)) show
-144.3 709.2 moveto
-12 f0
-( ) show
-31.5 695.9 moveto
-12 f2
-(1987:) show
-59.4 695.9 moveto
-12 f0
-( Music for the Masses ) show
-31.5 682.6 moveto
-12 f2
-(1987:) show
-59.4 682.6 moveto
-12 f0
-( Never Let Me Down ) show
-165 682.6 moveto
-12 f2
-(\(single\)) show
-201.6 682.6 moveto
-12 f0
-( ) show
-31.5 669.3 moveto
-12 f2
-(1990:) show
-59.4 669.3 moveto
-12 f0
-( Personal Jesus ) show
-135 669.3 moveto
-12 f2
-(\(single\)) show
-171.6 669.3 moveto
-12 f0
-( ) show
-31.5 656 moveto
-12 f2
-(199?:) show
-59.4 656 moveto
-12 f0
-( I Sometimes Wish I Was Famous: A Swedish) show
-31.5 642.7 moveto
-12 f0
-(Tribute ) show
-69.8 642.7 moveto
-12 f2
-(\(various\)) show
-113.7 642.7 moveto
-12 f0
-( ) show
-18.1 630 moveto
-3.3 3.3 c fill
-31.5 621.9 moveto
-12 f1
-(Dessau) show
-67.5 621.9 moveto
-12 f0
-( ) show
-31.5 608.6 moveto
-12 f2
-(1995:) show
-59.4 608.6 moveto
-12 f0
-( Dessau ) show
-31.5 595.3 moveto
-12 f2
-(1995:) show
-59.4 595.3 moveto
-12 f0
-( Details Sketchy ) show
-18.1 582.6 moveto
-3.3 3.3 c fill
-31.5 574.5 moveto
-12 f1
-(Devo) show
-57.4 574.5 moveto
-12 f0
-( ) show
-31.5 561.2 moveto
-12 f2
-(1978:) show
-59.4 561.2 moveto
-12 f0
-( Q: Are We Not Men? A: We Are DEVO! ) show
-31.5 547.9 moveto
-12 f2
-(1979:) show
-59.4 547.9 moveto
-12 f0
-( Freedom of Choice ) show
-31.5 534.6 moveto
-12 f2
-(1977-1990:) show
-87.4 534.6 moveto
-12 f0
-( Greatest Hits ) show
-31.5 521.3 moveto
-12 f2
-(1978-1990:) show
-87.4 521.3 moveto
-12 f0
-( Greatest Misses ) show
-298.1 575 moveto
-12 f2
-(UBL Card: ) show
-355.4 575 moveto
-12 f0
-(1088) show
-379.4 575 moveto
-12 f0
-( ) show
-298.1 561.7 moveto
-12 f2
-(See also: ) show
-344.7 561.7 moveto
-12 f0
-(hartke.lib.ohio-state.edu) show
-461 561.7 moveto
-12 f0
-( ) show
-298.1 548.4 moveto
-12 f2
-(See also: ) show
-344.7 548.4 moveto
-12 f0
-(unsane.enc.org) show
-416.6 548.4 moveto
-12 f0
-( ) show
-298.1 535.1 moveto
-12 f2
-(See also: ) show
-344.7 535.1 moveto
-12 f0
-(rt66.com) show
-387.6 535.1 moveto
-12 f0
-( ) show
-18.1 508.6 moveto
-3.3 3.3 c fill
-31.5 500.5 moveto
-12 f1
-(Die Krupps) show
-91.1 500.5 moveto
-12 f0
-( ) show
-31.5 487.2 moveto
-12 f2
-(1995:) show
-59.4 487.2 moveto
-12 f0
-( Rings of Steel ) show
-18.1 474.5 moveto
-3.3 3.3 c fill
-31.5 466.4 moveto
-12 f1
-(Die Monster Die) show
-115.4 466.4 moveto
-12 f0
-( ) show
-31.5 453.1 moveto
-12 f2
-(1994:) show
-59.4 453.1 moveto
-12 f0
-( Withdrawl Method ) show
-18.1 440.4 moveto
-3.3 3.3 c fill
-31.5 432.3 moveto
-12 f1
-(Die Warzau) show
-93.1 432.3 moveto
-12 f0
-( ) show
-31.5 419 moveto
-12 f2
-(1991:) show
-59.4 419 moveto
-12 f0
-( Big Electric Metal Bass Face ) show
-31.5 405.7 moveto
-12 f2
-(1994:) show
-59.4 405.7 moveto
-12 f0
-( Engine ) show
-31.5 392.4 moveto
-12 f2
-(1994:) show
-59.4 392.4 moveto
-12 f0
-( allgoodgirls ) show
-122.7 392.4 moveto
-12 f2
-(\(EP\)) show
-145.3 392.4 moveto
-12 f0
-( ) show
-18.1 379.7 moveto
-3.3 3.3 c fill
-31.5 371.6 moveto
-12 f1
-(Disposable Heroes of Hiphoprisy) show
-199.8 371.6 moveto
-12 f0
-( ) show
-31.5 358.3 moveto
-12 f2
-(1992:) show
-59.4 358.3 moveto
-12 f0
-( Hypocrisy is the Greatest Luxury ) show
-18.1 345.6 moveto
-3.3 3.3 c fill
-31.5 337.5 moveto
-12 f1
-(Dolby, Thomas) show
-109.5 337.5 moveto
-12 f0
-( ) show
-31.5 324.2 moveto
-12 f2
-(1983:) show
-59.4 324.2 moveto
-12 f0
-( The Golden Age of Wireless ) show
-31.5 310.9 moveto
-12 f2
-(1983:) show
-59.4 310.9 moveto
-12 f0
-( The Golden Age of Wireless ) show
-203.3 310.9 moveto
-12 f2
-(\(2nd release: 2) show
-31.5 297.6 moveto
-12 f2
-(new\)) show
-54.8 297.6 moveto
-12 f0
-( ) show
-31.5 284.3 moveto
-12 f2
-(1984:) show
-59.4 284.3 moveto
-12 f0
-( The Flat Earth ) show
-298.1 338 moveto
-12 f2
-(UBL Card: ) show
-355.4 338 moveto
-12 f0
-(1961) show
-379.4 338 moveto
-12 f0
-( ) show
-298.1 324.7 moveto
-12 f2
-(See also: ) show
-344.7 324.7 moveto
-12 f0
-(kspace.com) show
-401 324.7 moveto
-12 f0
-( ) show
-298.1 311.4 moveto
-12 f2
-(See also: ) show
-344.7 311.4 moveto
-12 f0
-(rt66.com) show
-387.6 311.4 moveto
-12 f0
-( ) show
-18.1 271.6 moveto
-3.3 3.3 c fill
-31.5 263.5 moveto
-12 f1
-(Doubting Thomas) show
-123.8 263.5 moveto
-12 f0
-( ) show
-31.5 250.2 moveto
-12 f2
-(1991:) show
-59.4 250.2 moveto
-12 f0
-( Father Don't Cry ) show
-148 250.2 moveto
-12 f2
-(\(EP\)) show
-170.6 250.2 moveto
-12 f0
-( ) show
-31.5 236.9 moveto
-12 f2
-(1991:) show
-59.4 236.9 moveto
-12 f0
-( The Infidel ) show
-298.1 264 moveto
-12 f2
-(UBL Card: ) show
-355.4 264 moveto
-12 f0
-(1166) show
-379.4 264 moveto
-12 f0
-( ) show
-298.1 250.7 moveto
-12 f2
-(See also: ) show
-344.7 250.7 moveto
-12 f0
-(www.eecs.nwu.edu) show
-438.3 250.7 moveto
-12 f0
-( ) show
-18.1 224.2 moveto
-3.3 3.3 c fill
-31.5 216.1 moveto
-12 f1
-(Duran Duran) show
-101.1 216.1 moveto
-12 f0
-( ) show
-31.5 202.8 moveto
-12 f2
-(1981:) show
-59.4 202.8 moveto
-12 f0
-( Duran Duran ) show
-31.5 189.5 moveto
-12 f2
-(1982:) show
-59.4 189.5 moveto
-12 f0
-( Carnival ) show
-106.7 189.5 moveto
-12 f2
-(\(EP\)) show
-129.3 189.5 moveto
-12 f0
-( ) show
-31.5 176.2 moveto
-12 f2
-(1982:) show
-59.4 176.2 moveto
-12 f0
-( live ) show
-83.4 176.2 moveto
-12 f2
-(\(live boot\)) show
-133 176.2 moveto
-12 f0
-( ) show
-31.5 162.9 moveto
-12 f2
-(1982:) show
-59.4 162.9 moveto
-12 f0
-( Rio ) show
-31.5 149.6 moveto
-12 f2
-(1983:) show
-59.4 149.6 moveto
-12 f0
-( Union of the Snake / Secret Oktober ) show
-240 149.6 moveto
-12 f2
-(\(single\)) show
-276.6 149.6 moveto
-12 f0
-( ) show
-31.5 136.3 moveto
-12 f2
-(1983:) show
-59.4 136.3 moveto
-12 f0
-( The Wild Boys / Cracks in the Pavement) show
-31.5 123 moveto
-12 f2
-(\(single\)) show
-68.1 123 moveto
-12 f0
-( ) show
-31.5 109.7 moveto
-12 f2
-(1983:) show
-59.4 109.7 moveto
-12 f0
-( Seven and the Ragged Tiger ) show
-31.5 96.4 moveto
-12 f2
-(1987:) show
-59.4 96.4 moveto
-12 f0
-( Notorious ) show
-31.5 83.1 moveto
-12 f2
-(1981-1988:) show
-87.4 83.1 moveto
-12 f0
-( Decade ) show
-129.3 83.1 moveto
-12 f2
-(\(comp\)) show
-163.2 83.1 moveto
-12 f0
-( ) show
-300.6 216.6 moveto
-12 f2
-(UBL Card: ) show
-357.9 216.6 moveto
-12 f0
-(1259) show
-381.9 216.6 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 10 10
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-18.1 716.6 moveto
-3.3 3.3 c fill
-31.5 708.5 moveto
-12 f1
-(Durutti Column) show
-114.5 708.5 moveto
-12 f0
-( ) show
-31.5 695.2 moveto
-12 f2
-(1988:) show
-59.4 695.2 moveto
-12 f0
-( The Guitar and Other Machines ) show
-298.1 709 moveto
-12 f2
-(UBL Card: ) show
-355.4 709 moveto
-12 f0
-(4853) show
-379.4 709 moveto
-12 f0
-( ) show
-18.1 682.5 moveto
-3.3 3.3 c fill
-31.5 674.4 moveto
-12 f1
-(Ebn Ozn) show
-77.1 674.4 moveto
-12 f0
-( ) show
-31.5 661.1 moveto
-12 f2
-(1984:) show
-59.4 661.1 moveto
-12 f0
-( Feeling Cavalier ) show
-18.1 648.4 moveto
-3.3 3.3 c fill
-31.5 640.3 moveto
-12 f1
-(Elastica) show
-72.1 640.3 moveto
-12 f0
-( ) show
-31.5 627 moveto
-12 f2
-(1995:) show
-59.4 627 moveto
-12 f0
-( Elastica ) show
-18.1 614.3 moveto
-3.3 3.3 c fill
-31.5 606.2 moveto
-12 f1
-(Elastic Purejoy, The) show
-135.8 606.2 moveto
-12 f0
-( ) show
-31.5 592.9 moveto
-12 f2
-(1994:) show
-59.4 592.9 moveto
-12 f0
-( The Elastic Purejoy ) show
-298.1 606.7 moveto
-12 f2
-(See also: ) show
-344.7 606.7 moveto
-12 f0
-(http2.brunel.ac.uk) show
-431.7 606.7 moveto
-12 f0
-( ) show
-18.1 580.2 moveto
-3.3 3.3 c fill
-31.5 572.1 moveto
-12 f1
-(Electric Hellfire Club, The) show
-168.1 572.1 moveto
-12 f0
-( ) show
-31.5 558.8 moveto
-12 f2
-(1993:) show
-59.4 558.8 moveto
-12 f0
-( Burn, Baby, Burn ) show
-31.5 545.5 moveto
-12 f2
-(1995:) show
-59.4 545.5 moveto
-12 f0
-( Kiss the Goat ) show
-18.1 532.8 moveto
-3.3 3.3 c fill
-31.5 524.7 moveto
-12 f1
-(Elfman, Danny) show
-109.5 524.7 moveto
-12 f0
-( ) show
-31.5 511.4 moveto
-12 f2
-(1984:) show
-59.4 511.4 moveto
-12 f0
-( So-Lo ) show
-298.1 525.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 525.2 moveto
-12 f0
-(1089) show
-379.4 525.2 moveto
-12 f0
-( ) show
-18.1 498.7 moveto
-3.3 3.3 c fill
-31.5 490.6 moveto
-12 f1
-(Emergency Broadcast Network) show
-192.1 490.6 moveto
-12 f0
-( ) show
-31.5 477.3 moveto
-12 f2
-(1995:) show
-59.4 477.3 moveto
-12 f0
-( Telecommunication Breakdown ) show
-18.1 464.6 moveto
-3.3 3.3 c fill
-31.5 456.5 moveto
-12 f1
-(Engorged with Blood) show
-140.1 456.5 moveto
-12 f0
-( ) show
-31.5 443.2 moveto
-12 f2
-(1993:) show
-59.4 443.2 moveto
-12 f0
-( Engorged with Blood ) show
-168.7 443.2 moveto
-12 f2
-(\(EP\)) show
-191.3 443.2 moveto
-12 f0
-( ) show
-18.1 430.5 moveto
-3.3 3.3 c fill
-31.5 422.4 moveto
-12 f1
-(Eno, Brian) show
-87.5 422.4 moveto
-12 f0
-( ) show
-31.5 409.1 moveto
-12 f2
-(1977:) show
-59.4 409.1 moveto
-12 f0
-( Before and After Science ) show
-298.1 422.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 422.9 moveto
-12 f0
-(1064) show
-379.4 422.9 moveto
-12 f0
-( ) show
-298.1 409.6 moveto
-12 f2
-(See also: ) show
-344.7 409.6 moveto
-12 f0
-(www.nwu.edu) show
-414.6 409.6 moveto
-12 f0
-( ) show
-18.1 396.4 moveto
-3.3 3.3 c fill
-31.5 388.3 moveto
-12 f1
-(Eon) show
-52.1 388.3 moveto
-12 f0
-( ) show
-31.5 375 moveto
-12 f2
-(1991:) show
-59.4 375 moveto
-12 f0
-( Fear: the Mindkiller ) show
-162 375 moveto
-12 f2
-(\(EP\)) show
-184.6 375 moveto
-12 f0
-( ) show
-31.5 361.7 moveto
-12 f2
-(1992:) show
-59.4 361.7 moveto
-12 f0
-( Basket Case ) show
-124.3 361.7 moveto
-12 f2
-(\(EP\)) show
-146.9 361.7 moveto
-12 f0
-( ) show
-18.1 349 moveto
-3.3 3.3 c fill
-31.5 340.9 moveto
-12 f1
-(Erasure) show
-72.8 340.9 moveto
-12 f0
-( ) show
-31.5 327.6 moveto
-12 f2
-(1984-1986:) show
-87.4 327.6 moveto
-12 f0
-( various singles ) show
-31.5 314.3 moveto
-12 f2
-(1986:) show
-59.4 314.3 moveto
-12 f0
-( Wonderland ) show
-298.1 341.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 341.4 moveto
-12 f0
-(1029) show
-379.4 341.4 moveto
-12 f0
-( ) show
-298.1 328.1 moveto
-12 f2
-(See also: ) show
-344.7 328.1 moveto
-12 f0
-(www.cec.wustl.edu) show
-439 328.1 moveto
-12 f0
-( ) show
-298.1 314.8 moveto
-12 f2
-(See also: ) show
-344.7 314.8 moveto
-12 f0
-(rt66.com) show
-387.6 314.8 moveto
-12 f0
-( ) show
-18.1 301.6 moveto
-3.3 3.3 c fill
-31.5 293.5 moveto
-12 f1
-(Estep, Maggie) show
-104.1 293.5 moveto
-12 f0
-( ) show
-31.5 280.2 moveto
-12 f2
-(1994:) show
-59.4 280.2 moveto
-12 f0
-( No More Mister Nice Girl ) show
-18.1 267.5 moveto
-3.3 3.3 c fill
-31.5 259.4 moveto
-12 f1
-(Ethyl Meatplow) show
-113.8 259.4 moveto
-12 f0
-( ) show
-31.5 246.1 moveto
-12 f2
-(1993:) show
-59.4 246.1 moveto
-12 f0
-( Happy Days Sweetheart ) show
-31.5 232.8 moveto
-12 f2
-(1993:) show
-59.4 232.8 moveto
-12 f0
-( Devil's Johnson ) show
-143 232.8 moveto
-12 f2
-(\(single\)) show
-179.6 232.8 moveto
-12 f0
-( ) show
-300.8 259.9 moveto
-12 f2
-(UBL Card: ) show
-358.1 259.9 moveto
-12 f0
-(5232) show
-382.1 259.9 moveto
-12 f0
-( ) show
-18.1 220.1 moveto
-3.3 3.3 c fill
-31.5 212 moveto
-12 f1
-(Eurythmics) show
-91.5 212 moveto
-12 f0
-( ) show
-31.5 198.7 moveto
-12 f2
-(1981:) show
-59.4 198.7 moveto
-12 f0
-( In the Garden ) show
-31.5 185.4 moveto
-12 f2
-(1982:) show
-59.4 185.4 moveto
-12 f0
-( Love is a Stranger ) show
-153 185.4 moveto
-12 f2
-(\(EP\)) show
-175.6 185.4 moveto
-12 f0
-( ) show
-31.5 172.1 moveto
-12 f2
-(1982:) show
-59.4 172.1 moveto
-12 f0
-( This is the House ) show
-149 172.1 moveto
-12 f2
-(\(live EP\)) show
-191.9 172.1 moveto
-12 f0
-( ) show
-31.5 158.8 moveto
-12 f2
-(1983:) show
-59.4 158.8 moveto
-12 f0
-( Sweet Dreams ) show
-31.5 145.5 moveto
-12 f2
-(1983:) show
-59.4 145.5 moveto
-12 f0
-( Touch ) show
-31.5 132.2 moveto
-12 f2
-(1984:) show
-59.4 132.2 moveto
-12 f0
-( 1984 \(For the Love of Big Brother\) ) show
-235.3 132.2 moveto
-12 f2
-(\(soundtrack\)) show
-296.6 132.2 moveto
-12 f0
-( ) show
-18.1 119.5 moveto
-3.3 3.3 c fill
-31.5 111.4 moveto
-12 f1
-(Executive Slacks) show
-117.1 111.4 moveto
-12 f0
-( ) show
-31.5 98.1 moveto
-12 f2
-(1986:) show
-59.4 98.1 moveto
-12 f0
-( Fire and Ice ) show
-18.1 85.4 moveto
-3.3 3.3 c fill
-31.5 77.3 moveto
-12 f1
-(Faith and the Muse) show
-131.1 77.3 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 11 11
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1994:) show
-59.4 709.2 moveto
-12 f0
-( Elyria ) show
-18.1 696.5 moveto
-3.3 3.3 c fill
-31.5 688.4 moveto
-12 f1
-(Fixx, The) show
-80.1 688.4 moveto
-12 f0
-( ) show
-31.5 675.1 moveto
-12 f2
-(1982:) show
-59.4 675.1 moveto
-12 f0
-( Shuttered Room ) show
-31.5 661.8 moveto
-12 f2
-(1983:) show
-59.4 661.8 moveto
-12 f0
-( Reach the Beach ) show
-31.5 648.5 moveto
-12 f2
-(1984:) show
-59.4 648.5 moveto
-12 f0
-( Phantoms ) show
-31.5 635.2 moveto
-12 f2
-(1986:) show
-59.4 635.2 moveto
-12 f0
-( Walkabout ) show
-31.5 621.9 moveto
-12 f2
-(1987:) show
-59.4 621.9 moveto
-12 f0
-( React ) show
-92.7 621.9 moveto
-12 f2
-(\(live\)) show
-118 621.9 moveto
-12 f0
-( ) show
-300.5 688.9 moveto
-12 f2
-(UBL Card: ) show
-357.8 688.9 moveto
-12 f0
-(4603) show
-381.8 688.9 moveto
-12 f0
-( ) show
-18.1 609.2 moveto
-3.3 3.3 c fill
-31.5 601.1 moveto
-12 f1
-(Foetus) show
-65.4 601.1 moveto
-12 f0
-( ) show
-31.5 587.8 moveto
-12 f2
-(19??:) show
-59.4 587.8 moveto
-12 f0
-( Rife ) show
-31.5 574.5 moveto
-12 f2
-(1995:) show
-59.4 574.5 moveto
-12 f0
-( Gash ) show
-298.1 601.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 601.6 moveto
-12 f0
-(2750) show
-379.4 601.6 moveto
-12 f0
-( ) show
-18.1 561.8 moveto
-3.3 3.3 c fill
-31.5 553.7 moveto
-12 f1
-(Fortran 5) show
-81.1 553.7 moveto
-12 f0
-( ) show
-31.5 540.4 moveto
-12 f2
-(1991:) show
-59.4 540.4 moveto
-12 f0
-( Blues ) show
-31.5 527.1 moveto
-12 f2
-(1993:) show
-59.4 527.1 moveto
-12 f0
-( Bad Head Park ) show
-298.1 554.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 554.2 moveto
-12 f0
-(3469) show
-379.4 554.2 moveto
-12 f0
-( ) show
-298.1 540.9 moveto
-12 f2
-(See also: ) show
-344.7 540.9 moveto
-12 f0
-(rt66.com) show
-387.6 540.9 moveto
-12 f0
-( ) show
-18.1 514.4 moveto
-3.3 3.3 c fill
-31.5 506.3 moveto
-12 f1
-(45 Grave) show
-78.4 506.3 moveto
-12 f0
-( ) show
-31.5 493 moveto
-12 f2
-(1993:) show
-59.4 493 moveto
-12 f0
-( Debasement Tapes ) show
-18.1 480.3 moveto
-3.3 3.3 c fill
-31.5 472.2 moveto
-12 f1
-(Frankie goes to Hollywood) show
-168.5 472.2 moveto
-12 f0
-( ) show
-31.5 458.9 moveto
-12 f2
-(1984:) show
-59.4 458.9 moveto
-12 f0
-( Welcome to the Pleasure Dome ) show
-298.1 472.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 472.7 moveto
-12 f0
-(3222) show
-379.4 472.7 moveto
-12 f0
-( ) show
-298.1 459.4 moveto
-12 f2
-(See also: ) show
-344.7 459.4 moveto
-12 f0
-(rt66.com) show
-387.6 459.4 moveto
-12 f0
-( ) show
-18.1 446.2 moveto
-3.3 3.3 c fill
-31.5 438.1 moveto
-12 f1
-(Freur) show
-61.4 438.1 moveto
-12 f0
-( ) show
-31.5 424.8 moveto
-12 f2
-(1983:) show
-59.4 424.8 moveto
-12 f0
-( Doot Doot ) show
-298.1 438.6 moveto
-12 f2
-(See also: ) show
-344.7 438.6 moveto
-12 f0
-(rt66.com) show
-387.6 438.6 moveto
-12 f0
-( ) show
-18.1 412.1 moveto
-3.3 3.3 c fill
-31.5 404 moveto
-12 f1
-(Front 242) show
-81.8 404 moveto
-12 f0
-( ) show
-31.5 390.7 moveto
-12 f2
-(1979:) show
-59.4 390.7 moveto
-12 f0
-( Masterhit ) show
-111.3 390.7 moveto
-12 f2
-(\(EP\)) show
-133.9 390.7 moveto
-12 f0
-( ) show
-31.5 377.4 moveto
-12 f2
-(1983:) show
-59.4 377.4 moveto
-12 f0
-( Geography ) show
-31.5 364.1 moveto
-12 f2
-(1987:) show
-59.4 364.1 moveto
-12 f0
-( Official Version ) show
-31.5 350.8 moveto
-12 f2
-(1985:) show
-59.4 350.8 moveto
-12 f0
-( No Comment ) show
-31.5 337.5 moveto
-12 f2
-(1982:) show
-59.4 337.5 moveto
-12 f0
-( Two In One ) show
-123.3 337.5 moveto
-12 f2
-(\(EP\)) show
-145.9 337.5 moveto
-12 f0
-( ) show
-31.5 324.2 moveto
-12 f2
-(1982-1985:) show
-87.4 324.2 moveto
-12 f0
-( Backcatalogue ) show
-164 324.2 moveto
-12 f2
-(\(comp\)) show
-197.9 324.2 moveto
-12 f0
-( ) show
-31.5 310.9 moveto
-12 f2
-(1989:) show
-59.4 310.9 moveto
-12 f0
-( Headhunter ) show
-121.3 310.9 moveto
-12 f2
-(\(EP\)) show
-143.9 310.9 moveto
-12 f0
-( ) show
-31.5 297.6 moveto
-12 f2
-(1989:) show
-59.4 297.6 moveto
-12 f0
-( Front by Front ) show
-31.5 284.3 moveto
-12 f2
-(1989:) show
-59.4 284.3 moveto
-12 f0
-( Never Stop ) show
-119.7 284.3 moveto
-12 f2
-(\(EP\)) show
-142.3 284.3 moveto
-12 f0
-( ) show
-31.5 271 moveto
-12 f2
-(1991:) show
-59.4 271 moveto
-12 f0
-( Tyrrany For You ) show
-31.5 257.7 moveto
-12 f2
-(1991:) show
-59.4 257.7 moveto
-12 f0
-( Tragedy For You ) show
-148.7 257.7 moveto
-12 f2
-(\(EP\)) show
-171.3 257.7 moveto
-12 f0
-( ) show
-31.5 244.4 moveto
-12 f2
-(1991:) show
-59.4 244.4 moveto
-12 f0
-( Rhythm of Time ) show
-145.4 244.4 moveto
-12 f2
-(\(EP\)) show
-168 244.4 moveto
-12 f0
-( ) show
-31.5 231.1 moveto
-12 f2
-(1993:) show
-59.4 231.1 moveto
-12 f0
-( Religion ) show
-106.7 231.1 moveto
-12 f2
-(\(EP\)) show
-129.3 231.1 moveto
-12 f0
-( ) show
-31.5 217.8 moveto
-12 f2
-(1993:) show
-59.4 217.8 moveto
-12 f0
-( Animal ) show
-101.4 217.8 moveto
-12 f2
-(\(single\)) show
-138 217.8 moveto
-12 f0
-( ) show
-31.5 204.5 moveto
-12 f2
-(1993:) show
-59.4 204.5 moveto
-12 f0
-( 06:21:03:11 Up Evil ) show
-31.5 191.2 moveto
-12 f2
-(1993:) show
-59.4 191.2 moveto
-12 f0
-( 05:22:09:12 Off ) show
-298.1 404.5 moveto
-12 f2
-(UBL Card: ) show
-355.4 404.5 moveto
-12 f0
-(1059) show
-379.4 404.5 moveto
-12 f0
-( ) show
-298.1 391.2 moveto
-12 f2
-(See also: ) show
-344.7 391.2 moveto
-12 f0
-(www.ifi.uio.no) show
-417.6 391.2 moveto
-12 f0
-( ) show
-298.1 377.9 moveto
-12 f2
-(See also: ) show
-344.7 377.9 moveto
-12 f0
-(www.eecs.nwu.edu) show
-438.3 377.9 moveto
-12 f0
-( ) show
-18.1 178.5 moveto
-3.3 3.3 c fill
-31.5 170.4 moveto
-12 f1
-(Front Line Assembly) show
-139.5 170.4 moveto
-12 f0
-( ) show
-31.5 157.1 moveto
-12 f2
-(1988:) show
-59.4 157.1 moveto
-12 f0
-( Convergence ) show
-31.5 143.8 moveto
-12 f2
-(1989:) show
-59.4 143.8 moveto
-12 f0
-( Digital Tension Dementia ) show
-190 143.8 moveto
-12 f2
-(\(EP\)) show
-212.6 143.8 moveto
-12 f0
-( ) show
-31.5 130.5 moveto
-12 f2
-(1990:) show
-59.4 130.5 moveto
-12 f0
-( Gashed Senses and Crossfire ) show
-31.5 117.2 moveto
-12 f2
-(1991:) show
-59.4 117.2 moveto
-12 f0
-( Caustic Grip ) show
-31.5 103.9 moveto
-12 f2
-(1992:) show
-59.4 103.9 moveto
-12 f0
-( Tactical Neural Implant ) show
-304.9 170.9 moveto
-12 f2
-(UBL Card: ) show
-362.2 170.9 moveto
-12 f0
-(1161) show
-386.2 170.9 moveto
-12 f0
-( ) show
-18.1 91.2 moveto
-3.3 3.3 c fill
-31.5 83.1 moveto
-12 f1
-(Fugazi) show
-66.1 83.1 moveto
-12 f0
-( ) show
-298.1 83.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 83.6 moveto
-12 f0
-(2053) show
-379.4 83.6 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 12 12
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1989:) show
-59.4 709.2 moveto
-12 f0
-( 13 Songs ) show
-18.1 696.5 moveto
-3.3 3.3 c fill
-31.5 688.4 moveto
-12 f1
-(Fun Boy Three) show
-108.8 688.4 moveto
-12 f0
-( ) show
-31.5 675.1 moveto
-12 f2
-(1982:) show
-59.4 675.1 moveto
-12 f0
-( It Ain't What You Do / Just Do It / Funrama Theme ) show
-315.7 675.1 moveto
-12 f2
-(\(single\)) show
-352.3 675.1 moveto
-12 f0
-( ) show
-31.5 661.8 moveto
-12 f2
-(1981-1983:) show
-87.4 661.8 moveto
-12 f0
-( The Best of Fun Boy Three ) show
-225 661.8 moveto
-12 f2
-(\(comp\)) show
-258.9 661.8 moveto
-12 f0
-( ) show
-18.1 649.1 moveto
-3.3 3.3 c fill
-31.5 641 moveto
-12 f1
-(Fuzzbox) show
-74.8 641 moveto
-12 f0
-( ) show
-31.5 627.7 moveto
-12 f2
-(1986:) show
-59.4 627.7 moveto
-12 f0
-( We've got a Fuzzbox and We're Gonna Use It!!) show
-31.5 601.1 moveto
-12 f2
-(1986:) show
-59.4 601.1 moveto
-12 f0
-( Love is the Slug ) show
-143.7 601.1 moveto
-12 f2
-(\(single\)) show
-180.3 601.1 moveto
-12 f0
-( ) show
-31.5 587.8 moveto
-12 f2
-(1986:) show
-59.4 587.8 moveto
-12 f0
-( Rules and Regulations ) show
-173.4 587.8 moveto
-12 f2
-(\(single\)) show
-210 587.8 moveto
-12 f0
-( ) show
-298.1 641.5 moveto
-12 f2
-(See also: ) show
-344.7 641.5 moveto
-12 f0
-(world.std.com) show
-413.3 641.5 moveto
-12 f0
-( ) show
-18.1 575.1 moveto
-3.3 3.3 c fill
-31.5 567 moveto
-12 f1
-(Gabriel, Peter) show
-104.1 567 moveto
-12 f0
-( ) show
-31.5 553.7 moveto
-12 f2
-(1977:) show
-59.4 553.7 moveto
-12 f0
-( Peter Gabriel I ) show
-31.5 540.4 moveto
-12 f2
-(1978:) show
-59.4 540.4 moveto
-12 f0
-( Peter Gabriel II ) show
-31.5 527.1 moveto
-12 f2
-(1980:) show
-59.4 527.1 moveto
-12 f0
-( Peter Gabriel III ) show
-31.5 513.8 moveto
-12 f2
-(1982:) show
-59.4 513.8 moveto
-12 f0
-( Security ) show
-31.5 500.5 moveto
-12 f2
-(1983:) show
-59.4 500.5 moveto
-12 f0
-( Peter Gabriel Plays Live ) show
-183 500.5 moveto
-12 f2
-(\(double live\)) show
-243.9 500.5 moveto
-12 f0
-( ) show
-31.5 487.2 moveto
-12 f2
-(1985:) show
-59.4 487.2 moveto
-12 f0
-( Birdy ) show
-92.7 487.2 moveto
-12 f2
-(\(soundtrack\)) show
-154 487.2 moveto
-12 f0
-( ) show
-31.5 473.9 moveto
-12 f2
-(1986:) show
-59.4 473.9 moveto
-12 f0
-( So ) show
-31.5 460.6 moveto
-12 f2
-(1986:) show
-59.4 460.6 moveto
-12 f0
-( Live at the Civic Arena ) show
-178 460.6 moveto
-12 f2
-(\(live boot\)) show
-227.6 460.6 moveto
-12 f0
-( ) show
-31.5 447.3 moveto
-12 f2
-(1989:) show
-59.4 447.3 moveto
-12 f0
-( Passion ) show
-102 447.3 moveto
-12 f2
-(\(soundtrack\)) show
-163.3 447.3 moveto
-12 f0
-( ) show
-298.1 567.5 moveto
-12 f2
-(UBL Card: ) show
-355.4 567.5 moveto
-12 f0
-(1016) show
-379.4 567.5 moveto
-12 f0
-( ) show
-298.1 554.2 moveto
-12 f2
-(See also: ) show
-344.7 554.2 moveto
-12 f0
-(www.nwu.edu) show
-414.6 554.2 moveto
-12 f0
-( ) show
-298.1 540.9 moveto
-12 f2
-(See also: ) show
-344.7 540.9 moveto
-12 f0
-(www.cs.clemson.edu) show
-447 540.9 moveto
-12 f0
-( ) show
-18.1 434.6 moveto
-3.3 3.3 c fill
-31.5 426.5 moveto
-12 f1
-(Garbage) show
-76.1 426.5 moveto
-12 f0
-( ) show
-31.5 413.2 moveto
-12 f2
-(1995:) show
-59.4 413.2 moveto
-12 f0
-( Garbage ) show
-298.1 427 moveto
-12 f2
-(See also: ) show
-344.7 427 moveto
-12 f0
-(hamp.hampshire.edu) show
-444.6 427 moveto
-12 f0
-( ) show
-18.1 400.5 moveto
-3.3 3.3 c fill
-31.5 392.4 moveto
-12 f1
-(Game Theory) show
-102.4 392.4 moveto
-12 f0
-( ) show
-31.5 379.1 moveto
-12 f2
-(1987:) show
-59.4 379.1 moveto
-12 f0
-( Lolita Nation ) show
-18.1 366.4 moveto
-3.3 3.3 c fill
-31.5 358.3 moveto
-12 f1
-(Gang of 4) show
-81.5 358.3 moveto
-12 f0
-( ) show
-31.5 345 moveto
-12 f2
-(1979:) show
-59.4 345 moveto
-12 f0
-( Entertainment ) show
-31.5 331.7 moveto
-12 f2
-(1979:) show
-59.4 331.7 moveto
-12 f0
-( Peel Sessions ) show
-130.4 331.7 moveto
-12 f2
-(\(live\)) show
-155.7 331.7 moveto
-12 f0
-( ) show
-31.5 318.4 moveto
-12 f2
-(1981:) show
-59.4 318.4 moveto
-12 f0
-( Solid Gold ) show
-31.5 305.1 moveto
-12 f2
-(1981:) show
-59.4 305.1 moveto
-12 f0
-( Another Day / Another Dollar ) show
-31.5 291.8 moveto
-12 f2
-(1982:) show
-59.4 291.8 moveto
-12 f0
-( I Love a Man In a Uniform ) show
-196 291.8 moveto
-12 f2
-(\(single\)) show
-232.6 291.8 moveto
-12 f0
-( ) show
-31.5 278.5 moveto
-12 f2
-(1982:) show
-59.4 278.5 moveto
-12 f0
-( Songs of the Free ) show
-31.5 265.2 moveto
-12 f2
-(1983:) show
-59.4 265.2 moveto
-12 f0
-( Is It Love ) show
-112 265.2 moveto
-12 f2
-(\(single\)) show
-148.6 265.2 moveto
-12 f0
-( ) show
-31.5 251.9 moveto
-12 f2
-(1983:) show
-59.4 251.9 moveto
-12 f0
-( Hard ) show
-31.5 238.6 moveto
-12 f2
-(1983:) show
-59.4 238.6 moveto
-12 f0
-( At the Palace ) show
-129.3 238.6 moveto
-12 f2
-(\(live\)) show
-154.6 238.6 moveto
-12 f0
-( ) show
-31.5 225.3 moveto
-12 f2
-(1979-1983:) show
-87.4 225.3 moveto
-12 f0
-( A Brief History of the Twentieth Century) show
-31.5 212 moveto
-12 f2
-(\(comp\)) show
-65.4 212 moveto
-12 f0
-( ) show
-31.5 198.7 moveto
-12 f2
-(1990:) show
-59.4 198.7 moveto
-12 f0
-( To Hell With Poverty ) show
-169.7 198.7 moveto
-12 f2
-(\(single\)) show
-206.3 198.7 moveto
-12 f0
-( ) show
-31.5 185.4 moveto
-12 f2
-(1990:) show
-59.4 185.4 moveto
-12 f0
-( Mall ) show
-31.5 172.1 moveto
-12 f2
-(1990:) show
-59.4 172.1 moveto
-12 f0
-( Money Talks ) show
-129 172.1 moveto
-12 f2
-(\(single\)) show
-165.6 172.1 moveto
-12 f0
-( ) show
-31.5 158.8 moveto
-12 f2
-(1995:) show
-59.4 158.8 moveto
-12 f0
-( Tatoo ) show
-93.3 158.8 moveto
-12 f2
-(\(single\)) show
-129.9 158.8 moveto
-12 f0
-( ) show
-31.5 145.5 moveto
-12 f2
-(1995:) show
-59.4 145.5 moveto
-12 f0
-( Shrinkwrapped ) show
-298.1 358.8 moveto
-12 f2
-(See also: ) show
-344.7 358.8 moveto
-12 f0
-(http2.brunel.ac.uk) show
-431.7 358.8 moveto
-12 f0
-( ) show
-18.1 132.8 moveto
-3.3 3.3 c fill
-31.5 124.7 moveto
-12 f1
-(Glove, The) show
-87.5 124.7 moveto
-12 f0
-( ) show
-31.5 111.4 moveto
-12 f2
-(1982:) show
-59.4 111.4 moveto
-12 f0
-( Blue Sunshine ) show
-298.1 125.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 125.2 moveto
-12 f0
-(1159) show
-379.4 125.2 moveto
-12 f0
-( ) show
-298.1 111.9 moveto
-12 f2
-(See also: ) show
-344.7 111.9 moveto
-12 f0
-(www.dcs.gla.ac.uk) show
-436 111.9 moveto
-12 f0
-( ) show
-18.1 98.7 moveto
-3.3 3.3 c fill
-31.5 90.6 moveto
-12 f1
-(God is my Copilot) show
-124.5 90.6 moveto
-12 f0
-( ) show
-31.5 77.3 moveto
-12 f2
-(1993:) show
-59.4 77.3 moveto
-12 f0
-( Speed Yr Trip ) show
-pagelevel restore
-showpage
-%%Page: 13 13
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-18.1 712.6 moveto
-3.3 3.3 c fill
-31.5 704.5 moveto
-12 f1
-(Gracious Shades) show
-117.1 704.5 moveto
-12 f0
-( ) show
-31.5 691.2 moveto
-12 f2
-(1995:) show
-59.4 691.2 moveto
-12 f0
-( Aberkash ) show
-18.1 678.5 moveto
-3.3 3.3 c fill
-31.5 670.4 moveto
-12 f1
-(Grind) show
-62.8 670.4 moveto
-12 f0
-( ) show
-31.5 657.1 moveto
-12 f2
-(1995:) show
-59.4 657.1 moveto
-12 f0
-( Kittymuzzle ) show
-18.1 644.4 moveto
-3.3 3.3 c fill
-31.5 636.3 moveto
-12 f1
-(Grotus) show
-67.5 636.3 moveto
-12 f0
-( ) show
-31.5 623 moveto
-12 f2
-(1993:) show
-59.4 623 moveto
-12 f0
-( Slow Motion Apocalypse ) show
-302.1 636.8 moveto
-12 f2
-(UBL Card: ) show
-359.4 636.8 moveto
-12 f0
-(5482) show
-383.4 636.8 moveto
-12 f0
-( ) show
-18.1 610.3 moveto
-3.3 3.3 c fill
-31.5 602.2 moveto
-12 f1
-(Pizzicato Five) show
-102.4 602.2 moveto
-12 f0
-( ) show
-31.5 588.9 moveto
-12 f2
-(1995:) show
-59.4 588.9 moveto
-12 f0
-( The Sound of Music ) show
-18.1 576.2 moveto
-3.3 3.3 c fill
-31.5 568.1 moveto
-12 f1
-(PJ Harvey) show
-85.8 568.1 moveto
-12 f0
-( ) show
-31.5 554.8 moveto
-12 f2
-(1992:) show
-59.4 554.8 moveto
-12 f0
-( Dry ) show
-31.5 541.5 moveto
-12 f2
-(1993:) show
-59.4 541.5 moveto
-12 f0
-( Rid of Me ) show
-31.5 528.2 moveto
-12 f2
-(1993:) show
-59.4 528.2 moveto
-12 f0
-( 4-Track Demos ) show
-31.5 514.9 moveto
-12 f2
-(1995:) show
-59.4 514.9 moveto
-12 f0
-( Down by the Water ) show
-159.7 514.9 moveto
-12 f2
-(\(single\)) show
-196.3 514.9 moveto
-12 f0
-( ) show
-31.5 501.6 moveto
-12 f2
-(1995:) show
-59.4 501.6 moveto
-12 f0
-( To Bring You My Love ) show
-298.1 568.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 568.6 moveto
-12 f0
-(1221) show
-379.4 568.6 moveto
-12 f0
-( ) show
-298.1 555.3 moveto
-12 f2
-(See also: ) show
-344.7 555.3 moveto
-12 f0
-(www.louisville.edu) show
-438.6 555.3 moveto
-12 f0
-( ) show
-18.1 488.9 moveto
-3.3 3.3 c fill
-31.5 480.8 moveto
-12 f1
-(Psychick Warriors ov Gaia) show
-170.4 480.8 moveto
-12 f0
-( ) show
-31.5 467.5 moveto
-12 f2
-(1992:) show
-59.4 467.5 moveto
-12 f0
-( Ov Biospheres and Sacred Groves ) show
-18.1 454.8 moveto
-3.3 3.3 c fill
-31.5 446.7 moveto
-12 f1
-(Hagen, Nina) show
-95.5 446.7 moveto
-12 f0
-( ) show
-31.5 433.4 moveto
-12 f2
-(1985:) show
-59.4 433.4 moveto
-12 f0
-( In Ekstasy ) show
-31.5 420.1 moveto
-12 f2
-(1978-1982:) show
-87.4 420.1 moveto
-12 f0
-( nunsexmonkrock / Nina Hagen Band ) show
-18.1 407.4 moveto
-3.3 3.3 c fill
-31.5 399.3 moveto
-12 f1
-(Hate Dept.) show
-86.8 399.3 moveto
-12 f0
-( ) show
-31.5 386 moveto
-12 f2
-(1994:) show
-59.4 386 moveto
-12 f0
-( Meat Your Maker ) show
-31.5 372.7 moveto
-12 f2
-(1995:) show
-59.4 372.7 moveto
-12 f0
-( Mainline ) show
-108.7 372.7 moveto
-12 f2
-(\(EP\)) show
-131.3 372.7 moveto
-12 f0
-( ) show
-298.1 399.8 moveto
-12 f2
-(See also: ) show
-344.7 399.8 moveto
-12 f0
-(www.iuma.com) show
-421.3 399.8 moveto
-12 f0
-( ) show
-18.1 360 moveto
-3.3 3.3 c fill
-31.5 351.9 moveto
-12 f1
-(Haysi Fantayzee) show
-115.8 351.9 moveto
-12 f0
-( ) show
-31.5 338.6 moveto
-12 f2
-(1982:) show
-59.4 338.6 moveto
-12 f0
-( Shiny Shiny remix ) show
-155.4 338.6 moveto
-12 f2
-(\(single\)) show
-192 338.6 moveto
-12 f0
-( ) show
-18.1 325.9 moveto
-3.3 3.3 c fill
-31.5 317.8 moveto
-12 f1
-(Heaven 17) show
-85.1 317.8 moveto
-12 f0
-( ) show
-31.5 304.5 moveto
-12 f2
-(1981:) show
-59.4 304.5 moveto
-12 f0
-( Penthouse and Pavement ) show
-31.5 291.2 moveto
-12 f2
-(1982:) show
-59.4 291.2 moveto
-12 f0
-( Heaven 17 ) show
-31.5 277.9 moveto
-12 f2
-(1983:) show
-59.4 277.9 moveto
-12 f0
-( The Luxury Gap ) show
-31.5 264.6 moveto
-12 f2
-(1984:) show
-59.4 264.6 moveto
-12 f0
-( How Men Are ) show
-18.1 251.9 moveto
-3.3 3.3 c fill
-31.5 243.8 moveto
-12 f1
-(Hope, Peter and Kirk, Richard) show
-190.1 243.8 moveto
-12 f0
-( ) show
-31.5 230.5 moveto
-12 f2
-(1988:) show
-59.4 230.5 moveto
-12 f0
-( Hoodoo Talk ) show
-298.1 244.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 244.3 moveto
-12 f0
-(2307) show
-379.4 244.3 moveto
-12 f0
-( ) show
-18.1 217.8 moveto
-3.3 3.3 c fill
-31.5 209.7 moveto
-12 f1
-(Kershaw, Nik) show
-102.1 209.7 moveto
-12 f0
-( ) show
-31.5 196.4 moveto
-12 f2
-(1983:) show
-59.4 196.4 moveto
-12 f0
-( Human Racing ) show
-18.1 183.7 moveto
-3.3 3.3 c fill
-31.5 175.6 moveto
-12 f1
-(Kirk, Richard) show
-104.1 175.6 moveto
-12 f0
-( ) show
-31.5 162.3 moveto
-12 f2
-(1993:) show
-59.4 162.3 moveto
-12 f0
-( Virtual State ) show
-298.1 176.1 moveto
-12 f2
-(UBL Card: ) show
-355.4 176.1 moveto
-12 f0
-(2307) show
-379.4 176.1 moveto
-12 f0
-( ) show
-18.1 149.6 moveto
-3.3 3.3 c fill
-31.5 141.5 moveto
-12 f1
-(Human League) show
-110.5 141.5 moveto
-12 f0
-( ) show
-31.5 128.2 moveto
-12 f2
-(1979:) show
-59.4 128.2 moveto
-12 f0
-( Reproduction ) show
-31.5 114.9 moveto
-12 f2
-(1980:) show
-59.4 114.9 moveto
-12 f0
-( Travelogue ) show
-31.5 101.6 moveto
-12 f2
-(1981:) show
-59.4 101.6 moveto
-12 f0
-( Dare ) show
-31.5 88.3 moveto
-12 f2
-(1983:) show
-59.4 88.3 moveto
-12 f0
-( Fascination ) show
-31.5 75 moveto
-12 f2
-(1984:) show
-59.4 75 moveto
-12 f0
-( Hysteria ) show
-298.1 142 moveto
-12 f2
-(UBL Card: ) show
-355.4 142 moveto
-12 f0
-(4631) show
-379.4 142 moveto
-12 f0
-( ) show
-298.1 128.7 moveto
-12 f2
-(See also: ) show
-344.7 128.7 moveto
-12 f0
-(pathfinder.com) show
-417.6 128.7 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 14 14
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1995:) show
-59.4 709.2 moveto
-12 f0
-( Octopus ) show
-18.1 696.5 moveto
-3.3 3.3 c fill
-31.5 688.4 moveto
-12 f1
-(Hunters and Collectors) show
-150.8 688.4 moveto
-12 f0
-( ) show
-31.5 675.1 moveto
-12 f2
-(1987:) show
-59.4 675.1 moveto
-12 f0
-( Human Frailty ) show
-300.2 688.9 moveto
-12 f2
-(UBL Card: ) show
-357.5 688.9 moveto
-12 f0
-(4553) show
-381.5 688.9 moveto
-12 f0
-( ) show
-18.1 662.4 moveto
-3.3 3.3 c fill
-31.5 654.3 moveto
-12 f1
-(Ice T) show
-57.8 654.3 moveto
-12 f0
-( ) show
-31.5 641 moveto
-12 f2
-(1991:) show
-59.4 641 moveto
-12 f0
-( New Jack Hustler ) show
-150.7 641 moveto
-12 f2
-(\(EP\)) show
-173.3 641 moveto
-12 f0
-( ) show
-298.1 654.8 moveto
-12 f2
-(UBL Card: ) show
-355.4 654.8 moveto
-12 f0
-(2342) show
-379.4 654.8 moveto
-12 f0
-( ) show
-18.1 628.3 moveto
-3.3 3.3 c fill
-31.5 620.2 moveto
-12 f1
-(In the Nursery) show
-106.8 620.2 moveto
-12 f0
-( ) show
-31.5 606.9 moveto
-12 f2
-(19??:) show
-59.4 606.9 moveto
-12 f0
-( L'Esprit ) show
-18.1 594.2 moveto
-3.3 3.3 c fill
-31.5 586.1 moveto
-12 f1
-(INXS) show
-60.1 586.1 moveto
-12 f0
-( ) show
-31.5 572.8 moveto
-12 f2
-(1982:) show
-59.4 572.8 moveto
-12 f0
-( Shabooh Shoobah ) show
-31.5 559.5 moveto
-12 f2
-(1984:) show
-59.4 559.5 moveto
-12 f0
-( The Swing ) show
-31.5 546.2 moveto
-12 f2
-(1985:) show
-59.4 546.2 moveto
-12 f0
-( Listen Like Thieves ) show
-31.5 532.9 moveto
-12 f2
-(1988:) show
-59.4 532.9 moveto
-12 f0
-( Kick ) show
-31.5 519.6 moveto
-12 f2
-(1990:) show
-59.4 519.6 moveto
-12 f0
-( X ) show
-298.1 586.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 586.6 moveto
-12 f0
-(1284) show
-379.4 586.6 moveto
-12 f0
-( ) show
-18.1 506.9 moveto
-3.3 3.3 c fill
-31.5 498.8 moveto
-12 f1
-(J., David) show
-77.1 498.8 moveto
-12 f0
-( ) show
-31.5 485.5 moveto
-12 f2
-(1983-1986:) show
-87.4 485.5 moveto
-12 f0
-( On Glass ) show
-137.7 485.5 moveto
-12 f2
-(\(comp\)) show
-171.6 485.5 moveto
-12 f0
-( ) show
-31.5 472.2 moveto
-12 f2
-(1985:) show
-59.4 472.2 moveto
-12 f0
-( Crocodile Tears and the Velvet Cosh ) show
-298.1 499.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 499.3 moveto
-12 f0
-(1215) show
-379.4 499.3 moveto
-12 f0
-( ) show
-298.1 486 moveto
-12 f2
-(See also: ) show
-344.7 486 moveto
-12 f0
-(gothic.acs.csulb.edu) show
-441.6 486 moveto
-12 f0
-( ) show
-298.1 472.7 moveto
-12 f2
-(See also: ) show
-344.7 472.7 moveto
-12 f0
-(isvpc146.isv.uit.no) show
-435.7 472.7 moveto
-12 f0
-( ) show
-18.1 459.5 moveto
-3.3 3.3 c fill
-31.5 451.4 moveto
-12 f1
-(Jesus and Mary Chain, The) show
-173.1 451.4 moveto
-12 f0
-( ) show
-31.5 438.1 moveto
-12 f2
-(1992:) show
-59.4 438.1 moveto
-12 f0
-( Reverence ) show
-116 438.1 moveto
-12 f2
-(\(EP\)) show
-138.6 438.1 moveto
-12 f0
-( ) show
-31.5 424.8 moveto
-12 f2
-(1992:) show
-59.4 424.8 moveto
-12 f0
-( Honey's Dead ) show
-31.5 411.5 moveto
-12 f2
-(1995:) show
-59.4 411.5 moveto
-12 f0
-( Hate Rock and Roll ) show
-160.3 411.5 moveto
-12 f2
-(\(comp\)) show
-194.2 411.5 moveto
-12 f0
-( ) show
-298.1 451.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 451.9 moveto
-12 f0
-(1228) show
-379.4 451.9 moveto
-12 f0
-( ) show
-298.1 438.6 moveto
-12 f2
-(See also: ) show
-344.7 438.6 moveto
-12 f0
-(american.recordings.com) show
-465.9 438.6 moveto
-12 f0
-( ) show
-18.1 398.8 moveto
-3.3 3.3 c fill
-31.5 390.7 moveto
-12 f1
-(Jones, Grace) show
-97.4 390.7 moveto
-12 f0
-( ) show
-31.5 377.4 moveto
-12 f2
-(1993:) show
-59.4 377.4 moveto
-12 f0
-( Sex Drive ) show
-113.7 377.4 moveto
-12 f2
-(\(single\)) show
-150.3 377.4 moveto
-12 f0
-( ) show
-18.1 364.7 moveto
-3.3 3.3 c fill
-31.5 356.6 moveto
-12 f1
-(Jones, Howard) show
-108.1 356.6 moveto
-12 f0
-( ) show
-31.5 343.3 moveto
-12 f2
-(1983:) show
-59.4 343.3 moveto
-12 f0
-( Humans' Lib ) show
-31.5 330 moveto
-12 f2
-(1985:) show
-59.4 330 moveto
-12 f0
-( Dream Into Action ) show
-18.1 317.3 moveto
-3.3 3.3 c fill
-31.5 309.2 moveto
-12 f1
-(Joy Division) show
-94.5 309.2 moveto
-12 f0
-( ) show
-31.5 295.9 moveto
-12 f2
-(1977-1978:) show
-87.4 295.9 moveto
-12 f0
-( Warsaw ) show
-132.7 295.9 moveto
-12 f2
-(\(comp\)) show
-166.6 295.9 moveto
-12 f0
-( ) show
-31.5 282.6 moveto
-12 f2
-(1979:) show
-59.4 282.6 moveto
-12 f0
-( Unknown Pleasures ) show
-31.5 269.3 moveto
-12 f2
-(1980:) show
-59.4 269.3 moveto
-12 f0
-( Closer ) show
-31.5 256 moveto
-12 f2
-(1980:) show
-59.4 256 moveto
-12 f0
-( Transmission / Novelty ) show
-178 256 moveto
-12 f2
-(\(single\)) show
-214.6 256 moveto
-12 f0
-( ) show
-31.5 242.7 moveto
-12 f2
-(1980:) show
-59.4 242.7 moveto
-12 f0
-( Still ) show
-31.5 229.4 moveto
-12 f2
-(1977-1980:) show
-87.4 229.4 moveto
-12 f0
-( Substance ) show
-142 229.4 moveto
-12 f2
-(\(comp\)) show
-175.9 229.4 moveto
-12 f0
-( ) show
-31.5 216.1 moveto
-12 f2
-(1995:) show
-59.4 216.1 moveto
-12 f0
-( Ceremonial: A Tribute ) show
-174.7 216.1 moveto
-12 f2
-(\(various\)) show
-218.6 216.1 moveto
-12 f0
-( ) show
-298.1 309.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 309.7 moveto
-12 f0
-(1214) show
-379.4 309.7 moveto
-12 f0
-( ) show
-298.1 296.4 moveto
-12 f2
-(See also: ) show
-344.7 296.4 moveto
-12 f0
-(www.fys.uio.no) show
-421.6 296.4 moveto
-12 f0
-( ) show
-298.1 283.1 moveto
-12 f2
-(See also: ) show
-344.7 283.1 moveto
-12 f0
-(csclub.uwaterloo.ca) show
-440 283.1 moveto
-12 f0
-( ) show
-18.1 203.4 moveto
-3.3 3.3 c fill
-31.5 195.3 moveto
-12 f1
-(King Crimson) show
-104.5 195.3 moveto
-12 f0
-( ) show
-31.5 182 moveto
-12 f2
-(1969:) show
-59.4 182 moveto
-12 f0
-( In the Court of the Crimson King ) show
-31.5 168.7 moveto
-12 f2
-(1973:) show
-59.4 168.7 moveto
-12 f0
-( Larks' Tongues in Aspic ) show
-31.5 155.4 moveto
-12 f2
-(1974:) show
-59.4 155.4 moveto
-12 f0
-( Starless and Bible Black ) show
-31.5 142.1 moveto
-12 f2
-(1981:) show
-59.4 142.1 moveto
-12 f0
-( Dicipline ) show
-31.5 128.8 moveto
-12 f2
-(1982:) show
-59.4 128.8 moveto
-12 f0
-( Beat ) show
-31.5 115.5 moveto
-12 f2
-(1984:) show
-59.4 115.5 moveto
-12 f0
-( Three of a Perfect Pair ) show
-298.1 195.8 moveto
-12 f2
-(UBL Card: ) show
-355.4 195.8 moveto
-12 f0
-(1323) show
-379.4 195.8 moveto
-12 f0
-( ) show
-18.1 102.8 moveto
-3.3 3.3 c fill
-31.5 94.7 moveto
-12 f1
-(KMFDM) show
-79.4 94.7 moveto
-12 f0
-( ) show
-31.5 81.4 moveto
-12 f2
-(1993:) show
-59.4 81.4 moveto
-12 f0
-( Angst ) show
-298.1 95.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 95.2 moveto
-12 f0
-(1452) show
-379.4 95.2 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 15 15
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-18.1 716.6 moveto
-3.3 3.3 c fill
-31.5 708.5 moveto
-12 f1
-(Kraftwerk) show
-86.1 708.5 moveto
-12 f0
-( ) show
-31.5 695.2 moveto
-12 f2
-(1977:) show
-59.4 695.2 moveto
-12 f0
-( Trans-Europe Express ) show
-172.3 695.2 moveto
-12 f2
-(\(EP\)) show
-194.9 695.2 moveto
-12 f0
-( ) show
-298.1 709 moveto
-12 f2
-(UBL Card: ) show
-355.4 709 moveto
-12 f0
-(1027) show
-379.4 709 moveto
-12 f0
-( ) show
-298.1 695.7 moveto
-12 f2
-(See also: ) show
-344.7 695.7 moveto
-12 f0
-(wwwtdb.cs.umu.se) show
-436.3 695.7 moveto
-12 f0
-( ) show
-298.1 682.4 moveto
-12 f2
-(See also: ) show
-344.7 682.4 moveto
-12 f0
-(rt66.com) show
-387.6 682.4 moveto
-12 f0
-( ) show
-18.1 669.7 moveto
-3.3 3.3 c fill
-31.5 661.6 moveto
-12 f1
-(L7) show
-45.5 661.6 moveto
-12 f0
-( ) show
-31.5 648.3 moveto
-12 f2
-(1988:) show
-59.4 648.3 moveto
-12 f0
-( L7 ) show
-31.5 635 moveto
-12 f2
-(1990:) show
-59.4 635 moveto
-12 f0
-( Smell the Magic ) show
-31.5 621.7 moveto
-12 f2
-(1992:) show
-59.4 621.7 moveto
-12 f0
-( Bricks are Heavy ) show
-31.5 608.4 moveto
-12 f2
-(1994:) show
-59.4 608.4 moveto
-12 f0
-( Hungry for Stink ) show
-298.1 662.1 moveto
-12 f2
-(UBL Card: ) show
-355.4 662.1 moveto
-12 f0
-(1998) show
-379.4 662.1 moveto
-12 f0
-( ) show
-18.1 595.7 moveto
-3.3 3.3 c fill
-31.5 587.6 moveto
-12 f1
-(Le&ae;ther Strip) show
-120.4 587.6 moveto
-12 f0
-( ) show
-31.5 574.3 moveto
-12 f2
-(1995:) show
-59.4 574.3 moveto
-12 f0
-( Legacy of Hate and Lust ) show
-18.1 561.6 moveto
-3.3 3.3 c fill
-31.5 553.5 moveto
-12 f1
-(Lemon Kittens) show
-107.8 553.5 moveto
-12 f0
-( ) show
-31.5 540.2 moveto
-12 f2
-(1978-1980:) show
-87.4 540.2 moveto
-12 f0
-( We Buy a Hammer for Daddy ) show
-300.6 554 moveto
-12 f2
-(UBL Card: ) show
-357.9 554 moveto
-12 f0
-(1746) show
-381.9 554 moveto
-12 f0
-( ) show
-18.1 527.5 moveto
-3.3 3.3 c fill
-31.5 519.4 moveto
-12 f1
-(Letters to Cleo) show
-107.4 519.4 moveto
-12 f0
-( ) show
-31.5 506.1 moveto
-12 f2
-(1994:) show
-59.4 506.1 moveto
-12 f0
-( Aurora Gory Alice ) show
-298.1 519.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 519.9 moveto
-12 f0
-(3000) show
-379.4 519.9 moveto
-12 f0
-( ) show
-18.1 493.4 moveto
-3.3 3.3 c fill
-31.5 485.3 moveto
-12 f1
-(LFO) show
-56.1 485.3 moveto
-12 f0
-( ) show
-31.5 472 moveto
-12 f2
-(1991:) show
-59.4 472 moveto
-12 f0
-( Frequencies ) show
-31.5 458.7 moveto
-12 f2
-(1996:) show
-59.4 458.7 moveto
-12 f0
-( Advance ) show
-18.1 446 moveto
-3.3 3.3 c fill
-31.5 437.9 moveto
-12 f1
-(London After Midnight) show
-152.8 437.9 moveto
-12 f0
-( ) show
-31.5 424.6 moveto
-12 f2
-(1989:) show
-59.4 424.6 moveto
-12 f0
-( Selected Scenes from the End of the World ) show
-18.1 411.9 moveto
-3.3 3.3 c fill
-31.5 403.8 moveto
-12 f1
-(Lords of Acid) show
-102.1 403.8 moveto
-12 f0
-( ) show
-31.5 390.5 moveto
-12 f2
-(1991:) show
-59.4 390.5 moveto
-12 f0
-( Rough Sex ) show
-118.4 390.5 moveto
-12 f2
-(\(single\)) show
-155 390.5 moveto
-12 f0
-( ) show
-31.5 377.2 moveto
-12 f2
-(1993:) show
-59.4 377.2 moveto
-12 f0
-( Voodoo U ) show
-31.5 363.9 moveto
-12 f2
-(1994:) show
-59.4 363.9 moveto
-12 f0
-( The Crablouse: Variations on a Species ) show
-255 363.9 moveto
-12 f2
-(\(single\)) show
-291.6 363.9 moveto
-12 f0
-( ) show
-300.2 404.3 moveto
-12 f2
-(UBL Card: ) show
-357.5 404.3 moveto
-12 f0
-(2356) show
-381.5 404.3 moveto
-12 f0
-( ) show
-18.1 351.2 moveto
-3.3 3.3 c fill
-31.5 343.1 moveto
-12 f1
-(Lords of the New Church, The) show
-188.1 343.1 moveto
-12 f0
-( ) show
-31.5 329.8 moveto
-12 f2
-(1983:) show
-59.4 329.8 moveto
-12 f0
-( Is Nothing Sacred? ) show
-18.1 317.1 moveto
-3.3 3.3 c fill
-31.5 309 moveto
-12 f1
-(Love and Rockets) show
-122.8 309 moveto
-12 f0
-( ) show
-31.5 295.7 moveto
-12 f2
-(1985:) show
-59.4 295.7 moveto
-12 f0
-( Ball of Confusion / Inside the Outside ) show
-248 295.7 moveto
-12 f2
-(\(single\)) show
-284.6 295.7 moveto
-12 f0
-( ) show
-31.5 282.4 moveto
-12 f2
-(1985:) show
-59.4 282.4 moveto
-12 f0
-( Seventh Dream of Teenage Heaven ) show
-31.5 269.1 moveto
-12 f2
-(1986:) show
-59.4 269.1 moveto
-12 f0
-( Express ) show
-31.5 255.8 moveto
-12 f2
-(1986:) show
-59.4 255.8 moveto
-12 f0
-( Kundalini Express / Lucifer Sam / Holiday on) show
-31.5 242.5 moveto
-12 f0
-(the Moon ) show
-80.8 242.5 moveto
-12 f2
-(\(single\)) show
-117.4 242.5 moveto
-12 f0
-( ) show
-31.5 229.2 moveto
-12 f2
-(1987:) show
-59.4 229.2 moveto
-12 f0
-( Earth, Sun, Moon ) show
-31.5 215.9 moveto
-12 f2
-(1989:) show
-59.4 215.9 moveto
-12 f0
-( No Big Deal ) show
-126 215.9 moveto
-12 f2
-(\(single\)) show
-162.6 215.9 moveto
-12 f0
-( ) show
-31.5 202.6 moveto
-12 f2
-(1989:) show
-59.4 202.6 moveto
-12 f0
-( Motorcycle ) show
-120.7 202.6 moveto
-12 f2
-(\(single\)) show
-157.3 202.6 moveto
-12 f0
-( ) show
-31.5 189.3 moveto
-12 f2
-(1989:) show
-59.4 189.3 moveto
-12 f0
-( Love and Rockets ) show
-31.5 176 moveto
-12 f2
-(1994:) show
-59.4 176 moveto
-12 f0
-( This Heaven ) show
-126.3 176 moveto
-12 f2
-(\(EP\)) show
-148.9 176 moveto
-12 f0
-( ) show
-31.5 162.7 moveto
-12 f2
-(1994:) show
-59.4 162.7 moveto
-12 f0
-( Body and Soul ) show
-136.7 162.7 moveto
-12 f2
-(\(EP\)) show
-159.3 162.7 moveto
-12 f0
-( ) show
-31.5 149.4 moveto
-12 f2
-(1994:) show
-59.4 149.4 moveto
-12 f0
-( Hot Trip to Heaven ) show
-31.5 136.1 moveto
-12 f2
-(1995:) show
-59.4 136.1 moveto
-12 f0
-( The Glittering Darkness ) show
-181.3 136.1 moveto
-12 f2
-(\(EP\)) show
-203.9 136.1 moveto
-12 f0
-( ) show
-31.5 122.8 moveto
-12 f2
-(1996:) show
-59.4 122.8 moveto
-12 f0
-( Sweet F. A. ) show
-298.1 309.5 moveto
-12 f2
-(UBL Card: ) show
-355.4 309.5 moveto
-12 f0
-(1215) show
-379.4 309.5 moveto
-12 f0
-( ) show
-298.1 296.2 moveto
-12 f2
-(See also: ) show
-344.7 296.2 moveto
-12 f0
-(american.recordings.com) show
-465.9 296.2 moveto
-12 f0
-( ) show
-298.1 282.9 moveto
-12 f2
-(See also: ) show
-344.7 282.9 moveto
-12 f0
-(gothic.acs.csulb.edu) show
-441.6 282.9 moveto
-12 f0
-( ) show
-18.1 110.1 moveto
-3.3 3.3 c fill
-31.5 102 moveto
-12 f1
-(Love is Colder than Death) show
-166.1 102 moveto
-12 f0
-( ) show
-31.5 88.7 moveto
-12 f2
-(1993:) show
-59.4 88.7 moveto
-12 f0
-( Oxeia ) show
-31.5 75.4 moveto
-12 f2
-(19??:) show
-59.4 75.4 moveto
-12 f0
-( Mental Traveller ) show
-pagelevel restore
-showpage
-%%Page: 16 16
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(19??:) show
-59.4 709.2 moveto
-12 f0
-( Teignmouth ) show
-18.1 696.5 moveto
-3.3 3.3 c fill
-31.5 688.4 moveto
-12 f1
-(Low Pop Suicide) show
-117.5 688.4 moveto
-12 f0
-( ) show
-31.5 675.1 moveto
-12 f2
-(1992:) show
-59.4 675.1 moveto
-12 f0
-( Disengagement ) show
-140 675.1 moveto
-12 f2
-(\(EP\)) show
-162.6 675.1 moveto
-12 f0
-( ) show
-31.5 661.8 moveto
-12 f2
-(1992:) show
-59.4 661.8 moveto
-12 f0
-( On the Cross of Commerce ) show
-31.5 648.5 moveto
-12 f2
-(1994:) show
-59.4 648.5 moveto
-12 f0
-( Kiss Your Lips ) show
-138.7 648.5 moveto
-12 f2
-(\(remixes\)) show
-184 648.5 moveto
-12 f0
-( ) show
-31.5 635.2 moveto
-12 f2
-(1995:) show
-59.4 635.2 moveto
-12 f0
-( The Death of Excellence ) show
-306.4 688.9 moveto
-12 f2
-(UBL Card: ) show
-363.7 688.9 moveto
-12 f0
-(1984) show
-387.7 688.9 moveto
-12 f0
-( ) show
-18.1 622.5 moveto
-3.3 3.3 c fill
-31.5 614.4 moveto
-12 f1
-(Luscious Jackson) show
-121.1 614.4 moveto
-12 f0
-( ) show
-31.5 601.1 moveto
-12 f2
-(1992:) show
-59.4 601.1 moveto
-12 f0
-( In Search of Manny ) show
-31.5 587.8 moveto
-12 f2
-(1994:) show
-59.4 587.8 moveto
-12 f0
-( Natural Ingredients ) show
-18.1 575.1 moveto
-3.3 3.3 c fill
-31.5 567 moveto
-12 f1
-(Lush) show
-57.5 567 moveto
-12 f0
-( ) show
-31.5 553.7 moveto
-12 f2
-(1990:) show
-59.4 553.7 moveto
-12 f0
-( Gala ) show
-31.5 540.4 moveto
-12 f2
-(1992:) show
-59.4 540.4 moveto
-12 f0
-( Spooky ) show
-31.5 527.1 moveto
-12 f2
-(1994:) show
-59.4 527.1 moveto
-12 f0
-( Split ) show
-298.1 567.5 moveto
-12 f2
-(UBL Card: ) show
-355.4 567.5 moveto
-12 f0
-(2359) show
-379.4 567.5 moveto
-12 f0
-( ) show
-298.1 554.2 moveto
-12 f2
-(See also: ) show
-344.7 554.2 moveto
-12 f0
-(isvpc146.isv.uit.no) show
-435.7 554.2 moveto
-12 f0
-( ) show
-18.1 514.4 moveto
-3.3 3.3 c fill
-31.5 506.3 moveto
-12 f1
-(Lwin, Annabella) show
-116.8 506.3 moveto
-12 f0
-( ) show
-31.5 493 moveto
-12 f2
-(1986:) show
-59.4 493 moveto
-12 f0
-( War Boys ) show
-113.7 493 moveto
-12 f2
-(\(single\)) show
-150.3 493 moveto
-12 f0
-( ) show
-31.5 479.7 moveto
-12 f2
-(1994:) show
-59.4 479.7 moveto
-12 f0
-( Car Sex ) show
-103.7 479.7 moveto
-12 f2
-(\(EP\)) show
-126.3 479.7 moveto
-12 f0
-( ) show
-300.5 506.8 moveto
-12 f2
-(UBL Card: ) show
-357.8 506.8 moveto
-12 f0
-(2301) show
-381.8 506.8 moveto
-12 f0
-( ) show
-18.1 467 moveto
-3.3 3.3 c fill
-31.5 458.9 moveto
-12 f1
-(Lycea) show
-62.1 458.9 moveto
-12 f0
-( ) show
-31.5 445.6 moveto
-12 f2
-(1993:) show
-59.4 445.6 moveto
-12 f0
-( A Day in the Stark Corner ) show
-298.1 459.4 moveto
-12 f2
-(See also: ) show
-344.7 459.4 moveto
-12 f0
-(www.projekt.com) show
-431.3 459.4 moveto
-12 f0
-( ) show
-18.1 432.9 moveto
-3.3 3.3 c fill
-31.5 424.8 moveto
-12 f1
-(M) show
-42.8 424.8 moveto
-12 f0
-( ) show
-31.5 411.5 moveto
-12 f2
-(1979:) show
-59.4 411.5 moveto
-12 f0
-( Pop Musik ) show
-117.7 411.5 moveto
-12 f2
-(\(7inch\)) show
-152.3 411.5 moveto
-12 f0
-( ) show
-18.1 398.8 moveto
-3.3 3.3 c fill
-31.5 390.7 moveto
-12 f1
-(Machines of Loving Grace) show
-167.1 390.7 moveto
-12 f0
-( ) show
-31.5 377.4 moveto
-12 f2
-(1991:) show
-59.4 377.4 moveto
-12 f0
-( Rite of Shiva ) show
-128.7 377.4 moveto
-12 f2
-(\(single\)) show
-165.3 377.4 moveto
-12 f0
-( ) show
-31.5 364.1 moveto
-12 f2
-(1991:) show
-59.4 364.1 moveto
-12 f0
-( Machines of Loving Grace ) show
-31.5 350.8 moveto
-12 f2
-(1992:) show
-59.4 350.8 moveto
-12 f0
-( Burn Like Brilliant Trash ) show
-187.7 350.8 moveto
-12 f2
-(\(EP\)) show
-210.3 350.8 moveto
-12 f0
-( ) show
-31.5 337.5 moveto
-12 f2
-(1993:) show
-59.4 337.5 moveto
-12 f0
-( Concentration ) show
-31.5 324.2 moveto
-12 f2
-(1995:) show
-59.4 324.2 moveto
-12 f0
-( Gilt ) show
-298.1 391.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 391.2 moveto
-12 f0
-(1219) show
-379.4 391.2 moveto
-12 f0
-( ) show
-298.1 377.9 moveto
-12 f2
-(See also: ) show
-344.7 377.9 moveto
-12 f0
-(www.nando.net) show
-420.6 377.9 moveto
-12 f0
-( ) show
-18.1 311.5 moveto
-3.3 3.3 c fill
-31.5 303.4 moveto
-12 f1
-(M|A|R|R|S) show
-86 303.4 moveto
-12 f0
-( ) show
-31.5 290.1 moveto
-12 f2
-(1987:) show
-59.4 290.1 moveto
-12 f0
-( Pump Up the Volume / Anitina ) show
-215.7 290.1 moveto
-12 f2
-(\(single\)) show
-252.3 290.1 moveto
-12 f0
-( ) show
-18.1 277.4 moveto
-3.3 3.3 c fill
-31.5 269.3 moveto
-12 f1
-(Mallinder, Stephen) show
-130.1 269.3 moveto
-12 f0
-( ) show
-31.5 256 moveto
-12 f2
-(1982:) show
-59.4 256 moveto
-12 f0
-( Pow Wow ) show
-299.9 269.8 moveto
-12 f2
-(UBL Card: ) show
-357.2 269.8 moveto
-12 f0
-(2307) show
-381.2 269.8 moveto
-12 f0
-( ) show
-18.1 243.3 moveto
-3.3 3.3 c fill
-31.5 235.2 moveto
-12 f1
-(Manufacture) show
-98.8 235.2 moveto
-12 f0
-( ) show
-31.5 221.9 moveto
-12 f2
-(1988:) show
-59.4 221.9 moveto
-12 f0
-( Terrorvision ) show
-18.1 209.2 moveto
-3.3 3.3 c fill
-31.5 201.1 moveto
-12 f1
-(March Violets, The) show
-130.4 201.1 moveto
-12 f0
-( ) show
-31.5 187.8 moveto
-12 f2
-(1984:) show
-59.4 187.8 moveto
-12 f0
-( Natural History ) show
-31.5 174.5 moveto
-12 f2
-(1982-1984:) show
-87.4 174.5 moveto
-12 f0
-( The Botanic Verses ) show
-188 174.5 moveto
-12 f2
-(\(comp\)) show
-221.9 174.5 moveto
-12 f0
-( ) show
-31.5 161.2 moveto
-12 f2
-(1983-1985:) show
-87.4 161.2 moveto
-12 f0
-( Electric Shades ) show
-167.7 161.2 moveto
-12 f2
-(\(comp\)) show
-201.6 161.2 moveto
-12 f0
-( ) show
-31.5 147.9 moveto
-12 f2
-(1985:) show
-59.4 147.9 moveto
-12 f0
-( Deep ) show
-90.7 147.9 moveto
-12 f2
-(\(EP\)) show
-113.3 147.9 moveto
-12 f0
-( ) show
-31.5 134.6 moveto
-12 f2
-(1986:) show
-59.4 134.6 moveto
-12 f0
-( A Turn to the Sky / Never Look Back / Deep /) show
-31.5 121.3 moveto
-12 f0
-(Rebirth ) show
-70.5 121.3 moveto
-12 f2
-(\(single\)) show
-107.1 121.3 moveto
-12 f0
-( ) show
-298.1 201.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 201.6 moveto
-12 f0
-(1114) show
-379.4 201.6 moveto
-12 f0
-( ) show
-298.1 188.3 moveto
-12 f2
-(See also: ) show
-344.7 188.3 moveto
-12 f0
-(www.cm.cf.ac.uk) show
-429.3 188.3 moveto
-12 f0
-( ) show
-18.1 108.6 moveto
-3.3 3.3 c fill
-31.5 100.5 moveto
-12 f1
-(Martha and the Muffins) show
-155.8 100.5 moveto
-12 f0
-( ) show
-31.5 87.2 moveto
-12 f2
-(1980-1984:) show
-87.4 87.2 moveto
-12 f0
-( Far Away in Time ) show
-181.7 87.2 moveto
-12 f2
-(\(comp\)) show
-215.6 87.2 moveto
-12 f0
-( ) show
-300.6 101 moveto
-12 f2
-(UBL Card: ) show
-357.9 101 moveto
-12 f0
-(2529) show
-381.9 101 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 17 17
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-18.1 716.6 moveto
-3.3 3.3 c fill
-31.5 708.5 moveto
-12 f1
-(Mary's Danish) show
-107.8 708.5 moveto
-12 f0
-( ) show
-31.5 695.2 moveto
-12 f2
-(1991:) show
-59.4 695.2 moveto
-12 f0
-( Circa ) show
-298.1 709 moveto
-12 f2
-(UBL Card: ) show
-355.4 709 moveto
-12 f0
-(3727) show
-379.4 709 moveto
-12 f0
-( ) show
-18.1 682.5 moveto
-3.3 3.3 c fill
-31.5 674.4 moveto
-12 f1
-(MC 900 Foot Jesus) show
-129.1 674.4 moveto
-12 f0
-( ) show
-31.5 661.1 moveto
-12 f2
-(1989:) show
-59.4 661.1 moveto
-12 f0
-( Hell With the Lid Off ) show
-31.5 647.8 moveto
-12 f2
-(1989:) show
-59.4 647.8 moveto
-12 f0
-( UFOs Are Real ) show
-140 647.8 moveto
-12 f2
-(\(EP\)) show
-162.6 647.8 moveto
-12 f0
-( ) show
-31.5 634.5 moveto
-12 f2
-(1990:) show
-59.4 634.5 moveto
-12 f0
-( Welcome to My Dream ) show
-31.5 621.2 moveto
-12 f2
-(1990:) show
-59.4 621.2 moveto
-12 f0
-( Killer Inside Me ) show
-144.7 621.2 moveto
-12 f2
-(\(EP\)) show
-167.3 621.2 moveto
-12 f0
-( ) show
-298.1 674.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 674.9 moveto
-12 f0
-(1229) show
-379.4 674.9 moveto
-12 f0
-( ) show
-298.1 661.6 moveto
-12 f2
-(See also: ) show
-344.7 661.6 moveto
-12 f0
-(american.recordings.com) show
-465.9 661.6 moveto
-12 f0
-( ) show
-18.1 608.5 moveto
-3.3 3.3 c fill
-31.5 600.4 moveto
-12 f1
-(McLachlan, Sarah) show
-126.8 600.4 moveto
-12 f0
-( ) show
-31.5 587.1 moveto
-12 f2
-(1992:) show
-59.4 587.1 moveto
-12 f0
-( Into the Fire ) show
-124.7 587.1 moveto
-12 f2
-(\(single\)) show
-161.3 587.1 moveto
-12 f0
-( ) show
-302.9 600.9 moveto
-12 f2
-(UBL Card: ) show
-360.2 600.9 moveto
-12 f0
-(1389) show
-384.2 600.9 moveto
-12 f0
-( ) show
-18.1 574.4 moveto
-3.3 3.3 c fill
-31.5 566.3 moveto
-12 f1
-(Meat Beat Manifesto) show
-138.8 566.3 moveto
-12 f0
-( ) show
-31.5 553 moveto
-12 f2
-(1988:) show
-59.4 553 moveto
-12 f0
-( Armed Audio Warfare ) show
-31.5 539.7 moveto
-12 f2
-(1990:) show
-59.4 539.7 moveto
-12 f0
-( Dog Star Man ) show
-133.3 539.7 moveto
-12 f2
-(\(EP\)) show
-155.9 539.7 moveto
-12 f0
-( ) show
-31.5 526.4 moveto
-12 f2
-(1990:) show
-59.4 526.4 moveto
-12 f0
-( 99% ) show
-31.5 513.1 moveto
-12 f2
-(1990:) show
-59.4 513.1 moveto
-12 f0
-( Psyche Out ) show
-120.3 513.1 moveto
-12 f2
-(\(EP\)) show
-142.9 513.1 moveto
-12 f0
-( ) show
-31.5 499.8 moveto
-12 f2
-(1990:) show
-59.4 499.8 moveto
-12 f0
-( Now ) show
-88.7 499.8 moveto
-12 f2
-(\(EP\)) show
-111.3 499.8 moveto
-12 f0
-( ) show
-31.5 486.5 moveto
-12 f2
-(1992:) show
-59.4 486.5 moveto
-12 f0
-( Satryicon ) show
-31.5 473.2 moveto
-12 f2
-(1993:) show
-59.4 473.2 moveto
-12 f0
-( Peel Session ) show
-125.7 473.2 moveto
-12 f2
-(\(EP\)) show
-148.3 473.2 moveto
-12 f0
-( ) show
-300 566.8 moveto
-12 f2
-(UBL Card: ) show
-357.3 566.8 moveto
-12 f0
-(3626) show
-381.3 566.8 moveto
-12 f0
-( ) show
-18.1 460.5 moveto
-3.3 3.3 c fill
-31.5 452.4 moveto
-12 f1
-(Medicine) show
-78.8 452.4 moveto
-12 f0
-( ) show
-31.5 439.1 moveto
-12 f2
-(1993:) show
-59.4 439.1 moveto
-12 f0
-( The Buried Life ) show
-31.5 425.8 moveto
-12 f2
-(1994:) show
-59.4 425.8 moveto
-12 f0
-( Shot Forth Self Living ) show
-298.1 452.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 452.9 moveto
-12 f0
-(1432) show
-379.4 452.9 moveto
-12 f0
-( ) show
-298.1 439.6 moveto
-12 f2
-(See also: ) show
-344.7 439.6 moveto
-12 f0
-(kspace.com) show
-401 439.6 moveto
-12 f0
-( ) show
-18.1 413.1 moveto
-3.3 3.3 c fill
-31.5 405 moveto
-12 f1
-(Mephisto Walz) show
-109.1 405 moveto
-12 f0
-( ) show
-31.5 391.7 moveto
-12 f2
-(1986-1992:) show
-87.4 391.7 moveto
-12 f0
-( Crocosmia ) show
-31.5 378.4 moveto
-12 f2
-(1993:) show
-59.4 378.4 moveto
-12 f0
-( Terra-Regina ) show
-129.3 378.4 moveto
-12 f2
-(\(comp\)) show
-163.2 378.4 moveto
-12 f0
-( ) show
-31.5 365.1 moveto
-12 f2
-(1994:) show
-59.4 365.1 moveto
-12 f0
-( The Eternal Deep ) show
-31.5 351.8 moveto
-12 f2
-(1995:) show
-59.4 351.8 moveto
-12 f0
-( Thalia ) show
-18.1 339.1 moveto
-3.3 3.3 c fill
-31.5 331 moveto
-12 f1
-(Midnight Oil) show
-98.5 331 moveto
-12 f0
-( ) show
-31.5 317.7 moveto
-12 f2
-(1979:) show
-59.4 317.7 moveto
-12 f0
-( Head Injuries ) show
-31.5 304.4 moveto
-12 f2
-(1981:) show
-59.4 304.4 moveto
-12 f0
-( Place without a Postcard ) show
-31.5 291.1 moveto
-12 f2
-(1983:) show
-59.4 291.1 moveto
-12 f0
-( 10, 9, 8, 7, 6, 5, 4, 3, 2, 1... ) show
-31.5 277.8 moveto
-12 f2
-(1985:) show
-59.4 277.8 moveto
-12 f0
-( Red Sails in the Sunset ) show
-298.1 331.5 moveto
-12 f2
-(UBL Card: ) show
-355.4 331.5 moveto
-12 f0
-(1102) show
-379.4 331.5 moveto
-12 f0
-( ) show
-298.1 318.2 moveto
-12 f2
-(See also: ) show
-344.7 318.2 moveto
-12 f0
-(www.stevens-tech.edu) show
-453.3 318.2 moveto
-12 f0
-( ) show
-18.1 265.1 moveto
-3.3 3.3 c fill
-31.5 257 moveto
-12 f1
-(Miller, Roger) show
-100.8 257 moveto
-12 f0
-( ) show
-31.5 243.7 moveto
-12 f2
-(1987:) show
-59.4 243.7 moveto
-12 f0
-( Maximum Electric Piano ) show
-18.1 231 moveto
-3.3 3.3 c fill
-31.5 222.9 moveto
-12 f1
-(Ministry) show
-76.1 222.9 moveto
-12 f0
-( ) show
-31.5 209.6 moveto
-12 f2
-(1983:) show
-59.4 209.6 moveto
-12 f0
-( With Sympathy ) show
-31.5 196.3 moveto
-12 f2
-(1984:) show
-59.4 196.3 moveto
-12 f0
-( Halloween Remix / The Nature of Outtakes) show
-31.5 183 moveto
-12 f2
-(\(EP\)) show
-54.1 183 moveto
-12 f0
-( ) show
-31.5 169.7 moveto
-12 f2
-(1981-1984:) show
-87.4 169.7 moveto
-12 f0
-( various singles ) show
-31.5 156.4 moveto
-12 f2
-(1985:) show
-59.4 156.4 moveto
-12 f0
-( Cold Life ) show
-31.5 143.1 moveto
-12 f2
-(1985:) show
-59.4 143.1 moveto
-12 f0
-( Over the Shoulder / Isle of Man ) show
-218 143.1 moveto
-12 f2
-(\(EP\)) show
-240.6 143.1 moveto
-12 f0
-( ) show
-31.5 129.8 moveto
-12 f2
-(1986:) show
-59.4 129.8 moveto
-12 f0
-( Twitch ) show
-31.5 116.5 moveto
-12 f2
-(1988:) show
-59.4 116.5 moveto
-12 f0
-( 12 Inch Singles ) show
-140 116.5 moveto
-12 f2
-(\(comp\)) show
-173.9 116.5 moveto
-12 f0
-( ) show
-31.5 103.2 moveto
-12 f2
-(1988:) show
-59.4 103.2 moveto
-12 f0
-( The Land of Rape and Honey ) show
-31.5 89.9 moveto
-12 f2
-(1988:) show
-59.4 89.9 moveto
-12 f0
-( Stigmata / Tonight we Murder ) show
-211.3 89.9 moveto
-12 f2
-(\(EP\)) show
-233.9 89.9 moveto
-12 f0
-( ) show
-31.5 76.6 moveto
-12 f2
-(1989:) show
-59.4 76.6 moveto
-12 f0
-( The Mind is a Terrible Thing to Taste ) show
-298.1 223.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 223.4 moveto
-12 f0
-(1100) show
-379.4 223.4 moveto
-12 f0
-( ) show
-298.1 210.1 moveto
-12 f2
-(See also: ) show
-344.7 210.1 moveto
-12 f0
-(csclub.uwaterloo.ca) show
-440 210.1 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 18 18
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1991:) show
-59.4 709.2 moveto
-12 f0
-( Jesus Built my Hotrod ) show
-173 709.2 moveto
-12 f2
-(\(EP\)) show
-195.6 709.2 moveto
-12 f0
-( ) show
-31.5 695.9 moveto
-12 f2
-(1992:) show
-59.4 695.9 moveto
-12 f0
-( Psalm 69 ) show
-18.1 683.2 moveto
-3.3 3.3 c fill
-31.5 675.1 moveto
-12 f1
-(Miranda Sex Garden) show
-140.1 675.1 moveto
-12 f0
-( ) show
-31.5 661.8 moveto
-12 f2
-(1991:) show
-59.4 661.8 moveto
-12 f0
-( Gush Forth my Tears ) show
-31.5 648.5 moveto
-12 f2
-(1991:) show
-59.4 648.5 moveto
-12 f0
-( Madra ) show
-31.5 635.2 moveto
-12 f2
-(1992:) show
-59.4 635.2 moveto
-12 f0
-( Iris ) show
-31.5 621.9 moveto
-12 f2
-(1993:) show
-59.4 621.9 moveto
-12 f0
-( Suspiria ) show
-31.5 608.6 moveto
-12 f2
-(1994:) show
-59.4 608.6 moveto
-12 f0
-( Fairytales of Slavery ) show
-298.1 675.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 675.6 moveto
-12 f0
-(3007) show
-379.4 675.6 moveto
-12 f0
-( ) show
-298.1 662.3 moveto
-12 f2
-(See also: ) show
-344.7 662.3 moveto
-12 f0
-(sksol1.physics.sunysb.edu) show
-471 662.3 moveto
-12 f0
-( ) show
-18.1 595.9 moveto
-3.3 3.3 c fill
-31.5 587.8 moveto
-12 f1
-(Missing Persons) show
-114.5 587.8 moveto
-12 f0
-( ) show
-31.5 574.5 moveto
-12 f2
-(1982:) show
-59.4 574.5 moveto
-12 f0
-( Missing Persons ) show
-144.4 574.5 moveto
-12 f2
-(\(EP\)) show
-167 574.5 moveto
-12 f0
-( ) show
-31.5 561.2 moveto
-12 f2
-(1982:) show
-59.4 561.2 moveto
-12 f0
-( Spring Session M ) show
-31.5 547.9 moveto
-12 f2
-(1984:) show
-59.4 547.9 moveto
-12 f0
-( Rhyme & Reason ) show
-31.5 534.6 moveto
-12 f2
-(1982-1984:) show
-87.4 534.6 moveto
-12 f0
-( Best of ) show
-127.7 534.6 moveto
-12 f2
-(\(comp\)) show
-161.6 534.6 moveto
-12 f0
-( ) show
-18.1 521.9 moveto
-3.3 3.3 c fill
-31.5 513.8 moveto
-12 f1
-(Mistle Thrush) show
-104.5 513.8 moveto
-12 f0
-( ) show
-31.5 500.5 moveto
-12 f2
-(199?:) show
-59.4 500.5 moveto
-12 f0
-( Silt ) show
-31.5 487.2 moveto
-12 f2
-(1994:) show
-59.4 487.2 moveto
-12 f0
-( Agus Am\340rach ) show
-18.1 474.5 moveto
-3.3 3.3 c fill
-31.5 466.4 moveto
-12 f1
-(Mission, The) show
-97.5 466.4 moveto
-12 f0
-( ) show
-31.5 453.1 moveto
-12 f2
-(1986:) show
-59.4 453.1 moveto
-12 f0
-( God's Own Medicine ) show
-31.5 439.8 moveto
-12 f2
-(1987:) show
-59.4 439.8 moveto
-12 f0
-( the First Chapter ) show
-298.1 466.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 466.9 moveto
-12 f0
-(2045) show
-379.4 466.9 moveto
-12 f0
-( ) show
-18.1 427.1 moveto
-3.3 3.3 c fill
-31.5 419 moveto
-12 f1
-(Mission of Burma) show
-123.5 419 moveto
-12 f0
-( ) show
-31.5 405.7 moveto
-12 f2
-(1987:) show
-59.4 405.7 moveto
-12 f0
-( Forget ) show
-18.1 393 moveto
-3.3 3.3 c fill
-31.5 384.9 moveto
-12 f1
-(Morissette, Alanis) show
-124.1 384.9 moveto
-12 f0
-( ) show
-31.5 371.6 moveto
-12 f2
-(1995:) show
-59.4 371.6 moveto
-12 f0
-( Jagged Little Pill ) show
-301 385.4 moveto
-12 f2
-(UBL Card: ) show
-358.3 385.4 moveto
-12 f0
-(3127) show
-382.3 385.4 moveto
-12 f0
-( ) show
-18.1 358.9 moveto
-3.3 3.3 c fill
-31.5 350.8 moveto
-12 f1
-(Morrison, Patricia) show
-126.8 350.8 moveto
-12 f0
-( ) show
-31.5 337.5 moveto
-12 f2
-(1994:) show
-59.4 337.5 moveto
-12 f0
-( Reflect on This ) show
-298.8 351.3 moveto
-12 f2
-(UBL Card: ) show
-356.1 351.3 moveto
-12 f0
-(1062) show
-380.1 351.3 moveto
-12 f0
-( ) show
-18.1 324.8 moveto
-3.3 3.3 c fill
-31.5 316.7 moveto
-12 f1
-(Moyet, Allison) show
-106.1 316.7 moveto
-12 f0
-( ) show
-31.5 303.4 moveto
-12 f2
-(1985:) show
-59.4 303.4 moveto
-12 f0
-( ALF ) show
-298.1 317.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 317.2 moveto
-12 f0
-(3410) show
-379.4 317.2 moveto
-12 f0
-( ) show
-298.1 303.9 moveto
-12 f2
-(See also: ) show
-344.7 303.9 moveto
-12 f0
-(rt66.com) show
-387.6 303.9 moveto
-12 f0
-( ) show
-18.1 290.7 moveto
-3.3 3.3 c fill
-31.5 282.6 moveto
-12 f1
-(Murder Inc.) show
-94.8 282.6 moveto
-12 f0
-( ) show
-31.5 269.3 moveto
-12 f2
-(1992:) show
-59.4 269.3 moveto
-12 f0
-( Murder Inc. ) show
-18.1 256.6 moveto
-3.3 3.3 c fill
-31.5 248.5 moveto
-12 f1
-(Mussolini Headkick) show
-133.8 248.5 moveto
-12 f0
-( ) show
-31.5 235.2 moveto
-12 f2
-(1990:) show
-59.4 235.2 moveto
-12 f0
-( Blood on the Flag ) show
-18.1 222.5 moveto
-3.3 3.3 c fill
-31.5 214.4 moveto
-12 f1
-(Murphy, Peter) show
-107.4 214.4 moveto
-12 f0
-( ) show
-31.5 201.1 moveto
-12 f2
-(1986:) show
-59.4 201.1 moveto
-12 f0
-( Should the World Fail to Fall Apart ) show
-298.1 214.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 214.9 moveto
-12 f0
-(1235) show
-379.4 214.9 moveto
-12 f0
-( ) show
-298.1 201.6 moveto
-12 f2
-(See also: ) show
-344.7 201.6 moveto
-12 f0
-(gothic.acs.csulb.edu) show
-441.6 201.6 moveto
-12 f0
-( ) show
-298.1 188.3 moveto
-12 f2
-(See also: ) show
-344.7 188.3 moveto
-12 f0
-(isvpc146.isv.uit.no) show
-435.7 188.3 moveto
-12 f0
-( ) show
-18.1 175.6 moveto
-3.3 3.3 c fill
-31.5 167.5 moveto
-12 f1
-(My Bloody Valentine) show
-140.1 167.5 moveto
-12 f0
-( ) show
-31.5 154.2 moveto
-12 f2
-(1988:) show
-59.4 154.2 moveto
-12 f0
-( Isn't Anything ) show
-31.5 140.9 moveto
-12 f2
-(1991:) show
-59.4 140.9 moveto
-12 f0
-( Loveless ) show
-299.1 168 moveto
-12 f2
-(UBL Card: ) show
-356.4 168 moveto
-12 f0
-(1912) show
-380.4 168 moveto
-12 f0
-( ) show
-18.1 128.2 moveto
-3.3 3.3 c fill
-31.5 120.1 moveto
-12 f1
-(My Life with the Thrill Kill Kult) show
-198.8 120.1 moveto
-12 f0
-( ) show
-31.5 106.8 moveto
-12 f2
-(1988:) show
-59.4 106.8 moveto
-12 f0
-( I See Good Spirits and I See Bad Spirits ) show
-31.5 93.5 moveto
-12 f2
-(1989:) show
-59.4 93.5 moveto
-12 f0
-( K00Ler than Jesus ) show
-31.5 80.2 moveto
-12 f2
-(1990:) show
-59.4 80.2 moveto
-12 f0
-( Confessions of a Knife... ) show
-302.9 120.6 moveto
-12 f2
-(UBL Card: ) show
-360.2 120.6 moveto
-12 f0
-(3478) show
-384.2 120.6 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 19 19
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1990:) show
-59.4 709.2 moveto
-12 f0
-( Swine & Roses / Naive \(KMFDM\) ) show
-233.7 709.2 moveto
-12 f2
-(\(single\)) show
-270.3 709.2 moveto
-12 f0
-( ) show
-18.1 696.5 moveto
-3.3 3.3 c fill
-31.5 688.4 moveto
-12 f1
-(Neither/Neither World) show
-148.4 688.4 moveto
-12 f0
-( ) show
-31.5 675.1 moveto
-12 f2
-(1994:) show
-59.4 675.1 moveto
-12 f0
-( Tales of True Crime ) show
-18.1 662.4 moveto
-3.3 3.3 c fill
-31.5 654.3 moveto
-12 f1
-(Neotek) show
-67.4 654.3 moveto
-12 f0
-( ) show
-31.5 641 moveto
-12 f2
-(1995:) show
-59.4 641 moveto
-12 f0
-( Brain over Muscle ) show
-18.1 628.3 moveto
-3.3 3.3 c fill
-31.5 620.2 moveto
-12 f1
-(New Fast Automatic Daffodils) show
-185.8 620.2 moveto
-12 f0
-( ) show
-31.5 606.9 moveto
-12 f2
-(1991:) show
-59.4 606.9 moveto
-12 f0
-( Pigeonhole ) show
-31.5 593.6 moveto
-12 f2
-(1992:) show
-59.4 593.6 moveto
-12 f0
-( Bong ) show
-18.1 580.9 moveto
-3.3 3.3 c fill
-31.5 572.8 moveto
-12 f1
-(New Order) show
-89.1 572.8 moveto
-12 f0
-( ) show
-31.5 559.5 moveto
-12 f2
-(1981:) show
-59.4 559.5 moveto
-12 f0
-( Movement ) show
-31.5 546.2 moveto
-12 f2
-(1981:) show
-59.4 546.2 moveto
-12 f0
-( Temptation / Hurt ) show
-152 546.2 moveto
-12 f2
-(\(single\)) show
-188.6 546.2 moveto
-12 f0
-( ) show
-31.5 532.9 moveto
-12 f2
-(1982:) show
-59.4 532.9 moveto
-12 f0
-( Factus 8 ) show
-31.5 519.6 moveto
-12 f2
-(1984:) show
-59.4 519.6 moveto
-12 f0
-( Power, Corruption, and Lies ) show
-31.5 506.3 moveto
-12 f2
-(1984:) show
-59.4 506.3 moveto
-12 f0
-( Blue Monday ) show
-131 506.3 moveto
-12 f2
-(\(single\)) show
-167.6 506.3 moveto
-12 f0
-( ) show
-31.5 493 moveto
-12 f2
-(1985:) show
-59.4 493 moveto
-12 f0
-( The Perfect Kiss ) show
-145.3 493 moveto
-12 f2
-(\(single\)) show
-181.9 493 moveto
-12 f0
-( ) show
-31.5 479.7 moveto
-12 f2
-(1985:) show
-59.4 479.7 moveto
-12 f0
-( Confusion ) show
-115.4 479.7 moveto
-12 f2
-(\(single\)) show
-152 479.7 moveto
-12 f0
-( ) show
-31.5 466.4 moveto
-12 f2
-(1985:) show
-59.4 466.4 moveto
-12 f0
-( Low Life ) show
-31.5 453.1 moveto
-12 f2
-(1983-5:) show
-69.4 453.1 moveto
-12 f0
-( various singles ) show
-31.5 439.8 moveto
-12 f2
-(1986:) show
-59.4 439.8 moveto
-12 f0
-( Brotherhood ) show
-298.1 573.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 573.3 moveto
-12 f0
-(1126) show
-379.4 573.3 moveto
-12 f0
-( ) show
-298.1 560 moveto
-12 f2
-(See also: ) show
-344.7 560 moveto
-12 f0
-(topquark.cecer.army.mil) show
-462.3 560 moveto
-12 f0
-( ) show
-18.1 427.1 moveto
-3.3 3.3 c fill
-31.5 419 moveto
-12 f1
-(Nine Inch Nails) show
-110.8 419 moveto
-12 f0
-( ) show
-31.5 405.7 moveto
-12 f2
-(1989:) show
-59.4 405.7 moveto
-12 f0
-( Pretty Hate Machine ) show
-31.5 392.4 moveto
-12 f2
-(1989:) show
-59.4 392.4 moveto
-12 f0
-( Head Like a Hole ) show
-150.3 392.4 moveto
-12 f2
-(\(remixes\)) show
-195.6 392.4 moveto
-12 f0
-( ) show
-31.5 379.1 moveto
-12 f2
-(1990:) show
-59.4 379.1 moveto
-12 f0
-( Sin ) show
-81.4 379.1 moveto
-12 f2
-(\(remixes\)) show
-126.7 379.1 moveto
-12 f0
-( ) show
-31.5 365.8 moveto
-12 f2
-(1992:) show
-59.4 365.8 moveto
-12 f0
-( Broken ) show
-100.7 365.8 moveto
-12 f2
-(\(EP\)) show
-123.3 365.8 moveto
-12 f0
-( ) show
-31.5 352.5 moveto
-12 f2
-(1992:) show
-59.4 352.5 moveto
-12 f0
-( Fixed ) show
-92.7 352.5 moveto
-12 f2
-(\(remixes\)) show
-138 352.5 moveto
-12 f0
-( ) show
-31.5 339.2 moveto
-12 f2
-(1994:) show
-59.4 339.2 moveto
-12 f0
-( March of the Pigs ) show
-151 339.2 moveto
-12 f2
-(\(EP\)) show
-173.6 339.2 moveto
-12 f0
-( ) show
-31.5 325.9 moveto
-12 f2
-(1994:) show
-59.4 325.9 moveto
-12 f0
-( The Downward Spiral ) show
-31.5 312.6 moveto
-12 f2
-(1994:) show
-59.4 312.6 moveto
-12 f0
-( Closer to God ) show
-132.7 312.6 moveto
-12 f2
-(\(EP\)) show
-155.3 312.6 moveto
-12 f0
-( ) show
-31.5 299.3 moveto
-12 f2
-(1994:) show
-59.4 299.3 moveto
-12 f0
-( Closer \(Further Away\) ) show
-174.7 299.3 moveto
-12 f2
-(\(EP\)) show
-197.3 299.3 moveto
-12 f0
-( ) show
-31.5 286 moveto
-12 f2
-(1994:) show
-59.4 286 moveto
-12 f0
-( Further Down the Spiral ) show
-182.3 286 moveto
-12 f2
-(\(remixes\)) show
-227.6 286 moveto
-12 f0
-( ) show
-298.1 419.5 moveto
-12 f2
-(UBL Card: ) show
-355.4 419.5 moveto
-12 f0
-(1046) show
-379.4 419.5 moveto
-12 f0
-( ) show
-298.1 406.2 moveto
-12 f2
-(See also: ) show
-344.7 406.2 moveto
-12 f0
-(www.scri.fsu.edu) show
-429 406.2 moveto
-12 f0
-( ) show
-298.1 392.9 moveto
-12 f2
-(See also: ) show
-344.7 392.9 moveto
-12 f0
-(metaverse.com) show
-417 392.9 moveto
-12 f0
-( ) show
-18.1 273.3 moveto
-3.3 3.3 c fill
-31.5 265.2 moveto
-12 f1
-(Nirvana) show
-73.5 265.2 moveto
-12 f0
-( ) show
-31.5 251.9 moveto
-12 f2
-(1991:) show
-59.4 251.9 moveto
-12 f0
-( Nevermind ) show
-298.1 265.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 265.7 moveto
-12 f0
-(1052) show
-379.4 265.7 moveto
-12 f0
-( ) show
-298.1 252.4 moveto
-12 f2
-(See also: ) show
-344.7 252.4 moveto
-12 f0
-(www.ludd.luth.se) show
-429.6 252.4 moveto
-12 f0
-( ) show
-298.1 239.1 moveto
-12 f2
-(See also: ) show
-344.7 239.1 moveto
-12 f0
-(home.earthlink.net) show
-434.7 239.1 moveto
-12 f0
-( ) show
-18.1 226.4 moveto
-3.3 3.3 c fill
-31.5 218.3 moveto
-12 f1
-(Nitzer Ebb) show
-87.8 218.3 moveto
-12 f0
-( ) show
-31.5 205 moveto
-12 f2
-(1987:) show
-59.4 205 moveto
-12 f0
-( That Total Age ) show
-31.5 191.7 moveto
-12 f2
-(1987:) show
-59.4 191.7 moveto
-12 f0
-( Warsaw Ghetto ) show
-140.3 191.7 moveto
-12 f2
-(\(EP\)) show
-162.9 191.7 moveto
-12 f0
-( ) show
-31.5 178.4 moveto
-12 f2
-(1987:) show
-59.4 178.4 moveto
-12 f0
-( So Bright So Strong ) show
-162.4 178.4 moveto
-12 f2
-(\(remixes\)) show
-207.7 178.4 moveto
-12 f0
-( ) show
-31.5 165.1 moveto
-12 f2
-(1987:) show
-59.4 165.1 moveto
-12 f0
-( Get Clean ) show
-113.7 165.1 moveto
-12 f2
-(\(remixes\)) show
-159 165.1 moveto
-12 f0
-( ) show
-31.5 151.8 moveto
-12 f2
-(1988:) show
-59.4 151.8 moveto
-12 f0
-( Control: I'm Here ) show
-152 151.8 moveto
-12 f2
-(\(single\)) show
-188.6 151.8 moveto
-12 f0
-( ) show
-31.5 138.5 moveto
-12 f2
-(1989:) show
-59.4 138.5 moveto
-12 f0
-( Hearts and Minds ) show
-150.7 138.5 moveto
-12 f2
-(\(single\)) show
-187.3 138.5 moveto
-12 f0
-( ) show
-31.5 125.2 moveto
-12 f2
-(1989:) show
-59.4 125.2 moveto
-12 f0
-( Belief ) show
-31.5 111.9 moveto
-12 f2
-(1990:) show
-59.4 111.9 moveto
-12 f0
-( Showtime ) show
-31.5 98.6 moveto
-12 f2
-(1991:) show
-59.4 98.6 moveto
-12 f0
-( I Give to You ) show
-131.7 98.6 moveto
-12 f2
-(\(single\)) show
-168.3 98.6 moveto
-12 f0
-( ) show
-31.5 85.3 moveto
-12 f2
-(1991:) show
-59.4 85.3 moveto
-12 f0
-( As Is ) show
-90.3 85.3 moveto
-12 f2
-(\(single\)) show
-126.9 85.3 moveto
-12 f0
-( ) show
-298.1 218.8 moveto
-12 f2
-(UBL Card: ) show
-355.4 218.8 moveto
-12 f0
-(1164) show
-379.4 218.8 moveto
-12 f0
-( ) show
-298.1 205.5 moveto
-12 f2
-(See also: ) show
-344.7 205.5 moveto
-12 f0
-(www.eecs.nwu.edu) show
-438.3 205.5 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 20 20
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1991:) show
-59.4 709.2 moveto
-12 f0
-( Ebbhead ) show
-31.5 695.9 moveto
-12 f2
-(1991:) show
-59.4 695.9 moveto
-12 f0
-( Godhead ) show
-108.7 695.9 moveto
-12 f2
-(\(EP\)) show
-131.3 695.9 moveto
-12 f0
-( ) show
-18.1 683.2 moveto
-3.3 3.3 c fill
-31.5 675.1 moveto
-12 f1
-(No Doubt) show
-81.1 675.1 moveto
-12 f0
-( ) show
-31.5 661.8 moveto
-12 f2
-(1995:) show
-59.4 661.8 moveto
-12 f0
-( Tragic Kingdom ) show
-18.1 649.1 moveto
-3.3 3.3 c fill
-31.5 641 moveto
-12 f1
-(Noise Unit) show
-85.1 641 moveto
-12 f0
-( ) show
-31.5 627.7 moveto
-12 f2
-(1989:) show
-59.4 627.7 moveto
-12 f0
-( Grinding Into Emptiness ) show
-18.1 615 moveto
-3.3 3.3 c fill
-31.5 606.9 moveto
-12 f1
-(Nosferatu) show
-82.1 606.9 moveto
-12 f0
-( ) show
-31.5 593.6 moveto
-12 f2
-(1993:) show
-59.4 593.6 moveto
-12 f0
-( Rise ) show
-18.1 580.9 moveto
-3.3 3.3 c fill
-31.5 572.8 moveto
-12 f1
-(Numan, Gary) show
-102.1 572.8 moveto
-12 f0
-( ) show
-31.5 559.5 moveto
-12 f2
-(1978:) show
-59.4 559.5 moveto
-12 f0
-( Tubeway Army ) show
-31.5 546.2 moveto
-12 f2
-(1978:) show
-59.4 546.2 moveto
-12 f0
-( The Plan ) show
-31.5 532.9 moveto
-12 f2
-(1979:) show
-59.4 532.9 moveto
-12 f0
-( Replicas ) show
-31.5 519.6 moveto
-12 f2
-(1979:) show
-59.4 519.6 moveto
-12 f0
-( The Pleasure Principle ) show
-31.5 506.3 moveto
-12 f2
-(1980:) show
-59.4 506.3 moveto
-12 f0
-( Telekon ) show
-31.5 493 moveto
-12 f2
-(1981:) show
-59.4 493 moveto
-12 f0
-( Warriors ) show
-31.5 479.7 moveto
-12 f2
-(1981:) show
-59.4 479.7 moveto
-12 f0
-( Dance ) show
-31.5 466.4 moveto
-12 f2
-(1982:) show
-59.4 466.4 moveto
-12 f0
-( I, Assassin ) show
-31.5 453.1 moveto
-12 f2
-(1984:) show
-59.4 453.1 moveto
-12 f0
-( White Noise ) show
-125.7 453.1 moveto
-12 f2
-(\(double live\)) show
-186.6 453.1 moveto
-12 f0
-( ) show
-31.5 439.8 moveto
-12 f2
-(1987:) show
-59.4 439.8 moveto
-12 f0
-( Ghost ) show
-94 439.8 moveto
-12 f2
-(\(double live\)) show
-154.9 439.8 moveto
-12 f0
-( ) show
-298.1 573.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 573.3 moveto
-12 f0
-(1409) show
-379.4 573.3 moveto
-12 f0
-( ) show
-18.1 427.1 moveto
-3.3 3.3 c fill
-31.5 419 moveto
-12 f1
-(Offspring) show
-81.5 419 moveto
-12 f0
-( ) show
-31.5 405.7 moveto
-12 f2
-(1994:) show
-59.4 405.7 moveto
-12 f0
-( Smash ) show
-18.1 393 moveto
-3.3 3.3 c fill
-31.5 384.9 moveto
-12 f1
-(Oingo Boingo) show
-101.8 384.9 moveto
-12 f0
-( ) show
-31.5 371.6 moveto
-12 f2
-(1980:) show
-59.4 371.6 moveto
-12 f0
-( Forbidden Zone ) show
-142.3 371.6 moveto
-12 f2
-(\(soundtrack\)) show
-203.6 371.6 moveto
-12 f0
-( ) show
-31.5 358.3 moveto
-12 f2
-(1981:) show
-59.4 358.3 moveto
-12 f0
-( Only a Lad ) show
-31.5 345 moveto
-12 f2
-(1983:) show
-59.4 345 moveto
-12 f0
-( Good for Your Soul ) show
-31.5 331.7 moveto
-12 f2
-(1986:) show
-59.4 331.7 moveto
-12 f0
-( Dead Man's Party ) show
-31.5 318.4 moveto
-12 f2
-(1987:) show
-59.4 318.4 moveto
-12 f0
-( Nothing to Fear ) show
-298.1 385.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 385.4 moveto
-12 f0
-(1089) show
-379.4 385.4 moveto
-12 f0
-( ) show
-298.1 372.1 moveto
-12 f2
-(See also: ) show
-344.7 372.1 moveto
-12 f0
-(rhino.harvard.edu) show
-430 372.1 moveto
-12 f0
-( ) show
-18.1 305.7 moveto
-3.3 3.3 c fill
-31.5 297.6 moveto
-12 f1
-(Orb, The) show
-78.8 297.6 moveto
-12 f0
-( ) show
-31.5 284.3 moveto
-12 f2
-(1991:) show
-59.4 284.3 moveto
-12 f0
-( The Orb's Adventures Beyond the Ultraworld ) show
-31.5 271 moveto
-12 f2
-(1991:) show
-59.4 271 moveto
-12 f0
-( Aubrey Mixes, the Ultraworld Excursions ) show
-31.5 257.7 moveto
-12 f2
-(1991:) show
-59.4 257.7 moveto
-12 f0
-( Little Fluffy Clouds ) show
-161.4 257.7 moveto
-12 f2
-(\(EP\)) show
-184 257.7 moveto
-12 f0
-( ) show
-31.5 244.4 moveto
-12 f2
-(1992:) show
-59.4 244.4 moveto
-12 f0
-( U.F.Orb ) show
-31.5 231.1 moveto
-12 f2
-(1993:) show
-59.4 231.1 moveto
-12 f0
-( live 93 ) show
-98.4 231.1 moveto
-12 f2
-(\(double live\)) show
-159.3 231.1 moveto
-12 f0
-( ) show
-31.5 217.8 moveto
-12 f2
-(1994:) show
-59.4 217.8 moveto
-12 f0
-( Pomme Fritz ) show
-298.1 298.1 moveto
-12 f2
-(UBL Card: ) show
-355.4 298.1 moveto
-12 f0
-(1121) show
-379.4 298.1 moveto
-12 f0
-( ) show
-298.1 284.8 moveto
-12 f2
-(See also: ) show
-344.7 284.8 moveto
-12 f0
-(www.hyperlink.com) show
-443.3 284.8 moveto
-12 f0
-( ) show
-298.1 271.5 moveto
-12 f2
-(See also: ) show
-344.7 271.5 moveto
-12 f0
-(www.phlab.missouri.edu) show
-465 271.5 moveto
-12 f0
-( ) show
-298.1 258.2 moveto
-12 f2
-(See also: ) show
-344.7 258.2 moveto
-12 f0
-(rt66.com) show
-387.6 258.2 moveto
-12 f0
-( ) show
-18.1 205.1 moveto
-3.3 3.3 c fill
-31.5 197 moveto
-12 f1
-(Orbital) show
-69.5 197 moveto
-12 f0
-( ) show
-31.5 183.7 moveto
-12 f2
-(1993:) show
-59.4 183.7 moveto
-12 f0
-( Orbital 2 ) show
-298.1 197.5 moveto
-12 f2
-(UBL Card: ) show
-355.4 197.5 moveto
-12 f0
-(2049) show
-379.4 197.5 moveto
-12 f0
-( ) show
-298.1 184.2 moveto
-12 f2
-(See also: ) show
-344.7 184.2 moveto
-12 f0
-(rt66.com) show
-387.6 184.2 moveto
-12 f0
-( ) show
-18.1 171 moveto
-3.3 3.3 c fill
-31.5 162.9 moveto
-12 f1
-(Orchestral Manoeuvers in the Dark) show
-214.8 162.9 moveto
-12 f0
-( ) show
-31.5 149.6 moveto
-12 f2
-(1980:) show
-59.4 149.6 moveto
-12 f0
-( OMD ) show
-93.3 149.6 moveto
-12 f2
-(\(US release\)) show
-153.6 149.6 moveto
-12 f0
-( ) show
-31.5 136.3 moveto
-12 f2
-(1980:) show
-59.4 136.3 moveto
-12 f0
-( OMD ) show
-93.3 136.3 moveto
-12 f2
-(\(UK release\)) show
-155.6 136.3 moveto
-12 f0
-( ) show
-31.5 123 moveto
-12 f2
-(1981:) show
-59.4 123 moveto
-12 f0
-( Bunker Soldiers ) show
-31.5 109.7 moveto
-12 f2
-(1981:) show
-59.4 109.7 moveto
-12 f0
-( Architecture & Morality ) show
-31.5 96.4 moveto
-12 f2
-(1983:) show
-59.4 96.4 moveto
-12 f0
-( Dazzle Ships ) show
-31.5 83.1 moveto
-12 f2
-(1984:) show
-59.4 83.1 moveto
-12 f0
-( Junk Culture ) show
-304.9 163.4 moveto
-12 f2
-(UBL Card: ) show
-362.2 163.4 moveto
-12 f0
-(5370) show
-386.2 163.4 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 21 21
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1985:) show
-59.4 709.2 moveto
-12 f0
-( Crush ) show
-18.1 696.5 moveto
-3.3 3.3 c fill
-31.5 688.4 moveto
-12 f1
-(Oxygiene 23) show
-94.5 688.4 moveto
-12 f0
-( ) show
-31.5 675.1 moveto
-12 f2
-(1995:) show
-59.4 675.1 moveto
-12 f0
-( Blue ) show
-18.1 662.4 moveto
-3.3 3.3 c fill
-31.5 654.3 moveto
-12 f1
-(187 Calm) show
-80.4 654.3 moveto
-12 f0
-( ) show
-31.5 641 moveto
-12 f2
-(1995:) show
-59.4 641 moveto
-12 f0
-( One Eighty Seven Calm ) show
-181.7 641 moveto
-12 f2
-(\(EP\)) show
-204.3 641 moveto
-12 f0
-( ) show
-18.1 628.3 moveto
-3.3 3.3 c fill
-31.5 620.2 moveto
-12 f1
-(1000 Homo DJs) show
-112.1 620.2 moveto
-12 f0
-( ) show
-31.5 606.9 moveto
-12 f2
-(1990:) show
-59.4 606.9 moveto
-12 f0
-( Supernaut ) show
-114 606.9 moveto
-12 f2
-(\(EP\)) show
-136.6 606.9 moveto
-12 f0
-( ) show
-18.1 594.2 moveto
-3.3 3.3 c fill
-31.5 586.1 moveto
-12 f1
-(Opus III) show
-75.8 586.1 moveto
-12 f0
-( ) show
-31.5 572.8 moveto
-12 f2
-(1991:) show
-59.4 572.8 moveto
-12 f0
-( Mind Fruit ) show
-31.5 559.5 moveto
-12 f2
-(1994:) show
-59.4 559.5 moveto
-12 f0
-( Guru Mother ) show
-18.1 546.8 moveto
-3.3 3.3 c fill
-31.5 538.7 moveto
-12 f1
-(Pain Teens) show
-87.8 538.7 moveto
-12 f0
-( ) show
-31.5 525.4 moveto
-12 f2
-(1990:) show
-59.4 525.4 moveto
-12 f0
-( Born in Blood / Case Histories ) show
-31.5 512.1 moveto
-12 f2
-(1992:) show
-59.4 512.1 moveto
-12 f0
-( Stimulation Festival ) show
-31.5 498.8 moveto
-12 f2
-(1993:) show
-59.4 498.8 moveto
-12 f0
-( Destroy Me, Lover ) show
-31.5 485.5 moveto
-12 f2
-(1995:) show
-59.4 485.5 moveto
-12 f0
-( Beast of Dreams ) show
-18.1 472.8 moveto
-3.3 3.3 c fill
-31.5 464.7 moveto
-12 f1
-(Paralysed Age) show
-105.1 464.7 moveto
-12 f0
-( ) show
-31.5 451.4 moveto
-12 f2
-(1994:) show
-59.4 451.4 moveto
-12 f0
-( Nocturne ) show
-18.1 438.7 moveto
-3.3 3.3 c fill
-31.5 430.6 moveto
-12 f1
-(Pigface) show
-68.8 430.6 moveto
-12 f0
-( ) show
-31.5 417.3 moveto
-12 f2
-(1990:) show
-59.4 417.3 moveto
-12 f0
-( Gub ) show
-298.1 431.1 moveto
-12 f2
-(UBL Card: ) show
-355.4 431.1 moveto
-12 f0
-(1165) show
-379.4 431.1 moveto
-12 f0
-( ) show
-298.1 417.8 moveto
-12 f2
-(See also: ) show
-344.7 417.8 moveto
-12 f0
-(www.eecs.nwu.edu) show
-438.3 417.8 moveto
-12 f0
-( ) show
-18.1 404.6 moveto
-3.3 3.3 c fill
-31.5 396.5 moveto
-12 f1
-(Pink Floyd) show
-87.8 396.5 moveto
-12 f0
-( ) show
-31.5 383.2 moveto
-12 f2
-(1973:) show
-59.4 383.2 moveto
-12 f0
-( Dark Side of the Moon ) show
-31.5 369.9 moveto
-12 f2
-(1975:) show
-59.4 369.9 moveto
-12 f0
-( Wish You were Here ) show
-31.5 356.6 moveto
-12 f2
-(1978:) show
-59.4 356.6 moveto
-12 f0
-( The Wall ) show
-110.3 356.6 moveto
-12 f2
-(\(double soundtrack\)) show
-207.2 356.6 moveto
-12 f0
-( ) show
-31.5 343.3 moveto
-12 f2
-(1981:) show
-59.4 343.3 moveto
-12 f0
-( A Collection of Great Dance Songs ) show
-235.7 343.3 moveto
-12 f2
-(\(comp\)) show
-269.6 343.3 moveto
-12 f0
-( ) show
-31.5 330 moveto
-12 f2
-(1995:) show
-59.4 330 moveto
-12 f0
-( A Saucerful of Pink: a Tribute ) show
-211 330 moveto
-12 f2
-(\(double, various\)) show
-293.6 330 moveto
-12 f0
-( ) show
-302.4 397 moveto
-12 f2
-(UBL Card: ) show
-359.7 397 moveto
-12 f0
-(1008) show
-383.7 397 moveto
-12 f0
-( ) show
-18.1 317.3 moveto
-3.3 3.3 c fill
-31.5 309.2 moveto
-12 f1
-(Polygon Window) show
-119.1 309.2 moveto
-12 f0
-( ) show
-31.5 295.9 moveto
-12 f2
-(1993:) show
-59.4 295.9 moveto
-12 f0
-( Surfing on Sine Waves ) show
-298.1 309.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 309.7 moveto
-12 f0
-(5279) show
-379.4 309.7 moveto
-12 f0
-( ) show
-18.1 283.2 moveto
-3.3 3.3 c fill
-31.5 275.1 moveto
-12 f1
-(Police) show
-62.1 275.1 moveto
-12 f0
-( ) show
-31.5 261.8 moveto
-12 f2
-(1979:) show
-59.4 261.8 moveto
-12 f0
-( Outlandos D'Amour ) show
-31.5 248.5 moveto
-12 f2
-(1980:) show
-59.4 248.5 moveto
-12 f0
-( Ghost in the Machine ) show
-31.5 235.2 moveto
-12 f2
-(1981:) show
-59.4 235.2 moveto
-12 f0
-( Zenyatta Mondatta ) show
-31.5 221.9 moveto
-12 f2
-(1983:) show
-59.4 221.9 moveto
-12 f0
-( Synchronicity ) show
-306.4 275.6 moveto
-12 f2
-(UBL Card: ) show
-363.7 275.6 moveto
-12 f0
-(1172) show
-387.7 275.6 moveto
-12 f0
-( ) show
-18.1 209.2 moveto
-3.3 3.3 c fill
-31.5 201.1 moveto
-12 f1
-(Poe) show
-50.1 201.1 moveto
-12 f0
-( ) show
-31.5 187.8 moveto
-12 f2
-(1995:) show
-59.4 187.8 moveto
-12 f0
-( Hello ) show
-18.1 175.1 moveto
-3.3 3.3 c fill
-31.5 167 moveto
-12 f1
-(Pop, Iggy) show
-80.1 167 moveto
-12 f0
-( ) show
-31.5 153.7 moveto
-12 f2
-(1977:) show
-59.4 153.7 moveto
-12 f0
-( Lust for Life ) show
-298.1 167.5 moveto
-12 f2
-(UBL Card: ) show
-355.4 167.5 moveto
-12 f0
-(4345) show
-379.4 167.5 moveto
-12 f0
-( ) show
-18.1 141 moveto
-3.3 3.3 c fill
-31.5 132.9 moveto
-12 f1
-(Powerman 5000) show
-113.8 132.9 moveto
-12 f0
-( ) show
-31.5 119.6 moveto
-12 f2
-(1995:) show
-59.4 119.6 moveto
-12 f0
-( The Blood Splat Rating System ) show
-18.1 106.9 moveto
-3.3 3.3 c fill
-31.5 98.8 moveto
-12 f1
-(Powerstation, The) show
-124.8 98.8 moveto
-12 f0
-( ) show
-31.5 85.5 moveto
-12 f2
-(1985:) show
-59.4 85.5 moveto
-12 f0
-( The Powerstation ) show
-306.4 99.3 moveto
-12 f2
-(UBL Card: ) show
-363.7 99.3 moveto
-12 f0
-(1259) show
-387.7 99.3 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 22 22
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-18.1 716.6 moveto
-3.3 3.3 c fill
-31.5 708.5 moveto
-12 f1
-(Pram) show
-60.1 708.5 moveto
-12 f0
-( ) show
-31.5 695.2 moveto
-12 f2
-(199?:) show
-59.4 695.2 moveto
-12 f0
-( Iron Lung ) show
-113.7 695.2 moveto
-12 f2
-(\(EP\)) show
-136.3 695.2 moveto
-12 f0
-( ) show
-31.5 681.9 moveto
-12 f2
-(1995:) show
-59.4 681.9 moveto
-12 f0
-( Helium ) show
-31.5 668.6 moveto
-12 f2
-(1995:) show
-59.4 668.6 moveto
-12 f0
-( Sargasso Sea ) show
-18.1 655.9 moveto
-3.3 3.3 c fill
-31.5 647.8 moveto
-12 f1
-(Prick) show
-59.4 647.8 moveto
-12 f0
-( ) show
-31.5 634.5 moveto
-12 f2
-(1995:) show
-59.4 634.5 moveto
-12 f0
-( Prick ) show
-298.1 648.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 648.3 moveto
-12 f0
-(3683) show
-379.4 648.3 moveto
-12 f0
-( ) show
-18.1 621.8 moveto
-3.3 3.3 c fill
-31.5 613.7 moveto
-12 f1
-(Primus) show
-68.8 613.7 moveto
-12 f0
-( ) show
-31.5 600.4 moveto
-12 f2
-(1991:) show
-59.4 600.4 moveto
-12 f0
-( Sailing on the Seas of Cheese ) show
-298.1 614.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 614.2 moveto
-12 f0
-(1055) show
-379.4 614.2 moveto
-12 f0
-( ) show
-18.1 587.7 moveto
-3.3 3.3 c fill
-31.5 579.6 moveto
-12 f1
-(Project Pitchfork) show
-120.4 579.6 moveto
-12 f0
-( ) show
-31.5 566.3 moveto
-12 f2
-(1991:) show
-59.4 566.3 moveto
-12 f0
-( Dhyani ) show
-18.1 553.6 moveto
-3.3 3.3 c fill
-31.5 545.5 moveto
-12 f1
-(Propaganda) show
-94.1 545.5 moveto
-12 f0
-( ) show
-31.5 532.2 moveto
-12 f2
-(1985:) show
-59.4 532.2 moveto
-12 f0
-( A Secret Wish, US version ) show
-31.5 518.9 moveto
-12 f2
-(1985:) show
-59.4 518.9 moveto
-12 f0
-( A Secret Wish, UK version ) show
-197 518.9 moveto
-12 f2
-(\(remixes\)) show
-242.3 518.9 moveto
-12 f0
-( ) show
-31.5 505.6 moveto
-12 f2
-(1985:) show
-59.4 505.6 moveto
-12 f0
-( p:machinery \(polish / passive\) / Frozen Faces) show
-31.5 492.3 moveto
-12 f2
-(\(single\)) show
-68.1 492.3 moveto
-12 f0
-( ) show
-31.5 479 moveto
-12 f2
-(1985:) show
-59.4 479 moveto
-12 f0
-( Duel / Jewel ) show
-125.3 479 moveto
-12 f2
-(\(single\)) show
-161.9 479 moveto
-12 f0
-( ) show
-31.5 465.7 moveto
-12 f2
-(1985:) show
-59.4 465.7 moveto
-12 f0
-( Wishful Thinking ) show
-151 465.7 moveto
-12 f2
-(\(remixes\)) show
-196.3 465.7 moveto
-12 f0
-( ) show
-31.5 452.4 moveto
-12 f2
-(1990:) show
-59.4 452.4 moveto
-12 f0
-( Heaven Give Me Words ) show
-182.3 452.4 moveto
-12 f2
-(\(EP\)) show
-204.9 452.4 moveto
-12 f0
-( ) show
-31.5 439.1 moveto
-12 f2
-(1995:) show
-59.4 439.1 moveto
-12 f0
-( p:machinery t-empo remix ) show
-193.3 439.1 moveto
-12 f2
-(\(single\)) show
-229.9 439.1 moveto
-12 f0
-( ) show
-298.1 546 moveto
-12 f2
-(UBL Card: ) show
-355.4 546 moveto
-12 f0
-(4636) show
-379.4 546 moveto
-12 f0
-( ) show
-298.1 532.7 moveto
-12 f2
-(See also: ) show
-344.7 532.7 moveto
-12 f0
-(rt66.com) show
-387.6 532.7 moveto
-12 f0
-( ) show
-298.1 519.4 moveto
-12 f2
-(See also: ) show
-344.7 519.4 moveto
-12 f0
-(hcl.chass.ncsu.edu) show
-433.6 519.4 moveto
-12 f0
-( ) show
-18.1 426.4 moveto
-3.3 3.3 c fill
-31.5 418.3 moveto
-12 f1
-(Prophetess, The) show
-113.4 418.3 moveto
-12 f0
-( ) show
-31.5 405 moveto
-12 f2
-(1993:) show
-59.4 405 moveto
-12 f0
-( The Prophetess ) show
-18.1 392.3 moveto
-3.3 3.3 c fill
-31.5 384.2 moveto
-12 f1
-(Public Image Limited) show
-142.8 384.2 moveto
-12 f0
-( ) show
-31.5 370.9 moveto
-12 f2
-(1985:) show
-59.4 370.9 moveto
-12 f0
-( Album ) show
-18.1 358.2 moveto
-3.3 3.3 c fill
-31.5 350.1 moveto
-12 f1
-(Rage Against the Machine) show
-166.4 350.1 moveto
-12 f0
-( ) show
-31.5 336.8 moveto
-12 f2
-(1992:) show
-59.4 336.8 moveto
-12 f0
-( Rage Against the Machine ) show
-298.1 350.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 350.6 moveto
-12 f0
-(1424) show
-379.4 350.6 moveto
-12 f0
-( ) show
-18.1 324.1 moveto
-3.3 3.3 c fill
-31.5 316 moveto
-12 f1
-(Romeo Void) show
-95.1 316 moveto
-12 f0
-( ) show
-31.5 302.7 moveto
-12 f2
-(1981:) show
-59.4 302.7 moveto
-12 f0
-( Never Say Never / Present Tense ) show
-224.3 302.7 moveto
-12 f2
-(\(single\)) show
-260.9 302.7 moveto
-12 f0
-( ) show
-18.1 290 moveto
-3.3 3.3 c fill
-31.5 281.9 moveto
-12 f1
-(Blaine Reininger) show
-117.8 281.9 moveto
-12 f0
-( ) show
-31.5 268.6 moveto
-12 f2
-(1989:) show
-59.4 268.6 moveto
-12 f0
-( Expatriate Journals ) show
-18.1 255.9 moveto
-3.3 3.3 c fill
-31.5 247.8 moveto
-12 f1
-(Red Aunts) show
-85.8 247.8 moveto
-12 f0
-( ) show
-31.5 234.5 moveto
-12 f2
-(1993:) show
-59.4 234.5 moveto
-12 f0
-( Drag ) show
-31.5 221.2 moveto
-12 f2
-(1994:) show
-59.4 221.2 moveto
-12 f0
-( Bad Motherfucker 400-Z ) show
-31.5 207.9 moveto
-12 f2
-(1995:) show
-59.4 207.9 moveto
-12 f0
-( #1 Chicken ) show
-306 248.3 moveto
-12 f2
-(UBL Card: ) show
-363.3 248.3 moveto
-12 f0
-(4619) show
-387.3 248.3 moveto
-12 f0
-( ) show
-18.1 195.2 moveto
-3.3 3.3 c fill
-31.5 187.1 moveto
-12 f1
-(Re-Flex) show
-71.4 187.1 moveto
-12 f0
-( ) show
-31.5 173.8 moveto
-12 f2
-(1983:) show
-59.4 173.8 moveto
-12 f0
-( The Politics of Dancing / Re-Flex It ) show
-238 173.8 moveto
-12 f2
-(\(single\)) show
-274.6 173.8 moveto
-12 f0
-( ) show
-18.1 161.1 moveto
-3.3 3.3 c fill
-31.5 153 moveto
-12 f1
-(Revolting Cocks) show
-115.1 153 moveto
-12 f0
-( ) show
-31.5 139.7 moveto
-12 f2
-(1986:) show
-59.4 139.7 moveto
-12 f0
-( Big Sexy Land ) show
-31.5 126.4 moveto
-12 f2
-(1988:) show
-59.4 126.4 moveto
-12 f0
-( You Goddamned Son of a Bitch ) show
-219.7 126.4 moveto
-12 f2
-(\(double live\)) show
-280.6 126.4 moveto
-12 f0
-( ) show
-31.5 113.1 moveto
-12 f2
-(1989:) show
-59.4 113.1 moveto
-12 f0
-( Stainless Steel Providers ) show
-184 113.1 moveto
-12 f2
-(\(EP\)) show
-206.6 113.1 moveto
-12 f0
-( ) show
-31.5 99.8 moveto
-12 f2
-(1990:) show
-59.4 99.8 moveto
-12 f0
-( Beers, Steers, and Queers ) show
-31.5 86.5 moveto
-12 f2
-(1993:) show
-59.4 86.5 moveto
-12 f0
-( Linger Ficken' Good ) show
-303 153.5 moveto
-12 f2
-(UBL Card: ) show
-360.3 153.5 moveto
-12 f0
-(1100) show
-384.3 153.5 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 23 23
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-18.1 716.6 moveto
-3.3 3.3 c fill
-31.5 708.5 moveto
-12 f1
-(Ridgway, Stan) show
-106.1 708.5 moveto
-12 f0
-( ) show
-31.5 695.2 moveto
-12 f2
-(1986:) show
-59.4 695.2 moveto
-12 f0
-( The Big Heat ) show
-298.1 709 moveto
-12 f2
-(UBL Card: ) show
-355.4 709 moveto
-12 f0
-(2904) show
-379.4 709 moveto
-12 f0
-( ) show
-18.1 682.5 moveto
-3.3 3.3 c fill
-31.5 674.4 moveto
-12 f1
-(Rosemarys, The) show
-114.1 674.4 moveto
-12 f0
-( ) show
-31.5 661.1 moveto
-12 f2
-(1993:) show
-59.4 661.1 moveto
-12 f0
-( Providence ) show
-18.1 648.4 moveto
-3.3 3.3 c fill
-31.5 640.3 moveto
-12 f1
-(Rosetta Stone) show
-101.8 640.3 moveto
-12 f0
-( ) show
-31.5 627 moveto
-12 f2
-(1993:) show
-59.4 627 moveto
-12 f0
-( Adrenaline ) show
-31.5 613.7 moveto
-12 f2
-(1995:) show
-59.4 613.7 moveto
-12 f0
-( The Tyrrany of Inaction ) show
-18.1 601 moveto
-3.3 3.3 c fill
-31.5 592.9 moveto
-12 f1
-(Ruby) show
-59.5 592.9 moveto
-12 f0
-( ) show
-31.5 579.6 moveto
-12 f2
-(1995:) show
-59.4 579.6 moveto
-12 f0
-( Salt Peter ) show
-18.1 566.9 moveto
-3.3 3.3 c fill
-31.5 558.8 moveto
-12 f1
-(Rump) show
-63.5 558.8 moveto
-12 f0
-( ) show
-31.5 545.5 moveto
-12 f2
-(1994:) show
-59.4 545.5 moveto
-12 f0
-( Hating Brenda ) show
-18.1 532.8 moveto
-3.3 3.3 c fill
-31.5 524.7 moveto
-12 f1
-(Rush) show
-58.1 524.7 moveto
-12 f0
-( ) show
-31.5 511.4 moveto
-12 f2
-(1984:) show
-59.4 511.4 moveto
-12 f0
-( Grace Under Pressure ) show
-298.1 525.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 525.2 moveto
-12 f0
-(1039) show
-379.4 525.2 moveto
-12 f0
-( ) show
-18.1 498.7 moveto
-3.3 3.3 c fill
-31.5 490.6 moveto
-12 f1
-(Sandoz) show
-68.8 490.6 moveto
-12 f0
-( ) show
-31.5 477.3 moveto
-12 f2
-(1993:) show
-59.4 477.3 moveto
-12 f0
-( Digital Lifeforms ) show
-18.1 464.6 moveto
-3.3 3.3 c fill
-31.5 456.5 moveto
-12 f1
-(Scatterbrain) show
-96.1 456.5 moveto
-12 f0
-( ) show
-31.5 443.2 moveto
-12 f2
-(1990:) show
-59.4 443.2 moveto
-12 f0
-( Here Comes Trouble ) show
-18.1 430.5 moveto
-3.3 3.3 c fill
-31.5 422.4 moveto
-12 f1
-(Scar Tissue) show
-90.5 422.4 moveto
-12 f0
-( ) show
-31.5 409.1 moveto
-12 f2
-(1995:) show
-59.4 409.1 moveto
-12 f0
-( Scar Tissue ) show
-18.1 396.4 moveto
-3.3 3.3 c fill
-31.5 388.3 moveto
-12 f1
-(Scritti Politti) show
-97.8 388.3 moveto
-12 f0
-( ) show
-31.5 375 moveto
-12 f2
-(1985:) show
-59.4 375 moveto
-12 f0
-( Cupid & Psyche ) show
-18.1 362.3 moveto
-3.3 3.3 c fill
-31.5 354.2 moveto
-12 f1
-(Severed Heads) show
-107.1 354.2 moveto
-12 f0
-( ) show
-31.5 340.9 moveto
-12 f2
-(1983:) show
-59.4 340.9 moveto
-12 f0
-( Since the Accident ) show
-31.5 327.6 moveto
-12 f2
-(1986:) show
-59.4 327.6 moveto
-12 f0
-( Come Visit the Big Bigot ) show
-31.5 314.3 moveto
-12 f2
-(1987:) show
-59.4 314.3 moveto
-12 f0
-( Bad Mood Guy ) show
-298.1 354.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 354.7 moveto
-12 f0
-(1480) show
-379.4 354.7 moveto
-12 f0
-( ) show
-18.1 301.6 moveto
-3.3 3.3 c fill
-31.5 293.5 moveto
-12 f1
-(Sex Gang, Andi) show
-111.8 293.5 moveto
-12 f0
-( ) show
-31.5 280.2 moveto
-12 f2
-(1994:) show
-59.4 280.2 moveto
-12 f0
-( Arco Valley ) show
-18.1 267.5 moveto
-3.3 3.3 c fill
-31.5 259.4 moveto
-12 f1
-(Sex Gang Children) show
-129.5 259.4 moveto
-12 f0
-( ) show
-31.5 246.1 moveto
-12 f2
-(1992:) show
-59.4 246.1 moveto
-12 f0
-( Blind ) show
-31.5 232.8 moveto
-12 f2
-(1993:) show
-59.4 232.8 moveto
-12 f0
-( Dieche ) show
-31.5 219.5 moveto
-12 f2
-(1993:) show
-59.4 219.5 moveto
-12 f0
-( Medea ) show
-18.1 206.8 moveto
-3.3 3.3 c fill
-31.5 198.7 moveto
-12 f1
-(Shadow Project) show
-112.4 198.7 moveto
-12 f0
-( ) show
-31.5 185.4 moveto
-12 f2
-(1991:) show
-59.4 185.4 moveto
-12 f0
-( Shadow Project ) show
-18.1 172.7 moveto
-3.3 3.3 c fill
-31.5 164.6 moveto
-12 f1
-(Sharkbait) show
-82.8 164.6 moveto
-12 f0
-( ) show
-31.5 151.3 moveto
-12 f2
-(1991:) show
-59.4 151.3 moveto
-12 f0
-( Blowtorch Facelift ) show
-31.5 138 moveto
-12 f2
-(1993:) show
-59.4 138 moveto
-12 f0
-( Crushits ) show
-18.1 125.3 moveto
-3.3 3.3 c fill
-31.5 117.2 moveto
-12 f1
-(Sheep on Drugs) show
-112.1 117.2 moveto
-12 f0
-( ) show
-31.5 103.9 moveto
-12 f2
-(1993:) show
-59.4 103.9 moveto
-12 f0
-( Greatest Hits ) show
-128.3 103.9 moveto
-12 f2
-(\(comp\)) show
-162.2 103.9 moveto
-12 f0
-( ) show
-31.5 90.6 moveto
-12 f2
-(1995:) show
-59.4 90.6 moveto
-12 f0
-( Suck ) show
-89.4 90.6 moveto
-12 f2
-(\(EP\)) show
-112 90.6 moveto
-12 f0
-( ) show
-18.1 77.9 moveto
-3.3 3.3 c fill
-pagelevel restore
-showpage
-%%Page: 24 24
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-18.1 716.8 moveto
-3.3 3.3 c fill
-31.5 708.7 moveto
-12 f1
-(Shriekback) show
-90.1 708.7 moveto
-12 f0
-( ) show
-31.5 695.4 moveto
-12 f2
-(1982:) show
-59.4 695.4 moveto
-12 f0
-( Tench ) show
-31.5 682.1 moveto
-12 f2
-(1983:) show
-59.4 682.1 moveto
-12 f0
-( Care ) show
-31.5 668.8 moveto
-12 f2
-(1983:) show
-59.4 668.8 moveto
-12 f0
-( Care ) show
-88 668.8 moveto
-12 f2
-(\(Y version\)) show
-140.9 668.8 moveto
-12 f0
-( ) show
-31.5 655.5 moveto
-12 f2
-(1983:) show
-59.4 655.5 moveto
-12 f0
-( Lined Up / Hapax Legomena ) show
-205.3 655.5 moveto
-12 f2
-(\(single\)) show
-241.9 655.5 moveto
-12 f0
-( ) show
-31.5 642.2 moveto
-12 f2
-(1983:) show
-59.4 642.2 moveto
-12 f0
-( Lined Up / My Spine / Accretions /Into Method) show
-31.5 628.9 moveto
-12 f2
-(\(single\)) show
-68.1 628.9 moveto
-12 f0
-( ) show
-31.5 615.6 moveto
-12 f2
-(1983:) show
-59.4 615.6 moveto
-12 f0
-( My Spine / Accretions / Clear Trails ) show
-240 615.6 moveto
-12 f2
-(\(single\)) show
-276.6 615.6 moveto
-12 f0
-( ) show
-31.5 602.3 moveto
-12 f2
-(1983:) show
-59.4 602.3 moveto
-12 f0
-( Sexthinkone / Here Comes My Hand ) show
-243 602.3 moveto
-12 f2
-(\(single\)) show
-279.6 602.3 moveto
-12 f0
-( ) show
-31.5 589 moveto
-12 f2
-(1984:) show
-59.4 589 moveto
-12 f0
-( Jamscience ) show
-120 589 moveto
-12 f2
-(\(UK release\)) show
-182.3 589 moveto
-12 f0
-( ) show
-31.5 575.7 moveto
-12 f2
-(1984:) show
-59.4 575.7 moveto
-12 f0
-( Jamscience ) show
-120 575.7 moveto
-12 f2
-(\(Holland release\)) show
-204.9 575.7 moveto
-12 f0
-( ) show
-31.5 562.4 moveto
-12 f2
-(1984:) show
-59.4 562.4 moveto
-12 f0
-( Knowledge, Power, Truth, and Sex ) show
-31.5 549.1 moveto
-12 f2
-(1984:) show
-59.4 549.1 moveto
-12 f0
-( Mercy Dash ) show
-124.3 549.1 moveto
-12 f2
-(\(picture disc, single\)) show
-223.2 549.1 moveto
-12 f0
-( ) show
-31.5 535.8 moveto
-12 f2
-(1984:) show
-59.4 535.8 moveto
-12 f0
-( Hand on my Heart ) show
-154.3 535.8 moveto
-12 f2
-(\(picture disc, single\)) show
-253.2 535.8 moveto
-12 f0
-( ) show
-31.5 522.5 moveto
-12 f2
-(1985:) show
-59.4 522.5 moveto
-12 f0
-( The Infinite ) show
-122.3 522.5 moveto
-12 f2
-(\(comp\)) show
-156.2 522.5 moveto
-12 f0
-( ) show
-31.5 509.2 moveto
-12 f2
-(1985:) show
-59.4 509.2 moveto
-12 f0
-( Oil and Gold ) show
-31.5 495.9 moveto
-12 f2
-(1985:) show
-59.4 495.9 moveto
-12 f0
-( Fish Below the Ice ) show
-155.7 495.9 moveto
-12 f2
-(\(EP\)) show
-178.3 495.9 moveto
-12 f0
-( ) show
-31.5 482.6 moveto
-12 f2
-(1983-1985:) show
-87.4 482.6 moveto
-12 f0
-( Priests and Kannibals ) show
-197.3 482.6 moveto
-12 f2
-(\(comp\)) show
-231.2 482.6 moveto
-12 f0
-( ) show
-31.5 469.3 moveto
-12 f2
-(1986:) show
-59.4 469.3 moveto
-12 f0
-( Big Night Music ) show
-31.5 456 moveto
-12 f2
-(1986:) show
-59.4 456 moveto
-12 f0
-( Islam Grotto ) show
-126.3 456 moveto
-12 f2
-(\(live boot\)) show
-175.9 456 moveto
-12 f0
-( ) show
-31.5 442.7 moveto
-12 f2
-(1988:) show
-59.4 442.7 moveto
-12 f0
-( Evolution ) show
-112.7 442.7 moveto
-12 f2
-(\(comp\)) show
-146.6 442.7 moveto
-12 f0
-( ) show
-31.5 429.4 moveto
-12 f2
-(1990:) show
-59.4 429.4 moveto
-12 f0
-( The Dancing Years ) show
-158.7 429.4 moveto
-12 f2
-(\(remixes\)) show
-204 429.4 moveto
-12 f0
-( ) show
-31.5 416.1 moveto
-12 f2
-(1993:) show
-59.4 416.1 moveto
-12 f0
-( Sacred City ) show
-298.1 709.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 709.2 moveto
-12 f0
-(1248) show
-379.4 709.2 moveto
-12 f0
-( ) show
-298.1 695.9 moveto
-12 f2
-(See also: ) show
-344.7 695.9 moveto
-12 f0
-(http2.brunel.ac.uk) show
-431.7 695.9 moveto
-12 f0
-( ) show
-18.1 403.4 moveto
-3.3 3.3 c fill
-31.5 395.3 moveto
-12 f1
-(Siglo XX) show
-77.1 395.3 moveto
-12 f0
-( ) show
-31.5 382 moveto
-12 f2
-(1983-1986:) show
-87.4 382 moveto
-12 f0
-( Antler Tracks I ) show
-166.7 382 moveto
-12 f2
-(\(comp\)) show
-200.6 382 moveto
-12 f0
-( ) show
-31.5 368.7 moveto
-12 f2
-(1986:) show
-59.4 368.7 moveto
-12 f0
-( Fear and Desire ) show
-18.1 356 moveto
-3.3 3.3 c fill
-31.5 347.9 moveto
-12 f1
-(Single Gun Theory) show
-128.8 347.9 moveto
-12 f0
-( ) show
-31.5 334.6 moveto
-12 f2
-(1989?:) show
-65.4 334.6 moveto
-12 f0
-( Exorcise this Wasteland ) show
-31.5 321.3 moveto
-12 f2
-(1991:) show
-59.4 321.3 moveto
-12 f0
-( Like Stars in my Hands ) show
-31.5 308 moveto
-12 f2
-(1993:) show
-59.4 308 moveto
-12 f0
-( Burning Bright \(but Unseen\) ) show
-203.7 308 moveto
-12 f2
-(\(EP\)) show
-226.3 308 moveto
-12 f0
-( ) show
-31.5 294.7 moveto
-12 f2
-(1994:) show
-59.4 294.7 moveto
-12 f0
-( Flow, River of my Soul ) show
-298.1 348.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 348.4 moveto
-12 f0
-(1404) show
-379.4 348.4 moveto
-12 f0
-( ) show
-298.1 335.1 moveto
-12 f2
-(See also: ) show
-344.7 335.1 moveto
-12 f0
-(www.magna.com.au) show
-443.6 335.1 moveto
-12 f0
-( ) show
-18.1 282 moveto
-3.3 3.3 c fill
-31.5 273.9 moveto
-12 f1
-(Siouxsie and the Banshees) show
-165.1 273.9 moveto
-12 f0
-( ) show
-31.5 260.6 moveto
-12 f2
-(1977:) show
-59.4 260.6 moveto
-12 f0
-( Peel Sessions ) show
-130.4 260.6 moveto
-12 f2
-(\(live EP\)) show
-173.3 260.6 moveto
-12 f0
-( ) show
-31.5 247.3 moveto
-12 f2
-(1978:) show
-59.4 247.3 moveto
-12 f0
-( Peel Sessions 2 ) show
-139.4 247.3 moveto
-12 f2
-(\(live EP\)) show
-182.3 247.3 moveto
-12 f0
-( ) show
-31.5 234 moveto
-12 f2
-(1978:) show
-59.4 234 moveto
-12 f0
-( The Scream ) show
-31.5 220.7 moveto
-12 f2
-(1979:) show
-59.4 220.7 moveto
-12 f0
-( Join Hands ) show
-31.5 207.4 moveto
-12 f2
-(1980:) show
-59.4 207.4 moveto
-12 f0
-( Kaleidoscope ) show
-31.5 194.1 moveto
-12 f2
-(1981:) show
-59.4 194.1 moveto
-12 f0
-( juju ) show
-31.5 180.8 moveto
-12 f2
-(1981:) show
-59.4 180.8 moveto
-12 f0
-( Once Upon a Time ) show
-157 180.8 moveto
-12 f2
-(\(comp\)) show
-190.9 180.8 moveto
-12 f0
-( ) show
-31.5 167.5 moveto
-12 f2
-(1981:) show
-59.4 167.5 moveto
-12 f0
-( Spellbound / Follow the Sun / Slap Dash Snap) show
-31.5 154.2 moveto
-12 f2
-(\(single\)) show
-68.1 154.2 moveto
-12 f0
-( ) show
-31.5 140.9 moveto
-12 f2
-(1982:) show
-59.4 140.9 moveto
-12 f0
-( Slowdive / Obsession II / Cannibal Roses ) show
-264.7 140.9 moveto
-12 f2
-(\(single\)) show
-31.5 114.3 moveto
-12 f2
-(1982:) show
-59.4 114.3 moveto
-12 f0
-( A Kiss in the Dream House ) show
-31.5 101 moveto
-12 f2
-(1983:) show
-59.4 101 moveto
-12 f0
-( Nocturne ) show
-110 101 moveto
-12 f2
-(\(double live\)) show
-170.9 101 moveto
-12 f0
-( ) show
-31.5 87.7 moveto
-12 f2
-(1984:) show
-59.4 87.7 moveto
-12 f0
-( Hyaena ) show
-305.7 274.4 moveto
-12 f2
-(UBL Card: ) show
-363 274.4 moveto
-12 f0
-(1216) show
-387 274.4 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 25 25
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1985:) show
-59.4 709.2 moveto
-12 f0
-( Tinderbox ) show
-31.5 695.9 moveto
-12 f2
-(1986:) show
-59.4 695.9 moveto
-12 f0
-( Through the Looking Glass ) show
-31.5 682.6 moveto
-12 f2
-(1987:) show
-59.4 682.6 moveto
-12 f0
-( Song from the Edge of the World ) show
-226 682.6 moveto
-12 f2
-(\(single\)) show
-262.6 682.6 moveto
-12 f0
-( ) show
-31.5 669.3 moveto
-12 f2
-(1988:) show
-59.4 669.3 moveto
-12 f0
-( Peekaboo / False Face / Catwalk ) show
-221.7 669.3 moveto
-12 f2
-(\(single\)) show
-258.3 669.3 moveto
-12 f0
-( ) show
-31.5 656 moveto
-12 f2
-(1988:) show
-59.4 656 moveto
-12 f0
-( Peepshow ) show
-31.5 642.7 moveto
-12 f2
-(1991:) show
-59.4 642.7 moveto
-12 f0
-( Superstition ) show
-31.5 629.4 moveto
-12 f2
-(1991:) show
-59.4 629.4 moveto
-12 f0
-( Kiss Them for Me ) show
-153.7 629.4 moveto
-12 f2
-(\(EP\)) show
-176.3 629.4 moveto
-12 f0
-( ) show
-31.5 616.1 moveto
-12 f2
-(1995:) show
-59.4 616.1 moveto
-12 f0
-( The Rapture ) show
-18.1 603.4 moveto
-3.3 3.3 c fill
-31.5 595.3 moveto
-12 f1
-(Sister Machine Gun) show
-134.1 595.3 moveto
-12 f0
-( ) show
-31.5 582 moveto
-12 f2
-(1992:) show
-59.4 582 moveto
-12 f0
-( Sins of the Flesh ) show
-31.5 568.7 moveto
-12 f2
-(1994:) show
-59.4 568.7 moveto
-12 f0
-( The Torture Technique ) show
-31.5 555.4 moveto
-12 f2
-(1994:) show
-59.4 555.4 moveto
-12 f0
-( Nothing ) show
-104.7 555.4 moveto
-12 f2
-(\(single\)) show
-141.3 555.4 moveto
-12 f0
-( ) show
-31.5 542.1 moveto
-12 f2
-(1994:) show
-59.4 542.1 moveto
-12 f0
-( Wired / Lung ) show
-130 542.1 moveto
-12 f2
-(\(single\)) show
-166.6 542.1 moveto
-12 f0
-( ) show
-31.5 528.8 moveto
-12 f2
-(1995:) show
-59.4 528.8 moveto
-12 f0
-( Burn ) show
-299.7 595.8 moveto
-12 f2
-(UBL Card: ) show
-357 595.8 moveto
-12 f0
-(3612) show
-381 595.8 moveto
-12 f0
-( ) show
-18.1 516.1 moveto
-3.3 3.3 c fill
-31.5 508 moveto
-12 f1
-(Sisterhood, The) show
-112.1 508 moveto
-12 f0
-( ) show
-31.5 494.7 moveto
-12 f2
-(1986:) show
-59.4 494.7 moveto
-12 f0
-( Gift ) show
-298.1 508.5 moveto
-12 f2
-(UBL Card: ) show
-355.4 508.5 moveto
-12 f0
-(1115) show
-379.4 508.5 moveto
-12 f0
-( ) show
-298.1 495.2 moveto
-12 f2
-(See also: ) show
-344.7 495.2 moveto
-12 f0
-(www.cm.cf.ac.uk) show
-429.3 495.2 moveto
-12 f0
-( ) show
-18.1 482 moveto
-3.3 3.3 c fill
-31.5 473.9 moveto
-12 f1
-(Sisters of Mercy) show
-114.8 473.9 moveto
-12 f0
-( ) show
-31.5 460.6 moveto
-12 f2
-(1985:) show
-59.4 460.6 moveto
-12 f0
-( First and Last and Always ) show
-31.5 447.3 moveto
-12 f2
-(1988:) show
-59.4 447.3 moveto
-12 f0
-( Floodland ) show
-31.5 434 moveto
-12 f2
-(1988:) show
-59.4 434 moveto
-12 f0
-( More / You Could be the One ) show
-208.7 434 moveto
-12 f2
-(\(single\)) show
-245.3 434 moveto
-12 f0
-( ) show
-31.5 420.7 moveto
-12 f2
-(1990:) show
-59.4 420.7 moveto
-12 f0
-( Vision Thing ) show
-31.5 407.4 moveto
-12 f2
-(1992:) show
-59.4 407.4 moveto
-12 f0
-( Some Girls Wander by Mistake ) show
-217.3 407.4 moveto
-12 f2
-(\(comp\)) show
-251.2 407.4 moveto
-12 f0
-( ) show
-31.5 394.1 moveto
-12 f2
-(1992:) show
-59.4 394.1 moveto
-12 f0
-( Temple of Love 1992 ) show
-169.7 394.1 moveto
-12 f2
-(\(single\)) show
-206.3 394.1 moveto
-12 f0
-( ) show
-31.5 380.8 moveto
-12 f2
-(1993:) show
-59.4 380.8 moveto
-12 f0
-( First and Last and Forever: A Tribute ) show
-245.3 380.8 moveto
-12 f2
-(\(various\)) show
-289.2 380.8 moveto
-12 f0
-( ) show
-31.5 367.5 moveto
-12 f2
-(1993:) show
-59.4 367.5 moveto
-12 f0
-( Under the Gun / Alice 1993 ) show
-199 367.5 moveto
-12 f2
-(\(single\)) show
-235.6 367.5 moveto
-12 f0
-( ) show
-298.1 474.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 474.4 moveto
-12 f0
-(1062) show
-379.4 474.4 moveto
-12 f0
-( ) show
-298.1 461.1 moveto
-12 f2
-(See also: ) show
-344.7 461.1 moveto
-12 f0
-(www.cm.cf.ac.uk) show
-429.3 461.1 moveto
-12 f0
-( ) show
-18.1 354.8 moveto
-3.3 3.3 c fill
-31.5 346.7 moveto
-12 f1
-(Skeletal Family) show
-111.1 346.7 moveto
-12 f0
-( ) show
-31.5 333.4 moveto
-12 f2
-(1984-1985:) show
-87.4 333.4 moveto
-12 f0
-( Burning Oil / Futile Combat ) show
-18.1 320.7 moveto
-3.3 3.3 c fill
-31.5 312.6 moveto
-12 f1
-(Skinny Puppy) show
-103.8 312.6 moveto
-12 f0
-( ) show
-31.5 299.3 moveto
-12 f2
-(1983:) show
-59.4 299.3 moveto
-12 f0
-( Back and Forth, Series Two ) show
-31.5 286 moveto
-12 f2
-(1984:) show
-59.4 286 moveto
-12 f0
-( Bites ) show
-31.5 272.7 moveto
-12 f2
-(1984:) show
-59.4 272.7 moveto
-12 f0
-( Remission ) show
-31.5 259.4 moveto
-12 f2
-(1984:) show
-59.4 259.4 moveto
-12 f0
-( Bites and Remission ) show
-31.5 246.1 moveto
-12 f2
-(1986:) show
-59.4 246.1 moveto
-12 f0
-( Mind: the Perpetual Intercourse ) show
-31.5 232.8 moveto
-12 f2
-(1986:) show
-59.4 232.8 moveto
-12 f0
-( Dig It ) show
-93.7 232.8 moveto
-12 f2
-(\(EP\)) show
-116.3 232.8 moveto
-12 f0
-( ) show
-31.5 219.5 moveto
-12 f2
-(1987:) show
-59.4 219.5 moveto
-12 f0
-( Cleanse, Fold, and Manipulate ) show
-31.5 206.2 moveto
-12 f2
-(1988:) show
-59.4 206.2 moveto
-12 f0
-( Vivisect VI ) show
-31.5 192.9 moveto
-12 f2
-(1989:) show
-59.4 192.9 moveto
-12 f0
-( Rabies ) show
-31.5 179.6 moveto
-12 f2
-(1990:) show
-59.4 179.6 moveto
-12 f0
-( Too Dark Park ) show
-31.5 166.3 moveto
-12 f2
-(1990:) show
-59.4 166.3 moveto
-12 f0
-( Censor ) show
-99.3 166.3 moveto
-12 f2
-(\(EP\)) show
-121.9 166.3 moveto
-12 f0
-( ) show
-31.5 153 moveto
-12 f2
-(1992:) show
-59.4 153 moveto
-12 f0
-( 12 Inch Anthology ) show
-156 153 moveto
-12 f2
-(\(comp\)) show
-189.9 153 moveto
-12 f0
-( ) show
-31.5 139.7 moveto
-12 f2
-(1992:) show
-59.4 139.7 moveto
-12 f0
-( Last Rights ) show
-298.1 313.1 moveto
-12 f2
-(UBL Card: ) show
-355.4 313.1 moveto
-12 f0
-(1166) show
-379.4 313.1 moveto
-12 f0
-( ) show
-298.1 299.8 moveto
-12 f2
-(See also: ) show
-344.7 299.8 moveto
-12 f0
-(www.eecs.nwu.edu) show
-438.3 299.8 moveto
-12 f0
-( ) show
-18.1 127 moveto
-3.3 3.3 c fill
-31.5 118.9 moveto
-12 f1
-(Sky Cries Mary) show
-112.8 118.9 moveto
-12 f0
-( ) show
-31.5 105.6 moveto
-12 f2
-(1993:) show
-59.4 105.6 moveto
-12 f0
-( A Return to the Inner Experience ) show
-31.5 92.3 moveto
-12 f2
-(1994:) show
-59.4 92.3 moveto
-12 f0
-( This Timeless Turning ) show
-31.5 79 moveto
-12 f2
-(1994:) show
-59.4 79 moveto
-12 f0
-( Every Iceberg is Afire / Deep Sunless Sea /) show
-298.1 119.4 moveto
-12 f2
-(UBL Card: ) show
-355.4 119.4 moveto
-12 f0
-(1437) show
-379.4 119.4 moveto
-12 f0
-( ) show
-298.1 106.1 moveto
-12 f2
-(See also: ) show
-344.7 106.1 moveto
-12 f0
-(www.starwave.com) show
-440 106.1 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 26 26
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f0
-(Cornerman ) show
-88.4 709.2 moveto
-12 f2
-(\(single\)) show
-125 709.2 moveto
-12 f0
-( ) show
-18.1 696.5 moveto
-3.3 3.3 c fill
-31.5 688.4 moveto
-12 f1
-(Snog) show
-56.8 688.4 moveto
-12 f0
-( ) show
-31.5 675.1 moveto
-12 f2
-(1995:) show
-59.4 675.1 moveto
-12 f0
-( Dear Valued Customer ) show
-18.1 662.4 moveto
-3.3 3.3 c fill
-31.5 654.3 moveto
-12 f1
-(Soh Daiko) show
-84.5 654.3 moveto
-12 f0
-( ) show
-31.5 641 moveto
-12 f2
-(1990:) show
-59.4 641 moveto
-12 f0
-( Taiko Drum Ensemble ) show
-18.1 628.3 moveto
-3.3 3.3 c fill
-31.5 620.2 moveto
-12 f1
-(Some, Belouis) show
-102.8 620.2 moveto
-12 f0
-( ) show
-31.5 606.9 moveto
-12 f2
-(1984:) show
-59.4 606.9 moveto
-12 f0
-( Some People ) show
-128.4 606.9 moveto
-12 f2
-(\(single\)) show
-165 606.9 moveto
-12 f0
-( ) show
-18.1 594.2 moveto
-3.3 3.3 c fill
-31.5 586.1 moveto
-12 f1
-(Southern Death Cult) show
-138.1 586.1 moveto
-12 f0
-( ) show
-31.5 572.8 moveto
-12 f2
-(1982-1983:) show
-87.4 572.8 moveto
-12 f0
-( Southern Death Cult ) show
-192 572.8 moveto
-12 f2
-(\(comp\)) show
-225.9 572.8 moveto
-12 f0
-( ) show
-18.1 560.1 moveto
-3.3 3.3 c fill
-31.5 552 moveto
-12 f1
-(Spahn Ranch) show
-100.5 552 moveto
-12 f0
-( ) show
-31.5 538.7 moveto
-12 f2
-(1995:) show
-59.4 538.7 moveto
-12 f0
-( The Coiled One ) show
-18.1 526 moveto
-3.3 3.3 c fill
-31.5 517.9 moveto
-12 f1
-(SSQ) show
-54.1 517.9 moveto
-12 f0
-( ) show
-31.5 504.6 moveto
-12 f2
-(1984:) show
-59.4 504.6 moveto
-12 f0
-( Playback ) show
-31.5 491.3 moveto
-12 f2
-(1986:) show
-59.4 491.3 moveto
-12 f0
-( Insecurity ) show
-113.3 491.3 moveto
-12 f2
-(\(single\)) show
-149.9 491.3 moveto
-12 f0
-( ) show
-18.1 478.6 moveto
-3.3 3.3 c fill
-31.5 470.5 moveto
-12 f1
-(Stabbing Westward) show
-133.1 470.5 moveto
-12 f0
-( ) show
-31.5 457.2 moveto
-12 f2
-(1993:) show
-59.4 457.2 moveto
-12 f0
-( Violent Mood Swings ) show
-171.4 457.2 moveto
-12 f2
-(\(EP\)) show
-194 457.2 moveto
-12 f0
-( ) show
-31.5 443.9 moveto
-12 f2
-(1994:) show
-59.4 443.9 moveto
-12 f0
-( Ungod ) show
-31.5 430.6 moveto
-12 f2
-(1995:) show
-59.4 430.6 moveto
-12 f0
-( What Do I Have to Do / Falls Apart ) show
-237.3 430.6 moveto
-12 f2
-(\(single\)) show
-273.9 430.6 moveto
-12 f0
-( ) show
-31.5 417.3 moveto
-12 f2
-(1995:) show
-59.4 417.3 moveto
-12 f0
-( Wither Blister Burn and Peel ) show
-300.5 471 moveto
-12 f2
-(UBL Card: ) show
-357.8 471 moveto
-12 f0
-(2415) show
-381.8 471 moveto
-12 f0
-( ) show
-18.1 404.6 moveto
-3.3 3.3 c fill
-31.5 396.5 moveto
-12 f1
-(Strange Boutique) show
-121.1 396.5 moveto
-12 f0
-( ) show
-31.5 383.2 moveto
-12 f2
-(199?:) show
-59.4 383.2 moveto
-12 f0
-( Charm ) show
-31.5 369.9 moveto
-12 f2
-(199?:) show
-59.4 369.9 moveto
-12 f0
-( The Kindest Words ) show
-31.5 356.6 moveto
-12 f2
-(199?:) show
-59.4 356.6 moveto
-12 f0
-( The Loved One ) show
-298.1 397 moveto
-12 f2
-(See also: ) show
-344.7 397 moveto
-12 f0
-(www.iuma.com) show
-421.3 397 moveto
-12 f0
-( ) show
-18.1 343.9 moveto
-3.3 3.3 c fill
-31.5 335.8 moveto
-12 f1
-(Steroid Maximus) show
-119.8 335.8 moveto
-12 f0
-( ) show
-31.5 322.5 moveto
-12 f2
-(1991:) show
-59.4 322.5 moveto
-12 f0
-( Quilombo ) show
-31.5 309.2 moveto
-12 f2
-(1992:) show
-59.4 309.2 moveto
-12 f0
-( Gondwanaland ) show
-306.4 336.3 moveto
-12 f2
-(UBL Card: ) show
-363.7 336.3 moveto
-12 f0
-(2750) show
-387.7 336.3 moveto
-12 f0
-( ) show
-18.1 296.5 moveto
-3.3 3.3 c fill
-31.5 288.4 moveto
-12 f1
-(Sugarcubes, The) show
-116.8 288.4 moveto
-12 f0
-( ) show
-31.5 275.1 moveto
-12 f2
-(1988:) show
-59.4 275.1 moveto
-12 f0
-( Life's Too Good ) show
-298.1 288.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 288.9 moveto
-12 f0
-(3419) show
-379.4 288.9 moveto
-12 f0
-( ) show
-298.1 275.6 moveto
-12 f2
-(See also: ) show
-344.7 275.6 moveto
-12 f0
-(math-www.uio.no) show
-432 275.6 moveto
-12 f0
-( ) show
-18.1 262.4 moveto
-3.3 3.3 c fill
-31.5 254.3 moveto
-12 f1
-(Sunscreem) show
-87.4 254.3 moveto
-12 f0
-( ) show
-31.5 241 moveto
-12 f2
-(1992:) show
-59.4 241 moveto
-12 f0
-( O3 ) show
-18.1 228.3 moveto
-3.3 3.3 c fill
-31.5 220.2 moveto
-12 f1
-(Switchblade Symphony) show
-151.8 220.2 moveto
-12 f0
-( ) show
-31.5 206.9 moveto
-12 f2
-(1992:) show
-59.4 206.9 moveto
-12 f0
-( Fable ) show
-92 206.9 moveto
-12 f2
-(\(tape/EP\)) show
-138.6 206.9 moveto
-12 f0
-( ) show
-31.5 193.6 moveto
-12 f2
-(1993:) show
-59.4 193.6 moveto
-12 f0
-( Elegy ) show
-93.3 193.6 moveto
-12 f2
-(\(tape/EP\)) show
-139.9 193.6 moveto
-12 f0
-( ) show
-31.5 180.3 moveto
-12 f2
-(1995:) show
-59.4 180.3 moveto
-12 f0
-( Serpentine Gallery ) show
-18.1 167.6 moveto
-3.3 3.3 c fill
-31.5 159.5 moveto
-12 f1
-(Talking Heads) show
-106.5 159.5 moveto
-12 f0
-( ) show
-31.5 146.2 moveto
-12 f2
-(1977:) show
-59.4 146.2 moveto
-12 f0
-( Talking Heads '77 ) show
-31.5 132.9 moveto
-12 f2
-(1978:) show
-59.4 132.9 moveto
-12 f0
-( More Songs About Buildings and Food ) show
-31.5 119.6 moveto
-12 f2
-(1979:) show
-59.4 119.6 moveto
-12 f0
-( The Name of This Band is Talking Heads) show
-31.5 106.3 moveto
-12 f2
-(\(double live\)) show
-92.4 106.3 moveto
-12 f0
-( ) show
-31.5 93 moveto
-12 f2
-(1981:) show
-59.4 93 moveto
-12 f0
-( Fear of Music ) show
-31.5 79.7 moveto
-12 f2
-(1983:) show
-59.4 79.7 moveto
-12 f0
-( Sp eak in gI n To ngu es ) show
-302.4 160 moveto
-12 f2
-(UBL Card: ) show
-359.7 160 moveto
-12 f0
-(1012) show
-383.7 160 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 27 27
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1985:) show
-59.4 709.2 moveto
-12 f0
-( Stop Making Sense ) show
-158.7 709.2 moveto
-12 f2
-(\(live soundtrack\)) show
-240.3 709.2 moveto
-12 f0
-( ) show
-31.5 695.9 moveto
-12 f2
-(1985:) show
-59.4 695.9 moveto
-12 f0
-( Little Creatures ) show
-18.1 683.2 moveto
-3.3 3.3 c fill
-31.5 675.1 moveto
-12 f1
-(Tears For Fears) show
-114.1 675.1 moveto
-12 f0
-( ) show
-31.5 661.8 moveto
-12 f2
-(1983:) show
-59.4 661.8 moveto
-12 f0
-( The Hurting ) show
-31.5 648.5 moveto
-12 f2
-(1985:) show
-59.4 648.5 moveto
-12 f0
-( Songs From the Big Chair ) show
-298.1 675.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 675.6 moveto
-12 f0
-(2763) show
-379.4 675.6 moveto
-12 f0
-( ) show
-18.1 635.8 moveto
-3.3 3.3 c fill
-31.5 627.7 moveto
-12 f1
-(Tel Basta) show
-79.8 627.7 moveto
-12 f0
-( ) show
-31.5 614.4 moveto
-12 f2
-(1996:) show
-59.4 614.4 moveto
-12 f0
-( Lickerish ) show
-18.1 601.7 moveto
-3.3 3.3 c fill
-31.5 593.6 moveto
-12 f1
-(Thanatos) show
-79.5 593.6 moveto
-12 f0
-( ) show
-31.5 580.3 moveto
-12 f2
-(1995:) show
-59.4 580.3 moveto
-12 f0
-( An Embassy in Gaius ) show
-18.1 567.6 moveto
-3.3 3.3 c fill
-31.5 559.5 moveto
-12 f1
-(Therapy?) show
-81.5 559.5 moveto
-12 f0
-( ) show
-31.5 546.2 moveto
-12 f2
-(1992:) show
-59.4 546.2 moveto
-12 f0
-( Caucasian Psychosis ) show
-31.5 532.9 moveto
-12 f2
-(1992:) show
-59.4 532.9 moveto
-12 f0
-( Nurse ) show
-299.1 560 moveto
-12 f2
-(UBL Card: ) show
-356.4 560 moveto
-12 f0
-(2044) show
-380.4 560 moveto
-12 f0
-( ) show
-18.1 520.2 moveto
-3.3 3.3 c fill
-31.5 512.1 moveto
-12 f1
-(13 Mg.) show
-66.8 512.1 moveto
-12 f0
-( ) show
-31.5 498.8 moveto
-12 f2
-(1995:) show
-59.4 498.8 moveto
-12 f0
-( Trust and Obey ) show
-18.1 486.1 moveto
-3.3 3.3 c fill
-31.5 478 moveto
-12 f1
-(This Ascension) show
-108.5 478 moveto
-12 f0
-( ) show
-31.5 464.7 moveto
-12 f2
-(1991:) show
-59.4 464.7 moveto
-12 f0
-( Light and Shade ) show
-31.5 451.4 moveto
-12 f2
-(1994:) show
-59.4 451.4 moveto
-12 f0
-( Walk Softly, a Dream Lies Here ) show
-18.1 438.7 moveto
-3.3 3.3 c fill
-31.5 430.6 moveto
-12 f1
-(Throwing Muses) show
-117.8 430.6 moveto
-12 f0
-( ) show
-31.5 417.3 moveto
-12 f2
-(1986:) show
-59.4 417.3 moveto
-12 f0
-( Throwing Muses ) show
-298.4 431.1 moveto
-12 f2
-(UBL Card: ) show
-355.7 431.1 moveto
-12 f0
-(1357) show
-379.7 431.1 moveto
-12 f0
-( ) show
-18.1 404.6 moveto
-3.3 3.3 c fill
-31.5 396.5 moveto
-12 f1
-(Tinfed) show
-65.5 396.5 moveto
-12 f0
-( ) show
-31.5 383.2 moveto
-12 f2
-(1993:) show
-59.4 383.2 moveto
-12 f0
-( Synaptic Hardware ) show
-18.1 370.5 moveto
-3.3 3.3 c fill
-31.5 362.4 moveto
-12 f1
-(Tin Machine) show
-97.1 362.4 moveto
-12 f0
-( ) show
-31.5 349.1 moveto
-12 f2
-(1989:) show
-59.4 349.1 moveto
-12 f0
-( Tin Machine ) show
-298.1 362.9 moveto
-12 f2
-(UBL Card: ) show
-355.4 362.9 moveto
-12 f0
-(1098) show
-379.4 362.9 moveto
-12 f0
-( ) show
-18.1 336.4 moveto
-3.3 3.3 c fill
-31.5 328.3 moveto
-12 f1
-(Tit Wrench United) show
-128.8 328.3 moveto
-12 f0
-( ) show
-31.5 315 moveto
-12 f2
-(1993:) show
-59.4 315 moveto
-12 f0
-( Full Employment ) show
-18.1 302.3 moveto
-3.3 3.3 c fill
-31.5 294.2 moveto
-12 f1
-(Tom Tom Club) show
-110.8 294.2 moveto
-12 f0
-( ) show
-31.5 280.9 moveto
-12 f2
-(1981:) show
-59.4 280.9 moveto
-12 f0
-( Tom Tom Club ) show
-31.5 267.6 moveto
-12 f2
-(1983:) show
-59.4 267.6 moveto
-12 f0
-( Close to the Bone ) show
-298.1 294.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 294.7 moveto
-12 f0
-(1012) show
-379.4 294.7 moveto
-12 f0
-( ) show
-18.1 254.9 moveto
-3.3 3.3 c fill
-31.5 246.8 moveto
-12 f1
-(Tones on Tail) show
-101.5 246.8 moveto
-12 f0
-( ) show
-31.5 233.5 moveto
-12 f2
-(1982:) show
-59.4 233.5 moveto
-12 f0
-( Tones on Tail ) show
-31.5 220.2 moveto
-12 f2
-(1984:) show
-59.4 220.2 moveto
-12 f0
-( Pop ) show
-31.5 206.9 moveto
-12 f2
-(1984:) show
-59.4 206.9 moveto
-12 f0
-( Performance / Shakes ) show
-170 206.9 moveto
-12 f2
-(\(single\)) show
-206.6 206.9 moveto
-12 f0
-( ) show
-31.5 193.6 moveto
-12 f2
-(1982-1984:) show
-87.4 193.6 moveto
-12 f0
-( Night Music ) show
-153.7 193.6 moveto
-12 f2
-(\(comp\)) show
-187.6 193.6 moveto
-12 f0
-( ) show
-298.1 247.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 247.3 moveto
-12 f0
-(1235) show
-379.4 247.3 moveto
-12 f0
-( ) show
-298.1 234 moveto
-12 f2
-(See also: ) show
-344.7 234 moveto
-12 f0
-(gothic.acs.csulb.edu) show
-441.6 234 moveto
-12 f0
-( ) show
-298.1 220.7 moveto
-12 f2
-(See also: ) show
-344.7 220.7 moveto
-12 f0
-(isvpc146.isv.uit.no) show
-435.7 220.7 moveto
-12 f0
-( ) show
-18.1 180.9 moveto
-3.3 3.3 c fill
-31.5 172.8 moveto
-12 f1
-(Trance Mission) show
-111.1 172.8 moveto
-12 f0
-( ) show
-31.5 159.5 moveto
-12 f2
-(1993:) show
-59.4 159.5 moveto
-12 f0
-( Trance Mission ) show
-18.1 146.8 moveto
-3.3 3.3 c fill
-31.5 138.7 moveto
-12 f1
-(Trance to the Sun) show
-123.1 138.7 moveto
-12 f0
-( ) show
-31.5 125.4 moveto
-12 f2
-(1994:) show
-59.4 125.4 moveto
-12 f0
-( Ghost Forest ) show
-31.5 112.1 moveto
-12 f2
-(1995:) show
-59.4 112.1 moveto
-12 f0
-( Bloom, Flowers, Bloom! ) show
-31.5 98.8 moveto
-12 f2
-(1995:) show
-59.4 98.8 moveto
-12 f0
-( Venomous Eve ) show
-18.1 86.1 moveto
-3.3 3.3 c fill
-31.5 78 moveto
-12 f1
-(Transvision Vamp) show
-126.5 78 moveto
-12 f0
-( ) show
-302.5 78.5 moveto
-12 f2
-(UBL Card: ) show
-359.8 78.5 moveto
-12 f0
-(5305) show
-383.8 78.5 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 28 28
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1991:) show
-59.4 709.2 moveto
-12 f0
-( Little Magnets versus the Bubble of Babble ) show
-18.1 696.5 moveto
-3.3 3.3 c fill
-31.5 688.4 moveto
-12 f1
-(Trio) show
-54.1 688.4 moveto
-12 f0
-( ) show
-31.5 675.1 moveto
-12 f2
-(1983:) show
-59.4 675.1 moveto
-12 f0
-( Trio and Error ) show
-18.1 662.4 moveto
-3.3 3.3 c fill
-31.5 654.3 moveto
-12 f1
-(Tubes, The) show
-88.8 654.3 moveto
-12 f0
-( ) show
-31.5 641 moveto
-12 f2
-(1981:) show
-59.4 641 moveto
-12 f0
-( Tubes Rarities And Smash Hits [T.R.A.S.H] ) show
-18.1 628.3 moveto
-3.3 3.3 c fill
-31.5 620.2 moveto
-12 f1
-(Tuxedomoon) show
-98.8 620.2 moveto
-12 f0
-( ) show
-31.5 606.9 moveto
-12 f2
-(1980:) show
-59.4 606.9 moveto
-12 f0
-( Half-Mute ) show
-31.5 593.6 moveto
-12 f2
-(1983:) show
-59.4 593.6 moveto
-12 f0
-( A Thousand Lives by Picture ) show
-31.5 580.3 moveto
-12 f2
-(1985:) show
-59.4 580.3 moveto
-12 f0
-( Holy Wars ) show
-18.1 567.6 moveto
-3.3 3.3 c fill
-31.5 559.5 moveto
-12 f1
-(Underflowers) show
-101.4 559.5 moveto
-12 f0
-( ) show
-31.5 546.2 moveto
-12 f2
-(1995:) show
-59.4 546.2 moveto
-12 f0
-( Underflowers ) show
-18.1 533.5 moveto
-3.3 3.3 c fill
-31.5 525.4 moveto
-12 f1
-(Urban Dance Squad) show
-135.5 525.4 moveto
-12 f0
-( ) show
-31.5 512.1 moveto
-12 f2
-(1991:) show
-59.4 512.1 moveto
-12 f0
-( Life'n Perspectives of a Genuine Crossover ) show
-303.5 525.9 moveto
-12 f2
-(UBL Card: ) show
-360.8 525.9 moveto
-12 f0
-(4626) show
-384.8 525.9 moveto
-12 f0
-( ) show
-18.1 499.4 moveto
-3.3 3.3 c fill
-31.5 491.3 moveto
-12 f1
-(Usherhouse) show
-91.5 491.3 moveto
-12 f0
-( ) show
-31.5 478 moveto
-12 f2
-(1993:) show
-59.4 478 moveto
-12 f0
-( Molting ) show
-31.5 464.7 moveto
-12 f2
-(1994:) show
-59.4 464.7 moveto
-12 f0
-( Flux ) show
-18.1 452 moveto
-3.3 3.3 c fill
-31.5 443.9 moveto
-12 f1
-(Ultravox) show
-76.8 443.9 moveto
-12 f0
-( ) show
-31.5 430.6 moveto
-12 f2
-(1978:) show
-59.4 430.6 moveto
-12 f0
-( Systems of Romance ) show
-18.1 417.9 moveto
-3.3 3.3 c fill
-31.5 409.8 moveto
-12 f1
-(Van Acker, Luc) show
-113.1 409.8 moveto
-12 f0
-( ) show
-31.5 396.5 moveto
-12 f2
-(1980:) show
-59.4 396.5 moveto
-12 f0
-( Taking Snapshots, Volume 1 ) show
-300.1 410.3 moveto
-12 f2
-(UBL Card: ) show
-357.4 410.3 moveto
-12 f0
-(1100) show
-381.4 410.3 moveto
-12 f0
-( ) show
-18.1 383.8 moveto
-3.3 3.3 c fill
-31.5 375.7 moveto
-12 f1
-(Vangelis) show
-75.5 375.7 moveto
-12 f0
-( ) show
-31.5 362.4 moveto
-12 f2
-(1994:) show
-59.4 362.4 moveto
-12 f0
-( Blade Runner ) show
-131.7 362.4 moveto
-12 f2
-(\(soundtrack\)) show
-193 362.4 moveto
-12 f0
-( ) show
-298.1 376.2 moveto
-12 f2
-(UBL Card: ) show
-355.4 376.2 moveto
-12 f0
-(1023) show
-379.4 376.2 moveto
-12 f0
-( ) show
-298.1 362.9 moveto
-12 f2
-(See also: ) show
-344.7 362.9 moveto
-12 f0
-(rt66.com) show
-387.6 362.9 moveto
-12 f0
-( ) show
-18.1 349.7 moveto
-3.3 3.3 c fill
-31.5 341.6 moveto
-12 f1
-(various) show
-69.5 341.6 moveto
-12 f0
-( ) show
-31.5 328.3 moveto
-12 f2
-(1980:) show
-59.4 328.3 moveto
-12 f0
-( URGH! A Music War ) show
-171.7 328.3 moveto
-12 f2
-(\(live comp\)) show
-226 328.3 moveto
-12 f0
-( ) show
-31.5 315 moveto
-12 f2
-(1981-1994:) show
-87.4 315 moveto
-12 f0
-( Wax Trax Black Box ) show
-195.7 315 moveto
-12 f2
-(\(comp\)) show
-229.6 315 moveto
-12 f0
-( ) show
-31.5 301.7 moveto
-12 f2
-(1982-198?:) show
-87.4 301.7 moveto
-12 f0
-( In Goth Daze \(Anagram version\) ) show
-252 301.7 moveto
-12 f2
-(\(comp\)) show
-285.9 301.7 moveto
-12 f0
-( ) show
-31.5 288.4 moveto
-12 f2
-(1982-1994:) show
-87.4 288.4 moveto
-12 f0
-( In Goth Daze \(Cleopatra version\) ) show
-254 288.4 moveto
-12 f2
-(\(comp\)) show
-287.9 288.4 moveto
-12 f0
-( ) show
-31.5 275.1 moveto
-12 f2
-(1982-1993:) show
-87.4 275.1 moveto
-12 f0
-( The Whip \(Cleopatra\) ) show
-199.3 275.1 moveto
-12 f2
-(\(comp\)) show
-233.2 275.1 moveto
-12 f0
-( ) show
-31.5 261.8 moveto
-12 f2
-(1984-1985:) show
-87.4 261.8 moveto
-12 f0
-( IQ6: Zang Tumb Tuum Sampled ) show
-251.3 261.8 moveto
-12 f2
-(\(comp\)) show
-285.2 261.8 moveto
-12 f0
-( ) show
-31.5 248.5 moveto
-12 f2
-(1984-1995:) show
-87.4 248.5 moveto
-12 f0
-( DEC ADE NCE \(Nettwerk\) ) show
-227.7 248.5 moveto
-12 f2
-(\(comp\)) show
-261.6 248.5 moveto
-12 f0
-( ) show
-31.5 235.2 moveto
-12 f2
-(1988:) show
-59.4 235.2 moveto
-12 f0
-( This is Electronic Body Music ) show
-212 235.2 moveto
-12 f2
-(\(comp\)) show
-245.9 235.2 moveto
-12 f0
-( ) show
-31.5 221.9 moveto
-12 f2
-(1990:) show
-59.4 221.9 moveto
-12 f0
-( From Across This Gray Land #2 \(Projekt\) ) show
-267.3 221.9 moveto
-12 f2
-(\(comp\)) show
-301.2 221.9 moveto
-12 f0
-( ) show
-31.5 208.6 moveto
-12 f2
-(1990:) show
-59.4 208.6 moveto
-12 f0
-( Doctor Death IV: The Marvels of Insect Life ) show
-281 208.6 moveto
-12 f2
-(\(double comp\)) show
-350.6 208.6 moveto
-12 f0
-( ) show
-31.5 195.3 moveto
-12 f2
-(1990:) show
-59.4 195.3 moveto
-12 f0
-( Red Hot + Blue ) show
-141.1 195.3 moveto
-12 f2
-(\(comp\)) show
-175 195.3 moveto
-12 f0
-( ) show
-31.5 182 moveto
-12 f2
-(1991:) show
-59.4 182 moveto
-12 f0
-( Bouquet of Dreams ) show
-159.3 182 moveto
-12 f2
-(\(comp\)) show
-193.2 182 moveto
-12 f0
-( ) show
-31.5 168.7 moveto
-12 f2
-(1980-1992:) show
-87.4 168.7 moveto
-12 f0
-( Gothic Rock ) show
-154.3 168.7 moveto
-12 f2
-(\(comp\)) show
-188.2 168.7 moveto
-12 f0
-( ) show
-31.5 155.4 moveto
-12 f2
-(1992:) show
-59.4 155.4 moveto
-12 f0
-( Mindfield \(Third Mind\) ) show
-180 155.4 moveto
-12 f2
-(\(comp\)) show
-213.9 155.4 moveto
-12 f0
-( ) show
-31.5 142.1 moveto
-12 f2
-(1992:) show
-59.4 142.1 moveto
-12 f0
-( From Across This Gray Land #3 \(Projekt\) ) show
-267.3 142.1 moveto
-12 f2
-(\(comp\)) show
-301.2 142.1 moveto
-12 f0
-( ) show
-31.5 128.8 moveto
-12 f2
-(1992:) show
-59.4 128.8 moveto
-12 f0
-( The Cyberflesh Conspiracy ) show
-197.3 128.8 moveto
-12 f2
-(\(comp\)) show
-231.2 128.8 moveto
-12 f0
-( ) show
-31.5 115.5 moveto
-12 f2
-(1992:) show
-59.4 115.5 moveto
-12 f0
-( G\341rgula Mec\342nica: World Electrostatic Assembly ) show
-304.6 115.5 moveto
-12 f2
-(\(comp\)) show
-338.5 115.5 moveto
-12 f0
-( ) show
-31.5 102.2 moveto
-12 f2
-(1992:) show
-59.4 102.2 moveto
-12 f0
-( CCCC: California Cyber Crash Compilation \(Cop\) ) show
-309.7 102.2 moveto
-12 f2
-(\(comp\)) show
-343.6 102.2 moveto
-12 f0
-( ) show
-31.5 88.9 moveto
-12 f2
-(1993:) show
-59.4 88.9 moveto
-12 f0
-( Shut Up Kitty ) show
-132.7 88.9 moveto
-12 f2
-(\(comp\)) show
-166.6 88.9 moveto
-12 f0
-( ) show
-31.5 75.6 moveto
-12 f2
-(1988-1993:) show
-87.4 75.6 moveto
-12 f0
-( Can You See It Yet? \(Invisible\) ) show
-245.7 75.6 moveto
-12 f2
-(\(comp\)) show
-279.6 75.6 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 29 29
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1994:) show
-59.4 709.2 moveto
-12 f0
-( Mysterious Encounters \(Cleopatra\) ) show
-234 709.2 moveto
-12 f2
-(\(comp\)) show
-267.9 709.2 moveto
-12 f0
-( ) show
-31.5 695.9 moveto
-12 f2
-(1994:) show
-59.4 695.9 moveto
-12 f0
-( The Crow ) show
-113.7 695.9 moveto
-12 f2
-(\(comp\)) show
-147.6 695.9 moveto
-12 f0
-( ) show
-31.5 682.6 moveto
-12 f2
-(1994:) show
-59.4 682.6 moveto
-12 f0
-( Totentanz: The Best of Zoth Ommog ) show
-243.7 682.6 moveto
-12 f2
-(\(double comp\)) show
-313.3 682.6 moveto
-12 f0
-( ) show
-31.5 669.3 moveto
-12 f2
-(1992:) show
-59.4 669.3 moveto
-12 f0
-( Hy! \(Hyperium Compilation volume 1\) ) show
-254.7 669.3 moveto
-12 f2
-(\(comp\)) show
-288.6 669.3 moveto
-12 f0
-( ) show
-31.5 656 moveto
-12 f2
-(1993:) show
-59.4 656 moveto
-12 f0
-( World Domination Sampler ) show
-199.3 656 moveto
-12 f2
-(\(comp\)) show
-233.2 656 moveto
-12 f0
-( ) show
-31.5 642.7 moveto
-12 f2
-(1993:) show
-59.4 642.7 moveto
-12 f0
-( Rivet Head Culture ) show
-158.7 642.7 moveto
-12 f2
-(\(comp\)) show
-192.6 642.7 moveto
-12 f0
-( ) show
-31.5 629.4 moveto
-12 f2
-(1993:) show
-59.4 629.4 moveto
-12 f0
-( Artificial Intelligence \(Warp\) ) show
-206.6 629.4 moveto
-12 f2
-(\(comp\)) show
-240.5 629.4 moveto
-12 f0
-( ) show
-31.5 616.1 moveto
-12 f2
-(1994:) show
-59.4 616.1 moveto
-12 f0
-( Artificial Intelligence II \(Warp\) ) show
-217.6 616.1 moveto
-12 f2
-(\(comp\)) show
-251.5 616.1 moveto
-12 f0
-( ) show
-31.5 602.8 moveto
-12 f2
-(1994:) show
-59.4 602.8 moveto
-12 f0
-( Big Hard Disk #2 \(Smash\) ) show
-193.3 602.8 moveto
-12 f2
-(\(comp\)) show
-227.2 602.8 moveto
-12 f0
-( ) show
-31.5 589.5 moveto
-12 f2
-(1994:) show
-59.4 589.5 moveto
-12 f0
-( Kindred Spirits \(Bedazzled\) ) show
-200 589.5 moveto
-12 f2
-(\(comp\)) show
-233.9 589.5 moveto
-12 f0
-( ) show
-31.5 576.2 moveto
-12 f2
-(1994:) show
-59.4 576.2 moveto
-12 f0
-( Plug In + Turn On \(Instinct\) ) show
-201.1 576.2 moveto
-12 f2
-(\(comp\)) show
-235 576.2 moveto
-12 f0
-( ) show
-31.5 562.9 moveto
-12 f2
-(1994:) show
-59.4 562.9 moveto
-12 f0
-( The Disease of Lady Madeline \(Anubis\) ) show
-259 562.9 moveto
-12 f2
-(\(comp\)) show
-292.9 562.9 moveto
-12 f0
-( ) show
-31.5 549.6 moveto
-12 f2
-(1994:) show
-59.4 549.6 moveto
-12 f0
-( Natural Born Killers ) show
-164 549.6 moveto
-12 f2
-(\(soundtrack comp\)) show
-254.3 549.6 moveto
-12 f0
-( ) show
-31.5 536.3 moveto
-12 f2
-(1994:) show
-59.4 536.3 moveto
-12 f0
-( Afterburn \(Wax Trax\) ) show
-172 536.3 moveto
-12 f2
-(\(comp\)) show
-205.9 536.3 moveto
-12 f0
-( ) show
-31.5 523 moveto
-12 f2
-(1994:) show
-59.4 523 moveto
-12 f0
-( Chaos Compilation \(Cop\) ) show
-189.4 523 moveto
-12 f2
-(\(comp\)) show
-223.3 523 moveto
-12 f0
-( ) show
-31.5 509.7 moveto
-12 f2
-(1994:) show
-59.4 509.7 moveto
-12 f0
-( Electrocity Vol. 5 ) show
-151 509.7 moveto
-12 f2
-(\(comp\)) show
-184.9 509.7 moveto
-12 f0
-( ) show
-31.5 496.4 moveto
-12 f2
-(1995:) show
-59.4 496.4 moveto
-12 f0
-( Gothik \(Cleopatra\) ) show
-156.3 496.4 moveto
-12 f2
-(\(double comp\)) show
-225.9 496.4 moveto
-12 f0
-( ) show
-31.5 483.1 moveto
-12 f2
-(1995:) show
-59.4 483.1 moveto
-12 f0
-( Godfathers of German Gothic ) show
-209 483.1 moveto
-12 f2
-(\(comp\)) show
-242.9 483.1 moveto
-12 f0
-( ) show
-31.5 469.8 moveto
-12 f2
-(1995:) show
-59.4 469.8 moveto
-12 f0
-( Heavenly Voices III \(Hyperium\) ) show
-222.3 469.8 moveto
-12 f2
-(\(comp\)) show
-256.2 469.8 moveto
-12 f0
-( ) show
-31.5 456.5 moveto
-12 f2
-(1995:) show
-59.4 456.5 moveto
-12 f0
-( Mortal Kombat ) show
-139.7 456.5 moveto
-12 f2
-(\(soundtrack comp\)) show
-230 456.5 moveto
-12 f0
-( ) show
-31.5 443.2 moveto
-12 f2
-(1995:) show
-59.4 443.2 moveto
-12 f0
-( The Tyranny Off the Beat \(Off Beat/Cleopatra\) ) show
-292.6 443.2 moveto
-12 f2
-(\(comp\)) show
-326.5 443.2 moveto
-12 f0
-( ) show
-31.5 429.9 moveto
-12 f2
-(1995:) show
-59.4 429.9 moveto
-12 f0
-( Forced Cranial Removal \(Fifth Colvmn\) ) show
-259.3 429.9 moveto
-12 f2
-(\(comp\)) show
-293.2 429.9 moveto
-12 f0
-( ) show
-31.5 416.6 moveto
-12 f2
-(1995:) show
-59.4 416.6 moveto
-12 f0
-( Dreams in the Witch House \(Grave News\) ) show
-269.3 416.6 moveto
-12 f2
-(\(comp\)) show
-303.2 416.6 moveto
-12 f0
-( ) show
-18.1 403.9 moveto
-3.3 3.3 c fill
-31.5 395.8 moveto
-12 f1
-(Vega, Suzanne) show
-106.8 395.8 moveto
-12 f0
-( ) show
-31.5 382.5 moveto
-12 f2
-(1992:) show
-59.4 382.5 moveto
-12 f0
-( 99.9F ) show
-298.1 396.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 396.3 moveto
-12 f0
-(2088) show
-379.4 396.3 moveto
-12 f0
-( ) show
-18.1 369.8 moveto
-3.3 3.3 c fill
-31.5 361.7 moveto
-12 f1
-(Vinyl Devotion) show
-108.5 361.7 moveto
-12 f0
-( ) show
-31.5 348.4 moveto
-12 f2
-(1994:) show
-59.4 348.4 moveto
-12 f0
-( If They Know You're Trying ) show
-18.1 335.7 moveto
-3.3 3.3 c fill
-31.5 327.6 moveto
-12 f1
-(Volume Magazine) show
-124.4 327.6 moveto
-12 f0
-( ) show
-31.5 314.3 moveto
-12 f2
-(1991:) show
-59.4 314.3 moveto
-12 f0
-( Volume: 1 ) show
-116.4 314.3 moveto
-12 f2
-(\(comp\)) show
-150.3 314.3 moveto
-12 f0
-( ) show
-31.5 301 moveto
-12 f2
-(1991:) show
-59.4 301 moveto
-12 f0
-( Volume: 2 ) show
-116.4 301 moveto
-12 f2
-(\(comp\)) show
-150.3 301 moveto
-12 f0
-( ) show
-31.5 287.7 moveto
-12 f2
-(1992:) show
-59.4 287.7 moveto
-12 f0
-( Volume: 3 ) show
-116.4 287.7 moveto
-12 f2
-(\(comp\)) show
-150.3 287.7 moveto
-12 f0
-( ) show
-31.5 274.4 moveto
-12 f2
-(1992:) show
-59.4 274.4 moveto
-12 f0
-( Volume: 4 ) show
-116.4 274.4 moveto
-12 f2
-(\(comp\)) show
-150.3 274.4 moveto
-12 f0
-( ) show
-31.5 261.1 moveto
-12 f2
-(1995:) show
-59.4 261.1 moveto
-12 f0
-( Wasted: The Best of Volume ) show
-205.3 261.1 moveto
-12 f2
-(\(double comp\)) show
-274.9 261.1 moveto
-12 f0
-( ) show
-18.1 248.4 moveto
-3.3 3.3 c fill
-31.5 240.3 moveto
-12 f1
-(Waitresses, The) show
-112.8 240.3 moveto
-12 f0
-( ) show
-31.5 227 moveto
-12 f2
-(1981:) show
-59.4 227 moveto
-12 f0
-( Wasn't Tomorrow Wonderful? ) show
-31.5 213.7 moveto
-12 f2
-(1982:) show
-59.4 213.7 moveto
-12 f0
-( Bruiseology ) show
-31.5 200.4 moveto
-12 f2
-(1978-1981:) show
-87.4 200.4 moveto
-12 f0
-( Best Of ) show
-130.3 200.4 moveto
-12 f2
-(\(comp\)) show
-164.2 200.4 moveto
-12 f0
-( ) show
-18.1 187.7 moveto
-3.3 3.3 c fill
-31.5 179.6 moveto
-12 f1
-(Wake, The) show
-87.5 179.6 moveto
-12 f0
-( ) show
-31.5 166.3 moveto
-12 f2
-(1993:) show
-59.4 166.3 moveto
-12 f0
-( Masked ) show
-18.1 153.6 moveto
-3.3 3.3 c fill
-31.5 145.5 moveto
-12 f1
-(Wall of Voodoo) show
-111.5 145.5 moveto
-12 f0
-( ) show
-31.5 132.2 moveto
-12 f2
-(1980:) show
-59.4 132.2 moveto
-12 f0
-( fpfpfpfpfpfp ) show
-31.5 118.9 moveto
-12 f2
-(1981:) show
-59.4 118.9 moveto
-12 f0
-( Dark Continent ) show
-31.5 105.6 moveto
-12 f2
-(1982:) show
-59.4 105.6 moveto
-12 f0
-( Call of the West ) show
-31.5 92.3 moveto
-12 f2
-(1986:) show
-59.4 92.3 moveto
-12 f0
-( Seven Days in Sammystown ) show
-31.5 79 moveto
-12 f2
-(1987:) show
-59.4 79 moveto
-12 f0
-( Happy Planet ) show
-pagelevel restore
-showpage
-%%Page: 30 30
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-18.1 714.3 moveto
-3.3 3.3 c fill
-31.5 706.2 moveto
-12 f1
-(Wang Chung) show
-99.8 706.2 moveto
-12 f0
-( ) show
-31.5 692.9 moveto
-12 f2
-(1983:) show
-59.4 692.9 moveto
-12 f0
-( Points On the Curve ) show
-31.5 679.6 moveto
-12 f2
-(1985:) show
-59.4 679.6 moveto
-12 f0
-( To Live and Die in L.A. ) show
-181.7 679.6 moveto
-12 f2
-(\(soundtrack\)) show
-243 679.6 moveto
-12 f0
-( ) show
-304.1 706.7 moveto
-12 f2
-(UBL Card: ) show
-361.4 706.7 moveto
-12 f0
-(2245) show
-385.4 706.7 moveto
-12 f0
-( ) show
-18.1 666.9 moveto
-3.3 3.3 c fill
-31.5 658.8 moveto
-12 f1
-(Westworld) show
-87.4 658.8 moveto
-12 f0
-( ) show
-31.5 645.5 moveto
-12 f2
-(1987:) show
-59.4 645.5 moveto
-12 f0
-( Rockulator ) show
-31.5 632.2 moveto
-12 f2
-(1991:) show
-59.4 632.2 moveto
-12 f0
-( Movers and Shakers ) show
-31.5 618.9 moveto
-12 f2
-(1991:) show
-59.4 618.9 moveto
-12 f0
-( Do No Wrong ) show
-134 618.9 moveto
-12 f2
-(\(single\)) show
-170.6 618.9 moveto
-12 f0
-( ) show
-18.1 606.2 moveto
-3.3 3.3 c fill
-31.5 598.1 moveto
-12 f1
-(Whale) show
-64.8 598.1 moveto
-12 f0
-( ) show
-31.5 584.8 moveto
-12 f2
-(1994:) show
-59.4 584.8 moveto
-12 f0
-( Hobo Humpin Slobo Babe / Eye 842 ) show
-242 584.8 moveto
-12 f2
-(\(single\)) show
-278.6 584.8 moveto
-12 f0
-( ) show
-31.5 571.5 moveto
-12 f2
-(1994:) show
-59.4 571.5 moveto
-12 f0
-( Hobo Humpin Slobo Babe / Lips / Eye 842) show
-31.5 558.2 moveto
-12 f2
-(\(single\)) show
-68.1 558.2 moveto
-12 f0
-( ) show
-31.5 544.9 moveto
-12 f2
-(1994:) show
-59.4 544.9 moveto
-12 f0
-( Pay for Me ) show
-119.3 544.9 moveto
-12 f2
-(\(EP\)) show
-141.9 544.9 moveto
-12 f0
-( ) show
-31.5 531.6 moveto
-12 f2
-(1995:) show
-59.4 531.6 moveto
-12 f0
-( We Care ) show
-31.5 518.3 moveto
-12 f2
-(1995:) show
-59.4 518.3 moveto
-12 f0
-( I'll Do Ya ) show
-114.7 518.3 moveto
-12 f2
-(\(EP\)) show
-137.3 518.3 moveto
-12 f0
-( ) show
-31.5 505 moveto
-12 f2
-(1995:) show
-59.4 505 moveto
-12 f0
-( Hobo Humpin Slobo Babe \(3 mixes\) ) show
-241.7 505 moveto
-12 f2
-(\(single\)) show
-278.3 505 moveto
-12 f0
-( ) show
-31.5 491.7 moveto
-12 f2
-(1995:) show
-59.4 491.7 moveto
-12 f0
-( Hobo Humpin Slobo Babe / You and Your) show
-31.5 478.4 moveto
-12 f0
-(Sister / Singer Star ) show
-124.8 478.4 moveto
-12 f2
-(\(single\)) show
-161.4 478.4 moveto
-12 f0
-( ) show
-298.1 598.6 moveto
-12 f2
-(UBL Card: ) show
-355.4 598.6 moveto
-12 f0
-(3790) show
-379.4 598.6 moveto
-12 f0
-( ) show
-298.1 585.3 moveto
-12 f2
-(See also: ) show
-344.7 585.3 moveto
-12 f0
-(www.vmg.co.uk) show
-424.4 585.3 moveto
-12 f0
-( ) show
-18.1 465.7 moveto
-3.3 3.3 c fill
-31.5 457.6 moveto
-12 f1
-(White Zombie) show
-105.1 457.6 moveto
-12 f0
-( ) show
-31.5 444.3 moveto
-12 f2
-(1992:) show
-59.4 444.3 moveto
-12 f0
-( Nightcrawlers: the KMFDM Remixes ) show
-247.7 444.3 moveto
-12 f2
-(\(EP\)) show
-270.3 444.3 moveto
-12 f0
-( ) show
-18.1 431.6 moveto
-3.3 3.3 c fill
-31.5 423.5 moveto
-12 f1
-(Wilde, Kim) show
-90.8 423.5 moveto
-12 f0
-( ) show
-31.5 410.2 moveto
-12 f2
-(1981:) show
-59.4 410.2 moveto
-12 f0
-( Kim Wilde ) show
-31.5 396.9 moveto
-12 f2
-(1984:) show
-59.4 396.9 moveto
-12 f0
-( Teases & Dares ) show
-31.5 383.6 moveto
-12 f2
-(1981-1993:) show
-87.4 383.6 moveto
-12 f0
-( The Singles Collection ) show
-203.4 383.6 moveto
-12 f2
-(\(comp\)) show
-237.3 383.6 moveto
-12 f0
-( ) show
-18.1 370.9 moveto
-3.3 3.3 c fill
-31.5 362.8 moveto
-12 f1
-(X) show
-40.1 362.8 moveto
-12 f0
-( ) show
-31.5 349.5 moveto
-12 f2
-(1988:) show
-59.4 349.5 moveto
-12 f0
-( Live at the Whiskey-a-Go-Go ) show
-209 349.5 moveto
-12 f2
-(\(double live\)) show
-269.9 349.5 moveto
-12 f0
-( ) show
-18.1 336.8 moveto
-3.3 3.3 c fill
-31.5 328.7 moveto
-12 f1
-(X Marks the Pedwalk) show
-143.1 328.7 moveto
-12 f0
-( ) show
-31.5 315.4 moveto
-12 f2
-(1994:) show
-59.4 315.4 moveto
-12 f0
-( The Killing Had Begun ) show
-18.1 302.7 moveto
-3.3 3.3 c fill
-31.5 294.6 moveto
-12 f1
-(Xorcist) show
-68.8 294.6 moveto
-12 f0
-( ) show
-31.5 281.3 moveto
-12 f2
-(1991:) show
-59.4 281.3 moveto
-12 f0
-( Damned Souls ) show
-31.5 268 moveto
-12 f2
-(1993:) show
-59.4 268 moveto
-12 f0
-( Bitches ) show
-101.4 268 moveto
-12 f2
-(\(EP\)) show
-124 268 moveto
-12 f0
-( ) show
-18.1 255.3 moveto
-3.3 3.3 c fill
-31.5 247.2 moveto
-12 f1
-(XTC) show
-56.8 247.2 moveto
-12 f0
-( ) show
-31.5 233.9 moveto
-12 f2
-(1982:) show
-59.4 233.9 moveto
-12 f0
-( Waxworks ) show
-31.5 220.6 moveto
-12 f2
-(1983:) show
-59.4 220.6 moveto
-12 f0
-( Mummer ) show
-31.5 207.3 moveto
-12 f2
-(1984:) show
-59.4 207.3 moveto
-12 f0
-( The Big Express ) show
-31.5 194 moveto
-12 f2
-(1985:) show
-59.4 194 moveto
-12 f0
-( 25 O'Clock ) show
-300.2 247.7 moveto
-12 f2
-(UBL Card: ) show
-357.5 247.7 moveto
-12 f0
-(1044) show
-381.5 247.7 moveto
-12 f0
-( ) show
-18.1 181.3 moveto
-3.3 3.3 c fill
-31.5 173.2 moveto
-12 f1
-(Xymox) show
-68.1 173.2 moveto
-12 f0
-( ) show
-31.5 159.9 moveto
-12 f2
-(1985:) show
-59.4 159.9 moveto
-12 f0
-( Clan of Xymox ) show
-298.1 173.7 moveto
-12 f2
-(UBL Card: ) show
-355.4 173.7 moveto
-12 f0
-(1295) show
-379.4 173.7 moveto
-12 f0
-( ) show
-298.1 160.4 moveto
-12 f2
-(See also: ) show
-344.7 160.4 moveto
-12 f0
-(isvpc146.isv.uit.no) show
-435.7 160.4 moveto
-12 f0
-( ) show
-18.1 147.2 moveto
-3.3 3.3 c fill
-31.5 139.1 moveto
-12 f1
-(Yamashirogumi, Geinoh) show
-157.5 139.1 moveto
-12 f0
-( ) show
-31.5 125.8 moveto
-12 f2
-(1990:) show
-59.4 125.8 moveto
-12 f0
-( Akira ) show
-92.7 125.8 moveto
-12 f2
-(\(soundtrack\)) show
-154 125.8 moveto
-12 f0
-( ) show
-18.1 113.1 moveto
-3.3 3.3 c fill
-31.5 105 moveto
-12 f1
-(Yazoo) show
-63.4 105 moveto
-12 f0
-( ) show
-31.5 91.7 moveto
-12 f2
-(1982:) show
-59.4 91.7 moveto
-12 f0
-( Upstairs at Eric's ) show
-31.5 78.4 moveto
-12 f2
-(1982:) show
-59.4 78.4 moveto
-12 f0
-( The Other Side of Love ) show
-179.3 78.4 moveto
-12 f2
-(\(single\)) show
-215.9 78.4 moveto
-12 f0
-( ) show
-298.1 105.5 moveto
-12 f2
-(UBL Card: ) show
-355.4 105.5 moveto
-12 f0
-(4309) show
-379.4 105.5 moveto
-12 f0
-( ) show
-298.1 92.2 moveto
-12 f2
-(See also: ) show
-344.7 92.2 moveto
-12 f0
-(rt66.com) show
-387.6 92.2 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%Page: 31 31
-%%BeginPageSetup
-/pagelevel save def
-54 0 translate
-%%EndPageSetup
-newpath 0 72 moveto 504 0 rlineto 0 648 rlineto -504 0 rlineto closepath clip newpath
-31.5 709.2 moveto
-12 f2
-(1983:) show
-59.4 709.2 moveto
-12 f0
-( You and Me Both ) show
-31.5 695.9 moveto
-12 f2
-(1983:) show
-59.4 695.9 moveto
-12 f0
-( Nobody's Diary / State Farm ) show
-204.7 695.9 moveto
-12 f2
-(\(single\)) show
-241.3 695.9 moveto
-12 f0
-( ) show
-31.5 682.6 moveto
-12 f2
-(1983:) show
-59.4 682.6 moveto
-12 f0
-( Situation ) show
-108.7 682.6 moveto
-12 f2
-(\(EP\)) show
-131.3 682.6 moveto
-12 f0
-( ) show
-18.1 669.9 moveto
-3.3 3.3 c fill
-31.5 661.8 moveto
-12 f1
-(Yello) show
-58.1 661.8 moveto
-12 f0
-( ) show
-31.5 648.5 moveto
-12 f2
-(1980:) show
-59.4 648.5 moveto
-12 f0
-( Solid Pleasure ) show
-31.5 635.2 moveto
-12 f2
-(1981:) show
-59.4 635.2 moveto
-12 f0
-( Stella ) show
-31.5 621.9 moveto
-12 f2
-(1983:) show
-59.4 621.9 moveto
-12 f0
-( You Gotta Say Yes to Another Excess ) show
-31.5 608.6 moveto
-12 f2
-(1987:) show
-59.4 608.6 moveto
-12 f0
-( One Second ) show
-31.5 595.3 moveto
-12 f2
-(1988:) show
-59.4 595.3 moveto
-12 f0
-( Flag ) show
-298.1 662.3 moveto
-12 f2
-(UBL Card: ) show
-355.4 662.3 moveto
-12 f0
-(1506) show
-379.4 662.3 moveto
-12 f0
-( ) show
-298.1 649 moveto
-12 f2
-(See also: ) show
-344.7 649 moveto
-12 f0
-(newton.space.net) show
-427.3 649 moveto
-12 f0
-( ) show
-298.1 635.7 moveto
-12 f2
-(See also: ) show
-344.7 635.7 moveto
-12 f0
-(rt66.com) show
-387.6 635.7 moveto
-12 f0
-( ) show
-18.1 582.6 moveto
-3.3 3.3 c fill
-31.5 574.5 moveto
-12 f1
-(Yes) show
-50.1 574.5 moveto
-12 f0
-( ) show
-31.5 561.2 moveto
-12 f2
-(1972:) show
-59.4 561.2 moveto
-12 f0
-( Fragile ) show
-31.5 547.9 moveto
-12 f2
-(1975:) show
-59.4 547.9 moveto
-12 f0
-( Classic Yes ) show
-31.5 534.6 moveto
-12 f2
-(1980:) show
-59.4 534.6 moveto
-12 f0
-( Drama ) show
-31.5 521.3 moveto
-12 f2
-(1983:) show
-59.4 521.3 moveto
-12 f0
-( 90125 ) show
-298.1 575 moveto
-12 f2
-(UBL Card: ) show
-355.4 575 moveto
-12 f0
-(1038) show
-379.4 575 moveto
-12 f0
-( ) show
-pagelevel restore
-showpage
-%%EOF
-
---------------167E2781446B--
-
---------------outer--
-
-eof.
diff --git a/tests/ui-tests/test-multipart-mixed.msg b/tests/ui-tests/test-multipart-mixed.msg
deleted file mode 100644
index 5216c6d6b6..0000000000
--- a/tests/ui-tests/test-multipart-mixed.msg
+++ /dev/null
@@ -1,377 +0,0 @@
-Return-Path: <beatty@COSMOS.VLSI.CS.CMU.EDU>
-Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7)
- id <AA15292> for nsb; Fri, 28 Aug 92 15:13:14 EDT
-Received: from flash.bellcore.com by thumper.bellcore.com (4.1/4.7)
- id <AA15320> for nsb@greenbush; Fri, 28 Aug 92 15:13:12 EDT
-Received: from COSMOS.VLSI.CS.CMU.EDU by flash.bellcore.com (5.65/1.34)
- id AA24840; Fri, 28 Aug 92 15:13:07 -0400
-Message-Id: <9208281913.AA24840@flash.bellcore.com>
-Mime-Version: 1.0
-To: nsb@flash.bellcore.com
-Subject: mew-law encoding?
-Content-Type: multipart/mixed;
- boundary="PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2"
-Date: Fri, 28 Aug 92 15:12:35 EDT
-From: beatty@COSMOS.VLSI.CS.CMU.EDU
-Sender: beatty@COSMOS.VLSI.CS.CMU.EDU
-
-> THIS IS A MESSAGE IN 'MIME' FORMAT. Your mail reader does not support MIME.
-> Some parts of this will be readable as plain text.
-> To see the rest, you will need to upgrade your mail reader.
-
---PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2
-Content-type: text/richtext
-Content-Transfer-Encoding: quoted-printable
-
-I recently got hold of a filter that davecb@nexus.yorku.ca wrote, and whi=
-le
-it's not perfect, at least I've been able to take the "No NeXTmail!" slog=
-an
-out of my .signature. And now that I just thought of such a terrible pun=
-,
-as is in the Subject: above, I couldn't resist inflicting it on someone,
-and you seem to be the most appropriate victim. Anyhow, I guess this is =
-a
-"fan letter:" thanks for MIME.
-<nl><nl>
-
-
---PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2
-Content-type: message/rfc822
-
-26-Aug-92 22:15:02-LCL,22076;000000000000
-Received: from po3.andrew.cmu.edu by COSMOS.VLSI.CS.CMU.EDU id aa13358;
- 26 Aug 92 22:14:26 EDT
-Received: from sqhilton.pc.cs.cmu.edu by po3.andrew.cmu.edu (5.54/3.15) id <AA21478> for beatty@cosmos.vlsi.cs.cmu.edu; Wed, 26 Aug 92 22:14:07 EDT
-Received: by sqhilton.pc.cs.cmu.edu (NeXT-1.0 (From Sendmail 5.52)/NeXT-2.0)
- id AA21178; Wed, 26 Aug 92 22:13:24 EDT
-Date: Wed, 26 Aug 92 22:13:24 EDT
-From: beatty@sqhilton.pc.cs.cmu.edu (Derek Beatty)
-Message-Id: <9208270213.AA21178@sqhilton.pc.cs.cmu.edu>
-Received: by NeXT Mailer (1.63)
-To: dragel@sqhilton.pc.cs.cmu.edu, beatty@sqhilton.pc.cs.cmu.edu
-Subject: mail from Wacky
-X-Next-Attachment: .tar.192.mail_from_Wacky.attach, 23976, 1/1, 33000, 0
-MIME-Version: 1.0
-Content-Type: multipart/mixed; boundary=n2m-MIME-boundary----------
-
-The following is NeXT mail translated to
-MIME format with n2m. This always starts
-with a file called index.rtf, which is
-the actual mail message in Microsoft's
-proprietary rtf, containing references
-of the form "\attachment<number> <name>"
-referring to the other components.
-
---n2m-MIME-boundary----------
-Content-Type: text/plain; type=microsoft-rtf; name=index.rtf
-Content-Transfer-Encoding: 7bit
-
-{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
-\margl120
-\margr120
-{{\attachment0 VoiceMail_beatty0.vox
-}
-}
-
---n2m-MIME-boundary----------
-Content-Type: audio/basic; name=VoiceMail_beatty0.vox
-Content-Transfer-Encoding: base64
-
-LnNuZAAAAJgAADsAAAAAAQAAH0wAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+cW9ze/Lg09XT
-09/d7W/56e30+HH29/vybf/x5eP6dm11b2FeW1dXV1xjZXR5b23+dmBaXmRoa2psb/9wcXLy
-6OTZ3ev+WFNYW3zk3dPNzs7N2uj0aWxqXmNjWlxfcOrk2tjW0djqfWFUTkpKSktOV2NgW198
-/Pfp4Nfb3+Hz+2piYFpt/Pbr9f1uZ3P23tTY09HT2PF0bGJmbXLv4Nza3+j8b2pfW1po+vDk
-82plY15ZXFxeXFpoaGRsXVVXXGFibO7f1NTc7Gx4fGrw39rX3dnd83dtcv/m3t7h9vrn72ln
-YWFdXW57cmhpY2VkaftybW9lbnBoYldYYWf67f9nX19lfHJ89fD6cG59++Xe4d7b2tvc5OPi
-3+Ht5OPo7Pzx9PnzeG5xa2FhW1haXV9YWllYXV9tfXJraGllZWFt9+XZ19bb2d/veGRfWltl
-c+ji6/b9b2hoaP3c19fY4Pj15+Pd09HU0tjlbF9ZS0lJS1VhZmZhY2RdX2ReZV9ibG3+d2df
-XWVte/r983z7eWZmX2d+7tvV087O0c/P0trj/3ZtaXNx6+z68Pv6d3b28e/m7HphU05LTE5R
-XGd0697W1+Hn7/ZsXFZST0xOUVZcc+3k29fX2Njd4up8bv3s4t/d3tnZ3Nvg4vn8+WpxfmJc
-VlVYWWlv69zb2+NsXF1eX1RRWltfWVhdVlFTWGrs3tbW3N7i5u18/Hb/7Oze2d3j4O94eHR6
-++vv8erv5+ni5e/s7//w3uXv/2deWVhYWVVYYWRiZWNr+nFxY15jVVlfW11kX1/939na39rT
-0NLX2+TpfmNud/vxd/Tq2s/S1tnjemlgV1FQU1pjbHJ18vDq6v50ZFxVVVdQUFBNU1lXYXXk
-2NjZ2t77YF1iaW9w+ODe2dTR0dzh7fx79urm3d/r5fL09m/0/XdybGxqYl1nbfTp5t3c3eV5
-XVdNS0xLUldcb3j5/+7n7HlkaWddX2xyem53/3NzduPW0M7P2+t3fv1tfvzs39rZ2d3v7vdv
-Z11ganL4+3JlW1tfX1tebG5sZ1xQSk1QV2br3NrZ1tTj7u9oX19j++rh4fv07Ore2tva2tve
-aVlZVVdcavnp2tLO1eh7YlhVVVZaXF5eYm/89Hx1en7s4t7n6PNpYl5XVFxu/PXi3ur1/Xxv
-ZGVmXV1lbu3a1trY0dHV2dnf9vbu83FlYVtlfHL07uvnfXNkVVBMTU9SYWlxbWZqZl1XUFBb
-Z+ve9Oze3dXZ4eXj3NPW3uh9/2x37u3h4ufp6+z2dWxgbHhpb373+fHve3FpZWxscfbvfW9f
-Uk1NUVNbbmtpfHh+7eng63vv8Xt7a2Ztbe/h4N3e2t3f3N7o6vbq6vz07e3yeP3qdm/57/T3
-/n309nZtZlhWWFdYXGRjW1ZbXlhSUFRdeefh2tTU197d2uXufW9tZF1YXmd99nfw8ebf7e/s
-6ejr8vH9+urp5N3W1+Dt83dsXVlfXl5hXFZVTk9QU2VvbnJy/ezr6Ojl5ffv7/Dq+OXl3tri
-6O7x7+rm3dLT5X5lX15cbXZ3/v7s7HJfWFZVX37r5vrv3ud5aGFjX15dWFdWU1NRVlpbYWFs
-/e7l7vdybXBqaf3n29LS0c3O1t/Z1dbZ2NjY229mZmBpZGNdX2tiYmNbW1xgaGVqZGFgX2Jt
-fWttaGl0eW1pZ2jq39nceGRZVVhbY3zx5N7b2Nzi7eXe2dLP0tfe4/X79XH6/Ovi5OLl43dc
-V1lYTUpLT1FPUlBTXWVqbnbt5O14cWtmX1NUXvjb0s/OzdDW5/94ZGBlcvZ2dHl57OTf3+je
-5Ozs9fZ89H1tal9lZ3Dx/25nbHt4evxybGtqbmNfXVlZXF5fY1tTXHrr6Orf3uXn6ur3aXN7
-/d7d1s/RzdLV1+Dk5uHl9v/9bmVfW1ZTV1VTVVJQWFRPWGJ95t/h4eXu+v31/v96cG5jXl5o
-Z2p19ev8cmplZmhsdfTr5Nvc2dbU0dve4+no8/j2+Ozk3N/vbmdlW2JfVlZWVFRUUlZcY299
-bHrudW5iXGNeX2NvbXrk29HR0tbb5ubk693Z19Xj6OL4e2tfWFZbXWZ5bGZjXV9ocfTr4dbe
-49/5a19j+ent7n3s/V5ZTUtMSk5UXmJhdO7g4ejf6ezg5t3Z4ud8/+3n4u/p593c6eLm4Oh4
-dl9rfHrweXBsY19scmxtXFhZVVVOTVFTX23y4d3e7fTr4t/f5/jy7vZrWl1u9NnV0dDZ3fho
-XmV6d3RjdOl7dGtkX1xnfuzWz9HV3+XzamJcW2FXVVtcZmlmaGBibfHp9HhiXV5ZVFNZZ23h
-1NPP0Nj0Z11kePTq3tna3u93bXN77Onq5efubWFiaWxpamdvemtlXF1eYGBhYlxoaWRsa3j9
-fW937Ojm7+7l5+v07+7/ff979vju7H5vanv9dfLi3+X77+De4fbt4er/efr/fPjk4eDe3up5
-YFFLR0ZISkxPVmP96+jn3dzd5u36cP78fPvud29+9vHt4+ne19rlbFpQVVlbaXfq7unV0tzh
-9XTx+vdyXl9XWGBeWl9zdPbm5OpybnppbGlnY2d3fOrj5ezz+HtlX2Zpam997+zl3NbV3OXv
-eG5tb+/s6dva19fV3PL/eG5iU01LSEhIT1pqevjc1NfW1dvqeGJsaF5gXFpcX2FgXV1p69fS
-z9fn9Wty/P3u7N7X3ePq8HhpbmlhZ25++HFhV09NT1VaX2d0ePvq3+Dk6ufo6ubf3+95cWZZ
-VFVXWlxYW2Fo89vV2NTPztXg7vbl5O/q39ve5Obp63z97f95//11bmJaVlBYYmZ78fHm4fNj
-WVhcX19eW1tbV1RUV1haZWv04eDm+/jq5ePj29jQzMvN0d7u6ndfW1xic/1uZ3F2aGpva/Pt
-5N3l7mNbVFNeXWRsfd/j82NXVFBOUVVZWlx1ePvw/ejo29DMzM7R2d7vcl9bZvfh3OD1dGl0
-ZV5jYn7z7eXt5+Pr4uf7+XhtY19kYGFbXWtwdPj9fvrx82NSTExLTVpefeLh3tzZ3NbP2t/e
-625nb3d6fvv16+Hf4ux1aGZjZ2pzc3Pq7Pf7dnD9+XxwZGNhVVRUUFVaX2Rrb25rbW5oZWV5
-7N/Y2dzl5efc19zi7OTs+nj68fDv6OLn7u/1fu37bGJUXmds7u/l5np+8fp5/P7792tcX11W
-T05UWFtncnVxbG13/3vq5+/s7+zxdG58/Hv/9e3r4d7Y2dvX3+rtfmtsbHXt3t3f3+Df7Hpn
-X2FbWVVPV09OVVNUWl1jXVNXV11oX2Vlb93U0M/OzdDNz9PX3eZ5dm9kXFtZXWhraGVy+uzf
-3+Xk6OTu9nx0/Wxufu33ePT073t093txZ19dWVlYXmBZXWBrfv/+/Xr+831++nX+7PD7fOvf
-2dPY3ub16tzb3eLn5nppaGBlW1xdVVhUT1JPUVlbYmh9/m95a2xrfOvg2tvj5+n9/3Jo+319
-+Pzu/Xj/efj+aHHu6ert3t3f3dzb3uTs7OXi3+ri3+fr/mdfXVtdXWFeXFxdX2BeXFZRUFRX
-UVZdYWhv8ebh397d1dDY2Nbe5/dtaW3t4t/d4+Dg8/T15+vf2flkXltYWVxfX2dob+7p421Y
-V1FTUlRbYG1v//T+bGVoZWht8+Pr9v9pXmRofOjf1NLb3N7zev57fPHu6eTp5ezp397l4ebq
-5OLi4Nzna15YVVxaWF5lY1hYWVBRV1lcbPLp5uLf6PHv5enq93ZgV1ZVWF5gft7b1tfc4N/l
-8+jo4dXV1dTU2On2+2dfXFpXV1dPTlFbX1laYHB0c3dtZ1tdZGJk9e/46eLj7HpqZmZibe/k
-297t9XR99/7p4dnRz9Lf6+13ZGR373FfYV9eanF97u/b0tTb7+7+X1hTU1peY37/9GpdXVdX
-WFtkdX53ZGFcWFxhanH139nU1dvW1tzY0s/U1tLT19zo/3tdUltaXWJkdX11ZFpaWltdW11l
-YV5aWV9aW19p+nj/7/t0eO75anRvefFoZnVmaGdr+fLp5+TWz87P09TT1ePr93lmXWRdXmx3
-79/d3+fz8356fmddXWNdWFlXXmFdXVpZWVpjc/Xo8fLw9+Pe19DQ0dvsbV1gYV5cXW/t7Ovg
-3epzdfvm3+vs7v59fWRfZXb/9/NvdP13bGNcWFZYYGhsa2dhX19ZVllbXlxpenH97+fd2dTU
-3e3/5Nzt9vj44tjV1tna3uXtaWjz83doZ19ZVlNXZXNoaHbr3ehybG1u/ejyfHhqXFdcW1tq
-cujd5uzv7/X8a2NjX2VrZG91b+3j2M/Nzs/P3ev1amJz+//u9HR5dWxrZltYVltibfVyYmNe
-VlRUW3VsX2JZU1hUU1dbeeng3eLc297h4tnY0s7R1Nvne19fXVtq//Pt7OPj5uPv7+n9//dz
-e3dvbWVgZGV47OXf6u52X2BhXlxbWlxfZFxaWFleZ3p5/unu/HhlYmp149rW2N3Uz9XZ3Xxv
-fe7h4enzdfnp7+7r393l7HZWU01JSkdKTk5RW2N1/f3u7u7n5Ofq6PNvbGpjaXD74t7d2NDS
-2ufue2ZwaV9eXGRuYmb66Orn393e2tzg5ern821iXWNnaGNqbXP9bntzX1tVVVhXXW567eLb
-2ujzamVvZHHz/vfs5t/g93VsbOrn7/VoYmz23dvb2dzb3Nvb2NvtcmRcVU9NTExPWmdrYFdV
-U1xeW2Vrcmxq9XRlY2P88+vZzsvKy87Q1OF3ZFtVVFNYYm70397p6PN98fTv5une2+Hp7/j4
-9GxdaGNhblhRUk9OT1ZfaGv67uro7uzh5O7x9+/t6u5+fv729n3p5ufr6u58ZVxXU2Pu593Q
-ysbIz9Tf5exrc2hlXlNRT1ZcYV5XV1xfW11fXV9aWGJjau34bPt7b3doX1hYXGfx7uTY19vn
-9uzm8/rt69na2drk3dva1tznfWlfYVhWW1xgWV1zamt17eHi4+n89vRuYmN3Z19nZWxfXGhg
-W11ibnl7dnf1+fbi2tDQzczSz87S2Oh5al9eXWRtcHBpamNfXGJfXG3+/29kZV1aWFRUWWBp
-bXN0eHz+em1dV1lYXGp2b/T+/Ofk3djUzs/U2d/5//NveGpibnvy7eLX1tfa6vd7/f1vemNc
-YlhYWFpcXWBkbmNlZFlgaXJqWl1XVldVXHjl18zGxMXH0e59altWVFVcaHL15dza2dfX1tLa
-3dzv/2NcXV5z6t7q6u96clxXVllXU1dVU1RRT05PUl1cXHL87n59eX3x/vXr39rY3Obt/nty
-bnrk2tfc3Nnt6tzd3tvb2tvkdF1VT1RXVl1cWltbZG1lZW1+6eHb19ra2uHmb1lST1NWVlJV
-WXHm5dzX1dTX1tnf5X1yZ19gW1tv7NvV0M/T2Nnfffx+aGReV1RPWGBaW1xneHd6eGxsZ2Nm
-XVpaXWNubGRaVVZYavHe1tLR1t3e3O365t7c4fHs6uzw7/J2dGtufGxtcW1xdHNpX11gYnLn
-5PRvZV9cWFhm/+Ti5fFweW9sZWlkX2JqdW747vDd3d3T2+vs4NjX3uXub3Vlb/N88O94cv9y
-bPj8+Hhsc37p/19bW1pgXFpZVVpYX29m++ji3eLj4fRtXVZRU11ZX296fvrn6N/c3Nne6u3p
-6PHx6N7c3eLo5+7i2+Lj83Ryb2Nea2RhXF1eVE5PVFhga3JsbGVrbV5pb2lubG729Px78d7e
-6Onf3tjT0Nvo5e7t+ntvaPr05eDs7u7i4+31fPtxYmhcXF1ZWVteaXn+/Xz8bWFbU1BSWVxg
-aXjv+21rdnF0c//+5trf29na3eba2Nne7/R2/WVeY1xcY3rs5+Hc3uv6dmZgX19pbmRteG9o
-Z2djbHhwYV1cWVlTV1team156dzi39/i2+Dv7urh39XX3d7e3Nzh7vL092xobnv/eurl4t3h
-5uxxa2NaWFZaWFhZV1pfXlxXWWVw7urreGRrffv88+v8/WZkamRkYG748ere3d/p5PdldVxk
-a151eXT97t3W1dDS09DY5WtlZGVqZF9hamhobG1pXFdcV1NZXmZiYmJfWl1qb3n94NvV1tnY
-393z8eLs4d3b3/Hf6O/1ZGZ3bfzu9uLk/GhcX15p7Ovl73NtYV1gZGJufHF89X399fPlbV9p
-cndfZFZQVVBba354YV5gYWn86d7Sy8rLztze6nZlZXdsdff4fX11bfbn5/D7dmRZVE5MTktM
-V2f593pkZG17/nTu3NPO22xdbO7o7N3Pzc7X1dTa7Whu/+19aW1cWmdeWFNRYmlk/fTf1t3m
-6+Pe5Hrm3uTkam5nWllQTE1NTmdrYmlu5etzaGFjZ2Nq7m/x52/s9ffc0srL1d7f/HV2bvJ7
-9ebe3+Lrb/5hXFlaaFJOWVlaW01XcltmX2DseG/t5ej7Z/fb5d/v7t5xeenn5+j95t996295
-c1Zlef3/+OvT1eHeam/vaHTv5eHpdOPvYnJd+/Jd9e/5bF9cWFVQaXDq3XnscGNnXltjWk9h
-XmplTllYX3lv6M7MzMbP0tTm1dfa09vse2tbXk9PVk1bY2zs93T193Xva2piWWpwYV1eW2xl
-YO324d/s2+ns61xOVU9PWlj24+/Ry8rKzc/N2vR8XWdmWmZqZmds+eJ+/e3t5HdmYmJeXVxf
-b1xx6+jg5dnX321na2x+WV9tamhRUFlbWVtd/OJ05vJ2dV9kcuHV0trR1e7Z3dbc+frv3vP7
-bX1eVFtYal9cafXd7uv++F5TW1RcVE9cbn1lZmpyV1t0b9zf29HQ2vTm93leaPz82+Lc6HBp
-Vltq/mbr3O3Z3tjT2N3u3+znbnV5aHVTXW9sYllsYWJcZm5o6WRk+m9yanZcU1BUW1v8+ezm
-49zt2Oj06vvb6t3gdP1x7ufb2tnb39vs6XJXV1lgZHFpbfh0+11mYVZkZf1pffxtZlNVT15l
-XX545vLvfHJ5ZeP14Odl697Y6un3ce5z8Xju39/b29Ti3t/p6fbg9u5vWl1ZXU5SW2dvXfr2
-fHJfW2BgWG7v6W5q7WFnYllt9+D/7edxW1p9+uTm4dPKyNna5fxta3JfbGR14NTP5+f2enhv
-7Ork4fdyYllNTExMS1d7YXduWldRTElf83n34dff4eTt/nh+bdra/HZod15jbF9ndN7ZzcbO
-0tTT6O7b7uTf3+975l5OU1pZYuH1fvH7YFFeUFlmaW9k7GFXV1RYUmdcYOfs91xuYFp1b31r
-29TWzNDU5djZ3tHa2OzZ319uaPV27OHy2el9X2BuW19dWlpZYFVST05SXm9fa3n7aV9pZnJh
-Xm357OnudfDvb3Tw4dzd393m4O5gdW136dfLztTf2djV1e78Zl9TTFlZV1lZbunf6X5vam9u
-9n5bYWFfaWVmVVJVWFtd+m9ka2l8/+Xd2tXa2eTm3eLl6N/2/uPe2ebq/nXe4PNsZn1u893h
-eWzyZmR5ZVlbW1ZUXlZNTlFYUVxpW2dqZ3bq2vDz3dvd6t7xbXhncejY3+ni9+bs6Ofs3/b+
-6eHj49/m6ubr9O3feF5jaWRmbG5eXl5UYHF6Zl1eXGV3c19fZldfbH5+eftsavbm93n5c2v6
-4dnc5nV66+v493pr6t/b1tXY4vTs397Uz915bnBdW19VU1VUW1tnXlFWVl5obW9eZGZdXFlg
-WVJYYurj4+Hj1dXTzs/L1+Dd4N/r7uxuaG7u59/f825kYF1kbGhaUVJYW2dnYGx+6/7v2ufs
-9XJ+ZHBfVVdXXVvr1+jk39zxdup1aGNzZGff5v3w3N3o29Hd9PVqa/3sfmVvem923djee3dz
-dvVqV09XXVpodmhbWWVqaXBoVFReXlxbbnxfYP3te/n7W2fu6+/XyMrOz8zQ1c/c6Ozs8nPb
-23NdXGVXU2FfTk9UUlpjZllRX2ll79nZ4N7d3/jt/Vdd8+lwZnZrYWViXF/5cmBj/uV49OZu
-af/t9uPP1uLi0MzXz8vV7Pd0XX3id15h/2FYanNdVFlaWGRtXFFNV1JQanx0Yl9vY/n6W1dd
-5e1y3uFwfN/Z3tbT2+rr3+vp39vm/u/0fN/Z6nt+9l5Zef9dWWVlbOnyfX11b2dq+PNdWGZm
-Xm/+Zl1cYFtm/WVVV3NgauHc3+7f2dzb2dv7at/e49nk+Pnx9e3l2tfscndcW3Roa2Vo5tfe
-4+RvXGlrY/NqXV9MSElLVVROTFhfYevv+unt3dXf3tve7+bZ3NLX7G9h8eHm4t/ucf5pWm1u
-ZXho++J49+94bP35dt/h7HpaX2VicmheXGZqX+zm+HFXXGZfZ21dWmpnZ+ff4/9p9eze3uL4
-59bf6dvX5vjx5Nba2tnm397vYmhvXV5UWF9ZVlxZV2psaeLsd/9cXW5kXWFSTVJPTV9taHl2
-6dzd5djW6dnU39TW5v9faur+au7s9+jh9N3fdvZmY/DufOzj6e/yYnjuX2xWVW9qanJra2Vi
-W334XV5WVGNmWltdY27r8d3Z79/rcefe9+ff293b3dnX9OfwX/bq7OPs8WX+9nF6XP7tVnzc
-bGpobV9dZW75X2ZfSk1RSU9aZ2v42dXW693fW2zfbnHx6f128P31aWn8XXzT4Ord2+Xm09LO
-29nO6PzlWU1OUE5KVV/3eHHoWVnrY1pud29eY19eXFdkWF3Ny9nR0eJ0+n3v/2n0a1/Y21tk
-bGNccOHb2tTL3Xva4F//3Oxpeuf5/29yV0ZSZVRab3ds6Nfe6vjyWEdXZE5RX1RPWmV5++/Y
-1uPVyt7p1uVra/n/e/Pq6WBj1uX70dji5t3e7vxwYU5W9V9UbnhqePPq3+jo4mtZcFNET05O
-UllfZH3s5WBb5uZm4Nnm493V0NXRz+T22NZu+21dYGZya/n68G1d5etZ5+B0+3Zvd+Pe331W
-ae5bdvBgXVxbVltVWlhQcfJo3dPu9vX99uzu7GpX+uVp+upmXF1h7dfc3Opq39R689746NjT
-1NTf4nZXZWtOUlxPUVlSTVVRUlFNb+5n7tPa4t3j8+3z4uB63tlxd9t+ZvL/b+7w6vxYZvdZ
-Ydvd2tDP2Nvf4vldat92etTd7Ox3XWNfZmRQUlxTUmtaU11jZPvo5eVoXnFfVuvqcPbxbn3/
-ZV5XY+PffNPY8fP55t7Y2Nro9tbUeuTpZGJaW2BoX1xVUV12W3fsXm348/9samthXXjfaWjn
-b3b2dfbt9nddV27hXlb0/e3j4eDf2tvpbnPf6fPT5vXd4OXf4drl/O7t/GTpemNr/3N4d11X
-TVBcU09naGNmc3r17GZmWVRfbmD37m1seG1o7G/959zQz9ve3+t5evt33+Lj6X3/cVZWYGd3
-/PTv3P5eVk5NUVlh5NzS1d777OxfWE9QXHH02d7b2Ptj8+Zzcv1wbv1teWdrdmZq39LU1NTa
-8/xt/2peZVlY/9jmevX3bPDq5ubu5fJreN7vX15ZUVZYTU5XZGhYZ9rd/H1rVlZpbGNy5t7v
-69jb6t3X4PXZ0+7q2uJqW/niamNrZFdu8l9eeXZPU2f8emvo8Wbj1Hd43u9XTFn0aVljcWNs
-3Hxe99/scOvZ3ujm9WFm4WxZ7tjrdOXW1+fg6FtPbu1l79rnc+jb1+Px625n5uVbWV9XTFBd
-ZmRicVxSXX5jaOfoamtreOn09Whn7tba4dTY6fz8fevvZVxYV2JmZu3q/nrh1dDP1N7/Y2Zq
-WFdXVlp29t7b7WtXUU1TW2z2fnt4X1/x9XNpfO7j2NjS3Ph3b3Lk3vlveOji6O53ZWFeXWTl
-z9fua19XW2Fo7t7d3+fUzd9dT1BQX3zv3uPvb1FPY1pMTmFvb9vd3tvs+l9c/fldWGlfV2n0
-6ufXysrNxb/M3uHxW11nXFpfZ11XdedgVVVZT01cVFJaXlNLVvPq6+DU1drW3+Z7YmBRXNva
-e19mYVltb2L83dXU0snH2fr+bFpkcGv8/O1tX3ni72ru43ru2uLq6/ViWXbc52tZUVNPXWtm
-cW5hVlZw83BiYHp0c3loaX78aWjj0d3q593T0MzN09TY5mxo5vBeU1VZTE1SVl1s6/z32Nbe
-ZGZlT01NTE5QWV5h6N7e5ObU2t7W19/o7GlVUmJcTk1bZ17z0tPX1Njd3trQ1ejl3t/s4995
-ev3u39vT1O9kX1NQW15RT11cV1pbW09LUVNPXuXf3tfY4Xt09nBYXWtlceXh6t7a2dTS1dHV
-2dLW7OrZ7fDqcGFZVVlVUFVYWFxvZlZTU1FefeTlZFpWU1Rn+vXk3trd4t7Y521fXFhp/Ftd
-YWN0c//o4eTb0Nba0+rv7/na1tHLyszS2+1eZ15XWFBaX15faGJYU1hXYuDh72hvXk1LTk1M
-TFRdadrb1dva09TR1dLS2uLn7drc4fNj8ufv+e7n5m5tZ11pXlxVU1pgbW7/9WlfYWby7nRq
-bu/e33F3bV1OTE9RY1xaX11ucmRrbvX9Z+zc09Dh39vOytLY3dTN49zT3Nh7WVdPXGBaan7k
-blpxa/36dfhiZ3dgXVpdUk1YX219Z15fddvZ7mx+/FtbZmro5fvf2tTP2d3b2Od4aF5eXVZe
-7NzN0ePd1tjkfndqbGBPUFBf+2dne3j7bWh4ZnxiTU5LTVVTXnPs53Fvbnf6YWTy4t7ydvbk
-2NbUzszN1tXP1NHW6O1sWVRRV1575nr67vtrWV5gZWxpaml1/WVaZlxUV1FVXnj/Xmvm29ns
-7npzeWddWV9gXF12593a3dXW083b59jS3XV2/HF3YWbj3dfX7+vk5vtlevr/aVFSTk1TTUpN
-VVVLTVlr5eHc4/Xm7mdv8uxdT2Fw6t/+/3P63d/n3dDP4uLc4NnsZWxu8OP3/e3j73Ll4dnS
-73Z3YWVQS1RYXVxea2/r5Pp5aWZkWVZZXmJi/erc1d/n5eXk9W1ye3L5d2R36+tya/5v7eXW
-ysrM0tfe3vNqYWB4cW5la19YVUxMS0xIR0tXaW57evV5fXJfWVlaZOno2+d9e+jY3NPO1dHV
-9Pr1bv5jbOTg3eTP0+Te3/BrZXxnWnv4fW5kZ1xdZF9hc3D0al979+hmWF1ZWFpSW+7h33f6
-3+fobmZrfu33bXPvfmFXbN3PztLPzs3L1ODi7PlZTllYZ3Fr8Xls//r363xkVE9YYWBZX1tc
-ZFtkbWFcVFFid/D6YWhoZFleanL9/drd1tDRzM7R29/zbXrs7Pbv/+TtbnZqeunvev/+6ejo
-9OrcfXBcXVtOUlhtb25gWllZX2RlZ3ZqaWVvbnL2bPbo5urt/XHu5fLo2trS0s7P5NjW3e9w
-7nBdY2Zz+mZiYVpnXlVMSFhiZ/Pn4+94bGRcXmVuZWR5bmRoaV7+cHz7fd3f3G905Pf0/GJf
-9m5lXmbe29LV1dHSzNba2Nng/llSXFpcVF5la+rv7Ozj+2pWUltaV05WWWNsdHHr2up7XGP1
-allQW3Vpde3r2NDOzM/My9Pna2deV1NNTvXUztHY0tXV8G5sZmpdWV72c1xSWPbm71xlb2FX
-T0xIUUxITljy7ODq3c3R2vNl99vs+3X64utwX/3f2s/OzM3T/ldMTlhgZHPcz8/X5Pve3Gxd
-UlhcWE9IT1NYXWJv39ffenrc1tnxXWjzeV9SVODX6vls3+T4bE9WbGlkY/PKyNDS2crJ1elZ
-b/V0W0tMXf1ZU1/j0M/W6d3fZU0+P01RS05a69bY5mjy83dfXPvl8F5RWPTZ1ujqy8jR53Lu
-5/1WUFv02tfZ3NLT9Wtabtr8XVhdbmZeU05q9mZfZPDfelpNT2p5/W5w2NTdcltv5edZVGXs
-23xZW/71bW51zsPGyc/Oy9f+Wk1cd1xcW2bk3OPu2tLf9VVRb2tdVU9QXGNkaW7b2uX2WWtp
-VVBGR1RobWlf8t96Z1nu23ttXmTt1M/T1czHz99v5dLT3F9VbHjvaV5fYnpvYH3V2HhbWXfo
-a1xPWmxnZmZs+mlUTEtf69nkeeTV1OxjXejxb2lPcdPO2fve2tnsZGXq71ZRT2nU0dt4dODY
-5Xxr5djn/Vln4udwVVhga2tsb+fcYUxERlNoY1FWZeff+m753nRhWl3fzs/zXG/j5OXu3M/X
-2e372M/SbVpk69HY9evedVdLR1N832RQVmzpZFdQYXZbUlH5zcvbZ2H37PxlXe3kdlhMV+vf
-Z1Nc38zL1dvNydVuU1rj1ulPSllu/mRt69bXfmFf0sjTfVntzthvXWvZ5k5DQ1d5YU1HVfrl
-bV9lfPtNQkRZ3dvsa+bMzNLe2c7L41hZd87N3Wxz6vZmVVlp6vVXVF7bztxtW+rZ3fBtZmdc
-RkBEWd3jd2Bq4NHY2NHUz+1cYmXp6mBXT1/oe3Hr3tniZl1aY+ttXF1cZWNr6NzR0N3m4M7J
-zdfk/Ojkfm9iX2BYTUpOUlNTTk9PWWVo8dra5Xpz+eHS1tzta3tuY3FiW2VqX2Vn+dfX1dvp
-3eTo3ubr9GpkV1hxe3RoWGX9593saFxiWlJPWPz6a1lUZ+3h3eXx3u39bm/k3e1gWGrb1+R4
-XGv8Z2Vq7dXRz9vkzszO32VrdGJbWGHb2eHrZWx7cV9WW3L6/15QXmNVTUlP6dHW6Hd9aFpN
-UmLv2+1zaXH3aFdXYvXa5fTk2tHc5/bq29bf7+/h1eH2fW5vY1xmev10ZVxWXWzw9WRtbGpm
-Wl5aVFRUVmB37+Hx5+f79nBuef766uXV0d3e73XtcPXd3NLb6fNdbuvz63v+fWhdWV1eZ3Lz
-19LMys/V6GxbTEtOTU5NSk1TV19oa3B0+ur4+Pfx72hcXGh+29bb1tbb6Off19HT3PD58N7g
-+GtpY1ZNTFVUWVtVVVRde+v47NvY2uTm5ejk/1lcXGnu8Orr7N/tbmpbXmZbW19i8+Tk4t3m
-8Wxr6trO2GhaWlple2Z05NrQ1tXQ0tt+WFNabvb+693b6l5PS01UU01JT118/FxXWWJmVlr9
-2NDW6/zs7Ozr8trMycze6tza4WRXXmzs29jj4/NeUUxPXXZtXFxn7ODkem/m3+J7av7792JW
-V1dnc3X7/nljXlhVX292X1ZWZfHu5d7Xz9DY5+ff1tr9bHDs7ndsdujf3vP629LR4GNdXWFm
-ZmRtd35xV1FYWllNS05TYGBdcOLV1uZ67t3c5vZsYfjf3N3o3dPY5X15dPP4W1RVYGhteW74
-6ud89+bl4vhoa3X4//vuePxrYmNbX21zYV9mZfzvenfv5P1dUk5YeGxsenJ+eHFtcH7u29nk
-4tvW2eDa29ze39/i5/N9ZFxbZvfm3OHi33JcUkpKTFFVV1dbYFpZWmD05dvZ1NHc6W1fXF1f
-au/c08/b5eT48eTh19ne6/v2b2ZfXWNp/+Xf6X1vYFhYWW3x8Ojg5fhyYGFfWlZQVlRUXV1j
-bGxqbGpu/nVrYmFlZGZgZ+vc087PztHW09rj7unr6+76evvu9f9u+Ojm7nd2fXvt5+316u/x
-eV1dW1pWTUpISVBWX2VrfW1sc/De3dne4u3t5//0fP/17vR649vQ0dzf7fLu6un87v5tbGhj
-YGT5eV5eX2luYldWWFtgXl5namJXTk5Xc+nj2tnf4OTc0dXZ4u5vXFxZWWBkaWt46tnPzszQ
-3ODn/vDi+W5gW2FiY3zj5OV4aWdf+nT9emj9Y1dXWmt4bGZrb3V2Zl9eYWFiYmVw7+t2aVxZ
-X+/h4dXN0M7NzM3S1ON2aWd18XpsamhkXVVSX3Rsb21kYV5eYl1dY15bXm703+Dtbl1fWl1s
-Yl5ibfVzdfJ6fHl27uve3eLj4t7r8vD16eHo7Pz47Ovf4efl4NvRz8/P0Nn1W09JSEtPUFFY
-W1tbWlxrdG1dW15haHJ98ez9fe7u6NTS1+5qZFxu/e/e2tfY2dbc29nsbFpYY2BmX11sa37i
-3NbZ2upqXFhYVFRRTUxNUltu/vXl9nJrdd7d6uz7fnpdXGj14NnZ4ujydejh7dve7/h6fnNq
-dm535ujf2NXc3+v9aVpbV1pfaG5sbXBnbnzzfnnn7nBlXVtWTUtMV2ppa//t6nRhdPj07fLv
-6t3Szs/Oz9fe4dzf6Oj4+X1jXV9ibfz/93Zud2lkX2dvZl1gbW7x+W17b15WUFFVWF9oV1RZ
-WV5fd+Te293j3tnf397Wzs7P1NnucW1gXllcZXjr3d/k7Wpqanvn6eTZ3+328nBgXVZWV1pW
-W1tbaWVhV1Nda29tZ15YVldq6uff3NfS2NjY3t/qffro2drh5vF8YmhsbuTd2N7e3+7sbG1r
-bu7p7G9cWV9dWVFLTFBQUldZWVdbYmX73tLS1tzl3eHc2t/o6uvz6vRvaVtVVVxtfuTn7OF8
-a2pfbOXW09ba6PP07u50bmlma3ZnU09OTU5VY3zj2M/O2t/vcnP+5+t+bnL+cWdnbXdnZmth
-Z11eaGJx9uTa19TV09XX2u54bHjs6/h3bmRkZF1jYl5hXVdWW1ldXV1eWmV97+fh4/dmVlNP
-V3r74t7f3ePi5t7e3tra0dTa3ObifGxsaOvo393v9V5VU01NTVFUWWlvbXj69vprb2hq+eXT
-0NnffXnu7vPz/2tnXlxcXF5aYWpu7O/o4d3Y1trf3+jq7+/u+H1rcvt67drZ3OHx+W5582ld
-ZGJbXlxbYGFrb15ZUU5XWlZXWE5NUFv23NXNyc7X3uz18uv9aV1TUGDn3NTS09bk5t/f3d/v
-Z11daXBz6+Xh2t7q731udGJZVk5NUF1rc3dyeG1mZmxtfO7tb19fbXZx9/91Z11kcPzv9Pn1
-9unn6eTe18/Nz9PV1tnmfGlfZWx74uDv4eh5ZlhWT01NSkpMUllgZVxfbv7n6OXme25oZFpb
-aXjv29XS09bb5+/zbl9kePPn39/u+vD/8eT18u3r7nX5+W9kXV9od/Ts6/jt9XprWldUU19m
-Y2dxdmdoXl9iZWtmeOzs3drg4/Z7d3Xo4t/rdG9obWp95OTb1NPW4eHX2dvpeWlZW1hYXlZn
-+X3t8PV1dmVZVk1JSUtSXGhx/+745ut7fGRreWn/8vHm7+Ln7OTv3dPTz8zN0NLe+2pdYmVh
-+/n77v7yZV5hWVZPU1dYU1NaXP3s5dvb2dTd6vpnWlNRWGNieHdy8nr15uPc3+Z6ZXNkX2Nm
-ffbm1c3P19/k3+To3d7g7XL373f9c25wWltVT1dfb2xmXlhbZnj+4fNsbVZYUUtUWGhvYnRo
-b3313tfQ19TO2uJ8Y25v8OLk2tPS2N3ubGVaXmdmZltdbX19bO/rdndoZG9lYn7i4N/hbWVf
-W1pWWVNOSkxZXG/l7u3o39rm39nd09Xa2d/l/3N5cnN479/d1s/P1NrY2u99/mxmYFtVT1ZZ
-XndsbXx3cnpkWVROTkpKSklRXWnz4evc19zZ5eLj9+Ph3tnc0tPY2Off5+/9Z2ldW19jbvnz
-fHp1bmRfcur7d3tmYFVRWGD79OTc3eL7ZlxeWVBVW11jYWZna3Xt2Nvm7ujc5vDy++jm4N3m
-3dnc2+Hi4/T+cGt1e3rzfO7f5d/b4vtnWVlZXFlbZWvybF1dU01MTE5PUlVWV1xreO3f39fQ
-y8nP2OL7dXzu5+715NzS0NTX1tz9bmFaUU1PT1RTT1NbcuLZ19rg9Hl5ZWRjYF9ibWhdW19b
-W2NebHhvfe3g3eZ8/fzr4uXk4tnY3uTy+uvi1M7Pz8/S1+dvbWZWVFZka19fWl9lZmz98fxl
-VU9UU0xQVmBobfl+bXX4+O/n4X15+Ph4ae3v69TQzM/g43BaTUZJSE5j+9DP1dbn5+Le3t/f
-3t7e4nxlX1xjbG5nZF9dX1xZTk5NS1ZgdPji2Nna2dXT1dnq5PtjXE5LSE1hcurU0M3JyMvU
-2vlud2dvdXB0Xmjc2d7l29joe/ZsUlBSS0xMTlVNWGD89O/c6Xd25ebq8/ns9PxqdGxjcm18
-/Pvj8+x9Yfp96d3j3u/s//7f6PNsaG1+7/R2d2RgbWFYXWFgXnjb4elzamhZXlZVYWz/ZGz9
-bnl5durd1NPT1Nvl+v/+/vL99+Xl7uvxdHhmW2N0amnp3Nzd1tfd3t7deGRhU05OSkhHSk9X
-W3jm4+Xs6+5mZ2dfbX3k3NvW2NXX3+H+bGNcZmVmW1lqZGjz+O/2/N/X0NPd2tfY2vRvaFxY
-YGppcH70b11ZU0xHSE1XX1lYZ/zs39/q8era1tfe2dno/XJjXV9dbt/Z2eT86NfN0NXd8ubs
-9fVydv72fm1lXVJQUU9YW2JjXGpjZGdx73f59Pbp6d3pfXJmcnBkYF5q9ufg631cV1tcZ2/x
-3dTR09PY2uHk3tvd6vJnYlxUWFNZW2F8ampiXl9ZY2Rr/mx2+X1uZ2tqdPB4fuv4e2NaV1Vf
-euvo6ens6ejx6+ns2NXSz9XZ3+Pb2Nzg5u/7+fJ+b2FVTUpMTE5ZZHTu6ubd3+Xc2+l3aWNm
-XlhRTE1TX3Tl19vd4/VzZWRsc3X0/216em9z39fSztHY5/R1amFgXV9mYGh+/u349+3n4/dz
-aV9lX1diZWJueX5xbV9XVlVVWVtndfvf4d3a9HZ2+PJ54dnY197h6mpqaf/p4N7e3+bpenvv
-5Nzb29/9YlxcXV1eaGtsfOvqc213ZFxXUlZcXm3z7un8cG1candpYmnv7vj/Z2JeaHlw5t3a
-09PV2eTvffl99+Td2Nvn9/9iWltWW3P5c2ZbWllQWFpUWF5laHN0Y21yamdhZ21+4t7b2uLv
-+Pn0597Z2t3e4Nze4ebn3t3Z2uV7aVxeX15dXWNqbGdkZF5cWl5x8fl+9+/t7u/v83z86vxq
-YmBeWlVSUE5adera1t3a29/c5ejk393mfm1qbXr+5uPb29fT3epsXFJOTlFUWFlaXV5kdXp+
-6uTh6P3zalRMS09WVlxo9+Tl3dnd2dfc2Nzxfmlsc3f2eGxvePrl29bV1dPS0dLb7np3b2lj
-WlRYWFhWV1xoen3n6OnrcXBfWlZZXl5nYmBsdmRfZWr86ePf7Ovl6uXo7nJreHb49n11eevs
-6Ob06unl3ejk3Nfb7N/k8vZpX1lVVVRWWVpcWVNXXmJaWFxca2Znc2767+Pe4eHh3d/p8/p7
-b29qZ29xcufd1s7Q2uf7/Ht79Hf7e2dyc2tyc3fr5+vn7Pb59ff/Z19gXV1cYl9gamZeXGBk
-b/v/b2pnaWdy+vny9+rh4dra3Nvb2Nvd8H54ffJ4bmNs+vN9/urs9v94bWxhWVxbVVJPTU1P
-UlpbYPnp5ebw4t/t8ezo7P1uYF9z6uTg3dnc3u/6c2FjYXD6+O3j4+/u7OPj6ejp4tzb3u18
-eGpuZGny+vn9aVxUTUpKUF1z7OPj8u/ybm9laf1t+vhoalhSVFZldt3Py8rLys/g9f57aXXt
-+uh+aWteaO/c1+De2t3feWRaVlJMS0xPV11ibmZfXV1cZvjo5+vwd2ZaWFlj/uzr9vPn5+zq
-3dva2t3f4+nr5evj3Nnb5e53Yl1fXVldX2/yYFxt/fHv9Ozq7+/9amZdWFNPVV1jfOnt9fn7
-bnzo5uXj5uPf3+To93JxbWxr8urf19/r+nRmY2R23t3c3+zu/nhqZm5yaGBeVE1MTExOVlte
-Z2xtcWtvcWJoZWl19un+897l+f91++Pe1s/S0dXZ297lbmt2aH56bf3v49/h3N7m6O3p4uD0
-aF1XXF5mcWxwbl9TTk1OTVFXXWtmXVdaX11gZ/7d19XQ09bb4eLs4tva1tXV1t3pbWhjYGFl
-+vH4fXFsfOjs8e94fPR4bmNZV05NT1ZeW2n75Nje7XxmXFdXWVJPVVpcX2j36+zq4t7d3NvZ
-1NbZ1trd3+rx//97d+rf6vp9dnx4/Ph77+no9nFiW1tTTk5TVlZi7d/h42xfZ3h8+PP+6uPx
-a2VcXvnu7dzS0Nnh7G9paVli+//p6fHu7en9Z238//rq7eTc5+fi6XRleOzp/mVfXFFOTktH
-SExPVF1iYGFhbO/l5d3V1tbT2eDo8e3t39ze2eLp6Px7cG1fXmNp9fbg3NnV2dne3+9ybF5Z
-UE1QTlFYV2x98N/f4e1vYFtnePnp7f1mX2RdXF1da/ng3d7m7OP1ZXv++uTu7Ovn3+7x49PN
-zMrP09Tie2BWUExNTktNUlZbWl9hXGJ76tzh6+v7dmVYUFBSXXF2/u3n6ez2+Pd989/X2N/u
-7t3a3Ovv5eHd6nFkXltbYv/l29vr5t/me1tXXFxbWFlgXWL98/x19O77dGRhYGFdW15fZf3h
-4Off39/c3ud3Z2hga2dw7+7j5tzZ0c/T1tba9P5mXF9cZmFZXWdYU1lXZ2dgdm1naVxYVFll
-cvXu72lcXVteee7i2NzY2dvX4Ont6flvbmpvdPLt6dvf4uXo5/ZzZmtzbnH56vT5cmRpaGJt
-cWZcXmNaYHRsaWxsYV5jfe3r4ux+9nlqZWpwbG92/fHo7e7s7+/69vXq3uTj4+nl4u3r3eHb
-1t3ieWZeU01NU1tt9d/X2d/v/m5ZWVdYXWNlX1xbV1FUXGh38u7q9l9VUFJcaHbj1s7Oz9Pb
-2t/f2dvk9/rr5e7i5Pj39fT7+/tuY2JiX1lZXVpkbXPv+nFrZWVcUlNUUFZea/rj2NbW2Njc
-7mhdV1li/+Pd2Njb1dHPz9bd8fv4dmdiXVZQT1pmb+vi3N3v+fh+8fh9eGptaGBdXFxaW19f
-ZmRfaGRrbGltcv3x8X3/9u/f1dvg8n74dm1sa2RdX2p98Ozp39ze4u34eXby6vh07O9+/2lk
-aGFZVVRST05PUldXZnzk1c7O1dTZ3t7m4+bc3t7a5+jm82Zhal5aXGZtb25q/ebb197k6Orf
-4t7a4+f2ZWBcV1RQVFheZGdfXVtYX2lnXlpgX2FqZW5zae3s8Ot6bm3x7/ry8+vp5tjX2Nfa
-3d/q593d5ezycnn0/nlta29dVllaWVRTVVZbX2JeXWptbG1cWl5s4tbX087S2Nzf3ufu9X1v
-Yl9dWVlice3i29LU2t7f4vd2d3RpX2htem9y7d7W1dje6flxYFZPS0VESExPWGn9++ne4O9y
-X19qaV9j/uHl3dzs7Pft7O/g4t7c2tjj73x0dvjv3trk6W9hYlxmb2pv++//d3RzXlRNSE5W
-XGNp6uf1/mxw8OXf3dXS3OL4aGNaWVRTYHvv7W9kbW5t8N7V0tXW1dfY193c19nd3NzoeGBV
-UlRWWVdTWGJeWV9rdnJsbV9hZl5aW19jd+3m5Ofs7/Xu8W9fYWRdWV5rcevh4OPg6N3Y2tze
-2tfhfPnvfWplcPjq5/l7Yl1dW2lhW11aW2lsbG9sbGx1bmReXWBueXd8fXP+8u3q8+vf2dPU
-1tru/HZ28HlybnBzYV9jdP7+3Nfc4Ojo+mpkZXP89/pzfuvp3+l5bmlrZGdfVlFTVFhfcfbx
-6+x8bWdeWFhbYnz36uvr297Z09jZ7HF5Z3J5bnl8dvt4bGtud/La1dzl6/9mV1JYXF5pc3fx
-/nJeVFRPU19hcu7g2t/ecmN9fvHa0dHR09rrZ1xbWV/45t7V3O30fXRjZ37v3NbX2OdqW1hX
-TlJSaGhobWloYlpZW19t++fc5flzZ2x0ZHN3e+7d397f5+5qYl9dYl1j/OXc19vj5Onb29jR
-1d/zYWNgWltYYV9dYGVdW19dZWR68XRwbWdkYmRpeOni3e79dGJXU1Zn++Prfu/u6Ol4fO35
-6+Hd1dPY3N7c2+Tw6u7s6+nkd2NYT09RWWd489/d5PpvX1hdXmF393luZ1xRWVtTWl1kXmV5
-6+bu+P/z5+jg3trT2t3la2VfYmpo79/c19fSz9bueG1iYl5bWVlo7OHj9mhkbW98eHNiWFta
-T0pFRUpOXmx+49bPz9LX7ff++uvl2Nre3+Df/2549OTf3eT0cF9l/+Lc2tTR19zral1YWFZO
-T1FXZm1raW92bGZnXVJUXHv2cG974tvc2tzk8P7ydGBbXnD67uf//O357O32+PH+++rb2tnP
-2Njb7vxnX1pSUU9RUU9QWWJq5dzY2PVoW1BOTk9UV2Jy9N3d3t/p29rX1t/d3+/6Z1tjePDk
-5+Xj4Of6cWhtX2x4/HX2/2966edybmRyefvf5trZ3uF+aV9VXGVrXVdbVl5hXWJcWV9pc3rq
-3uXd3tja73b3493d29zh3N/i82x17evz9GtfW2FfYGprYF1fXFxeXmRfW1xcW1ZVXl9q9nvj
-4e7i6vPq5+12am1xeHvp5+zy7Nzb3dfY393zZg==
-
---n2m-MIME-boundary----------
-
---PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2
-Content-type: text/richtext
-Content-Transfer-Encoding: quoted-printable
-
-<nl>
-<signature>Derek_Beatty@cmu.edu ABD Comp Sci, CMU, 5000 Forbes, Pgh, =
-PA 15213 USA
-</signature>=
-
---PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2--
-
diff --git a/tools/.cvsignore b/tools/.cvsignore
deleted file mode 100644
index 36a2ee1e24..0000000000
--- a/tools/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-Makefile
-Makefile.in
-.deps \ No newline at end of file
diff --git a/tools/Makefile.am b/tools/Makefile.am
deleted file mode 100644
index ca1ad433ed..0000000000
--- a/tools/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-bin_SCRIPTS = killev
-
-EXTRA_DIST = $(bin_SCRIPTS)
diff --git a/tools/killev b/tools/killev
deleted file mode 100755
index 0d352aa499..0000000000
--- a/tools/killev
+++ /dev/null
@@ -1,16 +0,0 @@
-killall -9 wombat 2>/dev/null
-killall -9 lt-wombat 2>/dev/null
-killall -9 tlacuache 2>/dev/null
-killall -9 evolution-addressbook 2>/dev/null
-killall -9 evolution-addres 2>/dev/null
-killall -9 lt-evolution-addressbook 2>/dev/null
-killall -9 lt-evolution-add 2>/dev/null
-killall -9 evolution-calendar 2>/dev/null
-killall -9 evolution-calend 2>/dev/null
-killall -9 lt-evolution-calendar 2>/dev/null
-killall -9 lt-evolution-cal 2>/dev/null
-killall -9 lt-gnomecal 2>/dev/null
-killall -9 evolution-mail 2>/dev/null
-killall -9 lt-evolution-mail 2>/dev/null
-killall -9 lt-evolution-mai 2>/dev/null
-killall -9 evolution 2>/dev/null
diff --git a/tools/verify-evolution-install.sh b/tools/verify-evolution-install.sh
deleted file mode 100755
index bf511754a1..0000000000
--- a/tools/verify-evolution-install.sh
+++ /dev/null
@@ -1,640 +0,0 @@
-#!/bin/sh
-#
-# Verifies that Evolution and all its supporting components
-# are installed correctly. A tool to weed out common
-# build problems.
-#
-# (C)2000 Helix Code, Inc.
-# Author: Peter Williams <peterw@helixcode.com>
-#
-# This program 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 program is distributed in the hope that 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 program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#
-
-problem() {
- echo "I detected the following problem: $problem"
- if test x"$rpmsystem" = xyes ; then
- echo "Suggested solution via RPM: $rpmsolution"
- fi
- if test x"$debsystem" = xyes ; then
- echo "Suggested solution via DEB: $debsolution"
- fi
- echo "Suggested solution via sources: $srcsolution"
- if test x"$comment" != x ; then
- echo ""
- echo "$comment"
- fi
- exit 1
-}
-
-check_config() {
- #bigname=$1
- #cfgname=$2
- #pkgname=$3
- eval $1=\${$1-$2}
-
- eval val=\$$1
- if type $val </dev/null 1>/dev/null 2>&1 ; then
- :
- else
- problem="Cannot find $2 or it ($val) is not executable"
- rpmsolution="Install or reinstall the '$3-devel' package"
- debsolution="Install or reinstall the $3 development libraries." #FIXME
- srcsolution="Get the latest release of $3 and install it."
- comment="If you know that $3 is installed, try setting the
-environment variable $1 to its location"
- problem
- fi
-}
-
-check_prefix() {
- #othercfg=$1
- #othername=$2
- #strict=$3
-
- eval otherpfx=\`\$$1 --prefix\`
- if test x"$3" = xstrict ; then
- if test x"$otherpfx" != x"$gl_prefix" ; then
- problem="gnome-libs and $2 do not share the same prefix"
- rpmsolution="This problem shouldn't happen with RPM installations. Verify your installation of Helix Gnome."
- debsolution="This problem shouldn't happen with DEB installations. Verify your installation of Helix Gnome."
- srcsolution="Re-run 'configure' in $2's source directory with the flag '--prefix=$gl_prefix'."
- problem
- fi
- else
- IFSbak="$IFS"
- ok="$GNOME_PATH:$gl_prefix"
- IFS=":"
- passed=no
-
- for e in $ok; do
- if test x"$e" != x ; then
- if test $otherpfx = $e ; then
- passed=yes;
- fi
- fi
- done
-
- IFS="$IFSbak"
-
- if test x"$passed" = xno ; then
- problem="$2 is not in GNOME_PATH or the same prefix as gnome-libs"
- rpmsolution="This problem shouldn't happen with RPM installations. Verify your installation of Helix Gnome."
- debsolution="This problem shouldn't happen with DEB installations. Verify your installation of Helix Gnome."
- srcsolution="Re-run 'configure' in $2's source directory with the flag '--prefix=$gl_prefix'."
- comment="Try exporting an environment variable 'GNOME_PATH' with the prefix of $2."
- problem
- fi
- fi
-}
-
-check_sysconf() {
- #othercfg=$1
- #othername=$2
-
- eval othersysc=\`\$$1 --sysconfdir\`
- if test x"$othersysc" != x"$gl_sysconf" ; then
- problem="gnome-libs and $2 do not share the same sysconfdir"
- rpmsolution="This problem shouldn't happen with RPM installations. Verify your installation of Helix Gnome."
- debsolution="This problem shouldn't happen with DEB installations. Verify your installation of Helix Gnome."
- srcsolution="Re-run 'configure' in $2's source directory with the flag '--sysconfdir=$gl_sysconf'."
- problem
- fi
-}
-
-check_oafinfo() {
- #basename=$1
- #othername=$2
-
- base=$1.oafinfo
- search="${oaf_prefix}/share/oaf:$OAF_INFO_PATH"
- IFSback="$IFS"
- IFS=":"
- ok=no
-
- for ping in $search ; do
- if test x"$ping" != x ; then
- if test -f $ping/$base ; then
- file=$ping/$base
- ok=yes
- fi
- fi
- done
-
- IFS="$IFSback"
-
- if test x$ok = xno ; then
- problem="$1.oafinfo isn't installed into Gnome's prefix or in OAF_INFO_PATH"
- rpmsolution="This problem shouldn't happen with RPM installations. Verify your installation of Helix Gnome."
- debsolution="This problem shouldn't happen with DEB installations. Verify your installation of Helix Gnome."
- srcsolution="Re-run 'configure' in $2's source directory with the flag '--datadir=$gl_datadir'."
- comment="Another likely cause of this problem would be a failed installation of $2.
-You should check to see that the install succeeded. You may also add the
-location of $1.oafinfo to the environment variable OAF_INFO_PATH"
- problem
- fi
-
- iids=`cat $file |grep iid= |sed -e 's,.*iid="\([^"]*\)".*,\1,'`
- IFS="
-"
-
- tempfile="temp-$$-verifier"
- for iid in $iids ; do
- #echo "Attempting to activate IID \"$iid\"..."
- $OAF_CLIENT -qs "iid == '$iid'" >$tempfile
- result=`cat $tempfile |grep exception`
- if test x"$result" != x ; then
- problem="The component $2 (in $file) couldn't be activated by OAF"
- rpmsolution="Verify that $file is valid and that oaf and $2 are correctly installed."
- debsolution="Verify that $file is valid and that oaf and $2 are correctly installed."
- srcsolution="Verify that $file is valid and that oaf and $2 are correctly installed."
- comment="$OAF_CLIENT reported this:
-`cat $tempfile`"
- rm -f $tempfile
- problem
- fi
- done
- rm -f $tempfile
-
- IFS="$IFSback"
-}
-
-check_bin() {
- #name=$1
- #othername=$2
-
- IFSbak="$IFS"
- IFS=":"
- passed=no
- exepath=
-
- for ping in $PATH; do
- if test x"$ping" != x -a -x $ping/$1 ; then
- if test x"$passed" = xyes ; then
- problem="The binary $1 is installed in more than one location"
- rpmsolution="Make sure that you only have one copy of the package installed"
- debsolution="Make sure that you only have one copy of the package installed"
- srcsolution="Make sure that you only have one copy of the package installed"
- comment="You probably have a package that was installed in two different prefixes,
-either from source twice or from source and from RPM/deb. Remove the older copy.
-(Note: \"make uninstall\" works on tarballs but may damage your gettext installation)"
- problem
- fi
- passed=yes;
- exepath="$ping/$1"
- fi
- done
-
- IFS="$IFSbak"
-
- if test x"$passed" = xno ; then
- problem="The binary $1 isn't in your PATH"
- rpmsolution="This problem shouldn't happen with RPM installations. Verify your installation of Helix Gnome."
- debsolution="This problem shouldn't happen with DEB installations. Verify your installation of Helix Gnome."
- srcsolution="Re-run 'configure' in $2's source directory with the flag '--bindir=$gl_bindir'."
- comment="Another likely cause of this problem would be a failed installation of $2.
-You should check to see that the install succeeded."
- problem
- fi
-
- lddfile=temp-$$-verify-ldd
- $LDD $exepath </dev/null >$lddfile 2>/dev/null
-
- if test x$? != x0 ; then
- problem="The binary $1 isn't linked correctly"
- rpmsolution="Make sure that all its dependencies are installed correctly"
- debsolution="Make sure that all its dependencies are installed correctly"
- srcsolution="Recompile $2 and make sure that it links correctly."
- comment="LDD reported the following:
-`cat $lddfile`
-"
- problem
- fi
-
- IFS="
-"
-
- use_bonobox=no
- use_bonobo=no
-
- for ping in `cat $libfile` ; do
- libname=`echo "$ping" |sed -e 's,^@@\([^@][^@]*\)@@[^@][^@]*@@,\1,'`
- libpfx=`echo "$ping" |sed -e 's,^@@[^@][^@]*@@\([^@][^@]*\)@@,\1,'`
-
- match="`cat $lddfile |grep \"${libname}\.\"`"
-
- if test x"$match" != x ; then
- theirlib="`echo $match |sed -e 's,.*=> \([^ ]*\).*$,\1,'`"
- theirdir="`dirname $theirlib`"
-
- if test x"$theirdir" != x"$libpfx" ; then
- problem="The binary $1 is linked against the wrong copy of $libname"
- rpmsolution="The package owning $libname is probably installed twice. Make sure that it's installed correctly."
- debsolution="The package owning $libname is probably installed twice. Make sure that it's installed correctly."
- srcsolution="The package owning $libname is probably installed twice. Make sure that it's installed correctly."
- comment="The version of $libname in $libpfx was expected"
- problem
- elif test x"$libname" = xlibbonobox ; then
- use_bonobox=yes
- elif test x"$libname" = xlibbonobo ; then
- use_bonobo=yes
- fi
- fi
- done
-
- #rm -f $lddfile
- IFS="$IFSback"
-
- if test x"$need_bonobox" = xyes -a x"$use_bonobo" = xyes -a x"$use_bonobox" != xyes ; then
- problem="The binary $1 is linked against Bonobo but not Bonobo-X"
- rpmsolution="Get the newest possible version of $2, or install it from source if that fails"
- debsolution="Get the newest possible version of $2, or install it from source if that fails"
- srcsolution="Run './config.status --recheck' in $2's source directory and reinstall it"
- problem
- fi
-}
-
-check_no_gnorba() {
- #libs=$1
- #othername=$2
-
- ping=`echo $1 |grep 'gnorba'`
-
- if test x"$ping" != x ; then
- problem="$2 was built using Gnorba, not OAF"
- rpmsolution="This problem shouldn't happen with RPM installations. Verify your installation of Helix Gnome."
- debsolution="This problem shouldn't happen with DEB installations. Verify your installation of Helix Gnome."
- srcsolution="Update $2 and re-run 'configure' in its source directory with the flag '--enable-oaf=yes'."
- problem
- fi
-}
-
-add_lib_to_check() {
- #lib = $1
- #path = $2
-
- echo "@@${1}@@${2}@@" >>$libfile
-}
-
-########################################
-
-versionparse3() {
- #inst_version=$1
- #reqd_version=$2
- #package=$3
-
- inst_version=`versiongrab3 "$1"`
- inst_major=`echo $inst_version |sed -e 's,\([0-9][0-9]*\)\..*\..*,\1,'`
- inst_minor=`echo $inst_version |sed -e 's,.*\.\([0-9][0-9]*\)\..*,\1,'`
- inst_micro=`echo $inst_version |sed -e 's,.*\..*\.\([0-9][0-9]*\),\1,'`
-
- reqd_version=`versiongrab3 "$2"`
- reqd_major=`echo $reqd_version |sed -e 's,\([0-9][0-9]*\)\..*\..*,\1,'`
- reqd_minor=`echo $reqd_version |sed -e 's,.*\.\([0-9][0-9]*\)\..*,\1,'`
- reqd_micro=`echo $reqd_version |sed -e 's,.*\..*\.\([0-9][0-9]*\),\1,'`
-
- ok=yes
- if test $inst_major -lt $reqd_major ; then
- ok=no
- elif test $inst_major -gt $reqd_major ; then
- ok=yes
- elif test $inst_minor -lt $reqd_minor; then
- ok=no
- elif test $inst_minor -gt $reqd_minor; then
- ok=yes
- elif test $inst_micro -lt $reqd_micro; then
- ok=no
- fi
-
- if test x$ok = xno ; then
- problem="Package $3 is not new enough ($1 detected, $2 required)"
- rpmsolution="Obtain a newer version and install it"
- depsolution="Obtain a newer version and install it"
- srcsolution="Obtain a newer version and install it"
- comment="If you think you have a newer installation, make sure that the
-package is not installed twice."
- problem
- fi
-}
-
-versiongrab3() {
- echo $1 |sed -e 's,.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*,\1,'
-}
-
-check_module3() {
- #$1=gnome-libs name
- #$2=package
- #$3=version
- $GNOME_CONFIG --modversion $1 1>/dev/null 2>/dev/null </dev/null
- if test x$? != x0 ; then
- problem="Package $2 doesn't seem to be installed."
- rpmsolution="Get and install the packages '$2' and '$2-devel'"
- debsolution="Get and install the package $2 and its development libraries" #FIXME
- srcsolution="Download the source and install the package $2"
- comment="If you think the package is installed, check that its prefix is $gl_prefix --
-${1}Conf.sh should be installed into `$GNOME_CONFIG --libdir`"
- problem
- fi
-
- instversion=`$GNOME_CONFIG --modversion $1`
-
- #eew eew hacky
- # gnome-vfs used to be versioned gnome-vfs-0.1,
- # and gnome-vfs-0.2, but then they moved to three figs--
- # now it's gnome-vfs-0.2.0
-
- if test $2 = gnome-vfs ; then
- case "$instversion" in
- gnome-vfs-0.1)
- problem="Package gnome-vfs is not new enough (0.1 detected, $3 required)"
- rpmsolution="Obtain a newer version and install it"
- depsolution="Obtain a newer version and install it"
- srcsolution="Obtain a newer version and install it"
- comment="If you think you have a newer installation, make sure that the
-package is not installed twice."
- problem
- ;;
- gnome-vfs-0.2)
- instversion="gnome-vfs-0.2.0"
- ;;
- *)
- #nothing, version is ok
- ;;
- esac
- fi
-
- versionparse3 "$instversion" "$3" "$2"
-}
-
-########################################
-
-versionparse2() {
- #inst_version=$1
- #reqd_version=$2
- #package=$3
-
- inst_version=`versiongrab2 "$1"`
- inst_major=`echo $inst_version |sed -e 's,\([0-9][0-9]*\)\..*,\1,'`
- inst_minor=`echo $inst_version |sed -e 's,.*\.\([0-9][0-9]*\),\1,'`
-
- reqd_version=`versiongrab2 "$2"`
- reqd_major=`echo $reqd_version |sed -e 's,\([0-9][0-9]*\)\..*,\1,'`
- reqd_minor=`echo $reqd_version |sed -e 's,.*\.\([0-9][0-9]*\),\1,'`
-
- ok=yes
- if test $inst_major -lt $reqd_major ; then
- ok=no
- elif test $inst_major -gt $reqd_major ; then
- ok=yes
- elif test $inst_minor -lt $reqd_minor; then
- ok=no
- fi
-
- if test x$ok = xno ; then
- problem="Package $3 is not new enough ($1 detected, $2 required)"
- rpmsolution="Obtain a newer version and install it"
- depsolution="Obtain a newer version and install it"
- srcsolution="Obtain a newer version and install it"
- comment="If you think you have a newer installation, make sure that the
-package is not installed twice."
- problem
- fi
-}
-
-versiongrab2() {
- echo $1 |sed -e 's,.*\([0-9][0-9]*\.[0-9][0-9]*\).*,\1,'
-}
-
-check_module2() {
- #$1=gnome-libs name
- #$2=package
- #$3=version
- $GNOME_CONFIG --modversion $1 1>/dev/null 2>/dev/null </dev/null
- if test x$? != x0 ; then
- problem="Package $2 doesn't seem to be installed."
- rpmsolution="Get and install the packages '$2' and '$2-devel'"
- debsolution="Get and install the package $2 and its development libraries" #FIXME
- srcsolution="Download the source and install the package $2"
- comment="If you think the package is installed, check that its prefix is $gl_prefix --
-${1}Conf.sh should be installed into `$GNOME_CONFIG --libdir`"
- problem
- fi
-
- instversion=`$GNOME_CONFIG --modversion $1`
- versionparse2 "$instversion" "$3" "$2"
-}
-
-########################################
-
-#prep
-libfile=temp-$$-libs-verifier
-
-if test -d /var/lib/rpm ; then
- rpmsystem=yes
- RPM=${RPM_PROG-rpm}
-
- $RPM --version 1>/dev/null 2>/dev/null </dev/null
- if test x$? != x0 ; then
- problem="The rpm executable ($RPM) does not seem to work."
- rpmsolution="none, if rpm doesn't work."
- debsolution="not applicable."
- srcsolution="download and install rpm manually."
- comment="If rpm really won't work then there is something wrong with your system."
- problem
- fi
-else
- rpmsystem=no
-fi
-
-if test -d /var/lib/dpkg ; then
- debsystem=yes
- #FIXME: check if deb works
-else
- debsystem=no
-fi
-
-if test x"$GNOME_PATH" != x ; then
- PATH="$GNOME_PATH:$PATH"
-fi
-
-if test x"$LDD" = x ; then
- if ldd -r /lib/libc.so </dev/null 1>/dev/null 2>&1 ; then
- LDD="ldd -r"
- elif type ldd </dev/null 1>/dev/null 2>&1; then
- LDD="ldd"
- else
- problem="Cannot find ldd"
- rpmsolution="Make sure that glibc is correctly installed!?!?!?"
- debsolution="Make sure that glibc is correctly installed!?!?!?"
- srcsolution="See above"
- comment="If you think that you have ldd, export an environment
-vairable LDD that points to it."
- problem
- fi
-fi
-
-#gnome-libs
-check_config GNOME_CONFIG gnome-config gnome-libs
-
-gl_version=`$GNOME_CONFIG --version` # |sed -e 's,.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*,\1,'`
-gl_sysconf=`$GNOME_CONFIG --sysconfdir`
-gl_prefix=`$GNOME_CONFIG --prefix`
-gl_datadir=`$GNOME_CONFIG --datadir`
-gl_bindir=`$GNOME_CONFIG --bindir`
-
-versionparse3 "$gl_version" "1.0.59" "gnome-libs"
-add_lib_to_check libgnome `$GNOME_CONFIG --libdir`
-add_lib_to_check libgnomeui `$GNOME_CONFIG --libdir`
-
-#libunicode
-check_config UNICODE_CONFIG unicode-config libunicode
-check_prefix UNICODE_CONFIG libunicode
-versionparse2 "`$UNICODE_CONFIG --version`" "0.4" libunicode
-add_lib_to_check libunicode "`$UNICODE_CONFIG --prefix`/lib"
-
-#ORBit
-check_config ORBIT_CONFIG orbit-config ORBit
-check_prefix ORBIT_CONFIG ORBit
-add_lib_to_check libORBit "`$ORBIT_CONFIG --prefix`/lib"
-
-#oaf
-check_config OAF_CONFIG oaf-config oaf
-check_prefix OAF_CONFIG oaf
-versionparse3 "`$OAF_CONFIG --version`" "0.4.0" "oaf"
-add_lib_to_check liboaf "`$OAF_CONFIG --prefix`/lib"
-check_bin oafd
-
-OAF_CLIENT=${OAF_CLIENT-oaf-client}
-if type $OAF_CLIENT </dev/null >/dev/null 2>&1 ; then
- :
-else
- problem="oaf-client couldn't be found"
- rpmsolution="Install the 'oaf-devel' package"
- debsolution="Install the oaf development libraries"
- srcsolution="Make sure that oaf is installed correctly"
- comment="If you think you have oaf-client installed, try exporting an
-environment variable OAF_CLIENT pointing to it"
- problem
-fi
-
-oaf_prefix=`$OAF_CONFIG --prefix`
-check_oafinfo oafd oaf
-
-#gconf
-#check_config GCONF_CONFIG gconf-config GConf
-#check_prefix GCONF_CONFIG GConf
-#versionparse2 "`$GCONF_CONFIG --version`" "0.5" GConf
-#if type gconfd-1 </dev/null >/dev/null 2>/dev/null; then
-# check_oafinfo gconfd-1 GConf
-# check_bin gconfd-1
-#else
-# check_oafinfo gconfd GConf
-# check_bin gconfd
-#fi
-#check_no_gnorba "`$GCONF_CONFIG --libs`" GConf
-
-#gnome vfs
-check_module3 vfs gnome-vfs "0.2.0"
-check_no_gnorba "`$GNOME_CONFIG --libs vfs`" gnome-vfs
-add_lib_to_check libgnomevfs "`$GNOME_CONFIG --libdir vfs`"
-
-#gnome print
-check_module2 print gnome-print "0.20"
-check_no_gnorba "`$GNOME_CONFIG --libs print`" gnome-print
-add_lib_to_check libgnomeprint "`$GNOME_CONFIG --libdir print`"
-
-#bonobo
-check_module2 bonobo bonobo "0.15"
-check_prefix "GNOME_CONFIG bonobo" bonobo strict
-add_lib_to_check libbonobo "`$GNOME_CONFIG --libdir bonobo`"
-
-if gnome-config --modversion bonobox </dev/null 1>/dev/null 2>&1 ; then
- need_bonobox=yes
- check_module2 bonobox bonobo "0.16"
- check_prefix "GNOME_CONFIG bonobox" bonobo strict
- add_lib_to_check libbonobox "`$GNOME_CONFIG --libdir bonobox`"
-fi
-
-check_oafinfo audio-ulaw bonobo
-check_bin bonobo-audio-ulaw bonobo
-check_no_gnorba "`$GNOME_CONFIG --libs bonobo`" bonobo
-
-#gtkhtml
-check_module2 gtkhtml GtkHTML "0.5"
-add_lib_to_check libgtkhtml "`$GNOME_CONFIG --libdir html`"
-check_oafinfo html-editor-control GtkHTML
-check_bin html-editor-control GtkHTML
-check_no_gnorba "`$GNOME_CONFIG --libs gtkhtml`" GtkHTML
-
-#evolution
-
-if test x"$EVOLUTION_PREFIX" = x ; then
- IFSback="$IFS"
- IFS=":"
- passed=no
-
- for ping in $PATH ; do
- if test x"$ping" != x -a -x $ping/evolution ; then
- if test x"$passed" = xyes ; then
- problem="Evolution is installed in more than one prefix"
- rpmsolution="Make sure that you only have one copy of Evolution installed"
- debsolution="Make sure that you only have one copy of Evolution installed"
- srcsolution="Make sure that you only have one copy of Evolution installed"
- comment="Evolution was probably installed in two different prefixes,
-either from source twice or from source and from RPM/deb. Remove the older copy.
-(Note: \"make uninstall\" works on tarballs but may damage your gettext installation)"
- problem
- else
- passed=yes
- e_prefix=$ping
- fi
- fi
- done
-
- IFS="$IFSbak"
-
- if test x"$passed" != xyes ; then
- problem="Evolution does not appear to have been installed"
- rpmsolution="Make sure that Evolution was installed properly (rpm -V evolution)"
- debsolution="Make sure that Evolution was installed properly"
- srcsolution="Run 'make install' in the evolution source directory"
- comment="I couldn't find evolution in this path: $PATH"
- problem
- fi
-
- e_prefix="`echo $e_prefix |sed -e 's,\(.*\)/[^/][^/]*,\1,'`"
- echo "Guessed that evolution is installed in prefix $e_prefix"
-else
- e_prefix="$EVOLUTION_PREFIX"
-fi
-
-add_lib_to_check libcal-client "$e_prefix/lib"
-add_lib_to_check libcamel "$e_prefix/lib"
-add_lib_to_check libcamelvee "$e_prefix/lib/evolution/camel-providers/0.3"
-check_oafinfo addressbook evolution
-check_oafinfo calendar-control evolution
-check_oafinfo evolution-mail evolution
-check_oafinfo evolution-calendar evolution
-check_oafinfo evolution-addressbook-select-names evolution
-check_oafinfo wombat evolution
-check_bin evolution-mail evolution
-check_bin evolution-calendar evolution
-check_bin evolution-addressbook evolution
-check_bin wombat evolution
-check_bin evolution evolution
-
-#done
-rm -f $libfile
-echo "Your Gnome system appears to be properly set up. Enjoy Evolution!"
-exit 0
diff --git a/widgets/.cvsignore b/widgets/.cvsignore
deleted file mode 100644
index d5b3a2ad62..0000000000
--- a/widgets/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
-minicard-test
-minicard-label-test
-reflow-test
diff --git a/widgets/LICENSE b/widgets/LICENSE
deleted file mode 100644
index b1f6ae08a4..0000000000
--- a/widgets/LICENSE
+++ /dev/null
@@ -1 +0,0 @@
-This code is released under the terms of the GNU GPL.
diff --git a/widgets/Makefile.am b/widgets/Makefile.am
deleted file mode 100644
index a2c421ee7d..0000000000
--- a/widgets/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-
-SUBDIRS = \
- misc \
- e-paned \
- e-text \
- e-table \
- meeting-time-sel \
- shortcut-bar
diff --git a/widgets/e-paned/.cvsignore b/widgets/e-paned/.cvsignore
deleted file mode 100644
index 955fc0b6d0..0000000000
--- a/widgets/e-paned/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-libepaned.a
diff --git a/widgets/e-paned/Makefile.am b/widgets/e-paned/Makefile.am
deleted file mode 100644
index 51ab38c80d..0000000000
--- a/widgets/e-paned/Makefile.am
+++ /dev/null
@@ -1,15 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir) \
- $(GNOME_INCLUDEDIR) \
- -DG_LOG_DOMAIN=\"e-paned\"
-
-noinst_LIBRARIES = \
- libepaned.a
-
-libepaned_a_SOURCES = \
- e-hpaned.c \
- e-hpaned.h \
- e-paned.c \
- e-paned.h \
- e-vpaned.c \
- e-vpaned.h
diff --git a/widgets/e-paned/e-hpaned.c b/widgets/e-paned/e-hpaned.c
deleted file mode 100644
index 933fc1c057..0000000000
--- a/widgets/e-paned/e-hpaned.c
+++ /dev/null
@@ -1,439 +0,0 @@
-/* EPaned - A slightly more advanced paned widget.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Christopher James Lahey <clahey@helixcode.com>
- *
- * based on GtkPaned from Gtk+. Gtk+ Copyright notice follows.
- */
-
-/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * 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; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#include "e-hpaned.h"
-
-static void e_hpaned_class_init (EHPanedClass *klass);
-static void e_hpaned_init (EHPaned *hpaned);
-static void e_hpaned_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void e_hpaned_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static void e_hpaned_draw (GtkWidget *widget,
- GdkRectangle *area);
-static void e_hpaned_xor_line (EPaned *paned);
-static gboolean e_hpaned_button_press (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean e_hpaned_button_release (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean e_hpaned_motion (GtkWidget *widget,
- GdkEventMotion *event);
-static gboolean e_hpaned_handle_shown (EPaned *paned);
-
-GtkType
-e_hpaned_get_type (void)
-{
- static GtkType hpaned_type = 0;
-
- if (!hpaned_type)
- {
- static const GtkTypeInfo hpaned_info =
- {
- "EHPaned",
- sizeof (EHPaned),
- sizeof (EHPanedClass),
- (GtkClassInitFunc) e_hpaned_class_init,
- (GtkObjectInitFunc) e_hpaned_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- hpaned_type = gtk_type_unique (E_TYPE_PANED, &hpaned_info);
- }
-
- return hpaned_type;
-}
-
-static void
-e_hpaned_class_init (EHPanedClass *klass)
-{
- GtkWidgetClass *widget_class;
- EPanedClass *paned_class;
-
- widget_class = (GtkWidgetClass *) klass;
- paned_class = E_PANED_CLASS (klass);
-
- widget_class->size_request = e_hpaned_size_request;
- widget_class->size_allocate = e_hpaned_size_allocate;
- widget_class->draw = e_hpaned_draw;
- widget_class->button_press_event = e_hpaned_button_press;
- widget_class->button_release_event = e_hpaned_button_release;
- widget_class->motion_notify_event = e_hpaned_motion;
-
- paned_class->handle_shown = e_hpaned_handle_shown;
-}
-
-static void
-e_hpaned_init (EHPaned *hpaned)
-{
- EPaned *paned;
-
- g_return_if_fail (hpaned != NULL);
- g_return_if_fail (E_IS_PANED (hpaned));
-
- paned = E_PANED (hpaned);
-
- paned->cursor_type = GDK_SB_H_DOUBLE_ARROW;
-}
-
-GtkWidget *
-e_hpaned_new (void)
-{
- EHPaned *hpaned;
-
- hpaned = gtk_type_new (E_TYPE_HPANED);
-
- return GTK_WIDGET (hpaned);
-}
-
-static void
-e_hpaned_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- EPaned *paned;
- GtkRequisition child_requisition;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_HPANED (widget));
- g_return_if_fail (requisition != NULL);
-
- paned = E_PANED (widget);
- requisition->width = 0;
- requisition->height = 0;
-
- if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1))
- {
- gtk_widget_size_request (paned->child1, &child_requisition);
-
- requisition->height = child_requisition.height;
- requisition->width = child_requisition.width;
- }
-
- if (paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
- {
- gtk_widget_size_request (paned->child2, &child_requisition);
-
- requisition->height = MAX(requisition->height, child_requisition.height);
- requisition->width += child_requisition.width;
- }
-
-
- requisition->width += GTK_CONTAINER (paned)->border_width * 2;
- requisition->height += GTK_CONTAINER (paned)->border_width * 2;
- if (e_paned_handle_shown(paned))
- requisition->width += paned->handle_size;
-}
-
-static void
-e_hpaned_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- EPaned *paned;
- GtkRequisition child1_requisition;
- GtkRequisition child2_requisition;
- GtkAllocation child1_allocation;
- GtkAllocation child2_allocation;
- gint border_width;
- gboolean handle_shown;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_HPANED (widget));
- g_return_if_fail (allocation != NULL);
-
- widget->allocation = *allocation;
- paned = E_PANED (widget);
- border_width = GTK_CONTAINER (paned)->border_width;
-
- if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1))
- gtk_widget_get_child_requisition (paned->child1, &child1_requisition);
- else
- child1_requisition.width = 0;
-
- if (paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
- gtk_widget_get_child_requisition (paned->child2, &child2_requisition);
- else
- child2_requisition.width = 0;
-
- e_paned_compute_position (paned,
- MAX (1, (gint) widget->allocation.width
- - 2 * border_width),
- child1_requisition.width,
- child2_requisition.width);
-
- /* Move the handle before the children so we don't get extra expose events */
-
- if (GTK_WIDGET_REALIZED (widget))
- gdk_window_move_resize (widget->window,
- allocation->x, allocation->y,
- allocation->width,
- allocation->height);
-
- handle_shown = e_paned_handle_shown(paned);
- if (handle_shown)
- {
- paned->handle_xpos = paned->child1_real_size + border_width;
- paned->handle_ypos = border_width;
- paned->handle_width = paned->handle_size;
- paned->handle_height = MAX (1, (gint) widget->allocation.height - 2 * border_width);
-
- if (GTK_WIDGET_REALIZED (widget))
- {
- gdk_window_move_resize (paned->handle,
- paned->handle_xpos,
- paned->handle_ypos,
- paned->handle_size,
- paned->handle_height);
- if (paned->handle)
- gdk_window_show(paned->handle);
- }
- }
- else
- {
- if (paned->handle && GTK_WIDGET_REALIZED (widget))
- gdk_window_hide(paned->handle);
- }
-
- child1_allocation.height = child2_allocation.height = MAX (1, (gint) allocation->height - border_width * 2);
- child1_allocation.width = paned->child1_real_size;
- child1_allocation.x = border_width;
- child1_allocation.y = child2_allocation.y = border_width;
-
- if (handle_shown)
- child2_allocation.x = child1_allocation.x + child1_allocation.width + paned->handle_width;
- else
- child2_allocation.x = child1_allocation.x + child1_allocation.width;
- child2_allocation.width = MAX (1, (gint) allocation->width - child2_allocation.x - border_width);
-
- /* Now allocate the childen, making sure, when resizing not to
- * overlap the windows */
- if (GTK_WIDGET_MAPPED (widget) &&
- paned->child1 && GTK_WIDGET_VISIBLE (paned->child1) &&
- paned->child1->allocation.width < child1_allocation.width)
- {
- if (paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
- gtk_widget_size_allocate (paned->child2, &child2_allocation);
- gtk_widget_size_allocate (paned->child1, &child1_allocation);
- }
- else
- {
- if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1))
- gtk_widget_size_allocate (paned->child1, &child1_allocation);
- if (paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
- gtk_widget_size_allocate (paned->child2, &child2_allocation);
- }
-}
-
-static void
-e_hpaned_draw (GtkWidget *widget,
- GdkRectangle *area)
-{
- EPaned *paned;
- GdkRectangle handle_area, child_area;
- guint16 border_width;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_PANED (widget));
-
- if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget))
- {
- paned = E_PANED (widget);
- border_width = GTK_CONTAINER (paned)->border_width;
-
- gdk_window_clear_area (widget->window,
- area->x, area->y, area->width,
- area->height);
-
- if (e_paned_handle_shown(paned))
- {
- handle_area.x = paned->handle_xpos;
- handle_area.y = paned->handle_ypos;
- handle_area.width = paned->handle_size;
- handle_area.height = paned->handle_height;
-
- if (gdk_rectangle_intersect (&handle_area, area, &child_area))
- {
- child_area.x -= paned->handle_xpos;
- child_area.y -= paned->handle_ypos;
-
- gtk_paint_handle (widget->style,
- paned->handle,
- GTK_STATE_NORMAL,
- GTK_SHADOW_NONE,
- &child_area,
- widget,
- "paned",
- 0, 0, -1, -1,
- GTK_ORIENTATION_VERTICAL);
-
- }
- }
- /* Redraw the children
- */
- if (paned->child1 && gtk_widget_intersect (paned->child1, area, &child_area))
- gtk_widget_draw(paned->child1, &child_area);
- if (paned->child2 && gtk_widget_intersect(paned->child2, area, &child_area))
- gtk_widget_draw(paned->child2, &child_area);
- }
-}
-
-static void
-e_hpaned_xor_line (EPaned *paned)
-{
- GtkWidget *widget;
- GdkGCValues values;
- guint16 xpos;
-
- widget = GTK_WIDGET(paned);
-
- if (!paned->xor_gc)
- {
- values.function = GDK_INVERT;
- values.subwindow_mode = GDK_INCLUDE_INFERIORS;
- paned->xor_gc = gdk_gc_new_with_values (widget->window,
- &values,
- GDK_GC_FUNCTION | GDK_GC_SUBWINDOW);
- }
-
- gdk_gc_set_line_attributes (paned->xor_gc, 2, GDK_LINE_SOLID,
- GDK_CAP_NOT_LAST, GDK_JOIN_BEVEL);
-
- xpos = paned->child1_real_size
- + GTK_CONTAINER (paned)->border_width + paned->handle_size / 2;
-
- gdk_draw_line (widget->window, paned->xor_gc,
- xpos,
- 0,
- xpos,
- widget->allocation.height - 1);
-}
-
-static gboolean
-e_hpaned_button_press (GtkWidget *widget,
- GdkEventButton *event)
-{
- EPaned *paned;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_PANED (widget), FALSE);
-
- paned = E_PANED (widget);
-
- if (!paned->in_drag &&
- event->window == paned->handle && event->button == 1)
- {
- paned->old_child1_size = paned->child1_size;
- paned->in_drag = TRUE;
- /* We need a server grab here, not gtk_grab_add(), since
- * we don't want to pass events on to the widget's children */
- gdk_pointer_grab(paned->handle, FALSE,
- GDK_POINTER_MOTION_HINT_MASK
- | GDK_BUTTON1_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- NULL, NULL, event->time);
- paned->child1_size = e_paned_quantized_size(paned, paned->child1_size + event->x - paned->handle_size / 2);
- paned->child1_size = CLAMP (paned->child1_size, 0,
- widget->allocation.width
- - paned->handle_size
- - 2 * GTK_CONTAINER (paned)->border_width);
- paned->child1_real_size = paned->child1_size;
- e_hpaned_xor_line (paned);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-e_hpaned_button_release (GtkWidget *widget,
- GdkEventButton *event)
-{
- EPaned *paned;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_PANED (widget), FALSE);
-
- paned = E_PANED (widget);
-
- if (paned->in_drag && (event->button == 1))
- {
- e_hpaned_xor_line (paned);
- paned->in_drag = FALSE;
- paned->position_set = TRUE;
- gdk_pointer_ungrab (event->time);
- gtk_widget_queue_resize (GTK_WIDGET (paned));
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-e_hpaned_motion (GtkWidget *widget,
- GdkEventMotion *event)
-{
- EPaned *paned;
- gint x;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_PANED (widget), FALSE);
-
- paned = E_PANED (widget);
-
- if (event->is_hint || event->window != widget->window)
- gtk_widget_get_pointer(widget, &x, NULL);
- else
- x = event->x;
-
- if (paned->in_drag)
- {
- gint size = x - GTK_CONTAINER (paned)->border_width - paned->handle_size / 2;
-
- e_hpaned_xor_line (paned);
- paned->child1_size = CLAMP (e_paned_quantized_size(paned, size), paned->min_position, paned->max_position);
- paned->child1_real_size = paned->child1_size;
- e_hpaned_xor_line (paned);
- }
-
- return TRUE;
-}
-
-static gboolean
-e_hpaned_handle_shown (EPaned *paned)
-{
- return ((paned->child1 && paned->child2) &&
- (GTK_WIDGET_VISIBLE (paned->child1) && GTK_WIDGET_VISIBLE (paned->child2)));
-}
diff --git a/widgets/e-paned/e-hpaned.h b/widgets/e-paned/e-hpaned.h
deleted file mode 100644
index 63c09198b1..0000000000
--- a/widgets/e-paned/e-hpaned.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* EPaned - A slightly more advanced paned widget.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Christopher James Lahey <clahey@helixcode.com>
- *
- * based on GtkPaned from Gtk+. Gtk+ Copyright notice follows.
- */
-
-/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * 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; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#ifndef __E_HPANED_H__
-#define __E_HPANED_H__
-
-#include <widgets/e-paned/e-paned.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define E_TYPE_HPANED (e_hpaned_get_type ())
-#define E_HPANED(obj) (GTK_CHECK_CAST ((obj), E_TYPE_HPANED, EHPaned))
-#define E_HPANED_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_HPANED, EHPanedClass))
-#define E_IS_HPANED(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_HPANED))
-#define E_IS_HPANED_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_HPANED))
-#define E_HPANED_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), E_TYPE_HPANED, EHPanedClass))
-
-
-typedef struct _EHPaned EHPaned;
-typedef struct _EHPanedClass EHPanedClass;
-
-struct _EHPaned
-{
- EPaned paned;
-};
-
-struct _EHPanedClass
-{
- EPanedClass parent_class;
-};
-
-GtkType e_hpaned_get_type (void);
-GtkWidget *e_hpaned_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_HPANED_H__ */
diff --git a/widgets/e-paned/e-paned.c b/widgets/e-paned/e-paned.c
deleted file mode 100644
index f02d4389a0..0000000000
--- a/widgets/e-paned/e-paned.c
+++ /dev/null
@@ -1,635 +0,0 @@
-/* EPaned - A slightly more advanced paned widget.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Christopher James Lahey <clahey@helixcode.com>
- *
- * based on GtkPaned from Gtk+. Gtk+ Copyright notice follows.
- */
-
-/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * 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; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#include "e-paned.h"
-
-enum {
- ARG_0,
- ARG_HANDLE_SIZE,
- ARG_QUANTUM,
-};
-
-static void e_paned_class_init (EPanedClass *klass);
-static void e_paned_init (EPaned *paned);
-static void e_paned_set_arg (GtkObject *object,
- GtkArg *arg,
- guint arg_id);
-static void e_paned_get_arg (GtkObject *object,
- GtkArg *arg,
- guint arg_id);
-static void e_paned_realize (GtkWidget *widget);
-static void e_paned_map (GtkWidget *widget);
-static void e_paned_unmap (GtkWidget *widget);
-static void e_paned_unrealize (GtkWidget *widget);
-static gint e_paned_expose (GtkWidget *widget,
- GdkEventExpose *event);
-static void e_paned_add (GtkContainer *container,
- GtkWidget *widget);
-static void e_paned_remove (GtkContainer *container,
- GtkWidget *widget);
-static void e_paned_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data);
-static GtkType e_paned_child_type (GtkContainer *container);
-
-static GtkContainerClass *parent_class = NULL;
-
-
-GtkType
-e_paned_get_type (void)
-{
- static GtkType paned_type = 0;
-
- if (!paned_type)
- {
- static const GtkTypeInfo paned_info =
- {
- "EPaned",
- sizeof (EPaned),
- sizeof (EPanedClass),
- (GtkClassInitFunc) e_paned_class_init,
- (GtkObjectInitFunc) e_paned_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- paned_type = gtk_type_unique (GTK_TYPE_CONTAINER, &paned_info);
- }
-
- return paned_type;
-}
-
-static void
-e_paned_class_init (EPanedClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GtkContainerClass *container_class;
-
- object_class = (GtkObjectClass *) klass;
- widget_class = (GtkWidgetClass *) klass;
- container_class = (GtkContainerClass *) klass;
-
- parent_class = gtk_type_class (GTK_TYPE_CONTAINER);
-
- object_class->set_arg = e_paned_set_arg;
- object_class->get_arg = e_paned_get_arg;
-
- widget_class->realize = e_paned_realize;
- widget_class->map = e_paned_map;
- widget_class->unmap = e_paned_unmap;
- widget_class->unrealize = e_paned_unrealize;
- widget_class->expose_event = e_paned_expose;
-
- container_class->add = e_paned_add;
- container_class->remove = e_paned_remove;
- container_class->forall = e_paned_forall;
- container_class->child_type = e_paned_child_type;
-
- klass->handle_shown = NULL;
-
- gtk_object_add_arg_type("EPaned::handle_size", GTK_TYPE_UINT,
- GTK_ARG_READWRITE, ARG_HANDLE_SIZE);
- gtk_object_add_arg_type("EPaned::quantum", GTK_TYPE_UINT,
- GTK_ARG_READWRITE, ARG_QUANTUM);
-}
-
-static GtkType
-e_paned_child_type (GtkContainer *container)
-{
- if (!E_PANED (container)->child1 || !E_PANED (container)->child2)
- return GTK_TYPE_WIDGET;
- else
- return GTK_TYPE_NONE;
-}
-
-static void
-e_paned_init (EPaned *paned)
-{
- GTK_WIDGET_UNSET_FLAGS (paned, GTK_NO_WINDOW);
-
- paned->child1 = NULL;
- paned->child2 = NULL;
- paned->handle = NULL;
- paned->xor_gc = NULL;
- paned->cursor_type = GDK_CROSS;
-
- paned->handle_width = 5;
- paned->handle_height = 5;
- paned->handle_size = 5;
- paned->position_set = FALSE;
- paned->last_allocation = -1;
- paned->in_drag = FALSE;
-
- paned->handle_xpos = -1;
- paned->handle_ypos = -1;
-
- paned->old_child1_size = 0;
- paned->child1_size = 0;
- paned->quantum = 1;
-}
-
-static void
-e_paned_set_arg (GtkObject *object,
- GtkArg *arg,
- guint arg_id)
-{
- EPaned *paned = E_PANED (object);
-
- switch (arg_id)
- {
- case ARG_HANDLE_SIZE:
- e_paned_set_handle_size (paned, GTK_VALUE_UINT (*arg));
- break;
- case ARG_QUANTUM:
- paned->quantum = GTK_VALUE_UINT (*arg);
- if (paned->quantum == 0)
- paned->quantum = 1;
- break;
- default:
- break;
- }
-}
-
-static void
-e_paned_get_arg (GtkObject *object,
- GtkArg *arg,
- guint arg_id)
-{
- EPaned *paned = E_PANED (object);
-
- switch (arg_id)
- {
- case ARG_HANDLE_SIZE:
- GTK_VALUE_UINT (*arg) = paned->handle_size;
- break;
- case ARG_QUANTUM:
- GTK_VALUE_UINT (*arg) = paned->quantum;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_paned_realize (GtkWidget *widget)
-{
- EPaned *paned;
- GdkWindowAttr attributes;
- gint attributes_mask;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_PANED (widget));
-
- GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
- paned = E_PANED (widget);
-
- attributes.x = widget->allocation.x;
- attributes.y = widget->allocation.y;
- attributes.width = widget->allocation.width;
- attributes.height = widget->allocation.height;
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.wclass = GDK_INPUT_OUTPUT;
- attributes.visual = gtk_widget_get_visual (widget);
- attributes.colormap = gtk_widget_get_colormap (widget);
- attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
- attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
-
- widget->window = gdk_window_new (gtk_widget_get_parent_window(widget),
- &attributes, attributes_mask);
- gdk_window_set_user_data (widget->window, paned);
-
- attributes.x = paned->handle_xpos;
- attributes.y = paned->handle_ypos;
- attributes.width = paned->handle_width;
- attributes.height = paned->handle_height;
- attributes.cursor = gdk_cursor_new (paned->cursor_type);
- attributes.event_mask |= (GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_POINTER_MOTION_MASK |
- GDK_POINTER_MOTION_HINT_MASK);
- attributes_mask |= GDK_WA_CURSOR;
-
- paned->handle = gdk_window_new (widget->window,
- &attributes, attributes_mask);
- gdk_window_set_user_data (paned->handle, paned);
- gdk_cursor_destroy (attributes.cursor);
-
- widget->style = gtk_style_attach (widget->style, widget->window);
-
- gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
- gtk_style_set_background (widget->style, paned->handle, GTK_STATE_NORMAL);
-
- gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
-
- if (e_paned_handle_shown(paned))
- gdk_window_show (paned->handle);
-}
-
-static void
-e_paned_map (GtkWidget *widget)
-{
- EPaned *paned;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_PANED (widget));
-
- GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
- paned = E_PANED (widget);
-
- if (paned->child1 &&
- GTK_WIDGET_VISIBLE (paned->child1) &&
- !GTK_WIDGET_MAPPED (paned->child1))
- gtk_widget_map (paned->child1);
- if (paned->child2 &&
- GTK_WIDGET_VISIBLE (paned->child2) &&
- !GTK_WIDGET_MAPPED (paned->child2))
- gtk_widget_map (paned->child2);
-
- gdk_window_show (widget->window);
-}
-
-static void
-e_paned_unmap (GtkWidget *widget)
-{
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_PANED (widget));
-
- GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
-
- gdk_window_hide (widget->window);
-}
-
-static void
-e_paned_unrealize (GtkWidget *widget)
-{
- EPaned *paned;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_PANED (widget));
-
- paned = E_PANED (widget);
-
- if (paned->xor_gc)
- {
- gdk_gc_destroy (paned->xor_gc);
- paned->xor_gc = NULL;
- }
-
- if (paned->handle)
- {
- gdk_window_set_user_data (paned->handle, NULL);
- gdk_window_destroy (paned->handle);
- paned->handle = NULL;
- }
-
- if (GTK_WIDGET_CLASS (parent_class)->unrealize)
- (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
-}
-
-static gint
-e_paned_expose (GtkWidget *widget,
- GdkEventExpose *event)
-{
- EPaned *paned;
- GdkEventExpose child_event;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_PANED (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- if (GTK_WIDGET_DRAWABLE (widget))
- {
- paned = E_PANED (widget);
-
- if (paned->handle && event->window == paned->handle)
- {
- if (e_paned_handle_shown(paned))
- {
- child_event = *event;
- event->area.x += paned->handle_xpos;
- event->area.y += paned->handle_ypos;
- gtk_widget_draw (widget, &event->area);
- }
- }
- else
- {
- child_event = *event;
- if (paned->child1 &&
- GTK_WIDGET_NO_WINDOW (paned->child1) &&
- gtk_widget_intersect (paned->child1, &event->area, &child_event.area))
- gtk_widget_event (paned->child1, (GdkEvent *) &child_event);
-
- if (paned->child2 &&
- GTK_WIDGET_NO_WINDOW (paned->child2) &&
- gtk_widget_intersect (paned->child2, &event->area, &child_event.area))
- gtk_widget_event (paned->child2, (GdkEvent *) &child_event);
- }
- }
-
- return FALSE;
-}
-
-void
-e_paned_add1 (EPaned *paned,
- GtkWidget *widget)
-{
- e_paned_pack1 (paned, widget, FALSE, TRUE);
-}
-
-void
-e_paned_add2 (EPaned *paned,
- GtkWidget *widget)
-{
- e_paned_pack2 (paned, widget, TRUE, TRUE);
-}
-
-void
-e_paned_pack1 (EPaned *paned,
- GtkWidget *child,
- gboolean resize,
- gboolean shrink)
-{
- g_return_if_fail (paned != NULL);
- g_return_if_fail (E_IS_PANED (paned));
- g_return_if_fail (GTK_IS_WIDGET (child));
-
- if (!paned->child1)
- {
- paned->child1 = child;
- paned->child1_resize = resize;
- paned->child1_shrink = shrink;
-
- gtk_widget_set_parent (child, GTK_WIDGET (paned));
-
- if (GTK_WIDGET_REALIZED (child->parent))
- gtk_widget_realize (child);
-
- if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
- {
- if (GTK_WIDGET_MAPPED (child->parent))
- gtk_widget_map (child);
-
- gtk_widget_queue_resize (child);
- }
- }
-}
-
-void
-e_paned_pack2 (EPaned *paned,
- GtkWidget *child,
- gboolean resize,
- gboolean shrink)
-{
- g_return_if_fail (paned != NULL);
- g_return_if_fail (E_IS_PANED (paned));
- g_return_if_fail (GTK_IS_WIDGET (child));
-
- if (!paned->child2)
- {
- paned->child2 = child;
- paned->child2_resize = resize;
- paned->child2_shrink = shrink;
-
- gtk_widget_set_parent (child, GTK_WIDGET (paned));
-
- if (GTK_WIDGET_REALIZED (child->parent))
- gtk_widget_realize (child);
-
- if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
- {
- if (GTK_WIDGET_MAPPED (child->parent))
- gtk_widget_map (child);
-
- gtk_widget_queue_resize (child);
- }
- }
-}
-
-
-static void
-e_paned_add (GtkContainer *container,
- GtkWidget *widget)
-{
- EPaned *paned;
-
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_PANED (container));
- g_return_if_fail (widget != NULL);
-
- paned = E_PANED (container);
-
- if (!paned->child1)
- e_paned_add1 (E_PANED (container), widget);
- else if (!paned->child2)
- e_paned_add2 (E_PANED (container), widget);
-}
-
-static void
-e_paned_remove (GtkContainer *container,
- GtkWidget *widget)
-{
- EPaned *paned;
- gboolean was_visible;
-
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_PANED (container));
- g_return_if_fail (widget != NULL);
-
- paned = E_PANED (container);
- was_visible = GTK_WIDGET_VISIBLE (widget);
-
- if (paned->child1 == widget)
- {
- gtk_widget_unparent (widget);
-
- paned->child1 = NULL;
-
- if (was_visible && GTK_WIDGET_VISIBLE (container))
- gtk_widget_queue_resize (GTK_WIDGET (container));
- }
- else if (paned->child2 == widget)
- {
- gtk_widget_unparent (widget);
-
- paned->child2 = NULL;
-
- if (was_visible && GTK_WIDGET_VISIBLE (container))
- gtk_widget_queue_resize (GTK_WIDGET (container));
- }
-}
-
-static void
-e_paned_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data)
-{
- EPaned *paned;
-
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_PANED (container));
- g_return_if_fail (callback != NULL);
-
- paned = E_PANED (container);
-
- if (paned->child1)
- (*callback) (paned->child1, callback_data);
- if (paned->child2)
- (*callback) (paned->child2, callback_data);
-}
-
-gint
-e_paned_get_position (EPaned *paned)
-{
- g_return_val_if_fail (paned != NULL, 0);
- g_return_val_if_fail (E_IS_PANED (paned), 0);
-
- return paned->child1_real_size;
-}
-
-void
-e_paned_set_position (EPaned *paned,
- gint position)
-{
- g_return_if_fail (paned != NULL);
- g_return_if_fail (E_IS_PANED (paned));
-
- if (position >= 0)
- {
- /* We don't clamp here - the assumption is that
- * if the total allocation changes at the same time
- * as the position, the position set is with reference
- * to the new total size. If only the position changes,
- * then clamping will occur in e_paned_compute_position()
- */
- paned->child1_size = position;
- paned->position_set = TRUE;
- }
- else
- {
- paned->position_set = FALSE;
- }
-
- gtk_widget_queue_resize (GTK_WIDGET (paned));
-}
-
-void
-e_paned_set_handle_size (EPaned *paned,
- guint16 size)
-{
- g_return_if_fail (paned != NULL);
- g_return_if_fail (E_IS_PANED (paned));
-
- gtk_widget_queue_resize (GTK_WIDGET (paned));
-
- paned->handle_size = size;
-}
-
-void
-e_paned_compute_position(EPaned *paned,
- gint allocation,
- gint child1_req,
- gint child2_req)
-{
- g_return_if_fail (paned != NULL);
- g_return_if_fail (E_IS_PANED (paned));
-
- if (e_paned_handle_shown(paned))
- allocation -= (gint) paned->handle_size;
-
- paned->min_position = paned->child1_shrink ? 0 : child1_req;
-
- paned->max_position = allocation;
- if (!paned->child2_shrink)
- paned->max_position = MAX (1, paned->max_position - child2_req);
-
- if (!paned->position_set)
- {
- if (paned->child1_resize && !paned->child2_resize)
- paned->child1_size = MAX (1, allocation - child2_req);
- else if (!paned->child1_resize && paned->child2_resize)
- paned->child1_size = child1_req;
- else if (child1_req + child2_req != 0)
- paned->child1_size = allocation * ((gdouble)child1_req / (child1_req + child2_req));
- else
- paned->child1_size = allocation * 0.5;
- }
- else
- {
- /* If the position was set before the initial allocation.
- * (paned->last_allocation <= 0) just clamp it and leave it.
- */
- if (paned->last_allocation > 0)
- {
- if (paned->child1_resize && !paned->child2_resize)
- paned->child1_size += allocation - paned->last_allocation;
- else if (paned->child1_resize && paned->child2_resize)
- paned->child1_size = allocation * ((gdouble) paned->child1_size / (paned->last_allocation));
- }
- }
-
- paned->child1_real_size = CLAMP (paned->child1_size,
- paned->min_position,
- paned->max_position);
-
- paned->last_allocation = allocation;
-}
-
-gboolean
-e_paned_handle_shown(EPaned *paned)
-{
- EPanedClass *klass = E_PANED_CLASS(GTK_OBJECT(paned)->klass);
- if (klass->handle_shown)
- return (*klass->handle_shown)(paned);
- else
- return TRUE;
-}
-
-gint
-e_paned_quantized_size(EPaned *paned,
- gint size)
-{
- gint quantization = size - paned->old_child1_size;
- if (quantization > 0)
- quantization += paned->quantum / 2;
- else
- quantization -= paned->quantum / 2;
- quantization /= paned->quantum;
- quantization *= paned->quantum;
- return paned->old_child1_size + quantization;
-}
diff --git a/widgets/e-paned/e-paned.h b/widgets/e-paned/e-paned.h
deleted file mode 100644
index b211d32bda..0000000000
--- a/widgets/e-paned/e-paned.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/* EPaned - A slightly more advanced paned widget.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Christopher James Lahey <clahey@helixcode.com>
- *
- * based on GtkPaned from Gtk+. Gtk+ Copyright notice follows.
- */
-
-/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * 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; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#ifndef __E_PANED_H__
-#define __E_PANED_H__
-
-#include <gtk/gtkcontainer.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-#define E_TYPE_PANED (e_paned_get_type ())
-#define E_PANED(obj) (GTK_CHECK_CAST ((obj), E_TYPE_PANED, EPaned))
-#define E_PANED_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_PANED, EPanedClass))
-#define E_IS_PANED(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_PANED))
-#define E_IS_PANED_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_PANED))
-#define E_PANED_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), E_TYPE_PANED, EPanedClass))
-
-
-typedef struct _EPaned EPaned;
-typedef struct _EPanedClass EPanedClass;
-
-struct _EPaned
-{
- GtkContainer container;
-
- GtkWidget *child1;
- GtkWidget *child2;
-
- GdkWindow *handle;
- GdkGC *xor_gc;
- GdkCursorType cursor_type;
-
- /*< public >*/
- guint16 handle_size;
-
- /*< private >*/
- guint16 handle_width;
- guint16 handle_height;
-
- gint child1_real_size;
- gint child1_size;
- gint last_allocation;
- gint min_position;
- gint max_position;
-
- gint old_child1_size;
- gint quantum;
-
- guint position_set : 1;
- guint in_drag : 1;
- guint child1_shrink : 1;
- guint child1_resize : 1;
- guint child2_shrink : 1;
- guint child2_resize : 1;
-
- gint16 handle_xpos;
- gint16 handle_ypos;
-};
-
-struct _EPanedClass
-{
- GtkContainerClass parent_class;
-
- /* Protected virtual method. */
- gboolean (*handle_shown) (EPaned *paned);
-};
-
-
-GtkType e_paned_get_type (void);
-void e_paned_add1 (EPaned *paned,
- GtkWidget *child);
-void e_paned_add2 (EPaned *paned,
- GtkWidget *child);
-void e_paned_pack1 (EPaned *paned,
- GtkWidget *child,
- gboolean resize,
- gboolean shrink);
-void e_paned_pack2 (EPaned *paned,
- GtkWidget *child,
- gboolean resize,
- gboolean shrink);
-gint e_paned_get_position (EPaned *paned);
-void e_paned_set_position (EPaned *paned,
- gint position);
-void e_paned_set_handle_size (EPaned *paned,
- guint16 size);
-
-/* Internal function */
-void e_paned_compute_position (EPaned *paned,
- gint allocation,
- gint child1_req,
- gint child2_req);
-
-gboolean e_paned_handle_shown (EPaned *paned);
-gint e_paned_quantized_size (EPaned *paned,
- int size);
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_PANED_H__ */
diff --git a/widgets/e-paned/e-vpaned.c b/widgets/e-paned/e-vpaned.c
deleted file mode 100644
index 705a36f331..0000000000
--- a/widgets/e-paned/e-vpaned.c
+++ /dev/null
@@ -1,438 +0,0 @@
-/* EPaned - A slightly more advanced paned widget.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Christopher James Lahey <clahey@helixcode.com>
- *
- * based on GtkPaned from Gtk+. Gtk+ Copyright notice follows.
- */
-
-/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * 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; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#include "e-vpaned.h"
-
-static void e_vpaned_class_init (EVPanedClass *klass);
-static void e_vpaned_init (EVPaned *vpaned);
-static void e_vpaned_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void e_vpaned_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static void e_vpaned_draw (GtkWidget *widget,
- GdkRectangle *area);
-static void e_vpaned_xor_line (EPaned *paned);
-static gboolean e_vpaned_button_press (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean e_vpaned_button_release (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean e_vpaned_motion (GtkWidget *widget,
- GdkEventMotion *event);
-static gboolean e_vpaned_handle_shown (EPaned *paned);
-
-GtkType
-e_vpaned_get_type (void)
-{
- static GtkType vpaned_type = 0;
-
- if (!vpaned_type)
- {
- static const GtkTypeInfo vpaned_info =
- {
- "EVPaned",
- sizeof (EVPaned),
- sizeof (EVPanedClass),
- (GtkClassInitFunc) e_vpaned_class_init,
- (GtkObjectInitFunc) e_vpaned_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- vpaned_type = gtk_type_unique (E_TYPE_PANED, &vpaned_info);
- }
-
- return vpaned_type;
-}
-
-static void
-e_vpaned_class_init (EVPanedClass *klass)
-{
- GtkWidgetClass *widget_class;
- EPanedClass *paned_class;
-
- widget_class = (GtkWidgetClass *) klass;
- paned_class = E_PANED_CLASS (klass);
-
- widget_class->size_request = e_vpaned_size_request;
- widget_class->size_allocate = e_vpaned_size_allocate;
- widget_class->draw = e_vpaned_draw;
- widget_class->button_press_event = e_vpaned_button_press;
- widget_class->button_release_event = e_vpaned_button_release;
- widget_class->motion_notify_event = e_vpaned_motion;
-
- paned_class->handle_shown = e_vpaned_handle_shown;
-}
-
-static void
-e_vpaned_init (EVPaned *vpaned)
-{
- EPaned *paned;
-
- g_return_if_fail (vpaned != NULL);
- g_return_if_fail (E_IS_PANED (vpaned));
-
- paned = E_PANED (vpaned);
-
- paned->cursor_type = GDK_SB_V_DOUBLE_ARROW;
-}
-
-GtkWidget *
-e_vpaned_new (void)
-{
- EVPaned *vpaned;
-
- vpaned = gtk_type_new (E_TYPE_VPANED);
-
- return GTK_WIDGET (vpaned);
-}
-
-static void
-e_vpaned_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- EPaned *paned;
- GtkRequisition child_requisition;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_VPANED (widget));
- g_return_if_fail (requisition != NULL);
-
- paned = E_PANED (widget);
- requisition->width = 0;
- requisition->height = 0;
-
- if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1))
- {
- gtk_widget_size_request (paned->child1, &child_requisition);
-
- requisition->height = child_requisition.height;
- requisition->width = child_requisition.width;
- }
-
- if (paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
- {
- gtk_widget_size_request (paned->child2, &child_requisition);
-
- requisition->width = MAX (requisition->width, child_requisition.width);
- requisition->height += child_requisition.height;
- }
-
- requisition->height += GTK_CONTAINER (paned)->border_width * 2;
- requisition->width += GTK_CONTAINER (paned)->border_width * 2;
- if (e_paned_handle_shown(paned))
- requisition->height += paned->handle_size;
-}
-
-static void
-e_vpaned_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- EPaned *paned;
- GtkRequisition child1_requisition;
- GtkRequisition child2_requisition;
- GtkAllocation child1_allocation;
- GtkAllocation child2_allocation;
- gint border_width;
- gboolean handle_shown;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_VPANED (widget));
- g_return_if_fail (allocation != NULL);
-
- widget->allocation = *allocation;
- paned = E_PANED (widget);
- border_width = GTK_CONTAINER (widget)->border_width;
-
- if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1))
- gtk_widget_get_child_requisition (paned->child1, &child1_requisition);
- else
- child1_requisition.height = 0;
-
- if (paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
- gtk_widget_get_child_requisition (paned->child2, &child2_requisition);
- else
- child2_requisition.height = 0;
-
- e_paned_compute_position (paned,
- MAX (1, (gint) widget->allocation.height
- - 2 * border_width),
- child1_requisition.height,
- child2_requisition.height);
-
- /* Move the handle before the children so we don't get extra expose events */
-
- if (GTK_WIDGET_REALIZED (widget))
- gdk_window_move_resize (widget->window,
- allocation->x, allocation->y,
- allocation->width,
- allocation->height);
-
- handle_shown = e_paned_handle_shown(paned);
- if (handle_shown)
- {
- paned->handle_xpos = border_width;
- paned->handle_ypos = paned->child1_real_size + border_width;
- paned->handle_width = MAX (1, (gint) widget->allocation.width - 2 * border_width);
- paned->handle_height = paned->handle_size;
-
- if (GTK_WIDGET_REALIZED (widget))
- {
- gdk_window_move_resize (paned->handle,
- paned->handle_xpos,
- paned->handle_ypos,
- paned->handle_width,
- paned->handle_size);
- if (paned->handle)
- gdk_window_show(paned->handle);
- }
- }
- else
- {
- if (paned->handle && GTK_WIDGET_REALIZED (widget))
- gdk_window_hide(paned->handle);
- }
-
- child1_allocation.width = child2_allocation.width = MAX (1, (gint) allocation->width - border_width * 2);
- child1_allocation.height = paned->child1_real_size;
- child1_allocation.x = child2_allocation.x = border_width;
- child1_allocation.y = border_width;
-
- if (handle_shown)
- child2_allocation.y = child1_allocation.y + child1_allocation.height + paned->handle_height;
- else
- child2_allocation.y = child1_allocation.y + child1_allocation.height;
- child2_allocation.height = MAX(1, (gint) allocation->height - child2_allocation.y - border_width);
-
- /* Now allocate the childen, making sure, when resizing not to
- * overlap the windows */
- if (GTK_WIDGET_MAPPED (widget) &&
- paned->child1 && GTK_WIDGET_VISIBLE (paned->child1) &&
- paned->child1->allocation.height < child1_allocation.height)
- {
- if (paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
- gtk_widget_size_allocate(paned->child2, &child2_allocation);
- gtk_widget_size_allocate(paned->child1, &child1_allocation);
- }
- else
- {
- if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1))
- gtk_widget_size_allocate(paned->child1, &child1_allocation);
- if (paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
- gtk_widget_size_allocate(paned->child2, &child2_allocation);
- }
-}
-
-static void
-e_vpaned_draw (GtkWidget *widget,
- GdkRectangle *area)
-{
- EPaned *paned;
- GdkRectangle handle_area, child_area;
- guint16 border_width;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_PANED (widget));
-
- if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget))
- {
- paned = E_PANED (widget);
- border_width = GTK_CONTAINER (paned)->border_width;
-
- gdk_window_clear_area (widget->window,
- area->x, area->y, area->width,
- area->height);
-
- if (e_paned_handle_shown(paned))
- {
- handle_area.x = paned->handle_xpos;
- handle_area.y = paned->handle_ypos;
- handle_area.width = paned->handle_width;
- handle_area.height = paned->handle_size;
-
- if (gdk_rectangle_intersect (&handle_area, area, &child_area))
- {
- child_area.x -= paned->handle_xpos;
- child_area.y -= paned->handle_ypos;
-
- gtk_paint_handle (widget->style,
- paned->handle,
- GTK_STATE_NORMAL,
- GTK_SHADOW_NONE,
- &child_area,
- widget,
- "paned",
- 0, 0, -1, -1,
- GTK_ORIENTATION_HORIZONTAL);
-
- }
- }
- /* Redraw the children
- */
- if (paned->child1 && gtk_widget_intersect (paned->child1, area, &child_area))
- gtk_widget_draw (paned->child1, &child_area);
- if (paned->child2 && gtk_widget_intersect (paned->child2, area, &child_area))
- gtk_widget_draw (paned->child2, &child_area);
- }
-}
-
-static void
-e_vpaned_xor_line (EPaned *paned)
-{
- GtkWidget *widget;
- GdkGCValues values;
- guint16 ypos;
-
- widget = GTK_WIDGET (paned);
-
- if (!paned->xor_gc)
- {
- values.function = GDK_INVERT;
- values.subwindow_mode = GDK_INCLUDE_INFERIORS;
- paned->xor_gc = gdk_gc_new_with_values (widget->window,
- &values,
- GDK_GC_FUNCTION | GDK_GC_SUBWINDOW);
- }
-
- gdk_gc_set_line_attributes (paned->xor_gc, 2, GDK_LINE_SOLID,
- GDK_CAP_NOT_LAST, GDK_JOIN_BEVEL);
-
- ypos = paned->child1_real_size
- + GTK_CONTAINER (paned)->border_width + paned->handle_size / 2;
-
- gdk_draw_line (widget->window, paned->xor_gc,
- 0,
- ypos,
- widget->allocation.width - 1,
- ypos);
-}
-
-static gboolean
-e_vpaned_button_press (GtkWidget *widget,
- GdkEventButton *event)
-{
- EPaned *paned;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_PANED (widget), FALSE);
-
- paned = E_PANED (widget);
-
- if (!paned->in_drag &&
- (event->window == paned->handle) && (event->button == 1))
- {
- paned->old_child1_size = paned->child1_size;
- paned->in_drag = TRUE;
- /* We need a server grab here, not gtk_grab_add(), since
- * we don't want to pass events on to the widget's children */
- gdk_pointer_grab (paned->handle, FALSE,
- GDK_POINTER_MOTION_HINT_MASK
- | GDK_BUTTON1_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK, NULL, NULL,
- event->time);
- paned->child1_size = e_paned_quantized_size(paned, paned->child1_size + event->y - paned->handle_size / 2);
- paned->child1_size = CLAMP (paned->child1_size, 0,
- widget->allocation.height -
- paned->handle_size -
- 2 * GTK_CONTAINER (paned)->border_width);
- paned->child1_real_size = paned->child1_size;
- e_vpaned_xor_line(paned);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-e_vpaned_button_release (GtkWidget *widget,
- GdkEventButton *event)
-{
- EPaned *paned;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_PANED (widget), FALSE);
-
- paned = E_PANED (widget);
-
- if (paned->in_drag && (event->button == 1))
- {
- e_vpaned_xor_line (paned);
- paned->in_drag = FALSE;
- paned->position_set = TRUE;
- gdk_pointer_ungrab (event->time);
- gtk_widget_queue_resize (GTK_WIDGET (paned));
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-e_vpaned_motion (GtkWidget *widget,
- GdkEventMotion *event)
-{
- EPaned *paned;
- gint y;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_PANED (widget), FALSE);
-
- if (event->is_hint || event->window != widget->window)
- gtk_widget_get_pointer (widget, NULL, &y);
- else
- y = event->y;
-
- paned = E_PANED (widget);
-
- if (paned->in_drag)
- {
- gint size = y - GTK_CONTAINER(paned)->border_width - paned->handle_size / 2;
-
- e_vpaned_xor_line (paned);
- paned->child1_size = CLAMP (e_paned_quantized_size(paned, size), paned->min_position, paned->max_position);
- paned->child1_real_size = paned->child1_size;
- e_vpaned_xor_line(paned);
- }
-
- return TRUE;
-}
-
-static gboolean
-e_vpaned_handle_shown (EPaned *paned)
-{
- return ((paned->child1 && paned->child2) &&
- (GTK_WIDGET_VISIBLE (paned->child1) && GTK_WIDGET_VISIBLE (paned->child2)));
-}
diff --git a/widgets/e-paned/e-vpaned.h b/widgets/e-paned/e-vpaned.h
deleted file mode 100644
index 1c247472fd..0000000000
--- a/widgets/e-paned/e-vpaned.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* EPaned - A slightly more advanced paned widget.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Christopher James Lahey <clahey@helixcode.com>
- *
- * based on GtkPaned from Gtk+. Gtk+ Copyright notice follows.
- */
-
-/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * 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; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#ifndef __E_VPANED_H__
-#define __E_VPANED_H__
-
-#include <widgets/e-paned/e-paned.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define E_TYPE_VPANED (e_vpaned_get_type ())
-#define E_VPANED(obj) (GTK_CHECK_CAST ((obj), E_TYPE_VPANED, EVPaned))
-#define E_VPANED_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_VPANED, EVPanedClass))
-#define E_IS_VPANED(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_VPANED))
-#define E_IS_VPANED_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_VPANED))
-#define E_VPANED_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), E_TYPE_VPANED, EVPanedClass))
-
-
-typedef struct _EVPaned EVPaned;
-typedef struct _EVPanedClass EVPanedClass;
-
-struct _EVPaned
-{
- EPaned paned;
-};
-
-struct _EVPanedClass
-{
- EPanedClass parent_class;
-};
-
-GtkType e_vpaned_get_type (void);
-GtkWidget *e_vpaned_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_VPANED_H__ */
diff --git a/widgets/e-reflow/e-reflow-sorted.c b/widgets/e-reflow/e-reflow-sorted.c
deleted file mode 100644
index 2d2dcee787..0000000000
--- a/widgets/e-reflow/e-reflow-sorted.c
+++ /dev/null
@@ -1,272 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-reflow-sorted.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <math.h>
-#include <gnome.h>
-#include "e-reflow-sorted.h"
-#include <e-util/e-canvas-utils.h>
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-
-static void e_reflow_sorted_init (EReflowSorted *card);
-static void e_reflow_sorted_class_init (EReflowSortedClass *klass);
-static void e_reflow_sorted_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_reflow_sorted_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_reflow_sorted_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-
-#define E_REFLOW_DIVIDER_WIDTH 2
-#define E_REFLOW_BORDER_WIDTH 7
-#define E_REFLOW_FULL_GUTTER (E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH * 2)
-
-static EReflowClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_COMPARE_FUNC,
- ARG_STRING_FUNC
-};
-
-GtkType
-e_reflow_sorted_get_type (void)
-{
- static GtkType reflow_type = 0;
-
- if (!reflow_type)
- {
- static const GtkTypeInfo reflow_info =
- {
- "EReflowSorted",
- sizeof (EReflowSorted),
- sizeof (EReflowSortedClass),
- (GtkClassInitFunc) e_reflow_sorted_class_init,
- (GtkObjectInitFunc) e_reflow_sorted_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- reflow_type = gtk_type_unique (e_reflow_get_type (), &reflow_info);
- }
-
- return reflow_type;
-}
-
-static void
-e_reflow_sorted_class_init (EReflowSortedClass *klass)
-{
- GtkObjectClass *object_class;
- EReflowClass *reflow_class;
-
- object_class = (GtkObjectClass*) klass;
- reflow_class = E_REFLOW_CLASS (klass);
-
- parent_class = gtk_type_class (e_reflow_get_type ());
-
- gtk_object_add_arg_type ("EReflowSorted::compare_func", GTK_TYPE_POINTER,
- GTK_ARG_READWRITE, ARG_COMPARE_FUNC);
- gtk_object_add_arg_type ("EReflowSorted::string_func", GTK_TYPE_POINTER,
- GTK_ARG_READWRITE, ARG_STRING_FUNC);
-
- reflow_class->add_item = e_reflow_sorted_add_item;
-
- object_class->set_arg = e_reflow_sorted_set_arg;
- object_class->get_arg = e_reflow_sorted_get_arg;
-}
-
-static void
-e_reflow_sorted_init (EReflowSorted *reflow)
-{
- reflow->compare_func = NULL;
- reflow->string_func = NULL;
-}
-
-static void
-e_reflow_sorted_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EReflowSorted *e_reflow_sorted;
-
- item = GNOME_CANVAS_ITEM (o);
- e_reflow_sorted = E_REFLOW_SORTED (o);
-
- switch (arg_id){
- case ARG_COMPARE_FUNC:
- e_reflow_sorted->compare_func = GTK_VALUE_POINTER (*arg);
- break;
- case ARG_STRING_FUNC:
- e_reflow_sorted->string_func = GTK_VALUE_POINTER (*arg);
- break;
- }
-}
-
-static void
-e_reflow_sorted_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EReflowSorted *e_reflow_sorted;
-
- e_reflow_sorted = E_REFLOW_SORTED (object);
-
- switch (arg_id) {
- case ARG_COMPARE_FUNC:
- GTK_VALUE_POINTER (*arg) = e_reflow_sorted->compare_func;
- break;
- case ARG_STRING_FUNC:
- GTK_VALUE_POINTER (*arg) = e_reflow_sorted->string_func;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static GList *
-e_reflow_sorted_get_list(EReflowSorted *e_reflow_sorted, const gchar *id)
-{
- if (e_reflow_sorted->string_func) {
- EReflow *reflow = E_REFLOW(e_reflow_sorted);
- GList *list;
- for (list = reflow->items; list; list = g_list_next(list)) {
- GnomeCanvasItem *item = list->data;
- char *string = e_reflow_sorted->string_func (item);
- if (string && !strcmp(string, id)) {
- return list;
- }
- }
- }
- return NULL;
-}
-
-void
-e_reflow_sorted_remove_item(EReflowSorted *e_reflow_sorted, const gchar *id)
-{
- GList *list;
- GnomeCanvasItem *item = NULL;
-
- list = e_reflow_sorted_get_list(e_reflow_sorted, id);
- if (list)
- item = list->data;
-
- if (item) {
- EReflow *reflow = E_REFLOW(e_reflow_sorted);
- reflow->items = g_list_remove_link(reflow->items, list);
- g_list_free_1(list);
- gtk_object_unref(GTK_OBJECT(item));
- gtk_object_destroy(GTK_OBJECT(item));
- if ( GTK_OBJECT_FLAGS( e_reflow_sorted ) & GNOME_CANVAS_ITEM_REALIZED ) {
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(e_reflow_sorted));
- e_reflow_post_add_item(E_REFLOW(e_reflow_sorted), NULL);
- }
- }
-}
-
-void
-e_reflow_sorted_replace_item(EReflowSorted *e_reflow_sorted, GnomeCanvasItem *item)
-{
- if (e_reflow_sorted->string_func) {
- char *string = e_reflow_sorted->string_func (item);
- e_reflow_sorted_remove_item(e_reflow_sorted, string);
- e_reflow_sorted_add_item(E_REFLOW(e_reflow_sorted), item);
- }
-}
-
-GnomeCanvasItem *
-e_reflow_sorted_get_item(EReflowSorted *e_reflow_sorted, const gchar *id)
-{
- GList *list;
- list = e_reflow_sorted_get_list(e_reflow_sorted, id);
- if (list)
- return list->data;
- else
- return NULL;
-}
-
-void
-e_reflow_sorted_reorder_item(EReflowSorted *e_reflow_sorted, const gchar *id)
-{
- GList *list;
- GnomeCanvasItem *item = NULL;
-
- list = e_reflow_sorted_get_list(e_reflow_sorted, id);
- if (list)
- item = list->data;
- if (item) {
- EReflow *reflow = E_REFLOW(e_reflow_sorted);
- reflow->items = g_list_remove_link(reflow->items, list);
- gtk_object_unref(GTK_OBJECT(item));
- g_list_free_1(list);
- e_reflow_sorted_add_item(reflow, item);
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(e_reflow_sorted));
- }
-}
-
-static void
-e_reflow_sorted_add_item(EReflow *reflow, GnomeCanvasItem *item)
-{
- EReflowSorted *e_reflow_sorted = E_REFLOW_SORTED(reflow);
- if ( e_reflow_sorted->compare_func ) {
- reflow->items = g_list_insert_sorted(reflow->items, item, e_reflow_sorted->compare_func);
- gtk_object_ref(GTK_OBJECT(item));
-
- if ( GTK_OBJECT_FLAGS( e_reflow_sorted ) & GNOME_CANVAS_ITEM_REALIZED ) {
- gnome_canvas_item_set(item,
- "width", (double) reflow->column_width,
- NULL);
-
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(e_reflow_sorted));
- }
- }
- e_reflow_post_add_item(reflow, item);
-}
-
-void e_reflow_sorted_jump (EReflowSorted *sorted,
- GCompareFunc compare_func,
- void *value)
-{
- int columns = 0;
- EReflow *reflow = E_REFLOW(sorted);
- GList *list;
- GtkAdjustment *adjustment;
-
- for (list = reflow->columns; list; list = g_list_next(list)) {
- if (compare_func(((GList *)list->data)->data, value) >= 0) {
- GList *last = list->prev;
- if (last) {
- GList *walk;
- for (walk = last->data; walk != list->data; walk = g_list_next(walk)) {
- if (compare_func(walk->data, value) >= 0) {
- columns --;
- break;
- }
- }
- }
- adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(sorted)->canvas));
- gtk_adjustment_set_value(adjustment, (reflow->column_width + E_REFLOW_FULL_GUTTER) * columns);
- return;
- }
- columns ++;
- }
- columns --;
- adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(sorted)->canvas));
- gtk_adjustment_set_value(adjustment, (reflow->column_width + E_REFLOW_FULL_GUTTER) * columns);
-}
diff --git a/widgets/e-reflow/e-reflow-sorted.h b/widgets/e-reflow/e-reflow-sorted.h
deleted file mode 100644
index 1be4971fb2..0000000000
--- a/widgets/e-reflow/e-reflow-sorted.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-reflow-sorted.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_REFLOW_SORTED_H__
-#define __E_REFLOW_SORTED_H__
-
-#include <addressbook/gui/minicard/e-reflow.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EReflowSorted - A canvas item container.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * 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_REFLOW_SORTED_TYPE (e_reflow_sorted_get_type ())
-#define E_REFLOW_SORTED(obj) (GTK_CHECK_CAST ((obj), E_REFLOW_SORTED_TYPE, EReflowSorted))
-#define E_REFLOW_SORTED_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_REFLOW_SORTED_TYPE, EReflowSortedClass))
-#define E_IS_REFLOW_SORTED(obj) (GTK_CHECK_TYPE ((obj), E_REFLOW_SORTED_TYPE))
-#define E_IS_REFLOW_SORTED_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_REFLOW_SORTED_TYPE))
-
-typedef char * (* EReflowStringFunc) (GnomeCanvasItem *);
-
-typedef struct _EReflowSorted EReflowSorted;
-typedef struct _EReflowSortedClass EReflowSortedClass;
-
-/* FIXME: Try reimplementing this as a hash table with key as string
- and change EReflow to use a GTree. */
-struct _EReflowSorted
-{
- EReflow parent;
-
- /* item specific fields */
- GCompareFunc compare_func;
- EReflowStringFunc string_func;
-};
-
-struct _EReflowSortedClass
-{
- EReflowClass parent_class;
-};
-
-/*
- * To be added to a reflow, an item must have the argument "width" as
- * a Read/Write argument and "height" as a Read Only argument. It
- * should also do an ECanvas parent reflow request if its size
- * changes.
- */
-void e_reflow_sorted_remove_item (EReflowSorted *sorted, const char *id);
-void e_reflow_sorted_replace_item (EReflowSorted *sorted, GnomeCanvasItem *item);
-void e_reflow_sorted_reorder_item (EReflowSorted *e_reflow_sorted, const gchar *id);
-GnomeCanvasItem *e_reflow_sorted_get_item (EReflowSorted *e_reflow_sorted, const gchar *id);
-GtkType e_reflow_sorted_get_type (void);
-void e_reflow_sorted_jump (EReflowSorted *sorted, GCompareFunc compare_func, void *value);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_REFLOW_SORTED_H__ */
diff --git a/widgets/e-reflow/e-reflow.c b/widgets/e-reflow/e-reflow.c
deleted file mode 100644
index 0e9c8b92b1..0000000000
--- a/widgets/e-reflow/e-reflow.c
+++ /dev/null
@@ -1,859 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-reflow.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <math.h>
-#include "e-reflow.h"
-#include "e-text.h"
-#include <e-util/e-canvas-utils.h>
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-
-static void e_reflow_init (EReflow *reflow);
-static void e_reflow_class_init (EReflowClass *klass);
-static void e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_reflow_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_reflow_destroy (GtkObject *object);
-static gboolean e_reflow_event (GnomeCanvasItem *item, GdkEvent *event);
-static void e_reflow_realize (GnomeCanvasItem *item);
-static void e_reflow_unrealize (GnomeCanvasItem *item);
-static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-static void e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags);
-static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item);
-static void e_reflow_reflow (GnomeCanvasItem *item, int flags);
-static void e_reflow_real_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-static void set_empty(EReflow *e_reflow);
-
-static void e_reflow_resize_children (GnomeCanvasItem *item);
-
-#define E_REFLOW_DIVIDER_WIDTH 2
-#define E_REFLOW_BORDER_WIDTH 7
-#define E_REFLOW_FULL_GUTTER (E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH * 2)
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_MINIMUM_WIDTH,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_EMPTY_MESSAGE,
-};
-
-GtkType
-e_reflow_get_type (void)
-{
- static GtkType reflow_type = 0;
-
- if (!reflow_type)
- {
- static const GtkTypeInfo reflow_info =
- {
- "EReflow",
- sizeof (EReflow),
- sizeof (EReflowClass),
- (GtkClassInitFunc) e_reflow_class_init,
- (GtkObjectInitFunc) e_reflow_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- reflow_type = gtk_type_unique (gnome_canvas_group_get_type (), &reflow_info);
- }
-
- return reflow_type;
-}
-
-static void
-e_reflow_class_init (EReflowClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- gtk_object_add_arg_type ("EReflow::minimum_width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MINIMUM_WIDTH);
- gtk_object_add_arg_type ("EReflow::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_WIDTH);
- gtk_object_add_arg_type ("EReflow::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_HEIGHT);
- gtk_object_add_arg_type ("EReflow::empty_message", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_EMPTY_MESSAGE);
-
- klass->add_item = e_reflow_real_add_item;
-
- object_class->set_arg = e_reflow_set_arg;
- object_class->get_arg = e_reflow_get_arg;
- object_class->destroy = e_reflow_destroy;
-
- /* GnomeCanvasItem method overrides */
- item_class->event = e_reflow_event;
- item_class->realize = e_reflow_realize;
- item_class->unrealize = e_reflow_unrealize;
- item_class->draw = e_reflow_draw;
- item_class->update = e_reflow_update;
- item_class->point = e_reflow_point;
-}
-
-static void
-e_reflow_init (EReflow *reflow)
-{
- reflow->items = NULL;
- reflow->columns = NULL;
- reflow->column_width = 150;
-
- reflow->minimum_width = 10;
- reflow->width = 10;
- reflow->height = 10;
- reflow->idle = 0;
-
- reflow->empty_message = NULL;
- reflow->empty_text = NULL;
-
- reflow->column_drag = FALSE;
-
- reflow->need_height_update = FALSE;
- reflow->need_column_resize = FALSE;
-
- reflow->default_cursor_shown = TRUE;
- reflow->arrow_cursor = NULL;
- reflow->default_cursor = NULL;
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(reflow), e_reflow_reflow);
-}
-
-static void
-e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EReflow *e_reflow;
-
- item = GNOME_CANVAS_ITEM (o);
- e_reflow = E_REFLOW (o);
-
- switch (arg_id){
- case ARG_HEIGHT:
- e_reflow->height = GTK_VALUE_DOUBLE (*arg);
- e_canvas_item_request_reflow(item);
- break;
- case ARG_MINIMUM_WIDTH:
- e_reflow->minimum_width = GTK_VALUE_DOUBLE (*arg);
- if (GNOME_CANVAS_ITEM_REALIZED & GTK_OBJECT_FLAGS(o))
- set_empty(e_reflow);
- e_canvas_item_request_reflow(item);
- break;
- case ARG_EMPTY_MESSAGE:
- g_free(e_reflow->empty_message);
- e_reflow->empty_message = g_strdup(GTK_VALUE_STRING (*arg));
- if (GNOME_CANVAS_ITEM_REALIZED & GTK_OBJECT_FLAGS(o))
- set_empty(e_reflow);
- }
-}
-
-static void
-e_reflow_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (object);
-
- switch (arg_id) {
- case ARG_MINIMUM_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_reflow->minimum_width;
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_reflow->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = e_reflow->height;
- break;
- case ARG_EMPTY_MESSAGE:
- GTK_VALUE_STRING (*arg) = g_strdup(e_reflow->empty_message);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_reflow_destroy (GtkObject *object)
-{
- EReflow *reflow = E_REFLOW(object);
-
- g_list_foreach(reflow->items, (GFunc) gtk_object_unref, NULL);
- g_list_free(reflow->items);
- reflow->items = NULL;
-
- g_free(reflow->empty_message);
-
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
-}
-
-static void
-e_reflow_realize (GnomeCanvasItem *item)
-{
- EReflow *e_reflow;
- GnomeCanvasGroup *group;
- GList *list;
- GtkAdjustment *adjustment;
-
- e_reflow = E_REFLOW (item);
- group = GNOME_CANVAS_GROUP( item );
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
-
- e_reflow->arrow_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
- e_reflow->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
-
- for(list = e_reflow->items; list; list = g_list_next(list)) {
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(item,
- "width", (double) e_reflow->column_width,
- NULL);
- }
-
- set_empty(e_reflow);
-
- e_canvas_item_request_reflow(item);
-
- adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- adjustment->step_increment = (e_reflow->column_width + E_REFLOW_FULL_GUTTER) / 2;
- adjustment->page_increment = adjustment->page_size - adjustment->step_increment;
- gtk_adjustment_changed(adjustment);
-
- if (!item->canvas->aa) {
- }
-}
-
-static void
-e_reflow_unrealize (GnomeCanvasItem *item)
-{
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (item);
-
- if (!item->canvas->aa)
- {
- }
-
- gdk_cursor_destroy (e_reflow->arrow_cursor);
- gdk_cursor_destroy (e_reflow->default_cursor);
- e_reflow->arrow_cursor = NULL;
- e_reflow->default_cursor = NULL;
-
- g_list_free (e_reflow->columns);
- e_reflow->columns = NULL;
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item);
-}
-
-static gint
-e_reflow_pick_line (EReflow *e_reflow, double x)
-{
- x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- x /= e_reflow->column_width + E_REFLOW_FULL_GUTTER;
- return x;
-}
-
-static gboolean
-e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (item);
-
- switch( event->type )
- {
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Tab ||
- event->key.keyval == GDK_KP_Tab ||
- event->key.keyval == GDK_ISO_Left_Tab) {
- GList *list;
- for (list = e_reflow->items; list; list = list->next) {
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (list->data);
- EFocus has_focus;
- gtk_object_get(GTK_OBJECT(item),
- "has_focus", &has_focus,
- NULL);
- if (has_focus) {
- if (event->key.state & GDK_SHIFT_MASK)
- list = list->prev;
- else
- list = list->next;
- if (list) {
- item = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(item,
- "has_focus", (event->key.state & GDK_SHIFT_MASK) ? E_FOCUS_END : E_FOCUS_START,
- NULL);
- return 1;
- } else {
- return 0;
- }
- }
- }
- }
- break;
- case GDK_BUTTON_PRESS:
- switch(event->button.button)
- {
- case 1:
- {
- GdkEventButton *button = (GdkEventButton *) event;
- double n_x, max_x;
- n_x = button->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
-
- max_x = E_REFLOW_BORDER_WIDTH;
- max_x += (e_reflow->column_width + E_REFLOW_FULL_GUTTER) * e_reflow->column_count;
- if ( button->y >= E_REFLOW_BORDER_WIDTH && button->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER && max_x > button->x ) {
- e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x);
- e_reflow->start_x = e_reflow->which_column_dragged * (e_reflow->column_width + E_REFLOW_FULL_GUTTER) - E_REFLOW_DIVIDER_WIDTH / 2;
- e_reflow->temp_column_width = e_reflow->column_width;
- e_reflow->column_drag = TRUE;
-
- gnome_canvas_item_grab (item,
- GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
- e_reflow->arrow_cursor,
- button->time);
-
- e_reflow->previous_temp_column_width = -1;
- e_reflow->need_column_resize = TRUE;
- gnome_canvas_item_request_update(item);
- return TRUE;
- }
- }
- break;
- case 4:
- {
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- gdouble new_value = adjustment->value;
- new_value -= adjustment->step_increment;
- gtk_adjustment_set_value(adjustment, new_value);
- }
- break;
- case 5:
- {
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- gdouble new_value = adjustment->value;
- new_value += adjustment->step_increment;
- if ( new_value > adjustment->upper - adjustment->page_size )
- new_value = adjustment->upper - adjustment->page_size;
- gtk_adjustment_set_value(adjustment, new_value);
- }
- break;
- }
- break;
- case GDK_BUTTON_RELEASE:
- if (e_reflow->column_drag) {
- gdouble old_width = e_reflow->column_width;
- GdkEventButton *button = (GdkEventButton *) event;
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- e_reflow->temp_column_width = e_reflow->column_width +
- (button->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
- if ( e_reflow->temp_column_width < 50 )
- e_reflow->temp_column_width = 50;
- e_reflow->column_drag = FALSE;
- if ( old_width != e_reflow->temp_column_width ) {
- gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width));
- e_reflow->column_width = e_reflow->temp_column_width;
- adjustment->step_increment = (e_reflow->column_width + E_REFLOW_FULL_GUTTER) / 2;
- adjustment->page_increment = adjustment->page_size - adjustment->step_increment;
- gtk_adjustment_changed(adjustment);
- e_reflow_resize_children(item);
- e_canvas_item_request_reflow(item);
- }
- e_reflow->need_column_resize = TRUE;
- gnome_canvas_item_request_update(item);
- gnome_canvas_item_ungrab (item, button->time);
- return TRUE;
- }
- break;
- case GDK_MOTION_NOTIFY:
- if (e_reflow->column_drag) {
- double old_width = e_reflow->temp_column_width;
- GdkEventMotion *motion = (GdkEventMotion *) event;
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- e_reflow->temp_column_width = e_reflow->column_width +
- (motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
- if (e_reflow->temp_column_width < 50)
- e_reflow->temp_column_width = 50;
- if (old_width != e_reflow->temp_column_width) {
- e_reflow->need_column_resize = TRUE;
- gnome_canvas_item_request_update(item);
- }
- return TRUE;
- } else {
- GdkEventMotion *motion = (GdkEventMotion *) event;
- double n_x, max_x;
-
- n_x = motion->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
-
- max_x = E_REFLOW_BORDER_WIDTH;
- max_x += (e_reflow->column_width + E_REFLOW_FULL_GUTTER) * e_reflow->column_count;
-
- if ( motion->y >= E_REFLOW_BORDER_WIDTH && motion->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER && max_x > motion->x) {
- if ( e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
- e_reflow->default_cursor_shown = FALSE;
- }
- } else
- if ( ! e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
- e_reflow->default_cursor_shown = TRUE;
- }
-
- }
- break;
- case GDK_ENTER_NOTIFY:
- if (!e_reflow->column_drag) {
- GdkEventCrossing *crossing = (GdkEventCrossing *) event;
- double n_x, max_x;
- n_x = crossing->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
-
- max_x = E_REFLOW_BORDER_WIDTH;
- max_x += (e_reflow->column_width + E_REFLOW_FULL_GUTTER) * e_reflow->column_count;
- if ( crossing->y >= E_REFLOW_BORDER_WIDTH && crossing->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER && max_x > crossing->x) {
- if ( e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
- e_reflow->default_cursor_shown = FALSE;
- }
- }
- }
- break;
- case GDK_LEAVE_NOTIFY:
- if (!e_reflow->column_drag) {
- GdkEventCrossing *crossing = (GdkEventCrossing *) event;
- double n_x;
- n_x = crossing->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
- if ( !( crossing->y >= E_REFLOW_BORDER_WIDTH && crossing->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER ) ) {
- if ( ! e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
- e_reflow->default_cursor_shown = TRUE;
- }
- }
- }
- 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_reflow_real_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
-{
- e_reflow->items = g_list_append(e_reflow->items, item);
- gtk_object_ref(GTK_OBJECT(item));
- if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
- gnome_canvas_item_set(item,
- "width", (double) e_reflow->column_width,
- NULL);
- e_reflow_post_add_item(e_reflow, item);
- e_canvas_item_request_reflow(item);
- }
-
-}
-
-static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- int x_rect, y_rect, width_rect, height_rect;
- gdouble running_width;
- EReflow *e_reflow = E_REFLOW(item);
- int i;
- double column_width;
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->draw)
- GNOME_CANVAS_ITEM_CLASS(parent_class)->draw (item, drawable, x, y, width, height);
- column_width = e_reflow->column_width;
- running_width = E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- x_rect = running_width;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- /* Compute first column to draw. */
- i = x;
- i /= column_width + E_REFLOW_FULL_GUTTER;
- running_width += i * (column_width + E_REFLOW_FULL_GUTTER);
-
- for ( ; i < e_reflow->column_count; i++) {
- if ( running_width > x + width )
- break;
- x_rect = running_width;
- gtk_paint_flat_box(GTK_WIDGET(item->canvas)->style,
- drawable,
- GTK_STATE_ACTIVE,
- GTK_SHADOW_NONE,
- NULL,
- GTK_WIDGET(item->canvas),
- "reflow",
- x_rect - x,
- y_rect - y,
- width_rect,
- height_rect);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- if (e_reflow->column_drag) {
- int start_line = e_reflow_pick_line(e_reflow,
- gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
- i = x - start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width = start_line * (column_width + E_REFLOW_FULL_GUTTER);
- column_width = e_reflow->temp_column_width;
- running_width -= start_line * (column_width + E_REFLOW_FULL_GUTTER);
- i += start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width += E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- x_rect = running_width;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- /* Compute first column to draw. */
- i /= column_width + E_REFLOW_FULL_GUTTER;
- running_width += i * (column_width + E_REFLOW_FULL_GUTTER);
-
- for ( ; i < e_reflow->column_count; i++) {
- if ( running_width > x + width )
- break;
- x_rect = running_width;
- gdk_draw_rectangle(drawable,
- GTK_WIDGET(item->canvas)->style->fg_gc[GTK_STATE_NORMAL],
- TRUE,
- x_rect - x,
- y_rect - y,
- width_rect - 1,
- height_rect - 1);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- }
-}
-
-static void
-e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags)
-{
- EReflow *e_reflow;
- double x0, x1, y0, y1;
-
- e_reflow = E_REFLOW (item);
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update)
- GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags);
-
- x0 = item->x1;
- y0 = item->y1;
- x1 = item->x2;
- y1 = item->y2;
- if ( x1 < x0 + e_reflow->width )
- x1 = x0 + e_reflow->width;
- if ( y1 < y0 + e_reflow->height )
- y1 = y0 + e_reflow->height;
- item->x2 = x1;
- item->y2 = y1;
-
- if (e_reflow->need_height_update) {
- x0 = item->x1;
- y0 = item->y1;
- x1 = item->x2;
- y1 = item->y2;
- if ( x0 > 0 )
- x0 = 0;
- if ( y0 > 0 )
- y0 = 0;
- if ( x1 < E_REFLOW(item)->width )
- x1 = E_REFLOW(item)->width;
- if ( x1 < E_REFLOW(item)->height )
- x1 = E_REFLOW(item)->height;
-
- gnome_canvas_request_redraw(item->canvas, x0, y0, x1, y1);
- e_reflow->need_height_update = FALSE;
- } else if (e_reflow->need_column_resize) {
- int x_rect, y_rect, width_rect, height_rect;
- int start_line = e_reflow_pick_line(e_reflow,
- gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
- gdouble running_width;
- int i;
- double column_width;
-
- if ( e_reflow->previous_temp_column_width != -1 ) {
- running_width = start_line * (e_reflow->column_width + E_REFLOW_FULL_GUTTER);
- column_width = e_reflow->previous_temp_column_width;
- running_width -= start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width += E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- for ( i = 0; i < e_reflow->column_count; i++) {
- x_rect = running_width;
- gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- }
-
- if ( e_reflow->temp_column_width != -1 ) {
- running_width = start_line * (e_reflow->column_width + E_REFLOW_FULL_GUTTER);
- column_width = e_reflow->temp_column_width;
- running_width -= start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width += E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- for ( i = 0; i < e_reflow->column_count; i++) {
- x_rect = running_width;
- gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- }
-
- e_reflow->previous_temp_column_width = e_reflow->temp_column_width;
- e_reflow->need_column_resize = FALSE;
- }
-}
-
-static void
-e_reflow_resize_children (GnomeCanvasItem *item)
-{
- GList *list;
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (item);
- for ( list = e_reflow->items; list; list = list->next ) {
- GnomeCanvasItem *child = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(child,
- "width", (double) e_reflow->column_width,
- NULL);
- }
-}
-
-static double
-e_reflow_point (GnomeCanvasItem *item,
- double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- double distance = 1;
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->point)
- distance = GNOME_CANVAS_ITEM_CLASS(parent_class)->point (item, x, y, cx, cy, actual_item);
- if (*actual_item)
- return 0;
-
- *actual_item = item;
- return 0;
-#if 0
- if (y >= E_REFLOW_BORDER_WIDTH && y <= e_reflow->height - E_REFLOW_BORDER_WIDTH) {
- float n_x;
- n_x = x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x, (e_reflow->column_width + E_REFLOW_FULL_GUTTER));
- if (n_x < E_REFLOW_FULL_GUTTER) {
- *actual_item = item;
- return 0;
- }
- }
- return distance;
-#endif
-}
-
-static void
-_reflow( EReflow *e_reflow )
-{
- gdouble running_height;
- GList *list;
- double item_height;
-
- if (e_reflow->columns) {
- g_list_free (e_reflow->columns);
- e_reflow->columns = NULL;
- }
-
- e_reflow->column_count = 0;
-
- if (e_reflow->items == NULL) {
- e_reflow->columns = NULL;
- e_reflow->column_count = 0;
- return;
- }
-
- list = e_reflow->items;
-
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- running_height = E_REFLOW_BORDER_WIDTH + item_height + E_REFLOW_BORDER_WIDTH;
- e_reflow->columns = g_list_append (e_reflow->columns, list);
- e_reflow->column_count = 1;
-
- list = g_list_next(list);
-
- for ( ; list; list = g_list_next(list)) {
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- if (running_height + item_height + E_REFLOW_BORDER_WIDTH > e_reflow->height) {
- running_height = E_REFLOW_BORDER_WIDTH + item_height + E_REFLOW_BORDER_WIDTH;
- e_reflow->columns = g_list_append (e_reflow->columns, list);
- e_reflow->column_count ++;
- } else {
- running_height += item_height + E_REFLOW_BORDER_WIDTH;
- }
- }
-}
-
-static void
-set_empty(EReflow *e_reflow)
-{
- if (e_reflow->items == NULL) {
- if (e_reflow->empty_text) {
- if (e_reflow->empty_message) {
- gnome_canvas_item_set(e_reflow->empty_text,
- "width", e_reflow->minimum_width,
- "text", e_reflow->empty_message,
- NULL);
- e_canvas_item_move_absolute(e_reflow->empty_text,
- e_reflow->minimum_width / 2,
- 0);
- } else {
- gtk_object_destroy(GTK_OBJECT(e_reflow->empty_text));
- e_reflow->empty_text = NULL;
- }
- } else {
- if (e_reflow->empty_message)
- e_reflow->empty_text =
- gnome_canvas_item_new(GNOME_CANVAS_GROUP(e_reflow),
- e_text_get_type(),
- "anchor", GTK_ANCHOR_N,
- "width", e_reflow->minimum_width,
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "font_gdk", GTK_WIDGET(GNOME_CANVAS_ITEM(e_reflow)->canvas)->style->font,
- "fill_color", "black",
- "justification", GTK_JUSTIFY_CENTER,
- "text", e_reflow->empty_message,
- NULL);
- e_canvas_item_move_absolute(e_reflow->empty_text,
- e_reflow->minimum_width / 2,
- 0);
- }
- } else {
- if (e_reflow->empty_text) {
- gtk_object_destroy(GTK_OBJECT(e_reflow->empty_text));
- e_reflow->empty_text = NULL;
- }
- }
-}
-
-static void
-e_reflow_reflow( GnomeCanvasItem *item, int flags )
-{
- EReflow *e_reflow = E_REFLOW(item);
- if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
-
- gdouble old_width;
- gdouble running_width;
-
- _reflow (e_reflow);
-
- old_width = e_reflow->width;
-
- running_width = E_REFLOW_BORDER_WIDTH;
-
- if (e_reflow->items == NULL) {
- } else {
- GList *list;
- GList *next_column;
- gdouble item_height;
- gdouble running_height;
-
- running_height = E_REFLOW_BORDER_WIDTH;
-
- list = e_reflow->items;
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- e_canvas_item_move_absolute(GNOME_CANVAS_ITEM(list->data),
- (double) running_width,
- (double) running_height);
- running_height += item_height + E_REFLOW_BORDER_WIDTH;
- next_column = g_list_next(e_reflow->columns);
- list = g_list_next(list);
-
- for( ; list; list = g_list_next(list)) {
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
-
- if (next_column && (next_column->data == list)) {
- next_column = g_list_next (next_column);
- running_height = E_REFLOW_BORDER_WIDTH;
- running_width += e_reflow->column_width + E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH;
- }
- e_canvas_item_move_absolute(GNOME_CANVAS_ITEM(list->data),
- (double) running_width,
- (double) running_height);
-
- running_height += item_height + E_REFLOW_BORDER_WIDTH;
- }
-
- }
- e_reflow->width = running_width + e_reflow->column_width + E_REFLOW_BORDER_WIDTH;
- if ( e_reflow->width < e_reflow->minimum_width )
- e_reflow->width = e_reflow->minimum_width;
- if (old_width != e_reflow->width)
- e_canvas_item_request_parent_reflow(item);
- }
-}
-
-void
-e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
-{
- if (E_REFLOW_CLASS(GTK_OBJECT(e_reflow)->klass)->add_item)
- (E_REFLOW_CLASS(GTK_OBJECT(e_reflow)->klass)->add_item) (e_reflow, item);
-}
-
-void
-e_reflow_post_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
-{
- set_empty(e_reflow);
-}
diff --git a/widgets/e-reflow/e-reflow.h b/widgets/e-reflow/e-reflow.h
deleted file mode 100644
index eb66b094a5..0000000000
--- a/widgets/e-reflow/e-reflow.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-reflow.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_REFLOW_H__
-#define __E_REFLOW_H__
-
-#include <gnome.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EReflow - A canvas item container.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * 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_REFLOW_TYPE (e_reflow_get_type ())
-#define E_REFLOW(obj) (GTK_CHECK_CAST ((obj), E_REFLOW_TYPE, EReflow))
-#define E_REFLOW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_REFLOW_TYPE, EReflowClass))
-#define E_IS_REFLOW(obj) (GTK_CHECK_TYPE ((obj), E_REFLOW_TYPE))
-#define E_IS_REFLOW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_REFLOW_TYPE))
-
-
-typedef struct _EReflow EReflow;
-typedef struct _EReflowClass EReflowClass;
-
-struct _EReflow
-{
- GnomeCanvasGroup parent;
-
- /* item specific fields */
- GList *items; /* Of type GnomeCanvasItem */
- GList *columns; /* Of type GList of type GnomeCanvasItem (points into items) */
- gint column_count; /* Number of columnns */
-
- GnomeCanvasItem *empty_text;
- gchar *empty_message;
-
- double minimum_width;
- double width;
- double height;
-
- double column_width;
-
- int idle;
-
- /* These are all for when the column is being dragged. */
- gboolean column_drag;
- gdouble start_x;
- gint which_column_dragged;
- double temp_column_width;
- double previous_temp_column_width;
-
- guint need_height_update : 1;
- guint need_column_resize : 1;
-
- guint default_cursor_shown : 1;
- GdkCursor *arrow_cursor;
- GdkCursor *default_cursor;
-};
-
-struct _EReflowClass
-{
- GnomeCanvasGroupClass parent_class;
-
- /* Virtual methods. */
- void (* add_item) (EReflow *reflow, GnomeCanvasItem *item);
-};
-
-/*
- * To be added to a reflow, an item must have the argument "width" as
- * a Read/Write argument and "height" as a Read Only argument. It
- * should also do an ECanvas parent reflow request if its size
- * changes.
- */
-void e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-GtkType e_reflow_get_type (void);
-
-/* Internal usage only: */
-void e_reflow_post_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_REFLOW_H__ */
diff --git a/widgets/e-table/.cvsignore b/widgets/e-table/.cvsignore
deleted file mode 100644
index ecfa617948..0000000000
--- a/widgets/e-table/.cvsignore
+++ /dev/null
@@ -1,12 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-table-test
-table-example-1
-table-example-2
-table-size-test
-tree-example-1
diff --git a/widgets/e-table/ChangeLog b/widgets/e-table/ChangeLog
deleted file mode 100644
index 9ff6fbfe97..0000000000
--- a/widgets/e-table/ChangeLog
+++ /dev/null
@@ -1,2508 +0,0 @@
-2000-08-22 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c, e-cell-toggle.c, e-cell-tree.c, e-table-item.c:
- Moved drawing of the cell backgrounds from ECell into ETableItem.
-
- * e-tree-model.c: Include stdlib.c.
-
-2000-08-21 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-cell-text.c: Changed UTF-8 syntax from char based to byte based
-
-2000-08-21 Chris Toshok <toshok@helixcode.com>
-
- * e-tree-example-1.c (remove_node): we can remove nodes with
- children now.
-
- * e-tree-model.h: add prototype for e_tree_model_node_sort.
-
- * e-tree-model.c (etree_set_expanded): if the node is invisible,
- just set its expanded flag and return.
- (e_tree_model_root_node_set_visible): call set_expanded before we
- remove it from the row array or else the aforementioned change
- will result in nothing happening.
- (e_tree_model_node_insert): use a position of -1 as "append".
- (e_tree_model_node_insert): if the model was marked with
- root_visible == FALSE, make sure to set it's expanded flag to TRUE
- when the root node is inserted.
- (e_tree_model_node_sort): new function.
-
-2000-08-21 Chris Toshok <toshok@helixcode.com>
-
- * e-table.c (e_table_drag_source_set): pass table, not site as the
- closure for these drag signals, since e_table_drag_source_event_cb
- assumes it's the table.
-
-2000-08-20 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-selection-model.c, e-table-selection-model.h: Added
- e_table_selection_model_selected_count.
-
-2000-08-19 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-cell-text.c: Use EFont wrapper
- Use UTF-8 strings
-
-2000-08-19 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Made background colors alternate.
-
- * e-table-click-to-add.c: Made tabbing off the right edge of the
- click to add commit the new values.
-
- * e-table-group-container.c, e-table-group-leaf.c,
- e-table-group.c, e-table-group.h, e-table-sorted-variable.c,
- e-table-subset-variable.c, e-table-subset-variable.h: Added a
- decrement method. Made the add and remove methods not
- automatically increment and decrement.
-
- * e-table-item.c: Fixed some view vs model issues for both rows
- and columns.
-
- * e-table-model.c: Added debugging code. Removed automatic
- signalling of changes by the ETableModel set_value_at function
- (the model should send these signals itself.)
-
- * e-table.c: Added increment and decrement calls when a row is
- removed or added from the source model.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c, e-table-selection-model.c,
- e-table-selection-model.h: Make right click select if the current
- row is not selected.
-
-2000-08-08 Miguel de Icaza <miguel@helixcode.com>
-
- * e-table-header-item.c: Tag some strings for translation.
-
-2000-07-18 Miguel de Icaza <miguel@helixcode.com>
-
- * e-tree-model.c (etree_destroy): Call our parent's destroy
- method.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c: Changed e_popup_menu_run call to match
- the new arguments.
-
-2000-08-05 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c, e-table.h: Added functions to convert from view row
- to model row or from model row to view row. Also changed
- e_table_set_cursor_row and e_table_get_cursor_row to take a model
- row as this works better with the rest of the model. Changed the
- name of e_table_get_next_row_sorted and
- e_table_get_prev_row_sorted. (Dropped the _sorted.)
-
-2000-08-05 Dan Winship <danw@helixcode.com>
-
- * e-table.c (e_table_get_{next,prev}_row_sorted): fix
-
-2000-08-05 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Added a function to get the next row with sorting
- taken into account.
-
-2000-08-05 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-sorter.c: Made it so that selection ranges work even if
- the table is using grouping.
-
-2000-08-05 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am, e-table-selection-model.c,
- e-table-selection-model.h, e-table.c, e-table.h: Made selection
- ranges work even if the table is sorted.
-
- * e-table-sorter.c, e-table-sorter.h: New files to help with
- making selection ranges work even if sorted.
-
-2000-08-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c, e-table.h: Built code to have autodrags only work
- from within the table and to report the row dragged from
- automatically.
-
-2000-08-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-leaf.c,
- e-table-group.c, e-table-group.h, e-table-item.c, e-table-item.h:
- Made drag events calculate a row and column and signal that
- information.
-
- * e-table-selection-model.c, e-table-selection-model.h: Changed
- do_something to take a GdkModifierType.
-
-2000-08-02 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c, e-table-item.h: Add a handler for
- "model_pre_change" and properly stop editing.
-
- * e-table-model.c, e-table-model.h: Added a "model_pre_change"
- signal that gets sent before any row numbers are changed.
-
- * e-table-sorted-variable.c, e-table-subset-variable.c: Emit
- "model_pre_change" signals as appropriate.
-
- * e-table-subset.c, e-table-subset.h: Proxy "model_pre_changed"
- signals.
-
-2000-08-02 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-model.c, e-table-model.h: Changed the API for the
- append_row function. Now accepts a model to copy data from
- instead of returning a row number and leaving it up to ETableOne
- to copy the data in.
-
- * e-table-one.c, e-table-one.h: Adapted to use new append_row API.
-
- * e-table-simple.c, e-table-simple.h, e-table-subset.c: Adapted to
- supply new append_row API.
-
-2000-07-31 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-col.c, e-table-col.h: Added an argument to set a column
- so that you can't sort by that column.
-
- * e-table-header-item.c: Obey the sortable column of ETableCol.
-
-2000-07-29 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-click-to-add.c: Made enter key destroy and recreate the
- ETableItem.
-
- * e-table-item.c: Grab focus when person clicks even if cursor
- isn't changing.
-
-2000-07-28 Dan Winship <danw@helixcode.com>
-
- * e-table-header.c (eth_destroy): Remove the idle handler before
- destroying the data it operates on.
-
-2000-07-27 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Fixed up the table behavior so that it's not
- always in an edit mode.
-
-2000-07-27 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-selection-model.c: Added a comment.
-
-2000-07-27 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-selection-model.c: Fixed shift click selections.
-
-2000-07-27 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-selection-model.c: Allocate correctly in the insert and
- delete methods.
-
- * e-table-click-to-add.c: Removed the line that was causing this
- to do bad things.
-
-2000-07-27 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c (eti_cursor_change): Grab focus properly.
-
- * e-table-item.c, e-table-click-to-add.c: Fixed ETableClickToAdd
- to handle carriage return. This still doesn't quite work right.
-
-2000-07-27 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-click-to-add.c: Clear the selection model when
- activating.
-
- * e-table-item.c: Fixed a bunch of model column vs. view column
- issues.
-
- * e-table-selection-model.c: Set the cursor to -1, -1 and emi a
- "cursor_changed" signal.
-
-2000-07-26 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-click-to-add.c: Fixed a reference.
-
- * e-table-selection-model.c, e-table-selection-model.h: Added a
- clear function.
-
- * e-table.c, e-table.h: Made going from click to add to the main
- table and back work better.
-
-2000-07-26 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-click-to-add.c, e-table-click-to-add.h: Added an
- ETableSelectionModel so this won't crash.
-
-2000-07-26 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Fixed the model/view row confusion.
-
- * e-table-selection-model.c: Changed one expression to use a
- #define properly.
-
-2000-07-26 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-container.h,
- e-table-group-leaf.c, e-table-group-leaf.h: Added "table_selection_model"
- argument. Removed foreach function and selection notification.
-
- * e-table-group.c, e-table-group.h: Removed foreach function and
- selection notification.
-
- * e-table-header.c: Fixed header width calculation to include the
- last column.
-
- * e-table-item.c, e-table-item.h: Fixed this to use the new
- selection model.
-
- * e-table-scrolled.c, e-table-scrolled.h: Removed selection
- notification.
-
- * e-table-selection-model.c, e-table-selection-model.h: Finished
- notification signals and fixed a bunch of bit manipulations.
- Implemented do_something method.
-
- * e-table.c, e-table.h: Create an ETableSelectionModel and use it
- properly.
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-selection-model.c: Made foreach call the callback in top
- to bottom order.
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-selection-model.c, e-table-selection-model.h: Replaced
- get_selection_list with foreach.
-
- * e-table.h: Add a ETableSelectionModel.
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added e-table-selection-model.c and
- e-table-selection-model.h.
-
- * e-table-selection-model.c: Added the get_selection_list and
- is_row_selected functions. Removed some unused code.
-
- * e-table-selection-model.h: Removed some unused code.
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-selection-model.c: Added comments to the bit field code.
-
- * e-table-selection-model.h: Made the selection data guint32s.
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-selection-model.c: More fixes.
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-selection-model.c: Fixed up the bit manipulation a bit
- here.
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-selection-model.c, e-table-selection-model.h: New files
- for doing a selection model. Not finished yet and thus not in
- Makefile.am.
-
- * e-table.c, e-table.h: Renamed the new dnd signals so that they
- won't conflict with the widget signals.
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c, e-table.h: Implemented some of the drag & drop code.
- Drops all report as being on row 0, col 0. Also, automatic drags
- don't set the row and column being dragged from.
-
-2000-07-23 Damon Chaplin <damon@helixcode.com>
-
- * e-cell-text.c: added a color_column where the color can be specified
- as a string, e.g. "red" or "rgb:F/0/0".
-
- * e-cell-text.c (ect_leave_edit): don't call unbuild_current_cell()
- since the CellEdit struct has been freed in ect_stop_editing() and so
- has the text.
-
- * e-cell-text.c (unbuild_current_cell): set cell->text to NULL to make
- sure we don't try to free it again.
-
-2000-07-21 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.h: Added some unused declarations for drag and drop
- work.
-
-2000-07-14 Michael Meeks <michael@helixcode.com>
-
- * e-table-subset.c (etss_destroy): g_free things we g_malloc.
-
-2000-07-13 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c: Changed the background color of the
- header.
-
-2000-07-12 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c: Made scroll wheel work properly in
- header.
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-table.c (set_scroll_adjustments): Be safe if @vadjustment is
- NULL.
-
- * e-table-scrolled.c (e_table_scrolled_init): Set policy and
- shadow type.
- (e_table_scrolled_real_construct): Don't set the adjustments.
- (e_table_scrolled_new): Create the widget with `gtk_widget_new()'
- and pass hadjustment/vadjustment NULL values so that we get the
- `GTK_OBJECT_CONSTRUCTED' approval.
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-table-scrolled.h: s/GtkTable/EScrollFrameClass/.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Add e-table-scrolled.c and e-table-scrolled.h.
-
- * e-table-item.c: Make sure that find_cell returns FALSE if the
- item doesn't have any cells.
-
- * e-table-scrolled.c, e-table-scrolled.h: Added a widget to
- contain an ETable and provide scrollbars (for ease of use.)
-
- * e-table.c, e-table.h: Make this support the scrollable interface
- and not contain its own scrollbars.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c (eti_event): Put back e_cell_event sometimes when
- we're not editing.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Set the dnd_code to something non-null for the
- ETableHeaderItem.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Set header canvas scroll region correctly.
-
-2000-07-09 Anders Carlsson <andersca@gnu.org>
-
- * e-table-header-item.c (ethi_drag_motion): Don't draw drop
- marker when the layout won't be changed by the drop.
-
-2000-07-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-table-item.c (eti_table_model_changed): Removed an unused
- variable.
-
-2000-07-08 Dan Winship <danw@helixcode.com>
-
- * e-tree-model.c (e_tree_model_node_insert): When inserting a root
- node, only call e_table_model_row_inserted if root_visible.
- (e_tree_model_node_remove): Call e_table_model_row_deleted before
- removing the row from the row_array, because the chain of signal
- handlers will sometimes need that info.
-
-2000-07-08 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c (eti_event): Don't call e_cell_event if we're not
- editing.
-
-2000-07-08 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c (eti_table_model_changed): Commented out some
- unnecessary and buggy code.
-
-2000-07-06 Dan Winship <danw@helixcode.com>
-
- * e-tree-model.c (e_tree_model_node_remove): Make this work
- recursively.
-
-2000-07-06 Chris Toshok <toshok@helixcode.com>
-
- * e-cell-tree.c (ect_draw): fix the conditions under which we draw
- a horizontal line.
-
-2000-07-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Send GDK_BUTTON_RELEASE events to the ecell
- associated with the cell (if it's the cursor.)
-
-2000-07-03 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Added a reflow_compare callback and did removal
- if you do shift-click on a selected row that's not the cursor.
-
-2000-06-29 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-click-to-add.c: Made this appear a bit better.
-
- * e-table-defines.h: Cleaned this up a bit, added
- ETableForeachFunc.
-
- * e-table-group-container.c, e-table-group-leaf.c,
- e-table-group.c, e-table-group.h, e-table-item.c, e-table-item.h,
- e-table.c, e-table.h: Changed e_table_select_row to
- e_table_set_cursor_row. Changed e_table_get_selected_view_row to
- e_table_get_cursor_row. Added e_table_selected_row_foreach.
-
- * e-table-header-item.c: Fixed some warnings.
-
- * e-table-sorted-variable.c: Removed some unneeded debugging print
- statments.
-
- * e-tree-example-1.c: Changed e_table_get_selected_view_row to
- e_table_get_cursor_row.
-
-2000-06-27 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c: Added an unsort command.
-
- * e-table-item.c: leave_edit when you loose the cursor.
-
-2000-06-26 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added e-table-click-to-add.c,
- e-table-click-to-add.h, e-table-one.c, and e-table-one.h.
-
- * e-table-click-to-add.c, e-table-click-to-add.h: A new canvas
- item that represents a single row that sometimes exists. It's for
- adding new rows to your table.
-
- * e-table-example-1.c, e-table-example-2.c, e-table-size-test.c,
- test-check.c, test-cols.c, test-table.c: Added value_to_string handlers.
-
- * e-table-group-container.c: Use value_to_string to make grouping
- not crash for non string columns. Made some changes to work
- properly in an ECanvasVbox.
-
- * e-table-group-leaf.c, e-table-item.c: Made some changes to work
- properly in an ECanvasVbox.
-
- * e-table-model.c, e-table-model.h: Added append_row and
- value_to_string methods.
-
- * e-table-one.c, e-table-one.h: Given a source ETableModel, this
- provides a single row model that uses the initialize_value,
- duplicate_value, free_value, and value_is_empty methods of the
- original source to implement set_value and value_at (and proxies
- most of the other methods.) This is used for ETableClickToAdd.
-
- * e-table-simple.c, e-table-simple.h: Added append_row and
- value_to_string handlers. append_row uses a GtkArg instead of a
- parameter to e_table_simple_new.
-
- * e-table-subset.c: Added append_row and value_to_string handlers.
-
- * e-table.c, e-table.h: Use a vbox containing an ETableClickToAdd
- and an ETableItem instead of an ETableItem directly. Only show
- the ETableClickToAdd if the top level of the xml SPEC has the
- attribute click-to-add set to some non-zero integer.
- (click-to-add="1"). Add a "click_to_add_message" argument.
-
- * e-tree-model.c: Add a commented out value_to_string handler.
-
-2000-06-23 Larry Ewing <lewing@helixcode.com>
-
- * e-cell-toggle.c (etog_draw): draw pixmaps with he right
- background and selection colors.
-
-2000-06-23 Chris Toshok <toshok@helixcode.com>
-
- * e-tree-model.h, e-tree-model.c: add icon_at virtual function -
- it was stupid to make the insert call take 2 pixbufs. the model
- should give this information.
-
- * e-cell-tree.c: get rid of the opened/closed pixbuf stuff. call
- e_tree_model_icon_of_node.
-
- * e-tree-example-1.c: add my_icon_at.
-
- * e-tree-simple.c (simple_icon_at): new function
- (e_tree_simple_new): add icon_at parameter.
-
- * e-tree-simple.h: add SimpleIconAtFn.
-
-2000-06-23 Chris Toshok <toshok@helixcode.com>
-
- * e-tree-example-1.c (create_tree): use the expanded/unexpanded
- pixbufs as node pixbufs for the first level of children, to test
- the drawing.
-
- * e-tree-model.c (e_tree_model_node_get_closed_pixbuf): new function.
- (e_tree_model_node_get_opened_pixbuf): same.
- (e_tree_model_node_insert): add opened/closed pixbuf argument.
- (e_tree_model_node_insert_before): same.
-
- * e-tree-model.h: add prototypes for opened/closed pixbuf
- accessors, and add them to the e_tree_model_node_insert_* calls.
-
- * e-cell-tree.c (ect_draw): add opened/closed pixbuf drawing per node.
-
-2000-06-22 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Make the table not move around as you resize.
-
-2000-06-22 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Killed a warning.
-
-2000-06-22 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c: Remove use of the "x" and "y"
- arguments to EText.
-
- * e-table-item.c: Properly ref the source_model field.
-
- * test-check.c, test-cols.c, test-table.c: Remove use of the "x"
- and "y" arguments to ETableHeaderItem.
-
-2000-06-21 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-field-chooser-dialog.c: Made the Close button work.
-
- * e-table-field-chooser.glade, e-table-field-chooser.glade.h:
- Added a text description of this dialog.
-
-2000-06-21 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c: Changed this to move the cell to the
- nearest edge instead of to the left of the column it's over.
-
- * e-table-header.c: Made target_index equal to eti->col_count be a
- valid parameter to e_table_header_move.
-
-2000-06-21 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header.c: Made moving columns to the right work
- properly.
-
-2000-06-20 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-leaf.c: Fix a minor warning.
-
- * e-table-item.c: Add to the selection if shift is held down.
- Show cursor when changing sort (or if table changes majorly.)
-
-2000-06-20 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-defines.h: Fix HEADER_PADDING.
-
-2000-06-20 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Fix cursor column information.
-
-2000-06-20 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-leaf.c,
- e-table-group.c, e-table-group.h: Removed the unfocus method since
- that's handled by the canvas itself now.
-
- * e-table-item.c, e-table-item.h: Finished adapting ETableItem to
- use the canvas selection/cursor system. Selection and cursor now
- use row numbers associated with the source model instead of the
- sorted model (if the model they are given is an ETableSubset.)
- This has no effect on the interface, except that unfocus was
- removed and e_table_item_focus was renamed to
- e_table_item_set_cursor.
-
-2000-06-20 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c, e-table-item.h: Started adapting ETableItem to
- use the canvas selection/cursor system.
-
-2000-06-17 Chris Toshok <toshok@helixcode.com>
-
- * e-tree-model.c (e_tree_model_node_insert): call
- e_table_model_row_inserted instead of e_table_model_changed.
-
-2000-06-17 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Made cells with strikeout on have a line from the
- left margin to the right margin, instead of just over the text.
-
-2000-06-16 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c, e-table.h: Moved the reflow signal handling into an
- idle handler to fix a bug when resizing twice in succession.
-
-2000-06-15 Chris Toshok <toshok@helixcode.com>
-
- * e-cell-tree.c (ect_print): print the icon for the tree control.
-
-2000-06-14 Chris Toshok <toshok@helixcode.com>
-
- * e-tree-example-1.c (print_tree): new function, to generate
- postscript so i can test tree printing.
- (create_tree): add print button.
-
- * e-cell-tree.c (ect_print_height): implement function (in a
- broken way for the time being, heh).
- (ect_print): implement function to draw tree controls and offset
- the subcell's printing. icons aren't printed yet, just lines.
- (ect_draw): remove old unnecessary comments. only draw the
- horizontal line in specific instances (well, add a test so a lone
- root node doesn't get the horizontal line.)
- (e_cell_tree_class_init): add print/print_height methods.
-
-2000-06-14 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Request the value of e_table_is_cell_editable of
- the model_col instead of the view_col.
-
- * e-table-item.h: Slight style fixup.
-
-2000-06-13 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Clip the contained text.
-
- * e-table-group-container.c: Did a first pass at grouped
- printing. This works, but there's no fancy boxes or headers
- around the groups.
-
- * e-table-item.c: Added will_fit function and added quantize
- function to _height.
-
-2000-06-12 Federico Mena Quintero <federico@helixcode.com>
-
- * e-table-model.[ch]: Removed the freeze/thaw stuff for the model.
- As Chris wisely pointed out, having freeze/thaw on the model makes
- its state inconsistent from the perspective of the views.
-
- * e-table-sorted-variable.c: Do not check for a frozen model.
- * e-table-subset.c: Likewise.
- * e-table-subset-variable.c: Likewise.
-
- * e-table-example-1.c: Removed the ETableModel thaw handler.
- * e-table-example-2.c: Likewise.
- * e-table-simple.c: Likewise.
- * e-table-size-test.c: Likewise.
- * test-check.c: Likewise.
- * test-cols.c: Likewise.
- * test-table.c: Likewise.
-
-2000-06-08 Federico Mena Quintero <federico@helixcode.com>
-
- * e-table-model.h (ETableModelClass): Added a freeze method.
-
- * e-table-model.c (e_table_model_freeze): Call the freeze method
- instead of the thaw method!
-
- * e-table-simple.h (ETableSimple): Added the freeze function.
-
- * e-table-simple.c (simple_thaw): Check whether the function
- exists.
- (simple_freeze): New handler.
- (e_table_simple_new): Take in and set the freeze handler.
- (e_table_simple_class_init): Set the freeze handler.
-
- * test-check.c (check_test): Pass in the freeze handler to
- e_table_simple_new().
-
- * test-cols.c (multi_cols_test): Likewise.
-
- * e-table-example-2.c (create_table): Likewise.
-
- * e-table-example-1.c (create_table): Likewise.
-
- * test-table.c (table_browser_test): Likewise.
- (do_e_table_demo): Likewise.
-
-2000-06-10 Chris Toshok <toshok@helixcode.com>
-
- * e-tree-example-1.c (create_tree): supply the pixbufs here.
-
- * e-cell-tree.h: change pixbuf names to open_pixbuf/closed_pixbuf.
-
- * e-cell-tree.c (e_cell_tree_construct): take open/closed pixbuf
- parameters, and don't #include the .xpm files directly here.
- (e_cell_tree_new): same.
- (ect_draw): use the pixbufs from the ECellTree.
-
-2000-06-10 Chris Toshok <toshok@helixcode.com>
-
- * e-cell-tree.c (ect_event): offset events before passing them to
- our subcell view.
-
-2000-06-10 Chris Toshok <toshok@helixcode.com>
-
- * e-table-item.c (eti_event): change things so we focus the cell
- and select the row, and also dispatch the event to that row/cell.
- This fixes the problem with the tree where you had to click twice
- to activate the tree controls.
-
- * Makefile.am (libetable_a_SOURCES): remove e-tree-gnode.* and add
- e-tree-simple.*
- (icons): add tree-expanded.xpm and tree-unexpanded.xpm
-
- * e-cell-tree.c (ect_enter_edit): defer to subcell's view.
- (ect_leave_edit): defer to subcell's view.
- (visible_depth_of_node): visual depth, taking into account that
- the root node of the model might not be displayed.
- (offset_of_node): return the offset used to shift the subcell
- over.
- (ect_draw): don't draw vertical lines if we're the leftmode node
- (a visual root node). also, don't shift x2 by the subcell offset,
- so we get ellipses like we're supposed to.
- (ect_event): remove GDK_BUTTON_RELEASE from the list of events
- that we care about.
-
- * e-tree-example-1.c: lots of changes, a more dynamic UI so we can
- test tree model api stuff.
-
- * e-tree-gnode.c, e-tree-gnode.c: removed files, since their guts
- have been rolled into e-tree-model.c
-
- * e-tree-model.c, e-tree-model.h: substantially changed. too much
- to really describe here. this should really be considered the
- first revision of these files :)
-
- * e-tree-simple.c, e-tree-simple.h: analogous to e-table-simple, a
- subclass that allows the use of function pointers.
-
-2000-06-11 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-model.c: Small syntactic changes.
-
- * e-table.c: Moved the table header into the scrolled view.
-
-2000-06-11 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (table_test_LDADD): Link with libemiscwidgets.a.
- (table_size_test_LDADD): Likewise.
- (table_example_1_LDADD): Likewise.
- (table_example_2_LDADD): Likewise.
- (tree_example_1_LDADD): Likewise.
-
-2000-06-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-table.c (et_real_construct): EScrollFrame instead of
- GtkScrolledWindow.
-
-2000-06-10 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added $(GNOME_PRINT_LIBS) to all of the LDADDs.
-
- * e-cell-text.c: Added printing of text cells.
-
- * e-cell.c, e-cell.h: Added print and print_height methods.
-
- * e-table-field-chooser.glade: Added a minimum size.
-
- * e-table-group-container.c: Fixed a rectangle sizing bug.
-
- * e-table-group-leaf.c: Implemented get_printable.
-
- * e-table-group.c, e-table-group.h: Added a get_printable method
- to return an EPrintable.
-
- * e-table-item.c, e-table-item.h: Added a get_printable function
- to return an EPrintable.
-
- * e-table.c, e-table.h: Added a get_printable function to return
- an EPrintable.
-
-2000-06-08 Chris Toshok <toshok@helixcode.com>
-
- * e-tree-gnode.c, e-tree-gnode.h: New files. A tree model using a
- GNode structure to store it's info.
-
- * e-tree-model.c, e-tree-model.h: New files. A proxy model
- sitting between a table model and the real tree model (of which
- ETreeGNode is an example).
-
- * e-cell-tree.c, e-cell-tree.h: New files. A cell renderer
- capable of wrapping up a subcell and drawing the tree controls for
- expanding/collapsing trees.
-
- * tree-expanded.xpm, tree-unexpanded.xpm: New files. the standard
- + and - icons.
-
- * e-tree-example-1.c: New file, giving a (pretty poor :) example
- of using ETreeGNode.
-
- * Makefile.am: at the tree stuff to the build, and build
- tree-example-1.
-
- * .cvsignore: ignore tree-example-1.
-
-2000-06-08 Christopher James Lahey <clahey@helixcode.com>
-
- * The field chooser works now.
-
- * e-table-field-chooser-dialog.c: Make the dialog resizable.
-
- * e-table-field-chooser-item.c: Requested a reflow on
- realization. Made the correct column get dragged.
-
- * e-table-field-chooser.c: Set the height correctly.
-
- * e-table-field-chooser.glade: Replace the GnomeCanvas with an
- ECanvas.
-
- * e-table-header-item.c: Receive drags from the new dialog.
-
-2000-06-08 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-field-chooser-dialog.c, e-table-field-chooser-dialog.h,
- e-table-field-chooser-item.c, e-table-field-chooser.c,
- e-table-field-chooser.glade, e-table-field-chooser.h,
- e-table-header-item.c, e-table.c: More work on the Field Chooser.
- Not quite done yet.
-
-2000-06-07 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added e-table-field-chooser*.
-
- * e-table-defines.h: Moved some things to here.
-
- * e-table-field-chooser-dialog.c, e-table-field-chooser-dialog.h,
- e-table-field-chooser-item.c, e-table-field-chooser-item.h,
- e-table-field-chooser.c, e-table-field-chooser.glade,
- e-table-field-chooser.glade.h, e-table-field-chooser.h: New dialog
- to drag extra fields from. (Not yet finished.)
-
- * e-table-header-item.c, e-table-header-item.h: Changed to
- accommodate e-table-field-chooser.
-
-2000-06-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-leaf.c,
- e-table-group.c, e-table-group.h, e-table-item.c, e-table-item.h,
- e-table.c, e-table.h: Added a right click signal.
-
- * e-table-sorted-variable.c: Fixed a buffer overrun.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-sorted-variable.c: Fixed the multiple copies of rows in
- ETable bug.
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * e-table-group.c (e_table_group_key_press):
- * e-table.c (group_key_press): two more pastos
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Copy and paste error.
-
- * e-table-item.c: Mixed up parity on eti->editing.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-leaf.c,
- e-table-group.c, e-table-group.h, e-table-item.c, e-table-item.h,
- e-table.c, e-table.h: Added a "key_press" signal.
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * e-cell-text.h: Remove an offending *.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-sorted-variable.c: Made the sort when inserting a signal
- row be syncronous.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c, e-cell-text.h: Added "text_filter" argument that
- takes a const void * and returns an allocated char *.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Copy and paste error.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-leaf.c,
- e-table-group.c, e-table-group.h, e-table-item.c, e-table.c,
- e-table.h: Added e_table_get_selected_view_row.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c, e-cell-text.h: Added bold column's to ECellText.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Make sure that the cursor is always shown when
- the selection changes.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-container.h,
- e-table-group-leaf.c, e-table-group-leaf.h, e-table-group.c,
- e-table-group.h, e-table-item.c, e-table-item.h, e-table.c,
- e-table.h, test-check.c, test-cols.c, test-table.c: Fixed a bunch
- of selection bugs. Removed "spreadsheet" argument (for now.)
- Added "cursor_mode" argument. Added "cursor_change" signal.
- Temporarily removed "selection_mode" argument.
-
-2000-05-28 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c: Fixed setting of arguments.
-
-2000-05-28 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-leaf.c,
- e-table-group.c, e-table-group.h, e-table-item.c, e-table-item.h,
- e-table.c, e-table.h: Added double click handling.
-
-2000-05-26 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c, e-cell-text.h: Added "strikeout_column" argument.
-
-2000-05-26 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-container.h,
- e-table-group-leaf.c, e-table-group-leaf.h, e-table.c, e-table.h:
- Made "drawgrid", "drawfocus", "spreadsheet", and
- "length_threshold" arguments set from the ETable effect all the
- end ETableItems.
-
- * e-table-header.c: Made column resize a bit less bumpy.
-
-2000-05-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header.c: Account for extra pixel at right end of
- ETable.
-
- * e-table-item.c: Make grid less intrusive.
-
- * e-table.c: Make scrollbars disappear when appropriate.
-
-2000-05-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c: Made dragging columns work.
-
-2000-05-23 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c: Fixed the remove column callback.
-
-2000-05-23 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c: Added right click menus to the table
- header items.
-
- * e-table-sort-info.c: Fixed a small bug.
-
-2000-05-23 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Make scrollbar arrow buttons work.
-
-2000-05-19 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-example-1.c, e-table-example-2.c, e-table-simple.c,
- e-table-simple.h, e-table-size-test.c, test-check.c, test-cols.c,
- test-table.c: Added initialize_value and value_is_empty callbacks.
-
- * e-table-model.c, e-table-model.h: Added initialize_value and
- value_is_callback virtual functions to the ETableModel class.
-
- * e-table-subset.c: Perpetuate the initialize_value and
- value_is_empty methods.
-
-From a patch by Iain Holmes <ih@csd.abdn.ac.uk>
-
- * e-table-config.c, e-table.c: Fixed getting text content from a
- node in the case of a non string based content field in the xml
- library.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Fixed a memory leak.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-sorted-variable.c: Changed sorting to be at priority
- level 30.
-
- * e-table.c: Changed rebuild of the table to be at priority level
- 20. This gives it an advantage over pretty much everything,
- including e-table-sorted-variable sorting and canvas redraw.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c: Removed a memory leak here.
-
- * e-table-group-leaf.c: Added a ref/sink pair.
-
- * e-table-group.c, e-table-header-item.c: Removed some unused
- code.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-sorted-variable.c: Fixed a FIXME comment.
-
- * e-table-header.c, e-table-header.h: Added code to put off size
- calculation to the idle loop. Added code to not resize columns
- with 0 expansion. Removed the set_width function; it's been
- replaced with a Gtk+ arg.
-
- * Makefile.am: Added e-table-defines.h to the Makefile.am.
-
- * e-table-defines.h: A new file containing some #defines for use
- in ETable.
-
-2000-05-14 Christopher James Lahey <clahey@helixcode.com>
-
- * Implemented the feature where the ETable columns automatically
- fill the given space.
-
- * e-cell-text.c, e-cell-text.h: Moved #include
- e-text-event-processor.h from the .h to the .c.
-
- * e-table-col.c, e-table-col.h: Added an expansion variable, and
- made it so that width isn't set by the programmer but instead by
- the e-table-header.
-
- * e-table-example-1.c, e-table-example-2.c, e-table-size-test.c,
- test-check.c, test-cols.c, test-table.c: Fixed to handle new
- ETable column resizing.
-
- * e-table-group-container.c, e-table-group-container.h,
- e-table-group-leaf.c, e-table-group-leaf.h, e-table-group.c,
- e-table-group.h, e-table-item.c, e-table-item.h: Fixed these to do
- a proper canvas reflow/update loop. Changed them to take a
- minimum width and return a width and a height.
-
- * e-table-header-item.c, e-table-header-item.h: Made this so that
- it depends on e-table-header.c for deciding the actual size of
- columns during resize (it was making incorrect decisions on its
- own.)
-
- * e-table-header.c, e-table-header.h: Changed this to make sure
- that the sum of the widths of the columns was always as close as
- possible to the width of the window. This is done by taking a
- full width and having each of the columns have an "expansion"
- field. This field is what makes each column have approximately
- the same portion of its part of the screen that it used to.
-
- * e-table.c: Changed this to set the width on the ETableHeader as
- well as set the proper minimum width on the ETableGroup and get
- the width and height it reports.
-
-2000-05-11 Miguel de Icaza <miguel@gnu.org>
-
- * e-table.c: Removed dead code.
-
-2000-04-14 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-header-item.c (ethi_class_init): New signal action.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added e-table-col-dnd.h and table-test.h.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-subset-variable.c: Fixed etssv_remove.
-
-2000-05-08 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Make multi-line texts display properly. Fixed
- some mem leaks.
-
-2000-05-07 <toshok@the-dot-in.helixcode.com>
-
- * e-cell-text.c (ect_draw): free cell.starting_text here to avoid
- a memory leak.
-
-2000-05-07 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Add a horizontal scrollbar.
-
-2000-05-07 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c, e-table-item.h, e-table.c, e-table.h: Handle
- row_inserted and row_deleted signals properly.
-
- * e-table-model.c, e-table-model.h: Created the row_inserted and
- row_deleted signals.
-
- * e-table-sorted-variable.c, e-table-subset-variable.c: Emit the
- row_inserted and row_deleted signals as appropriate.
-
-2000-05-06 Chris Toshok <toshok@helixcode.com>
-
- * e-cell-text.c (ect_accept_edits): only to set_value_at if the
- value is indeed different.
- (ect_stop_editing): free edit->cell.starting_text
- (build_current_cell): initialize edit->cell.starting_text as a
- copy of the initial text.
-
-2000-05-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table.c: Killed some warnings.
-
-2000-05-04 Chris Toshok <toshok@helixcode.com>
-
- * e-table-sorted-variable.c (etsv_sort): use rows here instead of
- E_TABLE_SUBSET(etsv)->n_map, since the table can be populated by
- the gtk_main_iteration above. otherwise the vals_closure may not
- be fully populated.
-
-2000-05-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-leaf.c,
- e-table-group.c, e-table-group.h: Add an e_table_group_add_all
- function and implement it in the different ETableGroup classes.
-
- * e-table-sort-info.c: Make set_nth not call changed twice if it
- needs to allocate more space.
-
- * e-table-sorted-variable.c, e-table-subset-variable.c,
- e-table-subset-variable.h: Add and implement an
- e_table_subset_variable_add_all command.
-
- * e-table.c: Use e_table_group_add_all as appropriate. Fix ETable
- grouping xml to work if there is a text element at the bottom of
- the grouping tree.
-
-2000-05-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Sped up e_cell_text's get_height function.
-
-2000-05-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c, e-table-item.h: Added a height_cache idle loop
- so that the height_cache will be validated in the idle loop.
-
-2000-05-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-sorted-variable.c: Load all the data to be sorted by
- before actually doing the sort.
-
-2000-05-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c, e-cell-text.h: Fix author information.
-
- * e-table-group-leaf.c: Set a length threshold of 200.
-
- * e-table-item.c: Height cache is now actually a map. Made
- "length_threshold" argument work. If over the length threshold,
- use the height cache to get a better estimate so that once the
- height cache is full, height estimate is perfect.
-
-2000-05-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-sorted-variable.c (qsort_callback): Add back in main
- loop calls during sorting.
-
-2000-05-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-sorted-variable.c: Replace insert sort completely with a
- qsort.
-
-2000-05-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-sorted-variable.c: Changed the insert sort to be binary
- instead of linear.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: set G_LOG_DOMAIN.
-
-2000-04-30 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c: Made this more reentrant.
-
- * e-table-sorted-variable.c, e-table-sorted-variable.h: Does a
- proper resort when the sorting info changes.
-
- * e-table.c, e-table.h: Made it so that ETable doesn't destroy and
- recreate the entire table when sorting info changes.
-
-2000-04-27 Christopher James Lahey <clahey@helixcode.com>
-
- * arrow-down.xpm, arrow-up.xpm, e-cell-text.c, e-cell-toggle.c,
- e-table-col.c, e-table-config.c, e-table-header-item.c: Fixed some
- warnings.
-
-2000-04-26 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c: Added a missing include.
-
-2000-04-24 Miguel de Icaza <miguel@helixcode.com>
-
- * e-table.c (e_table_class_init): Add argument handling here.
-
- * e-table-group-leaf.c (e_table_group_apply_to_leafs): New method.
- Enables us to walk all the children of an ETableGroup.
-
- * e-table.c (et_get_arg, et_set_arg): Implement ::get and ::set
- methods.
- (e_table_construct_from_spec_file): Now we return the etable.
- (e_table_construct): ditto.
- (et_real_construct): Now we return the ETable. Returns NULL on
- construct failure.
- (e_table_new): ditto.
- (e_table_new_from_spec_file): ditto.
-
- * (et_build_grouping_spec): Removed vestige code that still
- contained references to the etable->specification XML code.
-
- Dumped all the ifdefed out code.
-
- * e-table.h: Removed ETable->specification finally.
-
-2000-04-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-size-test.c: Fixed a warning.
-
- * e-table-item.c: Removed the unnecessary gnome_canvas_update_bbox.
-
-2000-04-24 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Fixed some warnings.
-
-2000-04-23 Iain Holmes <ih@csd.abdn.ac.uk>
-
- * e-table-item.c (eti_bounds): Calculate the width of the table from the
- width of all the columns, and update the eti->width field as appropiate.
- (eti_update): Update the bbox.
-
-2000-04-17 Chris Toshok <toshok@helixcode.com>
-
- * Makefile.am (noinst_PROGRAMS): add table-size-test
-
- * .cvsignore: add table-size-test.
-
- * e-cell-text.c (ect_ecent): use e_table_model_is_cell_editable
- instead of E_CELL_EDITABLE.
-
- * e-cell-toggle.c (etog_event): same.
-
- * e-cell.c (e_cell_init): don't call e_cell_set_editable. that
- info comes from the model.
- (e_cell_set_editable): removed function.
-
- * e-cell.h: remove the E_CELL_EDITABLE flag. that should be
- retrieved from the model. also, remove the prototype for
- e_cell_set_editable.
-
- * e-table-size-test.c: new file, for a stress test of sorts, of a
- large, uneditable e-table.
-
-2000-04-16 Anders Carlsson <andersca@gnu.org>
-
- * e-table-item.c (eti_event): Propagate mouse wheel events upwards.
-
- * e-table.c (et_real_construct): Use a GtkScrolledWindow here
- instead of a GtkScrollbar, since it makes mouse wheel scrolling
- much easier.
-
-2000-04-15 Matt Loper <matt@helixcode.com>
-
- * e-table.c (et_xml_to_header): sanity-check our parameters.
- (et_grouping_xml_to_sort_info): same.
- (et_real_construct): Bail if we couldn't get the children we
- wanted.
-
-2000-04-14 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c, e-table-item.h: Added a row height cache.
-
-2000-04-15 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-table.c (e_table_construct): Use `strlen (copy)' instead of
- `strlen (copy) + 1' as the size argument for `xmlParseMemory()'.
-
-2000-04-14 Miguel de Icaza <miguel@gnu.org>
-
- * e-table.c, e-table.h: Switch the parent object to be a GtkTable.
- (et_real_construct): apply massaging and some loving action to
- make the thing behave as a GtkTable.
- (e_table_init): More love.
-
-2000-04-12 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-header-item.c (ethi_drag_motion): Remove test for
- source. We will fix this later.
-
- (ethi_end_resize): Reset resize_guide here.
-
-2000-04-11 Miguel de Icaza <miguel@helixcode.com>
-
- * e-table-header-item.c (ethi_add_destroy_marker): Add group
- indent width here.
- (is_pointer_on_division): Use the group indent here, so the
- resize pointer is shown at the correct time.
- (TOLERANCE): Bump it up to 3
- (draw_button): Do not paint an arrow if there is an icon present,
- and not enough space to paint.
-
-2000-04-10 Miguel de Icaza <miguel@helixcode.com>
-
- * e-table-header-item.c (make_shapped_window_from_xpm): New
- routine, creates a shapped mask window from an xpm buffer.
- (ethi_add_drop_marker): New version, uses shaped windows instead
- of canvas items to signal the drop location.
- (ethi_maybe_start_drag): Disable dragging if there is only one
- column left.
-
-2000-04-10 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-header-item.c (ethi_drag_motion): Drop frozen count
- support from here.
- (ethi_start_drag): ditto.
-
- * e-table-header.h: Kill frozen_count.
-
-2000-04-09 Matt Loper <matt@helixcode.com>
-
- * e-table-col.c (e_table_col_new_with_pixbuf): ref etc->ecell,
- like in e_table_col_new, since that same ECell is unref'd in
- etc_destroy().
-
-2000-04-08 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Separated some functions into an xml bit and a
- generic bit.
-
-2000-04-06 Christopher James Lahey <clahey@helixcode.com>
-
- * test-cols.c, test-table.c: Got rid of some warnings.
-
- * e-table-group-container.c, e-table-group-container.h,
- e-table-group-leaf.c, e-table-group-leaf.h, e-table-group.c,
- e-table-group.h, e-table-header-item.c, e-table-header-item.h,
- e-table-sort-info.c, e-table-sort-info.h,
- e-table-sorted-variable.c, e-table-sorted-variable.h, e-table.c,
- e-table.h: Changed ETableSortInfo to not use xml internally.
-
-2000-04-06 Miguel de Icaza <miguel@gnu.org>
-
- * e-cell-text.c: Killed ARG_EDITABLE.
- (ect_event): Updated to new editable setup.
- (e_cell_text_new): Kill editable argument.
-
- * e-cell-toggle.c (etog_event): Handle editability here
-
- * e-cell-text.h: Removed editable bit field from here, it is now
- taken care at the e-cell level.
-
- * e-cell.c (e_cell_set_editable): New function.
- (e_cell_init): Set editable to TRUE by default.
-
- * test-check.c (check_test): update to new api
-
- * test-table.c (table_browser_test): ditto.
- (do_e_table_demo): ditto.
-
- * test-cols.c (multi_cols_test): ditto
-
-2000-04-02 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-sort-info.c (e_table_sort_info_class_init): Kill
- argument. Do not use XML internally
- (e_table_sort_info_set_sorting): New function, use this to set the
- sorting.
- (e_table_sort_info_set_grouping): This one to do the grouping/.
-
-2000-04-01 Miguel de Icaza <miguel@gnu.org>
-
- * e-table.c (e_table_build_column_spec): Drop frozen support.
- (e_table_make_header): Drop frozen support.
-
- * e-table-header.c (e_table_header_new): Drop frozen support.
-
- * e-table-header-item.c (ethi_drag_motion): Drop frozen support.
- (ethi_drag_drop): Drop frozen support.
- (ethi_start_drag): Drop frozen support.
-
- * e-table.c (e_table_construct_from_spec_file): Robustify: support
- the case in which the XML could not be parsed; Propagate errors.
- (e_table_new): Handle failure.
- (e_table_new_from_spec_file): ditto.
- Renamed multiple internal functions whose prefix was et_ to be e_table_
-
-2000-03-31 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-simple.h: Constify this.
-
-2000-04-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-text-model.c: Make this assert a bit more readable.
-
- * e-table-item.c: Fix update loop behavior.
-
-2000-03-30 Miguel de Icaza <miguel@gnu.org>
-
- * Makefile.am (EXTRA_DIST): Added Glade files to the
- distribution.
-
-2000-03-28 Matt Loper <matt@helixcode.com>
-
- * e-table-text-model.c (e_table_text_model_destroy): made
- assertion more accurate.
-
-2000-03-27 Michael Meeks <michael@helixcode.com>
-
- * e-table-item.c (eti_update): try and fix the convoluted logic.
- (eti_bounds): Implement; should fix the re-draw bugs.
-
- * e-table-group-container.c: kill many redundant prototypes,
- stylistic cleans.
-
-2000-03-26 Matias Mutchinick <matias@seul.org>
-
- * e-cell-toggle.c (etog_draw): Removed extra code that computed
- bogus width. This was the actual source of the problem with the
- miss-rendering feature.
-
-2000-03-26 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-header-item.c (ethi_realize): Remove warning from here.
-
- * test-table.c (table_browser_test): Use ECanvas, not GnomeCanvas,
- to support reflow.
- * test-cols.c (multi_cols_test): ditto
- * e-table.c (e_table_setup_header): ditto
-
- * e-table-header-item.c (ethi_font_load): Replace font.
- (ethi_realize): ditto.
-
-2000-03-22 Matt Loper <matt@helixcode.com>
-
- * e-table-text-model.c (e_table_text_model_destroy): Added some
- assertions.
-
-2000-03-21 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Make rectangles resize properly when receiving the
- "model_changed" signal.
-
-2000-03-20 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c, e-table-group-container.h,
- e-table-group-leaf.c, e-table-group.c, e-table-group.h: Updated
- these to use the new ECanvas reflow infrastructure.
-
- * e-table-item.c, e-table-item.h: Updated these to use the new
- ECanvas reflow infrastructure. Fixed the bounding box.
-
- * e-table.c, e-table.h: Made the header have no extra space around it.
-
-2000-03-19 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header.c: Fixed a crashing bug when you close an
- ETable.
-
-2000-03-13 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Fixed a crashing bug when you cancel an edit.
-
-2000-03-12 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Made this use an ECanvas. Fixed a bug where
- e_table_new_from_spec_file was calling e_table_construct instead
- of e_table_construct_from_spec_file.
-
- * e-table-item.c, e-table-header-item.c, e-table-column-item.c:
- Switched these to use GTK_TYPE_OBJECT and GTK_VALUE_OBJECT instead
- of GTK_TYPE_POINTER and GTK_TYPE_OBJECT.
-
- * e-cell-text.c: Got rid of a crashing bug.
-
- * e-table-text-model.c, e-table-text-model.h: A new object which
- is an e-text-model which uses an e-table-model for its data.
-
- * Makefile.am: Added e-table-text-model.c and
- e-table-text-model.h.
-
- * .cvsignore: Added table-example-1 and table-example-2.
-
-2000-03-08 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Changed the destroy function to disconnect from
- signals before unrefing the objects the sinnals are on. Changed
- the destroy function to match the objects and signal ids properly
- in its disconnect section.
-
- * e-table-item.c, e-table-item.h: Changed this to do follow the
- canvas rules better.
-
- * e-table-header-item.c, e-table-header-item.h: Made
- ETableHeaderItem connect to the "sort_info_changed" on its
- ETableSortInfo instead of just manually redrawing itself. Fixed
- the update function a bit to follow the canvas rules a bit better.
-
-2000-03-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Made rows get unselected when switching from one
- group to the next.
-
-2000-03-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-group-container.c: Use the style's font if lucidasans-10
- is not found.
-
-2000-03-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c, e-table-header-item.h: Made it so that
- columns would be properly indented.
-
-2000-03-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-sorted-variable.c: Have identical values get sorted by
- their actual row.
-
-2000-03-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Draw selected row.
-
-2000-03-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c, e-table.h: Add a "row_selection" signal.
-
- * test-table.c: Test the new "row_selection" signal.
-
- * e-table-group-container.c, e-table-group-leaf.c: Implement the
- "row_selection" property properly.
-
- * e-table-group.c, e-table-group.h: Add a "row_selection" signal.
-
-2000-03-05 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c, e-table.h: Added support for the sorting info. The
- Etable creates a sort_info object, and then connects to the
- signals to rearrange the rows when the sort_info changes. It also
- passes the info object to the ETableHeaderItem.
-
- * e-table-model.c: Fixed a typo where ETableModel was written as
- ETableModle.
-
- * e-table-header.c, e-table-header.h: Added some code for sorting
- here, but it's not used. I don't think we want this code, but I
- wanted to check it in at least once so that it's not lost.
-
- * e-table-header-item.c, e-table-header-item.h: Added a
- "sort_info" argument to ETableHeaderItem. Added display of
- current sort settings. Added support for clicking to change the
- sort settings.
-
- * e-table-col.h: E_TABLE_COL_ARROW_NONE is marked as being = 0
- since this is required in other places. (I think C defines this
- as being the case, but it's good to have the = 0 there so that
- it's obvious that it has to be first.)
-
- * TODO: Mark sorting as done.
-
- * e-table-sort-info.c, e-table-sort-info.h: New files for
- containing the xml grouping/sorting information and for sending
- signals on that information.
-
- * Makefile.am: Added e-table-sort-info.c and e-table-sort-info.h.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Added saving of frozen_columns count. Added a
- vertical scrollbar to ETable.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Push the proper visual and colormap for ETable to work.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * TODO: Touched this up a bit.
-
- * e-table-group.c, e-table-group-leaf.c: Check for NULL before
- calling gtk_object_unref or gtk_object_destroy.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Fixed a crash error.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Fixed a compile warning.
-
- * e-table.c: Fixed a crash error.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * TODO: Added a bunch of stuff to the TODO list. Put +s before a
- few of the items that are finished.
-
- * test-table.c: Add a button to save the spec file.
-
- * e-table.c, e-table.h: Add loading configurations from files as
- well as the ability to get the current configuration out of the
- widget.
-
-2000-03-03 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table.c: Removed some unused code.
-
- * e-table-header-item.c, e-table-header-item.h: Removed the unused
- normal_cursor variable and object.
-
- * e-table-col.c: Maintain a reference count in the contained ECell.
-
-2000-03-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am: Use `libeutil.la', not `libeutil.a'.
-
-2000-02-29 Christopher James Lahey <clahey@helixcode.com>
-
- * test-table.c: Test frozen columns
-
- * e-table.c: Make frozen columns available through the xml file.
-
- * e-table-header.c, e-table-header.h, e-table-header-item.c: Added
- frozen columns API to let you specify some number of leading
- columns as undraggable.
-
- * Makefile.am: Add e-table-example-1.c and e-table-example-2.c.
-
- * e-table-example-1.c, e-table-example-2.c: New files. A couple
- of examples of ETable use.
-
-2000-02-28 NotZed <NotZed@HelixCode.com>
-
- * Makefile.am (table_test_LDADD): Fixed references to eutil.
-
-2000-02-28 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.c, e-table-header.c: Fixed a couple of crash
- bugs.
-
-2000-02-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Made the E table item redraw properly.
-
- * e-table-group-container.c: Added handling to distinguish between
- n items and 1 item. Got rid of a crash due to an abandoned timeout
- callback.
-
-2000-02-24 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Made carriage return stop editting instead of
- inserting a carriage return.
-
-2000-02-24 Christopher James Lahey <clahey@helixcode.com>
-
- * test-table.c: Added duplicate_value and add_value. Use the new
- compare functions. Made it so we only create one model to better
- test model view stuff. Changed the test to not have as many
- extra, useless, columns.
-
- * test-cols.c, test-check.c: Added duplicate_value and add_value.
- Use the new compare functions.
-
- * e-table.c, e-table.h: Use all the new features of e-table-groups
- (sorting and grouping). Handle on the fly reorganization of
- groups in an idle loop. Compare functions now are to return -1 if
- the first item is greater, 0 if they are equal, or 1 if the second
- item is greater.
-
- * e-table-subset.c, e-table-subset.h: Made e-table-subset
- disconnect properly from its signals when it dies.
-
- * e-table-subset-variable.c, e-table-subset-variable.h:
- Virtualized the add and remove commands so that
- e_table_sorted_variable could override the add command to do
- sorting.
-
- * e-table-sorted.c: Fixed this to inherit properly from
- ETableSubset.
-
- * e-table-simple.h, e-table-simple.c: Added handling of
- duplicate_value and free_value;
-
- * e-table-model.c, e-table-model.h: Added duplicate_value and
- free_value for memory allocation of table elements outside the
- table.
-
- * e-table-item.c: Fixed a crashing bug.
-
- * e-table-group.c: Added sorting. Fixed destruction to delete the
- right things.
-
- * e-table-group-leaf.c, e-table-group-leaf.h: Pass column and sort
- order information into the e_table_sorted_variable. Properly
- destroy things when deleted.
-
- * e-table-group-container.c, e-table-group-container.h: Properly
- handle the list of subgroups. Handle proper sorting and grouping
- of subgroups.
-
- * e-table-sorted-variable.c, e-table-sorted-variable.h: Files to
- do a sorted model that stays sorted as you add and remove rows.
-
- * Makefile.am: Added e-table-sorted-variable.c and
- e-table-sorted-variable.h.
-
-2000-02-24 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Made keyboard focus navigation work across
- groups.
-
- * e-table-header.c: Made e_table_header_col_diff not crash if you
- give it a column less than 0 (it truncates negative column values
- to 0.)
-
- * e-table-group.c, e-table-group.h: Added e_table_group_get_header
- to get the ETableHeader for this ETableGroup.
-
- * e-table-group-container.c: Made shift tab work.
-
-2000-02-24 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c: Made changing focus work.
-
-2000-02-24 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-subset-variable.c, e-table-subset-variable.h: A new
- model which is a subset, but you can add and remove rows.
-
- * test-table.c: Added a thaw method for use with the
- e-table-subset (emits model_changed.) Adapted to the changes to
- e_table_item. Properly parse headers. Adapted to the changes to
- e_table, including creating example xml spec data.
-
- * test-cols.c, test-check.c: Added a thaw method for use with the
- e-table-subset (emits model_changed.) Adapted to the changes to
- e_table_item.
-
- * e-table.c, e-table.h: Reworked e-table to use the ETable
- grouping system. The only difference for the interface is that
- instead of passing in a column_spec and a grouping_spec, you pass
- in a single string that is an xml format that includes both pieces
- of information.
-
- * e-table-subset.h: Added rules for emacs to do correct
- indentation.
-
- * e-table-subset.c: Implemented freezing. No signals are emitted
- while frozen and "model_changed" is emitted when thawed.
-
- * e-table-sorted.h: ETableSortedClass has ETableSubset as its
- parent object instead of ETableSubsetClass. Fixed this.
-
- * e-table-simple.c, e-table-simple.h: Implemented the thaw method.
- Use of simple now requires an extra argument (the thaw method.)
-
- * e-table-model.h, e-table-model.c: Added e_table_model_freeze and
- e_table_model_thaw.
-
- * e-table-item.h, e-table-item.c: Reworked this a bit to make it
- provide some things the new group system needed and to make
- inter-item keyboard focus work. Changed the external interface
- only in the list of arguments it recognizes and signals it emits.
- Instead of "x" and "y", you have to use
- e_canvas_item_move_absolute and instead of emitting a
- "height_changed" signal, it emits a "resize" signal. There's new
- "has_focus", "width", and "height" arguments and a function to get
- the currently focused column.
-
- * e-table-header-item.c: Got rid of some warnings here. Changed
- the
-
- * e-table-group-leaf.h, e-table-group-leaf.c,
- e-table-group-container.h, e-table-group-container.c: New types to
- make e_table_group work properly.
-
- * e-table-group.h, e-table-group.c: Completely reworked e-table
- grouping. e-table-group now uses a hierarchical structure.
-
- * e-cell.h: Added e_cell_print. This doesn't work yet.
-
- * e-cell.c: Made e_cell_realize exist. (It was improperly named
- e_cell_view_realize in the .c.)
-
- * e-cell-text.c: Made the blinking cursor disappear properly.
-
- * check-filled.xpm, check-empty.xpm: Made these const char *[]
- instead of char *[] to avoid compiler warnings.
-
- * Makefile.am: Added e-table-group-container.c,
- e-table-group-container.h, e-table-group-leaf.c,
- e-table-group-leaf.h, e-table-subset-variable.c,
- e-table-subset-variable.h.
-
-2000-02-18 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * e-table-header.c: Include <string.h>
-
- * Makefile.am (INCLUDES): Add EXTRA_GNOME_CFLAGS to INCLUDES>
-
-2000-02-12 Iain Holmes <ih@csd.abdn.ac.uk>
-
- * e-table-header-item.c (ethi_drag_motion): Check the ethi is actually
- the one being dragged. Prevents crashes when trying to drag headeritems
- and there are multiple headeritems on the same canvas.
- (ethi_drag_end): Same.
- (ethi_drag_drop): Same.
- (ethi_drag_leave): Same.
-
-2000-02-11 Christopher James Lahey <clahey@helixcode.com>
-
- * test-check.c: Added test of sort arrows.
-
- * e-table-col.h, e-table-col.c: Added sort arrows for column
- headers (It doesn't actually sort. It just displays the arrows.)
-
- * e-table-header-item.c: Added display of arrows.
-
-2000-02-11 Christopher James Lahey <clahey@helixcode.com>
-
- * clip.png: Test column header image.
-
- * test-check.c: Test pixbuf column headers.
-
- * e-table-col.h, e-table-col.c: Added pixbufs for column headers.
-
- * e-table-header-item.c (draw_button): Draw pixbuf column headers properly.
-
-2000-02-11 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.h, e-cell-text.c: Add an editable argument to
- e_cell_text_new.
-
- * test-table.c, test-cols.c, test-check.c: Set the editable
- argument to e_cell_text_new.
-
-2000-02-11 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-header-item.h, e-table-header-item.c: Added reordering
- of columns.
-
- * e-table-header.c: Fixed a couple of bugs in the move column and
- remove column functions.
-
-2000-02-11 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Made space around text look right. Added a
- blinking cursor.
-
-2000-02-11 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-item.c (eti_header_structure_changed): Add nice
- assertion.
-
-2000-02-10 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Handle button releases properly.
-
- * e-table-header-item.c (ethi_start_drag): Added a drag icon.
-
-2000-02-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-cell-text.c: Tweaked e-cell-text. Added a white background
- and tweaked the borders.
-
-2000-02-09 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Changes where e-text is included from.
-
-2000-02-07 Christopher James Lahey <clahey@helixcode.com>
-
- * e-table-item.c (eti_event): Fixed some motion event
- bugs. (incorrect x and y.)
-
- * Makefile.am: Added includes for dependencies in
- evolution/widgets/libevolutionwidgets.a
-
- * e-cell-text.h, e-cell-text.c: Completely revamped using code
- from e-text.c and e-text.h.
-
-2000-02-07 Miguel de Icaza <miguel@gnu.org>
-
- * e-table.c (e_table_setup_table): Setup the scroll region of the
- table canvas on size allocation.
- (e_table_canvas_realize): Do not set the scrollregion here.
- (e_table_canvas_init): Move root initialization here.
-
-2000-01-30 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-simple.c (e_table_simple_new): Add data field back in.
-
-1999-12-30 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-item.c (eti_attach_cell_views): New routine, creates the
- cell views.
- (eti_detach_cell_views): Detaches the cell_views from the
- ETableItem.
- (eti_realize_cell_views, eti_unrealize_cell_views): Simplified to
- just do realize/unrealize notification.
- (eti_add_table_model): Only attach the cells when we have both the
- table model and the header model.
-
- * e-cell.h (ECellClass): Added two new methods: new_view and
- kill_view which drive the view process (instead of putting that on
- realize/unrealize).
-
- * e-cell.c: Adapt the code to use the new scheme for view
- instantiation.
-
- * e-cell-text.c, e-cell-toggle.c: Adapted to the new class
- changes.
-
-1999-12-22 Miguel de Icaza <miguel@helixcode.com>
-
- * e-table-item.c (e_table_item_focus): grab focus here with the
- canvas method.
-
-1999-12-20 Miguel de Icaza <miguel@helixcode.com>
-
- * e-table-group.c (etg_update): Change the dimensions only if the
- child changes its own.
-
- * e-table-item.c (eti_table_model_changed): Emit new signal on
- table height change.
- (eti_class_init): Register new "height_change" signal.
-
-1999-12-19 Damon Chaplin <damon@karuna.freeserve.co.uk>
-
- * Makefile.am (SUBDIRS): created SUBDIRS with meeting-time-sel.
-
- * meeting-time-sel/Makefile.am:
- * meeting-time-sel/.cvsignore:
- * meeting-time-sel/e-meeting-time-sel.h:
- * meeting-time-sel/e-meeting-time-sel.c:
- * meeting-time-sel/e-meeting-time-sel-item.h:
- * meeting-time-sel/e-meeting-time-sel-item.c:
- * meeting-time-sel/e-meeting-time-sel-list-item.h:
- * meeting-time-sel/e-meeting-time-sel-list-item.c:
- * meeting-time-sel/e-meeting-time-sel-mail.xpm:
- * meeting-time-sel/e-meeting-time-sel-no-mail.xpm:
- * meeting-time-sel/test-meeting-time-sel.c: new files implementing
- the meeting time selector.
-
-1999-12-12 Miguel de Icaza <miguel@helixcode.com>
-
- * e-table-item.c (eti_class_init): X and Y arguments are now
- doubles (to make it consistent with the rest of the canvas x, y
- arguments).
-
- * e-table.c (e_table_create_leaf): Use new argument values here
-
- * test-*.c: Update to new argument types for x and y
-
- * e-table-group.c: New implementation as a canvas item used to
- group childs.
-
- * e-table-item.c (eti_update): Make this play nicely with groups.
- (eti_draw): ditto.
- (eti_request_region_redraw): ditto.
- (eti_item_region_redraw): New function.
-
- * e-table-subset.c (etss_proxy_model_row_changed): Added model
- proxying.
-
- * e-cell.h: Drop ETableModel from the ECell;
- (realize): Now takes an ETableModel
-
- * e-cell-checkbox.c: Adapted to new class
- changes;
- * e-cell-toggle.c: ditto
-
- * e-table-subset.c (etss_row_count): Fix this guy.
-
-1999-12-11 Miguel de Icaza <miguel@helixcode.com>
-
- * e-table-item.c (eti_unrealize_cell_views): Null the cell views.
- (eti_header_structure_changed): Only unrealize/realize if we were
- realized before.
-
- * e-table-header.c (e_table_header_add_column): Allow -1 as an
- insert position
-
-1999-12-11 Miguel de Icaza <miguel@helixcode.com>
-
- * e-table.c: Massive fixage.
-
- * test-table.c: Updates to test the mega widget.
-
-1999-12-10 Miguel de Icaza <miguel@helixcode.com>
-
- * e-table.c: New file, implements the mega widget.
-
-1999-12-09 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-header.c (e_table_header_col_diff): fix this routine.
-
-1999-12-04 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-header-item.c (ethi_event): Started drag and drop
- support.
-
- * e-table-item.c (eti_table_model_changed): The columns are
- controled by the Header, not by the TableModel.
-
- * e-table-header-item.c (ethi_draw): Fixed redraw logic to support
- arbitrary header positioning.
-
- * e-cell.h: Revamped e-cell interface. We now provide the model
- column and the view column to all methods (so that the methods can
- talk to the view and to the model at the same time).
-
- * e-table-item.c: Update to new API
- * e-cell-test.c: Update to new API
-
-1999-12-03 Miguel de Icaza <miguel@gnu.org>
-
- * e-cell.c (e_cell_class_init): Provide emtpy methods for
- enter_edit, and leave_edit.
-
- * e-table-item.c: Killed draw cell.
- (eti_draw): Perform column mapping here.
- (e_table_item_leave_edit): ditto.
- (e_table_item_enter_edit): ditto.
- (eti_event): ditto.
-
-1999-12-02 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-header.c (e_table_header_index): fixed api.
-
-1999-12-01 Miguel de Icaza <miguel@gnu.org>
-
- * test-cols.c (multi_cols_test): Update to simplified API.
- * test-check.c (check_test): ditto
- * test-table.c (table_browser_test): ditto
-
- * e-table-simple.c (e_table_simple_class_init): Kill column_name method.
-
- * e-table-model.h: Kill column_name method.
-
- * e-table-col.c (e_table_col_new): Instead of using a column name,
- use a column index.
-
- * e-cell-text.c (ect_draw): Keep track of the originally allocated
- piece of code.
-
- * e-table-header-item.c (ethi_unrealize): Removed change cursor
- from here.
-
- * e-cell-text.c (ect_draw): Memory leak fix.
-
- * table-test.c (main): Enhance the demo to load sample.table
- automatically, to get memprof working.
-
- * e-table-header.c (eth_do_remove): Take an argument: do -remove.
-
- * e-table-header.c (e_table_header_add_column): Sink ETableCol to
- own the object.
-
- * e-table-col.h: Made ETableCol a GtkObject to make reference
- counting the lifecycle method for these objects.
-
- * e-table-col.c (e_table_col_destroy): New API call.
-
- * e-table-subset.c (e_table_subset_get_toplevel): New API call.
-
-1999-11-30 Miguel de Icaza <miguel@gnu.org>
-
- * e-cell-checkbox.c (e_cell_checkbox_new): This one derives from
- e-cell-toggle.
-
- * check-emtpy.xpm, check-filled.xpm: new files.
-
- * e-cell-toggle.c (etog_draw): Paint in white.
- If we have transparency enabled, do the nice alpha computation.
-
- * test-table.c, test-cols.c: new files; They implement the split
- tests.
-
-1999-11-29 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-col.c (e_table_col_new): Set etc->resizeable.
-
- * e-table-header-item.c (ethi_event): Handle non-resizeables
- columns; Add support for minimum width.
-
- * e-cell-toggle.c, e-cell-toggle.h: New file. Implement a
- multi-state image toggle cell object.
-
- * e-cell-text.c (ect_leave_edit): Handle the case of us calling
- leave edit manually.
- (ect_stop_editing): Leave manually editing here.
- (ect_draw): Add one pixel to the border for left and right;
- Handle off-screen cursor (must be improved).
- (ect_edit_select_all): New function.
- (ect_event): Select all text on editing start
-
- * e-table-item.c (eti_event): Map mouse events and dispatch them.
- (eti_event): Add spreadsheet mode for editing; Enter editing only
- with visual characters;
- Leave editing mode when a different row has been selected.
- (eti_get_height): Fix the computation for this; Fix logic for the
- length_threshold.
-
- (eti_draw): Add borders on all sides of the box;
- Only draw focus if the cell is not being edited.
-
-1999-11-28 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-item.c (eti_draw): Focus inside, not outside.
- (eti_realize): Enhance our focus gc.
-
- * e-cell-text.c (ect_enter_edit, ect_leave_edit): New methods;
- They implement editing.
-
- * e-cell.h: new methods: enter_edit, leave_edit
-
- * e-table-model.h (set_value_at): make val argument const.
-
- * e-table-simple.c (simple_set_value_at): Make value argument const;
-
- * e-table-item.c (eti_set_arg): Add new mode: draw_focus;
-
-1999-11-27 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-item.c (eti_event): beginning of the keyboard navigation.
-
- * e-table-model.c (e_table_model_row_changed): new function.
- (e_table_model_cell_changed): new function.
- (e_table_model_class_init): New signals.
-
- * e-table-item.c (eti_request_region_redraw): x2, y2 offsets were
- wrong.
- (eti_select): Repaint selected region.
- (eti_request_region_redraw): Fix range.
- (eti_draw): Correct offset computation here.
- (e_table_item_class_init): New method: row_selection, handles the
- selection.
-
- Now it implement GTK_SELECTION_SINGLE and GTK_SELECTION_MULTIPLE.
-
- Focusing and selection should be correct now.
-
-1999-11-26 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-item.c (eti_realize): Compute height using the ecell
- methods here.
- (eti_get_height): new method to compute dimensions.
-
- * e-cursors.c: use a different cursor.
-
- * e-table-model.h: kill height and row_height methods.
-
- * e-cell.c (ec_height): New method.
-
- * e-cell-text.c (ect_realize): Load the font from the canvas.
- (ect_draw): New color setup.
- Center in the row.
- (ect_height): Implement new method.
-
-1999-11-26 Michael Meeks <mmeeks@gnu.org>
-
- * ROADMAP.e-table: small spelling/typo fixes.
-
-1999-11-25 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-item.c (eti_event): Work on mouse-button event
- propagation to cells.
-
- * e-cell-text.c (ect_draw): Use CellViews now.
-
- * e-table-item.c (eti_realize_cell_views): New routine: Realizes
- the cell views
- (eti_unrealize_cell_views): New routine: unrealizes the cell views.
-
- * e-table-item.h: Move cell_views array here.
-
- * table-test.c (value_at): Fix return value.
- (main): use new invocation method.
-
- * e-table-header-item.c (ethi_realize): Realize cells.
-
- * e-table-item.c (eti_header_dim_changed): redraw before and after.
-
- * e-table-header-item.c (ethi_event): Add continuous resizing.
-
-1999-11-24 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-subset.h, e-table-subset.c: New files, used to implement
- subset tables.
-
- * e-table-sorted.h, e-table-sorted.c: Now they derive from
- e-table-subset.
-
- * e-cell.c, e-cell.h: realize method now return per view instance
- data.
-
-1999-11-20 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-item.c (eti_draw): WOOOOHOOOOOoO! It took me quite a
- while to figure this one out. Fixed.
-
- * e-table-header-item.c (ethi_set_arg): Compute width, keep track
- of it.
- (ethi_add_table_header): Monitor changes to the Header model;
- Queue updates.
- (ethi_draw): Fix the redraw logic here.
-
- * table-test.c (main): Change the sample code, so we can better
- debug this.
-
- * e-table-item.c (eti_header_structure_changed): Keep track of
- width;
- (eti_header_dim_changed): ditto.
- (eti_draw): Many redraw fixes.
-
-1999-11-19 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-item.c (eti_realize): Hook up; Load gcs.
- (eti_unrealize): Hook up.
-
- * e-table-sorted.c: Finished implementing.
-
-1999-11-18 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-model.c (e_table_model_class_init): Add model_changed
- signal here.
-
- * e-table-item.c, e-table-item.h: New files. They implement the
- view of the ETableModel as Canvas Items.
-
- * e-table-header-item.c (ethi_set_arg): Ref header here.
- (ethi_destroy): Unref it here.
-
-1999-11-17 Ettore Perazzoli <ettore@gnu.org>
-
- * e-msg-composer-address-dialog.c: Moved to `$(srcdir)/composer'.
- * e-msg-composer-address-dialog.h: Likewise.
- * e-msg-composer-address-entry.c: Likewise.
- * e-msg-composer-address-entry.h: Likewise.
- * e-msg-composer-attachment-bar.c: Likewise.
- * e-msg-composer-attachment-bar.h: Likewise.
- * e-msg-composer-attachment.c: Likewise.
- * e-msg-composer-attachment.h: Likewise.
- * e-msg-composer-hdrs.c: Likewise.
- * e-msg-composer-hdrs.h: Likewise.
- * e-msg-composer.c: Likewise.
- * e-msg-composer.h: Likewise.
- * e-msg-composer-address-dialog.glade: Likewise.
- * e-msg-composer-attachment.glade: Likewise.
- * e-msg-composer.glade: Likewise.
- * Makefile.am: Updated accordingly.
-
-Nov 14 1999 Elliot Lee
- * Makefile.am: It's libevolutionwidgets.la, not .a
-
-1999-11-14 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-header-item.c (is_pointer_on_division): Add resizing
- capabilities.
-
- * e-table-sorted.c: Finish implementation.
-
-1999-11-13 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-sorted.c: Implement e-table-sorted object.
-
-1999-11-12 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-header-item.c: Make the thing configurable.
-
- * e-table-header-item.h: Add font field, location, height.
-
-1999-11-12 Ettore Perazzoli <ettore@gnu.org>
-
- * e-msg-composer-hdrs.c: New member `tooltips' in `struct
- _EMsgComposerHdrsPrivate'.
- (init): Initialize it.
- (destroy): New function.
- (class_init): Install it as the `destroy' GtkObject method.
- (add_header): New parameters `tip', `tip_private'. Setup a
- tooltip for the entry with them.
- (setup_headers): Updated accordingly.
-
-1999-11-11 Miguel de Icaza <miguel@gnu.org>
-
- * e-table-header.c (e_table_header_add_column): Update offsets.
- (eth_update_offsets): New routine.
-
- * e-table-col.h, e-table-col.c: New files.
-
- * e-table-header.h (e_table_header_get_selected_indexes):
- Pretify.
-
- * table-test.c (main): New file; used for testing ETable package.
-
- * e-table-simple.h: Fix type.
-
-1999-11-12 Ettore Perazzoli <ettore@gnu.org>
-
- * e-msg-composer-address-dialog.glade: Cosmetical changes.
-
- * e-msg-composer-attachment-bar.c (size_to_string): New helper
- function.
- (update): Put the size in the icon's label using this function.
- (ICON_SEPARATORS): Remove '.' to avoid wrapping of the size string
- on the decimal dot. But gnome-libs is broken and this has no real
- effect! :-(
- (e_msg_composer_attachment_bar_new): No longer make text editable.
- Use the `GTK_SELECTION_MULTIPLE' selection mode.
- (remove_selected): No longer assume only one attachment is
- selected.
-
- * e-msg-composer-attachment.c: #include <sys/stat.h>
- (init): Initialize all the members.
- (e_msg_composer_attachment_new): Set size using `stat()'.
-
- * e-msg-composer-attachment.h: New member `size' in `struct
- _EMsgComposerAttachment'.
-
- * e-msg-composer.c (setup_signals): Connect `address_dialog_cb' to
- the "show_address_dialog" signal of the header widget.
-
- * e-msg-composer-hdrs.c (add_address_header): Renamed to
- `add_header'. New parameter `addrbook_button': if true, use a
- button instead of a label and make it trigger an
- "show_address_dialog" signal.
- (address_button_clicked_cb): Signal handler to handle this on a
- "clicked" signal from the button.
- (setup_headers): Updated accordingly. Also, make "Subject" the
- last item. (This makes it look more like Outlook and friends.)
-
- * e-msg-composer-hdrs.c: New signal "show_address_dialog".
- * e-msg-composer-hdrs.h: Updated accordingly.
-
- * e-msg-composer-hdrs.c (add_address_header): Reduce padding
- considerably.
-
- * e-msg-composer.c (e_msg_composer_construct): Do not use any
- padding in the main vbox.
-
- * Makefile.am: Moved the `e-table*' sources to `EXTRA_DIST'.
- Compile as a shared library.
-
-1999-11-08 Ettore Perazzoli <ettore@gnu.org>
-
- * e-msg-composer-address-dialog.c: Implemented cut & paste for the
- recipient lists.
- (init): Initialize `cut_buffer'.
- (destroy): Free it.
- (recipient_clist_selection_get_cb): New function.
- (recipient_clist_selection_received_cb): New function.
- (recipient_clist_selection_clear_event_cb): New function.
- (setup_recipient_list_signals): Install them as signal handlers
- for "selection_get", "selection_received" and
- "selection_clear_event" respectively.
- (copy_recipient_cb): New function implementing the "copy"
- operation.
- (cut_recipient_cb): New function implementing the "cut" operation.
- (paste_recipient_cb): New function implementing the "paste"
- operation.
-
- * e-msg-composer-address-dialog.h: New member `cut_buffer' in
- `struct _EMsgComposerAddressDialog'.
-
-1999-11-07 Ettore Perazzoli <ettore@gnu.org>
-
- * e-msg-composer-address-dialog.c: New context menu
- `recipient_list_popup_info' for the recipient CLists.
- (recipient_clist_button_press_cb): New function.
- (setup_signals): Install it as the "button_press_event" signal
- handler for popping up the CList context menu.
-
- * e-msg-composer.c (free_string_list): New helper function.
- (setup_address_dialog): Setup the initial values in the address
- dialog according to the ones in the header widget.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_get_to): New function.
- (e_msg_composer_hdrs_get_cc): New function.
- (e_msg_composer_hdrs_get_bcc): New function.
-
- * e-msg-composer.c (setup_address_dialog): New helper function.
- (address_dialog_cb): Use it.
-
- * e-msg-composer-address-dialog.c (add_address): Do not set the
- row data anymore. Instead, put the full address description
- (i.e. complete with the email address, not just the full name) in
- the CList.
- (add_address): Do nothing if no item is selected in the address
- CList.
- (get_list): Get the address list from the CList without passing
- through the address CList.
- (set_list): New helper function.
- (e_msg_composer_address_dialog_set_to_list): New function.
- (e_msg_composer_address_dialog_set_cc_list): New function.
- (e_msg_composer_address_dialog_set_bcc_list): New function.
-
- * e-msg-composer.c (address_dialog_apply_cb): Apply values from
- the address dialog into the composer.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_to): New function.
- (e_msg_composer_hdrs_set_cc): New function.
- (e_msg_composer_hdrs_set_bcc): New function.
-
- * e-msg-composer-address-entry.c
- (e_msg_composer_address_entry_set_list): New function.
-
- * e-msg-composer-address-dialog.c (apply): New helper function.
- (clicked): New function, `clicked' method for the `GnomeDialog'
- class.
- (class_init): Install it.
-
-1999-11-06 Ettore Perazzoli <ettore@gnu.org>
-
- * e-msg-composer-attachment-bar.c (destroy): Call the destroy
- method of the parent class.
-
- * e-msg-composer.c: #include "e-msg-composer-address-dialog.h".
- (address_dialog_cb): New callback to start the address dialog.
- (setup_signals): Connect it to the appropriate button/menu item.
- (init): Initialize the new `address_dialog' member to NULL.
- (destroy): Destroy the `address_dialog' if not NULL.
-
- * e-msg-composer.h: New member `address_dialog' in `struct
- _EMsgComposer'.
-
- * e-msg-composer.glade: Added button to activate the address
- composition dialog.
-
- * e-msg-composer-address-dialog.h, e-msg-composer-address-dialog.c:
- New files implementing the address composition dialog for Evolution.
-
- * e-msg-composer-address-dialog.glade: New file.
-
- * e-msg-composer-attachment.c: `signals' made static.
-
-1999-11-05 Ettore Perazzoli <ettore@gnu.org>
-
- * Makefile.am: Compile the new files in a `libevolutionwidgets'
- library.
- (CPPFLAGS): #define `E_GUIDIR'.
-
- * e-msg-composer.c, e-msg-composer.h: New files implementing an
- initial version of the Evolution message composer widget.
-
- * e-msg-composer-address-entry.c, e-msg-composer-address-entry.h:
- New files implementing a GtkEntry customized for entering email
- address lists.
-
- * e-msg-composer-attachment-bar.c, e-msg-composer-attachment-bar.h:
- New files implementing a widget for editing mail attachments.
-
- * e-msg-composer-attachment.c, e-msg-composer-attachment.h: New
- files implementing file attachment objects for the message
- composer.
-
- * e-msg-composer-hdrs.c, e-msg-composer-hdrs.h: New files
- implementing a widget for editing of email message headers.
-
- * e-msg-composer-attachment.glade: New file.
- * e-msg-composer.glade: New file.
-
-1999-10-31 Miguel de Icaza <miguel@gnu.org>
-
- * widgets/e-table-column.c, e-table-column.h: New file, implements the
- e-table-column object.
-
- * widget/e-table-model.h, e-table-model.c, e-table-simple.c,
- e-table-simple.h: New files. Implements the column model and
- a simple table wrapper.
-
diff --git a/widgets/e-table/LICENSE b/widgets/e-table/LICENSE
deleted file mode 100644
index b1f6ae08a4..0000000000
--- a/widgets/e-table/LICENSE
+++ /dev/null
@@ -1 +0,0 @@
-This code is released under the terms of the GNU GPL.
diff --git a/widgets/e-table/Makefile.am b/widgets/e-table/Makefile.am
deleted file mode 100644
index 30ee6f3d7d..0000000000
--- a/widgets/e-table/Makefile.am
+++ /dev/null
@@ -1,180 +0,0 @@
-
-gladedir = $(datadir)/evolution/glade
-glade_DATA = \
- e-table-config.glade \
- e-table-group.glade \
- e-table-field-chooser.glade
-
-glade_headers = \
- e-table-config.glade.h \
- e-table-group.glade.h \
- e-table-field-chooser.glade.h
-
-INCLUDES = \
- $(EXTRA_GNOME_CFLAGS) \
- $(GNOME_PRINT_CFLAGS) \
- $(GNOME_INCLUDEDIR) \
- -DETABLE_GLADEDIR=\"$(gladedir)\" \
- -I$(top_srcdir)/widgets/e-text \
- -I$(top_srcdir)/e-util \
- -I$(top_srcdir) \
- -DG_LOG_DOMAIN=\"e-table\"
-
-noinst_LIBRARIES = \
- libetable.a
-
-libetable_a_SOURCES = \
- e-cell.c \
- e-cell.h \
- e-cell-checkbox.c \
- e-cell-checkbox.h \
- e-cell-text.c \
- e-cell-text.h \
- e-cell-toggle.c \
- e-cell-toggle.h \
- e-cell-tree.c \
- e-cell-tree.h \
- e-table.c \
- e-table.h \
- e-table-click-to-add.c \
- e-table-click-to-add.h \
- e-table-col-dnd.h \
- e-table-col.c \
- e-table-col.h \
- e-table-config.c \
- e-table-config.h \
- e-table-defines.h \
- e-table-field-chooser-dialog.c \
- e-table-field-chooser-dialog.h \
- e-table-field-chooser-item.c \
- e-table-field-chooser-item.h \
- e-table-field-chooser.c \
- e-table-field-chooser.h \
- e-table-group.c \
- e-table-group.h \
- e-table-group-container.c \
- e-table-group-container.h \
- e-table-group-leaf.c \
- e-table-group-leaf.h \
- e-table-header.c \
- e-table-header.h \
- e-table-header-item.c \
- e-table-header-item.h \
- e-table-item.c \
- e-table-item.h \
- e-table-model.c \
- e-table-model.h \
- e-table-one.c \
- e-table-one.h \
- e-table-scrolled.c \
- e-table-scrolled.h \
- e-table-selection-model.c \
- e-table-selection-model.h \
- e-table-simple.c \
- e-table-simple.h \
- e-table-sort-info.c \
- e-table-sort-info.h \
- e-table-sorted.c \
- e-table-sorted.h \
- e-table-sorted-variable.c \
- e-table-sorted-variable.h \
- e-table-sorter.c \
- e-table-sorter.h \
- e-table-subset.c \
- e-table-subset.h \
- e-table-subset-variable.c \
- e-table-subset-variable.h \
- e-table-text-model.c \
- e-table-text-model.h \
- e-tree-model.c \
- e-tree-model.h \
- e-tree-simple.c \
- e-tree-simple.h
-
-noinst_PROGRAMS = \
- table-test table-example-1 table-example-2 table-size-test tree-example-1
-
-table_test_SOURCES = \
- test-table.c \
- test-check.c \
- test-cols.c \
- table-test.c \
- table-test.h
-
-table_test_LDADD = \
- libetable.a \
- $(EXTRA_GNOME_LIBS) \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(GNOME_PRINT_LIBS)
-
-table_test_LDFLAGS = `gnome-config --libs gdk_pixbuf`
-
-table_size_test_SOURCES = \
- e-table-size-test.c
-
-table_size_test_LDADD = \
- libetable.a \
- $(EXTRA_GNOME_LIBS) \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(GNOME_PRINT_LIBS)
-
-table_size_test_LDFLAGS = `gnome-config --libs gdk_pixbuf`
-
-table_example_1_SOURCES = \
- e-table-example-1.c
-
-table_example_1_LDADD = \
- libetable.a \
- $(EXTRA_GNOME_LIBS) \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(GNOME_PRINT_LIBS)
-
-table_example_1_LDFLAGS = `gnome-config --libs gdk_pixbuf`
-
-table_example_2_SOURCES = \
- e-table-example-2.c
-
-table_example_2_LDADD = \
- libetable.a \
- $(EXTRA_GNOME_LIBS) \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(GNOME_PRINT_LIBS)
-
-table_example_2_LDFLAGS = `gnome-config --libs gdk_pixbuf`
-
-tree_example_1_SOURCES = \
- e-tree-example-1.c
-
-tree_example_1_LDFLAGS = `gnome-config --libs gdk_pixbuf`
-
-tree_example_1_LDADD = \
- libetable.a \
- $(EXTRA_GNOME_LIBS) \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/e-util/libeutil.la \
- $(GNOME_PRINT_LIBS)
-
-icons = \
- arrow-down.xpm \
- arrow-up.xpm \
- add-col.xpm \
- check-empty.xpm \
- check-filled.xpm \
- remove-col.xpm \
- tree-expanded.xpm \
- tree-unexpanded.xpm
-
-EXTRA_DIST = \
- sample.table \
- $(icons) \
- $(glade_DATA) \
- $(glade_headers)
diff --git a/widgets/e-table/ROADMAP.e-table b/widgets/e-table/ROADMAP.e-table
deleted file mode 100644
index 4edacced86..0000000000
--- a/widgets/e-table/ROADMAP.e-table
+++ /dev/null
@@ -1,113 +0,0 @@
-
-The E-Table package implements an editable table that provides
-user-defined rendering, user-defined editing, sorting and grouping of
-the objects displayed.
-
-It is inspired by Java's Swing JTable object. There are models for
-the actual table contents and for the table headers; they are the
-actual repository of information.
-
-The objects are rendered by various view objects. In the current code
-base, we use we use GnomeCanvasItems to do the rendering. One for
-each table and one for the headers.
-
-* The main widget
-
-e-table.c, e-table.h:
-
- Implements a full widget. Uses various components described
- below. Handles column display as well as grouping/nesting
-
-* The Models
-
-All of them are GtkObjects.
-
-e-table-model.h, e-table-model.c:
-
- These implement the abstract E-Table-Model class. You
- can derive this object to create your own data repository.
-
- These emits signals to notify the views about selection, and
- changes in the model.
-
-e-table-simple.h, e-table-simple.c:
-
- A simple implementation of e-table-model that uses callback
- routines (you provide the callbacks). For lazy people, like
- me.
-
-e-cell.c, e-cell.h:
-
- These are actually mis-named. Objects of type e-cell know
- about rendering a single cell, and these are attached to the
- e-table-cols (described next).
-
- The user provides the various rendering modes as e-cells (they
- are actually column-rendering repositories).
-
- This is just an abstract class. I will provide various
- e-cells: a text cell, a checkbox cell, an image cell, and
- perhaps an n-state image cell (one that switches the image when
- the cell is clicked).
-
-e-table-col.h, e-table-col.c:
-
- Describes a single column (the size, the string displayed, the
- rendering function for each row and comparison function for
- this field).
-
-
-* The Views
-
-e-table-header.h, e-table-header.c:
-
- These implement the ETableHeaderItem canvas item. This item is
- used both to control the columns displayed as well as displaying them.
-
- They describe what columns are shown in the screen and in
- which order.
-
- These emit signals: column-size-changed and structure-changed
- (if a column is added/removed)
-
-e-table-item.c, e-table-item.h
-
- This is a canvas item that renders the contents of a
- ETableModel into the screen.
-
-e-table-header-item.c, e-table-header-item.h
-
- This canvas item renders the ETableHeader headings.
-
-e-cell-text.c, e-cell-text.h
-
- Not really a view, but actually a derivative of e-cell that
- implements text display: supports justification and font
- setting. Will add color in the future most likely
-
-e-cell-toggle.c, e-cell-toggle.h
-
- A derivative of e-cell as well that support N-toggle values
- using images.
-
-e-cell-check.c, e-cell-check.h
-
- An e-cell-toggle with two states only (for checkboxes).
-
-* The Filters
-
-e-table-sorted.c, e-table-sorted.h
-
- This is an ETableModel that can sort an existing ETableModel.
-
-e-table-subset.c, e-table-subset.h
-
- Not finished, but it is just an ETableModel that happens to be
- a subset of another ETableModel.
-
-* Everything
-
-e-table.c, e-table.h
-
- In the future these guys will implement the whole widget for
- doing table editing. Nothing done about these yet.
diff --git a/widgets/e-table/TODO b/widgets/e-table/TODO
deleted file mode 100644
index 40e214bc96..0000000000
--- a/widgets/e-table/TODO
+++ /dev/null
@@ -1,99 +0,0 @@
-Short Term TODO items:
-
-Bonobo Issues:
- 1. DnD does not seem to be working, it always defaults to "destroy column".
- 2. Cursor location is not propagated (no feedback).
-
-Functionality:
-
- 2. Implement GUI grouping.
- 3. Implement context menu on item-bars.
- 4. Implement config tool for the view.
- 5. Add multi-sorting.
-
-GUI:
- 1. Implement behaviours for "line-selection"
- 2. Implement good behaviour for editing.
- 3. Use the theme information for the captions.
- 4. Use the font from the widget style.
- 5. Fix the update problems when a group is resized.
-
-Implement e-cell-height
-Implement computation of heights from the e-cell-heights
-Make sure we compute the height from that
-Include spacing in columns and rows for the decoration lines
-Add threshold to compute a "global" size
-Implement the two methods for row finding: by full thing, or by a factor.
-
-
-+ Add editing
-mouse grabbing for scrolling
-
-
-1. Make sure that all values are updated on header changes and table
- model changes (they are slightly out of sync now)
-
-* Correctness
-
- * Make sure we can boot and shutdown with no memory leaks.
-
- * Run Insure on the thing.
-
-+ * Propagation
-
-+ * Row changes should be reflected in the subsets.
-
-
-
-* Add an ETable::get_specification method to get the current layout information.
-
- * Add input and output of column widths and minimum column widths.
-
-+ * Add GUI sort
-
- * Add depressed button state to ETableHeaderItem?
-
-* Add GUI grouping
-
- * Create ETableGroupItem class.
- * Make it work. (A large step)
-
-* Add a context menu
-
- * Define the menu
- * Create the menu object.
- * Hook up all the menu items.
-
-* Add a possible column list GUI
-
- * Create ETableColumnList class.
- * Hook it up to ETableHeader.
- * Figure out the correct semantics for the connection between the ETableHeader and the ETableColumnList.
- * Implement widget display.
- * Implement drag&drop.
-
-* Add closing and openning of groups
-
- * Add + button to group display.
- * Build in semantics for clicking on the button.
- * Make sub items hide & show.
- * Resize group.
- * Figure out how to save this data.
-
-* Data entry ("Click here to add...")
-
- * Add "Allocate" to the ETableModel
- * Implement ETableDataEntry (a subclass of ETableModel).
- * Build GUI for the data entry model. This should be fairly simple.
-
-* Usability
-
- * When the widget grows, the columns should resize to occupy all the
- available space
-
-* Draw little arrows for new column position instead of little triangles.
-* Make new column position be closest to position instead of rounding to the left.
-* Copy gtk_dnd as e_dnd.
-
-* Fix known bug about navigating out of the bottom of the table.
-
diff --git a/widgets/e-table/add-col.xpm b/widgets/e-table/add-col.xpm
deleted file mode 100644
index 9c5f314c8e..0000000000
--- a/widgets/e-table/add-col.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * add_col_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" .............. ",
-" .++++++++++++. ",
-" .++++++++++++. ",
-" ....+++....... ",
-" .+. ",
-" . ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" "};
diff --git a/widgets/e-table/arrow-down.xpm b/widgets/e-table/arrow-down.xpm
deleted file mode 100644
index f1e6cb4b3c..0000000000
--- a/widgets/e-table/arrow-down.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * arrow_down_xpm[] = {
-"13 16 2 1",
-" c None",
-". c #FF0000",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-".............",
-" ........... ",
-" ......... ",
-" ....... ",
-" ..... ",
-" ... ",
-" . "};
diff --git a/widgets/e-table/arrow-up.xpm b/widgets/e-table/arrow-up.xpm
deleted file mode 100644
index 0cc5b9a00c..0000000000
--- a/widgets/e-table/arrow-up.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * arrow_up_xpm[] = {
-"13 16 2 1",
-" c None",
-". c #FF0000",
-" . ",
-" ... ",
-" ..... ",
-" ....... ",
-" ......... ",
-" ........... ",
-".............",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... "};
diff --git a/widgets/e-table/check-empty.xpm b/widgets/e-table/check-empty.xpm
deleted file mode 100644
index 746b20234e..0000000000
--- a/widgets/e-table/check-empty.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * check_empty_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #000000",
-" ",
-" ",
-" ............ ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" ............ ",
-" ",
-" "};
diff --git a/widgets/e-table/check-filled.xpm b/widgets/e-table/check-filled.xpm
deleted file mode 100644
index c0468fc25b..0000000000
--- a/widgets/e-table/check-filled.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * check_filled_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #000000",
-" ",
-" ",
-" ............ ",
-" . . ",
-" . . . ",
-" . .. . ",
-" . ... . ",
-" . . ... . ",
-" . .. ... . ",
-" . ..... . ",
-" . ... . ",
-" . . . ",
-" . . ",
-" ............ ",
-" ",
-" "};
diff --git a/widgets/e-table/clip.png b/widgets/e-table/clip.png
deleted file mode 100644
index 27aa5f072f..0000000000
--- a/widgets/e-table/clip.png
+++ /dev/null
Binary files differ
diff --git a/widgets/e-table/e-cell-checkbox.c b/widgets/e-table/e-cell-checkbox.c
deleted file mode 100644
index 1d7c319f74..0000000000
--- a/widgets/e-table/e-cell-checkbox.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * e-cell-checkbox.c: Checkbox cell renderer
- *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- *
- * (C) 1999 Helix Code, Inc
- */
-#include <config.h>
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomeui/gnome-canvas.h>
-#include "e-cell-checkbox.h"
-#include "e-util/e-util.h"
-#include "e-table-item.h"
-
-#include "check-empty.xpm"
-#include "check-filled.xpm"
-
-#define PARENT_TYPE e_cell_toggle_get_type ()
-
-static GdkPixbuf *checks [2];
-
-static void
-e_cell_checkbox_class_init (GtkObjectClass *object_class)
-{
- checks [0] = gdk_pixbuf_new_from_xpm_data (check_empty_xpm);
- checks [1] = gdk_pixbuf_new_from_xpm_data (check_filled_xpm);
-}
-
-E_MAKE_TYPE(e_cell_checkbox, "ECellCheckbox", ECellCheckbox, e_cell_checkbox_class_init, NULL, PARENT_TYPE);
-
-ECell *
-e_cell_checkbox_new (void)
-{
- ECellCheckbox *eccb = gtk_type_new (e_cell_checkbox_get_type ());
-
- e_cell_toggle_construct (E_CELL_TOGGLE (eccb), 2, 2, checks);
-
- return (ECell *) eccb;
-}
diff --git a/widgets/e-table/e-cell-checkbox.h b/widgets/e-table/e-cell-checkbox.h
deleted file mode 100644
index 969e4a5edc..0000000000
--- a/widgets/e-table/e-cell-checkbox.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef _E_CELL_CHECKBOX_H_
-#define _E_CELL_CHECKBOX_H_
-
-#include "e-cell-toggle.h"
-
-#define E_CELL_CHECKBOX_TYPE (e_cell_checkbox_get_type ())
-#define E_CELL_CHECKBOX(o) (GTK_CHECK_CAST ((o), E_CELL_CHECKBOX_TYPE, ECellCheckbox))
-#define E_CELL_CHECKBOX_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_CHECKBOX_TYPE, ECellCheckboxClass))
-#define E_IS_CELL_CHECKBOX(o) (GTK_CHECK_TYPE ((o), E_CELL_CHECKBOX_TYPE))
-#define E_IS_CELL_CHECKBOX_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_CHECKBOX_TYPE))
-
-typedef struct {
- ECellToggle parent;
-} ECellCheckbox;
-
-typedef struct {
- ECellToggleClass parent_class;
-} ECellCheckboxClass;
-
-GtkType e_cell_checkbox_get_type (void);
-ECell *e_cell_checkbox_new (void);
-
-#endif /* _E_CELL_CHECKBOX_H_ */
-
diff --git a/widgets/e-table/e-cell-string.c b/widgets/e-table/e-cell-string.c
deleted file mode 100644
index 992b1bd10e..0000000000
--- a/widgets/e-table/e-cell-string.c
+++ /dev/null
@@ -1,9 +0,0 @@
-ECell *
-e_cell_string_new (void)
-{
- ECell *ecell;
-
- ecell = gtk_type_new (ecell);
-
- return ecell;
-}
diff --git a/widgets/e-table/e-cell-text.c b/widgets/e-table/e-cell-text.c
deleted file mode 100644
index 279ef4975b..0000000000
--- a/widgets/e-table/e-cell-text.c
+++ /dev/null
@@ -1,2314 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-cell-text.c - Text cell renderer
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Miguel de Icaza <miguel@helixcode.com>
- * Chris Lahey <clahey@helixcode.com>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- *
- * TODO:
- * Clean up UTF-8 handling
- * UTF-8 selection
- */
-
-#include <config.h>
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkinvisible.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <stdio.h>
-#include <unicode.h>
-#include "e-cell-text.h"
-#include "e-util/e-util.h"
-#include "e-util/e-font.h"
-#include "e-table-item.h"
-#include "e-text-event-processor.h"
-#include "e-text-event-processor-emacs-like.h"
-
-#include <gdk/gdkx.h> /* for BlackPixel */
-#include <ctype.h>
-#include <math.h>
-
-/* This defines a line of text */
-struct line {
- char *text; /* Line's text UTF-8, it is a pointer into the text->text string */
- int length; /* Line's length in BYTES */
- int width; /* Line's width in pixels */
- int ellipsis_length; /* Length before adding ellipsis in BYTES */
-};
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_TEXT, /* UTF-8 */
- ARG_X,
- ARG_Y,
- ARG_FONT,
- ARG_FONTSET,
- ARG_FONT_GDK,
- ARG_ANCHOR,
- ARG_JUSTIFICATION,
- ARG_CLIP_WIDTH,
- ARG_CLIP_HEIGHT,
- ARG_CLIP,
- ARG_X_OFFSET,
- ARG_Y_OFFSET,
- ARG_FILL_COLOR,
- ARG_FILL_COLOR_GDK,
- ARG_FILL_COLOR_RGBA,
- ARG_FILL_STIPPLE,
- ARG_TEXT_WIDTH,
- ARG_TEXT_HEIGHT,
- ARG_USE_ELLIPSIS,
- ARG_ELLIPSIS,
- ARG_STRIKEOUT_COLUMN,
- ARG_BOLD_COLUMN,
- ARG_TEXT_FILTER,
- ARG_COLOR_COLUMN,
-};
-
-
-enum {
- E_SELECTION_PRIMARY,
- E_SELECTION_CLIPBOARD
-};
-
-static GdkAtom clipboard_atom = GDK_NONE;
-
-#define PARENT_TYPE e_cell_get_type ()
-
-#define TEXT_PAD 4
-
-typedef struct {
- gpointer lines; /* Text split into lines (private field) */
- int num_lines; /* Number of lines of text */
- int max_width;
- int ref_count;
-} ECellTextLineBreaks;
-
-
-typedef struct _CellEdit CellEdit;
-
-typedef struct {
- ECellView cell_view;
- GdkGC *gc;
-#if 0
- GdkFont *font;
-#else
- EFont *font;
-#endif
- GdkCursor *i_cursor;
- GdkBitmap *stipple; /* Stipple for text */
-
- GnomeCanvas *canvas;
-
- /*
- * During editing.
- */
- CellEdit *edit;
-
-
- int xofs, yofs; /* This gets added to the x
- and y for the cell text. */
- double ellipsis_width; /* The width of the ellipsis. */
-
-} ECellTextView;
-
-typedef struct _CurrentCell{
- ECellTextView *text_view;
- int width;
- char *text;
- int model_col, view_col, row;
- ECellTextLineBreaks *breaks;
-} CurrentCell;
-
-#define CURRENT_CELL(x) ((CurrentCell *)(x))
-
-struct _CellEdit {
- CurrentCell cell;
-
- char *old_text;
-
- /*
- * Where the editing is taking place
- */
-
- int xofs_edit, yofs_edit; /* Offset because of editing.
- This is negative compared
- to the other offsets. */
-
- /* This needs to be reworked a bit once we get line wrapping. */
- int selection_start; /* Start of selection - IN BYTES */
- int selection_end; /* End of selection - IN BYTES */
- gboolean select_by_word; /* Current selection is by word */
-
- /* This section is for drag scrolling and blinking cursor. */
- /* Cursor handling. */
- gint timeout_id; /* Current timeout id for scrolling */
- GTimer *timer; /* Timer for blinking cursor and scrolling */
-
- gint lastx, lasty; /* Last x and y motion events */
- gint last_state; /* Last state */
- gulong scroll_start; /* Starting time for scroll (microseconds) */
-
- gint show_cursor; /* Is cursor currently shown */
- gboolean button_down; /* Is mouse button 1 down */
-
- ETextEventProcessor *tep; /* Text Event Processor */
-
- /* Hmmm... this should probably be in native encoding? */
-
- GtkWidget *invisible; /* For selection handling */
- gboolean has_selection; /* TRUE if we have the selection */
- gchar *primary_selection; /* Primary selection text */
- gint primary_length; /* Primary selection text length in BYTES */
- gchar *clipboard_selection; /* Clipboard selection text */
- gint clipboard_length; /* Clipboard selection text length in BYTES */
-
- guint pointer_in : 1;
- guint default_cursor_shown : 1;
-};
-
-static void e_cell_text_view_command (ETextEventProcessor *tep, ETextEventProcessorCommand *command, gpointer data);
-
-static void e_cell_text_view_get_selection (CellEdit *edit, GdkAtom selection, guint32 time);
-static void e_cell_text_view_supply_selection (CellEdit *edit, guint time, GdkAtom selection, char *data, gint length);
-
-static GtkWidget *e_cell_text_view_get_invisible (CellEdit *edit);
-static void _selection_clear_event (GtkInvisible *invisible,
- GdkEventSelection *event,
- CellEdit *edit);
-static void _selection_get (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint info,
- guint time_stamp,
- CellEdit *edit);
-static void _selection_received (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint time,
- CellEdit *edit);
-static int number_of_lines (char *text);
-static void split_into_lines (CurrentCell *cell);
-static void unref_lines (CurrentCell *cell);
-static void calc_line_widths (CurrentCell *cell);
-static int get_line_ypos (CurrentCell *cell, struct line *line);
-static int get_line_xpos (CurrentCell *cell, struct line *line);
-static void _get_tep (CellEdit *edit);
-
-static gint _get_position_from_xy (CurrentCell *cell, gint x, gint y);
-static void _get_xy_from_position (CurrentCell *cell, gint position, gint *xp, gint *yp);
-static gboolean _blink_scroll_timeout (gpointer data);
-
-static void build_current_cell (CurrentCell *cell, ECellTextView *text_view, int model_col, int view_col, int row);
-static void unbuild_current_cell (CurrentCell *cell);
-static void calc_ellipsis (ECellTextView *text_view);
-static void ect_free_color (gchar *color_spec, GdkColor *color, GdkColormap *colormap);
-static GdkColor* e_cell_text_get_color (ECellTextView *cell_view, gchar *color_spec);
-
-static ECellClass *parent_class;
-
-static void
-ect_queue_redraw (ECellTextView *text_view, int view_col, int view_row)
-{
- e_table_item_redraw_range (
- text_view->cell_view.e_table_item_view,
- view_col, view_row, view_col, view_row);
-}
-
-/*
- * Accept the currently edited text. if it's the same as what's in the cell, do nothing.
- */
-static void
-ect_accept_edits (ECellTextView *text_view)
-{
- CurrentCell *cell = (CurrentCell *) text_view->edit;
-
- if (strcmp (text_view->edit->old_text, cell->text)) {
- e_table_model_set_value_at (text_view->cell_view.e_table_model,
- cell->model_col, cell->row, cell->text);
- }
-}
-
-/*
- * Shuts down the editing process
- */
-static void
-ect_stop_editing (ECellTextView *text_view)
-{
- CellEdit *edit = text_view->edit;
- int row, view_col;
-
- if (!edit)
- return;
-
- row = edit->cell.row;
- view_col = edit->cell.view_col;
-
- g_free (edit->old_text);
- edit->old_text = NULL;
- g_free (edit->cell.text);
- edit->cell.text = NULL;
- if (edit->invisible)
- gtk_widget_unref (edit->invisible);
- if (edit->tep)
- gtk_object_unref (GTK_OBJECT(edit->tep));
- if (edit->primary_selection)
- g_free (edit->primary_selection);
- if (edit->clipboard_selection)
- g_free (edit->clipboard_selection);
- if (! edit->default_cursor_shown){
- gdk_window_set_cursor (GTK_WIDGET(text_view->canvas)->window, NULL);
- edit->default_cursor_shown = TRUE;
- }
- if (edit->timeout_id) {
- g_source_remove (edit->timeout_id);
- edit->timeout_id = 0;
- }
- if (edit->timer) {
- g_timer_stop (edit->timer);
- g_timer_destroy (edit->timer);
- edit->timer = NULL;
- }
-
- g_free (edit);
-
- text_view->edit = NULL;
- ect_queue_redraw (text_view, view_col, row);
-}
-
-/*
- * Cancels the edits
- */
-static void
-ect_cancel_edit (ECellTextView *text_view)
-{
- ect_stop_editing (text_view);
-}
-
-/*
- * ECell::new_view method
- */
-static ECellView *
-ect_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
- ECellText *ect = E_CELL_TEXT (ecell);
- ECellTextView *text_view = g_new0 (ECellTextView, 1);
- GnomeCanvas *canvas = GNOME_CANVAS_ITEM (e_table_item_view)->canvas;
-
- text_view->cell_view.ecell = ecell;
- text_view->cell_view.e_table_model = table_model;
- text_view->cell_view.e_table_item_view = e_table_item_view;
-
- if (ect->font_name){
-#if 0
- GdkFont *f;
-
- f = gdk_fontset_load (ect->font_name);
- text_view->font = f;
-#endif
- text_view->font = e_font_from_gdk_name (ect->font_name);
- }
- if (!text_view->font){
- text_view->font = e_font_from_gdk_font (GTK_WIDGET (canvas)->style->font);
- }
-
- text_view->canvas = canvas;
-
- text_view->xofs = 0.0;
- text_view->yofs = 0.0;
-
- return (ECellView *)text_view;
-}
-
-/*
- * ECell::kill_view method
- */
-static void
-ect_kill_view (ECellView *ecv)
-{
- ECellTextView *text_view = (ECellTextView *) ecv;
-
- g_free (text_view);
-}
-
-/*
- * ECell::realize method
- */
-static void
-ect_realize (ECellView *ecell_view)
-{
- ECellTextView *text_view = (ECellTextView *) ecell_view;
-
- text_view->gc = gdk_gc_new (GTK_WIDGET (text_view->canvas)->window);
-
- text_view->i_cursor = gdk_cursor_new (GDK_XTERM);
-
- calc_ellipsis (text_view);
-
- if (parent_class->realize)
- (* parent_class->realize) (ecell_view);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-ect_unrealize (ECellView *ecv)
-{
- ECellTextView *text_view = (ECellTextView *) ecv;
- ECellText *ect = (ECellText*) ecv->ecell;
- GdkColormap *colormap;
-
- gdk_gc_unref (text_view->gc);
- text_view->gc = NULL;
-
- if (text_view->edit){
- ect_cancel_edit (text_view);
- }
-
- if (text_view->font)
- e_font_unref (text_view->font);
-
- if (text_view->stipple)
- gdk_bitmap_unref (text_view->stipple);
-
- gdk_cursor_destroy (text_view->i_cursor);
-
- if (ect->colors) {
- colormap = gtk_widget_get_colormap (GTK_WIDGET (text_view->canvas));
- g_hash_table_foreach (ect->colors, (GHFunc) ect_free_color,
- colormap);
- g_hash_table_destroy (ect->colors);
- ect->colors = NULL;
- }
-
- if (parent_class->unrealize)
- (* parent_class->unrealize) (ecv);
-}
-
-static void
-ect_free_color (gchar *color_spec, GdkColor *color, GdkColormap *colormap)
-{
-
- g_free (color_spec);
-
- /* This frees the color. Note we don't free it if it is the special
- value. */
- if (color != (GdkColor*) 1) {
- gdk_colors_free (colormap, &color->pixel, 1, 0);
-
- /* This frees the memory for the GdkColor. */
- gdk_color_free (color);
- }
-}
-
-/*
- * ECell::draw method
- */
-static void
-ect_draw (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row, gboolean selected,
- int x1, int y1, int x2, int y2)
-{
- /* New ECellText */
- ECellText *ect = E_CELL_TEXT (ecell_view->ecell);
- ECellTextView *text_view = (ECellTextView *) ecell_view;
- GtkWidget *canvas = GTK_WIDGET (text_view->canvas);
- GdkRectangle rect, *clip_rect;
- struct line *lines;
- int i;
- int xpos, ypos;
- int start_char, end_char;
- int sel_start, sel_end;
- GdkRectangle sel_rect;
- GdkGC *fg_gc;
- EFont *font = text_view->font;
- const int height = e_font_height (text_view->font);
- CellEdit *edit = text_view->edit;
- gboolean edit_display = FALSE;
- ECellTextLineBreaks *linebreaks;
- GdkColor *foreground, *cell_foreground, *cursor_color;
- gchar *color_spec;
-
- EFontStyle style = E_FONT_PLAIN;
-
- if (ect->bold_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->bold_column, row))
- style = E_FONT_BOLD;
-
- if (edit){
- if ((edit->cell.view_col == view_col) && (edit->cell.row == row)) {
- edit_display = TRUE;
- fg_gc = canvas->style->fg_gc[edit->has_selection ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE];
- } else
- fg_gc = canvas->style->fg_gc[GTK_STATE_ACTIVE];
- } else {
- fg_gc = canvas->style->fg_gc[GTK_STATE_ACTIVE];
- }
-
- /*
- * Be a nice citizen: clip to the region we are supposed to draw on
- */
- rect.x = x1;
- rect.y = y1;
- rect.width = x2 - x1;
- rect.height = y2 - y1;
-
- gdk_gc_set_clip_rectangle (text_view->gc, &rect);
- gdk_gc_set_clip_rectangle (fg_gc, &rect);
- clip_rect = &rect;
-
- if (selected){
- foreground = &canvas->style->text [GTK_STATE_SELECTED];
- } else {
- foreground = &canvas->style->text [GTK_STATE_NORMAL];
- }
-
- cursor_color = foreground;
-
- if (ect->color_column != -1) {
- color_spec = e_table_model_value_at (ecell_view->e_table_model,
- ect->color_column, row);
- cell_foreground = e_cell_text_get_color (text_view,
- color_spec);
- if (cell_foreground)
- foreground = cell_foreground;
- }
-
- gdk_gc_set_foreground (text_view->gc, foreground);
-
- x1 += 4;
- y1 += 1;
- x2 -= 4;
- y2 -= 1;
-
- rect.x = x1;
- rect.y = y1;
- rect.width = x2 - x1;
- rect.height = y2 - y1;
-
- gdk_gc_set_clip_rectangle (text_view->gc, &rect);
- gdk_gc_set_clip_rectangle (fg_gc, &rect);
- clip_rect = &rect;
-
- if (edit_display){
- CellEdit *edit = text_view->edit;
- CurrentCell *cell = CURRENT_CELL(edit);
-
- cell->width = x2 - x1;
-
- split_into_lines (cell);
-
- linebreaks = cell->breaks;
-
- lines = linebreaks->lines;
- ypos = get_line_ypos (cell, lines);
- ypos += e_font_ascent (text_view->font);
- ypos -= edit->yofs_edit;
-
- for (i = 0; i < linebreaks->num_lines; i++) {
- xpos = get_line_xpos (cell, lines);
- xpos -= edit->xofs_edit;
-
- /* start_char, end_char, sel_start and sel_end are IN BYTES */
-
- start_char = lines->text - cell->text;
- end_char = start_char + lines->length;
-
- sel_start = edit->selection_start;
- sel_end = edit->selection_end;
-
- if (sel_start > sel_end){
- sel_start ^= sel_end;
- sel_end ^= sel_start;
- sel_start ^= sel_end;
- }
- if (sel_start < start_char)
- sel_start = start_char;
- if (sel_end > end_char)
- sel_end = end_char;
-
- if (sel_start < sel_end){
- sel_rect.x = xpos + x1 + e_font_utf8_text_width (font, style, lines->text, sel_start - start_char);
- sel_rect.y = ypos + y1 - e_font_ascent (font);
- sel_rect.width = e_font_utf8_text_width (font, style,
- lines->text + sel_start - start_char,
- sel_end - sel_start);
- sel_rect.height = height;
- gtk_paint_flat_box (canvas->style,
- drawable,
- edit->has_selection ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE,
- GTK_SHADOW_NONE,
- clip_rect,
- canvas,
- "text",
- sel_rect.x,
- sel_rect.y,
- sel_rect.width,
- sel_rect.height);
-
- e_font_draw_utf8_text (drawable, font, style, text_view->gc, xpos + x1, ypos + y1,
- lines->text,
- sel_start - start_char);
- e_font_draw_utf8_text (drawable, font, style, fg_gc,
- xpos + x1 + e_font_utf8_text_width (font, style, lines->text, sel_start - start_char),
- ypos + y1,
- lines->text + sel_start - start_char,
- sel_end - sel_start);
- e_font_draw_utf8_text (drawable, font, style, text_view->gc,
- xpos + x1 + e_font_utf8_text_width (font, style, lines->text, sel_end - start_char),
- ypos + y1,
- lines->text + sel_end - start_char,
- end_char - sel_end);
-#if 0 /* Do Bold in EFont directly */
- /* Draw 1,0 moved image, to simulate bold font */
- /* We move that to EFont */
- if (bold) {
- e_font_draw_utf8_text (drawable, font, text_view->gc, xpos + x1 + 1, ypos + y1,
- lines->text,
- sel_start - start_char);
- e_font_draw_utf8_text (drawable, font, fg_gc,
- xpos + x1 + 1 + e_font_utf8_text_width (font, lines->text, sel_start - start_char),
- ypos + y1,
- g_utf8_offset_to_pointer (lines->text, sel_start - start_char),
- sel_end - sel_start);
- e_font_draw_utf8_text (drawable, font, text_view->gc,
- xpos + x1 + 1 + e_font_utf8_text_width (font, lines->text, sel_end - start_char),
- ypos + y1,
- g_utf8_offset_to_pointer (lines->text, sel_end - start_char),
- end_char - sel_end);
- }
-#endif
- } else {
- e_font_draw_utf8_text (drawable, font, style, text_view->gc,
- xpos + x1, ypos + y1,
- lines->text,
- lines->length);
-#if 0
- if (bold) {
- e_font_draw_ucs2_text (drawable,
- font,
- text_view->gc,
- xpos + x1 + 1,
- ypos + y1,
- lines->text,
- lines->length);
- }
-#endif
- }
- if (edit->selection_start == edit->selection_end &&
- edit->selection_start >= start_char &&
- edit->selection_start <= end_char &&
- edit->show_cursor) {
- gdk_gc_set_foreground (text_view->gc, cursor_color);
- gdk_draw_rectangle (drawable,
- text_view->gc,
- TRUE,
- xpos + x1 + e_font_utf8_text_width (font, style, lines->text, sel_start - start_char),
- ypos + y1 - e_font_ascent (font),
- 1,
- height);
- }
- if (ect->strikeout_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->strikeout_column, row)) {
- gdk_draw_rectangle (drawable,
- text_view->gc,
- TRUE,
- x1, ypos + y1 - (e_font_ascent (font) / 2),
- x2 - x1,
- 1);
- }
- ypos += height;
- lines ++;
- }
- unref_lines (cell);
- } else {
-
- ECellTextLineBreaks *linebreaks;
- CurrentCell cell;
- build_current_cell (&cell, text_view, model_col, view_col, row);
-
- cell.width = x2 - x1;
-
- split_into_lines (&cell);
-
- linebreaks = cell.breaks;
- lines = linebreaks->lines;
- ypos = get_line_ypos (&cell, lines);
- ypos += e_font_ascent (text_view->font);
-
-
- for (i = 0; i < linebreaks->num_lines; i++) {
- xpos = get_line_xpos (&cell, lines);
- if (ect->use_ellipsis && lines->ellipsis_length < lines->length) {
- e_font_draw_utf8_text (drawable, font, style, text_view->gc,
- xpos + x1, ypos + y1,
- lines->text,
- lines->ellipsis_length);
- e_font_draw_utf8_text (drawable, font, style, text_view->gc,
- xpos + x1 + lines->width - text_view->ellipsis_width,
- ypos + y1,
- ect->ellipsis ? ect->ellipsis : "...",
- ect->ellipsis ? strlen (ect->ellipsis) : 3);
-#if 0
- if (bold) {
- e_font_draw_ucs2_text (drawable,
- font,
- text_view->gc,
- xpos + x1 + 1,
- ypos + y1,
- lines->text,
- lines->ellipsis_length);
- e_font_draw_utf8_text (drawable,
- font,
- text_view->gc,
- xpos + x1 + 1 +
- lines->width - text_view->ellipsis_width,
- ypos + y1,
- ect->ellipsis ? ect->ellipsis : "...",
- ect->ellipsis ? strlen (ect->ellipsis) : 3);
- }
-#endif
- } else {
- e_font_draw_utf8_text (drawable, font, style, text_view->gc,
- xpos + x1,
- ypos + y1,
- lines->text,
- lines->length);
-#if 0
- if (bold) {
- e_font_draw_ucs2_text (drawable,
- font,
- text_view->gc,
- xpos + x1 + 1,
- ypos + y1,
- lines->text,
- lines->length);
- }
-#endif
- }
- if (ect->strikeout_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->strikeout_column, row)) {
- gdk_draw_rectangle (drawable,
- text_view->gc,
- TRUE,
- x1, ypos + y1 - (e_font_ascent (font) / 2),
- x2 - x1,
- 1);
- }
- ypos += height;
- lines++;
- }
- unref_lines (&cell);
- unbuild_current_cell (&cell);
- }
-
- gdk_gc_set_clip_rectangle (text_view->gc, NULL);
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
-#if 0
- /* Old ECellText */
-
- int xoff;
- gboolean edit_display = FALSE;
-
- /*
- * Figure if this cell is being edited
- */
- if (edit_display){
- CellEdit *edit = text_view->edit;
- const char *text = gtk_entry_get_text (edit->entry);
- GdkWChar *p, *text_wc = g_new (GdkWChar, strlen (text) + 1);
- int text_wc_len = gdk_mbstowcs (text_wc, text, strlen (text));
- const int cursor_pos = GTK_EDITABLE (edit->entry)->current_pos;
- const int left_len = gdk_text_width_wc (text_view->font, text_wc, cursor_pos);
-
- text_wc [text_wc_len] = 0;
- /*
- * Paint
- */
- gdk_gc_set_foreground (text_view->gc, &w->style->base [GTK_STATE_NORMAL]);
- gdk_draw_rectangle (drawable, text_view->gc, TRUE,
- rect.x, rect.y, rect.width, rect.height);
- gdk_gc_set_foreground (text_view->gc, &w->style->text [GTK_STATE_NORMAL]);
-
- {
- GdkGC *gc = text_view->gc;
- const int y = y2 - font->descent - ((y2-y1-height)/2);
- int px, i;
-
- /*
- * Border
- */
- x1 += 2;
- x2--;
-
- px = x1;
-
- /*
- * If the cursor is outside the visible range
- *
- * FIXME: we really want a better behaviour.
- */
- if ((px + left_len) > x2)
- px -= left_len - (x2-x1);
-
- /*
- * Draw
- */
- for (i = 0, p = text_wc; *p; p++, i++){
- gdk_draw_text_wc (
- drawable, font, gc, px, y, p, 1);
-
- if (i == cursor_pos){
- gdk_draw_line (
- drawable, gc,
- px, y - font->ascent,
- px, y + font->descent - 1);
- }
-
- px += gdk_text_width_wc (font, p, 1);
- }
-
- if (i == cursor_pos){
- gdk_draw_line (
- drawable, gc,
- px, y - font->ascent,
- px, y + font->descent - 1);
- }
- }
- g_free (text_wc);
- } else {
- /*
- * Regular cell
- */
- GdkColor *background, *foreground;
- int width;
-
- /*
- * Border
- */
- x1++;
- x2--;
-
- /*
- * Compute draw mode
- */
- switch (ect->justify){
- case GTK_JUSTIFY_LEFT:
- xoff = 1;
- break;
-
- case GTK_JUSTIFY_RIGHT:
- width = 1 + gdk_text_width (font, str, strlen (str));
- xoff = (x2 - x1) - width;
- break;
-
- case GTK_JUSTIFY_CENTER:
- xoff = ((x2 - x1) - gdk_text_width (font, str, strlen (str))) / 2;
- break;
- default:
- xoff = 0;
- g_warning ("Can not handle GTK_JUSTIFY_FILL");
- break;
- }
-
-
- if (selected){
- background = &w->style->bg [GTK_STATE_SELECTED];
- foreground = &w->style->text [GTK_STATE_SELECTED];
- } else {
- background = &w->style->base [GTK_STATE_NORMAL];
- foreground = &w->style->text [GTK_STATE_NORMAL];
- }
-
- gdk_gc_set_foreground (text_view->gc, background);
- gdk_draw_rectangle (drawable, text_view->gc, TRUE,
- rect.x, rect.y, rect.width, rect.height);
- gdk_gc_set_foreground (text_view->gc, foreground);
-
- gdk_draw_string (
- drawable, font, text_view->gc,
- x1 + xoff,
- y2 - font->descent - ((y2-y1-height)/2), str);
- }
-#endif
-}
-
-/*
- * Selects the entire string
- */
-static void
-ect_edit_select_all (ECellTextView *text_view)
-{
- g_assert (text_view->edit);
-
- text_view->edit->selection_start = 0;
- text_view->edit->selection_end = strlen (text_view->edit->cell.text);
-}
-
-/*
- * ECell::event method
- */
-static gint
-ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
-{
- ECellTextView *text_view = (ECellTextView *) ecell_view;
- ETextEventProcessorEvent e_tep_event;
- gboolean edit_display = FALSE;
- CellEdit *edit = text_view->edit;
- GtkWidget *canvas = GTK_WIDGET (text_view->canvas);
- gint return_val = 0;
-
- CurrentCell cell, *cellptr;
- build_current_cell (&cell, text_view, model_col, view_col, row);
-
-
- if (edit){
- if ((edit->cell.view_col == view_col) && (edit->cell.row == row)) {
- edit_display = TRUE;
- cellptr = CURRENT_CELL(edit);
- } else {
- cellptr = &cell;
- }
- } else {
- cellptr = &cell;
- }
-
- e_tep_event.type = event->type;
- switch (event->type) {
- case GDK_FOCUS_CHANGE:
- break;
- case GDK_KEY_PRESS: /* Fall Through */
- case GDK_KEY_RELEASE:
- if (event->key.keyval == GDK_Escape){
- ect_cancel_edit (text_view);
- return_val = TRUE;
- break;
- }
-
- if ((!edit_display) && e_table_model_is_cell_editable (ecell_view->e_table_model, model_col, row)) {
- e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
- ect_edit_select_all (text_view);
- edit = text_view->edit;
- cellptr = CURRENT_CELL(edit);
- edit_display = TRUE;
- }
- if (edit_display) {
- GdkEventKey key = event->key;
- if (key.keyval == GDK_KP_Enter || key.keyval == GDK_Return){
- e_table_item_leave_edit (text_view->cell_view.e_table_item_view);
- } else {
- e_tep_event.key.time = key.time;
- e_tep_event.key.state = key.state;
- e_tep_event.key.keyval = key.keyval;
- e_tep_event.key.length = key.length;
- e_tep_event.key.string = key.string;
- _get_tep (edit);
- return_val = e_text_event_processor_handle_event (edit->tep,
- &e_tep_event);
- break;
- }
- }
-
- else
- return 0;
- break;
- case GDK_BUTTON_PRESS: /* Fall Through */
- case GDK_BUTTON_RELEASE:
- event->button.x -= 4;
- event->button.y -= 1;
- if ((!edit_display)
- && e_table_model_is_cell_editable (ecell_view->e_table_model, model_col, row)
- && event->type == GDK_BUTTON_RELEASE
- && event->button.button == 1) {
- GdkEventButton button = event->button;
-
- e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
- edit = text_view->edit;
- cellptr = CURRENT_CELL(edit);
- edit_display = TRUE;
-
- e_tep_event.button.type = GDK_BUTTON_PRESS;
- e_tep_event.button.time = button.time;
- e_tep_event.button.state = button.state;
- e_tep_event.button.button = button.button;
- e_tep_event.button.position = _get_position_from_xy (cellptr, button.x, button.y);
- _get_tep (edit);
- return_val = e_text_event_processor_handle_event (edit->tep,
- &e_tep_event);
- if (event->button.button == 1) {
- if (event->type == GDK_BUTTON_PRESS)
- edit->button_down = TRUE;
- else
- edit->button_down = FALSE;
- }
- edit->lastx = button.x;
- edit->lasty = button.y;
- edit->last_state = button.state;
-
- e_tep_event.button.type = GDK_BUTTON_RELEASE;
- }
- if (edit_display) {
- GdkEventButton button = event->button;
- e_tep_event.button.time = button.time;
- e_tep_event.button.state = button.state;
- e_tep_event.button.button = button.button;
- e_tep_event.button.position = _get_position_from_xy (cellptr, button.x, button.y);
- _get_tep (edit);
- return_val = e_text_event_processor_handle_event (edit->tep,
- &e_tep_event);
- if (event->button.button == 1) {
- if (event->type == GDK_BUTTON_PRESS)
- edit->button_down = TRUE;
- else
- edit->button_down = FALSE;
- }
- edit->lastx = button.x;
- edit->lasty = button.y;
- edit->last_state = button.state;
- }
- break;
- case GDK_MOTION_NOTIFY:
- event->motion.x -= 4;
- event->motion.y -= 1;
- if (edit_display) {
- GdkEventMotion motion = event->motion;
- e_tep_event.motion.time = motion.time;
- e_tep_event.motion.state = motion.state;
- e_tep_event.motion.position = _get_position_from_xy (cellptr, motion.x, motion.y);
- _get_tep (edit);
- return_val = e_text_event_processor_handle_event (edit->tep,
- &e_tep_event);
- edit->lastx = motion.x;
- edit->lasty = motion.y;
- edit->last_state = motion.state;
- }
- break;
- case GDK_ENTER_NOTIFY:
-#if 0
- edit->pointer_in = TRUE;
-#endif
- if (edit_display) {
- if (edit->default_cursor_shown){
- gdk_window_set_cursor (canvas->window, text_view->i_cursor);
- edit->default_cursor_shown = FALSE;
- }
- }
- break;
- case GDK_LEAVE_NOTIFY:
-#if 0
- text_view->pointer_in = FALSE;
-#endif
- if (edit_display) {
- if (! edit->default_cursor_shown){
- gdk_window_set_cursor (canvas->window, NULL);
- edit->default_cursor_shown = TRUE;
- }
- }
- break;
- default:
- break;
- }
-
- unbuild_current_cell (&cell);
- if (return_val)
- return return_val;
-#if 0
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS(parent_class)->event (item, event);
-#endif
- else
- return 0;
-
-#if 0
- switch (event->type){
- case GDK_BUTTON_PRESS:
- /*
- * Adjust for the border we use
- */
- event->button.x++;
-
- printf ("Button pressed at %g %g\n", event->button.x, event->button.y);
- if (text_view->edit){
- printf ("FIXME: Should handle click here\n");
- } else
- e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
- break;
-
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Escape){
- ect_cancel_edit (text_view);
- return TRUE;
- }
-
- if (!text_view->edit){
- e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
- ect_edit_select_all (text_view);
- }
-
- gtk_widget_event (GTK_WIDGET (text_view->edit->entry), event);
- ect_queue_redraw (text_view, view_col, row);
- break;
-#endif
-}
-
-/*
- * ECell::height method
- */
-static int
-ect_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- ECellTextView *text_view = (ECellTextView *) ecell_view;
- EFont *font;
- ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
-
- font = text_view->font;
- if (ect->filter) {
- gchar *string;
- gint value;
-
- string = (*ect->filter)(e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- value = e_font_height (font) * number_of_lines(string) + TEXT_PAD;
-
- g_free(string);
-
- return value;
- } else {
- gchar * string;
- gint value;
-
- string = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
-
- value = e_font_height (font) * number_of_lines (string) + TEXT_PAD;
-
- return value;
- }
-}
-
-/*
- * ECellView::enter_edit method
- */
-static void *
-ect_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- ECellTextView *text_view = (ECellTextView *) ecell_view;
- CellEdit *edit;
- ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
-
- edit = g_new (CellEdit, 1);
- text_view->edit = edit;
-
- build_current_cell (CURRENT_CELL(edit), text_view, model_col, view_col, row);
-
- edit->xofs_edit = 0.0;
- edit->yofs_edit = 0.0;
-
- edit->selection_start = 0;
- edit->selection_end = 0;
- edit->select_by_word = FALSE;
-
- edit->timeout_id = g_timeout_add (10, _blink_scroll_timeout, text_view);
- edit->timer = g_timer_new ();
- g_timer_elapsed (edit->timer, &(edit->scroll_start));
- g_timer_start (edit->timer);
-
- edit->lastx = 0;
- edit->lasty = 0;
- edit->last_state = 0;
-
- edit->scroll_start = 0;
- edit->show_cursor = TRUE;
- edit->button_down = FALSE;
-
- edit->tep = NULL;
-
- edit->has_selection = FALSE;
-
- edit->invisible = NULL;
- edit->primary_selection = NULL;
- edit->primary_length = 0;
- edit->clipboard_selection = NULL;
- edit->clipboard_length = 0;
-
- edit->pointer_in = FALSE;
- edit->default_cursor_shown = TRUE;
-
- if (ect->filter) {
- edit->old_text = (*ect->filter)(e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- } else {
- edit->old_text = g_strdup (e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- }
- edit->cell.text = g_strdup (edit->old_text);
-
-#if 0
- if (edit->pointer_in){
- if (edit->default_cursor_shown){
- gdk_window_set_cursor (GTK_WIDGET(item->canvas)->window, text_view->i_cursor);
- edit->default_cursor_shown = FALSE;
- }
- }
-#endif
-
- ect_queue_redraw (text_view, view_col, row);
-
- return NULL;
-}
-
-/*
- * ECellView::leave_edit method
- */
-static void
-ect_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
- ECellTextView *text_view = (ECellTextView *) ecell_view;
- CellEdit *edit = text_view->edit;
-
- if (edit){
- ect_accept_edits (text_view);
- ect_stop_editing (text_view);
- /* FIXME: edit is freed in ect_stop_editing() so I've
- commented this out - Damon. */
- /*unbuild_current_cell (CURRENT_CELL(edit));*/
- } else {
- /*
- * We did invoke this leave edit internally
- */
- }
-}
-
-static void
-ect_print (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width, double height)
-{
- GnomeFont *font = gnome_font_new ("Helvetica", 12);
- char *string;
- ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
- if (ect->filter) {
- string = (*ect->filter)(e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- } else {
- string = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
- }
- gnome_print_gsave(context);
- if (gnome_print_moveto(context, 2, 2) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, width - 2, 2) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, width - 2, height - 2) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 2, height - 2) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 2, 2) == -1)
- /* FIXME */;
- if (gnome_print_clip(context) == -1)
- /* FIXME */;
- gnome_print_moveto(context, 2, (height - gnome_font_get_ascender(font) + gnome_font_get_descender(font)) / 2);
- gnome_print_setfont(context, font);
- gnome_print_show(context, string);
- gnome_print_grestore(context);
- if (ect->filter) {
- g_free(string);
- }
-}
-
-static gdouble
-ect_print_height (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width)
-{
- return 16;
-}
-
-/*
- * GtkObject::destroy method
- */
-static void
-ect_destroy (GtkObject *object)
-{
- ECellText *ect = E_CELL_TEXT (object);
-
- g_free (ect->font_name);
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-/* Set_arg handler for the text item */
-static void
-ect_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ECellText *text;
-
- text = E_CELL_TEXT (object);
-
- switch (arg_id) {
- case ARG_STRIKEOUT_COLUMN:
- text->strikeout_column = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_BOLD_COLUMN:
- text->bold_column = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_COLOR_COLUMN:
- text->color_column = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_TEXT_FILTER:
- text->filter = GTK_VALUE_POINTER (*arg);
- break;
- default:
- return;
- }
-}
-
-/* Get_arg handler for the text item */
-static void
-ect_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ECellText *text;
-
- text = E_CELL_TEXT (object);
-
- switch (arg_id) {
- case ARG_STRIKEOUT_COLUMN:
- GTK_VALUE_INT (*arg) = text->strikeout_column;
- break;
-
- case ARG_BOLD_COLUMN:
- GTK_VALUE_INT (*arg) = text->bold_column;
- break;
-
- case ARG_COLOR_COLUMN:
- GTK_VALUE_INT (*arg) = text->color_column;
- break;
-
- case ARG_TEXT_FILTER:
- GTK_VALUE_POINTER (*arg) = text->filter;
- break;
-
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_cell_text_class_init (GtkObjectClass *object_class)
-{
- ECellClass *ecc = (ECellClass *) object_class;
-
- object_class->destroy = ect_destroy;
-
- ecc->new_view = ect_new_view;
- ecc->kill_view = ect_kill_view;
- ecc->realize = ect_realize;
- ecc->unrealize = ect_unrealize;
- ecc->draw = ect_draw;
- ecc->event = ect_event;
- ecc->height = ect_height;
- ecc->enter_edit = ect_enter_edit;
- ecc->leave_edit = ect_leave_edit;
- ecc->print = ect_print;
- ecc->print_height = ect_print_height;
-
- object_class->get_arg = ect_get_arg;
- object_class->set_arg = ect_set_arg;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- gtk_object_add_arg_type ("ECellText::strikeout_column",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_STRIKEOUT_COLUMN);
- gtk_object_add_arg_type ("ECellText::bold_column",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_BOLD_COLUMN);
- gtk_object_add_arg_type ("ECellText::color_column",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_COLOR_COLUMN);
- gtk_object_add_arg_type ("ECellText::text_filter",
- GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_TEXT_FILTER);
-
- if (!clipboard_atom)
- clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
-}
-
-static void
-e_cell_text_init (ECellText *ect)
-{
- ect->strikeout_column = -1;
- ect->bold_column = -1;
- ect->color_column = -1;
-}
-
-E_MAKE_TYPE(e_cell_text, "ECellText", ECellText, e_cell_text_class_init, e_cell_text_init, PARENT_TYPE);
-
-ECell *
-e_cell_text_new (ETableModel *etm, const char *fontname, GtkJustification justify)
-{
- ECellText *ect = gtk_type_new (e_cell_text_get_type ());
-
- ect->ellipsis = NULL;
- ect->use_ellipsis = TRUE;
-
- ect->font_name = g_strdup (fontname);
- ect->justify = justify;
-
- return (ECell *) ect;
-}
-
-/* Calculates the x position of the specified line of text, based on the text's justification */
-static int
-get_line_xpos (CurrentCell *cell, struct line *line)
-{
- int x;
-
- ECellTextView *text_view = cell->text_view;
- ECellText *ect = E_CELL_TEXT (((ECellView *)cell->text_view)->ecell);
-
- x = text_view->xofs + ect->x;
-
- switch (ect->justify) {
- case GTK_JUSTIFY_RIGHT:
- x += cell->width - line->width;
- break;
-
- case GTK_JUSTIFY_CENTER:
- x += (cell->width - line->width) / 2;
- break;
-
- default:
- /* For GTK_JUSTIFY_LEFT, we don't have to do anything. We do not support
- * GTK_JUSTIFY_FILL, yet.
- */
- break;
- }
-
- return x;
-}
-
-/* Calculates the x position of the specified line of text, based on the text's justification */
-static int
-get_line_ypos (CurrentCell *cell, struct line *line)
-{
- int y;
-
- ECellTextView *text_view = cell->text_view;
- ECellText *ect = E_CELL_TEXT (((ECellView *)cell->text_view)->ecell);
- ECellTextLineBreaks *linebreaks = cell->breaks;
-
- struct line *lines = linebreaks->lines;
-
- EFont *font;
-
- font = text_view->font;
-
- y = text_view->yofs + ect->y;
- y += (line - lines) * e_font_height (font);
-
- return y;
-}
-
-/* fixme: Handle Font attributes */
-/* position is in BYTES */
-
-static void
-_get_xy_from_position (CurrentCell *cell, gint position, gint *xp, gint *yp)
-{
- if (xp || yp) {
- struct line *lines;
- int x, y;
- int j;
- ECellTextView *text_view = cell->text_view;
- ECellTextLineBreaks *linebreaks;
- EFont *font;
-
- font = text_view->font;
-
- split_into_lines (cell);
-
- linebreaks = cell->breaks;
- lines = linebreaks->lines;
-
- x = get_line_xpos (cell, lines);
- y = get_line_ypos (cell, lines);
- for (j = 0, lines = linebreaks->lines; j < linebreaks->num_lines; lines++, j++) {
- if (lines->text > cell->text + position)
- break;
- y += e_font_height (font);
- }
- lines --;
- y -= e_font_descent (font);
-
- x += e_font_utf8_text_width (font, E_FONT_PLAIN,
- lines->text,
- position - (lines->text - cell->text));
- if ((CellEdit *) cell == cell->text_view->edit){
- x -= ((CellEdit *)cell)->xofs_edit;
- y -= ((CellEdit *)cell)->yofs_edit;
- }
- if (xp)
- *xp = x;
- if (yp)
- *yp = y;
- unref_lines (cell);
- }
-}
-
-static gint
-_get_position_from_xy (CurrentCell *cell, gint x, gint y)
-{
- int i, j;
- int xpos, ypos;
- struct line *lines;
- int return_val;
- gchar *p;
-
- ECellTextView *text_view = cell->text_view;
- ECellTextLineBreaks *linebreaks;
- EFont *font;
-
- font = text_view->font;
-
- split_into_lines (cell);
-
- linebreaks = cell->breaks;
-
- lines = linebreaks->lines;
-
- if ((CellEdit *) cell == cell->text_view->edit){
- x += ((CellEdit *)cell)->xofs_edit;
- y += ((CellEdit *)cell)->yofs_edit;
- }
-
- ypos = get_line_ypos (cell, linebreaks->lines);
- j = 0;
- while (y > ypos) {
- ypos += e_font_height (font);
- j ++;
- }
- j--;
- if (j >= linebreaks->num_lines)
- j = linebreaks->num_lines - 1;
- if (j < 0)
- j = 0;
- i = 0;
-
- lines += j;
- xpos = get_line_xpos (cell, lines);
-
- for (p = lines->text; p < lines->text + lines->length; p = unicode_next_utf8 (p)) {
- gint charwidth;
-
- charwidth = e_font_utf8_char_width (font, E_FONT_PLAIN, p);
-
- xpos += charwidth / 2;
- if (xpos > x) {
- break;
- }
- xpos += (charwidth + 1) / 2;
- }
-
- return_val = p - cell->text;
-
- unref_lines (cell);
-
- return return_val;
-}
-
-#define SCROLL_WAIT_TIME 30000
-
-static gboolean
-_blink_scroll_timeout (gpointer data)
-{
- CurrentCell *cell = CURRENT_CELL(data);
- ECellTextView *text_view = (ECellTextView *) data;
- ECellText *ect = E_CELL_TEXT (((ECellView *)text_view)->ecell);
- CellEdit *edit = text_view->edit;
- ECellTextLineBreaks *linebreaks = cell->breaks;
-
- gulong current_time;
- gboolean scroll = FALSE;
- gboolean redraw = FALSE;
-
- g_timer_elapsed (edit->timer, &current_time);
-
- if (edit->scroll_start + SCROLL_WAIT_TIME > 1000000) {
- if (current_time > edit->scroll_start - (1000000 - SCROLL_WAIT_TIME) &&
- current_time < edit->scroll_start)
- scroll = TRUE;
- } else {
- if (current_time > edit->scroll_start + SCROLL_WAIT_TIME ||
- current_time < edit->scroll_start)
- scroll = TRUE;
- }
- if (scroll && edit->button_down) {
- /* FIXME: Copy this for y. */
- if (edit->lastx - ect->x > cell->width &&
- edit->xofs_edit < linebreaks->max_width - cell->width) {
- edit->xofs_edit += 4;
- if (edit->xofs_edit > linebreaks->max_width - cell->width + 1)
- edit->xofs_edit = linebreaks->max_width - cell->width + 1;
- redraw = TRUE;
- }
- if (edit->lastx - ect->x < 0 &&
- edit->xofs_edit > 0) {
- edit->xofs_edit -= 4;
- if (edit->xofs_edit < 0)
- edit->xofs_edit = 0;
- redraw = TRUE;
- }
- if (redraw) {
- ETextEventProcessorEvent e_tep_event;
- e_tep_event.type = GDK_MOTION_NOTIFY;
- e_tep_event.motion.state = edit->last_state;
- e_tep_event.motion.time = 0;
- e_tep_event.motion.position = _get_position_from_xy (cell, edit->lastx, edit->lasty);
- _get_tep (edit);
- e_text_event_processor_handle_event (edit->tep,
- &e_tep_event);
- edit->scroll_start = current_time;
- }
- }
-
- if (!((current_time / 500000) % 2)) {
- if (!edit->show_cursor)
- redraw = TRUE;
- edit->show_cursor = TRUE;
- } else {
- if (edit->show_cursor)
- redraw = TRUE;
- edit->show_cursor = FALSE;
- }
- if (redraw){
- ect_queue_redraw (text_view, edit->cell.view_col, edit->cell.row);
- }
- return TRUE;
-}
-
-static int
-_get_position (ECellTextView *text_view, ETextEventProcessorCommand *command)
-{
- int length;
- int x, y;
- CellEdit *edit = text_view->edit;
- CurrentCell *cell = CURRENT_CELL(edit);
- EFont *font;
- gchar *p;
- int unival;
-
- font = text_view->font;
-
- switch (command->position) {
-
- case E_TEP_VALUE:
- return command->value;
-
- case E_TEP_SELECTION:
- return edit->selection_end;
-
- case E_TEP_START_OF_BUFFER:
- return 0;
-
- /* fixme: this probably confuses TEP */
-
- case E_TEP_END_OF_BUFFER:
- return strlen (cell->text);
-
- case E_TEP_START_OF_LINE:
-
- if (edit->selection_end < 1) return 0;
-
- p = unicode_previous_utf8 (cell->text, cell->text + edit->selection_end);
-
- if (p == cell->text) return 0;
-
- p = unicode_previous_utf8 (cell->text, p);
-
- while (p && p > cell->text) {
- if (*p == '\n') return p - cell->text + 1;
- p = unicode_previous_utf8 (cell->text, p);
- }
-
- return 0;
-
- case E_TEP_END_OF_LINE:
-
- length = strlen (cell->text);
- if (edit->selection_end >= length) return length;
-
- p = unicode_next_utf8 (cell->text + edit->selection_end);
-
- while (*p) {
- if (*p == '\n') return p - cell->text;
- p = unicode_next_utf8 (p);
- }
-
- return p - cell->text;
-
- case E_TEP_FORWARD_CHARACTER:
-
- length = strlen (cell->text);
- if (edit->selection_end >= length) return length;
-
- p = unicode_next_utf8 (cell->text + edit->selection_end);
-
- return p - cell->text;
-
- case E_TEP_BACKWARD_CHARACTER:
-
- if (edit->selection_end < 1) return 0;
-
- p = unicode_previous_utf8 (cell->text, cell->text + edit->selection_end);
-
- if (p == NULL) return 0;
-
- return p - cell->text;
-
- case E_TEP_FORWARD_WORD:
-
- length = strlen (cell->text);
- if (edit->selection_end >= length) return length;
-
- p = unicode_next_utf8 (cell->text + edit->selection_end);
-
- while (*p) {
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) return p - cell->text;
- p = unicode_next_utf8 (p);
- }
-
- return p - cell->text;
-
- case E_TEP_BACKWARD_WORD:
-
- if (edit->selection_end < 1) return 0;
-
- p = unicode_previous_utf8 (cell->text, cell->text + edit->selection_end);
-
- if (p == cell->text) return 0;
-
- p = unicode_previous_utf8 (cell->text, p);
-
- while (p && p > cell->text) {
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) {
- return (unicode_next_utf8 (p) - cell->text);
- }
- p = unicode_previous_utf8 (cell->text, p);
- }
-
- return 0;
-
- case E_TEP_FORWARD_LINE:
- _get_xy_from_position (cell, edit->selection_end, &x, &y);
- y += e_font_height (font);
- return _get_position_from_xy (cell, x, y);
- case E_TEP_BACKWARD_LINE:
- _get_xy_from_position (cell, edit->selection_end, &x, &y);
- y -= e_font_height (font);
- return _get_position_from_xy (cell, x, y);
-
- case E_TEP_FORWARD_PARAGRAPH:
- case E_TEP_BACKWARD_PARAGRAPH:
-
- case E_TEP_FORWARD_PAGE:
- case E_TEP_BACKWARD_PAGE:
- return edit->selection_end;
- default:
- return edit->selection_end;
- }
- g_assert_not_reached ();
- return 0; /* Kill warning */
-}
-
-static void
-_delete_selection (ECellTextView *text_view)
-{
- CellEdit *edit = text_view->edit;
- CurrentCell *cell = CURRENT_CELL(edit);
- gint length;
- gchar *sp, *ep;
-
- if (edit->selection_end == edit->selection_start) return;
-
- if (edit->selection_end < edit->selection_start) {
- edit->selection_end ^= edit->selection_start;
- edit->selection_start ^= edit->selection_end;
- edit->selection_end ^= edit->selection_start;
- }
-
- sp = cell->text + edit->selection_start;
- ep = cell->text + edit->selection_end;
- length = strlen (ep) + 1;
-
- memmove (sp, ep, length);
-
- edit->selection_end = edit->selection_start;
-}
-
-/* fixme: */
-/* NB! We expect value to be length IN BYTES */
-
-static void
-_insert (ECellTextView *text_view, char *string, int value)
-{
- CellEdit *edit = text_view->edit;
- CurrentCell *cell = CURRENT_CELL(edit);
- char *temp;
-
- if (value <= 0) return;
-
- temp = g_new (gchar, strlen (cell->text) + value + 1);
-
- strncpy (temp, cell->text, edit->selection_start);
- strncpy (temp + edit->selection_start, string, value);
- strcpy (temp + edit->selection_start + value, cell->text + edit->selection_end);
-
- g_free (cell->text);
-
- cell->text = temp;
-
- edit->selection_start += value;
- edit->selection_end = edit->selection_start;
-}
-
-static void
-e_cell_text_view_command (ETextEventProcessor *tep, ETextEventProcessorCommand *command, gpointer data)
-{
- CellEdit *edit = (CellEdit *) data;
- CurrentCell *cell = CURRENT_CELL(edit);
- ECellTextView *text_view = cell->text_view;
-
- gboolean change = FALSE;
- gboolean redraw = FALSE;
-
- int sel_start, sel_end;
- EFont *font;
-
- font = text_view->font;
-
- switch (command->action) {
- case E_TEP_MOVE:
- edit->selection_start = _get_position (text_view, command);
- edit->selection_end = edit->selection_start;
- if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- redraw = TRUE;
- break;
- case E_TEP_SELECT:
- edit->selection_end = _get_position (text_view, command);
- sel_start = MIN(edit->selection_start, edit->selection_end);
- sel_end = MAX(edit->selection_start, edit->selection_end);
- if (sel_start != sel_end) {
- e_cell_text_view_supply_selection (edit, command->time, GDK_SELECTION_PRIMARY,
- cell->text + sel_start,
- sel_end - sel_start);
- } else if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- redraw = TRUE;
- break;
- case E_TEP_DELETE:
- if (edit->selection_end == edit->selection_start) {
- edit->selection_end = _get_position (text_view, command);
- }
- _delete_selection (text_view);
- if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- redraw = TRUE;
- change = TRUE;
- break;
-
- case E_TEP_INSERT:
- if (edit->selection_end != edit->selection_start) {
- _delete_selection (text_view);
- }
- _insert (text_view, command->string, command->value);
- if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- redraw = TRUE;
- change = TRUE;
- break;
- case E_TEP_COPY:
- sel_start = MIN(edit->selection_start, edit->selection_end);
- sel_end = MAX(edit->selection_start, edit->selection_end);
- if (sel_start != sel_end) {
- e_cell_text_view_supply_selection (edit, command->time, clipboard_atom,
- cell->text + sel_start,
- sel_end - sel_start);
- }
- if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- break;
- case E_TEP_PASTE:
- e_cell_text_view_get_selection (edit, clipboard_atom, command->time);
- if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- redraw = TRUE;
- change = TRUE;
- break;
- case E_TEP_GET_SELECTION:
- e_cell_text_view_get_selection (edit, GDK_SELECTION_PRIMARY, command->time);
- break;
- case E_TEP_ACTIVATE:
- e_table_item_leave_edit (text_view->cell_view.e_table_item_view);
- break;
- case E_TEP_SET_SELECT_BY_WORD:
- edit->select_by_word = command->value;
- break;
- case E_TEP_GRAB:
- case E_TEP_UNGRAB:
-#if 0
- case E_TEP_GRAB:
- gnome_canvas_item_grab (GNOME_CANVAS_ITEM(text),
- GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
- text_view->i_cursor,
- command->time);
- break;
- gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM(text), command->time);
- break;
-#endif
- case E_TEP_NOP:
- break;
- }
-
- if (!edit->button_down) {
- int x;
- int i;
- struct line *lines;
- ECellTextLineBreaks *linebreaks;
-
- split_into_lines (cell);
-
- linebreaks = cell->breaks;
-
- for (lines = linebreaks->lines, i = 0; i < linebreaks->num_lines ; i++, lines ++) {
- if ((lines->text - cell->text) > edit->selection_end) {
- break;
- }
- }
- lines --;
- x = e_font_utf8_text_width (font, E_FONT_PLAIN,
- lines->text,
- edit->selection_end - (lines->text - cell->text));
-
-
- if (x < edit->xofs_edit) {
- edit->xofs_edit = x;
- redraw = TRUE;
- }
-
- if (2 + x - cell->width > edit->xofs_edit) {
- edit->xofs_edit = 2 + x - cell->width;
- redraw = TRUE;
- }
- unref_lines (cell);
- }
-
- if (redraw){
- ect_queue_redraw (text_view, edit->cell.view_col, edit->cell.row);
- }
-#if 0
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
-#endif
-}
-
-static void _invisible_destroy (GtkInvisible *invisible,
- CellEdit *edit)
-{
- edit->invisible = NULL;
-}
-
-static GtkWidget *e_cell_text_view_get_invisible (CellEdit *edit)
-{
- GtkWidget *invisible;
- if (edit->invisible) {
- invisible = edit->invisible;
- } else {
- invisible = gtk_invisible_new ();
- edit->invisible = invisible;
-
- gtk_selection_add_target (invisible,
- GDK_SELECTION_PRIMARY,
- GDK_SELECTION_TYPE_STRING,
- E_SELECTION_PRIMARY);
- gtk_selection_add_target (invisible,
- clipboard_atom,
- GDK_SELECTION_TYPE_STRING,
- E_SELECTION_CLIPBOARD);
-
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_get",
- GTK_SIGNAL_FUNC (_selection_get),
- edit);
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_clear_event",
- GTK_SIGNAL_FUNC (_selection_clear_event),
- edit);
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_received",
- GTK_SIGNAL_FUNC (_selection_received),
- edit);
-
- gtk_signal_connect (GTK_OBJECT(invisible), "destroy",
- GTK_SIGNAL_FUNC (_invisible_destroy),
- edit);
- }
- return invisible;
-}
-
-static void
-_selection_clear_event (GtkInvisible *invisible,
- GdkEventSelection *event,
- CellEdit *edit)
-{
- if (event->selection == GDK_SELECTION_PRIMARY) {
- g_free (edit->primary_selection);
- edit->primary_selection = NULL;
- edit->primary_length = 0;
-
- edit->has_selection = FALSE;
-#if 0
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
-#endif
-
- } else if (event->selection == clipboard_atom) {
- g_free (edit->clipboard_selection);
- edit->clipboard_selection = NULL;
- edit->clipboard_length = 0;
- }
-}
-
-static void
-_selection_get (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint info,
- guint time_stamp,
- CellEdit *edit)
-{
- switch (info) {
- case E_SELECTION_PRIMARY:
- gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
- 8, edit->primary_selection, edit->primary_length);
- break;
- case E_SELECTION_CLIPBOARD:
- gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
- 8, edit->clipboard_selection, edit->clipboard_length);
- break;
- }
-}
-
-/* fixme: What happens, if delivered string is not UTF-8? */
-
-static void
-_selection_received (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint time,
- CellEdit *edit)
-{
- if (selection_data->length < 0 || selection_data->type != GDK_SELECTION_TYPE_STRING) {
- return;
- } else {
- ETextEventProcessorCommand command;
- command.action = E_TEP_INSERT;
- command.position = E_TEP_SELECTION;
- command.string = selection_data->data;
- command.value = selection_data->length;
- command.time = time;
- e_cell_text_view_command (edit->tep, &command, edit);
- }
-}
-
-static void e_cell_text_view_supply_selection (CellEdit *edit, guint time, GdkAtom selection, char *data, gint length)
-{
- gboolean successful;
- GtkWidget *invisible;
-
- invisible = e_cell_text_view_get_invisible (edit);
-
- if (selection == GDK_SELECTION_PRIMARY){
- if (edit->primary_selection) {
- g_free (edit->primary_selection);
- }
- edit->primary_selection = g_strndup (data, length);
- edit->primary_length = length;
- } else if (selection == clipboard_atom) {
- if (edit->clipboard_selection) {
- g_free (edit->clipboard_selection);
- }
- edit->clipboard_selection = g_strndup (data, length);
- edit->clipboard_length = length;
- }
-
- successful = gtk_selection_owner_set (invisible,
- selection,
- time);
-
- if (selection == GDK_SELECTION_PRIMARY)
- edit->has_selection = successful;
-}
-
-static void
-e_cell_text_view_get_selection (CellEdit *edit, GdkAtom selection, guint32 time)
-{
- GtkWidget *invisible;
- invisible = e_cell_text_view_get_invisible (edit);
- gtk_selection_convert (invisible,
- selection,
- GDK_SELECTION_TYPE_STRING,
- time);
-}
-
-static void
-_get_tep (CellEdit *edit)
-{
- if (!edit->tep) {
- edit->tep = e_text_event_processor_emacs_like_new ();
- gtk_object_ref (GTK_OBJECT (edit->tep));
- gtk_object_sink (GTK_OBJECT (edit->tep));
- gtk_signal_connect (GTK_OBJECT(edit->tep),
- "command",
- GTK_SIGNAL_FUNC(e_cell_text_view_command),
- (gpointer) edit);
- }
-}
-
-static int
-number_of_lines (char *text)
-{
- int num_lines = 0;
- gchar *p;
-
- if (!text) return 0;
-
- for (p = text; *p; p = unicode_next_utf8 (p)) {
- if (*p == '\n') num_lines++;
- }
-
- num_lines++;
- return num_lines;
-}
-
-/* Splits the text of the text item into lines */
-static void
-split_into_lines (CurrentCell *cell)
-{
- char *p;
- struct line *lines;
- gint len;
-
- char *text = cell->text;
- ECellTextLineBreaks *linebreaks = cell->breaks;
-
- if (! cell->breaks) {
- cell->breaks = g_new (ECellTextLineBreaks, 1);
- cell->breaks->ref_count = 1;
- } else {
- cell->breaks->ref_count ++;
- return;
- }
- linebreaks = cell->breaks;
-
- /* Check if already split. */
-
- linebreaks->lines = NULL;
- linebreaks->num_lines = 0;
-
- if (!text)
- return;
-
- /* First, count the number of lines */
-
- linebreaks->num_lines = number_of_lines(cell->text);
-
- /* Allocate array of lines and calculate split positions */
-
- linebreaks->lines = lines = g_new0 (struct line, linebreaks->num_lines);
-
- len = 0;
- for (p = text; *p; p = unicode_next_utf8 (p)) {
- if (len == 0) lines->text = p;
- if (*p == '\n') {
- lines->length = p - lines->text;
- lines++;
- len = 0;
- } else
- len++;
- }
-
- if (len == 0)
- lines->text = p;
- lines->length = p - lines->text;
-
- calc_line_widths (cell);
-}
-
-/* Free lines structure. */
-static void
-unref_lines (CurrentCell *cell)
-{
- if (cell->breaks){
- cell->breaks->ref_count --;
- if (cell->breaks->ref_count <= 0){
- g_free (cell->breaks->lines);
- g_free (cell->breaks);
- cell->breaks = NULL;
- }
- }
-}
-
-static void
-calc_ellipsis (ECellTextView *text_view)
-{
- ECellText *ect = E_CELL_TEXT (((ECellView *)text_view)->ecell);
- EFont *font;
-
- font = text_view->font;
- if (font)
- text_view->ellipsis_width =
- e_font_utf8_text_width (font, E_FONT_PLAIN,
- ect->ellipsis ? ect->ellipsis : "...",
- ect->ellipsis ? strlen (ect->ellipsis) : 3);
-}
-
-/* Calculates the line widths (in pixels) of the text's splitted lines */
-static void
-calc_line_widths (CurrentCell *cell)
-{
- ECellTextView *text_view = cell->text_view;
- ECellText *ect = E_CELL_TEXT (((ECellView *)text_view)->ecell);
- ECellTextLineBreaks *linebreaks = cell->breaks;
- struct line *lines;
- int i;
- int j;
- EFont *font;
-
- font = text_view->font;
-
- lines = linebreaks->lines;
- linebreaks->max_width = 0;
-
- if (!lines) return;
-
- for (i = 0; i < linebreaks->num_lines; i++) {
- if (lines->length != 0) {
- if (font) {
- lines->width = e_font_utf8_text_width (font, E_FONT_PLAIN,
- lines->text, lines->length);
- lines->ellipsis_length = 0;
- } else {
- lines->width = 0;
- }
-
- if (ect->use_ellipsis &&
- (!(text_view->edit &&
- cell->row == text_view->edit->cell.row &&
- cell->view_col == text_view->edit->cell.view_col)) &&
- lines->width > cell->width) {
- if (font) {
- lines->ellipsis_length = 0;
- for (j = 0; j < lines->length; j++){
- if (e_font_utf8_text_width (font, E_FONT_PLAIN, lines->text, j) +
- text_view->ellipsis_width <= cell->width)
- lines->ellipsis_length = j;
- else
- break;
- }
- }
- else
- lines->ellipsis_length = 0;
- lines->width = e_font_utf8_text_width (font, E_FONT_PLAIN, lines->text, lines->ellipsis_length) +
- text_view->ellipsis_width;
- }
- else
- lines->ellipsis_length = lines->length;
-
- if (lines->width > linebreaks->max_width)
- linebreaks->max_width = lines->width;
- } else {
- lines->width = 0;
- lines->ellipsis_length = 0;
- }
-
- lines++;
- }
-}
-
-static void
-build_current_cell (CurrentCell *cell, ECellTextView *text_view, int model_col, int view_col, int row)
-{
- ECellView *ecell_view = (ECellView *) text_view;
- ECellText *ect = E_CELL_TEXT (ecell_view->ecell);
-
- cell->text_view = text_view;
- cell->model_col = model_col;
- cell->view_col = view_col;
- cell->row = row;
- cell->breaks = NULL;
-
- if (ect->filter) {
- cell->text = (*ect->filter)(e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- } else {
- cell->text = g_strdup (e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- }
- cell->width = e_table_header_get_column (
- ((ETableItem *)ecell_view->e_table_item_view)->header,
- view_col)->width - 8;
-}
-
-static void
-unbuild_current_cell (CurrentCell *cell)
-{
- g_free(cell->text);
- cell->text = NULL;
-}
-
-
-static GdkColor*
-e_cell_text_get_color (ECellTextView *cell_view, gchar *color_spec)
-{
- ECellText *ect = E_CELL_TEXT (((ECellView*) cell_view)->ecell);
- GdkColormap *colormap;
- GdkColor *color, tmp_color;
-
- /* If the color spec is NULL we use the default color. */
- if (color_spec == NULL)
- return NULL;
-
- /* Create the hash table if we haven't already. */
- if (!ect->colors)
- ect->colors = g_hash_table_new (g_str_hash, g_str_equal);
-
- /* See if we've already allocated the color. Note that we use a
- special value of (GdkColor*) 1 in the hash to indicate that we've
- already tried and failed to allocate the color, so we don't keep
- trying to allocate it. */
- color = g_hash_table_lookup (ect->colors, color_spec);
- if (color == (GdkColor*) 1)
- return NULL;
- if (color)
- return color;
-
- /* Try to parse the color. */
- if (gdk_color_parse (color_spec, &tmp_color)) {
- colormap = gtk_widget_get_colormap (GTK_WIDGET (cell_view->canvas));
-
- /* Try to allocate the color. */
- if (gdk_color_alloc (colormap, &tmp_color))
- color = gdk_color_copy (&tmp_color);
- }
-
- g_hash_table_insert (ect->colors, g_strdup (color_spec),
- color ? color : (GdkColor*) 1);
- return color;
-}
-
diff --git a/widgets/e-table/e-cell-text.h b/widgets/e-table/e-cell-text.h
deleted file mode 100644
index e0296998b3..0000000000
--- a/widgets/e-table/e-cell-text.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ECellText - Text item for e-table.
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * Drawing and event handling from:
- *
- * EText - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-#ifndef _E_CELL_TEXT_H_
-#define _E_CELL_TEXT_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-cell.h"
-
-/* Should return a malloced object. */
-typedef char *(*ECellTextFilter) (const void *);
-
-#define E_CELL_TEXT_TYPE (e_cell_text_get_type ())
-#define E_CELL_TEXT(o) (GTK_CHECK_CAST ((o), E_CELL_TEXT_TYPE, ECellText))
-#define E_CELL_TEXT_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_TEXT_TYPE, ECellTextClass))
-#define E_IS_CELL_TEXT(o) (GTK_CHECK_TYPE ((o), E_CELL_TEXT_TYPE))
-#define E_IS_CELL_TEXT_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_TEXT_TYPE))
-
-typedef struct {
- ECell parent;
-
- GtkJustification justify;
- char *font_name;
-
- double x, y; /* Position at anchor */
-
- gulong pixel; /* Fill color */
-
- /* Clip handling */
- char *ellipsis; /* The ellipsis characters. NULL = "...". */
-
- guint use_ellipsis : 1; /* Whether to use the ellipsis. */
-
- int strikeout_column;
- int bold_column;
-
- /* This column in the ETable should return a string specifying a color,
- either a color name like "red" or a color spec like "rgb:F/0/0".
- See the XParseColor man page for the formats available. */
- int color_column;
-
- ECellTextFilter filter;
-
- /* This stores the colors we have allocated. */
- GHashTable *colors;
-} ECellText;
-
-typedef struct {
- ECellClass parent_class;
-} ECellTextClass;
-
-GtkType e_cell_text_get_type (void);
-ECell *e_cell_text_new (ETableModel *model, const char *fontname, GtkJustification justify);
-
-#endif /* _E_CELL_TEXT_H_ */
-
-
diff --git a/widgets/e-table/e-cell-toggle.c b/widgets/e-table/e-cell-toggle.c
deleted file mode 100644
index 1be01348db..0000000000
--- a/widgets/e-table/e-cell-toggle.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * e-cell-toggle.c: Multi-state image toggle cell object.
- *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- *
- * (C) 1999, 2000 Helix Code, Inc
- */
-#include <config.h>
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomeui/gnome-canvas.h>
-#include "e-cell-toggle.h"
-#include "e-util/e-util.h"
-#include "e-table-item.h"
-
-#define PARENT_TYPE e_cell_get_type ()
-
-typedef struct {
- ECellView cell_view;
- GdkGC *gc;
- GnomeCanvas *canvas;
-} ECellToggleView;
-
-static ECellClass *parent_class;
-
-static void
-etog_queue_redraw (ECellToggleView *text_view, int view_col, int view_row)
-{
- e_table_item_redraw_range (
- text_view->cell_view.e_table_item_view,
- view_col, view_row, view_col, view_row);
-}
-
-/*
- * ECell::realize method
- */
-static ECellView *
-etog_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
- ECellToggleView *toggle_view = g_new0 (ECellToggleView, 1);
- ETableItem *eti = E_TABLE_ITEM (e_table_item_view);
- GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
-
- toggle_view->cell_view.ecell = ecell;
- toggle_view->cell_view.e_table_model = table_model;
- toggle_view->cell_view.e_table_item_view = e_table_item_view;
- toggle_view->canvas = canvas;
-
- return (ECellView *) toggle_view;
-}
-
-static void
-etog_kill_view (ECellView *ecell_view)
-{
- g_free (ecell_view);
-}
-
-static void
-etog_realize (ECellView *ecell_view)
-{
- ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-
- toggle_view->gc = gdk_gc_new (GTK_WIDGET (toggle_view->canvas)->window);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-etog_unrealize (ECellView *ecv)
-{
- ECellToggleView *toggle_view = (ECellToggleView *) ecv;
-
- gdk_gc_unref (toggle_view->gc);
- toggle_view->gc = NULL;
-}
-
-/*
- * ECell::draw method
- */
-static void
-etog_draw (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row, gboolean selected,
- int x1, int y1, int x2, int y2)
-{
- ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
-#if 0
- ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-#endif
- GdkPixbuf *image;
- int x, y, width, height;
-
- const int value = GPOINTER_TO_INT (
- e_table_model_value_at (ecell_view->e_table_model, model_col, row));
-
- if (value >= toggle->n_states){
- g_warning ("Value from the table model is %d, the states we support are [0..%d)\n",
- value, toggle->n_states);
- return;
- }
-
- image = toggle->images [value];
-
- if ((x2 - x1) < gdk_pixbuf_get_width (image)){
- x = x1;
- width = x2 - x1;
- } else {
- x = x1 + ((x2 - x1) - gdk_pixbuf_get_width (image)) / 2;
- width = gdk_pixbuf_get_width (image);
- }
-
- if ((y2 - y1) < gdk_pixbuf_get_height (image)){
- y = y1;
- height = y2 - y1;
- } else {
- y = y1 + ((y2 - y1) - gdk_pixbuf_get_height (image)) / 2;
- height = gdk_pixbuf_get_height (image);
- }
-
-#if 0 /* do alpha */
- if (gdk_pixbuf_get_has_alpha (image)) {
- flat = gdk_pixbuf_composite_color_simple (
- image,
- gdk_pixbuf_get_width (image),
- gdk_pixbuf_get_height (image),
- GDK_INTERP_NEAREST,
- 255,
- 32,
- 0xffffff, 0xffffff);
-
- gdk_pixbuf_render_to_drawable (flat, drawable,
- toggle_view->gc,
- 0, 0,
- x, y,
- width, height,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- gdk_pixbuf_unref (flat);
- } else {
- gdk_pixbuf_render_to_drawable (image, drawable,
- toggle_view->gc,
- 0, 0,
- x, y,
- width, height,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- }
-#else
- gdk_pixbuf_render_to_drawable_alpha (image, drawable,
- 0, 0,
- x, y,
- width, height,
- GDK_PIXBUF_ALPHA_BILEVEL,
- 128,
- GDK_RGB_DITHER_NORMAL,
- x, y);
-#endif
-}
-
-static void
-etog_set_value (ECellToggleView *toggle_view, int model_col, int view_col, int row, int value)
-{
- ECell *ecell = toggle_view->cell_view.ecell;
- ECellToggle *toggle = E_CELL_TOGGLE (ecell);
-
- if (value >= toggle->n_states)
- value = 0;
-
- e_table_model_set_value_at (toggle_view->cell_view.e_table_model,
- model_col, row, GINT_TO_POINTER (value));
- etog_queue_redraw (toggle_view, view_col, row);
-}
-
-/*
- * ECell::event method
- */
-static gint
-etog_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
-{
- ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
- void *_value = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
- const int value = GPOINTER_TO_INT (_value);
-
- switch (event->type){
- case GDK_BUTTON_RELEASE:
- if (!e_table_model_is_cell_editable(ecell_view->e_table_model, model_col, row))
- return FALSE;
-
- etog_set_value (toggle_view, model_col, view_col, row, value + 1);
- return TRUE;
-
- case GDK_KEY_PRESS:
- if (!e_table_model_is_cell_editable(ecell_view->e_table_model, model_col, row))
- return FALSE;
-
- if (event->key.keyval == GDK_space){
- etog_set_value (toggle_view, model_col, view_col, row, value + 1);
- return TRUE;
- }
- return FALSE;
-
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-/*
- * ECell::height method
- */
-static int
-etog_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
-
- return toggle->height;
-}
-
-static void
-etog_destroy (GtkObject *object)
-{
- ECellToggle *etog = E_CELL_TOGGLE (object);
- int i;
-
- for (i = 0; i < etog->n_states; i++)
- gdk_pixbuf_unref (etog->images [i]);
-
- g_free (etog->images);
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-static void
-e_cell_toggle_class_init (GtkObjectClass *object_class)
-{
- ECellClass *ecc = (ECellClass *) object_class;
-
- object_class->destroy = etog_destroy;
-
- ecc->new_view = etog_new_view;
- ecc->kill_view = etog_kill_view;
- ecc->realize = etog_realize;
- ecc->unrealize = etog_unrealize;
- ecc->draw = etog_draw;
- ecc->event = etog_event;
- ecc->height = etog_height;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-}
-
-E_MAKE_TYPE(e_cell_toggle, "ECellToggle", ECellToggle, e_cell_toggle_class_init, NULL, PARENT_TYPE);
-
-void
-e_cell_toggle_construct (ECellToggle *etog, int border, int n_states, GdkPixbuf **images)
-{
- int max_height = 0;
- int i;
-
- etog->border = border;
- etog->n_states = n_states;
-
- etog->images = g_new (GdkPixbuf *, n_states);
-
- for (i = 0; i < n_states; i++){
- etog->images [i] = images [i];
- gdk_pixbuf_ref (images [i]);
-
- if (gdk_pixbuf_get_height (images [i]) > max_height)
- max_height = gdk_pixbuf_get_height (images [i]);
- }
-
- etog->height = max_height;
-}
-
-ECell *
-e_cell_toggle_new (int border, int n_states, GdkPixbuf **images)
-{
- ECellToggle *etog = gtk_type_new (e_cell_toggle_get_type ());
-
- e_cell_toggle_construct (etog, border, n_states, images);
-
- return (ECell *) etog;
-}
-
-
diff --git a/widgets/e-table/e-cell-toggle.h b/widgets/e-table/e-cell-toggle.h
deleted file mode 100644
index d5773b454a..0000000000
--- a/widgets/e-table/e-cell-toggle.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef _E_CELL_TOGGLE_H_
-#define _E_CELL_TOGGLE_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include "e-cell.h"
-
-#define E_CELL_TOGGLE_TYPE (e_cell_toggle_get_type ())
-#define E_CELL_TOGGLE(o) (GTK_CHECK_CAST ((o), E_CELL_TOGGLE_TYPE, ECellToggle))
-#define E_CELL_TOGGLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_TOGGLE_TYPE, ECellToggleClass))
-#define E_IS_CELL_TOGGLE(o) (GTK_CHECK_TYPE ((o), E_CELL_TOGGLE_TYPE))
-#define E_IS_CELL_TOGGLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_TOGGLE_TYPE))
-
-typedef struct {
- ECell parent;
-
- int border;
- int n_states;
- GdkPixbuf **images;
-
- int height;
-} ECellToggle;
-
-typedef struct {
- ECellClass parent_class;
-} ECellToggleClass;
-
-GtkType e_cell_toggle_get_type (void);
-ECell *e_cell_toggle_new (int border, int n_states, GdkPixbuf **images);
-void e_cell_toggle_construct (ECellToggle *etog, int border,
- int n_states, GdkPixbuf **images);
-
-#endif /* _E_CELL_TOGGLE_H_ */
-
-
diff --git a/widgets/e-table/e-cell-tree.c b/widgets/e-table/e-cell-tree.c
deleted file mode 100644
index d4106271e6..0000000000
--- a/widgets/e-table/e-cell-tree.c
+++ /dev/null
@@ -1,542 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-cell-tree.c - Tree cell renderer
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Toshok <toshok@helixcode.com>
- *
- * A majority of code taken from:
- *
- * the ECellText renderer.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- */
-
-#include <config.h>
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkinvisible.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <stdio.h>
-#include "e-table-sorted-variable.h"
-#include "e-tree-model.h"
-#include "e-cell-tree.h"
-#include "e-util/e-util.h"
-#include "e-table-item.h"
-
-#include <gdk/gdkx.h> /* for BlackPixel */
-#include <ctype.h>
-#include <math.h>
-
-#define PARENT_TYPE e_cell_get_type ()
-
-typedef struct {
- ECellView cell_view;
- ECellView *subcell_view;
- GdkGC *gc;
-
- GnomeCanvas *canvas;
-
-} ECellTreeView;
-
-static ECellClass *parent_class;
-
-#define INDENT_AMOUNT 16
-
-static int
-visible_depth_of_node (ETreeModel *tree_model, ETreePath *path)
-{
- return (e_tree_model_node_depth (tree_model, path)
- - (e_tree_model_root_node_is_visible (tree_model) ? 0 : 1));
-}
-
-static gint
-offset_of_node (ETreeModel *tree_model, ETreePath *path)
-{
- return (visible_depth_of_node(tree_model, path) + 1) * INDENT_AMOUNT;
-}
-
-static ETreePath*
-e_cell_tree_get_node (ETreeModel *tree_model, int row)
-{
- return (ETreePath*)e_table_model_value_at (E_TABLE_MODEL(tree_model), -1, row);
-}
-
-static ETreeModel*
-e_cell_tree_get_tree_model (ETableModel *table_model, int row)
-{
- return (ETreeModel*)e_table_model_value_at (table_model, -2, row);
-}
-
-/*
- * ECell::new_view method
- */
-static ECellView *
-ect_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
- ECellTree *ect = E_CELL_TREE (ecell);
- ECellTreeView *tree_view = g_new0 (ECellTreeView, 1);
- GnomeCanvas *canvas = GNOME_CANVAS_ITEM (e_table_item_view)->canvas;
-
- tree_view->cell_view.ecell = ecell;
- tree_view->cell_view.e_table_model = table_model;
- tree_view->cell_view.e_table_item_view = e_table_item_view;
-
- /* create our subcell view */
- tree_view->subcell_view = e_cell_new_view (ect->subcell, table_model, e_table_item_view /* XXX */);
-
- tree_view->canvas = canvas;
-
- return (ECellView *)tree_view;
-}
-
-/*
- * ECell::kill_view method
- */
-static void
-ect_kill_view (ECellView *ecv)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecv;
-
- /* kill our subcell view */
- e_cell_kill_view (tree_view->subcell_view);
-
- g_free (tree_view);
-}
-
-/*
- * ECell::realize method
- */
-static void
-ect_realize (ECellView *ecell_view)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
- /* realize our subcell view */
- e_cell_realize (tree_view->subcell_view);
-
- tree_view->gc = gdk_gc_new (GTK_WIDGET (tree_view->canvas)->window);
-
- gdk_gc_set_line_attributes (tree_view->gc, 1,
- GDK_LINE_ON_OFF_DASH, None, None);
- gdk_gc_set_dashes (tree_view->gc, 0, "\1\1", 2);
-
- if (parent_class->realize)
- (* parent_class->realize) (ecell_view);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-ect_unrealize (ECellView *ecv)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecv;
-
- /* unrealize our subcell view. */
- e_cell_unrealize (tree_view->subcell_view);
-
- gdk_gc_unref (tree_view->gc);
- tree_view->gc = NULL;
-
- if (parent_class->unrealize)
- (* parent_class->unrealize) (ecv);
-}
-
-/*
- * ECell::draw method
- */
-static void
-ect_draw (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row, gboolean selected,
- int x1, int y1, int x2, int y2)
-{
- ECellTreeView *tree_view = (ECellTreeView *)ecell_view;
- ETreeModel *tree_model = e_cell_tree_get_tree_model(ecell_view->e_table_model, row);
- ETreePath *node;
- GdkRectangle rect, *clip_rect;
- GtkWidget *canvas = GTK_WIDGET (tree_view->canvas);
- GdkGC *fg_gc = canvas->style->fg_gc[GTK_STATE_ACTIVE];
- GdkColor *foreground;
-
- int offset, subcell_offset;
- gboolean expanded, expandable;
-
- /* only draw the tree effects if we're the active sort */
- if (/* XXX */ TRUE) {
- GdkPixbuf *node_image;
- int node_image_width = 0, node_image_height = 0;
- ETreePath *parent_node;
-
- node = e_cell_tree_get_node (tree_model, row);
-
- offset = offset_of_node (tree_model, node);
- expandable = e_tree_model_node_is_expandable (tree_model, node);
- expanded = e_tree_model_node_is_expanded (tree_model, node);
- subcell_offset = offset;
-
- node_image = e_tree_model_icon_of_node (tree_model, node);
-
- if (node_image) {
- node_image_width = gdk_pixbuf_get_width (node_image);
- node_image_height = gdk_pixbuf_get_height (node_image);
- }
-
- /*
- * Be a nice citizen: clip to the region we are supposed to draw on
- */
- rect.x = x1;
- rect.y = y1;
- rect.width = subcell_offset + node_image_width;
- rect.height = y2 - y1;
-
- gdk_gc_set_clip_rectangle (tree_view->gc, &rect);
- gdk_gc_set_clip_rectangle (fg_gc, &rect);
- clip_rect = &rect;
-
- if (selected) {
- foreground = &canvas->style->text [GTK_STATE_SELECTED];
- } else {
- foreground = &canvas->style->text [GTK_STATE_NORMAL];
- }
-
- gdk_gc_set_foreground (tree_view->gc, foreground);
-
- /* draw our lines */
- if (E_CELL_TREE(tree_view->cell_view.ecell)->draw_lines) {
-
- if (visible_depth_of_node (tree_model, node) > 0
- || e_tree_model_node_get_children (tree_model, node, NULL) > 0)
- gdk_draw_line (drawable, tree_view->gc,
- rect.x + offset - INDENT_AMOUNT / 2 + 1,
- rect.y + rect.height / 2,
- rect.x + offset,
- rect.y + rect.height / 2);
-
- if (visible_depth_of_node (tree_model, node) != 0) {
- gdk_draw_line (drawable, tree_view->gc,
- rect.x + offset - INDENT_AMOUNT / 2,
- rect.y,
- rect.x + offset - INDENT_AMOUNT / 2,
- (e_tree_model_node_get_next (tree_model, node)
- ? rect.y + rect.height
- : rect.y + rect.height / 2));
- }
-
- /* now traverse back up to the root of the tree, checking at
- each level if the node has siblings, and drawing the
- correct vertical pipe for it's configuration. */
- parent_node = e_tree_model_node_get_parent (tree_model, node);
- offset -= INDENT_AMOUNT;
- while (parent_node && visible_depth_of_node (tree_model, parent_node) != 0) {
- if (e_tree_model_node_get_next(tree_model, parent_node)) {
- gdk_draw_line (drawable, tree_view->gc,
- rect.x + offset - INDENT_AMOUNT / 2,
- rect.y,
- rect.x + offset - INDENT_AMOUNT / 2,
- rect.y + rect.height);
- }
- parent_node = e_tree_model_node_get_parent (tree_model, parent_node);
- offset -= INDENT_AMOUNT;
- }
- }
-
- /* now draw our icon if we're expandable */
- if (expandable) {
- GdkPixbuf *image;
- int image_width, image_height;
-
- image = (expanded
- ? E_CELL_TREE(tree_view->cell_view.ecell)->open_pixbuf
- : E_CELL_TREE(tree_view->cell_view.ecell)->closed_pixbuf);
-
- image_width = gdk_pixbuf_get_width(image);
- image_height = gdk_pixbuf_get_height(image);
-
- gdk_pixbuf_render_to_drawable_alpha (image,
- drawable,
- 0, 0,
- x1 + subcell_offset - INDENT_AMOUNT / 2 - image_width / 2,
- y1 + (y2 - y1) / 2 - image_height / 2,
- image_width, image_height,
- GDK_PIXBUF_ALPHA_BILEVEL,
- 128,
- GDK_RGB_DITHER_NORMAL,
- image_width, 0);
- }
-
- if (node_image) {
- gdk_pixbuf_render_to_drawable_alpha (node_image,
- drawable,
- 0, 0,
- x1 + subcell_offset,
- y1 + (y2 - y1) / 2 - node_image_height / 2,
- node_image_width, node_image_height,
- GDK_PIXBUF_ALPHA_BILEVEL,
- 128,
- GDK_RGB_DITHER_NORMAL,
- node_image_width, 0);
- subcell_offset += node_image_width;
- }
- }
-
- /* Now cause our subcell to draw its contents, shifted by
- subcell_offset pixels */
- e_cell_draw (tree_view->subcell_view, drawable,
- model_col, view_col, row, selected,
- x1 + subcell_offset, y1, x2, y2);
-}
-
-/*
- * ECell::event method
- */
-static gint
-ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
- ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row);
- ETreePath *node = e_cell_tree_get_node (tree_model, row);
- int offset = offset_of_node (tree_model, node);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS: {
- /* if the event happened in our area of control (and
- we care about it), handle it. */
-
- /* only activate the tree control if the click/release happens in the icon's area. */
- if (event->button.x > (offset - INDENT_AMOUNT) && event->button.x < offset) {
- if (e_tree_model_node_is_expandable (tree_model, node)) {
- e_tree_model_node_set_expanded (tree_model,
- node,
- !e_tree_model_node_is_expanded(tree_model, node));
- }
- return TRUE;
- }
- else if (event->button.x < (offset - INDENT_AMOUNT))
- return TRUE;
- }
- default:
- /* modify the event and pass it off to our subcell_view */
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- event->button.x -= offset;
- break;
- case GDK_MOTION_NOTIFY:
- event->motion.x -= offset;
- break;
- default:
- /* nada */
- }
- e_cell_event(tree_view->subcell_view, event, model_col, view_col, row);
- return TRUE;
- }
-}
-
-/*
- * ECell::height method
- */
-static int
-ect_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
- return e_cell_height (tree_view->subcell_view, model_col, view_col, row);
-}
-
-/*
- * ECellView::enter_edit method
- */
-static void *
-ect_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- /* just defer to our subcell's view */
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
- return e_cell_enter_edit (tree_view->subcell_view, model_col, view_col, row);
-}
-
-/*
- * ECellView::leave_edit method
- */
-static void
-ect_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
- /* just defer to our subcell's view */
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
- e_cell_leave_edit (tree_view->subcell_view, model_col, view_col, row, edit_context);
-}
-
-static void
-ect_print (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width, double height)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
- if (/* XXX only if we're the active sort */ TRUE) {
- ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row);
- ETreePath *node = e_cell_tree_get_node (tree_model, row);
- int offset = offset_of_node (tree_model, node);
- int subcell_offset = offset;
- gboolean expandable = e_tree_model_node_is_expandable (tree_model, node);
- gboolean expanded = e_tree_model_node_is_expanded (tree_model, node);
-
- /* draw our lines */
- if (E_CELL_TREE(tree_view->cell_view.ecell)->draw_lines) {
-
- if (!e_tree_model_node_is_root (tree_model, node)
- || e_tree_model_node_get_children (tree_model, node, NULL) > 0) {
- gnome_print_moveto (context,
- offset - INDENT_AMOUNT / 2,
- height / 2);
-
- gnome_print_lineto (context,
- offset,
- height / 2);
- }
-
- if (visible_depth_of_node (tree_model, node) != 0) {
- gnome_print_moveto (context,
- offset - INDENT_AMOUNT / 2,
- height);
- gnome_print_lineto (context,
- offset - INDENT_AMOUNT / 2,
- (e_tree_model_node_get_next (tree_model, node)
- ? 0
- : height / 2));
- }
-
- /* now traverse back up to the root of the tree, checking at
- each level if the node has siblings, and drawing the
- correct vertical pipe for it's configuration. */
- node = e_tree_model_node_get_parent (tree_model, node);
- offset -= INDENT_AMOUNT;
- while (node && visible_depth_of_node (tree_model, node) != 0) {
- if (e_tree_model_node_get_next(tree_model, node)) {
- gnome_print_moveto (context,
- offset - INDENT_AMOUNT / 2,
- height);
- gnome_print_lineto (context,
- offset - INDENT_AMOUNT / 2,
- 0);
- }
- node = e_tree_model_node_get_parent (tree_model, node);
- offset -= INDENT_AMOUNT;
- }
- }
-
- /* now draw our icon if we're expandable */
- if (expandable) {
- double image_matrix [6] = {16, 0, 0, 16, 0, 0};
- GdkPixbuf *image = (expanded
- ? E_CELL_TREE(tree_view->cell_view.ecell)->open_pixbuf
- : E_CELL_TREE(tree_view->cell_view.ecell)->closed_pixbuf);
- int image_width, image_height, image_rowstride;
- guchar *image_pixels;
-
- image_width = gdk_pixbuf_get_width(image);
- image_height = gdk_pixbuf_get_height(image);
- image_pixels = gdk_pixbuf_get_pixels(image);
- image_rowstride = gdk_pixbuf_get_rowstride(image);
-
- image_matrix [4] = subcell_offset - INDENT_AMOUNT / 2 - image_width / 2;
- image_matrix [5] = height / 2 - image_height / 2;
-
- gnome_print_gsave (context);
- gnome_print_concat (context, image_matrix);
-
- gnome_print_rgbaimage (context, image_pixels, image_width, image_height, image_rowstride);
- gnome_print_grestore (context);
- }
-
- gnome_print_stroke (context);
-
- if (gnome_print_translate(context, subcell_offset, 0) == -1)
- /* FIXME */;
- width -= subcell_offset;
- }
-
-
- e_cell_print (tree_view->subcell_view, context, model_col, view_col, row, width, height);
-}
-
-static gdouble
-ect_print_height (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width)
-{
- return 12; /* XXX */
-}
-
-/*
- * GtkObject::destroy method
- */
-static void
-ect_destroy (GtkObject *object)
-{
- ECellTree *ect = E_CELL_TREE (object);
-
- /* destroy our subcell */
- gtk_object_destroy (GTK_OBJECT (ect->subcell));
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-static void
-e_cell_tree_class_init (GtkObjectClass *object_class)
-{
- ECellClass *ecc = (ECellClass *) object_class;
-
- object_class->destroy = ect_destroy;
-
- ecc->new_view = ect_new_view;
- ecc->kill_view = ect_kill_view;
- ecc->realize = ect_realize;
- ecc->unrealize = ect_unrealize;
- ecc->draw = ect_draw;
- ecc->event = ect_event;
- ecc->height = ect_height;
- ecc->enter_edit = ect_enter_edit;
- ecc->leave_edit = ect_leave_edit;
- ecc->print = ect_print;
- ecc->print_height = ect_print_height;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-}
-
-E_MAKE_TYPE(e_cell_tree, "ECellTree", ECellTree, e_cell_tree_class_init, NULL, PARENT_TYPE);
-
-void
-e_cell_tree_construct (ECellTree *ect,
- GdkPixbuf *open_pixbuf,
- GdkPixbuf *closed_pixbuf,
- gboolean draw_lines,
- ECell *subcell)
-{
- ect->subcell = subcell;
- ect->open_pixbuf = open_pixbuf;
- ect->closed_pixbuf = closed_pixbuf;
- ect->draw_lines = draw_lines;
-}
-
-
-ECell *
-e_cell_tree_new (ETableModel *etm,
- GdkPixbuf *open_pixbuf,
- GdkPixbuf *closed_pixbuf,
- gboolean draw_lines,
- ECell *subcell)
-{
- ECellTree *ect = gtk_type_new (e_cell_tree_get_type ());
-
- e_cell_tree_construct (ect, open_pixbuf, closed_pixbuf, draw_lines, subcell);
-
- return (ECell *) ect;
-}
diff --git a/widgets/e-table/e-cell-tree.h b/widgets/e-table/e-cell-tree.h
deleted file mode 100644
index ef6babeda4..0000000000
--- a/widgets/e-table/e-cell-tree.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ECellTree - Tree item for e-table.
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Toshok <toshok@helixcode.com>
- *
- */
-#ifndef _E_CELL_TREE_H_
-#define _E_CELL_TREE_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-cell.h"
-
-#define E_CELL_TREE_TYPE (e_cell_tree_get_type ())
-#define E_CELL_TREE(o) (GTK_CHECK_CAST ((o), E_CELL_TREE_TYPE, ECellTree))
-#define E_CELL_TREE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_TREE_TYPE, ECellTreeClass))
-#define E_IS_CELL_TREE(o) (GTK_CHECK_TYPE ((o), E_CELL_TREE_TYPE))
-#define E_IS_CELL_TREE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_TREE_TYPE))
-
-typedef struct {
- ECell parent;
-
- gboolean draw_lines;
-
- GdkPixbuf *open_pixbuf;
- GdkPixbuf *closed_pixbuf;
-
- ECell *subcell;
-} ECellTree;
-
-typedef struct {
- ECellClass parent_class;
-} ECellTreeClass;
-
-GtkType e_cell_tree_get_type (void);
-ECell *e_cell_tree_new (ETableModel *model,
- GdkPixbuf *open_pixbuf,
- GdkPixbuf *closed_pixbuf,
- gboolean draw_lines,
- ECell *subcell);
-void e_cell_tree_construct (ECellTree *ect,
- GdkPixbuf *open_pixbuf,
- GdkPixbuf *closed_pixbuf,
- gboolean draw_lines,
- ECell *subcell);
-
-#endif /* _E_CELL_TREE_H_ */
-
-
diff --git a/widgets/e-table/e-cell.c b/widgets/e-table/e-cell.c
deleted file mode 100644
index 75be2ce916..0000000000
--- a/widgets/e-table/e-cell.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell.c: base class for cell renderers in e-table
- *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- *
- * (C) 1999 Helix Code, Inc
- */
-#include <config.h>
-#include "e-cell.h"
-#include "e-util/e-util.h"
-
-#define PARENT_TYPE gtk_object_get_type ()
-
-static ECellView *
-ec_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
- return NULL;
-}
-
-static void
-ec_realize (ECellView *e_cell)
-{
-}
-
-static void
-ec_kill_view (ECellView *ecell_view)
-{
-}
-
-static void
-ec_unrealize (ECellView *e_cell)
-{
-}
-
-static void
-ec_draw (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row, gboolean selected,
- int x1, int y1, int x2, int y2)
-{
- g_error ("e-cell-draw invoked\n");
-}
-
-static gint
-ec_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
-{
- g_error ("e-cell-event invoked\n");
- return 0;
-}
-
-static gint
-ec_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- g_error ("e-cell-event invoked\n");
- return 0;
-}
-
-static void
-ec_focus (ECellView *ecell_view, int model_col, int view_col, int row, int x1, int y1, int x2, int y2)
-{
- ecell_view->focus_col = view_col;
- ecell_view->focus_row = row;
- ecell_view->focus_x1 = x1;
- ecell_view->focus_y1 = y1;
- ecell_view->focus_x2 = x2;
- ecell_view->focus_y2 = y2;
-}
-
-static void
-ec_unfocus (ECellView *ecell_view)
-{
- ecell_view->focus_col = -1;
- ecell_view->focus_row = -1;
- ecell_view->focus_x1 = -1;
- ecell_view->focus_y1 = -1;
- ecell_view->focus_x2 = -1;
- ecell_view->focus_y2 = -1;
-}
-
-static void *
-ec_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- return NULL;
-}
-
-static void
-ec_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *context)
-{
-}
-
-static void
-e_cell_class_init (GtkObjectClass *object_class)
-{
- ECellClass *ecc = (ECellClass *) object_class;
-
- ecc->realize = ec_realize;
- ecc->unrealize = ec_unrealize;
- ecc->new_view = ec_new_view;
- ecc->kill_view = ec_kill_view;
- ecc->draw = ec_draw;
- ecc->event = ec_event;
- ecc->focus = ec_focus;
- ecc->unfocus = ec_unfocus;
- ecc->height = ec_height;
- ecc->enter_edit = ec_enter_edit;
- ecc->leave_edit = ec_leave_edit;
- ecc->print = NULL;
- ecc->print_height = NULL;
-}
-
-static void
-e_cell_init (GtkObject *object)
-{
-}
-
-E_MAKE_TYPE(e_cell, "ECell", ECell, e_cell_class_init, e_cell_init, PARENT_TYPE);
-
-
-void
-e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->event (
- ecell_view, event, model_col, view_col, row);
-}
-
-ECellView *
-e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
- return E_CELL_CLASS (GTK_OBJECT (ecell)->klass)->new_view (
- ecell, table_model, e_table_item_view);
-}
-
-void
-e_cell_realize (ECellView *ecell_view)
-{
- return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->realize (ecell_view);
-}
-
-void
-e_cell_kill_view (ECellView *ecell_view)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->kill_view (ecell_view);
-}
-
-void
-e_cell_unrealize (ECellView *ecell_view)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->unrealize (ecell_view);
-}
-
-void
-e_cell_draw (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row, gboolean selected, int x1, int y1, int x2, int y2)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->draw (
- ecell_view, drawable, model_col, view_col, row, selected, x1, y1, x2, y2);
-}
-
-void
-e_cell_print (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width, double height)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print
- (ecell_view, context, model_col, view_col, row, width, height);
-}
-
-gdouble
-e_cell_print_height (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width)
-{
- if (E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print_height)
- return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print_height
- (ecell_view, context, model_col, view_col, row, width);
- else
- return 0.0;
-}
-
-int
-e_cell_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->height (
- ecell_view, model_col, view_col, row);
-}
-
-void *
-e_cell_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->enter_edit (
- ecell_view, model_col, view_col, row);
-}
-
-void
-e_cell_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->leave_edit (
- ecell_view, model_col, view_col, row, edit_context);
-}
diff --git a/widgets/e-table/e-cell.h b/widgets/e-table/e-cell.h
deleted file mode 100644
index 40b257f264..0000000000
--- a/widgets/e-table/e-cell.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_CELL_H_
-#define _E_CELL_H_
-
-#include <gdk/gdktypes.h>
-#include <libgnomeprint/gnome-print.h>
-#include "e-table-model.h"
-
-#define E_CELL_TYPE (e_cell_get_type ())
-#define E_CELL(o) (GTK_CHECK_CAST ((o), E_CELL_TYPE, ECell))
-#define E_CELL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_TYPE, ECellClass))
-#define E_IS_CELL(o) (GTK_CHECK_TYPE ((o), E_CELL_TYPE))
-#define E_IS_CELL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_TYPE))
-
-typedef struct _ECell ECell;
-typedef struct _ECellView ECellView;
-
-struct _ECell {
- GtkObject object;
-};
-
-struct _ECellView {
- ECell *ecell;
- ETableModel *e_table_model;
- void *e_table_item_view;
-
- gint focus_x1, focus_y1, focus_x2, focus_y2;
- gint focus_col, focus_row;
-};
-
-#define E_CELL_IS_FOCUSED(ecell_view) (ecell_view->focus_x1 != -1)
-
-typedef struct {
- GtkObjectClass parent_class;
-
- ECellView *(*new_view) (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
- void (*kill_view) (ECellView *ecell_view);
-
- void (*realize) (ECellView *ecell_view);
- void (*unrealize) (ECellView *ecell_view);
-
- void (*draw) (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row,
- gboolean selected, int x1, int y1, int x2, int y2);
- gint (*event) (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
- void (*focus) (ECellView *ecell_view, int model_col, int view_col,
- int row, int x1, int y1, int x2, int y2);
- void (*unfocus) (ECellView *ecell_view);
- int (*height) (ECellView *ecell_view, int model_col, int view_col, int row);
-
- void *(*enter_edit) (ECellView *ecell_view, int model_col, int view_col, int row);
- void (*leave_edit) (ECellView *ecell_view, int model_col, int view_col, int row, void *context);
- void (*print) (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- gdouble width, gdouble height);
- gdouble (*print_height) (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row, gdouble width);
-} ECellClass;
-
-GtkType e_cell_get_type (void);
-ECellView *e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
-void e_cell_kill_view (ECellView *ecell_view);
-
-void e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
-
-void e_cell_realize (ECellView *ecell_view);
-void e_cell_unrealize (ECellView *ecell_view);
-
-void e_cell_draw (ECellView *ecell_view, GdkDrawable *dr,
- int model_col, int view_col, int row, gboolean selected,
- int x1, int y1, int x2, int y2);
-void e_cell_print (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width, double height);
-gdouble e_cell_print_height (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row, gdouble width);
-void e_cell_focus (ECellView *ecell_view, int model_col, int view_col, int row,
- int x1, int y1, int x2, int y2);
-void e_cell_unfocus (ECellView *ecell_view);
-int e_cell_height (ECellView *ecell_view, int model_col, int view_col, int row);
-
-void *e_cell_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row);
-void e_cell_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context);
-
-#endif /* _E_CELL_H_ */
diff --git a/widgets/e-table/e-table-click-to-add.c b/widgets/e-table/e-table-click-to-add.c
deleted file mode 100644
index ba38078b2c..0000000000
--- a/widgets/e-table/e-table-click-to-add.c
+++ /dev/null
@@ -1,504 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-click-to-add.c: A canvas item based view of the ETableColumn.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <libgnomeui/gnome-canvas-util.h>
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "e-table-header.h"
-#include "e-table-click-to-add.h"
-#include "e-table-defines.h"
-#include "e-table-one.h"
-#include "widgets/e-text/e-text.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-canvas-utils.h"
-
-enum {
- CURSOR_CHANGE,
- LAST_SIGNAL
-};
-
-static gint etcta_signals [LAST_SIGNAL] = { 0, };
-
-#define PARENT_OBJECT_TYPE gnome_canvas_group_get_type ()
-
-#define ELEMENTS(x) (sizeof (x) / sizeof (x[0]))
-
-static GnomeCanvasGroupClass *etcta_parent_class;
-
-enum {
- ARG_0,
- ARG_HEADER,
- ARG_MODEL,
- ARG_MESSAGE,
- ARG_WIDTH,
- ARG_HEIGHT,
-};
-
-static void
-etcta_cursor_change (GtkObject *object, gint row, gint col, ETableClickToAdd *etcta)
-{
- gtk_signal_emit (GTK_OBJECT (etcta),
- etcta_signals [CURSOR_CHANGE],
- row, col);
-}
-
-static void
-etcta_add_table_header (ETableClickToAdd *etcta, ETableHeader *header)
-{
- etcta->eth = header;
- if (etcta->eth)
- gtk_object_ref (GTK_OBJECT (etcta->eth));
- if (etcta->row)
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(etcta->row),
- "ETableHeader", header,
- NULL);
-}
-
-static void
-etcta_drop_table_header (ETableClickToAdd *etcta)
-{
- GtkObject *header;
-
- if (!etcta->eth)
- return;
-
- header = GTK_OBJECT (etcta->eth);
-
- gtk_object_unref (header);
- etcta->eth = NULL;
-}
-
-static void
-etcta_add_one (ETableClickToAdd *etcta, ETableModel *one)
-{
- etcta->one = one;
- if (etcta->one)
- gtk_object_ref (GTK_OBJECT(etcta->one));
- if (etcta->row)
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(etcta->row),
- "ETableModel", one,
- NULL);
- gtk_object_set(GTK_OBJECT(etcta->selection),
- "model", one,
- NULL);
-}
-
-static void
-etcta_drop_one (ETableClickToAdd *etcta)
-{
- if (!etcta->one)
- return;
- gtk_object_unref (GTK_OBJECT(etcta->one));
- etcta->one = NULL;
- gtk_object_set(GTK_OBJECT(etcta->selection),
- "model", NULL,
- NULL);
-}
-
-static void
-etcta_add_model (ETableClickToAdd *etcta, ETableModel *model)
-{
- etcta->model = model;
- if (etcta->model)
- gtk_object_ref (GTK_OBJECT(etcta->model));
-}
-
-static void
-etcta_drop_model (ETableClickToAdd *etcta)
-{
- etcta_drop_one (etcta);
- if (!etcta->model)
- return;
- gtk_object_unref (GTK_OBJECT(etcta->model));
- etcta->model = NULL;
-}
-
-static void
-etcta_add_message (ETableClickToAdd *etcta, char *message)
-{
- etcta->message = g_strdup(message);
-}
-
-static void
-etcta_drop_message (ETableClickToAdd *etcta)
-{
- g_free(etcta->message);
- etcta->message = NULL;
-}
-
-
-static void
-etcta_destroy (GtkObject *object){
- ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (object);
-
- etcta_drop_table_header (etcta);
- etcta_drop_model (etcta);
- etcta_drop_message (etcta);
- gtk_object_unref(GTK_OBJECT(etcta->selection));
-
- if (GTK_OBJECT_CLASS (etcta_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (etcta_parent_class)->destroy) (object);
-}
-
-static void
-etcta_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableClickToAdd *etcta;
-
- item = GNOME_CANVAS_ITEM (o);
- etcta = E_TABLE_CLICK_TO_ADD (o);
-
- switch (arg_id){
- case ARG_HEADER:
- etcta_drop_table_header (etcta);
- etcta_add_table_header (etcta, E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg)));
- break;
- case ARG_MODEL:
- etcta_drop_model (etcta);
- etcta_add_model (etcta, E_TABLE_MODEL(GTK_VALUE_OBJECT (*arg)));
- break;
- case ARG_MESSAGE:
- etcta_drop_message (etcta);
- etcta_add_message (etcta, GTK_VALUE_STRING (*arg));
- break;
- case ARG_WIDTH:
- etcta->width = GTK_VALUE_DOUBLE (*arg);
- if (etcta->row)
- gnome_canvas_item_set(etcta->row,
- "minimum_width", etcta->width,
- NULL);
- if (etcta->text)
- gnome_canvas_item_set(etcta->text,
- "width", etcta->width - 4,
- NULL);
- if (etcta->rect)
- gnome_canvas_item_set(etcta->rect,
- "x2", etcta->width - 1,
- NULL);
- break;
- }
- gnome_canvas_item_request_update(item);
-}
-
-static void
-etcta_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableClickToAdd *etcta;
-
- etcta = E_TABLE_CLICK_TO_ADD (o);
-
- switch (arg_id){
- case ARG_HEADER:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etcta->eth);
- break;
- case ARG_MODEL:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etcta->model);
- break;
- case ARG_MESSAGE:
- GTK_VALUE_STRING (*arg) = g_strdup(etcta->message);
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = etcta->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = etcta->height;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-etcta_realize (GnomeCanvasItem *item)
-{
- ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
- etcta->text = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
- e_text_get_type(),
- "text", etcta->message ? etcta->message : "",
- "anchor", GTK_ANCHOR_NW,
- "width", etcta->width - 4,
- NULL);
- e_canvas_item_move_absolute (etcta->text, 2, 2);
- etcta->rect = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) etcta->width - 1,
- "y2", (double) etcta->height - 1,
- "outline_color", "black",
- "fill_color", NULL,
- NULL);
-
- if (GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->realize)
- (*GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->realize)(item);
-}
-
-static void
-etcta_unrealize (GnomeCanvasItem *item)
-{
- if (GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->unrealize)(item);
-}
-
-static double
-etcta_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-/*
- * Handles the events on the ETableClickToAdd, particularly it creates the ETableItem and passes in some events.
- */
-static int
-etcta_event (GnomeCanvasItem *item, GdkEvent *e)
-{
- ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
- int ret_val = TRUE;
-
- switch (e->type){
- case GDK_BUTTON_PRESS:
- if (etcta->text) {
- gtk_object_destroy(GTK_OBJECT(etcta->text));
- etcta->text = NULL;
- }
- if (etcta->rect) {
- gtk_object_destroy(GTK_OBJECT(etcta->rect));
- etcta->rect = NULL;
- }
- if (!etcta->row) {
- ETableModel *one;
-
- one = e_table_one_new(etcta->model);
- etcta_add_one (etcta, one);
- gtk_object_unref(GTK_OBJECT(one));
-
- e_table_selection_model_clear(etcta->selection);
-
- etcta->row = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
- e_table_item_get_type(),
- "ETableHeader", etcta->eth,
- "ETableModel", etcta->one,
- "minimum_width", etcta->width,
- "drawgrid", TRUE,
- "table_selection_model", etcta->selection,
- NULL);
-
- }
- /* Fall through. No break; */
- case GDK_BUTTON_RELEASE:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- if (etcta->row) {
- gnome_canvas_item_i2w (item, &e->button.x, &e->button.y);
- gnome_canvas_item_w2i (etcta->row, &e->button.x, &e->button.y);
- gtk_signal_emit_by_name(GTK_OBJECT(etcta->row), "event", e, &ret_val);
- gnome_canvas_item_i2w (etcta->row, &e->button.x, &e->button.y);
- gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
- }
- break;
-
- case GDK_KEY_PRESS:
- switch (e->key.keyval) {
- case GDK_Return:
- case GDK_KP_Enter:
- case GDK_ISO_Enter:
- case GDK_3270_Enter:
-
- case GDK_Tab:
- case GDK_KP_Tab:
- case GDK_ISO_Left_Tab:
-
- if (etcta->row) {
- ETableModel *one;
-
- e_table_one_commit(E_TABLE_ONE(etcta->one));
- etcta_drop_one (etcta);
- gtk_object_destroy(GTK_OBJECT(etcta->row));
- etcta->row = NULL;
-
- one = e_table_one_new(etcta->model);
- etcta_add_one (etcta, one);
- gtk_object_unref(GTK_OBJECT(one));
-
- e_table_selection_model_clear(etcta->selection);
-
- etcta->row = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
- e_table_item_get_type(),
- "ETableHeader", etcta->eth,
- "ETableModel", etcta->one,
- "minimum_width", etcta->width,
- "drawgrid", TRUE,
- "table_selection_model", etcta->selection,
- NULL);
-
- e_table_item_set_cursor(E_TABLE_ITEM(etcta->row), 0, 0);
- }
- break;
- default:
- break;
- }
-
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-static void
-etcta_reflow (GnomeCanvasItem *item, int flags)
-{
- ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
-
- double old_height = etcta->height;
-
- if (etcta->text) {
- gtk_object_get(GTK_OBJECT(etcta->text),
- "height", &etcta->height,
- NULL);
- etcta->height += 4;
- }
- if (etcta->row) {
- gtk_object_get(GTK_OBJECT(etcta->row),
- "height", &etcta->height,
- NULL);
- }
-
- if (etcta->rect) {
- gtk_object_set(GTK_OBJECT(etcta->rect),
- "y2", etcta->height - 1,
- NULL);
- }
- if (old_height != etcta->height)
- e_canvas_item_request_parent_reflow(item);
-}
-
-static void
-etcta_class_init (ETableClickToAddClass *klass)
-{
- GnomeCanvasItemClass *item_class = GNOME_CANVAS_ITEM_CLASS(klass);
- GtkObjectClass *object_class = GTK_OBJECT_CLASS(klass);
-
- etcta_parent_class = gtk_type_class (PARENT_OBJECT_TYPE);
-
- klass->cursor_change = NULL;
-
- object_class->destroy = etcta_destroy;
- object_class->set_arg = etcta_set_arg;
- object_class->get_arg = etcta_get_arg;
-
- item_class->realize = etcta_realize;
- item_class->unrealize = etcta_unrealize;
- item_class->point = etcta_point;
- item_class->event = etcta_event;
-
- gtk_object_add_arg_type ("ETableClickToAdd::header", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_HEADER);
- gtk_object_add_arg_type ("ETableClickToAdd::model", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_MODEL);
- gtk_object_add_arg_type ("ETableClickToAdd::message", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_MESSAGE);
- gtk_object_add_arg_type ("ETableClickToAdd::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableClickToAdd::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
-
- etcta_signals [CURSOR_CHANGE] =
- gtk_signal_new ("cursor_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClickToAddClass, cursor_change),
- gtk_marshal_NONE__INT_INT,
- GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, etcta_signals, LAST_SIGNAL);
-}
-
-static void
-etcta_init (GnomeCanvasItem *item)
-{
- ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
-
- etcta->one = NULL;
- etcta->model = NULL;
- etcta->eth = NULL;
-
- etcta->message = NULL;
-
- etcta->row = NULL;
- etcta->text = NULL;
- etcta->rect = NULL;
-
- etcta->selection = e_table_selection_model_new();
- gtk_signal_connect(GTK_OBJECT(etcta->selection), "cursor_changed",
- GTK_SIGNAL_FUNC(etcta_cursor_change), etcta);
-
- e_canvas_item_set_reflow_callback(item, etcta_reflow);
-}
-
-GtkType
-e_table_click_to_add_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableClickToAdd",
- sizeof (ETableClickToAdd),
- sizeof (ETableClickToAddClass),
- (GtkClassInitFunc) etcta_class_init,
- (GtkObjectInitFunc) etcta_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_OBJECT_TYPE, &info);
- }
-
- return type;
-}
-
-void
-e_table_click_to_add_commit (ETableClickToAdd *etcta)
-{
- if (etcta->row) {
- e_table_one_commit(E_TABLE_ONE(etcta->one));
- etcta_drop_one (etcta);
- gtk_object_destroy(GTK_OBJECT(etcta->row));
- etcta->row = NULL;
- }
- if (!etcta->text) {
- etcta->text = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
- e_text_get_type(),
- "text", etcta->message ? etcta->message : "",
- "anchor", GTK_ANCHOR_NW,
- "width", etcta->width - 4,
- NULL);
- e_canvas_item_move_absolute (etcta->text, 2, 2);
- }
- if (!etcta->rect) {
- etcta->rect = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) etcta->width - 1,
- "y2", (double) etcta->height - 1,
- "outline_color", "black",
- "fill_color", NULL,
- NULL);
- }
-}
diff --git a/widgets/e-table/e-table-click-to-add.h b/widgets/e-table/e-table-click-to-add.h
deleted file mode 100644
index 1dcbf9ef52..0000000000
--- a/widgets/e-table/e-table-click-to-add.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_CLICK_TO_ADD_H_
-#define _E_TABLE_CLICK_TO_ADD_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gnome-xml/tree.h>
-#include "e-table-header.h"
-#include "e-table-sort-info.h"
-#include "e-table-item.h"
-#include "e-table-selection-model.h"
-
-#define E_TABLE_CLICK_TO_ADD_TYPE (e_table_click_to_add_get_type ())
-#define E_TABLE_CLICK_TO_ADD(o) (GTK_CHECK_CAST ((o), E_TABLE_CLICK_TO_ADD_TYPE, ETableClickToAdd))
-#define E_TABLE_CLICK_TO_ADD_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_CLICK_TO_ADD_TYPE, ETableClickToAddClass))
-#define E_IS_TABLE_CLICK_TO_ADD(o) (GTK_CHECK_TYPE ((o), E_TABLE_CLICK_TO_ADD_TYPE))
-#define E_IS_TABLE_CLICK_TO_ADD_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_CLICK_TO_ADD_TYPE))
-
-typedef struct {
- GnomeCanvasGroup parent;
-
- ETableModel *one; /* The ETableOne. */
-
- ETableModel *model; /* The backend model. */
- ETableHeader *eth; /* This is just to give to the ETableItem. */
-
- char *message;
-
- GnomeCanvasItem *row; /* If row is NULL, we're sitting with no data and a "Click here" message. */
- GnomeCanvasItem *text; /* If text is NULL, row shouldn't be. */
- GnomeCanvasItem *rect; /* What the heck. Why not. */
-
- gdouble width;
- gdouble height;
-
- ETableSelectionModel *selection;
-} ETableClickToAdd;
-
-typedef struct {
- GnomeCanvasGroupClass parent_class;
-
- /*
- * signals
- */
- void (*cursor_change) (ETableClickToAdd *etcta, gint row, gint col);
-} ETableClickToAddClass;
-
-GtkType e_table_click_to_add_get_type (void);
-
-void e_table_click_to_add_commit (ETableClickToAdd *etcta);
-
-#endif /* _E_TABLE_CLICK_TO_ADD_H_ */
diff --git a/widgets/e-table/e-table-col-dnd.h b/widgets/e-table/e-table-col-dnd.h
deleted file mode 100644
index c1c26175c7..0000000000
--- a/widgets/e-table/e-table-col-dnd.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef _E_TABLE_COL_DND_H_
-#define _E_TABLE_COL_DND_H_
-
-#define TARGET_ETABLE_COL_TYPE "application/x-etable-column-header"
-
-enum {
- TARGET_ETABLE_COL_HEADER
-};
-
-#endif /* _E_TABLE_COL_DND_H_ */
diff --git a/widgets/e-table/e-table-col.c b/widgets/e-table/e-table-col.c
deleted file mode 100644
index e767aa5567..0000000000
--- a/widgets/e-table/e-table-col.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-col.c: ETableCol implementation
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc
- */
-#include <config.h>
-#include <gtk/gtkobject.h>
-#include <gtk/gtksignal.h>
-#include "e-table-col.h"
-#include "e-util/e-util.h"
-
-#define PARENT_TYPE (gtk_object_get_type ())
-
-static GtkObjectClass *parent_class;
-
-
-enum {
- ARG_0,
- ARG_SORTABLE,
-};
-
-static void
-etc_destroy (GtkObject *object)
-{
- ETableCol *etc = E_TABLE_COL (object);
-
- gtk_object_unref (GTK_OBJECT(etc->ecell));
-
- if (etc->is_pixbuf)
- gdk_pixbuf_unref (etc->pixbuf);
- else
- g_free (etc->text);
-
- (*parent_class->destroy)(object);
-}
-
-
-static void
-etc_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableCol *etc = E_TABLE_COL (o);
-
- switch (arg_id){
- case ARG_SORTABLE:
- etc->sortable = GTK_VALUE_BOOL(*arg);
- break;
- }
-}
-
-static void
-etc_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableCol *etc = E_TABLE_COL (o);
-
- switch (arg_id){
- case ARG_SORTABLE:
- GTK_VALUE_BOOL(*arg) = etc->sortable;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_table_col_class_init (GtkObjectClass *object_class)
-{
- parent_class = gtk_type_class (PARENT_TYPE);
- object_class->destroy = etc_destroy;
- object_class->get_arg = etc_get_arg;
- object_class->set_arg = etc_set_arg;
-
- gtk_object_add_arg_type ("ETableCol::sortable",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SORTABLE);
-}
-
-static void
-e_table_col_init (ETableCol *etc)
-{
- etc->width = 0;
- etc->sortable = 1;
- etc->groupable = 1;
-}
-
-E_MAKE_TYPE(e_table_col, "ETableCol", ETableCol, e_table_col_class_init, e_table_col_init, PARENT_TYPE);
-
-ETableCol *
-e_table_col_new (int col_idx, const char *text, double expansion, int min_width,
- ECell *ecell, GCompareFunc compare, gboolean resizable)
-{
- ETableCol *etc;
-
- g_return_val_if_fail (expansion >= 0, NULL);
- g_return_val_if_fail (min_width >= 0, NULL);
- g_return_val_if_fail (compare != NULL, NULL);
-
- etc = gtk_type_new (E_TABLE_COL_TYPE);
-
- etc->is_pixbuf = FALSE;
-
- etc->col_idx = col_idx;
- etc->text = g_strdup (text);
- etc->pixbuf = NULL;
- etc->expansion = expansion;
- etc->min_width = min_width;
- etc->ecell = ecell;
- etc->compare = compare;
-
- etc->arrow = E_TABLE_COL_ARROW_NONE;
-
- etc->selected = 0;
- etc->resizeable = resizable;
-
- gtk_object_ref (GTK_OBJECT(etc->ecell));
-
- return etc;
-}
-
-ETableCol *
-e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf, double expansion, int min_width,
- ECell *ecell, GCompareFunc compare, gboolean resizable)
-{
- ETableCol *etc;
-
- g_return_val_if_fail (expansion >= 0, NULL);
- g_return_val_if_fail (min_width >= 0, NULL);
- g_return_val_if_fail (compare != NULL, NULL);
-
- etc = gtk_type_new (E_TABLE_COL_TYPE);
-
- etc->is_pixbuf = TRUE;
-
- etc->col_idx = col_idx;
- etc->text = NULL;
- etc->pixbuf = pixbuf;
- etc->expansion = expansion;
- etc->min_width = min_width;
- etc->ecell = ecell;
- etc->compare = compare;
-
- etc->arrow = E_TABLE_COL_ARROW_NONE;
-
- etc->selected = 0;
- etc->resizeable = resizable;
-
- gtk_object_ref (GTK_OBJECT(etc->ecell));
- gdk_pixbuf_ref (etc->pixbuf);
-
- return etc;
-}
-
-void
-e_table_col_set_arrow (ETableCol *col, ETableColArrow arrow)
-{
- col->arrow = arrow;
-}
-
-ETableColArrow
-e_table_col_get_arrow (ETableCol *col)
-{
- return col->arrow;
-}
-
-
diff --git a/widgets/e-table/e-table-col.h b/widgets/e-table/e-table-col.h
deleted file mode 100644
index 39aeb26ba9..0000000000
--- a/widgets/e-table/e-table-col.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_COL_H_
-#define _E_TABLE_COL_H_
-
-#include "e-cell.h"
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#define E_TABLE_COL_TYPE (e_table_col_get_type ())
-#define E_TABLE_COL(o) (GTK_CHECK_CAST ((o), E_TABLE_COL_TYPE, ETableCol))
-#define E_TABLE_COL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_COL_TYPE, ETableColClass))
-#define E_IS_TABLE_COL(o) (GTK_CHECK_TYPE ((o), E_TABLE_COL_TYPE))
-#define E_IS_TABLE_COL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_COL_TYPE))
-
-typedef struct _ETableCol ETableCol;
-typedef struct _ETableColClass ETableColClass;
-typedef enum _ETableColArrow ETableColArrow;
-
-enum _ETableColArrow {
- E_TABLE_COL_ARROW_NONE = 0,
- E_TABLE_COL_ARROW_UP,
- E_TABLE_COL_ARROW_DOWN
-};
-
-/*
- * Information about a single column
- */
-struct _ETableCol {
- GtkObject base;
- char *text;
- GdkPixbuf *pixbuf;
- int min_width;
- int width;
- double expansion;
- short x;
- GCompareFunc compare;
- unsigned int is_pixbuf:1;
- unsigned int selected:1;
- unsigned int resizeable:1;
- unsigned int sortable:1;
- unsigned int groupable:1;
- int col_idx;
-
- ETableColArrow arrow;
-
- ECell *ecell;
-};
-
-struct _ETableColClass {
- GtkObjectClass parent_class;
-};
-
-GtkType e_table_col_get_type (void);
-ETableCol *e_table_col_new (int col_idx, const char *text,
- double expansion, int min_width,
- ECell *ecell, GCompareFunc compare,
- gboolean resizable);
-ETableCol *e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf,
- double expansion, int min_width,
- ECell *ecell, GCompareFunc compare,
- gboolean resizable);
-void e_table_col_destroy (ETableCol *etc);
-void e_table_col_set_arrow (ETableCol *col, ETableColArrow arrow);
-ETableColArrow e_table_col_get_arrow (ETableCol *col);
-
-
-#endif /* _E_TABLE_COL_H_ */
-
diff --git a/widgets/e-table/e-table-column-model.h b/widgets/e-table/e-table-column-model.h
deleted file mode 100644
index 043dd783ca..0000000000
--- a/widgets/e-table/e-table-column-model.h
+++ /dev/null
@@ -1,5 +0,0 @@
-
-class ETableColumnModel {
- virtual void add_column (ETableCol *et) = 0;
- virtual ETableCol *get_column (int column);
- virtual
diff --git a/widgets/e-table/e-table-column.c b/widgets/e-table/e-table-column.c
deleted file mode 100644
index d17a285321..0000000000
--- a/widgets/e-table/e-table-column.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * e-table-column.c: TableColumn implementation
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc
- */
-#include <config.h>
-#include "e-table-column.h"
-
-enum {
- STRUCTURE_CHANGE,
- DIMENSION_CHANGE,
- LAST_SIGNAL
-};
-
-static guint etc_signals [LAST_SIGNAL] = { 0, };
-
-static GtkObjectClass *e_table_column_parent_class;
-
-static void
-e_table_column_destroy (GtkObject *object)
-{
- ETableColumn *etc = E_TABLE_COLUMN (object);
- const int cols = etc->col_count;
-
- /*
- * Destroy listeners
- */
- for (l = etc->listeners; l; l = l->next)
- g_free (l->data);
- g_slist_free (etc->listeners);
- etc->listeners = NULL;
-
- /*
- * Destroy columns
- */
- for (i = 0; i < cols; i++)
- e_table_column_remove (etc, i);
-
- if (e_table_column_parent_class->destroy)
- e_table_column_parent_class->destroy (object);
-}
-
-static void
-e_table_column_class_init (GtkObjectClass *object_class)
-{
- object_class->destroy = e_table_column_destroy;
-
- e_table_column_parent_class = (gtk_type_class (gtk_object_get_type ()));
-
- etc_signals [STRUCTURE_CHANGE] =
- gtk_signal_new ("structure_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableColumn, structure_change),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
- etc_signals [DIMENSION_CHANGE] =
- gtk_signal_new ("dimension_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableColumn, dimension_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, etc_signals, LAST_SIGNAL);
-}
-
-GtkType
-e_table_column_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableColumn",
- sizeof (ETableColumn),
- sizeof (ETableColumnClass),
- (GtkClassInitFunc) e_table_column_class_init,
- (GtkObjectInitFunc) NULL,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
-
-static void
-etc_do_insert (ETableColumn *etc, int pos, ETableCol *val)
-{
- memcpy (&etc->columns [pos+1], &etc->columns [pos],
- sizeof (ETableCol *) * (etc->col_count - pos));
- etc->columns [pos] = val;
-}
-
-void
-e_table_column_add_column (ETableColumn *etc, ETableCol *tc, int pos)
-{
- ETableCol **new_ptr;
-
- g_return_if_fail (etc != NULL);
- g_return_if_fail (E_IS_TABLE_COLUMN (etc));
- g_return_if_fail (tc != NULL);
- g_return_if_fail (pos >= 0 && pos < etc->col_count);
-
- if (pos == -1)
- pos = etc->col_count;
- etc->columns = g_realloc (etc->columns, sizeof (ETableCol *) * (etc->col_count + 1));
- etc_do_insert (etc, pos, tc);
- etc->col_count++;
-
- gtk_signal_emit (GTK_OBJECT (etc), etc_signals [STRUCTURE_CHANGE]);
-}
-
-ETableCol *
-e_table_column_get_column (ETableColumn *etc, int column)
-{
- g_return_val_if_fail (etc != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), NULL);
-
- if (column < 0)
- return NULL;
-
- if (column >= etc->col_count)
- return NULL;
-
- return etc->columns [column];
-}
-
-int
-e_table_column_count (ETableColumn *etc)
-{
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
- return etc->col_count;
-}
-
-int
-e_table_column_index (ETableColumn *etc, const char *identifier)
-{
- int i;
-
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
- g_return_val_if_fail (identifier != NULL, 0);
-
- for (i = 0; i < etc->col_count; i++){
- ETableCol *tc = etc->columns [i];
-
- if (strcmp (i->id, identifier) == 0)
- return i;
- }
-
- return -1;
-}
-
-int
-e_table_column_get_index_at (ETableColumn *etc, int x_offset)
-{
- int i, total;
-
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
- g_return_val_if_fail (identifier != NULL, 0);
-
- total = 0;
- for (i = 0; i < etc->col_count; i++){
- total += etc->columns [i]->width;
-
- if (x_offset < total)
- return i;
- }
-
- return -1;
-}
-
-ETableCol **
-e_table_column_get_columns (ETableColumn *etc)
-{
- ETableCol **ret;
- int i;
-
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
- ret = g_new (ETableCol *, etc->col_count + 1);
- memcpy (ret, etc->columns, sizeof (ETableCol *) * etc->col_count);
- ret [etc->col_count] = NULL;
-
- return ret;
-}
-
-gboolean
-e_table_column_selection_ok (ETableColumn *etc)
-{
- g_return_val_if_fail (etc != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), FALSE);
-
- return etc->selectable;
-}
-
-int
-ve_table_column_get_selected (ETableColumn *etc)
-{
- int i;
- int selected = 0;
-
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
- for (i = 0; i < etc->col_count; i++){
- if (etc->columns [i]->selected)
- selected++;
- }
-
- return selected;
-}
-
-int
-e_table_column_total_width (ETableColumn *etc)
-{
- int total;
-
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
- total = 0;
- for (i = 0; i < etc->col_count; i++)
- total += etc->columns [i].width;
-
- return total;
-}
-
-static void
-etc_do_remove (ETableColumn *etc, int idx)
-{
- memcpy (&etc->columns [idx], &etc->columns [idx+1],
- sizeof (ETableCol *) * etc->col_count - idx);
- etc->col_count--;
-}
-
-void
-e_table_column_move (ETableColumn *etc, int source_index, int target_index)
-{
- g_return_if_fail (etc != NULL);
- g_return_if_fail (E_IS_TABLE_COLUMN (etc));
- g_return_if_fail (source_index >= 0);
- g_return_if_fail (target_index >= 0);
- g_return_if_fail (source_index < etc->col_count);
- g_return_if_fail (target_index < etc->col_count);
-
- old = etc->columns [source_index];
- etc_do_remove (etc, source_index);
- etc_do_insert (etc, target_index, old);
- gtk_signal_emit (GTK_OBJECT (etc), etc_signals [STRUCTURE_CHANGE]);
-}
-
-void
-e_table_column_remove (ETableColumn *etc, int idx)
-{
- g_return_if_fail (etc != NULL);
- g_return_if_fail (E_IS_TABLE_COLUMN (etc));
- g_return_if_fail (idx >= 0);
- g_return_if_fail (idx < etc->col_count);
-
- etc_do_remove (etc, idx);
- gtk_signal_emit (GTK_OBJECT (etc), etc_signals [STRUCTURE_CHANGE]);
-}
-
-void
-e_table_column_set_selection (ETableColumn *etc, gboolean allow_selection);
-{
-}
-
-void
-e_table_column_set_size (ETableColumn *etc, int idx, int size)
-{
- g_return_if_fail (etc != NULL);
- g_return_if_fail (E_IS_TABLE_COLUMN (etc));
- g_return_if_fail (idx >= 0);
- g_return_if_fail (idx < etc->col_count);
- g_return_if_fail (size > 0);
-
- etc->columns [idx]->width = size;
- gtk_signal_emit (GTK_OBJECT (etc), etc_signals [SIZE_CHANGE], idx);
-}
diff --git a/widgets/e-table/e-table-config.c b/widgets/e-table/e-table-config.c
deleted file mode 100644
index 5d078f8f86..0000000000
--- a/widgets/e-table/e-table-config.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table.c: A graphical view of a Table.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, Helix Code, Inc
- */
-#include <config.h>
-#include <gnome.h>
-#include <glade/glade.h>
-#include <gnome-xml/xmlmemory.h>
-#include "e-util/e-util.h"
-#include "e-util/e-xml-utils.h"
-#include "e-util/e-canvas.h"
-#include "e-table.h"
-#include "e-table-header-item.h"
-#include "e-table-subset.h"
-#include "e-table-item.h"
-#include "e-table-group.h"
-#include "e-table-config.h"
-
-typedef struct {
- GladeXML *gui;
- char *old_spec;
-} ConfigData;
-
-static void
-load_data (GladeXML *xml, char *label_widget, const char *content)
-{
- GtkLabel *label = GTK_LABEL (glade_xml_get_widget (xml, label_widget));
-
- gtk_label_set_text (label, content);
-}
-
-static char *
-get_fields (ETable *etable, xmlNode *xmlRoot)
-{
- xmlNode *xmlColumns;
- xmlNode *column;
- GString *res;
- char *s;
-
- res = g_string_new ("");
- xmlColumns = e_xml_get_child_by_name (xmlRoot, "columns-shown");
-
- for (column = xmlColumns->childs; column; column = column->next){
- ETableCol *ecol;
- char *content;
- int col;
-
- content = xmlNodeListGetString (column->doc, column->childs, 1);
- col = atoi (content);
- xmlFree (content);
-
- ecol = e_table_header_get_column (etable->header, col);
-
- g_string_append (res, ecol->text);
- if (column->next)
- g_string_append (res, ", ");
- }
- s = res->str;
- g_string_free (res, FALSE);
-
- return s;
-}
-
-static char *
-get_grouping (ETable *etable, xmlNode *xmlRoot)
-{
- xmlNode *xmlGrouping;
- GString *res;
- char *s;
-
- res = g_string_new ("");
- xmlGrouping = e_xml_get_child_by_name (xmlRoot, "grouping");
-
- s = res->str;
- g_string_free (res, FALSE);
-
- return s;
-}
-
-static char *
-get_sort (ETable *etable)
-{
- return g_strdup ("None");
-}
-
-static char *
-get_filter (ETable *etable)
-{
- return g_strdup ("None");
-}
-
-/*
- * Loads a user-readable definition of the various e-table parameters
- * into the dialog for configuring it
- */
-static void
-load_label_data (GladeXML *gui, ETable *etable)
-{
- /* FIXME: Set this to the right value. */
- xmlNode *xmlRoot = NULL;
- char *s;
-
-/* xmlRoot = xmlDocGetRootElement (etable->specification); */
-
- s = get_fields (etable, xmlRoot);
- load_data (gui, "label1", s);
- g_free (s);
-
- s = get_grouping (etable, xmlRoot);
- load_data (gui, "label2", s);
- g_free (s);
-
- s = get_sort (etable);
- load_data (gui, "label3", s);
- g_free (s);
-
- s = get_filter (etable);
- load_data (gui, "label4", s);
- g_free (s);
-}
-
-static void
-cb_button_fields (GtkWidget *widget, ETable *etable)
-{
-}
-
-static void
-cb_button_grouping (GtkWidget *widget, ETable *etable)
-{
-}
-
-static void
-cb_button_sort (GtkWidget *widget, ETable *etable)
-{
-}
-
-static void
-cb_button_filter (GtkWidget *widget, ETable *etable)
-{
-}
-
-GnomeDialog *
-e_table_gui_config (ETable *etable)
-{
- GladeXML *gui;
- GnomeDialog *dialog;
- ConfigData *config_data;
-
- glade_gnome_init ();
- gui = glade_xml_new (ETABLE_GLADEDIR "/e-table-config.glade", NULL);
- if (!gui)
- return NULL;
-
- dialog = GNOME_DIALOG (glade_xml_get_widget (gui, "e-table-config"));
-
- gtk_signal_connect (
- GTK_OBJECT (glade_xml_get_widget (gui, "button-fields")),
- "clicked", GTK_SIGNAL_FUNC (cb_button_fields), etable);
- gtk_signal_connect (
- GTK_OBJECT (glade_xml_get_widget (gui, "button-grouping")),
- "clicked", GTK_SIGNAL_FUNC (cb_button_grouping), etable);
- gtk_signal_connect (
- GTK_OBJECT (glade_xml_get_widget (gui, "button-sort")),
- "clicked", GTK_SIGNAL_FUNC (cb_button_sort), etable);
- gtk_signal_connect (
- GTK_OBJECT (glade_xml_get_widget (gui, "button-filter")),
- "clicked", GTK_SIGNAL_FUNC (cb_button_filter), etable);
-
- load_label_data (gui, etable);
-
- config_data = g_new (ConfigData, 1);
- config_data->gui = gui;
- config_data->old_spec = e_table_get_specification (etable);
-
- gtk_object_set_data (
- GTK_OBJECT (dialog), "config-data",
- config_data);
-
- return dialog;
-}
-
-static void
-e_table_gui_destroy_config_data (GtkWidget *widget)
-{
- ConfigData *cd = gtk_object_get_data (GTK_OBJECT (widget), "config-data");
-
- g_free (cd->old_spec);
- gtk_object_destroy (GTK_OBJECT (cd->gui));
- g_free (cd);
-}
-
-void
-e_table_gui_config_accept (GtkWidget *widget, ETable *etable)
-{
- e_table_gui_destroy_config_data (widget);
-}
-
-void
-e_table_gui_config_cancel (GtkWidget *widget, ETable *etable)
-{
- e_table_gui_destroy_config_data (widget);
-}
-
-void
-e_table_do_gui_config (GtkWidget *parent, ETable *etable)
-{
- GnomeDialog *dialog;
- int r;
-
- dialog = GNOME_DIALOG (e_table_gui_config (etable));
- if (!dialog)
- return;
-
- if (parent)
- gnome_dialog_set_parent (dialog, GTK_WINDOW (parent));
-
- r = gnome_dialog_run (GNOME_DIALOG (dialog));
-
- if (r == -1 || r == 1)
- e_table_gui_config_cancel (GTK_WIDGET (dialog), etable);
- else
- e_table_gui_config_accept (GTK_WIDGET (dialog), etable);
-
- if (r != -1)
- gtk_object_destroy (GTK_OBJECT (dialog));
-}
-
-
diff --git a/widgets/e-table/e-table-config.glade b/widgets/e-table/e-table-config.glade
deleted file mode 100644
index 15223f21f1..0000000000
--- a/widgets/e-table/e-table-config.glade
+++ /dev/null
@@ -1,302 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>E-table</name>
- <program_name>e-table</program_name>
- <directory></directory>
- <source_directory></source_directory>
- <pixmaps_directory></pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>True</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-table-config.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>e-table-config</name>
- <visible>False</visible>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkFrame</class>
- <name>top-frame</name>
- <border_width>2</border_width>
- <label></label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table1</name>
- <border_width>2</border_width>
- <rows>4</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>2</row_spacing>
- <column_spacing>4</column_spacing>
-
- <widget>
- <class>GtkButton</class>
- <name>button-fields</name>
- <can_focus>True</can_focus>
- <label>Fields</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-grouping</name>
- <can_focus>True</can_focus>
- <label>Grouping</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-sort</name>
- <can_focus>True</can_focus>
- <label>Sort</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-filter</name>
- <can_focus>True</can_focus>
- <label>Filter</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label1</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label2</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label3</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label4</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area2</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>0</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button12</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button14</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/widgets/e-table/e-table-config.glade.h b/widgets/e-table/e-table-config.glade.h
deleted file mode 100644
index 4dc2ec8d31..0000000000
--- a/widgets/e-table/e-table-config.glade.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Fields");
-gchar *s = N_("Grouping");
-gchar *s = N_("Sort");
-gchar *s = N_("Filter");
diff --git a/widgets/e-table/e-table-config.h b/widgets/e-table/e-table-config.h
deleted file mode 100644
index 617ef6a331..0000000000
--- a/widgets/e-table/e-table-config.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef _E_TABLE_CONFIG_H
-#define _E_TABLE_CONFIG_H
-
-GnomeDialog *e_table_gui_config (ETable *etable);
-void e_table_do_gui_config (GtkWidget *, ETable *etable);
-
-void e_table_gui_config_accept (GtkWidget *widget, ETable *etable);
-void e_table_gui_config_cancel (GtkWidget *widget, ETable *etable);
-
-
-#endif /* _E_TABLE_CONFIG_H */
diff --git a/widgets/e-table/e-table-defines.h b/widgets/e-table/e-table-defines.h
deleted file mode 100644
index 9bb9e107ac..0000000000
--- a/widgets/e-table/e-table-defines.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __E_TABLE_DEFINES__
-#define __E_TABLE_DEFINES__ 1
-
-#define BUTTON_HEIGHT 10
-#define BUTTON_PADDING 2
-#define GROUP_INDENT (BUTTON_HEIGHT + (BUTTON_PADDING * 2))
-
-/* Padding above and below of the string in the header display */
-#define HEADER_PADDING 2
-
-#define MIN_ARROW_SIZE 10
-
-typedef void (*ETableForeachFunc) (int model_row,
- gpointer closure);
-
-#endif
diff --git a/widgets/e-table/e-table-example-1.c b/widgets/e-table/e-table-example-1.c
deleted file mode 100644
index 7c289778aa..0000000000
--- a/widgets/e-table/e-table-example-1.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* This code is GPL. */
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "table-test.h"
-
-/*
- * One way in which we make it simpler to build an ETableModel is through
- * the ETableSimple class. Instead of creating your own ETableModel
- * class, you simply create a new object of the ETableSimple class. You
- * give it a bunch of functions that act as callbacks.
- *
- * You also get to pass a void * to ETableSimple and it gets passed to
- * your callbacks. This would be for having multiple models of the same
- * type. This is just an example though, so we statically define all the
- * data and ignore the void *data parameter.
- *
- * In our example we will be creating a table model with 6 columns and 10
- * rows. This corresponds to having 6 different types of information and
- * 10 different sets of data in our database.
- *
- * The headers will be hard coded, as will be the example data.
- *
- */
-
-/*
- * There are two different meanings to the word "column". The first is
- * the model column. A model column corresponds to a specific type of
- * data. This is very much like the usage in a database table where a
- * column is a field in the database.
- *
- * The second type of column is a view column. A view column
- * corresponds to a visually displayed column. Each view column
- * corresponds to a specific model column, though a model column may
- * have any number of view columns associated with it, from zero to
- * greater than one.
- *
- * Also, a view column doesn't necessarily depend on only one model
- * column. In some cases, the view column renderer can be given a
- * reference to another column to get extra information about its
- * display.
-*/
-
-#define ROWS 10
-#define COLS 4
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/*
- * Here we define the initial layout of the table. This is an xml
- * format that allows you to change the initial ordering of the
- * columns or to do sorting or grouping initially. This specification
- * shows all 5 columns, but moves the importance column nearer to the
- * front. It also sorts by the "Full Name" column (ascending.)
- * Sorting and grouping take the model column as their arguments
- * (sorting is specified by the "column" argument to the leaf elemnt.
- */
-
-#define INITIAL_SPEC "<ETableSpecification> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 4 </column> \
- <column> 1 </column> \
- <column> 2 </column> \
- <column> 3 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-char *headers [COLS] = {
- "Email",
- "Full Name",
- "Address",
- "Phone"
-};
-
-/*
- * Virtual Column list:
- * 0 Email
- * 1 Full Name
- * 2 Address
- * 3 Phone
- */
-
-char *table_data [ROWS] [COLS];
-
-/*
- * ETableSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/*
- * Since our model is a constant size, we can just return its size in
- * the column and row count fields.
- */
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-my_col_count (ETableModel *etc, void *data)
-{
- return COLS;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-my_row_count (ETableModel *etc, void *data)
-{
- return ROWS;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-my_value_at (ETableModel *etc, int col, int row, void *data)
-{
- return (void *) table_data [row] [col];
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-my_set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
- g_free (table_data [row] [col]);
- table_data [row] [col] = g_strdup (val);
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-my_is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- return TRUE;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-my_duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup (value);
-}
-
-/* This function frees the value passed to it. */
-static void
-my_free_value (ETableModel *etc, int col, void *value, void *data)
-{
- g_free (value);
-}
-
-/* This function creates an empty value. */
-static void *
-my_initialize_value (ETableModel *etc, int col, void *data)
-{
- return g_strdup ("");
-}
-
-/* This function reports if a value is empty. */
-static gboolean
-my_value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- return !(value && *(char *)value);
-}
-
-/* This function reports if a value is empty. */
-static char *
-my_value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup(value);
-}
-
-/* We create a window containing our new table. */
-static void
-create_table (void)
-{
- GtkWidget *e_table, *window, *frame;
- ECell *cell_left_just;
- ETableHeader *e_table_header;
- int i, j;
- ETableModel *e_table_model = NULL;
-
- /* First we fill in the simple data. */
- for (i = 0; i < ROWS; i++){
- for (j = 0; j < COLS; j++)
- table_data [i] [j] = g_strdup ("");
- }
- /* Next we create our model. This uses the functions we defined
- earlier. */
- e_table_model = e_table_simple_new (
- my_col_count, my_row_count, my_value_at,
- my_set_value_at, my_is_cell_editable,
- my_duplicate_value, my_free_value,
- my_initialize_value, my_value_is_empty,
- my_value_to_string,
- NULL);
- /*
- * Next we create a header. The ETableHeader is used in two
- * different way. The first is the full_header. This is the
- * list of possible columns in the view. The second use is
- * completely internal. Many of the ETableHeader functions are
- * for that purpose. The only functions we really need are
- * e_table_header_new and e_table_header_add_col.
- *
- * First we create the header.
- */
- e_table_header = e_table_header_new ();
-
- /*
- * Next we have to build renderers for all of the columns.
- * Since all our columns are text columns, we can simply use
- * the same renderer over and over again. If we had different
- * types of columns, we could use a different renderer for
- * each column.
- */
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- /*
- * Next we create a column object for each view column and add
- * them to the header. We don't create a column object for
- * the importance column since it will not be shown.
- */
- for (i = 0; i < COLS; i++) {
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, headers [i],
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /*
- * Here we create a window for our new table. This window
- * will get shown and the person will be able to test their
- * item.
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
- /* This frame is simply to get a bevel around our table. */
- frame = gtk_frame_new (NULL);
-
- /*
- * 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.
- */
- e_table = e_table_new (e_table_header, e_table_model, INITIAL_SPEC);
-
- /* Build the gtk widget hierarchy. */
- gtk_container_add (GTK_CONTAINER (frame), e_table);
- gtk_container_add (GTK_CONTAINER (window), frame);
-
- /* Size the initial window. */
- gtk_widget_set_usize (window, 200, 200);
-
- /* Show it all. */
- gtk_widget_show_all (window);
-}
-
-/* This is the main function which just initializes gnome and call our create_table function */
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- create_table ();
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
-
diff --git a/widgets/e-table/e-table-example-2.c b/widgets/e-table/e-table-example-2.c
deleted file mode 100644
index e9d8d9ea80..0000000000
--- a/widgets/e-table/e-table-example-2.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* This code is GPL. */
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "table-test.h"
-
-/*
-One way in which we make it simpler to build an ETableModel is through
-the ETableSimple class. Instead of creating your own ETableModel
-class, you simply create a new object of the ETableSimple class. You
-give it a bunch of functions that act as callbacks.
-
-You also get to pass a void * to ETableSimple and it gets passed to
-your callbacks. This would be for having multiple models of the same
-type. This is just an example though, so we statically define all the
-data and ignore the void *data parameter.
-
-In our example we will be creating a table model with 6 columns and 10
-rows. This corresponds to having 6 different types of information and
-10 different sets of data in our database.
-
-The headers will be hard coded, as will be the example data.
-
-*/
-
-/*
- There are two different meanings to the word "column". The first is
- the model column. A model column corresponds to a specific type of
- data. This is very much like the usage in a database table where a
- column is a field in the database.
-
- The second type of column is a view column. A view column
- corresponds to a visually displayed column. Each view column
- corresponds to a specific model column, though a model column may
- have any number of view columns associated with it, from zero to
- greater than one.
-
- Also, a view column doesn't necessarily depend on only one model
- column. In some cases, the view column renderer can be given a
- reference to another column to get extra information about its
- display.
-*/
-
-#define ROWS 10
-#define VIEW_COLS 4
-#define PHYSICAL_COLS 5
-#define VIRTUAL_COLS 6
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/* Here we define the initial layout of the table. This is an xml
- format that allows you to change the initial ordering of the
- columns or to do sorting or grouping initially. This specification
- shows all 5 columns, but moves the importance column nearer to the
- front. It also sorts by the "Full Name" column (ascending.)
- Sorting and grouping take the model column as their arguments
- (sorting is specified by the "column" argument to the leaf elemnt. */
-#define INITIAL_SPEC "<ETableSpecification> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 4 </column> \
- <column> 1 </column> \
- <column> 2 </column> \
- <column> 3 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-char *headers[VIEW_COLS] = {
- "Email",
- "Full Name",
- "Address",
- "Phone"
-};
-
-/* Virtual Column list:
- 0 Full Name
- 1 Email
- 2 Address
- 3 Phone
- 4 Importance field. This field will be a boolean. It also has a
- special header, so doesn't appear in the headers list.
- 5 Color field. This column is also not displayed. It is also
- not stored in the database. It's calculated based on the
- Importance field.
-*/
-
-char *table_data[ROWS][VIEW_COLS];
-gboolean importance_data[ROWS];
-
-/*
- * ETableSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/* Since our model is a constant size, we can just return its size in
- the column and row count fields. */
-
-static GdkColor *color1;
-static GdkColor *color2;
-
-static int
-my_col_count (ETableModel *etc, void *data)
-{
- return VIRTUAL_COLS;
-}
-
-static int
-my_row_count (ETableModel *etc, void *data)
-{
- return ROWS;
-}
-
-static void *
-my_value_at (ETableModel *etc, int col, int row, void *data)
-{
- if (col == COLOR_COLUMN){
- if (importance_data[row]){
- return color1;
- } else {
- return color2;
- }
- } else if (col == IMPORTANCE_COLUMN){
- return (gpointer) importance_data[row];
- } else {
- return (void *) table_data [row][col];
- }
-}
-
-static void
-my_set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
- if (col == COLOR_COLUMN){
- } else if (col == IMPORTANCE_COLUMN){
- importance_data[row] = (gboolean) val;
- } else {
- g_free (table_data [row][col]);
- table_data [row][col] = g_strdup (val);
- }
-}
-
-static gboolean
-my_is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- if (col == IMPORTANCE_COLUMN)
- return FALSE;
- else
- return TRUE;
-}
-
-static void *
-my_duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == COLOR_COLUMN){
- return (void *) value;
- } else if (col == IMPORTANCE_COLUMN){
- return (void *) value;
- } else {
- return g_strdup (value);
- }
-}
-
-static void
-my_free_value (ETableModel *etc, int col, void *value, void *data)
-{
- if (col == COLOR_COLUMN){
- } else if (col == IMPORTANCE_COLUMN){
- } else {
- g_free (value);
- }
-}
-
-static void *
-my_initialize_value (ETableModel *etc, int col, void *data)
-{
- if (col == COLOR_COLUMN){
- return NULL;
- } else if (col == IMPORTANCE_COLUMN){
- return NULL;
- } else {
- return g_strdup ("");
- }
-}
-
-static gboolean
-my_value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == COLOR_COLUMN){
- return value == NULL;
- } else if (col == IMPORTANCE_COLUMN){
- return value == NULL;
- } else {
- return !(value && *(char *)value);
- }
-}
-
-static char *
-my_value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == COLOR_COLUMN){
- return g_strdup_printf("%d", (int) value);
- } else if (col == IMPORTANCE_COLUMN){
- return g_strdup_printf("%d", (int) value);
- } else {
- return g_strdup(value);
- }
-}
-
-/* We create a window containing our new table. */
-static void
-create_table ()
-{
- GtkWidget *e_table, *window, *frame;
- ECell *cell_left_just;
- ECell *cell_checkbox;
- ETableHeader *e_table_header;
- int i, j;
- ETableModel *e_table_model = NULL;
- ETableCol *ecol;
- GdkPixbuf *pixbuf;
-
- /* First we fill in the simple data. */
- for (i = 0; i < ROWS; i++){
- for (j = 0; j < VIEW_COLS; j++){
- table_data[i][j] = g_strdup ("");
- }
- importance_data[i] = FALSE;
- }
- /* Next we create our model. This uses the functions we defined
- earlier. */
- e_table_model = e_table_simple_new (
- my_col_count, my_row_count, my_value_at,
- my_set_value_at, my_is_cell_editable,
- my_duplicate_value, my_free_value,
- my_initialize_value, my_value_is_empty,
- my_value_to_string,
- NULL);
- /*
- Next we create a header. The ETableHeader is used in two
- different way. The first is the full_header. This is the
- list of possible columns in the view. The second use is
- completely internal. Many of the ETableHeader functions are
- for that purpose. The only functions we really need are
- e_table_header_new and e_table_header_add_col.
-
- First we create the header. */
- e_table_header = e_table_header_new ();
-
- /* Next we have to build renderers for all of the columns.
- Since all our columns are text columns, we can simply use
- the same renderer over and over again. If we had different
- types of columns, we could use a different renderer for
- each column. */
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- /* Next we create a column object for each view column and add
- them to the header. We don't create a column object for
- the importance column since it will not be shown. */
- for (i = 0; i < VIEW_COLS; i++){
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, headers [i],
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /* Next we add a special column for the check box. */
-
- cell_checkbox = e_cell_checkbox_new ();
- pixbuf = gdk_pixbuf_new_from_file ("clip.png");
- ecol = e_table_col_new_with_pixbuf (i, pixbuf, 0.0, 18, cell_checkbox, g_int_compare, TRUE);
- e_table_header_add_column (e_table_header, ecol, i);
-
- /*
- * Setup GUI
- */
- /* Here we create a window for our new table. This window
- will get shown and the person will be able to test their
- item. */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- /* This frame is simply to get a bevel around our table. */
- frame = gtk_frame_new (NULL);
- /* 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. */
- e_table = e_table_new (e_table_header, e_table_model, INITIAL_SPEC);
-
- /* Build the gtk widget hierarchy. */
- gtk_container_add (GTK_CONTAINER (frame), e_table);
- gtk_container_add (GTK_CONTAINER (window), frame);
-
- /* Size the initial window. */
- gtk_widget_set_usize (window, 200, 200);
- /* Show it all. */
- gtk_widget_show_all (window);
-}
-
-
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- create_table ();
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
diff --git a/widgets/e-table/e-table-field-chooser-dialog.c b/widgets/e-table/e-table-field-chooser-dialog.c
deleted file mode 100644
index b54c57e80e..0000000000
--- a/widgets/e-table/e-table-field-chooser-dialog.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-field-chooser-dialog.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-table-field-chooser-dialog.h>
-
-static void e_table_field_chooser_dialog_init (ETableFieldChooserDialog *card);
-static void e_table_field_chooser_dialog_class_init (ETableFieldChooserDialogClass *klass);
-static void e_table_field_chooser_dialog_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_table_field_chooser_dialog_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_table_field_chooser_dialog_destroy (GtkObject *object);
-static void e_table_field_chooser_dialog_clicked (GnomeDialog *dialog, gint button);
-
-static GnomeDialogClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_DND_CODE,
- ARG_FULL_HEADER,
-};
-
-GtkType
-e_table_field_chooser_dialog_get_type (void)
-{
- static GtkType table_field_chooser_dialog_type = 0;
-
- if (!table_field_chooser_dialog_type)
- {
- static const GtkTypeInfo table_field_chooser_dialog_info =
- {
- "ETableFieldChooserDialog",
- sizeof (ETableFieldChooserDialog),
- sizeof (ETableFieldChooserDialogClass),
- (GtkClassInitFunc) e_table_field_chooser_dialog_class_init,
- (GtkObjectInitFunc) e_table_field_chooser_dialog_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- table_field_chooser_dialog_type = gtk_type_unique (gnome_dialog_get_type (), &table_field_chooser_dialog_info);
- }
-
- return table_field_chooser_dialog_type;
-}
-
-static void
-e_table_field_chooser_dialog_class_init (ETableFieldChooserDialogClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeDialogClass *dialog_class;
-
- object_class = (GtkObjectClass*) klass;
- dialog_class = GNOME_DIALOG_CLASS (klass);
-
- parent_class = gtk_type_class (gnome_dialog_get_type ());
-
- object_class->destroy = e_table_field_chooser_dialog_destroy;
- object_class->set_arg = e_table_field_chooser_dialog_set_arg;
- object_class->get_arg = e_table_field_chooser_dialog_get_arg;
-
- dialog_class->clicked = e_table_field_chooser_dialog_clicked;
-
- gtk_object_add_arg_type ("ETableFieldChooserDialog::dnd_code", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_DND_CODE);
- gtk_object_add_arg_type ("ETableFieldChooserDialog::full_header", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_FULL_HEADER);
-}
-
-static void
-e_table_field_chooser_dialog_init (ETableFieldChooserDialog *e_table_field_chooser_dialog)
-{
- GtkWidget *widget;
-
- e_table_field_chooser_dialog->etfc = NULL;
- e_table_field_chooser_dialog->dnd_code = g_strdup("");
- e_table_field_chooser_dialog->full_header = NULL;
-
- gnome_dialog_append_buttons(GNOME_DIALOG(e_table_field_chooser_dialog),
- GNOME_STOCK_BUTTON_CLOSE,
- NULL);
-
- gtk_window_set_policy(GTK_WINDOW(e_table_field_chooser_dialog), FALSE, TRUE, FALSE);
-
- widget = e_table_field_chooser_new();
- e_table_field_chooser_dialog->etfc = E_TABLE_FIELD_CHOOSER(widget);
-
- gtk_object_set(GTK_OBJECT(widget),
- "dnd_code", e_table_field_chooser_dialog->dnd_code,
- "full_header", e_table_field_chooser_dialog->full_header,
- NULL);
-
- gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(e_table_field_chooser_dialog)->vbox),
- widget, TRUE, TRUE, 0);
-
- gtk_widget_show(GTK_WIDGET(widget));
-}
-
-GtkWidget*
-e_table_field_chooser_dialog_new (void)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_table_field_chooser_dialog_get_type ()));
- return widget;
-}
-
-static void
-e_table_field_chooser_dialog_destroy (GtkObject *object)
-{
- ETableFieldChooserDialog *etfcd = E_TABLE_FIELD_CHOOSER_DIALOG (object);
- g_free(etfcd->dnd_code);
- if (etfcd->full_header)
- gtk_object_unref(GTK_OBJECT(etfcd->full_header));
-}
-
-static void
-e_table_field_chooser_dialog_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableFieldChooserDialog *etfcd = E_TABLE_FIELD_CHOOSER_DIALOG(object);
- switch (arg_id){
- case ARG_DND_CODE:
- g_free(etfcd->dnd_code);
- etfcd->dnd_code = g_strdup(GTK_VALUE_STRING (*arg));
- if (etfcd->etfc)
- gtk_object_set(GTK_OBJECT(etfcd->etfc),
- "dnd_code", etfcd->dnd_code,
- NULL);
- break;
- case ARG_FULL_HEADER:
- if (etfcd->full_header)
- gtk_object_unref(GTK_OBJECT(etfcd->full_header));
- if (GTK_VALUE_OBJECT(*arg))
- etfcd->full_header = E_TABLE_HEADER(GTK_VALUE_OBJECT(*arg));
- else
- etfcd->full_header = NULL;
- if (etfcd->full_header)
- gtk_object_ref(GTK_OBJECT(etfcd->full_header));
- if (etfcd->etfc)
- gtk_object_set(GTK_OBJECT(etfcd->etfc),
- "full_header", etfcd->full_header,
- NULL);
- break;
- default:
- break;
- }
-}
-
-static void
-e_table_field_chooser_dialog_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableFieldChooserDialog *etfcd = E_TABLE_FIELD_CHOOSER_DIALOG(object);
- switch (arg_id) {
- case ARG_DND_CODE:
- GTK_VALUE_STRING (*arg) = g_strdup (etfcd->dnd_code);
- break;
- case ARG_FULL_HEADER:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etfcd->full_header);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_table_field_chooser_dialog_clicked (GnomeDialog *dialog, int button)
-{
- if (button == 0)
- gnome_dialog_close(dialog);
-}
diff --git a/widgets/e-table/e-table-field-chooser-dialog.h b/widgets/e-table/e-table-field-chooser-dialog.h
deleted file mode 100644
index c209210dda..0000000000
--- a/widgets/e-table/e-table-field-chooser-dialog.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-table-field-chooser-dialog.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_TABLE_FIELD_CHOOSER_DIALOG_H__
-#define __E_TABLE_FIELD_CHOOSER_DIALOG_H__
-
-#include <gnome.h>
-#include <glade/glade.h>
-#include "e-table-field-chooser.h"
-#include "e-table-header.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETableFieldChooserDialog - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- */
-
-#define E_TABLE_FIELD_CHOOSER_DIALOG_TYPE (e_table_field_chooser_dialog_get_type ())
-#define E_TABLE_FIELD_CHOOSER_DIALOG(obj) (GTK_CHECK_CAST ((obj), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE, ETableFieldChooserDialog))
-#define E_TABLE_FIELD_CHOOSER_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE, ETableFieldChooserDialogClass))
-#define E_IS_TABLE_FIELD_CHOOSER_DIALOG(obj) (GTK_CHECK_TYPE ((obj), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE))
-#define E_IS_TABLE_FIELD_CHOOSER_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE))
-
-
-typedef struct _ETableFieldChooserDialog ETableFieldChooserDialog;
-typedef struct _ETableFieldChooserDialogClass ETableFieldChooserDialogClass;
-
-struct _ETableFieldChooserDialog
-{
- GnomeDialog parent;
-
- /* item specific fields */
- ETableFieldChooser *etfc;
- gchar *dnd_code;
- ETableHeader *full_header;
-};
-
-struct _ETableFieldChooserDialogClass
-{
- GnomeDialogClass parent_class;
-};
-
-
-GtkWidget *e_table_field_chooser_dialog_new(void);
-GtkType e_table_field_chooser_dialog_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TABLE_FIELD_CHOOSER_DIALOG_H__ */
diff --git a/widgets/e-table/e-table-field-chooser-item.c b/widgets/e-table/e-table-field-chooser-item.c
deleted file mode 100644
index e23fc4c9f5..0000000000
--- a/widgets/e-table/e-table-field-chooser-item.c
+++ /dev/null
@@ -1,566 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-column-view.c: A canvas item based view of the ETableColumn.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkdnd.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <libgnomeui/gnome-canvas-util.h>
-#include <libgnomeui/gnome-canvas-polygon.h>
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "e-util/e-xml-utils.h"
-#include "e-util/e-canvas.h"
-
-#include "e-table-header.h"
-#include "e-table-col-dnd.h"
-#include "e-table-defines.h"
-
-#include "e-table-field-chooser-item.h"
-
-#if 0
-enum {
- BUTTON_PRESSED,
- LAST_SIGNAL
-};
-
-static guint etfci_signals [LAST_SIGNAL] = { 0, };
-#endif
-
-#define PARENT_OBJECT_TYPE gnome_canvas_item_get_type ()
-
-#define ELEMENTS(x) (sizeof (x) / sizeof (x[0]))
-
-static GnomeCanvasItemClass *etfci_parent_class;
-
-static void etfci_drop_table_header (ETableFieldChooserItem *etfci);
-
-enum {
- ARG_0,
- ARG_FULL_HEADER,
- ARG_DND_CODE,
- ARG_WIDTH,
- ARG_HEIGHT,
-};
-
-static void
-etfci_destroy (GtkObject *object){
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (object);
-
- etfci_drop_table_header (etfci);
-
- gdk_font_unref(etfci->font);
-
- if (GTK_OBJECT_CLASS (etfci_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (etfci_parent_class)->destroy) (object);
-}
-
-static void
-etfci_reflow (GnomeCanvasItem *item, gint flags)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
- double old_height;
-
- old_height = etfci->height;
-
- etfci->height = e_table_header_count (etfci->full_header) * etfci->button_height;
-
- if (old_height != etfci->height)
- e_canvas_item_request_parent_reflow(item);
-
- gnome_canvas_item_request_update(item);
-}
-
-static void
-etfci_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
- double i2c [6];
- ArtPoint c1, c2, i1, i2;
-
- if (GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->update)
- (*GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->update)(item, affine, clip_path, flags);
-
- i1.x = i1.y = 0;
- i2.x = etfci->width;
- i2.y = etfci->height;
-
- gnome_canvas_item_i2c_affine (item, i2c);
- art_affine_point (&c1, &i1, i2c);
- art_affine_point (&c2, &i2, i2c);
-
- if (item->x1 != c1.x ||
- item->y1 != c1.y ||
- item->x2 != c2.x ||
- item->y2 != c2.y)
- {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- item->x1 = c1.x;
- item->y1 = c1.y;
- item->x2 = c2.x;
- item->y2 = c2.y;
-
- gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item);
- }
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
-}
-
-static void
-etfci_font_load (ETableFieldChooserItem *etfci, char *font)
-{
- if (etfci->font)
- gdk_font_unref (etfci->font);
- etfci->font = NULL;
-
- if (font)
- etfci->font = gdk_fontset_load (font);
-
- if (etfci->font == NULL) {
- etfci->font = GTK_WIDGET(GNOME_CANVAS_ITEM(etfci)->canvas)->style->font;
- gdk_font_ref(etfci->font);
- }
-
- etfci->button_height = etfci->font->ascent + etfci->font->descent + HEADER_PADDING;
-}
-
-static void
-etfci_drop_table_header (ETableFieldChooserItem *etfci)
-{
- GtkObject *header;
-
- if (!etfci->full_header)
- return;
-
- header = GTK_OBJECT (etfci->full_header);
- if (etfci->structure_change_id)
- gtk_signal_disconnect (header, etfci->structure_change_id);
- if (etfci->dimension_change_id)
- gtk_signal_disconnect (header, etfci->dimension_change_id);
- etfci->structure_change_id = 0;
- etfci->dimension_change_id = 0;
-
- if (header)
- gtk_object_unref (header);
- etfci->full_header = NULL;
- etfci->height = 0;
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-structure_changed (ETableHeader *header, ETableFieldChooserItem *etfci)
-{
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-dimension_changed (ETableHeader *header, int col, ETableFieldChooserItem *etfci)
-{
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_add_table_header (ETableFieldChooserItem *etfci, ETableHeader *header)
-{
- etfci->full_header = header;
- gtk_object_ref (GTK_OBJECT (etfci->full_header));
-
- etfci->structure_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "structure_change",
- GTK_SIGNAL_FUNC(structure_changed), etfci);
- etfci->dimension_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "dimension_change",
- GTK_SIGNAL_FUNC(dimension_changed), etfci);
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableFieldChooserItem *etfci;
-
- item = GNOME_CANVAS_ITEM (o);
- etfci = E_TABLE_FIELD_CHOOSER_ITEM (o);
-
- switch (arg_id){
- case ARG_FULL_HEADER:
- etfci_drop_table_header (etfci);
- if (GTK_VALUE_OBJECT (*arg))
- etfci_add_table_header (etfci, E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg)));
- break;
-
- case ARG_DND_CODE:
- g_free(etfci->dnd_code);
- etfci->dnd_code = g_strdup(GTK_VALUE_STRING (*arg));
- break;
-
- case ARG_WIDTH:
- etfci->width = GTK_VALUE_DOUBLE (*arg);
- gnome_canvas_item_request_update(item);
- break;
- }
-}
-
-static void
-etfci_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableFieldChooserItem *etfci;
-
- item = GNOME_CANVAS_ITEM (o);
- etfci = E_TABLE_FIELD_CHOOSER_ITEM (o);
-
- switch (arg_id){
-
- case ARG_DND_CODE:
- GTK_VALUE_STRING (*arg) = g_strdup (etfci->dnd_code);
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = etfci->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = etfci->height;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-etfci_drag_data_get (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETableFieldChooserItem *etfci)
-{
- if (etfci->drag_col != -1) {
- gchar *string = g_strdup_printf("%d", etfci->drag_col);
- gtk_selection_data_set(selection_data,
- GDK_SELECTION_TYPE_STRING,
- sizeof(string[0]),
- string,
- strlen(string));
- g_free(string);
- }
-}
-
-static void
-etfci_drag_end (GtkWidget *canvas,
- GdkDragContext *context,
- ETableFieldChooserItem *etfci)
-{
- etfci->drag_col = -1;
-}
-
-static void
-etfci_realize (GnomeCanvasItem *item)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
- GdkWindow *window;
-
- if (GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)-> realize)
- (*GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->realize)(item);
-
- window = GTK_WIDGET (item->canvas)->window;
-
- if (!etfci->font)
- etfci_font_load (etfci, NULL);
-
- etfci->drag_end_id = gtk_signal_connect (
- GTK_OBJECT (item->canvas), "drag_end",
- GTK_SIGNAL_FUNC (etfci_drag_end), etfci);
- etfci->drag_data_get_id = gtk_signal_connect (
- GTK_OBJECT (item->canvas), "drag_data_get",
- GTK_SIGNAL_FUNC (etfci_drag_data_get), etfci);
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_unrealize (GnomeCanvasItem *item)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-
- if (etfci->font)
- gdk_font_unref (etfci->font);
- etfci->font = NULL;
-
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), etfci->drag_end_id);
- etfci->drag_end_id = 0;
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), etfci->drag_data_get_id);
- etfci->drag_data_get_id = 0;
-
- if (GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->unrealize)(item);
-}
-
-static void
-draw_button (ETableFieldChooserItem *etfci, ETableCol *col,
- GdkDrawable *drawable, GtkStyle *style,
- int x, int y, int width, int height)
-{
- GdkRectangle clip;
- int xtra;
- GdkRectangle area;
-
- GtkWidget *widget = GTK_WIDGET(GNOME_CANVAS_ITEM(etfci)->canvas);
-
- gdk_window_clear_area (drawable, x, y, width, height);
-
- area.x = x;
- area.y = y;
- area.width = width;
- area.height = height;
-
- gtk_paint_box (style, drawable,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT,
- &area, widget, "button",
- x, y, width, height);
-
- clip.x = x + HEADER_PADDING / 2;
- clip.y = y + HEADER_PADDING / 2;
- clip.width = width - HEADER_PADDING;
- clip.height = etfci->button_height;
-
- if (col->is_pixbuf){
- xtra = (clip.width - gdk_pixbuf_get_width (col->pixbuf))/2;
-
- xtra += HEADER_PADDING / 2;
-
- gdk_pixbuf_render_to_drawable_alpha (col->pixbuf,
- drawable,
- 0, 0,
- x + xtra, y + (clip.height - gdk_pixbuf_get_height (col->pixbuf)) / 2,
- gdk_pixbuf_get_width (col->pixbuf), gdk_pixbuf_get_height(col->pixbuf),
- GDK_PIXBUF_ALPHA_FULL, 128,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- } else {
- /* Center the thing */
- xtra = (clip.width - gdk_string_measure (etfci->font, col->text))/2;
-
- /* Skip over border */
- if (xtra < 0)
- xtra = 0;
-
- xtra += HEADER_PADDING / 2;
-
- gdk_draw_text (
- drawable, etfci->font,
- style->text_gc[GTK_STATE_NORMAL], x + xtra, y + etfci->button_height - etfci->font->descent - HEADER_PADDING / 2,
- col->text, strlen (col->text));
- }
-}
-
-static void
-etfci_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
- GnomeCanvas *canvas = item->canvas;
- const int rows = e_table_header_count (etfci->full_header);
- int y1, y2;
- int row;
-
- y1 = y2 = 0;
- for (row = 0; row < rows; row++, y1 = y2){
- ETableCol *ecol = e_table_header_get_column (etfci->full_header, row);
-
- y2 += etfci->button_height;
-
- if (y1 > (y + height))
- break;
-
- if (y2 < y)
- continue;
-
- draw_button (etfci, ecol, drawable,
- GTK_WIDGET (canvas)->style,
- - x, y1 - y, etfci->width, y2 - y1);
- }
-}
-
-static double
-etfci_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-static gboolean
-etfci_maybe_start_drag (ETableFieldChooserItem *etfci, double x, double y)
-{
- if (!etfci->maybe_drag)
- return FALSE;
-
- if (MAX (abs (etfci->click_x - x),
- abs (etfci->click_y - y)) <= 3)
- return FALSE;
-
- return TRUE;
-}
-
-static void
-etfci_start_drag (ETableFieldChooserItem *etfci, GdkEvent *event, double x, double y)
-{
- GtkWidget *widget = GTK_WIDGET (GNOME_CANVAS_ITEM (etfci)->canvas);
- GtkTargetList *list;
- GdkDragContext *context;
- ETableCol *ecol;
- GdkPixmap *pixmap;
- int drag_col;
-
- GtkTargetEntry etfci_drag_types [] = {
- { TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
- };
-
- drag_col = y / etfci->button_height;
-
- if (drag_col < 0 || drag_col > e_table_header_count(etfci->full_header))
- return;
-
- ecol = e_table_header_get_column (etfci->full_header, drag_col);
-
- etfci->drag_col = ecol->col_idx;
-
- etfci_drag_types[0].target = g_strdup_printf("%s-%s", etfci_drag_types[0].target, etfci->dnd_code);
- list = gtk_target_list_new (etfci_drag_types, ELEMENTS (etfci_drag_types));
- context = gtk_drag_begin (widget, list, GDK_ACTION_MOVE, 1, event);
- g_free(etfci_drag_types[0].target);
-
-
- pixmap = gdk_pixmap_new (widget->window, etfci->width, etfci->button_height, -1);
- draw_button (etfci, ecol, pixmap,
- widget->style,
- 0, 0, etfci->width, etfci->button_height);
- gtk_drag_set_icon_pixmap (context,
- gdk_window_get_colormap (widget->window),
- pixmap,
- NULL,
- etfci->width / 2,
- etfci->button_height / 2);
- gdk_pixmap_unref (pixmap);
- etfci->maybe_drag = FALSE;
-}
-
-/*
- * Handles the events on the ETableFieldChooserItem
- */
-static int
-etfci_event (GnomeCanvasItem *item, GdkEvent *e)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
- GnomeCanvas *canvas = item->canvas;
- int x, y;
-
- switch (e->type){
- case GDK_MOTION_NOTIFY:
- gnome_canvas_w2c (canvas, e->motion.x, e->motion.y, &x, &y);
-
- if (etfci_maybe_start_drag (etfci, x, y))
- etfci_start_drag (etfci, e, x, y);
- break;
-
- case GDK_BUTTON_PRESS:
- gnome_canvas_w2c (canvas, e->button.x, e->button.y, &x, &y);
-
- if (e->button.button == 1){
- etfci->click_x = x;
- etfci->click_y = y;
- etfci->maybe_drag = TRUE;
- }
- break;
-
- case GDK_BUTTON_RELEASE: {
- etfci->maybe_drag = FALSE;
- break;
- }
-
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-static void
-etfci_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
-
- etfci_parent_class = gtk_type_class (PARENT_OBJECT_TYPE);
-
- object_class->destroy = etfci_destroy;
- object_class->set_arg = etfci_set_arg;
- object_class->get_arg = etfci_get_arg;
-
- item_class->update = etfci_update;
- item_class->realize = etfci_realize;
- item_class->unrealize = etfci_unrealize;
- item_class->draw = etfci_draw;
- item_class->point = etfci_point;
- item_class->event = etfci_event;
-
- gtk_object_add_arg_type ("ETableFieldChooserItem::dnd_code", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_DND_CODE);
- gtk_object_add_arg_type ("ETableFieldChooserItem::full_header", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_FULL_HEADER);
- gtk_object_add_arg_type ("ETableFieldChooserItem::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableFieldChooserItem::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
-}
-
-static void
-etfci_init (GnomeCanvasItem *item)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-
- etfci->full_header = NULL;
-
- etfci->height = etfci->width = 0;
- etfci->button_height = 0;
-
- etfci->font = NULL;
-
- etfci->structure_change_id = 0;
- etfci->dimension_change_id = 0;
-
- etfci->dnd_code = NULL;
-
- etfci->maybe_drag = 0;
- etfci->drag_end_id = 0;
-
- e_canvas_item_set_reflow_callback(item, etfci_reflow);
-}
-
-GtkType
-e_table_field_chooser_item_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableFieldChooserItem",
- sizeof (ETableFieldChooserItem),
- sizeof (ETableFieldChooserItemClass),
- (GtkClassInitFunc) etfci_class_init,
- (GtkObjectInitFunc) etfci_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_OBJECT_TYPE, &info);
- }
-
- return type;
-}
-
diff --git a/widgets/e-table/e-table-field-chooser-item.h b/widgets/e-table/e-table-field-chooser-item.h
deleted file mode 100644
index 4b349f40e3..0000000000
--- a/widgets/e-table/e-table-field-chooser-item.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_FIELD_CHOOSER_ITEM_H_
-#define _E_TABLE_FIELD_CHOOSER_ITEM_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gnome-xml/tree.h>
-#include "e-table-header.h"
-
-#define E_TABLE_FIELD_CHOOSER_ITEM_TYPE (e_table_field_chooser_item_get_type ())
-#define E_TABLE_FIELD_CHOOSER_ITEM(o) (GTK_CHECK_CAST ((o), E_TABLE_FIELD_CHOOSER_ITEM_TYPE, ETableFieldChooserItem))
-#define E_TABLE_FIELD_CHOOSER_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_FIELD_CHOOSER_ITEM_TYPE, ETableFieldChooserItemClass))
-#define E_IS_TABLE_FIELD_CHOOSER_ITEM(o) (GTK_CHECK_TYPE ((o), E_TABLE_FIELD_CHOOSER_ITEM_TYPE))
-#define E_IS_TABLE_FIELD_CHOOSER_ITEM_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_FIELD_CHOOSER_ITEM_TYPE))
-
-typedef struct {
- GnomeCanvasItem parent;
- ETableHeader *full_header;
-
- double height, width;
- double button_height;
-
- GdkFont *font;
-
- /*
- * Ids
- */
- int structure_change_id, dimension_change_id;
-
- gchar *dnd_code;
-
- /*
- * For dragging columns
- */
- guint maybe_drag:1;
- int click_x, click_y;
- int drag_col;
- guint drag_data_get_id;
- guint drag_end_id;
-} ETableFieldChooserItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-} ETableFieldChooserItemClass;
-
-GtkType e_table_field_chooser_item_get_type (void);
-
-#endif /* _E_TABLE_FIELD_CHOOSER_ITEM_H_ */
diff --git a/widgets/e-table/e-table-field-chooser.c b/widgets/e-table/e-table-field-chooser.c
deleted file mode 100644
index 0d56945f7f..0000000000
--- a/widgets/e-table/e-table-field-chooser.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-field-chooser.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-table-field-chooser.h>
-#include <e-table-field-chooser-item.h>
-
-static void e_table_field_chooser_init (ETableFieldChooser *card);
-static void e_table_field_chooser_class_init (ETableFieldChooserClass *klass);
-static void e_table_field_chooser_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_table_field_chooser_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_table_field_chooser_destroy (GtkObject *object);
-
-static GtkVBoxClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_FULL_HEADER,
- ARG_DND_CODE,
-};
-
-GtkType
-e_table_field_chooser_get_type (void)
-{
- static GtkType table_field_chooser_type = 0;
-
- if (!table_field_chooser_type)
- {
- static const GtkTypeInfo table_field_chooser_info =
- {
- "ETableFieldChooser",
- sizeof (ETableFieldChooser),
- sizeof (ETableFieldChooserClass),
- (GtkClassInitFunc) e_table_field_chooser_class_init,
- (GtkObjectInitFunc) e_table_field_chooser_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- table_field_chooser_type = gtk_type_unique (gtk_vbox_get_type (), &table_field_chooser_info);
- }
-
- return table_field_chooser_type;
-}
-
-static void
-e_table_field_chooser_class_init (ETableFieldChooserClass *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_table_field_chooser_set_arg;
- object_class->get_arg = e_table_field_chooser_get_arg;
- object_class->destroy = e_table_field_chooser_destroy;
- gtk_object_add_arg_type ("ETableFieldChooser::dnd_code", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_DND_CODE);
- gtk_object_add_arg_type ("ETableFieldChooser::full_header", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_FULL_HEADER);
-}
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, ETableFieldChooser *etfc)
-{
- double height;
- etfc->last_alloc = *allocation;
- gnome_canvas_item_set( etfc->item,
- "width", (double) allocation->width,
- NULL );
- gtk_object_get(GTK_OBJECT(etfc->item),
- "height", &height,
- NULL);
- height = MAX(height, allocation->height);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( etfc->canvas ), 0, 0, allocation->width - 1, height - 1);
- gnome_canvas_item_set( etfc->rect,
- "x2", (double) allocation->width,
- "y2", (double) height,
- NULL );
-}
-
-static void resize(GnomeCanvas *canvas, ETableFieldChooser *etfc)
-{
- double height;
- gtk_object_get(GTK_OBJECT(etfc->item),
- "height", &height,
- NULL);
-
- height = MAX(height, etfc->last_alloc.height);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS(etfc->canvas), 0, 0, etfc->last_alloc.width - 1, height - 1);
- gnome_canvas_item_set( etfc->rect,
- "x2", (double) etfc->last_alloc.width,
- "y2", (double) height,
- NULL );
-}
-
-static void
-e_table_field_chooser_init (ETableFieldChooser *etfc)
-{
- GladeXML *gui;
- GtkWidget *widget;
-
- gui = glade_xml_new (ETABLE_GLADEDIR "/e-table-field-chooser.glade", NULL);
- etfc->gui = gui;
-
- widget = glade_xml_get_widget(gui, "vbox-top");
- if (!widget) {
- return;
- }
- gtk_widget_reparent(widget,
- GTK_WIDGET(etfc));
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- etfc->canvas = GNOME_CANVAS(glade_xml_get_widget(gui, "canvas-buttons"));
-
- etfc->rect = gnome_canvas_item_new(gnome_canvas_root( GNOME_CANVAS( etfc->canvas ) ),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) 100,
- "y2", (double) 100,
- "fill_color", "white",
- NULL );
-
- etfc->item = gnome_canvas_item_new(gnome_canvas_root(etfc->canvas),
- e_table_field_chooser_item_get_type(),
- "width", (double) 100,
- "full_header", etfc->full_header,
- "dnd_code", etfc->dnd_code,
- NULL );
-
- gtk_signal_connect( GTK_OBJECT( etfc->canvas ), "reflow",
- GTK_SIGNAL_FUNC( resize ),
- etfc);
-
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( etfc->canvas ),
- 0, 0,
- 100, 100 );
-
- /* Connect the signals */
- gtk_signal_connect (GTK_OBJECT (etfc->canvas), "size_allocate",
- GTK_SIGNAL_FUNC (allocate_callback),
- etfc);
-
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
- gtk_widget_show(widget);
-}
-
-static void
-e_table_field_chooser_destroy (GtkObject *object)
-{
- ETableFieldChooser *etfc = E_TABLE_FIELD_CHOOSER(object);
-
- g_free(etfc->dnd_code);
- if (etfc->full_header)
- gtk_object_unref(GTK_OBJECT(etfc->full_header));
-
- if (etfc->gui)
- gtk_object_unref(GTK_OBJECT(etfc->gui));
-}
-
-GtkWidget*
-e_table_field_chooser_new (void)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_table_field_chooser_get_type ()));
- return widget;
-}
-
-static void
-e_table_field_chooser_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableFieldChooser *etfc = E_TABLE_FIELD_CHOOSER(object);
-
- switch (arg_id){
- case ARG_DND_CODE:
- g_free(etfc->dnd_code);
- etfc->dnd_code = g_strdup(GTK_VALUE_STRING (*arg));
- if (etfc->item)
- gtk_object_set(GTK_OBJECT(etfc->item),
- "dnd_code", etfc->dnd_code,
- NULL);
- break;
- case ARG_FULL_HEADER:
- if (etfc->full_header)
- gtk_object_unref(GTK_OBJECT(etfc->full_header));
- if (GTK_VALUE_OBJECT(*arg))
- etfc->full_header = E_TABLE_HEADER(GTK_VALUE_OBJECT(*arg));
- else
- etfc->full_header = NULL;
- if (etfc->full_header)
- gtk_object_ref(GTK_OBJECT(etfc->full_header));
- if (etfc->item)
- gtk_object_set(GTK_OBJECT(etfc->item),
- "full_header", etfc->full_header,
- NULL);
- break;
- default:
- break;
- }
-}
-
-static void
-e_table_field_chooser_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableFieldChooser *etfc = E_TABLE_FIELD_CHOOSER(object);
-
- switch (arg_id) {
- case ARG_DND_CODE:
- GTK_VALUE_STRING (*arg) = g_strdup (etfc->dnd_code);
- break;
- case ARG_FULL_HEADER:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etfc->full_header);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
diff --git a/widgets/e-table/e-table-field-chooser.glade b/widgets/e-table/e-table-field-chooser.glade
deleted file mode 100644
index a5cd37c2df..0000000000
--- a/widgets/e-table/e-table-field-chooser.glade
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>e-table-field-chooser</name>
- <program_name>e-table-field-chooser</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <gnome_help_support>True</gnome_help_support>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-table-field-chooser.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog-field-chooser</name>
- <visible>False</visible>
- <title>Field Chooser</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CLOSE</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox-top</name>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label1</name>
- <label>To add a column to your table, drag it into
-the location in which you want it to appear.</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <width>200</width>
- <height>200</height>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>Custom</class>
- <name>canvas-buttons</name>
- <creation_function>e_canvas_new</creation_function>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 08 Jun 2000 07:27:33 GMT</last_modification_time>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/widgets/e-table/e-table-field-chooser.glade.h b/widgets/e-table/e-table-field-chooser.glade.h
deleted file mode 100644
index a36bd6052c..0000000000
--- a/widgets/e-table/e-table-field-chooser.glade.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Field Chooser");
-gchar *s = N_("To add a column to your table, drag it into\n"
- "the location in which you want it to appear.");
diff --git a/widgets/e-table/e-table-field-chooser.h b/widgets/e-table/e-table-field-chooser.h
deleted file mode 100644
index d84aafdc63..0000000000
--- a/widgets/e-table/e-table-field-chooser.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor-fullname.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_TABLE_FIELD_CHOOSER_H__
-#define __E_TABLE_FIELD_CHOOSER_H__
-
-#include <gnome.h>
-#include <glade/glade.h>
-#include "e-table-header.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETableFieldChooser - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- */
-
-#define E_TABLE_FIELD_CHOOSER_TYPE (e_table_field_chooser_get_type ())
-#define E_TABLE_FIELD_CHOOSER(obj) (GTK_CHECK_CAST ((obj), E_TABLE_FIELD_CHOOSER_TYPE, ETableFieldChooser))
-#define E_TABLE_FIELD_CHOOSER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TABLE_FIELD_CHOOSER_TYPE, ETableFieldChooserClass))
-#define E_IS_TABLE_FIELD_CHOOSER(obj) (GTK_CHECK_TYPE ((obj), E_TABLE_FIELD_CHOOSER_TYPE))
-#define E_IS_TABLE_FIELD_CHOOSER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TABLE_FIELD_CHOOSER_TYPE))
-
-
-typedef struct _ETableFieldChooser ETableFieldChooser;
-typedef struct _ETableFieldChooserClass ETableFieldChooserClass;
-
-struct _ETableFieldChooser
-{
- GtkVBox parent;
-
- /* item specific fields */
- GladeXML *gui;
- GnomeCanvas *canvas;
- GnomeCanvasItem *item;
-
- GnomeCanvasItem *rect;
- GtkAllocation last_alloc;
-
- gchar *dnd_code;
- ETableHeader *full_header;
-};
-
-struct _ETableFieldChooserClass
-{
- GtkVBoxClass parent_class;
-};
-
-
-GtkWidget *e_table_field_chooser_new(void);
-GtkType e_table_field_chooser_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TABLE_FIELD_CHOOSER_H__ */
diff --git a/widgets/e-table/e-table-group-container.c b/widgets/e-table/e-table-group-container.c
deleted file mode 100644
index 3a68bc044b..0000000000
--- a/widgets/e-table/e-table-group-container.c
+++ /dev/null
@@ -1,1169 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-Table-Group.c: Implements the grouping objects for elements on a table
- *
- * Author:
- * Chris Lahey <clahey@helixcode.com>
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-group-container.h"
-#include "e-table-group-leaf.h"
-#include "e-table-item.h"
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include "e-util/e-util.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-canvas-utils.h"
-#include "widgets/e-text/e-text.h"
-#include "e-table-defines.h"
-
-#define TITLE_HEIGHT 16
-
-#define PARENT_TYPE e_table_group_get_type ()
-
-static GnomeCanvasGroupClass *etgc_parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_HEIGHT,
- ARG_WIDTH,
- ARG_MINIMUM_WIDTH,
- ARG_FROZEN,
- ARG_TABLE_DRAW_GRID,
- ARG_TABLE_DRAW_FOCUS,
- ARG_CURSOR_MODE,
- ARG_TABLE_SELECTION_MODEL,
- ARG_LENGTH_THRESHOLD,
-};
-
-typedef struct {
- ETableGroup *child;
- void *key;
- char *string;
- GnomeCanvasItem *text;
- GnomeCanvasItem *rect;
- gint count;
-} ETableGroupContainerChildNode;
-
-static EPrintable *
-etgc_get_printable (ETableGroup *etg);
-
-
-static void
-e_table_group_container_child_node_free (ETableGroupContainer *etgc,
- ETableGroupContainerChildNode *child_node)
-{
- ETableGroup *etg = E_TABLE_GROUP (etgc);
- ETableGroup *child = child_node->child;
-
- gtk_object_destroy (GTK_OBJECT (child));
- e_table_model_free_value (etg->model, etgc->ecol->col_idx,
- child_node->key);
- g_free(child_node->string);
- gtk_object_destroy (GTK_OBJECT (child_node->text));
- gtk_object_destroy (GTK_OBJECT (child_node->rect));
-}
-
-static void
-e_table_group_container_list_free (ETableGroupContainer *etgc)
-{
- ETableGroupContainerChildNode *child_node;
- GList *list;
-
- for (list = etgc->children; list; list = g_list_next (list)) {
- child_node = (ETableGroupContainerChildNode *) list->data;
- e_table_group_container_child_node_free (etgc, child_node);
- }
-
- g_list_free (etgc->children);
-}
-
-static void
-etgc_destroy (GtkObject *object)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);
-
- if (etgc->font)
- gdk_font_unref (etgc->font);
- etgc->font = NULL;
-
- if (etgc->ecol)
- gtk_object_unref (GTK_OBJECT(etgc->ecol));
-
- if (etgc->sort_info)
- gtk_object_unref (GTK_OBJECT(etgc->sort_info));
-
- if (etgc->table_selection_model)
- gtk_object_unref (GTK_OBJECT(etgc->table_selection_model));
-
- if (etgc->rect)
- gtk_object_destroy (GTK_OBJECT(etgc->rect));
-
- e_table_group_container_list_free (etgc);
-
- GTK_OBJECT_CLASS (etgc_parent_class)->destroy (object);
-}
-
-void
-e_table_group_container_construct (GnomeCanvasGroup *parent, ETableGroupContainer *etgc,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model, ETableSortInfo *sort_info, int n)
-{
- ETableCol *col;
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(sort_info, n);
-
- if (column.column > e_table_header_count (full_header))
- col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
- else
- col = e_table_header_get_column (full_header, column.column);
-
- e_table_group_construct (parent, E_TABLE_GROUP (etgc), full_header, header, model);
- etgc->ecol = col;
- gtk_object_ref (GTK_OBJECT(etgc->ecol));
- etgc->sort_info = sort_info;
- gtk_object_ref (GTK_OBJECT(etgc->sort_info));
- etgc->n = n;
- etgc->ascending = column.ascending;
-
-
- etgc->font = gdk_font_load ("lucidasans-10");
- if (!etgc->font){
- etgc->font = GTK_WIDGET (GNOME_CANVAS_ITEM (etgc)->canvas)->style->font;
-
- gdk_font_ref (etgc->font);
- }
- etgc->open = TRUE;
-}
-
-ETableGroup *
-e_table_group_container_new (GnomeCanvasGroup *parent, ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model, ETableSortInfo *sort_info, int n)
-{
- ETableGroupContainer *etgc;
-
- g_return_val_if_fail (parent != NULL, NULL);
-
- etgc = gtk_type_new (e_table_group_container_get_type ());
-
- e_table_group_container_construct (parent, etgc, full_header, header,
- model, sort_info, n);
- return E_TABLE_GROUP (etgc);
-}
-
-
-static int
-etgc_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(item);
- gboolean return_val = TRUE;
- gboolean change_focus = FALSE;
- gboolean use_col = FALSE;
- gint start_col = 0;
- gint old_col;
- EFocus direction = E_FOCUS_START;
-
- switch (event->type) {
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Tab ||
- event->key.keyval == GDK_KP_Tab ||
- event->key.keyval == GDK_ISO_Left_Tab) {
- change_focus = TRUE;
- use_col = TRUE;
- start_col = (event->key.state & GDK_SHIFT_MASK) ? -1 : 0;
- direction = (event->key.state & GDK_SHIFT_MASK) ? E_FOCUS_END : E_FOCUS_START;
- } else if (event->key.keyval == GDK_Left ||
- event->key.keyval == GDK_KP_Left) {
- change_focus = TRUE;
- use_col = TRUE;
- start_col = -1;
- direction = E_FOCUS_END;
- } else if (event->key.keyval == GDK_Right ||
- event->key.keyval == GDK_KP_Right) {
- change_focus = TRUE;
- use_col = TRUE;
- start_col = 0;
- direction = E_FOCUS_START;
- } else if (event->key.keyval == GDK_Down ||
- event->key.keyval == GDK_KP_Down) {
- change_focus = TRUE;
- use_col = FALSE;
- direction = E_FOCUS_START;
- } else if (event->key.keyval == GDK_Up ||
- event->key.keyval == GDK_KP_Up) {
- change_focus = TRUE;
- use_col = FALSE;
- direction = E_FOCUS_END;
- } else if (event->key.keyval == GDK_Return ||
- event->key.keyval == GDK_KP_Enter) {
- change_focus = TRUE;
- use_col = FALSE;
- direction = E_FOCUS_START;
- }
- if (change_focus){
- GList *list;
- for (list = etgc->children; list; list = list->next) {
- ETableGroupContainerChildNode *child_node;
- ETableGroup *child;
-
- child_node = (ETableGroupContainerChildNode *)list->data;
- child = child_node->child;
-
- if (e_table_group_get_focus (child)) {
- old_col = e_table_group_get_focus_column (child);
- if (old_col == -1)
- old_col = 0;
- if (start_col == -1)
- start_col = e_table_header_count (e_table_group_get_header (child)) - 1;
-
- if (direction == E_FOCUS_END)
- list = list->prev;
- else
- list = list->next;
-
- if (list) {
- child_node = (ETableGroupContainerChildNode *)list->data;
- child = child_node->child;
- if (use_col)
- e_table_group_set_focus (child, direction, start_col);
- else
- e_table_group_set_focus (child, direction, old_col);
- return 1;
- } else {
- return 0;
- }
- }
- }
- if (direction == E_FOCUS_END)
- list = g_list_last(etgc->children);
- else
- list = etgc->children;
- if (list) {
- ETableGroupContainerChildNode *child_node;
- ETableGroup *child;
-
- child_node = (ETableGroupContainerChildNode *)list->data;
- child = child_node->child;
-
- if (start_col == -1)
- start_col = e_table_header_count (e_table_group_get_header (child)) - 1;
-
- e_table_group_set_focus (child, direction, start_col);
- return 1;
- }
- }
- return_val = FALSE;
- break;
- default:
- return_val = FALSE;
- break;
- }
- if (return_val == FALSE) {
- if (GNOME_CANVAS_ITEM_CLASS(etgc_parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->event (item, event);
- }
- return return_val;
-
-}
-
-/* Realize handler for the text item */
-static void
-etgc_realize (GnomeCanvasItem *item)
-{
- ETableGroupContainer *etgc;
-
- if (GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->realize)
- (* GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->realize) (item);
-
- etgc = E_TABLE_GROUP_CONTAINER (item);
-
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc));
-}
-
-/* Unrealize handler for the etgc item */
-static void
-etgc_unrealize (GnomeCanvasItem *item)
-{
- ETableGroupContainer *etgc;
-
- etgc = E_TABLE_GROUP_CONTAINER (item);
-
- if (GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->unrealize)
- (* GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->unrealize) (item);
-}
-
-static void
-compute_text (ETableGroupContainer *etgc, ETableGroupContainerChildNode *child_node)
-{
- gchar *text;
- if (etgc->ecol->text)
- text = g_strdup_printf ("%s : %s (%d item%s)",
- etgc->ecol->text,
- child_node->string,
- (gint) child_node->count,
- child_node->count == 1 ? "" : "s");
- else
- text = g_strdup_printf ("%s (%d item%s)",
- child_node->string,
- (gint) child_node->count,
- child_node->count == 1 ? "" : "s");
- gnome_canvas_item_set (child_node->text,
- "text", text,
- NULL);
- g_free (text);
-}
-
-static void
-child_cursor_change (ETableGroup *etg, int row,
- ETableGroupContainer *etgc)
-{
- e_table_group_cursor_change (E_TABLE_GROUP (etgc), row);
-}
-
-static void
-child_double_click (ETableGroup *etg, int row,
- ETableGroupContainer *etgc)
-{
- e_table_group_double_click (E_TABLE_GROUP (etgc), row);
-}
-
-static gint
-child_right_click (ETableGroup *etg, int row, int col, GdkEvent *event,
- ETableGroupContainer *etgc)
-{
- return e_table_group_right_click (E_TABLE_GROUP (etgc), row, col, event);
-}
-
-static gint
-child_key_press (ETableGroup *etg, int row, int col, GdkEvent *event,
- ETableGroupContainer *etgc)
-{
- return e_table_group_key_press (E_TABLE_GROUP (etgc), row, col, event);
-}
-
-static void
-etgc_add (ETableGroup *etg, gint row)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg);
- void *val = e_table_model_value_at (etg->model, etgc->ecol->col_idx, row);
- GCompareFunc comp = etgc->ecol->compare;
- GList *list = etgc->children;
- ETableGroup *child;
- ETableGroupContainerChildNode *child_node;
- int i = 0;
-
- for (; list; list = g_list_next (list), i++){
- int comp_val;
-
- child_node = list->data;
- comp_val = (*comp)(child_node->key, val);
- if (comp_val == 0) {
- child = child_node->child;
- child_node->count ++;
- e_table_group_add (child, row);
- compute_text (etgc, child_node);
- return;
- }
- if ((comp_val > 0 && etgc->ascending) ||
- (comp_val < 0 && (!etgc->ascending)))
- break;
- }
- child_node = g_new (ETableGroupContainerChildNode, 1);
- child_node->rect = gnome_canvas_item_new (GNOME_CANVAS_GROUP (etgc),
- gnome_canvas_rect_get_type (),
- "fill_color", "grey70",
- "outline_color", "grey50",
- NULL);
- child_node->text = gnome_canvas_item_new (GNOME_CANVAS_GROUP (etgc),
- e_text_get_type (),
- "font_gdk", etgc->font,
- "anchor", GTK_ANCHOR_SW,
- "fill_color", "black",
- NULL);
- child = e_table_group_new (GNOME_CANVAS_GROUP (etgc), etg->full_header,
- etg->header, etg->model, etgc->sort_info, etgc->n + 1);
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(child),
- "drawgrid", etgc->draw_grid,
- "drawfocus", etgc->draw_focus,
- "cursor_mode", etgc->cursor_mode,
- "table_selection_model", etgc->table_selection_model,
- "length_threshold", etgc->length_threshold,
- NULL);
- gtk_signal_connect (GTK_OBJECT (child), "cursor_change",
- GTK_SIGNAL_FUNC (child_cursor_change), etgc);
- gtk_signal_connect (GTK_OBJECT (child), "double_click",
- GTK_SIGNAL_FUNC (child_double_click), etgc);
- gtk_signal_connect (GTK_OBJECT (child), "right_click",
- GTK_SIGNAL_FUNC (child_right_click), etgc);
- gtk_signal_connect (GTK_OBJECT (child), "key_press",
- GTK_SIGNAL_FUNC (child_key_press), etgc);
- child_node->child = child;
- child_node->key = e_table_model_duplicate_value (etg->model, etgc->ecol->col_idx, val);
- child_node->string = e_table_model_value_to_string (etg->model, etgc->ecol->col_idx, val);
- child_node->count = 1;
- e_table_group_add (child, row);
-
- if (list)
- etgc->children = g_list_insert (etgc->children, child_node, i);
- else
- etgc->children = g_list_append (etgc->children, child_node);
-
- compute_text (etgc, child_node);
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc));
-}
-
-static void
-etgc_add_all (ETableGroup *etg)
-{
- int rows = e_table_model_row_count(etg->model);
- int i;
- for (i = 0; i < rows; i++)
- etgc_add(etg, i);
-}
-
-static gboolean
-etgc_remove (ETableGroup *etg, gint row)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list;
-
- for (list = etgc->children ; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = list->data;
- ETableGroup *child = child_node->child;
-
- if (e_table_group_remove (child, row)) {
- child_node->count --;
- if (child_node->count == 0) {
- e_table_group_container_child_node_free (etgc, child_node);
- etgc->children = g_list_remove (etgc->children, child_node);
- g_free (child_node);
- } else
- compute_text (etgc, child_node);
-
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc));
-
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static int
-etgc_row_count (ETableGroup *etg)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list;
- gint count = 0;
- for (list = etgc->children; list; list = g_list_next(list)) {
- ETableGroup *group = ((ETableGroupContainerChildNode *)list->data)->child;
- gint this_count = e_table_group_row_count(group);
- count += this_count;
- }
- return count;
-}
-
-static void
-etgc_increment (ETableGroup *etg, gint position, gint amount)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list = etgc->children;
-
- for (list = etgc->children ; list; list = g_list_next (list))
- e_table_group_increment (((ETableGroupContainerChildNode *)list->data)->child,
- position, amount);
-}
-
-static void
-etgc_decrement (ETableGroup *etg, gint position, gint amount)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list = etgc->children;
-
- for (list = etgc->children ; list; list = g_list_next (list))
- e_table_group_decrement (((ETableGroupContainerChildNode *)list->data)->child,
- position, amount);
-}
-
-static void
-etgc_set_cursor_row (ETableGroup *etg, gint row)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list;
- for (list = etgc->children; list; list = g_list_next(list)) {
- ETableGroup *group = ((ETableGroupContainerChildNode *)list->data)->child;
- gint this_count = e_table_group_row_count(group);
- if (row < this_count) {
- e_table_group_set_cursor_row(group, row);
- return;
- }
- row -= this_count;
- }
-}
-
-static int
-etgc_get_cursor_row (ETableGroup *etg)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list;
- int count = 0;
- for (list = etgc->children; list; list = g_list_next(list)) {
- ETableGroup *group = ((ETableGroupContainerChildNode *)list->data)->child;
- int row = e_table_group_get_cursor_row(group);
- if (row != -1)
- return count + row;
- count += e_table_group_row_count(group);
- }
- return -1;
-}
-
-static void
-etgc_set_focus (ETableGroup *etg, EFocus direction, gint view_col)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- if (etgc->children) {
- if (direction == E_FOCUS_END)
- e_table_group_set_focus (((ETableGroupContainerChildNode *)g_list_last (etgc->children)->data)->child,
- direction, view_col);
- else
- e_table_group_set_focus (((ETableGroupContainerChildNode *)etgc->children->data)->child,
- direction, view_col);
- }
-}
-
-static gint
-etgc_get_focus_column (ETableGroup *etg)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- if (etgc->children) {
- GList *list;
- for (list = etgc->children; list; list = list->next) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- ETableGroup *child = child_node->child;
- if (e_table_group_get_focus (child)) {
- return e_table_group_get_focus_column (child);
- }
- }
- }
- return 0;
-}
-
-static void
-etgc_compute_location (ETableGroup *etg, int *x, int *y, int *row, int *col)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-
- if (row)
- *row = -1;
- if (col)
- *col = -1;
-
- *x -= GROUP_INDENT;
- *y -= TITLE_HEIGHT;
-
- if (*x >= 0 && *y >= 0 && etgc->children) {
- GList *list;
- for (list = etgc->children; list; list = list->next) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- ETableGroup *child = child_node->child;
-
- e_table_group_compute_location (child, x, y, row, col);
- if ((*row != -1) && (*col != -1))
- return;
- }
- }
-}
-
-static void etgc_thaw (ETableGroup *etg)
-{
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM(etg));
-}
-
-static void
-etgc_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableGroup *etg = E_TABLE_GROUP (object);
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);
- GList *list;
-
- switch (arg_id) {
- case ARG_FROZEN:
- if (GTK_VALUE_BOOL (*arg))
- etg->frozen = TRUE;
- else {
- etg->frozen = FALSE;
- etgc_thaw (etg);
- }
- break;
- case ARG_MINIMUM_WIDTH:
- case ARG_WIDTH:
- etgc->minimum_width = GTK_VALUE_DOUBLE(*arg);
-
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "minimum_width", etgc->minimum_width - GROUP_INDENT,
- NULL);
- }
- break;
- case ARG_LENGTH_THRESHOLD:
- etgc->length_threshold = GTK_VALUE_INT (*arg);
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "length_threshold", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
-
- case ARG_TABLE_SELECTION_MODEL:
- if (etgc->table_selection_model)
- gtk_object_unref(GTK_OBJECT(etgc->table_selection_model));
- etgc->table_selection_model = E_TABLE_SELECTION_MODEL(GTK_VALUE_OBJECT (*arg));
- if (etgc->table_selection_model)
- gtk_object_ref(GTK_OBJECT(etgc->table_selection_model));
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "table_selection_model", etgc->table_selection_model,
- NULL);
- }
- break;
-
- case ARG_TABLE_DRAW_GRID:
- etgc->draw_grid = GTK_VALUE_BOOL (*arg);
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "drawgrid", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- etgc->draw_focus = GTK_VALUE_BOOL (*arg);
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "drawfocus", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_CURSOR_MODE:
- etgc->cursor_mode = GTK_VALUE_INT (*arg);
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "cursor_mode", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
- default:
- break;
- }
-}
-
-static void
-etgc_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableGroup *etg = E_TABLE_GROUP (object);
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);
-
- switch (arg_id) {
- case ARG_FROZEN:
- GTK_VALUE_BOOL (*arg) = etg->frozen;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = etgc->height;
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = etgc->width;
- break;
- case ARG_MINIMUM_WIDTH:
- etgc->minimum_width = GTK_VALUE_DOUBLE(*arg);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-etgc_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
- ETableGroupClass *e_group_class = E_TABLE_GROUP_CLASS(object_class);
-
- object_class->destroy = etgc_destroy;
- object_class->set_arg = etgc_set_arg;
- object_class->get_arg = etgc_get_arg;
-
- item_class->event = etgc_event;
- item_class->realize = etgc_realize;
- item_class->unrealize = etgc_unrealize;
-
- etgc_parent_class = gtk_type_class (PARENT_TYPE);
-
- e_group_class->add = etgc_add;
- e_group_class->add_all = etgc_add_all;
- e_group_class->remove = etgc_remove;
- e_group_class->increment = etgc_increment;
- e_group_class->decrement = etgc_decrement;
- e_group_class->row_count = etgc_row_count;
- e_group_class->set_focus = etgc_set_focus;
- e_group_class->set_cursor_row = etgc_set_cursor_row;
- e_group_class->get_cursor_row = etgc_get_cursor_row;
- e_group_class->get_focus_column = etgc_get_focus_column;
- e_group_class->get_printable = etgc_get_printable;
- e_group_class->compute_location = etgc_compute_location;
-
- gtk_object_add_arg_type ("ETableGroupContainer::drawgrid", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_GRID);
- gtk_object_add_arg_type ("ETableGroupContainer::drawfocus", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_FOCUS);
- gtk_object_add_arg_type ("ETableGroupContainer::cursor_mode", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_CURSOR_MODE);
- gtk_object_add_arg_type ("ETableGroupContainer::table_selection_model", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_SELECTION_MODEL);
- gtk_object_add_arg_type ("ETableGroupContainer::length_threshold", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
-
- gtk_object_add_arg_type ("ETableGroupContainer::frozen", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_FROZEN);
- gtk_object_add_arg_type ("ETableGroupContainer::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("ETableGroupContainer::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableGroupContainer::minimum_width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MINIMUM_WIDTH);
-}
-
-static void
-etgc_reflow (GnomeCanvasItem *item, gint flags)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(item);
- gboolean frozen;
-
- gtk_object_get (GTK_OBJECT(etgc),
- "frozen", &frozen,
- NULL);
-
- if (frozen)
- return;
-
-
- if (GTK_OBJECT_FLAGS(etgc)& GNOME_CANVAS_ITEM_REALIZED){
- gdouble running_height = 0;
- gdouble running_width = 0;
- gdouble old_height;
- gdouble old_width;
-
- old_height = etgc->height;
- old_width = etgc->width;
- if (etgc->children == NULL){
- } else {
- GList *list;
- gdouble extra_height = 0;
- gdouble item_height = 0;
- gdouble item_width = 0;
-
- if (etgc->font)
- extra_height += etgc->font->ascent + etgc->font->descent + BUTTON_PADDING * 2;
-
- extra_height = MAX(extra_height, BUTTON_HEIGHT + BUTTON_PADDING * 2);
-
- running_height = extra_height;
-
- for ( list = etgc->children; list; list = g_list_next (list)){
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *) list->data;
- ETableGroup *child = child_node->child;
-
- gtk_object_get (GTK_OBJECT(child),
- "width", &item_width,
- NULL);
-
- if (item_width > running_width)
- running_width = item_width;
- }
- for ( list = etgc->children; list; list = g_list_next (list)){
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *) list->data;
- ETableGroup *child = child_node->child;
- gtk_object_get (GTK_OBJECT(child),
- "height", &item_height,
- NULL);
-
- e_canvas_item_move_absolute (GNOME_CANVAS_ITEM(child_node->text),
- GROUP_INDENT,
- running_height - BUTTON_PADDING);
-
- e_canvas_item_move_absolute (GNOME_CANVAS_ITEM(child),
- GROUP_INDENT,
- running_height);
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(child_node->rect),
- "x1", (double) 0,
- "x2", (double) running_width + GROUP_INDENT,
- "y1", (double) running_height - extra_height,
- "y2", (double) running_height + item_height,
- NULL);
-
- running_height += item_height + extra_height;
- }
- running_height -= extra_height;
- }
- if (running_height != old_height || running_width != old_width) {
- etgc->height = running_height;
- etgc->width = running_width;
- e_canvas_item_request_parent_reflow (item);
- }
- }
-}
-
-static void
-etgc_init (GtkObject *object)
-{
- ETableGroupContainer *container = E_TABLE_GROUP_CONTAINER(object);
- container->children = FALSE;
-
- e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM(object), etgc_reflow);
-
- container->draw_grid = 1;
- container->draw_focus = 1;
- container->cursor_mode = E_TABLE_CURSOR_SIMPLE;
- container->length_threshold = -1;
- container->table_selection_model = NULL;
-}
-
-E_MAKE_TYPE (e_table_group_container, "ETableGroupContainer", ETableGroupContainer, etgc_class_init, etgc_init, PARENT_TYPE);
-
-void
-e_table_group_apply_to_leafs (ETableGroup *etg, ETableGroupLeafFn fn, void *closure)
-{
- if (E_IS_TABLE_GROUP_CONTAINER (etg)){
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg);
- GList *list = etgc->children;
-
- for (list = etgc->children; list; list = list->next){
- ETableGroupContainerChildNode *child_node = list->data;
-
- e_table_group_apply_to_leafs (child_node->child, fn, closure);
- }
- } else if (E_IS_TABLE_GROUP_LEAF (etg)){
- (*fn) (E_TABLE_GROUP_LEAF (etg)->item, closure);
- } else {
- g_error ("Unknown ETableGroup found: %s",
- gtk_type_name (GTK_OBJECT (etg)->klass->type));
- }
-}
-
-
-typedef struct {
- ETableGroupContainer *etgc;
- GList *child;
- EPrintable *child_printable;
-} ETGCPrintContext;
-
-#if 0
-#define CHECK(x) if((x) == -1) return -1;
-
-static gint
-gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height, gdouble r, gdouble g, gdouble b)
-{
- CHECK(gnome_print_moveto(context, x, y));
- CHECK(gnome_print_lineto(context, x + width, y));
- CHECK(gnome_print_lineto(context, x + width, y - height));
- CHECK(gnome_print_lineto(context, x, y - height));
- CHECK(gnome_print_lineto(context, x, y));
- return gnome_print_fill(context);
-}
-#endif
-
-static void
-e_table_group_container_print_page (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble height,
- gboolean quantize,
- ETGCPrintContext *groupcontext)
-{
- gdouble yd = height;
- gdouble child_height;
- ETableGroupContainerChildNode *child_node;
- GList *child;
- EPrintable *child_printable;
-
- child_printable = groupcontext->child_printable;
- child = groupcontext->child;
-
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- else {
- if (!child) {
- return;
- } else {
- child_node = child->data;
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
- }
-
- while (1) {
- child_height = e_printable_height(child_printable, context, width - 36, yd, quantize);
-
- if (gnome_print_gsave(context) == -1)
- /* FIXME */;
- if (gnome_print_translate(context, 36, yd - child_height) == -1)
- /* FIXME */;
-
- if (gnome_print_moveto(context, 0, 0) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, width - 36, 0) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, width - 36, child_height) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 0, child_height) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 0, 0) == -1)
- /* FIXME */;
- if (gnome_print_clip(context) == -1)
- /* FIXME */;
-
- e_printable_print_page(child_printable, context, width - 36, child_height, quantize);
-
- if (gnome_print_grestore(context) == -1)
- /* FIXME */;
-
- yd -= child_height;
-
- if (e_printable_data_left(child_printable))
- break;
-
- child = child->next;
- if (!child) {
- child_printable = NULL;
- break;
- }
-
- child_node = child->data;
- if (child_printable)
- gtk_object_unref(GTK_OBJECT(child_printable));
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
-
- if (groupcontext->child_printable)
- gtk_object_unref(GTK_OBJECT(groupcontext->child_printable));
- groupcontext->child_printable = child_printable;
- groupcontext->child = child;
-
-}
-
-static gboolean
-e_table_group_container_data_left (EPrintable *ep,
- ETGCPrintContext *groupcontext)
-{
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "data_left");
- return groupcontext->child != NULL;
-}
-
-static void
-e_table_group_container_reset (EPrintable *ep,
- ETGCPrintContext *groupcontext)
-{
- groupcontext->child = groupcontext->etgc->children;
- if (groupcontext->child_printable)
- gtk_object_unref(GTK_OBJECT(groupcontext->child_printable));
- groupcontext->child_printable = NULL;
-}
-
-static gdouble
-e_table_group_container_height (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantize,
- ETGCPrintContext *groupcontext)
-{
- gdouble height = 0;
- gdouble child_height;
- gdouble yd = max_height;
- ETableGroupContainerChildNode *child_node;
- GList *child;
- EPrintable *child_printable;
-
- child_printable = groupcontext->child_printable;
- child = groupcontext->child;
-
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- else {
- if (!child) {
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "height");
- return 0;
- } else {
- child_node = child->data;
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
- }
-
- while (1) {
- child_height = e_printable_height(child_printable, context, width - 36, yd, quantize);
-
- height += child_height;
-
- if (yd != -1) {
- if (!e_printable_will_fit(child_printable, context, width - 36, yd, quantize)) {
- break;
- }
-
- yd -= child_height;
- }
-
- child = child->next;
- if (!child) {
- break;
- }
-
- child_node = child->data;
- if (child_printable)
- gtk_object_unref(GTK_OBJECT(child_printable));
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
- if (child_printable)
- gtk_object_unref(GTK_OBJECT(child_printable));
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "height");
- return height;
-}
-
-static gboolean
-e_table_group_container_will_fit (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantize,
- ETGCPrintContext *groupcontext)
-{
- gboolean will_fit = TRUE;
- gdouble child_height;
- gdouble yd = max_height;
- ETableGroupContainerChildNode *child_node;
- GList *child;
- EPrintable *child_printable;
-
- child_printable = groupcontext->child_printable;
- child = groupcontext->child;
-
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- else {
- if (!child) {
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "will_fit");
- return will_fit;
- } else {
- child_node = child->data;
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
- }
-
- while (1) {
- child_height = e_printable_height(child_printable, context, width - 36, yd, quantize);
-
- if (yd != -1) {
- if (!e_printable_will_fit(child_printable, context, width - 36, yd, quantize)) {
- will_fit = FALSE;
- break;
- }
-
- yd -= child_height;
- }
-
- child = child->next;
- if (!child) {
- break;
- }
-
- child_node = child->data;
- if (child_printable)
- gtk_object_unref(GTK_OBJECT(child_printable));
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
-
- if (child_printable)
- gtk_object_unref(GTK_OBJECT(child_printable));
-
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "will_fit");
- return will_fit;
-}
-
-static void
-e_table_group_container_printable_destroy (GtkObject *object,
- ETGCPrintContext *groupcontext)
-{
- gtk_object_unref(GTK_OBJECT(groupcontext->etgc));
- if (groupcontext->child_printable)
- gtk_object_ref(GTK_OBJECT(groupcontext->child_printable));
- g_free(groupcontext);
-}
-
-static EPrintable *
-etgc_get_printable (ETableGroup *etg)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- EPrintable *printable = e_printable_new();
- ETGCPrintContext *groupcontext;
-
- groupcontext = g_new(ETGCPrintContext, 1);
- groupcontext->etgc = etgc;
- gtk_object_ref(GTK_OBJECT(etgc));
- groupcontext->child = etgc->children;
- groupcontext->child_printable = NULL;
-
- gtk_signal_connect (GTK_OBJECT(printable),
- "print_page",
- GTK_SIGNAL_FUNC(e_table_group_container_print_page),
- groupcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "data_left",
- GTK_SIGNAL_FUNC(e_table_group_container_data_left),
- groupcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "reset",
- GTK_SIGNAL_FUNC(e_table_group_container_reset),
- groupcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "height",
- GTK_SIGNAL_FUNC(e_table_group_container_height),
- groupcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "will_fit",
- GTK_SIGNAL_FUNC(e_table_group_container_will_fit),
- groupcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "destroy",
- GTK_SIGNAL_FUNC(e_table_group_container_printable_destroy),
- groupcontext);
-
- return printable;
-}
diff --git a/widgets/e-table/e-table-group-container.h b/widgets/e-table/e-table-group-container.h
deleted file mode 100644
index bdb717b92d..0000000000
--- a/widgets/e-table/e-table-group-container.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_GROUP_CONTAINER_H_
-#define _E_TABLE_GROUP_CONTAINER_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-table-model.h"
-#include "e-table-header.h"
-#include "e-table-group.h"
-#include "e-table-item.h"
-
-#define E_TABLE_GROUP_CONTAINER_TYPE (e_table_group_container_get_type ())
-#define E_TABLE_GROUP_CONTAINER(o) (GTK_CHECK_CAST ((o), E_TABLE_GROUP_CONTAINER_TYPE, ETableGroupContainer))
-#define E_TABLE_GROUP_CONTAINER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_GROUP_CONTAINER_TYPE, ETableGroupContainerClass))
-#define E_IS_TABLE_GROUP_CONTAINER(o) (GTK_CHECK_TYPE ((o), E_TABLE_GROUP_CONTAINER_TYPE))
-#define E_IS_TABLE_GROUP_CONTAINER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_GROUP_CONTAINER_TYPE))
-
-typedef struct {
- ETableGroup group;
-
- /*
- * The ETableCol used to group this set
- */
- ETableCol *ecol;
- gint ascending;
-
- /*
- * List of ETableGroups we stack
- */
- GList *children;
-
- /*
- * The canvas rectangle that contains the children
- */
- GnomeCanvasItem *rect;
-
- GdkFont *font;
-
- gdouble width, height, minimum_width;
-
- ETableSortInfo *sort_info;
- int n;
- int length_threshold;
-
- ETableSelectionModel *table_selection_model;
-
- guint draw_grid : 1;
- guint draw_focus : 1;
- ETableCursorMode cursor_mode;
-
- /*
- * State: the ETableGroup is open or closed
- */
- guint open:1;
-} ETableGroupContainer;
-
-typedef struct {
- ETableGroupClass parent_class;
-} ETableGroupContainerClass;
-
-ETableGroup *e_table_group_container_new (GnomeCanvasGroup *parent, ETableHeader *full_header, ETableHeader *header,
- ETableModel *model, ETableSortInfo *sort_info, int n);
-void e_table_group_container_construct (GnomeCanvasGroup *parent, ETableGroupContainer *etgc,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model, ETableSortInfo *sort_info, int n);
-
-GtkType e_table_group_container_get_type (void);
-
-#endif /* _E_TABLE_GROUP_CONTAINER_H_ */
diff --git a/widgets/e-table/e-table-group-leaf.c b/widgets/e-table/e-table-group-leaf.c
deleted file mode 100644
index c4792eb87e..0000000000
--- a/widgets/e-table/e-table-group-leaf.c
+++ /dev/null
@@ -1,425 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-Table-Group.c: Implements the grouping objects for elements on a table
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org ()
- *
- * Copyright 1999, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-group-leaf.h"
-#include "e-table-item.h"
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include "e-util/e-util.h"
-#include "e-util/e-canvas.h"
-
-#define PARENT_TYPE e_table_group_get_type ()
-
-static GnomeCanvasGroupClass *etgl_parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_HEIGHT,
- ARG_WIDTH,
- ARG_MINIMUM_WIDTH,
- ARG_FROZEN,
- ARG_TABLE_DRAW_GRID,
- ARG_TABLE_DRAW_FOCUS,
- ARG_CURSOR_MODE,
- ARG_LENGTH_THRESHOLD,
- ARG_TABLE_SELECTION_MODEL,
-};
-
-static void etgl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void etgl_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-static void
-etgl_destroy (GtkObject *object)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF(object);
- if (etgl->subset)
- gtk_object_unref (GTK_OBJECT(etgl->subset));
- if (etgl->item)
- gtk_object_destroy (GTK_OBJECT(etgl->item));
- if (etgl->table_selection_model)
- gtk_object_unref (GTK_OBJECT(etgl->table_selection_model));
- if (GTK_OBJECT_CLASS (etgl_parent_class)->destroy)
- GTK_OBJECT_CLASS (etgl_parent_class)->destroy (object);
-}
-
-static void
-e_table_group_leaf_construct (GnomeCanvasGroup *parent,
- ETableGroupLeaf *etgl,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model,
- ETableSortInfo *sort_info)
-{
- etgl->subset = E_TABLE_SUBSET_VARIABLE(e_table_sorted_variable_new (model, full_header, sort_info));
- gtk_object_ref(GTK_OBJECT(etgl->subset));
- gtk_object_sink(GTK_OBJECT(etgl->subset));
- e_table_group_construct (parent, E_TABLE_GROUP (etgl), full_header, header, model);
-}
-
-ETableGroup *
-e_table_group_leaf_new (GnomeCanvasGroup *parent,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model,
- ETableSortInfo *sort_info)
-{
- ETableGroupLeaf *etgl;
-
- g_return_val_if_fail (parent != NULL, NULL);
-
- etgl = gtk_type_new (e_table_group_leaf_get_type ());
-
- e_table_group_leaf_construct (parent, etgl, full_header,
- header, model, sort_info);
- return E_TABLE_GROUP (etgl);
-}
-
-static void
-etgl_cursor_change (GtkObject *object, gint row, ETableGroupLeaf *etgl)
-{
- if (row < E_TABLE_SUBSET(etgl->subset)->n_map)
- e_table_group_cursor_change (E_TABLE_GROUP(etgl), E_TABLE_SUBSET(etgl->subset)->map_table[row]);
-}
-
-static void
-etgl_double_click (GtkObject *object, gint row, ETableGroupLeaf *etgl)
-{
- if (row < E_TABLE_SUBSET(etgl->subset)->n_map)
- e_table_group_double_click (E_TABLE_GROUP(etgl), E_TABLE_SUBSET(etgl->subset)->map_table[row]);
-}
-
-static gint
-etgl_key_press (GtkObject *object, gint row, gint col, GdkEvent *event, ETableGroupLeaf *etgl)
-{
- if (row < E_TABLE_SUBSET(etgl->subset)->n_map)
- return e_table_group_key_press (E_TABLE_GROUP(etgl), E_TABLE_SUBSET(etgl->subset)->map_table[row], col, event);
- else
- return 0;
-}
-
-static gint
-etgl_right_click (GtkObject *object, gint row, gint col, GdkEvent *event, ETableGroupLeaf *etgl)
-{
- if (row < E_TABLE_SUBSET(etgl->subset)->n_map)
- return e_table_group_right_click (E_TABLE_GROUP(etgl), E_TABLE_SUBSET(etgl->subset)->map_table[row], col, event);
- else
- return 0;
-}
-
-static void
-etgl_reflow (GnomeCanvasItem *item, gint flags)
-{
- ETableGroupLeaf *leaf = E_TABLE_GROUP_LEAF(item);
- gtk_object_get(GTK_OBJECT(leaf->item),
- "height", &leaf->height,
- NULL);
- gtk_object_get(GTK_OBJECT(leaf->item),
- "width", &leaf->width,
- NULL);
- e_canvas_item_request_parent_reflow (item);
-}
-
-static void
-etgl_realize (GnomeCanvasItem *item)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF(item);
-
- if (GNOME_CANVAS_ITEM_CLASS (etgl_parent_class)->realize)
- GNOME_CANVAS_ITEM_CLASS (etgl_parent_class)->realize (item);
-
- etgl->item = E_TABLE_ITEM(gnome_canvas_item_new (GNOME_CANVAS_GROUP(etgl),
- e_table_item_get_type (),
- "ETableHeader", E_TABLE_GROUP(etgl)->header,
- "ETableModel", etgl->subset,
- "drawgrid", etgl->draw_grid,
- "drawfocus", etgl->draw_focus,
- "cursor_mode", etgl->cursor_mode,
- "minimum_width", etgl->minimum_width,
- "length_threshold", etgl->length_threshold,
- "table_selection_model", etgl->table_selection_model,
- NULL));
-
- gtk_signal_connect (GTK_OBJECT(etgl->item), "cursor_change",
- GTK_SIGNAL_FUNC(etgl_cursor_change), etgl);
- gtk_signal_connect (GTK_OBJECT(etgl->item), "double_click",
- GTK_SIGNAL_FUNC(etgl_double_click), etgl);
- gtk_signal_connect (GTK_OBJECT(etgl->item), "right_click",
- GTK_SIGNAL_FUNC(etgl_right_click), etgl);
- gtk_signal_connect (GTK_OBJECT(etgl->item), "key_press",
- GTK_SIGNAL_FUNC(etgl_key_press), etgl);
- e_canvas_item_request_reflow(item);
-}
-
-static void
-etgl_add (ETableGroup *etg, gint row)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- e_table_subset_variable_add (etgl->subset, row);
-}
-
-static void
-etgl_add_all (ETableGroup *etg)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- e_table_subset_variable_add_all (etgl->subset);
-}
-
-static gboolean
-etgl_remove (ETableGroup *etg, gint row)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- return e_table_subset_variable_remove (etgl->subset, row);
-}
-
-static void
-etgl_increment (ETableGroup *etg, gint position, gint amount)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- e_table_subset_variable_increment (etgl->subset, position, amount);
-}
-
-static void
-etgl_decrement (ETableGroup *etg, gint position, gint amount)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- e_table_subset_variable_decrement (etgl->subset, position, amount);
-}
-
-static int
-etgl_row_count (ETableGroup *etg)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- return e_table_model_row_count(E_TABLE_MODEL(etgl->subset));
-}
-
-static void
-etgl_set_focus (ETableGroup *etg, EFocus direction, gint view_col)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- if (direction == E_FOCUS_END) {
- e_table_item_set_cursor (etgl->item, view_col, e_table_model_row_count(E_TABLE_MODEL(etgl->subset)) - 1);
- } else {
- e_table_item_set_cursor (etgl->item, view_col, 0);
- }
-}
-
-static void
-etgl_set_cursor_row (ETableGroup *etg, gint row)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(etgl->item),
- "cursor_row", row,
- NULL);
-}
-
-static int
-etgl_get_cursor_row (ETableGroup *etg)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- int row;
- gtk_object_get(GTK_OBJECT(etgl->item),
- "cursor_row", &row,
- NULL);
- return row;
-}
-
-static gint
-etgl_get_focus_column (ETableGroup *etg)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- return e_table_item_get_focused_column (etgl->item);
-}
-
-static EPrintable *
-etgl_get_printable (ETableGroup *etg)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- return e_table_item_get_printable (etgl->item);
-}
-
-static void
-etgl_compute_location (ETableGroup *etg, int *x, int *y, int *row, int *col)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- e_table_item_compute_location (etgl->item, x, y, row, col);
-}
-
-static void
-etgl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableGroup *etg = E_TABLE_GROUP (object);
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);
-
- switch (arg_id) {
- case ARG_FROZEN:
- if (GTK_VALUE_BOOL (*arg))
- etg->frozen = TRUE;
- else {
- etg->frozen = FALSE;
- }
- break;
- case ARG_MINIMUM_WIDTH:
- case ARG_WIDTH:
- etgl->minimum_width = GTK_VALUE_DOUBLE(*arg);
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "minimum_width", etgl->minimum_width,
- NULL);
- }
- break;
- case ARG_LENGTH_THRESHOLD:
- etgl->length_threshold = GTK_VALUE_INT (*arg);
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "length_threshold", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
- case ARG_TABLE_SELECTION_MODEL:
- if (etgl->table_selection_model)
- gtk_object_unref(GTK_OBJECT(etgl->table_selection_model));
- etgl->table_selection_model = E_TABLE_SELECTION_MODEL(GTK_VALUE_OBJECT (*arg));
- if (etgl->table_selection_model)
- gtk_object_ref(GTK_OBJECT(etgl->table_selection_model));
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "table_selection_model", etgl->table_selection_model,
- NULL);
- }
-
- case ARG_TABLE_DRAW_GRID:
- etgl->draw_grid = GTK_VALUE_BOOL (*arg);
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "drawgrid", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- etgl->draw_focus = GTK_VALUE_BOOL (*arg);
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "drawfocus", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_CURSOR_MODE:
- etgl->cursor_mode = GTK_VALUE_INT (*arg);
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "cursor_mode", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
- default:
- break;
- }
-}
-
-static void
-etgl_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableGroup *etg = E_TABLE_GROUP (object);
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);
-
- switch (arg_id) {
- case ARG_FROZEN:
- GTK_VALUE_BOOL (*arg) = etg->frozen;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = etgl->height;
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = etgl->width;
- break;
- case ARG_MINIMUM_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = etgl->minimum_width;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-etgl_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
- ETableGroupClass *e_group_class = E_TABLE_GROUP_CLASS(object_class);
-
- object_class->destroy = etgl_destroy;
- object_class->set_arg = etgl_set_arg;
- object_class->get_arg = etgl_get_arg;
-
- item_class->realize = etgl_realize;
-
- etgl_parent_class = gtk_type_class (PARENT_TYPE);
-
- e_group_class->add = etgl_add;
- e_group_class->add_all = etgl_add_all;
- e_group_class->remove = etgl_remove;
- e_group_class->increment = etgl_increment;
- e_group_class->decrement = etgl_decrement;
- e_group_class->row_count = etgl_row_count;
- e_group_class->set_focus = etgl_set_focus;
- e_group_class->set_cursor_row = etgl_set_cursor_row;
- e_group_class->get_cursor_row = etgl_get_cursor_row;
- e_group_class->get_focus_column = etgl_get_focus_column;
- e_group_class->get_printable = etgl_get_printable;
- e_group_class->compute_location = etgl_compute_location;
-
- gtk_object_add_arg_type ("ETableGroupLeaf::drawgrid", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_GRID);
- gtk_object_add_arg_type ("ETableGroupLeaf::drawfocus", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_FOCUS);
- gtk_object_add_arg_type ("ETableGroupLeaf::cursor_mode", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_CURSOR_MODE);
- gtk_object_add_arg_type ("ETableGroupLeaf::length_threshold", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
- gtk_object_add_arg_type ("ETableGroupLeaf::table_selection_model", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_SELECTION_MODEL);
-
- gtk_object_add_arg_type ("ETableGroupLeaf::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("ETableGroupLeaf::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableGroupLeaf::minimum_width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MINIMUM_WIDTH);
- gtk_object_add_arg_type ("ETableGroupLeaf::frozen", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_FROZEN);
-}
-
-static void
-etgl_init (GtkObject *object)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);
-
- etgl->width = 1;
- etgl->height = 1;
- etgl->minimum_width = 0;
-
- etgl->subset = NULL;
- etgl->item = NULL;
-
- etgl->draw_grid = 1;
- etgl->draw_focus = 1;
- etgl->cursor_mode = E_TABLE_CURSOR_SIMPLE;
- etgl->length_threshold = -1;
-
- etgl->table_selection_model = NULL;
-
- e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM(object), etgl_reflow);
-}
-
-E_MAKE_TYPE (e_table_group_leaf, "ETableGroupLeaf", ETableGroupLeaf, etgl_class_init, etgl_init, PARENT_TYPE);
diff --git a/widgets/e-table/e-table-group-leaf.h b/widgets/e-table/e-table-group-leaf.h
deleted file mode 100644
index 1cc041206b..0000000000
--- a/widgets/e-table/e-table-group-leaf.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_GROUP_LEAF_H_
-#define _E_TABLE_GROUP_LEAF_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-table-group.h"
-#include "e-table-sorted-variable.h"
-#include "e-table-item.h"
-
-#define E_TABLE_GROUP_LEAF_TYPE (e_table_group_leaf_get_type ())
-#define E_TABLE_GROUP_LEAF(o) (GTK_CHECK_CAST ((o), E_TABLE_GROUP_LEAF_TYPE, ETableGroupLeaf))
-#define E_TABLE_GROUP_LEAF_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_GROUP_LEAF_TYPE, ETableGroupLeafClass))
-#define E_IS_TABLE_GROUP_LEAF(o) (GTK_CHECK_TYPE ((o), E_TABLE_GROUP_LEAF_TYPE))
-#define E_IS_TABLE_GROUP_LEAF_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_GROUP_LEAF_TYPE))
-
-typedef struct {
- ETableGroup group;
-
- /*
- * Item.
- */
- ETableItem *item;
-
- gdouble height;
- gdouble width;
- gdouble minimum_width;
-
- ETableSubsetVariable *subset;
-
- int length_threshold;
-
- guint draw_grid : 1;
- guint draw_focus : 1;
- ETableCursorMode cursor_mode;
-
- ETableSelectionModel *table_selection_model;
-} ETableGroupLeaf;
-
-typedef struct {
- ETableGroupClass parent_class;
-} ETableGroupLeafClass;
-
-ETableGroup *e_table_group_leaf_new (GnomeCanvasGroup *parent,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model,
- ETableSortInfo *sort_info);
-GtkType e_table_group_leaf_get_type (void);
-
-
-#endif /* _E_TABLE_GROUP_LEAF_H_ */
-
diff --git a/widgets/e-table/e-table-group.c b/widgets/e-table/e-table-group.c
deleted file mode 100644
index fbd9026096..0000000000
--- a/widgets/e-table/e-table-group.c
+++ /dev/null
@@ -1,420 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-Table-Group.c: Implements the grouping objects for elements on a table
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- * Chris Lahey (clahey@helixcode.com)
- *
- * Copyright 1999, 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-group.h"
-#include "e-table-group-container.h"
-#include "e-table-group-leaf.h"
-#include "e-table-item.h"
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include "e-util/e-util.h"
-
-#define PARENT_TYPE gnome_canvas_group_get_type ()
-
-#define ETG_CLASS(e) (E_TABLE_GROUP_CLASS(GTK_OBJECT(e)->klass))
-
-static GnomeCanvasGroupClass *etg_parent_class;
-
-enum {
- CURSOR_CHANGE,
- DOUBLE_CLICK,
- RIGHT_CLICK,
- KEY_PRESS,
- LAST_SIGNAL
-};
-
-static gint etg_signals [LAST_SIGNAL] = { 0, };
-
-static gboolean etg_get_focus (ETableGroup *etg);
-static void etg_destroy (GtkObject *object);
-
-static void
-etg_destroy (GtkObject *object)
-{
- ETableGroup *etg = E_TABLE_GROUP(object);
- if (etg->header)
- gtk_object_unref (GTK_OBJECT(etg->header));
- if (etg->full_header)
- gtk_object_unref (GTK_OBJECT(etg->full_header));
- if (etg->model)
- gtk_object_unref (GTK_OBJECT(etg->model));
- if (GTK_OBJECT_CLASS (etg_parent_class)->destroy)
- GTK_OBJECT_CLASS (etg_parent_class)->destroy (object);
-}
-
-ETableGroup *
-e_table_group_new (GnomeCanvasGroup *parent,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model,
- ETableSortInfo *sort_info,
- int n)
-{
- g_return_val_if_fail (model != NULL, NULL);
-
- if (n < e_table_sort_info_grouping_get_count(sort_info)) {
- return e_table_group_container_new (parent, full_header, header, model, sort_info, n);
- } else {
- return e_table_group_leaf_new (parent, full_header, header, model, sort_info);
- }
- return NULL;
-}
-
-void
-e_table_group_construct (GnomeCanvasGroup *parent,
- ETableGroup *etg,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model)
-{
- etg->full_header = full_header;
- gtk_object_ref (GTK_OBJECT(etg->full_header));
- etg->header = header;
- gtk_object_ref (GTK_OBJECT(etg->header));
- etg->model = model;
- gtk_object_ref (GTK_OBJECT(etg->model));
- gnome_canvas_item_constructv (GNOME_CANVAS_ITEM (etg), parent, 0, NULL);
-}
-
-void
-e_table_group_add (ETableGroup *etg,
- gint row)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->add)
- ETG_CLASS (etg)->add (etg, row);
-}
-
-void
-e_table_group_add_all (ETableGroup *etg)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->add_all)
- ETG_CLASS (etg)->add_all (etg);
-}
-
-gboolean
-e_table_group_remove (ETableGroup *etg,
- gint row)
-{
- g_return_val_if_fail (etg != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), FALSE);
-
- if (ETG_CLASS (etg)->remove)
- return ETG_CLASS (etg)->remove (etg, row);
- else
- return FALSE;
-}
-
-gint
-e_table_group_get_count (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), 0);
-
- if (ETG_CLASS (etg)->get_count)
- return ETG_CLASS (etg)->get_count (etg);
- else
- return 0;
-}
-
-gint
-e_table_group_row_count (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), 0);
-
- if (ETG_CLASS (etg)->row_count)
- return ETG_CLASS (etg)->row_count (etg);
- else
- return 0;
-}
-
-void
-e_table_group_increment (ETableGroup *etg,
- gint position,
- gint amount)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->increment)
- ETG_CLASS (etg)->increment (etg, position, amount);
-}
-
-void
-e_table_group_decrement (ETableGroup *etg,
- gint position,
- gint amount)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->decrement)
- ETG_CLASS (etg)->decrement (etg, position, amount);
-}
-
-void
-e_table_group_set_focus (ETableGroup *etg,
- EFocus direction,
- gint row)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->set_focus)
- ETG_CLASS (etg)->set_focus (etg, direction, row);
-}
-
-void
-e_table_group_set_cursor_row (ETableGroup *etg,
- gint row)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->set_cursor_row)
- ETG_CLASS (etg)->set_cursor_row (etg, row);
-}
-
-int
-e_table_group_get_cursor_row (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, -1);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), -1);
-
- if (ETG_CLASS (etg)->get_cursor_row)
- return ETG_CLASS (etg)->get_cursor_row (etg);
- else
- return -1;
-}
-
-gboolean
-e_table_group_get_focus (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), FALSE);
-
- if (ETG_CLASS (etg)->get_focus)
- return ETG_CLASS (etg)->get_focus (etg);
- else
- return FALSE;
-}
-
-gboolean
-e_table_group_get_focus_column (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), FALSE);
-
- if (ETG_CLASS (etg)->get_focus_column)
- return ETG_CLASS (etg)->get_focus_column (etg);
- else
- return FALSE;
-}
-
-ETableCol *
-e_table_group_get_ecol (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), NULL);
-
- if (ETG_CLASS (etg)->get_ecol)
- return ETG_CLASS (etg)->get_ecol (etg);
- else
- return NULL;
-}
-
-EPrintable *
-e_table_group_get_printable (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), NULL);
-
- if (ETG_CLASS (etg)->get_printable)
- return ETG_CLASS (etg)->get_printable (etg);
- else
- return NULL;
-}
-
-void
-e_table_group_compute_location (ETableGroup *etg, int *x, int *y, int *row, int *col)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->compute_location)
- ETG_CLASS (etg)->compute_location (etg, x, y, row, col);
-}
-
-void
-e_table_group_cursor_change (ETableGroup *e_table_group, gint row)
-{
- g_return_if_fail (e_table_group != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (e_table_group));
-
- gtk_signal_emit (GTK_OBJECT (e_table_group),
- etg_signals [CURSOR_CHANGE],
- row);
-}
-
-void
-e_table_group_double_click (ETableGroup *e_table_group, gint row)
-{
- g_return_if_fail (e_table_group != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (e_table_group));
-
- gtk_signal_emit (GTK_OBJECT (e_table_group),
- etg_signals [DOUBLE_CLICK],
- row);
-}
-
-gint
-e_table_group_right_click (ETableGroup *e_table_group, gint row, gint col, GdkEvent *event)
-{
- gint return_val = 0;
-
- g_return_val_if_fail (e_table_group != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_GROUP (e_table_group), 0);
-
- gtk_signal_emit (GTK_OBJECT (e_table_group),
- etg_signals [RIGHT_CLICK],
- row, col, event, &return_val);
-
- return return_val;
-}
-
-gint
-e_table_group_key_press (ETableGroup *e_table_group, gint row, gint col, GdkEvent *event)
-{
- gint return_val = 0;
-
- g_return_val_if_fail (e_table_group != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_GROUP (e_table_group), 0);
-
- gtk_signal_emit (GTK_OBJECT (e_table_group),
- etg_signals [KEY_PRESS],
- row, col, event, &return_val);
-
- return return_val;
-}
-
-ETableHeader *
-e_table_group_get_header (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), NULL);
-
- return etg->header;
-}
-
-static int
-etg_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- ETableGroup *etg = E_TABLE_GROUP (item);
- gboolean return_val = TRUE;
-
- switch (event->type) {
-
- case GDK_FOCUS_CHANGE:
- etg->has_focus = event->focus_change.in;
- return_val = FALSE;
-
- default:
- return_val = FALSE;
- }
- if (return_val == FALSE){
- if (GNOME_CANVAS_ITEM_CLASS(etg_parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS(etg_parent_class)->event (item, event);
- }
- return return_val;
-
-}
-
-static gboolean
-etg_get_focus (ETableGroup *etg)
-{
- return etg->has_focus;
-}
-
-static void
-etg_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
- ETableGroupClass *klass = (ETableGroupClass *) object_class;
-
- object_class->destroy = etg_destroy;
-
- item_class->event = etg_event;
-
- klass->cursor_change = NULL;
- klass->double_click = NULL;
- klass->right_click = NULL;
- klass->key_press = NULL;
-
- klass->add = NULL;
- klass->add_all = NULL;
- klass->remove = NULL;
- klass->get_count = NULL;
- klass->row_count = NULL;
- klass->increment = NULL;
- klass->decrement = NULL;
- klass->set_focus = NULL;
- klass->set_cursor_row = NULL;
- klass->get_cursor_row = NULL;
- klass->get_focus = etg_get_focus;
- klass->get_ecol = NULL;
- klass->get_printable = NULL;
- klass->compute_location = NULL;
-
- etg_parent_class = gtk_type_class (PARENT_TYPE);
-
- etg_signals [CURSOR_CHANGE] =
- gtk_signal_new ("cursor_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableGroupClass, cursor_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- etg_signals [DOUBLE_CLICK] =
- gtk_signal_new ("double_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableGroupClass, double_click),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- etg_signals [RIGHT_CLICK] =
- gtk_signal_new ("right_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableGroupClass, right_click),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- etg_signals [KEY_PRESS] =
- gtk_signal_new ("key_press",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableGroupClass, key_press),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (object_class, etg_signals, LAST_SIGNAL);
-}
-
-E_MAKE_TYPE (e_table_group, "ETableGroup", ETableGroup, etg_class_init, NULL, PARENT_TYPE);
diff --git a/widgets/e-table/e-table-group.glade b/widgets/e-table/e-table-group.glade
deleted file mode 100644
index 39274d3c61..0000000000
--- a/widgets/e-table/e-table-group.glade
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>False</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-table-group.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GtkWindow</class>
- <name>window1</name>
- <title>window1</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
-
- <widget>
- <class>GtkTable</class>
- <name>table1</name>
- <rows>3</rows>
- <columns>3</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>0</column_spacing>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame1</name>
- <border_width>4</border_width>
- <label>Available fields</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
-
- <widget>
- <class>GtkCList</class>
- <name>clist1</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>False</show_titles>
- <shadow_type>GTK_SHADOW_NONE</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label1</name>
- <label>label1</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame2</name>
- <border_width>4</border_width>
- <label>Show in this order</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow2</name>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
-
- <widget>
- <class>GtkCList</class>
- <name>clist2</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>False</show_titles>
- <shadow_type>GTK_SHADOW_NONE</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label2</name>
- <label>label2</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox1</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>4</xpad>
- <ypad>4</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <border_width>4</border_width>
- <can_focus>True</can_focus>
- <label>Add &gt;&gt;</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button2</name>
- <border_width>4</border_width>
- <can_focus>True</can_focus>
- <label>&lt;&lt; Remove</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/widgets/e-table/e-table-group.glade.h b/widgets/e-table/e-table-group.glade.h
deleted file mode 100644
index 3ab6304734..0000000000
--- a/widgets/e-table/e-table-group.glade.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("window1");
-gchar *s = N_("Available fields");
-gchar *s = N_("label1");
-gchar *s = N_("Show in this order");
-gchar *s = N_("label2");
-gchar *s = N_("Add >>");
-gchar *s = N_("<< Remove");
diff --git a/widgets/e-table/e-table-group.h b/widgets/e-table/e-table-group.h
deleted file mode 100644
index a3afe7f5e1..0000000000
--- a/widgets/e-table/e-table-group.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_GROUP_H_
-#define _E_TABLE_GROUP_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-table-model.h"
-#include "e-table-header.h"
-#include "e-table-sort-info.h"
-#include "e-table-defines.h"
-#include "e-util/e-util.h"
-#include "e-util/e-printable.h"
-
-#define E_TABLE_GROUP_TYPE (e_table_group_get_type ())
-#define E_TABLE_GROUP(o) (GTK_CHECK_CAST ((o), E_TABLE_GROUP_TYPE, ETableGroup))
-#define E_TABLE_GROUP_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_GROUP_TYPE, ETableGroupClass))
-#define E_IS_TABLE_GROUP(o) (GTK_CHECK_TYPE ((o), E_TABLE_GROUP_TYPE))
-#define E_IS_TABLE_GROUP_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_GROUP_TYPE))
-
-typedef struct {
- GnomeCanvasGroup group;
-
- /*
- * The full header.
- */
- ETableHeader *full_header;
- ETableHeader *header;
-
- /*
- * The model we pull data from.
- */
- ETableModel *model;
-
- /*
- * Whether we should add indentation and open/close markers,
- * or if we just act as containers of subtables.
- */
- guint transparent : 1;
-
- guint has_focus : 1;
-
- guint frozen : 1;
-} ETableGroup;
-
-typedef struct {
- GnomeCanvasGroupClass parent_class;
-
- /* Signals */
- void (*cursor_change) (ETableGroup *etg, int row);
- void (*double_click) (ETableGroup *etg, int row);
- gint (*right_click) (ETableGroup *etg, int row, int col, GdkEvent *event);
- gint (*key_press) (ETableGroup *etg, int row, int col, GdkEvent *event);
-
- /* Virtual functions. */
- void (*add) (ETableGroup *etg, gint row);
- void (*add_all) (ETableGroup *etg);
- gboolean (*remove) (ETableGroup *etg, gint row);
- gint (*get_count) (ETableGroup *etg);
- gint (*row_count) (ETableGroup *etg);
- void (*increment) (ETableGroup *etg, gint position, gint amount);
- void (*decrement) (ETableGroup *etg, gint position, gint amount);
- void (*set_focus) (ETableGroup *etg, EFocus direction, gint view_col);
- void (*set_cursor_row) (ETableGroup *etg, gint row);
- int (*get_cursor_row) (ETableGroup *etg);
- gboolean (*get_focus) (ETableGroup *etg);
- gint (*get_focus_column) (ETableGroup *etg);
- ETableCol *(*get_ecol) (ETableGroup *etg);
- EPrintable *(*get_printable) (ETableGroup *etg);
- void (*compute_location) (ETableGroup *etg, int *x, int *y, int *row, int *col);
-
-} ETableGroupClass;
-
-/* Virtual functions */
-void e_table_group_add (ETableGroup *etg,
- gint row);
-void e_table_group_add_all (ETableGroup *etg);
-gboolean e_table_group_remove (ETableGroup *etg,
- gint row);
-gint e_table_group_get_count (ETableGroup *etg);
-void e_table_group_increment (ETableGroup *etg,
- gint position,
- gint amount);
-void e_table_group_decrement (ETableGroup *etg,
- gint position,
- gint amount);
-gint e_table_group_row_count (ETableGroup *etg);
-void e_table_group_set_focus (ETableGroup *etg,
- EFocus direction,
- gint view_col);
-void e_table_group_set_cursor_row (ETableGroup *etg,
- gint row);
-int e_table_group_get_cursor_row (ETableGroup *etg);
-gboolean e_table_group_get_focus (ETableGroup *etg);
-gint e_table_group_get_focus_column (ETableGroup *etg);
-ETableHeader *e_table_group_get_header (ETableGroup *etg);
-ETableCol *e_table_group_get_ecol (ETableGroup *etg);
-EPrintable *e_table_group_get_printable (ETableGroup *etg);
-void e_table_group_compute_location (ETableGroup *etg,
- int *x,
- int *y,
- int *row,
- int *col);
-
-ETableGroup *e_table_group_new (GnomeCanvasGroup *parent,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model,
- ETableSortInfo *sort_info,
- int n);
-void e_table_group_construct (GnomeCanvasGroup *parent,
- ETableGroup *etg,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model);
-
-/* For emitting the signals */
-void e_table_group_cursor_change (ETableGroup *etg,
- gint row);
-void e_table_group_double_click (ETableGroup *etg,
- gint row);
-gint e_table_group_right_click (ETableGroup *etg,
- gint row,
- gint col,
- GdkEvent *event);
-gint e_table_group_key_press (ETableGroup *etg,
- gint row,
- gint col,
- GdkEvent *event);
-
-GtkType e_table_group_get_type (void);
-
-typedef void (*ETableGroupLeafFn) (void *e_table_item, void *closure);
-void e_table_group_apply_to_leafs (ETableGroup *etg,
- ETableGroupLeafFn fn, void *closure);
-
-#endif /* _E_TABLE_GROUP_H_ */
diff --git a/widgets/e-table/e-table-header-item.c b/widgets/e-table/e-table-header-item.c
deleted file mode 100644
index 506ad546ca..0000000000
--- a/widgets/e-table/e-table-header-item.c
+++ /dev/null
@@ -1,1449 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-column-view.c: A canvas item based view of the ETableColumn.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkdnd.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <libgnomeui/gnome-canvas-util.h>
-#include <libgnomeui/gnome-canvas-polygon.h>
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include "e-util/e-cursors.h"
-#include "e-util/e-xml-utils.h"
-#include "e-util/e-popup-menu.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-col-dnd.h"
-#include "e-table-defines.h"
-#include "e-table-field-chooser-dialog.h"
-
-#include "add-col.xpm"
-#include "remove-col.xpm"
-#include "arrow-up.xpm"
-#include "arrow-down.xpm"
-
-enum {
- BUTTON_PRESSED,
- LAST_SIGNAL
-};
-
-static guint ethi_signals [LAST_SIGNAL] = { 0, };
-
-#define ARROW_DOWN_HEIGHT 16
-#define ARROW_PTR 7
-
-/* Defines the tolerance for proximity of the column division to the cursor position */
-#define TOLERANCE 4
-
-#define ETHI_RESIZING(x) ((x)->resize_col != -1)
-
-#define PARENT_OBJECT_TYPE gnome_canvas_item_get_type ()
-
-#define ELEMENTS(x) (sizeof (x) / sizeof (x[0]))
-
-static GnomeCanvasItemClass *ethi_parent_class;
-
-static void ethi_drop_table_header (ETableHeaderItem *ethi);
-
-/*
- * They display the arrows for the drop location.
- */
-
-static GtkWidget *arrow_up, *arrow_down;
-
-/*
- * DnD icons
- */
-static GdkColormap *dnd_colormap;
-static GdkPixmap *remove_col_pixmap, *remove_col_mask;
-static GdkPixmap *add_col_pixmap, *add_col_mask;
-
-enum {
- ARG_0,
- ARG_TABLE_HEADER,
- ARG_FULL_HEADER,
- ARG_DND_CODE,
- ARG_TABLE_FONTSET,
- ARG_SORT_INFO
-};
-
-static void
-ethi_destroy (GtkObject *object){
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (object);
-
- ethi_drop_table_header (ethi);
-
- if (ethi->sort_info){
- if (ethi->sort_info_changed_id)
- gtk_signal_disconnect (GTK_OBJECT(ethi->sort_info), ethi->sort_info_changed_id);
- if (ethi->group_info_changed_id)
- gtk_signal_disconnect (GTK_OBJECT(ethi->sort_info), ethi->group_info_changed_id);
- gtk_object_unref (GTK_OBJECT(ethi->sort_info));
- }
-
- if (GTK_OBJECT_CLASS (ethi_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (ethi_parent_class)->destroy) (object);
-}
-
-static void
-ethi_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-
- double i2c [6];
- ArtPoint c1, c2, i1, i2;
-
- if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->update)
- (*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->update)(item, affine, clip_path, flags);
-
-
- if (ethi->sort_info)
- ethi->group_indent_width = e_table_sort_info_grouping_get_count(ethi->sort_info) * GROUP_INDENT;
- else
- ethi->group_indent_width = 0;
-
- ethi->width = e_table_header_total_width (ethi->eth) + ethi->group_indent_width;
-
- i1.x = i1.y = 0;
- i2.x = ethi->width;
- i2.y = ethi->height;
-
- gnome_canvas_item_i2c_affine (item, i2c);
- art_affine_point (&c1, &i1, i2c);
- art_affine_point (&c2, &i2, i2c);
-
- if (item->x1 != c1.x ||
- item->y1 != c1.y ||
- item->x2 != c2.x ||
- item->y2 != c2.y)
- {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- item->x1 = c1.x;
- item->y1 = c1.y;
- item->x2 = c2.x;
- item->y2 = c2.y;
-
- gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item);
- }
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
-}
-
-static void
-ethi_font_load (ETableHeaderItem *ethi, char *font)
-{
- if (ethi->font)
- gdk_font_unref (ethi->font);
-
- ethi->font = gdk_fontset_load (font);
- if (ethi->font == NULL)
- ethi->font = gdk_font_load ("-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1");
-
- ethi->height = ethi->font->ascent + ethi->font->descent + HEADER_PADDING;
- if (ethi->height < MIN_ARROW_SIZE + 4 + HEADER_PADDING)
- ethi->height = MIN_ARROW_SIZE + 4 + HEADER_PADDING;
-}
-
-static void
-ethi_drop_table_header (ETableHeaderItem *ethi)
-{
- GtkObject *header;
-
- if (!ethi->eth)
- return;
-
- header = GTK_OBJECT (ethi->eth);
- gtk_signal_disconnect (header, ethi->structure_change_id);
- gtk_signal_disconnect (header, ethi->dimension_change_id);
-
- gtk_object_unref (header);
- ethi->eth = NULL;
- ethi->width = 0;
-}
-
-static void
-structure_changed (ETableHeader *header, ETableHeaderItem *ethi)
-{
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-dimension_changed (ETableHeader *header, int col, ETableHeaderItem *ethi)
-{
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_add_table_header (ETableHeaderItem *ethi, ETableHeader *header)
-{
- ethi->eth = header;
- gtk_object_ref (GTK_OBJECT (ethi->eth));
-
- ethi->structure_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "structure_change",
- GTK_SIGNAL_FUNC(structure_changed), ethi);
- ethi->dimension_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "dimension_change",
- GTK_SIGNAL_FUNC(dimension_changed), ethi);
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_sort_info_changed (ETableSortInfo *sort_info, ETableHeaderItem *ethi)
-{
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableHeaderItem *ethi;
-
- item = GNOME_CANVAS_ITEM (o);
- ethi = E_TABLE_HEADER_ITEM (o);
-
- switch (arg_id){
- case ARG_TABLE_HEADER:
- ethi_drop_table_header (ethi);
- ethi_add_table_header (ethi, E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg)));
- break;
-
- case ARG_FULL_HEADER:
- if (ethi->full_header)
- gtk_object_unref(GTK_OBJECT(ethi->full_header));
- ethi->full_header = E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg));
- if (ethi->full_header)
- gtk_object_ref(GTK_OBJECT(ethi->full_header));
- break;
-
- case ARG_DND_CODE:
- g_free(ethi->dnd_code);
- ethi->dnd_code = g_strdup (GTK_VALUE_STRING (*arg));
- break;
-
- case ARG_TABLE_FONTSET:
- ethi_font_load (ethi, GTK_VALUE_STRING (*arg));
- break;
-
- case ARG_SORT_INFO:
- if (ethi->sort_info){
- if (ethi->sort_info_changed_id)
- gtk_signal_disconnect (
- GTK_OBJECT(ethi->sort_info),
- ethi->sort_info_changed_id);
-
- if (ethi->group_info_changed_id)
- gtk_signal_disconnect (
- GTK_OBJECT(ethi->sort_info),
- ethi->group_info_changed_id);
- gtk_object_unref (GTK_OBJECT(ethi->sort_info));
- }
- ethi->sort_info = GTK_VALUE_POINTER (*arg);
- gtk_object_ref (GTK_OBJECT(ethi->sort_info));
- ethi->sort_info_changed_id =
- gtk_signal_connect (
- GTK_OBJECT(ethi->sort_info), "sort_info_changed",
- GTK_SIGNAL_FUNC(ethi_sort_info_changed), ethi);
- ethi->group_info_changed_id =
- gtk_signal_connect (
- GTK_OBJECT(ethi->sort_info), "group_info_changed",
- GTK_SIGNAL_FUNC(ethi_sort_info_changed), ethi);
- break;
-
- }
- gnome_canvas_item_request_update(item);
-}
-
-static void
-ethi_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableHeaderItem *ethi;
-
- ethi = E_TABLE_HEADER_ITEM (o);
-
- switch (arg_id){
- case ARG_FULL_HEADER:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT (ethi->full_header);
- break;
- case ARG_DND_CODE:
- GTK_VALUE_STRING (*arg) = g_strdup (ethi->dnd_code);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static int
-ethi_find_col_by_x (ETableHeaderItem *ethi, int x)
-{
- const int cols = e_table_header_count (ethi->eth);
- int x1 = 0;
- int col;
-
- if (x < x1)
- return -1;
-
- x1 += ethi->group_indent_width;
-
- for (col = 0; col < cols; col++){
- ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-
- if ((x >= x1) && (x <= x1 + ecol->width))
- return col;
-
- x1 += ecol->width;
- }
- return -1;
-}
-
-static int
-ethi_find_col_by_x_nearest (ETableHeaderItem *ethi, int x)
-{
- const int cols = e_table_header_count (ethi->eth);
- int x1 = 0;
- int col;
-
- if (x < x1)
- return -1;
-
- x1 += ethi->group_indent_width;
-
- for (col = 0; col < cols; col++){
- ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-
- x1 += (ecol->width / 2);
-
- if (x <= x1)
- return col;
-
- x1 += (ecol->width + 1) / 2;
- }
- return col;
-}
-
-static void
-ethi_remove_drop_marker (ETableHeaderItem *ethi)
-{
- if (ethi->drag_mark == -1)
- return;
-
- gtk_widget_hide (arrow_up);
- gtk_widget_hide (arrow_down);
-
- ethi->drag_mark = -1;
-}
-
-static GtkWidget *
-make_shapped_window_from_xpm (const char **xpm)
-{
- GdkPixbuf *pixbuf;
- GdkPixmap *pixmap;
- GdkBitmap *bitmap;
- GtkWidget *win, *pix;
-
- pixbuf = gdk_pixbuf_new_from_xpm_data (xpm);
- gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, &bitmap, 128);
- gdk_pixbuf_unref (pixbuf);
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
- win = gtk_window_new (GTK_WINDOW_POPUP);
- pix = gtk_pixmap_new (pixmap, bitmap);
- gtk_widget_realize (win);
- gtk_container_add (GTK_CONTAINER (win), pix);
- gtk_widget_shape_combine_mask (win, bitmap, 0, 0);
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
-
- gdk_pixmap_unref (pixmap);
- gdk_bitmap_unref (bitmap);
-
- return win;
-}
-
-static void
-ethi_add_drop_marker (ETableHeaderItem *ethi, int col)
-{
- int rx, ry;
- int x;
-
- if (ethi->drag_mark == col)
- return;
-
- ethi->drag_mark = col;
-
- x = e_table_header_col_diff (ethi->eth, 0, col);
- if (col > 0)
- x += ethi->group_indent_width;
-
- if (!arrow_up){
- arrow_up = make_shapped_window_from_xpm (arrow_up_xpm);
- arrow_down = make_shapped_window_from_xpm (arrow_down_xpm);
- }
-
- gdk_window_get_origin (
- GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas)->window,
- &rx, &ry);
-
- gtk_widget_set_uposition (arrow_down, rx + x - ARROW_PTR, ry - ARROW_DOWN_HEIGHT);
- gtk_widget_show_all (arrow_down);
-
- gtk_widget_set_uposition (arrow_up, rx + x - ARROW_PTR, ry + ethi->height);
- gtk_widget_show_all (arrow_up);
-}
-
-#define gray50_width 2
-#define gray50_height 2
-static char gray50_bits [] = {
- 0x02, 0x01, };
-
-static void
-ethi_add_destroy_marker (ETableHeaderItem *ethi)
-{
- double x1;
-
- if (ethi->remove_item)
- gtk_object_destroy (GTK_OBJECT (ethi->remove_item));
-
- if (!ethi->stipple)
- ethi->stipple = gdk_bitmap_create_from_data (
- NULL, gray50_bits, gray50_width, gray50_height);
-
- x1 = (double) e_table_header_col_diff (ethi->eth, 0, ethi->drag_col);
- if (ethi->drag_col > 0)
- x1 += ethi->group_indent_width;
-
- ethi->remove_item = gnome_canvas_item_new (
- GNOME_CANVAS_GROUP (GNOME_CANVAS_ITEM (ethi)->canvas->root),
- gnome_canvas_rect_get_type (),
- "x1", x1 + 1,
- "y1", (double) 1,
- "x2", (double) x1 + e_table_header_col_diff (
- ethi->eth, ethi->drag_col, ethi->drag_col+1) - 2,
-
- "y2", (double) ethi->height - 2,
- "fill_color", "red",
- "fill_stipple", ethi->stipple,
- NULL);
-}
-
-static void
-ethi_remove_destroy_marker (ETableHeaderItem *ethi)
-{
- if (!ethi->remove_item)
- return;
-
- gtk_object_destroy (GTK_OBJECT (ethi->remove_item));
- ethi->remove_item = NULL;
-}
-
-#if 0
-static gboolean
-moved (ETableHeaderItem *ethi, guint col, guint model_col)
-{
- if (col == -1)
- return TRUE;
- ecol = e_table_header_get_column (ethi->eth, col);
- if (ecol->col_idx == model_col)
- return FALSE;
- if (col > 0) {
- ecol = e_table_header_get_column (ethi->eth, col - 1);
- if (ecol->col_idx == model_col)
- return FALSE;
- }
- return TRUE;
-}
-#endif
-
-static gboolean
-ethi_drag_motion (GtkObject *canvas, GdkDragContext *context,
- gint x, gint y, guint time,
- ETableHeaderItem *ethi)
-{
- gdk_drag_status (context, 0, time);
- if ((x >= 0) && (x <= (ethi->width)) &&
- (y >= 0) && (y <= (ethi->height))){
- int col;
-
- col = ethi_find_col_by_x_nearest (ethi, x);
-
- if (col == ethi->drag_col || col == ethi->drag_col + 1) {
- if (ethi->drag_col != -1)
- ethi_remove_destroy_marker (ethi);
-
- ethi_remove_drop_marker (ethi);
- gdk_drag_status (context, context->suggested_action, time);
- }
- else if (col != -1){
- if (ethi->drag_col != -1)
- ethi_remove_destroy_marker (ethi);
-
- ethi_add_drop_marker (ethi, col);
- gdk_drag_status (context, context->suggested_action, time);
- } else {
- ethi_remove_drop_marker (ethi);
- if (ethi->drag_col != -1)
- ethi_add_destroy_marker (ethi);
- }
- } else {
- ethi_remove_drop_marker (ethi);
- if (ethi->drag_col != -1)
- ethi_add_destroy_marker (ethi);
- }
-
- return TRUE;
-}
-
-static void
-ethi_drag_end (GtkWidget *canvas, GdkDragContext *context, ETableHeaderItem *ethi)
-{
- if (context->action == 0) {
- e_table_header_remove (ethi->eth, ethi->drag_col);
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
- }
- ethi_remove_drop_marker (ethi);
- ethi_remove_destroy_marker (ethi);
- ethi->drag_col = -1;
-}
-
-static void
-ethi_drag_data_received (GtkWidget *canvas,
- GdkDragContext *drag_context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- ETableHeaderItem *ethi)
-{
- int found = FALSE;
- int count = e_table_header_count(ethi->eth);
- int column = atoi(data->data);
- int drop_col = ethi->drop_col;
- int i;
- ethi->drop_col = -1;
- if (column < 0)
- return;
- for (i = 0; i < count; i++) {
- ETableCol *ecol = e_table_header_get_column (ethi->eth, i);
- if (ecol->col_idx == column) {
- e_table_header_move(ethi->eth, i, drop_col);
- found = TRUE;
- break;
- }
- }
- if (!found) {
- count = e_table_header_count(ethi->full_header);
- for (i = 0; i < count; i++) {
- ETableCol *ecol = e_table_header_get_column (ethi->full_header, i);
- if (ecol->col_idx == column) {
- e_table_header_add_column (ethi->eth, ecol, drop_col);
- break;
- }
- }
- }
- ethi_remove_drop_marker (ethi);
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_drag_data_get (GtkWidget *canvas,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETableHeaderItem *ethi)
-{
- if (ethi->drag_col != -1) {
- ETableCol *ecol = e_table_header_get_column (ethi->eth, ethi->drag_col);
-
- gchar *string = g_strdup_printf("%d", ecol->col_idx);
- gtk_selection_data_set(selection_data,
- GDK_SELECTION_TYPE_STRING,
- sizeof(string[0]),
- string,
- strlen(string));
- g_free(string);
- }
-}
-
-static gboolean
-ethi_drag_drop (GtkWidget *canvas,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- ETableHeaderItem *ethi)
-{
- gboolean successful = FALSE;
-
- if ((x >= 0) && (x <= (ethi->width)) &&
- (y >= 0) && (y <= (ethi->height))){
- int col;
-
- col = ethi_find_col_by_x_nearest (ethi, x);
-
- ethi_add_drop_marker (ethi, col);
-
- ethi->drop_col = col;
-
- if (col != -1) {
- char *target = g_strdup_printf ("%s-%s", TARGET_ETABLE_COL_TYPE, ethi->dnd_code);
- gtk_drag_get_data (canvas, context, gdk_atom_intern(target, FALSE), time);
- g_free (target);
- }
- }
- gtk_drag_finish (context, successful, successful, time);
- return successful;
-}
-
-static void
-ethi_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time, ETableHeaderItem *ethi)
-{
- ethi_remove_drop_marker (ethi);
- if (ethi->drag_col != -1)
- ethi_add_destroy_marker (ethi);
-}
-
-static void
-ethi_realize (GnomeCanvasItem *item)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
- GdkWindow *window;
- GdkColor c;
- GtkTargetEntry ethi_drop_types [] = {
- { TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
- };
-
-
- if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)-> realize)
- (*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->realize)(item);
-
- window = GTK_WIDGET (item->canvas)->window;
-
- ethi->gc = gdk_gc_new (window);
- gnome_canvas_get_color (item->canvas, "black", &c);
- gdk_gc_set_foreground (ethi->gc, &c);
-
- if (!ethi->font)
- ethi_font_load (ethi, "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1");
-
- /*
- * Now, configure DnD
- */
- ethi_drop_types[0].target = g_strdup_printf("%s-%s", ethi_drop_types[0].target, ethi->dnd_code);
- gtk_drag_dest_set (GTK_WIDGET (item->canvas), 0,
- ethi_drop_types, ELEMENTS (ethi_drop_types),
- GDK_ACTION_MOVE);
- g_free(ethi_drop_types[0].target);
-
- /* Drop signals */
- ethi->drag_motion_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_motion",
- GTK_SIGNAL_FUNC (ethi_drag_motion), ethi);
- ethi->drag_leave_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_leave",
- GTK_SIGNAL_FUNC (ethi_drag_leave), ethi);
- ethi->drag_drop_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_drop",
- GTK_SIGNAL_FUNC (ethi_drag_drop), ethi);
- ethi->drag_data_received_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_data_received",
- GTK_SIGNAL_FUNC (ethi_drag_data_received), ethi);
-
- /* Drag signals */
- ethi->drag_end_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_end",
- GTK_SIGNAL_FUNC (ethi_drag_end), ethi);
- ethi->drag_data_get_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_data_get",
- GTK_SIGNAL_FUNC (ethi_drag_data_get), ethi);
-
-}
-
-static void
-ethi_unrealize (GnomeCanvasItem *item)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-
- gdk_gc_unref (ethi->gc);
- ethi->gc = NULL;
-
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_motion_id);
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_leave_id);
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_drop_id);
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_data_received_id);
-
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_end_id);
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_data_get_id);
-
- if (ethi->stipple){
- gdk_bitmap_unref (ethi->stipple);
- ethi->stipple = NULL;
- }
-
- if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->unrealize)(item);
-}
-
-static void
-draw_button (ETableHeaderItem *ethi, ETableCol *col,
- GdkDrawable *drawable, GdkGC *gc, GtkStyle *style,
- int x, int y, int width, int height, ETableColArrow arrow)
-{
- GdkRectangle clip;
- int xtra;
-
- gdk_draw_rectangle (
- drawable, gc, TRUE,
- x + 1, y + 1, width - 2, height -2);
-
- gtk_draw_shadow (
- style, drawable,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT,
- x , y, width, height);
-
- clip.x = x + HEADER_PADDING / 2;
- clip.y = y + HEADER_PADDING / 2;
- clip.width = width - HEADER_PADDING;
- clip.height = ethi->height;
-
- gdk_gc_set_clip_rectangle (ethi->gc, &clip);
-
- if (col->is_pixbuf){
- xtra = (clip.width - gdk_pixbuf_get_width (col->pixbuf))/2;
-
- xtra += HEADER_PADDING / 2;
-
- gdk_pixbuf_render_to_drawable_alpha (col->pixbuf,
- drawable,
- 0, 0,
- x + xtra, y + (clip.height - gdk_pixbuf_get_height (col->pixbuf)) / 2,
- gdk_pixbuf_get_width (col->pixbuf), gdk_pixbuf_get_height(col->pixbuf),
- GDK_PIXBUF_ALPHA_FULL, 128,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- } else {
- /* Center the thing */
- xtra = (clip.width - gdk_string_measure (ethi->font, col->text))/2;
-
- /* Skip over border */
- if (xtra < 0)
- xtra = 0;
-
- xtra += HEADER_PADDING / 2;
-
- gdk_draw_text (
- drawable, ethi->font,
- ethi->gc, x + xtra, y + ethi->height - ethi->font->descent - HEADER_PADDING / 2,
- col->text, strlen (col->text));
- }
-
- if (col->pixbuf){
- if ((gdk_pixbuf_get_width (col->pixbuf) + MIN_ARROW_SIZE + 4) > width)
- return;
- }
-
- switch (arrow){
- case E_TABLE_COL_ARROW_NONE:
- break;
-
- case E_TABLE_COL_ARROW_UP:
- case E_TABLE_COL_ARROW_DOWN:
- gtk_paint_arrow (
- gtk_widget_get_style (GTK_WIDGET(GNOME_CANVAS_ITEM(ethi)->canvas)),
- drawable,
- GTK_STATE_NORMAL,
- GTK_SHADOW_IN,
- &clip,
- GTK_WIDGET(GNOME_CANVAS_ITEM(ethi)->canvas),
- "header",
- (arrow == E_TABLE_COL_ARROW_UP) ? GTK_ARROW_UP : GTK_ARROW_DOWN,
- TRUE,
- x + HEADER_PADDING / 2 + clip.width - MIN_ARROW_SIZE - 2,
- y + (ethi->height - MIN_ARROW_SIZE) / 2,
- MIN_ARROW_SIZE,
- MIN_ARROW_SIZE);
- break;
- }
-}
-
-static void
-ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
- GnomeCanvas *canvas = item->canvas;
- GdkGC *gc;
- const int cols = e_table_header_count (ethi->eth);
- int x1, x2;
- int col;
- GHashTable *arrows = g_hash_table_new (NULL, NULL);
-
-
- if (ethi->sort_info) {
- int length = e_table_sort_info_grouping_get_count(ethi->sort_info);
- int i;
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
- g_hash_table_insert (arrows,
- (gpointer) column.column,
- (gpointer) (column.ascending ?
- E_TABLE_COL_ARROW_DOWN :
- E_TABLE_COL_ARROW_UP));
- }
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
- g_hash_table_insert (arrows,
- (gpointer) column.column,
- (gpointer) (column.ascending ?
- E_TABLE_COL_ARROW_DOWN :
- E_TABLE_COL_ARROW_UP));
- }
- }
-
- ethi->width = e_table_header_total_width (ethi->eth) + ethi->group_indent_width;
- x1 = x2 = 0;
- x2 += ethi->group_indent_width;
- for (col = 0; col < cols; col++, x1 = x2){
- ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
- int col_width;
-
- col_width = ecol->width;
-
- x2 += col_width;
-
- if (x1 > (x + width))
- break;
-
- if (x2 < x)
- continue;
-
- gc = GTK_WIDGET (canvas)->style->bg_gc [GTK_STATE_NORMAL];
-
- draw_button (ethi, ecol, drawable, gc,
- GTK_WIDGET (canvas)->style,
- x1 - x, - y, x2 - x1, ethi->height,
- (ETableColArrow) g_hash_table_lookup (arrows, (gpointer) ecol->col_idx));
- }
- g_hash_table_destroy (arrows);
-}
-
-static double
-ethi_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-/*
- * is_pointer_on_division:
- *
- * Returns whether @pos is a column header division; If @the_total is not NULL,
- * then the actual position is returned here. If @return_ecol is not NULL,
- * then the ETableCol that actually contains this point is returned here
- */
-static gboolean
-is_pointer_on_division (ETableHeaderItem *ethi, int pos, int *the_total, int *return_col)
-{
- const int cols = e_table_header_count (ethi->eth);
- int col, total;
-
- total = 0;
- for (col = 0; col < cols; col++){
- ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-
- if (col == 0)
- total += ethi->group_indent_width;
-
- total += ecol->width;
-
- if ((total - TOLERANCE < pos)&& (pos < total + TOLERANCE)){
- if (return_col)
- *return_col = col;
- if (the_total)
- *the_total = total;
-
- return TRUE;
- }
-
- if (total > pos + TOLERANCE)
- return FALSE;
- }
-
- return FALSE;
-}
-
-#define convert(c,sx,sy,x,y) gnome_canvas_w2c (c,sx,sy,x,y)
-
-static void
-set_cursor (ETableHeaderItem *ethi, int pos)
-{
- GtkWidget *canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas);
-
- /* We might be invoked before we are realized */
- if (!canvas->window)
- return;
-
- if (is_pointer_on_division (ethi, pos, NULL, NULL))
- e_cursor_set (canvas->window, E_CURSOR_SIZE_X);
- else
- e_cursor_set (canvas->window, E_CURSOR_ARROW);
-}
-
-static void
-ethi_end_resize (ETableHeaderItem *ethi)
-{
- ethi->resize_col = -1;
- ethi->resize_guide = GINT_TO_POINTER (0);
-
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
-}
-
-static gboolean
-ethi_maybe_start_drag (ETableHeaderItem *ethi, GdkEventMotion *event)
-{
- if (!ethi->maybe_drag)
- return FALSE;
-
- if (ethi->eth->col_count < 2)
- return FALSE;
-
- if (MAX (abs (ethi->click_x - event->x),
- abs (ethi->click_y - event->y)) <= 3)
- return FALSE;
-
- return TRUE;
-}
-
-static void
-ethi_start_drag (ETableHeaderItem *ethi, GdkEvent *event)
-{
- GtkWidget *widget = GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas);
- GtkTargetList *list;
- GdkDragContext *context;
- ETableCol *ecol;
- int col_width;
- GdkPixmap *pixmap;
- GdkGC *gc;
- int group_indent = 0;
- GHashTable *arrows = g_hash_table_new (NULL, NULL);
-
- GtkTargetEntry ethi_drag_types [] = {
- { TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
- };
-
- ethi->drag_col = ethi_find_col_by_x (ethi, event->motion.x);
-
- if (ethi->drag_col == -1)
- return;
-
- if (ethi->sort_info) {
- int length = e_table_sort_info_grouping_get_count(ethi->sort_info);
- int i;
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
- group_indent ++;
- g_hash_table_insert (arrows,
- (gpointer) column.column,
- (gpointer) (column.ascending ?
- E_TABLE_COL_ARROW_DOWN :
- E_TABLE_COL_ARROW_UP));
- }
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
- g_hash_table_insert (arrows,
- (gpointer) column.column,
- (gpointer) (column.ascending ?
- E_TABLE_COL_ARROW_DOWN :
- E_TABLE_COL_ARROW_UP));
- }
- }
-
- ethi_drag_types[0].target = g_strdup_printf("%s-%s", ethi_drag_types[0].target, ethi->dnd_code);
- list = gtk_target_list_new (ethi_drag_types, ELEMENTS (ethi_drag_types));
- context = gtk_drag_begin (widget, list, GDK_ACTION_MOVE, 1, event);
- g_free(ethi_drag_types[0].target);
-
- ecol = e_table_header_get_column (ethi->eth, ethi->drag_col);
- col_width = ecol->width;
- pixmap = gdk_pixmap_new (widget->window, col_width, ethi->height, -1);
- gc = widget->style->bg_gc [GTK_STATE_ACTIVE];
- draw_button (ethi, ecol, pixmap, gc,
- widget->style,
- 0, 0, col_width, ethi->height,
- (ETableColArrow) g_hash_table_lookup (arrows, (gpointer) ecol->col_idx));
- gtk_drag_set_icon_pixmap (context,
- gdk_window_get_colormap (widget->window),
- pixmap,
- NULL,
- col_width / 2,
- ethi->height / 2);
- gdk_pixmap_unref (pixmap);
-
- ethi->maybe_drag = FALSE;
- g_hash_table_destroy (arrows);
-}
-
-typedef struct {
- ETableHeaderItem *ethi;
- int col;
-} EthiHeaderInfo;
-
-static void
-ethi_popup_sort_ascending(GtkWidget *widget, EthiHeaderInfo *info)
-{
- ETableCol *col;
- int model_col;
- int length;
- int i;
- int found = FALSE;
- ETableHeaderItem *ethi = info->ethi;
-
- col = e_table_header_get_column (ethi->eth, info->col);
- model_col = col->col_idx;
-
- length = e_table_sort_info_grouping_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- column.ascending = 1;
- e_table_sort_info_grouping_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- if (!found) {
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- column.ascending = 1;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- }
- if (!found) {
- ETableSortColumn column = { model_col, 1 };
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- if (length == 0)
- length++;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, length - 1, column);
- }
-}
-
-static void
-ethi_popup_sort_descending(GtkWidget *widget, EthiHeaderInfo *info)
-{
- ETableCol *col;
- int model_col;
- int length;
- int i;
- int found = FALSE;
- ETableHeaderItem *ethi = info->ethi;
-
- col = e_table_header_get_column (ethi->eth, info->col);
- model_col = col->col_idx;
-
- length = e_table_sort_info_grouping_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- column.ascending = 0;
- e_table_sort_info_grouping_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- if (!found) {
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- column.ascending = 0;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- }
- if (!found) {
- ETableSortColumn column = { model_col, 0 };
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- if (length == 0)
- length++;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, length - 1, column);
- }
-}
-
-static void
-ethi_popup_unsort(GtkWidget *widget, EthiHeaderInfo *info)
-{
- ETableHeaderItem *ethi = info->ethi;
-
- e_table_sort_info_grouping_truncate(ethi->sort_info, 0);
- e_table_sort_info_sorting_truncate(ethi->sort_info, 0);
-}
-
-static void
-ethi_popup_group_field(GtkWidget *widget, EthiHeaderInfo *info)
-{
- ETableCol *col;
- int model_col;
- ETableHeaderItem *ethi = info->ethi;
- ETableSortColumn column;
-
- col = e_table_header_get_column (ethi->eth, info->col);
- model_col = col->col_idx;
-
- column.column = model_col;
- column.ascending = 1;
- e_table_sort_info_grouping_set_nth(ethi->sort_info, 0, column);
- e_table_sort_info_grouping_truncate(ethi->sort_info, 1);
-}
-
-static void
-ethi_popup_group_box(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-ethi_popup_remove_column(GtkWidget *widget, EthiHeaderInfo *info)
-{
- e_table_header_remove(info->ethi->eth, info->col);
-}
-
-static void
-ethi_popup_field_chooser(GtkWidget *widget, EthiHeaderInfo *info)
-{
- GtkWidget *etfcd = e_table_field_chooser_dialog_new();
- gtk_object_set(GTK_OBJECT(etfcd),
- "full_header", info->ethi->full_header,
- "dnd_code", info->ethi->dnd_code,
- NULL);
- gtk_widget_show(etfcd);
-}
-
-static void
-ethi_popup_alignment(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-ethi_popup_best_fit(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-ethi_popup_format_columns(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-ethi_popup_customize_view(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-/* Bit 1 is always disabled. */
-/* Bit 2 is disabled if not "sortable". */
-static EPopupMenu ethi_context_menu [] = {
- { N_("Sort Ascending"), NULL, GTK_SIGNAL_FUNC(ethi_popup_sort_ascending), 2},
- { N_("Sort Descending"), NULL, GTK_SIGNAL_FUNC(ethi_popup_sort_descending), 2},
- { N_("Unsort"), NULL, GTK_SIGNAL_FUNC(ethi_popup_unsort), 0},
- { "", NULL, GTK_SIGNAL_FUNC(NULL), 0},
- { N_("Group By This Field"), NULL, GTK_SIGNAL_FUNC(ethi_popup_group_field), 0},
- { N_("Group By Box"), NULL, GTK_SIGNAL_FUNC(ethi_popup_group_box), 1},
- { "", NULL, GTK_SIGNAL_FUNC(NULL), 1},
- { N_("Remove This Column"), NULL, GTK_SIGNAL_FUNC(ethi_popup_remove_column), 0},
- { N_("Field Chooser"), NULL, GTK_SIGNAL_FUNC(ethi_popup_field_chooser), 0},
- { "", NULL, GTK_SIGNAL_FUNC(NULL), 1},
- { N_("Alignment"), NULL, GTK_SIGNAL_FUNC(ethi_popup_alignment), 1},
- { N_("Best Fit"), NULL, GTK_SIGNAL_FUNC(ethi_popup_best_fit), 1},
- { N_("Format Columns..."), NULL, GTK_SIGNAL_FUNC(ethi_popup_format_columns), 1},
- { "", NULL, GTK_SIGNAL_FUNC(NULL), 1},
- { N_("Customize Current View..."), NULL, GTK_SIGNAL_FUNC(ethi_popup_customize_view), 1},
- { NULL, NULL, NULL, 0 }
-};
-
-static void
-ethi_header_context_menu (ETableHeaderItem *ethi, GdkEventButton *event)
-{
- EthiHeaderInfo *info = g_new(EthiHeaderInfo, 1);
- ETableCol *col;
- info->ethi = ethi;
- info->col = ethi_find_col_by_x (ethi, event->x);
- col = e_table_header_get_column (ethi->eth, info->col);
- e_popup_menu_run (ethi_context_menu, event, 1 + (col->sortable ? 0 : 2), 0, info);
-}
-
-static void
-ethi_button_pressed (ETableHeaderItem *ethi, GdkEventButton *event)
-{
- gtk_signal_emit (GTK_OBJECT (ethi),
- ethi_signals [BUTTON_PRESSED], event);
-}
-
-/*
- * Handles the events on the ETableHeaderItem, particularly it handles resizing
- */
-static int
-ethi_event (GnomeCanvasItem *item, GdkEvent *e)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
- GnomeCanvas *canvas = item->canvas;
- const gboolean resizing = ETHI_RESIZING (ethi);
- int x, y, start, col;
- int was_maybe_drag = 0;
-
- switch (e->type){
- case GDK_ENTER_NOTIFY:
- convert (canvas, e->crossing.x, e->crossing.y, &x, &y);
- set_cursor (ethi, x);
- break;
-
- case GDK_LEAVE_NOTIFY:
- e_cursor_set (GTK_WIDGET (canvas)->window, E_CURSOR_ARROW);
- break;
-
- case GDK_MOTION_NOTIFY:
-
- convert (canvas, e->motion.x, e->motion.y, &x, &y);
- if (resizing){
- int new_width;
-
- if (ethi->resize_guide == NULL){
- /* Quick hack until I actually bind the views */
- ethi->resize_guide = GINT_TO_POINTER (1);
-
- gnome_canvas_item_grab (item,
- GDK_POINTER_MOTION_MASK |
- GDK_BUTTON_RELEASE_MASK,
- e_cursor_get (E_CURSOR_SIZE_X),
- e->button.time);
- }
-
- new_width = x - ethi->resize_start_pos;
-
- e_table_header_set_size (ethi->eth, ethi->resize_col, new_width);
-
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
- } else if (ethi_maybe_start_drag (ethi, &e->motion)){
- ethi_start_drag (ethi, e);
- } else
- set_cursor (ethi, x);
- break;
-
- case GDK_BUTTON_PRESS:
- if (e->button.button > 3)
- return FALSE;
-
- convert (canvas, e->button.x, e->button.y, &x, &y);
-
- if (is_pointer_on_division (ethi, x, &start, &col) && e->button.button == 1){
- ETableCol *ecol;
-
- /*
- * Record the important bits.
- *
- * By setting resize_pos to a non -1 value,
- * we know that we are being resized (used in the
- * other event handlers).
- */
- ecol = e_table_header_get_column (ethi->eth, col);
-
- if (!ecol->resizeable)
- break;
- ethi->resize_col = col;
- ethi->resize_start_pos = start - ecol->width;
- ethi->resize_min_width = ecol->min_width;
- } else {
- if (e->button.button == 1){
- ethi->click_x = e->button.x;
- ethi->click_y = e->button.y;
- ethi->maybe_drag = TRUE;
- } else if (e->button.button == 3){
- ethi_header_context_menu (ethi, &e->button);
- } else
- ethi_button_pressed (ethi, &e->button);
- }
- break;
-
- case GDK_2BUTTON_PRESS:
- if (!resizing)
- break;
-
- if (e->button.button != 1)
- break;
- break;
-
- case GDK_BUTTON_RELEASE: {
- gboolean needs_ungrab = FALSE;
-
- was_maybe_drag = ethi->maybe_drag;
-
- ethi->maybe_drag = FALSE;
-
- if (ethi->resize_col != -1){
- needs_ungrab = (ethi->resize_guide != NULL);
- ethi_end_resize (ethi);
- } else if (was_maybe_drag && ethi->sort_info) {
- ETableCol *col;
- int model_col;
- int length;
- int i;
- int found = FALSE;
-
- col = e_table_header_get_column (ethi->eth, ethi_find_col_by_x (ethi, e->button.x));
- model_col = col->col_idx;
-
- length = e_table_sort_info_grouping_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- int ascending = column.ascending;
- ascending = ! ascending;
- column.ascending = ascending;
- e_table_sort_info_grouping_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- if(col->sortable) {
- if (!found) {
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- int ascending = column.ascending;
- ascending = ! ascending;
- column.ascending = ascending;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- }
- if (!found) {
- ETableSortColumn column = { model_col, 1 };
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- if (length == 0)
- length++;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, length - 1, column);
- }
- }
- }
-
- if (needs_ungrab)
- gnome_canvas_item_ungrab (item, e->button.time);
-
- break;
- }
-
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-static void
-ethi_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
-
- ethi_parent_class = gtk_type_class (PARENT_OBJECT_TYPE);
-
- object_class->destroy = ethi_destroy;
- object_class->set_arg = ethi_set_arg;
- object_class->get_arg = ethi_get_arg;
-
- item_class->update = ethi_update;
- item_class->realize = ethi_realize;
- item_class->unrealize = ethi_unrealize;
- item_class->draw = ethi_draw;
- item_class->point = ethi_point;
- item_class->event = ethi_event;
-
- gtk_object_add_arg_type ("ETableHeaderItem::ETableHeader", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_HEADER);
- gtk_object_add_arg_type ("ETableHeaderItem::full_header", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_FULL_HEADER);
- gtk_object_add_arg_type ("ETableHeaderItem::dnd_code", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_DND_CODE);
- gtk_object_add_arg_type ("ETableHeaderItem::fontset", GTK_TYPE_STRING,
- GTK_ARG_WRITABLE, ARG_TABLE_FONTSET);
- gtk_object_add_arg_type ("ETableHeaderItem::sort_info", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_SORT_INFO);
-
- /*
- * Create our pixmaps for DnD
- */
- dnd_colormap = gtk_widget_get_default_colormap ();
- remove_col_pixmap = gdk_pixmap_colormap_create_from_xpm_d (
- NULL, dnd_colormap,
- &remove_col_mask, NULL, remove_col_xpm);
-
- add_col_pixmap = gdk_pixmap_colormap_create_from_xpm_d (
- NULL, dnd_colormap,
- &add_col_mask, NULL, add_col_xpm);
-
- ethi_signals [BUTTON_PRESSED] =
- gtk_signal_new ("button_pressed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableHeaderItemClass, button_pressed),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1, GTK_TYPE_POINTER);
-
-}
-
-static void
-ethi_init (GnomeCanvasItem *item)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-
- ethi->resize_col = -1;
-
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = 0;
- item->y2 = 0;
-
- ethi->drag_col = -1;
- ethi->drag_mark = -1;
-
- ethi->sort_info = NULL;
-
- ethi->sort_info_changed_id = 0;
- ethi->group_info_changed_id = 0;
-
- ethi->group_indent_width = 0;
-}
-
-GtkType
-e_table_header_item_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableHeaderItem",
- sizeof (ETableHeaderItem),
- sizeof (ETableHeaderItemClass),
- (GtkClassInitFunc) ethi_class_init,
- (GtkObjectInitFunc) ethi_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_OBJECT_TYPE, &info);
- }
-
- return type;
-}
diff --git a/widgets/e-table/e-table-header-item.h b/widgets/e-table/e-table-header-item.h
deleted file mode 100644
index 15b627bfa9..0000000000
--- a/widgets/e-table/e-table-header-item.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_HEADER_ITEM_H_
-#define _E_TABLE_HEADER_ITEM_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gnome-xml/tree.h>
-#include "e-table-header.h"
-#include "e-table-sort-info.h"
-
-#define E_TABLE_HEADER_ITEM_TYPE (e_table_header_item_get_type ())
-#define E_TABLE_HEADER_ITEM(o) (GTK_CHECK_CAST ((o), E_TABLE_HEADER_ITEM_TYPE, ETableHeaderItem))
-#define E_TABLE_HEADER_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_HEADER_ITEM_TYPE, ETableHeaderItemClass))
-#define E_IS_TABLE_HEADER_ITEM(o) (GTK_CHECK_TYPE ((o), E_TABLE_HEADER_ITEM_TYPE))
-#define E_IS_TABLE_HEADER_ITEM_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_HEADER_ITEM_TYPE))
-
-typedef struct {
- GnomeCanvasItem parent;
- ETableHeader *eth;
-
- GdkGC *gc;
- GdkCursor *change_cursor;
-
- short height, width;
- GdkFont *font;
-
- /*
- * Used during resizing; Could be shorts
- */
- int resize_col;
- int resize_start_pos;
- int resize_min_width;
-
- GtkObject *resize_guide;
-
- int group_indent_width;
-
- /*
- * Ids
- */
- int structure_change_id, dimension_change_id;
-
- /*
- * For dragging columns
- */
- guint maybe_drag:1;
- guint dnd_ready:1;
- int click_x, click_y;
- int drag_col, drop_col, drag_mark;
- guint drag_motion_id, drag_end_id, drag_leave_id, drag_drop_id, drag_data_received_id, drag_data_get_id;
- guint sort_info_changed_id, group_info_changed_id;
- GnomeCanvasItem *remove_item;
- GdkBitmap *stipple;
-
- gchar *dnd_code;
-
- /*
- * For column sorting info
- */
- ETableSortInfo *sort_info;
-
- /* For adding fields. */
- ETableHeader *full_header;
-} ETableHeaderItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
- /*
- * signals
- */
- void (*button_pressed) (ETableHeaderItem *ethi, GdkEventButton *button);
-} ETableHeaderItemClass;
-
-GtkType e_table_header_item_get_type (void);
-
-#endif /* _E_TABLE_HEADER_ITEM_H_ */
diff --git a/widgets/e-table/e-table-header.c b/widgets/e-table/e-table-header.c
deleted file mode 100644
index fddda13da8..0000000000
--- a/widgets/e-table/e-table-header.c
+++ /dev/null
@@ -1,665 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-col-head.c: TableColHead implementation
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc
- */
-#include <config.h>
-#include <string.h>
-#include <gtk/gtkobject.h>
-#include <gtk/gtksignal.h>
-#include "e-table-header.h"
-#include "e-table-defines.h"
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_SORT_INFO,
- ARG_WIDTH,
-};
-
-enum {
- STRUCTURE_CHANGE,
- DIMENSION_CHANGE,
- LAST_SIGNAL
-};
-
-static void eth_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void eth_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void eth_do_remove (ETableHeader *eth, int idx, gboolean do_unref);
-static void eth_set_width(ETableHeader *eth, int width);
-static void eth_set_size (ETableHeader *eth, int idx, int size);
-static void eth_calc_widths (ETableHeader *eth);
-static void dequeue(ETableHeader *eth, int *column, int *width);
-
-static guint eth_signals [LAST_SIGNAL] = { 0, };
-
-static GtkObjectClass *e_table_header_parent_class;
-
-struct two_ints {
- int column;
- int width;
-};
-
-static gboolean
-dequeue_idle(ETableHeader *eth)
-{
- int column, width;
- dequeue(eth, &column, &width);
- while(eth->change_queue && ((struct two_ints *)eth->change_queue->data)->column == column)
- dequeue(eth, &column, &width);
- if (column == -1)
- eth_set_width(eth, width);
- else if (column < eth->col_count)
- eth_set_size(eth, column, width);
- if (eth->change_queue)
- return TRUE;
- else {
- eth_calc_widths(eth);
- eth->idle = 0;
- return FALSE;
- }
-}
-
-static void
-enqueue(ETableHeader *eth, int column, int width)
-{
- struct two_ints *store;
- store = g_new(struct two_ints, 1);
- store->column = column;
- store->width = width;
-
- eth->change_tail = g_slist_last(g_slist_append(eth->change_tail, store));
- if (!eth->change_queue)
- eth->change_queue = eth->change_tail;
-
- if (!eth->idle) {
- eth->idle = g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc) dequeue_idle, eth, NULL);
- }
-}
-
-static void
-dequeue(ETableHeader *eth, int *column, int *width)
-{
- GSList *head;
- struct two_ints *store;
- head = eth->change_queue;
- eth->change_queue = eth->change_queue->next;
- if (!eth->change_queue)
- eth->change_tail = NULL;
- store = head->data;
- g_slist_free_1(head);
- if (column)
- *column = store->column;
- if (width)
- *width = store->width;
- g_free(store);
-}
-
-static void
-eth_destroy (GtkObject *object)
-{
- ETableHeader *eth = E_TABLE_HEADER (object);
- const int cols = eth->col_count;
- int i;
-
- if (eth->sort_info) {
- if (eth->sort_info_group_change_id)
- gtk_signal_disconnect(GTK_OBJECT(eth->sort_info),
- eth->sort_info_group_change_id);
- gtk_object_unref(GTK_OBJECT(eth->sort_info));
- }
-
- if (eth->idle)
- g_source_remove(eth->idle);
- g_slist_foreach(eth->change_queue, (GFunc) g_free, NULL);
- g_slist_free(eth->change_queue);
-
- /*
- * Destroy columns
- */
- for (i = cols - 1; i >= 0; i--){
- eth_do_remove (eth, i, TRUE);
- }
-
- if (e_table_header_parent_class->destroy)
- e_table_header_parent_class->destroy (object);
-}
-
-static void
-e_table_header_class_init (GtkObjectClass *object_class)
-{
- object_class->destroy = eth_destroy;
- object_class->set_arg = eth_set_arg;
- object_class->get_arg = eth_get_arg;
-
-
- e_table_header_parent_class = (gtk_type_class (gtk_object_get_type ()));
-
- gtk_object_add_arg_type ("ETableHeader::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableHeader::sort_info", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_SORT_INFO);
-
- eth_signals [STRUCTURE_CHANGE] =
- gtk_signal_new ("structure_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableHeaderClass, structure_change),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
- eth_signals [DIMENSION_CHANGE] =
- gtk_signal_new ("dimension_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableHeaderClass, dimension_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, eth_signals, LAST_SIGNAL);
-}
-
-static void
-e_table_header_init (ETableHeader *eth)
-{
- eth->col_count = 0;
- eth->width = 0;
-
- eth->sort_info = NULL;
- eth->sort_info_group_change_id = 0;
-
- eth->columns = NULL;
- eth->selectable = FALSE;
-
- eth->change_queue = NULL;
- eth->change_tail = NULL;
-}
-
-GtkType
-e_table_header_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableHeader",
- sizeof (ETableHeader),
- sizeof (ETableHeaderClass),
- (GtkClassInitFunc) e_table_header_class_init,
- (GtkObjectInitFunc) e_table_header_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
-
-ETableHeader *
-e_table_header_new (void)
-{
- ETableHeader *eth;
-
- eth = gtk_type_new (e_table_header_get_type ());
-
- return eth;
-}
-
-static void
-eth_group_info_changed(ETableSortInfo *info, ETableHeader *eth)
-{
- enqueue(eth, -1, eth->nominal_width);
-}
-
-static void
-eth_set_width(ETableHeader *eth, int width)
-{
- eth->width = width;
-}
-
-static void
-eth_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableHeader *eth = E_TABLE_HEADER (object);
-
- switch (arg_id) {
- case ARG_WIDTH:
- eth->nominal_width = GTK_VALUE_DOUBLE (*arg);
- enqueue(eth, -1, GTK_VALUE_DOUBLE (*arg));
- break;
- case ARG_SORT_INFO:
- if (eth->sort_info) {
- if (eth->sort_info_group_change_id)
- gtk_signal_disconnect(GTK_OBJECT(eth->sort_info), eth->sort_info_group_change_id);
- gtk_object_unref(GTK_OBJECT(eth->sort_info));
- }
- eth->sort_info = E_TABLE_SORT_INFO(GTK_VALUE_OBJECT (*arg));
- if (eth->sort_info) {
- gtk_object_ref(GTK_OBJECT(eth->sort_info));
- eth->sort_info_group_change_id
- = gtk_signal_connect(GTK_OBJECT(eth->sort_info), "group_info_changed",
- GTK_SIGNAL_FUNC(eth_group_info_changed), eth);
- }
- enqueue(eth, -1, eth->nominal_width);
- break;
- default:
- break;
- }
-}
-
-static void
-eth_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableHeader *eth = E_TABLE_HEADER (object);
-
- switch (arg_id) {
- case ARG_SORT_INFO:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(eth->sort_info);
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = eth->nominal_width;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-eth_update_offsets (ETableHeader *eth)
-{
- int i;
- int x = 0;
-
- for (i = 0; i < eth->col_count; i++){
- ETableCol *etc = eth->columns [i];
-
- etc->x = x;
- x += etc->width;
- }
-}
-
-static void
-eth_do_insert (ETableHeader *eth, int pos, ETableCol *val)
-{
- memmove (&eth->columns [pos+1], &eth->columns [pos],
- sizeof (ETableCol *) * (eth->col_count - pos));
- eth->columns [pos] = val;
- eth->col_count ++;
-}
-
-void
-e_table_header_add_column (ETableHeader *eth, ETableCol *tc, int pos)
-{
- g_return_if_fail (eth != NULL);
- g_return_if_fail (E_IS_TABLE_HEADER (eth));
- g_return_if_fail (tc != NULL);
- g_return_if_fail (E_IS_TABLE_COL (tc));
- g_return_if_fail (pos >= -1 && pos <= eth->col_count);
-
- if (pos == -1)
- pos = eth->col_count;
- eth->columns = g_realloc (eth->columns, sizeof (ETableCol *) * (eth->col_count + 1));
-
- /*
- * We are the primary owners of the column
- */
- gtk_object_ref (GTK_OBJECT (tc));
- gtk_object_sink (GTK_OBJECT (tc));
-
- eth_do_insert (eth, pos, tc);
-
- enqueue(eth, -1, eth->nominal_width);
- gtk_signal_emit (GTK_OBJECT (eth), eth_signals [STRUCTURE_CHANGE]);
-}
-
-ETableCol *
-e_table_header_get_column (ETableHeader *eth, int column)
-{
- g_return_val_if_fail (eth != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), NULL);
-
- if (column < 0)
- return NULL;
-
- if (column >= eth->col_count)
- return NULL;
-
- return eth->columns [column];
-}
-
-int
-e_table_header_count (ETableHeader *eth)
-{
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- return eth->col_count;
-}
-
-int
-e_table_header_index (ETableHeader *eth, int col)
-{
- g_return_val_if_fail (eth != NULL, -1);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), -1);
- g_return_val_if_fail (col < eth->col_count, -1);
-
- return eth->columns [col]->col_idx;
-}
-
-int
-e_table_header_get_index_at (ETableHeader *eth, int x_offset)
-{
- int i, total;
-
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- total = 0;
- for (i = 0; i < eth->col_count; i++){
- total += eth->columns [i]->width;
-
- if (x_offset < total)
- return i;
- }
-
- return -1;
-}
-
-ETableCol **
-e_table_header_get_columns (ETableHeader *eth)
-{
- ETableCol **ret;
-
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- ret = g_new (ETableCol *, eth->col_count + 1);
- memcpy (ret, eth->columns, sizeof (ETableCol *) * eth->col_count);
- ret [eth->col_count] = NULL;
-
- return ret;
-}
-
-gboolean
-e_table_header_selection_ok (ETableHeader *eth)
-{
- g_return_val_if_fail (eth != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), FALSE);
-
- return eth->selectable;
-}
-
-int
-e_table_header_get_selected (ETableHeader *eth)
-{
- int i;
- int selected = 0;
-
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- for (i = 0; i < eth->col_count; i++){
- if (eth->columns [i]->selected)
- selected++;
- }
-
- return selected;
-}
-
-int
-e_table_header_total_width (ETableHeader *eth)
-{
- int total, i;
-
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- total = 0;
- for (i = 0; i < eth->col_count; i++)
- total += eth->columns [i]->width;
-
- return total;
-}
-
-static void
-eth_do_remove (ETableHeader *eth, int idx, gboolean do_unref)
-{
- if (do_unref)
- gtk_object_unref (GTK_OBJECT (eth->columns [idx]));
-
- memmove (&eth->columns [idx], &eth->columns [idx+1],
- sizeof (ETableCol *) * (eth->col_count - idx - 1));
- eth->col_count--;
-}
-
-void
-e_table_header_move (ETableHeader *eth, int source_index, int target_index)
-{
- ETableCol *old;
-
- g_return_if_fail (eth != NULL);
- g_return_if_fail (E_IS_TABLE_HEADER (eth));
- g_return_if_fail (source_index >= 0);
- g_return_if_fail (target_index >= 0);
- g_return_if_fail (source_index < eth->col_count);
- g_return_if_fail (target_index < eth->col_count + 1); /* Can be moved beyond the last item. */
-
- if (source_index < target_index)
- target_index --;
-
- old = eth->columns [source_index];
- eth_do_remove (eth, source_index, FALSE);
- eth_do_insert (eth, target_index, old);
- eth_update_offsets (eth);
-
- gtk_signal_emit (GTK_OBJECT (eth), eth_signals [DIMENSION_CHANGE]);
- gtk_signal_emit (GTK_OBJECT (eth), eth_signals [STRUCTURE_CHANGE]);
-}
-
-void
-e_table_header_remove (ETableHeader *eth, int idx)
-{
- g_return_if_fail (eth != NULL);
- g_return_if_fail (E_IS_TABLE_HEADER (eth));
- g_return_if_fail (idx >= 0);
- g_return_if_fail (idx < eth->col_count);
-
- eth_do_remove (eth, idx, TRUE);
- enqueue(eth, -1, eth->nominal_width);
- gtk_signal_emit (GTK_OBJECT (eth), eth_signals [STRUCTURE_CHANGE]);
-}
-
-void
-e_table_header_set_selection (ETableHeader *eth, gboolean allow_selection)
-{
-}
-
-void
-e_table_header_set_size(ETableHeader *eth, int idx, int size)
-{
- enqueue(eth, idx, size);
-}
-
-static void
-eth_set_size (ETableHeader *eth, int idx, int size)
-{
- double expansion;
- double old_expansion;
- int min_width;
- int left_width;
- int total_extra;
- int expandable_count;
- int usable_width;
- int i;
- g_return_if_fail (eth != NULL);
- g_return_if_fail (E_IS_TABLE_HEADER (eth));
- g_return_if_fail (idx >= 0);
- g_return_if_fail (idx < eth->col_count);
-
- /* If this column is not resizable, don't do anything. */
- if (!eth->columns[idx]->resizeable)
- return;
-
- expansion = 0;
- min_width = 0;
- left_width = 0;
- expandable_count = -1;
-
- /* Calculate usable area. */
- for (i = 0; i < idx; i++) {
- left_width += eth->columns[i]->width;
- }
- /* - 1 to account for the last pixel border. */
- usable_width = eth->width - left_width - 1;
-
- if (eth->sort_info)
- usable_width -= e_table_sort_info_grouping_get_count(eth->sort_info) * GROUP_INDENT;
-
- /* Calculate minimum_width of stuff on the right as well as
- * total usable expansion on the right.
- */
- for (; i < eth->col_count; i++) {
- min_width += eth->columns[i]->min_width;
- if (eth->columns[i]->resizeable) {
- expansion += eth->columns[i]->expansion;
- expandable_count ++;
- }
- }
- /* If there's no room for anything, don't change. */
- if (expansion == 0)
- return;
-
- /* (1) If none of the columns to the right are expandable, use
- * all the expansion space in this column.
- */
- if(expandable_count == 0) {
- eth->columns[idx]->expansion = expansion;
- for (i = idx + 1; i < eth->col_count; i++) {
- eth->columns[i]->expansion = 0;
- }
- return;
- }
-
- total_extra = usable_width - min_width;
- /* If there's no extra space, set all expansions to 0. */
- if (total_extra <= 0) {
- for (i = idx; i < eth->col_count; i++) {
- eth->columns[i]->expansion = 0;
- }
- return;
- }
-
- /* If you try to resize smaller than the minimum width, it
- * uses the minimum. */
- if (size < eth->columns[idx]->min_width)
- size = eth->columns[idx]->min_width;
-
- /* If all the extra space will be used up in this column, use
- * all the expansion and set all others to 0.
- */
- if (size >= total_extra + eth->columns[idx]->min_width) {
- eth->columns[idx]->expansion = expansion;
- for (i = idx + 1; i < eth->col_count; i++) {
- eth->columns[i]->expansion = 0;
- }
- return;
- }
-
- /* The old_expansion used by columns to the right. */
- old_expansion = expansion;
- old_expansion -= eth->columns[idx]->expansion;
- /* Set the new expansion so that it will generate the desired size. */
- eth->columns[idx]->expansion = expansion * (((double)(size - eth->columns[idx]->min_width))/((double)total_extra));
- /* The expansion left for the columns on the right. */
- expansion -= eth->columns[idx]->expansion;
-
- /* (2) If the old columns to the right didn't have any
- * expansion before, expand them evenly. old_expansion > 0 by
- * expansion = SUM(i=idx to col_count -1,
- * columns[i]->min_width) - columns[idx]->min_width) =
- * SUM(non-negatives).
- */
- if (old_expansion == 0) {
- for (i = idx + 1; i < eth->col_count; i++) {
- if (eth->columns[idx]->resizeable) {
- /* expandable_count != 0 by (1) */
- eth->columns[i]->expansion = expansion / expandable_count;
- }
- }
- return;
- }
-
- /* Remove from total_extra the amount used for this column. */
- total_extra -= size - eth->columns[idx]->min_width;
- for (i = idx + 1; i < eth->col_count; i++) {
- if (eth->columns[idx]->resizeable) {
- /* old_expansion != 0 by (2) */
- eth->columns[i]->expansion *= expansion / old_expansion;
- }
- }
-}
-
-int
-e_table_header_col_diff (ETableHeader *eth, int start_col, int end_col)
-{
- int total, col;
-
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- {
- if (start_col < 0)
- start_col = 0;
- if (end_col > eth->col_count)
- end_col = eth->col_count;
-
- total = 0;
- for (col = start_col; col < end_col; col++){
-
- total += eth->columns [col]->width;
- }
- }
-
- return total;
-}
-
-static void
-eth_calc_widths (ETableHeader *eth)
-{
- int i;
- int extra;
- double expansion;
- int last_position = 0;
- double next_position = 0;
- int last_resizable = -1;
- /* - 1 to account for the last pixel border. */
- extra = eth->width - 1;
- expansion = 0;
- for (i = 0; i < eth->col_count; i++) {
- extra -= eth->columns[i]->min_width;
- if (eth->columns[i]->resizeable && eth->columns[i]->expansion > 0)
- last_resizable = i;
- expansion += eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0;
- eth->columns[i]->width = eth->columns[i]->min_width;
- }
- if (eth->sort_info)
- extra -= e_table_sort_info_grouping_get_count(eth->sort_info) * GROUP_INDENT;
- if (expansion == 0 || extra <= 0)
- return;
- for (i = 0; i < last_resizable; i++) {
- next_position += extra * (eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0)/expansion;
- eth->columns[i]->width += next_position - last_position;
- last_position = next_position;
- }
- eth->columns[i]->width += extra - last_position;
-
- eth_update_offsets (eth);
- gtk_signal_emit (GTK_OBJECT (eth), eth_signals [DIMENSION_CHANGE]);
-}
diff --git a/widgets/e-table/e-table-header.h b/widgets/e-table/e-table-header.h
deleted file mode 100644
index 0dcce14b1e..0000000000
--- a/widgets/e-table/e-table-header.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_COLUMN_H_
-#define _E_TABLE_COLUMN_H_
-
-#include <gtk/gtkobject.h>
-#include <gdk/gdk.h>
-#include "e-table-sort-info.h"
-#include "e-table-col.h"
-
-typedef struct _ETableHeader ETableHeader;
-
-#define E_TABLE_HEADER_TYPE (e_table_header_get_type ())
-#define E_TABLE_HEADER(o) (GTK_CHECK_CAST ((o), E_TABLE_HEADER_TYPE, ETableHeader))
-#define E_TABLE_HEADER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_HEADER_TYPE, ETableHeaderClass))
-#define E_IS_TABLE_HEADER(o) (GTK_CHECK_TYPE ((o), E_TABLE_HEADER_TYPE))
-#define E_IS_TABLE_HEADER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_HEADER_TYPE))
-
-/*
- * A Columnar header.
- */
-struct _ETableHeader {
- GtkObject base;
-
- int col_count;
- int width;
- int nominal_width;
-
- ETableSortInfo *sort_info;
- int sort_info_group_change_id;
-
- ETableCol **columns;
- gboolean selectable;
-
- GSList *change_queue, *change_tail;
- gint idle;
-};
-
-typedef struct {
- GtkObjectClass parent_class;
-
- void (*structure_change) (ETableHeader *eth);
- void (*dimension_change) (ETableHeader *eth, int col);
-} ETableHeaderClass;
-
-GtkType e_table_header_get_type (void);
-ETableHeader *e_table_header_new (void);
-
-void e_table_header_add_column (ETableHeader *eth,
- ETableCol *tc, int pos);
-ETableCol * e_table_header_get_column (ETableHeader *eth,
- int column);
-int e_table_header_count (ETableHeader *eth);
-int e_table_header_index (ETableHeader *eth,
- int col);
-int e_table_header_get_index_at (ETableHeader *eth,
- int x_offset);
-ETableCol **e_table_header_get_columns (ETableHeader *eth);
-
-gboolean e_table_header_selection_ok (ETableHeader *eth);
-int e_table_header_get_selected (ETableHeader *eth);
-int e_table_header_total_width (ETableHeader *eth);
-void e_table_header_move (ETableHeader *eth,
- int source_index,
- int target_index);
-void e_table_header_remove (ETableHeader *eth, int idx);
-void e_table_header_set_size (ETableHeader *eth, int idx, int size);
-void e_table_header_set_selection (ETableHeader *eth,
- gboolean allow_selection);
-
-int e_table_header_col_diff (ETableHeader *eth,
- int start_col, int end_col);
-
-void e_table_header_calc_widths (ETableHeader *eth);
-
-GList *e_table_header_get_selected_indexes (ETableHeader *eth);
-
-
-#endif /* _E_TABLE_HEADER_H_ */
-
diff --git a/widgets/e-table/e-table-item.c b/widgets/e-table/e-table-item.c
deleted file mode 100644
index 0f70861f1e..0000000000
--- a/widgets/e-table/e-table-item.c
+++ /dev/null
@@ -1,2228 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-item.c: A GnomeCanvasItem that is a view of an ETableModel.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * TODO:
- * Add a border to the thing, so that focusing works properly.
- *
- */
-#include <config.h>
-#include <stdio.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <math.h>
-#include "e-table-item.h"
-#include "e-table-subset.h"
-#include "e-cell.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-canvas-utils.h"
-#include "e-util/e-util.h"
-
-#define PARENT_OBJECT_TYPE gnome_canvas_item_get_type ()
-
-#define FOCUSED_BORDER 2
-
-static GnomeCanvasItemClass *eti_parent_class;
-
-enum {
- CURSOR_CHANGE,
- DOUBLE_CLICK,
- RIGHT_CLICK,
- KEY_PRESS,
- LAST_SIGNAL
-};
-
-static gint eti_signals [LAST_SIGNAL] = { 0, };
-
-enum {
- ARG_0,
- ARG_TABLE_HEADER,
- ARG_TABLE_MODEL,
- ARG_TABLE_SELECTION_MODEL,
- ARG_TABLE_DRAW_GRID,
- ARG_TABLE_DRAW_FOCUS,
- ARG_CURSOR_MODE,
- ARG_LENGTH_THRESHOLD,
- ARG_CURSOR_ROW,
-
- ARG_MINIMUM_WIDTH,
- ARG_WIDTH,
- ARG_HEIGHT,
-};
-
-static int eti_get_height (ETableItem *eti);
-static int eti_get_minimum_width (ETableItem *eti);
-static int eti_row_height (ETableItem *eti, int row);
-static void e_table_item_focus (ETableItem *eti, int col, int row, GdkModifierType state);
-static void eti_cursor_change (ETableSelectionModel *selection, int row, int col, ETableItem *eti);
-static void eti_selection_change (ETableSelectionModel *selection, ETableItem *eti);
-#if 0
-static void eti_request_region_show (ETableItem *eti,
- int start_col, int start_row,
- int end_col, int end_row);
-#endif
-#define ETI_ROW_HEIGHT(eti,row) ((eti)->height_cache && (eti)->height_cache[(row)] != -1 ? (eti)->height_cache[(row)] : eti_row_height((eti),(row)))
-
-inline static gint
-model_to_view_row(ETableItem *eti, int row)
-{
- int i;
- if (eti->uses_source_model) {
- ETableSubset *etss = E_TABLE_SUBSET(eti->table_model);
- if (eti->row_guess >= 0 && eti->row_guess < etss->n_map) {
- if (etss->map_table[eti->row_guess] == row) {
- return eti->row_guess;
- }
- }
- for (i = 0; i < etss->n_map; i++) {
- if (etss->map_table[i] == row)
- return i;
- }
- return -1;
- } else
- return row;
-}
-
-inline static gint
-view_to_model_row(ETableItem *eti, int row)
-{
- if (eti->uses_source_model) {
- ETableSubset *etss = E_TABLE_SUBSET(eti->table_model);
- if (row >= 0 && row < etss->n_map)
- return etss->map_table[row];
- else
- return -1;
- } else
- return row;
-}
-
-inline static gint
-model_to_view_col(ETableItem *eti, int col)
-{
- int i;
- for (i = 0; i < eti->cols; i++) {
- ETableCol *ecol = e_table_header_get_column (eti->header, i);
- if (ecol->col_idx == col)
- return i;
- }
- return -1;
-}
-
-inline static gint
-view_to_model_col(ETableItem *eti, int col)
-{
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
- return ecol->col_idx;
-}
-
-static gboolean
-eti_editing (ETableItem *eti)
-{
- if (eti->editing_col == -1)
- return FALSE;
- else
- return TRUE;
-}
-
-/*
- * During realization, we have to invoke the per-ecell realize routine
- * (On our current setup, we have one e-cell per column.
- *
- * We might want to optimize this to only realize the unique e-cells:
- * ie, a strings-only table, uses the same e-cell for every column, and
- * we might want to avoid realizing each e-cell.
- */
-static void
-eti_realize_cell_views (ETableItem *eti)
-{
- int i;
-
- for (i = 0; i < eti->n_cells; i++)
- e_cell_realize (eti->cell_views [i]);
- eti->cell_views_realized = 1;
-}
-
-static void
-eti_attach_cell_views (ETableItem *eti)
-{
- int i;
-
- g_assert (eti->header);
- g_assert (eti->table_model);
-
- /*
- * Now realize the various ECells
- */
- eti->n_cells = eti->cols;
- eti->cell_views = g_new (ECellView *, eti->n_cells);
-
- for (i = 0; i < eti->n_cells; i++){
- ETableCol *ecol = e_table_header_get_column (eti->header, i);
-
- eti->cell_views [i] = e_cell_new_view (ecol->ecell, eti->table_model, eti);
- }
-
- eti->needs_compute_height = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-}
-
-/*
- * During unrealization: we invoke every e-cell (one per column in the current
- * setup) to dispose all X resources allocated
- */
-static void
-eti_unrealize_cell_views (ETableItem *eti)
-{
- int i;
-
- if (eti->cell_views_realized == 0)
- return;
-
- for (i = 0; i < eti->n_cells; i++)
- e_cell_unrealize (eti->cell_views [i]);
- eti->cell_views_realized = 0;
-}
-
-static void
-eti_detach_cell_views (ETableItem *eti)
-{
- int i;
-
- for (i = 0; i < eti->n_cells; i++){
- e_cell_kill_view (eti->cell_views [i]);
- eti->cell_views [i] = NULL;
- }
-
- g_free (eti->cell_views);
- eti->cell_views = NULL;
- eti->n_cells = 0;
-}
-
-static void
-eti_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- double i2c [6];
- ArtPoint c1, c2, i1, i2;
- ETableItem *eti = E_TABLE_ITEM (item);
-
- /* Wrong BBox's are the source of redraw nightmares */
-
- gnome_canvas_item_i2c_affine (GNOME_CANVAS_ITEM (eti), i2c);
-
- i1.x = eti->x1;
- i1.y = eti->y1;
- i2.x = eti->x1 + eti->width;
- i2.y = eti->y1 + eti->height;
- art_affine_point (&c1, &i1, i2c);
- art_affine_point (&c2, &i2, i2c);
-
- *x1 = c1.x;
- *y1 = c1.y;
- *x2 = c2.x + 1;
- *y2 = c2.y + 1;
-}
-
-static void
-eti_reflow (GnomeCanvasItem *item, gint flags)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
-
- if (eti->needs_compute_height) {
- int new_height = eti_get_height (eti);
-
- if (new_height != eti->height) {
- eti->height = new_height;
- e_canvas_item_request_parent_reflow (GNOME_CANVAS_ITEM (eti));
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
- }
- eti->needs_compute_height = 0;
- }
- if (eti->needs_compute_width) {
- int new_width = eti_get_minimum_width (eti);
- new_width = MAX(new_width, eti->minimum_width);
- if (new_width != eti->width) {
- eti->width = new_width;
- e_canvas_item_request_parent_reflow (GNOME_CANVAS_ITEM (eti));
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
- }
- eti->needs_compute_width = 0;
- }
-}
-
-/*
- * GnomeCanvasItem::update method
- */
-static void
-eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- ArtPoint o1, o2;
- ETableItem *eti = E_TABLE_ITEM (item);
-
- if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)
- (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)(item, affine, clip_path, flags);
-
- o1.x = item->x1;
- o1.y = item->y1;
- o2.x = item->x2;
- o2.y = item->y2;
-
- eti_bounds (item, &item->x1, &item->y1, &item->x2, &item->y2);
- if (item->x1 != o1.x ||
- item->y1 != o1.y ||
- item->x2 != o2.x ||
- item->y2 != o2.y) {
- gnome_canvas_request_redraw (item->canvas, o1.x, o1.y, o2.x, o2.y);
- eti->needs_redraw = 1;
- }
-
- if (eti->needs_redraw) {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1,
- item->x2, item->y2);
- eti->needs_redraw = 0;
- }
-}
-
-/*
- * eti_remove_table_model:
- *
- * Invoked to release the table model associated with this ETableItem
- */
-static void
-eti_remove_table_model (ETableItem *eti)
-{
- if (!eti->table_model)
- return;
-
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_pre_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_row_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_cell_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_row_inserted_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_row_deleted_id);
- gtk_object_unref (GTK_OBJECT (eti->table_model));
- if (eti->source_model)
- gtk_object_unref (GTK_OBJECT (eti->source_model));
-
- eti->table_model_pre_change_id = 0;
- eti->table_model_change_id = 0;
- eti->table_model_row_change_id = 0;
- eti->table_model_cell_change_id = 0;
- eti->table_model_row_inserted_id = 0;
- eti->table_model_row_deleted_id = 0;
- eti->table_model = NULL;
- eti->source_model = NULL;
- eti->uses_source_model = 0;
-}
-
-/*
- * eti_remove_table_model:
- *
- * Invoked to release the table model associated with this ETableItem
- */
-static void
-eti_remove_table_selection_model (ETableItem *eti)
-{
- if (!eti->selection)
- return;
-
- gtk_signal_disconnect (GTK_OBJECT (eti->selection),
- eti->selection_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->selection),
- eti->cursor_change_id);
- gtk_object_unref (GTK_OBJECT (eti->selection));
-
- eti->selection_change_id = 0;
- eti->cursor_change_id = 0;
- eti->selection = NULL;
-}
-
-/*
- * eti_remove_header_model:
- *
- * Invoked to release the header model associated with this ETableItem
- */
-static void
-eti_remove_header_model (ETableItem *eti)
-{
- if (!eti->header)
- return;
-
- gtk_signal_disconnect (GTK_OBJECT (eti->header),
- eti->header_structure_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->header),
- eti->header_dim_change_id);
-
- if (eti->cell_views){
- eti_unrealize_cell_views (eti);
- eti_detach_cell_views (eti);
- }
- gtk_object_unref (GTK_OBJECT (eti->header));
-
-
- eti->header_structure_change_id = 0;
- eti->header_dim_change_id = 0;
- eti->header = NULL;
-}
-
-/*
- * eti_row_height_real:
- *
- * Returns the height used by row @row. This does not include the one-pixel
- * used as a separator between rows
- */
-static int
-eti_row_height_real (ETableItem *eti, int row)
-{
- const int cols = e_table_header_count (eti->header);
- int col;
- int h, max_h;
-
- g_assert (eti->cell_views);
-
- max_h = 0;
-
- for (col = 0; col < cols; col++){
- h = e_cell_height (eti->cell_views [col], view_to_model_col(eti, col), col, row);
-
- if (h > max_h)
- max_h = h;
- }
- return max_h;
-}
-
-static gboolean
-height_cache_idle(ETableItem *eti)
-{
- int changed = 0;
- int i;
- if (!eti->height_cache) {
- eti->height_cache = g_new(int, eti->rows);
- }
- for (i = eti->height_cache_idle_count; i < eti->rows; i++) {
- if (eti->height_cache[i] == -1) {
- eti_row_height(eti, i);
- changed ++;
- if (changed >= 20)
- break;
- }
- }
- if (changed >= 20) {
- eti->height_cache_idle_count = i;
- return TRUE;
- }
- eti->height_cache_idle_id = 0;
- return FALSE;
-}
-
-static void
-free_height_cache (ETableItem *eti)
-{
- if (eti->height_cache)
- g_free (eti->height_cache);
- eti->height_cache = NULL;
- eti->height_cache_idle_count = 0;
-
- if (eti->height_cache_idle_id == 0)
- eti->height_cache_idle_id = g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc) height_cache_idle, eti, NULL);
-}
-
-static void
-calculate_height_cache (ETableItem *eti)
-{
- int i;
- free_height_cache(eti);
- eti->height_cache = g_new(int, eti->rows);
- for (i = 0; i < eti->rows; i++) {
- eti->height_cache[i] = -1;
- }
-}
-
-
-/*
- * eti_row_height:
- *
- * Returns the height used by row @row. This does not include the one-pixel
- * used as a separator between rows
- */
-static int
-eti_row_height (ETableItem *eti, int row)
-{
- if (!eti->height_cache) {
- calculate_height_cache (eti);
- }
- if (eti->height_cache[row] == -1) {
- eti->height_cache[row] = eti_row_height_real(eti, row);
- if (row > 0 &&
- eti->length_threshold != -1 &&
- eti->rows > eti->length_threshold &&
- eti->height_cache[row] != eti_row_height(eti, 0)) {
- eti->needs_compute_height = 1;
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(eti));
- }
- }
- return eti->height_cache[row];
-}
-
-/*
- * eti_get_height:
- *
- * Returns the height of the ETableItem.
- *
- * The ETableItem might compute the whole height by asking every row its
- * size. There is a special mode (designed to work when there are too
- * many rows in the table that performing the previous step could take
- * too long) set by the ETableItem->length_threshold that would determine
- * when the height is computed by using the first row as the size for
- * every other row in the ETableItem.
- */
-static int
-eti_get_height (ETableItem *eti)
-{
- const int rows = eti->rows;
- int row;
- int height;
-
- if (rows == 0)
- return 0;
-
- if (eti->length_threshold != -1){
- if (rows > eti->length_threshold){
- int row_height = eti_row_height(eti, 0);
- if (eti->height_cache) {
- height = 0;
- for (row = 0; row < rows; row++) {
- if (eti->height_cache[row] == -1) {
- height += (row_height + 1) * (rows - row);
- break;
- }
- else
- height += eti->height_cache[row] + 1;
- }
- } else
- height = (eti_row_height (eti, 0) + 1) * rows;
-
- /*
- * 1 pixel at the top
- */
- return height + 1;
- }
- }
-
- height = 1;
- for (row = 0; row < rows; row++)
- height += eti_row_height (eti, row) + 1;
-
- return height;
-}
-
-static int
-eti_get_minimum_width (ETableItem *eti)
-{
- int width = 0;
- int col;
- for (col = 0; col < eti->cols; col++){
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
- width += ecol->min_width;
- }
- return width;
-}
-
-static void
-eti_item_region_redraw (ETableItem *eti, int x0, int y0, int x1, int y1)
-{
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti);
- ArtDRect rect;
- double i2c [6];
-
- rect.x0 = x0;
- rect.y0 = y0;
- rect.x1 = x1;
- rect.y1 = y1;
-
- gnome_canvas_item_i2c_affine (item, i2c);
- art_drect_affine_transform (&rect, &rect, i2c);
-
- gnome_canvas_request_redraw (item->canvas, rect.x0, rect.y0, rect.x1, rect.y1);
-}
-
-/*
- * Callback routine: invoked before the ETableModel has suffers a change
- */
-static void
-eti_table_model_pre_change (ETableModel *table_model, ETableItem *eti)
-{
- if (eti_editing (eti))
- e_table_item_leave_edit (eti);
-}
-
-/*
- * Callback routine: invoked when the ETableModel has suffered a change
- */
-static void
-eti_table_model_changed (ETableModel *table_model, ETableItem *eti)
-{
-#if 0
- int view_row;
-#endif
-
- eti->rows = e_table_model_row_count (eti->table_model);
-
- free_height_cache(eti);
-
- eti->needs_compute_height = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-
-#if 0
- view_row = model_to_view_row(eti, eti->cursor_row);
- if (view_row >= 0 && eti->cursor_col >= 0)
- eti_request_region_show (eti, eti->cursor_col, view_row, eti->cursor_col, view_row);
-#endif
-}
-
-/*
- * Computes the distance between @start_row and @end_row in pixels
- */
-static int
-eti_row_diff (ETableItem *eti, int start_row, int end_row)
-{
- int row, total;
-
- total = 0;
-
- for (row = start_row; row < end_row; row++)
- total += eti_row_height (eti, row) + 1;
-
- return total;
-}
-
-/*
- * eti_request_region_redraw:
- *
- * Request a canvas redraw on the range (start_col, start_row) to (end_col, end_row).
- * This is inclusive (ie, you can use: 0,0-0,0 to redraw the first cell).
- *
- * The @border argument is a number of pixels around the region that should also be queued
- * for redraw. This is typically used by the focus routines to queue a redraw for the
- * border as well.
- */
-static void
-eti_request_region_redraw (ETableItem *eti,
- int start_col, int start_row,
- int end_col, int end_row, int border)
-{
- int x1, y1, width, height;
-
- if (eti->rows > 0) {
-
- x1 = e_table_header_col_diff (eti->header, 0, start_col);
- y1 = eti_row_diff (eti, 0, start_row);
- width = e_table_header_col_diff (eti->header, start_col, end_col + 1);
- height = eti_row_diff (eti, start_row, end_row + 1);
-
- eti_item_region_redraw (eti, eti->x1 + x1 - border,
- eti->y1 + y1 - border,
- eti->x1 + x1 + width + 1 + border,
- eti->y1 + y1 + height + 1 + border);
- }
-}
-
-/*
- * eti_request_region_show
- *
- * Request a canvas show on the range (start_col, start_row) to (end_col, end_row).
- * This is inclusive (ie, you can use: 0,0-0,0 to show the first cell).
- */
-static void
-eti_request_region_show (ETableItem *eti,
- int start_col, int start_row,
- int end_col, int end_row)
-{
- int x1, y1, x2, y2;
-
- x1 = e_table_header_col_diff (eti->header, 0, start_col);
- y1 = eti_row_diff (eti, 0, start_row);
- x2 = x1 + e_table_header_col_diff (eti->header, start_col, end_col + 1);
- y2 = y1 + eti_row_diff (eti, start_row, end_row + 1);
-
- e_canvas_item_show_area(GNOME_CANVAS_ITEM(eti), x1, y1, x2, y2);
-}
-
-static void
-eti_table_model_row_changed (ETableModel *table_model, int row, ETableItem *eti)
-{
- if (eti->renderers_can_change_size) {
- eti_table_model_changed (table_model, eti);
- return;
- }
-
- eti_request_region_redraw (eti, 0, row, eti->cols, row, 0);
-}
-
-static void
-eti_table_model_cell_changed (ETableModel *table_model, int col, int row, ETableItem *eti)
-{
- if (eti->renderers_can_change_size) {
- eti_table_model_changed (table_model, eti);
- return;
- }
-
- eti_request_region_redraw (eti, 0, row, eti->cols -1, row, 0);
-}
-
-static void
-eti_table_model_row_inserted (ETableModel *table_model, int row, ETableItem *eti)
-{
- eti_table_model_changed (table_model, eti);
-}
-
-static void
-eti_table_model_row_deleted (ETableModel *table_model, int row, ETableItem *eti)
-{
- eti_table_model_changed (table_model, eti);
-}
-
-void
-e_table_item_redraw_range (ETableItem *eti,
- int start_col, int start_row,
- int end_col, int end_row)
-{
- int border;
- int cursor_col, cursor_row;
-
- g_return_if_fail (eti != NULL);
- g_return_if_fail (E_IS_TABLE_ITEM (eti));
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- if ((start_col == cursor_col) ||
- (end_col == cursor_col) ||
- (view_to_model_row(eti, start_row) == cursor_row) ||
- (view_to_model_row(eti, end_row) == cursor_row))
- border = 2;
- else
- border = 0;
-
- eti_request_region_redraw(eti, start_col, start_row, end_col, end_row, border);
-}
-
-static void
-eti_add_table_model (ETableItem *eti, ETableModel *table_model)
-{
- g_assert (eti->table_model == NULL);
-
- eti->table_model = table_model;
- gtk_object_ref (GTK_OBJECT (eti->table_model));
-
- eti->table_model_pre_change_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_pre_change",
- GTK_SIGNAL_FUNC (eti_table_model_pre_change), eti);
-
- eti->table_model_change_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_changed",
- GTK_SIGNAL_FUNC (eti_table_model_changed), eti);
-
- eti->table_model_row_change_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_row_changed",
- GTK_SIGNAL_FUNC (eti_table_model_row_changed), eti);
-
- eti->table_model_cell_change_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_cell_changed",
- GTK_SIGNAL_FUNC (eti_table_model_cell_changed), eti);
-
- eti->table_model_row_inserted_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_row_inserted",
- GTK_SIGNAL_FUNC (eti_table_model_row_inserted), eti);
-
- eti->table_model_row_deleted_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_row_deleted",
- GTK_SIGNAL_FUNC (eti_table_model_row_deleted), eti);
-
- if (eti->header) {
- eti_detach_cell_views (eti);
- eti_attach_cell_views (eti);
- }
-
- if (E_IS_TABLE_SUBSET(table_model)) {
- eti->uses_source_model = 1;
- eti->source_model = E_TABLE_SUBSET(table_model)->source;
- if (eti->source_model)
- gtk_object_ref(GTK_OBJECT(eti->source_model));
- }
-
- eti_table_model_changed (table_model, eti);
-}
-
-static void
-eti_add_table_selection_model (ETableItem *eti, ETableSelectionModel *selection)
-{
- g_assert (eti->selection == NULL);
-
- eti->selection = selection;
- gtk_object_ref (GTK_OBJECT (eti->selection));
-
- eti->selection_change_id = gtk_signal_connect (
- GTK_OBJECT (selection), "selection_changed",
- GTK_SIGNAL_FUNC (eti_selection_change), eti);
-
- eti->cursor_change_id = gtk_signal_connect (
- GTK_OBJECT (selection), "cursor_changed",
- GTK_SIGNAL_FUNC (eti_cursor_change), eti);
-
- eti_selection_change(selection, eti);
-}
-
-static void
-eti_header_dim_changed (ETableHeader *eth, int col, ETableItem *eti)
-{
- eti->needs_compute_width = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-}
-
-static void
-eti_header_structure_changed (ETableHeader *eth, ETableItem *eti)
-{
- eti->cols = e_table_header_count (eti->header);
- eti->width = e_table_header_total_width (eti->header);
-
- /*
- * There should be at least one column
- */
- g_assert (eti->cols != 0);
-
- if (eti->cell_views){
- eti_unrealize_cell_views (eti);
- eti_detach_cell_views (eti);
- eti_attach_cell_views (eti);
- eti_realize_cell_views (eti);
- } else {
- if (eti->table_model) {
- eti_detach_cell_views (eti);
- eti_attach_cell_views (eti);
- }
- }
- eti->needs_compute_width = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-}
-
-static void
-eti_add_header_model (ETableItem *eti, ETableHeader *header)
-{
- g_assert (eti->header == NULL);
-
- eti->header = header;
- gtk_object_ref (GTK_OBJECT (header));
-
- eti_header_structure_changed (header, eti);
-
- eti->header_dim_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "dimension_change",
- GTK_SIGNAL_FUNC (eti_header_dim_changed), eti);
-
- eti->header_structure_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "structure_change",
- GTK_SIGNAL_FUNC (eti_header_structure_changed), eti);
-}
-
-/*
- * GtkObject::destroy method
- */
-static void
-eti_destroy (GtkObject *object)
-{
- ETableItem *eti = E_TABLE_ITEM (object);
-
- eti_remove_header_model (eti);
- eti_remove_table_model (eti);
- eti_remove_table_selection_model (eti);
-
- if (eti->selection)
- gtk_object_unref(GTK_OBJECT(eti->selection));
-
- if (eti->height_cache_idle_id)
- g_source_remove(eti->height_cache_idle_id);
-
- g_free (eti->height_cache);
-
- if (GTK_OBJECT_CLASS (eti_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (eti_parent_class)->destroy) (object);
-}
-
-static void
-eti_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableItem *eti;
- int cursor_col;
-
- item = GNOME_CANVAS_ITEM (o);
- eti = E_TABLE_ITEM (o);
-
- switch (arg_id){
- case ARG_TABLE_HEADER:
- eti_remove_header_model (eti);
- eti_add_header_model (eti, E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg)));
- break;
-
- case ARG_TABLE_MODEL:
- eti_remove_table_model (eti);
- eti_add_table_model (eti, E_TABLE_MODEL(GTK_VALUE_OBJECT (*arg)));
- break;
-
- case ARG_TABLE_SELECTION_MODEL:
- eti_remove_table_selection_model (eti);
- if (GTK_VALUE_OBJECT (*arg))
- eti_add_table_selection_model (eti, E_TABLE_SELECTION_MODEL(GTK_VALUE_OBJECT (*arg)));
- break;
-
- case ARG_LENGTH_THRESHOLD:
- eti->length_threshold = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_TABLE_DRAW_GRID:
- eti->draw_grid = GTK_VALUE_BOOL (*arg);
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- eti->draw_focus = GTK_VALUE_BOOL (*arg);
- break;
-
- case ARG_CURSOR_MODE:
- eti->cursor_mode = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_MINIMUM_WIDTH:
- case ARG_WIDTH:
- if (eti->minimum_width == eti->width && GTK_VALUE_DOUBLE (*arg) > eti->width)
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
- eti->minimum_width = GTK_VALUE_DOUBLE (*arg);
- if (eti->minimum_width < eti->width)
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
- break;
- case ARG_CURSOR_ROW:
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- NULL);
-
- e_table_item_focus (eti, cursor_col != -1 ? cursor_col : 0, view_to_model_row(eti, GTK_VALUE_INT (*arg)), 0);
- break;
- }
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(eti));
-}
-
-static void
-eti_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableItem *eti;
- int row;
-
- item = GNOME_CANVAS_ITEM (o);
- eti = E_TABLE_ITEM (o);
-
- switch (arg_id){
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = eti->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = eti->height;
- break;
- case ARG_MINIMUM_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = eti->minimum_width;
- break;
- case ARG_CURSOR_ROW:
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &row,
- NULL);
- GTK_VALUE_INT (*arg) = model_to_view_row(eti, row);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- }
-}
-
-static void
-eti_init (GnomeCanvasItem *item)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
-
- eti->editing_col = -1;
- eti->editing_row = -1;
- eti->height = 0;
- eti->width = 0;
- eti->minimum_width = 0;
-
- eti->height_cache = NULL;
- eti->height_cache_idle_id = 0;
- eti->height_cache_idle_count = 0;
-
- eti->length_threshold = -1;
- eti->renderers_can_change_size = 1;
-
- eti->uses_source_model = 0;
- eti->source_model = NULL;
-
- eti->row_guess = -1;
- eti->cursor_mode = E_TABLE_CURSOR_SIMPLE;
-
- eti->selection_change_id = 0;
- eti->cursor_change_id = 0;
- eti->selection = NULL;
-
- eti->needs_redraw = 0;
- eti->needs_compute_height = 0;
-
- e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM (eti), eti_reflow);
-}
-
-#define gray50_width 2
-#define gray50_height 2
-static const char gray50_bits[] = {
- 0x02, 0x01, };
-
-static void
-eti_realize (GnomeCanvasItem *item)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
- GtkWidget *canvas_widget = GTK_WIDGET (item->canvas);
- GdkWindow *window;
-
- if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->realize)
- (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->realize)(item);
-
- /*
- * Gdk Resource allocation
- */
- window = canvas_widget->window;
-
- eti->fill_gc = gdk_gc_new (window);
-
- eti->grid_gc = gdk_gc_new (window);
-#if 0
- /* This sets it to gray */
-/* gdk_gc_set_foreground (eti->grid_gc, &canvas_widget->style->bg [GTK_STATE_NORMAL]); */
-#else
- gdk_gc_set_foreground (eti->grid_gc, &canvas_widget->style->dark [GTK_STATE_NORMAL]);
-#endif
- eti->focus_gc = gdk_gc_new (window);
- gdk_gc_set_foreground (eti->focus_gc, &canvas_widget->style->bg [GTK_STATE_NORMAL]);
- gdk_gc_set_background (eti->focus_gc, &canvas_widget->style->fg [GTK_STATE_NORMAL]);
- eti->stipple = gdk_bitmap_create_from_data (NULL, gray50_bits, gray50_width, gray50_height);
- gdk_gc_set_ts_origin (eti->focus_gc, 0, 0);
- gdk_gc_set_stipple (eti->focus_gc, eti->stipple);
- gdk_gc_set_fill (eti->focus_gc, GDK_OPAQUE_STIPPLED);
-
- if (eti->cell_views == NULL)
- eti_attach_cell_views (eti);
-
- eti_realize_cell_views (eti);
-
- eti->needs_compute_height = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-}
-
-static void
-eti_unrealize (GnomeCanvasItem *item)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
-
- if (eti_editing (eti))
- e_table_item_leave_edit (eti);
-
- gdk_gc_unref (eti->fill_gc);
- eti->fill_gc = NULL;
- gdk_gc_unref (eti->grid_gc);
- eti->grid_gc = NULL;
- gdk_gc_unref (eti->focus_gc);
- eti->focus_gc = NULL;
- gdk_bitmap_unref (eti->stipple);
- eti->stipple = NULL;
-
- eti_unrealize_cell_views (eti);
-
- eti->height = 0;
-
- if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->unrealize)(item);
-}
-
-static void
-eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
- const int rows = eti->rows;
- const int cols = eti->cols;
- int row, col, y1, y2;
- int first_col, last_col, x_offset;
- int first_row, last_row, y_offset, yd;
- int x1, x2;
- int f_x1, f_x2, f_y1, f_y2;
- gboolean f_found;
- double i2c [6];
- ArtPoint eti_base, eti_base_item;
- GtkWidget *canvas = GTK_WIDGET(item->canvas);
- GdkColor *background;
-
- /*
- * Clear the background
- */
-#if 0
- gdk_draw_rectangle (
- drawable, eti->fill_gc, TRUE,
- eti->x1 - x, eti->y1 - y, eti->width, eti->height);
-#endif
-
- /*
- * Find out our real position after grouping
- */
- gnome_canvas_item_i2c_affine (item, i2c);
- eti_base_item.x = eti->x1;
- eti_base_item.y = eti->y1;
- art_affine_point (&eti_base, &eti_base_item, i2c);
-
- /*
- * First column to draw, last column to draw
- */
- first_col = -1;
- last_col = x_offset = 0;
- x1 = x2 = floor (eti_base.x);
- for (col = 0; col < cols; col++, x1 = x2){
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
- x2 = x1 + ecol->width;
-
- if (x1 > (x + width))
- break;
- if (x2 < x)
- continue;
- if (first_col == -1){
- x_offset = x1 - x;
- first_col = col;
- }
- }
- last_col = col;
-
- /*
- * Nothing to paint
- */
- if (first_col == -1)
- return;
-
- /*
- * Compute row span.
- */
- first_row = -1;
- y_offset = 0;
- y1 = y2 = floor (eti_base.y) + 1;
- for (row = 0; row < rows; row++, y1 = y2){
-
- y2 += ETI_ROW_HEIGHT (eti, row) + 1;
-
- if (y1 > y + height)
- break;
-
- if (y2 < y)
- continue;
-
- if (first_row == -1){
- y_offset = y1 - y;
- first_row = row;
- }
- }
- last_row = row;
-
- if (first_row == -1)
- return;
-
- /*
- * Draw cells
- */
- yd = y_offset;
- f_x1 = f_x2 = f_y1 = f_y2 = -1;
- f_found = FALSE;
-
- if (eti->draw_grid && first_row == 0){
- gdk_draw_line (
- drawable, eti->grid_gc,
- eti_base.x - x, yd, eti_base.x + eti->width - x, yd);
- }
- yd++;
-
- for (row = first_row; row < last_row; row++){
- int xd, height;
- gboolean selected;
- gint cursor_col, cursor_row;
-
- height = ETI_ROW_HEIGHT (eti, row);
-
- xd = x_offset;
-/* printf ("paint: %d %d\n", yd, yd + height); */
-
- selected = e_table_selection_model_is_row_selected(eti->selection, view_to_model_row(eti,row));
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- for (col = first_col; col < last_col; col++){
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
- ECellView *ecell_view = eti->cell_views [col];
- gboolean col_selected = selected;
- switch (eti->cursor_mode) {
- case E_TABLE_CURSOR_SIMPLE:
- if (cursor_col == ecol->col_idx && cursor_row == view_to_model_row(eti, row))
- col_selected = !col_selected;
- break;
- case E_TABLE_CURSOR_LINE:
- /* Nothing */
- break;
- }
-
- if (selected){
- background = &canvas->style->bg [GTK_STATE_SELECTED];
- } else {
- if (row % 2)
- background = &canvas->style->base [GTK_STATE_NORMAL];
- else
- background = &canvas->style->base [GTK_STATE_SELECTED];
- }
-
- gdk_gc_set_foreground (eti->fill_gc, background);
- gdk_draw_rectangle (drawable, eti->fill_gc, TRUE,
- xd, yd, ecol->width, height);
-
- e_cell_draw (ecell_view, drawable, ecol->col_idx, col, row, col_selected,
- xd, yd, xd + ecol->width, yd + height);
-
- if (view_to_model_col(eti, col) == cursor_col && view_to_model_row(eti, row) == cursor_row){
- f_x1 = xd;
- f_x2 = xd + ecol->width;
- f_y1 = yd;
- f_y2 = yd + height;
- f_found = TRUE;
- }
-
- xd += ecol->width;
- }
- yd += height;
-
- if (eti->draw_grid)
- gdk_draw_line (
- drawable, eti->grid_gc,
- eti_base.x - x, yd, eti_base.x + eti->width - x, yd);
- yd++;
- }
-
- if (eti->draw_grid){
- int xd = x_offset;
-
- for (col = first_col; col <= last_col; col++){
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
- gdk_draw_line (
- drawable, eti->grid_gc,
- xd, y_offset, xd, yd - 1);
-
- /*
- * This looks wierd, but it is to draw the last line
- */
- if (ecol)
- xd += ecol->width;
- }
- }
-
- /*
- * Draw focus
- */
- if (f_found && eti->draw_focus){
- gdk_draw_rectangle (drawable, eti->focus_gc, FALSE,
- f_x1 + 1, f_y1, f_x2 - f_x1 - 2, f_y2 - f_y1 - 1);
- }
-}
-
-static double
-eti_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
-
- return 0.0;
-}
-
-static gboolean
-find_cell (ETableItem *eti, double x, double y, int *col_res, int *row_res, double *x1_res, double *y1_res)
-{
- const int cols = eti->cols;
- const int rows = eti->rows;
- gdouble x1, y1, x2, y2;
- int col, row;
-
- /* FIXME: this routine is inneficient, fix later */
-
- if (cols == 0 || rows == 0)
- return FALSE;
-
- x -= eti->x1;
- y -= eti->y1;
-
- x1 = 0;
- for (col = 0; col < cols - 1; col++, x1 = x2){
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
- if (x < x1)
- return FALSE;
-
- x2 = x1 + ecol->width;
-
- if (x <= x2)
- break;
- }
-
- y1 = y2 = 0;
- for (row = 0; row < rows - 1; row++, y1 = y2){
- if (y < y1)
- return FALSE;
-
- y2 += ETI_ROW_HEIGHT (eti, row) + 1;
-
- if (y <= y2)
- break;
- }
- *col_res = col;
- if (x1_res)
- *x1_res = x - x1;
- *row_res = row;
- if (y1_res)
- *y1_res = y - y1;
- return TRUE;
-}
-
-static void
-eti_cursor_move (ETableItem *eti, gint row, gint column)
-{
- e_table_item_leave_edit (eti);
- e_table_item_focus (eti, view_to_model_col(eti, column), view_to_model_row(eti, row), 0);
-}
-
-static void
-eti_cursor_move_left (ETableItem *eti)
-{
- int cursor_col, cursor_row;
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row), model_to_view_col(eti, cursor_col) - 1);
-}
-
-static void
-eti_cursor_move_right (ETableItem *eti)
-{
- int cursor_col, cursor_row;
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row), model_to_view_col(eti, cursor_col) + 1);
-}
-
-static void
-eti_cursor_move_up (ETableItem *eti)
-{
- int cursor_col, cursor_row;
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row) - 1, model_to_view_col(eti, cursor_col));
-}
-
-static void
-eti_cursor_move_down (ETableItem *eti)
-{
- int cursor_col, cursor_row;
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row) + 1, model_to_view_col(eti, cursor_col));
-}
-
-/* FIXME: cursor */
-static int
-eti_event (GnomeCanvasItem *item, GdkEvent *e)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
- ECellView *ecell_view;
- gint return_val = TRUE;
-
- switch (e->type){
- case GDK_BUTTON_PRESS: {
- double x1, y1;
- int col, row;
- gint cursor_row, cursor_col;
-
- e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(eti));
-
- switch (e->button.button) {
- case 1: /* Fall through. */
- case 2:
- gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
-
- if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1))
- return TRUE;
-
- e_table_selection_model_do_something(eti->selection, view_to_model_row(eti, row), view_to_model_col(eti, col), e->button.state);
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_row == view_to_model_row(eti, row) && cursor_col == view_to_model_col(eti, col)){
-
- if ((!eti_editing(eti)) && e_table_model_is_cell_editable(eti->selection->model, cursor_col, cursor_row)) {
- e_table_item_enter_edit (eti, col, row);
- }
-
- ecell_view = eti->cell_views [col];
-
- /*
- * Adjust the event positions
- */
- e->button.x = x1;
- e->button.y = y1;
-
- e_cell_event (ecell_view, e, view_to_model_col(eti, col), col, row);
- }
- break;
- case 3:
- gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
- if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1))
- return TRUE;
-
- e_table_selection_model_maybe_do_something(eti->selection, view_to_model_row(eti, row), view_to_model_col(eti, col), 0);
-
- gtk_signal_emit (GTK_OBJECT (eti), eti_signals [RIGHT_CLICK],
- row, col, e, &return_val);
- break;
- case 4:
- case 5:
- return FALSE;
- break;
-
- }
- break;
- }
-
- case GDK_BUTTON_RELEASE: {
- double x1, y1;
- int col, row;
- gint cursor_row, cursor_col;
-
- switch (e->button.button) {
- case 1: /* Fall through. */
- case 2:
- gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
-
- if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1))
- return TRUE;
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_row == view_to_model_row(eti, row) && cursor_col == view_to_model_col(eti, col)){
-
- ecell_view = eti->cell_views [col];
-
- /*
- * Adjust the event positions
- */
- e->button.x = x1;
- e->button.y = y1;
-
- e_cell_event (ecell_view, e, view_to_model_col(eti, col), col, row);
- }
- break;
- case 3:
- case 4:
- case 5:
- return FALSE;
- break;
-
- }
- break;
- }
-
- case GDK_2BUTTON_PRESS: {
- double x1, y1;
- int col, row;
-
- if (e->button.button == 5 ||
- e->button.button == 4)
- return FALSE;
-
- gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
-
- if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1))
- return TRUE;
-
- gtk_signal_emit (GTK_OBJECT (eti), eti_signals [DOUBLE_CLICK],
- row);
- break;
- }
- case GDK_MOTION_NOTIFY: {
- int col, row;
- double x1, y1;
- gint cursor_col, cursor_row;
-
- gnome_canvas_item_w2i (item, &e->motion.x, &e->motion.y);
-
- if (!find_cell (eti, e->motion.x, e->motion.y, &col, &row, &x1, &y1))
- return TRUE;
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_row == view_to_model_row(eti, row) && cursor_col == view_to_model_col(eti, col)){
- ecell_view = eti->cell_views [col];
-
- /*
- * Adjust the event positions
- */
- e->motion.x = x1;
- e->motion.y = y1;
-
- e_cell_event (ecell_view, e, view_to_model_col(eti, col), col, row);
- }
- break;
- }
-
- case GDK_KEY_PRESS: {
- gint cursor_row, cursor_col;
- gint handled = TRUE;
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_col == -1)
- return FALSE;
-
- switch (e->key.keyval){
- case GDK_Left:
- if (eti_editing (eti)) {
- handled = FALSE;
- break;
- }
-
- if (cursor_col != view_to_model_col(eti, 0))
- eti_cursor_move_left (eti);
- break;
-
- case GDK_Right:
- if (eti_editing (eti)) {
- handled = FALSE;
- break;
- }
-
- if (cursor_col != view_to_model_col(eti, eti->cols - 1))
- eti_cursor_move_right (eti);
- break;
-
- case GDK_Up:
- if (cursor_row != view_to_model_row(eti, 0))
- eti_cursor_move_up (eti);
- else
- return_val = FALSE;
- break;
-
- case GDK_Down:
- if (cursor_row != view_to_model_row(eti, eti->rows - 1))
- eti_cursor_move_down (eti);
- else
- return_val = FALSE;
- break;
-
- case GDK_Tab:
- case GDK_KP_Tab:
- case GDK_ISO_Left_Tab:
- if ((e->key.state & GDK_SHIFT_MASK) != 0){
- /* shift tab */
- if (cursor_col != view_to_model_col(eti, 0))
- eti_cursor_move_left (eti);
- else if (cursor_row != view_to_model_row(eti, 0))
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row) - 1, eti->cols - 1);
- else
- return_val = FALSE;
- } else {
- if (cursor_col != view_to_model_col (eti, eti->cols - 1))
- eti_cursor_move_right (eti);
- else if (cursor_row != view_to_model_row(eti, eti->rows - 1))
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row) + 1, 0);
- else
- return_val = FALSE;
- }
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_col >= 0 && cursor_row >= 0 && return_val &&
- (!eti_editing(eti)) && e_table_model_is_cell_editable(eti->selection->model, cursor_col, cursor_row)) {
- e_table_item_enter_edit (eti, model_to_view_col(eti, cursor_col), model_to_view_row(eti, cursor_row));
- }
- break;
-
- case GDK_Return:
- case GDK_KP_Enter:
- case GDK_ISO_Enter:
- case GDK_3270_Enter:
- if (eti_editing (eti)){
- e_table_item_leave_edit (eti);
-#if 0
- ecell_view = eti->cell_views [eti->editing_col];
- e_cell_event (ecell_view, e, view_to_model_col(eti, eti->editing_col), eti->editing_col, eti->editing_row);
-#endif
- }
- return_val = FALSE;
- gtk_signal_emit (GTK_OBJECT (eti), eti_signals [KEY_PRESS],
- model_to_view_row(eti, cursor_row), cursor_col, e, &return_val);
- break;
-
- default:
- handled = FALSE;
- break;
- }
- if (!handled) {
- if (!eti_editing (eti)){
- gint col, row;
- row = model_to_view_row(eti, cursor_row);
- col = model_to_view_col(eti, cursor_col);
- if (col != -1 && row != -1 && e_table_model_is_cell_editable(eti->selection->model, cursor_col, cursor_row)) {
- e_table_item_enter_edit (eti, col, row);
- }
- }
- if (!eti_editing (eti)){
- gtk_signal_emit (GTK_OBJECT (eti), eti_signals [KEY_PRESS],
- model_to_view_row(eti, cursor_row), cursor_col, e, &return_val);
- } else {
- ecell_view = eti->cell_views [eti->editing_col];
- e_cell_event (ecell_view, e, view_to_model_col(eti, eti->editing_col), eti->editing_col, eti->editing_row);
- }
- }
- break;
- }
-
- case GDK_KEY_RELEASE: {
- gint cursor_row, cursor_col;
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_col == -1)
- return FALSE;
-
- if (eti_editing (eti)){
- ecell_view = eti->cell_views [eti->editing_col];
- e_cell_event (ecell_view, e, view_to_model_col(eti, eti->editing_col), eti->editing_col, eti->editing_row);
- }
- break;
- }
-
- default:
- return_val = FALSE;
- }
- return return_val;
-}
-
-static void
-eti_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
- ETableItemClass *eti_class = (ETableItemClass *) object_class;
-
- eti_parent_class = gtk_type_class (PARENT_OBJECT_TYPE);
-
- object_class->destroy = eti_destroy;
- object_class->set_arg = eti_set_arg;
- object_class->get_arg = eti_get_arg;
-
- item_class->update = eti_update;
- item_class->realize = eti_realize;
- item_class->unrealize = eti_unrealize;
- item_class->draw = eti_draw;
- item_class->point = eti_point;
- item_class->event = eti_event;
-
- eti_class->cursor_change = NULL;
- eti_class->double_click = NULL;
- eti_class->right_click = NULL;
- eti_class->key_press = NULL;
-
- gtk_object_add_arg_type ("ETableItem::ETableHeader", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_HEADER);
- gtk_object_add_arg_type ("ETableItem::ETableModel", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_MODEL);
- gtk_object_add_arg_type ("ETableItem::table_selection_model", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_SELECTION_MODEL);
- gtk_object_add_arg_type ("ETableItem::drawgrid", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_GRID);
- gtk_object_add_arg_type ("ETableItem::drawfocus", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_FOCUS);
- gtk_object_add_arg_type ("ETableItem::cursor_mode", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_CURSOR_MODE);
- gtk_object_add_arg_type ("ETableItem::length_threshold", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
-
- gtk_object_add_arg_type ("ETableItem::minimum_width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MINIMUM_WIDTH);
- gtk_object_add_arg_type ("ETableItem::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableItem::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("ETableItem::cursor_row", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_CURSOR_ROW);
-
- eti_signals [CURSOR_CHANGE] =
- gtk_signal_new ("cursor_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableItemClass, cursor_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- eti_signals [DOUBLE_CLICK] =
- gtk_signal_new ("double_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableItemClass, double_click),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- eti_signals [RIGHT_CLICK] =
- gtk_signal_new ("right_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableItemClass, right_click),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- eti_signals [KEY_PRESS] =
- gtk_signal_new ("key_press",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableItemClass, key_press),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (object_class, eti_signals, LAST_SIGNAL);
-
-}
-
-GtkType
-e_table_item_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableItem",
- sizeof (ETableItem),
- sizeof (ETableItemClass),
- (GtkClassInitFunc) eti_class_init,
- (GtkObjectInitFunc) eti_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_OBJECT_TYPE, &info);
- }
-
- return type;
-}
-
-void
-e_table_item_set_cursor (ETableItem *eti, int col, int row)
-{
- e_table_item_focus(eti, col, view_to_model_row(eti, row), 0);
-}
-
-static void
-e_table_item_focus (ETableItem *eti, int col, int row, GdkModifierType state)
-{
- g_return_if_fail (eti != NULL);
- g_return_if_fail (E_IS_TABLE_ITEM (eti));
-
- if (row == -1) {
- row = view_to_model_row(eti, eti->rows - 1);
- }
-
- if (col == -1) {
- col = eti->cols - 1;
- }
-
- if (row != -1) {
- e_table_selection_model_do_something(eti->selection,
- row, col,
- state);
- }
-}
-
-gint
-e_table_item_get_focused_column (ETableItem *eti)
-{
- int cursor_col;
-
- g_return_val_if_fail (eti != NULL, -1);
- g_return_val_if_fail (E_IS_TABLE_ITEM (eti), -1);
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- NULL);
-
- return cursor_col;
-}
-
-gboolean
-e_table_item_is_row_selected (ETableItem *eti, int row)
-{
- g_return_val_if_fail (eti != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_ITEM (eti), FALSE);
-
- return e_table_selection_model_is_row_selected(eti->selection, row);
-}
-
-static void
-eti_cursor_change (ETableSelectionModel *selection, int row, int col, ETableItem *eti)
-{
- int view_row = model_to_view_row(eti, row);
- int view_col = model_to_view_col(eti, col);
-
- if (view_row == -1 || view_col == -1) {
- e_table_item_leave_edit (eti);
- return;
- }
-
- eti_request_region_show (eti, view_col, view_row, view_col, view_row);
- e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(eti));
- if (eti_editing(eti))
- e_table_item_leave_edit (eti);
- gtk_signal_emit (GTK_OBJECT (eti), eti_signals [CURSOR_CHANGE],
- view_row);
- eti->needs_redraw = TRUE;
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(eti));
-}
-
-static void
-eti_selection_change (ETableSelectionModel *selection, ETableItem *eti)
-{
- eti->needs_redraw = TRUE;
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(eti));
-}
-
-void
-e_table_item_enter_edit (ETableItem *eti, int col, int row)
-{
- g_return_if_fail (eti != NULL);
- g_return_if_fail (E_IS_TABLE_ITEM (eti));
-
- if (eti_editing (eti))
- e_table_item_leave_edit(eti);
-
- eti->editing_col = col;
- eti->editing_row = row;
-
- eti->edit_ctx = e_cell_enter_edit (eti->cell_views [col], view_to_model_col(eti, col), col, row);
-}
-
-void
-e_table_item_leave_edit (ETableItem *eti)
-{
- int col, row;
- void *edit_ctx;
-
- g_return_if_fail (eti != NULL);
- g_return_if_fail (E_IS_TABLE_ITEM (eti));
-
- if (!eti_editing (eti))
- return;
-
- col = eti->editing_col;
- row = eti->editing_row;
- edit_ctx = eti->edit_ctx;
-
- eti->editing_col = -1;
- eti->editing_row = -1;
- eti->edit_ctx = NULL;
-
- e_cell_leave_edit (eti->cell_views [col],
- view_to_model_col(eti, col),
- col, row, edit_ctx);
-}
-
-void
-e_table_item_compute_location (ETableItem *eti,
- int *x,
- int *y,
- int *row,
- int *col)
-{
- if (!find_cell (eti, *x, *y, col, row, NULL, NULL)) {
- *y -= eti_get_height(eti);
- }
-
-}
-
-typedef struct {
- ETableItem *item;
- int rows_printed;
-} ETableItemPrintContext;
-
-static gdouble *
-e_table_item_calculate_print_widths (ETableHeader *eth, gdouble width)
-{
- int i;
- double extra;
- double expansion;
- int last_resizable = -1;
- gdouble scale = 300.0L / 70.0L;
- gdouble *widths = g_new(gdouble, e_table_header_count(eth));
- /* - 1 to account for the last pixel border. */
- extra = width - 1;
- expansion = 0;
- for (i = 0; i < eth->col_count; i++) {
- extra -= eth->columns[i]->min_width * scale;
- if (eth->columns[i]->resizeable && eth->columns[i]->expansion > 0)
- last_resizable = i;
- expansion += eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0;
- widths[i] = eth->columns[i]->min_width * scale;
- }
- for (i = 0; i <= last_resizable; i++) {
- widths[i] += extra * (eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0)/expansion;
- }
-
- return widths;
-}
-
-static gdouble
-eti_printed_row_height (ETableItem *eti, gdouble *widths, GnomePrintContext *context, gint row)
-{
- int col;
- int cols = eti->cols;
- gdouble height = 0;
- for (col = 0; col < cols; col++) {
- ECellView *ecell_view = eti->cell_views [col];
- gdouble this_height = e_cell_print_height (ecell_view, context, view_to_model_col(eti, col), col, row,
- widths[col] - 1);
- if (this_height > height)
- height = this_height;
- }
- return height;
-}
-
-#define CHECK(x) if((x) == -1) return -1;
-
-static gint
-gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height)
-{
- CHECK(gnome_print_moveto(context, x, y));
- CHECK(gnome_print_lineto(context, x + width, y));
- CHECK(gnome_print_lineto(context, x + width, y - height));
- CHECK(gnome_print_lineto(context, x, y - height));
- CHECK(gnome_print_lineto(context, x, y));
- return gnome_print_fill(context);
-}
-
-static void
-e_table_item_print_page (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble height,
- gboolean quantize,
- ETableItemPrintContext *itemcontext)
-{
- ETableItem *eti = itemcontext->item;
- const int rows = eti->rows;
- const int cols = eti->cols;
- int rows_printed = itemcontext->rows_printed;
- gdouble *widths;
- int row, col;
- gdouble yd = height;
-
- widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
-
- /*
- * Draw cells
- */
- if (eti->draw_grid){
- gp_draw_rect(context, 0, yd, width, 1);
- }
- yd--;
-
- for (row = rows_printed; row < rows; row++){
- gdouble xd = 1, row_height;
-
- row_height = eti_printed_row_height(eti, widths, context, row);
- if (quantize) {
- if (yd - row_height - 1 < 0 && row != rows_printed) {
- break;
- }
- } else {
- if (yd < 0) {
- break;
- }
- }
-
- for (col = 0; col < cols; col++){
- ECellView *ecell_view = eti->cell_views [col];
-
- if (gnome_print_gsave(context) == -1)
- /* FIXME */;
- if (gnome_print_translate(context, xd, yd - row_height) == -1)
- /* FIXME */;
-
- if (gnome_print_moveto(context, 0, 0) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, widths[col] - 1, 0) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, widths[col] - 1, row_height) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 0, row_height) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 0, 0) == -1)
- /* FIXME */;
- if (gnome_print_clip(context) == -1)
- /* FIXME */;
-
- e_cell_print (ecell_view, context, view_to_model_col(eti, col), col, row,
- widths[col] - 1, row_height);
-
- if (gnome_print_grestore(context) == -1)
- /* FIXME */;
-
- xd += widths[col];
- }
- yd -= row_height;
-
- if (eti->draw_grid){
- gp_draw_rect(context, 0, yd, width, 1);
- }
- yd--;
- }
-
- itemcontext->rows_printed = row;
-
- if (eti->draw_grid){
- gdouble xd = 0;
-
- for (col = 0; col < cols; col++){
- gp_draw_rect(context, xd, height, 1, height - yd);
-
- xd += widths[col];
- }
- gp_draw_rect(context, xd, height, 1, height - yd);
- }
-
- g_free (widths);
-}
-
-static gboolean
-e_table_item_data_left (EPrintable *ep,
- ETableItemPrintContext *itemcontext)
-{
- ETableItem *item = itemcontext->item;
- int rows_printed = itemcontext->rows_printed;
-
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "data_left");
- return rows_printed < item->rows;
-}
-
-static void
-e_table_item_reset (EPrintable *ep,
- ETableItemPrintContext *itemcontext)
-{
- itemcontext->rows_printed = 0;
-}
-
-static gdouble
-e_table_item_height (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantize,
- ETableItemPrintContext *itemcontext)
-{
- ETableItem *item = itemcontext->item;
- const int rows = item->rows;
- int rows_printed = itemcontext->rows_printed;
- gdouble *widths;
- int row;
- gdouble yd = 0;
-
- widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
-
- /*
- * Draw cells
- */
- yd++;
-
- for (row = rows_printed; row < rows; row++){
- gdouble row_height;
-
- row_height = eti_printed_row_height(item, widths, context, row);
- if (quantize) {
- if (max_height != -1 && yd + row_height + 1 > max_height && row != rows_printed) {
- break;
- }
- } else {
- if (max_height != -1 && yd > max_height) {
- break;
- }
- }
-
- yd += row_height;
-
- yd++;
- }
-
- g_free (widths);
-
- if (max_height != -1 && (!quantize) && yd > max_height)
- yd = max_height;
-
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "height");
- return yd;
-}
-
-static gboolean
-e_table_item_will_fit (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantize,
- ETableItemPrintContext *itemcontext)
-{
- ETableItem *item = itemcontext->item;
- const int rows = item->rows;
- int rows_printed = itemcontext->rows_printed;
- gdouble *widths;
- int row;
- gdouble yd = 0;
- gboolean ret_val = TRUE;
-
- widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
-
- /*
- * Draw cells
- */
- yd++;
-
- for (row = rows_printed; row < rows; row++){
- gdouble row_height;
-
- row_height = eti_printed_row_height(item, widths, context, row);
- if (quantize) {
- if (max_height != -1 && yd + row_height + 1 > max_height && row != rows_printed) {
- ret_val = FALSE;
- break;
- }
- } else {
- if (max_height != -1 && yd > max_height) {
- ret_val = FALSE;
- break;
- }
- }
-
- yd += row_height;
-
- yd++;
- }
-
- g_free (widths);
-
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "will_fit");
- return ret_val;
-}
-
-static void
-e_table_item_printable_destroy (GtkObject *object,
- ETableItemPrintContext *itemcontext)
-{
- gtk_object_unref(GTK_OBJECT(itemcontext->item));
- g_free(itemcontext);
-}
-
-EPrintable *
-e_table_item_get_printable (ETableItem *item)
-{
- EPrintable *printable = e_printable_new();
- ETableItemPrintContext *itemcontext;
-
- itemcontext = g_new(ETableItemPrintContext, 1);
- itemcontext->item = item;
- gtk_object_ref(GTK_OBJECT(item));
- itemcontext->rows_printed = 0;
-
- gtk_signal_connect (GTK_OBJECT(printable),
- "print_page",
- GTK_SIGNAL_FUNC(e_table_item_print_page),
- itemcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "data_left",
- GTK_SIGNAL_FUNC(e_table_item_data_left),
- itemcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "reset",
- GTK_SIGNAL_FUNC(e_table_item_reset),
- itemcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "height",
- GTK_SIGNAL_FUNC(e_table_item_height),
- itemcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "will_fit",
- GTK_SIGNAL_FUNC(e_table_item_will_fit),
- itemcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "destroy",
- GTK_SIGNAL_FUNC(e_table_item_printable_destroy),
- itemcontext);
-
- return printable;
-}
diff --git a/widgets/e-table/e-table-item.h b/widgets/e-table/e-table-item.h
deleted file mode 100644
index 2d81bca758..0000000000
--- a/widgets/e-table/e-table-item.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_ITEM_H_
-#define _E_TABLE_ITEM_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-table-model.h"
-#include "e-table-header.h"
-#include "e-table-selection-model.h"
-#include "e-table-defines.h"
-#include <e-util/e-printable.h>
-
-#define E_TABLE_ITEM_TYPE (e_table_item_get_type ())
-#define E_TABLE_ITEM(o) (GTK_CHECK_CAST ((o), E_TABLE_ITEM_TYPE, ETableItem))
-#define E_TABLE_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_ITEM_TYPE, ETableItemClass))
-#define E_IS_TABLE_ITEM(o) (GTK_CHECK_TYPE ((o), E_TABLE_ITEM_TYPE))
-#define E_IS_TABLE_ITEM_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_ITEM_TYPE))
-
-/* list selection modes */
-typedef enum
-{
- E_TABLE_CURSOR_LINE,
- E_TABLE_CURSOR_SIMPLE,
-} ETableCursorMode;
-
-typedef struct {
- GnomeCanvasItem parent;
- ETableModel *table_model;
- ETableHeader *header;
-
- ETableModel *source_model;
- ETableSelectionModel *selection;
-
- int x1, y1;
- int minimum_width, width, height;
-
- int cols, rows;
-
- /*
- * Ids for the signals we connect to
- */
- int header_dim_change_id;
- int header_structure_change_id;
- int table_model_pre_change_id;
- int table_model_change_id;
- int table_model_row_change_id;
- int table_model_cell_change_id;
- int table_model_row_inserted_id;
- int table_model_row_deleted_id;
-
- int selection_change_id;
- int cursor_change_id;
-
- GdkGC *fill_gc;
- GdkGC *grid_gc;
- GdkGC *focus_gc;
- GdkBitmap *stipple;
-
- guint draw_grid:1;
- guint draw_focus:1;
- guint renderers_can_change_size:1;
- guint cell_views_realized:1;
-
- guint needs_redraw : 1;
- guint needs_compute_height : 1;
- guint needs_compute_width : 1;
-
- guint uses_source_model : 1;
-
- /*
- * Realized views, per column
- */
- ECellView **cell_views;
- int n_cells;
-
- int *height_cache;
- int height_cache_idle_id;
- int height_cache_idle_count;
-
- /*
- * Lengh Threshold: above this, we stop computing correctly
- * the size
- */
- int length_threshold;
-
- gint row_guess;
- ETableCursorMode cursor_mode;
-
- /*
- * During editing
- */
- int editing_col, editing_row;
- void *edit_ctx;
-
-} ETableItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
- void (*cursor_change) (ETableItem *eti, int row);
- void (*double_click) (ETableItem *eti, int row);
- gint (*right_click) (ETableItem *eti, int row, int col, GdkEvent *event);
- gint (*key_press) (ETableItem *eti, int row, int col, GdkEvent *event);
-} ETableItemClass;
-
-GtkType e_table_item_get_type (void);
-
-
-/*
- * Focus
- */
-void e_table_item_set_cursor (ETableItem *eti, int col, int row);
-
-gint e_table_item_get_focused_column (ETableItem *eti);
-
-/*
- * Handling the selection
- */
-gboolean e_table_item_is_row_selected (ETableItem *e_table_Item,
- int row);
-
-void e_table_item_selected_row_foreach (ETableItem *eti,
- ETableForeachFunc func,
- gpointer closure);
-
-void e_table_item_leave_edit (ETableItem *eti);
-void e_table_item_enter_edit (ETableItem *eti, int col, int row);
-
-void e_table_item_redraw_range (ETableItem *eti,
- int start_col, int start_row,
- int end_col, int end_row);
-
-EPrintable *e_table_item_get_printable (ETableItem *eti);
-void e_table_item_print_height (ETableItem *eti,
- GnomePrintContext *context,
- gdouble width);
-void e_table_item_compute_location (ETableItem *eti,
- int *x,
- int *y,
- int *row,
- int *col);
-
-
-#endif /* _E_TABLE_ITEM_H_ */
diff --git a/widgets/e-table/e-table-model.c b/widgets/e-table/e-table-model.c
deleted file mode 100644
index d9c0c4fd38..0000000000
--- a/widgets/e-table/e-table-model.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-model.c: a Table Model
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-model.h"
-
-#define ETM_CLASS(e) ((ETableModelClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE gtk_object_get_type ()
-
-#define d(x)
-
-d(static gint depth = 0);
-
-
-static GtkObjectClass *e_table_model_parent_class;
-
-enum {
- MODEL_CHANGED,
- MODEL_PRE_CHANGE,
- MODEL_ROW_CHANGED,
- MODEL_CELL_CHANGED,
- MODEL_ROW_INSERTED,
- MODEL_ROW_DELETED,
- ROW_SELECTION,
- LAST_SIGNAL
-};
-
-static guint e_table_model_signals [LAST_SIGNAL] = { 0, };
-
-int
-e_table_model_column_count (ETableModel *e_table_model)
-{
- g_return_val_if_fail (e_table_model != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), 0);
-
- return ETM_CLASS (e_table_model)->column_count (e_table_model);
-}
-
-
-int
-e_table_model_row_count (ETableModel *e_table_model)
-{
- g_return_val_if_fail (e_table_model != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), 0);
-
- return ETM_CLASS (e_table_model)->row_count (e_table_model);
-}
-
-void *
-e_table_model_value_at (ETableModel *e_table_model, int col, int row)
-{
- g_return_val_if_fail (e_table_model != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
- return ETM_CLASS (e_table_model)->value_at (e_table_model, col, row);
-}
-
-void
-e_table_model_set_value_at (ETableModel *e_table_model, int col, int row, const void *data)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- ETM_CLASS (e_table_model)->set_value_at (e_table_model, col, row, data);
-}
-
-gboolean
-e_table_model_is_cell_editable (ETableModel *e_table_model, int col, int row)
-{
- g_return_val_if_fail (e_table_model != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
-
- return ETM_CLASS (e_table_model)->is_cell_editable (e_table_model, col, row);
-}
-
-void
-e_table_model_append_row (ETableModel *e_table_model, ETableModel *source, int row)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- if (ETM_CLASS (e_table_model)->append_row)
- ETM_CLASS (e_table_model)->append_row (e_table_model, source, row);
-}
-
-void *
-e_table_model_duplicate_value (ETableModel *e_table_model, int col, const void *value)
-{
- g_return_val_if_fail (e_table_model != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
- if (ETM_CLASS (e_table_model)->duplicate_value)
- return ETM_CLASS (e_table_model)->duplicate_value (e_table_model, col, value);
- else
- return NULL;
-}
-
-void
-e_table_model_free_value (ETableModel *e_table_model, int col, void *value)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- if (ETM_CLASS (e_table_model)->free_value)
- ETM_CLASS (e_table_model)->free_value (e_table_model, col, value);
-}
-
-void *
-e_table_model_initialize_value (ETableModel *e_table_model, int col)
-{
- g_return_val_if_fail (e_table_model != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
- if (ETM_CLASS (e_table_model)->initialize_value)
- return ETM_CLASS (e_table_model)->initialize_value (e_table_model, col);
- else
- return NULL;
-}
-
-gboolean
-e_table_model_value_is_empty (ETableModel *e_table_model, int col, const void *value)
-{
- g_return_val_if_fail (e_table_model != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
-
- if (ETM_CLASS (e_table_model)->value_is_empty)
- return ETM_CLASS (e_table_model)->value_is_empty (e_table_model, col, value);
- else
- return FALSE;
-}
-
-char *
-e_table_model_value_to_string (ETableModel *e_table_model, int col, const void *value)
-{
- g_return_val_if_fail (e_table_model != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
- if (ETM_CLASS (e_table_model)->value_to_string)
- return ETM_CLASS (e_table_model)->value_to_string (e_table_model, col, value);
- else
- return g_strdup("");
-}
-
-static void
-e_table_model_destroy (GtkObject *object)
-{
- if (e_table_model_parent_class->destroy)
- (*e_table_model_parent_class->destroy)(object);
-}
-
-static void
-e_table_model_class_init (GtkObjectClass *object_class)
-{
- ETableModelClass *klass = E_TABLE_MODEL_CLASS(object_class);
- e_table_model_parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = e_table_model_destroy;
-
- e_table_model_signals [MODEL_CHANGED] =
- gtk_signal_new ("model_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- e_table_model_signals [MODEL_PRE_CHANGE] =
- gtk_signal_new ("model_pre_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_pre_change),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- e_table_model_signals [MODEL_ROW_CHANGED] =
- gtk_signal_new ("model_row_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_row_changed),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- e_table_model_signals [MODEL_CELL_CHANGED] =
- gtk_signal_new ("model_cell_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_cell_changed),
- gtk_marshal_NONE__INT_INT,
- GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT);
-
- e_table_model_signals [MODEL_ROW_INSERTED] =
- gtk_signal_new ("model_row_inserted",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_row_inserted),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- e_table_model_signals [MODEL_ROW_DELETED] =
- gtk_signal_new ("model_row_deleted",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_row_deleted),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, e_table_model_signals, LAST_SIGNAL);
-
- klass->column_count = NULL;
- klass->row_count = NULL;
- klass->value_at = NULL;
- klass->set_value_at = NULL;
- klass->is_cell_editable = NULL;
- klass->append_row = NULL;
-
- klass->duplicate_value = NULL;
- klass->free_value = NULL;
- klass->initialize_value = NULL;
- klass->value_is_empty = NULL;
- klass->value_to_string = NULL;
- klass->model_changed = NULL;
- klass->model_row_changed = NULL;
- klass->model_cell_changed = NULL;
- klass->model_row_inserted = NULL;
- klass->model_row_deleted = NULL;
-}
-
-
-guint
-e_table_model_get_type (void)
-{
- static guint type = 0;
-
- if (!type)
- {
- GtkTypeInfo info =
- {
- "ETableModel",
- sizeof (ETableModel),
- sizeof (ETableModelClass),
- (GtkClassInitFunc) e_table_model_class_init,
- NULL,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-#if d(!)0
-static void
-print_tabs (void)
-{
- int i;
- for (i = 0; i < depth; i++)
- g_print("\t");
-}
-#endif
-
-void
-e_table_model_pre_change (ETableModel *e_table_model)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting pre_change on model 0x%p.\n", e_table_model));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_PRE_CHANGE]);
- d(depth--);
-}
-
-void
-e_table_model_changed (ETableModel *e_table_model)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting model_changed on model 0x%p.\n", e_table_model));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_CHANGED]);
- d(depth--);
-}
-
-void
-e_table_model_row_changed (ETableModel *e_table_model, int row)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting row_changed on model 0x%p, row %d.\n", e_table_model, row));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_ROW_CHANGED], row);
- d(depth--);
-}
-
-void
-e_table_model_cell_changed (ETableModel *e_table_model, int col, int row)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting cell_changed on model 0x%p, row %d, col %d.\n", e_table_model, row, col));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_CELL_CHANGED], col, row);
- d(depth--);
-}
-
-void
-e_table_model_row_inserted (ETableModel *e_table_model, int row)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting row_inserted on model 0x%p, row %d.\n", e_table_model, row));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_ROW_INSERTED], row);
- d(depth--);
-}
-
-void
-e_table_model_row_deleted (ETableModel *e_table_model, int row)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting row_deleted on model 0x%p, row %d.\n", e_table_model, row));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_ROW_DELETED], row);
- d(depth--);
-}
diff --git a/widgets/e-table/e-table-model.h b/widgets/e-table/e-table-model.h
deleted file mode 100644
index d4fae1659e..0000000000
--- a/widgets/e-table/e-table-model.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_MODEL_H_
-#define _E_TABLE_MODEL_H_
-
-#include <gtk/gtkobject.h>
-
-#define E_TABLE_MODEL_TYPE (e_table_model_get_type ())
-#define E_TABLE_MODEL(o) (GTK_CHECK_CAST ((o), E_TABLE_MODEL_TYPE, ETableModel))
-#define E_TABLE_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_MODEL_TYPE, ETableModelClass))
-#define E_IS_TABLE_MODEL(o) (GTK_CHECK_TYPE ((o), E_TABLE_MODEL_TYPE))
-#define E_IS_TABLE_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_MODEL_TYPE))
-
-typedef struct {
- GtkObject base;
-} ETableModel;
-
-typedef struct {
- GtkObjectClass parent_class;
-
- /*
- * Virtual methods
- */
- int (*column_count) (ETableModel *etm);
- int (*row_count) (ETableModel *etm);
- void *(*value_at) (ETableModel *etm, int col, int row);
- void (*set_value_at) (ETableModel *etm, int col, int row, const void *value);
- gboolean (*is_cell_editable) (ETableModel *etm, int col, int row);
- void (*append_row) (ETableModel *etm, ETableModel *source, int row);
-
- /* Allocate a copy of the given value. */
- void *(*duplicate_value) (ETableModel *etm, int col, const void *value);
- /* Free an allocated value. */
- void (*free_value) (ETableModel *etm, int col, void *value);
- /* Return an allocated empty value. */
- void *(*initialize_value) (ETableModel *etm, int col);
- /* Return TRUE if value is equivalent to an empty cell. */
- gboolean (*value_is_empty) (ETableModel *etm, int col, const void *value);
- /* Return an allocated string. */
- char *(*value_to_string) (ETableModel *etm, int col, const void *value);
-
- /*
- * Signals
- */
-
- /*
- * These all come after the change has been made.
- * Major structural changes: model_changed
- * Changes only in a row: row_changed
- * Only changes in a cell: cell_changed
- * A row inserted: row_inserted
- * A row deleted: row_deleted
- */
- void (*model_pre_change) (ETableModel *etm);
-
- void (*model_changed) (ETableModel *etm);
- void (*model_row_changed) (ETableModel *etm, int row);
- void (*model_cell_changed) (ETableModel *etm, int col, int row);
- void (*model_row_inserted) (ETableModel *etm, int row);
- void (*model_row_deleted) (ETableModel *etm, int row);
-} ETableModelClass;
-
-GtkType e_table_model_get_type (void);
-
-int e_table_model_column_count (ETableModel *e_table_model);
-const char *e_table_model_column_name (ETableModel *e_table_model, int col);
-int e_table_model_row_count (ETableModel *e_table_model);
-void *e_table_model_value_at (ETableModel *e_table_model, int col, int row);
-void e_table_model_set_value_at (ETableModel *e_table_model, int col, int row, const void *value);
-gboolean e_table_model_is_cell_editable (ETableModel *e_table_model, int col, int row);
-void e_table_model_append_row (ETableModel *e_table_model, ETableModel *source, int row);
-
-void *e_table_model_duplicate_value (ETableModel *e_table_model, int col, const void *value);
-void e_table_model_free_value (ETableModel *e_table_model, int col, void *value);
-void *e_table_model_initialize_value (ETableModel *e_table_model, int col);
-gboolean e_table_model_value_is_empty (ETableModel *e_table_model, int col, const void *value);
-char *e_table_model_value_to_string (ETableModel *e_table_model, int col, const void *value);
-
-/*
- * Routines for emitting signals on the e_table
- */
-void e_table_model_pre_change (ETableModel *e_table_model);
-void e_table_model_changed (ETableModel *e_table_model);
-void e_table_model_row_changed (ETableModel *e_table_model, int row);
-void e_table_model_cell_changed (ETableModel *e_table_model, int col, int row);
-void e_table_model_row_inserted (ETableModel *e_table_model, int row);
-void e_table_model_row_deleted (ETableModel *e_table_model, int row);
-
-#endif /* _E_TABLE_MODEL_H_ */
diff --git a/widgets/e-table/e-table-one.c b/widgets/e-table/e-table-one.c
deleted file mode 100644
index 40c24517f8..0000000000
--- a/widgets/e-table/e-table-one.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-model.c: a one table model implementation that uses function
- * pointers to simplify the creation of new, exotic and colorful tables in
- * no time.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-
-#include <config.h>
-#include "e-table-one.h"
-
-#define PARENT_TYPE e_table_model_get_type ()
-
-static int
-one_column_count (ETableModel *etm)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_column_count(one->source);
- else
- return 0;
-}
-
-static int
-one_row_count (ETableModel *etm)
-{
- return 1;
-}
-
-static void *
-one_value_at (ETableModel *etm, int col, int row)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->data)
- return one->data[col];
- else
- return NULL;
-}
-
-static void
-one_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->data && one->source) {
- e_table_model_free_value(one->source, col, one->data[col]);
- one->data[col] = e_table_model_duplicate_value(one->source, col, val);
- }
-}
-
-static gboolean
-one_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_is_cell_editable(one->source, 0, row);
- else
- return FALSE;
-}
-
-/* The default for one_duplicate_value is to return the raw value. */
-static void *
-one_duplicate_value (ETableModel *etm, int col, const void *value)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_duplicate_value(one->source, col, value);
- else
- return (void *)value;
-}
-
-static void
-one_free_value (ETableModel *etm, int col, void *value)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- e_table_model_free_value(one->source, col, value);
-}
-
-static void *
-one_initialize_value (ETableModel *etm, int col)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_initialize_value (one->source, col);
- else
- return NULL;
-}
-
-static gboolean
-one_value_is_empty (ETableModel *etm, int col, const void *value)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_value_is_empty (one->source, col, value);
- else
- return FALSE;
-}
-
-static char *
-one_value_to_string (ETableModel *etm, int col, const void *value)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_value_to_string (one->source, col, value);
- else
- return g_strdup("");
-}
-
-static void
-one_destroy (GtkObject *object)
-{
- ETableOne *one = E_TABLE_ONE(object);
-
- if (one->source) {
- int i;
- int col_count;
-
- col_count = e_table_model_column_count(one->source);
-
- if (one->data) {
- for (i = 0; i < col_count; i++) {
- e_table_model_free_value(one->source, i, one->data[i]);
- }
- }
-
- gtk_object_unref(GTK_OBJECT(one->source));
- }
-
- g_free(one->data);
-}
-
-static void
-e_table_one_class_init (GtkObjectClass *object_class)
-{
- ETableModelClass *model_class = (ETableModelClass *) object_class;
-
- model_class->column_count = one_column_count;
- model_class->row_count = one_row_count;
- model_class->value_at = one_value_at;
- model_class->set_value_at = one_set_value_at;
- model_class->is_cell_editable = one_is_cell_editable;
- model_class->duplicate_value = one_duplicate_value;
- model_class->free_value = one_free_value;
- model_class->initialize_value = one_initialize_value;
- model_class->value_is_empty = one_value_is_empty;
- model_class->value_to_string = one_value_to_string;
-
- object_class->destroy = one_destroy;
-}
-
-static void
-e_table_one_init (GtkObject *object)
-{
- ETableOne *one = E_TABLE_ONE(object);
-
- one->source = NULL;
- one->data = NULL;
-}
-
-GtkType
-e_table_one_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableOne",
- sizeof (ETableOne),
- sizeof (ETableOneClass),
- (GtkClassInitFunc) e_table_one_class_init,
- (GtkObjectInitFunc) e_table_one_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-ETableModel *
-e_table_one_new (ETableModel *source)
-{
- ETableOne *eto;
- int col_count;
- int i;
-
- eto = gtk_type_new (e_table_one_get_type ());
-
- eto->source = source;
-
- col_count = e_table_model_column_count(source);
- eto->data = g_new(void *, col_count);
- for (i = 0; i < col_count; i++) {
- eto->data[i] = e_table_model_initialize_value(source, i);
- }
-
- if (source)
- gtk_object_ref(GTK_OBJECT(source));
-
- return (ETableModel *) eto;
-}
-
-void
-e_table_one_commit (ETableOne *one)
-{
- if (one->source) {
- int empty = TRUE;
- int col;
- int cols = e_table_model_column_count(one->source);
- for (col = 0; col < cols; col++) {
- if (!e_table_model_value_is_empty(one->source, col, one->data[col])) {
- empty = FALSE;
- break;
- }
- }
- if (!empty) {
- e_table_model_append_row(one->source, E_TABLE_MODEL(one), 0);
- }
- }
-}
diff --git a/widgets/e-table/e-table-one.h b/widgets/e-table/e-table-one.h
deleted file mode 100644
index c6958cee3a..0000000000
--- a/widgets/e-table/e-table-one.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_ONE_H_
-#define _E_TABLE_ONE_H_
-
-#include "e-table-model.h"
-
-#define E_TABLE_ONE_TYPE (e_table_one_get_type ())
-#define E_TABLE_ONE(o) (GTK_CHECK_CAST ((o), E_TABLE_ONE_TYPE, ETableOne))
-#define E_TABLE_ONE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_ONE_TYPE, ETableOneClass))
-#define E_IS_TABLE_ONE(o) (GTK_CHECK_TYPE ((o), E_TABLE_ONE_TYPE))
-#define E_IS_TABLE_ONE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_ONE_TYPE))
-
-typedef struct {
- ETableModel parent;
-
- ETableModel *source;
- void **data;
-} ETableOne;
-
-typedef struct {
- ETableModelClass parent_class;
-} ETableOneClass;
-
-GtkType e_table_one_get_type (void);
-
-ETableModel *e_table_one_new (ETableModel *source);
-void e_table_one_commit (ETableOne *one);
-
-#endif /* _E_TABLE_ONE_H_ */
-
diff --git a/widgets/e-table/e-table-scrolled.c b/widgets/e-table/e-table-scrolled.c
deleted file mode 100644
index f70ca5320a..0000000000
--- a/widgets/e-table/e-table-scrolled.c
+++ /dev/null
@@ -1,341 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-scrolled.c: A graphical view of a Table.
- *
- * Author:
- * Chris Lahey <clahey@helixcode.com>
- * Miguel de Icaza (miguel@helixcode.com)
- *
- * Copyright 2000, 1999, Helix Code, Inc
- */
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdio.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <gtk/gtksignal.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include "e-table.h"
-#include "e-table-scrolled.h"
-
-#define COLUMN_HEADER_HEIGHT 16
-
-#define PARENT_TYPE e_scroll_frame_get_type ()
-
-static GtkObjectClass *parent_class;
-
-enum {
- CURSOR_CHANGE,
- DOUBLE_CLICK,
- RIGHT_CLICK,
- KEY_PRESS,
- LAST_SIGNAL
-};
-
-enum {
- ARG_0,
- ARG_TABLE_DRAW_GRID,
- ARG_TABLE_DRAW_FOCUS,
- ARG_CURSOR_MODE,
- ARG_LENGTH_THRESHOLD,
- ARG_CLICK_TO_ADD_MESSAGE,
-};
-
-static gint ets_signals [LAST_SIGNAL] = { 0, };
-
-static void
-cursor_change_proxy (ETable *et, int row, ETableScrolled *ets)
-{
- gtk_signal_emit (GTK_OBJECT (ets),
- ets_signals [CURSOR_CHANGE],
- row);
-}
-
-static void
-double_click_proxy (ETable *et, int row, ETableScrolled *ets)
-{
- gtk_signal_emit (GTK_OBJECT (ets),
- ets_signals [DOUBLE_CLICK],
- row);
-}
-
-static gint
-right_click_proxy (ETable *et, int row, int col, GdkEvent *event, ETableScrolled *ets)
-{
- int return_val = 0;
- gtk_signal_emit (GTK_OBJECT (ets),
- ets_signals [RIGHT_CLICK],
- row, col, event, &return_val);
- return return_val;
-}
-
-static gint
-key_press_proxy (ETable *et, int row, int col, GdkEvent *event, ETableScrolled *ets)
-{
- int return_val;
- gtk_signal_emit (GTK_OBJECT (ets),
- ets_signals [KEY_PRESS],
- row, col, event, &return_val);
- return return_val;
-}
-
-static void
-e_table_scrolled_init (GtkObject *object)
-{
- ETableScrolled *ets;
- EScrollFrame *scroll_frame;
-
- ets = E_TABLE_SCROLLED (object);
- scroll_frame = E_SCROLL_FRAME (object);
-
- ets->table = gtk_type_new(e_table_get_type());
-
- e_scroll_frame_set_policy (scroll_frame, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- e_scroll_frame_set_shadow_type (scroll_frame, GTK_SHADOW_IN);
-}
-
-static void
-e_table_scrolled_real_construct (ETableScrolled *ets)
-{
- gtk_object_set(GTK_OBJECT(ets),
- "shadow_type", GTK_SHADOW_IN,
- "hscrollbar_policy", GTK_POLICY_NEVER,
- "vscrollbar_policy", GTK_POLICY_AUTOMATIC,
- NULL);
-
- gtk_container_add(GTK_CONTAINER(ets), GTK_WIDGET(ets->table));
-
- gtk_signal_connect(GTK_OBJECT(ets->table), "cursor_change",
- GTK_SIGNAL_FUNC(cursor_change_proxy), ets);
- gtk_signal_connect(GTK_OBJECT(ets->table), "double_click",
- GTK_SIGNAL_FUNC(double_click_proxy), ets);
- gtk_signal_connect(GTK_OBJECT(ets->table), "right_click",
- GTK_SIGNAL_FUNC(right_click_proxy), ets);
- gtk_signal_connect(GTK_OBJECT(ets->table), "key_press",
- GTK_SIGNAL_FUNC(key_press_proxy), ets);
-
- gtk_widget_show(GTK_WIDGET(ets->table));
-}
-
-ETableScrolled *
-e_table_scrolled_construct (ETableScrolled *ets, ETableHeader *full_header,
- ETableModel *etm, const char *spec)
-{
- e_table_construct(ets->table, full_header, etm, spec);
-
- e_table_scrolled_real_construct(ets);
-
- return ets;
-}
-
-ETableScrolled *
-e_table_scrolled_construct_from_spec_file (ETableScrolled *ets, ETableHeader *full_header, ETableModel *etm,
- const char *filename)
-{
- e_table_construct_from_spec_file(ets->table, full_header, etm, filename);
-
- e_table_scrolled_real_construct(ets);
-
- return ets;
-}
-
-GtkWidget *
-e_table_scrolled_new (ETableHeader *full_header, ETableModel *etm, const char *spec)
-{
- ETableScrolled *ets;
-
- ets = E_TABLE_SCROLLED (gtk_widget_new (e_table_scrolled_get_type (),
- "hadjustment", NULL,
- "vadjustment", NULL,
- NULL));
-
- ets = e_table_scrolled_construct (ets, full_header, etm, spec);
-
- return GTK_WIDGET (ets);
-}
-
-GtkWidget *
-e_table_scrolled_new_from_spec_file (ETableHeader *full_header, ETableModel *etm, const char *filename)
-{
- ETableScrolled *ets;
-
- ets = gtk_type_new (e_table_scrolled_get_type ());
-
- ets = e_table_scrolled_construct_from_spec_file (ets, full_header, etm, filename);
-
- return GTK_WIDGET (ets);
-}
-
-gchar *
-e_table_scrolled_get_specification (ETableScrolled *ets)
-{
- return e_table_get_specification(ets->table);
-}
-
-void
-e_table_scrolled_save_specification (ETableScrolled *ets, gchar *filename)
-{
- e_table_save_specification(ets->table, filename);
-}
-
-void
-e_table_scrolled_set_cursor_row (ETableScrolled *ets, int row)
-{
- e_table_set_cursor_row(ets->table, row);
-}
-
-int
-e_table_scrolled_get_cursor_row (ETableScrolled *ets)
-{
- return e_table_get_cursor_row(ets->table);
-}
-
-void
-e_table_scrolled_selected_row_foreach (ETableScrolled *ets,
- ETableForeachFunc callback,
- gpointer closure)
-{
- e_table_selected_row_foreach(ets->table,
- callback,
- closure);
-}
-
-EPrintable *
-e_table_scrolled_get_printable (ETableScrolled *ets)
-{
- return e_table_get_printable(ets->table);
-}
-
-static void
-ets_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableScrolled *ets = E_TABLE_SCROLLED (o);
- gboolean bool_val;
- gchar *string_val;
-
- switch (arg_id){
- case ARG_TABLE_DRAW_GRID:
- gtk_object_get(GTK_OBJECT(ets->table),
- "drawgrid", &bool_val,
- NULL);
- GTK_VALUE_BOOL (*arg) = bool_val;
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- gtk_object_get(GTK_OBJECT(ets->table),
- "drawfocus", &bool_val,
- NULL);
- GTK_VALUE_BOOL (*arg) = bool_val;
- break;
-
- case ARG_CLICK_TO_ADD_MESSAGE:
- gtk_object_get(GTK_OBJECT(ets->table),
- "click_to_add_message", &string_val,
- NULL);
- GTK_VALUE_STRING (*arg) = string_val;
- break;
- }
-}
-
-static void
-ets_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableScrolled *ets = E_TABLE_SCROLLED (o);
-
- switch (arg_id){
- case ARG_LENGTH_THRESHOLD:
- gtk_object_set(GTK_OBJECT(ets->table),
- "length_threshold", GTK_VALUE_INT (*arg),
- NULL);
- break;
-
- case ARG_TABLE_DRAW_GRID:
- gtk_object_set(GTK_OBJECT(ets->table),
- "drawgrid", GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- gtk_object_set(GTK_OBJECT(ets->table),
- "drawfocus", GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_CURSOR_MODE:
- gtk_object_set(GTK_OBJECT(ets->table),
- "cursor_mode", GTK_VALUE_INT (*arg),
- NULL);
- break;
- case ARG_CLICK_TO_ADD_MESSAGE:
- gtk_object_set(GTK_OBJECT(ets->table),
- "click_to_add_message", GTK_VALUE_STRING (*arg),
- NULL);
- break;
- }
-}
-
-static void
-e_table_scrolled_class_init (GtkObjectClass *object_class)
-{
- ETableScrolledClass *klass = E_TABLE_SCROLLED_CLASS(object_class);
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->set_arg = ets_set_arg;
- object_class->get_arg = ets_get_arg;
-
- klass->cursor_change = NULL;
- klass->double_click = NULL;
- klass->right_click = NULL;
- klass->key_press = NULL;
-
- ets_signals [CURSOR_CHANGE] =
- gtk_signal_new ("cursor_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableScrolledClass, cursor_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- ets_signals [DOUBLE_CLICK] =
- gtk_signal_new ("double_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableScrolledClass, double_click),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- ets_signals [RIGHT_CLICK] =
- gtk_signal_new ("right_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableScrolledClass, right_click),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- ets_signals [KEY_PRESS] =
- gtk_signal_new ("key_press",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableScrolledClass, key_press),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (object_class, ets_signals, LAST_SIGNAL);
-
- gtk_object_add_arg_type ("ETableScrolled::drawgrid", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_TABLE_DRAW_GRID);
- gtk_object_add_arg_type ("ETableScrolled::drawfocus", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_TABLE_DRAW_FOCUS);
- gtk_object_add_arg_type ("ETableScrolled::cursor_mode", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_CURSOR_MODE);
- gtk_object_add_arg_type ("ETableScrolled::length_threshold", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
- gtk_object_add_arg_type ("ETableScrolled::click_to_add_message", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_CLICK_TO_ADD_MESSAGE);
-}
-
-E_MAKE_TYPE(e_table_scrolled, "ETableScrolled", ETableScrolled, e_table_scrolled_class_init, e_table_scrolled_init, PARENT_TYPE);
-
diff --git a/widgets/e-table/e-table-scrolled.h b/widgets/e-table/e-table-scrolled.h
deleted file mode 100644
index d5a0c06a58..0000000000
--- a/widgets/e-table/e-table-scrolled.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SCROLLED_H_
-#define _E_TABLE_SCROLLED_H_
-
-#include "widgets/misc/e-scroll-frame.h"
-#include "e-table-model.h"
-#include "e-table-header.h"
-#include "e-table.h"
-#include "e-util/e-printable.h"
-
-BEGIN_GNOME_DECLS
-
-#define E_TABLE_SCROLLED_TYPE (e_table_scrolled_get_type ())
-#define E_TABLE_SCROLLED(o) (GTK_CHECK_CAST ((o), E_TABLE_SCROLLED_TYPE, ETableScrolled))
-#define E_TABLE_SCROLLED_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SCROLLED_TYPE, ETableScrolledClass))
-#define E_IS_SCROLLED_TABLE(o) (GTK_CHECK_TYPE ((o), E_TABLE_SCROLLED_TYPE))
-#define E_IS_SCROLLED_TABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SCROLLED_TYPE))
-
-typedef struct {
- EScrollFrame parent;
-
- ETable *table;
-} ETableScrolled;
-
-typedef struct {
- EScrollFrameClass parent_class;
-
- void (*cursor_change) (ETableScrolled *est, int row);
- void (*double_click) (ETableScrolled *est, int row);
- gint (*right_click) (ETableScrolled *est, int row, int col, GdkEvent *event);
- gint (*key_press) (ETableScrolled *est, int row, int col, GdkEvent *event);
-} ETableScrolledClass;
-
-GtkType e_table_scrolled_get_type (void);
-
-ETableScrolled *e_table_scrolled_construct (ETableScrolled *ets, ETableHeader *full_header, ETableModel *etm,
- const char *spec);
-GtkWidget *e_table_scrolled_new (ETableHeader *full_header, ETableModel *etm,
- const char *spec);
-
-ETableScrolled *e_table_scrolled_construct_from_spec_file (ETableScrolled *e_table_scrolled,
- ETableHeader *full_header,
- ETableModel *etm,
- const char *filename);
-GtkWidget *e_table_scrolled_new_from_spec_file (ETableHeader *full_header,
- ETableModel *etm,
- const char *filename);
-
-gchar *e_table_scrolled_get_specification (ETableScrolled *e_table_scrolled);
-void e_table_scrolled_save_specification (ETableScrolled *e_table_scrolled, gchar *filename);
-
-void e_table_scrolled_set_cursor_row (ETableScrolled *e_table_scrolled,
- int row);
-/* -1 means we don't have the cursor. */
-int e_table_scrolled_get_cursor_row (ETableScrolled *e_table_scrolled);
-void e_table_scrolled_selected_row_foreach (ETableScrolled *e_table_scrolled,
- ETableForeachFunc callback,
- gpointer closure);
-EPrintable *e_table_scrolled_get_printable (ETableScrolled *e_table_scrolled);
-
-END_GNOME_DECLS
-
-#endif /* _E_TABLE_SCROLLED_H_ */
-
diff --git a/widgets/e-table/e-table-selection-model.c b/widgets/e-table/e-table-selection-model.c
deleted file mode 100644
index 9079ce8623..0000000000
--- a/widgets/e-table/e-table-selection-model.c
+++ /dev/null
@@ -1,500 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-selection-model.c: a Table Selection Model
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-selection-model.h"
-#include "e-util/e-util.h"
-
-#define ETSM_CLASS(e) ((ETableSelectionModelClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE gtk_object_get_type ()
-
-#define ONES ((guint32) 0xffffffff)
-
-#define BOX(n) ((n) / 32)
-#define OFFSET(n) (31 - ((n) % 32))
-#define BITMASK(n) ((guint32)(((guint32) 0x1) << OFFSET(n)))
-#define BITMASK_LEFT(n) ((guint32)(((guint32) ONES) << (32 - ((n) % 32))))
-#define BITMASK_RIGHT(n) ((guint32)(((guint32) ONES) >> ((n) % 32)))
-
-static GtkObjectClass *e_table_selection_model_parent_class;
-
-enum {
- CURSOR_CHANGED,
- SELECTION_CHANGED,
- LAST_SIGNAL
-};
-
-static guint e_table_selection_model_signals [LAST_SIGNAL] = { 0, };
-
-enum {
- ARG_0,
- ARG_MODEL,
- ARG_SORTER,
- ARG_CURSOR_ROW,
- ARG_CURSOR_COL,
-};
-
-static void
-model_changed(ETableModel *etm, ETableSelectionModel *etsm)
-{
- e_table_selection_model_clear(etsm);
-}
-
-#if 0
-static void
-model_row_inserted(ETableModel *etm, int row, ETableSelectionModel *etsm)
-{
- int box;
- int i;
- if(etsm->row_count >= 0) {
- /* Add another word if needed. */
- if ((etsm->row_count & 0x1f) == 0) {
- etsm->selection = g_renew(etsm->selection, gint, (etsm->row_count >> 5) + 1);
- etsm->selection[etsm->row_count >> 5] = 0;
- }
-
- /* The box is the word that our row is in. */
- box = BOX(row);
- /* Shift all words to the right of our box right one bit. */
- for (i = etsm->row_count >> 5; i > box; i--) {
- etsm->selection[i] = (etsm->selection[i] >> 1) | (etsm->selection[i - 1] << 31);
- }
-
- /* Shift right half of box one bit to the right. */
- etsm->selection[box] = (etsm->selection[box] & BITMASK_LEFT(row)) | ((etsm->selection[box] & BITMASK_RIGHT(row)) >> 1);
- etsm->row_count ++;
- }
-}
-
-static void
-model_row_deleted(ETableModel *etm, int row, ETableSelectionModel *etsm)
-{
- int box;
- int i;
- int last;
- if(etsm->row_count >= 0) {
- guint32 bitmask;
- box = row >> 5;
- last = etsm->row_count >> 5;
-
- /* Build bitmasks for the left and right half of the box */
- bitmask = BITMASK_RIGHT(row) >> 1;
- /* Shift right half of box one bit to the left. */
- etsm->selection[box] = (etsm->selection[box] & BITMASK_LEFT(row))| ((etsm->selection[box] & bitmask) << 1);
-
- /* Shift all words to the right of our box left one bit. */
- if (box < last) {
- etsm->selection[box] &= etsm->selection[box + 1] >> 31;
-
- for (i = box + 1; i < last; i++) {
- etsm->selection[i] = (etsm->selection[i] << 1) | (etsm->selection[i + 1] >> 31);
- }
- etsm->selection[i] = etsm->selection[i] << 1;
- }
- etsm->row_count --;
- /* Remove the last word if not needed. */
- if ((etsm->row_count & 0x1f) == 0) {
- etsm->selection = g_renew(etsm->selection, gint, etsm->row_count >> 5);
- }
- }
-}
-
-#else
-
-static void
-model_row_inserted(ETableModel *etm, int row, ETableSelectionModel *etsm)
-{
- model_changed(etm, etsm);
-}
-
-static void
-model_row_deleted(ETableModel *etm, int row, ETableSelectionModel *etsm)
-{
- model_changed(etm, etsm);
-}
-#endif
-
-inline static void
-add_model(ETableSelectionModel *etsm, ETableModel *model)
-{
- etsm->model = model;
- if (model) {
- gtk_object_ref(GTK_OBJECT(model));
- etsm->model_changed_id = gtk_signal_connect(GTK_OBJECT(model), "model_changed",
- GTK_SIGNAL_FUNC(model_changed), etsm);
- etsm->model_row_inserted_id = gtk_signal_connect(GTK_OBJECT(model), "model_row_inserted",
- GTK_SIGNAL_FUNC(model_row_inserted), etsm);
- etsm->model_row_deleted_id = gtk_signal_connect(GTK_OBJECT(model), "model_row_deleted",
- GTK_SIGNAL_FUNC(model_row_deleted), etsm);
- }
-}
-
-inline static void
-drop_model(ETableSelectionModel *etsm)
-{
- if (etsm->model) {
- gtk_signal_disconnect(GTK_OBJECT(etsm->model),
- etsm->model_changed_id);
- gtk_signal_disconnect(GTK_OBJECT(etsm->model),
- etsm->model_row_inserted_id);
- gtk_signal_disconnect(GTK_OBJECT(etsm->model),
- etsm->model_row_deleted_id);
- gtk_object_unref(GTK_OBJECT(etsm->model));
- }
- etsm->model = NULL;
-}
-
-inline static void
-add_sorter(ETableSelectionModel *etsm, ETableSorter *sorter)
-{
- etsm->sorter = sorter;
- if (sorter) {
- gtk_object_ref(GTK_OBJECT(sorter));
- }
-}
-
-inline static void
-drop_sorter(ETableSelectionModel *etsm)
-{
- if (etsm->sorter) {
- gtk_object_unref(GTK_OBJECT(etsm->sorter));
- }
- etsm->sorter = NULL;
-}
-
-static void
-etsm_destroy (GtkObject *object)
-{
- ETableSelectionModel *etsm;
-
- etsm = E_TABLE_SELECTION_MODEL (object);
-
- drop_model(etsm);
- drop_sorter(etsm);
-
- g_free(etsm->selection);
-}
-
-static void
-etsm_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableSelectionModel *etsm = E_TABLE_SELECTION_MODEL (o);
-
- switch (arg_id){
- case ARG_MODEL:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etsm->model);
- break;
-
- case ARG_SORTER:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etsm->sorter);
- break;
-
- case ARG_CURSOR_ROW:
- GTK_VALUE_INT(*arg) = etsm->cursor_row;
- break;
-
- case ARG_CURSOR_COL:
- GTK_VALUE_INT(*arg) = etsm->cursor_col;
- break;
- }
-}
-
-static void
-etsm_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableSelectionModel *etsm = E_TABLE_SELECTION_MODEL (o);
-
- switch (arg_id){
- case ARG_MODEL:
- drop_model(etsm);
- add_model(etsm, GTK_VALUE_OBJECT (*arg) ? E_TABLE_MODEL(GTK_VALUE_OBJECT (*arg)) : NULL);
- break;
-
- case ARG_SORTER:
- drop_sorter(etsm);
- add_sorter(etsm, GTK_VALUE_OBJECT (*arg) ? E_TABLE_SORTER(GTK_VALUE_OBJECT (*arg)) : NULL);
- break;
-
- case ARG_CURSOR_ROW:
- e_table_selection_model_do_something(etsm, GTK_VALUE_INT(*arg), etsm->cursor_col, 0);
- break;
-
- case ARG_CURSOR_COL:
- e_table_selection_model_do_something(etsm, etsm->cursor_row, GTK_VALUE_INT(*arg), 0);
- break;
- }
-}
-
-static void
-e_table_selection_model_init (ETableSelectionModel *selection)
-{
- selection->selection = NULL;
- selection->row_count = -1;
- selection->model = NULL;
-}
-
-static void
-e_table_selection_model_class_init (ETableSelectionModelClass *klass)
-{
- GtkObjectClass *object_class;
-
- e_table_selection_model_parent_class = gtk_type_class (gtk_object_get_type ());
-
- object_class = GTK_OBJECT_CLASS(klass);
-
- object_class->destroy = etsm_destroy;
- object_class->get_arg = etsm_get_arg;
- object_class->set_arg = etsm_set_arg;
-
- e_table_selection_model_signals [CURSOR_CHANGED] =
- gtk_signal_new ("cursor_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableSelectionModelClass, cursor_changed),
- gtk_marshal_NONE__INT_INT,
- GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT);
-
- e_table_selection_model_signals [SELECTION_CHANGED] =
- gtk_signal_new ("selection_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableSelectionModelClass, selection_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- klass->cursor_changed = NULL;
- klass->selection_changed = NULL;
-
- gtk_object_class_add_signals (object_class, e_table_selection_model_signals, LAST_SIGNAL);
-
- gtk_object_add_arg_type ("ETableSelectionModel::model", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_MODEL);
- gtk_object_add_arg_type ("ETableSelectionModel::sorter", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_SORTER);
- gtk_object_add_arg_type ("ETableSelectionModel::cursor_row", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_CURSOR_ROW);
- gtk_object_add_arg_type ("ETableSelectionModel::cursor_col", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_CURSOR_COL);
-}
-
-E_MAKE_TYPE(e_table_selection_model, "ETableSelectionModel", ETableSelectionModel,
- e_table_selection_model_class_init, e_table_selection_model_init, PARENT_TYPE);
-
-ETableSelectionModel *
-e_table_selection_model_new (void)
-{
- return gtk_type_new (e_table_selection_model_get_type ());
-}
-
-gboolean
-e_table_selection_model_is_row_selected (ETableSelectionModel *selection,
- gint n)
-{
- if (selection->row_count < n)
- return 0;
- else
- return (selection->selection[BOX(n)] >> OFFSET(n)) & 0x1;
-}
-
-void
-e_table_selection_model_foreach (ETableSelectionModel *selection,
- ETableForeachFunc callback,
- gpointer closure)
-{
- int i;
- int last = (selection->row_count + 31) / 32;
- for (i = 0; i < last; i++) {
- if (selection->selection[i]) {
- int j;
- guint32 value = selection->selection[i];
- for (j = 0; j < 32; j++) {
- if (value & 0x80000000) {
- callback(i * 32 + j, closure);
- }
- value <<= 1;
- }
- }
- }
-}
-
-#define OPERATE(object, mask, grow) ((grow) ? ((object) |= (~(mask))) : ((object) &= (mask)))
-
-static void
-change_one_row(ETableSelectionModel *selection, int row, gboolean grow)
-{
- int i;
- i = BOX(row);
-
- OPERATE(selection->selection[i], BITMASK_LEFT(row) | BITMASK_RIGHT(row + 1), grow);
-}
-
-static void
-change_selection(ETableSelectionModel *selection, int start, int end, gboolean grow)
-{
- int i, last;
- if (start != end) {
- if (selection->sorter && e_table_sorter_needs_sorting(selection->sorter)) {
- for ( i = start; i < end; i++) {
- change_one_row(selection, e_table_sorter_sorted_to_model(selection->sorter, i), grow);
- }
- } else {
- i = BOX(start);
- last = BOX(end);
-
- if (i == last) {
- OPERATE(selection->selection[i], BITMASK_LEFT(start) | BITMASK_RIGHT(end), grow);
- } else {
- OPERATE(selection->selection[i], BITMASK_LEFT(start), grow);
- if (grow)
- for (i ++; i < last; i++)
- selection->selection[i] = ONES;
- else
- for (i ++; i < last; i++)
- selection->selection[i] = 0;
- OPERATE(selection->selection[i], BITMASK_RIGHT(end), grow);
- }
- }
- }
-}
-
-void e_table_selection_model_do_something (ETableSelectionModel *selection,
- guint row,
- guint col,
- GdkModifierType state)
-{
- gint shift_p = state & GDK_SHIFT_MASK;
- gint ctrl_p = state & GDK_CONTROL_MASK;
- if (selection->row_count < 0) {
- if (selection->model) {
- selection->row_count = e_table_model_row_count(selection->model);
- g_free(selection->selection);
- selection->selection = g_new0(gint, (selection->row_count + 31) / 32);
- }
- }
- if (selection->row_count >= 0 && row < selection->row_count) {
- if (shift_p) {
- int old_start;
- int old_end;
- int new_start;
- int new_end;
- if (selection->sorter && e_table_sorter_needs_sorting(selection->sorter)) {
- old_start = MIN (e_table_sorter_model_to_sorted(selection->sorter, selection->selection_start_row),
- e_table_sorter_model_to_sorted(selection->sorter, selection->cursor_row));
- old_end = MAX (e_table_sorter_model_to_sorted(selection->sorter, selection->selection_start_row),
- e_table_sorter_model_to_sorted(selection->sorter, selection->cursor_row)) + 1;
- new_start = MIN (e_table_sorter_model_to_sorted(selection->sorter, selection->selection_start_row),
- e_table_sorter_model_to_sorted(selection->sorter, row));
- new_end = MAX (e_table_sorter_model_to_sorted(selection->sorter, selection->selection_start_row),
- e_table_sorter_model_to_sorted(selection->sorter, row)) + 1;
- } else {
- old_start = MIN (selection->selection_start_row, selection->cursor_row);
- old_end = MAX (selection->selection_start_row, selection->cursor_row) + 1;
- new_start = MIN (selection->selection_start_row, row);
- new_end = MAX (selection->selection_start_row, row) + 1;
- }
- /* This wouldn't work nearly so smoothly if one end of the selection held in place. */
- if (old_start < new_start)
- change_selection(selection, old_start, new_start, FALSE);
- if (new_start < old_start)
- change_selection(selection, new_start, old_start, TRUE);
- if (old_end < new_end)
- change_selection(selection, old_end, new_end, TRUE);
- if (new_end < old_end)
- change_selection(selection, new_end, old_end, FALSE);
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals [SELECTION_CHANGED]);
- } else {
- if (ctrl_p) {
- if (selection->selection[BOX(row)] & BITMASK(row))
- selection->selection[BOX(row)] &= ~BITMASK(row);
- else
- selection->selection[BOX(row)] |= BITMASK(row);
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals [SELECTION_CHANGED]);
- } else {
- int i;
- for (i = 0; i < ((selection->row_count + 31) / 32); i++) {
- if (!((i == BOX(row) && selection->selection[i] == BITMASK(row)) ||
- (i != BOX(row) && selection->selection[i] == 0))) {
- g_free(selection->selection);
- selection->selection = g_new0(gint, (selection->row_count + 31) / 32);
- selection->selection[BOX(row)] = BITMASK(row);
-
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals [SELECTION_CHANGED]);
- break;
- }
- }
- }
- selection->selection_start_row = row;
- }
- if (selection->cursor_row != row ||
- selection->cursor_col != col) {
- selection->cursor_row = row;
- selection->cursor_col = col;
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals[CURSOR_CHANGED], row, col);
- }
- }
-}
-
-void e_table_selection_model_maybe_do_something (ETableSelectionModel *selection,
- guint row,
- guint col,
- GdkModifierType state)
-{
- if (e_table_selection_model_is_row_selected(selection, row)) {
- selection->cursor_row = row;
- selection->cursor_col = col;
- } else {
- e_table_selection_model_do_something(selection, row, col, state);
- }
-}
-
-void
-e_table_selection_model_clear(ETableSelectionModel *selection)
-{
- g_free(selection->selection);
- selection->selection = NULL;
- selection->row_count = -1;
- selection->cursor_row = -1;
- selection->cursor_col = -1;
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals [CURSOR_CHANGED], -1, -1);
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals [SELECTION_CHANGED]);
-}
-
-#define PART(x,n) (((x) & (0x01010101 << n)) >> n)
-#define SECTION(x, n) (((x) >> (n * 8)) & 0xff)
-
-gint
-e_table_selection_model_selected_count (ETableSelectionModel *selection)
-{
- gint count;
- int i;
- int last;
-
- count = 0;
-
- last = BOX(selection->row_count - 1);
-
- for (i = 0; i <= last; i++) {
- int j;
- guint32 thiscount = 0;
- for (j = 0; j < 8; j++)
- thiscount += PART(selection->selection[i], j);
- for (j = 0; j < 4; j++)
- count += SECTION(thiscount, j);
- }
-
- return count;
-}
diff --git a/widgets/e-table/e-table-selection-model.h b/widgets/e-table/e-table-selection-model.h
deleted file mode 100644
index 6d7b25ed3d..0000000000
--- a/widgets/e-table/e-table-selection-model.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SELECTION_MODEL_H_
-#define _E_TABLE_SELECTION_MODEL_H_
-
-#include <gtk/gtkobject.h>
-#include "widgets/e-table/e-table-model.h"
-#include "widgets/e-table/e-table-defines.h"
-#include "widgets/e-table/e-table-sorter.h"
-
-#define E_TABLE_SELECTION_MODEL_TYPE (e_table_selection_model_get_type ())
-#define E_TABLE_SELECTION_MODEL(o) (GTK_CHECK_CAST ((o), E_TABLE_SELECTION_MODEL_TYPE, ETableSelectionModel))
-#define E_TABLE_SELECTION_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SELECTION_MODEL_TYPE, ETableSelectionModelClass))
-#define E_IS_TABLE_SELECTION_MODEL(o) (GTK_CHECK_TYPE ((o), E_TABLE_SELECTION_MODEL_TYPE))
-#define E_IS_TABLE_SELECTION_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SELECTION_MODEL_TYPE))
-
-typedef struct {
- GtkObject base;
-
- ETableModel *model;
- ETableSorter *sorter;
-
- gint row_count;
- guint32 *selection;
-
- gint cursor_row;
- gint cursor_col;
- gint selection_start_row;
-
- guint model_changed_id;
- guint model_row_inserted_id, model_row_deleted_id;
-
- guint frozen : 1;
- guint selection_model_changed : 1;
- guint group_info_changed : 1;
-} ETableSelectionModel;
-
-typedef struct {
- GtkObjectClass parent_class;
-
- /*
- * Signals
- */
-
- void (*cursor_changed) (ETableSelectionModel *selection, int row, int col);
- void (*selection_changed) (ETableSelectionModel *selection);
-
-} ETableSelectionModelClass;
-
-GtkType e_table_selection_model_get_type (void);
-
-gboolean e_table_selection_model_is_row_selected (ETableSelectionModel *selection,
- gint n);
-void e_table_selection_model_foreach (ETableSelectionModel *selection,
- ETableForeachFunc callback,
- gpointer closure);
-
-void e_table_selection_model_do_something (ETableSelectionModel *selection,
- guint row,
- guint col,
- GdkModifierType state);
-void e_table_selection_model_maybe_do_something (ETableSelectionModel *selection,
- guint row,
- guint col,
- GdkModifierType state);
-void e_table_selection_model_clear (ETableSelectionModel *selection);
-gint e_table_selection_model_selected_count (ETableSelectionModel *selection);
-
-ETableSelectionModel *e_table_selection_model_new (void);
-
-#endif /* _E_TABLE_SELECTION_MODEL_H_ */
diff --git a/widgets/e-table/e-table-simple.c b/widgets/e-table/e-table-simple.c
deleted file mode 100644
index 8c8ed87b70..0000000000
--- a/widgets/e-table/e-table-simple.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-model.c: a simple table model implementation that uses function
- * pointers to simplify the creation of new, exotic and colorful tables in
- * no time.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-
-#include <config.h>
-#include "e-table-simple.h"
-
-enum {
- ARG_0,
- ARG_APPEND_ROW,
-};
-
-#define PARENT_TYPE e_table_model_get_type ()
-
-static int
-simple_column_count (ETableModel *etm)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->col_count)
- return simple->col_count (etm, simple->data);
- else
- return 0;
-}
-
-static int
-simple_row_count (ETableModel *etm)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->row_count)
- return simple->row_count (etm, simple->data);
- else
- return 0;
-}
-
-static void *
-simple_value_at (ETableModel *etm, int col, int row)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->value_at)
- return simple->value_at (etm, col, row, simple->data);
- else
- return NULL;
-}
-
-static void
-simple_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->set_value_at)
- simple->set_value_at (etm, col, row, val, simple->data);
-}
-
-static gboolean
-simple_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->is_cell_editable)
- return simple->is_cell_editable (etm, col, row, simple->data);
- else
- return FALSE;
-}
-
-/* The default for simple_duplicate_value is to return the raw value. */
-static void *
-simple_duplicate_value (ETableModel *etm, int col, const void *value)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->duplicate_value)
- return simple->duplicate_value (etm, col, value, simple->data);
- else
- return (void *)value;
-}
-
-static void
-simple_free_value (ETableModel *etm, int col, void *value)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->free_value)
- simple->free_value (etm, col, value, simple->data);
-}
-
-static void *
-simple_initialize_value (ETableModel *etm, int col)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->initialize_value)
- return simple->initialize_value (etm, col, simple->data);
- else
- return NULL;
-}
-
-static gboolean
-simple_value_is_empty (ETableModel *etm, int col, const void *value)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->value_is_empty)
- return simple->value_is_empty (etm, col, value, simple->data);
- else
- return FALSE;
-}
-
-static char *
-simple_value_to_string (ETableModel *etm, int col, const void *value)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->value_to_string)
- return simple->value_to_string (etm, col, value, simple->data);
- else
- return g_strdup ("");
-}
-
-static void
-simple_append_row (ETableModel *etm, ETableModel *source, int row)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->append_row)
- simple->append_row (etm, source, row, simple->data);
-}
-
-static void
-simple_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableSimple *simple = E_TABLE_SIMPLE (o);
-
- switch (arg_id){
- case ARG_APPEND_ROW:
- GTK_VALUE_POINTER(*arg) = simple->append_row;
- break;
- }
-}
-
-static void
-simple_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableSimple *simple = E_TABLE_SIMPLE (o);
-
- switch (arg_id){
- case ARG_APPEND_ROW:
- simple->append_row = GTK_VALUE_POINTER(*arg);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- }
-}
-
-static void
-e_table_simple_class_init (GtkObjectClass *object_class)
-{
- ETableModelClass *model_class = (ETableModelClass *) object_class;
-
- object_class->set_arg = simple_set_arg;
- object_class->get_arg = simple_get_arg;
-
- model_class->column_count = simple_column_count;
- model_class->row_count = simple_row_count;
- model_class->value_at = simple_value_at;
- model_class->set_value_at = simple_set_value_at;
- model_class->is_cell_editable = simple_is_cell_editable;
- model_class->duplicate_value = simple_duplicate_value;
- model_class->free_value = simple_free_value;
- model_class->initialize_value = simple_initialize_value;
- model_class->value_is_empty = simple_value_is_empty;
- model_class->value_to_string = simple_value_to_string;
- model_class->append_row = simple_append_row;
-
- gtk_object_add_arg_type ("ETableSimple::append_row", GTK_TYPE_POINTER,
- GTK_ARG_READWRITE, ARG_APPEND_ROW);
-}
-
-GtkType
-e_table_simple_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableSimple",
- sizeof (ETableSimple),
- sizeof (ETableSimpleClass),
- (GtkClassInitFunc) e_table_simple_class_init,
- (GtkObjectInitFunc) NULL,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-ETableModel *
-e_table_simple_new (ETableSimpleColumnCountFn col_count,
- ETableSimpleRowCountFn row_count,
- ETableSimpleValueAtFn value_at,
- ETableSimpleSetValueAtFn set_value_at,
- ETableSimpleIsCellEditableFn is_cell_editable,
- ETableSimpleDuplicateValueFn duplicate_value,
- ETableSimpleFreeValueFn free_value,
- ETableSimpleInitializeValueFn initialize_value,
- ETableSimpleValueIsEmptyFn value_is_empty,
- ETableSimpleValueToStringFn value_to_string,
- void *data)
-{
- ETableSimple *et;
-
- et = gtk_type_new (e_table_simple_get_type ());
-
- et->col_count = col_count;
- et->row_count = row_count;
- et->value_at = value_at;
- et->set_value_at = set_value_at;
- et->is_cell_editable = is_cell_editable;
- et->duplicate_value = duplicate_value;
- et->free_value = free_value;
- et->initialize_value = initialize_value;
- et->value_is_empty = value_is_empty;
- et->value_to_string = value_to_string;
- et->data = data;
-
- return (ETableModel *) et;
-}
diff --git a/widgets/e-table/e-table-simple.h b/widgets/e-table/e-table-simple.h
deleted file mode 100644
index 34e76eed79..0000000000
--- a/widgets/e-table/e-table-simple.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SIMPLE_H_
-#define _E_TABLE_SIMPLE_H_
-
-#include "e-table-model.h"
-
-#define E_TABLE_SIMPLE_TYPE (e_table_simple_get_type ())
-#define E_TABLE_SIMPLE(o) (GTK_CHECK_CAST ((o), E_TABLE_SIMPLE_TYPE, ETableSimple))
-#define E_TABLE_SIMPLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SIMPLE_TYPE, ETableSimpleClass))
-#define E_IS_TABLE_SIMPLE(o) (GTK_CHECK_TYPE ((o), E_TABLE_SIMPLE_TYPE))
-#define E_IS_TABLE_SIMPLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SIMPLE_TYPE))
-
-typedef int (*ETableSimpleColumnCountFn) (ETableModel *etm, void *data);
-typedef int (*ETableSimpleRowCountFn) (ETableModel *etm, void *data);
-typedef void *(*ETableSimpleValueAtFn) (ETableModel *etm, int col, int row, void *data);
-typedef void (*ETableSimpleSetValueAtFn) (ETableModel *etm, int col, int row, const void *val, void *data);
-typedef gboolean (*ETableSimpleIsCellEditableFn) (ETableModel *etm, int col, int row, void *data);
-typedef void (*ETableSimpleAppendRowFn) (ETableModel *etm, ETableModel *model, int row, void *data);
-typedef void *(*ETableSimpleDuplicateValueFn) (ETableModel *etm, int col, const void *val, void *data);
-typedef void (*ETableSimpleFreeValueFn) (ETableModel *etm, int col, void *val, void *data);
-typedef void *(*ETableSimpleInitializeValueFn) (ETableModel *etm, int col, void *data);
-typedef gboolean (*ETableSimpleValueIsEmptyFn) (ETableModel *etm, int col, const void *val, void *data);
-typedef char *(*ETableSimpleValueToStringFn) (ETableModel *etm, int col, const void *val, void *data);
-
-typedef struct {
- ETableModel parent;
-
- ETableSimpleColumnCountFn col_count;
- ETableSimpleRowCountFn row_count;
- ETableSimpleValueAtFn value_at;
- ETableSimpleSetValueAtFn set_value_at;
- ETableSimpleIsCellEditableFn is_cell_editable;
- ETableSimpleDuplicateValueFn duplicate_value;
- ETableSimpleFreeValueFn free_value;
- ETableSimpleInitializeValueFn initialize_value;
- ETableSimpleValueIsEmptyFn value_is_empty;
- ETableSimpleValueToStringFn value_to_string;
- ETableSimpleAppendRowFn append_row;
- void *data;
-} ETableSimple;
-
-typedef struct {
- ETableModelClass parent_class;
-} ETableSimpleClass;
-
-GtkType e_table_simple_get_type (void);
-
-ETableModel *e_table_simple_new (ETableSimpleColumnCountFn col_count,
- ETableSimpleRowCountFn row_count,
- ETableSimpleValueAtFn value_at,
- ETableSimpleSetValueAtFn set_value_at,
- ETableSimpleIsCellEditableFn is_cell_editable,
- ETableSimpleDuplicateValueFn duplicate_value,
- ETableSimpleFreeValueFn free_value,
- ETableSimpleInitializeValueFn initialize_value,
- ETableSimpleValueIsEmptyFn value_is_empty,
- ETableSimpleValueToStringFn value_to_string,
- void *data);
-
-#endif /* _E_TABLE_SIMPLE_H_ */
-
diff --git a/widgets/e-table/e-table-size-test.c b/widgets/e-table/e-table-size-test.c
deleted file mode 100644
index 2bc18235e8..0000000000
--- a/widgets/e-table/e-table-size-test.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* This code is GPL. */
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "table-test.h"
-
-/*
- * One way in which we make it simpler to build an ETableModel is through
- * the ETableSimple class. Instead of creating your own ETableModel
- * class, you simply create a new object of the ETableSimple class. You
- * give it a bunch of functions that act as callbacks.
- *
- * You also get to pass a void * to ETableSimple and it gets passed to
- * your callbacks. This would be for having multiple models of the same
- * type. This is just an example though, so we statically define all the
- * data and ignore the void *data parameter.
- *
- * In our example we will be creating a table model with 6 columns and 10
- * rows. This corresponds to having 6 different types of information and
- * 10 different sets of data in our database.
- *
- * The headers will be hard coded, as will be the example data.
- *
- */
-
-/*
- * There are two different meanings to the word "column". The first is
- * the model column. A model column corresponds to a specific type of
- * data. This is very much like the usage in a database table where a
- * column is a field in the database.
- *
- * The second type of column is a view column. A view column
- * corresponds to a visually displayed column. Each view column
- * corresponds to a specific model column, though a model column may
- * have any number of view columns associated with it, from zero to
- * greater than one.
- *
- * Also, a view column doesn't necessarily depend on only one model
- * column. In some cases, the view column renderer can be given a
- * reference to another column to get extra information about its
- * display.
-*/
-
-#define ROWS 5000
-#define COLS 4
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/*
- * Here we define the initial layout of the table. This is an xml
- * format that allows you to change the initial ordering of the
- * columns or to do sorting or grouping initially. This specification
- * shows all 5 columns, but moves the importance column nearer to the
- * front. It also sorts by the "Full Name" column (ascending.)
- * Sorting and grouping take the model column as their arguments
- * (sorting is specified by the "column" argument to the leaf elemnt.
- */
-
-#define INITIAL_SPEC "<ETableSpecification> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 4 </column> \
- <column> 1 </column> \
- <column> 2 </column> \
- <column> 3 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-char *headers [COLS] = {
- "Email",
- "Full Name",
- "Address",
- "Phone"
-};
-
-/*
- * Virtual Column list:
- * 0 Email
- * 1 Full Name
- * 2 Address
- * 3 Phone
- */
-
-/*
- * ETableSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/*
- * Since our model is a constant size, we can just return its size in
- * the column and row count fields.
- */
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-my_col_count (ETableModel *etc, void *data)
-{
- return COLS;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-my_row_count (ETableModel *etc, void *data)
-{
- return ROWS;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-my_value_at (ETableModel *etc, int col, int row, void *data)
-{
- static guchar t[] = {'A', 0xc3, 0x84, 0xc3, 0x95, 0xc3, 0x94, 0xc3, 0xb5, 0x00};
-
-#if 0
- if (col == 1) return "toshok@helixcode.com";
-#else
- if (col == 1) return t;
-#endif
- else if (col == 2) return "Chris Toshok";
- else if (col == 3) return "43 Vicksburg, SF";
- else if (col == 4) return "415-867-5309";
- else return NULL;
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-my_set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-my_is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- return FALSE;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-my_duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup (value);
-}
-
-/* This function frees the value passed to it. */
-static void
-my_free_value (ETableModel *etc, int col, void *value, void *data)
-{
- g_free (value);
-}
-
-/* This function creates an empty value. */
-static void *
-my_initialize_value (ETableModel *etc, int col, void *data)
-{
- return g_strdup ("");
-}
-
-/* This function reports if a value is empty. */
-static gboolean
-my_value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- return !(value && *(char *)value);
-}
-
-/* This function reports if a value is empty. */
-static char *
-my_value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup(value);
-}
-
-/* We create a window containing our new table. */
-static void
-create_table (void)
-{
- GtkWidget *e_table, *window, *frame;
- ECell *cell_left_just;
- ETableHeader *e_table_header;
- ETableModel *e_table_model = NULL;
- int i;
-
- /* Next we create our model. This uses the functions we defined
- earlier. */
- e_table_model = e_table_simple_new (
- my_col_count, my_row_count, my_value_at,
- my_set_value_at, my_is_cell_editable,
- my_duplicate_value, my_free_value,
- my_initialize_value, my_value_is_empty,
- my_value_to_string,
- NULL);
- /*
- * Next we create a header. The ETableHeader is used in two
- * different way. The first is the full_header. This is the
- * list of possible columns in the view. The second use is
- * completely internal. Many of the ETableHeader functions are
- * for that purpose. The only functions we really need are
- * e_table_header_new and e_table_header_add_col.
- *
- * First we create the header.
- */
- e_table_header = e_table_header_new ();
-
- /*
- * Next we have to build renderers for all of the columns.
- * Since all our columns are text columns, we can simply use
- * the same renderer over and over again. If we had different
- * types of columns, we could use a different renderer for
- * each column.
- */
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- /*
- * Next we create a column object for each view column and add
- * them to the header. We don't create a column object for
- * the importance column since it will not be shown.
- */
- for (i = 0; i < COLS; i++) {
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, headers [i],
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /*
- * Here we create a window for our new table. This window
- * will get shown and the person will be able to test their
- * item.
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
- /* This frame is simply to get a bevel around our table. */
- frame = gtk_frame_new (NULL);
-
- /*
- * 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.
- */
- e_table = e_table_new (e_table_header, e_table_model, INITIAL_SPEC);
-
- /* Build the gtk widget hierarchy. */
- gtk_container_add (GTK_CONTAINER (frame), e_table);
- gtk_container_add (GTK_CONTAINER (window), frame);
-
- /* Size the initial window. */
- gtk_widget_set_usize (window, 300, 200);
-
- /* Show it all. */
- gtk_widget_show_all (window);
-}
-
-/* This is the main function which just initializes gnome and call our create_table function */
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- create_table ();
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
-
diff --git a/widgets/e-table/e-table-sort-info.c b/widgets/e-table/e-table-sort-info.c
deleted file mode 100644
index 32ba3d9e65..0000000000
--- a/widgets/e-table/e-table-sort-info.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-sort-info.c: a Table Model
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-sort-info.h"
-#include "e-util/e-util.h"
-
-#define ETM_CLASS(e) ((ETableSortInfoClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE gtk_object_get_type ()
-
-
-static GtkObjectClass *e_table_sort_info_parent_class;
-
-enum {
- SORT_INFO_CHANGED,
- GROUP_INFO_CHANGED,
- LAST_SIGNAL
-};
-
-static guint e_table_sort_info_signals [LAST_SIGNAL] = { 0, };
-
-static void
-etsi_destroy (GtkObject *object)
-{
- ETableSortInfo *etsi;
-
- etsi = E_TABLE_SORT_INFO (object);
-
- if (etsi->groupings)
- g_free(etsi->groupings);
- if (etsi->sortings)
- g_free(etsi->sortings);
-}
-
-static void
-e_table_sort_info_init (ETableSortInfo *info)
-{
- info->group_count = 0;
- info->groupings = NULL;
- info->sort_count = 0;
- info->sortings = NULL;
- info->frozen = 0;
- info->sort_info_changed = 0;
- info->group_info_changed = 0;
-}
-
-static void
-e_table_sort_info_class_init (ETableSortInfoClass *klass)
-{
- GtkObjectClass *object_class;
-
- e_table_sort_info_parent_class = gtk_type_class (gtk_object_get_type ());
-
- object_class = GTK_OBJECT_CLASS(klass);
-
- object_class->destroy = etsi_destroy;
-
- e_table_sort_info_signals [SORT_INFO_CHANGED] =
- gtk_signal_new ("sort_info_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableSortInfoClass, sort_info_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- e_table_sort_info_signals [GROUP_INFO_CHANGED] =
- gtk_signal_new ("group_info_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableSortInfoClass, group_info_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- klass->sort_info_changed = NULL;
- klass->group_info_changed = NULL;
-
- gtk_object_class_add_signals (object_class, e_table_sort_info_signals, LAST_SIGNAL);
-}
-
-E_MAKE_TYPE(e_table_sort_info, "ETableSortInfo", ETableSortInfo,
- e_table_sort_info_class_init, e_table_sort_info_init, PARENT_TYPE);
-
-static void
-e_table_sort_info_sort_info_changed (ETableSortInfo *info)
-{
- g_return_if_fail (info != NULL);
- g_return_if_fail (E_IS_TABLE_SORT_INFO (info));
-
- if (info->frozen) {
- info->sort_info_changed = 1;
- } else {
- gtk_signal_emit (GTK_OBJECT (info),
- e_table_sort_info_signals [SORT_INFO_CHANGED]);
- }
-}
-
-static void
-e_table_sort_info_group_info_changed (ETableSortInfo *info)
-{
- g_return_if_fail (info != NULL);
- g_return_if_fail (E_IS_TABLE_SORT_INFO (info));
-
- if (info->frozen) {
- info->group_info_changed = 1;
- } else {
- gtk_signal_emit (GTK_OBJECT (info),
- e_table_sort_info_signals [GROUP_INFO_CHANGED]);
- }
-}
-
-void
-e_table_sort_info_freeze (ETableSortInfo *info)
-{
- info->frozen = 1;
-}
-
-void
-e_table_sort_info_thaw (ETableSortInfo *info)
-{
- info->frozen = 0;
- if (info->sort_info_changed) {
- info->sort_info_changed = 0;
- e_table_sort_info_sort_info_changed(info);
- }
- if (info->group_info_changed) {
- info->group_info_changed = 0;
- e_table_sort_info_group_info_changed(info);
- }
-}
-
-
-guint
-e_table_sort_info_grouping_get_count (ETableSortInfo *info)
-{
- return info->group_count;
-}
-
-static void
-e_table_sort_info_grouping_real_truncate (ETableSortInfo *info, int length)
-{
- if (length < info->group_count) {
- info->group_count = length;
- }
- if (length > info->group_count) {
- info->groupings = g_realloc(info->groupings, length * sizeof(ETableSortColumn));
- info->group_count = length;
- }
-}
-
-void
-e_table_sort_info_grouping_truncate (ETableSortInfo *info, int length)
-{
- e_table_sort_info_grouping_real_truncate(info, length);
- e_table_sort_info_group_info_changed(info);
-}
-
-ETableSortColumn
-e_table_sort_info_grouping_get_nth (ETableSortInfo *info, int n)
-{
- if (n < info->group_count) {
- return info->groupings[n];
- } else {
- ETableSortColumn fake = {0, 0};
- return fake;
- }
-}
-
-void
-e_table_sort_info_grouping_set_nth (ETableSortInfo *info, int n, ETableSortColumn column)
-{
- if (n >= info->group_count) {
- e_table_sort_info_grouping_real_truncate(info, n + 1);
- }
- info->groupings[n] = column;
- e_table_sort_info_group_info_changed(info);
-}
-
-
-guint
-e_table_sort_info_sorting_get_count (ETableSortInfo *info)
-{
- return info->sort_count;
-}
-
-static void
-e_table_sort_info_sorting_real_truncate (ETableSortInfo *info, int length)
-{
- if (length < info->sort_count) {
- info->sort_count = length;
- }
- if (length > info->sort_count) {
- info->sortings = g_realloc(info->sortings, length * sizeof(ETableSortColumn));
- info->sort_count = length;
- }
-}
-
-void
-e_table_sort_info_sorting_truncate (ETableSortInfo *info, int length)
-{
- e_table_sort_info_sorting_real_truncate (info, length);
- e_table_sort_info_sort_info_changed(info);
-}
-
-ETableSortColumn
-e_table_sort_info_sorting_get_nth (ETableSortInfo *info, int n)
-{
- if (n < info->sort_count) {
- return info->sortings[n];
- } else {
- ETableSortColumn fake = {0, 0};
- return fake;
- }
-}
-
-void
-e_table_sort_info_sorting_set_nth (ETableSortInfo *info, int n, ETableSortColumn column)
-{
- if (n >= info->sort_count) {
- e_table_sort_info_sorting_real_truncate(info, n + 1);
- }
- info->sortings[n] = column;
- e_table_sort_info_sort_info_changed(info);
-}
-
-
-ETableSortInfo *
-e_table_sort_info_new (void)
-{
- return gtk_type_new (e_table_sort_info_get_type ());
-}
diff --git a/widgets/e-table/e-table-sort-info.h b/widgets/e-table/e-table-sort-info.h
deleted file mode 100644
index 6446230116..0000000000
--- a/widgets/e-table/e-table-sort-info.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SORT_INFO_H_
-#define _E_TABLE_SORT_INFO_H_
-
-#include <gtk/gtkobject.h>
-
-#define E_TABLE_SORT_INFO_TYPE (e_table_sort_info_get_type ())
-#define E_TABLE_SORT_INFO(o) (GTK_CHECK_CAST ((o), E_TABLE_SORT_INFO_TYPE, ETableSortInfo))
-#define E_TABLE_SORT_INFO_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SORT_INFO_TYPE, ETableSortInfoClass))
-#define E_IS_TABLE_SORT_INFO(o) (GTK_CHECK_TYPE ((o), E_TABLE_SORT_INFO_TYPE))
-#define E_IS_TABLE_SORT_INFO_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SORT_INFO_TYPE))
-
-typedef struct _ETableSortColumn ETableSortColumn;
-
-struct _ETableSortColumn {
- guint column : 31;
- guint ascending : 1;
-};
-
-typedef struct {
- GtkObject base;
-
- gint group_count;
- ETableSortColumn *groupings;
- gint sort_count;
- ETableSortColumn *sortings;
-
- guint frozen : 1;
- guint sort_info_changed : 1;
- guint group_info_changed : 1;
-} ETableSortInfo;
-
-typedef struct {
- GtkObjectClass parent_class;
-
- /*
- * Signals
- */
- void (*sort_info_changed) (ETableSortInfo *info);
- void (*group_info_changed) (ETableSortInfo *info);
-} ETableSortInfoClass;
-
-GtkType e_table_sort_info_get_type (void);
-
-void e_table_sort_info_freeze (ETableSortInfo *info);
-void e_table_sort_info_thaw (ETableSortInfo *info);
-
-guint e_table_sort_info_grouping_get_count (ETableSortInfo *info);
-void e_table_sort_info_grouping_truncate (ETableSortInfo *info, int length);
-ETableSortColumn e_table_sort_info_grouping_get_nth (ETableSortInfo *info, int n);
-void e_table_sort_info_grouping_set_nth (ETableSortInfo *info, int n, ETableSortColumn column);
-
-guint e_table_sort_info_sorting_get_count (ETableSortInfo *info);
-void e_table_sort_info_sorting_truncate (ETableSortInfo *info, int length);
-ETableSortColumn e_table_sort_info_sorting_get_nth (ETableSortInfo *info, int n);
-void e_table_sort_info_sorting_set_nth (ETableSortInfo *info, int n, ETableSortColumn column);
-
-ETableSortInfo *e_table_sort_info_new (void);
-
-#endif /* _E_TABLE_SORT_INFO_H_ */
diff --git a/widgets/e-table/e-table-sorted-variable.c b/widgets/e-table/e-table-sorted-variable.c
deleted file mode 100644
index 7584b31a74..0000000000
--- a/widgets/e-table/e-table-sorted-variable.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-sorted.c: Implements a table that sorts another table
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtksignal.h>
-#include <string.h>
-#include "e-util/e-util.h"
-#include "e-table-sorted-variable.h"
-
-#define PARENT_TYPE E_TABLE_SUBSET_VARIABLE_TYPE
-
-#define INCREMENT_AMOUNT 100
-
-static ETableSubsetVariableClass *etsv_parent_class;
-
-static void etsv_proxy_model_changed (ETableModel *etm, ETableSortedVariable *etsv);
-#if 0
-static void etsv_proxy_model_row_changed (ETableModel *etm, int row, ETableSortedVariable *etsv);
-static void etsv_proxy_model_cell_changed (ETableModel *etm, int col, int row, ETableSortedVariable *etsv);
-#endif
-static void etsv_sort_info_changed (ETableSortInfo *info, ETableSortedVariable *etsv);
-static void etsv_sort (ETableSortedVariable *etsv);
-static void etsv_add (ETableSubsetVariable *etssv, gint row);
-static void etsv_add_all (ETableSubsetVariable *etssv);
-
-static void
-etsv_destroy (GtkObject *object)
-{
- ETableSortedVariable *etsv = E_TABLE_SORTED_VARIABLE (object);
- ETableSubset *etss = E_TABLE_SUBSET (object);
-
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etsv->table_model_changed_id);
-#if 0
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etsv->table_model_row_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etsv->table_model_cell_changed_id);
-#endif
- gtk_signal_disconnect (GTK_OBJECT (etsv->sort_info),
- etsv->sort_info_changed_id);
-
- if (etsv->sort_idle_id) {
- g_source_remove(etsv->sort_idle_id);
- }
-
- etsv->table_model_changed_id = 0;
- etsv->table_model_row_changed_id = 0;
- etsv->table_model_cell_changed_id = 0;
-
- if (etsv->sort_info)
- gtk_object_unref(GTK_OBJECT(etsv->sort_info));
- if (etsv->full_header)
- gtk_object_unref(GTK_OBJECT(etsv->full_header));
-
- GTK_OBJECT_CLASS (etsv_parent_class)->destroy (object);
-}
-
-static void
-etsv_class_init (GtkObjectClass *object_class)
-{
- ETableSubsetVariableClass *etssv_class = E_TABLE_SUBSET_VARIABLE_CLASS(object_class);
-
- etsv_parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = etsv_destroy;
-
- etssv_class->add = etsv_add;
- etssv_class->add_all = etsv_add_all;
-}
-
-static void
-etsv_init (ETableSortedVariable *etsv)
-{
- etsv->full_header = NULL;
- etsv->sort_info = NULL;
-
- etsv->table_model_changed_id = 0;
- etsv->table_model_row_changed_id = 0;
- etsv->table_model_cell_changed_id = 0;
- etsv->sort_info_changed_id = 0;
-
- etsv->sort_idle_id = 0;
-}
-
-E_MAKE_TYPE(e_table_sorted_variable, "ETableSortedVariable", ETableSortedVariable, etsv_class_init, etsv_init, PARENT_TYPE);
-
-static gboolean
-etsv_sort_idle(ETableSortedVariable *etsv)
-{
- gtk_object_ref(GTK_OBJECT(etsv));
- etsv_sort(etsv);
- etsv->sort_idle_id = 0;
- gtk_object_unref(GTK_OBJECT(etsv));
- return FALSE;
-}
-
-/* This takes source rows. */
-static int
-etsv_compare(ETableSortedVariable *etsv, int row1, int row2)
-{
- int j;
- int sort_count = e_table_sort_info_sorting_get_count(etsv->sort_info);
- int comp_val = 0;
- int ascending = 1;
- ETableSubset *etss = E_TABLE_SUBSET(etsv);
-
- for (j = 0; j < sort_count; j++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(etsv->sort_info, j);
- ETableCol *col;
- if (column.column > e_table_header_count (etsv->full_header))
- col = e_table_header_get_column (etsv->full_header, e_table_header_count (etsv->full_header) - 1);
- else
- col = e_table_header_get_column (etsv->full_header, column.column);
- comp_val = (*col->compare)(e_table_model_value_at (etss->source, col->col_idx, row1),
- e_table_model_value_at (etss->source, col->col_idx, row2));
- ascending = column.ascending;
- if (comp_val != 0)
- break;
- }
- if (comp_val == 0) {
- if (row1 < row2)
- comp_val = -1;
- if (row1 > row2)
- comp_val = 1;
- }
- if (!ascending)
- comp_val = -comp_val;
- return comp_val;
-}
-
-
-static void
-etsv_add (ETableSubsetVariable *etssv,
- gint row)
-{
- ETableModel *etm = E_TABLE_MODEL(etssv);
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- ETableSortedVariable *etsv = E_TABLE_SORTED_VARIABLE (etssv);
- int i;
-
- if (etss->n_map + 1 > etssv->n_vals_allocated) {
- etssv->n_vals_allocated += INCREMENT_AMOUNT;
- etss->map_table = g_realloc (etss->map_table, (etssv->n_vals_allocated) * sizeof(int));
- }
- i = etss->n_map;
- if (etsv->sort_idle_id == 0) {
- i = 0;
- while (i < etss->n_map && etsv_compare(etsv, etss->map_table[i], row) < 0)
- i++;
- memmove(etss->map_table + i + 1, etss->map_table + i, (etss->n_map - i) * sizeof(int));
- }
- etss->map_table[i] = row;
- etss->n_map++;
-
- e_table_model_row_inserted (etm, i);
-}
-
-static void
-etsv_add_all (ETableSubsetVariable *etssv)
-{
- ETableModel *etm = E_TABLE_MODEL(etssv);
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- ETableSortedVariable *etsv = E_TABLE_SORTED_VARIABLE (etssv);
- int rows;
- int i;
-
- e_table_model_pre_change(etm);
-
- rows = e_table_model_row_count(etss->source);
-
- if (etss->n_map + rows > etssv->n_vals_allocated){
- etssv->n_vals_allocated += MAX(INCREMENT_AMOUNT, rows);
- etss->map_table = g_realloc (etss->map_table, etssv->n_vals_allocated * sizeof(int));
- }
- for (i = 0; i < rows; i++)
- etss->map_table[etss->n_map++] = i;
-
- if (etsv->sort_idle_id == 0) {
- etsv->sort_idle_id = g_idle_add_full(50, (GSourceFunc) etsv_sort_idle, etsv, NULL);
- }
-
- e_table_model_changed (etm);
-}
-
-ETableModel *
-e_table_sorted_variable_new (ETableModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
-{
- ETableSortedVariable *etsv = gtk_type_new (E_TABLE_SORTED_VARIABLE_TYPE);
- ETableSubsetVariable *etssv = E_TABLE_SUBSET_VARIABLE (etsv);
-
- if (e_table_subset_variable_construct (etssv, source) == NULL){
- gtk_object_destroy (GTK_OBJECT (etsv));
- return NULL;
- }
-
- etsv->sort_info = sort_info;
- gtk_object_ref(GTK_OBJECT(etsv->sort_info));
- etsv->full_header = full_header;
- gtk_object_ref(GTK_OBJECT(etsv->full_header));
-
- etsv->table_model_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_changed",
- GTK_SIGNAL_FUNC (etsv_proxy_model_changed), etsv);
-#if 0
- etsv->table_model_row_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_row_changed",
- GTK_SIGNAL_FUNC (etsv_proxy_model_row_changed), etsv);
- etsv->table_model_cell_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_cell_changed",
- GTK_SIGNAL_FUNC (etsv_proxy_model_cell_changed), etsv);
-#endif
- etsv->sort_info_changed_id = gtk_signal_connect (GTK_OBJECT (sort_info), "sort_info_changed",
- GTK_SIGNAL_FUNC (etsv_sort_info_changed), etsv);
-
- return E_TABLE_MODEL(etsv);
-}
-
-static void
-etsv_proxy_model_changed (ETableModel *etm, ETableSortedVariable *etsv)
-{
- /* FIXME: do_resort (); */
-}
-#if 0
-static void
-etsv_proxy_model_row_changed (ETableModel *etm, int row, ETableSortedVariable *etsv)
-{
- ETableSubsetVariable *etssv = E_TABLE_SUBSET_VARIABLE(etsv);
-
- if (e_table_subset_variable_remove(etssv, row))
- e_table_subset_variable_add (etssv, row);
-}
-
-static void
-etsv_proxy_model_cell_changed (ETableModel *etm, int col, int row, ETableSortedVariable *etsv)
-{
- ETableSubsetVariable *etssv = E_TABLE_SUBSET_VARIABLE(etsv);
-
- if (e_table_subset_variable_remove(etssv, row))
- e_table_subset_variable_add (etssv, row);
-}
-#endif
-
-static void
-etsv_sort_info_changed (ETableSortInfo *info, ETableSortedVariable *etsv)
-{
- etsv_sort(etsv);
-}
-
-static ETableSortedVariable *etsv_closure;
-void **vals_closure;
-int cols_closure;
-int *ascending_closure;
-GCompareFunc *compare_closure;
-
-/* FIXME: Make it not cache the second and later columns (as if anyone cares.) */
-
-static int
-qsort_callback(const void *data1, const void *data2)
-{
- gint row1 = *(int *)data1;
- gint row2 = *(int *)data2;
- int j;
- int sort_count = e_table_sort_info_sorting_get_count(etsv_closure->sort_info);
- int comp_val = 0;
- int ascending = 1;
- for (j = 0; j < sort_count; j++) {
- comp_val = (*(compare_closure[j]))(vals_closure[cols_closure * row1 + j], vals_closure[cols_closure * row2 + j]);
- ascending = ascending_closure[j];
- if (comp_val != 0)
- break;
- }
- if (comp_val == 0) {
- if (row1 < row2)
- comp_val = -1;
- if (row1 > row2)
- comp_val = 1;
- }
- if (!ascending)
- comp_val = -comp_val;
- return comp_val;
-}
-
-
-static void
-etsv_sort(ETableSortedVariable *etsv)
-{
- ETableSubset *etss = E_TABLE_SUBSET(etsv);
- static int reentering = 0;
- int rows = E_TABLE_SUBSET(etsv)->n_map;
- int total_rows;
- int i;
- int j;
- int cols;
- if (reentering)
- return;
- reentering = 1;
-
- e_table_model_pre_change(E_TABLE_MODEL(etsv));
-
- total_rows = e_table_model_row_count(E_TABLE_SUBSET(etsv)->source);
- cols = e_table_sort_info_sorting_get_count(etsv->sort_info);
- cols_closure = cols;
- etsv_closure = etsv;
- vals_closure = g_new(void *, total_rows * cols);
- ascending_closure = g_new(int, cols);
- compare_closure = g_new(GCompareFunc, cols);
- for (j = 0; j < cols; j++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(etsv->sort_info, j);
- ETableCol *col;
- if (column.column > e_table_header_count (etsv->full_header))
- col = e_table_header_get_column (etsv->full_header, e_table_header_count (etsv->full_header) - 1);
- else
- col = e_table_header_get_column (etsv->full_header, column.column);
- for (i = 0; i < rows; i++) {
-#if 0
- if( !(i & 0xff) ) {
- while(gtk_events_pending())
- gtk_main_iteration();
- }
-#endif
- vals_closure[E_TABLE_SUBSET(etsv)->map_table[i] * cols + j] = e_table_model_value_at (etss->source, col->col_idx, E_TABLE_SUBSET(etsv)->map_table[i]);
- }
- compare_closure[j] = col->compare;
- ascending_closure[j] = column.ascending;
- }
- qsort(E_TABLE_SUBSET(etsv)->map_table, rows, sizeof(int), qsort_callback);
- g_free(vals_closure);
- g_free(ascending_closure);
- g_free(compare_closure);
- e_table_model_changed (E_TABLE_MODEL(etsv));
- reentering = 0;
-}
diff --git a/widgets/e-table/e-table-sorted-variable.h b/widgets/e-table/e-table-sorted-variable.h
deleted file mode 100644
index c6a57c5ede..0000000000
--- a/widgets/e-table/e-table-sorted-variable.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SORTED_VARIABLE_H_
-#define _E_TABLE_SORTED_VARIABLE_H_
-
-#include <gtk/gtkobject.h>
-#include "e-table-model.h"
-#include "e-table-subset-variable.h"
-#include "e-table-sort-info.h"
-#include "e-table-header.h"
-
-#define E_TABLE_SORTED_VARIABLE_TYPE (e_table_sorted_variable_get_type ())
-#define E_TABLE_SORTED_VARIABLE(o) (GTK_CHECK_CAST ((o), E_TABLE_SORTED_VARIABLE_TYPE, ETableSortedVariable))
-#define E_TABLE_SORTED_VARIABLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SORTED_VARIABLE_TYPE, ETableSortedVariableClass))
-#define E_IS_TABLE_SORTED_VARIABLE(o) (GTK_CHECK_TYPE ((o), E_TABLE_SORTED_VARIABLE_TYPE))
-#define E_IS_TABLE_SORTED_VARIABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SORTED_VARIABLE_TYPE))
-
-typedef struct {
- ETableSubsetVariable base;
-
- ETableSortInfo *sort_info;
-
- ETableHeader *full_header;
-
- int table_model_changed_id;
- int table_model_row_changed_id;
- int table_model_cell_changed_id;
- int sort_info_changed_id;
- int sort_idle_id;
-} ETableSortedVariable;
-
-typedef struct {
- ETableSubsetVariableClass parent_class;
-} ETableSortedVariableClass;
-
-GtkType e_table_sorted_variable_get_type (void);
-ETableModel *e_table_sorted_variable_new (ETableModel *etm, ETableHeader *header, ETableSortInfo *sort_info);
-
-#endif /* _E_TABLE_SORTED_VARIABLE_H_ */
diff --git a/widgets/e-table/e-table-sorted.c b/widgets/e-table/e-table-sorted.c
deleted file mode 100644
index c754f4cff7..0000000000
--- a/widgets/e-table/e-table-sorted.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * E-table-sorted.c: Implements a table that sorts another table
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <stdlib.h>
-#include "e-util/e-util.h"
-#include "e-table-sorted.h"
-
-#define PARENT_TYPE E_TABLE_SUBSET_TYPE
-
-static ETableSubsetClass *ets_parent_class;
-
-static void
-ets_class_init (GtkObjectClass *klass)
-{
- ets_parent_class = gtk_type_class (PARENT_TYPE);
-}
-
-E_MAKE_TYPE(e_table_sorted, "ETableSorted", ETableSorted, ets_class_init, NULL, PARENT_TYPE);
-
-static ETableSorted *sort_ets;
-
-static int
-my_sort (const void *a, const void *b)
-{
- ETableModel *source = E_TABLE_SUBSET (sort_ets)->source;
- const int *ia = (const int *) a;
- const int *ib = (const int *) b;
- void *va, *vb;
-
- va = e_table_model_value_at (source, sort_ets->sort_col, *ia);
- vb = e_table_model_value_at (source, sort_ets->sort_col, *ib);
-
- return (*sort_ets->compare) (va, vb);
-}
-
-static void
-do_sort (ETableSorted *ets)
-{
- ETableSubset *etss = E_TABLE_SUBSET (ets);
- g_assert (sort_ets == NULL);
-
- sort_ets = ets;
- qsort (etss->map_table, etss->n_map, sizeof (unsigned int), my_sort);
- sort_ets = NULL;
-}
-
-ETableModel *
-e_table_sorted_new (ETableModel *source, int col, GCompareFunc compare)
-{
- ETableSorted *ets = gtk_type_new (E_TABLE_SORTED_TYPE);
- ETableSubset *etss = E_TABLE_SUBSET (ets);
- const int nvals = e_table_model_row_count (source);
- int i;
-
- if (e_table_subset_construct (etss, source, nvals) == NULL){
- gtk_object_destroy (GTK_OBJECT (ets));
- return NULL;
- }
-
- ets->compare = compare;
- ets->sort_col = col;
-
- /* Init */
- for (i = 0; i < nvals; i++)
- etss->map_table [i] = i;
-
- do_sort (ets);
-
- return (ETableModel *) ets;
-}
-
-void
-e_table_sorted_resort (ETableSorted *ets, int col, GCompareFunc compare)
-{
- if (col == -1 || compare == NULL)
- do_sort (ets);
- else {
- ets->sort_col = col;
- ets->compare = compare;
- do_sort (ets);
- }
-}
-
diff --git a/widgets/e-table/e-table-sorted.h b/widgets/e-table/e-table-sorted.h
deleted file mode 100644
index 92bd8d1522..0000000000
--- a/widgets/e-table/e-table-sorted.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _E_TABLE_SORTED_H_
-#define _E_TABLE_SORTED_H_
-
-#include <gtk/gtkobject.h>
-#include "e-table-model.h"
-#include "e-table-subset.h"
-
-#define E_TABLE_SORTED_TYPE (e_table_sorted_get_type ())
-#define E_TABLE_SORTED(o) (GTK_CHECK_CAST ((o), E_TABLE_SORTED_TYPE, ETableSorted))
-#define E_TABLE_SORTED_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SORTED_TYPE, ETableSortedClass))
-#define E_IS_TABLE_SORTED(o) (GTK_CHECK_TYPE ((o), E_TABLE_SORTED_TYPE))
-#define E_IS_TABLE_SORTED_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SORTED_TYPE))
-
-typedef struct {
- ETableSubset base;
-
- short sort_col;
- GCompareFunc compare;
-} ETableSorted;
-
-typedef struct {
- ETableSubsetClass parent_class;
-} ETableSortedClass;
-
-GtkType e_table_sorted_get_type (void);
-ETableModel *e_table_sorted_new (ETableModel *etm, int col, GCompareFunc compare);
-void e_table_sorted_resort (ETableSorted *ets, int col, GCompareFunc compare);
-
-#endif /* _E_TABLE_SORTED_H_ */
diff --git a/widgets/e-table/e-table-sorter.c b/widgets/e-table/e-table-sorter.c
deleted file mode 100644
index eb2391b0d0..0000000000
--- a/widgets/e-table/e-table-sorter.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-sorted.c: Implements a table that sorts another table
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtksignal.h>
-#include <string.h>
-#include "e-util/e-util.h"
-#include "e-table-sorter.h"
-
-#define PARENT_TYPE gtk_object_get_type()
-
-#define INCREMENT_AMOUNT 100
-
-static GtkObjectClass *parent_class;
-
-static void ets_model_changed (ETableModel *etm, ETableSorter *ets);
-static void ets_model_row_changed (ETableModel *etm, int row, ETableSorter *ets);
-static void ets_model_cell_changed (ETableModel *etm, int col, int row, ETableSorter *ets);
-static void ets_sort_info_changed (ETableSortInfo *info, ETableSorter *ets);
-static void ets_clean (ETableSorter *ets);
-static void ets_sort (ETableSorter *ets);
-static void ets_backsort (ETableSorter *ets);
-
-static void
-ets_destroy (GtkObject *object)
-{
- ETableSorter *ets = E_TABLE_SORTER (object);
-
- gtk_signal_disconnect (GTK_OBJECT (ets->source),
- ets->table_model_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (ets->source),
- ets->table_model_row_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (ets->source),
- ets->table_model_cell_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (ets->sort_info),
- ets->sort_info_changed_id);
-
- ets->table_model_changed_id = 0;
- ets->table_model_row_changed_id = 0;
- ets->table_model_cell_changed_id = 0;
- ets->sort_info_changed_id = 0;
-
- if (ets->sort_info)
- gtk_object_unref(GTK_OBJECT(ets->sort_info));
- if (ets->full_header)
- gtk_object_unref(GTK_OBJECT(ets->full_header));
- if (ets->source)
- gtk_object_unref(GTK_OBJECT(ets->source));
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-static void
-ets_class_init (ETableSorterClass *klass)
-{
- GtkObjectClass *object_class = GTK_OBJECT_CLASS(klass);
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = ets_destroy;
-}
-
-static void
-ets_init (ETableSorter *ets)
-{
- ets->full_header = NULL;
- ets->sort_info = NULL;
- ets->source = NULL;
-
- ets->needs_sorting = -1;
-
- ets->table_model_changed_id = 0;
- ets->table_model_row_changed_id = 0;
- ets->table_model_cell_changed_id = 0;
- ets->sort_info_changed_id = 0;
-}
-
-E_MAKE_TYPE(e_table_sorter, "ETableSorter", ETableSorter, ets_class_init, ets_init, PARENT_TYPE);
-
-ETableSorter *
-e_table_sorter_new (ETableModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
-{
- ETableSorter *ets = gtk_type_new (E_TABLE_SORTER_TYPE);
-
- ets->sort_info = sort_info;
- gtk_object_ref(GTK_OBJECT(ets->sort_info));
- ets->full_header = full_header;
- gtk_object_ref(GTK_OBJECT(ets->full_header));
- ets->source = source;
- gtk_object_ref(GTK_OBJECT(ets->source));
-
- ets->table_model_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_changed",
- GTK_SIGNAL_FUNC (ets_model_changed), ets);
- ets->table_model_row_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_row_changed",
- GTK_SIGNAL_FUNC (ets_model_row_changed), ets);
- ets->table_model_cell_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_cell_changed",
- GTK_SIGNAL_FUNC (ets_model_cell_changed), ets);
- ets->sort_info_changed_id = gtk_signal_connect (GTK_OBJECT (sort_info), "sort_info_changed",
- GTK_SIGNAL_FUNC (ets_sort_info_changed), ets);
-
- return ets;
-}
-
-static void
-ets_model_changed (ETableModel *etm, ETableSorter *ets)
-{
- ets_clean(ets);
-}
-
-static void
-ets_model_row_changed (ETableModel *etm, int row, ETableSorter *ets)
-{
- ets_clean(ets);
-}
-
-static void
-ets_model_cell_changed (ETableModel *etm, int col, int row, ETableSorter *ets)
-{
- ets_clean(ets);
-}
-
-static void
-ets_sort_info_changed (ETableSortInfo *info, ETableSorter *ets)
-{
- ets_clean(ets);
-}
-
-static ETableSorter *ets_closure;
-void **vals_closure;
-int cols_closure;
-int *ascending_closure;
-GCompareFunc *compare_closure;
-
-/* FIXME: Make it not cache the second and later columns (as if anyone cares.) */
-
-static int
-qsort_callback(const void *data1, const void *data2)
-{
- gint row1 = *(int *)data1;
- gint row2 = *(int *)data2;
- int j;
- int sort_count = e_table_sort_info_sorting_get_count(ets_closure->sort_info) + e_table_sort_info_grouping_get_count(ets_closure->sort_info);
- int comp_val = 0;
- int ascending = 1;
- for (j = 0; j < sort_count; j++) {
- comp_val = (*(compare_closure[j]))(vals_closure[cols_closure * row1 + j], vals_closure[cols_closure * row2 + j]);
- ascending = ascending_closure[j];
- if (comp_val != 0)
- break;
- }
- if (comp_val == 0) {
- if (row1 < row2)
- comp_val = -1;
- if (row1 > row2)
- comp_val = 1;
- }
- if (!ascending)
- comp_val = -comp_val;
- return comp_val;
-}
-
-static void
-ets_clean(ETableSorter *ets)
-{
- g_free(ets->sorted);
- ets->sorted = NULL;
-
- g_free(ets->backsorted);
- ets->backsorted = NULL;
-
- ets->needs_sorting = -1;
-}
-
-static void
-ets_sort(ETableSorter *ets)
-{
- int rows;
- int i;
- int j;
- int cols;
- int group_cols;
-
- if (ets->sorted)
- return;
-
- rows = e_table_model_row_count(ets->source);
- group_cols = e_table_sort_info_grouping_get_count(ets->sort_info);
- cols = e_table_sort_info_sorting_get_count(ets->sort_info) + group_cols;
-
- ets->sorted = g_new(int, rows);
- for (i = 0; i < rows; i++)
- ets->sorted[i] = i;
-
- cols_closure = cols;
- ets_closure = ets;
-
- vals_closure = g_new(void *, rows * cols);
- ascending_closure = g_new(int, cols);
- compare_closure = g_new(GCompareFunc, cols);
-
- for (j = 0; j < cols; j++) {
- ETableSortColumn column;
- ETableCol *col;
-
- if (j < group_cols)
- column = e_table_sort_info_grouping_get_nth(ets->sort_info, j);
- else
- column = e_table_sort_info_sorting_get_nth(ets->sort_info, j - group_cols);
-
- if (column.column > e_table_header_count (ets->full_header))
- col = e_table_header_get_column (ets->full_header, e_table_header_count (ets->full_header) - 1);
- else
- col = e_table_header_get_column (ets->full_header, column.column);
-
- for (i = 0; i < rows; i++) {
- vals_closure[i * cols + j] = e_table_model_value_at (ets->source, col->col_idx, i);
- }
-
- compare_closure[j] = col->compare;
- ascending_closure[j] = column.ascending;
- }
- qsort(ets->sorted, rows, sizeof(int), qsort_callback);
-
- g_free(vals_closure);
- g_free(ascending_closure);
- g_free(compare_closure);
-}
-
-static void
-ets_backsort(ETableSorter *ets)
-{
- int i, rows;
-
- if (ets->backsorted)
- return;
-
- ets_sort(ets);
-
- rows = e_table_model_row_count(ets->source);
- ets->backsorted = g_new0(int, rows);
-
- for (i = 0; i < rows; i++) {
- ets->backsorted[ets->sorted[i]] = i;
- }
-}
-
-gboolean
-e_table_sorter_needs_sorting(ETableSorter *ets)
-{
- if (ets->needs_sorting < 0) {
- if (e_table_sort_info_sorting_get_count(ets->sort_info) + e_table_sort_info_grouping_get_count(ets->sort_info))
- ets->needs_sorting = 1;
- else
- ets->needs_sorting = 0;
- }
- return ets->needs_sorting;
-}
-
-
-gint
-e_table_sorter_model_to_sorted (ETableSorter *sorter, int row)
-{
- int rows = e_table_model_row_count(sorter->source);
-
- g_return_val_if_fail(row >= 0, -1);
- g_return_val_if_fail(row < rows, -1);
-
- if (e_table_sorter_needs_sorting(sorter)) {
- ets_backsort(sorter);
- return sorter->backsorted[row];
- } else
- return row;
-}
-
-gint
-e_table_sorter_sorted_to_model (ETableSorter *sorter, int row)
-{
- int rows = e_table_model_row_count(sorter->source);
-
- g_return_val_if_fail(row >= 0, -1);
- g_return_val_if_fail(row < rows, -1);
-
- if (e_table_sorter_needs_sorting(sorter)) {
- ets_sort(sorter);
- return sorter->sorted[row];
- } else
- return row;
-}
diff --git a/widgets/e-table/e-table-sorter.h b/widgets/e-table/e-table-sorter.h
deleted file mode 100644
index f5a71565a3..0000000000
--- a/widgets/e-table/e-table-sorter.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SORTER_H_
-#define _E_TABLE_SORTER_H_
-
-#include <gtk/gtkobject.h>
-#include "e-table-model.h"
-#include "e-table-subset-variable.h"
-#include "e-table-sort-info.h"
-#include "e-table-header.h"
-
-#define E_TABLE_SORTER_TYPE (e_table_sorter_get_type ())
-#define E_TABLE_SORTER(o) (GTK_CHECK_CAST ((o), E_TABLE_SORTER_TYPE, ETableSorter))
-#define E_TABLE_SORTER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SORTER_TYPE, ETableSorterClass))
-#define E_IS_TABLE_SORTER(o) (GTK_CHECK_TYPE ((o), E_TABLE_SORTER_TYPE))
-#define E_IS_TABLE_SORTER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SORTER_TYPE))
-
-typedef struct {
- GtkObject base;
-
- ETableModel *source;
- ETableHeader *full_header;
- ETableSortInfo *sort_info;
-
- int needs_sorting;
-
- int *sorted;
- int *backsorted;
-
- int table_model_changed_id;
- int table_model_row_changed_id;
- int table_model_cell_changed_id;
- int sort_info_changed_id;
-} ETableSorter;
-
-typedef struct {
- GtkObjectClass parent_class;
-} ETableSorterClass;
-
-GtkType e_table_sorter_get_type (void);
-ETableSorter *e_table_sorter_new (ETableModel *etm, ETableHeader *full_header, ETableSortInfo *sort_info);
-
-gint e_table_sorter_model_to_sorted (ETableSorter *sorter, int row);
-gint e_table_sorter_sorted_to_model (ETableSorter *sorter, int row);
-
-gboolean e_table_sorter_needs_sorting (ETableSorter *sorter);
-
-#endif /* _E_TABLE_SORTER_H_ */
diff --git a/widgets/e-table/e-table-subset-variable.c b/widgets/e-table/e-table-subset-variable.c
deleted file mode 100644
index d429604301..0000000000
--- a/widgets/e-table/e-table-subset-variable.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-subset.c: Implements a table that contains a subset of another table.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtksignal.h>
-#include <string.h>
-#include "e-util/e-util.h"
-#include "e-table-subset-variable.h"
-
-#define ETSSV_CLASS(e) ((ETableSubsetVariableClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE E_TABLE_SUBSET_TYPE
-
-#define INCREMENT_AMOUNT 10
-
-static ETableSubsetClass *etssv_parent_class;
-
-static void
-etssv_add (ETableSubsetVariable *etssv,
- gint row)
-{
- ETableModel *etm = E_TABLE_MODEL(etssv);
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
-
- e_table_model_pre_change(etm);
-
- if (etss->n_map + 1 > etssv->n_vals_allocated){
- etss->map_table = g_realloc (etss->map_table, (etssv->n_vals_allocated + INCREMENT_AMOUNT) * sizeof(int));
- etssv->n_vals_allocated += INCREMENT_AMOUNT;
- }
-
- etss->map_table[etss->n_map++] = row;
-
- e_table_model_row_inserted (etm, etss->n_map - 1);
-}
-
-static void
-etssv_add_all (ETableSubsetVariable *etssv)
-{
- ETableModel *etm = E_TABLE_MODEL(etssv);
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- int rows;
- int i;
-
- e_table_model_pre_change(etm);
-
- rows = e_table_model_row_count(etss->source);
- if (etss->n_map + rows > etssv->n_vals_allocated){
- etssv->n_vals_allocated += MAX(INCREMENT_AMOUNT, rows);
- etss->map_table = g_realloc (etss->map_table, etssv->n_vals_allocated * sizeof(int));
- }
- for (i = 0; i < rows; i++)
- etss->map_table[etss->n_map++] = i;
-
- e_table_model_changed (etm);
-}
-
-static gboolean
-etssv_remove (ETableSubsetVariable *etssv,
- gint row)
-{
- ETableModel *etm = E_TABLE_MODEL(etssv);
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- int i;
-
- for (i = 0; i < etss->n_map; i++){
- if (etss->map_table[i] == row) {
- e_table_model_pre_change (etm);
- memmove (etss->map_table + i, etss->map_table + i + 1, (etss->n_map - i - 1) * sizeof(int));
- etss->n_map --;
-
- e_table_model_row_deleted (etm, i);
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static void
-etssv_class_init (GtkObjectClass *object_class)
-{
- ETableSubsetVariableClass *klass = E_TABLE_SUBSET_VARIABLE_CLASS(object_class);
- etssv_parent_class = gtk_type_class (PARENT_TYPE);
-
- klass->add = etssv_add;
- klass->add_all = etssv_add_all;
- klass->remove = etssv_remove;
-}
-
-E_MAKE_TYPE(e_table_subset_variable, "ETableSubsetVariable", ETableSubsetVariable, etssv_class_init, NULL, PARENT_TYPE);
-
-ETableModel *
-e_table_subset_variable_construct (ETableSubsetVariable *etssv,
- ETableModel *source)
-{
- if (e_table_subset_construct (E_TABLE_SUBSET(etssv), source, 1) == NULL)
- return NULL;
- E_TABLE_SUBSET(etssv)->n_map = 0;
-
- return E_TABLE_MODEL (etssv);
-}
-
-ETableModel *
-e_table_subset_variable_new (ETableModel *source)
-{
- ETableSubsetVariable *etssv = gtk_type_new (E_TABLE_SUBSET_VARIABLE_TYPE);
-
- if (e_table_subset_variable_construct (etssv, source) == NULL){
- gtk_object_destroy (GTK_OBJECT (etssv));
- return NULL;
- }
-
- return (ETableModel *) etssv;
-}
-
-void
-e_table_subset_variable_add (ETableSubsetVariable *etssv,
- gint row)
-{
- g_return_if_fail (etssv != NULL);
- g_return_if_fail (E_IS_TABLE_SUBSET_VARIABLE(etssv));
-
- if (ETSSV_CLASS(etssv)->add)
- ETSSV_CLASS (etssv)->add (etssv, row);
-}
-
-void
-e_table_subset_variable_add_all (ETableSubsetVariable *etssv)
-{
- g_return_if_fail (etssv != NULL);
- g_return_if_fail (E_IS_TABLE_SUBSET_VARIABLE(etssv));
-
- if (ETSSV_CLASS(etssv)->add_all)
- ETSSV_CLASS (etssv)->add_all (etssv);
-}
-
-gboolean
-e_table_subset_variable_remove (ETableSubsetVariable *etssv,
- gint row)
-{
- g_return_val_if_fail (etssv != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_SUBSET_VARIABLE(etssv), FALSE);
-
- if (ETSSV_CLASS(etssv)->remove)
- return ETSSV_CLASS (etssv)->remove (etssv, row);
- else
- return FALSE;
-}
-
-void
-e_table_subset_variable_increment (ETableSubsetVariable *etssv,
- gint position,
- gint amount)
-{
- int i;
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- for (i = 0; i < etss->n_map; i++) {
- if (etss->map_table[i] > position)
- etss->map_table[i] += amount;
- }
-}
-
-void
-e_table_subset_variable_decrement (ETableSubsetVariable *etssv,
- gint position,
- gint amount)
-{
- int i;
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- for (i = 0; i < etss->n_map; i++) {
- if (etss->map_table[i] > position)
- etss->map_table[i] -= amount;
- }
-}
-
-void
-e_table_subset_variable_set_allocation (ETableSubsetVariable *etssv,
- gint total)
-{
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- if (total <= 0)
- total = 1;
- if (total > etss->n_map){
- etss->map_table = g_realloc (etss->map_table, total * sizeof(int));
- }
-}
diff --git a/widgets/e-table/e-table-subset-variable.h b/widgets/e-table/e-table-subset-variable.h
deleted file mode 100644
index 9d44828728..0000000000
--- a/widgets/e-table/e-table-subset-variable.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SUBSET_VARIABLE_H_
-#define _E_TABLE_SUBSET_VARIABLE_H_
-
-#include <gtk/gtkobject.h>
-#include "e-table-subset.h"
-
-#define E_TABLE_SUBSET_VARIABLE_TYPE (e_table_subset_variable_get_type ())
-#define E_TABLE_SUBSET_VARIABLE(o) (GTK_CHECK_CAST ((o), E_TABLE_SUBSET_VARIABLE_TYPE, ETableSubsetVariable))
-#define E_TABLE_SUBSET_VARIABLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SUBSET_VARIABLE_TYPE, ETableSubsetVariableClass))
-#define E_IS_TABLE_SUBSET_VARIABLE(o) (GTK_CHECK_TYPE ((o), E_TABLE_SUBSET_VARIABLE_TYPE))
-#define E_IS_TABLE_SUBSET_VARIABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SUBSET_VARIABLE_TYPE))
-
-typedef struct {
- ETableSubset base;
-
- int n_vals_allocated;
-} ETableSubsetVariable;
-
-typedef struct {
- ETableSubsetClass parent_class;
-
- void (*add) (ETableSubsetVariable *ets,
- gint row);
- void (*add_all) (ETableSubsetVariable *ets);
- gboolean (*remove) (ETableSubsetVariable *ets,
- gint row);
-} ETableSubsetVariableClass;
-
-GtkType e_table_subset_variable_get_type (void);
-ETableModel *e_table_subset_variable_new (ETableModel *etm);
-ETableModel *e_table_subset_variable_construct (ETableSubsetVariable *etssv,
- ETableModel *source);
-void e_table_subset_variable_add (ETableSubsetVariable *ets,
- gint row);
-void e_table_subset_variable_add_all (ETableSubsetVariable *ets);
-gboolean e_table_subset_variable_remove (ETableSubsetVariable *ets,
- gint row);
-void e_table_subset_variable_increment (ETableSubsetVariable *ets,
- gint position,
- gint amount);
-void e_table_subset_variable_decrement (ETableSubsetVariable *ets,
- gint position,
- gint amount);
-void e_table_subset_variable_set_allocation (ETableSubsetVariable *ets,
- gint total);
-#endif /* _E_TABLE_SUBSET_VARIABLE_H_ */
-
diff --git a/widgets/e-table/e-table-subset.c b/widgets/e-table/e-table-subset.c
deleted file mode 100644
index 1cac0f88ea..0000000000
--- a/widgets/e-table/e-table-subset.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-subset.c: Implements a table that contains a subset of another table.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtksignal.h>
-#include "e-util/e-util.h"
-#include "e-table-subset.h"
-
-#define PARENT_TYPE E_TABLE_MODEL_TYPE
-
-static ETableModelClass *etss_parent_class;
-
-static void
-etss_destroy (GtkObject *object)
-{
- ETableSubset *etss = E_TABLE_SUBSET (object);
-
- if (etss->source)
- gtk_object_unref (GTK_OBJECT (etss->source));
-
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etss->table_model_pre_change_id);
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etss->table_model_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etss->table_model_row_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etss->table_model_cell_changed_id);
-
- etss->table_model_pre_change_id = 0;
- etss->table_model_changed_id = 0;
- etss->table_model_row_changed_id = 0;
- etss->table_model_cell_changed_id = 0;
-
- g_free (etss->map_table);
-
- GTK_OBJECT_CLASS (etss_parent_class)->destroy (object);
-}
-
-static int
-etss_column_count (ETableModel *etm)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_column_count (etss->source);
-}
-
-static int
-etss_row_count (ETableModel *etm)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return etss->n_map;
-}
-
-static void *
-etss_value_at (ETableModel *etm, int col, int row)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_value_at (etss->source, col, etss->map_table [row]);
-}
-
-static void
-etss_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_set_value_at (etss->source, col, etss->map_table [row], val);
-}
-
-static gboolean
-etss_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_is_cell_editable (etss->source, col, etss->map_table [row]);
-}
-
-static void
-etss_append_row (ETableModel *etm, ETableModel *source, int row)
-{
- ETableSubset *etss = (ETableSubset *)etm;
- e_table_model_append_row (etss->source, source, row);
-}
-
-static void *
-etss_duplicate_value (ETableModel *etm, int col, const void *value)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_duplicate_value (etss->source, col, value);
-}
-
-static void
-etss_free_value (ETableModel *etm, int col, void *value)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- e_table_model_free_value (etss->source, col, value);
-}
-
-static void *
-etss_initialize_value (ETableModel *etm, int col)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_initialize_value (etss->source, col);
-}
-
-static gboolean
-etss_value_is_empty (ETableModel *etm, int col, const void *value)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_value_is_empty (etss->source, col, value);
-}
-
-static char *
-etss_value_to_string (ETableModel *etm, int col, const void *value)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_value_to_string (etss->source, col, value);
-}
-
-static void
-etss_class_init (GtkObjectClass *klass)
-{
- ETableModelClass *table_class = (ETableModelClass *) klass;
-
- etss_parent_class = gtk_type_class (PARENT_TYPE);
-
- klass->destroy = etss_destroy;
-
- table_class->column_count = etss_column_count;
- table_class->row_count = etss_row_count;
- table_class->value_at = etss_value_at;
- table_class->set_value_at = etss_set_value_at;
- table_class->is_cell_editable = etss_is_cell_editable;
- table_class->append_row = etss_append_row;
- table_class->duplicate_value = etss_duplicate_value;
- table_class->free_value = etss_free_value;
- table_class->initialize_value = etss_initialize_value;
- table_class->value_is_empty = etss_value_is_empty;
- table_class->value_to_string = etss_value_to_string;
-}
-
-E_MAKE_TYPE(e_table_subset, "ETableSubset", ETableSubset, etss_class_init, NULL, PARENT_TYPE);
-
-static void
-etss_proxy_model_pre_change (ETableModel *etm, ETableSubset *etss)
-{
- e_table_model_pre_change (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_changed (ETableModel *etm, ETableSubset *etss)
-{
- e_table_model_changed (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_row_changed (ETableModel *etm, int row, ETableSubset *etss)
-{
- const int n = etss->n_map;
- const int * const map_table = etss->map_table;
- int i;
-
- for (i = 0; i < n; i++){
- if (map_table [i] == row){
- e_table_model_row_changed (E_TABLE_MODEL (etss), i);
- return;
- }
- }
-}
-
-static void
-etss_proxy_model_cell_changed (ETableModel *etm, int col, int row, ETableSubset *etss)
-{
- const int n = etss->n_map;
- const int * const map_table = etss->map_table;
- int i;
-
- for (i = 0; i < n; i++){
- if (map_table [i] == row){
- e_table_model_cell_changed (E_TABLE_MODEL (etss), col, i);
- return;
- }
- }
-}
-
-ETableModel *
-e_table_subset_construct (ETableSubset *etss, ETableModel *source, int nvals)
-{
- unsigned int *buffer;
- int i;
-
- buffer = (unsigned int *) g_malloc (sizeof (unsigned int) * nvals);
- if (buffer == NULL)
- return NULL;
- etss->map_table = buffer;
- etss->n_map = nvals;
- etss->source = source;
- gtk_object_ref (GTK_OBJECT (source));
-
- /* Init */
- for (i = 0; i < nvals; i++)
- etss->map_table [i] = i;
-
- etss->table_model_pre_change_id = gtk_signal_connect (GTK_OBJECT (source), "model_pre_change",
- GTK_SIGNAL_FUNC (etss_proxy_model_pre_change), etss);
- etss->table_model_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_changed",
- GTK_SIGNAL_FUNC (etss_proxy_model_changed), etss);
- etss->table_model_row_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_row_changed",
- GTK_SIGNAL_FUNC (etss_proxy_model_row_changed), etss);
- etss->table_model_cell_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_cell_changed",
- GTK_SIGNAL_FUNC (etss_proxy_model_cell_changed), etss);
-
- return E_TABLE_MODEL (etss);
-}
-
-ETableModel *
-e_table_subset_new (ETableModel *source, const int nvals)
-{
- ETableSubset *etss = gtk_type_new (E_TABLE_SUBSET_TYPE);
-
- if (e_table_subset_construct (etss, source, nvals) == NULL){
- gtk_object_destroy (GTK_OBJECT (etss));
- return NULL;
- }
-
- return (ETableModel *) etss;
-}
-
-ETableModel *
-e_table_subset_get_toplevel (ETableSubset *table)
-{
- g_return_val_if_fail (table != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_SUBSET (table), NULL);
-
- if (E_IS_TABLE_SUBSET (table->source))
- return e_table_subset_get_toplevel (E_TABLE_SUBSET (table->source));
- else
- return table->source;
-}
diff --git a/widgets/e-table/e-table-subset.h b/widgets/e-table/e-table-subset.h
deleted file mode 100644
index 9e10de7a4b..0000000000
--- a/widgets/e-table/e-table-subset.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SUBSET_H_
-#define _E_TABLE_SUBSET_H_
-
-#include <gtk/gtkobject.h>
-#include "e-table-model.h"
-
-#define E_TABLE_SUBSET_TYPE (e_table_subset_get_type ())
-#define E_TABLE_SUBSET(o) (GTK_CHECK_CAST ((o), E_TABLE_SUBSET_TYPE, ETableSubset))
-#define E_TABLE_SUBSET_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SUBSET_TYPE, ETableSubsetClass))
-#define E_IS_TABLE_SUBSET(o) (GTK_CHECK_TYPE ((o), E_TABLE_SUBSET_TYPE))
-#define E_IS_TABLE_SUBSET_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SUBSET_TYPE))
-
-typedef struct {
- ETableModel base;
-
- ETableModel *source;
- int n_map;
- int *map_table;
-
- int table_model_pre_change_id;
- int table_model_changed_id;
- int table_model_row_changed_id;
- int table_model_cell_changed_id;
-} ETableSubset;
-
-typedef struct {
- ETableModelClass parent_class;
-} ETableSubsetClass;
-
-GtkType e_table_subset_get_type (void);
-ETableModel *e_table_subset_new (ETableModel *etm, int n_vals);
-ETableModel *e_table_subset_construct (ETableSubset *ets, ETableModel *source, int nvals);
-
-ETableModel *e_table_subset_get_toplevel (ETableSubset *table_model);
-
-#endif /* _E_TABLE_SUBSET_H_ */
-
diff --git a/widgets/e-table/e-table-text-model.c b/widgets/e-table/e-table-text-model.c
deleted file mode 100644
index 5b6fa8b707..0000000000
--- a/widgets/e-table/e-table-text-model.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ETableTextModel - Text item model for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#include <config.h>
-#include <ctype.h>
-#include "e-table-text-model.h"
-
-static void e_table_text_model_class_init (ETableTextModelClass *class);
-static void e_table_text_model_init (ETableTextModel *model);
-static void e_table_text_model_destroy (GtkObject *object);
-
-static gchar *e_table_text_model_get_text (ETextModel *model);
-static void e_table_text_model_set_text (ETextModel *model, gchar *text);
-static void e_table_text_model_insert (ETextModel *model, gint postion, gchar *text);
-static void e_table_text_model_insert_length (ETextModel *model, gint postion, gchar *text, gint length);
-static void e_table_text_model_delete (ETextModel *model, gint postion, gint length);
-
-static GtkObject *parent_class;
-
-
-
-/**
- * e_table_text_model_get_type:
- * @void:
- *
- * Registers the &ETableTextModel class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ETableTextModel class.
- **/
-GtkType
-e_table_text_model_get_type (void)
-{
- static GtkType model_type = 0;
-
- if (!model_type) {
- GtkTypeInfo model_info = {
- "ETableTextModel",
- sizeof (ETableTextModel),
- sizeof (ETableTextModelClass),
- (GtkClassInitFunc) e_table_text_model_class_init,
- (GtkObjectInitFunc) e_table_text_model_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- model_type = gtk_type_unique (e_text_model_get_type (), &model_info);
- }
-
- return model_type;
-}
-
-/* Class initialization function for the text item */
-static void
-e_table_text_model_class_init (ETableTextModelClass *klass)
-{
- GtkObjectClass *object_class;
- ETextModelClass *model_class;
-
- object_class = (GtkObjectClass *) klass;
- model_class = (ETextModelClass *) klass;
-
- parent_class = gtk_type_class (e_text_model_get_type ());
-
- model_class->get_text = e_table_text_model_get_text;
- model_class->set_text = e_table_text_model_set_text;
- model_class->insert = e_table_text_model_insert;
- model_class->insert_length = e_table_text_model_insert_length;
- model_class->delete = e_table_text_model_delete;
-
- object_class->destroy = e_table_text_model_destroy;
-}
-
-/* Object initialization function for the text item */
-static void
-e_table_text_model_init (ETableTextModel *model)
-{
- model->model = NULL;
- model->row = 0;
- model->model_col = 0;
- model->cell_changed_signal_id = 0;
- model->row_changed_signal_id = 0;
-}
-
-/* Destroy handler for the text item */
-static void
-e_table_text_model_destroy (GtkObject *object)
-{
- ETableTextModel *model;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_TABLE_TEXT_MODEL (object));
-
- model = E_TABLE_TEXT_MODEL (object);
-
- if (model->model)
- g_assert (GTK_IS_OBJECT (model->model));
-
- if (model->cell_changed_signal_id)
- gtk_signal_disconnect (GTK_OBJECT(model->model),
- model->cell_changed_signal_id);
-
- if (model->row_changed_signal_id)
- gtk_signal_disconnect (GTK_OBJECT(model->model),
- model->row_changed_signal_id);
-
- if (model->model)
- gtk_object_unref (GTK_OBJECT(model->model));
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-static gchar *
-e_table_text_model_get_text (ETextModel *text_model)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model)
- return (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- else
- return "";
-}
-
-static void
-e_table_text_model_set_text (ETextModel *text_model, gchar *text)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model)
- e_table_model_set_value_at (model->model, model->model_col, model->row, (void *) text);
-}
-
-static void
-e_table_text_model_insert (ETextModel *text_model, gint position, gchar *text)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model){
- gchar *temp = (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- temp = g_strdup_printf ("%.*s%s%s", position, temp, text, temp + position);
- e_table_model_set_value_at (model->model, model->model_col, model->row, temp);
- g_free (temp);
- }
-}
-
-static void
-e_table_text_model_insert_length (ETextModel *text_model, gint position, gchar *text, gint length)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model){
- gchar *temp = (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- temp = g_strdup_printf ("%.*s%.*s%s", position, temp, length, text, temp + position);
- e_table_model_set_value_at (model->model, model->model_col, model->row, temp);
- g_free (temp);
- }
-}
-
-static void
-e_table_text_model_delete (ETextModel *text_model, gint position, gint length)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model){
- gchar *temp = (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- temp = g_strdup_printf ("%.*s%s", position, temp, temp + position + length);
- e_table_model_set_value_at (model->model, model->model_col, model->row, temp);
- g_free (temp);
- }
-}
-
-static void
-cell_changed (ETableModel *table_model, int model_col, int row, ETableTextModel *model)
-{
- if (model->model_col == model_col &&
- model->row == row)
- e_text_model_changed (E_TEXT_MODEL(model));
-}
-
-static void
-row_changed (ETableModel *table_model, int row, ETableTextModel *model)
-{
- if (model->row == row)
- e_text_model_changed (E_TEXT_MODEL(model));
-}
-
-ETableTextModel *
-e_table_text_model_new (ETableModel *table_model, int row, int model_col)
-{
- ETableTextModel *model = gtk_type_new (e_table_text_model_get_type ());
- model->model = table_model;
- if (model->model){
- gtk_object_ref (GTK_OBJECT(model->model));
- model->cell_changed_signal_id =
- gtk_signal_connect (GTK_OBJECT(model->model),
- "model_cell_changed",
- GTK_SIGNAL_FUNC(cell_changed),
- model);
- model->row_changed_signal_id =
- gtk_signal_connect (GTK_OBJECT(model->model),
- "model_row_changed",
- GTK_SIGNAL_FUNC(row_changed),
- model);
- }
- model->row = row;
- model->model_col = model_col;
- return model;
-}
-
diff --git a/widgets/e-table/e-table-text-model.h b/widgets/e-table/e-table-text-model.h
deleted file mode 100644
index dcc9afde7c..0000000000
--- a/widgets/e-table/e-table-text-model.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ETableTextModel - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#ifndef E_TABLE_TEXT_MODEL_H
-#define E_TABLE_TEXT_MODEL_H
-
-#include <gnome.h>
-#include "e-text-model.h"
-#include "e-table-model.h"
-
-
-BEGIN_GNOME_DECLS
-
-#define E_TYPE_TABLE_TEXT_MODEL (e_table_text_model_get_type ())
-#define E_TABLE_TEXT_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TABLE_TEXT_MODEL, ETableTextModel))
-#define E_TABLE_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TABLE_TEXT_MODEL, ETableTextModelClass))
-#define E_IS_TABLE_TEXT_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TABLE_TEXT_MODEL))
-#define E_IS_TABLE_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_TABLE_TEXT_MODEL))
-
-typedef struct _ETableTextModel ETableTextModel;
-typedef struct _ETableTextModelClass ETableTextModelClass;
-
-struct _ETableTextModel {
- ETextModel parent;
-
- ETableModel *model;
- int row;
- int model_col;
-
- int cell_changed_signal_id;
- int row_changed_signal_id;
-};
-
-struct _ETableTextModelClass {
- ETextModelClass parent_class;
-
-};
-
-
-/* Standard Gtk function */
-GtkType e_table_text_model_get_type (void);
-ETableTextModel *e_table_text_model_new (ETableModel *table_model, int row, int model_col);
-
-END_GNOME_DECLS
-
-#endif
diff --git a/widgets/e-table/e-table-tree.h b/widgets/e-table/e-table-tree.h
deleted file mode 100644
index e7e125a6af..0000000000
--- a/widgets/e-table/e-table-tree.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef _E_TABLE_TREE_H_
-#define _E_TABLE_TREE_H_
-
-typedef struct {
- char *title;
-
- union {
- ETableModel *table;
- GList *children;
- } u;
-
- guint expanded :1;
- guint is_leaf :1;
-} ETableGroup;
-
-ETableGroup *e_table_group_new (const char *title, ETableModel *table);
-ETableGroup *e_table_group_new_leaf (const char *title);
-
-#endif /* _E_TABLE_TREE_H_ */
diff --git a/widgets/e-table/e-table.c b/widgets/e-table/e-table.c
deleted file mode 100644
index bd6d7bc60c..0000000000
--- a/widgets/e-table/e-table.c
+++ /dev/null
@@ -1,1669 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table.c: A graphical view of a Table.
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- * Chris Lahey (clahey@helixcode.com)
- *
- * Copyright 1999, Helix Code, Inc
- */
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
-#include <stdio.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <gtk/gtksignal.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include "e-util/e-util.h"
-#include "e-util/e-xml-utils.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-canvas-vbox.h"
-#include "e-table.h"
-#include "e-table-header-item.h"
-#include "e-table-subset.h"
-#include "e-table-item.h"
-#include "e-table-group.h"
-#include "e-table-group-leaf.h"
-#include "e-table-click-to-add.h"
-
-#define COLUMN_HEADER_HEIGHT 16
-
-#define PARENT_TYPE gtk_table_get_type ()
-
-static GtkObjectClass *e_table_parent_class;
-
-enum {
- CURSOR_CHANGE,
- DOUBLE_CLICK,
- RIGHT_CLICK,
- KEY_PRESS,
-
- TABLE_DRAG_BEGIN,
- TABLE_DRAG_END,
- TABLE_DRAG_DATA_GET,
- TABLE_DRAG_DATA_DELETE,
-
- TABLE_DRAG_LEAVE,
- TABLE_DRAG_MOTION,
- TABLE_DRAG_DROP,
- TABLE_DRAG_DATA_RECEIVED,
-
- LAST_SIGNAL
-};
-
-enum {
- ARG_0,
- ARG_TABLE_DRAW_GRID,
- ARG_TABLE_DRAW_FOCUS,
- ARG_CURSOR_MODE,
- ARG_LENGTH_THRESHOLD,
- ARG_CLICK_TO_ADD_MESSAGE,
-};
-
-static gint et_signals [LAST_SIGNAL] = { 0, };
-
-static void e_table_fill_table (ETable *e_table, ETableModel *model);
-static gboolean changed_idle (gpointer data);
-
-static void et_drag_begin (GtkWidget *widget,
- GdkDragContext *context,
- ETable *et);
-static void et_drag_end (GtkWidget *widget,
- GdkDragContext *context,
- ETable *et);
-static void et_drag_data_get(GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETable *et);
-static void et_drag_data_delete(GtkWidget *widget,
- GdkDragContext *context,
- ETable *et);
-
-static void et_drag_leave(GtkWidget *widget,
- GdkDragContext *context,
- guint time,
- ETable *et);
-static gboolean et_drag_motion(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- ETable *et);
-static gboolean et_drag_drop(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- ETable *et);
-static void et_drag_data_received(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETable *et);
-static gint e_table_drag_source_event_cb (GtkWidget *widget,
- GdkEvent *event,
- ETable *table);
-
-static void
-et_destroy (GtkObject *object)
-{
- ETable *et = E_TABLE (object);
-
-
- gtk_signal_disconnect (GTK_OBJECT (et->model),
- et->table_model_change_id);
- gtk_signal_disconnect (GTK_OBJECT (et->model),
- et->table_row_change_id);
- gtk_signal_disconnect (GTK_OBJECT (et->model),
- et->table_cell_change_id);
- gtk_signal_disconnect (GTK_OBJECT (et->model),
- et->table_row_inserted_id);
- gtk_signal_disconnect (GTK_OBJECT (et->model),
- et->table_row_deleted_id);
- if (et->group_info_change_id)
- gtk_signal_disconnect (GTK_OBJECT (et->sort_info),
- et->group_info_change_id);
-
- if (et->reflow_idle_id)
- g_source_remove(et->reflow_idle_id);
- et->reflow_idle_id = 0;
-
- gtk_object_unref (GTK_OBJECT (et->model));
- gtk_object_unref (GTK_OBJECT (et->full_header));
- gtk_object_unref (GTK_OBJECT (et->header));
- gtk_object_unref (GTK_OBJECT (et->sort_info));
- gtk_object_unref (GTK_OBJECT (et->sorter));
- gtk_widget_destroy (GTK_WIDGET (et->header_canvas));
- gtk_widget_destroy (GTK_WIDGET (et->table_canvas));
-
- if (et->rebuild_idle_id) {
- g_source_remove (et->rebuild_idle_id);
- et->rebuild_idle_id = 0;
- }
-
- g_free(et->click_to_add_message);
-
- (*e_table_parent_class->destroy)(object);
-}
-
-static void
-e_table_init (GtkObject *object)
-{
- ETable *e_table = E_TABLE (object);
- GtkTable *gtk_table = GTK_TABLE (object);
-
- gtk_table->homogeneous = FALSE;
-
- e_table->sort_info = NULL;
- e_table->group_info_change_id = 0;
- e_table->reflow_idle_id = 0;
-
- e_table->draw_grid = 1;
- e_table->draw_focus = 1;
- e_table->cursor_mode = E_TABLE_CURSOR_SIMPLE;
- e_table->length_threshold = 200;
-
- e_table->need_rebuild = 0;
- e_table->rebuild_idle_id = 0;
-
- e_table->click_to_add_message = NULL;
-
- e_table->drag_get_data_row = -1;
- e_table->drag_get_data_col = -1;
- e_table->drop_row = -1;
- e_table->drop_col = -1;
- e_table->site = NULL;
- e_table->drag_source_button_press_event_id = 0;
- e_table->drag_source_motion_notify_event_id = 0;
-
- e_table->sorter = NULL;
- e_table->selection = e_table_selection_model_new();
- e_table->cursor_loc = E_TABLE_CURSOR_LOC_NONE;
-}
-
-static void
-header_canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc, ETable *e_table)
-{
- gnome_canvas_set_scroll_region (
- GNOME_CANVAS (e_table->header_canvas),
- 0, 0, alloc->width - 1, COLUMN_HEADER_HEIGHT - 1);
-}
-
-static void
-sort_info_changed (ETableSortInfo *info, ETable *et)
-{
- et->need_rebuild = TRUE;
- if (!et->rebuild_idle_id)
- et->rebuild_idle_id = g_idle_add_full (20, changed_idle, et, NULL);
-}
-
-static void
-e_table_setup_header (ETable *e_table)
-{
- e_table->header_canvas = GNOME_CANVAS (e_canvas_new ());
-
- gtk_widget_show (GTK_WIDGET (e_table->header_canvas));
-
- e_table->header_item = gnome_canvas_item_new (
- gnome_canvas_root (e_table->header_canvas),
- e_table_header_item_get_type (),
- "ETableHeader", e_table->header,
- "full_header", e_table->full_header,
- "sort_info", e_table->sort_info,
- "dnd_code", "(unset)",
- NULL);
-
- gtk_signal_connect (
- GTK_OBJECT (e_table->header_canvas), "size_allocate",
- GTK_SIGNAL_FUNC (header_canvas_size_allocate), e_table);
-
- gtk_widget_set_usize (GTK_WIDGET (e_table->header_canvas), -1, COLUMN_HEADER_HEIGHT);
-}
-
-static gboolean
-table_canvas_reflow_idle (ETable *e_table)
-{
- gdouble height, width;
- GtkAllocation *alloc = &(GTK_WIDGET (e_table->table_canvas)->allocation);
-
- gtk_object_get (GTK_OBJECT (e_table->canvas_vbox),
- "height", &height,
- "width", &width,
- NULL);
- height = MAX ((int)height, alloc->height);
- width = MAX((int)width, alloc->width);
- /* I have no idea why this needs to be -1, but it works. */
- gnome_canvas_set_scroll_region (
- GNOME_CANVAS (e_table->table_canvas),
- 0, 0, width - 1, height - 1);
- e_table->reflow_idle_id = 0;
- return FALSE;
-}
-
-static void
-table_canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc,
- ETable *e_table)
-{
- gdouble width;
- width = alloc->width;
-
- gtk_object_set (GTK_OBJECT (e_table->canvas_vbox),
- "width", width,
- NULL);
- gtk_object_set (GTK_OBJECT (e_table->header),
- "width", width,
- NULL);
- if (e_table->reflow_idle_id)
- g_source_remove(e_table->reflow_idle_id);
- table_canvas_reflow_idle(e_table);
-}
-
-static void
-table_canvas_reflow (GnomeCanvas *canvas, ETable *e_table)
-{
- if (!e_table->reflow_idle_id)
- e_table->reflow_idle_id = g_idle_add_full (400, (GSourceFunc) table_canvas_reflow_idle, e_table, NULL);
-}
-
-static void
-click_to_add_cursor_change (ETableClickToAdd *etcta, int row, int col, ETable *et)
-{
- if (et->cursor_loc == E_TABLE_CURSOR_LOC_TABLE) {
- e_table_selection_model_clear(et->selection);
- }
- et->cursor_loc = E_TABLE_CURSOR_LOC_ETCTA;
-}
-
-static void
-group_cursor_change (ETableGroup *etg, int row, ETable *et)
-{
- if (et->cursor_loc == E_TABLE_CURSOR_LOC_ETCTA && et->click_to_add) {
- e_table_click_to_add_commit(E_TABLE_CLICK_TO_ADD(et->click_to_add));
- }
- et->cursor_loc = E_TABLE_CURSOR_LOC_TABLE;
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [CURSOR_CHANGE],
- row);
-}
-
-static void
-group_double_click (ETableGroup *etg, int row, ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [DOUBLE_CLICK],
- row);
-}
-
-static gint
-group_right_click (ETableGroup *etg, int row, int col, GdkEvent *event, ETable *et)
-{
- int return_val;
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [RIGHT_CLICK],
- row, col, event, &return_val);
- return return_val;
-}
-
-static gint
-group_key_press (ETableGroup *etg, int row, int col, GdkEvent *event, ETable *et)
-{
- int return_val;
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [KEY_PRESS],
- row, col, event, &return_val);
- return return_val;
-}
-
-static gboolean
-changed_idle (gpointer data)
-{
- ETable *et = E_TABLE (data);
-
- if (et->need_rebuild) {
- gtk_object_destroy (GTK_OBJECT (et->group));
- et->group = e_table_group_new (GNOME_CANVAS_GROUP (et->canvas_vbox),
- et->full_header,
- et->header,
- et->model,
- et->sort_info,
- 0);
- e_canvas_vbox_add_item(E_CANVAS_VBOX(et->canvas_vbox), GNOME_CANVAS_ITEM(et->group));
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(et->group),
- "drawgrid", et->draw_grid,
- "drawfocus", et->draw_focus,
- "cursor_mode", et->cursor_mode,
- "length_threshold", et->length_threshold,
- "table_selection_model", et->selection,
- NULL);
- gtk_signal_connect (GTK_OBJECT (et->group), "cursor_change",
- GTK_SIGNAL_FUNC (group_cursor_change), et);
- gtk_signal_connect (GTK_OBJECT (et->group), "double_click",
- GTK_SIGNAL_FUNC (group_double_click), et);
- gtk_signal_connect (GTK_OBJECT (et->group), "right_click",
- GTK_SIGNAL_FUNC (group_right_click), et);
- gtk_signal_connect (GTK_OBJECT (et->group), "key_press",
- GTK_SIGNAL_FUNC (group_key_press), et);
- e_table_fill_table (et, et->model);
-
- gtk_object_set (GTK_OBJECT (et->canvas_vbox),
- "width", (double) GTK_WIDGET (et->table_canvas)->allocation.width,
- NULL);
- }
-
- et->need_rebuild = 0;
- et->rebuild_idle_id = 0;
-
- return FALSE;
-}
-
-static void
-et_table_model_changed (ETableModel *model, ETable *et)
-{
- et->need_rebuild = TRUE;
- if (!et->rebuild_idle_id)
- et->rebuild_idle_id = g_idle_add_full (20, changed_idle, et, NULL);
-}
-
-static void
-et_table_row_changed (ETableModel *table_model, int row, ETable *et)
-{
- if (!et->need_rebuild) {
- if (e_table_group_remove (et->group, row))
- e_table_group_add (et->group, row);
- }
-}
-
-static void
-et_table_cell_changed (ETableModel *table_model, int view_col, int row, ETable *et)
-{
- et_table_row_changed (table_model, row, et);
-}
-
-static void
-et_table_row_inserted (ETableModel *table_model, int row, ETable *et)
-{
- int row_count = e_table_model_row_count(table_model);
- if (!et->need_rebuild) {
- if (row != row_count - 1)
- e_table_group_increment(et->group, row, 1);
- e_table_group_add (et->group, row);
- }
-}
-
-static void
-et_table_row_deleted (ETableModel *table_model, int row, ETable *et)
-{
- int row_count = e_table_model_row_count(table_model);
- if (!et->need_rebuild) {
- e_table_group_remove (et->group, row);
- if (row != row_count - 1)
- e_table_group_decrement(et->group, row, 1);
- }
-}
-
-static void
-e_table_setup_table (ETable *e_table, ETableHeader *full_header, ETableHeader *header,
- ETableModel *model)
-{
- e_table->table_canvas = GNOME_CANVAS (e_canvas_new ());
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "size_allocate",
- GTK_SIGNAL_FUNC (table_canvas_size_allocate), e_table);
-
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_begin",
- GTK_SIGNAL_FUNC (et_drag_begin), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_end",
- GTK_SIGNAL_FUNC (et_drag_end), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_data_get",
- GTK_SIGNAL_FUNC (et_drag_data_get), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_data_delete",
- GTK_SIGNAL_FUNC (et_drag_data_delete), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_motion",
- GTK_SIGNAL_FUNC (et_drag_motion), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_leave",
- GTK_SIGNAL_FUNC (et_drag_leave), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_drop",
- GTK_SIGNAL_FUNC (et_drag_drop), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_data_received",
- GTK_SIGNAL_FUNC (et_drag_data_received), e_table);
-
- gtk_signal_connect (GTK_OBJECT(e_table->table_canvas), "reflow",
- GTK_SIGNAL_FUNC (table_canvas_reflow), e_table);
-
- gtk_widget_show (GTK_WIDGET (e_table->table_canvas));
-
-
- e_table->canvas_vbox = gnome_canvas_item_new(gnome_canvas_root(e_table->table_canvas),
- e_canvas_vbox_get_type(),
- "spacing", 10.0,
- NULL);
-
- if (e_table->use_click_to_add) {
- e_table->click_to_add = gnome_canvas_item_new (GNOME_CANVAS_GROUP(e_table->canvas_vbox),
- e_table_click_to_add_get_type (),
- "header", e_table->header,
- "model", e_table->model,
- "message", e_table->click_to_add_message,
- NULL);
-
- e_canvas_vbox_add_item(E_CANVAS_VBOX(e_table->canvas_vbox), e_table->click_to_add);
- gtk_signal_connect(GTK_OBJECT (e_table->click_to_add), "cursor_change",
- GTK_SIGNAL_FUNC(click_to_add_cursor_change), e_table);
- }
-
- e_table->group = e_table_group_new (
- GNOME_CANVAS_GROUP (e_table->canvas_vbox),
- full_header, header,
- model, e_table->sort_info, 0);
- e_canvas_vbox_add_item(E_CANVAS_VBOX(e_table->canvas_vbox), GNOME_CANVAS_ITEM(e_table->group));
-
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(e_table->group),
- "drawgrid", e_table->draw_grid,
- "drawfocus", e_table->draw_focus,
- "cursor_mode", e_table->cursor_mode,
- "length_threshold", e_table->length_threshold,
- "table_selection_model", e_table->selection,
- NULL);
-
- gtk_signal_connect (GTK_OBJECT (e_table->group), "cursor_change",
- GTK_SIGNAL_FUNC(group_cursor_change), e_table);
- gtk_signal_connect (GTK_OBJECT (e_table->group), "double_click",
- GTK_SIGNAL_FUNC(group_double_click), e_table);
- gtk_signal_connect (GTK_OBJECT (e_table->group), "right_click",
- GTK_SIGNAL_FUNC(group_right_click), e_table);
- gtk_signal_connect (GTK_OBJECT (e_table->group), "key_press",
- GTK_SIGNAL_FUNC(group_key_press), e_table);
-
- e_table->table_model_change_id = gtk_signal_connect (
- GTK_OBJECT (model), "model_changed",
- GTK_SIGNAL_FUNC (et_table_model_changed), e_table);
-
- e_table->table_row_change_id = gtk_signal_connect (
- GTK_OBJECT (model), "model_row_changed",
- GTK_SIGNAL_FUNC (et_table_row_changed), e_table);
-
- e_table->table_cell_change_id = gtk_signal_connect (
- GTK_OBJECT (model), "model_cell_changed",
- GTK_SIGNAL_FUNC (et_table_cell_changed), e_table);
-
- e_table->table_row_inserted_id = gtk_signal_connect (
- GTK_OBJECT (model), "model_row_inserted",
- GTK_SIGNAL_FUNC (et_table_row_inserted), e_table);
-
- e_table->table_row_deleted_id = gtk_signal_connect (
- GTK_OBJECT (model), "model_row_deleted",
- GTK_SIGNAL_FUNC (et_table_row_deleted), e_table);
-
-}
-
-static void
-e_table_fill_table (ETable *e_table, ETableModel *model)
-{
- e_table_group_add_all (e_table->group);
-}
-
-static ETableHeader *
-et_xml_to_header (ETable *e_table, ETableHeader *full_header, xmlNode *xmlColumns)
-{
- ETableHeader *nh;
- xmlNode *column;
- const int max_cols = e_table_header_count (full_header);
-
- g_return_val_if_fail (e_table, NULL);
- g_return_val_if_fail (full_header, NULL);
- g_return_val_if_fail (xmlColumns, NULL);
-
- nh = e_table_header_new ();
-
- for (column = xmlColumns->childs; column; column = column->next) {
- gchar *content;
- int col;
-
- content = xmlNodeListGetString (column->doc, column->childs, 1);
- col = atoi (content);
- xmlFree (content);
-
- if (col >= max_cols)
- continue;
-
- e_table_header_add_column (nh, e_table_header_get_column (full_header, col), -1);
- }
-
- return nh;
-}
-
-static void
-et_grouping_xml_to_sort_info (ETable *table, xmlNode *grouping)
-{
- int i;
-
- g_return_if_fail (table!=NULL);
- g_return_if_fail (grouping!=NULL);
-
- table->sort_info = e_table_sort_info_new ();
-
- gtk_object_ref (GTK_OBJECT (table->sort_info));
- gtk_object_sink (GTK_OBJECT (table->sort_info));
-
- i = 0;
- for (grouping = grouping->childs; grouping && !strcmp (grouping->name, "group"); grouping = grouping->childs) {
- ETableSortColumn column;
- column.column = e_xml_get_integer_prop_by_name (grouping, "column");
- column.ascending = e_xml_get_integer_prop_by_name (grouping, "ascending");
- e_table_sort_info_grouping_set_nth(table->sort_info, i++, column);
- }
- i = 0;
- for (; grouping && !strcmp (grouping->name, "leaf"); grouping = grouping->childs) {
- ETableSortColumn column;
- column.column = e_xml_get_integer_prop_by_name (grouping, "column");
- column.ascending = e_xml_get_integer_prop_by_name (grouping, "ascending");
- e_table_sort_info_sorting_set_nth(table->sort_info, i++, column);
- }
-
- table->group_info_change_id =
- gtk_signal_connect (GTK_OBJECT (table->sort_info), "group_info_changed",
- GTK_SIGNAL_FUNC (sort_info_changed), table);
-}
-
-static ETable *
-et_real_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
- xmlDoc *xmlSpec)
-{
- xmlNode *xmlRoot;
- xmlNode *xmlColumns;
- xmlNode *xmlGrouping;
- gboolean no_header;
- int row = 0;
-
- xmlRoot = xmlDocGetRootElement (xmlSpec);
- xmlColumns = e_xml_get_child_by_name (xmlRoot, "columns-shown");
- xmlGrouping = e_xml_get_child_by_name (xmlRoot, "grouping");
-
- if ((xmlColumns == NULL) || (xmlGrouping == NULL))
- return NULL;
-
- no_header = e_xml_get_integer_prop_by_name(xmlRoot, "no-header");
- e_table->use_click_to_add = e_xml_get_integer_prop_by_name(xmlRoot, "click-to-add");
-
-
- e_table->full_header = full_header;
- gtk_object_ref (GTK_OBJECT (full_header));
-
- e_table->model = etm;
- gtk_object_ref (GTK_OBJECT (etm));
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- e_table->header = et_xml_to_header (e_table, full_header, xmlColumns);
- et_grouping_xml_to_sort_info (e_table, xmlGrouping);
-
- gtk_object_set(GTK_OBJECT(e_table->header),
- "sort_info", e_table->sort_info,
- NULL);
-
- e_table->sorter = e_table_sorter_new(etm, e_table->full_header, e_table->sort_info);
-
- gtk_object_set (GTK_OBJECT (e_table->selection),
- "model", etm,
- "sorter", e_table->sorter,
- NULL);
-
- if (!no_header) {
- e_table_setup_header (e_table);
- }
- e_table_setup_table (e_table, full_header, e_table->header, etm);
- e_table_fill_table (e_table, etm);
-
- gtk_layout_get_vadjustment (GTK_LAYOUT (e_table->table_canvas))->step_increment = 20;
- gtk_adjustment_changed(gtk_layout_get_vadjustment (GTK_LAYOUT (e_table->table_canvas)));
-
- if (!no_header) {
- /*
- * The header
- */
- gtk_table_attach (GTK_TABLE (e_table), GTK_WIDGET (e_table->header_canvas),
- 0, 1, 0 + row, 1 + row,
- GTK_FILL | GTK_EXPAND,
- GTK_FILL, 0, 0);
- row ++;
- }
- gtk_table_attach (GTK_TABLE (e_table), GTK_WIDGET (e_table->table_canvas),
- 0, 1, 0 + row, 1 + row,
- GTK_FILL | GTK_EXPAND,
- GTK_FILL | GTK_EXPAND,
- 0, 0);
-
- gtk_widget_pop_colormap ();
- gtk_widget_pop_visual ();
-
- return e_table;
-}
-
-ETable *
-e_table_construct (ETable *e_table, ETableHeader *full_header,
- ETableModel *etm, const char *spec)
-{
- xmlDoc *xmlSpec;
- char *copy;
- copy = g_strdup (spec);
-
- xmlSpec = xmlParseMemory (copy, strlen(copy));
- e_table = et_real_construct (e_table, full_header, etm, xmlSpec);
- xmlFreeDoc (xmlSpec);
- g_free (copy);
-
- return e_table;
-}
-
-ETable *
-e_table_construct_from_spec_file (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
- const char *filename)
-{
- xmlDoc *xmlSpec;
-
- xmlSpec = xmlParseFile (filename);
- e_table = et_real_construct (e_table, full_header, etm, xmlSpec);
- xmlFreeDoc (xmlSpec);
-
- return e_table;
-}
-
-GtkWidget *
-e_table_new (ETableHeader *full_header, ETableModel *etm, const char *spec)
-{
- ETable *e_table;
-
- e_table = gtk_type_new (e_table_get_type ());
-
- e_table = e_table_construct (e_table, full_header, etm, spec);
-
- return GTK_WIDGET (e_table);
-}
-
-GtkWidget *
-e_table_new_from_spec_file (ETableHeader *full_header, ETableModel *etm, const char *filename)
-{
- ETable *e_table;
-
- e_table = gtk_type_new (e_table_get_type ());
-
- e_table = e_table_construct_from_spec_file (e_table, full_header, etm, filename);
-
- return (GtkWidget *) e_table;
-}
-
-static xmlNode *
-et_build_column_spec (ETable *e_table)
-{
- xmlNode *columns_shown;
- gint i;
- gint col_count;
-
- columns_shown = xmlNewNode (NULL, "columns-shown");
-
- col_count = e_table_header_count (e_table->header);
- for (i = 0; i < col_count; i++){
- gchar *text = g_strdup_printf ("%d", e_table_header_index(e_table->header, i));
- xmlNewChild (columns_shown, NULL, "column", text);
- g_free (text);
- }
-
- return columns_shown;
-}
-
-static xmlNode *
-et_build_grouping_spec (ETable *e_table)
-{
- xmlNode *node;
- xmlNode *grouping;
- int i;
- const int sort_count = e_table_sort_info_sorting_get_count (e_table->sort_info);
- const int group_count = e_table_sort_info_grouping_get_count (e_table->sort_info);
-
- grouping = xmlNewNode (NULL, "grouping");
- node = grouping;
-
- for (i = 0; i < group_count; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(e_table->sort_info, i);
- xmlNode *new_node = xmlNewChild(node, NULL, "group", NULL);
-
- e_xml_set_integer_prop_by_name (new_node, "column", column.column);
- e_xml_set_integer_prop_by_name (new_node, "ascending", column.ascending);
- node = new_node;
- }
-
- for (i = 0; i < sort_count; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(e_table->sort_info, i);
- xmlNode *new_node = xmlNewChild(node, NULL, "leaf", NULL);
-
- e_xml_set_integer_prop_by_name (new_node, "column", column.column);
- e_xml_set_integer_prop_by_name (new_node, "ascending", column.ascending);
- node = new_node;
- }
-
- return grouping;
-}
-
-static xmlDoc *
-et_build_tree (ETable *e_table)
-{
- xmlDoc *doc;
- xmlNode *root;
-
- doc = xmlNewDoc ("1.0");
- if (doc == NULL)
- return NULL;
-
- root = xmlNewDocNode (doc, NULL, "ETableSpecification", NULL);
- xmlDocSetRootElement (doc, root);
- xmlAddChild (root, et_build_column_spec (e_table));
- xmlAddChild (root, et_build_grouping_spec (e_table));
-
- return doc;
-}
-
-gchar *
-e_table_get_specification (ETable *e_table)
-{
- xmlDoc *doc;
- xmlChar *buffer;
- gint size;
-
- doc = et_build_tree (e_table);
- xmlDocDumpMemory (doc, &buffer, &size);
- xmlFreeDoc (doc);
-
- return buffer;
-}
-
-void
-e_table_save_specification (ETable *e_table, gchar *filename)
-{
- xmlDoc *doc = et_build_tree (e_table);
-
- xmlSaveFile (filename, doc);
- xmlFreeDoc (doc);
-}
-
-void
-e_table_set_cursor_row (ETable *e_table, int row)
-{
- row = e_table_sorter_model_to_sorted(e_table->sorter, row);
- if (row != -1)
- e_table_group_set_cursor_row(e_table->group, row);
-}
-
-int
-e_table_get_cursor_row (ETable *e_table)
-{
- int row = e_table_group_get_cursor_row(e_table->group);
- row = e_table_sorter_sorted_to_model(e_table->sorter, row);
- return row;
-}
-
-void
-e_table_selected_row_foreach (ETable *e_table,
- ETableForeachFunc callback,
- gpointer closure)
-{
- e_table_selection_model_foreach(e_table->selection,
- callback,
- closure);
-}
-
-
-EPrintable *
-e_table_get_printable (ETable *e_table)
-{
- return e_table_group_get_printable(e_table->group);
-}
-
-static void
-et_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETable *etable = E_TABLE (o);
-
- switch (arg_id){
- case ARG_TABLE_DRAW_GRID:
- GTK_VALUE_BOOL (*arg) = etable->draw_grid;
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- GTK_VALUE_BOOL (*arg) = etable->draw_focus;
- break;
-
- case ARG_CLICK_TO_ADD_MESSAGE:
- GTK_VALUE_STRING (*arg) = g_strdup (etable->click_to_add_message);
- break;
- }
-}
-
-typedef struct {
- char *arg;
- gboolean setting;
-} bool_closure;
-
-static void
-et_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETable *etable = E_TABLE (o);
-
- switch (arg_id){
- case ARG_LENGTH_THRESHOLD:
- etable->length_threshold = GTK_VALUE_INT (*arg);
- if (etable->group) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
- "length_threshold", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
-
- case ARG_TABLE_DRAW_GRID:
- etable->draw_grid = GTK_VALUE_BOOL (*arg);
- if (etable->group) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
- "drawgrid", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- etable->draw_focus = GTK_VALUE_BOOL (*arg);
- if (etable->group) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
- "drawfocus", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_CURSOR_MODE:
- etable->cursor_mode = GTK_VALUE_INT (*arg);
- if (etable->group) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
- "cursor_mode", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
- case ARG_CLICK_TO_ADD_MESSAGE:
- if (etable->click_to_add_message)
- g_free(etable->click_to_add_message);
- etable->click_to_add_message = g_strdup(GTK_VALUE_STRING (*arg));
- if (etable->click_to_add)
- gnome_canvas_item_set(etable->click_to_add,
- "message", etable->click_to_add_message,
- NULL);
- break;
- }
-}
-
-static void
-set_scroll_adjustments (ETable *table,
- GtkAdjustment *hadjustment,
- GtkAdjustment *vadjustment)
-{
- if (vadjustment != NULL) {
- vadjustment->step_increment = 20;
- gtk_adjustment_changed(vadjustment);
- }
-
- gtk_layout_set_hadjustment (GTK_LAYOUT(table->table_canvas),
- hadjustment);
- gtk_layout_set_vadjustment (GTK_LAYOUT(table->table_canvas),
- vadjustment);
- gtk_layout_set_hadjustment (GTK_LAYOUT(table->header_canvas),
- hadjustment);
-}
-
-gint
-e_table_get_next_row (ETable *e_table,
- gint model_row)
-{
- if (e_table->sorter) {
- int i;
- i = e_table_sorter_model_to_sorted(e_table->sorter, model_row);
- i++;
- if (i < e_table_model_row_count(e_table->model)) {
- return e_table_sorter_sorted_to_model(e_table->sorter, i);
- } else
- return -1;
- } else
- if (model_row < e_table_model_row_count(e_table->model) - 1)
- return model_row + 1;
- else
- return -1;
-}
-
-gint
-e_table_get_prev_row (ETable *e_table,
- gint model_row)
-{
- if (e_table->sorter) {
- int i;
- i = e_table_sorter_model_to_sorted(e_table->sorter, model_row);
- i--;
- if (i >= 0)
- return e_table_sorter_sorted_to_model(e_table->sorter, i);
- else
- return -1;
- } else
- return model_row - 1;
-}
-
-gint
-e_table_model_to_view_row (ETable *e_table,
- gint model_row)
-{
- if (e_table->sorter)
- return e_table_sorter_model_to_sorted(e_table->sorter, model_row);
- else
- return model_row;
-}
-
-gint
-e_table_view_to_model_row (ETable *e_table,
- gint view_row)
-{
- if (e_table->sorter)
- return e_table_sorter_sorted_to_model(e_table->sorter, view_row);
- else
- return view_row;
-}
-
-struct _ETableDragSourceSite
-{
- GdkModifierType start_button_mask;
- GtkTargetList *target_list; /* Targets for drag data */
- GdkDragAction actions; /* Possible actions */
- GdkColormap *colormap; /* Colormap for drag icon */
- GdkPixmap *pixmap; /* Icon for drag data */
- GdkBitmap *mask;
-
- /* Stored button press information to detect drag beginning */
- gint state;
- gint x, y;
- gint row, col;
-};
-
-typedef enum
-{
- GTK_DRAG_STATUS_DRAG,
- GTK_DRAG_STATUS_WAIT,
- GTK_DRAG_STATUS_DROP
-} GtkDragStatus;
-
-typedef struct _GtkDragDestInfo GtkDragDestInfo;
-typedef struct _GtkDragSourceInfo GtkDragSourceInfo;
-
-struct _GtkDragDestInfo
-{
- GtkWidget *widget; /* Widget in which drag is in */
- GdkDragContext *context; /* Drag context */
- GtkDragSourceInfo *proxy_source; /* Set if this is a proxy drag */
- GtkSelectionData *proxy_data; /* Set while retrieving proxied data */
- gboolean dropped : 1; /* Set after we receive a drop */
- guint32 proxy_drop_time; /* Timestamp for proxied drop */
- gboolean proxy_drop_wait : 1; /* Set if we are waiting for a
- * status reply before sending
- * a proxied drop on.
- */
- gint drop_x, drop_y; /* Position of drop */
-};
-
-struct _GtkDragSourceInfo
-{
- GtkWidget *widget;
- GtkTargetList *target_list; /* Targets for drag data */
- GdkDragAction possible_actions; /* Actions allowed by source */
- GdkDragContext *context; /* drag context */
- GtkWidget *icon_window; /* Window for drag */
- GtkWidget *ipc_widget; /* GtkInvisible for grab, message passing */
- GdkCursor *cursor; /* Cursor for drag */
- gint hot_x, hot_y; /* Hot spot for drag */
- gint button; /* mouse button starting drag */
-
- GtkDragStatus status; /* drag status */
- GdkEvent *last_event; /* motion event waiting for response */
-
- gint start_x, start_y; /* Initial position */
- gint cur_x, cur_y; /* Current Position */
-
- GList *selections; /* selections we've claimed */
-
- GtkDragDestInfo *proxy_dest; /* Set if this is a proxy drag */
-
- guint drop_timeout; /* Timeout for aborting drop */
- guint destroy_icon : 1; /* If true, destroy icon_window
- */
-};
-
-/* Drag & drop stuff. */
-/* Target */
-void e_table_drag_get_data (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- GdkAtom target,
- guint32 time)
-{
- table->drag_get_data_row = row;
- table->drag_get_data_col = col;
- gtk_drag_get_data(GTK_WIDGET(table),
- context,
- target,
- time);
-
-}
-
-void e_table_drag_highlight (ETable *table,
- int row,
- int col) /* col == -1 to highlight entire row. */
-{
-}
-
-void e_table_drag_unhighlight (ETable *table)
-{
-}
-
-void e_table_drag_dest_set (ETable *table,
- GtkDestDefaults flags,
- const GtkTargetEntry *targets,
- gint n_targets,
- GdkDragAction actions)
-{
- gtk_drag_dest_set(GTK_WIDGET(table),
- flags,
- targets,
- n_targets,
- actions);
-}
-
-void e_table_drag_dest_set_proxy (ETable *table,
- GdkWindow *proxy_window,
- GdkDragProtocol protocol,
- gboolean use_coordinates)
-{
- gtk_drag_dest_set_proxy(GTK_WIDGET(table),
- proxy_window,
- protocol,
- use_coordinates);
-}
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-void e_table_drag_dest_unset (GtkWidget *widget)
-{
- gtk_drag_dest_unset(widget);
-}
-
-/* Source side */
-
-void e_table_drag_source_set (ETable *table,
- GdkModifierType start_button_mask,
- const GtkTargetEntry *targets,
- gint n_targets,
- GdkDragAction actions)
-{
- ETableDragSourceSite *site;
- GtkWidget *canvas = GTK_WIDGET(table->table_canvas);
-
- g_return_if_fail (table != NULL);
-
- site = table->site;
-
- gtk_widget_add_events (canvas,
- gtk_widget_get_events (canvas) |
- GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
- GDK_BUTTON_MOTION_MASK);
-
- if (site) {
- if (site->target_list)
- gtk_target_list_unref (site->target_list);
- } else {
- site = g_new0 (ETableDragSourceSite, 1);
-
- table->drag_source_button_press_event_id =
- gtk_signal_connect (GTK_OBJECT (canvas), "button_press_event",
- GTK_SIGNAL_FUNC (e_table_drag_source_event_cb),
- table);
- table->drag_source_motion_notify_event_id =
- gtk_signal_connect (GTK_OBJECT (canvas), "motion_notify_event",
- GTK_SIGNAL_FUNC (e_table_drag_source_event_cb),
- table);
-
- table->site = site;
- }
-
- site->start_button_mask = start_button_mask;
-
- if (targets)
- site->target_list = gtk_target_list_new (targets, n_targets);
- else
- site->target_list = NULL;
-
- site->actions = actions;
-}
-
-void e_table_drag_source_unset (ETable *table)
-{
- ETableDragSourceSite *site;
-
- g_return_if_fail (table != NULL);
-
- site = table->site;
-
- if (site) {
- gtk_signal_disconnect (GTK_OBJECT (table->table_canvas), table->drag_source_button_press_event_id);
- gtk_signal_disconnect (GTK_OBJECT (table->table_canvas), table->drag_source_motion_notify_event_id);
- g_free(site);
- table->site = NULL;
- }
-}
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-GdkDragContext *
-e_table_drag_begin (ETable *table,
- int row,
- int col,
- GtkTargetList *targets,
- GdkDragAction actions,
- gint button,
- GdkEvent *event)
-{
- table->drag_row = row;
- table->drag_col = col;
-
- return gtk_drag_begin(GTK_WIDGET(table),
- targets,
- actions,
- button,
- event);
-}
-
-static void
-e_table_compute_location(ETable *table,
- GtkWidget *widget,
- int x,
- int y,
- int *row,
- int *col)
-{
- if (!(row || col))
- return;
- e_table_group_compute_location(table->group, &x, &y, row, col);
-}
-
-static void
-et_drag_begin (GtkWidget *widget,
- GdkDragContext *context,
- ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_BEGIN],
- et->drag_row,
- et->drag_col,
- context);
-}
-
-static void
-et_drag_end (GtkWidget *widget,
- GdkDragContext *context,
- ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_END],
- et->drag_row,
- et->drag_col,
- context);
-}
-
-static void
-et_drag_data_get(GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_DATA_GET],
- et->drag_row,
- et->drag_col,
- context,
- selection_data,
- info,
- time);
-}
-
-static void
-et_drag_data_delete(GtkWidget *widget,
- GdkDragContext *context,
- ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_DATA_DELETE],
- et->drag_row,
- et->drag_col,
- context);
-}
-
-static void
-et_drag_leave(GtkWidget *widget,
- GdkDragContext *context,
- guint time,
- ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_LEAVE],
- et->drop_row,
- et->drop_col,
- context,
- time);
- et->drop_row = -1;
- et->drop_col = -1;
-}
-
-static gboolean
-et_drag_motion(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- ETable *et)
-{
- gboolean ret_val;
- int row, col;
- e_table_compute_location(et,
- widget,
- x,
- y,
- &row,
- &col);
- if (et->drop_row >= 0 && et->drop_col >= 0 &&
- row != et->drop_row && col != et->drop_row) {
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_LEAVE],
- et->drop_row,
- et->drop_col,
- context,
- time);
- }
- et->drop_row = row;
- et->drop_col = col;
- if (row >= 0 && col >= 0)
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_MOTION],
- et->drop_row,
- et->drop_col,
- context,
- x,
- y,
- time,
- &ret_val);
- return ret_val;
-}
-
-static gboolean
-et_drag_drop(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- ETable *et)
-{
- gboolean ret_val;
- int row, col;
- e_table_compute_location(et,
- widget,
- x,
- y,
- &row,
- &col);
- if (et->drop_row >= 0 && et->drop_col >= 0 &&
- row != et->drop_row && col != et->drop_row) {
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_LEAVE],
- et->drop_row,
- et->drop_col,
- context,
- time);
- if (row >= 0 && col >= 0)
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_MOTION],
- row,
- col,
- context,
- x,
- y,
- time,
- &ret_val);
- }
- et->drop_row = row;
- et->drop_col = col;
- if (row >= 0 && col >= 0)
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_DROP],
- et->drop_row,
- et->drop_col,
- context,
- x,
- y,
- time,
- &ret_val);
- et->drop_row = -1;
- et->drop_col = -1;
- return ret_val;
-}
-
-static void
-et_drag_data_received(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETable *et)
-{
- int row, col;
- e_table_compute_location(et,
- widget,
- x,
- y,
- &row,
- &col);
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_MOTION],
- row,
- col,
- context,
- x,
- y,
- selection_data,
- info,
- time);
-}
-
-static gint
-e_table_drag_source_event_cb (GtkWidget *widget,
- GdkEvent *event,
- ETable *table)
-{
- ETableDragSourceSite *site;
- site = table->site;
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- if ((GDK_BUTTON1_MASK << (event->button.button - 1)) & site->start_button_mask) {
- int row, col;
- e_table_compute_location(table, widget, event->button.x, event->button.y, &row, &col);
- if (row >= 0 && col >= 0) {
- site->state |= (GDK_BUTTON1_MASK << (event->button.button - 1));
- site->x = event->button.x;
- site->y = event->button.y;
- site->row = row;
- site->col = col;
- }
- }
- break;
-
- case GDK_BUTTON_RELEASE:
- if ((GDK_BUTTON1_MASK << (event->button.button - 1)) & site->start_button_mask) {
- site->state &= ~(GDK_BUTTON1_MASK << (event->button.button - 1));
- }
- break;
-
- case GDK_MOTION_NOTIFY:
- if (site->state & event->motion.state & site->start_button_mask) {
- /* FIXME: This is really broken and can leave us
- * with a stuck grab
- */
- int i;
- for (i=1; i<6; i++) {
- if (site->state & event->motion.state &
- GDK_BUTTON1_MASK << (i - 1))
- break;
- }
-
- if (MAX (abs (site->x - event->motion.x),
- abs (site->y - event->motion.y)) > 3) {
- GtkDragSourceInfo *info;
- GdkDragContext *context;
-
- site->state = 0;
- context = e_table_drag_begin (table, site->row, site->col,
- site->target_list,
- site->actions,
- i, event);
-
-
- info = g_dataset_get_data (context, "gtk-info");
-
- if (!info->icon_window) {
- if (site->pixmap)
- gtk_drag_set_icon_pixmap (context,
- site->colormap,
- site->pixmap,
- site->mask, -2, -2);
- else
- gtk_drag_set_icon_default (context);
- }
-
- return TRUE;
- }
- }
- break;
-
- default: /* hit for 2/3BUTTON_PRESS */
- break;
- }
- return FALSE;
-}
-
-static void
-e_table_class_init (GtkObjectClass *object_class)
-{
- ETableClass *klass = E_TABLE_CLASS(object_class);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(object_class);
-
- e_table_parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = et_destroy;
- object_class->set_arg = et_set_arg;
- object_class->get_arg = et_get_arg;
-
- klass->cursor_change = NULL;
- klass->double_click = NULL;
- klass->right_click = NULL;
- klass->key_press = NULL;
-
- klass->table_drag_begin = NULL;
- klass->table_drag_end = NULL;
- klass->table_drag_data_get = NULL;
- klass->table_drag_data_delete = NULL;
-
- klass->table_drag_leave = NULL;
- klass->table_drag_motion = NULL;
- klass->table_drag_drop = NULL;
- klass->table_drag_data_received = NULL;
-
- et_signals [CURSOR_CHANGE] =
- gtk_signal_new ("cursor_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, cursor_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- et_signals [DOUBLE_CLICK] =
- gtk_signal_new ("double_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, double_click),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- et_signals [RIGHT_CLICK] =
- gtk_signal_new ("right_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, right_click),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- et_signals [KEY_PRESS] =
- gtk_signal_new ("key_press",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, key_press),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- et_signals[TABLE_DRAG_BEGIN] =
- gtk_signal_new ("table_drag_begin",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_begin),
- gtk_marshal_NONE__INT_INT_POINTER,
- GTK_TYPE_NONE, 3,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT);
- et_signals[TABLE_DRAG_END] =
- gtk_signal_new ("table_drag_end",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_end),
- gtk_marshal_NONE__INT_INT_POINTER,
- GTK_TYPE_NONE, 3,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT);
- et_signals[TABLE_DRAG_DATA_GET] =
- gtk_signal_new ("table_drag_data_get",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_data_get),
- e_marshal_NONE__INT_INT_POINTER_POINTER_UINT_UINT,
- GTK_TYPE_NONE, 6,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT,
- GTK_TYPE_SELECTION_DATA,
- GTK_TYPE_UINT,
- GTK_TYPE_UINT);
- et_signals[TABLE_DRAG_DATA_DELETE] =
- gtk_signal_new ("table_drag_data_delete",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_data_delete),
- gtk_marshal_NONE__INT_INT_POINTER,
- GTK_TYPE_NONE, 3,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT);
-
- et_signals[TABLE_DRAG_LEAVE] =
- gtk_signal_new ("table_drag_leave",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_leave),
- e_marshal_NONE__INT_INT_POINTER_UINT,
- GTK_TYPE_NONE, 4,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT,
- GTK_TYPE_UINT);
- et_signals[TABLE_DRAG_MOTION] =
- gtk_signal_new ("table_drag_motion",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_motion),
- e_marshal_BOOL__INT_INT_POINTER_INT_INT_UINT,
- GTK_TYPE_BOOL, 6,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_UINT);
- et_signals[TABLE_DRAG_DROP] =
- gtk_signal_new ("table_drag_drop",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_drop),
- e_marshal_BOOL__INT_INT_POINTER_INT_INT_UINT,
- GTK_TYPE_BOOL, 6,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_UINT);
- et_signals[TABLE_DRAG_DATA_RECEIVED] =
- gtk_signal_new ("table_drag_data_received",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_data_received),
- e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_UINT_UINT,
- GTK_TYPE_NONE, 8,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_SELECTION_DATA,
- GTK_TYPE_UINT,
- GTK_TYPE_UINT);
-
- gtk_object_class_add_signals (object_class, et_signals, LAST_SIGNAL);
-
- klass->set_scroll_adjustments = set_scroll_adjustments;
-
- widget_class->set_scroll_adjustments_signal =
- gtk_signal_new ("set_scroll_adjustments",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, set_scroll_adjustments),
- gtk_marshal_NONE__POINTER_POINTER,
- GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
-
- gtk_object_add_arg_type ("ETable::drawgrid", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_TABLE_DRAW_GRID);
- gtk_object_add_arg_type ("ETable::drawfocus", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_TABLE_DRAW_FOCUS);
- gtk_object_add_arg_type ("ETable::cursor_mode", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_CURSOR_MODE);
- gtk_object_add_arg_type ("ETable::length_threshold", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
- gtk_object_add_arg_type ("ETable::click_to_add_message", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_CLICK_TO_ADD_MESSAGE);
-}
-
-E_MAKE_TYPE(e_table, "ETable", ETable, e_table_class_init, e_table_init, PARENT_TYPE);
-
diff --git a/widgets/e-table/e-table.h b/widgets/e-table/e-table.h
deleted file mode 100644
index 19dcbfecc8..0000000000
--- a/widgets/e-table/e-table.h
+++ /dev/null
@@ -1,252 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_H_
-#define _E_TABLE_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gtk/gtktable.h>
-#include <gnome-xml/tree.h>
-#include "e-table-model.h"
-#include "e-table-header.h"
-#include "e-table-group.h"
-#include "e-table-sort-info.h"
-#include "e-table-item.h"
-#include "e-table-selection-model.h"
-#include "e-util/e-printable.h"
-
-BEGIN_GNOME_DECLS
-
-#define E_TABLE_TYPE (e_table_get_type ())
-#define E_TABLE(o) (GTK_CHECK_CAST ((o), E_TABLE_TYPE, ETable))
-#define E_TABLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_TYPE, ETableClass))
-#define E_IS_TABLE(o) (GTK_CHECK_TYPE ((o), E_TABLE_TYPE))
-#define E_IS_TABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_TYPE))
-
-typedef struct _ETableDragSourceSite ETableDragSourceSite;
-
-typedef enum {
- E_TABLE_CURSOR_LOC_NONE = 0,
- E_TABLE_CURSOR_LOC_ETCTA = 1 << 0,
- E_TABLE_CURSOR_LOC_TABLE = 1 << 1,
-} ETableCursorLoc;
-
-typedef struct {
- GtkTable parent;
-
- ETableModel *model;
-
- ETableHeader *full_header, *header;
-
- GnomeCanvasItem *canvas_vbox;
- ETableGroup *group;
-
- ETableSortInfo *sort_info;
- ETableSorter *sorter;
-
- ETableSelectionModel *selection;
- ETableCursorLoc cursor_loc;
-
- int table_model_change_id;
- int table_row_change_id;
- int table_cell_change_id;
- int table_row_inserted_id;
- int table_row_deleted_id;
-
- int group_info_change_id;
-
- int reflow_idle_id;
-
- GnomeCanvas *header_canvas, *table_canvas;
-
- GnomeCanvasItem *header_item, *root;
-
- gint length_threshold;
-
- gint rebuild_idle_id;
- guint need_rebuild:1;
-
- /*
- * Configuration settings
- */
- guint draw_grid : 1;
- guint draw_focus : 1;
- guint row_selection_active : 1;
-
- char *click_to_add_message;
- GnomeCanvasItem *click_to_add;
- gboolean use_click_to_add;
-
- ETableCursorMode cursor_mode;
-
- int drag_get_data_row;
- int drag_get_data_col;
-
- int drop_row;
- int drop_col;
-
- int drag_row;
- int drag_col;
- ETableDragSourceSite *site;
-
- int drag_source_button_press_event_id;
- int drag_source_motion_notify_event_id;
-} ETable;
-
-typedef struct {
- GtkTableClass parent_class;
-
- void (*cursor_change) (ETable *et, int row);
- void (*double_click) (ETable *et, int row);
- gint (*right_click) (ETable *et, int row, int col, GdkEvent *event);
- gint (*key_press) (ETable *et, int row, int col, GdkEvent *event);
-
- void (*set_scroll_adjustments) (ETable *table,
- GtkAdjustment *hadjustment,
- GtkAdjustment *vadjustment);
-
- /* Source side drag signals */
- void (* table_drag_begin) (ETable *table,
- int row,
- int col,
- GdkDragContext *context);
- void (* table_drag_end) (ETable *table,
- int row,
- int col,
- GdkDragContext *context);
- void (* table_drag_data_get) (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time);
- void (* table_drag_data_delete) (ETable *table,
- int row,
- int col,
- GdkDragContext *context);
-
- /* Target side drag signals */
- void (* table_drag_leave) (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- guint time);
- gboolean (* table_drag_motion) (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time);
- gboolean (* table_drag_drop) (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time);
- void (* table_drag_data_received) (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *selection_data,
- guint info,
- guint time);
-} ETableClass;
-
-GtkType e_table_get_type (void);
-
-ETable *e_table_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
- const char *spec);
-GtkWidget *e_table_new (ETableHeader *full_header, ETableModel *etm,
- const char *spec);
-
-ETable *e_table_construct_from_spec_file (ETable *e_table,
- ETableHeader *full_header,
- ETableModel *etm,
- const char *filename);
-GtkWidget *e_table_new_from_spec_file (ETableHeader *full_header,
- ETableModel *etm,
- const char *filename);
-
-gchar *e_table_get_specification (ETable *e_table);
-void e_table_save_specification (ETable *e_table, gchar *filename);
-
-void e_table_set_cursor_row (ETable *e_table,
- int row);
-/* -1 means we don't have the cursor. */
-int e_table_get_cursor_row (ETable *e_table);
-void e_table_selected_row_foreach (ETable *e_table,
- ETableForeachFunc callback,
- gpointer closure);
-EPrintable *e_table_get_printable (ETable *e_table);
-
-gint e_table_get_next_row (ETable *e_table,
- gint model_row);
-gint e_table_get_prev_row (ETable *e_table,
- gint model_row);
-
-gint e_table_model_to_view_row (ETable *e_table,
- gint model_row);
-gint e_table_view_to_model_row (ETable *e_table,
- gint view_row);
-
-
-/* Drag & drop stuff. */
-/* Target */
-void e_table_drag_get_data (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- GdkAtom target,
- guint32 time);
-
-void e_table_drag_highlight (ETable *table,
- int row,
- int col); /* col == -1 to highlight entire row. */
-void e_table_drag_unhighlight (ETable *table);
-
-void e_table_drag_dest_set (ETable *table,
- GtkDestDefaults flags,
- const GtkTargetEntry *targets,
- gint n_targets,
- GdkDragAction actions);
-
-void e_table_drag_dest_set_proxy (ETable *table,
- GdkWindow *proxy_window,
- GdkDragProtocol protocol,
- gboolean use_coordinates);
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-void e_table_drag_dest_unset (GtkWidget *widget);
-
-/* Source side */
-
-void e_table_drag_source_set (ETable *table,
- GdkModifierType start_button_mask,
- const GtkTargetEntry *targets,
- gint n_targets,
- GdkDragAction actions);
-
-void e_table_drag_source_unset (ETable *table);
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-GdkDragContext *e_table_drag_begin (ETable *table,
- int row,
- int col,
- GtkTargetList *targets,
- GdkDragAction actions,
- gint button,
- GdkEvent *event);
-
-END_GNOME_DECLS
-
-#endif /* _E_TABLE_H_ */
-
diff --git a/widgets/e-table/e-tree-example-1.c b/widgets/e-table/e-tree-example-1.c
deleted file mode 100644
index 308f462f64..0000000000
--- a/widgets/e-table/e-tree-example-1.c
+++ /dev/null
@@ -1,403 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* This code is GPL. */
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-tree.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-#include "e-tree-simple.h"
-#include "libgnomeprint/gnome-print.h"
-#include "libgnomeprint/gnome-print-preview.h"
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "tree-expanded.xpm"
-#include "tree-unexpanded.xpm"
-
-GdkPixbuf *tree_expanded_pixbuf;
-GdkPixbuf *tree_unexpanded_pixbuf;
-
-#define COLS 4
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/*
- * Here we define the initial layout of the table. This is an xml
- * format that allows you to change the initial ordering of the
- * columns or to do sorting or grouping initially. This specification
- * shows all 5 columns, but moves the importance column nearer to the
- * front. It also sorts by the "Full Name" column (ascending.)
- * Sorting and grouping take the model column as their arguments
- * (sorting is specified by the "column" argument to the leaf elemnt.
- */
-
-#define INITIAL_SPEC "<ETableSpecification> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 4 </column> \
- <column> 1 </column> \
- <column> 2 </column> \
- <column> 3 </column> \
- </columns-shown> \
- <grouping></grouping> \
-</ETableSpecification>"
-
-/*
- * Virtual Column list:
- * 0 Subject
- * 1 Full Name
- * 2 Email
- * 3 Date
- */
-char *headers [COLS] = {
- "Subject",
- "Full Name",
- "Email",
- "Date"
-};
-
-GtkWidget *e_table;
-
-/*
- * ETreeSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/* This function returns the value at a particular point in our ETreeModel. */
-static void *
-my_value_at (ETreeModel *etm, ETreePath *path, int col, void *model_data)
-{
- switch (col) {
- case 0: return e_tree_model_node_get_data (etm, path);
- case 1: return "Chris Toshok";
- case 2: return "toshok@helixcode.com";
- case 3: return "Jun 07 2000";
- default: return NULL;
- }
-}
-
-static GdkPixbuf *
-my_icon_at (ETreeModel *etm, ETreePath *path, void *model_data)
-{
- if (e_tree_model_node_is_expanded (etm, path))
- return tree_expanded_pixbuf;
- else
- return tree_unexpanded_pixbuf;
-}
-
-/* This function sets the value at a particular point in our ETreeModel. */
-static void
-my_set_value_at (ETreeModel *etm, ETreePath *path, int col, const void *val, void *model_data)
-{
- if (col == 0) {
- char *str = e_tree_model_node_get_data (etm, path);
- g_free (str);
- e_tree_model_node_set_data (etm, path, g_strdup(val));
- }
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-my_is_editable (ETreeModel *etm, ETreePath *path, int col, void *model_data)
-{
- if (col == 0)
- return TRUE;
- else
- return FALSE;
-}
-
-static void
-toggle_root (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = (ETreeModel*)data;
- e_tree_model_root_node_set_visible (e_tree_model, !e_tree_model_root_node_is_visible (e_tree_model));
-}
-
-static void
-add_sibling (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = E_TREE_MODEL (data);
- int selected_row;
- ETreePath *selected_node;
- ETreePath *parent_node;
-
- selected_row = e_table_get_cursor_row (E_TABLE (e_table));
- if (selected_row == -1)
- return;
-
- selected_node = e_tree_model_node_at_row (e_tree_model, selected_row);
- g_assert (selected_node);
-
- parent_node = e_tree_model_node_get_parent (e_tree_model, selected_node);
-
- e_tree_model_node_insert_before (e_tree_model, parent_node,
- selected_node,
- g_strdup("User added sibling"));
-
-}
-
-static void
-add_child (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = E_TREE_MODEL (data);
- int selected_row;
- ETreePath *selected_node;
-
- selected_row = e_table_get_cursor_row (E_TABLE (e_table));
- if (selected_row == -1)
- return;
-
- selected_node = e_tree_model_node_at_row (e_tree_model, selected_row);
- g_assert (selected_node);
-
- e_tree_model_node_insert (e_tree_model, selected_node,
- 0,
- g_strdup("User added child"));
-}
-
-static void
-remove_node (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = E_TREE_MODEL (data);
- int selected_row;
- char *str;
- ETreePath *selected_node;
-
- selected_row = e_table_get_cursor_row (E_TABLE (e_table));
- if (selected_row == -1)
- return;
-
- selected_node = e_tree_model_node_at_row (e_tree_model, selected_row);
- g_assert (selected_node);
-
- if (e_tree_model_node_get_children (e_tree_model, selected_node, NULL) > 0)
- return;
-
- str = (char*)e_tree_model_node_remove (e_tree_model, selected_node);
- printf ("removed node %s\n", str);
- g_free (str);
-}
-
-static void
-expand_all (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = E_TREE_MODEL (data);
- int selected_row;
- ETreePath *selected_node;
-
- selected_row = e_table_get_cursor_row (E_TABLE (e_table));
- if (selected_row == -1)
- return;
-
- selected_node = e_tree_model_node_at_row (e_tree_model, selected_row);
- g_assert (selected_node);
-
- e_tree_model_node_set_expanded_recurse (e_tree_model, selected_node, TRUE);
-}
-
-static void
-collapse_all (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = E_TREE_MODEL (data);
- int selected_row;
- ETreePath *selected_node;
-
- selected_row = e_table_get_cursor_row (E_TABLE (e_table));
- if (selected_row == -1)
- return;
-
- selected_node = e_tree_model_node_at_row (e_tree_model, selected_row);
- g_assert (selected_node);
-
- e_tree_model_node_set_expanded_recurse (e_tree_model, selected_node, FALSE);
-}
-
-static void
-print_tree (GtkButton *button, gpointer data)
-{
- EPrintable *printable = e_table_get_printable (E_TABLE (e_table));
- GnomePrintContext *gpc;
-
- gpc = gnome_print_context_new (gnome_printer_new_generic_ps ("tree-out.ps"));
-
- e_printable_print_page (printable, gpc, 8*72, 10*72, FALSE);
-
- gnome_print_context_close (gpc);
-}
-
-/* We create a window containing our new tree. */
-static void
-create_tree (void)
-{
- GtkWidget *window, *frame, *button, *vbox;
- ECell *cell_left_just;
- ECell *cell_tree;
- ETableHeader *e_table_header;
- int i, j;
- ETreeModel *e_tree_model = NULL;
- ETreePath *root_node;
-
- /* here we create our model. This uses the functions we defined
- earlier. */
- e_tree_model = e_tree_simple_new (my_icon_at,
- my_value_at,
- my_set_value_at,
- my_is_editable,
- NULL);
-
- /* create a root node with 5 children */
- root_node = e_tree_model_node_insert (e_tree_model, NULL,
- 0,
- g_strdup("Root Node"));
-
- for (i = 0; i < 5; i++){
- ETreePath *n = e_tree_model_node_insert (e_tree_model,
- root_node, 0,
- g_strdup("First level of children"));
- for (j = 0; j < 5; j ++) {
- e_tree_model_node_insert (e_tree_model,
- n, 0,
- g_strdup("Second level of children"));
- }
- }
-
- /*
- * Next we create a header. The ETableHeader is used in two
- * different way. The first is the full_header. This is the
- * list of possible columns in the view. The second use is
- * completely internal. Many of the ETableHeader functions are
- * for that purpose. The only functions we really need are
- * e_table_header_new and e_table_header_add_col.
- *
- * First we create the header.
- */
- e_table_header = e_table_header_new ();
-
- /*
- * Next we have to build renderers for all of the columns.
- * Since all our columns are text columns, we can simply use
- * the same renderer over and over again. If we had different
- * types of columns, we could use a different renderer for
- * each column.
- */
- cell_left_just = e_cell_text_new (E_TABLE_MODEL(e_tree_model), NULL, GTK_JUSTIFY_LEFT);
-
- /*
- * This renderer is used for the tree column (the leftmost one), and
- * has as its subcell renderer the text renderer. this means that
- * text is displayed to the right of the tree pipes.
- */
- cell_tree = e_cell_tree_new (E_TABLE_MODEL(e_tree_model),
- tree_expanded_pixbuf, tree_unexpanded_pixbuf,
- TRUE, cell_left_just);
-
- /*
- * Next we create a column object for each view column and add
- * them to the header. We don't create a column object for
- * the importance column since it will not be shown.
- */
- for (i = 0; i < COLS; i++) {
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, headers [i],
- 80, 20,
- i == 0 ? cell_tree
- : cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /*
- * Here we create a window for our new table. This window
- * will get shown and the person will be able to test their
- * item.
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
- /* This frame is simply to get a bevel around our table. */
- vbox = gtk_vbox_new (FALSE, 0);
- frame = gtk_frame_new (NULL);
-
- /*
- * 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.
- */
- e_table = e_table_new (e_table_header, E_TABLE_MODEL(e_tree_model), INITIAL_SPEC);
-
- if (!e_table) printf ("BAH!");
-
- /* Build the gtk widget hierarchy. */
- gtk_container_add (GTK_CONTAINER (frame), e_table);
- gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
-
- button = gtk_button_new_with_label ("Toggle Root Node");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", toggle_root, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Add Sibling");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", add_sibling, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Add Child");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", add_child, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Remove Node");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", remove_node, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Expand All Below");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", expand_all, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Collapse All Below");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", collapse_all, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Print Tree");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", print_tree, e_tree_model);
- gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- gtk_container_add (GTK_CONTAINER (window), vbox);
-
- /* Size the initial window. */
- gtk_widget_set_usize (window, 200, 200);
-
- /* Show it all. */
- gtk_widget_show_all (window);
-}
-
-/* This is the main function which just initializes gnome and call our create_tree function */
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- /*
- * Create our pixbuf for expanding/unexpanding
- */
- tree_expanded_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)tree_expanded_xpm);
- tree_unexpanded_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)tree_unexpanded_xpm);
-
- create_tree ();
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
-
diff --git a/widgets/e-table/e-tree-model.c b/widgets/e-table/e-tree-model.c
deleted file mode 100644
index c57bf2d683..0000000000
--- a/widgets/e-table/e-tree-model.c
+++ /dev/null
@@ -1,760 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-model.c: a Tree Model
- *
- * Author:
- * Chris Toshok (toshok@helixcode.com)
- *
- * Adapted from the gtree code and ETableModel.
- *
- * (C) 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <stdlib.h>
-#include "e-util/e-util.h"
-#include "e-tree-model.h"
-
-#define ETM_CLASS(e) ((ETreeModelClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE E_TABLE_MODEL_TYPE
-
-static ETableModel *e_tree_model_parent_class;
-
-typedef struct {
- gboolean expanded;
- guint visible_descendents;
- gpointer node_data;
-} ENode;
-
-enum {
- NODE_CHANGED,
- NODE_INSERTED,
- NODE_REMOVED,
- LAST_SIGNAL
-};
-
-static guint e_tree_model_signals [LAST_SIGNAL] = {0, };
-
-static void add_visible_descendents_to_array (ETreeModel *etm, GNode *gnode, int *row, int *count);
-
-
-/* virtual methods */
-
-static void
-etree_destroy (GtkObject *object)
-{
- ETreeModel *etree = E_TREE_MODEL (object);
-
- /* XXX lots of stuff to free here */
- g_array_free (etree->row_array, TRUE);
-
- GTK_OBJECT_CLASS (e_tree_model_parent_class)->destroy (object);
-}
-
-static ETreePath*
-etree_get_root (ETreeModel *etm)
-{
- return etm->root;
-}
-
-static ETreePath*
-etree_get_parent (ETreeModel *etm, ETreePath *path)
-{
- g_return_val_if_fail (path, NULL);
-
- return path->parent;
-}
-
-static ETreePath*
-etree_get_next (ETreeModel *etm, ETreePath *node)
-{
- g_return_val_if_fail (node, NULL);
-
- return g_node_next_sibling(node);
-}
-
-static ETreePath*
-etree_get_prev (ETreeModel *etm, ETreePath *node)
-{
- g_return_val_if_fail (node, NULL);
-
- return g_node_prev_sibling (node);
-}
-
-static guint
-etree_get_children (ETreeModel *etm, ETreePath* node, ETreePath ***paths)
-{
- guint n_children;
-
- g_return_val_if_fail (node, 0);
-
- n_children = g_node_n_children (node);
-
- if (paths) {
- int i;
- (*paths) = g_malloc (sizeof (ETreePath*) * n_children);
- for (i = 0; i < n_children; i ++) {
- (*paths)[i] = g_node_nth_child (node, i);
- }
- }
-
- return n_children;
-}
-
-static gboolean
-etree_is_expanded (ETreeModel *etm, ETreePath* node)
-{
- g_return_val_if_fail (node && node->data, FALSE);
-
- return ((ENode*)node->data)->expanded;
-}
-
-static gboolean
-etree_is_visible (ETreeModel *etm, ETreePath* node)
-{
- g_return_val_if_fail (node, FALSE);
-
- for (node = node->parent; node; node = node->parent) {
- if (!((ENode*)node->data)->expanded)
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-etree_set_expanded (ETreeModel *etm, ETreePath* node, gboolean expanded)
-{
- GNode *child;
- ENode *enode;
- int row;
-
- g_return_if_fail (node && node->data);
-
- enode = ((ENode*)node->data);
-
- if (enode->expanded == expanded)
- return;
-
- enode->expanded = expanded;
-
- /* if the node wasn't visible at present */
- if ((row = e_tree_model_row_of_node (etm, node)) == -1)
- return;
-
- row++;
-
- if (expanded) {
- GNode *parent;
-
- if (e_tree_model_node_is_visible (etm, node)) {
- enode->visible_descendents = 0;
- for (child = g_node_first_child (node); child;
- child = g_node_next_sibling (child)) {
- add_visible_descendents_to_array (etm, child, &row, &enode->visible_descendents);
- }
- }
- /* now iterate back up the tree, adding to our
- ancestors' visible descendents */
-
- for (parent = node->parent; parent; parent = parent->parent) {
- ENode *parent_enode = (ENode*)parent->data;
- parent_enode->visible_descendents += enode->visible_descendents;
- }
- }
- else {
- int i;
- GNode *parent;
-
- if (e_tree_model_node_is_visible (etm, node)) {
- for (i = 0; i < enode->visible_descendents; i ++) {
- etm->row_array = g_array_remove_index (etm->row_array, row);
- e_table_model_row_deleted (E_TABLE_MODEL (etm), row);
- }
- }
- /* now iterate back up the tree, subtracting from our
- ancestors' visible descendents */
-
- for (parent = node->parent; parent; parent = parent->parent) {
- ENode *parent_enode = (ENode*)parent->data;
-
- parent_enode->visible_descendents -= enode->visible_descendents;
- }
-
- enode->visible_descendents = 0;
- }
-}
-
-/* fairly naive implementation */
-static void
-etree_set_expanded_recurse (ETreeModel *etm, ETreePath* node, gboolean expanded)
-{
- ETreePath **paths;
- guint num_children;
- int i;
-
- e_tree_model_node_set_expanded (etm, node, expanded);
-
- num_children = e_tree_model_node_get_children (etm, node, &paths);
- if (num_children) {
- for (i = 0; i < num_children; i ++) {
- e_tree_model_node_set_expanded_recurse (etm, paths[i], expanded);
- }
-
- g_free (paths);
- }
-}
-
-static ETreePath *
-etree_node_at_row (ETreeModel *etree, int row)
-{
- g_return_val_if_fail (row < etree->row_array->len, NULL);
-
- return g_array_index (etree->row_array, GNode*, row);
-}
-
-
-/* ETable analogs */
-static void*
-etree_value_at (ETreeModel *etm, ETreePath* node, int col)
-{
- /* shouldn't be called */
- g_assert (0);
- return NULL;
-}
-
-static GdkPixbuf*
-etree_icon_at (ETreeModel *etm, ETreePath* node)
-{
- /* shouldn't be called */
- g_assert (0);
- return NULL;
-}
-
-static void
-etree_set_value_at (ETreeModel *etm, ETreePath* node, int col, const void *val)
-{
- /* shouldn't be called */
- g_assert (0);
-}
-
-static gboolean
-etree_is_editable (ETreeModel *etm, ETreePath* node, int col)
-{
- /* shouldn't be called */
- g_assert(0);
- return FALSE;
-}
-
-
-/* ETable virtual functions we map */
-static int
-etable_row_count (ETableModel *etm)
-{
- ETreeModel *tree = E_TREE_MODEL (etm);
- return tree->row_array->len;
-}
-
-static void *
-etable_value_at (ETableModel *etm, int col, int row)
-{
- ETreeModel *etree = E_TREE_MODEL(etm);
- ETreeModelClass *et_class = ETM_CLASS(etm);
- ETreePath* node = e_tree_model_node_at_row (etree, row);
-
- g_return_val_if_fail (node, NULL);
-
- if (col == -1)
- return node;
- else if (col == -2)
- return etm;
- else
- return et_class->value_at (etree, node, col);
-}
-
-static void
-etable_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
- ETreeModel *etree = E_TREE_MODEL(etm);
- ETreeModelClass *et_class = ETM_CLASS(etm);
- ETreePath* node = e_tree_model_node_at_row (etree, row);
-
- g_return_if_fail (node);
-
- et_class->set_value_at (etree, node, col, val);
-}
-
-static gboolean
-etable_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ETreeModel *etree = E_TREE_MODEL(etm);
- ETreeModelClass *et_class = ETM_CLASS(etm);
- ETreePath* node = e_tree_model_node_at_row (etree, row);
-
- g_return_val_if_fail (node, FALSE);
-
- return et_class->is_editable (etree, node, col);
-}
-
-
-static void
-e_tree_model_class_init (GtkObjectClass *klass)
-{
- ETableModelClass *table_class = (ETableModelClass *) klass;
- ETreeModelClass *tree_class = (ETreeModelClass *) klass;
-
- e_tree_model_parent_class = gtk_type_class (PARENT_TYPE);
-
- klass->destroy = etree_destroy;
-
- e_tree_model_signals [NODE_CHANGED] =
- gtk_signal_new ("node_changed",
- GTK_RUN_LAST,
- klass->type,
- GTK_SIGNAL_OFFSET (ETreeModelClass, node_changed),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1, GTK_TYPE_POINTER);
-
- e_tree_model_signals [NODE_INSERTED] =
- gtk_signal_new ("node_inserted",
- GTK_RUN_LAST,
- klass->type,
- GTK_SIGNAL_OFFSET (ETreeModelClass, node_inserted),
- gtk_marshal_NONE__POINTER_POINTER,
- GTK_TYPE_NONE, 2, GTK_TYPE_POINTER, GTK_TYPE_POINTER);
-
- e_tree_model_signals [NODE_REMOVED] =
- gtk_signal_new ("node_removed",
- GTK_RUN_LAST,
- klass->type,
- GTK_SIGNAL_OFFSET (ETreeModelClass, node_removed),
- gtk_marshal_NONE__POINTER_POINTER,
- GTK_TYPE_NONE, 2, GTK_TYPE_POINTER, GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (klass, e_tree_model_signals, LAST_SIGNAL);
-
- table_class->row_count = etable_row_count;
- table_class->value_at = etable_value_at;
- table_class->set_value_at = etable_set_value_at;
- table_class->is_cell_editable = etable_is_cell_editable;
-#if 0
- /* XX need to pass these through */
- table_class->duplicate_value = etable_duplicate_value;
- table_class->free_value = etable_free_value;
- table_class->initialize_value = etable_initialize_value;
- table_class->value_is_empty = etable_value_is_empty;
- table_class->value_to_string = etable_value_to_string;
- table_class->thaw = etable_thaw;
-#endif
-
- tree_class->get_root = etree_get_root;
- tree_class->get_prev = etree_get_prev;
- tree_class->get_next = etree_get_next;
- tree_class->get_parent = etree_get_parent;
-
- tree_class->value_at = etree_value_at;
- tree_class->icon_at = etree_icon_at;
- tree_class->set_value_at = etree_set_value_at;
- tree_class->is_editable = etree_is_editable;
-
- tree_class->get_children = etree_get_children;
- tree_class->is_expanded = etree_is_expanded;
- tree_class->is_visible = etree_is_visible;
- tree_class->set_expanded = etree_set_expanded;
- tree_class->set_expanded_recurse = etree_set_expanded_recurse;
- tree_class->node_at_row = etree_node_at_row;
-}
-
-E_MAKE_TYPE(e_tree_model, "ETreeModel", ETreeModel, e_tree_model_class_init, NULL, PARENT_TYPE)
-
-
-/* signals */
-void
-e_tree_model_node_changed (ETreeModel *tree_model, ETreePath *node)
-{
- g_return_if_fail (tree_model != NULL);
- g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-
- gtk_signal_emit (GTK_OBJECT (tree_model),
- e_tree_model_signals [NODE_CHANGED]);
-}
-
-void
-e_tree_model_node_inserted (ETreeModel *tree_model,
- ETreePath *parent_node,
- ETreePath *inserted_node)
-{
- g_return_if_fail (tree_model != NULL);
- g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-
- gtk_signal_emit (GTK_OBJECT (tree_model),
- e_tree_model_signals [NODE_INSERTED],
- parent_node, inserted_node);
-}
-
-void
-e_tree_model_node_removed (ETreeModel *tree_model, ETreePath *parent_node, ETreePath *removed_node)
-{
- g_return_if_fail (tree_model != NULL);
- g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-
- gtk_signal_emit (GTK_OBJECT (tree_model),
- e_tree_model_signals [NODE_REMOVED],
- parent_node, removed_node);
-}
-
-
-void
-e_tree_model_construct (ETreeModel *etree)
-{
- etree->root = NULL;
- etree->root_visible = TRUE;
- etree->row_array = g_array_new (FALSE, FALSE, sizeof(GNode*));
-}
-
-ETreeModel *
-e_tree_model_new ()
-{
- ETreeModel *et;
-
- et = gtk_type_new (e_tree_model_get_type ());
-
- return et;
-}
-
-ETreePath *
-e_tree_model_get_root (ETreeModel *etree)
-{
- return ETM_CLASS(etree)->get_root(etree);
-}
-
-ETreePath *
-e_tree_model_node_at_row (ETreeModel *etree, int row)
-{
- return ETM_CLASS(etree)->node_at_row (etree, row);
-}
-
-GdkPixbuf *
-e_tree_model_icon_of_node (ETreeModel *etree, ETreePath *path)
-{
- return ETM_CLASS(etree)->icon_at (etree, path);
-}
-
-int
-e_tree_model_row_of_node (ETreeModel *etree, ETreePath *node)
-{
- int i;
-
- for (i = 0; i < etree->row_array->len; i ++)
- if (g_array_index (etree->row_array, GNode*, i) == node)
- return i;
-
- g_warning ("e_tree_model_row_of_node failed for node %p\n", node);
-
- return -1;
-}
-
-void
-e_tree_model_root_node_set_visible (ETreeModel *etm, gboolean visible)
-{
- if (visible != etm->root_visible) {
- etm->root_visible = visible;
- if (etm->root) {
- if (visible) {
- etm->row_array = g_array_insert_val (etm->row_array, 0, etm->root);
- }
- else {
- ETreePath *root_path = e_tree_model_get_root (etm);
- e_tree_model_node_set_expanded (etm, root_path, TRUE);
- etm->row_array = g_array_remove_index (etm->row_array, 0);
- }
-
- e_table_model_changed (E_TABLE_MODEL (etm));
- }
- }
-}
-
-gboolean
-e_tree_model_root_node_is_visible (ETreeModel *etm)
-{
- return etm->root_visible;
-}
-
-
-ETreePath *
-e_tree_model_node_get_next (ETreeModel *etree, ETreePath *node)
-{
- return ETM_CLASS(etree)->get_next(etree, node);
-}
-
-ETreePath *
-e_tree_model_node_get_prev (ETreeModel *etree, ETreePath *node)
-{
- return ETM_CLASS(etree)->get_prev(etree, node);
-}
-
-guint
-e_tree_model_node_depth (ETreeModel *etree, ETreePath *path)
-{
- return g_node_depth (path) - 1;
-}
-
-ETreePath *
-e_tree_model_node_get_parent (ETreeModel *etree, ETreePath *path)
-{
- return ETM_CLASS(etree)->get_parent(etree, path);
-}
-
-gboolean
-e_tree_model_node_is_root (ETreeModel *etree, ETreePath *path)
-{
- return (e_tree_model_node_depth (etree, path) == 0);
-}
-
-gboolean
-e_tree_model_node_is_expandable (ETreeModel *etree, ETreePath *path)
-{
- return (e_tree_model_node_get_children (etree, path, NULL) > 0);
-}
-
-gboolean
-e_tree_model_node_is_expanded (ETreeModel *etree, ETreePath *path)
-{
- return ETM_CLASS(etree)->is_expanded (etree, path);
-}
-
-gboolean
-e_tree_model_node_is_visible (ETreeModel *etree, ETreePath *path)
-{
- return ETM_CLASS(etree)->is_visible (etree, path);
-}
-
-void
-e_tree_model_node_set_expanded (ETreeModel *etree, ETreePath *path, gboolean expanded)
-{
- ETM_CLASS(etree)->set_expanded (etree, path, expanded);
-}
-
-void
-e_tree_model_node_set_expanded_recurse (ETreeModel *etree, ETreePath *path, gboolean expanded)
-{
- ETM_CLASS(etree)->set_expanded_recurse (etree, path, expanded);
-}
-
-guint
-e_tree_model_node_get_children (ETreeModel *etree, ETreePath *path, ETreePath ***paths)
-{
- return ETM_CLASS(etree)->get_children (etree, path, paths);
-}
-
-guint
-e_tree_model_node_num_visible_descendents (ETreeModel *etm, ETreePath *node)
-{
- ENode *enode = (ENode*)node->data;
-
- return enode->visible_descendents;
-}
-
-gpointer
-e_tree_model_node_get_data (ETreeModel *etm, ETreePath *node)
-{
- ENode *enode;
-
- g_return_val_if_fail (node && node->data, NULL);
-
- enode = (ENode*)node->data;
-
- return enode->node_data;
-}
-
-void
-e_tree_model_node_set_data (ETreeModel *etm, ETreePath *node, gpointer node_data)
-{
- ENode *enode;
-
- g_return_if_fail (node && node->data);
-
- enode = (ENode*)node->data;
-
- enode->node_data = node_data;
-}
-
-ETreePath*
-e_tree_model_node_insert (ETreeModel *tree_model,
- ETreePath *parent_path,
- int position,
- gpointer node_data)
-{
- ENode *node;
- ETreePath *new_path;
-
- g_return_val_if_fail (parent_path != NULL || tree_model->root == NULL, NULL);
-
- node = g_new0 (ENode, 1);
-
- node->expanded = FALSE;
- node->node_data = node_data;
-
- if (parent_path != NULL) {
-
- new_path = g_node_new (node);
-
- g_node_insert (parent_path, position, new_path);
-
- if (e_tree_model_node_is_visible (tree_model, new_path)) {
- int parent_row;
- GNode *n;
-
- /* we need to iterate back up to the root, incrementing the number of visible
- descendents */
- for (n = parent_path; n; n = n->parent) {
- ENode *parent_enode = (ENode*)n->data;
-
- parent_enode->visible_descendents ++;
- }
-
- /* finally, insert a row into the table */
- if (position == -1)
- position = e_tree_model_node_num_visible_descendents (tree_model, parent_path) - 1;
-
- parent_row = e_tree_model_row_of_node (tree_model, parent_path);
-
- tree_model->row_array = g_array_insert_val (tree_model->row_array,
- parent_row + position + 1, new_path);
-
- e_table_model_row_inserted (E_TABLE_MODEL(tree_model), parent_row + position + 1);
- }
- }
- else {
- tree_model->root = g_node_new (node);
- if (tree_model->root_visible) {
- tree_model->row_array = g_array_insert_val (tree_model->row_array, 0, tree_model->root);
- e_table_model_row_inserted (E_TABLE_MODEL (tree_model), 0);
- }
- else {
- /* need to mark the new node as expanded or
- we'll never see it's children */
- node->expanded = TRUE;
- }
- new_path = tree_model->root;
- }
-
- return new_path;
-}
-
-ETreePath *
-e_tree_model_node_insert_before (ETreeModel *etree,
- ETreePath *parent,
- ETreePath *sibling,
- gpointer node_data)
-{
- return e_tree_model_node_insert (etree, parent,
- g_node_child_position (parent, sibling),
- node_data);
-}
-
-static void
-child_remove (GNode *node, gpointer etree)
-{
- e_tree_model_node_remove (etree, node);
-}
-
-gpointer
-e_tree_model_node_remove (ETreeModel *etree, ETreePath *path)
-{
- GNode *parent = path->parent;
- ENode *enode = (ENode*)path->data;
- gpointer ret = enode->node_data;
-
- /* remove children */
- g_node_children_foreach (path, G_TRAVERSE_ALL, child_remove, etree);
-
- /* clean up the display */
- if (parent) {
- if (e_tree_model_node_is_visible (etree, path)) {
- int row = e_tree_model_row_of_node (etree, path);
- e_table_model_row_deleted (E_TABLE_MODEL (etree), row);
- etree->row_array = g_array_remove_index (etree->row_array, row);
-
- /* we need to iterate back up to the root, incrementing the number of visible
- descendents */
- for (; parent; parent = parent->parent) {
- ENode *parent_enode = (ENode*)parent->data;
-
- parent_enode->visible_descendents --;
- }
- }
- }
- else if (path == etree->root) {
- etree->root = NULL;
- if (etree->root_visible) {
- etree->row_array = g_array_remove_index (etree->row_array, 0);
- e_table_model_row_deleted (E_TABLE_MODEL (etree), 0);
- }
- }
- else {
- /* XXX invalid path */
- return NULL;
- }
-
-
- /* now free up the storage from that path */
- g_node_destroy (path);
- g_free (enode);
-
- return ret;
-}
-
-
-static void
-add_visible_descendents_to_array (ETreeModel *etm, GNode *gnode, int *row, int *count)
-{
- GNode *child;
- ENode *enode;
-
- /* add a row for this node */
- etm->row_array = g_array_insert_val (etm->row_array, (*row), gnode);
- e_table_model_row_inserted (E_TABLE_MODEL (etm), (*row)++);
- (*count) ++;
-
- /* then loop over its children, calling this routine for each
- of them */
- enode = (ENode*)gnode->data;
- if (enode->expanded) {
- for (child = g_node_first_child (gnode); child;
- child = g_node_next_sibling (child)) {
- add_visible_descendents_to_array (etm, child, row, count);
- }
- }
-}
-
-void
-e_tree_model_node_sort (ETreeModel *tree_model,
- ETreePath *node,
- GCompareFunc compare)
-{
- int num_nodes = g_node_n_children (node);
- ETreePath **path_array;
- int i;
-
- if (num_nodes == 0)
- return;
-
- path_array = g_new (ETreePath*, num_nodes);
-
- for (i = 0; i < num_nodes; i ++) {
- path_array[i] = g_node_first_child(node);
- g_node_unlink (path_array[i]);
- }
-
- qsort (path_array, num_nodes, sizeof(ETreePath*), compare);
-
- for (i = 0; i < num_nodes; i ++) {
- g_node_append (node, path_array[i]);
- }
-
- g_free (path_array);
-
- e_table_model_changed (E_TABLE_MODEL (tree_model));
-}
diff --git a/widgets/e-table/e-tree-model.h b/widgets/e-table/e-tree-model.h
deleted file mode 100644
index 403aff9a30..0000000000
--- a/widgets/e-table/e-tree-model.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TREE_MODEL_H_
-#define _E_TREE_MODEL_H_
-
-#include "e-table-model.h"
-#include "gdk-pixbuf/gdk-pixbuf.h"
-
-#define E_TREE_MODEL_TYPE (e_tree_model_get_type ())
-#define E_TREE_MODEL(o) (GTK_CHECK_CAST ((o), E_TREE_MODEL_TYPE, ETreeModel))
-#define E_TREE_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TREE_MODEL_TYPE, ETreeModelClass))
-#define E_IS_TREE_MODEL(o) (GTK_CHECK_TYPE ((o), E_TREE_MODEL_TYPE))
-#define E_IS_TREE_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TREE_MODEL_TYPE))
-
-typedef GNode ETreePath;
-
-typedef struct {
- ETableModel base;
- GNode *root;
- gboolean root_visible;
- GArray *row_array; /* used in the mapping between ETable and our tree */
-} ETreeModel;
-
-typedef struct {
- ETableModelClass parent_class;
-
- /*
- * Virtual methods
- */
- ETreePath *(*get_root) (ETreeModel *etm);
-
- ETreePath *(*get_parent) (ETreeModel *etm, ETreePath* node);
- ETreePath *(*get_next) (ETreeModel *etm, ETreePath* node);
- ETreePath *(*get_prev) (ETreeModel *etm, ETreePath* node);
- guint (*get_children) (ETreeModel *etm, ETreePath* node, ETreePath ***paths);
-
- gboolean (*is_expanded) (ETreeModel *etm, ETreePath* node);
- gboolean (*is_visible) (ETreeModel *etm, ETreePath* node);
- void (*set_expanded) (ETreeModel *etm, ETreePath* node, gboolean expanded);
- void (*set_expanded_recurse) (ETreeModel *etm, ETreePath *node, gboolean expanded);
- void (*set_expanded_level) (ETreeModel *etm, ETreePath *node, gboolean expanded, int level);
-
- GdkPixbuf *(*icon_at) (ETreeModel *etm, ETreePath* node);
- ETreePath* (*node_at_row) (ETreeModel *etm, int row);
-
- /*
- * ETable analogs
- */
- void *(*value_at) (ETreeModel *etm, ETreePath* node, int col);
- void (*set_value_at) (ETreeModel *etm, ETreePath* node, int col, const void *val);
- gboolean (*is_editable) (ETreeModel *etm, ETreePath* node, int col);
-
-
- /*
- * Signals
- */
- void (*node_changed) (ETreeModel *etm, ETreePath *node);
- void (*node_inserted) (ETreeModel *etm, ETreePath *parent, ETreePath *inserted_node);
- void (*node_removed) (ETreeModel *etm, ETreePath *parent, ETreePath *removed_node);
-
-} ETreeModelClass;
-
-GtkType e_tree_model_get_type (void);
-void e_tree_model_construct (ETreeModel *etree);
-ETreeModel *e_tree_model_new (void);
-
-/* tree traversal operations */
-ETreePath *e_tree_model_get_root (ETreeModel *etree);
-ETreePath *e_tree_model_node_get_parent (ETreeModel *etree, ETreePath *path);
-ETreePath *e_tree_model_node_get_next (ETreeModel *etree, ETreePath *path);
-ETreePath *e_tree_model_node_get_prev (ETreeModel *etree, ETreePath *path);
-
-/* node operations */
-ETreePath *e_tree_model_node_insert (ETreeModel *etree, ETreePath *parent, int position, gpointer node_data);
-ETreePath *e_tree_model_node_insert_before (ETreeModel *etree, ETreePath *parent, ETreePath *sibling, gpointer node_data);
-gpointer e_tree_model_node_remove (ETreeModel *etree, ETreePath *path);
-
-/* node accessors */
-gboolean e_tree_model_node_is_root (ETreeModel *etree, ETreePath *path);
-gboolean e_tree_model_node_is_expandable (ETreeModel *etree, ETreePath *path);
-gboolean e_tree_model_node_is_expanded (ETreeModel *etree, ETreePath *path);
-gboolean e_tree_model_node_is_visible (ETreeModel *etree, ETreePath *path);
-void e_tree_model_node_set_expanded (ETreeModel *etree, ETreePath *path, gboolean expanded);
-void e_tree_model_node_set_expanded_recurse (ETreeModel *etree, ETreePath *path, gboolean expanded);
-guint e_tree_model_node_get_children (ETreeModel *etree, ETreePath *path, ETreePath ***paths);
-guint e_tree_model_node_depth (ETreeModel *etree, ETreePath *path);
-guint e_tree_model_node_num_visible_descendents (ETreeModel *etm, ETreePath *node);
-gpointer e_tree_model_node_get_data (ETreeModel *etm, ETreePath *node);
-void e_tree_model_node_set_data (ETreeModel *etm, ETreePath *node, gpointer node_data);
-
-/* display oriented routines */
-ETreePath *e_tree_model_node_at_row (ETreeModel *etree, int row);
-GdkPixbuf *e_tree_model_icon_of_node (ETreeModel *etree, ETreePath *path);
-int e_tree_model_row_of_node (ETreeModel *etree, ETreePath *path);
-void e_tree_model_root_node_set_visible (ETreeModel *etree, gboolean visible);
-gboolean e_tree_model_root_node_is_visible (ETreeModel *etree);
-
-/* sort routine, analogous to gtk_ctree_node_sort */
-void e_tree_model_node_sort (ETreeModel *tree_model, ETreePath *node, GCompareFunc compare);
-
-/*
-** Routines for emitting signals on the ETreeModel
-*/
-void e_tree_model_node_changed (ETreeModel *tree_model, ETreePath *node);
-void e_tree_model_node_inserted (ETreeModel *tree_model, ETreePath *parent_node, ETreePath *inserted_node);
-void e_tree_model_node_removed (ETreeModel *tree_model, ETreePath *parent_node, ETreePath *removed_node);
-
-#endif /* _E_TREE_MODEL_H */
diff --git a/widgets/e-table/e-tree-simple.c b/widgets/e-table/e-tree-simple.c
deleted file mode 100644
index e5883e6ae0..0000000000
--- a/widgets/e-table/e-tree-simple.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-simple.c: a Tree Model that offers a function pointer
- * interface to using ETreeModel, similar to ETableSimple.
- *
- * Author:
- * Chris Toshok (toshok@helixcode.com)
- *
- * (C) 2000 Helix Code, Inc. */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-util/e-util.h"
-#include "e-tree-simple.h"
-
-#define PARENT_TYPE E_TREE_MODEL_TYPE
-
-static void *
-simple_value_at (ETreeModel *etm, ETreePath *node, int col)
-{
- ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
- return simple->value_at (etm, node, col, simple->model_data);
-}
-
-static GdkPixbuf *
-simple_icon_at (ETreeModel *etm, ETreePath *node)
-{
- ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
- return simple->icon_at (etm, node, simple->model_data);
-}
-
-static void
-simple_set_value_at (ETreeModel *etm, ETreePath *node, int col, const void *val)
-{
- ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
- simple->set_value_at (etm, node, col, val, simple->model_data);
-}
-
-static gboolean
-simple_is_editable (ETreeModel *etm, ETreePath *node, int col)
-{
- ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
- return simple->is_editable (etm, node, col, simple->model_data);
-}
-
-static void
-e_tree_simple_class_init (GtkObjectClass *object_class)
-{
- ETreeModelClass *model_class = (ETreeModelClass *) object_class;
-
- model_class->icon_at = simple_icon_at;
- model_class->value_at = simple_value_at;
- model_class->set_value_at = simple_set_value_at;
- model_class->is_editable = simple_is_editable;
-}
-
-E_MAKE_TYPE(e_tree_simple, "ETreeSimple", ETreeSimple, e_tree_simple_class_init, NULL, PARENT_TYPE)
-
-ETreeModel *
-e_tree_simple_new (ETreeSimpleIconAtFn icon_at,
- ETreeSimpleValueAtFn value_at,
- ETreeSimpleSetValueAtFn set_value_at,
- ETreeSimpleIsEditableFn is_editable,
- gpointer model_data)
-{
- ETreeSimple *etg;
-
- etg = gtk_type_new (e_tree_simple_get_type ());
-
- e_tree_model_construct (E_TREE_MODEL (etg));
-
- etg->icon_at = icon_at;
- etg->value_at = value_at;
- etg->set_value_at = set_value_at;
- etg->is_editable = is_editable;
- etg->model_data = model_data;
-
- return (ETreeModel*)etg;
-}
-
diff --git a/widgets/e-table/e-tree-simple.h b/widgets/e-table/e-tree-simple.h
deleted file mode 100644
index edda53e82d..0000000000
--- a/widgets/e-table/e-tree-simple.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#ifndef _E_TREE_SIMPLE_H_
-#define _E_TREE_SIMPLE_H_
-
-#include "e-tree-model.h"
-
-#define E_TREE_SIMPLE_TYPE (e_tree_simple_get_type ())
-#define E_TREE_SIMPLE(o) (GTK_CHECK_CAST ((o), E_TREE_SIMPLE_TYPE, ETreeSimple))
-#define E_TREE_SIMPLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TREE_SIMPLE_TYPE, ETreeSimpleClass))
-#define E_IS_TREE_SIMPLE(o) (GTK_CHECK_TYPE ((o), E_TREE_SIMPLE_TYPE))
-#define E_IS_TREE_SIMPLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TREE_SIMPLE_TYPE))
-
-
-typedef GdkPixbuf* (*ETreeSimpleIconAtFn) (ETreeModel *etree, ETreePath *path, void *model_data);
-typedef void* (*ETreeSimpleValueAtFn) (ETreeModel *etree, ETreePath *path, int col, void *model_data);
-typedef void (*ETreeSimpleSetValueAtFn) (ETreeModel *etree, ETreePath *path, int col, const void *val, void *model_data);
-typedef gboolean (*ETreeSimpleIsEditableFn) (ETreeModel *etree, ETreePath *path, int col, void *model_data);
-
-typedef struct {
- ETreeModel parent;
-
- ETreeSimpleIconAtFn icon_at;
- ETreeSimpleValueAtFn value_at;
- ETreeSimpleSetValueAtFn set_value_at;
- ETreeSimpleIsEditableFn is_editable;
-
- gpointer model_data;
-} ETreeSimple;
-
-typedef struct {
- ETreeModelClass parent_class;
-} ETreeSimpleClass;
-
-GtkType e_tree_simple_get_type (void);
-
-ETreeModel *e_tree_simple_new (ETreeSimpleIconAtFn icon_at,
- ETreeSimpleValueAtFn value_at,
- ETreeSimpleSetValueAtFn set_value_at,
- ETreeSimpleIsEditableFn is_editable,
- gpointer model_data);
-
-#endif /* _E_TREE_SIMPLE_H_ */
diff --git a/widgets/e-table/image1.png b/widgets/e-table/image1.png
deleted file mode 100644
index 8326ac241f..0000000000
--- a/widgets/e-table/image1.png
+++ /dev/null
Binary files differ
diff --git a/widgets/e-table/image2.png b/widgets/e-table/image2.png
deleted file mode 100644
index e6a4c75dbe..0000000000
--- a/widgets/e-table/image2.png
+++ /dev/null
Binary files differ
diff --git a/widgets/e-table/image3.png b/widgets/e-table/image3.png
deleted file mode 100644
index 50e16e8620..0000000000
--- a/widgets/e-table/image3.png
+++ /dev/null
Binary files differ
diff --git a/widgets/e-table/remove-col.xpm b/widgets/e-table/remove-col.xpm
deleted file mode 100644
index ff1024f0c9..0000000000
--- a/widgets/e-table/remove-col.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * remove_col_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #FF0000",
-"... ...",
-".++. .++.",
-".+++. .+++.",
-" .+++. .+++. ",
-" .+++. .+++. ",
-" .+++..+++. ",
-" .++++++. ",
-" .++++. ",
-" .++++. ",
-" .++++++. ",
-" .+++..+++. ",
-" .+++. .+++. ",
-" .+++. .+++. ",
-".+++. .+++.",
-".++. .++.",
-"... ..."};
diff --git a/widgets/e-table/sample.table b/widgets/e-table/sample.table
deleted file mode 100644
index 45c8ff0691..0000000000
--- a/widgets/e-table/sample.table
+++ /dev/null
@@ -1,11 +0,0 @@
-Col1 Col2 Address Title Dorks
-c1.a c2.a a.a tit-1 DorkA
-c1.b c2.b a.b tit-2 DDork
-c1.c c2.c a.c tit-1 DorkB
-c1.d c2.d a.d tit-2 ADork
-c1.e c2.e a.e tit-1 DorkC
-c1.f c2.f a.f tit-2 UDork
-c1.g c2.g a.g tit-3 Dork---
-j k k tit-1 DorkA
-
-
diff --git a/widgets/e-table/table-test.c b/widgets/e-table/table-test.c
deleted file mode 100644
index 62160e7035..0000000000
--- a/widgets/e-table/table-test.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Test code for the ETable package
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- */
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <fcntl.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "table-test.h"
-
-int
-main (int argc, char *argv [])
-{
-
- if (isatty (0)){
- int fd;
-
- close (0);
- fd = open ("sample.table", O_RDONLY);
- if (fd == -1){
- fprintf (stderr, "Could not find sample.table, try feeding a table on stdin");
- exit (1);
- }
- dup2 (fd, 0);
- }
-
- gnome_init ("TableTest", "TableTest", argc, argv);
- e_cursors_init ();
-
-
- table_browser_test ();
- multi_cols_test ();
- check_test ();
-
- e_table_test ();
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
diff --git a/widgets/e-table/table-test.h b/widgets/e-table/table-test.h
deleted file mode 100644
index ad8cfcc083..0000000000
--- a/widgets/e-table/table-test.h
+++ /dev/null
@@ -1,4 +0,0 @@
-void table_browser_test (void);
-void multi_cols_test (void);
-void check_test (void);
-void e_table_test (void);
diff --git a/widgets/e-table/test-check.c b/widgets/e-table/test-check.c
deleted file mode 100644
index 3bb022821e..0000000000
--- a/widgets/e-table/test-check.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Test code for the ETable package
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- */
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-util/e-cursors.h"
-#include "e-util/e-canvas-utils.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-util.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-
-#include "table-test.h"
-
-#define LINES 4
-
-static struct {
- int value;
- char *string;
-} my_table [LINES] = {
- { 0, "Buy food" },
- { 1, "Breathe " },
- { 0, "Cancel gdb session with shrink" },
- { 1, "Make screenshots" },
-};
-/*
- * ETableSimple callbacks
- */
-static int
-col_count (ETableModel *etc, void *data)
-{
- return 2;
-}
-
-static int
-row_count (ETableModel *etc, void *data)
-{
- return LINES;
-}
-
-static void *
-value_at (ETableModel *etc, int col, int row, void *data)
-{
- g_assert (col < 2);
- g_assert (row < LINES);
-
- if (col == 0)
- return GINT_TO_POINTER (my_table [row].value);
- else
- return my_table [row].string;
-
-}
-
-static void
-set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
- g_assert (col < 2);
- g_assert (row < LINES);
-
- if (col == 0) {
- my_table [row].value = GPOINTER_TO_INT (val);
- printf ("Value at %d,%d set to %d\n", col, row, GPOINTER_TO_INT (val));
- } else {
- my_table [row].string = g_strdup (val);
- printf ("Value at %d,%d set to %s\n", col, row, (char *) val);
- }
-}
-
-static gboolean
-is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- return TRUE;
-}
-
-static void *
-duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0) {
- return (void *) value;
- } else {
- return g_strdup (value);
- }
-}
-
-static void
-free_value (ETableModel *etc, int col, void *value, void *data)
-{
- if (col != 0) {
- g_free (value);
- }
-}
-
-static void *
-initialize_value (ETableModel *etc, int col, void *data)
-{
- if (col == 0)
- return NULL;
- else
- return g_strdup ("");
-}
-
-static gboolean
-value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0)
- return value == NULL;
- else
- return !(value && *(char *)value);
-}
-
-static char *
-value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0)
- return g_strdup_printf("%d", (int) value);
- else
- return g_strdup(value);
-}
-
-static void
-set_canvas_size (GnomeCanvas *canvas, GtkAllocation *alloc)
-{
- gnome_canvas_set_scroll_region (canvas, 0, 0, alloc->width, alloc->height);
-}
-
-void
-check_test (void)
-{
- GtkWidget *canvas, *window;
- ETableModel *e_table_model;
- ETableHeader *e_table_header;
- ETableCol *col_0, *col_1;
- ECell *cell_left_just, *cell_image_check;
- GdkPixbuf *pixbuf;
- GnomeCanvasItem *item;
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- e_table_model = e_table_simple_new (
- col_count, row_count, value_at,
- set_value_at, is_cell_editable,
- duplicate_value, free_value,
- initialize_value, value_is_empty,
- value_to_string,
- NULL);
-
- /*
- * Header
- */
- e_table_header = e_table_header_new ();
-
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- cell_image_check = e_cell_checkbox_new ();
- pixbuf = gdk_pixbuf_new_from_file ("clip.png");
- col_0 = e_table_col_new_with_pixbuf (0, pixbuf, 0.0, 18, cell_image_check, g_int_compare, TRUE);
- gdk_pixbuf_unref (pixbuf);
- e_table_header_add_column (e_table_header, col_0, 0);
-
- col_1 = e_table_col_new (1, "Item Name", 1.0, 20, cell_left_just, g_str_compare, TRUE);
- e_table_header_add_column (e_table_header, col_1, 1);
- e_table_col_set_arrow (col_1, E_TABLE_COL_ARROW_DOWN);
-
- /*
- * GUI
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- canvas = e_canvas_new ();
-
- gtk_signal_connect (GTK_OBJECT (canvas), "size_allocate",
- GTK_SIGNAL_FUNC (set_canvas_size), NULL);
-
- gtk_container_add (GTK_CONTAINER (window), canvas);
- gtk_widget_show_all (window);
- gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_header_item_get_type (),
- "ETableHeader", e_table_header,
- NULL);
-
- item = gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_item_get_type (),
- "ETableHeader", e_table_header,
- "ETableModel", e_table_model,
- "drawgrid", TRUE,
- "drawfocus", TRUE,
-#if 0
- "spreadsheet", TRUE,
-#endif
- "cursor_mode", E_TABLE_CURSOR_SIMPLE,
- NULL);
- e_canvas_item_move_absolute (item, 0, 30);
-}
-
diff --git a/widgets/e-table/test-cols.c b/widgets/e-table/test-cols.c
deleted file mode 100644
index c47a1d47d7..0000000000
--- a/widgets/e-table/test-cols.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Test code for the ETable package
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- */
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-canvas-utils.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-cursors.h"
-#include "e-util/e-util.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-toggle.h"
-
-#include "table-test.h"
-
-#define LINES 4
-
-static struct {
- int value;
- char *string;
-} my_table [LINES] = {
- { 0, "You are not" },
- { 1, "A beautiful and unique " },
- { 0, "Snowflake" },
- { 2, "You are not your wallet" },
-};
-/*
- * ETableSimple callbacks
- */
-static int
-col_count (ETableModel *etc, void *data)
-{
- return 2;
-}
-
-static int
-row_count (ETableModel *etc, void *data)
-{
- return LINES;
-}
-
-static void *
-value_at (ETableModel *etc, int col, int row, void *data)
-{
- g_assert (col < 2);
- g_assert (row < LINES);
-
- if (col == 0)
- return GINT_TO_POINTER (my_table [row].value);
- else
- return my_table [row].string;
-
-}
-
-static void
-set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
- g_assert (col < 2);
- g_assert (row < LINES);
-
- if (col == 0){
- my_table [row].value = GPOINTER_TO_INT (val);
- printf ("Value at %d,%d set to %d\n", col, row, GPOINTER_TO_INT (val));
- } else {
- my_table [row].string = g_strdup (val);
- printf ("Value at %d,%d set to %s\n", col, row, (char *) val);
- }
-}
-
-static gboolean
-is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- return TRUE;
-}
-
-static void *
-duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0){
- return (void *)value;
- } else {
- return g_strdup (value);
- }
-}
-
-static void
-free_value (ETableModel *etc, int col, void *value, void *data)
-{
- if (col != 0){
- g_free (value);
- }
-}
-
-static void *
-initialize_value (ETableModel *etc, int col, void *data)
-{
- if (col == 0)
- return NULL;
- else
- return g_strdup ("");
-}
-
-static gboolean
-value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0)
- return value == NULL;
- else
- return !(value && *(char *)value);
-}
-
-static char *
-value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0)
- return g_strdup_printf("%d", (int) value);
- else
- return g_strdup(value);
-}
-
-static void
-set_canvas_size (GnomeCanvas *canvas, GtkAllocation *alloc)
-{
- gnome_canvas_set_scroll_region (canvas, 0, 0, alloc->width, alloc->height);
-}
-
-void
-multi_cols_test (void)
-{
- GtkWidget *canvas, *window;
- ETableModel *e_table_model;
- ETableHeader *e_table_header, *e_table_header_multiple;
- ETableCol *col_0, *col_1;
- ECell *cell_left_just, *cell_image_toggle;
- GnomeCanvasItem *item;
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- e_table_model = e_table_simple_new (
- col_count, row_count, value_at,
- set_value_at, is_cell_editable,
- duplicate_value, free_value,
- initialize_value, value_is_empty,
- value_to_string,
- NULL);
-
- /*
- * Header
- */
- e_table_header = e_table_header_new ();
-
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- {
- GdkPixbuf **images = g_new (GdkPixbuf *, 3);
- int i;
-
- images [0] = gdk_pixbuf_new_from_file ("image1.png");
- images [1] = gdk_pixbuf_new_from_file ("image2.png");
- images [2] = gdk_pixbuf_new_from_file ("image3.png");
-
- cell_image_toggle = e_cell_toggle_new (0, 3, images);
-
- for (i = 0; i < 3; i++)
- gdk_pixbuf_unref (images [i]);
-
- g_free (images);
- }
-
- col_1 = e_table_col_new (1, "Item Name", 1.0, 20, cell_left_just, g_str_compare, TRUE);
- e_table_header_add_column (e_table_header, col_1, 0);
-
- col_0 = e_table_col_new (0, "A", 0.0, 48, cell_image_toggle, g_int_compare, TRUE);
- e_table_header_add_column (e_table_header, col_0, 1);
-
- /*
- * Second test
- */
- e_table_header_multiple = e_table_header_new ();
- e_table_header_add_column (e_table_header_multiple, col_0, 0);
- e_table_header_add_column (e_table_header_multiple, col_1, 1);
- e_table_header_add_column (e_table_header_multiple, col_1, 2);
-
- /*
- * GUI
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- canvas = e_canvas_new ();
-
- gtk_signal_connect (GTK_OBJECT (canvas), "size_allocate",
- GTK_SIGNAL_FUNC (set_canvas_size), NULL);
-
- gtk_container_add (GTK_CONTAINER (window), canvas);
- gtk_widget_show_all (window);
-
- gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_header_item_get_type (),
- "ETableHeader", e_table_header,
- NULL);
-
- item = gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_item_get_type (),
- "ETableHeader", e_table_header,
- "ETableModel", e_table_model,
- "drawgrid", TRUE,
- "drawfocus", TRUE,
- "cursor_mode", E_TABLE_CURSOR_SIMPLE,
-#if 0
- "spreadsheet", TRUE,
-#endif
- NULL);
-
- e_canvas_item_move_absolute (item, 0, 30);
-
- gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_header_item_get_type (),
- "ETableHeader", e_table_header_multiple,
- NULL);
- item = gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_item_get_type (),
- "ETableHeader", e_table_header_multiple,
- "ETableModel", e_table_model,
- "drawgrid", TRUE,
- "drawfocus", TRUE,
-#if 0
- "spreadsheet", TRUE,
-#endif
- "cursor_mode", E_TABLE_CURSOR_SIMPLE,
- NULL);
- e_canvas_item_move_absolute (item, 300, 30);
-}
-
-
-
-
-
diff --git a/widgets/e-table/test-table.c b/widgets/e-table/test-table.c
deleted file mode 100644
index b30b412f08..0000000000
--- a/widgets/e-table/test-table.c
+++ /dev/null
@@ -1,394 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Test code for the ETable package
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- */
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "e-util/e-canvas.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-table.h"
-#include "e-table-config.h"
-
-#include "table-test.h"
-
-char buffer [1024];
-char **column_labels;
-char ***table_data;
-int cols = 0;
-int lines = 0;
-int lines_alloc = 0;
-
-static void
-parse_headers ()
-{
- char *p, *s;
- int in_value = 0, i;
-
- fgets (buffer, sizeof (buffer)-1, stdin);
-
- for (p = buffer; *p; p++){
- if (*p == ' ' || *p == '\t'){
- if (in_value){
- cols++;
- in_value = 0;
- }
- } else
- in_value = 1;
- }
- if (in_value)
- cols++;
-
- if (!cols){
- fprintf (stderr, "No columns in first row\n");
- exit (1);
- }
-
- column_labels = g_new0 (char *, cols);
-
- p = buffer;
- for (i = 0; (s = strtok (p, " \t")) != NULL; i++){
- column_labels [i] = g_strdup (s);
- if (strchr (column_labels [i], '\n'))
- *strchr (column_labels [i], '\n') = 0;
- p = NULL;
- }
-
- printf ("%d headers:\n", cols);
- for (i = 0; i < cols; i++){
- printf ("header %d: %s\n", i, column_labels [i]);
- }
-}
-
-static char **
-load_line (char *buffer, int cols)
-{
- char **line = g_new0 (char *, cols);
- char *p;
- int i;
-
- for (i = 0; i < cols; i++){
- p = strtok (buffer, " \t\n");
- if (p == NULL){
- for (; i < cols; i++)
- line [i] = g_strdup ("");
- return line;
- } else
- line [i] = g_strdup (p);
- buffer = NULL;
- }
- return line;
-}
-
-static void
-append_line (char **line)
-{
- if (lines <= lines_alloc){
- lines_alloc = lines + 50;
- table_data = g_renew (char **, table_data, lines_alloc);
- }
- table_data [lines] = line;
- lines++;
-}
-
-static void
-load_data ()
-{
- int i;
-
- {
- static int loaded;
-
- if (loaded)
- return;
-
- loaded = TRUE;
- }
-
-
- parse_headers ();
-
- while (fgets (buffer, sizeof (buffer)-1, stdin) != NULL){
- char **line;
-
- if (buffer [0] == '\n')
- continue;
- line = load_line (buffer, cols);
- append_line (line);
- }
-
- for (i = 0; i < lines; i++){
- int j;
-
- printf ("Line %d: ", i);
- for (j = 0; j < cols; j++)
- printf ("[%s] ", table_data [i][j]);
- printf ("\n");
- }
-}
-
-/*
- * ETableSimple callbacks
- */
-static int
-col_count (ETableModel *etc, void *data)
-{
- return cols;
-}
-
-static int
-row_count (ETableModel *etc, void *data)
-{
- return lines;
-}
-
-static void *
-value_at (ETableModel *etc, int col, int row, void *data)
-{
- g_assert (col < cols);
- g_assert (row < lines);
-
- return (void *) table_data [row][col];
-}
-
-static void
-set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
- g_assert (col < cols);
- g_assert (row < lines);
-
- g_free (table_data [row][col]);
- table_data [row][col] = g_strdup (val);
-
- printf ("Value at %d,%d set to %s\n", col, row, (char *) val);
-}
-
-static gboolean
-is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- return TRUE;
-}
-
-static void *
-duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup (value);
-}
-
-static void
-free_value (ETableModel *etc, int col, void *value, void *data)
-{
- g_free (value);
-}
-
-static void *
-initialize_value (ETableModel *etc, int col, void *data)
-{
- return g_strdup ("");
-}
-
-static gboolean
-value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- return !(value && *(char *)value);
-}
-
-static char *
-value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup(value);
-}
-
-static void
-set_canvas_size (GnomeCanvas *canvas, GtkAllocation *alloc)
-{
- gnome_canvas_set_scroll_region (canvas, 0, 0, alloc->width, alloc->height);
-}
-
-void
-table_browser_test (void)
-{
- GtkWidget *canvas, *window;
- ETableModel *e_table_model;
- ETableHeader *e_table_header;
- ECell *cell_left_just;
- GnomeCanvasItem *group;
- int i;
-
- load_data ();
-
- /*
- * Data model
- */
- e_table_model = e_table_simple_new (
- col_count, row_count, value_at,
- set_value_at, is_cell_editable,
- duplicate_value, free_value,
- initialize_value, value_is_empty,
- value_to_string,
- NULL);
-
- /*
- * Header
- */
- e_table_header = e_table_header_new ();
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- for (i = 0; i < cols; i++){
- ETableCol *ecol = e_table_col_new (
- i, column_labels [i],
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
-
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /*
- * Setup GUI
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- canvas = e_canvas_new ();
-
- gtk_signal_connect (GTK_OBJECT (canvas), "size_allocate",
- GTK_SIGNAL_FUNC (set_canvas_size), NULL);
-
- gtk_container_add (GTK_CONTAINER (window), canvas);
- gtk_widget_show_all (window);
- gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_header_item_get_type (),
- "ETableHeader", e_table_header,
- NULL);
-
- group = gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- gnome_canvas_group_get_type (),
- "x", 30.0,
- "y", 30.0,
- NULL);
-
- gnome_canvas_item_new (
- GNOME_CANVAS_GROUP (group),
- e_table_item_get_type (),
- "ETableHeader", e_table_header,
- "ETableModel", e_table_model,
- "drawgrid", TRUE,
- "drawfocus", TRUE,
-#if 0
- "spreadsheet", TRUE,
-#endif
- NULL);
-}
-
-static void
-save_spec (GtkWidget *button, ETable *e_table)
-{
- e_table_save_specification (e_table, "e-table-test.xml");
-}
-
-static void
-row_selection_test (ETable *table, int row, gboolean selected)
-{
- if (selected)
- g_print ("Row %d selected\n", row);
- else
- g_print ("Row %d unselected\n", row);
-}
-
-static void
-toggle_grid (void *nothing, ETable *etable)
-{
- static gboolean shown;
-
- gtk_object_get (GTK_OBJECT (etable), "drawgrid", &shown, NULL);
- gtk_object_set (GTK_OBJECT (etable), "drawgrid", !shown, NULL);
-}
-
-static void
-do_e_table_demo (const char *spec)
-{
- GtkWidget *e_table, *window, *frame, *vbox, *button, *bhide;
- ECell *cell_left_just;
- ETableHeader *full_header;
- int i;
-
- /*
- * Data model
- */
- static ETableModel *e_table_model = NULL;
-
- if (e_table_model == NULL)
- e_table_model =
- e_table_simple_new (col_count, row_count, value_at,
- set_value_at, is_cell_editable,
- duplicate_value, free_value,
- initialize_value, value_is_empty,
- value_to_string,
- NULL);
-
- full_header = e_table_header_new ();
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- for (i = 0; i < cols; i++){
- ETableCol *ecol = e_table_col_new (
- i, column_labels [i],
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
-
- e_table_header_add_column (full_header, ecol, i);
- }
-
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- frame = gtk_frame_new (NULL);
- e_table = e_table_new (full_header, e_table_model, spec);
- gtk_signal_connect (GTK_OBJECT(e_table), "row_selection",
- GTK_SIGNAL_FUNC(row_selection_test), NULL);
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), e_table, TRUE, TRUE, 0);
- gtk_container_add (GTK_CONTAINER (frame), vbox);
- gtk_container_add (GTK_CONTAINER (window), frame);
-
- /*
- * gadgets
- */
- button = gtk_button_new_with_label ("Save spec");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (save_spec), e_table);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- bhide = gtk_button_new_with_label ("Toggle Grid");
- gtk_signal_connect (GTK_OBJECT (bhide), "clicked",
- GTK_SIGNAL_FUNC (toggle_grid), e_table);
- gtk_box_pack_start (GTK_BOX (vbox), bhide, FALSE, FALSE, 0);
-
- gtk_widget_set_usize (window, 200, 200);
- gtk_widget_show_all (window);
-
- if (getenv ("TEST")){
- e_table_do_gui_config (NULL, E_TABLE(e_table));
- }
-}
-
-void
-e_table_test (void)
-{
- load_data ();
-
- if (1){/*getenv ("DO")){*/
- do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <leaf column=\"3\" ascending=\"1\"/> </grouping> </ETableSpecification>");
- do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <group column=\"3\" ascending=\"1\"> <group column=\"4\" ascending=\"0\"> <leaf column=\"2\" ascending=\"1\"/> </group> </group> </grouping> </ETableSpecification>");
- }
- do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <group column=\"4\" ascending=\"1\"> <leaf column=\"2\" ascending=\"1\"/> </group> </grouping> </ETableSpecification>");
- do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <group column=\"3\" ascending=\"1\"> <leaf column=\"2\" ascending=\"1\"/> </group> </grouping> </ETableSpecification>");
-}
diff --git a/widgets/e-table/tree-expanded.xpm b/widgets/e-table/tree-expanded.xpm
deleted file mode 100644
index fc748953eb..0000000000
--- a/widgets/e-table/tree-expanded.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * tree_expanded_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" ......... ",
-" .+++++++. ",
-" .+++++++. ",
-" .+++++++. ",
-" .+.....+. ",
-" .+++++++. ",
-" .+++++++. ",
-" .+++++++. ",
-" ......... ",
-" ",
-" ",
-" "};
diff --git a/widgets/e-table/tree-unexpanded.xpm b/widgets/e-table/tree-unexpanded.xpm
deleted file mode 100644
index 0dfb12a0a5..0000000000
--- a/widgets/e-table/tree-unexpanded.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * tree_unexpanded_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" ......... ",
-" .+++++++. ",
-" .+++.+++. ",
-" .+++.+++. ",
-" .+.....+. ",
-" .+++.+++. ",
-" .+++.+++. ",
-" .+++++++. ",
-" ......... ",
-" ",
-" ",
-" "};
diff --git a/widgets/e-text/.cvsignore b/widgets/e-text/.cvsignore
deleted file mode 100644
index ab703bd5e1..0000000000
--- a/widgets/e-text/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-e-text-test
-e-entry-test
diff --git a/widgets/e-text/Makefile.am b/widgets/e-text/Makefile.am
deleted file mode 100644
index b56d735990..0000000000
--- a/widgets/e-text/Makefile.am
+++ /dev/null
@@ -1,43 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir) \
- $(GNOME_INCLUDEDIR) \
- $(UNICODE_CFLAGS) \
- -DG_LOG_DOMAIN=\"e-text\"
-
-noinst_LIBRARIES = \
- libetext.a
-
-libetext_a_SOURCES = \
- e-entry.c \
- e-entry.h \
- e-text-event-processor-emacs-like.c \
- e-text-event-processor-emacs-like.h \
- e-text-event-processor-types.h \
- e-text-event-processor.c \
- e-text-event-processor.h \
- e-text-model.c \
- e-text-model.h \
- e-text.c \
- e-text.h
-
-noinst_PROGRAMS = \
- e-text-test \
- e-entry-test
-
-e_text_test_SOURCES = \
- e-text-test.c
-
-e_text_test_LDADD = \
- libetext.a \
- $(EXTRA_GNOME_LIBS) \
- $(top_builddir)/e-util/libeutil.la
-
-e_entry_test_SOURCES = \
- e-entry-test.c
-
-e_entry_test_LDADD = \
- libetext.a \
- $(EXTRA_GNOME_LIBS) \
- $(top_builddir)/e-util/libeutil.la
-
-e_text_test_LDFLAGS = `gnome-config --libs gdk_pixbuf`
diff --git a/widgets/e-text/e-entry-test.c b/widgets/e-text/e-entry-test.c
deleted file mode 100644
index 411e8d693c..0000000000
--- a/widgets/e-text/e-entry-test.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-minicard.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-
-
-#include "config.h"
-
-#include <gnome.h>
-#include "e-entry.h"
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- 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 ( _( "Minicard Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the minicard canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *entry;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "EEntry Test", VERSION, argc, argv);
- app = gnome_app_new("EEntry Test", NULL);
-
- entry = e_entry_new();
- gtk_object_set(GTK_OBJECT(entry),
- "editable", TRUE,
- "use_ellipsis", TRUE,
- NULL);
- gnome_app_set_contents( GNOME_APP( app ), entry );
-
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/widgets/e-text/e-entry.c b/widgets/e-text/e-entry.c
deleted file mode 100644
index cbde382c93..0000000000
--- a/widgets/e-text/e-entry.c
+++ /dev/null
@@ -1,408 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table.c: A graphical view of a Table.
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- * Chris Lahey (clahey@helixcode.com)
- *
- * Copyright 1999, Helix Code, Inc
- */
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
-#include <stdio.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <gtk/gtksignal.h>
-#include <gnome-xml/parser.h>
-#include "e-util/e-util.h"
-#include "e-util/e-canvas.h"
-#include "e-entry.h"
-#include "e-util/e-canvas-utils.h"
-
-#define MIN_ENTRY_WIDTH 150
-#define INNER_BORDER 2
-
-#define PARENT_TYPE gtk_table_get_type ()
-
-static GtkObjectClass *parent_class;
-
-enum {
- E_ENTRY_CHANGED,
- E_ENTRY_ACTIVATE,
- E_ENTRY_LAST_SIGNAL
-};
-
-static guint e_entry_signals[E_ENTRY_LAST_SIGNAL] = { 0 };
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_MODEL,
- ARG_EVENT_PROCESSOR,
- ARG_TEXT,
- ARG_FONT,
- ARG_FONTSET,
- ARG_FONT_GDK,
- ARG_ANCHOR,
- ARG_JUSTIFICATION,
- ARG_X_OFFSET,
- ARG_Y_OFFSET,
- ARG_FILL_COLOR,
- ARG_FILL_COLOR_GDK,
- ARG_FILL_COLOR_RGBA,
- ARG_FILL_STIPPLE,
- ARG_EDITABLE,
- ARG_USE_ELLIPSIS,
- ARG_ELLIPSIS,
- ARG_LINE_WRAP,
- ARG_BREAK_CHARACTERS,
- ARG_MAX_LINES,
- ARG_WIDTH,
- ARG_HEIGHT
-};
-
-static void
-canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc,
- EEntry *e_entry)
-{
- gnome_canvas_set_scroll_region (
- e_entry->canvas,
- 0, 0, alloc->width, alloc->height);
- gtk_object_set (GTK_OBJECT (e_entry->item),
- "clip_width", (double) alloc->width,
- "clip_height", (double) alloc->height,
- NULL);
-}
-
-static void
-canvas_size_request (GtkWidget *widget, GtkRequisition *requisition,
- EEntry *e_entry)
-{
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GNOME_IS_CANVAS (widget));
- g_return_if_fail (requisition != NULL);
-
- requisition->width = MIN_ENTRY_WIDTH + (widget->style->klass->xthickness + INNER_BORDER) * 2;
- requisition->height = (widget->style->font->ascent +
- widget->style->font->descent +
- (widget->style->klass->ythickness + INNER_BORDER) * 2);
-}
-
-static void
-e_entry_init (GtkObject *object)
-{
- EEntry *e_entry = E_ENTRY (object);
- GtkTable *gtk_table = GTK_TABLE (object);
-
- e_entry->canvas = GNOME_CANVAS(e_canvas_new());
- gtk_signal_connect(GTK_OBJECT(e_entry->canvas), "size_allocate",
- GTK_SIGNAL_FUNC(canvas_size_allocate), e_entry);
- gtk_signal_connect(GTK_OBJECT(e_entry->canvas), "size_request",
- GTK_SIGNAL_FUNC(canvas_size_request), e_entry);
- e_entry->item = E_TEXT(gnome_canvas_item_new(gnome_canvas_root(e_entry->canvas),
- e_text_get_type(),
- "clip", TRUE,
- "fill_clip_rectangle", TRUE,
- "anchor", GTK_ANCHOR_NW,
- "draw_borders", TRUE,
- NULL));
-
- gtk_table_attach_defaults(gtk_table, GTK_WIDGET(e_entry->canvas),
- 0, 1, 0, 1);
- gtk_widget_show(GTK_WIDGET(e_entry->canvas));
-}
-
-EEntry *
-e_entry_construct (EEntry *e_entry)
-{
- return e_entry;
-}
-
-GtkWidget *
-e_entry_new (void)
-{
- EEntry *e_entry;
- e_entry = gtk_type_new (e_entry_get_type ());
- e_entry = e_entry_construct (e_entry);
-
- return GTK_WIDGET (e_entry);
-}
-
-static void
-et_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EEntry *ee = E_ENTRY (o);
-
- switch (arg_id){
- case ARG_MODEL:
- gtk_object_get(GTK_OBJECT(ee->item),
- "model", &GTK_VALUE_OBJECT (*arg),
- NULL);
- break;
-
- case ARG_EVENT_PROCESSOR:
- gtk_object_get(GTK_OBJECT(ee->item),
- "event_processor", &GTK_VALUE_OBJECT (*arg),
- NULL);
- break;
-
- case ARG_TEXT:
- gtk_object_get(GTK_OBJECT(ee->item),
- "text", &GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_FONT_GDK:
- gtk_object_get(GTK_OBJECT(ee->item),
- "font_gdk", &GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_JUSTIFICATION:
- gtk_object_get(GTK_OBJECT(ee->item),
- "justification", &GTK_VALUE_ENUM (*arg),
- NULL);
- break;
-
- case ARG_FILL_COLOR_GDK:
- gtk_object_get(GTK_OBJECT(ee->item),
- "fill_color_gdk", &GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_FILL_COLOR_RGBA:
- gtk_object_get(GTK_OBJECT(ee->item),
- "fill_color_rgba", &GTK_VALUE_UINT (*arg),
- NULL);
- break;
-
- case ARG_FILL_STIPPLE:
- gtk_object_get(GTK_OBJECT(ee->item),
- "fill_stiple", &GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_EDITABLE:
- gtk_object_get(GTK_OBJECT(ee->item),
- "editable", &GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_USE_ELLIPSIS:
- gtk_object_get(GTK_OBJECT(ee->item),
- "use_ellipsis", &GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_ELLIPSIS:
- gtk_object_get(GTK_OBJECT(ee->item),
- "ellipsis", &GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_LINE_WRAP:
- gtk_object_get(GTK_OBJECT(ee->item),
- "line_wrap", &GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_BREAK_CHARACTERS:
- gtk_object_get(GTK_OBJECT(ee->item),
- "break_characters", &GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_MAX_LINES:
- gtk_object_get(GTK_OBJECT(ee->item),
- "max_lines", &GTK_VALUE_INT (*arg),
- NULL);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-et_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EEntry *ee = E_ENTRY (o);
-
- switch (arg_id){
- case ARG_MODEL:
- gtk_object_set(GTK_OBJECT(ee->item),
- "model", GTK_VALUE_OBJECT (*arg),
- NULL);
- break;
-
- case ARG_EVENT_PROCESSOR:
- gtk_object_set(GTK_OBJECT(ee->item),
- "event_processor", GTK_VALUE_OBJECT (*arg),
- NULL);
- break;
-
- case ARG_TEXT:
- gtk_object_set(GTK_OBJECT(ee->item),
- "text", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_FONT:
- gtk_object_set(GTK_OBJECT(ee->item),
- "font", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_FONTSET:
- gtk_object_set(GTK_OBJECT(ee->item),
- "fontset", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_FONT_GDK:
- gtk_object_set(GTK_OBJECT(ee->item),
- "font_gdk", GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_JUSTIFICATION:
- gtk_object_set(GTK_OBJECT(ee->item),
- "justification", GTK_VALUE_ENUM (*arg),
- NULL);
- break;
-
- case ARG_FILL_COLOR:
- gtk_object_set(GTK_OBJECT(ee->item),
- "fill_color", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_FILL_COLOR_GDK:
- gtk_object_set(GTK_OBJECT(ee->item),
- "fill_color_gdk", GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_FILL_COLOR_RGBA:
- gtk_object_set(GTK_OBJECT(ee->item),
- "fill_color_rgba", GTK_VALUE_UINT (*arg),
- NULL);
- break;
-
- case ARG_FILL_STIPPLE:
- gtk_object_set(GTK_OBJECT(ee->item),
- "fill_stiple", GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_EDITABLE:
- gtk_object_set(GTK_OBJECT(ee->item),
- "editable", GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_USE_ELLIPSIS:
- gtk_object_set(GTK_OBJECT(ee->item),
- "use_ellipsis", GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_ELLIPSIS:
- gtk_object_set(GTK_OBJECT(ee->item),
- "ellipsis", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_LINE_WRAP:
- gtk_object_set(GTK_OBJECT(ee->item),
- "line_wrap", GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_BREAK_CHARACTERS:
- gtk_object_set(GTK_OBJECT(ee->item),
- "break_characters", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_MAX_LINES:
- gtk_object_set(GTK_OBJECT(ee->item),
- "max_lines", GTK_VALUE_INT (*arg),
- NULL);
- break;
- }
-}
-
-static void
-e_entry_class_init (GtkObjectClass *object_class)
-{
- EEntryClass *klass = E_ENTRY_CLASS(object_class);
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->set_arg = et_set_arg;
- object_class->get_arg = et_get_arg;
-
- klass->changed = NULL;
- klass->activate = NULL;
-
- e_entry_signals[E_ENTRY_CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EEntryClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- e_entry_signals[E_ENTRY_ACTIVATE] =
- gtk_signal_new ("activate",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EEntryClass, activate),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
-
- gtk_object_class_add_signals (object_class, e_entry_signals, E_ENTRY_LAST_SIGNAL);
-
- gtk_object_add_arg_type ("EEntry::model",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_MODEL);
- gtk_object_add_arg_type ("EEntry::event_processor",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_EVENT_PROCESSOR);
- gtk_object_add_arg_type ("EEntry::text",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_TEXT);
- gtk_object_add_arg_type ("EEntry::font",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FONT);
- gtk_object_add_arg_type ("EEntry::fontset",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FONTSET);
- gtk_object_add_arg_type ("EEntry::font_gdk",
- GTK_TYPE_GDK_FONT, GTK_ARG_READWRITE, ARG_FONT_GDK);
- gtk_object_add_arg_type ("EEntry::justification",
- GTK_TYPE_JUSTIFICATION, GTK_ARG_READWRITE, ARG_JUSTIFICATION);
- gtk_object_add_arg_type ("EEntry::fill_color",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FILL_COLOR);
- gtk_object_add_arg_type ("EEntry::fill_color_gdk",
- GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_FILL_COLOR_GDK);
- gtk_object_add_arg_type ("EEntry::fill_color_rgba",
- GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_FILL_COLOR_RGBA);
- gtk_object_add_arg_type ("EEntry::fill_stipple",
- GTK_TYPE_GDK_WINDOW, GTK_ARG_READWRITE, ARG_FILL_STIPPLE);
- gtk_object_add_arg_type ("EEntry::editable",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_EDITABLE);
- gtk_object_add_arg_type ("EEntry::use_ellipsis",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_USE_ELLIPSIS);
- gtk_object_add_arg_type ("EEntry::ellipsis",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ELLIPSIS);
- gtk_object_add_arg_type ("EEntry::line_wrap",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_LINE_WRAP);
- gtk_object_add_arg_type ("EEntry::break_characters",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_BREAK_CHARACTERS);
- gtk_object_add_arg_type ("EEntry::max_lines",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_MAX_LINES);
-}
-
-E_MAKE_TYPE(e_entry, "EEntry", EEntry, e_entry_class_init, e_entry_init, PARENT_TYPE);
diff --git a/widgets/e-text/e-entry.h b/widgets/e-text/e-entry.h
deleted file mode 100644
index ad349659c3..0000000000
--- a/widgets/e-text/e-entry.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_ENTRY_H_
-#define _E_ENTRY_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gtk/gtktable.h>
-#include <gnome-xml/tree.h>
-#include "e-text.h"
-
-BEGIN_GNOME_DECLS
-
-#define E_ENTRY_TYPE (e_entry_get_type ())
-#define E_ENTRY(o) (GTK_CHECK_CAST ((o), E_ENTRY_TYPE, EEntry))
-#define E_ENTRY_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_ENTRY_TYPE, EEntryClass))
-#define E_IS_ENTRY(o) (GTK_CHECK_TYPE ((o), E_ENTRY_TYPE))
-#define E_IS_ENTRY_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_ENTRY_TYPE))
-
-typedef struct {
- GtkTable parent;
-
- GnomeCanvas *canvas;
- EText *item;
-} EEntry;
-
-typedef struct {
- GtkTableClass parent_class;
-
- void (* changed) (EEntry *entry);
- void (* activate) (EEntry *entry);
-} EEntryClass;
-
-GtkType e_entry_get_type (void);
-
-EEntry *e_entry_construct (EEntry *e_entry);
-GtkWidget *e_entry_new (void);
-
-END_GNOME_DECLS
-
-#endif /* _E_ENTRY_H_ */
diff --git a/widgets/e-text/e-text-event-processor-emacs-like.c b/widgets/e-text/e-text-event-processor-emacs-like.c
deleted file mode 100644
index be323d028f..0000000000
--- a/widgets/e-text/e-text-event-processor-emacs-like.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-text-event-processor-emacs-like.h"
-static void e_text_event_processor_emacs_like_init (ETextEventProcessorEmacsLike *card);
-static void e_text_event_processor_emacs_like_class_init (ETextEventProcessorEmacsLikeClass *klass);
-static gint e_text_event_processor_emacs_like_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event);
-
-static ETextEventProcessorClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0
-};
-
-static const ETextEventProcessorCommand control_keys[26] =
-{
- { E_TEP_START_OF_LINE, E_TEP_MOVE, 0, "" }, /* a */
- { E_TEP_BACKWARD_CHARACTER, E_TEP_MOVE, 0, "" }, /* b */
- { E_TEP_SELECTION, E_TEP_COPY, 0, "" }, /* c */
- { E_TEP_FORWARD_CHARACTER, E_TEP_DELETE, 0, "" }, /* d */
- { E_TEP_END_OF_LINE, E_TEP_MOVE, 0, "" }, /* e */
- { E_TEP_FORWARD_CHARACTER, E_TEP_MOVE, 0, "" }, /* f */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* g */
- { E_TEP_BACKWARD_CHARACTER, E_TEP_DELETE, 0, "" }, /* h */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* i */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* j */
- { E_TEP_END_OF_LINE, E_TEP_DELETE, 0, "" }, /* k */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* l */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* m */
- { E_TEP_FORWARD_LINE, E_TEP_MOVE, 0, "" }, /* n */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* o */
- { E_TEP_BACKWARD_LINE, E_TEP_MOVE, 0, "" }, /* p */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* q */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* r */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* s */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* t */
- { E_TEP_START_OF_LINE, E_TEP_DELETE, 0, "" }, /* u */
- { E_TEP_SELECTION, E_TEP_PASTE, 0, "" }, /* v */
- { E_TEP_SELECTION, E_TEP_DELETE, 0, "" }, /* w */
- { E_TEP_SELECTION, E_TEP_DELETE, 0, "" }, /* x */
- { E_TEP_SELECTION, E_TEP_PASTE, 0, "" }, /* y */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" } /* z */
-};
-
-static const ETextEventProcessorCommand alt_keys[26] =
-{
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* a */
- { E_TEP_BACKWARD_WORD, E_TEP_MOVE, 0, "" }, /* b */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* c */
- { E_TEP_FORWARD_WORD, E_TEP_DELETE, 0, "" }, /* d */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* e */
- { E_TEP_FORWARD_WORD, E_TEP_MOVE, 0, "" }, /* f */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* g */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* h */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* i */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* j */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* k */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* l */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* m */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* n */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* o */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* p */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* q */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* r */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* s */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* t */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* u */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* v */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* w */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* x */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* y */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" } /* z */
-
-};
-
-GtkType
-e_text_event_processor_emacs_like_get_type (void)
-{
- static GtkType text_event_processor_emacs_like_type = 0;
-
- if (!text_event_processor_emacs_like_type)
- {
- static const GtkTypeInfo text_event_processor_emacs_like_info =
- {
- "ETextEventProcessorEmacsLike",
- sizeof (ETextEventProcessorEmacsLike),
- sizeof (ETextEventProcessorEmacsLikeClass),
- (GtkClassInitFunc) e_text_event_processor_emacs_like_class_init,
- (GtkObjectInitFunc) e_text_event_processor_emacs_like_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- text_event_processor_emacs_like_type = gtk_type_unique (e_text_event_processor_get_type (), &text_event_processor_emacs_like_info);
- }
-
- return text_event_processor_emacs_like_type;
-}
-
-static void
-e_text_event_processor_emacs_like_class_init (ETextEventProcessorEmacsLikeClass *klass)
-{
- GtkObjectClass *object_class;
- ETextEventProcessorClass *processor_class;
-
- object_class = (GtkObjectClass*) klass;
- processor_class = (ETextEventProcessorClass*) klass;
-
- parent_class = gtk_type_class (e_text_event_processor_get_type ());
-
- processor_class->event = e_text_event_processor_emacs_like_event;
-}
-
-static void
-e_text_event_processor_emacs_like_init (ETextEventProcessorEmacsLike *tep)
-{
-}
-
-static gint
-e_text_event_processor_emacs_like_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event)
-{
- ETextEventProcessorCommand command;
- ETextEventProcessorEmacsLike *tep_el = E_TEXT_EVENT_PROCESSOR_EMACS_LIKE(tep);
- command.action = E_TEP_NOP;
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- if (event->button.button == 1) {
- command.action = E_TEP_GRAB;
- command.time = event->button.time;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
- if (event->button.state & GDK_SHIFT_MASK)
- command.action = E_TEP_SELECT;
- else
- command.action = E_TEP_MOVE;
- command.position = E_TEP_VALUE;
- command.value = event->button.position;
- command.time = event->button.time;
- tep_el->mouse_down = TRUE;
- }
- break;
- case GDK_2BUTTON_PRESS:
- if (event->button.button == 1) {
- command.action = E_TEP_SELECT;
- command.position = E_TEP_SELECT_WORD;
- command.time = event->button.time;
- }
- break;
- case GDK_3BUTTON_PRESS:
- if (event->button.button == 1) {
- command.action = E_TEP_SELECT;
- command.position = E_TEP_SELECT_ALL;
- command.time = event->button.time;
- }
- break;
- case GDK_BUTTON_RELEASE:
- if (event->button.button == 1) {
- command.action = E_TEP_UNGRAB;
- command.time = event->button.time;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
- command.time = event->button.time;
- tep_el->mouse_down = FALSE;
- command.action = E_TEP_NOP;
- } else if (event->button.button == 2) {
- command.action = E_TEP_MOVE;
- command.position = E_TEP_VALUE;
- command.value = event->button.position;
- command.time = event->button.time;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
-
- command.action = E_TEP_GET_SELECTION;
- command.position = E_TEP_SELECTION;
- command.value = 0;
- command.time = event->button.time;
- }
- break;
- case GDK_MOTION_NOTIFY:
- if (tep_el->mouse_down) {
- command.action = E_TEP_SELECT;
- command.position = E_TEP_VALUE;
- command.time = event->motion.time;
- command.value = event->motion.position;
- }
- break;
- case GDK_KEY_PRESS:
- {
- ETextEventProcessorEventKey key = event->key;
- command.time = event->key.time;
- if (key.state & GDK_SHIFT_MASK)
- command.action = E_TEP_SELECT;
- else
- command.action = E_TEP_MOVE;
- switch(key.keyval) {
- case GDK_Home:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_START_OF_BUFFER;
- else
- command.position = E_TEP_START_OF_LINE;
- break;
- case GDK_End:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_END_OF_BUFFER;
- else
- command.position = E_TEP_END_OF_LINE;
- break;
- case GDK_Page_Up: command.position = E_TEP_BACKWARD_PAGE; break;
- case GDK_Page_Down: command.position = E_TEP_FORWARD_PAGE; break;
- /* CUA has Ctrl-Up/Ctrl-Down as paragraph up down */
- case GDK_Up: command.position = E_TEP_BACKWARD_LINE; break;
- case GDK_Down: command.position = E_TEP_FORWARD_LINE; break;
- case GDK_Left:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_BACKWARD_WORD;
- else
- command.position = E_TEP_BACKWARD_CHARACTER;
- break;
- case GDK_Right:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_FORWARD_WORD;
- else
- command.position = E_TEP_FORWARD_CHARACTER;
- break;
-
- case GDK_BackSpace:
- command.action = E_TEP_DELETE;
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_BACKWARD_WORD;
- else
- command.position = E_TEP_BACKWARD_CHARACTER;
- break;
- case GDK_Clear:
- command.action = E_TEP_DELETE;
- command.position = E_TEP_END_OF_LINE;
- break;
- case GDK_Insert:
- if (key.state & GDK_SHIFT_MASK) {
- command.action = E_TEP_PASTE;
- command.position = E_TEP_SELECTION;
- } else if (key.state & GDK_CONTROL_MASK) {
- command.action = E_TEP_COPY;
- command.position = E_TEP_SELECTION;
- } else {
- /* gtk_toggle_insert(text) -- IMPLEMENT */
- }
- break;
- case GDK_Delete:
- if (key.state & GDK_CONTROL_MASK){
- command.action = E_TEP_DELETE;
- command.position = E_TEP_FORWARD_WORD;
- } else if (key.state & GDK_SHIFT_MASK) {
- command.action = E_TEP_COPY;
- command.position = E_TEP_SELECTION;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
-
- command.action = E_TEP_DELETE;
- command.position = E_TEP_SELECTION;
- } else {
- command.action = E_TEP_DELETE;
- command.position = E_TEP_FORWARD_CHARACTER;
- }
- break;
- case GDK_Tab:
- /* Don't insert literally */
- command.action = E_TEP_NOP;
- command.position = E_TEP_SELECTION;
- break;
- case GDK_Return:
- if (key.state & GDK_CONTROL_MASK) {
- command.action = E_TEP_ACTIVATE;
- command.position = E_TEP_SELECTION;
- } else {
- command.action = E_TEP_INSERT;
- command.position = E_TEP_SELECTION;
- command.value = 1;
- command.string = "\n";
- }
- break;
- case GDK_Escape:
- /* Don't insert literally */
- command.action = E_TEP_NOP;
- command.position = E_TEP_SELECTION;
- break;
-
- default:
- if (key.state & GDK_CONTROL_MASK) {
- if ((key.keyval >= 'A') && (key.keyval <= 'Z'))
- key.keyval -= 'A' - 'a';
-
- if ((key.keyval >= 'a') && (key.keyval <= 'z')) {
- command.position = control_keys[(int) (key.keyval - 'a')].position;
- if (control_keys[(int) (key.keyval - 'a')].action != E_TEP_MOVE)
- command.action = control_keys[(int) (key.keyval - 'a')].action;
- command.value = control_keys[(int) (key.keyval - 'a')].value;
- command.string = control_keys[(int) (key.keyval - 'a')].string;
- }
-
- if (key.keyval == 'x' || key.keyval == 'w') {
- command.action = E_TEP_COPY;
- command.position = E_TEP_SELECTION;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
-
- command.action = E_TEP_DELETE;
- command.position = E_TEP_SELECTION;
- }
-
- break;
- } else if (key.state & GDK_MOD1_MASK) {
- if ((key.keyval >= 'A') && (key.keyval <= 'Z'))
- key.keyval -= 'A' - 'a';
-
- if ((key.keyval >= 'a') && (key.keyval <= 'z')) {
- command.position = alt_keys[(int) (key.keyval - 'a')].position;
- if (alt_keys[(int) (key.keyval - 'a')].action != E_TEP_MOVE)
- command.action = alt_keys[(int) (key.keyval - 'a')].action;
- command.value = alt_keys[(int) (key.keyval - 'a')].value;
- command.string = alt_keys[(int) (key.keyval - 'a')].string;
- }
- } else if (key.length > 0) {
- command.action = E_TEP_INSERT;
- command.position = E_TEP_SELECTION;
- command.value = strlen(key.string);
- command.string = key.string;
-
- } else {
- command.action = E_TEP_NOP;
- }
- }
- break;
- case GDK_KEY_RELEASE:
- command.time = event->key.time;
- command.action = E_TEP_NOP;
- break;
- default:
- command.action = E_TEP_NOP;
- break;
- }
- }
- if (command.action != E_TEP_NOP) {
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
- return 1;
- }
- else
- return 0;
-}
-
-ETextEventProcessor *
-e_text_event_processor_emacs_like_new (void)
-{
- ETextEventProcessorEmacsLike *retval = gtk_type_new (e_text_event_processor_emacs_like_get_type ());
- return E_TEXT_EVENT_PROCESSOR (retval);
-}
-
diff --git a/widgets/e-text/e-text-event-processor-emacs-like.h b/widgets/e-text/e-text-event-processor-emacs-like.h
deleted file mode 100644
index 651bb552b3..0000000000
--- a/widgets/e-text/e-text-event-processor-emacs-like.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor-emacs-like.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_TEXT_EVENT_PROCESSOR_EMACS_LIKE_H__
-#define __E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_H__
-
-#include <gnome.h>
-#include "e-text-event-processor.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETextEventProcessorEmacsLike - Turns events on a text widget into commands. Uses an emacs-ish interface.
- *
- */
-
-#define E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE (e_text_event_processor_emacs_like_get_type ())
-#define E_TEXT_EVENT_PROCESSOR_EMACS_LIKE(obj) (GTK_CHECK_CAST ((obj), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE, ETextEventProcessorEmacsLike))
-#define E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE, ETextEventProcessorEmacsLikeClass))
-#define E_IS_TEXT_EVENT_PROCESSOR_EMACS_LIKE(obj) (GTK_CHECK_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE))
-#define E_IS_TEXT_EVENT_PROCESSOR_EMACS_LIKE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE))
-
-
-typedef struct _ETextEventProcessorEmacsLike ETextEventProcessorEmacsLike;
-typedef struct _ETextEventProcessorEmacsLikeClass ETextEventProcessorEmacsLikeClass;
-
-struct _ETextEventProcessorEmacsLike
-{
- ETextEventProcessor parent;
-
- /* object specific fields */
- gboolean mouse_down;
-};
-
-struct _ETextEventProcessorEmacsLikeClass
-{
- ETextEventProcessorClass parent_class;
-};
-
-
-GtkType e_text_event_processor_emacs_like_get_type (void);
-ETextEventProcessor *e_text_event_processor_emacs_like_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_H__ */
diff --git a/widgets/e-text/e-text-event-processor-types.h b/widgets/e-text/e-text-event-processor-types.h
deleted file mode 100644
index 8f2ffbaf39..0000000000
--- a/widgets/e-text/e-text-event-processor-types.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#ifndef __E_TEXT_EVENT_PROCESSOR_TYPES_H__
-#define __E_TEXT_EVENT_PROCESSOR_TYPES_H__
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#include <gdk/gdktypes.h>
-
-typedef enum _ETextEventProcessorCommandPosition ETextEventProcessorCommandPosition;
-typedef enum _ETextEventProcessorCommandAction ETextEventProcessorCommandAction;
-typedef struct _ETextEventProcessorCommand ETextEventProcessorCommand;
-
-typedef union _ETextEventProcessorEvent ETextEventProcessorEvent;
-typedef struct _ETextEventProcessorEventButton ETextEventProcessorEventButton;
-typedef struct _ETextEventProcessorEventKey ETextEventProcessorEventKey;
-typedef struct _ETextEventProcessorEventMotion ETextEventProcessorEventMotion;
-
-enum _ETextEventProcessorCommandPosition {
- E_TEP_VALUE,
- E_TEP_SELECTION,
-
- E_TEP_START_OF_BUFFER,
- E_TEP_END_OF_BUFFER,
-
- E_TEP_START_OF_LINE,
- E_TEP_END_OF_LINE,
-
- E_TEP_FORWARD_CHARACTER,
- E_TEP_BACKWARD_CHARACTER,
-
- E_TEP_FORWARD_WORD,
- E_TEP_BACKWARD_WORD,
-
- E_TEP_FORWARD_LINE,
- E_TEP_BACKWARD_LINE,
-
- E_TEP_FORWARD_PARAGRAPH,
- E_TEP_BACKWARD_PARAGRAPH,
-
- E_TEP_FORWARD_PAGE,
- E_TEP_BACKWARD_PAGE,
-
- E_TEP_SELECT_WORD,
- E_TEP_SELECT_ALL
-
-};
-
-enum _ETextEventProcessorCommandAction {
- E_TEP_MOVE,
- E_TEP_SELECT,
- E_TEP_DELETE,
- E_TEP_INSERT,
-
- E_TEP_COPY,
- E_TEP_PASTE,
- E_TEP_GET_SELECTION,
- E_TEP_SET_SELECT_BY_WORD,
- E_TEP_ACTIVATE,
-
- E_TEP_GRAB,
- E_TEP_UNGRAB,
-
- E_TEP_NOP
-};
-
-struct _ETextEventProcessorCommand {
- ETextEventProcessorCommandPosition position;
- ETextEventProcessorCommandAction action;
- int value;
- char *string;
- guint32 time;
-};
-
-struct _ETextEventProcessorEventButton {
- GdkEventType type;
- guint32 time;
- guint state;
- guint button;
- gint position;
-};
-
-struct _ETextEventProcessorEventKey {
- GdkEventType type;
- guint32 time;
- guint state;
- guint keyval;
- gint length;
- gchar *string;
-};
-
-struct _ETextEventProcessorEventMotion {
- GdkEventType type;
- guint32 time;
- guint state;
- gint position;
-};
-
-union _ETextEventProcessorEvent {
- GdkEventType type;
- ETextEventProcessorEventButton button;
- ETextEventProcessorEventKey key;
- ETextEventProcessorEventMotion motion;
-};
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TEXT_EVENT_PROCESSOR_TYPES_H__ */
diff --git a/widgets/e-text/e-text-event-processor.c b/widgets/e-text/e-text-event-processor.c
deleted file mode 100644
index 47f028ca62..0000000000
--- a/widgets/e-text/e-text-event-processor.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-text-event-processor.h"
-static void e_text_event_processor_init (ETextEventProcessor *card);
-static void e_text_event_processor_class_init (ETextEventProcessorClass *klass);
-
-static GtkObjectClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0
-};
-
-enum {
- E_TEP_EVENT,
- E_TEP_LAST_SIGNAL
-};
-
-static guint e_tep_signals[E_TEP_LAST_SIGNAL] = { 0 };
-
-GtkType
-e_text_event_processor_get_type (void)
-{
- static GtkType text_event_processor_type = 0;
-
- if (!text_event_processor_type)
- {
- static const GtkTypeInfo text_event_processor_info =
- {
- "ETextEventProcessor",
- sizeof (ETextEventProcessor),
- sizeof (ETextEventProcessorClass),
- (GtkClassInitFunc) e_text_event_processor_class_init,
- (GtkObjectInitFunc) e_text_event_processor_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- text_event_processor_type = gtk_type_unique (gtk_object_get_type (), &text_event_processor_info);
- }
-
- return text_event_processor_type;
-}
-
-static void
-e_text_event_processor_class_init (ETextEventProcessorClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass*) klass;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-
- e_tep_signals[E_TEP_EVENT] =
- gtk_signal_new ("command",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETextEventProcessorClass, command),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (object_class, e_tep_signals, E_TEP_LAST_SIGNAL);
-
- klass->event = NULL;
- klass->command = NULL;
-}
-
-static void
-e_text_event_processor_init (ETextEventProcessor *tep)
-{
-}
-
-gint
-e_text_event_processor_handle_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event)
-{
- if (E_TEXT_EVENT_PROCESSOR_CLASS(GTK_OBJECT(tep)->klass)->event) {
- return E_TEXT_EVENT_PROCESSOR_CLASS(GTK_OBJECT(tep)->klass)->event(tep, event);
- } else {
- return 0;
- }
-}
diff --git a/widgets/e-text/e-text-event-processor.h b/widgets/e-text/e-text-event-processor.h
deleted file mode 100644
index 1fc79f3f70..0000000000
--- a/widgets/e-text/e-text-event-processor.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_TEXT_EVENT_PROCESSOR_H__
-#define __E_TEXT_EVENT_PROCESSOR_H__
-
-#include <gnome.h>
-#include "e-text-event-processor-types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETextEventProcessor - Turns events on a text widget into commands.
- *
- */
-
-#define E_TEXT_EVENT_PROCESSOR_TYPE (e_text_event_processor_get_type ())
-#define E_TEXT_EVENT_PROCESSOR(obj) (GTK_CHECK_CAST ((obj), E_TEXT_EVENT_PROCESSOR_TYPE, ETextEventProcessor))
-#define E_TEXT_EVENT_PROCESSOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TEXT_EVENT_PROCESSOR_TYPE, ETextEventProcessorClass))
-#define E_IS_TEXT_EVENT_PROCESSOR(obj) (GTK_CHECK_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_TYPE))
-#define E_IS_TEXT_EVENT_PROCESSOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_TYPE))
-
-
-typedef struct _ETextEventProcessor ETextEventProcessor;
-typedef struct _ETextEventProcessorClass ETextEventProcessorClass;
-
-struct _ETextEventProcessor
-{
- GtkObject parent;
-
- /* object specific fields */
-
-};
-
-struct _ETextEventProcessorClass
-{
- GtkObjectClass parent_class;
-
- /* signals */
- void (* command) (ETextEventProcessor *tep, ETextEventProcessorCommand *command);
-
- /* virtual functions */
- gint (* event) (ETextEventProcessor *tep, ETextEventProcessorEvent *event);
-};
-
-
-GtkType e_text_event_processor_get_type (void);
-gint e_text_event_processor_handle_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TEXT_EVENT_PROCESSOR_H__ */
diff --git a/widgets/e-text/e-text-model.c b/widgets/e-text/e-text-model.c
deleted file mode 100644
index 6ca650867c..0000000000
--- a/widgets/e-text/e-text-model.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ETextModel - Text item model for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#include <config.h>
-#include <ctype.h>
-#include "e-text-model.h"
-
-enum {
- E_TEXT_MODEL_CHANGED,
- E_TEXT_MODEL_LAST_SIGNAL
-};
-
-static guint e_text_model_signals[E_TEXT_MODEL_LAST_SIGNAL] = { 0 };
-
-static void e_text_model_class_init (ETextModelClass *class);
-static void e_text_model_init (ETextModel *model);
-static void e_text_model_destroy (GtkObject *object);
-
-static gchar *e_text_model_real_get_text(ETextModel *model);
-static void e_text_model_real_set_text(ETextModel *model, gchar *text);
-static void e_text_model_real_insert(ETextModel *model, gint postion, gchar *text);
-static void e_text_model_real_insert_length(ETextModel *model, gint postion, gchar *text, gint length);
-static void e_text_model_real_delete(ETextModel *model, gint postion, gint length);
-
-static GtkObject *parent_class;
-
-
-
-/**
- * e_text_model_get_type:
- * @void:
- *
- * Registers the &ETextModel class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ETextModel class.
- **/
-GtkType
-e_text_model_get_type (void)
-{
- static GtkType model_type = 0;
-
- if (!model_type) {
- GtkTypeInfo model_info = {
- "ETextModel",
- sizeof (ETextModel),
- sizeof (ETextModelClass),
- (GtkClassInitFunc) e_text_model_class_init,
- (GtkObjectInitFunc) e_text_model_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- model_type = gtk_type_unique (gtk_object_get_type (), &model_info);
- }
-
- return model_type;
-}
-
-/* Class initialization function for the text item */
-static void
-e_text_model_class_init (ETextModelClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) klass;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-
- e_text_model_signals[E_TEXT_MODEL_CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETextModelClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_text_model_signals, E_TEXT_MODEL_LAST_SIGNAL);
-
- klass->changed = NULL;
- klass->get_text = e_text_model_real_get_text;
- klass->set_text = e_text_model_real_set_text;
- klass->insert = e_text_model_real_insert;
- klass->insert_length = e_text_model_real_insert_length;
- klass->delete = e_text_model_real_delete;
-
- object_class->destroy = e_text_model_destroy;
-}
-
-/* Object initialization function for the text item */
-static void
-e_text_model_init (ETextModel *model)
-{
- model->text = NULL;
-}
-
-/* Destroy handler for the text item */
-static void
-e_text_model_destroy (GtkObject *object)
-{
- ETextModel *model;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (object));
-
- model = E_TEXT_MODEL (object);
-
- if (model->text)
- g_free (model->text);
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-static gchar *
-e_text_model_real_get_text(ETextModel *model)
-{
- if (model->text)
- return model->text;
- else
- return "";
-}
-
-static void
-e_text_model_real_set_text(ETextModel *model, gchar *text)
-{
- if (model->text)
- g_free(model->text);
- model->text = g_strdup(text);
- e_text_model_changed(model);
-}
-
-static void
-e_text_model_real_insert(ETextModel *model, gint position, gchar *text)
-{
- gchar *temp = g_strdup_printf("%.*s%s%s", position, model->text, text, model->text + position);
- if (model->text)
- g_free(model->text);
- model->text = temp;
- e_text_model_changed(model);
-}
-
-static void
-e_text_model_real_insert_length(ETextModel *model, gint position, gchar *text, gint length)
-{
- gchar *temp = g_strdup_printf("%.*s%.*s%s", position, model->text, length, text, model->text + position);
- if (model->text)
- g_free(model->text);
- model->text = temp;
- e_text_model_changed(model);
-}
-
-static void
-e_text_model_real_delete(ETextModel *model, gint position, gint length)
-{
- memmove(model->text + position, model->text + position + length, strlen(model->text + position + length) + 1);
- e_text_model_changed(model);
-}
-
-void
-e_text_model_changed(ETextModel *model)
-{
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (model));
-
- gtk_signal_emit (GTK_OBJECT (model),
- e_text_model_signals [E_TEXT_MODEL_CHANGED]);
-}
-
-gchar *
-e_text_model_get_text(ETextModel *model)
-{
- g_return_val_if_fail (model != NULL, NULL);
- g_return_val_if_fail (E_IS_TEXT_MODEL (model), NULL);
-
- if ( E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->get_text )
- return E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->get_text(model);
- else
- return "";
-}
-
-void
-e_text_model_set_text(ETextModel *model, gchar *text)
-{
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (model));
-
- if ( E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->set_text )
- E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->set_text(model, text);
-}
-
-void
-e_text_model_insert(ETextModel *model, gint position, gchar *text)
-{
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (model));
-
- if ( E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->insert )
- E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->insert(model, position, text);
-}
-
-void
-e_text_model_insert_length(ETextModel *model, gint position, gchar *text, gint length)
-{
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (model));
-
- if ( E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->insert_length )
- E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->insert_length(model, position, text, length);
-}
-
-void
-e_text_model_delete(ETextModel *model, gint position, gint length)
-{
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (model));
-
- if ( E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->delete )
- E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->delete(model, position, length);
-}
-
-ETextModel *
-e_text_model_new(void)
-{
- ETextModel *model = gtk_type_new (e_text_model_get_type ());
- model->text = g_strdup("");
- return model;
-}
diff --git a/widgets/e-text/e-text-model.h b/widgets/e-text/e-text-model.h
deleted file mode 100644
index 5b15ccb117..0000000000
--- a/widgets/e-text/e-text-model.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ETextModel - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#ifndef E_TEXT_MODEL_H
-#define E_TEXT_MODEL_H
-
-#include <gnome.h>
-
-
-BEGIN_GNOME_DECLS
-
-#define E_TYPE_TEXT_MODEL (e_text_model_get_type ())
-#define E_TEXT_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TEXT_MODEL, ETextModel))
-#define E_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TEXT_MODEL, ETextModelClass))
-#define E_IS_TEXT_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TEXT_MODEL))
-#define E_IS_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_TEXT_MODEL))
-
-typedef struct _ETextModel ETextModel;
-typedef struct _ETextModelClass ETextModelClass;
-
-struct _ETextModel {
- GtkObject item;
-
- char *text; /* Text to display */
- int length;
-};
-
-struct _ETextModelClass {
- GtkObjectClass parent_class;
-
- /* Signal */
- void (* changed) (ETextModel *model);
-
- /* Virtual methods */
- char *(* get_text) (ETextModel *model);
- void (* set_text) (ETextModel *model, gchar *text);
- void (* insert) (ETextModel *model, gint position, gchar *text);
- void (* insert_length) (ETextModel *model, gint position, gchar *text, gint length);
- void (* delete) (ETextModel *model, gint position, gint length);
-};
-
-
-/* Standard Gtk function */
-GtkType e_text_model_get_type (void);
-ETextModel *e_text_model_new(void);
-
-void e_text_model_changed(ETextModel *model);
-gchar *e_text_model_get_text(ETextModel *model);
-void e_text_model_set_text(ETextModel *model, gchar *text);
-void e_text_model_insert(ETextModel *model, gint position, gchar *text);
-void e_text_model_insert_length(ETextModel *model, gint position, gchar *text, gint length);
-void e_text_model_delete(ETextModel *model, gint position, gint length);
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/widgets/e-text/e-text-test.c b/widgets/e-text/e-text-test.c
deleted file mode 100644
index 12a31cce7e..0000000000
--- a/widgets/e-text/e-text-test.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- ETextTest: E-Text item test program
- Copyright (C)2000: Iain Holmes <ih@csd.abdn.ac.uk>
-
- This code is licensed under the GPL
-*/
-
-#include "e-text.h"
-#include <gnome.h>
-#include "e-util/e-canvas.h"
-GnomeCanvasItem *rect;
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, GnomeCanvasItem *item)
-{
- double height;
- gnome_canvas_item_set( item,
- "width", (double) allocation->width,
- NULL );
- gtk_object_get(GTK_OBJECT(item),
- "height", &height,
- NULL);
- height = MAX(height, allocation->height);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, allocation->width, height );
- gnome_canvas_item_set( rect,
- "x2", (double) allocation->width,
- "y2", (double) height,
- NULL );
-}
-
-static void
-reflow (GtkWidget *canvas, GnomeCanvasItem *item)
-{
- double height;
- gtk_object_get(GTK_OBJECT(item),
- "height", &height,
- NULL);
- height = MAX(height, canvas->allocation.height);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, canvas->allocation.width, height );
- gnome_canvas_item_set( rect,
- "x2", (double) canvas->allocation.width,
- "y2", (double) height,
- NULL );
-}
-
-static void
-quit_cb (GtkWidget *widget,
- gpointer data)
-{
- gtk_main_quit ();
-}
-
-static void
-change_text_cb (GtkEntry *entry,
- EText *text)
-{
- gchar *str;
-
- str = gtk_entry_get_text (entry);
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (text),
- "text", str,
- NULL);
-}
-
-static void
-change_font_cb (GtkEntry *entry,
- EText *text)
-{
- gchar *font;
-
- font = gtk_entry_get_text (entry);
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (text),
- "font", font,
- NULL);
-}
-
-int
-main (int argc,
- char **argv)
-{
- GtkWidget *window, *canvas, *scroller, *vbox, *text, *font;
- GtkWidget *frame;
- GnomeCanvasItem *item;
-
- gnome_init ("ETextTest", "0.0.1", argc, argv);
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title (GTK_WINDOW (window), "EText Test");
- gtk_signal_connect (GTK_OBJECT (window), "destroy",
- GTK_SIGNAL_FUNC (quit_cb), NULL);
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
- canvas = e_canvas_new ();
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
- scroller = gtk_scrolled_window_new (NULL, NULL);
- vbox = gtk_vbox_new (FALSE, 2);
-
- gtk_container_add (GTK_CONTAINER (window), vbox);
- gtk_box_pack_start (GTK_BOX (vbox), scroller, TRUE, TRUE, 2);
- gtk_container_add (GTK_CONTAINER (scroller), canvas);
-
- frame = gtk_frame_new ("Text");
- text = gtk_entry_new ();
- gtk_entry_set_text(GTK_ENTRY(text), "Hello World! This is a really long string to test out the ellipsis stuff.");
- gtk_container_add (GTK_CONTAINER (frame), text);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
-
- frame = gtk_frame_new ("Font");
- font = gtk_entry_new ();
- gtk_entry_set_text(GTK_ENTRY(font), "fixed");
- gtk_container_add (GTK_CONTAINER (frame), font);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
-
- 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 );
-
- item = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_text_get_type (),
- "text", "Hello World! This is a really long string to test out the ellipsis stuff.",
- "font", "fixed",
- "fill_color", "black",
- "anchor", GTK_ANCHOR_NW,
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "editable", TRUE,
- "line_wrap", TRUE,
- "max_lines", 2,
- "width", 150.0,
- NULL);
-
- gtk_signal_connect (GTK_OBJECT (text), "activate",
- GTK_SIGNAL_FUNC (change_text_cb), item);
- gtk_signal_connect (GTK_OBJECT (font), "activate",
- GTK_SIGNAL_FUNC (change_font_cb), item);
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( allocate_callback ),
- item );
- gtk_signal_connect( GTK_OBJECT( canvas ), "reflow",
- GTK_SIGNAL_FUNC( reflow ),
- item );
- gnome_canvas_set_scroll_region (GNOME_CANVAS (canvas), 0.0, 0.0, 400.0, 400.0);
- gtk_widget_show_all (window);
- gtk_main ();
-
- return 0;
-}
diff --git a/widgets/e-text/e-text.c b/widgets/e-text/e-text.c
deleted file mode 100644
index 30e6452ed0..0000000000
--- a/widgets/e-text/e-text.c
+++ /dev/null
@@ -1,3365 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* EText - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#include <config.h>
-#include <math.h>
-#include <ctype.h>
-#include "e-text.h"
-#include <gdk/gdkx.h> /* for BlackPixel */
-#include <libart_lgpl/art_affine.h>
-#include <libart_lgpl/art_rgb.h>
-#include <libart_lgpl/art_rgb_bitmap_affine.h>
-#include <unicode.h>
-#include <gtk/gtkinvisible.h>
-#include "e-util/e-canvas.h"
-#include "e-util/e-canvas-utils.h"
-
-#include "e-text-event-processor-emacs-like.h"
-
-#define BORDER_INDENT 4
-
-enum {
- E_TEXT_CHANGED,
- E_TEXT_ACTIVATE,
- E_TEXT_LAST_SIGNAL
-};
-
-static guint e_text_signals[E_TEXT_LAST_SIGNAL] = { 0 };
-
-
-
-/* This defines a line of text */
-struct line {
- char *text; /* Line's text, it is a pointer into the text->text string */
- int length; /* Line's length in characters */
- int width; /* Line's width in pixels */
- int ellipsis_length; /* Length before adding ellipsis */
-};
-
-
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_MODEL,
- ARG_EVENT_PROCESSOR,
- ARG_TEXT,
- ARG_FONT,
- ARG_FONTSET,
- ARG_FONT_GDK,
- ARG_ANCHOR,
- ARG_JUSTIFICATION,
- ARG_CLIP_WIDTH,
- ARG_CLIP_HEIGHT,
- ARG_CLIP,
- ARG_FILL_CLIP_RECTANGLE,
- ARG_X_OFFSET,
- ARG_Y_OFFSET,
- ARG_FILL_COLOR,
- ARG_FILL_COLOR_GDK,
- ARG_FILL_COLOR_RGBA,
- ARG_FILL_STIPPLE,
- ARG_TEXT_WIDTH,
- ARG_TEXT_HEIGHT,
- ARG_EDITABLE,
- ARG_USE_ELLIPSIS,
- ARG_ELLIPSIS,
- ARG_LINE_WRAP,
- ARG_BREAK_CHARACTERS,
- ARG_MAX_LINES,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_DRAW_BORDERS,
-};
-
-
-enum {
- E_SELECTION_PRIMARY,
- E_SELECTION_CLIPBOARD
-};
-enum {
- TARGET_STRING,
- TARGET_TEXT,
- TARGET_COMPOUND_TEXT
-};
-
-static void e_text_class_init (ETextClass *class);
-static void e_text_init (EText *text);
-static void e_text_destroy (GtkObject *object);
-static void e_text_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_text_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-static void e_text_reflow (GnomeCanvasItem *item, int flags);
-static void e_text_update (GnomeCanvasItem *item, double *affine,
- ArtSVP *clip_path, int flags);
-static void e_text_realize (GnomeCanvasItem *item);
-static void e_text_unrealize (GnomeCanvasItem *item);
-static void e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-static double e_text_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item);
-static void e_text_bounds (GnomeCanvasItem *item,
- double *x1, double *y1, double *x2, double *y2);
-static void e_text_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
-static gint e_text_event (GnomeCanvasItem *item, GdkEvent *event);
-
-static void e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gpointer data);
-
-static void e_text_get_selection(EText *text, GdkAtom selection, guint32 time);
-static void e_text_supply_selection (EText *text, guint time, GdkAtom selection, guchar *data, gint length);
-
-static void e_text_text_model_changed(ETextModel *model, EText *text);
-
-static void _get_tep(EText *text);
-
-static GtkWidget *e_text_get_invisible(EText *text);
-static void _selection_clear_event (GtkInvisible *invisible,
- GdkEventSelection *event,
- EText *text);
-static void _selection_get (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint info,
- guint time_stamp,
- EText *text);
-static void _selection_received (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint time,
- EText *text);
-
-#if 0
-static ETextSuckFont *e_suck_font (GdkFont *font);
-static void e_suck_font_free (ETextSuckFont *suckfont);
-#endif
-
-static void e_text_free_lines(EText *text);
-
-static void calc_height (EText *text);
-static void calc_line_widths (EText *text);
-static void split_into_lines (EText *text);
-
-static GnomeCanvasItemClass *parent_class;
-static GdkAtom clipboard_atom = GDK_NONE;
-
-
-
-/**
- * e_text_get_type:
- * @void:
- *
- * Registers the &EText class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &EText class.
- **/
-GtkType
-e_text_get_type (void)
-{
- static GtkType text_type = 0;
-
- if (!text_type) {
- GtkTypeInfo text_info = {
- "EText",
- sizeof (EText),
- sizeof (ETextClass),
- (GtkClassInitFunc) e_text_class_init,
- (GtkObjectInitFunc) e_text_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- text_type = gtk_type_unique (gnome_canvas_item_get_type (), &text_info);
- }
-
- return text_type;
-}
-
-/* Class initialization function for the text item */
-static void
-e_text_class_init (ETextClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type ());
-
- e_text_signals[E_TEXT_CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETextClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- e_text_signals[E_TEXT_ACTIVATE] =
- gtk_signal_new ("activate",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETextClass, activate),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_text_signals, E_TEXT_LAST_SIGNAL);
-
-
- gtk_object_add_arg_type ("EText::model",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_MODEL);
- gtk_object_add_arg_type ("EText::event_processor",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_EVENT_PROCESSOR);
- gtk_object_add_arg_type ("EText::text",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_TEXT);
- gtk_object_add_arg_type ("EText::font",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FONT);
- gtk_object_add_arg_type ("EText::fontset",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FONTSET);
- gtk_object_add_arg_type ("EText::font_gdk",
- GTK_TYPE_GDK_FONT, GTK_ARG_READWRITE, ARG_FONT_GDK);
- gtk_object_add_arg_type ("EText::anchor",
- GTK_TYPE_ANCHOR_TYPE, GTK_ARG_READWRITE, ARG_ANCHOR);
- gtk_object_add_arg_type ("EText::justification",
- GTK_TYPE_JUSTIFICATION, GTK_ARG_READWRITE, ARG_JUSTIFICATION);
- gtk_object_add_arg_type ("EText::clip_width",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_CLIP_WIDTH);
- gtk_object_add_arg_type ("EText::clip_height",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_CLIP_HEIGHT);
- gtk_object_add_arg_type ("EText::clip",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CLIP);
- gtk_object_add_arg_type ("EText::fill_clip_rectangle",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_FILL_CLIP_RECTANGLE);
- gtk_object_add_arg_type ("EText::x_offset",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_X_OFFSET);
- gtk_object_add_arg_type ("EText::y_offset",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_Y_OFFSET);
- gtk_object_add_arg_type ("EText::fill_color",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FILL_COLOR);
- gtk_object_add_arg_type ("EText::fill_color_gdk",
- GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_FILL_COLOR_GDK);
- gtk_object_add_arg_type ("EText::fill_color_rgba",
- GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_FILL_COLOR_RGBA);
- gtk_object_add_arg_type ("EText::fill_stipple",
- GTK_TYPE_GDK_WINDOW, GTK_ARG_READWRITE, ARG_FILL_STIPPLE);
- gtk_object_add_arg_type ("EText::text_width",
- GTK_TYPE_DOUBLE, GTK_ARG_READABLE, ARG_TEXT_WIDTH);
- gtk_object_add_arg_type ("EText::text_height",
- GTK_TYPE_DOUBLE, GTK_ARG_READABLE, ARG_TEXT_HEIGHT);
- gtk_object_add_arg_type ("EText::editable",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_EDITABLE);
- gtk_object_add_arg_type ("EText::use_ellipsis",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_USE_ELLIPSIS);
- gtk_object_add_arg_type ("EText::ellipsis",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ELLIPSIS);
- gtk_object_add_arg_type ("EText::line_wrap",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_LINE_WRAP);
- gtk_object_add_arg_type ("EText::break_characters",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_BREAK_CHARACTERS);
- gtk_object_add_arg_type ("EText::max_lines",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_MAX_LINES);
- gtk_object_add_arg_type ("EText::width",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("EText::height",
- GTK_TYPE_DOUBLE, GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("EText::draw_borders",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_DRAW_BORDERS);
-
- if (!clipboard_atom)
- clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
-
-
-
- klass->changed = NULL;
- klass->activate = NULL;
-
- object_class->destroy = e_text_destroy;
- object_class->set_arg = e_text_set_arg;
- object_class->get_arg = e_text_get_arg;
-
- item_class->update = e_text_update;
- item_class->realize = e_text_realize;
- item_class->unrealize = e_text_unrealize;
- item_class->draw = e_text_draw;
- item_class->point = e_text_point;
- item_class->bounds = e_text_bounds;
- item_class->render = e_text_render;
- item_class->event = e_text_event;
-}
-
-/* Object initialization function for the text item */
-static void
-e_text_init (EText *text)
-{
- text->text = NULL;
- text->model = e_text_model_new();
- gtk_object_ref(GTK_OBJECT(text->model));
- gtk_object_sink(GTK_OBJECT(text->model));
- text->model_changed_signal_id =
- gtk_signal_connect(GTK_OBJECT(text->model),
- "changed",
- GTK_SIGNAL_FUNC(e_text_text_model_changed),
- text);
-
- text->anchor = GTK_ANCHOR_CENTER;
- text->justification = GTK_JUSTIFY_LEFT;
- text->clip_width = -1.0;
- text->clip_height = -1.0;
- text->xofs = 0.0;
- text->yofs = 0.0;
-
- text->ellipsis = NULL;
- text->use_ellipsis = FALSE;
- text->ellipsis_width = 0;
-
- text->editable = FALSE;
- text->editing = FALSE;
- text->xofs_edit = 0;
- text->yofs_edit = 0;
-
- text->selection_start = 0;
- text->selection_end = 0;
- text->select_by_word = FALSE;
-
- text->timeout_id = 0;
- text->timer = NULL;
-
- text->lastx = 0;
- text->lasty = 0;
- text->last_state = 0;
-
- text->scroll_start = 0;
- text->show_cursor = TRUE;
- text->button_down = FALSE;
-
- text->tep = NULL;
- text->tep_command_id = 0;
-
- text->has_selection = FALSE;
-
- text->invisible = NULL;
- text->primary_selection = NULL;
- text->primary_length = 0;
- text->clipboard_selection = NULL;
- text->clipboard_length = 0;
-
- text->pointer_in = FALSE;
- text->default_cursor_shown = TRUE;
-
- text->line_wrap = FALSE;
- text->break_characters = NULL;
- text->max_lines = -1;
-
- text->tooltip_timeout = 0;
- text->tooltip_count = 0;
-
- text->dbl_timeout = 0;
- text->tpl_timeout = 0;
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(text), e_text_reflow);
-}
-
-/* Destroy handler for the text item */
-static void
-e_text_destroy (GtkObject *object)
-{
- EText *text;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_TEXT (object));
-
- text = E_TEXT (object);
-
- if (text->model_changed_signal_id)
- gtk_signal_disconnect(GTK_OBJECT(text->model),
- text->model_changed_signal_id);
-
- if (text->model)
- gtk_object_unref(GTK_OBJECT(text->model));
-
- if (text->tep_command_id)
- gtk_signal_disconnect(GTK_OBJECT(text->tep),
- text->tep_command_id);
-
- if (text->tep)
- gtk_object_unref (GTK_OBJECT(text->tep));
-
- if (text->invisible)
- gtk_object_unref (GTK_OBJECT(text->invisible));
-
- if (text->lines)
- g_free (text->lines);
-
- if (text->font)
- e_font_unref (text->font);
-
-#if 0
- if (text->suckfont)
- e_suck_font_free (text->suckfont);
-#endif
-
- if (text->stipple)
- gdk_bitmap_unref (text->stipple);
-
- if (text->timeout_id) {
- g_source_remove(text->timeout_id);
- text->timeout_id = 0;
- }
-
- if (text->timer) {
- g_timer_stop(text->timer);
- g_timer_destroy(text->timer);
- text->timer = NULL;
- }
-
- if ( text->tooltip_timeout ) {
- gtk_timeout_remove (text->tooltip_timeout);
- text->tooltip_timeout = 0;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-static void
-e_text_text_model_changed (ETextModel *model, EText *text)
-{
- text->text = e_text_model_get_text(model);
- e_text_free_lines(text);
- gtk_signal_emit (GTK_OBJECT (text), e_text_signals[E_TEXT_CHANGED]);
- text->needs_split_into_lines = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM(text));
-}
-
-static void
-get_bounds_item_relative (EText *text, double *px1, double *py1, double *px2, double *py2)
-{
- GnomeCanvasItem *item;
- double x, y;
- double clip_x, clip_y;
- int old_height;
-
- item = GNOME_CANVAS_ITEM (text);
-
- x = 0;
- y = 0;
-
- clip_x = x;
- clip_y = y;
-
- /* Calculate text dimensions */
-
- old_height = text->height;
-
- if (text->text && text->font)
- text->height = (e_font_ascent (text->font) + e_font_descent (text->font)) * text->num_lines;
- else
- text->height = 0;
-
- if (old_height != text->height)
- e_canvas_item_request_parent_reflow(item);
-
- /* Anchor text */
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- x -= text->max_width / 2;
- if ( text->clip_width >= 0)
- clip_x -= text->clip_width / 2;
- else
- clip_x -= text->width / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- x -= text->max_width;
- if (text->clip_width >= 0)
- clip_x -= text->clip_width;
- else
- clip_x -= text->width;
- break;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- y -= text->height / 2;
- if ( text->clip_height >= 0 )
- clip_y -= text->clip_height / 2;
- else
- clip_y -= text->height / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- y -= text->height;
- if ( text->clip_height >= 0 )
- clip_y -= text->clip_height;
- else
- clip_y -= text->height;
- break;
- }
-
- /* Bounds */
-
- if (text->clip) {
- /* maybe do bbox intersection here? */
- *px1 = clip_x;
- *py1 = clip_y;
- if (text->clip_width >= 0)
- *px2 = clip_x + text->clip_width;
- else
- *px2 = clip_x + text->width;
-
- if ( text->clip_height >= 0 )
- *py2 = clip_y + text->clip_height;
- else
- *py2 = clip_y + text->height;
- } else {
- *px1 = x;
- *py1 = y;
- *px2 = x + text->max_width;
- *py2 = y + text->height;
- }
-}
-
-static void
-get_bounds (EText *text, double *px1, double *py1, double *px2, double *py2)
-{
- GnomeCanvasItem *item;
- double wx, wy, clip_width;
-
- item = GNOME_CANVAS_ITEM (text);
-
- /* Get canvas pixel coordinates for text position */
-
- wx = 0;
- wy = 0;
- gnome_canvas_item_i2w (item, &wx, &wy);
- gnome_canvas_w2c (item->canvas, wx + text->xofs, wy + text->yofs, &text->cx, &text->cy);
-
- /* Calculate the width and heights */
- calc_height (text);
- calc_line_widths (text);
-
- if (text->clip_width < 0)
- clip_width = text->max_width;
- else
- clip_width = text->clip_width;
-
- /* Get canvas pixel coordinates for clip rectangle position */
- gnome_canvas_w2c (item->canvas, wx, wy, &text->clip_cx, &text->clip_cy);
- text->clip_cwidth = clip_width * item->canvas->pixels_per_unit;
- if ( text->clip_height >= 0 )
- text->clip_cheight = text->clip_height * item->canvas->pixels_per_unit;
- else
- text->clip_cheight = text->height * item->canvas->pixels_per_unit;
-
- /* Anchor text */
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- text->cx -= text->max_width / 2;
- text->clip_cx -= text->clip_cwidth / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- text->cx -= text->max_width;
- text->clip_cx -= text->clip_cwidth;
- break;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- text->cy -= text->height / 2;
- text->clip_cy -= text->clip_cheight / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- text->cy -= text->height;
- text->clip_cy -= text->clip_cheight;
- break;
- }
-
- /* Bounds */
-
- if (text->clip) {
- *px1 = text->clip_cx;
- *py1 = text->clip_cy;
- *px2 = text->clip_cx + text->clip_cwidth;
- *py2 = text->clip_cy + text->clip_cheight;
- } else {
- *px1 = text->cx;
- *py1 = text->cy;
- *px2 = text->cx + text->max_width;
- *py2 = text->cy + text->height;
- }
-}
-
-static void
-calc_height (EText *text)
-{
- GnomeCanvasItem *item;
- int old_height;
-
- item = GNOME_CANVAS_ITEM (text);
-
- /* Calculate text dimensions */
-
- old_height = text->height;
-
- /* Make sure the text is split into lines first */
- if (text->text && text->num_lines == 0)
- split_into_lines (text);
-
- if (text->text && text->font)
- text->height = (e_font_ascent (text->font) + e_font_descent (text->font)) * text->num_lines;
- else
- text->height = 0;
-
- if (old_height != text->height)
- e_canvas_item_request_parent_reflow(item);
-}
-
-static void
-calc_ellipsis (EText *text)
-{
- if (text->font)
- text->ellipsis_width =
- e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- text->ellipsis ? text->ellipsis : "...",
- text->ellipsis ? unicode_strlen (text->ellipsis, -1) : 3);
-}
-
-/* Calculates the line widths (in pixels) of the text's splitted lines */
-static void
-calc_line_widths (EText *text)
-{
- struct line *lines;
- int i;
- int j;
- gdouble clip_width;
-
- /* Make sure line has been split */
- if (text->text && text->num_lines == 0)
- split_into_lines (text);
-
- lines = text->lines;
- text->max_width = 0;
-
- clip_width = text->clip_width;
- if (clip_width >= 0 && text->draw_borders) {
- clip_width -= 6;
- if (clip_width < 0)
- clip_width = 0;
- }
-
-
- if (!lines)
- return;
-
- for (i = 0; i < text->num_lines; i++) {
- if (lines->length != 0) {
- if (text->font) {
- lines->width = e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text, lines->length);
- lines->ellipsis_length = 0;
- } else {
- lines->width = 0;
- }
-
- if (text->clip &&
- text->use_ellipsis &&
- ! text->editing &&
- lines->width > clip_width &&
- clip_width >= 0) {
- if (text->font) {
- lines->ellipsis_length = 0;
- for (j = 0; j < lines->length; j++ ) {
- if (e_font_utf8_text_width (text->font, E_FONT_PLAIN, lines->text, j) + text->ellipsis_width
- <= clip_width)
- lines->ellipsis_length = j;
- else
- break;
- }
- }
- else
- lines->ellipsis_length = 0;
- lines->width = e_font_utf8_text_width (text->font, E_FONT_PLAIN, lines->text, lines->ellipsis_length) +
- text->ellipsis_width;
- }
- else
- lines->ellipsis_length = lines->length;
-
- if (lines->width > text->max_width)
- text->max_width = lines->width;
- }
-
- lines++;
- }
-}
-
-static void
-e_text_free_lines(EText *text)
-{
- if (text->lines)
- g_free (text->lines);
-
- text->lines = NULL;
- text->num_lines = 0;
-}
-
-#define IS_BREAKCHAR(text,c) ((text)->break_characters && unicode_strchr ((text)->break_characters, (c)))
-/* Splits the text of the text item into lines */
-static void
-split_into_lines (EText *text)
-{
- char *p, *cp;
- struct line *lines;
- int len;
- int line_num;
- char *laststart;
- char *lastend;
- char *linestart;
- double clip_width;
- unicode_char_t unival;
- gint charpos;
-
- /* Free old array of lines */
- e_text_free_lines(text);
-
- if (!text->text)
- return;
-
- /* First, count the number of lines */
-
- lastend = text->text;
- laststart = text->text;
- linestart = text->text;
-
- clip_width = text->clip_width;
- if (clip_width >= 0 && text->draw_borders) {
- clip_width -= 6;
- if (clip_width < 0)
- clip_width = 0;
- }
-
- cp = text->text;
- charpos = 0;
-
- for (p = unicode_get_utf8 (cp, &unival); (unival && p); charpos++, cp = p, p = unicode_get_utf8 (p, &unival)) {
- if (text->line_wrap && (unicode_isspace (unival) || unival == '\n')) {
- if (laststart != lastend
- && e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- linestart,
- unicode_index_to_offset (linestart, cp - linestart))
- > clip_width ) {
- text->num_lines ++;
- linestart = laststart;
- laststart = p;
- lastend = cp;
- } else if (unicode_isspace (unival)) {
- laststart = p;
- lastend = cp;
- }
- } else if (text->line_wrap && (IS_BREAKCHAR(text, unival))) {
- if ( laststart != lastend
- && unicode_index_to_offset (linestart, cp - linestart) != 1
- && e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- linestart,
- unicode_index_to_offset (linestart, p - linestart))
- > clip_width ) {
- text->num_lines ++;
- linestart = laststart;
- laststart = p;
- lastend = p;
- } else {
- laststart = p;
- lastend = p;
- }
- }
- if (unival == '\n') {
- text->num_lines ++;
- lastend = p;
- laststart = p;
- linestart = p;
- }
- }
-
- /* fixme: */
- if (text->line_wrap) {
- if ( p
- && laststart != lastend
- && e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- linestart,
- unicode_index_to_offset (linestart, cp - linestart))
- > clip_width ) {
- text->num_lines ++;
- }
- }
-
- text->num_lines++;
-
- if ( (!text->editing) && text->max_lines != -1 && text->num_lines > text->max_lines ) {
- text->num_lines = text->max_lines;
- }
-
- /* Allocate array of lines and calculate split positions */
-
- text->lines = lines = g_new0 (struct line, text->num_lines);
- len = 0;
- line_num = 1;
- lastend = text->text;
- laststart = text->text;
-
- cp = text->text;
- for (p = unicode_get_utf8 (cp, &unival); line_num < text->num_lines && unival; cp = p, p = unicode_get_utf8 (p, &unival)) {
- gboolean handled = FALSE;
- if (len == 0)
- lines->text = cp;
- if (text->line_wrap && (unicode_isspace (unival) || unival == '\n')) {
- if (e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- lines->text,
- unicode_index_to_offset (lines->text, cp - lines->text))
- > clip_width
- && laststart != lastend) {
- lines->length = unicode_index_to_offset (lines->text, lastend - lines->text);
- lines++;
- line_num++;
- len = unicode_index_to_offset (laststart, cp - laststart);
- lines->text = laststart;
- laststart = p;
- lastend = cp;
- } else if (unicode_isspace (unival)) {
- laststart = p;
- lastend = cp;
- len ++;
- }
- handled = TRUE;
- } else if (text->line_wrap && (IS_BREAKCHAR(text, unival))) {
- if (laststart != lastend
- && unicode_index_to_offset (lines->text, cp - lines->text) != 1
- && e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- lines->text,
- unicode_index_to_offset (lines->text, p - lines->text))
- > clip_width ) {
- lines->length = unicode_index_to_offset (lines->text, lastend - lines->text);
- lines++;
- line_num++;
- len = unicode_index_to_offset (laststart, p - laststart);
- lines->text = laststart;
- laststart = p;
- lastend = p;
- } else {
- laststart = p;
- lastend = p;
- len ++;
- }
- }
- if (line_num >= text->num_lines)
- break;
- if (unival == '\n') {
- lines->length = unicode_index_to_offset (lines->text, cp - lines->text);
- lines++;
- line_num++;
- len = 0;
- lastend = p;
- laststart = p;
- handled = TRUE;
- }
- if (!handled)
- len++;
- }
-
- if ( line_num < text->num_lines && text->line_wrap ) {
- if (e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- lines->text,
- unicode_index_to_offset (lines->text, cp - lines->text))
- > clip_width
- && laststart != lastend ) {
- lines->length = unicode_index_to_offset (lines->text, lastend - lines->text);
- lines++;
- line_num++;
- len = unicode_index_to_offset (laststart, cp - laststart);
- lines->text = laststart;
- laststart = p;
- lastend = cp;
- }
- }
-
- if (len == 0)
- lines->text = cp;
- lines->length = unicode_strlen (lines->text, -1);
-}
-
-/* Convenience function to set the text's GC's foreground color */
-static void
-set_text_gc_foreground (EText *text)
-{
- GdkColor c;
-
- if (!text->gc)
- return;
-
- c.pixel = text->pixel;
- gdk_gc_set_foreground (text->gc, &c);
-}
-
-/* Sets the stipple pattern for the text */
-static void
-set_stipple (EText *text, GdkBitmap *stipple, int reconfigure)
-{
- if (text->stipple && !reconfigure)
- gdk_bitmap_unref (text->stipple);
-
- text->stipple = stipple;
- if (stipple && !reconfigure)
- gdk_bitmap_ref (stipple);
-
- if (text->gc) {
- if (stipple) {
- gdk_gc_set_stipple (text->gc, stipple);
- gdk_gc_set_fill (text->gc, GDK_STIPPLED);
- } else
- gdk_gc_set_fill (text->gc, GDK_SOLID);
- }
-}
-
-/* Set_arg handler for the text item */
-static void
-e_text_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EText *text;
- GdkColor color = { 0, 0, 0, 0, };
- GdkColor *pcolor;
- gboolean color_changed;
- int have_pixel;
-
- gboolean needs_update = 0;
- gboolean needs_reflow = 0;
-
- item = GNOME_CANVAS_ITEM (object);
- text = E_TEXT (object);
-
- color_changed = FALSE;
- have_pixel = FALSE;
-
- switch (arg_id) {
- case ARG_MODEL:
- if ( text->model_changed_signal_id )
- gtk_signal_disconnect(GTK_OBJECT(text->model),
- text->model_changed_signal_id);
- gtk_object_unref(GTK_OBJECT(text->model));
- text->model = E_TEXT_MODEL(GTK_VALUE_OBJECT (*arg));
- gtk_object_ref(GTK_OBJECT(text->model));
-
- text->model_changed_signal_id =
- gtk_signal_connect(GTK_OBJECT(text->model),
- "changed",
- GTK_SIGNAL_FUNC(e_text_text_model_changed),
- text);
-
- e_text_free_lines(text);
- text->text = e_text_model_get_text(text->model);
-
- text->needs_split_into_lines = 1;
- needs_reflow = 1;
- break;
-
- case ARG_EVENT_PROCESSOR:
- if ( text->tep && text->tep_command_id )
- gtk_signal_disconnect(GTK_OBJECT(text->tep),
- text->tep_command_id);
- if ( text->tep )
- gtk_object_unref(GTK_OBJECT(text->tep));
- text->tep = E_TEXT_EVENT_PROCESSOR(GTK_VALUE_OBJECT (*arg));
- gtk_object_ref(GTK_OBJECT(text->tep));
- text->tep_command_id =
- gtk_signal_connect(GTK_OBJECT(text->tep),
- "command",
- GTK_SIGNAL_FUNC(e_text_command),
- text);
- break;
-
- case ARG_TEXT:
- text->num_lines = 1;
- e_text_model_set_text(text->model, GTK_VALUE_STRING (*arg));
- break;
-
- case ARG_FONT:
- if (text->font)
- e_font_unref (text->font);
-
- text->font = e_font_from_gdk_name (GTK_VALUE_STRING (*arg));
-
-#if 0
- if (item->canvas->aa) {
- if (text->suckfont)
- e_suck_font_free (text->suckfont);
-
- text->suckfont = e_suck_font (text->font);
- }
-#endif
-
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_FONTSET:
- if (text->font)
- e_font_unref (text->font);
-
- text->font = e_font_from_gdk_name (GTK_VALUE_STRING (*arg));
-
-#if 0
- if (item->canvas->aa) {
- if (text->suckfont)
- e_suck_font_free (text->suckfont);
-
- text->suckfont = e_suck_font (text->font);
- }
-#endif
-
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_FONT_GDK:
- if (text->font)
- e_font_unref (text->font);
-
- text->font = e_font_from_gdk_font (GTK_VALUE_BOXED (*arg));
-
-#if 0
- if (item->canvas->aa) {
- if (text->suckfont)
- e_suck_font_free (text->suckfont);
-
- text->suckfont = e_suck_font (text->font);
- }
-#endif
-
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_ANCHOR:
- text->anchor = GTK_VALUE_ENUM (*arg);
- text->needs_recalc_bounds = 1;
- needs_update = 1;
- break;
-
- case ARG_JUSTIFICATION:
- text->justification = GTK_VALUE_ENUM (*arg);
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_CLIP_WIDTH:
- text->clip_width = fabs (GTK_VALUE_DOUBLE (*arg));
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_CLIP_HEIGHT:
- text->clip_height = fabs (GTK_VALUE_DOUBLE (*arg));
- text->needs_recalc_bounds = 1;
- needs_reflow = 1;
- break;
-
- case ARG_CLIP:
- text->clip = GTK_VALUE_BOOL (*arg);
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_FILL_CLIP_RECTANGLE:
- text->fill_clip_rectangle = GTK_VALUE_BOOL (*arg);
- needs_update = 1;
- break;
-
- case ARG_X_OFFSET:
- text->xofs = GTK_VALUE_DOUBLE (*arg);
- text->needs_recalc_bounds = 1;
- needs_update = 1;
- break;
-
- case ARG_Y_OFFSET:
- text->yofs = GTK_VALUE_DOUBLE (*arg);
- text->needs_recalc_bounds = 1;
- needs_update = 1;
- break;
-
- case ARG_FILL_COLOR:
- if (GTK_VALUE_STRING (*arg))
- gdk_color_parse (GTK_VALUE_STRING (*arg), &color);
-
- text->rgba = ((color.red & 0xff00) << 16 |
- (color.green & 0xff00) << 8 |
- (color.blue & 0xff00) |
- 0xff);
- color_changed = TRUE;
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_FILL_COLOR_GDK:
- pcolor = GTK_VALUE_BOXED (*arg);
- if (pcolor) {
- color = *pcolor;
- gdk_color_context_query_color (item->canvas->cc, &color);
- have_pixel = TRUE;
- }
-
- text->rgba = ((color.red & 0xff00) << 16 |
- (color.green & 0xff00) << 8 |
- (color.blue & 0xff00) |
- 0xff);
- color_changed = TRUE;
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_FILL_COLOR_RGBA:
- text->rgba = GTK_VALUE_UINT (*arg);
- color_changed = TRUE;
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_FILL_STIPPLE:
- set_stipple (text, GTK_VALUE_BOXED (*arg), FALSE);
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_EDITABLE:
- text->editable = GTK_VALUE_BOOL (*arg);
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_USE_ELLIPSIS:
- text->use_ellipsis = GTK_VALUE_BOOL (*arg);
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_ELLIPSIS:
- if (text->ellipsis)
- g_free (text->ellipsis);
-
- text->ellipsis = g_strdup (GTK_VALUE_STRING (*arg));
- calc_ellipsis (text);
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_LINE_WRAP:
- text->line_wrap = GTK_VALUE_BOOL (*arg);
- text->needs_split_into_lines = 1;
- needs_reflow = 1;
- break;
-
- case ARG_BREAK_CHARACTERS:
- if ( text->break_characters ) {
- g_free(text->break_characters);
- text->break_characters = NULL;
- }
- if ( GTK_VALUE_STRING (*arg) )
- text->break_characters = g_strdup( GTK_VALUE_STRING (*arg) );
- text->needs_split_into_lines = 1;
- needs_reflow = 1;
- break;
-
- case ARG_MAX_LINES:
- text->max_lines = GTK_VALUE_INT (*arg);
- text->needs_split_into_lines = 1;
- needs_reflow = 1;
- break;
-
- case ARG_WIDTH:
- text->clip_width = fabs (GTK_VALUE_DOUBLE (*arg));
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_DRAW_BORDERS:
- if (text->draw_borders != GTK_VALUE_BOOL (*arg)) {
- text->draw_borders = GTK_VALUE_BOOL (*arg);
- text->needs_calc_height = 1;
- text->needs_redraw = 1;
- needs_reflow = 1;
- needs_update = 1;
- }
- break;
-
- default:
- return;
- }
-
- if (color_changed) {
- if (have_pixel)
- text->pixel = color.pixel;
- else
- text->pixel = gnome_canvas_get_color_pixel (item->canvas, text->rgba);
-
- if (!item->canvas->aa)
- set_text_gc_foreground (text);
-
- }
-
- if ( needs_reflow )
- e_canvas_item_request_reflow (item);
- if ( needs_update )
- gnome_canvas_item_request_update (item);
-}
-
-/* Get_arg handler for the text item */
-static void
-e_text_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EText *text;
- GdkColor *color;
-
- text = E_TEXT (object);
-
- switch (arg_id) {
- case ARG_MODEL:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(text->model);
- break;
-
- case ARG_EVENT_PROCESSOR:
- _get_tep(text);
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(text->tep);
- break;
-
- case ARG_TEXT:
- GTK_VALUE_STRING (*arg) = g_strdup (text->text);
- break;
-
- /* fixme: */
- case ARG_FONT_GDK:
- GTK_VALUE_BOXED (*arg) = text->font;
- break;
-
- case ARG_ANCHOR:
- GTK_VALUE_ENUM (*arg) = text->anchor;
- break;
-
- case ARG_JUSTIFICATION:
- GTK_VALUE_ENUM (*arg) = text->justification;
- break;
-
- case ARG_CLIP_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = text->clip_width;
- break;
-
- case ARG_CLIP_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = text->clip_height;
- break;
-
- case ARG_CLIP:
- GTK_VALUE_BOOL (*arg) = text->clip;
- break;
-
- case ARG_FILL_CLIP_RECTANGLE:
- GTK_VALUE_BOOL (*arg) = text->fill_clip_rectangle;
- break;
-
- case ARG_X_OFFSET:
- GTK_VALUE_DOUBLE (*arg) = text->xofs;
- break;
-
- case ARG_Y_OFFSET:
- GTK_VALUE_DOUBLE (*arg) = text->yofs;
- break;
-
- case ARG_FILL_COLOR_GDK:
- color = g_new (GdkColor, 1);
- color->pixel = text->pixel;
- gdk_color_context_query_color (text->item.canvas->cc, color);
- GTK_VALUE_BOXED (*arg) = color;
- break;
-
- case ARG_FILL_COLOR_RGBA:
- GTK_VALUE_UINT (*arg) = text->rgba;
- break;
-
- case ARG_FILL_STIPPLE:
- GTK_VALUE_BOXED (*arg) = text->stipple;
- break;
-
- case ARG_TEXT_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = text->max_width / text->item.canvas->pixels_per_unit;
- break;
-
- case ARG_TEXT_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = text->height / text->item.canvas->pixels_per_unit;
- break;
-
- case ARG_EDITABLE:
- GTK_VALUE_BOOL (*arg) = text->editable;
- break;
-
- case ARG_USE_ELLIPSIS:
- GTK_VALUE_BOOL (*arg) = text->use_ellipsis;
- break;
-
- case ARG_ELLIPSIS:
- GTK_VALUE_STRING (*arg) = g_strdup (text->ellipsis);
- break;
-
- case ARG_LINE_WRAP:
- GTK_VALUE_BOOL (*arg) = text->line_wrap;
- break;
-
- case ARG_BREAK_CHARACTERS:
- GTK_VALUE_STRING (*arg) = g_strdup (text->break_characters);
- break;
-
- case ARG_MAX_LINES:
- GTK_VALUE_INT (*arg) = text->max_lines;
- break;
-
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = text->clip_width;
- break;
-
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = text->clip && text->clip_height != -1 ? text->clip_height : text->height / text->item.canvas->pixels_per_unit;
- break;
-
- case ARG_DRAW_BORDERS:
- GTK_VALUE_BOOL (*arg) = text->draw_borders;
- break;
-
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-/* Update handler for the text item */
-static void
-e_text_reflow (GnomeCanvasItem *item, int flags)
-{
- EText *text;
-
- text = E_TEXT (item);
-
- if ( text->needs_split_into_lines ) {
- split_into_lines(text);
- text->needs_split_into_lines = 0;
- text->needs_calc_line_widths = 1;
- }
- if ( text->needs_calc_line_widths ) {
- int x;
- int i;
- struct line *lines;
- gdouble clip_width;
- calc_line_widths(text);
- text->needs_calc_line_widths = 0;
- text->needs_calc_height = 1;
- text->needs_redraw = 1;
-
- lines = text->lines;
- if ( !lines )
- return;
-
- for (lines = text->lines, i = 0; i < text->num_lines ; i++, lines ++) {
- if (unicode_index_to_offset (text->text, lines->text - text->text) > text->selection_end) {
- break;
- }
- }
- lines --;
- i--;
- x = e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- lines->text,
- text->selection_end - unicode_index_to_offset (text->text, lines->text - text->text));
-
-
- if (x < text->xofs_edit) {
- text->xofs_edit = x;
- }
-
- clip_width = text->clip_width;
- if (clip_width >= 0 && text->draw_borders) {
- clip_width -= 6;
- if (clip_width < 0)
- clip_width = 0;
- }
-
- if (2 + x - clip_width > text->xofs_edit) {
- text->xofs_edit = 2 + x - clip_width;
- }
-
- if ((e_font_ascent (text->font) + e_font_descent (text->font)) * i < text->yofs_edit)
- text->yofs_edit = (e_font_ascent (text->font) + e_font_descent (text->font)) * i;
-
- if ((e_font_ascent (text->font) + e_font_descent (text->font)) * (i + 1) -
- (text->clip_height != -1 ? text->clip_height : text->height) > text->yofs_edit)
- text->yofs_edit = (e_font_ascent (text->font) + e_font_descent (text->font)) * (i + 1) -
- (text->clip_height != -1 ? text->clip_height : text->height);
- }
- if ( text->needs_calc_height ) {
- calc_height (text);
- gnome_canvas_item_request_update(item);
- text->needs_calc_height = 0;
- text->needs_recalc_bounds = 1;
- }
-}
-
-/* Update handler for the text item */
-static void
-e_text_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- EText *text;
- double x1, y1, x2, y2;
- ArtDRect i_bbox, c_bbox;
- int i;
-
- text = E_TEXT (item);
-
- if (parent_class->update)
- (* parent_class->update) (item, affine, clip_path, flags);
-
- if ( text->needs_recalc_bounds
- || (flags & GNOME_CANVAS_UPDATE_AFFINE)) {
- if (!item->canvas->aa) {
- set_text_gc_foreground (text);
- set_stipple (text, text->stipple, TRUE);
- get_bounds (text, &x1, &y1, &x2, &y2);
- if ( item->x1 != x1 ||
- item->x2 != x2 ||
- item->y1 != y1 ||
- item->y2 != y2 ) {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- item->x1 = x1;
- item->y1 = y1;
- item->x2 = x2;
- item->y2 = y2;
- text->needs_redraw = 1;
- }
- } else {
- /* aa rendering */
- for (i = 0; i < 6; i++)
- text->affine[i] = affine[i];
- get_bounds_item_relative (text, &i_bbox.x0, &i_bbox.y0, &i_bbox.x1, &i_bbox.y1);
- art_drect_affine_transform (&c_bbox, &i_bbox, affine);
- }
- text->needs_recalc_bounds = 0;
- }
- if ( text->needs_redraw ) {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- text->needs_redraw = 0;
- }
-}
-
-/* Realize handler for the text item */
-static void
-e_text_realize (GnomeCanvasItem *item)
-{
- EText *text;
-
- text = E_TEXT (item);
-
- if (parent_class->realize)
- (* parent_class->realize) (item);
-
- text->gc = gdk_gc_new (item->canvas->layout.bin_window);
-
- text->i_cursor = gdk_cursor_new (GDK_XTERM);
- text->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
- if (text->font == NULL) {
- text->font = e_font_from_gdk_font (GTK_WIDGET(item->canvas)->style->font);
- }
-}
-
-/* Unrealize handler for the text item */
-static void
-e_text_unrealize (GnomeCanvasItem *item)
-{
- EText *text;
-
- text = E_TEXT (item);
-
- gdk_gc_unref (text->gc);
- text->gc = NULL;
-
- gdk_cursor_destroy (text->i_cursor);
- gdk_cursor_destroy (text->default_cursor);
-
- if (parent_class->unrealize)
- (* parent_class->unrealize) (item);
-}
-
-/* Calculates the x position of the specified line of text, based on the text's justification */
-static double
-get_line_xpos_item_relative (EText *text, struct line *line)
-{
- double x;
-
- x = 0;
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- x -= text->max_width / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- x -= text->max_width;
- break;
- }
-
- switch (text->justification) {
- case GTK_JUSTIFY_RIGHT:
- x += text->max_width - line->width;
- break;
-
- case GTK_JUSTIFY_CENTER:
- x += (text->max_width - line->width) * 0.5;
- break;
-
- default:
- if (text->draw_borders)
- x += BORDER_INDENT;
-
- /* For GTK_JUSTIFY_LEFT, we don't have to do anything. We do not support
- * GTK_JUSTIFY_FILL, yet.
- */
- break;
- }
-
- return x;
-}
-
-#if 0
-/* Calculates the y position of the first line of text. */
-static double
-get_line_ypos_item_relative (EText *text)
-{
- double y;
-
- y = 0;
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- y -= text->height / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- y -= text->height;
- break;
- }
-
- return y;
-}
-#endif
-
-/* Calculates the x position of the specified line of text, based on the text's justification */
-static int
-get_line_xpos (EText *text, struct line *line)
-{
- int x;
-
- x = text->cx;
-
- switch (text->justification) {
- case GTK_JUSTIFY_RIGHT:
- x += text->max_width - line->width;
- break;
-
- case GTK_JUSTIFY_CENTER:
- x += (text->max_width - line->width) / 2;
- break;
-
- default:
- if (text->draw_borders)
- x += BORDER_INDENT;
- /* For GTK_JUSTIFY_LEFT, we don't have to do anything. We do not support
- * GTK_JUSTIFY_FILL, yet.
- */
- break;
- }
-
-
- return x;
-}
-
-static void
-_get_tep(EText *text)
-{
- if (!text->tep) {
- text->tep = e_text_event_processor_emacs_like_new();
- gtk_object_ref (GTK_OBJECT (text->tep));
- gtk_object_sink (GTK_OBJECT (text->tep));
- text->tep_command_id =
- gtk_signal_connect(GTK_OBJECT(text->tep),
- "command",
- GTK_SIGNAL_FUNC(e_text_command),
- (gpointer) text);
- }
-}
-
-/* Draw handler for the text item */
-static void
-e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- EText *text;
- GdkRectangle rect, *clip_rect;
- struct line *lines;
- int i;
- int xpos, ypos;
- int start_char, end_char;
- int sel_start, sel_end;
- GdkRectangle sel_rect;
- GdkGC *fg_gc;
- GnomeCanvas *canvas;
-
- text = E_TEXT (item);
- canvas = GNOME_CANVAS_ITEM(text)->canvas;
-
- fg_gc = GTK_WIDGET(canvas)->style->fg_gc[text->has_selection ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE];
-
- if (text->draw_borders) {
- gdouble thisx = 0, thisy = 0;
- gdouble thiswidth, thisheight;
- GtkWidget *widget = GTK_WIDGET(item->canvas);
-
- gtk_object_get(GTK_OBJECT(text),
- "width", &thiswidth,
- "height", &thisheight,
- NULL);
- gtk_paint_flat_box (widget->style, drawable,
- GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE,
- NULL, widget, "entry_bg",
- 0, 0, thiswidth, thisheight);
- if (text->editing) {
- thisx += 1;
- thisy += 1;
- thiswidth -= 2;
- thisheight -= 2;
- }
- gtk_paint_shadow (widget->style, drawable,
- GTK_STATE_NORMAL, GTK_SHADOW_IN,
- NULL, widget, "entry",
- thisx - x, thisy - y, thiswidth, thisheight);
-
- if (text->editing) {
- gtk_paint_focus (widget->style, drawable,
- NULL, widget, "entry",
- - x, - y, thiswidth + 1, thisheight + 1);
- }
- }
-
- if (!text->text || !text->font)
- return;
-
- lines = text->lines;
- if ( !lines ) {
- text->needs_split_into_lines = 1;
- e_canvas_item_request_reflow (item);
- }
-
- clip_rect = NULL;
- if (text->clip) {
- rect.x = text->clip_cx - x;
- rect.y = text->clip_cy - y;
- rect.width = text->clip_cwidth;
- rect.height = text->clip_cheight;
-
- gdk_gc_set_clip_rectangle (text->gc, &rect);
- gdk_gc_set_clip_rectangle (fg_gc, &rect);
- clip_rect = &rect;
- }
- ypos = text->cy + e_font_ascent (text->font);
- if (text->draw_borders)
- ypos += BORDER_INDENT;
-
- if (text->editing)
- ypos -= text->yofs_edit;
-
- if (text->stipple)
- gnome_canvas_set_stipple_origin (item->canvas, text->gc);
-
- for (i = 0; i < text->num_lines; i++) {
- xpos = get_line_xpos (text, lines);
- if (text->editing) {
- xpos -= text->xofs_edit;
- start_char = unicode_index_to_offset (text->text, lines->text - text->text);
- end_char = start_char + lines->length;
- sel_start = text->selection_start;
- sel_end = text->selection_end;
- if (sel_start > sel_end ) {
- sel_start ^= sel_end;
- sel_end ^= sel_start;
- sel_start ^= sel_end;
- }
- if ( sel_start < start_char )
- sel_start = start_char;
- if ( sel_end > end_char )
- sel_end = end_char;
- if ( sel_start < sel_end ) {
- sel_rect.x = xpos - x + e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text,
- sel_start - start_char);
- sel_rect.y = ypos - y - e_font_ascent (text->font);
- sel_rect.width = e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text + unicode_offset_to_index (lines->text, sel_start - start_char),
- sel_end - sel_start);
- sel_rect.height = e_font_ascent (text->font) + e_font_descent (text->font);
- gtk_paint_flat_box(GTK_WIDGET(item->canvas)->style,
- drawable,
- text->has_selection ?
- GTK_STATE_SELECTED :
- GTK_STATE_ACTIVE,
- GTK_SHADOW_NONE,
- clip_rect,
- GTK_WIDGET(item->canvas),
- "text",
- sel_rect.x,
- sel_rect.y,
- sel_rect.width,
- sel_rect.height);
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x,
- ypos - y,
- lines->text,
- sel_start - start_char);
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- fg_gc,
- xpos - x + e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text,
- sel_start - start_char),
- ypos - y,
- lines->text + unicode_offset_to_index (lines->text, sel_start - start_char),
- sel_end - sel_start);
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x + e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text,
- sel_end - start_char),
- ypos - y,
- lines->text + unicode_offset_to_index (lines->text, sel_end - start_char),
- end_char - sel_end);
- } else {
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x,
- ypos - y,
- lines->text,
- lines->length);
- }
- if (text->selection_start == text->selection_end &&
- text->selection_start >= start_char &&
- text->selection_start <= end_char &&
- text->show_cursor) {
- gdk_draw_rectangle (drawable,
- text->gc,
- TRUE,
- xpos - x + e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text,
- sel_start - start_char),
- ypos - y - e_font_ascent (text->font),
- 1,
- e_font_ascent (text->font) + e_font_descent (text->font));
- }
- } else {
- if (text->clip && text->use_ellipsis && lines->ellipsis_length < lines->length) {
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x,
- ypos - y,
- lines->text,
- lines->ellipsis_length);
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x + lines->width - text->ellipsis_width,
- ypos - y,
- text->ellipsis ? text->ellipsis : "...",
- text->ellipsis ? unicode_strlen (text->ellipsis, -1) : 3);
- } else
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x,
- ypos - y,
- lines->text,
- lines->length);
- }
-
- ypos += e_font_ascent (text->font) + e_font_descent (text->font);
- lines++;
- }
-
- if (text->clip) {
- gdk_gc_set_clip_rectangle (text->gc, NULL);
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
- }
-}
-
-/* Render handler for the text item */
-static void
-e_text_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
-{
-#if 0
- EText *text;
- guint32 fg_color;
- double xpos, ypos;
- struct line *lines;
- int i, j;
- double affine[6];
- int dx, dy;
- ArtPoint start_i, start_c;
-
- text = E_TEXT (item);
-
- if (!text->text || !text->font || !text->suckfont)
- return;
-
- suckfont = text->suckfont;
-
- fg_color = text->rgba;
-
- gnome_canvas_buf_ensure_buf (buf);
-
- lines = text->lines;
- if ( !lines )
- return;
-
- start_i.y = get_line_ypos_item_relative (text);
-
- art_affine_scale (affine, item->canvas->pixels_per_unit, item->canvas->pixels_per_unit);
- for (i = 0; i < 6; i++)
- affine[i] = text->affine[i];
-
- for (i = 0; i < text->num_lines; i++) {
- if (lines->length != 0) {
- start_i.x = get_line_xpos_item_relative (text, lines);
- art_affine_point (&start_c, &start_i, text->affine);
- xpos = start_c.x;
- ypos = start_c.y;
-
- for (j = 0; j < lines->length; j++) {
- ETextSuckChar *ch;
-
- ch = &suckfont->chars[(unsigned char)((lines->text)[j])];
-
- affine[4] = xpos;
- affine[5] = ypos;
- art_rgb_bitmap_affine (
- buf->buf,
- buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1,
- buf->buf_rowstride,
- suckfont->bitmap + (ch->bitmap_offset >> 3),
- ch->width,
- suckfont->bitmap_height,
- suckfont->bitmap_width >> 3,
- fg_color,
- affine,
- ART_FILTER_NEAREST, NULL);
-
- dx = ch->left_sb + ch->width + ch->right_sb;
- xpos += dx * affine[0];
- ypos += dx * affine[1];
- }
- }
-
- dy = text->font->ascent + text->font->descent;
- start_i.y += dy;
- lines++;
- }
-
- buf->is_bg = 0;
-#endif
-}
-
-/* Point handler for the text item */
-static double
-e_text_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy, GnomeCanvasItem **actual_item)
-{
- EText *text;
- int i;
- struct line *lines;
- int x1, y1, x2, y2;
- int font_height;
- int dx, dy;
- double dist, best;
-
- text = E_TEXT (item);
-
- *actual_item = item;
-
- /* The idea is to build bounding rectangles for each of the lines of
- * text (clipped by the clipping rectangle, if it is activated) and see
- * whether the point is inside any of these. If it is, we are done.
- * Otherwise, calculate the distance to the nearest rectangle.
- */
-
- if (text->font)
- font_height = e_font_ascent (text->font) + e_font_descent (text->font);
- else
- font_height = 0;
-
- best = 1.0e36;
-
- lines = text->lines;
-
- if (text->fill_clip_rectangle) {
- double clip_width;
- double clip_height;
-
- /* Calculate the width and heights */
- calc_height (text);
- calc_line_widths (text);
-
- if (text->clip_width < 0)
- clip_width = text->max_width;
- else
- clip_width = text->clip_width;
-
- /* Get canvas pixel coordinates for clip rectangle position */
- clip_width = clip_width * item->canvas->pixels_per_unit;
- if ( text->clip_height >= 0 )
- clip_height = text->clip_height * item->canvas->pixels_per_unit;
- else
- clip_height = text->height * item->canvas->pixels_per_unit;
-
- if (cx >= text->clip_cx &&
- cx <= text->clip_cx + clip_width &&
- cy >= text->clip_cy &&
- cy <= text->clip_cy + clip_height)
- return 0;
- else
- return 1;
- }
-
- for (i = 0; i < text->num_lines; i++) {
- /* Compute the coordinates of rectangle for the current line,
- * clipping if appropriate.
- */
-
- x1 = get_line_xpos (text, lines);
- y1 = text->cy + i * font_height;
- x2 = x1 + lines->width;
- y2 = y1 + font_height;
-
- if (text->clip) {
- if (x1 < text->clip_cx)
- x1 = text->clip_cx;
-
- if (y1 < text->clip_cy)
- y1 = text->clip_cy;
-
- if ( text->clip_width >= 0 ) {
- if (x2 > (text->clip_cx + text->clip_width))
- x2 = text->clip_cx + text->clip_width;
- }
-
- if ( text->clip_height >= 0 ) {
- if (y2 > (text->clip_cy + text->clip_height))
- y2 = text->clip_cy + text->clip_height;
- }
-
- if ((x1 >= x2) || (y1 >= y2))
- continue;
- }
-
- /* Calculate distance from point to rectangle */
-
- if (cx < x1)
- dx = x1 - cx;
- else if (cx >= x2)
- dx = cx - x2 + 1;
- else
- dx = 0;
-
- if (cy < y1)
- dy = y1 - cy;
- else if (cy >= y2)
- dy = cy - y2 + 1;
- else
- dy = 0;
-
- if ((dx == 0) && (dy == 0))
- return 0.0;
-
- dist = sqrt (dx * dx + dy * dy);
- if (dist < best)
- best = dist;
-
- /* Next! */
-
- lines++;
- }
-
- return best / item->canvas->pixels_per_unit;
-}
-
-/* Bounds handler for the text item */
-static void
-e_text_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- EText *text;
- double width, height;
-
- text = E_TEXT (item);
-
- *x1 = 0;
- *y1 = 0;
-
- if (text->clip) {
- width = text->clip_width;
- if ( text->clip_height >= 0 )
- height = text->clip_height;
- else height = text->height;
- } else {
- width = text->max_width / item->canvas->pixels_per_unit;
- height = text->height / item->canvas->pixels_per_unit;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- *x1 -= width / 2.0;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- *x1 -= width;
- break;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- *y1 -= height / 2.0;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- *y1 -= height;
- break;
- }
-
- *x2 = *x1 + width;
- *y2 = *y1 + height;
-}
-
-static void
-_get_xy_from_position (EText *text, gint position, gint *xp, gint *yp)
-{
- if ( !text->lines )
- return;
- if (xp || yp) {
- struct line *lines = NULL;
- int x, y;
- double xd, yd;
- int j;
- x = get_line_xpos_item_relative (text, lines);
- y = text->yofs;
- y -= text->yofs_edit;
- for (j = 0, lines = text->lines; j < text->num_lines; lines++, j++) {
- if (lines->text > text->text + position)
- break;
- y += e_font_height (text->font);
- }
- lines --;
- y -= e_font_descent (text->font);
-
- x += e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text,
- position - unicode_index_to_offset (text->text, lines->text - text->text));
- x -= text->xofs_edit;
-
- xd = x; yd = y;
- gnome_canvas_item_i2w (GNOME_CANVAS_ITEM(text), &xd, &yd);
- gnome_canvas_w2c (GNOME_CANVAS_ITEM(text)->canvas, xd, yd, &x, &y);
-
- if (xp)
- *xp = x;
- if (yp)
- *yp = y;
- }
-}
-
-static gint
-_get_position_from_xy (EText *text, gint x, gint y)
-{
- int i, j;
- int ypos = text->yofs;
- int xpos;
- double xd, yd;
- char *p;
- unicode_char_t unival;
-
- struct line *lines;
-
- xd = x; yd = y;
- gnome_canvas_c2w (GNOME_CANVAS_ITEM(text)->canvas, xd, yd, &xd, &yd);
- gnome_canvas_item_w2i (GNOME_CANVAS_ITEM(text), &xd, &yd);
- x = xd; y = yd;
-
- y += text->yofs_edit;
-
- if (text->draw_borders)
- ypos += BORDER_INDENT;
-
- j = 0;
- while (y > ypos) {
- ypos += e_font_height (text->font);
- j ++;
- }
- j--;
- if (j >= text->num_lines)
- j = text->num_lines - 1;
- if (j < 0)
- j = 0;
- i = 0;
- lines = text->lines;
-
- if ( !lines )
- return 0;
-
- lines += j;
- x += text->xofs_edit;
- xpos = get_line_xpos_item_relative (text, lines);
-
- for (i = 0, p = lines->text; i < lines->length; i++, p = unicode_get_utf8 (p, &unival)) {
- int charwidth;
-
- charwidth = e_font_utf8_text_width (text->font, E_FONT_PLAIN, p, 1);
- xpos += charwidth / 2;
- if (xpos > x) {
- break;
- }
- xpos += (charwidth + 1) / 2;
- }
- return unicode_index_to_offset (text->text, p - text->text);
-}
-
-#define SCROLL_WAIT_TIME 30000
-
-static gboolean
-_blink_scroll_timeout (gpointer data)
-{
- EText *text = E_TEXT(data);
- gulong current_time;
- gboolean scroll = FALSE;
- gboolean redraw = FALSE;
-
- g_timer_elapsed(text->timer, &current_time);
-
- if (text->scroll_start + SCROLL_WAIT_TIME > 1000000) {
- if (current_time > text->scroll_start - (1000000 - SCROLL_WAIT_TIME) &&
- current_time < text->scroll_start)
- scroll = TRUE;
- } else {
- if (current_time > text->scroll_start + SCROLL_WAIT_TIME ||
- current_time < text->scroll_start)
- scroll = TRUE;
- }
- if (scroll && text->button_down) {
- if (text->lastx - text->clip_cx > text->clip_cwidth &&
- text->xofs_edit < text->max_width - text->clip_cwidth) {
- text->xofs_edit += 4;
- if (text->xofs_edit > text->max_width - text->clip_cwidth + 1)
- text->xofs_edit = text->max_width - text->clip_cwidth + 1;
- redraw = TRUE;
- }
- if (text->lastx - text->clip_cx < 0 &&
- text->xofs_edit > 0) {
- text->xofs_edit -= 4;
- if (text->xofs_edit < 0)
- text->xofs_edit = 0;
- redraw = TRUE;
- }
-
- if (text->lasty - text->clip_cy > text->clip_cheight &&
- text->yofs_edit < text->height - text->clip_cheight) {
- text->yofs_edit += 4;
- if (text->yofs_edit > text->height - text->clip_cheight + 1)
- text->yofs_edit = text->height - text->clip_cheight + 1;
- redraw = TRUE;
- }
- if (text->lasty - text->clip_cy < 0 &&
- text->yofs_edit > 0) {
- text->yofs_edit -= 4;
- if (text->yofs_edit < 0)
- text->yofs_edit = 0;
- redraw = TRUE;
- }
-
- if (redraw) {
- ETextEventProcessorEvent e_tep_event;
- e_tep_event.type = GDK_MOTION_NOTIFY;
- e_tep_event.motion.state = text->last_state;
- e_tep_event.motion.time = 0;
- e_tep_event.motion.position = _get_position_from_xy(text, text->lastx, text->lasty);
- _get_tep(text);
- e_text_event_processor_handle_event (text->tep,
- &e_tep_event);
- text->scroll_start = current_time;
- }
- }
-
- if (!((current_time / 500000) % 2)) {
- if (!text->show_cursor)
- redraw = TRUE;
- text->show_cursor = TRUE;
- } else {
- if (text->show_cursor)
- redraw = TRUE;
- text->show_cursor = FALSE;
- }
- if (redraw) {
- text->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
- }
- return TRUE;
-}
-
-static gboolean
-tooltip_event(GtkWidget *tooltip, GdkEvent *event, EText *text)
-{
- gint ret_val = FALSE;
- switch (event->type) {
- case GDK_LEAVE_NOTIFY:
- if (text->tooltip_window) {
- gtk_widget_destroy (text->tooltip_window);
- text->tooltip_window = NULL;
- }
- break;
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- if (event->type == GDK_BUTTON_RELEASE) {
- if (text->tooltip_window) {
- gtk_widget_destroy (text->tooltip_window);
- text->tooltip_window = NULL;
- }
- }
- /* Forward events to the text item */
- gtk_signal_emit_by_name (GTK_OBJECT (text), "event", event,
- &ret_val);
- default:
- break;
- }
- return ret_val;
-}
-
-static gboolean
-_do_tooltip (gpointer data)
-{
- EText *text = E_TEXT (data);
- struct line *lines;
- GtkWidget *canvas;
- int i;
- gdouble max_width;
- gboolean cut_off;
- double i2c[6];
- ArtPoint origin = {0, 0};
- ArtPoint pixel_origin;
- int canvas_x, canvas_y;
- GnomeCanvasItem *tooltip_text;
- double tooltip_width;
- double tooltip_height;
- double tooltip_x;
- double tooltip_y;
-#if 0
- double x1, x2, y1, y2;
-#endif
- GnomeCanvasItem *rect;
-
- text->tooltip_count = 0;
-
- lines = text->lines;
-
- if (text->tooltip_window || text->editing || (!lines)) {
- text->tooltip_timeout = 0;
- return FALSE;
- }
-
- cut_off = FALSE;
- for ( lines = text->lines, i = 0; i < text->num_lines; lines++, i++ ) {
- if (lines->length > lines->ellipsis_length) {
- cut_off = TRUE;
- break;
- }
- }
- if ( ! cut_off ) {
- text->tooltip_timeout = 0;
- return FALSE;
- }
-
- gnome_canvas_item_i2c_affine(GNOME_CANVAS_ITEM(text), i2c);
- art_affine_point (&pixel_origin, &origin, i2c);
-
- gdk_window_get_origin (GTK_WIDGET(GNOME_CANVAS_ITEM(text)->canvas)->window, &canvas_x, &canvas_y);
- pixel_origin.x += canvas_x;
- pixel_origin.y += canvas_y;
- pixel_origin.x -= (int) gtk_layout_get_hadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(text)->canvas))->value;
- pixel_origin.y -= (int) gtk_layout_get_vadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(text)->canvas))->value;
-
- text->tooltip_window = gtk_window_new (GTK_WINDOW_POPUP);
- gtk_container_set_border_width (GTK_CONTAINER (text->tooltip_window), 1);
-
- canvas = e_canvas_new ();
-
-
-
-
-
-
-
- gtk_container_add (GTK_CONTAINER (text->tooltip_window), canvas);
-
- /* Get the longest line length */
- max_width = 0.0;
- for (lines = text->lines, i = 0; i < text->num_lines; lines++, i++) {
- gdouble line_width;
-
- line_width = e_font_utf8_text_width (text->font, E_FONT_PLAIN, lines->text, lines->length);
- max_width = MAX (max_width, line_width);
- }
-
- rect = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (canvas)),
- gnome_canvas_rect_get_type (),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) max_width + 4,
- "y2", (double) text->height + 4,
- "fill_color", "yellow",
- NULL);
-
- /* fixme: */
- tooltip_text = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_text_get_type (),
- "anchor", GTK_ANCHOR_NW,
- "font_gdk", text->font,
- "text", text->text,
- "editable", FALSE,
- "clip_width", text->max_lines != 1 ? text->clip_width : max_width,
- "clip_height", text->max_lines != 1 ? -1 : (double)text->height,
- "clip", TRUE,
- "line_wrap", text->line_wrap,
- "justification", text->justification,
- NULL);
-
-
-
- if (text->draw_borders)
- e_canvas_item_move_absolute(tooltip_text, 1 + BORDER_INDENT, 1 + BORDER_INDENT);
- else
- e_canvas_item_move_absolute(tooltip_text, 1, 1);
-
-
- calc_height(E_TEXT(tooltip_text));
- calc_line_widths(E_TEXT(tooltip_text));
- gnome_canvas_item_set (tooltip_text,
- "clip_height", (double) E_TEXT(tooltip_text)->height,
- "clip_width", (double) E_TEXT(tooltip_text)->max_width,
- NULL);
- tooltip_width = E_TEXT(tooltip_text)->max_width;
- tooltip_height = E_TEXT(tooltip_text)->height;
- tooltip_x = 0;
- tooltip_y = 0;
- switch(E_TEXT(tooltip_text)->justification) {
- case GTK_JUSTIFY_CENTER:
- tooltip_x = - tooltip_width / 2;
- break;
- case GTK_JUSTIFY_RIGHT:
- tooltip_x = tooltip_width / 2;
- break;
- case GTK_JUSTIFY_FILL:
- case GTK_JUSTIFY_LEFT:
- tooltip_x = 0;
- break;
- }
- switch(E_TEXT(tooltip_text)->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- tooltip_y -= tooltip_height / 2.0;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- tooltip_y -= tooltip_height;
- break;
- }
- switch(E_TEXT(tooltip_text)->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- tooltip_x -= tooltip_width / 2.0;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- tooltip_x -= tooltip_width;
- break;
- }
-#if 0
- get_bounds(text, &x1, &y1, &x2, &y2);
- if ( x1 < tooltip_x ) {
- gnome_canvas_item_move(tooltip_text, tooltip_x - x1, 0);
- tooltip_x = x1;
- }
- if ( y1 < tooltip_y ) {
- gnome_canvas_item_move(tooltip_text, 0, tooltip_y - y1);
- tooltip_y = y1;
- }
- if ( x2 > tooltip_x + tooltip_width )
- tooltip_width = x2 - tooltip_x;
- if ( y2 > tooltip_y + tooltip_height )
- tooltip_height = y2 - tooltip_y;
-#endif
-
- gnome_canvas_item_set(rect,
- "x2", (double) tooltip_width + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0),
- "y2", (double) tooltip_height + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0),
- NULL);
-
- gtk_widget_set_usize (text->tooltip_window,
- tooltip_width + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0),
- tooltip_height + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0));
- gnome_canvas_set_scroll_region (GNOME_CANVAS(canvas), 0.0, 0.0,
- tooltip_width + (text->draw_borders ? BORDER_INDENT * 2 : 0),
- (double)tooltip_height + (text->draw_borders ? BORDER_INDENT * 2 : 0));
- gtk_widget_show (canvas);
- gtk_widget_realize (text->tooltip_window);
- gtk_signal_connect (GTK_OBJECT(text->tooltip_window), "event",
- GTK_SIGNAL_FUNC(tooltip_event), text);
-
- gtk_widget_popup (text->tooltip_window, pixel_origin.x - 2 + tooltip_x, pixel_origin.y - 2 + tooltip_y);
-
- text->tooltip_timeout = 0;
- return FALSE;
-}
-
-static gboolean
-_click (gpointer data)
-{
- *(gint *)data = 0;
- return FALSE;
-}
-
-static gint
-e_text_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EText *text = E_TEXT(item);
- ETextEventProcessorEvent e_tep_event;
-
- gint return_val = 0;
-
- e_tep_event.type = event->type;
- switch (event->type) {
- case GDK_FOCUS_CHANGE:
- if (text->editable) {
- GdkEventFocus *focus_event;
- focus_event = (GdkEventFocus *) event;
- if (focus_event->in) {
- if(!text->editing) {
- text->editing = TRUE;
- if ( text->pointer_in ) {
- if ( text->default_cursor_shown && (!text->draw_borders)) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor);
- text->default_cursor_shown = FALSE;
- }
- }
- text->select_by_word = FALSE;
- text->xofs_edit = 0;
- text->yofs_edit = 0;
- if (text->timeout_id == 0)
- text->timeout_id = g_timeout_add(10, _blink_scroll_timeout, text);
- text->timer = g_timer_new();
- g_timer_elapsed(text->timer, &(text->scroll_start));
- g_timer_start(text->timer);
- }
- } else {
- text->editing = FALSE;
- if ( (!text->default_cursor_shown) && (!text->draw_borders) ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor);
- text->default_cursor_shown = TRUE;
- }
- if (text->timeout_id) {
- g_source_remove(text->timeout_id);
- text->timeout_id = 0;
- }
- if (text->timer) {
- g_timer_stop(text->timer);
- g_timer_destroy(text->timer);
- text->timer = NULL;
- }
- }
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM(text));
- }
- return_val = 0;
- break;
- case GDK_KEY_PRESS: /* Fall Through */
- case GDK_KEY_RELEASE:
- if (text->editing) {
- GdkEventKey key = event->key;
- e_tep_event.key.time = key.time;
- e_tep_event.key.state = key.state;
- e_tep_event.key.keyval = key.keyval;
- e_tep_event.key.length = key.length;
- e_tep_event.key.string = key.string;
- _get_tep(text);
- return e_text_event_processor_handle_event (text->tep,
- &e_tep_event);
- }
- else
- return 0;
- break;
- case GDK_BUTTON_PRESS: /* Fall Through */
- case GDK_BUTTON_RELEASE:
- if (text->tooltip_timeout) {
- gtk_timeout_remove (text->tooltip_timeout);
- text->tooltip_timeout = 0;
- }
- if (text->tooltip_window) {
- gtk_widget_destroy (text->tooltip_window);
- text->tooltip_window = NULL;
- }
-#if 0
- if ((!text->editing)
- && text->editable
- && event->type == GDK_BUTTON_RELEASE
- && event->button.button == 1) {
- GdkEventButton button = event->button;
-
- e_canvas_item_grab_focus (item);
-
- e_tep_event.type = GDK_BUTTON_RELEASE;
- e_tep_event.button.time = button.time;
- e_tep_event.button.state = button.state;
- e_tep_event.button.button = button.button;
- e_tep_event.button.position = _get_position_from_xy(text, button.x, button.y);
- _get_tep(text);
- return_val = e_text_event_processor_handle_event (text->tep,
- &e_tep_event);
- e_tep_event.type = GDK_BUTTON_RELEASE;
- }
-#else
- if ((!text->editing)
- && text->editable
- && (event->button.button == 1 ||
- event->button.button == 2)) {
- e_canvas_item_grab_focus (item);
- }
-#endif
- /* Create our own double and triple click events,
- as gnome-canvas doesn't forward them to us */
- if (event->type == GDK_BUTTON_PRESS) {
- if (text->dbl_timeout == 0 &&
- text->tpl_timeout == 0) {
- text->dbl_timeout = gtk_timeout_add (200,
- _click,
- &(text->dbl_timeout));
- } else {
- if (text->tpl_timeout == 0) {
- e_tep_event.type = GDK_2BUTTON_PRESS;
- text->tpl_timeout = gtk_timeout_add (200, _click, &(text->tpl_timeout));
- } else {
- e_tep_event.type = GDK_3BUTTON_PRESS;
- }
- }
- }
-
- if (text->editing) {
- GdkEventButton button = event->button;
- e_tep_event.button.time = button.time;
- e_tep_event.button.state = button.state;
- e_tep_event.button.button = button.button;
- e_tep_event.button.position = _get_position_from_xy(text, button.x, button.y);
- _get_tep(text);
- return_val = e_text_event_processor_handle_event (text->tep,
- &e_tep_event);
- if (event->button.button == 1) {
- if (event->type == GDK_BUTTON_PRESS)
- text->button_down = TRUE;
- else
- text->button_down = FALSE;
- }
- text->lastx = button.x;
- text->lasty = button.y;
- text->last_state = button.state;
- }
- break;
- case GDK_MOTION_NOTIFY:
- if (text->editing) {
- GdkEventMotion motion = event->motion;
- e_tep_event.motion.time = motion.time;
- e_tep_event.motion.state = motion.state;
- e_tep_event.motion.position = _get_position_from_xy(text, motion.x, motion.y);
- _get_tep(text);
- return_val = e_text_event_processor_handle_event (text->tep,
- &e_tep_event);
- text->lastx = motion.x;
- text->lasty = motion.y;
- text->last_state = motion.state;
- }
- break;
- case GDK_ENTER_NOTIFY:
- {
- GdkEventCrossing *crossing = (GdkEventCrossing *) event;
- double x1, y1, x2, y2;
- get_bounds (text, &x1, &y1, &x2, &y2);
- if (crossing->x >= x1 &&
- crossing->y >= y1 &&
- crossing->x <= x2 &&
- crossing->y <= y2) {
- if ( text->tooltip_count == 0 && text->clip) {
- if (!text->tooltip_timeout)
- text->tooltip_timeout = gtk_timeout_add (1000, _do_tooltip, text);
- }
- text->tooltip_count ++;
- }
- }
-
- text->pointer_in = TRUE;
- if (text->editing || text->draw_borders) {
- if ( text->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor);
- text->default_cursor_shown = FALSE;
- }
- }
- break;
- case GDK_LEAVE_NOTIFY:
- if (text->tooltip_count > 0)
- text->tooltip_count --;
- if ( text->tooltip_count == 0 && text->clip) {
- if ( text->tooltip_timeout ) {
- gtk_timeout_remove (text->tooltip_timeout);
- text->tooltip_timeout = 0;
- }
- }
-
- text->pointer_in = FALSE;
- if (text->editing || text->draw_borders) {
- if ( ! text->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor);
- text->default_cursor_shown = TRUE;
- }
- }
- break;
- default:
- break;
- }
- if (return_val)
- return return_val;
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS(parent_class)->event(item, event);
- else
- return 0;
-}
-
-/* fixme: */
-
-static int
-_get_position(EText *text, ETextEventProcessorCommand *command)
-{
- int i;
- int length;
- int x, y;
- unicode_char_t unival;
- char *p;
-
- switch (command->position) {
-
- case E_TEP_VALUE:
- return command->value;
-
- case E_TEP_SELECTION:
- return text->selection_end;
-
- case E_TEP_START_OF_BUFFER:
- return 0;
- case E_TEP_END_OF_BUFFER:
- return unicode_strlen (text->text, -1);
-
- case E_TEP_START_OF_LINE:
- for (i = text->selection_end - 2; i > 0; i--) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unival == '\n') {
- i++;
- break;
- }
- }
- return i;
- case E_TEP_END_OF_LINE:
- length = unicode_strlen(text->text, -1);
- for (i = text->selection_end + 1; i < length; i++) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unival == '\n') {
- break;
- }
- }
- if (i > length)
- i = length;
- return i;
-
- case E_TEP_FORWARD_CHARACTER:
- length = unicode_strlen (text->text, -1);
- i = text->selection_end + 1;
- if (i > length)
- i = length;
- return i;
- case E_TEP_BACKWARD_CHARACTER:
- i = text->selection_end - 1;
- if (i < 0)
- i = 0;
- return i;
-
- case E_TEP_FORWARD_WORD:
- length = unicode_strlen (text->text, -1);
- for (i = text->selection_end + 1; i < length; i++) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) {
- break;
- }
- }
- if (i > length)
- i = length;
- return i;
- case E_TEP_BACKWARD_WORD:
- for (i = text->selection_end - 2; i > 0; i--) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) {
- i++;
- break;
- }
- }
- if (i < 0)
- i = 0;
- return i;
-
- case E_TEP_FORWARD_LINE:
- _get_xy_from_position(text, text->selection_end, &x, &y);
- y += e_font_height (text->font);
- return _get_position_from_xy(text, x, y);
- case E_TEP_BACKWARD_LINE:
- _get_xy_from_position(text, text->selection_end, &x, &y);
- y -= e_font_height (text->font);
- return _get_position_from_xy(text, x, y);
-
- case E_TEP_SELECT_WORD:
- for (i = text->selection_end - 2; i > 0; i--) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) {
- i++;
- break;
- }
- }
- if (i < 0)
- text->selection_start = 0;
- else
- text->selection_start = i;
-
- length = unicode_strlen (text->text, -1);
- for (i = text->selection_end + 1; i < length; i++) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) {
- break;
- }
- }
- if (i > length)
- i = length;
- return i;
-
- case E_TEP_SELECT_ALL:
- text->selection_start = 0;
- length = unicode_strlen (text->text, -1);
- return length;
-
- case E_TEP_FORWARD_PARAGRAPH:
- case E_TEP_BACKWARD_PARAGRAPH:
-
- case E_TEP_FORWARD_PAGE:
- case E_TEP_BACKWARD_PAGE:
- return text->selection_end;
- default:
- return text->selection_end;
- }
-}
-
-static void
-_delete_selection(EText *text)
-{
- if ( text->selection_start < text->selection_end ) {
- e_text_model_delete(text->model, text->selection_start, text->selection_end - text->selection_start);
- text->selection_end = text->selection_start;
- } else {
- e_text_model_delete(text->model, text->selection_end, text->selection_start - text->selection_end);
- text->selection_start = text->selection_end;
- }
-}
-
-static void
-_insert(EText *text, char *string, int value)
-{
- if (value > 0) {
- e_text_model_insert_length(text->model, text->selection_start, string, value);
-
- text->selection_start += value;
- text->selection_end = text->selection_start;
- }
-}
-
-static void
-e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gpointer data)
-{
- EText *text = E_TEXT(data);
- int sel_start, sel_end;
- switch (command->action) {
- case E_TEP_MOVE:
- text->selection_start = _get_position(text, command);
- text->selection_end = text->selection_start;
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_SELECT:
- text->selection_end = _get_position(text, command);
- sel_start = MIN(text->selection_start, text->selection_end);
- sel_end = MAX(text->selection_start, text->selection_end);
- if (sel_start != sel_end) {
- e_text_supply_selection (text, command->time, GDK_SELECTION_PRIMARY,
- text->text + unicode_offset_to_index (text->text, sel_start), sel_end - sel_start);
- } else if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_DELETE:
- if (text->selection_end == text->selection_start) {
- text->selection_end = _get_position(text, command);
- }
- _delete_selection(text);
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
-
- case E_TEP_INSERT:
- if (text->selection_end != text->selection_start) {
- _delete_selection(text);
- }
- _insert(text, command->string, command->value);
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_COPY:
- sel_start = MIN(text->selection_start, text->selection_end);
- sel_end = MAX(text->selection_start, text->selection_end);
- if (sel_start != sel_end) {
- e_text_supply_selection (text, command->time, clipboard_atom,
- text->text + unicode_offset_to_index (text->text, sel_start), sel_end - sel_start);
- }
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_PASTE:
- e_text_get_selection (text, clipboard_atom, command->time);
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_GET_SELECTION:
- e_text_get_selection (text, GDK_SELECTION_PRIMARY, command->time);
- break;
- case E_TEP_ACTIVATE:
- gtk_signal_emit (GTK_OBJECT (text), e_text_signals[E_TEXT_ACTIVATE]);
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_SET_SELECT_BY_WORD:
- text->select_by_word = command->value;
- break;
- case E_TEP_GRAB:
- gnome_canvas_item_grab (GNOME_CANVAS_ITEM(text),
- GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
- text->i_cursor,
- command->time);
- break;
- case E_TEP_UNGRAB:
- gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM(text), command->time);
- break;
- case E_TEP_NOP:
- break;
- }
-
- if (!text->button_down) {
- int x;
- int i;
- struct line *lines = text->lines;
- gdouble clip_width;
- if ( !lines )
- return;
-
- for (lines = text->lines, i = 0; i < text->num_lines ; i++, lines ++) {
- if (unicode_index_to_offset (text->text, lines->text - text->text) > text->selection_end) {
- break;
- }
- }
- lines --;
- i --;
- x = e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- lines->text,
- text->selection_end - unicode_index_to_offset (text->text, lines->text - text->text));
-
-
- if (x < text->xofs_edit) {
- text->xofs_edit = x;
- }
-
- clip_width = text->clip_width;
- if (clip_width >= 0 && text->draw_borders) {
- clip_width -= 6;
- if (clip_width < 0)
- clip_width = 0;
- }
-
- if (2 + x - clip_width > text->xofs_edit) {
- text->xofs_edit = 2 + x - clip_width;
- }
-
- if (e_font_height (text->font) * i < text->yofs_edit)
- text->yofs_edit = e_font_height (text->font) * i;
-
- if (e_font_height (text->font) * (i + 1) - (text->clip_height != -1 ? text->clip_height : text->height) > text->yofs_edit)
- text->yofs_edit = e_font_height (text->font) * (i + 1) - (text->clip_height != -1 ? text->clip_height : text->height);
- }
-
- text->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
-}
-
-static void _invisible_destroy (GtkInvisible *invisible,
- EText *text)
-{
- text->invisible = NULL;
-}
-
-static GtkWidget *e_text_get_invisible(EText *text)
-{
- GtkWidget *invisible;
- if (text->invisible) {
- invisible = text->invisible;
- } else {
- invisible = gtk_invisible_new();
- text->invisible = invisible;
-
- gtk_selection_add_target (invisible,
- GDK_SELECTION_PRIMARY,
- GDK_SELECTION_TYPE_STRING,
- E_SELECTION_PRIMARY);
- gtk_selection_add_target (invisible,
- clipboard_atom,
- GDK_SELECTION_TYPE_STRING,
- E_SELECTION_CLIPBOARD);
-
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_get",
- GTK_SIGNAL_FUNC (_selection_get),
- text);
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_clear_event",
- GTK_SIGNAL_FUNC (_selection_clear_event),
- text);
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_received",
- GTK_SIGNAL_FUNC (_selection_received),
- text);
-
- gtk_signal_connect (GTK_OBJECT(invisible), "destroy",
- GTK_SIGNAL_FUNC (_invisible_destroy),
- text);
- }
- return invisible;
-}
-
-static void
-_selection_clear_event (GtkInvisible *invisible,
- GdkEventSelection *event,
- EText *text)
-{
- if (event->selection == GDK_SELECTION_PRIMARY) {
- g_free (text->primary_selection);
- text->primary_selection = NULL;
- text->primary_length = 0;
-
- text->has_selection = FALSE;
- text->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
-
- } else if (event->selection == clipboard_atom) {
- g_free (text->clipboard_selection);
- text->clipboard_selection = NULL;
- text->clipboard_length = 0;
- }
-}
-
-static void
-_selection_get (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint info,
- guint time_stamp,
- EText *text)
-{
- switch (info) {
- case E_SELECTION_PRIMARY:
- gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
- 8, text->primary_selection, text->primary_length);
- break;
- case E_SELECTION_CLIPBOARD:
- gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
- 8, text->clipboard_selection, text->clipboard_length);
- break;
- }
-}
-
-static void
-_selection_received (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint time,
- EText *text)
-{
- if (selection_data->length < 0 || selection_data->type != GDK_SELECTION_TYPE_STRING) {
- return;
- } else {
- ETextEventProcessorCommand command;
- command.action = E_TEP_INSERT;
- command.position = E_TEP_SELECTION;
- command.string = selection_data->data;
- command.value = selection_data->length;
- command.time = time;
- e_text_command(text->tep, &command, text);
- }
-}
-
-static void e_text_supply_selection (EText *text, guint time, GdkAtom selection, guchar *data, gint length)
-{
- gboolean successful;
- GtkWidget *invisible;
-
- invisible = e_text_get_invisible(text);
-
- if (selection == GDK_SELECTION_PRIMARY ) {
- if (text->primary_selection) {
- g_free (text->primary_selection);
- }
- text->primary_selection = g_strndup(data, length);
- text->primary_length = length;
- } else if (selection == clipboard_atom) {
- if (text->clipboard_selection) {
- g_free (text->clipboard_selection);
- }
- text->clipboard_selection = g_strndup(data, length);
- text->clipboard_length = length;
- }
-
- successful = gtk_selection_owner_set (invisible,
- selection,
- time);
-
- if (selection == GDK_SELECTION_PRIMARY)
- text->has_selection = successful;
-}
-
-static void
-e_text_get_selection(EText *text, GdkAtom selection, guint32 time)
-{
- GtkWidget *invisible;
- invisible = e_text_get_invisible(text);
- gtk_selection_convert(invisible,
- selection,
- GDK_SELECTION_TYPE_STRING,
- time);
-}
-
-#if 0
-static void
-e_text_real_copy_clipboard (EText *text)
-{
- guint32 time;
- gint selection_start_pos;
- gint selection_end_pos;
-
- g_return_if_fail (text != NULL);
- g_return_if_fail (E_IS_TEXT (text));
-
- time = gtk_text_get_event_time (text);
- selection_start_pos = MIN (text->selection_start, text->selection_end);
- selection_end_pos = MAX (text->selection_start, text->selection_end);
-
- if (selection_start_pos != selection_end_pos)
- {
- if (gtk_selection_owner_set (GTK_WIDGET (text->canvas),
- clipboard_atom,
- time))
- text->clipboard_text = "";
- }
-}
-
-static void
-e_text_real_paste_clipboard (EText *text)
-{
- guint32 time;
-
- g_return_if_fail (text != NULL);
- g_return_if_fail (E_IS_TEXT (text));
-
- time = e_text_get_event_time (text);
- if (text->editable)
- gtk_selection_convert (GTK_WIDGET(text->widget),
- clipboard_atom,
- gdk_atom_intern ("COMPOUND_TEXT", FALSE), time);
-}
-#endif
-
-
-#if 0
-/* Routines for sucking fonts from the X server */
-
-static ETextSuckFont *
-e_suck_font (GdkFont *font)
-{
- ETextSuckFont *suckfont;
- int i;
- int x, y;
- char text[1];
- int lbearing, rbearing, ch_width, ascent, descent;
- GdkPixmap *pixmap;
- GdkColor black, white;
- GdkImage *image;
- GdkGC *gc;
- guchar *line;
- int width, height;
- int black_pixel, pixel;
-
- if (!font)
- return NULL;
-
- suckfont = g_new (ETextSuckFont, 1);
-
- height = font->ascent + font->descent;
- x = 0;
- for (i = 0; i < 256; i++) {
- text[0] = i;
- gdk_text_extents (font, text, 1,
- &lbearing, &rbearing, &ch_width, &ascent, &descent);
- suckfont->chars[i].left_sb = lbearing;
- suckfont->chars[i].right_sb = ch_width - rbearing;
- suckfont->chars[i].width = rbearing - lbearing;
- suckfont->chars[i].ascent = ascent;
- suckfont->chars[i].descent = descent;
- suckfont->chars[i].bitmap_offset = x;
- x += (ch_width + 31) & -32;
- }
-
- width = x;
-
- suckfont->bitmap_width = width;
- suckfont->bitmap_height = height;
- suckfont->ascent = font->ascent;
-
- pixmap = gdk_pixmap_new (NULL, suckfont->bitmap_width,
- suckfont->bitmap_height, 1);
- gc = gdk_gc_new (pixmap);
- gdk_gc_set_font (gc, font);
-
- black_pixel = BlackPixel (gdk_display, DefaultScreen (gdk_display));
- black.pixel = black_pixel;
- white.pixel = WhitePixel (gdk_display, DefaultScreen (gdk_display));
- gdk_gc_set_foreground (gc, &white);
- gdk_draw_rectangle (pixmap, gc, 1, 0, 0, width, height);
-
- gdk_gc_set_foreground (gc, &black);
- for (i = 0; i < 256; i++) {
- text[0] = i;
- gdk_draw_text (pixmap, font, gc,
- suckfont->chars[i].bitmap_offset - suckfont->chars[i].left_sb,
- font->ascent,
- text, 1);
- }
-
- /* The handling of the image leaves me with distinct unease. But this
- * is more or less copied out of gimp/app/text_tool.c, so it _ought_ to
- * work. -RLL
- */
-
- image = gdk_image_get (pixmap, 0, 0, width, height);
- suckfont->bitmap = g_malloc0 ((width >> 3) * height);
-
- line = suckfont->bitmap;
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- pixel = gdk_image_get_pixel (image, x, y);
- if (pixel == black_pixel)
- line[x >> 3] |= 128 >> (x & 7);
- }
- line += width >> 3;
- }
-
- gdk_image_destroy (image);
-
- /* free the pixmap */
- gdk_pixmap_unref (pixmap);
-
- /* free the gc */
- gdk_gc_destroy (gc);
-
- return suckfont;
-}
-
-static void
-e_suck_font_free (ETextSuckFont *suckfont)
-{
- g_free (suckfont->bitmap);
- g_free (suckfont);
-}
-#endif
-
-
-
-
-
-
-
diff --git a/widgets/e-text/e-text.h b/widgets/e-text/e-text.h
deleted file mode 100644
index 9d992fb58b..0000000000
--- a/widgets/e-text/e-text.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* EText - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#ifndef E_TEXT_H
-#define E_TEXT_H
-
-#include <gnome.h>
-#include "e-util/e-font.h"
-#include "e-text-event-processor.h"
-#include "e-text-model.h"
-
-
-BEGIN_GNOME_DECLS
-
-
-/* Text item for the canvas. Text items are positioned by an anchor point and an anchor direction.
- *
- * A clipping rectangle may be specified for the text. The rectangle is anchored at the text's anchor
- * point, and is specified by clipping width and height parameters. If the clipping rectangle is
- * enabled, it will clip the text.
- *
- * In addition, x and y offset values may be specified. These specify an offset from the anchor
- * position. If used in conjunction with the clipping rectangle, these could be used to implement
- * simple scrolling of the text within the clipping rectangle.
- *
- * The following object arguments are available:
- *
- * name type read/write description
- * ------------------------------------------------------------------------------------------
- * text string RW The string of the text label
- * font string W X logical font descriptor
- * fontset string W X logical fontset descriptor
- * font_gdk GdkFont* RW Pointer to a GdkFont
- * anchor GtkAnchorType RW Anchor side for the text
- * justification GtkJustification RW Justification for multiline text
- * fill_color string W X color specification for text
- * fill_color_gdk GdkColor* RW Pointer to an allocated GdkColor
- * fill_stipple GdkBitmap* RW Stipple pattern for filling the text
- * clip_width double RW Width of clip rectangle
- * clip_height double RW Height of clip rectangle
- * clip boolean RW Use clipping rectangle?
- * fill_clip_rect boolean RW Whether the text item represents itself as being the size of the clipping rectangle.
- * x_offset double RW Horizontal offset distance from anchor position
- * y_offset double RW Vertical offset distance from anchor position
- * text_width double R Used to query the width of the rendered text
- * text_height double R Used to query the rendered height of the text
- * width double RW A synonym for clip_width
- * height double R A synonym for text_height
- *
- * These are currently ignored in the AA version:
- * editable boolean RW Can this item be edited
- * use_ellipsis boolean RW Whether to use ellipsises if text gets cut off. Meaningless if clip == false.
- * ellipsis string RW The characters to use as ellipsis. NULL = "...".
- * line_wrap boolean RW Line wrap when not editing.
- * break_characters string RW List of characters to optionally break on.
- * max_lines int RW Number of lines possible when doing line wrap.
- * draw_borders boolean RW Whether to draw borders.
- */
-
-#define E_TYPE_TEXT (e_text_get_type ())
-#define E_TEXT(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TEXT, EText))
-#define E_TEXT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TEXT, ETextClass))
-#define E_IS_TEXT(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TEXT))
-#define E_IS_TEXT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_TEXT))
-
-
-typedef struct _EText EText;
-typedef struct _ETextClass ETextClass;
-
-#if 0
-typedef struct _ETextSuckFont ETextSuckFont;
-typedef struct _ETextSuckChar ETextSuckChar;
-
-struct _ETextSuckChar {
- int left_sb;
- int right_sb;
- int width;
- int ascent;
- int descent;
- int bitmap_offset; /* in pixels */
-};
-
-struct _ETextSuckFont {
- guchar *bitmap;
- gint bitmap_width;
- gint bitmap_height;
- gint ascent;
- ETextSuckChar chars[256];
-};
-#endif
-
-struct _EText {
- GnomeCanvasItem item;
-
- ETextModel *model;
- gint model_changed_signal_id;
-
- char *text; /* Text to display */
- gpointer lines; /* Text split into lines (private field) */
- int num_lines; /* Number of lines of text */
-
-#if 0
- GdkFont *font; /* Font for text */
-#else
- EFont *font;
-#endif
- GtkAnchorType anchor; /* Anchor side for text */
- GtkJustification justification; /* Justification for text */
-
- double clip_width; /* Width of optional clip rectangle */
- double clip_height; /* Height of optional clip rectangle */
-
- double xofs, yofs; /* Text offset distance from anchor position */
-
- gulong pixel; /* Fill color */
- GdkBitmap *stipple; /* Stipple for text */
- GdkGC *gc; /* GC for drawing text */
-
- int cx, cy; /* Top-left canvas coordinates for text */
- int clip_cx, clip_cy; /* Top-left canvas coordinates for clip rectangle */
- int clip_cwidth, clip_cheight; /* Size of clip rectangle in pixels */
- int max_width; /* Maximum width of text lines */
- int width; /* Rendered text width in pixels */
- int height; /* Rendered text height in pixels */
-
- guint clip : 1; /* Use clip rectangle? */
- guint fill_clip_rectangle : 1; /* Fill the clipping rectangle. */
-
- /* Antialiased specific stuff follows */
-#if 0
- ETextSuckFont *suckfont; /* Sucked font */
-#endif
- guint32 rgba; /* RGBA color for text */
- double affine[6]; /* The item -> canvas affine */
-
- char *ellipsis; /* The ellipsis characters. NULL = "...". */
- double ellipsis_width; /* The width of the ellipsis. */
- gboolean use_ellipsis; /* Whether to use the ellipsis. */
-
- gboolean editable; /* Item is editable */
- gboolean editing; /* Item is currently being edited */
-
- int xofs_edit; /* Offset because of editing */
- int yofs_edit; /* Offset because of editing */
-
- /* This needs to be reworked a bit once we get line wrapping. */
- int selection_start; /* Start of selection */
- int selection_end; /* End of selection */
- gboolean select_by_word; /* Current selection is by word */
-
- /* This section is for drag scrolling and blinking cursor. */
- gint timeout_id; /* Current timeout id for scrolling */
- GTimer *timer; /* Timer for blinking cursor and scrolling */
-
- gint lastx, lasty; /* Last x and y motion events */
- gint last_state; /* Last state */
- gulong scroll_start; /* Starting time for scroll (microseconds) */
-
- gint show_cursor; /* Is cursor currently shown */
- gboolean button_down; /* Is mouse button 1 down */
-
- ETextEventProcessor *tep; /* Text Event Processor */
- gint tep_command_id;
-
- GtkWidget *invisible; /* For selection handling */
- gboolean has_selection; /* TRUE if we have the selection */
- gchar *primary_selection; /* Primary selection text */
- gint primary_length; /* Primary selection text length */
- gchar *clipboard_selection; /* Clipboard selection text */
- gint clipboard_length; /* Clipboard selection text length*/
-
- guint pointer_in : 1; /* Is the pointer currently over us? */
- guint default_cursor_shown : 1; /* Is the default cursor currently shown? */
- guint draw_borders : 1; /* Draw borders? */
-
- guint line_wrap : 1; /* Do line wrap */
- gchar *break_characters; /* Characters to optionally break after */
-
- gint max_lines; /* Max number of lines (-1 = infinite) */
-
- GdkCursor *default_cursor; /* Default cursor (arrow) */
- GdkCursor *i_cursor; /* I beam cursor */
-
- gint tooltip_timeout; /* Timeout for the tooltip */
- GtkWidget *tooltip_window; /* GtkWindow for displaying the tooltip */
- gint tooltip_count; /* GDK_ENTER_NOTIFY count. */
-
- guint needs_redraw : 1; /* Needs redraw */
- guint needs_recalc_bounds : 1; /* Need recalc_bounds */
- guint needs_calc_height : 1; /* Need calc_height */
- guint needs_calc_line_widths : 1; /* Needs calc_line_widths */
- guint needs_split_into_lines : 1; /* Needs split_into_lines */
-
- gint dbl_timeout; /* Double click timeout */
- gint tpl_timeout; /* Triple click timeout */
-};
-
-struct _ETextClass {
- GnomeCanvasItemClass parent_class;
-
- void (* changed) (EText *text);
- void (* activate) (EText *text);
-};
-
-
-/* Standard Gtk function */
-GtkType e_text_get_type (void);
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/widgets/meeting-time-sel/.cvsignore b/widgets/meeting-time-sel/.cvsignore
deleted file mode 100644
index 50530fdf4e..0000000000
--- a/widgets/meeting-time-sel/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-test-meeting-time-selector
diff --git a/widgets/meeting-time-sel/ChangeLog b/widgets/meeting-time-sel/ChangeLog
deleted file mode 100644
index 847431e29d..0000000000
--- a/widgets/meeting-time-sel/ChangeLog
+++ /dev/null
@@ -1,9 +0,0 @@
-2000-06-26 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added the include path to top_srcdir.
-
-2000-06-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-meeting-time-sel.c: Specify the #include path for
- `e-canvas-utils.h' so that we build with builddir != srcdir.
-
diff --git a/widgets/meeting-time-sel/LICENSE b/widgets/meeting-time-sel/LICENSE
deleted file mode 100644
index 9babf4395f..0000000000
--- a/widgets/meeting-time-sel/LICENSE
+++ /dev/null
@@ -1 +0,0 @@
-This code is licensed under the terms of the GNU GPL
diff --git a/widgets/meeting-time-sel/Makefile.am b/widgets/meeting-time-sel/Makefile.am
deleted file mode 100644
index 840c333f1a..0000000000
--- a/widgets/meeting-time-sel/Makefile.am
+++ /dev/null
@@ -1,36 +0,0 @@
-
-INCLUDES = \
- $(GNOME_INCLUDEDIR) \
- -I $(top_srcdir) \
- -DG_LOG_DOMAIN=\"meeting-time-sel\"
-
-noinst_LIBRARIES = \
- libevolutionmtsel.a
-
-libevolutionmtsel_a_SOURCES = \
- e-meeting-time-sel.c \
- e-meeting-time-sel.h \
- e-meeting-time-sel-item.c \
- e-meeting-time-sel-item.h \
- e-meeting-time-sel-list-item.c \
- e-meeting-time-sel-list-item.h
-
-noinst_PROGRAMS = \
- test-meeting-time-selector
-
-test_meeting_time_selector_SOURCES = \
- test-meeting-time-sel.c
-
-test_meeting_time_selector_LDADD = \
- libevolutionmtsel.a \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/e-util/libeutil.la \
- $(EXTRA_GNOME_LIBS) \
- $(GNOMEUI_LIBS)
-
-test_meeting_time_selector_LDFLAGS = $(GNOME_LIBDIR)
-
-EXTRA_DIST = \
- e-meeting-time-sel-mail.xpm \
- e-meeting-time-sel-no-mail.xpm
-
diff --git a/widgets/meeting-time-sel/e-meeting-time-sel-item.c b/widgets/meeting-time-sel/e-meeting-time-sel-item.c
deleted file mode 100644
index 54cde8d319..0000000000
--- a/widgets/meeting-time-sel/e-meeting-time-sel-item.c
+++ /dev/null
@@ -1,978 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@gtk.org>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * 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.
- */
-
-#include <config.h>
-#include <time.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_class_init (EMeetingTimeSelectorItemClass *mts_item_class);
-static void e_meeting_time_selector_item_init (EMeetingTimeSelectorItem *mts_item);
-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, EMeetingTimeSelectorBusyType 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);
-
-static GnomeCanvasItemClass *parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_MEETING_TIME_SELECTOR
-};
-
-
-GtkType
-e_meeting_time_selector_item_get_type (void)
-{
- static GtkType e_meeting_time_selector_item_type = 0;
-
- if (!e_meeting_time_selector_item_type) {
- GtkTypeInfo e_meeting_time_selector_item_info = {
- "EMeetingTimeSelectorItem",
- sizeof (EMeetingTimeSelectorItem),
- sizeof (EMeetingTimeSelectorItemClass),
- (GtkClassInitFunc) e_meeting_time_selector_item_class_init,
- (GtkObjectInitFunc) e_meeting_time_selector_item_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- e_meeting_time_selector_item_type = gtk_type_unique (gnome_canvas_item_get_type (), &e_meeting_time_selector_item_info);
- }
-
- return e_meeting_time_selector_item_type;
-}
-
-
-static void
-e_meeting_time_selector_item_class_init (EMeetingTimeSelectorItemClass *mts_item_class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type());
-
- 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_TOP_LEFT_ARROW);
- 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);
-
- gdk_cursor_destroy (mts_item->normal_cursor);
- gdk_cursor_destroy (mts_item->resize_cursor);
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (*GTK_OBJECT_CLASS (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 (parent_class)->realize)
- (*GNOME_CANVAS_ITEM_CLASS (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 (parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (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 (parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (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;
- EMeetingTimeSelectorAttendee *attendee;
- 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 < mts->attendees->len && row_y < height) {
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
- if (attendee->has_calendar_info) {
- 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;
- GdkFont *font;
- gint y, grid_x;
- gchar buffer[128];
- gint hour, hour_x, hour_y;
- GdkRectangle clip_rect;
-
- mts = mts_item->mts;
- gc = mts_item->main_gc;
-
- gdk_gc_set_foreground (gc, &mts->grid_color);
-
- /* 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. */
- font = GTK_WIDGET (mts)->style->font;
- if (mts->date_format == E_MEETING_TIME_SELECTOR_DATE_FULL)
- g_date_strftime (buffer, 128, "%A, %B %d, %Y", date);
- else if (mts->date_format == E_MEETING_TIME_SELECTOR_DATE_ABBREVIATED_DAY)
- g_date_strftime (buffer, 128, "%a %x", date);
- else
- g_date_strftime (buffer, 128, "%x", 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);
- gdk_draw_string (drawable, font, gc,
- x + 4, 4 + font->ascent - scroll_y, buffer);
- gdk_gc_set_clip_rectangle (gc, NULL);
-
- /* Draw the hours. */
- hour = mts->first_hour_shown + (mts->zoomed_out ? 3 : 1);
- hour_x = x + mts->col_width;
- hour_y = mts->row_height + 4 + font->ascent - scroll_y;
- while (hour < mts->last_hour_shown) {
- gdk_draw_string (drawable, font, gc,
- hour_x - (mts->hour_widths[hour] / 2),
- hour_y, EMeetingTimeSelectorHours[hour]);
-
- hour += mts->zoomed_out ? 3 : 1;
- hour_x += mts->col_width;
- }
-}
-
-
-/* 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;
- EMeetingTimeSelectorBusyType 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, mts->attendees->len);
- for (row = 0; row < mts->attendees->len; 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_TIME_SELECTOR_BUSY_LAST;
- busy_type++) {
- gdk_gc_set_foreground (gc, &mts->busy_colors[busy_type]);
- for (row = 0; row < mts->attendees->len; 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 <= mts->attendees->len) {
- 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 = (mts->attendees->len * 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;
- EMeetingTimeSelectorBusyType 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 < mts->attendees->len) {
-
- /* 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_TIME_SELECTOR_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;
- EMeetingTimeSelectorAttendee *attendee;
- EMeetingTimeSelectorPeriod *period;
- gint period_num;
-
- mts = mts_item->mts;
-
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
-
- period_num = e_meeting_time_selector_find_first_busy_period (mts, attendee, date);
- if (period_num == -1)
- return -1;
-
- /* Check if the period starts after the end of the current canvas
- scroll area. */
- period = &g_array_index (attendee->busy_periods,
- EMeetingTimeSelectorPeriod, 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, EMeetingTimeSelectorBusyType busy_type)
-{
- EMeetingTimeSelector *mts;
- EMeetingTimeSelectorAttendee *attendee;
- EMeetingTimeSelectorPeriod *period;
- GdkGC *gc;
- gint period_num, x1, x2, x2_within_day, x2_within_col;
-
- mts = mts_item->mts;
- gc = mts_item->main_gc;
-
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
-
- for (period_num = first_period;
- period_num < attendee->busy_periods->len;
- period_num++) {
- period = &g_array_index (attendee->busy_periods,
- EMeetingTimeSelectorPeriod, 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;
- EMeetingTimeSelectorTime 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->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;
- }
-
- /* 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)
-{
- EMeetingTimeSelectorAttendee *attendee;
-
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
-
- *start_x = -1;
- *end_x = -1;
-
- if (!g_date_valid (&attendee->busy_periods_start.date)
- || !g_date_valid (&attendee->busy_periods_end.date))
- return FALSE;
-
- *start_x = e_meeting_time_selector_calculate_time_position (mts, &attendee->busy_periods_start) - x - 1;
-
- *end_x = e_meeting_time_selector_calculate_time_position (mts, &attendee->busy_periods_end) - x;
-
- return TRUE;
-}
diff --git a/widgets/meeting-time-sel/e-meeting-time-sel-item.h b/widgets/meeting-time-sel/e-meeting-time-sel-item.h
deleted file mode 100644
index d9fe6c6a9b..0000000000
--- a/widgets/meeting-time-sel/e-meeting-time-sel-item.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@gtk.org>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * 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/widgets/meeting-time-sel/e-meeting-time-sel-list-item.c b/widgets/meeting-time-sel/e-meeting-time-sel-list-item.c
deleted file mode 100644
index 0c6d5427d5..0000000000
--- a/widgets/meeting-time-sel/e-meeting-time-sel-list-item.c
+++ /dev/null
@@ -1,393 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@gtk.org>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EMeetingTimeSelectorListItem - A GnomeCanvasItem covering the entire attendee
- * list. It just draws the grid lines between the rows and after the icon
- * column.
- */
-
-#include <config.h>
-#include <time.h>
-#include "../../e-util/e-canvas.h"
-#include "e-meeting-time-sel-list-item.h"
-#include "e-meeting-time-sel.h"
-
-/* This is the size of our icons. */
-#define E_MEETING_TIME_SELECTOR_ICON_WIDTH 19
-#define E_MEETING_TIME_SELECTOR_ICON_HEIGHT 16
-
-#include "e-meeting-time-sel-mail.xpm"
-#include "e-meeting-time-sel-no-mail.xpm"
-
-static void e_meeting_time_selector_list_item_class_init (EMeetingTimeSelectorListItemClass *mtsl_item_class);
-static void e_meeting_time_selector_list_item_init (EMeetingTimeSelectorListItem *mtsl_item);
-static void e_meeting_time_selector_list_item_destroy (GtkObject *object);
-
-static void e_meeting_time_selector_list_item_set_arg (GtkObject *o, GtkArg *arg,
- guint arg_id);
-static void e_meeting_time_selector_list_item_realize (GnomeCanvasItem *item);
-static void e_meeting_time_selector_list_item_unrealize (GnomeCanvasItem *item);
-static void e_meeting_time_selector_list_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path, int flags);
-static void e_meeting_time_selector_list_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height);
-static double e_meeting_time_selector_list_item_point (GnomeCanvasItem *item,
- double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item);
-static gint e_meeting_time_selector_list_item_event (GnomeCanvasItem *item,
- GdkEvent *event);
-static gboolean e_meeting_time_selector_list_item_button_press (EMeetingTimeSelectorListItem *mtsl_item,
- GdkEvent *event);
-
-
-static GnomeCanvasItemClass *e_meeting_time_selector_list_item_parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_MEETING_TIME_SELECTOR
-};
-
-
-GtkType
-e_meeting_time_selector_list_item_get_type (void)
-{
- static GtkType e_meeting_time_selector_list_item_type = 0;
-
- if (!e_meeting_time_selector_list_item_type) {
- GtkTypeInfo e_meeting_time_selector_list_item_info = {
- "EMeetingTimeSelectorListItem",
- sizeof (EMeetingTimeSelectorListItem),
- sizeof (EMeetingTimeSelectorListItemClass),
- (GtkClassInitFunc) e_meeting_time_selector_list_item_class_init,
- (GtkObjectInitFunc) e_meeting_time_selector_list_item_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- e_meeting_time_selector_list_item_type = gtk_type_unique (gnome_canvas_item_get_type (), &e_meeting_time_selector_list_item_info);
- }
-
- return e_meeting_time_selector_list_item_type;
-}
-
-
-static void
-e_meeting_time_selector_list_item_class_init (EMeetingTimeSelectorListItemClass *mtsl_item_class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- e_meeting_time_selector_list_item_parent_class = gtk_type_class (gnome_canvas_item_get_type());
-
- object_class = (GtkObjectClass *) mtsl_item_class;
- item_class = (GnomeCanvasItemClass *) mtsl_item_class;
-
- gtk_object_add_arg_type ("EMeetingTimeSelectorListItem::meeting_time_selector",
- GTK_TYPE_POINTER, GTK_ARG_WRITABLE,
- ARG_MEETING_TIME_SELECTOR);
-
- object_class->destroy = e_meeting_time_selector_list_item_destroy;
- object_class->set_arg = e_meeting_time_selector_list_item_set_arg;
-
- /* GnomeCanvasItem method overrides */
- item_class->realize = e_meeting_time_selector_list_item_realize;
- item_class->unrealize = e_meeting_time_selector_list_item_unrealize;
- item_class->update = e_meeting_time_selector_list_item_update;
- item_class->draw = e_meeting_time_selector_list_item_draw;
- item_class->point = e_meeting_time_selector_list_item_point;
- item_class->event = e_meeting_time_selector_list_item_event;
-}
-
-
-static void
-e_meeting_time_selector_list_item_init (EMeetingTimeSelectorListItem *mtsl_item)
-{
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (mtsl_item);
- GdkColormap *colormap;
-
- mtsl_item->mts = NULL;
-
- colormap = gtk_widget_get_default_colormap ();
- mtsl_item->mail_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mtsl_item->mail_icon_mask, NULL, e_meeting_time_sel_mail_xpm);
- mtsl_item->no_mail_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mtsl_item->no_mail_icon_mask, NULL, e_meeting_time_sel_no_mail_xpm);
-
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = 0;
- item->y2 = 0;
-}
-
-
-static void
-e_meeting_time_selector_list_item_destroy (GtkObject *object)
-{
- EMeetingTimeSelectorListItem *mtsl_item;
-
- mtsl_item = E_MEETING_TIME_SELECTOR_LIST_ITEM (object);
-
- gdk_pixmap_unref (mtsl_item->mail_icon);
- gdk_pixmap_unref (mtsl_item->no_mail_icon);
- gdk_bitmap_unref (mtsl_item->mail_icon_mask);
- gdk_bitmap_unref (mtsl_item->mail_icon_mask);
-
- if (GTK_OBJECT_CLASS (e_meeting_time_selector_list_item_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (e_meeting_time_selector_list_item_parent_class)->destroy)(object);
-}
-
-
-static void
-e_meeting_time_selector_list_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EMeetingTimeSelectorListItem *mtsl_item;
-
- item = GNOME_CANVAS_ITEM (o);
- mtsl_item = E_MEETING_TIME_SELECTOR_LIST_ITEM (o);
-
- switch (arg_id){
- case ARG_MEETING_TIME_SELECTOR:
- mtsl_item->mts = GTK_VALUE_POINTER (*arg);
- break;
- }
-}
-
-
-static void
-e_meeting_time_selector_list_item_realize (GnomeCanvasItem *item)
-{
- GnomeCanvas *canvas;
- GdkWindow *window;
- EMeetingTimeSelectorListItem *mtsl_item;
-
- if (GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_list_item_parent_class)->realize)
- (*GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_list_item_parent_class)->realize)(item);
-
- mtsl_item = E_MEETING_TIME_SELECTOR_LIST_ITEM (item);
-
- canvas = item->canvas;
- window = GTK_WIDGET (canvas)->window;
-
- mtsl_item->main_gc = gdk_gc_new (window);
-}
-
-
-static void
-e_meeting_time_selector_list_item_unrealize (GnomeCanvasItem *item)
-{
- EMeetingTimeSelectorListItem *mtsl_item;
-
- mtsl_item = E_MEETING_TIME_SELECTOR_LIST_ITEM (item);
-
- gdk_gc_unref (mtsl_item->main_gc);
- mtsl_item->main_gc = NULL;
-
- if (GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_list_item_parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_list_item_parent_class)->unrealize)(item);
-}
-
-
-static void
-e_meeting_time_selector_list_item_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- if (GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_list_item_parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_list_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_meeting_time_selector_list_item_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
- EMeetingTimeSelectorListItem *mtsl_item;
- EMeetingTimeSelector *mts;
- EMeetingTimeSelectorAttendee *attendee;
- GdkGC *gc;
- GdkFont *font;
- gint row, row_y, icon_x, icon_y;
- GdkPixmap *pixmap;
- GdkBitmap *mask;
-
- mtsl_item = E_MEETING_TIME_SELECTOR_LIST_ITEM (item);
- mts = mtsl_item->mts;
- gc = mtsl_item->main_gc;
-
- gdk_gc_set_foreground (gc, &mts->attendee_list_bg_color);
- gdk_draw_rectangle (drawable, gc, TRUE, 0, 0, width, height);
-
- gdk_gc_set_foreground (gc, &mts->grid_unused_color);
- gdk_draw_line (drawable, gc, 24 - x, 0, 24 - x, height);
-
- /* Draw the grid line across the top of the row. */
- row = y / mts->row_height;
- row_y = row * mts->row_height - y;
- while (row_y < height) {
- gdk_draw_line (drawable, gc, 0, row_y, width, row_y);
- row_y += mts->row_height;
- }
-
- row = y / mts->row_height;
- row_y = row * mts->row_height - y;
- icon_x = (E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH - E_MEETING_TIME_SELECTOR_ICON_WIDTH + 1) / 2 - x;
- icon_y = row_y + (mts->row_height - E_MEETING_TIME_SELECTOR_ICON_HEIGHT + 1) / 2;
- while (row < mts->attendees->len && row_y < height) {
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
-
- gdk_gc_set_clip_origin (gc, icon_x, icon_y);
-
- if (attendee->send_meeting_to) {
- pixmap = mtsl_item->mail_icon;
- mask = mtsl_item->mail_icon_mask;
- } else {
- pixmap = mtsl_item->no_mail_icon;
- mask = mtsl_item->no_mail_icon_mask;
- }
-
- gdk_gc_set_clip_mask (gc, mask);
- gdk_draw_pixmap (drawable, gc, pixmap, 0, 0,
- icon_x, icon_y, 24, 24);
-
- row++;
- row_y += mts->row_height;
- icon_y += mts->row_height;
- }
- gdk_gc_set_clip_mask (gc, NULL);
-
- /* Draw 'Click here to add attendee' on the last dummy row. */
- row_y = mts->attendees->len * mts->row_height;
-
- font = GTK_WIDGET (mts)->style->font;
- gdk_gc_set_foreground (gc, &mts->grid_unused_color);
- gdk_draw_string (drawable, font, gc,
- E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH
- + E_MEETING_TIME_SELECTOR_TEXT_X_PAD - x,
- row_y + E_MEETING_TIME_SELECTOR_TEXT_Y_PAD
- + font->ascent + 1 - y,
- "Click here to add attendee");
-}
-
-
-/* This is supposed to return the nearest item the the point and the distance.
- Since we cover the entire canvas 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_list_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_list_item_event (GnomeCanvasItem *item,
- GdkEvent *event)
-{
- EMeetingTimeSelectorListItem *mtsl_item;
-
- mtsl_item = E_MEETING_TIME_SELECTOR_LIST_ITEM (item);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- return e_meeting_time_selector_list_item_button_press (mtsl_item, event);
- case GDK_BUTTON_RELEASE:
- break;
- case GDK_MOTION_NOTIFY:
- break;
- default:
- break;
- }
-
- return FALSE;
-}
-
-
-static gboolean
-e_meeting_time_selector_list_item_button_press (EMeetingTimeSelectorListItem *mtsl_item,
- GdkEvent *event)
-{
- EMeetingTimeSelector *mts;
- EMeetingTimeSelectorAttendee *attendee;
- gint row;
- gboolean return_val;
-
- mts = mtsl_item->mts;
- row = event->button.y / mts->row_height;
-
- g_print ("In e_meeting_time_selector_list_item_button_press: %g,%g row:%i\n",
- event->button.x, event->button.y, row);
-
- if (event->button.x >= E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH) {
- if (row < mts->attendees->len) {
- attendee = &g_array_index (mts->attendees, EMeetingTimeSelectorAttendee, row);
- gtk_signal_emit_by_name (GTK_OBJECT (attendee->text_item),
- "event", event, &return_val);
- return return_val;
- } else {
- row = e_meeting_time_selector_attendee_add (mts, "",
- NULL);
-
- /* Scroll down to show the last line.?? */
-#if 0
- adjustment = GTK_LAYOUT (mts->display_main)->vadjustment;
- adjustment->value = adjustment->upper - adjustment->page_size;
- gtk_adjustment_value_changed (adjustment);
-#endif
-
- attendee = &g_array_index (mts->attendees, EMeetingTimeSelectorAttendee, row);
- e_canvas_item_grab_focus (attendee->text_item);
- return TRUE;
- }
- } else {
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
-
- attendee->send_meeting_to = !attendee->send_meeting_to;
-
- gnome_canvas_request_redraw (GNOME_CANVAS_ITEM (mtsl_item)->canvas,
- 0, row * mts->row_height,
- E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH,
- (row + 1) * mts->row_height);
- return TRUE;
- }
-}
-
diff --git a/widgets/meeting-time-sel/e-meeting-time-sel-list-item.h b/widgets/meeting-time-sel/e-meeting-time-sel-list-item.h
deleted file mode 100644
index 07df052c08..0000000000
--- a/widgets/meeting-time-sel/e-meeting-time-sel-list-item.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@gtk.org>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * MeetingTimeSelectorListItem - A GnomeCanvasItem covering the entire attendee
- * list. It just draws the grid lines between the rows and after the icon
- * column.
- */
-
-#ifndef _E_MEETING_TIME_SELECTOR_LIST_ITEM_H_
-#define _E_MEETING_TIME_SELECTOR_LIST_ITEM_H_
-
-#include "e-meeting-time-sel.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-#define E_MEETING_TIME_SELECTOR_LIST_ITEM(obj) (GTK_CHECK_CAST((obj), e_meeting_time_selector_list_item_get_type (), EMeetingTimeSelectorListItem))
-#define E_MEETING_TIME_SELECTOR_LIST_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), e_meeting_time_selector_list_item_get_type (), EMeetingTimeSelectorListItemClass))
-#define IS_E_MEETING_TIME_SELECTOR_LIST_ITEM(o) (GTK_CHECK_TYPE((o), e_meeting_time_selector_list_item_get_type ()))
-
-
-typedef struct _EMeetingTimeSelectorListItem EMeetingTimeSelectorListItem;
-typedef struct _EMeetingTimeSelectorListItemClass EMeetingTimeSelectorListItemClass;
-
-struct _EMeetingTimeSelectorListItem
-{
- 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;
-
- GdkPixmap *mail_icon, *no_mail_icon;
- GdkBitmap *mail_icon_mask, *no_mail_icon_mask;
-};
-
-
-struct _EMeetingTimeSelectorListItemClass
-{
- GnomeCanvasItemClass parent_class;
-};
-
-GtkType e_meeting_time_selector_list_item_get_type (void);
-
-
-#endif /* _E_MEETING_TIME_SELECTOR_LIST_ITEM_H_ */
diff --git a/widgets/meeting-time-sel/e-meeting-time-sel-mail.xpm b/widgets/meeting-time-sel/e-meeting-time-sel-mail.xpm
deleted file mode 100644
index 5a03c7ea8a..0000000000
--- a/widgets/meeting-time-sel/e-meeting-time-sel-mail.xpm
+++ /dev/null
@@ -1,135 +0,0 @@
-/* XPM */
-static char * e_meeting_time_sel_mail_xpm[] = {
-"19 16 116 2",
-" c None",
-". c #000000",
-"+ c #7B7B78",
-"@ c #C7C7C3",
-"# c #F1F0EB",
-"$ c #BFBFBC",
-"% c #5F5E5E",
-"& c #E3E3DF",
-"* c #F3F3EF",
-"= c #F2F2EE",
-"- c #F1F1EC",
-"; c #F0EFEB",
-"> c #D2D2CD",
-", c #969592",
-"' c #616060",
-") c #B5B5B4",
-"! c #F8F8F6",
-"~ c #F7F7F5",
-"{ c #F6F6F3",
-"] c #F5F5F2",
-"^ c #F4F4F0",
-"/ c #F2F1ED",
-"( c #F1F0EC",
-"_ c #F0EFEA",
-": c #EFEEE9",
-"< c #4F4F4D",
-"[ c #BDBCB8",
-"} c #A7A6A3",
-"| c #C6C6C4",
-"1 c #7C7C7B",
-"2 c #525251",
-"3 c #DBDBD9",
-"4 c #F5F4F1",
-"5 c #F4F3F0",
-"6 c #F3F2EE",
-"7 c #999894",
-"8 c #62625F",
-"9 c #BCBCB6",
-"0 c #EBE9E3",
-"a c #838381",
-"b c #D7D6D4",
-"c c #A8A8A6",
-"d c #515150",
-"e c #7E7D7C",
-"f c #DAD9D5",
-"g c #EFEEE8",
-"h c #EEEDE7",
-"i c #4F4E4C",
-"j c #BCBBB6",
-"k c #EBE9E2",
-"l c #EAE8E1",
-"m c #F6F5F2",
-"n c #F4F3EF",
-"o c #B5B4B1",
-"p c #9B9A97",
-"q c #646361",
-"r c #92918E",
-"s c #EEEDE8",
-"t c #EDECE6",
-"u c #4E4E4C",
-"v c #797976",
-"w c #797874",
-"x c #E9E8E1",
-"y c #E8E7DF",
-"z c #B4B3AF",
-"A c #D0D0CD",
-"B c #F2F2ED",
-"C c #BFBEBA",
-"D c #BEBDB9",
-"E c #7A7A77",
-"F c #979691",
-"G c #EAE9E2",
-"H c #959590",
-"I c #787773",
-"J c #B8B7B0",
-"K c #E6E4DC",
-"L c #A9A9A6",
-"M c #626260",
-"N c #ECEBE4",
-"O c #EBEAE3",
-"P c #E9E7E0",
-"Q c #E8E6DF",
-"R c #E7E5DD",
-"S c #777671",
-"T c #93918C",
-"U c #BEBDB8",
-"V c #989793",
-"W c #ECEAE4",
-"X c #E8E6DE",
-"Y c #E6E4DB",
-"Z c #E4E3DA",
-"` c #75746F",
-" . c #91908A",
-".. c #EEECE7",
-"+. c #62615F",
-"@. c #EBEAE4",
-"#. c #E7E6DE",
-"$. c #E6E5DC",
-"%. c #E5E4DB",
-"&. c #E4E2DA",
-"*. c #CCCBC4",
-"=. c #A3A29D",
-"-. c #B6B5B2",
-";. c #BCBCB7",
-">. c #CDCCC6",
-",. c #959490",
-"'. c #ECEBE5",
-"). c #61615E",
-"!. c #E9E8E0",
-"~. c #CECDC7",
-"{. c #797875",
-"]. c #969590",
-"^. c #CFCEC8",
-"/. c #AEADA8",
-"(. c #585754",
-"_. c #7B7A76",
-" . . . . ",
-" . . . . . + @ # $ . ",
-" . . . . . % $ & * = - ; > , . ",
-". ' ) ! ~ { ] ^ * / ( _ : < [ } . ",
-". | 1 2 3 4 5 6 / # _ : 7 8 9 0 . ",
-". a b c d e f / # _ g h i j k l . ",
-" . m 4 n o p q r s t u v w x y z . ",
-" . A * B ( ; C D E u F G H I J K . ",
-" . L / ( _ : M t N O l P Q R S T . ",
-" . # _ g U V W 0 l P X R Y Z ` .. ",
-" . ; g ..+.@.G x y #.$.%.&.*.=.. . ",
-" . -.t ;.F G x y #.K >.,.. . . ",
-" . '.).G !.Q ~.H . . . ",
-" . {.].^./.. . . ",
-" . (._.. . ",
-" . . "};
diff --git a/widgets/meeting-time-sel/e-meeting-time-sel-no-mail.xpm b/widgets/meeting-time-sel/e-meeting-time-sel-no-mail.xpm
deleted file mode 100644
index 747202b3e2..0000000000
--- a/widgets/meeting-time-sel/e-meeting-time-sel-no-mail.xpm
+++ /dev/null
@@ -1,123 +0,0 @@
-/* XPM */
-static char * e_meeting_time_sel_no_mail_xpm[] = {
-"19 16 104 2",
-" c None",
-". c #000000",
-"+ c #7B7B78",
-"@ c #C7C7C3",
-"# c #F1F0EB",
-"$ c #BFBFBC",
-"% c #5F5E5E",
-"& c #E3E3DF",
-"* c #F3F3EF",
-"= c #F2F2EE",
-"- c #F1F1EC",
-"; c #F0EFEB",
-"> c #D2D2CD",
-", c #969592",
-"' c #616060",
-") c #B5B5B4",
-"! c #F8F8F6",
-"~ c #F7F7F5",
-"{ c #F6F6F3",
-"] c #F5F5F2",
-"^ c #F4F4F0",
-"/ c #F2F1ED",
-"( c #F1F0EC",
-"_ c #F0EFEA",
-": c #EFEEE9",
-"< c #4F4F4D",
-"[ c #BDBCB8",
-"} c #A7A6A3",
-"| c #C6C6C4",
-"1 c #7C7C7B",
-"2 c #525251",
-"3 c #DBDBD9",
-"4 c #F5F4F1",
-"5 c #F4F3F0",
-"6 c #F3F2EE",
-"7 c #999894",
-"8 c #62625F",
-"9 c #BCBCB6",
-"0 c #EBE9E3",
-"a c #838381",
-"b c #D7D6D4",
-"c c #A8A8A6",
-"d c #515150",
-"e c #7E7D7C",
-"f c #DAD9D5",
-"g c #D16069",
-"h c #EEEDE7",
-"i c #4F4E4C",
-"j c #BCBBB6",
-"k c #F6F5F2",
-"l c #F4F3EF",
-"m c #B5B4B1",
-"n c #9B9A97",
-"o c #646361",
-"p c #92918E",
-"q c #9F3C44",
-"r c #797976",
-"s c #B5444E",
-"t c #B4B3AF",
-"u c #D0D0CD",
-"v c #F2F2ED",
-"w c #BFBEBA",
-"x c #BEBDB9",
-"y c #BB565F",
-"z c #812F36",
-"A c #E6E4DC",
-"B c #A9A9A6",
-"C c #626260",
-"D c #EDECE6",
-"E c #ECEBE4",
-"F c #BB555D",
-"G c #90353D",
-"H c #777671",
-"I c #93918C",
-"J c #EFEEE8",
-"K c #BEBDB8",
-"L c #989793",
-"M c #ECEAE4",
-"N c #E6E4DB",
-"O c #E4E3DA",
-"P c #75746F",
-"Q c #91908A",
-"R c #EEECE7",
-"S c #62615F",
-"T c #EBEAE4",
-"U c #EAE9E2",
-"V c #BD5A62",
-"W c #E4E2DA",
-"X c #CCCBC4",
-"Y c #A3A29D",
-"Z c #B6B5B2",
-"` c #BCBCB7",
-" . c #979691",
-".. c #BC5760",
-"+. c #A13C45",
-"@. c #ECEBE5",
-"#. c #61615E",
-"$. c #C0636B",
-"%. c #A83F48",
-"&. c #797875",
-"*. c #969590",
-"=. c #CFCEC8",
-"-. c #585754",
-";. c #7B7A76",
-" . . . . ",
-" . . . . . + @ # $ . ",
-" . . . . . % $ & * = - ; > , . ",
-". ' ) ! ~ { ] ^ * / ( _ : < [ } . ",
-". | 1 2 3 4 5 6 / # _ : 7 8 9 0 . ",
-". a b c d e f / # g g h i j g g . ",
-" . k 4 l m n o p g q g r g s g t . ",
-" . u * v ( ; w x g s g g y z g A . ",
-" . B / ( _ : C D E g s F G g H I . ",
-" . # _ J K L M 0 g s s g N O P Q . ",
-" . ; J R S T U g V s s g W X Y . . ",
-" . Z D ` .U g ..G g g +.g . . ",
-" . @.#.U g $.G g . g %.g ",
-" . &.*.=.g g g . g g ",
-" . -.;.. . ",
-" . . "};
diff --git a/widgets/meeting-time-sel/e-meeting-time-sel.c b/widgets/meeting-time-sel/e-meeting-time-sel.c
deleted file mode 100644
index 8c1731925d..0000000000
--- a/widgets/meeting-time-sel/e-meeting-time-sel.c
+++ /dev/null
@@ -1,3271 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@gtk.org>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include <gtk/gtkalignment.h>
-#include <gtk/gtkarrow.h>
-#include <gtk/gtkbutton.h>
-#include <gtk/gtkdrawingarea.h>
-#include <gtk/gtkentry.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 <libgnomeui/gnome-canvas-widget.h>
-
-#include "../../e-util/e-canvas.h"
-#include "../../e-util/e-canvas-utils.h"
-#include "e-meeting-time-sel.h"
-#include "e-meeting-time-sel-item.h"
-#include "e-meeting-time-sel-list-item.h"
-
-/* An array of hour strings, "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"
-};
-
-/* The number of days shown in the entire canvas. */
-#define E_MEETING_TIME_SELECTOR_DAYS_SHOWN 365
-
-/* 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
-
-
-static void e_meeting_time_selector_class_init (EMeetingTimeSelectorClass * klass);
-static void e_meeting_time_selector_init (EMeetingTimeSelector * mts);
-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 gint e_meeting_time_selector_expose_title_bar (GtkWidget *darea,
- GdkEventExpose *event,
- gpointer data);
-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 (GtkWidget *widget,
- GdkRectangle *area);
-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 gint e_meeting_time_selector_compare_period_starts (const void *arg1,
- const void *arg2);
-#if 0
-static gint e_meeting_time_selector_compare_periods (const void *arg1,
- const void *arg2);
-#endif
-static gint e_meeting_time_selector_compare_times (EMeetingTimeSelectorTime *time1,
- EMeetingTimeSelectorTime *time2);
-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,
- 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,
- 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 (EMeetingTimeSelectorTime *start,
- EMeetingTimeSelectorTime *end,
- gint *days,
- gint *hours,
- gint *minutes);
-static void e_meeting_time_selector_find_nearest_interval (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorTime *start_time,
- EMeetingTimeSelectorTime *end_time,
- gint days, gint hours, gint mins);
-static void e_meeting_time_selector_find_nearest_interval_backward (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorTime *start_time,
- EMeetingTimeSelectorTime *end_time,
- gint days, gint hours, gint mins);
-static void e_meeting_time_selector_adjust_time (EMeetingTimeSelectorTime *mtstime,
- gint days, gint hours, gint minutes);
-static EMeetingTimeSelectorPeriod* e_meeting_time_selector_find_time_clash (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorAttendee *attendee,
- EMeetingTimeSelectorTime *start_time,
- EMeetingTimeSelectorTime *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,
- EMeetingTimeSelectorTime *mtstime);
-static void e_meeting_time_selector_restore_position (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorTime *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_attendees_list_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation,
- 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 void e_meeting_time_selector_update_attendees_list_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 e_meeting_time_selector_update_attendees_list_positions (EMeetingTimeSelector *mts);
-static gboolean e_meeting_time_selector_on_text_item_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EMeetingTimeSelector *mts);
-static gint e_meeting_time_selector_find_row_from_text_item (EMeetingTimeSelector *mts,
- GnomeCanvasItem *item);
-
-static GtkTableClass *parent_class;
-
-
-GtkType
-e_meeting_time_selector_get_type (void)
-{
- static guint e_meeting_time_selector_type = 0;
-
- if (!e_meeting_time_selector_type) {
- GtkTypeInfo e_meeting_time_selector_info =
- {
- "EMeetingTimeSelector",
- sizeof (EMeetingTimeSelector),
- sizeof (EMeetingTimeSelectorClass),
- (GtkClassInitFunc) e_meeting_time_selector_class_init,
- (GtkObjectInitFunc) e_meeting_time_selector_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- e_meeting_time_selector_type = gtk_type_unique (GTK_TYPE_TABLE,
- &e_meeting_time_selector_info);
- }
- return e_meeting_time_selector_type;
-}
-
-
-static void
-e_meeting_time_selector_class_init (EMeetingTimeSelectorClass * klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- parent_class = gtk_type_class (gtk_table_get_type());
-
- object_class = (GtkObjectClass *) klass;
- widget_class = (GtkWidgetClass *) klass;
-
- 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;
- widget_class->draw = e_meeting_time_selector_draw;
-}
-
-
-static void
-e_meeting_time_selector_init (EMeetingTimeSelector * mts)
-{
- GtkWidget *hbox, *separator, *button, *label, *table;
- GtkWidget *alignment, *child_hbox, *arrow, *menuitem;
- GSList *group;
- GdkVisual *visual;
- GdkColormap *colormap;
- guint accel_key;
- GtkAccelGroup *menu_accel_group;
- time_t meeting_start_time;
- struct tm *meeting_start_tm;
- guchar stipple_bits[] = {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
- };
-
- /* 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->attendees = g_array_new (FALSE, FALSE,
- sizeof (EMeetingTimeSelectorAttendee));
-
- 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 = FALSE;
- mts->dragging_position = E_MEETING_TIME_SELECTOR_POS_NONE;
-
- /* 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 = 30;
- mts->col_width = 50;
- mts->day_width = 50 * 24 + 1;
-
- mts->auto_scroll_timeout_id = 0;
-
-
- mts->attendees_title_bar_vbox = gtk_vbox_new (FALSE, 2);
- /* Add some horizontal padding for the shadow around the display. */
- gtk_table_attach (GTK_TABLE (mts),
- mts->attendees_title_bar_vbox,
- 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 2, 0);
- gtk_widget_show (mts->attendees_title_bar_vbox);
-
- mts->attendees_title_bar = gtk_drawing_area_new ();
- gtk_box_pack_end (GTK_BOX (mts->attendees_title_bar_vbox),
- mts->attendees_title_bar, FALSE, FALSE, 0);
- gtk_widget_show (mts->attendees_title_bar);
- gtk_signal_connect (GTK_OBJECT (mts->attendees_title_bar),
- "expose_event",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_expose_title_bar), mts);
-
- mts->attendees_list = e_canvas_new ();
- /* Add some horizontal padding for the shadow around the display. */
- gtk_table_attach (GTK_TABLE (mts), mts->attendees_list,
- 0, 1, 1, 2,
- GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 2, 0);
- gtk_widget_show (mts->attendees_list);
- gtk_signal_connect (GTK_OBJECT (mts->attendees_list), "realize",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_canvas_realized), mts);
- gtk_signal_connect (GTK_OBJECT (mts->attendees_list), "size_allocate",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_attendees_list_size_allocate), mts);
-
- /* Create the item in the list canvas. */
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (mts->attendees_list)->root),
- e_meeting_time_selector_list_item_get_type (),
- "EMeetingTimeSelectorListItem::meeting_time_selector", mts,
- NULL);
-
- mts->display_top = gnome_canvas_new ();
- 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, 2, 0);
- gtk_widget_show (mts->display_top);
- gtk_signal_connect (GTK_OBJECT (mts->display_top), "realize",
- GTK_SIGNAL_FUNC (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, 2, 0);
- gtk_widget_show (mts->display_main);
- gtk_signal_connect (GTK_OBJECT (mts->display_main), "realize",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_canvas_realized), mts);
- gtk_signal_connect (GTK_OBJECT (mts->display_main), "size_allocate",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_canvas_size_allocate), mts);
-
- mts->hscrollbar = gtk_hscrollbar_new (GTK_LAYOUT (mts->display_main)->hadjustment);
- 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_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_TIME_SELECTOR_BUSY_TENTATIVE]);
- e_meeting_time_selector_add_key_color (mts, hbox, _("Busy"), &mts->busy_colors[E_MEETING_TIME_SELECTOR_BUSY_BUSY]);
- e_meeting_time_selector_add_key_color (mts, hbox, _("Out of Office"), &mts->busy_colors[E_MEETING_TIME_SELECTOR_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, 0, 0);
- 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);
-
- button = gtk_button_new_with_label ("");
- accel_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (button)->child),
- _("_Invite Others..."));
- gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
- gtk_widget_show (button);
- gtk_widget_add_accelerator (button, "clicked", mts->accel_group,
- accel_key, GDK_MOD1_MASK, 0);
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (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, 0);
- gtk_widget_show (mts->options_button);
-
- gtk_signal_connect (GTK_OBJECT (mts->options_button), "clicked",
- GTK_SIGNAL_FUNC (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 ("");
- accel_key = gtk_label_parse_uline (GTK_LABEL (label), _("_Options"));
- gtk_box_pack_start (GTK_BOX (child_hbox), label, TRUE, TRUE, 0);
- 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_OUT);
- gtk_box_pack_start (GTK_BOX (child_hbox), arrow, FALSE, FALSE, 2);
- 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);
- menu_accel_group = gtk_menu_ensure_uline_accel_group (GTK_MENU (mts->options_menu));
-
- menuitem = gtk_check_menu_item_new_with_label ("");
- accel_key = gtk_label_parse_uline (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);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, 0, 0);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, GDK_MOD1_MASK, 0);
- gtk_signal_connect (GTK_OBJECT (menuitem), "toggled",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_working_hours_toggled), mts);
- gtk_widget_show (menuitem);
-
- menuitem = gtk_check_menu_item_new_with_label ("");
- accel_key = gtk_label_parse_uline (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);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, 0, 0);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, GDK_MOD1_MASK, 0);
- gtk_signal_connect (GTK_OBJECT (menuitem), "toggled",
- GTK_SIGNAL_FUNC (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 ("");
- accel_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (menuitem)->child), _("_Update Free/Busy"));
- gtk_menu_append (GTK_MENU (mts->options_menu), menuitem);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, 0, 0);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, GDK_MOD1_MASK, 0);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- GTK_SIGNAL_FUNC (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);
-
- button = gtk_button_new_with_label ("");
- accel_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (button)->child),
- _("_<<"));
- gtk_widget_add_accelerator (button, "clicked", mts->accel_group,
- accel_key, GDK_MOD1_MASK | GDK_SHIFT_MASK, 0);
- gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
- gtk_widget_show (button);
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (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, 0);
- 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 ("");
- accel_key = gtk_label_parse_uline (GTK_LABEL (label), _("_Autopick"));
- gtk_box_pack_start (GTK_BOX (child_hbox), label, TRUE, TRUE, 0);
- gtk_widget_show (label);
- gtk_widget_add_accelerator (mts->autopick_button, "clicked", mts->accel_group,
- accel_key, GDK_MOD1_MASK, 0);
- gtk_signal_connect (GTK_OBJECT (mts->autopick_button), "clicked",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_autopick_button_clicked), mts);
-
- arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
- gtk_box_pack_start (GTK_BOX (child_hbox), arrow, FALSE, FALSE, 2);
- gtk_widget_show (arrow);
-
- button = gtk_button_new_with_label ("");
- accel_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (button)->child),
- _(">_>"));
- gtk_widget_add_accelerator (button, "clicked", mts->accel_group,
- accel_key, GDK_MOD1_MASK | GDK_SHIFT_MASK, 0);
- gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
- gtk_widget_show (button);
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (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);
- menu_accel_group = gtk_menu_ensure_uline_accel_group (GTK_MENU (mts->autopick_menu));
-
- 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));
- accel_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (menuitem)->child), _("_All People and Resources"));
- gtk_menu_append (GTK_MENU (mts->autopick_menu), menuitem);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, 0, 0);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, GDK_MOD1_MASK, 0);
- gtk_signal_connect (GTK_OBJECT (menuitem), "toggled",
- GTK_SIGNAL_FUNC (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));
- accel_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (menuitem)->child), _("All _People and One Resource"));
- gtk_menu_append (GTK_MENU (mts->autopick_menu), menuitem);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, 0, 0);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, GDK_MOD1_MASK, 0);
- gtk_signal_connect (GTK_OBJECT (menuitem), "toggled",
- GTK_SIGNAL_FUNC (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));
- accel_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (menuitem)->child), _("_Required People"));
- gtk_menu_append (GTK_MENU (mts->autopick_menu), menuitem);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, 0, 0);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, GDK_MOD1_MASK, 0);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- GTK_SIGNAL_FUNC (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));
- accel_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (menuitem)->child), _("Required People and _One Resource"));
- gtk_menu_append (GTK_MENU (mts->autopick_menu), menuitem);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, 0, 0);
- gtk_widget_add_accelerator (menuitem, "activate", menu_accel_group,
- accel_key, GDK_MOD1_MASK, 0);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- GTK_SIGNAL_FUNC (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.5, 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);
-
- label = gtk_label_new ("");
- accel_key = gtk_label_parse_uline (GTK_LABEL (label),
- _("Meeting _start time:"));
- 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->start_date_edit = gnome_date_edit_new (0, TRUE, TRUE);
- /* I don't like the 'Calendar' label. */
- gtk_widget_hide (GNOME_DATE_EDIT (mts->start_date_edit)->cal_label);
- 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);
- gtk_signal_connect (GTK_OBJECT (mts->start_date_edit), "date_changed",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_start_time_changed), mts);
- gtk_signal_connect (GTK_OBJECT (mts->start_date_edit), "time_changed",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_start_time_changed), mts);
- gtk_signal_connect (GTK_OBJECT (GNOME_DATE_EDIT (mts->start_date_edit)->date_entry), "activate", GTK_SIGNAL_FUNC (e_meeting_time_selector_on_start_time_changed), mts);
- gtk_signal_connect (GTK_OBJECT (GNOME_DATE_EDIT (mts->start_date_edit)->time_entry), "activate", GTK_SIGNAL_FUNC (e_meeting_time_selector_on_start_time_changed), mts);
- gtk_widget_add_accelerator (GNOME_DATE_EDIT (mts->start_date_edit)->date_entry,
- "grab_focus", mts->accel_group,
- accel_key, GDK_MOD1_MASK, 0);
-
- label = gtk_label_new ("");
- accel_key = gtk_label_parse_uline (GTK_LABEL (label),
- _("Meeting _end time:"));
- 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);
-
- mts->end_date_edit = gnome_date_edit_new (0, TRUE, TRUE);
- gtk_widget_hide (GNOME_DATE_EDIT (mts->end_date_edit)->cal_label);
- 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);
- gtk_signal_connect (GTK_OBJECT (mts->end_date_edit), "date_changed",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_end_time_changed), mts);
- gtk_signal_connect (GTK_OBJECT (mts->end_date_edit), "time_changed",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_end_time_changed), mts);
- gtk_signal_connect (GTK_OBJECT (GNOME_DATE_EDIT (mts->end_date_edit)->date_entry), "activate", GTK_SIGNAL_FUNC (e_meeting_time_selector_on_end_time_changed), mts);
- gtk_signal_connect (GTK_OBJECT (GNOME_DATE_EDIT (mts->end_date_edit)->time_entry), "activate", GTK_SIGNAL_FUNC (e_meeting_time_selector_on_end_time_changed), mts);
- gtk_widget_add_accelerator (GNOME_DATE_EDIT (mts->end_date_edit)->date_entry,
- "grab_focus", mts->accel_group,
- accel_key, GDK_MOD1_MASK, 0);
-
- 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));
- mts->color_context = gdk_color_context_new (visual, colormap);
- 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_TIME_SELECTOR_BUSY_TENTATIVE]);
- e_meeting_time_selector_alloc_named_color (mts, "blue", &mts->busy_colors[E_MEETING_TIME_SELECTOR_BUSY_BUSY]);
- e_meeting_time_selector_alloc_named_color (mts, "HotPink3", &mts->busy_colors[E_MEETING_TIME_SELECTOR_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 in the main canvas, so we can
- scroll the other 2 canvases. */
- gtk_signal_connect (GTK_OBJECT (GTK_LAYOUT (mts->display_main)->hadjustment), "value_changed", GTK_SIGNAL_FUNC (e_meeting_time_selector_hadjustment_changed), mts);
- gtk_signal_connect (GTK_OBJECT (GTK_LAYOUT (mts->display_main)->vadjustment), "value_changed", GTK_SIGNAL_FUNC (e_meeting_time_selector_vadjustment_changed), mts);
- gtk_signal_connect (GTK_OBJECT (GTK_LAYOUT (mts->display_main)->vadjustment), "changed", GTK_SIGNAL_FUNC (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);
-}
-
-
-/* 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, 0);
- gtk_widget_show (label);
-
- gtk_signal_connect (GTK_OBJECT (darea), "expose_event",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_expose_key_color),
- color);
-}
-
-
-static gint
-e_meeting_time_selector_expose_title_bar (GtkWidget *widget,
- GdkEventExpose *event,
- gpointer data)
-{
- EMeetingTimeSelector * mts;
- GdkFont *font;
-
- mts = E_MEETING_TIME_SELECTOR (data);
-
- gtk_draw_shadow (widget->style, widget->window, GTK_STATE_NORMAL,
- GTK_SHADOW_OUT, 0, 0,
- E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH + 1,
- widget->allocation.height);
- gtk_draw_shadow (widget->style, widget->window, GTK_STATE_NORMAL,
- GTK_SHADOW_OUT,
- E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH + 1, 0,
- widget->allocation.width - E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH - 1,
- widget->allocation.height);
-
- font = widget->style->font;
- gdk_draw_string (widget->window, font,
- widget->style->fg_gc[GTK_STATE_NORMAL],
- E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH + 4,
- 4 + font->ascent, _("All Attendees"));
-
- return FALSE;
-}
-
-
-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)
-{
- int failed;
-
- g_return_if_fail (name != NULL);
- g_return_if_fail (c != NULL);
-
- gdk_color_parse (name, c);
- c->pixel = 0;
- c->pixel = gdk_color_context_get_pixel (mts->color_context,
- c->red, c->green, c->blue,
- &failed);
- if (failed)
- 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 (void)
-{
- GtkWidget *mts;
-
- mts = GTK_WIDGET (gtk_type_new (e_meeting_time_selector_get_type ()));
-
- return mts;
-}
-
-
-static void
-e_meeting_time_selector_destroy (GtkObject *object)
-{
- EMeetingTimeSelector *mts;
- EMeetingTimeSelectorAttendee *attendee;
- gint row;
-
- mts = E_MEETING_TIME_SELECTOR (object);
-
- e_meeting_time_selector_remove_timeout (mts);
-
- gdk_color_context_free (mts->color_context);
- gdk_bitmap_unref (mts->stipple);
-
- for (row = 0; row < mts->attendees->len; row++) {
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
- g_free (attendee->name);
- g_array_free (attendee->busy_periods, TRUE);
- }
-
- g_array_free (mts->attendees, TRUE);
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (*GTK_OBJECT_CLASS (parent_class)->destroy)(object);
-}
-
-
-static void
-e_meeting_time_selector_realize (GtkWidget *widget)
-{
- EMeetingTimeSelector *mts;
-
- if (GTK_WIDGET_CLASS (parent_class)->realize)
- (*GTK_WIDGET_CLASS (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 (parent_class)->unrealize)
- (*GTK_WIDGET_CLASS (parent_class)->unrealize)(widget);
-}
-
-
-static void
-e_meeting_time_selector_style_set (GtkWidget *widget,
- GtkStyle *previous_style)
-{
- EMeetingTimeSelector *mts;
- EMeetingTimeSelectorTime saved_time;
- GdkFont *font;
- gint hour, max_hour_width;
-
- if (GTK_WIDGET_CLASS (parent_class)->style_set)
- (*GTK_WIDGET_CLASS (parent_class)->style_set)(widget, previous_style);
-
- mts = E_MEETING_TIME_SELECTOR (widget);
- font = widget->style->font;
-
- /* Calculate the widths of the hour strings in the style's font. */
- max_hour_width = 0;
- for (hour = 0; hour < 24; hour++) {
- mts->hour_widths[hour] = gdk_string_width (font, EMeetingTimeSelectorHours[hour]);
- max_hour_width = MAX (max_hour_width, mts->hour_widths[hour]);
- }
-
- mts->row_height = font->ascent + font->descent
- + E_MEETING_TIME_SELECTOR_TEXT_Y_PAD * 2 + 1;
- mts->col_width = max_hour_width + 4;
-
- 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);
- gtk_widget_set_usize (mts->attendees_title_bar, -1, mts->row_height);
-
- GTK_LAYOUT (mts->display_main)->hadjustment->step_increment = mts->col_width;
- GTK_LAYOUT (mts->display_main)->vadjustment->step_increment = mts->row_height;
-}
-
-
-/* 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 (parent_class)->expose_event)
- (*GTK_WIDGET_CLASS (parent_class)->expose_event)(widget, event);
-
- return FALSE;
-}
-
-
-static void
-e_meeting_time_selector_draw (GtkWidget *widget,
- GdkRectangle *area)
-{
- EMeetingTimeSelector *mts;
-
- mts = E_MEETING_TIME_SELECTOR (widget);
-
- e_meeting_time_selector_draw_shadow (mts);
-
- if (GTK_WIDGET_CLASS (parent_class)->draw)
- (*GTK_WIDGET_CLASS (parent_class)->draw)(widget, area);
-}
-
-
-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 attendees title bar and list. */
- x = mts->attendees_title_bar->allocation.x - 2;
- y = mts->attendees_title_bar->allocation.y - 2;
- w = mts->attendees_title_bar->allocation.width + 4;
- h = mts->attendees_title_bar->allocation.height + mts->attendees_list->allocation.height + 4;
-
- gtk_draw_shadow (widget->style, widget->window, GTK_STATE_NORMAL,
- GTK_SHADOW_IN, x, y, w, h);
-
- /* 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_LAYOUT (mts->attendees_list)->vadjustment;
- 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 GnomeDateEdit widgets. */
- e_meeting_time_selector_update_start_date_edit (mts);
- e_meeting_time_selector_update_end_date_edit (mts);
-
- return TRUE;
-}
-
-
-void
-e_meeting_time_selector_set_working_hours_only (EMeetingTimeSelector *mts,
- gboolean working_hours_only)
-{
- EMeetingTimeSelectorTime 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)
-{
- EMeetingTimeSelectorTime 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;
- mts->day_end_hour = day_end_hour;
- mts->day_end_minute = day_end_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)
-{
- EMeetingTimeSelectorTime 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);
-}
-
-
-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;
- }
-}
-
-
-/* Adds an attendee to the list, returning the row. The data is meant for
- something like an address book id, though if the user edits the name this
- will become invalid. We'll probably have to handle address book lookup
- ourself. */
-gint
-e_meeting_time_selector_attendee_add (EMeetingTimeSelector *mts,
- gchar *attendee_name,
- gpointer data)
-{
- EMeetingTimeSelectorAttendee attendee;
- gint list_width, item_width;
- GdkFont *font;
-
- g_return_val_if_fail (IS_E_MEETING_TIME_SELECTOR (mts), -1);
- g_return_val_if_fail (attendee_name != NULL, -1);
-
- attendee.name = g_strdup (attendee_name);
- attendee.type = E_MEETING_TIME_SELECTOR_REQUIRED_PERSON;
- attendee.has_calendar_info = FALSE;
- attendee.send_meeting_to = TRUE;
- g_date_clear (&attendee.busy_periods_start.date, 1);
- attendee.busy_periods_start.hour = 0;
- attendee.busy_periods_start.minute = 0;
- g_date_clear (&attendee.busy_periods_end.date, 1);
- attendee.busy_periods_end.hour = 0;
- attendee.busy_periods_end.minute = 0;
- attendee.busy_periods = g_array_new (FALSE, FALSE,
- sizeof (EMeetingTimeSelectorPeriod));
- attendee.busy_periods_sorted = TRUE;
- attendee.longest_period_in_days = 0;
- attendee.data = data;
-
- /* Add to the list on the left. */
- list_width = GTK_WIDGET (mts->attendees_list)->allocation.width;
- item_width = MAX (1, list_width - E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH - E_MEETING_TIME_SELECTOR_TEXT_X_PAD * 2);
- font = GTK_WIDGET (mts)->style->font;
- attendee.text_item = gnome_canvas_item_new
- (GNOME_CANVAS_GROUP (GNOME_CANVAS (mts->attendees_list)->root),
- e_text_get_type (),
- "font_gdk", font,
- "anchor", GTK_ANCHOR_NW,
- "clip", TRUE,
- "max_lines", 1,
- "editable", TRUE,
- "text", attendee_name ? attendee_name : "",
- "clip_width", (gdouble) item_width,
- "clip_height", (gdouble) font->ascent + font->descent,
- NULL);
-
- e_canvas_item_move_absolute(attendee.text_item,
- E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH
- + E_MEETING_TIME_SELECTOR_TEXT_X_PAD,
- mts->attendees->len * mts->row_height + 1
- + E_MEETING_TIME_SELECTOR_TEXT_Y_PAD);
-#if 0
- gnome_canvas_item_hide (attendee.text_item);
-#endif
-
- gtk_signal_connect (GTK_OBJECT (attendee.text_item), "event",
- GTK_SIGNAL_FUNC (e_meeting_time_selector_on_text_item_event),
- mts);
-
- g_array_append_val (mts->attendees, attendee);
-
- /* Update the scroll region. */
- e_meeting_time_selector_update_attendees_list_scroll_region (mts);
- e_meeting_time_selector_update_main_canvas_scroll_region (mts);
-
- /* Redraw the canvases. */
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
-
-
- return mts->attendees->len - 1;
-}
-
-
-gint
-e_meeting_time_selector_attendee_find_by_name (EMeetingTimeSelector *mts,
- gchar *attendee_name,
- gint start_row)
-{
- EMeetingTimeSelectorAttendee *attendee;
- gint row;
-
- g_return_val_if_fail (IS_E_MEETING_TIME_SELECTOR (mts), -1);
- g_return_val_if_fail (start_row >= 0, -1);
- g_return_val_if_fail (start_row < mts->attendees->len, -1);
-
- for (row = start_row; row < mts->attendees->len; row++) {
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
- if (!strcmp (attendee->name, attendee_name))
- return row;
- }
-
- return -1;
-}
-
-
-gint
-e_meeting_time_selector_attendee_find_by_data (EMeetingTimeSelector *mts,
- gpointer data,
- gint start_row)
-{
- EMeetingTimeSelectorAttendee *attendee;
- gint row;
-
- g_return_val_if_fail (IS_E_MEETING_TIME_SELECTOR (mts), -1);
- g_return_val_if_fail (start_row >= 0, -1);
- g_return_val_if_fail (start_row < mts->attendees->len, -1);
-
- for (row = start_row; row < mts->attendees->len; row++) {
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
- if (attendee->data == data)
- return row;
- }
-
- return -1;
-}
-
-
-void
-e_meeting_time_selector_attendee_remove (EMeetingTimeSelector *mts,
- gint row)
-{
- 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);
-
- g_free (attendee->name);
- g_array_free (attendee->busy_periods, TRUE);
-
- /* Destroy the GtkEntry in the list. */
- gtk_object_destroy (GTK_OBJECT (attendee->text_item));
-
- g_array_remove_index (mts->attendees, row);
-
- /* Update the positions of all the other GtkEntry widgets. */
- e_meeting_time_selector_update_attendees_list_positions (mts);
-
- e_meeting_time_selector_update_attendees_list_scroll_region (mts);
- e_meeting_time_selector_update_main_canvas_scroll_region (mts);
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
-}
-
-
-void
-e_meeting_time_selector_attendee_set_type (EMeetingTimeSelector *mts,
- gint row,
- EMeetingTimeSelectorAttendeeType type)
-{
- 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->type = type;
-}
-
-
-void
-e_meeting_time_selector_attendee_set_has_calendar_info (EMeetingTimeSelector *mts,
- gint row,
- gboolean has_calendar_info)
-{
- 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->has_calendar_info = has_calendar_info;
-}
-
-
-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;
-}
-
-
-gboolean
-e_meeting_time_selector_attendee_set_busy_range (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)
-{
- EMeetingTimeSelectorAttendee *attendee;
-
- g_return_val_if_fail (IS_E_MEETING_TIME_SELECTOR (mts), FALSE);
- g_return_val_if_fail (row >= 0, FALSE);
- g_return_val_if_fail (row < mts->attendees->len, FALSE);
-
- /* 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;
-
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
-
- g_date_clear (&attendee->busy_periods_start.date, 1);
- g_date_clear (&attendee->busy_periods_end.date, 1);
- g_date_set_dmy (&attendee->busy_periods_start.date,
- start_day, start_month, start_year);
- g_date_set_dmy (&attendee->busy_periods_end.date,
- end_day, end_month, end_year);
- attendee->busy_periods_start.hour = start_hour;
- attendee->busy_periods_start.minute = start_minute;
- attendee->busy_periods_end.hour = end_hour;
- attendee->busy_periods_end.minute = end_minute;
-
- return TRUE;
-}
-
-
-/* Clears all busy times for the given attendee. */
-void
-e_meeting_time_selector_attendee_clear_busy_periods (EMeetingTimeSelector *mts,
- gint row)
-{
- 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);
-
- g_array_set_size (attendee->busy_periods, 0);
- attendee->busy_periods_sorted = TRUE;
- attendee->longest_period_in_days = 0;
-}
-
-
-/* Adds one busy time for the given attendee. It returns FALSE if the date
- or time is invalid. Months and days count from 1. */
-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,
- EMeetingTimeSelectorBusyType busy_type)
-{
- EMeetingTimeSelectorAttendee *attendee;
- EMeetingTimeSelectorPeriod period;
- gint period_in_days;
-
- g_return_val_if_fail (IS_E_MEETING_TIME_SELECTOR (mts), FALSE);
- g_return_val_if_fail (row >= 0, FALSE);
- g_return_val_if_fail (row < mts->attendees->len, FALSE);
- g_return_val_if_fail (busy_type >= 0, FALSE);
- g_return_val_if_fail (busy_type < E_MEETING_TIME_SELECTOR_BUSY_LAST, FALSE);
-
- /* 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 (e_meeting_time_selector_compare_times (&period.start, &period.end) > 0)
- return FALSE;
-
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
- g_array_append_val (attendee->busy_periods, period);
- attendee->has_calendar_info = TRUE;
- attendee->busy_periods_sorted = FALSE;
-
- period_in_days = g_date_julian (&period.end.date) - g_date_julian (&period.start.date) + 1;
- attendee->longest_period_in_days = MAX (attendee->longest_period_in_days, period_in_days);
-
- return TRUE;
-}
-
-
-void
-e_meeting_time_selector_attendee_ensure_periods_sorted (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorAttendee *attendee)
-{
- if (attendee->busy_periods_sorted)
- return;
-
- qsort (attendee->busy_periods->data, attendee->busy_periods->len,
- sizeof (EMeetingTimeSelectorPeriod),
- e_meeting_time_selector_compare_period_starts);
- attendee->busy_periods_sorted = TRUE;
-}
-
-
-/* This compares two time periods, using their end times. */
-static gint
-e_meeting_time_selector_compare_period_starts (const void *arg1,
- const void *arg2)
-{
- EMeetingTimeSelectorPeriod *period1, *period2;
-
- period1 = (EMeetingTimeSelectorPeriod *) arg1;
- period2 = (EMeetingTimeSelectorPeriod *) arg2;
-
- return e_meeting_time_selector_compare_times (&period1->start,
- &period2->start);
-}
-
-
-/* This compares two time periods, using start and end times, mainly to see if
- they overlap at all. If they overlap it returns 0. Or -1 if arg1 < arg2.
- Or 1 if arg1 > arg2. */
-/* Currently unused. */
-#if 0
-static gint
-e_meeting_time_selector_compare_periods (const void *arg1,
- const void *arg2)
-{
- EMeetingTimeSelectorPeriod *period1, *period2;
-
- period1 = (EMeetingTimeSelectorPeriod *) arg1;
- period2 = (EMeetingTimeSelectorPeriod *) arg2;
-
- /* If period 2 starts after period 1 ends, return 1. */
- if (e_meeting_time_selector_compare_times (&period2->start, &period1->end) >= 0)
- return 1;
-
- /* If period 1 starts after period 2 ends, return -1. */
- if (e_meeting_time_selector_compare_times (&period1->start, &period2->end) >= 0)
- return -1;
-
- /* They must overlap so return 0. */
- return 0;
-}
-#endif
-
-
-static gint
-e_meeting_time_selector_compare_times (EMeetingTimeSelectorTime *time1,
- EMeetingTimeSelectorTime *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;
-}
-
-
-/*
- * 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);
-
- g_date_strftime (buffer, 128, "%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, 128, "%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 EMeetingTimeSelectorTime in a string and returns it.
- Note that it uses a static buffer. */
-gchar*
-e_meeting_time_selector_dump_time (EMeetingTimeSelectorTime *mtstime)
-{
- static gchar buffer[128];
-
- gchar buffer2[128];
-
- g_date_strftime (buffer, 128, "%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];
-
- g_date_strftime (buffer, 128, "%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)
-{
-
-
-}
-
-
-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,
- 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);
- *y += mts->options_button->allocation.height;
-
- /* 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));
-}
-
-
-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,
- 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);
- *y += mts->autopick_button->allocation.height;
-
- /* 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)
-{
- EMeetingTimeSelectorTime start_time, end_time, *resource_free;
- EMeetingTimeSelectorAttendee *attendee;
- EMeetingTimeSelectorPeriod *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 < mts->attendees->len; row++) {
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee,
- row);
-
- /* Skip optional people if they don't matter. */
- if (skip_optional && attendee->type == E_MEETING_TIME_SELECTOR_OPTIONAL_PERSON)
- continue;
-
- period = e_meeting_time_selector_find_time_clash (mts, attendee, &start_time, &end_time);
-
- if (need_one_resource && attendee->type == E_MEETING_TIME_SELECTOR_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_selector_compare_times (resource_free, &period->end) > 0)
- resource_free = &period->end;
- } else {
- if (!resource_free || e_meeting_time_selector_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 GnomeDateEdit widgets. */
- e_meeting_time_selector_update_start_date_edit (mts);
- e_meeting_time_selector_update_end_date_edit (mts);
- 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 (EMeetingTimeSelectorTime *start,
- EMeetingTimeSelectorTime *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,
- EMeetingTimeSelectorTime *start_time,
- EMeetingTimeSelectorTime *end_time,
- gint days, gint hours, gint mins)
-{
- gint minutes_shown;
- gboolean set_to_start_of_working_day = FALSE;
-
- if (mts->zoomed_out) {
- start_time->hour++;
- start_time->minute = 0;
- } else {
- start_time->minute += 30;
- 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);
-
- /* 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,
- EMeetingTimeSelectorTime *start_time,
- EMeetingTimeSelectorTime *end_time,
- gint days, gint hours, gint mins)
-{
- gint new_hour, minutes_shown;
- gboolean set_to_end_of_working_day = FALSE;
-
- 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;
-
- *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 (EMeetingTimeSelectorTime *mtstime,
- gint days, gint hours, gint minutes)
-{
- gint new_hours, new_minutes;
-
- /* We have to handle negative values for hous and minutes here, since
- EMeetingTimeSelectorTime uses 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 EMeetingTimeSelectorPeriod*
-e_meeting_time_selector_find_time_clash (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorAttendee *attendee,
- EMeetingTimeSelectorTime *start_time,
- EMeetingTimeSelectorTime *end_time)
-{
- EMeetingTimeSelectorPeriod *period;
- gint period_num;
-
- period_num = e_meeting_time_selector_find_first_busy_period (mts, 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 < attendee->busy_periods->len) {
- period = &g_array_index (attendee->busy_periods,
- EMeetingTimeSelectorPeriod,
- 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_selector_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_selector_compare_times (&period->end,
- start_time) > 0) {
- return period;
- }
-
- period_num++;
- }
-
- return NULL;
-}
-
-
-/* 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. */
-gint
-e_meeting_time_selector_find_first_busy_period (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorAttendee *attendee,
- GDate *date)
-{
- EMeetingTimeSelectorPeriod *period;
- gint lower, upper, middle = 0, cmp = 0;
- GDate tmp_date;
-
- /* Make sure the busy periods have been sorted. */
- e_meeting_time_selector_attendee_ensure_periods_sorted (mts, attendee);
-
- /* 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, attendee->longest_period_in_days);
-
- /* We want the first busy period which starts on tmp_date. */
- lower = 0;
- upper = attendee->busy_periods->len;
-
- if (upper == 0)
- return -1;
-
- while (lower < upper) {
- middle = (lower + upper) >> 1;
-
- period = &g_array_index (attendee->busy_periods,
- EMeetingTimeSelectorPeriod, 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 (attendee->busy_periods,
- EMeetingTimeSelectorPeriod, 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 (attendee->busy_periods->len <= middle)
- return -1;
- }
-
- return middle;
-}
-
-
-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);
-}
-
-
-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);
-}
-
-
-/* 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,
- EMeetingTimeSelectorTime *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,
- EMeetingTimeSelectorTime *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)
-{
- GDate date;
- gint max_date_width, base_width, max_weekday_width, max_month_width;
- gint weekday, month;
- gchar buffer[128];
- GdkFont *font;
-
- font = GTK_WIDGET (mts)->style->font;
-
- /* Check if we will be able to display the full date strings. */
- mts->date_format = E_MEETING_TIME_SELECTOR_DATE_SHORT;
- g_date_clear (&date, 1);
- g_date_set_dmy (&date, 20, 1, 2000);
-
- /* Calculate the maximum date width we can fit into the display. */
- max_date_width = mts->day_width - 2;
-
- /* First compute the width of the date string without the day or
- month names. */
- g_date_strftime (buffer, 128, ", %d, %Y", &date);
- base_width = gdk_string_width (font, buffer);
-
- /* If that doesn't fit just return. We have to use the short format.
- If that doesn't fit it will just be clipped. */
- if (gdk_string_width (font, buffer) > max_date_width)
- return;
-
- /* Now find the biggest weekday name. We start on any day and just
- go through seven days. */
- max_weekday_width = 0;
- for (weekday = 1; weekday <= 7; weekday++) {
- g_date_strftime (buffer, 128, "%A", &date);
- max_weekday_width = MAX (max_weekday_width,
- gdk_string_width (font, buffer));
- g_date_add_days (&date, 1);
- }
-
- /* Now find the biggest month name. */
- max_month_width = 0;
- for (month = 1; month <= 12; month++) {
- g_date_set_month (&date, month);
- g_date_strftime (buffer, 128, "%B", &date);
- max_month_width = MAX (max_month_width,
- gdk_string_width (font, buffer));
- }
-
- /* See if we can use the full date. */
- if (base_width + max_month_width + max_weekday_width <= max_date_width) {
- mts->date_format = E_MEETING_TIME_SELECTOR_DATE_FULL;
- return;
- }
-
- /* Now try it with abbreviated weekday names. */
- g_date_strftime (buffer, 128, " %x", &date);
- base_width = gdk_string_width (font, buffer);
-
- max_weekday_width = 0;
- for (weekday = 1; weekday <= 7; weekday++) {
- g_date_strftime (buffer, 128, "%a", &date);
- max_weekday_width = MAX (max_weekday_width,
- gdk_string_width (font, buffer));
- g_date_add_days (&date, 1);
- }
-
- if (base_width + max_weekday_width <= max_date_width)
- mts->date_format = E_MEETING_TIME_SELECTOR_DATE_ABBREVIATED_DAY;
-}
-
-
-/* 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;
- EMeetingTimeSelectorTime mtstime;
- time_t newtime;
- struct tm *newtime_tm;
-
- newtime = gnome_date_edit_get_date (GNOME_DATE_EDIT (mts->start_date_edit));
- newtime_tm = localtime (&newtime);
- g_date_clear (&mtstime.date, 1);
- g_date_set_time (&mtstime.date, newtime);
- mtstime.hour = newtime_tm->tm_hour;
- mtstime.minute = newtime_tm->tm_min;
-
- /* If the time hasn't changed, just return. */
- if (e_meeting_time_selector_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);
-}
-
-
-/* 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)
-{
- EMeetingTimeSelectorTime mtstime;
- time_t newtime;
- struct tm *newtime_tm;
-
- newtime = gnome_date_edit_get_date (GNOME_DATE_EDIT (mts->end_date_edit));
- newtime_tm = localtime (&newtime);
- g_date_clear (&mtstime.date, 1);
- g_date_set_time (&mtstime.date, newtime);
- mtstime.hour = newtime_tm->tm_hour;
- mtstime.minute = newtime_tm->tm_min;
-
- /* If the time hasn't changed, just return. */
- if (e_meeting_time_selector_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_selector_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;
- 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);
-}
-
-
-/* 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)
-{
- GnomeDateEdit *start_edit, *end_edit;
- gint low_hour, high_hour;
-
- start_edit = GNOME_DATE_EDIT (mts->start_date_edit);
- end_edit = GNOME_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;
- }
-
- gnome_date_edit_set_popup_range (start_edit, low_hour, high_hour);
- gnome_date_edit_set_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);
-}
-
-
-static void
-e_meeting_time_selector_on_attendees_list_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation,
- EMeetingTimeSelector *mts)
-{
- e_meeting_time_selector_update_attendees_list_scroll_region (mts);
- e_meeting_time_selector_update_attendees_list_positions (mts);
-}
-
-
-/* This updates the list canvas scroll region 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_attendees_list_scroll_region (EMeetingTimeSelector *mts)
-{
- gint height, canvas_width, canvas_height;
-
- height = mts->row_height * mts->attendees->len;
- canvas_width = GTK_WIDGET (mts->attendees_list)->allocation.width;
- canvas_height = GTK_WIDGET (mts->attendees_list)->allocation.height;
-
- height = MAX (height, canvas_height);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS (mts->attendees_list),
- 0, 0,
- canvas_width,
- height);
-}
-
-
-/* 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, list_width;
-
- height = mts->row_height * (mts->attendees->len + 1);
- canvas_height = GTK_WIDGET (mts->display_main)->allocation.height;
- list_width = GTK_WIDGET (mts->attendees_list)->allocation.width;
-
- height = MAX (height, canvas_height);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS (mts->attendees_list),
- 0, 0,
- list_width,
- 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)
-{
- EMeetingTimeSelectorTime 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->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;
- }
- 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->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;
- }
- e_meeting_time_selector_fix_time_overflows (&drag_time);
-
- /* Now make sure we are between first_time & last_time. */
- if (e_meeting_time_selector_compare_times (&drag_time, &first_time) < 0)
- drag_time = first_time;
- if (e_meeting_time_selector_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_selector_compare_times (time_to_set, &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_selector_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);
-}
-
-
-/* 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;
- EMeetingTimeSelectorTime 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->zoomed_out) {
- drag_time.minute = 0;
- } else {
- drag_time.minute -= drag_time.minute % 30;
- }
- } else {
- e_meeting_time_selector_calculate_time (mts, scroll_x,
- &drag_time);
- 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;
- }
- }
- 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_selector_compare_times (time_to_set, &drag_time) == 0) {
- GDK_THREADS_LEAVE ();
- return TRUE;
- }
-
- *time_to_set = drag_time;
-
- /* Check if the start time and end time need to be switched. */
- if (e_meeting_time_selector_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);
-
- /* 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)
-{
- struct tm start_tm;
- time_t start_time_t;
-
- g_date_to_struct_tm (&mts->meeting_start_time.date, &start_tm);
- start_tm.tm_hour = mts->meeting_start_time.hour;
- start_tm.tm_min = mts->meeting_start_time.minute;
- start_time_t = mktime (&start_tm);
- gnome_date_edit_set_time (GNOME_DATE_EDIT (mts->start_date_edit),
- start_time_t);
-}
-
-
-/* This updates the GnomeDateEdit widget displaying the meeting end time. */
-static void
-e_meeting_time_selector_update_end_date_edit (EMeetingTimeSelector *mts)
-{
- struct tm end_tm;
- time_t end_time_t;
-
- g_date_to_struct_tm (&mts->meeting_end_time.date, &end_tm);
- end_tm.tm_hour = mts->meeting_end_time.hour;
- end_tm.tm_min = mts->meeting_end_time.minute;
- end_time_t = mktime (&end_tm);
- gnome_date_edit_set_time (GNOME_DATE_EDIT (mts->end_date_edit),
- end_time_t);
-}
-
-
-/* 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, 60);
-
- 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 (EMeetingTimeSelectorTime *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);
- }
-}
-
-
-static void
-e_meeting_time_selector_update_attendees_list_positions (EMeetingTimeSelector *mts)
-{
- EMeetingTimeSelectorAttendee *attendee;
- gint list_width, item_width;
- gint row;
- GdkFont *font;
-
- list_width = GTK_WIDGET (mts->attendees_list)->allocation.width;
- item_width = MAX (1, list_width - E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH - E_MEETING_TIME_SELECTOR_TEXT_X_PAD * 2);
- font = GTK_WIDGET (mts)->style->font;
- for (row = 0; row < mts->attendees->len; row++) {
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
-
- gnome_canvas_item_set
- (attendee->text_item,
- "font_gdk", font,
- "y", (gdouble) (row * mts->row_height + 1
- + E_MEETING_TIME_SELECTOR_TEXT_Y_PAD),
- "clip_width", (gdouble) item_width,
- "clip_height", (gdouble) (font->ascent
- + font->descent),
- NULL);
-
- gnome_canvas_item_show (attendee->text_item);
- }
-
-}
-
-
-/*
- * 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,
- EMeetingTimeSelectorTime *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 EMeetingTimeSelectorTime 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,
- EMeetingTimeSelectorTime *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 gboolean
-e_meeting_time_selector_on_text_item_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EMeetingTimeSelector *mts)
-{
- EMeetingTimeSelectorAttendee *attendee;
- gint row, min;
- ETextEventProcessor *event_processor = NULL;
- ETextEventProcessorCommand command;
- GtkAdjustment *adj;
- gchar *text;
- gboolean empty = FALSE;
-
- switch (event->type) {
- case GDK_KEY_PRESS:
- if (event && event->key.keyval == GDK_Return) {
- row = e_meeting_time_selector_find_row_from_text_item (mts, item);
- g_return_val_if_fail (row != -1, FALSE);
-
- if (row == mts->attendees->len - 1)
- row = e_meeting_time_selector_attendee_add (mts, "", NULL);
- else
- row++;
-
- /* Make sure the item is visible. */
- adj = GTK_LAYOUT (mts->display_main)->vadjustment;
- min = ((row + 1) * mts->row_height) - adj->page_size;
- if (adj->value < min) {
- adj->value = min;
- gtk_adjustment_value_changed (adj);
- }
-
- attendee = &g_array_index (mts->attendees, EMeetingTimeSelectorAttendee, row);
- e_canvas_item_grab_focus (attendee->text_item);
-
- /* Try to move the cursor to the end of the text. */
- gtk_object_get (GTK_OBJECT (attendee->text_item),
- "event_processor", &event_processor,
- NULL);
- if (event_processor) {
- command.action = E_TEP_MOVE;
- command.position = E_TEP_END_OF_BUFFER;
- gtk_signal_emit_by_name (GTK_OBJECT (event_processor),
- "command", &command);
- }
-
- /* 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;
- }
- break;
- case GDK_FOCUS_CHANGE:
- if (!event->focus_change.in) {
- gtk_object_get (GTK_OBJECT (item),
- "text", &text,
- NULL);
- if (!text || !text[0])
- empty = TRUE;
- g_free (text);
-
- if (empty) {
- row = e_meeting_time_selector_find_row_from_text_item (mts, item);
- g_return_val_if_fail (row != -1, FALSE);
- e_meeting_time_selector_attendee_remove (mts,
- row);
- }
- }
- break;
- default:
- break;
- }
-
- return FALSE;
-}
-
-
-static gint
-e_meeting_time_selector_find_row_from_text_item (EMeetingTimeSelector *mts,
- GnomeCanvasItem *item)
-{
- EMeetingTimeSelectorAttendee *attendee;
- gint row;
-
- for (row = 0; row < mts->attendees->len; row++) {
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
- if (attendee->text_item == item)
- return row;
- }
-
- return -1;
-}
-
diff --git a/widgets/meeting-time-sel/e-meeting-time-sel.h b/widgets/meeting-time-sel/e-meeting-time-sel.h
deleted file mode 100644
index a2ad4b9cd5..0000000000
--- a/widgets/meeting-time-sel/e-meeting-time-sel.h
+++ /dev/null
@@ -1,518 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@gtk.org>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_MEETING_TIME_SELECTOR_H_
-#define _E_MEETING_TIME_SELECTOR_H_
-
-#include <gtk/gtktable.h>
-#include <libgnomeui/gnome-canvas.h>
-#include "../e-text/e-text.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * 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
-
-/* 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_TIME_SELECTOR_REQUIRED_PERSON. */
-typedef enum
-{
- E_MEETING_TIME_SELECTOR_REQUIRED_PERSON,
- E_MEETING_TIME_SELECTOR_OPTIONAL_PERSON,
- E_MEETING_TIME_SELECTOR_RESOURCE
-} EMeetingTimeSelectorAttendeeType;
-
-
-/* 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_TIME_SELECTOR_BUSY_TENTATIVE = 0,
- E_MEETING_TIME_SELECTOR_BUSY_OUT_OF_OFFICE = 1,
- E_MEETING_TIME_SELECTOR_BUSY_BUSY = 2,
-
- E_MEETING_TIME_SELECTOR_BUSY_LAST = 3
-} EMeetingTimeSelectorBusyType;
-
-
-/* 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;
-
-
-/* This is our representation of a time. We use a GDate to store the day,
- and guint8s for the hours and minutes. */
-typedef struct _EMeetingTimeSelectorTime EMeetingTimeSelectorTime;
-struct _EMeetingTimeSelectorTime
-{
- GDate date;
- guint8 hour;
- guint8 minute;
-};
-
-
-/* This represents a busy period. */
-typedef struct _EMeetingTimeSelectorPeriod EMeetingTimeSelectorPeriod;
-struct _EMeetingTimeSelectorPeriod
-{
- EMeetingTimeSelectorTime start;
- EMeetingTimeSelectorTime end;
- EMeetingTimeSelectorBusyType busy_type;
-};
-
-
-/* This contains information on one attendee. */
-typedef struct _EMeetingTimeSelectorAttendee EMeetingTimeSelectorAttendee;
-struct _EMeetingTimeSelectorAttendee
-{
- gchar *name;
-
- /* The type of attendee, e.g. a person or a resource. */
- EMeetingTimeSelectorAttendeeType type;
-
- /* This is TRUE if the attendee has calendar information available.
- It is set to TRUE when a busy period is added, but can also be set
- to TRUE explicitly to indicate that the attendee has calendar
- information available, but no current busy periods. If it is FALSE
- then a diagonal stipple pattern is used to fill the entire row in
- the main graphical display. */
- gboolean has_calendar_info;
-
- /* This is TRUE if the meeting request is sent to this attendee. */
- gboolean send_meeting_to;
-
- /* This is the period for which free/busy data for the attendee is
- available. */
- EMeetingTimeSelectorTime busy_periods_start;
- EMeetingTimeSelectorTime busy_periods_end;
-
- /* This is an array of EMeetingTimeSelectorPeriod elements. When it is
- updated busy_periods_sorted is set to FALSE, and if a function
- needs them sorted, it should call this to re-sort them if needed:
- e_meeting_time_selector_attendee_ensure_periods_sorted(). Note that
- they are sorted by the start times. */
- GArray *busy_periods;
- gboolean busy_periods_sorted;
-
- /* This holds the length of the longest busy period in days, rounded
- up. It is used to determine where to start looking in the
- busy_periods array. If we didn't use this we'd have to go through
- most of the busy_periods array every time we wanted to paint part
- of the display. */
- gint longest_period_in_days;
-
- /* This is the canvas text item where the name is edited. */
- GnomeCanvasItem *text_item;
-
- /* This is supposed to be something like an address book id. */
- gpointer data;
-};
-
-/* An array of hour strings, "0:00" .. "23:00". */
-extern const gchar *EMeetingTimeSelectorHours[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_title_bar_vbox;
-
- /* The 'All Attendees' title bar above the list of attendees. */
- GtkWidget *attendees_title_bar;
-
- /* The list of attendees. */
- GtkWidget *attendees_list;
-
- /* 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;
-
- /* This is the 'Options' button & menu. */
- GtkWidget *options_button;
- GtkWidget *options_menu;
-
- /* This is the 'Autopick' button, menu & radio menu items. */
- GtkWidget *autopick_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 GnomeDateEdit widgets for the meeting start & end times. */
- GtkWidget *start_date_edit;
- GtkWidget *end_date_edit;
-
- /* Colors. */
- GdkColorContext *color_context;
- 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_TIME_SELECTOR_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;
-
-
- /*
- * Attendee Data.
- */
-
- /* This is an array of EMeetingTimeSelectorAttendee elements. */
- GArray *attendees;
-
-
- /*
- * Option Settings.
- */
-
- /* 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. */
- EMeetingTimeSelectorTime meeting_start_time;
- EMeetingTimeSelectorTime 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;
-};
-
-
-struct _EMeetingTimeSelectorClass
-{
- GtkTableClass parent_class;
-};
-
-
-/*
- * 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 (void);
-
-/* 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_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);
-
-/* Adds an attendee to the list, returning the row. The data is meant for
- something like an address book id, though if the user edits the name this
- will become invalid. We'll probably have to handle address book lookup
- ourself. */
-gint e_meeting_time_selector_attendee_add (EMeetingTimeSelector *mts,
- gchar *attendee_name,
- gpointer data);
-gint e_meeting_time_selector_attendee_find_by_name (EMeetingTimeSelector *mts,
- gchar *attendee_name,
- gint start_row);
-gint e_meeting_time_selector_attendee_find_by_data (EMeetingTimeSelector *mts,
- gpointer data,
- gint start_row);
-void e_meeting_time_selector_attendee_remove (EMeetingTimeSelector *mts,
- gint row);
-
-void e_meeting_time_selector_attendee_set_type (EMeetingTimeSelector *mts,
- gint row,
- EMeetingTimeSelectorAttendeeType type);
-void e_meeting_time_selector_attendee_set_has_calendar_info (EMeetingTimeSelector *mts,
- gint row,
- gboolean has_calendar_info);
-void e_meeting_time_selector_attendee_set_send_meeting_to (EMeetingTimeSelector *mts,
- gint row,
- gboolean send_meeting_to);
-
-gboolean e_meeting_time_selector_attendee_set_busy_range (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);
-
-
-/* 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,
- EMeetingTimeSelectorBusyType 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 (EMeetingTimeSelectorTime *mtstime);
-
-gint e_meeting_time_selector_find_first_busy_period (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorAttendee *attendee,
- GDate *date);
-
-/* Makes sure the busy periods are sorted, so we can do binary searches. */
-void e_meeting_time_selector_attendee_ensure_periods_sorted (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorAttendee *attendee);
-
-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,
- EMeetingTimeSelectorTime *time);
-gint e_meeting_time_selector_calculate_time_position (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorTime *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 (EMeetingTimeSelectorTime *mtstime);
-gchar* e_meeting_time_selector_dump_date (GDate *date);
-#endif /* E_MEETING_TIME_SELECTOR_DEBUG */
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_MEETING_TIME_SELECTOR_H_ */
diff --git a/widgets/meeting-time-sel/test-meeting-time-sel.c b/widgets/meeting-time-sel/test-meeting-time-sel.c
deleted file mode 100644
index 33c15ff19b..0000000000
--- a/widgets/meeting-time-sel/test-meeting-time-sel.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@gtk.org>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-#include <config.h>
-#include <gnome.h>
-#include "e-meeting-time-sel.h"
-
-void add_random_attendee_test_data (EMeetingTimeSelector *mts);
-void add_simple_attendee_test_data (EMeetingTimeSelector *mts);
-gint get_random_int (gint max);
-
-int
-main (int argc, char *argv[])
-{
- GtkWidget *window, *mts;
- gint i;
-
- gnome_init ("test-meeting-time-selector", "0.1", argc, argv);
-
- gtk_widget_push_visual (gdk_imlib_get_visual ());
- gtk_widget_push_colormap (gdk_imlib_get_colormap ());
-
- window = gnome_dialog_new ("Plan a Meeting", "Make Meeting",
- GNOME_STOCK_BUTTON_CLOSE, NULL);
- gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
- gtk_window_set_policy (GTK_WINDOW (window), FALSE, TRUE, FALSE);
-
- mts = e_meeting_time_selector_new ();
- gtk_container_add (GTK_CONTAINER (GNOME_DIALOG (window)->vbox), mts);
- gtk_window_add_accel_group (GTK_WINDOW (window),
- E_MEETING_TIME_SELECTOR (mts)->accel_group);
- gtk_widget_show (mts);
-
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
-
- i = 0;
-#if 1
- for (i = 0; i < 20; i++) {
- add_random_attendee_test_data (E_MEETING_TIME_SELECTOR (mts));
- }
-
- if (!e_meeting_time_selector_attendee_set_busy_range (E_MEETING_TIME_SELECTOR (mts), 3,
- 2000, 5, 1, 14, 0,
- 2000, 11, 1, 11, 30))
- g_print ("Error setting busy range\n");
-
-#else
- for (i = 0; i < 1; i++) {
- add_simple_attendee_test_data (E_MEETING_TIME_SELECTOR (mts));
- }
-#endif
-
-#if 0
- e_meeting_time_selector_dump (E_MEETING_TIME_SELECTOR (mts));
-#endif
-
- gnome_dialog_run (GNOME_DIALOG (window));
-
- gtk_main ();
- return 0;
-}
-
-
-/* Adds an attendee and a lot of random busy periods. The periods start 60
- days before the current date and extend over 365 days, to match the range
- that EMeetingTimeSelector currently displays. We generate a time_t and an
- interval and then convert them into a struct tm which provides everything
- we need. */
-void
-add_random_attendee_test_data (EMeetingTimeSelector *mts)
-{
- gchar buffer[128], *name;
- gint row, num_periods, busy_period, random_num, duration;
- EMeetingTimeSelectorAttendeeType type;
- EMeetingTimeSelectorBusyType busy_type;
- time_t range_start;
- time_t period_start;
- time_t period_end;
- struct tm *tmp_tm;
- struct tm tm1;
- struct tm tm2;
-
- /* Determine the type of attendee. */
- random_num = get_random_int (10);
- if (random_num < 4) {
- type = E_MEETING_TIME_SELECTOR_REQUIRED_PERSON;
- name = "Req. Attendee";
- } else if (random_num < 7) {
- type = E_MEETING_TIME_SELECTOR_OPTIONAL_PERSON;
- name = "Opt. Attendee";
- } else {
- type = E_MEETING_TIME_SELECTOR_RESOURCE;
- name = "Resource";
- }
-
- sprintf (buffer, "%s %i", name, mts->attendees->len + 1);
- row = e_meeting_time_selector_attendee_add (mts, buffer, NULL);
- e_meeting_time_selector_attendee_set_type (mts, row, type);
-
- /* Don't send the meeting request to some attendees. */
- if (get_random_int (10) <= 2)
- e_meeting_time_selector_attendee_set_send_meeting_to (mts, row,
- FALSE);
-
- /* Some attendees have no calendar information. */
- if (get_random_int (10) == 2)
- return;
-
- range_start = time (NULL) - 61 * 24 * 60 * 60;
- num_periods = get_random_int (1000);
-#if 0
- g_print ("num_periods: %i\n", num_periods);
-#endif
- for (busy_period = 0; busy_period < num_periods; busy_period++) {
-
- period_start = range_start + get_random_int (365 * 24 * 60 * 60);
-
- /* Make busy periods mainly 30 mins to a few hours, with a
- couple of week/fortnight periods as well. */
- random_num = get_random_int (10000);
- if (random_num < 2000)
- duration = 30;
- else if (random_num < 5000)
- duration = 60;
- else if (random_num < 7500)
- duration = 90;
- else if (random_num < 9995)
- duration = 120;
- else if (random_num < 9998)
- duration = 60 * 24 * 7;
- else
- duration = 60 * 24 * 14;
-#if 0
- g_print ("random_num: %i, duration: %i\n",
- random_num, duration);
-#endif
- period_end = period_start + duration * 60;
-
- tmp_tm = localtime (&period_start);
- tm1 = *tmp_tm;
- tmp_tm = localtime (&period_end);
- tm2 = *tmp_tm;
-
- /* A hack to avoid daylight-saving time problems. */
- if (tm2.tm_hour == tm1.tm_hour && tm2.tm_min < tm1.tm_min)
- tm2.tm_hour++;
-
- busy_type = get_random_int (E_MEETING_TIME_SELECTOR_BUSY_LAST);
-
- if (!e_meeting_time_selector_attendee_add_busy_period (mts, row, tm1.tm_year + 1900, tm1.tm_mon + 1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, tm2.tm_year + 1900, tm2.tm_mon + 1, tm2.tm_mday, tm2.tm_hour, tm2.tm_min, busy_type))
- {
- g_print ("Invalid busy period %i/%i/%i %i:%i to %i/%i/%i %i:%i\n", tm1.tm_year + 1900, tm1.tm_mon + 1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, tm2.tm_year + 1900, tm2.tm_mon + 1, tm2.tm_mday, tm2.tm_hour, tm2.tm_min);
- g_print ("random_num: %i, duration: %i\n",
- random_num, duration);
- }
- }
-}
-
-
-/* Returns a random integer between 0 and max - 1. */
-gint
-get_random_int (gint max)
-{
- gint random_num;
-
- random_num = (int) (max * (rand () / (RAND_MAX + 1.0)));
-#if 0
- g_print ("Random num (%i): %i\n", max, random_num);
-#endif
- return random_num;
-}
-
-
-void
-add_simple_attendee_test_data (EMeetingTimeSelector *mts)
-{
- gint row;
-
- row = e_meeting_time_selector_attendee_add (mts, "John Smith", NULL);
- if (!e_meeting_time_selector_attendee_add_busy_period (mts, row,
- 1999, 11, 7, 14, 30,
- 1999, 11, 7, 16, 30,
- E_MEETING_TIME_SELECTOR_BUSY_BUSY))
- g_warning ("Invalid busy period");
-
- e_meeting_time_selector_attendee_add_busy_period (mts, row,
- 1999, 11, 7, 10, 30,
- 1999, 11, 7, 11, 30,
- E_MEETING_TIME_SELECTOR_BUSY_OUT_OF_OFFICE);
- e_meeting_time_selector_attendee_add_busy_period (mts, row,
- 1999, 11, 4, 10, 30,
- 1999, 11, 7, 11, 30,
- E_MEETING_TIME_SELECTOR_BUSY_BUSY);
- row = e_meeting_time_selector_attendee_add (mts, "Dave Jones", NULL);
- e_meeting_time_selector_attendee_add_busy_period (mts, row,
- 1999, 11, 7, 15, 30,
- 1999, 11, 7, 18, 30,
- E_MEETING_TIME_SELECTOR_BUSY_TENTATIVE);
- e_meeting_time_selector_attendee_add_busy_period (mts, row,
- 1999, 11, 7, 11, 00,
- 1999, 11, 7, 12, 00,
- E_MEETING_TIME_SELECTOR_BUSY_BUSY);
-
- row = e_meeting_time_selector_attendee_add (mts, "Andrew Carlisle", NULL);
- e_meeting_time_selector_attendee_set_send_meeting_to (mts, row, FALSE);
-
- row = e_meeting_time_selector_attendee_add (mts, "Michael Cain", NULL);
- e_meeting_time_selector_attendee_add_busy_period (mts, row,
- 1999, 11, 7, 15, 30,
- 1999, 11, 7, 18, 30,
- E_MEETING_TIME_SELECTOR_BUSY_TENTATIVE);
- e_meeting_time_selector_attendee_add_busy_period (mts, row,
- 1999, 11, 7, 12, 30,
- 1999, 11, 7, 13, 30,
- E_MEETING_TIME_SELECTOR_BUSY_OUT_OF_OFFICE);
- e_meeting_time_selector_attendee_add_busy_period (mts, row,
- 1999, 11, 7, 11, 00,
- 1999, 11, 7, 12, 00,
- E_MEETING_TIME_SELECTOR_BUSY_TENTATIVE);
-}
diff --git a/widgets/misc/.cvsignore b/widgets/misc/.cvsignore
deleted file mode 100644
index 411f0fc219..0000000000
--- a/widgets/misc/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-test-title-bar
-test-calendar
diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog
deleted file mode 100644
index 279e7fc9bc..0000000000
--- a/widgets/misc/ChangeLog
+++ /dev/null
@@ -1,50 +0,0 @@
-2000-08-10 Christopher James Lahey <clahey@helixcode.com>
-
- * e-calendar-item.c, e-calendar.c: Fixed some warnings.
-
-2000-07-25 Damon Chaplin <damon@helixcode.com>
-
- * e-calendar-item.h:
- * e-calendar.[hc]: new widget and canvas item to replace GtkCalendar.
- Not quite finished yet.
-
-2000-07-21 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-title-bar.c (e_title_bar_set_title): We have a `EClippedLabel',
- not a `GtkLabel' here: use the right function to change the text.
-
-2000-07-12 Christopher James Lahey <clahey@helixcode.com>
-
- * e-scroll-frame.c: Tried rearranging the casts to try for a more
- correct computation.
-
-2000-07-08 Dan Winship <danw@helixcode.com>
-
- * e-scroll-frame.c (e_scroll_frame_add): comment out true but
- confused warning about non-scrollable widgets until Chris and/or
- Federico fix this correctly.
- (e_scroll_frame_size_allocate): If the available space for the
- child is less than the width/height of the frame, give the child
- an allocation of 0 rather than some small negative number cast to
- unsigned.
-
-2000-07-05 Dan Winship <danw@helixcode.com>
-
- * Makefile.am (INCLUDES): Set G_LOG_DOMAIN=__FILE__ rather than
- "e-title-bar" in all three widgets.
-
-2000-06-13 Anders Carlsson <andersca@gnu.org>
-
- * e-scroll-frame.c (e_scroll_frame_button_press): Control does
- horizontal scrolling, a la gimp.
-
-2000-06-11 Anders Carlsson <andersca@gnu.org>
-
- * e-scroll-frame.c (e_scroll_frame_button_press): Add support
- for mouse wheel scrolling in EScrollFrame.
-
-2000-06-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-title-bar.c (close_button_realize_cb): Unref the pixmap and
- the mask.
-
diff --git a/widgets/misc/Makefile.am b/widgets/misc/Makefile.am
deleted file mode 100644
index e2872e7006..0000000000
--- a/widgets/misc/Makefile.am
+++ /dev/null
@@ -1,42 +0,0 @@
-# FIXME we use the EClippedLabel widget from EShortcutBar. Probably
-# it should be moved somewhere else.
-
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_srcdir)/widgets/shortcut-bar \
- $(EXTRA_GNOME_CFLAGS) \
- -DG_LOG_DOMAIN=__FILE__
-
-noinst_LIBRARIES = \
- libemiscwidgets.a
-
-libemiscwidgets_a_SOURCES = \
- e-calendar.c \
- e-calendar.h \
- e-calendar-item.c \
- e-calendar-item.h \
- e-clipped-label.c \
- e-clipped-label.h \
- e-scroll-frame.c \
- e-scroll-frame.h \
- e-title-bar.c \
- e-title-bar.h
-
-noinst_PROGRAMS = \
- test-title-bar \
- test-calendar
-
-test_title_bar_SOURCES = \
- test-title-bar.c
-
-test_title_bar_LDADD = \
- ./libemiscwidgets.a \
- $(EXTRA_GNOME_LIBS)
-
-test_calendar_SOURCES = \
- test-calendar.c
-
-test_calendar_LDADD = \
- ./libemiscwidgets.a \
- ../../e-util/libeutil.la \
- $(EXTRA_GNOME_LIBS)
diff --git a/widgets/misc/e-calendar-item.c b/widgets/misc/e-calendar-item.c
deleted file mode 100644
index e51754d786..0000000000
--- a/widgets/misc/e-calendar-item.c
+++ /dev/null
@@ -1,1615 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * ECalendarItem - canvas item displaying a calendar.
- */
-
-#include <config.h>
-#include <time.h>
-#include <glib.h>
-#include <libgnome/gnome-defs.h>
-#include <libgnome/gnome-i18n.h>
-#include <e-util/e-util.h>
-#include "e-calendar-item.h"
-
-
-/* The minimum padding around the numbers in each cell/day. */
-#define E_CALENDAR_ITEM_MIN_CELL_XPAD 4
-#define E_CALENDAR_ITEM_MIN_CELL_YPAD 0
-
-
-/* These are the padding sizes between various pieces of the calendar. */
-/* FIXME: Use decent names eventually. */
-#define E_CALENDAR_ITEM_XPAD1 4
-#define E_CALENDAR_ITEM_XPAD2 2
-#define E_CALENDAR_ITEM_XPAD3 2
-#define E_CALENDAR_ITEM_XPAD4 4
-
-#define E_CALENDAR_ITEM_YPAD3 1
-#define E_CALENDAR_ITEM_YPAD4 0
-#define E_CALENDAR_ITEM_YPAD5 1
-#define E_CALENDAR_ITEM_YPAD6 2
-
-#define E_CALENDAR_ITEM_XPAD11 16
-#define E_CALENDAR_ITEM_XPAD12 2
-#define E_CALENDAR_ITEM_XPAD13 1
-#define E_CALENDAR_ITEM_XPAD14 1
-#define E_CALENDAR_ITEM_XPAD15 2
-#define E_CALENDAR_ITEM_XPAD16 16
-
-/* The number of rows & columns of days in each month. */
-#define E_CALENDAR_ROWS_PER_MONTH 6
-#define E_CALENDAR_COLS_PER_MONTH 7
-
-
-static void e_calendar_item_class_init (ECalendarItemClass *class);
-static void e_calendar_item_init (ECalendarItem *calitem);
-
-static void e_calendar_item_get_arg (GtkObject *o,
- GtkArg *arg,
- guint arg_id);
-static void e_calendar_item_set_arg (GtkObject *o,
- GtkArg *arg,
- guint arg_id);
-static void e_calendar_item_realize (GnomeCanvasItem *item);
-static void e_calendar_item_unrealize (GnomeCanvasItem *item);
-static void e_calendar_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags);
-static void e_calendar_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height);
-static void e_calendar_item_draw_month (ECalendarItem *calitem,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height,
- int row,
- int col);
-static void e_calendar_item_draw_day_numbers (ECalendarItem *calitem,
- GdkDrawable *drawable,
- int width,
- int height,
- int row,
- int col,
- int year,
- int month,
- int start_weekday,
- gint cells_x,
- gint cells_y);
-static double e_calendar_item_point (GnomeCanvasItem *item,
- double x,
- double y,
- int cx,
- int cy,
- GnomeCanvasItem **actual_item);
-static gint e_calendar_item_event (GnomeCanvasItem *item,
- GdkEvent *event);
-static gboolean e_calendar_item_button_press (ECalendarItem *calitem,
- GdkEvent *event);
-static gboolean e_calendar_item_button_release (ECalendarItem *calitem,
- GdkEvent *event);
-static gboolean e_calendar_item_motion (ECalendarItem *calitem,
- GdkEvent *event);
-
-static gboolean e_calendar_item_convert_position_to_day (ECalendarItem *calitem,
- gint x,
- gint y,
- gint *month,
- gint *day,
- gboolean *entire_week);
-static void e_calendar_item_get_month_info (ECalendarItem *calitem,
- gint row,
- gint col,
- gint *first_valid_day,
- gint *last_valid_day);
-static void e_calendar_item_recalc_sizes(ECalendarItem *calitem);
-
-static gint e_calendar_item_get_week_number (ECalendarItem *calitem,
- gint day,
- gint month,
- gint year);
-
-static void e_calendar_item_get_day_style (ECalendarItem *calitem,
- gint year,
- gint month,
- gint day,
- gboolean today,
- gboolean current_month,
- gboolean selected,
- GdkColor **bg_color,
- GdkColor **fg_color,
- GdkColor **box_color,
- gboolean *bold);
-
-static GnomeCanvasItemClass *parent_class;
-
-/* Our arguments. */
-enum {
- ARG_0,
- ARG_YEAR,
- ARG_MONTH,
- ARG_X1,
- ARG_Y1,
- ARG_X2,
- ARG_Y2,
- ARG_FONT,
- ARG_WEEK_NUMBER_FONT,
- ARG_ROW_HEIGHT,
- ARG_COLUMN_WIDTH,
- ARG_MINIMUM_ROWS,
- ARG_MINIMUM_COLUMNS,
- ARG_MAXIMUM_ROWS,
- ARG_MAXIMUM_COLUMNS,
- ARG_WEEK_START_DAY,
- ARG_SHOW_WEEK_NUMBERS
-};
-
-
-E_MAKE_TYPE (e_calendar_item, "ECalendarItem", ECalendarItem,
- e_calendar_item_class_init, e_calendar_item_init,
- GNOME_TYPE_CANVAS_ITEM)
-
-
-static void
-e_calendar_item_class_init (ECalendarItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type());
-
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- gtk_object_add_arg_type ("ECalendarItem::year",
- GTK_TYPE_INT, GTK_ARG_READWRITE,
- ARG_YEAR);
- gtk_object_add_arg_type ("ECalendarItem::month",
- GTK_TYPE_INT, GTK_ARG_READWRITE,
- ARG_MONTH);
- gtk_object_add_arg_type ("ECalendarItem::x1",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE,
- ARG_X1);
- gtk_object_add_arg_type ("ECalendarItem::y1",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE,
- ARG_Y1);
- gtk_object_add_arg_type ("ECalendarItem::x2",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE,
- ARG_X2);
- gtk_object_add_arg_type ("ECalendarItem::y2",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE,
- ARG_Y2);
- gtk_object_add_arg_type ("ECalendarItem::font",
- GTK_TYPE_GDK_FONT, GTK_ARG_READWRITE,
- ARG_FONT);
- gtk_object_add_arg_type ("ECalendarItem::week_number_font",
- GTK_TYPE_GDK_FONT, GTK_ARG_READWRITE,
- ARG_WEEK_NUMBER_FONT);
- gtk_object_add_arg_type ("ECalendarItem::row_height",
- GTK_TYPE_DOUBLE, GTK_ARG_READABLE,
- ARG_ROW_HEIGHT);
- gtk_object_add_arg_type ("ECalendarItem::column_width",
- GTK_TYPE_DOUBLE, GTK_ARG_READABLE,
- ARG_COLUMN_WIDTH);
- gtk_object_add_arg_type ("ECalendarItem::mininum_rows",
- GTK_TYPE_INT, GTK_ARG_READWRITE,
- ARG_MINIMUM_ROWS);
- gtk_object_add_arg_type ("ECalendarItem::minimum_columns",
- GTK_TYPE_INT, GTK_ARG_READWRITE,
- ARG_MINIMUM_COLUMNS);
- gtk_object_add_arg_type ("ECalendarItem::maximum_rows",
- GTK_TYPE_INT, GTK_ARG_READWRITE,
- ARG_MAXIMUM_ROWS);
- gtk_object_add_arg_type ("ECalendarItem::maximum_columns",
- GTK_TYPE_INT, GTK_ARG_READWRITE,
- ARG_MAXIMUM_COLUMNS);
- gtk_object_add_arg_type ("ECalendarItem::week_start_day",
- GTK_TYPE_INT, GTK_ARG_READWRITE,
- ARG_WEEK_START_DAY);
- gtk_object_add_arg_type ("ECalendarItem::show_week_numbers",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE,
- ARG_SHOW_WEEK_NUMBERS);
-
- object_class->get_arg = e_calendar_item_get_arg;
- object_class->set_arg = e_calendar_item_set_arg;
-
- /* GnomeCanvasItem method overrides */
- item_class->realize = e_calendar_item_realize;
- item_class->unrealize = e_calendar_item_unrealize;
- item_class->update = e_calendar_item_update;
- item_class->draw = e_calendar_item_draw;
- item_class->point = e_calendar_item_point;
- item_class->event = e_calendar_item_event;
-}
-
-
-static void
-e_calendar_item_init (ECalendarItem *calitem)
-{
- struct tm *tmp_tm;
- time_t t;
-
- /* Set the default time to the current month. */
- t = time (NULL);
- tmp_tm = localtime (&t);
- calitem->year = tmp_tm->tm_year + 1900;
- calitem->month = tmp_tm->tm_mon;
-
- calitem->min_cols = 1;
- calitem->min_rows = 1;
- calitem->show_week_numbers = FALSE;
- calitem->week_start_day = 0;
- calitem->expand = TRUE;
-
- calitem->x1 = 0.0;
- calitem->y1 = 0.0;
- calitem->x2 = 0.0;
- calitem->y2 = 0.0;
-
- calitem->selection_start_month_offset = -1;
-
- /* Translators: These are the first characters of each day of the
- week, 'M' for 'Monday', 'T' for Tuesday etc. */
- calitem->days = _("MTWTFSS");
-}
-
-
-static void
-e_calendar_item_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ECalendarItem *calitem;
-
- item = GNOME_CANVAS_ITEM (o);
- calitem = E_CALENDAR_ITEM (o);
-
- switch (arg_id) {
- case ARG_YEAR:
- GTK_VALUE_INT (*arg) = calitem->year;
- break;
- case ARG_MONTH:
- GTK_VALUE_INT (*arg) = calitem->month;
- break;
- case ARG_X1:
- GTK_VALUE_DOUBLE (*arg) = calitem->x1;
- break;
- case ARG_Y1:
- GTK_VALUE_DOUBLE (*arg) = calitem->y1;
- break;
- case ARG_X2:
- GTK_VALUE_DOUBLE (*arg) = calitem->x2;
- break;
- case ARG_Y2:
- GTK_VALUE_DOUBLE (*arg) = calitem->y2;
- break;
- case ARG_FONT:
- GTK_VALUE_BOXED (*arg) = calitem->font;
- break;
- case ARG_WEEK_NUMBER_FONT:
- GTK_VALUE_BOXED (*arg) = calitem->week_number_font;
- break;
- case ARG_ROW_HEIGHT:
- e_calendar_item_recalc_sizes (calitem);
- GTK_VALUE_DOUBLE (*arg) = calitem->min_month_height;
- break;
- case ARG_COLUMN_WIDTH:
- e_calendar_item_recalc_sizes (calitem);
- GTK_VALUE_DOUBLE (*arg) = calitem->min_month_width;
- break;
- case ARG_MINIMUM_ROWS:
- GTK_VALUE_INT (*arg) = calitem->min_rows;
- break;
- case ARG_MINIMUM_COLUMNS:
- GTK_VALUE_INT (*arg) = calitem->min_cols;
- break;
- case ARG_MAXIMUM_ROWS:
- GTK_VALUE_INT (*arg) = calitem->max_rows;
- break;
- case ARG_MAXIMUM_COLUMNS:
- GTK_VALUE_INT (*arg) = calitem->max_cols;
- break;
- case ARG_WEEK_START_DAY:
- GTK_VALUE_INT (*arg) = calitem->week_start_day;
- break;
- case ARG_SHOW_WEEK_NUMBERS:
- GTK_VALUE_BOOL (*arg) = calitem->show_week_numbers;
- break;
- }
-}
-
-
-static void
-e_calendar_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ECalendarItem *calitem;
- GdkFont *font;
- gboolean need_reshape = FALSE;
- gdouble dvalue;
- gint ivalue;
- gboolean bvalue;
-
- item = GNOME_CANVAS_ITEM (o);
- calitem = E_CALENDAR_ITEM (o);
-
- switch (arg_id){
- case ARG_YEAR:
- ivalue = GTK_VALUE_INT (*arg);
- if (calitem->year != ivalue) {
- calitem->year = ivalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_MONTH:
- ivalue = GTK_VALUE_INT (*arg);
- if (calitem->month != ivalue) {
- calitem->month = ivalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_X1:
- dvalue = GTK_VALUE_DOUBLE (*arg);
- if (calitem->x1 != dvalue) {
- calitem->x1 = dvalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_Y1:
- dvalue = GTK_VALUE_DOUBLE (*arg);
- if (calitem->y1 != dvalue) {
- calitem->y1 = dvalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_X2:
- dvalue = GTK_VALUE_DOUBLE (*arg);
- if (calitem->x2 != dvalue) {
- calitem->x2 = dvalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_Y2:
- dvalue = GTK_VALUE_DOUBLE (*arg);
- if (calitem->y2 != dvalue) {
- calitem->y2 = dvalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_FONT:
- font = GTK_VALUE_BOXED (*arg);
- if (calitem->font != font) {
- if (calitem->font)
- gdk_font_unref (calitem->font);
- calitem->font = font;
- if (font)
- gdk_font_ref (font);
- need_reshape = TRUE;
- }
- break;
- case ARG_WEEK_NUMBER_FONT:
- font = GTK_VALUE_BOXED (*arg);
- if (calitem->week_number_font != font) {
- if (calitem->week_number_font)
- gdk_font_unref (calitem->week_number_font);
- calitem->week_number_font = font;
- if (font)
- gdk_font_ref (font);
- need_reshape = TRUE;
- }
- break;
- case ARG_MINIMUM_ROWS:
- ivalue = GTK_VALUE_INT (*arg);
- ivalue = MAX (1, ivalue);
- if (calitem->min_rows != ivalue) {
- calitem->min_rows = ivalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_MINIMUM_COLUMNS:
- ivalue = GTK_VALUE_INT (*arg);
- ivalue = MAX (1, ivalue);
- if (calitem->min_cols != ivalue) {
- calitem->min_cols = ivalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_MAXIMUM_ROWS:
- ivalue = GTK_VALUE_INT (*arg);
- if (calitem->max_rows != ivalue) {
- calitem->max_rows = ivalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_MAXIMUM_COLUMNS:
- ivalue = GTK_VALUE_INT (*arg);
- if (calitem->max_cols != ivalue) {
- calitem->max_cols = ivalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_WEEK_START_DAY:
- ivalue = GTK_VALUE_INT (*arg);
- if (calitem->week_start_day != ivalue) {
- calitem->week_start_day = ivalue;
- need_reshape = TRUE;
- }
- break;
- case ARG_SHOW_WEEK_NUMBERS:
- bvalue = GTK_VALUE_BOOL (*arg);
- if (calitem->show_week_numbers != bvalue) {
- calitem->show_week_numbers = bvalue;
- need_reshape = TRUE;
- }
- break;
- default:
- g_warning ("Invalid arg");
- }
-
- /* FIXME: finish. */
- if (need_reshape) {
- gnome_canvas_item_request_update (item);
- }
-}
-
-
-static void
-e_calendar_item_realize (GnomeCanvasItem *item)
-{
- ECalendarItem *calitem;
- GdkColormap *colormap;
- gboolean success[E_CALENDAR_COLOR_LAST];
- gint nfailed;
-
- calitem = E_CALENDAR_ITEM (item);
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (item->canvas));
-
- calitem->colors[E_CALENDAR_COLOR_SELECTION].red = 65535;
- calitem->colors[E_CALENDAR_COLOR_SELECTION].green = 65535;
- calitem->colors[E_CALENDAR_COLOR_SELECTION].blue = 65535;
-
- calitem->colors[E_CALENDAR_COLOR_HIGHLIGHT].red = 56000;
- calitem->colors[E_CALENDAR_COLOR_HIGHLIGHT].green = 57000;
- calitem->colors[E_CALENDAR_COLOR_HIGHLIGHT].blue = 57000;
-
- calitem->colors[E_CALENDAR_COLOR_TODAY].red = 65535;
- calitem->colors[E_CALENDAR_COLOR_TODAY].green = 0;
- calitem->colors[E_CALENDAR_COLOR_TODAY].blue = 0;
-
- nfailed = gdk_colormap_alloc_colors (colormap, calitem->colors,
- E_CALENDAR_COLOR_LAST, FALSE,
- TRUE, success);
- if (nfailed)
- g_warning ("Failed to allocate all colors");
-}
-
-
-static void
-e_calendar_item_unrealize (GnomeCanvasItem *item)
-{
- ECalendarItem *calitem;
- GdkColormap *colormap;
- gint i;
-
- calitem = E_CALENDAR_ITEM (item);
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (item->canvas));
-
- for (i = 0; i < E_CALENDAR_COLOR_LAST; i++)
- gdk_colors_free (colormap, &calitem->colors[i].pixel, 1, 0);
-}
-
-
-static void
-e_calendar_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags)
-{
- ECalendarItem *calitem;
- GtkStyle *style;
- GdkFont *font;
- gint char_height, width, height, space, space_per_cal, space_per_cell;
- gint xthickness, ythickness;
-
- if (GNOME_CANVAS_ITEM_CLASS (parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (parent_class)->update) (item, affine, clip_path, flags);
-
- calitem = E_CALENDAR_ITEM (item);
- style = GTK_WIDGET (item->canvas)->style;
- xthickness = style->klass->xthickness;
- ythickness = style->klass->ythickness;
-
- item->x1 = calitem->x1;
- item->y1 = calitem->y1;
- item->x2 = calitem->x2 >= calitem->x1 ? calitem->x2 : calitem->x1;
- item->y2 = calitem->y2 >= calitem->y1 ? calitem->y2 : calitem->y1;
-
- /*
- * Calculate the new layout of the calendar.
- */
-
- /* Make sure the minimum row width & cell height and the widths of
- all the digits and characters are up to date. */
- e_calendar_item_recalc_sizes (calitem);
-
- /* Calculate how many rows & cols we can fit in. */
- width = item->x2 - item->x1;
- height = item->y2 - item->y1;
-
- width -= xthickness * 2;
- height -= ythickness * 2;
-
- calitem->rows = height / calitem->min_month_height;
- calitem->rows = MAX (calitem->rows, calitem->min_rows);
- if (calitem->max_rows > 0)
- calitem->rows = MIN (calitem->rows, calitem->max_rows);
- calitem->cols = width / calitem->min_month_width;
- calitem->cols = MAX (calitem->cols, calitem->min_cols);
- if (calitem->max_cols > 0)
- calitem->cols = MIN (calitem->cols, calitem->max_cols);
-
- /* Split up the empty space according to the configuration.
- If the calendar is set to expand, we divide the space between the
- cells and the spaces around the calendar, otherwise we place the
- calendars in the center of the available area. */
-
- font = calitem->font;
- if (!font)
- font = style->font;
- char_height = font->ascent + font->descent;
-
- calitem->month_width = calitem->min_month_width;
- calitem->month_height = calitem->min_month_height;
- calitem->cell_width = calitem->max_digit_width * 2
- + E_CALENDAR_ITEM_MIN_CELL_XPAD;
- calitem->cell_height = char_height
- + E_CALENDAR_ITEM_MIN_CELL_YPAD;
- calitem->month_tpad = 0;
- calitem->month_bpad = 0;
- calitem->month_lpad = 0;
- calitem->month_rpad = 0;
-
- space = height - calitem->rows * calitem->month_height;
- if (space > 0) {
- space_per_cal = space / calitem->rows;
- calitem->month_height += space_per_cal;
-
- if (calitem->expand) {
- space_per_cell = space_per_cal / E_CALENDAR_ROWS_PER_MONTH;
- calitem->cell_height += space_per_cell;
- space_per_cal -= space_per_cell * E_CALENDAR_ROWS_PER_MONTH;
- }
-
- calitem->month_tpad = space_per_cal / 2;
- calitem->month_bpad = space_per_cal - calitem->month_tpad;
- }
-
- space = width - calitem->cols * calitem->month_width;
- if (space > 0) {
- space_per_cal = space / calitem->cols;
- calitem->month_width += space_per_cal;
- space -= space_per_cal * calitem->cols;
-
- if (calitem->expand) {
- space_per_cell = space_per_cal / E_CALENDAR_COLS_PER_MONTH;
- calitem->cell_width += space_per_cell;
- space_per_cal -= space_per_cell * E_CALENDAR_COLS_PER_MONTH;
- }
-
- calitem->month_lpad = space_per_cal / 2;
- calitem->month_rpad = space_per_cal - calitem->month_lpad;
- }
-
- space = MAX (0, space);
- calitem->x_offset = space / 2;
-
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1,
- item->x2, item->y2);
-}
-
-
-/*
- * DRAWING ROUTINES - functions to paint the canvas item.
- */
-
-static void
-e_calendar_item_draw (GnomeCanvasItem *canvas_item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height)
-{
- ECalendarItem *calitem;
- GtkStyle *style;
- GdkFont *font;
- GdkGC *base_gc, *bg_gc;
- gint char_height, row, col, row_y, bar_height, col_x, ythickness;
-
-#if 0
- g_print ("In e_calendar_item_draw %i,%i %ix%i\n",
- x, y, width, height);
-#endif
- calitem = E_CALENDAR_ITEM (canvas_item);
- style = GTK_WIDGET (canvas_item->canvas)->style;
- font = calitem->font;
- if (!font)
- font = style->font;
- char_height = font->ascent + font->descent;
- ythickness = style->klass->ythickness;
- base_gc = style->base_gc[GTK_STATE_NORMAL];
- bg_gc = style->bg_gc[GTK_STATE_NORMAL];
-
- /* Clear the entire background. */
- gdk_draw_rectangle (drawable, base_gc, TRUE,
- calitem->x1 - x, calitem->y1 - y,
- calitem->x2 - calitem->x1,
- calitem->y2 - calitem->y1);
-
- /* Draw the shadow around the entire item.
- FIXME: must also leave room for the 'Today' & 'None' buttons etc. */
- gtk_draw_shadow (style, drawable,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT,
- calitem->x1 - x, calitem->y1 - y,
- calitem->x2 - calitem->x1, calitem->y2 - calitem->y1);
-
- row_y = canvas_item->y1 + ythickness;
- bar_height = ythickness * 2 + E_CALENDAR_ITEM_YPAD1 + char_height
- + E_CALENDAR_ITEM_YPAD2;
-
- for (row = 0; row < calitem->rows; row++) {
- /* Draw the background for the title bars and the shadow around
- it, and the vertical lines between columns. */
-
- gdk_draw_rectangle (drawable, bg_gc, TRUE,
- calitem->x1 - x, row_y - y,
- calitem->x2 - calitem->x1, bar_height);
-
- gtk_draw_shadow (style, drawable,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT,
- calitem->x1 - x, row_y - y,
- calitem->x2 - calitem->x1, bar_height);
-
-
- for (col = 0; col < calitem->cols; col++) {
- if (col != 0) {
- col_x = calitem->x1 + calitem->x_offset
- + calitem->month_width * col;
- gtk_draw_vline (style, drawable,
- GTK_STATE_NORMAL,
- row_y + ythickness + 1 - y,
- row_y + bar_height
- - ythickness - 2 - y,
- col_x - 1 - x);
- }
-
-
- e_calendar_item_draw_month (calitem, drawable, x, y,
- width, height, row, col);
- }
-
- row_y += calitem->month_height;
- }
-}
-
-
-static void
-e_calendar_item_draw_month (ECalendarItem *calitem,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height,
- int row,
- int col)
-{
- GnomeCanvasItem *item;
- GtkWidget *widget;
- GtkStyle *style;
- GdkFont *font;
- GdkGC *fg_gc, *bg_gc;
- struct tm tmp_tm;
- GdkRectangle clip_rect;
- gint char_height, xthickness, ythickness, start_weekday;
- gint year, month, month_x, month_y, min_x, max_x, text_x, text_y;
- gint day, day_index, cells_x, cells_y, min_cell_width, text_width;
- gchar buffer[64];
-
-#if 0
- g_print ("In e_calendar_item_draw_month: %i,%i %ix%i\n",
- x, y, width, height);
-#endif
- item = GNOME_CANVAS_ITEM (calitem);
- widget = GTK_WIDGET (item->canvas);
- style = widget->style;
- font = calitem->font;
- if (!font)
- font = style->font;
- char_height = font->ascent + font->descent;
- xthickness = style->klass->xthickness;
- ythickness = style->klass->ythickness;
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- bg_gc = style->bg_gc[GTK_STATE_NORMAL];
-
- /* Calculate the top-left position of the entire month display. */
- month_x = item->x1 + xthickness + calitem->x_offset
- + col * calitem->month_width - x;
- month_y = item->y1 + ythickness + row * calitem->month_height - y;
-
- /* Just return if the month is outside the given area. */
- if (month_x >= width || month_x + calitem->month_width <= 0
- || month_y >= height || month_y + calitem->month_height <= 0)
- return;
-
-
- /* Draw the month name & year, with clipping. Note that the top row
- needs extra space around it for the buttons. */
- if (row == 0 && col == 0)
- min_x = E_CALENDAR_ITEM_XPAD11;
- else
- min_x = E_CALENDAR_ITEM_XPAD14 + E_CALENDAR_ITEM_XPAD15;
-
- if (row == 0 && col == calitem->cols - 1)
- max_x = calitem->month_width - E_CALENDAR_ITEM_XPAD16;
- else
- max_x = calitem->month_width - E_CALENDAR_ITEM_XPAD12
- - E_CALENDAR_ITEM_XPAD13;
-
- text_y = month_y + style->klass->ythickness
- + E_CALENDAR_ITEM_YPAD1;
- clip_rect.x = month_x + min_x;
- clip_rect.y = text_y;
- clip_rect.width = max_x - min_x;
- clip_rect.height = char_height;
- gdk_gc_set_clip_rectangle (fg_gc, &clip_rect);
-
- memset (&tmp_tm, 0, sizeof (tmp_tm));
- month = calitem->month + row * calitem->cols + col;
- year = calitem->year + month / 12;
- month %= 12;
- tmp_tm.tm_year = year - 1900;
- tmp_tm.tm_mon = month;
- tmp_tm.tm_mday = 1;
- tmp_tm.tm_isdst = -1;
- mktime (&tmp_tm);
- strftime (buffer, 64, "%B %Y", &tmp_tm);
- start_weekday = (tmp_tm.tm_wday + 6) % 7;
-
- /* Ideally we place the text centered in the month, but we won't go
- to the left of the minimum x position. */
- text_width = gdk_string_width (font, buffer);
- text_x = (calitem->month_width - text_width) / 2;
- text_x = MAX (min_x, text_x);
-
- gdk_draw_string (drawable, font, fg_gc,
- month_x + text_x, text_y + font->ascent, buffer);
-
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
-
-
- /* Draw the day initials across the top of the month. */
- min_cell_width = calitem->max_digit_width * 2
- + E_CALENDAR_ITEM_MIN_CELL_XPAD;
-
- cells_x = month_x + E_CALENDAR_ITEM_XPAD1 + calitem->month_lpad
- + E_CALENDAR_ITEM_XPAD3;
- if (calitem->show_week_numbers)
- cells_x += calitem->max_week_number_digit_width * 2
- + E_CALENDAR_ITEM_XPAD2 + 1;
- text_x = cells_x + calitem->cell_width
- - (calitem->cell_width - min_cell_width) / 2;
- text_x -= E_CALENDAR_ITEM_MIN_CELL_XPAD / 2;
- text_y = month_y + ythickness * 2 + E_CALENDAR_ITEM_YPAD1
- + char_height + E_CALENDAR_ITEM_YPAD2 + E_CALENDAR_ITEM_YPAD3
- + calitem->month_tpad;
-
- cells_y = text_y + char_height + E_CALENDAR_ITEM_YPAD4 + 1
- + E_CALENDAR_ITEM_YPAD5;
-
- text_y += font->ascent;
- day_index = calitem->week_start_day;
- for (day = 0; day < 7; day++) {
- gdk_draw_text (drawable, font, fg_gc,
- text_x - calitem->day_widths[day_index], text_y,
- &calitem->days[day_index], 1);
- text_x += calitem->cell_width;
- day_index++;
- if (day_index == 7)
- day_index = 0;
- }
-
-
- /* Draw the horizontal line beneath the day initials. */
- gdk_draw_line (drawable, fg_gc,
- cells_x - E_CALENDAR_ITEM_XPAD3,
- cells_y - E_CALENDAR_ITEM_YPAD5,
- cells_x + E_CALENDAR_COLS_PER_MONTH * calitem->cell_width - 1,
- cells_y - E_CALENDAR_ITEM_YPAD5);
-
- e_calendar_item_draw_day_numbers (calitem, drawable, width, height,
- row, col, year, month, start_weekday,
- cells_x, cells_y);
-
- /* Draw the vertical line after the week number. */
- if (calitem->show_week_numbers) {
- gdk_draw_line (drawable, fg_gc,
- cells_x - E_CALENDAR_ITEM_XPAD3,
- cells_y,
- cells_x - E_CALENDAR_ITEM_XPAD3,
- cells_y + E_CALENDAR_ROWS_PER_MONTH * calitem->cell_height - 1);
- }
-}
-
-
-static void
-e_calendar_item_draw_day_numbers (ECalendarItem *calitem,
- GdkDrawable *drawable,
- int width,
- int height,
- int row,
- int col,
- int year,
- int month,
- int start_weekday,
- gint cells_x,
- gint cells_y)
-{
- GnomeCanvasItem *item;
- GtkWidget *widget;
- GtkStyle *style;
- GdkFont *font, *wkfont;
- GdkGC *fg_gc;
- GdkColor *bg_color, *fg_color, *box_color;
- struct tm *today_tm;
- time_t t;
- gint char_height, min_cell_width, min_cell_height;
- gint day_num, drow, dcol, day_x, day_y;
- gint text_x, text_y;
- gint num_chars, digit;
- gint week_num, mon, days_from_week_start;
- gint years[3], months[3], days_in_month[3];
- gboolean bold, today, draw_day, finished = FALSE, selected;
- gint today_year, today_month, today_mday, month_offset, day_offset;
- gchar buffer[2];
-
- item = GNOME_CANVAS_ITEM (calitem);
- widget = GTK_WIDGET (item->canvas);
- style = widget->style;
- font = calitem->font;
- if (!font)
- font = style->font;
- wkfont = calitem->week_number_font;
- if (!wkfont)
- wkfont = font;
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- char_height = font->ascent + font->descent;
-
- min_cell_width = calitem->max_digit_width * 2
- + E_CALENDAR_ITEM_MIN_CELL_XPAD;
- min_cell_height = char_height + E_CALENDAR_ITEM_MIN_CELL_YPAD;
-
- /* Calculate the number of days in the previous, current, and next
- months. Note that g_date uses 1 to 12 for months. */
- years[0] = years[1] = years[2] = year;
- months[0] = month - 1;
- months[1] = month;
- months[2] = month + 1;
- if (months[0] == -1) {
- months[0] = 11;
- years[0]--;
- }
- if (months[2] == 12) {
- months[2] = 0;
- years[2]++;
- }
-
- days_in_month[0] = g_date_days_in_month (months[0] + 1, years[0]);
- days_in_month[1] = g_date_days_in_month (months[1] + 1, years[1]);
- days_in_month[2] = g_date_days_in_month (months[2] + 1, years[2]);
-
- /* Mon 0 is the previous month, which we may show the end of. Mon 1 is
- the current month, and mon 2 is the next month. */
- mon = 0;
-
- day_num = days_in_month[0];
- days_from_week_start = (start_weekday + 7 - calitem->week_start_day)
- % 7;
- /* For the top-left month we show the end of the previous month, and
- if the new month starts on the first day of the week we show a
- complete week from the previous month. */
- if (days_from_week_start == 0) {
- if (row == 0 && col == 0) {
- day_num -= 6;
- } else {
- mon++;
- day_num = 1;
- }
- } else {
- day_num -= days_from_week_start - 1;
- }
-
- /* Get today's date, so we can highlight it. */
- t = time (NULL);
- today_tm = localtime (&t);
- today_year = today_tm->tm_year + 1900;
- today_month = today_tm->tm_mon;
- today_mday = today_tm->tm_mday;
-
- /* We usually skip the last days of the previous month (mon = 0),
- except for the top-left month displayed. */
- draw_day = (mon == 1 || (row == 0 && col == 0));
-
- month_offset = row * calitem->cols + col;
- day_offset = 0;
-
- for (drow = 0; drow < 6; drow++) {
- /* Draw the week number. */
- if (calitem->show_week_numbers) {
- week_num = e_calendar_item_get_week_number (calitem,
- day_num,
- months[mon],
- years[mon]);
-
- text_x = cells_x - E_CALENDAR_ITEM_XPAD3 - 1
- - E_CALENDAR_ITEM_XPAD2;
- text_y = cells_y + drow * calitem->cell_height +
- + (calitem->cell_height - min_cell_height + 1) / 2;
-
- num_chars = 0;
- if (week_num >= 10) {
- digit = week_num / 10;
- text_x -= calitem->week_number_digit_widths[digit];
- buffer[num_chars++] = digit + '0';
- }
-
- digit = week_num % 10;
- text_x -= calitem->week_number_digit_widths[digit];
- buffer[num_chars++] = digit + '0';
-
- gdk_draw_text (drawable, wkfont, fg_gc,
- text_x, text_y + font->ascent,
- buffer, num_chars);
- }
-
- for (dcol = 0; dcol < 7; dcol++) {
- if (draw_day) {
- day_x = cells_x + dcol * calitem->cell_width;
- day_y = cells_y + drow * calitem->cell_height;
-
- today = years[mon] == today_year
- && months[mon] == today_month
- && day_num == today_mday;
-
- selected = calitem->selection_start_month_offset != -1
- && (calitem->selection_start_month_offset < month_offset
- || (calitem->selection_start_month_offset == month_offset
- && calitem->selection_start_day_offset <= day_offset))
- && (calitem->selection_end_month_offset > month_offset
- || (calitem->selection_end_month_offset == month_offset
- && calitem->selection_end_day_offset >= day_offset));
-
- /* Get the colors & style to use for the day.*/
- e_calendar_item_get_day_style (calitem,
- years[mon],
- months[mon],
- day_num,
- today,
- mon == 1,
- selected,
- &bg_color,
- &fg_color,
- &box_color,
- &bold);
-
- /* Draw the background, if set. */
- if (bg_color) {
- gdk_gc_set_foreground (fg_gc, bg_color);
- gdk_draw_rectangle (drawable, fg_gc,
- TRUE,
- day_x, day_y,
- calitem->cell_width,
- calitem->cell_height);
- }
-
- /* Draw the box, if set. */
- if (box_color) {
- gdk_gc_set_foreground (fg_gc, box_color);
- gdk_draw_rectangle (drawable, fg_gc,
- FALSE,
- day_x, day_y,
- calitem->cell_width - 1,
- calitem->cell_height - 1);
- }
-
- /* Draw the 1- or 2-digit day number. */
- day_x += calitem->cell_width - (calitem->cell_width - min_cell_width) / 2;
- day_x -= E_CALENDAR_ITEM_MIN_CELL_XPAD / 2;
- day_y += (calitem->cell_height - min_cell_height + 1) / 2;
- day_y += E_CALENDAR_ITEM_MIN_CELL_YPAD / 2;
-
- num_chars = 0;
- if (day_num >= 10) {
- digit = day_num / 10;
- day_x -= calitem->digit_widths[digit];
- buffer[num_chars++] = digit + '0';
- }
-
- digit = day_num % 10;
- day_x -= calitem->digit_widths[digit];
- buffer[num_chars++] = digit + '0';
-
- if (fg_color) {
- gdk_gc_set_foreground (fg_gc,
- fg_color);
- } else {
- gdk_gc_set_foreground (fg_gc,
- &style->fg[GTK_STATE_NORMAL]);
- }
-
- gdk_draw_text (drawable, font, fg_gc,
- day_x,
- day_y + font->ascent,
- buffer, num_chars);
- /* We use a stupid technique for bold. Just
- draw it again 1 pixel to the left. */
- if (bold)
- gdk_draw_text (drawable, font, fg_gc,
- day_x - 1,
- day_y + font->ascent,
- buffer, num_chars);
- }
-
- /* See if we've reached the end of a month. */
- if (day_num == days_in_month[mon]) {
- mon++;
- /* We only draw the start of the next month
- for the bottom-right month displayed. */
- if (mon == 2 && (row != calitem->rows - 1
- || col != calitem->cols - 1)) {
- /* Set a flag so we exit the loop. */
- finished = TRUE;
- break;
- }
- day_num = 1;
- draw_day = TRUE;
- } else {
- day_num++;
- }
-
- day_offset++;
- }
-
- /* Exit the loop if the flag is set. */
- if (finished)
- break;
- }
-
- /* Reset the foreground color. */
- gdk_gc_set_foreground (fg_gc, &style->fg[GTK_STATE_NORMAL]);
-}
-
-
-static gint
-e_calendar_item_get_week_number (ECalendarItem *calitem,
- gint day,
- gint month,
- gint year)
-{
- GDate tmp_date;
- gint weekday, yearday, offset, week_num;
-
- /* FIXME: check what happens at year boundaries. */
-
- g_date_clear (&tmp_date, 1);
- g_date_set_dmy (&tmp_date, day, month + 1, year);
-
- /* This results in a value of 0 (Monday) - 6 (Sunday). */
- weekday = g_date_weekday (&tmp_date) - 1;
-
- /* Calculate the offset from the start of the week. */
- offset = (calitem->week_start_day + 7 - weekday) % 7;
-
- /* Calculate the day of the year, from 0 to 365. */
- yearday = g_date_day_of_year (&tmp_date) - 1;
-
- /* If the week starts on or after 29th December, it is week 1 of the
- next year, since there are 4 days in the next year. */
- g_date_subtract_days (&tmp_date, offset);
- if (g_date_month (&tmp_date) == 12 && g_date_day (&tmp_date) >= 29)
- return 1;
-
- /* Calculate the week number, from 0. */
- week_num = (yearday - offset) / 7;
-
- /* If the first week starts on or after Jan 5th, then we need to add
- 1 since the previous week will really be the first week. */
- if ((yearday - offset) % 7 >= 4)
- week_num++;
-
- /* Add 1 so week numbers are from 1 to 53. */
- return week_num + 1;
-}
-
-
-
-/* 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_calendar_item_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-
-static gint
-e_calendar_item_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- ECalendarItem *calitem;
-
- calitem = E_CALENDAR_ITEM (item);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- return e_calendar_item_button_press (calitem, event);
- case GDK_BUTTON_RELEASE:
- return e_calendar_item_button_release (calitem, event);
- case GDK_MOTION_NOTIFY:
- return e_calendar_item_motion (calitem, event);
- default:
- break;
- }
-
- return FALSE;
-}
-
-
-
-/* This checks if any fonts have changed, and if so it recalculates the
- layout of the item. */
-static void
-e_calendar_item_recalc_sizes (ECalendarItem *calitem)
-{
- GnomeCanvasItem *canvas_item;
- GtkStyle *style;
- GdkFont *font, *wkfont;
- gchar *digits = "0123456789";
- gint day, digit, max_digit_width, max_week_number_digit_width;
- gint char_height, width, min_cell_width, min_cell_height;
-
- canvas_item = GNOME_CANVAS_ITEM (calitem);
- style = GTK_WIDGET (canvas_item->canvas)->style;
-
- font = calitem->font;
- if (!font)
- font = style->font;
- wkfont = calitem->week_number_font;
- if (!wkfont)
- wkfont = font;
- char_height = font->ascent + font->descent;
-
- /* If both fonts are the same, just return. */
- if (font == calitem->old_font
- && wkfont == calitem->old_week_number_font)
- return;
-
- calitem->old_font = font;
- calitem->old_week_number_font = wkfont;
-
- for (day = 0; day < 7; day++)
- calitem->day_widths[day] = gdk_char_width (font,
- calitem->days[day]);
-
- max_digit_width = 0;
- max_week_number_digit_width = 0;
- for (digit = 0; digit < 10; digit++) {
- width = gdk_char_width (font, digits[digit]);
- calitem->digit_widths[digit] = width;
- max_digit_width = MAX (max_digit_width, width);
-
- if (wkfont) {
- width = gdk_char_width (wkfont, digits[digit]);
- calitem->week_number_digit_widths[digit] = width;
- max_week_number_digit_width = MAX (max_week_number_digit_width, width);
- } else {
- calitem->week_number_digit_widths[digit] = width;
- max_week_number_digit_width = max_digit_width;
- }
- }
- calitem->max_digit_width = max_digit_width;
- calitem->max_week_number_digit_width = max_week_number_digit_width;
-
-
- min_cell_width = max_digit_width * 2 + E_CALENDAR_ITEM_MIN_CELL_XPAD;
- min_cell_height = char_height + E_CALENDAR_ITEM_MIN_CELL_YPAD;
-
- calitem->min_month_width = E_CALENDAR_ITEM_XPAD1
- + E_CALENDAR_ITEM_XPAD3 + min_cell_width * 7
- + E_CALENDAR_ITEM_XPAD4;
- if (calitem->show_week_numbers)
- calitem->min_month_width += max_week_number_digit_width * 2
- + E_CALENDAR_ITEM_XPAD2 + 1;
-
- calitem->min_month_height = style->klass->ythickness * 2
- + E_CALENDAR_ITEM_YPAD1 + char_height
- + E_CALENDAR_ITEM_YPAD2 + 1 + E_CALENDAR_ITEM_YPAD3
- + char_height + E_CALENDAR_ITEM_YPAD4 + 1
- + E_CALENDAR_ITEM_YPAD5 + min_cell_height * 6
- + E_CALENDAR_ITEM_YPAD6;
-}
-
-
-static void
-e_calendar_item_get_day_style (ECalendarItem *calitem,
- gint year,
- gint month,
- gint day,
- gboolean today,
- gboolean current_month,
- gboolean selected,
- GdkColor **bg_color,
- GdkColor **fg_color,
- GdkColor **box_color,
- gboolean *bold)
-{
- *bg_color = NULL;
- *fg_color = NULL;
- *box_color = NULL;
- *bold = FALSE;
-
- if (today)
- *box_color = &calitem->colors[E_CALENDAR_COLOR_TODAY];
-
- if (!current_month)
- *fg_color = &calitem->colors[E_CALENDAR_COLOR_HIGHLIGHT];
-
- if (selected) {
- *fg_color = &calitem->colors[E_CALENDAR_COLOR_SELECTION];
- *bg_color = &calitem->colors[E_CALENDAR_COLOR_HIGHLIGHT];
- }
-}
-
-
-
-static gboolean
-e_calendar_item_button_press (ECalendarItem *calitem,
- GdkEvent *event)
-{
- gint month, day;
- gboolean all_week;
-
- g_print ("In e_calendar_item_button_press\n");
-
- if (e_calendar_item_convert_position_to_day (calitem,
- event->button.x,
- event->button.y,
- &month, &day, &all_week)) {
- g_print (" Pressed month: %i day: %i\n", month, day);
-
- calitem->selection_start_month_offset = month;
- calitem->selection_start_day_offset = day;
- calitem->selection_end_month_offset = month;
- calitem->selection_end_day_offset = day;
- calitem->selecting = TRUE;
- calitem->selection_dragging_end = TRUE;
-
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (calitem));
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-static gboolean
-e_calendar_item_button_release (ECalendarItem *calitem,
- GdkEvent *event)
-{
- gint month, day;
- gboolean all_week;
-
- g_print ("In e_calendar_item_button_release\n");
-
- calitem->selecting = FALSE;
-
- if (e_calendar_item_convert_position_to_day (calitem,
- event->button.x,
- event->button.y,
- &month, &day, &all_week))
- g_print (" Released month: %i day: %i\n", month, day);
-
- return FALSE;
-}
-
-
-static gboolean
-e_calendar_item_motion (ECalendarItem *calitem,
- GdkEvent *event)
-{
- gint month, day;
- gboolean all_week;
-
- if (!calitem->selecting)
- return FALSE;
-
- if (e_calendar_item_convert_position_to_day (calitem,
- event->button.x,
- event->button.y,
- &month, &day, &all_week)) {
- if (calitem->selection_dragging_end) {
- if (calitem->selection_end_month_offset == month
- && calitem->selection_end_day_offset == day)
- return FALSE;
- calitem->selection_end_month_offset = month;
- calitem->selection_end_day_offset = day;
- } else {
- if (calitem->selection_start_month_offset == month
- && calitem->selection_start_day_offset == day)
- return FALSE;
- calitem->selection_start_month_offset = month;
- calitem->selection_start_day_offset = day;
- }
-
- if (calitem->selection_start_month_offset > calitem->selection_end_month_offset
- || (calitem->selection_start_month_offset == calitem->selection_end_month_offset
- && calitem->selection_start_day_offset > calitem->selection_end_day_offset)) {
- month = calitem->selection_start_month_offset;
- day = calitem->selection_start_day_offset;
- calitem->selection_start_month_offset = calitem->selection_end_month_offset;
- calitem->selection_end_month_offset = month;
- calitem->selection_start_day_offset = calitem->selection_end_day_offset;
- calitem->selection_end_day_offset = day;
-
- calitem->selection_dragging_end = !calitem->selection_dragging_end;
- }
-
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (calitem));
- }
-
- return FALSE;
-}
-
-
-
-
-/* Converts a position within the item to a month & day.
- The month returned is 0 for the top-left month displayed.
- If the position is over a week number the first day of the week is returned
- and entire_week is set to TRUE. */
-static gboolean
-e_calendar_item_convert_position_to_day (ECalendarItem *calitem,
- gint event_x,
- gint event_y,
- gint *month,
- gint *day,
- gboolean *entire_week)
-{
- GnomeCanvasItem *item;
- GtkWidget *widget;
- GtkStyle *style;
- gint xthickness, ythickness, char_height;
- gint x, y, row, col, cells_x, cells_y, day_row, day_col;
- gint first_valid_day, last_valid_day;
-
- item = GNOME_CANVAS_ITEM (calitem);
- widget = GTK_WIDGET (item->canvas);
- style = widget->style;
- char_height = style->font->ascent + style->font->descent;
- xthickness = style->klass->xthickness;
- ythickness = style->klass->ythickness;
-
- x = event_x - xthickness - calitem->x_offset;
- y = event_y - ythickness;
-
- if (x < 0 || y < 0)
- return FALSE;
-
- row = y / calitem->month_height;
- col = x / calitem->month_width;
-
- if (row < 0 || row >= calitem->rows
- || col < 0 || col >= calitem->cols)
- return FALSE;
-
- x = x % calitem->month_width;
- y = y % calitem->month_height;
-
- cells_x = E_CALENDAR_ITEM_XPAD1 + calitem->month_lpad
- + E_CALENDAR_ITEM_XPAD3;
- if (calitem->show_week_numbers)
- cells_x += calitem->max_week_number_digit_width * 2
- + E_CALENDAR_ITEM_XPAD2 + 1;
- cells_y = ythickness * 2 + E_CALENDAR_ITEM_YPAD1
- + char_height + E_CALENDAR_ITEM_YPAD2 + E_CALENDAR_ITEM_YPAD3
- + calitem->month_tpad
- + char_height + E_CALENDAR_ITEM_YPAD4 + 1
- + E_CALENDAR_ITEM_YPAD5;
-
- x -= cells_x;
- y -= cells_y;
-
- if (x < 0 || y < 0)
- return FALSE;
-
- day_row = y / calitem->cell_height;
- day_col = x / calitem->cell_width;
-
- if (day_row < 0 || day_row >= E_CALENDAR_ROWS_PER_MONTH
- || day_col < 0 || day_col >= E_CALENDAR_COLS_PER_MONTH)
- return FALSE;
-
- *month = row * calitem->cols + col;
- *day = day_row * E_CALENDAR_COLS_PER_MONTH + day_col;
- *entire_week = FALSE;
-
- e_calendar_item_get_month_info (calitem, row, col,
- &first_valid_day, &last_valid_day);
- if (*day < first_valid_day || *day > last_valid_day)
- return FALSE;
-
- return TRUE;
-}
-
-
-static void
-e_calendar_item_get_month_info (ECalendarItem *calitem,
- gint row,
- gint col,
- gint *first_valid_day,
- gint *last_valid_day)
-{
- gint year, month, days_in_month, start_weekday, first_day_of_month;
- struct tm tmp_tm = { 0 };
-
- month = calitem->month + row * calitem->cols + col;
- year = calitem->year + month / 12;
- month = month % 12;
- days_in_month = g_date_days_in_month (month + 1, year);
-
- tmp_tm.tm_year = year - 1900;
- tmp_tm.tm_mon = month;
- tmp_tm.tm_mday = 1;
- tmp_tm.tm_isdst = -1;
- mktime (&tmp_tm);
-
- /* Convert to 0 (Monday) to 6 (Sunday). */
- start_weekday = (tmp_tm.tm_wday + 6) % 7;
-
- first_day_of_month = (start_weekday + 7 - calitem->week_start_day) % 7;
-
- if (row == 0 && col == 0)
- *first_valid_day = 0;
- else
- *first_valid_day = first_day_of_month;
-
- if (row == calitem->rows - 1 && col == calitem->cols - 1)
- *last_valid_day = E_CALENDAR_ROWS_PER_MONTH * E_CALENDAR_COLS_PER_MONTH - 1;
- else
- *last_valid_day = first_day_of_month + days_in_month - 1;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#if 0
-
-static gint
-e_calendar_button_press (GtkWidget *widget,
- GdkEventButton *event)
-{
- ECalendar *cal;
- gint day;
-
- cal = E_CALENDAR (widget);
-
- g_print ("In e_calendar_button_press\n");
-
- day = e_calendar_convert_position_to_day (cal, event->x, event->y);
-
- cal->selection_start_day = day;
- cal->selection_end_day = day;
- cal->selection_dragging_end = TRUE;
-
- gtk_widget_queue_draw (widget);
-
- return FALSE;
-}
-
-
-static gint
-e_calendar_button_release (GtkWidget *widget,
- GdkEventButton *event)
-{
- g_print ("In e_calendar_button_release\n");
-
- return FALSE;
-}
-
-
-static gint
-e_calendar_motion (GtkWidget *widget,
- GdkEventMotion *event)
-{
- ECalendar *cal;
- gint x, y, day;
-
- cal = E_CALENDAR (widget);
-
- g_print ("In e_calendar_motion\n");
-
- x = event->x;
- y = event->y;
-
- if (event->is_hint || event->window != widget->window)
- gtk_widget_get_pointer (widget, &x, &y);
-
- day = e_calendar_convert_position_to_day (cal, event->x, event->y);
-
- if (cal->selection_dragging_end)
- cal->selection_end_day = day;
- else
- cal->selection_start_day = day;
-
- if (cal->selection_start_day > cal->selection_end_day) {
- day = cal->selection_start_day;
- cal->selection_start_day = cal->selection_end_day;
- cal->selection_end_day = day;
- cal->selection_dragging_end = !cal->selection_dragging_end;
- }
-
- gtk_widget_queue_draw (widget);
-
- return FALSE;
-}
-#endif
diff --git a/widgets/misc/e-calendar-item.h b/widgets/misc/e-calendar-item.h
deleted file mode 100644
index a59ca6d407..0000000000
--- a/widgets/misc/e-calendar-item.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- *
- * 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_CALENDAR_ITEM_H_
-#define _E_CALENDAR_ITEM_H_
-
-#include <libgnomeui/gnome-canvas.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * ECalendarItem - canvas item displaying a calendar.
- */
-
-#define E_CALENDAR_ITEM_YPAD1 1
-#define E_CALENDAR_ITEM_YPAD2 1
-
-/* These index our colors array. */
-typedef enum
-{
- E_CALENDAR_COLOR_SELECTION,
- E_CALENDAR_COLOR_HIGHLIGHT,
- E_CALENDAR_COLOR_TODAY,
-
- E_CALENDAR_COLOR_LAST
-} ECalendarColors;
-
-
-#define E_CALENDAR_ITEM(obj) (GTK_CHECK_CAST((obj), \
- e_calendar_item_get_type (), ECalendarItem))
-#define E_CALENDAR_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k),\
- e_calendar_item_get_type ()))
-#define E_IS_CALENDAR_ITEM(o) (GTK_CHECK_TYPE((o), \
- e_calendar_item_get_type ()))
-
-typedef struct {
- GnomeCanvasItem canvas_item;
-
- /* The year & month of the first calendar being displayed. */
- gint year;
- gint month; /* 0 to 11 */
-
- /* Bounds of item. */
- gdouble x1, y1, x2, y2;
-
- /* The minimum & maximum number of rows & columns of months. */
- gint min_rows;
- gint min_cols;
- gint max_rows;
- gint max_cols;
-
- /* The number of rows & columns of months. */
- gint rows;
- gint cols;
-
- /* Whether we show week nubers. */
- gboolean show_week_numbers;
-
- /* The first day of the week, 0 (Monday) to 6 (Sunday). */
- gint week_start_day;
-
- /* Whether the cells expand to fill extra space. */
- gboolean expand;
-
- /* The minimum size of each month, based on the fonts used. */
- gint min_month_width;
- gint min_month_height;
-
- /* The actual size of each month, after dividing extra space. */
- gint month_width;
- gint month_height;
-
- /* The offset to the left edge of the first calendar. */
- gint x_offset;
-
- /* The padding around each calendar month. */
- gint month_lpad, month_rpad;
- gint month_tpad, month_bpad;
-
- /* The size of each cell. */
- gint cell_width;
- gint cell_height;
-
-
- /* The current selection. The month offsets are from 0, which is the
- top-left calendar month view. The day offsets are from 0, which is
- the top-left cell in the month view (which may be empty). */
- gint selection_start_month_offset;
- gint selection_start_day_offset;
- gint selection_end_month_offset;
- gint selection_end_day_offset;
- gboolean selecting;
- gboolean selection_dragging_end;
-
- /* The first character of each day of the week, e.g. 'MTWTFSS'. */
- gchar *days;
-
- /* Widths of the day characters. */
- gint day_widths[7];
-
- /* Widths of the digits, '0' .. '9'. */
- gint digit_widths[10];
- gint max_digit_width;
- gint week_number_digit_widths[10];
- gint max_week_number_digit_width;
-
- /* Fonts for drawing text. If font isn't set it uses the font from the
- canvas widget. If week_number_font isn't set it uses font. */
- GdkFont *font, *old_font;
- GdkFont *week_number_font, *old_week_number_font;
-
- /* Colors for drawing. */
- GdkColor colors[E_CALENDAR_COLOR_LAST];
-} ECalendarItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
-} ECalendarItemClass;
-
-
-GtkType e_calendar_item_get_type (void);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_CALENDAR_ITEM_H_ */
diff --git a/widgets/misc/e-calendar.c b/widgets/misc/e-calendar.c
deleted file mode 100644
index ec85e3471f..0000000000
--- a/widgets/misc/e-calendar.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * ECalendar - displays a table of monthly calendars, allowing highlighting
- * and selection of one or more days. Like GtkCalendar with more features.
- * Most of the functionality is in the ECalendarItem canvas item, though
- * we also add GnomeCanvasWidget buttons to go to the previous/next month and
- * to got to the current day.
- */
-
-#include <config.h>
-#include <e-util/e-util.h>
-#include "e-calendar.h"
-
-#define E_CALENDAR_SMALL_FONT \
- "-adobe-utopia-regular-r-normal-*-*-100-*-*-p-*-iso8859-*"
-#define E_CALENDAR_SMALL_FONT_FALLBACK \
- "-adobe-helvetica-medium-r-normal-*-*-80-*-*-p-*-iso8859-*"
-
-#define E_CALENDAR_BUTTON_X_PAD 2
-#define E_CALENDAR_BUTTON_Y_PAD 0
-
-static void e_calendar_class_init (ECalendarClass *class);
-static void e_calendar_init (ECalendar *cal);
-static void e_calendar_destroy (GtkObject *object);
-static void e_calendar_realize (GtkWidget *widget);
-static void e_calendar_style_set (GtkWidget *widget,
- GtkStyle *previous_style);
-static void e_calendar_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void e_calendar_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static gint e_calendar_expose (GtkWidget *widget,
- GdkEventExpose *event);
-static void e_calendar_draw (GtkWidget *widget,
- GdkRectangle *area);
-#if 0
-static gint e_calendar_button_press (GtkWidget *widget,
- GdkEventButton *event);
-static gint e_calendar_button_release (GtkWidget *widget,
- GdkEventButton *event);
-#endif
-static gint e_calendar_focus_in (GtkWidget *widget,
- GdkEventFocus *event);
-static gint e_calendar_focus_out (GtkWidget *widget,
- GdkEventFocus *event);
-static gint e_calendar_key_press (GtkWidget *widget,
- GdkEventKey *event);
-
-static void e_calendar_paint (ECalendar *cal,
- GdkRectangle *area);
-
-static void e_calendar_on_prev_clicked (ECalendar *cal);
-static void e_calendar_on_next_clicked (ECalendar *cal);
-
-static GnomeCanvasClass *parent_class;
-static GtkLayoutClass *grandparent_class;
-
-E_MAKE_TYPE (e_calendar, "ECalendar", ECalendar,
- e_calendar_class_init, e_calendar_init, E_CANVAS_TYPE)
-
-
-static void
-e_calendar_class_init (ECalendarClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
-
- parent_class = gtk_type_class (E_CANVAS_TYPE);
- grandparent_class = gtk_type_class (GTK_TYPE_LAYOUT);
-
- object_class->destroy = e_calendar_destroy;
-
- widget_class->realize = e_calendar_realize;
- widget_class->style_set = e_calendar_style_set;
- widget_class->size_request = e_calendar_size_request;
- widget_class->size_allocate = e_calendar_size_allocate;
- widget_class->expose_event = e_calendar_expose;
- widget_class->draw = e_calendar_draw;
-#if 0
- widget_class->button_press_event = e_calendar_button_press;
- widget_class->button_release_event = e_calendar_button_release;
-#endif
- widget_class->focus_in_event = e_calendar_focus_in;
- widget_class->focus_out_event = e_calendar_focus_out;
- widget_class->key_press_event = e_calendar_key_press;
-}
-
-
-static void
-e_calendar_init (ECalendar *cal)
-{
- GnomeCanvasGroup *canvas_group;
- GdkFont *small_font;
- GtkWidget *button, *arrow;
-
- /* Create the small font. */
- small_font = gdk_font_load (E_CALENDAR_SMALL_FONT);
- if (!small_font)
- small_font = gdk_font_load (E_CALENDAR_SMALL_FONT_FALLBACK);
- if (!small_font)
- g_warning ("Couldn't load font");
-
- canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (cal)->root);
-
- cal->calitem = E_CALENDAR_ITEM (gnome_canvas_item_new (canvas_group,
- e_calendar_item_get_type (),
- "week_number_font", small_font,
- "week_start_day", 6,
- NULL));
-
-#if 0
- "show_week_numbers", TRUE,
- "minimum_columns", 5,
- "maximum_columns", 5,
-#endif
-
- if (small_font)
- gdk_font_unref (small_font);
-
-
- button = gtk_button_new ();
- /* FIXME: The buttons doesn't display properly if we do this. */
- /*gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);*/
- gtk_widget_show (button);
- gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (e_calendar_on_prev_clicked),
- GTK_OBJECT (cal));
- arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_OUT);
- gtk_widget_show (arrow);
- gtk_container_add (GTK_CONTAINER (button), arrow);
- cal->prev_item = gnome_canvas_item_new (canvas_group,
- gnome_canvas_widget_get_type (),
- "widget", button,
- NULL);
-
- button = gtk_button_new ();
- /*gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);*/
- gtk_widget_show (button);
- gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (e_calendar_on_next_clicked),
- GTK_OBJECT (cal));
- arrow = gtk_arrow_new (GTK_ARROW_RIGHT, GTK_SHADOW_OUT);
- gtk_widget_show (arrow);
- gtk_container_add (GTK_CONTAINER (button), arrow);
- cal->next_item = gnome_canvas_item_new (canvas_group,
- gnome_canvas_widget_get_type (),
- "widget", button,
- NULL);
-
- cal->min_rows = 1;
- cal->min_cols = 1;
- cal->max_rows = -1;
- cal->max_cols = -1;
-}
-
-
-/**
- * e_calendar_new:
- * @Returns: a new #ECalendar.
- *
- * Creates a new #ECalendar.
- **/
-GtkWidget *
-e_calendar_new (void)
-{
- GtkWidget *cal;
-
- cal = gtk_type_new (e_calendar_get_type ());
-
- return cal;
-}
-
-
-static void
-e_calendar_destroy (GtkObject *object)
-{
- ECalendar *cal;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_CALENDAR (object));
-
- cal = E_CALENDAR (object);
-
-
-
-}
-
-
-static void
-e_calendar_realize (GtkWidget *widget)
-{
- (*GTK_WIDGET_CLASS (parent_class)->realize) (widget);
-}
-
-
-static void
-e_calendar_style_set (GtkWidget *widget,
- GtkStyle *previous_style)
-{
-}
-
-
-static void
-e_calendar_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- ECalendar *cal;
- GtkStyle *style;
- gdouble col_width, row_height;
- gint width, height;
-
- cal = E_CALENDAR (widget);
- style = GTK_WIDGET (cal)->style;
-
- gtk_object_get (GTK_OBJECT (cal->calitem),
- "row_height", &row_height,
- "column_width", &col_width,
- NULL);
-
- height = row_height * cal->min_rows;
- width = col_width * cal->min_cols;
-
- /* FIXME: Add on space for line & button if shown. */
-
- requisition->width = width + style->klass->xthickness * 2;
- requisition->height = height + style->klass->ythickness * 2;
-}
-
-
-static void
-e_calendar_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- ECalendar *cal;
- GdkFont *font;
- gdouble old_x2, old_y2, new_x2, new_y2;
- gdouble xthickness, ythickness, button_size;
-
- cal = E_CALENDAR (widget);
- font = widget->style->font;
- xthickness = widget->style->klass->xthickness;
- ythickness = widget->style->klass->ythickness;
-
- (*GTK_WIDGET_CLASS (parent_class)->size_allocate) (widget, allocation);
-
- /* Set the scroll region to its allocated size, if changed. */
- gnome_canvas_get_scroll_region (GNOME_CANVAS (cal),
- NULL, NULL, &old_x2, &old_y2);
- new_x2 = widget->allocation.width - 1;
- new_y2 = widget->allocation.height - 1;
- if (old_x2 != new_x2 || old_y2 != new_y2)
- gnome_canvas_set_scroll_region (GNOME_CANVAS (cal),
- 0, 0, new_x2, new_y2);
-
- /* FIXME: Take off space for line & buttons if shown. */
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (cal->calitem),
- "x1", 0.0,
- "y1", 0.0,
- "x2", new_x2,
- "y2", new_y2,
- NULL);
-
- button_size = font->ascent + font->descent + E_CALENDAR_ITEM_YPAD1
- + E_CALENDAR_ITEM_YPAD2 - E_CALENDAR_BUTTON_Y_PAD * 2;
-
- gnome_canvas_item_set (cal->prev_item,
- "x", xthickness * 2 + E_CALENDAR_BUTTON_X_PAD,
- "y", ythickness * 2 + E_CALENDAR_BUTTON_Y_PAD,
- "width", button_size,
- "height", button_size,
- NULL);
-
- gnome_canvas_item_set (cal->next_item,
- "x", new_x2 + 1 - xthickness * 2
- - E_CALENDAR_BUTTON_X_PAD - button_size,
- "y", ythickness * 2 + E_CALENDAR_BUTTON_Y_PAD,
- "width", button_size,
- "height", button_size,
- NULL);
-}
-
-
-static gint
-e_calendar_expose (GtkWidget *widget,
- GdkEventExpose *event)
-{
- ECalendar *cal;
-
- cal = E_CALENDAR (widget);
-
- (*GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
-
- e_calendar_paint (cal, &event->area);
-
- return FALSE;
-}
-
-
-static void
-e_calendar_draw (GtkWidget *widget,
- GdkRectangle *area)
-{
- ECalendar *cal;
-
- cal = E_CALENDAR (widget);
-
- (*GTK_WIDGET_CLASS (parent_class)->draw) (widget, area);
-
- (*GTK_WIDGET_CLASS (grandparent_class)->draw) (widget, area);
-
- e_calendar_paint (cal, area);
-}
-
-
-static void
-e_calendar_paint (ECalendar *cal,
- GdkRectangle *area)
-{
-#if 0
- g_print ("In e_calendar_paint: %i,%i %ix%i\n", area->x, area->y,
- area->width, area->height);
-#endif
-}
-
-
-/* FIXME These aren't used? */
-
-#if 0
-static gint
-e_calendar_button_press (GtkWidget *widget,
- GdkEventButton *event)
-{
- ECalendar *cal;
-
- cal = E_CALENDAR (widget);
-
- g_print ("In e_calendar_button_press\n");
-
- return FALSE;
-}
-
-
-static gint
-e_calendar_button_release (GtkWidget *widget,
- GdkEventButton *event)
-{
- g_print ("In e_calendar_button_release\n");
-
- return FALSE;
-}
-#endif
-
-
-static gint
-e_calendar_focus_in (GtkWidget *widget,
- GdkEventFocus *event)
-{
- return FALSE;
-}
-
-
-static gint
-e_calendar_focus_out (GtkWidget *widget,
- GdkEventFocus *event)
-{
- return FALSE;
-}
-
-
-static gint
-e_calendar_key_press (GtkWidget *widget,
- GdkEventKey *event)
-{
- return FALSE;
-}
-
-
-void
-e_calendar_set_minimum_size (ECalendar *cal,
- gint rows,
- gint cols)
-{
- g_return_if_fail (E_IS_CALENDAR (cal));
-
- cal->min_rows = rows;
- cal->min_cols = cols;
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (cal->calitem),
- "minimum_rows", rows,
- "minimum_columns", cols,
- NULL);
-
- gtk_widget_queue_resize (GTK_WIDGET (cal));
-}
-
-
-void
-e_calendar_set_maximum_size (ECalendar *cal,
- gint rows,
- gint cols)
-{
- g_return_if_fail (E_IS_CALENDAR (cal));
-
- cal->max_rows = rows;
- cal->max_cols = cols;
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (cal->calitem),
- "maximum_rows", rows,
- "maximum_columns", cols,
- NULL);
-
- gtk_widget_queue_resize (GTK_WIDGET (cal));
-}
-
-
-static void
-e_calendar_on_prev_clicked (ECalendar *cal)
-{
- gint year, month;
-
- gtk_object_get (GTK_OBJECT (cal->calitem),
- "year", &year,
- "month", &month,
- NULL);
-
- month--;
- if (month == -1) {
- year--;
- month = 11;
- }
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (cal->calitem),
- "year", year,
- "month", month,
- NULL);
-}
-
-
-static void
-e_calendar_on_next_clicked (ECalendar *cal)
-{
- gint year, month;
-
- gtk_object_get (GTK_OBJECT (cal->calitem),
- "year", &year,
- "month", &month,
- NULL);
-
- month++;
- if (month == 12) {
- year++;
- month = 0;
- }
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (cal->calitem),
- "year", year,
- "month", month,
- NULL);
-}
-
diff --git a/widgets/misc/e-calendar.h b/widgets/misc/e-calendar.h
deleted file mode 100644
index b0e9c1f985..0000000000
--- a/widgets/misc/e-calendar.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- *
- * 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_CALENDAR_H_
-#define _E_CALENDAR_H_
-
-#include <gtk/gtkwidget.h>
-#include "e-util/e-canvas.h"
-#include "e-calendar-item.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * ECalendar - displays a table of monthly calendars, allowing highlighting
- * and selection of one or more days. Like GtkCalendar with more features.
- * Most of the functionality is in the ECalendarItem canvas item, though
- * we also add GnomeCanvasWidget buttons to go to the previous/next month and
- * to got to the current day.
- */
-
-#define E_CALENDAR(obj) GTK_CHECK_CAST (obj, e_calendar_get_type (), ECalendar)
-#define E_CALENDAR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_calendar_get_type (), ECalendarClass)
-#define E_IS_CALENDAR(obj) GTK_CHECK_TYPE (obj, e_calendar_get_type ())
-
-
-typedef struct _ECalendar ECalendar;
-typedef struct _ECalendarClass ECalendarClass;
-
-struct _ECalendar
-{
- ECanvas canvas;
-
- ECalendarItem *calitem;
-
- GnomeCanvasItem *prev_item, *next_item;
-
- gint min_rows;
- gint min_cols;
-
- gint max_rows;
- gint max_cols;
-};
-
-struct _ECalendarClass
-{
- ECanvasClass parent_class;
-};
-
-
-GtkType e_calendar_get_type (void);
-GtkWidget* e_calendar_new (void);
-
-void e_calendar_set_minimum_size (ECalendar *cal,
- gint rows,
- gint cols);
-void e_calendar_set_maximum_size (ECalendar *cal,
- gint rows,
- gint cols);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_CALENDAR_H_ */
diff --git a/widgets/misc/e-canvas-utils.c b/widgets/misc/e-canvas-utils.c
deleted file mode 100644
index ac61545b5f..0000000000
--- a/widgets/misc/e-canvas-utils.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-canvas-utils.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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-canvas-utils.h"
-
-void
-e_canvas_item_move_absolute (GnomeCanvasItem *item, double dx, double dy)
-{
- double translate[6];
-
- g_return_if_fail (item != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- art_affine_translate (translate, dx, dy);
-
- gnome_canvas_item_affine_absolute (item, translate);
-}
-
-void
-e_canvas_item_show_area (GnomeCanvasItem *item, double x1, double y1, double x2, double y2)
-{
- GtkAdjustment *h, *v;
- double dx = 0, dy = 0;
-
- g_return_if_fail (item != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- gnome_canvas_item_i2w(item, &x1, &y1);
- gnome_canvas_item_i2w(item, &x2, &y2);
-
- h = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- v = gtk_layout_get_vadjustment(GTK_LAYOUT(item->canvas));
-
- if (x2 > h->value + h->page_size)
- dx = (x2 - (h->value + h->page_size));
- if (y2 > v->value + v->page_size)
- dy = (y2 - (v->value + v->page_size));
-
- if (x1 < h->value + dx)
- dx = (x1 - h->value);
- if (y1 < v->value + dy)
- dy = (y1 - v->value);
-
- if (dx)
- gtk_adjustment_set_value(h, h->value + dx);
- if (dy)
- gtk_adjustment_set_value(v, v->value + dy);
-}
diff --git a/widgets/misc/e-canvas-utils.h b/widgets/misc/e-canvas-utils.h
deleted file mode 100644
index a940ea393c..0000000000
--- a/widgets/misc/e-canvas-utils.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-canvas-utils.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_CANVAS_UTILS__
-#define __E_CANVAS_UTILS__
-
-#include <gnome.h>
-void e_canvas_item_move_absolute (GnomeCanvasItem *item, double dx, double dy);
-void e_canvas_item_show_area (GnomeCanvasItem *item, double x1, double y1, double x2, double y2);
-
-#endif /* __E_CANVAS_UTILS__ */
diff --git a/widgets/misc/e-canvas-vbox.c b/widgets/misc/e-canvas-vbox.c
deleted file mode 100644
index 2d389a83e6..0000000000
--- a/widgets/misc/e-canvas-vbox.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-canvas-vbox.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <math.h>
-#include "e-canvas-vbox.h"
-#include <e-util/e-canvas-utils.h>
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-
-static void e_canvas_vbox_init (ECanvasVbox *CanvasVbox);
-static void e_canvas_vbox_class_init (ECanvasVboxClass *klass);
-static void e_canvas_vbox_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_canvas_vbox_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_canvas_vbox_destroy (GtkObject *object);
-
-static gint e_canvas_vbox_event (GnomeCanvasItem *item, GdkEvent *event);
-static void e_canvas_vbox_realize (GnomeCanvasItem *item);
-
-static void e_canvas_vbox_reflow (GnomeCanvasItem *item, int flags);
-
-static void e_canvas_vbox_real_add_item(ECanvasVbox *e_canvas_vbox, GnomeCanvasItem *item);
-static void e_canvas_vbox_resize_children (GnomeCanvasItem *item);
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_SPACING,
-};
-
-GtkType
-e_canvas_vbox_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type)
- {
- static const GtkTypeInfo info =
- {
- "ECanvasVbox",
- sizeof (ECanvasVbox),
- sizeof (ECanvasVboxClass),
- (GtkClassInitFunc) e_canvas_vbox_class_init,
- (GtkObjectInitFunc) e_canvas_vbox_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (gnome_canvas_group_get_type (), &info);
- }
-
- return type;
-}
-
-static void
-e_canvas_vbox_class_init (ECanvasVboxClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- gtk_object_add_arg_type ("ECanvasVbox::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ECanvasVbox::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("ECanvasVbox::spacing", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_SPACING);
-
- klass->add_item = e_canvas_vbox_real_add_item;
-
- object_class->set_arg = e_canvas_vbox_set_arg;
- object_class->get_arg = e_canvas_vbox_get_arg;
- object_class->destroy = e_canvas_vbox_destroy;
-
- /* GnomeCanvasItem method overrides */
- item_class->event = e_canvas_vbox_event;
- item_class->realize = e_canvas_vbox_realize;
-}
-
-static void
-e_canvas_vbox_init (ECanvasVbox *vbox)
-{
- vbox->items = NULL;
-
- vbox->width = 10;
- vbox->height = 10;
- vbox->spacing = 0;
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(vbox), e_canvas_vbox_reflow);
-}
-
-static void
-e_canvas_vbox_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ECanvasVbox *e_canvas_vbox;
-
- item = GNOME_CANVAS_ITEM (o);
- e_canvas_vbox = E_CANVAS_VBOX (o);
-
- switch (arg_id){
- case ARG_WIDTH:
- e_canvas_vbox->width = GTK_VALUE_DOUBLE (*arg);
- e_canvas_vbox_resize_children(item);
- e_canvas_item_request_reflow(item);
- break;
- case ARG_SPACING:
- e_canvas_vbox->spacing = GTK_VALUE_DOUBLE (*arg);
- e_canvas_item_request_reflow(item);
- break;
- }
-}
-
-static void
-e_canvas_vbox_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ECanvasVbox *e_canvas_vbox;
-
- e_canvas_vbox = E_CANVAS_VBOX (object);
-
- switch (arg_id) {
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_canvas_vbox->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = e_canvas_vbox->height;
- break;
- case ARG_SPACING:
- GTK_VALUE_DOUBLE (*arg) = e_canvas_vbox->spacing;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_canvas_vbox_destroy (GtkObject *object)
-{
- ECanvasVbox *vbox = E_CANVAS_VBOX(object);
-
- g_list_foreach(vbox->items, (GFunc) gtk_object_unref, NULL);
- g_list_free(vbox->items);
- vbox->items = NULL;
-
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
-}
-
-static gint
-e_canvas_vbox_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- gint return_val = TRUE;
-
- switch (event->type) {
- case GDK_KEY_PRESS:
- switch (event->key.keyval) {
- case GDK_Tab:
- case GDK_KP_Tab:
- case GDK_ISO_Left_Tab:
- case GDK_Left:
- case GDK_KP_Left:
- case GDK_Right:
- case GDK_KP_Right:
- case GDK_Down:
- case GDK_KP_Down:
- case GDK_Up:
- case GDK_KP_Up:
- case GDK_Return:
- case GDK_KP_Enter:
- return_val = TRUE;
- break;
- default:
- return_val = FALSE;
- break;
- }
- break;
- default:
- return_val = FALSE;
- break;
- }
- if (!return_val) {
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS (parent_class)->event (item, event);
- }
- return return_val;
-
-}
-
-static void
-e_canvas_vbox_realize (GnomeCanvasItem *item)
-{
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
-
- e_canvas_vbox_resize_children(item);
- e_canvas_item_request_reflow(item);
-}
-
-static void
-e_canvas_vbox_remove_item (GnomeCanvasItem *item, ECanvasVbox *vbox)
-{
- vbox->items = g_list_remove(vbox->items, item);
- gtk_object_unref(GTK_OBJECT(vbox));
-}
-
-static void
-e_canvas_vbox_real_add_item(ECanvasVbox *e_canvas_vbox, GnomeCanvasItem *item)
-{
- e_canvas_vbox->items = g_list_append(e_canvas_vbox->items, item);
- gtk_object_ref(GTK_OBJECT(item));
- gtk_object_ref(GTK_OBJECT(e_canvas_vbox));
- gtk_signal_connect(GTK_OBJECT(item), "destroy",
- GTK_SIGNAL_FUNC(e_canvas_vbox_remove_item), e_canvas_vbox);
- if ( GTK_OBJECT_FLAGS( e_canvas_vbox ) & GNOME_CANVAS_ITEM_REALIZED ) {
- gnome_canvas_item_set(item,
- "width", (double) e_canvas_vbox->width,
- NULL);
- e_canvas_item_request_reflow(item);
- }
-
-}
-
-static void
-e_canvas_vbox_resize_children (GnomeCanvasItem *item)
-{
- GList *list;
- ECanvasVbox *e_canvas_vbox;
-
- e_canvas_vbox = E_CANVAS_VBOX (item);
- for ( list = e_canvas_vbox->items; list; list = list->next ) {
- GnomeCanvasItem *child = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(child,
- "width", (double) e_canvas_vbox->width,
- NULL);
- }
-}
-
-static void
-e_canvas_vbox_reflow( GnomeCanvasItem *item, int flags )
-{
- ECanvasVbox *e_canvas_vbox = E_CANVAS_VBOX(item);
- if ( GTK_OBJECT_FLAGS( e_canvas_vbox ) & GNOME_CANVAS_ITEM_REALIZED ) {
-
- gdouble old_height;
- gdouble running_height;
-
- old_height = e_canvas_vbox->height;
-
- running_height = 0;
-
- if (e_canvas_vbox->items == NULL) {
- } else {
- GList *list;
- gdouble item_height;
-
- list = e_canvas_vbox->items;
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- e_canvas_item_move_absolute(GNOME_CANVAS_ITEM(list->data),
- (double) 0,
- (double) running_height);
- running_height += item_height;
- list = g_list_next(list);
-
- for( ; list; list = g_list_next(list)) {
- running_height += e_canvas_vbox->spacing;
-
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
-
- e_canvas_item_move_absolute(GNOME_CANVAS_ITEM(list->data),
- (double) 0,
- (double) running_height);
-
- running_height += item_height;
- }
-
- }
- e_canvas_vbox->height = running_height;
- if (old_height != e_canvas_vbox->height)
- e_canvas_item_request_parent_reflow(item);
- }
-}
-
-void
-e_canvas_vbox_add_item(ECanvasVbox *e_canvas_vbox, GnomeCanvasItem *item)
-{
- if (E_CANVAS_VBOX_CLASS(GTK_OBJECT(e_canvas_vbox)->klass)->add_item)
- (E_CANVAS_VBOX_CLASS(GTK_OBJECT(e_canvas_vbox)->klass)->add_item) (e_canvas_vbox, item);
-}
diff --git a/widgets/misc/e-canvas-vbox.h b/widgets/misc/e-canvas-vbox.h
deleted file mode 100644
index c45baa0b0a..0000000000
--- a/widgets/misc/e-canvas-vbox.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-canvas-vbox.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_CANVAS_VBOX_H__
-#define __E_CANVAS_VBOX_H__
-
-#include <gnome.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ECanvasVbox - A canvas item container.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * width double RW width of the CanvasVbox
- * height double R height of the CanvasVbox
- * spacing double RW Spacing between items.
- */
-
-#define E_CANVAS_VBOX_TYPE (e_canvas_vbox_get_type ())
-#define E_CANVAS_VBOX(obj) (GTK_CHECK_CAST ((obj), E_CANVAS_VBOX_TYPE, ECanvasVbox))
-#define E_CANVAS_VBOX_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CANVAS_VBOX_TYPE, ECanvasVboxClass))
-#define E_IS_CANVAS_VBOX(obj) (GTK_CHECK_TYPE ((obj), E_CANVAS_VBOX_TYPE))
-#define E_IS_CANVAS_VBOX_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CANVAS_VBOX_TYPE))
-
-
-typedef struct _ECanvasVbox ECanvasVbox;
-typedef struct _ECanvasVboxClass ECanvasVboxClass;
-
-struct _ECanvasVbox
-{
- GnomeCanvasGroup parent;
-
- /* item specific fields */
- GList *items; /* Of type GnomeCanvasItem */
-
- double width;
- double height;
- double spacing;
-};
-
-struct _ECanvasVboxClass
-{
- GnomeCanvasGroupClass parent_class;
-
- /* Virtual methods. */
- void (* add_item) (ECanvasVbox *CanvasVbox, GnomeCanvasItem *item);
-};
-
-/*
- * To be added to a CanvasVbox, an item must have the argument "width" as
- * a Read/Write argument and "height" as a Read Only argument. It
- * should also do an ECanvas parent CanvasVbox request if its size
- * changes.
- */
-void e_canvas_vbox_add_item(ECanvasVbox *e_canvas_vbox, GnomeCanvasItem *item);
-GtkType e_canvas_vbox_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CANVAS_VBOX_H__ */
diff --git a/widgets/misc/e-canvas.c b/widgets/misc/e-canvas.c
deleted file mode 100644
index fb67bf0379..0000000000
--- a/widgets/misc/e-canvas.c
+++ /dev/null
@@ -1,696 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-canvas.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-canvas.h"
-static void e_canvas_init (ECanvas *card);
-static void e_canvas_destroy (GtkObject *object);
-static void e_canvas_class_init (ECanvasClass *klass);
-static void e_canvas_realize (GtkWidget *widget);
-static void e_canvas_unrealize (GtkWidget *widget);
-static gint e_canvas_key (GtkWidget *widget,
- GdkEventKey *event);
-
-static gint e_canvas_focus_in (GtkWidget *widget,
- GdkEventFocus *event);
-static gint e_canvas_focus_out (GtkWidget *widget,
- GdkEventFocus *event);
-
-static int emit_event (GnomeCanvas *canvas, GdkEvent *event);
-
-static GnomeCanvasClass *parent_class = NULL;
-
-enum {
- REFLOW,
- LAST_SIGNAL
-};
-
-static guint e_canvas_signals [LAST_SIGNAL] = { 0, };
-
-GtkType
-e_canvas_get_type (void)
-{
- static GtkType canvas_type = 0;
-
- if (!canvas_type)
- {
- static const GtkTypeInfo canvas_info =
- {
- "ECanvas",
- sizeof (ECanvas),
- sizeof (ECanvasClass),
- (GtkClassInitFunc) e_canvas_class_init,
- (GtkObjectInitFunc) e_canvas_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- canvas_type = gtk_type_unique (gnome_canvas_get_type (), &canvas_info);
- }
-
- return canvas_type;
-}
-
-static void
-e_canvas_class_init (ECanvasClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasClass *canvas_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass*) klass;
- canvas_class = (GnomeCanvasClass *) klass;
- widget_class = (GtkWidgetClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_get_type ());
-
- object_class->destroy = e_canvas_destroy;
-
- widget_class->key_press_event = e_canvas_key;
- widget_class->key_release_event = e_canvas_key;
- widget_class->focus_in_event = e_canvas_focus_in;
- widget_class->focus_out_event = e_canvas_focus_out;
- widget_class->realize = e_canvas_realize;
- widget_class->unrealize = e_canvas_unrealize;
-
- klass->reflow = NULL;
-
- e_canvas_signals [REFLOW] =
- gtk_signal_new ("reflow",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ECanvasClass, reflow),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_canvas_signals, LAST_SIGNAL);
-}
-
-static void
-e_canvas_init (ECanvas *canvas)
-{
- canvas->selection = NULL;
- canvas->cursor = NULL;
- canvas->ic = NULL;
- canvas->ic_attr = NULL;
-}
-
-static void
-e_canvas_destroy (GtkObject *object)
-{
- ECanvas *canvas = E_CANVAS(object);
- if (canvas->idle_id)
- g_source_remove(canvas->idle_id);
- if ((GTK_OBJECT_CLASS (parent_class))->destroy)
- (*(GTK_OBJECT_CLASS (parent_class))->destroy) (object);
-}
-
-GtkWidget *
-e_canvas_new ()
-{
- return GTK_WIDGET (gtk_type_new (e_canvas_get_type ()));
-}
-
-
-/* Returns whether the item is an inferior of or is equal to the parent. */
-static int
-is_descendant (GnomeCanvasItem *item, GnomeCanvasItem *parent)
-{
- for (; item; item = item->parent)
- if (item == parent)
- return TRUE;
-
- return FALSE;
-}
-
-/* Emits an event for an item in the canvas, be it the current item, grabbed
- * item, or focused item, as appropriate.
- */
-static int
-emit_event (GnomeCanvas *canvas, GdkEvent *event)
-{
- /*GdkEvent ev;*/
- gint finished;
- GnomeCanvasItem *item;
- GnomeCanvasItem *parent;
- guint mask;
-
- /* Perform checks for grabbed items */
-
- if (canvas->grabbed_item && !is_descendant (canvas->current_item, canvas->grabbed_item))
- return FALSE;
-
- if (canvas->grabbed_item) {
- switch (event->type) {
- case GDK_ENTER_NOTIFY:
- mask = GDK_ENTER_NOTIFY_MASK;
- break;
-
- case GDK_LEAVE_NOTIFY:
- mask = GDK_LEAVE_NOTIFY_MASK;
- break;
-
- case GDK_MOTION_NOTIFY:
- mask = GDK_POINTER_MOTION_MASK;
- break;
-
- case GDK_BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- mask = GDK_BUTTON_PRESS_MASK;
- break;
-
- case GDK_BUTTON_RELEASE:
- mask = GDK_BUTTON_RELEASE_MASK;
- break;
-
- case GDK_KEY_PRESS:
- mask = GDK_KEY_PRESS_MASK;
- break;
-
- case GDK_KEY_RELEASE:
- mask = GDK_KEY_RELEASE_MASK;
- break;
-
- default:
- mask = 0;
- break;
- }
-
- if (!(mask & canvas->grabbed_event_mask))
- return FALSE;
- }
-
- /* Convert to world coordinates -- we have two cases because of diferent
- * offsets of the fields in the event structures.
- */
-
- /*ev = *event;*/
-
- switch (event->type) {
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- gnome_canvas_window_to_world (canvas,
- event->crossing.x,
- event->crossing.y,
- &(event->crossing.x),
- &(event->crossing.y));
- break;
-
- case GDK_MOTION_NOTIFY:
- case GDK_BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- gnome_canvas_window_to_world (canvas,
- event->motion.x,
- event->motion.y,
- &(event->motion.x),
- &(event->motion.y));
- break;
-
- default:
- break;
- }
-
- /* Choose where we send the event */
-
- item = canvas->current_item;
-
- if (canvas->focused_item
- && ((event->type == GDK_KEY_PRESS) || (event->type == GDK_KEY_RELEASE) || (event->type == GDK_FOCUS_CHANGE)))
- item = canvas->focused_item;
-
- /* The event is propagated up the hierarchy (for if someone connected to
- * a group instead of a leaf event), and emission is stopped if a
- * handler returns TRUE, just like for GtkWidget events.
- */
-
- finished = FALSE;
-
- while (item && !finished) {
- gtk_object_ref (GTK_OBJECT (item));
-
- gtk_signal_emit_by_name (GTK_OBJECT (item), "event",
- event,
- &finished);
-
- if (GTK_OBJECT_DESTROYED (item))
- finished = TRUE;
-
- parent = item->parent;
- gtk_object_unref (GTK_OBJECT (item));
-
- item = parent;
- }
-
- return finished;
-}
-
-/* Key event handler for the canvas */
-static gint
-e_canvas_key (GtkWidget *widget, GdkEventKey *event)
-{
- GnomeCanvas *canvas;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (GNOME_IS_CANVAS (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- canvas = GNOME_CANVAS (widget);
-
- return emit_event (canvas, (GdkEvent *) event);
-}
-
-
-/**
- * e_canvas_item_grab_focus:
- * @item: A canvas item.
- *
- * Makes the specified item take the keyboard focus, so all keyboard events will
- * be sent to it. If the canvas widget itself did not have the focus, it grabs
- * it as well.
- **/
-void
-e_canvas_item_grab_focus (GnomeCanvasItem *item)
-{
- GnomeCanvasItem *focused_item;
- GdkEvent ev;
-
- g_return_if_fail (item != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
- g_return_if_fail (GTK_WIDGET_CAN_FOCUS (GTK_WIDGET (item->canvas)));
-
- focused_item = item->canvas->focused_item;
-
- if (focused_item) {
- ev.focus_change.type = GDK_FOCUS_CHANGE;
- ev.focus_change.window = GTK_LAYOUT (item->canvas)->bin_window;
- ev.focus_change.send_event = FALSE;
- ev.focus_change.in = FALSE;
-
- emit_event (item->canvas, &ev);
- }
-
- item->canvas->focused_item = item;
-
- if (!GTK_WIDGET_HAS_FOCUS (GTK_WIDGET(item->canvas))) {
- gtk_widget_grab_focus (GTK_WIDGET (item->canvas));
- }
-
- if (focused_item) {
- ev.focus_change.type = GDK_FOCUS_CHANGE;
- ev.focus_change.window = GTK_LAYOUT (item->canvas)->bin_window;
- ev.focus_change.send_event = FALSE;
- ev.focus_change.in = TRUE;
-
- emit_event (item->canvas, &ev);
- }
-}
-
-/* Focus in handler for the canvas */
-static gint
-e_canvas_focus_in (GtkWidget *widget, GdkEventFocus *event)
-{
- GnomeCanvas *canvas;
- ECanvas *ecanvas;
-
- canvas = GNOME_CANVAS (widget);
- ecanvas = E_CANVAS (widget);
-
- GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
-
- if (ecanvas->ic)
- gdk_im_begin (ecanvas->ic, canvas->layout.bin_window);
-
- if (canvas->focused_item)
- return emit_event (canvas, (GdkEvent *) event);
- else
- return FALSE;
-}
-
-/* Focus out handler for the canvas */
-static gint
-e_canvas_focus_out (GtkWidget *widget, GdkEventFocus *event)
-{
- GnomeCanvas *canvas;
- ECanvas *ecanvas;
-
- canvas = GNOME_CANVAS (widget);
- ecanvas = E_CANVAS (widget);
-
- GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
-
- if (ecanvas->ic)
- gdk_im_end ();
-
- if (canvas->focused_item)
- return emit_event (canvas, (GdkEvent *) event);
- else
- return FALSE;
-}
-
-static void
-e_canvas_realize (GtkWidget *widget)
-{
- ECanvas *ecanvas = E_CANVAS (widget);
-
- if (GTK_WIDGET_CLASS (parent_class)->realize)
- (* GTK_WIDGET_CLASS (parent_class)->realize) (widget);
-
- gdk_window_set_back_pixmap (GTK_LAYOUT (widget)->bin_window, NULL, FALSE);
-
- if (gdk_im_ready () && (ecanvas->ic_attr = gdk_ic_attr_new ()) != NULL) {
- GdkEventMask mask;
- GdkICAttr *attr = ecanvas->ic_attr;
- GdkICAttributesType attrmask = GDK_IC_ALL_REQ;
- GdkIMStyle style;
- GdkIMStyle supported_style = GDK_IM_PREEDIT_NONE |
- GDK_IM_PREEDIT_NOTHING |
- GDK_IM_STATUS_NONE |
- GDK_IM_STATUS_NOTHING;
-
- attr->style = style = gdk_im_decide_style (supported_style);
- attr->client_window = ecanvas->parent.layout.bin_window;
-
- ecanvas->ic = gdk_ic_new (attr, attrmask);
- if (ecanvas->ic != NULL) {
- mask = gdk_window_get_events (attr->client_window);
- mask |= gdk_ic_get_events (ecanvas->ic);
- gdk_window_set_events (attr->client_window, mask);
-
- if (GTK_WIDGET_HAS_FOCUS (widget))
- gdk_im_begin (ecanvas->ic, attr->client_window);
- } else
- g_warning ("Can't create input context.");
- }
-
-}
-
-static void
-e_canvas_unrealize (GtkWidget *widget)
-{
- ECanvas * ecanvas = E_CANVAS (widget);
- if (ecanvas->ic) {
- gdk_ic_destroy (ecanvas->ic);
- ecanvas->ic = NULL;
- }
- if (ecanvas->ic_attr) {
- gdk_ic_attr_destroy (ecanvas->ic_attr);
- ecanvas->ic_attr = NULL;
- }
- if (GTK_WIDGET_CLASS (parent_class)->unrealize)
- (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
-}
-
-static void
-e_canvas_item_invoke_reflow (GnomeCanvasItem *item, int flags)
-{
- GnomeCanvasGroup *group;
- GList *list;
- GnomeCanvasItem *child;
-
- if (GNOME_IS_CANVAS_GROUP (item)) {
- group = GNOME_CANVAS_GROUP (item);
- for (list = group->item_list; list; list = list->next) {
- child = GNOME_CANVAS_ITEM (list->data);
- if (child->object.flags & E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW)
- e_canvas_item_invoke_reflow (child, flags);
- }
- }
-
- if (item->object.flags & E_CANVAS_ITEM_NEEDS_REFLOW) {
- ECanvasItemReflowFunc func;
- func = gtk_object_get_data (GTK_OBJECT (item),
- "ECanvasItem::reflow_callback");
- if (func)
- func (item, flags);
- }
-
- item->object.flags &= ~E_CANVAS_ITEM_NEEDS_REFLOW;
- item->object.flags &= ~E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW;
-}
-
-static void
-do_reflow (ECanvas *canvas)
-{
- if (GNOME_CANVAS(canvas)->root->object.flags & E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW)
- e_canvas_item_invoke_reflow (GNOME_CANVAS(canvas)->root, 0);
-}
-
-/* Idle handler for the e-canvas. It deals with pending reflows. */
-static gint
-idle_handler (gpointer data)
-{
- ECanvas *canvas;
-
- GDK_THREADS_ENTER();
-
- canvas = E_CANVAS (data);
- do_reflow (canvas);
-
- /* Reset idle id */
- canvas->idle_id = 0;
-
- gtk_signal_emit (GTK_OBJECT (canvas),
- e_canvas_signals [REFLOW]);
-
- GDK_THREADS_LEAVE();
-
- return FALSE;
-}
-
-/* Convenience function to add an idle handler to a canvas */
-static void
-add_idle (ECanvas *canvas)
-{
- if (canvas->idle_id != 0)
- return;
-
- canvas->idle_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE, idle_handler, (gpointer) canvas, NULL);
-}
-
-static void
-e_canvas_item_descendent_needs_reflow (GnomeCanvasItem *item)
-{
- if (item->object.flags & E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW)
- return;
-
- item->object.flags |= E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW;
- if (item->parent)
- e_canvas_item_descendent_needs_reflow(item->parent);
-}
-
-void
-e_canvas_item_request_reflow (GnomeCanvasItem *item)
-{
- if (item->object.flags & GNOME_CANVAS_ITEM_REALIZED) {
- item->object.flags |= E_CANVAS_ITEM_NEEDS_REFLOW;
- e_canvas_item_descendent_needs_reflow(item);
- add_idle(E_CANVAS(item->canvas));
- }
-}
-
-void
-e_canvas_item_request_parent_reflow (GnomeCanvasItem *item)
-{
- g_return_if_fail(item != NULL);
- g_return_if_fail(GNOME_IS_CANVAS_ITEM(item));
- e_canvas_item_request_reflow(item->parent);
-}
-
-void
-e_canvas_item_set_reflow_callback (GnomeCanvasItem *item, ECanvasItemReflowFunc func)
-{
- gtk_object_set_data(GTK_OBJECT(item), "ECanvasItem::reflow_callback", (gpointer) func);
-}
-
-
-void
-e_canvas_item_set_selection_callback (GnomeCanvasItem *item, ECanvasItemSelectionFunc func)
-{
- gtk_object_set_data(GTK_OBJECT(item), "ECanvasItem::selection_callback", (gpointer) func);
-}
-
-void
-e_canvas_item_set_selection_compare_callback (GnomeCanvasItem *item, ECanvasItemSelectionCompareFunc func)
-{
- gtk_object_set_data(GTK_OBJECT(item), "ECanvasItem::selection_compare_callback", (gpointer) func);
-}
-
-void
-e_canvas_item_set_cursor (GnomeCanvasItem *item, gpointer id)
-{
- GList *list;
- int flags;
- ECanvas *canvas;
- ECanvasSelectionInfo *info;
- ECanvasItemSelectionFunc func;
-
- g_return_if_fail(item != NULL);
- g_return_if_fail(GNOME_IS_CANVAS_ITEM(item));
- g_return_if_fail(item->canvas != NULL);
- g_return_if_fail(E_IS_CANVAS(item->canvas));
-
- canvas = E_CANVAS(item->canvas);
- flags = E_CANVAS_ITEM_SELECTION_DELETE_DATA;
-
- for (list = canvas->selection; list; list = g_list_next(list)) {
- info = list->data;
-
- func = gtk_object_get_data(GTK_OBJECT(info->item), "ECanvasItem::selection_callback");
- if (func)
- func(info->item, flags, info->id);
- g_message ("ECANVAS: free info (2): item %p, id %p",
- info->item, info->id);
- gtk_object_unref (GTK_OBJECT (info->item));
- g_free(info);
- }
- g_list_free(canvas->selection);
-
- canvas->selection = NULL;
-
- gnome_canvas_item_grab_focus(item);
-
- info = g_new(ECanvasSelectionInfo, 1);
- info->item = item;
- gtk_object_ref (GTK_OBJECT (info->item));
- info->id = id;
- g_message ("ECANVAS: new info item %p, id %p", item, id);
-
- flags = E_CANVAS_ITEM_SELECTION_SELECT | E_CANVAS_ITEM_SELECTION_CURSOR;
- func = gtk_object_get_data(GTK_OBJECT(item), "ECanvasItem::selection_callback");
- if (func)
- func(item, flags, id);
-
- canvas->selection = g_list_prepend(canvas->selection, info);
- canvas->cursor = info;
-}
-
-void
-e_canvas_item_set_cursor_end (GnomeCanvasItem *item, gpointer id)
-{
-}
-
-void
-e_canvas_item_add_selection (GnomeCanvasItem *item, gpointer id)
-{
- int flags;
- ECanvas *canvas;
- ECanvasSelectionInfo *info;
- ECanvasItemSelectionFunc func;
- GList *list;
-
- g_return_if_fail(item != NULL);
- g_return_if_fail(GNOME_IS_CANVAS_ITEM(item));
- g_return_if_fail(item->canvas != NULL);
- g_return_if_fail(E_IS_CANVAS(item->canvas));
-
- flags = E_CANVAS_ITEM_SELECTION_SELECT;
- canvas = E_CANVAS(item->canvas);
-
- if (canvas->cursor) {
- func = gtk_object_get_data(GTK_OBJECT(canvas->cursor->item), "ECanvasItem::selection_callback");
- if (func)
- func(canvas->cursor->item, flags, canvas->cursor->id);
- }
-
- gnome_canvas_item_grab_focus(item);
-
- flags = E_CANVAS_ITEM_SELECTION_SELECT | E_CANVAS_ITEM_SELECTION_CURSOR;
-
- for (list = canvas->selection; list; list = g_list_next(list)) {
- ECanvasSelectionInfo *search;
- search = list->data;
-
- if (search->item == item) {
- ECanvasItemSelectionCompareFunc compare_func;
- compare_func = gtk_object_get_data(GTK_OBJECT(search->item), "ECanvasItem::selection_compare_callback");
-
- if (compare_func(search->item, search->id, id, 0) == 0) {
- canvas->cursor = search;
- func = gtk_object_get_data(GTK_OBJECT(item), "ECanvasItem::selection_callback");
- if (func)
- func(item, flags, search->id);
- return;
- }
- }
- }
-
- info = g_new(ECanvasSelectionInfo, 1);
- info->item = item;
- gtk_object_ref (GTK_OBJECT (info->item));
- info->id = id;
- g_message ("ECANVAS: new info (2): item %p, id %p", item, id);
-
- func = gtk_object_get_data(GTK_OBJECT(item), "ECanvasItem::selection_callback");
- if (func)
- func(item, flags, id);
-
- canvas->selection = g_list_prepend(canvas->selection, info);
- canvas->cursor = info;
-}
-
-void
-e_canvas_item_remove_selection (GnomeCanvasItem *item, gpointer id)
-{
- int flags;
- ECanvas *canvas;
- ECanvasSelectionInfo *info;
- GList *list;
-
- g_return_if_fail(item != NULL);
- g_return_if_fail(GNOME_IS_CANVAS_ITEM(item));
- g_return_if_fail(item->canvas != NULL);
- g_return_if_fail(E_IS_CANVAS(item->canvas));
-
- flags = E_CANVAS_ITEM_SELECTION_DELETE_DATA;
- canvas = E_CANVAS(item->canvas);
-
- for (list = canvas->selection; list; list = g_list_next(list)) {
- info = list->data;
-
- if (info->item == item) {
- ECanvasItemSelectionCompareFunc compare_func;
- compare_func = gtk_object_get_data(GTK_OBJECT(info->item), "ECanvasItem::selection_compare_callback");
-
- if (compare_func(info->item, info->id, id, 0) == 0) {
- ECanvasItemSelectionFunc func;
- func = gtk_object_get_data(GTK_OBJECT(info->item), "ECanvasItem::selection_callback");
- if (func)
- func(info->item, flags, info->id);
- canvas->selection = g_list_remove_link(canvas->selection, list);
-
- if (canvas->cursor == info)
- canvas->cursor = NULL;
-
- g_message ("ECANVAS: removing info: item %p, info %p",
- info->item, info->id);
- gtk_object_unref (GTK_OBJECT (info->item));
- g_free(info);
- g_list_free_1(list);
- break;
- }
- }
- }
-}
diff --git a/widgets/misc/e-canvas.h b/widgets/misc/e-canvas.h
deleted file mode 100644
index b13a9dd2ab..0000000000
--- a/widgets/misc/e-canvas.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-canvas.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_CANVAS_H__
-#define __E_CANVAS_H__
-
-#include <gnome.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ECanvas - A class derived from canvas for the purpose of adding
- * evolution specific canvas hacks.
- */
-
-#define E_CANVAS_TYPE (e_canvas_get_type ())
-#define E_CANVAS(obj) (GTK_CHECK_CAST ((obj), E_CANVAS_TYPE, ECanvas))
-#define E_CANVAS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CANVAS_TYPE, ECanvasClass))
-#define E_IS_CANVAS(obj) (GTK_CHECK_TYPE ((obj), E_CANVAS_TYPE))
-#define E_IS_CANVAS_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CANVAS_TYPE))
-
-typedef void (*ECanvasItemReflowFunc) (GnomeCanvasItem *item,
- gint flags);
-
-typedef void (*ECanvasItemSelectionFunc) (GnomeCanvasItem *item,
- gint flags,
- gpointer user_data);
-/* Returns the same as strcmp does. */
-typedef gint (*ECanvasItemSelectionCompareFunc) (GnomeCanvasItem *item,
- gpointer data1,
- gpointer data2,
- gint flags);
-
-
-typedef struct _ECanvas ECanvas;
-typedef struct _ECanvasClass ECanvasClass;
-
-/* Object flags for items */
-enum {
- E_CANVAS_ITEM_NEEDS_REFLOW = 1 << 13,
- E_CANVAS_ITEM_DESCENDENT_NEEDS_REFLOW = 1 << 14
-};
-
-enum {
- E_CANVAS_ITEM_SELECTION_SELECT = 1 << 0, /* TRUE = select. FALSE = unselect. */
- E_CANVAS_ITEM_SELECTION_CURSOR = 1 << 1, /* TRUE = has become cursor. FALSE = not cursor. */
- E_CANVAS_ITEM_SELECTION_DELETE_DATA = 1 << 2,
-};
-
-typedef struct {
- GnomeCanvasItem *item;
- gpointer id;
-} ECanvasSelectionInfo;
-
-struct _ECanvas
-{
- GnomeCanvas parent;
-
- int idle_id;
- GList *selection;
- ECanvasSelectionInfo *cursor;
-
- /* Input context for dead key support */
- GdkIC *ic;
- GdkICAttr *ic_attr;
-};
-
-struct _ECanvasClass
-{
- GnomeCanvasClass parent_class;
- void (* reflow) (ECanvas *canvas);
-};
-
-
-GtkType e_canvas_get_type (void);
-GtkWidget *e_canvas_new (void);
-
-/* Used to send all of the keystroke events to a specific item as well as
- * GDK_FOCUS_CHANGE events.
- */
-void e_canvas_item_grab_focus (GnomeCanvasItem *item);
-
-void e_canvas_item_request_reflow (GnomeCanvasItem *item);
-void e_canvas_item_request_parent_reflow (GnomeCanvasItem *item);
-void e_canvas_item_set_reflow_callback (GnomeCanvasItem *item, ECanvasItemReflowFunc func);
-
-void e_canvas_item_set_selection_callback (GnomeCanvasItem *item, ECanvasItemSelectionFunc func);
-void e_canvas_item_set_selection_compare_callback (GnomeCanvasItem *item, ECanvasItemSelectionCompareFunc func);
-
-void e_canvas_item_set_cursor (GnomeCanvasItem *item, gpointer id);
-void e_canvas_item_add_selection (GnomeCanvasItem *item, gpointer id);
-void e_canvas_item_remove_selection (GnomeCanvasItem *item, gpointer id);
-
-/* Not implemented yet. */
-void e_canvas_item_set_cursor_end (GnomeCanvasItem *item, gpointer id);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CANVAS_H__ */
diff --git a/widgets/misc/e-clipped-label.c b/widgets/misc/e-clipped-label.c
deleted file mode 100644
index 6f6fc9731d..0000000000
--- a/widgets/misc/e-clipped-label.c
+++ /dev/null
@@ -1,378 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * This is similar to GtkLabel but clips itself and displays '...' if it
- * can't fit inside its allocated area. The intended use is for inside buttons
- * that are a fixed size. The GtkLabel would normally display only the middle
- * part of the text, which doesn't look very good. This only supports one line
- * of text (so no wrapping/justification), without underlined characters.
- */
-
-#include <math.h>
-
-#include <gdk/gdki18n.h>
-#include <libgnome/gnome-defs.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "e-clipped-label.h"
-
-
-static void e_clipped_label_class_init (EClippedLabelClass *class);
-static void e_clipped_label_init (EClippedLabel *label);
-static void e_clipped_label_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void e_clipped_label_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static gint e_clipped_label_expose (GtkWidget *widget,
- GdkEventExpose *event);
-static void e_clipped_label_recalc_chars_displayed (EClippedLabel *label);
-static void e_clipped_label_destroy (GtkObject *object);
-
-
-static GtkMiscClass *parent_class;
-
-/* This is the string to draw when the label is clipped, e.g. '...'. */
-static gchar *e_clipped_label_ellipsis;
-
-/* Flags used in chars_displayed field. Must be negative. */
-#define E_CLIPPED_LABEL_NEED_RECALC -1
-#define E_CLIPPED_LABEL_SHOW_ENTIRE_LABEL -2
-
-
-GtkType
-e_clipped_label_get_type (void)
-{
- static GtkType e_clipped_label_type = 0;
-
- if (!e_clipped_label_type){
- GtkTypeInfo e_clipped_label_info = {
- "EClippedLabel",
- sizeof (EClippedLabel),
- sizeof (EClippedLabelClass),
- (GtkClassInitFunc) e_clipped_label_class_init,
- (GtkObjectInitFunc) e_clipped_label_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- parent_class = gtk_type_class (GTK_TYPE_MISC);
- e_clipped_label_type = gtk_type_unique (GTK_TYPE_MISC,
- &e_clipped_label_info);
- }
-
- return e_clipped_label_type;
-}
-
-
-static void
-e_clipped_label_class_init (EClippedLabelClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
-
- /* Method override */
- widget_class->size_request = e_clipped_label_size_request;
- widget_class->size_allocate = e_clipped_label_size_allocate;
- widget_class->expose_event = e_clipped_label_expose;
-
- object_class->destroy = e_clipped_label_destroy;
-
- e_clipped_label_ellipsis = _("...");
-}
-
-
-static void
-e_clipped_label_init (EClippedLabel *label)
-{
- GTK_WIDGET_SET_FLAGS (label, GTK_NO_WINDOW);
-
- label->label = NULL;
- label->label_wc = NULL;
- label->chars_displayed = E_CLIPPED_LABEL_NEED_RECALC;
-}
-
-
-/**
- * e_clipped_label_new:
- *
- * @text: The label text.
- * @Returns: A new #EClippedLabel.
- *
- * Creates a new #EClippedLabel with the given text.
- **/
-GtkWidget *
-e_clipped_label_new (const gchar *text)
-{
- GtkWidget *label;
-
- label = GTK_WIDGET (gtk_type_new (e_clipped_label_get_type ()));
-
- if (text && *text)
- e_clipped_label_set_text (E_CLIPPED_LABEL (label), text);
-
- return label;
-}
-
-
-static void
-e_clipped_label_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- EClippedLabel *label;
- GdkFont *font;
-
- g_return_if_fail (E_IS_CLIPPED_LABEL (widget));
- g_return_if_fail (requisition != NULL);
-
- label = E_CLIPPED_LABEL (widget);
- font = widget->style->font;
-
- requisition->width = 0;
- requisition->height = font->ascent + font->descent
- + 2 * GTK_MISC (widget)->ypad;
-}
-
-
-static void
-e_clipped_label_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- EClippedLabel *label;
-
- label = E_CLIPPED_LABEL (widget);
-
- widget->allocation = *allocation;
-
- /* Flag that we need to recalculate how many characters to display. */
- label->chars_displayed = E_CLIPPED_LABEL_NEED_RECALC;
-}
-
-
-static gint
-e_clipped_label_expose (GtkWidget *widget,
- GdkEventExpose *event)
-{
- EClippedLabel *label;
- GtkMisc *misc;
- gint x, y;
- GdkFont *font;
- gchar *tmp_str, tmp_ch;
-
- g_return_val_if_fail (E_IS_CLIPPED_LABEL (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- label = E_CLIPPED_LABEL (widget);
- misc = GTK_MISC (widget);
- font = widget->style->font;
-
- /* If the label isn't visible or has no text, just return. */
- if (!GTK_WIDGET_VISIBLE (widget) || !GTK_WIDGET_MAPPED (widget)
- || !label->label || (*label->label == '\0'))
- return TRUE;
-
- /* Recalculate the number of characters displayed, if necessary. */
- if (label->chars_displayed == E_CLIPPED_LABEL_NEED_RECALC)
- e_clipped_label_recalc_chars_displayed (label);
-
- /*
- * GC Clipping
- */
- gdk_gc_set_clip_rectangle (widget->style->white_gc,
- &event->area);
- gdk_gc_set_clip_rectangle (widget->style->fg_gc[widget->state],
- &event->area);
-
- y = floor (widget->allocation.y + (gint)misc->ypad
- + (((gint)widget->allocation.height - 2 * (gint)misc->ypad
- - (gint)font->ascent - font->descent)
- * misc->yalign) + 0.5) + font->ascent;
-
- if (label->chars_displayed == E_CLIPPED_LABEL_SHOW_ENTIRE_LABEL) {
- x = floor (widget->allocation.x + (gint)misc->xpad
- + (((gint)widget->allocation.width -
- (gint)label->label_width - 2 * (gint)misc->xpad)
- * misc->xalign) + 0.5);
-
- gtk_paint_string (widget->style, widget->window, widget->state,
- &event->area, widget, "label",
- x, y, label->label);
- } else {
- x = widget->allocation.x + (gint)misc->xpad;
-
- tmp_ch = label->label_wc[label->chars_displayed];
- label->label_wc[label->chars_displayed] = '\0';
- tmp_str = gdk_wcstombs (label->label_wc);
- if (tmp_str) {
- gtk_paint_string (widget->style, widget->window,
- widget->state, &event->area,
- widget, "label",
- x, y, tmp_str);
- g_free (tmp_str);
- }
- label->label_wc[label->chars_displayed] = tmp_ch;
-
- x = widget->allocation.x + (gint)misc->xpad
- + label->ellipsis_x;
- gtk_paint_string (widget->style, widget->window, widget->state,
- &event->area, widget, "label",
- x, y, e_clipped_label_ellipsis);
- }
-
- gdk_gc_set_clip_mask (widget->style->white_gc, NULL);
- gdk_gc_set_clip_mask (widget->style->fg_gc[widget->state], NULL);
-
- return TRUE;
-}
-
-
-static void
-e_clipped_label_destroy (GtkObject *object)
-{
- EClippedLabel *label;
-
- g_return_if_fail (E_IS_CLIPPED_LABEL (object));
-
- label = E_CLIPPED_LABEL(object);
-
- g_free (label->label);
- g_free (label->label_wc);
-}
-
-
-/**
- * e_clipped_label_get_text:
- *
- * @label: An #EClippedLabel.
- * @Return: The label text.
- *
- * Returns the label text, or NULL.
- **/
-gchar*
-e_clipped_label_get_text (EClippedLabel *label)
-{
- g_return_val_if_fail (E_IS_CLIPPED_LABEL (label), NULL);
-
- return label->label;
-}
-
-
-/**
- * e_clipped_label_set_text:
- *
- * @label: An #EClippedLabel.
- * @text: The new label text.
- *
- * Sets the label text.
- **/
-void
-e_clipped_label_set_text (EClippedLabel *label,
- const gchar *text)
-{
- gint len;
-
- g_return_if_fail (E_IS_CLIPPED_LABEL (label));
-
- if (label->label != text || !label->label || !text
- || strcmp (label->label, text)) {
- g_free (label->label);
- g_free (label->label_wc);
- label->label = NULL;
- label->label_wc = NULL;
-
- if (text) {
- label->label = g_strdup (text);
- len = strlen (text);
- label->label_wc = g_new (GdkWChar, len + 1);
- label->wc_len = gdk_mbstowcs (label->label_wc,
- label->label, len + 1);
- label->label_wc[label->wc_len] = '\0';
- }
-
- /* Reset the number of characters displayed, so it is
- recalculated when needed. */
- label->chars_displayed = E_CLIPPED_LABEL_NEED_RECALC;
-
- /* We don't queue a resize, since the label should not affect
- the widget size, but we queue a draw. */
- gtk_widget_queue_draw (GTK_WIDGET (label));
- }
-}
-
-
-static void
-e_clipped_label_recalc_chars_displayed (EClippedLabel *label)
-{
- GdkFont *font;
- gint max_width, width, ch, last_width;
-
- font = GTK_WIDGET (label)->style->font;
-
- max_width = GTK_WIDGET (label)->allocation.width
- - 2 * GTK_MISC (label)->xpad;
-
- if (!label->label) {
- label->chars_displayed = 0;
- return;
- }
-
- /* See if the entire label fits in the allocated width. */
- label->label_width = gdk_string_width (font, label->label);
- if (label->label_width <= max_width) {
- label->chars_displayed = E_CLIPPED_LABEL_SHOW_ENTIRE_LABEL;
- return;
- }
-
- /* Calculate the width of the ellipsis string. */
- max_width -= gdk_string_measure (font, e_clipped_label_ellipsis);
-
- if (max_width <= 0) {
- label->chars_displayed = 0;
- label->ellipsis_x = 0;
- return;
- }
-
- /* Step through the wide-char label, adding on the widths of the
- characters, until we can't fit any more in. */
- width = last_width = 0;
- for (ch = 0; ch < label->wc_len; ch++) {
- width += gdk_char_width_wc (font, label->label_wc[ch]);
-
- if (width > max_width) {
- label->chars_displayed = ch;
- label->ellipsis_x = last_width;
- return;
- }
-
- last_width = width;
- }
-
- g_warning ("Clipped label width not exceeded as expected");
- label->chars_displayed = E_CLIPPED_LABEL_SHOW_ENTIRE_LABEL;
-}
-
diff --git a/widgets/misc/e-clipped-label.h b/widgets/misc/e-clipped-label.h
deleted file mode 100644
index a21ceadeca..0000000000
--- a/widgets/misc/e-clipped-label.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * This is similar to GtkLabel but clips itself and displays '...' if it
- * can't fit inside its allocated area. The intended use is for inside buttons
- * that are a fixed size. The GtkLabel would normally display only the middle
- * part of the text, which doesn't look very good. This only supports one line
- * of text (so no wrapping/justification), without underlined characters.
- */
-#ifndef _E_CLIPPED_LABEL_H_
-#define _E_CLIPPED_LABEL_H_
-
-#include <gtk/gtkmisc.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define E_CLIPPED_LABEL(obj) GTK_CHECK_CAST (obj, e_clipped_label_get_type (), EClippedLabel)
-#define E_CLIPPED_LABEL_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_clipped_label_get_type (), EClippedLabelClass)
-#define E_IS_CLIPPED_LABEL(obj) GTK_CHECK_TYPE (obj, e_clipped_label_get_type ())
-
-
-typedef struct _EClippedLabel EClippedLabel;
-typedef struct _EClippedLabelClass EClippedLabelClass;
-
-struct _EClippedLabel
-{
- GtkMisc misc;
-
- gchar *label;
- GdkWChar *label_wc;
-
- /* This is the number of wide characters in the label. */
- gint wc_len;
-
- /* This is the width of the entire label string, in pixels. */
- gint label_width;
-
- /* This is the number of characters we can fit in, or
- E_CLIPPED_LABEL_NEED_RECALC if it needs to be recalculated, or
- E_CLIPPED_LABEL_SHOW_ENTIRE_LABEL to show the entire label. */
- gint chars_displayed;
-
- /* This is the x position to display the ellipsis string, e.g. '...',
- relative to the start of the label. */
- gint ellipsis_x;
-};
-
-struct _EClippedLabelClass
-{
- GtkMiscClass parent_class;
-};
-
-
-GtkType e_clipped_label_get_type (void);
-GtkWidget* e_clipped_label_new (const gchar *text);
-
-gchar* e_clipped_label_get_text (EClippedLabel *label);
-void e_clipped_label_set_text (EClippedLabel *label,
- const gchar *text);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_CLIPPED_LABEL_H_ */
diff --git a/widgets/misc/e-colors.c b/widgets/misc/e-colors.c
deleted file mode 100644
index ba86538dab..0000000000
--- a/widgets/misc/e-colors.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * color.c: Color allocation on the Gnumeric spreadsheet
- *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- *
- * We keep our own color context, as the color allocation might take place
- * before any of our Canvases are realized.
- */
-#include <config.h>
-#include <gnome.h>
-#include "color.h"
-
-static int color_inited;
-static GdkColorContext *gnumeric_color_context;
-
-/* Public colors: shared by all of our items in Gnumeric */
-GdkColor gs_white, gs_black, gs_light_gray, gs_dark_gray, gs_red, gs_lavender;
-
-int
-color_alloc (gushort red, gushort green, gushort blue)
-{
- int failed;
-
- if (!color_inited)
- color_init ();
-
- return gdk_color_context_get_pixel (gnumeric_color_context,
- red, green, blue, &failed);
-}
-
-void
-color_alloc_gdk (GdkColor *c)
-{
- int failed;
-
- g_return_if_fail (c != NULL);
-
- c->pixel = gdk_color_context_get_pixel (gnumeric_color_context, c->red, c->green, c->blue, &failed);
-}
-
-void
-color_alloc_name (const char *name, GdkColor *c)
-{
- int failed;
-
- g_return_if_fail (name != NULL);
- g_return_if_fail (c != NULL);
-
- gdk_color_parse (name, c);
- c->pixel = 0;
- c->pixel = gdk_color_context_get_pixel (gnumeric_color_context, c->red, c->green, c->blue, &failed);
-}
-
-void
-color_init (void)
-{
- GdkColormap *colormap = gtk_widget_get_default_colormap ();
-
- /* Initialize the color context */
- gnumeric_color_context = gdk_color_context_new (
- gtk_widget_get_default_visual (), colormap);
-
- /* Allocate the default colors */
- gdk_color_white (colormap, &gs_white);
- gdk_color_black (colormap, &gs_black);
-
- color_alloc_name ("gray78", &gs_light_gray);
- color_alloc_name ("gray20", &gs_dark_gray);
- color_alloc_name ("red", &gs_red);
- color_alloc_name ("lavender",&gs_lavender);
-
- color_inited = 1;
-}
diff --git a/widgets/misc/e-colors.h b/widgets/misc/e-colors.h
deleted file mode 100644
index 4a2cb74c73..0000000000
--- a/widgets/misc/e-colors.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef GNUMERIC_COLOR_H
-#define GNUMERIC_COLOR_H
-
-void color_init (void);
-
-/* Return the pixel value for the given red, green and blue */
-int color_alloc (gushort red, gushort green, gushort blue);
-void color_alloc_name (const char *name, GdkColor *color);
-void color_alloc_gdk (GdkColor *color);
-
-/* Colors used by any GnumericSheet item */
-extern GdkColor gs_white, gs_light_gray, gs_dark_gray, gs_black, gs_red, gs_lavender;
-
-#endif /* GNUMERIC_COLOR_H */
diff --git a/widgets/misc/e-cursors.c b/widgets/misc/e-cursors.c
deleted file mode 100644
index 597c3c1787..0000000000
--- a/widgets/misc/e-cursors.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef GNUMERIC_CURSORS_H
-#define GNUMERIC_CURSORS_H
-
-typedef enum {
- GNUMERIC_CURSOR_FAT_CROSS,
- GNUMERIC_CURSOR_THIN_CROSS,
- GNUMERIC_CURSOR_ARROW,
- GNUMERIC_CURSOR_MOVE,
- GNUMERIC_CURSOR_ZOOM_IN,
- GNUMERIC_CURSOR_ZOOM_OUT,
- GNUMERIC_CURSOR_SIZE_X,
- GNUMERIC_CURSOR_SIZE_Y,
- GNUMERIC_CURSOR_SIZE_TL,
- GNUMERIC_CURSOR_SIZE_TR,
- GNUMERIC_CURSOR_PRESS,
- GNUMERIC_CURSOR_HAND_OPEN,
- GNUMERIC_CURSOR_HAND_CLOSED,
- GNUMERIC_CURSOR_NUM_CURSORS
-} CursorType;
-
-void cursors_init (void);
-void cursors_shutdown (void);
-
-#define cursor_set(win, c) \
-G_STMT_START { \
- if (win) \
- gdk_window_set_cursor (win, cursor_get (c)); \
-} G_STMT_END
-
-#define cursor_set_widget(w, c) \
-G_STMT_START { \
- if (GTK_WIDGET (w)->window) \
- gdk_window_set_cursor (GTK_WIDGET (w)->window, cursor_get (c)); \
-} G_STMT_END
-
-GdkCursor *cursor_get (CursorType type);
-
-#endif /* GNUMERIC_CURSORS_H */
diff --git a/widgets/misc/e-cursors.h b/widgets/misc/e-cursors.h
deleted file mode 100644
index 597c3c1787..0000000000
--- a/widgets/misc/e-cursors.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef GNUMERIC_CURSORS_H
-#define GNUMERIC_CURSORS_H
-
-typedef enum {
- GNUMERIC_CURSOR_FAT_CROSS,
- GNUMERIC_CURSOR_THIN_CROSS,
- GNUMERIC_CURSOR_ARROW,
- GNUMERIC_CURSOR_MOVE,
- GNUMERIC_CURSOR_ZOOM_IN,
- GNUMERIC_CURSOR_ZOOM_OUT,
- GNUMERIC_CURSOR_SIZE_X,
- GNUMERIC_CURSOR_SIZE_Y,
- GNUMERIC_CURSOR_SIZE_TL,
- GNUMERIC_CURSOR_SIZE_TR,
- GNUMERIC_CURSOR_PRESS,
- GNUMERIC_CURSOR_HAND_OPEN,
- GNUMERIC_CURSOR_HAND_CLOSED,
- GNUMERIC_CURSOR_NUM_CURSORS
-} CursorType;
-
-void cursors_init (void);
-void cursors_shutdown (void);
-
-#define cursor_set(win, c) \
-G_STMT_START { \
- if (win) \
- gdk_window_set_cursor (win, cursor_get (c)); \
-} G_STMT_END
-
-#define cursor_set_widget(w, c) \
-G_STMT_START { \
- if (GTK_WIDGET (w)->window) \
- gdk_window_set_cursor (GTK_WIDGET (w)->window, cursor_get (c)); \
-} G_STMT_END
-
-GdkCursor *cursor_get (CursorType type);
-
-#endif /* GNUMERIC_CURSORS_H */
diff --git a/widgets/misc/e-gui-utils.c b/widgets/misc/e-gui-utils.c
deleted file mode 100644
index 2e31eb101b..0000000000
--- a/widgets/misc/e-gui-utils.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * GUI utility functions
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- *
- * (C) 1999 Miguel de Icaza
- * (C) 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <libgnomeui/gnome-messagebox.h>
-#include <libgnomeui/gnome-stock.h>
-#include <gnome.h>
-#include "e-gui-utils.h"
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
-
-void
-e_notice (GtkWindow *window, const char *type, const char *format, ...)
-{
- GtkWidget *dialog;
- va_list args;
- char *str;
-
- va_start (args, format);
- str = g_strdup_vprintf (format, args);
- dialog = gnome_message_box_new (str, type, GNOME_STOCK_BUTTON_OK, NULL);
- va_end (args);
- g_free (str);
-
- if (window)
- gnome_dialog_set_parent (GNOME_DIALOG (dialog), window);
-
- gnome_dialog_run (GNOME_DIALOG (dialog));
-}
-
-static void
-kill_popup_menu (GtkWidget *widget, GtkMenu *menu)
-{
- g_return_if_fail (menu != NULL);
- g_return_if_fail (GTK_IS_MENU (menu));
-
- gtk_object_unref (GTK_OBJECT (menu));
-}
-
-void
-e_auto_kill_popup_menu_on_hide (GtkMenu *menu)
-{
- g_return_if_fail (menu != NULL);
- g_return_if_fail (GTK_IS_MENU (menu));
-
- gtk_signal_connect (GTK_OBJECT (menu), "hide",
- GTK_SIGNAL_FUNC (kill_popup_menu), menu);
-}
-
-void
-e_popup_menu (GtkMenu *menu, GdkEventButton *event)
-{
- g_return_if_fail (menu != NULL);
- g_return_if_fail (GTK_IS_MENU (menu));
-
- e_auto_kill_popup_menu_on_hide (menu);
- gtk_menu_popup (menu, NULL, NULL, 0, NULL, event->button, event->time);
-}
-
-GtkWidget *e_create_image_widget(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2)
-{
- char *filename;
- GdkPixbuf *pixbuf;
- double width, height;
- GtkWidget *canvas, *alignment;
- if (string1) {
- if (*string1 == '/')
- filename = g_strdup(string1);
- else
- filename = g_concat_dir_and_file(EVOLUTION_IMAGES, string1);
- pixbuf = gdk_pixbuf_new_from_file(filename);
- width = gdk_pixbuf_get_width(pixbuf);
- height = gdk_pixbuf_get_height(pixbuf);
-
- canvas = gnome_canvas_new_aa();
- GTK_OBJECT_UNSET_FLAGS(GTK_WIDGET(canvas), GTK_CAN_FOCUS);
- gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(canvas)),
- gnome_canvas_pixbuf_get_type(),
-
- "pixbuf", pixbuf,
- NULL);
-
- alignment = gtk_widget_new(gtk_alignment_get_type(),
- "child", canvas,
- "xalign", (double) 0,
- "yalign", (double) 0,
- "xscale", (double) 0,
- "yscale", (double) 0,
- NULL);
-
- gtk_widget_set_usize(canvas, width, height);
-
- gdk_pixbuf_unref(pixbuf);
-
- gtk_widget_show(canvas);
- gtk_widget_show(alignment);
- g_free(filename);
-
- return alignment;
- } else
- return NULL;
-}
-
-typedef struct {
- GtkCallback callback;
- gpointer closure;
-} CallbackClosure;
-
-static void
-e_container_foreach_leaf_callback(GtkWidget *widget, CallbackClosure *callback_closure)
-{
- if (GTK_IS_CONTAINER(widget)) {
- e_container_foreach_leaf(GTK_CONTAINER(widget), callback_closure->callback, callback_closure->closure);
- } else {
- (*callback_closure->callback) (widget, callback_closure->closure);
- }
-}
-
-void
-e_container_foreach_leaf(GtkContainer *container,
- GtkCallback callback,
- gpointer closure)
-{
- CallbackClosure callback_closure;
- callback_closure.callback = callback;
- callback_closure.closure = closure;
- gtk_container_foreach(container, (GtkCallback) e_container_foreach_leaf_callback, &callback_closure);
-}
-
-static void
-e_container_change_tab_order_destroy_notify(gpointer data)
-{
- GList *list = data;
- g_list_foreach(list, (GFunc) gtk_object_unref, NULL);
- g_list_free(list);
-}
-
-
-static gint
-e_container_change_tab_order_callback(GtkContainer *container,
- GtkDirectionType direction,
- GList *children)
-{
- GtkWidget *focus_child;
- GtkWidget *child;
-
- if (direction != GTK_DIR_TAB_FORWARD &&
- direction != GTK_DIR_TAB_BACKWARD)
- return FALSE;
-
- focus_child = container->focus_child;
-
- if (direction == GTK_DIR_TAB_BACKWARD) {
- children = g_list_last(children);
- }
-
- while (children) {
- child = children->data;
- if (direction == GTK_DIR_TAB_FORWARD)
- children = children->next;
- else
- children = children->prev;
-
- if (!child)
- continue;
-
- if (focus_child) {
- if (focus_child == child) {
- focus_child = NULL;
-
- if (GTK_WIDGET_DRAWABLE (child) &&
- GTK_IS_CONTAINER (child) &&
- !GTK_WIDGET_HAS_FOCUS (child))
- if (gtk_container_focus (GTK_CONTAINER (child), direction)) {
- gtk_signal_emit_stop_by_name(GTK_OBJECT(container), "focus");
- return TRUE;
- }
- }
- }
- else if (GTK_WIDGET_DRAWABLE (child)) {
- if (GTK_IS_CONTAINER (child)) {
- if (gtk_container_focus (GTK_CONTAINER (child), direction)) {
- gtk_signal_emit_stop_by_name(GTK_OBJECT(container), "focus");
- return TRUE;
- }
- }
- else if (GTK_WIDGET_CAN_FOCUS (child)) {
- gtk_widget_grab_focus (child);
- gtk_signal_emit_stop_by_name(GTK_OBJECT(container), "focus");
- return TRUE;
- }
- }
- }
-
- return FALSE;
-}
-
-gint
-e_container_change_tab_order(GtkContainer *container, GList *widgets)
-{
- GList *list;
- list = g_list_copy(widgets);
- g_list_foreach(list, (GFunc) gtk_object_ref, NULL);
- return gtk_signal_connect_full(GTK_OBJECT(container), "focus",
- GTK_SIGNAL_FUNC(e_container_change_tab_order_callback),
- NULL, list,
- e_container_change_tab_order_destroy_notify,
- FALSE, FALSE);
-}
diff --git a/widgets/misc/e-gui-utils.h b/widgets/misc/e-gui-utils.h
deleted file mode 100644
index 1d47a7b514..0000000000
--- a/widgets/misc/e-gui-utils.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef E_GUI_UTILS_H
-#define E_GUI_UTILS_H
-
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkwindow.h>
-
-#include <libgnomeui/gnome-messagebox.h>
-
-void e_popup_menu (GtkMenu *menu, GdkEventButton *event);
-void e_auto_kill_popup_menu_on_hide (GtkMenu *menu);
-void e_notice (GtkWindow *window, const char *type, const char *format, ...);
-GtkWidget *e_create_image_widget (gchar *name, gchar *string1, gchar *string2, gint int1, gint int2);
-void e_container_foreach_leaf (GtkContainer *container,
- GtkCallback callback,
- gpointer closure);
-gint e_container_change_tab_order (GtkContainer *container,
- GList *widgets);
-
-#endif /* E_GUI_UTILS_H */
diff --git a/widgets/misc/e-popup-menu.c b/widgets/misc/e-popup-menu.c
deleted file mode 100644
index 3fb382ae20..0000000000
--- a/widgets/misc/e-popup-menu.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-popup-menu.c: popup menu display
-nnn *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- * Jody Goldberg (jgoldberg@home.com)
- *
- * (C) 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gnome.h>
-#include "e-popup-menu.h"
-#include "e-gui-utils.h"
-
-/*
- * Creates an item with an optional icon
- */
-static GtkWidget *
-make_item (GtkMenu *menu, const char *name, const char *pixname)
-{
- GtkWidget *label, *item;
- guint label_accel;
-
- if (*name == '\0')
- return gtk_menu_item_new ();
-
- /*
- * Ugh. This needs to go into Gtk+
- */
- label = gtk_accel_label_new ("");
- label_accel = gtk_label_parse_uline (GTK_LABEL (label), name);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_widget_show (label);
-
- item = gtk_pixmap_menu_item_new ();
- gtk_container_add (GTK_CONTAINER (item), label);
-
- if (label_accel != GDK_VoidSymbol){
- gtk_widget_add_accelerator (
- item,
- "activate_item",
- gtk_menu_ensure_uline_accel_group (GTK_MENU (menu)),
- label_accel, 0,
- GTK_ACCEL_LOCKED);
- }
-
- if (pixname){
- GtkWidget *pixmap = gnome_stock_pixmap_widget (item, pixname);
-
- gtk_widget_show (pixmap);
- gtk_pixmap_menu_item_set_pixmap (
- GTK_PIXMAP_MENU_ITEM (item), pixmap);
- }
-
- return item;
-}
-
-GtkMenu *
-e_popup_menu_create (EPopupMenu *menu_list, int disable_mask, int hide_mask, void *closure)
-{
- GtkMenu *menu = GTK_MENU (gtk_menu_new ());
- int i;
- gboolean last_item_seperator = TRUE;
- gint last_non_seperator = -1;
-
- for (i = 0; menu_list[i].name; i++) {
- if (strcmp("", menu_list[i].name) && !(menu_list [i].disable_mask & hide_mask)) {
- last_non_seperator = i;
- }
- }
-
- for (i = 0; i <= last_non_seperator; i++) {
- GtkWidget *item;
- gboolean seperator;
-
- seperator = !strcmp("", menu_list[i].name);
-
- if ((!(seperator && last_item_seperator)) && !(menu_list [i].disable_mask & hide_mask)) {
-
- item = make_item (menu, menu_list [i].name,
- menu_list [i].pixname);
-
- if (menu_list [i].fn)
- gtk_signal_connect (
- GTK_OBJECT (item), "activate",
- GTK_SIGNAL_FUNC (menu_list [i].fn),
- closure);
-
- if (menu_list [i].disable_mask & disable_mask)
- gtk_widget_set_sensitive (item, FALSE);
-
- gtk_widget_show (item);
- gtk_menu_append (menu, item);
- }
- last_item_seperator = seperator;
- }
-
- return menu;
-}
-
-void
-e_popup_menu_run (EPopupMenu *menu_list, GdkEventButton *event, int disable_mask, int hide_mask, void *closure)
-{
- GtkMenu *menu;
-
- g_return_if_fail (menu_list != NULL);
- g_return_if_fail (event != NULL);
-
- menu = e_popup_menu_create (menu_list, disable_mask, hide_mask, closure);
-
- e_popup_menu (menu, event);
-}
-
diff --git a/widgets/misc/e-popup-menu.h b/widgets/misc/e-popup-menu.h
deleted file mode 100644
index ed54a632a5..0000000000
--- a/widgets/misc/e-popup-menu.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef E_POPUP_MENU_H
-#define E_POPUP_MENU_H
-
-#include <gtk/gtkwidget.h>
-
-typedef struct {
- char const * const name;
- char const * const pixname;
- void (*fn)(GtkWidget *widget, void *closure);
- int disable_mask;
-} EPopupMenu;
-
-GtkMenu *e_popup_menu_create (EPopupMenu *menu_list,
- int disable_mask,
- int hide_mask,
- void *closure);
-
-void e_popup_menu_run (EPopupMenu *menu_list,
- GdkEventButton *event,
- int disable_mask,
- int hide_mask,
- void *closure);
-
-#endif /* E_POPUP_MENU_H */
diff --git a/widgets/misc/e-printable.c b/widgets/misc/e-printable.c
deleted file mode 100644
index ed982469b8..0000000000
--- a/widgets/misc/e-printable.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-printable.c: an object printer.
- *
- * Author:
- * Christopher James Lahey <clahey@helixcode.com>
- *
- * (C) 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-util.h"
-#include "e-printable.h"
-
-#define EP_CLASS(e) ((EPrintableClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE gtk_object_get_type ()
-
-
-static GtkObjectClass *e_printable_parent_class;
-
-enum {
- PRINT_PAGE,
- DATA_LEFT,
- RESET,
- HEIGHT,
- WILL_FIT,
- LAST_SIGNAL
-};
-
-static guint e_printable_signals [LAST_SIGNAL] = { 0, };
-
-static void
-e_printable_class_init (GtkObjectClass *object_class)
-{
- EPrintableClass *klass = E_PRINTABLE_CLASS(object_class);
- e_printable_parent_class = gtk_type_class (PARENT_TYPE);
-
- e_printable_signals [PRINT_PAGE] =
- gtk_signal_new ("print_page",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EPrintableClass, print_page),
- e_marshal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL,
- GTK_TYPE_NONE, 4, GTK_TYPE_OBJECT, GTK_TYPE_DOUBLE, GTK_TYPE_DOUBLE, GTK_TYPE_BOOL);
-
- e_printable_signals [DATA_LEFT] =
- gtk_signal_new ("data_left",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EPrintableClass, data_left),
- gtk_marshal_BOOL__NONE,
- GTK_TYPE_BOOL, 0, GTK_TYPE_NONE);
-
- e_printable_signals [RESET] =
- gtk_signal_new ("reset",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EPrintableClass, reset),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0, GTK_TYPE_NONE);
-
- e_printable_signals [HEIGHT] =
- gtk_signal_new ("height",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EPrintableClass, height),
- e_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL,
- GTK_TYPE_DOUBLE, 4, GTK_TYPE_OBJECT, GTK_TYPE_DOUBLE, GTK_TYPE_DOUBLE, GTK_TYPE_BOOL);
-
- e_printable_signals [WILL_FIT] =
- gtk_signal_new ("will_fit",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EPrintableClass, will_fit),
- e_marshal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL,
- GTK_TYPE_BOOL, 4, GTK_TYPE_OBJECT, GTK_TYPE_DOUBLE, GTK_TYPE_DOUBLE, GTK_TYPE_BOOL);
-
- gtk_object_class_add_signals (object_class, e_printable_signals, LAST_SIGNAL);
-
- klass->print_page = NULL;
- klass->data_left = NULL;
- klass->reset = NULL;
- klass->height = NULL;
- klass->will_fit = NULL;
-}
-
-
-guint
-e_printable_get_type (void)
-{
- static guint type = 0;
-
- if (!type)
- {
- GtkTypeInfo info =
- {
- "EPrintable",
- sizeof (EPrintable),
- sizeof (EPrintableClass),
- (GtkClassInitFunc) e_printable_class_init,
- NULL,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
-
-EPrintable *
-e_printable_new(void)
-{
- return E_PRINTABLE(gtk_type_new(e_printable_get_type()));
-}
-
-void
-e_printable_print_page (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble height,
- gboolean quantized)
-{
- g_return_if_fail (e_printable != NULL);
- g_return_if_fail (E_IS_PRINTABLE (e_printable));
-
- gtk_signal_emit (GTK_OBJECT (e_printable),
- e_printable_signals [PRINT_PAGE],
- context,
- width,
- height,
- quantized);
-}
-
-gboolean
-e_printable_data_left (EPrintable *e_printable)
-{
- gboolean ret_val;
-
- g_return_val_if_fail (e_printable != NULL, FALSE);
- g_return_val_if_fail (E_IS_PRINTABLE (e_printable), FALSE);
-
- gtk_signal_emit (GTK_OBJECT (e_printable),
- e_printable_signals [DATA_LEFT],
- &ret_val);
-
- return ret_val;
-}
-
-void
-e_printable_reset (EPrintable *e_printable)
-{
- g_return_if_fail (e_printable != NULL);
- g_return_if_fail (E_IS_PRINTABLE (e_printable));
-
- gtk_signal_emit (GTK_OBJECT (e_printable),
- e_printable_signals [RESET]);
-}
-
-gdouble
-e_printable_height (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantized)
-{
- gdouble ret_val;
-
- g_return_val_if_fail (e_printable != NULL, -1);
- g_return_val_if_fail (E_IS_PRINTABLE (e_printable), -1);
-
- gtk_signal_emit (GTK_OBJECT (e_printable),
- e_printable_signals [HEIGHT],
- context,
- width,
- max_height,
- quantized,
- &ret_val);
-
- return ret_val;
-}
-
-gboolean
-e_printable_will_fit (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantized)
-{
- gboolean ret_val;
-
- g_return_val_if_fail (e_printable != NULL, -1);
- g_return_val_if_fail (E_IS_PRINTABLE (e_printable), -1);
-
- gtk_signal_emit (GTK_OBJECT (e_printable),
- e_printable_signals [WILL_FIT],
- context,
- width,
- max_height,
- quantized,
- &ret_val);
-
- return ret_val;
-}
diff --git a/widgets/misc/e-printable.h b/widgets/misc/e-printable.h
deleted file mode 100644
index 18e6ec8472..0000000000
--- a/widgets/misc/e-printable.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-printable.h: an object printer.
- *
- * Author:
- * Christopher James Lahey <clahey@helixcode.com>
- *
- * (C) 2000 Helix Code, Inc.
- */
-#ifndef _E_PRINTABLE_H_
-#define _E_PRINTABLE_H_
-
-#include <gtk/gtkobject.h>
-#include <libgnomeprint/gnome-print.h>
-
-#define E_PRINTABLE_TYPE (e_printable_get_type ())
-#define E_PRINTABLE(o) (GTK_CHECK_CAST ((o), E_PRINTABLE_TYPE, EPrintable))
-#define E_PRINTABLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_PRINTABLE_TYPE, EPrintableClass))
-#define E_IS_PRINTABLE(o) (GTK_CHECK_TYPE ((o), E_PRINTABLE_TYPE))
-#define E_IS_PRINTABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_PRINTABLE_TYPE))
-
-typedef struct {
- GtkObject base;
-} EPrintable;
-
-typedef struct {
- GtkObjectClass parent_class;
-
- /*
- * Signals
- */
-
- void (*print_page) (EPrintable *etm, GnomePrintContext *context, gdouble width, gdouble height, gboolean quantized);
- gboolean (*data_left) (EPrintable *etm);
- void (*reset) (EPrintable *etm);
- gdouble (*height) (EPrintable *etm, GnomePrintContext *context, gdouble width, gdouble max_height, gboolean quantized);
-
- /* e_printable_will_fit (ep, ...) should be equal in value to
- * (e_printable_print_page (ep, ...),
- * !e_printable_data_left(ep)) except that the latter has the
- * side effect of doing the printing and advancing the
- * position of the printable.
- */
-
- gboolean (*will_fit) (EPrintable *etm, GnomePrintContext *context, gdouble width, gdouble max_height, gboolean quantized);
-} EPrintableClass;
-
-GtkType e_printable_get_type (void);
-
-EPrintable *e_printable_new (void);
-
-/*
- * Routines for emitting signals on the e_table */
-void e_printable_print_page (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble height,
- gboolean quantized);
-gboolean e_printable_data_left (EPrintable *e_printable);
-void e_printable_reset (EPrintable *e_printable);
-gdouble e_printable_height (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantized);
-gboolean e_printable_will_fit (EPrintable *e_printable,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantized);
-
-#endif /* _E_PRINTABLE_H_ */
diff --git a/widgets/misc/e-reflow.c b/widgets/misc/e-reflow.c
deleted file mode 100644
index 0e9c8b92b1..0000000000
--- a/widgets/misc/e-reflow.c
+++ /dev/null
@@ -1,859 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-reflow.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <math.h>
-#include "e-reflow.h"
-#include "e-text.h"
-#include <e-util/e-canvas-utils.h>
-#include <e-util/e-canvas.h>
-#include <e-util/e-util.h>
-
-static void e_reflow_init (EReflow *reflow);
-static void e_reflow_class_init (EReflowClass *klass);
-static void e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_reflow_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_reflow_destroy (GtkObject *object);
-static gboolean e_reflow_event (GnomeCanvasItem *item, GdkEvent *event);
-static void e_reflow_realize (GnomeCanvasItem *item);
-static void e_reflow_unrealize (GnomeCanvasItem *item);
-static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-static void e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags);
-static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item);
-static void e_reflow_reflow (GnomeCanvasItem *item, int flags);
-static void e_reflow_real_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-static void set_empty(EReflow *e_reflow);
-
-static void e_reflow_resize_children (GnomeCanvasItem *item);
-
-#define E_REFLOW_DIVIDER_WIDTH 2
-#define E_REFLOW_BORDER_WIDTH 7
-#define E_REFLOW_FULL_GUTTER (E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH * 2)
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_MINIMUM_WIDTH,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_EMPTY_MESSAGE,
-};
-
-GtkType
-e_reflow_get_type (void)
-{
- static GtkType reflow_type = 0;
-
- if (!reflow_type)
- {
- static const GtkTypeInfo reflow_info =
- {
- "EReflow",
- sizeof (EReflow),
- sizeof (EReflowClass),
- (GtkClassInitFunc) e_reflow_class_init,
- (GtkObjectInitFunc) e_reflow_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- reflow_type = gtk_type_unique (gnome_canvas_group_get_type (), &reflow_info);
- }
-
- return reflow_type;
-}
-
-static void
-e_reflow_class_init (EReflowClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass*) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- gtk_object_add_arg_type ("EReflow::minimum_width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MINIMUM_WIDTH);
- gtk_object_add_arg_type ("EReflow::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_WIDTH);
- gtk_object_add_arg_type ("EReflow::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_HEIGHT);
- gtk_object_add_arg_type ("EReflow::empty_message", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_EMPTY_MESSAGE);
-
- klass->add_item = e_reflow_real_add_item;
-
- object_class->set_arg = e_reflow_set_arg;
- object_class->get_arg = e_reflow_get_arg;
- object_class->destroy = e_reflow_destroy;
-
- /* GnomeCanvasItem method overrides */
- item_class->event = e_reflow_event;
- item_class->realize = e_reflow_realize;
- item_class->unrealize = e_reflow_unrealize;
- item_class->draw = e_reflow_draw;
- item_class->update = e_reflow_update;
- item_class->point = e_reflow_point;
-}
-
-static void
-e_reflow_init (EReflow *reflow)
-{
- reflow->items = NULL;
- reflow->columns = NULL;
- reflow->column_width = 150;
-
- reflow->minimum_width = 10;
- reflow->width = 10;
- reflow->height = 10;
- reflow->idle = 0;
-
- reflow->empty_message = NULL;
- reflow->empty_text = NULL;
-
- reflow->column_drag = FALSE;
-
- reflow->need_height_update = FALSE;
- reflow->need_column_resize = FALSE;
-
- reflow->default_cursor_shown = TRUE;
- reflow->arrow_cursor = NULL;
- reflow->default_cursor = NULL;
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(reflow), e_reflow_reflow);
-}
-
-static void
-e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EReflow *e_reflow;
-
- item = GNOME_CANVAS_ITEM (o);
- e_reflow = E_REFLOW (o);
-
- switch (arg_id){
- case ARG_HEIGHT:
- e_reflow->height = GTK_VALUE_DOUBLE (*arg);
- e_canvas_item_request_reflow(item);
- break;
- case ARG_MINIMUM_WIDTH:
- e_reflow->minimum_width = GTK_VALUE_DOUBLE (*arg);
- if (GNOME_CANVAS_ITEM_REALIZED & GTK_OBJECT_FLAGS(o))
- set_empty(e_reflow);
- e_canvas_item_request_reflow(item);
- break;
- case ARG_EMPTY_MESSAGE:
- g_free(e_reflow->empty_message);
- e_reflow->empty_message = g_strdup(GTK_VALUE_STRING (*arg));
- if (GNOME_CANVAS_ITEM_REALIZED & GTK_OBJECT_FLAGS(o))
- set_empty(e_reflow);
- }
-}
-
-static void
-e_reflow_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (object);
-
- switch (arg_id) {
- case ARG_MINIMUM_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_reflow->minimum_width;
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = e_reflow->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = e_reflow->height;
- break;
- case ARG_EMPTY_MESSAGE:
- GTK_VALUE_STRING (*arg) = g_strdup(e_reflow->empty_message);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_reflow_destroy (GtkObject *object)
-{
- EReflow *reflow = E_REFLOW(object);
-
- g_list_foreach(reflow->items, (GFunc) gtk_object_unref, NULL);
- g_list_free(reflow->items);
- reflow->items = NULL;
-
- g_free(reflow->empty_message);
-
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
-}
-
-static void
-e_reflow_realize (GnomeCanvasItem *item)
-{
- EReflow *e_reflow;
- GnomeCanvasGroup *group;
- GList *list;
- GtkAdjustment *adjustment;
-
- e_reflow = E_REFLOW (item);
- group = GNOME_CANVAS_GROUP( item );
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
-
- e_reflow->arrow_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
- e_reflow->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
-
- for(list = e_reflow->items; list; list = g_list_next(list)) {
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(item,
- "width", (double) e_reflow->column_width,
- NULL);
- }
-
- set_empty(e_reflow);
-
- e_canvas_item_request_reflow(item);
-
- adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- adjustment->step_increment = (e_reflow->column_width + E_REFLOW_FULL_GUTTER) / 2;
- adjustment->page_increment = adjustment->page_size - adjustment->step_increment;
- gtk_adjustment_changed(adjustment);
-
- if (!item->canvas->aa) {
- }
-}
-
-static void
-e_reflow_unrealize (GnomeCanvasItem *item)
-{
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (item);
-
- if (!item->canvas->aa)
- {
- }
-
- gdk_cursor_destroy (e_reflow->arrow_cursor);
- gdk_cursor_destroy (e_reflow->default_cursor);
- e_reflow->arrow_cursor = NULL;
- e_reflow->default_cursor = NULL;
-
- g_list_free (e_reflow->columns);
- e_reflow->columns = NULL;
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item);
-}
-
-static gint
-e_reflow_pick_line (EReflow *e_reflow, double x)
-{
- x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- x /= e_reflow->column_width + E_REFLOW_FULL_GUTTER;
- return x;
-}
-
-static gboolean
-e_reflow_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (item);
-
- switch( event->type )
- {
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Tab ||
- event->key.keyval == GDK_KP_Tab ||
- event->key.keyval == GDK_ISO_Left_Tab) {
- GList *list;
- for (list = e_reflow->items; list; list = list->next) {
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (list->data);
- EFocus has_focus;
- gtk_object_get(GTK_OBJECT(item),
- "has_focus", &has_focus,
- NULL);
- if (has_focus) {
- if (event->key.state & GDK_SHIFT_MASK)
- list = list->prev;
- else
- list = list->next;
- if (list) {
- item = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(item,
- "has_focus", (event->key.state & GDK_SHIFT_MASK) ? E_FOCUS_END : E_FOCUS_START,
- NULL);
- return 1;
- } else {
- return 0;
- }
- }
- }
- }
- break;
- case GDK_BUTTON_PRESS:
- switch(event->button.button)
- {
- case 1:
- {
- GdkEventButton *button = (GdkEventButton *) event;
- double n_x, max_x;
- n_x = button->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
-
- max_x = E_REFLOW_BORDER_WIDTH;
- max_x += (e_reflow->column_width + E_REFLOW_FULL_GUTTER) * e_reflow->column_count;
- if ( button->y >= E_REFLOW_BORDER_WIDTH && button->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER && max_x > button->x ) {
- e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x);
- e_reflow->start_x = e_reflow->which_column_dragged * (e_reflow->column_width + E_REFLOW_FULL_GUTTER) - E_REFLOW_DIVIDER_WIDTH / 2;
- e_reflow->temp_column_width = e_reflow->column_width;
- e_reflow->column_drag = TRUE;
-
- gnome_canvas_item_grab (item,
- GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
- e_reflow->arrow_cursor,
- button->time);
-
- e_reflow->previous_temp_column_width = -1;
- e_reflow->need_column_resize = TRUE;
- gnome_canvas_item_request_update(item);
- return TRUE;
- }
- }
- break;
- case 4:
- {
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- gdouble new_value = adjustment->value;
- new_value -= adjustment->step_increment;
- gtk_adjustment_set_value(adjustment, new_value);
- }
- break;
- case 5:
- {
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- gdouble new_value = adjustment->value;
- new_value += adjustment->step_increment;
- if ( new_value > adjustment->upper - adjustment->page_size )
- new_value = adjustment->upper - adjustment->page_size;
- gtk_adjustment_set_value(adjustment, new_value);
- }
- break;
- }
- break;
- case GDK_BUTTON_RELEASE:
- if (e_reflow->column_drag) {
- gdouble old_width = e_reflow->column_width;
- GdkEventButton *button = (GdkEventButton *) event;
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- e_reflow->temp_column_width = e_reflow->column_width +
- (button->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
- if ( e_reflow->temp_column_width < 50 )
- e_reflow->temp_column_width = 50;
- e_reflow->column_drag = FALSE;
- if ( old_width != e_reflow->temp_column_width ) {
- gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width));
- e_reflow->column_width = e_reflow->temp_column_width;
- adjustment->step_increment = (e_reflow->column_width + E_REFLOW_FULL_GUTTER) / 2;
- adjustment->page_increment = adjustment->page_size - adjustment->step_increment;
- gtk_adjustment_changed(adjustment);
- e_reflow_resize_children(item);
- e_canvas_item_request_reflow(item);
- }
- e_reflow->need_column_resize = TRUE;
- gnome_canvas_item_request_update(item);
- gnome_canvas_item_ungrab (item, button->time);
- return TRUE;
- }
- break;
- case GDK_MOTION_NOTIFY:
- if (e_reflow->column_drag) {
- double old_width = e_reflow->temp_column_width;
- GdkEventMotion *motion = (GdkEventMotion *) event;
- GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas));
- e_reflow->temp_column_width = e_reflow->column_width +
- (motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value));
- if (e_reflow->temp_column_width < 50)
- e_reflow->temp_column_width = 50;
- if (old_width != e_reflow->temp_column_width) {
- e_reflow->need_column_resize = TRUE;
- gnome_canvas_item_request_update(item);
- }
- return TRUE;
- } else {
- GdkEventMotion *motion = (GdkEventMotion *) event;
- double n_x, max_x;
-
- n_x = motion->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
-
- max_x = E_REFLOW_BORDER_WIDTH;
- max_x += (e_reflow->column_width + E_REFLOW_FULL_GUTTER) * e_reflow->column_count;
-
- if ( motion->y >= E_REFLOW_BORDER_WIDTH && motion->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER && max_x > motion->x) {
- if ( e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
- e_reflow->default_cursor_shown = FALSE;
- }
- } else
- if ( ! e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
- e_reflow->default_cursor_shown = TRUE;
- }
-
- }
- break;
- case GDK_ENTER_NOTIFY:
- if (!e_reflow->column_drag) {
- GdkEventCrossing *crossing = (GdkEventCrossing *) event;
- double n_x, max_x;
- n_x = crossing->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
-
- max_x = E_REFLOW_BORDER_WIDTH;
- max_x += (e_reflow->column_width + E_REFLOW_FULL_GUTTER) * e_reflow->column_count;
- if ( crossing->y >= E_REFLOW_BORDER_WIDTH && crossing->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER && max_x > crossing->x) {
- if ( e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->arrow_cursor);
- e_reflow->default_cursor_shown = FALSE;
- }
- }
- }
- break;
- case GDK_LEAVE_NOTIFY:
- if (!e_reflow->column_drag) {
- GdkEventCrossing *crossing = (GdkEventCrossing *) event;
- double n_x;
- n_x = crossing->x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x,(e_reflow->column_width + E_REFLOW_FULL_GUTTER));
- if ( !( crossing->y >= E_REFLOW_BORDER_WIDTH && crossing->y <= e_reflow->height - E_REFLOW_BORDER_WIDTH && n_x < E_REFLOW_FULL_GUTTER ) ) {
- if ( ! e_reflow->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, e_reflow->default_cursor);
- e_reflow->default_cursor_shown = TRUE;
- }
- }
- }
- 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_reflow_real_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
-{
- e_reflow->items = g_list_append(e_reflow->items, item);
- gtk_object_ref(GTK_OBJECT(item));
- if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
- gnome_canvas_item_set(item,
- "width", (double) e_reflow->column_width,
- NULL);
- e_reflow_post_add_item(e_reflow, item);
- e_canvas_item_request_reflow(item);
- }
-
-}
-
-static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- int x_rect, y_rect, width_rect, height_rect;
- gdouble running_width;
- EReflow *e_reflow = E_REFLOW(item);
- int i;
- double column_width;
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->draw)
- GNOME_CANVAS_ITEM_CLASS(parent_class)->draw (item, drawable, x, y, width, height);
- column_width = e_reflow->column_width;
- running_width = E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- x_rect = running_width;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- /* Compute first column to draw. */
- i = x;
- i /= column_width + E_REFLOW_FULL_GUTTER;
- running_width += i * (column_width + E_REFLOW_FULL_GUTTER);
-
- for ( ; i < e_reflow->column_count; i++) {
- if ( running_width > x + width )
- break;
- x_rect = running_width;
- gtk_paint_flat_box(GTK_WIDGET(item->canvas)->style,
- drawable,
- GTK_STATE_ACTIVE,
- GTK_SHADOW_NONE,
- NULL,
- GTK_WIDGET(item->canvas),
- "reflow",
- x_rect - x,
- y_rect - y,
- width_rect,
- height_rect);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- if (e_reflow->column_drag) {
- int start_line = e_reflow_pick_line(e_reflow,
- gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
- i = x - start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width = start_line * (column_width + E_REFLOW_FULL_GUTTER);
- column_width = e_reflow->temp_column_width;
- running_width -= start_line * (column_width + E_REFLOW_FULL_GUTTER);
- i += start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width += E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- x_rect = running_width;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- /* Compute first column to draw. */
- i /= column_width + E_REFLOW_FULL_GUTTER;
- running_width += i * (column_width + E_REFLOW_FULL_GUTTER);
-
- for ( ; i < e_reflow->column_count; i++) {
- if ( running_width > x + width )
- break;
- x_rect = running_width;
- gdk_draw_rectangle(drawable,
- GTK_WIDGET(item->canvas)->style->fg_gc[GTK_STATE_NORMAL],
- TRUE,
- x_rect - x,
- y_rect - y,
- width_rect - 1,
- height_rect - 1);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- }
-}
-
-static void
-e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags)
-{
- EReflow *e_reflow;
- double x0, x1, y0, y1;
-
- e_reflow = E_REFLOW (item);
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update)
- GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags);
-
- x0 = item->x1;
- y0 = item->y1;
- x1 = item->x2;
- y1 = item->y2;
- if ( x1 < x0 + e_reflow->width )
- x1 = x0 + e_reflow->width;
- if ( y1 < y0 + e_reflow->height )
- y1 = y0 + e_reflow->height;
- item->x2 = x1;
- item->y2 = y1;
-
- if (e_reflow->need_height_update) {
- x0 = item->x1;
- y0 = item->y1;
- x1 = item->x2;
- y1 = item->y2;
- if ( x0 > 0 )
- x0 = 0;
- if ( y0 > 0 )
- y0 = 0;
- if ( x1 < E_REFLOW(item)->width )
- x1 = E_REFLOW(item)->width;
- if ( x1 < E_REFLOW(item)->height )
- x1 = E_REFLOW(item)->height;
-
- gnome_canvas_request_redraw(item->canvas, x0, y0, x1, y1);
- e_reflow->need_height_update = FALSE;
- } else if (e_reflow->need_column_resize) {
- int x_rect, y_rect, width_rect, height_rect;
- int start_line = e_reflow_pick_line(e_reflow,
- gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value);
- gdouble running_width;
- int i;
- double column_width;
-
- if ( e_reflow->previous_temp_column_width != -1 ) {
- running_width = start_line * (e_reflow->column_width + E_REFLOW_FULL_GUTTER);
- column_width = e_reflow->previous_temp_column_width;
- running_width -= start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width += E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- for ( i = 0; i < e_reflow->column_count; i++) {
- x_rect = running_width;
- gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- }
-
- if ( e_reflow->temp_column_width != -1 ) {
- running_width = start_line * (e_reflow->column_width + E_REFLOW_FULL_GUTTER);
- column_width = e_reflow->temp_column_width;
- running_width -= start_line * (column_width + E_REFLOW_FULL_GUTTER);
- running_width += E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- y_rect = E_REFLOW_BORDER_WIDTH;
- width_rect = E_REFLOW_DIVIDER_WIDTH;
- height_rect = e_reflow->height - (E_REFLOW_BORDER_WIDTH * 2);
-
- for ( i = 0; i < e_reflow->column_count; i++) {
- x_rect = running_width;
- gnome_canvas_request_redraw(item->canvas, x_rect, y_rect, x_rect + width_rect, y_rect + height_rect);
- running_width += E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH + column_width + E_REFLOW_BORDER_WIDTH;
- }
- }
-
- e_reflow->previous_temp_column_width = e_reflow->temp_column_width;
- e_reflow->need_column_resize = FALSE;
- }
-}
-
-static void
-e_reflow_resize_children (GnomeCanvasItem *item)
-{
- GList *list;
- EReflow *e_reflow;
-
- e_reflow = E_REFLOW (item);
- for ( list = e_reflow->items; list; list = list->next ) {
- GnomeCanvasItem *child = GNOME_CANVAS_ITEM(list->data);
- gnome_canvas_item_set(child,
- "width", (double) e_reflow->column_width,
- NULL);
- }
-}
-
-static double
-e_reflow_point (GnomeCanvasItem *item,
- double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- double distance = 1;
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->point)
- distance = GNOME_CANVAS_ITEM_CLASS(parent_class)->point (item, x, y, cx, cy, actual_item);
- if (*actual_item)
- return 0;
-
- *actual_item = item;
- return 0;
-#if 0
- if (y >= E_REFLOW_BORDER_WIDTH && y <= e_reflow->height - E_REFLOW_BORDER_WIDTH) {
- float n_x;
- n_x = x;
- n_x += E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH;
- n_x = fmod(n_x, (e_reflow->column_width + E_REFLOW_FULL_GUTTER));
- if (n_x < E_REFLOW_FULL_GUTTER) {
- *actual_item = item;
- return 0;
- }
- }
- return distance;
-#endif
-}
-
-static void
-_reflow( EReflow *e_reflow )
-{
- gdouble running_height;
- GList *list;
- double item_height;
-
- if (e_reflow->columns) {
- g_list_free (e_reflow->columns);
- e_reflow->columns = NULL;
- }
-
- e_reflow->column_count = 0;
-
- if (e_reflow->items == NULL) {
- e_reflow->columns = NULL;
- e_reflow->column_count = 0;
- return;
- }
-
- list = e_reflow->items;
-
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- running_height = E_REFLOW_BORDER_WIDTH + item_height + E_REFLOW_BORDER_WIDTH;
- e_reflow->columns = g_list_append (e_reflow->columns, list);
- e_reflow->column_count = 1;
-
- list = g_list_next(list);
-
- for ( ; list; list = g_list_next(list)) {
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- if (running_height + item_height + E_REFLOW_BORDER_WIDTH > e_reflow->height) {
- running_height = E_REFLOW_BORDER_WIDTH + item_height + E_REFLOW_BORDER_WIDTH;
- e_reflow->columns = g_list_append (e_reflow->columns, list);
- e_reflow->column_count ++;
- } else {
- running_height += item_height + E_REFLOW_BORDER_WIDTH;
- }
- }
-}
-
-static void
-set_empty(EReflow *e_reflow)
-{
- if (e_reflow->items == NULL) {
- if (e_reflow->empty_text) {
- if (e_reflow->empty_message) {
- gnome_canvas_item_set(e_reflow->empty_text,
- "width", e_reflow->minimum_width,
- "text", e_reflow->empty_message,
- NULL);
- e_canvas_item_move_absolute(e_reflow->empty_text,
- e_reflow->minimum_width / 2,
- 0);
- } else {
- gtk_object_destroy(GTK_OBJECT(e_reflow->empty_text));
- e_reflow->empty_text = NULL;
- }
- } else {
- if (e_reflow->empty_message)
- e_reflow->empty_text =
- gnome_canvas_item_new(GNOME_CANVAS_GROUP(e_reflow),
- e_text_get_type(),
- "anchor", GTK_ANCHOR_N,
- "width", e_reflow->minimum_width,
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "font_gdk", GTK_WIDGET(GNOME_CANVAS_ITEM(e_reflow)->canvas)->style->font,
- "fill_color", "black",
- "justification", GTK_JUSTIFY_CENTER,
- "text", e_reflow->empty_message,
- NULL);
- e_canvas_item_move_absolute(e_reflow->empty_text,
- e_reflow->minimum_width / 2,
- 0);
- }
- } else {
- if (e_reflow->empty_text) {
- gtk_object_destroy(GTK_OBJECT(e_reflow->empty_text));
- e_reflow->empty_text = NULL;
- }
- }
-}
-
-static void
-e_reflow_reflow( GnomeCanvasItem *item, int flags )
-{
- EReflow *e_reflow = E_REFLOW(item);
- if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) {
-
- gdouble old_width;
- gdouble running_width;
-
- _reflow (e_reflow);
-
- old_width = e_reflow->width;
-
- running_width = E_REFLOW_BORDER_WIDTH;
-
- if (e_reflow->items == NULL) {
- } else {
- GList *list;
- GList *next_column;
- gdouble item_height;
- gdouble running_height;
-
- running_height = E_REFLOW_BORDER_WIDTH;
-
- list = e_reflow->items;
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
- e_canvas_item_move_absolute(GNOME_CANVAS_ITEM(list->data),
- (double) running_width,
- (double) running_height);
- running_height += item_height + E_REFLOW_BORDER_WIDTH;
- next_column = g_list_next(e_reflow->columns);
- list = g_list_next(list);
-
- for( ; list; list = g_list_next(list)) {
- gtk_object_get (GTK_OBJECT(list->data),
- "height", &item_height,
- NULL);
-
- if (next_column && (next_column->data == list)) {
- next_column = g_list_next (next_column);
- running_height = E_REFLOW_BORDER_WIDTH;
- running_width += e_reflow->column_width + E_REFLOW_BORDER_WIDTH + E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH;
- }
- e_canvas_item_move_absolute(GNOME_CANVAS_ITEM(list->data),
- (double) running_width,
- (double) running_height);
-
- running_height += item_height + E_REFLOW_BORDER_WIDTH;
- }
-
- }
- e_reflow->width = running_width + e_reflow->column_width + E_REFLOW_BORDER_WIDTH;
- if ( e_reflow->width < e_reflow->minimum_width )
- e_reflow->width = e_reflow->minimum_width;
- if (old_width != e_reflow->width)
- e_canvas_item_request_parent_reflow(item);
- }
-}
-
-void
-e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
-{
- if (E_REFLOW_CLASS(GTK_OBJECT(e_reflow)->klass)->add_item)
- (E_REFLOW_CLASS(GTK_OBJECT(e_reflow)->klass)->add_item) (e_reflow, item);
-}
-
-void
-e_reflow_post_add_item(EReflow *e_reflow, GnomeCanvasItem *item)
-{
- set_empty(e_reflow);
-}
diff --git a/widgets/misc/e-reflow.h b/widgets/misc/e-reflow.h
deleted file mode 100644
index eb66b094a5..0000000000
--- a/widgets/misc/e-reflow.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-reflow.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_REFLOW_H__
-#define __E_REFLOW_H__
-
-#include <gnome.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EReflow - A canvas item container.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * 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_REFLOW_TYPE (e_reflow_get_type ())
-#define E_REFLOW(obj) (GTK_CHECK_CAST ((obj), E_REFLOW_TYPE, EReflow))
-#define E_REFLOW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_REFLOW_TYPE, EReflowClass))
-#define E_IS_REFLOW(obj) (GTK_CHECK_TYPE ((obj), E_REFLOW_TYPE))
-#define E_IS_REFLOW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_REFLOW_TYPE))
-
-
-typedef struct _EReflow EReflow;
-typedef struct _EReflowClass EReflowClass;
-
-struct _EReflow
-{
- GnomeCanvasGroup parent;
-
- /* item specific fields */
- GList *items; /* Of type GnomeCanvasItem */
- GList *columns; /* Of type GList of type GnomeCanvasItem (points into items) */
- gint column_count; /* Number of columnns */
-
- GnomeCanvasItem *empty_text;
- gchar *empty_message;
-
- double minimum_width;
- double width;
- double height;
-
- double column_width;
-
- int idle;
-
- /* These are all for when the column is being dragged. */
- gboolean column_drag;
- gdouble start_x;
- gint which_column_dragged;
- double temp_column_width;
- double previous_temp_column_width;
-
- guint need_height_update : 1;
- guint need_column_resize : 1;
-
- guint default_cursor_shown : 1;
- GdkCursor *arrow_cursor;
- GdkCursor *default_cursor;
-};
-
-struct _EReflowClass
-{
- GnomeCanvasGroupClass parent_class;
-
- /* Virtual methods. */
- void (* add_item) (EReflow *reflow, GnomeCanvasItem *item);
-};
-
-/*
- * To be added to a reflow, an item must have the argument "width" as
- * a Read/Write argument and "height" as a Read Only argument. It
- * should also do an ECanvas parent reflow request if its size
- * changes.
- */
-void e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-GtkType e_reflow_get_type (void);
-
-/* Internal usage only: */
-void e_reflow_post_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_REFLOW_H__ */
diff --git a/widgets/misc/e-scroll-frame.c b/widgets/misc/e-scroll-frame.c
deleted file mode 100644
index 8105b9dee8..0000000000
--- a/widgets/misc/e-scroll-frame.c
+++ /dev/null
@@ -1,1250 +0,0 @@
-/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * 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; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-/* EScrollFrame based on GtkScrolledWindow.
- *
- * Modifications by Federico Mena <federico@helixcode.com>
- */
-
-#include <config.h>
-#include <gtk/gtkhscrollbar.h>
-#include <gtk/gtkvscrollbar.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkviewport.h>
-#include "e-scroll-frame.h"
-
-
-/* scrolled window policy and size requisition handling:
- *
- * gtk size requisition works as follows:
- * a widget upon size-request reports the width and height that it finds
- * to be best suited to display its contents, including children.
- * the width and/or height reported from a widget upon size requisition
- * may be overidden by the user by specifying a width and/or height
- * other than 0 through gtk_widget_set_usize().
- *
- * a scrolled window needs (for imlementing all three policy types) to
- * request its width and height based on two different rationales.
- * 1) the user wants the scrolled window to just fit into the space
- * that it gets allocated for a specifc dimension.
- * 1.1) this does not apply if the user specified a concrete value
- * value for that specific dimension by either specifying usize for the
- * scrolled window or for its child.
- * 2) the user wants the scrolled window to take as much space up as
- * is desired by the child for a specifc dimension (i.e. POLICY_NEVER).
- *
- * also, kinda obvious:
- * 3) a user would certainly not have choosen a scrolled window as a container
- * for the child, if the resulting allocation takes up more space than the
- * child would have allocated without the scrolled window.
- *
- * conclusions:
- * A) from 1) follows: the scrolled window shouldn't request more space for a
- * specifc dimension than is required at minimum.
- * B) from 1.1) follows: the requisition may be overidden by usize of the scrolled
- * window (done automatically) or by usize of the child (needs to be checked).
- * C) from 2) follows: for POLICY_NEVER, the scrolled window simply reports the
- * child's dimension.
- * D) from 3) follows: the scrolled window child's minimum width and minimum height
- * under A) at least correspond to the space taken up by its scrollbars.
- */
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_HADJUSTMENT,
- ARG_VADJUSTMENT,
- ARG_HSCROLLBAR_POLICY,
- ARG_VSCROLLBAR_POLICY,
- ARG_FRAME_PLACEMENT,
- ARG_SHADOW_TYPE,
- ARG_SCROLLBAR_SPACING
-};
-
-/* Private part of the EScrollFrame structure */
-typedef struct {
- /* Horizontal and vertical scrollbars */
- GtkWidget *hsb;
- GtkWidget *vsb;
-
- /* Space between scrollbars and frame */
- guint sb_spacing;
-
- /* Allocation for frame */
- guint frame_x;
- guint frame_y;
- guint frame_w;
- guint frame_h;
-
- /* Scrollbar policy */
- guint hsb_policy : 2;
- guint vsb_policy : 2;
-
- /* Whether scrollbars are visible */
- guint hsb_visible : 1;
- guint vsb_visible : 1;
-
- /* Placement of frame wrt scrollbars */
- guint frame_placement : 2;
-
- /* Shadow type for frame */
- guint shadow_type : 3;
-} ScrollFramePrivate;
-
-
-static void e_scroll_frame_class_init (EScrollFrameClass *class);
-static void e_scroll_frame_init (EScrollFrame *sf);
-static void e_scroll_frame_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_scroll_frame_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_scroll_frame_destroy (GtkObject *object);
-static void e_scroll_frame_finalize (GtkObject *object);
-
-static void e_scroll_frame_map (GtkWidget *widget);
-static void e_scroll_frame_unmap (GtkWidget *widget);
-static void e_scroll_frame_draw (GtkWidget *widget, GdkRectangle *area);
-static void e_scroll_frame_size_request (GtkWidget *widget, GtkRequisition *requisition);
-static void e_scroll_frame_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
-static gint e_scroll_frame_expose (GtkWidget *widget, GdkEventExpose *event);
-static gint e_scroll_frame_button_press (GtkWidget *widget, GdkEventButton *event);
-static void e_scroll_frame_add (GtkContainer *container, GtkWidget *widget);
-static void e_scroll_frame_remove (GtkContainer *container, GtkWidget *widget);
-static void e_scroll_frame_forall (GtkContainer *container, gboolean include_internals,
- GtkCallback callback, gpointer callback_data);
-
-static GtkBinClass *parent_class;
-
-
-/**
- * e_scroll_frame_get_type:
- * @void:
- *
- * Registers the #EScrollFrame class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #EScrollFrame class.
- **/
-GtkType
-e_scroll_frame_get_type (void)
-{
- static GtkType scroll_frame_type = 0;
-
- if (!scroll_frame_type) {
- static const GtkTypeInfo scroll_frame_info = {
- "EScrollFrame",
- sizeof (EScrollFrame),
- sizeof (EScrollFrameClass),
- (GtkClassInitFunc) e_scroll_frame_class_init,
- (GtkObjectInitFunc) e_scroll_frame_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- scroll_frame_type = gtk_type_unique (GTK_TYPE_BIN, &scroll_frame_info);
- }
-
- return scroll_frame_type;
-}
-
-/* Class initialization function for the scroll frame widget */
-static void
-e_scroll_frame_class_init (EScrollFrameClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GtkContainerClass *container_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
- container_class = (GtkContainerClass *) class;
-
- parent_class = gtk_type_class (GTK_TYPE_BIN);
-
- gtk_object_add_arg_type ("EScrollFrame::hadjustment",
- GTK_TYPE_ADJUSTMENT,
- GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT,
- ARG_HADJUSTMENT);
- gtk_object_add_arg_type ("EScrollFrame::vadjustment",
- GTK_TYPE_ADJUSTMENT,
- GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT,
- ARG_VADJUSTMENT);
- gtk_object_add_arg_type ("EScrollFrame::hscrollbar_policy",
- GTK_TYPE_POLICY_TYPE,
- GTK_ARG_READWRITE,
- ARG_HSCROLLBAR_POLICY);
- gtk_object_add_arg_type ("EScrollFrame::vscrollbar_policy",
- GTK_TYPE_POLICY_TYPE,
- GTK_ARG_READWRITE,
- ARG_VSCROLLBAR_POLICY);
- gtk_object_add_arg_type ("EScrollFrame::frame_placement",
- GTK_TYPE_CORNER_TYPE,
- GTK_ARG_READWRITE,
- ARG_FRAME_PLACEMENT);
- gtk_object_add_arg_type ("EScrollFrame::shadow_type",
- GTK_TYPE_SHADOW_TYPE,
- GTK_ARG_READWRITE,
- ARG_SHADOW_TYPE);
- gtk_object_add_arg_type ("EScrollFrame::scrollbar_spacing",
- GTK_TYPE_UINT,
- GTK_ARG_READWRITE,
- ARG_SCROLLBAR_SPACING);
-
- object_class->set_arg = e_scroll_frame_set_arg;
- object_class->get_arg = e_scroll_frame_get_arg;
- object_class->destroy = e_scroll_frame_destroy;
- object_class->finalize = e_scroll_frame_finalize;
-
- widget_class->map = e_scroll_frame_map;
- widget_class->unmap = e_scroll_frame_unmap;
- widget_class->draw = e_scroll_frame_draw;
- widget_class->size_request = e_scroll_frame_size_request;
- widget_class->size_allocate = e_scroll_frame_size_allocate;
- widget_class->expose_event = e_scroll_frame_expose;
- widget_class->button_press_event = e_scroll_frame_button_press;
-
- container_class->add = e_scroll_frame_add;
- container_class->remove = e_scroll_frame_remove;
- container_class->forall = e_scroll_frame_forall;
-}
-
-/* Object initialization function for the scroll frame widget */
-static void
-e_scroll_frame_init (EScrollFrame *sf)
-{
- ScrollFramePrivate *priv;
-
- priv = g_new0 (ScrollFramePrivate, 1);
- sf->priv = priv;
-
- GTK_WIDGET_SET_FLAGS (sf, GTK_NO_WINDOW);
-
- gtk_container_set_resize_mode (GTK_CONTAINER (sf), GTK_RESIZE_QUEUE);
-
- priv->sb_spacing = 3;
- priv->hsb_policy = GTK_POLICY_ALWAYS;
- priv->vsb_policy = GTK_POLICY_ALWAYS;
- priv->frame_placement = GTK_CORNER_TOP_LEFT;
- priv->shadow_type = GTK_SHADOW_NONE;
-}
-
-/* Set_arg handler for the scroll frame widget */
-static void
-e_scroll_frame_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
-
- sf = E_SCROLL_FRAME (object);
- priv = sf->priv;
-
- switch (arg_id) {
- case ARG_HADJUSTMENT:
- e_scroll_frame_set_hadjustment (sf, GTK_VALUE_POINTER (*arg));
- break;
-
- case ARG_VADJUSTMENT:
- e_scroll_frame_set_vadjustment (sf, GTK_VALUE_POINTER (*arg));
- break;
-
- case ARG_HSCROLLBAR_POLICY:
- e_scroll_frame_set_policy (sf, GTK_VALUE_ENUM (*arg), priv->vsb_policy);
- break;
-
- case ARG_VSCROLLBAR_POLICY:
- e_scroll_frame_set_policy (sf, priv->hsb_policy, GTK_VALUE_ENUM (*arg));
- break;
-
- case ARG_FRAME_PLACEMENT:
- e_scroll_frame_set_placement (sf, GTK_VALUE_ENUM (*arg));
- break;
-
- case ARG_SHADOW_TYPE:
- e_scroll_frame_set_shadow_type (sf, GTK_VALUE_ENUM (*arg));
- break;
-
- case ARG_SCROLLBAR_SPACING:
- e_scroll_frame_set_scrollbar_spacing (sf, GTK_VALUE_UINT (*arg));
- break;
-
- default:
- break;
- }
-}
-
-/* Get_arg handler for the scroll frame widget */
-static void
-e_scroll_frame_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
-
- sf = E_SCROLL_FRAME (object);
- priv = sf->priv;
-
- switch (arg_id) {
- case ARG_HADJUSTMENT:
- GTK_VALUE_POINTER (*arg) = e_scroll_frame_get_hadjustment (sf);
- break;
-
- case ARG_VADJUSTMENT:
- GTK_VALUE_POINTER (*arg) = e_scroll_frame_get_vadjustment (sf);
- break;
-
- case ARG_HSCROLLBAR_POLICY:
- GTK_VALUE_ENUM (*arg) = priv->hsb_policy;
- break;
-
- case ARG_VSCROLLBAR_POLICY:
- GTK_VALUE_ENUM (*arg) = priv->vsb_policy;
- break;
-
- case ARG_FRAME_PLACEMENT:
- GTK_VALUE_ENUM (*arg) = priv->frame_placement;
- break;
-
- case ARG_SHADOW_TYPE:
- GTK_VALUE_ENUM (*arg) = priv->shadow_type;
- break;
-
- case ARG_SCROLLBAR_SPACING:
- GTK_VALUE_UINT (*arg) = priv->sb_spacing;
- break;
-
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-/* Destroy handler for the scroll frame widget */
-static void
-e_scroll_frame_destroy (GtkObject *object)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (object));
-
- sf = E_SCROLL_FRAME (object);
- priv = sf->priv;
-
- gtk_widget_unparent (priv->hsb);
- gtk_widget_unparent (priv->vsb);
- gtk_widget_destroy (priv->hsb);
- gtk_widget_destroy (priv->vsb);
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-/* Finalize handler for the scroll frame widget */
-static void
-e_scroll_frame_finalize (GtkObject *object)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
-
- sf = E_SCROLL_FRAME (object);
- priv = sf->priv;
-
- gtk_widget_unref (priv->hsb);
- gtk_widget_unref (priv->vsb);
-
- g_free (priv);
-
- if (GTK_OBJECT_CLASS (parent_class)->finalize)
- (* GTK_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-/* Map handler for the scroll frame widget */
-static void
-e_scroll_frame_map (GtkWidget *widget)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (widget));
-
- sf = E_SCROLL_FRAME (widget);
- priv = sf->priv;
-
- /* chain parent class handler to map self and child */
- if (GTK_WIDGET_CLASS (parent_class)->map)
- (* GTK_WIDGET_CLASS (parent_class)->map) (widget);
-
- if (GTK_WIDGET_VISIBLE (priv->hsb) && !GTK_WIDGET_MAPPED (priv->hsb))
- gtk_widget_map (priv->hsb);
-
- if (GTK_WIDGET_VISIBLE (priv->vsb) && !GTK_WIDGET_MAPPED (priv->vsb))
- gtk_widget_map (priv->vsb);
-}
-
-/* Unmap handler for the scroll frame widget */
-static void
-e_scroll_frame_unmap (GtkWidget *widget)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (widget));
-
- sf = E_SCROLL_FRAME (widget);
- priv = sf->priv;
-
- /* chain parent class handler to unmap self and child */
- if (GTK_WIDGET_CLASS (parent_class)->unmap)
- (* GTK_WIDGET_CLASS (parent_class)->unmap) (widget);
-
- if (GTK_WIDGET_MAPPED (priv->hsb))
- gtk_widget_unmap (priv->hsb);
-
- if (GTK_WIDGET_MAPPED (priv->vsb))
- gtk_widget_unmap (priv->vsb);
-}
-
-/* Draws the shadow of a scroll frame widget */
-static void
-draw_shadow (EScrollFrame *sf, GdkRectangle *area)
-{
- ScrollFramePrivate *priv;
-
- g_assert (area != NULL);
-
- priv = sf->priv;
-
- gtk_paint_shadow (GTK_WIDGET (sf)->style,
- GTK_WIDGET (sf)->window,
- GTK_STATE_NORMAL, priv->shadow_type,
- area, GTK_WIDGET (sf),
- "scroll_frame",
- priv->frame_x, priv->frame_y,
- priv->frame_w, priv->frame_h);
-}
-
-/* Draw handler for the scroll frame widget */
-static void
-e_scroll_frame_draw (GtkWidget *widget, GdkRectangle *area)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
- GtkBin *bin;
- GdkRectangle child_area;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (widget));
- g_return_if_fail (area != NULL);
-
- sf = E_SCROLL_FRAME (widget);
- priv = sf->priv;
- bin = GTK_BIN (widget);
-
- if (GTK_WIDGET_DRAWABLE (widget))
- draw_shadow (sf, area);
-
- if (bin->child && GTK_WIDGET_VISIBLE (bin->child)
- && gtk_widget_intersect (bin->child, area, &child_area))
- gtk_widget_draw (bin->child, &child_area);
-
- if (GTK_WIDGET_VISIBLE (priv->hsb)
- && gtk_widget_intersect (priv->hsb, area, &child_area))
- gtk_widget_draw (priv->hsb, &child_area);
-
- if (GTK_WIDGET_VISIBLE (priv->vsb)
- && gtk_widget_intersect (priv->vsb, area, &child_area))
- gtk_widget_draw (priv->vsb, &child_area);
-}
-
-/* Forall handler for the scroll frame widget */
-static void
-e_scroll_frame_forall (GtkContainer *container, gboolean include_internals,
- GtkCallback callback, gpointer callback_data)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
-
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (container));
- g_return_if_fail (callback != NULL);
-
- sf = E_SCROLL_FRAME (container);
- priv = sf->priv;
-
- if (GTK_CONTAINER_CLASS (parent_class)->forall)
- (* GTK_CONTAINER_CLASS (parent_class)->forall) (
- container, include_internals,
- callback, callback_data);
-
- if (include_internals) {
- if (priv->vsb)
- (* callback) (priv->vsb, callback_data);
-
- if (priv->hsb)
- (* callback) (priv->hsb, callback_data);
- }
-}
-
-/* Size_request handler for the scroll frame widget */
-static void
-e_scroll_frame_size_request (GtkWidget *widget, GtkRequisition *requisition)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
- GtkBin *bin;
- gint extra_width;
- gint extra_height;
- GtkRequisition hsb_requisition;
- GtkRequisition vsb_requisition;
- GtkRequisition child_requisition;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (widget));
- g_return_if_fail (requisition != NULL);
-
- sf = E_SCROLL_FRAME (widget);
- priv = sf->priv;
- bin = GTK_BIN (widget);
-
- extra_width = 0;
- extra_height = 0;
-
- requisition->width = GTK_CONTAINER (widget)->border_width * 2;
- requisition->height = GTK_CONTAINER (widget)->border_width * 2;
-
- if (priv->shadow_type != GTK_SHADOW_NONE) {
- requisition->width += 2 * widget->style->klass->xthickness;
- requisition->height += 2 * widget->style->klass->ythickness;
- }
-
- gtk_widget_size_request (priv->hsb, &hsb_requisition);
- gtk_widget_size_request (priv->vsb, &vsb_requisition);
-
- if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) {
- static guint quark_aux_info;
-
- if (!quark_aux_info)
- quark_aux_info = g_quark_from_static_string ("gtk-aux-info");
-
- gtk_widget_size_request (bin->child, &child_requisition);
-
- if (priv->hsb_policy == GTK_POLICY_NEVER)
- requisition->width += child_requisition.width;
- else {
- GtkWidgetAuxInfo *aux_info;
-
- aux_info = gtk_object_get_data_by_id (GTK_OBJECT (bin->child),
- quark_aux_info);
- if (aux_info && aux_info->width > 0) {
- requisition->width += aux_info->width;
- extra_width = -1;
- } else
- requisition->width += vsb_requisition.width;
- }
-
- if (priv->vsb_policy == GTK_POLICY_NEVER)
- requisition->height += child_requisition.height;
- else {
- GtkWidgetAuxInfo *aux_info;
-
- aux_info = gtk_object_get_data_by_id (GTK_OBJECT (bin->child),
- quark_aux_info);
- if (aux_info && aux_info->height > 0) {
- requisition->height += aux_info->height;
- extra_height = -1;
- } else
- requisition->height += hsb_requisition.height;
- }
- }
-
- if (priv->hsb_policy == GTK_POLICY_AUTOMATIC || GTK_WIDGET_VISIBLE (priv->hsb)) {
- requisition->width = MAX (requisition->width, hsb_requisition.width);
- if (!extra_height || GTK_WIDGET_VISIBLE (priv->hsb))
- extra_height = priv->sb_spacing + hsb_requisition.height;
- }
-
- if (priv->vsb_policy == GTK_POLICY_AUTOMATIC || GTK_WIDGET_VISIBLE (priv->vsb)) {
- requisition->height = MAX (requisition->height, vsb_requisition.height);
- if (!extra_width || GTK_WIDGET_VISIBLE (priv->vsb))
- extra_width = priv->sb_spacing + vsb_requisition.width;
- }
-
- requisition->width += MAX (0, extra_width);
- requisition->height += MAX (0, extra_height);
-}
-
-/* Computes the relative allocation for the scroll frame widget */
-static void
-compute_relative_allocation (GtkWidget *widget, GtkAllocation *allocation)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
-
- g_assert (widget != NULL);
- g_assert (E_IS_SCROLL_FRAME (widget));
- g_assert (allocation != NULL);
-
- sf = E_SCROLL_FRAME (widget);
- priv = sf->priv;
-
- allocation->x = GTK_CONTAINER (widget)->border_width;
- allocation->y = GTK_CONTAINER (widget)->border_width;
- allocation->width = MAX (1, ((gint)widget->allocation.width) - (gint) allocation->x * 2);
- allocation->height = MAX (1, ((gint)widget->allocation.height) - (gint) allocation->y * 2);
-
- if (priv->vsb_visible) {
- GtkRequisition vsb_requisition;
-
- gtk_widget_get_child_requisition (priv->vsb, &vsb_requisition);
-
- if (priv->frame_placement == GTK_CORNER_TOP_RIGHT
- || priv->frame_placement == GTK_CORNER_BOTTOM_RIGHT)
- allocation->x += vsb_requisition.width + priv->sb_spacing;
-
- allocation->width = MAX (1, ((gint) allocation->width)
- - (gint) (vsb_requisition.width + priv->sb_spacing));
- }
-
- if (priv->hsb_visible) {
- GtkRequisition hsb_requisition;
-
- gtk_widget_get_child_requisition (priv->hsb, &hsb_requisition);
-
- if (priv->frame_placement == GTK_CORNER_BOTTOM_LEFT
- || priv->frame_placement == GTK_CORNER_BOTTOM_RIGHT)
- allocation->y += hsb_requisition.height + priv->sb_spacing;
-
- allocation->height = MAX (1, ((gint) allocation->height)
- - (gint) (hsb_requisition.height + priv->sb_spacing));
- }
-}
-
-/* Size_allocate handler for the scroll frame widget */
-static void
-e_scroll_frame_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
- GtkBin *bin;
- GtkAllocation relative_allocation;
- GtkAllocation child_allocation;
- gint xthickness, ythickness;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (widget));
- g_return_if_fail (allocation != NULL);
-
- sf = E_SCROLL_FRAME (widget);
- priv = sf->priv;
- bin = GTK_BIN (widget);
-
- widget->allocation = *allocation;
-
- if (priv->hsb_policy == GTK_POLICY_ALWAYS)
- priv->hsb_visible = TRUE;
- else if (priv->hsb_policy == GTK_POLICY_NEVER)
- priv->hsb_visible = FALSE;
-
- if (priv->vsb_policy == GTK_POLICY_ALWAYS)
- priv->vsb_visible = TRUE;
- else if (priv->vsb_policy == GTK_POLICY_NEVER)
- priv->vsb_visible = FALSE;
-
- if (priv->shadow_type == GTK_SHADOW_NONE) {
- xthickness = 0;
- ythickness = 0;
- } else {
- xthickness = widget->style->klass->xthickness;
- ythickness = widget->style->klass->ythickness;
- }
-
- if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) {
- gboolean previous_hvis;
- gboolean previous_vvis;
- guint count = 0;
-
- do {
- compute_relative_allocation (widget, &relative_allocation);
-
- priv->frame_x = relative_allocation.x + allocation->x;
- priv->frame_y = relative_allocation.y + allocation->y;
- priv->frame_w = relative_allocation.width;
- priv->frame_h = relative_allocation.height;
-
- child_allocation.x = priv->frame_x + xthickness;
- child_allocation.y = priv->frame_y + ythickness;
- child_allocation.width = MAX ((gint)priv->frame_w - 2 * xthickness, 0);
- child_allocation.height = MAX ((gint)priv->frame_h - 2 * ythickness, 0);
-
- previous_hvis = priv->hsb_visible;
- previous_vvis = priv->vsb_visible;
-
- gtk_widget_size_allocate (bin->child, &child_allocation);
-
- /* If, after the first iteration, the hscrollbar and the
- * vscrollbar flip visiblity, then we need both.
- */
- if (count
- && previous_hvis != priv->hsb_visible
- && previous_vvis != priv->vsb_visible) {
- priv->hsb_visible = TRUE;
- priv->vsb_visible = TRUE;
-
- /* a new resize is already queued at this point,
- * so we will immediatedly get reinvoked
- */
- return;
- }
-
- count++;
- } while (previous_hvis != priv->hsb_visible
- || previous_vvis != priv->vsb_visible);
- } else
- compute_relative_allocation (widget, &relative_allocation);
-
- if (priv->hsb_visible) {
- GtkRequisition hscrollbar_requisition;
-
- gtk_widget_get_child_requisition (priv->hsb, &hscrollbar_requisition);
-
- if (!GTK_WIDGET_VISIBLE (priv->hsb))
- gtk_widget_show (priv->hsb);
-
- child_allocation.x = relative_allocation.x;
- if (priv->frame_placement == GTK_CORNER_TOP_LEFT
- || priv->frame_placement == GTK_CORNER_TOP_RIGHT)
- child_allocation.y = (relative_allocation.y
- + relative_allocation.height
- + priv->sb_spacing);
- else
- child_allocation.y = GTK_CONTAINER (sf)->border_width;
-
- child_allocation.width = relative_allocation.width;
- child_allocation.height = hscrollbar_requisition.height;
- child_allocation.x += allocation->x;
- child_allocation.y += allocation->y;
-
- gtk_widget_size_allocate (priv->hsb, &child_allocation);
- } else if (GTK_WIDGET_VISIBLE (priv->hsb))
- gtk_widget_hide (priv->hsb);
-
- if (priv->vsb_visible) {
- GtkRequisition vscrollbar_requisition;
-
- if (!GTK_WIDGET_VISIBLE (priv->vsb))
- gtk_widget_show (priv->vsb);
-
- gtk_widget_get_child_requisition (priv->vsb, &vscrollbar_requisition);
-
- if (priv->frame_placement == GTK_CORNER_TOP_LEFT
- || priv->frame_placement == GTK_CORNER_BOTTOM_LEFT)
- child_allocation.x = (relative_allocation.x
- + relative_allocation.width
- + priv->sb_spacing);
- else
- child_allocation.x = GTK_CONTAINER (sf)->border_width;
-
- child_allocation.y = relative_allocation.y;
- child_allocation.width = vscrollbar_requisition.width;
- child_allocation.height = relative_allocation.height;
- child_allocation.x += allocation->x;
- child_allocation.y += allocation->y;
-
- gtk_widget_size_allocate (priv->vsb, &child_allocation);
- } else if (GTK_WIDGET_VISIBLE (priv->vsb))
- gtk_widget_hide (priv->vsb);
-}
-
-/* Button press handler for the scroll framw diget */
-static gint
-e_scroll_frame_button_press (GtkWidget *widget, GdkEventButton *event)
-{
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_SCROLL_FRAME (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- /* This is to handle mouse wheel scrolling */
- if (event->button == 4 || event->button == 5) {
- GtkAdjustment *adj;
- gfloat new_value;
-
- gtk_object_get (GTK_OBJECT (widget),
- (event->state & GDK_CONTROL_MASK) ?
- "hadjustment" : "vadjustment",
- &adj,
- NULL);
- new_value = adj->value + ((event->button == 4) ?
- -adj->page_increment / 2:
- adj->page_increment / 2);
- new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
- gtk_adjustment_set_value (adj, new_value);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-/* Expose handler for the scroll frame widget */
-static gint
-e_scroll_frame_expose (GtkWidget *widget, GdkEventExpose *event)
-{
- EScrollFrame *sf;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_SCROLL_FRAME (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- sf = E_SCROLL_FRAME (widget);
-
- if (GTK_WIDGET_DRAWABLE (widget))
- draw_shadow (sf, &event->area);
-
- if (GTK_WIDGET_CLASS (parent_class)->expose_event)
- (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
-
- return FALSE;
-}
-
-/* Add handler for the scroll frame widget */
-static void
-e_scroll_frame_add (GtkContainer *container, GtkWidget *child)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
- GtkBin *bin;
-
- sf = E_SCROLL_FRAME (container);
- priv = sf->priv;
- bin = GTK_BIN (container);
- g_return_if_fail (bin->child == NULL);
-
- bin->child = child;
- gtk_widget_set_parent (child, GTK_WIDGET (bin));
-
- /* this is a temporary message */
- if (!gtk_widget_set_scroll_adjustments (child,
- gtk_range_get_adjustment (GTK_RANGE (priv->hsb)),
- gtk_range_get_adjustment (GTK_RANGE (priv->vsb))))
-#if 0
- g_warning ("e_scroll_frame_add(): cannot add non scrollable widget "
- "use e_scroll_frame_add_with_viewport() instead");
-#else
- ;
-#endif
-
- if (GTK_WIDGET_REALIZED (child->parent))
- gtk_widget_realize (child);
-
- if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child)) {
- if (GTK_WIDGET_MAPPED (child->parent))
- gtk_widget_map (child);
-
- gtk_widget_queue_resize (child);
- }
-}
-
-/* Remove method for the scroll frame widget */
-static void
-e_scroll_frame_remove (GtkContainer *container, GtkWidget *child)
-{
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (container));
- g_return_if_fail (child != NULL);
- g_return_if_fail (GTK_BIN (container)->child == child);
-
- gtk_widget_set_scroll_adjustments (child, NULL, NULL);
-
- /* chain parent class handler to remove child */
- if (GTK_CONTAINER_CLASS (parent_class)->remove)
- (* GTK_CONTAINER_CLASS (parent_class)->remove) (container, child);
-}
-
-/**
- * e_scroll_frame_new:
- * @hadj: If non-NULL, the adjustment to use for horizontal scrolling.
- * @vadj: If non-NULL, the adjustment to use for vertical scrolling.
- *
- * Creates a new scroll frame widget.
- *
- * Return value: The newly-created scroll frame widget.
- **/
-GtkWidget *
-e_scroll_frame_new (GtkAdjustment *hadj, GtkAdjustment *vadj)
-{
- if (hadj)
- g_return_val_if_fail (GTK_IS_ADJUSTMENT (hadj), NULL);
-
- if (vadj)
- g_return_val_if_fail (GTK_IS_ADJUSTMENT (vadj), NULL);
-
- return gtk_widget_new (E_TYPE_SCROLL_FRAME,
- "hadjustment", hadj,
- "vadjustment", vadj,
- NULL);
-}
-
-/* Callback used when one of the scroll frame widget's adjustments changes */
-static void
-adjustment_changed (GtkAdjustment *adj, gpointer data)
-{
- EScrollFrame *sf;
- ScrollFramePrivate *priv;
-
- g_return_if_fail (adj != NULL);
- g_return_if_fail (GTK_IS_ADJUSTMENT (adj));
- g_return_if_fail (data != NULL);
-
- sf = E_SCROLL_FRAME (data);
- priv = sf->priv;
-
- if (adj == gtk_range_get_adjustment (GTK_RANGE (priv->hsb))) {
- if (priv->hsb_policy == GTK_POLICY_AUTOMATIC) {
- gboolean visible;
-
- visible = priv->hsb_visible;
- priv->hsb_visible = (adj->upper - adj->lower > adj->page_size);
- if (priv->hsb_visible != visible)
- gtk_widget_queue_resize (GTK_WIDGET (sf));
- }
- } else if (adj == gtk_range_get_adjustment (GTK_RANGE (priv->vsb))) {
- if (priv->vsb_policy == GTK_POLICY_AUTOMATIC) {
- gboolean visible;
-
- visible = priv->vsb_visible;
- priv->vsb_visible = (adj->upper - adj->lower > adj->page_size);
- if (priv->vsb_visible != visible)
- gtk_widget_queue_resize (GTK_WIDGET (sf));
- }
- }
-}
-
-/**
- * e_scroll_frame_set_hadjustment:
- * @sf: A scroll frame widget.
- * @adj: An adjustment.
- *
- * Sets the adjustment to be used for horizontal scrolling in a scroll frame
- * widget.
- **/
-void
-e_scroll_frame_set_hadjustment (EScrollFrame *sf, GtkAdjustment *adj)
-{
- ScrollFramePrivate *priv;
-
- g_return_if_fail (sf != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (sf));
-
- priv = sf->priv;
-
- if (adj)
- g_return_if_fail (GTK_IS_ADJUSTMENT (adj));
- else
- adj = GTK_ADJUSTMENT (gtk_object_new (GTK_TYPE_ADJUSTMENT, NULL));
-
- if (!priv->hsb) {
- gtk_widget_push_composite_child ();
- priv->hsb = gtk_hscrollbar_new (adj);
- gtk_widget_set_composite_name (priv->hsb, "hscrollbar");
- gtk_widget_pop_composite_child ();
-
- gtk_widget_set_parent (priv->hsb, GTK_WIDGET (sf));
- gtk_widget_ref (priv->hsb);
- gtk_widget_show (priv->hsb);
- } else {
- GtkAdjustment *old_adj;
-
- old_adj = gtk_range_get_adjustment (GTK_RANGE (priv->hsb));
- if (old_adj == adj)
- return;
-
- gtk_signal_disconnect_by_func (GTK_OBJECT (old_adj),
- GTK_SIGNAL_FUNC (adjustment_changed),
- sf);
- gtk_range_set_adjustment (GTK_RANGE (priv->hsb), adj);
- }
-
- adj = gtk_range_get_adjustment (GTK_RANGE (priv->hsb));
- gtk_signal_connect (GTK_OBJECT (adj),
- "changed",
- GTK_SIGNAL_FUNC (adjustment_changed),
- sf);
- adjustment_changed (adj, sf);
-
- if (GTK_BIN (sf)->child)
- gtk_widget_set_scroll_adjustments (
- GTK_BIN (sf)->child,
- gtk_range_get_adjustment (GTK_RANGE (priv->hsb)),
- gtk_range_get_adjustment (GTK_RANGE (priv->vsb)));
-}
-
-/**
- * e_scroll_frame_set_vadjustment:
- * @sf: A scroll frame widget.
- * @adj: An adjustment.
- *
- * Sets the adjustment to be used for vertical scrolling in a scroll frame
- * widget.
- **/
-void
-e_scroll_frame_set_vadjustment (EScrollFrame *sf, GtkAdjustment *adj)
-{
- ScrollFramePrivate *priv;
-
- g_return_if_fail (sf != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (sf));
-
- priv = sf->priv;
-
- if (adj)
- g_return_if_fail (GTK_IS_ADJUSTMENT (adj));
- else
- adj = GTK_ADJUSTMENT (gtk_object_new (GTK_TYPE_ADJUSTMENT, NULL));
-
- if (!priv->vsb) {
- gtk_widget_push_composite_child ();
- priv->vsb = gtk_vscrollbar_new (adj);
- gtk_widget_set_composite_name (priv->vsb, "vscrollbar");
- gtk_widget_pop_composite_child ();
-
- gtk_widget_set_parent (priv->vsb, GTK_WIDGET (sf));
- gtk_widget_ref (priv->vsb);
- gtk_widget_show (priv->vsb);
- } else {
- GtkAdjustment *old_adj;
-
- old_adj = gtk_range_get_adjustment (GTK_RANGE (priv->vsb));
- if (old_adj == adj)
- return;
-
- gtk_signal_disconnect_by_func (GTK_OBJECT (old_adj),
- GTK_SIGNAL_FUNC (adjustment_changed),
- sf);
- gtk_range_set_adjustment (GTK_RANGE (priv->vsb), adj);
- }
-
- adj = gtk_range_get_adjustment (GTK_RANGE (priv->vsb));
- gtk_signal_connect (GTK_OBJECT (adj),
- "changed",
- GTK_SIGNAL_FUNC (adjustment_changed),
- sf);
- adjustment_changed (adj, sf);
-
- if (GTK_BIN (sf)->child)
- gtk_widget_set_scroll_adjustments (
- GTK_BIN (sf)->child,
- gtk_range_get_adjustment (GTK_RANGE (priv->hsb)),
- gtk_range_get_adjustment (GTK_RANGE (priv->vsb)));
-}
-
-/**
- * e_scroll_frame_get_hadjustment:
- * @sf: A scroll frame widget.
- *
- * Queries the horizontal adjustment of a scroll frame widget.
- *
- * Return value: The horizontal adjustment of the scroll frame, or NULL if none.
- **/
-GtkAdjustment *
-e_scroll_frame_get_hadjustment (EScrollFrame *sf)
-{
- ScrollFramePrivate *priv;
-
- g_return_val_if_fail (sf != NULL, NULL);
- g_return_val_if_fail (E_IS_SCROLL_FRAME (sf), NULL);
-
- priv = sf->priv;
-
- return priv->hsb ? gtk_range_get_adjustment (GTK_RANGE (priv->hsb)) : NULL;
-}
-
-/**
- * e_scroll_frame_get_vadjustment:
- * @sf: A scroll frame widget.
- *
- * Queries the vertical adjustment of a scroll frame widget.
- *
- * Return value: The vertical adjustment of the scroll frame, or NULL if none.
- **/
-GtkAdjustment *
-e_scroll_frame_get_vadjustment (EScrollFrame *sf)
-{
- ScrollFramePrivate *priv;
-
- g_return_val_if_fail (sf != NULL, NULL);
- g_return_val_if_fail (E_IS_SCROLL_FRAME (sf), NULL);
-
- priv = sf->priv;
-
- return priv->vsb ? gtk_range_get_adjustment (GTK_RANGE (priv->vsb)) : NULL;
-}
-
-/**
- * e_scroll_frame_set_policy:
- * @sf: A scroll frame widget.
- * @hsb_policy: Policy for the horizontal scrollbar.
- * @vsb_policy: Policy for the vertical scrollbar.
- *
- * Sets the scrollbar policies of a scroll frame widget. These determine when
- * the scrollbars are to be shown or hidden.
- **/
-void
-e_scroll_frame_set_policy (EScrollFrame *sf,
- GtkPolicyType hsb_policy,
- GtkPolicyType vsb_policy)
-{
- ScrollFramePrivate *priv;
-
- g_return_if_fail (sf != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (sf));
-
- priv = sf->priv;
-
- if (priv->hsb_policy == hsb_policy && priv->vsb_policy == vsb_policy)
- return;
-
- priv->hsb_policy = hsb_policy;
- priv->vsb_policy = vsb_policy;
-
- gtk_widget_queue_resize (GTK_WIDGET (sf));
-}
-
-/**
- * e_scroll_frame_set_placement:
- * @sf: A scroll frame widget.
- * @frame_placement: Placement for the frame.
- *
- * Sets the placement of a scroll frame widget's frame with respect to its
- * scrollbars.
- **/
-void
-e_scroll_frame_set_placement (EScrollFrame *sf, GtkCornerType frame_placement)
-{
- ScrollFramePrivate *priv;
-
- g_return_if_fail (sf != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (sf));
-
- priv = sf->priv;
-
- if (priv->frame_placement == frame_placement)
- return;
-
- priv->frame_placement = frame_placement;
- gtk_widget_queue_resize (GTK_WIDGET (sf));
-}
-
-/**
- * e_scroll_frame_set_shadow_type:
- * @sf: A scroll frame widget.
- * @shadow_type: A shadow type.
- *
- * Sets the shadow type of a scroll frame widget. You can use this when you
- * insert a child that does not paint a frame on its own.
- **/
-void
-e_scroll_frame_set_shadow_type (EScrollFrame *sf, GtkShadowType shadow_type)
-{
- ScrollFramePrivate *priv;
-
- g_return_if_fail (sf != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (sf));
- g_return_if_fail (shadow_type >= GTK_SHADOW_NONE && shadow_type <= GTK_SHADOW_ETCHED_OUT);
-
- priv = sf->priv;
-
- if (priv->shadow_type == shadow_type)
- return;
-
- priv->shadow_type = shadow_type;
- gtk_widget_queue_resize (GTK_WIDGET (sf));
-}
-
-/**
- * e_scroll_frame_set_scrollbar_spacing:
- * @sf: A scroll frame widget.
- * @spacing: Desired spacing in pixels.
- *
- * Sets the spacing between the frame and the scrollbars of a scroll frame
- * widget.
- **/
-void
-e_scroll_frame_set_scrollbar_spacing (EScrollFrame *sf, guint spacing)
-{
- ScrollFramePrivate *priv;
-
- g_return_if_fail (sf != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (sf));
-
- priv = sf->priv;
-
- if (priv->sb_spacing == spacing)
- return;
-
- priv->sb_spacing = spacing;
- gtk_widget_queue_resize (GTK_WIDGET (sf));
-}
-
-/**
- * e_scroll_frame_add_with_viewport:
- * @sf: A scroll frame widget.
- * @child: A widget.
- *
- * Creates a #GtkViewport and puts the specified child inside it, thus allowing
- * the viewport to be scrolled by the scroll frame widget. This is meant to be
- * used only when a child does not support the scrolling interface.
- **/
-void
-e_scroll_frame_add_with_viewport (EScrollFrame *sf, GtkWidget *child)
-{
- ScrollFramePrivate *priv;
- GtkBin *bin;
- GtkWidget *viewport;
-
- g_return_if_fail (sf != NULL);
- g_return_if_fail (E_IS_SCROLL_FRAME (sf));
- g_return_if_fail (child != NULL);
- g_return_if_fail (GTK_IS_WIDGET (child));
- g_return_if_fail (child->parent == NULL);
-
- priv = sf->priv;
- bin = GTK_BIN (sf);
-
- if (bin->child != NULL) {
- g_return_if_fail (GTK_IS_VIEWPORT (bin->child));
- g_return_if_fail (GTK_BIN (bin->child)->child == NULL);
-
- viewport = bin->child;
- } else {
- viewport = gtk_viewport_new (e_scroll_frame_get_hadjustment (sf),
- e_scroll_frame_get_vadjustment (sf));
- gtk_container_add (GTK_CONTAINER (sf), viewport);
- }
-
- gtk_widget_show (viewport);
- gtk_container_add (GTK_CONTAINER (viewport), child);
-}
diff --git a/widgets/misc/e-scroll-frame.h b/widgets/misc/e-scroll-frame.h
deleted file mode 100644
index 4bdeee3e1d..0000000000
--- a/widgets/misc/e-scroll-frame.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * 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; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-/* EScrollFrame based on GtkScrolledWindow.
- *
- * Modifications by Federico Mena <federico@helixcode.com>
- */
-
-#ifndef __E_SCROLL_FRAME_H__
-#define __E_SCROLL_FRAME_H__
-
-
-#include <gdk/gdk.h>
-#include <gtk/gtkbin.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-#define E_TYPE_SCROLL_FRAME (e_scroll_frame_get_type ())
-#define E_SCROLL_FRAME(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SCROLL_FRAME, EScrollFrame))
-#define E_SCROLL_FRAME_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SCROLL_FRAME, \
- EScrollFrameClass))
-#define E_IS_SCROLL_FRAME(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SCROLL_FRAME))
-#define E_IS_SCROLL_FRAME_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SCROLL_FRAME))
-
-
-typedef struct _EScrollFrame EScrollFrame;
-typedef struct _EScrollFrameClass EScrollFrameClass;
-
-struct _EScrollFrame
-{
- GtkBin bin;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _EScrollFrameClass
-{
- GtkBinClass parent_class;
-};
-
-
-GtkType e_scroll_frame_get_type (void);
-GtkWidget *e_scroll_frame_new (GtkAdjustment *hadj, GtkAdjustment *vadj);
-
-void e_scroll_frame_set_hadjustment (EScrollFrame *sf, GtkAdjustment *adj);
-void e_scroll_frame_set_vadjustment (EScrollFrame *sf, GtkAdjustment *adj);
-
-GtkAdjustment *e_scroll_frame_get_hadjustment (EScrollFrame *sf);
-GtkAdjustment *e_scroll_frame_get_vadjustment (EScrollFrame *sf);
-
-void e_scroll_frame_set_policy (EScrollFrame *sf,
- GtkPolicyType hsb_policy,
- GtkPolicyType vsb_policy);
-
-void e_scroll_frame_set_placement (EScrollFrame *sf, GtkCornerType frame_placement);
-void e_scroll_frame_set_shadow_type (EScrollFrame *sf, GtkShadowType shadow_type);
-void e_scroll_frame_set_scrollbar_spacing (EScrollFrame *sf, guint spacing);
-
-void e_scroll_frame_add_with_viewport (EScrollFrame *sf, GtkWidget *child);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_SCROLL_FRAME_H__ */
diff --git a/widgets/misc/e-title-bar.c b/widgets/misc/e-title-bar.c
deleted file mode 100644
index 30c4a42c88..0000000000
--- a/widgets/misc/e-title-bar.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-title-bar.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkbox.h>
-#include <gtk/gtkbutton.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkpixmap.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtktypeutils.h>
-
-#include "e-util/e-util.h"
-#include "e-clipped-label.h"
-
-#include "e-title-bar.h"
-
-
-enum {
- TITLE_BUTTON_PRESS_EVENT,
- CLOSE_BUTTON_CLICKED,
- LAST_SIGNAL
-};
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-static char *close_button_xpm[] = {
- "12 12 2 1",
- " c none",
- ". c #000000000000",
- " ",
- " .. .. ",
- " ... ... ",
- " ... ... ",
- " ...... ",
- " .... ",
- " .... ",
- " ...... ",
- " ... ... ",
- " ... ... ",
- " .. .. ",
- " "
-};
-
-#define PARENT_TYPE GTK_TYPE_FRAME
-static GtkFrameClass *parent_class = NULL;
-
-struct _ETitleBarPrivate {
- GtkWidget *label;
- GtkWidget *close_button;
- GtkWidget *close_button_gtk_pixmap;
-};
-
-
-/* Child signal callbacks. */
-
-static void
-close_button_realize_cb (GtkWidget *widget,
- gpointer data)
-{
- GdkPixmap *close_button_pixmap;
- GdkBitmap *close_button_mask;
- ETitleBar *title_bar;
- ETitleBarPrivate *priv;
-
- title_bar = E_TITLE_BAR (data);
- priv = title_bar->priv;
-
- if (priv->close_button_gtk_pixmap != NULL)
- return;
-
- close_button_pixmap = gdk_pixmap_create_from_xpm_d (GTK_WIDGET (priv->close_button)->window,
- &close_button_mask,
- NULL, close_button_xpm);
- priv->close_button_gtk_pixmap = gtk_pixmap_new (close_button_pixmap, close_button_mask);
-
- gtk_container_add (GTK_CONTAINER (priv->close_button), priv->close_button_gtk_pixmap);
- gtk_widget_show (priv->close_button_gtk_pixmap);
-
- gdk_pixmap_unref (close_button_pixmap);
- gdk_bitmap_unref (close_button_mask);
-}
-
-static void
-close_button_clicked_cb (GtkButton *button,
- gpointer data)
-{
- ETitleBar *title_bar;
-
- title_bar = E_TITLE_BAR (data);
-
- gtk_signal_emit (GTK_OBJECT (title_bar), signals[CLOSE_BUTTON_CLICKED]);
-}
-
-static void
-label_button_press_event_cb (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data)
-{
- ETitleBar *title_bar;
-
- title_bar = E_TITLE_BAR (data);
-
- gtk_signal_emit (GTK_OBJECT (title_bar), signals[TITLE_BUTTON_PRESS_EVENT], event);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- ETitleBar *title_bar;
- ETitleBarPrivate *priv;
-
- title_bar = E_TITLE_BAR (object);
- priv = title_bar->priv;
-
- g_free (priv);
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-class_init (ETitleBarClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass*) klass;
- object_class->destroy = destroy;
-
- parent_class = gtk_type_class (gtk_frame_get_type ());
-
- signals[TITLE_BUTTON_PRESS_EVENT] =
- gtk_signal_new ("title_button_press_event",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETitleBarClass, title_button_press_event),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_GDK_EVENT);
-
- signals[CLOSE_BUTTON_CLICKED] =
- gtk_signal_new ("close_button_clicked",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETitleBarClass, close_button_clicked),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
-}
-
-static void
-init (ETitleBar *title_bar)
-{
- ETitleBarPrivate *priv;
-
- priv = g_new (ETitleBarPrivate, 1);
-
- priv->label = NULL;
- priv->close_button = NULL;
- priv->close_button_gtk_pixmap = NULL;
-
- title_bar->priv = priv;
-}
-
-
-void
-e_title_bar_construct (ETitleBar *title_bar,
- const char *title)
-{
- ETitleBarPrivate *priv;
- GtkWidget *hbox;
-
- g_return_if_fail (title_bar != NULL);
- g_return_if_fail (E_IS_TITLE_BAR (title_bar));
-
- priv = title_bar->priv;
-
- priv->label = e_clipped_label_new (title);
- gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5);
- gtk_widget_show (priv->label);
-
- priv->close_button = gtk_button_new ();
- GTK_WIDGET_UNSET_FLAGS (priv->close_button, GTK_CAN_FOCUS);
- gtk_container_set_border_width (GTK_CONTAINER (priv->close_button), 1);
- gtk_button_set_relief (GTK_BUTTON (priv->close_button), GTK_RELIEF_NONE);
- gtk_widget_show (priv->close_button);
-
- hbox = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), priv->label, TRUE, TRUE, 2);
- gtk_box_pack_start (GTK_BOX (hbox), priv->close_button, FALSE, TRUE, 1);
- gtk_widget_show (hbox);
-
- gtk_container_add (GTK_CONTAINER (title_bar), hbox);
-
- gtk_signal_connect (GTK_OBJECT (priv->close_button), "realize",
- GTK_SIGNAL_FUNC (close_button_realize_cb), title_bar);
- gtk_signal_connect (GTK_OBJECT (priv->close_button), "clicked",
- GTK_SIGNAL_FUNC (close_button_clicked_cb), title_bar);
- gtk_signal_connect (GTK_OBJECT (priv->label), "button_press_event",
- GTK_SIGNAL_FUNC (label_button_press_event_cb), title_bar);
-}
-
-GtkWidget *
-e_title_bar_new (const char *title)
-{
- ETitleBar *title_bar;
-
- title_bar = gtk_type_new (e_title_bar_get_type ());
-
- e_title_bar_construct (title_bar, title);
-
- return GTK_WIDGET (title_bar);
-}
-
-
-void
-e_title_bar_set_title (ETitleBar *title_bar,
- const char *title)
-{
- g_return_if_fail (title_bar != NULL);
- g_return_if_fail (E_IS_TITLE_BAR (title_bar));
-
- e_clipped_label_set_text (E_CLIPPED_LABEL (title_bar->priv->label), title);
-}
-
-void
-e_title_bar_show_close_button (ETitleBar *title_bar,
- gboolean show)
-{
- ETitleBarPrivate *priv;
-
- g_return_if_fail (title_bar != NULL);
- g_return_if_fail (E_IS_TITLE_BAR (title_bar));
-
- priv = title_bar->priv;
-
- if (show)
- gtk_widget_show (priv->close_button);
- else
- gtk_widget_hide (priv->close_button);
-}
-
-
-E_MAKE_TYPE (e_title_bar, "ETitleBar", ETitleBar, class_init, init, PARENT_TYPE)
diff --git a/widgets/misc/e-title-bar.h b/widgets/misc/e-title-bar.h
deleted file mode 100644
index ce7d23b07b..0000000000
--- a/widgets/misc/e-title-bar.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-title-bar.h
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __E_TITLE_BAR_H__
-#define __E_TITLE_BAR_H__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkframe.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_TITLE_BAR (e_title_bar_get_type ())
-#define E_TITLE_BAR(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TITLE_BAR, ETitleBar))
-#define E_TITLE_BAR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TITLE_BAR, ETitleBarClass))
-#define E_IS_TITLE_BAR(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TITLE_BAR))
-#define E_IS_TITLE_BAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_TITLE_BAR))
-
-
-typedef struct _ETitleBar ETitleBar;
-typedef struct _ETitleBarPrivate ETitleBarPrivate;
-typedef struct _ETitleBarClass ETitleBarClass;
-
-struct _ETitleBar {
- GtkFrame parent;
-
- ETitleBarPrivate *priv;
-};
-
-struct _ETitleBarClass {
- GtkFrameClass parent_class;
-
- /* Signals. */
-
- void (* title_button_press_event) (ETitleBar *title_bar, GdkEventButton *event);
- void (* close_button_clicked) (ETitleBar *title_bar);
-};
-
-
-GtkType e_title_bar_get_type (void);
-void e_title_bar_construct (ETitleBar *title_bar,
- const char *title);
-GtkWidget *e_title_bar_new (const char *title);
-
-void e_title_bar_set_title (ETitleBar *title_bar,
- const char *title);
-void e_title_bar_show_close_button (ETitleBar *title_bar,
- gboolean show);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_TITLE_BAR_H__ */
diff --git a/widgets/misc/pixmaps/cursor_cross.xpm b/widgets/misc/pixmaps/cursor_cross.xpm
deleted file mode 100644
index cf9d0aca33..0000000000
--- a/widgets/misc/pixmaps/cursor_cross.xpm
+++ /dev/null
@@ -1,38 +0,0 @@
-/* XPM */
-static char * cursor_cross_xpm[] = {
-"32 32 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ....... ",
-" .+++++.. ",
-" .+++++.. ",
-" .+++++.. ",
-" .+++++.. ",
-" ......+++++...... ",
-" .+++++++++++++++.. ",
-" .+++++++++++++++.. ",
-" .+++++++++++++++.. ",
-" .+++++++++++++++.. ",
-" .+++++++++++++++.. ",
-" ......+++++....... ",
-" .....+++++....... ",
-" .+++++.. ",
-" .+++++.. ",
-" .+++++.. ",
-" ........ ",
-" ....... ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" "};
diff --git a/widgets/misc/pixmaps/cursor_hand_closed.xpm b/widgets/misc/pixmaps/cursor_hand_closed.xpm
deleted file mode 100644
index 61a6de4b88..0000000000
--- a/widgets/misc/pixmaps/cursor_hand_closed.xpm
+++ /dev/null
@@ -1,38 +0,0 @@
-/* XPM */
-static char * cursor_hand_closed_xpm[] = {
-"32 32 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" ",
-" .. ",
-" ..++... ",
-" .+++++++.. ",
-" .+++++++++. ",
-" ...+++++++++. ",
-" .++.+++++++++. ",
-" .++++++++++++. ",
-" .+++++++++++. ",
-" .++++++++++. ",
-" .+++++++++. ",
-" .+++++++. ",
-" .++++++. ",
-" .++++++. ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" "};
diff --git a/widgets/misc/pixmaps/cursor_hand_open.xpm b/widgets/misc/pixmaps/cursor_hand_open.xpm
deleted file mode 100644
index 048acc8054..0000000000
--- a/widgets/misc/pixmaps/cursor_hand_open.xpm
+++ /dev/null
@@ -1,38 +0,0 @@
-/* XPM */
-static char * cursor_hand_open_xpm[] = {
-"32 32 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" .. ",
-" .. .++... ",
-" .++..++.++. ",
-" .++..++.++. . ",
-" .++.++.++..+. ",
-" .++.++.++.++. ",
-" .. .+++++++.++. ",
-" .++..++++++++++. ",
-" .+++.+++++++++. ",
-" .++++++++++++. ",
-" .+++++++++++. ",
-" .++++++++++. ",
-" .+++++++++. ",
-" .+++++++. ",
-" .++++++. ",
-" .++++++. ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" "};
diff --git a/widgets/misc/pixmaps/cursor_zoom_in.xpm b/widgets/misc/pixmaps/cursor_zoom_in.xpm
deleted file mode 100644
index 1caf9e3e2a..0000000000
--- a/widgets/misc/pixmaps/cursor_zoom_in.xpm
+++ /dev/null
@@ -1,37 +0,0 @@
-/* XPM */
-static char * cursor_zoom_in_xpm[] = {
-"32 32 2 1",
-" c None",
-". c #000000",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ...... ",
-" .. .. ",
-" .. .. ",
-" . . ",
-" . ... . ",
-" . ... . ",
-" . ....... . ",
-" . ....... . ",
-" . ... . ",
-" . ... .. ",
-" .. . . ",
-" .. . . . ",
-" ........ . . ",
-" ..... . . . ",
-" . . . ",
-" . . . ",
-" . . . ",
-" . . . ",
-" . . ",
-" . . ",
-" .. ",
-" ",
-" ",
-" ",
-" ",
-" "};
diff --git a/widgets/misc/pixmaps/cursor_zoom_out.xpm b/widgets/misc/pixmaps/cursor_zoom_out.xpm
deleted file mode 100644
index af1b698521..0000000000
--- a/widgets/misc/pixmaps/cursor_zoom_out.xpm
+++ /dev/null
@@ -1,37 +0,0 @@
-/* XPM */
-static char * cursor_zoom_out_xpm[] = {
-"32 32 2 1",
-" c None",
-". c #000000",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ...... ",
-" .. .. ",
-" .. .. ",
-" . . ",
-" . . ",
-" . . ",
-" . ....... . ",
-" . ....... . ",
-" . . ",
-" . .. ",
-" .. . . ",
-" .. . . . ",
-" ........ . . ",
-" ..... . . . ",
-" . . . ",
-" . . . ",
-" . . . ",
-" . . . ",
-" . . ",
-" . . ",
-" .. ",
-" ",
-" ",
-" ",
-" ",
-" "};
diff --git a/widgets/misc/test-calendar.c b/widgets/misc/test-calendar.c
deleted file mode 100644
index 6463a21ce3..0000000000
--- a/widgets/misc/test-calendar.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * test-calendar - tests the ECalendar widget.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-
-#include "e-calendar.h"
-
-static void
-delete_event_cb (GtkWidget *widget,
- GdkEventAny *event,
- gpointer data)
-{
- gtk_main_quit ();
-}
-
-int
-main (int argc, char **argv)
-{
- GtkWidget *app;
- GtkWidget *cal;
- GtkWidget *vbox;
-
- gnome_init ("test-calendar", "0.0", argc, argv);
-
- app = gnome_app_new ("Test", "Test");
- gtk_window_set_default_size (GTK_WINDOW (app), 400, 400);
- gtk_window_set_policy (GTK_WINDOW (app), FALSE, TRUE, FALSE);
-
- gtk_signal_connect (GTK_OBJECT (app), "delete_event",
- GTK_SIGNAL_FUNC (delete_event_cb), NULL);
-
- cal = e_calendar_new ();
- gtk_widget_show (cal);
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), cal, TRUE, TRUE, 0);
- gtk_widget_show (vbox);
-
- gnome_app_set_contents (GNOME_APP (app), vbox);
- gtk_widget_show (app);
-
- gtk_main ();
-
- return 0;
-}
diff --git a/widgets/misc/test-title-bar.c b/widgets/misc/test-title-bar.c
deleted file mode 100644
index fdca1ae0db..0000000000
--- a/widgets/misc/test-title-bar.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-title-bar.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * 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.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-
-#include "e-title-bar.h"
-
-static void
-delete_event_cb (GtkWidget *widget,
- GdkEventAny *event,
- gpointer data)
-{
- gtk_main_quit ();
-}
-
-int
-main (int argc, char **argv)
-{
- GtkWidget *app;
- GtkWidget *title_bar;
- GtkWidget *text;
- GtkWidget *vbox;
-
- gnome_init ("test-title-bar", "0.0", argc, argv);
-
- app = gnome_app_new ("Test", "Test");
- gtk_window_set_default_size (GTK_WINDOW (app), 400, 400);
- gtk_window_set_policy (GTK_WINDOW (app), FALSE, TRUE, FALSE);
-
- gtk_signal_connect (GTK_OBJECT (app), "delete_event", GTK_SIGNAL_FUNC (delete_event_cb), NULL);
-
- title_bar = e_title_bar_new ("This is a very annoyingly long title bar");
- gtk_widget_show (title_bar);
-
- text = gtk_text_new (NULL, NULL);
- gtk_widget_show (text);
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), title_bar, FALSE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), text, TRUE, TRUE, 0);
- gtk_widget_show (vbox);
-
- gnome_app_set_contents (GNOME_APP (app), vbox);
- gtk_widget_show (app);
-
- gtk_main ();
-
- return 0;
-}
diff --git a/widgets/shortcut-bar/.cvsignore b/widgets/shortcut-bar/.cvsignore
deleted file mode 100644
index d59175edcd..0000000000
--- a/widgets/shortcut-bar/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-*.o
-libshortcut-bar.a
-Makefile
-Makefile.in
-.deps
-.libs
-.pure
-test-shortcut-bar
diff --git a/widgets/shortcut-bar/ChangeLog b/widgets/shortcut-bar/ChangeLog
deleted file mode 100644
index 3ca816c467..0000000000
--- a/widgets/shortcut-bar/ChangeLog
+++ /dev/null
@@ -1,276 +0,0 @@
-2000-08-16 Larry Ewing <lewing@helixcode.com>
-
- * e-icon-bar.c (e_icon_bar_init): remove COLOR_TEXT references.
-
-2000-08-16 Larry Ewing <lewing@helixcode.com>
-
- * e-icon-bar.h (enum): get rid of COLOR_TEXT.
- (struct _EIconBarItem): add pixbuf member to hold unmodified
- pixbuf.
-
- * e-icon-bar.c (e_icon_bar_style_set): update the image and the
- colors based on the new style.
- (e_icon_bar_add_item): store the full alpha pixbuf so that we can
- update the background color if the style changes. Use the style
- colors where appropriate.
- (e_icon_bar_on_editing_stopped): revert to style colors.
- (e_icon_bar_on_editing_started): use style fg instead of
- COLOR_TEXT.
-
- * e-shortcut-bar.c (e_shortcut_bar_add_group): add an #ifndef
- E_USE_STYLES around the call to e_shortcut_bar_set_canvas_style to
- allow people to test out the style stuff that is in progress.
-
-2000-07-16 Damon Chaplin <damon@helixcode.com>
-
- * e-shortcut-model.[hc]: new files implementing a simple model for
- the shortcuts, so we can have multiple views.
-
- * Makefile.am (libshortcut_bar_a_SOURCES): added e-shortcut-model.[hc]
-
- * e-shortcut-bar.h: updated to use the model.
-
- * e-icon-bar.c (e_icon_bar_item_pressed): set mouse_over_item_num as
- well as pressed_item_num to fix bug.
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-group-bar.c (e_group_bar_add): Set `group_bar'.
-
-2000-06-19 Damon Chaplin <damon@helixcode.com>
-
- * e-icon-bar-bg-item.c:
- * e-icon-bar.c:
- * e-icon-bar.h:
- * e-vscrolled-bar.c: added support for scroll-wheels.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * e-icon-bar.c: Free all the item data.
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shortcut-bar.c (e_shortcut_bar_get_view_type): New function.
-
-2000-05-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shortcut-bar.c (e_shortcut_bar_load_image): Leak plug: free
- pathname returned from `gnome_pixmap_file()'.
-
- * Makefile.am: Add `-I$(top_srcdir)'.
-
-2000-05-24 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added libepaned.a.
-
- * test-shortcut-bar.c: Switched from GtkPaned to EPaned.
-
-2000-05-18 Damon Chaplin <damon@helixcode.com>
-
- * e-shortcut-bar.[hc]: new signals "added_item", "removed_item",
- "added_group", "removed_group". Note that the removed signals are
- emitted just before the item/group is actually removed.
-
- * test-shortcut-bar.c: updated to test the new signals, and ref'ed
- the pixbufs in the icon callback.
-
-2000-05-16 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-clipped-label.c: Moved to $(top_srcdir)/widgets/misc.
- * e-clipped-label.h: Likewise.
- * Makefile.am: Updated accordingly.
-
-2000-05-07 Larry Ewing <lewing@helixcode.com>
-
- * e-icon-bar.h (struct _EIconBarItem): remove the no longer needed
- flatened_alpha member.
-
- * e-icon-bar.c (flatten_alpha): using ~rgb can cause visual
- artifacts.
- (e_icon_bar_add_item): fixup refcounting of the flattend pixbuf,
- the canvas item should hold the reference not us. Stop using
- item.flattened_alpha since it no longer exists.
- (e_icon_bar_remove_item): remove the unref since destroying the
- item will take care of that for us.
-
- * e-shortcut-bar.c (e_shortcut_bar_add_item): make sure to unref
- the image we get back, the icon bar will hold any references it
- needs.
- (e_shortcut_bar_get_image_from_url): ref the default image each
- time we return it so that references are counted correctly.
-
-2000-05-04 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-shortcut-bar.h (E_TYPE_SHORTCUT_BAR): New #define.
-
-2000-05-04 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-icon-bar-bg-item.c (e_icon_bar_bg_item_draw): Initialize
- `shadow' to placate compiler.
-
- * e-icon-bar.c (e_icon_bar_add_item): @text made const-safe.
-
- * e-shortcut-bar.c (e_shortcut_bar_add_group): @group_name made
- const-safe.
- (e_shortcut_bar_add_item): @item_url and @item_name made
- const-safe.
- (e_shortcut_bar_get_image_from_url): @item_url made const-safe.
- (e_shortcut_bar_load_image): @filename made const-safe.
-
-2000-05-04 Ettore Perazzoli <ettore@helixcode.com>
-
- * test-shortcut-bar.c (icon_callback): Adapted to the new
- `EShortcutBarIconCallback' typedef: get a @data parameter and get
- a const-safe @url.
-
- * e-shortcut-bar.c (e_shortcut_bar_set_icon_callback): New param
- @data. Set `icon_callback_data' to it.
- (e_shortcut_bar_get_image_from_url): Pass the callback data to the
- callback.
-
- * e-shortcut-bar.h: Changed `EShortcutBarIconCallback' to get a
- const-safe @url parameter and a new @data parameter as a closure.
- New member `data' in `EShortcutBar'.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: set G_LOG_DOMAIN.
-
-2000-04-16 Damon Chaplin <damon@helixcode.com>
-
- * test-shortcut-bar.c: added buttons to test moving/reordering groups.
-
- * e-shortcut-bar.c (e_shortcut_bar_on_drag_end): new function to free
- the dragged name & URL when the drag is finished.
-
- * e-group-bar.c (e_group_bar_get_increment): fixed bug when distance
- was 0. Should just return 0.
- (e_group_bar_set_current_group_num): added animate option and finished.
- (e_group_bar_unmap): called e_group_bar_stop_all_animation().
- (e_group_bar_reorder_group): finished.
-
- * e-icon-bar-text-item.[hc]: removed, since we now use EText.
-
-2000-04-15 Miguel de Icaza <miguel@gnu.org>
-
- * e-group-bar.c (e_group_bar_realize): Do not use the parent
- thingie, because it might be like anything. And anything can be
- like any visual, and we dont like want any visual here.
-
- * e-shortcut-bar.c
- (e_shortcut_bar_add_group): Apply some loving action when it comes
- to visuals and colormaps. Yes, we got one of those machines
- --again--. Sigh. This is what you get when you have been away
- from the Indy. The whole thing is breaking left and right.
-
- Hopefully, Gtk 1.4 fixes all of this, by always running in the
- slowest visual it can find.
-
-2000-04-11 Larry Ewing <lewing@helixcode.com>
-
- * e-icon-bar.c (flatten_alpha): update for
- new gdk-pixbuf.
-
-2000-03-31 Damon Chaplin <damon@helixcode.com>
-
- * e-shortcut-bar.[hc]: added support for a
- callback function to set the icons.
-
- * test-shortcut-bar.c: updated to use the
- callback function.
-
-2000-03-30 Dan Winship <danw@helixcode.com>
-
- * e-shortcut-bar.c: Sort of use the new
- pixmaps. This code needs to be restructured, but Damon is
- rumored to already be doing it.
-
-2000-03-27 Miguel de Icaza <miguel@gnu.org>
-
- * e-icon-bar.c (flatten_alpha): New function,
- used to flatten the images we get and composite them with the
- background.
- (e_icon_bar_add_item): One happy tigert comming.
-
-2000-03-21 Christopher James Lahey <clahey@helixcode.com>
-
- * e-icon-bar.c: Updated to fix a few bugs.
-
-2000-02-28 NotZed <NotZed@HelixCode.com>
-
- * Makefile.am (test_shortcut_bar_LDADD):
- Fixed references to eutil.
-
-2000-02-20 Damon Chaplin <damon@helixcode.com>
-
- * Makefile.am: added libetext.a and libeutil.a
- to test_shortcut_bar_LDADD, and got rid of e-icon-bar-text-item.[hc].
- I'll delete these soon.
-
- * e-icon-bar.c: changed to be a subclass of
- ECanvas and to use EText instead of EIconBarTextItem. Also set
- "width_set" & "height_set" of the GnomeCanvasPixbuf items so they
- work in the "Small Icon" view.
-
- * e-vscrolled-bar.c: use map/unmap instead of
- show/hide for the up & down buttons to avoid queueing resizes.
- Otherwise the scrolling starts off a bit jerky.
-
- * test-shortcut-bar.c: output a message when the
- main label is resized, just for info.
-
- * *.[hc]: updated my email address.
-
-2000-02-07 Damon Chaplin <damon@helixcode.com>
-
- * e-group-bar.c (e_group_bar_draw): finished.
-
- * e-icon-bar.c (e_icon_bar_item_released):
- check that an item was pressed.
-
-2000-01-26 bertrand <bertrand@helixcode.com>
-
- * e-icon-bar.c (e_icon_bar_recalc_item_positions):
- don't set the x_set and y_set
- arguments as don't exist in gdk-pixbuf
- anymore.
-
-2000-01-17 Chrsitopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added gnomecanvaspixbuf to the
- list of libraries used.
-
-2000-01-09 Miguel de Icaza <miguel@gnu.org>
-
- * e-icon-bar.c (e_icon_bar_init): Turn on anti-aliasing.
-
-2000-01-08 Miguel de Icaza <miguel@gnu.org>
-
- * e-icon-bar.c (e_icon_bar_add_item): Use
- GdkPixbuf here.
- (e_icon_bar_get_item_image): ditto and initialize image.
-
- * e-shortcut-bar.c (e_shortcut_bar_add_item):
- Use gdk-pixbuf.
-
-2000-01-14 Christopher James Lahey <clahey@helixcode.com>
-
- * e-shortcut-bar.c (e_shortcut_bar_add_item):
- Use e_bar_set_item_data.
-
- Drop item_url; Require image argument; Require user data
- argument.
-
-2000-01-09 Miguel de Icaza <miguel@gnu.org>
-
- * e-icon-bar.c (e_icon_bar_init): Turn on anti-aliasing.
-
-2000-01-08 Miguel de Icaza <miguel@gnu.org>
-
- * e-icon-bar.c (e_icon_bar_add_item): Use
- GdkPixbuf here.
- (e_icon_bar_get_item_image): ditto and initialize image.
-
- * e-shortcut-bar.c (e_shortcut_bar_add_item):
- Use gdk-pixbuf.
-
diff --git a/widgets/shortcut-bar/LICENSE b/widgets/shortcut-bar/LICENSE
deleted file mode 100644
index f58649ad9b..0000000000
--- a/widgets/shortcut-bar/LICENSE
+++ /dev/null
@@ -1 +0,0 @@
-This code is licensed under the terms of the GNU GPL \ No newline at end of file
diff --git a/widgets/shortcut-bar/Makefile.am b/widgets/shortcut-bar/Makefile.am
deleted file mode 100644
index 9f17d684b6..0000000000
--- a/widgets/shortcut-bar/Makefile.am
+++ /dev/null
@@ -1,38 +0,0 @@
-
-noinst_LIBRARIES = libshortcut-bar.a
-noinst_PROGRAMS = test-shortcut-bar
-
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_srcdir)/widgets/misc \
- -DEVOLUTION_VERSION=\""$(VERSION)"\" \
- $(EXTRA_GNOME_CFLAGS) \
- -DG_LOG_DOMAIN=\"shortcut-bar\"
-
-libshortcut_bar_a_SOURCES = \
- e-group-bar.c \
- e-group-bar.h \
- e-icon-bar-bg-item.c \
- e-icon-bar-bg-item.h \
- e-icon-bar.c \
- e-icon-bar.h \
- e-shortcut-bar.c \
- e-shortcut-bar.h \
- e-shortcut-model.c \
- e-shortcut-model.h \
- e-vscrolled-bar.c \
- e-vscrolled-bar.h
-
-test_shortcut_bar_SOURCES = \
- test-shortcut-bar.c
-
-test_shortcut_bar_LDADD = \
- ./libshortcut-bar.a \
- $(top_builddir)/widgets/e-paned/libepaned.a \
- ../e-text/libetext.a \
- ../misc/libemiscwidgets.a \
- ../../e-util/libeutil.la \
- $(EXTRA_GNOME_LIBS)
-
-test_shortcut_bar_LDFLAGS = \
- `gnome-config --libs gdk_pixbuf gnomecanvaspixbuf`
diff --git a/widgets/shortcut-bar/e-group-bar.c b/widgets/shortcut-bar/e-group-bar.c
deleted file mode 100644
index dd78fe6243..0000000000
--- a/widgets/shortcut-bar/e-group-bar.c
+++ /dev/null
@@ -1,1546 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EGroupBar displays a vertical bar with a number of Groups, which are viewed
- * one at a time by selecting the Group's button. When a different Group is
- * selected, it slides into view, and the old Group slides out.
- * It is typically used on the left of the main application window so users
- * can easily access particular features.
- *
- * It is implemented like GtkNotebook, i.e. the main widgets are the children
- * of the EGroupBar and the button widgets are treated specially like the
- * GtkNotebook tab labels.
- */
-
-#include <config.h>
-#include <math.h>
-#include <gnome.h>
-#include "e-group-bar.h"
-
-#define E_GROUP_BAR_SCROLL_TIMEOUT 10
-#define E_GROUP_BAR_MIN_STEP_SIZE 4
-
-#define E_GROUP_BAR_AUTO_SHOW_TIMEOUT 300
-
-
-static void e_group_bar_class_init (EGroupBarClass *class);
-static void e_group_bar_init (EGroupBar *group_bar);
-static void e_group_bar_destroy (GtkObject *object);
-static void e_group_bar_realize (GtkWidget *widget);
-static void e_group_bar_unrealize (GtkWidget *widget);
-static void e_group_bar_map (GtkWidget *widget);
-static void e_group_bar_unmap (GtkWidget *widget);
-static void e_group_bar_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void e_group_bar_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static gint e_group_bar_expose (GtkWidget *widget,
- GdkEventExpose *event);
-static void e_group_bar_draw (GtkWidget *widget,
- GdkRectangle *area);
-static void e_group_bar_add (GtkContainer *container,
- GtkWidget *widget);
-static void e_group_bar_remove (GtkContainer *container,
- GtkWidget *widget);
-static void e_group_bar_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data);
-
-static void e_group_bar_create_group_button_window (EGroupBar *group_bar,
- gint group_num);
-static void e_group_bar_create_group_child_window (EGroupBar *group_bar,
- gint group_num);
-static gint e_group_bar_get_group_button_position (EGroupBar *group_bar,
- gint group_num);
-static gint e_group_bar_sum_button_heights (EGroupBar *group_bar,
- gint first,
- gint last);
-static gint e_group_bar_get_child_height (EGroupBar *group_bar);
-static gint e_group_bar_get_group_child_position (EGroupBar *group_bar,
- gint group_num);
-
-static void e_group_bar_on_button_clicked (GtkWidget *group_button,
- EGroupBar *group_bar);
-static gint e_group_bar_find_button (EGroupBar *group_bar,
- GtkWidget *group_button);
-static void e_group_bar_start_animation (EGroupBar *group_bar,
- gint group_num);
-static gboolean e_group_bar_timeout_handler (gpointer data);
-static gint e_group_bar_get_increment (EGroupBar *group_bar,
- gint window_y,
- gint window_target_y);
-static gboolean e_group_bar_on_button_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- EGroupBar *group_bar);
-static void e_group_bar_on_button_drag_leave (GtkWidget *widget,
- GdkDragContext *context,
- guint time,
- EGroupBar *group_bar);
-static gboolean e_group_bar_auto_show (gpointer data);
-static void e_group_bar_stop_all_animation (EGroupBar *group_bar);
-
-
-static GtkContainerClass *parent_class;
-
-
-GtkType
-e_group_bar_get_type (void)
-{
- static GtkType e_group_bar_type = 0;
-
- if (!e_group_bar_type){
- GtkTypeInfo e_group_bar_info = {
- "EGroupBar",
- sizeof (EGroupBar),
- sizeof (EGroupBarClass),
- (GtkClassInitFunc) e_group_bar_class_init,
- (GtkObjectInitFunc) e_group_bar_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- parent_class = gtk_type_class (GTK_TYPE_CONTAINER);
- e_group_bar_type = gtk_type_unique (GTK_TYPE_CONTAINER,
- &e_group_bar_info);
- }
-
- return e_group_bar_type;
-}
-
-
-static void
-e_group_bar_class_init (EGroupBarClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GtkContainerClass *container_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
- container_class = (GtkContainerClass *) class;
-
- /* Method override */
- object_class->destroy = e_group_bar_destroy;
-
- widget_class->realize = e_group_bar_realize;
- widget_class->unrealize = e_group_bar_unrealize;
- widget_class->map = e_group_bar_map;
- widget_class->unmap = e_group_bar_unmap;
- widget_class->size_request = e_group_bar_size_request;
- widget_class->size_allocate = e_group_bar_size_allocate;
- widget_class->expose_event = e_group_bar_expose;
- widget_class->draw = e_group_bar_draw;
-
- container_class->add = e_group_bar_add;
- container_class->remove = e_group_bar_remove;
- container_class->forall = e_group_bar_forall;
-}
-
-
-static void
-e_group_bar_init (EGroupBar *group_bar)
-{
-
- GTK_WIDGET_UNSET_FLAGS (group_bar, GTK_NO_WINDOW);
-
- /* We don't want child resizes to propagate up to the parent. */
- gtk_container_set_resize_mode (GTK_CONTAINER (group_bar),
- GTK_RESIZE_QUEUE);
-
- group_bar->children = g_array_new (FALSE, FALSE,
- sizeof (EGroupBarChild));
-
- group_bar->current_group_num = -1;
- group_bar->buttons_homogeneous = TRUE;
- group_bar->max_button_height = 0;
- group_bar->animation_timeout_id = 0;
-}
-
-
-/**
- * e_group_bar_new:
- * @Returns: a new #EGroupBar.
- *
- * Creates a new #EGroupBar.
- **/
-GtkWidget *
-e_group_bar_new (void)
-{
- GtkWidget *group_bar;
-
- group_bar = GTK_WIDGET (gtk_type_new (e_group_bar_get_type ()));
-
- return group_bar;
-}
-
-
-static void
-e_group_bar_destroy (GtkObject *object)
-{
- EGroupBar *group_bar;
-
- group_bar = E_GROUP_BAR (object);
-
- e_group_bar_stop_all_animation (group_bar);
-
- /* The parent GtkContainer class will automatically destroy all the
- child widgets, but it calls gtk_container_foreach() so we must not
- destroy our children array until after. */
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-
- g_array_free (group_bar->children, TRUE);
-}
-
-
-static void
-e_group_bar_realize (GtkWidget *widget)
-{
- EGroupBar *group_bar;
- EGroupBarChild *group;
- GdkWindowAttr attributes;
- gint attributes_mask;
- gint border_width, group_num;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_GROUP_BAR (widget));
-
- group_bar = E_GROUP_BAR (widget);
- GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
-
- border_width = GTK_CONTAINER (group_bar)->border_width;
-
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.x = widget->allocation.x + border_width;
- attributes.y = widget->allocation.y + border_width;
- attributes.width = widget->allocation.width - 2 * border_width;
- attributes.height = widget->allocation.height - 2 * border_width;
- attributes.wclass = GDK_INPUT_OUTPUT;
- attributes.visual = gtk_widget_get_visual (widget);
- attributes.colormap = gtk_widget_get_colormap (widget);
- attributes.event_mask = gtk_widget_get_events (widget);
- attributes.event_mask |= (GDK_EXPOSURE_MASK);
-
- attributes_mask = GDK_WA_X | GDK_WA_Y
- | GDK_WA_VISUAL | GDK_WA_COLORMAP;
-
- widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
- &attributes, attributes_mask);
- gdk_window_set_user_data (widget->window, widget);
-
- widget->style = gtk_style_attach (widget->style, widget->window);
- gtk_style_set_background (widget->style, widget->window,
- GTK_STATE_NORMAL);
-
- gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
-
- /* Create windows for all the buttons & group canvases. */
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
- e_group_bar_create_group_button_window (group_bar, group_num);
- e_group_bar_create_group_child_window (group_bar, group_num);
- }
-}
-
-
-static void
-e_group_bar_unrealize (GtkWidget *widget)
-{
- EGroupBar *group_bar;
- EGroupBarChild *group;
- gint group_num;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_GROUP_BAR (widget));
-
- group_bar = E_GROUP_BAR (widget);
-
- /* Destroy the windows for all the buttons & group canvases. */
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- if (group->button_window) {
- gdk_window_set_user_data (group->button_window, NULL);
- gdk_window_destroy (group->button_window);
- group->button_window = NULL;
- }
- if (group->child_window) {
- gdk_window_set_user_data (group->child_window, NULL);
- gdk_window_destroy (group->child_window);
- group->child_window = NULL;
- }
- }
-
- if (GTK_WIDGET_CLASS (parent_class)->unrealize)
- (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
-}
-
-
-static void
-e_group_bar_map (GtkWidget *widget)
-{
- EGroupBar *group_bar;
- EGroupBarChild *group;
- gint group_num;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_GROUP_BAR (widget));
-
- group_bar = E_GROUP_BAR (widget);
-
- GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
-
- /* We do this in reverse order, and lower all the child windows, so
- the stacking order ends up correct. */
- for (group_num = group_bar->children->len - 1;
- group_num >= 0;
- group_num--) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- if (group->button_window) {
- gdk_window_show (group->button_window);
- }
-
- if (group->button
- && GTK_WIDGET_VISIBLE (group->button)
- && !GTK_WIDGET_MAPPED (group->button)) {
- gtk_widget_map (group->button);
- }
-
- if (group->child_window) {
- gdk_window_show (group->child_window);
- gdk_window_lower (group->child_window);
- }
-
- if (group->child
- && GTK_WIDGET_VISIBLE (group->child)
- && !GTK_WIDGET_MAPPED (group->child))
- gtk_widget_map (group->child);
- }
-
- gdk_window_show (widget->window);
-}
-
-
-static void
-e_group_bar_unmap (GtkWidget *widget)
-{
- EGroupBar *group_bar;
- EGroupBarChild *group;
- gint group_num;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_GROUP_BAR (widget));
-
- group_bar = E_GROUP_BAR (widget);
-
- e_group_bar_stop_all_animation (group_bar);
-
- GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
-
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- if (group->button_window) {
- gdk_window_hide (group->button_window);
- }
-
- if (group->button
- && GTK_WIDGET_MAPPED (group->button))
- gtk_widget_unmap (group->button);
-
- if (group->child_window) {
- gdk_window_hide (group->child_window);
- }
-
- if (group->child
- && GTK_WIDGET_MAPPED (group->child))
- gtk_widget_unmap (group->child);
- }
-
- gdk_window_hide (widget->window);
-}
-
-
-static void
-e_group_bar_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- EGroupBar *group_bar;
- EGroupBarChild *group;
- gint group_num, max_child_height;
- GtkRequisition child_requisition;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_GROUP_BAR (widget));
- g_return_if_fail (requisition != NULL);
-
- group_bar = E_GROUP_BAR (widget);
-
- /* We set the requisition width to the largest requested width of the
- child widgets. The requisition height is set to the sum of all the
- button heights plus the height of the largest child. */
- requisition->width = 0;
- requisition->height = 0;
-
- /* We have to call size_request on all children, even though we don't
- use the results, since some widgets like GtkLabel depend on it. */
- group_bar->max_button_height = 0;
- max_child_height = 0;
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- if (group->button) {
- gtk_widget_size_request (group->button,
- &child_requisition);
- group->button_height = child_requisition.height;
- } else {
- group->button_height = 0;
- }
-
- group_bar->max_button_height = MAX (group_bar->max_button_height, group->button_height);
- requisition->height += child_requisition.height;
-
- if (group->child) {
- gtk_widget_size_request (group->child,
- &child_requisition);
- max_child_height = MAX (max_child_height,
- child_requisition.height);
- requisition->width = MAX (requisition->width,
- child_requisition.width);
- }
- }
-
- requisition->height += max_child_height;
-
- /* Add on the standard container border widths. */
- requisition->width += GTK_CONTAINER (widget)->border_width * 2;
- requisition->height += GTK_CONTAINER (widget)->border_width * 2;
-}
-
-
-static void
-e_group_bar_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
-{
- EGroupBar *group_bar;
- EGroupBarChild *group;
- gint group_num, border_width, width, height, child_height, y;
- GtkAllocation button_allocation, child_allocation;
-
- group_bar = E_GROUP_BAR (widget);
-
- /* All child & button windows and widgets use the same width as the
- group bar minus the border width. */
- border_width = GTK_CONTAINER (widget)->border_width;
- width = allocation->width - border_width * 2;
- height = allocation->height - border_width * 2;
-
- widget->allocation = *allocation;
- if (GTK_WIDGET_REALIZED (widget))
- gdk_window_move_resize (widget->window,
- allocation->x + border_width,
- allocation->y + border_width,
- width, height);
-
- /* All the child widgets use the same height. */
- child_height = e_group_bar_get_child_height (group_bar);
-
- /* The buttons are always in the top-left of the button windows, and
- all have the same width. The height is calculated for each group. */
- button_allocation.x = 0;
- button_allocation.y = 0;
- button_allocation.width = width;
-
- /* The child widgets are always in the top-left of the child windows,
- and all have the same width and height. */
- child_allocation.x = 0;
- child_allocation.y = 0;
- child_allocation.width = width;
- child_allocation.height = child_height;
-
- /* Step through the groups, placing the windows as necessary, and
- allocating the areas for the child widgets. Note that if a button
- or child window is in the middle of an animation, we just resize it
- and update the target position, and let the animation continue. */
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- /* Calculate the y position of the button, which depends on
- the currently selected group and the button heights. */
- y = e_group_bar_get_group_button_position (group_bar, group_num);
- button_allocation.height = group_bar->buttons_homogeneous ? group_bar->max_button_height : group->button_height;
-
- if (GTK_WIDGET_REALIZED (group->button)) {
- if (group->button_window_in_animation) {
- gdk_window_resize (group->button_window,
- width, button_allocation.height);
- group->button_window_target_y = y;
- } else {
- gdk_window_move_resize (group->button_window,
- 0, y, width, button_allocation.height);
- }
- }
- gtk_widget_size_allocate (group->button, &button_allocation);
-
- if (GTK_WIDGET_REALIZED (group->child)) {
- if (group->child_window_in_animation) {
- gdk_window_resize (group->child_window,
- width, child_height);
- group->child_window_target_y = y + button_allocation.height;
- } else {
- gdk_window_move_resize (group->child_window,
- 0, y + button_allocation.height,
- width, child_height);
- }
- }
- gtk_widget_size_allocate (group->child, &child_allocation);
- }
-}
-
-
-static gint
-e_group_bar_expose (GtkWidget *widget,
- GdkEventExpose *event)
-{
- EGroupBar *group_bar;
- EGroupBarChild *group;
- GdkEventExpose child_event;
- gint group_num;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_GROUP_BAR (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- if (GTK_WIDGET_DRAWABLE (widget)) {
- group_bar = E_GROUP_BAR (widget);
-
- child_event = *event;
-
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- if (event->window == group->button_window
- && GTK_WIDGET_DRAWABLE (group->button)
- && GTK_WIDGET_NO_WINDOW (group->button)
- && gtk_widget_intersect (group->button, &event->area, &child_event.area))
- gtk_widget_event (group->button, (GdkEvent*) &child_event);
-
- if (event->window == group->child_window
- && GTK_WIDGET_DRAWABLE (group->child)
- && GTK_WIDGET_NO_WINDOW (group->child)
- && gtk_widget_intersect (group->child, &event->area, &child_event.area))
- gtk_widget_event (group->child, (GdkEvent*) &child_event);
- }
- }
-
- return FALSE;
-}
-
-
-static void
-e_group_bar_draw (GtkWidget *widget,
- GdkRectangle *area)
-{
- EGroupBar *group_bar;
- EGroupBarChild *group;
- gint group_num;
- GdkRectangle child_area;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_GROUP_BAR (widget));
-
- if (GTK_WIDGET_DRAWABLE (widget)) {
- group_bar = E_GROUP_BAR (widget);
-
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- if (GTK_WIDGET_DRAWABLE (group->button)
- && gtk_widget_intersect (group->button, area, &child_area))
- gtk_widget_draw (group->button, &child_area);
-
- if (GTK_WIDGET_DRAWABLE (group->child)
- && gtk_widget_intersect (group->child, area, &child_area))
- gtk_widget_draw (group->child, &child_area);
- }
- }
-}
-
-
-static void
-e_group_bar_add (GtkContainer *container,
- GtkWidget *widget)
-{
- EGroupBar *group_bar;
- GtkWidget *button;
- gchar buffer[32];
-
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_GROUP_BAR (container));
- g_return_if_fail (widget != NULL);
-
- group_bar = E_GROUP_BAR (container);
-
- g_snprintf (buffer, sizeof (buffer), _("Group %i"),
- group_bar->children->len + 1);
- button = gtk_button_new_with_label (buffer);
- gtk_widget_show (button);
-
- e_group_bar_add_group (group_bar, widget, button, -1);
-}
-
-
-static void
-e_group_bar_remove (GtkContainer *container,
- GtkWidget *widget)
-{
- EGroupBar *group_bar;
- gint group_num;
-
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_GROUP_BAR (container));
- g_return_if_fail (widget != NULL);
-
- group_bar = E_GROUP_BAR (container);
-
- group_num = e_group_bar_get_group_num (group_bar, widget);
- e_group_bar_remove_group (group_bar, group_num);
-}
-
-
-static void
-e_group_bar_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data)
-{
- EGroupBar *group_bar;
- EGroupBarChild *group;
- gint group_num;
- GList *tmp_list;
-
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_GROUP_BAR (container));
- g_return_if_fail (callback != NULL);
-
- group_bar = E_GROUP_BAR (container);
-
- /* Note that drag-and-drop does not check the Z-order of widgets, so
- we have to iterate through them from top to bottom, or it will
- not work properly. We also have to use temporary lists so widgets
- can be safely destroyed while iterating. */
-
- if (include_internals) {
- tmp_list = NULL;
- for (group_num = group_bar->children->len - 1;
- group_num >= 0;
- group_num--) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- if (group->button)
- tmp_list = g_list_prepend (tmp_list,
- group->button);
- }
-
- g_list_foreach (tmp_list, (GFunc) callback, callback_data);
- g_list_free (tmp_list);
- }
-
- tmp_list = NULL;
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- if (group->child)
- tmp_list = g_list_prepend (tmp_list, group->child);
- }
- g_list_foreach (tmp_list, (GFunc) callback, callback_data);
- g_list_free (tmp_list);
-}
-
-
-static void
-e_group_bar_create_group_button_window (EGroupBar *group_bar,
- gint group_num)
-{
- EGroupBarChild *group;
- GtkWidget *widget;
- GdkWindowAttr attributes;
- gint attributes_mask;
- gint y, height, border_width;
-
- widget = GTK_WIDGET (group_bar);
-
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
- y = e_group_bar_get_group_button_position (group_bar, group_num);
- height = group_bar->buttons_homogeneous ? group_bar->max_button_height
- : group->button_height;
- border_width = GTK_CONTAINER (group_bar)->border_width;
-
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.x = 0;
- attributes.y = y;
- attributes.width = widget->allocation.width - 2 * border_width;
- attributes.height = height;
- attributes.wclass = GDK_INPUT_OUTPUT;
- attributes.visual = gtk_widget_get_visual (widget);
- attributes.colormap = gtk_widget_get_colormap (widget);
- attributes.event_mask = gtk_widget_get_events (widget);
- attributes.event_mask |= (GDK_EXPOSURE_MASK);
-
- attributes_mask = GDK_WA_X | GDK_WA_Y
- | GDK_WA_VISUAL | GDK_WA_COLORMAP;
-
- group->button_window = gdk_window_new (widget->window, &attributes,
- attributes_mask);
- gdk_window_set_user_data (group->button_window, widget);
-
- gtk_widget_set_parent_window (group->button,
- group->button_window);
- gdk_window_set_back_pixmap (group->button_window, NULL, TRUE);
-}
-
-
-static void
-e_group_bar_create_group_child_window (EGroupBar *group_bar,
- gint group_num)
-{
- EGroupBarChild *group;
- GtkWidget *widget;
- GdkWindowAttr attributes;
- gint attributes_mask;
- gint y, height, border_width;
-
- widget = GTK_WIDGET (group_bar);
-
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
- y = e_group_bar_get_group_button_position (group_bar, group_num);
- y += group_bar->buttons_homogeneous ? group_bar->max_button_height
- : group->button_height;
- height = e_group_bar_get_child_height (group_bar);
- border_width = GTK_CONTAINER (group_bar)->border_width;
-
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.x = 0;
- attributes.y = y;
- attributes.width = widget->allocation.width - 2 * border_width;
- attributes.height = height;
- attributes.wclass = GDK_INPUT_OUTPUT;
- attributes.visual = gtk_widget_get_visual (widget);
- attributes.colormap = gtk_widget_get_colormap (widget);
- attributes.event_mask = gtk_widget_get_events (widget);
- attributes.event_mask |= (GDK_EXPOSURE_MASK);
-
- attributes_mask = GDK_WA_X | GDK_WA_Y
- | GDK_WA_VISUAL | GDK_WA_COLORMAP;
-
- group->child_window = gdk_window_new (widget->window, &attributes,
- attributes_mask);
- gdk_window_set_user_data (group->child_window, widget);
-
- gtk_widget_set_parent_window (GTK_WIDGET (group->child),
- group->child_window);
- gdk_window_set_back_pixmap (group->child_window, NULL, TRUE);
-}
-
-
-/* This returns the y position of a group's button within the EGroupBar window.
- */
-static gint
-e_group_bar_get_group_button_position (EGroupBar *group_bar,
- gint group_num)
-{
- gint border_width, window_height, y;
-
- border_width = GTK_CONTAINER (group_bar)->border_width;
- window_height = GTK_WIDGET (group_bar)->allocation.height - 2 * border_width;
-
- if (group_num <= group_bar->current_group_num)
- y = e_group_bar_sum_button_heights (group_bar, 0, group_num - 1);
- else
- y = window_height - e_group_bar_sum_button_heights (group_bar, group_num, group_bar->children->len - 1);
-
- return y;
-}
-
-
-/* This returns the sum of all the buttons from first to last inclusive. */
-static gint
-e_group_bar_sum_button_heights (EGroupBar *group_bar, gint first, gint last)
-{
- EGroupBarChild *group;
- gint height, group_num;
-
- height = 0;
-
- if (group_bar->buttons_homogeneous)
- return (last - first + 1) * group_bar->max_button_height;
-
- for (group_num = first; group_num <= last; group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
- height += group->button_height;
- }
-
- return height;
-}
-
-
-static gint
-e_group_bar_get_group_child_position (EGroupBar *group_bar,
- gint group_num)
-{
- EGroupBarChild *group;
- gint y;
-
- y = e_group_bar_get_group_button_position (group_bar, group_num);
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
- y += group_bar->buttons_homogeneous ? group_bar->max_button_height
- : group->button_height;
-
- return y;
-}
-
-
-static gint
-e_group_bar_get_child_height (EGroupBar *group_bar)
-{
- EGroupBarChild *group;
- gint group_num;
-
- /* Start with the allocated height of the EGroupBar, less the border.*/
- group_bar->child_height = GTK_WIDGET (group_bar)->allocation.height;
- group_bar->child_height -= 2 * GTK_CONTAINER (group_bar)->border_width;
-
- /* Now subtract the heights of all the buttons. */
- if (group_bar->buttons_homogeneous) {
- group_bar->child_height -= group_bar->children->len * group_bar->max_button_height;
- } else {
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
- group_bar->child_height -= group->button_height;
- }
- }
-
- return group_bar->child_height;
-}
-
-
-/*
- * Insertion, reordering and deletion of items.
- */
-
-/**
- * e_group_bar_add_group:
- * @group_bar: an #EGroupBar.
- * @child: the child widget to add.
- * @button: the button used to show the child widget.
- * @position: the new group's position, or -1 to place it last.
- * @Returns: the position of the new group.
- *
- * Adds a new group to a #EGroupBar at the given position.
- **/
-gint
-e_group_bar_add_group (EGroupBar *group_bar,
- GtkWidget *child,
- GtkWidget *button,
- gint position)
-{
- EGroupBarChild *group, empty_group, *tmp_group;
- gint group_num, tmp_group_num;
-
- g_return_val_if_fail (group_bar != NULL, -1);
- g_return_val_if_fail (E_IS_GROUP_BAR (group_bar), -1);
- g_return_val_if_fail (child != NULL, -1);
- g_return_val_if_fail (button != NULL, -1);
- g_return_val_if_fail (GTK_IS_BUTTON (button), -1);
-
- /* Append an empty group to the children array and get a pointer to
- it, so we can use it like a normal group. */
- group_num = group_bar->children->len;
- g_array_append_val (group_bar->children, empty_group);
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- /* Initialize the group. */
- group->button = button;
- group->button_window = NULL;
- group->child = child;
- group->child_window = NULL;
- group->button_window_in_animation = FALSE;
- group->child_window_in_animation = FALSE;
- group->button_window_target_y = 0;
- group->child_window_target_y = 0;
-
- /* If we don't have a current group, set it to the first one. */
- if (group_bar->current_group_num == -1)
- group_bar->current_group_num = 0;
-
- /* If the EGroupBar widget is realize, we need to create the child
- windows to put the button & child in. */
- if (GTK_WIDGET_REALIZED (group_bar)) {
- e_group_bar_create_group_button_window (group_bar, group_num);
- e_group_bar_create_group_child_window (group_bar, group_num);
-
- /* We need to lower all the child windows of the previous
- groups, in reverse order, to keep the stacking order
- correct. */
- for (tmp_group_num = group_num - 1;
- tmp_group_num >= 0;
- tmp_group_num--) {
- tmp_group = &g_array_index (group_bar->children,
- EGroupBarChild,
- tmp_group_num);
- gdk_window_lower (group->child_window);
- }
- }
-
- gtk_widget_set_parent (group->button, GTK_WIDGET (group_bar));
- gtk_widget_set_parent (group->child, GTK_WIDGET (group_bar));
-
- if (GTK_WIDGET_REALIZED (group_bar)) {
- gtk_widget_realize (group->button);
- gtk_widget_realize (group->child);
- }
-
- if (GTK_WIDGET_VISIBLE (group_bar)
- && GTK_WIDGET_MAPPED (group_bar)) {
- if (group->button
- && GTK_WIDGET_VISIBLE (group->button)
- && !GTK_WIDGET_MAPPED (group->button)) {
- gtk_widget_map (group->button);
- gtk_widget_queue_resize (group->button);
- }
- if (group->child
- && GTK_WIDGET_VISIBLE (group->child)
- && !GTK_WIDGET_MAPPED (group->child)) {
- gtk_widget_map (group->child);
- gtk_widget_queue_resize (group->child);
- }
- }
-
- gtk_signal_connect (GTK_OBJECT (group->button), "clicked",
- GTK_SIGNAL_FUNC (e_group_bar_on_button_clicked),
- group_bar);
-
- gtk_signal_connect (GTK_OBJECT (group->button), "drag_motion",
- GTK_SIGNAL_FUNC (e_group_bar_on_button_drag_motion),
- group_bar);
- gtk_signal_connect (GTK_OBJECT (group->button), "drag_leave",
- GTK_SIGNAL_FUNC (e_group_bar_on_button_drag_leave),
- group_bar);
-
- return group_num;
-}
-
-
-/**
- * e_group_bar_reorder_group:
- * @group_bar: an #EGroupBar.
- * @group_num: the index of the group to move.
- * @new_position: the new position of the group.
- *
- * Moves a group to a new position within the #EGroupBar.
- **/
-void
-e_group_bar_reorder_group (EGroupBar *group_bar,
- gint group_num,
- gint new_position)
-{
- EGroupBarChild group, *tmp_group;
- gint tmp_group_num;
-
- g_return_if_fail (E_IS_GROUP_BAR (group_bar));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < group_bar->children->len);
-
- e_group_bar_stop_all_animation (group_bar);
-
- /* Copy the group. */
- group = g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- /* Remove the group from its current position. */
- g_array_remove_index (group_bar->children, group_num);
-
- /* Copy the group into its new position. */
- g_array_insert_val (group_bar->children, new_position, group);
-
- /* We need to lower the groups' windows so they are in the correct
- z-order. We can skip unaffected windows. */
- for (tmp_group_num = MAX (group_num, new_position);
- tmp_group_num >= 0;
- tmp_group_num--) {
- tmp_group = &g_array_index (group_bar->children,
- EGroupBarChild, tmp_group_num);
- gdk_window_lower (tmp_group->child_window);
- }
-
- /* Queue a resize so the groups get layed out properly. */
- gtk_widget_queue_resize (GTK_WIDGET (group_bar));
-}
-
-
-/**
- * e_group_bar_remove_group:
- * @group_bar: an #EGroupBar.
- * @group_num: the index of the group to remove.
- *
- * Removes a group from an #EGroupBar.
- **/
-void
-e_group_bar_remove_group (EGroupBar *group_bar,
- gint group_num)
-{
- EGroupBarChild *group;
-
- g_return_if_fail (E_IS_GROUP_BAR (group_bar));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < group_bar->children->len);
-
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- /* Stop any animation. */
- e_group_bar_stop_all_animation (group_bar);
-
- gtk_widget_unparent (group->child);
- if (group->button)
- gtk_widget_unparent (group->button);
-
- if (group->button_window) {
- gdk_window_set_user_data (group->button_window, NULL);
- gdk_window_destroy (group->button_window);
- }
- if (group->child_window) {
- gdk_window_set_user_data (group->child_window, NULL);
- gdk_window_destroy (group->child_window);
- }
-
- g_array_remove_index (group_bar->children, group_num);
-
- /* Make sure the current group is valid. */
- if (group_bar->current_group_num >= group_bar->children->len)
- group_bar->current_group_num = group_bar->children->len - 1;
-
- gtk_widget_queue_resize (GTK_WIDGET (group_bar));
-}
-
-
-/*
- * Getting & setting the current group.
- */
-
-/**
- * e_group_bar_get_current_group_num:
- * @group_bar: an #EGroupBar.
- * @Returns: the index of the group currently displayed.
- *
- * Returns the index of the group currently displayed.
- **/
-gint
-e_group_bar_get_current_group_num (EGroupBar *group_bar)
-{
- g_return_val_if_fail (E_IS_GROUP_BAR (group_bar), -1);
-
- return group_bar->current_group_num;
-}
-
-
-/**
- * e_group_bar_set_current_group_num:
- * @group_bar: an #EGroupBar.
- * @animate: if TRUE, and the #EGroupBar is visible, the group will slide into
- * position, as if the group's button was pressed.
- * @Returns: the index of the group to display.
- *
- * Sets the group to display.
- **/
-void
-e_group_bar_set_current_group_num (EGroupBar *group_bar,
- gint group_num,
- gboolean animate)
-{
- g_return_if_fail (E_IS_GROUP_BAR (group_bar));
-
- /* If that already is the current group, just return. */
- if (group_bar->current_group_num == group_num)
- return;
-
- if (GTK_WIDGET_VISIBLE (group_bar)) {
- if (animate) {
- e_group_bar_start_animation (group_bar, group_num);
- } else {
- group_bar->current_group_num = group_num;
- e_group_bar_stop_all_animation (group_bar);
- gtk_widget_queue_resize (GTK_WIDGET (group_bar));
- }
- } else {
- /* The positions will be sorted out when the widget's size is
- allocated. */
- group_bar->current_group_num = group_num;
- }
-}
-
-
-/*
- * Getting groups and group numbers.
- */
-
-/**
- * e_group_bar_get_nth_group:
- * @group_bar: an #EGroupBar.
- * @group_num: the index of the group to get.
- * @Returns: the child widget at the given index.
- *
- * Returns the child widget at the given index.
- **/
-GtkWidget*
-e_group_bar_get_nth_group (EGroupBar *group_bar,
- gint group_num)
-{
- EGroupBarChild *group;
-
- g_return_val_if_fail (E_IS_GROUP_BAR (group_bar), NULL);
- g_return_val_if_fail (group_num >= 0, NULL);
- g_return_val_if_fail (group_num < group_bar->children->len, NULL);
-
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
- return group->child;
-}
-
-
-/**
- * e_group_bar_get_group_num:
- * @group_bar: an #EGroupBar.
- * @child: the child widget to find.
- * @Returns: the index of the group containing the given widget.
- *
- * Returns the index of the group containing the given child widget.
- **/
-gint
-e_group_bar_get_group_num (EGroupBar *group_bar,
- GtkWidget *child)
-{
- EGroupBarChild *group;
- gint group_num;
-
- g_return_val_if_fail (E_IS_GROUP_BAR (group_bar), -1);
- g_return_val_if_fail (child != NULL, -1);
-
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- if (group->child == child)
- return group_num;
- }
-
- return -1;
-}
-
-
-/**
- * e_group_bar_set_group_button_label:
- * @group_bar: an #EGroupBar.
- * @group_num: the index of the group.
- * @label: the label widget to place in the group's button.
- *
- * Sets the label widget for the given group's button, replacing any existing
- * widget in the button.
- **/
-void
-e_group_bar_set_group_button_label (EGroupBar *group_bar,
- gint group_num,
- GtkWidget *label)
-{
- EGroupBarChild *group;
- GtkWidget *button_child;
-
- g_return_if_fail (E_IS_GROUP_BAR (group_bar));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < group_bar->children->len);
-
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- button_child = GTK_BIN (group->button)->child;
- if (button_child) {
- gtk_container_remove (GTK_CONTAINER (group->button),
- button_child);
- }
-
- if (label)
- gtk_container_add (GTK_CONTAINER (group->button), label);
-}
-
-
-/*
- * Getting & setting the EGroupBar options.
- */
-
-/**
- * e_group_bar_get_buttons_homogeneous:
- * @group_bar: an #EGroupBar.
- * @Returns: TRUE if the buttons are homoegeneous.
- *
- * Returns TRUE if the buttons are homogeneous (i.e. all have the same height).
- **/
-gboolean
-e_group_bar_get_buttons_homogeneous (EGroupBar *group_bar)
-{
- g_return_val_if_fail (E_IS_GROUP_BAR (group_bar), TRUE);
-
- return group_bar->buttons_homogeneous;
-}
-
-
-/**
- * e_group_bar_set_buttons_homogeneous:
- * @group_bar: an #EGroupBar.
- * @homogeneous: TRUE if the buttons should be homoegeneous.
- *
- * Specifies whether the buttons should be homogeneous. When set to TRUE all
- * the group buttons will be set to the same height (equal to the largest
- * requested height). When set to FALSE the buttons will use their own
- * individual requested heights.
- **/
-void
-e_group_bar_set_buttons_homogeneous (EGroupBar *group_bar,
- gboolean homogeneous)
-{
- g_return_if_fail (E_IS_GROUP_BAR (group_bar));
-
- /* Just return if the setting hasn't changed. */
- if (group_bar->buttons_homogeneous == homogeneous)
- return;
-
- group_bar->buttons_homogeneous = homogeneous;
-
- /* Update the position & sizes of the buttons. */
- gtk_widget_queue_resize (GTK_WIDGET (group_bar));
-}
-
-
-static void
-e_group_bar_on_button_clicked (GtkWidget *group_button,
- EGroupBar *group_bar)
-{
- gint group_num;
-
- /* Determine which group button was clicked. */
- group_num = e_group_bar_find_button (group_bar, group_button);
-
- if (group_num != -1)
- e_group_bar_start_animation (group_bar, group_num);
-}
-
-
-/* This returns the group containing the given button, or -1 if not found. */
-static gint
-e_group_bar_find_button (EGroupBar *group_bar,
- GtkWidget *group_button)
-{
- EGroupBarChild *group;
- gint group_num;
-
- /* Determine which group button was clicked. */
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
- if (group->button == group_button)
- return group_num;
- }
-
- return -1;
-}
-
-
-static void
-e_group_bar_start_animation (EGroupBar *group_bar,
- gint group_num)
-{
- EGroupBarChild *group, *old_group;
- gint old_group_num, step;
-
- old_group_num = group_bar->current_group_num;
-
- /* Return if it is already the current group. */
- if (old_group_num == group_num)
- return;
-
- group_bar->current_group_num = group_num;
-
- /* Calculate the target y position of the new current group button
- and child, and map the child. */
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
- group->button_window_target_y = e_group_bar_get_group_button_position (group_bar, group_num);
- group->button_window_in_animation = TRUE;
-
- group->child_window_target_y = e_group_bar_get_group_child_position (group_bar, group_num);
- group->child_window_in_animation = TRUE;
-
- /* Calculate the target y position of the current group button and
- child. */
- old_group = &g_array_index (group_bar->children,
- EGroupBarChild, old_group_num);
- old_group->button_window_target_y = e_group_bar_get_group_button_position (group_bar, old_group_num);
- old_group->button_window_in_animation = TRUE;
-
- old_group->child_window_target_y = e_group_bar_get_group_child_position (group_bar, old_group_num);
- old_group->child_window_in_animation = TRUE;
-
- /* We also need to animate the buttons in between the old group and the
- new group. */
- step = (old_group_num < group_num) ? 1 : -1;
- old_group_num += step;
- while (old_group_num != group_num) {
- old_group = &g_array_index (group_bar->children,
- EGroupBarChild, old_group_num);
- old_group->button_window_target_y = e_group_bar_get_group_button_position (group_bar, old_group_num);
- old_group->button_window_in_animation = TRUE;
-
- old_group->child_window_target_y = e_group_bar_get_group_child_position (group_bar, old_group_num);
- old_group->child_window_in_animation = TRUE;
-
- old_group_num += step;
- }
-
- /* Add a timeout handler if we haven't already got one. */
- if (group_bar->animation_timeout_id == 0) {
- group_bar->animation_timeout_id = g_timeout_add (E_GROUP_BAR_SCROLL_TIMEOUT, e_group_bar_timeout_handler, group_bar);
- }
-}
-
-
-static gboolean
-e_group_bar_timeout_handler (gpointer data)
-{
- EGroupBar *group_bar;
- EGroupBarChild *group;
- gint group_num, button_window_y, child_window_y;
- gboolean finished = TRUE;
-
- g_return_val_if_fail (E_IS_GROUP_BAR (data), FALSE);
-
- group_bar = E_GROUP_BAR (data);
-
- GDK_THREADS_ENTER ();
-
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
-
- if (group->button_window_in_animation) {
- gdk_window_get_position (group->button_window, NULL,
- &button_window_y);
- button_window_y += e_group_bar_get_increment (group_bar, button_window_y, group->button_window_target_y);
- if (button_window_y == group->button_window_target_y)
- group->button_window_in_animation = FALSE;
- else
- finished = FALSE;
- gdk_window_move (group->button_window,
- 0, button_window_y);
- }
- if (group->child_window_in_animation) {
- gdk_window_get_position (group->child_window, NULL,
- &child_window_y);
- child_window_y += e_group_bar_get_increment (group_bar, child_window_y, group->child_window_target_y);
- if (child_window_y == group->child_window_target_y)
- group->child_window_in_animation = FALSE;
- else
- finished = FALSE;
- gdk_window_move (group->child_window,
- 0, child_window_y);
- }
-
- }
-
- if (finished)
- group_bar->animation_timeout_id = 0;
-
- GDK_THREADS_LEAVE ();
-
- return !finished;
-}
-
-
-static gint
-e_group_bar_get_increment (EGroupBar *group_bar,
- gint window_y,
- gint window_target_y)
-{
- gdouble percentage;
- gint distance, total_distance, step;
-
- total_distance = group_bar->child_height;
- distance = MIN (abs (window_target_y - window_y), total_distance);
-
- if (distance == 0)
- return 0;
-
- /* Convert the distance into an angle between -PI/2 and PI/2, so we can
- then do a cosine of it. */
- percentage = cos (M_PI * ((gdouble)distance / (gdouble)total_distance) - M_PI / 2);
-
- /* Now multiply by our maximum step size to get the step size. */
- step = percentage * total_distance / 6;
-
- /* Add it to the minimum step size, but don't go too far. */
- step = step + E_GROUP_BAR_MIN_STEP_SIZE;
- step = MIN (step, distance);
-
- if (window_target_y > window_y)
- return step;
- else
- return -step;
-}
-
-
-static gboolean
-e_group_bar_on_button_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- EGroupBar *group_bar)
-{
- gint group_num;
-
- if (!group_bar->auto_show_timeout_id) {
- group_num = e_group_bar_find_button (group_bar, widget);
- if (group_num != -1) {
- group_bar->auto_show_timeout_id = gtk_timeout_add (E_GROUP_BAR_AUTO_SHOW_TIMEOUT, e_group_bar_auto_show, group_bar);
- group_bar->auto_show_group_num = group_num;
- }
- }
- return TRUE;
-}
-
-
-static void
-e_group_bar_on_button_drag_leave (GtkWidget *widget,
- GdkDragContext *context,
- guint time,
- EGroupBar *group_bar)
-{
- if (group_bar->auto_show_timeout_id) {
- gtk_timeout_remove (group_bar->auto_show_timeout_id);
- group_bar->auto_show_timeout_id = 0;
- }
-}
-
-
-static gboolean
-e_group_bar_auto_show (gpointer data)
-{
- EGroupBar *group_bar;
-
- g_return_val_if_fail (E_IS_GROUP_BAR (data), FALSE);
-
- group_bar = E_GROUP_BAR (data);
-
- GDK_THREADS_ENTER ();
-
- e_group_bar_start_animation (group_bar,
- group_bar->auto_show_group_num);
-
- group_bar->auto_show_timeout_id = 0;
-
- GDK_THREADS_LEAVE ();
-
- return FALSE;
-}
-
-
-/* This removes all timeouts and sets all 'in_animation' flags to FALSE. */
-static void
-e_group_bar_stop_all_animation (EGroupBar *group_bar)
-{
- EGroupBarChild *group;
- gint group_num;
-
- if (group_bar->animation_timeout_id) {
- g_source_remove (group_bar->animation_timeout_id);
- group_bar->animation_timeout_id = 0;
- }
- if (group_bar->auto_show_timeout_id) {
- g_source_remove (group_bar->auto_show_timeout_id);
- group_bar->auto_show_timeout_id = 0;
- }
-
- for (group_num = 0;
- group_num < group_bar->children->len;
- group_num++) {
- group = &g_array_index (group_bar->children,
- EGroupBarChild, group_num);
- group->button_window_in_animation = FALSE;
- group->child_window_in_animation = FALSE;
- }
-}
-
diff --git a/widgets/shortcut-bar/e-group-bar.h b/widgets/shortcut-bar/e-group-bar.h
deleted file mode 100644
index 62751174bb..0000000000
--- a/widgets/shortcut-bar/e-group-bar.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_GROUP_BAR_H_
-#define _E_GROUP_BAR_H_
-
-#include <gtk/gtkcontainer.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EGroupBar displays a vertical bar with a number of Groups, which are viewed
- * one at a time by selecting the Group's button. When a different Group is
- * selected, it slides into view, and the old Group slides out.
- * It is typically used on the left of the main application window so users
- * can easily access particular features.
- *
- * It is implemented like GtkNotebook, i.e. the main widgets are the children
- * of the EGroupBar and the button widgets are treated specially like the
- * GtkNotebook tab labels.
- */
-
-/* This contains information on one item. */
-typedef struct _EGroupBarChild EGroupBarChild;
-struct _EGroupBarChild
-{
- /* This is the button used to select the group, and the window we use
- to move it around easily. */
- GtkWidget *button;
- GdkWindow *button_window;
- gint button_height;
-
- /* This is the child widget, which can be any widget added by the
- application, and the window we use to move it around easily. */
- GtkWidget *child;
- GdkWindow *child_window;
-
- /* These are TRUE if we are currently animating the windows. */
- gboolean button_window_in_animation;
- gboolean child_window_in_animation;
-
- /* These are the target y positions that the windows should eventually
- move to, used for animation. If we get a size_allocate we just
- update these and the animation can continue as normal.
- When a child window reaches its target position, it is unmapped if
- if it is not the current group (i.e. it has slid off screen). */
- gint button_window_target_y;
- gint child_window_target_y;
-};
-
-
-#define E_GROUP_BAR(obj) GTK_CHECK_CAST (obj, e_group_bar_get_type (), EGroupBar)
-#define E_GROUP_BAR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_group_bar_get_type (), EGroupBarClass)
-#define E_IS_GROUP_BAR(obj) GTK_CHECK_TYPE (obj, e_group_bar_get_type ())
-
-
-typedef struct _EGroupBar EGroupBar;
-typedef struct _EGroupBarClass EGroupBarClass;
-
-struct _EGroupBar
-{
- GtkContainer container;
-
- /* This is an array of EGroupBarChild elements. */
- GArray *children;
-
- /* This is the group currently shown. */
- gint current_group_num;
-
- /* This is TRUE if all the buttons are allocated the same height. */
- gboolean buttons_homogeneous;
-
- /* This is the biggest requested height of all the buttons, which we
- use for all buttons when buttons_homogeneous is set. */
- gint max_button_height;
-
- /* This is the height of all the child windows & widgets. */
- gint child_height;
-
- /* The id of the source function for animation timeouts. If this is
- not 0 then we are in the middle of an animation. */
- guint animation_timeout_id;
-
- /* The id of the source function for automatically showing groups when
- the user drags over the group button, and the group to show. */
- guint auto_show_timeout_id;
- gint auto_show_group_num;
-};
-
-struct _EGroupBarClass
-{
- GtkContainerClass parent_class;
-};
-
-
-GtkType e_group_bar_get_type (void);
-GtkWidget* e_group_bar_new (void);
-
-/*
- * Insertion, reordering and deletion of items.
- */
-
-/* Adds a new group at the given position. If position is -1 it adds it as
- the last group. It returns the group number. */
-gint e_group_bar_add_group (EGroupBar *group_bar,
- GtkWidget *child,
- GtkWidget *button,
- gint position);
-void e_group_bar_reorder_group (EGroupBar *group_bar,
- gint group_num,
- gint new_position);
-void e_group_bar_remove_group (EGroupBar *group_bar,
- gint group_num);
-
-/*
- * Getting & setting the current group.
- */
-gint e_group_bar_get_current_group_num (EGroupBar *group_bar);
-void e_group_bar_set_current_group_num (EGroupBar *group_bar,
- gint group_num,
- gboolean animate);
-
-/*
- * Getting groups and group numbers.
- */
-GtkWidget* e_group_bar_get_nth_group (EGroupBar *group_bar,
- gint group_num);
-gint e_group_bar_get_group_num (EGroupBar *group_bar,
- GtkWidget *child);
-
-/*
- * Setting the group button label.
- */
-void e_group_bar_set_group_button_label (EGroupBar *group_bar,
- gint group_num,
- GtkWidget *label);
-
-/*
- * Getting & setting the EGroupBar options.
- */
-gboolean e_group_bar_get_buttons_homogeneous (EGroupBar *group_bar);
-void e_group_bar_set_buttons_homogeneous (EGroupBar *group_bar,
- gboolean homogeneous);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_GROUP_BAR_H_ */
diff --git a/widgets/shortcut-bar/e-icon-bar-bg-item.c b/widgets/shortcut-bar/e-icon-bar-bg-item.c
deleted file mode 100644
index 5154a38267..0000000000
--- a/widgets/shortcut-bar/e-icon-bar-bg-item.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EIconBarBgItem - A GnomeCanvasItem which covers the entire EIconBar.
- * It paints the rectangles around items when the mouse moves over them, and
- * the lines between items when dragging.
- */
-
-#include <config.h>
-#include "e-icon-bar-bg-item.h"
-#include "e-icon-bar.h"
-
-/* This is the size of the border around the icons, for the shadow. */
-#define E_ICON_BAR_LARGE_ICON_SHADOW_BORDER 2
-#define E_ICON_BAR_SMALL_ICON_SHADOW_BORDER 2
-
-/* These are for the horzontal bar when dragging. */
-#define E_ICON_BAR_BG_ITEM_BAR_HEIGHT 1
-#define E_ICON_BAR_BG_ITEM_BAR_OFFSET 2
-#define E_ICON_BAR_BG_ITEM_LARGE_ARROW_HEIGHT 8
-#define E_ICON_BAR_BG_ITEM_SMALL_ARROW_HEIGHT 4
-
-static void e_icon_bar_bg_item_class_init (EIconBarBgItemClass *class);
-static void e_icon_bar_bg_item_init (EIconBarBgItem *ibitem);
-
-static void e_icon_bar_bg_item_set_arg (GtkObject *o, GtkArg *arg,
- guint arg_id);
-static void e_icon_bar_bg_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path, int flags);
-static void e_icon_bar_bg_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height);
-static double e_icon_bar_bg_item_point (GnomeCanvasItem *item,
- double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item);
-static gint e_icon_bar_bg_item_event (GnomeCanvasItem *item,
- GdkEvent *event);
-static gint e_icon_bar_bg_item_button_press (EIconBarBgItem *ibitem,
- GdkEvent *event);
-static gint e_icon_bar_bg_item_button_release (EIconBarBgItem *ibitem,
- GdkEvent *event);
-static gint e_icon_bar_bg_item_motion_notify (EIconBarBgItem *ibitem,
- GdkEvent *event);
-
-static GnomeCanvasItemClass *parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_ICON_BAR
-};
-
-
-GtkType
-e_icon_bar_bg_item_get_type (void)
-{
- static GtkType e_icon_bar_bg_item_type = 0;
-
- if (!e_icon_bar_bg_item_type) {
- GtkTypeInfo e_icon_bar_bg_item_info = {
- "EIconBarBgItem",
- sizeof (EIconBarBgItem),
- sizeof (EIconBarBgItemClass),
- (GtkClassInitFunc) e_icon_bar_bg_item_class_init,
- (GtkObjectInitFunc) e_icon_bar_bg_item_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- e_icon_bar_bg_item_type = gtk_type_unique (gnome_canvas_item_get_type (), &e_icon_bar_bg_item_info);
- }
-
- return e_icon_bar_bg_item_type;
-}
-
-
-static void
-e_icon_bar_bg_item_class_init (EIconBarBgItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type());
-
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- gtk_object_add_arg_type ("EIconBarBgItem::icon_bar",
- GTK_TYPE_POINTER, GTK_ARG_WRITABLE,
- ARG_ICON_BAR);
-
- object_class->set_arg = e_icon_bar_bg_item_set_arg;
-
- /* GnomeCanvasItem method overrides */
- item_class->update = e_icon_bar_bg_item_update;
- item_class->draw = e_icon_bar_bg_item_draw;
- item_class->point = e_icon_bar_bg_item_point;
- item_class->event = e_icon_bar_bg_item_event;
-}
-
-
-static void
-e_icon_bar_bg_item_init (EIconBarBgItem *ibitem)
-{
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (ibitem);
-
- ibitem->icon_bar = NULL;
-
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = 0;
- item->y2 = 0;
-}
-
-
-static void
-e_icon_bar_bg_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EIconBarBgItem *ibitem;
-
- item = GNOME_CANVAS_ITEM (o);
- ibitem = E_ICON_BAR_BG_ITEM (o);
-
- switch (arg_id){
- case ARG_ICON_BAR:
- ibitem->icon_bar = GTK_VALUE_POINTER (*arg);
- break;
- }
-}
-
-
-static void
-e_icon_bar_bg_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags)
-{
- if (GNOME_CANVAS_ITEM_CLASS (parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (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_icon_bar_bg_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- EIconBar *icon_bar;
- EIconBarItem *item;
- EIconBarBgItem *ibitem;
- GtkStyle *style;
- GdkGC *gc;
- GtkShadowType shadow;
- gint item_num, border, bar_x, bar_y, bar_w, i, arrow_height;
-
- ibitem = E_ICON_BAR_BG_ITEM (canvas_item);
- icon_bar = ibitem->icon_bar;
- g_return_if_fail (icon_bar != NULL);
- style = GTK_WIDGET (icon_bar)->style;
- shadow = GTK_SHADOW_NONE;
-
- /* Draw the highlight around the current highlight item. */
- item_num = -1;
- if (icon_bar->editing_item_num == -1) {
- if (icon_bar->pressed_item_num != -1) {
- item_num = icon_bar->pressed_item_num;
- if (icon_bar->pressed_item_num == icon_bar->mouse_over_item_num)
- shadow = GTK_SHADOW_IN;
- else
- shadow = GTK_SHADOW_OUT;
- } else if (icon_bar->mouse_over_item_num != -1) {
- item_num = icon_bar->mouse_over_item_num;
- shadow = GTK_SHADOW_OUT;
- }
- }
-
- if (item_num != -1) {
- item = &g_array_index (icon_bar->items, EIconBarItem,
- item_num);
-
- if (icon_bar->view_type == E_ICON_BAR_LARGE_ICONS)
- border = E_ICON_BAR_LARGE_ICON_SHADOW_BORDER;
- else
- border = E_ICON_BAR_SMALL_ICON_SHADOW_BORDER;
-
- gtk_draw_shadow (style, drawable, GTK_STATE_NORMAL, shadow,
- icon_bar->icon_x - border - x,
- item->icon_y - border - y,
- icon_bar->icon_w + border * 2 - 1,
- icon_bar->icon_h + border * 2 - 1);
- }
-
- /* Draw the bar between items when dragging, if needed. */
- if (icon_bar->in_drag && icon_bar->dragging_before_item_num != -1) {
- if (icon_bar->dragging_before_item_num < icon_bar->items->len) {
- item = &g_array_index (icon_bar->items, EIconBarItem,
- icon_bar->dragging_before_item_num);
- bar_y = 0;
- } else {
- /* We need to draw the bar after the last item. */
- item = &g_array_index (icon_bar->items, EIconBarItem,
- icon_bar->items->len - 1);
- bar_y = item->item_height + icon_bar->spacing;
- }
-
- if (icon_bar->view_type == E_ICON_BAR_LARGE_ICONS) {
- bar_y += item->icon_y;
- } else {
- bar_y += MIN (item->icon_y, item->text_y);
- }
- bar_y -= y + icon_bar->spacing / 2;
-
- bar_x = E_ICON_BAR_BG_ITEM_BAR_OFFSET - x;
- bar_w = GTK_WIDGET (icon_bar)->allocation.width - 2 * E_ICON_BAR_BG_ITEM_BAR_OFFSET - 1;
-
- gc = GTK_WIDGET (icon_bar)->style->fg_gc[GTK_STATE_NORMAL];
-
- /* Draw the horizontal bar. */
- gdk_draw_rectangle (drawable, gc, TRUE,
- bar_x, bar_y,
- bar_w, E_ICON_BAR_BG_ITEM_BAR_HEIGHT);
-
- if (icon_bar->view_type == E_ICON_BAR_LARGE_ICONS)
- arrow_height = E_ICON_BAR_BG_ITEM_LARGE_ARROW_HEIGHT / 2;
- else
- arrow_height = E_ICON_BAR_BG_ITEM_SMALL_ARROW_HEIGHT / 2;
-
- /* Draw the arrows at the end of the lines. We use
- gdk_draw_line() to draw a series of vertical lines, since
- gdk_draw_polygon() produces odd results. */
- i = 0;
- while (arrow_height > 0) {
- gdk_draw_line (drawable, gc,
- bar_x + i,
- bar_y - arrow_height,
- bar_x + i,
- bar_y + arrow_height);
- gdk_draw_line (drawable, gc,
- bar_x + bar_w - i - 1,
- bar_y - arrow_height,
- bar_x + bar_w - i - 1,
- bar_y + arrow_height);
- arrow_height--;
- i++;
- }
- }
-}
-
-
-/* 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_icon_bar_bg_item_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-
-static gint
-e_icon_bar_bg_item_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EIconBarBgItem *ibitem;
-
- ibitem = E_ICON_BAR_BG_ITEM (item);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- return e_icon_bar_bg_item_button_press (ibitem, event);
- case GDK_BUTTON_RELEASE:
- return e_icon_bar_bg_item_button_release (ibitem, event);
- case GDK_MOTION_NOTIFY:
- return e_icon_bar_bg_item_motion_notify (ibitem, event);
- default:
- break;
- }
-
- return FALSE;
-}
-
-
-static gint
-e_icon_bar_bg_item_button_press (EIconBarBgItem *ibitem,
- GdkEvent *event)
-{
- gint item_num;
-
- if (event->button.button == 4 || event->button.button == 5)
- return FALSE;
-
- item_num = e_icon_bar_find_item_at_position (ibitem->icon_bar,
- event->button.x,
- event->button.y,
- NULL);
- e_icon_bar_item_pressed (ibitem->icon_bar, item_num, event);
- return TRUE;
-}
-
-
-static gint
-e_icon_bar_bg_item_button_release (EIconBarBgItem *ibitem,
- GdkEvent *event)
-{
- gint item_num;
-
- item_num = e_icon_bar_find_item_at_position (ibitem->icon_bar,
- event->button.x,
- event->button.y,
- NULL);
- e_icon_bar_item_released (ibitem->icon_bar, item_num, event);
- return TRUE;
-}
-
-
-static gint
-e_icon_bar_bg_item_motion_notify (EIconBarBgItem *ibitem,
- GdkEvent *event)
-{
- gint item_num;
-
- item_num = e_icon_bar_find_item_at_position (ibitem->icon_bar,
- event->motion.x,
- event->motion.y,
- NULL);
- e_icon_bar_item_motion (ibitem->icon_bar, item_num, event);
- return TRUE;
-}
diff --git a/widgets/shortcut-bar/e-icon-bar-bg-item.h b/widgets/shortcut-bar/e-icon-bar-bg-item.h
deleted file mode 100644
index f8fa14f299..0000000000
--- a/widgets/shortcut-bar/e-icon-bar-bg-item.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EIconBarBgItem - A GnomeCanvasItem which covers the entire EIconBar.
- * It paints the rectangles around items when the mouse moves over them, and
- * the lines between items when dragging.
- */
-
-#ifndef _E_ICON_BAR_BG_ITEM_H_
-#define _E_ICON_BAR_BG_ITEM_H_
-
-#include <libgnomeui/gnome-canvas.h>
-
-#include "e-icon-bar.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-#define E_ICON_BAR_BG_ITEM(obj) (GTK_CHECK_CAST((obj), e_icon_bar_bg_item_get_type (), EIconBarBgItem))
-#define E_ICON_BAR_BG_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), e_icon_bar_bg_item_get_type (), EIconBarBgItemClass))
-#define E_IS_ICON_BAR_BG_ITEM(o) (GTK_CHECK_TYPE((o), e_icon_bar_bg_item_get_type ()))
-
-
-typedef struct _EIconBarBgItem EIconBarBgItem;
-typedef struct _EIconBarBgItemClass EIconBarBgItemClass;
-
-struct _EIconBarBgItem
-{
- GnomeCanvasItem canvas_item;
-
- /* The parent EIconBar widget. */
- EIconBar *icon_bar;
-};
-
-
-struct _EIconBarBgItemClass
-{
- GnomeCanvasItemClass parent_class;
-};
-
-GtkType e_icon_bar_bg_item_get_type (void);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_ICON_BAR_BG_ITEM_H_ */
diff --git a/widgets/shortcut-bar/e-icon-bar.c b/widgets/shortcut-bar/e-icon-bar.c
deleted file mode 100644
index af5b23a6b3..0000000000
--- a/widgets/shortcut-bar/e-icon-bar.c
+++ /dev/null
@@ -1,1643 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EIconBar is a subclass of ECanvas for displaying a vertical column of
- * icons and descriptions. It provides 2 views - large icons and small icons.
- */
-
-#include <config.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtksignal.h>
-#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
-#include "e-icon-bar.h"
-#include "e-icon-bar-bg-item.h"
-#include "../e-text/e-text.h"
-#include "e-util/e-canvas-utils.h"
-
-/* These are the offsets of the icons & text in both views. Note that the
- shadow around icons is drawn in the space between items (as is the
- horizontal bar when dragging). */
-#define E_ICON_BAR_LARGE_ICON_SPACING 8 /* Spacing between items. */
-#define E_ICON_BAR_LARGE_ICON_WIDTH 48
-#define E_ICON_BAR_LARGE_ICON_HEIGHT 48
-#define E_ICON_BAR_LARGE_ICON_TEXT_X 4
-#define E_ICON_BAR_LARGE_ICON_TEXT_Y (E_ICON_BAR_LARGE_ICON_HEIGHT + 4)
-
-#define E_ICON_BAR_SMALL_ICON_SPACING 4 /* Spacing between items. */
-#define E_ICON_BAR_SMALL_ICON_WIDTH 24
-#define E_ICON_BAR_SMALL_ICON_HEIGHT 24
-#define E_ICON_BAR_SMALL_ICON_X 4
-#define E_ICON_BAR_SMALL_ICON_TEXT_X (E_ICON_BAR_SMALL_ICON_WIDTH + 6)
-
-/* The space we leave at the top or bottom of the bar when position an item
- while it is being edited. This is used since the EIconBar may be in a
- EScrolledBar which may show buttons at the top or bottom. */
-#define E_ICON_BAR_V_SPACE 22
-
-/* The number of pixels the mouse has to be moved with the button down before
- we start a drag. */
-#define E_ICON_BAR_DRAG_START_OFFSET 4
-
-/* This is the area at the top & bottom of the bar where we auto-scroll if the
- mouse goes into during a drag-and-drop operation. */
-#define E_ICON_BAR_DRAG_AUTO_SCROLL_OFFSET 16
-
-/* This is the time between each auto-scroll, when dragging. */
-#define E_ICON_BAR_SCROLL_TIMEOUT 30
-
-/* This is the number of timeouts we skip before we start scrolling. */
-#define E_ICON_BAR_SCROLL_DELAY 12
-
-
-static void e_icon_bar_class_init (EIconBarClass *class);
-static void e_icon_bar_init (EIconBar *icon_bar);
-static void e_icon_bar_destroy (GtkObject *object);
-static void e_icon_bar_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static gint e_icon_bar_leave_notify_event (GtkWidget *widget,
- GdkEventCrossing *event);
-static gint e_icon_bar_focus_in (GtkWidget *widget,
- GdkEventFocus *event);
-static gint e_icon_bar_focus_out (GtkWidget *widget,
- GdkEventFocus *event);
-static gint e_icon_bar_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time);
-static void e_icon_bar_drag_leave (GtkWidget *widget,
- GdkDragContext *context,
- guint time);
-static void e_icon_bar_set_dragging_before_item (EIconBar *icon_bar,
- gint before_item);
-static gboolean e_icon_bar_timeout_handler (gpointer data);
-
-static void e_icon_bar_recalc_common_positions (EIconBar *icon_bar);
-static gint e_icon_bar_recalc_item_positions (EIconBar *icon_bar);
-static void e_icon_bar_reflow (ECanvas *canvas);
-static gint e_icon_bar_find_item (EIconBar *icon_bar,
- GnomeCanvasItem *text_item);
-static gboolean e_icon_bar_on_item_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EIconBar *icon_bar);
-
-static gboolean e_icon_bar_large_icons_intersects (EIconBar *icon_bar,
- EIconBarItem *item,
- gint x,
- gint y);
-static gboolean e_icon_bar_large_icons_is_before (EIconBar *icon_bar,
- EIconBarItem *item,
- gint x,
- gint y);
-static gboolean e_icon_bar_small_icons_intersects (EIconBar *icon_bar,
- EIconBarItem *item,
- gint x,
- gint y);
-static gboolean e_icon_bar_small_icons_is_before (EIconBar *icon_bar,
- EIconBarItem *item,
- gint x,
- gint y);
-static void e_icon_bar_on_editing_started (EIconBar *icon_bar,
- GnomeCanvasItem *item);
-static void e_icon_bar_on_editing_stopped (EIconBar *icon_bar,
- GnomeCanvasItem *item);
-static void e_icon_bar_ensure_edited_item_visible (EIconBar *icon_bar);
-static void e_icon_bar_update_highlight (EIconBar *icon_bar);
-static void e_icon_bar_vadjustment_value_changed (GtkAdjustment *adjustment,
- EIconBar *icon_bar);
-static void e_icon_bar_style_set (GtkWidget *widget, GtkStyle *previous_style);
-
-enum
-{
- ITEM_SELECTED,
- ITEM_DRAGGED,
- LAST_SIGNAL
-};
-
-static guint e_icon_bar_signals[LAST_SIGNAL] = {0};
-
-static ECanvasClass *parent_class;
-
-
-GtkType
-e_icon_bar_get_type (void)
-{
- static GtkType e_icon_bar_type = 0;
-
- if (!e_icon_bar_type){
- GtkTypeInfo e_icon_bar_info = {
- "EIconBar",
- sizeof (EIconBar),
- sizeof (EIconBarClass),
- (GtkClassInitFunc) e_icon_bar_class_init,
- (GtkObjectInitFunc) e_icon_bar_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- parent_class = gtk_type_class (e_canvas_get_type ());
- e_icon_bar_type = gtk_type_unique (e_canvas_get_type (),
- &e_icon_bar_info);
- }
-
- return e_icon_bar_type;
-}
-
-
-static void
-e_icon_bar_class_init (EIconBarClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- ECanvasClass *ecanvas_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
- ecanvas_class = E_CANVAS_CLASS( class );
-
- e_icon_bar_signals[ITEM_SELECTED] =
- gtk_signal_new ("item_selected",
- GTK_RUN_LAST | GTK_RUN_ACTION,
- object_class->type,
- GTK_SIGNAL_OFFSET (EIconBarClass,
- selected_item),
- gtk_marshal_NONE__POINTER_INT,
- GTK_TYPE_NONE, 2, GTK_TYPE_GDK_EVENT,
- GTK_TYPE_INT);
- e_icon_bar_signals[ITEM_DRAGGED] =
- gtk_signal_new ("item_dragged",
- GTK_RUN_LAST | GTK_RUN_ACTION,
- object_class->type,
- GTK_SIGNAL_OFFSET (EIconBarClass,
- dragged_item),
- gtk_marshal_NONE__POINTER_INT,
- GTK_TYPE_NONE, 2, GTK_TYPE_GDK_EVENT,
- GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, e_icon_bar_signals,
- LAST_SIGNAL);
-
- /* Method override */
- object_class->destroy = e_icon_bar_destroy;
-
- widget_class->size_allocate = e_icon_bar_size_allocate;
- widget_class->leave_notify_event = e_icon_bar_leave_notify_event;
- widget_class->focus_in_event = e_icon_bar_focus_in;
- widget_class->focus_out_event = e_icon_bar_focus_out;
- widget_class->drag_motion = e_icon_bar_drag_motion;
- widget_class->drag_leave = e_icon_bar_drag_leave;
- widget_class->style_set = e_icon_bar_style_set;
-
- ecanvas_class->reflow = e_icon_bar_reflow;
-
- class->selected_item = NULL;
-}
-
-
-static void
-e_icon_bar_init (EIconBar *icon_bar)
-{
- GdkColormap *colormap;
- gboolean success[E_ICON_BAR_COLOR_LAST];
- gint nfailed;
-
- icon_bar->view_type = E_ICON_BAR_LARGE_ICONS;
- icon_bar->items = g_array_new (FALSE, FALSE, sizeof (EIconBarItem));
- icon_bar->pressed_item_num = -1;
- icon_bar->mouse_over_item_num = -1;
- icon_bar->editing_item_num = -1;
- icon_bar->edit_rect_item = NULL;
- icon_bar->in_drag = FALSE;
- icon_bar->dragging_before_item_num = -1;
- icon_bar->icon_x = 0;
- icon_bar->icon_w = 0;
- icon_bar->icon_h = 0;
- icon_bar->text_x = 0;
- icon_bar->text_w = 5;
- icon_bar->auto_scroll_timeout_id = 0;
- icon_bar->vadjustment_value_changed_id = 0;
-
- /* Create the background item in the canvas, which handles selections
- and drag-and-drop. */
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (icon_bar)->root),
- e_icon_bar_bg_item_get_type (),
- "EIconBarBgItem::icon_bar", icon_bar,
- NULL);
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (icon_bar));
-
- icon_bar->colors[E_ICON_BAR_COLOR_EDITING_TEXT].red = 0;
- icon_bar->colors[E_ICON_BAR_COLOR_EDITING_TEXT].green = 0;
- icon_bar->colors[E_ICON_BAR_COLOR_EDITING_TEXT].blue = 0;
-
- icon_bar->colors[E_ICON_BAR_COLOR_EDITING_RECT].red = 65535;
- icon_bar->colors[E_ICON_BAR_COLOR_EDITING_RECT].green = 65535;
- icon_bar->colors[E_ICON_BAR_COLOR_EDITING_RECT].blue = 65535;
-
- icon_bar->colors[E_ICON_BAR_COLOR_EDITING_RECT_OUTLINE].red = 0;
- icon_bar->colors[E_ICON_BAR_COLOR_EDITING_RECT_OUTLINE].green = 0;
- icon_bar->colors[E_ICON_BAR_COLOR_EDITING_RECT_OUTLINE].blue = 0;
-
- nfailed = gdk_colormap_alloc_colors (colormap, icon_bar->colors,
- E_ICON_BAR_COLOR_LAST, FALSE,
- TRUE, success);
- if (nfailed)
- g_warning ("Failed to allocate all colors");
-}
-
-
-/**
- * e_icon_bar_new:
- * @Returns: A new #EIconBar.
- *
- * Creates a new #EIconBar.
- **/
-GtkWidget *
-e_icon_bar_new (void)
-{
- GtkWidget *icon_bar;
-
- icon_bar = GTK_WIDGET (gtk_type_new (e_icon_bar_get_type ()));
-
- return icon_bar;
-}
-
-
-static void
-e_icon_bar_destroy (GtkObject *object)
-{
- EIconBar *icon_bar;
- int item_num;
- EIconBarItem *item;
-
- icon_bar = E_ICON_BAR (object);
-
- for (item_num = 0; item_num < icon_bar->items->len; item_num++) {
- item = &g_array_index (icon_bar->items,
- EIconBarItem, item_num);
- if (item->destroy)
- item->destroy (item->data);
- }
-
- g_array_free (icon_bar->items, TRUE);
-
- if (icon_bar->auto_scroll_timeout_id != 0) {
- gtk_timeout_remove (icon_bar->auto_scroll_timeout_id);
- icon_bar->auto_scroll_timeout_id = 0;
- }
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-
-static void
-e_icon_bar_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
-{
- EIconBar *icon_bar;
- gint canvas_width, canvas_height, height;
-#if 0
- g_print ("In e_icon_bar_size_allocate\n");
-#endif
- icon_bar = E_ICON_BAR (widget);
-
- GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation);
-
- canvas_width = GTK_WIDGET (icon_bar)->allocation.width;
- canvas_height = GTK_WIDGET (icon_bar)->allocation.height;
-
- /* Reset the y position and widths of all the items to the width of
- the canvas, and reset the button labels, so they fit. */
- e_icon_bar_recalc_common_positions (icon_bar);
- height = e_icon_bar_recalc_item_positions (icon_bar);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS (widget),
- 0, 0, canvas_width,
- MAX (height, canvas_height - 1));
-
- /* If we are editing an item, make sure it is visible. */
- e_icon_bar_ensure_edited_item_visible (icon_bar);
-
- GTK_LAYOUT (widget)->vadjustment->step_increment = 16;
- if (icon_bar->vadjustment_value_changed_id == 0)
- icon_bar->vadjustment_value_changed_id = gtk_signal_connect (GTK_OBJECT (GTK_LAYOUT (widget)->vadjustment), "value_changed", GTK_SIGNAL_FUNC (e_icon_bar_vadjustment_value_changed), icon_bar);
-
- e_icon_bar_update_highlight (icon_bar);
-}
-
-
-/* This sets all the item positions which are the same for all items in the
- group. */
-static void
-e_icon_bar_recalc_common_positions (EIconBar *icon_bar)
-{
- gint canvas_width;
-
- canvas_width = GTK_WIDGET (icon_bar)->allocation.width;
-
- if (icon_bar->view_type == E_ICON_BAR_LARGE_ICONS) {
- icon_bar->icon_x = (canvas_width - E_ICON_BAR_LARGE_ICON_WIDTH) / 2;
- icon_bar->icon_w = E_ICON_BAR_LARGE_ICON_WIDTH;
- icon_bar->icon_h = E_ICON_BAR_LARGE_ICON_HEIGHT;
-
- icon_bar->text_x = E_ICON_BAR_LARGE_ICON_TEXT_X;
- icon_bar->text_w = MAX (canvas_width - (E_ICON_BAR_LARGE_ICON_TEXT_X * 2), 5);
-
- icon_bar->spacing = E_ICON_BAR_LARGE_ICON_SPACING;
- } else {
- icon_bar->icon_x = E_ICON_BAR_SMALL_ICON_X;
- icon_bar->icon_w = E_ICON_BAR_SMALL_ICON_WIDTH;
- icon_bar->icon_h = E_ICON_BAR_SMALL_ICON_HEIGHT;
-
- icon_bar->text_x = E_ICON_BAR_SMALL_ICON_TEXT_X;
- icon_bar->text_w = MAX (canvas_width - E_ICON_BAR_SMALL_ICON_TEXT_X, 5);
-
- icon_bar->spacing = E_ICON_BAR_SMALL_ICON_SPACING;
- }
-}
-
-
-/* This recalculates the positions of all the items, according to the current
- view type and the height of the text items. */
-static gint
-e_icon_bar_recalc_item_positions (EIconBar *icon_bar)
-{
- EIconBarItem *item;
- gint y, item_num, text_h;
- gdouble x1, y1, x2, y2, text_x;
- GtkJustification justify;
- GtkAnchorType anchor;
- gint max_lines;
- GdkFont *font;
- gboolean line_wrap;
-
- if (icon_bar->view_type == E_ICON_BAR_LARGE_ICONS) {
- justify = GTK_JUSTIFY_CENTER;
- anchor = GTK_ANCHOR_N;
- max_lines = 2;
- text_x = icon_bar->text_x + (icon_bar->text_w / 2);
- line_wrap = TRUE;
-
- /*
- * Fixme: incorrect
- */
- font = GTK_WIDGET (icon_bar)->style->font;
- text_h = font->ascent + font->descent;
- } else {
- justify = GTK_JUSTIFY_LEFT;
- anchor = GTK_ANCHOR_NW;
- max_lines = 1;
- text_x = icon_bar->text_x;
- font = GTK_WIDGET (icon_bar)->style->font;
- text_h = font->ascent + font->descent;
- line_wrap = FALSE;
- }
-
- /* Now step through the items, setting the y positions. */
- y = icon_bar->spacing;
- for (item_num = 0; item_num < icon_bar->items->len; item_num++) {
- item = &g_array_index (icon_bar->items,
- EIconBarItem, item_num);
-
- if (icon_bar->view_type == E_ICON_BAR_LARGE_ICONS) {
- item->icon_y = y;
- item->text_y = y + E_ICON_BAR_LARGE_ICON_TEXT_Y;
- } else {
- item->text_height = text_h;
- item->item_height = MAX (text_h, E_ICON_BAR_SMALL_ICON_HEIGHT);
- item->icon_y = y + (item->item_height - E_ICON_BAR_SMALL_ICON_HEIGHT) / 2;
- item->text_y = y + (item->item_height - item->text_height) / 2;
- }
-
- gnome_canvas_item_set (item->text,
- "clip_width", (gdouble) (icon_bar->text_w),
- "justification", justify,
- "anchor", anchor,
- "max_lines", max_lines,
- "line_wrap", line_wrap,
- NULL);
- e_canvas_item_move_absolute(item->text,
- text_x, item->text_y);
-
- /* Get the text item's height. */
- gnome_canvas_item_get_bounds (item->text, &x1, &y1, &x2, &y2);
- item->text_x = x1;
- item->text_width = x2 - x1;
- item->text_height = y2 - y1;
-
- if (icon_bar->view_type == E_ICON_BAR_LARGE_ICONS) {
- item->item_height = E_ICON_BAR_LARGE_ICON_TEXT_Y
- + item->text_height;
- }
-
- gnome_canvas_item_set (item->image,
- "GnomeCanvasPixbuf::x", (gdouble)icon_bar->icon_x,
- "GnomeCanvasPixbuf::y", (gdouble)item->icon_y,
- "GnomeCanvasPixbuf::width_set", TRUE,
- "GnomeCanvasPixbuf::height_set", TRUE,
- "GnomeCanvasPixbuf::width", (gdouble)icon_bar->icon_w,
- "GnomeCanvasPixbuf::height", (gdouble)icon_bar->icon_h,
- NULL);
-
- y += item->item_height + icon_bar->spacing;
- }
-
- return y;
-}
-
-
-static gint
-e_icon_bar_leave_notify_event (GtkWidget *widget, GdkEventCrossing *event)
-{
- EIconBar *icon_bar;
-
- icon_bar = E_ICON_BAR (widget);
-
- GTK_WIDGET_CLASS (parent_class)->leave_notify_event (widget, event);
-
- /* Make sure no items are highlighted. */
- e_icon_bar_item_motion (icon_bar, -1, NULL);
-
- return FALSE;
-}
-
-
-static gint
-e_icon_bar_focus_in (GtkWidget *widget,
- GdkEventFocus *event)
-{
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_ICON_BAR (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- GTK_WIDGET_CLASS (parent_class)->focus_in_event (widget, event);
- GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
- return FALSE;
-}
-
-
-static gint
-e_icon_bar_focus_out (GtkWidget *widget,
- GdkEventFocus *event)
-{
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_ICON_BAR (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- GTK_WIDGET_CLASS (parent_class)->focus_out_event (widget, event);
- GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
- return FALSE;
-}
-
-
-/**
- * e_icon_bar_set_view_type:
- * @icon_bar: An #EIconBar.
- * @view_type: The new view type, %E_ICON_BAR_LARGE_ICONS or
- * %E_ICON_BAR_SMALL_ICONS.
- *
- * Sets the view type of the #EIconBar.
- **/
-void
-e_icon_bar_set_view_type (EIconBar *icon_bar,
- EIconBarViewType view_type)
-{
- g_return_if_fail (E_IS_ICON_BAR (icon_bar));
-
- if (icon_bar->view_type == view_type)
- return;
-
- icon_bar->view_type = view_type;
-
- /* Queue a resize of the canvas, so everything is put in the right
- positions based on the new view type. */
- gtk_widget_queue_resize (GTK_WIDGET (icon_bar));
-}
-
-static GdkPixbuf *
-flatten_alpha (GdkPixbuf *image, guint rgb)
-{
- if (!image || !gdk_pixbuf_get_has_alpha (image))
- return NULL;
-
-
- return gdk_pixbuf_composite_color_simple (
- image,
- gdk_pixbuf_get_width (image),
- gdk_pixbuf_get_height (image),
- GDK_INTERP_NEAREST,
- 255,
- 32,
- rgb, rgb);
-}
-
-/*
- * Creates a 24-bits RGB value from a GdkColor
- */
-static guint
-rgb_from_gdk_color (GdkColor *color)
-{
- guint a =
- (((color->red >> 8) << 16) |
- ((color->green >> 8) << 8) |
- ((color->blue >> 8)));
-
- return a;
-}
-
-static void
-e_icon_bar_style_set (GtkWidget *widget, GtkStyle *previous_style) {
- EIconBar *icon_bar;
- EIconBarItem *item;
- gint item_num;
- GdkPixbuf *flattened;
- GtkStyle *style = widget->style;
- GdkColormap *colormap;
-
- colormap = gtk_widget_get_colormap (widget);
- gdk_color_alloc (colormap, &style->fg [GTK_STATE_NORMAL]);
-
- icon_bar = E_ICON_BAR (widget);
-
- for (item_num = 0; item_num < icon_bar->items->len; item_num++) {
-
- item = &g_array_index (icon_bar->items,
- EIconBarItem, item_num);
-
- flattened = flatten_alpha (item->pixbuf,
- rgb_from_gdk_color (&style->bg [GTK_STATE_NORMAL]));
-
- gnome_canvas_item_set(item->image,
- "GnomeCanvasPixbuf::pixbuf", flattened ? flattened : item->pixbuf,
- NULL);
- gnome_canvas_item_set (item->text,
- "font_gdk", style->font,
- "fill_color_gdk", &style->fg [GTK_STATE_NORMAL],
- NULL);
-
- if (flattened)
- /* the canvas item holds the reference now */
- gdk_pixbuf_unref (flattened);
-
- }
-
- e_icon_bar_recalc_item_positions (icon_bar);
-}
-
-
-/**
- * e_icon_bar_add_item:
- * @icon_bar: An #EIconBar.
- * @image: the new item's icon.
- * @text: the new item's text.
- * @position: the position to place the new item, or -1 to place it last.
- *
- * Adds an item to the #EIconBar at the given position.
- **/
-gint
-e_icon_bar_add_item (EIconBar *icon_bar,
- GdkPixbuf *image,
- const gchar *text,
- gint position)
-{
- EIconBarItem item;
- GtkJustification justify;
- GtkAnchorType anchor;
- gint max_lines, retval;
- GtkStyle *style;
- GdkFont *font;
- gdouble text_x, clip_height;
- GdkPixbuf *flattened = NULL;
-
- g_return_val_if_fail (E_IS_ICON_BAR (icon_bar), -1);
- g_return_val_if_fail (text != NULL, -1);
- g_return_val_if_fail (position >= -1, -1);
- g_return_val_if_fail (position <= (gint)icon_bar->items->len, -1);
-
- if (icon_bar->view_type == E_ICON_BAR_LARGE_ICONS) {
- justify = GTK_JUSTIFY_CENTER;
- anchor = GTK_ANCHOR_N;
- max_lines = 2;
- text_x = icon_bar->text_x + (icon_bar->text_w / 2);
- } else {
- justify = GTK_JUSTIFY_LEFT;
- anchor = GTK_ANCHOR_NW;
- max_lines = 1;
- text_x = icon_bar->text_x;
- }
-
- gtk_widget_ensure_style (GTK_WIDGET (icon_bar));
- style = GTK_WIDGET (icon_bar)->style;
- font = style->font;
- clip_height = max_lines * (font->ascent + font->descent);
- item.text = gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (icon_bar)->root),
- e_text_get_type (),
- "font_gdk", font,
- "fill_color_gdk", &style->fg [GTK_STATE_NORMAL],
- "use_ellipsis", TRUE,
- "anchor", anchor,
- "editable", TRUE,
- "justification", justify,
- "line_wrap", TRUE,
- "max_lines", max_lines,
- "clip", TRUE,
- "clip_width", (gdouble) (icon_bar->text_w),
- "clip_height", clip_height,
- "text", text,
- NULL);
- e_canvas_item_move_absolute(item.text,
- text_x, 0);
-
- gtk_signal_connect (GTK_OBJECT (item.text), "event",
- GTK_SIGNAL_FUNC (e_icon_bar_on_item_event),
- icon_bar);
-
- item.pixbuf = image;
- gdk_pixbuf_ref (image);
-
- flattened = flatten_alpha (image,
- rgb_from_gdk_color (&style->bg [GTK_STATE_NORMAL]));
-
- item.image = gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (icon_bar)->root),
- gnome_canvas_pixbuf_get_type (),
- "GnomeCanvasPixbuf::pixbuf", flattened ? flattened : image,
- "GnomeCanvasPixbuf::width", (gdouble) icon_bar->icon_w,
- "GnomeCanvasPixbuf::height", (gdouble) icon_bar->icon_h,
- NULL);
-
-
- if (flattened)
- /* the canvas item holds the reference now */
- gdk_pixbuf_unref (flattened);
-
- gtk_signal_connect (GTK_OBJECT (item.image), "event",
- GTK_SIGNAL_FUNC (e_icon_bar_on_item_event),
- icon_bar);
-
- item.data = NULL;
- item.destroy = NULL;
-
- if (position == -1) {
- g_array_append_val (icon_bar->items, item);
- retval = icon_bar->items->len - 1;
- } else {
- g_array_insert_val (icon_bar->items, position, item);
- retval = position;
-
- /* FIXME: Should possibly update other indices. */
- if (icon_bar->dragged_item_num >= position)
- icon_bar->dragged_item_num++;
- }
-
- gtk_widget_queue_resize (GTK_WIDGET (icon_bar));
-
- return retval;
-}
-
-
-/**
- * e_icon_bar_reorder_item:
- * @icon_bar: An #EIconBar.
- * @item_num: The index of the item to move.
- * @new_position: The new position of the item, which is used after the item
- * has been removed from its current position. If @new_position is -1, the item
- * is placed last.
- *
- * Moves an item to a new position within the #EIconBar.
- **/
-void
-e_icon_bar_reorder_item (EIconBar *icon_bar,
- gint item_num,
- gint new_position)
-{
- EIconBarItem tmp_item;
-
- g_return_if_fail (E_IS_ICON_BAR (icon_bar));
- g_return_if_fail (item_num >= 0);
- g_return_if_fail (item_num < icon_bar->items->len);
- g_return_if_fail (new_position >= -1);
- g_return_if_fail (new_position < icon_bar->items->len);
-
- tmp_item = g_array_index (icon_bar->items, EIconBarItem, item_num);
- g_array_remove_index (icon_bar->items, item_num);
-
- if (new_position == -1)
- g_array_append_val (icon_bar->items, tmp_item);
- else
- g_array_insert_val (icon_bar->items, new_position, tmp_item);
-
- gtk_widget_queue_resize (GTK_WIDGET (icon_bar));
-}
-
-
-/**
- * e_icon_bar_remove_item:
- * @icon_bar: An #EIconBar.
- * @item_num: The index of the item to remove.
- *
- * Removes an item from the #EIconBar.
- **/
-void
-e_icon_bar_remove_item (EIconBar *icon_bar,
- gint item_num)
-{
- EIconBarItem *item;
-
- g_return_if_fail (E_IS_ICON_BAR (icon_bar));
- g_return_if_fail (item_num >= 0);
- g_return_if_fail (item_num < icon_bar->items->len);
-
- item = &g_array_index (icon_bar->items, EIconBarItem, item_num);
-
- if (item->destroy)
- item->destroy (item->data);
-
- gtk_object_destroy (GTK_OBJECT (item->text));
- gtk_object_destroy (GTK_OBJECT (item->image));
- gdk_pixbuf_unref (item->pixbuf);
-
- g_array_remove_index (icon_bar->items, item_num);
-
- gtk_widget_queue_resize (GTK_WIDGET (icon_bar));
-}
-
-
-/**
- * e_icon_bar_get_item_image:
- * @icon_bar: An #EIconBar.
- * @item_num: The index of the item.
- * @Returns: The icon of the given item.
- *
- * Returns the icon used for the given item.
- **/
-GdkPixbuf *
-e_icon_bar_get_item_image (EIconBar *icon_bar,
- gint item_num)
-{
- EIconBarItem *item;
- GdkPixbuf *image = NULL;
-
- g_return_val_if_fail (E_IS_ICON_BAR (icon_bar), NULL);
- g_return_val_if_fail (item_num >= 0, NULL);
- g_return_val_if_fail (item_num < icon_bar->items->len, NULL);
-
- item = &g_array_index (icon_bar->items, EIconBarItem, item_num);
- gtk_object_get (GTK_OBJECT (item->image),
- "GnomeCanvasPixbuf::pixbuf", &image,
- NULL);
- return image;
-}
-
-
-/**
- * e_icon_bar_set_item_image:
- * @icon_bar: An #EIconBar.
- * @item_num: The index of the item.
- * @image: The new icon to use for the given item.
- *
- * Sets the icon to use for the given item.
- **/
-void
-e_icon_bar_set_item_image (EIconBar *icon_bar,
- gint item_num,
- GdkPixbuf *image)
-{
- EIconBarItem *item;
-
- g_return_if_fail (E_IS_ICON_BAR (icon_bar));
- g_return_if_fail (item_num >= 0);
- g_return_if_fail (item_num < icon_bar->items->len);
-
- item = &g_array_index (icon_bar->items, EIconBarItem, item_num);
- gnome_canvas_item_set (item->image,
- "GnomeCanvasPixbuf::pixbuf", image,
- NULL);
-}
-
-
-/**
- * e_icon_bar_get_item_text:
- * @icon_bar: An #EIconBar.
- * @item_num: The index of the item.
- * @Returns: The text of the given item.
- *
- * Returns the text of the given item. This should be freed when no longer
- * needed.
- **/
-gchar*
-e_icon_bar_get_item_text (EIconBar *icon_bar,
- gint item_num)
-{
- EIconBarItem *item;
- gchar *text;
-
- g_return_val_if_fail (E_IS_ICON_BAR (icon_bar), NULL);
- g_return_val_if_fail (item_num >= 0, NULL);
- g_return_val_if_fail (item_num < icon_bar->items->len, NULL);
-
- item = &g_array_index (icon_bar->items, EIconBarItem, item_num);
- gtk_object_get (GTK_OBJECT (item->text),
- "EText::text", &text,
- NULL);
-
- return text;
-}
-
-
-/**
- * e_icon_bar_set_item_text:
- * @icon_bar: An #EIconBar.
- * @item_num: The index of the item.
- * @text: The new text for the given item.
- *
- * Sets the text of the given item.
- **/
-void
-e_icon_bar_set_item_text (EIconBar *icon_bar,
- gint item_num,
- gchar *text)
-{
- EIconBarItem *item;
-
- g_return_if_fail (E_IS_ICON_BAR (icon_bar));
- g_return_if_fail (item_num >= 0);
- g_return_if_fail (item_num < icon_bar->items->len);
-
- item = &g_array_index (icon_bar->items, EIconBarItem, item_num);
- gnome_canvas_item_set (item->text,
- "EText::text", text,
- NULL);
-}
-
-
-/**
- * e_icon_bar_get_item_data:
- * @icon_bar: An #EIconBar.
- * @item_num: The index of the item.
- * @Returns: The user data associated with the given item.
- *
- * Returns the user data associated with the given item.
- **/
-gpointer
-e_icon_bar_get_item_data (EIconBar *icon_bar,
- gint item_num)
-{
- EIconBarItem *item;
-
- g_return_val_if_fail (E_IS_ICON_BAR (icon_bar), NULL);
- g_return_val_if_fail (item_num >= 0, NULL);
- g_return_val_if_fail (item_num < icon_bar->items->len, NULL);
-
- item = &g_array_index (icon_bar->items, EIconBarItem, item_num);
- return item->data;
-}
-
-
-/**
- * e_icon_bar_set_item_data:
- * @icon_bar: An #EIconBar.
- * @item_num: The index of the item.
- * @data: The user data to set for the given item.
- *
- * Sets the user data of the given item.
- **/
-void
-e_icon_bar_set_item_data (EIconBar *icon_bar,
- gint item_num,
- gpointer data)
-{
- e_icon_bar_set_item_data_full (icon_bar, item_num, data, NULL);
-}
-
-
-/**
- * e_icon_bar_set_item_data_full:
- * @icon_bar: An #EIconBar.
- * @item_num: The index of the item.
- * @data: The user data to set for the given item.
- * @destroy: The function to free @data when the item is destroyed.
- *
- * Sets the user data of the given item, and the function to free the data
- * when the item is destroyed.
- **/
-void
-e_icon_bar_set_item_data_full (EIconBar *icon_bar,
- gint item_num,
- gpointer data,
- GtkDestroyNotify destroy)
-{
- EIconBarItem *item;
-
- g_return_if_fail (E_IS_ICON_BAR (icon_bar));
- g_return_if_fail (item_num >= 0);
- g_return_if_fail (item_num < icon_bar->items->len);
-
- item = &g_array_index (icon_bar->items, EIconBarItem, item_num);
-
- if (item->destroy)
- item->destroy (item->data);
-
- item->data = data;
- item->destroy = destroy;
-}
-
-
-static void
-e_icon_bar_reflow (ECanvas *canvas)
-{
-#if 0
- g_print ("In e_icon_bar_on_canvas_reflow\n");
- gtk_widget_queue_resize (GTK_WIDGET (canvas));
-#endif
-}
-
-
-/* This returns the index of the given item, or -1 if it isn't found. */
-static gint
-e_icon_bar_find_item (EIconBar *icon_bar,
- GnomeCanvasItem *canvas_item)
-{
- EIconBarItem *item;
- gint item_num;
-
- for (item_num = 0; item_num < icon_bar->items->len; item_num++) {
- item = &g_array_index (icon_bar->items,
- EIconBarItem, item_num);
-
- if (item->text == canvas_item || item->image == canvas_item) {
- return item_num;
- }
- }
-
- return -1;
-}
-
-
-/* When an item has a grab, it will get all events, so we need to use the
- position to find the real item. */
-static gboolean
-e_icon_bar_on_item_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EIconBar *icon_bar)
-{
- gint item_num;
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- if (event->button.button == 4 || event->button.button == 5)
- return FALSE;
-
- item_num = e_icon_bar_find_item_at_position (icon_bar,
- event->button.x,
- event->button.y,
- NULL);
- /* If the item is not being edited, we handle the event and
- stop the signal so the text editing isn't started. */
- if (icon_bar->editing_item_num == -1
- || icon_bar->editing_item_num != item_num) {
- e_icon_bar_item_pressed (icon_bar, item_num, event);
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item),
- "event");
- return TRUE;
- }
- break;
- case GDK_BUTTON_RELEASE:
- item_num = e_icon_bar_find_item_at_position (icon_bar,
- event->button.x,
- event->button.y,
- NULL);
- /* If the item is not being edited, we handle the event and
- stop the signal so the text editing isn't started. */
- if (icon_bar->editing_item_num == -1
- || icon_bar->editing_item_num != item_num) {
- e_icon_bar_item_released (icon_bar, item_num, event);
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item),
- "event");
- return TRUE;
- }
- break;
- case GDK_MOTION_NOTIFY:
- item_num = e_icon_bar_find_item_at_position (icon_bar,
- event->motion.x,
- event->motion.y,
- NULL);
- e_icon_bar_item_motion (icon_bar, item_num, event);
- return TRUE;
- case GDK_FOCUS_CHANGE:
- if (event->focus_change.in)
- e_icon_bar_on_editing_started (icon_bar, item);
- else
- e_icon_bar_on_editing_stopped (icon_bar, item);
-
- return FALSE;
- default:
- break;
- }
-
- return FALSE;
-}
-
-
-void
-e_icon_bar_item_pressed (EIconBar *icon_bar,
- gint item_num,
- GdkEvent *event)
-{
- gint button;
-
- /* If we are editing an item, and a different item (or anywhere outside
- an item) is clicked, stop the edit. If the item being edited is
- clicked we just return, since the user may be selecting text. */
- if (icon_bar->editing_item_num != -1) {
- if (icon_bar->editing_item_num != item_num) {
- e_icon_bar_stop_editing_item (icon_bar, TRUE);
- }
- return;
- }
-
- button = event->button.button;
-
- if (button == 1 && item_num != -1) {
- icon_bar->mouse_over_item_num = item_num;
- icon_bar->pressed_item_num = item_num;
- icon_bar->pressed_x = event->button.x;
- icon_bar->pressed_y = event->button.y;
- gtk_widget_queue_draw (GTK_WIDGET (icon_bar));
- } else if (button == 3) {
- gtk_signal_emit (GTK_OBJECT (icon_bar),
- e_icon_bar_signals[ITEM_SELECTED],
- event, item_num);
- }
-}
-
-
-void
-e_icon_bar_item_released (EIconBar *icon_bar,
- gint item_num,
- GdkEvent *event)
-{
- gint button;
-
- /* If we are editing an item, just return. */
- if (icon_bar->editing_item_num != -1)
- return;
-
- button = event->button.button;
-
- if (button == 1) {
- if (icon_bar->pressed_item_num != -1
- && icon_bar->pressed_item_num == icon_bar->mouse_over_item_num) {
- gtk_signal_emit (GTK_OBJECT (icon_bar),
- e_icon_bar_signals[ITEM_SELECTED],
- event, item_num);
- }
-
- icon_bar->pressed_item_num = -1;
- gtk_widget_queue_draw (GTK_WIDGET (icon_bar));
- }
-}
-
-
-void
-e_icon_bar_item_motion (EIconBar *icon_bar,
- gint item_num,
- GdkEvent *event)
-{
- gboolean need_redraw = TRUE;
-
- if (event && event->motion.state & GDK_BUTTON1_MASK
- && icon_bar->pressed_item_num != -1) {
- if (abs (event->motion.x - icon_bar->pressed_x) > E_ICON_BAR_DRAG_START_OFFSET
- || abs (event->motion.y - icon_bar->pressed_y) > E_ICON_BAR_DRAG_START_OFFSET) {
- icon_bar->dragged_item_num = icon_bar->pressed_item_num;
- gtk_signal_emit (GTK_OBJECT (icon_bar),
- e_icon_bar_signals[ITEM_DRAGGED],
- event, icon_bar->dragged_item_num);
-
- /* Don't show the button as pressed while dragging. */
- icon_bar->pressed_item_num = -1;
- gtk_widget_queue_draw (GTK_WIDGET (icon_bar));
- }
-
- return;
- }
-
- if (icon_bar->mouse_over_item_num == item_num)
- return;
-
- /* If we are editing an item, items aren't highlighted so we don't
- need a redraw. Also if an item is pressed, we only need a redraw if
- item_num or the old mouse_over_item_num is the pressed item. */
- if (icon_bar->editing_item_num != -1) {
- need_redraw = FALSE;
- } else if (icon_bar->pressed_item_num != -1) {
- if (icon_bar->pressed_item_num != item_num
- && icon_bar->pressed_item_num != icon_bar->mouse_over_item_num)
- need_redraw = FALSE;
- }
-
- icon_bar->mouse_over_item_num = item_num;
-
- if (need_redraw)
- gtk_widget_queue_draw (GTK_WIDGET (icon_bar));
-}
-
-
-/* This returns the index of the item at the given position on the EIconBar,
- or -1 if no item is found. If before_item is not NULL, it returns the
- item which the mouse is before, or -1 (for dragging). */
-gint
-e_icon_bar_find_item_at_position (EIconBar *icon_bar,
- gint x,
- gint y,
- gint *before_item)
-{
- EIconBarItem *item = NULL;
- gint item_num;
-
- if (before_item)
- *before_item = -1;
-
- for (item_num = 0; item_num < icon_bar->items->len; item_num++) {
- item = &g_array_index (icon_bar->items,
- EIconBarItem, item_num);
-
- if (icon_bar->view_type == E_ICON_BAR_LARGE_ICONS) {
- if (e_icon_bar_large_icons_intersects (icon_bar, item,
- x, y))
- return item_num;
-
- if (before_item
- && e_icon_bar_large_icons_is_before (icon_bar,
- item, x, y)) {
- *before_item = item_num;
- return -1;
- }
- } else {
- if (e_icon_bar_small_icons_intersects (icon_bar, item,
- x, y))
- return item_num;
-
- if (before_item
- && e_icon_bar_small_icons_is_before (icon_bar,
- item, x, y)) {
- *before_item = item_num;
- return -1;
- }
-
- }
-
- }
-
- /* If the mouse is below all the items, but inside the items' width,
- and before_item is not NULL, we set it to the number of items, so
- the dropped item would be added at the end. Note that this assumes
- that the item variable points to the last item in the EIconBar. */
- if (before_item) {
- if (icon_bar->view_type == E_ICON_BAR_LARGE_ICONS) {
- if (x < icon_bar->text_x
- || x >= icon_bar->text_x + icon_bar->text_w)
- return -1;
-
- if (item == NULL
- || y > item->icon_y + item->item_height)
- *before_item = icon_bar->items->len;
- } else {
- if (x < icon_bar->icon_x
- || x >= icon_bar->text_x + icon_bar->text_w)
- return -1;
-
- if (item == NULL) {
- *before_item = icon_bar->items->len;
- } else {
- gint max_y;
- max_y = MAX (item->icon_y + icon_bar->icon_h,
- item->text_y + item->text_height);
- if (y > max_y)
- *before_item = icon_bar->items->len;
- }
- }
- }
-
- return -1;
-}
-
-
-static gboolean
-e_icon_bar_large_icons_intersects (EIconBar *icon_bar,
- EIconBarItem *item,
- gint x,
- gint y)
-{
- if (y < item->icon_y || y >= item->text_y + item->text_height)
- return FALSE;
-
- if (y < item->icon_y + icon_bar->icon_h) {
- if (x < icon_bar->icon_x
- || x >= icon_bar->icon_x + icon_bar->icon_w)
- return FALSE;
- } else {
- if (x < item->text_x
- || x >= item->text_x + item->text_width)
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-static gboolean
-e_icon_bar_large_icons_is_before (EIconBar *icon_bar,
- EIconBarItem *item,
- gint x,
- gint y)
-{
- if (y < item->icon_y - icon_bar->spacing
- || y >= item->icon_y)
- return FALSE;
-
- if (x < icon_bar->text_x || x >= icon_bar->text_x + icon_bar->text_w)
- return FALSE;
-
- return TRUE;
-}
-
-
-static gboolean
-e_icon_bar_small_icons_intersects (EIconBar *icon_bar,
- EIconBarItem *item,
- gint x,
- gint y)
-{
- gint min_y, max_y;
-
- min_y = MIN (item->icon_y, item->text_y);
- max_y = MAX (item->icon_y + icon_bar->icon_h,
- item->text_y + item->text_height);
-
- if (y < min_y || y >= max_y)
- return FALSE;
-
- if (x < icon_bar->icon_x || x >= item->text_x + item->text_width)
- return FALSE;
-
- return TRUE;
-}
-
-
-static gboolean
-e_icon_bar_small_icons_is_before (EIconBar *icon_bar,
- EIconBarItem *item,
- gint x,
- gint y)
-{
- gint min_y, max_y;
-
- max_y = MIN (item->icon_y, item->text_y);
- min_y = max_y - icon_bar->spacing;
-
- if (y < min_y || y >= max_y)
- return FALSE;
-
- if (x < icon_bar->icon_x || x >= icon_bar->text_x + icon_bar->text_w)
- return FALSE;
-
- return TRUE;
-}
-
-
-/**
- * e_icon_bar_start_editing_item:
- * @icon_bar: An #EIconBar.
- * @item_num: The index of the item.
- *
- * Turns the item into an editable text field so the user can rename it.
- * Editing is stopped automatically when the user hits 'Return' or clicks
- * outside the item. It can also be stopped explicitly by calling
- * e_icon_bar_stop_editing_item().
- **/
-void
-e_icon_bar_start_editing_item (EIconBar *icon_bar,
- gint item_num)
-{
- EIconBarItem *item;
-
- g_return_if_fail (E_IS_ICON_BAR (icon_bar));
- g_return_if_fail (item_num >= 0);
- g_return_if_fail (item_num < icon_bar->items->len);
-
- item = &g_array_index (icon_bar->items,
- EIconBarItem, item_num);
- e_canvas_item_grab_focus (item->text);
-}
-
-
-/**
- * e_icon_bar_stop_editing_item:
- * @icon_bar: An #EIconBar.
- * @accept: TRUE if the changes should be accepted, FALSE if the text should be
- * changed back to its state before the editing started.
- *
- * Stops the editing of the items, if any were being edited.
- **/
-void
-e_icon_bar_stop_editing_item (EIconBar *icon_bar,
- gboolean accept)
-{
- EIconBarItem *item;
- GtkWidget *toplevel;
-
- g_return_if_fail (E_IS_ICON_BAR (icon_bar));
-
- if (icon_bar->editing_item_num != -1) {
- item = &g_array_index (icon_bar->items, EIconBarItem,
- icon_bar->editing_item_num);
-
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (icon_bar));
- if (toplevel && GTK_IS_WINDOW (toplevel))
- gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
- }
-}
-
-
-static void
-e_icon_bar_on_editing_started (EIconBar *icon_bar,
- GnomeCanvasItem *item)
-{
- gint item_num;
- gdouble x1, y1, x2, y2;
-
- item_num = e_icon_bar_find_item (icon_bar, item);
- g_return_if_fail (item_num != -1);
-
- /* Turn off any highlighted item. */
- e_icon_bar_item_motion (icon_bar, -1, NULL);
-
- icon_bar->editing_item_num = item_num;
-
- e_icon_bar_ensure_edited_item_visible (icon_bar);
-
- /* Set the fg & bg colors. */
- gnome_canvas_item_set (item,
- "fill_color_gdk", &icon_bar->colors[E_ICON_BAR_COLOR_EDITING_TEXT],
- NULL);
-
- /* Create the edit rect if necessary. */
- if (!icon_bar->edit_rect_item) {
- icon_bar->edit_rect_item =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (icon_bar)->root),
- gnome_canvas_rect_get_type(),
- "fill_color_gdk", &icon_bar->colors[E_ICON_BAR_COLOR_EDITING_RECT],
- "outline_color_gdk", &icon_bar->colors[E_ICON_BAR_COLOR_EDITING_RECT_OUTLINE],
- NULL);
- }
-
- gnome_canvas_item_get_bounds (item, &x1, &y1, &x2, &y2);
- gnome_canvas_item_set (icon_bar->edit_rect_item,
- "x1", x1 - 1,
- "y1", y1 - 1,
- "x2", x2 + 1,
- "y2", y2 + 1,
- NULL);
- gnome_canvas_item_show (icon_bar->edit_rect_item);
-
- /* Make sure the text item is on top. */
- gnome_canvas_item_raise_to_top (item);
-}
-
-
-static void
-e_icon_bar_on_editing_stopped (EIconBar *icon_bar,
- GnomeCanvasItem *item)
-{
- gint item_num;
-
- item_num = e_icon_bar_find_item (icon_bar, item);
- g_return_if_fail (item_num != -1);
-
- icon_bar->editing_item_num = -1;
-
- e_icon_bar_update_highlight (icon_bar);
-
- /* Reset the fg & bg colors. */
- gnome_canvas_item_set (item,
- "fill_color_gdk", &(GTK_WIDGET(icon_bar)->style->fg [GTK_STATE_NORMAL]),
- NULL);
-
- if (icon_bar->edit_rect_item) {
- gnome_canvas_item_hide (icon_bar->edit_rect_item);
- }
-}
-
-
-static void
-e_icon_bar_ensure_edited_item_visible (EIconBar *icon_bar)
-{
- EIconBarItem *item;
- gint scroll_x, scroll_y, min_scroll_y, max_scroll_y, new_scroll_y;
-
- if (icon_bar->editing_item_num == -1)
- return;
-
- item = &g_array_index (icon_bar->items,
- EIconBarItem, icon_bar->editing_item_num);
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (icon_bar),
- &scroll_x, &scroll_y);
-
- /* The minimum scroll y position is with the text right on the bottom
- of the display. */
- min_scroll_y = item->text_y + item->text_height + E_ICON_BAR_V_SPACE
- - GTK_WIDGET (icon_bar)->allocation.height;
- /* The maximum scroll y position is with the text at the top. */
- max_scroll_y = item->text_y - E_ICON_BAR_V_SPACE;
-
- new_scroll_y = MAX (scroll_y, min_scroll_y);
- new_scroll_y = MIN (new_scroll_y, max_scroll_y);
-
- if (new_scroll_y != scroll_y)
- gnome_canvas_scroll_to (GNOME_CANVAS (icon_bar),
- scroll_x, new_scroll_y);
-}
-
-
-/* This gets the mouse position and updates the highlight if necessary.
- It is called after items are added/deleted/scrolled/edited. */
-static void
-e_icon_bar_update_highlight (EIconBar *icon_bar)
-{
- GtkWidget *widget;
- gint x, y, item_num;
-
- widget = GTK_WIDGET (icon_bar);
-
- if (!widget->window)
- return;
-
- gdk_window_get_pointer (widget->window, &x, &y, NULL);
-
- if (x < 0 || y < 0
- || x > widget->allocation.width || y > widget->allocation.height)
- return;
-
- x += icon_bar->canvas.parent.layout.hadjustment->value;
- y += icon_bar->canvas.parent.layout.vadjustment->value;
- item_num = e_icon_bar_find_item_at_position (icon_bar, x, y, NULL);
- e_icon_bar_item_motion (icon_bar, item_num, NULL);
-}
-
-
-static gint
-e_icon_bar_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time)
-{
- EIconBar *icon_bar;
- gint item_num, before_item, scroll_x, scroll_y;
-
- g_return_val_if_fail (E_IS_ICON_BAR (widget), FALSE);
-
- icon_bar = E_ICON_BAR (widget);
-
- icon_bar->in_drag = TRUE;
-
- /* Check if the mouse is over or between items, and if so highlight. */
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (icon_bar),
- &scroll_x, &scroll_y);
- item_num = e_icon_bar_find_item_at_position (icon_bar,
- x + scroll_x,
- y + scroll_y,
- &before_item);
- e_icon_bar_item_motion (icon_bar, item_num, NULL);
- e_icon_bar_set_dragging_before_item (icon_bar, before_item);
-
- /* Check if the mouse is at the top or bottom of the bar, and if it is
- scroll up/down. */
- if (y < E_ICON_BAR_DRAG_AUTO_SCROLL_OFFSET)
- icon_bar->scrolling_up = TRUE;
- else if (y >= widget->allocation.height - E_ICON_BAR_DRAG_AUTO_SCROLL_OFFSET)
- icon_bar->scrolling_up = FALSE;
- else {
- if (icon_bar->auto_scroll_timeout_id != 0) {
- gtk_timeout_remove (icon_bar->auto_scroll_timeout_id);
- icon_bar->auto_scroll_timeout_id = 0;
- }
- return FALSE;
- }
-
- if (icon_bar->auto_scroll_timeout_id == 0) {
- icon_bar->auto_scroll_timeout_id = g_timeout_add (E_ICON_BAR_SCROLL_TIMEOUT, e_icon_bar_timeout_handler, icon_bar);
- icon_bar->auto_scroll_delay = E_ICON_BAR_SCROLL_DELAY;
- }
-
- return FALSE;
-}
-
-
-static void
-e_icon_bar_drag_leave (GtkWidget *widget,
- GdkDragContext *context,
- guint time)
-{
- EIconBar *icon_bar;
-
- g_return_if_fail (E_IS_ICON_BAR (widget));
-
- icon_bar = E_ICON_BAR (widget);
-
- icon_bar->in_drag = FALSE;
-
- if (icon_bar->auto_scroll_timeout_id != 0) {
- gtk_timeout_remove (icon_bar->auto_scroll_timeout_id);
- icon_bar->auto_scroll_timeout_id = 0;
- }
-
- if (icon_bar->mouse_over_item_num != -1) {
- icon_bar->mouse_over_item_num = -1;
- gtk_widget_queue_draw (GTK_WIDGET (icon_bar));
- }
-}
-
-
-static void
-e_icon_bar_set_dragging_before_item (EIconBar *icon_bar,
- gint before_item)
-{
- if (icon_bar->dragging_before_item_num == before_item)
- return;
-
- icon_bar->dragging_before_item_num = before_item;
-
- gtk_widget_queue_draw (GTK_WIDGET (icon_bar));
-}
-
-
-static gboolean
-e_icon_bar_timeout_handler (gpointer data)
-{
- EIconBar *icon_bar;
- gint scroll_x, scroll_y, new_scroll_y;
- GtkAdjustment *adj;
-
- g_return_val_if_fail (E_IS_ICON_BAR (data), FALSE);
-
- icon_bar = E_ICON_BAR (data);
-
- GDK_THREADS_ENTER ();
-
- if (icon_bar->auto_scroll_delay > 0) {
- icon_bar->auto_scroll_delay--;
- GDK_THREADS_LEAVE ();
- return TRUE;
- }
-
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (icon_bar),
- &scroll_x, &scroll_y);
-
- adj = GTK_LAYOUT (icon_bar)->vadjustment;
-
- if (icon_bar->scrolling_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)
- gnome_canvas_scroll_to (GNOME_CANVAS (icon_bar),
- scroll_x, new_scroll_y);
-
- GDK_THREADS_LEAVE ();
- return TRUE;
-}
-
-
-static void
-e_icon_bar_vadjustment_value_changed (GtkAdjustment *adjustment,
- EIconBar *icon_bar)
-{
- e_icon_bar_update_highlight (icon_bar);
-}
-
diff --git a/widgets/shortcut-bar/e-icon-bar.h b/widgets/shortcut-bar/e-icon-bar.h
deleted file mode 100644
index 90d9f5a2cf..0000000000
--- a/widgets/shortcut-bar/e-icon-bar.h
+++ /dev/null
@@ -1,246 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_ICON_BAR_H_
-#define _E_ICON_BAR_H_
-
-#include <gdk_imlib.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include "../../e-util/e-canvas.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EIconBar is a subclass of GnomeCanvas for displaying a vertical column of
- * icons and descriptions. It provides 2 views - large icons and small icons.
- */
-
-
-/* This contains information on one item. */
-typedef struct _EIconBarItem EIconBarItem;
-struct _EIconBarItem
-{
- GnomeCanvasItem *text;
- GnomeCanvasItem *image;
-
- /* This holds the original pixbuf so that we can blend
- to the background if the style changes */
- GdkPixbuf *pixbuf;
-
- /* This is user data attached to the item, e.g. a URL. */
- gpointer data;
- GtkDestroyNotify destroy;
-
- /* This is the height of the item. */
- gint item_height;
-
- /* This is the actual x, width and height of the text, rather than
- the maximum allowed area. */
- gint text_x;
- gint text_width;
- gint text_height;
-
- gint icon_y, text_y;
-};
-
-
-/* These are the view types. Defaults to LARGE_ICONS. */
-typedef enum
-{
- E_ICON_BAR_LARGE_ICONS,
- E_ICON_BAR_SMALL_ICONS
-} EIconBarViewType;
-
-
-/* These index our colors array. */
-typedef enum
-{
- E_ICON_BAR_COLOR_EDITING_TEXT,
- E_ICON_BAR_COLOR_EDITING_RECT,
- E_ICON_BAR_COLOR_EDITING_RECT_OUTLINE,
-
- E_ICON_BAR_COLOR_LAST
-} EIconBarColors;
-
-
-#define E_ICON_BAR(obj) GTK_CHECK_CAST (obj, e_icon_bar_get_type (), EIconBar)
-#define E_ICON_BAR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_icon_bar_get_type (), EIconBarClass)
-#define E_IS_ICON_BAR(obj) GTK_CHECK_TYPE (obj, e_icon_bar_get_type ())
-
-
-typedef struct _EIconBar EIconBar;
-typedef struct _EIconBarClass EIconBarClass;
-
-struct _EIconBar
-{
- ECanvas canvas;
-
- /* This specifies if we are using large icons or small icons. */
- EIconBarViewType view_type;
-
- /* This is an array of EIconBarItem elements. */
- GArray *items;
-
- /* This is the index of the item which has been pressed, or -1.
- It will be shown as pressed in while the mouse is over it. */
- gint pressed_item_num;
-
- /* This is the coordinates of where the button was pressed. If the
- mouse moves a certain distance with the button still pressed, we
- start a drag. */
- gint pressed_x;
- gint pressed_y;
-
- /* This is the index of the item the mouse is currently over, or -1.
- It will be highlighted unless one of the items is pressed. */
- gint mouse_over_item_num;
-
- /* This is the item that we are currently editing, or -1. */
- gint editing_item_num;
-
- /* This is a GnomeCanvasRect which is placed around the edited item. */
- GnomeCanvasItem *edit_rect_item;
-
- /* This is the index of the item which is being dragged, or -1.
- If the drag results in a move it will be deleted. */
- gint dragged_item_num;
-
- /* This is TRUE if we are dragging over this EIconBar. */
- gboolean in_drag;
-
- /* This is used in drag-and-drop to indicate the item which the mouse
- is currently before, e.g. if it is 1 then a dropped item would be
- inserted between items 0 and 1. It ranges from 0 to the number of
- items, or is -1 when the mouse is not dragging between items. */
- gint dragging_before_item_num;
-
- /* These are the common positions of all the items in the EIconBar. */
- gint icon_x, icon_w, icon_h, text_x, text_w, spacing;
-
- /* This is the source id of our auto-scroll timeout handler, used when
- in the middle of drag-and-drop operations. */
- gint auto_scroll_timeout_id;
- gint auto_scroll_delay;
- gboolean scrolling_up;
-
- /* Colors for drawing. */
- GdkColor colors[E_ICON_BAR_COLOR_LAST];
-
- /* Signal connection id for "value_changed" signal of vadjustment. */
- guint vadjustment_value_changed_id;
-};
-
-struct _EIconBarClass
-{
- ECanvasClass parent_class;
-
- void (*selected_item) (EIconBar *icon_bar,
- GdkEvent *event,
- gint item_num);
- void (*dragged_item) (EIconBar *icon_bar,
- GdkEvent *event,
- gint item_num);
-};
-
-
-GtkType e_icon_bar_get_type (void);
-GtkWidget* e_icon_bar_new (void);
-
-/* Sets the view type. */
-void e_icon_bar_set_view_type (EIconBar *icon_bar,
- EIconBarViewType view_type);
-
-/* Adds a new item to a group at the given position. If position is -1 it is
- added at the end. It returns the index of the item. */
-gint e_icon_bar_add_item (EIconBar *icon_bar,
- GdkPixbuf *image,
- const gchar *text,
- gint position);
-
-/* Reorders an item. Note that position refers to the new position to add the
- item after removing it from its current position. If position is -1 it is
- moved to the end of the bar. */
-void e_icon_bar_reorder_item (EIconBar *icon_bar,
- gint item_num,
- gint new_position);
-void e_icon_bar_remove_item (EIconBar *icon_bar,
- gint item_num);
-
-GdkPixbuf * e_icon_bar_get_item_image (EIconBar *icon_bar,
- gint item_num);
-void e_icon_bar_set_item_image (EIconBar *icon_bar,
- gint item_num,
- GdkPixbuf *image);
-
-gchar* e_icon_bar_get_item_text (EIconBar *icon_bar,
- gint item_num);
-void e_icon_bar_set_item_text (EIconBar *icon_bar,
- gint item_num,
- gchar *text);
-
-gpointer e_icon_bar_get_item_data (EIconBar *icon_bar,
- gint item_num);
-void e_icon_bar_set_item_data (EIconBar *icon_bar,
- gint item_num,
- gpointer data);
-void e_icon_bar_set_item_data_full (EIconBar *icon_bar,
- gint item_num,
- gpointer data,
- GtkDestroyNotify destroy);
-
-void e_icon_bar_start_editing_item (EIconBar *icon_bar,
- gint item_num);
-void e_icon_bar_stop_editing_item (EIconBar *icon_bar,
- gboolean accept);
-
-
-
-/*
- * INTERNAL FUNCTIONS - for use by EIconBarBgItem.
- */
-
-/* This returns the index of the item at the given position on the EIconBar,
- or -1 if no item is found. If before_item is not NULL, it returns the
- item which the mouse is before, or -1 (this is used for dragging). */
-gint e_icon_bar_find_item_at_position (EIconBar *icon_bar,
- gint x,
- gint y,
- gint *before_item);
-
-void e_icon_bar_item_pressed (EIconBar *icon_bar,
- gint item_num,
- GdkEvent *event);
-void e_icon_bar_item_released (EIconBar *icon_bar,
- gint item_num,
- GdkEvent *event);
-void e_icon_bar_item_motion (EIconBar *icon_bar,
- gint item_num,
- GdkEvent *event);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_ICON_BAR_H_ */
diff --git a/widgets/shortcut-bar/e-shortcut-bar.c b/widgets/shortcut-bar/e-shortcut-bar.c
deleted file mode 100644
index a7d7f76aba..0000000000
--- a/widgets/shortcut-bar/e-shortcut-bar.c
+++ /dev/null
@@ -1,757 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EShortcutBar displays a vertical bar with a number of Groups, each of which
- * contains any number of icons. It is used on the left of the main application
- * window so users can easily access items such as folders and files.
- *
- * The architecture is a bit complicated. EShortcutBar is a sublass of
- * EGroupBar (which supports a number of groups with buttons to slide them
- * into view). EShortcutBar places an EIconBar widget in each group page,
- * which displays an icon and name for each shortcut.
- */
-
-#include <config.h>
-#include <string.h>
-#include <e-util/e-util.h>
-#include "e-shortcut-bar.h"
-#include "e-clipped-label.h"
-#include "e-vscrolled-bar.h"
-
-/* Drag and Drop stuff. */
-enum {
- TARGET_SHORTCUT
-};
-static GtkTargetEntry target_table[] = {
- { "E-SHORTCUT", 0, TARGET_SHORTCUT }
-};
-static guint n_targets = sizeof(target_table) / sizeof(target_table[0]);
-
-gboolean e_shortcut_bar_default_icon_loaded = FALSE;
-GdkPixbuf *e_shortcut_bar_default_icon = NULL;
-gchar *e_shortcut_bar_default_icon_filename = "gnome-folder.png";
-
-static void e_shortcut_bar_class_init (EShortcutBarClass *class);
-static void e_shortcut_bar_init (EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_destroy (GtkObject *object);
-
-static void e_shortcut_bar_disconnect_model (EShortcutBar *shortcut_bar);
-
-static void e_shortcut_bar_on_model_destroyed (EShortcutModel *model,
- EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_on_group_added (EShortcutModel *model,
- gint group_num,
- gchar *group_name,
- EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_on_group_removed (EShortcutModel *model,
- gint group_num,
- EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_on_item_added (EShortcutModel *model,
- gint group_num,
- gint item_num,
- gchar *item_url,
- gchar *item_name,
- EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_on_item_removed (EShortcutModel *model,
- gint group_num,
- gint item_num,
- EShortcutBar *shortcut_bar);
-
-static gint e_shortcut_bar_add_group (EShortcutBar *shortcut_bar,
- gint position,
- const gchar *group_name);
-static void e_shortcut_bar_remove_group (EShortcutBar *shortcut_bar,
- gint group_num);
-static gint e_shortcut_bar_add_item (EShortcutBar *shortcut_bar,
- gint group_num,
- gint position,
- const gchar *item_url,
- const gchar *item_name);
-static void e_shortcut_bar_remove_item (EShortcutBar *shortcut_bar,
- gint group_num,
- gint item_num);
-
-
-static void e_shortcut_bar_set_canvas_style (EShortcutBar *shortcut_bar,
- GtkWidget *canvas);
-static void e_shortcut_bar_item_selected (EIconBar *icon_bar,
- GdkEvent *event,
- gint item_num,
- EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_item_dragged (EIconBar *icon_bar,
- GdkEvent *event,
- gint item_num,
- EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_on_drag_data_get (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_on_drag_data_received(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_on_drag_data_delete (GtkWidget *widget,
- GdkDragContext *context,
- EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_on_drag_end (GtkWidget *widget,
- GdkDragContext *context,
- EShortcutBar *shortcut_bar);
-static void e_shortcut_bar_stop_editing (GtkWidget *button,
- EShortcutBar *shortcut_bar);
-static GdkPixbuf* e_shortcut_bar_get_image_from_url (EShortcutBar *shortcut_bar,
- const gchar *item_url);
-static GdkPixbuf* e_shortcut_bar_load_image (const gchar *filename);
-
-
-enum
-{
- ITEM_SELECTED,
- LAST_SIGNAL
-};
-
-static guint e_shortcut_bar_signals[LAST_SIGNAL] = {0};
-
-static EGroupBarClass *parent_class;
-
-
-E_MAKE_TYPE(e_shortcut_bar, "EShortcutBar", EShortcutBar,
- e_shortcut_bar_class_init, e_shortcut_bar_init,
- e_group_bar_get_type())
-
-
-static void
-e_shortcut_bar_class_init (EShortcutBarClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- parent_class = gtk_type_class (e_group_bar_get_type ());
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
-
- e_shortcut_bar_signals[ITEM_SELECTED] =
- gtk_signal_new ("item_selected",
- GTK_RUN_LAST | GTK_RUN_ACTION,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShortcutBarClass,
- selected_item),
- gtk_marshal_NONE__POINTER_INT_INT,
- GTK_TYPE_NONE, 3, GTK_TYPE_GDK_EVENT,
- GTK_TYPE_INT, GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, e_shortcut_bar_signals,
- LAST_SIGNAL);
-
- /* Method override */
- object_class->destroy = e_shortcut_bar_destroy;
-}
-
-
-static void
-e_shortcut_bar_init (EShortcutBar *shortcut_bar)
-{
- shortcut_bar->groups = g_array_new (FALSE, FALSE,
- sizeof (EShortcutBarGroup));
-
- shortcut_bar->dragged_url = NULL;
- shortcut_bar->dragged_name = NULL;
-}
-
-
-GtkWidget *
-e_shortcut_bar_new (void)
-{
- GtkWidget *shortcut_bar;
-
- shortcut_bar = GTK_WIDGET (gtk_type_new (e_shortcut_bar_get_type ()));
-
- return shortcut_bar;
-}
-
-
-static void
-e_shortcut_bar_destroy (GtkObject *object)
-{
- EShortcutBar *shortcut_bar;
-
- shortcut_bar = E_SHORTCUT_BAR (object);
-
- g_array_free (shortcut_bar->groups, TRUE);
-
- g_free (shortcut_bar->dragged_url);
- g_free (shortcut_bar->dragged_name);
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-
-void
-e_shortcut_bar_set_model (EShortcutBar *shortcut_bar,
- EShortcutModel *model)
-{
- gint num_groups, group_num, num_items, item_num;
- gchar *group_name, *item_url, *item_name;
-
- /* Disconnect any existing model. */
- e_shortcut_bar_disconnect_model (shortcut_bar);
-
- shortcut_bar->model = model;
-
- if (!model)
- return;
-
- gtk_signal_connect (GTK_OBJECT (model), "destroy",
- GTK_SIGNAL_FUNC (e_shortcut_bar_on_model_destroyed),
- shortcut_bar);
- gtk_signal_connect (GTK_OBJECT (model), "group_added",
- GTK_SIGNAL_FUNC (e_shortcut_bar_on_group_added),
- shortcut_bar);
- gtk_signal_connect (GTK_OBJECT (model), "group_removed",
- GTK_SIGNAL_FUNC (e_shortcut_bar_on_group_removed),
- shortcut_bar);
- gtk_signal_connect (GTK_OBJECT (model), "item_added",
- GTK_SIGNAL_FUNC (e_shortcut_bar_on_item_added),
- shortcut_bar);
- gtk_signal_connect (GTK_OBJECT (model), "item_removed",
- GTK_SIGNAL_FUNC (e_shortcut_bar_on_item_removed),
- shortcut_bar);
-
- /* Add any items already in the model. */
- num_groups = e_shortcut_model_get_num_groups (model);
- for (group_num = 0; group_num < num_groups; group_num++) {
- group_name = e_shortcut_model_get_group_name (model,
- group_num);
- e_shortcut_bar_add_group (shortcut_bar, group_num, group_name);
- g_free (group_name);
-
- num_items = e_shortcut_model_get_num_items (model, group_num);
- for (item_num = 0; item_num < num_items; item_num++) {
- e_shortcut_model_get_item_info (model, group_num,
- item_num, &item_url,
- &item_name);
- e_shortcut_bar_add_item (shortcut_bar, group_num,
- item_num, item_url,
- item_name);
- g_free (item_url);
- g_free (item_name);
- }
- }
-}
-
-
-static void
-e_shortcut_bar_disconnect_model (EShortcutBar *shortcut_bar)
-{
- /* Remove all the current groups. */
- while (shortcut_bar->groups->len)
- e_shortcut_bar_remove_group (shortcut_bar, 0);
-
- if (shortcut_bar->model) {
- /* Disconnect all the signals in one go. */
- gtk_signal_disconnect_by_data (GTK_OBJECT (shortcut_bar->model), shortcut_bar);
- shortcut_bar->model = NULL;
- }
-}
-
-
-static void
-e_shortcut_bar_on_model_destroyed (EShortcutModel *model,
- EShortcutBar *shortcut_bar)
-{
- e_shortcut_bar_disconnect_model (shortcut_bar);
-}
-
-
-static void
-e_shortcut_bar_on_group_added (EShortcutModel *model,
- gint group_num,
- gchar *group_name,
- EShortcutBar *shortcut_bar)
-{
- e_shortcut_bar_add_group (shortcut_bar, group_num, group_name);
-}
-
-
-static void
-e_shortcut_bar_on_group_removed (EShortcutModel *model,
- gint group_num,
- EShortcutBar *shortcut_bar)
-{
- e_shortcut_bar_remove_group (shortcut_bar, group_num);
-}
-
-
-static void
-e_shortcut_bar_on_item_added (EShortcutModel *model,
- gint group_num,
- gint item_num,
- gchar *item_url,
- gchar *item_name,
- EShortcutBar *shortcut_bar)
-{
- e_shortcut_bar_add_item (shortcut_bar, group_num, item_num,
- item_url, item_name);
-}
-
-
-static void
-e_shortcut_bar_on_item_removed (EShortcutModel *model,
- gint group_num,
- gint item_num,
- EShortcutBar *shortcut_bar)
-{
- e_shortcut_bar_remove_item (shortcut_bar, group_num, item_num);
-}
-
-
-
-static gint
-e_shortcut_bar_add_group (EShortcutBar *shortcut_bar,
- gint position,
- const gchar *group_name)
-{
- EShortcutBarGroup *group, tmp_group;
- gint group_num;
- GtkWidget *button, *label;
-
- g_return_val_if_fail (E_IS_SHORTCUT_BAR (shortcut_bar), -1);
- g_return_val_if_fail (group_name != NULL, -1);
-
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
- gtk_widget_push_visual (gdk_rgb_get_visual ());
-
- group_num = position;
- g_array_insert_val (shortcut_bar->groups, group_num, tmp_group);
-
- group = &g_array_index (shortcut_bar->groups,
- EShortcutBarGroup, group_num);
-
- group->vscrolled_bar = e_vscrolled_bar_new (NULL);
- gtk_widget_show (group->vscrolled_bar);
- gtk_signal_connect (
- GTK_OBJECT (E_VSCROLLED_BAR (group->vscrolled_bar)->up_button),
- "pressed", GTK_SIGNAL_FUNC (e_shortcut_bar_stop_editing), shortcut_bar);
- gtk_signal_connect (
- GTK_OBJECT (E_VSCROLLED_BAR (group->vscrolled_bar)->down_button),
- "pressed", GTK_SIGNAL_FUNC (e_shortcut_bar_stop_editing), shortcut_bar);
-
- group->icon_bar = e_icon_bar_new ();
- gtk_widget_show (group->icon_bar);
- gtk_container_add (GTK_CONTAINER (group->vscrolled_bar),
- group->icon_bar);
- gtk_signal_connect (GTK_OBJECT (group->icon_bar), "item_selected",
- GTK_SIGNAL_FUNC (e_shortcut_bar_item_selected),
- shortcut_bar);
- gtk_signal_connect (GTK_OBJECT (group->icon_bar), "item_dragged",
- GTK_SIGNAL_FUNC (e_shortcut_bar_item_dragged),
- shortcut_bar);
- gtk_signal_connect (GTK_OBJECT (group->icon_bar), "drag_data_get",
- GTK_SIGNAL_FUNC (e_shortcut_bar_on_drag_data_get),
- shortcut_bar);
- gtk_signal_connect (GTK_OBJECT (group->icon_bar), "drag_data_received",
- GTK_SIGNAL_FUNC (e_shortcut_bar_on_drag_data_received),
- shortcut_bar);
- gtk_signal_connect (GTK_OBJECT (group->icon_bar), "drag_data_delete",
- GTK_SIGNAL_FUNC (e_shortcut_bar_on_drag_data_delete),
- shortcut_bar);
- gtk_signal_connect (GTK_OBJECT (group->icon_bar), "drag_end",
- GTK_SIGNAL_FUNC (e_shortcut_bar_on_drag_end),
- shortcut_bar);
-
-#ifndef E_USE_STYLES
- e_shortcut_bar_set_canvas_style (shortcut_bar, group->icon_bar);
-#endif
-
- button = gtk_button_new ();
- label = e_clipped_label_new (group_name);
- gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
- gtk_widget_show (label);
- gtk_container_add (GTK_CONTAINER (button), label);
- gtk_widget_show (button);
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (e_shortcut_bar_stop_editing),
- shortcut_bar);
-
- gtk_drag_dest_set (GTK_WIDGET (group->icon_bar),
- GTK_DEST_DEFAULT_ALL,
- target_table, n_targets,
- GDK_ACTION_COPY | GDK_ACTION_MOVE);
- gtk_drag_dest_set (GTK_WIDGET (button),
- GTK_DEST_DEFAULT_ALL,
- target_table, n_targets,
- GDK_ACTION_COPY | GDK_ACTION_MOVE);
-
- e_group_bar_add_group (E_GROUP_BAR (shortcut_bar),
- group->vscrolled_bar, button, -1);
-
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
-
- return group_num;
-}
-
-
-static void
-e_shortcut_bar_remove_group (EShortcutBar *shortcut_bar,
- gint group_num)
-{
- e_group_bar_remove_group (E_GROUP_BAR (shortcut_bar), group_num);
- g_array_remove_index (shortcut_bar->groups, group_num);
-}
-
-
-static gint
-e_shortcut_bar_add_item (EShortcutBar *shortcut_bar,
- gint group_num,
- gint position,
- const gchar *item_url,
- const gchar *item_name)
-{
- EShortcutBarGroup *group;
- GdkPixbuf *image;
- gint item_num;
-
- g_return_val_if_fail (E_IS_SHORTCUT_BAR (shortcut_bar), -1);
- g_return_val_if_fail (group_num >= 0, -1);
- g_return_val_if_fail (group_num < shortcut_bar->groups->len, -1);
- g_return_val_if_fail (item_url != NULL, -1);
- g_return_val_if_fail (item_name != NULL, -1);
-
- image = e_shortcut_bar_get_image_from_url (shortcut_bar, item_url);
- group = &g_array_index (shortcut_bar->groups,
- EShortcutBarGroup, group_num);
-
- item_num = e_icon_bar_add_item (E_ICON_BAR (group->icon_bar),
- image, item_name, position);
- gdk_pixbuf_unref (image);
- e_icon_bar_set_item_data_full (E_ICON_BAR (group->icon_bar), item_num,
- g_strdup (item_url), g_free);
-
- return item_num;
-}
-
-
-static void
-e_shortcut_bar_remove_item (EShortcutBar *shortcut_bar,
- gint group_num,
- gint item_num)
-{
- EShortcutBarGroup *group;
-
- g_return_if_fail (E_IS_SHORTCUT_BAR (shortcut_bar));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < shortcut_bar->groups->len);
-
- group = &g_array_index (shortcut_bar->groups,
- EShortcutBarGroup, group_num);
-
- e_icon_bar_remove_item (E_ICON_BAR (group->icon_bar), item_num);
-}
-
-
-static void
-e_shortcut_bar_set_canvas_style (EShortcutBar *shortcut_bar,
- GtkWidget *canvas)
-{
- GtkRcStyle *rc_style;
-
- rc_style = gtk_rc_style_new ();
-
- rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
- rc_style->fg[GTK_STATE_NORMAL].red = 65535;
- rc_style->fg[GTK_STATE_NORMAL].green = 65535;
- rc_style->fg[GTK_STATE_NORMAL].blue = 65535;
-
- rc_style->bg[GTK_STATE_NORMAL].red = 32512;
- rc_style->bg[GTK_STATE_NORMAL].green = 32512;
- rc_style->bg[GTK_STATE_NORMAL].blue = 32512;
-
- gtk_widget_modify_style (GTK_WIDGET (canvas), rc_style);
- gtk_rc_style_unref (rc_style);
-}
-
-
-void
-e_shortcut_bar_set_view_type (EShortcutBar *shortcut_bar,
- gint group_num,
- EIconBarViewType view_type)
-{
- EShortcutBarGroup *group;
-
- g_return_if_fail (E_IS_SHORTCUT_BAR (shortcut_bar));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < shortcut_bar->groups->len);
-
- group = &g_array_index (shortcut_bar->groups,
- EShortcutBarGroup, group_num);
-
- e_icon_bar_set_view_type (E_ICON_BAR (group->icon_bar), view_type);
-}
-
-
-EIconBarViewType
-e_shortcut_bar_get_view_type (EShortcutBar *shortcut_bar,
- gint group_num)
-{
- EShortcutBarGroup *group;
-
- g_return_val_if_fail (E_IS_SHORTCUT_BAR (shortcut_bar), E_ICON_BAR_SMALL_ICONS);
- g_return_val_if_fail (group_num >= 0, E_ICON_BAR_SMALL_ICONS);
- g_return_val_if_fail (group_num < shortcut_bar->groups->len, E_ICON_BAR_SMALL_ICONS);
-
- group = &g_array_index (shortcut_bar->groups,
- EShortcutBarGroup, group_num);
-
- return E_ICON_BAR (group->icon_bar)->view_type;
-}
-
-
-static void
-e_shortcut_bar_item_selected (EIconBar *icon_bar,
- GdkEvent *event,
- gint item_num,
- EShortcutBar *shortcut_bar)
-{
- gint group_num;
-
- group_num = e_group_bar_get_group_num (E_GROUP_BAR (shortcut_bar),
- GTK_WIDGET (icon_bar)->parent);
-
- gtk_signal_emit (GTK_OBJECT (shortcut_bar),
- e_shortcut_bar_signals[ITEM_SELECTED],
- event, group_num, item_num);
-}
-
-
-static void
-e_shortcut_bar_item_dragged (EIconBar *icon_bar,
- GdkEvent *event,
- gint item_num,
- EShortcutBar *shortcut_bar)
-{
- GtkTargetList *target_list;
- gint group_num;
-
- group_num = e_group_bar_get_group_num (E_GROUP_BAR (shortcut_bar),
- GTK_WIDGET (icon_bar)->parent);
-
- shortcut_bar->dragged_url = g_strdup (e_icon_bar_get_item_data (icon_bar, item_num));
- shortcut_bar->dragged_name = e_icon_bar_get_item_text (icon_bar, item_num);
-
- target_list = gtk_target_list_new (target_table, n_targets);
- gtk_drag_begin (GTK_WIDGET (icon_bar), target_list,
- GDK_ACTION_COPY | GDK_ACTION_MOVE,
- 1, event);
- gtk_target_list_unref (target_list);
-}
-
-
-static void
-e_shortcut_bar_on_drag_data_get (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- EShortcutBar *shortcut_bar)
-{
- gchar *data;
-
- if (info == TARGET_SHORTCUT) {
- data = g_strdup_printf ("%s%c%s", shortcut_bar->dragged_name,
- '\0', shortcut_bar->dragged_url);
- gtk_selection_data_set (selection_data, selection_data->target,
- 8, data,
- strlen (shortcut_bar->dragged_name)
- + strlen (shortcut_bar->dragged_url)
- + 2);
- g_free (data);
- }
-}
-
-
-static void
-e_shortcut_bar_on_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- EShortcutBar *shortcut_bar)
-{
- gchar *item_name, *item_url;
- EIconBar *icon_bar;
- gint position, group_num;
-
- icon_bar = E_ICON_BAR (widget);
- position = icon_bar->dragging_before_item_num;
-
- if ((data->length >= 0) && (data->format == 8)
- && position != -1) {
- item_name = data->data;
- item_url = item_name + strlen (item_name) + 1;
-
- group_num = e_group_bar_get_group_num (E_GROUP_BAR (shortcut_bar),
- GTK_WIDGET (icon_bar)->parent);
-
- e_shortcut_model_add_item (shortcut_bar->model, group_num,
- position, item_url, item_name);
-
- gtk_drag_finish (context, TRUE, TRUE, time);
- return;
- }
-
- gtk_drag_finish (context, FALSE, FALSE, time);
-}
-
-
-static void
-e_shortcut_bar_on_drag_data_delete (GtkWidget *widget,
- GdkDragContext *context,
- EShortcutBar *shortcut_bar)
-{
- EIconBar *icon_bar;
- gint group_num;
-
- icon_bar = E_ICON_BAR (widget);
-
- group_num = e_group_bar_get_group_num (E_GROUP_BAR (shortcut_bar),
- widget->parent);
-
- e_shortcut_model_remove_item (shortcut_bar->model, group_num,
- icon_bar->dragged_item_num);
-}
-
-
-static void
-e_shortcut_bar_on_drag_end (GtkWidget *widget,
- GdkDragContext *context,
- EShortcutBar *shortcut_bar)
-{
- g_free (shortcut_bar->dragged_name);
- shortcut_bar->dragged_name = NULL;
-
- g_free (shortcut_bar->dragged_url);
- shortcut_bar->dragged_url = NULL;
-}
-
-
-void
-e_shortcut_bar_start_editing_item (EShortcutBar *shortcut_bar,
- gint group_num,
- gint item_num)
-{
- EShortcutBarGroup *group;
-
- g_return_if_fail (E_IS_SHORTCUT_BAR (shortcut_bar));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < shortcut_bar->groups->len);
-
- group = &g_array_index (shortcut_bar->groups,
- EShortcutBarGroup, group_num);
-
- e_icon_bar_start_editing_item (E_ICON_BAR (group->icon_bar), item_num);
-}
-
-
-/* We stop editing any item when a scroll button is pressed. */
-static void
-e_shortcut_bar_stop_editing (GtkWidget *button,
- EShortcutBar *shortcut_bar)
-{
- EShortcutBarGroup *group;
- gint group_num;
-
- for (group_num = 0;
- group_num < shortcut_bar->groups->len;
- group_num++) {
- group = &g_array_index (shortcut_bar->groups,
- EShortcutBarGroup, group_num);
- e_icon_bar_stop_editing_item (E_ICON_BAR (group->icon_bar),
- TRUE);
- }
-}
-
-
-/* Sets the callback which is called to return the icon to use for a particular
- URL. */
-void
-e_shortcut_bar_set_icon_callback (EShortcutBar *shortcut_bar,
- EShortcutBarIconCallback cb,
- gpointer data)
-{
- shortcut_bar->icon_callback = cb;
- shortcut_bar->icon_callback_data = data;
-}
-
-
-static GdkPixbuf *
-e_shortcut_bar_get_image_from_url (EShortcutBar *shortcut_bar,
- const gchar *item_url)
-{
- GdkPixbuf *icon = NULL;
-
- if (shortcut_bar->icon_callback)
- icon = (*shortcut_bar->icon_callback) (shortcut_bar,
- item_url,
- shortcut_bar->icon_callback_data);
-
- if (!icon) {
- if (!e_shortcut_bar_default_icon_loaded) {
- e_shortcut_bar_default_icon_loaded = TRUE;
- e_shortcut_bar_default_icon = e_shortcut_bar_load_image (e_shortcut_bar_default_icon_filename);
- }
- icon = e_shortcut_bar_default_icon;
- /* ref the default icon each time we return it */
- gdk_pixbuf_ref (icon);
- }
-
- return icon;
-}
-
-
-static GdkPixbuf *
-e_shortcut_bar_load_image (const gchar *filename)
-{
- gchar *pathname;
- GdkPixbuf *image = NULL;
-
- pathname = gnome_pixmap_file (filename);
- if (pathname)
- image = gdk_pixbuf_new_from_file (pathname);
- else
- g_warning ("Couldn't find pixmap: %s", filename);
-
- g_free (pathname);
-
- return image;
-}
diff --git a/widgets/shortcut-bar/e-shortcut-bar.h b/widgets/shortcut-bar/e-shortcut-bar.h
deleted file mode 100644
index 573303d290..0000000000
--- a/widgets/shortcut-bar/e-shortcut-bar.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_SHORTCUT_BAR_H_
-#define _E_SHORTCUT_BAR_H_
-
-#include "e-group-bar.h"
-#include "e-icon-bar.h"
-#include "e-shortcut-model.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EShortcutBar displays a vertical bar with a number of Groups, each of which
- * contains any number of icons. It is used on the left of the main application
- * window so users can easily access items such as folders and files.
- */
-
-typedef struct _EShortcutBar EShortcutBar;
-typedef struct _EShortcutBarClass EShortcutBarClass;
-
-
-typedef GdkPixbuf* (*EShortcutBarIconCallback) (EShortcutBar *shortcut_bar,
- const gchar *url,
- gpointer data);
-
-/* This contains information on one group. */
-typedef struct _EShortcutBarGroup EShortcutBarGroup;
-struct _EShortcutBarGroup
-{
- /* This is the EVScrolledBar which scrolls the group. */
- GtkWidget *vscrolled_bar;
-
- /* This is the icon bar containing the child items. */
- GtkWidget *icon_bar;
-};
-
-
-#define E_TYPE_SHORTCUT_BAR (e_shortcut_bar_get_type ())
-#define E_SHORTCUT_BAR(obj) GTK_CHECK_CAST (obj, e_shortcut_bar_get_type (), EShortcutBar)
-#define E_SHORTCUT_BAR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_shortcut_bar_get_type (), EShortcutBarClass)
-#define E_IS_SHORTCUT_BAR(obj) GTK_CHECK_TYPE (obj, e_shortcut_bar_get_type ())
-
-
-struct _EShortcutBar
-{
- EGroupBar group_bar;
-
- /* This is the underlying model. */
- EShortcutModel *model;
-
- /* This is an array of EShortcutBarGroup elements. */
- GArray *groups;
-
- /* The callback which the application sets to return the icon to use
- for a given URL. */
- EShortcutBarIconCallback icon_callback;
-
- /* Closure for the callback. */
- gpointer icon_callback_data;
-
- gchar *dragged_url;
- gchar *dragged_name;
-};
-
-struct _EShortcutBarClass
-{
- EGroupBarClass parent_class;
-
- void (*selected_item) (EShortcutBar *shortcut_bar,
- GdkEvent *event,
- gint group_num,
- gint item_num);
-};
-
-
-GtkType e_shortcut_bar_get_type (void);
-GtkWidget* e_shortcut_bar_new (void);
-
-/* Sets the underlying model. */
-void e_shortcut_bar_set_model (EShortcutBar *shortcut_bar,
- EShortcutModel *shortcut_model);
-
-/* Sets/gets the view type for the group. */
-void e_shortcut_bar_set_view_type (EShortcutBar *shortcut_bar,
- gint group_num,
- EIconBarViewType view_type);
-EIconBarViewType e_shortcut_bar_get_view_type (EShortcutBar *shortcut_bar,
- gint group_num);
-
-void e_shortcut_bar_start_editing_item (EShortcutBar *shortcut_bar,
- gint group_num,
- gint item_num);
-
-/* Sets the callback which is called to return the icon to use for a particular
- URL. This callback must be set before any items are added. If the callback
- returns NULL the default icon is used. */
-void e_shortcut_bar_set_icon_callback (EShortcutBar *shortcut_bar,
- EShortcutBarIconCallback cb,
- gpointer data);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_SHORTCUT_BAR_H_ */
diff --git a/widgets/shortcut-bar/e-shortcut-model.c b/widgets/shortcut-bar/e-shortcut-model.c
deleted file mode 100644
index 61cfe54a4b..0000000000
--- a/widgets/shortcut-bar/e-shortcut-model.c
+++ /dev/null
@@ -1,556 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EShortcutModel keeps track of a number of groups of shortcuts.
- * Each shortcut has a URL and a short textual name.
- * It is used as the model of the EShortcutBar.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <e-util/e-util.h>
-#include "e-shortcut-model.h"
-
-/* This contains information on one item. */
-typedef struct _EShortcutModelItem EShortcutModelItem;
-struct _EShortcutModelItem
-{
- gchar *name;
- gchar *url;
-};
-
-
-/* This contains information on one group. */
-typedef struct _EShortcutModelGroup EShortcutModelGroup;
-struct _EShortcutModelGroup
-{
- gchar *name;
-
- /* An array of EShortcutModelItem. */
- GArray *items;
-};
-
-#define ESM_CLASS(e) ((EShortcutModelClass *)((GtkObject *)e)->klass)
-
-
-static void e_shortcut_model_class_init (EShortcutModelClass *class);
-static void e_shortcut_model_init (EShortcutModel *shortcut_model);
-static void e_shortcut_model_destroy (GtkObject *object);
-static void e_shortcut_model_free_group (EShortcutModel *shortcut_model,
- gint group_num);
-
-static void e_shortcut_model_real_add_group (EShortcutModel *shortcut_model,
- gint position,
- const gchar *group_name);
-static void e_shortcut_model_real_remove_group (EShortcutModel *shortcut_model,
- gint group_num);
-static void e_shortcut_model_real_add_item (EShortcutModel *shortcut_model,
- gint group_num,
- gint position,
- const gchar *item_url,
- const gchar *item_name);
-static void e_shortcut_model_real_remove_item (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num);
-
-static void e_shortcut_model_marshal1 (GtkObject *object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg *args);
-static void e_shortcut_model_marshal2 (GtkObject *object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg *args);
-
-static gint e_shortcut_model_real_get_num_groups(EShortcutModel *shortcut_model);
-static gint e_shortcut_model_real_get_num_items (EShortcutModel *shortcut_model,
- gint group_num);
-static gchar* e_shortcut_model_real_get_group_name (EShortcutModel *shortcut_model,
- gint group_num);
-static void e_shortcut_model_real_get_item_info (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num,
- gchar **item_url,
- gchar **item_name);
-
-enum
-{
- GROUP_ADDED,
- GROUP_REMOVED,
- ITEM_ADDED,
- ITEM_REMOVED,
-
- LAST_SIGNAL
-};
-
-static guint e_shortcut_model_signals[LAST_SIGNAL] = {0};
-
-static GtkObjectClass *parent_class;
-
-
-E_MAKE_TYPE(e_shortcut_model, "EShortcutModel", EShortcutModel,
- e_shortcut_model_class_init, e_shortcut_model_init,
- GTK_TYPE_OBJECT)
-
-
-static void
-e_shortcut_model_class_init (EShortcutModelClass *class)
-{
- GtkObjectClass *object_class;
-
- parent_class = gtk_type_class (GTK_TYPE_OBJECT);
-
- object_class = (GtkObjectClass *) class;
-
- e_shortcut_model_signals[GROUP_ADDED] =
- gtk_signal_new ("group_added",
- GTK_RUN_FIRST | GTK_RUN_ACTION,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShortcutModelClass,
- group_added),
- e_shortcut_model_marshal1,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_INT, GTK_TYPE_STRING);
-
- e_shortcut_model_signals[GROUP_REMOVED] =
- gtk_signal_new ("group_removed",
- GTK_RUN_FIRST | GTK_RUN_ACTION,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShortcutModelClass,
- group_removed),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_INT);
-
- e_shortcut_model_signals[ITEM_ADDED] =
- gtk_signal_new ("item_added",
- GTK_RUN_FIRST | GTK_RUN_ACTION,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShortcutModelClass,
- item_added),
- e_shortcut_model_marshal2,
- GTK_TYPE_NONE, 4,
- GTK_TYPE_INT, GTK_TYPE_INT,
- GTK_TYPE_STRING, GTK_TYPE_STRING);
-
- e_shortcut_model_signals[ITEM_REMOVED] =
- gtk_signal_new ("item_removed",
- GTK_RUN_FIRST | GTK_RUN_ACTION,
- object_class->type,
- GTK_SIGNAL_OFFSET (EShortcutModelClass,
- item_removed),
- gtk_marshal_NONE__INT_INT,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_INT, GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, e_shortcut_model_signals,
- LAST_SIGNAL);
-
- /* Method override */
- object_class->destroy = e_shortcut_model_destroy;
-
- class->group_added = e_shortcut_model_real_add_group;
- class->group_removed = e_shortcut_model_real_remove_group;
- class->item_added = e_shortcut_model_real_add_item;
- class->item_removed = e_shortcut_model_real_remove_item;
-
- class->get_num_groups = e_shortcut_model_real_get_num_groups;
- class->get_num_items = e_shortcut_model_real_get_num_items;
- class->get_group_name = e_shortcut_model_real_get_group_name;
- class->get_item_info = e_shortcut_model_real_get_item_info;
-}
-
-
-static void
-e_shortcut_model_init (EShortcutModel *shortcut_model)
-{
- shortcut_model->groups = g_array_new (FALSE, FALSE,
- sizeof (EShortcutModelGroup));
-}
-
-
-EShortcutModel *
-e_shortcut_model_new (void)
-{
- EShortcutModel *shortcut_model;
-
- shortcut_model = E_SHORTCUT_MODEL (gtk_type_new (e_shortcut_model_get_type ()));
-
- return shortcut_model;
-}
-
-
-static void
-e_shortcut_model_destroy (GtkObject *object)
-{
- EShortcutModel *shortcut_model;
- gint num_groups, group_num;
-
- shortcut_model = E_SHORTCUT_MODEL (object);
-
- num_groups = shortcut_model->groups->len;
- for (group_num = 0; group_num < num_groups; group_num++)
- e_shortcut_model_free_group (shortcut_model, group_num);
-
- g_array_free (shortcut_model->groups, TRUE);
- shortcut_model->groups = NULL;
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-
-static void
-e_shortcut_model_free_group (EShortcutModel *shortcut_model,
- gint group_num)
-{
- EShortcutModelGroup *group;
- EShortcutModelItem *item;
- gint item_num;
-
- group = &g_array_index (shortcut_model->groups,
- EShortcutModelGroup, group_num);
-
- g_free (group->name);
-
- for (item_num = 0; item_num < group->items->len; item_num++) {
- item = &g_array_index (group->items,
- EShortcutModelItem, item_num);
- g_free (item->name);
- g_free (item->url);
- }
-}
-
-
-gint
-e_shortcut_model_add_group (EShortcutModel *shortcut_model,
- gint position,
- const gchar *group_name)
-{
- g_return_val_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model), -1);
- g_return_val_if_fail (group_name != NULL, -1);
-
- if (position == -1 || position > shortcut_model->groups->len)
- position = shortcut_model->groups->len;
-
- gtk_signal_emit (GTK_OBJECT (shortcut_model),
- e_shortcut_model_signals[GROUP_ADDED],
- position, group_name);
-
- return position;
-}
-
-
-static void
-e_shortcut_model_real_add_group (EShortcutModel *shortcut_model,
- gint group_num,
- const gchar *group_name)
-{
- EShortcutModelGroup *group, tmp_group;
-
- g_return_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num <= shortcut_model->groups->len);
- g_return_if_fail (group_name != NULL);
-
- g_array_insert_val (shortcut_model->groups, group_num, tmp_group);
-
- group = &g_array_index (shortcut_model->groups,
- EShortcutModelGroup, group_num);
-
- group->name = g_strdup (group_name);
- group->items = g_array_new (FALSE, FALSE,
- sizeof (EShortcutModelItem));
-}
-
-
-void
-e_shortcut_model_remove_group (EShortcutModel *shortcut_model,
- gint group_num)
-{
- g_return_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < shortcut_model->groups->len);
-
- gtk_signal_emit (GTK_OBJECT (shortcut_model),
- e_shortcut_model_signals[GROUP_REMOVED],
- group_num);
-}
-
-
-static void
-e_shortcut_model_real_remove_group (EShortcutModel *shortcut_model,
- gint group_num)
-{
- g_return_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < shortcut_model->groups->len);
-
- e_shortcut_model_free_group (shortcut_model, group_num);
- g_array_remove_index (shortcut_model->groups, group_num);
-}
-
-
-gint
-e_shortcut_model_add_item (EShortcutModel *shortcut_model,
- gint group_num,
- gint position,
- const gchar *item_url,
- const gchar *item_name)
-{
- EShortcutModelGroup *group;
-
- g_return_val_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model), -1);
- g_return_val_if_fail (group_num >= 0, -1);
- g_return_val_if_fail (group_num < shortcut_model->groups->len, -1);
- g_return_val_if_fail (item_url != NULL, -1);
- g_return_val_if_fail (item_name != NULL, -1);
-
- group = &g_array_index (shortcut_model->groups,
- EShortcutModelGroup, group_num);
-
- if (position == -1 || position > group->items->len)
- position = group->items->len;
-
- gtk_signal_emit (GTK_OBJECT (shortcut_model),
- e_shortcut_model_signals[ITEM_ADDED],
- group_num, position, item_url, item_name);
-
- return position;
-}
-
-
-static void
-e_shortcut_model_real_add_item (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num,
- const gchar *item_url,
- const gchar *item_name)
-{
- EShortcutModelGroup *group;
- EShortcutModelItem *item, tmp_item;
-
- g_return_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < shortcut_model->groups->len);
- g_return_if_fail (item_url != NULL);
- g_return_if_fail (item_name != NULL);
-
- group = &g_array_index (shortcut_model->groups,
- EShortcutModelGroup, group_num);
-
- g_return_if_fail (item_num >= 0);
- g_return_if_fail (item_num <= group->items->len);
-
- g_array_insert_val (group->items, item_num, tmp_item);
-
- item = &g_array_index (group->items,
- EShortcutModelItem, item_num);
-
- item->name = g_strdup (item_name);
- item->url = g_strdup (item_url);
-}
-
-
-void
-e_shortcut_model_remove_item (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num)
-{
- gtk_signal_emit (GTK_OBJECT (shortcut_model),
- e_shortcut_model_signals[ITEM_REMOVED],
- group_num, item_num);
-}
-
-
-static void
-e_shortcut_model_real_remove_item (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num)
-{
- EShortcutModelGroup *group;
- EShortcutModelItem *item;
-
- g_return_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model));
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < shortcut_model->groups->len);
-
- group = &g_array_index (shortcut_model->groups,
- EShortcutModelGroup, group_num);
-
- g_return_if_fail (item_num >= 0);
- g_return_if_fail (item_num < group->items->len);
-
- item = &g_array_index (group->items,
- EShortcutModelItem, item_num);
-
- g_free (item->name);
- g_free (item->url);
-
- g_array_remove_index (group->items, item_num);
-}
-
-
-static void
-e_shortcut_model_marshal1 (GtkObject *object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg *args)
-{
- void (*rfunc) (GtkObject*, gint, gpointer, gpointer);
- rfunc = (void (*) (GtkObject*, gint, gpointer, gpointer)) func;
- (*rfunc) (object, GTK_VALUE_INT (args[0]), GTK_VALUE_STRING (args[1]),
- func_data);
-}
-
-
-static void
-e_shortcut_model_marshal2 (GtkObject *object,
- GtkSignalFunc func,
- gpointer func_data,
- GtkArg *args)
-{
- void (*rfunc) (GtkObject*, gint, gint, gpointer, gpointer, gpointer);
- rfunc = (void (*) (GtkObject*, gint, gint, gpointer, gpointer,
- gpointer)) func;
- (*rfunc) (object, GTK_VALUE_INT (args[0]), GTK_VALUE_INT (args[1]),
- GTK_VALUE_STRING (args[2]), GTK_VALUE_STRING (args[3]),
- func_data);
-}
-
-
-gint
-e_shortcut_model_get_num_groups (EShortcutModel *shortcut_model)
-{
- g_return_val_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model), 0);
-
- return ESM_CLASS (shortcut_model)->get_num_groups (shortcut_model);
-}
-
-
-static gint
-e_shortcut_model_real_get_num_groups (EShortcutModel *shortcut_model)
-{
- return shortcut_model->groups->len;
-}
-
-
-gint
-e_shortcut_model_get_num_items (EShortcutModel *shortcut_model,
- gint group_num)
-{
- g_return_val_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model), 0);
-
- return ESM_CLASS (shortcut_model)->get_num_items (shortcut_model,
- group_num);
-}
-
-
-static gint
-e_shortcut_model_real_get_num_items (EShortcutModel *shortcut_model,
- gint group_num)
-{
- EShortcutModelGroup *group;
-
- g_return_val_if_fail (group_num >= 0, 0);
- g_return_val_if_fail (group_num < shortcut_model->groups->len, 0);
-
- group = &g_array_index (shortcut_model->groups,
- EShortcutModelGroup, group_num);
-
- return group->items->len;
-}
-
-
-gchar*
-e_shortcut_model_get_group_name (EShortcutModel *shortcut_model,
- gint group_num)
-{
- g_return_val_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model), NULL);
-
- return ESM_CLASS (shortcut_model)->get_group_name (shortcut_model,
- group_num);
-}
-
-
-static gchar*
-e_shortcut_model_real_get_group_name (EShortcutModel *shortcut_model,
- gint group_num)
-{
- EShortcutModelGroup *group;
-
- g_return_val_if_fail (group_num >= 0, NULL);
- g_return_val_if_fail (group_num < shortcut_model->groups->len, NULL);
-
- group = &g_array_index (shortcut_model->groups,
- EShortcutModelGroup, group_num);
-
- return g_strdup (group->name);
-}
-
-
-void
-e_shortcut_model_get_item_info (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num,
- gchar **item_url,
- gchar **item_name)
-{
- g_return_if_fail (E_IS_SHORTCUT_MODEL (shortcut_model));
-
- ESM_CLASS (shortcut_model)->get_item_info (shortcut_model,
- group_num, item_num,
- item_url, item_name);
-}
-
-
-static void
-e_shortcut_model_real_get_item_info (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num,
- gchar **item_url,
- gchar **item_name)
-{
- EShortcutModelGroup *group;
- EShortcutModelItem *item;
-
- g_return_if_fail (group_num >= 0);
- g_return_if_fail (group_num < shortcut_model->groups->len);
-
- group = &g_array_index (shortcut_model->groups,
- EShortcutModelGroup, group_num);
-
- g_return_if_fail (item_num >= 0);
- g_return_if_fail (item_num < group->items->len);
-
- item = &g_array_index (group->items,
- EShortcutModelItem, item_num);
-
- if (item_url)
- *item_url = g_strdup (item->url);
-
- if (item_name)
- *item_name = g_strdup (item->name);
-}
-
diff --git a/widgets/shortcut-bar/e-shortcut-model.h b/widgets/shortcut-bar/e-shortcut-model.h
deleted file mode 100644
index 402874ef09..0000000000
--- a/widgets/shortcut-bar/e-shortcut-model.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_SHORTCUT_MODEL_H_
-#define _E_SHORTCUT_MODEL_H_
-
-#include <gtk/gtkobject.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EShortcutModel keeps track of a number of groups of shortcuts.
- * Each shortcut has a URL and a short textual name.
- * It is used as the model of the EShortcutBar.
- */
-
-typedef struct _EShortcutModel EShortcutModel;
-typedef struct _EShortcutModelClass EShortcutModelClass;
-
-
-#define E_TYPE_SHORTCUT_MODEL (e_shortcut_model_get_type ())
-#define E_SHORTCUT_MODEL(obj) GTK_CHECK_CAST (obj, e_shortcut_model_get_type (), EShortcutModel)
-#define E_SHORTCUT_MODEL_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_shortcut_model_get_type (), EShortcutModelClass)
-#define E_IS_SHORTCUT_MODEL(obj) GTK_CHECK_TYPE (obj, e_shortcut_model_get_type ())
-
-
-struct _EShortcutModel
-{
- GtkObject object;
-
- /* This is a private array of EShortcutModelGroup elements. */
- GArray *groups;
-};
-
-struct _EShortcutModelClass
-{
- GtkObjectClass parent_class;
-
- /*
- * Signals - These act like virtual functions as well as notification
- * signals. The class function is run first and does the actual action.
- */
- void (*group_added) (EShortcutModel *shortcut_model,
- gint group_num,
- const gchar *group_name);
- void (*group_removed) (EShortcutModel *shortcut_model,
- gint group_num);
-
- void (*item_added) (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num,
- const gchar *item_url,
- const gchar *item_name);
- void (*item_removed) (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num);
-
- /*
- * Virtual methods.
- */
- gint (*get_num_groups) (EShortcutModel *shortcut_model);
- gint (*get_num_items) (EShortcutModel *shortcut_model,
- gint group_num);
- /* This returns a copy of the group name. */
- gchar* (*get_group_name) (EShortcutModel *shortcut_model,
- gint group_num);
- /* This returns a copy of the item url and name. */
- void (*get_item_info) (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num,
- gchar **item_url,
- gchar **item_name);
-};
-
-
-GtkType e_shortcut_model_get_type (void);
-EShortcutModel* e_shortcut_model_new (void);
-
-/* Adds a new group at the given position, or last if position is -1.
- It returns the index of the new group. */
-gint e_shortcut_model_add_group (EShortcutModel *shortcut_model,
- gint position,
- const gchar *group_name);
-void e_shortcut_model_remove_group (EShortcutModel *shortcut_model,
- gint group_num);
-
-/* Adds a new item to a group at the given position, or last if position is -1.
- It returns the index of the new item within the group. */
-gint e_shortcut_model_add_item (EShortcutModel *shortcut_model,
- gint group_num,
- gint position,
- const gchar *item_url,
- const gchar *item_name);
-
-void e_shortcut_model_remove_item (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num);
-
-gint e_shortcut_model_get_num_groups(EShortcutModel *shortcut_model);
-gint e_shortcut_model_get_num_items (EShortcutModel *shortcut_model,
- gint group_num);
-/* The group_name should be freed after use. */
-gchar* e_shortcut_model_get_group_name(EShortcutModel *shortcut_model,
- gint group_num);
-/* The item_url and item_name should be freed after use. */
-void e_shortcut_model_get_item_info (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num,
- gchar **item_url,
- gchar **item_name);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_SHORTCUT_MODEL_H_ */
diff --git a/widgets/shortcut-bar/e-vscrolled-bar.c b/widgets/shortcut-bar/e-vscrolled-bar.c
deleted file mode 100644
index decfffc3e4..0000000000
--- a/widgets/shortcut-bar/e-vscrolled-bar.c
+++ /dev/null
@@ -1,708 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * EVScrolledBar is like GtkScrolledWindow but only scrolls the child widget
- * vertically. It is intended for scrolling narrow vertical bars.
- */
-
-#include <config.h>
-#include <gtk/gtkarrow.h>
-#include <gtk/gtkbutton.h>
-#include <gtk/gtksignal.h>
-#include "e-vscrolled-bar.h"
-
-/* These are the offsets of the up & down buttons from the right and top/bottom
- of the widget. */
-#define E_VSCROLLED_BAR_BUTTON_X_OFFSET 2
-#define E_VSCROLLED_BAR_BUTTON_Y_OFFSET 2
-
-/* This is the time between scrolls. */
-#define E_VSCROLLED_BAR_SCROLL_TIMEOUT 20
-
-static void e_vscrolled_bar_class_init (EVScrolledBarClass *class);
-static void e_vscrolled_bar_init (EVScrolledBar *vscrolled_bar);
-static void e_vscrolled_bar_destroy (GtkObject *object);
-static void e_vscrolled_bar_finalize (GtkObject *object);
-static void e_vscrolled_bar_map (GtkWidget *widget);
-static void e_vscrolled_bar_unmap (GtkWidget *widget);
-static void e_vscrolled_bar_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void e_vscrolled_bar_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static void e_vscrolled_bar_draw (GtkWidget *widget,
- GdkRectangle *area);
-static gint e_vscrolled_bar_button_press (GtkWidget *widget,
- GdkEventButton *event);
-static void e_vscrolled_bar_add (GtkContainer *container,
- GtkWidget *child);
-static void e_vscrolled_bar_remove (GtkContainer *container,
- GtkWidget *child);
-static void e_vscrolled_bar_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data);
-static void e_vscrolled_bar_adjustment_changed (GtkAdjustment *adjustment,
- gpointer data);
-static void e_vscrolled_bar_button_pressed (GtkWidget *button,
- EVScrolledBar *vscrolled_bar);
-static void e_vscrolled_bar_button_released (GtkWidget *button,
- EVScrolledBar *vscrolled_bar);
-static void e_vscrolled_bar_button_clicked (GtkWidget *button,
- EVScrolledBar *vscrolled_bar);
-static gboolean e_vscrolled_bar_timeout_handler (gpointer data);
-
-
-static GtkBinClass *parent_class;
-
-
-GtkType
-e_vscrolled_bar_get_type (void)
-{
- static GtkType e_vscrolled_bar_type = 0;
-
- if (!e_vscrolled_bar_type) {
- GtkTypeInfo e_vscrolled_bar_info = {
- "EVScrolledBar",
- sizeof (EVScrolledBar),
- sizeof (EVScrolledBarClass),
- (GtkClassInitFunc) e_vscrolled_bar_class_init,
- (GtkObjectInitFunc) e_vscrolled_bar_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- parent_class = gtk_type_class (GTK_TYPE_BIN);
- e_vscrolled_bar_type = gtk_type_unique (GTK_TYPE_BIN,
- &e_vscrolled_bar_info);
- }
-
- return e_vscrolled_bar_type;
-}
-
-
-static void
-e_vscrolled_bar_class_init (EVScrolledBarClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GtkContainerClass *container_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
- container_class = (GtkContainerClass *) class;
-
- /* Method override */
- object_class->destroy = e_vscrolled_bar_destroy;
- object_class->finalize = e_vscrolled_bar_finalize;
-
- widget_class->map = e_vscrolled_bar_map;
- widget_class->unmap = e_vscrolled_bar_unmap;
- widget_class->size_request = e_vscrolled_bar_size_request;
- widget_class->size_allocate = e_vscrolled_bar_size_allocate;
- widget_class->draw = e_vscrolled_bar_draw;
- widget_class->button_press_event = e_vscrolled_bar_button_press;
-
- container_class->add = e_vscrolled_bar_add;
- container_class->remove = e_vscrolled_bar_remove;
- container_class->forall = e_vscrolled_bar_forall;
-}
-
-
-static void
-e_vscrolled_bar_init (EVScrolledBar *vscrolled_bar)
-{
- GtkWidget *arrow;
-
- GTK_WIDGET_SET_FLAGS (vscrolled_bar, GTK_NO_WINDOW);
-
- gtk_container_set_resize_mode (GTK_CONTAINER (vscrolled_bar),
- GTK_RESIZE_QUEUE);
-
- gtk_widget_push_composite_child ();
-
- vscrolled_bar->up_button = gtk_button_new ();
- gtk_widget_set_composite_name (vscrolled_bar->up_button,
- "up_button");
- gtk_widget_set_parent (vscrolled_bar->up_button,
- GTK_WIDGET (vscrolled_bar));
- arrow = gtk_arrow_new (GTK_ARROW_UP, GTK_SHADOW_OUT);
- gtk_misc_set_padding (GTK_MISC (arrow), 1, 1);
- gtk_widget_show (arrow);
- gtk_container_add (GTK_CONTAINER (vscrolled_bar->up_button), arrow);
- gtk_widget_show (vscrolled_bar->up_button);
- gtk_signal_connect_after (GTK_OBJECT (vscrolled_bar->up_button), "pressed", GTK_SIGNAL_FUNC (e_vscrolled_bar_button_pressed), vscrolled_bar);
- gtk_signal_connect_after (GTK_OBJECT (vscrolled_bar->up_button), "released", GTK_SIGNAL_FUNC (e_vscrolled_bar_button_released), vscrolled_bar);
- gtk_signal_connect (GTK_OBJECT (vscrolled_bar->up_button), "clicked", GTK_SIGNAL_FUNC (e_vscrolled_bar_button_clicked), vscrolled_bar);
-
- vscrolled_bar->down_button = gtk_button_new ();
- gtk_widget_set_composite_name (vscrolled_bar->up_button,
- "down_button");
- gtk_widget_set_parent (vscrolled_bar->down_button,
- GTK_WIDGET (vscrolled_bar));
- arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
- gtk_misc_set_padding (GTK_MISC (arrow), 1, 1);
- gtk_widget_show (arrow);
- gtk_container_add (GTK_CONTAINER (vscrolled_bar->down_button), arrow);
- gtk_widget_show (vscrolled_bar->down_button);
- gtk_signal_connect_after (GTK_OBJECT (vscrolled_bar->down_button), "pressed", GTK_SIGNAL_FUNC (e_vscrolled_bar_button_pressed), vscrolled_bar);
- gtk_signal_connect_after (GTK_OBJECT (vscrolled_bar->down_button), "released", GTK_SIGNAL_FUNC (e_vscrolled_bar_button_released), vscrolled_bar);
- gtk_signal_connect (GTK_OBJECT (vscrolled_bar->down_button), "clicked", GTK_SIGNAL_FUNC (e_vscrolled_bar_button_clicked), vscrolled_bar);
-
- gtk_widget_pop_composite_child ();
-
- vscrolled_bar->adjustment = NULL;
- vscrolled_bar->timeout_id = 0;
- vscrolled_bar->scrolling_up = FALSE;
- vscrolled_bar->min_distance = -1.0;
- vscrolled_bar->button_pressed = FALSE;
-}
-
-
-/**
- * e_vscrolled_bar_new:
- *
- * @adjustment: The #GtkAdjustment to use for scrolling, or NULL.
- * @Return: A new #EVScrolledBar.
- *
- * Creates a new #EVScrolledBar with the given adjustment.
- **/
-GtkWidget *
-e_vscrolled_bar_new (GtkAdjustment *adjustment)
-{
- GtkWidget *vscrolled_bar;
-
- vscrolled_bar = GTK_WIDGET (gtk_type_new (e_vscrolled_bar_get_type ()));
- e_vscrolled_bar_set_adjustment (E_VSCROLLED_BAR (vscrolled_bar),
- adjustment);
-
- return vscrolled_bar;
-}
-
-
-static void
-e_vscrolled_bar_destroy (GtkObject *object)
-{
- EVScrolledBar *vscrolled_bar;
-
- vscrolled_bar = E_VSCROLLED_BAR (object);
-
- if (vscrolled_bar->timeout_id) {
- g_source_remove (vscrolled_bar->timeout_id);
- vscrolled_bar->timeout_id = 0;
- }
-
- gtk_widget_unparent (vscrolled_bar->up_button);
- gtk_widget_unparent (vscrolled_bar->down_button);
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-
-static void
-e_vscrolled_bar_finalize (GtkObject *object)
-{
- EVScrolledBar *vscrolled_bar;
-
- vscrolled_bar = E_VSCROLLED_BAR (object);
-
- gtk_object_unref (GTK_OBJECT (vscrolled_bar->adjustment));
-
- GTK_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-static void
-e_vscrolled_bar_map (GtkWidget *widget)
-{
- EVScrolledBar *vscrolled_bar;
- GtkAdjustment *adjustment;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_VSCROLLED_BAR (widget));
-
- vscrolled_bar = E_VSCROLLED_BAR (widget);
-
- /* chain parent class handler to map self and child */
- GTK_WIDGET_CLASS (parent_class)->map (widget);
-
- adjustment = vscrolled_bar->adjustment;
-
- if (GTK_WIDGET_VISIBLE (vscrolled_bar->up_button)
- && adjustment->value != adjustment->lower
- && !GTK_WIDGET_MAPPED (vscrolled_bar->up_button))
- gtk_widget_map (vscrolled_bar->up_button);
-
- if (GTK_WIDGET_VISIBLE (vscrolled_bar->down_button)
- && adjustment->value < adjustment->upper - adjustment->page_size
- && !GTK_WIDGET_MAPPED (vscrolled_bar->down_button))
- gtk_widget_map (vscrolled_bar->down_button);
-}
-
-
-static void
-e_vscrolled_bar_unmap (GtkWidget *widget)
-{
- EVScrolledBar *vscrolled_bar;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_VSCROLLED_BAR (widget));
-
- vscrolled_bar = E_VSCROLLED_BAR (widget);
-
- /* chain parent class handler to unmap self and child */
- GTK_WIDGET_CLASS (parent_class)->unmap (widget);
-
- if (GTK_WIDGET_MAPPED (vscrolled_bar->up_button))
- gtk_widget_unmap (vscrolled_bar->up_button);
-
- if (GTK_WIDGET_MAPPED (vscrolled_bar->down_button))
- gtk_widget_unmap (vscrolled_bar->down_button);
-}
-
-
-static void
-e_vscrolled_bar_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- EVScrolledBar *vscrolled_bar;
- GtkBin *bin;
- GtkRequisition child_requisition;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_VSCROLLED_BAR (widget));
- g_return_if_fail (requisition != NULL);
-
- vscrolled_bar = E_VSCROLLED_BAR (widget);
- bin = GTK_BIN (widget);
-
- requisition->width = 0;
- requisition->height = 0;
-
- /* We just return the requisition of the child widget, plus the
- border width. */
- if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) {
- gtk_widget_size_request (bin->child, &child_requisition);
- *requisition = child_requisition;
- }
-
- /* We remember the requested heights of the up & down buttons. */
- gtk_widget_size_request (vscrolled_bar->up_button,
- &child_requisition);
- vscrolled_bar->up_button_width = child_requisition.width;
- vscrolled_bar->up_button_height = child_requisition.height;
-
- gtk_widget_size_request (vscrolled_bar->down_button,
- &child_requisition);
- vscrolled_bar->down_button_width = child_requisition.width;
- vscrolled_bar->down_button_height = child_requisition.height;
-
- /* Add on the standard container border widths. */
- requisition->width += GTK_CONTAINER (widget)->border_width * 2;
- requisition->height += GTK_CONTAINER (widget)->border_width * 2;
-}
-
-
-static void
-e_vscrolled_bar_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- EVScrolledBar *vscrolled_bar;
- GtkBin *bin;
- GtkAllocation button_allocation, child_allocation;
- gint border_width;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_VSCROLLED_BAR (widget));
- g_return_if_fail (allocation != NULL);
-
- vscrolled_bar = E_VSCROLLED_BAR (widget);
- bin = GTK_BIN (widget);
-
- widget->allocation = *allocation;
-
- border_width = GTK_CONTAINER (widget)->border_width;
-
- child_allocation.x = border_width;
- child_allocation.y = border_width;
- child_allocation.width = allocation->width - 2 * border_width;
- child_allocation.height = allocation->height - 2 * border_width;
- gtk_widget_size_allocate (bin->child, &child_allocation);
-
- button_allocation.x = allocation->width - border_width
- - vscrolled_bar->up_button_width
- - E_VSCROLLED_BAR_BUTTON_X_OFFSET;
- button_allocation.y = border_width + E_VSCROLLED_BAR_BUTTON_Y_OFFSET;
- button_allocation.width = vscrolled_bar->up_button_width;
- button_allocation.height = vscrolled_bar->up_button_height;
- gtk_widget_size_allocate (vscrolled_bar->up_button,
- &button_allocation);
-
- button_allocation.x = allocation->width - border_width
- - vscrolled_bar->down_button_width
- - E_VSCROLLED_BAR_BUTTON_X_OFFSET;
- button_allocation.y = allocation->height - border_width
- - vscrolled_bar->down_button_height
- - E_VSCROLLED_BAR_BUTTON_Y_OFFSET;
- button_allocation.width = vscrolled_bar->down_button_width;
- button_allocation.height = vscrolled_bar->down_button_height;
- gtk_widget_size_allocate (vscrolled_bar->down_button,
- &button_allocation);
-}
-
-
-static void
-e_vscrolled_bar_draw (GtkWidget *widget,
- GdkRectangle *area)
-{
- EVScrolledBar *vscrolled_bar;
- GtkBin *bin;
- GdkRectangle child_area;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (E_IS_VSCROLLED_BAR (widget));
- g_return_if_fail (area != NULL);
-
- vscrolled_bar = E_VSCROLLED_BAR (widget);
- bin = GTK_BIN (widget);
-
- if (bin->child && GTK_WIDGET_VISIBLE (bin->child) &&
- gtk_widget_intersect (bin->child, area, &child_area))
- gtk_widget_draw (bin->child, &child_area);
-
- if (GTK_WIDGET_DRAWABLE (vscrolled_bar->up_button) &&
- gtk_widget_intersect (vscrolled_bar->up_button, area, &child_area))
- gtk_widget_draw (vscrolled_bar->up_button, &child_area);
-
- if (GTK_WIDGET_DRAWABLE (vscrolled_bar->down_button) &&
- gtk_widget_intersect (vscrolled_bar->down_button, area, &child_area))
- gtk_widget_draw (vscrolled_bar->down_button, &child_area);
-}
-
-
-static gint
-e_vscrolled_bar_button_press (GtkWidget *widget,
- GdkEventButton *event)
-{
- EVScrolledBar *vscrolled_bar;
- GtkAdjustment *adjustment;
- gfloat new_value, step;
-
- vscrolled_bar = E_VSCROLLED_BAR (widget);
- adjustment = vscrolled_bar->adjustment;
-
- step = adjustment->page_size;
-
- if (event->button == 4) {
- new_value = adjustment->value - step;
- if (new_value <= adjustment->lower) {
- new_value = adjustment->lower;
- }
- } else if (event->button == 5) {
- new_value = adjustment->value + step;
- if (new_value >= adjustment->upper - adjustment->page_size) {
- new_value = adjustment->upper - adjustment->page_size;
- }
- } else
- return FALSE;
-
- if (adjustment->value != new_value) {
- adjustment->value = new_value;
- gtk_signal_emit_by_name (GTK_OBJECT (adjustment),
- "value_changed");
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-static void
-e_vscrolled_bar_add (GtkContainer *container,
- GtkWidget *child)
-{
- EVScrolledBar *vscrolled_bar;
- GtkBin *bin;
-
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_VSCROLLED_BAR (container));
-
- vscrolled_bar = E_VSCROLLED_BAR (container);
- bin = GTK_BIN (container);
-
- g_return_if_fail (bin->child == NULL);
-
- bin->child = child;
- gtk_widget_set_parent (child, GTK_WIDGET (bin));
-
- gtk_widget_set_scroll_adjustments (child, NULL,
- vscrolled_bar->adjustment);
-
- if (GTK_WIDGET_REALIZED (child->parent))
- gtk_widget_realize (child);
-
- if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child)) {
- if (GTK_WIDGET_MAPPED (child->parent))
- gtk_widget_map (child);
-
- gtk_widget_queue_resize (child);
- }
-}
-
-
-static void
-e_vscrolled_bar_remove (GtkContainer *container,
- GtkWidget *child)
-{
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_VSCROLLED_BAR (container));
- g_return_if_fail (child != NULL);
- g_return_if_fail (GTK_BIN (container)->child == child);
-
- gtk_widget_set_scroll_adjustments (child, NULL, NULL);
-
- /* chain parent class handler to remove child */
- GTK_CONTAINER_CLASS (parent_class)->remove (container, child);
-}
-
-
-static void
-e_vscrolled_bar_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data)
-{
- g_return_if_fail (container != NULL);
- g_return_if_fail (E_IS_VSCROLLED_BAR (container));
- g_return_if_fail (callback != NULL);
-
- GTK_CONTAINER_CLASS (parent_class)->forall (container,
- include_internals,
- callback,
- callback_data);
- if (include_internals) {
- EVScrolledBar *vscrolled_bar;
-
- vscrolled_bar = E_VSCROLLED_BAR (container);
-
- if (vscrolled_bar->up_button)
- callback (vscrolled_bar->up_button, callback_data);
- if (vscrolled_bar->down_button)
- callback (vscrolled_bar->down_button, callback_data);
- }
-}
-
-
-/**
- * e_vscrolled_bar_get_adjustment:
- *
- * @vscrolled_bar: An #EVScrolledBar.
- * @Return: The #GtkAdjustment used for scrolling @vscrolled_bar.
- *
- * Returns the #GtkAdjustment used for scrolling the #EVscrolledBar.
- **/
-GtkAdjustment*
-e_vscrolled_bar_get_adjustment (EVScrolledBar *vscrolled_bar)
-{
- g_return_val_if_fail (vscrolled_bar != NULL, NULL);
- g_return_val_if_fail (E_IS_VSCROLLED_BAR (vscrolled_bar), NULL);
-
- return vscrolled_bar->adjustment;
-}
-
-
-/**
- * e_vscrolled_bar_set_adjustment:
- *
- * @vscrolled_bar: An #EVScrolledBar.
- * @adjustment: The #GtkAdjustment to use for scrolling @vscrolled_bar.
- *
- * Sets the #GtkAdjustment to use for scrolling the #EVscrolledBar.
- **/
-void
-e_vscrolled_bar_set_adjustment (EVScrolledBar *vscrolled_bar,
- GtkAdjustment *adjustment)
-{
- g_return_if_fail (vscrolled_bar != NULL);
- g_return_if_fail (E_IS_VSCROLLED_BAR (vscrolled_bar));
-
- if (adjustment)
- g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
- else
- adjustment = (GtkAdjustment*) gtk_object_new (GTK_TYPE_ADJUSTMENT, NULL);
-
- if (vscrolled_bar->adjustment == adjustment)
- return;
-
- if (vscrolled_bar->adjustment) {
- gtk_signal_disconnect_by_func (GTK_OBJECT (vscrolled_bar->adjustment),
- GTK_SIGNAL_FUNC (e_vscrolled_bar_adjustment_changed),
- vscrolled_bar);
- gtk_object_unref (GTK_OBJECT (vscrolled_bar->adjustment));
- }
-
- vscrolled_bar->adjustment = adjustment;
- gtk_object_ref (GTK_OBJECT (vscrolled_bar->adjustment));
- gtk_object_sink (GTK_OBJECT (vscrolled_bar->adjustment));
-
- /* I've used connect_after here to avoid a problem when using a
- GnomeCanvas as the child widget. When just using connect it would
- leave a blank space when one of the buttons is hidden. We want
- the GtkLayout to handle the scrolling before we hide any buttons. */
- gtk_signal_connect_after (GTK_OBJECT (adjustment), "changed",
- GTK_SIGNAL_FUNC (e_vscrolled_bar_adjustment_changed),
- vscrolled_bar);
- gtk_signal_connect_after (GTK_OBJECT (adjustment), "value_changed",
- GTK_SIGNAL_FUNC (e_vscrolled_bar_adjustment_changed),
- vscrolled_bar);
-
- e_vscrolled_bar_adjustment_changed (adjustment, vscrolled_bar);
-
- if (GTK_BIN (vscrolled_bar)->child)
- gtk_widget_set_scroll_adjustments (GTK_BIN (vscrolled_bar)->child, NULL, adjustment);
-}
-
-
-static void
-e_vscrolled_bar_adjustment_changed (GtkAdjustment *adjustment,
- gpointer data)
-{
- EVScrolledBar *vscrolled_bar;
-
- g_return_if_fail (adjustment != NULL);
- g_return_if_fail (data != NULL);
-#if 0
- g_print ("Adjustment changed to: %g\n", adjustment->value);
-#endif
- vscrolled_bar = E_VSCROLLED_BAR (data);
-
- if (!GTK_WIDGET_MAPPED (vscrolled_bar))
- return;
-
- /* If the adjustment value is not 0, show the up button. */
- if (adjustment->value != adjustment->lower) {
- gtk_widget_map (vscrolled_bar->up_button);
- gdk_window_raise (vscrolled_bar->up_button->window);
- } else {
- gtk_widget_unmap (vscrolled_bar->up_button);
- }
-
- /* If the adjustment value is less than the maximum value, show the
- down button. */
- if (adjustment->value < adjustment->upper - adjustment->page_size) {
- gtk_widget_map (vscrolled_bar->down_button);
- gdk_window_raise (vscrolled_bar->down_button->window);
- } else {
- gtk_widget_unmap (vscrolled_bar->down_button);
- }
-}
-
-
-static void
-e_vscrolled_bar_button_pressed (GtkWidget *button,
- EVScrolledBar *vscrolled_bar)
-{
- if (vscrolled_bar->timeout_id != 0)
- g_source_remove (vscrolled_bar->timeout_id);
-
- vscrolled_bar->timeout_id = g_timeout_add (E_VSCROLLED_BAR_SCROLL_TIMEOUT, e_vscrolled_bar_timeout_handler, vscrolled_bar);
- vscrolled_bar->scrolling_up = (button == vscrolled_bar->up_button) ? TRUE : FALSE;
- vscrolled_bar->min_distance = vscrolled_bar->adjustment->page_size / 4;
- vscrolled_bar->button_pressed = TRUE;
-
- e_vscrolled_bar_timeout_handler (vscrolled_bar);
-}
-
-
-static void
-e_vscrolled_bar_button_released (GtkWidget *button,
- EVScrolledBar *vscrolled_bar)
-{
- vscrolled_bar->button_pressed = FALSE;
-}
-
-
-/* This will be called when the user hits the space key to activate the button.
- It will also be called just before button_released() is called, but since
- we already handle that we simply return if the button is pressed. */
-static void
-e_vscrolled_bar_button_clicked (GtkWidget *button,
- EVScrolledBar *vscrolled_bar)
-{
- if (vscrolled_bar->button_pressed)
- return;
-
- /* We act as if the button is pressed and released immediately. */
- e_vscrolled_bar_button_pressed (button, vscrolled_bar);
- vscrolled_bar->button_pressed = FALSE;
-}
-
-
-static gboolean
-e_vscrolled_bar_timeout_handler (gpointer data)
-{
- EVScrolledBar *vscrolled_bar;
- GtkAdjustment *adjustment;
- gfloat new_value;
- gboolean retval = TRUE;
-
- vscrolled_bar = E_VSCROLLED_BAR (data);
- adjustment = vscrolled_bar->adjustment;
-
- GDK_THREADS_ENTER ();
-
- /* Check if the user has released the button and we have already
- scrolled the minimum distance. */
- if (vscrolled_bar->button_pressed == FALSE
- && vscrolled_bar->min_distance <= 0) {
- GDK_THREADS_LEAVE ();
- return FALSE;
- }
-
- vscrolled_bar->min_distance -= adjustment->step_increment;
-
- if (vscrolled_bar->scrolling_up) {
- new_value = adjustment->value - adjustment->step_increment;
- if (new_value <= adjustment->lower) {
- new_value = adjustment->lower;
- retval = FALSE;
- }
- } else {
- new_value = adjustment->value + adjustment->step_increment;
- if (new_value >= adjustment->upper - adjustment->page_size) {
- new_value = adjustment->upper - adjustment->page_size;
- retval = FALSE;
- }
- }
-
- if (adjustment->value != new_value) {
- adjustment->value = new_value;
- gtk_signal_emit_by_name (GTK_OBJECT (adjustment),
- "value_changed");
- }
-
- GDK_THREADS_LEAVE ();
- return retval;
-}
diff --git a/widgets/shortcut-bar/e-vscrolled-bar.h b/widgets/shortcut-bar/e-vscrolled-bar.h
deleted file mode 100644
index 0f4c8bfcec..0000000000
--- a/widgets/shortcut-bar/e-vscrolled-bar.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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_VSCROLLED_BAR_H_
-#define _E_VSCROLLED_BAR_H_
-
-#include <gtk/gtkbin.h>
-#include <gtk/gtkadjustment.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EVScrolledBar is like GtkScrolledWindow but only scrolls the child widget
- * vertically. It is intended for scrolling narrow vertical bars.
- */
-
-
-#define E_VSCROLLED_BAR(obj) GTK_CHECK_CAST (obj, e_vscrolled_bar_get_type (), EVScrolledBar)
-#define E_VSCROLLED_BAR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_vscrolled_bar_get_type (), EVScrolledBarClass)
-#define E_IS_VSCROLLED_BAR(obj) GTK_CHECK_TYPE (obj, e_vscrolled_bar_get_type ())
-
-
-typedef struct _EVScrolledBar EVScrolledBar;
-typedef struct _EVScrolledBarClass EVScrolledBarClass;
-
-struct _EVScrolledBar
-{
- GtkBin bin;
-
- GtkWidget *up_button;
- GtkWidget *down_button;
-
- GtkAdjustment *adjustment;
-
- gint up_button_width;
- gint up_button_height;
- gint down_button_width;
- gint down_button_height;
-
- /* The GTK+ event source ID of our timeout handler. */
- gint timeout_id;
-
- /* TRUE if we are scrolling up, FALSE if scrolling down. */
- gboolean scrolling_up;
-
- /* The minimum distance left to scroll. If the user just clicks a
- button we scroll a minimum amount. This is reduced after each
- scroll. */
- gfloat min_distance;
-
- /* TRUE if the button is still pressed. When the up/down button is
- released, this gets set to FALSE, and we scroll until the minimum
- distance falls below 0. */
- gboolean button_pressed;
-};
-
-struct _EVScrolledBarClass
-{
- GtkBinClass parent_class;
-};
-
-
-GtkType e_vscrolled_bar_get_type (void);
-GtkWidget* e_vscrolled_bar_new (GtkAdjustment *adjustment);
-
-GtkAdjustment* e_vscrolled_bar_get_adjustment (EVScrolledBar *vscrolled_bar);
-void e_vscrolled_bar_set_adjustment (EVScrolledBar *vscrolled_bar,
- GtkAdjustment *adjustment);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_VSCROLLED_BAR_H_ */
diff --git a/widgets/shortcut-bar/test-shortcut-bar.c b/widgets/shortcut-bar/test-shortcut-bar.c
deleted file mode 100644
index 9197fdf16e..0000000000
--- a/widgets/shortcut-bar/test-shortcut-bar.c
+++ /dev/null
@@ -1,606 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@helixcode.com>
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * 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
- */
-
-/*
- * This tests the ShortcutBar widget.
- */
-
-#include <gnome.h>
-
-#include "e-shortcut-bar.h"
-
-#include <widgets/e-paned/e-hpaned.h>
-
-#define NUM_SHORTCUT_TYPES 5
-gchar *shortcut_types[NUM_SHORTCUT_TYPES] = {
- "folder:", "file:", "calendar:", "todo:", "contacts:"
-};
-gchar *icon_filenames[NUM_SHORTCUT_TYPES] = {
- "gnome-balsa2.png", "gnome-folder.png", "gnome-calendar.png",
- "gnome-cromagnon.png", "gnome-ccthemes.png"
-};
-GdkPixbuf *icon_pixbufs[NUM_SHORTCUT_TYPES];
-
-GtkWidget *main_label;
-
-static GdkPixbuf *icon_callback (EShortcutBar *shortcut_bar,
- const gchar *url,
- gpointer data);
-
-static void on_main_label_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation,
- gpointer data);
-static void quit (GtkWidget *window, GdkEvent *event, gpointer data);
-static void add_test_groups (EShortcutBar *shortcut_bar);
-static void add_test_group (EShortcutBar *shortcut_bar, gint i,
- gchar *group_name);
-static gint get_random_int (gint max);
-
-static void on_shortcut_bar_item_selected (EShortcutBar *shortcut_bar,
- GdkEvent *event,
- gint group_num,
- gint item_num);
-static void show_standard_popup (EShortcutBar *shortcut_bar,
- GdkEvent *event,
- gint group_num);
-static void show_context_popup (EShortcutBar *shortcut_bar,
- GdkEvent *event,
- gint group_num,
- gint item_num);
-
-static void set_large_icons (GtkWidget *menuitem,
- EShortcutBar *shortcut_bar);
-static void set_small_icons (GtkWidget *menuitem,
- EShortcutBar *shortcut_bar);
-static void remove_group (GtkWidget *menuitem,
- EShortcutBar *shortcut_bar);
-
-static void rename_item (GtkWidget *menuitem,
- EShortcutBar *shortcut_bar);
-static void remove_item (GtkWidget *menuitem,
- EShortcutBar *shortcut_bar);
-static void on_set_group_button_clicked (GtkWidget *button,
- EShortcutBar *shortcut_bar);
-static void on_set_group_button_no_animation_clicked (GtkWidget *button,
- EShortcutBar *shortcut_bar);
-static void on_item_added (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num);
-static void on_item_removed (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num);
-static void on_group_added (EShortcutModel *shortcut_model,
- gint group_num);
-static void on_group_removed (EShortcutModel *shortcut_model,
- gint group_num);
-
-int
-main (int argc, char *argv[])
-{
- GtkWidget *window, *hpaned, *shortcut_bar, *vbox, *button;
- EShortcutModel *shortcut_model;
- gchar *pathname;
- gint i;
-
- gnome_init ("test-shortcut-bar", "0.1", argc, argv);
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- window = gnome_app_new ("TestShortcutBar", "TestShortCutBar");
- gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
- gtk_window_set_policy (GTK_WINDOW (window), FALSE, TRUE, FALSE);
-
- gtk_signal_connect (GTK_OBJECT (window), "delete-event",
- GTK_SIGNAL_FUNC (quit), NULL);
-
- hpaned = e_hpaned_new ();
- gnome_app_set_contents (GNOME_APP (window), hpaned);
- gtk_widget_show (hpaned);
-
- shortcut_model = e_shortcut_model_new ();
-
- shortcut_bar = e_shortcut_bar_new ();
- e_shortcut_bar_set_model (E_SHORTCUT_BAR (shortcut_bar),
- shortcut_model);
- e_paned_pack1 (E_PANED (hpaned), shortcut_bar, FALSE, TRUE);
- gtk_widget_show (shortcut_bar);
- e_shortcut_bar_set_icon_callback (E_SHORTCUT_BAR (shortcut_bar),
- icon_callback,
- NULL);
-
- gtk_signal_connect (GTK_OBJECT (shortcut_model), "item_added",
- GTK_SIGNAL_FUNC (on_item_added), NULL);
- gtk_signal_connect (GTK_OBJECT (shortcut_model), "item_removed",
- GTK_SIGNAL_FUNC (on_item_removed), NULL);
- gtk_signal_connect (GTK_OBJECT (shortcut_model), "group_added",
- GTK_SIGNAL_FUNC (on_group_added), NULL);
- gtk_signal_connect (GTK_OBJECT (shortcut_model), "group_removed",
- GTK_SIGNAL_FUNC (on_group_removed), NULL);
-
-#if 0
- gtk_container_set_border_width (GTK_CONTAINER (shortcut_bar), 4);
-#endif
-
- e_paned_set_position (E_PANED (hpaned), 100);
- /*e_paned_set_gutter_size (E_PANED (hpaned), 12);*/
-
- vbox = gtk_vbox_new (FALSE, 0);
- e_paned_pack2 (E_PANED (hpaned), vbox, TRUE, TRUE);
- gtk_widget_show (vbox);
-
-
- main_label = gtk_label_new ("Main Application Window Goes Here");
- gtk_box_pack_start (GTK_BOX (vbox), main_label, TRUE, TRUE, 0);
- gtk_widget_show (main_label);
- gtk_signal_connect (GTK_OBJECT (main_label), "size_allocate",
- GTK_SIGNAL_FUNC (on_main_label_size_allocate),
- NULL);
-
- button = gtk_button_new_with_label ("Set current group to 3rd");
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
- gtk_widget_show (button);
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (on_set_group_button_clicked),
- shortcut_bar);
-
- button = gtk_button_new_with_label ("Set current group to 5th (no animation)");
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
- gtk_widget_show (button);
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (on_set_group_button_no_animation_clicked),
- shortcut_bar);
-
-
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
-
- /* Load our default icons. */
- for (i = 0; i < NUM_SHORTCUT_TYPES; i++) {
- pathname = gnome_pixmap_file (icon_filenames[i]);
- if (pathname)
- icon_pixbufs[i] = gdk_pixbuf_new_from_file (pathname);
- else
- icon_pixbufs[i] = NULL;
- }
-
- add_test_groups (E_SHORTCUT_BAR (shortcut_bar));
-
- gtk_signal_connect (GTK_OBJECT (shortcut_bar), "item_selected",
- GTK_SIGNAL_FUNC (on_shortcut_bar_item_selected),
- NULL);
-
- gtk_widget_show (window);
- gtk_main ();
- return 0;
-}
-
-
-static GdkPixbuf*
-icon_callback (EShortcutBar *shortcut_bar,
- const gchar *url,
- gpointer data)
-{
- gint i;
-
- for (i = 0; i < NUM_SHORTCUT_TYPES; i++) {
- if (!strncmp (url, shortcut_types[i],
- strlen (shortcut_types[i]))) {
- gdk_pixbuf_ref (icon_pixbufs[i]);
- return icon_pixbufs[i];
- }
- }
-
- return NULL;
-}
-
-static void
-on_main_label_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation,
- gpointer data)
-{
- g_print ("In on_main_label_size_allocate\n");
-}
-
-static void
-quit (GtkWidget *window, GdkEvent *event, gpointer data)
-{
- gtk_widget_destroy (window);
- gtk_exit (0);
-}
-
-
-static void
-add_test_groups (EShortcutBar *shortcut_bar)
-{
- add_test_group (shortcut_bar, 1, "Shortcuts");
- add_test_group (shortcut_bar, 2, "My Shortcuts");
- add_test_group (shortcut_bar, 3, "Longer Shortcuts");
- add_test_group (shortcut_bar, 4, "Very Long Shortcuts");
- add_test_group (shortcut_bar, 5, "Incredibly Long Shortcuts");
-}
-
-
-static void
-add_test_group (EShortcutBar *shortcut_bar, gint i, gchar *group_name)
-{
- gint group_num, item_num, num_items;
- gchar buffer[128];
- gint shortcut_type, j;
-
- group_num = e_shortcut_model_add_group (shortcut_bar->model, -1,
- group_name);
-
- if (group_num % 2)
- e_shortcut_bar_set_view_type (shortcut_bar, group_num,
- E_ICON_BAR_SMALL_ICONS);
-
- num_items = get_random_int (5) + 3;
- for (j = 1; j <= num_items; j++) {
- if (j == 1)
- sprintf (buffer, "A very long shortcut with proper words so I can test the wrapping and ellipsis behaviour");
- else if (j == 2)
- sprintf (buffer, "A very long shortcut with averylongworkinthemiddlesoIcantestthewrappingandellipsisbehaviour");
- else
- sprintf (buffer, "Item %i:%i\n", i, j);
-
- shortcut_type = get_random_int (NUM_SHORTCUT_TYPES);
- item_num = e_shortcut_model_add_item (shortcut_bar->model,
- group_num, -1,
- shortcut_types[shortcut_type],
- buffer);
- }
-}
-
-
-/* Returns a random integer between 0 and max - 1. */
-static gint
-get_random_int (gint max)
-{
- gint random_num;
-
- random_num = (int) (max * (rand () / (RAND_MAX + 1.0)));
-#if 0
- g_print ("Random num (%i): %i\n", max, random_num);
-#endif
- return random_num;
-}
-
-
-static void
-on_shortcut_bar_item_selected (EShortcutBar *shortcut_bar,
- GdkEvent *event, gint group_num, gint item_num)
-{
- gchar buffer[256];
-
- if (event->button.button == 1) {
- sprintf (buffer, "Item Selected - %i:%i",
- group_num + 1, item_num + 1);
- gtk_label_set_text (GTK_LABEL (main_label), buffer);
- } else if (event->button.button == 3) {
- if (item_num == -1)
- show_standard_popup (shortcut_bar, event, group_num);
- else
- show_context_popup (shortcut_bar, event, group_num,
- item_num);
- }
-}
-
-
-static void
-show_standard_popup (EShortcutBar *shortcut_bar,
- GdkEvent *event,
- gint group_num)
-{
- GtkWidget *menu, *menuitem;
-
- /* We don't have any commands if there aren't any groups yet. */
- if (group_num == -1)
- return;
-
- menu = gtk_menu_new ();
-
- menuitem = gtk_menu_item_new_with_label ("Large Icons");
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- GTK_SIGNAL_FUNC (set_large_icons), shortcut_bar);
-
- menuitem = gtk_menu_item_new_with_label ("Small Icons");
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- GTK_SIGNAL_FUNC (set_small_icons), shortcut_bar);
-
- menuitem = gtk_menu_item_new ();
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- menuitem = gtk_menu_item_new_with_label ("Add New Group");
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- menuitem = gtk_menu_item_new_with_label ("Remove Group");
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- GTK_SIGNAL_FUNC (remove_group), shortcut_bar);
-
- menuitem = gtk_menu_item_new_with_label ("Rename Group");
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- menuitem = gtk_menu_item_new ();
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- menuitem = gtk_menu_item_new_with_label ("Add Shortcut...");
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- menuitem = gtk_menu_item_new ();
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- menuitem = gtk_menu_item_new_with_label ("Hide Shortcut Bar");
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- /* Save the group num so we can get it in the callbacks. */
- gtk_object_set_data (GTK_OBJECT (menu), "group_num",
- GINT_TO_POINTER (group_num));
-
- /* FIXME: Destroy menu when finished with it somehow? */
- gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
- event->button.button, event->button.time);
-}
-
-
-static void
-set_large_icons (GtkWidget *menuitem,
- EShortcutBar *shortcut_bar)
-{
- GtkWidget *menu;
- gint group_num;
-
- menu = menuitem->parent;
- g_return_if_fail (GTK_IS_MENU (menu));
-
- group_num = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menu),
- "group_num"));
-
- e_shortcut_bar_set_view_type (shortcut_bar, group_num,
- E_ICON_BAR_LARGE_ICONS);
-}
-
-
-static void
-set_small_icons (GtkWidget *menuitem,
- EShortcutBar *shortcut_bar)
-{
- GtkWidget *menu;
- gint group_num;
-
- menu = menuitem->parent;
- g_return_if_fail (GTK_IS_MENU (menu));
-
- group_num = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menu),
- "group_num"));
-
- e_shortcut_bar_set_view_type (shortcut_bar, group_num,
- E_ICON_BAR_SMALL_ICONS);
-}
-
-
-static void
-remove_group (GtkWidget *menuitem,
- EShortcutBar *shortcut_bar)
-{
- GtkWidget *menu;
- gint group_num;
-
- menu = menuitem->parent;
- g_return_if_fail (GTK_IS_MENU (menu));
-
- group_num = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menu),
- "group_num"));
-
- e_shortcut_model_remove_group (shortcut_bar->model, group_num);
-}
-
-
-static void
-show_context_popup (EShortcutBar *shortcut_bar,
- GdkEvent *event,
- gint group_num,
- gint item_num)
-{
- GtkWidget *menu, *menuitem, *label, *pixmap;
-
- menu = gtk_menu_new ();
-
- menuitem = gtk_pixmap_menu_item_new ();
- label = gtk_label_new ("Open Folder");
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_widget_show (label);
- gtk_container_add (GTK_CONTAINER (menuitem), label);
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
- pixmap = gnome_stock_pixmap_widget (menu, GNOME_STOCK_MENU_OPEN);
- if (pixmap) {
- gtk_widget_show(pixmap);
- gtk_pixmap_menu_item_set_pixmap (GTK_PIXMAP_MENU_ITEM (menuitem), pixmap);
- }
-
- menuitem = gtk_menu_item_new_with_label ("Open in New Window");
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- menuitem = gtk_menu_item_new_with_label ("Advanced Find");
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- menuitem = gtk_menu_item_new ();
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- menuitem = gtk_menu_item_new_with_label ("Remove from Shortcut Bar");
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- GTK_SIGNAL_FUNC (remove_item), shortcut_bar);
-
- menuitem = gtk_menu_item_new_with_label ("Rename Shortcut");
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- GTK_SIGNAL_FUNC (rename_item), shortcut_bar);
-
- menuitem = gtk_menu_item_new ();
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
- menuitem = gtk_menu_item_new_with_label ("Properties");
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
- gtk_menu_append (GTK_MENU (menu), menuitem);
-
-
- /* Save the group & item nums so we can get them in the callbacks. */
- gtk_object_set_data (GTK_OBJECT (menu), "group_num",
- GINT_TO_POINTER (group_num));
- gtk_object_set_data (GTK_OBJECT (menu), "item_num",
- GINT_TO_POINTER (item_num));
-
- /* FIXME: Destroy menu when finished with it somehow? */
- gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
- event->button.button, event->button.time);
-}
-
-
-static void
-rename_item (GtkWidget *menuitem,
- EShortcutBar *shortcut_bar)
-{
- GtkWidget *menu;
- gint group_num, item_num;
-
- menu = menuitem->parent;
- g_return_if_fail (GTK_IS_MENU (menu));
-
- group_num = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menu),
- "group_num"));
- item_num = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menu),
- "item_num"));
-
- e_shortcut_bar_start_editing_item (shortcut_bar, group_num, item_num);
-}
-
-
-static void
-remove_item (GtkWidget *menuitem,
- EShortcutBar *shortcut_bar)
-{
- GtkWidget *menu;
- gint group_num, item_num;
-
- menu = menuitem->parent;
- g_return_if_fail (GTK_IS_MENU (menu));
-
- group_num = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menu),
- "group_num"));
- item_num = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menu),
- "item_num"));
-
- e_shortcut_model_remove_item (shortcut_bar->model, group_num,
- item_num);
-}
-
-
-static void
-on_set_group_button_clicked (GtkWidget *button,
- EShortcutBar *shortcut_bar)
-{
- g_print ("In on_set_group_button_clicked\n");
-
- e_group_bar_set_current_group_num (E_GROUP_BAR (shortcut_bar),
- 2, TRUE);
-}
-
-
-static void
-on_set_group_button_no_animation_clicked (GtkWidget *button,
- EShortcutBar *shortcut_bar)
-{
- g_print ("In on_set_group_button_no_animation_clicked\n");
-
- e_group_bar_set_current_group_num (E_GROUP_BAR (shortcut_bar),
- 4, FALSE);
-}
-
-
-static void
-on_item_added (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num)
-{
- g_print ("In on_item_added Group:%i Item:%i\n", group_num, item_num);
-}
-
-
-static void
-on_item_removed (EShortcutModel *shortcut_model,
- gint group_num,
- gint item_num)
-{
- g_print ("In on_item_removed Group:%i Item:%i\n", group_num, item_num);
-}
-
-
-static void
-on_group_added (EShortcutModel *shortcut_model,
- gint group_num)
-{
- g_print ("In on_group_added Group:%i\n", group_num);
-}
-
-
-static void
-on_group_removed (EShortcutModel *shortcut_model,
- gint group_num)
-{
- g_print ("In on_group_removed Group:%i\n", group_num);
-}
diff --git a/widgets/table/.cvsignore b/widgets/table/.cvsignore
deleted file mode 100644
index ecfa617948..0000000000
--- a/widgets/table/.cvsignore
+++ /dev/null
@@ -1,12 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-table-test
-table-example-1
-table-example-2
-table-size-test
-tree-example-1
diff --git a/widgets/table/add-col.xpm b/widgets/table/add-col.xpm
deleted file mode 100644
index 9c5f314c8e..0000000000
--- a/widgets/table/add-col.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * add_col_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" .............. ",
-" .++++++++++++. ",
-" .++++++++++++. ",
-" ....+++....... ",
-" .+. ",
-" . ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" "};
diff --git a/widgets/table/arrow-down.xpm b/widgets/table/arrow-down.xpm
deleted file mode 100644
index f1e6cb4b3c..0000000000
--- a/widgets/table/arrow-down.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * arrow_down_xpm[] = {
-"13 16 2 1",
-" c None",
-". c #FF0000",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-".............",
-" ........... ",
-" ......... ",
-" ....... ",
-" ..... ",
-" ... ",
-" . "};
diff --git a/widgets/table/arrow-up.xpm b/widgets/table/arrow-up.xpm
deleted file mode 100644
index 0cc5b9a00c..0000000000
--- a/widgets/table/arrow-up.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * arrow_up_xpm[] = {
-"13 16 2 1",
-" c None",
-". c #FF0000",
-" . ",
-" ... ",
-" ..... ",
-" ....... ",
-" ......... ",
-" ........... ",
-".............",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... "};
diff --git a/widgets/table/check-empty.xpm b/widgets/table/check-empty.xpm
deleted file mode 100644
index 746b20234e..0000000000
--- a/widgets/table/check-empty.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * check_empty_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #000000",
-" ",
-" ",
-" ............ ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" ............ ",
-" ",
-" "};
diff --git a/widgets/table/check-filled.xpm b/widgets/table/check-filled.xpm
deleted file mode 100644
index c0468fc25b..0000000000
--- a/widgets/table/check-filled.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * check_filled_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #000000",
-" ",
-" ",
-" ............ ",
-" . . ",
-" . . . ",
-" . .. . ",
-" . ... . ",
-" . . ... . ",
-" . .. ... . ",
-" . ..... . ",
-" . ... . ",
-" . . . ",
-" . . ",
-" ............ ",
-" ",
-" "};
diff --git a/widgets/table/clip.png b/widgets/table/clip.png
deleted file mode 100644
index 27aa5f072f..0000000000
--- a/widgets/table/clip.png
+++ /dev/null
Binary files differ
diff --git a/widgets/table/e-cell-checkbox.c b/widgets/table/e-cell-checkbox.c
deleted file mode 100644
index 1d7c319f74..0000000000
--- a/widgets/table/e-cell-checkbox.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * e-cell-checkbox.c: Checkbox cell renderer
- *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- *
- * (C) 1999 Helix Code, Inc
- */
-#include <config.h>
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomeui/gnome-canvas.h>
-#include "e-cell-checkbox.h"
-#include "e-util/e-util.h"
-#include "e-table-item.h"
-
-#include "check-empty.xpm"
-#include "check-filled.xpm"
-
-#define PARENT_TYPE e_cell_toggle_get_type ()
-
-static GdkPixbuf *checks [2];
-
-static void
-e_cell_checkbox_class_init (GtkObjectClass *object_class)
-{
- checks [0] = gdk_pixbuf_new_from_xpm_data (check_empty_xpm);
- checks [1] = gdk_pixbuf_new_from_xpm_data (check_filled_xpm);
-}
-
-E_MAKE_TYPE(e_cell_checkbox, "ECellCheckbox", ECellCheckbox, e_cell_checkbox_class_init, NULL, PARENT_TYPE);
-
-ECell *
-e_cell_checkbox_new (void)
-{
- ECellCheckbox *eccb = gtk_type_new (e_cell_checkbox_get_type ());
-
- e_cell_toggle_construct (E_CELL_TOGGLE (eccb), 2, 2, checks);
-
- return (ECell *) eccb;
-}
diff --git a/widgets/table/e-cell-checkbox.h b/widgets/table/e-cell-checkbox.h
deleted file mode 100644
index 969e4a5edc..0000000000
--- a/widgets/table/e-cell-checkbox.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef _E_CELL_CHECKBOX_H_
-#define _E_CELL_CHECKBOX_H_
-
-#include "e-cell-toggle.h"
-
-#define E_CELL_CHECKBOX_TYPE (e_cell_checkbox_get_type ())
-#define E_CELL_CHECKBOX(o) (GTK_CHECK_CAST ((o), E_CELL_CHECKBOX_TYPE, ECellCheckbox))
-#define E_CELL_CHECKBOX_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_CHECKBOX_TYPE, ECellCheckboxClass))
-#define E_IS_CELL_CHECKBOX(o) (GTK_CHECK_TYPE ((o), E_CELL_CHECKBOX_TYPE))
-#define E_IS_CELL_CHECKBOX_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_CHECKBOX_TYPE))
-
-typedef struct {
- ECellToggle parent;
-} ECellCheckbox;
-
-typedef struct {
- ECellToggleClass parent_class;
-} ECellCheckboxClass;
-
-GtkType e_cell_checkbox_get_type (void);
-ECell *e_cell_checkbox_new (void);
-
-#endif /* _E_CELL_CHECKBOX_H_ */
-
diff --git a/widgets/table/e-cell-string.c b/widgets/table/e-cell-string.c
deleted file mode 100644
index 992b1bd10e..0000000000
--- a/widgets/table/e-cell-string.c
+++ /dev/null
@@ -1,9 +0,0 @@
-ECell *
-e_cell_string_new (void)
-{
- ECell *ecell;
-
- ecell = gtk_type_new (ecell);
-
- return ecell;
-}
diff --git a/widgets/table/e-cell-text.c b/widgets/table/e-cell-text.c
deleted file mode 100644
index 279ef4975b..0000000000
--- a/widgets/table/e-cell-text.c
+++ /dev/null
@@ -1,2314 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-cell-text.c - Text cell renderer
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Authors: Miguel de Icaza <miguel@helixcode.com>
- * Chris Lahey <clahey@helixcode.com>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- *
- * TODO:
- * Clean up UTF-8 handling
- * UTF-8 selection
- */
-
-#include <config.h>
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkinvisible.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <stdio.h>
-#include <unicode.h>
-#include "e-cell-text.h"
-#include "e-util/e-util.h"
-#include "e-util/e-font.h"
-#include "e-table-item.h"
-#include "e-text-event-processor.h"
-#include "e-text-event-processor-emacs-like.h"
-
-#include <gdk/gdkx.h> /* for BlackPixel */
-#include <ctype.h>
-#include <math.h>
-
-/* This defines a line of text */
-struct line {
- char *text; /* Line's text UTF-8, it is a pointer into the text->text string */
- int length; /* Line's length in BYTES */
- int width; /* Line's width in pixels */
- int ellipsis_length; /* Length before adding ellipsis in BYTES */
-};
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_TEXT, /* UTF-8 */
- ARG_X,
- ARG_Y,
- ARG_FONT,
- ARG_FONTSET,
- ARG_FONT_GDK,
- ARG_ANCHOR,
- ARG_JUSTIFICATION,
- ARG_CLIP_WIDTH,
- ARG_CLIP_HEIGHT,
- ARG_CLIP,
- ARG_X_OFFSET,
- ARG_Y_OFFSET,
- ARG_FILL_COLOR,
- ARG_FILL_COLOR_GDK,
- ARG_FILL_COLOR_RGBA,
- ARG_FILL_STIPPLE,
- ARG_TEXT_WIDTH,
- ARG_TEXT_HEIGHT,
- ARG_USE_ELLIPSIS,
- ARG_ELLIPSIS,
- ARG_STRIKEOUT_COLUMN,
- ARG_BOLD_COLUMN,
- ARG_TEXT_FILTER,
- ARG_COLOR_COLUMN,
-};
-
-
-enum {
- E_SELECTION_PRIMARY,
- E_SELECTION_CLIPBOARD
-};
-
-static GdkAtom clipboard_atom = GDK_NONE;
-
-#define PARENT_TYPE e_cell_get_type ()
-
-#define TEXT_PAD 4
-
-typedef struct {
- gpointer lines; /* Text split into lines (private field) */
- int num_lines; /* Number of lines of text */
- int max_width;
- int ref_count;
-} ECellTextLineBreaks;
-
-
-typedef struct _CellEdit CellEdit;
-
-typedef struct {
- ECellView cell_view;
- GdkGC *gc;
-#if 0
- GdkFont *font;
-#else
- EFont *font;
-#endif
- GdkCursor *i_cursor;
- GdkBitmap *stipple; /* Stipple for text */
-
- GnomeCanvas *canvas;
-
- /*
- * During editing.
- */
- CellEdit *edit;
-
-
- int xofs, yofs; /* This gets added to the x
- and y for the cell text. */
- double ellipsis_width; /* The width of the ellipsis. */
-
-} ECellTextView;
-
-typedef struct _CurrentCell{
- ECellTextView *text_view;
- int width;
- char *text;
- int model_col, view_col, row;
- ECellTextLineBreaks *breaks;
-} CurrentCell;
-
-#define CURRENT_CELL(x) ((CurrentCell *)(x))
-
-struct _CellEdit {
- CurrentCell cell;
-
- char *old_text;
-
- /*
- * Where the editing is taking place
- */
-
- int xofs_edit, yofs_edit; /* Offset because of editing.
- This is negative compared
- to the other offsets. */
-
- /* This needs to be reworked a bit once we get line wrapping. */
- int selection_start; /* Start of selection - IN BYTES */
- int selection_end; /* End of selection - IN BYTES */
- gboolean select_by_word; /* Current selection is by word */
-
- /* This section is for drag scrolling and blinking cursor. */
- /* Cursor handling. */
- gint timeout_id; /* Current timeout id for scrolling */
- GTimer *timer; /* Timer for blinking cursor and scrolling */
-
- gint lastx, lasty; /* Last x and y motion events */
- gint last_state; /* Last state */
- gulong scroll_start; /* Starting time for scroll (microseconds) */
-
- gint show_cursor; /* Is cursor currently shown */
- gboolean button_down; /* Is mouse button 1 down */
-
- ETextEventProcessor *tep; /* Text Event Processor */
-
- /* Hmmm... this should probably be in native encoding? */
-
- GtkWidget *invisible; /* For selection handling */
- gboolean has_selection; /* TRUE if we have the selection */
- gchar *primary_selection; /* Primary selection text */
- gint primary_length; /* Primary selection text length in BYTES */
- gchar *clipboard_selection; /* Clipboard selection text */
- gint clipboard_length; /* Clipboard selection text length in BYTES */
-
- guint pointer_in : 1;
- guint default_cursor_shown : 1;
-};
-
-static void e_cell_text_view_command (ETextEventProcessor *tep, ETextEventProcessorCommand *command, gpointer data);
-
-static void e_cell_text_view_get_selection (CellEdit *edit, GdkAtom selection, guint32 time);
-static void e_cell_text_view_supply_selection (CellEdit *edit, guint time, GdkAtom selection, char *data, gint length);
-
-static GtkWidget *e_cell_text_view_get_invisible (CellEdit *edit);
-static void _selection_clear_event (GtkInvisible *invisible,
- GdkEventSelection *event,
- CellEdit *edit);
-static void _selection_get (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint info,
- guint time_stamp,
- CellEdit *edit);
-static void _selection_received (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint time,
- CellEdit *edit);
-static int number_of_lines (char *text);
-static void split_into_lines (CurrentCell *cell);
-static void unref_lines (CurrentCell *cell);
-static void calc_line_widths (CurrentCell *cell);
-static int get_line_ypos (CurrentCell *cell, struct line *line);
-static int get_line_xpos (CurrentCell *cell, struct line *line);
-static void _get_tep (CellEdit *edit);
-
-static gint _get_position_from_xy (CurrentCell *cell, gint x, gint y);
-static void _get_xy_from_position (CurrentCell *cell, gint position, gint *xp, gint *yp);
-static gboolean _blink_scroll_timeout (gpointer data);
-
-static void build_current_cell (CurrentCell *cell, ECellTextView *text_view, int model_col, int view_col, int row);
-static void unbuild_current_cell (CurrentCell *cell);
-static void calc_ellipsis (ECellTextView *text_view);
-static void ect_free_color (gchar *color_spec, GdkColor *color, GdkColormap *colormap);
-static GdkColor* e_cell_text_get_color (ECellTextView *cell_view, gchar *color_spec);
-
-static ECellClass *parent_class;
-
-static void
-ect_queue_redraw (ECellTextView *text_view, int view_col, int view_row)
-{
- e_table_item_redraw_range (
- text_view->cell_view.e_table_item_view,
- view_col, view_row, view_col, view_row);
-}
-
-/*
- * Accept the currently edited text. if it's the same as what's in the cell, do nothing.
- */
-static void
-ect_accept_edits (ECellTextView *text_view)
-{
- CurrentCell *cell = (CurrentCell *) text_view->edit;
-
- if (strcmp (text_view->edit->old_text, cell->text)) {
- e_table_model_set_value_at (text_view->cell_view.e_table_model,
- cell->model_col, cell->row, cell->text);
- }
-}
-
-/*
- * Shuts down the editing process
- */
-static void
-ect_stop_editing (ECellTextView *text_view)
-{
- CellEdit *edit = text_view->edit;
- int row, view_col;
-
- if (!edit)
- return;
-
- row = edit->cell.row;
- view_col = edit->cell.view_col;
-
- g_free (edit->old_text);
- edit->old_text = NULL;
- g_free (edit->cell.text);
- edit->cell.text = NULL;
- if (edit->invisible)
- gtk_widget_unref (edit->invisible);
- if (edit->tep)
- gtk_object_unref (GTK_OBJECT(edit->tep));
- if (edit->primary_selection)
- g_free (edit->primary_selection);
- if (edit->clipboard_selection)
- g_free (edit->clipboard_selection);
- if (! edit->default_cursor_shown){
- gdk_window_set_cursor (GTK_WIDGET(text_view->canvas)->window, NULL);
- edit->default_cursor_shown = TRUE;
- }
- if (edit->timeout_id) {
- g_source_remove (edit->timeout_id);
- edit->timeout_id = 0;
- }
- if (edit->timer) {
- g_timer_stop (edit->timer);
- g_timer_destroy (edit->timer);
- edit->timer = NULL;
- }
-
- g_free (edit);
-
- text_view->edit = NULL;
- ect_queue_redraw (text_view, view_col, row);
-}
-
-/*
- * Cancels the edits
- */
-static void
-ect_cancel_edit (ECellTextView *text_view)
-{
- ect_stop_editing (text_view);
-}
-
-/*
- * ECell::new_view method
- */
-static ECellView *
-ect_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
- ECellText *ect = E_CELL_TEXT (ecell);
- ECellTextView *text_view = g_new0 (ECellTextView, 1);
- GnomeCanvas *canvas = GNOME_CANVAS_ITEM (e_table_item_view)->canvas;
-
- text_view->cell_view.ecell = ecell;
- text_view->cell_view.e_table_model = table_model;
- text_view->cell_view.e_table_item_view = e_table_item_view;
-
- if (ect->font_name){
-#if 0
- GdkFont *f;
-
- f = gdk_fontset_load (ect->font_name);
- text_view->font = f;
-#endif
- text_view->font = e_font_from_gdk_name (ect->font_name);
- }
- if (!text_view->font){
- text_view->font = e_font_from_gdk_font (GTK_WIDGET (canvas)->style->font);
- }
-
- text_view->canvas = canvas;
-
- text_view->xofs = 0.0;
- text_view->yofs = 0.0;
-
- return (ECellView *)text_view;
-}
-
-/*
- * ECell::kill_view method
- */
-static void
-ect_kill_view (ECellView *ecv)
-{
- ECellTextView *text_view = (ECellTextView *) ecv;
-
- g_free (text_view);
-}
-
-/*
- * ECell::realize method
- */
-static void
-ect_realize (ECellView *ecell_view)
-{
- ECellTextView *text_view = (ECellTextView *) ecell_view;
-
- text_view->gc = gdk_gc_new (GTK_WIDGET (text_view->canvas)->window);
-
- text_view->i_cursor = gdk_cursor_new (GDK_XTERM);
-
- calc_ellipsis (text_view);
-
- if (parent_class->realize)
- (* parent_class->realize) (ecell_view);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-ect_unrealize (ECellView *ecv)
-{
- ECellTextView *text_view = (ECellTextView *) ecv;
- ECellText *ect = (ECellText*) ecv->ecell;
- GdkColormap *colormap;
-
- gdk_gc_unref (text_view->gc);
- text_view->gc = NULL;
-
- if (text_view->edit){
- ect_cancel_edit (text_view);
- }
-
- if (text_view->font)
- e_font_unref (text_view->font);
-
- if (text_view->stipple)
- gdk_bitmap_unref (text_view->stipple);
-
- gdk_cursor_destroy (text_view->i_cursor);
-
- if (ect->colors) {
- colormap = gtk_widget_get_colormap (GTK_WIDGET (text_view->canvas));
- g_hash_table_foreach (ect->colors, (GHFunc) ect_free_color,
- colormap);
- g_hash_table_destroy (ect->colors);
- ect->colors = NULL;
- }
-
- if (parent_class->unrealize)
- (* parent_class->unrealize) (ecv);
-}
-
-static void
-ect_free_color (gchar *color_spec, GdkColor *color, GdkColormap *colormap)
-{
-
- g_free (color_spec);
-
- /* This frees the color. Note we don't free it if it is the special
- value. */
- if (color != (GdkColor*) 1) {
- gdk_colors_free (colormap, &color->pixel, 1, 0);
-
- /* This frees the memory for the GdkColor. */
- gdk_color_free (color);
- }
-}
-
-/*
- * ECell::draw method
- */
-static void
-ect_draw (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row, gboolean selected,
- int x1, int y1, int x2, int y2)
-{
- /* New ECellText */
- ECellText *ect = E_CELL_TEXT (ecell_view->ecell);
- ECellTextView *text_view = (ECellTextView *) ecell_view;
- GtkWidget *canvas = GTK_WIDGET (text_view->canvas);
- GdkRectangle rect, *clip_rect;
- struct line *lines;
- int i;
- int xpos, ypos;
- int start_char, end_char;
- int sel_start, sel_end;
- GdkRectangle sel_rect;
- GdkGC *fg_gc;
- EFont *font = text_view->font;
- const int height = e_font_height (text_view->font);
- CellEdit *edit = text_view->edit;
- gboolean edit_display = FALSE;
- ECellTextLineBreaks *linebreaks;
- GdkColor *foreground, *cell_foreground, *cursor_color;
- gchar *color_spec;
-
- EFontStyle style = E_FONT_PLAIN;
-
- if (ect->bold_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->bold_column, row))
- style = E_FONT_BOLD;
-
- if (edit){
- if ((edit->cell.view_col == view_col) && (edit->cell.row == row)) {
- edit_display = TRUE;
- fg_gc = canvas->style->fg_gc[edit->has_selection ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE];
- } else
- fg_gc = canvas->style->fg_gc[GTK_STATE_ACTIVE];
- } else {
- fg_gc = canvas->style->fg_gc[GTK_STATE_ACTIVE];
- }
-
- /*
- * Be a nice citizen: clip to the region we are supposed to draw on
- */
- rect.x = x1;
- rect.y = y1;
- rect.width = x2 - x1;
- rect.height = y2 - y1;
-
- gdk_gc_set_clip_rectangle (text_view->gc, &rect);
- gdk_gc_set_clip_rectangle (fg_gc, &rect);
- clip_rect = &rect;
-
- if (selected){
- foreground = &canvas->style->text [GTK_STATE_SELECTED];
- } else {
- foreground = &canvas->style->text [GTK_STATE_NORMAL];
- }
-
- cursor_color = foreground;
-
- if (ect->color_column != -1) {
- color_spec = e_table_model_value_at (ecell_view->e_table_model,
- ect->color_column, row);
- cell_foreground = e_cell_text_get_color (text_view,
- color_spec);
- if (cell_foreground)
- foreground = cell_foreground;
- }
-
- gdk_gc_set_foreground (text_view->gc, foreground);
-
- x1 += 4;
- y1 += 1;
- x2 -= 4;
- y2 -= 1;
-
- rect.x = x1;
- rect.y = y1;
- rect.width = x2 - x1;
- rect.height = y2 - y1;
-
- gdk_gc_set_clip_rectangle (text_view->gc, &rect);
- gdk_gc_set_clip_rectangle (fg_gc, &rect);
- clip_rect = &rect;
-
- if (edit_display){
- CellEdit *edit = text_view->edit;
- CurrentCell *cell = CURRENT_CELL(edit);
-
- cell->width = x2 - x1;
-
- split_into_lines (cell);
-
- linebreaks = cell->breaks;
-
- lines = linebreaks->lines;
- ypos = get_line_ypos (cell, lines);
- ypos += e_font_ascent (text_view->font);
- ypos -= edit->yofs_edit;
-
- for (i = 0; i < linebreaks->num_lines; i++) {
- xpos = get_line_xpos (cell, lines);
- xpos -= edit->xofs_edit;
-
- /* start_char, end_char, sel_start and sel_end are IN BYTES */
-
- start_char = lines->text - cell->text;
- end_char = start_char + lines->length;
-
- sel_start = edit->selection_start;
- sel_end = edit->selection_end;
-
- if (sel_start > sel_end){
- sel_start ^= sel_end;
- sel_end ^= sel_start;
- sel_start ^= sel_end;
- }
- if (sel_start < start_char)
- sel_start = start_char;
- if (sel_end > end_char)
- sel_end = end_char;
-
- if (sel_start < sel_end){
- sel_rect.x = xpos + x1 + e_font_utf8_text_width (font, style, lines->text, sel_start - start_char);
- sel_rect.y = ypos + y1 - e_font_ascent (font);
- sel_rect.width = e_font_utf8_text_width (font, style,
- lines->text + sel_start - start_char,
- sel_end - sel_start);
- sel_rect.height = height;
- gtk_paint_flat_box (canvas->style,
- drawable,
- edit->has_selection ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE,
- GTK_SHADOW_NONE,
- clip_rect,
- canvas,
- "text",
- sel_rect.x,
- sel_rect.y,
- sel_rect.width,
- sel_rect.height);
-
- e_font_draw_utf8_text (drawable, font, style, text_view->gc, xpos + x1, ypos + y1,
- lines->text,
- sel_start - start_char);
- e_font_draw_utf8_text (drawable, font, style, fg_gc,
- xpos + x1 + e_font_utf8_text_width (font, style, lines->text, sel_start - start_char),
- ypos + y1,
- lines->text + sel_start - start_char,
- sel_end - sel_start);
- e_font_draw_utf8_text (drawable, font, style, text_view->gc,
- xpos + x1 + e_font_utf8_text_width (font, style, lines->text, sel_end - start_char),
- ypos + y1,
- lines->text + sel_end - start_char,
- end_char - sel_end);
-#if 0 /* Do Bold in EFont directly */
- /* Draw 1,0 moved image, to simulate bold font */
- /* We move that to EFont */
- if (bold) {
- e_font_draw_utf8_text (drawable, font, text_view->gc, xpos + x1 + 1, ypos + y1,
- lines->text,
- sel_start - start_char);
- e_font_draw_utf8_text (drawable, font, fg_gc,
- xpos + x1 + 1 + e_font_utf8_text_width (font, lines->text, sel_start - start_char),
- ypos + y1,
- g_utf8_offset_to_pointer (lines->text, sel_start - start_char),
- sel_end - sel_start);
- e_font_draw_utf8_text (drawable, font, text_view->gc,
- xpos + x1 + 1 + e_font_utf8_text_width (font, lines->text, sel_end - start_char),
- ypos + y1,
- g_utf8_offset_to_pointer (lines->text, sel_end - start_char),
- end_char - sel_end);
- }
-#endif
- } else {
- e_font_draw_utf8_text (drawable, font, style, text_view->gc,
- xpos + x1, ypos + y1,
- lines->text,
- lines->length);
-#if 0
- if (bold) {
- e_font_draw_ucs2_text (drawable,
- font,
- text_view->gc,
- xpos + x1 + 1,
- ypos + y1,
- lines->text,
- lines->length);
- }
-#endif
- }
- if (edit->selection_start == edit->selection_end &&
- edit->selection_start >= start_char &&
- edit->selection_start <= end_char &&
- edit->show_cursor) {
- gdk_gc_set_foreground (text_view->gc, cursor_color);
- gdk_draw_rectangle (drawable,
- text_view->gc,
- TRUE,
- xpos + x1 + e_font_utf8_text_width (font, style, lines->text, sel_start - start_char),
- ypos + y1 - e_font_ascent (font),
- 1,
- height);
- }
- if (ect->strikeout_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->strikeout_column, row)) {
- gdk_draw_rectangle (drawable,
- text_view->gc,
- TRUE,
- x1, ypos + y1 - (e_font_ascent (font) / 2),
- x2 - x1,
- 1);
- }
- ypos += height;
- lines ++;
- }
- unref_lines (cell);
- } else {
-
- ECellTextLineBreaks *linebreaks;
- CurrentCell cell;
- build_current_cell (&cell, text_view, model_col, view_col, row);
-
- cell.width = x2 - x1;
-
- split_into_lines (&cell);
-
- linebreaks = cell.breaks;
- lines = linebreaks->lines;
- ypos = get_line_ypos (&cell, lines);
- ypos += e_font_ascent (text_view->font);
-
-
- for (i = 0; i < linebreaks->num_lines; i++) {
- xpos = get_line_xpos (&cell, lines);
- if (ect->use_ellipsis && lines->ellipsis_length < lines->length) {
- e_font_draw_utf8_text (drawable, font, style, text_view->gc,
- xpos + x1, ypos + y1,
- lines->text,
- lines->ellipsis_length);
- e_font_draw_utf8_text (drawable, font, style, text_view->gc,
- xpos + x1 + lines->width - text_view->ellipsis_width,
- ypos + y1,
- ect->ellipsis ? ect->ellipsis : "...",
- ect->ellipsis ? strlen (ect->ellipsis) : 3);
-#if 0
- if (bold) {
- e_font_draw_ucs2_text (drawable,
- font,
- text_view->gc,
- xpos + x1 + 1,
- ypos + y1,
- lines->text,
- lines->ellipsis_length);
- e_font_draw_utf8_text (drawable,
- font,
- text_view->gc,
- xpos + x1 + 1 +
- lines->width - text_view->ellipsis_width,
- ypos + y1,
- ect->ellipsis ? ect->ellipsis : "...",
- ect->ellipsis ? strlen (ect->ellipsis) : 3);
- }
-#endif
- } else {
- e_font_draw_utf8_text (drawable, font, style, text_view->gc,
- xpos + x1,
- ypos + y1,
- lines->text,
- lines->length);
-#if 0
- if (bold) {
- e_font_draw_ucs2_text (drawable,
- font,
- text_view->gc,
- xpos + x1 + 1,
- ypos + y1,
- lines->text,
- lines->length);
- }
-#endif
- }
- if (ect->strikeout_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->strikeout_column, row)) {
- gdk_draw_rectangle (drawable,
- text_view->gc,
- TRUE,
- x1, ypos + y1 - (e_font_ascent (font) / 2),
- x2 - x1,
- 1);
- }
- ypos += height;
- lines++;
- }
- unref_lines (&cell);
- unbuild_current_cell (&cell);
- }
-
- gdk_gc_set_clip_rectangle (text_view->gc, NULL);
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
-#if 0
- /* Old ECellText */
-
- int xoff;
- gboolean edit_display = FALSE;
-
- /*
- * Figure if this cell is being edited
- */
- if (edit_display){
- CellEdit *edit = text_view->edit;
- const char *text = gtk_entry_get_text (edit->entry);
- GdkWChar *p, *text_wc = g_new (GdkWChar, strlen (text) + 1);
- int text_wc_len = gdk_mbstowcs (text_wc, text, strlen (text));
- const int cursor_pos = GTK_EDITABLE (edit->entry)->current_pos;
- const int left_len = gdk_text_width_wc (text_view->font, text_wc, cursor_pos);
-
- text_wc [text_wc_len] = 0;
- /*
- * Paint
- */
- gdk_gc_set_foreground (text_view->gc, &w->style->base [GTK_STATE_NORMAL]);
- gdk_draw_rectangle (drawable, text_view->gc, TRUE,
- rect.x, rect.y, rect.width, rect.height);
- gdk_gc_set_foreground (text_view->gc, &w->style->text [GTK_STATE_NORMAL]);
-
- {
- GdkGC *gc = text_view->gc;
- const int y = y2 - font->descent - ((y2-y1-height)/2);
- int px, i;
-
- /*
- * Border
- */
- x1 += 2;
- x2--;
-
- px = x1;
-
- /*
- * If the cursor is outside the visible range
- *
- * FIXME: we really want a better behaviour.
- */
- if ((px + left_len) > x2)
- px -= left_len - (x2-x1);
-
- /*
- * Draw
- */
- for (i = 0, p = text_wc; *p; p++, i++){
- gdk_draw_text_wc (
- drawable, font, gc, px, y, p, 1);
-
- if (i == cursor_pos){
- gdk_draw_line (
- drawable, gc,
- px, y - font->ascent,
- px, y + font->descent - 1);
- }
-
- px += gdk_text_width_wc (font, p, 1);
- }
-
- if (i == cursor_pos){
- gdk_draw_line (
- drawable, gc,
- px, y - font->ascent,
- px, y + font->descent - 1);
- }
- }
- g_free (text_wc);
- } else {
- /*
- * Regular cell
- */
- GdkColor *background, *foreground;
- int width;
-
- /*
- * Border
- */
- x1++;
- x2--;
-
- /*
- * Compute draw mode
- */
- switch (ect->justify){
- case GTK_JUSTIFY_LEFT:
- xoff = 1;
- break;
-
- case GTK_JUSTIFY_RIGHT:
- width = 1 + gdk_text_width (font, str, strlen (str));
- xoff = (x2 - x1) - width;
- break;
-
- case GTK_JUSTIFY_CENTER:
- xoff = ((x2 - x1) - gdk_text_width (font, str, strlen (str))) / 2;
- break;
- default:
- xoff = 0;
- g_warning ("Can not handle GTK_JUSTIFY_FILL");
- break;
- }
-
-
- if (selected){
- background = &w->style->bg [GTK_STATE_SELECTED];
- foreground = &w->style->text [GTK_STATE_SELECTED];
- } else {
- background = &w->style->base [GTK_STATE_NORMAL];
- foreground = &w->style->text [GTK_STATE_NORMAL];
- }
-
- gdk_gc_set_foreground (text_view->gc, background);
- gdk_draw_rectangle (drawable, text_view->gc, TRUE,
- rect.x, rect.y, rect.width, rect.height);
- gdk_gc_set_foreground (text_view->gc, foreground);
-
- gdk_draw_string (
- drawable, font, text_view->gc,
- x1 + xoff,
- y2 - font->descent - ((y2-y1-height)/2), str);
- }
-#endif
-}
-
-/*
- * Selects the entire string
- */
-static void
-ect_edit_select_all (ECellTextView *text_view)
-{
- g_assert (text_view->edit);
-
- text_view->edit->selection_start = 0;
- text_view->edit->selection_end = strlen (text_view->edit->cell.text);
-}
-
-/*
- * ECell::event method
- */
-static gint
-ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
-{
- ECellTextView *text_view = (ECellTextView *) ecell_view;
- ETextEventProcessorEvent e_tep_event;
- gboolean edit_display = FALSE;
- CellEdit *edit = text_view->edit;
- GtkWidget *canvas = GTK_WIDGET (text_view->canvas);
- gint return_val = 0;
-
- CurrentCell cell, *cellptr;
- build_current_cell (&cell, text_view, model_col, view_col, row);
-
-
- if (edit){
- if ((edit->cell.view_col == view_col) && (edit->cell.row == row)) {
- edit_display = TRUE;
- cellptr = CURRENT_CELL(edit);
- } else {
- cellptr = &cell;
- }
- } else {
- cellptr = &cell;
- }
-
- e_tep_event.type = event->type;
- switch (event->type) {
- case GDK_FOCUS_CHANGE:
- break;
- case GDK_KEY_PRESS: /* Fall Through */
- case GDK_KEY_RELEASE:
- if (event->key.keyval == GDK_Escape){
- ect_cancel_edit (text_view);
- return_val = TRUE;
- break;
- }
-
- if ((!edit_display) && e_table_model_is_cell_editable (ecell_view->e_table_model, model_col, row)) {
- e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
- ect_edit_select_all (text_view);
- edit = text_view->edit;
- cellptr = CURRENT_CELL(edit);
- edit_display = TRUE;
- }
- if (edit_display) {
- GdkEventKey key = event->key;
- if (key.keyval == GDK_KP_Enter || key.keyval == GDK_Return){
- e_table_item_leave_edit (text_view->cell_view.e_table_item_view);
- } else {
- e_tep_event.key.time = key.time;
- e_tep_event.key.state = key.state;
- e_tep_event.key.keyval = key.keyval;
- e_tep_event.key.length = key.length;
- e_tep_event.key.string = key.string;
- _get_tep (edit);
- return_val = e_text_event_processor_handle_event (edit->tep,
- &e_tep_event);
- break;
- }
- }
-
- else
- return 0;
- break;
- case GDK_BUTTON_PRESS: /* Fall Through */
- case GDK_BUTTON_RELEASE:
- event->button.x -= 4;
- event->button.y -= 1;
- if ((!edit_display)
- && e_table_model_is_cell_editable (ecell_view->e_table_model, model_col, row)
- && event->type == GDK_BUTTON_RELEASE
- && event->button.button == 1) {
- GdkEventButton button = event->button;
-
- e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
- edit = text_view->edit;
- cellptr = CURRENT_CELL(edit);
- edit_display = TRUE;
-
- e_tep_event.button.type = GDK_BUTTON_PRESS;
- e_tep_event.button.time = button.time;
- e_tep_event.button.state = button.state;
- e_tep_event.button.button = button.button;
- e_tep_event.button.position = _get_position_from_xy (cellptr, button.x, button.y);
- _get_tep (edit);
- return_val = e_text_event_processor_handle_event (edit->tep,
- &e_tep_event);
- if (event->button.button == 1) {
- if (event->type == GDK_BUTTON_PRESS)
- edit->button_down = TRUE;
- else
- edit->button_down = FALSE;
- }
- edit->lastx = button.x;
- edit->lasty = button.y;
- edit->last_state = button.state;
-
- e_tep_event.button.type = GDK_BUTTON_RELEASE;
- }
- if (edit_display) {
- GdkEventButton button = event->button;
- e_tep_event.button.time = button.time;
- e_tep_event.button.state = button.state;
- e_tep_event.button.button = button.button;
- e_tep_event.button.position = _get_position_from_xy (cellptr, button.x, button.y);
- _get_tep (edit);
- return_val = e_text_event_processor_handle_event (edit->tep,
- &e_tep_event);
- if (event->button.button == 1) {
- if (event->type == GDK_BUTTON_PRESS)
- edit->button_down = TRUE;
- else
- edit->button_down = FALSE;
- }
- edit->lastx = button.x;
- edit->lasty = button.y;
- edit->last_state = button.state;
- }
- break;
- case GDK_MOTION_NOTIFY:
- event->motion.x -= 4;
- event->motion.y -= 1;
- if (edit_display) {
- GdkEventMotion motion = event->motion;
- e_tep_event.motion.time = motion.time;
- e_tep_event.motion.state = motion.state;
- e_tep_event.motion.position = _get_position_from_xy (cellptr, motion.x, motion.y);
- _get_tep (edit);
- return_val = e_text_event_processor_handle_event (edit->tep,
- &e_tep_event);
- edit->lastx = motion.x;
- edit->lasty = motion.y;
- edit->last_state = motion.state;
- }
- break;
- case GDK_ENTER_NOTIFY:
-#if 0
- edit->pointer_in = TRUE;
-#endif
- if (edit_display) {
- if (edit->default_cursor_shown){
- gdk_window_set_cursor (canvas->window, text_view->i_cursor);
- edit->default_cursor_shown = FALSE;
- }
- }
- break;
- case GDK_LEAVE_NOTIFY:
-#if 0
- text_view->pointer_in = FALSE;
-#endif
- if (edit_display) {
- if (! edit->default_cursor_shown){
- gdk_window_set_cursor (canvas->window, NULL);
- edit->default_cursor_shown = TRUE;
- }
- }
- break;
- default:
- break;
- }
-
- unbuild_current_cell (&cell);
- if (return_val)
- return return_val;
-#if 0
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS(parent_class)->event (item, event);
-#endif
- else
- return 0;
-
-#if 0
- switch (event->type){
- case GDK_BUTTON_PRESS:
- /*
- * Adjust for the border we use
- */
- event->button.x++;
-
- printf ("Button pressed at %g %g\n", event->button.x, event->button.y);
- if (text_view->edit){
- printf ("FIXME: Should handle click here\n");
- } else
- e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
- break;
-
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Escape){
- ect_cancel_edit (text_view);
- return TRUE;
- }
-
- if (!text_view->edit){
- e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
- ect_edit_select_all (text_view);
- }
-
- gtk_widget_event (GTK_WIDGET (text_view->edit->entry), event);
- ect_queue_redraw (text_view, view_col, row);
- break;
-#endif
-}
-
-/*
- * ECell::height method
- */
-static int
-ect_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- ECellTextView *text_view = (ECellTextView *) ecell_view;
- EFont *font;
- ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
-
- font = text_view->font;
- if (ect->filter) {
- gchar *string;
- gint value;
-
- string = (*ect->filter)(e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- value = e_font_height (font) * number_of_lines(string) + TEXT_PAD;
-
- g_free(string);
-
- return value;
- } else {
- gchar * string;
- gint value;
-
- string = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
-
- value = e_font_height (font) * number_of_lines (string) + TEXT_PAD;
-
- return value;
- }
-}
-
-/*
- * ECellView::enter_edit method
- */
-static void *
-ect_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- ECellTextView *text_view = (ECellTextView *) ecell_view;
- CellEdit *edit;
- ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
-
- edit = g_new (CellEdit, 1);
- text_view->edit = edit;
-
- build_current_cell (CURRENT_CELL(edit), text_view, model_col, view_col, row);
-
- edit->xofs_edit = 0.0;
- edit->yofs_edit = 0.0;
-
- edit->selection_start = 0;
- edit->selection_end = 0;
- edit->select_by_word = FALSE;
-
- edit->timeout_id = g_timeout_add (10, _blink_scroll_timeout, text_view);
- edit->timer = g_timer_new ();
- g_timer_elapsed (edit->timer, &(edit->scroll_start));
- g_timer_start (edit->timer);
-
- edit->lastx = 0;
- edit->lasty = 0;
- edit->last_state = 0;
-
- edit->scroll_start = 0;
- edit->show_cursor = TRUE;
- edit->button_down = FALSE;
-
- edit->tep = NULL;
-
- edit->has_selection = FALSE;
-
- edit->invisible = NULL;
- edit->primary_selection = NULL;
- edit->primary_length = 0;
- edit->clipboard_selection = NULL;
- edit->clipboard_length = 0;
-
- edit->pointer_in = FALSE;
- edit->default_cursor_shown = TRUE;
-
- if (ect->filter) {
- edit->old_text = (*ect->filter)(e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- } else {
- edit->old_text = g_strdup (e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- }
- edit->cell.text = g_strdup (edit->old_text);
-
-#if 0
- if (edit->pointer_in){
- if (edit->default_cursor_shown){
- gdk_window_set_cursor (GTK_WIDGET(item->canvas)->window, text_view->i_cursor);
- edit->default_cursor_shown = FALSE;
- }
- }
-#endif
-
- ect_queue_redraw (text_view, view_col, row);
-
- return NULL;
-}
-
-/*
- * ECellView::leave_edit method
- */
-static void
-ect_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
- ECellTextView *text_view = (ECellTextView *) ecell_view;
- CellEdit *edit = text_view->edit;
-
- if (edit){
- ect_accept_edits (text_view);
- ect_stop_editing (text_view);
- /* FIXME: edit is freed in ect_stop_editing() so I've
- commented this out - Damon. */
- /*unbuild_current_cell (CURRENT_CELL(edit));*/
- } else {
- /*
- * We did invoke this leave edit internally
- */
- }
-}
-
-static void
-ect_print (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width, double height)
-{
- GnomeFont *font = gnome_font_new ("Helvetica", 12);
- char *string;
- ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
- if (ect->filter) {
- string = (*ect->filter)(e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- } else {
- string = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
- }
- gnome_print_gsave(context);
- if (gnome_print_moveto(context, 2, 2) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, width - 2, 2) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, width - 2, height - 2) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 2, height - 2) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 2, 2) == -1)
- /* FIXME */;
- if (gnome_print_clip(context) == -1)
- /* FIXME */;
- gnome_print_moveto(context, 2, (height - gnome_font_get_ascender(font) + gnome_font_get_descender(font)) / 2);
- gnome_print_setfont(context, font);
- gnome_print_show(context, string);
- gnome_print_grestore(context);
- if (ect->filter) {
- g_free(string);
- }
-}
-
-static gdouble
-ect_print_height (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width)
-{
- return 16;
-}
-
-/*
- * GtkObject::destroy method
- */
-static void
-ect_destroy (GtkObject *object)
-{
- ECellText *ect = E_CELL_TEXT (object);
-
- g_free (ect->font_name);
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-/* Set_arg handler for the text item */
-static void
-ect_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ECellText *text;
-
- text = E_CELL_TEXT (object);
-
- switch (arg_id) {
- case ARG_STRIKEOUT_COLUMN:
- text->strikeout_column = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_BOLD_COLUMN:
- text->bold_column = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_COLOR_COLUMN:
- text->color_column = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_TEXT_FILTER:
- text->filter = GTK_VALUE_POINTER (*arg);
- break;
- default:
- return;
- }
-}
-
-/* Get_arg handler for the text item */
-static void
-ect_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ECellText *text;
-
- text = E_CELL_TEXT (object);
-
- switch (arg_id) {
- case ARG_STRIKEOUT_COLUMN:
- GTK_VALUE_INT (*arg) = text->strikeout_column;
- break;
-
- case ARG_BOLD_COLUMN:
- GTK_VALUE_INT (*arg) = text->bold_column;
- break;
-
- case ARG_COLOR_COLUMN:
- GTK_VALUE_INT (*arg) = text->color_column;
- break;
-
- case ARG_TEXT_FILTER:
- GTK_VALUE_POINTER (*arg) = text->filter;
- break;
-
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_cell_text_class_init (GtkObjectClass *object_class)
-{
- ECellClass *ecc = (ECellClass *) object_class;
-
- object_class->destroy = ect_destroy;
-
- ecc->new_view = ect_new_view;
- ecc->kill_view = ect_kill_view;
- ecc->realize = ect_realize;
- ecc->unrealize = ect_unrealize;
- ecc->draw = ect_draw;
- ecc->event = ect_event;
- ecc->height = ect_height;
- ecc->enter_edit = ect_enter_edit;
- ecc->leave_edit = ect_leave_edit;
- ecc->print = ect_print;
- ecc->print_height = ect_print_height;
-
- object_class->get_arg = ect_get_arg;
- object_class->set_arg = ect_set_arg;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- gtk_object_add_arg_type ("ECellText::strikeout_column",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_STRIKEOUT_COLUMN);
- gtk_object_add_arg_type ("ECellText::bold_column",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_BOLD_COLUMN);
- gtk_object_add_arg_type ("ECellText::color_column",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_COLOR_COLUMN);
- gtk_object_add_arg_type ("ECellText::text_filter",
- GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_TEXT_FILTER);
-
- if (!clipboard_atom)
- clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
-}
-
-static void
-e_cell_text_init (ECellText *ect)
-{
- ect->strikeout_column = -1;
- ect->bold_column = -1;
- ect->color_column = -1;
-}
-
-E_MAKE_TYPE(e_cell_text, "ECellText", ECellText, e_cell_text_class_init, e_cell_text_init, PARENT_TYPE);
-
-ECell *
-e_cell_text_new (ETableModel *etm, const char *fontname, GtkJustification justify)
-{
- ECellText *ect = gtk_type_new (e_cell_text_get_type ());
-
- ect->ellipsis = NULL;
- ect->use_ellipsis = TRUE;
-
- ect->font_name = g_strdup (fontname);
- ect->justify = justify;
-
- return (ECell *) ect;
-}
-
-/* Calculates the x position of the specified line of text, based on the text's justification */
-static int
-get_line_xpos (CurrentCell *cell, struct line *line)
-{
- int x;
-
- ECellTextView *text_view = cell->text_view;
- ECellText *ect = E_CELL_TEXT (((ECellView *)cell->text_view)->ecell);
-
- x = text_view->xofs + ect->x;
-
- switch (ect->justify) {
- case GTK_JUSTIFY_RIGHT:
- x += cell->width - line->width;
- break;
-
- case GTK_JUSTIFY_CENTER:
- x += (cell->width - line->width) / 2;
- break;
-
- default:
- /* For GTK_JUSTIFY_LEFT, we don't have to do anything. We do not support
- * GTK_JUSTIFY_FILL, yet.
- */
- break;
- }
-
- return x;
-}
-
-/* Calculates the x position of the specified line of text, based on the text's justification */
-static int
-get_line_ypos (CurrentCell *cell, struct line *line)
-{
- int y;
-
- ECellTextView *text_view = cell->text_view;
- ECellText *ect = E_CELL_TEXT (((ECellView *)cell->text_view)->ecell);
- ECellTextLineBreaks *linebreaks = cell->breaks;
-
- struct line *lines = linebreaks->lines;
-
- EFont *font;
-
- font = text_view->font;
-
- y = text_view->yofs + ect->y;
- y += (line - lines) * e_font_height (font);
-
- return y;
-}
-
-/* fixme: Handle Font attributes */
-/* position is in BYTES */
-
-static void
-_get_xy_from_position (CurrentCell *cell, gint position, gint *xp, gint *yp)
-{
- if (xp || yp) {
- struct line *lines;
- int x, y;
- int j;
- ECellTextView *text_view = cell->text_view;
- ECellTextLineBreaks *linebreaks;
- EFont *font;
-
- font = text_view->font;
-
- split_into_lines (cell);
-
- linebreaks = cell->breaks;
- lines = linebreaks->lines;
-
- x = get_line_xpos (cell, lines);
- y = get_line_ypos (cell, lines);
- for (j = 0, lines = linebreaks->lines; j < linebreaks->num_lines; lines++, j++) {
- if (lines->text > cell->text + position)
- break;
- y += e_font_height (font);
- }
- lines --;
- y -= e_font_descent (font);
-
- x += e_font_utf8_text_width (font, E_FONT_PLAIN,
- lines->text,
- position - (lines->text - cell->text));
- if ((CellEdit *) cell == cell->text_view->edit){
- x -= ((CellEdit *)cell)->xofs_edit;
- y -= ((CellEdit *)cell)->yofs_edit;
- }
- if (xp)
- *xp = x;
- if (yp)
- *yp = y;
- unref_lines (cell);
- }
-}
-
-static gint
-_get_position_from_xy (CurrentCell *cell, gint x, gint y)
-{
- int i, j;
- int xpos, ypos;
- struct line *lines;
- int return_val;
- gchar *p;
-
- ECellTextView *text_view = cell->text_view;
- ECellTextLineBreaks *linebreaks;
- EFont *font;
-
- font = text_view->font;
-
- split_into_lines (cell);
-
- linebreaks = cell->breaks;
-
- lines = linebreaks->lines;
-
- if ((CellEdit *) cell == cell->text_view->edit){
- x += ((CellEdit *)cell)->xofs_edit;
- y += ((CellEdit *)cell)->yofs_edit;
- }
-
- ypos = get_line_ypos (cell, linebreaks->lines);
- j = 0;
- while (y > ypos) {
- ypos += e_font_height (font);
- j ++;
- }
- j--;
- if (j >= linebreaks->num_lines)
- j = linebreaks->num_lines - 1;
- if (j < 0)
- j = 0;
- i = 0;
-
- lines += j;
- xpos = get_line_xpos (cell, lines);
-
- for (p = lines->text; p < lines->text + lines->length; p = unicode_next_utf8 (p)) {
- gint charwidth;
-
- charwidth = e_font_utf8_char_width (font, E_FONT_PLAIN, p);
-
- xpos += charwidth / 2;
- if (xpos > x) {
- break;
- }
- xpos += (charwidth + 1) / 2;
- }
-
- return_val = p - cell->text;
-
- unref_lines (cell);
-
- return return_val;
-}
-
-#define SCROLL_WAIT_TIME 30000
-
-static gboolean
-_blink_scroll_timeout (gpointer data)
-{
- CurrentCell *cell = CURRENT_CELL(data);
- ECellTextView *text_view = (ECellTextView *) data;
- ECellText *ect = E_CELL_TEXT (((ECellView *)text_view)->ecell);
- CellEdit *edit = text_view->edit;
- ECellTextLineBreaks *linebreaks = cell->breaks;
-
- gulong current_time;
- gboolean scroll = FALSE;
- gboolean redraw = FALSE;
-
- g_timer_elapsed (edit->timer, &current_time);
-
- if (edit->scroll_start + SCROLL_WAIT_TIME > 1000000) {
- if (current_time > edit->scroll_start - (1000000 - SCROLL_WAIT_TIME) &&
- current_time < edit->scroll_start)
- scroll = TRUE;
- } else {
- if (current_time > edit->scroll_start + SCROLL_WAIT_TIME ||
- current_time < edit->scroll_start)
- scroll = TRUE;
- }
- if (scroll && edit->button_down) {
- /* FIXME: Copy this for y. */
- if (edit->lastx - ect->x > cell->width &&
- edit->xofs_edit < linebreaks->max_width - cell->width) {
- edit->xofs_edit += 4;
- if (edit->xofs_edit > linebreaks->max_width - cell->width + 1)
- edit->xofs_edit = linebreaks->max_width - cell->width + 1;
- redraw = TRUE;
- }
- if (edit->lastx - ect->x < 0 &&
- edit->xofs_edit > 0) {
- edit->xofs_edit -= 4;
- if (edit->xofs_edit < 0)
- edit->xofs_edit = 0;
- redraw = TRUE;
- }
- if (redraw) {
- ETextEventProcessorEvent e_tep_event;
- e_tep_event.type = GDK_MOTION_NOTIFY;
- e_tep_event.motion.state = edit->last_state;
- e_tep_event.motion.time = 0;
- e_tep_event.motion.position = _get_position_from_xy (cell, edit->lastx, edit->lasty);
- _get_tep (edit);
- e_text_event_processor_handle_event (edit->tep,
- &e_tep_event);
- edit->scroll_start = current_time;
- }
- }
-
- if (!((current_time / 500000) % 2)) {
- if (!edit->show_cursor)
- redraw = TRUE;
- edit->show_cursor = TRUE;
- } else {
- if (edit->show_cursor)
- redraw = TRUE;
- edit->show_cursor = FALSE;
- }
- if (redraw){
- ect_queue_redraw (text_view, edit->cell.view_col, edit->cell.row);
- }
- return TRUE;
-}
-
-static int
-_get_position (ECellTextView *text_view, ETextEventProcessorCommand *command)
-{
- int length;
- int x, y;
- CellEdit *edit = text_view->edit;
- CurrentCell *cell = CURRENT_CELL(edit);
- EFont *font;
- gchar *p;
- int unival;
-
- font = text_view->font;
-
- switch (command->position) {
-
- case E_TEP_VALUE:
- return command->value;
-
- case E_TEP_SELECTION:
- return edit->selection_end;
-
- case E_TEP_START_OF_BUFFER:
- return 0;
-
- /* fixme: this probably confuses TEP */
-
- case E_TEP_END_OF_BUFFER:
- return strlen (cell->text);
-
- case E_TEP_START_OF_LINE:
-
- if (edit->selection_end < 1) return 0;
-
- p = unicode_previous_utf8 (cell->text, cell->text + edit->selection_end);
-
- if (p == cell->text) return 0;
-
- p = unicode_previous_utf8 (cell->text, p);
-
- while (p && p > cell->text) {
- if (*p == '\n') return p - cell->text + 1;
- p = unicode_previous_utf8 (cell->text, p);
- }
-
- return 0;
-
- case E_TEP_END_OF_LINE:
-
- length = strlen (cell->text);
- if (edit->selection_end >= length) return length;
-
- p = unicode_next_utf8 (cell->text + edit->selection_end);
-
- while (*p) {
- if (*p == '\n') return p - cell->text;
- p = unicode_next_utf8 (p);
- }
-
- return p - cell->text;
-
- case E_TEP_FORWARD_CHARACTER:
-
- length = strlen (cell->text);
- if (edit->selection_end >= length) return length;
-
- p = unicode_next_utf8 (cell->text + edit->selection_end);
-
- return p - cell->text;
-
- case E_TEP_BACKWARD_CHARACTER:
-
- if (edit->selection_end < 1) return 0;
-
- p = unicode_previous_utf8 (cell->text, cell->text + edit->selection_end);
-
- if (p == NULL) return 0;
-
- return p - cell->text;
-
- case E_TEP_FORWARD_WORD:
-
- length = strlen (cell->text);
- if (edit->selection_end >= length) return length;
-
- p = unicode_next_utf8 (cell->text + edit->selection_end);
-
- while (*p) {
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) return p - cell->text;
- p = unicode_next_utf8 (p);
- }
-
- return p - cell->text;
-
- case E_TEP_BACKWARD_WORD:
-
- if (edit->selection_end < 1) return 0;
-
- p = unicode_previous_utf8 (cell->text, cell->text + edit->selection_end);
-
- if (p == cell->text) return 0;
-
- p = unicode_previous_utf8 (cell->text, p);
-
- while (p && p > cell->text) {
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) {
- return (unicode_next_utf8 (p) - cell->text);
- }
- p = unicode_previous_utf8 (cell->text, p);
- }
-
- return 0;
-
- case E_TEP_FORWARD_LINE:
- _get_xy_from_position (cell, edit->selection_end, &x, &y);
- y += e_font_height (font);
- return _get_position_from_xy (cell, x, y);
- case E_TEP_BACKWARD_LINE:
- _get_xy_from_position (cell, edit->selection_end, &x, &y);
- y -= e_font_height (font);
- return _get_position_from_xy (cell, x, y);
-
- case E_TEP_FORWARD_PARAGRAPH:
- case E_TEP_BACKWARD_PARAGRAPH:
-
- case E_TEP_FORWARD_PAGE:
- case E_TEP_BACKWARD_PAGE:
- return edit->selection_end;
- default:
- return edit->selection_end;
- }
- g_assert_not_reached ();
- return 0; /* Kill warning */
-}
-
-static void
-_delete_selection (ECellTextView *text_view)
-{
- CellEdit *edit = text_view->edit;
- CurrentCell *cell = CURRENT_CELL(edit);
- gint length;
- gchar *sp, *ep;
-
- if (edit->selection_end == edit->selection_start) return;
-
- if (edit->selection_end < edit->selection_start) {
- edit->selection_end ^= edit->selection_start;
- edit->selection_start ^= edit->selection_end;
- edit->selection_end ^= edit->selection_start;
- }
-
- sp = cell->text + edit->selection_start;
- ep = cell->text + edit->selection_end;
- length = strlen (ep) + 1;
-
- memmove (sp, ep, length);
-
- edit->selection_end = edit->selection_start;
-}
-
-/* fixme: */
-/* NB! We expect value to be length IN BYTES */
-
-static void
-_insert (ECellTextView *text_view, char *string, int value)
-{
- CellEdit *edit = text_view->edit;
- CurrentCell *cell = CURRENT_CELL(edit);
- char *temp;
-
- if (value <= 0) return;
-
- temp = g_new (gchar, strlen (cell->text) + value + 1);
-
- strncpy (temp, cell->text, edit->selection_start);
- strncpy (temp + edit->selection_start, string, value);
- strcpy (temp + edit->selection_start + value, cell->text + edit->selection_end);
-
- g_free (cell->text);
-
- cell->text = temp;
-
- edit->selection_start += value;
- edit->selection_end = edit->selection_start;
-}
-
-static void
-e_cell_text_view_command (ETextEventProcessor *tep, ETextEventProcessorCommand *command, gpointer data)
-{
- CellEdit *edit = (CellEdit *) data;
- CurrentCell *cell = CURRENT_CELL(edit);
- ECellTextView *text_view = cell->text_view;
-
- gboolean change = FALSE;
- gboolean redraw = FALSE;
-
- int sel_start, sel_end;
- EFont *font;
-
- font = text_view->font;
-
- switch (command->action) {
- case E_TEP_MOVE:
- edit->selection_start = _get_position (text_view, command);
- edit->selection_end = edit->selection_start;
- if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- redraw = TRUE;
- break;
- case E_TEP_SELECT:
- edit->selection_end = _get_position (text_view, command);
- sel_start = MIN(edit->selection_start, edit->selection_end);
- sel_end = MAX(edit->selection_start, edit->selection_end);
- if (sel_start != sel_end) {
- e_cell_text_view_supply_selection (edit, command->time, GDK_SELECTION_PRIMARY,
- cell->text + sel_start,
- sel_end - sel_start);
- } else if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- redraw = TRUE;
- break;
- case E_TEP_DELETE:
- if (edit->selection_end == edit->selection_start) {
- edit->selection_end = _get_position (text_view, command);
- }
- _delete_selection (text_view);
- if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- redraw = TRUE;
- change = TRUE;
- break;
-
- case E_TEP_INSERT:
- if (edit->selection_end != edit->selection_start) {
- _delete_selection (text_view);
- }
- _insert (text_view, command->string, command->value);
- if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- redraw = TRUE;
- change = TRUE;
- break;
- case E_TEP_COPY:
- sel_start = MIN(edit->selection_start, edit->selection_end);
- sel_end = MAX(edit->selection_start, edit->selection_end);
- if (sel_start != sel_end) {
- e_cell_text_view_supply_selection (edit, command->time, clipboard_atom,
- cell->text + sel_start,
- sel_end - sel_start);
- }
- if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- break;
- case E_TEP_PASTE:
- e_cell_text_view_get_selection (edit, clipboard_atom, command->time);
- if (edit->timer) {
- g_timer_reset (edit->timer);
- }
- redraw = TRUE;
- change = TRUE;
- break;
- case E_TEP_GET_SELECTION:
- e_cell_text_view_get_selection (edit, GDK_SELECTION_PRIMARY, command->time);
- break;
- case E_TEP_ACTIVATE:
- e_table_item_leave_edit (text_view->cell_view.e_table_item_view);
- break;
- case E_TEP_SET_SELECT_BY_WORD:
- edit->select_by_word = command->value;
- break;
- case E_TEP_GRAB:
- case E_TEP_UNGRAB:
-#if 0
- case E_TEP_GRAB:
- gnome_canvas_item_grab (GNOME_CANVAS_ITEM(text),
- GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
- text_view->i_cursor,
- command->time);
- break;
- gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM(text), command->time);
- break;
-#endif
- case E_TEP_NOP:
- break;
- }
-
- if (!edit->button_down) {
- int x;
- int i;
- struct line *lines;
- ECellTextLineBreaks *linebreaks;
-
- split_into_lines (cell);
-
- linebreaks = cell->breaks;
-
- for (lines = linebreaks->lines, i = 0; i < linebreaks->num_lines ; i++, lines ++) {
- if ((lines->text - cell->text) > edit->selection_end) {
- break;
- }
- }
- lines --;
- x = e_font_utf8_text_width (font, E_FONT_PLAIN,
- lines->text,
- edit->selection_end - (lines->text - cell->text));
-
-
- if (x < edit->xofs_edit) {
- edit->xofs_edit = x;
- redraw = TRUE;
- }
-
- if (2 + x - cell->width > edit->xofs_edit) {
- edit->xofs_edit = 2 + x - cell->width;
- redraw = TRUE;
- }
- unref_lines (cell);
- }
-
- if (redraw){
- ect_queue_redraw (text_view, edit->cell.view_col, edit->cell.row);
- }
-#if 0
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
-#endif
-}
-
-static void _invisible_destroy (GtkInvisible *invisible,
- CellEdit *edit)
-{
- edit->invisible = NULL;
-}
-
-static GtkWidget *e_cell_text_view_get_invisible (CellEdit *edit)
-{
- GtkWidget *invisible;
- if (edit->invisible) {
- invisible = edit->invisible;
- } else {
- invisible = gtk_invisible_new ();
- edit->invisible = invisible;
-
- gtk_selection_add_target (invisible,
- GDK_SELECTION_PRIMARY,
- GDK_SELECTION_TYPE_STRING,
- E_SELECTION_PRIMARY);
- gtk_selection_add_target (invisible,
- clipboard_atom,
- GDK_SELECTION_TYPE_STRING,
- E_SELECTION_CLIPBOARD);
-
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_get",
- GTK_SIGNAL_FUNC (_selection_get),
- edit);
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_clear_event",
- GTK_SIGNAL_FUNC (_selection_clear_event),
- edit);
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_received",
- GTK_SIGNAL_FUNC (_selection_received),
- edit);
-
- gtk_signal_connect (GTK_OBJECT(invisible), "destroy",
- GTK_SIGNAL_FUNC (_invisible_destroy),
- edit);
- }
- return invisible;
-}
-
-static void
-_selection_clear_event (GtkInvisible *invisible,
- GdkEventSelection *event,
- CellEdit *edit)
-{
- if (event->selection == GDK_SELECTION_PRIMARY) {
- g_free (edit->primary_selection);
- edit->primary_selection = NULL;
- edit->primary_length = 0;
-
- edit->has_selection = FALSE;
-#if 0
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
-#endif
-
- } else if (event->selection == clipboard_atom) {
- g_free (edit->clipboard_selection);
- edit->clipboard_selection = NULL;
- edit->clipboard_length = 0;
- }
-}
-
-static void
-_selection_get (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint info,
- guint time_stamp,
- CellEdit *edit)
-{
- switch (info) {
- case E_SELECTION_PRIMARY:
- gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
- 8, edit->primary_selection, edit->primary_length);
- break;
- case E_SELECTION_CLIPBOARD:
- gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
- 8, edit->clipboard_selection, edit->clipboard_length);
- break;
- }
-}
-
-/* fixme: What happens, if delivered string is not UTF-8? */
-
-static void
-_selection_received (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint time,
- CellEdit *edit)
-{
- if (selection_data->length < 0 || selection_data->type != GDK_SELECTION_TYPE_STRING) {
- return;
- } else {
- ETextEventProcessorCommand command;
- command.action = E_TEP_INSERT;
- command.position = E_TEP_SELECTION;
- command.string = selection_data->data;
- command.value = selection_data->length;
- command.time = time;
- e_cell_text_view_command (edit->tep, &command, edit);
- }
-}
-
-static void e_cell_text_view_supply_selection (CellEdit *edit, guint time, GdkAtom selection, char *data, gint length)
-{
- gboolean successful;
- GtkWidget *invisible;
-
- invisible = e_cell_text_view_get_invisible (edit);
-
- if (selection == GDK_SELECTION_PRIMARY){
- if (edit->primary_selection) {
- g_free (edit->primary_selection);
- }
- edit->primary_selection = g_strndup (data, length);
- edit->primary_length = length;
- } else if (selection == clipboard_atom) {
- if (edit->clipboard_selection) {
- g_free (edit->clipboard_selection);
- }
- edit->clipboard_selection = g_strndup (data, length);
- edit->clipboard_length = length;
- }
-
- successful = gtk_selection_owner_set (invisible,
- selection,
- time);
-
- if (selection == GDK_SELECTION_PRIMARY)
- edit->has_selection = successful;
-}
-
-static void
-e_cell_text_view_get_selection (CellEdit *edit, GdkAtom selection, guint32 time)
-{
- GtkWidget *invisible;
- invisible = e_cell_text_view_get_invisible (edit);
- gtk_selection_convert (invisible,
- selection,
- GDK_SELECTION_TYPE_STRING,
- time);
-}
-
-static void
-_get_tep (CellEdit *edit)
-{
- if (!edit->tep) {
- edit->tep = e_text_event_processor_emacs_like_new ();
- gtk_object_ref (GTK_OBJECT (edit->tep));
- gtk_object_sink (GTK_OBJECT (edit->tep));
- gtk_signal_connect (GTK_OBJECT(edit->tep),
- "command",
- GTK_SIGNAL_FUNC(e_cell_text_view_command),
- (gpointer) edit);
- }
-}
-
-static int
-number_of_lines (char *text)
-{
- int num_lines = 0;
- gchar *p;
-
- if (!text) return 0;
-
- for (p = text; *p; p = unicode_next_utf8 (p)) {
- if (*p == '\n') num_lines++;
- }
-
- num_lines++;
- return num_lines;
-}
-
-/* Splits the text of the text item into lines */
-static void
-split_into_lines (CurrentCell *cell)
-{
- char *p;
- struct line *lines;
- gint len;
-
- char *text = cell->text;
- ECellTextLineBreaks *linebreaks = cell->breaks;
-
- if (! cell->breaks) {
- cell->breaks = g_new (ECellTextLineBreaks, 1);
- cell->breaks->ref_count = 1;
- } else {
- cell->breaks->ref_count ++;
- return;
- }
- linebreaks = cell->breaks;
-
- /* Check if already split. */
-
- linebreaks->lines = NULL;
- linebreaks->num_lines = 0;
-
- if (!text)
- return;
-
- /* First, count the number of lines */
-
- linebreaks->num_lines = number_of_lines(cell->text);
-
- /* Allocate array of lines and calculate split positions */
-
- linebreaks->lines = lines = g_new0 (struct line, linebreaks->num_lines);
-
- len = 0;
- for (p = text; *p; p = unicode_next_utf8 (p)) {
- if (len == 0) lines->text = p;
- if (*p == '\n') {
- lines->length = p - lines->text;
- lines++;
- len = 0;
- } else
- len++;
- }
-
- if (len == 0)
- lines->text = p;
- lines->length = p - lines->text;
-
- calc_line_widths (cell);
-}
-
-/* Free lines structure. */
-static void
-unref_lines (CurrentCell *cell)
-{
- if (cell->breaks){
- cell->breaks->ref_count --;
- if (cell->breaks->ref_count <= 0){
- g_free (cell->breaks->lines);
- g_free (cell->breaks);
- cell->breaks = NULL;
- }
- }
-}
-
-static void
-calc_ellipsis (ECellTextView *text_view)
-{
- ECellText *ect = E_CELL_TEXT (((ECellView *)text_view)->ecell);
- EFont *font;
-
- font = text_view->font;
- if (font)
- text_view->ellipsis_width =
- e_font_utf8_text_width (font, E_FONT_PLAIN,
- ect->ellipsis ? ect->ellipsis : "...",
- ect->ellipsis ? strlen (ect->ellipsis) : 3);
-}
-
-/* Calculates the line widths (in pixels) of the text's splitted lines */
-static void
-calc_line_widths (CurrentCell *cell)
-{
- ECellTextView *text_view = cell->text_view;
- ECellText *ect = E_CELL_TEXT (((ECellView *)text_view)->ecell);
- ECellTextLineBreaks *linebreaks = cell->breaks;
- struct line *lines;
- int i;
- int j;
- EFont *font;
-
- font = text_view->font;
-
- lines = linebreaks->lines;
- linebreaks->max_width = 0;
-
- if (!lines) return;
-
- for (i = 0; i < linebreaks->num_lines; i++) {
- if (lines->length != 0) {
- if (font) {
- lines->width = e_font_utf8_text_width (font, E_FONT_PLAIN,
- lines->text, lines->length);
- lines->ellipsis_length = 0;
- } else {
- lines->width = 0;
- }
-
- if (ect->use_ellipsis &&
- (!(text_view->edit &&
- cell->row == text_view->edit->cell.row &&
- cell->view_col == text_view->edit->cell.view_col)) &&
- lines->width > cell->width) {
- if (font) {
- lines->ellipsis_length = 0;
- for (j = 0; j < lines->length; j++){
- if (e_font_utf8_text_width (font, E_FONT_PLAIN, lines->text, j) +
- text_view->ellipsis_width <= cell->width)
- lines->ellipsis_length = j;
- else
- break;
- }
- }
- else
- lines->ellipsis_length = 0;
- lines->width = e_font_utf8_text_width (font, E_FONT_PLAIN, lines->text, lines->ellipsis_length) +
- text_view->ellipsis_width;
- }
- else
- lines->ellipsis_length = lines->length;
-
- if (lines->width > linebreaks->max_width)
- linebreaks->max_width = lines->width;
- } else {
- lines->width = 0;
- lines->ellipsis_length = 0;
- }
-
- lines++;
- }
-}
-
-static void
-build_current_cell (CurrentCell *cell, ECellTextView *text_view, int model_col, int view_col, int row)
-{
- ECellView *ecell_view = (ECellView *) text_view;
- ECellText *ect = E_CELL_TEXT (ecell_view->ecell);
-
- cell->text_view = text_view;
- cell->model_col = model_col;
- cell->view_col = view_col;
- cell->row = row;
- cell->breaks = NULL;
-
- if (ect->filter) {
- cell->text = (*ect->filter)(e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- } else {
- cell->text = g_strdup (e_table_model_value_at (ecell_view->e_table_model, model_col, row));
- }
- cell->width = e_table_header_get_column (
- ((ETableItem *)ecell_view->e_table_item_view)->header,
- view_col)->width - 8;
-}
-
-static void
-unbuild_current_cell (CurrentCell *cell)
-{
- g_free(cell->text);
- cell->text = NULL;
-}
-
-
-static GdkColor*
-e_cell_text_get_color (ECellTextView *cell_view, gchar *color_spec)
-{
- ECellText *ect = E_CELL_TEXT (((ECellView*) cell_view)->ecell);
- GdkColormap *colormap;
- GdkColor *color, tmp_color;
-
- /* If the color spec is NULL we use the default color. */
- if (color_spec == NULL)
- return NULL;
-
- /* Create the hash table if we haven't already. */
- if (!ect->colors)
- ect->colors = g_hash_table_new (g_str_hash, g_str_equal);
-
- /* See if we've already allocated the color. Note that we use a
- special value of (GdkColor*) 1 in the hash to indicate that we've
- already tried and failed to allocate the color, so we don't keep
- trying to allocate it. */
- color = g_hash_table_lookup (ect->colors, color_spec);
- if (color == (GdkColor*) 1)
- return NULL;
- if (color)
- return color;
-
- /* Try to parse the color. */
- if (gdk_color_parse (color_spec, &tmp_color)) {
- colormap = gtk_widget_get_colormap (GTK_WIDGET (cell_view->canvas));
-
- /* Try to allocate the color. */
- if (gdk_color_alloc (colormap, &tmp_color))
- color = gdk_color_copy (&tmp_color);
- }
-
- g_hash_table_insert (ect->colors, g_strdup (color_spec),
- color ? color : (GdkColor*) 1);
- return color;
-}
-
diff --git a/widgets/table/e-cell-text.h b/widgets/table/e-cell-text.h
deleted file mode 100644
index e0296998b3..0000000000
--- a/widgets/table/e-cell-text.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ECellText - Text item for e-table.
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * Drawing and event handling from:
- *
- * EText - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-#ifndef _E_CELL_TEXT_H_
-#define _E_CELL_TEXT_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-cell.h"
-
-/* Should return a malloced object. */
-typedef char *(*ECellTextFilter) (const void *);
-
-#define E_CELL_TEXT_TYPE (e_cell_text_get_type ())
-#define E_CELL_TEXT(o) (GTK_CHECK_CAST ((o), E_CELL_TEXT_TYPE, ECellText))
-#define E_CELL_TEXT_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_TEXT_TYPE, ECellTextClass))
-#define E_IS_CELL_TEXT(o) (GTK_CHECK_TYPE ((o), E_CELL_TEXT_TYPE))
-#define E_IS_CELL_TEXT_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_TEXT_TYPE))
-
-typedef struct {
- ECell parent;
-
- GtkJustification justify;
- char *font_name;
-
- double x, y; /* Position at anchor */
-
- gulong pixel; /* Fill color */
-
- /* Clip handling */
- char *ellipsis; /* The ellipsis characters. NULL = "...". */
-
- guint use_ellipsis : 1; /* Whether to use the ellipsis. */
-
- int strikeout_column;
- int bold_column;
-
- /* This column in the ETable should return a string specifying a color,
- either a color name like "red" or a color spec like "rgb:F/0/0".
- See the XParseColor man page for the formats available. */
- int color_column;
-
- ECellTextFilter filter;
-
- /* This stores the colors we have allocated. */
- GHashTable *colors;
-} ECellText;
-
-typedef struct {
- ECellClass parent_class;
-} ECellTextClass;
-
-GtkType e_cell_text_get_type (void);
-ECell *e_cell_text_new (ETableModel *model, const char *fontname, GtkJustification justify);
-
-#endif /* _E_CELL_TEXT_H_ */
-
-
diff --git a/widgets/table/e-cell-toggle.c b/widgets/table/e-cell-toggle.c
deleted file mode 100644
index 1be01348db..0000000000
--- a/widgets/table/e-cell-toggle.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * e-cell-toggle.c: Multi-state image toggle cell object.
- *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- *
- * (C) 1999, 2000 Helix Code, Inc
- */
-#include <config.h>
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomeui/gnome-canvas.h>
-#include "e-cell-toggle.h"
-#include "e-util/e-util.h"
-#include "e-table-item.h"
-
-#define PARENT_TYPE e_cell_get_type ()
-
-typedef struct {
- ECellView cell_view;
- GdkGC *gc;
- GnomeCanvas *canvas;
-} ECellToggleView;
-
-static ECellClass *parent_class;
-
-static void
-etog_queue_redraw (ECellToggleView *text_view, int view_col, int view_row)
-{
- e_table_item_redraw_range (
- text_view->cell_view.e_table_item_view,
- view_col, view_row, view_col, view_row);
-}
-
-/*
- * ECell::realize method
- */
-static ECellView *
-etog_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
- ECellToggleView *toggle_view = g_new0 (ECellToggleView, 1);
- ETableItem *eti = E_TABLE_ITEM (e_table_item_view);
- GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
-
- toggle_view->cell_view.ecell = ecell;
- toggle_view->cell_view.e_table_model = table_model;
- toggle_view->cell_view.e_table_item_view = e_table_item_view;
- toggle_view->canvas = canvas;
-
- return (ECellView *) toggle_view;
-}
-
-static void
-etog_kill_view (ECellView *ecell_view)
-{
- g_free (ecell_view);
-}
-
-static void
-etog_realize (ECellView *ecell_view)
-{
- ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-
- toggle_view->gc = gdk_gc_new (GTK_WIDGET (toggle_view->canvas)->window);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-etog_unrealize (ECellView *ecv)
-{
- ECellToggleView *toggle_view = (ECellToggleView *) ecv;
-
- gdk_gc_unref (toggle_view->gc);
- toggle_view->gc = NULL;
-}
-
-/*
- * ECell::draw method
- */
-static void
-etog_draw (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row, gboolean selected,
- int x1, int y1, int x2, int y2)
-{
- ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
-#if 0
- ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-#endif
- GdkPixbuf *image;
- int x, y, width, height;
-
- const int value = GPOINTER_TO_INT (
- e_table_model_value_at (ecell_view->e_table_model, model_col, row));
-
- if (value >= toggle->n_states){
- g_warning ("Value from the table model is %d, the states we support are [0..%d)\n",
- value, toggle->n_states);
- return;
- }
-
- image = toggle->images [value];
-
- if ((x2 - x1) < gdk_pixbuf_get_width (image)){
- x = x1;
- width = x2 - x1;
- } else {
- x = x1 + ((x2 - x1) - gdk_pixbuf_get_width (image)) / 2;
- width = gdk_pixbuf_get_width (image);
- }
-
- if ((y2 - y1) < gdk_pixbuf_get_height (image)){
- y = y1;
- height = y2 - y1;
- } else {
- y = y1 + ((y2 - y1) - gdk_pixbuf_get_height (image)) / 2;
- height = gdk_pixbuf_get_height (image);
- }
-
-#if 0 /* do alpha */
- if (gdk_pixbuf_get_has_alpha (image)) {
- flat = gdk_pixbuf_composite_color_simple (
- image,
- gdk_pixbuf_get_width (image),
- gdk_pixbuf_get_height (image),
- GDK_INTERP_NEAREST,
- 255,
- 32,
- 0xffffff, 0xffffff);
-
- gdk_pixbuf_render_to_drawable (flat, drawable,
- toggle_view->gc,
- 0, 0,
- x, y,
- width, height,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- gdk_pixbuf_unref (flat);
- } else {
- gdk_pixbuf_render_to_drawable (image, drawable,
- toggle_view->gc,
- 0, 0,
- x, y,
- width, height,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- }
-#else
- gdk_pixbuf_render_to_drawable_alpha (image, drawable,
- 0, 0,
- x, y,
- width, height,
- GDK_PIXBUF_ALPHA_BILEVEL,
- 128,
- GDK_RGB_DITHER_NORMAL,
- x, y);
-#endif
-}
-
-static void
-etog_set_value (ECellToggleView *toggle_view, int model_col, int view_col, int row, int value)
-{
- ECell *ecell = toggle_view->cell_view.ecell;
- ECellToggle *toggle = E_CELL_TOGGLE (ecell);
-
- if (value >= toggle->n_states)
- value = 0;
-
- e_table_model_set_value_at (toggle_view->cell_view.e_table_model,
- model_col, row, GINT_TO_POINTER (value));
- etog_queue_redraw (toggle_view, view_col, row);
-}
-
-/*
- * ECell::event method
- */
-static gint
-etog_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
-{
- ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
- void *_value = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
- const int value = GPOINTER_TO_INT (_value);
-
- switch (event->type){
- case GDK_BUTTON_RELEASE:
- if (!e_table_model_is_cell_editable(ecell_view->e_table_model, model_col, row))
- return FALSE;
-
- etog_set_value (toggle_view, model_col, view_col, row, value + 1);
- return TRUE;
-
- case GDK_KEY_PRESS:
- if (!e_table_model_is_cell_editable(ecell_view->e_table_model, model_col, row))
- return FALSE;
-
- if (event->key.keyval == GDK_space){
- etog_set_value (toggle_view, model_col, view_col, row, value + 1);
- return TRUE;
- }
- return FALSE;
-
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-/*
- * ECell::height method
- */
-static int
-etog_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
-
- return toggle->height;
-}
-
-static void
-etog_destroy (GtkObject *object)
-{
- ECellToggle *etog = E_CELL_TOGGLE (object);
- int i;
-
- for (i = 0; i < etog->n_states; i++)
- gdk_pixbuf_unref (etog->images [i]);
-
- g_free (etog->images);
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-static void
-e_cell_toggle_class_init (GtkObjectClass *object_class)
-{
- ECellClass *ecc = (ECellClass *) object_class;
-
- object_class->destroy = etog_destroy;
-
- ecc->new_view = etog_new_view;
- ecc->kill_view = etog_kill_view;
- ecc->realize = etog_realize;
- ecc->unrealize = etog_unrealize;
- ecc->draw = etog_draw;
- ecc->event = etog_event;
- ecc->height = etog_height;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-}
-
-E_MAKE_TYPE(e_cell_toggle, "ECellToggle", ECellToggle, e_cell_toggle_class_init, NULL, PARENT_TYPE);
-
-void
-e_cell_toggle_construct (ECellToggle *etog, int border, int n_states, GdkPixbuf **images)
-{
- int max_height = 0;
- int i;
-
- etog->border = border;
- etog->n_states = n_states;
-
- etog->images = g_new (GdkPixbuf *, n_states);
-
- for (i = 0; i < n_states; i++){
- etog->images [i] = images [i];
- gdk_pixbuf_ref (images [i]);
-
- if (gdk_pixbuf_get_height (images [i]) > max_height)
- max_height = gdk_pixbuf_get_height (images [i]);
- }
-
- etog->height = max_height;
-}
-
-ECell *
-e_cell_toggle_new (int border, int n_states, GdkPixbuf **images)
-{
- ECellToggle *etog = gtk_type_new (e_cell_toggle_get_type ());
-
- e_cell_toggle_construct (etog, border, n_states, images);
-
- return (ECell *) etog;
-}
-
-
diff --git a/widgets/table/e-cell-toggle.h b/widgets/table/e-cell-toggle.h
deleted file mode 100644
index d5773b454a..0000000000
--- a/widgets/table/e-cell-toggle.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef _E_CELL_TOGGLE_H_
-#define _E_CELL_TOGGLE_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include "e-cell.h"
-
-#define E_CELL_TOGGLE_TYPE (e_cell_toggle_get_type ())
-#define E_CELL_TOGGLE(o) (GTK_CHECK_CAST ((o), E_CELL_TOGGLE_TYPE, ECellToggle))
-#define E_CELL_TOGGLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_TOGGLE_TYPE, ECellToggleClass))
-#define E_IS_CELL_TOGGLE(o) (GTK_CHECK_TYPE ((o), E_CELL_TOGGLE_TYPE))
-#define E_IS_CELL_TOGGLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_TOGGLE_TYPE))
-
-typedef struct {
- ECell parent;
-
- int border;
- int n_states;
- GdkPixbuf **images;
-
- int height;
-} ECellToggle;
-
-typedef struct {
- ECellClass parent_class;
-} ECellToggleClass;
-
-GtkType e_cell_toggle_get_type (void);
-ECell *e_cell_toggle_new (int border, int n_states, GdkPixbuf **images);
-void e_cell_toggle_construct (ECellToggle *etog, int border,
- int n_states, GdkPixbuf **images);
-
-#endif /* _E_CELL_TOGGLE_H_ */
-
-
diff --git a/widgets/table/e-cell-tree.c b/widgets/table/e-cell-tree.c
deleted file mode 100644
index d4106271e6..0000000000
--- a/widgets/table/e-cell-tree.c
+++ /dev/null
@@ -1,542 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-cell-tree.c - Tree cell renderer
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Toshok <toshok@helixcode.com>
- *
- * A majority of code taken from:
- *
- * the ECellText renderer.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- */
-
-#include <config.h>
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkinvisible.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <stdio.h>
-#include "e-table-sorted-variable.h"
-#include "e-tree-model.h"
-#include "e-cell-tree.h"
-#include "e-util/e-util.h"
-#include "e-table-item.h"
-
-#include <gdk/gdkx.h> /* for BlackPixel */
-#include <ctype.h>
-#include <math.h>
-
-#define PARENT_TYPE e_cell_get_type ()
-
-typedef struct {
- ECellView cell_view;
- ECellView *subcell_view;
- GdkGC *gc;
-
- GnomeCanvas *canvas;
-
-} ECellTreeView;
-
-static ECellClass *parent_class;
-
-#define INDENT_AMOUNT 16
-
-static int
-visible_depth_of_node (ETreeModel *tree_model, ETreePath *path)
-{
- return (e_tree_model_node_depth (tree_model, path)
- - (e_tree_model_root_node_is_visible (tree_model) ? 0 : 1));
-}
-
-static gint
-offset_of_node (ETreeModel *tree_model, ETreePath *path)
-{
- return (visible_depth_of_node(tree_model, path) + 1) * INDENT_AMOUNT;
-}
-
-static ETreePath*
-e_cell_tree_get_node (ETreeModel *tree_model, int row)
-{
- return (ETreePath*)e_table_model_value_at (E_TABLE_MODEL(tree_model), -1, row);
-}
-
-static ETreeModel*
-e_cell_tree_get_tree_model (ETableModel *table_model, int row)
-{
- return (ETreeModel*)e_table_model_value_at (table_model, -2, row);
-}
-
-/*
- * ECell::new_view method
- */
-static ECellView *
-ect_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
- ECellTree *ect = E_CELL_TREE (ecell);
- ECellTreeView *tree_view = g_new0 (ECellTreeView, 1);
- GnomeCanvas *canvas = GNOME_CANVAS_ITEM (e_table_item_view)->canvas;
-
- tree_view->cell_view.ecell = ecell;
- tree_view->cell_view.e_table_model = table_model;
- tree_view->cell_view.e_table_item_view = e_table_item_view;
-
- /* create our subcell view */
- tree_view->subcell_view = e_cell_new_view (ect->subcell, table_model, e_table_item_view /* XXX */);
-
- tree_view->canvas = canvas;
-
- return (ECellView *)tree_view;
-}
-
-/*
- * ECell::kill_view method
- */
-static void
-ect_kill_view (ECellView *ecv)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecv;
-
- /* kill our subcell view */
- e_cell_kill_view (tree_view->subcell_view);
-
- g_free (tree_view);
-}
-
-/*
- * ECell::realize method
- */
-static void
-ect_realize (ECellView *ecell_view)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
- /* realize our subcell view */
- e_cell_realize (tree_view->subcell_view);
-
- tree_view->gc = gdk_gc_new (GTK_WIDGET (tree_view->canvas)->window);
-
- gdk_gc_set_line_attributes (tree_view->gc, 1,
- GDK_LINE_ON_OFF_DASH, None, None);
- gdk_gc_set_dashes (tree_view->gc, 0, "\1\1", 2);
-
- if (parent_class->realize)
- (* parent_class->realize) (ecell_view);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-ect_unrealize (ECellView *ecv)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecv;
-
- /* unrealize our subcell view. */
- e_cell_unrealize (tree_view->subcell_view);
-
- gdk_gc_unref (tree_view->gc);
- tree_view->gc = NULL;
-
- if (parent_class->unrealize)
- (* parent_class->unrealize) (ecv);
-}
-
-/*
- * ECell::draw method
- */
-static void
-ect_draw (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row, gboolean selected,
- int x1, int y1, int x2, int y2)
-{
- ECellTreeView *tree_view = (ECellTreeView *)ecell_view;
- ETreeModel *tree_model = e_cell_tree_get_tree_model(ecell_view->e_table_model, row);
- ETreePath *node;
- GdkRectangle rect, *clip_rect;
- GtkWidget *canvas = GTK_WIDGET (tree_view->canvas);
- GdkGC *fg_gc = canvas->style->fg_gc[GTK_STATE_ACTIVE];
- GdkColor *foreground;
-
- int offset, subcell_offset;
- gboolean expanded, expandable;
-
- /* only draw the tree effects if we're the active sort */
- if (/* XXX */ TRUE) {
- GdkPixbuf *node_image;
- int node_image_width = 0, node_image_height = 0;
- ETreePath *parent_node;
-
- node = e_cell_tree_get_node (tree_model, row);
-
- offset = offset_of_node (tree_model, node);
- expandable = e_tree_model_node_is_expandable (tree_model, node);
- expanded = e_tree_model_node_is_expanded (tree_model, node);
- subcell_offset = offset;
-
- node_image = e_tree_model_icon_of_node (tree_model, node);
-
- if (node_image) {
- node_image_width = gdk_pixbuf_get_width (node_image);
- node_image_height = gdk_pixbuf_get_height (node_image);
- }
-
- /*
- * Be a nice citizen: clip to the region we are supposed to draw on
- */
- rect.x = x1;
- rect.y = y1;
- rect.width = subcell_offset + node_image_width;
- rect.height = y2 - y1;
-
- gdk_gc_set_clip_rectangle (tree_view->gc, &rect);
- gdk_gc_set_clip_rectangle (fg_gc, &rect);
- clip_rect = &rect;
-
- if (selected) {
- foreground = &canvas->style->text [GTK_STATE_SELECTED];
- } else {
- foreground = &canvas->style->text [GTK_STATE_NORMAL];
- }
-
- gdk_gc_set_foreground (tree_view->gc, foreground);
-
- /* draw our lines */
- if (E_CELL_TREE(tree_view->cell_view.ecell)->draw_lines) {
-
- if (visible_depth_of_node (tree_model, node) > 0
- || e_tree_model_node_get_children (tree_model, node, NULL) > 0)
- gdk_draw_line (drawable, tree_view->gc,
- rect.x + offset - INDENT_AMOUNT / 2 + 1,
- rect.y + rect.height / 2,
- rect.x + offset,
- rect.y + rect.height / 2);
-
- if (visible_depth_of_node (tree_model, node) != 0) {
- gdk_draw_line (drawable, tree_view->gc,
- rect.x + offset - INDENT_AMOUNT / 2,
- rect.y,
- rect.x + offset - INDENT_AMOUNT / 2,
- (e_tree_model_node_get_next (tree_model, node)
- ? rect.y + rect.height
- : rect.y + rect.height / 2));
- }
-
- /* now traverse back up to the root of the tree, checking at
- each level if the node has siblings, and drawing the
- correct vertical pipe for it's configuration. */
- parent_node = e_tree_model_node_get_parent (tree_model, node);
- offset -= INDENT_AMOUNT;
- while (parent_node && visible_depth_of_node (tree_model, parent_node) != 0) {
- if (e_tree_model_node_get_next(tree_model, parent_node)) {
- gdk_draw_line (drawable, tree_view->gc,
- rect.x + offset - INDENT_AMOUNT / 2,
- rect.y,
- rect.x + offset - INDENT_AMOUNT / 2,
- rect.y + rect.height);
- }
- parent_node = e_tree_model_node_get_parent (tree_model, parent_node);
- offset -= INDENT_AMOUNT;
- }
- }
-
- /* now draw our icon if we're expandable */
- if (expandable) {
- GdkPixbuf *image;
- int image_width, image_height;
-
- image = (expanded
- ? E_CELL_TREE(tree_view->cell_view.ecell)->open_pixbuf
- : E_CELL_TREE(tree_view->cell_view.ecell)->closed_pixbuf);
-
- image_width = gdk_pixbuf_get_width(image);
- image_height = gdk_pixbuf_get_height(image);
-
- gdk_pixbuf_render_to_drawable_alpha (image,
- drawable,
- 0, 0,
- x1 + subcell_offset - INDENT_AMOUNT / 2 - image_width / 2,
- y1 + (y2 - y1) / 2 - image_height / 2,
- image_width, image_height,
- GDK_PIXBUF_ALPHA_BILEVEL,
- 128,
- GDK_RGB_DITHER_NORMAL,
- image_width, 0);
- }
-
- if (node_image) {
- gdk_pixbuf_render_to_drawable_alpha (node_image,
- drawable,
- 0, 0,
- x1 + subcell_offset,
- y1 + (y2 - y1) / 2 - node_image_height / 2,
- node_image_width, node_image_height,
- GDK_PIXBUF_ALPHA_BILEVEL,
- 128,
- GDK_RGB_DITHER_NORMAL,
- node_image_width, 0);
- subcell_offset += node_image_width;
- }
- }
-
- /* Now cause our subcell to draw its contents, shifted by
- subcell_offset pixels */
- e_cell_draw (tree_view->subcell_view, drawable,
- model_col, view_col, row, selected,
- x1 + subcell_offset, y1, x2, y2);
-}
-
-/*
- * ECell::event method
- */
-static gint
-ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
- ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row);
- ETreePath *node = e_cell_tree_get_node (tree_model, row);
- int offset = offset_of_node (tree_model, node);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS: {
- /* if the event happened in our area of control (and
- we care about it), handle it. */
-
- /* only activate the tree control if the click/release happens in the icon's area. */
- if (event->button.x > (offset - INDENT_AMOUNT) && event->button.x < offset) {
- if (e_tree_model_node_is_expandable (tree_model, node)) {
- e_tree_model_node_set_expanded (tree_model,
- node,
- !e_tree_model_node_is_expanded(tree_model, node));
- }
- return TRUE;
- }
- else if (event->button.x < (offset - INDENT_AMOUNT))
- return TRUE;
- }
- default:
- /* modify the event and pass it off to our subcell_view */
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- event->button.x -= offset;
- break;
- case GDK_MOTION_NOTIFY:
- event->motion.x -= offset;
- break;
- default:
- /* nada */
- }
- e_cell_event(tree_view->subcell_view, event, model_col, view_col, row);
- return TRUE;
- }
-}
-
-/*
- * ECell::height method
- */
-static int
-ect_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
- return e_cell_height (tree_view->subcell_view, model_col, view_col, row);
-}
-
-/*
- * ECellView::enter_edit method
- */
-static void *
-ect_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- /* just defer to our subcell's view */
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
- return e_cell_enter_edit (tree_view->subcell_view, model_col, view_col, row);
-}
-
-/*
- * ECellView::leave_edit method
- */
-static void
-ect_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
- /* just defer to our subcell's view */
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
- e_cell_leave_edit (tree_view->subcell_view, model_col, view_col, row, edit_context);
-}
-
-static void
-ect_print (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width, double height)
-{
- ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
- if (/* XXX only if we're the active sort */ TRUE) {
- ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row);
- ETreePath *node = e_cell_tree_get_node (tree_model, row);
- int offset = offset_of_node (tree_model, node);
- int subcell_offset = offset;
- gboolean expandable = e_tree_model_node_is_expandable (tree_model, node);
- gboolean expanded = e_tree_model_node_is_expanded (tree_model, node);
-
- /* draw our lines */
- if (E_CELL_TREE(tree_view->cell_view.ecell)->draw_lines) {
-
- if (!e_tree_model_node_is_root (tree_model, node)
- || e_tree_model_node_get_children (tree_model, node, NULL) > 0) {
- gnome_print_moveto (context,
- offset - INDENT_AMOUNT / 2,
- height / 2);
-
- gnome_print_lineto (context,
- offset,
- height / 2);
- }
-
- if (visible_depth_of_node (tree_model, node) != 0) {
- gnome_print_moveto (context,
- offset - INDENT_AMOUNT / 2,
- height);
- gnome_print_lineto (context,
- offset - INDENT_AMOUNT / 2,
- (e_tree_model_node_get_next (tree_model, node)
- ? 0
- : height / 2));
- }
-
- /* now traverse back up to the root of the tree, checking at
- each level if the node has siblings, and drawing the
- correct vertical pipe for it's configuration. */
- node = e_tree_model_node_get_parent (tree_model, node);
- offset -= INDENT_AMOUNT;
- while (node && visible_depth_of_node (tree_model, node) != 0) {
- if (e_tree_model_node_get_next(tree_model, node)) {
- gnome_print_moveto (context,
- offset - INDENT_AMOUNT / 2,
- height);
- gnome_print_lineto (context,
- offset - INDENT_AMOUNT / 2,
- 0);
- }
- node = e_tree_model_node_get_parent (tree_model, node);
- offset -= INDENT_AMOUNT;
- }
- }
-
- /* now draw our icon if we're expandable */
- if (expandable) {
- double image_matrix [6] = {16, 0, 0, 16, 0, 0};
- GdkPixbuf *image = (expanded
- ? E_CELL_TREE(tree_view->cell_view.ecell)->open_pixbuf
- : E_CELL_TREE(tree_view->cell_view.ecell)->closed_pixbuf);
- int image_width, image_height, image_rowstride;
- guchar *image_pixels;
-
- image_width = gdk_pixbuf_get_width(image);
- image_height = gdk_pixbuf_get_height(image);
- image_pixels = gdk_pixbuf_get_pixels(image);
- image_rowstride = gdk_pixbuf_get_rowstride(image);
-
- image_matrix [4] = subcell_offset - INDENT_AMOUNT / 2 - image_width / 2;
- image_matrix [5] = height / 2 - image_height / 2;
-
- gnome_print_gsave (context);
- gnome_print_concat (context, image_matrix);
-
- gnome_print_rgbaimage (context, image_pixels, image_width, image_height, image_rowstride);
- gnome_print_grestore (context);
- }
-
- gnome_print_stroke (context);
-
- if (gnome_print_translate(context, subcell_offset, 0) == -1)
- /* FIXME */;
- width -= subcell_offset;
- }
-
-
- e_cell_print (tree_view->subcell_view, context, model_col, view_col, row, width, height);
-}
-
-static gdouble
-ect_print_height (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width)
-{
- return 12; /* XXX */
-}
-
-/*
- * GtkObject::destroy method
- */
-static void
-ect_destroy (GtkObject *object)
-{
- ECellTree *ect = E_CELL_TREE (object);
-
- /* destroy our subcell */
- gtk_object_destroy (GTK_OBJECT (ect->subcell));
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-static void
-e_cell_tree_class_init (GtkObjectClass *object_class)
-{
- ECellClass *ecc = (ECellClass *) object_class;
-
- object_class->destroy = ect_destroy;
-
- ecc->new_view = ect_new_view;
- ecc->kill_view = ect_kill_view;
- ecc->realize = ect_realize;
- ecc->unrealize = ect_unrealize;
- ecc->draw = ect_draw;
- ecc->event = ect_event;
- ecc->height = ect_height;
- ecc->enter_edit = ect_enter_edit;
- ecc->leave_edit = ect_leave_edit;
- ecc->print = ect_print;
- ecc->print_height = ect_print_height;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-}
-
-E_MAKE_TYPE(e_cell_tree, "ECellTree", ECellTree, e_cell_tree_class_init, NULL, PARENT_TYPE);
-
-void
-e_cell_tree_construct (ECellTree *ect,
- GdkPixbuf *open_pixbuf,
- GdkPixbuf *closed_pixbuf,
- gboolean draw_lines,
- ECell *subcell)
-{
- ect->subcell = subcell;
- ect->open_pixbuf = open_pixbuf;
- ect->closed_pixbuf = closed_pixbuf;
- ect->draw_lines = draw_lines;
-}
-
-
-ECell *
-e_cell_tree_new (ETableModel *etm,
- GdkPixbuf *open_pixbuf,
- GdkPixbuf *closed_pixbuf,
- gboolean draw_lines,
- ECell *subcell)
-{
- ECellTree *ect = gtk_type_new (e_cell_tree_get_type ());
-
- e_cell_tree_construct (ect, open_pixbuf, closed_pixbuf, draw_lines, subcell);
-
- return (ECell *) ect;
-}
diff --git a/widgets/table/e-cell-tree.h b/widgets/table/e-cell-tree.h
deleted file mode 100644
index ef6babeda4..0000000000
--- a/widgets/table/e-cell-tree.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ECellTree - Tree item for e-table.
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Toshok <toshok@helixcode.com>
- *
- */
-#ifndef _E_CELL_TREE_H_
-#define _E_CELL_TREE_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-cell.h"
-
-#define E_CELL_TREE_TYPE (e_cell_tree_get_type ())
-#define E_CELL_TREE(o) (GTK_CHECK_CAST ((o), E_CELL_TREE_TYPE, ECellTree))
-#define E_CELL_TREE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_TREE_TYPE, ECellTreeClass))
-#define E_IS_CELL_TREE(o) (GTK_CHECK_TYPE ((o), E_CELL_TREE_TYPE))
-#define E_IS_CELL_TREE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_TREE_TYPE))
-
-typedef struct {
- ECell parent;
-
- gboolean draw_lines;
-
- GdkPixbuf *open_pixbuf;
- GdkPixbuf *closed_pixbuf;
-
- ECell *subcell;
-} ECellTree;
-
-typedef struct {
- ECellClass parent_class;
-} ECellTreeClass;
-
-GtkType e_cell_tree_get_type (void);
-ECell *e_cell_tree_new (ETableModel *model,
- GdkPixbuf *open_pixbuf,
- GdkPixbuf *closed_pixbuf,
- gboolean draw_lines,
- ECell *subcell);
-void e_cell_tree_construct (ECellTree *ect,
- GdkPixbuf *open_pixbuf,
- GdkPixbuf *closed_pixbuf,
- gboolean draw_lines,
- ECell *subcell);
-
-#endif /* _E_CELL_TREE_H_ */
-
-
diff --git a/widgets/table/e-cell.c b/widgets/table/e-cell.c
deleted file mode 100644
index 75be2ce916..0000000000
--- a/widgets/table/e-cell.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell.c: base class for cell renderers in e-table
- *
- * Author:
- * Miguel de Icaza (miguel@kernel.org)
- *
- * (C) 1999 Helix Code, Inc
- */
-#include <config.h>
-#include "e-cell.h"
-#include "e-util/e-util.h"
-
-#define PARENT_TYPE gtk_object_get_type ()
-
-static ECellView *
-ec_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
- return NULL;
-}
-
-static void
-ec_realize (ECellView *e_cell)
-{
-}
-
-static void
-ec_kill_view (ECellView *ecell_view)
-{
-}
-
-static void
-ec_unrealize (ECellView *e_cell)
-{
-}
-
-static void
-ec_draw (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row, gboolean selected,
- int x1, int y1, int x2, int y2)
-{
- g_error ("e-cell-draw invoked\n");
-}
-
-static gint
-ec_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
-{
- g_error ("e-cell-event invoked\n");
- return 0;
-}
-
-static gint
-ec_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- g_error ("e-cell-event invoked\n");
- return 0;
-}
-
-static void
-ec_focus (ECellView *ecell_view, int model_col, int view_col, int row, int x1, int y1, int x2, int y2)
-{
- ecell_view->focus_col = view_col;
- ecell_view->focus_row = row;
- ecell_view->focus_x1 = x1;
- ecell_view->focus_y1 = y1;
- ecell_view->focus_x2 = x2;
- ecell_view->focus_y2 = y2;
-}
-
-static void
-ec_unfocus (ECellView *ecell_view)
-{
- ecell_view->focus_col = -1;
- ecell_view->focus_row = -1;
- ecell_view->focus_x1 = -1;
- ecell_view->focus_y1 = -1;
- ecell_view->focus_x2 = -1;
- ecell_view->focus_y2 = -1;
-}
-
-static void *
-ec_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- return NULL;
-}
-
-static void
-ec_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *context)
-{
-}
-
-static void
-e_cell_class_init (GtkObjectClass *object_class)
-{
- ECellClass *ecc = (ECellClass *) object_class;
-
- ecc->realize = ec_realize;
- ecc->unrealize = ec_unrealize;
- ecc->new_view = ec_new_view;
- ecc->kill_view = ec_kill_view;
- ecc->draw = ec_draw;
- ecc->event = ec_event;
- ecc->focus = ec_focus;
- ecc->unfocus = ec_unfocus;
- ecc->height = ec_height;
- ecc->enter_edit = ec_enter_edit;
- ecc->leave_edit = ec_leave_edit;
- ecc->print = NULL;
- ecc->print_height = NULL;
-}
-
-static void
-e_cell_init (GtkObject *object)
-{
-}
-
-E_MAKE_TYPE(e_cell, "ECell", ECell, e_cell_class_init, e_cell_init, PARENT_TYPE);
-
-
-void
-e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->event (
- ecell_view, event, model_col, view_col, row);
-}
-
-ECellView *
-e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
- return E_CELL_CLASS (GTK_OBJECT (ecell)->klass)->new_view (
- ecell, table_model, e_table_item_view);
-}
-
-void
-e_cell_realize (ECellView *ecell_view)
-{
- return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->realize (ecell_view);
-}
-
-void
-e_cell_kill_view (ECellView *ecell_view)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->kill_view (ecell_view);
-}
-
-void
-e_cell_unrealize (ECellView *ecell_view)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->unrealize (ecell_view);
-}
-
-void
-e_cell_draw (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row, gboolean selected, int x1, int y1, int x2, int y2)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->draw (
- ecell_view, drawable, model_col, view_col, row, selected, x1, y1, x2, y2);
-}
-
-void
-e_cell_print (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width, double height)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print
- (ecell_view, context, model_col, view_col, row, width, height);
-}
-
-gdouble
-e_cell_print_height (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width)
-{
- if (E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print_height)
- return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print_height
- (ecell_view, context, model_col, view_col, row, width);
- else
- return 0.0;
-}
-
-int
-e_cell_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->height (
- ecell_view, model_col, view_col, row);
-}
-
-void *
-e_cell_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
- return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->enter_edit (
- ecell_view, model_col, view_col, row);
-}
-
-void
-e_cell_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
- E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->leave_edit (
- ecell_view, model_col, view_col, row, edit_context);
-}
diff --git a/widgets/table/e-cell.h b/widgets/table/e-cell.h
deleted file mode 100644
index 40b257f264..0000000000
--- a/widgets/table/e-cell.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_CELL_H_
-#define _E_CELL_H_
-
-#include <gdk/gdktypes.h>
-#include <libgnomeprint/gnome-print.h>
-#include "e-table-model.h"
-
-#define E_CELL_TYPE (e_cell_get_type ())
-#define E_CELL(o) (GTK_CHECK_CAST ((o), E_CELL_TYPE, ECell))
-#define E_CELL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_TYPE, ECellClass))
-#define E_IS_CELL(o) (GTK_CHECK_TYPE ((o), E_CELL_TYPE))
-#define E_IS_CELL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_TYPE))
-
-typedef struct _ECell ECell;
-typedef struct _ECellView ECellView;
-
-struct _ECell {
- GtkObject object;
-};
-
-struct _ECellView {
- ECell *ecell;
- ETableModel *e_table_model;
- void *e_table_item_view;
-
- gint focus_x1, focus_y1, focus_x2, focus_y2;
- gint focus_col, focus_row;
-};
-
-#define E_CELL_IS_FOCUSED(ecell_view) (ecell_view->focus_x1 != -1)
-
-typedef struct {
- GtkObjectClass parent_class;
-
- ECellView *(*new_view) (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
- void (*kill_view) (ECellView *ecell_view);
-
- void (*realize) (ECellView *ecell_view);
- void (*unrealize) (ECellView *ecell_view);
-
- void (*draw) (ECellView *ecell_view, GdkDrawable *drawable,
- int model_col, int view_col, int row,
- gboolean selected, int x1, int y1, int x2, int y2);
- gint (*event) (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
- void (*focus) (ECellView *ecell_view, int model_col, int view_col,
- int row, int x1, int y1, int x2, int y2);
- void (*unfocus) (ECellView *ecell_view);
- int (*height) (ECellView *ecell_view, int model_col, int view_col, int row);
-
- void *(*enter_edit) (ECellView *ecell_view, int model_col, int view_col, int row);
- void (*leave_edit) (ECellView *ecell_view, int model_col, int view_col, int row, void *context);
- void (*print) (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- gdouble width, gdouble height);
- gdouble (*print_height) (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row, gdouble width);
-} ECellClass;
-
-GtkType e_cell_get_type (void);
-ECellView *e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
-void e_cell_kill_view (ECellView *ecell_view);
-
-void e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
-
-void e_cell_realize (ECellView *ecell_view);
-void e_cell_unrealize (ECellView *ecell_view);
-
-void e_cell_draw (ECellView *ecell_view, GdkDrawable *dr,
- int model_col, int view_col, int row, gboolean selected,
- int x1, int y1, int x2, int y2);
-void e_cell_print (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row,
- double width, double height);
-gdouble e_cell_print_height (ECellView *ecell_view, GnomePrintContext *context,
- int model_col, int view_col, int row, gdouble width);
-void e_cell_focus (ECellView *ecell_view, int model_col, int view_col, int row,
- int x1, int y1, int x2, int y2);
-void e_cell_unfocus (ECellView *ecell_view);
-int e_cell_height (ECellView *ecell_view, int model_col, int view_col, int row);
-
-void *e_cell_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row);
-void e_cell_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context);
-
-#endif /* _E_CELL_H_ */
diff --git a/widgets/table/e-table-click-to-add.c b/widgets/table/e-table-click-to-add.c
deleted file mode 100644
index ba38078b2c..0000000000
--- a/widgets/table/e-table-click-to-add.c
+++ /dev/null
@@ -1,504 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-click-to-add.c: A canvas item based view of the ETableColumn.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <libgnomeui/gnome-canvas-util.h>
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "e-table-header.h"
-#include "e-table-click-to-add.h"
-#include "e-table-defines.h"
-#include "e-table-one.h"
-#include "widgets/e-text/e-text.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-canvas-utils.h"
-
-enum {
- CURSOR_CHANGE,
- LAST_SIGNAL
-};
-
-static gint etcta_signals [LAST_SIGNAL] = { 0, };
-
-#define PARENT_OBJECT_TYPE gnome_canvas_group_get_type ()
-
-#define ELEMENTS(x) (sizeof (x) / sizeof (x[0]))
-
-static GnomeCanvasGroupClass *etcta_parent_class;
-
-enum {
- ARG_0,
- ARG_HEADER,
- ARG_MODEL,
- ARG_MESSAGE,
- ARG_WIDTH,
- ARG_HEIGHT,
-};
-
-static void
-etcta_cursor_change (GtkObject *object, gint row, gint col, ETableClickToAdd *etcta)
-{
- gtk_signal_emit (GTK_OBJECT (etcta),
- etcta_signals [CURSOR_CHANGE],
- row, col);
-}
-
-static void
-etcta_add_table_header (ETableClickToAdd *etcta, ETableHeader *header)
-{
- etcta->eth = header;
- if (etcta->eth)
- gtk_object_ref (GTK_OBJECT (etcta->eth));
- if (etcta->row)
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(etcta->row),
- "ETableHeader", header,
- NULL);
-}
-
-static void
-etcta_drop_table_header (ETableClickToAdd *etcta)
-{
- GtkObject *header;
-
- if (!etcta->eth)
- return;
-
- header = GTK_OBJECT (etcta->eth);
-
- gtk_object_unref (header);
- etcta->eth = NULL;
-}
-
-static void
-etcta_add_one (ETableClickToAdd *etcta, ETableModel *one)
-{
- etcta->one = one;
- if (etcta->one)
- gtk_object_ref (GTK_OBJECT(etcta->one));
- if (etcta->row)
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(etcta->row),
- "ETableModel", one,
- NULL);
- gtk_object_set(GTK_OBJECT(etcta->selection),
- "model", one,
- NULL);
-}
-
-static void
-etcta_drop_one (ETableClickToAdd *etcta)
-{
- if (!etcta->one)
- return;
- gtk_object_unref (GTK_OBJECT(etcta->one));
- etcta->one = NULL;
- gtk_object_set(GTK_OBJECT(etcta->selection),
- "model", NULL,
- NULL);
-}
-
-static void
-etcta_add_model (ETableClickToAdd *etcta, ETableModel *model)
-{
- etcta->model = model;
- if (etcta->model)
- gtk_object_ref (GTK_OBJECT(etcta->model));
-}
-
-static void
-etcta_drop_model (ETableClickToAdd *etcta)
-{
- etcta_drop_one (etcta);
- if (!etcta->model)
- return;
- gtk_object_unref (GTK_OBJECT(etcta->model));
- etcta->model = NULL;
-}
-
-static void
-etcta_add_message (ETableClickToAdd *etcta, char *message)
-{
- etcta->message = g_strdup(message);
-}
-
-static void
-etcta_drop_message (ETableClickToAdd *etcta)
-{
- g_free(etcta->message);
- etcta->message = NULL;
-}
-
-
-static void
-etcta_destroy (GtkObject *object){
- ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (object);
-
- etcta_drop_table_header (etcta);
- etcta_drop_model (etcta);
- etcta_drop_message (etcta);
- gtk_object_unref(GTK_OBJECT(etcta->selection));
-
- if (GTK_OBJECT_CLASS (etcta_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (etcta_parent_class)->destroy) (object);
-}
-
-static void
-etcta_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableClickToAdd *etcta;
-
- item = GNOME_CANVAS_ITEM (o);
- etcta = E_TABLE_CLICK_TO_ADD (o);
-
- switch (arg_id){
- case ARG_HEADER:
- etcta_drop_table_header (etcta);
- etcta_add_table_header (etcta, E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg)));
- break;
- case ARG_MODEL:
- etcta_drop_model (etcta);
- etcta_add_model (etcta, E_TABLE_MODEL(GTK_VALUE_OBJECT (*arg)));
- break;
- case ARG_MESSAGE:
- etcta_drop_message (etcta);
- etcta_add_message (etcta, GTK_VALUE_STRING (*arg));
- break;
- case ARG_WIDTH:
- etcta->width = GTK_VALUE_DOUBLE (*arg);
- if (etcta->row)
- gnome_canvas_item_set(etcta->row,
- "minimum_width", etcta->width,
- NULL);
- if (etcta->text)
- gnome_canvas_item_set(etcta->text,
- "width", etcta->width - 4,
- NULL);
- if (etcta->rect)
- gnome_canvas_item_set(etcta->rect,
- "x2", etcta->width - 1,
- NULL);
- break;
- }
- gnome_canvas_item_request_update(item);
-}
-
-static void
-etcta_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableClickToAdd *etcta;
-
- etcta = E_TABLE_CLICK_TO_ADD (o);
-
- switch (arg_id){
- case ARG_HEADER:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etcta->eth);
- break;
- case ARG_MODEL:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etcta->model);
- break;
- case ARG_MESSAGE:
- GTK_VALUE_STRING (*arg) = g_strdup(etcta->message);
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = etcta->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = etcta->height;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-etcta_realize (GnomeCanvasItem *item)
-{
- ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
- etcta->text = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
- e_text_get_type(),
- "text", etcta->message ? etcta->message : "",
- "anchor", GTK_ANCHOR_NW,
- "width", etcta->width - 4,
- NULL);
- e_canvas_item_move_absolute (etcta->text, 2, 2);
- etcta->rect = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) etcta->width - 1,
- "y2", (double) etcta->height - 1,
- "outline_color", "black",
- "fill_color", NULL,
- NULL);
-
- if (GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->realize)
- (*GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->realize)(item);
-}
-
-static void
-etcta_unrealize (GnomeCanvasItem *item)
-{
- if (GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->unrealize)(item);
-}
-
-static double
-etcta_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-/*
- * Handles the events on the ETableClickToAdd, particularly it creates the ETableItem and passes in some events.
- */
-static int
-etcta_event (GnomeCanvasItem *item, GdkEvent *e)
-{
- ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
- int ret_val = TRUE;
-
- switch (e->type){
- case GDK_BUTTON_PRESS:
- if (etcta->text) {
- gtk_object_destroy(GTK_OBJECT(etcta->text));
- etcta->text = NULL;
- }
- if (etcta->rect) {
- gtk_object_destroy(GTK_OBJECT(etcta->rect));
- etcta->rect = NULL;
- }
- if (!etcta->row) {
- ETableModel *one;
-
- one = e_table_one_new(etcta->model);
- etcta_add_one (etcta, one);
- gtk_object_unref(GTK_OBJECT(one));
-
- e_table_selection_model_clear(etcta->selection);
-
- etcta->row = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
- e_table_item_get_type(),
- "ETableHeader", etcta->eth,
- "ETableModel", etcta->one,
- "minimum_width", etcta->width,
- "drawgrid", TRUE,
- "table_selection_model", etcta->selection,
- NULL);
-
- }
- /* Fall through. No break; */
- case GDK_BUTTON_RELEASE:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- if (etcta->row) {
- gnome_canvas_item_i2w (item, &e->button.x, &e->button.y);
- gnome_canvas_item_w2i (etcta->row, &e->button.x, &e->button.y);
- gtk_signal_emit_by_name(GTK_OBJECT(etcta->row), "event", e, &ret_val);
- gnome_canvas_item_i2w (etcta->row, &e->button.x, &e->button.y);
- gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
- }
- break;
-
- case GDK_KEY_PRESS:
- switch (e->key.keyval) {
- case GDK_Return:
- case GDK_KP_Enter:
- case GDK_ISO_Enter:
- case GDK_3270_Enter:
-
- case GDK_Tab:
- case GDK_KP_Tab:
- case GDK_ISO_Left_Tab:
-
- if (etcta->row) {
- ETableModel *one;
-
- e_table_one_commit(E_TABLE_ONE(etcta->one));
- etcta_drop_one (etcta);
- gtk_object_destroy(GTK_OBJECT(etcta->row));
- etcta->row = NULL;
-
- one = e_table_one_new(etcta->model);
- etcta_add_one (etcta, one);
- gtk_object_unref(GTK_OBJECT(one));
-
- e_table_selection_model_clear(etcta->selection);
-
- etcta->row = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
- e_table_item_get_type(),
- "ETableHeader", etcta->eth,
- "ETableModel", etcta->one,
- "minimum_width", etcta->width,
- "drawgrid", TRUE,
- "table_selection_model", etcta->selection,
- NULL);
-
- e_table_item_set_cursor(E_TABLE_ITEM(etcta->row), 0, 0);
- }
- break;
- default:
- break;
- }
-
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-static void
-etcta_reflow (GnomeCanvasItem *item, int flags)
-{
- ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
-
- double old_height = etcta->height;
-
- if (etcta->text) {
- gtk_object_get(GTK_OBJECT(etcta->text),
- "height", &etcta->height,
- NULL);
- etcta->height += 4;
- }
- if (etcta->row) {
- gtk_object_get(GTK_OBJECT(etcta->row),
- "height", &etcta->height,
- NULL);
- }
-
- if (etcta->rect) {
- gtk_object_set(GTK_OBJECT(etcta->rect),
- "y2", etcta->height - 1,
- NULL);
- }
- if (old_height != etcta->height)
- e_canvas_item_request_parent_reflow(item);
-}
-
-static void
-etcta_class_init (ETableClickToAddClass *klass)
-{
- GnomeCanvasItemClass *item_class = GNOME_CANVAS_ITEM_CLASS(klass);
- GtkObjectClass *object_class = GTK_OBJECT_CLASS(klass);
-
- etcta_parent_class = gtk_type_class (PARENT_OBJECT_TYPE);
-
- klass->cursor_change = NULL;
-
- object_class->destroy = etcta_destroy;
- object_class->set_arg = etcta_set_arg;
- object_class->get_arg = etcta_get_arg;
-
- item_class->realize = etcta_realize;
- item_class->unrealize = etcta_unrealize;
- item_class->point = etcta_point;
- item_class->event = etcta_event;
-
- gtk_object_add_arg_type ("ETableClickToAdd::header", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_HEADER);
- gtk_object_add_arg_type ("ETableClickToAdd::model", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_MODEL);
- gtk_object_add_arg_type ("ETableClickToAdd::message", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_MESSAGE);
- gtk_object_add_arg_type ("ETableClickToAdd::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableClickToAdd::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
-
- etcta_signals [CURSOR_CHANGE] =
- gtk_signal_new ("cursor_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClickToAddClass, cursor_change),
- gtk_marshal_NONE__INT_INT,
- GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, etcta_signals, LAST_SIGNAL);
-}
-
-static void
-etcta_init (GnomeCanvasItem *item)
-{
- ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
-
- etcta->one = NULL;
- etcta->model = NULL;
- etcta->eth = NULL;
-
- etcta->message = NULL;
-
- etcta->row = NULL;
- etcta->text = NULL;
- etcta->rect = NULL;
-
- etcta->selection = e_table_selection_model_new();
- gtk_signal_connect(GTK_OBJECT(etcta->selection), "cursor_changed",
- GTK_SIGNAL_FUNC(etcta_cursor_change), etcta);
-
- e_canvas_item_set_reflow_callback(item, etcta_reflow);
-}
-
-GtkType
-e_table_click_to_add_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableClickToAdd",
- sizeof (ETableClickToAdd),
- sizeof (ETableClickToAddClass),
- (GtkClassInitFunc) etcta_class_init,
- (GtkObjectInitFunc) etcta_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_OBJECT_TYPE, &info);
- }
-
- return type;
-}
-
-void
-e_table_click_to_add_commit (ETableClickToAdd *etcta)
-{
- if (etcta->row) {
- e_table_one_commit(E_TABLE_ONE(etcta->one));
- etcta_drop_one (etcta);
- gtk_object_destroy(GTK_OBJECT(etcta->row));
- etcta->row = NULL;
- }
- if (!etcta->text) {
- etcta->text = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
- e_text_get_type(),
- "text", etcta->message ? etcta->message : "",
- "anchor", GTK_ANCHOR_NW,
- "width", etcta->width - 4,
- NULL);
- e_canvas_item_move_absolute (etcta->text, 2, 2);
- }
- if (!etcta->rect) {
- etcta->rect = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) etcta->width - 1,
- "y2", (double) etcta->height - 1,
- "outline_color", "black",
- "fill_color", NULL,
- NULL);
- }
-}
diff --git a/widgets/table/e-table-click-to-add.h b/widgets/table/e-table-click-to-add.h
deleted file mode 100644
index 1dcbf9ef52..0000000000
--- a/widgets/table/e-table-click-to-add.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_CLICK_TO_ADD_H_
-#define _E_TABLE_CLICK_TO_ADD_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gnome-xml/tree.h>
-#include "e-table-header.h"
-#include "e-table-sort-info.h"
-#include "e-table-item.h"
-#include "e-table-selection-model.h"
-
-#define E_TABLE_CLICK_TO_ADD_TYPE (e_table_click_to_add_get_type ())
-#define E_TABLE_CLICK_TO_ADD(o) (GTK_CHECK_CAST ((o), E_TABLE_CLICK_TO_ADD_TYPE, ETableClickToAdd))
-#define E_TABLE_CLICK_TO_ADD_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_CLICK_TO_ADD_TYPE, ETableClickToAddClass))
-#define E_IS_TABLE_CLICK_TO_ADD(o) (GTK_CHECK_TYPE ((o), E_TABLE_CLICK_TO_ADD_TYPE))
-#define E_IS_TABLE_CLICK_TO_ADD_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_CLICK_TO_ADD_TYPE))
-
-typedef struct {
- GnomeCanvasGroup parent;
-
- ETableModel *one; /* The ETableOne. */
-
- ETableModel *model; /* The backend model. */
- ETableHeader *eth; /* This is just to give to the ETableItem. */
-
- char *message;
-
- GnomeCanvasItem *row; /* If row is NULL, we're sitting with no data and a "Click here" message. */
- GnomeCanvasItem *text; /* If text is NULL, row shouldn't be. */
- GnomeCanvasItem *rect; /* What the heck. Why not. */
-
- gdouble width;
- gdouble height;
-
- ETableSelectionModel *selection;
-} ETableClickToAdd;
-
-typedef struct {
- GnomeCanvasGroupClass parent_class;
-
- /*
- * signals
- */
- void (*cursor_change) (ETableClickToAdd *etcta, gint row, gint col);
-} ETableClickToAddClass;
-
-GtkType e_table_click_to_add_get_type (void);
-
-void e_table_click_to_add_commit (ETableClickToAdd *etcta);
-
-#endif /* _E_TABLE_CLICK_TO_ADD_H_ */
diff --git a/widgets/table/e-table-col-dnd.h b/widgets/table/e-table-col-dnd.h
deleted file mode 100644
index c1c26175c7..0000000000
--- a/widgets/table/e-table-col-dnd.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef _E_TABLE_COL_DND_H_
-#define _E_TABLE_COL_DND_H_
-
-#define TARGET_ETABLE_COL_TYPE "application/x-etable-column-header"
-
-enum {
- TARGET_ETABLE_COL_HEADER
-};
-
-#endif /* _E_TABLE_COL_DND_H_ */
diff --git a/widgets/table/e-table-col.c b/widgets/table/e-table-col.c
deleted file mode 100644
index e767aa5567..0000000000
--- a/widgets/table/e-table-col.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-col.c: ETableCol implementation
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc
- */
-#include <config.h>
-#include <gtk/gtkobject.h>
-#include <gtk/gtksignal.h>
-#include "e-table-col.h"
-#include "e-util/e-util.h"
-
-#define PARENT_TYPE (gtk_object_get_type ())
-
-static GtkObjectClass *parent_class;
-
-
-enum {
- ARG_0,
- ARG_SORTABLE,
-};
-
-static void
-etc_destroy (GtkObject *object)
-{
- ETableCol *etc = E_TABLE_COL (object);
-
- gtk_object_unref (GTK_OBJECT(etc->ecell));
-
- if (etc->is_pixbuf)
- gdk_pixbuf_unref (etc->pixbuf);
- else
- g_free (etc->text);
-
- (*parent_class->destroy)(object);
-}
-
-
-static void
-etc_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableCol *etc = E_TABLE_COL (o);
-
- switch (arg_id){
- case ARG_SORTABLE:
- etc->sortable = GTK_VALUE_BOOL(*arg);
- break;
- }
-}
-
-static void
-etc_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableCol *etc = E_TABLE_COL (o);
-
- switch (arg_id){
- case ARG_SORTABLE:
- GTK_VALUE_BOOL(*arg) = etc->sortable;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_table_col_class_init (GtkObjectClass *object_class)
-{
- parent_class = gtk_type_class (PARENT_TYPE);
- object_class->destroy = etc_destroy;
- object_class->get_arg = etc_get_arg;
- object_class->set_arg = etc_set_arg;
-
- gtk_object_add_arg_type ("ETableCol::sortable",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SORTABLE);
-}
-
-static void
-e_table_col_init (ETableCol *etc)
-{
- etc->width = 0;
- etc->sortable = 1;
- etc->groupable = 1;
-}
-
-E_MAKE_TYPE(e_table_col, "ETableCol", ETableCol, e_table_col_class_init, e_table_col_init, PARENT_TYPE);
-
-ETableCol *
-e_table_col_new (int col_idx, const char *text, double expansion, int min_width,
- ECell *ecell, GCompareFunc compare, gboolean resizable)
-{
- ETableCol *etc;
-
- g_return_val_if_fail (expansion >= 0, NULL);
- g_return_val_if_fail (min_width >= 0, NULL);
- g_return_val_if_fail (compare != NULL, NULL);
-
- etc = gtk_type_new (E_TABLE_COL_TYPE);
-
- etc->is_pixbuf = FALSE;
-
- etc->col_idx = col_idx;
- etc->text = g_strdup (text);
- etc->pixbuf = NULL;
- etc->expansion = expansion;
- etc->min_width = min_width;
- etc->ecell = ecell;
- etc->compare = compare;
-
- etc->arrow = E_TABLE_COL_ARROW_NONE;
-
- etc->selected = 0;
- etc->resizeable = resizable;
-
- gtk_object_ref (GTK_OBJECT(etc->ecell));
-
- return etc;
-}
-
-ETableCol *
-e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf, double expansion, int min_width,
- ECell *ecell, GCompareFunc compare, gboolean resizable)
-{
- ETableCol *etc;
-
- g_return_val_if_fail (expansion >= 0, NULL);
- g_return_val_if_fail (min_width >= 0, NULL);
- g_return_val_if_fail (compare != NULL, NULL);
-
- etc = gtk_type_new (E_TABLE_COL_TYPE);
-
- etc->is_pixbuf = TRUE;
-
- etc->col_idx = col_idx;
- etc->text = NULL;
- etc->pixbuf = pixbuf;
- etc->expansion = expansion;
- etc->min_width = min_width;
- etc->ecell = ecell;
- etc->compare = compare;
-
- etc->arrow = E_TABLE_COL_ARROW_NONE;
-
- etc->selected = 0;
- etc->resizeable = resizable;
-
- gtk_object_ref (GTK_OBJECT(etc->ecell));
- gdk_pixbuf_ref (etc->pixbuf);
-
- return etc;
-}
-
-void
-e_table_col_set_arrow (ETableCol *col, ETableColArrow arrow)
-{
- col->arrow = arrow;
-}
-
-ETableColArrow
-e_table_col_get_arrow (ETableCol *col)
-{
- return col->arrow;
-}
-
-
diff --git a/widgets/table/e-table-col.h b/widgets/table/e-table-col.h
deleted file mode 100644
index 39aeb26ba9..0000000000
--- a/widgets/table/e-table-col.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_COL_H_
-#define _E_TABLE_COL_H_
-
-#include "e-cell.h"
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#define E_TABLE_COL_TYPE (e_table_col_get_type ())
-#define E_TABLE_COL(o) (GTK_CHECK_CAST ((o), E_TABLE_COL_TYPE, ETableCol))
-#define E_TABLE_COL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_COL_TYPE, ETableColClass))
-#define E_IS_TABLE_COL(o) (GTK_CHECK_TYPE ((o), E_TABLE_COL_TYPE))
-#define E_IS_TABLE_COL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_COL_TYPE))
-
-typedef struct _ETableCol ETableCol;
-typedef struct _ETableColClass ETableColClass;
-typedef enum _ETableColArrow ETableColArrow;
-
-enum _ETableColArrow {
- E_TABLE_COL_ARROW_NONE = 0,
- E_TABLE_COL_ARROW_UP,
- E_TABLE_COL_ARROW_DOWN
-};
-
-/*
- * Information about a single column
- */
-struct _ETableCol {
- GtkObject base;
- char *text;
- GdkPixbuf *pixbuf;
- int min_width;
- int width;
- double expansion;
- short x;
- GCompareFunc compare;
- unsigned int is_pixbuf:1;
- unsigned int selected:1;
- unsigned int resizeable:1;
- unsigned int sortable:1;
- unsigned int groupable:1;
- int col_idx;
-
- ETableColArrow arrow;
-
- ECell *ecell;
-};
-
-struct _ETableColClass {
- GtkObjectClass parent_class;
-};
-
-GtkType e_table_col_get_type (void);
-ETableCol *e_table_col_new (int col_idx, const char *text,
- double expansion, int min_width,
- ECell *ecell, GCompareFunc compare,
- gboolean resizable);
-ETableCol *e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf,
- double expansion, int min_width,
- ECell *ecell, GCompareFunc compare,
- gboolean resizable);
-void e_table_col_destroy (ETableCol *etc);
-void e_table_col_set_arrow (ETableCol *col, ETableColArrow arrow);
-ETableColArrow e_table_col_get_arrow (ETableCol *col);
-
-
-#endif /* _E_TABLE_COL_H_ */
-
diff --git a/widgets/table/e-table-column-model.h b/widgets/table/e-table-column-model.h
deleted file mode 100644
index 043dd783ca..0000000000
--- a/widgets/table/e-table-column-model.h
+++ /dev/null
@@ -1,5 +0,0 @@
-
-class ETableColumnModel {
- virtual void add_column (ETableCol *et) = 0;
- virtual ETableCol *get_column (int column);
- virtual
diff --git a/widgets/table/e-table-column.c b/widgets/table/e-table-column.c
deleted file mode 100644
index d17a285321..0000000000
--- a/widgets/table/e-table-column.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * e-table-column.c: TableColumn implementation
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc
- */
-#include <config.h>
-#include "e-table-column.h"
-
-enum {
- STRUCTURE_CHANGE,
- DIMENSION_CHANGE,
- LAST_SIGNAL
-};
-
-static guint etc_signals [LAST_SIGNAL] = { 0, };
-
-static GtkObjectClass *e_table_column_parent_class;
-
-static void
-e_table_column_destroy (GtkObject *object)
-{
- ETableColumn *etc = E_TABLE_COLUMN (object);
- const int cols = etc->col_count;
-
- /*
- * Destroy listeners
- */
- for (l = etc->listeners; l; l = l->next)
- g_free (l->data);
- g_slist_free (etc->listeners);
- etc->listeners = NULL;
-
- /*
- * Destroy columns
- */
- for (i = 0; i < cols; i++)
- e_table_column_remove (etc, i);
-
- if (e_table_column_parent_class->destroy)
- e_table_column_parent_class->destroy (object);
-}
-
-static void
-e_table_column_class_init (GtkObjectClass *object_class)
-{
- object_class->destroy = e_table_column_destroy;
-
- e_table_column_parent_class = (gtk_type_class (gtk_object_get_type ()));
-
- etc_signals [STRUCTURE_CHANGE] =
- gtk_signal_new ("structure_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableColumn, structure_change),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
- etc_signals [DIMENSION_CHANGE] =
- gtk_signal_new ("dimension_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableColumn, dimension_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, etc_signals, LAST_SIGNAL);
-}
-
-GtkType
-e_table_column_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableColumn",
- sizeof (ETableColumn),
- sizeof (ETableColumnClass),
- (GtkClassInitFunc) e_table_column_class_init,
- (GtkObjectInitFunc) NULL,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
-
-static void
-etc_do_insert (ETableColumn *etc, int pos, ETableCol *val)
-{
- memcpy (&etc->columns [pos+1], &etc->columns [pos],
- sizeof (ETableCol *) * (etc->col_count - pos));
- etc->columns [pos] = val;
-}
-
-void
-e_table_column_add_column (ETableColumn *etc, ETableCol *tc, int pos)
-{
- ETableCol **new_ptr;
-
- g_return_if_fail (etc != NULL);
- g_return_if_fail (E_IS_TABLE_COLUMN (etc));
- g_return_if_fail (tc != NULL);
- g_return_if_fail (pos >= 0 && pos < etc->col_count);
-
- if (pos == -1)
- pos = etc->col_count;
- etc->columns = g_realloc (etc->columns, sizeof (ETableCol *) * (etc->col_count + 1));
- etc_do_insert (etc, pos, tc);
- etc->col_count++;
-
- gtk_signal_emit (GTK_OBJECT (etc), etc_signals [STRUCTURE_CHANGE]);
-}
-
-ETableCol *
-e_table_column_get_column (ETableColumn *etc, int column)
-{
- g_return_val_if_fail (etc != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), NULL);
-
- if (column < 0)
- return NULL;
-
- if (column >= etc->col_count)
- return NULL;
-
- return etc->columns [column];
-}
-
-int
-e_table_column_count (ETableColumn *etc)
-{
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
- return etc->col_count;
-}
-
-int
-e_table_column_index (ETableColumn *etc, const char *identifier)
-{
- int i;
-
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
- g_return_val_if_fail (identifier != NULL, 0);
-
- for (i = 0; i < etc->col_count; i++){
- ETableCol *tc = etc->columns [i];
-
- if (strcmp (i->id, identifier) == 0)
- return i;
- }
-
- return -1;
-}
-
-int
-e_table_column_get_index_at (ETableColumn *etc, int x_offset)
-{
- int i, total;
-
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
- g_return_val_if_fail (identifier != NULL, 0);
-
- total = 0;
- for (i = 0; i < etc->col_count; i++){
- total += etc->columns [i]->width;
-
- if (x_offset < total)
- return i;
- }
-
- return -1;
-}
-
-ETableCol **
-e_table_column_get_columns (ETableColumn *etc)
-{
- ETableCol **ret;
- int i;
-
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
- ret = g_new (ETableCol *, etc->col_count + 1);
- memcpy (ret, etc->columns, sizeof (ETableCol *) * etc->col_count);
- ret [etc->col_count] = NULL;
-
- return ret;
-}
-
-gboolean
-e_table_column_selection_ok (ETableColumn *etc)
-{
- g_return_val_if_fail (etc != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), FALSE);
-
- return etc->selectable;
-}
-
-int
-ve_table_column_get_selected (ETableColumn *etc)
-{
- int i;
- int selected = 0;
-
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
- for (i = 0; i < etc->col_count; i++){
- if (etc->columns [i]->selected)
- selected++;
- }
-
- return selected;
-}
-
-int
-e_table_column_total_width (ETableColumn *etc)
-{
- int total;
-
- g_return_val_if_fail (etc != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
- total = 0;
- for (i = 0; i < etc->col_count; i++)
- total += etc->columns [i].width;
-
- return total;
-}
-
-static void
-etc_do_remove (ETableColumn *etc, int idx)
-{
- memcpy (&etc->columns [idx], &etc->columns [idx+1],
- sizeof (ETableCol *) * etc->col_count - idx);
- etc->col_count--;
-}
-
-void
-e_table_column_move (ETableColumn *etc, int source_index, int target_index)
-{
- g_return_if_fail (etc != NULL);
- g_return_if_fail (E_IS_TABLE_COLUMN (etc));
- g_return_if_fail (source_index >= 0);
- g_return_if_fail (target_index >= 0);
- g_return_if_fail (source_index < etc->col_count);
- g_return_if_fail (target_index < etc->col_count);
-
- old = etc->columns [source_index];
- etc_do_remove (etc, source_index);
- etc_do_insert (etc, target_index, old);
- gtk_signal_emit (GTK_OBJECT (etc), etc_signals [STRUCTURE_CHANGE]);
-}
-
-void
-e_table_column_remove (ETableColumn *etc, int idx)
-{
- g_return_if_fail (etc != NULL);
- g_return_if_fail (E_IS_TABLE_COLUMN (etc));
- g_return_if_fail (idx >= 0);
- g_return_if_fail (idx < etc->col_count);
-
- etc_do_remove (etc, idx);
- gtk_signal_emit (GTK_OBJECT (etc), etc_signals [STRUCTURE_CHANGE]);
-}
-
-void
-e_table_column_set_selection (ETableColumn *etc, gboolean allow_selection);
-{
-}
-
-void
-e_table_column_set_size (ETableColumn *etc, int idx, int size)
-{
- g_return_if_fail (etc != NULL);
- g_return_if_fail (E_IS_TABLE_COLUMN (etc));
- g_return_if_fail (idx >= 0);
- g_return_if_fail (idx < etc->col_count);
- g_return_if_fail (size > 0);
-
- etc->columns [idx]->width = size;
- gtk_signal_emit (GTK_OBJECT (etc), etc_signals [SIZE_CHANGE], idx);
-}
diff --git a/widgets/table/e-table-config.c b/widgets/table/e-table-config.c
deleted file mode 100644
index 5d078f8f86..0000000000
--- a/widgets/table/e-table-config.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table.c: A graphical view of a Table.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, Helix Code, Inc
- */
-#include <config.h>
-#include <gnome.h>
-#include <glade/glade.h>
-#include <gnome-xml/xmlmemory.h>
-#include "e-util/e-util.h"
-#include "e-util/e-xml-utils.h"
-#include "e-util/e-canvas.h"
-#include "e-table.h"
-#include "e-table-header-item.h"
-#include "e-table-subset.h"
-#include "e-table-item.h"
-#include "e-table-group.h"
-#include "e-table-config.h"
-
-typedef struct {
- GladeXML *gui;
- char *old_spec;
-} ConfigData;
-
-static void
-load_data (GladeXML *xml, char *label_widget, const char *content)
-{
- GtkLabel *label = GTK_LABEL (glade_xml_get_widget (xml, label_widget));
-
- gtk_label_set_text (label, content);
-}
-
-static char *
-get_fields (ETable *etable, xmlNode *xmlRoot)
-{
- xmlNode *xmlColumns;
- xmlNode *column;
- GString *res;
- char *s;
-
- res = g_string_new ("");
- xmlColumns = e_xml_get_child_by_name (xmlRoot, "columns-shown");
-
- for (column = xmlColumns->childs; column; column = column->next){
- ETableCol *ecol;
- char *content;
- int col;
-
- content = xmlNodeListGetString (column->doc, column->childs, 1);
- col = atoi (content);
- xmlFree (content);
-
- ecol = e_table_header_get_column (etable->header, col);
-
- g_string_append (res, ecol->text);
- if (column->next)
- g_string_append (res, ", ");
- }
- s = res->str;
- g_string_free (res, FALSE);
-
- return s;
-}
-
-static char *
-get_grouping (ETable *etable, xmlNode *xmlRoot)
-{
- xmlNode *xmlGrouping;
- GString *res;
- char *s;
-
- res = g_string_new ("");
- xmlGrouping = e_xml_get_child_by_name (xmlRoot, "grouping");
-
- s = res->str;
- g_string_free (res, FALSE);
-
- return s;
-}
-
-static char *
-get_sort (ETable *etable)
-{
- return g_strdup ("None");
-}
-
-static char *
-get_filter (ETable *etable)
-{
- return g_strdup ("None");
-}
-
-/*
- * Loads a user-readable definition of the various e-table parameters
- * into the dialog for configuring it
- */
-static void
-load_label_data (GladeXML *gui, ETable *etable)
-{
- /* FIXME: Set this to the right value. */
- xmlNode *xmlRoot = NULL;
- char *s;
-
-/* xmlRoot = xmlDocGetRootElement (etable->specification); */
-
- s = get_fields (etable, xmlRoot);
- load_data (gui, "label1", s);
- g_free (s);
-
- s = get_grouping (etable, xmlRoot);
- load_data (gui, "label2", s);
- g_free (s);
-
- s = get_sort (etable);
- load_data (gui, "label3", s);
- g_free (s);
-
- s = get_filter (etable);
- load_data (gui, "label4", s);
- g_free (s);
-}
-
-static void
-cb_button_fields (GtkWidget *widget, ETable *etable)
-{
-}
-
-static void
-cb_button_grouping (GtkWidget *widget, ETable *etable)
-{
-}
-
-static void
-cb_button_sort (GtkWidget *widget, ETable *etable)
-{
-}
-
-static void
-cb_button_filter (GtkWidget *widget, ETable *etable)
-{
-}
-
-GnomeDialog *
-e_table_gui_config (ETable *etable)
-{
- GladeXML *gui;
- GnomeDialog *dialog;
- ConfigData *config_data;
-
- glade_gnome_init ();
- gui = glade_xml_new (ETABLE_GLADEDIR "/e-table-config.glade", NULL);
- if (!gui)
- return NULL;
-
- dialog = GNOME_DIALOG (glade_xml_get_widget (gui, "e-table-config"));
-
- gtk_signal_connect (
- GTK_OBJECT (glade_xml_get_widget (gui, "button-fields")),
- "clicked", GTK_SIGNAL_FUNC (cb_button_fields), etable);
- gtk_signal_connect (
- GTK_OBJECT (glade_xml_get_widget (gui, "button-grouping")),
- "clicked", GTK_SIGNAL_FUNC (cb_button_grouping), etable);
- gtk_signal_connect (
- GTK_OBJECT (glade_xml_get_widget (gui, "button-sort")),
- "clicked", GTK_SIGNAL_FUNC (cb_button_sort), etable);
- gtk_signal_connect (
- GTK_OBJECT (glade_xml_get_widget (gui, "button-filter")),
- "clicked", GTK_SIGNAL_FUNC (cb_button_filter), etable);
-
- load_label_data (gui, etable);
-
- config_data = g_new (ConfigData, 1);
- config_data->gui = gui;
- config_data->old_spec = e_table_get_specification (etable);
-
- gtk_object_set_data (
- GTK_OBJECT (dialog), "config-data",
- config_data);
-
- return dialog;
-}
-
-static void
-e_table_gui_destroy_config_data (GtkWidget *widget)
-{
- ConfigData *cd = gtk_object_get_data (GTK_OBJECT (widget), "config-data");
-
- g_free (cd->old_spec);
- gtk_object_destroy (GTK_OBJECT (cd->gui));
- g_free (cd);
-}
-
-void
-e_table_gui_config_accept (GtkWidget *widget, ETable *etable)
-{
- e_table_gui_destroy_config_data (widget);
-}
-
-void
-e_table_gui_config_cancel (GtkWidget *widget, ETable *etable)
-{
- e_table_gui_destroy_config_data (widget);
-}
-
-void
-e_table_do_gui_config (GtkWidget *parent, ETable *etable)
-{
- GnomeDialog *dialog;
- int r;
-
- dialog = GNOME_DIALOG (e_table_gui_config (etable));
- if (!dialog)
- return;
-
- if (parent)
- gnome_dialog_set_parent (dialog, GTK_WINDOW (parent));
-
- r = gnome_dialog_run (GNOME_DIALOG (dialog));
-
- if (r == -1 || r == 1)
- e_table_gui_config_cancel (GTK_WIDGET (dialog), etable);
- else
- e_table_gui_config_accept (GTK_WIDGET (dialog), etable);
-
- if (r != -1)
- gtk_object_destroy (GTK_OBJECT (dialog));
-}
-
-
diff --git a/widgets/table/e-table-config.glade b/widgets/table/e-table-config.glade
deleted file mode 100644
index 15223f21f1..0000000000
--- a/widgets/table/e-table-config.glade
+++ /dev/null
@@ -1,302 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>E-table</name>
- <program_name>e-table</program_name>
- <directory></directory>
- <source_directory></source_directory>
- <pixmaps_directory></pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>True</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-table-config.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>e-table-config</name>
- <visible>False</visible>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>False</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox2</name>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkFrame</class>
- <name>top-frame</name>
- <border_width>2</border_width>
- <label></label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkTable</class>
- <name>table1</name>
- <border_width>2</border_width>
- <rows>4</rows>
- <columns>2</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>2</row_spacing>
- <column_spacing>4</column_spacing>
-
- <widget>
- <class>GtkButton</class>
- <name>button-fields</name>
- <can_focus>True</can_focus>
- <label>Fields</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-grouping</name>
- <can_focus>True</can_focus>
- <label>Grouping</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-sort</name>
- <can_focus>True</can_focus>
- <label>Sort</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-filter</name>
- <can_focus>True</can_focus>
- <label>Filter</label>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label1</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label2</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>1</top_attach>
- <bottom_attach>2</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label3</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>2</top_attach>
- <bottom_attach>3</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label4</name>
- <label></label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area2</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>0</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button12</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button14</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/widgets/table/e-table-config.glade.h b/widgets/table/e-table-config.glade.h
deleted file mode 100644
index 4dc2ec8d31..0000000000
--- a/widgets/table/e-table-config.glade.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Fields");
-gchar *s = N_("Grouping");
-gchar *s = N_("Sort");
-gchar *s = N_("Filter");
diff --git a/widgets/table/e-table-config.h b/widgets/table/e-table-config.h
deleted file mode 100644
index 617ef6a331..0000000000
--- a/widgets/table/e-table-config.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef _E_TABLE_CONFIG_H
-#define _E_TABLE_CONFIG_H
-
-GnomeDialog *e_table_gui_config (ETable *etable);
-void e_table_do_gui_config (GtkWidget *, ETable *etable);
-
-void e_table_gui_config_accept (GtkWidget *widget, ETable *etable);
-void e_table_gui_config_cancel (GtkWidget *widget, ETable *etable);
-
-
-#endif /* _E_TABLE_CONFIG_H */
diff --git a/widgets/table/e-table-defines.h b/widgets/table/e-table-defines.h
deleted file mode 100644
index 9bb9e107ac..0000000000
--- a/widgets/table/e-table-defines.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __E_TABLE_DEFINES__
-#define __E_TABLE_DEFINES__ 1
-
-#define BUTTON_HEIGHT 10
-#define BUTTON_PADDING 2
-#define GROUP_INDENT (BUTTON_HEIGHT + (BUTTON_PADDING * 2))
-
-/* Padding above and below of the string in the header display */
-#define HEADER_PADDING 2
-
-#define MIN_ARROW_SIZE 10
-
-typedef void (*ETableForeachFunc) (int model_row,
- gpointer closure);
-
-#endif
diff --git a/widgets/table/e-table-example-1.c b/widgets/table/e-table-example-1.c
deleted file mode 100644
index 7c289778aa..0000000000
--- a/widgets/table/e-table-example-1.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* This code is GPL. */
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "table-test.h"
-
-/*
- * One way in which we make it simpler to build an ETableModel is through
- * the ETableSimple class. Instead of creating your own ETableModel
- * class, you simply create a new object of the ETableSimple class. You
- * give it a bunch of functions that act as callbacks.
- *
- * You also get to pass a void * to ETableSimple and it gets passed to
- * your callbacks. This would be for having multiple models of the same
- * type. This is just an example though, so we statically define all the
- * data and ignore the void *data parameter.
- *
- * In our example we will be creating a table model with 6 columns and 10
- * rows. This corresponds to having 6 different types of information and
- * 10 different sets of data in our database.
- *
- * The headers will be hard coded, as will be the example data.
- *
- */
-
-/*
- * There are two different meanings to the word "column". The first is
- * the model column. A model column corresponds to a specific type of
- * data. This is very much like the usage in a database table where a
- * column is a field in the database.
- *
- * The second type of column is a view column. A view column
- * corresponds to a visually displayed column. Each view column
- * corresponds to a specific model column, though a model column may
- * have any number of view columns associated with it, from zero to
- * greater than one.
- *
- * Also, a view column doesn't necessarily depend on only one model
- * column. In some cases, the view column renderer can be given a
- * reference to another column to get extra information about its
- * display.
-*/
-
-#define ROWS 10
-#define COLS 4
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/*
- * Here we define the initial layout of the table. This is an xml
- * format that allows you to change the initial ordering of the
- * columns or to do sorting or grouping initially. This specification
- * shows all 5 columns, but moves the importance column nearer to the
- * front. It also sorts by the "Full Name" column (ascending.)
- * Sorting and grouping take the model column as their arguments
- * (sorting is specified by the "column" argument to the leaf elemnt.
- */
-
-#define INITIAL_SPEC "<ETableSpecification> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 4 </column> \
- <column> 1 </column> \
- <column> 2 </column> \
- <column> 3 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-char *headers [COLS] = {
- "Email",
- "Full Name",
- "Address",
- "Phone"
-};
-
-/*
- * Virtual Column list:
- * 0 Email
- * 1 Full Name
- * 2 Address
- * 3 Phone
- */
-
-char *table_data [ROWS] [COLS];
-
-/*
- * ETableSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/*
- * Since our model is a constant size, we can just return its size in
- * the column and row count fields.
- */
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-my_col_count (ETableModel *etc, void *data)
-{
- return COLS;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-my_row_count (ETableModel *etc, void *data)
-{
- return ROWS;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-my_value_at (ETableModel *etc, int col, int row, void *data)
-{
- return (void *) table_data [row] [col];
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-my_set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
- g_free (table_data [row] [col]);
- table_data [row] [col] = g_strdup (val);
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-my_is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- return TRUE;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-my_duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup (value);
-}
-
-/* This function frees the value passed to it. */
-static void
-my_free_value (ETableModel *etc, int col, void *value, void *data)
-{
- g_free (value);
-}
-
-/* This function creates an empty value. */
-static void *
-my_initialize_value (ETableModel *etc, int col, void *data)
-{
- return g_strdup ("");
-}
-
-/* This function reports if a value is empty. */
-static gboolean
-my_value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- return !(value && *(char *)value);
-}
-
-/* This function reports if a value is empty. */
-static char *
-my_value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup(value);
-}
-
-/* We create a window containing our new table. */
-static void
-create_table (void)
-{
- GtkWidget *e_table, *window, *frame;
- ECell *cell_left_just;
- ETableHeader *e_table_header;
- int i, j;
- ETableModel *e_table_model = NULL;
-
- /* First we fill in the simple data. */
- for (i = 0; i < ROWS; i++){
- for (j = 0; j < COLS; j++)
- table_data [i] [j] = g_strdup ("");
- }
- /* Next we create our model. This uses the functions we defined
- earlier. */
- e_table_model = e_table_simple_new (
- my_col_count, my_row_count, my_value_at,
- my_set_value_at, my_is_cell_editable,
- my_duplicate_value, my_free_value,
- my_initialize_value, my_value_is_empty,
- my_value_to_string,
- NULL);
- /*
- * Next we create a header. The ETableHeader is used in two
- * different way. The first is the full_header. This is the
- * list of possible columns in the view. The second use is
- * completely internal. Many of the ETableHeader functions are
- * for that purpose. The only functions we really need are
- * e_table_header_new and e_table_header_add_col.
- *
- * First we create the header.
- */
- e_table_header = e_table_header_new ();
-
- /*
- * Next we have to build renderers for all of the columns.
- * Since all our columns are text columns, we can simply use
- * the same renderer over and over again. If we had different
- * types of columns, we could use a different renderer for
- * each column.
- */
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- /*
- * Next we create a column object for each view column and add
- * them to the header. We don't create a column object for
- * the importance column since it will not be shown.
- */
- for (i = 0; i < COLS; i++) {
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, headers [i],
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /*
- * Here we create a window for our new table. This window
- * will get shown and the person will be able to test their
- * item.
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
- /* This frame is simply to get a bevel around our table. */
- frame = gtk_frame_new (NULL);
-
- /*
- * 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.
- */
- e_table = e_table_new (e_table_header, e_table_model, INITIAL_SPEC);
-
- /* Build the gtk widget hierarchy. */
- gtk_container_add (GTK_CONTAINER (frame), e_table);
- gtk_container_add (GTK_CONTAINER (window), frame);
-
- /* Size the initial window. */
- gtk_widget_set_usize (window, 200, 200);
-
- /* Show it all. */
- gtk_widget_show_all (window);
-}
-
-/* This is the main function which just initializes gnome and call our create_table function */
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- create_table ();
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
-
diff --git a/widgets/table/e-table-example-2.c b/widgets/table/e-table-example-2.c
deleted file mode 100644
index e9d8d9ea80..0000000000
--- a/widgets/table/e-table-example-2.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* This code is GPL. */
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "table-test.h"
-
-/*
-One way in which we make it simpler to build an ETableModel is through
-the ETableSimple class. Instead of creating your own ETableModel
-class, you simply create a new object of the ETableSimple class. You
-give it a bunch of functions that act as callbacks.
-
-You also get to pass a void * to ETableSimple and it gets passed to
-your callbacks. This would be for having multiple models of the same
-type. This is just an example though, so we statically define all the
-data and ignore the void *data parameter.
-
-In our example we will be creating a table model with 6 columns and 10
-rows. This corresponds to having 6 different types of information and
-10 different sets of data in our database.
-
-The headers will be hard coded, as will be the example data.
-
-*/
-
-/*
- There are two different meanings to the word "column". The first is
- the model column. A model column corresponds to a specific type of
- data. This is very much like the usage in a database table where a
- column is a field in the database.
-
- The second type of column is a view column. A view column
- corresponds to a visually displayed column. Each view column
- corresponds to a specific model column, though a model column may
- have any number of view columns associated with it, from zero to
- greater than one.
-
- Also, a view column doesn't necessarily depend on only one model
- column. In some cases, the view column renderer can be given a
- reference to another column to get extra information about its
- display.
-*/
-
-#define ROWS 10
-#define VIEW_COLS 4
-#define PHYSICAL_COLS 5
-#define VIRTUAL_COLS 6
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/* Here we define the initial layout of the table. This is an xml
- format that allows you to change the initial ordering of the
- columns or to do sorting or grouping initially. This specification
- shows all 5 columns, but moves the importance column nearer to the
- front. It also sorts by the "Full Name" column (ascending.)
- Sorting and grouping take the model column as their arguments
- (sorting is specified by the "column" argument to the leaf elemnt. */
-#define INITIAL_SPEC "<ETableSpecification> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 4 </column> \
- <column> 1 </column> \
- <column> 2 </column> \
- <column> 3 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-char *headers[VIEW_COLS] = {
- "Email",
- "Full Name",
- "Address",
- "Phone"
-};
-
-/* Virtual Column list:
- 0 Full Name
- 1 Email
- 2 Address
- 3 Phone
- 4 Importance field. This field will be a boolean. It also has a
- special header, so doesn't appear in the headers list.
- 5 Color field. This column is also not displayed. It is also
- not stored in the database. It's calculated based on the
- Importance field.
-*/
-
-char *table_data[ROWS][VIEW_COLS];
-gboolean importance_data[ROWS];
-
-/*
- * ETableSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/* Since our model is a constant size, we can just return its size in
- the column and row count fields. */
-
-static GdkColor *color1;
-static GdkColor *color2;
-
-static int
-my_col_count (ETableModel *etc, void *data)
-{
- return VIRTUAL_COLS;
-}
-
-static int
-my_row_count (ETableModel *etc, void *data)
-{
- return ROWS;
-}
-
-static void *
-my_value_at (ETableModel *etc, int col, int row, void *data)
-{
- if (col == COLOR_COLUMN){
- if (importance_data[row]){
- return color1;
- } else {
- return color2;
- }
- } else if (col == IMPORTANCE_COLUMN){
- return (gpointer) importance_data[row];
- } else {
- return (void *) table_data [row][col];
- }
-}
-
-static void
-my_set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
- if (col == COLOR_COLUMN){
- } else if (col == IMPORTANCE_COLUMN){
- importance_data[row] = (gboolean) val;
- } else {
- g_free (table_data [row][col]);
- table_data [row][col] = g_strdup (val);
- }
-}
-
-static gboolean
-my_is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- if (col == IMPORTANCE_COLUMN)
- return FALSE;
- else
- return TRUE;
-}
-
-static void *
-my_duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == COLOR_COLUMN){
- return (void *) value;
- } else if (col == IMPORTANCE_COLUMN){
- return (void *) value;
- } else {
- return g_strdup (value);
- }
-}
-
-static void
-my_free_value (ETableModel *etc, int col, void *value, void *data)
-{
- if (col == COLOR_COLUMN){
- } else if (col == IMPORTANCE_COLUMN){
- } else {
- g_free (value);
- }
-}
-
-static void *
-my_initialize_value (ETableModel *etc, int col, void *data)
-{
- if (col == COLOR_COLUMN){
- return NULL;
- } else if (col == IMPORTANCE_COLUMN){
- return NULL;
- } else {
- return g_strdup ("");
- }
-}
-
-static gboolean
-my_value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == COLOR_COLUMN){
- return value == NULL;
- } else if (col == IMPORTANCE_COLUMN){
- return value == NULL;
- } else {
- return !(value && *(char *)value);
- }
-}
-
-static char *
-my_value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == COLOR_COLUMN){
- return g_strdup_printf("%d", (int) value);
- } else if (col == IMPORTANCE_COLUMN){
- return g_strdup_printf("%d", (int) value);
- } else {
- return g_strdup(value);
- }
-}
-
-/* We create a window containing our new table. */
-static void
-create_table ()
-{
- GtkWidget *e_table, *window, *frame;
- ECell *cell_left_just;
- ECell *cell_checkbox;
- ETableHeader *e_table_header;
- int i, j;
- ETableModel *e_table_model = NULL;
- ETableCol *ecol;
- GdkPixbuf *pixbuf;
-
- /* First we fill in the simple data. */
- for (i = 0; i < ROWS; i++){
- for (j = 0; j < VIEW_COLS; j++){
- table_data[i][j] = g_strdup ("");
- }
- importance_data[i] = FALSE;
- }
- /* Next we create our model. This uses the functions we defined
- earlier. */
- e_table_model = e_table_simple_new (
- my_col_count, my_row_count, my_value_at,
- my_set_value_at, my_is_cell_editable,
- my_duplicate_value, my_free_value,
- my_initialize_value, my_value_is_empty,
- my_value_to_string,
- NULL);
- /*
- Next we create a header. The ETableHeader is used in two
- different way. The first is the full_header. This is the
- list of possible columns in the view. The second use is
- completely internal. Many of the ETableHeader functions are
- for that purpose. The only functions we really need are
- e_table_header_new and e_table_header_add_col.
-
- First we create the header. */
- e_table_header = e_table_header_new ();
-
- /* Next we have to build renderers for all of the columns.
- Since all our columns are text columns, we can simply use
- the same renderer over and over again. If we had different
- types of columns, we could use a different renderer for
- each column. */
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- /* Next we create a column object for each view column and add
- them to the header. We don't create a column object for
- the importance column since it will not be shown. */
- for (i = 0; i < VIEW_COLS; i++){
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, headers [i],
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /* Next we add a special column for the check box. */
-
- cell_checkbox = e_cell_checkbox_new ();
- pixbuf = gdk_pixbuf_new_from_file ("clip.png");
- ecol = e_table_col_new_with_pixbuf (i, pixbuf, 0.0, 18, cell_checkbox, g_int_compare, TRUE);
- e_table_header_add_column (e_table_header, ecol, i);
-
- /*
- * Setup GUI
- */
- /* Here we create a window for our new table. This window
- will get shown and the person will be able to test their
- item. */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- /* This frame is simply to get a bevel around our table. */
- frame = gtk_frame_new (NULL);
- /* 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. */
- e_table = e_table_new (e_table_header, e_table_model, INITIAL_SPEC);
-
- /* Build the gtk widget hierarchy. */
- gtk_container_add (GTK_CONTAINER (frame), e_table);
- gtk_container_add (GTK_CONTAINER (window), frame);
-
- /* Size the initial window. */
- gtk_widget_set_usize (window, 200, 200);
- /* Show it all. */
- gtk_widget_show_all (window);
-}
-
-
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- create_table ();
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
diff --git a/widgets/table/e-table-field-chooser-dialog.c b/widgets/table/e-table-field-chooser-dialog.c
deleted file mode 100644
index b54c57e80e..0000000000
--- a/widgets/table/e-table-field-chooser-dialog.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-field-chooser-dialog.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-table-field-chooser-dialog.h>
-
-static void e_table_field_chooser_dialog_init (ETableFieldChooserDialog *card);
-static void e_table_field_chooser_dialog_class_init (ETableFieldChooserDialogClass *klass);
-static void e_table_field_chooser_dialog_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_table_field_chooser_dialog_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_table_field_chooser_dialog_destroy (GtkObject *object);
-static void e_table_field_chooser_dialog_clicked (GnomeDialog *dialog, gint button);
-
-static GnomeDialogClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_DND_CODE,
- ARG_FULL_HEADER,
-};
-
-GtkType
-e_table_field_chooser_dialog_get_type (void)
-{
- static GtkType table_field_chooser_dialog_type = 0;
-
- if (!table_field_chooser_dialog_type)
- {
- static const GtkTypeInfo table_field_chooser_dialog_info =
- {
- "ETableFieldChooserDialog",
- sizeof (ETableFieldChooserDialog),
- sizeof (ETableFieldChooserDialogClass),
- (GtkClassInitFunc) e_table_field_chooser_dialog_class_init,
- (GtkObjectInitFunc) e_table_field_chooser_dialog_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- table_field_chooser_dialog_type = gtk_type_unique (gnome_dialog_get_type (), &table_field_chooser_dialog_info);
- }
-
- return table_field_chooser_dialog_type;
-}
-
-static void
-e_table_field_chooser_dialog_class_init (ETableFieldChooserDialogClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeDialogClass *dialog_class;
-
- object_class = (GtkObjectClass*) klass;
- dialog_class = GNOME_DIALOG_CLASS (klass);
-
- parent_class = gtk_type_class (gnome_dialog_get_type ());
-
- object_class->destroy = e_table_field_chooser_dialog_destroy;
- object_class->set_arg = e_table_field_chooser_dialog_set_arg;
- object_class->get_arg = e_table_field_chooser_dialog_get_arg;
-
- dialog_class->clicked = e_table_field_chooser_dialog_clicked;
-
- gtk_object_add_arg_type ("ETableFieldChooserDialog::dnd_code", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_DND_CODE);
- gtk_object_add_arg_type ("ETableFieldChooserDialog::full_header", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_FULL_HEADER);
-}
-
-static void
-e_table_field_chooser_dialog_init (ETableFieldChooserDialog *e_table_field_chooser_dialog)
-{
- GtkWidget *widget;
-
- e_table_field_chooser_dialog->etfc = NULL;
- e_table_field_chooser_dialog->dnd_code = g_strdup("");
- e_table_field_chooser_dialog->full_header = NULL;
-
- gnome_dialog_append_buttons(GNOME_DIALOG(e_table_field_chooser_dialog),
- GNOME_STOCK_BUTTON_CLOSE,
- NULL);
-
- gtk_window_set_policy(GTK_WINDOW(e_table_field_chooser_dialog), FALSE, TRUE, FALSE);
-
- widget = e_table_field_chooser_new();
- e_table_field_chooser_dialog->etfc = E_TABLE_FIELD_CHOOSER(widget);
-
- gtk_object_set(GTK_OBJECT(widget),
- "dnd_code", e_table_field_chooser_dialog->dnd_code,
- "full_header", e_table_field_chooser_dialog->full_header,
- NULL);
-
- gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(e_table_field_chooser_dialog)->vbox),
- widget, TRUE, TRUE, 0);
-
- gtk_widget_show(GTK_WIDGET(widget));
-}
-
-GtkWidget*
-e_table_field_chooser_dialog_new (void)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_table_field_chooser_dialog_get_type ()));
- return widget;
-}
-
-static void
-e_table_field_chooser_dialog_destroy (GtkObject *object)
-{
- ETableFieldChooserDialog *etfcd = E_TABLE_FIELD_CHOOSER_DIALOG (object);
- g_free(etfcd->dnd_code);
- if (etfcd->full_header)
- gtk_object_unref(GTK_OBJECT(etfcd->full_header));
-}
-
-static void
-e_table_field_chooser_dialog_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableFieldChooserDialog *etfcd = E_TABLE_FIELD_CHOOSER_DIALOG(object);
- switch (arg_id){
- case ARG_DND_CODE:
- g_free(etfcd->dnd_code);
- etfcd->dnd_code = g_strdup(GTK_VALUE_STRING (*arg));
- if (etfcd->etfc)
- gtk_object_set(GTK_OBJECT(etfcd->etfc),
- "dnd_code", etfcd->dnd_code,
- NULL);
- break;
- case ARG_FULL_HEADER:
- if (etfcd->full_header)
- gtk_object_unref(GTK_OBJECT(etfcd->full_header));
- if (GTK_VALUE_OBJECT(*arg))
- etfcd->full_header = E_TABLE_HEADER(GTK_VALUE_OBJECT(*arg));
- else
- etfcd->full_header = NULL;
- if (etfcd->full_header)
- gtk_object_ref(GTK_OBJECT(etfcd->full_header));
- if (etfcd->etfc)
- gtk_object_set(GTK_OBJECT(etfcd->etfc),
- "full_header", etfcd->full_header,
- NULL);
- break;
- default:
- break;
- }
-}
-
-static void
-e_table_field_chooser_dialog_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableFieldChooserDialog *etfcd = E_TABLE_FIELD_CHOOSER_DIALOG(object);
- switch (arg_id) {
- case ARG_DND_CODE:
- GTK_VALUE_STRING (*arg) = g_strdup (etfcd->dnd_code);
- break;
- case ARG_FULL_HEADER:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etfcd->full_header);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-e_table_field_chooser_dialog_clicked (GnomeDialog *dialog, int button)
-{
- if (button == 0)
- gnome_dialog_close(dialog);
-}
diff --git a/widgets/table/e-table-field-chooser-dialog.h b/widgets/table/e-table-field-chooser-dialog.h
deleted file mode 100644
index c209210dda..0000000000
--- a/widgets/table/e-table-field-chooser-dialog.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-table-field-chooser-dialog.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_TABLE_FIELD_CHOOSER_DIALOG_H__
-#define __E_TABLE_FIELD_CHOOSER_DIALOG_H__
-
-#include <gnome.h>
-#include <glade/glade.h>
-#include "e-table-field-chooser.h"
-#include "e-table-header.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETableFieldChooserDialog - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- */
-
-#define E_TABLE_FIELD_CHOOSER_DIALOG_TYPE (e_table_field_chooser_dialog_get_type ())
-#define E_TABLE_FIELD_CHOOSER_DIALOG(obj) (GTK_CHECK_CAST ((obj), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE, ETableFieldChooserDialog))
-#define E_TABLE_FIELD_CHOOSER_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE, ETableFieldChooserDialogClass))
-#define E_IS_TABLE_FIELD_CHOOSER_DIALOG(obj) (GTK_CHECK_TYPE ((obj), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE))
-#define E_IS_TABLE_FIELD_CHOOSER_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE))
-
-
-typedef struct _ETableFieldChooserDialog ETableFieldChooserDialog;
-typedef struct _ETableFieldChooserDialogClass ETableFieldChooserDialogClass;
-
-struct _ETableFieldChooserDialog
-{
- GnomeDialog parent;
-
- /* item specific fields */
- ETableFieldChooser *etfc;
- gchar *dnd_code;
- ETableHeader *full_header;
-};
-
-struct _ETableFieldChooserDialogClass
-{
- GnomeDialogClass parent_class;
-};
-
-
-GtkWidget *e_table_field_chooser_dialog_new(void);
-GtkType e_table_field_chooser_dialog_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TABLE_FIELD_CHOOSER_DIALOG_H__ */
diff --git a/widgets/table/e-table-field-chooser-item.c b/widgets/table/e-table-field-chooser-item.c
deleted file mode 100644
index e23fc4c9f5..0000000000
--- a/widgets/table/e-table-field-chooser-item.c
+++ /dev/null
@@ -1,566 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-column-view.c: A canvas item based view of the ETableColumn.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkdnd.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <libgnomeui/gnome-canvas-util.h>
-#include <libgnomeui/gnome-canvas-polygon.h>
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "e-util/e-xml-utils.h"
-#include "e-util/e-canvas.h"
-
-#include "e-table-header.h"
-#include "e-table-col-dnd.h"
-#include "e-table-defines.h"
-
-#include "e-table-field-chooser-item.h"
-
-#if 0
-enum {
- BUTTON_PRESSED,
- LAST_SIGNAL
-};
-
-static guint etfci_signals [LAST_SIGNAL] = { 0, };
-#endif
-
-#define PARENT_OBJECT_TYPE gnome_canvas_item_get_type ()
-
-#define ELEMENTS(x) (sizeof (x) / sizeof (x[0]))
-
-static GnomeCanvasItemClass *etfci_parent_class;
-
-static void etfci_drop_table_header (ETableFieldChooserItem *etfci);
-
-enum {
- ARG_0,
- ARG_FULL_HEADER,
- ARG_DND_CODE,
- ARG_WIDTH,
- ARG_HEIGHT,
-};
-
-static void
-etfci_destroy (GtkObject *object){
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (object);
-
- etfci_drop_table_header (etfci);
-
- gdk_font_unref(etfci->font);
-
- if (GTK_OBJECT_CLASS (etfci_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (etfci_parent_class)->destroy) (object);
-}
-
-static void
-etfci_reflow (GnomeCanvasItem *item, gint flags)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
- double old_height;
-
- old_height = etfci->height;
-
- etfci->height = e_table_header_count (etfci->full_header) * etfci->button_height;
-
- if (old_height != etfci->height)
- e_canvas_item_request_parent_reflow(item);
-
- gnome_canvas_item_request_update(item);
-}
-
-static void
-etfci_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
- double i2c [6];
- ArtPoint c1, c2, i1, i2;
-
- if (GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->update)
- (*GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->update)(item, affine, clip_path, flags);
-
- i1.x = i1.y = 0;
- i2.x = etfci->width;
- i2.y = etfci->height;
-
- gnome_canvas_item_i2c_affine (item, i2c);
- art_affine_point (&c1, &i1, i2c);
- art_affine_point (&c2, &i2, i2c);
-
- if (item->x1 != c1.x ||
- item->y1 != c1.y ||
- item->x2 != c2.x ||
- item->y2 != c2.y)
- {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- item->x1 = c1.x;
- item->y1 = c1.y;
- item->x2 = c2.x;
- item->y2 = c2.y;
-
- gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item);
- }
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
-}
-
-static void
-etfci_font_load (ETableFieldChooserItem *etfci, char *font)
-{
- if (etfci->font)
- gdk_font_unref (etfci->font);
- etfci->font = NULL;
-
- if (font)
- etfci->font = gdk_fontset_load (font);
-
- if (etfci->font == NULL) {
- etfci->font = GTK_WIDGET(GNOME_CANVAS_ITEM(etfci)->canvas)->style->font;
- gdk_font_ref(etfci->font);
- }
-
- etfci->button_height = etfci->font->ascent + etfci->font->descent + HEADER_PADDING;
-}
-
-static void
-etfci_drop_table_header (ETableFieldChooserItem *etfci)
-{
- GtkObject *header;
-
- if (!etfci->full_header)
- return;
-
- header = GTK_OBJECT (etfci->full_header);
- if (etfci->structure_change_id)
- gtk_signal_disconnect (header, etfci->structure_change_id);
- if (etfci->dimension_change_id)
- gtk_signal_disconnect (header, etfci->dimension_change_id);
- etfci->structure_change_id = 0;
- etfci->dimension_change_id = 0;
-
- if (header)
- gtk_object_unref (header);
- etfci->full_header = NULL;
- etfci->height = 0;
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-structure_changed (ETableHeader *header, ETableFieldChooserItem *etfci)
-{
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-dimension_changed (ETableHeader *header, int col, ETableFieldChooserItem *etfci)
-{
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_add_table_header (ETableFieldChooserItem *etfci, ETableHeader *header)
-{
- etfci->full_header = header;
- gtk_object_ref (GTK_OBJECT (etfci->full_header));
-
- etfci->structure_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "structure_change",
- GTK_SIGNAL_FUNC(structure_changed), etfci);
- etfci->dimension_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "dimension_change",
- GTK_SIGNAL_FUNC(dimension_changed), etfci);
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableFieldChooserItem *etfci;
-
- item = GNOME_CANVAS_ITEM (o);
- etfci = E_TABLE_FIELD_CHOOSER_ITEM (o);
-
- switch (arg_id){
- case ARG_FULL_HEADER:
- etfci_drop_table_header (etfci);
- if (GTK_VALUE_OBJECT (*arg))
- etfci_add_table_header (etfci, E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg)));
- break;
-
- case ARG_DND_CODE:
- g_free(etfci->dnd_code);
- etfci->dnd_code = g_strdup(GTK_VALUE_STRING (*arg));
- break;
-
- case ARG_WIDTH:
- etfci->width = GTK_VALUE_DOUBLE (*arg);
- gnome_canvas_item_request_update(item);
- break;
- }
-}
-
-static void
-etfci_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableFieldChooserItem *etfci;
-
- item = GNOME_CANVAS_ITEM (o);
- etfci = E_TABLE_FIELD_CHOOSER_ITEM (o);
-
- switch (arg_id){
-
- case ARG_DND_CODE:
- GTK_VALUE_STRING (*arg) = g_strdup (etfci->dnd_code);
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = etfci->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = etfci->height;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-etfci_drag_data_get (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETableFieldChooserItem *etfci)
-{
- if (etfci->drag_col != -1) {
- gchar *string = g_strdup_printf("%d", etfci->drag_col);
- gtk_selection_data_set(selection_data,
- GDK_SELECTION_TYPE_STRING,
- sizeof(string[0]),
- string,
- strlen(string));
- g_free(string);
- }
-}
-
-static void
-etfci_drag_end (GtkWidget *canvas,
- GdkDragContext *context,
- ETableFieldChooserItem *etfci)
-{
- etfci->drag_col = -1;
-}
-
-static void
-etfci_realize (GnomeCanvasItem *item)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
- GdkWindow *window;
-
- if (GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)-> realize)
- (*GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->realize)(item);
-
- window = GTK_WIDGET (item->canvas)->window;
-
- if (!etfci->font)
- etfci_font_load (etfci, NULL);
-
- etfci->drag_end_id = gtk_signal_connect (
- GTK_OBJECT (item->canvas), "drag_end",
- GTK_SIGNAL_FUNC (etfci_drag_end), etfci);
- etfci->drag_data_get_id = gtk_signal_connect (
- GTK_OBJECT (item->canvas), "drag_data_get",
- GTK_SIGNAL_FUNC (etfci_drag_data_get), etfci);
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_unrealize (GnomeCanvasItem *item)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-
- if (etfci->font)
- gdk_font_unref (etfci->font);
- etfci->font = NULL;
-
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), etfci->drag_end_id);
- etfci->drag_end_id = 0;
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), etfci->drag_data_get_id);
- etfci->drag_data_get_id = 0;
-
- if (GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->unrealize)(item);
-}
-
-static void
-draw_button (ETableFieldChooserItem *etfci, ETableCol *col,
- GdkDrawable *drawable, GtkStyle *style,
- int x, int y, int width, int height)
-{
- GdkRectangle clip;
- int xtra;
- GdkRectangle area;
-
- GtkWidget *widget = GTK_WIDGET(GNOME_CANVAS_ITEM(etfci)->canvas);
-
- gdk_window_clear_area (drawable, x, y, width, height);
-
- area.x = x;
- area.y = y;
- area.width = width;
- area.height = height;
-
- gtk_paint_box (style, drawable,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT,
- &area, widget, "button",
- x, y, width, height);
-
- clip.x = x + HEADER_PADDING / 2;
- clip.y = y + HEADER_PADDING / 2;
- clip.width = width - HEADER_PADDING;
- clip.height = etfci->button_height;
-
- if (col->is_pixbuf){
- xtra = (clip.width - gdk_pixbuf_get_width (col->pixbuf))/2;
-
- xtra += HEADER_PADDING / 2;
-
- gdk_pixbuf_render_to_drawable_alpha (col->pixbuf,
- drawable,
- 0, 0,
- x + xtra, y + (clip.height - gdk_pixbuf_get_height (col->pixbuf)) / 2,
- gdk_pixbuf_get_width (col->pixbuf), gdk_pixbuf_get_height(col->pixbuf),
- GDK_PIXBUF_ALPHA_FULL, 128,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- } else {
- /* Center the thing */
- xtra = (clip.width - gdk_string_measure (etfci->font, col->text))/2;
-
- /* Skip over border */
- if (xtra < 0)
- xtra = 0;
-
- xtra += HEADER_PADDING / 2;
-
- gdk_draw_text (
- drawable, etfci->font,
- style->text_gc[GTK_STATE_NORMAL], x + xtra, y + etfci->button_height - etfci->font->descent - HEADER_PADDING / 2,
- col->text, strlen (col->text));
- }
-}
-
-static void
-etfci_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
- GnomeCanvas *canvas = item->canvas;
- const int rows = e_table_header_count (etfci->full_header);
- int y1, y2;
- int row;
-
- y1 = y2 = 0;
- for (row = 0; row < rows; row++, y1 = y2){
- ETableCol *ecol = e_table_header_get_column (etfci->full_header, row);
-
- y2 += etfci->button_height;
-
- if (y1 > (y + height))
- break;
-
- if (y2 < y)
- continue;
-
- draw_button (etfci, ecol, drawable,
- GTK_WIDGET (canvas)->style,
- - x, y1 - y, etfci->width, y2 - y1);
- }
-}
-
-static double
-etfci_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-static gboolean
-etfci_maybe_start_drag (ETableFieldChooserItem *etfci, double x, double y)
-{
- if (!etfci->maybe_drag)
- return FALSE;
-
- if (MAX (abs (etfci->click_x - x),
- abs (etfci->click_y - y)) <= 3)
- return FALSE;
-
- return TRUE;
-}
-
-static void
-etfci_start_drag (ETableFieldChooserItem *etfci, GdkEvent *event, double x, double y)
-{
- GtkWidget *widget = GTK_WIDGET (GNOME_CANVAS_ITEM (etfci)->canvas);
- GtkTargetList *list;
- GdkDragContext *context;
- ETableCol *ecol;
- GdkPixmap *pixmap;
- int drag_col;
-
- GtkTargetEntry etfci_drag_types [] = {
- { TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
- };
-
- drag_col = y / etfci->button_height;
-
- if (drag_col < 0 || drag_col > e_table_header_count(etfci->full_header))
- return;
-
- ecol = e_table_header_get_column (etfci->full_header, drag_col);
-
- etfci->drag_col = ecol->col_idx;
-
- etfci_drag_types[0].target = g_strdup_printf("%s-%s", etfci_drag_types[0].target, etfci->dnd_code);
- list = gtk_target_list_new (etfci_drag_types, ELEMENTS (etfci_drag_types));
- context = gtk_drag_begin (widget, list, GDK_ACTION_MOVE, 1, event);
- g_free(etfci_drag_types[0].target);
-
-
- pixmap = gdk_pixmap_new (widget->window, etfci->width, etfci->button_height, -1);
- draw_button (etfci, ecol, pixmap,
- widget->style,
- 0, 0, etfci->width, etfci->button_height);
- gtk_drag_set_icon_pixmap (context,
- gdk_window_get_colormap (widget->window),
- pixmap,
- NULL,
- etfci->width / 2,
- etfci->button_height / 2);
- gdk_pixmap_unref (pixmap);
- etfci->maybe_drag = FALSE;
-}
-
-/*
- * Handles the events on the ETableFieldChooserItem
- */
-static int
-etfci_event (GnomeCanvasItem *item, GdkEvent *e)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
- GnomeCanvas *canvas = item->canvas;
- int x, y;
-
- switch (e->type){
- case GDK_MOTION_NOTIFY:
- gnome_canvas_w2c (canvas, e->motion.x, e->motion.y, &x, &y);
-
- if (etfci_maybe_start_drag (etfci, x, y))
- etfci_start_drag (etfci, e, x, y);
- break;
-
- case GDK_BUTTON_PRESS:
- gnome_canvas_w2c (canvas, e->button.x, e->button.y, &x, &y);
-
- if (e->button.button == 1){
- etfci->click_x = x;
- etfci->click_y = y;
- etfci->maybe_drag = TRUE;
- }
- break;
-
- case GDK_BUTTON_RELEASE: {
- etfci->maybe_drag = FALSE;
- break;
- }
-
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-static void
-etfci_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
-
- etfci_parent_class = gtk_type_class (PARENT_OBJECT_TYPE);
-
- object_class->destroy = etfci_destroy;
- object_class->set_arg = etfci_set_arg;
- object_class->get_arg = etfci_get_arg;
-
- item_class->update = etfci_update;
- item_class->realize = etfci_realize;
- item_class->unrealize = etfci_unrealize;
- item_class->draw = etfci_draw;
- item_class->point = etfci_point;
- item_class->event = etfci_event;
-
- gtk_object_add_arg_type ("ETableFieldChooserItem::dnd_code", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_DND_CODE);
- gtk_object_add_arg_type ("ETableFieldChooserItem::full_header", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_FULL_HEADER);
- gtk_object_add_arg_type ("ETableFieldChooserItem::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableFieldChooserItem::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
-}
-
-static void
-etfci_init (GnomeCanvasItem *item)
-{
- ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-
- etfci->full_header = NULL;
-
- etfci->height = etfci->width = 0;
- etfci->button_height = 0;
-
- etfci->font = NULL;
-
- etfci->structure_change_id = 0;
- etfci->dimension_change_id = 0;
-
- etfci->dnd_code = NULL;
-
- etfci->maybe_drag = 0;
- etfci->drag_end_id = 0;
-
- e_canvas_item_set_reflow_callback(item, etfci_reflow);
-}
-
-GtkType
-e_table_field_chooser_item_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableFieldChooserItem",
- sizeof (ETableFieldChooserItem),
- sizeof (ETableFieldChooserItemClass),
- (GtkClassInitFunc) etfci_class_init,
- (GtkObjectInitFunc) etfci_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_OBJECT_TYPE, &info);
- }
-
- return type;
-}
-
diff --git a/widgets/table/e-table-field-chooser-item.h b/widgets/table/e-table-field-chooser-item.h
deleted file mode 100644
index 4b349f40e3..0000000000
--- a/widgets/table/e-table-field-chooser-item.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_FIELD_CHOOSER_ITEM_H_
-#define _E_TABLE_FIELD_CHOOSER_ITEM_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gnome-xml/tree.h>
-#include "e-table-header.h"
-
-#define E_TABLE_FIELD_CHOOSER_ITEM_TYPE (e_table_field_chooser_item_get_type ())
-#define E_TABLE_FIELD_CHOOSER_ITEM(o) (GTK_CHECK_CAST ((o), E_TABLE_FIELD_CHOOSER_ITEM_TYPE, ETableFieldChooserItem))
-#define E_TABLE_FIELD_CHOOSER_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_FIELD_CHOOSER_ITEM_TYPE, ETableFieldChooserItemClass))
-#define E_IS_TABLE_FIELD_CHOOSER_ITEM(o) (GTK_CHECK_TYPE ((o), E_TABLE_FIELD_CHOOSER_ITEM_TYPE))
-#define E_IS_TABLE_FIELD_CHOOSER_ITEM_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_FIELD_CHOOSER_ITEM_TYPE))
-
-typedef struct {
- GnomeCanvasItem parent;
- ETableHeader *full_header;
-
- double height, width;
- double button_height;
-
- GdkFont *font;
-
- /*
- * Ids
- */
- int structure_change_id, dimension_change_id;
-
- gchar *dnd_code;
-
- /*
- * For dragging columns
- */
- guint maybe_drag:1;
- int click_x, click_y;
- int drag_col;
- guint drag_data_get_id;
- guint drag_end_id;
-} ETableFieldChooserItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-} ETableFieldChooserItemClass;
-
-GtkType e_table_field_chooser_item_get_type (void);
-
-#endif /* _E_TABLE_FIELD_CHOOSER_ITEM_H_ */
diff --git a/widgets/table/e-table-field-chooser.c b/widgets/table/e-table-field-chooser.c
deleted file mode 100644
index 0d56945f7f..0000000000
--- a/widgets/table/e-table-field-chooser.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-field-chooser.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include <e-table-field-chooser.h>
-#include <e-table-field-chooser-item.h>
-
-static void e_table_field_chooser_init (ETableFieldChooser *card);
-static void e_table_field_chooser_class_init (ETableFieldChooserClass *klass);
-static void e_table_field_chooser_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_table_field_chooser_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_table_field_chooser_destroy (GtkObject *object);
-
-static GtkVBoxClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_FULL_HEADER,
- ARG_DND_CODE,
-};
-
-GtkType
-e_table_field_chooser_get_type (void)
-{
- static GtkType table_field_chooser_type = 0;
-
- if (!table_field_chooser_type)
- {
- static const GtkTypeInfo table_field_chooser_info =
- {
- "ETableFieldChooser",
- sizeof (ETableFieldChooser),
- sizeof (ETableFieldChooserClass),
- (GtkClassInitFunc) e_table_field_chooser_class_init,
- (GtkObjectInitFunc) e_table_field_chooser_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- table_field_chooser_type = gtk_type_unique (gtk_vbox_get_type (), &table_field_chooser_info);
- }
-
- return table_field_chooser_type;
-}
-
-static void
-e_table_field_chooser_class_init (ETableFieldChooserClass *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_table_field_chooser_set_arg;
- object_class->get_arg = e_table_field_chooser_get_arg;
- object_class->destroy = e_table_field_chooser_destroy;
- gtk_object_add_arg_type ("ETableFieldChooser::dnd_code", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_DND_CODE);
- gtk_object_add_arg_type ("ETableFieldChooser::full_header", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_FULL_HEADER);
-}
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, ETableFieldChooser *etfc)
-{
- double height;
- etfc->last_alloc = *allocation;
- gnome_canvas_item_set( etfc->item,
- "width", (double) allocation->width,
- NULL );
- gtk_object_get(GTK_OBJECT(etfc->item),
- "height", &height,
- NULL);
- height = MAX(height, allocation->height);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( etfc->canvas ), 0, 0, allocation->width - 1, height - 1);
- gnome_canvas_item_set( etfc->rect,
- "x2", (double) allocation->width,
- "y2", (double) height,
- NULL );
-}
-
-static void resize(GnomeCanvas *canvas, ETableFieldChooser *etfc)
-{
- double height;
- gtk_object_get(GTK_OBJECT(etfc->item),
- "height", &height,
- NULL);
-
- height = MAX(height, etfc->last_alloc.height);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS(etfc->canvas), 0, 0, etfc->last_alloc.width - 1, height - 1);
- gnome_canvas_item_set( etfc->rect,
- "x2", (double) etfc->last_alloc.width,
- "y2", (double) height,
- NULL );
-}
-
-static void
-e_table_field_chooser_init (ETableFieldChooser *etfc)
-{
- GladeXML *gui;
- GtkWidget *widget;
-
- gui = glade_xml_new (ETABLE_GLADEDIR "/e-table-field-chooser.glade", NULL);
- etfc->gui = gui;
-
- widget = glade_xml_get_widget(gui, "vbox-top");
- if (!widget) {
- return;
- }
- gtk_widget_reparent(widget,
- GTK_WIDGET(etfc));
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- etfc->canvas = GNOME_CANVAS(glade_xml_get_widget(gui, "canvas-buttons"));
-
- etfc->rect = gnome_canvas_item_new(gnome_canvas_root( GNOME_CANVAS( etfc->canvas ) ),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) 100,
- "y2", (double) 100,
- "fill_color", "white",
- NULL );
-
- etfc->item = gnome_canvas_item_new(gnome_canvas_root(etfc->canvas),
- e_table_field_chooser_item_get_type(),
- "width", (double) 100,
- "full_header", etfc->full_header,
- "dnd_code", etfc->dnd_code,
- NULL );
-
- gtk_signal_connect( GTK_OBJECT( etfc->canvas ), "reflow",
- GTK_SIGNAL_FUNC( resize ),
- etfc);
-
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( etfc->canvas ),
- 0, 0,
- 100, 100 );
-
- /* Connect the signals */
- gtk_signal_connect (GTK_OBJECT (etfc->canvas), "size_allocate",
- GTK_SIGNAL_FUNC (allocate_callback),
- etfc);
-
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
- gtk_widget_show(widget);
-}
-
-static void
-e_table_field_chooser_destroy (GtkObject *object)
-{
- ETableFieldChooser *etfc = E_TABLE_FIELD_CHOOSER(object);
-
- g_free(etfc->dnd_code);
- if (etfc->full_header)
- gtk_object_unref(GTK_OBJECT(etfc->full_header));
-
- if (etfc->gui)
- gtk_object_unref(GTK_OBJECT(etfc->gui));
-}
-
-GtkWidget*
-e_table_field_chooser_new (void)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_table_field_chooser_get_type ()));
- return widget;
-}
-
-static void
-e_table_field_chooser_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableFieldChooser *etfc = E_TABLE_FIELD_CHOOSER(object);
-
- switch (arg_id){
- case ARG_DND_CODE:
- g_free(etfc->dnd_code);
- etfc->dnd_code = g_strdup(GTK_VALUE_STRING (*arg));
- if (etfc->item)
- gtk_object_set(GTK_OBJECT(etfc->item),
- "dnd_code", etfc->dnd_code,
- NULL);
- break;
- case ARG_FULL_HEADER:
- if (etfc->full_header)
- gtk_object_unref(GTK_OBJECT(etfc->full_header));
- if (GTK_VALUE_OBJECT(*arg))
- etfc->full_header = E_TABLE_HEADER(GTK_VALUE_OBJECT(*arg));
- else
- etfc->full_header = NULL;
- if (etfc->full_header)
- gtk_object_ref(GTK_OBJECT(etfc->full_header));
- if (etfc->item)
- gtk_object_set(GTK_OBJECT(etfc->item),
- "full_header", etfc->full_header,
- NULL);
- break;
- default:
- break;
- }
-}
-
-static void
-e_table_field_chooser_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableFieldChooser *etfc = E_TABLE_FIELD_CHOOSER(object);
-
- switch (arg_id) {
- case ARG_DND_CODE:
- GTK_VALUE_STRING (*arg) = g_strdup (etfc->dnd_code);
- break;
- case ARG_FULL_HEADER:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etfc->full_header);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
diff --git a/widgets/table/e-table-field-chooser.glade b/widgets/table/e-table-field-chooser.glade
deleted file mode 100644
index a5cd37c2df..0000000000
--- a/widgets/table/e-table-field-chooser.glade
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <name>e-table-field-chooser</name>
- <program_name>e-table-field-chooser</program_name>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>True</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <gnome_help_support>True</gnome_help_support>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-table-field-chooser.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GnomeDialog</class>
- <name>dialog-field-chooser</name>
- <visible>False</visible>
- <title>Field Chooser</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
- <auto_close>False</auto_close>
- <hide_on_close>False</hide_on_close>
-
- <widget>
- <class>GtkVBox</class>
- <child_name>GnomeDialog:vbox</child_name>
- <name>dialog-vbox1</name>
- <homogeneous>False</homogeneous>
- <spacing>8</spacing>
- <child>
- <padding>4</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkHButtonBox</class>
- <child_name>GnomeDialog:action_area</child_name>
- <name>dialog-action_area1</name>
- <layout_style>GTK_BUTTONBOX_END</layout_style>
- <spacing>8</spacing>
- <child_min_width>85</child_min_width>
- <child_min_height>27</child_min_height>
- <child_ipad_x>7</child_ipad_x>
- <child_ipad_y>0</child_ipad_y>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>True</fill>
- <pack>GTK_PACK_END</pack>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button3</name>
- <can_default>True</can_default>
- <can_focus>True</can_focus>
- <stock_button>GNOME_STOCK_BUTTON_CLOSE</stock_button>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox-top</name>
- <homogeneous>False</homogeneous>
- <spacing>4</spacing>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>GtkLabel</class>
- <name>label1</name>
- <label>To add a column to your table, drag it into
-the location in which you want it to appear.</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <width>200</width>
- <height>200</height>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
-
- <widget>
- <class>Custom</class>
- <name>canvas-buttons</name>
- <creation_function>e_canvas_new</creation_function>
- <int1>0</int1>
- <int2>0</int2>
- <last_modification_time>Thu, 08 Jun 2000 07:27:33 GMT</last_modification_time>
- </widget>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/widgets/table/e-table-field-chooser.glade.h b/widgets/table/e-table-field-chooser.glade.h
deleted file mode 100644
index a36bd6052c..0000000000
--- a/widgets/table/e-table-field-chooser.glade.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("Field Chooser");
-gchar *s = N_("To add a column to your table, drag it into\n"
- "the location in which you want it to appear.");
diff --git a/widgets/table/e-table-field-chooser.h b/widgets/table/e-table-field-chooser.h
deleted file mode 100644
index d84aafdc63..0000000000
--- a/widgets/table/e-table-field-chooser.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor-fullname.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_TABLE_FIELD_CHOOSER_H__
-#define __E_TABLE_FIELD_CHOOSER_H__
-
-#include <gnome.h>
-#include <glade/glade.h>
-#include "e-table-header.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETableFieldChooser - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- */
-
-#define E_TABLE_FIELD_CHOOSER_TYPE (e_table_field_chooser_get_type ())
-#define E_TABLE_FIELD_CHOOSER(obj) (GTK_CHECK_CAST ((obj), E_TABLE_FIELD_CHOOSER_TYPE, ETableFieldChooser))
-#define E_TABLE_FIELD_CHOOSER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TABLE_FIELD_CHOOSER_TYPE, ETableFieldChooserClass))
-#define E_IS_TABLE_FIELD_CHOOSER(obj) (GTK_CHECK_TYPE ((obj), E_TABLE_FIELD_CHOOSER_TYPE))
-#define E_IS_TABLE_FIELD_CHOOSER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TABLE_FIELD_CHOOSER_TYPE))
-
-
-typedef struct _ETableFieldChooser ETableFieldChooser;
-typedef struct _ETableFieldChooserClass ETableFieldChooserClass;
-
-struct _ETableFieldChooser
-{
- GtkVBox parent;
-
- /* item specific fields */
- GladeXML *gui;
- GnomeCanvas *canvas;
- GnomeCanvasItem *item;
-
- GnomeCanvasItem *rect;
- GtkAllocation last_alloc;
-
- gchar *dnd_code;
- ETableHeader *full_header;
-};
-
-struct _ETableFieldChooserClass
-{
- GtkVBoxClass parent_class;
-};
-
-
-GtkWidget *e_table_field_chooser_new(void);
-GtkType e_table_field_chooser_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TABLE_FIELD_CHOOSER_H__ */
diff --git a/widgets/table/e-table-group-container.c b/widgets/table/e-table-group-container.c
deleted file mode 100644
index 3a68bc044b..0000000000
--- a/widgets/table/e-table-group-container.c
+++ /dev/null
@@ -1,1169 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-Table-Group.c: Implements the grouping objects for elements on a table
- *
- * Author:
- * Chris Lahey <clahey@helixcode.com>
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-group-container.h"
-#include "e-table-group-leaf.h"
-#include "e-table-item.h"
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include "e-util/e-util.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-canvas-utils.h"
-#include "widgets/e-text/e-text.h"
-#include "e-table-defines.h"
-
-#define TITLE_HEIGHT 16
-
-#define PARENT_TYPE e_table_group_get_type ()
-
-static GnomeCanvasGroupClass *etgc_parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_HEIGHT,
- ARG_WIDTH,
- ARG_MINIMUM_WIDTH,
- ARG_FROZEN,
- ARG_TABLE_DRAW_GRID,
- ARG_TABLE_DRAW_FOCUS,
- ARG_CURSOR_MODE,
- ARG_TABLE_SELECTION_MODEL,
- ARG_LENGTH_THRESHOLD,
-};
-
-typedef struct {
- ETableGroup *child;
- void *key;
- char *string;
- GnomeCanvasItem *text;
- GnomeCanvasItem *rect;
- gint count;
-} ETableGroupContainerChildNode;
-
-static EPrintable *
-etgc_get_printable (ETableGroup *etg);
-
-
-static void
-e_table_group_container_child_node_free (ETableGroupContainer *etgc,
- ETableGroupContainerChildNode *child_node)
-{
- ETableGroup *etg = E_TABLE_GROUP (etgc);
- ETableGroup *child = child_node->child;
-
- gtk_object_destroy (GTK_OBJECT (child));
- e_table_model_free_value (etg->model, etgc->ecol->col_idx,
- child_node->key);
- g_free(child_node->string);
- gtk_object_destroy (GTK_OBJECT (child_node->text));
- gtk_object_destroy (GTK_OBJECT (child_node->rect));
-}
-
-static void
-e_table_group_container_list_free (ETableGroupContainer *etgc)
-{
- ETableGroupContainerChildNode *child_node;
- GList *list;
-
- for (list = etgc->children; list; list = g_list_next (list)) {
- child_node = (ETableGroupContainerChildNode *) list->data;
- e_table_group_container_child_node_free (etgc, child_node);
- }
-
- g_list_free (etgc->children);
-}
-
-static void
-etgc_destroy (GtkObject *object)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);
-
- if (etgc->font)
- gdk_font_unref (etgc->font);
- etgc->font = NULL;
-
- if (etgc->ecol)
- gtk_object_unref (GTK_OBJECT(etgc->ecol));
-
- if (etgc->sort_info)
- gtk_object_unref (GTK_OBJECT(etgc->sort_info));
-
- if (etgc->table_selection_model)
- gtk_object_unref (GTK_OBJECT(etgc->table_selection_model));
-
- if (etgc->rect)
- gtk_object_destroy (GTK_OBJECT(etgc->rect));
-
- e_table_group_container_list_free (etgc);
-
- GTK_OBJECT_CLASS (etgc_parent_class)->destroy (object);
-}
-
-void
-e_table_group_container_construct (GnomeCanvasGroup *parent, ETableGroupContainer *etgc,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model, ETableSortInfo *sort_info, int n)
-{
- ETableCol *col;
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(sort_info, n);
-
- if (column.column > e_table_header_count (full_header))
- col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
- else
- col = e_table_header_get_column (full_header, column.column);
-
- e_table_group_construct (parent, E_TABLE_GROUP (etgc), full_header, header, model);
- etgc->ecol = col;
- gtk_object_ref (GTK_OBJECT(etgc->ecol));
- etgc->sort_info = sort_info;
- gtk_object_ref (GTK_OBJECT(etgc->sort_info));
- etgc->n = n;
- etgc->ascending = column.ascending;
-
-
- etgc->font = gdk_font_load ("lucidasans-10");
- if (!etgc->font){
- etgc->font = GTK_WIDGET (GNOME_CANVAS_ITEM (etgc)->canvas)->style->font;
-
- gdk_font_ref (etgc->font);
- }
- etgc->open = TRUE;
-}
-
-ETableGroup *
-e_table_group_container_new (GnomeCanvasGroup *parent, ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model, ETableSortInfo *sort_info, int n)
-{
- ETableGroupContainer *etgc;
-
- g_return_val_if_fail (parent != NULL, NULL);
-
- etgc = gtk_type_new (e_table_group_container_get_type ());
-
- e_table_group_container_construct (parent, etgc, full_header, header,
- model, sort_info, n);
- return E_TABLE_GROUP (etgc);
-}
-
-
-static int
-etgc_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(item);
- gboolean return_val = TRUE;
- gboolean change_focus = FALSE;
- gboolean use_col = FALSE;
- gint start_col = 0;
- gint old_col;
- EFocus direction = E_FOCUS_START;
-
- switch (event->type) {
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Tab ||
- event->key.keyval == GDK_KP_Tab ||
- event->key.keyval == GDK_ISO_Left_Tab) {
- change_focus = TRUE;
- use_col = TRUE;
- start_col = (event->key.state & GDK_SHIFT_MASK) ? -1 : 0;
- direction = (event->key.state & GDK_SHIFT_MASK) ? E_FOCUS_END : E_FOCUS_START;
- } else if (event->key.keyval == GDK_Left ||
- event->key.keyval == GDK_KP_Left) {
- change_focus = TRUE;
- use_col = TRUE;
- start_col = -1;
- direction = E_FOCUS_END;
- } else if (event->key.keyval == GDK_Right ||
- event->key.keyval == GDK_KP_Right) {
- change_focus = TRUE;
- use_col = TRUE;
- start_col = 0;
- direction = E_FOCUS_START;
- } else if (event->key.keyval == GDK_Down ||
- event->key.keyval == GDK_KP_Down) {
- change_focus = TRUE;
- use_col = FALSE;
- direction = E_FOCUS_START;
- } else if (event->key.keyval == GDK_Up ||
- event->key.keyval == GDK_KP_Up) {
- change_focus = TRUE;
- use_col = FALSE;
- direction = E_FOCUS_END;
- } else if (event->key.keyval == GDK_Return ||
- event->key.keyval == GDK_KP_Enter) {
- change_focus = TRUE;
- use_col = FALSE;
- direction = E_FOCUS_START;
- }
- if (change_focus){
- GList *list;
- for (list = etgc->children; list; list = list->next) {
- ETableGroupContainerChildNode *child_node;
- ETableGroup *child;
-
- child_node = (ETableGroupContainerChildNode *)list->data;
- child = child_node->child;
-
- if (e_table_group_get_focus (child)) {
- old_col = e_table_group_get_focus_column (child);
- if (old_col == -1)
- old_col = 0;
- if (start_col == -1)
- start_col = e_table_header_count (e_table_group_get_header (child)) - 1;
-
- if (direction == E_FOCUS_END)
- list = list->prev;
- else
- list = list->next;
-
- if (list) {
- child_node = (ETableGroupContainerChildNode *)list->data;
- child = child_node->child;
- if (use_col)
- e_table_group_set_focus (child, direction, start_col);
- else
- e_table_group_set_focus (child, direction, old_col);
- return 1;
- } else {
- return 0;
- }
- }
- }
- if (direction == E_FOCUS_END)
- list = g_list_last(etgc->children);
- else
- list = etgc->children;
- if (list) {
- ETableGroupContainerChildNode *child_node;
- ETableGroup *child;
-
- child_node = (ETableGroupContainerChildNode *)list->data;
- child = child_node->child;
-
- if (start_col == -1)
- start_col = e_table_header_count (e_table_group_get_header (child)) - 1;
-
- e_table_group_set_focus (child, direction, start_col);
- return 1;
- }
- }
- return_val = FALSE;
- break;
- default:
- return_val = FALSE;
- break;
- }
- if (return_val == FALSE) {
- if (GNOME_CANVAS_ITEM_CLASS(etgc_parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->event (item, event);
- }
- return return_val;
-
-}
-
-/* Realize handler for the text item */
-static void
-etgc_realize (GnomeCanvasItem *item)
-{
- ETableGroupContainer *etgc;
-
- if (GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->realize)
- (* GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->realize) (item);
-
- etgc = E_TABLE_GROUP_CONTAINER (item);
-
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc));
-}
-
-/* Unrealize handler for the etgc item */
-static void
-etgc_unrealize (GnomeCanvasItem *item)
-{
- ETableGroupContainer *etgc;
-
- etgc = E_TABLE_GROUP_CONTAINER (item);
-
- if (GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->unrealize)
- (* GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->unrealize) (item);
-}
-
-static void
-compute_text (ETableGroupContainer *etgc, ETableGroupContainerChildNode *child_node)
-{
- gchar *text;
- if (etgc->ecol->text)
- text = g_strdup_printf ("%s : %s (%d item%s)",
- etgc->ecol->text,
- child_node->string,
- (gint) child_node->count,
- child_node->count == 1 ? "" : "s");
- else
- text = g_strdup_printf ("%s (%d item%s)",
- child_node->string,
- (gint) child_node->count,
- child_node->count == 1 ? "" : "s");
- gnome_canvas_item_set (child_node->text,
- "text", text,
- NULL);
- g_free (text);
-}
-
-static void
-child_cursor_change (ETableGroup *etg, int row,
- ETableGroupContainer *etgc)
-{
- e_table_group_cursor_change (E_TABLE_GROUP (etgc), row);
-}
-
-static void
-child_double_click (ETableGroup *etg, int row,
- ETableGroupContainer *etgc)
-{
- e_table_group_double_click (E_TABLE_GROUP (etgc), row);
-}
-
-static gint
-child_right_click (ETableGroup *etg, int row, int col, GdkEvent *event,
- ETableGroupContainer *etgc)
-{
- return e_table_group_right_click (E_TABLE_GROUP (etgc), row, col, event);
-}
-
-static gint
-child_key_press (ETableGroup *etg, int row, int col, GdkEvent *event,
- ETableGroupContainer *etgc)
-{
- return e_table_group_key_press (E_TABLE_GROUP (etgc), row, col, event);
-}
-
-static void
-etgc_add (ETableGroup *etg, gint row)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg);
- void *val = e_table_model_value_at (etg->model, etgc->ecol->col_idx, row);
- GCompareFunc comp = etgc->ecol->compare;
- GList *list = etgc->children;
- ETableGroup *child;
- ETableGroupContainerChildNode *child_node;
- int i = 0;
-
- for (; list; list = g_list_next (list), i++){
- int comp_val;
-
- child_node = list->data;
- comp_val = (*comp)(child_node->key, val);
- if (comp_val == 0) {
- child = child_node->child;
- child_node->count ++;
- e_table_group_add (child, row);
- compute_text (etgc, child_node);
- return;
- }
- if ((comp_val > 0 && etgc->ascending) ||
- (comp_val < 0 && (!etgc->ascending)))
- break;
- }
- child_node = g_new (ETableGroupContainerChildNode, 1);
- child_node->rect = gnome_canvas_item_new (GNOME_CANVAS_GROUP (etgc),
- gnome_canvas_rect_get_type (),
- "fill_color", "grey70",
- "outline_color", "grey50",
- NULL);
- child_node->text = gnome_canvas_item_new (GNOME_CANVAS_GROUP (etgc),
- e_text_get_type (),
- "font_gdk", etgc->font,
- "anchor", GTK_ANCHOR_SW,
- "fill_color", "black",
- NULL);
- child = e_table_group_new (GNOME_CANVAS_GROUP (etgc), etg->full_header,
- etg->header, etg->model, etgc->sort_info, etgc->n + 1);
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(child),
- "drawgrid", etgc->draw_grid,
- "drawfocus", etgc->draw_focus,
- "cursor_mode", etgc->cursor_mode,
- "table_selection_model", etgc->table_selection_model,
- "length_threshold", etgc->length_threshold,
- NULL);
- gtk_signal_connect (GTK_OBJECT (child), "cursor_change",
- GTK_SIGNAL_FUNC (child_cursor_change), etgc);
- gtk_signal_connect (GTK_OBJECT (child), "double_click",
- GTK_SIGNAL_FUNC (child_double_click), etgc);
- gtk_signal_connect (GTK_OBJECT (child), "right_click",
- GTK_SIGNAL_FUNC (child_right_click), etgc);
- gtk_signal_connect (GTK_OBJECT (child), "key_press",
- GTK_SIGNAL_FUNC (child_key_press), etgc);
- child_node->child = child;
- child_node->key = e_table_model_duplicate_value (etg->model, etgc->ecol->col_idx, val);
- child_node->string = e_table_model_value_to_string (etg->model, etgc->ecol->col_idx, val);
- child_node->count = 1;
- e_table_group_add (child, row);
-
- if (list)
- etgc->children = g_list_insert (etgc->children, child_node, i);
- else
- etgc->children = g_list_append (etgc->children, child_node);
-
- compute_text (etgc, child_node);
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc));
-}
-
-static void
-etgc_add_all (ETableGroup *etg)
-{
- int rows = e_table_model_row_count(etg->model);
- int i;
- for (i = 0; i < rows; i++)
- etgc_add(etg, i);
-}
-
-static gboolean
-etgc_remove (ETableGroup *etg, gint row)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list;
-
- for (list = etgc->children ; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = list->data;
- ETableGroup *child = child_node->child;
-
- if (e_table_group_remove (child, row)) {
- child_node->count --;
- if (child_node->count == 0) {
- e_table_group_container_child_node_free (etgc, child_node);
- etgc->children = g_list_remove (etgc->children, child_node);
- g_free (child_node);
- } else
- compute_text (etgc, child_node);
-
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc));
-
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static int
-etgc_row_count (ETableGroup *etg)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list;
- gint count = 0;
- for (list = etgc->children; list; list = g_list_next(list)) {
- ETableGroup *group = ((ETableGroupContainerChildNode *)list->data)->child;
- gint this_count = e_table_group_row_count(group);
- count += this_count;
- }
- return count;
-}
-
-static void
-etgc_increment (ETableGroup *etg, gint position, gint amount)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list = etgc->children;
-
- for (list = etgc->children ; list; list = g_list_next (list))
- e_table_group_increment (((ETableGroupContainerChildNode *)list->data)->child,
- position, amount);
-}
-
-static void
-etgc_decrement (ETableGroup *etg, gint position, gint amount)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list = etgc->children;
-
- for (list = etgc->children ; list; list = g_list_next (list))
- e_table_group_decrement (((ETableGroupContainerChildNode *)list->data)->child,
- position, amount);
-}
-
-static void
-etgc_set_cursor_row (ETableGroup *etg, gint row)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list;
- for (list = etgc->children; list; list = g_list_next(list)) {
- ETableGroup *group = ((ETableGroupContainerChildNode *)list->data)->child;
- gint this_count = e_table_group_row_count(group);
- if (row < this_count) {
- e_table_group_set_cursor_row(group, row);
- return;
- }
- row -= this_count;
- }
-}
-
-static int
-etgc_get_cursor_row (ETableGroup *etg)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- GList *list;
- int count = 0;
- for (list = etgc->children; list; list = g_list_next(list)) {
- ETableGroup *group = ((ETableGroupContainerChildNode *)list->data)->child;
- int row = e_table_group_get_cursor_row(group);
- if (row != -1)
- return count + row;
- count += e_table_group_row_count(group);
- }
- return -1;
-}
-
-static void
-etgc_set_focus (ETableGroup *etg, EFocus direction, gint view_col)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- if (etgc->children) {
- if (direction == E_FOCUS_END)
- e_table_group_set_focus (((ETableGroupContainerChildNode *)g_list_last (etgc->children)->data)->child,
- direction, view_col);
- else
- e_table_group_set_focus (((ETableGroupContainerChildNode *)etgc->children->data)->child,
- direction, view_col);
- }
-}
-
-static gint
-etgc_get_focus_column (ETableGroup *etg)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- if (etgc->children) {
- GList *list;
- for (list = etgc->children; list; list = list->next) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- ETableGroup *child = child_node->child;
- if (e_table_group_get_focus (child)) {
- return e_table_group_get_focus_column (child);
- }
- }
- }
- return 0;
-}
-
-static void
-etgc_compute_location (ETableGroup *etg, int *x, int *y, int *row, int *col)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-
- if (row)
- *row = -1;
- if (col)
- *col = -1;
-
- *x -= GROUP_INDENT;
- *y -= TITLE_HEIGHT;
-
- if (*x >= 0 && *y >= 0 && etgc->children) {
- GList *list;
- for (list = etgc->children; list; list = list->next) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- ETableGroup *child = child_node->child;
-
- e_table_group_compute_location (child, x, y, row, col);
- if ((*row != -1) && (*col != -1))
- return;
- }
- }
-}
-
-static void etgc_thaw (ETableGroup *etg)
-{
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM(etg));
-}
-
-static void
-etgc_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableGroup *etg = E_TABLE_GROUP (object);
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);
- GList *list;
-
- switch (arg_id) {
- case ARG_FROZEN:
- if (GTK_VALUE_BOOL (*arg))
- etg->frozen = TRUE;
- else {
- etg->frozen = FALSE;
- etgc_thaw (etg);
- }
- break;
- case ARG_MINIMUM_WIDTH:
- case ARG_WIDTH:
- etgc->minimum_width = GTK_VALUE_DOUBLE(*arg);
-
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "minimum_width", etgc->minimum_width - GROUP_INDENT,
- NULL);
- }
- break;
- case ARG_LENGTH_THRESHOLD:
- etgc->length_threshold = GTK_VALUE_INT (*arg);
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "length_threshold", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
-
- case ARG_TABLE_SELECTION_MODEL:
- if (etgc->table_selection_model)
- gtk_object_unref(GTK_OBJECT(etgc->table_selection_model));
- etgc->table_selection_model = E_TABLE_SELECTION_MODEL(GTK_VALUE_OBJECT (*arg));
- if (etgc->table_selection_model)
- gtk_object_ref(GTK_OBJECT(etgc->table_selection_model));
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "table_selection_model", etgc->table_selection_model,
- NULL);
- }
- break;
-
- case ARG_TABLE_DRAW_GRID:
- etgc->draw_grid = GTK_VALUE_BOOL (*arg);
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "drawgrid", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- etgc->draw_focus = GTK_VALUE_BOOL (*arg);
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "drawfocus", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_CURSOR_MODE:
- etgc->cursor_mode = GTK_VALUE_INT (*arg);
- for (list = etgc->children; list; list = g_list_next (list)) {
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
- gtk_object_set (GTK_OBJECT(child_node->child),
- "cursor_mode", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
- default:
- break;
- }
-}
-
-static void
-etgc_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableGroup *etg = E_TABLE_GROUP (object);
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);
-
- switch (arg_id) {
- case ARG_FROZEN:
- GTK_VALUE_BOOL (*arg) = etg->frozen;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = etgc->height;
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = etgc->width;
- break;
- case ARG_MINIMUM_WIDTH:
- etgc->minimum_width = GTK_VALUE_DOUBLE(*arg);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-etgc_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
- ETableGroupClass *e_group_class = E_TABLE_GROUP_CLASS(object_class);
-
- object_class->destroy = etgc_destroy;
- object_class->set_arg = etgc_set_arg;
- object_class->get_arg = etgc_get_arg;
-
- item_class->event = etgc_event;
- item_class->realize = etgc_realize;
- item_class->unrealize = etgc_unrealize;
-
- etgc_parent_class = gtk_type_class (PARENT_TYPE);
-
- e_group_class->add = etgc_add;
- e_group_class->add_all = etgc_add_all;
- e_group_class->remove = etgc_remove;
- e_group_class->increment = etgc_increment;
- e_group_class->decrement = etgc_decrement;
- e_group_class->row_count = etgc_row_count;
- e_group_class->set_focus = etgc_set_focus;
- e_group_class->set_cursor_row = etgc_set_cursor_row;
- e_group_class->get_cursor_row = etgc_get_cursor_row;
- e_group_class->get_focus_column = etgc_get_focus_column;
- e_group_class->get_printable = etgc_get_printable;
- e_group_class->compute_location = etgc_compute_location;
-
- gtk_object_add_arg_type ("ETableGroupContainer::drawgrid", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_GRID);
- gtk_object_add_arg_type ("ETableGroupContainer::drawfocus", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_FOCUS);
- gtk_object_add_arg_type ("ETableGroupContainer::cursor_mode", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_CURSOR_MODE);
- gtk_object_add_arg_type ("ETableGroupContainer::table_selection_model", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_SELECTION_MODEL);
- gtk_object_add_arg_type ("ETableGroupContainer::length_threshold", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
-
- gtk_object_add_arg_type ("ETableGroupContainer::frozen", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_FROZEN);
- gtk_object_add_arg_type ("ETableGroupContainer::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("ETableGroupContainer::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableGroupContainer::minimum_width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MINIMUM_WIDTH);
-}
-
-static void
-etgc_reflow (GnomeCanvasItem *item, gint flags)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(item);
- gboolean frozen;
-
- gtk_object_get (GTK_OBJECT(etgc),
- "frozen", &frozen,
- NULL);
-
- if (frozen)
- return;
-
-
- if (GTK_OBJECT_FLAGS(etgc)& GNOME_CANVAS_ITEM_REALIZED){
- gdouble running_height = 0;
- gdouble running_width = 0;
- gdouble old_height;
- gdouble old_width;
-
- old_height = etgc->height;
- old_width = etgc->width;
- if (etgc->children == NULL){
- } else {
- GList *list;
- gdouble extra_height = 0;
- gdouble item_height = 0;
- gdouble item_width = 0;
-
- if (etgc->font)
- extra_height += etgc->font->ascent + etgc->font->descent + BUTTON_PADDING * 2;
-
- extra_height = MAX(extra_height, BUTTON_HEIGHT + BUTTON_PADDING * 2);
-
- running_height = extra_height;
-
- for ( list = etgc->children; list; list = g_list_next (list)){
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *) list->data;
- ETableGroup *child = child_node->child;
-
- gtk_object_get (GTK_OBJECT(child),
- "width", &item_width,
- NULL);
-
- if (item_width > running_width)
- running_width = item_width;
- }
- for ( list = etgc->children; list; list = g_list_next (list)){
- ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *) list->data;
- ETableGroup *child = child_node->child;
- gtk_object_get (GTK_OBJECT(child),
- "height", &item_height,
- NULL);
-
- e_canvas_item_move_absolute (GNOME_CANVAS_ITEM(child_node->text),
- GROUP_INDENT,
- running_height - BUTTON_PADDING);
-
- e_canvas_item_move_absolute (GNOME_CANVAS_ITEM(child),
- GROUP_INDENT,
- running_height);
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(child_node->rect),
- "x1", (double) 0,
- "x2", (double) running_width + GROUP_INDENT,
- "y1", (double) running_height - extra_height,
- "y2", (double) running_height + item_height,
- NULL);
-
- running_height += item_height + extra_height;
- }
- running_height -= extra_height;
- }
- if (running_height != old_height || running_width != old_width) {
- etgc->height = running_height;
- etgc->width = running_width;
- e_canvas_item_request_parent_reflow (item);
- }
- }
-}
-
-static void
-etgc_init (GtkObject *object)
-{
- ETableGroupContainer *container = E_TABLE_GROUP_CONTAINER(object);
- container->children = FALSE;
-
- e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM(object), etgc_reflow);
-
- container->draw_grid = 1;
- container->draw_focus = 1;
- container->cursor_mode = E_TABLE_CURSOR_SIMPLE;
- container->length_threshold = -1;
- container->table_selection_model = NULL;
-}
-
-E_MAKE_TYPE (e_table_group_container, "ETableGroupContainer", ETableGroupContainer, etgc_class_init, etgc_init, PARENT_TYPE);
-
-void
-e_table_group_apply_to_leafs (ETableGroup *etg, ETableGroupLeafFn fn, void *closure)
-{
- if (E_IS_TABLE_GROUP_CONTAINER (etg)){
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg);
- GList *list = etgc->children;
-
- for (list = etgc->children; list; list = list->next){
- ETableGroupContainerChildNode *child_node = list->data;
-
- e_table_group_apply_to_leafs (child_node->child, fn, closure);
- }
- } else if (E_IS_TABLE_GROUP_LEAF (etg)){
- (*fn) (E_TABLE_GROUP_LEAF (etg)->item, closure);
- } else {
- g_error ("Unknown ETableGroup found: %s",
- gtk_type_name (GTK_OBJECT (etg)->klass->type));
- }
-}
-
-
-typedef struct {
- ETableGroupContainer *etgc;
- GList *child;
- EPrintable *child_printable;
-} ETGCPrintContext;
-
-#if 0
-#define CHECK(x) if((x) == -1) return -1;
-
-static gint
-gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height, gdouble r, gdouble g, gdouble b)
-{
- CHECK(gnome_print_moveto(context, x, y));
- CHECK(gnome_print_lineto(context, x + width, y));
- CHECK(gnome_print_lineto(context, x + width, y - height));
- CHECK(gnome_print_lineto(context, x, y - height));
- CHECK(gnome_print_lineto(context, x, y));
- return gnome_print_fill(context);
-}
-#endif
-
-static void
-e_table_group_container_print_page (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble height,
- gboolean quantize,
- ETGCPrintContext *groupcontext)
-{
- gdouble yd = height;
- gdouble child_height;
- ETableGroupContainerChildNode *child_node;
- GList *child;
- EPrintable *child_printable;
-
- child_printable = groupcontext->child_printable;
- child = groupcontext->child;
-
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- else {
- if (!child) {
- return;
- } else {
- child_node = child->data;
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
- }
-
- while (1) {
- child_height = e_printable_height(child_printable, context, width - 36, yd, quantize);
-
- if (gnome_print_gsave(context) == -1)
- /* FIXME */;
- if (gnome_print_translate(context, 36, yd - child_height) == -1)
- /* FIXME */;
-
- if (gnome_print_moveto(context, 0, 0) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, width - 36, 0) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, width - 36, child_height) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 0, child_height) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 0, 0) == -1)
- /* FIXME */;
- if (gnome_print_clip(context) == -1)
- /* FIXME */;
-
- e_printable_print_page(child_printable, context, width - 36, child_height, quantize);
-
- if (gnome_print_grestore(context) == -1)
- /* FIXME */;
-
- yd -= child_height;
-
- if (e_printable_data_left(child_printable))
- break;
-
- child = child->next;
- if (!child) {
- child_printable = NULL;
- break;
- }
-
- child_node = child->data;
- if (child_printable)
- gtk_object_unref(GTK_OBJECT(child_printable));
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
-
- if (groupcontext->child_printable)
- gtk_object_unref(GTK_OBJECT(groupcontext->child_printable));
- groupcontext->child_printable = child_printable;
- groupcontext->child = child;
-
-}
-
-static gboolean
-e_table_group_container_data_left (EPrintable *ep,
- ETGCPrintContext *groupcontext)
-{
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "data_left");
- return groupcontext->child != NULL;
-}
-
-static void
-e_table_group_container_reset (EPrintable *ep,
- ETGCPrintContext *groupcontext)
-{
- groupcontext->child = groupcontext->etgc->children;
- if (groupcontext->child_printable)
- gtk_object_unref(GTK_OBJECT(groupcontext->child_printable));
- groupcontext->child_printable = NULL;
-}
-
-static gdouble
-e_table_group_container_height (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantize,
- ETGCPrintContext *groupcontext)
-{
- gdouble height = 0;
- gdouble child_height;
- gdouble yd = max_height;
- ETableGroupContainerChildNode *child_node;
- GList *child;
- EPrintable *child_printable;
-
- child_printable = groupcontext->child_printable;
- child = groupcontext->child;
-
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- else {
- if (!child) {
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "height");
- return 0;
- } else {
- child_node = child->data;
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
- }
-
- while (1) {
- child_height = e_printable_height(child_printable, context, width - 36, yd, quantize);
-
- height += child_height;
-
- if (yd != -1) {
- if (!e_printable_will_fit(child_printable, context, width - 36, yd, quantize)) {
- break;
- }
-
- yd -= child_height;
- }
-
- child = child->next;
- if (!child) {
- break;
- }
-
- child_node = child->data;
- if (child_printable)
- gtk_object_unref(GTK_OBJECT(child_printable));
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
- if (child_printable)
- gtk_object_unref(GTK_OBJECT(child_printable));
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "height");
- return height;
-}
-
-static gboolean
-e_table_group_container_will_fit (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantize,
- ETGCPrintContext *groupcontext)
-{
- gboolean will_fit = TRUE;
- gdouble child_height;
- gdouble yd = max_height;
- ETableGroupContainerChildNode *child_node;
- GList *child;
- EPrintable *child_printable;
-
- child_printable = groupcontext->child_printable;
- child = groupcontext->child;
-
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- else {
- if (!child) {
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "will_fit");
- return will_fit;
- } else {
- child_node = child->data;
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
- }
-
- while (1) {
- child_height = e_printable_height(child_printable, context, width - 36, yd, quantize);
-
- if (yd != -1) {
- if (!e_printable_will_fit(child_printable, context, width - 36, yd, quantize)) {
- will_fit = FALSE;
- break;
- }
-
- yd -= child_height;
- }
-
- child = child->next;
- if (!child) {
- break;
- }
-
- child_node = child->data;
- if (child_printable)
- gtk_object_unref(GTK_OBJECT(child_printable));
- child_printable = e_table_group_get_printable(child_node->child);
- if (child_printable)
- gtk_object_ref(GTK_OBJECT(child_printable));
- e_printable_reset(child_printable);
- }
-
- if (child_printable)
- gtk_object_unref(GTK_OBJECT(child_printable));
-
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "will_fit");
- return will_fit;
-}
-
-static void
-e_table_group_container_printable_destroy (GtkObject *object,
- ETGCPrintContext *groupcontext)
-{
- gtk_object_unref(GTK_OBJECT(groupcontext->etgc));
- if (groupcontext->child_printable)
- gtk_object_ref(GTK_OBJECT(groupcontext->child_printable));
- g_free(groupcontext);
-}
-
-static EPrintable *
-etgc_get_printable (ETableGroup *etg)
-{
- ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
- EPrintable *printable = e_printable_new();
- ETGCPrintContext *groupcontext;
-
- groupcontext = g_new(ETGCPrintContext, 1);
- groupcontext->etgc = etgc;
- gtk_object_ref(GTK_OBJECT(etgc));
- groupcontext->child = etgc->children;
- groupcontext->child_printable = NULL;
-
- gtk_signal_connect (GTK_OBJECT(printable),
- "print_page",
- GTK_SIGNAL_FUNC(e_table_group_container_print_page),
- groupcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "data_left",
- GTK_SIGNAL_FUNC(e_table_group_container_data_left),
- groupcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "reset",
- GTK_SIGNAL_FUNC(e_table_group_container_reset),
- groupcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "height",
- GTK_SIGNAL_FUNC(e_table_group_container_height),
- groupcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "will_fit",
- GTK_SIGNAL_FUNC(e_table_group_container_will_fit),
- groupcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "destroy",
- GTK_SIGNAL_FUNC(e_table_group_container_printable_destroy),
- groupcontext);
-
- return printable;
-}
diff --git a/widgets/table/e-table-group-container.h b/widgets/table/e-table-group-container.h
deleted file mode 100644
index bdb717b92d..0000000000
--- a/widgets/table/e-table-group-container.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_GROUP_CONTAINER_H_
-#define _E_TABLE_GROUP_CONTAINER_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-table-model.h"
-#include "e-table-header.h"
-#include "e-table-group.h"
-#include "e-table-item.h"
-
-#define E_TABLE_GROUP_CONTAINER_TYPE (e_table_group_container_get_type ())
-#define E_TABLE_GROUP_CONTAINER(o) (GTK_CHECK_CAST ((o), E_TABLE_GROUP_CONTAINER_TYPE, ETableGroupContainer))
-#define E_TABLE_GROUP_CONTAINER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_GROUP_CONTAINER_TYPE, ETableGroupContainerClass))
-#define E_IS_TABLE_GROUP_CONTAINER(o) (GTK_CHECK_TYPE ((o), E_TABLE_GROUP_CONTAINER_TYPE))
-#define E_IS_TABLE_GROUP_CONTAINER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_GROUP_CONTAINER_TYPE))
-
-typedef struct {
- ETableGroup group;
-
- /*
- * The ETableCol used to group this set
- */
- ETableCol *ecol;
- gint ascending;
-
- /*
- * List of ETableGroups we stack
- */
- GList *children;
-
- /*
- * The canvas rectangle that contains the children
- */
- GnomeCanvasItem *rect;
-
- GdkFont *font;
-
- gdouble width, height, minimum_width;
-
- ETableSortInfo *sort_info;
- int n;
- int length_threshold;
-
- ETableSelectionModel *table_selection_model;
-
- guint draw_grid : 1;
- guint draw_focus : 1;
- ETableCursorMode cursor_mode;
-
- /*
- * State: the ETableGroup is open or closed
- */
- guint open:1;
-} ETableGroupContainer;
-
-typedef struct {
- ETableGroupClass parent_class;
-} ETableGroupContainerClass;
-
-ETableGroup *e_table_group_container_new (GnomeCanvasGroup *parent, ETableHeader *full_header, ETableHeader *header,
- ETableModel *model, ETableSortInfo *sort_info, int n);
-void e_table_group_container_construct (GnomeCanvasGroup *parent, ETableGroupContainer *etgc,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model, ETableSortInfo *sort_info, int n);
-
-GtkType e_table_group_container_get_type (void);
-
-#endif /* _E_TABLE_GROUP_CONTAINER_H_ */
diff --git a/widgets/table/e-table-group-leaf.c b/widgets/table/e-table-group-leaf.c
deleted file mode 100644
index c4792eb87e..0000000000
--- a/widgets/table/e-table-group-leaf.c
+++ /dev/null
@@ -1,425 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-Table-Group.c: Implements the grouping objects for elements on a table
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org ()
- *
- * Copyright 1999, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-group-leaf.h"
-#include "e-table-item.h"
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include "e-util/e-util.h"
-#include "e-util/e-canvas.h"
-
-#define PARENT_TYPE e_table_group_get_type ()
-
-static GnomeCanvasGroupClass *etgl_parent_class;
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_HEIGHT,
- ARG_WIDTH,
- ARG_MINIMUM_WIDTH,
- ARG_FROZEN,
- ARG_TABLE_DRAW_GRID,
- ARG_TABLE_DRAW_FOCUS,
- ARG_CURSOR_MODE,
- ARG_LENGTH_THRESHOLD,
- ARG_TABLE_SELECTION_MODEL,
-};
-
-static void etgl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void etgl_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-static void
-etgl_destroy (GtkObject *object)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF(object);
- if (etgl->subset)
- gtk_object_unref (GTK_OBJECT(etgl->subset));
- if (etgl->item)
- gtk_object_destroy (GTK_OBJECT(etgl->item));
- if (etgl->table_selection_model)
- gtk_object_unref (GTK_OBJECT(etgl->table_selection_model));
- if (GTK_OBJECT_CLASS (etgl_parent_class)->destroy)
- GTK_OBJECT_CLASS (etgl_parent_class)->destroy (object);
-}
-
-static void
-e_table_group_leaf_construct (GnomeCanvasGroup *parent,
- ETableGroupLeaf *etgl,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model,
- ETableSortInfo *sort_info)
-{
- etgl->subset = E_TABLE_SUBSET_VARIABLE(e_table_sorted_variable_new (model, full_header, sort_info));
- gtk_object_ref(GTK_OBJECT(etgl->subset));
- gtk_object_sink(GTK_OBJECT(etgl->subset));
- e_table_group_construct (parent, E_TABLE_GROUP (etgl), full_header, header, model);
-}
-
-ETableGroup *
-e_table_group_leaf_new (GnomeCanvasGroup *parent,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model,
- ETableSortInfo *sort_info)
-{
- ETableGroupLeaf *etgl;
-
- g_return_val_if_fail (parent != NULL, NULL);
-
- etgl = gtk_type_new (e_table_group_leaf_get_type ());
-
- e_table_group_leaf_construct (parent, etgl, full_header,
- header, model, sort_info);
- return E_TABLE_GROUP (etgl);
-}
-
-static void
-etgl_cursor_change (GtkObject *object, gint row, ETableGroupLeaf *etgl)
-{
- if (row < E_TABLE_SUBSET(etgl->subset)->n_map)
- e_table_group_cursor_change (E_TABLE_GROUP(etgl), E_TABLE_SUBSET(etgl->subset)->map_table[row]);
-}
-
-static void
-etgl_double_click (GtkObject *object, gint row, ETableGroupLeaf *etgl)
-{
- if (row < E_TABLE_SUBSET(etgl->subset)->n_map)
- e_table_group_double_click (E_TABLE_GROUP(etgl), E_TABLE_SUBSET(etgl->subset)->map_table[row]);
-}
-
-static gint
-etgl_key_press (GtkObject *object, gint row, gint col, GdkEvent *event, ETableGroupLeaf *etgl)
-{
- if (row < E_TABLE_SUBSET(etgl->subset)->n_map)
- return e_table_group_key_press (E_TABLE_GROUP(etgl), E_TABLE_SUBSET(etgl->subset)->map_table[row], col, event);
- else
- return 0;
-}
-
-static gint
-etgl_right_click (GtkObject *object, gint row, gint col, GdkEvent *event, ETableGroupLeaf *etgl)
-{
- if (row < E_TABLE_SUBSET(etgl->subset)->n_map)
- return e_table_group_right_click (E_TABLE_GROUP(etgl), E_TABLE_SUBSET(etgl->subset)->map_table[row], col, event);
- else
- return 0;
-}
-
-static void
-etgl_reflow (GnomeCanvasItem *item, gint flags)
-{
- ETableGroupLeaf *leaf = E_TABLE_GROUP_LEAF(item);
- gtk_object_get(GTK_OBJECT(leaf->item),
- "height", &leaf->height,
- NULL);
- gtk_object_get(GTK_OBJECT(leaf->item),
- "width", &leaf->width,
- NULL);
- e_canvas_item_request_parent_reflow (item);
-}
-
-static void
-etgl_realize (GnomeCanvasItem *item)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF(item);
-
- if (GNOME_CANVAS_ITEM_CLASS (etgl_parent_class)->realize)
- GNOME_CANVAS_ITEM_CLASS (etgl_parent_class)->realize (item);
-
- etgl->item = E_TABLE_ITEM(gnome_canvas_item_new (GNOME_CANVAS_GROUP(etgl),
- e_table_item_get_type (),
- "ETableHeader", E_TABLE_GROUP(etgl)->header,
- "ETableModel", etgl->subset,
- "drawgrid", etgl->draw_grid,
- "drawfocus", etgl->draw_focus,
- "cursor_mode", etgl->cursor_mode,
- "minimum_width", etgl->minimum_width,
- "length_threshold", etgl->length_threshold,
- "table_selection_model", etgl->table_selection_model,
- NULL));
-
- gtk_signal_connect (GTK_OBJECT(etgl->item), "cursor_change",
- GTK_SIGNAL_FUNC(etgl_cursor_change), etgl);
- gtk_signal_connect (GTK_OBJECT(etgl->item), "double_click",
- GTK_SIGNAL_FUNC(etgl_double_click), etgl);
- gtk_signal_connect (GTK_OBJECT(etgl->item), "right_click",
- GTK_SIGNAL_FUNC(etgl_right_click), etgl);
- gtk_signal_connect (GTK_OBJECT(etgl->item), "key_press",
- GTK_SIGNAL_FUNC(etgl_key_press), etgl);
- e_canvas_item_request_reflow(item);
-}
-
-static void
-etgl_add (ETableGroup *etg, gint row)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- e_table_subset_variable_add (etgl->subset, row);
-}
-
-static void
-etgl_add_all (ETableGroup *etg)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- e_table_subset_variable_add_all (etgl->subset);
-}
-
-static gboolean
-etgl_remove (ETableGroup *etg, gint row)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- return e_table_subset_variable_remove (etgl->subset, row);
-}
-
-static void
-etgl_increment (ETableGroup *etg, gint position, gint amount)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- e_table_subset_variable_increment (etgl->subset, position, amount);
-}
-
-static void
-etgl_decrement (ETableGroup *etg, gint position, gint amount)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- e_table_subset_variable_decrement (etgl->subset, position, amount);
-}
-
-static int
-etgl_row_count (ETableGroup *etg)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- return e_table_model_row_count(E_TABLE_MODEL(etgl->subset));
-}
-
-static void
-etgl_set_focus (ETableGroup *etg, EFocus direction, gint view_col)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- if (direction == E_FOCUS_END) {
- e_table_item_set_cursor (etgl->item, view_col, e_table_model_row_count(E_TABLE_MODEL(etgl->subset)) - 1);
- } else {
- e_table_item_set_cursor (etgl->item, view_col, 0);
- }
-}
-
-static void
-etgl_set_cursor_row (ETableGroup *etg, gint row)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(etgl->item),
- "cursor_row", row,
- NULL);
-}
-
-static int
-etgl_get_cursor_row (ETableGroup *etg)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- int row;
- gtk_object_get(GTK_OBJECT(etgl->item),
- "cursor_row", &row,
- NULL);
- return row;
-}
-
-static gint
-etgl_get_focus_column (ETableGroup *etg)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- return e_table_item_get_focused_column (etgl->item);
-}
-
-static EPrintable *
-etgl_get_printable (ETableGroup *etg)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- return e_table_item_get_printable (etgl->item);
-}
-
-static void
-etgl_compute_location (ETableGroup *etg, int *x, int *y, int *row, int *col)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
- e_table_item_compute_location (etgl->item, x, y, row, col);
-}
-
-static void
-etgl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableGroup *etg = E_TABLE_GROUP (object);
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);
-
- switch (arg_id) {
- case ARG_FROZEN:
- if (GTK_VALUE_BOOL (*arg))
- etg->frozen = TRUE;
- else {
- etg->frozen = FALSE;
- }
- break;
- case ARG_MINIMUM_WIDTH:
- case ARG_WIDTH:
- etgl->minimum_width = GTK_VALUE_DOUBLE(*arg);
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "minimum_width", etgl->minimum_width,
- NULL);
- }
- break;
- case ARG_LENGTH_THRESHOLD:
- etgl->length_threshold = GTK_VALUE_INT (*arg);
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "length_threshold", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
- case ARG_TABLE_SELECTION_MODEL:
- if (etgl->table_selection_model)
- gtk_object_unref(GTK_OBJECT(etgl->table_selection_model));
- etgl->table_selection_model = E_TABLE_SELECTION_MODEL(GTK_VALUE_OBJECT (*arg));
- if (etgl->table_selection_model)
- gtk_object_ref(GTK_OBJECT(etgl->table_selection_model));
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "table_selection_model", etgl->table_selection_model,
- NULL);
- }
-
- case ARG_TABLE_DRAW_GRID:
- etgl->draw_grid = GTK_VALUE_BOOL (*arg);
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "drawgrid", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- etgl->draw_focus = GTK_VALUE_BOOL (*arg);
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "drawfocus", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_CURSOR_MODE:
- etgl->cursor_mode = GTK_VALUE_INT (*arg);
- if (etgl->item) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
- "cursor_mode", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
- default:
- break;
- }
-}
-
-static void
-etgl_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableGroup *etg = E_TABLE_GROUP (object);
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);
-
- switch (arg_id) {
- case ARG_FROZEN:
- GTK_VALUE_BOOL (*arg) = etg->frozen;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = etgl->height;
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = etgl->width;
- break;
- case ARG_MINIMUM_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = etgl->minimum_width;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-etgl_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
- ETableGroupClass *e_group_class = E_TABLE_GROUP_CLASS(object_class);
-
- object_class->destroy = etgl_destroy;
- object_class->set_arg = etgl_set_arg;
- object_class->get_arg = etgl_get_arg;
-
- item_class->realize = etgl_realize;
-
- etgl_parent_class = gtk_type_class (PARENT_TYPE);
-
- e_group_class->add = etgl_add;
- e_group_class->add_all = etgl_add_all;
- e_group_class->remove = etgl_remove;
- e_group_class->increment = etgl_increment;
- e_group_class->decrement = etgl_decrement;
- e_group_class->row_count = etgl_row_count;
- e_group_class->set_focus = etgl_set_focus;
- e_group_class->set_cursor_row = etgl_set_cursor_row;
- e_group_class->get_cursor_row = etgl_get_cursor_row;
- e_group_class->get_focus_column = etgl_get_focus_column;
- e_group_class->get_printable = etgl_get_printable;
- e_group_class->compute_location = etgl_compute_location;
-
- gtk_object_add_arg_type ("ETableGroupLeaf::drawgrid", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_GRID);
- gtk_object_add_arg_type ("ETableGroupLeaf::drawfocus", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_FOCUS);
- gtk_object_add_arg_type ("ETableGroupLeaf::cursor_mode", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_CURSOR_MODE);
- gtk_object_add_arg_type ("ETableGroupLeaf::length_threshold", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
- gtk_object_add_arg_type ("ETableGroupLeaf::table_selection_model", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_SELECTION_MODEL);
-
- gtk_object_add_arg_type ("ETableGroupLeaf::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("ETableGroupLeaf::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableGroupLeaf::minimum_width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MINIMUM_WIDTH);
- gtk_object_add_arg_type ("ETableGroupLeaf::frozen", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_FROZEN);
-}
-
-static void
-etgl_init (GtkObject *object)
-{
- ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);
-
- etgl->width = 1;
- etgl->height = 1;
- etgl->minimum_width = 0;
-
- etgl->subset = NULL;
- etgl->item = NULL;
-
- etgl->draw_grid = 1;
- etgl->draw_focus = 1;
- etgl->cursor_mode = E_TABLE_CURSOR_SIMPLE;
- etgl->length_threshold = -1;
-
- etgl->table_selection_model = NULL;
-
- e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM(object), etgl_reflow);
-}
-
-E_MAKE_TYPE (e_table_group_leaf, "ETableGroupLeaf", ETableGroupLeaf, etgl_class_init, etgl_init, PARENT_TYPE);
diff --git a/widgets/table/e-table-group-leaf.h b/widgets/table/e-table-group-leaf.h
deleted file mode 100644
index 1cc041206b..0000000000
--- a/widgets/table/e-table-group-leaf.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_GROUP_LEAF_H_
-#define _E_TABLE_GROUP_LEAF_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-table-group.h"
-#include "e-table-sorted-variable.h"
-#include "e-table-item.h"
-
-#define E_TABLE_GROUP_LEAF_TYPE (e_table_group_leaf_get_type ())
-#define E_TABLE_GROUP_LEAF(o) (GTK_CHECK_CAST ((o), E_TABLE_GROUP_LEAF_TYPE, ETableGroupLeaf))
-#define E_TABLE_GROUP_LEAF_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_GROUP_LEAF_TYPE, ETableGroupLeafClass))
-#define E_IS_TABLE_GROUP_LEAF(o) (GTK_CHECK_TYPE ((o), E_TABLE_GROUP_LEAF_TYPE))
-#define E_IS_TABLE_GROUP_LEAF_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_GROUP_LEAF_TYPE))
-
-typedef struct {
- ETableGroup group;
-
- /*
- * Item.
- */
- ETableItem *item;
-
- gdouble height;
- gdouble width;
- gdouble minimum_width;
-
- ETableSubsetVariable *subset;
-
- int length_threshold;
-
- guint draw_grid : 1;
- guint draw_focus : 1;
- ETableCursorMode cursor_mode;
-
- ETableSelectionModel *table_selection_model;
-} ETableGroupLeaf;
-
-typedef struct {
- ETableGroupClass parent_class;
-} ETableGroupLeafClass;
-
-ETableGroup *e_table_group_leaf_new (GnomeCanvasGroup *parent,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model,
- ETableSortInfo *sort_info);
-GtkType e_table_group_leaf_get_type (void);
-
-
-#endif /* _E_TABLE_GROUP_LEAF_H_ */
-
diff --git a/widgets/table/e-table-group.c b/widgets/table/e-table-group.c
deleted file mode 100644
index fbd9026096..0000000000
--- a/widgets/table/e-table-group.c
+++ /dev/null
@@ -1,420 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-Table-Group.c: Implements the grouping objects for elements on a table
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- * Chris Lahey (clahey@helixcode.com)
- *
- * Copyright 1999, 2000 Helix Code, Inc.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-group.h"
-#include "e-table-group-container.h"
-#include "e-table-group-leaf.h"
-#include "e-table-item.h"
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include "e-util/e-util.h"
-
-#define PARENT_TYPE gnome_canvas_group_get_type ()
-
-#define ETG_CLASS(e) (E_TABLE_GROUP_CLASS(GTK_OBJECT(e)->klass))
-
-static GnomeCanvasGroupClass *etg_parent_class;
-
-enum {
- CURSOR_CHANGE,
- DOUBLE_CLICK,
- RIGHT_CLICK,
- KEY_PRESS,
- LAST_SIGNAL
-};
-
-static gint etg_signals [LAST_SIGNAL] = { 0, };
-
-static gboolean etg_get_focus (ETableGroup *etg);
-static void etg_destroy (GtkObject *object);
-
-static void
-etg_destroy (GtkObject *object)
-{
- ETableGroup *etg = E_TABLE_GROUP(object);
- if (etg->header)
- gtk_object_unref (GTK_OBJECT(etg->header));
- if (etg->full_header)
- gtk_object_unref (GTK_OBJECT(etg->full_header));
- if (etg->model)
- gtk_object_unref (GTK_OBJECT(etg->model));
- if (GTK_OBJECT_CLASS (etg_parent_class)->destroy)
- GTK_OBJECT_CLASS (etg_parent_class)->destroy (object);
-}
-
-ETableGroup *
-e_table_group_new (GnomeCanvasGroup *parent,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model,
- ETableSortInfo *sort_info,
- int n)
-{
- g_return_val_if_fail (model != NULL, NULL);
-
- if (n < e_table_sort_info_grouping_get_count(sort_info)) {
- return e_table_group_container_new (parent, full_header, header, model, sort_info, n);
- } else {
- return e_table_group_leaf_new (parent, full_header, header, model, sort_info);
- }
- return NULL;
-}
-
-void
-e_table_group_construct (GnomeCanvasGroup *parent,
- ETableGroup *etg,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model)
-{
- etg->full_header = full_header;
- gtk_object_ref (GTK_OBJECT(etg->full_header));
- etg->header = header;
- gtk_object_ref (GTK_OBJECT(etg->header));
- etg->model = model;
- gtk_object_ref (GTK_OBJECT(etg->model));
- gnome_canvas_item_constructv (GNOME_CANVAS_ITEM (etg), parent, 0, NULL);
-}
-
-void
-e_table_group_add (ETableGroup *etg,
- gint row)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->add)
- ETG_CLASS (etg)->add (etg, row);
-}
-
-void
-e_table_group_add_all (ETableGroup *etg)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->add_all)
- ETG_CLASS (etg)->add_all (etg);
-}
-
-gboolean
-e_table_group_remove (ETableGroup *etg,
- gint row)
-{
- g_return_val_if_fail (etg != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), FALSE);
-
- if (ETG_CLASS (etg)->remove)
- return ETG_CLASS (etg)->remove (etg, row);
- else
- return FALSE;
-}
-
-gint
-e_table_group_get_count (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), 0);
-
- if (ETG_CLASS (etg)->get_count)
- return ETG_CLASS (etg)->get_count (etg);
- else
- return 0;
-}
-
-gint
-e_table_group_row_count (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), 0);
-
- if (ETG_CLASS (etg)->row_count)
- return ETG_CLASS (etg)->row_count (etg);
- else
- return 0;
-}
-
-void
-e_table_group_increment (ETableGroup *etg,
- gint position,
- gint amount)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->increment)
- ETG_CLASS (etg)->increment (etg, position, amount);
-}
-
-void
-e_table_group_decrement (ETableGroup *etg,
- gint position,
- gint amount)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->decrement)
- ETG_CLASS (etg)->decrement (etg, position, amount);
-}
-
-void
-e_table_group_set_focus (ETableGroup *etg,
- EFocus direction,
- gint row)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->set_focus)
- ETG_CLASS (etg)->set_focus (etg, direction, row);
-}
-
-void
-e_table_group_set_cursor_row (ETableGroup *etg,
- gint row)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->set_cursor_row)
- ETG_CLASS (etg)->set_cursor_row (etg, row);
-}
-
-int
-e_table_group_get_cursor_row (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, -1);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), -1);
-
- if (ETG_CLASS (etg)->get_cursor_row)
- return ETG_CLASS (etg)->get_cursor_row (etg);
- else
- return -1;
-}
-
-gboolean
-e_table_group_get_focus (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), FALSE);
-
- if (ETG_CLASS (etg)->get_focus)
- return ETG_CLASS (etg)->get_focus (etg);
- else
- return FALSE;
-}
-
-gboolean
-e_table_group_get_focus_column (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), FALSE);
-
- if (ETG_CLASS (etg)->get_focus_column)
- return ETG_CLASS (etg)->get_focus_column (etg);
- else
- return FALSE;
-}
-
-ETableCol *
-e_table_group_get_ecol (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), NULL);
-
- if (ETG_CLASS (etg)->get_ecol)
- return ETG_CLASS (etg)->get_ecol (etg);
- else
- return NULL;
-}
-
-EPrintable *
-e_table_group_get_printable (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), NULL);
-
- if (ETG_CLASS (etg)->get_printable)
- return ETG_CLASS (etg)->get_printable (etg);
- else
- return NULL;
-}
-
-void
-e_table_group_compute_location (ETableGroup *etg, int *x, int *y, int *row, int *col)
-{
- g_return_if_fail (etg != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
- if (ETG_CLASS (etg)->compute_location)
- ETG_CLASS (etg)->compute_location (etg, x, y, row, col);
-}
-
-void
-e_table_group_cursor_change (ETableGroup *e_table_group, gint row)
-{
- g_return_if_fail (e_table_group != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (e_table_group));
-
- gtk_signal_emit (GTK_OBJECT (e_table_group),
- etg_signals [CURSOR_CHANGE],
- row);
-}
-
-void
-e_table_group_double_click (ETableGroup *e_table_group, gint row)
-{
- g_return_if_fail (e_table_group != NULL);
- g_return_if_fail (E_IS_TABLE_GROUP (e_table_group));
-
- gtk_signal_emit (GTK_OBJECT (e_table_group),
- etg_signals [DOUBLE_CLICK],
- row);
-}
-
-gint
-e_table_group_right_click (ETableGroup *e_table_group, gint row, gint col, GdkEvent *event)
-{
- gint return_val = 0;
-
- g_return_val_if_fail (e_table_group != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_GROUP (e_table_group), 0);
-
- gtk_signal_emit (GTK_OBJECT (e_table_group),
- etg_signals [RIGHT_CLICK],
- row, col, event, &return_val);
-
- return return_val;
-}
-
-gint
-e_table_group_key_press (ETableGroup *e_table_group, gint row, gint col, GdkEvent *event)
-{
- gint return_val = 0;
-
- g_return_val_if_fail (e_table_group != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_GROUP (e_table_group), 0);
-
- gtk_signal_emit (GTK_OBJECT (e_table_group),
- etg_signals [KEY_PRESS],
- row, col, event, &return_val);
-
- return return_val;
-}
-
-ETableHeader *
-e_table_group_get_header (ETableGroup *etg)
-{
- g_return_val_if_fail (etg != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_GROUP (etg), NULL);
-
- return etg->header;
-}
-
-static int
-etg_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- ETableGroup *etg = E_TABLE_GROUP (item);
- gboolean return_val = TRUE;
-
- switch (event->type) {
-
- case GDK_FOCUS_CHANGE:
- etg->has_focus = event->focus_change.in;
- return_val = FALSE;
-
- default:
- return_val = FALSE;
- }
- if (return_val == FALSE){
- if (GNOME_CANVAS_ITEM_CLASS(etg_parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS(etg_parent_class)->event (item, event);
- }
- return return_val;
-
-}
-
-static gboolean
-etg_get_focus (ETableGroup *etg)
-{
- return etg->has_focus;
-}
-
-static void
-etg_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
- ETableGroupClass *klass = (ETableGroupClass *) object_class;
-
- object_class->destroy = etg_destroy;
-
- item_class->event = etg_event;
-
- klass->cursor_change = NULL;
- klass->double_click = NULL;
- klass->right_click = NULL;
- klass->key_press = NULL;
-
- klass->add = NULL;
- klass->add_all = NULL;
- klass->remove = NULL;
- klass->get_count = NULL;
- klass->row_count = NULL;
- klass->increment = NULL;
- klass->decrement = NULL;
- klass->set_focus = NULL;
- klass->set_cursor_row = NULL;
- klass->get_cursor_row = NULL;
- klass->get_focus = etg_get_focus;
- klass->get_ecol = NULL;
- klass->get_printable = NULL;
- klass->compute_location = NULL;
-
- etg_parent_class = gtk_type_class (PARENT_TYPE);
-
- etg_signals [CURSOR_CHANGE] =
- gtk_signal_new ("cursor_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableGroupClass, cursor_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- etg_signals [DOUBLE_CLICK] =
- gtk_signal_new ("double_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableGroupClass, double_click),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- etg_signals [RIGHT_CLICK] =
- gtk_signal_new ("right_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableGroupClass, right_click),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- etg_signals [KEY_PRESS] =
- gtk_signal_new ("key_press",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableGroupClass, key_press),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (object_class, etg_signals, LAST_SIGNAL);
-}
-
-E_MAKE_TYPE (e_table_group, "ETableGroup", ETableGroup, etg_class_init, NULL, PARENT_TYPE);
diff --git a/widgets/table/e-table-group.glade b/widgets/table/e-table-group.glade
deleted file mode 100644
index 39274d3c61..0000000000
--- a/widgets/table/e-table-group.glade
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0"?>
-<GTK-Interface>
-
-<project>
- <directory></directory>
- <source_directory>src</source_directory>
- <pixmaps_directory>pixmaps</pixmaps_directory>
- <language>C</language>
- <gnome_support>True</gnome_support>
- <gettext_support>True</gettext_support>
- <use_widget_names>False</use_widget_names>
- <output_main_file>False</output_main_file>
- <output_support_files>False</output_support_files>
- <output_build_files>False</output_build_files>
- <backup_source_files>False</backup_source_files>
- <main_source_file>interface.c</main_source_file>
- <main_header_file>interface.h</main_header_file>
- <handler_source_file>callbacks.c</handler_source_file>
- <handler_header_file>callbacks.h</handler_header_file>
- <support_source_file>support.c</support_source_file>
- <support_header_file>support.h</support_header_file>
- <output_translatable_strings>True</output_translatable_strings>
- <translatable_strings_file>e-table-group.glade.h</translatable_strings_file>
-</project>
-
-<widget>
- <class>GtkWindow</class>
- <name>window1</name>
- <title>window1</title>
- <type>GTK_WINDOW_TOPLEVEL</type>
- <position>GTK_WIN_POS_NONE</position>
- <modal>False</modal>
- <allow_shrink>False</allow_shrink>
- <allow_grow>True</allow_grow>
- <auto_shrink>False</auto_shrink>
-
- <widget>
- <class>GtkTable</class>
- <name>table1</name>
- <rows>3</rows>
- <columns>3</columns>
- <homogeneous>False</homogeneous>
- <row_spacing>0</row_spacing>
- <column_spacing>0</column_spacing>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame1</name>
- <border_width>4</border_width>
- <label>Available fields</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>True</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
-
- <widget>
- <class>GtkCList</class>
- <name>clist1</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>False</show_titles>
- <shadow_type>GTK_SHADOW_NONE</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label1</name>
- <label>label1</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkFrame</class>
- <name>frame2</name>
- <border_width>4</border_width>
- <label>Show in this order</label>
- <label_xalign>0</label_xalign>
- <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow2</name>
- <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
-
- <widget>
- <class>GtkCList</class>
- <name>clist2</name>
- <can_focus>True</can_focus>
- <columns>1</columns>
- <column_widths>80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>False</show_titles>
- <shadow_type>GTK_SHADOW_NONE</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>label2</name>
- <label>label2</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
- </widget>
- </widget>
- </widget>
-
- <widget>
- <class>GtkVBox</class>
- <name>vbox1</name>
- <border_width>4</border_width>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>4</xpad>
- <ypad>4</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>False</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkButton</class>
- <name>button1</name>
- <border_width>4</border_width>
- <can_focus>True</can_focus>
- <label>Add &gt;&gt;</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button2</name>
- <border_width>4</border_width>
- <can_focus>True</can_focus>
- <label>&lt;&lt; Remove</label>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
- </widget>
-</widget>
-
-</GTK-Interface>
diff --git a/widgets/table/e-table-group.glade.h b/widgets/table/e-table-group.glade.h
deleted file mode 100644
index 3ab6304734..0000000000
--- a/widgets/table/e-table-group.glade.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Translatable strings file generated by Glade.
- * Add this file to your project's POTFILES.in.
- * DO NOT compile it as part of your application.
- */
-
-gchar *s = N_("window1");
-gchar *s = N_("Available fields");
-gchar *s = N_("label1");
-gchar *s = N_("Show in this order");
-gchar *s = N_("label2");
-gchar *s = N_("Add >>");
-gchar *s = N_("<< Remove");
diff --git a/widgets/table/e-table-group.h b/widgets/table/e-table-group.h
deleted file mode 100644
index a3afe7f5e1..0000000000
--- a/widgets/table/e-table-group.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_GROUP_H_
-#define _E_TABLE_GROUP_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-table-model.h"
-#include "e-table-header.h"
-#include "e-table-sort-info.h"
-#include "e-table-defines.h"
-#include "e-util/e-util.h"
-#include "e-util/e-printable.h"
-
-#define E_TABLE_GROUP_TYPE (e_table_group_get_type ())
-#define E_TABLE_GROUP(o) (GTK_CHECK_CAST ((o), E_TABLE_GROUP_TYPE, ETableGroup))
-#define E_TABLE_GROUP_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_GROUP_TYPE, ETableGroupClass))
-#define E_IS_TABLE_GROUP(o) (GTK_CHECK_TYPE ((o), E_TABLE_GROUP_TYPE))
-#define E_IS_TABLE_GROUP_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_GROUP_TYPE))
-
-typedef struct {
- GnomeCanvasGroup group;
-
- /*
- * The full header.
- */
- ETableHeader *full_header;
- ETableHeader *header;
-
- /*
- * The model we pull data from.
- */
- ETableModel *model;
-
- /*
- * Whether we should add indentation and open/close markers,
- * or if we just act as containers of subtables.
- */
- guint transparent : 1;
-
- guint has_focus : 1;
-
- guint frozen : 1;
-} ETableGroup;
-
-typedef struct {
- GnomeCanvasGroupClass parent_class;
-
- /* Signals */
- void (*cursor_change) (ETableGroup *etg, int row);
- void (*double_click) (ETableGroup *etg, int row);
- gint (*right_click) (ETableGroup *etg, int row, int col, GdkEvent *event);
- gint (*key_press) (ETableGroup *etg, int row, int col, GdkEvent *event);
-
- /* Virtual functions. */
- void (*add) (ETableGroup *etg, gint row);
- void (*add_all) (ETableGroup *etg);
- gboolean (*remove) (ETableGroup *etg, gint row);
- gint (*get_count) (ETableGroup *etg);
- gint (*row_count) (ETableGroup *etg);
- void (*increment) (ETableGroup *etg, gint position, gint amount);
- void (*decrement) (ETableGroup *etg, gint position, gint amount);
- void (*set_focus) (ETableGroup *etg, EFocus direction, gint view_col);
- void (*set_cursor_row) (ETableGroup *etg, gint row);
- int (*get_cursor_row) (ETableGroup *etg);
- gboolean (*get_focus) (ETableGroup *etg);
- gint (*get_focus_column) (ETableGroup *etg);
- ETableCol *(*get_ecol) (ETableGroup *etg);
- EPrintable *(*get_printable) (ETableGroup *etg);
- void (*compute_location) (ETableGroup *etg, int *x, int *y, int *row, int *col);
-
-} ETableGroupClass;
-
-/* Virtual functions */
-void e_table_group_add (ETableGroup *etg,
- gint row);
-void e_table_group_add_all (ETableGroup *etg);
-gboolean e_table_group_remove (ETableGroup *etg,
- gint row);
-gint e_table_group_get_count (ETableGroup *etg);
-void e_table_group_increment (ETableGroup *etg,
- gint position,
- gint amount);
-void e_table_group_decrement (ETableGroup *etg,
- gint position,
- gint amount);
-gint e_table_group_row_count (ETableGroup *etg);
-void e_table_group_set_focus (ETableGroup *etg,
- EFocus direction,
- gint view_col);
-void e_table_group_set_cursor_row (ETableGroup *etg,
- gint row);
-int e_table_group_get_cursor_row (ETableGroup *etg);
-gboolean e_table_group_get_focus (ETableGroup *etg);
-gint e_table_group_get_focus_column (ETableGroup *etg);
-ETableHeader *e_table_group_get_header (ETableGroup *etg);
-ETableCol *e_table_group_get_ecol (ETableGroup *etg);
-EPrintable *e_table_group_get_printable (ETableGroup *etg);
-void e_table_group_compute_location (ETableGroup *etg,
- int *x,
- int *y,
- int *row,
- int *col);
-
-ETableGroup *e_table_group_new (GnomeCanvasGroup *parent,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model,
- ETableSortInfo *sort_info,
- int n);
-void e_table_group_construct (GnomeCanvasGroup *parent,
- ETableGroup *etg,
- ETableHeader *full_header,
- ETableHeader *header,
- ETableModel *model);
-
-/* For emitting the signals */
-void e_table_group_cursor_change (ETableGroup *etg,
- gint row);
-void e_table_group_double_click (ETableGroup *etg,
- gint row);
-gint e_table_group_right_click (ETableGroup *etg,
- gint row,
- gint col,
- GdkEvent *event);
-gint e_table_group_key_press (ETableGroup *etg,
- gint row,
- gint col,
- GdkEvent *event);
-
-GtkType e_table_group_get_type (void);
-
-typedef void (*ETableGroupLeafFn) (void *e_table_item, void *closure);
-void e_table_group_apply_to_leafs (ETableGroup *etg,
- ETableGroupLeafFn fn, void *closure);
-
-#endif /* _E_TABLE_GROUP_H_ */
diff --git a/widgets/table/e-table-header-item.c b/widgets/table/e-table-header-item.c
deleted file mode 100644
index 506ad546ca..0000000000
--- a/widgets/table/e-table-header-item.c
+++ /dev/null
@@ -1,1449 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-column-view.c: A canvas item based view of the ETableColumn.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkdnd.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <libgnomeui/gnome-canvas-util.h>
-#include <libgnomeui/gnome-canvas-polygon.h>
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include "e-util/e-cursors.h"
-#include "e-util/e-xml-utils.h"
-#include "e-util/e-popup-menu.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-col-dnd.h"
-#include "e-table-defines.h"
-#include "e-table-field-chooser-dialog.h"
-
-#include "add-col.xpm"
-#include "remove-col.xpm"
-#include "arrow-up.xpm"
-#include "arrow-down.xpm"
-
-enum {
- BUTTON_PRESSED,
- LAST_SIGNAL
-};
-
-static guint ethi_signals [LAST_SIGNAL] = { 0, };
-
-#define ARROW_DOWN_HEIGHT 16
-#define ARROW_PTR 7
-
-/* Defines the tolerance for proximity of the column division to the cursor position */
-#define TOLERANCE 4
-
-#define ETHI_RESIZING(x) ((x)->resize_col != -1)
-
-#define PARENT_OBJECT_TYPE gnome_canvas_item_get_type ()
-
-#define ELEMENTS(x) (sizeof (x) / sizeof (x[0]))
-
-static GnomeCanvasItemClass *ethi_parent_class;
-
-static void ethi_drop_table_header (ETableHeaderItem *ethi);
-
-/*
- * They display the arrows for the drop location.
- */
-
-static GtkWidget *arrow_up, *arrow_down;
-
-/*
- * DnD icons
- */
-static GdkColormap *dnd_colormap;
-static GdkPixmap *remove_col_pixmap, *remove_col_mask;
-static GdkPixmap *add_col_pixmap, *add_col_mask;
-
-enum {
- ARG_0,
- ARG_TABLE_HEADER,
- ARG_FULL_HEADER,
- ARG_DND_CODE,
- ARG_TABLE_FONTSET,
- ARG_SORT_INFO
-};
-
-static void
-ethi_destroy (GtkObject *object){
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (object);
-
- ethi_drop_table_header (ethi);
-
- if (ethi->sort_info){
- if (ethi->sort_info_changed_id)
- gtk_signal_disconnect (GTK_OBJECT(ethi->sort_info), ethi->sort_info_changed_id);
- if (ethi->group_info_changed_id)
- gtk_signal_disconnect (GTK_OBJECT(ethi->sort_info), ethi->group_info_changed_id);
- gtk_object_unref (GTK_OBJECT(ethi->sort_info));
- }
-
- if (GTK_OBJECT_CLASS (ethi_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (ethi_parent_class)->destroy) (object);
-}
-
-static void
-ethi_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-
- double i2c [6];
- ArtPoint c1, c2, i1, i2;
-
- if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->update)
- (*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->update)(item, affine, clip_path, flags);
-
-
- if (ethi->sort_info)
- ethi->group_indent_width = e_table_sort_info_grouping_get_count(ethi->sort_info) * GROUP_INDENT;
- else
- ethi->group_indent_width = 0;
-
- ethi->width = e_table_header_total_width (ethi->eth) + ethi->group_indent_width;
-
- i1.x = i1.y = 0;
- i2.x = ethi->width;
- i2.y = ethi->height;
-
- gnome_canvas_item_i2c_affine (item, i2c);
- art_affine_point (&c1, &i1, i2c);
- art_affine_point (&c2, &i2, i2c);
-
- if (item->x1 != c1.x ||
- item->y1 != c1.y ||
- item->x2 != c2.x ||
- item->y2 != c2.y)
- {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- item->x1 = c1.x;
- item->y1 = c1.y;
- item->x2 = c2.x;
- item->y2 = c2.y;
-
- gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item);
- }
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
-}
-
-static void
-ethi_font_load (ETableHeaderItem *ethi, char *font)
-{
- if (ethi->font)
- gdk_font_unref (ethi->font);
-
- ethi->font = gdk_fontset_load (font);
- if (ethi->font == NULL)
- ethi->font = gdk_font_load ("-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1");
-
- ethi->height = ethi->font->ascent + ethi->font->descent + HEADER_PADDING;
- if (ethi->height < MIN_ARROW_SIZE + 4 + HEADER_PADDING)
- ethi->height = MIN_ARROW_SIZE + 4 + HEADER_PADDING;
-}
-
-static void
-ethi_drop_table_header (ETableHeaderItem *ethi)
-{
- GtkObject *header;
-
- if (!ethi->eth)
- return;
-
- header = GTK_OBJECT (ethi->eth);
- gtk_signal_disconnect (header, ethi->structure_change_id);
- gtk_signal_disconnect (header, ethi->dimension_change_id);
-
- gtk_object_unref (header);
- ethi->eth = NULL;
- ethi->width = 0;
-}
-
-static void
-structure_changed (ETableHeader *header, ETableHeaderItem *ethi)
-{
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-dimension_changed (ETableHeader *header, int col, ETableHeaderItem *ethi)
-{
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_add_table_header (ETableHeaderItem *ethi, ETableHeader *header)
-{
- ethi->eth = header;
- gtk_object_ref (GTK_OBJECT (ethi->eth));
-
- ethi->structure_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "structure_change",
- GTK_SIGNAL_FUNC(structure_changed), ethi);
- ethi->dimension_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "dimension_change",
- GTK_SIGNAL_FUNC(dimension_changed), ethi);
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_sort_info_changed (ETableSortInfo *sort_info, ETableHeaderItem *ethi)
-{
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableHeaderItem *ethi;
-
- item = GNOME_CANVAS_ITEM (o);
- ethi = E_TABLE_HEADER_ITEM (o);
-
- switch (arg_id){
- case ARG_TABLE_HEADER:
- ethi_drop_table_header (ethi);
- ethi_add_table_header (ethi, E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg)));
- break;
-
- case ARG_FULL_HEADER:
- if (ethi->full_header)
- gtk_object_unref(GTK_OBJECT(ethi->full_header));
- ethi->full_header = E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg));
- if (ethi->full_header)
- gtk_object_ref(GTK_OBJECT(ethi->full_header));
- break;
-
- case ARG_DND_CODE:
- g_free(ethi->dnd_code);
- ethi->dnd_code = g_strdup (GTK_VALUE_STRING (*arg));
- break;
-
- case ARG_TABLE_FONTSET:
- ethi_font_load (ethi, GTK_VALUE_STRING (*arg));
- break;
-
- case ARG_SORT_INFO:
- if (ethi->sort_info){
- if (ethi->sort_info_changed_id)
- gtk_signal_disconnect (
- GTK_OBJECT(ethi->sort_info),
- ethi->sort_info_changed_id);
-
- if (ethi->group_info_changed_id)
- gtk_signal_disconnect (
- GTK_OBJECT(ethi->sort_info),
- ethi->group_info_changed_id);
- gtk_object_unref (GTK_OBJECT(ethi->sort_info));
- }
- ethi->sort_info = GTK_VALUE_POINTER (*arg);
- gtk_object_ref (GTK_OBJECT(ethi->sort_info));
- ethi->sort_info_changed_id =
- gtk_signal_connect (
- GTK_OBJECT(ethi->sort_info), "sort_info_changed",
- GTK_SIGNAL_FUNC(ethi_sort_info_changed), ethi);
- ethi->group_info_changed_id =
- gtk_signal_connect (
- GTK_OBJECT(ethi->sort_info), "group_info_changed",
- GTK_SIGNAL_FUNC(ethi_sort_info_changed), ethi);
- break;
-
- }
- gnome_canvas_item_request_update(item);
-}
-
-static void
-ethi_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableHeaderItem *ethi;
-
- ethi = E_TABLE_HEADER_ITEM (o);
-
- switch (arg_id){
- case ARG_FULL_HEADER:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT (ethi->full_header);
- break;
- case ARG_DND_CODE:
- GTK_VALUE_STRING (*arg) = g_strdup (ethi->dnd_code);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static int
-ethi_find_col_by_x (ETableHeaderItem *ethi, int x)
-{
- const int cols = e_table_header_count (ethi->eth);
- int x1 = 0;
- int col;
-
- if (x < x1)
- return -1;
-
- x1 += ethi->group_indent_width;
-
- for (col = 0; col < cols; col++){
- ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-
- if ((x >= x1) && (x <= x1 + ecol->width))
- return col;
-
- x1 += ecol->width;
- }
- return -1;
-}
-
-static int
-ethi_find_col_by_x_nearest (ETableHeaderItem *ethi, int x)
-{
- const int cols = e_table_header_count (ethi->eth);
- int x1 = 0;
- int col;
-
- if (x < x1)
- return -1;
-
- x1 += ethi->group_indent_width;
-
- for (col = 0; col < cols; col++){
- ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-
- x1 += (ecol->width / 2);
-
- if (x <= x1)
- return col;
-
- x1 += (ecol->width + 1) / 2;
- }
- return col;
-}
-
-static void
-ethi_remove_drop_marker (ETableHeaderItem *ethi)
-{
- if (ethi->drag_mark == -1)
- return;
-
- gtk_widget_hide (arrow_up);
- gtk_widget_hide (arrow_down);
-
- ethi->drag_mark = -1;
-}
-
-static GtkWidget *
-make_shapped_window_from_xpm (const char **xpm)
-{
- GdkPixbuf *pixbuf;
- GdkPixmap *pixmap;
- GdkBitmap *bitmap;
- GtkWidget *win, *pix;
-
- pixbuf = gdk_pixbuf_new_from_xpm_data (xpm);
- gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, &bitmap, 128);
- gdk_pixbuf_unref (pixbuf);
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
- win = gtk_window_new (GTK_WINDOW_POPUP);
- pix = gtk_pixmap_new (pixmap, bitmap);
- gtk_widget_realize (win);
- gtk_container_add (GTK_CONTAINER (win), pix);
- gtk_widget_shape_combine_mask (win, bitmap, 0, 0);
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
-
- gdk_pixmap_unref (pixmap);
- gdk_bitmap_unref (bitmap);
-
- return win;
-}
-
-static void
-ethi_add_drop_marker (ETableHeaderItem *ethi, int col)
-{
- int rx, ry;
- int x;
-
- if (ethi->drag_mark == col)
- return;
-
- ethi->drag_mark = col;
-
- x = e_table_header_col_diff (ethi->eth, 0, col);
- if (col > 0)
- x += ethi->group_indent_width;
-
- if (!arrow_up){
- arrow_up = make_shapped_window_from_xpm (arrow_up_xpm);
- arrow_down = make_shapped_window_from_xpm (arrow_down_xpm);
- }
-
- gdk_window_get_origin (
- GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas)->window,
- &rx, &ry);
-
- gtk_widget_set_uposition (arrow_down, rx + x - ARROW_PTR, ry - ARROW_DOWN_HEIGHT);
- gtk_widget_show_all (arrow_down);
-
- gtk_widget_set_uposition (arrow_up, rx + x - ARROW_PTR, ry + ethi->height);
- gtk_widget_show_all (arrow_up);
-}
-
-#define gray50_width 2
-#define gray50_height 2
-static char gray50_bits [] = {
- 0x02, 0x01, };
-
-static void
-ethi_add_destroy_marker (ETableHeaderItem *ethi)
-{
- double x1;
-
- if (ethi->remove_item)
- gtk_object_destroy (GTK_OBJECT (ethi->remove_item));
-
- if (!ethi->stipple)
- ethi->stipple = gdk_bitmap_create_from_data (
- NULL, gray50_bits, gray50_width, gray50_height);
-
- x1 = (double) e_table_header_col_diff (ethi->eth, 0, ethi->drag_col);
- if (ethi->drag_col > 0)
- x1 += ethi->group_indent_width;
-
- ethi->remove_item = gnome_canvas_item_new (
- GNOME_CANVAS_GROUP (GNOME_CANVAS_ITEM (ethi)->canvas->root),
- gnome_canvas_rect_get_type (),
- "x1", x1 + 1,
- "y1", (double) 1,
- "x2", (double) x1 + e_table_header_col_diff (
- ethi->eth, ethi->drag_col, ethi->drag_col+1) - 2,
-
- "y2", (double) ethi->height - 2,
- "fill_color", "red",
- "fill_stipple", ethi->stipple,
- NULL);
-}
-
-static void
-ethi_remove_destroy_marker (ETableHeaderItem *ethi)
-{
- if (!ethi->remove_item)
- return;
-
- gtk_object_destroy (GTK_OBJECT (ethi->remove_item));
- ethi->remove_item = NULL;
-}
-
-#if 0
-static gboolean
-moved (ETableHeaderItem *ethi, guint col, guint model_col)
-{
- if (col == -1)
- return TRUE;
- ecol = e_table_header_get_column (ethi->eth, col);
- if (ecol->col_idx == model_col)
- return FALSE;
- if (col > 0) {
- ecol = e_table_header_get_column (ethi->eth, col - 1);
- if (ecol->col_idx == model_col)
- return FALSE;
- }
- return TRUE;
-}
-#endif
-
-static gboolean
-ethi_drag_motion (GtkObject *canvas, GdkDragContext *context,
- gint x, gint y, guint time,
- ETableHeaderItem *ethi)
-{
- gdk_drag_status (context, 0, time);
- if ((x >= 0) && (x <= (ethi->width)) &&
- (y >= 0) && (y <= (ethi->height))){
- int col;
-
- col = ethi_find_col_by_x_nearest (ethi, x);
-
- if (col == ethi->drag_col || col == ethi->drag_col + 1) {
- if (ethi->drag_col != -1)
- ethi_remove_destroy_marker (ethi);
-
- ethi_remove_drop_marker (ethi);
- gdk_drag_status (context, context->suggested_action, time);
- }
- else if (col != -1){
- if (ethi->drag_col != -1)
- ethi_remove_destroy_marker (ethi);
-
- ethi_add_drop_marker (ethi, col);
- gdk_drag_status (context, context->suggested_action, time);
- } else {
- ethi_remove_drop_marker (ethi);
- if (ethi->drag_col != -1)
- ethi_add_destroy_marker (ethi);
- }
- } else {
- ethi_remove_drop_marker (ethi);
- if (ethi->drag_col != -1)
- ethi_add_destroy_marker (ethi);
- }
-
- return TRUE;
-}
-
-static void
-ethi_drag_end (GtkWidget *canvas, GdkDragContext *context, ETableHeaderItem *ethi)
-{
- if (context->action == 0) {
- e_table_header_remove (ethi->eth, ethi->drag_col);
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
- }
- ethi_remove_drop_marker (ethi);
- ethi_remove_destroy_marker (ethi);
- ethi->drag_col = -1;
-}
-
-static void
-ethi_drag_data_received (GtkWidget *canvas,
- GdkDragContext *drag_context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- ETableHeaderItem *ethi)
-{
- int found = FALSE;
- int count = e_table_header_count(ethi->eth);
- int column = atoi(data->data);
- int drop_col = ethi->drop_col;
- int i;
- ethi->drop_col = -1;
- if (column < 0)
- return;
- for (i = 0; i < count; i++) {
- ETableCol *ecol = e_table_header_get_column (ethi->eth, i);
- if (ecol->col_idx == column) {
- e_table_header_move(ethi->eth, i, drop_col);
- found = TRUE;
- break;
- }
- }
- if (!found) {
- count = e_table_header_count(ethi->full_header);
- for (i = 0; i < count; i++) {
- ETableCol *ecol = e_table_header_get_column (ethi->full_header, i);
- if (ecol->col_idx == column) {
- e_table_header_add_column (ethi->eth, ecol, drop_col);
- break;
- }
- }
- }
- ethi_remove_drop_marker (ethi);
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_drag_data_get (GtkWidget *canvas,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETableHeaderItem *ethi)
-{
- if (ethi->drag_col != -1) {
- ETableCol *ecol = e_table_header_get_column (ethi->eth, ethi->drag_col);
-
- gchar *string = g_strdup_printf("%d", ecol->col_idx);
- gtk_selection_data_set(selection_data,
- GDK_SELECTION_TYPE_STRING,
- sizeof(string[0]),
- string,
- strlen(string));
- g_free(string);
- }
-}
-
-static gboolean
-ethi_drag_drop (GtkWidget *canvas,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- ETableHeaderItem *ethi)
-{
- gboolean successful = FALSE;
-
- if ((x >= 0) && (x <= (ethi->width)) &&
- (y >= 0) && (y <= (ethi->height))){
- int col;
-
- col = ethi_find_col_by_x_nearest (ethi, x);
-
- ethi_add_drop_marker (ethi, col);
-
- ethi->drop_col = col;
-
- if (col != -1) {
- char *target = g_strdup_printf ("%s-%s", TARGET_ETABLE_COL_TYPE, ethi->dnd_code);
- gtk_drag_get_data (canvas, context, gdk_atom_intern(target, FALSE), time);
- g_free (target);
- }
- }
- gtk_drag_finish (context, successful, successful, time);
- return successful;
-}
-
-static void
-ethi_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time, ETableHeaderItem *ethi)
-{
- ethi_remove_drop_marker (ethi);
- if (ethi->drag_col != -1)
- ethi_add_destroy_marker (ethi);
-}
-
-static void
-ethi_realize (GnomeCanvasItem *item)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
- GdkWindow *window;
- GdkColor c;
- GtkTargetEntry ethi_drop_types [] = {
- { TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
- };
-
-
- if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)-> realize)
- (*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->realize)(item);
-
- window = GTK_WIDGET (item->canvas)->window;
-
- ethi->gc = gdk_gc_new (window);
- gnome_canvas_get_color (item->canvas, "black", &c);
- gdk_gc_set_foreground (ethi->gc, &c);
-
- if (!ethi->font)
- ethi_font_load (ethi, "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1");
-
- /*
- * Now, configure DnD
- */
- ethi_drop_types[0].target = g_strdup_printf("%s-%s", ethi_drop_types[0].target, ethi->dnd_code);
- gtk_drag_dest_set (GTK_WIDGET (item->canvas), 0,
- ethi_drop_types, ELEMENTS (ethi_drop_types),
- GDK_ACTION_MOVE);
- g_free(ethi_drop_types[0].target);
-
- /* Drop signals */
- ethi->drag_motion_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_motion",
- GTK_SIGNAL_FUNC (ethi_drag_motion), ethi);
- ethi->drag_leave_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_leave",
- GTK_SIGNAL_FUNC (ethi_drag_leave), ethi);
- ethi->drag_drop_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_drop",
- GTK_SIGNAL_FUNC (ethi_drag_drop), ethi);
- ethi->drag_data_received_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_data_received",
- GTK_SIGNAL_FUNC (ethi_drag_data_received), ethi);
-
- /* Drag signals */
- ethi->drag_end_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_end",
- GTK_SIGNAL_FUNC (ethi_drag_end), ethi);
- ethi->drag_data_get_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_data_get",
- GTK_SIGNAL_FUNC (ethi_drag_data_get), ethi);
-
-}
-
-static void
-ethi_unrealize (GnomeCanvasItem *item)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-
- gdk_gc_unref (ethi->gc);
- ethi->gc = NULL;
-
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_motion_id);
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_leave_id);
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_drop_id);
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_data_received_id);
-
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_end_id);
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_data_get_id);
-
- if (ethi->stipple){
- gdk_bitmap_unref (ethi->stipple);
- ethi->stipple = NULL;
- }
-
- if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->unrealize)(item);
-}
-
-static void
-draw_button (ETableHeaderItem *ethi, ETableCol *col,
- GdkDrawable *drawable, GdkGC *gc, GtkStyle *style,
- int x, int y, int width, int height, ETableColArrow arrow)
-{
- GdkRectangle clip;
- int xtra;
-
- gdk_draw_rectangle (
- drawable, gc, TRUE,
- x + 1, y + 1, width - 2, height -2);
-
- gtk_draw_shadow (
- style, drawable,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT,
- x , y, width, height);
-
- clip.x = x + HEADER_PADDING / 2;
- clip.y = y + HEADER_PADDING / 2;
- clip.width = width - HEADER_PADDING;
- clip.height = ethi->height;
-
- gdk_gc_set_clip_rectangle (ethi->gc, &clip);
-
- if (col->is_pixbuf){
- xtra = (clip.width - gdk_pixbuf_get_width (col->pixbuf))/2;
-
- xtra += HEADER_PADDING / 2;
-
- gdk_pixbuf_render_to_drawable_alpha (col->pixbuf,
- drawable,
- 0, 0,
- x + xtra, y + (clip.height - gdk_pixbuf_get_height (col->pixbuf)) / 2,
- gdk_pixbuf_get_width (col->pixbuf), gdk_pixbuf_get_height(col->pixbuf),
- GDK_PIXBUF_ALPHA_FULL, 128,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- } else {
- /* Center the thing */
- xtra = (clip.width - gdk_string_measure (ethi->font, col->text))/2;
-
- /* Skip over border */
- if (xtra < 0)
- xtra = 0;
-
- xtra += HEADER_PADDING / 2;
-
- gdk_draw_text (
- drawable, ethi->font,
- ethi->gc, x + xtra, y + ethi->height - ethi->font->descent - HEADER_PADDING / 2,
- col->text, strlen (col->text));
- }
-
- if (col->pixbuf){
- if ((gdk_pixbuf_get_width (col->pixbuf) + MIN_ARROW_SIZE + 4) > width)
- return;
- }
-
- switch (arrow){
- case E_TABLE_COL_ARROW_NONE:
- break;
-
- case E_TABLE_COL_ARROW_UP:
- case E_TABLE_COL_ARROW_DOWN:
- gtk_paint_arrow (
- gtk_widget_get_style (GTK_WIDGET(GNOME_CANVAS_ITEM(ethi)->canvas)),
- drawable,
- GTK_STATE_NORMAL,
- GTK_SHADOW_IN,
- &clip,
- GTK_WIDGET(GNOME_CANVAS_ITEM(ethi)->canvas),
- "header",
- (arrow == E_TABLE_COL_ARROW_UP) ? GTK_ARROW_UP : GTK_ARROW_DOWN,
- TRUE,
- x + HEADER_PADDING / 2 + clip.width - MIN_ARROW_SIZE - 2,
- y + (ethi->height - MIN_ARROW_SIZE) / 2,
- MIN_ARROW_SIZE,
- MIN_ARROW_SIZE);
- break;
- }
-}
-
-static void
-ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
- GnomeCanvas *canvas = item->canvas;
- GdkGC *gc;
- const int cols = e_table_header_count (ethi->eth);
- int x1, x2;
- int col;
- GHashTable *arrows = g_hash_table_new (NULL, NULL);
-
-
- if (ethi->sort_info) {
- int length = e_table_sort_info_grouping_get_count(ethi->sort_info);
- int i;
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
- g_hash_table_insert (arrows,
- (gpointer) column.column,
- (gpointer) (column.ascending ?
- E_TABLE_COL_ARROW_DOWN :
- E_TABLE_COL_ARROW_UP));
- }
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
- g_hash_table_insert (arrows,
- (gpointer) column.column,
- (gpointer) (column.ascending ?
- E_TABLE_COL_ARROW_DOWN :
- E_TABLE_COL_ARROW_UP));
- }
- }
-
- ethi->width = e_table_header_total_width (ethi->eth) + ethi->group_indent_width;
- x1 = x2 = 0;
- x2 += ethi->group_indent_width;
- for (col = 0; col < cols; col++, x1 = x2){
- ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
- int col_width;
-
- col_width = ecol->width;
-
- x2 += col_width;
-
- if (x1 > (x + width))
- break;
-
- if (x2 < x)
- continue;
-
- gc = GTK_WIDGET (canvas)->style->bg_gc [GTK_STATE_NORMAL];
-
- draw_button (ethi, ecol, drawable, gc,
- GTK_WIDGET (canvas)->style,
- x1 - x, - y, x2 - x1, ethi->height,
- (ETableColArrow) g_hash_table_lookup (arrows, (gpointer) ecol->col_idx));
- }
- g_hash_table_destroy (arrows);
-}
-
-static double
-ethi_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-/*
- * is_pointer_on_division:
- *
- * Returns whether @pos is a column header division; If @the_total is not NULL,
- * then the actual position is returned here. If @return_ecol is not NULL,
- * then the ETableCol that actually contains this point is returned here
- */
-static gboolean
-is_pointer_on_division (ETableHeaderItem *ethi, int pos, int *the_total, int *return_col)
-{
- const int cols = e_table_header_count (ethi->eth);
- int col, total;
-
- total = 0;
- for (col = 0; col < cols; col++){
- ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-
- if (col == 0)
- total += ethi->group_indent_width;
-
- total += ecol->width;
-
- if ((total - TOLERANCE < pos)&& (pos < total + TOLERANCE)){
- if (return_col)
- *return_col = col;
- if (the_total)
- *the_total = total;
-
- return TRUE;
- }
-
- if (total > pos + TOLERANCE)
- return FALSE;
- }
-
- return FALSE;
-}
-
-#define convert(c,sx,sy,x,y) gnome_canvas_w2c (c,sx,sy,x,y)
-
-static void
-set_cursor (ETableHeaderItem *ethi, int pos)
-{
- GtkWidget *canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas);
-
- /* We might be invoked before we are realized */
- if (!canvas->window)
- return;
-
- if (is_pointer_on_division (ethi, pos, NULL, NULL))
- e_cursor_set (canvas->window, E_CURSOR_SIZE_X);
- else
- e_cursor_set (canvas->window, E_CURSOR_ARROW);
-}
-
-static void
-ethi_end_resize (ETableHeaderItem *ethi)
-{
- ethi->resize_col = -1;
- ethi->resize_guide = GINT_TO_POINTER (0);
-
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
-}
-
-static gboolean
-ethi_maybe_start_drag (ETableHeaderItem *ethi, GdkEventMotion *event)
-{
- if (!ethi->maybe_drag)
- return FALSE;
-
- if (ethi->eth->col_count < 2)
- return FALSE;
-
- if (MAX (abs (ethi->click_x - event->x),
- abs (ethi->click_y - event->y)) <= 3)
- return FALSE;
-
- return TRUE;
-}
-
-static void
-ethi_start_drag (ETableHeaderItem *ethi, GdkEvent *event)
-{
- GtkWidget *widget = GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas);
- GtkTargetList *list;
- GdkDragContext *context;
- ETableCol *ecol;
- int col_width;
- GdkPixmap *pixmap;
- GdkGC *gc;
- int group_indent = 0;
- GHashTable *arrows = g_hash_table_new (NULL, NULL);
-
- GtkTargetEntry ethi_drag_types [] = {
- { TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
- };
-
- ethi->drag_col = ethi_find_col_by_x (ethi, event->motion.x);
-
- if (ethi->drag_col == -1)
- return;
-
- if (ethi->sort_info) {
- int length = e_table_sort_info_grouping_get_count(ethi->sort_info);
- int i;
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
- group_indent ++;
- g_hash_table_insert (arrows,
- (gpointer) column.column,
- (gpointer) (column.ascending ?
- E_TABLE_COL_ARROW_DOWN :
- E_TABLE_COL_ARROW_UP));
- }
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
- g_hash_table_insert (arrows,
- (gpointer) column.column,
- (gpointer) (column.ascending ?
- E_TABLE_COL_ARROW_DOWN :
- E_TABLE_COL_ARROW_UP));
- }
- }
-
- ethi_drag_types[0].target = g_strdup_printf("%s-%s", ethi_drag_types[0].target, ethi->dnd_code);
- list = gtk_target_list_new (ethi_drag_types, ELEMENTS (ethi_drag_types));
- context = gtk_drag_begin (widget, list, GDK_ACTION_MOVE, 1, event);
- g_free(ethi_drag_types[0].target);
-
- ecol = e_table_header_get_column (ethi->eth, ethi->drag_col);
- col_width = ecol->width;
- pixmap = gdk_pixmap_new (widget->window, col_width, ethi->height, -1);
- gc = widget->style->bg_gc [GTK_STATE_ACTIVE];
- draw_button (ethi, ecol, pixmap, gc,
- widget->style,
- 0, 0, col_width, ethi->height,
- (ETableColArrow) g_hash_table_lookup (arrows, (gpointer) ecol->col_idx));
- gtk_drag_set_icon_pixmap (context,
- gdk_window_get_colormap (widget->window),
- pixmap,
- NULL,
- col_width / 2,
- ethi->height / 2);
- gdk_pixmap_unref (pixmap);
-
- ethi->maybe_drag = FALSE;
- g_hash_table_destroy (arrows);
-}
-
-typedef struct {
- ETableHeaderItem *ethi;
- int col;
-} EthiHeaderInfo;
-
-static void
-ethi_popup_sort_ascending(GtkWidget *widget, EthiHeaderInfo *info)
-{
- ETableCol *col;
- int model_col;
- int length;
- int i;
- int found = FALSE;
- ETableHeaderItem *ethi = info->ethi;
-
- col = e_table_header_get_column (ethi->eth, info->col);
- model_col = col->col_idx;
-
- length = e_table_sort_info_grouping_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- column.ascending = 1;
- e_table_sort_info_grouping_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- if (!found) {
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- column.ascending = 1;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- }
- if (!found) {
- ETableSortColumn column = { model_col, 1 };
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- if (length == 0)
- length++;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, length - 1, column);
- }
-}
-
-static void
-ethi_popup_sort_descending(GtkWidget *widget, EthiHeaderInfo *info)
-{
- ETableCol *col;
- int model_col;
- int length;
- int i;
- int found = FALSE;
- ETableHeaderItem *ethi = info->ethi;
-
- col = e_table_header_get_column (ethi->eth, info->col);
- model_col = col->col_idx;
-
- length = e_table_sort_info_grouping_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- column.ascending = 0;
- e_table_sort_info_grouping_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- if (!found) {
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- column.ascending = 0;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- }
- if (!found) {
- ETableSortColumn column = { model_col, 0 };
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- if (length == 0)
- length++;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, length - 1, column);
- }
-}
-
-static void
-ethi_popup_unsort(GtkWidget *widget, EthiHeaderInfo *info)
-{
- ETableHeaderItem *ethi = info->ethi;
-
- e_table_sort_info_grouping_truncate(ethi->sort_info, 0);
- e_table_sort_info_sorting_truncate(ethi->sort_info, 0);
-}
-
-static void
-ethi_popup_group_field(GtkWidget *widget, EthiHeaderInfo *info)
-{
- ETableCol *col;
- int model_col;
- ETableHeaderItem *ethi = info->ethi;
- ETableSortColumn column;
-
- col = e_table_header_get_column (ethi->eth, info->col);
- model_col = col->col_idx;
-
- column.column = model_col;
- column.ascending = 1;
- e_table_sort_info_grouping_set_nth(ethi->sort_info, 0, column);
- e_table_sort_info_grouping_truncate(ethi->sort_info, 1);
-}
-
-static void
-ethi_popup_group_box(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-ethi_popup_remove_column(GtkWidget *widget, EthiHeaderInfo *info)
-{
- e_table_header_remove(info->ethi->eth, info->col);
-}
-
-static void
-ethi_popup_field_chooser(GtkWidget *widget, EthiHeaderInfo *info)
-{
- GtkWidget *etfcd = e_table_field_chooser_dialog_new();
- gtk_object_set(GTK_OBJECT(etfcd),
- "full_header", info->ethi->full_header,
- "dnd_code", info->ethi->dnd_code,
- NULL);
- gtk_widget_show(etfcd);
-}
-
-static void
-ethi_popup_alignment(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-ethi_popup_best_fit(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-ethi_popup_format_columns(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-ethi_popup_customize_view(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-/* Bit 1 is always disabled. */
-/* Bit 2 is disabled if not "sortable". */
-static EPopupMenu ethi_context_menu [] = {
- { N_("Sort Ascending"), NULL, GTK_SIGNAL_FUNC(ethi_popup_sort_ascending), 2},
- { N_("Sort Descending"), NULL, GTK_SIGNAL_FUNC(ethi_popup_sort_descending), 2},
- { N_("Unsort"), NULL, GTK_SIGNAL_FUNC(ethi_popup_unsort), 0},
- { "", NULL, GTK_SIGNAL_FUNC(NULL), 0},
- { N_("Group By This Field"), NULL, GTK_SIGNAL_FUNC(ethi_popup_group_field), 0},
- { N_("Group By Box"), NULL, GTK_SIGNAL_FUNC(ethi_popup_group_box), 1},
- { "", NULL, GTK_SIGNAL_FUNC(NULL), 1},
- { N_("Remove This Column"), NULL, GTK_SIGNAL_FUNC(ethi_popup_remove_column), 0},
- { N_("Field Chooser"), NULL, GTK_SIGNAL_FUNC(ethi_popup_field_chooser), 0},
- { "", NULL, GTK_SIGNAL_FUNC(NULL), 1},
- { N_("Alignment"), NULL, GTK_SIGNAL_FUNC(ethi_popup_alignment), 1},
- { N_("Best Fit"), NULL, GTK_SIGNAL_FUNC(ethi_popup_best_fit), 1},
- { N_("Format Columns..."), NULL, GTK_SIGNAL_FUNC(ethi_popup_format_columns), 1},
- { "", NULL, GTK_SIGNAL_FUNC(NULL), 1},
- { N_("Customize Current View..."), NULL, GTK_SIGNAL_FUNC(ethi_popup_customize_view), 1},
- { NULL, NULL, NULL, 0 }
-};
-
-static void
-ethi_header_context_menu (ETableHeaderItem *ethi, GdkEventButton *event)
-{
- EthiHeaderInfo *info = g_new(EthiHeaderInfo, 1);
- ETableCol *col;
- info->ethi = ethi;
- info->col = ethi_find_col_by_x (ethi, event->x);
- col = e_table_header_get_column (ethi->eth, info->col);
- e_popup_menu_run (ethi_context_menu, event, 1 + (col->sortable ? 0 : 2), 0, info);
-}
-
-static void
-ethi_button_pressed (ETableHeaderItem *ethi, GdkEventButton *event)
-{
- gtk_signal_emit (GTK_OBJECT (ethi),
- ethi_signals [BUTTON_PRESSED], event);
-}
-
-/*
- * Handles the events on the ETableHeaderItem, particularly it handles resizing
- */
-static int
-ethi_event (GnomeCanvasItem *item, GdkEvent *e)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
- GnomeCanvas *canvas = item->canvas;
- const gboolean resizing = ETHI_RESIZING (ethi);
- int x, y, start, col;
- int was_maybe_drag = 0;
-
- switch (e->type){
- case GDK_ENTER_NOTIFY:
- convert (canvas, e->crossing.x, e->crossing.y, &x, &y);
- set_cursor (ethi, x);
- break;
-
- case GDK_LEAVE_NOTIFY:
- e_cursor_set (GTK_WIDGET (canvas)->window, E_CURSOR_ARROW);
- break;
-
- case GDK_MOTION_NOTIFY:
-
- convert (canvas, e->motion.x, e->motion.y, &x, &y);
- if (resizing){
- int new_width;
-
- if (ethi->resize_guide == NULL){
- /* Quick hack until I actually bind the views */
- ethi->resize_guide = GINT_TO_POINTER (1);
-
- gnome_canvas_item_grab (item,
- GDK_POINTER_MOTION_MASK |
- GDK_BUTTON_RELEASE_MASK,
- e_cursor_get (E_CURSOR_SIZE_X),
- e->button.time);
- }
-
- new_width = x - ethi->resize_start_pos;
-
- e_table_header_set_size (ethi->eth, ethi->resize_col, new_width);
-
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
- } else if (ethi_maybe_start_drag (ethi, &e->motion)){
- ethi_start_drag (ethi, e);
- } else
- set_cursor (ethi, x);
- break;
-
- case GDK_BUTTON_PRESS:
- if (e->button.button > 3)
- return FALSE;
-
- convert (canvas, e->button.x, e->button.y, &x, &y);
-
- if (is_pointer_on_division (ethi, x, &start, &col) && e->button.button == 1){
- ETableCol *ecol;
-
- /*
- * Record the important bits.
- *
- * By setting resize_pos to a non -1 value,
- * we know that we are being resized (used in the
- * other event handlers).
- */
- ecol = e_table_header_get_column (ethi->eth, col);
-
- if (!ecol->resizeable)
- break;
- ethi->resize_col = col;
- ethi->resize_start_pos = start - ecol->width;
- ethi->resize_min_width = ecol->min_width;
- } else {
- if (e->button.button == 1){
- ethi->click_x = e->button.x;
- ethi->click_y = e->button.y;
- ethi->maybe_drag = TRUE;
- } else if (e->button.button == 3){
- ethi_header_context_menu (ethi, &e->button);
- } else
- ethi_button_pressed (ethi, &e->button);
- }
- break;
-
- case GDK_2BUTTON_PRESS:
- if (!resizing)
- break;
-
- if (e->button.button != 1)
- break;
- break;
-
- case GDK_BUTTON_RELEASE: {
- gboolean needs_ungrab = FALSE;
-
- was_maybe_drag = ethi->maybe_drag;
-
- ethi->maybe_drag = FALSE;
-
- if (ethi->resize_col != -1){
- needs_ungrab = (ethi->resize_guide != NULL);
- ethi_end_resize (ethi);
- } else if (was_maybe_drag && ethi->sort_info) {
- ETableCol *col;
- int model_col;
- int length;
- int i;
- int found = FALSE;
-
- col = e_table_header_get_column (ethi->eth, ethi_find_col_by_x (ethi, e->button.x));
- model_col = col->col_idx;
-
- length = e_table_sort_info_grouping_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- int ascending = column.ascending;
- ascending = ! ascending;
- column.ascending = ascending;
- e_table_sort_info_grouping_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- if(col->sortable) {
- if (!found) {
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- for (i = 0; i < length; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
- if (model_col == column.column){
- int ascending = column.ascending;
- ascending = ! ascending;
- column.ascending = ascending;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, i, column);
- found = 1;
- break;
- }
- }
- }
- if (!found) {
- ETableSortColumn column = { model_col, 1 };
- length = e_table_sort_info_sorting_get_count(ethi->sort_info);
- if (length == 0)
- length++;
- e_table_sort_info_sorting_set_nth(ethi->sort_info, length - 1, column);
- }
- }
- }
-
- if (needs_ungrab)
- gnome_canvas_item_ungrab (item, e->button.time);
-
- break;
- }
-
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-static void
-ethi_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
-
- ethi_parent_class = gtk_type_class (PARENT_OBJECT_TYPE);
-
- object_class->destroy = ethi_destroy;
- object_class->set_arg = ethi_set_arg;
- object_class->get_arg = ethi_get_arg;
-
- item_class->update = ethi_update;
- item_class->realize = ethi_realize;
- item_class->unrealize = ethi_unrealize;
- item_class->draw = ethi_draw;
- item_class->point = ethi_point;
- item_class->event = ethi_event;
-
- gtk_object_add_arg_type ("ETableHeaderItem::ETableHeader", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_HEADER);
- gtk_object_add_arg_type ("ETableHeaderItem::full_header", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_FULL_HEADER);
- gtk_object_add_arg_type ("ETableHeaderItem::dnd_code", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_DND_CODE);
- gtk_object_add_arg_type ("ETableHeaderItem::fontset", GTK_TYPE_STRING,
- GTK_ARG_WRITABLE, ARG_TABLE_FONTSET);
- gtk_object_add_arg_type ("ETableHeaderItem::sort_info", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_SORT_INFO);
-
- /*
- * Create our pixmaps for DnD
- */
- dnd_colormap = gtk_widget_get_default_colormap ();
- remove_col_pixmap = gdk_pixmap_colormap_create_from_xpm_d (
- NULL, dnd_colormap,
- &remove_col_mask, NULL, remove_col_xpm);
-
- add_col_pixmap = gdk_pixmap_colormap_create_from_xpm_d (
- NULL, dnd_colormap,
- &add_col_mask, NULL, add_col_xpm);
-
- ethi_signals [BUTTON_PRESSED] =
- gtk_signal_new ("button_pressed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableHeaderItemClass, button_pressed),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1, GTK_TYPE_POINTER);
-
-}
-
-static void
-ethi_init (GnomeCanvasItem *item)
-{
- ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-
- ethi->resize_col = -1;
-
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = 0;
- item->y2 = 0;
-
- ethi->drag_col = -1;
- ethi->drag_mark = -1;
-
- ethi->sort_info = NULL;
-
- ethi->sort_info_changed_id = 0;
- ethi->group_info_changed_id = 0;
-
- ethi->group_indent_width = 0;
-}
-
-GtkType
-e_table_header_item_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableHeaderItem",
- sizeof (ETableHeaderItem),
- sizeof (ETableHeaderItemClass),
- (GtkClassInitFunc) ethi_class_init,
- (GtkObjectInitFunc) ethi_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_OBJECT_TYPE, &info);
- }
-
- return type;
-}
diff --git a/widgets/table/e-table-header-item.h b/widgets/table/e-table-header-item.h
deleted file mode 100644
index 15b627bfa9..0000000000
--- a/widgets/table/e-table-header-item.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_HEADER_ITEM_H_
-#define _E_TABLE_HEADER_ITEM_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gnome-xml/tree.h>
-#include "e-table-header.h"
-#include "e-table-sort-info.h"
-
-#define E_TABLE_HEADER_ITEM_TYPE (e_table_header_item_get_type ())
-#define E_TABLE_HEADER_ITEM(o) (GTK_CHECK_CAST ((o), E_TABLE_HEADER_ITEM_TYPE, ETableHeaderItem))
-#define E_TABLE_HEADER_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_HEADER_ITEM_TYPE, ETableHeaderItemClass))
-#define E_IS_TABLE_HEADER_ITEM(o) (GTK_CHECK_TYPE ((o), E_TABLE_HEADER_ITEM_TYPE))
-#define E_IS_TABLE_HEADER_ITEM_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_HEADER_ITEM_TYPE))
-
-typedef struct {
- GnomeCanvasItem parent;
- ETableHeader *eth;
-
- GdkGC *gc;
- GdkCursor *change_cursor;
-
- short height, width;
- GdkFont *font;
-
- /*
- * Used during resizing; Could be shorts
- */
- int resize_col;
- int resize_start_pos;
- int resize_min_width;
-
- GtkObject *resize_guide;
-
- int group_indent_width;
-
- /*
- * Ids
- */
- int structure_change_id, dimension_change_id;
-
- /*
- * For dragging columns
- */
- guint maybe_drag:1;
- guint dnd_ready:1;
- int click_x, click_y;
- int drag_col, drop_col, drag_mark;
- guint drag_motion_id, drag_end_id, drag_leave_id, drag_drop_id, drag_data_received_id, drag_data_get_id;
- guint sort_info_changed_id, group_info_changed_id;
- GnomeCanvasItem *remove_item;
- GdkBitmap *stipple;
-
- gchar *dnd_code;
-
- /*
- * For column sorting info
- */
- ETableSortInfo *sort_info;
-
- /* For adding fields. */
- ETableHeader *full_header;
-} ETableHeaderItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
- /*
- * signals
- */
- void (*button_pressed) (ETableHeaderItem *ethi, GdkEventButton *button);
-} ETableHeaderItemClass;
-
-GtkType e_table_header_item_get_type (void);
-
-#endif /* _E_TABLE_HEADER_ITEM_H_ */
diff --git a/widgets/table/e-table-header.c b/widgets/table/e-table-header.c
deleted file mode 100644
index fddda13da8..0000000000
--- a/widgets/table/e-table-header.c
+++ /dev/null
@@ -1,665 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-col-head.c: TableColHead implementation
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc
- */
-#include <config.h>
-#include <string.h>
-#include <gtk/gtkobject.h>
-#include <gtk/gtksignal.h>
-#include "e-table-header.h"
-#include "e-table-defines.h"
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_SORT_INFO,
- ARG_WIDTH,
-};
-
-enum {
- STRUCTURE_CHANGE,
- DIMENSION_CHANGE,
- LAST_SIGNAL
-};
-
-static void eth_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void eth_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void eth_do_remove (ETableHeader *eth, int idx, gboolean do_unref);
-static void eth_set_width(ETableHeader *eth, int width);
-static void eth_set_size (ETableHeader *eth, int idx, int size);
-static void eth_calc_widths (ETableHeader *eth);
-static void dequeue(ETableHeader *eth, int *column, int *width);
-
-static guint eth_signals [LAST_SIGNAL] = { 0, };
-
-static GtkObjectClass *e_table_header_parent_class;
-
-struct two_ints {
- int column;
- int width;
-};
-
-static gboolean
-dequeue_idle(ETableHeader *eth)
-{
- int column, width;
- dequeue(eth, &column, &width);
- while(eth->change_queue && ((struct two_ints *)eth->change_queue->data)->column == column)
- dequeue(eth, &column, &width);
- if (column == -1)
- eth_set_width(eth, width);
- else if (column < eth->col_count)
- eth_set_size(eth, column, width);
- if (eth->change_queue)
- return TRUE;
- else {
- eth_calc_widths(eth);
- eth->idle = 0;
- return FALSE;
- }
-}
-
-static void
-enqueue(ETableHeader *eth, int column, int width)
-{
- struct two_ints *store;
- store = g_new(struct two_ints, 1);
- store->column = column;
- store->width = width;
-
- eth->change_tail = g_slist_last(g_slist_append(eth->change_tail, store));
- if (!eth->change_queue)
- eth->change_queue = eth->change_tail;
-
- if (!eth->idle) {
- eth->idle = g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc) dequeue_idle, eth, NULL);
- }
-}
-
-static void
-dequeue(ETableHeader *eth, int *column, int *width)
-{
- GSList *head;
- struct two_ints *store;
- head = eth->change_queue;
- eth->change_queue = eth->change_queue->next;
- if (!eth->change_queue)
- eth->change_tail = NULL;
- store = head->data;
- g_slist_free_1(head);
- if (column)
- *column = store->column;
- if (width)
- *width = store->width;
- g_free(store);
-}
-
-static void
-eth_destroy (GtkObject *object)
-{
- ETableHeader *eth = E_TABLE_HEADER (object);
- const int cols = eth->col_count;
- int i;
-
- if (eth->sort_info) {
- if (eth->sort_info_group_change_id)
- gtk_signal_disconnect(GTK_OBJECT(eth->sort_info),
- eth->sort_info_group_change_id);
- gtk_object_unref(GTK_OBJECT(eth->sort_info));
- }
-
- if (eth->idle)
- g_source_remove(eth->idle);
- g_slist_foreach(eth->change_queue, (GFunc) g_free, NULL);
- g_slist_free(eth->change_queue);
-
- /*
- * Destroy columns
- */
- for (i = cols - 1; i >= 0; i--){
- eth_do_remove (eth, i, TRUE);
- }
-
- if (e_table_header_parent_class->destroy)
- e_table_header_parent_class->destroy (object);
-}
-
-static void
-e_table_header_class_init (GtkObjectClass *object_class)
-{
- object_class->destroy = eth_destroy;
- object_class->set_arg = eth_set_arg;
- object_class->get_arg = eth_get_arg;
-
-
- e_table_header_parent_class = (gtk_type_class (gtk_object_get_type ()));
-
- gtk_object_add_arg_type ("ETableHeader::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableHeader::sort_info", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_SORT_INFO);
-
- eth_signals [STRUCTURE_CHANGE] =
- gtk_signal_new ("structure_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableHeaderClass, structure_change),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
- eth_signals [DIMENSION_CHANGE] =
- gtk_signal_new ("dimension_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableHeaderClass, dimension_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, eth_signals, LAST_SIGNAL);
-}
-
-static void
-e_table_header_init (ETableHeader *eth)
-{
- eth->col_count = 0;
- eth->width = 0;
-
- eth->sort_info = NULL;
- eth->sort_info_group_change_id = 0;
-
- eth->columns = NULL;
- eth->selectable = FALSE;
-
- eth->change_queue = NULL;
- eth->change_tail = NULL;
-}
-
-GtkType
-e_table_header_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableHeader",
- sizeof (ETableHeader),
- sizeof (ETableHeaderClass),
- (GtkClassInitFunc) e_table_header_class_init,
- (GtkObjectInitFunc) e_table_header_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (gtk_object_get_type (), &info);
- }
-
- return type;
-}
-
-ETableHeader *
-e_table_header_new (void)
-{
- ETableHeader *eth;
-
- eth = gtk_type_new (e_table_header_get_type ());
-
- return eth;
-}
-
-static void
-eth_group_info_changed(ETableSortInfo *info, ETableHeader *eth)
-{
- enqueue(eth, -1, eth->nominal_width);
-}
-
-static void
-eth_set_width(ETableHeader *eth, int width)
-{
- eth->width = width;
-}
-
-static void
-eth_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableHeader *eth = E_TABLE_HEADER (object);
-
- switch (arg_id) {
- case ARG_WIDTH:
- eth->nominal_width = GTK_VALUE_DOUBLE (*arg);
- enqueue(eth, -1, GTK_VALUE_DOUBLE (*arg));
- break;
- case ARG_SORT_INFO:
- if (eth->sort_info) {
- if (eth->sort_info_group_change_id)
- gtk_signal_disconnect(GTK_OBJECT(eth->sort_info), eth->sort_info_group_change_id);
- gtk_object_unref(GTK_OBJECT(eth->sort_info));
- }
- eth->sort_info = E_TABLE_SORT_INFO(GTK_VALUE_OBJECT (*arg));
- if (eth->sort_info) {
- gtk_object_ref(GTK_OBJECT(eth->sort_info));
- eth->sort_info_group_change_id
- = gtk_signal_connect(GTK_OBJECT(eth->sort_info), "group_info_changed",
- GTK_SIGNAL_FUNC(eth_group_info_changed), eth);
- }
- enqueue(eth, -1, eth->nominal_width);
- break;
- default:
- break;
- }
-}
-
-static void
-eth_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- ETableHeader *eth = E_TABLE_HEADER (object);
-
- switch (arg_id) {
- case ARG_SORT_INFO:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(eth->sort_info);
- break;
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = eth->nominal_width;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-eth_update_offsets (ETableHeader *eth)
-{
- int i;
- int x = 0;
-
- for (i = 0; i < eth->col_count; i++){
- ETableCol *etc = eth->columns [i];
-
- etc->x = x;
- x += etc->width;
- }
-}
-
-static void
-eth_do_insert (ETableHeader *eth, int pos, ETableCol *val)
-{
- memmove (&eth->columns [pos+1], &eth->columns [pos],
- sizeof (ETableCol *) * (eth->col_count - pos));
- eth->columns [pos] = val;
- eth->col_count ++;
-}
-
-void
-e_table_header_add_column (ETableHeader *eth, ETableCol *tc, int pos)
-{
- g_return_if_fail (eth != NULL);
- g_return_if_fail (E_IS_TABLE_HEADER (eth));
- g_return_if_fail (tc != NULL);
- g_return_if_fail (E_IS_TABLE_COL (tc));
- g_return_if_fail (pos >= -1 && pos <= eth->col_count);
-
- if (pos == -1)
- pos = eth->col_count;
- eth->columns = g_realloc (eth->columns, sizeof (ETableCol *) * (eth->col_count + 1));
-
- /*
- * We are the primary owners of the column
- */
- gtk_object_ref (GTK_OBJECT (tc));
- gtk_object_sink (GTK_OBJECT (tc));
-
- eth_do_insert (eth, pos, tc);
-
- enqueue(eth, -1, eth->nominal_width);
- gtk_signal_emit (GTK_OBJECT (eth), eth_signals [STRUCTURE_CHANGE]);
-}
-
-ETableCol *
-e_table_header_get_column (ETableHeader *eth, int column)
-{
- g_return_val_if_fail (eth != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), NULL);
-
- if (column < 0)
- return NULL;
-
- if (column >= eth->col_count)
- return NULL;
-
- return eth->columns [column];
-}
-
-int
-e_table_header_count (ETableHeader *eth)
-{
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- return eth->col_count;
-}
-
-int
-e_table_header_index (ETableHeader *eth, int col)
-{
- g_return_val_if_fail (eth != NULL, -1);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), -1);
- g_return_val_if_fail (col < eth->col_count, -1);
-
- return eth->columns [col]->col_idx;
-}
-
-int
-e_table_header_get_index_at (ETableHeader *eth, int x_offset)
-{
- int i, total;
-
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- total = 0;
- for (i = 0; i < eth->col_count; i++){
- total += eth->columns [i]->width;
-
- if (x_offset < total)
- return i;
- }
-
- return -1;
-}
-
-ETableCol **
-e_table_header_get_columns (ETableHeader *eth)
-{
- ETableCol **ret;
-
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- ret = g_new (ETableCol *, eth->col_count + 1);
- memcpy (ret, eth->columns, sizeof (ETableCol *) * eth->col_count);
- ret [eth->col_count] = NULL;
-
- return ret;
-}
-
-gboolean
-e_table_header_selection_ok (ETableHeader *eth)
-{
- g_return_val_if_fail (eth != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), FALSE);
-
- return eth->selectable;
-}
-
-int
-e_table_header_get_selected (ETableHeader *eth)
-{
- int i;
- int selected = 0;
-
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- for (i = 0; i < eth->col_count; i++){
- if (eth->columns [i]->selected)
- selected++;
- }
-
- return selected;
-}
-
-int
-e_table_header_total_width (ETableHeader *eth)
-{
- int total, i;
-
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- total = 0;
- for (i = 0; i < eth->col_count; i++)
- total += eth->columns [i]->width;
-
- return total;
-}
-
-static void
-eth_do_remove (ETableHeader *eth, int idx, gboolean do_unref)
-{
- if (do_unref)
- gtk_object_unref (GTK_OBJECT (eth->columns [idx]));
-
- memmove (&eth->columns [idx], &eth->columns [idx+1],
- sizeof (ETableCol *) * (eth->col_count - idx - 1));
- eth->col_count--;
-}
-
-void
-e_table_header_move (ETableHeader *eth, int source_index, int target_index)
-{
- ETableCol *old;
-
- g_return_if_fail (eth != NULL);
- g_return_if_fail (E_IS_TABLE_HEADER (eth));
- g_return_if_fail (source_index >= 0);
- g_return_if_fail (target_index >= 0);
- g_return_if_fail (source_index < eth->col_count);
- g_return_if_fail (target_index < eth->col_count + 1); /* Can be moved beyond the last item. */
-
- if (source_index < target_index)
- target_index --;
-
- old = eth->columns [source_index];
- eth_do_remove (eth, source_index, FALSE);
- eth_do_insert (eth, target_index, old);
- eth_update_offsets (eth);
-
- gtk_signal_emit (GTK_OBJECT (eth), eth_signals [DIMENSION_CHANGE]);
- gtk_signal_emit (GTK_OBJECT (eth), eth_signals [STRUCTURE_CHANGE]);
-}
-
-void
-e_table_header_remove (ETableHeader *eth, int idx)
-{
- g_return_if_fail (eth != NULL);
- g_return_if_fail (E_IS_TABLE_HEADER (eth));
- g_return_if_fail (idx >= 0);
- g_return_if_fail (idx < eth->col_count);
-
- eth_do_remove (eth, idx, TRUE);
- enqueue(eth, -1, eth->nominal_width);
- gtk_signal_emit (GTK_OBJECT (eth), eth_signals [STRUCTURE_CHANGE]);
-}
-
-void
-e_table_header_set_selection (ETableHeader *eth, gboolean allow_selection)
-{
-}
-
-void
-e_table_header_set_size(ETableHeader *eth, int idx, int size)
-{
- enqueue(eth, idx, size);
-}
-
-static void
-eth_set_size (ETableHeader *eth, int idx, int size)
-{
- double expansion;
- double old_expansion;
- int min_width;
- int left_width;
- int total_extra;
- int expandable_count;
- int usable_width;
- int i;
- g_return_if_fail (eth != NULL);
- g_return_if_fail (E_IS_TABLE_HEADER (eth));
- g_return_if_fail (idx >= 0);
- g_return_if_fail (idx < eth->col_count);
-
- /* If this column is not resizable, don't do anything. */
- if (!eth->columns[idx]->resizeable)
- return;
-
- expansion = 0;
- min_width = 0;
- left_width = 0;
- expandable_count = -1;
-
- /* Calculate usable area. */
- for (i = 0; i < idx; i++) {
- left_width += eth->columns[i]->width;
- }
- /* - 1 to account for the last pixel border. */
- usable_width = eth->width - left_width - 1;
-
- if (eth->sort_info)
- usable_width -= e_table_sort_info_grouping_get_count(eth->sort_info) * GROUP_INDENT;
-
- /* Calculate minimum_width of stuff on the right as well as
- * total usable expansion on the right.
- */
- for (; i < eth->col_count; i++) {
- min_width += eth->columns[i]->min_width;
- if (eth->columns[i]->resizeable) {
- expansion += eth->columns[i]->expansion;
- expandable_count ++;
- }
- }
- /* If there's no room for anything, don't change. */
- if (expansion == 0)
- return;
-
- /* (1) If none of the columns to the right are expandable, use
- * all the expansion space in this column.
- */
- if(expandable_count == 0) {
- eth->columns[idx]->expansion = expansion;
- for (i = idx + 1; i < eth->col_count; i++) {
- eth->columns[i]->expansion = 0;
- }
- return;
- }
-
- total_extra = usable_width - min_width;
- /* If there's no extra space, set all expansions to 0. */
- if (total_extra <= 0) {
- for (i = idx; i < eth->col_count; i++) {
- eth->columns[i]->expansion = 0;
- }
- return;
- }
-
- /* If you try to resize smaller than the minimum width, it
- * uses the minimum. */
- if (size < eth->columns[idx]->min_width)
- size = eth->columns[idx]->min_width;
-
- /* If all the extra space will be used up in this column, use
- * all the expansion and set all others to 0.
- */
- if (size >= total_extra + eth->columns[idx]->min_width) {
- eth->columns[idx]->expansion = expansion;
- for (i = idx + 1; i < eth->col_count; i++) {
- eth->columns[i]->expansion = 0;
- }
- return;
- }
-
- /* The old_expansion used by columns to the right. */
- old_expansion = expansion;
- old_expansion -= eth->columns[idx]->expansion;
- /* Set the new expansion so that it will generate the desired size. */
- eth->columns[idx]->expansion = expansion * (((double)(size - eth->columns[idx]->min_width))/((double)total_extra));
- /* The expansion left for the columns on the right. */
- expansion -= eth->columns[idx]->expansion;
-
- /* (2) If the old columns to the right didn't have any
- * expansion before, expand them evenly. old_expansion > 0 by
- * expansion = SUM(i=idx to col_count -1,
- * columns[i]->min_width) - columns[idx]->min_width) =
- * SUM(non-negatives).
- */
- if (old_expansion == 0) {
- for (i = idx + 1; i < eth->col_count; i++) {
- if (eth->columns[idx]->resizeable) {
- /* expandable_count != 0 by (1) */
- eth->columns[i]->expansion = expansion / expandable_count;
- }
- }
- return;
- }
-
- /* Remove from total_extra the amount used for this column. */
- total_extra -= size - eth->columns[idx]->min_width;
- for (i = idx + 1; i < eth->col_count; i++) {
- if (eth->columns[idx]->resizeable) {
- /* old_expansion != 0 by (2) */
- eth->columns[i]->expansion *= expansion / old_expansion;
- }
- }
-}
-
-int
-e_table_header_col_diff (ETableHeader *eth, int start_col, int end_col)
-{
- int total, col;
-
- g_return_val_if_fail (eth != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
- {
- if (start_col < 0)
- start_col = 0;
- if (end_col > eth->col_count)
- end_col = eth->col_count;
-
- total = 0;
- for (col = start_col; col < end_col; col++){
-
- total += eth->columns [col]->width;
- }
- }
-
- return total;
-}
-
-static void
-eth_calc_widths (ETableHeader *eth)
-{
- int i;
- int extra;
- double expansion;
- int last_position = 0;
- double next_position = 0;
- int last_resizable = -1;
- /* - 1 to account for the last pixel border. */
- extra = eth->width - 1;
- expansion = 0;
- for (i = 0; i < eth->col_count; i++) {
- extra -= eth->columns[i]->min_width;
- if (eth->columns[i]->resizeable && eth->columns[i]->expansion > 0)
- last_resizable = i;
- expansion += eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0;
- eth->columns[i]->width = eth->columns[i]->min_width;
- }
- if (eth->sort_info)
- extra -= e_table_sort_info_grouping_get_count(eth->sort_info) * GROUP_INDENT;
- if (expansion == 0 || extra <= 0)
- return;
- for (i = 0; i < last_resizable; i++) {
- next_position += extra * (eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0)/expansion;
- eth->columns[i]->width += next_position - last_position;
- last_position = next_position;
- }
- eth->columns[i]->width += extra - last_position;
-
- eth_update_offsets (eth);
- gtk_signal_emit (GTK_OBJECT (eth), eth_signals [DIMENSION_CHANGE]);
-}
diff --git a/widgets/table/e-table-header.h b/widgets/table/e-table-header.h
deleted file mode 100644
index 0dcce14b1e..0000000000
--- a/widgets/table/e-table-header.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_COLUMN_H_
-#define _E_TABLE_COLUMN_H_
-
-#include <gtk/gtkobject.h>
-#include <gdk/gdk.h>
-#include "e-table-sort-info.h"
-#include "e-table-col.h"
-
-typedef struct _ETableHeader ETableHeader;
-
-#define E_TABLE_HEADER_TYPE (e_table_header_get_type ())
-#define E_TABLE_HEADER(o) (GTK_CHECK_CAST ((o), E_TABLE_HEADER_TYPE, ETableHeader))
-#define E_TABLE_HEADER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_HEADER_TYPE, ETableHeaderClass))
-#define E_IS_TABLE_HEADER(o) (GTK_CHECK_TYPE ((o), E_TABLE_HEADER_TYPE))
-#define E_IS_TABLE_HEADER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_HEADER_TYPE))
-
-/*
- * A Columnar header.
- */
-struct _ETableHeader {
- GtkObject base;
-
- int col_count;
- int width;
- int nominal_width;
-
- ETableSortInfo *sort_info;
- int sort_info_group_change_id;
-
- ETableCol **columns;
- gboolean selectable;
-
- GSList *change_queue, *change_tail;
- gint idle;
-};
-
-typedef struct {
- GtkObjectClass parent_class;
-
- void (*structure_change) (ETableHeader *eth);
- void (*dimension_change) (ETableHeader *eth, int col);
-} ETableHeaderClass;
-
-GtkType e_table_header_get_type (void);
-ETableHeader *e_table_header_new (void);
-
-void e_table_header_add_column (ETableHeader *eth,
- ETableCol *tc, int pos);
-ETableCol * e_table_header_get_column (ETableHeader *eth,
- int column);
-int e_table_header_count (ETableHeader *eth);
-int e_table_header_index (ETableHeader *eth,
- int col);
-int e_table_header_get_index_at (ETableHeader *eth,
- int x_offset);
-ETableCol **e_table_header_get_columns (ETableHeader *eth);
-
-gboolean e_table_header_selection_ok (ETableHeader *eth);
-int e_table_header_get_selected (ETableHeader *eth);
-int e_table_header_total_width (ETableHeader *eth);
-void e_table_header_move (ETableHeader *eth,
- int source_index,
- int target_index);
-void e_table_header_remove (ETableHeader *eth, int idx);
-void e_table_header_set_size (ETableHeader *eth, int idx, int size);
-void e_table_header_set_selection (ETableHeader *eth,
- gboolean allow_selection);
-
-int e_table_header_col_diff (ETableHeader *eth,
- int start_col, int end_col);
-
-void e_table_header_calc_widths (ETableHeader *eth);
-
-GList *e_table_header_get_selected_indexes (ETableHeader *eth);
-
-
-#endif /* _E_TABLE_HEADER_H_ */
-
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c
deleted file mode 100644
index 0f70861f1e..0000000000
--- a/widgets/table/e-table-item.c
+++ /dev/null
@@ -1,2228 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-item.c: A GnomeCanvasItem that is a view of an ETableModel.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * Copyright 1999, Helix Code, Inc.
- *
- * TODO:
- * Add a border to the thing, so that focusing works properly.
- *
- */
-#include <config.h>
-#include <stdio.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <math.h>
-#include "e-table-item.h"
-#include "e-table-subset.h"
-#include "e-cell.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-canvas-utils.h"
-#include "e-util/e-util.h"
-
-#define PARENT_OBJECT_TYPE gnome_canvas_item_get_type ()
-
-#define FOCUSED_BORDER 2
-
-static GnomeCanvasItemClass *eti_parent_class;
-
-enum {
- CURSOR_CHANGE,
- DOUBLE_CLICK,
- RIGHT_CLICK,
- KEY_PRESS,
- LAST_SIGNAL
-};
-
-static gint eti_signals [LAST_SIGNAL] = { 0, };
-
-enum {
- ARG_0,
- ARG_TABLE_HEADER,
- ARG_TABLE_MODEL,
- ARG_TABLE_SELECTION_MODEL,
- ARG_TABLE_DRAW_GRID,
- ARG_TABLE_DRAW_FOCUS,
- ARG_CURSOR_MODE,
- ARG_LENGTH_THRESHOLD,
- ARG_CURSOR_ROW,
-
- ARG_MINIMUM_WIDTH,
- ARG_WIDTH,
- ARG_HEIGHT,
-};
-
-static int eti_get_height (ETableItem *eti);
-static int eti_get_minimum_width (ETableItem *eti);
-static int eti_row_height (ETableItem *eti, int row);
-static void e_table_item_focus (ETableItem *eti, int col, int row, GdkModifierType state);
-static void eti_cursor_change (ETableSelectionModel *selection, int row, int col, ETableItem *eti);
-static void eti_selection_change (ETableSelectionModel *selection, ETableItem *eti);
-#if 0
-static void eti_request_region_show (ETableItem *eti,
- int start_col, int start_row,
- int end_col, int end_row);
-#endif
-#define ETI_ROW_HEIGHT(eti,row) ((eti)->height_cache && (eti)->height_cache[(row)] != -1 ? (eti)->height_cache[(row)] : eti_row_height((eti),(row)))
-
-inline static gint
-model_to_view_row(ETableItem *eti, int row)
-{
- int i;
- if (eti->uses_source_model) {
- ETableSubset *etss = E_TABLE_SUBSET(eti->table_model);
- if (eti->row_guess >= 0 && eti->row_guess < etss->n_map) {
- if (etss->map_table[eti->row_guess] == row) {
- return eti->row_guess;
- }
- }
- for (i = 0; i < etss->n_map; i++) {
- if (etss->map_table[i] == row)
- return i;
- }
- return -1;
- } else
- return row;
-}
-
-inline static gint
-view_to_model_row(ETableItem *eti, int row)
-{
- if (eti->uses_source_model) {
- ETableSubset *etss = E_TABLE_SUBSET(eti->table_model);
- if (row >= 0 && row < etss->n_map)
- return etss->map_table[row];
- else
- return -1;
- } else
- return row;
-}
-
-inline static gint
-model_to_view_col(ETableItem *eti, int col)
-{
- int i;
- for (i = 0; i < eti->cols; i++) {
- ETableCol *ecol = e_table_header_get_column (eti->header, i);
- if (ecol->col_idx == col)
- return i;
- }
- return -1;
-}
-
-inline static gint
-view_to_model_col(ETableItem *eti, int col)
-{
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
- return ecol->col_idx;
-}
-
-static gboolean
-eti_editing (ETableItem *eti)
-{
- if (eti->editing_col == -1)
- return FALSE;
- else
- return TRUE;
-}
-
-/*
- * During realization, we have to invoke the per-ecell realize routine
- * (On our current setup, we have one e-cell per column.
- *
- * We might want to optimize this to only realize the unique e-cells:
- * ie, a strings-only table, uses the same e-cell for every column, and
- * we might want to avoid realizing each e-cell.
- */
-static void
-eti_realize_cell_views (ETableItem *eti)
-{
- int i;
-
- for (i = 0; i < eti->n_cells; i++)
- e_cell_realize (eti->cell_views [i]);
- eti->cell_views_realized = 1;
-}
-
-static void
-eti_attach_cell_views (ETableItem *eti)
-{
- int i;
-
- g_assert (eti->header);
- g_assert (eti->table_model);
-
- /*
- * Now realize the various ECells
- */
- eti->n_cells = eti->cols;
- eti->cell_views = g_new (ECellView *, eti->n_cells);
-
- for (i = 0; i < eti->n_cells; i++){
- ETableCol *ecol = e_table_header_get_column (eti->header, i);
-
- eti->cell_views [i] = e_cell_new_view (ecol->ecell, eti->table_model, eti);
- }
-
- eti->needs_compute_height = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-}
-
-/*
- * During unrealization: we invoke every e-cell (one per column in the current
- * setup) to dispose all X resources allocated
- */
-static void
-eti_unrealize_cell_views (ETableItem *eti)
-{
- int i;
-
- if (eti->cell_views_realized == 0)
- return;
-
- for (i = 0; i < eti->n_cells; i++)
- e_cell_unrealize (eti->cell_views [i]);
- eti->cell_views_realized = 0;
-}
-
-static void
-eti_detach_cell_views (ETableItem *eti)
-{
- int i;
-
- for (i = 0; i < eti->n_cells; i++){
- e_cell_kill_view (eti->cell_views [i]);
- eti->cell_views [i] = NULL;
- }
-
- g_free (eti->cell_views);
- eti->cell_views = NULL;
- eti->n_cells = 0;
-}
-
-static void
-eti_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- double i2c [6];
- ArtPoint c1, c2, i1, i2;
- ETableItem *eti = E_TABLE_ITEM (item);
-
- /* Wrong BBox's are the source of redraw nightmares */
-
- gnome_canvas_item_i2c_affine (GNOME_CANVAS_ITEM (eti), i2c);
-
- i1.x = eti->x1;
- i1.y = eti->y1;
- i2.x = eti->x1 + eti->width;
- i2.y = eti->y1 + eti->height;
- art_affine_point (&c1, &i1, i2c);
- art_affine_point (&c2, &i2, i2c);
-
- *x1 = c1.x;
- *y1 = c1.y;
- *x2 = c2.x + 1;
- *y2 = c2.y + 1;
-}
-
-static void
-eti_reflow (GnomeCanvasItem *item, gint flags)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
-
- if (eti->needs_compute_height) {
- int new_height = eti_get_height (eti);
-
- if (new_height != eti->height) {
- eti->height = new_height;
- e_canvas_item_request_parent_reflow (GNOME_CANVAS_ITEM (eti));
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
- }
- eti->needs_compute_height = 0;
- }
- if (eti->needs_compute_width) {
- int new_width = eti_get_minimum_width (eti);
- new_width = MAX(new_width, eti->minimum_width);
- if (new_width != eti->width) {
- eti->width = new_width;
- e_canvas_item_request_parent_reflow (GNOME_CANVAS_ITEM (eti));
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
- }
- eti->needs_compute_width = 0;
- }
-}
-
-/*
- * GnomeCanvasItem::update method
- */
-static void
-eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- ArtPoint o1, o2;
- ETableItem *eti = E_TABLE_ITEM (item);
-
- if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)
- (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)(item, affine, clip_path, flags);
-
- o1.x = item->x1;
- o1.y = item->y1;
- o2.x = item->x2;
- o2.y = item->y2;
-
- eti_bounds (item, &item->x1, &item->y1, &item->x2, &item->y2);
- if (item->x1 != o1.x ||
- item->y1 != o1.y ||
- item->x2 != o2.x ||
- item->y2 != o2.y) {
- gnome_canvas_request_redraw (item->canvas, o1.x, o1.y, o2.x, o2.y);
- eti->needs_redraw = 1;
- }
-
- if (eti->needs_redraw) {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1,
- item->x2, item->y2);
- eti->needs_redraw = 0;
- }
-}
-
-/*
- * eti_remove_table_model:
- *
- * Invoked to release the table model associated with this ETableItem
- */
-static void
-eti_remove_table_model (ETableItem *eti)
-{
- if (!eti->table_model)
- return;
-
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_pre_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_row_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_cell_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_row_inserted_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
- eti->table_model_row_deleted_id);
- gtk_object_unref (GTK_OBJECT (eti->table_model));
- if (eti->source_model)
- gtk_object_unref (GTK_OBJECT (eti->source_model));
-
- eti->table_model_pre_change_id = 0;
- eti->table_model_change_id = 0;
- eti->table_model_row_change_id = 0;
- eti->table_model_cell_change_id = 0;
- eti->table_model_row_inserted_id = 0;
- eti->table_model_row_deleted_id = 0;
- eti->table_model = NULL;
- eti->source_model = NULL;
- eti->uses_source_model = 0;
-}
-
-/*
- * eti_remove_table_model:
- *
- * Invoked to release the table model associated with this ETableItem
- */
-static void
-eti_remove_table_selection_model (ETableItem *eti)
-{
- if (!eti->selection)
- return;
-
- gtk_signal_disconnect (GTK_OBJECT (eti->selection),
- eti->selection_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->selection),
- eti->cursor_change_id);
- gtk_object_unref (GTK_OBJECT (eti->selection));
-
- eti->selection_change_id = 0;
- eti->cursor_change_id = 0;
- eti->selection = NULL;
-}
-
-/*
- * eti_remove_header_model:
- *
- * Invoked to release the header model associated with this ETableItem
- */
-static void
-eti_remove_header_model (ETableItem *eti)
-{
- if (!eti->header)
- return;
-
- gtk_signal_disconnect (GTK_OBJECT (eti->header),
- eti->header_structure_change_id);
- gtk_signal_disconnect (GTK_OBJECT (eti->header),
- eti->header_dim_change_id);
-
- if (eti->cell_views){
- eti_unrealize_cell_views (eti);
- eti_detach_cell_views (eti);
- }
- gtk_object_unref (GTK_OBJECT (eti->header));
-
-
- eti->header_structure_change_id = 0;
- eti->header_dim_change_id = 0;
- eti->header = NULL;
-}
-
-/*
- * eti_row_height_real:
- *
- * Returns the height used by row @row. This does not include the one-pixel
- * used as a separator between rows
- */
-static int
-eti_row_height_real (ETableItem *eti, int row)
-{
- const int cols = e_table_header_count (eti->header);
- int col;
- int h, max_h;
-
- g_assert (eti->cell_views);
-
- max_h = 0;
-
- for (col = 0; col < cols; col++){
- h = e_cell_height (eti->cell_views [col], view_to_model_col(eti, col), col, row);
-
- if (h > max_h)
- max_h = h;
- }
- return max_h;
-}
-
-static gboolean
-height_cache_idle(ETableItem *eti)
-{
- int changed = 0;
- int i;
- if (!eti->height_cache) {
- eti->height_cache = g_new(int, eti->rows);
- }
- for (i = eti->height_cache_idle_count; i < eti->rows; i++) {
- if (eti->height_cache[i] == -1) {
- eti_row_height(eti, i);
- changed ++;
- if (changed >= 20)
- break;
- }
- }
- if (changed >= 20) {
- eti->height_cache_idle_count = i;
- return TRUE;
- }
- eti->height_cache_idle_id = 0;
- return FALSE;
-}
-
-static void
-free_height_cache (ETableItem *eti)
-{
- if (eti->height_cache)
- g_free (eti->height_cache);
- eti->height_cache = NULL;
- eti->height_cache_idle_count = 0;
-
- if (eti->height_cache_idle_id == 0)
- eti->height_cache_idle_id = g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc) height_cache_idle, eti, NULL);
-}
-
-static void
-calculate_height_cache (ETableItem *eti)
-{
- int i;
- free_height_cache(eti);
- eti->height_cache = g_new(int, eti->rows);
- for (i = 0; i < eti->rows; i++) {
- eti->height_cache[i] = -1;
- }
-}
-
-
-/*
- * eti_row_height:
- *
- * Returns the height used by row @row. This does not include the one-pixel
- * used as a separator between rows
- */
-static int
-eti_row_height (ETableItem *eti, int row)
-{
- if (!eti->height_cache) {
- calculate_height_cache (eti);
- }
- if (eti->height_cache[row] == -1) {
- eti->height_cache[row] = eti_row_height_real(eti, row);
- if (row > 0 &&
- eti->length_threshold != -1 &&
- eti->rows > eti->length_threshold &&
- eti->height_cache[row] != eti_row_height(eti, 0)) {
- eti->needs_compute_height = 1;
- e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(eti));
- }
- }
- return eti->height_cache[row];
-}
-
-/*
- * eti_get_height:
- *
- * Returns the height of the ETableItem.
- *
- * The ETableItem might compute the whole height by asking every row its
- * size. There is a special mode (designed to work when there are too
- * many rows in the table that performing the previous step could take
- * too long) set by the ETableItem->length_threshold that would determine
- * when the height is computed by using the first row as the size for
- * every other row in the ETableItem.
- */
-static int
-eti_get_height (ETableItem *eti)
-{
- const int rows = eti->rows;
- int row;
- int height;
-
- if (rows == 0)
- return 0;
-
- if (eti->length_threshold != -1){
- if (rows > eti->length_threshold){
- int row_height = eti_row_height(eti, 0);
- if (eti->height_cache) {
- height = 0;
- for (row = 0; row < rows; row++) {
- if (eti->height_cache[row] == -1) {
- height += (row_height + 1) * (rows - row);
- break;
- }
- else
- height += eti->height_cache[row] + 1;
- }
- } else
- height = (eti_row_height (eti, 0) + 1) * rows;
-
- /*
- * 1 pixel at the top
- */
- return height + 1;
- }
- }
-
- height = 1;
- for (row = 0; row < rows; row++)
- height += eti_row_height (eti, row) + 1;
-
- return height;
-}
-
-static int
-eti_get_minimum_width (ETableItem *eti)
-{
- int width = 0;
- int col;
- for (col = 0; col < eti->cols; col++){
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
- width += ecol->min_width;
- }
- return width;
-}
-
-static void
-eti_item_region_redraw (ETableItem *eti, int x0, int y0, int x1, int y1)
-{
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti);
- ArtDRect rect;
- double i2c [6];
-
- rect.x0 = x0;
- rect.y0 = y0;
- rect.x1 = x1;
- rect.y1 = y1;
-
- gnome_canvas_item_i2c_affine (item, i2c);
- art_drect_affine_transform (&rect, &rect, i2c);
-
- gnome_canvas_request_redraw (item->canvas, rect.x0, rect.y0, rect.x1, rect.y1);
-}
-
-/*
- * Callback routine: invoked before the ETableModel has suffers a change
- */
-static void
-eti_table_model_pre_change (ETableModel *table_model, ETableItem *eti)
-{
- if (eti_editing (eti))
- e_table_item_leave_edit (eti);
-}
-
-/*
- * Callback routine: invoked when the ETableModel has suffered a change
- */
-static void
-eti_table_model_changed (ETableModel *table_model, ETableItem *eti)
-{
-#if 0
- int view_row;
-#endif
-
- eti->rows = e_table_model_row_count (eti->table_model);
-
- free_height_cache(eti);
-
- eti->needs_compute_height = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-
-#if 0
- view_row = model_to_view_row(eti, eti->cursor_row);
- if (view_row >= 0 && eti->cursor_col >= 0)
- eti_request_region_show (eti, eti->cursor_col, view_row, eti->cursor_col, view_row);
-#endif
-}
-
-/*
- * Computes the distance between @start_row and @end_row in pixels
- */
-static int
-eti_row_diff (ETableItem *eti, int start_row, int end_row)
-{
- int row, total;
-
- total = 0;
-
- for (row = start_row; row < end_row; row++)
- total += eti_row_height (eti, row) + 1;
-
- return total;
-}
-
-/*
- * eti_request_region_redraw:
- *
- * Request a canvas redraw on the range (start_col, start_row) to (end_col, end_row).
- * This is inclusive (ie, you can use: 0,0-0,0 to redraw the first cell).
- *
- * The @border argument is a number of pixels around the region that should also be queued
- * for redraw. This is typically used by the focus routines to queue a redraw for the
- * border as well.
- */
-static void
-eti_request_region_redraw (ETableItem *eti,
- int start_col, int start_row,
- int end_col, int end_row, int border)
-{
- int x1, y1, width, height;
-
- if (eti->rows > 0) {
-
- x1 = e_table_header_col_diff (eti->header, 0, start_col);
- y1 = eti_row_diff (eti, 0, start_row);
- width = e_table_header_col_diff (eti->header, start_col, end_col + 1);
- height = eti_row_diff (eti, start_row, end_row + 1);
-
- eti_item_region_redraw (eti, eti->x1 + x1 - border,
- eti->y1 + y1 - border,
- eti->x1 + x1 + width + 1 + border,
- eti->y1 + y1 + height + 1 + border);
- }
-}
-
-/*
- * eti_request_region_show
- *
- * Request a canvas show on the range (start_col, start_row) to (end_col, end_row).
- * This is inclusive (ie, you can use: 0,0-0,0 to show the first cell).
- */
-static void
-eti_request_region_show (ETableItem *eti,
- int start_col, int start_row,
- int end_col, int end_row)
-{
- int x1, y1, x2, y2;
-
- x1 = e_table_header_col_diff (eti->header, 0, start_col);
- y1 = eti_row_diff (eti, 0, start_row);
- x2 = x1 + e_table_header_col_diff (eti->header, start_col, end_col + 1);
- y2 = y1 + eti_row_diff (eti, start_row, end_row + 1);
-
- e_canvas_item_show_area(GNOME_CANVAS_ITEM(eti), x1, y1, x2, y2);
-}
-
-static void
-eti_table_model_row_changed (ETableModel *table_model, int row, ETableItem *eti)
-{
- if (eti->renderers_can_change_size) {
- eti_table_model_changed (table_model, eti);
- return;
- }
-
- eti_request_region_redraw (eti, 0, row, eti->cols, row, 0);
-}
-
-static void
-eti_table_model_cell_changed (ETableModel *table_model, int col, int row, ETableItem *eti)
-{
- if (eti->renderers_can_change_size) {
- eti_table_model_changed (table_model, eti);
- return;
- }
-
- eti_request_region_redraw (eti, 0, row, eti->cols -1, row, 0);
-}
-
-static void
-eti_table_model_row_inserted (ETableModel *table_model, int row, ETableItem *eti)
-{
- eti_table_model_changed (table_model, eti);
-}
-
-static void
-eti_table_model_row_deleted (ETableModel *table_model, int row, ETableItem *eti)
-{
- eti_table_model_changed (table_model, eti);
-}
-
-void
-e_table_item_redraw_range (ETableItem *eti,
- int start_col, int start_row,
- int end_col, int end_row)
-{
- int border;
- int cursor_col, cursor_row;
-
- g_return_if_fail (eti != NULL);
- g_return_if_fail (E_IS_TABLE_ITEM (eti));
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- if ((start_col == cursor_col) ||
- (end_col == cursor_col) ||
- (view_to_model_row(eti, start_row) == cursor_row) ||
- (view_to_model_row(eti, end_row) == cursor_row))
- border = 2;
- else
- border = 0;
-
- eti_request_region_redraw(eti, start_col, start_row, end_col, end_row, border);
-}
-
-static void
-eti_add_table_model (ETableItem *eti, ETableModel *table_model)
-{
- g_assert (eti->table_model == NULL);
-
- eti->table_model = table_model;
- gtk_object_ref (GTK_OBJECT (eti->table_model));
-
- eti->table_model_pre_change_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_pre_change",
- GTK_SIGNAL_FUNC (eti_table_model_pre_change), eti);
-
- eti->table_model_change_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_changed",
- GTK_SIGNAL_FUNC (eti_table_model_changed), eti);
-
- eti->table_model_row_change_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_row_changed",
- GTK_SIGNAL_FUNC (eti_table_model_row_changed), eti);
-
- eti->table_model_cell_change_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_cell_changed",
- GTK_SIGNAL_FUNC (eti_table_model_cell_changed), eti);
-
- eti->table_model_row_inserted_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_row_inserted",
- GTK_SIGNAL_FUNC (eti_table_model_row_inserted), eti);
-
- eti->table_model_row_deleted_id = gtk_signal_connect (
- GTK_OBJECT (table_model), "model_row_deleted",
- GTK_SIGNAL_FUNC (eti_table_model_row_deleted), eti);
-
- if (eti->header) {
- eti_detach_cell_views (eti);
- eti_attach_cell_views (eti);
- }
-
- if (E_IS_TABLE_SUBSET(table_model)) {
- eti->uses_source_model = 1;
- eti->source_model = E_TABLE_SUBSET(table_model)->source;
- if (eti->source_model)
- gtk_object_ref(GTK_OBJECT(eti->source_model));
- }
-
- eti_table_model_changed (table_model, eti);
-}
-
-static void
-eti_add_table_selection_model (ETableItem *eti, ETableSelectionModel *selection)
-{
- g_assert (eti->selection == NULL);
-
- eti->selection = selection;
- gtk_object_ref (GTK_OBJECT (eti->selection));
-
- eti->selection_change_id = gtk_signal_connect (
- GTK_OBJECT (selection), "selection_changed",
- GTK_SIGNAL_FUNC (eti_selection_change), eti);
-
- eti->cursor_change_id = gtk_signal_connect (
- GTK_OBJECT (selection), "cursor_changed",
- GTK_SIGNAL_FUNC (eti_cursor_change), eti);
-
- eti_selection_change(selection, eti);
-}
-
-static void
-eti_header_dim_changed (ETableHeader *eth, int col, ETableItem *eti)
-{
- eti->needs_compute_width = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-}
-
-static void
-eti_header_structure_changed (ETableHeader *eth, ETableItem *eti)
-{
- eti->cols = e_table_header_count (eti->header);
- eti->width = e_table_header_total_width (eti->header);
-
- /*
- * There should be at least one column
- */
- g_assert (eti->cols != 0);
-
- if (eti->cell_views){
- eti_unrealize_cell_views (eti);
- eti_detach_cell_views (eti);
- eti_attach_cell_views (eti);
- eti_realize_cell_views (eti);
- } else {
- if (eti->table_model) {
- eti_detach_cell_views (eti);
- eti_attach_cell_views (eti);
- }
- }
- eti->needs_compute_width = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-}
-
-static void
-eti_add_header_model (ETableItem *eti, ETableHeader *header)
-{
- g_assert (eti->header == NULL);
-
- eti->header = header;
- gtk_object_ref (GTK_OBJECT (header));
-
- eti_header_structure_changed (header, eti);
-
- eti->header_dim_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "dimension_change",
- GTK_SIGNAL_FUNC (eti_header_dim_changed), eti);
-
- eti->header_structure_change_id = gtk_signal_connect (
- GTK_OBJECT (header), "structure_change",
- GTK_SIGNAL_FUNC (eti_header_structure_changed), eti);
-}
-
-/*
- * GtkObject::destroy method
- */
-static void
-eti_destroy (GtkObject *object)
-{
- ETableItem *eti = E_TABLE_ITEM (object);
-
- eti_remove_header_model (eti);
- eti_remove_table_model (eti);
- eti_remove_table_selection_model (eti);
-
- if (eti->selection)
- gtk_object_unref(GTK_OBJECT(eti->selection));
-
- if (eti->height_cache_idle_id)
- g_source_remove(eti->height_cache_idle_id);
-
- g_free (eti->height_cache);
-
- if (GTK_OBJECT_CLASS (eti_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (eti_parent_class)->destroy) (object);
-}
-
-static void
-eti_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableItem *eti;
- int cursor_col;
-
- item = GNOME_CANVAS_ITEM (o);
- eti = E_TABLE_ITEM (o);
-
- switch (arg_id){
- case ARG_TABLE_HEADER:
- eti_remove_header_model (eti);
- eti_add_header_model (eti, E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg)));
- break;
-
- case ARG_TABLE_MODEL:
- eti_remove_table_model (eti);
- eti_add_table_model (eti, E_TABLE_MODEL(GTK_VALUE_OBJECT (*arg)));
- break;
-
- case ARG_TABLE_SELECTION_MODEL:
- eti_remove_table_selection_model (eti);
- if (GTK_VALUE_OBJECT (*arg))
- eti_add_table_selection_model (eti, E_TABLE_SELECTION_MODEL(GTK_VALUE_OBJECT (*arg)));
- break;
-
- case ARG_LENGTH_THRESHOLD:
- eti->length_threshold = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_TABLE_DRAW_GRID:
- eti->draw_grid = GTK_VALUE_BOOL (*arg);
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- eti->draw_focus = GTK_VALUE_BOOL (*arg);
- break;
-
- case ARG_CURSOR_MODE:
- eti->cursor_mode = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_MINIMUM_WIDTH:
- case ARG_WIDTH:
- if (eti->minimum_width == eti->width && GTK_VALUE_DOUBLE (*arg) > eti->width)
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
- eti->minimum_width = GTK_VALUE_DOUBLE (*arg);
- if (eti->minimum_width < eti->width)
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
- break;
- case ARG_CURSOR_ROW:
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- NULL);
-
- e_table_item_focus (eti, cursor_col != -1 ? cursor_col : 0, view_to_model_row(eti, GTK_VALUE_INT (*arg)), 0);
- break;
- }
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(eti));
-}
-
-static void
-eti_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- ETableItem *eti;
- int row;
-
- item = GNOME_CANVAS_ITEM (o);
- eti = E_TABLE_ITEM (o);
-
- switch (arg_id){
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = eti->width;
- break;
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = eti->height;
- break;
- case ARG_MINIMUM_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = eti->minimum_width;
- break;
- case ARG_CURSOR_ROW:
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &row,
- NULL);
- GTK_VALUE_INT (*arg) = model_to_view_row(eti, row);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- }
-}
-
-static void
-eti_init (GnomeCanvasItem *item)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
-
- eti->editing_col = -1;
- eti->editing_row = -1;
- eti->height = 0;
- eti->width = 0;
- eti->minimum_width = 0;
-
- eti->height_cache = NULL;
- eti->height_cache_idle_id = 0;
- eti->height_cache_idle_count = 0;
-
- eti->length_threshold = -1;
- eti->renderers_can_change_size = 1;
-
- eti->uses_source_model = 0;
- eti->source_model = NULL;
-
- eti->row_guess = -1;
- eti->cursor_mode = E_TABLE_CURSOR_SIMPLE;
-
- eti->selection_change_id = 0;
- eti->cursor_change_id = 0;
- eti->selection = NULL;
-
- eti->needs_redraw = 0;
- eti->needs_compute_height = 0;
-
- e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM (eti), eti_reflow);
-}
-
-#define gray50_width 2
-#define gray50_height 2
-static const char gray50_bits[] = {
- 0x02, 0x01, };
-
-static void
-eti_realize (GnomeCanvasItem *item)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
- GtkWidget *canvas_widget = GTK_WIDGET (item->canvas);
- GdkWindow *window;
-
- if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->realize)
- (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->realize)(item);
-
- /*
- * Gdk Resource allocation
- */
- window = canvas_widget->window;
-
- eti->fill_gc = gdk_gc_new (window);
-
- eti->grid_gc = gdk_gc_new (window);
-#if 0
- /* This sets it to gray */
-/* gdk_gc_set_foreground (eti->grid_gc, &canvas_widget->style->bg [GTK_STATE_NORMAL]); */
-#else
- gdk_gc_set_foreground (eti->grid_gc, &canvas_widget->style->dark [GTK_STATE_NORMAL]);
-#endif
- eti->focus_gc = gdk_gc_new (window);
- gdk_gc_set_foreground (eti->focus_gc, &canvas_widget->style->bg [GTK_STATE_NORMAL]);
- gdk_gc_set_background (eti->focus_gc, &canvas_widget->style->fg [GTK_STATE_NORMAL]);
- eti->stipple = gdk_bitmap_create_from_data (NULL, gray50_bits, gray50_width, gray50_height);
- gdk_gc_set_ts_origin (eti->focus_gc, 0, 0);
- gdk_gc_set_stipple (eti->focus_gc, eti->stipple);
- gdk_gc_set_fill (eti->focus_gc, GDK_OPAQUE_STIPPLED);
-
- if (eti->cell_views == NULL)
- eti_attach_cell_views (eti);
-
- eti_realize_cell_views (eti);
-
- eti->needs_compute_height = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
- eti->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-}
-
-static void
-eti_unrealize (GnomeCanvasItem *item)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
-
- if (eti_editing (eti))
- e_table_item_leave_edit (eti);
-
- gdk_gc_unref (eti->fill_gc);
- eti->fill_gc = NULL;
- gdk_gc_unref (eti->grid_gc);
- eti->grid_gc = NULL;
- gdk_gc_unref (eti->focus_gc);
- eti->focus_gc = NULL;
- gdk_bitmap_unref (eti->stipple);
- eti->stipple = NULL;
-
- eti_unrealize_cell_views (eti);
-
- eti->height = 0;
-
- if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->unrealize)(item);
-}
-
-static void
-eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
- const int rows = eti->rows;
- const int cols = eti->cols;
- int row, col, y1, y2;
- int first_col, last_col, x_offset;
- int first_row, last_row, y_offset, yd;
- int x1, x2;
- int f_x1, f_x2, f_y1, f_y2;
- gboolean f_found;
- double i2c [6];
- ArtPoint eti_base, eti_base_item;
- GtkWidget *canvas = GTK_WIDGET(item->canvas);
- GdkColor *background;
-
- /*
- * Clear the background
- */
-#if 0
- gdk_draw_rectangle (
- drawable, eti->fill_gc, TRUE,
- eti->x1 - x, eti->y1 - y, eti->width, eti->height);
-#endif
-
- /*
- * Find out our real position after grouping
- */
- gnome_canvas_item_i2c_affine (item, i2c);
- eti_base_item.x = eti->x1;
- eti_base_item.y = eti->y1;
- art_affine_point (&eti_base, &eti_base_item, i2c);
-
- /*
- * First column to draw, last column to draw
- */
- first_col = -1;
- last_col = x_offset = 0;
- x1 = x2 = floor (eti_base.x);
- for (col = 0; col < cols; col++, x1 = x2){
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
- x2 = x1 + ecol->width;
-
- if (x1 > (x + width))
- break;
- if (x2 < x)
- continue;
- if (first_col == -1){
- x_offset = x1 - x;
- first_col = col;
- }
- }
- last_col = col;
-
- /*
- * Nothing to paint
- */
- if (first_col == -1)
- return;
-
- /*
- * Compute row span.
- */
- first_row = -1;
- y_offset = 0;
- y1 = y2 = floor (eti_base.y) + 1;
- for (row = 0; row < rows; row++, y1 = y2){
-
- y2 += ETI_ROW_HEIGHT (eti, row) + 1;
-
- if (y1 > y + height)
- break;
-
- if (y2 < y)
- continue;
-
- if (first_row == -1){
- y_offset = y1 - y;
- first_row = row;
- }
- }
- last_row = row;
-
- if (first_row == -1)
- return;
-
- /*
- * Draw cells
- */
- yd = y_offset;
- f_x1 = f_x2 = f_y1 = f_y2 = -1;
- f_found = FALSE;
-
- if (eti->draw_grid && first_row == 0){
- gdk_draw_line (
- drawable, eti->grid_gc,
- eti_base.x - x, yd, eti_base.x + eti->width - x, yd);
- }
- yd++;
-
- for (row = first_row; row < last_row; row++){
- int xd, height;
- gboolean selected;
- gint cursor_col, cursor_row;
-
- height = ETI_ROW_HEIGHT (eti, row);
-
- xd = x_offset;
-/* printf ("paint: %d %d\n", yd, yd + height); */
-
- selected = e_table_selection_model_is_row_selected(eti->selection, view_to_model_row(eti,row));
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- for (col = first_col; col < last_col; col++){
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
- ECellView *ecell_view = eti->cell_views [col];
- gboolean col_selected = selected;
- switch (eti->cursor_mode) {
- case E_TABLE_CURSOR_SIMPLE:
- if (cursor_col == ecol->col_idx && cursor_row == view_to_model_row(eti, row))
- col_selected = !col_selected;
- break;
- case E_TABLE_CURSOR_LINE:
- /* Nothing */
- break;
- }
-
- if (selected){
- background = &canvas->style->bg [GTK_STATE_SELECTED];
- } else {
- if (row % 2)
- background = &canvas->style->base [GTK_STATE_NORMAL];
- else
- background = &canvas->style->base [GTK_STATE_SELECTED];
- }
-
- gdk_gc_set_foreground (eti->fill_gc, background);
- gdk_draw_rectangle (drawable, eti->fill_gc, TRUE,
- xd, yd, ecol->width, height);
-
- e_cell_draw (ecell_view, drawable, ecol->col_idx, col, row, col_selected,
- xd, yd, xd + ecol->width, yd + height);
-
- if (view_to_model_col(eti, col) == cursor_col && view_to_model_row(eti, row) == cursor_row){
- f_x1 = xd;
- f_x2 = xd + ecol->width;
- f_y1 = yd;
- f_y2 = yd + height;
- f_found = TRUE;
- }
-
- xd += ecol->width;
- }
- yd += height;
-
- if (eti->draw_grid)
- gdk_draw_line (
- drawable, eti->grid_gc,
- eti_base.x - x, yd, eti_base.x + eti->width - x, yd);
- yd++;
- }
-
- if (eti->draw_grid){
- int xd = x_offset;
-
- for (col = first_col; col <= last_col; col++){
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
- gdk_draw_line (
- drawable, eti->grid_gc,
- xd, y_offset, xd, yd - 1);
-
- /*
- * This looks wierd, but it is to draw the last line
- */
- if (ecol)
- xd += ecol->width;
- }
- }
-
- /*
- * Draw focus
- */
- if (f_found && eti->draw_focus){
- gdk_draw_rectangle (drawable, eti->focus_gc, FALSE,
- f_x1 + 1, f_y1, f_x2 - f_x1 - 2, f_y2 - f_y1 - 1);
- }
-}
-
-static double
-eti_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
-
- return 0.0;
-}
-
-static gboolean
-find_cell (ETableItem *eti, double x, double y, int *col_res, int *row_res, double *x1_res, double *y1_res)
-{
- const int cols = eti->cols;
- const int rows = eti->rows;
- gdouble x1, y1, x2, y2;
- int col, row;
-
- /* FIXME: this routine is inneficient, fix later */
-
- if (cols == 0 || rows == 0)
- return FALSE;
-
- x -= eti->x1;
- y -= eti->y1;
-
- x1 = 0;
- for (col = 0; col < cols - 1; col++, x1 = x2){
- ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
- if (x < x1)
- return FALSE;
-
- x2 = x1 + ecol->width;
-
- if (x <= x2)
- break;
- }
-
- y1 = y2 = 0;
- for (row = 0; row < rows - 1; row++, y1 = y2){
- if (y < y1)
- return FALSE;
-
- y2 += ETI_ROW_HEIGHT (eti, row) + 1;
-
- if (y <= y2)
- break;
- }
- *col_res = col;
- if (x1_res)
- *x1_res = x - x1;
- *row_res = row;
- if (y1_res)
- *y1_res = y - y1;
- return TRUE;
-}
-
-static void
-eti_cursor_move (ETableItem *eti, gint row, gint column)
-{
- e_table_item_leave_edit (eti);
- e_table_item_focus (eti, view_to_model_col(eti, column), view_to_model_row(eti, row), 0);
-}
-
-static void
-eti_cursor_move_left (ETableItem *eti)
-{
- int cursor_col, cursor_row;
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row), model_to_view_col(eti, cursor_col) - 1);
-}
-
-static void
-eti_cursor_move_right (ETableItem *eti)
-{
- int cursor_col, cursor_row;
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row), model_to_view_col(eti, cursor_col) + 1);
-}
-
-static void
-eti_cursor_move_up (ETableItem *eti)
-{
- int cursor_col, cursor_row;
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row) - 1, model_to_view_col(eti, cursor_col));
-}
-
-static void
-eti_cursor_move_down (ETableItem *eti)
-{
- int cursor_col, cursor_row;
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- "cursor_row", &cursor_row,
- NULL);
-
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row) + 1, model_to_view_col(eti, cursor_col));
-}
-
-/* FIXME: cursor */
-static int
-eti_event (GnomeCanvasItem *item, GdkEvent *e)
-{
- ETableItem *eti = E_TABLE_ITEM (item);
- ECellView *ecell_view;
- gint return_val = TRUE;
-
- switch (e->type){
- case GDK_BUTTON_PRESS: {
- double x1, y1;
- int col, row;
- gint cursor_row, cursor_col;
-
- e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(eti));
-
- switch (e->button.button) {
- case 1: /* Fall through. */
- case 2:
- gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
-
- if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1))
- return TRUE;
-
- e_table_selection_model_do_something(eti->selection, view_to_model_row(eti, row), view_to_model_col(eti, col), e->button.state);
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_row == view_to_model_row(eti, row) && cursor_col == view_to_model_col(eti, col)){
-
- if ((!eti_editing(eti)) && e_table_model_is_cell_editable(eti->selection->model, cursor_col, cursor_row)) {
- e_table_item_enter_edit (eti, col, row);
- }
-
- ecell_view = eti->cell_views [col];
-
- /*
- * Adjust the event positions
- */
- e->button.x = x1;
- e->button.y = y1;
-
- e_cell_event (ecell_view, e, view_to_model_col(eti, col), col, row);
- }
- break;
- case 3:
- gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
- if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1))
- return TRUE;
-
- e_table_selection_model_maybe_do_something(eti->selection, view_to_model_row(eti, row), view_to_model_col(eti, col), 0);
-
- gtk_signal_emit (GTK_OBJECT (eti), eti_signals [RIGHT_CLICK],
- row, col, e, &return_val);
- break;
- case 4:
- case 5:
- return FALSE;
- break;
-
- }
- break;
- }
-
- case GDK_BUTTON_RELEASE: {
- double x1, y1;
- int col, row;
- gint cursor_row, cursor_col;
-
- switch (e->button.button) {
- case 1: /* Fall through. */
- case 2:
- gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
-
- if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1))
- return TRUE;
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_row == view_to_model_row(eti, row) && cursor_col == view_to_model_col(eti, col)){
-
- ecell_view = eti->cell_views [col];
-
- /*
- * Adjust the event positions
- */
- e->button.x = x1;
- e->button.y = y1;
-
- e_cell_event (ecell_view, e, view_to_model_col(eti, col), col, row);
- }
- break;
- case 3:
- case 4:
- case 5:
- return FALSE;
- break;
-
- }
- break;
- }
-
- case GDK_2BUTTON_PRESS: {
- double x1, y1;
- int col, row;
-
- if (e->button.button == 5 ||
- e->button.button == 4)
- return FALSE;
-
- gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
-
- if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1))
- return TRUE;
-
- gtk_signal_emit (GTK_OBJECT (eti), eti_signals [DOUBLE_CLICK],
- row);
- break;
- }
- case GDK_MOTION_NOTIFY: {
- int col, row;
- double x1, y1;
- gint cursor_col, cursor_row;
-
- gnome_canvas_item_w2i (item, &e->motion.x, &e->motion.y);
-
- if (!find_cell (eti, e->motion.x, e->motion.y, &col, &row, &x1, &y1))
- return TRUE;
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_row == view_to_model_row(eti, row) && cursor_col == view_to_model_col(eti, col)){
- ecell_view = eti->cell_views [col];
-
- /*
- * Adjust the event positions
- */
- e->motion.x = x1;
- e->motion.y = y1;
-
- e_cell_event (ecell_view, e, view_to_model_col(eti, col), col, row);
- }
- break;
- }
-
- case GDK_KEY_PRESS: {
- gint cursor_row, cursor_col;
- gint handled = TRUE;
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_col == -1)
- return FALSE;
-
- switch (e->key.keyval){
- case GDK_Left:
- if (eti_editing (eti)) {
- handled = FALSE;
- break;
- }
-
- if (cursor_col != view_to_model_col(eti, 0))
- eti_cursor_move_left (eti);
- break;
-
- case GDK_Right:
- if (eti_editing (eti)) {
- handled = FALSE;
- break;
- }
-
- if (cursor_col != view_to_model_col(eti, eti->cols - 1))
- eti_cursor_move_right (eti);
- break;
-
- case GDK_Up:
- if (cursor_row != view_to_model_row(eti, 0))
- eti_cursor_move_up (eti);
- else
- return_val = FALSE;
- break;
-
- case GDK_Down:
- if (cursor_row != view_to_model_row(eti, eti->rows - 1))
- eti_cursor_move_down (eti);
- else
- return_val = FALSE;
- break;
-
- case GDK_Tab:
- case GDK_KP_Tab:
- case GDK_ISO_Left_Tab:
- if ((e->key.state & GDK_SHIFT_MASK) != 0){
- /* shift tab */
- if (cursor_col != view_to_model_col(eti, 0))
- eti_cursor_move_left (eti);
- else if (cursor_row != view_to_model_row(eti, 0))
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row) - 1, eti->cols - 1);
- else
- return_val = FALSE;
- } else {
- if (cursor_col != view_to_model_col (eti, eti->cols - 1))
- eti_cursor_move_right (eti);
- else if (cursor_row != view_to_model_row(eti, eti->rows - 1))
- eti_cursor_move (eti, model_to_view_row(eti, cursor_row) + 1, 0);
- else
- return_val = FALSE;
- }
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_col >= 0 && cursor_row >= 0 && return_val &&
- (!eti_editing(eti)) && e_table_model_is_cell_editable(eti->selection->model, cursor_col, cursor_row)) {
- e_table_item_enter_edit (eti, model_to_view_col(eti, cursor_col), model_to_view_row(eti, cursor_row));
- }
- break;
-
- case GDK_Return:
- case GDK_KP_Enter:
- case GDK_ISO_Enter:
- case GDK_3270_Enter:
- if (eti_editing (eti)){
- e_table_item_leave_edit (eti);
-#if 0
- ecell_view = eti->cell_views [eti->editing_col];
- e_cell_event (ecell_view, e, view_to_model_col(eti, eti->editing_col), eti->editing_col, eti->editing_row);
-#endif
- }
- return_val = FALSE;
- gtk_signal_emit (GTK_OBJECT (eti), eti_signals [KEY_PRESS],
- model_to_view_row(eti, cursor_row), cursor_col, e, &return_val);
- break;
-
- default:
- handled = FALSE;
- break;
- }
- if (!handled) {
- if (!eti_editing (eti)){
- gint col, row;
- row = model_to_view_row(eti, cursor_row);
- col = model_to_view_col(eti, cursor_col);
- if (col != -1 && row != -1 && e_table_model_is_cell_editable(eti->selection->model, cursor_col, cursor_row)) {
- e_table_item_enter_edit (eti, col, row);
- }
- }
- if (!eti_editing (eti)){
- gtk_signal_emit (GTK_OBJECT (eti), eti_signals [KEY_PRESS],
- model_to_view_row(eti, cursor_row), cursor_col, e, &return_val);
- } else {
- ecell_view = eti->cell_views [eti->editing_col];
- e_cell_event (ecell_view, e, view_to_model_col(eti, eti->editing_col), eti->editing_col, eti->editing_row);
- }
- }
- break;
- }
-
- case GDK_KEY_RELEASE: {
- gint cursor_row, cursor_col;
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_row", &cursor_row,
- "cursor_col", &cursor_col,
- NULL);
-
- if (cursor_col == -1)
- return FALSE;
-
- if (eti_editing (eti)){
- ecell_view = eti->cell_views [eti->editing_col];
- e_cell_event (ecell_view, e, view_to_model_col(eti, eti->editing_col), eti->editing_col, eti->editing_row);
- }
- break;
- }
-
- default:
- return_val = FALSE;
- }
- return return_val;
-}
-
-static void
-eti_class_init (GtkObjectClass *object_class)
-{
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
- ETableItemClass *eti_class = (ETableItemClass *) object_class;
-
- eti_parent_class = gtk_type_class (PARENT_OBJECT_TYPE);
-
- object_class->destroy = eti_destroy;
- object_class->set_arg = eti_set_arg;
- object_class->get_arg = eti_get_arg;
-
- item_class->update = eti_update;
- item_class->realize = eti_realize;
- item_class->unrealize = eti_unrealize;
- item_class->draw = eti_draw;
- item_class->point = eti_point;
- item_class->event = eti_event;
-
- eti_class->cursor_change = NULL;
- eti_class->double_click = NULL;
- eti_class->right_click = NULL;
- eti_class->key_press = NULL;
-
- gtk_object_add_arg_type ("ETableItem::ETableHeader", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_HEADER);
- gtk_object_add_arg_type ("ETableItem::ETableModel", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_MODEL);
- gtk_object_add_arg_type ("ETableItem::table_selection_model", GTK_TYPE_OBJECT,
- GTK_ARG_WRITABLE, ARG_TABLE_SELECTION_MODEL);
- gtk_object_add_arg_type ("ETableItem::drawgrid", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_GRID);
- gtk_object_add_arg_type ("ETableItem::drawfocus", GTK_TYPE_BOOL,
- GTK_ARG_WRITABLE, ARG_TABLE_DRAW_FOCUS);
- gtk_object_add_arg_type ("ETableItem::cursor_mode", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_CURSOR_MODE);
- gtk_object_add_arg_type ("ETableItem::length_threshold", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
-
- gtk_object_add_arg_type ("ETableItem::minimum_width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_MINIMUM_WIDTH);
- gtk_object_add_arg_type ("ETableItem::width", GTK_TYPE_DOUBLE,
- GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("ETableItem::height", GTK_TYPE_DOUBLE,
- GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("ETableItem::cursor_row", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_CURSOR_ROW);
-
- eti_signals [CURSOR_CHANGE] =
- gtk_signal_new ("cursor_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableItemClass, cursor_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- eti_signals [DOUBLE_CLICK] =
- gtk_signal_new ("double_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableItemClass, double_click),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- eti_signals [RIGHT_CLICK] =
- gtk_signal_new ("right_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableItemClass, right_click),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- eti_signals [KEY_PRESS] =
- gtk_signal_new ("key_press",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableItemClass, key_press),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (object_class, eti_signals, LAST_SIGNAL);
-
-}
-
-GtkType
-e_table_item_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableItem",
- sizeof (ETableItem),
- sizeof (ETableItemClass),
- (GtkClassInitFunc) eti_class_init,
- (GtkObjectInitFunc) eti_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_OBJECT_TYPE, &info);
- }
-
- return type;
-}
-
-void
-e_table_item_set_cursor (ETableItem *eti, int col, int row)
-{
- e_table_item_focus(eti, col, view_to_model_row(eti, row), 0);
-}
-
-static void
-e_table_item_focus (ETableItem *eti, int col, int row, GdkModifierType state)
-{
- g_return_if_fail (eti != NULL);
- g_return_if_fail (E_IS_TABLE_ITEM (eti));
-
- if (row == -1) {
- row = view_to_model_row(eti, eti->rows - 1);
- }
-
- if (col == -1) {
- col = eti->cols - 1;
- }
-
- if (row != -1) {
- e_table_selection_model_do_something(eti->selection,
- row, col,
- state);
- }
-}
-
-gint
-e_table_item_get_focused_column (ETableItem *eti)
-{
- int cursor_col;
-
- g_return_val_if_fail (eti != NULL, -1);
- g_return_val_if_fail (E_IS_TABLE_ITEM (eti), -1);
-
- gtk_object_get(GTK_OBJECT(eti->selection),
- "cursor_col", &cursor_col,
- NULL);
-
- return cursor_col;
-}
-
-gboolean
-e_table_item_is_row_selected (ETableItem *eti, int row)
-{
- g_return_val_if_fail (eti != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_ITEM (eti), FALSE);
-
- return e_table_selection_model_is_row_selected(eti->selection, row);
-}
-
-static void
-eti_cursor_change (ETableSelectionModel *selection, int row, int col, ETableItem *eti)
-{
- int view_row = model_to_view_row(eti, row);
- int view_col = model_to_view_col(eti, col);
-
- if (view_row == -1 || view_col == -1) {
- e_table_item_leave_edit (eti);
- return;
- }
-
- eti_request_region_show (eti, view_col, view_row, view_col, view_row);
- e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(eti));
- if (eti_editing(eti))
- e_table_item_leave_edit (eti);
- gtk_signal_emit (GTK_OBJECT (eti), eti_signals [CURSOR_CHANGE],
- view_row);
- eti->needs_redraw = TRUE;
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(eti));
-}
-
-static void
-eti_selection_change (ETableSelectionModel *selection, ETableItem *eti)
-{
- eti->needs_redraw = TRUE;
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(eti));
-}
-
-void
-e_table_item_enter_edit (ETableItem *eti, int col, int row)
-{
- g_return_if_fail (eti != NULL);
- g_return_if_fail (E_IS_TABLE_ITEM (eti));
-
- if (eti_editing (eti))
- e_table_item_leave_edit(eti);
-
- eti->editing_col = col;
- eti->editing_row = row;
-
- eti->edit_ctx = e_cell_enter_edit (eti->cell_views [col], view_to_model_col(eti, col), col, row);
-}
-
-void
-e_table_item_leave_edit (ETableItem *eti)
-{
- int col, row;
- void *edit_ctx;
-
- g_return_if_fail (eti != NULL);
- g_return_if_fail (E_IS_TABLE_ITEM (eti));
-
- if (!eti_editing (eti))
- return;
-
- col = eti->editing_col;
- row = eti->editing_row;
- edit_ctx = eti->edit_ctx;
-
- eti->editing_col = -1;
- eti->editing_row = -1;
- eti->edit_ctx = NULL;
-
- e_cell_leave_edit (eti->cell_views [col],
- view_to_model_col(eti, col),
- col, row, edit_ctx);
-}
-
-void
-e_table_item_compute_location (ETableItem *eti,
- int *x,
- int *y,
- int *row,
- int *col)
-{
- if (!find_cell (eti, *x, *y, col, row, NULL, NULL)) {
- *y -= eti_get_height(eti);
- }
-
-}
-
-typedef struct {
- ETableItem *item;
- int rows_printed;
-} ETableItemPrintContext;
-
-static gdouble *
-e_table_item_calculate_print_widths (ETableHeader *eth, gdouble width)
-{
- int i;
- double extra;
- double expansion;
- int last_resizable = -1;
- gdouble scale = 300.0L / 70.0L;
- gdouble *widths = g_new(gdouble, e_table_header_count(eth));
- /* - 1 to account for the last pixel border. */
- extra = width - 1;
- expansion = 0;
- for (i = 0; i < eth->col_count; i++) {
- extra -= eth->columns[i]->min_width * scale;
- if (eth->columns[i]->resizeable && eth->columns[i]->expansion > 0)
- last_resizable = i;
- expansion += eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0;
- widths[i] = eth->columns[i]->min_width * scale;
- }
- for (i = 0; i <= last_resizable; i++) {
- widths[i] += extra * (eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0)/expansion;
- }
-
- return widths;
-}
-
-static gdouble
-eti_printed_row_height (ETableItem *eti, gdouble *widths, GnomePrintContext *context, gint row)
-{
- int col;
- int cols = eti->cols;
- gdouble height = 0;
- for (col = 0; col < cols; col++) {
- ECellView *ecell_view = eti->cell_views [col];
- gdouble this_height = e_cell_print_height (ecell_view, context, view_to_model_col(eti, col), col, row,
- widths[col] - 1);
- if (this_height > height)
- height = this_height;
- }
- return height;
-}
-
-#define CHECK(x) if((x) == -1) return -1;
-
-static gint
-gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height)
-{
- CHECK(gnome_print_moveto(context, x, y));
- CHECK(gnome_print_lineto(context, x + width, y));
- CHECK(gnome_print_lineto(context, x + width, y - height));
- CHECK(gnome_print_lineto(context, x, y - height));
- CHECK(gnome_print_lineto(context, x, y));
- return gnome_print_fill(context);
-}
-
-static void
-e_table_item_print_page (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble height,
- gboolean quantize,
- ETableItemPrintContext *itemcontext)
-{
- ETableItem *eti = itemcontext->item;
- const int rows = eti->rows;
- const int cols = eti->cols;
- int rows_printed = itemcontext->rows_printed;
- gdouble *widths;
- int row, col;
- gdouble yd = height;
-
- widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
-
- /*
- * Draw cells
- */
- if (eti->draw_grid){
- gp_draw_rect(context, 0, yd, width, 1);
- }
- yd--;
-
- for (row = rows_printed; row < rows; row++){
- gdouble xd = 1, row_height;
-
- row_height = eti_printed_row_height(eti, widths, context, row);
- if (quantize) {
- if (yd - row_height - 1 < 0 && row != rows_printed) {
- break;
- }
- } else {
- if (yd < 0) {
- break;
- }
- }
-
- for (col = 0; col < cols; col++){
- ECellView *ecell_view = eti->cell_views [col];
-
- if (gnome_print_gsave(context) == -1)
- /* FIXME */;
- if (gnome_print_translate(context, xd, yd - row_height) == -1)
- /* FIXME */;
-
- if (gnome_print_moveto(context, 0, 0) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, widths[col] - 1, 0) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, widths[col] - 1, row_height) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 0, row_height) == -1)
- /* FIXME */;
- if (gnome_print_lineto(context, 0, 0) == -1)
- /* FIXME */;
- if (gnome_print_clip(context) == -1)
- /* FIXME */;
-
- e_cell_print (ecell_view, context, view_to_model_col(eti, col), col, row,
- widths[col] - 1, row_height);
-
- if (gnome_print_grestore(context) == -1)
- /* FIXME */;
-
- xd += widths[col];
- }
- yd -= row_height;
-
- if (eti->draw_grid){
- gp_draw_rect(context, 0, yd, width, 1);
- }
- yd--;
- }
-
- itemcontext->rows_printed = row;
-
- if (eti->draw_grid){
- gdouble xd = 0;
-
- for (col = 0; col < cols; col++){
- gp_draw_rect(context, xd, height, 1, height - yd);
-
- xd += widths[col];
- }
- gp_draw_rect(context, xd, height, 1, height - yd);
- }
-
- g_free (widths);
-}
-
-static gboolean
-e_table_item_data_left (EPrintable *ep,
- ETableItemPrintContext *itemcontext)
-{
- ETableItem *item = itemcontext->item;
- int rows_printed = itemcontext->rows_printed;
-
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "data_left");
- return rows_printed < item->rows;
-}
-
-static void
-e_table_item_reset (EPrintable *ep,
- ETableItemPrintContext *itemcontext)
-{
- itemcontext->rows_printed = 0;
-}
-
-static gdouble
-e_table_item_height (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantize,
- ETableItemPrintContext *itemcontext)
-{
- ETableItem *item = itemcontext->item;
- const int rows = item->rows;
- int rows_printed = itemcontext->rows_printed;
- gdouble *widths;
- int row;
- gdouble yd = 0;
-
- widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
-
- /*
- * Draw cells
- */
- yd++;
-
- for (row = rows_printed; row < rows; row++){
- gdouble row_height;
-
- row_height = eti_printed_row_height(item, widths, context, row);
- if (quantize) {
- if (max_height != -1 && yd + row_height + 1 > max_height && row != rows_printed) {
- break;
- }
- } else {
- if (max_height != -1 && yd > max_height) {
- break;
- }
- }
-
- yd += row_height;
-
- yd++;
- }
-
- g_free (widths);
-
- if (max_height != -1 && (!quantize) && yd > max_height)
- yd = max_height;
-
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "height");
- return yd;
-}
-
-static gboolean
-e_table_item_will_fit (EPrintable *ep,
- GnomePrintContext *context,
- gdouble width,
- gdouble max_height,
- gboolean quantize,
- ETableItemPrintContext *itemcontext)
-{
- ETableItem *item = itemcontext->item;
- const int rows = item->rows;
- int rows_printed = itemcontext->rows_printed;
- gdouble *widths;
- int row;
- gdouble yd = 0;
- gboolean ret_val = TRUE;
-
- widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
-
- /*
- * Draw cells
- */
- yd++;
-
- for (row = rows_printed; row < rows; row++){
- gdouble row_height;
-
- row_height = eti_printed_row_height(item, widths, context, row);
- if (quantize) {
- if (max_height != -1 && yd + row_height + 1 > max_height && row != rows_printed) {
- ret_val = FALSE;
- break;
- }
- } else {
- if (max_height != -1 && yd > max_height) {
- ret_val = FALSE;
- break;
- }
- }
-
- yd += row_height;
-
- yd++;
- }
-
- g_free (widths);
-
- gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "will_fit");
- return ret_val;
-}
-
-static void
-e_table_item_printable_destroy (GtkObject *object,
- ETableItemPrintContext *itemcontext)
-{
- gtk_object_unref(GTK_OBJECT(itemcontext->item));
- g_free(itemcontext);
-}
-
-EPrintable *
-e_table_item_get_printable (ETableItem *item)
-{
- EPrintable *printable = e_printable_new();
- ETableItemPrintContext *itemcontext;
-
- itemcontext = g_new(ETableItemPrintContext, 1);
- itemcontext->item = item;
- gtk_object_ref(GTK_OBJECT(item));
- itemcontext->rows_printed = 0;
-
- gtk_signal_connect (GTK_OBJECT(printable),
- "print_page",
- GTK_SIGNAL_FUNC(e_table_item_print_page),
- itemcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "data_left",
- GTK_SIGNAL_FUNC(e_table_item_data_left),
- itemcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "reset",
- GTK_SIGNAL_FUNC(e_table_item_reset),
- itemcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "height",
- GTK_SIGNAL_FUNC(e_table_item_height),
- itemcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "will_fit",
- GTK_SIGNAL_FUNC(e_table_item_will_fit),
- itemcontext);
- gtk_signal_connect (GTK_OBJECT(printable),
- "destroy",
- GTK_SIGNAL_FUNC(e_table_item_printable_destroy),
- itemcontext);
-
- return printable;
-}
diff --git a/widgets/table/e-table-item.h b/widgets/table/e-table-item.h
deleted file mode 100644
index 2d81bca758..0000000000
--- a/widgets/table/e-table-item.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_ITEM_H_
-#define _E_TABLE_ITEM_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include "e-table-model.h"
-#include "e-table-header.h"
-#include "e-table-selection-model.h"
-#include "e-table-defines.h"
-#include <e-util/e-printable.h>
-
-#define E_TABLE_ITEM_TYPE (e_table_item_get_type ())
-#define E_TABLE_ITEM(o) (GTK_CHECK_CAST ((o), E_TABLE_ITEM_TYPE, ETableItem))
-#define E_TABLE_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_ITEM_TYPE, ETableItemClass))
-#define E_IS_TABLE_ITEM(o) (GTK_CHECK_TYPE ((o), E_TABLE_ITEM_TYPE))
-#define E_IS_TABLE_ITEM_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_ITEM_TYPE))
-
-/* list selection modes */
-typedef enum
-{
- E_TABLE_CURSOR_LINE,
- E_TABLE_CURSOR_SIMPLE,
-} ETableCursorMode;
-
-typedef struct {
- GnomeCanvasItem parent;
- ETableModel *table_model;
- ETableHeader *header;
-
- ETableModel *source_model;
- ETableSelectionModel *selection;
-
- int x1, y1;
- int minimum_width, width, height;
-
- int cols, rows;
-
- /*
- * Ids for the signals we connect to
- */
- int header_dim_change_id;
- int header_structure_change_id;
- int table_model_pre_change_id;
- int table_model_change_id;
- int table_model_row_change_id;
- int table_model_cell_change_id;
- int table_model_row_inserted_id;
- int table_model_row_deleted_id;
-
- int selection_change_id;
- int cursor_change_id;
-
- GdkGC *fill_gc;
- GdkGC *grid_gc;
- GdkGC *focus_gc;
- GdkBitmap *stipple;
-
- guint draw_grid:1;
- guint draw_focus:1;
- guint renderers_can_change_size:1;
- guint cell_views_realized:1;
-
- guint needs_redraw : 1;
- guint needs_compute_height : 1;
- guint needs_compute_width : 1;
-
- guint uses_source_model : 1;
-
- /*
- * Realized views, per column
- */
- ECellView **cell_views;
- int n_cells;
-
- int *height_cache;
- int height_cache_idle_id;
- int height_cache_idle_count;
-
- /*
- * Lengh Threshold: above this, we stop computing correctly
- * the size
- */
- int length_threshold;
-
- gint row_guess;
- ETableCursorMode cursor_mode;
-
- /*
- * During editing
- */
- int editing_col, editing_row;
- void *edit_ctx;
-
-} ETableItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
- void (*cursor_change) (ETableItem *eti, int row);
- void (*double_click) (ETableItem *eti, int row);
- gint (*right_click) (ETableItem *eti, int row, int col, GdkEvent *event);
- gint (*key_press) (ETableItem *eti, int row, int col, GdkEvent *event);
-} ETableItemClass;
-
-GtkType e_table_item_get_type (void);
-
-
-/*
- * Focus
- */
-void e_table_item_set_cursor (ETableItem *eti, int col, int row);
-
-gint e_table_item_get_focused_column (ETableItem *eti);
-
-/*
- * Handling the selection
- */
-gboolean e_table_item_is_row_selected (ETableItem *e_table_Item,
- int row);
-
-void e_table_item_selected_row_foreach (ETableItem *eti,
- ETableForeachFunc func,
- gpointer closure);
-
-void e_table_item_leave_edit (ETableItem *eti);
-void e_table_item_enter_edit (ETableItem *eti, int col, int row);
-
-void e_table_item_redraw_range (ETableItem *eti,
- int start_col, int start_row,
- int end_col, int end_row);
-
-EPrintable *e_table_item_get_printable (ETableItem *eti);
-void e_table_item_print_height (ETableItem *eti,
- GnomePrintContext *context,
- gdouble width);
-void e_table_item_compute_location (ETableItem *eti,
- int *x,
- int *y,
- int *row,
- int *col);
-
-
-#endif /* _E_TABLE_ITEM_H_ */
diff --git a/widgets/table/e-table-model.c b/widgets/table/e-table-model.c
deleted file mode 100644
index d9c0c4fd38..0000000000
--- a/widgets/table/e-table-model.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-model.c: a Table Model
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-model.h"
-
-#define ETM_CLASS(e) ((ETableModelClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE gtk_object_get_type ()
-
-#define d(x)
-
-d(static gint depth = 0);
-
-
-static GtkObjectClass *e_table_model_parent_class;
-
-enum {
- MODEL_CHANGED,
- MODEL_PRE_CHANGE,
- MODEL_ROW_CHANGED,
- MODEL_CELL_CHANGED,
- MODEL_ROW_INSERTED,
- MODEL_ROW_DELETED,
- ROW_SELECTION,
- LAST_SIGNAL
-};
-
-static guint e_table_model_signals [LAST_SIGNAL] = { 0, };
-
-int
-e_table_model_column_count (ETableModel *e_table_model)
-{
- g_return_val_if_fail (e_table_model != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), 0);
-
- return ETM_CLASS (e_table_model)->column_count (e_table_model);
-}
-
-
-int
-e_table_model_row_count (ETableModel *e_table_model)
-{
- g_return_val_if_fail (e_table_model != NULL, 0);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), 0);
-
- return ETM_CLASS (e_table_model)->row_count (e_table_model);
-}
-
-void *
-e_table_model_value_at (ETableModel *e_table_model, int col, int row)
-{
- g_return_val_if_fail (e_table_model != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
- return ETM_CLASS (e_table_model)->value_at (e_table_model, col, row);
-}
-
-void
-e_table_model_set_value_at (ETableModel *e_table_model, int col, int row, const void *data)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- ETM_CLASS (e_table_model)->set_value_at (e_table_model, col, row, data);
-}
-
-gboolean
-e_table_model_is_cell_editable (ETableModel *e_table_model, int col, int row)
-{
- g_return_val_if_fail (e_table_model != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
-
- return ETM_CLASS (e_table_model)->is_cell_editable (e_table_model, col, row);
-}
-
-void
-e_table_model_append_row (ETableModel *e_table_model, ETableModel *source, int row)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- if (ETM_CLASS (e_table_model)->append_row)
- ETM_CLASS (e_table_model)->append_row (e_table_model, source, row);
-}
-
-void *
-e_table_model_duplicate_value (ETableModel *e_table_model, int col, const void *value)
-{
- g_return_val_if_fail (e_table_model != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
- if (ETM_CLASS (e_table_model)->duplicate_value)
- return ETM_CLASS (e_table_model)->duplicate_value (e_table_model, col, value);
- else
- return NULL;
-}
-
-void
-e_table_model_free_value (ETableModel *e_table_model, int col, void *value)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- if (ETM_CLASS (e_table_model)->free_value)
- ETM_CLASS (e_table_model)->free_value (e_table_model, col, value);
-}
-
-void *
-e_table_model_initialize_value (ETableModel *e_table_model, int col)
-{
- g_return_val_if_fail (e_table_model != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
- if (ETM_CLASS (e_table_model)->initialize_value)
- return ETM_CLASS (e_table_model)->initialize_value (e_table_model, col);
- else
- return NULL;
-}
-
-gboolean
-e_table_model_value_is_empty (ETableModel *e_table_model, int col, const void *value)
-{
- g_return_val_if_fail (e_table_model != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
-
- if (ETM_CLASS (e_table_model)->value_is_empty)
- return ETM_CLASS (e_table_model)->value_is_empty (e_table_model, col, value);
- else
- return FALSE;
-}
-
-char *
-e_table_model_value_to_string (ETableModel *e_table_model, int col, const void *value)
-{
- g_return_val_if_fail (e_table_model != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
- if (ETM_CLASS (e_table_model)->value_to_string)
- return ETM_CLASS (e_table_model)->value_to_string (e_table_model, col, value);
- else
- return g_strdup("");
-}
-
-static void
-e_table_model_destroy (GtkObject *object)
-{
- if (e_table_model_parent_class->destroy)
- (*e_table_model_parent_class->destroy)(object);
-}
-
-static void
-e_table_model_class_init (GtkObjectClass *object_class)
-{
- ETableModelClass *klass = E_TABLE_MODEL_CLASS(object_class);
- e_table_model_parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = e_table_model_destroy;
-
- e_table_model_signals [MODEL_CHANGED] =
- gtk_signal_new ("model_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- e_table_model_signals [MODEL_PRE_CHANGE] =
- gtk_signal_new ("model_pre_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_pre_change),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- e_table_model_signals [MODEL_ROW_CHANGED] =
- gtk_signal_new ("model_row_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_row_changed),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- e_table_model_signals [MODEL_CELL_CHANGED] =
- gtk_signal_new ("model_cell_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_cell_changed),
- gtk_marshal_NONE__INT_INT,
- GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT);
-
- e_table_model_signals [MODEL_ROW_INSERTED] =
- gtk_signal_new ("model_row_inserted",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_row_inserted),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- e_table_model_signals [MODEL_ROW_DELETED] =
- gtk_signal_new ("model_row_deleted",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableModelClass, model_row_deleted),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- gtk_object_class_add_signals (object_class, e_table_model_signals, LAST_SIGNAL);
-
- klass->column_count = NULL;
- klass->row_count = NULL;
- klass->value_at = NULL;
- klass->set_value_at = NULL;
- klass->is_cell_editable = NULL;
- klass->append_row = NULL;
-
- klass->duplicate_value = NULL;
- klass->free_value = NULL;
- klass->initialize_value = NULL;
- klass->value_is_empty = NULL;
- klass->value_to_string = NULL;
- klass->model_changed = NULL;
- klass->model_row_changed = NULL;
- klass->model_cell_changed = NULL;
- klass->model_row_inserted = NULL;
- klass->model_row_deleted = NULL;
-}
-
-
-guint
-e_table_model_get_type (void)
-{
- static guint type = 0;
-
- if (!type)
- {
- GtkTypeInfo info =
- {
- "ETableModel",
- sizeof (ETableModel),
- sizeof (ETableModelClass),
- (GtkClassInitFunc) e_table_model_class_init,
- NULL,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-#if d(!)0
-static void
-print_tabs (void)
-{
- int i;
- for (i = 0; i < depth; i++)
- g_print("\t");
-}
-#endif
-
-void
-e_table_model_pre_change (ETableModel *e_table_model)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting pre_change on model 0x%p.\n", e_table_model));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_PRE_CHANGE]);
- d(depth--);
-}
-
-void
-e_table_model_changed (ETableModel *e_table_model)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting model_changed on model 0x%p.\n", e_table_model));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_CHANGED]);
- d(depth--);
-}
-
-void
-e_table_model_row_changed (ETableModel *e_table_model, int row)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting row_changed on model 0x%p, row %d.\n", e_table_model, row));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_ROW_CHANGED], row);
- d(depth--);
-}
-
-void
-e_table_model_cell_changed (ETableModel *e_table_model, int col, int row)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting cell_changed on model 0x%p, row %d, col %d.\n", e_table_model, row, col));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_CELL_CHANGED], col, row);
- d(depth--);
-}
-
-void
-e_table_model_row_inserted (ETableModel *e_table_model, int row)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting row_inserted on model 0x%p, row %d.\n", e_table_model, row));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_ROW_INSERTED], row);
- d(depth--);
-}
-
-void
-e_table_model_row_deleted (ETableModel *e_table_model, int row)
-{
- g_return_if_fail (e_table_model != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
- d(print_tabs());
- d(g_print("Emitting row_deleted on model 0x%p, row %d.\n", e_table_model, row));
- d(depth++);
- gtk_signal_emit (GTK_OBJECT (e_table_model),
- e_table_model_signals [MODEL_ROW_DELETED], row);
- d(depth--);
-}
diff --git a/widgets/table/e-table-model.h b/widgets/table/e-table-model.h
deleted file mode 100644
index d4fae1659e..0000000000
--- a/widgets/table/e-table-model.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_MODEL_H_
-#define _E_TABLE_MODEL_H_
-
-#include <gtk/gtkobject.h>
-
-#define E_TABLE_MODEL_TYPE (e_table_model_get_type ())
-#define E_TABLE_MODEL(o) (GTK_CHECK_CAST ((o), E_TABLE_MODEL_TYPE, ETableModel))
-#define E_TABLE_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_MODEL_TYPE, ETableModelClass))
-#define E_IS_TABLE_MODEL(o) (GTK_CHECK_TYPE ((o), E_TABLE_MODEL_TYPE))
-#define E_IS_TABLE_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_MODEL_TYPE))
-
-typedef struct {
- GtkObject base;
-} ETableModel;
-
-typedef struct {
- GtkObjectClass parent_class;
-
- /*
- * Virtual methods
- */
- int (*column_count) (ETableModel *etm);
- int (*row_count) (ETableModel *etm);
- void *(*value_at) (ETableModel *etm, int col, int row);
- void (*set_value_at) (ETableModel *etm, int col, int row, const void *value);
- gboolean (*is_cell_editable) (ETableModel *etm, int col, int row);
- void (*append_row) (ETableModel *etm, ETableModel *source, int row);
-
- /* Allocate a copy of the given value. */
- void *(*duplicate_value) (ETableModel *etm, int col, const void *value);
- /* Free an allocated value. */
- void (*free_value) (ETableModel *etm, int col, void *value);
- /* Return an allocated empty value. */
- void *(*initialize_value) (ETableModel *etm, int col);
- /* Return TRUE if value is equivalent to an empty cell. */
- gboolean (*value_is_empty) (ETableModel *etm, int col, const void *value);
- /* Return an allocated string. */
- char *(*value_to_string) (ETableModel *etm, int col, const void *value);
-
- /*
- * Signals
- */
-
- /*
- * These all come after the change has been made.
- * Major structural changes: model_changed
- * Changes only in a row: row_changed
- * Only changes in a cell: cell_changed
- * A row inserted: row_inserted
- * A row deleted: row_deleted
- */
- void (*model_pre_change) (ETableModel *etm);
-
- void (*model_changed) (ETableModel *etm);
- void (*model_row_changed) (ETableModel *etm, int row);
- void (*model_cell_changed) (ETableModel *etm, int col, int row);
- void (*model_row_inserted) (ETableModel *etm, int row);
- void (*model_row_deleted) (ETableModel *etm, int row);
-} ETableModelClass;
-
-GtkType e_table_model_get_type (void);
-
-int e_table_model_column_count (ETableModel *e_table_model);
-const char *e_table_model_column_name (ETableModel *e_table_model, int col);
-int e_table_model_row_count (ETableModel *e_table_model);
-void *e_table_model_value_at (ETableModel *e_table_model, int col, int row);
-void e_table_model_set_value_at (ETableModel *e_table_model, int col, int row, const void *value);
-gboolean e_table_model_is_cell_editable (ETableModel *e_table_model, int col, int row);
-void e_table_model_append_row (ETableModel *e_table_model, ETableModel *source, int row);
-
-void *e_table_model_duplicate_value (ETableModel *e_table_model, int col, const void *value);
-void e_table_model_free_value (ETableModel *e_table_model, int col, void *value);
-void *e_table_model_initialize_value (ETableModel *e_table_model, int col);
-gboolean e_table_model_value_is_empty (ETableModel *e_table_model, int col, const void *value);
-char *e_table_model_value_to_string (ETableModel *e_table_model, int col, const void *value);
-
-/*
- * Routines for emitting signals on the e_table
- */
-void e_table_model_pre_change (ETableModel *e_table_model);
-void e_table_model_changed (ETableModel *e_table_model);
-void e_table_model_row_changed (ETableModel *e_table_model, int row);
-void e_table_model_cell_changed (ETableModel *e_table_model, int col, int row);
-void e_table_model_row_inserted (ETableModel *e_table_model, int row);
-void e_table_model_row_deleted (ETableModel *e_table_model, int row);
-
-#endif /* _E_TABLE_MODEL_H_ */
diff --git a/widgets/table/e-table-one.c b/widgets/table/e-table-one.c
deleted file mode 100644
index 40c24517f8..0000000000
--- a/widgets/table/e-table-one.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-model.c: a one table model implementation that uses function
- * pointers to simplify the creation of new, exotic and colorful tables in
- * no time.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-
-#include <config.h>
-#include "e-table-one.h"
-
-#define PARENT_TYPE e_table_model_get_type ()
-
-static int
-one_column_count (ETableModel *etm)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_column_count(one->source);
- else
- return 0;
-}
-
-static int
-one_row_count (ETableModel *etm)
-{
- return 1;
-}
-
-static void *
-one_value_at (ETableModel *etm, int col, int row)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->data)
- return one->data[col];
- else
- return NULL;
-}
-
-static void
-one_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->data && one->source) {
- e_table_model_free_value(one->source, col, one->data[col]);
- one->data[col] = e_table_model_duplicate_value(one->source, col, val);
- }
-}
-
-static gboolean
-one_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_is_cell_editable(one->source, 0, row);
- else
- return FALSE;
-}
-
-/* The default for one_duplicate_value is to return the raw value. */
-static void *
-one_duplicate_value (ETableModel *etm, int col, const void *value)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_duplicate_value(one->source, col, value);
- else
- return (void *)value;
-}
-
-static void
-one_free_value (ETableModel *etm, int col, void *value)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- e_table_model_free_value(one->source, col, value);
-}
-
-static void *
-one_initialize_value (ETableModel *etm, int col)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_initialize_value (one->source, col);
- else
- return NULL;
-}
-
-static gboolean
-one_value_is_empty (ETableModel *etm, int col, const void *value)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_value_is_empty (one->source, col, value);
- else
- return FALSE;
-}
-
-static char *
-one_value_to_string (ETableModel *etm, int col, const void *value)
-{
- ETableOne *one = E_TABLE_ONE(etm);
-
- if (one->source)
- return e_table_model_value_to_string (one->source, col, value);
- else
- return g_strdup("");
-}
-
-static void
-one_destroy (GtkObject *object)
-{
- ETableOne *one = E_TABLE_ONE(object);
-
- if (one->source) {
- int i;
- int col_count;
-
- col_count = e_table_model_column_count(one->source);
-
- if (one->data) {
- for (i = 0; i < col_count; i++) {
- e_table_model_free_value(one->source, i, one->data[i]);
- }
- }
-
- gtk_object_unref(GTK_OBJECT(one->source));
- }
-
- g_free(one->data);
-}
-
-static void
-e_table_one_class_init (GtkObjectClass *object_class)
-{
- ETableModelClass *model_class = (ETableModelClass *) object_class;
-
- model_class->column_count = one_column_count;
- model_class->row_count = one_row_count;
- model_class->value_at = one_value_at;
- model_class->set_value_at = one_set_value_at;
- model_class->is_cell_editable = one_is_cell_editable;
- model_class->duplicate_value = one_duplicate_value;
- model_class->free_value = one_free_value;
- model_class->initialize_value = one_initialize_value;
- model_class->value_is_empty = one_value_is_empty;
- model_class->value_to_string = one_value_to_string;
-
- object_class->destroy = one_destroy;
-}
-
-static void
-e_table_one_init (GtkObject *object)
-{
- ETableOne *one = E_TABLE_ONE(object);
-
- one->source = NULL;
- one->data = NULL;
-}
-
-GtkType
-e_table_one_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableOne",
- sizeof (ETableOne),
- sizeof (ETableOneClass),
- (GtkClassInitFunc) e_table_one_class_init,
- (GtkObjectInitFunc) e_table_one_init,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-ETableModel *
-e_table_one_new (ETableModel *source)
-{
- ETableOne *eto;
- int col_count;
- int i;
-
- eto = gtk_type_new (e_table_one_get_type ());
-
- eto->source = source;
-
- col_count = e_table_model_column_count(source);
- eto->data = g_new(void *, col_count);
- for (i = 0; i < col_count; i++) {
- eto->data[i] = e_table_model_initialize_value(source, i);
- }
-
- if (source)
- gtk_object_ref(GTK_OBJECT(source));
-
- return (ETableModel *) eto;
-}
-
-void
-e_table_one_commit (ETableOne *one)
-{
- if (one->source) {
- int empty = TRUE;
- int col;
- int cols = e_table_model_column_count(one->source);
- for (col = 0; col < cols; col++) {
- if (!e_table_model_value_is_empty(one->source, col, one->data[col])) {
- empty = FALSE;
- break;
- }
- }
- if (!empty) {
- e_table_model_append_row(one->source, E_TABLE_MODEL(one), 0);
- }
- }
-}
diff --git a/widgets/table/e-table-one.h b/widgets/table/e-table-one.h
deleted file mode 100644
index c6958cee3a..0000000000
--- a/widgets/table/e-table-one.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_ONE_H_
-#define _E_TABLE_ONE_H_
-
-#include "e-table-model.h"
-
-#define E_TABLE_ONE_TYPE (e_table_one_get_type ())
-#define E_TABLE_ONE(o) (GTK_CHECK_CAST ((o), E_TABLE_ONE_TYPE, ETableOne))
-#define E_TABLE_ONE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_ONE_TYPE, ETableOneClass))
-#define E_IS_TABLE_ONE(o) (GTK_CHECK_TYPE ((o), E_TABLE_ONE_TYPE))
-#define E_IS_TABLE_ONE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_ONE_TYPE))
-
-typedef struct {
- ETableModel parent;
-
- ETableModel *source;
- void **data;
-} ETableOne;
-
-typedef struct {
- ETableModelClass parent_class;
-} ETableOneClass;
-
-GtkType e_table_one_get_type (void);
-
-ETableModel *e_table_one_new (ETableModel *source);
-void e_table_one_commit (ETableOne *one);
-
-#endif /* _E_TABLE_ONE_H_ */
-
diff --git a/widgets/table/e-table-scrolled.c b/widgets/table/e-table-scrolled.c
deleted file mode 100644
index f70ca5320a..0000000000
--- a/widgets/table/e-table-scrolled.c
+++ /dev/null
@@ -1,341 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-scrolled.c: A graphical view of a Table.
- *
- * Author:
- * Chris Lahey <clahey@helixcode.com>
- * Miguel de Icaza (miguel@helixcode.com)
- *
- * Copyright 2000, 1999, Helix Code, Inc
- */
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdio.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <gtk/gtksignal.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include "e-table.h"
-#include "e-table-scrolled.h"
-
-#define COLUMN_HEADER_HEIGHT 16
-
-#define PARENT_TYPE e_scroll_frame_get_type ()
-
-static GtkObjectClass *parent_class;
-
-enum {
- CURSOR_CHANGE,
- DOUBLE_CLICK,
- RIGHT_CLICK,
- KEY_PRESS,
- LAST_SIGNAL
-};
-
-enum {
- ARG_0,
- ARG_TABLE_DRAW_GRID,
- ARG_TABLE_DRAW_FOCUS,
- ARG_CURSOR_MODE,
- ARG_LENGTH_THRESHOLD,
- ARG_CLICK_TO_ADD_MESSAGE,
-};
-
-static gint ets_signals [LAST_SIGNAL] = { 0, };
-
-static void
-cursor_change_proxy (ETable *et, int row, ETableScrolled *ets)
-{
- gtk_signal_emit (GTK_OBJECT (ets),
- ets_signals [CURSOR_CHANGE],
- row);
-}
-
-static void
-double_click_proxy (ETable *et, int row, ETableScrolled *ets)
-{
- gtk_signal_emit (GTK_OBJECT (ets),
- ets_signals [DOUBLE_CLICK],
- row);
-}
-
-static gint
-right_click_proxy (ETable *et, int row, int col, GdkEvent *event, ETableScrolled *ets)
-{
- int return_val = 0;
- gtk_signal_emit (GTK_OBJECT (ets),
- ets_signals [RIGHT_CLICK],
- row, col, event, &return_val);
- return return_val;
-}
-
-static gint
-key_press_proxy (ETable *et, int row, int col, GdkEvent *event, ETableScrolled *ets)
-{
- int return_val;
- gtk_signal_emit (GTK_OBJECT (ets),
- ets_signals [KEY_PRESS],
- row, col, event, &return_val);
- return return_val;
-}
-
-static void
-e_table_scrolled_init (GtkObject *object)
-{
- ETableScrolled *ets;
- EScrollFrame *scroll_frame;
-
- ets = E_TABLE_SCROLLED (object);
- scroll_frame = E_SCROLL_FRAME (object);
-
- ets->table = gtk_type_new(e_table_get_type());
-
- e_scroll_frame_set_policy (scroll_frame, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- e_scroll_frame_set_shadow_type (scroll_frame, GTK_SHADOW_IN);
-}
-
-static void
-e_table_scrolled_real_construct (ETableScrolled *ets)
-{
- gtk_object_set(GTK_OBJECT(ets),
- "shadow_type", GTK_SHADOW_IN,
- "hscrollbar_policy", GTK_POLICY_NEVER,
- "vscrollbar_policy", GTK_POLICY_AUTOMATIC,
- NULL);
-
- gtk_container_add(GTK_CONTAINER(ets), GTK_WIDGET(ets->table));
-
- gtk_signal_connect(GTK_OBJECT(ets->table), "cursor_change",
- GTK_SIGNAL_FUNC(cursor_change_proxy), ets);
- gtk_signal_connect(GTK_OBJECT(ets->table), "double_click",
- GTK_SIGNAL_FUNC(double_click_proxy), ets);
- gtk_signal_connect(GTK_OBJECT(ets->table), "right_click",
- GTK_SIGNAL_FUNC(right_click_proxy), ets);
- gtk_signal_connect(GTK_OBJECT(ets->table), "key_press",
- GTK_SIGNAL_FUNC(key_press_proxy), ets);
-
- gtk_widget_show(GTK_WIDGET(ets->table));
-}
-
-ETableScrolled *
-e_table_scrolled_construct (ETableScrolled *ets, ETableHeader *full_header,
- ETableModel *etm, const char *spec)
-{
- e_table_construct(ets->table, full_header, etm, spec);
-
- e_table_scrolled_real_construct(ets);
-
- return ets;
-}
-
-ETableScrolled *
-e_table_scrolled_construct_from_spec_file (ETableScrolled *ets, ETableHeader *full_header, ETableModel *etm,
- const char *filename)
-{
- e_table_construct_from_spec_file(ets->table, full_header, etm, filename);
-
- e_table_scrolled_real_construct(ets);
-
- return ets;
-}
-
-GtkWidget *
-e_table_scrolled_new (ETableHeader *full_header, ETableModel *etm, const char *spec)
-{
- ETableScrolled *ets;
-
- ets = E_TABLE_SCROLLED (gtk_widget_new (e_table_scrolled_get_type (),
- "hadjustment", NULL,
- "vadjustment", NULL,
- NULL));
-
- ets = e_table_scrolled_construct (ets, full_header, etm, spec);
-
- return GTK_WIDGET (ets);
-}
-
-GtkWidget *
-e_table_scrolled_new_from_spec_file (ETableHeader *full_header, ETableModel *etm, const char *filename)
-{
- ETableScrolled *ets;
-
- ets = gtk_type_new (e_table_scrolled_get_type ());
-
- ets = e_table_scrolled_construct_from_spec_file (ets, full_header, etm, filename);
-
- return GTK_WIDGET (ets);
-}
-
-gchar *
-e_table_scrolled_get_specification (ETableScrolled *ets)
-{
- return e_table_get_specification(ets->table);
-}
-
-void
-e_table_scrolled_save_specification (ETableScrolled *ets, gchar *filename)
-{
- e_table_save_specification(ets->table, filename);
-}
-
-void
-e_table_scrolled_set_cursor_row (ETableScrolled *ets, int row)
-{
- e_table_set_cursor_row(ets->table, row);
-}
-
-int
-e_table_scrolled_get_cursor_row (ETableScrolled *ets)
-{
- return e_table_get_cursor_row(ets->table);
-}
-
-void
-e_table_scrolled_selected_row_foreach (ETableScrolled *ets,
- ETableForeachFunc callback,
- gpointer closure)
-{
- e_table_selected_row_foreach(ets->table,
- callback,
- closure);
-}
-
-EPrintable *
-e_table_scrolled_get_printable (ETableScrolled *ets)
-{
- return e_table_get_printable(ets->table);
-}
-
-static void
-ets_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableScrolled *ets = E_TABLE_SCROLLED (o);
- gboolean bool_val;
- gchar *string_val;
-
- switch (arg_id){
- case ARG_TABLE_DRAW_GRID:
- gtk_object_get(GTK_OBJECT(ets->table),
- "drawgrid", &bool_val,
- NULL);
- GTK_VALUE_BOOL (*arg) = bool_val;
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- gtk_object_get(GTK_OBJECT(ets->table),
- "drawfocus", &bool_val,
- NULL);
- GTK_VALUE_BOOL (*arg) = bool_val;
- break;
-
- case ARG_CLICK_TO_ADD_MESSAGE:
- gtk_object_get(GTK_OBJECT(ets->table),
- "click_to_add_message", &string_val,
- NULL);
- GTK_VALUE_STRING (*arg) = string_val;
- break;
- }
-}
-
-static void
-ets_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableScrolled *ets = E_TABLE_SCROLLED (o);
-
- switch (arg_id){
- case ARG_LENGTH_THRESHOLD:
- gtk_object_set(GTK_OBJECT(ets->table),
- "length_threshold", GTK_VALUE_INT (*arg),
- NULL);
- break;
-
- case ARG_TABLE_DRAW_GRID:
- gtk_object_set(GTK_OBJECT(ets->table),
- "drawgrid", GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- gtk_object_set(GTK_OBJECT(ets->table),
- "drawfocus", GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_CURSOR_MODE:
- gtk_object_set(GTK_OBJECT(ets->table),
- "cursor_mode", GTK_VALUE_INT (*arg),
- NULL);
- break;
- case ARG_CLICK_TO_ADD_MESSAGE:
- gtk_object_set(GTK_OBJECT(ets->table),
- "click_to_add_message", GTK_VALUE_STRING (*arg),
- NULL);
- break;
- }
-}
-
-static void
-e_table_scrolled_class_init (GtkObjectClass *object_class)
-{
- ETableScrolledClass *klass = E_TABLE_SCROLLED_CLASS(object_class);
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->set_arg = ets_set_arg;
- object_class->get_arg = ets_get_arg;
-
- klass->cursor_change = NULL;
- klass->double_click = NULL;
- klass->right_click = NULL;
- klass->key_press = NULL;
-
- ets_signals [CURSOR_CHANGE] =
- gtk_signal_new ("cursor_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableScrolledClass, cursor_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- ets_signals [DOUBLE_CLICK] =
- gtk_signal_new ("double_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableScrolledClass, double_click),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- ets_signals [RIGHT_CLICK] =
- gtk_signal_new ("right_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableScrolledClass, right_click),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- ets_signals [KEY_PRESS] =
- gtk_signal_new ("key_press",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableScrolledClass, key_press),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (object_class, ets_signals, LAST_SIGNAL);
-
- gtk_object_add_arg_type ("ETableScrolled::drawgrid", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_TABLE_DRAW_GRID);
- gtk_object_add_arg_type ("ETableScrolled::drawfocus", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_TABLE_DRAW_FOCUS);
- gtk_object_add_arg_type ("ETableScrolled::cursor_mode", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_CURSOR_MODE);
- gtk_object_add_arg_type ("ETableScrolled::length_threshold", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
- gtk_object_add_arg_type ("ETableScrolled::click_to_add_message", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_CLICK_TO_ADD_MESSAGE);
-}
-
-E_MAKE_TYPE(e_table_scrolled, "ETableScrolled", ETableScrolled, e_table_scrolled_class_init, e_table_scrolled_init, PARENT_TYPE);
-
diff --git a/widgets/table/e-table-scrolled.h b/widgets/table/e-table-scrolled.h
deleted file mode 100644
index d5a0c06a58..0000000000
--- a/widgets/table/e-table-scrolled.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SCROLLED_H_
-#define _E_TABLE_SCROLLED_H_
-
-#include "widgets/misc/e-scroll-frame.h"
-#include "e-table-model.h"
-#include "e-table-header.h"
-#include "e-table.h"
-#include "e-util/e-printable.h"
-
-BEGIN_GNOME_DECLS
-
-#define E_TABLE_SCROLLED_TYPE (e_table_scrolled_get_type ())
-#define E_TABLE_SCROLLED(o) (GTK_CHECK_CAST ((o), E_TABLE_SCROLLED_TYPE, ETableScrolled))
-#define E_TABLE_SCROLLED_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SCROLLED_TYPE, ETableScrolledClass))
-#define E_IS_SCROLLED_TABLE(o) (GTK_CHECK_TYPE ((o), E_TABLE_SCROLLED_TYPE))
-#define E_IS_SCROLLED_TABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SCROLLED_TYPE))
-
-typedef struct {
- EScrollFrame parent;
-
- ETable *table;
-} ETableScrolled;
-
-typedef struct {
- EScrollFrameClass parent_class;
-
- void (*cursor_change) (ETableScrolled *est, int row);
- void (*double_click) (ETableScrolled *est, int row);
- gint (*right_click) (ETableScrolled *est, int row, int col, GdkEvent *event);
- gint (*key_press) (ETableScrolled *est, int row, int col, GdkEvent *event);
-} ETableScrolledClass;
-
-GtkType e_table_scrolled_get_type (void);
-
-ETableScrolled *e_table_scrolled_construct (ETableScrolled *ets, ETableHeader *full_header, ETableModel *etm,
- const char *spec);
-GtkWidget *e_table_scrolled_new (ETableHeader *full_header, ETableModel *etm,
- const char *spec);
-
-ETableScrolled *e_table_scrolled_construct_from_spec_file (ETableScrolled *e_table_scrolled,
- ETableHeader *full_header,
- ETableModel *etm,
- const char *filename);
-GtkWidget *e_table_scrolled_new_from_spec_file (ETableHeader *full_header,
- ETableModel *etm,
- const char *filename);
-
-gchar *e_table_scrolled_get_specification (ETableScrolled *e_table_scrolled);
-void e_table_scrolled_save_specification (ETableScrolled *e_table_scrolled, gchar *filename);
-
-void e_table_scrolled_set_cursor_row (ETableScrolled *e_table_scrolled,
- int row);
-/* -1 means we don't have the cursor. */
-int e_table_scrolled_get_cursor_row (ETableScrolled *e_table_scrolled);
-void e_table_scrolled_selected_row_foreach (ETableScrolled *e_table_scrolled,
- ETableForeachFunc callback,
- gpointer closure);
-EPrintable *e_table_scrolled_get_printable (ETableScrolled *e_table_scrolled);
-
-END_GNOME_DECLS
-
-#endif /* _E_TABLE_SCROLLED_H_ */
-
diff --git a/widgets/table/e-table-selection-model.c b/widgets/table/e-table-selection-model.c
deleted file mode 100644
index 9079ce8623..0000000000
--- a/widgets/table/e-table-selection-model.c
+++ /dev/null
@@ -1,500 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-selection-model.c: a Table Selection Model
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-selection-model.h"
-#include "e-util/e-util.h"
-
-#define ETSM_CLASS(e) ((ETableSelectionModelClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE gtk_object_get_type ()
-
-#define ONES ((guint32) 0xffffffff)
-
-#define BOX(n) ((n) / 32)
-#define OFFSET(n) (31 - ((n) % 32))
-#define BITMASK(n) ((guint32)(((guint32) 0x1) << OFFSET(n)))
-#define BITMASK_LEFT(n) ((guint32)(((guint32) ONES) << (32 - ((n) % 32))))
-#define BITMASK_RIGHT(n) ((guint32)(((guint32) ONES) >> ((n) % 32)))
-
-static GtkObjectClass *e_table_selection_model_parent_class;
-
-enum {
- CURSOR_CHANGED,
- SELECTION_CHANGED,
- LAST_SIGNAL
-};
-
-static guint e_table_selection_model_signals [LAST_SIGNAL] = { 0, };
-
-enum {
- ARG_0,
- ARG_MODEL,
- ARG_SORTER,
- ARG_CURSOR_ROW,
- ARG_CURSOR_COL,
-};
-
-static void
-model_changed(ETableModel *etm, ETableSelectionModel *etsm)
-{
- e_table_selection_model_clear(etsm);
-}
-
-#if 0
-static void
-model_row_inserted(ETableModel *etm, int row, ETableSelectionModel *etsm)
-{
- int box;
- int i;
- if(etsm->row_count >= 0) {
- /* Add another word if needed. */
- if ((etsm->row_count & 0x1f) == 0) {
- etsm->selection = g_renew(etsm->selection, gint, (etsm->row_count >> 5) + 1);
- etsm->selection[etsm->row_count >> 5] = 0;
- }
-
- /* The box is the word that our row is in. */
- box = BOX(row);
- /* Shift all words to the right of our box right one bit. */
- for (i = etsm->row_count >> 5; i > box; i--) {
- etsm->selection[i] = (etsm->selection[i] >> 1) | (etsm->selection[i - 1] << 31);
- }
-
- /* Shift right half of box one bit to the right. */
- etsm->selection[box] = (etsm->selection[box] & BITMASK_LEFT(row)) | ((etsm->selection[box] & BITMASK_RIGHT(row)) >> 1);
- etsm->row_count ++;
- }
-}
-
-static void
-model_row_deleted(ETableModel *etm, int row, ETableSelectionModel *etsm)
-{
- int box;
- int i;
- int last;
- if(etsm->row_count >= 0) {
- guint32 bitmask;
- box = row >> 5;
- last = etsm->row_count >> 5;
-
- /* Build bitmasks for the left and right half of the box */
- bitmask = BITMASK_RIGHT(row) >> 1;
- /* Shift right half of box one bit to the left. */
- etsm->selection[box] = (etsm->selection[box] & BITMASK_LEFT(row))| ((etsm->selection[box] & bitmask) << 1);
-
- /* Shift all words to the right of our box left one bit. */
- if (box < last) {
- etsm->selection[box] &= etsm->selection[box + 1] >> 31;
-
- for (i = box + 1; i < last; i++) {
- etsm->selection[i] = (etsm->selection[i] << 1) | (etsm->selection[i + 1] >> 31);
- }
- etsm->selection[i] = etsm->selection[i] << 1;
- }
- etsm->row_count --;
- /* Remove the last word if not needed. */
- if ((etsm->row_count & 0x1f) == 0) {
- etsm->selection = g_renew(etsm->selection, gint, etsm->row_count >> 5);
- }
- }
-}
-
-#else
-
-static void
-model_row_inserted(ETableModel *etm, int row, ETableSelectionModel *etsm)
-{
- model_changed(etm, etsm);
-}
-
-static void
-model_row_deleted(ETableModel *etm, int row, ETableSelectionModel *etsm)
-{
- model_changed(etm, etsm);
-}
-#endif
-
-inline static void
-add_model(ETableSelectionModel *etsm, ETableModel *model)
-{
- etsm->model = model;
- if (model) {
- gtk_object_ref(GTK_OBJECT(model));
- etsm->model_changed_id = gtk_signal_connect(GTK_OBJECT(model), "model_changed",
- GTK_SIGNAL_FUNC(model_changed), etsm);
- etsm->model_row_inserted_id = gtk_signal_connect(GTK_OBJECT(model), "model_row_inserted",
- GTK_SIGNAL_FUNC(model_row_inserted), etsm);
- etsm->model_row_deleted_id = gtk_signal_connect(GTK_OBJECT(model), "model_row_deleted",
- GTK_SIGNAL_FUNC(model_row_deleted), etsm);
- }
-}
-
-inline static void
-drop_model(ETableSelectionModel *etsm)
-{
- if (etsm->model) {
- gtk_signal_disconnect(GTK_OBJECT(etsm->model),
- etsm->model_changed_id);
- gtk_signal_disconnect(GTK_OBJECT(etsm->model),
- etsm->model_row_inserted_id);
- gtk_signal_disconnect(GTK_OBJECT(etsm->model),
- etsm->model_row_deleted_id);
- gtk_object_unref(GTK_OBJECT(etsm->model));
- }
- etsm->model = NULL;
-}
-
-inline static void
-add_sorter(ETableSelectionModel *etsm, ETableSorter *sorter)
-{
- etsm->sorter = sorter;
- if (sorter) {
- gtk_object_ref(GTK_OBJECT(sorter));
- }
-}
-
-inline static void
-drop_sorter(ETableSelectionModel *etsm)
-{
- if (etsm->sorter) {
- gtk_object_unref(GTK_OBJECT(etsm->sorter));
- }
- etsm->sorter = NULL;
-}
-
-static void
-etsm_destroy (GtkObject *object)
-{
- ETableSelectionModel *etsm;
-
- etsm = E_TABLE_SELECTION_MODEL (object);
-
- drop_model(etsm);
- drop_sorter(etsm);
-
- g_free(etsm->selection);
-}
-
-static void
-etsm_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableSelectionModel *etsm = E_TABLE_SELECTION_MODEL (o);
-
- switch (arg_id){
- case ARG_MODEL:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etsm->model);
- break;
-
- case ARG_SORTER:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(etsm->sorter);
- break;
-
- case ARG_CURSOR_ROW:
- GTK_VALUE_INT(*arg) = etsm->cursor_row;
- break;
-
- case ARG_CURSOR_COL:
- GTK_VALUE_INT(*arg) = etsm->cursor_col;
- break;
- }
-}
-
-static void
-etsm_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableSelectionModel *etsm = E_TABLE_SELECTION_MODEL (o);
-
- switch (arg_id){
- case ARG_MODEL:
- drop_model(etsm);
- add_model(etsm, GTK_VALUE_OBJECT (*arg) ? E_TABLE_MODEL(GTK_VALUE_OBJECT (*arg)) : NULL);
- break;
-
- case ARG_SORTER:
- drop_sorter(etsm);
- add_sorter(etsm, GTK_VALUE_OBJECT (*arg) ? E_TABLE_SORTER(GTK_VALUE_OBJECT (*arg)) : NULL);
- break;
-
- case ARG_CURSOR_ROW:
- e_table_selection_model_do_something(etsm, GTK_VALUE_INT(*arg), etsm->cursor_col, 0);
- break;
-
- case ARG_CURSOR_COL:
- e_table_selection_model_do_something(etsm, etsm->cursor_row, GTK_VALUE_INT(*arg), 0);
- break;
- }
-}
-
-static void
-e_table_selection_model_init (ETableSelectionModel *selection)
-{
- selection->selection = NULL;
- selection->row_count = -1;
- selection->model = NULL;
-}
-
-static void
-e_table_selection_model_class_init (ETableSelectionModelClass *klass)
-{
- GtkObjectClass *object_class;
-
- e_table_selection_model_parent_class = gtk_type_class (gtk_object_get_type ());
-
- object_class = GTK_OBJECT_CLASS(klass);
-
- object_class->destroy = etsm_destroy;
- object_class->get_arg = etsm_get_arg;
- object_class->set_arg = etsm_set_arg;
-
- e_table_selection_model_signals [CURSOR_CHANGED] =
- gtk_signal_new ("cursor_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableSelectionModelClass, cursor_changed),
- gtk_marshal_NONE__INT_INT,
- GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT);
-
- e_table_selection_model_signals [SELECTION_CHANGED] =
- gtk_signal_new ("selection_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableSelectionModelClass, selection_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- klass->cursor_changed = NULL;
- klass->selection_changed = NULL;
-
- gtk_object_class_add_signals (object_class, e_table_selection_model_signals, LAST_SIGNAL);
-
- gtk_object_add_arg_type ("ETableSelectionModel::model", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_MODEL);
- gtk_object_add_arg_type ("ETableSelectionModel::sorter", GTK_TYPE_OBJECT,
- GTK_ARG_READWRITE, ARG_SORTER);
- gtk_object_add_arg_type ("ETableSelectionModel::cursor_row", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_CURSOR_ROW);
- gtk_object_add_arg_type ("ETableSelectionModel::cursor_col", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_CURSOR_COL);
-}
-
-E_MAKE_TYPE(e_table_selection_model, "ETableSelectionModel", ETableSelectionModel,
- e_table_selection_model_class_init, e_table_selection_model_init, PARENT_TYPE);
-
-ETableSelectionModel *
-e_table_selection_model_new (void)
-{
- return gtk_type_new (e_table_selection_model_get_type ());
-}
-
-gboolean
-e_table_selection_model_is_row_selected (ETableSelectionModel *selection,
- gint n)
-{
- if (selection->row_count < n)
- return 0;
- else
- return (selection->selection[BOX(n)] >> OFFSET(n)) & 0x1;
-}
-
-void
-e_table_selection_model_foreach (ETableSelectionModel *selection,
- ETableForeachFunc callback,
- gpointer closure)
-{
- int i;
- int last = (selection->row_count + 31) / 32;
- for (i = 0; i < last; i++) {
- if (selection->selection[i]) {
- int j;
- guint32 value = selection->selection[i];
- for (j = 0; j < 32; j++) {
- if (value & 0x80000000) {
- callback(i * 32 + j, closure);
- }
- value <<= 1;
- }
- }
- }
-}
-
-#define OPERATE(object, mask, grow) ((grow) ? ((object) |= (~(mask))) : ((object) &= (mask)))
-
-static void
-change_one_row(ETableSelectionModel *selection, int row, gboolean grow)
-{
- int i;
- i = BOX(row);
-
- OPERATE(selection->selection[i], BITMASK_LEFT(row) | BITMASK_RIGHT(row + 1), grow);
-}
-
-static void
-change_selection(ETableSelectionModel *selection, int start, int end, gboolean grow)
-{
- int i, last;
- if (start != end) {
- if (selection->sorter && e_table_sorter_needs_sorting(selection->sorter)) {
- for ( i = start; i < end; i++) {
- change_one_row(selection, e_table_sorter_sorted_to_model(selection->sorter, i), grow);
- }
- } else {
- i = BOX(start);
- last = BOX(end);
-
- if (i == last) {
- OPERATE(selection->selection[i], BITMASK_LEFT(start) | BITMASK_RIGHT(end), grow);
- } else {
- OPERATE(selection->selection[i], BITMASK_LEFT(start), grow);
- if (grow)
- for (i ++; i < last; i++)
- selection->selection[i] = ONES;
- else
- for (i ++; i < last; i++)
- selection->selection[i] = 0;
- OPERATE(selection->selection[i], BITMASK_RIGHT(end), grow);
- }
- }
- }
-}
-
-void e_table_selection_model_do_something (ETableSelectionModel *selection,
- guint row,
- guint col,
- GdkModifierType state)
-{
- gint shift_p = state & GDK_SHIFT_MASK;
- gint ctrl_p = state & GDK_CONTROL_MASK;
- if (selection->row_count < 0) {
- if (selection->model) {
- selection->row_count = e_table_model_row_count(selection->model);
- g_free(selection->selection);
- selection->selection = g_new0(gint, (selection->row_count + 31) / 32);
- }
- }
- if (selection->row_count >= 0 && row < selection->row_count) {
- if (shift_p) {
- int old_start;
- int old_end;
- int new_start;
- int new_end;
- if (selection->sorter && e_table_sorter_needs_sorting(selection->sorter)) {
- old_start = MIN (e_table_sorter_model_to_sorted(selection->sorter, selection->selection_start_row),
- e_table_sorter_model_to_sorted(selection->sorter, selection->cursor_row));
- old_end = MAX (e_table_sorter_model_to_sorted(selection->sorter, selection->selection_start_row),
- e_table_sorter_model_to_sorted(selection->sorter, selection->cursor_row)) + 1;
- new_start = MIN (e_table_sorter_model_to_sorted(selection->sorter, selection->selection_start_row),
- e_table_sorter_model_to_sorted(selection->sorter, row));
- new_end = MAX (e_table_sorter_model_to_sorted(selection->sorter, selection->selection_start_row),
- e_table_sorter_model_to_sorted(selection->sorter, row)) + 1;
- } else {
- old_start = MIN (selection->selection_start_row, selection->cursor_row);
- old_end = MAX (selection->selection_start_row, selection->cursor_row) + 1;
- new_start = MIN (selection->selection_start_row, row);
- new_end = MAX (selection->selection_start_row, row) + 1;
- }
- /* This wouldn't work nearly so smoothly if one end of the selection held in place. */
- if (old_start < new_start)
- change_selection(selection, old_start, new_start, FALSE);
- if (new_start < old_start)
- change_selection(selection, new_start, old_start, TRUE);
- if (old_end < new_end)
- change_selection(selection, old_end, new_end, TRUE);
- if (new_end < old_end)
- change_selection(selection, new_end, old_end, FALSE);
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals [SELECTION_CHANGED]);
- } else {
- if (ctrl_p) {
- if (selection->selection[BOX(row)] & BITMASK(row))
- selection->selection[BOX(row)] &= ~BITMASK(row);
- else
- selection->selection[BOX(row)] |= BITMASK(row);
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals [SELECTION_CHANGED]);
- } else {
- int i;
- for (i = 0; i < ((selection->row_count + 31) / 32); i++) {
- if (!((i == BOX(row) && selection->selection[i] == BITMASK(row)) ||
- (i != BOX(row) && selection->selection[i] == 0))) {
- g_free(selection->selection);
- selection->selection = g_new0(gint, (selection->row_count + 31) / 32);
- selection->selection[BOX(row)] = BITMASK(row);
-
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals [SELECTION_CHANGED]);
- break;
- }
- }
- }
- selection->selection_start_row = row;
- }
- if (selection->cursor_row != row ||
- selection->cursor_col != col) {
- selection->cursor_row = row;
- selection->cursor_col = col;
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals[CURSOR_CHANGED], row, col);
- }
- }
-}
-
-void e_table_selection_model_maybe_do_something (ETableSelectionModel *selection,
- guint row,
- guint col,
- GdkModifierType state)
-{
- if (e_table_selection_model_is_row_selected(selection, row)) {
- selection->cursor_row = row;
- selection->cursor_col = col;
- } else {
- e_table_selection_model_do_something(selection, row, col, state);
- }
-}
-
-void
-e_table_selection_model_clear(ETableSelectionModel *selection)
-{
- g_free(selection->selection);
- selection->selection = NULL;
- selection->row_count = -1;
- selection->cursor_row = -1;
- selection->cursor_col = -1;
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals [CURSOR_CHANGED], -1, -1);
- gtk_signal_emit(GTK_OBJECT(selection),
- e_table_selection_model_signals [SELECTION_CHANGED]);
-}
-
-#define PART(x,n) (((x) & (0x01010101 << n)) >> n)
-#define SECTION(x, n) (((x) >> (n * 8)) & 0xff)
-
-gint
-e_table_selection_model_selected_count (ETableSelectionModel *selection)
-{
- gint count;
- int i;
- int last;
-
- count = 0;
-
- last = BOX(selection->row_count - 1);
-
- for (i = 0; i <= last; i++) {
- int j;
- guint32 thiscount = 0;
- for (j = 0; j < 8; j++)
- thiscount += PART(selection->selection[i], j);
- for (j = 0; j < 4; j++)
- count += SECTION(thiscount, j);
- }
-
- return count;
-}
diff --git a/widgets/table/e-table-selection-model.h b/widgets/table/e-table-selection-model.h
deleted file mode 100644
index 6d7b25ed3d..0000000000
--- a/widgets/table/e-table-selection-model.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SELECTION_MODEL_H_
-#define _E_TABLE_SELECTION_MODEL_H_
-
-#include <gtk/gtkobject.h>
-#include "widgets/e-table/e-table-model.h"
-#include "widgets/e-table/e-table-defines.h"
-#include "widgets/e-table/e-table-sorter.h"
-
-#define E_TABLE_SELECTION_MODEL_TYPE (e_table_selection_model_get_type ())
-#define E_TABLE_SELECTION_MODEL(o) (GTK_CHECK_CAST ((o), E_TABLE_SELECTION_MODEL_TYPE, ETableSelectionModel))
-#define E_TABLE_SELECTION_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SELECTION_MODEL_TYPE, ETableSelectionModelClass))
-#define E_IS_TABLE_SELECTION_MODEL(o) (GTK_CHECK_TYPE ((o), E_TABLE_SELECTION_MODEL_TYPE))
-#define E_IS_TABLE_SELECTION_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SELECTION_MODEL_TYPE))
-
-typedef struct {
- GtkObject base;
-
- ETableModel *model;
- ETableSorter *sorter;
-
- gint row_count;
- guint32 *selection;
-
- gint cursor_row;
- gint cursor_col;
- gint selection_start_row;
-
- guint model_changed_id;
- guint model_row_inserted_id, model_row_deleted_id;
-
- guint frozen : 1;
- guint selection_model_changed : 1;
- guint group_info_changed : 1;
-} ETableSelectionModel;
-
-typedef struct {
- GtkObjectClass parent_class;
-
- /*
- * Signals
- */
-
- void (*cursor_changed) (ETableSelectionModel *selection, int row, int col);
- void (*selection_changed) (ETableSelectionModel *selection);
-
-} ETableSelectionModelClass;
-
-GtkType e_table_selection_model_get_type (void);
-
-gboolean e_table_selection_model_is_row_selected (ETableSelectionModel *selection,
- gint n);
-void e_table_selection_model_foreach (ETableSelectionModel *selection,
- ETableForeachFunc callback,
- gpointer closure);
-
-void e_table_selection_model_do_something (ETableSelectionModel *selection,
- guint row,
- guint col,
- GdkModifierType state);
-void e_table_selection_model_maybe_do_something (ETableSelectionModel *selection,
- guint row,
- guint col,
- GdkModifierType state);
-void e_table_selection_model_clear (ETableSelectionModel *selection);
-gint e_table_selection_model_selected_count (ETableSelectionModel *selection);
-
-ETableSelectionModel *e_table_selection_model_new (void);
-
-#endif /* _E_TABLE_SELECTION_MODEL_H_ */
diff --git a/widgets/table/e-table-simple.c b/widgets/table/e-table-simple.c
deleted file mode 100644
index 8c8ed87b70..0000000000
--- a/widgets/table/e-table-simple.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-model.c: a simple table model implementation that uses function
- * pointers to simplify the creation of new, exotic and colorful tables in
- * no time.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-
-#include <config.h>
-#include "e-table-simple.h"
-
-enum {
- ARG_0,
- ARG_APPEND_ROW,
-};
-
-#define PARENT_TYPE e_table_model_get_type ()
-
-static int
-simple_column_count (ETableModel *etm)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->col_count)
- return simple->col_count (etm, simple->data);
- else
- return 0;
-}
-
-static int
-simple_row_count (ETableModel *etm)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->row_count)
- return simple->row_count (etm, simple->data);
- else
- return 0;
-}
-
-static void *
-simple_value_at (ETableModel *etm, int col, int row)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->value_at)
- return simple->value_at (etm, col, row, simple->data);
- else
- return NULL;
-}
-
-static void
-simple_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->set_value_at)
- simple->set_value_at (etm, col, row, val, simple->data);
-}
-
-static gboolean
-simple_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->is_cell_editable)
- return simple->is_cell_editable (etm, col, row, simple->data);
- else
- return FALSE;
-}
-
-/* The default for simple_duplicate_value is to return the raw value. */
-static void *
-simple_duplicate_value (ETableModel *etm, int col, const void *value)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->duplicate_value)
- return simple->duplicate_value (etm, col, value, simple->data);
- else
- return (void *)value;
-}
-
-static void
-simple_free_value (ETableModel *etm, int col, void *value)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->free_value)
- simple->free_value (etm, col, value, simple->data);
-}
-
-static void *
-simple_initialize_value (ETableModel *etm, int col)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->initialize_value)
- return simple->initialize_value (etm, col, simple->data);
- else
- return NULL;
-}
-
-static gboolean
-simple_value_is_empty (ETableModel *etm, int col, const void *value)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->value_is_empty)
- return simple->value_is_empty (etm, col, value, simple->data);
- else
- return FALSE;
-}
-
-static char *
-simple_value_to_string (ETableModel *etm, int col, const void *value)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->value_to_string)
- return simple->value_to_string (etm, col, value, simple->data);
- else
- return g_strdup ("");
-}
-
-static void
-simple_append_row (ETableModel *etm, ETableModel *source, int row)
-{
- ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
- if (simple->append_row)
- simple->append_row (etm, source, row, simple->data);
-}
-
-static void
-simple_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableSimple *simple = E_TABLE_SIMPLE (o);
-
- switch (arg_id){
- case ARG_APPEND_ROW:
- GTK_VALUE_POINTER(*arg) = simple->append_row;
- break;
- }
-}
-
-static void
-simple_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETableSimple *simple = E_TABLE_SIMPLE (o);
-
- switch (arg_id){
- case ARG_APPEND_ROW:
- simple->append_row = GTK_VALUE_POINTER(*arg);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- }
-}
-
-static void
-e_table_simple_class_init (GtkObjectClass *object_class)
-{
- ETableModelClass *model_class = (ETableModelClass *) object_class;
-
- object_class->set_arg = simple_set_arg;
- object_class->get_arg = simple_get_arg;
-
- model_class->column_count = simple_column_count;
- model_class->row_count = simple_row_count;
- model_class->value_at = simple_value_at;
- model_class->set_value_at = simple_set_value_at;
- model_class->is_cell_editable = simple_is_cell_editable;
- model_class->duplicate_value = simple_duplicate_value;
- model_class->free_value = simple_free_value;
- model_class->initialize_value = simple_initialize_value;
- model_class->value_is_empty = simple_value_is_empty;
- model_class->value_to_string = simple_value_to_string;
- model_class->append_row = simple_append_row;
-
- gtk_object_add_arg_type ("ETableSimple::append_row", GTK_TYPE_POINTER,
- GTK_ARG_READWRITE, ARG_APPEND_ROW);
-}
-
-GtkType
-e_table_simple_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type){
- GtkTypeInfo info = {
- "ETableSimple",
- sizeof (ETableSimple),
- sizeof (ETableSimpleClass),
- (GtkClassInitFunc) e_table_simple_class_init,
- (GtkObjectInitFunc) NULL,
- NULL, /* reserved 1 */
- NULL, /* reserved 2 */
- (GtkClassInitFunc) NULL
- };
-
- type = gtk_type_unique (PARENT_TYPE, &info);
- }
-
- return type;
-}
-
-ETableModel *
-e_table_simple_new (ETableSimpleColumnCountFn col_count,
- ETableSimpleRowCountFn row_count,
- ETableSimpleValueAtFn value_at,
- ETableSimpleSetValueAtFn set_value_at,
- ETableSimpleIsCellEditableFn is_cell_editable,
- ETableSimpleDuplicateValueFn duplicate_value,
- ETableSimpleFreeValueFn free_value,
- ETableSimpleInitializeValueFn initialize_value,
- ETableSimpleValueIsEmptyFn value_is_empty,
- ETableSimpleValueToStringFn value_to_string,
- void *data)
-{
- ETableSimple *et;
-
- et = gtk_type_new (e_table_simple_get_type ());
-
- et->col_count = col_count;
- et->row_count = row_count;
- et->value_at = value_at;
- et->set_value_at = set_value_at;
- et->is_cell_editable = is_cell_editable;
- et->duplicate_value = duplicate_value;
- et->free_value = free_value;
- et->initialize_value = initialize_value;
- et->value_is_empty = value_is_empty;
- et->value_to_string = value_to_string;
- et->data = data;
-
- return (ETableModel *) et;
-}
diff --git a/widgets/table/e-table-simple.h b/widgets/table/e-table-simple.h
deleted file mode 100644
index 34e76eed79..0000000000
--- a/widgets/table/e-table-simple.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SIMPLE_H_
-#define _E_TABLE_SIMPLE_H_
-
-#include "e-table-model.h"
-
-#define E_TABLE_SIMPLE_TYPE (e_table_simple_get_type ())
-#define E_TABLE_SIMPLE(o) (GTK_CHECK_CAST ((o), E_TABLE_SIMPLE_TYPE, ETableSimple))
-#define E_TABLE_SIMPLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SIMPLE_TYPE, ETableSimpleClass))
-#define E_IS_TABLE_SIMPLE(o) (GTK_CHECK_TYPE ((o), E_TABLE_SIMPLE_TYPE))
-#define E_IS_TABLE_SIMPLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SIMPLE_TYPE))
-
-typedef int (*ETableSimpleColumnCountFn) (ETableModel *etm, void *data);
-typedef int (*ETableSimpleRowCountFn) (ETableModel *etm, void *data);
-typedef void *(*ETableSimpleValueAtFn) (ETableModel *etm, int col, int row, void *data);
-typedef void (*ETableSimpleSetValueAtFn) (ETableModel *etm, int col, int row, const void *val, void *data);
-typedef gboolean (*ETableSimpleIsCellEditableFn) (ETableModel *etm, int col, int row, void *data);
-typedef void (*ETableSimpleAppendRowFn) (ETableModel *etm, ETableModel *model, int row, void *data);
-typedef void *(*ETableSimpleDuplicateValueFn) (ETableModel *etm, int col, const void *val, void *data);
-typedef void (*ETableSimpleFreeValueFn) (ETableModel *etm, int col, void *val, void *data);
-typedef void *(*ETableSimpleInitializeValueFn) (ETableModel *etm, int col, void *data);
-typedef gboolean (*ETableSimpleValueIsEmptyFn) (ETableModel *etm, int col, const void *val, void *data);
-typedef char *(*ETableSimpleValueToStringFn) (ETableModel *etm, int col, const void *val, void *data);
-
-typedef struct {
- ETableModel parent;
-
- ETableSimpleColumnCountFn col_count;
- ETableSimpleRowCountFn row_count;
- ETableSimpleValueAtFn value_at;
- ETableSimpleSetValueAtFn set_value_at;
- ETableSimpleIsCellEditableFn is_cell_editable;
- ETableSimpleDuplicateValueFn duplicate_value;
- ETableSimpleFreeValueFn free_value;
- ETableSimpleInitializeValueFn initialize_value;
- ETableSimpleValueIsEmptyFn value_is_empty;
- ETableSimpleValueToStringFn value_to_string;
- ETableSimpleAppendRowFn append_row;
- void *data;
-} ETableSimple;
-
-typedef struct {
- ETableModelClass parent_class;
-} ETableSimpleClass;
-
-GtkType e_table_simple_get_type (void);
-
-ETableModel *e_table_simple_new (ETableSimpleColumnCountFn col_count,
- ETableSimpleRowCountFn row_count,
- ETableSimpleValueAtFn value_at,
- ETableSimpleSetValueAtFn set_value_at,
- ETableSimpleIsCellEditableFn is_cell_editable,
- ETableSimpleDuplicateValueFn duplicate_value,
- ETableSimpleFreeValueFn free_value,
- ETableSimpleInitializeValueFn initialize_value,
- ETableSimpleValueIsEmptyFn value_is_empty,
- ETableSimpleValueToStringFn value_to_string,
- void *data);
-
-#endif /* _E_TABLE_SIMPLE_H_ */
-
diff --git a/widgets/table/e-table-size-test.c b/widgets/table/e-table-size-test.c
deleted file mode 100644
index 2bc18235e8..0000000000
--- a/widgets/table/e-table-size-test.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* This code is GPL. */
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "table-test.h"
-
-/*
- * One way in which we make it simpler to build an ETableModel is through
- * the ETableSimple class. Instead of creating your own ETableModel
- * class, you simply create a new object of the ETableSimple class. You
- * give it a bunch of functions that act as callbacks.
- *
- * You also get to pass a void * to ETableSimple and it gets passed to
- * your callbacks. This would be for having multiple models of the same
- * type. This is just an example though, so we statically define all the
- * data and ignore the void *data parameter.
- *
- * In our example we will be creating a table model with 6 columns and 10
- * rows. This corresponds to having 6 different types of information and
- * 10 different sets of data in our database.
- *
- * The headers will be hard coded, as will be the example data.
- *
- */
-
-/*
- * There are two different meanings to the word "column". The first is
- * the model column. A model column corresponds to a specific type of
- * data. This is very much like the usage in a database table where a
- * column is a field in the database.
- *
- * The second type of column is a view column. A view column
- * corresponds to a visually displayed column. Each view column
- * corresponds to a specific model column, though a model column may
- * have any number of view columns associated with it, from zero to
- * greater than one.
- *
- * Also, a view column doesn't necessarily depend on only one model
- * column. In some cases, the view column renderer can be given a
- * reference to another column to get extra information about its
- * display.
-*/
-
-#define ROWS 5000
-#define COLS 4
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/*
- * Here we define the initial layout of the table. This is an xml
- * format that allows you to change the initial ordering of the
- * columns or to do sorting or grouping initially. This specification
- * shows all 5 columns, but moves the importance column nearer to the
- * front. It also sorts by the "Full Name" column (ascending.)
- * Sorting and grouping take the model column as their arguments
- * (sorting is specified by the "column" argument to the leaf elemnt.
- */
-
-#define INITIAL_SPEC "<ETableSpecification> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 4 </column> \
- <column> 1 </column> \
- <column> 2 </column> \
- <column> 3 </column> \
- </columns-shown> \
- <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
-</ETableSpecification>"
-
-char *headers [COLS] = {
- "Email",
- "Full Name",
- "Address",
- "Phone"
-};
-
-/*
- * Virtual Column list:
- * 0 Email
- * 1 Full Name
- * 2 Address
- * 3 Phone
- */
-
-/*
- * ETableSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/*
- * Since our model is a constant size, we can just return its size in
- * the column and row count fields.
- */
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-my_col_count (ETableModel *etc, void *data)
-{
- return COLS;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-my_row_count (ETableModel *etc, void *data)
-{
- return ROWS;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-my_value_at (ETableModel *etc, int col, int row, void *data)
-{
- static guchar t[] = {'A', 0xc3, 0x84, 0xc3, 0x95, 0xc3, 0x94, 0xc3, 0xb5, 0x00};
-
-#if 0
- if (col == 1) return "toshok@helixcode.com";
-#else
- if (col == 1) return t;
-#endif
- else if (col == 2) return "Chris Toshok";
- else if (col == 3) return "43 Vicksburg, SF";
- else if (col == 4) return "415-867-5309";
- else return NULL;
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-my_set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-my_is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- return FALSE;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-my_duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup (value);
-}
-
-/* This function frees the value passed to it. */
-static void
-my_free_value (ETableModel *etc, int col, void *value, void *data)
-{
- g_free (value);
-}
-
-/* This function creates an empty value. */
-static void *
-my_initialize_value (ETableModel *etc, int col, void *data)
-{
- return g_strdup ("");
-}
-
-/* This function reports if a value is empty. */
-static gboolean
-my_value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- return !(value && *(char *)value);
-}
-
-/* This function reports if a value is empty. */
-static char *
-my_value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup(value);
-}
-
-/* We create a window containing our new table. */
-static void
-create_table (void)
-{
- GtkWidget *e_table, *window, *frame;
- ECell *cell_left_just;
- ETableHeader *e_table_header;
- ETableModel *e_table_model = NULL;
- int i;
-
- /* Next we create our model. This uses the functions we defined
- earlier. */
- e_table_model = e_table_simple_new (
- my_col_count, my_row_count, my_value_at,
- my_set_value_at, my_is_cell_editable,
- my_duplicate_value, my_free_value,
- my_initialize_value, my_value_is_empty,
- my_value_to_string,
- NULL);
- /*
- * Next we create a header. The ETableHeader is used in two
- * different way. The first is the full_header. This is the
- * list of possible columns in the view. The second use is
- * completely internal. Many of the ETableHeader functions are
- * for that purpose. The only functions we really need are
- * e_table_header_new and e_table_header_add_col.
- *
- * First we create the header.
- */
- e_table_header = e_table_header_new ();
-
- /*
- * Next we have to build renderers for all of the columns.
- * Since all our columns are text columns, we can simply use
- * the same renderer over and over again. If we had different
- * types of columns, we could use a different renderer for
- * each column.
- */
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- /*
- * Next we create a column object for each view column and add
- * them to the header. We don't create a column object for
- * the importance column since it will not be shown.
- */
- for (i = 0; i < COLS; i++) {
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, headers [i],
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /*
- * Here we create a window for our new table. This window
- * will get shown and the person will be able to test their
- * item.
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
- /* This frame is simply to get a bevel around our table. */
- frame = gtk_frame_new (NULL);
-
- /*
- * 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.
- */
- e_table = e_table_new (e_table_header, e_table_model, INITIAL_SPEC);
-
- /* Build the gtk widget hierarchy. */
- gtk_container_add (GTK_CONTAINER (frame), e_table);
- gtk_container_add (GTK_CONTAINER (window), frame);
-
- /* Size the initial window. */
- gtk_widget_set_usize (window, 300, 200);
-
- /* Show it all. */
- gtk_widget_show_all (window);
-}
-
-/* This is the main function which just initializes gnome and call our create_table function */
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- create_table ();
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
-
diff --git a/widgets/table/e-table-sort-info.c b/widgets/table/e-table-sort-info.c
deleted file mode 100644
index 32ba3d9e65..0000000000
--- a/widgets/table/e-table-sort-info.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-sort-info.c: a Table Model
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-table-sort-info.h"
-#include "e-util/e-util.h"
-
-#define ETM_CLASS(e) ((ETableSortInfoClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE gtk_object_get_type ()
-
-
-static GtkObjectClass *e_table_sort_info_parent_class;
-
-enum {
- SORT_INFO_CHANGED,
- GROUP_INFO_CHANGED,
- LAST_SIGNAL
-};
-
-static guint e_table_sort_info_signals [LAST_SIGNAL] = { 0, };
-
-static void
-etsi_destroy (GtkObject *object)
-{
- ETableSortInfo *etsi;
-
- etsi = E_TABLE_SORT_INFO (object);
-
- if (etsi->groupings)
- g_free(etsi->groupings);
- if (etsi->sortings)
- g_free(etsi->sortings);
-}
-
-static void
-e_table_sort_info_init (ETableSortInfo *info)
-{
- info->group_count = 0;
- info->groupings = NULL;
- info->sort_count = 0;
- info->sortings = NULL;
- info->frozen = 0;
- info->sort_info_changed = 0;
- info->group_info_changed = 0;
-}
-
-static void
-e_table_sort_info_class_init (ETableSortInfoClass *klass)
-{
- GtkObjectClass *object_class;
-
- e_table_sort_info_parent_class = gtk_type_class (gtk_object_get_type ());
-
- object_class = GTK_OBJECT_CLASS(klass);
-
- object_class->destroy = etsi_destroy;
-
- e_table_sort_info_signals [SORT_INFO_CHANGED] =
- gtk_signal_new ("sort_info_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableSortInfoClass, sort_info_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- e_table_sort_info_signals [GROUP_INFO_CHANGED] =
- gtk_signal_new ("group_info_changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableSortInfoClass, group_info_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- klass->sort_info_changed = NULL;
- klass->group_info_changed = NULL;
-
- gtk_object_class_add_signals (object_class, e_table_sort_info_signals, LAST_SIGNAL);
-}
-
-E_MAKE_TYPE(e_table_sort_info, "ETableSortInfo", ETableSortInfo,
- e_table_sort_info_class_init, e_table_sort_info_init, PARENT_TYPE);
-
-static void
-e_table_sort_info_sort_info_changed (ETableSortInfo *info)
-{
- g_return_if_fail (info != NULL);
- g_return_if_fail (E_IS_TABLE_SORT_INFO (info));
-
- if (info->frozen) {
- info->sort_info_changed = 1;
- } else {
- gtk_signal_emit (GTK_OBJECT (info),
- e_table_sort_info_signals [SORT_INFO_CHANGED]);
- }
-}
-
-static void
-e_table_sort_info_group_info_changed (ETableSortInfo *info)
-{
- g_return_if_fail (info != NULL);
- g_return_if_fail (E_IS_TABLE_SORT_INFO (info));
-
- if (info->frozen) {
- info->group_info_changed = 1;
- } else {
- gtk_signal_emit (GTK_OBJECT (info),
- e_table_sort_info_signals [GROUP_INFO_CHANGED]);
- }
-}
-
-void
-e_table_sort_info_freeze (ETableSortInfo *info)
-{
- info->frozen = 1;
-}
-
-void
-e_table_sort_info_thaw (ETableSortInfo *info)
-{
- info->frozen = 0;
- if (info->sort_info_changed) {
- info->sort_info_changed = 0;
- e_table_sort_info_sort_info_changed(info);
- }
- if (info->group_info_changed) {
- info->group_info_changed = 0;
- e_table_sort_info_group_info_changed(info);
- }
-}
-
-
-guint
-e_table_sort_info_grouping_get_count (ETableSortInfo *info)
-{
- return info->group_count;
-}
-
-static void
-e_table_sort_info_grouping_real_truncate (ETableSortInfo *info, int length)
-{
- if (length < info->group_count) {
- info->group_count = length;
- }
- if (length > info->group_count) {
- info->groupings = g_realloc(info->groupings, length * sizeof(ETableSortColumn));
- info->group_count = length;
- }
-}
-
-void
-e_table_sort_info_grouping_truncate (ETableSortInfo *info, int length)
-{
- e_table_sort_info_grouping_real_truncate(info, length);
- e_table_sort_info_group_info_changed(info);
-}
-
-ETableSortColumn
-e_table_sort_info_grouping_get_nth (ETableSortInfo *info, int n)
-{
- if (n < info->group_count) {
- return info->groupings[n];
- } else {
- ETableSortColumn fake = {0, 0};
- return fake;
- }
-}
-
-void
-e_table_sort_info_grouping_set_nth (ETableSortInfo *info, int n, ETableSortColumn column)
-{
- if (n >= info->group_count) {
- e_table_sort_info_grouping_real_truncate(info, n + 1);
- }
- info->groupings[n] = column;
- e_table_sort_info_group_info_changed(info);
-}
-
-
-guint
-e_table_sort_info_sorting_get_count (ETableSortInfo *info)
-{
- return info->sort_count;
-}
-
-static void
-e_table_sort_info_sorting_real_truncate (ETableSortInfo *info, int length)
-{
- if (length < info->sort_count) {
- info->sort_count = length;
- }
- if (length > info->sort_count) {
- info->sortings = g_realloc(info->sortings, length * sizeof(ETableSortColumn));
- info->sort_count = length;
- }
-}
-
-void
-e_table_sort_info_sorting_truncate (ETableSortInfo *info, int length)
-{
- e_table_sort_info_sorting_real_truncate (info, length);
- e_table_sort_info_sort_info_changed(info);
-}
-
-ETableSortColumn
-e_table_sort_info_sorting_get_nth (ETableSortInfo *info, int n)
-{
- if (n < info->sort_count) {
- return info->sortings[n];
- } else {
- ETableSortColumn fake = {0, 0};
- return fake;
- }
-}
-
-void
-e_table_sort_info_sorting_set_nth (ETableSortInfo *info, int n, ETableSortColumn column)
-{
- if (n >= info->sort_count) {
- e_table_sort_info_sorting_real_truncate(info, n + 1);
- }
- info->sortings[n] = column;
- e_table_sort_info_sort_info_changed(info);
-}
-
-
-ETableSortInfo *
-e_table_sort_info_new (void)
-{
- return gtk_type_new (e_table_sort_info_get_type ());
-}
diff --git a/widgets/table/e-table-sort-info.h b/widgets/table/e-table-sort-info.h
deleted file mode 100644
index 6446230116..0000000000
--- a/widgets/table/e-table-sort-info.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SORT_INFO_H_
-#define _E_TABLE_SORT_INFO_H_
-
-#include <gtk/gtkobject.h>
-
-#define E_TABLE_SORT_INFO_TYPE (e_table_sort_info_get_type ())
-#define E_TABLE_SORT_INFO(o) (GTK_CHECK_CAST ((o), E_TABLE_SORT_INFO_TYPE, ETableSortInfo))
-#define E_TABLE_SORT_INFO_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SORT_INFO_TYPE, ETableSortInfoClass))
-#define E_IS_TABLE_SORT_INFO(o) (GTK_CHECK_TYPE ((o), E_TABLE_SORT_INFO_TYPE))
-#define E_IS_TABLE_SORT_INFO_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SORT_INFO_TYPE))
-
-typedef struct _ETableSortColumn ETableSortColumn;
-
-struct _ETableSortColumn {
- guint column : 31;
- guint ascending : 1;
-};
-
-typedef struct {
- GtkObject base;
-
- gint group_count;
- ETableSortColumn *groupings;
- gint sort_count;
- ETableSortColumn *sortings;
-
- guint frozen : 1;
- guint sort_info_changed : 1;
- guint group_info_changed : 1;
-} ETableSortInfo;
-
-typedef struct {
- GtkObjectClass parent_class;
-
- /*
- * Signals
- */
- void (*sort_info_changed) (ETableSortInfo *info);
- void (*group_info_changed) (ETableSortInfo *info);
-} ETableSortInfoClass;
-
-GtkType e_table_sort_info_get_type (void);
-
-void e_table_sort_info_freeze (ETableSortInfo *info);
-void e_table_sort_info_thaw (ETableSortInfo *info);
-
-guint e_table_sort_info_grouping_get_count (ETableSortInfo *info);
-void e_table_sort_info_grouping_truncate (ETableSortInfo *info, int length);
-ETableSortColumn e_table_sort_info_grouping_get_nth (ETableSortInfo *info, int n);
-void e_table_sort_info_grouping_set_nth (ETableSortInfo *info, int n, ETableSortColumn column);
-
-guint e_table_sort_info_sorting_get_count (ETableSortInfo *info);
-void e_table_sort_info_sorting_truncate (ETableSortInfo *info, int length);
-ETableSortColumn e_table_sort_info_sorting_get_nth (ETableSortInfo *info, int n);
-void e_table_sort_info_sorting_set_nth (ETableSortInfo *info, int n, ETableSortColumn column);
-
-ETableSortInfo *e_table_sort_info_new (void);
-
-#endif /* _E_TABLE_SORT_INFO_H_ */
diff --git a/widgets/table/e-table-sorted-variable.c b/widgets/table/e-table-sorted-variable.c
deleted file mode 100644
index 7584b31a74..0000000000
--- a/widgets/table/e-table-sorted-variable.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-sorted.c: Implements a table that sorts another table
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtksignal.h>
-#include <string.h>
-#include "e-util/e-util.h"
-#include "e-table-sorted-variable.h"
-
-#define PARENT_TYPE E_TABLE_SUBSET_VARIABLE_TYPE
-
-#define INCREMENT_AMOUNT 100
-
-static ETableSubsetVariableClass *etsv_parent_class;
-
-static void etsv_proxy_model_changed (ETableModel *etm, ETableSortedVariable *etsv);
-#if 0
-static void etsv_proxy_model_row_changed (ETableModel *etm, int row, ETableSortedVariable *etsv);
-static void etsv_proxy_model_cell_changed (ETableModel *etm, int col, int row, ETableSortedVariable *etsv);
-#endif
-static void etsv_sort_info_changed (ETableSortInfo *info, ETableSortedVariable *etsv);
-static void etsv_sort (ETableSortedVariable *etsv);
-static void etsv_add (ETableSubsetVariable *etssv, gint row);
-static void etsv_add_all (ETableSubsetVariable *etssv);
-
-static void
-etsv_destroy (GtkObject *object)
-{
- ETableSortedVariable *etsv = E_TABLE_SORTED_VARIABLE (object);
- ETableSubset *etss = E_TABLE_SUBSET (object);
-
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etsv->table_model_changed_id);
-#if 0
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etsv->table_model_row_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etsv->table_model_cell_changed_id);
-#endif
- gtk_signal_disconnect (GTK_OBJECT (etsv->sort_info),
- etsv->sort_info_changed_id);
-
- if (etsv->sort_idle_id) {
- g_source_remove(etsv->sort_idle_id);
- }
-
- etsv->table_model_changed_id = 0;
- etsv->table_model_row_changed_id = 0;
- etsv->table_model_cell_changed_id = 0;
-
- if (etsv->sort_info)
- gtk_object_unref(GTK_OBJECT(etsv->sort_info));
- if (etsv->full_header)
- gtk_object_unref(GTK_OBJECT(etsv->full_header));
-
- GTK_OBJECT_CLASS (etsv_parent_class)->destroy (object);
-}
-
-static void
-etsv_class_init (GtkObjectClass *object_class)
-{
- ETableSubsetVariableClass *etssv_class = E_TABLE_SUBSET_VARIABLE_CLASS(object_class);
-
- etsv_parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = etsv_destroy;
-
- etssv_class->add = etsv_add;
- etssv_class->add_all = etsv_add_all;
-}
-
-static void
-etsv_init (ETableSortedVariable *etsv)
-{
- etsv->full_header = NULL;
- etsv->sort_info = NULL;
-
- etsv->table_model_changed_id = 0;
- etsv->table_model_row_changed_id = 0;
- etsv->table_model_cell_changed_id = 0;
- etsv->sort_info_changed_id = 0;
-
- etsv->sort_idle_id = 0;
-}
-
-E_MAKE_TYPE(e_table_sorted_variable, "ETableSortedVariable", ETableSortedVariable, etsv_class_init, etsv_init, PARENT_TYPE);
-
-static gboolean
-etsv_sort_idle(ETableSortedVariable *etsv)
-{
- gtk_object_ref(GTK_OBJECT(etsv));
- etsv_sort(etsv);
- etsv->sort_idle_id = 0;
- gtk_object_unref(GTK_OBJECT(etsv));
- return FALSE;
-}
-
-/* This takes source rows. */
-static int
-etsv_compare(ETableSortedVariable *etsv, int row1, int row2)
-{
- int j;
- int sort_count = e_table_sort_info_sorting_get_count(etsv->sort_info);
- int comp_val = 0;
- int ascending = 1;
- ETableSubset *etss = E_TABLE_SUBSET(etsv);
-
- for (j = 0; j < sort_count; j++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(etsv->sort_info, j);
- ETableCol *col;
- if (column.column > e_table_header_count (etsv->full_header))
- col = e_table_header_get_column (etsv->full_header, e_table_header_count (etsv->full_header) - 1);
- else
- col = e_table_header_get_column (etsv->full_header, column.column);
- comp_val = (*col->compare)(e_table_model_value_at (etss->source, col->col_idx, row1),
- e_table_model_value_at (etss->source, col->col_idx, row2));
- ascending = column.ascending;
- if (comp_val != 0)
- break;
- }
- if (comp_val == 0) {
- if (row1 < row2)
- comp_val = -1;
- if (row1 > row2)
- comp_val = 1;
- }
- if (!ascending)
- comp_val = -comp_val;
- return comp_val;
-}
-
-
-static void
-etsv_add (ETableSubsetVariable *etssv,
- gint row)
-{
- ETableModel *etm = E_TABLE_MODEL(etssv);
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- ETableSortedVariable *etsv = E_TABLE_SORTED_VARIABLE (etssv);
- int i;
-
- if (etss->n_map + 1 > etssv->n_vals_allocated) {
- etssv->n_vals_allocated += INCREMENT_AMOUNT;
- etss->map_table = g_realloc (etss->map_table, (etssv->n_vals_allocated) * sizeof(int));
- }
- i = etss->n_map;
- if (etsv->sort_idle_id == 0) {
- i = 0;
- while (i < etss->n_map && etsv_compare(etsv, etss->map_table[i], row) < 0)
- i++;
- memmove(etss->map_table + i + 1, etss->map_table + i, (etss->n_map - i) * sizeof(int));
- }
- etss->map_table[i] = row;
- etss->n_map++;
-
- e_table_model_row_inserted (etm, i);
-}
-
-static void
-etsv_add_all (ETableSubsetVariable *etssv)
-{
- ETableModel *etm = E_TABLE_MODEL(etssv);
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- ETableSortedVariable *etsv = E_TABLE_SORTED_VARIABLE (etssv);
- int rows;
- int i;
-
- e_table_model_pre_change(etm);
-
- rows = e_table_model_row_count(etss->source);
-
- if (etss->n_map + rows > etssv->n_vals_allocated){
- etssv->n_vals_allocated += MAX(INCREMENT_AMOUNT, rows);
- etss->map_table = g_realloc (etss->map_table, etssv->n_vals_allocated * sizeof(int));
- }
- for (i = 0; i < rows; i++)
- etss->map_table[etss->n_map++] = i;
-
- if (etsv->sort_idle_id == 0) {
- etsv->sort_idle_id = g_idle_add_full(50, (GSourceFunc) etsv_sort_idle, etsv, NULL);
- }
-
- e_table_model_changed (etm);
-}
-
-ETableModel *
-e_table_sorted_variable_new (ETableModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
-{
- ETableSortedVariable *etsv = gtk_type_new (E_TABLE_SORTED_VARIABLE_TYPE);
- ETableSubsetVariable *etssv = E_TABLE_SUBSET_VARIABLE (etsv);
-
- if (e_table_subset_variable_construct (etssv, source) == NULL){
- gtk_object_destroy (GTK_OBJECT (etsv));
- return NULL;
- }
-
- etsv->sort_info = sort_info;
- gtk_object_ref(GTK_OBJECT(etsv->sort_info));
- etsv->full_header = full_header;
- gtk_object_ref(GTK_OBJECT(etsv->full_header));
-
- etsv->table_model_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_changed",
- GTK_SIGNAL_FUNC (etsv_proxy_model_changed), etsv);
-#if 0
- etsv->table_model_row_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_row_changed",
- GTK_SIGNAL_FUNC (etsv_proxy_model_row_changed), etsv);
- etsv->table_model_cell_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_cell_changed",
- GTK_SIGNAL_FUNC (etsv_proxy_model_cell_changed), etsv);
-#endif
- etsv->sort_info_changed_id = gtk_signal_connect (GTK_OBJECT (sort_info), "sort_info_changed",
- GTK_SIGNAL_FUNC (etsv_sort_info_changed), etsv);
-
- return E_TABLE_MODEL(etsv);
-}
-
-static void
-etsv_proxy_model_changed (ETableModel *etm, ETableSortedVariable *etsv)
-{
- /* FIXME: do_resort (); */
-}
-#if 0
-static void
-etsv_proxy_model_row_changed (ETableModel *etm, int row, ETableSortedVariable *etsv)
-{
- ETableSubsetVariable *etssv = E_TABLE_SUBSET_VARIABLE(etsv);
-
- if (e_table_subset_variable_remove(etssv, row))
- e_table_subset_variable_add (etssv, row);
-}
-
-static void
-etsv_proxy_model_cell_changed (ETableModel *etm, int col, int row, ETableSortedVariable *etsv)
-{
- ETableSubsetVariable *etssv = E_TABLE_SUBSET_VARIABLE(etsv);
-
- if (e_table_subset_variable_remove(etssv, row))
- e_table_subset_variable_add (etssv, row);
-}
-#endif
-
-static void
-etsv_sort_info_changed (ETableSortInfo *info, ETableSortedVariable *etsv)
-{
- etsv_sort(etsv);
-}
-
-static ETableSortedVariable *etsv_closure;
-void **vals_closure;
-int cols_closure;
-int *ascending_closure;
-GCompareFunc *compare_closure;
-
-/* FIXME: Make it not cache the second and later columns (as if anyone cares.) */
-
-static int
-qsort_callback(const void *data1, const void *data2)
-{
- gint row1 = *(int *)data1;
- gint row2 = *(int *)data2;
- int j;
- int sort_count = e_table_sort_info_sorting_get_count(etsv_closure->sort_info);
- int comp_val = 0;
- int ascending = 1;
- for (j = 0; j < sort_count; j++) {
- comp_val = (*(compare_closure[j]))(vals_closure[cols_closure * row1 + j], vals_closure[cols_closure * row2 + j]);
- ascending = ascending_closure[j];
- if (comp_val != 0)
- break;
- }
- if (comp_val == 0) {
- if (row1 < row2)
- comp_val = -1;
- if (row1 > row2)
- comp_val = 1;
- }
- if (!ascending)
- comp_val = -comp_val;
- return comp_val;
-}
-
-
-static void
-etsv_sort(ETableSortedVariable *etsv)
-{
- ETableSubset *etss = E_TABLE_SUBSET(etsv);
- static int reentering = 0;
- int rows = E_TABLE_SUBSET(etsv)->n_map;
- int total_rows;
- int i;
- int j;
- int cols;
- if (reentering)
- return;
- reentering = 1;
-
- e_table_model_pre_change(E_TABLE_MODEL(etsv));
-
- total_rows = e_table_model_row_count(E_TABLE_SUBSET(etsv)->source);
- cols = e_table_sort_info_sorting_get_count(etsv->sort_info);
- cols_closure = cols;
- etsv_closure = etsv;
- vals_closure = g_new(void *, total_rows * cols);
- ascending_closure = g_new(int, cols);
- compare_closure = g_new(GCompareFunc, cols);
- for (j = 0; j < cols; j++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(etsv->sort_info, j);
- ETableCol *col;
- if (column.column > e_table_header_count (etsv->full_header))
- col = e_table_header_get_column (etsv->full_header, e_table_header_count (etsv->full_header) - 1);
- else
- col = e_table_header_get_column (etsv->full_header, column.column);
- for (i = 0; i < rows; i++) {
-#if 0
- if( !(i & 0xff) ) {
- while(gtk_events_pending())
- gtk_main_iteration();
- }
-#endif
- vals_closure[E_TABLE_SUBSET(etsv)->map_table[i] * cols + j] = e_table_model_value_at (etss->source, col->col_idx, E_TABLE_SUBSET(etsv)->map_table[i]);
- }
- compare_closure[j] = col->compare;
- ascending_closure[j] = column.ascending;
- }
- qsort(E_TABLE_SUBSET(etsv)->map_table, rows, sizeof(int), qsort_callback);
- g_free(vals_closure);
- g_free(ascending_closure);
- g_free(compare_closure);
- e_table_model_changed (E_TABLE_MODEL(etsv));
- reentering = 0;
-}
diff --git a/widgets/table/e-table-sorted-variable.h b/widgets/table/e-table-sorted-variable.h
deleted file mode 100644
index c6a57c5ede..0000000000
--- a/widgets/table/e-table-sorted-variable.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SORTED_VARIABLE_H_
-#define _E_TABLE_SORTED_VARIABLE_H_
-
-#include <gtk/gtkobject.h>
-#include "e-table-model.h"
-#include "e-table-subset-variable.h"
-#include "e-table-sort-info.h"
-#include "e-table-header.h"
-
-#define E_TABLE_SORTED_VARIABLE_TYPE (e_table_sorted_variable_get_type ())
-#define E_TABLE_SORTED_VARIABLE(o) (GTK_CHECK_CAST ((o), E_TABLE_SORTED_VARIABLE_TYPE, ETableSortedVariable))
-#define E_TABLE_SORTED_VARIABLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SORTED_VARIABLE_TYPE, ETableSortedVariableClass))
-#define E_IS_TABLE_SORTED_VARIABLE(o) (GTK_CHECK_TYPE ((o), E_TABLE_SORTED_VARIABLE_TYPE))
-#define E_IS_TABLE_SORTED_VARIABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SORTED_VARIABLE_TYPE))
-
-typedef struct {
- ETableSubsetVariable base;
-
- ETableSortInfo *sort_info;
-
- ETableHeader *full_header;
-
- int table_model_changed_id;
- int table_model_row_changed_id;
- int table_model_cell_changed_id;
- int sort_info_changed_id;
- int sort_idle_id;
-} ETableSortedVariable;
-
-typedef struct {
- ETableSubsetVariableClass parent_class;
-} ETableSortedVariableClass;
-
-GtkType e_table_sorted_variable_get_type (void);
-ETableModel *e_table_sorted_variable_new (ETableModel *etm, ETableHeader *header, ETableSortInfo *sort_info);
-
-#endif /* _E_TABLE_SORTED_VARIABLE_H_ */
diff --git a/widgets/table/e-table-sorted.c b/widgets/table/e-table-sorted.c
deleted file mode 100644
index c754f4cff7..0000000000
--- a/widgets/table/e-table-sorted.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * E-table-sorted.c: Implements a table that sorts another table
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <stdlib.h>
-#include "e-util/e-util.h"
-#include "e-table-sorted.h"
-
-#define PARENT_TYPE E_TABLE_SUBSET_TYPE
-
-static ETableSubsetClass *ets_parent_class;
-
-static void
-ets_class_init (GtkObjectClass *klass)
-{
- ets_parent_class = gtk_type_class (PARENT_TYPE);
-}
-
-E_MAKE_TYPE(e_table_sorted, "ETableSorted", ETableSorted, ets_class_init, NULL, PARENT_TYPE);
-
-static ETableSorted *sort_ets;
-
-static int
-my_sort (const void *a, const void *b)
-{
- ETableModel *source = E_TABLE_SUBSET (sort_ets)->source;
- const int *ia = (const int *) a;
- const int *ib = (const int *) b;
- void *va, *vb;
-
- va = e_table_model_value_at (source, sort_ets->sort_col, *ia);
- vb = e_table_model_value_at (source, sort_ets->sort_col, *ib);
-
- return (*sort_ets->compare) (va, vb);
-}
-
-static void
-do_sort (ETableSorted *ets)
-{
- ETableSubset *etss = E_TABLE_SUBSET (ets);
- g_assert (sort_ets == NULL);
-
- sort_ets = ets;
- qsort (etss->map_table, etss->n_map, sizeof (unsigned int), my_sort);
- sort_ets = NULL;
-}
-
-ETableModel *
-e_table_sorted_new (ETableModel *source, int col, GCompareFunc compare)
-{
- ETableSorted *ets = gtk_type_new (E_TABLE_SORTED_TYPE);
- ETableSubset *etss = E_TABLE_SUBSET (ets);
- const int nvals = e_table_model_row_count (source);
- int i;
-
- if (e_table_subset_construct (etss, source, nvals) == NULL){
- gtk_object_destroy (GTK_OBJECT (ets));
- return NULL;
- }
-
- ets->compare = compare;
- ets->sort_col = col;
-
- /* Init */
- for (i = 0; i < nvals; i++)
- etss->map_table [i] = i;
-
- do_sort (ets);
-
- return (ETableModel *) ets;
-}
-
-void
-e_table_sorted_resort (ETableSorted *ets, int col, GCompareFunc compare)
-{
- if (col == -1 || compare == NULL)
- do_sort (ets);
- else {
- ets->sort_col = col;
- ets->compare = compare;
- do_sort (ets);
- }
-}
-
diff --git a/widgets/table/e-table-sorted.h b/widgets/table/e-table-sorted.h
deleted file mode 100644
index 92bd8d1522..0000000000
--- a/widgets/table/e-table-sorted.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _E_TABLE_SORTED_H_
-#define _E_TABLE_SORTED_H_
-
-#include <gtk/gtkobject.h>
-#include "e-table-model.h"
-#include "e-table-subset.h"
-
-#define E_TABLE_SORTED_TYPE (e_table_sorted_get_type ())
-#define E_TABLE_SORTED(o) (GTK_CHECK_CAST ((o), E_TABLE_SORTED_TYPE, ETableSorted))
-#define E_TABLE_SORTED_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SORTED_TYPE, ETableSortedClass))
-#define E_IS_TABLE_SORTED(o) (GTK_CHECK_TYPE ((o), E_TABLE_SORTED_TYPE))
-#define E_IS_TABLE_SORTED_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SORTED_TYPE))
-
-typedef struct {
- ETableSubset base;
-
- short sort_col;
- GCompareFunc compare;
-} ETableSorted;
-
-typedef struct {
- ETableSubsetClass parent_class;
-} ETableSortedClass;
-
-GtkType e_table_sorted_get_type (void);
-ETableModel *e_table_sorted_new (ETableModel *etm, int col, GCompareFunc compare);
-void e_table_sorted_resort (ETableSorted *ets, int col, GCompareFunc compare);
-
-#endif /* _E_TABLE_SORTED_H_ */
diff --git a/widgets/table/e-table-sorter.c b/widgets/table/e-table-sorter.c
deleted file mode 100644
index eb2391b0d0..0000000000
--- a/widgets/table/e-table-sorter.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-sorted.c: Implements a table that sorts another table
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtksignal.h>
-#include <string.h>
-#include "e-util/e-util.h"
-#include "e-table-sorter.h"
-
-#define PARENT_TYPE gtk_object_get_type()
-
-#define INCREMENT_AMOUNT 100
-
-static GtkObjectClass *parent_class;
-
-static void ets_model_changed (ETableModel *etm, ETableSorter *ets);
-static void ets_model_row_changed (ETableModel *etm, int row, ETableSorter *ets);
-static void ets_model_cell_changed (ETableModel *etm, int col, int row, ETableSorter *ets);
-static void ets_sort_info_changed (ETableSortInfo *info, ETableSorter *ets);
-static void ets_clean (ETableSorter *ets);
-static void ets_sort (ETableSorter *ets);
-static void ets_backsort (ETableSorter *ets);
-
-static void
-ets_destroy (GtkObject *object)
-{
- ETableSorter *ets = E_TABLE_SORTER (object);
-
- gtk_signal_disconnect (GTK_OBJECT (ets->source),
- ets->table_model_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (ets->source),
- ets->table_model_row_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (ets->source),
- ets->table_model_cell_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (ets->sort_info),
- ets->sort_info_changed_id);
-
- ets->table_model_changed_id = 0;
- ets->table_model_row_changed_id = 0;
- ets->table_model_cell_changed_id = 0;
- ets->sort_info_changed_id = 0;
-
- if (ets->sort_info)
- gtk_object_unref(GTK_OBJECT(ets->sort_info));
- if (ets->full_header)
- gtk_object_unref(GTK_OBJECT(ets->full_header));
- if (ets->source)
- gtk_object_unref(GTK_OBJECT(ets->source));
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-static void
-ets_class_init (ETableSorterClass *klass)
-{
- GtkObjectClass *object_class = GTK_OBJECT_CLASS(klass);
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = ets_destroy;
-}
-
-static void
-ets_init (ETableSorter *ets)
-{
- ets->full_header = NULL;
- ets->sort_info = NULL;
- ets->source = NULL;
-
- ets->needs_sorting = -1;
-
- ets->table_model_changed_id = 0;
- ets->table_model_row_changed_id = 0;
- ets->table_model_cell_changed_id = 0;
- ets->sort_info_changed_id = 0;
-}
-
-E_MAKE_TYPE(e_table_sorter, "ETableSorter", ETableSorter, ets_class_init, ets_init, PARENT_TYPE);
-
-ETableSorter *
-e_table_sorter_new (ETableModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
-{
- ETableSorter *ets = gtk_type_new (E_TABLE_SORTER_TYPE);
-
- ets->sort_info = sort_info;
- gtk_object_ref(GTK_OBJECT(ets->sort_info));
- ets->full_header = full_header;
- gtk_object_ref(GTK_OBJECT(ets->full_header));
- ets->source = source;
- gtk_object_ref(GTK_OBJECT(ets->source));
-
- ets->table_model_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_changed",
- GTK_SIGNAL_FUNC (ets_model_changed), ets);
- ets->table_model_row_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_row_changed",
- GTK_SIGNAL_FUNC (ets_model_row_changed), ets);
- ets->table_model_cell_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_cell_changed",
- GTK_SIGNAL_FUNC (ets_model_cell_changed), ets);
- ets->sort_info_changed_id = gtk_signal_connect (GTK_OBJECT (sort_info), "sort_info_changed",
- GTK_SIGNAL_FUNC (ets_sort_info_changed), ets);
-
- return ets;
-}
-
-static void
-ets_model_changed (ETableModel *etm, ETableSorter *ets)
-{
- ets_clean(ets);
-}
-
-static void
-ets_model_row_changed (ETableModel *etm, int row, ETableSorter *ets)
-{
- ets_clean(ets);
-}
-
-static void
-ets_model_cell_changed (ETableModel *etm, int col, int row, ETableSorter *ets)
-{
- ets_clean(ets);
-}
-
-static void
-ets_sort_info_changed (ETableSortInfo *info, ETableSorter *ets)
-{
- ets_clean(ets);
-}
-
-static ETableSorter *ets_closure;
-void **vals_closure;
-int cols_closure;
-int *ascending_closure;
-GCompareFunc *compare_closure;
-
-/* FIXME: Make it not cache the second and later columns (as if anyone cares.) */
-
-static int
-qsort_callback(const void *data1, const void *data2)
-{
- gint row1 = *(int *)data1;
- gint row2 = *(int *)data2;
- int j;
- int sort_count = e_table_sort_info_sorting_get_count(ets_closure->sort_info) + e_table_sort_info_grouping_get_count(ets_closure->sort_info);
- int comp_val = 0;
- int ascending = 1;
- for (j = 0; j < sort_count; j++) {
- comp_val = (*(compare_closure[j]))(vals_closure[cols_closure * row1 + j], vals_closure[cols_closure * row2 + j]);
- ascending = ascending_closure[j];
- if (comp_val != 0)
- break;
- }
- if (comp_val == 0) {
- if (row1 < row2)
- comp_val = -1;
- if (row1 > row2)
- comp_val = 1;
- }
- if (!ascending)
- comp_val = -comp_val;
- return comp_val;
-}
-
-static void
-ets_clean(ETableSorter *ets)
-{
- g_free(ets->sorted);
- ets->sorted = NULL;
-
- g_free(ets->backsorted);
- ets->backsorted = NULL;
-
- ets->needs_sorting = -1;
-}
-
-static void
-ets_sort(ETableSorter *ets)
-{
- int rows;
- int i;
- int j;
- int cols;
- int group_cols;
-
- if (ets->sorted)
- return;
-
- rows = e_table_model_row_count(ets->source);
- group_cols = e_table_sort_info_grouping_get_count(ets->sort_info);
- cols = e_table_sort_info_sorting_get_count(ets->sort_info) + group_cols;
-
- ets->sorted = g_new(int, rows);
- for (i = 0; i < rows; i++)
- ets->sorted[i] = i;
-
- cols_closure = cols;
- ets_closure = ets;
-
- vals_closure = g_new(void *, rows * cols);
- ascending_closure = g_new(int, cols);
- compare_closure = g_new(GCompareFunc, cols);
-
- for (j = 0; j < cols; j++) {
- ETableSortColumn column;
- ETableCol *col;
-
- if (j < group_cols)
- column = e_table_sort_info_grouping_get_nth(ets->sort_info, j);
- else
- column = e_table_sort_info_sorting_get_nth(ets->sort_info, j - group_cols);
-
- if (column.column > e_table_header_count (ets->full_header))
- col = e_table_header_get_column (ets->full_header, e_table_header_count (ets->full_header) - 1);
- else
- col = e_table_header_get_column (ets->full_header, column.column);
-
- for (i = 0; i < rows; i++) {
- vals_closure[i * cols + j] = e_table_model_value_at (ets->source, col->col_idx, i);
- }
-
- compare_closure[j] = col->compare;
- ascending_closure[j] = column.ascending;
- }
- qsort(ets->sorted, rows, sizeof(int), qsort_callback);
-
- g_free(vals_closure);
- g_free(ascending_closure);
- g_free(compare_closure);
-}
-
-static void
-ets_backsort(ETableSorter *ets)
-{
- int i, rows;
-
- if (ets->backsorted)
- return;
-
- ets_sort(ets);
-
- rows = e_table_model_row_count(ets->source);
- ets->backsorted = g_new0(int, rows);
-
- for (i = 0; i < rows; i++) {
- ets->backsorted[ets->sorted[i]] = i;
- }
-}
-
-gboolean
-e_table_sorter_needs_sorting(ETableSorter *ets)
-{
- if (ets->needs_sorting < 0) {
- if (e_table_sort_info_sorting_get_count(ets->sort_info) + e_table_sort_info_grouping_get_count(ets->sort_info))
- ets->needs_sorting = 1;
- else
- ets->needs_sorting = 0;
- }
- return ets->needs_sorting;
-}
-
-
-gint
-e_table_sorter_model_to_sorted (ETableSorter *sorter, int row)
-{
- int rows = e_table_model_row_count(sorter->source);
-
- g_return_val_if_fail(row >= 0, -1);
- g_return_val_if_fail(row < rows, -1);
-
- if (e_table_sorter_needs_sorting(sorter)) {
- ets_backsort(sorter);
- return sorter->backsorted[row];
- } else
- return row;
-}
-
-gint
-e_table_sorter_sorted_to_model (ETableSorter *sorter, int row)
-{
- int rows = e_table_model_row_count(sorter->source);
-
- g_return_val_if_fail(row >= 0, -1);
- g_return_val_if_fail(row < rows, -1);
-
- if (e_table_sorter_needs_sorting(sorter)) {
- ets_sort(sorter);
- return sorter->sorted[row];
- } else
- return row;
-}
diff --git a/widgets/table/e-table-sorter.h b/widgets/table/e-table-sorter.h
deleted file mode 100644
index f5a71565a3..0000000000
--- a/widgets/table/e-table-sorter.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SORTER_H_
-#define _E_TABLE_SORTER_H_
-
-#include <gtk/gtkobject.h>
-#include "e-table-model.h"
-#include "e-table-subset-variable.h"
-#include "e-table-sort-info.h"
-#include "e-table-header.h"
-
-#define E_TABLE_SORTER_TYPE (e_table_sorter_get_type ())
-#define E_TABLE_SORTER(o) (GTK_CHECK_CAST ((o), E_TABLE_SORTER_TYPE, ETableSorter))
-#define E_TABLE_SORTER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SORTER_TYPE, ETableSorterClass))
-#define E_IS_TABLE_SORTER(o) (GTK_CHECK_TYPE ((o), E_TABLE_SORTER_TYPE))
-#define E_IS_TABLE_SORTER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SORTER_TYPE))
-
-typedef struct {
- GtkObject base;
-
- ETableModel *source;
- ETableHeader *full_header;
- ETableSortInfo *sort_info;
-
- int needs_sorting;
-
- int *sorted;
- int *backsorted;
-
- int table_model_changed_id;
- int table_model_row_changed_id;
- int table_model_cell_changed_id;
- int sort_info_changed_id;
-} ETableSorter;
-
-typedef struct {
- GtkObjectClass parent_class;
-} ETableSorterClass;
-
-GtkType e_table_sorter_get_type (void);
-ETableSorter *e_table_sorter_new (ETableModel *etm, ETableHeader *full_header, ETableSortInfo *sort_info);
-
-gint e_table_sorter_model_to_sorted (ETableSorter *sorter, int row);
-gint e_table_sorter_sorted_to_model (ETableSorter *sorter, int row);
-
-gboolean e_table_sorter_needs_sorting (ETableSorter *sorter);
-
-#endif /* _E_TABLE_SORTER_H_ */
diff --git a/widgets/table/e-table-subset-variable.c b/widgets/table/e-table-subset-variable.c
deleted file mode 100644
index d429604301..0000000000
--- a/widgets/table/e-table-subset-variable.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-subset.c: Implements a table that contains a subset of another table.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtksignal.h>
-#include <string.h>
-#include "e-util/e-util.h"
-#include "e-table-subset-variable.h"
-
-#define ETSSV_CLASS(e) ((ETableSubsetVariableClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE E_TABLE_SUBSET_TYPE
-
-#define INCREMENT_AMOUNT 10
-
-static ETableSubsetClass *etssv_parent_class;
-
-static void
-etssv_add (ETableSubsetVariable *etssv,
- gint row)
-{
- ETableModel *etm = E_TABLE_MODEL(etssv);
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
-
- e_table_model_pre_change(etm);
-
- if (etss->n_map + 1 > etssv->n_vals_allocated){
- etss->map_table = g_realloc (etss->map_table, (etssv->n_vals_allocated + INCREMENT_AMOUNT) * sizeof(int));
- etssv->n_vals_allocated += INCREMENT_AMOUNT;
- }
-
- etss->map_table[etss->n_map++] = row;
-
- e_table_model_row_inserted (etm, etss->n_map - 1);
-}
-
-static void
-etssv_add_all (ETableSubsetVariable *etssv)
-{
- ETableModel *etm = E_TABLE_MODEL(etssv);
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- int rows;
- int i;
-
- e_table_model_pre_change(etm);
-
- rows = e_table_model_row_count(etss->source);
- if (etss->n_map + rows > etssv->n_vals_allocated){
- etssv->n_vals_allocated += MAX(INCREMENT_AMOUNT, rows);
- etss->map_table = g_realloc (etss->map_table, etssv->n_vals_allocated * sizeof(int));
- }
- for (i = 0; i < rows; i++)
- etss->map_table[etss->n_map++] = i;
-
- e_table_model_changed (etm);
-}
-
-static gboolean
-etssv_remove (ETableSubsetVariable *etssv,
- gint row)
-{
- ETableModel *etm = E_TABLE_MODEL(etssv);
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- int i;
-
- for (i = 0; i < etss->n_map; i++){
- if (etss->map_table[i] == row) {
- e_table_model_pre_change (etm);
- memmove (etss->map_table + i, etss->map_table + i + 1, (etss->n_map - i - 1) * sizeof(int));
- etss->n_map --;
-
- e_table_model_row_deleted (etm, i);
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static void
-etssv_class_init (GtkObjectClass *object_class)
-{
- ETableSubsetVariableClass *klass = E_TABLE_SUBSET_VARIABLE_CLASS(object_class);
- etssv_parent_class = gtk_type_class (PARENT_TYPE);
-
- klass->add = etssv_add;
- klass->add_all = etssv_add_all;
- klass->remove = etssv_remove;
-}
-
-E_MAKE_TYPE(e_table_subset_variable, "ETableSubsetVariable", ETableSubsetVariable, etssv_class_init, NULL, PARENT_TYPE);
-
-ETableModel *
-e_table_subset_variable_construct (ETableSubsetVariable *etssv,
- ETableModel *source)
-{
- if (e_table_subset_construct (E_TABLE_SUBSET(etssv), source, 1) == NULL)
- return NULL;
- E_TABLE_SUBSET(etssv)->n_map = 0;
-
- return E_TABLE_MODEL (etssv);
-}
-
-ETableModel *
-e_table_subset_variable_new (ETableModel *source)
-{
- ETableSubsetVariable *etssv = gtk_type_new (E_TABLE_SUBSET_VARIABLE_TYPE);
-
- if (e_table_subset_variable_construct (etssv, source) == NULL){
- gtk_object_destroy (GTK_OBJECT (etssv));
- return NULL;
- }
-
- return (ETableModel *) etssv;
-}
-
-void
-e_table_subset_variable_add (ETableSubsetVariable *etssv,
- gint row)
-{
- g_return_if_fail (etssv != NULL);
- g_return_if_fail (E_IS_TABLE_SUBSET_VARIABLE(etssv));
-
- if (ETSSV_CLASS(etssv)->add)
- ETSSV_CLASS (etssv)->add (etssv, row);
-}
-
-void
-e_table_subset_variable_add_all (ETableSubsetVariable *etssv)
-{
- g_return_if_fail (etssv != NULL);
- g_return_if_fail (E_IS_TABLE_SUBSET_VARIABLE(etssv));
-
- if (ETSSV_CLASS(etssv)->add_all)
- ETSSV_CLASS (etssv)->add_all (etssv);
-}
-
-gboolean
-e_table_subset_variable_remove (ETableSubsetVariable *etssv,
- gint row)
-{
- g_return_val_if_fail (etssv != NULL, FALSE);
- g_return_val_if_fail (E_IS_TABLE_SUBSET_VARIABLE(etssv), FALSE);
-
- if (ETSSV_CLASS(etssv)->remove)
- return ETSSV_CLASS (etssv)->remove (etssv, row);
- else
- return FALSE;
-}
-
-void
-e_table_subset_variable_increment (ETableSubsetVariable *etssv,
- gint position,
- gint amount)
-{
- int i;
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- for (i = 0; i < etss->n_map; i++) {
- if (etss->map_table[i] > position)
- etss->map_table[i] += amount;
- }
-}
-
-void
-e_table_subset_variable_decrement (ETableSubsetVariable *etssv,
- gint position,
- gint amount)
-{
- int i;
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- for (i = 0; i < etss->n_map; i++) {
- if (etss->map_table[i] > position)
- etss->map_table[i] -= amount;
- }
-}
-
-void
-e_table_subset_variable_set_allocation (ETableSubsetVariable *etssv,
- gint total)
-{
- ETableSubset *etss = E_TABLE_SUBSET(etssv);
- if (total <= 0)
- total = 1;
- if (total > etss->n_map){
- etss->map_table = g_realloc (etss->map_table, total * sizeof(int));
- }
-}
diff --git a/widgets/table/e-table-subset-variable.h b/widgets/table/e-table-subset-variable.h
deleted file mode 100644
index 9d44828728..0000000000
--- a/widgets/table/e-table-subset-variable.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SUBSET_VARIABLE_H_
-#define _E_TABLE_SUBSET_VARIABLE_H_
-
-#include <gtk/gtkobject.h>
-#include "e-table-subset.h"
-
-#define E_TABLE_SUBSET_VARIABLE_TYPE (e_table_subset_variable_get_type ())
-#define E_TABLE_SUBSET_VARIABLE(o) (GTK_CHECK_CAST ((o), E_TABLE_SUBSET_VARIABLE_TYPE, ETableSubsetVariable))
-#define E_TABLE_SUBSET_VARIABLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SUBSET_VARIABLE_TYPE, ETableSubsetVariableClass))
-#define E_IS_TABLE_SUBSET_VARIABLE(o) (GTK_CHECK_TYPE ((o), E_TABLE_SUBSET_VARIABLE_TYPE))
-#define E_IS_TABLE_SUBSET_VARIABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SUBSET_VARIABLE_TYPE))
-
-typedef struct {
- ETableSubset base;
-
- int n_vals_allocated;
-} ETableSubsetVariable;
-
-typedef struct {
- ETableSubsetClass parent_class;
-
- void (*add) (ETableSubsetVariable *ets,
- gint row);
- void (*add_all) (ETableSubsetVariable *ets);
- gboolean (*remove) (ETableSubsetVariable *ets,
- gint row);
-} ETableSubsetVariableClass;
-
-GtkType e_table_subset_variable_get_type (void);
-ETableModel *e_table_subset_variable_new (ETableModel *etm);
-ETableModel *e_table_subset_variable_construct (ETableSubsetVariable *etssv,
- ETableModel *source);
-void e_table_subset_variable_add (ETableSubsetVariable *ets,
- gint row);
-void e_table_subset_variable_add_all (ETableSubsetVariable *ets);
-gboolean e_table_subset_variable_remove (ETableSubsetVariable *ets,
- gint row);
-void e_table_subset_variable_increment (ETableSubsetVariable *ets,
- gint position,
- gint amount);
-void e_table_subset_variable_decrement (ETableSubsetVariable *ets,
- gint position,
- gint amount);
-void e_table_subset_variable_set_allocation (ETableSubsetVariable *ets,
- gint total);
-#endif /* _E_TABLE_SUBSET_VARIABLE_H_ */
-
diff --git a/widgets/table/e-table-subset.c b/widgets/table/e-table-subset.c
deleted file mode 100644
index 1cac0f88ea..0000000000
--- a/widgets/table/e-table-subset.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table-subset.c: Implements a table that contains a subset of another table.
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- *
- * (C) 1999 Helix Code, Inc.
- */
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtksignal.h>
-#include "e-util/e-util.h"
-#include "e-table-subset.h"
-
-#define PARENT_TYPE E_TABLE_MODEL_TYPE
-
-static ETableModelClass *etss_parent_class;
-
-static void
-etss_destroy (GtkObject *object)
-{
- ETableSubset *etss = E_TABLE_SUBSET (object);
-
- if (etss->source)
- gtk_object_unref (GTK_OBJECT (etss->source));
-
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etss->table_model_pre_change_id);
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etss->table_model_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etss->table_model_row_changed_id);
- gtk_signal_disconnect (GTK_OBJECT (etss->source),
- etss->table_model_cell_changed_id);
-
- etss->table_model_pre_change_id = 0;
- etss->table_model_changed_id = 0;
- etss->table_model_row_changed_id = 0;
- etss->table_model_cell_changed_id = 0;
-
- g_free (etss->map_table);
-
- GTK_OBJECT_CLASS (etss_parent_class)->destroy (object);
-}
-
-static int
-etss_column_count (ETableModel *etm)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_column_count (etss->source);
-}
-
-static int
-etss_row_count (ETableModel *etm)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return etss->n_map;
-}
-
-static void *
-etss_value_at (ETableModel *etm, int col, int row)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_value_at (etss->source, col, etss->map_table [row]);
-}
-
-static void
-etss_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_set_value_at (etss->source, col, etss->map_table [row], val);
-}
-
-static gboolean
-etss_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_is_cell_editable (etss->source, col, etss->map_table [row]);
-}
-
-static void
-etss_append_row (ETableModel *etm, ETableModel *source, int row)
-{
- ETableSubset *etss = (ETableSubset *)etm;
- e_table_model_append_row (etss->source, source, row);
-}
-
-static void *
-etss_duplicate_value (ETableModel *etm, int col, const void *value)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_duplicate_value (etss->source, col, value);
-}
-
-static void
-etss_free_value (ETableModel *etm, int col, void *value)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- e_table_model_free_value (etss->source, col, value);
-}
-
-static void *
-etss_initialize_value (ETableModel *etm, int col)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_initialize_value (etss->source, col);
-}
-
-static gboolean
-etss_value_is_empty (ETableModel *etm, int col, const void *value)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_value_is_empty (etss->source, col, value);
-}
-
-static char *
-etss_value_to_string (ETableModel *etm, int col, const void *value)
-{
- ETableSubset *etss = (ETableSubset *)etm;
-
- return e_table_model_value_to_string (etss->source, col, value);
-}
-
-static void
-etss_class_init (GtkObjectClass *klass)
-{
- ETableModelClass *table_class = (ETableModelClass *) klass;
-
- etss_parent_class = gtk_type_class (PARENT_TYPE);
-
- klass->destroy = etss_destroy;
-
- table_class->column_count = etss_column_count;
- table_class->row_count = etss_row_count;
- table_class->value_at = etss_value_at;
- table_class->set_value_at = etss_set_value_at;
- table_class->is_cell_editable = etss_is_cell_editable;
- table_class->append_row = etss_append_row;
- table_class->duplicate_value = etss_duplicate_value;
- table_class->free_value = etss_free_value;
- table_class->initialize_value = etss_initialize_value;
- table_class->value_is_empty = etss_value_is_empty;
- table_class->value_to_string = etss_value_to_string;
-}
-
-E_MAKE_TYPE(e_table_subset, "ETableSubset", ETableSubset, etss_class_init, NULL, PARENT_TYPE);
-
-static void
-etss_proxy_model_pre_change (ETableModel *etm, ETableSubset *etss)
-{
- e_table_model_pre_change (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_changed (ETableModel *etm, ETableSubset *etss)
-{
- e_table_model_changed (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_row_changed (ETableModel *etm, int row, ETableSubset *etss)
-{
- const int n = etss->n_map;
- const int * const map_table = etss->map_table;
- int i;
-
- for (i = 0; i < n; i++){
- if (map_table [i] == row){
- e_table_model_row_changed (E_TABLE_MODEL (etss), i);
- return;
- }
- }
-}
-
-static void
-etss_proxy_model_cell_changed (ETableModel *etm, int col, int row, ETableSubset *etss)
-{
- const int n = etss->n_map;
- const int * const map_table = etss->map_table;
- int i;
-
- for (i = 0; i < n; i++){
- if (map_table [i] == row){
- e_table_model_cell_changed (E_TABLE_MODEL (etss), col, i);
- return;
- }
- }
-}
-
-ETableModel *
-e_table_subset_construct (ETableSubset *etss, ETableModel *source, int nvals)
-{
- unsigned int *buffer;
- int i;
-
- buffer = (unsigned int *) g_malloc (sizeof (unsigned int) * nvals);
- if (buffer == NULL)
- return NULL;
- etss->map_table = buffer;
- etss->n_map = nvals;
- etss->source = source;
- gtk_object_ref (GTK_OBJECT (source));
-
- /* Init */
- for (i = 0; i < nvals; i++)
- etss->map_table [i] = i;
-
- etss->table_model_pre_change_id = gtk_signal_connect (GTK_OBJECT (source), "model_pre_change",
- GTK_SIGNAL_FUNC (etss_proxy_model_pre_change), etss);
- etss->table_model_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_changed",
- GTK_SIGNAL_FUNC (etss_proxy_model_changed), etss);
- etss->table_model_row_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_row_changed",
- GTK_SIGNAL_FUNC (etss_proxy_model_row_changed), etss);
- etss->table_model_cell_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_cell_changed",
- GTK_SIGNAL_FUNC (etss_proxy_model_cell_changed), etss);
-
- return E_TABLE_MODEL (etss);
-}
-
-ETableModel *
-e_table_subset_new (ETableModel *source, const int nvals)
-{
- ETableSubset *etss = gtk_type_new (E_TABLE_SUBSET_TYPE);
-
- if (e_table_subset_construct (etss, source, nvals) == NULL){
- gtk_object_destroy (GTK_OBJECT (etss));
- return NULL;
- }
-
- return (ETableModel *) etss;
-}
-
-ETableModel *
-e_table_subset_get_toplevel (ETableSubset *table)
-{
- g_return_val_if_fail (table != NULL, NULL);
- g_return_val_if_fail (E_IS_TABLE_SUBSET (table), NULL);
-
- if (E_IS_TABLE_SUBSET (table->source))
- return e_table_subset_get_toplevel (E_TABLE_SUBSET (table->source));
- else
- return table->source;
-}
diff --git a/widgets/table/e-table-subset.h b/widgets/table/e-table-subset.h
deleted file mode 100644
index 9e10de7a4b..0000000000
--- a/widgets/table/e-table-subset.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_SUBSET_H_
-#define _E_TABLE_SUBSET_H_
-
-#include <gtk/gtkobject.h>
-#include "e-table-model.h"
-
-#define E_TABLE_SUBSET_TYPE (e_table_subset_get_type ())
-#define E_TABLE_SUBSET(o) (GTK_CHECK_CAST ((o), E_TABLE_SUBSET_TYPE, ETableSubset))
-#define E_TABLE_SUBSET_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_SUBSET_TYPE, ETableSubsetClass))
-#define E_IS_TABLE_SUBSET(o) (GTK_CHECK_TYPE ((o), E_TABLE_SUBSET_TYPE))
-#define E_IS_TABLE_SUBSET_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SUBSET_TYPE))
-
-typedef struct {
- ETableModel base;
-
- ETableModel *source;
- int n_map;
- int *map_table;
-
- int table_model_pre_change_id;
- int table_model_changed_id;
- int table_model_row_changed_id;
- int table_model_cell_changed_id;
-} ETableSubset;
-
-typedef struct {
- ETableModelClass parent_class;
-} ETableSubsetClass;
-
-GtkType e_table_subset_get_type (void);
-ETableModel *e_table_subset_new (ETableModel *etm, int n_vals);
-ETableModel *e_table_subset_construct (ETableSubset *ets, ETableModel *source, int nvals);
-
-ETableModel *e_table_subset_get_toplevel (ETableSubset *table_model);
-
-#endif /* _E_TABLE_SUBSET_H_ */
-
diff --git a/widgets/table/e-table-text-model.c b/widgets/table/e-table-text-model.c
deleted file mode 100644
index 5b6fa8b707..0000000000
--- a/widgets/table/e-table-text-model.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ETableTextModel - Text item model for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#include <config.h>
-#include <ctype.h>
-#include "e-table-text-model.h"
-
-static void e_table_text_model_class_init (ETableTextModelClass *class);
-static void e_table_text_model_init (ETableTextModel *model);
-static void e_table_text_model_destroy (GtkObject *object);
-
-static gchar *e_table_text_model_get_text (ETextModel *model);
-static void e_table_text_model_set_text (ETextModel *model, gchar *text);
-static void e_table_text_model_insert (ETextModel *model, gint postion, gchar *text);
-static void e_table_text_model_insert_length (ETextModel *model, gint postion, gchar *text, gint length);
-static void e_table_text_model_delete (ETextModel *model, gint postion, gint length);
-
-static GtkObject *parent_class;
-
-
-
-/**
- * e_table_text_model_get_type:
- * @void:
- *
- * Registers the &ETableTextModel class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ETableTextModel class.
- **/
-GtkType
-e_table_text_model_get_type (void)
-{
- static GtkType model_type = 0;
-
- if (!model_type) {
- GtkTypeInfo model_info = {
- "ETableTextModel",
- sizeof (ETableTextModel),
- sizeof (ETableTextModelClass),
- (GtkClassInitFunc) e_table_text_model_class_init,
- (GtkObjectInitFunc) e_table_text_model_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- model_type = gtk_type_unique (e_text_model_get_type (), &model_info);
- }
-
- return model_type;
-}
-
-/* Class initialization function for the text item */
-static void
-e_table_text_model_class_init (ETableTextModelClass *klass)
-{
- GtkObjectClass *object_class;
- ETextModelClass *model_class;
-
- object_class = (GtkObjectClass *) klass;
- model_class = (ETextModelClass *) klass;
-
- parent_class = gtk_type_class (e_text_model_get_type ());
-
- model_class->get_text = e_table_text_model_get_text;
- model_class->set_text = e_table_text_model_set_text;
- model_class->insert = e_table_text_model_insert;
- model_class->insert_length = e_table_text_model_insert_length;
- model_class->delete = e_table_text_model_delete;
-
- object_class->destroy = e_table_text_model_destroy;
-}
-
-/* Object initialization function for the text item */
-static void
-e_table_text_model_init (ETableTextModel *model)
-{
- model->model = NULL;
- model->row = 0;
- model->model_col = 0;
- model->cell_changed_signal_id = 0;
- model->row_changed_signal_id = 0;
-}
-
-/* Destroy handler for the text item */
-static void
-e_table_text_model_destroy (GtkObject *object)
-{
- ETableTextModel *model;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_TABLE_TEXT_MODEL (object));
-
- model = E_TABLE_TEXT_MODEL (object);
-
- if (model->model)
- g_assert (GTK_IS_OBJECT (model->model));
-
- if (model->cell_changed_signal_id)
- gtk_signal_disconnect (GTK_OBJECT(model->model),
- model->cell_changed_signal_id);
-
- if (model->row_changed_signal_id)
- gtk_signal_disconnect (GTK_OBJECT(model->model),
- model->row_changed_signal_id);
-
- if (model->model)
- gtk_object_unref (GTK_OBJECT(model->model));
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-static gchar *
-e_table_text_model_get_text (ETextModel *text_model)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model)
- return (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- else
- return "";
-}
-
-static void
-e_table_text_model_set_text (ETextModel *text_model, gchar *text)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model)
- e_table_model_set_value_at (model->model, model->model_col, model->row, (void *) text);
-}
-
-static void
-e_table_text_model_insert (ETextModel *text_model, gint position, gchar *text)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model){
- gchar *temp = (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- temp = g_strdup_printf ("%.*s%s%s", position, temp, text, temp + position);
- e_table_model_set_value_at (model->model, model->model_col, model->row, temp);
- g_free (temp);
- }
-}
-
-static void
-e_table_text_model_insert_length (ETextModel *text_model, gint position, gchar *text, gint length)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model){
- gchar *temp = (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- temp = g_strdup_printf ("%.*s%.*s%s", position, temp, length, text, temp + position);
- e_table_model_set_value_at (model->model, model->model_col, model->row, temp);
- g_free (temp);
- }
-}
-
-static void
-e_table_text_model_delete (ETextModel *text_model, gint position, gint length)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model){
- gchar *temp = (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- temp = g_strdup_printf ("%.*s%s", position, temp, temp + position + length);
- e_table_model_set_value_at (model->model, model->model_col, model->row, temp);
- g_free (temp);
- }
-}
-
-static void
-cell_changed (ETableModel *table_model, int model_col, int row, ETableTextModel *model)
-{
- if (model->model_col == model_col &&
- model->row == row)
- e_text_model_changed (E_TEXT_MODEL(model));
-}
-
-static void
-row_changed (ETableModel *table_model, int row, ETableTextModel *model)
-{
- if (model->row == row)
- e_text_model_changed (E_TEXT_MODEL(model));
-}
-
-ETableTextModel *
-e_table_text_model_new (ETableModel *table_model, int row, int model_col)
-{
- ETableTextModel *model = gtk_type_new (e_table_text_model_get_type ());
- model->model = table_model;
- if (model->model){
- gtk_object_ref (GTK_OBJECT(model->model));
- model->cell_changed_signal_id =
- gtk_signal_connect (GTK_OBJECT(model->model),
- "model_cell_changed",
- GTK_SIGNAL_FUNC(cell_changed),
- model);
- model->row_changed_signal_id =
- gtk_signal_connect (GTK_OBJECT(model->model),
- "model_row_changed",
- GTK_SIGNAL_FUNC(row_changed),
- model);
- }
- model->row = row;
- model->model_col = model_col;
- return model;
-}
-
diff --git a/widgets/table/e-table-text-model.h b/widgets/table/e-table-text-model.h
deleted file mode 100644
index dcc9afde7c..0000000000
--- a/widgets/table/e-table-text-model.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ETableTextModel - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#ifndef E_TABLE_TEXT_MODEL_H
-#define E_TABLE_TEXT_MODEL_H
-
-#include <gnome.h>
-#include "e-text-model.h"
-#include "e-table-model.h"
-
-
-BEGIN_GNOME_DECLS
-
-#define E_TYPE_TABLE_TEXT_MODEL (e_table_text_model_get_type ())
-#define E_TABLE_TEXT_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TABLE_TEXT_MODEL, ETableTextModel))
-#define E_TABLE_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TABLE_TEXT_MODEL, ETableTextModelClass))
-#define E_IS_TABLE_TEXT_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TABLE_TEXT_MODEL))
-#define E_IS_TABLE_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_TABLE_TEXT_MODEL))
-
-typedef struct _ETableTextModel ETableTextModel;
-typedef struct _ETableTextModelClass ETableTextModelClass;
-
-struct _ETableTextModel {
- ETextModel parent;
-
- ETableModel *model;
- int row;
- int model_col;
-
- int cell_changed_signal_id;
- int row_changed_signal_id;
-};
-
-struct _ETableTextModelClass {
- ETextModelClass parent_class;
-
-};
-
-
-/* Standard Gtk function */
-GtkType e_table_text_model_get_type (void);
-ETableTextModel *e_table_text_model_new (ETableModel *table_model, int row, int model_col);
-
-END_GNOME_DECLS
-
-#endif
diff --git a/widgets/table/e-table-tree.h b/widgets/table/e-table-tree.h
deleted file mode 100644
index e7e125a6af..0000000000
--- a/widgets/table/e-table-tree.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef _E_TABLE_TREE_H_
-#define _E_TABLE_TREE_H_
-
-typedef struct {
- char *title;
-
- union {
- ETableModel *table;
- GList *children;
- } u;
-
- guint expanded :1;
- guint is_leaf :1;
-} ETableGroup;
-
-ETableGroup *e_table_group_new (const char *title, ETableModel *table);
-ETableGroup *e_table_group_new_leaf (const char *title);
-
-#endif /* _E_TABLE_TREE_H_ */
diff --git a/widgets/table/e-table.c b/widgets/table/e-table.c
deleted file mode 100644
index bd6d7bc60c..0000000000
--- a/widgets/table/e-table.c
+++ /dev/null
@@ -1,1669 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table.c: A graphical view of a Table.
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- * Chris Lahey (clahey@helixcode.com)
- *
- * Copyright 1999, Helix Code, Inc
- */
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
-#include <stdio.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <gtk/gtksignal.h>
-#include <gnome-xml/parser.h>
-#include <gnome-xml/xmlmemory.h>
-
-#include "e-util/e-util.h"
-#include "e-util/e-xml-utils.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-canvas-vbox.h"
-#include "e-table.h"
-#include "e-table-header-item.h"
-#include "e-table-subset.h"
-#include "e-table-item.h"
-#include "e-table-group.h"
-#include "e-table-group-leaf.h"
-#include "e-table-click-to-add.h"
-
-#define COLUMN_HEADER_HEIGHT 16
-
-#define PARENT_TYPE gtk_table_get_type ()
-
-static GtkObjectClass *e_table_parent_class;
-
-enum {
- CURSOR_CHANGE,
- DOUBLE_CLICK,
- RIGHT_CLICK,
- KEY_PRESS,
-
- TABLE_DRAG_BEGIN,
- TABLE_DRAG_END,
- TABLE_DRAG_DATA_GET,
- TABLE_DRAG_DATA_DELETE,
-
- TABLE_DRAG_LEAVE,
- TABLE_DRAG_MOTION,
- TABLE_DRAG_DROP,
- TABLE_DRAG_DATA_RECEIVED,
-
- LAST_SIGNAL
-};
-
-enum {
- ARG_0,
- ARG_TABLE_DRAW_GRID,
- ARG_TABLE_DRAW_FOCUS,
- ARG_CURSOR_MODE,
- ARG_LENGTH_THRESHOLD,
- ARG_CLICK_TO_ADD_MESSAGE,
-};
-
-static gint et_signals [LAST_SIGNAL] = { 0, };
-
-static void e_table_fill_table (ETable *e_table, ETableModel *model);
-static gboolean changed_idle (gpointer data);
-
-static void et_drag_begin (GtkWidget *widget,
- GdkDragContext *context,
- ETable *et);
-static void et_drag_end (GtkWidget *widget,
- GdkDragContext *context,
- ETable *et);
-static void et_drag_data_get(GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETable *et);
-static void et_drag_data_delete(GtkWidget *widget,
- GdkDragContext *context,
- ETable *et);
-
-static void et_drag_leave(GtkWidget *widget,
- GdkDragContext *context,
- guint time,
- ETable *et);
-static gboolean et_drag_motion(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- ETable *et);
-static gboolean et_drag_drop(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- ETable *et);
-static void et_drag_data_received(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETable *et);
-static gint e_table_drag_source_event_cb (GtkWidget *widget,
- GdkEvent *event,
- ETable *table);
-
-static void
-et_destroy (GtkObject *object)
-{
- ETable *et = E_TABLE (object);
-
-
- gtk_signal_disconnect (GTK_OBJECT (et->model),
- et->table_model_change_id);
- gtk_signal_disconnect (GTK_OBJECT (et->model),
- et->table_row_change_id);
- gtk_signal_disconnect (GTK_OBJECT (et->model),
- et->table_cell_change_id);
- gtk_signal_disconnect (GTK_OBJECT (et->model),
- et->table_row_inserted_id);
- gtk_signal_disconnect (GTK_OBJECT (et->model),
- et->table_row_deleted_id);
- if (et->group_info_change_id)
- gtk_signal_disconnect (GTK_OBJECT (et->sort_info),
- et->group_info_change_id);
-
- if (et->reflow_idle_id)
- g_source_remove(et->reflow_idle_id);
- et->reflow_idle_id = 0;
-
- gtk_object_unref (GTK_OBJECT (et->model));
- gtk_object_unref (GTK_OBJECT (et->full_header));
- gtk_object_unref (GTK_OBJECT (et->header));
- gtk_object_unref (GTK_OBJECT (et->sort_info));
- gtk_object_unref (GTK_OBJECT (et->sorter));
- gtk_widget_destroy (GTK_WIDGET (et->header_canvas));
- gtk_widget_destroy (GTK_WIDGET (et->table_canvas));
-
- if (et->rebuild_idle_id) {
- g_source_remove (et->rebuild_idle_id);
- et->rebuild_idle_id = 0;
- }
-
- g_free(et->click_to_add_message);
-
- (*e_table_parent_class->destroy)(object);
-}
-
-static void
-e_table_init (GtkObject *object)
-{
- ETable *e_table = E_TABLE (object);
- GtkTable *gtk_table = GTK_TABLE (object);
-
- gtk_table->homogeneous = FALSE;
-
- e_table->sort_info = NULL;
- e_table->group_info_change_id = 0;
- e_table->reflow_idle_id = 0;
-
- e_table->draw_grid = 1;
- e_table->draw_focus = 1;
- e_table->cursor_mode = E_TABLE_CURSOR_SIMPLE;
- e_table->length_threshold = 200;
-
- e_table->need_rebuild = 0;
- e_table->rebuild_idle_id = 0;
-
- e_table->click_to_add_message = NULL;
-
- e_table->drag_get_data_row = -1;
- e_table->drag_get_data_col = -1;
- e_table->drop_row = -1;
- e_table->drop_col = -1;
- e_table->site = NULL;
- e_table->drag_source_button_press_event_id = 0;
- e_table->drag_source_motion_notify_event_id = 0;
-
- e_table->sorter = NULL;
- e_table->selection = e_table_selection_model_new();
- e_table->cursor_loc = E_TABLE_CURSOR_LOC_NONE;
-}
-
-static void
-header_canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc, ETable *e_table)
-{
- gnome_canvas_set_scroll_region (
- GNOME_CANVAS (e_table->header_canvas),
- 0, 0, alloc->width - 1, COLUMN_HEADER_HEIGHT - 1);
-}
-
-static void
-sort_info_changed (ETableSortInfo *info, ETable *et)
-{
- et->need_rebuild = TRUE;
- if (!et->rebuild_idle_id)
- et->rebuild_idle_id = g_idle_add_full (20, changed_idle, et, NULL);
-}
-
-static void
-e_table_setup_header (ETable *e_table)
-{
- e_table->header_canvas = GNOME_CANVAS (e_canvas_new ());
-
- gtk_widget_show (GTK_WIDGET (e_table->header_canvas));
-
- e_table->header_item = gnome_canvas_item_new (
- gnome_canvas_root (e_table->header_canvas),
- e_table_header_item_get_type (),
- "ETableHeader", e_table->header,
- "full_header", e_table->full_header,
- "sort_info", e_table->sort_info,
- "dnd_code", "(unset)",
- NULL);
-
- gtk_signal_connect (
- GTK_OBJECT (e_table->header_canvas), "size_allocate",
- GTK_SIGNAL_FUNC (header_canvas_size_allocate), e_table);
-
- gtk_widget_set_usize (GTK_WIDGET (e_table->header_canvas), -1, COLUMN_HEADER_HEIGHT);
-}
-
-static gboolean
-table_canvas_reflow_idle (ETable *e_table)
-{
- gdouble height, width;
- GtkAllocation *alloc = &(GTK_WIDGET (e_table->table_canvas)->allocation);
-
- gtk_object_get (GTK_OBJECT (e_table->canvas_vbox),
- "height", &height,
- "width", &width,
- NULL);
- height = MAX ((int)height, alloc->height);
- width = MAX((int)width, alloc->width);
- /* I have no idea why this needs to be -1, but it works. */
- gnome_canvas_set_scroll_region (
- GNOME_CANVAS (e_table->table_canvas),
- 0, 0, width - 1, height - 1);
- e_table->reflow_idle_id = 0;
- return FALSE;
-}
-
-static void
-table_canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc,
- ETable *e_table)
-{
- gdouble width;
- width = alloc->width;
-
- gtk_object_set (GTK_OBJECT (e_table->canvas_vbox),
- "width", width,
- NULL);
- gtk_object_set (GTK_OBJECT (e_table->header),
- "width", width,
- NULL);
- if (e_table->reflow_idle_id)
- g_source_remove(e_table->reflow_idle_id);
- table_canvas_reflow_idle(e_table);
-}
-
-static void
-table_canvas_reflow (GnomeCanvas *canvas, ETable *e_table)
-{
- if (!e_table->reflow_idle_id)
- e_table->reflow_idle_id = g_idle_add_full (400, (GSourceFunc) table_canvas_reflow_idle, e_table, NULL);
-}
-
-static void
-click_to_add_cursor_change (ETableClickToAdd *etcta, int row, int col, ETable *et)
-{
- if (et->cursor_loc == E_TABLE_CURSOR_LOC_TABLE) {
- e_table_selection_model_clear(et->selection);
- }
- et->cursor_loc = E_TABLE_CURSOR_LOC_ETCTA;
-}
-
-static void
-group_cursor_change (ETableGroup *etg, int row, ETable *et)
-{
- if (et->cursor_loc == E_TABLE_CURSOR_LOC_ETCTA && et->click_to_add) {
- e_table_click_to_add_commit(E_TABLE_CLICK_TO_ADD(et->click_to_add));
- }
- et->cursor_loc = E_TABLE_CURSOR_LOC_TABLE;
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [CURSOR_CHANGE],
- row);
-}
-
-static void
-group_double_click (ETableGroup *etg, int row, ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [DOUBLE_CLICK],
- row);
-}
-
-static gint
-group_right_click (ETableGroup *etg, int row, int col, GdkEvent *event, ETable *et)
-{
- int return_val;
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [RIGHT_CLICK],
- row, col, event, &return_val);
- return return_val;
-}
-
-static gint
-group_key_press (ETableGroup *etg, int row, int col, GdkEvent *event, ETable *et)
-{
- int return_val;
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [KEY_PRESS],
- row, col, event, &return_val);
- return return_val;
-}
-
-static gboolean
-changed_idle (gpointer data)
-{
- ETable *et = E_TABLE (data);
-
- if (et->need_rebuild) {
- gtk_object_destroy (GTK_OBJECT (et->group));
- et->group = e_table_group_new (GNOME_CANVAS_GROUP (et->canvas_vbox),
- et->full_header,
- et->header,
- et->model,
- et->sort_info,
- 0);
- e_canvas_vbox_add_item(E_CANVAS_VBOX(et->canvas_vbox), GNOME_CANVAS_ITEM(et->group));
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(et->group),
- "drawgrid", et->draw_grid,
- "drawfocus", et->draw_focus,
- "cursor_mode", et->cursor_mode,
- "length_threshold", et->length_threshold,
- "table_selection_model", et->selection,
- NULL);
- gtk_signal_connect (GTK_OBJECT (et->group), "cursor_change",
- GTK_SIGNAL_FUNC (group_cursor_change), et);
- gtk_signal_connect (GTK_OBJECT (et->group), "double_click",
- GTK_SIGNAL_FUNC (group_double_click), et);
- gtk_signal_connect (GTK_OBJECT (et->group), "right_click",
- GTK_SIGNAL_FUNC (group_right_click), et);
- gtk_signal_connect (GTK_OBJECT (et->group), "key_press",
- GTK_SIGNAL_FUNC (group_key_press), et);
- e_table_fill_table (et, et->model);
-
- gtk_object_set (GTK_OBJECT (et->canvas_vbox),
- "width", (double) GTK_WIDGET (et->table_canvas)->allocation.width,
- NULL);
- }
-
- et->need_rebuild = 0;
- et->rebuild_idle_id = 0;
-
- return FALSE;
-}
-
-static void
-et_table_model_changed (ETableModel *model, ETable *et)
-{
- et->need_rebuild = TRUE;
- if (!et->rebuild_idle_id)
- et->rebuild_idle_id = g_idle_add_full (20, changed_idle, et, NULL);
-}
-
-static void
-et_table_row_changed (ETableModel *table_model, int row, ETable *et)
-{
- if (!et->need_rebuild) {
- if (e_table_group_remove (et->group, row))
- e_table_group_add (et->group, row);
- }
-}
-
-static void
-et_table_cell_changed (ETableModel *table_model, int view_col, int row, ETable *et)
-{
- et_table_row_changed (table_model, row, et);
-}
-
-static void
-et_table_row_inserted (ETableModel *table_model, int row, ETable *et)
-{
- int row_count = e_table_model_row_count(table_model);
- if (!et->need_rebuild) {
- if (row != row_count - 1)
- e_table_group_increment(et->group, row, 1);
- e_table_group_add (et->group, row);
- }
-}
-
-static void
-et_table_row_deleted (ETableModel *table_model, int row, ETable *et)
-{
- int row_count = e_table_model_row_count(table_model);
- if (!et->need_rebuild) {
- e_table_group_remove (et->group, row);
- if (row != row_count - 1)
- e_table_group_decrement(et->group, row, 1);
- }
-}
-
-static void
-e_table_setup_table (ETable *e_table, ETableHeader *full_header, ETableHeader *header,
- ETableModel *model)
-{
- e_table->table_canvas = GNOME_CANVAS (e_canvas_new ());
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "size_allocate",
- GTK_SIGNAL_FUNC (table_canvas_size_allocate), e_table);
-
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_begin",
- GTK_SIGNAL_FUNC (et_drag_begin), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_end",
- GTK_SIGNAL_FUNC (et_drag_end), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_data_get",
- GTK_SIGNAL_FUNC (et_drag_data_get), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_data_delete",
- GTK_SIGNAL_FUNC (et_drag_data_delete), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_motion",
- GTK_SIGNAL_FUNC (et_drag_motion), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_leave",
- GTK_SIGNAL_FUNC (et_drag_leave), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_drop",
- GTK_SIGNAL_FUNC (et_drag_drop), e_table);
- gtk_signal_connect (
- GTK_OBJECT (e_table->table_canvas), "drag_data_received",
- GTK_SIGNAL_FUNC (et_drag_data_received), e_table);
-
- gtk_signal_connect (GTK_OBJECT(e_table->table_canvas), "reflow",
- GTK_SIGNAL_FUNC (table_canvas_reflow), e_table);
-
- gtk_widget_show (GTK_WIDGET (e_table->table_canvas));
-
-
- e_table->canvas_vbox = gnome_canvas_item_new(gnome_canvas_root(e_table->table_canvas),
- e_canvas_vbox_get_type(),
- "spacing", 10.0,
- NULL);
-
- if (e_table->use_click_to_add) {
- e_table->click_to_add = gnome_canvas_item_new (GNOME_CANVAS_GROUP(e_table->canvas_vbox),
- e_table_click_to_add_get_type (),
- "header", e_table->header,
- "model", e_table->model,
- "message", e_table->click_to_add_message,
- NULL);
-
- e_canvas_vbox_add_item(E_CANVAS_VBOX(e_table->canvas_vbox), e_table->click_to_add);
- gtk_signal_connect(GTK_OBJECT (e_table->click_to_add), "cursor_change",
- GTK_SIGNAL_FUNC(click_to_add_cursor_change), e_table);
- }
-
- e_table->group = e_table_group_new (
- GNOME_CANVAS_GROUP (e_table->canvas_vbox),
- full_header, header,
- model, e_table->sort_info, 0);
- e_canvas_vbox_add_item(E_CANVAS_VBOX(e_table->canvas_vbox), GNOME_CANVAS_ITEM(e_table->group));
-
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(e_table->group),
- "drawgrid", e_table->draw_grid,
- "drawfocus", e_table->draw_focus,
- "cursor_mode", e_table->cursor_mode,
- "length_threshold", e_table->length_threshold,
- "table_selection_model", e_table->selection,
- NULL);
-
- gtk_signal_connect (GTK_OBJECT (e_table->group), "cursor_change",
- GTK_SIGNAL_FUNC(group_cursor_change), e_table);
- gtk_signal_connect (GTK_OBJECT (e_table->group), "double_click",
- GTK_SIGNAL_FUNC(group_double_click), e_table);
- gtk_signal_connect (GTK_OBJECT (e_table->group), "right_click",
- GTK_SIGNAL_FUNC(group_right_click), e_table);
- gtk_signal_connect (GTK_OBJECT (e_table->group), "key_press",
- GTK_SIGNAL_FUNC(group_key_press), e_table);
-
- e_table->table_model_change_id = gtk_signal_connect (
- GTK_OBJECT (model), "model_changed",
- GTK_SIGNAL_FUNC (et_table_model_changed), e_table);
-
- e_table->table_row_change_id = gtk_signal_connect (
- GTK_OBJECT (model), "model_row_changed",
- GTK_SIGNAL_FUNC (et_table_row_changed), e_table);
-
- e_table->table_cell_change_id = gtk_signal_connect (
- GTK_OBJECT (model), "model_cell_changed",
- GTK_SIGNAL_FUNC (et_table_cell_changed), e_table);
-
- e_table->table_row_inserted_id = gtk_signal_connect (
- GTK_OBJECT (model), "model_row_inserted",
- GTK_SIGNAL_FUNC (et_table_row_inserted), e_table);
-
- e_table->table_row_deleted_id = gtk_signal_connect (
- GTK_OBJECT (model), "model_row_deleted",
- GTK_SIGNAL_FUNC (et_table_row_deleted), e_table);
-
-}
-
-static void
-e_table_fill_table (ETable *e_table, ETableModel *model)
-{
- e_table_group_add_all (e_table->group);
-}
-
-static ETableHeader *
-et_xml_to_header (ETable *e_table, ETableHeader *full_header, xmlNode *xmlColumns)
-{
- ETableHeader *nh;
- xmlNode *column;
- const int max_cols = e_table_header_count (full_header);
-
- g_return_val_if_fail (e_table, NULL);
- g_return_val_if_fail (full_header, NULL);
- g_return_val_if_fail (xmlColumns, NULL);
-
- nh = e_table_header_new ();
-
- for (column = xmlColumns->childs; column; column = column->next) {
- gchar *content;
- int col;
-
- content = xmlNodeListGetString (column->doc, column->childs, 1);
- col = atoi (content);
- xmlFree (content);
-
- if (col >= max_cols)
- continue;
-
- e_table_header_add_column (nh, e_table_header_get_column (full_header, col), -1);
- }
-
- return nh;
-}
-
-static void
-et_grouping_xml_to_sort_info (ETable *table, xmlNode *grouping)
-{
- int i;
-
- g_return_if_fail (table!=NULL);
- g_return_if_fail (grouping!=NULL);
-
- table->sort_info = e_table_sort_info_new ();
-
- gtk_object_ref (GTK_OBJECT (table->sort_info));
- gtk_object_sink (GTK_OBJECT (table->sort_info));
-
- i = 0;
- for (grouping = grouping->childs; grouping && !strcmp (grouping->name, "group"); grouping = grouping->childs) {
- ETableSortColumn column;
- column.column = e_xml_get_integer_prop_by_name (grouping, "column");
- column.ascending = e_xml_get_integer_prop_by_name (grouping, "ascending");
- e_table_sort_info_grouping_set_nth(table->sort_info, i++, column);
- }
- i = 0;
- for (; grouping && !strcmp (grouping->name, "leaf"); grouping = grouping->childs) {
- ETableSortColumn column;
- column.column = e_xml_get_integer_prop_by_name (grouping, "column");
- column.ascending = e_xml_get_integer_prop_by_name (grouping, "ascending");
- e_table_sort_info_sorting_set_nth(table->sort_info, i++, column);
- }
-
- table->group_info_change_id =
- gtk_signal_connect (GTK_OBJECT (table->sort_info), "group_info_changed",
- GTK_SIGNAL_FUNC (sort_info_changed), table);
-}
-
-static ETable *
-et_real_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
- xmlDoc *xmlSpec)
-{
- xmlNode *xmlRoot;
- xmlNode *xmlColumns;
- xmlNode *xmlGrouping;
- gboolean no_header;
- int row = 0;
-
- xmlRoot = xmlDocGetRootElement (xmlSpec);
- xmlColumns = e_xml_get_child_by_name (xmlRoot, "columns-shown");
- xmlGrouping = e_xml_get_child_by_name (xmlRoot, "grouping");
-
- if ((xmlColumns == NULL) || (xmlGrouping == NULL))
- return NULL;
-
- no_header = e_xml_get_integer_prop_by_name(xmlRoot, "no-header");
- e_table->use_click_to_add = e_xml_get_integer_prop_by_name(xmlRoot, "click-to-add");
-
-
- e_table->full_header = full_header;
- gtk_object_ref (GTK_OBJECT (full_header));
-
- e_table->model = etm;
- gtk_object_ref (GTK_OBJECT (etm));
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- e_table->header = et_xml_to_header (e_table, full_header, xmlColumns);
- et_grouping_xml_to_sort_info (e_table, xmlGrouping);
-
- gtk_object_set(GTK_OBJECT(e_table->header),
- "sort_info", e_table->sort_info,
- NULL);
-
- e_table->sorter = e_table_sorter_new(etm, e_table->full_header, e_table->sort_info);
-
- gtk_object_set (GTK_OBJECT (e_table->selection),
- "model", etm,
- "sorter", e_table->sorter,
- NULL);
-
- if (!no_header) {
- e_table_setup_header (e_table);
- }
- e_table_setup_table (e_table, full_header, e_table->header, etm);
- e_table_fill_table (e_table, etm);
-
- gtk_layout_get_vadjustment (GTK_LAYOUT (e_table->table_canvas))->step_increment = 20;
- gtk_adjustment_changed(gtk_layout_get_vadjustment (GTK_LAYOUT (e_table->table_canvas)));
-
- if (!no_header) {
- /*
- * The header
- */
- gtk_table_attach (GTK_TABLE (e_table), GTK_WIDGET (e_table->header_canvas),
- 0, 1, 0 + row, 1 + row,
- GTK_FILL | GTK_EXPAND,
- GTK_FILL, 0, 0);
- row ++;
- }
- gtk_table_attach (GTK_TABLE (e_table), GTK_WIDGET (e_table->table_canvas),
- 0, 1, 0 + row, 1 + row,
- GTK_FILL | GTK_EXPAND,
- GTK_FILL | GTK_EXPAND,
- 0, 0);
-
- gtk_widget_pop_colormap ();
- gtk_widget_pop_visual ();
-
- return e_table;
-}
-
-ETable *
-e_table_construct (ETable *e_table, ETableHeader *full_header,
- ETableModel *etm, const char *spec)
-{
- xmlDoc *xmlSpec;
- char *copy;
- copy = g_strdup (spec);
-
- xmlSpec = xmlParseMemory (copy, strlen(copy));
- e_table = et_real_construct (e_table, full_header, etm, xmlSpec);
- xmlFreeDoc (xmlSpec);
- g_free (copy);
-
- return e_table;
-}
-
-ETable *
-e_table_construct_from_spec_file (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
- const char *filename)
-{
- xmlDoc *xmlSpec;
-
- xmlSpec = xmlParseFile (filename);
- e_table = et_real_construct (e_table, full_header, etm, xmlSpec);
- xmlFreeDoc (xmlSpec);
-
- return e_table;
-}
-
-GtkWidget *
-e_table_new (ETableHeader *full_header, ETableModel *etm, const char *spec)
-{
- ETable *e_table;
-
- e_table = gtk_type_new (e_table_get_type ());
-
- e_table = e_table_construct (e_table, full_header, etm, spec);
-
- return GTK_WIDGET (e_table);
-}
-
-GtkWidget *
-e_table_new_from_spec_file (ETableHeader *full_header, ETableModel *etm, const char *filename)
-{
- ETable *e_table;
-
- e_table = gtk_type_new (e_table_get_type ());
-
- e_table = e_table_construct_from_spec_file (e_table, full_header, etm, filename);
-
- return (GtkWidget *) e_table;
-}
-
-static xmlNode *
-et_build_column_spec (ETable *e_table)
-{
- xmlNode *columns_shown;
- gint i;
- gint col_count;
-
- columns_shown = xmlNewNode (NULL, "columns-shown");
-
- col_count = e_table_header_count (e_table->header);
- for (i = 0; i < col_count; i++){
- gchar *text = g_strdup_printf ("%d", e_table_header_index(e_table->header, i));
- xmlNewChild (columns_shown, NULL, "column", text);
- g_free (text);
- }
-
- return columns_shown;
-}
-
-static xmlNode *
-et_build_grouping_spec (ETable *e_table)
-{
- xmlNode *node;
- xmlNode *grouping;
- int i;
- const int sort_count = e_table_sort_info_sorting_get_count (e_table->sort_info);
- const int group_count = e_table_sort_info_grouping_get_count (e_table->sort_info);
-
- grouping = xmlNewNode (NULL, "grouping");
- node = grouping;
-
- for (i = 0; i < group_count; i++) {
- ETableSortColumn column = e_table_sort_info_grouping_get_nth(e_table->sort_info, i);
- xmlNode *new_node = xmlNewChild(node, NULL, "group", NULL);
-
- e_xml_set_integer_prop_by_name (new_node, "column", column.column);
- e_xml_set_integer_prop_by_name (new_node, "ascending", column.ascending);
- node = new_node;
- }
-
- for (i = 0; i < sort_count; i++) {
- ETableSortColumn column = e_table_sort_info_sorting_get_nth(e_table->sort_info, i);
- xmlNode *new_node = xmlNewChild(node, NULL, "leaf", NULL);
-
- e_xml_set_integer_prop_by_name (new_node, "column", column.column);
- e_xml_set_integer_prop_by_name (new_node, "ascending", column.ascending);
- node = new_node;
- }
-
- return grouping;
-}
-
-static xmlDoc *
-et_build_tree (ETable *e_table)
-{
- xmlDoc *doc;
- xmlNode *root;
-
- doc = xmlNewDoc ("1.0");
- if (doc == NULL)
- return NULL;
-
- root = xmlNewDocNode (doc, NULL, "ETableSpecification", NULL);
- xmlDocSetRootElement (doc, root);
- xmlAddChild (root, et_build_column_spec (e_table));
- xmlAddChild (root, et_build_grouping_spec (e_table));
-
- return doc;
-}
-
-gchar *
-e_table_get_specification (ETable *e_table)
-{
- xmlDoc *doc;
- xmlChar *buffer;
- gint size;
-
- doc = et_build_tree (e_table);
- xmlDocDumpMemory (doc, &buffer, &size);
- xmlFreeDoc (doc);
-
- return buffer;
-}
-
-void
-e_table_save_specification (ETable *e_table, gchar *filename)
-{
- xmlDoc *doc = et_build_tree (e_table);
-
- xmlSaveFile (filename, doc);
- xmlFreeDoc (doc);
-}
-
-void
-e_table_set_cursor_row (ETable *e_table, int row)
-{
- row = e_table_sorter_model_to_sorted(e_table->sorter, row);
- if (row != -1)
- e_table_group_set_cursor_row(e_table->group, row);
-}
-
-int
-e_table_get_cursor_row (ETable *e_table)
-{
- int row = e_table_group_get_cursor_row(e_table->group);
- row = e_table_sorter_sorted_to_model(e_table->sorter, row);
- return row;
-}
-
-void
-e_table_selected_row_foreach (ETable *e_table,
- ETableForeachFunc callback,
- gpointer closure)
-{
- e_table_selection_model_foreach(e_table->selection,
- callback,
- closure);
-}
-
-
-EPrintable *
-e_table_get_printable (ETable *e_table)
-{
- return e_table_group_get_printable(e_table->group);
-}
-
-static void
-et_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETable *etable = E_TABLE (o);
-
- switch (arg_id){
- case ARG_TABLE_DRAW_GRID:
- GTK_VALUE_BOOL (*arg) = etable->draw_grid;
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- GTK_VALUE_BOOL (*arg) = etable->draw_focus;
- break;
-
- case ARG_CLICK_TO_ADD_MESSAGE:
- GTK_VALUE_STRING (*arg) = g_strdup (etable->click_to_add_message);
- break;
- }
-}
-
-typedef struct {
- char *arg;
- gboolean setting;
-} bool_closure;
-
-static void
-et_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- ETable *etable = E_TABLE (o);
-
- switch (arg_id){
- case ARG_LENGTH_THRESHOLD:
- etable->length_threshold = GTK_VALUE_INT (*arg);
- if (etable->group) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
- "length_threshold", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
-
- case ARG_TABLE_DRAW_GRID:
- etable->draw_grid = GTK_VALUE_BOOL (*arg);
- if (etable->group) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
- "drawgrid", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_TABLE_DRAW_FOCUS:
- etable->draw_focus = GTK_VALUE_BOOL (*arg);
- if (etable->group) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
- "drawfocus", GTK_VALUE_BOOL (*arg),
- NULL);
- }
- break;
-
- case ARG_CURSOR_MODE:
- etable->cursor_mode = GTK_VALUE_INT (*arg);
- if (etable->group) {
- gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
- "cursor_mode", GTK_VALUE_INT (*arg),
- NULL);
- }
- break;
- case ARG_CLICK_TO_ADD_MESSAGE:
- if (etable->click_to_add_message)
- g_free(etable->click_to_add_message);
- etable->click_to_add_message = g_strdup(GTK_VALUE_STRING (*arg));
- if (etable->click_to_add)
- gnome_canvas_item_set(etable->click_to_add,
- "message", etable->click_to_add_message,
- NULL);
- break;
- }
-}
-
-static void
-set_scroll_adjustments (ETable *table,
- GtkAdjustment *hadjustment,
- GtkAdjustment *vadjustment)
-{
- if (vadjustment != NULL) {
- vadjustment->step_increment = 20;
- gtk_adjustment_changed(vadjustment);
- }
-
- gtk_layout_set_hadjustment (GTK_LAYOUT(table->table_canvas),
- hadjustment);
- gtk_layout_set_vadjustment (GTK_LAYOUT(table->table_canvas),
- vadjustment);
- gtk_layout_set_hadjustment (GTK_LAYOUT(table->header_canvas),
- hadjustment);
-}
-
-gint
-e_table_get_next_row (ETable *e_table,
- gint model_row)
-{
- if (e_table->sorter) {
- int i;
- i = e_table_sorter_model_to_sorted(e_table->sorter, model_row);
- i++;
- if (i < e_table_model_row_count(e_table->model)) {
- return e_table_sorter_sorted_to_model(e_table->sorter, i);
- } else
- return -1;
- } else
- if (model_row < e_table_model_row_count(e_table->model) - 1)
- return model_row + 1;
- else
- return -1;
-}
-
-gint
-e_table_get_prev_row (ETable *e_table,
- gint model_row)
-{
- if (e_table->sorter) {
- int i;
- i = e_table_sorter_model_to_sorted(e_table->sorter, model_row);
- i--;
- if (i >= 0)
- return e_table_sorter_sorted_to_model(e_table->sorter, i);
- else
- return -1;
- } else
- return model_row - 1;
-}
-
-gint
-e_table_model_to_view_row (ETable *e_table,
- gint model_row)
-{
- if (e_table->sorter)
- return e_table_sorter_model_to_sorted(e_table->sorter, model_row);
- else
- return model_row;
-}
-
-gint
-e_table_view_to_model_row (ETable *e_table,
- gint view_row)
-{
- if (e_table->sorter)
- return e_table_sorter_sorted_to_model(e_table->sorter, view_row);
- else
- return view_row;
-}
-
-struct _ETableDragSourceSite
-{
- GdkModifierType start_button_mask;
- GtkTargetList *target_list; /* Targets for drag data */
- GdkDragAction actions; /* Possible actions */
- GdkColormap *colormap; /* Colormap for drag icon */
- GdkPixmap *pixmap; /* Icon for drag data */
- GdkBitmap *mask;
-
- /* Stored button press information to detect drag beginning */
- gint state;
- gint x, y;
- gint row, col;
-};
-
-typedef enum
-{
- GTK_DRAG_STATUS_DRAG,
- GTK_DRAG_STATUS_WAIT,
- GTK_DRAG_STATUS_DROP
-} GtkDragStatus;
-
-typedef struct _GtkDragDestInfo GtkDragDestInfo;
-typedef struct _GtkDragSourceInfo GtkDragSourceInfo;
-
-struct _GtkDragDestInfo
-{
- GtkWidget *widget; /* Widget in which drag is in */
- GdkDragContext *context; /* Drag context */
- GtkDragSourceInfo *proxy_source; /* Set if this is a proxy drag */
- GtkSelectionData *proxy_data; /* Set while retrieving proxied data */
- gboolean dropped : 1; /* Set after we receive a drop */
- guint32 proxy_drop_time; /* Timestamp for proxied drop */
- gboolean proxy_drop_wait : 1; /* Set if we are waiting for a
- * status reply before sending
- * a proxied drop on.
- */
- gint drop_x, drop_y; /* Position of drop */
-};
-
-struct _GtkDragSourceInfo
-{
- GtkWidget *widget;
- GtkTargetList *target_list; /* Targets for drag data */
- GdkDragAction possible_actions; /* Actions allowed by source */
- GdkDragContext *context; /* drag context */
- GtkWidget *icon_window; /* Window for drag */
- GtkWidget *ipc_widget; /* GtkInvisible for grab, message passing */
- GdkCursor *cursor; /* Cursor for drag */
- gint hot_x, hot_y; /* Hot spot for drag */
- gint button; /* mouse button starting drag */
-
- GtkDragStatus status; /* drag status */
- GdkEvent *last_event; /* motion event waiting for response */
-
- gint start_x, start_y; /* Initial position */
- gint cur_x, cur_y; /* Current Position */
-
- GList *selections; /* selections we've claimed */
-
- GtkDragDestInfo *proxy_dest; /* Set if this is a proxy drag */
-
- guint drop_timeout; /* Timeout for aborting drop */
- guint destroy_icon : 1; /* If true, destroy icon_window
- */
-};
-
-/* Drag & drop stuff. */
-/* Target */
-void e_table_drag_get_data (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- GdkAtom target,
- guint32 time)
-{
- table->drag_get_data_row = row;
- table->drag_get_data_col = col;
- gtk_drag_get_data(GTK_WIDGET(table),
- context,
- target,
- time);
-
-}
-
-void e_table_drag_highlight (ETable *table,
- int row,
- int col) /* col == -1 to highlight entire row. */
-{
-}
-
-void e_table_drag_unhighlight (ETable *table)
-{
-}
-
-void e_table_drag_dest_set (ETable *table,
- GtkDestDefaults flags,
- const GtkTargetEntry *targets,
- gint n_targets,
- GdkDragAction actions)
-{
- gtk_drag_dest_set(GTK_WIDGET(table),
- flags,
- targets,
- n_targets,
- actions);
-}
-
-void e_table_drag_dest_set_proxy (ETable *table,
- GdkWindow *proxy_window,
- GdkDragProtocol protocol,
- gboolean use_coordinates)
-{
- gtk_drag_dest_set_proxy(GTK_WIDGET(table),
- proxy_window,
- protocol,
- use_coordinates);
-}
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-void e_table_drag_dest_unset (GtkWidget *widget)
-{
- gtk_drag_dest_unset(widget);
-}
-
-/* Source side */
-
-void e_table_drag_source_set (ETable *table,
- GdkModifierType start_button_mask,
- const GtkTargetEntry *targets,
- gint n_targets,
- GdkDragAction actions)
-{
- ETableDragSourceSite *site;
- GtkWidget *canvas = GTK_WIDGET(table->table_canvas);
-
- g_return_if_fail (table != NULL);
-
- site = table->site;
-
- gtk_widget_add_events (canvas,
- gtk_widget_get_events (canvas) |
- GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
- GDK_BUTTON_MOTION_MASK);
-
- if (site) {
- if (site->target_list)
- gtk_target_list_unref (site->target_list);
- } else {
- site = g_new0 (ETableDragSourceSite, 1);
-
- table->drag_source_button_press_event_id =
- gtk_signal_connect (GTK_OBJECT (canvas), "button_press_event",
- GTK_SIGNAL_FUNC (e_table_drag_source_event_cb),
- table);
- table->drag_source_motion_notify_event_id =
- gtk_signal_connect (GTK_OBJECT (canvas), "motion_notify_event",
- GTK_SIGNAL_FUNC (e_table_drag_source_event_cb),
- table);
-
- table->site = site;
- }
-
- site->start_button_mask = start_button_mask;
-
- if (targets)
- site->target_list = gtk_target_list_new (targets, n_targets);
- else
- site->target_list = NULL;
-
- site->actions = actions;
-}
-
-void e_table_drag_source_unset (ETable *table)
-{
- ETableDragSourceSite *site;
-
- g_return_if_fail (table != NULL);
-
- site = table->site;
-
- if (site) {
- gtk_signal_disconnect (GTK_OBJECT (table->table_canvas), table->drag_source_button_press_event_id);
- gtk_signal_disconnect (GTK_OBJECT (table->table_canvas), table->drag_source_motion_notify_event_id);
- g_free(site);
- table->site = NULL;
- }
-}
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-GdkDragContext *
-e_table_drag_begin (ETable *table,
- int row,
- int col,
- GtkTargetList *targets,
- GdkDragAction actions,
- gint button,
- GdkEvent *event)
-{
- table->drag_row = row;
- table->drag_col = col;
-
- return gtk_drag_begin(GTK_WIDGET(table),
- targets,
- actions,
- button,
- event);
-}
-
-static void
-e_table_compute_location(ETable *table,
- GtkWidget *widget,
- int x,
- int y,
- int *row,
- int *col)
-{
- if (!(row || col))
- return;
- e_table_group_compute_location(table->group, &x, &y, row, col);
-}
-
-static void
-et_drag_begin (GtkWidget *widget,
- GdkDragContext *context,
- ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_BEGIN],
- et->drag_row,
- et->drag_col,
- context);
-}
-
-static void
-et_drag_end (GtkWidget *widget,
- GdkDragContext *context,
- ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_END],
- et->drag_row,
- et->drag_col,
- context);
-}
-
-static void
-et_drag_data_get(GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_DATA_GET],
- et->drag_row,
- et->drag_col,
- context,
- selection_data,
- info,
- time);
-}
-
-static void
-et_drag_data_delete(GtkWidget *widget,
- GdkDragContext *context,
- ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_DATA_DELETE],
- et->drag_row,
- et->drag_col,
- context);
-}
-
-static void
-et_drag_leave(GtkWidget *widget,
- GdkDragContext *context,
- guint time,
- ETable *et)
-{
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_LEAVE],
- et->drop_row,
- et->drop_col,
- context,
- time);
- et->drop_row = -1;
- et->drop_col = -1;
-}
-
-static gboolean
-et_drag_motion(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- ETable *et)
-{
- gboolean ret_val;
- int row, col;
- e_table_compute_location(et,
- widget,
- x,
- y,
- &row,
- &col);
- if (et->drop_row >= 0 && et->drop_col >= 0 &&
- row != et->drop_row && col != et->drop_row) {
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_LEAVE],
- et->drop_row,
- et->drop_col,
- context,
- time);
- }
- et->drop_row = row;
- et->drop_col = col;
- if (row >= 0 && col >= 0)
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_MOTION],
- et->drop_row,
- et->drop_col,
- context,
- x,
- y,
- time,
- &ret_val);
- return ret_val;
-}
-
-static gboolean
-et_drag_drop(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- ETable *et)
-{
- gboolean ret_val;
- int row, col;
- e_table_compute_location(et,
- widget,
- x,
- y,
- &row,
- &col);
- if (et->drop_row >= 0 && et->drop_col >= 0 &&
- row != et->drop_row && col != et->drop_row) {
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_LEAVE],
- et->drop_row,
- et->drop_col,
- context,
- time);
- if (row >= 0 && col >= 0)
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_MOTION],
- row,
- col,
- context,
- x,
- y,
- time,
- &ret_val);
- }
- et->drop_row = row;
- et->drop_col = col;
- if (row >= 0 && col >= 0)
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_DROP],
- et->drop_row,
- et->drop_col,
- context,
- x,
- y,
- time,
- &ret_val);
- et->drop_row = -1;
- et->drop_col = -1;
- return ret_val;
-}
-
-static void
-et_drag_data_received(GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETable *et)
-{
- int row, col;
- e_table_compute_location(et,
- widget,
- x,
- y,
- &row,
- &col);
- gtk_signal_emit (GTK_OBJECT (et),
- et_signals [TABLE_DRAG_MOTION],
- row,
- col,
- context,
- x,
- y,
- selection_data,
- info,
- time);
-}
-
-static gint
-e_table_drag_source_event_cb (GtkWidget *widget,
- GdkEvent *event,
- ETable *table)
-{
- ETableDragSourceSite *site;
- site = table->site;
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- if ((GDK_BUTTON1_MASK << (event->button.button - 1)) & site->start_button_mask) {
- int row, col;
- e_table_compute_location(table, widget, event->button.x, event->button.y, &row, &col);
- if (row >= 0 && col >= 0) {
- site->state |= (GDK_BUTTON1_MASK << (event->button.button - 1));
- site->x = event->button.x;
- site->y = event->button.y;
- site->row = row;
- site->col = col;
- }
- }
- break;
-
- case GDK_BUTTON_RELEASE:
- if ((GDK_BUTTON1_MASK << (event->button.button - 1)) & site->start_button_mask) {
- site->state &= ~(GDK_BUTTON1_MASK << (event->button.button - 1));
- }
- break;
-
- case GDK_MOTION_NOTIFY:
- if (site->state & event->motion.state & site->start_button_mask) {
- /* FIXME: This is really broken and can leave us
- * with a stuck grab
- */
- int i;
- for (i=1; i<6; i++) {
- if (site->state & event->motion.state &
- GDK_BUTTON1_MASK << (i - 1))
- break;
- }
-
- if (MAX (abs (site->x - event->motion.x),
- abs (site->y - event->motion.y)) > 3) {
- GtkDragSourceInfo *info;
- GdkDragContext *context;
-
- site->state = 0;
- context = e_table_drag_begin (table, site->row, site->col,
- site->target_list,
- site->actions,
- i, event);
-
-
- info = g_dataset_get_data (context, "gtk-info");
-
- if (!info->icon_window) {
- if (site->pixmap)
- gtk_drag_set_icon_pixmap (context,
- site->colormap,
- site->pixmap,
- site->mask, -2, -2);
- else
- gtk_drag_set_icon_default (context);
- }
-
- return TRUE;
- }
- }
- break;
-
- default: /* hit for 2/3BUTTON_PRESS */
- break;
- }
- return FALSE;
-}
-
-static void
-e_table_class_init (GtkObjectClass *object_class)
-{
- ETableClass *klass = E_TABLE_CLASS(object_class);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(object_class);
-
- e_table_parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->destroy = et_destroy;
- object_class->set_arg = et_set_arg;
- object_class->get_arg = et_get_arg;
-
- klass->cursor_change = NULL;
- klass->double_click = NULL;
- klass->right_click = NULL;
- klass->key_press = NULL;
-
- klass->table_drag_begin = NULL;
- klass->table_drag_end = NULL;
- klass->table_drag_data_get = NULL;
- klass->table_drag_data_delete = NULL;
-
- klass->table_drag_leave = NULL;
- klass->table_drag_motion = NULL;
- klass->table_drag_drop = NULL;
- klass->table_drag_data_received = NULL;
-
- et_signals [CURSOR_CHANGE] =
- gtk_signal_new ("cursor_change",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, cursor_change),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- et_signals [DOUBLE_CLICK] =
- gtk_signal_new ("double_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, double_click),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1, GTK_TYPE_INT);
-
- et_signals [RIGHT_CLICK] =
- gtk_signal_new ("right_click",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, right_click),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- et_signals [KEY_PRESS] =
- gtk_signal_new ("key_press",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, key_press),
- e_marshal_INT__INT_INT_POINTER,
- GTK_TYPE_INT, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER);
-
- et_signals[TABLE_DRAG_BEGIN] =
- gtk_signal_new ("table_drag_begin",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_begin),
- gtk_marshal_NONE__INT_INT_POINTER,
- GTK_TYPE_NONE, 3,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT);
- et_signals[TABLE_DRAG_END] =
- gtk_signal_new ("table_drag_end",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_end),
- gtk_marshal_NONE__INT_INT_POINTER,
- GTK_TYPE_NONE, 3,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT);
- et_signals[TABLE_DRAG_DATA_GET] =
- gtk_signal_new ("table_drag_data_get",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_data_get),
- e_marshal_NONE__INT_INT_POINTER_POINTER_UINT_UINT,
- GTK_TYPE_NONE, 6,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT,
- GTK_TYPE_SELECTION_DATA,
- GTK_TYPE_UINT,
- GTK_TYPE_UINT);
- et_signals[TABLE_DRAG_DATA_DELETE] =
- gtk_signal_new ("table_drag_data_delete",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_data_delete),
- gtk_marshal_NONE__INT_INT_POINTER,
- GTK_TYPE_NONE, 3,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT);
-
- et_signals[TABLE_DRAG_LEAVE] =
- gtk_signal_new ("table_drag_leave",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_leave),
- e_marshal_NONE__INT_INT_POINTER_UINT,
- GTK_TYPE_NONE, 4,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT,
- GTK_TYPE_UINT);
- et_signals[TABLE_DRAG_MOTION] =
- gtk_signal_new ("table_drag_motion",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_motion),
- e_marshal_BOOL__INT_INT_POINTER_INT_INT_UINT,
- GTK_TYPE_BOOL, 6,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_UINT);
- et_signals[TABLE_DRAG_DROP] =
- gtk_signal_new ("table_drag_drop",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_drop),
- e_marshal_BOOL__INT_INT_POINTER_INT_INT_UINT,
- GTK_TYPE_BOOL, 6,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_UINT);
- et_signals[TABLE_DRAG_DATA_RECEIVED] =
- gtk_signal_new ("table_drag_data_received",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, table_drag_data_received),
- e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_UINT_UINT,
- GTK_TYPE_NONE, 8,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_GDK_DRAG_CONTEXT,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_SELECTION_DATA,
- GTK_TYPE_UINT,
- GTK_TYPE_UINT);
-
- gtk_object_class_add_signals (object_class, et_signals, LAST_SIGNAL);
-
- klass->set_scroll_adjustments = set_scroll_adjustments;
-
- widget_class->set_scroll_adjustments_signal =
- gtk_signal_new ("set_scroll_adjustments",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETableClass, set_scroll_adjustments),
- gtk_marshal_NONE__POINTER_POINTER,
- GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
-
- gtk_object_add_arg_type ("ETable::drawgrid", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_TABLE_DRAW_GRID);
- gtk_object_add_arg_type ("ETable::drawfocus", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_TABLE_DRAW_FOCUS);
- gtk_object_add_arg_type ("ETable::cursor_mode", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_CURSOR_MODE);
- gtk_object_add_arg_type ("ETable::length_threshold", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
- gtk_object_add_arg_type ("ETable::click_to_add_message", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_CLICK_TO_ADD_MESSAGE);
-}
-
-E_MAKE_TYPE(e_table, "ETable", ETable, e_table_class_init, e_table_init, PARENT_TYPE);
-
diff --git a/widgets/table/e-table.h b/widgets/table/e-table.h
deleted file mode 100644
index 19dcbfecc8..0000000000
--- a/widgets/table/e-table.h
+++ /dev/null
@@ -1,252 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TABLE_H_
-#define _E_TABLE_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gtk/gtktable.h>
-#include <gnome-xml/tree.h>
-#include "e-table-model.h"
-#include "e-table-header.h"
-#include "e-table-group.h"
-#include "e-table-sort-info.h"
-#include "e-table-item.h"
-#include "e-table-selection-model.h"
-#include "e-util/e-printable.h"
-
-BEGIN_GNOME_DECLS
-
-#define E_TABLE_TYPE (e_table_get_type ())
-#define E_TABLE(o) (GTK_CHECK_CAST ((o), E_TABLE_TYPE, ETable))
-#define E_TABLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_TYPE, ETableClass))
-#define E_IS_TABLE(o) (GTK_CHECK_TYPE ((o), E_TABLE_TYPE))
-#define E_IS_TABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_TYPE))
-
-typedef struct _ETableDragSourceSite ETableDragSourceSite;
-
-typedef enum {
- E_TABLE_CURSOR_LOC_NONE = 0,
- E_TABLE_CURSOR_LOC_ETCTA = 1 << 0,
- E_TABLE_CURSOR_LOC_TABLE = 1 << 1,
-} ETableCursorLoc;
-
-typedef struct {
- GtkTable parent;
-
- ETableModel *model;
-
- ETableHeader *full_header, *header;
-
- GnomeCanvasItem *canvas_vbox;
- ETableGroup *group;
-
- ETableSortInfo *sort_info;
- ETableSorter *sorter;
-
- ETableSelectionModel *selection;
- ETableCursorLoc cursor_loc;
-
- int table_model_change_id;
- int table_row_change_id;
- int table_cell_change_id;
- int table_row_inserted_id;
- int table_row_deleted_id;
-
- int group_info_change_id;
-
- int reflow_idle_id;
-
- GnomeCanvas *header_canvas, *table_canvas;
-
- GnomeCanvasItem *header_item, *root;
-
- gint length_threshold;
-
- gint rebuild_idle_id;
- guint need_rebuild:1;
-
- /*
- * Configuration settings
- */
- guint draw_grid : 1;
- guint draw_focus : 1;
- guint row_selection_active : 1;
-
- char *click_to_add_message;
- GnomeCanvasItem *click_to_add;
- gboolean use_click_to_add;
-
- ETableCursorMode cursor_mode;
-
- int drag_get_data_row;
- int drag_get_data_col;
-
- int drop_row;
- int drop_col;
-
- int drag_row;
- int drag_col;
- ETableDragSourceSite *site;
-
- int drag_source_button_press_event_id;
- int drag_source_motion_notify_event_id;
-} ETable;
-
-typedef struct {
- GtkTableClass parent_class;
-
- void (*cursor_change) (ETable *et, int row);
- void (*double_click) (ETable *et, int row);
- gint (*right_click) (ETable *et, int row, int col, GdkEvent *event);
- gint (*key_press) (ETable *et, int row, int col, GdkEvent *event);
-
- void (*set_scroll_adjustments) (ETable *table,
- GtkAdjustment *hadjustment,
- GtkAdjustment *vadjustment);
-
- /* Source side drag signals */
- void (* table_drag_begin) (ETable *table,
- int row,
- int col,
- GdkDragContext *context);
- void (* table_drag_end) (ETable *table,
- int row,
- int col,
- GdkDragContext *context);
- void (* table_drag_data_get) (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time);
- void (* table_drag_data_delete) (ETable *table,
- int row,
- int col,
- GdkDragContext *context);
-
- /* Target side drag signals */
- void (* table_drag_leave) (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- guint time);
- gboolean (* table_drag_motion) (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time);
- gboolean (* table_drag_drop) (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time);
- void (* table_drag_data_received) (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *selection_data,
- guint info,
- guint time);
-} ETableClass;
-
-GtkType e_table_get_type (void);
-
-ETable *e_table_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
- const char *spec);
-GtkWidget *e_table_new (ETableHeader *full_header, ETableModel *etm,
- const char *spec);
-
-ETable *e_table_construct_from_spec_file (ETable *e_table,
- ETableHeader *full_header,
- ETableModel *etm,
- const char *filename);
-GtkWidget *e_table_new_from_spec_file (ETableHeader *full_header,
- ETableModel *etm,
- const char *filename);
-
-gchar *e_table_get_specification (ETable *e_table);
-void e_table_save_specification (ETable *e_table, gchar *filename);
-
-void e_table_set_cursor_row (ETable *e_table,
- int row);
-/* -1 means we don't have the cursor. */
-int e_table_get_cursor_row (ETable *e_table);
-void e_table_selected_row_foreach (ETable *e_table,
- ETableForeachFunc callback,
- gpointer closure);
-EPrintable *e_table_get_printable (ETable *e_table);
-
-gint e_table_get_next_row (ETable *e_table,
- gint model_row);
-gint e_table_get_prev_row (ETable *e_table,
- gint model_row);
-
-gint e_table_model_to_view_row (ETable *e_table,
- gint model_row);
-gint e_table_view_to_model_row (ETable *e_table,
- gint view_row);
-
-
-/* Drag & drop stuff. */
-/* Target */
-void e_table_drag_get_data (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- GdkAtom target,
- guint32 time);
-
-void e_table_drag_highlight (ETable *table,
- int row,
- int col); /* col == -1 to highlight entire row. */
-void e_table_drag_unhighlight (ETable *table);
-
-void e_table_drag_dest_set (ETable *table,
- GtkDestDefaults flags,
- const GtkTargetEntry *targets,
- gint n_targets,
- GdkDragAction actions);
-
-void e_table_drag_dest_set_proxy (ETable *table,
- GdkWindow *proxy_window,
- GdkDragProtocol protocol,
- gboolean use_coordinates);
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-void e_table_drag_dest_unset (GtkWidget *widget);
-
-/* Source side */
-
-void e_table_drag_source_set (ETable *table,
- GdkModifierType start_button_mask,
- const GtkTargetEntry *targets,
- gint n_targets,
- GdkDragAction actions);
-
-void e_table_drag_source_unset (ETable *table);
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-GdkDragContext *e_table_drag_begin (ETable *table,
- int row,
- int col,
- GtkTargetList *targets,
- GdkDragAction actions,
- gint button,
- GdkEvent *event);
-
-END_GNOME_DECLS
-
-#endif /* _E_TABLE_H_ */
-
diff --git a/widgets/table/e-tree-example-1.c b/widgets/table/e-tree-example-1.c
deleted file mode 100644
index 308f462f64..0000000000
--- a/widgets/table/e-tree-example-1.c
+++ /dev/null
@@ -1,403 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* This code is GPL. */
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-tree.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-#include "e-tree-simple.h"
-#include "libgnomeprint/gnome-print.h"
-#include "libgnomeprint/gnome-print-preview.h"
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "tree-expanded.xpm"
-#include "tree-unexpanded.xpm"
-
-GdkPixbuf *tree_expanded_pixbuf;
-GdkPixbuf *tree_unexpanded_pixbuf;
-
-#define COLS 4
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/*
- * Here we define the initial layout of the table. This is an xml
- * format that allows you to change the initial ordering of the
- * columns or to do sorting or grouping initially. This specification
- * shows all 5 columns, but moves the importance column nearer to the
- * front. It also sorts by the "Full Name" column (ascending.)
- * Sorting and grouping take the model column as their arguments
- * (sorting is specified by the "column" argument to the leaf elemnt.
- */
-
-#define INITIAL_SPEC "<ETableSpecification> \
- <columns-shown> \
- <column> 0 </column> \
- <column> 4 </column> \
- <column> 1 </column> \
- <column> 2 </column> \
- <column> 3 </column> \
- </columns-shown> \
- <grouping></grouping> \
-</ETableSpecification>"
-
-/*
- * Virtual Column list:
- * 0 Subject
- * 1 Full Name
- * 2 Email
- * 3 Date
- */
-char *headers [COLS] = {
- "Subject",
- "Full Name",
- "Email",
- "Date"
-};
-
-GtkWidget *e_table;
-
-/*
- * ETreeSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/* This function returns the value at a particular point in our ETreeModel. */
-static void *
-my_value_at (ETreeModel *etm, ETreePath *path, int col, void *model_data)
-{
- switch (col) {
- case 0: return e_tree_model_node_get_data (etm, path);
- case 1: return "Chris Toshok";
- case 2: return "toshok@helixcode.com";
- case 3: return "Jun 07 2000";
- default: return NULL;
- }
-}
-
-static GdkPixbuf *
-my_icon_at (ETreeModel *etm, ETreePath *path, void *model_data)
-{
- if (e_tree_model_node_is_expanded (etm, path))
- return tree_expanded_pixbuf;
- else
- return tree_unexpanded_pixbuf;
-}
-
-/* This function sets the value at a particular point in our ETreeModel. */
-static void
-my_set_value_at (ETreeModel *etm, ETreePath *path, int col, const void *val, void *model_data)
-{
- if (col == 0) {
- char *str = e_tree_model_node_get_data (etm, path);
- g_free (str);
- e_tree_model_node_set_data (etm, path, g_strdup(val));
- }
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-my_is_editable (ETreeModel *etm, ETreePath *path, int col, void *model_data)
-{
- if (col == 0)
- return TRUE;
- else
- return FALSE;
-}
-
-static void
-toggle_root (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = (ETreeModel*)data;
- e_tree_model_root_node_set_visible (e_tree_model, !e_tree_model_root_node_is_visible (e_tree_model));
-}
-
-static void
-add_sibling (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = E_TREE_MODEL (data);
- int selected_row;
- ETreePath *selected_node;
- ETreePath *parent_node;
-
- selected_row = e_table_get_cursor_row (E_TABLE (e_table));
- if (selected_row == -1)
- return;
-
- selected_node = e_tree_model_node_at_row (e_tree_model, selected_row);
- g_assert (selected_node);
-
- parent_node = e_tree_model_node_get_parent (e_tree_model, selected_node);
-
- e_tree_model_node_insert_before (e_tree_model, parent_node,
- selected_node,
- g_strdup("User added sibling"));
-
-}
-
-static void
-add_child (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = E_TREE_MODEL (data);
- int selected_row;
- ETreePath *selected_node;
-
- selected_row = e_table_get_cursor_row (E_TABLE (e_table));
- if (selected_row == -1)
- return;
-
- selected_node = e_tree_model_node_at_row (e_tree_model, selected_row);
- g_assert (selected_node);
-
- e_tree_model_node_insert (e_tree_model, selected_node,
- 0,
- g_strdup("User added child"));
-}
-
-static void
-remove_node (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = E_TREE_MODEL (data);
- int selected_row;
- char *str;
- ETreePath *selected_node;
-
- selected_row = e_table_get_cursor_row (E_TABLE (e_table));
- if (selected_row == -1)
- return;
-
- selected_node = e_tree_model_node_at_row (e_tree_model, selected_row);
- g_assert (selected_node);
-
- if (e_tree_model_node_get_children (e_tree_model, selected_node, NULL) > 0)
- return;
-
- str = (char*)e_tree_model_node_remove (e_tree_model, selected_node);
- printf ("removed node %s\n", str);
- g_free (str);
-}
-
-static void
-expand_all (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = E_TREE_MODEL (data);
- int selected_row;
- ETreePath *selected_node;
-
- selected_row = e_table_get_cursor_row (E_TABLE (e_table));
- if (selected_row == -1)
- return;
-
- selected_node = e_tree_model_node_at_row (e_tree_model, selected_row);
- g_assert (selected_node);
-
- e_tree_model_node_set_expanded_recurse (e_tree_model, selected_node, TRUE);
-}
-
-static void
-collapse_all (GtkButton *button, gpointer data)
-{
- ETreeModel *e_tree_model = E_TREE_MODEL (data);
- int selected_row;
- ETreePath *selected_node;
-
- selected_row = e_table_get_cursor_row (E_TABLE (e_table));
- if (selected_row == -1)
- return;
-
- selected_node = e_tree_model_node_at_row (e_tree_model, selected_row);
- g_assert (selected_node);
-
- e_tree_model_node_set_expanded_recurse (e_tree_model, selected_node, FALSE);
-}
-
-static void
-print_tree (GtkButton *button, gpointer data)
-{
- EPrintable *printable = e_table_get_printable (E_TABLE (e_table));
- GnomePrintContext *gpc;
-
- gpc = gnome_print_context_new (gnome_printer_new_generic_ps ("tree-out.ps"));
-
- e_printable_print_page (printable, gpc, 8*72, 10*72, FALSE);
-
- gnome_print_context_close (gpc);
-}
-
-/* We create a window containing our new tree. */
-static void
-create_tree (void)
-{
- GtkWidget *window, *frame, *button, *vbox;
- ECell *cell_left_just;
- ECell *cell_tree;
- ETableHeader *e_table_header;
- int i, j;
- ETreeModel *e_tree_model = NULL;
- ETreePath *root_node;
-
- /* here we create our model. This uses the functions we defined
- earlier. */
- e_tree_model = e_tree_simple_new (my_icon_at,
- my_value_at,
- my_set_value_at,
- my_is_editable,
- NULL);
-
- /* create a root node with 5 children */
- root_node = e_tree_model_node_insert (e_tree_model, NULL,
- 0,
- g_strdup("Root Node"));
-
- for (i = 0; i < 5; i++){
- ETreePath *n = e_tree_model_node_insert (e_tree_model,
- root_node, 0,
- g_strdup("First level of children"));
- for (j = 0; j < 5; j ++) {
- e_tree_model_node_insert (e_tree_model,
- n, 0,
- g_strdup("Second level of children"));
- }
- }
-
- /*
- * Next we create a header. The ETableHeader is used in two
- * different way. The first is the full_header. This is the
- * list of possible columns in the view. The second use is
- * completely internal. Many of the ETableHeader functions are
- * for that purpose. The only functions we really need are
- * e_table_header_new and e_table_header_add_col.
- *
- * First we create the header.
- */
- e_table_header = e_table_header_new ();
-
- /*
- * Next we have to build renderers for all of the columns.
- * Since all our columns are text columns, we can simply use
- * the same renderer over and over again. If we had different
- * types of columns, we could use a different renderer for
- * each column.
- */
- cell_left_just = e_cell_text_new (E_TABLE_MODEL(e_tree_model), NULL, GTK_JUSTIFY_LEFT);
-
- /*
- * This renderer is used for the tree column (the leftmost one), and
- * has as its subcell renderer the text renderer. this means that
- * text is displayed to the right of the tree pipes.
- */
- cell_tree = e_cell_tree_new (E_TABLE_MODEL(e_tree_model),
- tree_expanded_pixbuf, tree_unexpanded_pixbuf,
- TRUE, cell_left_just);
-
- /*
- * Next we create a column object for each view column and add
- * them to the header. We don't create a column object for
- * the importance column since it will not be shown.
- */
- for (i = 0; i < COLS; i++) {
- /* Create the column. */
- ETableCol *ecol = e_table_col_new (
- i, headers [i],
- 80, 20,
- i == 0 ? cell_tree
- : cell_left_just,
- g_str_compare, TRUE);
- /* Add it to the header. */
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /*
- * Here we create a window for our new table. This window
- * will get shown and the person will be able to test their
- * item.
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
- /* This frame is simply to get a bevel around our table. */
- vbox = gtk_vbox_new (FALSE, 0);
- frame = gtk_frame_new (NULL);
-
- /*
- * 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.
- */
- e_table = e_table_new (e_table_header, E_TABLE_MODEL(e_tree_model), INITIAL_SPEC);
-
- if (!e_table) printf ("BAH!");
-
- /* Build the gtk widget hierarchy. */
- gtk_container_add (GTK_CONTAINER (frame), e_table);
- gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
-
- button = gtk_button_new_with_label ("Toggle Root Node");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", toggle_root, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Add Sibling");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", add_sibling, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Add Child");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", add_child, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Remove Node");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", remove_node, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Expand All Below");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", expand_all, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Collapse All Below");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", collapse_all, e_tree_model);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- button = gtk_button_new_with_label ("Print Tree");
- gtk_signal_connect (GTK_OBJECT (button), "clicked", print_tree, e_tree_model);
- gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- gtk_container_add (GTK_CONTAINER (window), vbox);
-
- /* Size the initial window. */
- gtk_widget_set_usize (window, 200, 200);
-
- /* Show it all. */
- gtk_widget_show_all (window);
-}
-
-/* This is the main function which just initializes gnome and call our create_tree function */
-
-int
-main (int argc, char *argv [])
-{
- gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- /*
- * Create our pixbuf for expanding/unexpanding
- */
- tree_expanded_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)tree_expanded_xpm);
- tree_unexpanded_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)tree_unexpanded_xpm);
-
- create_tree ();
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
-
diff --git a/widgets/table/e-tree-model.c b/widgets/table/e-tree-model.c
deleted file mode 100644
index c57bf2d683..0000000000
--- a/widgets/table/e-tree-model.c
+++ /dev/null
@@ -1,760 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-model.c: a Tree Model
- *
- * Author:
- * Chris Toshok (toshok@helixcode.com)
- *
- * Adapted from the gtree code and ETableModel.
- *
- * (C) 2000 Helix Code, Inc.
- */
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <stdlib.h>
-#include "e-util/e-util.h"
-#include "e-tree-model.h"
-
-#define ETM_CLASS(e) ((ETreeModelClass *)((GtkObject *)e)->klass)
-
-#define PARENT_TYPE E_TABLE_MODEL_TYPE
-
-static ETableModel *e_tree_model_parent_class;
-
-typedef struct {
- gboolean expanded;
- guint visible_descendents;
- gpointer node_data;
-} ENode;
-
-enum {
- NODE_CHANGED,
- NODE_INSERTED,
- NODE_REMOVED,
- LAST_SIGNAL
-};
-
-static guint e_tree_model_signals [LAST_SIGNAL] = {0, };
-
-static void add_visible_descendents_to_array (ETreeModel *etm, GNode *gnode, int *row, int *count);
-
-
-/* virtual methods */
-
-static void
-etree_destroy (GtkObject *object)
-{
- ETreeModel *etree = E_TREE_MODEL (object);
-
- /* XXX lots of stuff to free here */
- g_array_free (etree->row_array, TRUE);
-
- GTK_OBJECT_CLASS (e_tree_model_parent_class)->destroy (object);
-}
-
-static ETreePath*
-etree_get_root (ETreeModel *etm)
-{
- return etm->root;
-}
-
-static ETreePath*
-etree_get_parent (ETreeModel *etm, ETreePath *path)
-{
- g_return_val_if_fail (path, NULL);
-
- return path->parent;
-}
-
-static ETreePath*
-etree_get_next (ETreeModel *etm, ETreePath *node)
-{
- g_return_val_if_fail (node, NULL);
-
- return g_node_next_sibling(node);
-}
-
-static ETreePath*
-etree_get_prev (ETreeModel *etm, ETreePath *node)
-{
- g_return_val_if_fail (node, NULL);
-
- return g_node_prev_sibling (node);
-}
-
-static guint
-etree_get_children (ETreeModel *etm, ETreePath* node, ETreePath ***paths)
-{
- guint n_children;
-
- g_return_val_if_fail (node, 0);
-
- n_children = g_node_n_children (node);
-
- if (paths) {
- int i;
- (*paths) = g_malloc (sizeof (ETreePath*) * n_children);
- for (i = 0; i < n_children; i ++) {
- (*paths)[i] = g_node_nth_child (node, i);
- }
- }
-
- return n_children;
-}
-
-static gboolean
-etree_is_expanded (ETreeModel *etm, ETreePath* node)
-{
- g_return_val_if_fail (node && node->data, FALSE);
-
- return ((ENode*)node->data)->expanded;
-}
-
-static gboolean
-etree_is_visible (ETreeModel *etm, ETreePath* node)
-{
- g_return_val_if_fail (node, FALSE);
-
- for (node = node->parent; node; node = node->parent) {
- if (!((ENode*)node->data)->expanded)
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-etree_set_expanded (ETreeModel *etm, ETreePath* node, gboolean expanded)
-{
- GNode *child;
- ENode *enode;
- int row;
-
- g_return_if_fail (node && node->data);
-
- enode = ((ENode*)node->data);
-
- if (enode->expanded == expanded)
- return;
-
- enode->expanded = expanded;
-
- /* if the node wasn't visible at present */
- if ((row = e_tree_model_row_of_node (etm, node)) == -1)
- return;
-
- row++;
-
- if (expanded) {
- GNode *parent;
-
- if (e_tree_model_node_is_visible (etm, node)) {
- enode->visible_descendents = 0;
- for (child = g_node_first_child (node); child;
- child = g_node_next_sibling (child)) {
- add_visible_descendents_to_array (etm, child, &row, &enode->visible_descendents);
- }
- }
- /* now iterate back up the tree, adding to our
- ancestors' visible descendents */
-
- for (parent = node->parent; parent; parent = parent->parent) {
- ENode *parent_enode = (ENode*)parent->data;
- parent_enode->visible_descendents += enode->visible_descendents;
- }
- }
- else {
- int i;
- GNode *parent;
-
- if (e_tree_model_node_is_visible (etm, node)) {
- for (i = 0; i < enode->visible_descendents; i ++) {
- etm->row_array = g_array_remove_index (etm->row_array, row);
- e_table_model_row_deleted (E_TABLE_MODEL (etm), row);
- }
- }
- /* now iterate back up the tree, subtracting from our
- ancestors' visible descendents */
-
- for (parent = node->parent; parent; parent = parent->parent) {
- ENode *parent_enode = (ENode*)parent->data;
-
- parent_enode->visible_descendents -= enode->visible_descendents;
- }
-
- enode->visible_descendents = 0;
- }
-}
-
-/* fairly naive implementation */
-static void
-etree_set_expanded_recurse (ETreeModel *etm, ETreePath* node, gboolean expanded)
-{
- ETreePath **paths;
- guint num_children;
- int i;
-
- e_tree_model_node_set_expanded (etm, node, expanded);
-
- num_children = e_tree_model_node_get_children (etm, node, &paths);
- if (num_children) {
- for (i = 0; i < num_children; i ++) {
- e_tree_model_node_set_expanded_recurse (etm, paths[i], expanded);
- }
-
- g_free (paths);
- }
-}
-
-static ETreePath *
-etree_node_at_row (ETreeModel *etree, int row)
-{
- g_return_val_if_fail (row < etree->row_array->len, NULL);
-
- return g_array_index (etree->row_array, GNode*, row);
-}
-
-
-/* ETable analogs */
-static void*
-etree_value_at (ETreeModel *etm, ETreePath* node, int col)
-{
- /* shouldn't be called */
- g_assert (0);
- return NULL;
-}
-
-static GdkPixbuf*
-etree_icon_at (ETreeModel *etm, ETreePath* node)
-{
- /* shouldn't be called */
- g_assert (0);
- return NULL;
-}
-
-static void
-etree_set_value_at (ETreeModel *etm, ETreePath* node, int col, const void *val)
-{
- /* shouldn't be called */
- g_assert (0);
-}
-
-static gboolean
-etree_is_editable (ETreeModel *etm, ETreePath* node, int col)
-{
- /* shouldn't be called */
- g_assert(0);
- return FALSE;
-}
-
-
-/* ETable virtual functions we map */
-static int
-etable_row_count (ETableModel *etm)
-{
- ETreeModel *tree = E_TREE_MODEL (etm);
- return tree->row_array->len;
-}
-
-static void *
-etable_value_at (ETableModel *etm, int col, int row)
-{
- ETreeModel *etree = E_TREE_MODEL(etm);
- ETreeModelClass *et_class = ETM_CLASS(etm);
- ETreePath* node = e_tree_model_node_at_row (etree, row);
-
- g_return_val_if_fail (node, NULL);
-
- if (col == -1)
- return node;
- else if (col == -2)
- return etm;
- else
- return et_class->value_at (etree, node, col);
-}
-
-static void
-etable_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
- ETreeModel *etree = E_TREE_MODEL(etm);
- ETreeModelClass *et_class = ETM_CLASS(etm);
- ETreePath* node = e_tree_model_node_at_row (etree, row);
-
- g_return_if_fail (node);
-
- et_class->set_value_at (etree, node, col, val);
-}
-
-static gboolean
-etable_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ETreeModel *etree = E_TREE_MODEL(etm);
- ETreeModelClass *et_class = ETM_CLASS(etm);
- ETreePath* node = e_tree_model_node_at_row (etree, row);
-
- g_return_val_if_fail (node, FALSE);
-
- return et_class->is_editable (etree, node, col);
-}
-
-
-static void
-e_tree_model_class_init (GtkObjectClass *klass)
-{
- ETableModelClass *table_class = (ETableModelClass *) klass;
- ETreeModelClass *tree_class = (ETreeModelClass *) klass;
-
- e_tree_model_parent_class = gtk_type_class (PARENT_TYPE);
-
- klass->destroy = etree_destroy;
-
- e_tree_model_signals [NODE_CHANGED] =
- gtk_signal_new ("node_changed",
- GTK_RUN_LAST,
- klass->type,
- GTK_SIGNAL_OFFSET (ETreeModelClass, node_changed),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1, GTK_TYPE_POINTER);
-
- e_tree_model_signals [NODE_INSERTED] =
- gtk_signal_new ("node_inserted",
- GTK_RUN_LAST,
- klass->type,
- GTK_SIGNAL_OFFSET (ETreeModelClass, node_inserted),
- gtk_marshal_NONE__POINTER_POINTER,
- GTK_TYPE_NONE, 2, GTK_TYPE_POINTER, GTK_TYPE_POINTER);
-
- e_tree_model_signals [NODE_REMOVED] =
- gtk_signal_new ("node_removed",
- GTK_RUN_LAST,
- klass->type,
- GTK_SIGNAL_OFFSET (ETreeModelClass, node_removed),
- gtk_marshal_NONE__POINTER_POINTER,
- GTK_TYPE_NONE, 2, GTK_TYPE_POINTER, GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (klass, e_tree_model_signals, LAST_SIGNAL);
-
- table_class->row_count = etable_row_count;
- table_class->value_at = etable_value_at;
- table_class->set_value_at = etable_set_value_at;
- table_class->is_cell_editable = etable_is_cell_editable;
-#if 0
- /* XX need to pass these through */
- table_class->duplicate_value = etable_duplicate_value;
- table_class->free_value = etable_free_value;
- table_class->initialize_value = etable_initialize_value;
- table_class->value_is_empty = etable_value_is_empty;
- table_class->value_to_string = etable_value_to_string;
- table_class->thaw = etable_thaw;
-#endif
-
- tree_class->get_root = etree_get_root;
- tree_class->get_prev = etree_get_prev;
- tree_class->get_next = etree_get_next;
- tree_class->get_parent = etree_get_parent;
-
- tree_class->value_at = etree_value_at;
- tree_class->icon_at = etree_icon_at;
- tree_class->set_value_at = etree_set_value_at;
- tree_class->is_editable = etree_is_editable;
-
- tree_class->get_children = etree_get_children;
- tree_class->is_expanded = etree_is_expanded;
- tree_class->is_visible = etree_is_visible;
- tree_class->set_expanded = etree_set_expanded;
- tree_class->set_expanded_recurse = etree_set_expanded_recurse;
- tree_class->node_at_row = etree_node_at_row;
-}
-
-E_MAKE_TYPE(e_tree_model, "ETreeModel", ETreeModel, e_tree_model_class_init, NULL, PARENT_TYPE)
-
-
-/* signals */
-void
-e_tree_model_node_changed (ETreeModel *tree_model, ETreePath *node)
-{
- g_return_if_fail (tree_model != NULL);
- g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-
- gtk_signal_emit (GTK_OBJECT (tree_model),
- e_tree_model_signals [NODE_CHANGED]);
-}
-
-void
-e_tree_model_node_inserted (ETreeModel *tree_model,
- ETreePath *parent_node,
- ETreePath *inserted_node)
-{
- g_return_if_fail (tree_model != NULL);
- g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-
- gtk_signal_emit (GTK_OBJECT (tree_model),
- e_tree_model_signals [NODE_INSERTED],
- parent_node, inserted_node);
-}
-
-void
-e_tree_model_node_removed (ETreeModel *tree_model, ETreePath *parent_node, ETreePath *removed_node)
-{
- g_return_if_fail (tree_model != NULL);
- g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-
- gtk_signal_emit (GTK_OBJECT (tree_model),
- e_tree_model_signals [NODE_REMOVED],
- parent_node, removed_node);
-}
-
-
-void
-e_tree_model_construct (ETreeModel *etree)
-{
- etree->root = NULL;
- etree->root_visible = TRUE;
- etree->row_array = g_array_new (FALSE, FALSE, sizeof(GNode*));
-}
-
-ETreeModel *
-e_tree_model_new ()
-{
- ETreeModel *et;
-
- et = gtk_type_new (e_tree_model_get_type ());
-
- return et;
-}
-
-ETreePath *
-e_tree_model_get_root (ETreeModel *etree)
-{
- return ETM_CLASS(etree)->get_root(etree);
-}
-
-ETreePath *
-e_tree_model_node_at_row (ETreeModel *etree, int row)
-{
- return ETM_CLASS(etree)->node_at_row (etree, row);
-}
-
-GdkPixbuf *
-e_tree_model_icon_of_node (ETreeModel *etree, ETreePath *path)
-{
- return ETM_CLASS(etree)->icon_at (etree, path);
-}
-
-int
-e_tree_model_row_of_node (ETreeModel *etree, ETreePath *node)
-{
- int i;
-
- for (i = 0; i < etree->row_array->len; i ++)
- if (g_array_index (etree->row_array, GNode*, i) == node)
- return i;
-
- g_warning ("e_tree_model_row_of_node failed for node %p\n", node);
-
- return -1;
-}
-
-void
-e_tree_model_root_node_set_visible (ETreeModel *etm, gboolean visible)
-{
- if (visible != etm->root_visible) {
- etm->root_visible = visible;
- if (etm->root) {
- if (visible) {
- etm->row_array = g_array_insert_val (etm->row_array, 0, etm->root);
- }
- else {
- ETreePath *root_path = e_tree_model_get_root (etm);
- e_tree_model_node_set_expanded (etm, root_path, TRUE);
- etm->row_array = g_array_remove_index (etm->row_array, 0);
- }
-
- e_table_model_changed (E_TABLE_MODEL (etm));
- }
- }
-}
-
-gboolean
-e_tree_model_root_node_is_visible (ETreeModel *etm)
-{
- return etm->root_visible;
-}
-
-
-ETreePath *
-e_tree_model_node_get_next (ETreeModel *etree, ETreePath *node)
-{
- return ETM_CLASS(etree)->get_next(etree, node);
-}
-
-ETreePath *
-e_tree_model_node_get_prev (ETreeModel *etree, ETreePath *node)
-{
- return ETM_CLASS(etree)->get_prev(etree, node);
-}
-
-guint
-e_tree_model_node_depth (ETreeModel *etree, ETreePath *path)
-{
- return g_node_depth (path) - 1;
-}
-
-ETreePath *
-e_tree_model_node_get_parent (ETreeModel *etree, ETreePath *path)
-{
- return ETM_CLASS(etree)->get_parent(etree, path);
-}
-
-gboolean
-e_tree_model_node_is_root (ETreeModel *etree, ETreePath *path)
-{
- return (e_tree_model_node_depth (etree, path) == 0);
-}
-
-gboolean
-e_tree_model_node_is_expandable (ETreeModel *etree, ETreePath *path)
-{
- return (e_tree_model_node_get_children (etree, path, NULL) > 0);
-}
-
-gboolean
-e_tree_model_node_is_expanded (ETreeModel *etree, ETreePath *path)
-{
- return ETM_CLASS(etree)->is_expanded (etree, path);
-}
-
-gboolean
-e_tree_model_node_is_visible (ETreeModel *etree, ETreePath *path)
-{
- return ETM_CLASS(etree)->is_visible (etree, path);
-}
-
-void
-e_tree_model_node_set_expanded (ETreeModel *etree, ETreePath *path, gboolean expanded)
-{
- ETM_CLASS(etree)->set_expanded (etree, path, expanded);
-}
-
-void
-e_tree_model_node_set_expanded_recurse (ETreeModel *etree, ETreePath *path, gboolean expanded)
-{
- ETM_CLASS(etree)->set_expanded_recurse (etree, path, expanded);
-}
-
-guint
-e_tree_model_node_get_children (ETreeModel *etree, ETreePath *path, ETreePath ***paths)
-{
- return ETM_CLASS(etree)->get_children (etree, path, paths);
-}
-
-guint
-e_tree_model_node_num_visible_descendents (ETreeModel *etm, ETreePath *node)
-{
- ENode *enode = (ENode*)node->data;
-
- return enode->visible_descendents;
-}
-
-gpointer
-e_tree_model_node_get_data (ETreeModel *etm, ETreePath *node)
-{
- ENode *enode;
-
- g_return_val_if_fail (node && node->data, NULL);
-
- enode = (ENode*)node->data;
-
- return enode->node_data;
-}
-
-void
-e_tree_model_node_set_data (ETreeModel *etm, ETreePath *node, gpointer node_data)
-{
- ENode *enode;
-
- g_return_if_fail (node && node->data);
-
- enode = (ENode*)node->data;
-
- enode->node_data = node_data;
-}
-
-ETreePath*
-e_tree_model_node_insert (ETreeModel *tree_model,
- ETreePath *parent_path,
- int position,
- gpointer node_data)
-{
- ENode *node;
- ETreePath *new_path;
-
- g_return_val_if_fail (parent_path != NULL || tree_model->root == NULL, NULL);
-
- node = g_new0 (ENode, 1);
-
- node->expanded = FALSE;
- node->node_data = node_data;
-
- if (parent_path != NULL) {
-
- new_path = g_node_new (node);
-
- g_node_insert (parent_path, position, new_path);
-
- if (e_tree_model_node_is_visible (tree_model, new_path)) {
- int parent_row;
- GNode *n;
-
- /* we need to iterate back up to the root, incrementing the number of visible
- descendents */
- for (n = parent_path; n; n = n->parent) {
- ENode *parent_enode = (ENode*)n->data;
-
- parent_enode->visible_descendents ++;
- }
-
- /* finally, insert a row into the table */
- if (position == -1)
- position = e_tree_model_node_num_visible_descendents (tree_model, parent_path) - 1;
-
- parent_row = e_tree_model_row_of_node (tree_model, parent_path);
-
- tree_model->row_array = g_array_insert_val (tree_model->row_array,
- parent_row + position + 1, new_path);
-
- e_table_model_row_inserted (E_TABLE_MODEL(tree_model), parent_row + position + 1);
- }
- }
- else {
- tree_model->root = g_node_new (node);
- if (tree_model->root_visible) {
- tree_model->row_array = g_array_insert_val (tree_model->row_array, 0, tree_model->root);
- e_table_model_row_inserted (E_TABLE_MODEL (tree_model), 0);
- }
- else {
- /* need to mark the new node as expanded or
- we'll never see it's children */
- node->expanded = TRUE;
- }
- new_path = tree_model->root;
- }
-
- return new_path;
-}
-
-ETreePath *
-e_tree_model_node_insert_before (ETreeModel *etree,
- ETreePath *parent,
- ETreePath *sibling,
- gpointer node_data)
-{
- return e_tree_model_node_insert (etree, parent,
- g_node_child_position (parent, sibling),
- node_data);
-}
-
-static void
-child_remove (GNode *node, gpointer etree)
-{
- e_tree_model_node_remove (etree, node);
-}
-
-gpointer
-e_tree_model_node_remove (ETreeModel *etree, ETreePath *path)
-{
- GNode *parent = path->parent;
- ENode *enode = (ENode*)path->data;
- gpointer ret = enode->node_data;
-
- /* remove children */
- g_node_children_foreach (path, G_TRAVERSE_ALL, child_remove, etree);
-
- /* clean up the display */
- if (parent) {
- if (e_tree_model_node_is_visible (etree, path)) {
- int row = e_tree_model_row_of_node (etree, path);
- e_table_model_row_deleted (E_TABLE_MODEL (etree), row);
- etree->row_array = g_array_remove_index (etree->row_array, row);
-
- /* we need to iterate back up to the root, incrementing the number of visible
- descendents */
- for (; parent; parent = parent->parent) {
- ENode *parent_enode = (ENode*)parent->data;
-
- parent_enode->visible_descendents --;
- }
- }
- }
- else if (path == etree->root) {
- etree->root = NULL;
- if (etree->root_visible) {
- etree->row_array = g_array_remove_index (etree->row_array, 0);
- e_table_model_row_deleted (E_TABLE_MODEL (etree), 0);
- }
- }
- else {
- /* XXX invalid path */
- return NULL;
- }
-
-
- /* now free up the storage from that path */
- g_node_destroy (path);
- g_free (enode);
-
- return ret;
-}
-
-
-static void
-add_visible_descendents_to_array (ETreeModel *etm, GNode *gnode, int *row, int *count)
-{
- GNode *child;
- ENode *enode;
-
- /* add a row for this node */
- etm->row_array = g_array_insert_val (etm->row_array, (*row), gnode);
- e_table_model_row_inserted (E_TABLE_MODEL (etm), (*row)++);
- (*count) ++;
-
- /* then loop over its children, calling this routine for each
- of them */
- enode = (ENode*)gnode->data;
- if (enode->expanded) {
- for (child = g_node_first_child (gnode); child;
- child = g_node_next_sibling (child)) {
- add_visible_descendents_to_array (etm, child, row, count);
- }
- }
-}
-
-void
-e_tree_model_node_sort (ETreeModel *tree_model,
- ETreePath *node,
- GCompareFunc compare)
-{
- int num_nodes = g_node_n_children (node);
- ETreePath **path_array;
- int i;
-
- if (num_nodes == 0)
- return;
-
- path_array = g_new (ETreePath*, num_nodes);
-
- for (i = 0; i < num_nodes; i ++) {
- path_array[i] = g_node_first_child(node);
- g_node_unlink (path_array[i]);
- }
-
- qsort (path_array, num_nodes, sizeof(ETreePath*), compare);
-
- for (i = 0; i < num_nodes; i ++) {
- g_node_append (node, path_array[i]);
- }
-
- g_free (path_array);
-
- e_table_model_changed (E_TABLE_MODEL (tree_model));
-}
diff --git a/widgets/table/e-tree-model.h b/widgets/table/e-tree-model.h
deleted file mode 100644
index 403aff9a30..0000000000
--- a/widgets/table/e-tree-model.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_TREE_MODEL_H_
-#define _E_TREE_MODEL_H_
-
-#include "e-table-model.h"
-#include "gdk-pixbuf/gdk-pixbuf.h"
-
-#define E_TREE_MODEL_TYPE (e_tree_model_get_type ())
-#define E_TREE_MODEL(o) (GTK_CHECK_CAST ((o), E_TREE_MODEL_TYPE, ETreeModel))
-#define E_TREE_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TREE_MODEL_TYPE, ETreeModelClass))
-#define E_IS_TREE_MODEL(o) (GTK_CHECK_TYPE ((o), E_TREE_MODEL_TYPE))
-#define E_IS_TREE_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TREE_MODEL_TYPE))
-
-typedef GNode ETreePath;
-
-typedef struct {
- ETableModel base;
- GNode *root;
- gboolean root_visible;
- GArray *row_array; /* used in the mapping between ETable and our tree */
-} ETreeModel;
-
-typedef struct {
- ETableModelClass parent_class;
-
- /*
- * Virtual methods
- */
- ETreePath *(*get_root) (ETreeModel *etm);
-
- ETreePath *(*get_parent) (ETreeModel *etm, ETreePath* node);
- ETreePath *(*get_next) (ETreeModel *etm, ETreePath* node);
- ETreePath *(*get_prev) (ETreeModel *etm, ETreePath* node);
- guint (*get_children) (ETreeModel *etm, ETreePath* node, ETreePath ***paths);
-
- gboolean (*is_expanded) (ETreeModel *etm, ETreePath* node);
- gboolean (*is_visible) (ETreeModel *etm, ETreePath* node);
- void (*set_expanded) (ETreeModel *etm, ETreePath* node, gboolean expanded);
- void (*set_expanded_recurse) (ETreeModel *etm, ETreePath *node, gboolean expanded);
- void (*set_expanded_level) (ETreeModel *etm, ETreePath *node, gboolean expanded, int level);
-
- GdkPixbuf *(*icon_at) (ETreeModel *etm, ETreePath* node);
- ETreePath* (*node_at_row) (ETreeModel *etm, int row);
-
- /*
- * ETable analogs
- */
- void *(*value_at) (ETreeModel *etm, ETreePath* node, int col);
- void (*set_value_at) (ETreeModel *etm, ETreePath* node, int col, const void *val);
- gboolean (*is_editable) (ETreeModel *etm, ETreePath* node, int col);
-
-
- /*
- * Signals
- */
- void (*node_changed) (ETreeModel *etm, ETreePath *node);
- void (*node_inserted) (ETreeModel *etm, ETreePath *parent, ETreePath *inserted_node);
- void (*node_removed) (ETreeModel *etm, ETreePath *parent, ETreePath *removed_node);
-
-} ETreeModelClass;
-
-GtkType e_tree_model_get_type (void);
-void e_tree_model_construct (ETreeModel *etree);
-ETreeModel *e_tree_model_new (void);
-
-/* tree traversal operations */
-ETreePath *e_tree_model_get_root (ETreeModel *etree);
-ETreePath *e_tree_model_node_get_parent (ETreeModel *etree, ETreePath *path);
-ETreePath *e_tree_model_node_get_next (ETreeModel *etree, ETreePath *path);
-ETreePath *e_tree_model_node_get_prev (ETreeModel *etree, ETreePath *path);
-
-/* node operations */
-ETreePath *e_tree_model_node_insert (ETreeModel *etree, ETreePath *parent, int position, gpointer node_data);
-ETreePath *e_tree_model_node_insert_before (ETreeModel *etree, ETreePath *parent, ETreePath *sibling, gpointer node_data);
-gpointer e_tree_model_node_remove (ETreeModel *etree, ETreePath *path);
-
-/* node accessors */
-gboolean e_tree_model_node_is_root (ETreeModel *etree, ETreePath *path);
-gboolean e_tree_model_node_is_expandable (ETreeModel *etree, ETreePath *path);
-gboolean e_tree_model_node_is_expanded (ETreeModel *etree, ETreePath *path);
-gboolean e_tree_model_node_is_visible (ETreeModel *etree, ETreePath *path);
-void e_tree_model_node_set_expanded (ETreeModel *etree, ETreePath *path, gboolean expanded);
-void e_tree_model_node_set_expanded_recurse (ETreeModel *etree, ETreePath *path, gboolean expanded);
-guint e_tree_model_node_get_children (ETreeModel *etree, ETreePath *path, ETreePath ***paths);
-guint e_tree_model_node_depth (ETreeModel *etree, ETreePath *path);
-guint e_tree_model_node_num_visible_descendents (ETreeModel *etm, ETreePath *node);
-gpointer e_tree_model_node_get_data (ETreeModel *etm, ETreePath *node);
-void e_tree_model_node_set_data (ETreeModel *etm, ETreePath *node, gpointer node_data);
-
-/* display oriented routines */
-ETreePath *e_tree_model_node_at_row (ETreeModel *etree, int row);
-GdkPixbuf *e_tree_model_icon_of_node (ETreeModel *etree, ETreePath *path);
-int e_tree_model_row_of_node (ETreeModel *etree, ETreePath *path);
-void e_tree_model_root_node_set_visible (ETreeModel *etree, gboolean visible);
-gboolean e_tree_model_root_node_is_visible (ETreeModel *etree);
-
-/* sort routine, analogous to gtk_ctree_node_sort */
-void e_tree_model_node_sort (ETreeModel *tree_model, ETreePath *node, GCompareFunc compare);
-
-/*
-** Routines for emitting signals on the ETreeModel
-*/
-void e_tree_model_node_changed (ETreeModel *tree_model, ETreePath *node);
-void e_tree_model_node_inserted (ETreeModel *tree_model, ETreePath *parent_node, ETreePath *inserted_node);
-void e_tree_model_node_removed (ETreeModel *tree_model, ETreePath *parent_node, ETreePath *removed_node);
-
-#endif /* _E_TREE_MODEL_H */
diff --git a/widgets/table/e-tree-simple.c b/widgets/table/e-tree-simple.c
deleted file mode 100644
index e5883e6ae0..0000000000
--- a/widgets/table/e-tree-simple.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-simple.c: a Tree Model that offers a function pointer
- * interface to using ETreeModel, similar to ETableSimple.
- *
- * Author:
- * Chris Toshok (toshok@helixcode.com)
- *
- * (C) 2000 Helix Code, Inc. */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "e-util/e-util.h"
-#include "e-tree-simple.h"
-
-#define PARENT_TYPE E_TREE_MODEL_TYPE
-
-static void *
-simple_value_at (ETreeModel *etm, ETreePath *node, int col)
-{
- ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
- return simple->value_at (etm, node, col, simple->model_data);
-}
-
-static GdkPixbuf *
-simple_icon_at (ETreeModel *etm, ETreePath *node)
-{
- ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
- return simple->icon_at (etm, node, simple->model_data);
-}
-
-static void
-simple_set_value_at (ETreeModel *etm, ETreePath *node, int col, const void *val)
-{
- ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
- simple->set_value_at (etm, node, col, val, simple->model_data);
-}
-
-static gboolean
-simple_is_editable (ETreeModel *etm, ETreePath *node, int col)
-{
- ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
- return simple->is_editable (etm, node, col, simple->model_data);
-}
-
-static void
-e_tree_simple_class_init (GtkObjectClass *object_class)
-{
- ETreeModelClass *model_class = (ETreeModelClass *) object_class;
-
- model_class->icon_at = simple_icon_at;
- model_class->value_at = simple_value_at;
- model_class->set_value_at = simple_set_value_at;
- model_class->is_editable = simple_is_editable;
-}
-
-E_MAKE_TYPE(e_tree_simple, "ETreeSimple", ETreeSimple, e_tree_simple_class_init, NULL, PARENT_TYPE)
-
-ETreeModel *
-e_tree_simple_new (ETreeSimpleIconAtFn icon_at,
- ETreeSimpleValueAtFn value_at,
- ETreeSimpleSetValueAtFn set_value_at,
- ETreeSimpleIsEditableFn is_editable,
- gpointer model_data)
-{
- ETreeSimple *etg;
-
- etg = gtk_type_new (e_tree_simple_get_type ());
-
- e_tree_model_construct (E_TREE_MODEL (etg));
-
- etg->icon_at = icon_at;
- etg->value_at = value_at;
- etg->set_value_at = set_value_at;
- etg->is_editable = is_editable;
- etg->model_data = model_data;
-
- return (ETreeModel*)etg;
-}
-
diff --git a/widgets/table/e-tree-simple.h b/widgets/table/e-tree-simple.h
deleted file mode 100644
index edda53e82d..0000000000
--- a/widgets/table/e-tree-simple.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#ifndef _E_TREE_SIMPLE_H_
-#define _E_TREE_SIMPLE_H_
-
-#include "e-tree-model.h"
-
-#define E_TREE_SIMPLE_TYPE (e_tree_simple_get_type ())
-#define E_TREE_SIMPLE(o) (GTK_CHECK_CAST ((o), E_TREE_SIMPLE_TYPE, ETreeSimple))
-#define E_TREE_SIMPLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TREE_SIMPLE_TYPE, ETreeSimpleClass))
-#define E_IS_TREE_SIMPLE(o) (GTK_CHECK_TYPE ((o), E_TREE_SIMPLE_TYPE))
-#define E_IS_TREE_SIMPLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TREE_SIMPLE_TYPE))
-
-
-typedef GdkPixbuf* (*ETreeSimpleIconAtFn) (ETreeModel *etree, ETreePath *path, void *model_data);
-typedef void* (*ETreeSimpleValueAtFn) (ETreeModel *etree, ETreePath *path, int col, void *model_data);
-typedef void (*ETreeSimpleSetValueAtFn) (ETreeModel *etree, ETreePath *path, int col, const void *val, void *model_data);
-typedef gboolean (*ETreeSimpleIsEditableFn) (ETreeModel *etree, ETreePath *path, int col, void *model_data);
-
-typedef struct {
- ETreeModel parent;
-
- ETreeSimpleIconAtFn icon_at;
- ETreeSimpleValueAtFn value_at;
- ETreeSimpleSetValueAtFn set_value_at;
- ETreeSimpleIsEditableFn is_editable;
-
- gpointer model_data;
-} ETreeSimple;
-
-typedef struct {
- ETreeModelClass parent_class;
-} ETreeSimpleClass;
-
-GtkType e_tree_simple_get_type (void);
-
-ETreeModel *e_tree_simple_new (ETreeSimpleIconAtFn icon_at,
- ETreeSimpleValueAtFn value_at,
- ETreeSimpleSetValueAtFn set_value_at,
- ETreeSimpleIsEditableFn is_editable,
- gpointer model_data);
-
-#endif /* _E_TREE_SIMPLE_H_ */
diff --git a/widgets/table/image1.png b/widgets/table/image1.png
deleted file mode 100644
index 8326ac241f..0000000000
--- a/widgets/table/image1.png
+++ /dev/null
Binary files differ
diff --git a/widgets/table/image2.png b/widgets/table/image2.png
deleted file mode 100644
index e6a4c75dbe..0000000000
--- a/widgets/table/image2.png
+++ /dev/null
Binary files differ
diff --git a/widgets/table/image3.png b/widgets/table/image3.png
deleted file mode 100644
index 50e16e8620..0000000000
--- a/widgets/table/image3.png
+++ /dev/null
Binary files differ
diff --git a/widgets/table/remove-col.xpm b/widgets/table/remove-col.xpm
deleted file mode 100644
index ff1024f0c9..0000000000
--- a/widgets/table/remove-col.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * remove_col_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #FF0000",
-"... ...",
-".++. .++.",
-".+++. .+++.",
-" .+++. .+++. ",
-" .+++. .+++. ",
-" .+++..+++. ",
-" .++++++. ",
-" .++++. ",
-" .++++. ",
-" .++++++. ",
-" .+++..+++. ",
-" .+++. .+++. ",
-" .+++. .+++. ",
-".+++. .+++.",
-".++. .++.",
-"... ..."};
diff --git a/widgets/table/sample.table b/widgets/table/sample.table
deleted file mode 100644
index 45c8ff0691..0000000000
--- a/widgets/table/sample.table
+++ /dev/null
@@ -1,11 +0,0 @@
-Col1 Col2 Address Title Dorks
-c1.a c2.a a.a tit-1 DorkA
-c1.b c2.b a.b tit-2 DDork
-c1.c c2.c a.c tit-1 DorkB
-c1.d c2.d a.d tit-2 ADork
-c1.e c2.e a.e tit-1 DorkC
-c1.f c2.f a.f tit-2 UDork
-c1.g c2.g a.g tit-3 Dork---
-j k k tit-1 DorkA
-
-
diff --git a/widgets/table/table-test.c b/widgets/table/table-test.c
deleted file mode 100644
index 62160e7035..0000000000
--- a/widgets/table/table-test.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Test code for the ETable package
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- */
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <fcntl.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "table-test.h"
-
-int
-main (int argc, char *argv [])
-{
-
- if (isatty (0)){
- int fd;
-
- close (0);
- fd = open ("sample.table", O_RDONLY);
- if (fd == -1){
- fprintf (stderr, "Could not find sample.table, try feeding a table on stdin");
- exit (1);
- }
- dup2 (fd, 0);
- }
-
- gnome_init ("TableTest", "TableTest", argc, argv);
- e_cursors_init ();
-
-
- table_browser_test ();
- multi_cols_test ();
- check_test ();
-
- e_table_test ();
-
- gtk_main ();
-
- e_cursors_shutdown ();
- return 0;
-}
diff --git a/widgets/table/table-test.h b/widgets/table/table-test.h
deleted file mode 100644
index ad8cfcc083..0000000000
--- a/widgets/table/table-test.h
+++ /dev/null
@@ -1,4 +0,0 @@
-void table_browser_test (void);
-void multi_cols_test (void);
-void check_test (void);
-void e_table_test (void);
diff --git a/widgets/table/test-check.c b/widgets/table/test-check.c
deleted file mode 100644
index 3bb022821e..0000000000
--- a/widgets/table/test-check.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Test code for the ETable package
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- */
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-util/e-cursors.h"
-#include "e-util/e-canvas-utils.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-util.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-
-#include "table-test.h"
-
-#define LINES 4
-
-static struct {
- int value;
- char *string;
-} my_table [LINES] = {
- { 0, "Buy food" },
- { 1, "Breathe " },
- { 0, "Cancel gdb session with shrink" },
- { 1, "Make screenshots" },
-};
-/*
- * ETableSimple callbacks
- */
-static int
-col_count (ETableModel *etc, void *data)
-{
- return 2;
-}
-
-static int
-row_count (ETableModel *etc, void *data)
-{
- return LINES;
-}
-
-static void *
-value_at (ETableModel *etc, int col, int row, void *data)
-{
- g_assert (col < 2);
- g_assert (row < LINES);
-
- if (col == 0)
- return GINT_TO_POINTER (my_table [row].value);
- else
- return my_table [row].string;
-
-}
-
-static void
-set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
- g_assert (col < 2);
- g_assert (row < LINES);
-
- if (col == 0) {
- my_table [row].value = GPOINTER_TO_INT (val);
- printf ("Value at %d,%d set to %d\n", col, row, GPOINTER_TO_INT (val));
- } else {
- my_table [row].string = g_strdup (val);
- printf ("Value at %d,%d set to %s\n", col, row, (char *) val);
- }
-}
-
-static gboolean
-is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- return TRUE;
-}
-
-static void *
-duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0) {
- return (void *) value;
- } else {
- return g_strdup (value);
- }
-}
-
-static void
-free_value (ETableModel *etc, int col, void *value, void *data)
-{
- if (col != 0) {
- g_free (value);
- }
-}
-
-static void *
-initialize_value (ETableModel *etc, int col, void *data)
-{
- if (col == 0)
- return NULL;
- else
- return g_strdup ("");
-}
-
-static gboolean
-value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0)
- return value == NULL;
- else
- return !(value && *(char *)value);
-}
-
-static char *
-value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0)
- return g_strdup_printf("%d", (int) value);
- else
- return g_strdup(value);
-}
-
-static void
-set_canvas_size (GnomeCanvas *canvas, GtkAllocation *alloc)
-{
- gnome_canvas_set_scroll_region (canvas, 0, 0, alloc->width, alloc->height);
-}
-
-void
-check_test (void)
-{
- GtkWidget *canvas, *window;
- ETableModel *e_table_model;
- ETableHeader *e_table_header;
- ETableCol *col_0, *col_1;
- ECell *cell_left_just, *cell_image_check;
- GdkPixbuf *pixbuf;
- GnomeCanvasItem *item;
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- e_table_model = e_table_simple_new (
- col_count, row_count, value_at,
- set_value_at, is_cell_editable,
- duplicate_value, free_value,
- initialize_value, value_is_empty,
- value_to_string,
- NULL);
-
- /*
- * Header
- */
- e_table_header = e_table_header_new ();
-
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- cell_image_check = e_cell_checkbox_new ();
- pixbuf = gdk_pixbuf_new_from_file ("clip.png");
- col_0 = e_table_col_new_with_pixbuf (0, pixbuf, 0.0, 18, cell_image_check, g_int_compare, TRUE);
- gdk_pixbuf_unref (pixbuf);
- e_table_header_add_column (e_table_header, col_0, 0);
-
- col_1 = e_table_col_new (1, "Item Name", 1.0, 20, cell_left_just, g_str_compare, TRUE);
- e_table_header_add_column (e_table_header, col_1, 1);
- e_table_col_set_arrow (col_1, E_TABLE_COL_ARROW_DOWN);
-
- /*
- * GUI
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- canvas = e_canvas_new ();
-
- gtk_signal_connect (GTK_OBJECT (canvas), "size_allocate",
- GTK_SIGNAL_FUNC (set_canvas_size), NULL);
-
- gtk_container_add (GTK_CONTAINER (window), canvas);
- gtk_widget_show_all (window);
- gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_header_item_get_type (),
- "ETableHeader", e_table_header,
- NULL);
-
- item = gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_item_get_type (),
- "ETableHeader", e_table_header,
- "ETableModel", e_table_model,
- "drawgrid", TRUE,
- "drawfocus", TRUE,
-#if 0
- "spreadsheet", TRUE,
-#endif
- "cursor_mode", E_TABLE_CURSOR_SIMPLE,
- NULL);
- e_canvas_item_move_absolute (item, 0, 30);
-}
-
diff --git a/widgets/table/test-cols.c b/widgets/table/test-cols.c
deleted file mode 100644
index c47a1d47d7..0000000000
--- a/widgets/table/test-cols.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Test code for the ETable package
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- */
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-canvas-utils.h"
-#include "e-util/e-canvas.h"
-#include "e-util/e-cursors.h"
-#include "e-util/e-util.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-toggle.h"
-
-#include "table-test.h"
-
-#define LINES 4
-
-static struct {
- int value;
- char *string;
-} my_table [LINES] = {
- { 0, "You are not" },
- { 1, "A beautiful and unique " },
- { 0, "Snowflake" },
- { 2, "You are not your wallet" },
-};
-/*
- * ETableSimple callbacks
- */
-static int
-col_count (ETableModel *etc, void *data)
-{
- return 2;
-}
-
-static int
-row_count (ETableModel *etc, void *data)
-{
- return LINES;
-}
-
-static void *
-value_at (ETableModel *etc, int col, int row, void *data)
-{
- g_assert (col < 2);
- g_assert (row < LINES);
-
- if (col == 0)
- return GINT_TO_POINTER (my_table [row].value);
- else
- return my_table [row].string;
-
-}
-
-static void
-set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
- g_assert (col < 2);
- g_assert (row < LINES);
-
- if (col == 0){
- my_table [row].value = GPOINTER_TO_INT (val);
- printf ("Value at %d,%d set to %d\n", col, row, GPOINTER_TO_INT (val));
- } else {
- my_table [row].string = g_strdup (val);
- printf ("Value at %d,%d set to %s\n", col, row, (char *) val);
- }
-}
-
-static gboolean
-is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- return TRUE;
-}
-
-static void *
-duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0){
- return (void *)value;
- } else {
- return g_strdup (value);
- }
-}
-
-static void
-free_value (ETableModel *etc, int col, void *value, void *data)
-{
- if (col != 0){
- g_free (value);
- }
-}
-
-static void *
-initialize_value (ETableModel *etc, int col, void *data)
-{
- if (col == 0)
- return NULL;
- else
- return g_strdup ("");
-}
-
-static gboolean
-value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0)
- return value == NULL;
- else
- return !(value && *(char *)value);
-}
-
-static char *
-value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- if (col == 0)
- return g_strdup_printf("%d", (int) value);
- else
- return g_strdup(value);
-}
-
-static void
-set_canvas_size (GnomeCanvas *canvas, GtkAllocation *alloc)
-{
- gnome_canvas_set_scroll_region (canvas, 0, 0, alloc->width, alloc->height);
-}
-
-void
-multi_cols_test (void)
-{
- GtkWidget *canvas, *window;
- ETableModel *e_table_model;
- ETableHeader *e_table_header, *e_table_header_multiple;
- ETableCol *col_0, *col_1;
- ECell *cell_left_just, *cell_image_toggle;
- GnomeCanvasItem *item;
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
- e_table_model = e_table_simple_new (
- col_count, row_count, value_at,
- set_value_at, is_cell_editable,
- duplicate_value, free_value,
- initialize_value, value_is_empty,
- value_to_string,
- NULL);
-
- /*
- * Header
- */
- e_table_header = e_table_header_new ();
-
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- {
- GdkPixbuf **images = g_new (GdkPixbuf *, 3);
- int i;
-
- images [0] = gdk_pixbuf_new_from_file ("image1.png");
- images [1] = gdk_pixbuf_new_from_file ("image2.png");
- images [2] = gdk_pixbuf_new_from_file ("image3.png");
-
- cell_image_toggle = e_cell_toggle_new (0, 3, images);
-
- for (i = 0; i < 3; i++)
- gdk_pixbuf_unref (images [i]);
-
- g_free (images);
- }
-
- col_1 = e_table_col_new (1, "Item Name", 1.0, 20, cell_left_just, g_str_compare, TRUE);
- e_table_header_add_column (e_table_header, col_1, 0);
-
- col_0 = e_table_col_new (0, "A", 0.0, 48, cell_image_toggle, g_int_compare, TRUE);
- e_table_header_add_column (e_table_header, col_0, 1);
-
- /*
- * Second test
- */
- e_table_header_multiple = e_table_header_new ();
- e_table_header_add_column (e_table_header_multiple, col_0, 0);
- e_table_header_add_column (e_table_header_multiple, col_1, 1);
- e_table_header_add_column (e_table_header_multiple, col_1, 2);
-
- /*
- * GUI
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- canvas = e_canvas_new ();
-
- gtk_signal_connect (GTK_OBJECT (canvas), "size_allocate",
- GTK_SIGNAL_FUNC (set_canvas_size), NULL);
-
- gtk_container_add (GTK_CONTAINER (window), canvas);
- gtk_widget_show_all (window);
-
- gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_header_item_get_type (),
- "ETableHeader", e_table_header,
- NULL);
-
- item = gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_item_get_type (),
- "ETableHeader", e_table_header,
- "ETableModel", e_table_model,
- "drawgrid", TRUE,
- "drawfocus", TRUE,
- "cursor_mode", E_TABLE_CURSOR_SIMPLE,
-#if 0
- "spreadsheet", TRUE,
-#endif
- NULL);
-
- e_canvas_item_move_absolute (item, 0, 30);
-
- gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_header_item_get_type (),
- "ETableHeader", e_table_header_multiple,
- NULL);
- item = gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_item_get_type (),
- "ETableHeader", e_table_header_multiple,
- "ETableModel", e_table_model,
- "drawgrid", TRUE,
- "drawfocus", TRUE,
-#if 0
- "spreadsheet", TRUE,
-#endif
- "cursor_mode", E_TABLE_CURSOR_SIMPLE,
- NULL);
- e_canvas_item_move_absolute (item, 300, 30);
-}
-
-
-
-
-
diff --git a/widgets/table/test-table.c b/widgets/table/test-table.c
deleted file mode 100644
index b30b412f08..0000000000
--- a/widgets/table/test-table.c
+++ /dev/null
@@ -1,394 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Test code for the ETable package
- *
- * Author:
- * Miguel de Icaza (miguel@gnu.org)
- */
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-util/e-cursors.h"
-#include "e-util/e-canvas.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-table.h"
-#include "e-table-config.h"
-
-#include "table-test.h"
-
-char buffer [1024];
-char **column_labels;
-char ***table_data;
-int cols = 0;
-int lines = 0;
-int lines_alloc = 0;
-
-static void
-parse_headers ()
-{
- char *p, *s;
- int in_value = 0, i;
-
- fgets (buffer, sizeof (buffer)-1, stdin);
-
- for (p = buffer; *p; p++){
- if (*p == ' ' || *p == '\t'){
- if (in_value){
- cols++;
- in_value = 0;
- }
- } else
- in_value = 1;
- }
- if (in_value)
- cols++;
-
- if (!cols){
- fprintf (stderr, "No columns in first row\n");
- exit (1);
- }
-
- column_labels = g_new0 (char *, cols);
-
- p = buffer;
- for (i = 0; (s = strtok (p, " \t")) != NULL; i++){
- column_labels [i] = g_strdup (s);
- if (strchr (column_labels [i], '\n'))
- *strchr (column_labels [i], '\n') = 0;
- p = NULL;
- }
-
- printf ("%d headers:\n", cols);
- for (i = 0; i < cols; i++){
- printf ("header %d: %s\n", i, column_labels [i]);
- }
-}
-
-static char **
-load_line (char *buffer, int cols)
-{
- char **line = g_new0 (char *, cols);
- char *p;
- int i;
-
- for (i = 0; i < cols; i++){
- p = strtok (buffer, " \t\n");
- if (p == NULL){
- for (; i < cols; i++)
- line [i] = g_strdup ("");
- return line;
- } else
- line [i] = g_strdup (p);
- buffer = NULL;
- }
- return line;
-}
-
-static void
-append_line (char **line)
-{
- if (lines <= lines_alloc){
- lines_alloc = lines + 50;
- table_data = g_renew (char **, table_data, lines_alloc);
- }
- table_data [lines] = line;
- lines++;
-}
-
-static void
-load_data ()
-{
- int i;
-
- {
- static int loaded;
-
- if (loaded)
- return;
-
- loaded = TRUE;
- }
-
-
- parse_headers ();
-
- while (fgets (buffer, sizeof (buffer)-1, stdin) != NULL){
- char **line;
-
- if (buffer [0] == '\n')
- continue;
- line = load_line (buffer, cols);
- append_line (line);
- }
-
- for (i = 0; i < lines; i++){
- int j;
-
- printf ("Line %d: ", i);
- for (j = 0; j < cols; j++)
- printf ("[%s] ", table_data [i][j]);
- printf ("\n");
- }
-}
-
-/*
- * ETableSimple callbacks
- */
-static int
-col_count (ETableModel *etc, void *data)
-{
- return cols;
-}
-
-static int
-row_count (ETableModel *etc, void *data)
-{
- return lines;
-}
-
-static void *
-value_at (ETableModel *etc, int col, int row, void *data)
-{
- g_assert (col < cols);
- g_assert (row < lines);
-
- return (void *) table_data [row][col];
-}
-
-static void
-set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
- g_assert (col < cols);
- g_assert (row < lines);
-
- g_free (table_data [row][col]);
- table_data [row][col] = g_strdup (val);
-
- printf ("Value at %d,%d set to %s\n", col, row, (char *) val);
-}
-
-static gboolean
-is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
- return TRUE;
-}
-
-static void *
-duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup (value);
-}
-
-static void
-free_value (ETableModel *etc, int col, void *value, void *data)
-{
- g_free (value);
-}
-
-static void *
-initialize_value (ETableModel *etc, int col, void *data)
-{
- return g_strdup ("");
-}
-
-static gboolean
-value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
- return !(value && *(char *)value);
-}
-
-static char *
-value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
- return g_strdup(value);
-}
-
-static void
-set_canvas_size (GnomeCanvas *canvas, GtkAllocation *alloc)
-{
- gnome_canvas_set_scroll_region (canvas, 0, 0, alloc->width, alloc->height);
-}
-
-void
-table_browser_test (void)
-{
- GtkWidget *canvas, *window;
- ETableModel *e_table_model;
- ETableHeader *e_table_header;
- ECell *cell_left_just;
- GnomeCanvasItem *group;
- int i;
-
- load_data ();
-
- /*
- * Data model
- */
- e_table_model = e_table_simple_new (
- col_count, row_count, value_at,
- set_value_at, is_cell_editable,
- duplicate_value, free_value,
- initialize_value, value_is_empty,
- value_to_string,
- NULL);
-
- /*
- * Header
- */
- e_table_header = e_table_header_new ();
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- for (i = 0; i < cols; i++){
- ETableCol *ecol = e_table_col_new (
- i, column_labels [i],
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
-
- e_table_header_add_column (e_table_header, ecol, i);
- }
-
- /*
- * Setup GUI
- */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- canvas = e_canvas_new ();
-
- gtk_signal_connect (GTK_OBJECT (canvas), "size_allocate",
- GTK_SIGNAL_FUNC (set_canvas_size), NULL);
-
- gtk_container_add (GTK_CONTAINER (window), canvas);
- gtk_widget_show_all (window);
- gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_table_header_item_get_type (),
- "ETableHeader", e_table_header,
- NULL);
-
- group = gnome_canvas_item_new (
- gnome_canvas_root (GNOME_CANVAS (canvas)),
- gnome_canvas_group_get_type (),
- "x", 30.0,
- "y", 30.0,
- NULL);
-
- gnome_canvas_item_new (
- GNOME_CANVAS_GROUP (group),
- e_table_item_get_type (),
- "ETableHeader", e_table_header,
- "ETableModel", e_table_model,
- "drawgrid", TRUE,
- "drawfocus", TRUE,
-#if 0
- "spreadsheet", TRUE,
-#endif
- NULL);
-}
-
-static void
-save_spec (GtkWidget *button, ETable *e_table)
-{
- e_table_save_specification (e_table, "e-table-test.xml");
-}
-
-static void
-row_selection_test (ETable *table, int row, gboolean selected)
-{
- if (selected)
- g_print ("Row %d selected\n", row);
- else
- g_print ("Row %d unselected\n", row);
-}
-
-static void
-toggle_grid (void *nothing, ETable *etable)
-{
- static gboolean shown;
-
- gtk_object_get (GTK_OBJECT (etable), "drawgrid", &shown, NULL);
- gtk_object_set (GTK_OBJECT (etable), "drawgrid", !shown, NULL);
-}
-
-static void
-do_e_table_demo (const char *spec)
-{
- GtkWidget *e_table, *window, *frame, *vbox, *button, *bhide;
- ECell *cell_left_just;
- ETableHeader *full_header;
- int i;
-
- /*
- * Data model
- */
- static ETableModel *e_table_model = NULL;
-
- if (e_table_model == NULL)
- e_table_model =
- e_table_simple_new (col_count, row_count, value_at,
- set_value_at, is_cell_editable,
- duplicate_value, free_value,
- initialize_value, value_is_empty,
- value_to_string,
- NULL);
-
- full_header = e_table_header_new ();
- cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
- for (i = 0; i < cols; i++){
- ETableCol *ecol = e_table_col_new (
- i, column_labels [i],
- 1.0, 20, cell_left_just,
- g_str_compare, TRUE);
-
- e_table_header_add_column (full_header, ecol, i);
- }
-
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- frame = gtk_frame_new (NULL);
- e_table = e_table_new (full_header, e_table_model, spec);
- gtk_signal_connect (GTK_OBJECT(e_table), "row_selection",
- GTK_SIGNAL_FUNC(row_selection_test), NULL);
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), e_table, TRUE, TRUE, 0);
- gtk_container_add (GTK_CONTAINER (frame), vbox);
- gtk_container_add (GTK_CONTAINER (window), frame);
-
- /*
- * gadgets
- */
- button = gtk_button_new_with_label ("Save spec");
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- GTK_SIGNAL_FUNC (save_spec), e_table);
- gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
- bhide = gtk_button_new_with_label ("Toggle Grid");
- gtk_signal_connect (GTK_OBJECT (bhide), "clicked",
- GTK_SIGNAL_FUNC (toggle_grid), e_table);
- gtk_box_pack_start (GTK_BOX (vbox), bhide, FALSE, FALSE, 0);
-
- gtk_widget_set_usize (window, 200, 200);
- gtk_widget_show_all (window);
-
- if (getenv ("TEST")){
- e_table_do_gui_config (NULL, E_TABLE(e_table));
- }
-}
-
-void
-e_table_test (void)
-{
- load_data ();
-
- if (1){/*getenv ("DO")){*/
- do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <leaf column=\"3\" ascending=\"1\"/> </grouping> </ETableSpecification>");
- do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <group column=\"3\" ascending=\"1\"> <group column=\"4\" ascending=\"0\"> <leaf column=\"2\" ascending=\"1\"/> </group> </group> </grouping> </ETableSpecification>");
- }
- do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <group column=\"4\" ascending=\"1\"> <leaf column=\"2\" ascending=\"1\"/> </group> </grouping> </ETableSpecification>");
- do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <group column=\"3\" ascending=\"1\"> <leaf column=\"2\" ascending=\"1\"/> </group> </grouping> </ETableSpecification>");
-}
diff --git a/widgets/table/tree-expanded.xpm b/widgets/table/tree-expanded.xpm
deleted file mode 100644
index fc748953eb..0000000000
--- a/widgets/table/tree-expanded.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * tree_expanded_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" ......... ",
-" .+++++++. ",
-" .+++++++. ",
-" .+++++++. ",
-" .+.....+. ",
-" .+++++++. ",
-" .+++++++. ",
-" .+++++++. ",
-" ......... ",
-" ",
-" ",
-" "};
diff --git a/widgets/table/tree-unexpanded.xpm b/widgets/table/tree-unexpanded.xpm
deleted file mode 100644
index 0dfb12a0a5..0000000000
--- a/widgets/table/tree-unexpanded.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * tree_unexpanded_xpm[] = {
-"16 16 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" ......... ",
-" .+++++++. ",
-" .+++.+++. ",
-" .+++.+++. ",
-" .+.....+. ",
-" .+++.+++. ",
-" .+++.+++. ",
-" .+++++++. ",
-" ......... ",
-" ",
-" ",
-" "};
diff --git a/widgets/text/.cvsignore b/widgets/text/.cvsignore
deleted file mode 100644
index ab703bd5e1..0000000000
--- a/widgets/text/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-e-text-test
-e-entry-test
diff --git a/widgets/text/e-entry-test.c b/widgets/text/e-entry-test.c
deleted file mode 100644
index 411e8d693c..0000000000
--- a/widgets/text/e-entry-test.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-minicard.c
- *
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.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, 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.
- */
-
-
-
-#include "config.h"
-
-#include <gnome.h>
-#include "e-entry.h"
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- 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 ( _( "Minicard Test" ), VERSION,
- _( "Copyright (C) 2000, Helix Code, Inc." ),
- authors,
- _( "This should test the minicard canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *entry;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "EEntry Test", VERSION, argc, argv);
- app = gnome_app_new("EEntry Test", NULL);
-
- entry = e_entry_new();
- gtk_object_set(GTK_OBJECT(entry),
- "editable", TRUE,
- "use_ellipsis", TRUE,
- NULL);
- gnome_app_set_contents( GNOME_APP( app ), entry );
-
- /* Connect the signals */
- gtk_signal_connect( GTK_OBJECT( app ), "destroy",
- GTK_SIGNAL_FUNC( destroy_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/widgets/text/e-entry.c b/widgets/text/e-entry.c
deleted file mode 100644
index cbde382c93..0000000000
--- a/widgets/text/e-entry.c
+++ /dev/null
@@ -1,408 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * E-table.c: A graphical view of a Table.
- *
- * Author:
- * Miguel de Icaza (miguel@helixcode.com)
- * Chris Lahey (clahey@helixcode.com)
- *
- * Copyright 1999, Helix Code, Inc
- */
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
-#include <stdio.h>
-#include <libgnomeui/gnome-canvas.h>
-#include <gtk/gtksignal.h>
-#include <gnome-xml/parser.h>
-#include "e-util/e-util.h"
-#include "e-util/e-canvas.h"
-#include "e-entry.h"
-#include "e-util/e-canvas-utils.h"
-
-#define MIN_ENTRY_WIDTH 150
-#define INNER_BORDER 2
-
-#define PARENT_TYPE gtk_table_get_type ()
-
-static GtkObjectClass *parent_class;
-
-enum {
- E_ENTRY_CHANGED,
- E_ENTRY_ACTIVATE,
- E_ENTRY_LAST_SIGNAL
-};
-
-static guint e_entry_signals[E_ENTRY_LAST_SIGNAL] = { 0 };
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_MODEL,
- ARG_EVENT_PROCESSOR,
- ARG_TEXT,
- ARG_FONT,
- ARG_FONTSET,
- ARG_FONT_GDK,
- ARG_ANCHOR,
- ARG_JUSTIFICATION,
- ARG_X_OFFSET,
- ARG_Y_OFFSET,
- ARG_FILL_COLOR,
- ARG_FILL_COLOR_GDK,
- ARG_FILL_COLOR_RGBA,
- ARG_FILL_STIPPLE,
- ARG_EDITABLE,
- ARG_USE_ELLIPSIS,
- ARG_ELLIPSIS,
- ARG_LINE_WRAP,
- ARG_BREAK_CHARACTERS,
- ARG_MAX_LINES,
- ARG_WIDTH,
- ARG_HEIGHT
-};
-
-static void
-canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc,
- EEntry *e_entry)
-{
- gnome_canvas_set_scroll_region (
- e_entry->canvas,
- 0, 0, alloc->width, alloc->height);
- gtk_object_set (GTK_OBJECT (e_entry->item),
- "clip_width", (double) alloc->width,
- "clip_height", (double) alloc->height,
- NULL);
-}
-
-static void
-canvas_size_request (GtkWidget *widget, GtkRequisition *requisition,
- EEntry *e_entry)
-{
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GNOME_IS_CANVAS (widget));
- g_return_if_fail (requisition != NULL);
-
- requisition->width = MIN_ENTRY_WIDTH + (widget->style->klass->xthickness + INNER_BORDER) * 2;
- requisition->height = (widget->style->font->ascent +
- widget->style->font->descent +
- (widget->style->klass->ythickness + INNER_BORDER) * 2);
-}
-
-static void
-e_entry_init (GtkObject *object)
-{
- EEntry *e_entry = E_ENTRY (object);
- GtkTable *gtk_table = GTK_TABLE (object);
-
- e_entry->canvas = GNOME_CANVAS(e_canvas_new());
- gtk_signal_connect(GTK_OBJECT(e_entry->canvas), "size_allocate",
- GTK_SIGNAL_FUNC(canvas_size_allocate), e_entry);
- gtk_signal_connect(GTK_OBJECT(e_entry->canvas), "size_request",
- GTK_SIGNAL_FUNC(canvas_size_request), e_entry);
- e_entry->item = E_TEXT(gnome_canvas_item_new(gnome_canvas_root(e_entry->canvas),
- e_text_get_type(),
- "clip", TRUE,
- "fill_clip_rectangle", TRUE,
- "anchor", GTK_ANCHOR_NW,
- "draw_borders", TRUE,
- NULL));
-
- gtk_table_attach_defaults(gtk_table, GTK_WIDGET(e_entry->canvas),
- 0, 1, 0, 1);
- gtk_widget_show(GTK_WIDGET(e_entry->canvas));
-}
-
-EEntry *
-e_entry_construct (EEntry *e_entry)
-{
- return e_entry;
-}
-
-GtkWidget *
-e_entry_new (void)
-{
- EEntry *e_entry;
- e_entry = gtk_type_new (e_entry_get_type ());
- e_entry = e_entry_construct (e_entry);
-
- return GTK_WIDGET (e_entry);
-}
-
-static void
-et_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EEntry *ee = E_ENTRY (o);
-
- switch (arg_id){
- case ARG_MODEL:
- gtk_object_get(GTK_OBJECT(ee->item),
- "model", &GTK_VALUE_OBJECT (*arg),
- NULL);
- break;
-
- case ARG_EVENT_PROCESSOR:
- gtk_object_get(GTK_OBJECT(ee->item),
- "event_processor", &GTK_VALUE_OBJECT (*arg),
- NULL);
- break;
-
- case ARG_TEXT:
- gtk_object_get(GTK_OBJECT(ee->item),
- "text", &GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_FONT_GDK:
- gtk_object_get(GTK_OBJECT(ee->item),
- "font_gdk", &GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_JUSTIFICATION:
- gtk_object_get(GTK_OBJECT(ee->item),
- "justification", &GTK_VALUE_ENUM (*arg),
- NULL);
- break;
-
- case ARG_FILL_COLOR_GDK:
- gtk_object_get(GTK_OBJECT(ee->item),
- "fill_color_gdk", &GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_FILL_COLOR_RGBA:
- gtk_object_get(GTK_OBJECT(ee->item),
- "fill_color_rgba", &GTK_VALUE_UINT (*arg),
- NULL);
- break;
-
- case ARG_FILL_STIPPLE:
- gtk_object_get(GTK_OBJECT(ee->item),
- "fill_stiple", &GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_EDITABLE:
- gtk_object_get(GTK_OBJECT(ee->item),
- "editable", &GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_USE_ELLIPSIS:
- gtk_object_get(GTK_OBJECT(ee->item),
- "use_ellipsis", &GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_ELLIPSIS:
- gtk_object_get(GTK_OBJECT(ee->item),
- "ellipsis", &GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_LINE_WRAP:
- gtk_object_get(GTK_OBJECT(ee->item),
- "line_wrap", &GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_BREAK_CHARACTERS:
- gtk_object_get(GTK_OBJECT(ee->item),
- "break_characters", &GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_MAX_LINES:
- gtk_object_get(GTK_OBJECT(ee->item),
- "max_lines", &GTK_VALUE_INT (*arg),
- NULL);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static void
-et_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EEntry *ee = E_ENTRY (o);
-
- switch (arg_id){
- case ARG_MODEL:
- gtk_object_set(GTK_OBJECT(ee->item),
- "model", GTK_VALUE_OBJECT (*arg),
- NULL);
- break;
-
- case ARG_EVENT_PROCESSOR:
- gtk_object_set(GTK_OBJECT(ee->item),
- "event_processor", GTK_VALUE_OBJECT (*arg),
- NULL);
- break;
-
- case ARG_TEXT:
- gtk_object_set(GTK_OBJECT(ee->item),
- "text", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_FONT:
- gtk_object_set(GTK_OBJECT(ee->item),
- "font", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_FONTSET:
- gtk_object_set(GTK_OBJECT(ee->item),
- "fontset", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_FONT_GDK:
- gtk_object_set(GTK_OBJECT(ee->item),
- "font_gdk", GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_JUSTIFICATION:
- gtk_object_set(GTK_OBJECT(ee->item),
- "justification", GTK_VALUE_ENUM (*arg),
- NULL);
- break;
-
- case ARG_FILL_COLOR:
- gtk_object_set(GTK_OBJECT(ee->item),
- "fill_color", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_FILL_COLOR_GDK:
- gtk_object_set(GTK_OBJECT(ee->item),
- "fill_color_gdk", GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_FILL_COLOR_RGBA:
- gtk_object_set(GTK_OBJECT(ee->item),
- "fill_color_rgba", GTK_VALUE_UINT (*arg),
- NULL);
- break;
-
- case ARG_FILL_STIPPLE:
- gtk_object_set(GTK_OBJECT(ee->item),
- "fill_stiple", GTK_VALUE_BOXED (*arg),
- NULL);
- break;
-
- case ARG_EDITABLE:
- gtk_object_set(GTK_OBJECT(ee->item),
- "editable", GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_USE_ELLIPSIS:
- gtk_object_set(GTK_OBJECT(ee->item),
- "use_ellipsis", GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_ELLIPSIS:
- gtk_object_set(GTK_OBJECT(ee->item),
- "ellipsis", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_LINE_WRAP:
- gtk_object_set(GTK_OBJECT(ee->item),
- "line_wrap", GTK_VALUE_BOOL (*arg),
- NULL);
- break;
-
- case ARG_BREAK_CHARACTERS:
- gtk_object_set(GTK_OBJECT(ee->item),
- "break_characters", GTK_VALUE_STRING (*arg),
- NULL);
- break;
-
- case ARG_MAX_LINES:
- gtk_object_set(GTK_OBJECT(ee->item),
- "max_lines", GTK_VALUE_INT (*arg),
- NULL);
- break;
- }
-}
-
-static void
-e_entry_class_init (GtkObjectClass *object_class)
-{
- EEntryClass *klass = E_ENTRY_CLASS(object_class);
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->set_arg = et_set_arg;
- object_class->get_arg = et_get_arg;
-
- klass->changed = NULL;
- klass->activate = NULL;
-
- e_entry_signals[E_ENTRY_CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EEntryClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- e_entry_signals[E_ENTRY_ACTIVATE] =
- gtk_signal_new ("activate",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EEntryClass, activate),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
-
- gtk_object_class_add_signals (object_class, e_entry_signals, E_ENTRY_LAST_SIGNAL);
-
- gtk_object_add_arg_type ("EEntry::model",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_MODEL);
- gtk_object_add_arg_type ("EEntry::event_processor",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_EVENT_PROCESSOR);
- gtk_object_add_arg_type ("EEntry::text",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_TEXT);
- gtk_object_add_arg_type ("EEntry::font",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FONT);
- gtk_object_add_arg_type ("EEntry::fontset",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FONTSET);
- gtk_object_add_arg_type ("EEntry::font_gdk",
- GTK_TYPE_GDK_FONT, GTK_ARG_READWRITE, ARG_FONT_GDK);
- gtk_object_add_arg_type ("EEntry::justification",
- GTK_TYPE_JUSTIFICATION, GTK_ARG_READWRITE, ARG_JUSTIFICATION);
- gtk_object_add_arg_type ("EEntry::fill_color",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FILL_COLOR);
- gtk_object_add_arg_type ("EEntry::fill_color_gdk",
- GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_FILL_COLOR_GDK);
- gtk_object_add_arg_type ("EEntry::fill_color_rgba",
- GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_FILL_COLOR_RGBA);
- gtk_object_add_arg_type ("EEntry::fill_stipple",
- GTK_TYPE_GDK_WINDOW, GTK_ARG_READWRITE, ARG_FILL_STIPPLE);
- gtk_object_add_arg_type ("EEntry::editable",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_EDITABLE);
- gtk_object_add_arg_type ("EEntry::use_ellipsis",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_USE_ELLIPSIS);
- gtk_object_add_arg_type ("EEntry::ellipsis",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ELLIPSIS);
- gtk_object_add_arg_type ("EEntry::line_wrap",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_LINE_WRAP);
- gtk_object_add_arg_type ("EEntry::break_characters",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_BREAK_CHARACTERS);
- gtk_object_add_arg_type ("EEntry::max_lines",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_MAX_LINES);
-}
-
-E_MAKE_TYPE(e_entry, "EEntry", EEntry, e_entry_class_init, e_entry_init, PARENT_TYPE);
diff --git a/widgets/text/e-entry.h b/widgets/text/e-entry.h
deleted file mode 100644
index ad349659c3..0000000000
--- a/widgets/text/e-entry.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_ENTRY_H_
-#define _E_ENTRY_H_
-
-#include <libgnomeui/gnome-canvas.h>
-#include <gtk/gtktable.h>
-#include <gnome-xml/tree.h>
-#include "e-text.h"
-
-BEGIN_GNOME_DECLS
-
-#define E_ENTRY_TYPE (e_entry_get_type ())
-#define E_ENTRY(o) (GTK_CHECK_CAST ((o), E_ENTRY_TYPE, EEntry))
-#define E_ENTRY_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_ENTRY_TYPE, EEntryClass))
-#define E_IS_ENTRY(o) (GTK_CHECK_TYPE ((o), E_ENTRY_TYPE))
-#define E_IS_ENTRY_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_ENTRY_TYPE))
-
-typedef struct {
- GtkTable parent;
-
- GnomeCanvas *canvas;
- EText *item;
-} EEntry;
-
-typedef struct {
- GtkTableClass parent_class;
-
- void (* changed) (EEntry *entry);
- void (* activate) (EEntry *entry);
-} EEntryClass;
-
-GtkType e_entry_get_type (void);
-
-EEntry *e_entry_construct (EEntry *e_entry);
-GtkWidget *e_entry_new (void);
-
-END_GNOME_DECLS
-
-#endif /* _E_ENTRY_H_ */
diff --git a/widgets/text/e-table-text-model.c b/widgets/text/e-table-text-model.c
deleted file mode 100644
index 5b6fa8b707..0000000000
--- a/widgets/text/e-table-text-model.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ETableTextModel - Text item model for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#include <config.h>
-#include <ctype.h>
-#include "e-table-text-model.h"
-
-static void e_table_text_model_class_init (ETableTextModelClass *class);
-static void e_table_text_model_init (ETableTextModel *model);
-static void e_table_text_model_destroy (GtkObject *object);
-
-static gchar *e_table_text_model_get_text (ETextModel *model);
-static void e_table_text_model_set_text (ETextModel *model, gchar *text);
-static void e_table_text_model_insert (ETextModel *model, gint postion, gchar *text);
-static void e_table_text_model_insert_length (ETextModel *model, gint postion, gchar *text, gint length);
-static void e_table_text_model_delete (ETextModel *model, gint postion, gint length);
-
-static GtkObject *parent_class;
-
-
-
-/**
- * e_table_text_model_get_type:
- * @void:
- *
- * Registers the &ETableTextModel class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ETableTextModel class.
- **/
-GtkType
-e_table_text_model_get_type (void)
-{
- static GtkType model_type = 0;
-
- if (!model_type) {
- GtkTypeInfo model_info = {
- "ETableTextModel",
- sizeof (ETableTextModel),
- sizeof (ETableTextModelClass),
- (GtkClassInitFunc) e_table_text_model_class_init,
- (GtkObjectInitFunc) e_table_text_model_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- model_type = gtk_type_unique (e_text_model_get_type (), &model_info);
- }
-
- return model_type;
-}
-
-/* Class initialization function for the text item */
-static void
-e_table_text_model_class_init (ETableTextModelClass *klass)
-{
- GtkObjectClass *object_class;
- ETextModelClass *model_class;
-
- object_class = (GtkObjectClass *) klass;
- model_class = (ETextModelClass *) klass;
-
- parent_class = gtk_type_class (e_text_model_get_type ());
-
- model_class->get_text = e_table_text_model_get_text;
- model_class->set_text = e_table_text_model_set_text;
- model_class->insert = e_table_text_model_insert;
- model_class->insert_length = e_table_text_model_insert_length;
- model_class->delete = e_table_text_model_delete;
-
- object_class->destroy = e_table_text_model_destroy;
-}
-
-/* Object initialization function for the text item */
-static void
-e_table_text_model_init (ETableTextModel *model)
-{
- model->model = NULL;
- model->row = 0;
- model->model_col = 0;
- model->cell_changed_signal_id = 0;
- model->row_changed_signal_id = 0;
-}
-
-/* Destroy handler for the text item */
-static void
-e_table_text_model_destroy (GtkObject *object)
-{
- ETableTextModel *model;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_TABLE_TEXT_MODEL (object));
-
- model = E_TABLE_TEXT_MODEL (object);
-
- if (model->model)
- g_assert (GTK_IS_OBJECT (model->model));
-
- if (model->cell_changed_signal_id)
- gtk_signal_disconnect (GTK_OBJECT(model->model),
- model->cell_changed_signal_id);
-
- if (model->row_changed_signal_id)
- gtk_signal_disconnect (GTK_OBJECT(model->model),
- model->row_changed_signal_id);
-
- if (model->model)
- gtk_object_unref (GTK_OBJECT(model->model));
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-static gchar *
-e_table_text_model_get_text (ETextModel *text_model)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model)
- return (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- else
- return "";
-}
-
-static void
-e_table_text_model_set_text (ETextModel *text_model, gchar *text)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model)
- e_table_model_set_value_at (model->model, model->model_col, model->row, (void *) text);
-}
-
-static void
-e_table_text_model_insert (ETextModel *text_model, gint position, gchar *text)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model){
- gchar *temp = (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- temp = g_strdup_printf ("%.*s%s%s", position, temp, text, temp + position);
- e_table_model_set_value_at (model->model, model->model_col, model->row, temp);
- g_free (temp);
- }
-}
-
-static void
-e_table_text_model_insert_length (ETextModel *text_model, gint position, gchar *text, gint length)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model){
- gchar *temp = (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- temp = g_strdup_printf ("%.*s%.*s%s", position, temp, length, text, temp + position);
- e_table_model_set_value_at (model->model, model->model_col, model->row, temp);
- g_free (temp);
- }
-}
-
-static void
-e_table_text_model_delete (ETextModel *text_model, gint position, gint length)
-{
- ETableTextModel *model = E_TABLE_TEXT_MODEL(text_model);
- if (model->model){
- gchar *temp = (gchar *)e_table_model_value_at (model->model, model->model_col, model->row);
- temp = g_strdup_printf ("%.*s%s", position, temp, temp + position + length);
- e_table_model_set_value_at (model->model, model->model_col, model->row, temp);
- g_free (temp);
- }
-}
-
-static void
-cell_changed (ETableModel *table_model, int model_col, int row, ETableTextModel *model)
-{
- if (model->model_col == model_col &&
- model->row == row)
- e_text_model_changed (E_TEXT_MODEL(model));
-}
-
-static void
-row_changed (ETableModel *table_model, int row, ETableTextModel *model)
-{
- if (model->row == row)
- e_text_model_changed (E_TEXT_MODEL(model));
-}
-
-ETableTextModel *
-e_table_text_model_new (ETableModel *table_model, int row, int model_col)
-{
- ETableTextModel *model = gtk_type_new (e_table_text_model_get_type ());
- model->model = table_model;
- if (model->model){
- gtk_object_ref (GTK_OBJECT(model->model));
- model->cell_changed_signal_id =
- gtk_signal_connect (GTK_OBJECT(model->model),
- "model_cell_changed",
- GTK_SIGNAL_FUNC(cell_changed),
- model);
- model->row_changed_signal_id =
- gtk_signal_connect (GTK_OBJECT(model->model),
- "model_row_changed",
- GTK_SIGNAL_FUNC(row_changed),
- model);
- }
- model->row = row;
- model->model_col = model_col;
- return model;
-}
-
diff --git a/widgets/text/e-table-text-model.h b/widgets/text/e-table-text-model.h
deleted file mode 100644
index dcc9afde7c..0000000000
--- a/widgets/text/e-table-text-model.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ETableTextModel - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#ifndef E_TABLE_TEXT_MODEL_H
-#define E_TABLE_TEXT_MODEL_H
-
-#include <gnome.h>
-#include "e-text-model.h"
-#include "e-table-model.h"
-
-
-BEGIN_GNOME_DECLS
-
-#define E_TYPE_TABLE_TEXT_MODEL (e_table_text_model_get_type ())
-#define E_TABLE_TEXT_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TABLE_TEXT_MODEL, ETableTextModel))
-#define E_TABLE_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TABLE_TEXT_MODEL, ETableTextModelClass))
-#define E_IS_TABLE_TEXT_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TABLE_TEXT_MODEL))
-#define E_IS_TABLE_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_TABLE_TEXT_MODEL))
-
-typedef struct _ETableTextModel ETableTextModel;
-typedef struct _ETableTextModelClass ETableTextModelClass;
-
-struct _ETableTextModel {
- ETextModel parent;
-
- ETableModel *model;
- int row;
- int model_col;
-
- int cell_changed_signal_id;
- int row_changed_signal_id;
-};
-
-struct _ETableTextModelClass {
- ETextModelClass parent_class;
-
-};
-
-
-/* Standard Gtk function */
-GtkType e_table_text_model_get_type (void);
-ETableTextModel *e_table_text_model_new (ETableModel *table_model, int row, int model_col);
-
-END_GNOME_DECLS
-
-#endif
diff --git a/widgets/text/e-text-event-processor-emacs-like.c b/widgets/text/e-text-event-processor-emacs-like.c
deleted file mode 100644
index be323d028f..0000000000
--- a/widgets/text/e-text-event-processor-emacs-like.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-text-event-processor-emacs-like.h"
-static void e_text_event_processor_emacs_like_init (ETextEventProcessorEmacsLike *card);
-static void e_text_event_processor_emacs_like_class_init (ETextEventProcessorEmacsLikeClass *klass);
-static gint e_text_event_processor_emacs_like_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event);
-
-static ETextEventProcessorClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0
-};
-
-static const ETextEventProcessorCommand control_keys[26] =
-{
- { E_TEP_START_OF_LINE, E_TEP_MOVE, 0, "" }, /* a */
- { E_TEP_BACKWARD_CHARACTER, E_TEP_MOVE, 0, "" }, /* b */
- { E_TEP_SELECTION, E_TEP_COPY, 0, "" }, /* c */
- { E_TEP_FORWARD_CHARACTER, E_TEP_DELETE, 0, "" }, /* d */
- { E_TEP_END_OF_LINE, E_TEP_MOVE, 0, "" }, /* e */
- { E_TEP_FORWARD_CHARACTER, E_TEP_MOVE, 0, "" }, /* f */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* g */
- { E_TEP_BACKWARD_CHARACTER, E_TEP_DELETE, 0, "" }, /* h */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* i */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* j */
- { E_TEP_END_OF_LINE, E_TEP_DELETE, 0, "" }, /* k */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* l */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* m */
- { E_TEP_FORWARD_LINE, E_TEP_MOVE, 0, "" }, /* n */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* o */
- { E_TEP_BACKWARD_LINE, E_TEP_MOVE, 0, "" }, /* p */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* q */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* r */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* s */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* t */
- { E_TEP_START_OF_LINE, E_TEP_DELETE, 0, "" }, /* u */
- { E_TEP_SELECTION, E_TEP_PASTE, 0, "" }, /* v */
- { E_TEP_SELECTION, E_TEP_DELETE, 0, "" }, /* w */
- { E_TEP_SELECTION, E_TEP_DELETE, 0, "" }, /* x */
- { E_TEP_SELECTION, E_TEP_PASTE, 0, "" }, /* y */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" } /* z */
-};
-
-static const ETextEventProcessorCommand alt_keys[26] =
-{
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* a */
- { E_TEP_BACKWARD_WORD, E_TEP_MOVE, 0, "" }, /* b */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* c */
- { E_TEP_FORWARD_WORD, E_TEP_DELETE, 0, "" }, /* d */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* e */
- { E_TEP_FORWARD_WORD, E_TEP_MOVE, 0, "" }, /* f */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* g */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* h */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* i */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* j */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* k */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* l */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* m */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* n */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* o */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* p */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* q */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* r */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* s */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* t */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* u */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* v */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* w */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* x */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" }, /* y */
- { E_TEP_SELECTION, E_TEP_NOP, 0, "" } /* z */
-
-};
-
-GtkType
-e_text_event_processor_emacs_like_get_type (void)
-{
- static GtkType text_event_processor_emacs_like_type = 0;
-
- if (!text_event_processor_emacs_like_type)
- {
- static const GtkTypeInfo text_event_processor_emacs_like_info =
- {
- "ETextEventProcessorEmacsLike",
- sizeof (ETextEventProcessorEmacsLike),
- sizeof (ETextEventProcessorEmacsLikeClass),
- (GtkClassInitFunc) e_text_event_processor_emacs_like_class_init,
- (GtkObjectInitFunc) e_text_event_processor_emacs_like_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- text_event_processor_emacs_like_type = gtk_type_unique (e_text_event_processor_get_type (), &text_event_processor_emacs_like_info);
- }
-
- return text_event_processor_emacs_like_type;
-}
-
-static void
-e_text_event_processor_emacs_like_class_init (ETextEventProcessorEmacsLikeClass *klass)
-{
- GtkObjectClass *object_class;
- ETextEventProcessorClass *processor_class;
-
- object_class = (GtkObjectClass*) klass;
- processor_class = (ETextEventProcessorClass*) klass;
-
- parent_class = gtk_type_class (e_text_event_processor_get_type ());
-
- processor_class->event = e_text_event_processor_emacs_like_event;
-}
-
-static void
-e_text_event_processor_emacs_like_init (ETextEventProcessorEmacsLike *tep)
-{
-}
-
-static gint
-e_text_event_processor_emacs_like_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event)
-{
- ETextEventProcessorCommand command;
- ETextEventProcessorEmacsLike *tep_el = E_TEXT_EVENT_PROCESSOR_EMACS_LIKE(tep);
- command.action = E_TEP_NOP;
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- if (event->button.button == 1) {
- command.action = E_TEP_GRAB;
- command.time = event->button.time;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
- if (event->button.state & GDK_SHIFT_MASK)
- command.action = E_TEP_SELECT;
- else
- command.action = E_TEP_MOVE;
- command.position = E_TEP_VALUE;
- command.value = event->button.position;
- command.time = event->button.time;
- tep_el->mouse_down = TRUE;
- }
- break;
- case GDK_2BUTTON_PRESS:
- if (event->button.button == 1) {
- command.action = E_TEP_SELECT;
- command.position = E_TEP_SELECT_WORD;
- command.time = event->button.time;
- }
- break;
- case GDK_3BUTTON_PRESS:
- if (event->button.button == 1) {
- command.action = E_TEP_SELECT;
- command.position = E_TEP_SELECT_ALL;
- command.time = event->button.time;
- }
- break;
- case GDK_BUTTON_RELEASE:
- if (event->button.button == 1) {
- command.action = E_TEP_UNGRAB;
- command.time = event->button.time;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
- command.time = event->button.time;
- tep_el->mouse_down = FALSE;
- command.action = E_TEP_NOP;
- } else if (event->button.button == 2) {
- command.action = E_TEP_MOVE;
- command.position = E_TEP_VALUE;
- command.value = event->button.position;
- command.time = event->button.time;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
-
- command.action = E_TEP_GET_SELECTION;
- command.position = E_TEP_SELECTION;
- command.value = 0;
- command.time = event->button.time;
- }
- break;
- case GDK_MOTION_NOTIFY:
- if (tep_el->mouse_down) {
- command.action = E_TEP_SELECT;
- command.position = E_TEP_VALUE;
- command.time = event->motion.time;
- command.value = event->motion.position;
- }
- break;
- case GDK_KEY_PRESS:
- {
- ETextEventProcessorEventKey key = event->key;
- command.time = event->key.time;
- if (key.state & GDK_SHIFT_MASK)
- command.action = E_TEP_SELECT;
- else
- command.action = E_TEP_MOVE;
- switch(key.keyval) {
- case GDK_Home:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_START_OF_BUFFER;
- else
- command.position = E_TEP_START_OF_LINE;
- break;
- case GDK_End:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_END_OF_BUFFER;
- else
- command.position = E_TEP_END_OF_LINE;
- break;
- case GDK_Page_Up: command.position = E_TEP_BACKWARD_PAGE; break;
- case GDK_Page_Down: command.position = E_TEP_FORWARD_PAGE; break;
- /* CUA has Ctrl-Up/Ctrl-Down as paragraph up down */
- case GDK_Up: command.position = E_TEP_BACKWARD_LINE; break;
- case GDK_Down: command.position = E_TEP_FORWARD_LINE; break;
- case GDK_Left:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_BACKWARD_WORD;
- else
- command.position = E_TEP_BACKWARD_CHARACTER;
- break;
- case GDK_Right:
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_FORWARD_WORD;
- else
- command.position = E_TEP_FORWARD_CHARACTER;
- break;
-
- case GDK_BackSpace:
- command.action = E_TEP_DELETE;
- if (key.state & GDK_CONTROL_MASK)
- command.position = E_TEP_BACKWARD_WORD;
- else
- command.position = E_TEP_BACKWARD_CHARACTER;
- break;
- case GDK_Clear:
- command.action = E_TEP_DELETE;
- command.position = E_TEP_END_OF_LINE;
- break;
- case GDK_Insert:
- if (key.state & GDK_SHIFT_MASK) {
- command.action = E_TEP_PASTE;
- command.position = E_TEP_SELECTION;
- } else if (key.state & GDK_CONTROL_MASK) {
- command.action = E_TEP_COPY;
- command.position = E_TEP_SELECTION;
- } else {
- /* gtk_toggle_insert(text) -- IMPLEMENT */
- }
- break;
- case GDK_Delete:
- if (key.state & GDK_CONTROL_MASK){
- command.action = E_TEP_DELETE;
- command.position = E_TEP_FORWARD_WORD;
- } else if (key.state & GDK_SHIFT_MASK) {
- command.action = E_TEP_COPY;
- command.position = E_TEP_SELECTION;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
-
- command.action = E_TEP_DELETE;
- command.position = E_TEP_SELECTION;
- } else {
- command.action = E_TEP_DELETE;
- command.position = E_TEP_FORWARD_CHARACTER;
- }
- break;
- case GDK_Tab:
- /* Don't insert literally */
- command.action = E_TEP_NOP;
- command.position = E_TEP_SELECTION;
- break;
- case GDK_Return:
- if (key.state & GDK_CONTROL_MASK) {
- command.action = E_TEP_ACTIVATE;
- command.position = E_TEP_SELECTION;
- } else {
- command.action = E_TEP_INSERT;
- command.position = E_TEP_SELECTION;
- command.value = 1;
- command.string = "\n";
- }
- break;
- case GDK_Escape:
- /* Don't insert literally */
- command.action = E_TEP_NOP;
- command.position = E_TEP_SELECTION;
- break;
-
- default:
- if (key.state & GDK_CONTROL_MASK) {
- if ((key.keyval >= 'A') && (key.keyval <= 'Z'))
- key.keyval -= 'A' - 'a';
-
- if ((key.keyval >= 'a') && (key.keyval <= 'z')) {
- command.position = control_keys[(int) (key.keyval - 'a')].position;
- if (control_keys[(int) (key.keyval - 'a')].action != E_TEP_MOVE)
- command.action = control_keys[(int) (key.keyval - 'a')].action;
- command.value = control_keys[(int) (key.keyval - 'a')].value;
- command.string = control_keys[(int) (key.keyval - 'a')].string;
- }
-
- if (key.keyval == 'x' || key.keyval == 'w') {
- command.action = E_TEP_COPY;
- command.position = E_TEP_SELECTION;
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
-
- command.action = E_TEP_DELETE;
- command.position = E_TEP_SELECTION;
- }
-
- break;
- } else if (key.state & GDK_MOD1_MASK) {
- if ((key.keyval >= 'A') && (key.keyval <= 'Z'))
- key.keyval -= 'A' - 'a';
-
- if ((key.keyval >= 'a') && (key.keyval <= 'z')) {
- command.position = alt_keys[(int) (key.keyval - 'a')].position;
- if (alt_keys[(int) (key.keyval - 'a')].action != E_TEP_MOVE)
- command.action = alt_keys[(int) (key.keyval - 'a')].action;
- command.value = alt_keys[(int) (key.keyval - 'a')].value;
- command.string = alt_keys[(int) (key.keyval - 'a')].string;
- }
- } else if (key.length > 0) {
- command.action = E_TEP_INSERT;
- command.position = E_TEP_SELECTION;
- command.value = strlen(key.string);
- command.string = key.string;
-
- } else {
- command.action = E_TEP_NOP;
- }
- }
- break;
- case GDK_KEY_RELEASE:
- command.time = event->key.time;
- command.action = E_TEP_NOP;
- break;
- default:
- command.action = E_TEP_NOP;
- break;
- }
- }
- if (command.action != E_TEP_NOP) {
- gtk_signal_emit_by_name (GTK_OBJECT (tep), "command", &command);
- return 1;
- }
- else
- return 0;
-}
-
-ETextEventProcessor *
-e_text_event_processor_emacs_like_new (void)
-{
- ETextEventProcessorEmacsLike *retval = gtk_type_new (e_text_event_processor_emacs_like_get_type ());
- return E_TEXT_EVENT_PROCESSOR (retval);
-}
-
diff --git a/widgets/text/e-text-event-processor-emacs-like.h b/widgets/text/e-text-event-processor-emacs-like.h
deleted file mode 100644
index 651bb552b3..0000000000
--- a/widgets/text/e-text-event-processor-emacs-like.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor-emacs-like.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_TEXT_EVENT_PROCESSOR_EMACS_LIKE_H__
-#define __E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_H__
-
-#include <gnome.h>
-#include "e-text-event-processor.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETextEventProcessorEmacsLike - Turns events on a text widget into commands. Uses an emacs-ish interface.
- *
- */
-
-#define E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE (e_text_event_processor_emacs_like_get_type ())
-#define E_TEXT_EVENT_PROCESSOR_EMACS_LIKE(obj) (GTK_CHECK_CAST ((obj), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE, ETextEventProcessorEmacsLike))
-#define E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE, ETextEventProcessorEmacsLikeClass))
-#define E_IS_TEXT_EVENT_PROCESSOR_EMACS_LIKE(obj) (GTK_CHECK_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE))
-#define E_IS_TEXT_EVENT_PROCESSOR_EMACS_LIKE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_TYPE))
-
-
-typedef struct _ETextEventProcessorEmacsLike ETextEventProcessorEmacsLike;
-typedef struct _ETextEventProcessorEmacsLikeClass ETextEventProcessorEmacsLikeClass;
-
-struct _ETextEventProcessorEmacsLike
-{
- ETextEventProcessor parent;
-
- /* object specific fields */
- gboolean mouse_down;
-};
-
-struct _ETextEventProcessorEmacsLikeClass
-{
- ETextEventProcessorClass parent_class;
-};
-
-
-GtkType e_text_event_processor_emacs_like_get_type (void);
-ETextEventProcessor *e_text_event_processor_emacs_like_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TEXT_EVENT_PROCESSOR_EMACS_LIKE_H__ */
diff --git a/widgets/text/e-text-event-processor-types.h b/widgets/text/e-text-event-processor-types.h
deleted file mode 100644
index 8f2ffbaf39..0000000000
--- a/widgets/text/e-text-event-processor-types.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#ifndef __E_TEXT_EVENT_PROCESSOR_TYPES_H__
-#define __E_TEXT_EVENT_PROCESSOR_TYPES_H__
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#include <gdk/gdktypes.h>
-
-typedef enum _ETextEventProcessorCommandPosition ETextEventProcessorCommandPosition;
-typedef enum _ETextEventProcessorCommandAction ETextEventProcessorCommandAction;
-typedef struct _ETextEventProcessorCommand ETextEventProcessorCommand;
-
-typedef union _ETextEventProcessorEvent ETextEventProcessorEvent;
-typedef struct _ETextEventProcessorEventButton ETextEventProcessorEventButton;
-typedef struct _ETextEventProcessorEventKey ETextEventProcessorEventKey;
-typedef struct _ETextEventProcessorEventMotion ETextEventProcessorEventMotion;
-
-enum _ETextEventProcessorCommandPosition {
- E_TEP_VALUE,
- E_TEP_SELECTION,
-
- E_TEP_START_OF_BUFFER,
- E_TEP_END_OF_BUFFER,
-
- E_TEP_START_OF_LINE,
- E_TEP_END_OF_LINE,
-
- E_TEP_FORWARD_CHARACTER,
- E_TEP_BACKWARD_CHARACTER,
-
- E_TEP_FORWARD_WORD,
- E_TEP_BACKWARD_WORD,
-
- E_TEP_FORWARD_LINE,
- E_TEP_BACKWARD_LINE,
-
- E_TEP_FORWARD_PARAGRAPH,
- E_TEP_BACKWARD_PARAGRAPH,
-
- E_TEP_FORWARD_PAGE,
- E_TEP_BACKWARD_PAGE,
-
- E_TEP_SELECT_WORD,
- E_TEP_SELECT_ALL
-
-};
-
-enum _ETextEventProcessorCommandAction {
- E_TEP_MOVE,
- E_TEP_SELECT,
- E_TEP_DELETE,
- E_TEP_INSERT,
-
- E_TEP_COPY,
- E_TEP_PASTE,
- E_TEP_GET_SELECTION,
- E_TEP_SET_SELECT_BY_WORD,
- E_TEP_ACTIVATE,
-
- E_TEP_GRAB,
- E_TEP_UNGRAB,
-
- E_TEP_NOP
-};
-
-struct _ETextEventProcessorCommand {
- ETextEventProcessorCommandPosition position;
- ETextEventProcessorCommandAction action;
- int value;
- char *string;
- guint32 time;
-};
-
-struct _ETextEventProcessorEventButton {
- GdkEventType type;
- guint32 time;
- guint state;
- guint button;
- gint position;
-};
-
-struct _ETextEventProcessorEventKey {
- GdkEventType type;
- guint32 time;
- guint state;
- guint keyval;
- gint length;
- gchar *string;
-};
-
-struct _ETextEventProcessorEventMotion {
- GdkEventType type;
- guint32 time;
- guint state;
- gint position;
-};
-
-union _ETextEventProcessorEvent {
- GdkEventType type;
- ETextEventProcessorEventButton button;
- ETextEventProcessorEventKey key;
- ETextEventProcessorEventMotion motion;
-};
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TEXT_EVENT_PROCESSOR_TYPES_H__ */
diff --git a/widgets/text/e-text-event-processor.c b/widgets/text/e-text-event-processor.c
deleted file mode 100644
index 47f028ca62..0000000000
--- a/widgets/text/e-text-event-processor.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.c
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 <gnome.h>
-#include "e-text-event-processor.h"
-static void e_text_event_processor_init (ETextEventProcessor *card);
-static void e_text_event_processor_class_init (ETextEventProcessorClass *klass);
-
-static GtkObjectClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- ARG_0
-};
-
-enum {
- E_TEP_EVENT,
- E_TEP_LAST_SIGNAL
-};
-
-static guint e_tep_signals[E_TEP_LAST_SIGNAL] = { 0 };
-
-GtkType
-e_text_event_processor_get_type (void)
-{
- static GtkType text_event_processor_type = 0;
-
- if (!text_event_processor_type)
- {
- static const GtkTypeInfo text_event_processor_info =
- {
- "ETextEventProcessor",
- sizeof (ETextEventProcessor),
- sizeof (ETextEventProcessorClass),
- (GtkClassInitFunc) e_text_event_processor_class_init,
- (GtkObjectInitFunc) e_text_event_processor_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- text_event_processor_type = gtk_type_unique (gtk_object_get_type (), &text_event_processor_info);
- }
-
- return text_event_processor_type;
-}
-
-static void
-e_text_event_processor_class_init (ETextEventProcessorClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass*) klass;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-
- e_tep_signals[E_TEP_EVENT] =
- gtk_signal_new ("command",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETextEventProcessorClass, command),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
-
- gtk_object_class_add_signals (object_class, e_tep_signals, E_TEP_LAST_SIGNAL);
-
- klass->event = NULL;
- klass->command = NULL;
-}
-
-static void
-e_text_event_processor_init (ETextEventProcessor *tep)
-{
-}
-
-gint
-e_text_event_processor_handle_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event)
-{
- if (E_TEXT_EVENT_PROCESSOR_CLASS(GTK_OBJECT(tep)->klass)->event) {
- return E_TEXT_EVENT_PROCESSOR_CLASS(GTK_OBJECT(tep)->klass)->event(tep, event);
- } else {
- return 0;
- }
-}
diff --git a/widgets/text/e-text-event-processor.h b/widgets/text/e-text-event-processor.h
deleted file mode 100644
index 1fc79f3f70..0000000000
--- a/widgets/text/e-text-event-processor.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-text-event-processor.h
- * Copyright (C) 2000 Helix Code, Inc.
- * Author: Chris Lahey <clahey@helixcode.com>
- *
- * 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 program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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_TEXT_EVENT_PROCESSOR_H__
-#define __E_TEXT_EVENT_PROCESSOR_H__
-
-#include <gnome.h>
-#include "e-text-event-processor-types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETextEventProcessor - Turns events on a text widget into commands.
- *
- */
-
-#define E_TEXT_EVENT_PROCESSOR_TYPE (e_text_event_processor_get_type ())
-#define E_TEXT_EVENT_PROCESSOR(obj) (GTK_CHECK_CAST ((obj), E_TEXT_EVENT_PROCESSOR_TYPE, ETextEventProcessor))
-#define E_TEXT_EVENT_PROCESSOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TEXT_EVENT_PROCESSOR_TYPE, ETextEventProcessorClass))
-#define E_IS_TEXT_EVENT_PROCESSOR(obj) (GTK_CHECK_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_TYPE))
-#define E_IS_TEXT_EVENT_PROCESSOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TEXT_EVENT_PROCESSOR_TYPE))
-
-
-typedef struct _ETextEventProcessor ETextEventProcessor;
-typedef struct _ETextEventProcessorClass ETextEventProcessorClass;
-
-struct _ETextEventProcessor
-{
- GtkObject parent;
-
- /* object specific fields */
-
-};
-
-struct _ETextEventProcessorClass
-{
- GtkObjectClass parent_class;
-
- /* signals */
- void (* command) (ETextEventProcessor *tep, ETextEventProcessorCommand *command);
-
- /* virtual functions */
- gint (* event) (ETextEventProcessor *tep, ETextEventProcessorEvent *event);
-};
-
-
-GtkType e_text_event_processor_get_type (void);
-gint e_text_event_processor_handle_event (ETextEventProcessor *tep, ETextEventProcessorEvent *event);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TEXT_EVENT_PROCESSOR_H__ */
diff --git a/widgets/text/e-text-model.c b/widgets/text/e-text-model.c
deleted file mode 100644
index 6ca650867c..0000000000
--- a/widgets/text/e-text-model.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ETextModel - Text item model for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#include <config.h>
-#include <ctype.h>
-#include "e-text-model.h"
-
-enum {
- E_TEXT_MODEL_CHANGED,
- E_TEXT_MODEL_LAST_SIGNAL
-};
-
-static guint e_text_model_signals[E_TEXT_MODEL_LAST_SIGNAL] = { 0 };
-
-static void e_text_model_class_init (ETextModelClass *class);
-static void e_text_model_init (ETextModel *model);
-static void e_text_model_destroy (GtkObject *object);
-
-static gchar *e_text_model_real_get_text(ETextModel *model);
-static void e_text_model_real_set_text(ETextModel *model, gchar *text);
-static void e_text_model_real_insert(ETextModel *model, gint postion, gchar *text);
-static void e_text_model_real_insert_length(ETextModel *model, gint postion, gchar *text, gint length);
-static void e_text_model_real_delete(ETextModel *model, gint postion, gint length);
-
-static GtkObject *parent_class;
-
-
-
-/**
- * e_text_model_get_type:
- * @void:
- *
- * Registers the &ETextModel class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &ETextModel class.
- **/
-GtkType
-e_text_model_get_type (void)
-{
- static GtkType model_type = 0;
-
- if (!model_type) {
- GtkTypeInfo model_info = {
- "ETextModel",
- sizeof (ETextModel),
- sizeof (ETextModelClass),
- (GtkClassInitFunc) e_text_model_class_init,
- (GtkObjectInitFunc) e_text_model_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- model_type = gtk_type_unique (gtk_object_get_type (), &model_info);
- }
-
- return model_type;
-}
-
-/* Class initialization function for the text item */
-static void
-e_text_model_class_init (ETextModelClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) klass;
-
- parent_class = gtk_type_class (gtk_object_get_type ());
-
- e_text_model_signals[E_TEXT_MODEL_CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETextModelClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_text_model_signals, E_TEXT_MODEL_LAST_SIGNAL);
-
- klass->changed = NULL;
- klass->get_text = e_text_model_real_get_text;
- klass->set_text = e_text_model_real_set_text;
- klass->insert = e_text_model_real_insert;
- klass->insert_length = e_text_model_real_insert_length;
- klass->delete = e_text_model_real_delete;
-
- object_class->destroy = e_text_model_destroy;
-}
-
-/* Object initialization function for the text item */
-static void
-e_text_model_init (ETextModel *model)
-{
- model->text = NULL;
-}
-
-/* Destroy handler for the text item */
-static void
-e_text_model_destroy (GtkObject *object)
-{
- ETextModel *model;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (object));
-
- model = E_TEXT_MODEL (object);
-
- if (model->text)
- g_free (model->text);
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-static gchar *
-e_text_model_real_get_text(ETextModel *model)
-{
- if (model->text)
- return model->text;
- else
- return "";
-}
-
-static void
-e_text_model_real_set_text(ETextModel *model, gchar *text)
-{
- if (model->text)
- g_free(model->text);
- model->text = g_strdup(text);
- e_text_model_changed(model);
-}
-
-static void
-e_text_model_real_insert(ETextModel *model, gint position, gchar *text)
-{
- gchar *temp = g_strdup_printf("%.*s%s%s", position, model->text, text, model->text + position);
- if (model->text)
- g_free(model->text);
- model->text = temp;
- e_text_model_changed(model);
-}
-
-static void
-e_text_model_real_insert_length(ETextModel *model, gint position, gchar *text, gint length)
-{
- gchar *temp = g_strdup_printf("%.*s%.*s%s", position, model->text, length, text, model->text + position);
- if (model->text)
- g_free(model->text);
- model->text = temp;
- e_text_model_changed(model);
-}
-
-static void
-e_text_model_real_delete(ETextModel *model, gint position, gint length)
-{
- memmove(model->text + position, model->text + position + length, strlen(model->text + position + length) + 1);
- e_text_model_changed(model);
-}
-
-void
-e_text_model_changed(ETextModel *model)
-{
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (model));
-
- gtk_signal_emit (GTK_OBJECT (model),
- e_text_model_signals [E_TEXT_MODEL_CHANGED]);
-}
-
-gchar *
-e_text_model_get_text(ETextModel *model)
-{
- g_return_val_if_fail (model != NULL, NULL);
- g_return_val_if_fail (E_IS_TEXT_MODEL (model), NULL);
-
- if ( E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->get_text )
- return E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->get_text(model);
- else
- return "";
-}
-
-void
-e_text_model_set_text(ETextModel *model, gchar *text)
-{
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (model));
-
- if ( E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->set_text )
- E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->set_text(model, text);
-}
-
-void
-e_text_model_insert(ETextModel *model, gint position, gchar *text)
-{
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (model));
-
- if ( E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->insert )
- E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->insert(model, position, text);
-}
-
-void
-e_text_model_insert_length(ETextModel *model, gint position, gchar *text, gint length)
-{
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (model));
-
- if ( E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->insert_length )
- E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->insert_length(model, position, text, length);
-}
-
-void
-e_text_model_delete(ETextModel *model, gint position, gint length)
-{
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_TEXT_MODEL (model));
-
- if ( E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->delete )
- E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->delete(model, position, length);
-}
-
-ETextModel *
-e_text_model_new(void)
-{
- ETextModel *model = gtk_type_new (e_text_model_get_type ());
- model->text = g_strdup("");
- return model;
-}
diff --git a/widgets/text/e-text-model.h b/widgets/text/e-text-model.h
deleted file mode 100644
index 5b15ccb117..0000000000
--- a/widgets/text/e-text-model.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* ETextModel - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#ifndef E_TEXT_MODEL_H
-#define E_TEXT_MODEL_H
-
-#include <gnome.h>
-
-
-BEGIN_GNOME_DECLS
-
-#define E_TYPE_TEXT_MODEL (e_text_model_get_type ())
-#define E_TEXT_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TEXT_MODEL, ETextModel))
-#define E_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TEXT_MODEL, ETextModelClass))
-#define E_IS_TEXT_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TEXT_MODEL))
-#define E_IS_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_TEXT_MODEL))
-
-typedef struct _ETextModel ETextModel;
-typedef struct _ETextModelClass ETextModelClass;
-
-struct _ETextModel {
- GtkObject item;
-
- char *text; /* Text to display */
- int length;
-};
-
-struct _ETextModelClass {
- GtkObjectClass parent_class;
-
- /* Signal */
- void (* changed) (ETextModel *model);
-
- /* Virtual methods */
- char *(* get_text) (ETextModel *model);
- void (* set_text) (ETextModel *model, gchar *text);
- void (* insert) (ETextModel *model, gint position, gchar *text);
- void (* insert_length) (ETextModel *model, gint position, gchar *text, gint length);
- void (* delete) (ETextModel *model, gint position, gint length);
-};
-
-
-/* Standard Gtk function */
-GtkType e_text_model_get_type (void);
-ETextModel *e_text_model_new(void);
-
-void e_text_model_changed(ETextModel *model);
-gchar *e_text_model_get_text(ETextModel *model);
-void e_text_model_set_text(ETextModel *model, gchar *text);
-void e_text_model_insert(ETextModel *model, gint position, gchar *text);
-void e_text_model_insert_length(ETextModel *model, gint position, gchar *text, gint length);
-void e_text_model_delete(ETextModel *model, gint position, gint length);
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/widgets/text/e-text-test.c b/widgets/text/e-text-test.c
deleted file mode 100644
index 12a31cce7e..0000000000
--- a/widgets/text/e-text-test.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- ETextTest: E-Text item test program
- Copyright (C)2000: Iain Holmes <ih@csd.abdn.ac.uk>
-
- This code is licensed under the GPL
-*/
-
-#include "e-text.h"
-#include <gnome.h>
-#include "e-util/e-canvas.h"
-GnomeCanvasItem *rect;
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, GnomeCanvasItem *item)
-{
- double height;
- gnome_canvas_item_set( item,
- "width", (double) allocation->width,
- NULL );
- gtk_object_get(GTK_OBJECT(item),
- "height", &height,
- NULL);
- height = MAX(height, allocation->height);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, allocation->width, height );
- gnome_canvas_item_set( rect,
- "x2", (double) allocation->width,
- "y2", (double) height,
- NULL );
-}
-
-static void
-reflow (GtkWidget *canvas, GnomeCanvasItem *item)
-{
- double height;
- gtk_object_get(GTK_OBJECT(item),
- "height", &height,
- NULL);
- height = MAX(height, canvas->allocation.height);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, canvas->allocation.width, height );
- gnome_canvas_item_set( rect,
- "x2", (double) canvas->allocation.width,
- "y2", (double) height,
- NULL );
-}
-
-static void
-quit_cb (GtkWidget *widget,
- gpointer data)
-{
- gtk_main_quit ();
-}
-
-static void
-change_text_cb (GtkEntry *entry,
- EText *text)
-{
- gchar *str;
-
- str = gtk_entry_get_text (entry);
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (text),
- "text", str,
- NULL);
-}
-
-static void
-change_font_cb (GtkEntry *entry,
- EText *text)
-{
- gchar *font;
-
- font = gtk_entry_get_text (entry);
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (text),
- "font", font,
- NULL);
-}
-
-int
-main (int argc,
- char **argv)
-{
- GtkWidget *window, *canvas, *scroller, *vbox, *text, *font;
- GtkWidget *frame;
- GnomeCanvasItem *item;
-
- gnome_init ("ETextTest", "0.0.1", argc, argv);
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title (GTK_WINDOW (window), "EText Test");
- gtk_signal_connect (GTK_OBJECT (window), "destroy",
- GTK_SIGNAL_FUNC (quit_cb), NULL);
-
- gtk_widget_push_visual (gdk_rgb_get_visual ());
- gtk_widget_push_colormap (gdk_rgb_get_cmap ());
- canvas = e_canvas_new ();
- gtk_widget_pop_visual ();
- gtk_widget_pop_colormap ();
- scroller = gtk_scrolled_window_new (NULL, NULL);
- vbox = gtk_vbox_new (FALSE, 2);
-
- gtk_container_add (GTK_CONTAINER (window), vbox);
- gtk_box_pack_start (GTK_BOX (vbox), scroller, TRUE, TRUE, 2);
- gtk_container_add (GTK_CONTAINER (scroller), canvas);
-
- frame = gtk_frame_new ("Text");
- text = gtk_entry_new ();
- gtk_entry_set_text(GTK_ENTRY(text), "Hello World! This is a really long string to test out the ellipsis stuff.");
- gtk_container_add (GTK_CONTAINER (frame), text);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
-
- frame = gtk_frame_new ("Font");
- font = gtk_entry_new ();
- gtk_entry_set_text(GTK_ENTRY(font), "fixed");
- gtk_container_add (GTK_CONTAINER (frame), font);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
-
- 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 );
-
- item = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_text_get_type (),
- "text", "Hello World! This is a really long string to test out the ellipsis stuff.",
- "font", "fixed",
- "fill_color", "black",
- "anchor", GTK_ANCHOR_NW,
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "editable", TRUE,
- "line_wrap", TRUE,
- "max_lines", 2,
- "width", 150.0,
- NULL);
-
- gtk_signal_connect (GTK_OBJECT (text), "activate",
- GTK_SIGNAL_FUNC (change_text_cb), item);
- gtk_signal_connect (GTK_OBJECT (font), "activate",
- GTK_SIGNAL_FUNC (change_font_cb), item);
-
- gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate",
- GTK_SIGNAL_FUNC( allocate_callback ),
- item );
- gtk_signal_connect( GTK_OBJECT( canvas ), "reflow",
- GTK_SIGNAL_FUNC( reflow ),
- item );
- gnome_canvas_set_scroll_region (GNOME_CANVAS (canvas), 0.0, 0.0, 400.0, 400.0);
- gtk_widget_show_all (window);
- gtk_main ();
-
- return 0;
-}
diff --git a/widgets/text/e-text.c b/widgets/text/e-text.c
deleted file mode 100644
index 30e6452ed0..0000000000
--- a/widgets/text/e-text.c
+++ /dev/null
@@ -1,3365 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* EText - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#include <config.h>
-#include <math.h>
-#include <ctype.h>
-#include "e-text.h"
-#include <gdk/gdkx.h> /* for BlackPixel */
-#include <libart_lgpl/art_affine.h>
-#include <libart_lgpl/art_rgb.h>
-#include <libart_lgpl/art_rgb_bitmap_affine.h>
-#include <unicode.h>
-#include <gtk/gtkinvisible.h>
-#include "e-util/e-canvas.h"
-#include "e-util/e-canvas-utils.h"
-
-#include "e-text-event-processor-emacs-like.h"
-
-#define BORDER_INDENT 4
-
-enum {
- E_TEXT_CHANGED,
- E_TEXT_ACTIVATE,
- E_TEXT_LAST_SIGNAL
-};
-
-static guint e_text_signals[E_TEXT_LAST_SIGNAL] = { 0 };
-
-
-
-/* This defines a line of text */
-struct line {
- char *text; /* Line's text, it is a pointer into the text->text string */
- int length; /* Line's length in characters */
- int width; /* Line's width in pixels */
- int ellipsis_length; /* Length before adding ellipsis */
-};
-
-
-
-/* Object argument IDs */
-enum {
- ARG_0,
- ARG_MODEL,
- ARG_EVENT_PROCESSOR,
- ARG_TEXT,
- ARG_FONT,
- ARG_FONTSET,
- ARG_FONT_GDK,
- ARG_ANCHOR,
- ARG_JUSTIFICATION,
- ARG_CLIP_WIDTH,
- ARG_CLIP_HEIGHT,
- ARG_CLIP,
- ARG_FILL_CLIP_RECTANGLE,
- ARG_X_OFFSET,
- ARG_Y_OFFSET,
- ARG_FILL_COLOR,
- ARG_FILL_COLOR_GDK,
- ARG_FILL_COLOR_RGBA,
- ARG_FILL_STIPPLE,
- ARG_TEXT_WIDTH,
- ARG_TEXT_HEIGHT,
- ARG_EDITABLE,
- ARG_USE_ELLIPSIS,
- ARG_ELLIPSIS,
- ARG_LINE_WRAP,
- ARG_BREAK_CHARACTERS,
- ARG_MAX_LINES,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_DRAW_BORDERS,
-};
-
-
-enum {
- E_SELECTION_PRIMARY,
- E_SELECTION_CLIPBOARD
-};
-enum {
- TARGET_STRING,
- TARGET_TEXT,
- TARGET_COMPOUND_TEXT
-};
-
-static void e_text_class_init (ETextClass *class);
-static void e_text_init (EText *text);
-static void e_text_destroy (GtkObject *object);
-static void e_text_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_text_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
-static void e_text_reflow (GnomeCanvasItem *item, int flags);
-static void e_text_update (GnomeCanvasItem *item, double *affine,
- ArtSVP *clip_path, int flags);
-static void e_text_realize (GnomeCanvasItem *item);
-static void e_text_unrealize (GnomeCanvasItem *item);
-static void e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-static double e_text_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item);
-static void e_text_bounds (GnomeCanvasItem *item,
- double *x1, double *y1, double *x2, double *y2);
-static void e_text_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
-static gint e_text_event (GnomeCanvasItem *item, GdkEvent *event);
-
-static void e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gpointer data);
-
-static void e_text_get_selection(EText *text, GdkAtom selection, guint32 time);
-static void e_text_supply_selection (EText *text, guint time, GdkAtom selection, guchar *data, gint length);
-
-static void e_text_text_model_changed(ETextModel *model, EText *text);
-
-static void _get_tep(EText *text);
-
-static GtkWidget *e_text_get_invisible(EText *text);
-static void _selection_clear_event (GtkInvisible *invisible,
- GdkEventSelection *event,
- EText *text);
-static void _selection_get (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint info,
- guint time_stamp,
- EText *text);
-static void _selection_received (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint time,
- EText *text);
-
-#if 0
-static ETextSuckFont *e_suck_font (GdkFont *font);
-static void e_suck_font_free (ETextSuckFont *suckfont);
-#endif
-
-static void e_text_free_lines(EText *text);
-
-static void calc_height (EText *text);
-static void calc_line_widths (EText *text);
-static void split_into_lines (EText *text);
-
-static GnomeCanvasItemClass *parent_class;
-static GdkAtom clipboard_atom = GDK_NONE;
-
-
-
-/**
- * e_text_get_type:
- * @void:
- *
- * Registers the &EText class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &EText class.
- **/
-GtkType
-e_text_get_type (void)
-{
- static GtkType text_type = 0;
-
- if (!text_type) {
- GtkTypeInfo text_info = {
- "EText",
- sizeof (EText),
- sizeof (ETextClass),
- (GtkClassInitFunc) e_text_class_init,
- (GtkObjectInitFunc) e_text_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- text_type = gtk_type_unique (gnome_canvas_item_get_type (), &text_info);
- }
-
- return text_type;
-}
-
-/* Class initialization function for the text item */
-static void
-e_text_class_init (ETextClass *klass)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) klass;
- item_class = (GnomeCanvasItemClass *) klass;
-
- parent_class = gtk_type_class (gnome_canvas_item_get_type ());
-
- e_text_signals[E_TEXT_CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETextClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- e_text_signals[E_TEXT_ACTIVATE] =
- gtk_signal_new ("activate",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (ETextClass, activate),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, e_text_signals, E_TEXT_LAST_SIGNAL);
-
-
- gtk_object_add_arg_type ("EText::model",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_MODEL);
- gtk_object_add_arg_type ("EText::event_processor",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_EVENT_PROCESSOR);
- gtk_object_add_arg_type ("EText::text",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_TEXT);
- gtk_object_add_arg_type ("EText::font",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FONT);
- gtk_object_add_arg_type ("EText::fontset",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FONTSET);
- gtk_object_add_arg_type ("EText::font_gdk",
- GTK_TYPE_GDK_FONT, GTK_ARG_READWRITE, ARG_FONT_GDK);
- gtk_object_add_arg_type ("EText::anchor",
- GTK_TYPE_ANCHOR_TYPE, GTK_ARG_READWRITE, ARG_ANCHOR);
- gtk_object_add_arg_type ("EText::justification",
- GTK_TYPE_JUSTIFICATION, GTK_ARG_READWRITE, ARG_JUSTIFICATION);
- gtk_object_add_arg_type ("EText::clip_width",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_CLIP_WIDTH);
- gtk_object_add_arg_type ("EText::clip_height",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_CLIP_HEIGHT);
- gtk_object_add_arg_type ("EText::clip",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CLIP);
- gtk_object_add_arg_type ("EText::fill_clip_rectangle",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_FILL_CLIP_RECTANGLE);
- gtk_object_add_arg_type ("EText::x_offset",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_X_OFFSET);
- gtk_object_add_arg_type ("EText::y_offset",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_Y_OFFSET);
- gtk_object_add_arg_type ("EText::fill_color",
- GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_FILL_COLOR);
- gtk_object_add_arg_type ("EText::fill_color_gdk",
- GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_FILL_COLOR_GDK);
- gtk_object_add_arg_type ("EText::fill_color_rgba",
- GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_FILL_COLOR_RGBA);
- gtk_object_add_arg_type ("EText::fill_stipple",
- GTK_TYPE_GDK_WINDOW, GTK_ARG_READWRITE, ARG_FILL_STIPPLE);
- gtk_object_add_arg_type ("EText::text_width",
- GTK_TYPE_DOUBLE, GTK_ARG_READABLE, ARG_TEXT_WIDTH);
- gtk_object_add_arg_type ("EText::text_height",
- GTK_TYPE_DOUBLE, GTK_ARG_READABLE, ARG_TEXT_HEIGHT);
- gtk_object_add_arg_type ("EText::editable",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_EDITABLE);
- gtk_object_add_arg_type ("EText::use_ellipsis",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_USE_ELLIPSIS);
- gtk_object_add_arg_type ("EText::ellipsis",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ELLIPSIS);
- gtk_object_add_arg_type ("EText::line_wrap",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_LINE_WRAP);
- gtk_object_add_arg_type ("EText::break_characters",
- GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_BREAK_CHARACTERS);
- gtk_object_add_arg_type ("EText::max_lines",
- GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_MAX_LINES);
- gtk_object_add_arg_type ("EText::width",
- GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_WIDTH);
- gtk_object_add_arg_type ("EText::height",
- GTK_TYPE_DOUBLE, GTK_ARG_READABLE, ARG_HEIGHT);
- gtk_object_add_arg_type ("EText::draw_borders",
- GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_DRAW_BORDERS);
-
- if (!clipboard_atom)
- clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
-
-
-
- klass->changed = NULL;
- klass->activate = NULL;
-
- object_class->destroy = e_text_destroy;
- object_class->set_arg = e_text_set_arg;
- object_class->get_arg = e_text_get_arg;
-
- item_class->update = e_text_update;
- item_class->realize = e_text_realize;
- item_class->unrealize = e_text_unrealize;
- item_class->draw = e_text_draw;
- item_class->point = e_text_point;
- item_class->bounds = e_text_bounds;
- item_class->render = e_text_render;
- item_class->event = e_text_event;
-}
-
-/* Object initialization function for the text item */
-static void
-e_text_init (EText *text)
-{
- text->text = NULL;
- text->model = e_text_model_new();
- gtk_object_ref(GTK_OBJECT(text->model));
- gtk_object_sink(GTK_OBJECT(text->model));
- text->model_changed_signal_id =
- gtk_signal_connect(GTK_OBJECT(text->model),
- "changed",
- GTK_SIGNAL_FUNC(e_text_text_model_changed),
- text);
-
- text->anchor = GTK_ANCHOR_CENTER;
- text->justification = GTK_JUSTIFY_LEFT;
- text->clip_width = -1.0;
- text->clip_height = -1.0;
- text->xofs = 0.0;
- text->yofs = 0.0;
-
- text->ellipsis = NULL;
- text->use_ellipsis = FALSE;
- text->ellipsis_width = 0;
-
- text->editable = FALSE;
- text->editing = FALSE;
- text->xofs_edit = 0;
- text->yofs_edit = 0;
-
- text->selection_start = 0;
- text->selection_end = 0;
- text->select_by_word = FALSE;
-
- text->timeout_id = 0;
- text->timer = NULL;
-
- text->lastx = 0;
- text->lasty = 0;
- text->last_state = 0;
-
- text->scroll_start = 0;
- text->show_cursor = TRUE;
- text->button_down = FALSE;
-
- text->tep = NULL;
- text->tep_command_id = 0;
-
- text->has_selection = FALSE;
-
- text->invisible = NULL;
- text->primary_selection = NULL;
- text->primary_length = 0;
- text->clipboard_selection = NULL;
- text->clipboard_length = 0;
-
- text->pointer_in = FALSE;
- text->default_cursor_shown = TRUE;
-
- text->line_wrap = FALSE;
- text->break_characters = NULL;
- text->max_lines = -1;
-
- text->tooltip_timeout = 0;
- text->tooltip_count = 0;
-
- text->dbl_timeout = 0;
- text->tpl_timeout = 0;
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(text), e_text_reflow);
-}
-
-/* Destroy handler for the text item */
-static void
-e_text_destroy (GtkObject *object)
-{
- EText *text;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_TEXT (object));
-
- text = E_TEXT (object);
-
- if (text->model_changed_signal_id)
- gtk_signal_disconnect(GTK_OBJECT(text->model),
- text->model_changed_signal_id);
-
- if (text->model)
- gtk_object_unref(GTK_OBJECT(text->model));
-
- if (text->tep_command_id)
- gtk_signal_disconnect(GTK_OBJECT(text->tep),
- text->tep_command_id);
-
- if (text->tep)
- gtk_object_unref (GTK_OBJECT(text->tep));
-
- if (text->invisible)
- gtk_object_unref (GTK_OBJECT(text->invisible));
-
- if (text->lines)
- g_free (text->lines);
-
- if (text->font)
- e_font_unref (text->font);
-
-#if 0
- if (text->suckfont)
- e_suck_font_free (text->suckfont);
-#endif
-
- if (text->stipple)
- gdk_bitmap_unref (text->stipple);
-
- if (text->timeout_id) {
- g_source_remove(text->timeout_id);
- text->timeout_id = 0;
- }
-
- if (text->timer) {
- g_timer_stop(text->timer);
- g_timer_destroy(text->timer);
- text->timer = NULL;
- }
-
- if ( text->tooltip_timeout ) {
- gtk_timeout_remove (text->tooltip_timeout);
- text->tooltip_timeout = 0;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-static void
-e_text_text_model_changed (ETextModel *model, EText *text)
-{
- text->text = e_text_model_get_text(model);
- e_text_free_lines(text);
- gtk_signal_emit (GTK_OBJECT (text), e_text_signals[E_TEXT_CHANGED]);
- text->needs_split_into_lines = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM(text));
-}
-
-static void
-get_bounds_item_relative (EText *text, double *px1, double *py1, double *px2, double *py2)
-{
- GnomeCanvasItem *item;
- double x, y;
- double clip_x, clip_y;
- int old_height;
-
- item = GNOME_CANVAS_ITEM (text);
-
- x = 0;
- y = 0;
-
- clip_x = x;
- clip_y = y;
-
- /* Calculate text dimensions */
-
- old_height = text->height;
-
- if (text->text && text->font)
- text->height = (e_font_ascent (text->font) + e_font_descent (text->font)) * text->num_lines;
- else
- text->height = 0;
-
- if (old_height != text->height)
- e_canvas_item_request_parent_reflow(item);
-
- /* Anchor text */
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- x -= text->max_width / 2;
- if ( text->clip_width >= 0)
- clip_x -= text->clip_width / 2;
- else
- clip_x -= text->width / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- x -= text->max_width;
- if (text->clip_width >= 0)
- clip_x -= text->clip_width;
- else
- clip_x -= text->width;
- break;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- y -= text->height / 2;
- if ( text->clip_height >= 0 )
- clip_y -= text->clip_height / 2;
- else
- clip_y -= text->height / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- y -= text->height;
- if ( text->clip_height >= 0 )
- clip_y -= text->clip_height;
- else
- clip_y -= text->height;
- break;
- }
-
- /* Bounds */
-
- if (text->clip) {
- /* maybe do bbox intersection here? */
- *px1 = clip_x;
- *py1 = clip_y;
- if (text->clip_width >= 0)
- *px2 = clip_x + text->clip_width;
- else
- *px2 = clip_x + text->width;
-
- if ( text->clip_height >= 0 )
- *py2 = clip_y + text->clip_height;
- else
- *py2 = clip_y + text->height;
- } else {
- *px1 = x;
- *py1 = y;
- *px2 = x + text->max_width;
- *py2 = y + text->height;
- }
-}
-
-static void
-get_bounds (EText *text, double *px1, double *py1, double *px2, double *py2)
-{
- GnomeCanvasItem *item;
- double wx, wy, clip_width;
-
- item = GNOME_CANVAS_ITEM (text);
-
- /* Get canvas pixel coordinates for text position */
-
- wx = 0;
- wy = 0;
- gnome_canvas_item_i2w (item, &wx, &wy);
- gnome_canvas_w2c (item->canvas, wx + text->xofs, wy + text->yofs, &text->cx, &text->cy);
-
- /* Calculate the width and heights */
- calc_height (text);
- calc_line_widths (text);
-
- if (text->clip_width < 0)
- clip_width = text->max_width;
- else
- clip_width = text->clip_width;
-
- /* Get canvas pixel coordinates for clip rectangle position */
- gnome_canvas_w2c (item->canvas, wx, wy, &text->clip_cx, &text->clip_cy);
- text->clip_cwidth = clip_width * item->canvas->pixels_per_unit;
- if ( text->clip_height >= 0 )
- text->clip_cheight = text->clip_height * item->canvas->pixels_per_unit;
- else
- text->clip_cheight = text->height * item->canvas->pixels_per_unit;
-
- /* Anchor text */
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- text->cx -= text->max_width / 2;
- text->clip_cx -= text->clip_cwidth / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- text->cx -= text->max_width;
- text->clip_cx -= text->clip_cwidth;
- break;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- text->cy -= text->height / 2;
- text->clip_cy -= text->clip_cheight / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- text->cy -= text->height;
- text->clip_cy -= text->clip_cheight;
- break;
- }
-
- /* Bounds */
-
- if (text->clip) {
- *px1 = text->clip_cx;
- *py1 = text->clip_cy;
- *px2 = text->clip_cx + text->clip_cwidth;
- *py2 = text->clip_cy + text->clip_cheight;
- } else {
- *px1 = text->cx;
- *py1 = text->cy;
- *px2 = text->cx + text->max_width;
- *py2 = text->cy + text->height;
- }
-}
-
-static void
-calc_height (EText *text)
-{
- GnomeCanvasItem *item;
- int old_height;
-
- item = GNOME_CANVAS_ITEM (text);
-
- /* Calculate text dimensions */
-
- old_height = text->height;
-
- /* Make sure the text is split into lines first */
- if (text->text && text->num_lines == 0)
- split_into_lines (text);
-
- if (text->text && text->font)
- text->height = (e_font_ascent (text->font) + e_font_descent (text->font)) * text->num_lines;
- else
- text->height = 0;
-
- if (old_height != text->height)
- e_canvas_item_request_parent_reflow(item);
-}
-
-static void
-calc_ellipsis (EText *text)
-{
- if (text->font)
- text->ellipsis_width =
- e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- text->ellipsis ? text->ellipsis : "...",
- text->ellipsis ? unicode_strlen (text->ellipsis, -1) : 3);
-}
-
-/* Calculates the line widths (in pixels) of the text's splitted lines */
-static void
-calc_line_widths (EText *text)
-{
- struct line *lines;
- int i;
- int j;
- gdouble clip_width;
-
- /* Make sure line has been split */
- if (text->text && text->num_lines == 0)
- split_into_lines (text);
-
- lines = text->lines;
- text->max_width = 0;
-
- clip_width = text->clip_width;
- if (clip_width >= 0 && text->draw_borders) {
- clip_width -= 6;
- if (clip_width < 0)
- clip_width = 0;
- }
-
-
- if (!lines)
- return;
-
- for (i = 0; i < text->num_lines; i++) {
- if (lines->length != 0) {
- if (text->font) {
- lines->width = e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text, lines->length);
- lines->ellipsis_length = 0;
- } else {
- lines->width = 0;
- }
-
- if (text->clip &&
- text->use_ellipsis &&
- ! text->editing &&
- lines->width > clip_width &&
- clip_width >= 0) {
- if (text->font) {
- lines->ellipsis_length = 0;
- for (j = 0; j < lines->length; j++ ) {
- if (e_font_utf8_text_width (text->font, E_FONT_PLAIN, lines->text, j) + text->ellipsis_width
- <= clip_width)
- lines->ellipsis_length = j;
- else
- break;
- }
- }
- else
- lines->ellipsis_length = 0;
- lines->width = e_font_utf8_text_width (text->font, E_FONT_PLAIN, lines->text, lines->ellipsis_length) +
- text->ellipsis_width;
- }
- else
- lines->ellipsis_length = lines->length;
-
- if (lines->width > text->max_width)
- text->max_width = lines->width;
- }
-
- lines++;
- }
-}
-
-static void
-e_text_free_lines(EText *text)
-{
- if (text->lines)
- g_free (text->lines);
-
- text->lines = NULL;
- text->num_lines = 0;
-}
-
-#define IS_BREAKCHAR(text,c) ((text)->break_characters && unicode_strchr ((text)->break_characters, (c)))
-/* Splits the text of the text item into lines */
-static void
-split_into_lines (EText *text)
-{
- char *p, *cp;
- struct line *lines;
- int len;
- int line_num;
- char *laststart;
- char *lastend;
- char *linestart;
- double clip_width;
- unicode_char_t unival;
- gint charpos;
-
- /* Free old array of lines */
- e_text_free_lines(text);
-
- if (!text->text)
- return;
-
- /* First, count the number of lines */
-
- lastend = text->text;
- laststart = text->text;
- linestart = text->text;
-
- clip_width = text->clip_width;
- if (clip_width >= 0 && text->draw_borders) {
- clip_width -= 6;
- if (clip_width < 0)
- clip_width = 0;
- }
-
- cp = text->text;
- charpos = 0;
-
- for (p = unicode_get_utf8 (cp, &unival); (unival && p); charpos++, cp = p, p = unicode_get_utf8 (p, &unival)) {
- if (text->line_wrap && (unicode_isspace (unival) || unival == '\n')) {
- if (laststart != lastend
- && e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- linestart,
- unicode_index_to_offset (linestart, cp - linestart))
- > clip_width ) {
- text->num_lines ++;
- linestart = laststart;
- laststart = p;
- lastend = cp;
- } else if (unicode_isspace (unival)) {
- laststart = p;
- lastend = cp;
- }
- } else if (text->line_wrap && (IS_BREAKCHAR(text, unival))) {
- if ( laststart != lastend
- && unicode_index_to_offset (linestart, cp - linestart) != 1
- && e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- linestart,
- unicode_index_to_offset (linestart, p - linestart))
- > clip_width ) {
- text->num_lines ++;
- linestart = laststart;
- laststart = p;
- lastend = p;
- } else {
- laststart = p;
- lastend = p;
- }
- }
- if (unival == '\n') {
- text->num_lines ++;
- lastend = p;
- laststart = p;
- linestart = p;
- }
- }
-
- /* fixme: */
- if (text->line_wrap) {
- if ( p
- && laststart != lastend
- && e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- linestart,
- unicode_index_to_offset (linestart, cp - linestart))
- > clip_width ) {
- text->num_lines ++;
- }
- }
-
- text->num_lines++;
-
- if ( (!text->editing) && text->max_lines != -1 && text->num_lines > text->max_lines ) {
- text->num_lines = text->max_lines;
- }
-
- /* Allocate array of lines and calculate split positions */
-
- text->lines = lines = g_new0 (struct line, text->num_lines);
- len = 0;
- line_num = 1;
- lastend = text->text;
- laststart = text->text;
-
- cp = text->text;
- for (p = unicode_get_utf8 (cp, &unival); line_num < text->num_lines && unival; cp = p, p = unicode_get_utf8 (p, &unival)) {
- gboolean handled = FALSE;
- if (len == 0)
- lines->text = cp;
- if (text->line_wrap && (unicode_isspace (unival) || unival == '\n')) {
- if (e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- lines->text,
- unicode_index_to_offset (lines->text, cp - lines->text))
- > clip_width
- && laststart != lastend) {
- lines->length = unicode_index_to_offset (lines->text, lastend - lines->text);
- lines++;
- line_num++;
- len = unicode_index_to_offset (laststart, cp - laststart);
- lines->text = laststart;
- laststart = p;
- lastend = cp;
- } else if (unicode_isspace (unival)) {
- laststart = p;
- lastend = cp;
- len ++;
- }
- handled = TRUE;
- } else if (text->line_wrap && (IS_BREAKCHAR(text, unival))) {
- if (laststart != lastend
- && unicode_index_to_offset (lines->text, cp - lines->text) != 1
- && e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- lines->text,
- unicode_index_to_offset (lines->text, p - lines->text))
- > clip_width ) {
- lines->length = unicode_index_to_offset (lines->text, lastend - lines->text);
- lines++;
- line_num++;
- len = unicode_index_to_offset (laststart, p - laststart);
- lines->text = laststart;
- laststart = p;
- lastend = p;
- } else {
- laststart = p;
- lastend = p;
- len ++;
- }
- }
- if (line_num >= text->num_lines)
- break;
- if (unival == '\n') {
- lines->length = unicode_index_to_offset (lines->text, cp - lines->text);
- lines++;
- line_num++;
- len = 0;
- lastend = p;
- laststart = p;
- handled = TRUE;
- }
- if (!handled)
- len++;
- }
-
- if ( line_num < text->num_lines && text->line_wrap ) {
- if (e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- lines->text,
- unicode_index_to_offset (lines->text, cp - lines->text))
- > clip_width
- && laststart != lastend ) {
- lines->length = unicode_index_to_offset (lines->text, lastend - lines->text);
- lines++;
- line_num++;
- len = unicode_index_to_offset (laststart, cp - laststart);
- lines->text = laststart;
- laststart = p;
- lastend = cp;
- }
- }
-
- if (len == 0)
- lines->text = cp;
- lines->length = unicode_strlen (lines->text, -1);
-}
-
-/* Convenience function to set the text's GC's foreground color */
-static void
-set_text_gc_foreground (EText *text)
-{
- GdkColor c;
-
- if (!text->gc)
- return;
-
- c.pixel = text->pixel;
- gdk_gc_set_foreground (text->gc, &c);
-}
-
-/* Sets the stipple pattern for the text */
-static void
-set_stipple (EText *text, GdkBitmap *stipple, int reconfigure)
-{
- if (text->stipple && !reconfigure)
- gdk_bitmap_unref (text->stipple);
-
- text->stipple = stipple;
- if (stipple && !reconfigure)
- gdk_bitmap_ref (stipple);
-
- if (text->gc) {
- if (stipple) {
- gdk_gc_set_stipple (text->gc, stipple);
- gdk_gc_set_fill (text->gc, GDK_STIPPLED);
- } else
- gdk_gc_set_fill (text->gc, GDK_SOLID);
- }
-}
-
-/* Set_arg handler for the text item */
-static void
-e_text_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EText *text;
- GdkColor color = { 0, 0, 0, 0, };
- GdkColor *pcolor;
- gboolean color_changed;
- int have_pixel;
-
- gboolean needs_update = 0;
- gboolean needs_reflow = 0;
-
- item = GNOME_CANVAS_ITEM (object);
- text = E_TEXT (object);
-
- color_changed = FALSE;
- have_pixel = FALSE;
-
- switch (arg_id) {
- case ARG_MODEL:
- if ( text->model_changed_signal_id )
- gtk_signal_disconnect(GTK_OBJECT(text->model),
- text->model_changed_signal_id);
- gtk_object_unref(GTK_OBJECT(text->model));
- text->model = E_TEXT_MODEL(GTK_VALUE_OBJECT (*arg));
- gtk_object_ref(GTK_OBJECT(text->model));
-
- text->model_changed_signal_id =
- gtk_signal_connect(GTK_OBJECT(text->model),
- "changed",
- GTK_SIGNAL_FUNC(e_text_text_model_changed),
- text);
-
- e_text_free_lines(text);
- text->text = e_text_model_get_text(text->model);
-
- text->needs_split_into_lines = 1;
- needs_reflow = 1;
- break;
-
- case ARG_EVENT_PROCESSOR:
- if ( text->tep && text->tep_command_id )
- gtk_signal_disconnect(GTK_OBJECT(text->tep),
- text->tep_command_id);
- if ( text->tep )
- gtk_object_unref(GTK_OBJECT(text->tep));
- text->tep = E_TEXT_EVENT_PROCESSOR(GTK_VALUE_OBJECT (*arg));
- gtk_object_ref(GTK_OBJECT(text->tep));
- text->tep_command_id =
- gtk_signal_connect(GTK_OBJECT(text->tep),
- "command",
- GTK_SIGNAL_FUNC(e_text_command),
- text);
- break;
-
- case ARG_TEXT:
- text->num_lines = 1;
- e_text_model_set_text(text->model, GTK_VALUE_STRING (*arg));
- break;
-
- case ARG_FONT:
- if (text->font)
- e_font_unref (text->font);
-
- text->font = e_font_from_gdk_name (GTK_VALUE_STRING (*arg));
-
-#if 0
- if (item->canvas->aa) {
- if (text->suckfont)
- e_suck_font_free (text->suckfont);
-
- text->suckfont = e_suck_font (text->font);
- }
-#endif
-
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_FONTSET:
- if (text->font)
- e_font_unref (text->font);
-
- text->font = e_font_from_gdk_name (GTK_VALUE_STRING (*arg));
-
-#if 0
- if (item->canvas->aa) {
- if (text->suckfont)
- e_suck_font_free (text->suckfont);
-
- text->suckfont = e_suck_font (text->font);
- }
-#endif
-
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_FONT_GDK:
- if (text->font)
- e_font_unref (text->font);
-
- text->font = e_font_from_gdk_font (GTK_VALUE_BOXED (*arg));
-
-#if 0
- if (item->canvas->aa) {
- if (text->suckfont)
- e_suck_font_free (text->suckfont);
-
- text->suckfont = e_suck_font (text->font);
- }
-#endif
-
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_ANCHOR:
- text->anchor = GTK_VALUE_ENUM (*arg);
- text->needs_recalc_bounds = 1;
- needs_update = 1;
- break;
-
- case ARG_JUSTIFICATION:
- text->justification = GTK_VALUE_ENUM (*arg);
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_CLIP_WIDTH:
- text->clip_width = fabs (GTK_VALUE_DOUBLE (*arg));
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_CLIP_HEIGHT:
- text->clip_height = fabs (GTK_VALUE_DOUBLE (*arg));
- text->needs_recalc_bounds = 1;
- needs_reflow = 1;
- break;
-
- case ARG_CLIP:
- text->clip = GTK_VALUE_BOOL (*arg);
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_FILL_CLIP_RECTANGLE:
- text->fill_clip_rectangle = GTK_VALUE_BOOL (*arg);
- needs_update = 1;
- break;
-
- case ARG_X_OFFSET:
- text->xofs = GTK_VALUE_DOUBLE (*arg);
- text->needs_recalc_bounds = 1;
- needs_update = 1;
- break;
-
- case ARG_Y_OFFSET:
- text->yofs = GTK_VALUE_DOUBLE (*arg);
- text->needs_recalc_bounds = 1;
- needs_update = 1;
- break;
-
- case ARG_FILL_COLOR:
- if (GTK_VALUE_STRING (*arg))
- gdk_color_parse (GTK_VALUE_STRING (*arg), &color);
-
- text->rgba = ((color.red & 0xff00) << 16 |
- (color.green & 0xff00) << 8 |
- (color.blue & 0xff00) |
- 0xff);
- color_changed = TRUE;
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_FILL_COLOR_GDK:
- pcolor = GTK_VALUE_BOXED (*arg);
- if (pcolor) {
- color = *pcolor;
- gdk_color_context_query_color (item->canvas->cc, &color);
- have_pixel = TRUE;
- }
-
- text->rgba = ((color.red & 0xff00) << 16 |
- (color.green & 0xff00) << 8 |
- (color.blue & 0xff00) |
- 0xff);
- color_changed = TRUE;
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_FILL_COLOR_RGBA:
- text->rgba = GTK_VALUE_UINT (*arg);
- color_changed = TRUE;
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_FILL_STIPPLE:
- set_stipple (text, GTK_VALUE_BOXED (*arg), FALSE);
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_EDITABLE:
- text->editable = GTK_VALUE_BOOL (*arg);
- text->needs_redraw = 1;
- needs_update = 1;
- break;
-
- case ARG_USE_ELLIPSIS:
- text->use_ellipsis = GTK_VALUE_BOOL (*arg);
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_ELLIPSIS:
- if (text->ellipsis)
- g_free (text->ellipsis);
-
- text->ellipsis = g_strdup (GTK_VALUE_STRING (*arg));
- calc_ellipsis (text);
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_LINE_WRAP:
- text->line_wrap = GTK_VALUE_BOOL (*arg);
- text->needs_split_into_lines = 1;
- needs_reflow = 1;
- break;
-
- case ARG_BREAK_CHARACTERS:
- if ( text->break_characters ) {
- g_free(text->break_characters);
- text->break_characters = NULL;
- }
- if ( GTK_VALUE_STRING (*arg) )
- text->break_characters = g_strdup( GTK_VALUE_STRING (*arg) );
- text->needs_split_into_lines = 1;
- needs_reflow = 1;
- break;
-
- case ARG_MAX_LINES:
- text->max_lines = GTK_VALUE_INT (*arg);
- text->needs_split_into_lines = 1;
- needs_reflow = 1;
- break;
-
- case ARG_WIDTH:
- text->clip_width = fabs (GTK_VALUE_DOUBLE (*arg));
- calc_ellipsis (text);
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- needs_reflow = 1;
- break;
-
- case ARG_DRAW_BORDERS:
- if (text->draw_borders != GTK_VALUE_BOOL (*arg)) {
- text->draw_borders = GTK_VALUE_BOOL (*arg);
- text->needs_calc_height = 1;
- text->needs_redraw = 1;
- needs_reflow = 1;
- needs_update = 1;
- }
- break;
-
- default:
- return;
- }
-
- if (color_changed) {
- if (have_pixel)
- text->pixel = color.pixel;
- else
- text->pixel = gnome_canvas_get_color_pixel (item->canvas, text->rgba);
-
- if (!item->canvas->aa)
- set_text_gc_foreground (text);
-
- }
-
- if ( needs_reflow )
- e_canvas_item_request_reflow (item);
- if ( needs_update )
- gnome_canvas_item_request_update (item);
-}
-
-/* Get_arg handler for the text item */
-static void
-e_text_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EText *text;
- GdkColor *color;
-
- text = E_TEXT (object);
-
- switch (arg_id) {
- case ARG_MODEL:
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(text->model);
- break;
-
- case ARG_EVENT_PROCESSOR:
- _get_tep(text);
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(text->tep);
- break;
-
- case ARG_TEXT:
- GTK_VALUE_STRING (*arg) = g_strdup (text->text);
- break;
-
- /* fixme: */
- case ARG_FONT_GDK:
- GTK_VALUE_BOXED (*arg) = text->font;
- break;
-
- case ARG_ANCHOR:
- GTK_VALUE_ENUM (*arg) = text->anchor;
- break;
-
- case ARG_JUSTIFICATION:
- GTK_VALUE_ENUM (*arg) = text->justification;
- break;
-
- case ARG_CLIP_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = text->clip_width;
- break;
-
- case ARG_CLIP_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = text->clip_height;
- break;
-
- case ARG_CLIP:
- GTK_VALUE_BOOL (*arg) = text->clip;
- break;
-
- case ARG_FILL_CLIP_RECTANGLE:
- GTK_VALUE_BOOL (*arg) = text->fill_clip_rectangle;
- break;
-
- case ARG_X_OFFSET:
- GTK_VALUE_DOUBLE (*arg) = text->xofs;
- break;
-
- case ARG_Y_OFFSET:
- GTK_VALUE_DOUBLE (*arg) = text->yofs;
- break;
-
- case ARG_FILL_COLOR_GDK:
- color = g_new (GdkColor, 1);
- color->pixel = text->pixel;
- gdk_color_context_query_color (text->item.canvas->cc, color);
- GTK_VALUE_BOXED (*arg) = color;
- break;
-
- case ARG_FILL_COLOR_RGBA:
- GTK_VALUE_UINT (*arg) = text->rgba;
- break;
-
- case ARG_FILL_STIPPLE:
- GTK_VALUE_BOXED (*arg) = text->stipple;
- break;
-
- case ARG_TEXT_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = text->max_width / text->item.canvas->pixels_per_unit;
- break;
-
- case ARG_TEXT_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = text->height / text->item.canvas->pixels_per_unit;
- break;
-
- case ARG_EDITABLE:
- GTK_VALUE_BOOL (*arg) = text->editable;
- break;
-
- case ARG_USE_ELLIPSIS:
- GTK_VALUE_BOOL (*arg) = text->use_ellipsis;
- break;
-
- case ARG_ELLIPSIS:
- GTK_VALUE_STRING (*arg) = g_strdup (text->ellipsis);
- break;
-
- case ARG_LINE_WRAP:
- GTK_VALUE_BOOL (*arg) = text->line_wrap;
- break;
-
- case ARG_BREAK_CHARACTERS:
- GTK_VALUE_STRING (*arg) = g_strdup (text->break_characters);
- break;
-
- case ARG_MAX_LINES:
- GTK_VALUE_INT (*arg) = text->max_lines;
- break;
-
- case ARG_WIDTH:
- GTK_VALUE_DOUBLE (*arg) = text->clip_width;
- break;
-
- case ARG_HEIGHT:
- GTK_VALUE_DOUBLE (*arg) = text->clip && text->clip_height != -1 ? text->clip_height : text->height / text->item.canvas->pixels_per_unit;
- break;
-
- case ARG_DRAW_BORDERS:
- GTK_VALUE_BOOL (*arg) = text->draw_borders;
- break;
-
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-/* Update handler for the text item */
-static void
-e_text_reflow (GnomeCanvasItem *item, int flags)
-{
- EText *text;
-
- text = E_TEXT (item);
-
- if ( text->needs_split_into_lines ) {
- split_into_lines(text);
- text->needs_split_into_lines = 0;
- text->needs_calc_line_widths = 1;
- }
- if ( text->needs_calc_line_widths ) {
- int x;
- int i;
- struct line *lines;
- gdouble clip_width;
- calc_line_widths(text);
- text->needs_calc_line_widths = 0;
- text->needs_calc_height = 1;
- text->needs_redraw = 1;
-
- lines = text->lines;
- if ( !lines )
- return;
-
- for (lines = text->lines, i = 0; i < text->num_lines ; i++, lines ++) {
- if (unicode_index_to_offset (text->text, lines->text - text->text) > text->selection_end) {
- break;
- }
- }
- lines --;
- i--;
- x = e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- lines->text,
- text->selection_end - unicode_index_to_offset (text->text, lines->text - text->text));
-
-
- if (x < text->xofs_edit) {
- text->xofs_edit = x;
- }
-
- clip_width = text->clip_width;
- if (clip_width >= 0 && text->draw_borders) {
- clip_width -= 6;
- if (clip_width < 0)
- clip_width = 0;
- }
-
- if (2 + x - clip_width > text->xofs_edit) {
- text->xofs_edit = 2 + x - clip_width;
- }
-
- if ((e_font_ascent (text->font) + e_font_descent (text->font)) * i < text->yofs_edit)
- text->yofs_edit = (e_font_ascent (text->font) + e_font_descent (text->font)) * i;
-
- if ((e_font_ascent (text->font) + e_font_descent (text->font)) * (i + 1) -
- (text->clip_height != -1 ? text->clip_height : text->height) > text->yofs_edit)
- text->yofs_edit = (e_font_ascent (text->font) + e_font_descent (text->font)) * (i + 1) -
- (text->clip_height != -1 ? text->clip_height : text->height);
- }
- if ( text->needs_calc_height ) {
- calc_height (text);
- gnome_canvas_item_request_update(item);
- text->needs_calc_height = 0;
- text->needs_recalc_bounds = 1;
- }
-}
-
-/* Update handler for the text item */
-static void
-e_text_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- EText *text;
- double x1, y1, x2, y2;
- ArtDRect i_bbox, c_bbox;
- int i;
-
- text = E_TEXT (item);
-
- if (parent_class->update)
- (* parent_class->update) (item, affine, clip_path, flags);
-
- if ( text->needs_recalc_bounds
- || (flags & GNOME_CANVAS_UPDATE_AFFINE)) {
- if (!item->canvas->aa) {
- set_text_gc_foreground (text);
- set_stipple (text, text->stipple, TRUE);
- get_bounds (text, &x1, &y1, &x2, &y2);
- if ( item->x1 != x1 ||
- item->x2 != x2 ||
- item->y1 != y1 ||
- item->y2 != y2 ) {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- item->x1 = x1;
- item->y1 = y1;
- item->x2 = x2;
- item->y2 = y2;
- text->needs_redraw = 1;
- }
- } else {
- /* aa rendering */
- for (i = 0; i < 6; i++)
- text->affine[i] = affine[i];
- get_bounds_item_relative (text, &i_bbox.x0, &i_bbox.y0, &i_bbox.x1, &i_bbox.y1);
- art_drect_affine_transform (&c_bbox, &i_bbox, affine);
- }
- text->needs_recalc_bounds = 0;
- }
- if ( text->needs_redraw ) {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- text->needs_redraw = 0;
- }
-}
-
-/* Realize handler for the text item */
-static void
-e_text_realize (GnomeCanvasItem *item)
-{
- EText *text;
-
- text = E_TEXT (item);
-
- if (parent_class->realize)
- (* parent_class->realize) (item);
-
- text->gc = gdk_gc_new (item->canvas->layout.bin_window);
-
- text->i_cursor = gdk_cursor_new (GDK_XTERM);
- text->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
- if (text->font == NULL) {
- text->font = e_font_from_gdk_font (GTK_WIDGET(item->canvas)->style->font);
- }
-}
-
-/* Unrealize handler for the text item */
-static void
-e_text_unrealize (GnomeCanvasItem *item)
-{
- EText *text;
-
- text = E_TEXT (item);
-
- gdk_gc_unref (text->gc);
- text->gc = NULL;
-
- gdk_cursor_destroy (text->i_cursor);
- gdk_cursor_destroy (text->default_cursor);
-
- if (parent_class->unrealize)
- (* parent_class->unrealize) (item);
-}
-
-/* Calculates the x position of the specified line of text, based on the text's justification */
-static double
-get_line_xpos_item_relative (EText *text, struct line *line)
-{
- double x;
-
- x = 0;
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- x -= text->max_width / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- x -= text->max_width;
- break;
- }
-
- switch (text->justification) {
- case GTK_JUSTIFY_RIGHT:
- x += text->max_width - line->width;
- break;
-
- case GTK_JUSTIFY_CENTER:
- x += (text->max_width - line->width) * 0.5;
- break;
-
- default:
- if (text->draw_borders)
- x += BORDER_INDENT;
-
- /* For GTK_JUSTIFY_LEFT, we don't have to do anything. We do not support
- * GTK_JUSTIFY_FILL, yet.
- */
- break;
- }
-
- return x;
-}
-
-#if 0
-/* Calculates the y position of the first line of text. */
-static double
-get_line_ypos_item_relative (EText *text)
-{
- double y;
-
- y = 0;
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- y -= text->height / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- y -= text->height;
- break;
- }
-
- return y;
-}
-#endif
-
-/* Calculates the x position of the specified line of text, based on the text's justification */
-static int
-get_line_xpos (EText *text, struct line *line)
-{
- int x;
-
- x = text->cx;
-
- switch (text->justification) {
- case GTK_JUSTIFY_RIGHT:
- x += text->max_width - line->width;
- break;
-
- case GTK_JUSTIFY_CENTER:
- x += (text->max_width - line->width) / 2;
- break;
-
- default:
- if (text->draw_borders)
- x += BORDER_INDENT;
- /* For GTK_JUSTIFY_LEFT, we don't have to do anything. We do not support
- * GTK_JUSTIFY_FILL, yet.
- */
- break;
- }
-
-
- return x;
-}
-
-static void
-_get_tep(EText *text)
-{
- if (!text->tep) {
- text->tep = e_text_event_processor_emacs_like_new();
- gtk_object_ref (GTK_OBJECT (text->tep));
- gtk_object_sink (GTK_OBJECT (text->tep));
- text->tep_command_id =
- gtk_signal_connect(GTK_OBJECT(text->tep),
- "command",
- GTK_SIGNAL_FUNC(e_text_command),
- (gpointer) text);
- }
-}
-
-/* Draw handler for the text item */
-static void
-e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- EText *text;
- GdkRectangle rect, *clip_rect;
- struct line *lines;
- int i;
- int xpos, ypos;
- int start_char, end_char;
- int sel_start, sel_end;
- GdkRectangle sel_rect;
- GdkGC *fg_gc;
- GnomeCanvas *canvas;
-
- text = E_TEXT (item);
- canvas = GNOME_CANVAS_ITEM(text)->canvas;
-
- fg_gc = GTK_WIDGET(canvas)->style->fg_gc[text->has_selection ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE];
-
- if (text->draw_borders) {
- gdouble thisx = 0, thisy = 0;
- gdouble thiswidth, thisheight;
- GtkWidget *widget = GTK_WIDGET(item->canvas);
-
- gtk_object_get(GTK_OBJECT(text),
- "width", &thiswidth,
- "height", &thisheight,
- NULL);
- gtk_paint_flat_box (widget->style, drawable,
- GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE,
- NULL, widget, "entry_bg",
- 0, 0, thiswidth, thisheight);
- if (text->editing) {
- thisx += 1;
- thisy += 1;
- thiswidth -= 2;
- thisheight -= 2;
- }
- gtk_paint_shadow (widget->style, drawable,
- GTK_STATE_NORMAL, GTK_SHADOW_IN,
- NULL, widget, "entry",
- thisx - x, thisy - y, thiswidth, thisheight);
-
- if (text->editing) {
- gtk_paint_focus (widget->style, drawable,
- NULL, widget, "entry",
- - x, - y, thiswidth + 1, thisheight + 1);
- }
- }
-
- if (!text->text || !text->font)
- return;
-
- lines = text->lines;
- if ( !lines ) {
- text->needs_split_into_lines = 1;
- e_canvas_item_request_reflow (item);
- }
-
- clip_rect = NULL;
- if (text->clip) {
- rect.x = text->clip_cx - x;
- rect.y = text->clip_cy - y;
- rect.width = text->clip_cwidth;
- rect.height = text->clip_cheight;
-
- gdk_gc_set_clip_rectangle (text->gc, &rect);
- gdk_gc_set_clip_rectangle (fg_gc, &rect);
- clip_rect = &rect;
- }
- ypos = text->cy + e_font_ascent (text->font);
- if (text->draw_borders)
- ypos += BORDER_INDENT;
-
- if (text->editing)
- ypos -= text->yofs_edit;
-
- if (text->stipple)
- gnome_canvas_set_stipple_origin (item->canvas, text->gc);
-
- for (i = 0; i < text->num_lines; i++) {
- xpos = get_line_xpos (text, lines);
- if (text->editing) {
- xpos -= text->xofs_edit;
- start_char = unicode_index_to_offset (text->text, lines->text - text->text);
- end_char = start_char + lines->length;
- sel_start = text->selection_start;
- sel_end = text->selection_end;
- if (sel_start > sel_end ) {
- sel_start ^= sel_end;
- sel_end ^= sel_start;
- sel_start ^= sel_end;
- }
- if ( sel_start < start_char )
- sel_start = start_char;
- if ( sel_end > end_char )
- sel_end = end_char;
- if ( sel_start < sel_end ) {
- sel_rect.x = xpos - x + e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text,
- sel_start - start_char);
- sel_rect.y = ypos - y - e_font_ascent (text->font);
- sel_rect.width = e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text + unicode_offset_to_index (lines->text, sel_start - start_char),
- sel_end - sel_start);
- sel_rect.height = e_font_ascent (text->font) + e_font_descent (text->font);
- gtk_paint_flat_box(GTK_WIDGET(item->canvas)->style,
- drawable,
- text->has_selection ?
- GTK_STATE_SELECTED :
- GTK_STATE_ACTIVE,
- GTK_SHADOW_NONE,
- clip_rect,
- GTK_WIDGET(item->canvas),
- "text",
- sel_rect.x,
- sel_rect.y,
- sel_rect.width,
- sel_rect.height);
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x,
- ypos - y,
- lines->text,
- sel_start - start_char);
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- fg_gc,
- xpos - x + e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text,
- sel_start - start_char),
- ypos - y,
- lines->text + unicode_offset_to_index (lines->text, sel_start - start_char),
- sel_end - sel_start);
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x + e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text,
- sel_end - start_char),
- ypos - y,
- lines->text + unicode_offset_to_index (lines->text, sel_end - start_char),
- end_char - sel_end);
- } else {
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x,
- ypos - y,
- lines->text,
- lines->length);
- }
- if (text->selection_start == text->selection_end &&
- text->selection_start >= start_char &&
- text->selection_start <= end_char &&
- text->show_cursor) {
- gdk_draw_rectangle (drawable,
- text->gc,
- TRUE,
- xpos - x + e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text,
- sel_start - start_char),
- ypos - y - e_font_ascent (text->font),
- 1,
- e_font_ascent (text->font) + e_font_descent (text->font));
- }
- } else {
- if (text->clip && text->use_ellipsis && lines->ellipsis_length < lines->length) {
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x,
- ypos - y,
- lines->text,
- lines->ellipsis_length);
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x + lines->width - text->ellipsis_width,
- ypos - y,
- text->ellipsis ? text->ellipsis : "...",
- text->ellipsis ? unicode_strlen (text->ellipsis, -1) : 3);
- } else
- e_font_draw_utf8_text (drawable,
- text->font, E_FONT_PLAIN,
- text->gc,
- xpos - x,
- ypos - y,
- lines->text,
- lines->length);
- }
-
- ypos += e_font_ascent (text->font) + e_font_descent (text->font);
- lines++;
- }
-
- if (text->clip) {
- gdk_gc_set_clip_rectangle (text->gc, NULL);
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
- }
-}
-
-/* Render handler for the text item */
-static void
-e_text_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
-{
-#if 0
- EText *text;
- guint32 fg_color;
- double xpos, ypos;
- struct line *lines;
- int i, j;
- double affine[6];
- int dx, dy;
- ArtPoint start_i, start_c;
-
- text = E_TEXT (item);
-
- if (!text->text || !text->font || !text->suckfont)
- return;
-
- suckfont = text->suckfont;
-
- fg_color = text->rgba;
-
- gnome_canvas_buf_ensure_buf (buf);
-
- lines = text->lines;
- if ( !lines )
- return;
-
- start_i.y = get_line_ypos_item_relative (text);
-
- art_affine_scale (affine, item->canvas->pixels_per_unit, item->canvas->pixels_per_unit);
- for (i = 0; i < 6; i++)
- affine[i] = text->affine[i];
-
- for (i = 0; i < text->num_lines; i++) {
- if (lines->length != 0) {
- start_i.x = get_line_xpos_item_relative (text, lines);
- art_affine_point (&start_c, &start_i, text->affine);
- xpos = start_c.x;
- ypos = start_c.y;
-
- for (j = 0; j < lines->length; j++) {
- ETextSuckChar *ch;
-
- ch = &suckfont->chars[(unsigned char)((lines->text)[j])];
-
- affine[4] = xpos;
- affine[5] = ypos;
- art_rgb_bitmap_affine (
- buf->buf,
- buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1,
- buf->buf_rowstride,
- suckfont->bitmap + (ch->bitmap_offset >> 3),
- ch->width,
- suckfont->bitmap_height,
- suckfont->bitmap_width >> 3,
- fg_color,
- affine,
- ART_FILTER_NEAREST, NULL);
-
- dx = ch->left_sb + ch->width + ch->right_sb;
- xpos += dx * affine[0];
- ypos += dx * affine[1];
- }
- }
-
- dy = text->font->ascent + text->font->descent;
- start_i.y += dy;
- lines++;
- }
-
- buf->is_bg = 0;
-#endif
-}
-
-/* Point handler for the text item */
-static double
-e_text_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy, GnomeCanvasItem **actual_item)
-{
- EText *text;
- int i;
- struct line *lines;
- int x1, y1, x2, y2;
- int font_height;
- int dx, dy;
- double dist, best;
-
- text = E_TEXT (item);
-
- *actual_item = item;
-
- /* The idea is to build bounding rectangles for each of the lines of
- * text (clipped by the clipping rectangle, if it is activated) and see
- * whether the point is inside any of these. If it is, we are done.
- * Otherwise, calculate the distance to the nearest rectangle.
- */
-
- if (text->font)
- font_height = e_font_ascent (text->font) + e_font_descent (text->font);
- else
- font_height = 0;
-
- best = 1.0e36;
-
- lines = text->lines;
-
- if (text->fill_clip_rectangle) {
- double clip_width;
- double clip_height;
-
- /* Calculate the width and heights */
- calc_height (text);
- calc_line_widths (text);
-
- if (text->clip_width < 0)
- clip_width = text->max_width;
- else
- clip_width = text->clip_width;
-
- /* Get canvas pixel coordinates for clip rectangle position */
- clip_width = clip_width * item->canvas->pixels_per_unit;
- if ( text->clip_height >= 0 )
- clip_height = text->clip_height * item->canvas->pixels_per_unit;
- else
- clip_height = text->height * item->canvas->pixels_per_unit;
-
- if (cx >= text->clip_cx &&
- cx <= text->clip_cx + clip_width &&
- cy >= text->clip_cy &&
- cy <= text->clip_cy + clip_height)
- return 0;
- else
- return 1;
- }
-
- for (i = 0; i < text->num_lines; i++) {
- /* Compute the coordinates of rectangle for the current line,
- * clipping if appropriate.
- */
-
- x1 = get_line_xpos (text, lines);
- y1 = text->cy + i * font_height;
- x2 = x1 + lines->width;
- y2 = y1 + font_height;
-
- if (text->clip) {
- if (x1 < text->clip_cx)
- x1 = text->clip_cx;
-
- if (y1 < text->clip_cy)
- y1 = text->clip_cy;
-
- if ( text->clip_width >= 0 ) {
- if (x2 > (text->clip_cx + text->clip_width))
- x2 = text->clip_cx + text->clip_width;
- }
-
- if ( text->clip_height >= 0 ) {
- if (y2 > (text->clip_cy + text->clip_height))
- y2 = text->clip_cy + text->clip_height;
- }
-
- if ((x1 >= x2) || (y1 >= y2))
- continue;
- }
-
- /* Calculate distance from point to rectangle */
-
- if (cx < x1)
- dx = x1 - cx;
- else if (cx >= x2)
- dx = cx - x2 + 1;
- else
- dx = 0;
-
- if (cy < y1)
- dy = y1 - cy;
- else if (cy >= y2)
- dy = cy - y2 + 1;
- else
- dy = 0;
-
- if ((dx == 0) && (dy == 0))
- return 0.0;
-
- dist = sqrt (dx * dx + dy * dy);
- if (dist < best)
- best = dist;
-
- /* Next! */
-
- lines++;
- }
-
- return best / item->canvas->pixels_per_unit;
-}
-
-/* Bounds handler for the text item */
-static void
-e_text_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- EText *text;
- double width, height;
-
- text = E_TEXT (item);
-
- *x1 = 0;
- *y1 = 0;
-
- if (text->clip) {
- width = text->clip_width;
- if ( text->clip_height >= 0 )
- height = text->clip_height;
- else height = text->height;
- } else {
- width = text->max_width / item->canvas->pixels_per_unit;
- height = text->height / item->canvas->pixels_per_unit;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- *x1 -= width / 2.0;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- *x1 -= width;
- break;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- *y1 -= height / 2.0;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- *y1 -= height;
- break;
- }
-
- *x2 = *x1 + width;
- *y2 = *y1 + height;
-}
-
-static void
-_get_xy_from_position (EText *text, gint position, gint *xp, gint *yp)
-{
- if ( !text->lines )
- return;
- if (xp || yp) {
- struct line *lines = NULL;
- int x, y;
- double xd, yd;
- int j;
- x = get_line_xpos_item_relative (text, lines);
- y = text->yofs;
- y -= text->yofs_edit;
- for (j = 0, lines = text->lines; j < text->num_lines; lines++, j++) {
- if (lines->text > text->text + position)
- break;
- y += e_font_height (text->font);
- }
- lines --;
- y -= e_font_descent (text->font);
-
- x += e_font_utf8_text_width (text->font, E_FONT_PLAIN,
- lines->text,
- position - unicode_index_to_offset (text->text, lines->text - text->text));
- x -= text->xofs_edit;
-
- xd = x; yd = y;
- gnome_canvas_item_i2w (GNOME_CANVAS_ITEM(text), &xd, &yd);
- gnome_canvas_w2c (GNOME_CANVAS_ITEM(text)->canvas, xd, yd, &x, &y);
-
- if (xp)
- *xp = x;
- if (yp)
- *yp = y;
- }
-}
-
-static gint
-_get_position_from_xy (EText *text, gint x, gint y)
-{
- int i, j;
- int ypos = text->yofs;
- int xpos;
- double xd, yd;
- char *p;
- unicode_char_t unival;
-
- struct line *lines;
-
- xd = x; yd = y;
- gnome_canvas_c2w (GNOME_CANVAS_ITEM(text)->canvas, xd, yd, &xd, &yd);
- gnome_canvas_item_w2i (GNOME_CANVAS_ITEM(text), &xd, &yd);
- x = xd; y = yd;
-
- y += text->yofs_edit;
-
- if (text->draw_borders)
- ypos += BORDER_INDENT;
-
- j = 0;
- while (y > ypos) {
- ypos += e_font_height (text->font);
- j ++;
- }
- j--;
- if (j >= text->num_lines)
- j = text->num_lines - 1;
- if (j < 0)
- j = 0;
- i = 0;
- lines = text->lines;
-
- if ( !lines )
- return 0;
-
- lines += j;
- x += text->xofs_edit;
- xpos = get_line_xpos_item_relative (text, lines);
-
- for (i = 0, p = lines->text; i < lines->length; i++, p = unicode_get_utf8 (p, &unival)) {
- int charwidth;
-
- charwidth = e_font_utf8_text_width (text->font, E_FONT_PLAIN, p, 1);
- xpos += charwidth / 2;
- if (xpos > x) {
- break;
- }
- xpos += (charwidth + 1) / 2;
- }
- return unicode_index_to_offset (text->text, p - text->text);
-}
-
-#define SCROLL_WAIT_TIME 30000
-
-static gboolean
-_blink_scroll_timeout (gpointer data)
-{
- EText *text = E_TEXT(data);
- gulong current_time;
- gboolean scroll = FALSE;
- gboolean redraw = FALSE;
-
- g_timer_elapsed(text->timer, &current_time);
-
- if (text->scroll_start + SCROLL_WAIT_TIME > 1000000) {
- if (current_time > text->scroll_start - (1000000 - SCROLL_WAIT_TIME) &&
- current_time < text->scroll_start)
- scroll = TRUE;
- } else {
- if (current_time > text->scroll_start + SCROLL_WAIT_TIME ||
- current_time < text->scroll_start)
- scroll = TRUE;
- }
- if (scroll && text->button_down) {
- if (text->lastx - text->clip_cx > text->clip_cwidth &&
- text->xofs_edit < text->max_width - text->clip_cwidth) {
- text->xofs_edit += 4;
- if (text->xofs_edit > text->max_width - text->clip_cwidth + 1)
- text->xofs_edit = text->max_width - text->clip_cwidth + 1;
- redraw = TRUE;
- }
- if (text->lastx - text->clip_cx < 0 &&
- text->xofs_edit > 0) {
- text->xofs_edit -= 4;
- if (text->xofs_edit < 0)
- text->xofs_edit = 0;
- redraw = TRUE;
- }
-
- if (text->lasty - text->clip_cy > text->clip_cheight &&
- text->yofs_edit < text->height - text->clip_cheight) {
- text->yofs_edit += 4;
- if (text->yofs_edit > text->height - text->clip_cheight + 1)
- text->yofs_edit = text->height - text->clip_cheight + 1;
- redraw = TRUE;
- }
- if (text->lasty - text->clip_cy < 0 &&
- text->yofs_edit > 0) {
- text->yofs_edit -= 4;
- if (text->yofs_edit < 0)
- text->yofs_edit = 0;
- redraw = TRUE;
- }
-
- if (redraw) {
- ETextEventProcessorEvent e_tep_event;
- e_tep_event.type = GDK_MOTION_NOTIFY;
- e_tep_event.motion.state = text->last_state;
- e_tep_event.motion.time = 0;
- e_tep_event.motion.position = _get_position_from_xy(text, text->lastx, text->lasty);
- _get_tep(text);
- e_text_event_processor_handle_event (text->tep,
- &e_tep_event);
- text->scroll_start = current_time;
- }
- }
-
- if (!((current_time / 500000) % 2)) {
- if (!text->show_cursor)
- redraw = TRUE;
- text->show_cursor = TRUE;
- } else {
- if (text->show_cursor)
- redraw = TRUE;
- text->show_cursor = FALSE;
- }
- if (redraw) {
- text->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
- }
- return TRUE;
-}
-
-static gboolean
-tooltip_event(GtkWidget *tooltip, GdkEvent *event, EText *text)
-{
- gint ret_val = FALSE;
- switch (event->type) {
- case GDK_LEAVE_NOTIFY:
- if (text->tooltip_window) {
- gtk_widget_destroy (text->tooltip_window);
- text->tooltip_window = NULL;
- }
- break;
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- if (event->type == GDK_BUTTON_RELEASE) {
- if (text->tooltip_window) {
- gtk_widget_destroy (text->tooltip_window);
- text->tooltip_window = NULL;
- }
- }
- /* Forward events to the text item */
- gtk_signal_emit_by_name (GTK_OBJECT (text), "event", event,
- &ret_val);
- default:
- break;
- }
- return ret_val;
-}
-
-static gboolean
-_do_tooltip (gpointer data)
-{
- EText *text = E_TEXT (data);
- struct line *lines;
- GtkWidget *canvas;
- int i;
- gdouble max_width;
- gboolean cut_off;
- double i2c[6];
- ArtPoint origin = {0, 0};
- ArtPoint pixel_origin;
- int canvas_x, canvas_y;
- GnomeCanvasItem *tooltip_text;
- double tooltip_width;
- double tooltip_height;
- double tooltip_x;
- double tooltip_y;
-#if 0
- double x1, x2, y1, y2;
-#endif
- GnomeCanvasItem *rect;
-
- text->tooltip_count = 0;
-
- lines = text->lines;
-
- if (text->tooltip_window || text->editing || (!lines)) {
- text->tooltip_timeout = 0;
- return FALSE;
- }
-
- cut_off = FALSE;
- for ( lines = text->lines, i = 0; i < text->num_lines; lines++, i++ ) {
- if (lines->length > lines->ellipsis_length) {
- cut_off = TRUE;
- break;
- }
- }
- if ( ! cut_off ) {
- text->tooltip_timeout = 0;
- return FALSE;
- }
-
- gnome_canvas_item_i2c_affine(GNOME_CANVAS_ITEM(text), i2c);
- art_affine_point (&pixel_origin, &origin, i2c);
-
- gdk_window_get_origin (GTK_WIDGET(GNOME_CANVAS_ITEM(text)->canvas)->window, &canvas_x, &canvas_y);
- pixel_origin.x += canvas_x;
- pixel_origin.y += canvas_y;
- pixel_origin.x -= (int) gtk_layout_get_hadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(text)->canvas))->value;
- pixel_origin.y -= (int) gtk_layout_get_vadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(text)->canvas))->value;
-
- text->tooltip_window = gtk_window_new (GTK_WINDOW_POPUP);
- gtk_container_set_border_width (GTK_CONTAINER (text->tooltip_window), 1);
-
- canvas = e_canvas_new ();
-
-
-
-
-
-
-
- gtk_container_add (GTK_CONTAINER (text->tooltip_window), canvas);
-
- /* Get the longest line length */
- max_width = 0.0;
- for (lines = text->lines, i = 0; i < text->num_lines; lines++, i++) {
- gdouble line_width;
-
- line_width = e_font_utf8_text_width (text->font, E_FONT_PLAIN, lines->text, lines->length);
- max_width = MAX (max_width, line_width);
- }
-
- rect = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (canvas)),
- gnome_canvas_rect_get_type (),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) max_width + 4,
- "y2", (double) text->height + 4,
- "fill_color", "yellow",
- NULL);
-
- /* fixme: */
- tooltip_text = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (canvas)),
- e_text_get_type (),
- "anchor", GTK_ANCHOR_NW,
- "font_gdk", text->font,
- "text", text->text,
- "editable", FALSE,
- "clip_width", text->max_lines != 1 ? text->clip_width : max_width,
- "clip_height", text->max_lines != 1 ? -1 : (double)text->height,
- "clip", TRUE,
- "line_wrap", text->line_wrap,
- "justification", text->justification,
- NULL);
-
-
-
- if (text->draw_borders)
- e_canvas_item_move_absolute(tooltip_text, 1 + BORDER_INDENT, 1 + BORDER_INDENT);
- else
- e_canvas_item_move_absolute(tooltip_text, 1, 1);
-
-
- calc_height(E_TEXT(tooltip_text));
- calc_line_widths(E_TEXT(tooltip_text));
- gnome_canvas_item_set (tooltip_text,
- "clip_height", (double) E_TEXT(tooltip_text)->height,
- "clip_width", (double) E_TEXT(tooltip_text)->max_width,
- NULL);
- tooltip_width = E_TEXT(tooltip_text)->max_width;
- tooltip_height = E_TEXT(tooltip_text)->height;
- tooltip_x = 0;
- tooltip_y = 0;
- switch(E_TEXT(tooltip_text)->justification) {
- case GTK_JUSTIFY_CENTER:
- tooltip_x = - tooltip_width / 2;
- break;
- case GTK_JUSTIFY_RIGHT:
- tooltip_x = tooltip_width / 2;
- break;
- case GTK_JUSTIFY_FILL:
- case GTK_JUSTIFY_LEFT:
- tooltip_x = 0;
- break;
- }
- switch(E_TEXT(tooltip_text)->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- tooltip_y -= tooltip_height / 2.0;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- tooltip_y -= tooltip_height;
- break;
- }
- switch(E_TEXT(tooltip_text)->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- tooltip_x -= tooltip_width / 2.0;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- tooltip_x -= tooltip_width;
- break;
- }
-#if 0
- get_bounds(text, &x1, &y1, &x2, &y2);
- if ( x1 < tooltip_x ) {
- gnome_canvas_item_move(tooltip_text, tooltip_x - x1, 0);
- tooltip_x = x1;
- }
- if ( y1 < tooltip_y ) {
- gnome_canvas_item_move(tooltip_text, 0, tooltip_y - y1);
- tooltip_y = y1;
- }
- if ( x2 > tooltip_x + tooltip_width )
- tooltip_width = x2 - tooltip_x;
- if ( y2 > tooltip_y + tooltip_height )
- tooltip_height = y2 - tooltip_y;
-#endif
-
- gnome_canvas_item_set(rect,
- "x2", (double) tooltip_width + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0),
- "y2", (double) tooltip_height + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0),
- NULL);
-
- gtk_widget_set_usize (text->tooltip_window,
- tooltip_width + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0),
- tooltip_height + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0));
- gnome_canvas_set_scroll_region (GNOME_CANVAS(canvas), 0.0, 0.0,
- tooltip_width + (text->draw_borders ? BORDER_INDENT * 2 : 0),
- (double)tooltip_height + (text->draw_borders ? BORDER_INDENT * 2 : 0));
- gtk_widget_show (canvas);
- gtk_widget_realize (text->tooltip_window);
- gtk_signal_connect (GTK_OBJECT(text->tooltip_window), "event",
- GTK_SIGNAL_FUNC(tooltip_event), text);
-
- gtk_widget_popup (text->tooltip_window, pixel_origin.x - 2 + tooltip_x, pixel_origin.y - 2 + tooltip_y);
-
- text->tooltip_timeout = 0;
- return FALSE;
-}
-
-static gboolean
-_click (gpointer data)
-{
- *(gint *)data = 0;
- return FALSE;
-}
-
-static gint
-e_text_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EText *text = E_TEXT(item);
- ETextEventProcessorEvent e_tep_event;
-
- gint return_val = 0;
-
- e_tep_event.type = event->type;
- switch (event->type) {
- case GDK_FOCUS_CHANGE:
- if (text->editable) {
- GdkEventFocus *focus_event;
- focus_event = (GdkEventFocus *) event;
- if (focus_event->in) {
- if(!text->editing) {
- text->editing = TRUE;
- if ( text->pointer_in ) {
- if ( text->default_cursor_shown && (!text->draw_borders)) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor);
- text->default_cursor_shown = FALSE;
- }
- }
- text->select_by_word = FALSE;
- text->xofs_edit = 0;
- text->yofs_edit = 0;
- if (text->timeout_id == 0)
- text->timeout_id = g_timeout_add(10, _blink_scroll_timeout, text);
- text->timer = g_timer_new();
- g_timer_elapsed(text->timer, &(text->scroll_start));
- g_timer_start(text->timer);
- }
- } else {
- text->editing = FALSE;
- if ( (!text->default_cursor_shown) && (!text->draw_borders) ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor);
- text->default_cursor_shown = TRUE;
- }
- if (text->timeout_id) {
- g_source_remove(text->timeout_id);
- text->timeout_id = 0;
- }
- if (text->timer) {
- g_timer_stop(text->timer);
- g_timer_destroy(text->timer);
- text->timer = NULL;
- }
- }
- if ( text->line_wrap )
- text->needs_split_into_lines = 1;
- else
- text->needs_calc_line_widths = 1;
- e_canvas_item_request_reflow (GNOME_CANVAS_ITEM(text));
- }
- return_val = 0;
- break;
- case GDK_KEY_PRESS: /* Fall Through */
- case GDK_KEY_RELEASE:
- if (text->editing) {
- GdkEventKey key = event->key;
- e_tep_event.key.time = key.time;
- e_tep_event.key.state = key.state;
- e_tep_event.key.keyval = key.keyval;
- e_tep_event.key.length = key.length;
- e_tep_event.key.string = key.string;
- _get_tep(text);
- return e_text_event_processor_handle_event (text->tep,
- &e_tep_event);
- }
- else
- return 0;
- break;
- case GDK_BUTTON_PRESS: /* Fall Through */
- case GDK_BUTTON_RELEASE:
- if (text->tooltip_timeout) {
- gtk_timeout_remove (text->tooltip_timeout);
- text->tooltip_timeout = 0;
- }
- if (text->tooltip_window) {
- gtk_widget_destroy (text->tooltip_window);
- text->tooltip_window = NULL;
- }
-#if 0
- if ((!text->editing)
- && text->editable
- && event->type == GDK_BUTTON_RELEASE
- && event->button.button == 1) {
- GdkEventButton button = event->button;
-
- e_canvas_item_grab_focus (item);
-
- e_tep_event.type = GDK_BUTTON_RELEASE;
- e_tep_event.button.time = button.time;
- e_tep_event.button.state = button.state;
- e_tep_event.button.button = button.button;
- e_tep_event.button.position = _get_position_from_xy(text, button.x, button.y);
- _get_tep(text);
- return_val = e_text_event_processor_handle_event (text->tep,
- &e_tep_event);
- e_tep_event.type = GDK_BUTTON_RELEASE;
- }
-#else
- if ((!text->editing)
- && text->editable
- && (event->button.button == 1 ||
- event->button.button == 2)) {
- e_canvas_item_grab_focus (item);
- }
-#endif
- /* Create our own double and triple click events,
- as gnome-canvas doesn't forward them to us */
- if (event->type == GDK_BUTTON_PRESS) {
- if (text->dbl_timeout == 0 &&
- text->tpl_timeout == 0) {
- text->dbl_timeout = gtk_timeout_add (200,
- _click,
- &(text->dbl_timeout));
- } else {
- if (text->tpl_timeout == 0) {
- e_tep_event.type = GDK_2BUTTON_PRESS;
- text->tpl_timeout = gtk_timeout_add (200, _click, &(text->tpl_timeout));
- } else {
- e_tep_event.type = GDK_3BUTTON_PRESS;
- }
- }
- }
-
- if (text->editing) {
- GdkEventButton button = event->button;
- e_tep_event.button.time = button.time;
- e_tep_event.button.state = button.state;
- e_tep_event.button.button = button.button;
- e_tep_event.button.position = _get_position_from_xy(text, button.x, button.y);
- _get_tep(text);
- return_val = e_text_event_processor_handle_event (text->tep,
- &e_tep_event);
- if (event->button.button == 1) {
- if (event->type == GDK_BUTTON_PRESS)
- text->button_down = TRUE;
- else
- text->button_down = FALSE;
- }
- text->lastx = button.x;
- text->lasty = button.y;
- text->last_state = button.state;
- }
- break;
- case GDK_MOTION_NOTIFY:
- if (text->editing) {
- GdkEventMotion motion = event->motion;
- e_tep_event.motion.time = motion.time;
- e_tep_event.motion.state = motion.state;
- e_tep_event.motion.position = _get_position_from_xy(text, motion.x, motion.y);
- _get_tep(text);
- return_val = e_text_event_processor_handle_event (text->tep,
- &e_tep_event);
- text->lastx = motion.x;
- text->lasty = motion.y;
- text->last_state = motion.state;
- }
- break;
- case GDK_ENTER_NOTIFY:
- {
- GdkEventCrossing *crossing = (GdkEventCrossing *) event;
- double x1, y1, x2, y2;
- get_bounds (text, &x1, &y1, &x2, &y2);
- if (crossing->x >= x1 &&
- crossing->y >= y1 &&
- crossing->x <= x2 &&
- crossing->y <= y2) {
- if ( text->tooltip_count == 0 && text->clip) {
- if (!text->tooltip_timeout)
- text->tooltip_timeout = gtk_timeout_add (1000, _do_tooltip, text);
- }
- text->tooltip_count ++;
- }
- }
-
- text->pointer_in = TRUE;
- if (text->editing || text->draw_borders) {
- if ( text->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor);
- text->default_cursor_shown = FALSE;
- }
- }
- break;
- case GDK_LEAVE_NOTIFY:
- if (text->tooltip_count > 0)
- text->tooltip_count --;
- if ( text->tooltip_count == 0 && text->clip) {
- if ( text->tooltip_timeout ) {
- gtk_timeout_remove (text->tooltip_timeout);
- text->tooltip_timeout = 0;
- }
- }
-
- text->pointer_in = FALSE;
- if (text->editing || text->draw_borders) {
- if ( ! text->default_cursor_shown ) {
- gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor);
- text->default_cursor_shown = TRUE;
- }
- }
- break;
- default:
- break;
- }
- if (return_val)
- return return_val;
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS(parent_class)->event(item, event);
- else
- return 0;
-}
-
-/* fixme: */
-
-static int
-_get_position(EText *text, ETextEventProcessorCommand *command)
-{
- int i;
- int length;
- int x, y;
- unicode_char_t unival;
- char *p;
-
- switch (command->position) {
-
- case E_TEP_VALUE:
- return command->value;
-
- case E_TEP_SELECTION:
- return text->selection_end;
-
- case E_TEP_START_OF_BUFFER:
- return 0;
- case E_TEP_END_OF_BUFFER:
- return unicode_strlen (text->text, -1);
-
- case E_TEP_START_OF_LINE:
- for (i = text->selection_end - 2; i > 0; i--) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unival == '\n') {
- i++;
- break;
- }
- }
- return i;
- case E_TEP_END_OF_LINE:
- length = unicode_strlen(text->text, -1);
- for (i = text->selection_end + 1; i < length; i++) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unival == '\n') {
- break;
- }
- }
- if (i > length)
- i = length;
- return i;
-
- case E_TEP_FORWARD_CHARACTER:
- length = unicode_strlen (text->text, -1);
- i = text->selection_end + 1;
- if (i > length)
- i = length;
- return i;
- case E_TEP_BACKWARD_CHARACTER:
- i = text->selection_end - 1;
- if (i < 0)
- i = 0;
- return i;
-
- case E_TEP_FORWARD_WORD:
- length = unicode_strlen (text->text, -1);
- for (i = text->selection_end + 1; i < length; i++) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) {
- break;
- }
- }
- if (i > length)
- i = length;
- return i;
- case E_TEP_BACKWARD_WORD:
- for (i = text->selection_end - 2; i > 0; i--) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) {
- i++;
- break;
- }
- }
- if (i < 0)
- i = 0;
- return i;
-
- case E_TEP_FORWARD_LINE:
- _get_xy_from_position(text, text->selection_end, &x, &y);
- y += e_font_height (text->font);
- return _get_position_from_xy(text, x, y);
- case E_TEP_BACKWARD_LINE:
- _get_xy_from_position(text, text->selection_end, &x, &y);
- y -= e_font_height (text->font);
- return _get_position_from_xy(text, x, y);
-
- case E_TEP_SELECT_WORD:
- for (i = text->selection_end - 2; i > 0; i--) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) {
- i++;
- break;
- }
- }
- if (i < 0)
- text->selection_start = 0;
- else
- text->selection_start = i;
-
- length = unicode_strlen (text->text, -1);
- for (i = text->selection_end + 1; i < length; i++) {
- p = text->text + unicode_offset_to_index (text->text, i);
- unicode_get_utf8 (p, &unival);
- if (unicode_isspace (unival)) {
- break;
- }
- }
- if (i > length)
- i = length;
- return i;
-
- case E_TEP_SELECT_ALL:
- text->selection_start = 0;
- length = unicode_strlen (text->text, -1);
- return length;
-
- case E_TEP_FORWARD_PARAGRAPH:
- case E_TEP_BACKWARD_PARAGRAPH:
-
- case E_TEP_FORWARD_PAGE:
- case E_TEP_BACKWARD_PAGE:
- return text->selection_end;
- default:
- return text->selection_end;
- }
-}
-
-static void
-_delete_selection(EText *text)
-{
- if ( text->selection_start < text->selection_end ) {
- e_text_model_delete(text->model, text->selection_start, text->selection_end - text->selection_start);
- text->selection_end = text->selection_start;
- } else {
- e_text_model_delete(text->model, text->selection_end, text->selection_start - text->selection_end);
- text->selection_start = text->selection_end;
- }
-}
-
-static void
-_insert(EText *text, char *string, int value)
-{
- if (value > 0) {
- e_text_model_insert_length(text->model, text->selection_start, string, value);
-
- text->selection_start += value;
- text->selection_end = text->selection_start;
- }
-}
-
-static void
-e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gpointer data)
-{
- EText *text = E_TEXT(data);
- int sel_start, sel_end;
- switch (command->action) {
- case E_TEP_MOVE:
- text->selection_start = _get_position(text, command);
- text->selection_end = text->selection_start;
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_SELECT:
- text->selection_end = _get_position(text, command);
- sel_start = MIN(text->selection_start, text->selection_end);
- sel_end = MAX(text->selection_start, text->selection_end);
- if (sel_start != sel_end) {
- e_text_supply_selection (text, command->time, GDK_SELECTION_PRIMARY,
- text->text + unicode_offset_to_index (text->text, sel_start), sel_end - sel_start);
- } else if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_DELETE:
- if (text->selection_end == text->selection_start) {
- text->selection_end = _get_position(text, command);
- }
- _delete_selection(text);
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
-
- case E_TEP_INSERT:
- if (text->selection_end != text->selection_start) {
- _delete_selection(text);
- }
- _insert(text, command->string, command->value);
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_COPY:
- sel_start = MIN(text->selection_start, text->selection_end);
- sel_end = MAX(text->selection_start, text->selection_end);
- if (sel_start != sel_end) {
- e_text_supply_selection (text, command->time, clipboard_atom,
- text->text + unicode_offset_to_index (text->text, sel_start), sel_end - sel_start);
- }
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_PASTE:
- e_text_get_selection (text, clipboard_atom, command->time);
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_GET_SELECTION:
- e_text_get_selection (text, GDK_SELECTION_PRIMARY, command->time);
- break;
- case E_TEP_ACTIVATE:
- gtk_signal_emit (GTK_OBJECT (text), e_text_signals[E_TEXT_ACTIVATE]);
- if (text->timer) {
- g_timer_reset(text->timer);
- }
- break;
- case E_TEP_SET_SELECT_BY_WORD:
- text->select_by_word = command->value;
- break;
- case E_TEP_GRAB:
- gnome_canvas_item_grab (GNOME_CANVAS_ITEM(text),
- GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
- text->i_cursor,
- command->time);
- break;
- case E_TEP_UNGRAB:
- gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM(text), command->time);
- break;
- case E_TEP_NOP:
- break;
- }
-
- if (!text->button_down) {
- int x;
- int i;
- struct line *lines = text->lines;
- gdouble clip_width;
- if ( !lines )
- return;
-
- for (lines = text->lines, i = 0; i < text->num_lines ; i++, lines ++) {
- if (unicode_index_to_offset (text->text, lines->text - text->text) > text->selection_end) {
- break;
- }
- }
- lines --;
- i --;
- x = e_font_utf8_text_width(text->font, E_FONT_PLAIN,
- lines->text,
- text->selection_end - unicode_index_to_offset (text->text, lines->text - text->text));
-
-
- if (x < text->xofs_edit) {
- text->xofs_edit = x;
- }
-
- clip_width = text->clip_width;
- if (clip_width >= 0 && text->draw_borders) {
- clip_width -= 6;
- if (clip_width < 0)
- clip_width = 0;
- }
-
- if (2 + x - clip_width > text->xofs_edit) {
- text->xofs_edit = 2 + x - clip_width;
- }
-
- if (e_font_height (text->font) * i < text->yofs_edit)
- text->yofs_edit = e_font_height (text->font) * i;
-
- if (e_font_height (text->font) * (i + 1) - (text->clip_height != -1 ? text->clip_height : text->height) > text->yofs_edit)
- text->yofs_edit = e_font_height (text->font) * (i + 1) - (text->clip_height != -1 ? text->clip_height : text->height);
- }
-
- text->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
-}
-
-static void _invisible_destroy (GtkInvisible *invisible,
- EText *text)
-{
- text->invisible = NULL;
-}
-
-static GtkWidget *e_text_get_invisible(EText *text)
-{
- GtkWidget *invisible;
- if (text->invisible) {
- invisible = text->invisible;
- } else {
- invisible = gtk_invisible_new();
- text->invisible = invisible;
-
- gtk_selection_add_target (invisible,
- GDK_SELECTION_PRIMARY,
- GDK_SELECTION_TYPE_STRING,
- E_SELECTION_PRIMARY);
- gtk_selection_add_target (invisible,
- clipboard_atom,
- GDK_SELECTION_TYPE_STRING,
- E_SELECTION_CLIPBOARD);
-
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_get",
- GTK_SIGNAL_FUNC (_selection_get),
- text);
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_clear_event",
- GTK_SIGNAL_FUNC (_selection_clear_event),
- text);
- gtk_signal_connect (GTK_OBJECT(invisible), "selection_received",
- GTK_SIGNAL_FUNC (_selection_received),
- text);
-
- gtk_signal_connect (GTK_OBJECT(invisible), "destroy",
- GTK_SIGNAL_FUNC (_invisible_destroy),
- text);
- }
- return invisible;
-}
-
-static void
-_selection_clear_event (GtkInvisible *invisible,
- GdkEventSelection *event,
- EText *text)
-{
- if (event->selection == GDK_SELECTION_PRIMARY) {
- g_free (text->primary_selection);
- text->primary_selection = NULL;
- text->primary_length = 0;
-
- text->has_selection = FALSE;
- text->needs_redraw = 1;
- gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
-
- } else if (event->selection == clipboard_atom) {
- g_free (text->clipboard_selection);
- text->clipboard_selection = NULL;
- text->clipboard_length = 0;
- }
-}
-
-static void
-_selection_get (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint info,
- guint time_stamp,
- EText *text)
-{
- switch (info) {
- case E_SELECTION_PRIMARY:
- gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
- 8, text->primary_selection, text->primary_length);
- break;
- case E_SELECTION_CLIPBOARD:
- gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
- 8, text->clipboard_selection, text->clipboard_length);
- break;
- }
-}
-
-static void
-_selection_received (GtkInvisible *invisible,
- GtkSelectionData *selection_data,
- guint time,
- EText *text)
-{
- if (selection_data->length < 0 || selection_data->type != GDK_SELECTION_TYPE_STRING) {
- return;
- } else {
- ETextEventProcessorCommand command;
- command.action = E_TEP_INSERT;
- command.position = E_TEP_SELECTION;
- command.string = selection_data->data;
- command.value = selection_data->length;
- command.time = time;
- e_text_command(text->tep, &command, text);
- }
-}
-
-static void e_text_supply_selection (EText *text, guint time, GdkAtom selection, guchar *data, gint length)
-{
- gboolean successful;
- GtkWidget *invisible;
-
- invisible = e_text_get_invisible(text);
-
- if (selection == GDK_SELECTION_PRIMARY ) {
- if (text->primary_selection) {
- g_free (text->primary_selection);
- }
- text->primary_selection = g_strndup(data, length);
- text->primary_length = length;
- } else if (selection == clipboard_atom) {
- if (text->clipboard_selection) {
- g_free (text->clipboard_selection);
- }
- text->clipboard_selection = g_strndup(data, length);
- text->clipboard_length = length;
- }
-
- successful = gtk_selection_owner_set (invisible,
- selection,
- time);
-
- if (selection == GDK_SELECTION_PRIMARY)
- text->has_selection = successful;
-}
-
-static void
-e_text_get_selection(EText *text, GdkAtom selection, guint32 time)
-{
- GtkWidget *invisible;
- invisible = e_text_get_invisible(text);
- gtk_selection_convert(invisible,
- selection,
- GDK_SELECTION_TYPE_STRING,
- time);
-}
-
-#if 0
-static void
-e_text_real_copy_clipboard (EText *text)
-{
- guint32 time;
- gint selection_start_pos;
- gint selection_end_pos;
-
- g_return_if_fail (text != NULL);
- g_return_if_fail (E_IS_TEXT (text));
-
- time = gtk_text_get_event_time (text);
- selection_start_pos = MIN (text->selection_start, text->selection_end);
- selection_end_pos = MAX (text->selection_start, text->selection_end);
-
- if (selection_start_pos != selection_end_pos)
- {
- if (gtk_selection_owner_set (GTK_WIDGET (text->canvas),
- clipboard_atom,
- time))
- text->clipboard_text = "";
- }
-}
-
-static void
-e_text_real_paste_clipboard (EText *text)
-{
- guint32 time;
-
- g_return_if_fail (text != NULL);
- g_return_if_fail (E_IS_TEXT (text));
-
- time = e_text_get_event_time (text);
- if (text->editable)
- gtk_selection_convert (GTK_WIDGET(text->widget),
- clipboard_atom,
- gdk_atom_intern ("COMPOUND_TEXT", FALSE), time);
-}
-#endif
-
-
-#if 0
-/* Routines for sucking fonts from the X server */
-
-static ETextSuckFont *
-e_suck_font (GdkFont *font)
-{
- ETextSuckFont *suckfont;
- int i;
- int x, y;
- char text[1];
- int lbearing, rbearing, ch_width, ascent, descent;
- GdkPixmap *pixmap;
- GdkColor black, white;
- GdkImage *image;
- GdkGC *gc;
- guchar *line;
- int width, height;
- int black_pixel, pixel;
-
- if (!font)
- return NULL;
-
- suckfont = g_new (ETextSuckFont, 1);
-
- height = font->ascent + font->descent;
- x = 0;
- for (i = 0; i < 256; i++) {
- text[0] = i;
- gdk_text_extents (font, text, 1,
- &lbearing, &rbearing, &ch_width, &ascent, &descent);
- suckfont->chars[i].left_sb = lbearing;
- suckfont->chars[i].right_sb = ch_width - rbearing;
- suckfont->chars[i].width = rbearing - lbearing;
- suckfont->chars[i].ascent = ascent;
- suckfont->chars[i].descent = descent;
- suckfont->chars[i].bitmap_offset = x;
- x += (ch_width + 31) & -32;
- }
-
- width = x;
-
- suckfont->bitmap_width = width;
- suckfont->bitmap_height = height;
- suckfont->ascent = font->ascent;
-
- pixmap = gdk_pixmap_new (NULL, suckfont->bitmap_width,
- suckfont->bitmap_height, 1);
- gc = gdk_gc_new (pixmap);
- gdk_gc_set_font (gc, font);
-
- black_pixel = BlackPixel (gdk_display, DefaultScreen (gdk_display));
- black.pixel = black_pixel;
- white.pixel = WhitePixel (gdk_display, DefaultScreen (gdk_display));
- gdk_gc_set_foreground (gc, &white);
- gdk_draw_rectangle (pixmap, gc, 1, 0, 0, width, height);
-
- gdk_gc_set_foreground (gc, &black);
- for (i = 0; i < 256; i++) {
- text[0] = i;
- gdk_draw_text (pixmap, font, gc,
- suckfont->chars[i].bitmap_offset - suckfont->chars[i].left_sb,
- font->ascent,
- text, 1);
- }
-
- /* The handling of the image leaves me with distinct unease. But this
- * is more or less copied out of gimp/app/text_tool.c, so it _ought_ to
- * work. -RLL
- */
-
- image = gdk_image_get (pixmap, 0, 0, width, height);
- suckfont->bitmap = g_malloc0 ((width >> 3) * height);
-
- line = suckfont->bitmap;
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- pixel = gdk_image_get_pixel (image, x, y);
- if (pixel == black_pixel)
- line[x >> 3] |= 128 >> (x & 7);
- }
- line += width >> 3;
- }
-
- gdk_image_destroy (image);
-
- /* free the pixmap */
- gdk_pixmap_unref (pixmap);
-
- /* free the gc */
- gdk_gc_destroy (gc);
-
- return suckfont;
-}
-
-static void
-e_suck_font_free (ETextSuckFont *suckfont)
-{
- g_free (suckfont->bitmap);
- g_free (suckfont);
-}
-#endif
-
-
-
-
-
-
-
diff --git a/widgets/text/e-text.h b/widgets/text/e-text.h
deleted file mode 100644
index 9d992fb58b..0000000000
--- a/widgets/text/e-text.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* EText - Text item for evolution.
- * Copyright (C) 2000 Helix Code, Inc.
- *
- * Author: Chris Lahey <clahey@umich.edu>
- *
- * A majority of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx> */
-
-#ifndef E_TEXT_H
-#define E_TEXT_H
-
-#include <gnome.h>
-#include "e-util/e-font.h"
-#include "e-text-event-processor.h"
-#include "e-text-model.h"
-
-
-BEGIN_GNOME_DECLS
-
-
-/* Text item for the canvas. Text items are positioned by an anchor point and an anchor direction.
- *
- * A clipping rectangle may be specified for the text. The rectangle is anchored at the text's anchor
- * point, and is specified by clipping width and height parameters. If the clipping rectangle is
- * enabled, it will clip the text.
- *
- * In addition, x and y offset values may be specified. These specify an offset from the anchor
- * position. If used in conjunction with the clipping rectangle, these could be used to implement
- * simple scrolling of the text within the clipping rectangle.
- *
- * The following object arguments are available:
- *
- * name type read/write description
- * ------------------------------------------------------------------------------------------
- * text string RW The string of the text label
- * font string W X logical font descriptor
- * fontset string W X logical fontset descriptor
- * font_gdk GdkFont* RW Pointer to a GdkFont
- * anchor GtkAnchorType RW Anchor side for the text
- * justification GtkJustification RW Justification for multiline text
- * fill_color string W X color specification for text
- * fill_color_gdk GdkColor* RW Pointer to an allocated GdkColor
- * fill_stipple GdkBitmap* RW Stipple pattern for filling the text
- * clip_width double RW Width of clip rectangle
- * clip_height double RW Height of clip rectangle
- * clip boolean RW Use clipping rectangle?
- * fill_clip_rect boolean RW Whether the text item represents itself as being the size of the clipping rectangle.
- * x_offset double RW Horizontal offset distance from anchor position
- * y_offset double RW Vertical offset distance from anchor position
- * text_width double R Used to query the width of the rendered text
- * text_height double R Used to query the rendered height of the text
- * width double RW A synonym for clip_width
- * height double R A synonym for text_height
- *
- * These are currently ignored in the AA version:
- * editable boolean RW Can this item be edited
- * use_ellipsis boolean RW Whether to use ellipsises if text gets cut off. Meaningless if clip == false.
- * ellipsis string RW The characters to use as ellipsis. NULL = "...".
- * line_wrap boolean RW Line wrap when not editing.
- * break_characters string RW List of characters to optionally break on.
- * max_lines int RW Number of lines possible when doing line wrap.
- * draw_borders boolean RW Whether to draw borders.
- */
-
-#define E_TYPE_TEXT (e_text_get_type ())
-#define E_TEXT(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TEXT, EText))
-#define E_TEXT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TEXT, ETextClass))
-#define E_IS_TEXT(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TEXT))
-#define E_IS_TEXT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_TEXT))
-
-
-typedef struct _EText EText;
-typedef struct _ETextClass ETextClass;
-
-#if 0
-typedef struct _ETextSuckFont ETextSuckFont;
-typedef struct _ETextSuckChar ETextSuckChar;
-
-struct _ETextSuckChar {
- int left_sb;
- int right_sb;
- int width;
- int ascent;
- int descent;
- int bitmap_offset; /* in pixels */
-};
-
-struct _ETextSuckFont {
- guchar *bitmap;
- gint bitmap_width;
- gint bitmap_height;
- gint ascent;
- ETextSuckChar chars[256];
-};
-#endif
-
-struct _EText {
- GnomeCanvasItem item;
-
- ETextModel *model;
- gint model_changed_signal_id;
-
- char *text; /* Text to display */
- gpointer lines; /* Text split into lines (private field) */
- int num_lines; /* Number of lines of text */
-
-#if 0
- GdkFont *font; /* Font for text */
-#else
- EFont *font;
-#endif
- GtkAnchorType anchor; /* Anchor side for text */
- GtkJustification justification; /* Justification for text */
-
- double clip_width; /* Width of optional clip rectangle */
- double clip_height; /* Height of optional clip rectangle */
-
- double xofs, yofs; /* Text offset distance from anchor position */
-
- gulong pixel; /* Fill color */
- GdkBitmap *stipple; /* Stipple for text */
- GdkGC *gc; /* GC for drawing text */
-
- int cx, cy; /* Top-left canvas coordinates for text */
- int clip_cx, clip_cy; /* Top-left canvas coordinates for clip rectangle */
- int clip_cwidth, clip_cheight; /* Size of clip rectangle in pixels */
- int max_width; /* Maximum width of text lines */
- int width; /* Rendered text width in pixels */
- int height; /* Rendered text height in pixels */
-
- guint clip : 1; /* Use clip rectangle? */
- guint fill_clip_rectangle : 1; /* Fill the clipping rectangle. */
-
- /* Antialiased specific stuff follows */
-#if 0
- ETextSuckFont *suckfont; /* Sucked font */
-#endif
- guint32 rgba; /* RGBA color for text */
- double affine[6]; /* The item -> canvas affine */
-
- char *ellipsis; /* The ellipsis characters. NULL = "...". */
- double ellipsis_width; /* The width of the ellipsis. */
- gboolean use_ellipsis; /* Whether to use the ellipsis. */
-
- gboolean editable; /* Item is editable */
- gboolean editing; /* Item is currently being edited */
-
- int xofs_edit; /* Offset because of editing */
- int yofs_edit; /* Offset because of editing */
-
- /* This needs to be reworked a bit once we get line wrapping. */
- int selection_start; /* Start of selection */
- int selection_end; /* End of selection */
- gboolean select_by_word; /* Current selection is by word */
-
- /* This section is for drag scrolling and blinking cursor. */
- gint timeout_id; /* Current timeout id for scrolling */
- GTimer *timer; /* Timer for blinking cursor and scrolling */
-
- gint lastx, lasty; /* Last x and y motion events */
- gint last_state; /* Last state */
- gulong scroll_start; /* Starting time for scroll (microseconds) */
-
- gint show_cursor; /* Is cursor currently shown */
- gboolean button_down; /* Is mouse button 1 down */
-
- ETextEventProcessor *tep; /* Text Event Processor */
- gint tep_command_id;
-
- GtkWidget *invisible; /* For selection handling */
- gboolean has_selection; /* TRUE if we have the selection */
- gchar *primary_selection; /* Primary selection text */
- gint primary_length; /* Primary selection text length */
- gchar *clipboard_selection; /* Clipboard selection text */
- gint clipboard_length; /* Clipboard selection text length*/
-
- guint pointer_in : 1; /* Is the pointer currently over us? */
- guint default_cursor_shown : 1; /* Is the default cursor currently shown? */
- guint draw_borders : 1; /* Draw borders? */
-
- guint line_wrap : 1; /* Do line wrap */
- gchar *break_characters; /* Characters to optionally break after */
-
- gint max_lines; /* Max number of lines (-1 = infinite) */
-
- GdkCursor *default_cursor; /* Default cursor (arrow) */
- GdkCursor *i_cursor; /* I beam cursor */
-
- gint tooltip_timeout; /* Timeout for the tooltip */
- GtkWidget *tooltip_window; /* GtkWindow for displaying the tooltip */
- gint tooltip_count; /* GDK_ENTER_NOTIFY count. */
-
- guint needs_redraw : 1; /* Needs redraw */
- guint needs_recalc_bounds : 1; /* Need recalc_bounds */
- guint needs_calc_height : 1; /* Need calc_height */
- guint needs_calc_line_widths : 1; /* Needs calc_line_widths */
- guint needs_split_into_lines : 1; /* Needs split_into_lines */
-
- gint dbl_timeout; /* Double click timeout */
- gint tpl_timeout; /* Triple click timeout */
-};
-
-struct _ETextClass {
- GnomeCanvasItemClass parent_class;
-
- void (* changed) (EText *text);
- void (* activate) (EText *text);
-};
-
-
-/* Standard Gtk function */
-GtkType e_text_get_type (void);
-
-
-END_GNOME_DECLS
-
-#endif
diff --git a/wombat/.cvsignore b/wombat/.cvsignore
deleted file mode 100644
index 20aad5449c..0000000000
--- a/wombat/.cvsignore
+++ /dev/null
@@ -1,13 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-wombat-stubs.c
-wombat-skels.c
-wombat-common.c
-wombat.h
-wombat
-wombat.pure
diff --git a/wombat/ChangeLog b/wombat/ChangeLog
deleted file mode 100644
index 636cd8d044..0000000000
--- a/wombat/ChangeLog
+++ /dev/null
@@ -1,106 +0,0 @@
-2000-08-02 Federico Mena Quintero <federico@helixcode.com>
-
- * wombat.c (setup_pcs): Register the iCalendar file backend instad
- of the old IMC backend.
-
-2000-05-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (INCLUDES): GNOME includes should come last, so that
- we are sure we pick our own includes instead of the installed
- ones, if any.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added an include for the pcs directory.
-
-2000-05-08 Federico Mena Quintero <federico@helixcode.com>
-
- * wombat.c (setup_pcs): Register the "file" method with the IMC
- backend.
-
-2000-05-05 Chris Toshok <toshok@helixcode.com>
- * .cvsignore: ignore wombat.pure
-
- * Makefile.am: add support for building wombat.pure
-
-2000-05-01 Federico Mena Quintero <federico@helixcode.com>
-
- * wombat.c (main): Doh, also unref the pas_book_factory when we
- are done.
-
-2000-04-30 Federico Mena Quintero <federico@helixcode.com>
-
- * wombat.c (setup_pas): Connect to the "last_book_gone" signal of
- the book factory.
- (last_book_gone_cb): Handle the "last_book_gone" signal.
- (termination_handler): Check if the book factory has zero running
- backends.
-
-2000-04-30 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added ename libs to LDADD.
-
-2000-04-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * wombat.c
- (register_pcs): New function for registering into the name
- service. Varies according on whether we are `USING_OAF' or not.
- (init_corba): New function for initializing the CORBA stuff.
- Implementation depends on `USING_OAF'.
- (init_bonobo): Use `init_corba'.
-
- * Makefile.am: Updated for OAF.
-
-2000-04-25 Federico Mena Quintero <federico@helixcode.com>
-
- * wombat.c (cal_factory pas_book_factory): New module-wide
- variables for the PAS and PCS factories.
- (setup_pcs): Connect to the "last_calendar_gone" signal of the
- calendar factory.
- (last_calendar_gone_cb): Queue a termination job.
- (queue_termination): Function to queue a termination job. We have
- to use a timeout to reduce the probability of running into GOAD's
- race condition with factories.
- (termination_handler): Check that the PCS and the PAS have zero
- backends. If so, exit the main loop.
- (setup_vfs): Use EXIT_FAILURE instead of 1.
- (init_bonobo): Likewise.
- (main): Destroy the factories and exit Wombat. Wheee!
-
-2000-04-16 Federico Mena Quintero <federico@helixcode.com>
-
- * Makefile.am (INCLUDES): Removed spurious calendar directories
- from the include path. Added "wombat" log domain for glib.
- (wombat_LDADD): Link libpcs.a instead of the old shared library.
-
- * wombat.c: cal-factory.h is an internal include file. * wombat.c
- (setup_pcs): We should NOT share a CORBA_environment across all
- functions! Use our own CORBA_environment.
- (init_bonobo): Use our own CORBA_environment. Free the exception
- after initializing GOAD, and present some error messages if
- necessary. (Should g_message()s for exceptional situations be
- marked for translation?).
-
-2000-04-15 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (INCLUDES): Added
- `-I$(top_builddir)/addressbook/backend/pas', and
- `-I$(top_builddir)/calendar/pcs' because that's where the
- IDL-generated files go.
-
-2000-04-14 Chris Toshok <toshok@helixcode.com>
-
- * Makefile.am (wombat_LDADD): use BONOBO_VFS_GNOME_LIBS instead of
- BONOBO_HTML_GNOME_LIBS. fixes freebsd's problem running wombat.
-
-2000-04-14 Federico Mena Quintero <federico@helixcode.com>
-
- * wombat.c (setup_pcs): Must pass "object" for the kind to
- goad_server_register(); "server" is meaningless.
- (setup_pcs): Do not free the CORBA environment more than once.
- Also, fix error messages.
-
- * wombat.gnorba: The GOAD ID is "evolution:calendar-factory", not
- "evolution:calendar-server".
-
- * ChangeLog: Started the ChangeLog for Wombat.
diff --git a/wombat/GNOME_Evolution_Wombat.oaf.in b/wombat/GNOME_Evolution_Wombat.oaf.in
deleted file mode 100644
index 1109cc0df6..0000000000
--- a/wombat/GNOME_Evolution_Wombat.oaf.in
+++ /dev/null
@@ -1,30 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:evolution:addressbook-server:0fbc844d-c721-4615-98d0-d67eacf42d80"
- type="exe"
- location="wombat">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/BookFactory:1.0"/>
- <item value="IDL:Bonobo/Unknown:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="The Personal Addressbook Server"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution:calendar-factory:1c915858-ece3-4a6f-9d81-ea0f108a9554"
- type="exe"
- location="wombat">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/Calendar/CalFactory:1.0"/>
- <item value="IDL:Bonobo/Unknown:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="The Personal Calendar Server; calendar factory"/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/wombat/GNOME_Evolution_Wombat.oafinfo b/wombat/GNOME_Evolution_Wombat.oafinfo
deleted file mode 100644
index 1109cc0df6..0000000000
--- a/wombat/GNOME_Evolution_Wombat.oafinfo
+++ /dev/null
@@ -1,30 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:evolution:addressbook-server:0fbc844d-c721-4615-98d0-d67eacf42d80"
- type="exe"
- location="wombat">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/BookFactory:1.0"/>
- <item value="IDL:Bonobo/Unknown:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="The Personal Addressbook Server"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution:calendar-factory:1c915858-ece3-4a6f-9d81-ea0f108a9554"
- type="exe"
- location="wombat">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/Calendar/CalFactory:1.0"/>
- <item value="IDL:Bonobo/Unknown:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="The Personal Calendar Server; calendar factory"/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/wombat/Makefile.am b/wombat/Makefile.am
deleted file mode 100644
index 900c6283c0..0000000000
--- a/wombat/Makefile.am
+++ /dev/null
@@ -1,57 +0,0 @@
-INCLUDES = \
- -DG_LOG_DOMAIN=\"wombat\" \
- -I$(top_srcdir)/e-util \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir)/calendar/pcs \
- $(GNOME_INCLUDEDIR) \
- $(BONOBO_VFS_GNOME_CFLAGS) \
- -DEVOLUTION_VERSION=\""$(VERSION)"\" \
- -DEVOLUTION_LOCALEDIR=\""$(datadir)/locale"\"
-
-bin_PROGRAMS = \
- wombat
-
-wombat_SOURCES = \
- wombat.c
-
-wombat_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(top_builddir)/addressbook/backend/pas/libpas.a \
- $(top_builddir)/addressbook/backend/ebook/libebook.la \
- $(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/calendar/pcs/libpcs.a \
- $(top_builddir)/libical/src/libical/libical.a \
- $(top_builddir)/calendar/cal-util/libcal-util.la \
- $(top_builddir)/libversit/libversit.la \
- $(top_builddir)/e-util/libeutil.la \
- $(LDAP_LIBS)
-
-wombat_LDFLAGS = `gnome-config --libs gnorba`
-
-if USING_OAF
-oafdir = $(datadir)/oaf
-oaf_DATA = wombat.oafinfo
-else
-gnorbadir = $(sysconfdir)/CORBA/servers
-gnorba_DATA = wombat.gnorba
-endif
-
-EXTRA_DIST = \
- wombat.gnorba \
- wombat.oafinfo
-
-if ENABLE_PURIFY
-PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-
-all-local: wombat.pure
-
-wombat.pure: wombat
- @rm -f wombat.pure
- $(PLINK) $(wombat_LDFLAGS) $(wombat_OBJECTS) $(wombat_LDADD) $(LIBS)
-
-endif
-
diff --git a/wombat/wombat.c b/wombat/wombat.c
deleted file mode 100644
index d8a6da6271..0000000000
--- a/wombat/wombat.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/* Wombat personal information server - main file
- *
- * Author: Nat Friedman <nat@helixcode.com>
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-#include <config.h>
-#include <bonobo.h>
-#include <pas/pas-book-factory.h>
-#include <pas/pas-backend-file.h>
-#include <libgnomevfs/gnome-vfs-init.h>
-
-#ifdef HAVE_LDAP
-#include <pas/pas-backend-ldap.h>
-#endif
-
-#include "calendar/pcs/cal-factory.h"
-#include "calendar/pcs/cal-backend-file.h"
-
-/* The and addressbook calendar factories */
-
-static CalFactory *cal_factory;
-static PASBookFactory *pas_book_factory;
-
-/* Timeout interval in milliseconds for termination */
-#define EXIT_TIMEOUT 5000
-
-/* Timeout ID for termination handler */
-static guint termination_handler_id;
-
-
-
-/* Termination */
-
-/* Termination handler. Checks if both factories have zero running backends,
- * and if so terminates the program.
- */
-static gboolean
-termination_handler (gpointer data)
-{
- if (cal_factory_get_n_backends (cal_factory) == 0
- && pas_book_factory_get_n_backends (pas_book_factory) == 0) {
- fprintf (stderr, "termination_handler(): Terminating the Wombat. Have a nice day.\n");
- gtk_main_quit ();
- }
-
- termination_handler_id = 0;
- return FALSE;
-}
-
-/* Queues a timeout for handling termination of Wombat */
-static void
-queue_termination (void)
-{
- if (termination_handler_id)
- return;
-
- termination_handler_id = g_timeout_add (EXIT_TIMEOUT, termination_handler, NULL);
-}
-
-
-
-static void
-last_book_gone_cb (PASBookFactory *factory, gpointer data)
-{
- queue_termination ();
-}
-
-static void
-setup_pas (int argc, char **argv)
-{
- pas_book_factory = pas_book_factory_new ();
-
- pas_book_factory_register_backend (
- pas_book_factory, "file", pas_backend_file_new);
-
-#ifdef HAVE_LDAP
- pas_book_factory_register_backend (
- pas_book_factory, "ldap", pas_backend_ldap_new);
-#endif
-
- gtk_signal_connect (GTK_OBJECT (pas_book_factory),
- "last_book_gone",
- GTK_SIGNAL_FUNC (last_book_gone_cb),
- NULL);
-
- pas_book_factory_activate (pas_book_factory);
-}
-
-
-
-/* Personal calendar server */
-
-/* Callback used when the calendar factory has no more running backends */
-static void
-last_calendar_gone_cb (CalFactory *factory, gpointer data)
-{
- fprintf (stderr, "last_calendar_gone_cb() called! Queueing termination...\n");
- queue_termination ();
-}
-
-#ifdef USING_OAF
-
-/* (For the OAF popt stuff, which otherwise does not get in.) */
-#include <gnome.h>
-
-#include <liboaf/liboaf.h>
-
-static gboolean
-register_pcs (CORBA_Object obj)
-{
- OAF_RegistrationResult result;
-
- result = oaf_active_server_register
- ("OAFIID:evolution:calendar-factory:1c915858-ece3-4a6f-9d81-ea0f108a9554",
- obj);
-
- switch (result) {
- case OAF_REG_SUCCESS:
- return TRUE; /* Wooho! */
- case OAF_REG_NOT_LISTED:
- g_message ("Cannot register the PCS because not listed");
- return FALSE;
- case OAF_REG_ALREADY_ACTIVE:
- g_message ("Cannot register the PCS because already active");
- return FALSE;
- case OAF_REG_ERROR:
- default:
- g_message ("Cannot register the PCS because we suck");
- return FALSE;
- }
-}
-
-#else /* USING_OAF */
-
-#include <libgnorba/gnorba.h>
-
-static gboolean
-register_pcs (CORBA_Object object)
-{
- CORBA_Environment ev;
- int result;
-
- CORBA_exception_init (&ev);
-
- result = goad_server_register (CORBA_OBJECT_NIL,
- object,
- "evolution:calendar-factory",
- "object",
- &ev);
-
- /* FIXME: should Wombat die if it gets errors here? */
-
- if (ev._major != CORBA_NO_EXCEPTION || result == -1) {
- g_message ("setup_pcs(): could not register the calendar factory");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- if (result == -2) {
- g_message ("setup_pcs(): a calendar factory is already registered");
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- CORBA_exception_free (&ev);
- return TRUE;
-}
-
-#endif /* USING_OAF */
-
-/* Creates the calendar factory object and registers it with GOAD */
-static void
-setup_pcs (int argc, char **argv)
-{
- CORBA_Object object;
-
- cal_factory = cal_factory_new ();
-
- if (!cal_factory) {
- g_message ("setup_pcs(): Could not create the calendar factory");
- return;
- }
-
- cal_factory_register_method (cal_factory, "file", CAL_BACKEND_FILE_TYPE);
-
- object = bonobo_object_corba_objref (BONOBO_OBJECT (cal_factory));
-
- if (! register_pcs (object)) {
- bonobo_object_unref (BONOBO_OBJECT (cal_factory));
- cal_factory = NULL;
- return;
- }
-
- gtk_signal_connect (GTK_OBJECT (cal_factory),
- "last_calendar_gone",
- GTK_SIGNAL_FUNC (last_calendar_gone_cb),
- NULL);
-}
-
-
-
-static void
-setup_config (int argc, char **argv)
-{
-}
-
-static void
-setup_vfs (int argc, char **argv)
-{
- if (!gnome_vfs_init ()) {
- g_message ("setup_vfs(): could not initialize GNOME-VFS");
- exit (EXIT_FAILURE);
- }
-}
-
-
-
-#ifdef USING_OAF
-
-static void
-init_corba (int *argc, char **argv)
-{
- gnome_init_with_popt_table ("Personal Addressbook Server", "0.0",
- *argc, argv, oaf_popt_options, 0, NULL);
- oaf_init (*argc, argv);
-}
-
-#else
-
-static void
-init_corba (int *argc, char **argv)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- gnome_CORBA_init_with_popt_table (
- "Personal Addressbook Server", "0.0",
- argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_message ("init_bonobo(): could not initialize GOAD");
- CORBA_exception_free (&ev);
- exit (EXIT_FAILURE);
- }
-
- CORBA_exception_free (&ev);
-}
-
-#endif
-
-static void
-init_bonobo (int *argc, char **argv)
-{
- init_corba (argc, argv);
-
- if (!bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL)) {
- g_message ("init_bonobo(): could not initialize Bonobo");
- exit (EXIT_FAILURE);
- }
-}
-
-int
-main (int argc, char **argv)
-{
- {
- char *c = malloc (10);
- if (c)
- free (c);
- }
- init_bonobo (&argc, argv);
- setup_vfs (argc, argv);
-
- setup_pas (argc, argv);
- setup_pcs (argc, argv);
- setup_config (argc, argv);
-
- /*g_log_set_always_fatal (G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL |
- G_LOG_LEVEL_WARNING);*/
-
- bonobo_main ();
-
- bonobo_object_unref (BONOBO_OBJECT (cal_factory));
- cal_factory = NULL;
-
- bonobo_object_unref (BONOBO_OBJECT (pas_book_factory));
- pas_book_factory = NULL;
-
- return 0;
-}
diff --git a/wombat/wombat.gnorba b/wombat/wombat.gnorba
deleted file mode 100644
index d170bebc15..0000000000
--- a/wombat/wombat.gnorba
+++ /dev/null
@@ -1,11 +0,0 @@
-[evolution:addressbook-server]
-type=exe
-repo_id=IDL:Evolution/BookFactory:1.0 IDL:Bonobo/Unknown:1.0
-description=The Personal Addressbook Server
-location_info=wombat
-
-[evolution:calendar-factory]
-type=exe
-repo_id=IDL:Evolution/Calendar/CalFactory:1.0 IDL:Bonobo/Unknown:1.0
-description=The Personal Calendar Server; calendar factory
-location_info=wombat
diff --git a/wombat/wombat.idl b/wombat/wombat.idl
deleted file mode 100644
index ab13b2cabf..0000000000
--- a/wombat/wombat.idl
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * The Evolution Personal Organization Server.
- *
- * Copyright 2000, Helix Code, Inc.
- */
-
-module Evolution {
-
- interface Config {
-
- };
-};
diff --git a/wombat/wombat.oafinfo b/wombat/wombat.oafinfo
deleted file mode 100644
index 1109cc0df6..0000000000
--- a/wombat/wombat.oafinfo
+++ /dev/null
@@ -1,30 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:evolution:addressbook-server:0fbc844d-c721-4615-98d0-d67eacf42d80"
- type="exe"
- location="wombat">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/BookFactory:1.0"/>
- <item value="IDL:Bonobo/Unknown:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="The Personal Addressbook Server"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:evolution:calendar-factory:1c915858-ece3-4a6f-9d81-ea0f108a9554"
- type="exe"
- location="wombat">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Evolution/Calendar/CalFactory:1.0"/>
- <item value="IDL:Bonobo/Unknown:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="description" type="string"
- value="The Personal Calendar Server; calendar factory"/>
-
-</oaf_server>
-
-</oaf_info>